From: vincent@cubedesigners.com Date: Mon, 18 Apr 2011 15:20:03 +0000 (+0000) Subject: (no commit message) X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=2d23007683c9aa259b0aa50528c138e9471279e6;p=cubeextranet.git --- diff --git a/fluidbook/tools/swftools-special-swfdump/AUTHORS b/fluidbook/tools/swftools-special-swfdump/AUTHORS new file mode 100644 index 000000000..645fb1d3d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/AUTHORS @@ -0,0 +1,24 @@ +SWFTools authors +---------------- + +Maintainer, librfxswf(-python), pdf2swf, avi2swf, png2swf, swfcombine, swfextract, swfdump, swfc: + Matthias Kramm + +librfxswf, jpeg2swf, swfstrings: + Rainer Böhme + +swifty, help with swfc, swfc documentation: + De Clarke + +Contact +------- + +There's a mailing-list, swftools-common@nongnu.org, which is the right place +for anything related to SWFTools (questions, bug reports, feature requests, etc.). + +Go to + + http://mail.nongnu.org/mailman/listinfo/swftools-common + +to subscribe. + diff --git a/fluidbook/tools/swftools-special-swfdump/COPYING b/fluidbook/tools/swftools-special-swfdump/COPYING new file mode 100644 index 000000000..d60c31a97 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/COPYING @@ -0,0 +1,340 @@ + 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. diff --git a/fluidbook/tools/swftools-special-swfdump/ChangeLog b/fluidbook/tools/swftools-special-swfdump/ChangeLog new file mode 100644 index 000000000..15876db9b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/ChangeLog @@ -0,0 +1,296 @@ +0.0.1: initial release +0.0.2: + * pdf2swf: Added support for pdf bitmaps, clipping, state saving/restoring, colors, + solid fill and line width. The output SWF files are now much smaller. + * swfcombine: Added stacking option (-t) + * swfcombine: Small bugfixes with the command line options + * rfxswf-lib: some bugfixes concerning sprites, cgi, shapes, jpegs. + * swfstrings: New: Allows extraction of text from swf files + * swfdump: New: Dumps swf file information. (And does some error checking on the SWF) + * jpeg2swf: New: Converts one or more jpegs to a swf movie. + +0.1.0: + * configure: Now works without automake, automatically disables + jpeg2swf and pdf2swf if jpeglib is not found (disable + both) or t1lib is not found (disable pdf2swf) + * swfcombine: bugfix: DEFINETEXT tags didn't get relocated right + * swfcombine: bugfix: no longer builds "unstreamable" SWFs + * rfxswf-lib: actionscript + * rfxswf-lib: lossless image formats + * pdf2swf: conversion of lossless image formats + * pdf2swf: picture cache to prevent images getting stored more than once + * pdf2swf: conversion of (hyper)links + * swfdump: -a, -e and -XY options + * lib/example/zlibtest: new file, demonstrates using lossless images with rfxswf-lib + * lib/example/dumpfont: utility for dumping fonts out of swf (and generate c sourcecode for creating them) + * lib/example/demofont: example font, generated with lib/example/dumpfont. + +0.1.1: + * swfcombine: Wasn't able to handle converted pdfs with links. Fixed. + * swfcombine: Introduce --dummy, -X,-Y,-r options + * swfdump: new: -r option + * pdf2swf: small bugfixes + * HOWTO_pdf2swf: added section about correcting size and framerate + +0.1.2: + * swfdump: can dump all actionscript flavours (button, button2, standalone) now + * rfxswf-lib: improved font handling + * lib/example/makefonts.cc: new file, converts the standard fonts to swf + * lib/example/glyphshape.c: new file, demonstrates using font characters as shapes + * pdfswf: many bugfixes. The "pdfscreen" manual now get's converted correctly + * rfxswf-lib: bugfix: Couldn't handle jpeg grayscale images + +0.2.0: + * pdf2swf: TrueType support added. (using ttf2pt1) + * rfxswf-lib: performs conversion of jpeg colorspaces now. (Makes pdf2swf cope + with more types of jpegs) + * swfextract: new tool, allows to extract single objects, frames etc. from movieclips + * swfcombine: allows ids instead of names, now, too. + * swfdump: added text displaying functionality. (like swfstrings) + * swfdump: now dumps also the undocumented placeobject2 actioncode. + * lib/example/avi2swf.cc: For now, converts small (!) avi movie files to swf. (using + libavifile) + +0.2.1: + * configure: Does checking for byte order and command substitution capability now. + * rfxswf: Applied Anjo Krank's patch for MacOS X. + * pdf2swf: Fixed font transformation matrix + * swfcombine: new options: --cat, --stack1, --merge, --frame + * swfs/: new directory, holds some standard SWFs primarily used for pdf2swf + installs into ${DATADIR}/swftools/swfs + * pdf2swf: New options --viewer, --preloader, -b, -l + * pdf2swf: Fonts are now in ${DATADIR}/swftools/fonts + +0.2.2: + * swfs/: Added/Wrote sources for some of the swf files + * swfdump: Major bugfix in placeobject2, hex output function + * swfextract: Can now extract png, jpeg and mp3. + * swfcombine: big endian fixes + * swfextract: big endian fixes + * pdf2swf: Changed from 100dpi to 72dpi conversion + * pdf2swf: Some optimizations, fix the zero string problem. + * lib/: Added Bladeenc 0.94.1 for mp3 compression + * lib/example/avi2swf.cc: Can now handle big files. Slightly better compression ratio. Sound. + * lib/example/sound.c: New file, demonstrates use of the sound module in librfxswf. + +0.2.3: + * pdf2swf: New option --fontdir, can now handle external fonts. + * lib/modules/swftext.c: Several font-extraction bugfixes + * src/swfdump: Bugfixes, ids and depths are now in decimal + * src/swfcombine: Bugfixes. + * configure.in: Cleaned up. + +0.3.0: + * pdf2swf: The --ignore option now actually makes the pdf files smaller. + * rfxswf: Can now write DefineFont2 tags + * swfextract/swfcombine: Bugfixes (DefineEditText) + * swfdump: New option --used, prints out referred IDs of each tag. + * rfxswf: Can now read and write Flash 6 (MX) compressed SWFs. (SWCs) + * pdf2swf: Added compression flag (-z) + * swfcombine: Added compression flag (-z) + * configure.in: zlib is now required. + * src/png2swf: New tool. + * swfdump: Prints some image infos now. + * pdf2swf: Fixed Image handling + * avi2swf/: Is part of the main distribution now + * src/wav2swf: New tool. + +0.3.1: + * configure: Didn't create all Makefiles when t1lib or jpeglib were absent. Fixed. + * swfs/Makefile: FreeBSD fixes. + +0.4.0: + * pdf2swf/xpdf: Upgraded PDF Parser to Version 1.01. + * pdf2swf: Can now handle Type 3 Fonts. (As Bitmaps) + * src/swfcombine: Completely rewritten, using the rfxswf routines + * configure: Check for libtool + * lib/rfxswf: Fixed some parsing bugs (swffont, swfdump) + * pdf2swf: Added antialiasing capabilities for Type 3 Fonts + * lib/examples/makefonts: Fonts: Bounding boxes are now handled correctly + * png2swf: Support for more image types + * pdf2swf: New option -t (--stop) + +0.4.1: + * src/swfcombine: Bugfix with -x option + * lib/Makefile: MacOSX fixes + * pdf2swf/SWFOutput.cc: fixed undefined sqrt() + * src/png2swf: Support for transparency + * pdf2swf: Support for CID Fonts + * src/swfcombine: Bugfixes + * lib/rfxswf: Added Sprite Unfolding routines + +0.4.2: + * src/Makefile: OpenBSD fixes + * lib/lame: Removed *.o files from archive + * avi2swf: Implemented --flip option + * pdf2swf: Implemented --flashversion option + * pdf2swf: Implemented Viewer gadgets- it's now possible to call Flash functions via hyperlink + +0.4.3: + * src/jpeg2swf: Grayscale fix + * lib/rfxswf: Improved MX support + * pdf2swf: Command line fixes + * swfdump: Added -f (--frames) option + * png2swf: Added support for mode 6 images + * swfs: Support for print protection in simple_viewer + * swfs: added keyboard_viewer + * swfcombine: Bugfixes + * swfdump: Shows frame position now. + * swfdump: Some definesound infos added + * wav2swf: added support for definesound, looping and framerate + * pdf2swf: Calling Actionscript Functions can now also be done via http: hyperlink, + e.g.: http://pdf2swf:call:_root.myFunction:parameter + * ./*/Makefile: all Makefiles rewritten. + +0.4.4: + * src/swfextract: output file name handling fix + * lib/rfxswf: better sprite fold/unfold support + * src/swfdump: new option -p (--placements), support for exportassets, namecharacter + * src/swfextract: support for font extraction + * pdf2swf/font2swf: new tool, for converting Type1 fonts to SWF + * lib/rfxswf: font routines fixed + * lib/rfxswf: support for definejpegbits3 + * src/png2swf: better support for 32 bit images with transparency + * pdf2swf/pdf2swf: slightly better TTF support, some fixes + * pdf2swf/pdf2swf: Output filename is no longer mandatory + * lib/rfxswf: added workaround for the 63-byte BMF_32 bug in the Flash Player + * lib/rfxswf: fix for ratios in swfobject.c + * src/swfdump: shows some info about video tags now + * pdf2swf/pdf2swf: greatly improved spline conversion + * pdf2swf/: Fix for t1lib-5.0.0 + * src/wav2swf: streaming sound now works for all framerates < 35. + +0.5.0: + * pdf2swf: added support for capline-styles + * avi2swf: added h.263 support + * avi2swf: improved sound support + * Makefiles: added MingW/Cygwin support + * pdf2swf/ttf2pt1: upgraded to ttf2pt1 3.4.3. + * lib/: changed logf to msg (support for gcc 3.2) + * src/jpeg2swf: Added support for H.263 compression (for correlated images). + * swfc: New tool, allow compilation of .sc files to swf + * swfbbox: New Tool, allows several bounding box operations on SWFs + * wav2swf: added support for samplerate 44100 (Marcus Doemling) + * avi2swf: added -r (--mp3-samplerate) parameter (Marcus Doemling) + * lib/action: Integrated Ming Actioncompiler + * lib/modules/swffont.c: New module, allows creation of SWF fonts from Type1 and TTF + * lib/modules/swfshape.c: Support for gradients + * lib/rfxswf.h: Support for MD5 encrypted passwords (PROTECT tags) + +0.5.1: + * png2swf: fixed a bug for 8 bit indexed images + * lib/rfxswf.h: fixed a bug- could previously only be compiled with either t1lib or freetype + * configure: newer avifile versions (>= 0.7.38) now also work. + +0.6.0: + * configure: added check for broken freetype- disable freetype in some cases + * swfbbox: Added support for text boxes + * png2swf: Fixed alpha conversion (removed definejpeg3 workaround) + * swfc: added buttons, edittext fields + * rfxswf: fixed font advance parameters (editboxes with custom font now work) + * swfextract: Is able to extract alpha channels out of DEFINEBITS2 now. + * pdf2swf: Made MingW compatible. There's now a Win32 version. + * pdf2swf: Reworked font routines + * swfcombine: Some fixes for clipping depths + * swfextract: Reworked object listing output + * lib/rfxswf: New method swf_FontPrepareForEditText() + * lib/lame: Removed lame library source, it's now linked dynamically + * lib/python: Added python interface + +0.6.1: + * swfc: Fixed .(edit)text- this was broken due to rfxswf font changes + * pdf2swf: Fixed font matrix handling + * pdf2swf: Fixed "highest charcode not displayed" bug + * pdf2swf: Bounding boxes are now of the right size + * pdf2swf: Fixed Windows crash in 4 bit palette images + * pdf2swf: Fixed another variant of "Didn't find glyph xxx in font" bug + +0.6.2: + * swfbbox: Calculates the complete movie's bounding box now. New -e,-b,-B options. + * pdf2swf: New "-s minlinewidth" option + * swfdump: Fixed handling of PLACEOBJECT + * lib/modules/swffont.c: Added support for new-style freetype headers + * configure: Improved freetype and python detection, added fontconfig detection + * swfdump: Support for shapes added + * swfdump: several bugfixes from simon-swf@munton.demon.co.uk + * pdf2swf: Added fontconfig font replacement + * lib/h.263: added better support for custom frames + * avi2swf: Is now ported to Win32, too. + * pdf2swf: Upgraded to xpdf 3.00 + +0.6.3: + * lib/modules/swfrender.c: New module, for shape->bitmap conversion + * lib/rfxswf.c: Several small bugfixes + * lib/modules/swftools.c: New function swf_Optimize() + * src/swfc.c: .outline and .textshape support line drawings now, too + * src/swfc.c: added -O option + * src/swfc.c: added support for including actionscript (.action filename=) + * src/swfc.c: frames now start at 1 + * src/swfextract.c: Objects extracted with -i are now scaled to width 512 + * src/swfextract.c: Fixed jpeg extraction bug + * src/wav2swf.c: Big endian fixes + * lib/modules/swfshape.c: too long lines are now split automatically + * configure: Several Mac OS X fixes + * pdf2swf/SWFOutputDev: refactored interface to pdf2swf.cc + * src/png2swf.c: added -z option + * src/jpeg2swf.c: added -z option + * m4/python.m4: Python MacOS X fixes + * src/gif2swf.c: New tool, for converting (animated) gifs to swf (Daichi Shinozaki) + +0.7.0: + * swfdump: Fixed bit overflow bug + * lib/gfxdevice.h: Started implementation of graphic layer abstraction + * pdf2swf: Fixed Type 3 color bug + * pdf2swf: Fixed a rare rendering bug caused by the float conversion in moveTo + * pdf2swf: Fixed CMYK conversion + * pdf2swf: added support for joinstyles + * pdf2swf: capstyles don't require clipping anymore + * pdf2swf: added support for dashed/dotted lines + * pdf2swf: Images are now stored as either jpeg or zlib, whatever is smaller. + * pdf2swf: Fixed Type0C handling + * swfcombine: Fixed jpeg table conversion + * lib/rfxswf.c: added support for definejpeg3 extraction + * pdf2swf: New option -s bboxvars + * pdf2swf: Added support for stroke/clip text rendering + * swfbbox: Default behaviour has been fixed + * pdf2swf: fix for non-closed shapes + * pdf2swf: Font quality is now determined by the used font sizes + * pdf2swf: Shapes are now all starting at (0,0), and then explizitly placed at their + actual starting positions (useful with zlib) + * pdf2swf: Default Flash version is now 6 + +0.8.0: + * lib/modules/swfsound.c: Fixed compile problem if the lame library is present + * pdf2swf: Bugfix: -s flashversion was broken + * pdf2swf: -b and -l now also work on Windows + * swfbbox: The -c option is now documented + * swfdump: Added support for flash 8 + * librfxswf: Added support for flash 8 filters and blend modes + * src/swfc: Added support for flash 8 filters and blend modes + * pdf2swf: upgraded to xpdf 3.01 + * swfcombine: new -w (--scalex) -h (--scaley) options + +0.8.1: + * pdf2swf: Upgraded to xpdf 3.02 + * lib/modules/swftools: Fixed several bugs in Flash8 parsing + * src/swfrender: Added --ng switch + * lib/swf/: New gfxdevice + +0.9.0: + * pdf2swf: Added support for Flash 8 Flashtype + * pdf2swf: numerous bugfixes + * pdf2swf: support for gradients + * pdf2swf: support for different optimization levels (-O1, -O2, --flatten) + * src/swfdump: Flash 8/9 support + * pdf2swf: Common fonts are now linked directly into the executable + * setup.py: added Python setup script + * lib/python/gfx: New python module for accessing pdf2swf functionality + * as3compile: New tool, for compiling ActionScript 3.0 + * swfc: added AS3.0 support + +0.9.1: + * pdf2swf: bugfixes, speedups + * pdf2swf: improved font quality (FlashType) + * librfxswf: support for fontalignzones + * gpdf2swf: completely reworked pdf2swf GUI (Ricardo Pedroso) + * as3compile: many bugfixes, support for swc libraries diff --git a/fluidbook/tools/swftools-special-swfdump/INSTALL b/fluidbook/tools/swftools-special-swfdump/INSTALL new file mode 100644 index 000000000..11b821531 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/INSTALL @@ -0,0 +1,180 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `AUTHORS' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile b/fluidbook/tools/swftools-special-swfdump/Makefile new file mode 100644 index 000000000..0b9851f52 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/Makefile @@ -0,0 +1,41 @@ +top_builddir = .. +srcdir = . +top_srcdir = . +include ./Makefile.common + +all install uninstall clean: + @echo making $@ in m4... + cd m4;$(MAKE) $@ + @echo making $@ in lib... + cd lib;$(MAKE) $@ + @echo making $@ in lib/pdf... + cd lib/pdf;$(MAKE) $@ + @echo making $@ in lib... + cd lib;$(MAKE) $@ + @echo making $@ in lib/python... + cd lib/python;$(MAKE) $@ + @echo making $@ in lib/ruby... + cd src;$(MAKE) $@ + @echo making $@ in avi2swf... + cd avi2swf;$(MAKE) $@ + @echo making $@ in swfs... + cd swfs;$(MAKE) $@ + @$(MAKE) $@-local + +distclean: + $(MAKE) clean + rm -f config.status config.cache config.h Makefile Makefile.common libtool + rm -f lib/lame/Makefile lib/python/Makefile lib/Makefile src/Makefile avi2swf/Makefile pdf2swf/fonts/Makefile + +clean-local: + rm -f config.cache gmon.out + +uninstall-local: + rm -rf $(pkgdatadir) + +all-local: + @true +install-local: + @true + +.PHONY: all install uninstall clean distclean clean-local uninstall-local all-local install-local diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile.common b/fluidbook/tools/swftools-special-swfdump/Makefile.common new file mode 100644 index 000000000..eafdcc142 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/Makefile.common @@ -0,0 +1,88 @@ +# --------------------- init -------------------------- + +# shells, skripts, tools etc. +SHELL = /bin/sh +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + + +# compiling +DEFS=-DHAVE_CONFIG_H +INCLUDES= +DEP=gcc -MM $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig +C=gcc -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer +CC=g++ -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer +L=gcc $(DEFS) +LL=g++ $(DEFS) +AR=ar +LIBTOOL=@LIBTOOL@ +SC=$(LIBTOOL) gcc -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer +SCC=$(LIBTOOL) g++ -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer +SL=$(LIBTOOL) --mode=link gcc $(DEFS) -rpath $(libdir) +SLL=$(LIBTOOL) --mode=link g++ $(DEFS) -rpath $(libdir) +LIBS= -L/usr/local/lib -L${exec_prefix}/lib -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype +CXXLIBS=-lstdc++ +transform = s,x,x, +CPPFLAGS= -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig + +PYTHON_LIB=-lpython2.5 +PYTHON_INCLUDES=-I/usr/include/python2.5 +PYTHON_INSTALL_PATH=/usr/lib/python2.5/site-packages +PYTHON_EXECUTABLE=python2.5 + +RUBY_CPPFLAGS= +RUBY_LDFLAGS= +RUBY_LIBS= +RUBY_INSTALLDIR= + +# libtool stuff +OBJEXT=o +EXEEXT= +AREXT=.a +SHARED=-shared +E=$(EXEEXT) +O=$(OBJEXT) +A=$(AREXT) +SLEXT=so +ECHO=@ECHO@ +RANLIB=ranlib +STRIP=@echo debug enabled, not stripping + +# installing +LN_S = ln -s +PACKAGE = swftools +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +UNINSTALL_DATA = rm -f +INSTALL_PROGRAM = ${INSTALL} +prefix = /usr/local/swftools/special-swfdump +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +datadir = ${prefix}/share +libdir = ${exec_prefix}/lib +includedir = ${prefix}/include +sysconfdir = ${prefix}/etc +pkgdatadir = $(datadir)/swftools + +# man pages +mandir = ${prefix}/share/man +man1dir = $(mandir)/man1 + +# ------------------- defines ------------------------- + +INSTALL_BIN = echo installing $$file to $(bindir);$(INSTALL_PROGRAM) $$file $(bindir)/`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'` +UNINSTALL_BIN = ff=`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`;echo rm -f $(bindir)/$$ff;rm -f $(bindir)/$$ff +INSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "$(INSTALL_DATA) $$ff $(man1dir)/$$inst"; $(INSTALL_DATA) $$ff $(man1dir)/$$inst +UNINSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "rm -f $(man1dir)/$$inst"; rm -f $(man1dir)/$$inst + +#%.o: %.c +# $(C) $< -o $@ + +#%: %.o +# $(L) $< -o $@ ../lib/librfxswf.a $(LIBS) + +#%.o: %.cc +# $(CC) -DDATADIR=\"$(pkgdatadir)\" -I../lib -Ittf2pt1 -Ixpdf $< -o $@ + +# GNU Makefile stuff + +.SUFFIXES: diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile.common.in b/fluidbook/tools/swftools-special-swfdump/Makefile.common.in new file mode 100644 index 000000000..fa119e3c7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/Makefile.common.in @@ -0,0 +1,88 @@ +# --------------------- init -------------------------- + +# shells, skripts, tools etc. +SHELL = @SHELL@ +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +@SET_MAKE@ + +# compiling +DEFS=@DEFS@ +INCLUDES= +DEP=@CC@ -MM $(DEFS) $(INCLUDES) @CPPFLAGS@ +C=@CC@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CFLAGS@ +CC=@CXX@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CXXFLAGS@ +L=@CC@ $(DEFS) +LL=@CXX@ $(DEFS) +AR=@AR@ +LIBTOOL=@LIBTOOL@ +SC=$(LIBTOOL) @CC@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CFLAGS@ +SCC=$(LIBTOOL) @CXX@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CXXFLAGS@ +SL=$(LIBTOOL) --mode=link @CC@ $(DEFS) -rpath $(libdir) +SLL=$(LIBTOOL) --mode=link @CXX@ $(DEFS) -rpath $(libdir) +LIBS= @LDFLAGS@ @LIBS@ +CXXLIBS=@CXXLIBS@ +transform = @program_transform_name@ +CPPFLAGS=@CPPFLAGS@ + +PYTHON_LIB=@PYTHON_LIB@ +PYTHON_INCLUDES=@PYTHON_INCLUDES@ +PYTHON_INSTALL_PATH=@PYTHON_INSTALL_PATH@ +PYTHON_EXECUTABLE=@PYTHON_EXECUTABLE@ + +RUBY_CPPFLAGS=@RUBY_CPPFLAGS@ +RUBY_LDFLAGS=@RUBY_LDFLAGS@ +RUBY_LIBS=@RUBY_LIBS@ +RUBY_INSTALLDIR=@RUBY_INSTALLDIR@ + +# libtool stuff +OBJEXT=@OBJEXT@ +EXEEXT=@EXEEXT@ +AREXT=@AREXT@ +SHARED=@SHARED@ +E=$(EXEEXT) +O=$(OBJEXT) +A=$(AREXT) +SLEXT=@SLEXT@ +ECHO=@ECHO@ +RANLIB=@RANLIB@ +STRIP=@STRIP@ + +# installing +LN_S = @LN_S@ +PACKAGE = @PACKAGE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +UNINSTALL_DATA = rm -f +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +datadir = @datadir@ +libdir = @libdir@ +includedir = @includedir@ +sysconfdir = @sysconfdir@ +pkgdatadir = $(datadir)/@PACKAGE@ + +# man pages +mandir = @mandir@ +man1dir = $(mandir)/man1 + +# ------------------- defines ------------------------- + +INSTALL_BIN = echo installing $$file to $(bindir);$(INSTALL_PROGRAM) $$file $(bindir)/`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'` +UNINSTALL_BIN = ff=`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`;echo rm -f $(bindir)/$$ff;rm -f $(bindir)/$$ff +INSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "$(INSTALL_DATA) $$ff $(man1dir)/$$inst"; $(INSTALL_DATA) $$ff $(man1dir)/$$inst +UNINSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "rm -f $(man1dir)/$$inst"; rm -f $(man1dir)/$$inst + +#%.o: %.c +# $(C) $< -o $@ + +#%: %.o +# $(L) $< -o $@ ../lib/librfxswf.a $(LIBS) + +#%.o: %.cc +# $(CC) -DDATADIR=\"$(pkgdatadir)\" -I../lib -Ittf2pt1 -Ixpdf $< -o $@ + +# GNU Makefile stuff + +.SUFFIXES: diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile.in b/fluidbook/tools/swftools-special-swfdump/Makefile.in new file mode 100644 index 000000000..e1a07f63f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/Makefile.in @@ -0,0 +1,41 @@ +top_builddir = .. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ./Makefile.common + +all install uninstall clean: + @echo making $@ in m4... + cd m4;$(MAKE) $@ + @echo making $@ in lib... + cd lib;$(MAKE) $@ + @echo making $@ in lib/pdf... + cd lib/pdf;$(MAKE) $@ + @echo making $@ in lib... + cd lib;$(MAKE) $@ + @echo making $@ in lib/python... + cd lib/python;$(MAKE) $@ + @echo making $@ in lib/ruby... + cd src;$(MAKE) $@ + @echo making $@ in avi2swf... + cd avi2swf;$(MAKE) $@ + @echo making $@ in swfs... + cd swfs;$(MAKE) $@ + @$(MAKE) $@-local + +distclean: + $(MAKE) clean + rm -f config.status config.cache config.h Makefile Makefile.common libtool + rm -f lib/lame/Makefile lib/python/Makefile lib/Makefile src/Makefile avi2swf/Makefile pdf2swf/fonts/Makefile + +clean-local: + rm -f config.cache gmon.out + +uninstall-local: + rm -rf $(pkgdatadir) + +all-local: + @true +install-local: + @true + +.PHONY: all install uninstall clean distclean clean-local uninstall-local all-local install-local diff --git a/fluidbook/tools/swftools-special-swfdump/_pypath.py b/fluidbook/tools/swftools-special-swfdump/_pypath.py new file mode 100644 index 000000000..5a67638a4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/_pypath.py @@ -0,0 +1,4 @@ +import distutils +import distutils.sysconfig +import sys +sys.stdout.write(distutils.sysconfig.get_python_lib(plat_specific=0,standard_lib=0)) diff --git a/fluidbook/tools/swftools-special-swfdump/_pypath.txt b/fluidbook/tools/swftools-special-swfdump/_pypath.txt new file mode 100644 index 000000000..25d73bb4f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/_pypath.txt @@ -0,0 +1 @@ +/usr/lib/python2.5/site-packages \ No newline at end of file diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile b/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile new file mode 100644 index 000000000..51a6f753a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile @@ -0,0 +1 @@ +all install uninstall clean: diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in b/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in new file mode 100644 index 000000000..ac40d4b52 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in @@ -0,0 +1,41 @@ +top_builddir = .. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../Makefile.common + +VIDEO_LIBS=@VIDEO_LIBS@ +VIDEO_CFLAGS=@VIDEO_CFLAGS@ + +all: avi2swf$(E) + +videoreader_avifile.$(O): videoreader_avifile.cc videoreader_avifile.hh + $(CC) $(VIDEO_CFLAGS) $< -o $@ + +videoreader_vfw.$(O): videoreader_vfw.cc videoreader_vfw.hh + $(CC) $(VIDEO_CFLAGS) $< -o $@ + +avi2swf.$(O): avi2swf.cc videoreader_vfw.hh videoreader_avifile.hh + $(CC) $< -o $@ + +v2swf.$(O): v2swf.c ../lib/q.h + $(C) $< -o $@ + +avi2swf$(E): avi2swf.$(O) v2swf.$(O) videoreader_avifile.$(O) videoreader_vfw.$(O) ../lib/libbase$(A) + $(LL) avi2swf.$(O) v2swf.$(O) videoreader_avifile.$(O) videoreader_vfw.$(O) -o avi2swf$(E) ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) $(VIDEO_LIBS) + $(STRIP) avi2swf$(E) + +install: + $(mkinstalldirs) $(bindir) + $(mkinstalldirs) $(man1dir) + @file=avi2swf;$(INSTALL_BIN);$(INSTALL_MAN1) + +uninstall: + @file=avi2swf;$(UNINSTALL_BIN);$(UNINSTALL_MAN1) + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la avi2swf avi2swf.exe gmon.out + +doc: + perl ../parsedoc.pl avi2swf.doc + +.PHONY: all doc clean install uninstall diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 b/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 new file mode 100644 index 000000000..ff6495e7a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 @@ -0,0 +1,59 @@ +.TH avi2swf "1" "February 2006" "avi2swf" "swftools" +.SH NAME +avi2swf - Converts an avi video file to SWF. + +.SH Synopsis +.B avi2swf file.avi [-o output.swf] + +.SH DESCRIPTION +Converts an AVI video file to SWF. +.PP +From Version 6 on, SWF supports h.263 video rendering. This tool generates, +among some other formats (see below), SWF movies which contain such h.263 video +from AVI files. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print help and exit +.TP +\fB\-o\fR, \fB\-\-output\fR filename + Specify output filename +.TP +\fB\-A\fR, \fB\-\-adjust\fR seconds + Audio adjust: Shift sound -seconds to the future or +seconds into the past. +.TP +\fB\-n\fR, \fB\-\-num\fR frames + Number of frames to encode +.TP +\fB\-m\fR, \fB\-\-mp3-bitrate\fR \fIkbps\fR + Set the mp3 bitrate to encode audio with +.TP +\fB\-r\fR, \fB\-\-mp3-samplerate\fR \fIhz\fR + Set the mp3 samplerate to encode audio with (default: 11025) +.TP +\fB\-s\fR, \fB\-\-scale\fR \fIval\fR + Scale down to factor \fIval\fR. (in %, e.g. 100 = original size) +.TP +\fB\-S\fR, \fB\-\-skipframes\fR \fInum\fR + Skip \fInum\fR frames before starting the conversion. +.TP +\fB\-p\fR, \fB\-\-flip\fR + Turn movie upside down +.TP +\fB\-q\fR, \fB\-\-quality\fR \fIval\fR + Set the quality to \fIval\fR. (0-100, 0=worst, 100=best, default:80) +.TP +\fB\-k\fR, \fB\-\-keyframe\fR + Set the number of intermediate frames between keyframes. +.TP +\fB\-x\fR, \fB\-\-extragood\fR + Enable some \fIvery\fR expensive compression strategies. You may + want to let this run overnight. +.TP +\fB\-T\fR, \fB\-\-flashversion\fR \fIn\fR + Set output flash version to \fIn\fR. Notice: H.263 compression will only be + used for n >= 6. +.TP +\fB\-V\fR, \fB\-\-version\fR + Print program version and exit diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc b/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc new file mode 100644 index 000000000..c68fedbbc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc @@ -0,0 +1,347 @@ +/* avi2swf.cc + Convert avi movie files into swf. + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include + +#include "../config.h" + +#include "../lib/args.h" +#include "v2swf.h" +#ifdef WIN32 +#include "videoreader_vfw.hh" +#else +#include "videoreader_avifile.hh" +#endif + +static char * filename = 0; +static char * outputfilename = "output.swf"; +int verbose = 0; + +static int quality = 80; +static double scale = 1.0; +static int flip = 0; +static int expensive = 0; +static int flashversion = 6; +static int keyframe_interval = -1; +static int skip = 0; +static float audio_adjust = 0; +static int mp3_bitrate = 32; +static int samplerate = 11025; +static int numframes = 0; +static char* skipframes = 0; + +static struct options_t options[] = { +{"h", "help"}, +{"o", "output"}, +{"A", "adjust"}, +{"n", "num"}, +{"m", "mp3-bitrate"}, +{"r", "mp3-samplerate"}, +{"s", "scale"}, +{"S", "skipframes"}, +{"p", "flip"}, +{"q", "quality"}, +{"k", "keyframe"}, +{"x", "extragood"}, +{"T", "flashversion"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("avi2swf-ng - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "o")) { + outputfilename = val; + return 1; + } + else if(!strcmp(name, "n")) { + numframes = atoi(val); + return 1; + } + else if(!strcmp(name, "d")) { + scale = atof(val); + return 1; + } + else if(!strcmp(name, "q")) { + quality = atoi(val); + if(quality<0) + quality = 0; + if(quality>100) + quality = 100; + return 1; + } + else if(!strcmp(name, "p")) { + flip = 1; + return 0; + } + else if(!strcmp(name, "k")) { + keyframe_interval = atoi(val); + return 1; + } + else if(!strcmp(name, "A")) { + audio_adjust = atof(val); + return 1; + } + else if(!strcmp(name, "v")) { + verbose = 1; + return 0; + } + else if(!strcmp(name, "T")) { + flashversion = atoi(val); + return 1; + } + else if(!strcmp(name, "x")) { + expensive = 1; + return 0; + } + else if(!strcmp(name, "m")) { + mp3_bitrate = atoi(val); + return 1; + } + else if(!strcmp(name, "r")) { + samplerate = atoi(val); + if(samplerate >= 11000 && samplerate <= 12000) + samplerate = 11025; + else if(samplerate >= 22000 && samplerate <= 23000) + samplerate = 22050; + else if(samplerate >= 44000 && samplerate <= 45000) + samplerate = 44100; + else { + fprintf(stderr, "Invalid samplerate: %d\n", samplerate); + fprintf(stderr, "Allowed values: 11025, 22050, 44100\n", samplerate); + exit(1); + } + return 1; + } + else if(!strcmp(name, "S")) { + skip = atoi(val); + return 1; + } + else if(!strcmp(name, "C")) { + skipframes = strdup(val); + return 1; + } + else if(!strcmp(name, "s")) { + scale = atoi(val)/100.0; + if(scale>1.0 || scale<=0) { + fprintf(stderr, "Scale must be in the range 1-100!\n"); + exit(1); + } + return 1; + } + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s file.avi [-o output.swf]\n", name); + printf("\n"); + printf("-h , --help Print help and exit\n"); + printf("-o , --output filename Specify output filename\n"); + printf("-A , --adjust seconds Audio adjust: Shift sound -seconds to the future or +seconds into the past.\n"); + printf("-n , --num frames Number of frames to encode\n"); + printf("-m , --mp3-bitrate Set the mp3 bitrate to encode audio with\n"); + printf("-r , --mp3-samplerate Set the mp3 samplerate to encode audio with (default: 11025)\n"); + printf("-s , --scale Scale down to factor . (in %, e.g. 100 = original size)\n"); + printf("-S , --skipframes Skip frames before starting the conversion.\n"); + printf("-p , --flip Turn movie upside down\n"); + printf("-q , --quality Set the quality to . (0-100, 0=worst, 100=best, default:80)\n"); + printf("-k , --keyframe Set the number of intermediate frames between keyframes.\n"); + printf("-x , --extragood Enable some *very* expensive compression strategies.\n"); + printf("-T , --flashversion Set output flash version to .\n"); + printf("-V , --version Print program version and exit\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +static char toabuf[128]; +static char*ftoa(double a) +{ + sprintf(toabuf, "%f", a); + return toabuf; +} +static char*itoa(int a) +{ + sprintf(toabuf, "%d", a); + return toabuf; +} + +#ifdef DO_SIGNALS +pthread_t main_thread; +static void sigterm(int sig) +{ + if(pthread_equal (pthread_self(), main_thread)) + { + if(frameno>0 && !shutdown_avi2swf) { + if(verbose) + printf("Thread [%08x] got sigterm %d\n", pthread_self(), sig); + shutdown_avi2swf++; + } else { + exit(1); + } + } +} +#endif + +int main (int argc,char ** argv) +{ + videoreader_t video; + v2swf_t v2swf; + int ret; + FILE*fi; + +#ifdef DO_SIGNALS + signal(SIGTERM, sigterm); + signal(SIGINT , sigterm); + signal(SIGQUIT, sigterm); + main_thread = pthread_self(); +#endif + + processargs(argc, argv); + if(!filename) { + fprintf(stderr, "You must supply a filename"); + exit(0); + } + if(keyframe_interval<0) { + if(flashversion>=6) + keyframe_interval=20; + else + keyframe_interval=5; + } + + fi = fopen(outputfilename, "wb"); + if(!fi) { + fflush(stdout); fflush(stderr); + fprintf(stderr, "Couldn't open %s\n", outputfilename); + exit(1); + } + +#ifdef WIN32 + ret = videoreader_vfw_open(&video, filename); +#else + ret = videoreader_avifile_open(&video, filename); +#endif + + if(ret<0) { + fprintf(stderr, "Error opening %s\n", filename); + exit(1); + } + + if(verbose) { + printf("| video framerate: %f\n", video.fps); + printf("| video size: %dx%d\n", video.width, video.height); + printf("| audio rate: %d\n", video.samplerate); + printf("| audio channels: %d\n", video.channels); + } + + ret = v2swf_init(&v2swf, &video); + if(verbose) + v2swf_setparameter(&v2swf, "verbose", "1"); + if(numframes) + v2swf_setparameter(&v2swf, "numframes", itoa(numframes)); + v2swf_setparameter(&v2swf, "quality", itoa(quality)); + v2swf_setparameter(&v2swf, "blockdiff", "0"); + v2swf_setparameter(&v2swf, "blockdiff_mode", "exact"); + v2swf_setparameter(&v2swf, "mp3_bitrate", itoa(mp3_bitrate)); + v2swf_setparameter(&v2swf, "samplerate", itoa(samplerate)); + //v2swf_setparameter(&v2swf, "fixheader", "1"); + //v2swf_setparameter(&v2swf, "framerate", "15"); + v2swf_setparameter(&v2swf, "scale", ftoa(scale)); + v2swf_setparameter(&v2swf, "prescale", "1"); + v2swf_setparameter(&v2swf, "flash_version", itoa(flashversion)); + v2swf_setparameter(&v2swf, "keyframe_interval", itoa(keyframe_interval)); + if(skipframes) + v2swf_setparameter(&v2swf, "skipframes", skipframes); + if(expensive) + v2swf_setparameter(&v2swf, "motioncompensation", "1"); + if(flip) + video.setparameter(&video, "flip", "1"); + if(verbose) + video.setparameter(&video, "verbose", "1"); + + if(!verbose) + printf("\n"); + + if(audio_adjust>0) { + int num = ((int)(audio_adjust*video.samplerate))*video.channels*2; + void*buf = malloc(num); + video.getsamples(&video, buf, num); + free(buf); + } else if(audio_adjust<0) { + int num = (int)(-audio_adjust*video.fps); + void*buf = malloc(video.width*video.height*4); + int t; + for(t=0;t + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "v2swf.h" +#include "../lib/rfxswf.h" +#include "../lib/q.h" + +typedef struct _v2swf_internal_t +{ + TAG*tag; + + int filesize; + int headersize; + int frames; + + int myframes; + + writer_t out; + writer_t out2; + + ringbuffer_t r; + videoreader_t* video; + double video_fps; + + int width; + int height; + + int video_eof; + int audio_eof; + + unsigned char* vrbuffer; + unsigned char* buffer; + unsigned char* lastbitmap; + + int id; + int lastid; + + int quality; + int blockdiff; + int keyframe_interval; + int diffmode; + + float framerate; + float fpsratio; + float fpspos; + + int bitrate; + int samplerate; + + int finished; + int keyframe; + int showframe; + + int skipframes; + + float samplepos; + float framesamplepos; + int samplewritepos; + double soundframepos; + int soundstreamhead; + int seek; + + int numframes; + + double audio_fix; + int fixheader; + int prescale; + + int scale; + + int add_cut; + + int domotion; + + int head_done; + + int version; + + VIDEOSTREAM stream; + +} v2swf_internal_t; + +static int verbose = 0; +static int filelog = 0; + +static void msg(char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(!verbose) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + if(filelog) + { + FILE*fi = fopen("debug.log", "ab+"); + fprintf(fi, "(v2swf) %s\n", buf); + fflush(fi); + fclose(fi); + } + + printf("(v2swf) %s\n", buf); + fflush(stdout); +} + +extern int swf_mp3_in_samplerate; +extern int swf_mp3_out_samplerate; +extern int swf_mp3_channels; +extern int swf_mp3_bitrate; + + +static void writeShape(v2swf_internal_t*i, int id, int gfxid, int width, int height) +{ + RGBA rgb; + MATRIX m; + SHAPE*shape; + SRECT r; + int lines = 0; + int ls,fs; + swf_ResetTag(i->tag, ST_DEFINESHAPE); + swf_ShapeNew(&shape); + rgb.b = rgb.g = rgb.r = 0xff; + if(lines) + ls = swf_ShapeAddLineStyle(shape,20,&rgb); + swf_GetMatrix(NULL,&m); + m.sx = 20*65536; + m.sy = 20*65536; + + fs = swf_ShapeAddBitmapFillStyle(shape,&m,gfxid,0); + swf_SetU16(i->tag,id); // ID + r.xmin = 0; + r.ymin = 0; + r.xmax = width*20; + r.ymax = height*20; + swf_SetRect(i->tag,&r); + + swf_SetShapeStyles(i->tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(i->tag,shape); + + swf_ShapeSetAll(i->tag,shape,0,0,lines?ls:0,fs,0); + + swf_ShapeSetLine(i->tag,shape,width*20,0); + swf_ShapeSetLine(i->tag,shape,0,height*20); + swf_ShapeSetLine(i->tag,shape,-width*20,0); + swf_ShapeSetLine(i->tag,shape,0,-height*20); + swf_ShapeSetEnd(i->tag); + i->filesize += swf_WriteTag2(&i->out, i->tag); + swf_ShapeFree(shape); +} + +/* returns 0 on partial read */ +static int getSamples(videoreader_t*video, S16*data, int len, double speedup) +{ + double pos = 0; + double ratio = (double) video->samplerate * speedup / swf_mp3_in_samplerate; + int rlen = (int)(len * ratio); + int t; + S16 tmp[576*32]; + int r = /*resampled len */ rlen * + /* s16_le */ 2 * + video->channels; + int l = 0; + memset(tmp, 0, sizeof(tmp)); + if(r>0) + l = videoreader_getsamples(video, tmp, r); + if(l <= 0) { + return 0; + } + msg("%d samples read", l); + + /* convert to 1 channel */ + for(t=0;tchannels;s++) + a += tmp[t*video->channels+s]; + tmp[t] = a/video->channels; + } + + /* down/up-sample to the desired input samplerate (swf_mp3_in_samplerate) */ + for(t=0;taudio_fix; + int num = 0; + int pos = 0; + S16 block1[576*4 * 2]; + + msg("writeAudioForOneFrame()"); + + if(i->audio_eof || i->video->channels<=0 || i->video->samplerate<=0) { + i->audio_eof = 1; + return; /* no sound in video */ + } + + blocksize = (i->samplerate > 22050) ? 1152 : 576; + blockspersecond = ((double)i->samplerate)/blocksize; + + /* notice: for framerates greater than about 35, audio starts getting choppy. */ + framespersecond = i->framerate; + + framesperblock = framespersecond / blockspersecond; + samplesperframe = (blocksize * blockspersecond) / framespersecond; /* 11khz-samples per frame */ + samplesperblock = samplesperframe * framesperblock; + + msg("samplesperblock: %f", samplesperblock); + + if(!i->soundstreamhead) { + swf_mp3_out_samplerate = i->samplerate; + /* The pre-processing of sound samples in getSamples(..) above + re-samples the sound to swf_mp3_in_samplerate. It is best to + simply make it the original samplerate: */ + swf_mp3_in_samplerate = i->video->samplerate; + + /* first run - initialize */ + swf_mp3_channels = 1;//i->video->channels; + swf_mp3_bitrate = i->bitrate; + swf_ResetTag(i->tag, ST_SOUNDSTREAMHEAD); + /* samplesperframe overrides the movie framerate: */ + msg("swf_SetSoundStreamHead(): %08x %d", i->tag, samplesperframe); + swf_SetSoundStreamHead(i->tag, samplesperframe); + msg("swf_SetSoundStreamHead() done"); + i->filesize += swf_WriteTag2(&i->out, i->tag); + i->soundstreamhead = 1; + } + + /* for framerates greater than 19.14, every now and then a frame + hasn't a soundstreamblock. Determine whether this is the case. + */ + msg("SOUND: frame:%d soundframepos:%f samplewritepos:%d samplepos:%f\n", i->frames, i->soundframepos, i->samplewritepos, i->samplepos); + if(i->frames < i->soundframepos) { + msg("SOUND: block skipped\n"); + i->samplepos += samplesperframe; + return; + } + + seek = i->seek; + + //while(i->samplewritepos + num * blocksize < i->samplepos + blocksize) { + do { + i->samplewritepos += blocksize; + i->soundframepos += framesperblock; + num++; + } + while(i->samplewritepos < i->samplepos); + + msg("SOUND: number of blocks: %d", num); + + /* write num frames, max 1 block */ + for(pos=0;posvideo, block1, blocksize * (double)swf_mp3_in_samplerate/swf_mp3_out_samplerate, speedup)) { + i->audio_eof = 1; i->video->samplerate = i->video->channels = 0; //end of soundtrack + /* fall through, this probably was a partial read. (We did, after all, + come to this point, so i->audio_eof must have been false so far) */ + } + if(!pos) { + swf_ResetTag(i->tag, ST_SOUNDSTREAMBLOCK); + swf_SetSoundStreamBlock(i->tag, block1, seek, num); + } else { + swf_SetSoundStreamBlock(i->tag, block1, seek, 0); + } + } + i->filesize += swf_WriteTag2(&i->out, i->tag); + + i->seek = blocksize - (i->samplewritepos - i->samplepos); + i->samplepos += samplesperframe; +} + +static void writeShowFrame(v2swf_internal_t* i) +{ + do { + writeAudioForOneFrame(i); + + swf_ResetTag(i->tag, ST_SHOWFRAME); + i->filesize += swf_WriteTag2(&i->out, i->tag); + + i->fpspos -= 1.0; + i->frames ++; + } + while(i->fpspos >= 1.0); + i->showframe = 0; +} + +static void writeShowTags(v2swf_internal_t* i, int shapeid, int bmid, int width, int height) +{ + writeShape(i, shapeid, bmid, width, height); + + swf_ResetTag(i->tag, ST_PLACEOBJECT2); + if(!i->prescale) { + MATRIX m; + swf_GetMatrix(0, &m); + m.sx = m.sy = i->scale; + swf_ObjectPlace(i->tag,shapeid,shapeid,&m,0,0); + } else { + swf_ObjectPlace(i->tag,shapeid,shapeid,0,0,0); + } + i->filesize += swf_WriteTag2(&i->out, i->tag); + + i->showframe = 1; +} + +static int wwrite(writer_t*w, void*data, int len) +{ + v2swf_internal_t* i = (v2swf_internal_t*)w->internal; + ringbuffer_put(&i->r, data, len); + return len; +} + +static void wfinish(writer_t*w) +{ + v2swf_internal_t* i = (v2swf_internal_t*)w->internal; +} + +static void writehead(v2swf_internal_t*i) +{ + char header[]="FWS\6\0\0\0\4"; + SWF swf; + int ret; + int id; + + header[3] = i->version; + if(i->version >= 6) { //MX + header[0] = 'C'; + + i->out2.write = wwrite; + i->out2.finish = wfinish; + i->out2.internal = i; + i->out2.type = 77; + i->out2.bitpos = 0; + i->out2.mybyte = 0; + i->out2.pos = 0; + writer_init_zlibdeflate(&i->out, &i->out2); + } else { + i->out.write = wwrite; + i->out.finish = wfinish; + i->out.internal = i; + i->out.type = 77; + i->out.bitpos = 0; + i->out.mybyte = 0; + i->out.pos = 0; + i->out2 = i->out; + } + + if(i->prescale) { + i->width = (int)(i->video->width*(i->scale/65536.0)); + i->height = (int)(i->video->height*(i->scale/65536.0)); + } else { + i->width = i->video->width; + i->height = i->video->height; + } + if(!i->width) + i->width = 1; + if(!i->height) + i->height = 1; + i->buffer = (unsigned char*)malloc(i->width*i->height*4); + i->vrbuffer = (unsigned char*)malloc(i->video->width*i->video->height*4); + + memset(&swf, 0, sizeof(SWF)); + swf.fileVersion=i->version; + swf.fileSize = 0; + swf.frameCount = 65535; + swf.movieSize.xmax=i->width*20; + swf.movieSize.ymax=i->height*20; + swf.compressed = 8; /* 8 = compression done by caller (us) */ + swf.frameRate = (int)(i->framerate*0x100);//25*0x100; + + /* write the first 8 bytes to out */ + i->out2.write(&i->out2, header, 8); + + i->filesize += swf_WriteHeader2(&i->out, &swf); + i->headersize = i->filesize; + + i->tag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); + swf_SetU8(i->tag, 0); //black + swf_SetU8(i->tag, 0); + swf_SetU8(i->tag, 0); + i->filesize += swf_WriteTag2(&i->out, i->tag); +} + +static void finish(v2swf_internal_t*i) +{ + msg("finish(): i->finished=%d\n", i->finished); + if(!i->finished) { + msg("write endtag\n", i->finished); + + if(i->add_cut) { + swf_ResetTag(i->tag, ST_SHOWFRAME); + i->filesize += swf_WriteTag2(&i->out, i->tag); + + swf_ResetTag(i->tag, ST_REMOVEOBJECT2); + swf_SetU16(i->tag, 1); //depth + i->filesize += swf_WriteTag2(&i->out, i->tag); + + swf_ResetTag(i->tag, ST_DOACTION); + swf_SetU16(i->tag, 0x0007); + i->filesize += swf_WriteTag2(&i->out, i->tag); + } + + swf_ResetTag(i->tag, ST_END); + i->filesize += swf_WriteTag2(&i->out, i->tag); + + i->out.finish(&i->out); + + if(i->version>=6) { + swf_VideoStreamClear(&i->stream); + } + if(i->buffer) { + free(i->buffer);i->buffer = 0; + } + if(i->vrbuffer) { + free(i->vrbuffer);i->vrbuffer = 0; + } + if(i->lastbitmap) { + free(i->lastbitmap);i->lastbitmap = 0; + } + + /* FIXME: we shouldn't be doing this. the caller should */ + msg("call videoreader_close(%08x)\n", i->video); + videoreader_close(i->video); + + i->finished = 1; + } + msg("finishing done\n"); +} +static void cleanup(v2swf_internal_t*i) +{ + int t; + for(t=i->lastid;tid;t++) { + if(!(t&1)) { + swf_ResetTag(i->tag, ST_REMOVEOBJECT2); + swf_SetU16(i->tag, t); + i->filesize += swf_WriteTag2(&i->out, i->tag); + } + swf_ResetTag(i->tag, ST_FREECHARACTER); + swf_SetU16(i->tag, t); + i->filesize += swf_WriteTag2(&i->out, i->tag); + } + i->lastid = i->id; +} + +#define DIFFMODE_MAX 1 +#define DIFFMODE_MEAN 2 +#define DIFFMODE_EXACT 3 +#define DIFFMODE_QMEAN 4 + +static int blockdiff_max(U8*d1,U8*d2,int yadd, int maxdiff, int xl, int yl) +{ + int x,y; + for(y=0;ymaxdiff) + return 1; + + d1+=4; d2+=4; + } + d1 += yadd; d2 += yadd; + } + return 0; +} + +static int blockdiff_mean(U8*d1,U8*d2,int yadd, int maxdiff, int xl, int yl) +{ + int mean = 0; + int x,y; + for(y=0;y maxdiff) + return 1; + return 0; +} + +static int blockdiff_qmean(U8*d1,U8*d2,int yadd, int maxdiff, int xl, int yl) +{ + int mean = 0; + int x,y; + for(y=0;y maxdiff*maxdiff) + return 1; + return 0; +} + +static int blockdiff_exact(U8*d1,U8*d2,int yadd, int xl, int yl) +{ + int x,y; + for(y=0;yhead_done) { + writehead(i); + if(i->version>=6) { + swf_ResetTag(i->tag, ST_DEFINEVIDEOSTREAM); + swf_SetU16(i->tag, 99); + swf_SetVideoStreamDefine(i->tag, &i->stream, 65535, i->width, i->height); + i->filesize += swf_WriteTag2(&i->out, i->tag); + if(i->domotion) { + i->stream.do_motion = 1; + } + } + i->head_done = 1; + } +} + +static void scaleimage(v2swf_internal_t*i) +{ + int x,y; + int xv,yv; + int xm = (i->video->width*65536)/i->width; + int ym = (i->video->height*65536)/i->height; + msg("scaling from %dx%d to %dx%d\n", + i->video->width, i->video->height, + i->width, i->height + ); + + memset(i->buffer, 255, i->width*i->height*4); + for(y=0,yv=0;yheight;y++,yv+=ym) { + int*src = &((int*)i->vrbuffer)[(yv>>16)*i->video->width]; + int*dest = &((int*)i->buffer)[y*i->width]; + for(x=0,xv=0;xwidth;x++,xv+=xm) { + dest[x] = src[xv>>16]; + } + } + //memcpy(i->buffer, i->vrbuffer, i->width*i->height*4); +} + +static int writeAudioOnly(v2swf_internal_t*i) +{ + if(i->showframe) { + i->fpspos += i->fpsratio; + /* skip frames */ + if(i->fpspos<1.0) { + return 0; + } + writeShowFrame(i); + } + i->showframe = 1; + return 1; +} + +static int getframe(v2swf_internal_t*i) +{ + if(!i->skipframes) + return videoreader_getimage(i->video, i->vrbuffer); + else { + int t; + for(t=0;tskipframes;t++) { + int ret = videoreader_getimage(i->video, i->vrbuffer); + if(!ret) + return 0; + } + return 1; + } +} + +static int encodeoneframe(v2swf_internal_t*i) +{ + videoreader_t*video = i->video; + int ret; + + checkInit(i); + + if(i->video_eof && i->audio_eof) { + if(!i->finished) + finish(i); + return 0; + } + + if(!i->audio_eof && i->video_eof) { + return writeAudioOnly(i); + } + + if(!getframe(i) || (i->numframes && i->frames==i->numframes)) + { + i->video_eof = 1; + msg("videoreader returned eof\n"); + if(i->audio_eof || (i->numframes && i->frames==i->numframes)) { + finish(i); + return 0; + } else { + return writeAudioOnly(i); + } + } + + msg("encoding image for frame %d\n", i->frames); + if(i->showframe) { + i->fpspos += i->fpsratio; + /* skip frames */ + if(i->fpspos<1.0) { + return 0; + } + writeShowFrame(i); + } + + scaleimage(i); + + msg("version is %d\n", i->version); + + if(i->version <= 4) { + + int bmid = i->id++; + int shapeid = i->id++; + int width2 = i->width * 4; + + if(i->id>=4) { + swf_ResetTag(i->tag, ST_REMOVEOBJECT2); + swf_SetU16(i->tag, i->id-3); + i->filesize += swf_WriteTag2(&i->out, i->tag); + swf_ResetTag(i->tag, ST_FREECHARACTER); + swf_SetU16(i->tag, i->id-4); + i->filesize += swf_WriteTag2(&i->out, i->tag); + } + + swf_ResetTag(i->tag, ST_DEFINEBITSJPEG2); + swf_SetU16(i->tag, bmid); + swf_SetJPEGBits2(i->tag, i->width, i->height, (RGBA*)i->buffer, i->quality); + i->filesize += swf_WriteTag2(&i->out, i->tag); + + writeShowTags(i, shapeid, bmid, i->width, i->height); + + } else if(i->version == 5) { + int width2 = i->width * 4; + int width8 = (i->width+7)/8; + int height8 = (i->height+7)/8; + + /* the idea is here to only update those jpeg 8x8 blocks + which actually have changed. This means that we have to keep + the bitmap from the last frame for the comparison. */ + + (i->keyframe)--; + if(!i->lastbitmap || !i->keyframe) { + int t, bmid,shapeid; + cleanup(i); + + if(!i->lastbitmap) { + msg("Creating bitmap buffer for %dx%d (%dx%d), (%dx%d)\n", i->width, i->height, width2, i->height, width8, height8); + i->lastbitmap = (U8*)malloc(width2*i->height); + } + memcpy(i->lastbitmap, i->buffer, width2*i->height); + + i->keyframe = i->keyframe_interval; + + bmid = i->id++; + shapeid = i->id++; + width2 = i->width * 4; + swf_ResetTag(i->tag, ST_DEFINEBITSJPEG2); + swf_SetU16(i->tag, bmid); + swf_SetJPEGBits2(i->tag, i->width, i->height, (RGBA*)i->buffer, i->quality); + i->filesize += swf_WriteTag2(&i->out, i->tag); + + writeShowTags(i, shapeid, bmid, i->width, i->height); + return 1; + } else { + /* The following looks so ugly because it's somewhat optimized. + What it does is walk through all the 8x8 blocks, find those + which have changed too much and set all others to (R,G,B,A)=(0,0,0,0). + It also set's alpha to 255 in those who haven't changed, and + copies them to lastbitmap. + */ + + int x8, y8; + //int maxdiff = ((100 - i->quality)*256)/100; + int maxdiff = i->blockdiff*3; + for(y8=0;y8 i->width) + xl = i->width - x8*8; + if(y8*8+yl > i->height) + yl = i->height - y8*8; + d1 = &i->buffer[width2*y8*8+x8*8*4]; + d1b = d1; + d2 = &i->lastbitmap[width2*y8*8+x8*8*4]; + d2b = d2; + yadd = width2 - (xl*4); + + if(i->diffmode == DIFFMODE_MAX) { + if(blockdiff_max(d1, d2, yadd, maxdiff, xl, yl)) + goto differ; + } else if(i->diffmode == DIFFMODE_MEAN) { + if(blockdiff_mean(d1, d2, yadd, maxdiff, xl, yl)) + goto differ; + } else if(i->diffmode == DIFFMODE_EXACT) { + if(blockdiff_exact(d1, d2, yadd, xl, yl)) + goto differ; + } else if(i->diffmode == DIFFMODE_QMEAN) { + if(blockdiff_qmean(d1, d2, yadd, maxdiff, xl, yl)) + goto differ; + } + + for(y=0;yid++; + int shapeid = i->id++; + + swf_ResetTag(i->tag, ST_DEFINEBITSJPEG3); + swf_SetU16(i->tag, bmid); + swf_SetJPEGBits3(i->tag, i->width, i->height, (RGBA*)i->buffer, i->quality); + i->filesize += swf_WriteTag2(&i->out, i->tag); + + writeShowTags(i, shapeid, bmid, i->width, i->height); + } + } else { + int quant = 1+(30-(30*i->quality)/100); + SWFPLACEOBJECT obj; + + swf_GetPlaceObject(0, &obj); + if(!i->prescale) { + obj.matrix.sx = obj.matrix.sy = i->scale; + } + + if(i->stream.frame==0) { + obj.depth = 1; + obj.id = 99; + } else { + obj.move = 1; + obj.depth = 1; + obj.ratio = i->stream.frame; + } + + swf_ResetTag(i->tag, ST_VIDEOFRAME); + swf_SetU16(i->tag, 99); + if(!(--i->keyframe)) { + msg("setting video I-frame, ratio=%d\n", i->stream.frame); + swf_SetVideoStreamIFrame(i->tag, &i->stream, (RGBA*)i->buffer, quant); + i->keyframe = i->keyframe_interval; + } else { + msg("setting video P-frame, ratio=%d\n", i->stream.frame); + swf_SetVideoStreamPFrame(i->tag, &i->stream, (RGBA*)i->buffer, quant); + } + i->filesize += swf_WriteTag2(&i->out, i->tag); + + swf_ResetTag(i->tag, ST_PLACEOBJECT2); + swf_SetPlaceObject(i->tag,&obj); + i->filesize += swf_WriteTag2(&i->out, i->tag); + i->showframe = 1; + } + return 1; +} + +static void init_fps(v2swf_internal_t*i) +{ + int oldframerate = i->framerate; + i->framerate = i->video->fps / i->skipframes; + i->video_fps = ((int)(i->framerate*256))/256.0; + if(oldframerate) + msg("setting new framerate to %f\n", i->framerate); +} + +int v2swf_init(v2swf_t*v2swf, videoreader_t * video) +{ + int ret = 0; + int t=0; + v2swf_internal_t* i; + msg("v2swf_init()\n"); + memset(v2swf, 0, sizeof(v2swf_t)); + i = (v2swf_internal_t*)malloc(sizeof(v2swf_internal_t)); + memset(i, 0, sizeof(v2swf_internal_t)); + v2swf->internal = i; + + ringbuffer_init(&i->r); + + i->skipframes = 1; + i->framerate = 0; + i->video = video; + init_fps(i); + + msg("video: %dx%d, fps %f\n", video->width, video->height, video->fps); + + i->blockdiff = 64; + i->keyframe_interval = 8; + i->quality = 20; + i->scale = 65536; + i->add_cut = 1; + i->samplerate = 11025; + i->prescale = 0; + i->numframes= 0; + i->skipframes = 0; + i->head_done = 0; + i->diffmode = DIFFMODE_QMEAN; + i->audio_fix = 1.0; + i->fixheader = 0; + i->fpsratio = 1.00000000000; + i->fpspos = 0.0; + i->bitrate = 32; + i->version = 6; + i->buffer = 0; + i->lastbitmap = 0; + i->filesize = 8; + i->frames = 0; + i->id = 1; + i->lastid = 1; + i->keyframe = 1; + i->showframe = 0; + + memset(&i->out, 0, sizeof(writer_t)); + memset(&i->out2, 0, sizeof(writer_t)); + + return 0; +} +int v2swf_read(v2swf_t*v2swf, void*buffer, int len) +{ + v2swf_internal_t* i; + int l; + msg("v2swf_read(%d)\n", len); + i = (v2swf_internal_t*)v2swf->internal; + + while(!i->finished && i->r.available < len) { + if(!encodeoneframe(i)) { + break; + } + } + msg("v2swf_read() done: %d bytes available in ringbuffer\n", i->r.available); + l = ringbuffer_read(&i->r, buffer, len); + + return l; +} +void v2swf_close(v2swf_t*v2swf) +{ + v2swf_internal_t* i = (v2swf_internal_t*)v2swf->internal; + msg("close(): i->finished=%d\n", i->finished); + + /* needed only if aborting: */ + finish(i); + + msg("freeing memory\n"); + free(v2swf->internal); + memset(v2swf, 0, sizeof(v2swf_t)); + msg("close() done\n"); +} + +static int mp3_bitrates[] = +{ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0}; + +void v2swf_setparameter(v2swf_t*v2swf, char*name, char*value) +{ + v2swf_internal_t* i; + + msg("set parameters %s to %s\n", name, value); + + if(!strcmp(name, "verbose")) { + verbose = 1; + msg("set parameters %s to %s\n", name, value); + return; + } + + if(!v2swf || !v2swf->internal) { + printf("error- couldn't set parameter %s: not initialized yet\n", name);fflush(stdout); + return; + } + i = (v2swf_internal_t*)v2swf->internal; + + if(!strcmp(name, "flash_version")) { + i->version = atoi(value); + } else if(!strcmp(name, "audiosync")) { + i->audio_fix = (int)(atof(value)); + } else if(!strcmp(name, "addcut")) { + i->add_cut = atoi(value); + } else if(!strcmp(name, "scale")) { + i->scale = (int)(atof(value)*65536); + } else if(!strcmp(name, "scale65536")) { + i->scale = atoi(value); + } else if(!strcmp(name, "quality")) { + i->quality = atoi(value); + } else if(!strcmp(name, "skipframes")) { + i->skipframes = atoi(value); + init_fps(i); + } else if(!strcmp(name, "numframes")) { + i->numframes = atoi(value); + } else if(!strcmp(name, "motioncompensation")) { + i->domotion = atoi(value); + } else if(!strcmp(name, "prescale")) { + i->prescale = atoi(value); + } else if(!strcmp(name, "blockdiff")) { + i->blockdiff = atoi(value); + } else if(!strcmp(name, "fixheader")) { + i->fixheader = atoi(value); + } else if(!strcmp(name, "samplerate")) { + i->samplerate = atoi(value); + } else if(!strcmp(name, "framerate")) { + i->framerate = atof(value); + i->fpsratio = i->framerate / i->video_fps; + } + else if(!strcmp(name, "mp3_bitrate")) { + int t=0,o; + i->bitrate = o = atoi(value); + if(i->bitrate>160) + i->bitrate = 160; + while(mp3_bitrates[t]) { + if(i->bitrate <= mp3_bitrates[t]) { + i->bitrate = mp3_bitrates[t]; + break; + } + t++; + } + msg("bitrate %d requested, setting to %d", o, i->bitrate); + } + else if(!strcmp(name, "blockdiff_mode")) { + if(!strcmp(value, "max")) i->diffmode = DIFFMODE_MAX; + else if(!strcmp(value, "mean")) i->diffmode = DIFFMODE_MEAN; + else if(!strcmp(value, "qmean")) i->diffmode = DIFFMODE_QMEAN; + else if(!strcmp(value, "exact")) i->diffmode = DIFFMODE_EXACT; + else { + printf("diffmode %s not recognized\n", value); + printf("valid diffmodes are: %s\n", "max, mean, qmean, exact"); + } + } + else if(!strcmp(name, "keyframe_interval") + || !strcmp(name, "keyframe")) { + int k = atoi(value);if(k<=0) k=1; + i->keyframe_interval = k; + } + else { + printf("Setting encoder.%s not recognized!\n", name);fflush(stdout); + return; + } +} +void v2swf_backpatch(v2swf_t*v2swf, char*filename) +{ + FILE* fi; + unsigned char f; + v2swf_internal_t* i = (v2swf_internal_t*)v2swf->internal; + msg("v2swf_backpatch %s\n", filename); + if(!i) { + printf("call backpatch before close\n");fflush(stdout); + } + fi = fopen(filename, "rb+"); + if(!fi) { + printf("can't open %s\n", filename); + exit(1); + } + fseek(fi, 4, SEEK_SET); + f = i->filesize ;fwrite(&f,1,1,fi); + f = i->filesize >> 8 ;fwrite(&f,1,1,fi); + f = i->filesize >> 16;fwrite(&f,1,1,fi); + f = i->filesize >> 24;fwrite(&f,1,1,fi); + if(i->version<6) { + /* no compression- we can backpatch the frames too */ + fseek(fi, i->headersize-2, SEEK_SET); + f = i->frames ;fwrite(&f,1,1,fi); + f = i->frames >> 8 ;fwrite(&f,1,1,fi); + } + fclose(fi); + if(i->fixheader) { + SWF tmp; + int fi; + msg("v2swf_backpatch %s - fix header\n", filename); + memset(&tmp, 0, sizeof(tmp)); + fi = open(filename, O_RDONLY|O_BINARY); + if(fi>=0) { + if(swf_ReadSWF(fi, &tmp)>=0) { + close(fi); + fi = open(filename, O_WRONLY|O_BINARY|O_TRUNC|O_CREAT, 0666); + if(fi>=0) { + swf_WriteSWF(fi, &tmp); + close(fi); + msg("v2swf_backpatch %s - fix header: success\n", filename); + } + } + } + } +} + +void v2swf_setvideoparameter(videoreader_t*v, char*name, char*value) +{ + msg("v2swf_setvideoparameter()"); + videoreader_setparameter(v, name, value); +} diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h b/fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h new file mode 100644 index 000000000..56f2c97a3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h @@ -0,0 +1,46 @@ +/* v2swf.h + header file for v2swf.h - part of SWFTools + + Copyright (C) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __video_h__ +#define __video_h__ + +#ifdef __cplusplus +extern "C" { +#else +typedef unsigned char bool; +#endif + +#include "videoreader.h" + +typedef struct _v2swf_t +{ + void*internal; +} v2swf_t; + +int v2swf_init(v2swf_t*v2swf, videoreader_t * video); +int v2swf_read(v2swf_t*v2swf, void*buffer, int len); +void v2swf_setparameter(v2swf_t*v2swf, char*name, char*value); +void v2swf_close(v2swf_t*v2swf); +void v2swf_backpatch(v2swf_t*v2swf, char*filename); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h new file mode 100644 index 000000000..9392d8ca7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h @@ -0,0 +1,34 @@ +#ifndef __videoreader_t__ +#define __videoreader_t__ + +#define videoreader_getsamples(v, buffer, num) ((v)->getsamples((v),(buffer),(num))) +#define videoreader_getimage(v, buffer) ((v)->getimage((v),(buffer))) +#define videoreader_eof(v) ((v)->eof(v)) +#define videoreader_setparameter(v,name,value) ((v)->setparameter((v),(name),(value))) +#define videoreader_close(v) ((v)->close(v)) + +typedef struct _videoreader_t +{ + void*internal; + + /* video */ + int width; + int height; + double fps; + + /* audio */ + int channels; + int samplerate; + + /* progress */ + int frame; + + void (*setparameter) (struct _videoreader_t*, char*name, char*value); + int (*getsamples) (struct _videoreader_t*, void*buffer, int num); + int (*getimage) (struct _videoreader_t*, void*buffer); // buffer must hold width*height*4 bytes + void (*close) (struct _videoreader_t*); + +} videoreader_t; + + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc new file mode 100644 index 000000000..371835d84 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc @@ -0,0 +1,354 @@ +/* videoreader_avifile.cc + Read avi files using the avifile library. + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../config.h" +#include "videoreader.h" + +#ifdef HAVE_AVIFILE + +#undef HAVE_CONFIG_H + +#ifdef HAVE_VERSION_H + #include +#endif +#ifdef HAVE_AVIFILE_VERSION_H + #include +#endif + +#if (AVIFILE_MAJOR_VERSION == 0) && (AVIFILE_MINOR_VERSION>=6) + #include + #include + #include + #include + #include + #define VERSION6 +#else + #include + #include + #include + #define Width width + #define Height height + #define Data data + #define Bpp bpp +#endif + +#ifdef HAVE_SIGNAL_H +#ifdef HAVE_PTHREAD_H +#include +#include +#define DO_SIGNALS +#endif +#endif + +#include "../lib/q.h" + +static int verbose = 0; + +typedef struct _videoreader_avifile_internal +{ + IAviReadFile* player; + IAviReadStream* astream; + IAviReadStream* vstream; + int do_audio; + int do_video; + int video_eof; + int audio_eof; + int flip; + int frame; + int soundbits; + ringbuffer_t audio_buffer; +} videoreader_avifile_internal; + +static int readSamples(videoreader_avifile_internal*i, void*buffer, int buffer_size, int numsamples) +{ + int ret; + while(i->audio_buffer.available < buffer_size) { + unsigned int samples_read = 0, bytes_read = 0; + ret = i->astream->ReadFrames(buffer, buffer_size, numsamples, samples_read, bytes_read); + if(ret!=0) { + if(verbose) { + printf("ReadFrames() returns %d\n", ret);fflush(stdout); + } + } + if(samples_read<=0) { + int l = i->audio_buffer.available; + ringbuffer_read(&i->audio_buffer, buffer, l); + return l; + } + ringbuffer_put(&i->audio_buffer, buffer, bytes_read); + } + ringbuffer_read(&i->audio_buffer, buffer, buffer_size); + return buffer_size; +} +static int videoreader_avifile_getsamples(videoreader_t* v, void*buffer, int num) +{ + videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; + if(verbose) { + printf("videoreader_getsamples(%d)\n", num);fflush(stdout); + } + if(i->audio_eof) + return 0; + if(i->soundbits == 8) { + int num_read = readSamples(i, buffer, num/2, num/(v->channels*2))*2; + unsigned char*b = (unsigned char*)buffer; + int t; + for(t=num_read-2;t>=0;t-=2) { + unsigned char x = b[t/2]; + b[t] = 0; + b[t+1] = x-128; + } + if(!num_read) { + if(verbose) { + printf("end of audio\n");fflush(stdout); + } + i->audio_eof=1; + } + return num_read; + } + if(i->soundbits == 16) { + int num_read = readSamples(i, buffer, num, num/(v->channels*2)); + if(!num_read) { + if(verbose) { + printf("end of audio\n");fflush(stdout); + } + i->audio_eof=1; + } + return num_read; + } + return 0; +} +static int videoreader_avifile_getimage(videoreader_t* v, void*buffer) +{ + videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; + if(verbose) { + printf("videoreader_getimage()\n");fflush(stdout); + } + + if(i->video_eof) + return 0; + + if(i->vstream->ReadFrame() < 0) { + if(verbose) printf("vstream->ReadFrame() returned value < 0, shutting down...\n"); + i->video_eof = 1; + return 0; + } + CImage*img2 = 0; + CImage*img = i->vstream->GetFrame(); + if(!img) { + if(verbose) printf("vstream->GetFrame() returned NULL, shutting down...\n"); + i->video_eof = 1; + return 0; + } + /* we convert the image to YUV first, because we can convert to RGB from YUV only */ + img->ToYUV(); + img->ToRGB(); + if(img->Bpp() != 3) { + if(verbose) printf("Warning: converthing from bpp %d to bpp 3, this fails on older avifile versions...\n", img->Bpp()); + BitmapInfo tmp(v->width, v->height, 24); + img2 = new CImage(img, &tmp); + img = img2; + } + + v->frame++; + i->frame++; + unsigned char*data = img->Data(); + int bpp = img->Bpp(); + if(bpp == 3) { + int x,y; + for(y=0;yheight;y++) { + unsigned char*from,*to; + to = &((unsigned char*)buffer)[y*v->width*4]; + if(i->flip) + from = img->At(v->height-y-1); + else + from = img->At(y); + for(x=0;xwidth;x++) { + to[x*4+0] = 0; + to[x*4+1] = from[x*3+2]; + to[x*4+2] = from[x*3+1]; + to[x*4+3] = from[x*3+0]; + } + } + if(img2) delete img2; + return v->width*v->height*4; + } else { + if(img2) delete img2; + if(verbose) printf("Can't handle bpp %d, shutting down...\n", bpp); + i->video_eof = 1; + return 0; + } +} +static void videoreader_avifile_close(videoreader_t* v) +{ + videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; + if(verbose) { + printf("videoreader_close()\n");fflush(stdout); + } + if(i->do_audio) { + ringbuffer_clear(&i->audio_buffer); + } +} +static void videoreader_avifile_setparameter(videoreader_t*v, char*name, char*value) +{ + videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; + if(!strcmp(name, "verbose")) { + verbose = atoi(value); + } + if(!strcmp(name, "flip")) { + i->flip = atoi(value); + } + if(verbose) { + printf("videoreader_setparameter(%s, %s)\n", name, value);fflush(stdout); + } +} + +int videoreader_avifile_open(videoreader_t* v, char* filename) +{ + if(!filename) { + /* codec query */ + return 0; + } + videoreader_avifile_internal* i; + i = (videoreader_avifile_internal*)malloc(sizeof(videoreader_avifile_internal)); + memset(i, 0, sizeof(videoreader_avifile_internal)); + memset(v, 0, sizeof(videoreader_t)); + v->getsamples = videoreader_avifile_getsamples; + v->close = videoreader_avifile_close; + v->getimage = videoreader_avifile_getimage; + v->getsamples = videoreader_avifile_getsamples; + v->setparameter = videoreader_avifile_setparameter; + v->internal = i; + v->frame = 0; + + i->do_video = 1; + i->do_audio = 1; + + i->player = CreateIAviReadFile(filename); + if(verbose) { + printf("%d streams (%d video, %d audio)\n", + i->player->StreamCount(), + i->player->VideoStreamCount(), + i->player->AudioStreamCount()); + } + i->astream = i->player->GetStream(0, AviStream::Audio); + i->vstream = i->player->GetStream(0, AviStream::Video); + if(!i->vstream) { + printf("Couldn't open video stream\n"); + i->do_video = 0; + } + if(!i->astream) { + printf("Couldn't open video stream\n"); + i->do_audio = 0; + } +#ifdef NO_MP3 + if(i->do_audio) { + printf(stderr, "MP3 support has been disabled at compile time, not converting soundtrack"); + i->do_audio = 0; + } +#endif + + if(!i->do_video && !i->do_audio) { + printf("File has neither audio nor video streams.(?)\n"); + return -1; + } + +#ifndef VERSION6 + MainAVIHeader head; + int dwMicroSecPerFrame = 0; + player->GetFileHeader(&head); + printf("fps: %d\n", 1000000/head.dwMicroSecPerFrame); + printf("frames: %d\n", head.dwTotalFrames); + printf("streams: %d\n", head.dwStreams); + printf("width: %d\n", abs(head.dwWidth)); + printf("height: %d\n", abs(head.dwHeight)); + printf("sound: %u samples (%f seconds)\n", i->astream->GetEndPos(), i->astream->GetEndTime()); + v->width = abs(head.dwWidth); + v->height = abs(head.dwHeight); + dwMicroSecPerFrame = head.dwMicroSecPerFrame; + samplesperframe = astream->GetEndPos()/astream->GetEndTime()*head.dwMicroSecPerFrame/1000000; + v->samplerate = (int)(astream->GetEndPos()/astream->GetEndTime()); + v->fps = 1000000.0/dwMicroSecPerFrame; + i->soundbits = 16; +#else + if(i->do_video) + { + StreamInfo*videoinfo; + videoinfo = i->vstream->GetStreamInfo(); + v->width = abs(videoinfo->GetVideoWidth()); + v->height = abs(videoinfo->GetVideoHeight()); + v->fps = (double)(videoinfo->GetFps()); + } + if(i->do_audio) + { + WAVEFORMATEX wave; + StreamInfo*audioinfo; + + i->astream->GetAudioFormatInfo(&wave,0); + audioinfo = i->astream->GetStreamInfo(); + + v->channels = wave.nChannels; + v->samplerate = wave.nSamplesPerSec; + i->soundbits = wave.wBitsPerSample; + + if(v->channels==0 || v->samplerate==0 || i->soundbits==0 || wave.wFormatTag!=1) { + v->samplerate = audioinfo->GetAudioSamplesPerSec(); + v->channels = audioinfo->GetAudioChannels(); + i->soundbits = audioinfo->GetAudioBitsPerSample(); + } + + if(verbose) { + printf("formatinfo: format %d, %d channels, %d bits/sample, rate %d, blockalign %d\n", wave.wFormatTag, wave.nChannels, wave.wBitsPerSample, wave.nSamplesPerSec, wave.nBlockAlign); + printf("audioinfo: %d channels, %d bits/sample, rate %d\n", audioinfo->GetAudioChannels(), audioinfo->GetAudioBitsPerSample(), audioinfo->GetAudioSamplesPerSec()); + } + if(i->soundbits != 8 && i->soundbits != 16) { + printf("Can't handle %d bit audio, disabling sound\n", wave.wBitsPerSample); + i->do_audio = 0; + i->soundbits = 0; + v->channels = 0; + v->samplerate = 0; + } + } +#endif + i->vstream -> StartStreaming(); + if(i->do_audio) { + i->astream -> StartStreaming(); + ringbuffer_init(&i->audio_buffer); +#ifdef VERSION6 + WAVEFORMATEX wave; + i->astream -> GetOutputFormat(&wave, sizeof(wave)); + printf("formatinfo: format %d, %d channels, %d bits/sample, rate %d, blockalign %d\n", wave.wFormatTag, wave.nChannels, wave.wBitsPerSample, wave.nSamplesPerSec, wave.nBlockAlign); +#endif + } + + return 0; +} + +#else //HAVE_AVIFILE + +int videoreader_avifile_open(videoreader_t* v, char* filename) +{ + return -1; +} + +#endif //HAVE_AVIFILE diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh new file mode 100644 index 000000000..4486536d8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh @@ -0,0 +1,29 @@ +/* videoreader_avifile.hh + Read avi files using the avifile library. + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __videoreader_avifile_h__ +#define __videoreader_avifile_h__ + +#include "videoreader.h" + +int videoreader_avifile_open(videoreader_t* v, char* filename); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc new file mode 100644 index 000000000..ca8a6b72f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc @@ -0,0 +1,401 @@ +/* videoreader_vfw.cc + Read avi files using Video For Windows (vfw). + + Part of the swftools package. + + Copyright (c) 2004 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "videoreader.h" +#ifdef WIN32 +#include +#include +#include +#include + +typedef struct _videoreader_vfw_internal { + //video: + PAVISTREAM vs; + //audio: + PAVISTREAM as; + + PGETFRAME getframe; + IAVIFile* avifile; + BITMAPINFOHEADER bitmap; + WAVEFORMATEX waveformat; + + int audio_eof; + int video_eof; + + int video_pos; + int video_end; + + int audio_pos; + int audio_end; + + float fps; + int width,height; + + int samplerate; + int channels; + + int flip; +} videoreader_vfw_internal_t; + +static int avifile_initialized = 0; +static int verbose; + +#define _TRACE_ {printf("vfw: %s: %d (%s)\n",__FILE__,__LINE__,__func__);fflush(stdout);} + +static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width, const int dest_height, int flip) +{ + UCHAR*data = (UCHAR*)(bi+1); // actual bitmap data starts after the header + + if(bi->biPlanes!=1 || bi->biCompression!=0 || bi->biBitCount%4!=0) { + /* unsupported format */ + fprintf(stderr, "bitmap_to_rgba: unsupported format: biPlanes=%d, biCompression=%d biBitCount=%d\n", + bi->biPlanes, bi->biCompression, bi->biBitCount); + return 0; + } + + ULONG*dest = (ULONG*)buffer; + + int width = abs(bi->biWidth); + int height = abs(bi->biHeight); + if(dest_width != width || dest_height != height) { + /* TODO: size conversion */ + fprintf(stderr, "size mismatch: %dx%d != %dx%d\n", width, height, dest_width, dest_height); + return 0; + } + + /* convert the various image types to RGBA- + TODO: is there some way to let the Windows API do this? */ + int bytesperpixel = ((bi->biWidth*bi->biBitCount)+7)&~7; + int linex = ((bytesperpixel/8)+3)&~3; + memset(dest, 255, dest_width*dest_height*4);//pre-fill alpha channel + + const int starty = flip? 0 : dest_height-1; + const int endy = flip? dest_height : -1; + const int yinc = flip? 1 : -1; + + if(verbose) { + printf("vfw: Convering scanlines %d to %d from bpp %d, %d stepping, flip=%d\n", starty, endy, bi->biBitCount, yinc, flip); + } + + if(bi->biBitCount==1) { + UCHAR*img = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;x>(x&7))&1); + } + } + } else if(bi->biBitCount==4) { + UCHAR*img = &data[bi->biClrUsed*4]; + UCHAR*pal = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;x>4)<<2|0]<<8|pal[(line[0]>>4)<<2|1]<<16|pal[(line[0]>>4)<<2|2]<<24; + *dest++ = 255|pal[(line[0]&0x0f)<<2|0]<<8|pal[(line[0]&0x0f)<<2|1]<<16|pal[(line[0]&0x0f)<<2|2]<<24; + line++; + } + } + } else if(bi->biBitCount==8) { + UCHAR*img = &data[bi->biClrUsed*4]; + UCHAR*pal = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;xbiBitCount==16) { + UCHAR*img = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;x>5&0x1f)<<(16+3)|(c>>10&0x1f)<<(8+3); + line+=2; + } + } + } else if(bi->biBitCount==24) { + UCHAR*img = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;xbiBitCount==32) { + UCHAR*img = data; + int y; + for(y=starty;y!=endy;y+=yinc) { + UCHAR*line = &img[linex*y]; + int x; + for(x=0;xbiBitCount); + return 0; + } + return 1; +} + +static int videoreader_vfw_getimage(videoreader_t* vr, void*buffer) +{ + videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; + + if (i->video_pos >= i->video_end) + i->video_eof = 1; + + if(i->video_eof) + return 0; + + LPBITMAPINFOHEADER bi; + bi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(i->getframe, i->video_pos); + + i->video_pos++; + vr->frame++; + + if(!bi) { + fprintf(stderr, "AVIStreamGetFrame failed\n"); + return 0; + } + + if(!bitmap_to_rgba(bi, buffer, i->width, i->height, i->flip)) { + fprintf(stderr, "couldn't convert bitmap to RGBA.\n"); + return 0; + } + return i->width*i->height*4; +} + +static int readAudioBlock(videoreader_vfw_internal_t* i, void*buf, int len) +{ + LONG bytes; + LONG samples; + AVIStreamRead(i->as, i->audio_pos, len/(2*i->waveformat.nChannels), buf, len, &bytes, &samples); + i->audio_pos += samples; + return bytes; +} + +static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num) +{ + videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; + + if(i->audio_eof) + return 0; + + switch(i->waveformat.wBitsPerSample) { + case 1: { + int len = readAudioBlock(i, buf, num); + int t = len-1; + do { + ((SHORT*)buf)[t] = ((((BYTE*)buf)[t>>3])>>(t&7))<<15; + } while(--t>=0); + if(!len) i->audio_eof = 1; + return len*8; + } + case 8: { + int len = readAudioBlock(i, buf, num); + int t = len-1; + do { + ((SHORT*)buf)[t] = (((BYTE*)buf)[t]<<8)^0x8000; + } while(--t>=0); + if(!len) i->audio_eof = 1; + return len*2; + } + case 16: { + int len = readAudioBlock(i, buf, num); + if(!len) i->audio_eof = 1; + return len; + } + default: { + return 0; + } + } +} + +static void videoreader_vfw_close(videoreader_t* vr) +{ + videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; + + AVIStreamGetFrameClose(i->getframe); + if(i->vs) { + AVIStreamRelease(i->vs); i->vs = 0; + } + if(i->as) { + AVIStreamRelease(i->as); i->vs = 0; + } + AVIFileRelease(i->avifile); i->avifile = 0; + + AVIFileExit(); avifile_initialized=0; + + free(vr->internal); vr->internal = 0; +} + +static void videoreader_vfw_setparameter(videoreader_t*vr, char*name, char*value) +{ + videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; + if(!strcmp(name, "flip")) { + i->flip = atoi(value); + } else if(!strcmp(name, "verbose")) { + verbose = atoi(value); + } +} + +int videoreader_vfw_open(videoreader_t* vr, char* filename) +{ + memset(vr, 0, sizeof(videoreader_t)); + if(!filename) { + /* codec query */ + return 1; + } + + videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)malloc(sizeof(videoreader_vfw_internal_t)); + memset(i, 0, sizeof(videoreader_vfw_internal_t)); + + vr->internal = i; + vr->getimage = videoreader_vfw_getimage; + vr->getsamples = videoreader_vfw_getsamples; + vr->close = videoreader_vfw_close; + vr->setparameter = videoreader_vfw_setparameter; + + if(!avifile_initialized) { + AVIFileInit(); + } + if(AVIFileOpen(&i->avifile, filename, OF_SHARE_DENY_WRITE, 0)) { + fprintf(stderr, "Couldn't open %s\n", filename); + return -1; + } + AVIFILEINFO info; + AVIFileInfo(i->avifile, &info, sizeof(info)); + + /* calculate framerate */ + i->fps = (double)info.dwRate/(double)info.dwScale; + + if(verbose) { + printf("vfw: file %s has %f fps, and %d streams\n", i->fps, info.dwStreams); + } + + unsigned int t=0; + while(tavifile, &stream, streamtypeANY, t) != AVIERR_OK || !stream) + break; //video_end of (working) streams + + AVISTREAMINFO streaminfo; + AVIStreamInfo(stream, &streaminfo, sizeof(streaminfo)); + + if (streaminfo.fccType == streamtypeVIDEO) { + /* video stream */ + + BITMAPINFOHEADER bitmap; + LONG size = sizeof(bitmap); + AVIStreamReadFormat(stream, 0, &bitmap, &size); + + if(1) { + i->bitmap = bitmap; + i->vs = stream; + i->width = abs(bitmap.biWidth); + i->height = abs(bitmap.biHeight); + } else { + fprintf(stderr, "Ignoring video stream: %dx%d compression=%d planes=%d\n", + abs(bitmap.biWidth), abs(bitmap.biHeight), + bitmap.biCompression,bitmap.biPlanes); + } + } + else if (streaminfo.fccType == streamtypeAUDIO) { + /* audio stream */ + + WAVEFORMATEX waveformat; + LONG size = sizeof(waveformat); + AVIStreamReadFormat(stream, 0, &waveformat, &size); + + if(waveformat.wBitsPerSample == 16 || + waveformat.wBitsPerSample == 8 || + waveformat.wBitsPerSample == 1 + ) { + i->waveformat = waveformat; + i->as = stream; + i->channels = waveformat.nChannels; + i->samplerate = waveformat.nSamplesPerSec; + } else { + fprintf(stderr, "Ignoring audio stream: bitspersample=%d\n", waveformat.wBitsPerSample); + } + } + t++; + } + + if(i->vs) { + if(verbose) { + printf("vfw: video stream: %dx%d, %.2f\n", i->width, i->height, i->fps); + } + vr->width = i->width; + vr->height = i->height; + vr->fps = i->fps; + } else { + fprintf(stderr, "AVIReader: Warning: No video stream\n"); + } + if(i->as) { + if(verbose) { + printf("vfw: audio stream: %d channels, %d samples/sec", i->channels, i->samplerate); + } + vr->channels = i->channels; + vr->samplerate = i->samplerate; + } else { + fprintf(stderr, "AVIReader: Warning: No audio stream\n"); + } + + i->getframe = AVIStreamGetFrameOpen(i->vs, 0); + if(!i->getframe) { + fprintf(stderr, "Couldn't initialize AVIStream for %s- codec missing?\n", filename); + return -1; + } + + i->video_pos = AVIStreamStart(i->vs); + i->video_end = AVIStreamEnd(i->vs); + i->audio_pos = 0; + i->audio_end = 0x7fffffff; + + return 0; +} + +#else //WIN32 + +int videoreader_vfw_open(videoreader_t* vr, char* filename) +{ + return -1; +} + +#endif //WIN32 + diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh new file mode 100644 index 000000000..71b0a404b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh @@ -0,0 +1,29 @@ +/* videoreader_vfw.hh + Read avi files using video for windows (vfw). + + Part of the swftools package. + + Copyright (c) 2004 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __videoreader_vfw_h__ +#define __videoreader_vfw_h__ + +#include "videoreader.h" + +int videoreader_vfw_open(videoreader_t* v, char* filename); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/config.guess b/fluidbook/tools/swftools-special-swfdump/config.guess new file mode 100644 index 000000000..2313a174e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/config.guess @@ -0,0 +1,1545 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-01-23' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 + +if [ "${UNAME_SYSTEM}" = "Linux" ] ; then + eval $set_cc_for_build + cat << EOF > $dummy.c + #include + #ifdef __UCLIBC__ + # ifdef __UCLIBC_CONFIG_VERSION__ + LIBC=uclibc __UCLIBC_CONFIG_VERSION__ + # else + LIBC=uclibc + # endif + #else + LIBC=gnu + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` +fi + +# 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 tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + 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 ;; + 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:SunOS:5.*:* | i86xen:SunOS:5.*:*) + echo i386-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:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + 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:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd) + 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 ;; + 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-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + 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 + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64:Linux:*:*) + echo powerpc64-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 ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-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 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + 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 ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" + exit ;; + esac + # This should get integrated into the C code below, but now we hack + if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*) + 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 i386. + echo i386-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; } ;; + 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.0*:*) + 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 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + 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 ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/fluidbook/tools/swftools-special-swfdump/config.h b/fluidbook/tools/swftools-special-swfdump/config.h new file mode 100644 index 000000000..4992fa7ce --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/config.h @@ -0,0 +1,299 @@ +/* config.h. Generated from config.h.in by configure. */ +#ifndef __config_h__ +#define __config_h__ + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +#define SIZEOF_SIGNED_CHAR 1 +#define SIZEOF_SIGNED_SHORT 2 +#define SIZEOF_SIGNED 4 +#define SIZEOF_SIGNED_LONG_LONG 8 +#define SIZEOF_VOIDP 8 + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if your declares struct tm. */ +/* #undef TM_IN_SYS_TIME */ + +/* Define if you have the time() function */ +#define HAVE_TIME 1 + +/* Define if you have the time.h header file */ +#define HAVE_TIME_H 1 + +/* Define if you have the sys/time.h header file */ +#define HAVE_SYS_TIME_H 1 + +/* Define if you have the sys/resource.h header file */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define if you have the malloc.h header file */ +/* #undef HAVE_MALLOC_H */ + +/* Define if you have the getrusage function */ +#define HAVE_GETRUSAGE 1 + +/* Define if you have the mallinfo function */ +#define HAVE_MALLINFO 1 + + +/* Define if you have the unistd.h header file */ +#define HAVE_UNISTD_H 1 + +/* for gocr */ +#define HAVE_WCHAR_H 1 +#define HAVE_WCSCHR 1 +#define HAVE_WCSDUP 1 + +/* Define if you have the open64 function. */ +#define HAVE_OPEN64 1 + +/* Define if you have the lrand48 function. */ +#define HAVE_LRAND48 1 + +/* Define if you have the mkstemp function. */ +#define HAVE_MKSTEMP 1 + +/* Define if you have the popen function. */ +#define HAVE_POPEN 1 + +/* Define if you have the bcopy function. */ +#define HAVE_BCOPY 1 + +/* Define if you have the bzero function. */ +#define HAVE_BZERO 1 + +/* Define if you have the rand function. */ +#define HAVE_RAND 1 + +/* Define if you have the srand function. */ +#define HAVE_SRAND 1 + +/* Define if you have the srand48 function. */ +#define HAVE_SRAND48 1 + +/* Define if you have the calloc function. */ +#define HAVE_CALLOC 1 + +/* Define if you have the stat function. */ +#define HAVE_STAT 1 + +/* Define if you have the mmap function. */ +#define HAVE_MMAP 1 + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define if you have the header file. */ +#define HAVE_JPEGLIB_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_DIR_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_IO_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_BSDTYPES_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_T1LIB_H */ + +/* Define if you have the header file. */ +#define HAVE_ZLIB_H 1 + +/* Define if you have the header file. */ +#define HAVE_ZZIP_LIB_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_PDFLIB_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_AVIFILE_VERSION_H */ + +/* Define if you have the header file. */ +#define HAVE_FT2BUILD_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_VERSION_H */ + +/* Define if you have the OpenGL header files */ +/* #undef HAVE_GL_GL_H */ +/* #undef HAVE_GL_GLUT_H */ + +/* Define if you have the OpenGL libraries */ +/* #undef HAVE_LIBGL */ +/* #undef HAVE_LIBGLU */ +/* #undef HAVE_LIBGLUT */ + +/* Define if OpenGL seems to work */ +/* #undef HAVE_OPENGL */ + +/* Define if you use poppler */ +/* #undef HAVE_POPPLER */ + +/* Define to 1 if you have the `poppler' library (-lpoppler). */ +/* #undef HAVE_LIBPOPPLER */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OUTPUTDEV_H */ + +/* Define if you have the jpeg library (-ljpeg). */ +#define HAVE_LIBJPEG 1 + +/* Define if you have the pdf library (-lpdf). */ +/* #undef HAVE_LIBPDF */ + +/* Define if you have the zzip library (-lzzip). */ +#define HAVE_LIBZZIP 1 + +/* Define if you have the m library (-lm). */ +#define HAVE_LIBM 1 + +/* Define if you have the t1 library (-lt1). */ +/* #undef HAVE_LIBT1 */ + +/* Define if you have the z library (-lz). */ +#define HAVE_LIBZ 1 + +/* Name of package */ +#define PACKAGE "swftools" + +/* Version number of package */ +#define VERSION "2011-01-23-1815" + +/* Typedefs */ +#define boolean int + +/* use gzip/uncompress */ +#define USE_GZIP 1 + +/* let ttf2pt1 use libfreetype */ +#define USE_FREETYPE 1 + +/* have/use freetype library */ +#define HAVE_FREETYPE 1 +#define HAVE_FREETYPE_FREETYPE_H 1 + +/* have/use freetype library */ +/* #undef HAVE_AVIFILE */ + +#define HAVE_FONTCONFIG_H 1 +#define HAVE_FONTCONFIG 1 + +/* #undef HAVE_FFTW3_H */ + +/* #undef HAVE_FFTW3 */ + +/* have/use internal l.a.m.e. mp3 library */ +/* #undef HAVE_LAME */ + +/* whether python-imaging was found */ +/* #undef HAVE_PYTHON_IMAGING */ + +/* system() can handle command substitution */ +#define SYSTEM_BACKTICKS 1 + +/* Define to 1 if this machine has network byte order*/ +/* #undef WORDS_BIGENDIAN */ + +/* #undef LOWERCASE_UPPERCASE */ + +/* Define to 0 on non-windows systems */ +#define O_BINARY 0 + +#ifdef HAVE_ZLIB_H +#ifdef HAVE_LIBZ +#define HAVE_ZLIB +#endif +#endif + +#ifdef HAVE_JPEGLIB_H +#ifdef HAVE_LIBJPEG +#define HAVE_JPEGLIB +#endif +#endif + +#ifdef HAVE_FT2BUILD_H +#define HAVE_FREETYPE_H 1 +#endif + +/* #ifdef HAVE_T1LIB_H */ +/* #ifdef HAVE_LIBT1 */ +/* #define HAVE_T1LIB */ +/* #endif */ +/* #endif */ + +#ifdef HAVE_GL_GL_H +#ifdef HAVE_GL_GLUT_H +#ifdef HAVE_OPENGL +#define USE_OPENGL +#endif +#endif +#endif + +#ifdef HAVE_POPPLER +#define GString GooString +#define GHash GooHash +#endif + +#ifdef HAVE_ZZIP_LIB_H +#ifdef HAVE_LIBZZIP +#define HAVE_ZZIP 1 +#endif +#endif + +#ifndef WIN32 +#define CHECKS +#endif + +// supply a substitute calloc function if necessary +#ifndef HAVE_CALLOC +#define calloc rfx_calloc_replacement +#endif + +//#ifdef HAVE_BUILTIN_EXPECT +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +# define likely(x) __builtin_expect((x), 1) +# define unlikely(x) __builtin_expect((x), 0) +#else +# define likely(x) (x) +# define unlikely(x) (x) +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/config.h.in b/fluidbook/tools/swftools-special-swfdump/config.h.in new file mode 100644 index 000000000..60bf3227f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/config.h.in @@ -0,0 +1,298 @@ +#ifndef __config_h__ +#define __config_h__ + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `long' if doesn't define. */ +#undef off_t + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +#undef SIZEOF_SIGNED_CHAR +#undef SIZEOF_SIGNED_SHORT +#undef SIZEOF_SIGNED +#undef SIZEOF_SIGNED_LONG_LONG +#undef SIZEOF_VOIDP + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if your declares struct tm. */ +#undef TM_IN_SYS_TIME + +/* Define if you have the time() function */ +#undef HAVE_TIME + +/* Define if you have the time.h header file */ +#undef HAVE_TIME_H + +/* Define if you have the sys/time.h header file */ +#undef HAVE_SYS_TIME_H + +/* Define if you have the sys/resource.h header file */ +#undef HAVE_SYS_RESOURCE_H + +/* Define if you have the malloc.h header file */ +#undef HAVE_MALLOC_H + +/* Define if you have the getrusage function */ +#undef HAVE_GETRUSAGE + +/* Define if you have the mallinfo function */ +#undef HAVE_MALLINFO + + +/* Define if you have the unistd.h header file */ +#undef HAVE_UNISTD_H + +/* for gocr */ +#undef HAVE_WCHAR_H +#undef HAVE_WCSCHR +#undef HAVE_WCSDUP + +/* Define if you have the open64 function. */ +#undef HAVE_OPEN64 + +/* Define if you have the lrand48 function. */ +#undef HAVE_LRAND48 + +/* Define if you have the mkstemp function. */ +#undef HAVE_MKSTEMP + +/* Define if you have the popen function. */ +#undef HAVE_POPEN + +/* Define if you have the bcopy function. */ +#undef HAVE_BCOPY + +/* Define if you have the bzero function. */ +#undef HAVE_BZERO + +/* Define if you have the rand function. */ +#undef HAVE_RAND + +/* Define if you have the srand function. */ +#undef HAVE_SRAND + +/* Define if you have the srand48 function. */ +#undef HAVE_SRAND48 + +/* Define if you have the calloc function. */ +#undef HAVE_CALLOC + +/* Define if you have the stat function. */ +#undef HAVE_STAT + +/* Define if you have the mmap function. */ +#undef HAVE_MMAP + +/* Define if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the header file. */ +#undef HAVE_ASSERT_H + +/* Define if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define if you have the header file. */ +#undef HAVE_JPEGLIB_H + +/* Define if you have the header file. */ +#undef HAVE_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if you have the header file. */ +#undef HAVE_IO_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_BSDTYPES_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define if you have the header file. */ +/* #undef HAVE_T1LIB_H */ + +/* Define if you have the header file. */ +#undef HAVE_ZLIB_H + +/* Define if you have the header file. */ +#undef HAVE_ZZIP_LIB_H + +/* Define if you have the header file. */ +#undef HAVE_PDFLIB_H + +/* Define if you have the header file. */ +#undef HAVE_AVIFILE_VERSION_H + +/* Define if you have the header file. */ +#undef HAVE_FT2BUILD_H + +/* Define if you have the header file. */ +#undef HAVE_VERSION_H + +/* Define if you have the OpenGL header files */ +#undef HAVE_GL_GL_H +#undef HAVE_GL_GLUT_H + +/* Define if you have the OpenGL libraries */ +#undef HAVE_LIBGL +#undef HAVE_LIBGLU +#undef HAVE_LIBGLUT + +/* Define if OpenGL seems to work */ +#undef HAVE_OPENGL + +/* Define if you use poppler */ +#undef HAVE_POPPLER + +/* Define to 1 if you have the `poppler' library (-lpoppler). */ +#undef HAVE_LIBPOPPLER + +/* Define to 1 if you have the header file. */ +#undef HAVE_OUTPUTDEV_H + +/* Define if you have the jpeg library (-ljpeg). */ +#undef HAVE_LIBJPEG + +/* Define if you have the pdf library (-lpdf). */ +#undef HAVE_LIBPDF + +/* Define if you have the zzip library (-lzzip). */ +#undef HAVE_LIBZZIP + +/* Define if you have the m library (-lm). */ +#undef HAVE_LIBM + +/* Define if you have the t1 library (-lt1). */ +/* #undef HAVE_LIBT1 */ + +/* Define if you have the z library (-lz). */ +#undef HAVE_LIBZ + +/* Name of package */ +#undef PACKAGE + +/* Version number of package */ +#undef VERSION + +/* Typedefs */ +#undef boolean + +/* use gzip/uncompress */ +#undef USE_GZIP + +/* let ttf2pt1 use libfreetype */ +#undef USE_FREETYPE + +/* have/use freetype library */ +#undef HAVE_FREETYPE +#undef HAVE_FREETYPE_FREETYPE_H + +/* have/use freetype library */ +#undef HAVE_AVIFILE + +#undef HAVE_FONTCONFIG_H +#undef HAVE_FONTCONFIG + +#undef HAVE_FFTW3_H + +#undef HAVE_FFTW3 + +/* have/use internal l.a.m.e. mp3 library */ +#undef HAVE_LAME + +/* whether python-imaging was found */ +#undef HAVE_PYTHON_IMAGING + +/* system() can handle command substitution */ +#undef SYSTEM_BACKTICKS + +/* Define to 1 if this machine has network byte order*/ +#undef WORDS_BIGENDIAN + +#undef LOWERCASE_UPPERCASE + +/* Define to 0 on non-windows systems */ +#undef O_BINARY + +#ifdef HAVE_ZLIB_H +#ifdef HAVE_LIBZ +#define HAVE_ZLIB +#endif +#endif + +#ifdef HAVE_JPEGLIB_H +#ifdef HAVE_LIBJPEG +#define HAVE_JPEGLIB +#endif +#endif + +#ifdef HAVE_FT2BUILD_H +#define HAVE_FREETYPE_H 1 +#endif + +/* #ifdef HAVE_T1LIB_H */ +/* #ifdef HAVE_LIBT1 */ +/* #define HAVE_T1LIB */ +/* #endif */ +/* #endif */ + +#ifdef HAVE_GL_GL_H +#ifdef HAVE_GL_GLUT_H +#ifdef HAVE_OPENGL +#define USE_OPENGL +#endif +#endif +#endif + +#ifdef HAVE_POPPLER +#define GString GooString +#define GHash GooHash +#endif + +#ifdef HAVE_ZZIP_LIB_H +#ifdef HAVE_LIBZZIP +#define HAVE_ZZIP 1 +#endif +#endif + +#ifndef WIN32 +#define CHECKS +#endif + +// supply a substitute calloc function if necessary +#ifndef HAVE_CALLOC +#define calloc rfx_calloc_replacement +#endif + +//#ifdef HAVE_BUILTIN_EXPECT +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +# define likely(x) __builtin_expect((x), 1) +# define unlikely(x) __builtin_expect((x), 0) +#else +# define likely(x) (x) +# define unlikely(x) (x) +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/config.log b/fluidbook/tools/swftools-special-swfdump/config.log new file mode 100644 index 000000000..1d33930f0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/config.log @@ -0,0 +1,2805 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ ./configure --prefix=/usr/local/swftools/special-swfdump + +## --------- ## +## Platform. ## +## --------- ## + +hostname = ks308520.kimsufi.com +uname -m = x86_64 +uname -r = 2.6.31.5-grsec-xxxx-grs-ipv4-64 +uname -s = Linux +uname -v = #2 SMP Thu Nov 5 12:36:20 UTC 2009 + +/usr/bin/uname -p = Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz +/bin/uname -X = unknown + +/bin/arch = x86_64 +/usr/bin/arch -k = x86_64 +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /opt/bin +PATH: /usr/x86_64-pc-linux-gnu/mingw32/gcc-bin/4.4.2 +PATH: /usr/x86_64-pc-linux-gnu/gcc-bin/3.4.6 + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2735: checking build system type +configure:2749: result: x86_64-unknown-linux-gnu +configure:2769: checking host system type +configure:2782: result: x86_64-unknown-linux-gnu +configure:2875: checking for gcc +configure:2891: found /usr/bin/gcc +configure:2902: result: gcc +configure:3131: checking for C compiler version +configure:3140: gcc --version >&5 +gcc (GCC) 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) +Copyright (C) 2006 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. + +configure:3151: $? = 0 +configure:3140: gcc -v >&5 +Reading specs from /usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/specs +Configured with: /home/var/tmp/portage/sys-devel/gcc-3.4.6-r2/work/gcc-3.4.6/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/3.4.6 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include/g++-v3 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-languages=c,c++,java,treelang,f77 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu +Thread model: posix +gcc version 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) +configure:3151: $? = 0 +configure:3140: gcc -V >&5 +gcc: `-V' option must have argument +configure:3151: $? = 1 +configure:3140: gcc -qversion >&5 +gcc: unrecognized option `-qversion' +gcc: no input files +configure:3151: $? = 1 +configure:3171: checking whether the C compiler works +configure:3193: gcc -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 +configure:3197: $? = 0 +configure:3245: result: yes +configure:3248: checking for C compiler default output file name +configure:3250: result: a.out +configure:3256: checking for suffix of executables +configure:3263: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 +configure:3267: $? = 0 +configure:3289: result: +configure:3311: checking whether we are cross compiling +configure:3319: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 +configure:3323: $? = 0 +configure:3330: ./conftest +configure:3334: $? = 0 +configure:3349: result: no +configure:3354: checking for suffix of object files +configure:3376: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 +configure:3380: $? = 0 +configure:3401: result: o +configure:3405: checking whether we are using the GNU C compiler +configure:3424: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 +configure:3424: $? = 0 +configure:3433: result: yes +configure:3442: checking whether gcc accepts -g +configure:3462: gcc -c -g conftest.c >&5 +configure:3462: $? = 0 +configure:3503: result: yes +configure:3520: checking for gcc option to accept ISO C89 +configure:3584: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 +configure:3584: $? = 0 +configure:3597: result: none needed +configure:3675: checking for g++ +configure:3691: found /usr/bin/g++ +configure:3702: result: g++ +configure:3729: checking for C++ compiler version +configure:3738: g++ --version >&5 +g++ (GCC) 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) +Copyright (C) 2006 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. + +configure:3749: $? = 0 +configure:3738: g++ -v >&5 +Reading specs from /usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/specs +Configured with: /home/var/tmp/portage/sys-devel/gcc-3.4.6-r2/work/gcc-3.4.6/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/3.4.6 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include/g++-v3 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-languages=c,c++,java,treelang,f77 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu +Thread model: posix +gcc version 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) +configure:3749: $? = 0 +configure:3738: g++ -V >&5 +g++: `-V' option must have argument +configure:3749: $? = 1 +configure:3738: g++ -qversion >&5 +g++: unrecognized option `-qversion' +g++: no input files +configure:3749: $? = 1 +configure:3753: checking whether we are using the GNU C++ compiler +configure:3772: g++ -c -fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.cpp >&5 +configure:3772: $? = 0 +configure:3781: result: yes +configure:3790: checking whether g++ accepts -g +configure:3810: g++ -c -g conftest.cpp >&5 +configure:3810: $? = 0 +configure:3851: result: yes +configure:3877: checking whether gcc supports lazy variable declaration +gcc.2.95.m4:19: gcc -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -o conftest +configure:3896: result: yes +configure:3936: checking how to run the C preprocessor +configure:3967: gcc -E conftest.c +configure:3967: $? = 0 +configure:3981: gcc -E conftest.c +conftest.c:9:28: ac_nonexistent.h: No such file or directory +configure:3981: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| /* end confdefs.h. */ +| #include +configure:4006: result: gcc -E +configure:4026: gcc -E conftest.c +configure:4026: $? = 0 +configure:4040: gcc -E conftest.c +conftest.c:9:28: ac_nonexistent.h: No such file or directory +configure:4040: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| /* end confdefs.h. */ +| #include +configure:4112: checking for ranlib +configure:4128: found /usr/bin/ranlib +configure:4139: result: ranlib +configure:4161: checking whether make sets $(MAKE) +configure:4183: result: yes +configure:4206: checking for a BSD-compatible install +configure:4274: result: /usr/bin/install -c +configure:4285: checking whether ln -s works +configure:4289: result: yes +configure:4300: checking for gzip +configure:4316: found /bin/gzip +configure:4327: result: gzip +configure:4358: checking for target system +configure:4414: result: +configure:4472: checking for sin in -lm +configure:4497: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lm >&5 +conftest.c:18: warning: conflicting types for built-in function 'sin' +configure:4497: $? = 0 +configure:4506: result: yes +configure:4521: checking for deflate in -lz +configure:4546: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lz -lm >&5 +configure:4546: $? = 0 +configure:4555: result: yes +configure:4577: checking for PDF_open_file in -lpdf +configure:4602: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lpdf -lz -lm >&5 +/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpdf +collect2: ld returned 1 exit status +configure:4602: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| /* 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 PDF_open_file (); +| int +| main () +| { +| return PDF_open_file (); +| ; +| return 0; +| } +configure:4611: result: no +configure:4624: checking for jpeg_write_raw_data in -ljpeg +configure:4649: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -ljpeg -lz -lm >&5 +configure:4649: $? = 0 +configure:4658: result: yes +configure:4671: checking for DGifOpen in -lungif +configure:4696: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lungif -ljpeg -lz -lm >&5 +/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lungif +collect2: ld returned 1 exit status +configure:4696: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| /* 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 DGifOpen (); +| int +| main () +| { +| return DGifOpen (); +| ; +| return 0; +| } +configure:4705: result: no +configure:4720: checking for DGifOpen in -lgif +configure:4745: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lgif -ljpeg -lz -lm >&5 +/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgif +collect2: ld returned 1 exit status +configure:4745: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| /* 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 DGifOpen (); +| int +| main () +| { +| return DGifOpen (); +| ; +| return 0; +| } +configure:4754: result: no +configure:4768: checking for zzip_file_open in -lzzip +configure:4793: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:4793: $? = 0 +configure:4802: result: yes +configure:4816: checking target system type +configure:4829: result: x86_64-unknown-linux-gnu +configure:4856: checking for byte order +configure:4871: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:4871: $? = 0 +configure:4871: ./conftest +configure:4871: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| /* end confdefs.h. */ +| +| int main (int argc, char *argv[]) +| { +| int i = 1; +| return *(char*)&i; +| } +| +configure:4900: result: little endian +configure:4924: checking whether system() can handle command substitution +configure:4939: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:4939: $? = 0 +configure:4939: ./conftest +configure:4939: $? = 0 +configure:4956: result: yes +configure:4986: checking for dirent.h that defines DIR +configure:5005: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5005: $? = 0 +configure:5013: result: yes +configure:5026: checking for library containing opendir +configure:5057: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5057: $? = 0 +configure:5074: result: none required +configure:5142: checking for grep that handles long lines and -e +configure:5200: result: /bin/grep +configure:5205: checking for egrep +configure:5267: result: /bin/grep -E +configure:5272: checking for ANSI C header files +configure:5292: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5292: $? = 0 +configure:5365: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5365: $? = 0 +configure:5365: ./conftest +configure:5365: $? = 0 +configure:5376: result: yes +configure:5390: checking for sys/types.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for sys/stat.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for stdlib.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for string.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for memory.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for strings.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for inttypes.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for stdint.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5390: checking for unistd.h +configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5390: $? = 0 +configure:5390: result: yes +configure:5405: checking zlib.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking zlib.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for zlib.h +configure:5405: result: yes +configure:5405: checking gif_lib.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c:61:21: gif_lib.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:5405: result: no +configure:5405: checking gif_lib.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +conftest.c:28:21: gif_lib.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| /* end confdefs.h. */ +| #include +configure:5405: result: no +configure:5405: checking for gif_lib.h +configure:5405: result: no +configure:5405: checking io.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c:61:16: io.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:5405: result: no +configure:5405: checking io.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +conftest.c:28:16: io.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| /* end confdefs.h. */ +| #include +configure:5405: result: no +configure:5405: checking for io.h +configure:5405: result: no +configure:5405: checking wchar.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking wchar.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for wchar.h +configure:5405: result: yes +configure:5405: checking jpeglib.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking jpeglib.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for jpeglib.h +configure:5405: result: yes +configure:5405: checking assert.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking assert.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for assert.h +configure:5405: result: yes +configure:5405: checking signal.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking signal.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for signal.h +configure:5405: result: yes +configure:5405: checking pthread.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking pthread.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for pthread.h +configure:5405: result: yes +configure:5405: checking for sys/stat.h +configure:5405: result: yes +configure:5405: checking sys/mman.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking sys/mman.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for sys/mman.h +configure:5405: result: yes +configure:5405: checking for sys/types.h +configure:5405: result: yes +configure:5405: checking dirent.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking dirent.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for dirent.h +configure:5405: result: yes +configure:5405: checking sys/bsdtypes.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c:70:26: sys/bsdtypes.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:5405: result: no +configure:5405: checking sys/bsdtypes.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +conftest.c:37:26: sys/bsdtypes.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| /* end confdefs.h. */ +| #include +configure:5405: result: no +configure:5405: checking for sys/bsdtypes.h +configure:5405: result: no +configure:5405: checking sys/ndir.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c:70:22: sys/ndir.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:5405: result: no +configure:5405: checking sys/ndir.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +conftest.c:37:22: sys/ndir.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| /* end confdefs.h. */ +| #include +configure:5405: result: no +configure:5405: checking for sys/ndir.h +configure:5405: result: no +configure:5405: checking sys/dir.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking sys/dir.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for sys/dir.h +configure:5405: result: yes +configure:5405: checking ndir.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c:71:18: ndir.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:5405: result: no +configure:5405: checking ndir.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +conftest.c:38:18: ndir.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| /* end confdefs.h. */ +| #include +configure:5405: result: no +configure:5405: checking for ndir.h +configure:5405: result: no +configure:5405: checking time.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking time.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for time.h +configure:5405: result: yes +configure:5405: checking sys/time.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking sys/time.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for sys/time.h +configure:5405: result: yes +configure:5405: checking sys/resource.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking sys/resource.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for sys/resource.h +configure:5405: result: yes +configure:5405: checking pdflib.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c:74:20: pdflib.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:5405: result: no +configure:5405: checking pdflib.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +conftest.c:41:20: pdflib.h: No such file or directory +configure:5405: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| /* end confdefs.h. */ +| #include +configure:5405: result: no +configure:5405: checking for pdflib.h +configure:5405: result: no +configure:5405: checking zzip/lib.h usability +configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking zzip/lib.h presence +configure:5405: gcc -E -I${prefix}/include conftest.c +configure:5405: $? = 0 +configure:5405: result: yes +configure:5405: checking for zzip/lib.h +configure:5405: result: yes +configure:5432: checking for an ANSI C-conforming const +configure:5497: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5497: $? = 0 +configure:5504: result: yes +configure:5512: checking for inline +configure:5528: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5528: $? = 0 +configure:5536: result: inline +configure:5554: checking for off_t +configure:5554: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5554: $? = 0 +configure:5554: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c: In function `main': +conftest.c:80: error: syntax error before ')' token +configure:5554: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| /* end confdefs.h. */ +| #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 +| int +| main () +| { +| if (sizeof ((off_t))) +| return 0; +| ; +| return 0; +| } +configure:5554: result: yes +configure:5565: checking for size_t +configure:5565: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5565: $? = 0 +configure:5565: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c: In function `main': +conftest.c:80: error: syntax error before ')' token +configure:5565: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| /* end confdefs.h. */ +| #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 +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:5565: result: yes +configure:5576: checking whether struct tm is in sys/time.h or time.h +configure:5596: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +configure:5596: $? = 0 +configure:5603: result: time.h +configure:5611: checking for boolean +configure:5611: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 +conftest.c: In function `main': +conftest.c:80: error: `boolean' undeclared (first use in this function) +conftest.c:80: error: (Each undeclared identifier is reported only once +conftest.c:80: error: for each function it appears in.) +configure:5611: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| /* end confdefs.h. */ +| #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 +| int +| main () +| { +| if (sizeof (boolean)) +| return 0; +| ; +| return 0; +| } +configure:5611: result: no +configure:5625: checking for popen +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for wcschr +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for wcsdup +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for mkstemp +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for stat +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for mmap +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for lrand48 +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for rand +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for srand48 +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for srand +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for bcopy +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +conftest.c:78: warning: conflicting types for built-in function 'bcopy' +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for bzero +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +conftest.c:79: warning: conflicting types for built-in function 'bzero' +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for time +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for getrusage +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for mallinfo +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for open64 +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5625: $? = 0 +configure:5625: result: yes +configure:5625: checking for calloc +configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +conftest.c:84: warning: conflicting types for built-in function 'calloc' +configure:5625: $? = 0 +configure:5625: result: yes +configure:5639: checking size of signed char +configure:5644: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5644: $? = 0 +configure:5644: ./conftest +configure:5644: $? = 0 +configure:5658: result: 1 +configure:5672: checking size of signed short +configure:5677: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5677: $? = 0 +configure:5677: ./conftest +configure:5677: $? = 0 +configure:5691: result: 2 +configure:5705: checking size of signed +configure:5710: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5710: $? = 0 +configure:5710: ./conftest +configure:5710: $? = 0 +configure:5724: result: 4 +configure:5738: checking size of signed long long +configure:5743: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5743: $? = 0 +configure:5743: ./conftest +configure:5743: $? = 0 +configure:5757: result: 8 +configure:5771: checking size of void* +configure:5776: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 +configure:5776: $? = 0 +configure:5776: ./conftest +configure:5776: $? = 0 +configure:5790: result: 8 +configure:5805: checking for freetype-config +configure:5824: found /usr/local/bin/freetype-config +configure:5836: result: /usr/local/bin/freetype-config +configure:5905: checking ft2build.h usability +configure:5905: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include conftest.c >&5 +configure:5905: $? = 0 +configure:5905: result: yes +configure:5905: checking ft2build.h presence +configure:5905: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include conftest.c +configure:5905: $? = 0 +configure:5905: result: yes +configure:5905: checking for ft2build.h +configure:5905: result: yes +configure:5951: checking whether we can compile the freetype test program +freetype.m4:71: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lzzip -ljpeg -lz -lm -L/usr/local/lib -lfreetype -lz -o conftest +configure:6012: result: yes +configure:6048: checking for FcInit in -lfontconfig +configure:6073: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lfontconfig -lzzip -ljpeg -lz -lm -L/usr/local/lib -lfreetype -lz -o conftest +configure:6073: $? = 0 +configure:6082: result: yes +configure:6090: checking fontconfig.h usability +configure:6090: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 +configure:6090: $? = 0 +configure:6090: result: yes +configure:6090: checking fontconfig.h presence +configure:6090: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c +configure:6090: $? = 0 +configure:6090: result: yes +configure:6090: checking for fontconfig.h +configure:6090: result: yes +configure:6109: checking whether we can compile the fontconfig test program +freetype.m4:71: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest +conftest.c: In function `main': +conftest.c:28: warning: passing arg 4 of `FcPatternGetBool' from incompatible pointer type +configure:6157: result: yes +configure:6183: checking for fftwf_plan_dft_r2c_2d in -lfftw3f +configure:6208: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lfftw3f -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest +/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lfftw3f +collect2: ld returned 1 exit status +configure:6208: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| /* 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 fftwf_plan_dft_r2c_2d (); +| int +| main () +| { +| return fftwf_plan_dft_r2c_2d (); +| ; +| return 0; +| } +configure:6217: result: no +configure:6225: checking fftw3.h usability +configure:6225: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 +conftest.c:106:19: fftw3.h: No such file or directory +configure:6225: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:6225: result: no +configure:6225: checking fftw3.h presence +configure:6225: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c +conftest.c:73:19: fftw3.h: No such file or directory +configure:6225: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| /* end confdefs.h. */ +| #include +configure:6225: result: no +configure:6225: checking for fftw3.h +configure:6225: result: no +configure:6313: checking for lame_init in -lmp3lame +configure:6338: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lmp3lame -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest +/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lmp3lame +collect2: ld returned 1 exit status +configure:6338: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| /* 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 lame_init (); +| int +| main () +| { +| return lame_init (); +| ; +| return 0; +| } +configure:6347: result: no +configure:6363: checking lame.h usability +configure:6363: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 +conftest.c:106:18: lame.h: No such file or directory +configure:6363: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:6363: result: no +configure:6363: checking lame.h presence +configure:6363: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c +conftest.c:73:18: lame.h: No such file or directory +configure:6363: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| /* end confdefs.h. */ +| #include +configure:6363: result: no +configure:6363: checking for lame.h +configure:6363: result: no +configure:6611: checking whether the filesystem normalizes file names +configure:6623: result: no +configure:6636: checking for avifile-config +configure:6666: result: no +configure:6696: checking whether we can compile the avifile test program +configure:6805: result: no +configure:6843: checking for ruby +configure:6876: result: no +configure:6888: checking for ruby's include directory +configure:6925: result: 'unknown' +configure:6938: checking ruby.h usability +configure:6938: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 +conftest.c:107:18: ruby.h: No such file or directory +configure:6938: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| #define USE_GZIP 1 +| /* end confdefs.h. */ +| #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 +| #include +configure:6938: result: no +configure:6938: checking ruby.h presence +configure:6938: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c +conftest.c:74:18: ruby.h: No such file or directory +configure:6938: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define LINUX 1 +| #define O_BINARY 0 +| #define HAVE_LIBM 1 +| #define HAVE_LIBZ 1 +| #define HAVE_LIBJPEG 1 +| #define HAVE_LIBZZIP 1 +| #define SYSTEM_BACKTICKS 1 +| #define HAVE_DIRENT_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ZLIB_H 1 +| #define HAVE_WCHAR_H 1 +| #define HAVE_JPEGLIB_H 1 +| #define HAVE_ASSERT_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_SYS_DIR_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_ZZIP_LIB_H 1 +| #define PACKAGE "swftools" +| #define VERSION "2011-01-23-1815" +| #define boolean int +| #define HAVE_POPEN 1 +| #define HAVE_WCSCHR 1 +| #define HAVE_WCSDUP 1 +| #define HAVE_MKSTEMP 1 +| #define HAVE_STAT 1 +| #define HAVE_MMAP 1 +| #define HAVE_LRAND48 1 +| #define HAVE_RAND 1 +| #define HAVE_SRAND48 1 +| #define HAVE_SRAND 1 +| #define HAVE_BCOPY 1 +| #define HAVE_BZERO 1 +| #define HAVE_TIME 1 +| #define HAVE_GETRUSAGE 1 +| #define HAVE_MALLINFO 1 +| #define HAVE_OPEN64 1 +| #define HAVE_CALLOC 1 +| #define SIZEOF_SIGNED_CHAR 1 +| #define SIZEOF_SIGNED_SHORT 2 +| #define SIZEOF_SIGNED 4 +| #define SIZEOF_SIGNED_LONG_LONG 8 +| #define SIZEOF_VOIDP 8 +| #define HAVE_FT2BUILD_H 1 +| #define HAVE_FREETYPE 1 +| #define HAVE_FREETYPE_FREETYPE_H 1 +| #define USE_FREETYPE 1 +| #define HAVE_FONTCONFIG_H 1 +| #define HAVE_FONTCONFIG 1 +| #define USE_GZIP 1 +| /* end confdefs.h. */ +| #include +configure:6938: result: no +configure:6938: checking for ruby.h +configure:6938: result: no +configure:6950: checking whether we should compile the ruby module +configure:6988: result: no +configure:7011: checking for missing libraries +configure:7068: result: ungif gif_lib.h +configure:7074: checking for Python version +configure:7153: result: 2.5 +configure:7157: checking for Python executable +Python 2.5.4 +configure:7162: result: python2.5 +configure:7174: checking whether we can compile the Python test program +python.m4: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I/usr/include/python2.5 conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lpython2.5 -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest +configure:7191: result: yes +configure:7202: checking for Python install path +python2.5 _pypath.py +configure:7214: result: /usr/lib/python2.5/site-packages +configure:7223: checking for Python-Imaging +(didn't find the Python-Imaging libraries) +configure:7255: result: no +configure:7473: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by config.status, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on ks308520.kimsufi.com + +config.status:926: creating Makefile.common +config.status:1029: WARNING: 'Makefile.common.in' seems to ignore the --datarootdir setting +config.status:926: creating Makefile +config.status:926: creating lib/Makefile +config.status:926: creating lib/action/Makefile +config.status:926: creating src/Makefile +config.status:926: creating lib/pdf/Makefile +config.status:926: creating swfs/Makefile +config.status:926: creating lib/python/Makefile +config.status:926: creating lib/readers/Makefile +config.status:926: creating config.h +config.status:1101: config.h is unchanged + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-unknown-linux-gnu +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_c_inline=inline +ac_cv_cxx_compiler_gnu=yes +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXCPP_set= +ac_cv_env_CXXCPP_value= +ac_cv_env_CXXFLAGS_set= +ac_cv_env_CXXFLAGS_value= +ac_cv_env_CXX_set= +ac_cv_env_CXX_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_bcopy=yes +ac_cv_func_bzero=yes +ac_cv_func_calloc=yes +ac_cv_func_getrusage=yes +ac_cv_func_lrand48=yes +ac_cv_func_mallinfo=yes +ac_cv_func_mkstemp=yes +ac_cv_func_mmap=yes +ac_cv_func_open64=yes +ac_cv_func_popen=yes +ac_cv_func_rand=yes +ac_cv_func_srand48=yes +ac_cv_func_srand=yes +ac_cv_func_stat=yes +ac_cv_func_time=yes +ac_cv_func_wcschr=yes +ac_cv_func_wcsdup=yes +ac_cv_header_assert_h=yes +ac_cv_header_dirent_dirent_h=yes +ac_cv_header_dirent_h=yes +ac_cv_header_fftw3_h=no +ac_cv_header_fontconfig_h=yes +ac_cv_header_ft2build_h=yes +ac_cv_header_gif_lib_h=no +ac_cv_header_inttypes_h=yes +ac_cv_header_io_h=no +ac_cv_header_jpeglib_h=yes +ac_cv_header_lame_h=no +ac_cv_header_memory_h=yes +ac_cv_header_ndir_h=no +ac_cv_header_pdflib_h=no +ac_cv_header_pthread_h=yes +ac_cv_header_ruby_h=no +ac_cv_header_signal_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_bsdtypes_h=no +ac_cv_header_sys_dir_h=yes +ac_cv_header_sys_mman_h=yes +ac_cv_header_sys_ndir_h=no +ac_cv_header_sys_resource_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_time_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_time_h=yes +ac_cv_header_unistd_h=yes +ac_cv_header_wchar_h=yes +ac_cv_header_zlib_h=yes +ac_cv_header_zzip_lib_h=yes +ac_cv_host=x86_64-unknown-linux-gnu +ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d=no +ac_cv_lib_fontconfig_FcInit=yes +ac_cv_lib_gif_DGifOpen=no +ac_cv_lib_jpeg_jpeg_write_raw_data=yes +ac_cv_lib_m_sin=yes +ac_cv_lib_mp3lame_lame_init=no +ac_cv_lib_pdf_PDF_open_file=no +ac_cv_lib_ungif_DGifOpen=no +ac_cv_lib_z_deflate=yes +ac_cv_lib_zzip_zzip_file_open=yes +ac_cv_objext=o +ac_cv_path_EGREP='/bin/grep -E' +ac_cv_path_FREETYPE_CONFIG=/usr/local/bin/freetype-config +ac_cv_path_GREP=/bin/grep +ac_cv_path_install='/usr/bin/install -c' +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_UNCOMPRESS=gzip +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_CXX=g++ +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cxx_g=yes +ac_cv_prog_make_make_set=yes +ac_cv_search_opendir='none required' +ac_cv_sizeof_signed=4 +ac_cv_sizeof_signed_char=1 +ac_cv_sizeof_signed_long_long=8 +ac_cv_sizeof_signed_short=2 +ac_cv_sizeof_voidp=8 +ac_cv_struct_tm=time.h +ac_cv_target=x86_64-unknown-linux-gnu +ac_cv_type_boolean=no +ac_cv_type_off_t=yes +ac_cv_type_size_t=yes + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +AR='ar' +AREXT='.a' +AVIFILE_CONFIG='' +CC='gcc' +CFLAGS='-fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer ' +CPP='gcc -E' +CPPFLAGS=' -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig' +CXX='g++' +CXXCPP='' +CXXFLAGS='-fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer ' +CXXLIBS='-lstdc++' +DEFS='-DHAVE_CONFIG_H' +DEVICE_OPENGL='' +DEVICE_PDF='' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/bin/grep -E' +EXEEXT='' +FREETYPE_CONFIG='/usr/local/bin/freetype-config' +GIF2SWF='' +GREP='/bin/grep' +HAVE_PYTHON_IMAGING='' +HAVE_UNISTD_H='' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +JPEG2SWF='jpeg2swf$(E)' +LDFLAGS=' -L/usr/local/lib -L${exec_prefix}/lib' +LIBOBJS='' +LIBPDF='libpdf$(A)' +LIBS='-lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype' +LN_S='ln -s' +LTLIBOBJS='' +OBJEXT='o' +PACKAGE='swftools' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='' +PACKAGE_STRING='' +PACKAGE_TARNAME='' +PACKAGE_URL='' +PACKAGE_VERSION='' +PATH_SEPARATOR=':' +PDF2PDF='' +PDF2SWF='pdf2swf$(E)' +PNG2SWF='png2swf$(E)' +PYTHON_EXECUTABLE='python2.5' +PYTHON_INCLUDES='-I/usr/include/python2.5' +PYTHON_INSTALL_PATH='/usr/lib/python2.5/site-packages' +PYTHON_LIB='-lpython2.5' +RANLIB='ranlib' +RUBY='' +RUBY_CPPFLAGS='' +RUBY_INSTALLDIR='' +RUBY_LDFLAGS='' +RUBY_LIBS='' +SET_MAKE='' +SHARED='-shared' +SHELL='/bin/sh' +SLEXT='so' +STRIP='@echo debug enabled, not stripping ' +SYSTEM_BACKTICKS='1' +UNCOMPRESS='gzip' +USE_GZIP='' +VERSION='2011-01-23-1815' +VIDEO_CFLAGS='' +VIDEO_LIBS='' +WORDS_BIGENDIAN='' +ac_ct_CC='gcc' +ac_ct_CXX='g++' +bindir='${exec_prefix}/bin' +build='x86_64-unknown-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='unknown' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host='x86_64-unknown-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='unknown' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +lame_in_source='' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local/swftools/special-swfdump' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +splash_in_source='$(splash_objects)' +sysconfdir='${prefix}/etc' +target='x86_64-unknown-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='unknown' +xpdf_in_source='$(xpdf_objects)' +xpdf_include=' -I xpdf ' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" +#define PACKAGE_STRING "" +#define PACKAGE_BUGREPORT "" +#define PACKAGE_URL "" +#define LINUX 1 +#define O_BINARY 0 +#define HAVE_LIBM 1 +#define HAVE_LIBZ 1 +#define HAVE_LIBJPEG 1 +#define HAVE_LIBZZIP 1 +#define SYSTEM_BACKTICKS 1 +#define HAVE_DIRENT_H 1 +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_ZLIB_H 1 +#define HAVE_WCHAR_H 1 +#define HAVE_JPEGLIB_H 1 +#define HAVE_ASSERT_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_PTHREAD_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_DIRENT_H 1 +#define HAVE_SYS_DIR_H 1 +#define HAVE_TIME_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_RESOURCE_H 1 +#define HAVE_ZZIP_LIB_H 1 +#define PACKAGE "swftools" +#define VERSION "2011-01-23-1815" +#define boolean int +#define HAVE_POPEN 1 +#define HAVE_WCSCHR 1 +#define HAVE_WCSDUP 1 +#define HAVE_MKSTEMP 1 +#define HAVE_STAT 1 +#define HAVE_MMAP 1 +#define HAVE_LRAND48 1 +#define HAVE_RAND 1 +#define HAVE_SRAND48 1 +#define HAVE_SRAND 1 +#define HAVE_BCOPY 1 +#define HAVE_BZERO 1 +#define HAVE_TIME 1 +#define HAVE_GETRUSAGE 1 +#define HAVE_MALLINFO 1 +#define HAVE_OPEN64 1 +#define HAVE_CALLOC 1 +#define SIZEOF_SIGNED_CHAR 1 +#define SIZEOF_SIGNED_SHORT 2 +#define SIZEOF_SIGNED 4 +#define SIZEOF_SIGNED_LONG_LONG 8 +#define SIZEOF_VOIDP 8 +#define HAVE_FT2BUILD_H 1 +#define HAVE_FREETYPE 1 +#define HAVE_FREETYPE_FREETYPE_H 1 +#define USE_FREETYPE 1 +#define HAVE_FONTCONFIG_H 1 +#define HAVE_FONTCONFIG 1 +#define USE_GZIP 1 + +configure: exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/config.status b/fluidbook/tools/swftools-special-swfdump/config.status new file mode 100644 index 000000000..afe0e1bb1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/config.status @@ -0,0 +1,1121 @@ +#! /bin/sh +# Generated by configure. +# 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-/bin/sh} +export SHELL +## -------------------- ## +## 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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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 + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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. ## +## ----------------------------------- ## +# 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 $as_me, which was +generated by GNU Autoconf 2.68. 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` +" + +# Files that config.status was made for. +config_files=" Makefile.common Makefile lib/Makefile lib/action/Makefile src/Makefile lib/pdf/Makefile swfs/Makefile lib/python/Makefile lib/readers/Makefile" +config_headers=" config.h" + +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 + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +ac_cs_config="'--prefix=/usr/local/swftools/special-swfdump'" +ac_cs_version="\ +config.status +configured by ./configure, generated by GNU Autoconf 2.68, + with options \"$ac_cs_config\" + +Copyright (C) 2010 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='/root/swftools-special-swfdump' +srcdir='.' +INSTALL='/usr/bin/install -c' +test -n "$AWK" || AWK=awk +# 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;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --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 + +if $ac_cs_recheck; then + set X '/bin/sh' './configure' '--prefix=/usr/local/swftools/special-swfdump' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 + CONFIG_SHELL='/bin/sh' + export CONFIG_SHELL + exec "$@" +fi + +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 + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "${FILES}") CONFIG_FILES="$CONFIG_FILES ${FILES}" ;; + + *) 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_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +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" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["PNG2SWF"]="png2swf$(E)" +S["GIF2SWF"]="" +S["JPEG2SWF"]="jpeg2swf$(E)" +S["PDF2PDF"]="" +S["DEVICE_PDF"]="" +S["LIBPDF"]="libpdf$(A)" +S["PDF2SWF"]="pdf2swf$(E)" +S["HAVE_PYTHON_IMAGING"]="" +S["PYTHON_INSTALL_PATH"]="/usr/lib/python2.5/site-packages" +S["PYTHON_INCLUDES"]="-I/usr/include/python2.5" +S["PYTHON_LIB"]="-lpython2.5" +S["PYTHON_EXECUTABLE"]="python2.5" +S["RUBY_INSTALLDIR"]="" +S["RUBY_LDFLAGS"]="" +S["RUBY_CPPFLAGS"]="" +S["RUBY_LIBS"]="" +S["RUBY"]="" +S["USE_GZIP"]="" +S["VIDEO_CFLAGS"]="" +S["VIDEO_LIBS"]="" +S["AVIFILE_CONFIG"]="" +S["xpdf_include"]=" -I xpdf " +S["splash_in_source"]="$(splash_objects)" +S["xpdf_in_source"]="$(xpdf_objects)" +S["CXXCPP"]="" +S["lame_in_source"]="" +S["DEVICE_OPENGL"]="" +S["FREETYPE_CONFIG"]="/usr/local/bin/freetype-config" +S["HAVE_UNISTD_H"]="" +S["VERSION"]="2011-01-23-1815" +S["PACKAGE"]="swftools" +S["EGREP"]="/bin/grep -E" +S["GREP"]="/bin/grep" +S["SYSTEM_BACKTICKS"]="1" +S["WORDS_BIGENDIAN"]="" +S["target_os"]="linux-gnu" +S["target_vendor"]="unknown" +S["target_cpu"]="x86_64" +S["target"]="x86_64-unknown-linux-gnu" +S["STRIP"]="@echo debug enabled, not stripping " +S["CXXLIBS"]="-lstdc++" +S["SLEXT"]="so" +S["AR"]="ar" +S["AREXT"]=".a" +S["UNCOMPRESS"]="gzip" +S["LN_S"]="ln -s" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["SET_MAKE"]="" +S["RANLIB"]="ranlib" +S["CPP"]="gcc -E" +S["ac_ct_CXX"]="g++" +S["CXXFLAGS"]="-fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer " +S["CXX"]="g++" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]=" -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig" +S["LDFLAGS"]=" -L/usr/local/lib -L${exec_prefix}/lib" +S["CFLAGS"]="-fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer " +S["CC"]="gcc" +S["SHARED"]="-shared" +S["host_os"]="linux-gnu" +S["host_vendor"]="unknown" +S["host_cpu"]="x86_64" +S["host"]="x86_64-unknown-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="unknown" +S["build_cpu"]="x86_64" +S["build"]="x86_64-unknown-linux-gnu" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="-lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local/swftools/special-swfdump" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="" +S["PACKAGE_BUGREPORT"]="" +S["PACKAGE_STRING"]="" +S["PACKAGE_VERSION"]="" +S["PACKAGE_TARNAME"]="" +S["PACKAGE_NAME"]="" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/sh" +_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 +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 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"\"" +D["PACKAGE_TARNAME"]=" \"\"" +D["PACKAGE_VERSION"]=" \"\"" +D["PACKAGE_STRING"]=" \"\"" +D["PACKAGE_BUGREPORT"]=" \"\"" +D["PACKAGE_URL"]=" \"\"" +D["LINUX"]=" 1" +D["O_BINARY"]=" 0" +D["HAVE_LIBM"]=" 1" +D["HAVE_LIBZ"]=" 1" +D["HAVE_LIBJPEG"]=" 1" +D["HAVE_LIBZZIP"]=" 1" +D["SYSTEM_BACKTICKS"]=" 1" +D["HAVE_DIRENT_H"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_ZLIB_H"]=" 1" +D["HAVE_WCHAR_H"]=" 1" +D["HAVE_JPEGLIB_H"]=" 1" +D["HAVE_ASSERT_H"]=" 1" +D["HAVE_SIGNAL_H"]=" 1" +D["HAVE_PTHREAD_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_SYS_MMAN_H"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_DIRENT_H"]=" 1" +D["HAVE_SYS_DIR_H"]=" 1" +D["HAVE_TIME_H"]=" 1" +D["HAVE_SYS_TIME_H"]=" 1" +D["HAVE_SYS_RESOURCE_H"]=" 1" +D["HAVE_ZZIP_LIB_H"]=" 1" +D["PACKAGE"]=" \"swftools\"" +D["VERSION"]=" \"2011-01-23-1815\"" +D["boolean"]=" int" +D["HAVE_POPEN"]=" 1" +D["HAVE_WCSCHR"]=" 1" +D["HAVE_WCSDUP"]=" 1" +D["HAVE_MKSTEMP"]=" 1" +D["HAVE_STAT"]=" 1" +D["HAVE_MMAP"]=" 1" +D["HAVE_LRAND48"]=" 1" +D["HAVE_RAND"]=" 1" +D["HAVE_SRAND48"]=" 1" +D["HAVE_SRAND"]=" 1" +D["HAVE_BCOPY"]=" 1" +D["HAVE_BZERO"]=" 1" +D["HAVE_TIME"]=" 1" +D["HAVE_GETRUSAGE"]=" 1" +D["HAVE_MALLINFO"]=" 1" +D["HAVE_OPEN64"]=" 1" +D["HAVE_CALLOC"]=" 1" +D["SIZEOF_SIGNED_CHAR"]=" 1" +D["SIZEOF_SIGNED_SHORT"]=" 2" +D["SIZEOF_SIGNED"]=" 4" +D["SIZEOF_SIGNED_LONG_LONG"]=" 8" +D["SIZEOF_VOIDP"]=" 8" +D["HAVE_FT2BUILD_H"]=" 1" +D["HAVE_FREETYPE"]=" 1" +D["HAVE_FREETYPE_FREETYPE_H"]=" 1" +D["USE_FREETYPE"]=" 1" +D["HAVE_FONTCONFIG_H"]=" 1" +D["HAVE_FONTCONFIG"]=" 1" +D["USE_GZIP"]=" 1" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { + line = $ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +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 +# 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;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +} + +: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 +$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 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/config.sub b/fluidbook/tools/swftools-special-swfdump/config.sub new file mode 100644 index 000000000..ba16ebf55 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/config.sub @@ -0,0 +1,1676 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-01-16' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + 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) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx | dvp \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-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-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | 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-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-*) + ;; + # 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 + ;; + 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 + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + 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) + 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 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsEE* | ee | ps2) + basic_machine=mips64r5900el-scei + case $os in + -linux*) + ;; + *) + os=-elf + ;; + esac + ;; + iop) + basic_machine=mipsel-scei + os=-irx + ;; + dvp) + basic_machine=dvp-scei + os=-elf + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + 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 + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + 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 + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-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[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. + -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* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -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 + ;; + # 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 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -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: diff --git a/fluidbook/tools/swftools-special-swfdump/configure b/fluidbook/tools/swftools-special-swfdump/configure new file mode 100644 index 000000000..59ffec68e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/configure @@ -0,0 +1,8672 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 + +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" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # 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 + export CONFIG_SHELL + 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+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_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; } + + # 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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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 + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="src/" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +PNG2SWF +GIF2SWF +JPEG2SWF +PDF2PDF +DEVICE_PDF +LIBPDF +PDF2SWF +HAVE_PYTHON_IMAGING +PYTHON_INSTALL_PATH +PYTHON_INCLUDES +PYTHON_LIB +PYTHON_EXECUTABLE +RUBY_INSTALLDIR +RUBY_LDFLAGS +RUBY_CPPFLAGS +RUBY_LIBS +RUBY +USE_GZIP +VIDEO_CFLAGS +VIDEO_LIBS +AVIFILE_CONFIG +xpdf_include +splash_in_source +xpdf_in_source +CXXCPP +lame_in_source +DEVICE_OPENGL +FREETYPE_CONFIG +HAVE_UNISTD_H +VERSION +PACKAGE +EGREP +GREP +SYSTEM_BACKTICKS +WORDS_BIGENDIAN +target_os +target_vendor +target_cpu +target +STRIP +CXXLIBS +SLEXT +AR +AREXT +UNCOMPRESS +LN_S +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +SET_MAKE +RANLIB +CPP +ac_ct_CXX +CXXFLAGS +CXX +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +SHARED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_checkmem +enable_debug +enable_profiling +enable_warnings +enable_optimizations +enable_poppler +enable_lame +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP' + + +# 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}' +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 + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + 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 this package 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/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + 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-checkmem turn on ccmalloc debugging + --enable-debug turn on debugging + --enable-profiling turn on profiling + --enable-warnings turn on compiler warnings + --enable-optimizations turn on compiler optimizations (recommended for avi2swf) + --enable-poppler link againist libpoppler + --disable-lame "don't compile any L.A.M.E. mp3 encoding code in" + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_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 || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &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_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;} + ;; +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 + +# 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 || + $as_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 +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 $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +# ------------------- option parsing ------------------------------- + +DEBUG= +CHECKMEM= +PROFILING= +ENABLE_WARNINGS= +OPTIMIZE= +USE_POPPLER= +DISABLE_LAME= + +# Check whether --enable-checkmem was given. +if test "${enable_checkmem+set}" = set; then : + enableval=$enable_checkmem; CHECKMEM=true +fi + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; DEBUG=true +fi + +# Check whether --enable-profiling was given. +if test "${enable_profiling+set}" = set; then : + enableval=$enable_profiling; PROFILING=true +fi + +# Check whether --enable-warnings was given. +if test "${enable_warnings+set}" = set; then : + enableval=$enable_warnings; ENABLE_WARNINGS=true +fi + +# Check whether --enable-optimizations was given. +if test "${enable_optimizations+set}" = set; then : + enableval=$enable_optimizations; OPTIMIZE=true +fi + +# Check whether --enable-poppler was given. +if test "${enable_poppler+set}" = set; then : + enableval=$enable_poppler; USE_POPPLER=true +fi + +# Check whether --enable-lame was given. +if test "${enable_lame+set}" = set; then : + enableval=$enable_lame; if test "x$enable_lame" = "xno";then + DISABLE_LAME=yes +fi +else + DISABLE_LAME= +fi + + +PACKAGE=swftools +VERSION=2011-01-23-1815 + +# ------------------------------------------------------------------ + +if test "x${srcdir}" != "x."; then + echo "--srcdir is not supported" + exit 1 +fi + +WARNINGS="-Wimplicit -Wreturn-type -Wno-write-strings -Wformat" +if test "x$ENABLE_WARNINGS" '!=' "x";then + WARNINGS="-Wall -Wno-unused -Wno-format -Wno-redundant-decls -Wno-write-strings -D_FORTIFY_SOURCE=2 " +fi + +if test "x$CHECKMEM" '!=' "x";then + DEBUG=yes +fi +if test "x$PROFILING" '!=' "x";then + DEBUG=yes +fi +if test "x$DEBUG" '!=' "x";then + if test "x$PROFILING" = "x";then + CFLAGS="$WARNINGS -O2 -g $CFLAGS" + CXXFLAGS="$WARNINGS -O2 -g $CXXFLAGS" + LDFLAGS="-g $LDFLAGS" + else + CFLAGS="$WARNINGS -O2 -g -pg $CFLAGS" + CXXFLAGS="$WARNINGS -O2 -g -pg $CXXFLAGS" + LDFLAGS="-g -pg $LDFLAGS" + fi +else if test "x$OPTIMIZE" '!=' "x"; then + CFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CFLAGS" + CXXFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CXXFLAGS" +else + CFLAGS="$WARNINGS -O -fomit-frame-pointer $CFLAGS" + CXXFLAGS="$WARNINGS -O -fomit-frame-pointer $CXXFLAGS" +fi +fi + +CFLAGS="-fPIC $CFLAGS" +CXXFLAGS="-fPIC $CFLAGS" + +#OLDGCC=1 +#if test "x$OLDGCC" '!=' "x";then +# #CFLAGS="$CFLAGS --std=c89 -ansi -pendantic" +# #CXXFLAGS="$CXXFLAGS --std=c89 -ansi -pendantic" +# CFLAGS="$CFLAGS -ansi -pendantic" +# CXXFLAGS="$CXXFLAGS -ansi -pendantic" +#fi + +export PACKAGE VERSION CFLAGS CXXFLAGS + + +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. + + +# 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 + + + +SLEXT="so" +SHARED="-shared" +MACOSX= +case $host_os in + *darwin* ) + MACOSX=yes + CFLAGS="$CFLAGS" + CXXFLAGS="$CXXFLAGS -fno-rtti" + SHARED="-bundle" + SLEXT="bundle" + if test -d /opt/local/include && test -d /opt/local/lib; then + CPPFLAGS="${CPPFLAGS} -I/opt/local/include" + LDFLAGS="${LDFLAGS} -L/opt/local/lib" + fi + # Use fink packages if available. + #if test -d /sw/include && test -d /sw/lib; then + # CPPFLAGS="${CPPFLAGS} -I/sw/include" + # LDFLAGS="${LDFLAGS} -L/sw/lib" + #fi + ;; +esac + + + + 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports lazy variable declaration" >&5 +$as_echo_n "checking whether gcc supports lazy variable declaration... " >&6; } + +cat > conftest.c << EOF +#include +#include + +int main (int argc, char*argv) +{ + int a,b; + b=3; + int c; + c=4; + return 0; +} +EOF + +testprog_link='$CC $CPPFLAGS $CFLAGS conftest.c -o conftest${ac_exeext}' +if { (eval echo gcc.2.95.m4:19: \"$testprog_link\") 1>&5; (eval $testprog_link) 2>&5; } && test -s conftest${ac_exeext}; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + GCC_IS_OK=true + export GCC_IS_OK +else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f conftest* + + +if test "x$GCC_IS_OK" '=' "x";then + echo "***************************************************" + echo "* Your gcc is too old to compile this!" + echo "* " + echo "* The last version compileable by this compiler is " + echo "* swftools 0.7.0, which you can download from " + echo "* http://www.swftools.org/swftools-0.7.0.tar.gz " + echo "* ." + echo "* Newer versions require at least gcc 3.0.0 " + echo "***************************************************" + exit 1 +fi + +if test "x$CHECKMEM" '!=' "x";then + CC="ccmalloc $CC" + CXX="ccmalloc $CXX" + #echo running again + #unset ac_cv_prog_CC + #unset ac_cv_prog_CXX + #AC_PROG_CC + #AC_PROG_CXX +fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + if test -n "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + # Find 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 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 + + for ac_prog in gzip uncompress compress +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_UNCOMPRESS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$UNCOMPRESS"; then + ac_cv_prog_UNCOMPRESS="$UNCOMPRESS" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_UNCOMPRESS="$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 +UNCOMPRESS=$ac_cv_prog_UNCOMPRESS +if test -n "$UNCOMPRESS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNCOMPRESS" >&5 +$as_echo "$UNCOMPRESS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$UNCOMPRESS" && break +done + + + +OBJEXT="o" +AREXT=".a" +CXXLIBS="-lstdc++" + + + +if test "x$EXEEXT" = "x.exe";then + OBJEXT="obj" + AREXT=".lib" + CXXLIBS="" +fi + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for target system" >&5 +$as_echo_n "checking for target system... " >&6; } +CYGWIN= +MINGW= +case $host_os in + *cygwin* ) CYGWIN=yes;; + *mingw* ) MINGW=yes;; +esac + +AR=ar +if test "x$MINGW" = "xyes"; then + #fix for the debian distribution of mingw + if test -x "/usr/i586-mingw32msvc/bin/ar";then + AR="/usr/i586-mingw32msvc/bin/ar" + fi + if test -x "/usr/i586-mingw32msvc/bin/ranlib";then + RANLIB="/usr/i586-mingw32msvc/bin/ranlib" + fi + #fix for the gentoo distribution of mingw + if test -x "/opt/xmingw/bin/i386-mingw32msvc-ar";then + AR="/opt/xmingw/bin/i386-mingw32msvc-ar" + fi + if test -x "/opt/xmingw/bin/i386-mingw32msvc-ranlib";then + RANLIB="/opt/xmingw/bin/i386-mingw32msvc-ranlib" + fi + if test -x "/opt/xmingw/bin/i386-mingw32msvc-strip";then + STRIP="/opt/xmingw/bin/i386-mingw32msvc-strip" + fi +fi + + + +if test "x${CYGWIN}" = "xyes"; then + +$as_echo "#define CYGWIN 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cygwin" >&5 +$as_echo "cygwin" >&6; } +else + if test "x${MINGW}" = "xyes"; then + +$as_echo "#define MINGW 1" >>confdefs.h + + WIN32=1 + +$as_echo "#define WIN32 1" >>confdefs.h + + LIBS="$LIBS -lws2_32 -lgdi32" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: mingw" >&5 +$as_echo "mingw" >&6; } + else + LINUX=1 + export LINUX + +$as_echo "#define LINUX 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + fi +fi + + +if test "x${MINGW}" != "xyes"; then + # no mingW + +$as_echo "#define O_BINARY 0" >>confdefs.h + +else + # mingW + SLEXT="dll" + CXXLIBS="" +fi +export SLEXT + + + +# The following tries to make use of includes and libraries in +# /usr/local, too. Notice: A -I/usr/local/include might break +# things (MingW, cross-compiling etc.) in the same way as -I/usr/include, +# especially on systems which link /usr/local to /usr, so it has yet +# to be seen how useful this is. +if test -d /usr/local/lib; then + LDFLAGS="$LDFLAGS -L/usr/local/lib" +fi +if test -d /usr/local/include; then +# Leave that alone. It's causing trouble e.g. with gcc 3.2 on gentoo. +# CPPFLAGS="$CPPFLAGS -I/usr/local/include" + echo > /dev/null +fi +if test "$prefix" != "NONE" -a "$prefix" != "/usr/local" -a "$prefix" != "/usr/local/"; then + # if the user has a special prefix (like /opt), there might also be $prefix/lib + # and $prefix/include, which should be included in our search paths for libraries + # and includes. + LDFLAGS="$LDFLAGS -L${libdir}" + CPPFLAGS="$CPPFLAGS -I${includedir}" + # TODO- test whether gcc still works after this +fi + +#Mac OS: +#LDFLAGS "-L/sw/lib" ; CPPFLAGS "-I/sw/include -I/sw/include/lame" + + +# this must be done after (I believe) AC_PROG_MAKE_SET +if test "x$DEBUG" '!=' "x" -o "x$STRIP" = "x";then + if test "$MACOSX";then + STRIP=dsymutil + else + STRIP="@echo debug enabled, not stripping " + fi + export STRIP + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 +$as_echo_n "checking for sin in -lm... " >&6; } +if ${ac_cv_lib_m_sin+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $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 sin (); +int +main () +{ +return sin (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_sin=yes +else + ac_cv_lib_m_sin=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_m_sin" >&5 +$as_echo "$ac_cv_lib_m_sin" >&6; } +if test "x$ac_cv_lib_m_sin" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +else + echo "Error: Math library not found."; + exit; + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 +$as_echo_n "checking for deflate in -lz... " >&6; } +if ${ac_cv_lib_z_deflate+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $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 deflate (); +int +main () +{ +return deflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_deflate=yes +else + ac_cv_lib_z_deflate=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_z_deflate" >&5 +$as_echo "$ac_cv_lib_z_deflate" >&6; } +if test "x$ac_cv_lib_z_deflate" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZ 1 +_ACEOF + + LIBS="-lz $LIBS" + +else + ZLIBMISSING=true +fi + + +if test "x$ZLIBMISSING" = "xtrue";then + echo + echo "ERROR:" + echo "You need zlib to compile swftools" + echo + exit +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDF_open_file in -lpdf" >&5 +$as_echo_n "checking for PDF_open_file in -lpdf... " >&6; } +if ${ac_cv_lib_pdf_PDF_open_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpdf $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 PDF_open_file (); +int +main () +{ +return PDF_open_file (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pdf_PDF_open_file=yes +else + ac_cv_lib_pdf_PDF_open_file=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_pdf_PDF_open_file" >&5 +$as_echo "$ac_cv_lib_pdf_PDF_open_file" >&6; } +if test "x$ac_cv_lib_pdf_PDF_open_file" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPDF 1 +_ACEOF + + LIBS="-lpdf $LIBS" + +else + PDFLIBMISSING=true +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_write_raw_data in -ljpeg" >&5 +$as_echo_n "checking for jpeg_write_raw_data in -ljpeg... " >&6; } +if ${ac_cv_lib_jpeg_jpeg_write_raw_data+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $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 jpeg_write_raw_data (); +int +main () +{ +return jpeg_write_raw_data (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_jpeg_write_raw_data=yes +else + ac_cv_lib_jpeg_jpeg_write_raw_data=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_jpeg_jpeg_write_raw_data" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_write_raw_data" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_write_raw_data" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBJPEG 1 +_ACEOF + + LIBS="-ljpeg $LIBS" + +else + JPEGLIBMISSING=true +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DGifOpen in -lungif" >&5 +$as_echo_n "checking for DGifOpen in -lungif... " >&6; } +if ${ac_cv_lib_ungif_DGifOpen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lungif $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 DGifOpen (); +int +main () +{ +return DGifOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ungif_DGifOpen=yes +else + ac_cv_lib_ungif_DGifOpen=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_ungif_DGifOpen" >&5 +$as_echo "$ac_cv_lib_ungif_DGifOpen" >&6; } +if test "x$ac_cv_lib_ungif_DGifOpen" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBUNGIF 1 +_ACEOF + + LIBS="-lungif $LIBS" + +else + UNGIFMISSING=true +fi + +if test "$UNGIFMISSING";then + UNGIFMISSING= + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DGifOpen in -lgif" >&5 +$as_echo_n "checking for DGifOpen in -lgif... " >&6; } +if ${ac_cv_lib_gif_DGifOpen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgif $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 DGifOpen (); +int +main () +{ +return DGifOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gif_DGifOpen=yes +else + ac_cv_lib_gif_DGifOpen=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_gif_DGifOpen" >&5 +$as_echo "$ac_cv_lib_gif_DGifOpen" >&6; } +if test "x$ac_cv_lib_gif_DGifOpen" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGIF 1 +_ACEOF + + LIBS="-lgif $LIBS" + +else + UNGIFMISSING=true +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for zzip_file_open in -lzzip" >&5 +$as_echo_n "checking for zzip_file_open in -lzzip... " >&6; } +if ${ac_cv_lib_zzip_zzip_file_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzzip $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 zzip_file_open (); +int +main () +{ +return zzip_file_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_zzip_zzip_file_open=yes +else + ac_cv_lib_zzip_zzip_file_open=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_zzip_zzip_file_open" >&5 +$as_echo "$ac_cv_lib_zzip_zzip_file_open" >&6; } +if test "x$ac_cv_lib_zzip_zzip_file_open" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBZZIP 1 +_ACEOF + + LIBS="-lzzip $LIBS" + +else + ZZIPMISSING=true +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; +esac +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for byte order" >&5 +$as_echo_n "checking for byte order... " >&6; } +if test "$cross_compiling" = yes; then : + CROSSCOMPILE=1 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int main (int argc, char *argv[]) +{ + int i = 1; + return *(char*)&i; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + BIGENDIAN=1 +else + LITTLEENDIAN=1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +export CROSSCOMPILE + +if test "x${CROSSCOMPILE}" = "x1"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: we are cross compiling- trying to guess from system type" >&5 +$as_echo "we are cross compiling- trying to guess from system type" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for byte order, try 2" >&5 +$as_echo_n "checking for byte order, try 2... " >&6; } + case "${target}" in + *86* | *-pc-* ) + LITTLEENDIAN=1 + ;; + *sparc* | *68* | *88k* | *mac* | *Mac* | *sun* | *Sun* | *Amiga* | *amiga* ) + BIGENDIAN=1 + ;; + esac +fi + +export LITTLEENDIAN +if test "x${LITTLEENDIAN}" = "x1"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: little endian" >&5 +$as_echo "little endian" >&6; } +BYTEORDERCHECKOK=1 +fi +export BIGENDIAN +if test "x${BIGENDIAN}" = "x1"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: big endian" >&5 +$as_echo "big endian" >&6; } +BYTEORDERCHECKOK=1 +WORDS_BIGENDIAN=1 +export WORDS_BIGENDIAN + +$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h + +fi +if test "x${BYTEORDERCHECKOK}" != "x1"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } +echo Byte order could not determined. +exit 1 +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system() can handle command substitution" >&5 +$as_echo_n "checking whether system() can handle command substitution... " >&6; } +if test "$cross_compiling" = yes; then : + CROSSCOMPILE=1 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include "stdlib.h" +int main (int argc, char*argv[]) +{ + return system("test `touch config.tmp2`"); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + OK=OK +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test "x${OK}" = "xOK";then + test -f config.tmp2 || OK= +fi + +if test "x${CROSSCOMPILE}" = "x1";then + OK=no; +fi +if test "x${OK}" = "xOK";then +rm -f config.tmp2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +SYSTEM_BACKTICKS=1 +export SYSTEM_BACKTICKS + +$as_echo "#define SYSTEM_BACKTICKS 1" >>confdefs.h + +else +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +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"` + + + ac_config_headers="$ac_config_headers config.h" + + 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_c_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_c_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_c_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 + + +{ $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" + { test -f "$ac_path_GREP" && $as_test_x "$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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + + +for ac_header in zlib.h gif_lib.h io.h wchar.h jpeglib.h assert.h signal.h pthread.h sys/stat.h sys/mman.h sys/types.h dirent.h sys/bsdtypes.h sys/ndir.h sys/dir.h ndir.h time.h sys/time.h sys/resource.h pdflib.h zzip/lib.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" +if test "x$ac_cv_type_off_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + + ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 +$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } +if ${ac_cv_struct_tm+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm tm; + int *p = &tm.tm_sec; + return !p; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_struct_tm=time.h +else + ac_cv_struct_tm=sys/time.h +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 +$as_echo "$ac_cv_struct_tm" >&6; } +if test $ac_cv_struct_tm = sys/time.h; then + +$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h + +fi + + ac_fn_c_check_type "$LINENO" "boolean" "ac_cv_type_boolean" "$ac_includes_default" +if test "x$ac_cv_type_boolean" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define boolean int +_ACEOF + +fi + #needed for jpeglib + for ac_func in popen wcschr wcsdup mkstemp stat mmap lrand48 rand srand48 srand bcopy bzero time getrusage mallinfo open64 calloc +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed char" >&5 +$as_echo_n "checking size of signed char... " >&6; } +if ${ac_cv_sizeof_signed_char+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed char))" "ac_cv_sizeof_signed_char" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_signed_char" = yes; then + { { $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 "cannot compute sizeof (signed char) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_signed_char=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_char" >&5 +$as_echo "$ac_cv_sizeof_signed_char" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIGNED_CHAR $ac_cv_sizeof_signed_char +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed short" >&5 +$as_echo_n "checking size of signed short... " >&6; } +if ${ac_cv_sizeof_signed_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed short))" "ac_cv_sizeof_signed_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_signed_short" = yes; then + { { $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 "cannot compute sizeof (signed short) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_signed_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_short" >&5 +$as_echo "$ac_cv_sizeof_signed_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIGNED_SHORT $ac_cv_sizeof_signed_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed" >&5 +$as_echo_n "checking size of signed... " >&6; } +if ${ac_cv_sizeof_signed+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed))" "ac_cv_sizeof_signed" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_signed" = yes; then + { { $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 "cannot compute sizeof (signed) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_signed=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed" >&5 +$as_echo "$ac_cv_sizeof_signed" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIGNED $ac_cv_sizeof_signed +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed long long" >&5 +$as_echo_n "checking size of signed long long... " >&6; } +if ${ac_cv_sizeof_signed_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed long long))" "ac_cv_sizeof_signed_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_signed_long_long" = yes; then + { { $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 "cannot compute sizeof (signed long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_signed_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_long_long" >&5 +$as_echo "$ac_cv_sizeof_signed_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIGNED_LONG_LONG $ac_cv_sizeof_signed_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 +$as_echo_n "checking size of void*... " >&6; } +if ${ac_cv_sizeof_voidp+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_voidp" = yes; then + { { $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 "cannot compute sizeof (void*) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_voidp=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 +$as_echo "$ac_cv_sizeof_voidp" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOIDP $ac_cv_sizeof_voidp +_ACEOF + + + + + +# Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FREETYPE_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy=""$PATH:/usr/local/bin:/sw/bin:/opt/local/bin"" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG +if test -n "$FREETYPE_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 +$as_echo "$FREETYPE_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +OLDCPPFLAGS="${CPPFLAGS}" +OLDLIBS="${LIBS}" +if test "x${FREETYPE_CONFIG}" '!=' "x"; then + CPPFLAGS="$CPPFLAGS "`$FREETYPE_CONFIG --cflags` +else if test -d /usr/include/freetype2; then + CPPFLAGS="$CPPFLAGS -I/usr/include/freetype2" +else if test -d /usr/local/include/freetype2; then + CPPFLAGS="$CPPFLAGS -I/usr/local/include/freetype2" +fi +fi +fi + +if test "x${FREETYPE_CONFIG}" '=' "x";then + # if we didn't find the freetype-config program, we won't + # know where the libs are expected to be. So just blindly + # try to link against them. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5 +$as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; } +if ${ac_cv_lib_freetype_FT_Init_FreeType+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $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 FT_Init_FreeType (); +int +main () +{ +return FT_Init_FreeType (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_freetype_FT_Init_FreeType=yes +else + ac_cv_lib_freetype_FT_Init_FreeType=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_freetype_FT_Init_FreeType" >&5 +$as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; } +if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = xyes; then : + HAVE_LIB_FREETYPE=1 +fi + +fi + +for ac_header in ft2build.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "ft2build.h" "ac_cv_header_ft2build_h" "$ac_includes_default" +if test "x$ac_cv_header_ft2build_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FT2BUILD_H 1 +_ACEOF + HAVE_FT2BUILD_H=1 +fi + +done + +if test "x${HAVE_FT2BUILD_H}" '=' "x";then + for ac_header in freetype/freetype.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "freetype/freetype.h" "ac_cv_header_freetype_freetype_h" "$ac_includes_default" +if test "x$ac_cv_header_freetype_freetype_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FREETYPE_FREETYPE_H 1 +_ACEOF + HAVE_FREETYPE_FREETYPE_H=1 +fi + +done + +fi + +if test "x${HAVE_LIB_FREETYPE}" '!=' "x" -o \ + "x${FREETYPE_CONFIG}" '!=' "x";then + if test "x${HAVE_FREETYPE_FREETYPE_H}" '!=' "x";then + HAVE_FREETYPE=1 + fi + if test "x${HAVE_FT2BUILD_H}" '!=' "x";then + HAVE_FREETYPE=1 + fi +fi + +if test "x${HAVE_FREETYPE}" = "x1"; then + if test "x${FREETYPE_CONFIG}" '!=' "x"; then + LIBS="$LIBS "`$FREETYPE_CONFIG --libs` + else + LIBS="$LIBS -lfreetype" + fi + + if test "x${HAVE_FT2BUILD_H}" = "x1"; then + HAVE_FT2BUILD_H_DEFINE='#define HAVE_FT2BUILD_H' + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the freetype test program" >&5 +$as_echo_n "checking whether we can compile the freetype test program... " >&6; } + + cat > conftest.c << EOF +$HAVE_FT2BUILD_H_DEFINE + +#ifdef HAVE_FT2BUILD_H +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SIZES_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H +#else +#include +#include +#include +#include +#include +#include +#endif + +int main() +{ + FT_Library ftlibrary; + FT_Face face; + FT_Error error; + FT_ULong charcode; + FT_UInt gindex; + FT_Glyph glyph; + FT_BBox bbox; + FT_Matrix matrix; + FT_UInt i; + char* name = 0; + char italic, bold; + + FT_Init_FreeType(&ftlibrary); + FT_New_Face(ftlibrary, "filename", 0, &face); + i = face->num_glyphs - 1; + italic = face->style_flags&FT_STYLE_FLAG_ITALIC; + bold = face->style_flags&FT_STYLE_FLAG_BOLD; + FT_Get_Postscript_Name(face); + FT_Get_Char_Index(face, 33); + FT_Get_First_Char(face, &i); + FT_Get_Next_Char(face, 33, &i); + if(FT_HAS_GLYPH_NAMES(face)) { + FT_Get_Glyph_Name(face, 33, name, 127); + } + FT_Load_Glyph(face, 33, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE); + FT_Get_Glyph(face->glyph, &glyph); + FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); + FT_Done_Glyph(glyph); + FT_Done_Face(face); + FT_Done_FreeType(ftlibrary); + return 0; +} +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' + if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_FREETYPE 1" >>confdefs.h + + +$as_echo "#define HAVE_FREETYPE_FREETYPE_H 1" >>confdefs.h + + +$as_echo "#define USE_FREETYPE 1" >>confdefs.h + # for ttf2tp1 + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + HAVE_FREETYPE=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + rm -f conftest* +fi + +# if the above didn't work out, reset all changes to the compiler variables. +if test "x${HAVE_FREETYPE}" '!=' "x1"; then + CPPFLAGS=$OLDCPPFLAGS + LIBS=$OLDLIBS +fi + + + +OLDCPPFLAGS="${CPPFLAGS}" +OLDLIBS="${LIBS}" + +if test -d /usr/include/fontconfig; then + CPPFLAGS="$CPPFLAGS -I/usr/include/fontconfig" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FcInit in -lfontconfig" >&5 +$as_echo_n "checking for FcInit in -lfontconfig... " >&6; } +if ${ac_cv_lib_fontconfig_FcInit+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfontconfig $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 FcInit (); +int +main () +{ +return FcInit (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_fontconfig_FcInit=yes +else + ac_cv_lib_fontconfig_FcInit=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_fontconfig_FcInit" >&5 +$as_echo "$ac_cv_lib_fontconfig_FcInit" >&6; } +if test "x$ac_cv_lib_fontconfig_FcInit" = xyes; then : + HAVE_LIB_FONTCONFIG=1 +fi + +for ac_header in fontconfig.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "fontconfig.h" "ac_cv_header_fontconfig_h" "$ac_includes_default" +if test "x$ac_cv_header_fontconfig_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FONTCONFIG_H 1 +_ACEOF + HAVE_FONTCONFIG_H=1 +fi + +done + + +if test "x${HAVE_LIB_FONTCONFIG}" != "x";then +if test "x${HAVE_FONTCONFIG_H}" != "x";then + HAVE_FONTCONFIG=1 +fi +fi + +if test "x${HAVE_FONTCONFIG}" = "x1"; then + LIBS="$LIBS -lfontconfig" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the fontconfig test program" >&5 +$as_echo_n "checking whether we can compile the fontconfig test program... " >&6; } + +if (echo $LIBS | grep lfreetype >/dev/null 2>&1); then + #move freetype library to the end of libraries, otherwise fontconfig + #won't compile. + LIBS=`echo $LIBS | sed -e 's/-lfreetype//g' -e 's/$/ -lfreetype/'` +fi + +cat > conftest.c << EOF +#include +#include + +int main() +{ + FcPattern *pattern, *match; + FcResult result; + FcChar8 *v; + char*s1="abc",*s2="ABC"; + strcasecmp(s1,s2); + FcInit(); + pattern = FcPatternBuild(0, FC_FAMILY, FcTypeString, "", 0); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + + FcConfig*c = FcConfigCreate(); + FcConfigParseAndLoad(c, (FcChar8*)"", 1); + FcConfigBuildFonts(c); + FcConfigSetCurrent(c); + + FcFontSet * set = FcConfigGetFonts(c, FcSetSystem); + FcFontSetDestroy(set); + + FcConfigSubstitute(0, pattern, FcMatchPattern); + FcDefaultSubstitute(pattern); + match = FcFontMatch(0, pattern, &result); + FcPatternGetString(match, "family", 0, &v) == FcResultMatch; + FcPatternGetBool(match, "family", 0, &v) == FcResultMatch; + FcPatternPrint(pattern); + FcPatternDestroy(pattern); + FcPatternDestroy(match); + FcFini(); + return 0; +} +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' + if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_FONTCONFIG 1" >>confdefs.h + + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + HAVE_FONTCONFIG=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + rm -f conftest* +fi + +# if the above didn't work out, reset all changes to the compiler variables. +if test "x${HAVE_FONTCONFIG}" "!=" "x1"; then + CPPFLAGS=$OLDCPPFLAGS + LIBS=$OLDLIBS +fi + + + + OLDCPPFLAGS="${CPPFLAGS}" + OLDLIBS="${LIBS}" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftwf_plan_dft_r2c_2d in -lfftw3f" >&5 +$as_echo_n "checking for fftwf_plan_dft_r2c_2d in -lfftw3f... " >&6; } +if ${ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfftw3f $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 fftwf_plan_dft_r2c_2d (); +int +main () +{ +return fftwf_plan_dft_r2c_2d (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d=yes +else + ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d=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_fftw3f_fftwf_plan_dft_r2c_2d" >&5 +$as_echo "$ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d" >&6; } +if test "x$ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d" = xyes; then : + HAVE_LIBFFTW3=1 +fi + + for ac_header in fftw3.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "fftw3.h" "ac_cv_header_fftw3_h" "$ac_includes_default" +if test "x$ac_cv_header_fftw3_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FFTW3_H 1 +_ACEOF + HAVE_FFTW3_H=1 +fi + +done + + + if test "x${HAVE_LIBFFTW3}" != "x";then + if test "x${HAVE_FFTW3_H}" != "x";then + HAVE_FFTW3=1 + fi + fi + + if test "x${HAVE_FFTW3}" = "x1"; then + LIBS="$LIBS -lfftw3f" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the fftw3 test program" >&5 +$as_echo_n "checking whether we can compile the fftw3 test program... " >&6; } + + cat > conftest.c << EOF + #include + + int main() + { + char*data = fftw_malloc(sizeof(fftwf_complex)*600*800); + fftwf_plan plan = fftwf_plan_dft_2d(600, 800, (fftwf_complex*)data, (fftwf_complex*)data, FFTW_FORWARD, FFTW_ESTIMATE); + plan = fftwf_plan_dft_r2c_2d(600, 800, (float*)data, (fftwf_complex*)data, FFTW_ESTIMATE); + plan = fftwf_plan_dft_c2r_2d(600, 800, (fftwf_complex*)data, (float*)data, FFTW_ESTIMATE); + fftwf_execute(plan); + fftwf_destroy_plan(plan); + } +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' + if { (eval echo fftw3.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_FFTW3 1" >>confdefs.h + + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + HAVE_FFTW3=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + rm -f conftest* + fi + + # if the above didn't work out, reset all changes to the compiler variables. + if test "x${HAVE_FFTW3}" "!=" "x1"; then + CPPFLAGS=$OLDCPPFLAGS + LIBS=$OLDLIBS + fi + + +# RFX_CHECK_OPENGL +# if test "$HAVE_OPENGL";then +# DEVICE_OPENGL='devices/opengl.$(O)' +# AC_SUBST(DEVICE_OPENGL) +# fi + + +lame_in_source= +lame_makefile= +if test "x${DISABLE_LAME}" = "xtrue"; then + echo "*" Disabling lame support... +else + # old lame code at lib/lame + if test -f lib/lame/Makefile.in; then + lame_in_source='$(lame_objects)' + lame_makefile="lib/lame/Makefile" + CPPFLAGS="$CPPFLAGS -Ilame -Ilib/lame" + +$as_echo "#define HAVE_LAME 1" >>confdefs.h + + else + if test -d /usr/include/lame; then + CPPFLAGS="$CPPFLAGS -I /usr/include/lame" + else + if test -d /usr/local/include/lame; then + CPPFLAGS="$CPPFLAGS -I /usr/local/include/lame" + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lame_init in -lmp3lame" >&5 +$as_echo_n "checking for lame_init in -lmp3lame... " >&6; } +if ${ac_cv_lib_mp3lame_lame_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmp3lame $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 lame_init (); +int +main () +{ +return lame_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mp3lame_lame_init=yes +else + ac_cv_lib_mp3lame_lame_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mp3lame_lame_init" >&5 +$as_echo "$ac_cv_lib_mp3lame_lame_init" >&6; } +if test "x$ac_cv_lib_mp3lame_lame_init" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBMP3LAME 1 +_ACEOF + + LIBS="-lmp3lame $LIBS" + +else + NO_LIBMP3LAME=1 +fi + + HASLAMEHEADER= + for ac_header in lame.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "lame.h" "ac_cv_header_lame_h" "$ac_includes_default" +if test "x$ac_cv_header_lame_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LAME_H 1 +_ACEOF + HASLAMEHEADER=1 +fi + +done + + if test "x$NO_LIBMP3LAME" "!=" "x1" -a "x$HASLAMEHEADER" '!=' "x";then + $as_echo "#define HAVE_LAME 1" >>confdefs.h + + fi + fi +fi + + +xpdf_in_source= +splash_in_source= +xpdf_include= + +if test "x$USE_POPPLER" = "xtrue"; then + +$as_echo "#define HAVE_POPPLER 1" >>confdefs.h + + #PKG_CHECK_MODULES([POPPLER],[poppler poppler-splash],,[poppler_pkgconfig=no]) + if test "x$poppler_pkgconfig" = "xno"; 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 + + +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 + + +for ac_header in OutputDev.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "OutputDev.h" "ac_cv_header_OutputDev_h" "$ac_includes_default" +if test "x$ac_cv_header_OutputDev_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_OUTPUTDEV_H 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpoppler" >&5 +$as_echo_n "checking for main in -lpoppler... " >&6; } +if ${ac_cv_lib_poppler_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpoppler $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_poppler_main=yes +else + ac_cv_lib_poppler_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_poppler_main" >&5 +$as_echo "$ac_cv_lib_poppler_main" >&6; } +if test "x$ac_cv_lib_poppler_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPOPPLER 1 +_ACEOF + + LIBS="-lpoppler $LIBS" + +fi + + +else + as_fn_error $? "No poppler library found. This library is required." "$LINENO" 5 +fi + +done + + 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 + + else + CPPFLAGS="$CPPFLAGS $POPPLER_CFLAGS" + LIBS="$LIBS $POPPLER_LIBS" + $as_echo "#define HAVE_POPPLER 1" >>confdefs.h + + fi +else + splash_in_source='$(splash_objects)' + xpdf_in_source='$(xpdf_objects)' + xpdf_include=' -I xpdf ' +fi + + + + + +# ------------------------------------------------------------------ + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the filesystem normalizes file names" >&5 +$as_echo_n "checking whether the filesystem normalizes file names... " >&6; } + +echo test1 > __abcdefghijklmnopqrstuvwxyz.txt +echo test2 > __ABCDEFGHIJKLMNOPQRSTUVWXYZ.txt +if test `cat __abcdefghijklmnopqrstuvwxyz.txt` = "test2";then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define LOWERCASE_UPPERCASE 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +rm -f __abcdefghijklmnopqrstuvwxyz.txt +rm -f __ABCDEFGHIJKLMNOPQRSTUVWXYZ.txt + + + +for ac_prog in avifile-config +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_AVIFILE_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AVIFILE_CONFIG"; then + ac_cv_prog_AVIFILE_CONFIG="$AVIFILE_CONFIG" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AVIFILE_CONFIG="$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 +AVIFILE_CONFIG=$ac_cv_prog_AVIFILE_CONFIG +if test -n "$AVIFILE_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AVIFILE_CONFIG" >&5 +$as_echo "$AVIFILE_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AVIFILE_CONFIG" && break +done + + +if test "x$AVIFILE_CONFIG" '!=' "x";then + OLDCPPFLAGS="$CPPFLAGS" + # temporarily add avifile paths to CPPFLAGS... + CPPFLAGS="$CPPFLAGS $CXXFLAGS "`$AVIFILE_CONFIG --cflags` + for ac_header in avifile/version.h version.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + # ... and reset + CPPFLAGS="$OLDCPPFLAGS" +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the avifile test program" >&5 +$as_echo_n "checking whether we can compile the avifile test program... " >&6; } + +if test "x${ac_cv_header_version_h}" '=' "xyes";then + HAVE_VERSION_H_DEFINE='#define HAVE_VERSION_H' +fi +if test "x${ac_cv_header_avifile_version_h}" '=' "xyes";then + HAVE_AVIFILE_VERSION_H_DEFINE='#define HAVE_AVIFILE_VERSION_H' +fi + +cat > conftest.cpp << EOF + +// hack- we can't yet access the variables in config.h (because it hasn't been generated yet), +// so we have to introduce them this way +$HAVE_VERSION_H_DEFINE +$HAVE_AVIFILE_VERSION_H_DEFINE + +#ifdef HAVE_VERSION_H + #include +#endif +#ifdef HAVE_AVIFILE_VERSION_H + #include +#endif + +#if (AVIFILE_MAJOR_VERSION == 0) && (AVIFILE_MINOR_VERSION>=6) + #include + #include + #include + #include + #include + #define VERSION6 +#else + #include + #include + #include + #define Width width + #define Height height + #define Data data + #define Bpp bpp +#endif + +void test() +{ + IAviReadFile* player; + IAviReadStream* astream; + IAviReadStream* vstream; + player = CreateIAviReadFile(0); + astream = player->GetStream(0, AviStream::Audio); + vstream = player->GetStream(0, AviStream::Video); + vstream -> StartStreaming(); + astream -> StartStreaming(); +#ifndef VERSION6 + MainAVIHeader head; + player->GetFileHeader(&head); + head.dwMicroSecPerFrame; + head.dwTotalFrames; + head.dwStreams; + head.dwWidth; + head.dwHeight; + head.dwMicroSecPerFrame; + astream->GetEndPos(), + astream->GetEndTime()); + player->StreamCount(); +#else + StreamInfo*audioinfo; + StreamInfo*videoinfo; + audioinfo = astream->GetStreamInfo(); + videoinfo = vstream->GetStreamInfo(); + videoinfo->GetVideoWidth(); + videoinfo->GetVideoHeight(); + audioinfo->GetAudioSamplesPerSec(); + videoinfo->GetFps(); +#endif + CImage*img = vstream->GetFrame(); + img->ToRGB(); + img->Data(); + img->Bpp(); + img->Width(); + img->Height(); + WAVEFORMATEX wave; + astream->GetAudioFormatInfo(&wave,0); + uint_t a,b; + astream->ReadFrames(0,0,0,a,b); +} +int main (int argc, char*argv) +{ + return 0; +} +EOF + +if test "x$AVIFILE_CONFIG" '!=' "x";then + AVIFILE_LIBS=`$AVIFILE_CONFIG --libs` + AVIFILE_CFLAGS=`$AVIFILE_CONFIG --cflags` + avifile_link='$CXX $CPPFLAGS $CXXFLAGS $AVIFILE_CFLAGS conftest.cpp $AVIFILE_LIBS -o conftest${ac_exeext}' + if { (eval echo avi2swf.m4:71: \"$avifile_link\") 1>&5; (eval $avifile_link) 2>&5; } && test -s conftest${ac_exeext} && ./conftest${ac_exeext}; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + AVIFILE=true + export AVIFILE + +$as_echo "#define AVIFILE true" >>confdefs.h + + else + echo "configure: failed program was:" >&5 + cat conftest.cpp >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f conftest* + +if test "x${AVIFILE}" = "xtrue"; then + VIDEO_LIBS="$VIDEO_LIBS $AVIFILE_LIBS" + VIDEO_CFLAGS="$VIDEO_CFLAGS $AVIFILE_CFLAGS" + +$as_echo "#define HAVE_AVIFILE 1" >>confdefs.h + +fi + +if test "x${WIN32}" != "x"; then + #AC_CHECK_LIB(avifil32, AVIFileInit,AVIFIL32=true) + #if test "x${AVIFIL32}" != "x"; then + # VIDEO_LIBS="$VIDEO_LIBS -lavifil32" + #fi + VIDEO_LIBS="$VIDEO_LIBS -lavifil32" + AVIFIL32=true +fi + + + +# ------------------------------------------------------------------ + +if test "x${UNCOMPRESS}" = "xgzip"; then + +$as_echo "#define USE_GZIP 1" >>confdefs.h + +fi + + +# ------------------------------------------------------------------ + + +# Extract the first word of "ruby", so it can be a program name with args. +set dummy ruby; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_RUBY+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $RUBY in + [\\/]* | ?:[\\/]*) + ac_cv_path_RUBY="$RUBY" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_RUBY="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +RUBY=$ac_cv_path_RUBY +if test -n "$RUBY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5 +$as_echo "$RUBY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +RUBY_CPPFLAGS="" +RUBY_LDFLAGS="" +RUBY_LIBS="" + +rubylib=ruby18 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby's include directory" >&5 +$as_echo_n "checking for ruby's include directory... " >&6; } +if test "x$RUBY" '!=' "x";then + rubyinc=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "archdir"))' 2>/dev/null` + if test -d $rubyinc;then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rubyinc" >&5 +$as_echo "$rubyinc" >&6; } + + # If we got a sensible archdir, we also ask ruby to supply us with CPPFLAGS + # and LDFLAGS. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby's cpp flags" >&5 +$as_echo_n "checking for ruby's cpp flags... " >&6; } + rubycpp=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "CPPFLAGS"))' 2>/dev/null` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rubycpp" >&5 +$as_echo "$rubycpp" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby's ld flags" >&5 +$as_echo_n "checking for ruby's ld flags... " >&6; } + rubyld=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "LIBRUBYARG_SHARED"))' 2>/dev/null` + rubyld2=`$RUBY -e 'require "rbconfig";v=Config::expand(Config::CONFIG.send("\x5b\x5d", "LIBRUBY_LDSHARED"));puts v.gsub(/^g?cc/,"")' 2>/dev/null` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$rubyld $rubyld2\"" >&5 +$as_echo "\"$rubyld $rubyld2\"" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby library name" >&5 +$as_echo_n "checking for ruby library name... " >&6; } + rubylib=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "RUBY_SO_NAME"))' 2>/dev/null` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rubylib" >&5 +$as_echo "$rubylib" >&6; } + + RUBY_CPPFLAGS="$rubycpp -I$rubyinc $RUBY_CPPFLAGS" + RUBY_LDFLAGS="$rubyld $rubyld2 $RUBY_LDFLAGS" + RUBY_INSTALLDIR="$rubyinc" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 'unknown'" >&5 +$as_echo "'unknown'" >&6; } + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 'unknown'" >&5 +$as_echo "'unknown'" >&6; } +fi + +#OLDLDFLAGS="$LDFLAGS" +#LDFLAGS="$LDFLAGS $RUBY_LDFLAGS" +#AC_CHECK_LIB($rubylib, rb_define_method, HAVE_RUBY_LIB=1,) +#LDFLAGS="$OLDLDFLAGS" + +OLDCPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $RUBY_CPPFLAGS" +for ac_header in ruby.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "ruby.h" "ac_cv_header_ruby_h" "$ac_includes_default" +if test "x$ac_cv_header_ruby_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_RUBY_H 1 +_ACEOF + HAVE_RUBY_H=1 +fi + +done + +CPPFLAGS="$OLDCPPFLAGS" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we should compile the ruby module" >&5 +$as_echo_n "checking whether we should compile the ruby module... " >&6; } +if test "x${HAVE_RUBY_H}" '!=' "x";then + #RUBY_LIBS="$RUBY_LIBS -l$rubylib" + + cat > conftest.c << EOF +#include +static VALUE foobar; +VALUE foobar_set_foo(VALUE module, VALUE _key, VALUE _value) +{ + return Qnil; +} +int Init_foobar() +{ + foobar = rb_define_module("foobar"); + rb_define_module_function(foobar, "set_foo", foobar_set_foo, 2); + return 0; +} +int main() {return 0;} +EOF + ac_link='$CC $SHARED $CPPFLAGS $RUBY_CPPFLAGS $CFLAGS conftest.c $LDFLAGS $RUBY_LDFLAGS $LIBS $RUBY_LIBS -o conftest${SLEXT}' + if { (eval echo ruby.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${SLEXT}; then + RUBY_OK=yes + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + fi + rm -f conftest* +fi + +if test "x${RUBY_OK}" '=' "xyes"; 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" >&5 +$as_echo "no" >&6; } + RUBY_CPPFLAGS="" + RUBY_LDFLAGS="" + RUBY_LIBS="" + RUBY_INSTALLDIR="" +fi + + +if test "x$RUBY_OK" '!=' "xyes";then + if test -d "lib/ruby/";then + echo all install uninstall clean: > lib/ruby/Makefile + fi + # fail silently- the most users won't have any need for the + # ruby interface anyway +else + if test -f "lib/ruby/Makefile.in";then + rubygfx="lib/ruby/Makefile" + fi +fi + +# ------------------------------------------------------------------ + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for missing libraries" >&5 +$as_echo_n "checking for missing libraries... " >&6; } + +if test "x$ZLIBMISSING" = "xtrue";then + MISSINGLIBS="${MISSINGLIBS} zlib" + DISABLEPNG2SWF=true + PARTIAL=true +fi +if test "x$JPEGLIBMISSING" = "xtrue";then + MISSINGLIBS="${MISSINGLIBS} jpeglib" + DISABLEPDF2SWF=true + DISABLEJPEG2SWF=true + PARTIAL=true +fi +if test "x$PDFLIBMISSING" = "xtrue";then + DISABLEPDF2PDF=true; +fi +#if test "x$T1LIBMISSING" = "xtrue";then +# MISSINGLIBS="${MISSINGLIBS} t1lib" +#fi +if test "x$UNGIFMISSING" = "xtrue";then + DISABLEGIF2SWF=true + MISSINGLIBS="${MISSINGLIBS} ungif" + PARTIAL=true +fi + +if test "x${ac_cv_header_pdflib_h}" '!=' "xyes";then + DISABLEPDF2PDF=true; +fi +if test "x${ac_cv_header_jpeglib_h}" '!=' "xyes"; then + DISABLEPDF2SWF=true; + DISABLEJPEG2SWF=true; + MISSINGLIBS="${MISSINGLIBS} jpeglib.h" + PARTIAL=true +fi +if test "x$HAVE_FREETYPE" '!=' "x1"; then + DISABLEPDF2SWF=true; + MISSINGLIBS="${MISSINGLIBS} freetype" + PARTIAL=true +fi +#if test "x${ac_cv_header_t1lib_h}" '!=' "xyes"; then +# MISSINGLIBS="${MISSINGLIBS} t1lib.h" +#fi +if test "x${ac_cv_header_gif_lib_h}" '!=' "xyes"; then + DISABLEGIF2SWF=true + MISSINGLIBS="${MISSINGLIBS} gif_lib.h" + PARTIAL=true +fi +if test "x${ac_cv_header_zlib_h}" '!=' "xyes"; then + DISABLEPNG2SWF=true; + MISSINGLIBS="${MISSINGLIBS} zlib.h" + PARTIAL=true +fi +#if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then +# MISSINGLIBS="${MISSINGLIBS} avifile" +#fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${MISSINGLIBS}" >&5 +$as_echo "${MISSINGLIBS}" >&6; } + +# ------------------------------------------------------------------ + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python version" >&5 +$as_echo_n "checking for Python version... " >&6; } + +if test "x$PYTHON_LIB" '!=' "x" -a "x$PYTHON_INCLUDES" '!=' "x";then + # you can override the python detection by putting PYTHON_LIB + # and PYTHON_INCLUDES into the environment + case "$PYTHON_INCLUDES" in + *python2.4*) PY_VERSION=2.4 + ;; + *python2.5*) PY_VERSION=2.5 + ;; + *python2.6*) PY_VERSION=2.6 + ;; + *python2.7*) PY_VERSION=2.7 + ;; + *python3.0*) PY_VERSION=3.0 + ;; + *python3.1*) PY_VERSION=3.1 + ;; + *python3.2*) PY_VERSION=3.2 + ;; + *python3.3*) PY_VERSION=3.3 + ;; + *) PY_VERSION=unknown + ;; + esac +else + if test "x$PYTHON_LIB" '!=' "x" -o "x$PYTHON_INCLUDES" '!=' "x";then + echo "Set both PYTHON_LIB and PYTHON_INCLUDES, or none at all" + fi + # iterate through version 2.4 to 3.3 + VERSIONS="2.4 2.5 2.6 2.7 3.0 3.1 3.2 3.3" + case "$PYTHON" in + 2*) VERSIONS="2.4 2.5 2.6 2.7 $PYTHON" + ;; + 3*) VERSIONS="3.0 3.1 3.2 3.3 $PYTHON" + ;; + esac + for v in $VERSIONS; do + # Linux + if test -f "/usr/include/python$v/Python.h";then + PY_VERSION=$v + PYTHON_LIB="-lpython$PY_VERSION" + if test -f "/usr/lib/python$v/site-packages/PIL/_imaging.so";then + PYTHON_LIB2="$PYTHON_LIB /usr/lib/python$v/site-packages/PIL/_imaging.so" + HAVE_PYTHON_IMAGING_LIB=1 + else + PYTHON_LIB2="$PYTHON_LIB" + fi + PYTHON_INCLUDES="-I/usr/include/python$PY_VERSION" + # Mac OS X + elif test -f "/Library/Frameworks/Python.framework/Versions/$v/include/python$v/Python.h";then + PY_VERSION=$v + PYTHON_LIB="-framework Python" + if test -f "/Library/Frameworks/Python.framework/Versions/$v/site-packages/PIL/_imaging.so";then + PYTHON_LIB2="$PYTHON_LIB /Library/Python/$v/PIL/_imaging.so" + HAVE_PYTHON_IMAGING_LIB=1 + else + PYTHON_LIB2="$PYTHON_LIB" + fi + PYTHON_INCLUDES="-I/Library/Frameworks/Python.framework/Versions/$v/include/python$v/" + # Mac OS X [Fink]: + elif test "(" -f "/sw/lib/python$v/config/libpython$v.dylib" \ + -o -f "/sw/lib/python$v/config/libpython$v.a" \ + -o -f "/sw/lib/python$v/config/libpython$v.so" \ + ")" \ + -a -f "/sw/include/python$v/Python.h"; then + PY_VERSION=$v + PYTHON_LIB="-L /sw/lib/python$v/config/ -lpython$PY_VERSION /sw/lib/python$v/site-packages/PIL/_imaging.so" + if test -f "/sw/lib/python$v/site-packages/PIL/_imaging.so";then + PYTHON_LIB2="$PYTHON_LIB /sw/lib/python$v/site-packages/PIL/_imaging.so" + HAVE_PYTHON_IMAGING_LIB=1 + else + PYTHON_LIB2="$PYTHON_LIB" + fi + PYTHON_INCLUDES="-I /sw/include/python$v/" + fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY_VERSION" >&5 +$as_echo "$PY_VERSION" >&6; } + +if test "x$PY_VERSION" "!=" "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python executable" >&5 +$as_echo_n "checking for Python executable... " >&6; } + if python$PY_VERSION -V 2>&5;then + PYTHON_EXECUTABLE=python$PY_VERSION + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXECUTABLE" >&5 +$as_echo "$PYTHON_EXECUTABLE" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } + fi +fi + +if test "x$PY_VERSION" "!=" "x" -a "x$PYTHON_EXECUTABLE" "!=" "x"; then + export PYTHON_INCLUDES PYTHON_LIB + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the Python test program" >&5 +$as_echo_n "checking whether we can compile the Python test program... " >&6; } + + cat > conftest.c << EOF +# include + + int main() + { + int ret; + ret = Py_Main(0, 0); + int x; // check also for gcc 2.95.x incompatibilities + return ret; + } +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS $PYTHON_LIB $LIBS -o conftest${ac_exeext}' + if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + PYTHON_OK=yes + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + rm -f conftest* + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python install path" >&5 +$as_echo_n "checking for Python install path... " >&6; } +cat > _pypath.py << EOF +import distutils +import distutils.sysconfig +import sys +sys.stdout.write(distutils.sysconfig.get_python_lib(plat_specific=0,standard_lib=0)) +EOF + echo $PYTHON_EXECUTABLE _pypath.py 1>&5 + if $PYTHON_EXECUTABLE _pypath.py >_pypath.txt 2>&5;then + PYTHON_INSTALL_PATH=`cat _pypath.txt` + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_INSTALL_PATH" >&5 +$as_echo "$PYTHON_INSTALL_PATH" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } + fi + #rm -f _pypath.txt _pypath.py + + if test "x$PYTHON_OK" = "xyes";then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python-Imaging" >&5 +$as_echo_n "checking for Python-Imaging... " >&6; } + cat > conftest.c << EOF +# include +# include + + int main() + { + Py_Main(0, 0); + return 0; + } +EOF + if test "$HAVE_PYTHON_IMAGING_LIB"; then + ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS ${PYTHON_LIB2} $LIBS -o conftest${ac_exeext}' + if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + PYTHON_LIB="${PYTHON_LIB2}" + +$as_echo "#define HAVE_PYTHON_IMAGING 1" >>confdefs.h + + HAVE_PYTHON_IMAGING=yes + export HAVE_PYTHON_IMAGING + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + else + echo "(didn't find the Python-Imaging libraries)" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + fi + rm -f conftest* +fi + + +if test "x$PYTHON_OK" '!=' "xyes" -o "$DISABLEPDF2SWF";then + echo all install uninstall clean: > lib/python/Makefile + # fail silently- the most users won't have any need for the + # python interface anyway +else + pythongfx="lib/python/Makefile" +fi + +# ------------------------------------------------------------------ + +if test "x${MISSINGLIBS}" '!=' "x"; then + echo "***************************************************" + echo "* The following headers/libraries are missing: " ${MISSINGLIBS} +fi + +avi2swf="avi2swf/Makefile" +if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then + #don't whine, avi2swf is outdated anyway + #echo "* Disabling avi2swf tool..." + echo all install uninstall clean: > avi2swf/Makefile + avi2swf= +fi + +pdf2swf_makefile="lib/pdf/Makefile" +PDF2SWF='pdf2swf$(E)' +LIBPDF='libpdf$(A)' + +if test "x${DISABLEPDF2SWF}" = "xtrue"; then + echo "* Disabling pdf2swf tool..." + rm -f lib/pdf/Makefile + echo all install uninstall clean libpdf libgfxpdf: > lib/pdf/Makefile + pdf2swf_makefile="" + PDF2SWF= + LIBPDF= +fi + + + +PDF2PDF='pdf2pdf$(E)' +DEVICE_PDF='devices/pdf.$(O)' +if test "x${DISABLEPDF2PDF}" = "xtrue"; then + #echo "* Disabling pdf2pdf tool..." + PDF2PDF= + DEVICE_PDF= +fi + + + +if test "x${ZLIBMISSING}" = "xtrue"; then + echo + echo "* Warning! Without zlib, you will not be able to read" + echo "* or write compressed Flash MX files!" +fi + +JPEG2SWF='jpeg2swf$(E)' +if test "x${DISABLEJPEG2SWF}" = "xtrue"; then + echo "* Disabling jpeg2swf tool..." + JPEG2SWF= +fi +export JPEG2SWF + + +GIF2SWF='gif2swf$(E)' +if test "x${DISABLEGIF2SWF}" = "xtrue"; then + echo "* Disabling gif2swf tool..." + GIF2SWF= +fi +export GIF2SWF + + +PNG2SWF='png2swf$(E)' +if test "x${DISABLEPNG2SWF}" = "xtrue"; then + echo "* Disabling png2swf tool..." + PNG2SWF= +fi +export PNG2SWF + + +if test "x${MISSINGLIBS}" '!=' "x"; then + if test "x${PARTIAL}" '=' "x"; then + echo "* (never mind)" + fi + echo "***************************************************" +fi + +# ------------------------------------------------------------------ + + + + + +if test -f "release.in"; then release_in="./release"; fi +if test -f "Makefile.new.in"; then mk_in="./Makefile.new"; fi +FILES="$release_in $mk_in Makefile.common ${avi2swf} Makefile lib/Makefile lib/action/Makefile src/Makefile ${pdf2swf_makefile} swfs/Makefile ${pythongfx} ${rubygfx} ${lame_makefile} lib/readers/Makefile" +ac_config_files="$ac_config_files ${FILES}" + +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}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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 + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 $as_me, which was +generated by GNU Autoconf 2.68. 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 + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_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 + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 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' +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;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "${FILES}") CONFIG_FILES="$CONFIG_FILES ${FILES}" ;; + + *) 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_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +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" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +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 +_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 +$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 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + 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 + + + +# +# On development trees, create snapshots of config.status +# +if test -f snapshot -a "x$CHECKMEM" = "x" -a "x$PROFILING" = "x";then + if test "x${MINGW}" = "xyes"; then + echo cp config.status config.status.win32 + cp config.status config.status.win32 + else + if test "x$DEBUG" '=' "x" -a "x$OPTIMIZE" '=' "x";then + echo cp config.status config.status.linux + cp config.status config.status.linux + fi + if test "x$DEBUG" '!=' "x" -a "x$OPTIMIZE" '=' "x";then + echo cp config.status config.status.debug + cp config.status config.status.debug + fi + if test "x$DEBUG" = "x" -a "x$OPTIMIZE" '!=' "x"; then + echo cp config.status config.status.optimize + cp config.status config.status.optimize + fi + fi +fi diff --git a/fluidbook/tools/swftools-special-swfdump/configure.in b/fluidbook/tools/swftools-special-swfdump/configure.in new file mode 100644 index 000000000..c0737510f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/configure.in @@ -0,0 +1,631 @@ +dnl Process this file with autoconf to produce a configure script. + +dnl old autoconf +AC_INIT(src/) + +dnl new autoconf +dnl AC_INIT +dnl AC_CONFIG_SRCDIR([src/]) + +# ------------------- option parsing ------------------------------- + +DEBUG= +CHECKMEM= +PROFILING= +ENABLE_WARNINGS= +OPTIMIZE= +USE_POPPLER= +DISABLE_LAME= + +AC_ARG_ENABLE(checkmem, +[ --enable-checkmem turn on ccmalloc debugging], CHECKMEM=true) +AC_ARG_ENABLE(debug, +[ --enable-debug turn on debugging], DEBUG=true) +AC_ARG_ENABLE(profiling, +[ --enable-profiling turn on profiling], PROFILING=true) +AC_ARG_ENABLE(warnings, +[ --enable-warnings turn on compiler warnings], ENABLE_WARNINGS=true) +AC_ARG_ENABLE(optimizations, +[ --enable-optimizations turn on compiler optimizations (recommended for avi2swf)], OPTIMIZE=true) +AC_ARG_ENABLE(poppler, +[ --enable-poppler link againist libpoppler], USE_POPPLER=true) +AC_ARG_ENABLE(lame, +[ --disable-lame "don't compile any L.A.M.E. mp3 encoding code in"], + +if test "x$enable_lame" = "xno";then + DISABLE_LAME=yes +fi,DISABLE_LAME=) + +PACKAGE=swftools +VERSION=2011-01-23-1815 + +# ------------------------------------------------------------------ + +if test "x${srcdir}" != "x."; then + echo "--srcdir is not supported" + exit 1 +fi + +WARNINGS="-Wimplicit -Wreturn-type -Wno-write-strings -Wformat" +if test "x$ENABLE_WARNINGS" '!=' "x";then + WARNINGS="-Wall -Wno-unused -Wno-format -Wno-redundant-decls -Wno-write-strings -D_FORTIFY_SOURCE=2 " +fi + +if test "x$CHECKMEM" '!=' "x";then + DEBUG=yes +fi +if test "x$PROFILING" '!=' "x";then + DEBUG=yes +fi +if test "x$DEBUG" '!=' "x";then + if test "x$PROFILING" = "x";then + CFLAGS="$WARNINGS -O2 -g $CFLAGS" + CXXFLAGS="$WARNINGS -O2 -g $CXXFLAGS" + LDFLAGS="-g $LDFLAGS" + else + CFLAGS="$WARNINGS -O2 -g -pg $CFLAGS" + CXXFLAGS="$WARNINGS -O2 -g -pg $CXXFLAGS" + LDFLAGS="-g -pg $LDFLAGS" + fi +else if test "x$OPTIMIZE" '!=' "x"; then + CFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CFLAGS" + CXXFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CXXFLAGS" +else + CFLAGS="$WARNINGS -O -fomit-frame-pointer $CFLAGS" + CXXFLAGS="$WARNINGS -O -fomit-frame-pointer $CXXFLAGS" +fi +fi + +CFLAGS="-fPIC $CFLAGS" +CXXFLAGS="-fPIC $CFLAGS" + +#OLDGCC=1 +#if test "x$OLDGCC" '!=' "x";then +# #CFLAGS="$CFLAGS --std=c89 -ansi -pendantic" +# #CXXFLAGS="$CXXFLAGS --std=c89 -ansi -pendantic" +# CFLAGS="$CFLAGS -ansi -pendantic" +# CXXFLAGS="$CXXFLAGS -ansi -pendantic" +#fi + +export PACKAGE VERSION CFLAGS CXXFLAGS + +dnl Checks for programs. + +AC_CANONICAL_HOST + +SLEXT="so" +SHARED="-shared" +MACOSX= +case $host_os in + *darwin* ) + MACOSX=yes + CFLAGS="$CFLAGS" + CXXFLAGS="$CXXFLAGS -fno-rtti" + SHARED="-bundle" + SLEXT="bundle" + if test -d /opt/local/include && test -d /opt/local/lib; then + CPPFLAGS="${CPPFLAGS} -I/opt/local/include" + LDFLAGS="${LDFLAGS} -L/opt/local/lib" + fi + # Use fink packages if available. + #if test -d /sw/include && test -d /sw/lib; then + # CPPFLAGS="${CPPFLAGS} -I/sw/include" + # LDFLAGS="${LDFLAGS} -L/sw/lib" + #fi + ;; +esac + +AC_SUBST(SHARED) + +dnl Checks for programs. + AC_PROG_CC + AC_PROG_CXX + + +RFX_CHECK_OLDGCC + +if test "x$GCC_IS_OK" '=' "x";then + echo "***************************************************" + echo "* Your gcc is too old to compile this!" + echo "* " + echo "* The last version compileable by this compiler is " + echo "* swftools 0.7.0, which you can download from " + echo "* http://www.swftools.org/swftools-0.7.0.tar.gz " + echo "* ." + echo "* Newer versions require at least gcc 3.0.0 " + echo "***************************************************" + exit 1 +fi + +if test "x$CHECKMEM" '!=' "x";then + CC="ccmalloc $CC" + CXX="ccmalloc $CXX" + #echo running again + #unset ac_cv_prog_CC + #unset ac_cv_prog_CXX + #AC_PROG_CC + #AC_PROG_CXX +fi + AC_PROG_CPP + + AC_PROG_RANLIB + AC_PROG_MAKE_SET + AC_PROG_INSTALL + AC_PROG_LN_S + AC_CHECK_PROGS(UNCOMPRESS, gzip uncompress compress, ) + +dnl PKG_PROG_PKG_CONFIG + +dnl Checks for system services +OBJEXT="o" +AREXT=".a" +CXXLIBS="-lstdc++" + +AC_EXEEXT + +if test "x$EXEEXT" = "x.exe";then + OBJEXT="obj" + AREXT=".lib" + CXXLIBS="" +fi +AC_SUBST(OBJEXT) +AC_SUBST(AREXT) + +RFX_CHECK_MING + +if test "x${MINGW}" != "xyes"; then + # no mingW + AC_DEFINE([O_BINARY], [0], [Not defined on mingw]) +else + # mingW + SLEXT="dll" + CXXLIBS="" +fi +export SLEXT +AC_SUBST(SLEXT) +AC_SUBST(CXXLIBS) + +# The following tries to make use of includes and libraries in +# /usr/local, too. Notice: A -I/usr/local/include might break +# things (MingW, cross-compiling etc.) in the same way as -I/usr/include, +# especially on systems which link /usr/local to /usr, so it has yet +# to be seen how useful this is. +if test -d /usr/local/lib; then + LDFLAGS="$LDFLAGS -L/usr/local/lib" +fi +if test -d /usr/local/include; then +# Leave that alone. It's causing trouble e.g. with gcc 3.2 on gentoo. +# CPPFLAGS="$CPPFLAGS -I/usr/local/include" + echo > /dev/null +fi +if test "$prefix" != "NONE" -a "$prefix" != "/usr/local" -a "$prefix" != "/usr/local/"; then + # if the user has a special prefix (like /opt), there might also be $prefix/lib + # and $prefix/include, which should be included in our search paths for libraries + # and includes. + LDFLAGS="$LDFLAGS -L${libdir}" + CPPFLAGS="$CPPFLAGS -I${includedir}" + # TODO- test whether gcc still works after this +fi + +#Mac OS: +#LDFLAGS "-L/sw/lib" ; CPPFLAGS "-I/sw/include -I/sw/include/lame" + + +# this must be done after (I believe) AC_PROG_MAKE_SET +if test "x$DEBUG" '!=' "x" -o "x$STRIP" = "x";then + if test "$MACOSX";then + STRIP=dsymutil + else + STRIP="@echo debug enabled, not stripping " + fi + export STRIP + AC_SUBST(STRIP) +fi + +dnl Checks for libraries. + AC_CHECK_LIB(m, sin,, + echo "Error: Math library not found."; + exit; + ) + AC_CHECK_LIB(z, deflate,, ZLIBMISSING=true) + +if test "x$ZLIBMISSING" = "xtrue";then + echo + echo "ERROR:" + echo "You need zlib to compile swftools" + echo + exit +fi + +AC_CHECK_LIB(pdf, PDF_open_file,, PDFLIBMISSING=true) +AC_CHECK_LIB(jpeg, jpeg_write_raw_data,, JPEGLIBMISSING=true) +AC_CHECK_LIB(ungif, DGifOpen,, UNGIFMISSING=true) +if test "$UNGIFMISSING";then + UNGIFMISSING= + AC_CHECK_LIB(gif, DGifOpen,, UNGIFMISSING=true) +fi +AC_CHECK_LIB(zzip, zzip_file_open,, ZZIPMISSING=true) + +RFX_CHECK_BYTEORDER +AC_SUBST(WORDS_BIGENDIAN) +RFX_CHECK_SYSTEM_BACKTICKS +AC_SUBST(SYSTEM_BACKTICKS) + +AC_ARG_PROGRAM + +dnl Checks for header files. + AC_CONFIG_HEADER(config.h) + AC_HEADER_DIRENT + AC_HEADER_STDC + + AC_CHECK_HEADERS(zlib.h gif_lib.h io.h wchar.h jpeglib.h assert.h signal.h pthread.h sys/stat.h sys/mman.h sys/types.h dirent.h sys/bsdtypes.h sys/ndir.h sys/dir.h ndir.h time.h sys/time.h sys/resource.h pdflib.h zzip/lib.h) + +AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) +AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package]) +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +AC_SUBST(HAVE_UNISTD_H) +AC_SUBST(EXEEXT) + +dnl Checks for typedefs, structures, and compiler characteristics. + AC_C_CONST + AC_C_INLINE + AC_TYPE_OFF_T + AC_TYPE_SIZE_T + AC_STRUCT_TM + AC_CHECK_TYPE(boolean,int) #needed for jpeglib + AC_CHECK_FUNCS(popen wcschr wcsdup mkstemp stat mmap lrand48 rand srand48 srand bcopy bzero time getrusage mallinfo open64 calloc) + +AC_CHECK_SIZEOF([signed char]) +AC_CHECK_SIZEOF([signed short]) +AC_CHECK_SIZEOF([signed]) +AC_CHECK_SIZEOF([signed long long]) +AC_CHECK_SIZEOF([void*]) + +RFX_CHECK_FREETYPE + +RFX_CHECK_FONTCONFIG + +RFX_CHECK_FFTW + +# RFX_CHECK_OPENGL +# if test "$HAVE_OPENGL";then +# DEVICE_OPENGL='devices/opengl.$(O)' +# AC_SUBST(DEVICE_OPENGL) +# fi +AC_SUBST(DEVICE_OPENGL) + +lame_in_source= +lame_makefile= +if test "x${DISABLE_LAME}" = "xtrue"; then + echo "*" Disabling lame support... +else + # old lame code at lib/lame + if test -f lib/lame/Makefile.in; then + lame_in_source='$(lame_objects)' + lame_makefile="lib/lame/Makefile" + CPPFLAGS="$CPPFLAGS -Ilame -Ilib/lame" + AC_DEFINE([HAVE_LAME], [1], [have/use internal l.a.m.e. mp3 library]) + else + if test -d /usr/include/lame; then + CPPFLAGS="$CPPFLAGS -I /usr/include/lame" + else + if test -d /usr/local/include/lame; then + CPPFLAGS="$CPPFLAGS -I /usr/local/include/lame" + fi + fi + AC_CHECK_LIB(mp3lame, lame_init,, NO_LIBMP3LAME=1) + HASLAMEHEADER= + AC_CHECK_HEADERS(lame.h,HASLAMEHEADER=1) + if test "x$NO_LIBMP3LAME" "!=" "x1" -a "x$HASLAMEHEADER" '!=' "x";then + AC_DEFINE([HAVE_LAME], [1]) + fi + fi +fi +AC_SUBST(lame_in_source) + +xpdf_in_source= +splash_in_source= +xpdf_include= + +if test "x$USE_POPPLER" = "xtrue"; then + AC_DEFINE([HAVE_POPPLER],[1],[use poppler]) + #PKG_CHECK_MODULES([POPPLER],[poppler poppler-splash],,[poppler_pkgconfig=no]) + if test "x$poppler_pkgconfig" = "xno"; then + AC_LANG_PUSH([C++]) + AC_CHECK_HEADERS([OutputDev.h],[ + AC_CHECK_LIB([poppler],[main],,[]) + ],[AC_MSG_ERROR([No poppler library found. This library is required.])]) + AC_LANG_POP + else + CPPFLAGS="$CPPFLAGS $POPPLER_CFLAGS" + LIBS="$LIBS $POPPLER_LIBS" + AC_DEFINE([HAVE_POPPLER], [1]) + fi +else + splash_in_source='$(splash_objects)' + xpdf_in_source='$(xpdf_objects)' + xpdf_include=' -I xpdf ' +fi + +AC_SUBST([xpdf_in_source]) +AC_SUBST([splash_in_source]) +AC_SUBST([xpdf_include]) + +# ------------------------------------------------------------------ + +RFX_CHECK_LOWERCASE_UPPERCASE +RFX_CHECK_AVI2SWF +if test "x${AVIFILE}" = "xtrue"; then + VIDEO_LIBS="$VIDEO_LIBS $AVIFILE_LIBS" + VIDEO_CFLAGS="$VIDEO_CFLAGS $AVIFILE_CFLAGS" + AC_DEFINE([HAVE_AVIFILE], [1], [Define if avifile is present]) +fi + +if test "x${WIN32}" != "x"; then + #AC_CHECK_LIB(avifil32, AVIFileInit,AVIFIL32=true) + #if test "x${AVIFIL32}" != "x"; then + # VIDEO_LIBS="$VIDEO_LIBS -lavifil32" + #fi + VIDEO_LIBS="$VIDEO_LIBS -lavifil32" + AVIFIL32=true +fi + +AC_SUBST(VIDEO_LIBS) +AC_SUBST(VIDEO_CFLAGS) +# ------------------------------------------------------------------ + +if test "x${UNCOMPRESS}" = "xgzip"; then + AC_DEFINE([USE_GZIP], [1], [Define if gzip is present]) +fi +AC_SUBST(USE_GZIP) + +# ------------------------------------------------------------------ + +RFX_CHECK_RUBY + +if test "x$RUBY_OK" '!=' "xyes";then + if test -d "lib/ruby/";then + echo all install uninstall clean: > lib/ruby/Makefile + fi + # fail silently- the most users won't have any need for the + # ruby interface anyway +else + if test -f "lib/ruby/Makefile.in";then + rubygfx="lib/ruby/Makefile" + fi +fi + +# ------------------------------------------------------------------ + +AC_MSG_CHECKING([for missing libraries]) + +if test "x$ZLIBMISSING" = "xtrue";then + MISSINGLIBS="${MISSINGLIBS} zlib" + DISABLEPNG2SWF=true + PARTIAL=true +fi +if test "x$JPEGLIBMISSING" = "xtrue";then + MISSINGLIBS="${MISSINGLIBS} jpeglib" + DISABLEPDF2SWF=true + DISABLEJPEG2SWF=true + PARTIAL=true +fi +if test "x$PDFLIBMISSING" = "xtrue";then + DISABLEPDF2PDF=true; +fi +#if test "x$T1LIBMISSING" = "xtrue";then +# MISSINGLIBS="${MISSINGLIBS} t1lib" +#fi +if test "x$UNGIFMISSING" = "xtrue";then + DISABLEGIF2SWF=true + MISSINGLIBS="${MISSINGLIBS} ungif" + PARTIAL=true +fi + +if test "x${ac_cv_header_pdflib_h}" '!=' "xyes";then + DISABLEPDF2PDF=true; +fi +if test "x${ac_cv_header_jpeglib_h}" '!=' "xyes"; then + DISABLEPDF2SWF=true; + DISABLEJPEG2SWF=true; + MISSINGLIBS="${MISSINGLIBS} jpeglib.h" + PARTIAL=true +fi +if test "x$HAVE_FREETYPE" '!=' "x1"; then + DISABLEPDF2SWF=true; + MISSINGLIBS="${MISSINGLIBS} freetype" + PARTIAL=true +fi +#if test "x${ac_cv_header_t1lib_h}" '!=' "xyes"; then +# MISSINGLIBS="${MISSINGLIBS} t1lib.h" +#fi +if test "x${ac_cv_header_gif_lib_h}" '!=' "xyes"; then + DISABLEGIF2SWF=true + MISSINGLIBS="${MISSINGLIBS} gif_lib.h" + PARTIAL=true +fi +if test "x${ac_cv_header_zlib_h}" '!=' "xyes"; then + DISABLEPNG2SWF=true; + MISSINGLIBS="${MISSINGLIBS} zlib.h" + PARTIAL=true +fi +#if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then +# MISSINGLIBS="${MISSINGLIBS} avifile" +#fi + +AC_MSG_RESULT(${MISSINGLIBS}) + +# ------------------------------------------------------------------ + +RFX_CHECK_PYTHON + +if test "x$PYTHON_OK" '!=' "xyes" -o "$DISABLEPDF2SWF";then + echo all install uninstall clean: > lib/python/Makefile + # fail silently- the most users won't have any need for the + # python interface anyway +else + pythongfx="lib/python/Makefile" +fi + +# ------------------------------------------------------------------ + +if test "x${MISSINGLIBS}" '!=' "x"; then + echo "***************************************************" + echo "* The following headers/libraries are missing: " ${MISSINGLIBS} +fi + +avi2swf="avi2swf/Makefile" +if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then + #don't whine, avi2swf is outdated anyway + #echo "* Disabling avi2swf tool..." + echo all install uninstall clean: > avi2swf/Makefile + avi2swf= +fi + +pdf2swf_makefile="lib/pdf/Makefile" +PDF2SWF='pdf2swf$(E)' +LIBPDF='libpdf$(A)' + +if test "x${DISABLEPDF2SWF}" = "xtrue"; then + echo "* Disabling pdf2swf tool..." + rm -f lib/pdf/Makefile + echo all install uninstall clean libpdf libgfxpdf: > lib/pdf/Makefile + pdf2swf_makefile="" + PDF2SWF= + LIBPDF= +fi +AC_SUBST(PDF2SWF) +AC_SUBST(LIBPDF) + +PDF2PDF='pdf2pdf$(E)' +DEVICE_PDF='devices/pdf.$(O)' +if test "x${DISABLEPDF2PDF}" = "xtrue"; then + #echo "* Disabling pdf2pdf tool..." + PDF2PDF= + DEVICE_PDF= +fi +AC_SUBST(DEVICE_PDF) +AC_SUBST(PDF2PDF) + +if test "x${ZLIBMISSING}" = "xtrue"; then + echo + echo "* Warning! Without zlib, you will not be able to read" + echo "* or write compressed Flash MX files!" +fi + +JPEG2SWF='jpeg2swf$(E)' +if test "x${DISABLEJPEG2SWF}" = "xtrue"; then + echo "* Disabling jpeg2swf tool..." + JPEG2SWF= +fi +export JPEG2SWF +AC_SUBST(JPEG2SWF) + +GIF2SWF='gif2swf$(E)' +if test "x${DISABLEGIF2SWF}" = "xtrue"; then + echo "* Disabling gif2swf tool..." + GIF2SWF= +fi +export GIF2SWF +AC_SUBST(GIF2SWF) + +PNG2SWF='png2swf$(E)' +if test "x${DISABLEPNG2SWF}" = "xtrue"; then + echo "* Disabling png2swf tool..." + PNG2SWF= +fi +export PNG2SWF +AC_SUBST(PNG2SWF) + +if test "x${MISSINGLIBS}" '!=' "x"; then + if test "x${PARTIAL}" '=' "x"; then + echo "* (never mind)" + fi + echo "***************************************************" +fi + +# ------------------------------------------------------------------ + +AH_TOP([ +#ifndef __config_h__ +#define __config_h__ +]) + +AH_BOTTOM([ +#ifdef HAVE_ZLIB_H +#ifdef HAVE_LIBZ +#define HAVE_ZLIB +#endif +#endif + +#ifdef HAVE_JPEGLIB_H +#ifdef HAVE_LIBJPEG +#define HAVE_JPEGLIB +#endif +#endif + +#ifdef HAVE_FT2BUILD_H +#define HAVE_FREETYPE_H 1 +#endif + +#ifdef HAVE_GL_GL_H +#ifdef HAVE_GL_GLUT_H +#ifdef HAVE_OPENGL +#define USE_OPENGL +#endif +#endif +#endif + +#ifdef HAVE_POPPLER +#define GString GooString +#define GHash GooHash +#define GHashIter GooHashIter +#endif + +#ifdef HAVE_ZZIP_LIB_H +#ifdef HAVE_LIBZZIP +#define HAVE_ZZIP 1 +#endif +#endif + +// supply a substitute calloc function if necessary +#ifndef HAVE_CALLOC +#define calloc rfx_calloc_replacement +#endif + +#endif // __config_h__ +]) + +if test -f "release.in"; then release_in="./release"; fi +if test -f "Makefile.new.in"; then mk_in="./Makefile.new"; fi +FILES="$release_in $mk_in Makefile.common ${avi2swf} Makefile lib/Makefile lib/action/Makefile src/Makefile ${pdf2swf_makefile} swfs/Makefile ${pythongfx} ${rubygfx} ${lame_makefile} lib/readers/Makefile" +AC_OUTPUT(${FILES}) + +dnl new autoconf +dnl AC_CONFIG_FILES([${FILES}]) +dnl AC_OUTPUT + +# +# On development trees, create snapshots of config.status +# +if test -f snapshot -a "x$CHECKMEM" = "x" -a "x$PROFILING" = "x";then + if test "x${MINGW}" = "xyes"; then + echo cp config.status config.status.win32 + cp config.status config.status.win32 + else + if test "x$DEBUG" '=' "x" -a "x$OPTIMIZE" '=' "x";then + echo cp config.status config.status.linux + cp config.status config.status.linux + fi + if test "x$DEBUG" '!=' "x" -a "x$OPTIMIZE" '=' "x";then + echo cp config.status config.status.debug + cp config.status config.status.debug + fi + if test "x$DEBUG" = "x" -a "x$OPTIMIZE" '!=' "x"; then + echo cp config.status config.status.optimize + cp config.status config.status.optimize + fi + fi +fi diff --git a/fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc b/fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc new file mode 100644 index 000000000..075538fb8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc @@ -0,0 +1,393 @@ +# =========================================================================== +# +# swfc(1) File format specification +# +# Warning: not all of this is actually implemented yet- if there's a +# "TODO" behind a command, it has yet to be integrated into swfc. +# +# =========================================================================== + +# File header +# ----------- + +.flash bbox=200x200 version=6 fps=50 name="spec.swf" compress + +# bbox=200x200 : set bounding box to 200x200 +# bbox=200x200:100:100 : set bounding box to (100,100)-(300,300) +# bbox=autocrop : (default) - make bbox just big enough so that nothing ever get's clipped +# +# all coordinates are in pixels, not in twips. fixed point values like 1.25, 333.40 are allowed. +# +# version=6 : generate flash mx movie +# fps=50 : set framerate to 50 frames/second +# name="..." : save result to spec.flash. (Default: input file with extension +# changed to .flash, or the value of the -o command line +# parameter if given) + +# inherit swf movies: +# --------------------- + +.swf mymovie1 "choo1.swf" +.swf mymovie2 filename="choo1.swf" # long form +.swf mymovie3 filename=choo1.swf # long form, without quotes +.swf mymovie4 choo1.swf # short form, without quotes + +# Notice: An embedded animation can't have a different framerate than +# the frame rate from the surrounding animation. + +#TODO: Those files currently come from the current directory- they should come from the script directory. + +# load an image: +# -------------- + +.jpeg background "panorama.jpg" +.jpeg background2 "panorama.jpg" quality=30% #reduces jpeg quality + +.png background3 "choochoo.png" #TODO + +# (you can put this directly (generating a shape), or insert it into a shape via the fill= argument + +# define a texture from an image: +# ------------------------------- + +.texture text1=background scale=50% rotate=45 + +# define a gradient +# ----------------- + +.gradient mygradient: + 0% red + 50% green + 75% aquamarine + 100% #ffffff +.end + +# with a hard edge: + +.gradient mygradient: + 0% red + 50% green + 50% red + 75% aquamarine + 100% #ffffff +.end + +# with alpha: + +.gradient mygradient: + 0% #00000000 + 50% #0000ff40 + 75% #0000ff80 + 100% #0000ffc0 +.end + +# define a texture from a gradient: +# --------------------------------- + +.texture grad2=mygradient x=0 y=0 width=125 height=200 rotate=45 + +# Create simple objects: +# ---------------------- + +.box mybox1 width=100 height=50 color=black fill=none #unfilled rectangle (just the lines) +.box mybox2 width=100 height=50 color=black #same as above +.box mybox3 width=100 height=50 color=black fill #filled black rectangle +.box mybox4 width=100 height=50 color=red line=2 fill=blue #blue rectangle with red edges +.box mybox5 width=100 height=50 color=red line=2 fill=background #filled with image "background", with red edges + +.circle mycircle1 r=50 color=#aa33ff fill=mygradient # filled with gradient (defined above) +.circle mycircle1 r=50 color=#aa33ff fill=grad2 # filled with gradient texture + +# Sounds: +# ------- + +.sound sound1 "LocoStart.wav" + +.frame 16 + .play sound1 loop=1 #other arguments supported: nomultiple (don't start if already playing) +.frame 55 + .stop sound1 + +.frame 66 + # this starts a synchronized soundtrack at this frame position. The command + # expects a filename, not a sound object, as it would be duplicating the + # sound object otherwise, and I'd rather have that done explicitly. + .soundtrack "LocoStart.wav" # TODO + +# Elements of the movie should be animated by various means +# moving (x,y and zoom) +# --------------------- + +.box obj1 width=200.0 height=100.0 + +.frame 100 + .put obj1 x=0 y=0 #object starts at (0,0) + +.frame 140 + .change obj1 x+=100 y=0 scale=120% # smoothly move obj1 100 pixels to the right over 40 frames, + # scaling it to 120% of it's original size +.frame 170 + .jump obj1 x=200 y=200 # make object to suddenly change to 200,200 at frame 70. + +.frame 190 + .qchange obj1 x=300 y=200 # TODO # make obj1 move towards 300,200... +.frame 210 + .qchange obj1 x=300 y=300 # TODO # ... and then smoothly over to 300,300 using bspline interpolation + +#.frame 220 #TODO +# .jump obj1 x=reset y=reset + +.frame 230 + .del obj1 #Remove object again + +# morphing +# -------- + +.outline shape1: + #define shape 1 +.end +.outline shape2: + #define shape 2 +.end +.morphshape morphthing start=shape1 end=shape2 +.frame 250 + .put morphthing ratio=0% +.frame 270 + .change morphthing ratio=100% + +# interpolation between crude manual animation frames +# --------------------------------------------------- + +.circle ball r=50 color=blue fill=violet + +# now draw two balls, which fly around each other. + +.frame 300 +.put myball1=ball x=0 y=100 blue=0 +.put myball2=ball x=100 y=100 red=0 + +.frame 310 +# the .qchange means, "interpolate to this position and frame, using quadratic splines". + .qchange myball1 x=50 y=0 #TODO + .qchange myball2 x=50 y=100 #TODO + +.frame 320 +# We could also use coordinates relative to start position: .change myball1 x+=100 y+=0 + .qchange myball1 x=100 y=100 #TODO + .qchange myball2 x=0 y=100 #TODO + +.frame 330 + .qchange myball1 x=50 y=100 #TODO + .qchange myball2 x=50 y=0 #TODO + +.frame 340 +# Hmmm. This frame is the same as frame 0. How to prevent duplicating that one? + .qchange myball1 x=0 y=100 #TODO + .qchange myball2 x=100 y=100 #TODO + +# color transforms (fading) +# ------------------------- + +# .put, .change, .qchange, .jump all support params which result in color transform. +# Everything up to the + is multiplicated, the rest summed. + +.put obj1 blue=50% #(scale blue color component to 50%) +.change obj1 blue=128 #(same as above) +.change obj1 red=+25% #(shift blue color component by 25%) +.change obj1 red=+64 #(same as above) +.change obj1 green=50%+50% #(scale green color component to 50% and then shift it by 50%) +.change obj1 green=128+128 #(same as above) +.change obj1 green=-1+255 #(invert green color component) +.change obj1 green=2-128 #(reduce spectrum for green to the upper 50%) +.change obj1 luminance=50% #(fade all color components 50% to black, same as red=50% green=50% blue=50%) +.change obj1 alpha=50% #(make object 50% transparent) + +# scaling +# ------- + +.change obj1 scale=50% # change an object to 50% of it's size +.change obj1 scaley=50% # flatten object to 50% of it's height +.change obj1 scaley=110% scalex=75% #(funhouse mirror!) + +# rotating +# -------- + +.change obj1 rotate=45 # tilt object, counterclockwise + +# shearing +# -------- + +.change obj1 shear=100% # shear object + +# sprites (a.k.a. movieClips) +# ------- + +.sprite spr1 + .frame 1 .put ball1=ball 0 0 + .frame 2 .change ball1 100 100 +.end + +.sprite spr2 + .frame 1 .put ball2=ball 100 0 + .frame 7 .change ball2 0 100 +.end + +.frame 400 + .put spr1 + .put spr2 + +# so spr1 has three frames, spr2 has seven. The whole animation loops after 21 frames. + +# multi-level nesting: (sprites can be nested to any depth) + +.sprite mspr1 + .sprite mspr2 + .sprite spr3 + .put ball 100 0 + .end + .end +.end + +# clipping an animation inside a star-shaped sprite: + +.swf mystar1 "star.swf" +.swf anim1 "penguins.swf" + +.sprite cspr1 + .startclip mystar1 + .put anim1 + .end +.end +.frame 401 + .put cspr1 rotate=0 +.frame 402 + .change cspr1 rotate=360 + +# buttons +# ------- + +.png play "Play.png" #TODO +.png play_pressed "Play_pressed.png" #TODO +.png stoplogo "Stop.png" #TODO + +.button playbutton + .show play as=idle + .show play as=area + .show play_pressed as=pressed + .show play_pressed as=hover +.end + +.button playbutton2 + .show play as=idle + .on_press inside + .on_release inside + .on_release outside + .on_move_in pressed + .on_move_out pressed + .on_move_in + .on_move_out + .on_key "a": + # actionscript... + .end +.end + +.button mybutton + .show play as=idle + .show obj1 x=300 y=400 scale=110% pivot=center + as=pressed +.end + +.box blueshape 10 10 +.box greenshape 10 10 +.box whiteshape 10 10 +.box activearea 10 10 +.box emtpyshape 10 10 +.box window1 10 10 +# button which is blue, get's green when the mouse hovers over it, and +# white when it is pressed: +.button b1 + .show blueshape as=idle + .show greenshape as=hower + .show whiteshape as=press +.end + +# button where the button position is not identical to the active area: +.button b2 + .show activearea as=area + .show blueshape as=idle + .show greenshape as=hower + .show whiteshape as=press +.end + +# (if area is not set, it's the same as shape) + +# the above put into use: pop up a window if the mouse cursor enters a certain +# area: +.button b3 + .show activearea as=area + .show emtpyshape as=idle + .show window1 as=hower +.end + +# fonts +# ----- +.font font1 "myfont.swf" +.font font1 "myfont.ttf" +.font font1 "myfont.pfa" + +# text fields +# ----------- +.text mytext1 font=font1 text="I am a happy little scroll message" color=blue size=100% + +# edittext +# -------- +#(field where the flash animation can get input from the user) + +.font helvetica "helvetica-bold.swf" +.edittext edittext1 text="Type something here" color=blue maxlength=200 font=helvetica size=24 width=320 height=200 #TODO +# width/height: dimensions of the box +# text: The text which appears initally in the box, and can be overwritten by the user +# maxlength: max. length of the text the user can type +# color/font/size: Font appeareance +# variable: Name of the actionscript variable the text is stored in +# The following boolean options are also supported: +# password (show input only as stars), wordwrap, multiline, html, noselect, readonly + +# actionscript +# ------------ + +.action: + _root.play(); +.end + +# depth control +# ------------------- +# .put, .change, .qchange, .jump, .startclip take before and after parameters, +# which can be used to specify the depth of an object + +.put o1=obj1 #TODO +.put o2=obj1 below=o1 x=50 #TODO +.frame +.change o1 #TODO +.change o2 above=o1 x=50 #TODO + +# newline conventions +# ------------------- + +# All Newlines are treated as normal whitespace. Therefore, splitting +# commands over several lines, like +.put obj2=obj1 x=300 + y=300 + red=100% + green=50% + blue=50% +# is allowed. + +# Furthermore, having more than one command in one line is also possible: + +.frame 600 .change obj1 x+=700 .change obj2 x+=300 +.frame 601 .change obj1 x+=500 .change obj2 x+=500 +.frame 602 .change obj1 x+=300 .change obj2 x+=700 + +.end # end of first file + diff --git a/fluidbook/tools/swftools-special-swfdump/install-sh b/fluidbook/tools/swftools-special-swfdump/install-sh new file mode 100644 index 000000000..e9de23842 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/lib/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/Makefile new file mode 100644 index 000000000..a57327736 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/Makefile @@ -0,0 +1,201 @@ +top_builddir = .. +srcdir = . +top_srcdir = .. +include ../Makefile.common + +all: librfxswf$(A) libgfxpdf$(A) libbase$(A) libgfx$(A) libgfxswf$(A) libocr$(A) + +lame_objects = lame/psymodel.$(O) lame/fft.$(O) lame/newmdct.$(O) lame/quantize.$(O) lame/takehiro.$(O) lame/reservoir.$(O) lame/quantize_pvt.$(O) lame/vbrquantize.$(O) lame/encoder.$(O) lame/id3tag.$(O) lame/version.$(O) lame/tables.$(O) lame/util.$(O) lame/bitstream.$(O) lame/set_get.$(O) lame/VbrTag.$(O) lame/lame.$(O) +lame_in_source = + +h263_objects = h.263/dct.$(O) h.263/h263tables.$(O) h.263/swfvideo.$(O) + +as12compiler_objects = action/assembler.$(O) action/compile.$(O) action/lex.swf4.$(O) action/lex.swf5.$(O) action/libming.$(O) action/swf4compiler.tab.$(O) action/swf5compiler.tab.$(O) action/actioncompiler.$(O) +as12compiler_in_source = $(as12compiler_objects) + +as3compiler_objects = as3/abc.$(O) as3/pool.$(O) as3/files.$(O) as3/opcodes.$(O) as3/code.$(O) as3/registry.$(O) as3/builtin.$(O) as3/tokenizer.yy.$(O) as3/parser.tab.$(O) as3/scripts.$(O) as3/compiler.$(O) as3/import.$(O) as3/expr.$(O) as3/parser_help.$(O) as3/state.$(O) as3/common.$(O) as3/initcode.$(O) as3/assets.$(O) +gfxpoly_objects = gfxpoly/active.$(O) gfxpoly/convert.$(O) gfxpoly/poly.$(O) gfxpoly/renderpoly.$(O) gfxpoly/stroke.$(O) gfxpoly/wind.$(O) gfxpoly/xrow.$(O) + +rfxswf_modules = modules/swfbits.c modules/swfaction.c modules/swfdump.c modules/swfcgi.c modules/swfbutton.c modules/swftext.c modules/swffont.c modules/swftools.c modules/swfsound.c modules/swfshape.c modules/swfobject.c modules/swfdraw.c modules/swffilter.c modules/swfrender.c h.263/swfvideo.c modules/swfalignzones.c + +base_objects=q.$(O) base64.$(O) utf8.$(O) png.$(O) jpeg.$(O) wav.$(O) mp3.$(O) os.$(O) bitio.$(O) log.$(O) mem.$(O) xml.$(O) ttf.$(O) kdtree.$(O) graphcut.$(O) +devices=devices/dummy.$(O) devices/file.$(O) devices/render.$(O) devices/text.$(O) devices/record.$(O) devices/ops.$(O) devices/polyops.$(O) devices/bbox.$(O) devices/rescale.$(O) +filters=filters/alpha.$(O) filters/remove_font_transforms.$(O) filters/one_big_font.$(O) filters/vectors_to_glyphs.$(O) +gfx_objects=gfximage.$(O) gfxtools.$(O) gfxfont.$(O) gfxfilter.$(O) $(devices) $(filters) + +rfxswf_objects=modules/swfaction.$(O) modules/swfbits.$(O) modules/swfbutton.$(O) modules/swfcgi.$(O) modules/swfdraw.$(O) modules/swfdump.$(O) modules/swffilter.$(O) modules/swffont.$(O) modules/swfobject.$(O) modules/swfrender.$(O) modules/swfshape.$(O) modules/swfsound.$(O) modules/swftext.$(O) modules/swftools.$(O) modules/swfalignzones.$(O) +ocr_objects=gocr/box.$(O) gocr/database.$(O) gocr/detect.$(O) gocr/job.$(O) gocr/lines.$(O) gocr/list.$(O) gocr/ocr0.$(O) gocr/ocr0n.$(O) gocr/ocr1.$(O) gocr/otsu.$(O) gocr/output.$(O) gocr/pgm2asc.$(O) gocr/pixel.$(O) gocr/progress.$(O) gocr/remove.$(O) gocr/unicode.$(O) + +%.$(O): %.c + $(C) $< -o $@ +lame/%.$(O): lame/%.c + $(C) $< -o $@ +action/%.$(O): action/%.c + $(C) $< -o $@ +as3/%.$(O): as3/%.c + $(C) $< -o $@ +gfxpoly/%.$(O): gfxpoly/%.c + $(C) $< -o $@ + +bitio.$(O): bitio.c bitio.h + $(C) bitio.c -o $@ +drawer.$(O): drawer.c drawer.h + $(C) drawer.c -o $@ +q.$(O): q.c q.h $(top_builddir)/config.h + $(C) q.c -o $@ +utf8.$(O): utf8.c utf8.h $(top_builddir)/config.h + $(C) utf8.c -o $@ +mem.$(O): mem.c mem.h $(top_builddir)/config.h + $(C) mem.c -o $@ +png.$(O): png.c png.h $(top_builddir)/config.h + $(C) png.c -o $@ +jpeg.$(O): jpeg.c jpeg.h $(top_builddir)/config.h + $(C) jpeg.c -o $@ +mp3.$(O): mp3.c mp3.h $(top_builddir)/config.h + $(C) mp3.c -o $@ +wav.$(O): wav.c wav.h $(top_builddir)/config.h + $(C) wav.c -o $@ +xml.$(O): xml.c xml.h bitio.h + $(C) xml.c -o $@ +graphcut.$(O): graphcut.c graphcut.h + $(C) graphcut.c -o $@ +ttf.$(O): ttf.c ttf.h + $(C) ttf.c -o $@ +os.$(O): os.c os.h $(top_builddir)/config.h + $(C) -DSWFTOOLS_DATADIR=\"$(pkgdatadir)\" os.c -o $@ +modules/swfaction.$(O): modules/swfaction.c rfxswf.h + $(C) modules/swfaction.c -o $@ +modules/swfbits.$(O): modules/swfbits.c rfxswf.h + $(C) modules/swfbits.c -o $@ +modules/swfbutton.$(O): modules/swfbutton.c rfxswf.h + $(C) modules/swfbutton.c -o $@ +modules/swfcgi.$(O): modules/swfcgi.c rfxswf.h + $(C) modules/swfcgi.c -o $@ +modules/swfdraw.$(O): modules/swfdraw.c rfxswf.h + $(C) modules/swfdraw.c -o $@ +modules/swfdump.$(O): modules/swfdump.c rfxswf.h + $(C) modules/swfdump.c -o $@ +modules/swffilter.$(O): modules/swffilter.c rfxswf.h + $(C) modules/swffilter.c -o $@ +modules/swfalignzones.$(O): modules/swfalignzones.c rfxswf.h + $(C) modules/swfalignzones.c -o $@ +modules/swffont.$(O): modules/swffont.c rfxswf.h + $(C) modules/swffont.c -o $@ +modules/swfobject.$(O): modules/swfobject.c rfxswf.h + $(C) modules/swfobject.c -o $@ +modules/swfrender.$(O): modules/swfrender.c rfxswf.h + $(C) modules/swfrender.c -o $@ +modules/swfshape.$(O): modules/swfshape.c rfxswf.h + $(C) modules/swfshape.c -o $@ +modules/swfsound.$(O): modules/swfsound.c rfxswf.h + $(C) modules/swfsound.c -o $@ +modules/swftext.$(O): modules/swftext.c rfxswf.h + $(C) modules/swftext.c -o $@ +modules/swftools.$(O): modules/swftools.c rfxswf.h + $(C) modules/swftools.c -o $@ +gfximage.$(O): gfximage.c gfximage.h gfxdevice.h $(top_builddir)/config.h + $(C) gfximage.c -o $@ +gfxtools.$(O): gfxtools.c gfxtools.h $(top_builddir)/config.h + $(C) gfxtools.c -o $@ +gfxfont.$(O): gfxfont.c gfxfont.h ttf.h $(top_builddir)/config.h + $(C) gfxfont.c -o $@ +gfxfilter.$(O): gfxfilter.c gfxfilter.h ttf.h $(top_builddir)/config.h + $(C) gfxfilter.c -o $@ +gfxwindow.$(O): gfxwindow_win32.c gfxwindow_unix.c gfxwindow.c gfxwindow.h + $(C) gfxwindow.c -o $@ + +log.$(O): log.c log.h + $(C) log.c -o $@ + +rfxswf.$(O): rfxswf.c rfxswf.h drawer.h bitio.h log.h $(top_builddir)/config.h + $(C) rfxswf.c -o $@ + +#$(as12compiler_objects): +# cd action;$(MAKE) all;cd .. + +h.263/dct.$(O): h.263/dct.c h.263/dct.h + $(C) h.263/dct.c -o h.263/dct.$(O) +h.263/h263tables.$(O): h.263/h263tables.c h.263/h263tables.h + $(C) h.263/h263tables.c -o h.263/h263tables.$(O) +h.263/swfvideo.$(O): h.263/swfvideo.c h.263/h263tables.h h.263/dct.h + $(C) h.263/swfvideo.c -o h.263/swfvideo.$(O) + +devices/swf.$(O): devices/swf.c devices/swf.h + $(C) devices/swf.c -o devices/swf.$(O) +devices/file.$(O): devices/file.c devices/file.h + $(C) devices/file.c -o devices/file.$(O) +devices/dummy.$(O): devices/dummy.c devices/dummy.h + $(C) devices/dummy.c -o devices/dummy.$(O) +devices/render.$(O): devices/render.c devices/render.h + $(C) devices/render.c -o devices/render.$(O) +devices/opengl.$(O): devices/opengl.c devices/opengl.h + $(C) devices/opengl.c -o devices/opengl.$(O) +devices/polyops.$(O): devices/polyops.c devices/polyops.h gfxpoly.h + $(C) devices/polyops.c -o devices/polyops.$(O) +devices/record.$(O): devices/record.c devices/record.h + $(C) devices/record.c -o devices/record.$(O) +devices/text.$(O): devices/text.c devices/text.h + $(C) devices/text.c -o devices/text.$(O) +devices/ops.$(O): devices/ops.c devices/ops.h + $(C) devices/ops.c -o devices/ops.$(O) +devices/rescale.$(O): devices/rescale.c devices/rescale.h + $(C) devices/rescale.c -o devices/rescale.$(O) +devices/bbox.$(O): devices/bbox.c devices/bbox.h + $(C) devices/bbox.c -o devices/bbox.$(O) +devices/lrf.$(O): devices/lrf.c devices/lrf.h + $(C) devices/lrf.c -o devices/lrf.$(O) +devices/ocr.$(O): devices/ocr.c devices/ocr.h gocr/gocr.h + $(C) devices/ocr.c -o devices/ocr.$(O) + +filters/alpha.$(O): filters/alpha.c gfxfilter.h + $(C) filters/alpha.c -o filters/alpha.$(O) +filters/remove_font_transform.$(O): filters/remove_font_transform.c gfxfilter.h + $(C) filters/remove_font_transform.c -o filters/remove_font_transform.$(O) + +readers/swf2.$(O): readers/swf.c readers/swf.h + $(C) readers/swf.c -o readers/swf2.$(O) +readers/image.$(O): readers/image.c readers/image.h + $(C) readers/image.c -o readers/image.$(O) + +libocr$(A): $(ocr_objects) devices/ocr.$(O) + rm -f libocr$(A) + $(AR) r libocr$(A) $(ocr_objects) devices/ocr.$(O) + $(RANLIB) libocr$(A) + +libbase$(A): $(base_objects) Makefile + rm -f libbase$(A) + $(AR) r libbase$(A) $(base_objects) + $(RANLIB) libbase$(A) + +libgfxswf$(A): devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) + rm -f libgfxswf$(A) + $(AR) r libgfxswf$(A) devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) + $(RANLIB) libgfxswf$(A) + +libgfx$(A): $(gfx_objects) $(gfxpoly_objects) Makefile + rm -f libgfx$(A) + $(AR) r libgfx$(A) $(gfx_objects) $(gfxpoly_objects) + $(RANLIB) libgfx$(A) + +librfxswf$(A): Makefile $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) Makefile + rm -f librfxswf$(A) + $(AR) r librfxswf$(A) $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) + $(RANLIB) librfxswf$(A) + +libgfxpdf$(A): pdf/VectorGraphicOutputDev.cc pdf/VectorGraphicOutputDev.h pdf/pdf.cc pdf/pdf.h + cd pdf;$(MAKE) libgfxpdf + +tests: png.test.c + $(L) png.test.c -o png.test $(LIBS) + +install: +uninstall: + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out + for dir in modules filters devices swf as3 readers art gocr h.263 gfxpoly;do rm -f $$dir/*.o $$dir/*.obj $$dir/*.lo $$dir/*.a $$dir/*.lib $$dir/*.la $$dir/gmon.out;done + cd lame && $(MAKE) clean && cd .. || true + cd action && $(MAKE) clean && cd .. + cd python && $(MAKE) clean && cd .. + cd pdf && $(MAKE) clean && cd .. + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/Makefile.in new file mode 100644 index 000000000..3d2c8ba7d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/Makefile.in @@ -0,0 +1,201 @@ +top_builddir = .. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../Makefile.common + +all: librfxswf$(A) libgfxpdf$(A) libbase$(A) libgfx$(A) libgfxswf$(A) libocr$(A) + +lame_objects = lame/psymodel.$(O) lame/fft.$(O) lame/newmdct.$(O) lame/quantize.$(O) lame/takehiro.$(O) lame/reservoir.$(O) lame/quantize_pvt.$(O) lame/vbrquantize.$(O) lame/encoder.$(O) lame/id3tag.$(O) lame/version.$(O) lame/tables.$(O) lame/util.$(O) lame/bitstream.$(O) lame/set_get.$(O) lame/VbrTag.$(O) lame/lame.$(O) +lame_in_source = @lame_in_source@ + +h263_objects = h.263/dct.$(O) h.263/h263tables.$(O) h.263/swfvideo.$(O) + +as12compiler_objects = action/assembler.$(O) action/compile.$(O) action/lex.swf4.$(O) action/lex.swf5.$(O) action/libming.$(O) action/swf4compiler.tab.$(O) action/swf5compiler.tab.$(O) action/actioncompiler.$(O) +as12compiler_in_source = $(as12compiler_objects) + +as3compiler_objects = as3/abc.$(O) as3/pool.$(O) as3/files.$(O) as3/opcodes.$(O) as3/code.$(O) as3/registry.$(O) as3/builtin.$(O) as3/tokenizer.yy.$(O) as3/parser.tab.$(O) as3/scripts.$(O) as3/compiler.$(O) as3/import.$(O) as3/expr.$(O) as3/parser_help.$(O) as3/state.$(O) as3/common.$(O) as3/initcode.$(O) as3/assets.$(O) +gfxpoly_objects = gfxpoly/active.$(O) gfxpoly/convert.$(O) gfxpoly/poly.$(O) gfxpoly/renderpoly.$(O) gfxpoly/stroke.$(O) gfxpoly/wind.$(O) gfxpoly/xrow.$(O) + +rfxswf_modules = modules/swfbits.c modules/swfaction.c modules/swfdump.c modules/swfcgi.c modules/swfbutton.c modules/swftext.c modules/swffont.c modules/swftools.c modules/swfsound.c modules/swfshape.c modules/swfobject.c modules/swfdraw.c modules/swffilter.c modules/swfrender.c h.263/swfvideo.c modules/swfalignzones.c + +base_objects=q.$(O) base64.$(O) utf8.$(O) png.$(O) jpeg.$(O) wav.$(O) mp3.$(O) os.$(O) bitio.$(O) log.$(O) mem.$(O) xml.$(O) ttf.$(O) kdtree.$(O) graphcut.$(O) +devices=devices/dummy.$(O) devices/file.$(O) devices/render.$(O) devices/text.$(O) devices/record.$(O) devices/ops.$(O) devices/polyops.$(O) devices/bbox.$(O) devices/rescale.$(O) @DEVICE_OPENGL@ @DEVICE_PDF@ +filters=filters/alpha.$(O) filters/remove_font_transforms.$(O) filters/one_big_font.$(O) filters/vectors_to_glyphs.$(O) +gfx_objects=gfximage.$(O) gfxtools.$(O) gfxfont.$(O) gfxfilter.$(O) $(devices) $(filters) + +rfxswf_objects=modules/swfaction.$(O) modules/swfbits.$(O) modules/swfbutton.$(O) modules/swfcgi.$(O) modules/swfdraw.$(O) modules/swfdump.$(O) modules/swffilter.$(O) modules/swffont.$(O) modules/swfobject.$(O) modules/swfrender.$(O) modules/swfshape.$(O) modules/swfsound.$(O) modules/swftext.$(O) modules/swftools.$(O) modules/swfalignzones.$(O) +ocr_objects=gocr/box.$(O) gocr/database.$(O) gocr/detect.$(O) gocr/job.$(O) gocr/lines.$(O) gocr/list.$(O) gocr/ocr0.$(O) gocr/ocr0n.$(O) gocr/ocr1.$(O) gocr/otsu.$(O) gocr/output.$(O) gocr/pgm2asc.$(O) gocr/pixel.$(O) gocr/progress.$(O) gocr/remove.$(O) gocr/unicode.$(O) + +%.$(O): %.c + $(C) $< -o $@ +lame/%.$(O): lame/%.c + $(C) $< -o $@ +action/%.$(O): action/%.c + $(C) $< -o $@ +as3/%.$(O): as3/%.c + $(C) $< -o $@ +gfxpoly/%.$(O): gfxpoly/%.c + $(C) $< -o $@ + +bitio.$(O): bitio.c bitio.h + $(C) bitio.c -o $@ +drawer.$(O): drawer.c drawer.h + $(C) drawer.c -o $@ +q.$(O): q.c q.h $(top_builddir)/config.h + $(C) q.c -o $@ +utf8.$(O): utf8.c utf8.h $(top_builddir)/config.h + $(C) utf8.c -o $@ +mem.$(O): mem.c mem.h $(top_builddir)/config.h + $(C) mem.c -o $@ +png.$(O): png.c png.h $(top_builddir)/config.h + $(C) png.c -o $@ +jpeg.$(O): jpeg.c jpeg.h $(top_builddir)/config.h + $(C) jpeg.c -o $@ +mp3.$(O): mp3.c mp3.h $(top_builddir)/config.h + $(C) mp3.c -o $@ +wav.$(O): wav.c wav.h $(top_builddir)/config.h + $(C) wav.c -o $@ +xml.$(O): xml.c xml.h bitio.h + $(C) xml.c -o $@ +graphcut.$(O): graphcut.c graphcut.h + $(C) graphcut.c -o $@ +ttf.$(O): ttf.c ttf.h + $(C) ttf.c -o $@ +os.$(O): os.c os.h $(top_builddir)/config.h + $(C) -DSWFTOOLS_DATADIR=\"$(pkgdatadir)\" os.c -o $@ +modules/swfaction.$(O): modules/swfaction.c rfxswf.h + $(C) modules/swfaction.c -o $@ +modules/swfbits.$(O): modules/swfbits.c rfxswf.h + $(C) modules/swfbits.c -o $@ +modules/swfbutton.$(O): modules/swfbutton.c rfxswf.h + $(C) modules/swfbutton.c -o $@ +modules/swfcgi.$(O): modules/swfcgi.c rfxswf.h + $(C) modules/swfcgi.c -o $@ +modules/swfdraw.$(O): modules/swfdraw.c rfxswf.h + $(C) modules/swfdraw.c -o $@ +modules/swfdump.$(O): modules/swfdump.c rfxswf.h + $(C) modules/swfdump.c -o $@ +modules/swffilter.$(O): modules/swffilter.c rfxswf.h + $(C) modules/swffilter.c -o $@ +modules/swfalignzones.$(O): modules/swfalignzones.c rfxswf.h + $(C) modules/swfalignzones.c -o $@ +modules/swffont.$(O): modules/swffont.c rfxswf.h + $(C) modules/swffont.c -o $@ +modules/swfobject.$(O): modules/swfobject.c rfxswf.h + $(C) modules/swfobject.c -o $@ +modules/swfrender.$(O): modules/swfrender.c rfxswf.h + $(C) modules/swfrender.c -o $@ +modules/swfshape.$(O): modules/swfshape.c rfxswf.h + $(C) modules/swfshape.c -o $@ +modules/swfsound.$(O): modules/swfsound.c rfxswf.h + $(C) modules/swfsound.c -o $@ +modules/swftext.$(O): modules/swftext.c rfxswf.h + $(C) modules/swftext.c -o $@ +modules/swftools.$(O): modules/swftools.c rfxswf.h + $(C) modules/swftools.c -o $@ +gfximage.$(O): gfximage.c gfximage.h gfxdevice.h $(top_builddir)/config.h + $(C) gfximage.c -o $@ +gfxtools.$(O): gfxtools.c gfxtools.h $(top_builddir)/config.h + $(C) gfxtools.c -o $@ +gfxfont.$(O): gfxfont.c gfxfont.h ttf.h $(top_builddir)/config.h + $(C) gfxfont.c -o $@ +gfxfilter.$(O): gfxfilter.c gfxfilter.h ttf.h $(top_builddir)/config.h + $(C) gfxfilter.c -o $@ +gfxwindow.$(O): gfxwindow_win32.c gfxwindow_unix.c gfxwindow.c gfxwindow.h + $(C) gfxwindow.c -o $@ + +log.$(O): log.c log.h + $(C) log.c -o $@ + +rfxswf.$(O): rfxswf.c rfxswf.h drawer.h bitio.h log.h $(top_builddir)/config.h + $(C) rfxswf.c -o $@ + +#$(as12compiler_objects): +# cd action;$(MAKE) all;cd .. + +h.263/dct.$(O): h.263/dct.c h.263/dct.h + $(C) h.263/dct.c -o h.263/dct.$(O) +h.263/h263tables.$(O): h.263/h263tables.c h.263/h263tables.h + $(C) h.263/h263tables.c -o h.263/h263tables.$(O) +h.263/swfvideo.$(O): h.263/swfvideo.c h.263/h263tables.h h.263/dct.h + $(C) h.263/swfvideo.c -o h.263/swfvideo.$(O) + +devices/swf.$(O): devices/swf.c devices/swf.h + $(C) devices/swf.c -o devices/swf.$(O) +devices/file.$(O): devices/file.c devices/file.h + $(C) devices/file.c -o devices/file.$(O) +devices/dummy.$(O): devices/dummy.c devices/dummy.h + $(C) devices/dummy.c -o devices/dummy.$(O) +devices/render.$(O): devices/render.c devices/render.h + $(C) devices/render.c -o devices/render.$(O) +devices/opengl.$(O): devices/opengl.c devices/opengl.h + $(C) devices/opengl.c -o devices/opengl.$(O) +devices/polyops.$(O): devices/polyops.c devices/polyops.h gfxpoly.h + $(C) devices/polyops.c -o devices/polyops.$(O) +devices/record.$(O): devices/record.c devices/record.h + $(C) devices/record.c -o devices/record.$(O) +devices/text.$(O): devices/text.c devices/text.h + $(C) devices/text.c -o devices/text.$(O) +devices/ops.$(O): devices/ops.c devices/ops.h + $(C) devices/ops.c -o devices/ops.$(O) +devices/rescale.$(O): devices/rescale.c devices/rescale.h + $(C) devices/rescale.c -o devices/rescale.$(O) +devices/bbox.$(O): devices/bbox.c devices/bbox.h + $(C) devices/bbox.c -o devices/bbox.$(O) +devices/lrf.$(O): devices/lrf.c devices/lrf.h + $(C) devices/lrf.c -o devices/lrf.$(O) +devices/ocr.$(O): devices/ocr.c devices/ocr.h gocr/gocr.h + $(C) devices/ocr.c -o devices/ocr.$(O) + +filters/alpha.$(O): filters/alpha.c gfxfilter.h + $(C) filters/alpha.c -o filters/alpha.$(O) +filters/remove_font_transform.$(O): filters/remove_font_transform.c gfxfilter.h + $(C) filters/remove_font_transform.c -o filters/remove_font_transform.$(O) + +readers/swf2.$(O): readers/swf.c readers/swf.h + $(C) readers/swf.c -o readers/swf2.$(O) +readers/image.$(O): readers/image.c readers/image.h + $(C) readers/image.c -o readers/image.$(O) + +libocr$(A): $(ocr_objects) devices/ocr.$(O) + rm -f libocr$(A) + $(AR) r libocr$(A) $(ocr_objects) devices/ocr.$(O) + $(RANLIB) libocr$(A) + +libbase$(A): $(base_objects) Makefile + rm -f libbase$(A) + $(AR) r libbase$(A) $(base_objects) + $(RANLIB) libbase$(A) + +libgfxswf$(A): devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) + rm -f libgfxswf$(A) + $(AR) r libgfxswf$(A) devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) + $(RANLIB) libgfxswf$(A) + +libgfx$(A): $(gfx_objects) $(gfxpoly_objects) Makefile + rm -f libgfx$(A) + $(AR) r libgfx$(A) $(gfx_objects) $(gfxpoly_objects) + $(RANLIB) libgfx$(A) + +librfxswf$(A): Makefile $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) Makefile + rm -f librfxswf$(A) + $(AR) r librfxswf$(A) $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) + $(RANLIB) librfxswf$(A) + +libgfxpdf$(A): pdf/VectorGraphicOutputDev.cc pdf/VectorGraphicOutputDev.h pdf/pdf.cc pdf/pdf.h + cd pdf;$(MAKE) libgfxpdf + +tests: png.test.c + $(L) png.test.c -o png.test $(LIBS) + +install: +uninstall: + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out + for dir in modules filters devices swf as3 readers art gocr h.263 gfxpoly;do rm -f $$dir/*.o $$dir/*.obj $$dir/*.lo $$dir/*.a $$dir/*.lib $$dir/*.la $$dir/gmon.out;done + cd lame && $(MAKE) clean && cd .. || true + cd action && $(MAKE) clean && cd .. + cd python && $(MAKE) clean && cd .. + cd pdf && $(MAKE) clean && cd .. + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile new file mode 100644 index 000000000..3b13ab651 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile @@ -0,0 +1,95 @@ +top_builddir = ../.. +srcdir = . +top_srcdir = ../.. +include ../../Makefile.common + +# in case we need to get more information out of bison +#BISONDEBUG = --debug +# In case we need to get more information out of flex +#FLEXDEBUG = -d + +OBJECTS = compile.$(O) \ + lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) \ + assembler.$(O) libming.$(O) actioncompiler.$(O) + +COMPILER_FILES = action.h assembler.c assembler.h compile.c compile.h \ + listaction.c swf4compiler.flex swf4compiler.y swf5compiler.flex swf5compiler.y + +GENERATED = lex.swf4.c lex.swf5.c swf5compiler.tab.c swf4compiler.tab.c + +all: $(OBJECTS) +generated: $(GENERATED) + +# === GENERATED FILES === + +swf5compiler.tab.c: swf5compiler.y + bison -p swf5 swf5compiler.y + +swf5compiler.tab.h: swf5compiler.y + bison --defines $(BISONDEBUG) -p swf5 swf5compiler.y + +swf4compiler.tab.c: swf4compiler.y + bison -p swf4 swf4compiler.y + +swf4compiler.tab.h: swf4compiler.y + bison --defines $(BISONDEBUG) -p swf4 swf4compiler.y + +lex.swf4.c: swf4compiler.flex swf4compiler.tab.h + flex $(FLEXDEBUG) -i -Pswf4 swf4compiler.flex + +lex.swf5.c: swf5compiler.flex swf5compiler.tab.h + flex $(FLEXDEBUG) -i -Pswf5 swf5compiler.flex + +# === OBJECTS === + +lex.swf4.$(O): lex.swf4.c + $(C) lex.swf4.c -o lex.swf4.$(O) + +lex.swf5.$(O): lex.swf5.c + $(C) lex.swf5.c -o lex.swf5.$(O) + +compile.$(O): compile.c compile.h libming.h action.h blocks/error.h + $(C) compile.c -o compile.$(O) + +listaction.$(O): listaction.c action.h compile.h + $(C) listaction.c -o listaction.$(O) + +actioncompiler.$(O): actioncompiler.c compile.h action.h libming.h + $(C) actioncompiler.c -o actioncompiler.$(O) + +assembler.$(O): assembler.c compile.h action.h assembler.h + $(C) assembler.c -o assembler.$(O) + +swf4compiler.tab.$(O): swf4compiler.tab.c compile.h action.h assembler.h + $(C) swf4compiler.tab.c -o swf4compiler.tab.$(O) + +swf5compiler.tab.$(O): swf5compiler.tab.c compile.h action.h assembler.h + $(C) swf5compiler.tab.c -o swf5compiler.tab.$(O) + +libming.$(O): libming.c libming.h + $(C) libming.c -o libming.$(O) + +# === TESTING === + +test.$(O): test.c actioncompiler.h + $(C) test.c -o test.$(O) + +main.$(O): main.c + $(C) main.c -o main.$(O) + +OBJS = compile.$(O) listaction.$(O) lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) assembler.$(O) actioncompiler.$(O) +main: main.$(O) $(OBJS) + $(L) -o main main.$(O) $(OBJS) $(LIBS) + +test: test.$(O) $(OBJECTS) + $(L) -o test $(OBJECTS) test.$(O) ../librfxswf$(A) -lm -ljpeg -lz -lt1 -lfreetype + +# === CLEANING === + +clean: + rm -f $(OBJECTS) compiler compiler.exe core test main main.$(O) *~ gmon.out + +distclean: clean + rm -f $(GENERATED) swf*compiler.tab.* lex*.c + +.PHONY: clean,distclean,all,generated diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in new file mode 100644 index 000000000..9ff5c9b61 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in @@ -0,0 +1,95 @@ +top_builddir = ../.. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../../Makefile.common + +# in case we need to get more information out of bison +#BISONDEBUG = --debug +# In case we need to get more information out of flex +#FLEXDEBUG = -d + +OBJECTS = compile.$(O) \ + lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) \ + assembler.$(O) libming.$(O) actioncompiler.$(O) + +COMPILER_FILES = action.h assembler.c assembler.h compile.c compile.h \ + listaction.c swf4compiler.flex swf4compiler.y swf5compiler.flex swf5compiler.y + +GENERATED = lex.swf4.c lex.swf5.c swf5compiler.tab.c swf4compiler.tab.c + +all: $(OBJECTS) +generated: $(GENERATED) + +# === GENERATED FILES === + +swf5compiler.tab.c: swf5compiler.y + bison -p swf5 swf5compiler.y + +swf5compiler.tab.h: swf5compiler.y + bison --defines $(BISONDEBUG) -p swf5 swf5compiler.y + +swf4compiler.tab.c: swf4compiler.y + bison -p swf4 swf4compiler.y + +swf4compiler.tab.h: swf4compiler.y + bison --defines $(BISONDEBUG) -p swf4 swf4compiler.y + +lex.swf4.c: swf4compiler.flex swf4compiler.tab.h + flex $(FLEXDEBUG) -i -Pswf4 swf4compiler.flex + +lex.swf5.c: swf5compiler.flex swf5compiler.tab.h + flex $(FLEXDEBUG) -i -Pswf5 swf5compiler.flex + +# === OBJECTS === + +lex.swf4.$(O): lex.swf4.c + $(C) lex.swf4.c -o lex.swf4.$(O) + +lex.swf5.$(O): lex.swf5.c + $(C) lex.swf5.c -o lex.swf5.$(O) + +compile.$(O): compile.c compile.h libming.h action.h blocks/error.h + $(C) compile.c -o compile.$(O) + +listaction.$(O): listaction.c action.h compile.h + $(C) listaction.c -o listaction.$(O) + +actioncompiler.$(O): actioncompiler.c compile.h action.h libming.h + $(C) actioncompiler.c -o actioncompiler.$(O) + +assembler.$(O): assembler.c compile.h action.h assembler.h + $(C) assembler.c -o assembler.$(O) + +swf4compiler.tab.$(O): swf4compiler.tab.c compile.h action.h assembler.h + $(C) swf4compiler.tab.c -o swf4compiler.tab.$(O) + +swf5compiler.tab.$(O): swf5compiler.tab.c compile.h action.h assembler.h + $(C) swf5compiler.tab.c -o swf5compiler.tab.$(O) + +libming.$(O): libming.c libming.h + $(C) libming.c -o libming.$(O) + +# === TESTING === + +test.$(O): test.c actioncompiler.h + $(C) test.c -o test.$(O) + +main.$(O): main.c + $(C) main.c -o main.$(O) + +OBJS = compile.$(O) listaction.$(O) lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) assembler.$(O) actioncompiler.$(O) +main: main.$(O) $(OBJS) + $(L) -o main main.$(O) $(OBJS) $(LIBS) + +test: test.$(O) $(OBJECTS) + $(L) -o test $(OBJECTS) test.$(O) ../librfxswf$(A) -lm -ljpeg -lz -lt1 -lfreetype + +# === CLEANING === + +clean: + rm -f $(OBJECTS) compiler compiler.exe core test main main.$(O) *~ gmon.out + +distclean: clean + rm -f $(GENERATED) swf*compiler.tab.* lex*.c + +.PHONY: clean,distclean,all,generated diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/action.h b/fluidbook/tools/swftools-special-swfdump/lib/action/action.h new file mode 100644 index 000000000..8b844ef16 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/action.h @@ -0,0 +1,119 @@ +/* action.h + * + * $Id: action.h,v 1.1 2004/05/08 17:09:35 kramm Exp $ + * + * Notice: This header file contains declarations of functions and types that + * are just used internally. All library functions and types that are supposed + * to be publicly accessable are defined in ./src/ming.h. + */ + +#ifndef SWF_COMPILER_ACTION_H_INCLUDED +#define SWF_COMPILER_ACTION_H_INCLUDED + +#include "ming.h" + +enum +{ + SWFACTION_END = 0x00, + +/* v3 actions */ + SWFACTION_NEXTFRAME = 0x04, + SWFACTION_PREVFRAME = 0x05, + SWFACTION_PLAY = 0x06, + SWFACTION_STOP = 0x07, + SWFACTION_TOGGLEQUALITY = 0x08, + SWFACTION_STOPSOUNDS = 0x09, + SWFACTION_GOTOFRAME = 0x81, /* >= 0x80 means record has args */ + SWFACTION_GETURL = 0x83, + SWFACTION_WAITFORFRAME = 0x8A, + SWFACTION_SETTARGET = 0x8B, + SWFACTION_GOTOLABEL = 0x8C, + +/* v4 actions */ + SWFACTION_ADD = 0x0A, + SWFACTION_SUBTRACT = 0x0B, + SWFACTION_MULTIPLY = 0x0C, + SWFACTION_DIVIDE = 0x0D, + SWFACTION_EQUAL = 0x0E, + SWFACTION_LESSTHAN = 0x0F, + SWFACTION_LOGICALAND = 0x10, + SWFACTION_LOGICALOR = 0x11, + SWFACTION_LOGICALNOT = 0x12, + SWFACTION_STRINGEQ = 0x13, + SWFACTION_STRINGLENGTH = 0x14, + SWFACTION_SUBSTRING = 0x15, + SWFACTION_POP = 0x17, + SWFACTION_INT = 0x18, + SWFACTION_GETVARIABLE = 0x1C, + SWFACTION_SETVARIABLE = 0x1D, + SWFACTION_SETTARGETEXPRESSION = 0x20, + SWFACTION_STRINGCONCAT = 0x21, + SWFACTION_GETPROPERTY = 0x22, + SWFACTION_SETPROPERTY = 0x23, + SWFACTION_DUPLICATECLIP = 0x24, + SWFACTION_REMOVECLIP = 0x25, + SWFACTION_TRACE = 0x26, + SWFACTION_STARTDRAGMOVIE = 0x27, + SWFACTION_STOPDRAGMOVIE = 0x28, + SWFACTION_STRINGCOMPARE = 0x29, + SWFACTION_RANDOM = 0x30, + SWFACTION_MBLENGTH = 0x31, + SWFACTION_ORD = 0x32, + SWFACTION_CHR = 0x33, + SWFACTION_GETTIMER = 0x34, + SWFACTION_MBSUBSTRING = 0x35, + SWFACTION_MBORD = 0x36, + SWFACTION_MBCHR = 0x37, + + SWFACTION_WAITFORFRAMEEXPRESSION = 0x8D, + SWFACTION_PUSHDATA = 0x96, + SWFACTION_BRANCHALWAYS = 0x99, + SWFACTION_GETURL2 = 0x9A, + SWFACTION_BRANCHIFTRUE = 0x9D, + SWFACTION_CALLFRAME = 0x9E, + SWFACTION_GOTOEXPRESSION = 0x9F, + +/* v5 actions */ + SWFACTION_DELETEVAR = 0x3A,/*not used yet*/ + SWFACTION_DELETE = 0x3B, + SWFACTION_VAREQUALS = 0x3C, + SWFACTION_CALLFUNCTION = 0x3D, + SWFACTION_RETURN = 0x3E, + SWFACTION_MODULO = 0x3F, + SWFACTION_NEW = 0x40, + SWFACTION_VAR = 0x41, + SWFACTION_INITARRAY = 0x42, + SWFACTION_INITOBJECT = 0x43, + SWFACTION_TYPEOF = 0x44, + SWFACTION_TARGETPATH = 0x45, + SWFACTION_ENUMERATE = 0x46, + SWFACTION_NEWADD = 0x47, + SWFACTION_NEWLESSTHAN = 0x48, + SWFACTION_NEWEQUALS = 0x49, + SWFACTION_TONUMBER = 0x4A, + SWFACTION_TOSTRING = 0x4B, + SWFACTION_DUP = 0x4C, + SWFACTION_SWAP = 0x4D, + SWFACTION_GETMEMBER = 0x4E, + SWFACTION_SETMEMBER = 0x4F, + SWFACTION_INCREMENT = 0x50, + SWFACTION_DECREMENT = 0x51, + SWFACTION_CALLMETHOD = 0x52, + SWFACTION_NEWMETHOD = 0x53,/*not used yet*/ + SWFACTION_INSTANCEOF = 0x54, + SWFACTION_ENUM2 = 0x55,/*not used yet*/ + SWFACTION_BITWISEAND = 0x60, + SWFACTION_BITWISEOR = 0x61, + SWFACTION_BITWISEXOR = 0x62, + SWFACTION_SHIFTLEFT = 0x63, + SWFACTION_SHIFTRIGHT = 0x64, + SWFACTION_SHIFTRIGHT2 = 0x65, + SWFACTION_STRICTEQ = 0x66, + SWFACTION_CONSTANTPOOL = 0x88, + SWFACTION_WITH = 0x94, + SWFACTION_DEFINEFUNCTION = 0x9B, + + SWFACTION_SETREGISTER = 0x87 +}; + +#endif /* SWF_COMPILER_ACTION_H_INCLUDED */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c b/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c new file mode 100644 index 000000000..9edc59046 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c @@ -0,0 +1,102 @@ +/* + Ming, an SWF output library + Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include + +#include "libming.h" +#include "compile.h" +#include "action.h" + +#include "actioncompiler.h" + +static void print_error(const char*format,...) +{ + char buf[1024]; + int len; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + + len = strlen(buf); + while(len>0 && buf[len-1]=='\n') len--; + buf[len] = '\n'; + buf[len+1] = 0; + fprintf(stderr, "error: %s", buf); +} + +static void print_warn(const char*format,...) +{ + char buf[1024]; + int len; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + + len = strlen(buf); + while(len>0 && buf[len-1]=='\n') len--; + buf[len] = '\n'; + buf[len+1] = 0; + printf("%s", buf); + fprintf(stderr, "warning: %s", buf); +} + +int compileSWFActionCode(const char *script, int version, void**data, int*len) +{ + Buffer b; + + *data = 0; + *len = 0; + + SWF_versionNum = version; + if(!SWF_error) + SWF_error = print_error; + if(!SWF_warn) + SWF_warn = print_warn; + + /* yydebug = 1; */ + + if(version == 4) + { + swf4ParseInit(script, 0); + + if(swf4parse((void *)&b) != 0) + return 0; + } + else + { + swf5ParseInit(script, 0); + + if(swf5parse((void *)&b) != 0) + return 0; + } + + *data = b->buffer; + *len = bufferLength(b); + + //destroyBuffer(b); + free(b); + + return 1; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h b/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h new file mode 100644 index 000000000..30da45f11 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h @@ -0,0 +1,7 @@ +#ifndef __actioncompiler_h__ +#define __actioncompiler_h__ + +int compileSWFActionCode(const char *script, int version, void**data, int*len); + +#endif + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c b/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c new file mode 100644 index 000000000..8526e9990 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c @@ -0,0 +1,131 @@ +/* + Ming, an SWF output library + Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include "assembler.h" +#include "compile.h" +#include "action.h" + + +int len; +Buffer asmBuffer; +int nLabels; + +struct label +{ + char *name; + int offset; +}; + +struct label labels[256]; + + +static int +findLabel(char *label) +{ + int i; + + for ( i=0; ibuffer; + + while ( i < len ) + { + if ( output[i] & 0x80 ) /* then it's a multibyte instruction */ + { + if ( output[i] == SWFACTION_BRANCHALWAYS || + output[i] == SWFACTION_BRANCHIFTRUE ) + { + int target, offset; + + i += 3; /* plus instruction plus two-byte length */ + + target = output[i]; + offset = labels[target].offset - (i+2); + output[i] = offset & 0xff; + output[++i] = (offset>>8) & 0xff; + ++i; + } + else + { + ++i; + l = output[i]; + ++i; + l += output[i]<<8; + + i += l+1; + } + } + else + ++i; + } +} + + +/* + * Local variables: + * tab-width: 2 + * c-basic-offset: 2 + * End: + */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h b/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h new file mode 100644 index 000000000..e1fdd2a67 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h @@ -0,0 +1,21 @@ +/* assembler.h + * + * $Id: assembler.h,v 1.1 2004/05/08 17:11:33 kramm Exp $ + * + * Notice: This header file contains declarations of functions and types that + * are just used internally. All library functions and types that are supposed + * to be publicly accessable are defined in ./src/ming.h. + */ + +#ifndef SWF_ASSEMBLER_H_INCLUDED +#define SWF_ASSEMBLER_H_INCLUDED + +#include "ming.h" +#include "compile.h" + +extern Buffer asmBuffer; + +void bufferPatchLength(Buffer buffer, int len); +int bufferBranchTarget(Buffer buffer, char *label); + +#endif /* SWF_ASSEMBLER_H_INCLUDED */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/blocks/error.h b/fluidbook/tools/swftools-special-swfdump/lib/action/blocks/error.h new file mode 100644 index 000000000..e69de29bb diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/compile.c b/fluidbook/tools/swftools-special-swfdump/lib/action/compile.c new file mode 100644 index 000000000..b658dd2ee --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/compile.c @@ -0,0 +1,786 @@ +/* + Ming, an SWF output library + Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef WIN32 + #include +#endif + +#include +#include +#include +#include + +#include "libming.h" +#include "compile.h" +#include "action.h" +#include "blocks/error.h" + + +static int nConstants = {0}, maxConstants = {0}, sizeConstants = {0}; +static char **constants; + +/* XXX - temp hack until we check at compile time */ + +enum +{ + SWF_BIG_ENDIAN, + SWF_LITTLE_ENDIAN +}; + +static int byteorder; + +void checkByteOrder() +{ + unsigned int x; + unsigned char *p; + + x = 0x01020304; + p = (unsigned char *)&x; + + if(*p == 1) + byteorder = SWF_BIG_ENDIAN; + else + byteorder = SWF_LITTLE_ENDIAN; +} + + +char *stringConcat(char *a, char *b) +{ + if ( a != NULL ) + { + if ( b != NULL ) + { + a = (char*)realloc(a, strlen(a)+strlen(b)+1); + strcat(a, b); + free(b); + } + + return a; + } + else + return b; +} + +void bufferPatchLength(Buffer buffer, int back) +{ + unsigned char *output = buffer->buffer; + int len = bufferLength(buffer); + + output[len-back-1] = (back>>8) & 0xff; + output[len-back-2] = back & 0xff; +} + + +/* add len more bytes to length of the pushdata opcode pointed to by + buffer->pushloc */ + +void bufferPatchPushLength(Buffer buffer, int len) +{ + int oldsize; + + if(buffer->pushloc != NULL) + { + oldsize = (buffer->pushloc[0] & 0xff) | ((buffer->pushloc[1] & 0xff) << 8); + oldsize += len; + buffer->pushloc[0] = oldsize & 0xff; + buffer->pushloc[1] = (oldsize >> 8) & 0xff; + } + else + SWF_error("problem with bufferPatchPushLength\n"); +} + + +static int useConstants = 1; +void Ming_useConstants(int flag) +{ useConstants = flag; +} + + +int addConstant(const char *s) +{ + int i; + + for(i=0; i MAXCONSTANTPOOLSIZE ) return -1; + + if(nConstants == maxConstants) + constants = (char **) realloc(constants, (maxConstants += 64) * sizeof(char *)); + constants[nConstants] = strdup(s); + sizeConstants += (strlen(s)+1); + return nConstants++; +} + +int bufferWriteConstants(Buffer out) +{ + int i, len=2; + + if(nConstants == 0) + return 0; + + bufferWriteU8(out, SWFACTION_CONSTANTPOOL); + bufferWriteS16(out, 0); /* length */ + bufferWriteS16(out, nConstants); + + for(i=0; ibuffer = (byte*)malloc(BUFFER_INCREMENT); + out->pos = out->buffer; + *(out->pos) = 0; + out->buffersize = out->free = BUFFER_INCREMENT; + out->pushloc = NULL; + + return out; +} + +void destroyBuffer(Buffer out) +{ + free(out->buffer); + free(out); +} + +int bufferLength(Buffer out) +{ + if(out) + return (out->pos)-(out->buffer); + else + return 0; +} + +/* make sure there's enough space for bytes bytes */ +void bufferCheckSize(Buffer out, int bytes) +{ + if(bytes > out->free) + { + int New = BUFFER_INCREMENT * ((bytes-out->free-1)/BUFFER_INCREMENT + 1); + + int num = bufferLength(out); /* in case buffer gets displaced.. */ + unsigned char *newbuf = (unsigned char*)realloc(out->buffer, out->buffersize+New); + + if(newbuf != out->buffer) + { + int pushd; + + if(out->pushloc) + pushd = out->pos - out->pushloc; + + out->pos = newbuf+num; + + if(out->pushloc) + out->pushloc = out->pos - pushd; + } + + out->buffer = newbuf; + out->buffersize += New; + out->free += New; + } +} + +int bufferWriteData(Buffer b, const byte *data, int length) +{ + int i; + + bufferCheckSize(b, length); + + for(i=0; ibuffer, bufferLength(b)); + + return 0; +} + +/* if a's last op and b's first op are both PUSHDATA, concat into one op */ + +int bufferWriteDataAndPush(Buffer a, Buffer b) +{ + int i, pushd; + + byte *data = b->buffer; + int length = b->pos - b->buffer; + + if(a->pushloc && (b->buffer[0] == SWFACTION_PUSHDATA) && SWF_versionNum > 4) + { + pushd = (b->buffer[1] & 0xff) | ((b->buffer[2] & 0xff) << 8); + bufferPatchPushLength(a, pushd); + data += 3; + length -= 3; + } + + if(b->pushloc) + pushd = b->pos - b->pushloc; + + bufferCheckSize(a, length); + + for(i=0; ipushloc && + (b->buffer[0] == SWFACTION_PUSHDATA) && (b->pushloc == b->buffer+1)) + ; /* b is just one pushdata, so do nothing.. */ + else if(b->pushloc) + a->pushloc = a->pos - pushd; + else + a->pushloc = 0; + + return length; +} + +int bufferConcat(Buffer a, Buffer b) +{ + int len; + + if(!a) + return 0; + + if(b) + { len = bufferWriteDataAndPush(a, b); + destroyBuffer(b); + } + + return len; +} + +int bufferWriteOp(Buffer out, int data) +{ + bufferWriteU8(out, data); + out->pushloc = NULL; + + return 1; +} + +int bufferWritePushOp(Buffer out) +{ + bufferWriteU8(out, SWFACTION_PUSHDATA); + out->pushloc = out->pos; + + return 1; +} + +int bufferWriteU8(Buffer out, int data) +{ + bufferCheckSize(out, 1); + *(out->pos) = data; + out->pos++; + out->free--; + + return 1; +} + +int bufferWriteS16(Buffer out, int data) +{ + if(data < 0) + data = (1<<16)+data; + + bufferWriteU8(out, data%256); + data >>= 8; + bufferWriteU8(out, data%256); + + return 2; +} + +int bufferWriteHardString(Buffer out, byte *string, int length) +{ + int i; + + for(i=0; ipushloc == NULL) + { + bufferWritePushOp(out); + bufferWriteS16(out, 0); + } + + l = bufferWriteConstantString(out, string, length); + + bufferPatchPushLength(out, l); + return l; + } +} + +int bufferWriteInt(Buffer out, int i) +{ + int len = 0; + unsigned char *p = (unsigned char *)&i; + + if(out->pushloc == NULL || SWF_versionNum < 5) + { + len = 3; + bufferWritePushOp(out); + bufferWriteS16(out, 5); + } + else + bufferPatchPushLength(out, 5); + + bufferWriteU8(out, PUSH_INT); + + if(byteorder == SWF_LITTLE_ENDIAN) + { + bufferWriteU8(out, p[0]); + bufferWriteU8(out, p[1]); + bufferWriteU8(out, p[2]); + bufferWriteU8(out, p[3]); + } + else + { + bufferWriteU8(out, p[3]); + bufferWriteU8(out, p[2]); + bufferWriteU8(out, p[1]); + bufferWriteU8(out, p[0]); + } + + return len + 5; +} + +int bufferWriteDouble(Buffer out, double d) +{ + int len = 0; + unsigned char *p = (unsigned char *)&d; + + if(out->pushloc == NULL || SWF_versionNum < 5) + { + len = 3; + bufferWritePushOp(out); + bufferWriteS16(out, 9); + } + else + bufferPatchPushLength(out, 5); + + bufferWriteU8(out, PUSH_DOUBLE); + + if(byteorder == SWF_LITTLE_ENDIAN) + { + bufferWriteU8(out, p[4]); + bufferWriteU8(out, p[5]); + bufferWriteU8(out, p[6]); + bufferWriteU8(out, p[7]); + bufferWriteU8(out, p[0]); + bufferWriteU8(out, p[1]); + bufferWriteU8(out, p[2]); + bufferWriteU8(out, p[3]); + } + else + { + bufferWriteU8(out, p[3]); + bufferWriteU8(out, p[2]); + bufferWriteU8(out, p[1]); + bufferWriteU8(out, p[0]); + bufferWriteU8(out, p[7]); + bufferWriteU8(out, p[6]); + bufferWriteU8(out, p[5]); + bufferWriteU8(out, p[4]); + } + + return len + 9; +} + +int bufferWriteNull(Buffer out) +{ + int len = 0; + + if(out->pushloc == NULL || SWF_versionNum < 5) + { + len = 3; + bufferWritePushOp(out); + bufferWriteS16(out, 1); + } + else + bufferPatchPushLength(out, 1); + + bufferWriteU8(out, PUSH_NULL); + + return len + 1; +} + +int bufferWriteBoolean(Buffer out, int val) +{ + int len = 0; + + if(out->pushloc == NULL || SWF_versionNum < 5) + { + len = 3; + bufferWritePushOp(out); + bufferWriteS16(out, 2); + } + else + bufferPatchPushLength(out, 2); + + bufferWriteU8(out, PUSH_BOOLEAN); + bufferWriteU8(out, val ? 1 : 0); + + return len + 2; +} + +int bufferWriteRegister(Buffer out, int num) +{ + int len = 0; + + if(out->pushloc == NULL || SWF_versionNum < 5) + { + len = 3; + bufferWritePushOp(out); + bufferWriteS16(out, 2); + } + else + bufferPatchPushLength(out, 2); + + bufferWriteU8(out, PUSH_REGISTER); + bufferWriteU8(out, num); + + return len + 2; +} + +int bufferWriteSetRegister(Buffer out, int num) +{ + bufferWriteU8(out, SWFACTION_SETREGISTER); + bufferWriteS16(out, 1); + bufferWriteU8(out, num); + return 4; +} + +void lower(char *s) +{ + while(*s) + { + *s = tolower(*s); + ++s; + } +} + +/* this code will eventually help to pop extra values off the + stack and make sure that continue and break address the proper + context + */ +static enum ctx *ctx_stack = {0}; +static int ctx_count = {0}, ctx_len = {0}; +void addctx(enum ctx val) +{ if(ctx_count >= ctx_len) + ctx_stack = (enum ctx*) realloc(ctx_stack, (ctx_len += 10) * sizeof(enum ctx)); + ctx_stack[ctx_count++] = val; +} +void delctx(enum ctx val) +{ if(ctx_count <= 0 || ctx_stack[--ctx_count] != val) + SWF_error("consistency check in delctx"); +} + +int chkctx(enum ctx val) +{ int n, ret = 0; + switch(val) + { case CTX_FUNCTION: + for(n = ctx_count ; --n >= 0 ; ) + switch(ctx_stack[n]) + { case CTX_SWITCH: + case CTX_FOR_IN: + ret++; + break; + case CTX_FUNCTION: + return ret; + default: ; /* computers are stupid */ + } + return -1; + case CTX_BREAK: + for(n = ctx_count ; --n >= 0 ; ) + switch(ctx_stack[n]) + { case CTX_SWITCH: + case CTX_LOOP: + return 0; + case CTX_FOR_IN: + return 1; + case CTX_FUNCTION: + return -1; + default: ; /* computers are stupid */ + } + case CTX_CONTINUE: + for(n = ctx_count ; --n >= 0 ; ) + switch(ctx_stack[n]) + { case CTX_LOOP: + case CTX_FOR_IN: + return 0; + case CTX_FUNCTION: + return -1; + default: ; /* computers are stupid */ + } + default: ; /* computers are stupid */ + } + return 0; +} + +/* replace MAGIC_CONTINUE_NUMBER and MAGIC_BREAK_NUMBER with jumps to + head or tail, respectively */ +/* jump offset is relative to end of jump instruction */ +/* I can't believe this actually worked */ + +void bufferResolveJumps(Buffer out) +{ + byte *p = out->buffer; + int l, target; + + while(p < out->pos) + { + if(*p & 0x80) /* then it's a multibyte instruction */ + { + if(*p == SWFACTION_BRANCHALWAYS) + { + p += 3; /* plus instruction plus two-byte length */ + + if(*p == MAGIC_CONTINUE_NUMBER_LO && + *(p+1) == MAGIC_CONTINUE_NUMBER_HI) + { + target = out->buffer - (p+2); + *p = target & 0xff; + *(p+1) = (target>>8) & 0xff; + } + else if(*p == MAGIC_BREAK_NUMBER_LO && + *(p+1) == MAGIC_BREAK_NUMBER_HI) + { + target = out->pos - (p+2); + *p = target & 0xff; + *(p+1) = (target>>8) & 0xff; + } + + p += 2; + } + else + { + ++p; + l = *p; + ++p; + l += *p<<8; + ++p; + + p += l; + } + } + else + ++p; + } +} + +// handle SWITCH statement + +void bufferResolveSwitch(Buffer buffer, struct switchcases *slp) +{ struct switchcase *scp; + int n, len; + unsigned char *output; + + len = bufferLength(buffer); + for(n = 0, scp = slp->list ; n < slp->count ; n++, scp++) + { scp->actlen = bufferLength(scp->action); + if((n < slp->count-1)) + scp->actlen += 5; + if(scp->cond) + { scp->condlen = bufferLength(scp->cond) + 8; + bufferWriteOp(buffer, SWFACTION_DUP); + bufferConcat(buffer, scp->cond); + bufferWriteOp(buffer, SWFACTION_NEWEQUALS); + bufferWriteOp(buffer, SWFACTION_LOGICALNOT); + bufferWriteOp(buffer, SWFACTION_BRANCHIFTRUE); + bufferWriteS16(buffer, 2); + bufferWriteS16(buffer, scp->actlen); + } + else + scp->condlen = 0; + bufferConcat(buffer, scp->action); + bufferWriteOp(buffer, SWFACTION_BRANCHALWAYS); + bufferWriteS16(buffer, 2); + bufferWriteS16(buffer, scp->isbreak ? MAGIC_BREAK_NUMBER : 0); + if(!scp->cond) + { slp->count = n+1; + break; + } + } + for(n = 0, scp = slp->list ; n < slp->count ; n++, scp++) + { len += scp->condlen; + output = buffer->buffer + len; + if((n < slp->count-1) && !scp->isbreak) + { output[scp->actlen-2] = (scp+1)->condlen & 0xff; + output[scp->actlen-1] = (scp+1)->condlen >> 8; + } + len += scp->actlen; + } +} + +int lookupSetProperty(char *string) +{ + lower(string); + + if(strcmp(string,"x")==0) return 0x0000; + if(strcmp(string,"y")==0) return 0x3f80; + if(strcmp(string,"xscale")==0) return 0x4000; + if(strcmp(string,"yscale")==0) return 0x4040; + if(strcmp(string,"alpha")==0) return 0x40c0; + if(strcmp(string,"visible")==0) return 0x40e0; + if(strcmp(string,"rotation")==0) return 0x4120; + if(strcmp(string,"name")==0) return 0x4140; + if(strcmp(string,"quality")==0) return 0x4180; + if(strcmp(string,"focusrect")==0) return 0x4188; + if(strcmp(string,"soundbuftime")==0) return 0x4190; + + SWF_error("No such property: %s\n", string); + return -1; +} + +int bufferWriteSetProperty(Buffer out, char *string) +{ + int property = lookupSetProperty(string); + + bufferWriteU8(out, SWFACTION_PUSHDATA); + bufferWriteS16(out, 5); + bufferWriteU8(out, PUSH_PROPERTY); + bufferWriteS16(out, 0); + bufferWriteS16(out, property); + + return 8; +} + +int bufferWriteWTHITProperty(Buffer out) +{ + bufferWriteU8(out, SWFACTION_PUSHDATA); + bufferWriteS16(out, 5); + bufferWriteU8(out, PUSH_PROPERTY); + bufferWriteS16(out, 0); + bufferWriteS16(out, 0x4680); + + return 8; +} + +const char *lookupGetProperty(char *string) +{ + lower(string); + + if(strcmp(string,"x")==0) return "0"; + if(strcmp(string,"y")==0) return "1"; + if(strcmp(string,"xscale")==0) return "2"; + if(strcmp(string,"yscale")==0) return "3"; + if(strcmp(string,"currentframe")==0) return "4"; + if(strcmp(string,"totalframes")==0) return "5"; + if(strcmp(string,"alpha")==0) return "6"; + if(strcmp(string,"visible")==0) return "7"; + if(strcmp(string,"width")==0) return "8"; + if(strcmp(string,"height")==0) return "9"; + if(strcmp(string,"rotation")==0) return "10"; + if(strcmp(string,"target")==0) return "11"; + if(strcmp(string,"framesloaded")==0) return "12"; + if(strcmp(string,"name")==0) return "13"; + if(strcmp(string,"droptarget")==0) return "14"; + if(strcmp(string,"url")==0) return "15"; + if(strcmp(string,"quality")==0) return "16"; + if(strcmp(string,"focusrect")==0) return "17"; + if(strcmp(string,"soundbuftime")==0) return "18"; + + SWF_error("No such property: %s\n", string); + return ""; +} + +int bufferWriteGetProperty(Buffer out, char *string) +{ + const char *property = lookupGetProperty(string); + + bufferWriteU8(out, SWFACTION_PUSHDATA); + bufferWriteS16(out, strlen(property)+2); + bufferWriteU8(out, PUSH_STRING); + + return 4 + bufferWriteData(out, (byte*) property, strlen(property)+1); +} + + +/* + * Local variables: + * tab-width: 2 + * c-basic-offset: 2 + * End: + */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/compile.h b/fluidbook/tools/swftools-special-swfdump/lib/action/compile.h new file mode 100644 index 000000000..3f3f1d441 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/compile.h @@ -0,0 +1,163 @@ +/* compile.h + * + * $Id: compile.h,v 1.1 2004/05/08 17:14:20 kramm Exp $ + * + * Notice: This header file contains declarations of functions and types that + * are just used internally. All library functions and types that are supposed + * to be publicly accessable are defined in ./src/ming.h. + */ + +#ifndef SWF_COMPILE_H_INCLUDED +#define SWF_COMPILE_H_INCLUDED + +#include "ming.h" + +typedef struct _buffer *Buffer; + +/* shut up bison.simple */ +void yyerror(char *msg); +int yylex(); + +#ifndef max + #define max(x,y) (((x)>(y))?(x):(y)) +#endif + +enum +{ + PUSH_STRING = 0, + PUSH_PROPERTY = 1, + PUSH_NULL = 2, + PUSH_UNDEF = 3, + PUSH_REGISTER = 4, + PUSH_BOOLEAN = 5, + PUSH_DOUBLE = 6, + PUSH_INT = 7, + PUSH_CONSTANT = 8, + PUSH_CONSTANT16 = 9 +}; + +typedef enum +{ + FUNCTION_RANDOM, + FUNCTION_LENGTH, + FUNCTION_TIME, + FUNCTION_INT, + FUNCTION_CONCAT, + FUNCTION_DUPLICATECLIP +} SWFActionFunction; + +typedef enum +{ + GETURL_METHOD_NOSEND = 0, + GETURL_METHOD_GET = 1, + GETURL_METHOD_POST = 2 +} SWFGetUrl2Method; + +#define GETURL_LOADMOVIE 0x40 +#define GETURL_LOADVARIABLES 0x80 + +#define MAGIC_CONTINUE_NUMBER 0x7FFE +#define MAGIC_BREAK_NUMBER 0x7FFF + +#define MAGIC_CONTINUE_NUMBER_LO 0xFE +#define MAGIC_CONTINUE_NUMBER_HI 0x7F +#define MAGIC_BREAK_NUMBER_LO 0xFF +#define MAGIC_BREAK_NUMBER_HI 0x7F + +#define BUFFER_INCREMENT 128 + +struct _buffer +{ + byte *buffer; + byte *pos; + int buffersize; + int free; + byte *pushloc; +}; + +#define BUFFER_SIZE sizeof(struct _buffer) + +struct switchcase +{ Buffer cond, action; + int condlen, actlen, isbreak; +}; + +struct switchcases +{ + struct switchcase *list; + int count; +}; + +enum ctx +{ + CTX_FUNCTION = 1, + CTX_LOOP, + CTX_FOR_IN, + CTX_SWITCH, + + CTX_BREAK, + CTX_CONTINUE +}; + +void addctx(enum ctx val); +void delctx(enum ctx val); +int chkctx(enum ctx val); + +void checkByteOrder(); + +/* create/destroy buffer object */ +Buffer newBuffer(); +void destroyBuffer(Buffer out); +int bufferConcat(Buffer a, Buffer b); /* destroys b. */ +int bufferWriteBuffer(Buffer a, Buffer b); /* doesn't. */ + +/* utilities for writing */ +void bufferGrow(Buffer out); +void bufferCheckSize(Buffer out, int bytes); + +int bufferLength(Buffer out); + +/* constant pool stuff */ +int addConstant(const char *s); +int bufferWriteConstants(Buffer out); +#define MAXCONSTANTPOOLSIZE 65533 + +/* write data to buffer */ +int bufferWriteOp(Buffer out, int data); +int bufferWritePushOp(Buffer out); +int bufferWriteU8(Buffer out, int data); +int bufferWriteS16(Buffer out, int data); +int bufferWriteData(Buffer out, const byte *buffer, int bytes); +int bufferWriteHardString(Buffer out, byte *string, int length); +int bufferWriteConstantString(Buffer out, byte *string, int length); +int bufferWriteString(Buffer out, byte *string, int length); +#ifdef __cplusplus +/* helper function to avoid many casts */ +inline int bufferWriteString(Buffer out, char *string, int length) { + return bufferWriteString(out,(byte*) string, length); } +#endif +int bufferWriteInt(Buffer out, int i); +int bufferWriteDouble(Buffer out, double d); +int bufferWriteNull(Buffer out); +int bufferWriteBoolean(Buffer out, int val); +int bufferWriteRegister(Buffer out, int num); +int bufferWriteSetRegister(Buffer out, int num); +int bufferWriteGetProperty(Buffer out, char *string); +int bufferWriteSetProperty(Buffer out, char *string); +int bufferWriteWTHITProperty(Buffer out); + +/* concat b to a, destroy b */ +char *stringConcat(char *a, char *b); + +/* resolve magic number standins to relative offsets */ +void bufferResolveJumps(Buffer out); +void bufferResolveSwitch(Buffer buffer, struct switchcases *slp); + +/* rather than setting globals... */ +void swf4ParseInit(const char *string, int debug); +void swf5ParseInit(const char *string, int debug); + +int swf4parse(void *b); +int swf5parse(void *b); + +#endif /* SWF_COMPILE_H_INCLUDED */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c b/fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c new file mode 100644 index 000000000..4eb81d8db --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c @@ -0,0 +1,2828 @@ + +#line 3 "lex.swf4.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define yy_create_buffer swf4_create_buffer +#define yy_delete_buffer swf4_delete_buffer +#define yy_flex_debug swf4_flex_debug +#define yy_init_buffer swf4_init_buffer +#define yy_flush_buffer swf4_flush_buffer +#define yy_load_buffer_state swf4_load_buffer_state +#define yy_switch_to_buffer swf4_switch_to_buffer +#define yyin swf4in +#define yyleng swf4leng +#define yylex swf4lex +#define yylineno swf4lineno +#define yyout swf4out +#define yyrestart swf4restart +#define yytext swf4text +#define yywrap swf4wrap +#define yyalloc swf4alloc +#define yyrealloc swf4realloc +#define yyfree swf4free + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE swf4restart(swf4in ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int swf4leng; + +extern FILE *swf4in, *swf4out; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up swf4text. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up swf4text again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via swf4restart()), so that the user can continue scanning by + * just pointing swf4in at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when swf4text is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int swf4leng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow swf4wrap()'s to do buffer switches + * instead of setting up a fresh swf4in. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void swf4restart (FILE *input_file ); +void swf4_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE swf4_create_buffer (FILE *file,int size ); +void swf4_delete_buffer (YY_BUFFER_STATE b ); +void swf4_flush_buffer (YY_BUFFER_STATE b ); +void swf4push_buffer_state (YY_BUFFER_STATE new_buffer ); +void swf4pop_buffer_state (void ); + +static void swf4ensure_buffer_stack (void ); +static void swf4_load_buffer_state (void ); +static void swf4_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER swf4_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE swf4_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE swf4_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE swf4_scan_bytes (yyconst char *bytes,int len ); + +void *swf4alloc (yy_size_t ); +void *swf4realloc (void *,yy_size_t ); +void swf4free (void * ); + +#define yy_new_buffer swf4_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + swf4ensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + swf4_create_buffer(swf4in,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + swf4ensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + swf4_create_buffer(swf4in,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *swf4in = (FILE *) 0, *swf4out = (FILE *) 0; + +typedef int yy_state_type; + +extern int swf4lineno; + +int swf4lineno = 1; + +extern char *swf4text; +#define yytext_ptr swf4text + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up swf4text. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + swf4leng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 95 +#define YY_END_OF_BUFFER 96 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[320] = + { 0, + 0, 0, 96, 94, 56, 93, 94, 82, 94, 79, + 94, 83, 84, 80, 77, 89, 78, 90, 81, 1, + 92, 75, 59, 76, 60, 91, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 85, 86, 87, 94, 88, 93, 64, + 0, 52, 50, 0, 65, 0, 53, 51, 0, 67, + 57, 69, 58, 70, 74, 0, 54, 48, 55, 68, + 48, 2, 1, 61, 63, 62, 0, 47, 47, 47, + 47, 47, 11, 47, 47, 47, 47, 47, 47, 47, + 9, 47, 47, 47, 47, 47, 47, 47, 47, 47, + + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 66, 72, 48, 48, 2, 73, 71, 49, + 49, 47, 47, 24, 47, 47, 47, 47, 8, 47, + 33, 47, 16, 47, 47, 47, 47, 23, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 49, 49, 47, 47, 47, + 47, 47, 7, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 37, 32, 47, 47, 47, 47, 47, 38, + 47, 47, 46, 14, 47, 47, 3, 47, 47, 5, + 47, 47, 47, 47, 4, 47, 47, 47, 47, 47, + + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 20, 47, 10, 47, 17, + 47, 47, 47, 47, 26, 47, 47, 15, 47, 47, + 47, 34, 47, 13, 47, 47, 47, 47, 47, 30, + 47, 47, 47, 47, 47, 47, 47, 47, 27, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 12, 47, 6, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 22, 47, 47, + 47, 25, 47, 47, 47, 47, 41, 28, 47, 35, + 36, 47, 44, 21, 47, 47, 47, 47, 47, 47, + + 47, 47, 19, 40, 45, 47, 47, 43, 31, 42, + 47, 47, 47, 47, 47, 18, 29, 39, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 5, 6, 1, 1, 1, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, + 17, 17, 17, 17, 17, 17, 17, 19, 20, 21, + 22, 23, 24, 1, 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, 34, + 50, 51, 52, 1, 34, 1, 53, 54, 55, 56, + + 57, 58, 59, 60, 61, 34, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 34, 77, 78, 79, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[80] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 3, 4, 5, 5, 1, 1, + 1, 2, 1, 1, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, + 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 1, 1, 1 + } ; + +static yyconst flex_int16_t yy_base[327] = + { 0, + 0, 0, 878, 879, 879, 879, 874, 854, 77, 868, + 78, 879, 879, 852, 70, 879, 71, 72, 79, 81, + 879, 879, 851, 850, 849, 879, 854, 68, 81, 73, + 75, 91, 86, 84, 107, 111, 89, 139, 137, 138, + 164, 110, 116, 879, 879, 879, 791, 879, 879, 846, + 118, 153, 879, 864, 879, 100, 162, 879, 863, 879, + 879, 879, 879, 879, 849, 176, 879, 156, 879, 879, + 844, 167, 171, 836, 828, 879, 817, 815, 183, 184, + 185, 191, 814, 195, 198, 200, 201, 206, 202, 207, + 811, 216, 199, 223, 210, 212, 233, 228, 222, 250, + + 229, 234, 253, 261, 226, 259, 241, 256, 272, 280, + 274, 268, 879, 879, 809, 807, 291, 879, 879, 296, + 806, 288, 283, 805, 290, 299, 307, 300, 803, 302, + 310, 305, 800, 316, 312, 314, 322, 798, 332, 340, + 326, 337, 341, 343, 344, 333, 347, 338, 351, 362, + 367, 376, 373, 360, 379, 797, 796, 381, 380, 393, + 390, 396, 795, 404, 406, 408, 411, 409, 412, 428, + 424, 420, 794, 793, 429, 425, 432, 444, 431, 456, + 450, 452, 788, 779, 454, 457, 778, 477, 479, 776, + 473, 460, 433, 484, 773, 491, 493, 494, 487, 502, + + 503, 504, 463, 506, 512, 508, 521, 517, 513, 525, + 522, 533, 531, 535, 540, 769, 545, 753, 551, 712, + 549, 562, 550, 546, 101, 564, 577, 676, 563, 580, + 582, 675, 585, 670, 579, 574, 587, 592, 567, 648, + 598, 602, 607, 609, 603, 608, 625, 615, 645, 626, + 610, 635, 638, 611, 639, 641, 653, 637, 664, 643, + 667, 642, 612, 668, 529, 672, 678, 647, 669, 684, + 686, 693, 691, 695, 703, 696, 706, 497, 705, 701, + 719, 465, 711, 726, 715, 729, 439, 436, 723, 421, + 388, 731, 372, 353, 735, 737, 734, 740, 746, 741, + + 744, 752, 275, 267, 218, 763, 768, 203, 163, 158, + 771, 747, 759, 764, 757, 145, 93, 88, 879, 834, + 840, 845, 848, 851, 855, 858 + } ; + +static yyconst flex_int16_t yy_def[327] = + { 0, + 319, 1, 319, 319, 319, 319, 319, 319, 320, 319, + 321, 319, 319, 319, 319, 319, 319, 319, 322, 319, + 319, 319, 319, 319, 319, 319, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 319, 319, 319, 319, 319, 319, 319, + 320, 320, 319, 320, 319, 321, 321, 319, 321, 319, + 319, 319, 319, 319, 319, 322, 319, 319, 319, 319, + 324, 319, 319, 319, 319, 319, 325, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 319, 319, 319, 324, 319, 319, 319, 319, + 326, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 319, 326, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 0, 319, + 319, 319, 319, 319, 319, 319 + } ; + +static yyconst flex_int16_t yy_nxt[959] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 27, 34, 27, 27, 35, 27, 36, 37, 38, + 27, 39, 40, 41, 27, 42, 43, 27, 27, 44, + 4, 45, 27, 28, 29, 30, 31, 32, 33, 27, + 34, 27, 35, 27, 36, 37, 38, 27, 39, 40, + 41, 27, 42, 43, 27, 27, 46, 47, 48, 52, + 57, 61, 53, 77, 63, 58, 65, 66, 77, 67, + 77, 62, 64, 68, 69, 72, 77, 73, 73, 77, + + 70, 77, 57, 77, 77, 80, 77, 58, 77, 79, + 85, 83, 81, 91, 89, 86, 77, 84, 249, 82, + 52, 92, 77, 53, 90, 77, 77, 54, 59, 87, + 97, 77, 88, 80, 111, 93, 79, 85, 83, 95, + 81, 91, 89, 86, 84, 94, 82, 112, 92, 96, + 59, 90, 77, 77, 77, 52, 87, 97, 53, 88, + 77, 101, 111, 93, 57, 102, 103, 95, 54, 58, + 115, 66, 94, 77, 98, 112, 96, 99, 77, 77, + 100, 104, 105, 117, 117, 72, 319, 73, 73, 101, + 68, 319, 106, 102, 103, 107, 108, 319, 77, 77, + + 77, 98, 109, 54, 99, 110, 77, 100, 104, 105, + 77, 122, 59, 77, 77, 77, 77, 77, 77, 123, + 106, 77, 77, 107, 108, 77, 124, 77, 125, 109, + 130, 77, 110, 77, 126, 128, 134, 77, 77, 122, + 127, 77, 129, 77, 77, 131, 123, 135, 77, 77, + 132, 147, 139, 124, 137, 125, 77, 136, 130, 133, + 138, 126, 128, 134, 140, 77, 142, 127, 77, 129, + 143, 77, 131, 149, 77, 135, 77, 132, 141, 147, + 139, 137, 77, 77, 136, 145, 133, 77, 138, 77, + 77, 140, 150, 142, 148, 77, 144, 143, 77, 146, + + 155, 149, 151, 77, 152, 77, 141, 117, 117, 154, + 156, 77, 158, 145, 77, 77, 160, 77, 159, 150, + 77, 148, 77, 144, 153, 77, 146, 77, 155, 77, + 151, 77, 152, 161, 162, 163, 154, 77, 165, 170, + 158, 77, 164, 168, 160, 159, 169, 77, 77, 166, + 172, 153, 77, 77, 167, 77, 77, 171, 77, 77, + 161, 162, 77, 163, 176, 165, 77, 170, 77, 164, + 168, 175, 180, 182, 169, 77, 166, 77, 172, 177, + 173, 167, 77, 174, 171, 179, 178, 77, 77, 181, + 184, 77, 176, 183, 77, 77, 77, 185, 175, 180, + + 182, 187, 186, 77, 188, 77, 177, 173, 77, 191, + 174, 77, 179, 178, 189, 190, 181, 192, 184, 77, + 183, 77, 193, 77, 77, 185, 77, 77, 194, 187, + 186, 188, 195, 199, 196, 77, 77, 191, 200, 77, + 77, 189, 190, 77, 77, 192, 77, 77, 77, 197, + 193, 77, 198, 204, 77, 201, 194, 205, 206, 77, + 195, 199, 196, 207, 202, 77, 200, 77, 209, 77, + 221, 77, 77, 203, 210, 77, 197, 208, 77, 198, + 77, 204, 201, 211, 205, 216, 206, 230, 77, 215, + 207, 202, 77, 213, 77, 214, 209, 221, 212, 77, + + 203, 210, 77, 220, 208, 217, 77, 218, 77, 77, + 222, 211, 77, 216, 219, 230, 215, 77, 77, 77, + 213, 77, 214, 77, 226, 212, 223, 77, 77, 225, + 220, 224, 77, 217, 228, 218, 77, 77, 222, 232, + 77, 219, 229, 227, 77, 235, 77, 231, 77, 233, + 77, 226, 237, 223, 236, 77, 225, 234, 224, 241, + 77, 77, 228, 238, 77, 77, 77, 232, 242, 229, + 227, 239, 240, 235, 231, 244, 233, 77, 77, 77, + 237, 236, 77, 243, 234, 248, 246, 241, 247, 77, + 238, 250, 77, 245, 77, 77, 242, 77, 239, 240, + + 77, 251, 77, 244, 257, 256, 254, 77, 252, 255, + 243, 260, 248, 77, 246, 247, 259, 77, 77, 250, + 245, 253, 77, 77, 77, 77, 77, 77, 258, 251, + 77, 265, 257, 256, 254, 252, 263, 255, 260, 261, + 77, 77, 262, 268, 259, 264, 270, 273, 253, 267, + 77, 266, 77, 77, 77, 258, 77, 77, 77, 265, + 77, 277, 77, 77, 263, 269, 261, 271, 77, 262, + 272, 268, 264, 270, 273, 274, 275, 267, 266, 77, + 279, 276, 77, 77, 77, 77, 281, 77, 285, 277, + 77, 77, 269, 77, 278, 271, 282, 280, 272, 77, + + 283, 77, 274, 275, 286, 284, 77, 279, 77, 276, + 77, 77, 287, 281, 288, 285, 77, 289, 77, 290, + 77, 77, 278, 291, 282, 280, 77, 77, 283, 296, + 77, 286, 295, 284, 77, 292, 294, 298, 77, 293, + 287, 77, 288, 297, 77, 289, 77, 290, 302, 77, + 77, 291, 77, 301, 299, 77, 77, 296, 300, 77, + 295, 77, 77, 292, 294, 298, 293, 77, 77, 306, + 303, 297, 77, 308, 77, 307, 302, 304, 77, 77, + 305, 301, 299, 77, 77, 300, 77, 311, 77, 309, + 315, 77, 310, 77, 77, 312, 306, 303, 316, 314, + + 313, 308, 307, 77, 304, 318, 317, 305, 77, 77, + 77, 77, 77, 77, 311, 77, 309, 315, 77, 310, + 77, 77, 66, 312, 66, 316, 77, 314, 313, 77, + 77, 120, 318, 317, 51, 51, 51, 51, 51, 51, + 56, 56, 56, 56, 56, 56, 71, 71, 71, 119, + 71, 78, 78, 78, 116, 116, 116, 121, 118, 66, + 121, 157, 157, 157, 66, 319, 319, 114, 113, 77, + 76, 75, 74, 60, 55, 50, 49, 319, 3, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319 + } ; + +static yyconst flex_int16_t yy_chk[959] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, + 11, 15, 9, 28, 17, 11, 18, 18, 30, 19, + 31, 15, 17, 19, 19, 20, 29, 20, 20, 34, + + 19, 33, 56, 318, 37, 29, 32, 56, 317, 28, + 31, 30, 29, 34, 33, 32, 225, 30, 225, 29, + 51, 34, 35, 51, 33, 42, 36, 9, 11, 32, + 37, 43, 32, 29, 42, 35, 28, 31, 30, 36, + 29, 34, 33, 32, 30, 35, 29, 43, 34, 36, + 56, 33, 39, 40, 38, 52, 32, 37, 52, 32, + 316, 39, 42, 35, 57, 39, 40, 36, 51, 57, + 68, 68, 35, 310, 38, 43, 36, 38, 309, 41, + 38, 40, 40, 72, 72, 73, 66, 73, 73, 39, + 66, 66, 41, 39, 40, 41, 41, 66, 79, 80, + + 81, 38, 41, 52, 38, 41, 82, 38, 40, 40, + 84, 79, 57, 85, 93, 86, 87, 89, 308, 80, + 41, 88, 90, 41, 41, 95, 81, 96, 82, 41, + 88, 92, 41, 305, 84, 86, 93, 99, 94, 79, + 85, 105, 87, 98, 101, 89, 80, 94, 97, 102, + 90, 105, 98, 81, 96, 82, 107, 95, 88, 92, + 97, 84, 86, 93, 99, 100, 101, 85, 103, 87, + 102, 108, 89, 107, 106, 94, 104, 90, 100, 105, + 98, 96, 304, 112, 95, 104, 92, 109, 97, 111, + 303, 99, 108, 101, 106, 110, 103, 102, 123, 104, + + 112, 107, 109, 122, 110, 125, 100, 117, 117, 111, + 120, 120, 122, 104, 126, 128, 125, 130, 123, 108, + 132, 106, 127, 103, 110, 131, 104, 135, 112, 136, + 109, 134, 110, 125, 126, 127, 111, 137, 130, 135, + 122, 141, 128, 132, 125, 123, 134, 139, 146, 131, + 137, 110, 142, 148, 131, 140, 143, 136, 144, 145, + 125, 126, 147, 127, 142, 130, 149, 135, 294, 128, + 132, 141, 146, 148, 134, 154, 131, 150, 137, 143, + 139, 131, 151, 140, 136, 145, 144, 293, 153, 147, + 150, 152, 142, 149, 155, 159, 158, 151, 141, 146, + + 148, 153, 152, 291, 154, 161, 143, 139, 160, 159, + 140, 162, 145, 144, 155, 158, 147, 160, 150, 164, + 149, 165, 161, 166, 168, 151, 167, 169, 162, 153, + 152, 154, 164, 168, 165, 172, 290, 159, 168, 171, + 176, 155, 158, 170, 175, 160, 179, 177, 193, 166, + 161, 288, 167, 171, 287, 169, 162, 172, 175, 178, + 164, 168, 165, 176, 170, 181, 168, 182, 178, 185, + 193, 180, 186, 170, 179, 192, 166, 177, 203, 167, + 282, 171, 169, 180, 172, 186, 175, 203, 191, 185, + 176, 170, 188, 181, 189, 182, 178, 193, 180, 194, + + 170, 179, 199, 192, 177, 188, 196, 189, 197, 198, + 194, 180, 278, 186, 191, 203, 185, 200, 201, 202, + 181, 204, 182, 206, 199, 180, 196, 205, 209, 198, + 192, 197, 208, 188, 201, 189, 207, 211, 194, 205, + 210, 191, 202, 200, 265, 208, 213, 204, 212, 206, + 214, 199, 210, 196, 209, 215, 198, 207, 197, 214, + 217, 224, 201, 211, 221, 223, 219, 205, 215, 202, + 200, 212, 213, 208, 204, 219, 206, 222, 229, 226, + 210, 209, 239, 217, 207, 224, 222, 214, 223, 236, + 211, 226, 227, 221, 235, 230, 215, 231, 212, 213, + + 233, 227, 237, 219, 236, 235, 231, 238, 229, 233, + 217, 239, 224, 241, 222, 223, 238, 242, 245, 226, + 221, 230, 243, 246, 244, 251, 254, 263, 237, 227, + 248, 245, 236, 235, 231, 229, 243, 233, 239, 241, + 247, 250, 242, 248, 238, 244, 251, 254, 230, 247, + 252, 246, 258, 253, 255, 237, 256, 262, 260, 245, + 249, 258, 268, 240, 243, 250, 241, 252, 257, 242, + 253, 248, 244, 251, 254, 255, 256, 247, 246, 259, + 260, 257, 261, 264, 269, 234, 262, 266, 268, 258, + 232, 228, 250, 267, 259, 252, 264, 261, 253, 270, + + 266, 271, 255, 256, 269, 267, 273, 260, 272, 257, + 274, 276, 270, 262, 271, 268, 280, 272, 275, 273, + 279, 277, 259, 274, 264, 261, 283, 220, 266, 280, + 285, 269, 279, 267, 281, 275, 277, 283, 289, 276, + 270, 284, 271, 281, 286, 272, 292, 273, 289, 297, + 295, 274, 296, 286, 284, 298, 300, 280, 285, 301, + 279, 299, 312, 275, 277, 283, 276, 302, 218, 297, + 292, 281, 315, 299, 313, 298, 289, 295, 306, 314, + 296, 286, 284, 307, 216, 285, 311, 302, 195, 300, + 312, 190, 301, 187, 184, 306, 297, 292, 313, 311, + + 307, 299, 298, 183, 295, 315, 314, 296, 174, 173, + 163, 157, 156, 138, 302, 133, 300, 312, 129, 301, + 124, 121, 116, 306, 115, 313, 91, 311, 307, 83, + 78, 77, 315, 314, 320, 320, 320, 320, 320, 320, + 321, 321, 321, 321, 321, 321, 322, 322, 322, 75, + 322, 323, 323, 323, 324, 324, 324, 325, 74, 71, + 325, 326, 326, 326, 65, 59, 54, 50, 47, 27, + 25, 24, 23, 14, 10, 8, 7, 3, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int swf4_flex_debug; +int swf4_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *swf4text; +#line 1 "swf4compiler.flex" +#line 2 "swf4compiler.flex" + +#include +#include + +#include "compile.h" +#include "action.h" +#include "blocks/error.h" +#include "swf4compiler.tab.h" /* defines token types */ + +static int swf4debug; + +static const char *lexBuffer = NULL; +static int lexBufferLen = 0; + +static int sLineNumber = 0; +static char szLine[1024]; +static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; +static int column = 0; + +static void comment(); +static void comment1(); +static void count(); +static void warning(char *msg); + +#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) + +/* thanks to the prolific and brilliant Raff: */ +static int lexBufferInput(char *buf, int max_size) +{ + int l = lexBufferLen > max_size ? max_size : lexBufferLen; + + if (lexBufferLen <= 0) + return YY_NULL; + + memcpy(buf, lexBuffer, l); + lexBuffer += l; + lexBufferLen -= l; + return l; +} + + /* very inefficient method of unescaping strings */ +static void unescape(char *buf) +{ + char *p, *p1; + + for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { + switch(p[1]) + { + case 'b' : p[1] = '\b'; break; + case 'f' : p[1] = '\f'; break; + case 'n' : p[1] = '\n'; break; + case 'r' : p[1] = '\r'; break; + case 't' : p[1] = '\t'; break; + case 'x' : + case 'u' : warning("unsupported escape sequence"); + } + strcpy(p, p+1); + } +} + +void swf4ParseInit(const char *script, int debug) +{ + checkByteOrder(); + swf4restart(NULL); + + swf4debug = debug; + + lexBuffer = script; + lexBufferLen = strlen(script); + sLineNumber = 0; + column = 0; + msgline = msgbufs[0]; +} + +#line 79 "swf4compiler.flex" + // forward declaration needed by the following function +#ifndef YY_PROTO +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif +#endif + static void yyunput YY_PROTO(( int c, char *buf_ptr )); + + void do_unput4(const char c) { unput(c); } +#line 874 "lex.swf4.c" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int swf4lex_destroy (void ); + +int swf4get_debug (void ); + +void swf4set_debug (int debug_flag ); + +YY_EXTRA_TYPE swf4get_extra (void ); + +void swf4set_extra (YY_EXTRA_TYPE user_defined ); + +FILE *swf4get_in (void ); + +void swf4set_in (FILE * in_str ); + +FILE *swf4get_out (void ); + +void swf4set_out (FILE * out_str ); + +int swf4get_leng (void ); + +char *swf4get_text (void ); + +int swf4get_lineno (void ); + +void swf4set_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int swf4wrap (void ); +#else +extern int swf4wrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO fwrite( swf4text, swf4leng, 1, swf4out ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( swf4in )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( swf4in ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, swf4in))==0 && ferror(swf4in)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(swf4in); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int swf4lex (void); + +#define YY_DECL int swf4lex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after swf4text and swf4leng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 96 "swf4compiler.flex" + + +#line 1059 "lex.swf4.c" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! swf4in ) + swf4in = stdin; + + if ( ! swf4out ) + swf4out = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + swf4ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + swf4_create_buffer(swf4in,YY_BUF_SIZE ); + } + + swf4_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of swf4text. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 320 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 879 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 98 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text); + return NUMBER; } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 100 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text); + return NUMBER; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 102 "swf4compiler.flex" +{ count(); swf4lval.str = strdup("1"); + return NUMBER; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 104 "swf4compiler.flex" +{ count(); swf4lval.str = strdup("0"); + return NUMBER; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 106 "swf4compiler.flex" +{ count(); return BREAK; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 107 "swf4compiler.flex" +{ count(); return CONTINUE; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 108 "swf4compiler.flex" +{ count(); return ELSE; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 109 "swf4compiler.flex" +{ count(); return FOR; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 110 "swf4compiler.flex" +{ count(); return IF; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 111 "swf4compiler.flex" +{ count(); return WHILE; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 112 "swf4compiler.flex" +{ count(); return DO; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 113 "swf4compiler.flex" +{ count(); return EVAL; } + YY_BREAK +/* functions */ +case 13: +YY_RULE_SETUP +#line 116 "swf4compiler.flex" +{ count(); return RANDOM; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 117 "swf4compiler.flex" +{ count(); return TIME; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 118 "swf4compiler.flex" +{ count(); return LENGTH; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 119 "swf4compiler.flex" +{ count(); return INT; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 120 "swf4compiler.flex" +{ count(); return CONCAT; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 121 "swf4compiler.flex" +{ count(); return DUPLICATECLIP; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 122 "swf4compiler.flex" +{ count(); return REMOVECLIP; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 123 "swf4compiler.flex" +{ count(); return TRACE; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 124 "swf4compiler.flex" +{ count(); return STARTDRAG; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 125 "swf4compiler.flex" +{ count(); return STOPDRAG; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 126 "swf4compiler.flex" +{ count(); return ORD; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 127 "swf4compiler.flex" +{ count(); return CHR; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 128 "swf4compiler.flex" +{ count(); return CALLFRAME; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 129 "swf4compiler.flex" +{ count(); return GETURL; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 130 "swf4compiler.flex" +{ count(); return GETURL1; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 131 "swf4compiler.flex" +{ count(); return LOADMOVIE; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 132 "swf4compiler.flex" +{ count(); return LOADVARIABLES; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 133 "swf4compiler.flex" +{ count(); return SUBSTR; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 135 "swf4compiler.flex" +{ count(); return GETPROPERTY; } + YY_BREAK +/* getURL2 methods */ +case 32: +YY_RULE_SETUP +#line 138 "swf4compiler.flex" +{ count(); swf4lval.getURLMethod = GETURL_METHOD_POST; + return GETURL_METHOD; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 140 "swf4compiler.flex" +{ count(); swf4lval.getURLMethod = GETURL_METHOD_GET; + return GETURL_METHOD; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 142 "swf4compiler.flex" +{ count(); swf4lval.getURLMethod = GETURL_METHOD_NOSEND; + return GETURL_METHOD; } + YY_BREAK +/* v3 functions */ +case 35: +YY_RULE_SETUP +#line 147 "swf4compiler.flex" +{ count(); return NEXTFRAME; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 148 "swf4compiler.flex" +{ count(); return PREVFRAME; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 149 "swf4compiler.flex" +{ count(); return PLAY; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 150 "swf4compiler.flex" +{ count(); return STOP; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 151 "swf4compiler.flex" +{ count(); return TOGGLEQUALITY; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 152 "swf4compiler.flex" +{ count(); return STOPSOUNDS; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 153 "swf4compiler.flex" +{ count(); return GOTOFRAME; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 154 "swf4compiler.flex" +{ count(); return GOTOANDPLAY; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 155 "swf4compiler.flex" +{ count(); return FRAMELOADED; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 156 "swf4compiler.flex" +{ count(); return SETTARGET; } + YY_BREAK +/* high level functions */ +case 45: +YY_RULE_SETUP +#line 159 "swf4compiler.flex" +{ count(); return TELLTARGET; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 162 "swf4compiler.flex" +{ count(); return THIS; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 164 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text); + return IDENTIFIER; } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 167 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text); + return PATH; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 170 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text); + return PATH; } + YY_BREAK +case 50: +/* rule 50 can match eol */ +YY_RULE_SETUP +#line 173 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text+1); + swf4lval.str[strlen(swf4lval.str)-1]=0; + unescape(swf4lval.str); + return STRING; } + YY_BREAK +case 51: +/* rule 51 can match eol */ +YY_RULE_SETUP +#line 178 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(swf4text+1); + swf4lval.str[strlen(swf4lval.str)-1]=0; + unescape(swf4lval.str); + return STRING; } + YY_BREAK +case 52: +/* rule 52 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up swf4text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up swf4text again */ +YY_RULE_SETUP +#line 183 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + YY_BREAK +case 53: +/* rule 53 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up swf4text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up swf4text again */ +YY_RULE_SETUP +#line 187 "swf4compiler.flex" +{ count(); swf4lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 191 "swf4compiler.flex" +{ count(); comment(); } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 192 "swf4compiler.flex" +{ count(); comment1(); } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 193 "swf4compiler.flex" +{ count(); } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 195 "swf4compiler.flex" +{ count(); return INC; } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 196 "swf4compiler.flex" +{ count(); return DEC; } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 197 "swf4compiler.flex" +{ count(); return '<'; } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 198 "swf4compiler.flex" +{ count(); return '>'; } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 199 "swf4compiler.flex" +{ count(); return LE; } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 200 "swf4compiler.flex" +{ count(); return GE; } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 201 "swf4compiler.flex" +{ count(); return EQ; } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 202 "swf4compiler.flex" +{ count(); return NE; } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 203 "swf4compiler.flex" +{ count(); return LAN; } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 204 "swf4compiler.flex" +{ count(); return LOR; } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 205 "swf4compiler.flex" +{ count(); return MEQ; } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 206 "swf4compiler.flex" +{ count(); return DEQ; } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 207 "swf4compiler.flex" +{ count(); return IEQ; } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 208 "swf4compiler.flex" +{ count(); return SEQ; } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 209 "swf4compiler.flex" +{ count(); return STREQ; } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 210 "swf4compiler.flex" +{ count(); return STRNE; } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 211 "swf4compiler.flex" +{ count(); return STRCMP; } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 212 "swf4compiler.flex" +{ count(); return PARENT; } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 214 "swf4compiler.flex" +{ count(); return ';'; } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 215 "swf4compiler.flex" +{ count(); return '='; } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 216 "swf4compiler.flex" +{ count(); return '+'; } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 217 "swf4compiler.flex" +{ count(); return '-'; } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 218 "swf4compiler.flex" +{ count(); return '&'; } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 219 "swf4compiler.flex" +{ count(); return '*'; } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 220 "swf4compiler.flex" +{ count(); return '/'; } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 221 "swf4compiler.flex" +{ count(); return '!'; } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 222 "swf4compiler.flex" +{ count(); return '('; } + YY_BREAK +case 84: +YY_RULE_SETUP +#line 223 "swf4compiler.flex" +{ count(); return ')'; } + YY_BREAK +case 85: +YY_RULE_SETUP +#line 224 "swf4compiler.flex" +{ count(); return '['; } + YY_BREAK +case 86: +YY_RULE_SETUP +#line 225 "swf4compiler.flex" +{ count(); return ']'; } + YY_BREAK +case 87: +YY_RULE_SETUP +#line 226 "swf4compiler.flex" +{ count(); return '{'; } + YY_BREAK +case 88: +YY_RULE_SETUP +#line 227 "swf4compiler.flex" +{ count(); return '}'; } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 228 "swf4compiler.flex" +{ count(); return ','; } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 229 "swf4compiler.flex" +{ count(); return '.'; } + YY_BREAK +case 91: +YY_RULE_SETUP +#line 230 "swf4compiler.flex" +{ count(); return '?'; } + YY_BREAK +case 92: +YY_RULE_SETUP +#line 231 "swf4compiler.flex" +{ count(); return ':'; } + YY_BREAK +case 93: +/* rule 93 can match eol */ +YY_RULE_SETUP +#line 233 "swf4compiler.flex" +{ count(); column = 0; + strcpy(szLine, swf4text + 1); + ++sLineNumber; yyless(1); } + YY_BREAK +case 94: +YY_RULE_SETUP +#line 237 "swf4compiler.flex" +printf( "Unrecognized character: %s\n", swf4text ); + YY_BREAK +case 95: +YY_RULE_SETUP +#line 239 "swf4compiler.flex" +ECHO; + YY_BREAK +#line 1654 "lex.swf4.c" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed swf4in at a new source and called + * swf4lex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = swf4in; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( swf4wrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * swf4text, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of swf4lex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + swf4realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + swf4restart(swf4in ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) swf4realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 320 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 320 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 319); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up swf4text */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + swf4restart(swf4in ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( swf4wrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve swf4text */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void swf4restart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + swf4ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + swf4_create_buffer(swf4in,YY_BUF_SIZE ); + } + + swf4_init_buffer(YY_CURRENT_BUFFER,input_file ); + swf4_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void swf4_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * swf4pop_buffer_state(); + * swf4push_buffer_state(new_buffer); + */ + swf4ensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + swf4_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (swf4wrap()) processing, but the only time this flag + * is looked at is after swf4wrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void swf4_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + swf4in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE swf4_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) swf4alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in swf4_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) swf4alloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in swf4_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + swf4_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with swf4_create_buffer() + * + */ + void swf4_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + swf4free((void *) b->yy_ch_buf ); + + swf4free((void *) b ); +} + +#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __THROW /* this is a gnuism */ +extern int isatty (int ) __THROW; +#else +extern int isatty (int ); +#endif +#ifdef __cplusplus +} +#endif +#endif + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a swf4restart() or at EOF. + */ + static void swf4_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + swf4_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then swf4_init_buffer was _probably_ + * called from swf4restart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void swf4_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + swf4_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void swf4push_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + swf4ensure_buffer_stack(); + + /* This block is copied from swf4_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from swf4_switch_to_buffer. */ + swf4_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void swf4pop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + swf4_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + swf4_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void swf4ensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)swf4alloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in swf4ensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)swf4realloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in swf4ensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE swf4_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) swf4alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in swf4_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + swf4_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to swf4lex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * swf4_scan_bytes() instead. + */ +YY_BUFFER_STATE swf4_scan_string (yyconst char * yystr ) +{ + + return swf4_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to swf4lex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE swf4_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) swf4alloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in swf4_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = swf4_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in swf4_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up swf4text. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + swf4text[swf4leng] = (yy_hold_char); \ + (yy_c_buf_p) = swf4text + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + swf4leng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int swf4get_lineno (void) +{ + + return swf4lineno; +} + +/** Get the input stream. + * + */ +FILE *swf4get_in (void) +{ + return swf4in; +} + +/** Get the output stream. + * + */ +FILE *swf4get_out (void) +{ + return swf4out; +} + +/** Get the length of the current token. + * + */ +int swf4get_leng (void) +{ + return swf4leng; +} + +/** Get the current token. + * + */ + +char *swf4get_text (void) +{ + return swf4text; +} + +/** Set the current line number. + * @param line_number + * + */ +void swf4set_lineno (int line_number ) +{ + + swf4lineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see swf4_switch_to_buffer + */ +void swf4set_in (FILE * in_str ) +{ + swf4in = in_str ; +} + +void swf4set_out (FILE * out_str ) +{ + swf4out = out_str ; +} + +int swf4get_debug (void) +{ + return swf4_flex_debug; +} + +void swf4set_debug (int bdebug ) +{ + swf4_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from swf4lex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + swf4in = stdin; + swf4out = stdout; +#else + swf4in = (FILE *) 0; + swf4out = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * swf4lex_init() + */ + return 0; +} + +/* swf4lex_destroy is for both reentrant and non-reentrant scanners. */ +int swf4lex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + swf4_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + swf4pop_buffer_state(); + } + + /* Destroy the stack itself. */ + swf4free((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * swf4lex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *swf4alloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *swf4realloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void swf4free (void * ptr ) +{ + free( (char *) ptr ); /* see swf4realloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 239 "swf4compiler.flex" + + +static int getinput() { +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif +} + +int swf4wrap() +{ + return 1; +} + +static void countline() +{ + if(sLineNumber != 0) + msgline[column] = 0; + + ++sLineNumber; + column = 0; + msgline = msgbufs[sLineNumber & 1]; +} + +static int LineNumber(void) +{ + return (sLineNumber + 1); +} + +static int ColumnNumber(void) +{ + return column; +} + +static char *LineText(void) +{ + msgline[column] = 0; + return msgline; +} + +static void comment(void) +{ + // Handle block comments + + int c, c1; + +loop: + // We have the start of a comment so look skip everything up to the + // end of the comment character + while ((c = getinput()) != '*' && c != EOF) + { + if(column < 1023) + msgline[column] = c; + + ++column; + + // keep the line number in synch + if (c == '\n') + { + // start the output (matches the algorithim in the lexx above) + countline(); + } + + if (swf4debug) putchar(c); + } + + // is this the end of comment character + if ((c1 = getinput()) != '/' && c != EOF) + { + // false start as this was no end of comment + do_unput4(c1); + goto loop; + } + + // write out the start of the end of comment + if (c != EOF) + if (swf4debug) putchar(c); + + // write out the end of the end of comment + if (c1 != EOF) + if (swf4debug) putchar(c1); +} + +static void comment1(void) +{ + // Handle comment of type 1 (ie '//') + + int c; + + // this is a line comment + while ((c = getinput()) != '\n' && c != EOF) + { + if (swf4debug) putchar(c); + + if(column < 1023) + msgline[column] = c; + + ++column; + }; + + // keep the line number in synch + if (c == '\n') + { + if (swf4debug) putchar(c); + + countline(); + } +} + +static void count(void) +{ + int n; + + // Count the characters to maintain the current column position + if (swf4text[0] == '\n') + { + if (swf4debug) printf("\n"); + } + else + { + if (swf4debug) printf("%s", swf4text); + + for(n=0; n 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE swf5restart(swf5in ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int swf5leng; + +extern FILE *swf5in, *swf5out; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up swf5text. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up swf5text again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via swf5restart()), so that the user can continue scanning by + * just pointing swf5in at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when swf5text is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int swf5leng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow swf5wrap()'s to do buffer switches + * instead of setting up a fresh swf5in. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void swf5restart (FILE *input_file ); +void swf5_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE swf5_create_buffer (FILE *file,int size ); +void swf5_delete_buffer (YY_BUFFER_STATE b ); +void swf5_flush_buffer (YY_BUFFER_STATE b ); +void swf5push_buffer_state (YY_BUFFER_STATE new_buffer ); +void swf5pop_buffer_state (void ); + +static void swf5ensure_buffer_stack (void ); +static void swf5_load_buffer_state (void ); +static void swf5_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER swf5_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE swf5_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE swf5_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE swf5_scan_bytes (yyconst char *bytes,int len ); + +void *swf5alloc (yy_size_t ); +void *swf5realloc (void *,yy_size_t ); +void swf5free (void * ); + +#define yy_new_buffer swf5_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + swf5ensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + swf5_create_buffer(swf5in,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + swf5ensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + swf5_create_buffer(swf5in,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *swf5in = (FILE *) 0, *swf5out = (FILE *) 0; + +typedef int yy_state_type; + +extern int swf5lineno; + +int swf5lineno = 1; + +extern char *swf5text; +#define yytext_ptr swf5text + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up swf5text. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + swf5leng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 166 +#define YY_END_OF_BUFFER 167 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[650] = + { 0, + 0, 0, 0, 0, 167, 165, 119, 164, 165, 152, + 165, 151, 146, 165, 153, 154, 149, 144, 159, 145, + 160, 150, 3, 3, 162, 142, 140, 143, 141, 161, + 155, 156, 148, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 157, 147, 158, 163, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 164, 125, 0, 115, 113, 0, 126, 132, 0, 116, + 114, 0, 128, 120, 130, 121, 131, 117, 118, 129, + 4, 2, 3, 0, 134, 122, 124, 123, 135, 112, + + 112, 112, 112, 112, 112, 112, 19, 112, 112, 112, + 112, 112, 112, 112, 112, 17, 16, 112, 112, 112, + 112, 112, 112, 112, 0, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 133, 127, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 16, + 112, 112, 112, 112, 112, 112, 112, 112, 63, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 4, 1, + 137, 138, 136, 25, 112, 112, 112, 37, 112, 112, + 112, 112, 112, 112, 112, 15, 112, 112, 112, 112, + 35, 112, 112, 21, 112, 112, 36, 112, 112, 111, + + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 20, 112, 112, 66, 62, 112, 112, 73, 112, + 55, 110, 112, 112, 109, 72, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 21, 91, 112, 57, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 20, 64, + 139, 112, 112, 13, 112, 112, 112, 112, 112, 11, + 26, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 7, 42, 112, 112, 112, 112, 112, 43, 112, 112, + 112, 112, 5, 112, 112, 24, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + + 112, 112, 112, 112, 112, 112, 112, 112, 108, 58, + 112, 112, 112, 112, 112, 112, 43, 112, 112, 112, + 56, 112, 8, 112, 112, 112, 112, 112, 112, 6, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 34, 112, + 18, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 104, 112, 103, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 32, 112, 112, + 22, 112, 112, 112, 38, 112, 112, 31, 112, 112, + + 112, 112, 29, 112, 23, 112, 112, 33, 12, 112, + 27, 105, 112, 112, 86, 112, 70, 112, 112, 112, + 112, 112, 112, 112, 112, 65, 112, 67, 112, 112, + 83, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 33, 112, 112, 112, 112, 14, 112, 112, + 112, 39, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 9, 112, 10, 30, 112, 112, + + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 68, 112, 112, + 101, 112, 85, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 99, 92, 112, 112, 84, 112, + 46, 112, 47, 112, 50, 112, 40, 41, 112, 48, + 112, 112, 112, 112, 112, 112, 74, 77, 112, 76, + 112, 112, 90, 112, 71, 112, 87, 112, 78, 112, + 48, 112, 79, 112, 98, 112, 112, 94, 82, 112, + 28, 112, 112, 112, 45, 112, 112, 112, 112, 61, + 112, 75, 89, 112, 112, 112, 112, 112, 112, 80, + + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 95, 102, 69, 88, 59, 112, 96, 81, 112, 112, + 112, 52, 112, 112, 112, 106, 107, 60, 112, 93, + 112, 112, 49, 112, 44, 97, 112, 112, 112, 112, + 100, 112, 112, 54, 112, 51, 112, 53, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 5, 6, 1, 1, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 21, 21, 21, 21, 22, 22, 23, 24, 25, + 26, 27, 28, 1, 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, 33, + 29, 30, 31, 32, 33, 1, 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, 33, 59, 60, 61, 62, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[63] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, + 1, 1 + } ; + +static yyconst flex_int16_t yy_base[654] = + { 0, + 0, 0, 29, 0, 741, 742, 742, 742, 737, 713, + 67, 742, 64, 76, 742, 742, 712, 67, 742, 68, + 742, 70, 82, 89, 742, 742, 63, 711, 65, 742, + 742, 742, 742, 0, 684, 684, 78, 75, 69, 82, + 77, 81, 79, 80, 683, 86, 109, 95, 87, 699, + 80, 742, 114, 742, 742, 105, 681, 112, 116, 116, + 117, 120, 124, 121, 130, 99, 128, 139, 697, 682, + 742, 742, 180, 182, 742, 726, 742, 742, 178, 187, + 742, 725, 742, 742, 742, 742, 742, 742, 742, 742, + 179, 200, 207, 0, 701, 742, 742, 742, 176, 0, + + 680, 687, 159, 673, 676, 168, 0, 673, 669, 686, + 674, 667, 670, 663, 662, 0, 153, 667, 679, 158, + 667, 674, 676, 671, 212, 661, 189, 654, 658, 670, + 662, 663, 155, 653, 650, 658, 646, 742, 742, 661, + 660, 61, 191, 201, 641, 646, 187, 640, 640, 202, + 198, 213, 212, 655, 646, 195, 637, 652, 651, 142, + 635, 633, 643, 215, 649, 225, 632, 631, 250, 0, + 742, 742, 655, 0, 646, 634, 640, 0, 203, 643, + 638, 630, 636, 628, 620, 0, 635, 208, 622, 616, + 0, 628, 630, 0, 613, 620, 0, 606, 608, 255, + + 625, 613, 606, 606, 609, 605, 603, 615, 618, 615, + 614, 0, 606, 609, 0, 0, 602, 603, 0, 605, + 601, 0, 599, 610, 232, 0, 590, 590, 599, 599, + 601, 587, 583, 582, 582, 245, 0, 246, 0, 581, + 592, 242, 593, 580, 581, 587, 229, 579, 589, 0, + 742, 582, 586, 0, 590, 581, 568, 568, 578, 0, + 0, 581, 565, 575, 565, 576, 580, 560, 243, 573, + 0, 0, 572, 562, 554, 557, 573, 554, 552, 568, + 558, 564, 0, 553, 562, 0, 563, 219, 561, 559, + 551, 557, 560, 258, 540, 556, 540, 543, 552, 553, + + 542, 544, 548, 534, 545, 545, 531, 542, 0, 0, + 541, 540, 543, 542, 522, 521, 257, 526, 519, 520, + 0, 520, 0, 518, 515, 520, 521, 527, 528, 0, + 521, 516, 516, 509, 512, 517, 509, 522, 504, 503, + 507, 514, 504, 499, 501, 497, 506, 508, 0, 506, + 0, 503, 245, 505, 504, 490, 488, 493, 487, 486, + 501, 494, 500, 0, 493, 0, 480, 483, 481, 492, + 474, 475, 489, 471, 472, 477, 482, 470, 469, 256, + 482, 467, 477, 465, 481, 460, 479, 0, 458, 458, + 0, 476, 461, 470, 488, 472, 469, 0, 449, 452, + + 468, 467, 0, 454, 0, 459, 444, 0, 0, 447, + 0, 266, 449, 442, 0, 460, 0, 458, 450, 440, + 447, 455, 443, 434, 433, 0, 440, 0, 450, 431, + 0, 448, 429, 445, 437, 438, 435, 438, 433, 423, + 439, 265, 430, 435, 436, 423, 430, 0, 414, 419, + 414, 0, 418, 425, 420, 419, 414, 413, 410, 419, + 409, 401, 409, 414, 416, 410, 397, 411, 414, 413, + 408, 398, 268, 403, 392, 384, 396, 387, 394, 385, + 399, 384, 397, 400, 394, 392, 397, 390, 379, 390, + 380, 373, 380, 386, 0, 385, 0, 0, 384, 373, + + 382, 385, 380, 379, 361, 362, 377, 379, 356, 358, + 357, 361, 370, 356, 371, 347, 368, 0, 356, 351, + 0, 359, 0, 348, 358, 346, 356, 345, 342, 341, + 358, 339, 350, 350, 0, 0, 265, 349, 0, 336, + 0, 341, 0, 347, 338, 349, 0, 0, 341, 0, + 330, 336, 346, 328, 336, 340, 0, 0, 331, 0, + 322, 337, 0, 326, 0, 338, 0, 337, 0, 332, + 331, 323, 0, 314, 0, 326, 313, 0, 0, 316, + 0, 309, 317, 323, 0, 318, 301, 304, 309, 0, + 318, 0, 0, 315, 307, 306, 301, 294, 312, 329, + + 295, 294, 291, 299, 306, 307, 289, 289, 302, 292, + 0, 0, 0, 0, 0, 289, 0, 0, 296, 295, + 293, 0, 282, 288, 274, 0, 0, 0, 280, 0, + 296, 291, 281, 285, 0, 0, 279, 279, 260, 264, + 0, 266, 259, 0, 262, 0, 92, 0, 742, 317, + 320, 322, 66 + } ; + +static yyconst flex_int16_t yy_def[654] = + { 0, + 649, 1, 1, 3, 649, 649, 649, 649, 649, 649, + 650, 649, 649, 651, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 649, 649, 649, 649, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 649, 649, 650, 650, 649, 650, 649, 649, 651, 651, + 649, 651, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 653, 649, 649, 649, 649, 649, 652, + + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 649, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 649, 649, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 649, 653, + 649, 649, 649, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 649, + + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 649, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, + 652, 652, 652, 652, 652, 652, 652, 652, 0, 649, + 649, 649, 649 + } ; + +static yyconst flex_int16_t yy_nxt[805] = + { 0, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, + 24, 24, 25, 26, 27, 28, 29, 30, 31, 6, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 34, 42, 34, 34, 43, 34, 44, 45, 46, 34, + 47, 48, 49, 34, 50, 51, 34, 34, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 170, 61, 74, + 62, 77, 75, 63, 64, 65, 66, 67, 80, 84, + 68, 88, 86, 69, 81, 70, 89, 95, 96, 78, + 98, 99, 85, 87, 217, 90, 76, 91, 175, 92, + + 92, 92, 92, 93, 91, 82, 93, 93, 93, 93, + 93, 103, 106, 109, 114, 111, 118, 120, 104, 116, + 136, 137, 107, 110, 115, 105, 119, 117, 108, 112, + 123, 125, 128, 121, 132, 113, 124, 133, 94, 138, + 648, 140, 126, 158, 134, 143, 127, 129, 130, 159, + 131, 141, 104, 144, 149, 153, 101, 145, 116, 105, + 109, 151, 147, 107, 115, 148, 150, 156, 154, 146, + 110, 152, 123, 139, 155, 160, 162, 157, 124, 163, + 80, 161, 74, 121, 74, 75, 81, 75, 209, 80, + 239, 164, 165, 240, 166, 81, 169, 169, 169, 169, + + 169, 172, 173, 176, 190, 191, 180, 82, 210, 76, + 177, 76, 181, 194, 195, 91, 82, 92, 92, 92, + 92, 93, 91, 222, 93, 93, 93, 93, 93, 200, + 200, 200, 200, 200, 202, 218, 219, 226, 255, 180, + 223, 203, 177, 227, 192, 181, 193, 230, 244, 228, + 236, 195, 229, 190, 191, 256, 231, 353, 248, 232, + 264, 265, 245, 233, 354, 246, 207, 169, 169, 169, + 169, 169, 200, 200, 200, 200, 200, 292, 303, 306, + 319, 320, 304, 307, 264, 265, 293, 311, 337, 305, + 308, 360, 312, 382, 313, 387, 314, 338, 413, 463, + + 438, 519, 489, 647, 646, 361, 439, 464, 345, 490, + 645, 576, 644, 643, 642, 520, 577, 73, 73, 73, + 79, 79, 79, 100, 100, 641, 640, 639, 638, 637, + 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, + 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, + 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, + 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, + 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, + 586, 585, 584, 583, 582, 581, 580, 579, 578, 575, + 574, 573, 572, 571, 570, 569, 568, 567, 566, 565, + + 564, 563, 562, 561, 560, 559, 558, 557, 556, 555, + 554, 553, 552, 551, 550, 549, 548, 547, 546, 545, + 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, + 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, + 524, 523, 522, 521, 518, 517, 516, 515, 514, 513, + 512, 511, 510, 509, 508, 507, 506, 505, 504, 503, + 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, + 492, 491, 488, 487, 486, 485, 484, 483, 482, 481, + 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, + 470, 469, 468, 467, 466, 465, 462, 461, 460, 459, + + 458, 457, 456, 455, 454, 453, 452, 451, 450, 449, + 448, 447, 446, 445, 444, 443, 442, 441, 440, 437, + 436, 435, 434, 433, 432, 431, 430, 429, 428, 427, + 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, + 416, 415, 414, 412, 411, 410, 409, 408, 407, 406, + 405, 404, 403, 402, 401, 400, 399, 398, 397, 396, + 395, 394, 393, 392, 391, 390, 389, 388, 387, 386, + 385, 384, 383, 381, 380, 379, 378, 377, 376, 375, + 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, + 364, 363, 362, 359, 358, 357, 356, 355, 352, 351, + + 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, + 340, 339, 336, 335, 334, 333, 332, 331, 330, 329, + 328, 327, 326, 325, 324, 323, 322, 321, 318, 317, + 316, 315, 310, 309, 302, 301, 300, 299, 298, 297, + 296, 295, 294, 291, 290, 259, 289, 288, 287, 286, + 285, 284, 283, 282, 281, 280, 279, 278, 277, 276, + 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, + 263, 262, 261, 260, 259, 258, 257, 254, 253, 252, + 251, 250, 249, 247, 243, 242, 241, 197, 238, 237, + 235, 234, 225, 224, 221, 220, 216, 215, 214, 213, + + 212, 211, 208, 207, 206, 205, 204, 201, 199, 198, + 197, 196, 193, 192, 189, 188, 187, 186, 185, 184, + 183, 182, 179, 178, 175, 174, 171, 649, 649, 168, + 167, 142, 135, 122, 102, 101, 97, 83, 72, 71, + 649, 5, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + + 649, 649, 649, 649 + } ; + +static yyconst flex_int16_t yy_chk[805] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 653, 3, 11, + 3, 13, 11, 3, 3, 3, 3, 3, 14, 18, + 3, 22, 20, 3, 14, 3, 22, 27, 27, 13, + 29, 29, 18, 20, 142, 22, 11, 23, 142, 23, + + 23, 23, 23, 23, 24, 14, 24, 24, 24, 24, + 24, 37, 38, 39, 41, 40, 43, 44, 37, 42, + 51, 51, 38, 39, 41, 37, 43, 42, 38, 40, + 46, 47, 48, 44, 49, 40, 46, 49, 23, 53, + 647, 56, 47, 66, 49, 58, 47, 48, 48, 66, + 48, 56, 58, 59, 61, 64, 56, 59, 62, 58, + 60, 63, 60, 59, 61, 60, 62, 65, 64, 59, + 60, 63, 67, 53, 64, 67, 68, 65, 67, 68, + 79, 67, 73, 65, 74, 73, 79, 74, 133, 80, + 160, 68, 68, 160, 68, 80, 91, 91, 91, 91, + + 91, 99, 99, 103, 117, 117, 106, 79, 133, 73, + 103, 74, 106, 120, 120, 92, 80, 92, 92, 92, + 92, 92, 93, 147, 93, 93, 93, 93, 93, 125, + 125, 125, 125, 125, 127, 143, 144, 150, 179, 144, + 147, 127, 143, 150, 151, 144, 152, 153, 164, 151, + 156, 156, 152, 150, 150, 179, 153, 288, 166, 153, + 188, 188, 164, 153, 288, 164, 166, 169, 169, 169, + 169, 169, 200, 200, 200, 200, 200, 225, 236, 238, + 247, 247, 236, 238, 225, 225, 225, 242, 269, 236, + 238, 294, 242, 317, 242, 353, 242, 269, 353, 412, + + 380, 473, 442, 645, 643, 294, 380, 412, 317, 442, + 642, 537, 640, 639, 638, 473, 537, 650, 650, 650, + 651, 651, 651, 652, 652, 637, 634, 633, 632, 631, + 629, 625, 624, 623, 621, 620, 619, 616, 610, 609, + 608, 607, 606, 605, 604, 603, 602, 601, 600, 599, + 598, 597, 596, 595, 594, 591, 589, 588, 587, 586, + 584, 583, 582, 580, 577, 576, 574, 572, 571, 570, + 568, 566, 564, 562, 561, 559, 556, 555, 554, 553, + 552, 551, 549, 546, 545, 544, 542, 540, 538, 534, + 533, 532, 531, 530, 529, 528, 527, 526, 525, 524, + + 522, 520, 519, 517, 516, 515, 514, 513, 512, 511, + 510, 509, 508, 507, 506, 505, 504, 503, 502, 501, + 500, 499, 496, 494, 493, 492, 491, 490, 489, 488, + 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, + 477, 476, 475, 474, 472, 471, 470, 469, 468, 467, + 466, 465, 464, 463, 462, 461, 460, 459, 458, 457, + 456, 455, 454, 453, 451, 450, 449, 447, 446, 445, + 444, 443, 441, 440, 439, 438, 437, 436, 435, 434, + 433, 432, 430, 429, 427, 425, 424, 423, 422, 421, + 420, 419, 418, 416, 414, 413, 410, 407, 406, 404, + + 402, 401, 400, 399, 397, 396, 395, 394, 393, 392, + 390, 389, 387, 386, 385, 384, 383, 382, 381, 379, + 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, + 368, 367, 365, 363, 362, 361, 360, 359, 358, 357, + 356, 355, 354, 352, 350, 348, 347, 346, 345, 344, + 343, 342, 341, 340, 339, 338, 337, 336, 335, 334, + 333, 332, 331, 329, 328, 327, 326, 325, 324, 322, + 320, 319, 318, 316, 315, 314, 313, 312, 311, 308, + 307, 306, 305, 304, 303, 302, 301, 300, 299, 298, + 297, 296, 295, 293, 292, 291, 290, 289, 287, 285, + + 284, 282, 281, 280, 279, 278, 277, 276, 275, 274, + 273, 270, 268, 267, 266, 265, 264, 263, 262, 259, + 258, 257, 256, 255, 253, 252, 249, 248, 246, 245, + 244, 243, 241, 240, 235, 234, 233, 232, 231, 230, + 229, 228, 227, 224, 223, 221, 220, 218, 217, 214, + 213, 211, 210, 209, 208, 207, 206, 205, 204, 203, + 202, 201, 199, 198, 196, 195, 193, 192, 190, 189, + 187, 185, 184, 183, 182, 181, 180, 177, 176, 175, + 173, 168, 167, 165, 163, 162, 161, 159, 158, 157, + 155, 154, 149, 148, 146, 145, 141, 140, 137, 136, + + 135, 134, 132, 131, 130, 129, 128, 126, 124, 123, + 122, 121, 119, 118, 115, 114, 113, 112, 111, 110, + 109, 108, 105, 104, 102, 101, 95, 82, 76, 70, + 69, 57, 50, 45, 36, 35, 28, 17, 10, 9, + 5, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + + 649, 649, 649, 649 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int swf5_flex_debug; +int swf5_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *swf5text; +#line 1 "swf5compiler.flex" +#line 2 "swf5compiler.flex" + +#include +#include + +#include "compile.h" +#include "action.h" +#include "blocks/error.h" +#include "swf5compiler.tab.h" /* defines token types */ + +static int swf5debug; + +static const char *lexBuffer = NULL; +static int lexBufferLen = 0; + +static int sLineNumber = 0; +static char szLine[1024]; +static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; +static int column = 0; + +static void comment(); +static void comment1(); +static void count(); +static void countline(); +static void warning(char *msg); + +#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) + +/* thanks to the prolific and brilliant Raff: */ +static int lexBufferInput(char *buf, int max_size) +{ + int l = lexBufferLen > max_size ? max_size : lexBufferLen; + + if (lexBufferLen <= 0) + return YY_NULL; + + memcpy(buf, lexBuffer, l); + lexBuffer += l; + lexBufferLen -= l; + return l; +} + + /* very inefficient method of unescaping strings */ +static void unescape(char *buf) +{ + char *p, *p1; + + for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { + switch(p[1]) + { + case 'b' : p[1] = '\b'; break; + case 'f' : p[1] = '\f'; break; + case 'n' : p[1] = '\n'; break; + case 'r' : p[1] = '\r'; break; + case 't' : p[1] = '\t'; break; + case 'x' : + case 'u' : warning("unsupported escape sequence"); + } + strcpy(p, p+1); + } +} + +void swf5ParseInit(const char *script, int debug) +{ + checkByteOrder(); + swf5restart(NULL); + + swf5debug = debug; + + lexBuffer = script; + lexBufferLen = strlen(script); + sLineNumber = 0; + column = 0; + msgline = msgbufs[0]; +} + + +#line 82 "swf5compiler.flex" + // forward declaration needed by the following function +#ifndef YY_PROTO +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif +#endif + static void yyunput YY_PROTO(( int c, char *buf_ptr )); + + void do_unput5(const char c) { unput(c); } +#line 936 "lex.swf5.c" + +#define INITIAL 0 +#define asm 1 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int swf5wrap (void ); +#else +extern int swf5wrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( swf5text, swf5leng, 1, swf5out ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( swf5in )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( swf5in ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, swf5in))==0 && ferror(swf5in)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(swf5in); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int swf5lex (void); + +#define YY_DECL int swf5lex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after swf5text and swf5leng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 98 "swf5compiler.flex" + + +#line 1093 "lex.swf5.c" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! swf5in ) + swf5in = stdin; + + if ( ! swf5out ) + swf5out = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + swf5ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + swf5_create_buffer(swf5in,YY_BUF_SIZE ); + } + + swf5_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of swf5text. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 650 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 742 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 100 "swf5compiler.flex" +{ count(); swf5lval.intVal = strtoul(swf5text, NULL, 0); + return INTEGER; } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 102 "swf5compiler.flex" +{ count(); swf5lval.intVal = strtoul(swf5text, NULL, 0); + return INTEGER; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 104 "swf5compiler.flex" +{ count(); swf5lval.intVal = atoi(swf5text); + return INTEGER; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 106 "swf5compiler.flex" +{ count(); swf5lval.doubleVal = atof(swf5text); + return DOUBLE; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 108 "swf5compiler.flex" +{ count(); swf5lval.intVal = 1; + return BOOLEAN; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 110 "swf5compiler.flex" +{ count(); swf5lval.intVal = 0; + return BOOLEAN; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 112 "swf5compiler.flex" +{ count(); return NULLVAL; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 113 "swf5compiler.flex" +{ count(); return BREAK; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 114 "swf5compiler.flex" +{ count(); return CONTINUE; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 115 "swf5compiler.flex" +{ count(); return FUNCTION; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 116 "swf5compiler.flex" +{ count(); return ELSE; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 117 "swf5compiler.flex" +{ count(); return SWITCH; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 118 "swf5compiler.flex" +{ count(); return CASE; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 119 "swf5compiler.flex" +{ count(); return DEFAULT; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 120 "swf5compiler.flex" +{ count(); return FOR; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 121 "swf5compiler.flex" +{ count(); return IN; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 122 "swf5compiler.flex" +{ count(); return IF; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 123 "swf5compiler.flex" +{ count(); return WHILE; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 124 "swf5compiler.flex" +{ count(); return DO; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 125 "swf5compiler.flex" +{ count(); return VAR; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 126 "swf5compiler.flex" +{ count(); return NEW; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 127 "swf5compiler.flex" +{ count(); return DELETE; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 128 "swf5compiler.flex" +{ count(); return RETURN; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 129 "swf5compiler.flex" +{ count(); return WITH; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 130 "swf5compiler.flex" +{ count(); BEGIN(asm); return ASM; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 131 "swf5compiler.flex" +{ count(); return EVAL; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 132 "swf5compiler.flex" +{ count(); return TYPEOF; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 133 "swf5compiler.flex" +{ count(); return INSTANCEOF; } + YY_BREAK +/* legacy functions */ +case 29: +YY_RULE_SETUP +#line 136 "swf5compiler.flex" +{ count(); return RANDOM; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 137 "swf5compiler.flex" +{ count(); return GETTIMER; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 138 "swf5compiler.flex" +{ count(); return LENGTH; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 139 "swf5compiler.flex" +{ count(); return CONCAT; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 140 "swf5compiler.flex" +{ count(); return SUBSTR; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 141 "swf5compiler.flex" +{ count(); return TRACE; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 142 "swf5compiler.flex" +{ count(); return INT; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 143 "swf5compiler.flex" +{ count(); return ORD; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 144 "swf5compiler.flex" +{ count(); return CHR; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 145 "swf5compiler.flex" +{ count(); return GETURL; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 146 "swf5compiler.flex" +{ count(); return GETURL1; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 147 "swf5compiler.flex" +{ count(); return NEXTFRAME; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 148 "swf5compiler.flex" +{ count(); return PREVFRAME; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 149 "swf5compiler.flex" +{ count(); return PLAY; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 150 "swf5compiler.flex" +{ count(); return STOP; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 151 "swf5compiler.flex" +{ count(); return TOGGLEQUALITY; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 152 "swf5compiler.flex" +{ count(); return STOPSOUNDS; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 153 "swf5compiler.flex" +{ count(); return CALLFRAME; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 154 "swf5compiler.flex" +{ count(); return GOTOFRAME; } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 155 "swf5compiler.flex" +{ count(); return SETTARGET; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 156 "swf5compiler.flex" +{ count(); return LOADVARIABLES; } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 157 "swf5compiler.flex" +{ count(); return LOADMOVIE; } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 158 "swf5compiler.flex" +{ count(); return LOADVARIABLESNUM; } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 159 "swf5compiler.flex" +{ count(); return LOADMOVIENUM; } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 160 "swf5compiler.flex" +{ count(); return DUPLICATEMOVIECLIP; } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 161 "swf5compiler.flex" +{ count(); return REMOVEMOVIECLIP; } + YY_BREAK +/* assembler ops */ + +case 55: +YY_RULE_SETUP +#line 165 "swf5compiler.flex" +{ count(); return DUP; } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 166 "swf5compiler.flex" +{ count(); return SWAP; } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 167 "swf5compiler.flex" +{ count(); return POP; } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 168 "swf5compiler.flex" +{ count(); return PUSH; } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 169 "swf5compiler.flex" +{ count(); return SETREGISTER; } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 170 "swf5compiler.flex" +{ count(); return CALLFUNCTION; } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 171 "swf5compiler.flex" +{ count(); return CALLMETHOD; } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 172 "swf5compiler.flex" +{ count(); return AND; } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 173 "swf5compiler.flex" +{ count(); return OR; } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 174 "swf5compiler.flex" +{ count(); return XOR; } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 175 "swf5compiler.flex" +{ count(); return MODULO; } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 176 "swf5compiler.flex" +{ count(); return ADD; } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 177 "swf5compiler.flex" +{ count(); return ADD; } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 178 "swf5compiler.flex" +{ count(); return LESSTHAN; } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 179 "swf5compiler.flex" +{ count(); return LESSTHAN; } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 180 "swf5compiler.flex" +{ count(); return EQUALS; } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 181 "swf5compiler.flex" +{ count(); return EQUALS; } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 182 "swf5compiler.flex" +{ count(); return INC; } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 183 "swf5compiler.flex" +{ count(); return DEC; } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 184 "swf5compiler.flex" +{ count(); return ENUMERATE; } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 185 "swf5compiler.flex" +{ count(); return INITOBJECT; } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 186 "swf5compiler.flex" +{ count(); return INITARRAY; } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 187 "swf5compiler.flex" +{ count(); return GETMEMBER; } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 188 "swf5compiler.flex" +{ count(); return SETMEMBER; } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 189 "swf5compiler.flex" +{ count(); return SHIFTLEFT; } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 190 "swf5compiler.flex" +{ count(); return SHIFTRIGHT; } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 191 "swf5compiler.flex" +{ count(); return SHIFTRIGHT2; } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 192 "swf5compiler.flex" +{ count(); return VAREQUALS; } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 193 "swf5compiler.flex" +{ count(); return OLDADD; } + YY_BREAK +case 84: +YY_RULE_SETUP +#line 194 "swf5compiler.flex" +{ count(); return SUBTRACT; } + YY_BREAK +case 85: +YY_RULE_SETUP +#line 195 "swf5compiler.flex" +{ count(); return MULTIPLY; } + YY_BREAK +case 86: +YY_RULE_SETUP +#line 196 "swf5compiler.flex" +{ count(); return DIVIDE; } + YY_BREAK +case 87: +YY_RULE_SETUP +#line 197 "swf5compiler.flex" +{ count(); return OLDEQUALS; } + YY_BREAK +case 88: +YY_RULE_SETUP +#line 198 "swf5compiler.flex" +{ count(); return OLDLESSTHAN; } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 199 "swf5compiler.flex" +{ count(); return LOGICALAND; } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 200 "swf5compiler.flex" +{ count(); return LOGICALOR; } + YY_BREAK +case 91: +YY_RULE_SETUP +#line 201 "swf5compiler.flex" +{ count(); return NOT; } + YY_BREAK +case 92: +YY_RULE_SETUP +#line 202 "swf5compiler.flex" +{ count(); return STRINGEQ; } + YY_BREAK +case 93: +YY_RULE_SETUP +#line 203 "swf5compiler.flex" +{ count(); return STRINGLENGTH; } + YY_BREAK +case 94: +YY_RULE_SETUP +#line 204 "swf5compiler.flex" +{ count(); return SUBSTRING; } + YY_BREAK +case 95: +YY_RULE_SETUP +#line 205 "swf5compiler.flex" +{ count(); return GETVARIABLE; } + YY_BREAK +case 96: +YY_RULE_SETUP +#line 206 "swf5compiler.flex" +{ count(); return SETVARIABLE; } + YY_BREAK +case 97: +YY_RULE_SETUP +#line 207 "swf5compiler.flex" +{ count(); return SETTARGETEXPRESSION; } + YY_BREAK +case 98: +YY_RULE_SETUP +#line 208 "swf5compiler.flex" +{ count(); return STARTDRAG; } + YY_BREAK +case 99: +YY_RULE_SETUP +#line 209 "swf5compiler.flex" +{ count(); return STOPDRAG; } + YY_BREAK +case 100: +YY_RULE_SETUP +#line 210 "swf5compiler.flex" +{ count(); return STRINGLESSTHAN; } + YY_BREAK +case 101: +YY_RULE_SETUP +#line 211 "swf5compiler.flex" +{ count(); return MBLENGTH; } + YY_BREAK +case 102: +YY_RULE_SETUP +#line 212 "swf5compiler.flex" +{ count(); return MBSUBSTRING; } + YY_BREAK +case 103: +YY_RULE_SETUP +#line 213 "swf5compiler.flex" +{ count(); return MBORD; } + YY_BREAK +case 104: +YY_RULE_SETUP +#line 214 "swf5compiler.flex" +{ count(); return MBCHR; } + YY_BREAK +case 105: +YY_RULE_SETUP +#line 215 "swf5compiler.flex" +{ count(); return BRANCHALWAYS; } + YY_BREAK +case 106: +YY_RULE_SETUP +#line 216 "swf5compiler.flex" +{ count(); return BRANCHALWAYS; } + YY_BREAK +case 107: +YY_RULE_SETUP +#line 217 "swf5compiler.flex" +{ count(); return BRANCHIFTRUE; } + YY_BREAK +case 108: +YY_RULE_SETUP +#line 218 "swf5compiler.flex" +{ count(); return POST; } + YY_BREAK +case 109: +YY_RULE_SETUP +#line 219 "swf5compiler.flex" +{ count(); return GET; } + YY_BREAK +case 110: +YY_RULE_SETUP +#line 220 "swf5compiler.flex" +{ count(); return END; } + YY_BREAK + +case 111: +YY_RULE_SETUP +#line 223 "swf5compiler.flex" +{ count(); swf5lval.str = strdup(swf5text+2); + return REGISTER; } + YY_BREAK +case 112: +YY_RULE_SETUP +#line 227 "swf5compiler.flex" +{ count(); swf5lval.str = strdup(swf5text); + return IDENTIFIER; } + YY_BREAK +case 113: +/* rule 113 can match eol */ +YY_RULE_SETUP +#line 230 "swf5compiler.flex" +{ count(); swf5lval.str = strdup(swf5text+1); + swf5lval.str[strlen(swf5lval.str)-1]=0; + unescape(swf5lval.str); + return STRING; } + YY_BREAK +case 114: +/* rule 114 can match eol */ +YY_RULE_SETUP +#line 235 "swf5compiler.flex" +{ count(); swf5lval.str = strdup(swf5text+1); + swf5lval.str[strlen(swf5lval.str)-1]=0; + unescape(swf5lval.str); + return STRING; } + YY_BREAK +case 115: +/* rule 115 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up swf5text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up swf5text again */ +YY_RULE_SETUP +#line 240 "swf5compiler.flex" +{ count(); swf5lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + YY_BREAK +case 116: +/* rule 116 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up swf5text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up swf5text again */ +YY_RULE_SETUP +#line 244 "swf5compiler.flex" +{ count(); swf5lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + YY_BREAK +case 117: +YY_RULE_SETUP +#line 248 "swf5compiler.flex" +{ count(); comment(); } + YY_BREAK +case 118: +YY_RULE_SETUP +#line 249 "swf5compiler.flex" +{ count(); comment1(); } + YY_BREAK +case 119: +YY_RULE_SETUP +#line 250 "swf5compiler.flex" +{ count(); } + YY_BREAK +case 120: +YY_RULE_SETUP +#line 252 "swf5compiler.flex" +{ count(); return INCR; } + YY_BREAK +case 121: +YY_RULE_SETUP +#line 253 "swf5compiler.flex" +{ count(); return DECR; } + YY_BREAK +case 122: +YY_RULE_SETUP +#line 254 "swf5compiler.flex" +{ count(); return LE; } + YY_BREAK +case 123: +YY_RULE_SETUP +#line 255 "swf5compiler.flex" +{ count(); return GE; } + YY_BREAK +case 124: +YY_RULE_SETUP +#line 256 "swf5compiler.flex" +{ count(); return EQ; } + YY_BREAK +case 125: +YY_RULE_SETUP +#line 257 "swf5compiler.flex" +{ count(); return NE; } + YY_BREAK +case 126: +YY_RULE_SETUP +#line 258 "swf5compiler.flex" +{ count(); return LAN; } + YY_BREAK +case 127: +YY_RULE_SETUP +#line 259 "swf5compiler.flex" +{ count(); return LOR; } + YY_BREAK +case 128: +YY_RULE_SETUP +#line 260 "swf5compiler.flex" +{ count(); return MEQ; } + YY_BREAK +case 129: +YY_RULE_SETUP +#line 261 "swf5compiler.flex" +{ count(); return DEQ; } + YY_BREAK +case 130: +YY_RULE_SETUP +#line 262 "swf5compiler.flex" +{ count(); return IEQ; } + YY_BREAK +case 131: +YY_RULE_SETUP +#line 263 "swf5compiler.flex" +{ count(); return SEQ; } + YY_BREAK +case 132: +YY_RULE_SETUP +#line 264 "swf5compiler.flex" +{ count(); return AEQ; } + YY_BREAK +case 133: +YY_RULE_SETUP +#line 265 "swf5compiler.flex" +{ count(); return OEQ; } + YY_BREAK +case 134: +YY_RULE_SETUP +#line 266 "swf5compiler.flex" +{ count(); return SHL; } + YY_BREAK +case 135: +YY_RULE_SETUP +#line 267 "swf5compiler.flex" +{ count(); return SHR; } + YY_BREAK +case 136: +YY_RULE_SETUP +#line 268 "swf5compiler.flex" +{ count(); return SHR2; } + YY_BREAK +case 137: +YY_RULE_SETUP +#line 269 "swf5compiler.flex" +{ count(); return SHLEQ; } + YY_BREAK +case 138: +YY_RULE_SETUP +#line 270 "swf5compiler.flex" +{ count(); return SHREQ; } + YY_BREAK +case 139: +YY_RULE_SETUP +#line 271 "swf5compiler.flex" +{ count(); return SHR2EQ; } + YY_BREAK +case 140: +YY_RULE_SETUP +#line 273 "swf5compiler.flex" +{ count(); return '<'; } + YY_BREAK +case 141: +YY_RULE_SETUP +#line 274 "swf5compiler.flex" +{ count(); return '>'; } + YY_BREAK +case 142: +YY_RULE_SETUP +#line 275 "swf5compiler.flex" +{ count(); return ';'; } + YY_BREAK +case 143: +YY_RULE_SETUP +#line 276 "swf5compiler.flex" +{ count(); return '='; } + YY_BREAK +case 144: +YY_RULE_SETUP +#line 277 "swf5compiler.flex" +{ count(); return '+'; } + YY_BREAK +case 145: +YY_RULE_SETUP +#line 278 "swf5compiler.flex" +{ count(); return '-'; } + YY_BREAK +case 146: +YY_RULE_SETUP +#line 279 "swf5compiler.flex" +{ count(); return '&'; } + YY_BREAK +case 147: +YY_RULE_SETUP +#line 280 "swf5compiler.flex" +{ count(); return '|'; } + YY_BREAK +case 148: +YY_RULE_SETUP +#line 281 "swf5compiler.flex" +{ count(); return '^'; } + YY_BREAK +case 149: +YY_RULE_SETUP +#line 282 "swf5compiler.flex" +{ count(); return '*'; } + YY_BREAK +case 150: +YY_RULE_SETUP +#line 283 "swf5compiler.flex" +{ count(); return '/'; } + YY_BREAK +case 151: +YY_RULE_SETUP +#line 284 "swf5compiler.flex" +{ count(); return '%'; } + YY_BREAK +case 152: +YY_RULE_SETUP +#line 285 "swf5compiler.flex" +{ count(); return '!'; } + YY_BREAK +case 153: +YY_RULE_SETUP +#line 286 "swf5compiler.flex" +{ count(); return '('; } + YY_BREAK +case 154: +YY_RULE_SETUP +#line 287 "swf5compiler.flex" +{ count(); return ')'; } + YY_BREAK +case 155: +YY_RULE_SETUP +#line 288 "swf5compiler.flex" +{ count(); return '['; } + YY_BREAK +case 156: +YY_RULE_SETUP +#line 289 "swf5compiler.flex" +{ count(); return ']'; } + YY_BREAK +case 157: +YY_RULE_SETUP +#line 290 "swf5compiler.flex" +{ count(); return '{'; } + YY_BREAK +case 158: +YY_RULE_SETUP +#line 291 "swf5compiler.flex" +{ count(); BEGIN(0); return '}'; } + YY_BREAK +case 159: +YY_RULE_SETUP +#line 292 "swf5compiler.flex" +{ count(); return ','; } + YY_BREAK +case 160: +YY_RULE_SETUP +#line 293 "swf5compiler.flex" +{ count(); return '.'; } + YY_BREAK +case 161: +YY_RULE_SETUP +#line 294 "swf5compiler.flex" +{ count(); return '?'; } + YY_BREAK +case 162: +YY_RULE_SETUP +#line 295 "swf5compiler.flex" +{ count(); return ':'; } + YY_BREAK +case 163: +YY_RULE_SETUP +#line 296 "swf5compiler.flex" +{ count(); return '~'; } + YY_BREAK +case 164: +/* rule 164 can match eol */ +YY_RULE_SETUP +#line 298 "swf5compiler.flex" +{ count(); strcpy(szLine, swf5text + 1); + countline(); yyless(1); } + YY_BREAK +case 165: +YY_RULE_SETUP +#line 301 "swf5compiler.flex" +SWF_error("Unrecognized character: %s\n", swf5text); + YY_BREAK +case 166: +YY_RULE_SETUP +#line 303 "swf5compiler.flex" +ECHO; + YY_BREAK +#line 2040 "lex.swf5.c" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(asm): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed swf5in at a new source and called + * swf5lex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = swf5in; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( swf5wrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * swf5text, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of swf5lex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + swf5realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + swf5restart(swf5in ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 650 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 650 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 649); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up swf5text */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + swf5restart(swf5in ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( swf5wrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve swf5text */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void swf5restart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + swf5ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + swf5_create_buffer(swf5in,YY_BUF_SIZE ); + } + + swf5_init_buffer(YY_CURRENT_BUFFER,input_file ); + swf5_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void swf5_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * swf5pop_buffer_state(); + * swf5push_buffer_state(new_buffer); + */ + swf5ensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + swf5_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (swf5wrap()) processing, but the only time this flag + * is looked at is after swf5wrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void swf5_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + swf5in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE swf5_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) swf5alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in swf5_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) swf5alloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in swf5_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + swf5_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with swf5_create_buffer() + * + */ + void swf5_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + swf5free((void *) b->yy_ch_buf ); + + swf5free((void *) b ); +} + +#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __THROW /* this is a gnuism */ +extern int isatty (int ) __THROW; +#else +extern int isatty (int ); +#endif +#ifdef __cplusplus +} +#endif +#endif + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a swf5restart() or at EOF. + */ + static void swf5_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + swf5_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then swf5_init_buffer was _probably_ + * called from swf5restart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void swf5_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + swf5_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void swf5push_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + swf5ensure_buffer_stack(); + + /* This block is copied from swf5_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from swf5_switch_to_buffer. */ + swf5_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void swf5pop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + swf5_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + swf5_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void swf5ensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)swf5alloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)swf5realloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE swf5_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) swf5alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in swf5_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + swf5_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to swf5lex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * swf5_scan_bytes() instead. + */ +YY_BUFFER_STATE swf5_scan_string (yyconst char * yystr ) +{ + + return swf5_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to swf5lex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE swf5_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) swf5alloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in swf5_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = swf5_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in swf5_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up swf5text. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + swf5text[swf5leng] = (yy_hold_char); \ + (yy_c_buf_p) = swf5text + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + swf5leng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int swf5get_lineno (void) +{ + + return swf5lineno; +} + +/** Get the input stream. + * + */ +FILE *swf5get_in (void) +{ + return swf5in; +} + +/** Get the output stream. + * + */ +FILE *swf5get_out (void) +{ + return swf5out; +} + +/** Get the length of the current token. + * + */ +int swf5get_leng (void) +{ + return swf5leng; +} + +/** Get the current token. + * + */ + +char *swf5get_text (void) +{ + return swf5text; +} + +/** Set the current line number. + * @param line_number + * + */ +void swf5set_lineno (int line_number ) +{ + + swf5lineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see swf5_switch_to_buffer + */ +void swf5set_in (FILE * in_str ) +{ + swf5in = in_str ; +} + +void swf5set_out (FILE * out_str ) +{ + swf5out = out_str ; +} + +int swf5get_debug (void) +{ + return swf5_flex_debug; +} + +void swf5set_debug (int bdebug ) +{ + swf5_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from swf5lex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + swf5in = stdin; + swf5out = stdout; +#else + swf5in = (FILE *) 0; + swf5out = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * swf5lex_init() + */ + return 0; +} + +/* swf5lex_destroy is for both reentrant and non-reentrant scanners. */ +int swf5lex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + swf5_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + swf5pop_buffer_state(); + } + + /* Destroy the stack itself. */ + swf5free((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * swf5lex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *swf5alloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *swf5realloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void swf5free (void * ptr ) +{ + free( (char *) ptr ); /* see swf5realloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 303 "swf5compiler.flex" + + +static int getinput() { +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif +} + +int swf5wrap() +{ + return 1; +} + +static void countline() +{ + if(sLineNumber != 0) + msgline[column] = 0; + + ++sLineNumber; + column = 0; + msgline = msgbufs[sLineNumber & 1]; +} + +static int LineNumber(void) +{ + return (sLineNumber + 1); +} + +static int ColumnNumber(void) +{ + return column; +} + +static char *LineText(void) +{ + msgline[column] = 0; + return msgline; +} + +static void comment() +{ + // Handle block comments + + int c, c1; + +loop: + // We have the start of a comment so look skip everything up to the + // end of the comment character + while ((c = getinput()) != '*' && c != EOF) + { + if(column < 1023) + msgline[column] = c; + + ++column; + + // keep the line number in synch + if (c == '\n') + { + // start the output (matches the algorithim in the lexx above) + countline(); + } + + if (swf5debug) putchar(c); + } + + // is this the end of comment character + if ((c1 = getinput()) != '/' && c != EOF) + { + // false start as this was no end of comment + do_unput5(c1); + goto loop; + } + + // write out the start of the end of comment + if (c != EOF) + if (swf5debug) putchar(c); + + // write out the end of the end of comment + if (c1 != EOF) + if (swf5debug) putchar(c1); +} + +static void comment1() +{ + // Handle comment of type 1 (ie '//') + + int c; + + // this is a line comment + while ((c = getinput()) != '\n' && c != EOF) + { + if (swf5debug) putchar(c); + + if(column < 1023) + msgline[column] = c; + + ++column; + }; + + // keep the line number in synch + if (c == '\n') + { + if (swf5debug) putchar(c); + + countline(); + } +} + +static void count(void) +{ + int n; + + // Count the characters to maintain the current column position + if (swf5text[0] == '\n') + { + if (swf5debug) printf("\n"); + } + else + { + if (swf5debug) printf("%s", swf5text); + + for(n=0; n +#include +#include "libming.h" + +int SWF_versionNum = 7; + +void (*SWF_error)(const char *msg, ...) = 0; +void (*SWF_warn)(const char *msg, ...) = 0; + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/libming.h b/fluidbook/tools/swftools-special-swfdump/lib/action/libming.h new file mode 100644 index 000000000..2ea6a9b7f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/libming.h @@ -0,0 +1,15 @@ +#include +#include +#include + +#ifndef __libming_h__ +#define __libming_h__ + +typedef unsigned char byte; + +extern void (*SWF_error)(const char *msg, ...); +extern void (*SWF_warn)(const char *msg, ...); + +extern int SWF_versionNum; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c b/fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c new file mode 100644 index 000000000..b3309cec9 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c @@ -0,0 +1,557 @@ +#include +#include +#include +#include "action.h" +#include "compile.h" + + +#define print(x) {fputs(x,stdout);} + +int gIndent; +#define INDENT_LEVEL 2 + +void println(const char *s, ...) +{ + va_list ap; + int n = gIndent*INDENT_LEVEL; + + while(n-- > 0) + putchar(' '); + + va_start(ap, s); + vprintf(s, ap); + va_end(ap); + + putchar('\n'); +} + +int fileOffset = 0; + +int readUInt8(Buffer f) +{ + return f->buffer[fileOffset++]; +} + +int readSInt8(Buffer f) +{ + return (signed char)readUInt8(f); +} + +int readSInt16(Buffer f) +{ + return readUInt8(f) + readSInt8(f)*256; +} + +int readUInt16(Buffer f) +{ + return readUInt8(f) + (readUInt8(f)<<8); +} + +long readSInt32(Buffer f) +{ + return (long)readUInt8(f) + (readUInt8(f)<<8) + (readUInt8(f)<<16) + (readUInt8(f)<<24); +} + +unsigned long readUInt32(Buffer f) +{ + return (unsigned long)(readUInt8(f) + (readUInt8(f)<<8) + (readUInt8(f)<<16) + (readUInt8(f)<<24)); +} + +double readDouble(Buffer f) +{ + double d; + unsigned char *p = (unsigned char *)&d; + + p[4] = readUInt8(f); + p[5] = readUInt8(f); + p[6] = readUInt8(f); + p[7] = readUInt8(f); + p[0] = readUInt8(f); + p[1] = readUInt8(f); + p[2] = readUInt8(f); + p[3] = readUInt8(f); + + return d; +} + +char *readString(Buffer f) +{ + int len = 0, buflen = 256; + char c, *buf, *p; + + buf = (char *)malloc(sizeof(char)*256); + p = buf; + + while((c=(char)readUInt8(f)) != '\0') + { + if(len==buflen) + { + buf = (char *)realloc(buf, sizeof(char)*(buflen+256)); + buflen += 256; + p = buf+len; + } + + *(p++) = c; + ++len; + } + + *p = 0; + + return buf; +} + +void dumpBytes(Buffer f, int length) +{ + int j=0, i, k; + unsigned char buf[16]; + + if(length==0) + return; + + for(;;) + { + for(i=0; i<16; ++i) + { + printf("%02x ", buf[i] = readUInt8(f)); + ++j; + + if(j==length) + break; + } + + if(j==length) + { + for(k=i+1; k<16; ++k) + print(" "); + + ++i; + } + + print(" "); + + for(k=0; k 31) && (buf[k] < 128)) + putchar(buf[k]); + else + putchar('.'); + + putchar('\n'); + + if(j==length) + break; + } + putchar('\n'); + putchar('\n'); +} + +void printDoAction(Buffer f, int length); + +char *dictionary[256]; + +int printActionRecord(Buffer f) +{ + int length = 0, type; + + printf("(%i)\t", fileOffset); + + type = readUInt8(f); + + if((type&0x80) == 0x80) + length = readUInt16(f); + + switch(type) + { + case SWFACTION_ADD: + println("Add"); + break; + case SWFACTION_SUBTRACT: + println("Subtract"); + break; + case SWFACTION_MULTIPLY: + println("Multiply"); + break; + case SWFACTION_DIVIDE: + println("Divide"); + break; + case SWFACTION_EQUAL: + println("Equals"); + break; + case SWFACTION_LESSTHAN: + println("Less Than"); + break; + case SWFACTION_LOGICALAND: + println("And"); + break; + case SWFACTION_LOGICALOR: + println("Or"); + break; + case SWFACTION_LOGICALNOT: + println("Not"); + break; + case SWFACTION_STRINGEQ: + println("String eq"); + break; + case SWFACTION_STRINGLENGTH: + println("String Length"); + break; + case SWFACTION_SUBSTRING: + println("Substring"); + break; + case SWFACTION_POP: + println("Pop"); + break; + case SWFACTION_INT: + println("Int"); + break; + case SWFACTION_GETVARIABLE: + println("Get Variable"); + break; + case SWFACTION_SETVARIABLE: + println("Set Variable"); + break; + case SWFACTION_SETTARGETEXPRESSION: + println("Set Target Expression"); + break; + case SWFACTION_STRINGCONCAT: + println("String Concat"); + break; + case SWFACTION_GETPROPERTY: + println("Get Property"); + break; + case SWFACTION_SETPROPERTY: + println("Set Property"); + break; + case SWFACTION_DUPLICATECLIP: + println("Duplicate Clip"); + break; + case SWFACTION_REMOVECLIP: + println("Remove Clip"); + break; + case SWFACTION_TRACE: + println("Trace"); + break; + case SWFACTION_STARTDRAGMOVIE: + println("Start Drag Movie"); + break; + case SWFACTION_STOPDRAGMOVIE: + println("Stop Drag Movie"); + break; + case SWFACTION_STRINGCOMPARE: + println("String Compare"); + break; + case SWFACTION_RANDOM: + println("Random"); + break; + case SWFACTION_MBLENGTH: + println("String MB Length"); + break; + case SWFACTION_ORD: + println("Ord"); + break; + case SWFACTION_CHR: + println("Chr"); + break; + case SWFACTION_GETTIMER: + println("Get Timer"); + break; + case SWFACTION_MBSUBSTRING: + println("MB Substring"); + break; + case SWFACTION_MBORD: + println("MB Ord"); + break; + case SWFACTION_MBCHR: + println("MB Chr"); + break; + case SWFACTION_NEXTFRAME: + println("Next Frame"); + break; + case SWFACTION_PREVFRAME: + println("Previous Frame"); + break; + case SWFACTION_PLAY: + println("Play"); + break; + case SWFACTION_STOP: + println("Stop"); + break; + case SWFACTION_TOGGLEQUALITY: + println("Toggle Quality"); + break; + case SWFACTION_STOPSOUNDS: + println("Stop Sounds"); + break; + + /* ops with args */ + case SWFACTION_PUSHDATA: + { + int type; + int start = fileOffset; + + while(fileOffset < start+length) + { + switch(type = readUInt8(f)) + { + case 0: /* string */ + println("Push String: %s", readString(f)); + break; + case 1: /* property */ + readUInt16(f); /* always 0? */ + println("Push Property: %04x", readUInt16(f)); + break; + case 2: /* null */ + println("Push NULL"); + break; + case 3: /* ??? */ + println("Push type 3- ??"); + break; + case 4: + println("Push register %i", readUInt8(f)); + break; + case 5: + if(readUInt8(f)) + println("Push true"); + else + println("Push false"); + break; + case 6: /* double */ + println("Push %f", readDouble(f)); + break; + case 7: /* int */ + println("Push %i", readSInt32(f)); + break; + case 8: /* dictionary */ + println("Push \"%s\"", dictionary[readUInt8(f)]); + break; + case 9: /* dictionary */ + println("Push \"%s\"", dictionary[readSInt16(f)]); + default: + println("unknown push type: %i", type); + } + } + break; + } + case SWFACTION_GOTOFRAME: + println("Goto Frame %i", readUInt16(f)); + break; + case SWFACTION_GETURL: + { + char *url = readString(f); + println("Get URL \"%s\" target \"%s\"", url, readString(f)); + break; + } + case SWFACTION_WAITFORFRAMEEXPRESSION: + println("Wait For Frame Expression, skip %i\n", readUInt8(f)); + break; + case SWFACTION_BRANCHALWAYS: + println("Branch Always %i", readSInt16(f)); + break; + case SWFACTION_GETURL2: + { + int flags = readUInt8(f); + + const char *op = (flags & 0x80) ? "Get URL2 (loadvariables)" : "Get URL2"; + const char *tgt = (flags & 0x40) ? " into target" : ""; + + switch(flags & 0x03) + { + case 0: println("%s%s (Don't send)", op, tgt); break; + case 1: println("%s%s (GET)", op, tgt); break; + case 2: println("%s%s (POST)", op, tgt); break; + } + } + break; + case SWFACTION_BRANCHIFTRUE: + println("Branch If True %i", readSInt16(f)); + break; + case SWFACTION_CALLFRAME: + println("Call Frame"); + dumpBytes(f, length); + break; + case SWFACTION_GOTOEXPRESSION: + print("Goto Expression"); + if(readUInt8(f) == 1) + printf(" and Play\n"); + else + printf(" and Stop\n"); + break; + case SWFACTION_WAITFORFRAME: + { + int frame = readUInt16(f); + println("Wait for frame %i else skip %i", frame, readUInt8(f)); + break; + } + case SWFACTION_SETTARGET: + println("Set Target %s", readString(f)); + break; + case SWFACTION_GOTOLABEL: + println("Goto Label %s", readString(f)); + break; + case SWFACTION_END: + return 0; + break; + + /* f5 ops */ + case SWFACTION_DELETE: + println("Delete"); + break; + case SWFACTION_VAR: + println("Var"); + break; + case SWFACTION_VAREQUALS: + println("Var assign"); + break; + case SWFACTION_INITARRAY: + println("Init array"); + break; + case SWFACTION_INITOBJECT: + println("Init object"); + break; + case SWFACTION_CALLFUNCTION: + println("call function"); + break; + case SWFACTION_RETURN: + println("return"); + break; + case SWFACTION_MODULO: + println("modulo"); + break; + case SWFACTION_NEW: + println("new"); + break; + case SWFACTION_TYPEOF: + println("typeof"); + break; + case SWFACTION_NEWADD: + println("new add"); + break; + case SWFACTION_NEWLESSTHAN: + println("new less than"); + break; + case SWFACTION_NEWEQUALS: + println("new equals"); + break; + case SWFACTION_DUP: + println("dup"); + break; + case SWFACTION_SWAP: + println("swap"); + break; + case SWFACTION_GETMEMBER: + println("get member"); + break; + case SWFACTION_SETMEMBER: + println("set member"); + break; + case SWFACTION_INCREMENT: + println("increment"); + break; + case SWFACTION_CALLMETHOD: + println("call method"); + break; + case SWFACTION_BITWISEAND: + println("bitwise and"); + break; + case SWFACTION_BITWISEOR: + println("bitwise or"); + break; + case SWFACTION_BITWISEXOR: + println("bitwise xor"); + break; + case SWFACTION_SHIFTLEFT: + println("shift left"); + break; + case SWFACTION_SHIFTRIGHT: + println("shift right"); + break; + case SWFACTION_SHIFTRIGHT2: + println("shift right 2"); + break; + + case SWFACTION_CONSTANTPOOL: + { + int i, n = readUInt16(f); + print("declare dictionary:"); + + for(i=0; i 0) + { + printf("%s", readString(f)); + --n; + } + + for(; n>0; --n) + printf(", %s", readString(f)); + + putchar(')'); + putchar('\n'); + + ++gIndent; + printDoAction(f, readUInt16(f)); + --gIndent; + + break; + } + + case SWFACTION_ENUMERATE: + println("enumerate"); + break; + + case SWFACTION_SETREGISTER: + println("set register %i", readUInt8(f)); + break; + +/* f6 actions */ + case SWFACTION_INSTANCEOF: + println("instanceof"); + break; + case SWFACTION_STRICTEQ: + println("strict_equals"); + break; + case SWFACTION_ENUM2: + println("enum2"); + break; + + default: + println("Unknown Action: %02X", type); + dumpBytes(f, length); + } + + return 1; +} + +void printDoAction(Buffer f, int length) +{ + int end; + + if(!f) + return; + + end = fileOffset + length; + + while(fileOffset < end && printActionRecord(f)) + ; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/ming.h b/fluidbook/tools/swftools-special-swfdump/lib/action/ming.h new file mode 100644 index 000000000..cbe4428af --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/ming.h @@ -0,0 +1 @@ +#include "libming.h" diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex new file mode 100644 index 000000000..6a6dddde7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex @@ -0,0 +1,403 @@ +%{ + +#include +#include + +#include "compile.h" +#include "action.h" +#include "blocks/error.h" +#include "swf4compiler.tab.h" /* defines token types */ + +static int swf4debug; + +static const char *lexBuffer = NULL; +static int lexBufferLen = 0; + +static int sLineNumber = 0; +static char szLine[1024]; +static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; +static int column = 0; + +static void comment(); +static void comment1(); +static void count(); +static void warning(char *msg); + +#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) + +/* thanks to the prolific and brilliant Raff: */ +static int lexBufferInput(char *buf, int max_size) +{ + int l = lexBufferLen > max_size ? max_size : lexBufferLen; + + if (lexBufferLen <= 0) + return YY_NULL; + + memcpy(buf, lexBuffer, l); + lexBuffer += l; + lexBufferLen -= l; + return l; +} + + /* very inefficient method of unescaping strings */ +static void unescape(char *buf) +{ + char *p, *p1; + + for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { + switch(p[1]) + { + case 'b' : p[1] = '\b'; break; + case 'f' : p[1] = '\f'; break; + case 'n' : p[1] = '\n'; break; + case 'r' : p[1] = '\r'; break; + case 't' : p[1] = '\t'; break; + case 'x' : + case 'u' : warning("unsupported escape sequence"); + } + strcpy(p, p+1); + } +} + +void swf4ParseInit(const char *script, int debug) +{ + checkByteOrder(); + yyrestart(NULL); + + swf4debug = debug; + + lexBuffer = script; + lexBufferLen = strlen(script); + sLineNumber = 0; + column = 0; + msgline = msgbufs[0]; +} + +%} + +%{ + // forward declaration needed by the following function +#ifndef YY_PROTO +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif +#endif + static void yyunput YY_PROTO(( int c, char *buf_ptr )); + + void do_unput4(const char c) { unput(c); } +%} + +DIGIT [0-9] +ID [a-zA-Z_][a-zA-Z0-9_]* +LEVEL \.\.? + +%% + +{DIGIT}+ { count(); swf4lval.str = strdup(yytext); + return NUMBER; } +{DIGIT}+"."{DIGIT}* { count(); swf4lval.str = strdup(yytext); + return NUMBER; } +true { count(); swf4lval.str = strdup("1"); + return NUMBER; } +false { count(); swf4lval.str = strdup("0"); + return NUMBER; } +break { count(); return BREAK; } +continue { count(); return CONTINUE; } +else { count(); return ELSE; } +for { count(); return FOR; } +if { count(); return IF; } +while { count(); return WHILE; } +do { count(); return DO; } +valueOf { count(); return EVAL; } + + /* functions */ +random { count(); return RANDOM; } +time { count(); return TIME; } +length { count(); return LENGTH; } +int { count(); return INT; } +concat { count(); return CONCAT; } +duplicateClip { count(); return DUPLICATECLIP; } +removeClip { count(); return REMOVECLIP; } +trace { count(); return TRACE; } +startDrag { count(); return STARTDRAG; } +stopDrag { count(); return STOPDRAG; } +ord { count(); return ORD; } +chr { count(); return CHR; } +callFrame { count(); return CALLFRAME; } +getURL { count(); return GETURL; } +getURL1 { count(); return GETURL1; } +loadMovie { count(); return LOADMOVIE; } +loadVariables { count(); return LOADVARIABLES; } +substr { count(); return SUBSTR; } + +getProperty { count(); return GETPROPERTY; } + + /* getURL2 methods */ +post { count(); swf4lval.getURLMethod = GETURL_METHOD_POST; + return GETURL_METHOD; } +get { count(); swf4lval.getURLMethod = GETURL_METHOD_GET; + return GETURL_METHOD; } +nosend { count(); swf4lval.getURLMethod = GETURL_METHOD_NOSEND; + return GETURL_METHOD; } + + + /* v3 functions */ +nextFrame { count(); return NEXTFRAME; } +prevFrame { count(); return PREVFRAME; } +play { count(); return PLAY; } +stop { count(); return STOP; } +toggleQuality { count(); return TOGGLEQUALITY; } +stopSounds { count(); return STOPSOUNDS; } +gotoFrame { count(); return GOTOFRAME; } +gotoAndPlay { count(); return GOTOANDPLAY; } +frameLoaded { count(); return FRAMELOADED; } +setTarget { count(); return SETTARGET; } + + /* high level functions */ +tellTarget { count(); return TELLTARGET; } + + +this { count(); return THIS; } + +{ID} { count(); swf4lval.str = strdup(yytext); + return IDENTIFIER; } + +{LEVEL}?("/"({ID}|{LEVEL}))+ { count(); swf4lval.str = strdup(yytext); + return PATH; } + +{ID}("/"({ID}|{LEVEL}))+ { count(); swf4lval.str = strdup(yytext); + return PATH; } + +\"(\\.|[^\\"])*\" { count(); swf4lval.str = strdup(yytext+1); + swf4lval.str[strlen(swf4lval.str)-1]=0; + unescape(swf4lval.str); + return STRING; } + +\'(\\.|[^\\'])*\' { count(); swf4lval.str = strdup(yytext+1); + swf4lval.str[strlen(swf4lval.str)-1]=0; + unescape(swf4lval.str); + return STRING; } + +\"(\\.|[^\\"])*$ { count(); swf4lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + +\'(\\.|[^\\'])*$ { count(); swf4lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + +"/*" { count(); comment(); } +"//" { count(); comment1(); } +[ \t\v\f] { count(); } + +"++" { count(); return INC; } +"--" { count(); return DEC; } +"<" { count(); return '<'; } +">" { count(); return '>'; } +"<=" { count(); return LE; } +">=" { count(); return GE; } +"==" { count(); return EQ; } +"!=" { count(); return NE; } +"&&" { count(); return LAN; } +"||" { count(); return LOR; } +"*=" { count(); return MEQ; } +"/=" { count(); return DEQ; } +"+=" { count(); return IEQ; } +"-=" { count(); return SEQ; } +"===" { count(); return STREQ; } +"!==" { count(); return STRNE; } +"<=>" { count(); return STRCMP; } +".." { count(); return PARENT; } + +";" { count(); return ';'; } +"=" { count(); return '='; } +"+" { count(); return '+'; } +"-" { count(); return '-'; } +"&" { count(); return '&'; } +"*" { count(); return '*'; } +"/" { count(); return '/'; } +"!" { count(); return '!'; } +"(" { count(); return '('; } +")" { count(); return ')'; } +"[" { count(); return '['; } +"]" { count(); return ']'; } +"{" { count(); return '{'; } +"}" { count(); return '}'; } +"," { count(); return ','; } +"." { count(); return '.'; } +"?" { count(); return '?'; } +":" { count(); return ':'; } + +\r?\n { count(); column = 0; + strcpy(szLine, yytext + 1); + ++sLineNumber; yyless(1); } + +. printf( "Unrecognized character: %s\n", yytext ); + +%% +static int getinput() { +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif +} + +int swf4wrap() +{ + return 1; +} + +static void countline() +{ + if(sLineNumber != 0) + msgline[column] = 0; + + ++sLineNumber; + column = 0; + msgline = msgbufs[sLineNumber & 1]; +} + +static int LineNumber(void) +{ + return (sLineNumber + 1); +} + +static int ColumnNumber(void) +{ + return column; +} + +static char *LineText(void) +{ + msgline[column] = 0; + return msgline; +} + +static void comment(void) +{ + // Handle block comments + + int c, c1; + +loop: + // We have the start of a comment so look skip everything up to the + // end of the comment character + while ((c = getinput()) != '*' && c != EOF) + { + if(column < 1023) + msgline[column] = c; + + ++column; + + // keep the line number in synch + if (c == '\n') + { + // start the output (matches the algorithim in the lexx above) + countline(); + } + + if (swf4debug) putchar(c); + } + + // is this the end of comment character + if ((c1 = getinput()) != '/' && c != EOF) + { + // false start as this was no end of comment + do_unput4(c1); + goto loop; + } + + // write out the start of the end of comment + if (c != EOF) + if (swf4debug) putchar(c); + + // write out the end of the end of comment + if (c1 != EOF) + if (swf4debug) putchar(c1); +} + +static void comment1(void) +{ + // Handle comment of type 1 (ie '//') + + int c; + + // this is a line comment + while ((c = getinput()) != '\n' && c != EOF) + { + if (swf4debug) putchar(c); + + if(column < 1023) + msgline[column] = c; + + ++column; + }; + + // keep the line number in synch + if (c == '\n') + { + if (swf4debug) putchar(c); + + countline(); + } +} + +static void count(void) +{ + int n; + + // Count the characters to maintain the current column position + if (yytext[0] == '\n') + { + if (swf4debug) printf("\n"); + } + else + { + if (swf4debug) printf("%s", yytext); + + for(n=0; n. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse swf4parse +#define yylex swf4lex +#define yyerror swf4error +#define yylval swf4lval +#define yychar swf4char +#define yydebug swf4debug +#define yynerrs swf4nerrs + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 5 "swf4compiler.y" + + +#include +#include +#include +#include "compile.h" +#include "action.h" + +#define YYPARSE_PARAM buffer + + + +/* Line 189 of yacc.c */ +#line 94 "swf4compiler.tab.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + BREAK = 258, + FOR = 259, + CONTINUE = 260, + IF = 261, + ELSE = 262, + DO = 263, + WHILE = 264, + THIS = 265, + EVAL = 266, + TIME = 267, + RANDOM = 268, + LENGTH = 269, + INT = 270, + CONCAT = 271, + DUPLICATECLIP = 272, + REMOVECLIP = 273, + TRACE = 274, + STARTDRAG = 275, + STOPDRAG = 276, + ORD = 277, + CHR = 278, + CALLFRAME = 279, + GETURL = 280, + GETURL1 = 281, + LOADMOVIE = 282, + LOADVARIABLES = 283, + POSTURL = 284, + SUBSTR = 285, + GETPROPERTY = 286, + NEXTFRAME = 287, + PREVFRAME = 288, + PLAY = 289, + STOP = 290, + TOGGLEQUALITY = 291, + STOPSOUNDS = 292, + GOTOFRAME = 293, + GOTOANDPLAY = 294, + FRAMELOADED = 295, + SETTARGET = 296, + TELLTARGET = 297, + STRING = 298, + NUMBER = 299, + IDENTIFIER = 300, + PATH = 301, + GETURL_METHOD = 302, + EQ = 303, + LE = 304, + GE = 305, + NE = 306, + LAN = 307, + LOR = 308, + INC = 309, + DEC = 310, + IEQ = 311, + DEQ = 312, + MEQ = 313, + SEQ = 314, + STREQ = 315, + STRNE = 316, + STRCMP = 317, + PARENT = 318, + END = 319, + UMINUS = 320, + POSTFIX = 321, + NEGATE = 322 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 17 "swf4compiler.y" + + Buffer action; + char *str; + SWFActionFunction function; + SWFGetUrl2Method getURLMethod; + + + +/* Line 214 of yacc.c */ +#line 206 "swf4compiler.tab.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 218 "swf4compiler.tab.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 108 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1341 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 86 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 22 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 137 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 369 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 322 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 76, 2, 2, 2, 2, 71, 2, + 83, 84, 74, 72, 65, 73, 85, 75, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 68, 82, + 69, 66, 70, 67, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 80, 2, 81, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 77, 78, 79 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 5, 7, 10, 12, 15, 19, 21, + 24, 26, 28, 30, 32, 34, 38, 39, 41, 44, + 55, 64, 74, 85, 94, 104, 112, 118, 119, 121, + 131, 137, 144, 154, 155, 157, 160, 163, 167, 172, + 177, 182, 187, 194, 203, 210, 217, 226, 233, 242, + 249, 264, 273, 277, 281, 285, 289, 293, 297, 302, + 307, 312, 317, 322, 327, 333, 339, 344, 348, 353, + 358, 363, 368, 373, 380, 389, 396, 399, 402, 404, + 408, 410, 413, 415, 417, 419, 423, 428, 431, 436, + 439, 442, 445, 449, 453, 457, 461, 465, 469, 473, + 477, 481, 485, 489, 493, 497, 501, 505, 509, 513, + 519, 521, 525, 527, 529, 531, 533, 535, 537, 539, + 541, 545, 547, 549, 552, 555, 560, 565, 569, 573, + 577, 581, 585, 591, 597, 603, 609, 615 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 87, 0, -1, 88, -1, 89, -1, 88, 89, -1, + 90, -1, 80, 81, -1, 80, 92, 81, -1, 82, + -1, 106, 82, -1, 93, -1, 95, -1, 97, -1, + 98, -1, 106, -1, 91, 65, 106, -1, -1, 90, + -1, 92, 90, -1, 6, 83, 40, 83, 44, 84, + 84, 90, 7, 90, -1, 6, 83, 40, 83, 44, + 84, 84, 90, -1, 6, 83, 76, 40, 83, 44, + 84, 84, 90, -1, 6, 83, 40, 83, 107, 84, + 84, 90, 7, 90, -1, 6, 83, 40, 83, 107, + 84, 84, 90, -1, 6, 83, 76, 40, 83, 107, + 84, 84, 90, -1, 6, 83, 107, 84, 90, 7, + 90, -1, 6, 83, 107, 84, 90, -1, -1, 107, + -1, 9, 83, 76, 40, 83, 44, 84, 84, 90, + -1, 9, 83, 107, 84, 90, -1, 8, 90, 9, + 83, 107, 84, -1, 4, 83, 96, 82, 94, 82, + 96, 84, 90, -1, -1, 91, -1, 5, 82, -1, + 3, 82, -1, 21, 83, 84, -1, 24, 83, 103, + 84, -1, 24, 83, 43, 84, -1, 18, 83, 107, + 84, -1, 19, 83, 107, 84, -1, 25, 83, 107, + 65, 107, 84, -1, 25, 83, 107, 65, 107, 65, + 47, 84, -1, 26, 83, 43, 65, 43, 84, -1, + 27, 83, 107, 65, 107, 84, -1, 27, 83, 107, + 65, 107, 65, 47, 84, -1, 28, 83, 107, 65, + 107, 84, -1, 28, 83, 107, 65, 107, 65, 47, + 84, -1, 20, 83, 107, 65, 107, 84, -1, 20, + 83, 107, 65, 107, 65, 107, 65, 107, 65, 107, + 65, 107, 84, -1, 17, 83, 107, 65, 107, 65, + 107, 84, -1, 32, 83, 84, -1, 33, 83, 84, + -1, 34, 83, 84, -1, 35, 83, 84, -1, 36, + 83, 84, -1, 37, 83, 84, -1, 38, 83, 44, + 84, -1, 38, 83, 43, 84, -1, 38, 83, 107, + 84, -1, 39, 83, 107, 84, -1, 41, 83, 43, + 84, -1, 41, 83, 107, 84, -1, 42, 83, 43, + 84, 90, -1, 42, 83, 107, 84, 90, -1, 11, + 83, 107, 84, -1, 12, 83, 84, -1, 13, 83, + 107, 84, -1, 14, 83, 107, 84, -1, 15, 83, + 107, 84, -1, 22, 83, 107, 84, -1, 23, 83, + 107, 84, -1, 16, 83, 107, 65, 107, 84, -1, + 30, 83, 107, 65, 107, 65, 107, 84, -1, 31, + 83, 107, 65, 43, 84, -1, 105, 54, -1, 105, + 55, -1, 100, -1, 83, 102, 84, -1, 44, -1, + 73, 44, -1, 43, -1, 103, -1, 104, -1, 104, + 85, 45, -1, 54, 104, 85, 45, -1, 54, 105, + -1, 55, 104, 85, 45, -1, 55, 105, -1, 73, + 102, -1, 76, 102, -1, 105, 66, 102, -1, 102, + 74, 102, -1, 102, 75, 102, -1, 102, 72, 102, + -1, 102, 73, 102, -1, 102, 71, 102, -1, 102, + 69, 102, -1, 102, 70, 102, -1, 102, 49, 102, + -1, 102, 50, 102, -1, 102, 61, 102, -1, 102, + 60, 102, -1, 102, 62, 102, -1, 102, 48, 102, + -1, 102, 51, 102, -1, 102, 52, 102, -1, 102, + 53, 102, -1, 102, 67, 102, 68, 102, -1, 45, + -1, 104, 68, 45, -1, 10, -1, 85, -1, 75, + -1, 63, -1, 45, -1, 46, -1, 103, -1, 43, + -1, 83, 102, 84, -1, 101, -1, 99, -1, 54, + 105, -1, 55, 105, -1, 54, 104, 85, 45, -1, + 55, 104, 85, 45, -1, 105, 66, 102, -1, 105, + 58, 102, -1, 105, 57, 102, -1, 105, 56, 102, + -1, 105, 59, 102, -1, 104, 85, 45, 66, 102, + -1, 104, 85, 45, 58, 102, -1, 104, 85, 45, + 57, 102, -1, 104, 85, 45, 56, 102, -1, 104, + 85, 45, 59, 102, -1, 102, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 144, 144, 150, 151, 156, 160, 161, 162, 163, + 164, 165, 166, 167, 171, 172, 176, 177, 178, 185, + 201, 217, 229, 243, 257, 267, 278, 288, 289, 313, + 328, 340, 348, 370, 371, 375, 383, 391, 395, 402, + 409, 413, 418, 425, 432, 441, 448, 455, 462, 470, + 477, 489, 498, 502, 506, 510, 514, 518, 522, 529, + 536, 542, 548, 555, 559, 573, 586, 590, 594, 598, + 602, 606, 610, 614, 619, 625, 634, 645, 659, 661, + 664, 669, 675, 680, 686, 691, 699, 714, 724, 739, + 749, 754, 758, 764, 769, 774, 779, 784, 789, 794, + 799, 805, 810, 815, 819, 823, 827, 832, 836, 840, + 852, 854, 861, 864, 867, 870, 873, 876, 881, 886, + 891, 895, 897, 899, 907, 915, 928, 941, 945, 952, + 959, 966, 973, 982, 995, 1008, 1021, 1036 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "BREAK", "FOR", "CONTINUE", "IF", "ELSE", + "DO", "WHILE", "THIS", "EVAL", "TIME", "RANDOM", "LENGTH", "INT", + "CONCAT", "DUPLICATECLIP", "REMOVECLIP", "TRACE", "STARTDRAG", + "STOPDRAG", "ORD", "CHR", "CALLFRAME", "GETURL", "GETURL1", "LOADMOVIE", + "LOADVARIABLES", "POSTURL", "SUBSTR", "GETPROPERTY", "NEXTFRAME", + "PREVFRAME", "PLAY", "STOP", "TOGGLEQUALITY", "STOPSOUNDS", "GOTOFRAME", + "GOTOANDPLAY", "FRAMELOADED", "SETTARGET", "TELLTARGET", "STRING", + "NUMBER", "IDENTIFIER", "PATH", "GETURL_METHOD", "\"==\"", "\"<=\"", + "\">=\"", "\"!=\"", "\"&&\"", "\"||\"", "\"++\"", "\"--\"", "\"+=\"", + "\"/=\"", "\"*=\"", "\"-=\"", "\"===\"", "\"!==\"", "\"<=>\"", "\"..\"", + "\"end\"", "','", "'='", "'?'", "':'", "'<'", "'>'", "'&'", "'+'", "'-'", + "'*'", "'/'", "'!'", "UMINUS", "POSTFIX", "NEGATE", "'{'", "'}'", "';'", + "'('", "')'", "'.'", "$accept", "program", "elems", "elem", "stmt", + "assign_stmts", "statements", "if_stmt", "expr_opt", "iter_stmt", + "assign_stmts_opt", "cont_stmt", "break_stmt", "void_function_call", + "function_call", "pf_expr", "rhs_expr", "variable", "sprite", "lhs_expr", + "assign_stmt", "expr", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 44, 61, 63, 58, 60, + 62, 38, 43, 45, 42, 47, 33, 320, 321, 322, + 123, 125, 59, 40, 41, 46 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 86, 87, 88, 88, 89, 90, 90, 90, 90, + 90, 90, 90, 90, 91, 91, 92, 92, 92, 93, + 93, 93, 93, 93, 93, 93, 93, 94, 94, 95, + 95, 95, 95, 96, 96, 97, 98, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 101, 101, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 103, 103, 104, 104, 104, 104, 104, 104, 105, 105, + 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 107 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 1, 2, 1, 2, 3, 1, 2, + 1, 1, 1, 1, 1, 3, 0, 1, 2, 10, + 8, 9, 10, 8, 9, 7, 5, 0, 1, 9, + 5, 6, 9, 0, 1, 2, 2, 3, 4, 4, + 4, 4, 6, 8, 6, 6, 8, 6, 8, 6, + 14, 8, 3, 3, 3, 3, 3, 3, 4, 4, + 4, 4, 4, 4, 5, 5, 4, 3, 4, 4, + 4, 4, 4, 6, 8, 6, 2, 2, 1, 3, + 1, 2, 1, 1, 1, 3, 4, 2, 4, 2, + 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 2, 2, 4, 4, 3, 3, 3, + 3, 3, 5, 5, 5, 5, 5, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 119, 110, + 117, 0, 0, 115, 114, 0, 8, 0, 113, 0, + 2, 3, 5, 10, 11, 12, 13, 122, 121, 118, + 0, 0, 0, 36, 33, 35, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 123, 0, 124, 6, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 82, 80, 0, 0, + 0, 0, 0, 78, 0, 83, 84, 0, 1, 4, + 0, 0, 76, 77, 0, 0, 0, 0, 0, 9, + 34, 0, 14, 0, 0, 137, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 55, 56, 57, 82, 80, + 0, 0, 82, 0, 82, 0, 0, 0, 7, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 87, 0, 89, 80, 90, 91, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120, 0, 0, 111, 0, + 130, 129, 128, 131, 127, 0, 27, 0, 0, 0, + 0, 0, 0, 0, 40, 41, 0, 39, 38, 0, + 0, 0, 0, 59, 58, 60, 61, 62, 63, 0, + 0, 125, 126, 0, 67, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 79, 105, 100, 101, 106, + 107, 108, 103, 102, 104, 0, 98, 99, 97, 95, + 96, 93, 94, 85, 92, 0, 0, 0, 0, 0, + 15, 0, 28, 80, 0, 0, 26, 0, 0, 30, + 0, 0, 0, 0, 0, 0, 64, 65, 66, 68, + 69, 70, 0, 71, 72, 0, 0, 86, 88, 0, + 135, 134, 133, 136, 132, 33, 0, 0, 80, 0, + 0, 31, 0, 0, 0, 49, 0, 42, 44, 0, + 45, 0, 47, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, 0, 73, + 0, 75, 0, 20, 23, 0, 0, 0, 51, 0, + 43, 46, 48, 0, 32, 0, 0, 21, 24, 29, + 0, 74, 19, 22, 0, 0, 0, 0, 50 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 39, 40, 41, 42, 120, 85, 43, 271, 44, + 121, 45, 46, 47, 103, 48, 125, 105, 106, 107, + 52, 126 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -70 +static const yytype_int16 yypact[] = +{ + 780, -69, -64, -60, -49, 780, -28, -70, -22, -14, + -2, 3, 4, 11, 13, 17, 19, 20, 23, 25, + 26, 29, 30, 31, 33, 47, 54, 56, -70, 16, + -70, 32, 32, -70, -70, 614, -70, 422, -70, 72, + 780, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -12, 65, 1, -70, 108, -70, 826, 80, 994, 422, + 422, 422, 422, 64, 5, 422, 118, 422, 422, 81, + 82, 86, 88, 89, 104, 1020, 422, 1076, 1102, -11, + -70, -9, -70, -70, -70, 697, 106, 109, 117, 119, + 120, 121, 123, 125, 127, 130, 98, -70, 32, 32, + 1158, 422, 422, -70, 516, 135, -6, 141, -70, -70, + 145, 169, -70, -70, 422, 422, 422, 422, 422, -70, + 151, 137, -70, 139, 882, 613, 136, 140, 938, 142, + 160, 143, 144, 166, -70, 148, 149, 170, 172, 174, + 175, 178, -70, -70, -70, -70, -70, -70, -48, 150, + 161, 162, -21, 163, -13, 164, 199, 204, -70, -70, + 422, 167, 422, 422, 422, 422, 422, 422, 422, 422, + -3, -70, -1, -70, -70, -70, -70, 1257, 422, 422, + 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, + 422, 422, 422, 422, 422, -70, 205, 422, -70, 128, + 613, 613, 613, 613, 613, 108, 422, 1184, 171, 780, + 422, 173, 780, 422, -70, -70, 422, -70, -70, 422, + 210, 422, 422, -70, -70, -70, -70, -70, -70, 780, + 780, -70, -70, 176, -70, 177, 179, 180, 190, 182, + 188, 192, 193, 214, 228, 212, -46, 124, 124, -46, + 696, 696, -46, -46, 124, 107, 124, 124, -65, 18, + 18, -70, -70, -70, 613, 422, 422, 422, 422, 422, + -70, 197, -70, 191, 196, 1240, 274, 206, 244, -70, + 224, -63, -51, 207, -45, -35, -70, -70, -70, -70, + -70, -70, 422, -70, -70, 422, 249, -70, -70, 422, + 613, 613, 613, 613, 613, 108, 211, 213, 215, 216, + 780, -70, 217, 422, 422, -70, 246, -70, -70, 247, + -70, 251, -70, 218, 231, 219, 613, 220, 780, 780, + 222, 223, -70, 225, 229, 243, 230, 234, 235, -70, + 422, -70, 780, 305, 308, 780, 780, 780, -70, 422, + -70, -70, -70, 236, -70, 780, 780, -70, -70, -70, + 256, -70, -70, -70, 422, 258, 422, 240, -70 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -70, -70, -70, 285, 53, -70, -70, -70, -70, -70, + 21, -70, -70, -70, -70, -70, 346, 0, 6, 12, + -53, 209 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -121 +static const yytype_int16 yytable[] = +{ + 49, 122, 314, 179, 180, 49, 50, 191, 192, 193, + 194, 50, 51, 53, 316, 7, 186, 51, -119, 54, + 319, 315, 55, 188, 189, 190, 191, 192, 193, 194, + 321, 49, 49, 317, 56, 49, 223, 79, 81, 320, + 49, 50, 7, 80, 82, -119, 50, 51, 135, 322, + 29, 30, 51, -119, 49, 58, 110, 110, 57, 110, + 50, 59, 110, 227, 136, 110, 51, 110, 33, 60, + 137, 229, 108, 111, 156, 28, 157, 29, 30, 196, + 34, 61, 243, 119, 244, 49, 62, 63, 84, 127, + 38, 50, 193, 194, 64, 33, 65, 51, 49, 49, + 66, -116, 67, 68, 170, 172, 69, 34, 70, 71, + 171, 173, 72, 73, 74, 37, 75, 38, 7, 112, + 113, 114, 115, 116, 117, 8, 9, 10, 11, 12, + 76, 118, 13, 14, 15, 16, 17, 77, 159, 78, + 18, 19, 20, 21, 22, 23, 24, 25, 134, 26, + 27, 28, 270, 29, 30, 178, 179, 180, 181, 182, + 183, 139, 31, 32, -119, 142, 143, 184, 185, 186, + 144, 33, 145, 146, 187, 299, 188, 189, 190, 191, + 192, 193, 194, 34, 265, 266, 267, 268, 147, 160, + 198, 37, 161, 38, 269, 190, 191, 192, 193, 194, + 162, -118, 163, 164, 165, 49, 166, 197, 167, 49, + 168, 50, 49, 169, 199, 50, 205, 51, 50, 206, + 209, 51, 207, 210, 51, 213, 212, 214, 215, 49, + 49, 216, 217, 218, 224, 50, 50, 219, 110, 220, + 221, 51, 51, 222, 231, 225, 226, 228, 230, 232, + 263, 234, 122, 283, 275, 292, 278, 295, 296, 297, + 288, 289, 276, 290, 291, 279, 293, 129, 130, 131, + 132, 133, 294, 298, 138, 306, 140, 141, -120, 305, + 307, 310, 286, 287, 150, 151, 153, 155, 312, 313, + 311, 318, 325, 336, 337, 328, 340, 329, 338, 330, + 331, 333, 339, 341, 342, 49, 345, 346, 349, 347, + 49, 50, 355, 348, 350, 356, 50, 51, 351, 352, + 361, 364, 51, 366, 368, 109, 327, 0, 49, 49, + 0, 0, 0, 0, 50, 50, 0, 0, 0, 0, + 51, 51, 49, 0, 0, 49, 49, 49, 50, 0, + 0, 50, 50, 50, 51, 49, 49, 51, 51, 51, + 0, 50, 50, 332, 0, 0, 0, 51, 51, 233, + 0, 235, 236, 237, 238, 239, 240, 241, 242, 0, + 0, 343, 344, 104, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 354, 0, 0, 357, 358, + 359, 0, 0, 0, 0, 0, 0, 0, 362, 363, + 0, 0, 0, 0, 0, 272, 274, 0, 0, 277, + 0, 0, 280, 0, 0, 281, 0, 0, 282, 0, + 284, 285, 7, 86, 87, 88, 89, 90, 91, 0, + 0, 0, 0, 0, 92, 93, 175, 176, 177, 0, + 0, 0, 94, 95, 0, 0, 0, 0, 0, 0, + 200, 201, 202, 203, 204, 96, 97, 29, 30, 0, + 176, 0, 0, 0, 176, 0, 98, 99, 0, 0, + 0, 0, 0, 0, 309, 33, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 100, 0, 34, 101, 0, + 0, 323, 0, 0, 324, 102, 0, 38, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 334, 335, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 0, 0, 264, 0, 0, 0, 0, 0, 353, + 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, + 0, 0, 0, 0, 178, 179, 180, 181, 182, 183, + 0, 0, 0, 365, 0, 367, 184, 185, 186, 0, + 0, 0, 0, 187, 0, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 300, 301, 302, 303, 304, 0, 1, 2, 3, + 4, 0, 5, 6, 7, 0, 0, 0, 0, 0, + 0, 8, 9, 10, 11, 12, 0, 0, 13, 14, + 15, 16, 17, 0, 0, 326, 18, 19, 20, 21, + 22, 23, 24, 25, 0, 26, 27, 28, 0, 29, + 30, 178, 179, 180, 181, 182, 183, 0, 31, 32, + 0, 0, 0, 184, 185, 186, 0, 33, 0, 0, + 187, 0, 188, 189, 190, 191, 192, 193, 194, 34, + 0, 0, 0, 0, 35, 83, 36, 37, 0, 38, + 1, 2, 3, 4, 0, 5, 6, 7, 0, 0, + 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, + 0, 13, 14, 15, 16, 17, 0, 0, 0, 18, + 19, 20, 21, 22, 23, 24, 25, 0, 26, 27, + 28, 0, 29, 30, 178, 179, 180, 181, 0, 0, + 0, 31, 32, 0, 0, 0, 184, 185, 186, 0, + 33, 0, 0, 0, 0, 188, 189, 190, 191, 192, + 193, 194, 34, 0, 0, 0, 0, 35, 158, 36, + 37, 0, 38, 1, 2, 3, 4, 0, 5, 6, + 7, 0, 0, 0, 0, 0, 0, 8, 9, 10, + 11, 12, 0, 0, 13, 14, 15, 16, 17, 0, + 0, 0, 18, 19, 20, 21, 22, 23, 24, 25, + 0, 26, 27, 28, 0, 29, 30, 0, 0, 0, + 0, 0, 0, 0, 31, 32, 7, 86, 87, 88, + 89, 90, 91, 33, 0, 0, 0, 0, 92, 93, + 0, 0, 0, 0, 0, 34, 94, 95, 0, 0, + 35, 0, 36, 37, 0, 38, 123, 0, 0, 96, + 97, 29, 30, 0, 0, 0, 0, 0, 0, 0, + 98, 99, 0, 0, 0, 0, 0, 0, 0, 33, + 0, 0, 7, 86, 87, 88, 89, 90, 91, 100, + 0, 34, 124, 0, 92, 93, 0, 0, 0, 102, + 0, 38, 94, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 208, 0, 0, 96, 97, 29, 30, 0, + 0, 0, 0, 0, 0, 0, 98, 99, 0, 0, + 0, 0, 0, 0, 0, 33, 0, 0, 7, 86, + 87, 88, 89, 90, 91, 100, 0, 34, 101, 0, + 92, 93, 0, 0, 0, 102, 0, 38, 94, 95, + 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, + 0, 96, 97, 29, 30, 0, 0, 0, 0, 0, + 0, 0, 98, 99, 0, 0, 0, 0, 0, 0, + 0, 33, 0, 0, 7, 86, 87, 88, 89, 90, + 91, 100, 0, 34, 101, 0, 92, 93, 0, 0, + 0, 102, 0, 38, 94, 95, 0, 0, 0, 0, + 7, 86, 87, 88, 89, 90, 91, 96, 97, 29, + 30, 0, 92, 93, 0, 0, 0, 0, 98, 99, + 94, 95, 0, 0, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 148, 149, 29, 30, 100, 0, 34, + 128, 0, 0, 0, 98, 99, 0, 102, 0, 38, + 0, 0, 0, 33, 0, 0, 7, 86, 87, 88, + 89, 90, 91, 100, 0, 34, 101, 0, 92, 93, + 0, 0, 0, 102, 0, 38, 94, 95, 0, 0, + 0, 0, 7, 86, 87, 88, 89, 90, 91, 152, + 97, 29, 30, 0, 92, 93, 0, 0, 0, 0, + 98, 99, 94, 95, 0, 0, 0, 0, 0, 33, + 0, 0, 0, 0, 0, 154, 97, 29, 30, 100, + 0, 34, 101, 0, 0, 0, 98, 99, 0, 102, + 0, 38, 0, 0, 0, 33, 0, 0, 7, 86, + 87, 88, 89, 90, 91, 100, 0, 34, 101, 0, + 92, 93, 0, 0, 0, 102, 0, 38, 94, 95, + 0, 0, 0, 0, 7, 86, 87, 88, 89, 90, + 91, 96, 174, 29, 30, 0, 92, 93, 0, 0, + 0, 0, 98, 99, 94, 95, 0, 0, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 96, 273, 29, + 30, 100, 0, 34, 101, 0, 0, 0, 98, 99, + 0, 102, 0, 38, 0, 0, 0, 33, 0, 0, + 7, 86, 87, 88, 89, 90, 91, 100, 0, 34, + 101, 0, 92, 93, 0, 0, 0, 102, 0, 38, + 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 308, 29, 30, 0, 0, 0, + 0, 0, 0, 0, 98, 99, 0, 0, 0, 0, + 0, 0, 0, 33, 0, 178, 179, 180, 181, 182, + 183, 0, 0, 100, 0, 34, 101, 184, 185, 186, + 0, 0, 0, 102, 187, 38, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 0, 0, 0, 0, + 0, 245 +}; + +static const yytype_int16 yycheck[] = +{ + 0, 54, 65, 49, 50, 5, 0, 72, 73, 74, + 75, 5, 0, 82, 65, 10, 62, 5, 66, 83, + 65, 84, 82, 69, 70, 71, 72, 73, 74, 75, + 65, 31, 32, 84, 83, 35, 84, 31, 32, 84, + 40, 35, 10, 31, 32, 66, 40, 35, 43, 84, + 45, 46, 40, 66, 54, 83, 68, 68, 5, 68, + 54, 83, 68, 84, 64, 68, 54, 68, 63, 83, + 64, 84, 0, 85, 85, 43, 85, 45, 46, 85, + 75, 83, 85, 82, 85, 85, 83, 83, 35, 9, + 85, 85, 74, 75, 83, 63, 83, 85, 98, 99, + 83, 85, 83, 83, 98, 99, 83, 75, 83, 83, + 98, 99, 83, 83, 83, 83, 83, 85, 10, 54, + 55, 56, 57, 58, 59, 17, 18, 19, 20, 21, + 83, 66, 24, 25, 26, 27, 28, 83, 85, 83, + 32, 33, 34, 35, 36, 37, 38, 39, 84, 41, + 42, 43, 205, 45, 46, 48, 49, 50, 51, 52, + 53, 43, 54, 55, 66, 84, 84, 60, 61, 62, + 84, 63, 84, 84, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 75, 56, 57, 58, 59, 84, 83, + 45, 83, 83, 85, 66, 71, 72, 73, 74, 75, + 83, 66, 83, 83, 83, 205, 83, 66, 83, 209, + 83, 205, 212, 83, 45, 209, 65, 205, 212, 82, + 84, 209, 83, 83, 212, 65, 84, 84, 84, 229, + 230, 65, 84, 84, 84, 229, 230, 65, 68, 65, + 65, 229, 230, 65, 45, 84, 84, 84, 84, 45, + 45, 84, 305, 43, 83, 65, 83, 65, 65, 45, + 84, 84, 209, 84, 84, 212, 84, 58, 59, 60, + 61, 62, 84, 45, 65, 84, 67, 68, 66, 82, + 84, 7, 229, 230, 75, 76, 77, 78, 44, 65, + 84, 84, 43, 47, 47, 84, 65, 84, 47, 84, + 84, 84, 84, 84, 84, 305, 84, 84, 65, 84, + 310, 305, 7, 84, 84, 7, 310, 305, 84, 84, + 84, 65, 310, 65, 84, 40, 305, -1, 328, 329, + -1, -1, -1, -1, 328, 329, -1, -1, -1, -1, + 328, 329, 342, -1, -1, 345, 346, 347, 342, -1, + -1, 345, 346, 347, 342, 355, 356, 345, 346, 347, + -1, 355, 356, 310, -1, -1, -1, 355, 356, 160, + -1, 162, 163, 164, 165, 166, 167, 168, 169, -1, + -1, 328, 329, 37, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 342, -1, -1, 345, 346, + 347, -1, -1, -1, -1, -1, -1, -1, 355, 356, + -1, -1, -1, -1, -1, 206, 207, -1, -1, 210, + -1, -1, 213, -1, -1, 216, -1, -1, 219, -1, + 221, 222, 10, 11, 12, 13, 14, 15, 16, -1, + -1, -1, -1, -1, 22, 23, 100, 101, 102, -1, + -1, -1, 30, 31, -1, -1, -1, -1, -1, -1, + 114, 115, 116, 117, 118, 43, 44, 45, 46, -1, + 124, -1, -1, -1, 128, -1, 54, 55, -1, -1, + -1, -1, -1, -1, 275, 63, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 73, -1, 75, 76, -1, + -1, 292, -1, -1, 295, 83, -1, 85, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 313, 314, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, -1, -1, 197, -1, -1, -1, -1, -1, 340, + -1, -1, -1, -1, -1, -1, -1, -1, 349, -1, + -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, + -1, -1, -1, 364, -1, 366, 60, 61, 62, -1, + -1, -1, -1, 67, -1, 69, 70, 71, 72, 73, + 74, 75, -1, -1, -1, -1, -1, -1, -1, -1, + 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 265, 266, 267, 268, 269, -1, 3, 4, 5, + 6, -1, 8, 9, 10, -1, -1, -1, -1, -1, + -1, 17, 18, 19, 20, 21, -1, -1, 24, 25, + 26, 27, 28, -1, -1, 299, 32, 33, 34, 35, + 36, 37, 38, 39, -1, 41, 42, 43, -1, 45, + 46, 48, 49, 50, 51, 52, 53, -1, 54, 55, + -1, -1, -1, 60, 61, 62, -1, 63, -1, -1, + 67, -1, 69, 70, 71, 72, 73, 74, 75, 75, + -1, -1, -1, -1, 80, 81, 82, 83, -1, 85, + 3, 4, 5, 6, -1, 8, 9, 10, -1, -1, + -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, + -1, 24, 25, 26, 27, 28, -1, -1, -1, 32, + 33, 34, 35, 36, 37, 38, 39, -1, 41, 42, + 43, -1, 45, 46, 48, 49, 50, 51, -1, -1, + -1, 54, 55, -1, -1, -1, 60, 61, 62, -1, + 63, -1, -1, -1, -1, 69, 70, 71, 72, 73, + 74, 75, 75, -1, -1, -1, -1, 80, 81, 82, + 83, -1, 85, 3, 4, 5, 6, -1, 8, 9, + 10, -1, -1, -1, -1, -1, -1, 17, 18, 19, + 20, 21, -1, -1, 24, 25, 26, 27, 28, -1, + -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, + -1, 41, 42, 43, -1, 45, 46, -1, -1, -1, + -1, -1, -1, -1, 54, 55, 10, 11, 12, 13, + 14, 15, 16, 63, -1, -1, -1, -1, 22, 23, + -1, -1, -1, -1, -1, 75, 30, 31, -1, -1, + 80, -1, 82, 83, -1, 85, 40, -1, -1, 43, + 44, 45, 46, -1, -1, -1, -1, -1, -1, -1, + 54, 55, -1, -1, -1, -1, -1, -1, -1, 63, + -1, -1, 10, 11, 12, 13, 14, 15, 16, 73, + -1, 75, 76, -1, 22, 23, -1, -1, -1, 83, + -1, 85, 30, 31, -1, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, 43, 44, 45, 46, -1, + -1, -1, -1, -1, -1, -1, 54, 55, -1, -1, + -1, -1, -1, -1, -1, 63, -1, -1, 10, 11, + 12, 13, 14, 15, 16, 73, -1, 75, 76, -1, + 22, 23, -1, -1, -1, 83, -1, 85, 30, 31, + -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, 43, 44, 45, 46, -1, -1, -1, -1, -1, + -1, -1, 54, 55, -1, -1, -1, -1, -1, -1, + -1, 63, -1, -1, 10, 11, 12, 13, 14, 15, + 16, 73, -1, 75, 76, -1, 22, 23, -1, -1, + -1, 83, -1, 85, 30, 31, -1, -1, -1, -1, + 10, 11, 12, 13, 14, 15, 16, 43, 44, 45, + 46, -1, 22, 23, -1, -1, -1, -1, 54, 55, + 30, 31, -1, -1, -1, -1, -1, 63, -1, -1, + -1, -1, -1, 43, 44, 45, 46, 73, -1, 75, + 76, -1, -1, -1, 54, 55, -1, 83, -1, 85, + -1, -1, -1, 63, -1, -1, 10, 11, 12, 13, + 14, 15, 16, 73, -1, 75, 76, -1, 22, 23, + -1, -1, -1, 83, -1, 85, 30, 31, -1, -1, + -1, -1, 10, 11, 12, 13, 14, 15, 16, 43, + 44, 45, 46, -1, 22, 23, -1, -1, -1, -1, + 54, 55, 30, 31, -1, -1, -1, -1, -1, 63, + -1, -1, -1, -1, -1, 43, 44, 45, 46, 73, + -1, 75, 76, -1, -1, -1, 54, 55, -1, 83, + -1, 85, -1, -1, -1, 63, -1, -1, 10, 11, + 12, 13, 14, 15, 16, 73, -1, 75, 76, -1, + 22, 23, -1, -1, -1, 83, -1, 85, 30, 31, + -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, + 16, 43, 44, 45, 46, -1, 22, 23, -1, -1, + -1, -1, 54, 55, 30, 31, -1, -1, -1, -1, + -1, 63, -1, -1, -1, -1, -1, 43, 44, 45, + 46, 73, -1, 75, 76, -1, -1, -1, 54, 55, + -1, 83, -1, 85, -1, -1, -1, 63, -1, -1, + 10, 11, 12, 13, 14, 15, 16, 73, -1, 75, + 76, -1, 22, 23, -1, -1, -1, 83, -1, 85, + 30, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 43, 44, 45, 46, -1, -1, -1, + -1, -1, -1, -1, 54, 55, -1, -1, -1, -1, + -1, -1, -1, 63, -1, 48, 49, 50, 51, 52, + 53, -1, -1, 73, -1, 75, 76, 60, 61, 62, + -1, -1, -1, 83, 67, 85, 69, 70, 71, 72, + 73, 74, 75, -1, -1, -1, -1, -1, -1, -1, + -1, 84 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 4, 5, 6, 8, 9, 10, 17, 18, + 19, 20, 21, 24, 25, 26, 27, 28, 32, 33, + 34, 35, 36, 37, 38, 39, 41, 42, 43, 45, + 46, 54, 55, 63, 75, 80, 82, 83, 85, 87, + 88, 89, 90, 93, 95, 97, 98, 99, 101, 103, + 104, 105, 106, 82, 83, 82, 83, 90, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 104, + 105, 104, 105, 81, 90, 92, 11, 12, 13, 14, + 15, 16, 22, 23, 30, 31, 43, 44, 54, 55, + 73, 76, 83, 100, 102, 103, 104, 105, 0, 89, + 68, 85, 54, 55, 56, 57, 58, 59, 66, 82, + 91, 96, 106, 40, 76, 102, 107, 9, 76, 107, + 107, 107, 107, 107, 84, 43, 103, 104, 107, 43, + 107, 107, 84, 84, 84, 84, 84, 84, 43, 44, + 107, 107, 43, 107, 43, 107, 85, 85, 81, 90, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 104, 105, 104, 105, 44, 102, 102, 102, 48, 49, + 50, 51, 52, 53, 60, 61, 62, 67, 69, 70, + 71, 72, 73, 74, 75, 84, 85, 66, 45, 45, + 102, 102, 102, 102, 102, 65, 82, 83, 40, 84, + 83, 40, 84, 65, 84, 84, 65, 84, 84, 65, + 65, 65, 65, 84, 84, 84, 84, 84, 84, 84, + 84, 45, 45, 107, 84, 107, 107, 107, 107, 107, + 107, 107, 107, 85, 85, 84, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 45, 102, 56, 57, 58, 59, 66, + 106, 94, 107, 44, 107, 83, 90, 107, 83, 90, + 107, 107, 107, 43, 107, 107, 90, 90, 84, 84, + 84, 84, 65, 84, 84, 65, 65, 45, 45, 68, + 102, 102, 102, 102, 102, 82, 84, 84, 44, 107, + 7, 84, 44, 65, 65, 84, 65, 84, 84, 65, + 84, 65, 84, 107, 107, 43, 102, 96, 84, 84, + 84, 84, 90, 84, 107, 107, 47, 47, 47, 84, + 65, 84, 84, 90, 90, 84, 84, 84, 84, 65, + 84, 84, 84, 107, 90, 7, 7, 90, 90, 90, + 107, 84, 90, 90, 65, 107, 65, 107, 84 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: + +/* Line 1455 of yacc.c */ +#line 145 "swf4compiler.y" + { *((Buffer *)buffer) = (yyvsp[(1) - (1)].action); ;} + break; + + case 4: + +/* Line 1455 of yacc.c */ +#line 152 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (2)].action), (yyvsp[(2) - (2)].action)); ;} + break; + + case 6: + +/* Line 1455 of yacc.c */ +#line 160 "swf4compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 161 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].action); ;} + break; + + case 8: + +/* Line 1455 of yacc.c */ +#line 162 "swf4compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 15: + +/* Line 1455 of yacc.c */ +#line 172 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); ;} + break; + + case 16: + +/* Line 1455 of yacc.c */ +#line 176 "swf4compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 18: + +/* Line 1455 of yacc.c */ +#line 179 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (2)].action), (yyvsp[(2) - (2)].action)); ;} + break; + + case 19: + +/* Line 1455 of yacc.c */ +#line 186 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); + bufferWriteS16((yyval.action), 3); + bufferWriteS16((yyval.action), atoi((yyvsp[(5) - (10)].str))); + free((yyvsp[(5) - (10)].str)); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(10) - (10)].action))+5); + bufferConcat((yyval.action), (yyvsp[(10) - (10)].action)); /* ..here */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (10)].action))); + bufferConcat((yyval.action), (yyvsp[(8) - (10)].action)); ;} + break; + + case 20: + +/* Line 1455 of yacc.c */ +#line 202 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); + bufferWriteS16((yyval.action), 3); + bufferWriteS16((yyval.action), atoi((yyvsp[(5) - (8)].str))); + free((yyvsp[(5) - (8)].str)); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), 5); + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); /* ..here */ + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (8)].action))); /* ..and then out */ + bufferConcat((yyval.action), (yyvsp[(8) - (8)].action)); ;} + break; + + case 21: + +/* Line 1455 of yacc.c */ +#line 218 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); + bufferWriteS16((yyval.action), 3); + bufferWriteS16((yyval.action), atoi((yyvsp[(6) - (9)].str))); + free((yyvsp[(6) - (9)].str)); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(9) - (9)].action))); + bufferConcat((yyval.action), (yyvsp[(9) - (9)].action)); ;} + break; + + case 22: + +/* Line 1455 of yacc.c */ +#line 230 "swf4compiler.y" + { (yyval.action) = (yyvsp[(5) - (10)].action); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAMEEXPRESSION); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(10) - (10)].action))+5); + bufferConcat((yyval.action), (yyvsp[(10) - (10)].action)); /* ..here */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (10)].action))); + bufferConcat((yyval.action), (yyvsp[(8) - (10)].action)); ;} + break; + + case 23: + +/* Line 1455 of yacc.c */ +#line 244 "swf4compiler.y" + { (yyval.action) = (yyvsp[(5) - (8)].action); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAMEEXPRESSION); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), 5); + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); /* ..here */ + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (8)].action))); /* ..and then out */ + bufferConcat((yyval.action), (yyvsp[(8) - (8)].action)); ;} + break; + + case 24: + +/* Line 1455 of yacc.c */ +#line 258 "swf4compiler.y" + { (yyval.action) = (yyvsp[(6) - (9)].action); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAMEEXPRESSION); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(9) - (9)].action))); + bufferConcat((yyval.action), (yyvsp[(9) - (9)].action)); ;} + break; + + case 25: + +/* Line 1455 of yacc.c */ +#line 268 "swf4compiler.y" + { bufferWriteU8((yyvsp[(3) - (7)].action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyvsp[(3) - (7)].action), 2); + bufferWriteS16((yyvsp[(3) - (7)].action), bufferLength((yyvsp[(7) - (7)].action))+5); + bufferConcat((yyvsp[(3) - (7)].action), (yyvsp[(7) - (7)].action)); + bufferWriteU8((yyvsp[(3) - (7)].action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyvsp[(3) - (7)].action), 2); + bufferWriteS16((yyvsp[(3) - (7)].action), bufferLength((yyvsp[(5) - (7)].action))); + bufferConcat((yyvsp[(3) - (7)].action), (yyvsp[(5) - (7)].action)); + (yyval.action) = (yyvsp[(3) - (7)].action); ;} + break; + + case 26: + +/* Line 1455 of yacc.c */ +#line 279 "swf4compiler.y" + { bufferWriteU8((yyvsp[(3) - (5)].action), SWFACTION_LOGICALNOT); + bufferWriteU8((yyvsp[(3) - (5)].action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyvsp[(3) - (5)].action), 2); + bufferWriteS16((yyvsp[(3) - (5)].action), bufferLength((yyvsp[(5) - (5)].action))); + bufferConcat((yyvsp[(3) - (5)].action), (yyvsp[(5) - (5)].action)); + (yyval.action) = (yyvsp[(3) - (5)].action); ;} + break; + + case 27: + +/* Line 1455 of yacc.c */ +#line 288 "swf4compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 28: + +/* Line 1455 of yacc.c */ +#line 289 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (1)].action); ;} + break; + + case 29: + +/* Line 1455 of yacc.c */ +#line 314 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); + bufferWriteS16((yyval.action), 3); + bufferWriteS16((yyval.action), atoi((yyvsp[(6) - (9)].str))); + free((yyvsp[(6) - (9)].str)); + bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(9) - (9)].action))+5); + bufferConcat((yyval.action), (yyvsp[(9) - (9)].action)); /* ..here */ + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); ;} + break; + + case 30: + +/* Line 1455 of yacc.c */ +#line 329 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (5)].action); + bufferWriteU8((yyval.action), SWFACTION_LOGICALNOT); + bufferWriteU8((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))+5); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); + bufferResolveJumps((yyval.action)); ;} + break; + + case 31: + +/* Line 1455 of yacc.c */ +#line 341 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferWriteU8((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); + bufferResolveJumps((yyval.action)); ;} + break; + + case 32: + +/* Line 1455 of yacc.c */ +#line 349 "swf4compiler.y" + { if (!(yyvsp[(5) - (9)].action)) + (yyvsp[(5) - (9)].action) = newBuffer(); + else { + bufferWriteU8((yyvsp[(5) - (9)].action), SWFACTION_LOGICALNOT); + bufferWriteU8((yyvsp[(5) - (9)].action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyvsp[(5) - (9)].action), 2); + bufferWriteS16((yyvsp[(5) - (9)].action), bufferLength((yyvsp[(9) - (9)].action))+bufferLength((yyvsp[(7) - (9)].action))+5); + } + bufferConcat((yyvsp[(5) - (9)].action), (yyvsp[(9) - (9)].action)); + bufferConcat((yyvsp[(5) - (9)].action), (yyvsp[(7) - (9)].action)); + bufferWriteU8((yyvsp[(5) - (9)].action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyvsp[(5) - (9)].action), 2); + bufferWriteS16((yyvsp[(5) - (9)].action), -(bufferLength((yyvsp[(5) - (9)].action))+2)); + bufferResolveJumps((yyvsp[(5) - (9)].action)); + (yyval.action) = (yyvsp[(3) - (9)].action); + if(!(yyval.action)) (yyval.action) = newBuffer(); + bufferConcat((yyval.action), (yyvsp[(5) - (9)].action)); + ;} + break; + + case 33: + +/* Line 1455 of yacc.c */ +#line 370 "swf4compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 35: + +/* Line 1455 of yacc.c */ +#line 376 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), MAGIC_CONTINUE_NUMBER); ;} + break; + + case 36: + +/* Line 1455 of yacc.c */ +#line 384 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), MAGIC_BREAK_NUMBER); ;} + break; + + case 37: + +/* Line 1455 of yacc.c */ +#line 392 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_STOPDRAGMOVIE); ;} + break; + + case 38: + +/* Line 1455 of yacc.c */ +#line 396 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); + bufferWriteU8((yyval.action), SWFACTION_CALLFRAME); + bufferWriteS16((yyval.action), 0); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 39: + +/* Line 1455 of yacc.c */ +#line 403 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); + bufferWriteU8((yyval.action), SWFACTION_CALLFRAME); + bufferWriteS16((yyval.action), 0); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 40: + +/* Line 1455 of yacc.c */ +#line 410 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_REMOVECLIP); ;} + break; + + case 41: + +/* Line 1455 of yacc.c */ +#line 414 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_TRACE); ;} + break; + + case 42: + +/* Line 1455 of yacc.c */ +#line 419 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), GETURL_METHOD_NOSEND); ;} + break; + + case 43: + +/* Line 1455 of yacc.c */ +#line 426 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), (yyvsp[(7) - (8)].getURLMethod)); ;} + break; + + case 44: + +/* Line 1455 of yacc.c */ +#line 433 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_GETURL); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (6)].str)) + strlen((yyvsp[(5) - (6)].str)) + 2); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (6)].str), strlen((yyvsp[(3) - (6)].str))); + bufferWriteU8((yyval.action), 0); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(5) - (6)].str), strlen((yyvsp[(5) - (6)].str))); + bufferWriteU8((yyval.action), 0); ;} + break; + + case 45: + +/* Line 1455 of yacc.c */ +#line 442 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), GETURL_METHOD_NOSEND | GETURL_LOADMOVIE); ;} + break; + + case 46: + +/* Line 1455 of yacc.c */ +#line 449 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), (yyvsp[(7) - (8)].getURLMethod) | GETURL_LOADMOVIE); ;} + break; + + case 47: + +/* Line 1455 of yacc.c */ +#line 456 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), GETURL_METHOD_NOSEND | GETURL_LOADVARIABLES); ;} + break; + + case 48: + +/* Line 1455 of yacc.c */ +#line 463 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), (yyvsp[(7) - (8)].getURLMethod) | GETURL_LOADVARIABLES); ;} + break; + + case 49: + +/* Line 1455 of yacc.c */ +#line 471 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), "0", 2); /* no constraint */ + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferConcat((yyval.action), (yyvsp[(3) - (6)].action)); + bufferWriteU8((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} + break; + + case 50: + +/* Line 1455 of yacc.c */ +#line 478 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferConcat((yyval.action), (yyvsp[(7) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(11) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(9) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(13) - (14)].action)); + bufferWriteString((yyval.action), "1", 2); /* has constraint */ + bufferConcat((yyval.action), (yyvsp[(5) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(3) - (14)].action)); + bufferWriteU8((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} + break; + + case 51: + +/* Line 1455 of yacc.c */ +#line 490 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); + bufferWriteWTHITProperty((yyval.action)); + bufferWriteU8((yyval.action), SWFACTION_ADD); /* see docs for explanation */ + bufferWriteU8((yyval.action), SWFACTION_DUPLICATECLIP); ;} + break; + + case 52: + +/* Line 1455 of yacc.c */ +#line 499 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_NEXTFRAME); ;} + break; + + case 53: + +/* Line 1455 of yacc.c */ +#line 503 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_PREVFRAME); ;} + break; + + case 54: + +/* Line 1455 of yacc.c */ +#line 507 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_PLAY); ;} + break; + + case 55: + +/* Line 1455 of yacc.c */ +#line 511 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_STOP); ;} + break; + + case 56: + +/* Line 1455 of yacc.c */ +#line 515 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_TOGGLEQUALITY); ;} + break; + + case 57: + +/* Line 1455 of yacc.c */ +#line 519 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_STOPSOUNDS); ;} + break; + + case 58: + +/* Line 1455 of yacc.c */ +#line 523 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_GOTOFRAME); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), atoi((yyvsp[(3) - (4)].str))); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 59: + +/* Line 1455 of yacc.c */ +#line 530 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_GOTOLABEL); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 60: + +/* Line 1455 of yacc.c */ +#line 537 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_GOTOEXPRESSION); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0); ;} + break; + + case 61: + +/* Line 1455 of yacc.c */ +#line 543 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_GOTOEXPRESSION); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 1); ;} + break; + + case 62: + +/* Line 1455 of yacc.c */ +#line 549 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_SETTARGET); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 63: + +/* Line 1455 of yacc.c */ +#line 556 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_SETTARGETEXPRESSION); ;} + break; + + case 64: + +/* Line 1455 of yacc.c */ +#line 560 "swf4compiler.y" + { (yyval.action) = newBuffer(); + /* SetTarget(STRING) */ + bufferWriteU8((yyval.action), SWFACTION_SETTARGET); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (5)].str))+1); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (5)].str), strlen((yyvsp[(3) - (5)].str))+1); + /* stmt */ + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + /* SetTarget('') */ + bufferWriteU8((yyval.action), SWFACTION_SETTARGET); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0); + free((yyvsp[(3) - (5)].str)); ;} + break; + + case 65: + +/* Line 1455 of yacc.c */ +#line 574 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (5)].action); + /* SetTarget(expr) */ + bufferWriteU8((yyval.action), SWFACTION_SETTARGETEXPRESSION); + /* stmt */ + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + /* SetTarget('') */ + bufferWriteU8((yyval.action), SWFACTION_SETTARGET); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0); ;} + break; + + case 66: + +/* Line 1455 of yacc.c */ +#line 587 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); ;} + break; + + case 67: + +/* Line 1455 of yacc.c */ +#line 591 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteU8((yyval.action), SWFACTION_GETTIMER); ;} + break; + + case 68: + +/* Line 1455 of yacc.c */ +#line 595 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_RANDOM); ;} + break; + + case 69: + +/* Line 1455 of yacc.c */ +#line 599 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_STRINGLENGTH); ;} + break; + + case 70: + +/* Line 1455 of yacc.c */ +#line 603 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_INT); ;} + break; + + case 71: + +/* Line 1455 of yacc.c */ +#line 607 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_ORD); ;} + break; + + case 72: + +/* Line 1455 of yacc.c */ +#line 611 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteU8((yyval.action), SWFACTION_CHR); ;} + break; + + case 73: + +/* Line 1455 of yacc.c */ +#line 615 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferWriteU8((yyval.action), SWFACTION_STRINGCONCAT); ;} + break; + + case 74: + +/* Line 1455 of yacc.c */ +#line 620 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); + bufferWriteU8((yyval.action), SWFACTION_SUBSTRING); ;} + break; + + case 75: + +/* Line 1455 of yacc.c */ +#line 626 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferConcat((yyval.action), (yyvsp[(3) - (6)].action)); + bufferWriteGetProperty((yyval.action), (yyvsp[(5) - (6)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + free((yyvsp[(5) - (6)].str)); ;} + break; + + case 76: + +/* Line 1455 of yacc.c */ +#line 635 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); + bufferConcat((yyval.action), (yyvsp[(1) - (2)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} + break; + + case 77: + +/* Line 1455 of yacc.c */ +#line 646 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); + bufferConcat((yyval.action), (yyvsp[(1) - (2)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} + break; + + case 79: + +/* Line 1455 of yacc.c */ +#line 662 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].action); ;} + break; + + case 80: + +/* Line 1455 of yacc.c */ +#line 665 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 81: + +/* Line 1455 of yacc.c */ +#line 670 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), "-", 2); + bufferWriteString((yyval.action), (yyvsp[(2) - (2)].str), strlen((yyvsp[(2) - (2)].str))+1); + free((yyvsp[(2) - (2)].str)); ;} + break; + + case 82: + +/* Line 1455 of yacc.c */ +#line 676 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 83: + +/* Line 1455 of yacc.c */ +#line 681 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 84: + +/* Line 1455 of yacc.c */ +#line 687 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 85: + +/* Line 1455 of yacc.c */ +#line 692 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (3)].str), strlen((yyvsp[(1) - (3)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (3)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + free((yyvsp[(3) - (3)].str)); + free((yyvsp[(1) - (3)].str)); ;} + break; + + case 86: + +/* Line 1455 of yacc.c */ +#line 700 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + free((yyvsp[(2) - (4)].str)); + free((yyvsp[(4) - (4)].str)); ;} + break; + + case 87: + +/* Line 1455 of yacc.c */ +#line 715 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteU8((yyval.action), SWFACTION_DUP); + bufferWriteU8((yyval.action), SWFACTION_DUP); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); ;} + break; + + case 88: + +/* Line 1455 of yacc.c */ +#line 725 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + free((yyvsp[(2) - (4)].str)); + free((yyvsp[(4) - (4)].str)); ;} + break; + + case 89: + +/* Line 1455 of yacc.c */ +#line 740 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteU8((yyval.action), SWFACTION_DUP); + bufferWriteU8((yyval.action), SWFACTION_DUP); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); ;} + break; + + case 90: + +/* Line 1455 of yacc.c */ +#line 750 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteString((yyvsp[(2) - (2)].action), "-1", 3); + bufferWriteU8((yyvsp[(2) - (2)].action), SWFACTION_MULTIPLY); ;} + break; + + case 91: + +/* Line 1455 of yacc.c */ +#line 755 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteU8((yyvsp[(2) - (2)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 92: + +/* Line 1455 of yacc.c */ +#line 759 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_DUP); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} + break; + + case 93: + +/* Line 1455 of yacc.c */ +#line 765 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_MULTIPLY); ;} + break; + + case 94: + +/* Line 1455 of yacc.c */ +#line 770 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_DIVIDE); ;} + break; + + case 95: + +/* Line 1455 of yacc.c */ +#line 775 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_ADD); ;} + break; + + case 96: + +/* Line 1455 of yacc.c */ +#line 780 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); ;} + break; + + case 97: + +/* Line 1455 of yacc.c */ +#line 785 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_STRINGCONCAT); ;} + break; + + case 98: + +/* Line 1455 of yacc.c */ +#line 790 "swf4compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_LESSTHAN); ;} + break; + + case 99: + +/* Line 1455 of yacc.c */ +#line 795 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_LESSTHAN); ;} + break; + + case 100: + +/* Line 1455 of yacc.c */ +#line 800 "swf4compiler.y" + { (yyval.action) = (yyvsp[(3) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); + bufferWriteU8((yyval.action), SWFACTION_LESSTHAN); + bufferWriteU8((yyval.action), SWFACTION_LOGICALNOT); ;} + break; + + case 101: + +/* Line 1455 of yacc.c */ +#line 806 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LESSTHAN); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 102: + +/* Line 1455 of yacc.c */ +#line 811 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_STRINGEQ); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 103: + +/* Line 1455 of yacc.c */ +#line 816 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_STRINGEQ); ;} + break; + + case 104: + +/* Line 1455 of yacc.c */ +#line 820 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_STRINGCOMPARE); ;} + break; + + case 105: + +/* Line 1455 of yacc.c */ +#line 824 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_EQUAL); ;} + break; + + case 106: + +/* Line 1455 of yacc.c */ +#line 828 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_EQUAL); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 107: + +/* Line 1455 of yacc.c */ +#line 833 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALAND); ;} + break; + + case 108: + +/* Line 1455 of yacc.c */ +#line 837 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALOR); ;} + break; + + case 109: + +/* Line 1455 of yacc.c */ +#line 841 "swf4compiler.y" + { bufferWriteU8((yyvsp[(1) - (5)].action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyvsp[(1) - (5)].action), 2); + bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(5) - (5)].action))+5); + bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(5) - (5)].action)); + bufferWriteU8((yyvsp[(1) - (5)].action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyvsp[(1) - (5)].action), 2); + bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(3) - (5)].action))); + bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(3) - (5)].action)); ;} + break; + + case 111: + +/* Line 1455 of yacc.c */ +#line 855 "swf4compiler.y" + { (yyval.str) = (yyvsp[(1) - (3)].str); + (yyval.str) = stringConcat((yyval.str), strdup(":")); + (yyval.str) = stringConcat((yyval.str), (yyvsp[(3) - (3)].str)); ;} + break; + + case 112: + +/* Line 1455 of yacc.c */ +#line 862 "swf4compiler.y" + { (yyval.str) = strdup(""); ;} + break; + + case 113: + +/* Line 1455 of yacc.c */ +#line 865 "swf4compiler.y" + { (yyval.str) = strdup(""); ;} + break; + + case 114: + +/* Line 1455 of yacc.c */ +#line 868 "swf4compiler.y" + { (yyval.str) = strdup("/"); ;} + break; + + case 115: + +/* Line 1455 of yacc.c */ +#line 871 "swf4compiler.y" + { (yyval.str) = strdup(".."); ;} + break; + + case 116: + +/* Line 1455 of yacc.c */ +#line 874 "swf4compiler.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + break; + + case 117: + +/* Line 1455 of yacc.c */ +#line 877 "swf4compiler.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + break; + + case 118: + +/* Line 1455 of yacc.c */ +#line 882 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 119: + +/* Line 1455 of yacc.c */ +#line 887 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 120: + +/* Line 1455 of yacc.c */ +#line 891 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].action); ;} + break; + + case 123: + +/* Line 1455 of yacc.c */ +#line 900 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} + break; + + case 124: + +/* Line 1455 of yacc.c */ +#line 908 "swf4compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].action)); + bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); + bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} + break; + + case 125: + +/* Line 1455 of yacc.c */ +#line 916 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(2) - (4)].str)); + free((yyvsp[(4) - (4)].str)); ;} + break; + + case 126: + +/* Line 1455 of yacc.c */ +#line 929 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + bufferWriteString((yyval.action), "1", 2); + bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); + bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(2) - (4)].str)); + free((yyvsp[(4) - (4)].str)); ;} + break; + + case 127: + +/* Line 1455 of yacc.c */ +#line 942 "swf4compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} + break; + + case 128: + +/* Line 1455 of yacc.c */ +#line 946 "swf4compiler.y" + { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); + bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_MULTIPLY); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} + break; + + case 129: + +/* Line 1455 of yacc.c */ +#line 953 "swf4compiler.y" + { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); + bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_DIVIDE); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} + break; + + case 130: + +/* Line 1455 of yacc.c */ +#line 960 "swf4compiler.y" + { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); + bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_ADD); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} + break; + + case 131: + +/* Line 1455 of yacc.c */ +#line 967 "swf4compiler.y" + { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); + bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SUBTRACT); + bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} + break; + + case 132: + +/* Line 1455 of yacc.c */ +#line 974 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferConcat((yyval.action),(yyvsp[(5) - (5)].action)); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(1) - (5)].str)); + free((yyvsp[(3) - (5)].str)); ;} + break; + + case 133: + +/* Line 1455 of yacc.c */ +#line 983 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + bufferWriteU8((yyval.action), SWFACTION_MULTIPLY); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(1) - (5)].str)); + free((yyvsp[(3) - (5)].str)); ;} + break; + + case 134: + +/* Line 1455 of yacc.c */ +#line 996 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + bufferWriteU8((yyval.action), SWFACTION_DIVIDE); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(1) - (5)].str)); + free((yyvsp[(3) - (5)].str)); ;} + break; + + case 135: + +/* Line 1455 of yacc.c */ +#line 1009 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + bufferWriteU8((yyval.action), SWFACTION_ADD); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(1) - (5)].str)); + free((yyvsp[(3) - (5)].str)); ;} + break; + + case 136: + +/* Line 1455 of yacc.c */ +#line 1022 "swf4compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); + bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); + bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); + bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); + free((yyvsp[(1) - (5)].str)); + free((yyvsp[(3) - (5)].str)); ;} + break; + + + +/* Line 1455 of yacc.c */ +#line 3218 "swf4compiler.tab.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c */ +#line 1039 "swf4compiler.y" + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h new file mode 100644 index 000000000..f13648bbe --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h @@ -0,0 +1,136 @@ + +/* A Bison parser, made by GNU Bison 2.4. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + BREAK = 258, + FOR = 259, + CONTINUE = 260, + IF = 261, + ELSE = 262, + DO = 263, + WHILE = 264, + THIS = 265, + EVAL = 266, + TIME = 267, + RANDOM = 268, + LENGTH = 269, + INT = 270, + CONCAT = 271, + DUPLICATECLIP = 272, + REMOVECLIP = 273, + TRACE = 274, + STARTDRAG = 275, + STOPDRAG = 276, + ORD = 277, + CHR = 278, + CALLFRAME = 279, + GETURL = 280, + GETURL1 = 281, + LOADMOVIE = 282, + LOADVARIABLES = 283, + POSTURL = 284, + SUBSTR = 285, + GETPROPERTY = 286, + NEXTFRAME = 287, + PREVFRAME = 288, + PLAY = 289, + STOP = 290, + TOGGLEQUALITY = 291, + STOPSOUNDS = 292, + GOTOFRAME = 293, + GOTOANDPLAY = 294, + FRAMELOADED = 295, + SETTARGET = 296, + TELLTARGET = 297, + STRING = 298, + NUMBER = 299, + IDENTIFIER = 300, + PATH = 301, + GETURL_METHOD = 302, + EQ = 303, + LE = 304, + GE = 305, + NE = 306, + LAN = 307, + LOR = 308, + INC = 309, + DEC = 310, + IEQ = 311, + DEQ = 312, + MEQ = 313, + SEQ = 314, + STREQ = 315, + STRNE = 316, + STRCMP = 317, + PARENT = 318, + END = 319, + UMINUS = 320, + POSTFIX = 321, + NEGATE = 322 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c */ +#line 17 "swf4compiler.y" + + Buffer action; + char *str; + SWFActionFunction function; + SWFGetUrl2Method getURLMethod; + + + +/* Line 1676 of yacc.c */ +#line 128 "swf4compiler.tab.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +extern YYSTYPE swf4lval; + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y new file mode 100644 index 000000000..2ecd42a81 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y @@ -0,0 +1,1039 @@ +/* $Id: swf4compiler.y,v 1.1 2004/05/08 17:17:35 kramm Exp $ */ + +%start program + +%{ + +#include +#include +#include +#include "compile.h" +#include "action.h" + +#define YYPARSE_PARAM buffer + +%} + +%union { + Buffer action; + char *str; + SWFActionFunction function; + SWFGetUrl2Method getURLMethod; +} + +/* tokens etc. */ +%token BREAK +%token FOR +%token CONTINUE +%token IF +%token ELSE +%token DO +%token WHILE + +%token THIS + +/* functions */ +%token EVAL +%token TIME +%token RANDOM +%token LENGTH +%token INT +%token CONCAT +%token DUPLICATECLIP +%token REMOVECLIP +%token TRACE +%token STARTDRAG +%token STOPDRAG +%token ORD +%token CHR +%token CALLFRAME +%token GETURL +%token GETURL1 +%token LOADMOVIE +%token LOADVARIABLES +%token POSTURL +%token SUBSTR + +%token GETPROPERTY + +/* v3 functions */ +%token NEXTFRAME +%token PREVFRAME +%token PLAY +%token STOP +%token TOGGLEQUALITY +%token STOPSOUNDS +%token GOTOFRAME +%token GOTOANDPLAY +%token FRAMELOADED +%token SETTARGET + +/* high level functions */ +%token TELLTARGET + +/* these three are strdup'ed in compiler.flex, so free them here */ +%token STRING +%token NUMBER +%token IDENTIFIER +%token PATH + +%token GETURL_METHOD + +%token EQ "==" +%token LE "<=" +%token GE ">=" +%token NE "!=" +%token LAN "&&" +%token LOR "||" +%token INC "++" +%token DEC "--" +%token IEQ "+=" +%token DEQ "/=" +%token MEQ "*=" +%token SEQ "-=" +%token STREQ "===" +%token STRNE "!==" +%token STRCMP "<=>" +%token PARENT ".." + +%token END "end" + +/* ascending order of ops ..? */ +%left ',' +%right '=' "*=" "/=" "+=" "-=" +%right '?' ':' +%left "&&" "||" +%left "==" "!=" "===" "!==" +%left '<' '>' "<=" ">=" "<=>" +%left '&' +%left '+' '-' +%left '*' '/' +%right "++" "--" UMINUS '!' +%right POSTFIX +%right NEGATE + +%type elem +%type elems +%type stmt +%type statements +%type if_stmt +%type iter_stmt +%type cont_stmt +%type break_stmt +%type expr_opt +%type void_function_call +%type function_call +%type lhs_expr +%type pf_expr +%type rhs_expr +%type assign_stmt +%type assign_stmts +%type assign_stmts_opt +%type expr +%type program + +/* make sure to free these, too! */ +%type sprite +%type variable + +%% + +/* rules */ + +program + : elems + { *((Buffer *)buffer) = $1; } + + ; + +elems + : elem + | elems elem + { bufferConcat($1, $2); } + ; + +elem + : stmt + ; + +stmt + : '{' '}' { $$ = NULL; } + | '{' statements '}' { $$ = $2; } + | ';' { $$ = NULL; } + | assign_stmt ';' + | if_stmt + | iter_stmt + | cont_stmt + | break_stmt + ; + +assign_stmts + : assign_stmt + | assign_stmts ',' assign_stmt { bufferConcat($1, $3); } + ; + +statements + : /* empty */ { $$ = NULL; } + | stmt + | statements stmt + { bufferConcat($1, $2); } + ; + +if_stmt + /* XXX- I haven't tested the frameloaded() stuff yet.. */ + + : IF '(' FRAMELOADED '(' NUMBER ')' ')' stmt ELSE stmt + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_WAITFORFRAME); + bufferWriteS16($$, 3); + bufferWriteS16($$, atoi($5)); + free($5); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($10)+5); + bufferConcat($$, $10); /* ..here */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($8)); + bufferConcat($$, $8); } + + | IF '(' FRAMELOADED '(' NUMBER ')' ')' stmt + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_WAITFORFRAME); + bufferWriteS16($$, 3); + bufferWriteS16($$, atoi($5)); + free($5); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, 5); + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); /* ..here */ + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($8)); /* ..and then out */ + bufferConcat($$, $8); } + + /* make this case cleaner.. */ + | IF '(' '!' FRAMELOADED '(' NUMBER ')' ')' stmt + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_WAITFORFRAME); + bufferWriteS16($$, 3); + bufferWriteS16($$, atoi($6)); + free($6); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($9)); + bufferConcat($$, $9); } /* ..here */ + + | IF '(' FRAMELOADED '(' expr ')' ')' stmt ELSE stmt + { $$ = $5; + bufferWriteU8($$, SWFACTION_WAITFORFRAMEEXPRESSION); + bufferWriteS16($$, 1); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($10)+5); + bufferConcat($$, $10); /* ..here */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($8)); + bufferConcat($$, $8); } + + | IF '(' FRAMELOADED '(' expr ')' ')' stmt + { $$ = $5; + bufferWriteU8($$, SWFACTION_WAITFORFRAMEEXPRESSION); + bufferWriteS16($$, 1); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, 5); + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); /* ..here */ + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($8)); /* ..and then out */ + bufferConcat($$, $8); } + + /* make this case cleaner.. */ + | IF '(' '!' FRAMELOADED '(' expr ')' ')' stmt + { $$ = $6; + bufferWriteU8($$, SWFACTION_WAITFORFRAMEEXPRESSION); + bufferWriteS16($$, 1); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($9)); + bufferConcat($$, $9); } /* ..here */ + + | IF '(' expr ')' stmt ELSE stmt + { bufferWriteU8($3, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($3, 2); + bufferWriteS16($3, bufferLength($7)+5); + bufferConcat($3, $7); + bufferWriteU8($3, SWFACTION_BRANCHALWAYS); + bufferWriteS16($3, 2); + bufferWriteS16($3, bufferLength($5)); + bufferConcat($3, $5); + $$ = $3; } + + | IF '(' expr ')' stmt + { bufferWriteU8($3, SWFACTION_LOGICALNOT); + bufferWriteU8($3, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($3, 2); + bufferWriteS16($3, bufferLength($5)); + bufferConcat($3, $5); + $$ = $3; } + ; + +expr_opt + : /* empty */ { $$ = NULL; } + | expr { $$ = $1; } + ; + +/* not thought out yet.. +switch_stmt + : SWITCH '(' expr ')' '{' + { $$ = $3; + pushLoop(); } + switch_cases '}' + { bufferConcat($$, $7); } + ; + +switch_cases + : switch_cases switch_case + | switch_case + ; + +switch_case + : CASE INTEGER ':' stmt + { $$ = newBuffer(); } + ; +*/ + +iter_stmt + : WHILE '(' '!' FRAMELOADED '(' NUMBER ')' ')' stmt + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_WAITFORFRAME); + bufferWriteS16($$, 3); + bufferWriteS16($$, atoi($6)); + free($6); + bufferWriteU8($$, 1); /* if not loaded, jump to.. */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($9)+5); + bufferConcat($$, $9); /* ..here */ + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, -(bufferLength($$)+2)); } + + | WHILE '(' expr ')' stmt + { $$ = $3; + bufferWriteU8($$, SWFACTION_LOGICALNOT); + bufferWriteU8($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($5)+5); + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, -(bufferLength($$)+2)); + bufferResolveJumps($$); } + + | DO stmt WHILE '(' expr ')' + { $$ = $2; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, -(bufferLength($$)+2)); + bufferResolveJumps($$); } + + | FOR '(' assign_stmts_opt ';' expr_opt ';' assign_stmts_opt ')' stmt + { if (!$5) + $5 = newBuffer(); + else { + bufferWriteU8($5, SWFACTION_LOGICALNOT); + bufferWriteU8($5, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($5, 2); + bufferWriteS16($5, bufferLength($9)+bufferLength($7)+5); + } + bufferConcat($5, $9); + bufferConcat($5, $7); + bufferWriteU8($5, SWFACTION_BRANCHALWAYS); + bufferWriteS16($5, 2); + bufferWriteS16($5, -(bufferLength($5)+2)); + bufferResolveJumps($5); + $$ = $3; + if(!$$) $$ = newBuffer(); + bufferConcat($$, $5); + } + ; + +assign_stmts_opt + : /* empty */ { $$ = NULL; } + | assign_stmts + ; + +cont_stmt + : CONTINUE ';' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, MAGIC_CONTINUE_NUMBER); } + ; + +break_stmt + : BREAK ';' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, MAGIC_BREAK_NUMBER); } + ; + +void_function_call + : STOPDRAG '(' ')' /* no args */ + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_STOPDRAGMOVIE); } + + | CALLFRAME '(' variable ')' + { $$ = newBuffer(); + bufferWriteString($$, $3, strlen($3)+1); + bufferWriteU8($$, SWFACTION_CALLFRAME); + bufferWriteS16($$, 0); + free($3); } + + | CALLFRAME '(' STRING ')' + { $$ = newBuffer(); + bufferWriteString($$, $3, strlen($3)+1); + bufferWriteU8($$, SWFACTION_CALLFRAME); + bufferWriteS16($$, 0); + free($3); } + + | REMOVECLIP '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_REMOVECLIP); } + + | TRACE '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_TRACE); } + + /* getURL2(url, window, [method]) */ + | GETURL '(' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, GETURL_METHOD_NOSEND); } + + | GETURL '(' expr ',' expr ',' GETURL_METHOD ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, $7); } + + | GETURL1 '(' STRING ',' STRING ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_GETURL); + bufferWriteS16($$, strlen($3) + strlen($5) + 2); + bufferWriteHardString($$, (byte*)$3, strlen($3)); + bufferWriteU8($$, 0); + bufferWriteHardString($$, (byte*)$5, strlen($5)); + bufferWriteU8($$, 0); } + + | LOADMOVIE '(' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, GETURL_METHOD_NOSEND | GETURL_LOADMOVIE); } + + | LOADMOVIE '(' expr ',' expr ',' GETURL_METHOD ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, $7 | GETURL_LOADMOVIE); } + + | LOADVARIABLES '(' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, GETURL_METHOD_NOSEND | GETURL_LOADVARIABLES); } + + | LOADVARIABLES '(' expr ',' expr ',' GETURL_METHOD ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, $7 | GETURL_LOADVARIABLES); } + + /* startDrag(target, lock, [left, right, top, bottom]) */ + | STARTDRAG '(' expr ',' expr ')' + { $$ = newBuffer(); + bufferWriteString($$, "0", 2); /* no constraint */ + bufferConcat($$, $5); + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_STARTDRAGMOVIE); } + + | STARTDRAG '(' expr ',' expr ',' expr ',' expr ',' expr ',' expr ')' + { $$ = newBuffer(); + bufferConcat($$, $7); + bufferConcat($$, $11); + bufferConcat($$, $9); + bufferConcat($$, $13); + bufferWriteString($$, "1", 2); /* has constraint */ + bufferConcat($$, $5); + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_STARTDRAGMOVIE); } + + /* duplicateClip(target, new, depth) */ + | DUPLICATECLIP '(' expr ',' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferConcat($$, $7); + bufferWriteWTHITProperty($$); + bufferWriteU8($$, SWFACTION_ADD); /* see docs for explanation */ + bufferWriteU8($$, SWFACTION_DUPLICATECLIP); } + + /* v3 actions */ + | NEXTFRAME '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_NEXTFRAME); } + + | PREVFRAME '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_PREVFRAME); } + + | PLAY '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_PLAY); } + + | STOP '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_STOP); } + + | TOGGLEQUALITY '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_TOGGLEQUALITY); } + + | STOPSOUNDS '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_STOPSOUNDS); } + + | GOTOFRAME '(' NUMBER ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_GOTOFRAME); + bufferWriteS16($$, 2); + bufferWriteS16($$, atoi($3)); + free($3); } + + | GOTOFRAME '(' STRING ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_GOTOLABEL); + bufferWriteS16($$, strlen($3)+1); + bufferWriteHardString($$, (byte*)$3, strlen($3)+1); + free($3); } + + | GOTOFRAME '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_GOTOEXPRESSION); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0); } /* XXX - and stop */ + + | GOTOANDPLAY '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_GOTOEXPRESSION); + bufferWriteS16($$, 1); + bufferWriteU8($$, 1); } /* XXX - and play */ + + | SETTARGET '(' STRING ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_SETTARGET); + bufferWriteS16($$, strlen($3)+1); + bufferWriteHardString($$, (byte*)$3, strlen($3)+1); + free($3); } + + | SETTARGET '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_SETTARGETEXPRESSION); } + + | TELLTARGET '(' STRING ')' stmt + { $$ = newBuffer(); + /* SetTarget(STRING) */ + bufferWriteU8($$, SWFACTION_SETTARGET); + bufferWriteS16($$, strlen($3)+1); + bufferWriteHardString($$, (byte*)$3, strlen($3)+1); + /* stmt */ + bufferConcat($$, $5); + /* SetTarget('') */ + bufferWriteU8($$, SWFACTION_SETTARGET); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0); + free($3); } + + | TELLTARGET '(' expr ')' stmt + { $$ = $3; + /* SetTarget(expr) */ + bufferWriteU8($$, SWFACTION_SETTARGETEXPRESSION); + /* stmt */ + bufferConcat($$, $5); + /* SetTarget('') */ + bufferWriteU8($$, SWFACTION_SETTARGET); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0); } + ; + +function_call + : EVAL '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_GETVARIABLE); } + + | TIME '(' ')' + { $$ = newBuffer(); + bufferWriteU8($$, SWFACTION_GETTIMER); } + + | RANDOM '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_RANDOM); } + + | LENGTH '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_STRINGLENGTH); } + + | INT '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_INT); } + + | ORD '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_ORD); } + + | CHR '(' expr ')' + { $$ = $3; + bufferWriteU8($$, SWFACTION_CHR); } + + | CONCAT '(' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_STRINGCONCAT); } + + | SUBSTR '(' expr ',' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferConcat($$, $7); + bufferWriteU8($$, SWFACTION_SUBSTRING); } + + | GETPROPERTY '(' expr ',' STRING ')' + { $$ = newBuffer(); + bufferConcat($$, $3); + bufferWriteGetProperty($$, $5); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + free($5); } + ; + +pf_expr + : lhs_expr "++" %prec POSTFIX + { $$ = newBuffer(); + bufferWriteBuffer($$, $1); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteBuffer($$, $1); + bufferConcat($$, $1); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteU8($$, SWFACTION_SETVARIABLE); } + + | lhs_expr "--" %prec POSTFIX + { $$ = newBuffer(); + bufferWriteBuffer($$, $1); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteBuffer($$, $1); + bufferConcat($$, $1); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_SUBTRACT); + bufferWriteU8($$, SWFACTION_SETVARIABLE); } + ; + +/* these leave a value on the stack */ +rhs_expr + : function_call + + | '(' rhs_expr ')' + { $$ = $2; } + + | NUMBER + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + + | '-' NUMBER %prec NEGATE + { $$ = newBuffer(); + bufferWriteString($$, "-", 2); + bufferWriteString($$, $2, strlen($2)+1); + free($2); } + + | STRING + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + + | variable + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + free($1); } + + | sprite + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + + | sprite '.' IDENTIFIER + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteGetProperty($$, $3); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + free($3); + free($1); } + + | "++" sprite '.' IDENTIFIER + { $$ = newBuffer(); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteGetProperty($$, $4); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteSetProperty($$, $4); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteGetProperty($$, $4); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + free($2); + free($4); } + + | "++" lhs_expr + { $$ = $2; + bufferWriteU8($$, SWFACTION_DUP); + bufferWriteU8($$, SWFACTION_DUP); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteU8($$, SWFACTION_SETVARIABLE); + bufferWriteU8($$, SWFACTION_GETVARIABLE); } + + | "--" sprite '.' IDENTIFIER + { $$ = newBuffer(); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteGetProperty($$, $4); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteSetProperty($$, $4); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteGetProperty($$, $4); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + free($2); + free($4); } + + | "--" lhs_expr + { $$ = $2; + bufferWriteU8($$, SWFACTION_DUP); + bufferWriteU8($$, SWFACTION_DUP); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_SUBTRACT); + bufferWriteU8($$, SWFACTION_SETVARIABLE); + bufferWriteU8($$, SWFACTION_GETVARIABLE); } + + | '-' rhs_expr %prec UMINUS + { $$ = $2; + bufferWriteString($2, "-1", 3); + bufferWriteU8($2, SWFACTION_MULTIPLY); } + + | '!' rhs_expr + { $$ = $2; + bufferWriteU8($2, SWFACTION_LOGICALNOT); } + + | lhs_expr '=' rhs_expr /* assign and leave copy on stack */ + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_DUP); + bufferWriteU8($$, SWFACTION_SETVARIABLE); } + + | rhs_expr '*' rhs_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_MULTIPLY); } + + | rhs_expr '/' rhs_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_DIVIDE); } + + | rhs_expr '+' rhs_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_ADD); } + + | rhs_expr '-' rhs_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_SUBTRACT); } + + | rhs_expr '&' rhs_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_STRINGCONCAT); } + + | rhs_expr '<' rhs_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteU8($$, SWFACTION_LESSTHAN); } + + | rhs_expr '>' rhs_expr + { $$ = $3; + bufferConcat($$, $1); + bufferWriteU8($$, SWFACTION_LESSTHAN); } + + | rhs_expr "<=" rhs_expr + { $$ = $3; + bufferConcat($$, $1); + bufferWriteU8($$, SWFACTION_LESSTHAN); + bufferWriteU8($$, SWFACTION_LOGICALNOT); } + + | rhs_expr ">=" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_LESSTHAN); + bufferWriteU8($1, SWFACTION_LOGICALNOT); } + + | rhs_expr "!==" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_STRINGEQ); + bufferWriteU8($1, SWFACTION_LOGICALNOT); } + + | rhs_expr "===" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_STRINGEQ); } + + | rhs_expr "<=>" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_STRINGCOMPARE); } + + | rhs_expr "==" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_EQUAL); } + + | rhs_expr "!=" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_EQUAL); + bufferWriteU8($1, SWFACTION_LOGICALNOT); } + + | rhs_expr "&&" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_LOGICALAND); } + + | rhs_expr "||" rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_LOGICALOR); } + + | rhs_expr '?' rhs_expr ':' rhs_expr + { bufferWriteU8($1, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($1, 2); + bufferWriteS16($1, bufferLength($5)+5); + bufferConcat($1, $5); + bufferWriteU8($1, SWFACTION_BRANCHALWAYS); + bufferWriteS16($1, 2); + bufferWriteS16($1, bufferLength($3)); + bufferConcat($1, $3); } + ; + +variable + : IDENTIFIER + + | sprite ':' IDENTIFIER + { $$ = $1; + $$ = stringConcat($$, strdup(":")); + $$ = stringConcat($$, $3); } + ; + +sprite + : THIS + { $$ = strdup(""); } + + | '.' + { $$ = strdup(""); } + + | '/' + { $$ = strdup("/"); } + + | PARENT + { $$ = strdup(".."); } + + | IDENTIFIER + { $$ = $1; } + + | PATH + { $$ = $1; } + ; + +lhs_expr + : variable + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + + | STRING + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + + | '(' rhs_expr ')' { $$ = $2; } + ; + +assign_stmt + : pf_expr + + | void_function_call + + | "++" lhs_expr + { $$ = $2; + bufferWriteBuffer($$, $2); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteU8($$, SWFACTION_SETVARIABLE); } + + | "--" lhs_expr + { $$ = $2; + bufferWriteBuffer($$, $2); + bufferWriteU8($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_SUBTRACT); + bufferWriteU8($$, SWFACTION_SETVARIABLE); } + + | "++" sprite '.' IDENTIFIER + { $$ = newBuffer(); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteGetProperty($$, $4); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteSetProperty($$, $4); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($2); + free($4); } + + | "--" sprite '.' IDENTIFIER + { $$ = newBuffer(); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteGetProperty($$, $4); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + bufferWriteString($$, "1", 2); + bufferWriteU8($$, SWFACTION_SUBTRACT); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteSetProperty($$, $4); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($2); + free($4); } + + | lhs_expr '=' rhs_expr + { bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_SETVARIABLE); } + + | lhs_expr "*=" rhs_expr + { bufferWriteBuffer($1, $1); + bufferWriteU8($1, SWFACTION_GETVARIABLE); + bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_MULTIPLY); + bufferWriteU8($1, SWFACTION_SETVARIABLE); } + + | lhs_expr "/=" rhs_expr + { bufferWriteBuffer($1, $1); + bufferWriteU8($1, SWFACTION_GETVARIABLE); + bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_DIVIDE); + bufferWriteU8($1, SWFACTION_SETVARIABLE); } + + | lhs_expr "+=" rhs_expr + { bufferWriteBuffer($1, $1); + bufferWriteU8($1, SWFACTION_GETVARIABLE); + bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_ADD); + bufferWriteU8($1, SWFACTION_SETVARIABLE); } + + | lhs_expr "-=" rhs_expr + { bufferWriteBuffer($1, $1); + bufferWriteU8($1, SWFACTION_GETVARIABLE); + bufferConcat($1, $3); + bufferWriteU8($1, SWFACTION_SUBTRACT); + bufferWriteU8($1, SWFACTION_SETVARIABLE); } + + | sprite '.' IDENTIFIER '=' rhs_expr + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteSetProperty($$, $3); + bufferConcat($$,$5); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($1); + free($3); } + + | sprite '.' IDENTIFIER "*=" rhs_expr + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteSetProperty($$, $3); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteGetProperty($$, $3); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_MULTIPLY); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($1); + free($3); } + + | sprite '.' IDENTIFIER "/=" rhs_expr + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteSetProperty($$, $3); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteGetProperty($$, $3); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_DIVIDE); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($1); + free($3); } + + | sprite '.' IDENTIFIER "+=" rhs_expr + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteSetProperty($$, $3); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteGetProperty($$, $3); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_ADD); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($1); + free($3); } + + | sprite '.' IDENTIFIER "-=" rhs_expr + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteSetProperty($$, $3); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteGetProperty($$, $3); + bufferWriteU8($$, SWFACTION_GETPROPERTY); + bufferConcat($$, $5); + bufferWriteU8($$, SWFACTION_SUBTRACT); + bufferWriteU8($$, SWFACTION_SETPROPERTY); + free($1); + free($3); } + ; + +expr + : rhs_expr + ; + +%% diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex new file mode 100644 index 000000000..86a74a3cf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex @@ -0,0 +1,467 @@ +%{ + +#include +#include + +#include "compile.h" +#include "action.h" +#include "blocks/error.h" +#include "swf5compiler.tab.h" /* defines token types */ + +static int swf5debug; + +static const char *lexBuffer = NULL; +static int lexBufferLen = 0; + +static int sLineNumber = 0; +static char szLine[1024]; +static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; +static int column = 0; + +static void comment(); +static void comment1(); +static void count(); +static void countline(); +static void warning(char *msg); + +#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) + +/* thanks to the prolific and brilliant Raff: */ +static int lexBufferInput(char *buf, int max_size) +{ + int l = lexBufferLen > max_size ? max_size : lexBufferLen; + + if (lexBufferLen <= 0) + return YY_NULL; + + memcpy(buf, lexBuffer, l); + lexBuffer += l; + lexBufferLen -= l; + return l; +} + + /* very inefficient method of unescaping strings */ +static void unescape(char *buf) +{ + char *p, *p1; + + for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { + switch(p[1]) + { + case 'b' : p[1] = '\b'; break; + case 'f' : p[1] = '\f'; break; + case 'n' : p[1] = '\n'; break; + case 'r' : p[1] = '\r'; break; + case 't' : p[1] = '\t'; break; + case 'x' : + case 'u' : warning("unsupported escape sequence"); + } + strcpy(p, p+1); + } +} + +void swf5ParseInit(const char *script, int debug) +{ + checkByteOrder(); + yyrestart(NULL); + + swf5debug = debug; + + lexBuffer = script; + lexBufferLen = strlen(script); + sLineNumber = 0; + column = 0; + msgline = msgbufs[0]; +} + +%} + +%s asm + +%{ + // forward declaration needed by the following function +#ifndef YY_PROTO +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif +#endif + static void yyunput YY_PROTO(( int c, char *buf_ptr )); + + void do_unput5(const char c) { unput(c); } +%} + +DIGIT [0-9] +ID [a-zA-Z_][a-zA-Z0-9_]* + +%% + +0x[0-9a-fA-F]+ { count(); swf5lval.intVal = strtoul(yytext, NULL, 0); + return INTEGER; } +0[0-7]+ { count(); swf5lval.intVal = strtoul(yytext, NULL, 0); + return INTEGER; } +{DIGIT}+ { count(); swf5lval.intVal = atoi(yytext); + return INTEGER; } +{DIGIT}+"."{DIGIT}* { count(); swf5lval.doubleVal = atof(yytext); + return DOUBLE; } +true { count(); swf5lval.intVal = 1; + return BOOLEAN; } +false { count(); swf5lval.intVal = 0; + return BOOLEAN; } +null { count(); return NULLVAL; } +break { count(); return BREAK; } +continue { count(); return CONTINUE; } +function { count(); return FUNCTION; } +else { count(); return ELSE; } +switch { count(); return SWITCH; } +case { count(); return CASE; } +default { count(); return DEFAULT; } +for { count(); return FOR; } +in { count(); return IN; } +if { count(); return IF; } +while { count(); return WHILE; } +do { count(); return DO; } +var { count(); return VAR; } +new { count(); return NEW; } +delete { count(); return DELETE; } +return { count(); return RETURN; } +with { count(); return WITH; } +asm { count(); BEGIN(asm); return ASM; } +eval { count(); return EVAL; } +typeof { count(); return TYPEOF; } +instanceof { count(); return INSTANCEOF; } + + /* legacy functions */ +random { count(); return RANDOM; } +getTimer { count(); return GETTIMER; } +length { count(); return LENGTH; } +concat { count(); return CONCAT; } +substr { count(); return SUBSTR; } +trace { count(); return TRACE; } +int { count(); return INT; } +ord { count(); return ORD; } +chr { count(); return CHR; } +getURL { count(); return GETURL; } +getURL1 { count(); return GETURL1; } +nextFrame { count(); return NEXTFRAME; } +prevFrame { count(); return PREVFRAME; } +play { count(); return PLAY; } +stop { count(); return STOP; } +toggleQuality { count(); return TOGGLEQUALITY; } +stopSounds { count(); return STOPSOUNDS; } +callFrame { count(); return CALLFRAME; } +gotoFrame { count(); return GOTOFRAME; } +setTarget { count(); return SETTARGET; } +loadVariables { count(); return LOADVARIABLES; } +loadMovie { count(); return LOADMOVIE; } +loadVariablesNum { count(); return LOADVARIABLESNUM; } +loadMovieNum { count(); return LOADMOVIENUM; } +duplicateMovieClip { count(); return DUPLICATEMOVIECLIP; } +removeMovieClip { count(); return REMOVEMOVIECLIP; } + + /* assembler ops */ +{ +dup { count(); return DUP; } +swap { count(); return SWAP; } +pop { count(); return POP; } +push { count(); return PUSH; } +setregister { count(); return SETREGISTER; } +callfunction { count(); return CALLFUNCTION; } +callmethod { count(); return CALLMETHOD; } +and { count(); return AND; } +or { count(); return OR; } +xor { count(); return XOR; } +modulo { count(); return MODULO; } +add { count(); return ADD; } +newadd { count(); return ADD; } +lessthan { count(); return LESSTHAN; } +newlessthan { count(); return LESSTHAN; } +equals { count(); return EQUALS; } +newequals { count(); return EQUALS; } +inc { count(); return INC; } +dec { count(); return DEC; } +enumerate { count(); return ENUMERATE; } +initobject { count(); return INITOBJECT; } +initarray { count(); return INITARRAY; } +getmember { count(); return GETMEMBER; } +setmember { count(); return SETMEMBER; } +shiftleft { count(); return SHIFTLEFT; } +shiftright { count(); return SHIFTRIGHT; } +shiftright2 { count(); return SHIFTRIGHT2; } +varequals { count(); return VAREQUALS; } +oldadd { count(); return OLDADD; } +subtract { count(); return SUBTRACT; } +multiply { count(); return MULTIPLY; } +divide { count(); return DIVIDE; } +oldequals { count(); return OLDEQUALS; } +oldlessthan { count(); return OLDLESSTHAN; } +logicaland { count(); return LOGICALAND; } +logicalor { count(); return LOGICALOR; } +not { count(); return NOT; } +stringeq { count(); return STRINGEQ; } +stringlength { count(); return STRINGLENGTH; } +substring { count(); return SUBSTRING; } +getvariable { count(); return GETVARIABLE; } +setvariable { count(); return SETVARIABLE; } +settargetexpr { count(); return SETTARGETEXPRESSION; } +startdrag { count(); return STARTDRAG; } +stopdrag { count(); return STOPDRAG; } +stringlessthan { count(); return STRINGLESSTHAN; } +mblength { count(); return MBLENGTH; } +mbsubstring { count(); return MBSUBSTRING; } +mbord { count(); return MBORD; } +mbchr { count(); return MBCHR; } +branch { count(); return BRANCHALWAYS; } +branchalways { count(); return BRANCHALWAYS; } +branchiftrue { count(); return BRANCHIFTRUE; } +post { count(); return POST; } +get { count(); return GET; } +end { count(); return END; } +} + +r\:{DIGIT}+ { count(); swf5lval.str = strdup(yytext+2); + return REGISTER; } + + +{ID} { count(); swf5lval.str = strdup(yytext); + return IDENTIFIER; } + +\"(\\.|[^\\"])*\" { count(); swf5lval.str = strdup(yytext+1); + swf5lval.str[strlen(swf5lval.str)-1]=0; + unescape(swf5lval.str); + return STRING; } + +\'(\\.|[^\\'])*\' { count(); swf5lval.str = strdup(yytext+1); + swf5lval.str[strlen(swf5lval.str)-1]=0; + unescape(swf5lval.str); + return STRING; } + +\"(\\.|[^\\"])*$ { count(); swf5lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + +\'(\\.|[^\\'])*$ { count(); swf5lval.str = strdup(""); + warning("Unterminated string!"); + return STRING; } + +"/*" { count(); comment(); } +"//" { count(); comment1(); } +[ \t\v\f] { count(); } + +"++" { count(); return INCR; } +"--" { count(); return DECR; } +"<=" { count(); return LE; } +">=" { count(); return GE; } +"==" { count(); return EQ; } +"!=" { count(); return NE; } +"&&" { count(); return LAN; } +"||" { count(); return LOR; } +"*=" { count(); return MEQ; } +"/=" { count(); return DEQ; } +"+=" { count(); return IEQ; } +"-=" { count(); return SEQ; } +"&=" { count(); return AEQ; } +"|=" { count(); return OEQ; } +"<<" { count(); return SHL; } +">>" { count(); return SHR; } +">>>" { count(); return SHR2; } +"<<=" { count(); return SHLEQ; } +">>=" { count(); return SHREQ; } +">>>=" { count(); return SHR2EQ; } + +"<" { count(); return '<'; } +">" { count(); return '>'; } +";" { count(); return ';'; } +"=" { count(); return '='; } +"+" { count(); return '+'; } +"-" { count(); return '-'; } +"&" { count(); return '&'; } +"|" { count(); return '|'; } +"^" { count(); return '^'; } +"*" { count(); return '*'; } +"/" { count(); return '/'; } +"%" { count(); return '%'; } +"!" { count(); return '!'; } +"(" { count(); return '('; } +")" { count(); return ')'; } +"[" { count(); return '['; } +"]" { count(); return ']'; } +"{" { count(); return '{'; } +"}" { count(); BEGIN(0); return '}'; } +"," { count(); return ','; } +"." { count(); return '.'; } +"?" { count(); return '?'; } +":" { count(); return ':'; } +"~" { count(); return '~'; } + +\r?\n { count(); strcpy(szLine, yytext + 1); + countline(); yyless(1); } + +. SWF_error("Unrecognized character: %s\n", yytext); + +%% +static int getinput() { +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif +} + +int swf5wrap() +{ + return 1; +} + +static void countline() +{ + if(sLineNumber != 0) + msgline[column] = 0; + + ++sLineNumber; + column = 0; + msgline = msgbufs[sLineNumber & 1]; +} + +static int LineNumber(void) +{ + return (sLineNumber + 1); +} + +static int ColumnNumber(void) +{ + return column; +} + +static char *LineText(void) +{ + msgline[column] = 0; + return msgline; +} + +static void comment() +{ + // Handle block comments + + int c, c1; + +loop: + // We have the start of a comment so look skip everything up to the + // end of the comment character + while ((c = getinput()) != '*' && c != EOF) + { + if(column < 1023) + msgline[column] = c; + + ++column; + + // keep the line number in synch + if (c == '\n') + { + // start the output (matches the algorithim in the lexx above) + countline(); + } + + if (swf5debug) putchar(c); + } + + // is this the end of comment character + if ((c1 = getinput()) != '/' && c != EOF) + { + // false start as this was no end of comment + do_unput5(c1); + goto loop; + } + + // write out the start of the end of comment + if (c != EOF) + if (swf5debug) putchar(c); + + // write out the end of the end of comment + if (c1 != EOF) + if (swf5debug) putchar(c1); +} + +static void comment1() +{ + // Handle comment of type 1 (ie '//') + + int c; + + // this is a line comment + while ((c = getinput()) != '\n' && c != EOF) + { + if (swf5debug) putchar(c); + + if(column < 1023) + msgline[column] = c; + + ++column; + }; + + // keep the line number in synch + if (c == '\n') + { + if (swf5debug) putchar(c); + + countline(); + } +} + +static void count(void) +{ + int n; + + // Count the characters to maintain the current column position + if (yytext[0] == '\n') + { + if (swf5debug) printf("\n"); + } + else + { + if (swf5debug) printf("%s", yytext); + + for(n=0; n +#include +#include +#include "compile.h" +#include "action.h" +#include "assembler.h" + +#define YYPARSE_PARAM buffer + +Buffer bf, bc; + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 21 "swf5compiler.y" +{ + Buffer action; + char *str; + SWFGetUrl2Method getURLMethod; + int op; + int intVal; + int len; + double doubleVal; + + struct + { + Buffer buffer; + int count; + } exprlist; + struct switchcase switchcase; + struct switchcases switchcases; + struct + { + Buffer obj, ident, memexpr; + } lval; +} +/* Line 187 of yacc.c. */ +#line 407 "swf5compiler.tab.c" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 420 "swf5compiler.tab.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 5253 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 159 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 57 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 348 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 616 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 389 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 147, 2, 2, 2, 146, 139, 2, + 157, 158, 144, 142, 132, 143, 151, 145, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 136, 156, + 137, 133, 138, 135, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 152, 2, 153, 141, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 154, 140, 155, 148, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 134, 149, 150 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 4, 7, 8, 10, 13, 15, 17, + 19, 22, 25, 27, 31, 33, 36, 38, 40, 42, + 44, 46, 48, 50, 58, 61, 65, 67, 71, 79, + 85, 86, 88, 90, 98, 99, 102, 109, 114, 118, + 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, + 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, + 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, + 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, + 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, + 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, + 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, + 260, 262, 264, 266, 268, 270, 272, 274, 275, 277, + 281, 283, 290, 292, 296, 301, 303, 305, 307, 309, + 310, 311, 317, 324, 335, 344, 354, 355, 357, 360, + 363, 364, 367, 370, 373, 375, 377, 382, 385, 390, + 396, 401, 409, 417, 425, 433, 441, 446, 453, 468, + 472, 481, 486, 493, 497, 501, 505, 509, 513, 517, + 522, 527, 532, 537, 542, 547, 552, 556, 561, 566, + 571, 576, 581, 588, 597, 602, 603, 605, 609, 615, + 622, 630, 634, 636, 640, 642, 644, 646, 648, 650, + 652, 654, 656, 658, 660, 662, 664, 666, 668, 670, + 672, 674, 678, 683, 685, 688, 691, 694, 698, 702, + 706, 710, 714, 718, 722, 726, 730, 734, 738, 742, + 746, 750, 754, 758, 762, 766, 770, 776, 780, 784, + 786, 789, 795, 799, 801, 805, 807, 809, 811, 813, + 816, 819, 823, 826, 828, 831, 833, 835, 837, 839, + 841, 845, 849, 851, 852, 858, 861, 863, 865, 867, + 870, 873, 877, 881, 883, 886, 887, 892, 894, 896, + 898, 900, 902, 904, 906, 910, 911, 915, 917, 920, + 922, 924, 926, 928, 930, 932, 934, 936, 938, 940, + 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, + 962, 964, 966, 968, 970, 972, 974, 976, 978, 980, + 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, + 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018, 1020, + 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 1039 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 160, 0, -1, -1, 161, 162, -1, -1, 163, -1, + 162, 163, -1, 166, -1, 179, -1, 166, -1, 164, + 166, -1, 154, 155, -1, 165, -1, 154, 164, 155, + -1, 156, -1, 207, 156, -1, 170, -1, 185, -1, + 187, -1, 188, -1, 173, -1, 168, -1, 167, -1, + 20, 157, 202, 158, 154, 164, 155, -1, 18, 156, + -1, 18, 203, 156, -1, 207, -1, 169, 132, 207, + -1, 12, 157, 202, 158, 166, 6, 166, -1, 12, + 157, 202, 158, 166, -1, -1, 202, -1, 7, -1, + 172, 157, 202, 158, 154, 174, 155, -1, -1, 174, + 175, -1, 8, 202, 136, 164, 3, 156, -1, 8, + 202, 136, 164, -1, 9, 136, 164, -1, 109, -1, + 16, -1, 17, -1, 23, -1, 24, -1, 25, -1, + 26, -1, 27, -1, 28, -1, 29, -1, 30, -1, + 31, -1, 32, -1, 33, -1, 34, -1, 35, -1, + 36, -1, 37, -1, 38, -1, 39, -1, 40, -1, + 41, -1, 42, -1, 43, -1, 44, -1, 45, -1, + 46, -1, 47, -1, 48, -1, 49, -1, 50, -1, + 51, -1, 52, -1, 53, -1, 54, -1, 55, -1, + 56, -1, 57, -1, 58, -1, 59, -1, 60, -1, + 61, -1, 62, -1, 63, -1, 64, -1, 65, -1, + 66, -1, 67, -1, 68, -1, 69, -1, 70, -1, + 71, -1, 72, -1, 73, -1, 74, -1, 75, -1, + 76, -1, 77, -1, 78, -1, 79, -1, 80, -1, + 81, -1, 82, -1, 83, -1, 99, -1, 100, -1, + 84, -1, 85, -1, 86, -1, 87, -1, 88, -1, + 89, -1, 90, -1, 91, -1, 92, -1, 93, -1, + 94, -1, 95, -1, -1, 176, -1, 177, 132, 176, + -1, 5, -1, 178, 176, 157, 177, 158, 166, -1, + 176, -1, 202, 151, 176, -1, 202, 152, 202, 153, + -1, 192, -1, 195, -1, 13, -1, 14, -1, -1, + -1, 181, 157, 202, 158, 166, -1, 182, 166, 13, + 157, 202, 158, -1, 10, 157, 186, 156, 171, 156, + 186, 158, 183, 166, -1, 10, 157, 176, 11, 180, + 158, 184, 166, -1, 10, 157, 15, 176, 11, 180, + 158, 184, 166, -1, -1, 169, -1, 4, 156, -1, + 3, 156, -1, -1, 132, 93, -1, 132, 92, -1, + 132, 108, -1, 104, -1, 202, -1, 109, 157, 193, + 158, -1, 17, 109, -1, 17, 200, 151, 109, -1, + 17, 200, 152, 202, 153, -1, 28, 157, 203, 158, + -1, 32, 157, 202, 132, 202, 189, 158, -1, 94, + 157, 202, 132, 202, 189, 158, -1, 96, 157, 202, + 132, 190, 189, 158, -1, 95, 157, 202, 132, 202, + 189, 158, -1, 97, 157, 202, 132, 190, 189, 158, + -1, 98, 157, 202, 158, -1, 99, 157, 202, 132, + 202, 158, -1, 99, 157, 202, 132, 202, 132, 202, + 132, 202, 132, 202, 132, 202, 158, -1, 100, 157, + 158, -1, 82, 157, 202, 132, 202, 132, 202, 158, + -1, 83, 157, 202, 158, -1, 33, 157, 108, 132, + 108, 158, -1, 34, 157, 158, -1, 35, 157, 158, + -1, 36, 157, 158, -1, 37, 157, 158, -1, 39, + 157, 158, -1, 38, 157, 158, -1, 101, 157, 104, + 158, -1, 101, 157, 108, 158, -1, 101, 157, 202, + 158, -1, 102, 157, 108, 158, -1, 102, 157, 202, + 158, -1, 109, 157, 193, 158, -1, 22, 157, 202, + 158, -1, 24, 157, 158, -1, 23, 157, 202, 158, + -1, 25, 157, 203, 158, -1, 29, 157, 202, 158, + -1, 30, 157, 202, 158, -1, 31, 157, 202, 158, + -1, 26, 157, 202, 132, 202, 158, -1, 78, 157, + 202, 132, 202, 132, 202, 158, -1, 56, 157, 203, + 158, -1, -1, 203, -1, 193, 132, 203, -1, 178, + 157, 177, 158, 166, -1, 200, 151, 176, 157, 193, + 158, -1, 200, 152, 202, 153, 157, 193, 158, -1, + 176, 136, 203, -1, 196, -1, 197, 132, 196, -1, + 118, -1, 121, -1, 120, -1, 119, -1, 122, -1, + 123, -1, 124, -1, 134, -1, 128, -1, 129, -1, + 130, -1, 116, -1, 117, -1, 201, -1, 192, -1, + 195, -1, 176, -1, 200, 151, 176, -1, 200, 152, + 202, 153, -1, 204, -1, 143, 202, -1, 148, 202, + -1, 147, 202, -1, 202, 115, 202, -1, 202, 114, + 202, -1, 202, 144, 202, -1, 202, 145, 202, -1, + 202, 146, 202, -1, 202, 142, 202, -1, 202, 143, + 202, -1, 202, 139, 202, -1, 202, 140, 202, -1, + 202, 141, 202, -1, 202, 137, 202, -1, 202, 138, + 202, -1, 202, 111, 202, -1, 202, 112, 202, -1, + 202, 110, 202, -1, 202, 113, 202, -1, 202, 125, + 202, -1, 202, 126, 202, -1, 202, 127, 202, -1, + 202, 135, 202, 136, 202, -1, 201, 133, 203, -1, + 202, 57, 200, -1, 202, -1, 16, 176, -1, 16, + 176, 157, 193, 158, -1, 152, 193, 153, -1, 165, + -1, 154, 197, 155, -1, 192, -1, 194, -1, 195, + -1, 200, -1, 199, 201, -1, 201, 199, -1, 157, + 202, 158, -1, 143, 104, -1, 104, -1, 143, 105, + -1, 105, -1, 106, -1, 103, -1, 108, -1, 206, + -1, 205, 132, 206, -1, 176, 133, 203, -1, 176, + -1, -1, 21, 154, 208, 209, 155, -1, 15, 205, + -1, 191, -1, 192, -1, 195, -1, 199, 201, -1, + 201, 199, -1, 201, 133, 203, -1, 201, 198, 202, + -1, 214, -1, 209, 214, -1, -1, 20, 211, 209, + 19, -1, 108, -1, 104, -1, 105, -1, 106, -1, + 103, -1, 107, -1, 212, -1, 213, 132, 212, -1, + -1, 43, 215, 213, -1, 210, -1, 44, 107, -1, + 45, -1, 18, -1, 46, -1, 47, -1, 48, -1, + 49, -1, 50, -1, 51, -1, 52, -1, 53, -1, + 54, -1, 55, -1, 56, -1, 57, -1, 58, -1, + 17, -1, 16, -1, 60, -1, 59, -1, 61, -1, + 62, -1, 63, -1, 64, -1, 65, -1, 15, -1, + 66, -1, 67, -1, 68, -1, 69, -1, 70, -1, + 71, -1, 72, -1, 73, -1, 74, -1, 75, -1, + 76, -1, 77, -1, 78, -1, 29, -1, 40, -1, + 41, -1, 42, -1, 79, -1, 80, -1, 81, -1, + 26, -1, 82, -1, 83, -1, 28, -1, 84, -1, + 23, -1, 85, -1, 30, -1, 31, -1, 24, -1, + 86, -1, 87, -1, 88, -1, 89, 108, -1, 90, + 108, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 152, 152, 152, 160, 164, 165, 169, 171, 176, + 179, 185, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 203, 214, 224, 236, 237, 241, 252, + 262, 263, 267, 272, 286, 289, 297, 302, 307, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 399, 402, 407, + 414, 419, 433, 438, 444, 449, 451, 455, 460, 466, + 471, 475, 488, 501, 536, 569, 603, 604, 610, 621, + 634, 636, 638, 640, 647, 654, 662, 670, 676, 683, + 690, 694, 701, 708, 715, 722, 729, 735, 742, 753, + 758, 766, 770, 780, 784, 788, 792, 796, 800, 804, + 810, 817, 823, 830, 839, 846, 850, 854, 858, 862, + 866, 870, 874, 879, 885, 894, 897, 902, 911, 924, + 932, 941, 948, 952, 958, 959, 960, 961, 962, 963, + 964, 965, 966, 967, 968, 972, 973, 991, 1009, 1010, + 1015, 1022, 1028, 1037, 1039, 1044, 1049, 1053, 1062, 1072, + 1077, 1082, 1087, 1092, 1097, 1102, 1107, 1112, 1117, 1122, + 1128, 1133, 1137, 1142, 1146, 1150, 1154, 1164, 1191, 1199, + 1201, 1207, 1213, 1218, 1223, 1231, 1233, 1235, 1237, 1239, + 1284, 1329, 1332, 1336, 1340, 1344, 1348, 1352, 1356, 1363, + 1365, 1371, 1377, 1385, 1384, 1389, 1392, 1394, 1398, 1402, + 1441, 1480, 1501, 1546, 1547, 1552, 1551, 1559, 1562, 1565, + 1568, 1571, 1573, 1580, 1581, 1585, 1585, 1591, 1593, 1600, + 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, 1620, + 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1640, + 1642, 1644, 1646, 1648, 1650, 1654, 1655, 1656, 1657, 1658, + 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, + 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, + 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1688, 1692 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "BREAK", "CONTINUE", "FUNCTION", "ELSE", + "SWITCH", "CASE", "DEFAULT", "FOR", "IN", "IF", "WHILE", "DO", "VAR", + "NEW", "DELETE", "RETURN", "END", "WITH", "ASM", "EVAL", "RANDOM", + "GETTIMER", "LENGTH", "CONCAT", "SUBSTR", "TRACE", "INT", "ORD", "CHR", + "GETURL", "GETURL1", "NEXTFRAME", "PREVFRAME", "PLAY", "STOP", + "TOGGLEQUALITY", "STOPSOUNDS", "DUP", "SWAP", "POP", "PUSH", + "SETREGISTER", "CALLFUNCTION", "CALLMETHOD", "AND", "OR", "XOR", + "MODULO", "ADD", "LESSTHAN", "EQUALS", "INC", "DEC", "TYPEOF", + "INSTANCEOF", "ENUMERATE", "INITOBJECT", "INITARRAY", "GETMEMBER", + "SETMEMBER", "SHIFTLEFT", "SHIFTRIGHT", "SHIFTRIGHT2", "VAREQUALS", + "OLDADD", "SUBTRACT", "MULTIPLY", "DIVIDE", "OLDEQUALS", "OLDLESSTHAN", + "LOGICALAND", "LOGICALOR", "NOT", "STRINGEQ", "STRINGLENGTH", + "SUBSTRING", "GETVARIABLE", "SETVARIABLE", "SETTARGETEXPRESSION", + "DUPLICATEMOVIECLIP", "REMOVEMOVIECLIP", "STRINGLESSTHAN", "MBLENGTH", + "MBSUBSTRING", "MBORD", "MBCHR", "BRANCHALWAYS", "BRANCHIFTRUE", + "GETURL2", "POST", "GET", "LOADVARIABLES", "LOADMOVIE", + "LOADVARIABLESNUM", "LOADMOVIENUM", "CALLFRAME", "STARTDRAG", "STOPDRAG", + "GOTOFRAME", "SETTARGET", "NULLVAL", "INTEGER", "DOUBLE", "BOOLEAN", + "REGISTER", "STRING", "IDENTIFIER", "\"==\"", "\"<=\"", "\">=\"", + "\"!=\"", "\"&&\"", "\"||\"", "\"++\"", "\"--\"", "\"+=\"", "\"/=\"", + "\"*=\"", "\"-=\"", "\"%=\"", "\"&=\"", "\"|=\"", "\"<<\"", "\">>\"", + "\">>>\"", "\"<<=\"", "\">>=\"", "\">>>=\"", "NOELSE", "','", "'='", + "\"^=\"", "'?'", "':'", "'<'", "'>'", "'&'", "'|'", "'^'", "'+'", "'-'", + "'*'", "'/'", "'%'", "'!'", "'~'", "UMINUS", "POSTFIX", "'.'", "'['", + "']'", "'{'", "'}'", "';'", "'('", "')'", "$accept", "program", "@1", + "code", "anycode", "stmts", "emptybraces", "stmt", "with_stmt", + "return_stmt", "assign_stmts", "if_stmt", "expr_opt", "switch_init", + "switch_stmt", "switch_cases", "switch_case", "identifier", + "formals_list", "function_init", "function_decl", "obj_ref", + "while_init", "do_init", "for_init", "for_in_init", "iter_stmt", + "assign_stmts_opt", "cont_stmt", "break_stmt", "urlmethod", "level", + "void_function_call", "function_call", "expr_list", "anon_function_decl", + "method_call", "objexpr", "objexpr_list", "assignop", "incdecop", + "lvalue_expr", "lvalue", "expr", "expr_or_obj", "primary", "init_vars", + "init_var", "assign_stmt", "@2", "opcode_list", "with", "@3", + "push_item", "push_list", "opcode", "@4", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 44, 61, 387, 63, 58, 60, 62, 38, + 124, 94, 43, 45, 42, 47, 37, 33, 126, 388, + 389, 46, 91, 93, 123, 125, 59, 40, 41 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 159, 161, 160, 160, 162, 162, 163, 163, 164, + 164, 165, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 167, 168, 168, 169, 169, 170, 170, + 171, 171, 172, 173, 174, 174, 175, 175, 175, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, + 178, 179, 180, 180, 180, 180, 180, 181, 182, 183, + 184, 185, 185, 185, 185, 185, 186, 186, 187, 188, + 189, 189, 189, 189, 190, 190, 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, 192, 192, 192, 192, 192, 192, + 192, 192, 192, 192, 192, 193, 193, 193, 194, 195, + 195, 196, 197, 197, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 199, 199, 200, 200, 200, + 201, 201, 201, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 203, + 203, 203, 203, 203, 203, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, + 205, 206, 206, 208, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 209, 209, 211, 210, 212, 212, 212, + 212, 212, 212, 213, 213, 215, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 0, 2, 0, 1, 2, 1, 1, 1, + 2, 2, 1, 3, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 7, 2, 3, 1, 3, 7, 5, + 0, 1, 1, 7, 0, 2, 6, 4, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 3, + 1, 6, 1, 3, 4, 1, 1, 1, 1, 0, + 0, 5, 6, 10, 8, 9, 0, 1, 2, 2, + 0, 2, 2, 2, 1, 1, 4, 2, 4, 5, + 4, 7, 7, 7, 7, 7, 4, 6, 14, 3, + 8, 4, 6, 3, 3, 3, 3, 3, 3, 4, + 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, + 4, 4, 6, 8, 4, 0, 1, 3, 5, 6, + 7, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 4, 1, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 5, 3, 3, 1, + 2, 5, 3, 1, 3, 1, 1, 1, 1, 2, + 2, 3, 2, 1, 2, 1, 1, 1, 1, 1, + 3, 3, 1, 0, 5, 2, 1, 1, 1, 2, + 2, 3, 3, 1, 2, 0, 4, 1, 1, 1, + 1, 1, 1, 1, 3, 0, 3, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 2, 0, 0, 1, 0, 0, 120, 32, 0, 0, + 127, 128, 0, 40, 41, 0, 0, 0, 0, 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, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 0, 0, 0, 103, 104, 0, 0, 39, + 205, 206, 0, 14, 3, 5, 12, 7, 22, 21, + 16, 0, 20, 210, 0, 8, 0, 0, 17, 18, + 19, 266, 267, 268, 0, 0, 207, 0, 139, 138, + 136, 0, 41, 42, 43, 44, 45, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 75, + 97, 101, 102, 115, 116, 103, 104, 39, 262, 265, + 259, 147, 208, 209, 0, 207, 40, 257, 253, 255, + 256, 258, 39, 0, 0, 0, 185, 0, 24, 0, + 243, 0, 208, 246, 209, 0, 248, 207, 239, 0, + 213, 0, 263, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 11, 0, 9, 6, 0, 0, + 0, 0, 269, 0, 0, 194, 197, 196, 195, 198, + 199, 200, 202, 203, 204, 0, 201, 0, 270, 15, + 0, 137, 210, 0, 26, 0, 0, 0, 185, 0, + 0, 240, 252, 254, 214, 216, 215, 0, 186, 0, + 192, 0, 0, 117, 249, 0, 250, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 163, 164, 165, 166, 168, 167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 159, 253, + 258, 0, 258, 0, 0, 13, 10, 0, 117, 0, + 0, 211, 0, 271, 272, 262, 0, 0, 30, 0, + 261, 260, 0, 39, 0, 185, 0, 242, 0, 0, + 244, 251, 118, 0, 237, 238, 231, 229, 230, 232, + 218, 217, 233, 234, 235, 0, 227, 228, 224, 225, + 226, 222, 223, 219, 220, 221, 0, 313, 305, 304, + 290, 275, 339, 343, 334, 337, 327, 341, 342, 328, + 329, 330, 285, 0, 289, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 307, 306, + 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 331, 332, + 333, 335, 336, 338, 340, 344, 345, 346, 0, 0, + 0, 287, 273, 175, 177, 178, 0, 150, 179, 180, + 181, 0, 0, 184, 0, 0, 161, 0, 0, 0, + 0, 156, 0, 169, 170, 171, 172, 173, 146, 0, + 0, 0, 0, 185, 212, 0, 27, 210, 0, 208, + 209, 0, 0, 31, 29, 174, 149, 0, 187, 191, + 193, 0, 0, 0, 0, 0, 0, 288, 347, 348, + 264, 274, 0, 140, 0, 0, 0, 140, 140, 253, + 140, 145, 140, 0, 34, 0, 131, 0, 0, 185, + 0, 130, 0, 0, 136, 0, 241, 119, 188, 236, + 0, 0, 281, 278, 279, 280, 282, 277, 283, 286, + 182, 0, 0, 162, 0, 0, 0, 0, 0, 0, + 0, 157, 0, 121, 132, 189, 0, 130, 0, 123, + 0, 0, 28, 23, 276, 0, 142, 141, 143, 151, + 0, 0, 152, 154, 153, 155, 0, 0, 0, 33, + 35, 190, 0, 134, 124, 129, 284, 183, 160, 0, + 0, 0, 135, 0, 0, 0, 38, 133, 0, 37, + 0, 0, 0, 139, 0, 158 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 1, 2, 104, 105, 225, 106, 226, 108, 109, + 251, 110, 492, 111, 112, 562, 590, 113, 363, 181, + 115, 488, 116, 117, 603, 568, 118, 253, 119, 120, + 552, 520, 121, 182, 267, 183, 184, 270, 271, 247, + 185, 186, 187, 188, 268, 190, 159, 160, 127, 300, + 450, 451, 505, 548, 549, 452, 506 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -496 +static const yytype_int16 yypact[] = +{ + 17, 30, 908, -496, -136, -123, -496, -496, -126, -105, + -496, -496, 4178, -496, 4003, 1907, -101, -120, -88, -80, + -75, -72, -65, -496, -62, -50, -43, -40, -38, -31, + -30, -28, -27, -25, -24, -21, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -20, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -18, -496, -496, -496, -17, -16, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -15, -11, -8, -5, 5, 6, 7, 8, 9, 22, + -496, -496, 1165, -496, 908, -496, -496, -496, -496, -496, + -496, 23, -496, -496, 4178, -496, 24, 1627, -496, -496, + -496, -496, -125, -97, 4091, -78, -58, -57, -496, -496, + 3137, 2190, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, 49, -96, + -496, -71, -496, -496, -64, -496, 4178, -496, -496, -496, + -496, -496, 27, 2326, 2190, 2190, 2051, 3002, -496, 2190, + -496, 37, -496, -496, -496, 4091, -78, -49, 4896, -47, + -496, 2190, -496, 2190, 2190, -3, 2051, 2190, 2051, 2190, + 2190, 2190, 2190, 45, 40, 42, 47, 48, 51, 52, + 2051, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, + 53, 2462, 2598, 2051, -496, 1319, -496, -496, 2190, 39, + 2190, 143, -54, 4178, 2190, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, 2051, -496, 2190, -496, -496, + 4178, 69, 174, 46, -496, 331, 2051, 4178, 2051, 4265, + 2190, 50, -496, -496, 146, 146, 146, -103, -496, 76, + -496, -113, 576, 4178, -54, 2051, -496, 4091, 2190, 2190, + 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, + 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, -496, 750, + 5163, 962, 999, -496, 55, 688, 56, 2850, 3280, 3317, + 4304, 86, -496, -496, -496, -496, -496, -496, 58, 4341, + 4378, 3354, 4415, 4452, 4489, 4526, 3391, 4563, -496, 61, + 62, 3428, 64, 3465, -119, -496, -496, 3502, 4178, 3539, + 68, 70, 3761, -496, 4896, -9, 3234, 2190, 2190, 1627, + -496, -496, -118, -121, 3798, 2051, 2051, -496, 2051, 4178, + -496, -496, -496, -117, -496, -78, 4955, 192, 192, 4955, + 4933, 4933, 26, 26, 26, 4600, 192, 192, 32, 32, + 32, -33, -33, 146, 146, 146, 75, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, 123, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, + -496, -496, -496, -496, -496, -496, -496, -496, 124, 125, + 2869, -496, -496, -496, -496, -496, 2190, -496, -496, -496, + -496, 2190, 127, -496, 2190, 2190, -496, 2190, 2190, 2734, + 2734, -496, 2190, -496, -496, -496, -496, -496, -48, 77, + -114, 1627, 2190, 2051, 80, 2190, -496, 82, 83, 88, + 89, 3872, 94, 4896, 236, -496, -61, -111, -496, -496, + -496, 4178, 1627, 2190, 1627, 5163, 84, -496, -496, -496, + -496, -496, 3576, 4637, 96, 4674, 4711, 4637, 4637, -110, + 112, 4896, 112, 289, -496, 1627, -496, 3613, -109, 2051, + 97, -496, 4178, 2190, 3234, 1627, -496, -496, -496, 4896, + 1473, 5087, -496, -496, -496, -496, -496, -496, -496, 120, + -496, -14, 98, -496, 2190, 2190, 99, 101, 102, 103, + 2190, -496, -4, -496, -496, -496, -107, -496, 1627, -496, + 3835, 104, -496, -496, -496, 84, -496, -496, -496, -496, + 3650, 3687, -496, -496, -496, -496, 4748, 2190, 128, -496, + -496, -496, 1627, -496, -496, -496, -496, -496, -496, 2190, + 4785, 1627, -496, 1627, 4822, 1627, 1627, -496, 2190, 1772, + 4859, 109, 2190, -1, 3724, -496 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -496, -496, -496, -496, 162, -495, 28, 44, -496, -496, + -496, -496, -496, -496, -496, -496, -496, 20, -66, 4, + -496, -211, -496, -496, -496, -289, -496, -254, -496, -496, + -397, -189, -496, -2, -220, -496, 14, -77, -496, -496, + 141, 43, 91, 562, 38, -496, -496, 31, -129, -496, + -218, -496, -496, -290, -496, -440, -496 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -213 +static const yytype_int16 yytable[] = +{ + 122, 254, 485, 334, 587, 588, 114, -36, -36, 540, + 511, -148, 162, 356, 356, 501, 123, -4, 501, 359, + 128, 356, -144, 356, 277, 356, -208, -208, 163, 356, + 3, 130, 158, 129, 192, -148, 257, -148, 352, 478, + 495, 502, 360, 180, 525, 125, 107, 536, -144, 565, + 357, 591, 131, 189, -209, -209, 191, 164, 100, 101, + 235, 236, 237, 238, 239, 240, 241, 100, 101, 193, + 242, 243, 244, 233, 234, 245, 246, 194, 576, 577, + -39, -39, 195, 277, 275, 196, 258, 259, 260, 277, + -212, -212, 197, 126, 578, 198, 529, -207, -207, 249, + 122, 511, 122, -174, -174, 165, 606, 199, 114, 298, + 609, 295, 296, 297, 200, 122, 123, 201, 123, 202, + 556, 557, 162, 558, 256, 559, 203, 204, 122, 205, + 206, 123, 207, 208, 229, 497, 209, 210, 163, 211, + 212, 213, 214, 124, 123, 125, 215, 125, 107, 216, + 252, 589, 217, 311, -36, 303, 340, 284, 285, 286, + 125, 231, 218, 219, 220, 221, 222, 125, 293, 294, + 295, 296, 297, 125, 293, 294, 295, 296, 297, 223, + 228, 230, 256, 162, 258, 347, 261, 542, 543, 544, + 545, 546, 547, 126, 273, 126, 338, 269, 312, 163, + 313, 346, 348, 277, 180, 314, 315, 355, 126, 316, + 317, 328, 358, 455, 457, 232, 463, 486, 462, 473, + 474, 126, 476, 122, 180, 482, 180, 483, 125, 504, + 507, 524, 508, 509, 304, 514, 306, 529, 180, 123, + -122, 531, 535, 124, 551, 124, -125, -126, 318, 277, + 534, 180, 575, 341, 553, 567, 579, 582, 124, 583, + 584, 585, 595, 528, 601, 613, 227, 248, 125, 336, + 345, 124, 480, 180, 530, 162, 274, 158, 592, 341, + 571, 522, 500, 343, 180, 596, 180, 541, 351, 0, + 0, 163, 0, 362, 350, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 566, + 0, 0, 0, 364, 0, 0, 126, 284, 285, 286, + 365, 0, 0, 0, 0, 0, 0, 0, 276, 0, + 0, 290, 291, 292, 293, 294, 295, 296, 297, 0, + 0, 0, 0, 0, 122, 489, 277, 122, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, + 123, 490, 0, 123, 0, 0, 124, 487, 165, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 180, 180, 0, 180, 0, 277, 125, + 0, 0, 125, 494, 498, 0, 499, 0, 0, 278, + 279, 280, 281, 282, 283, 254, 0, 0, 0, 0, + 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, + 0, 560, 0, 0, 287, 0, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 0, 126, 0, 0, + 126, 278, 279, 280, 281, 282, 283, 561, 0, 0, + 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, + 0, 0, 0, 0, 0, 0, 287, 0, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 0, 122, + 0, 0, 0, 489, 0, 0, 0, 124, 0, 349, + 124, 0, 0, 0, 0, 123, 0, 0, 0, 490, + 122, 0, 122, 0, 0, 487, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 123, 0, 123, 0, + 0, 537, 0, 122, 125, 526, 0, 0, 0, 0, + 0, 0, 122, 122, 0, 0, 0, 0, 122, 123, + 0, 0, 0, 0, 0, 125, 538, 125, 123, 123, + 0, 0, 569, 0, 123, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 0, 0, 122, 0, 125, 563, + 0, 0, 126, 0, 0, 0, 0, 125, 125, 572, + 0, 0, 123, 125, 336, 0, 0, 0, 0, 0, + 122, 0, 0, 126, 0, 126, 0, 0, 0, 122, + 0, 122, 0, 122, 122, 0, 123, 122, 0, 0, + 0, 125, 593, 0, 0, 123, 126, 123, 0, 123, + 123, 0, 124, 123, 0, 126, 126, 0, 0, 0, + 0, 126, 0, 277, 0, 125, 602, 0, 0, 0, + 0, 0, 0, 124, 125, 124, 125, 607, 125, 125, + 336, 0, 125, 336, 0, 0, 0, 0, 0, 126, + 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, + 0, 0, 0, 0, 0, 124, 124, 0, 0, 0, + 0, 124, 0, 126, 0, 0, 278, 279, 280, 281, + 282, 283, 126, 255, 126, 0, 126, 126, 0, 0, + 126, 284, 285, 286, 0, 0, 0, 0, 0, 124, + 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 124, 361, 264, 265, 266, 0, 0, + 0, 272, 124, 0, 124, 277, 124, 124, 0, 0, + 124, 0, 0, 299, 0, 301, 302, 0, 0, 305, + 0, 307, 308, 309, 310, 0, 0, 0, 0, 0, + 0, 0, 0, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 0, 331, 333, 0, 0, 0, 0, 0, + 337, 0, 339, 0, 0, 0, 342, 0, 278, 279, + 280, 281, 282, 283, 0, 0, 0, 277, 0, 344, + 0, 0, 0, 284, 285, 286, 0, 0, 0, 0, + 456, 0, 354, 287, 0, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 0, 0, 0, 0, 0, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 491, + 493, 4, 5, 6, 0, 7, 0, 0, 8, 0, + 9, 10, 11, 12, 13, 14, 15, 0, 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, 0, 0, 0, 0, 0, 0, 99, 512, 277, + 0, 0, 0, 513, 100, 101, 515, 516, 0, 517, + 518, 521, 521, 0, 523, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 527, 0, 0, 491, 0, 0, + 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, + 0, 0, 102, 0, 103, 539, 0, 0, 0, 0, + 0, 0, 278, 279, 280, 281, 282, 283, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, + 0, 0, 0, 0, 0, 570, 0, 287, 0, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, + 279, 280, 281, 282, 283, 0, 580, 581, 0, 0, + 453, 0, 586, 0, 284, 285, 286, 0, 0, 0, + 0, 0, 0, 0, 287, 0, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 0, 0, 0, 600, + 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, + 0, 604, 0, 0, 0, 0, 0, 0, 4, 5, + 610, 0, 7, 0, 614, 8, 0, 9, 10, 11, + 12, 13, 14, 15, 0, 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, 0, 0, + 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, + 0, 100, 101, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 224, 103, 4, 5, 0, 0, 7, 0, 0, 8, + 0, 9, 10, 11, 12, 13, 14, 15, 0, 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, 0, 0, 0, 0, 0, 0, 99, 0, + 0, 0, 0, 0, 0, 100, 101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 335, 103, 4, 5, 0, 0, + 7, 0, 0, 8, 0, 9, 10, 11, 12, 13, + 14, 15, 0, 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, 0, 0, 0, 0, + 0, 0, 99, 0, 0, 0, 0, 0, 0, 100, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 102, 573, 103, + 4, 5, 0, 0, 7, 0, 0, 8, 0, 9, + 10, 11, 12, 13, 14, 15, 0, 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, + 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 100, 101, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 611, 5, 0, 0, 7, + 0, 102, 8, 103, 9, 10, 11, 12, 13, 14, + 15, 0, 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, 0, 0, 0, 0, 0, + 0, 99, 0, 0, 0, 0, 0, 0, 100, 101, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 166, 132, 0, 102, 0, 103, 18, + 19, 20, 21, 22, 23, 137, 25, 26, 27, 141, + 142, 143, 144, 145, 146, 147, 148, 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, 151, + 152, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 153, 154, 0, 0, 0, 155, 156, 0, 0, + 167, 168, 169, 170, 0, 171, 172, 0, 0, 0, + 0, 0, 0, 100, 101, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 173, 0, 0, 0, 174, 175, 6, 0, 0, 176, + 0, 177, 0, 178, 179, 0, 0, 166, 132, 0, + 0, 0, 0, 18, 19, 20, 21, 22, 23, 137, + 25, 26, 27, 141, 142, 143, 144, 145, 146, 147, + 148, 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, 151, 152, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 153, 154, 0, 0, 0, + 155, 156, 0, 0, 167, 168, 169, 170, 0, 171, + 172, 0, 0, 0, 0, 0, 0, 100, 101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 173, 6, 0, 0, 174, 175, + 0, 0, 0, 176, 0, 177, 13, 132, 179, 0, + 0, 0, 18, 19, 20, 21, 22, 23, 137, 25, + 26, 27, 141, 142, 143, 144, 145, 146, 147, 148, + 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, 151, 152, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 153, 154, 0, 0, 0, 155, + 156, 0, 0, 167, 168, 169, 170, 0, 171, 172, + 0, 0, 0, 0, 0, 0, 100, 101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 173, 0, 0, 0, 174, 175, 0, + 0, 0, 13, 132, 0, 0, 0, 179, 18, 19, + 20, 21, 22, 23, 137, 25, 26, 27, 141, 142, + 143, 144, 145, 146, 147, 148, 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, 151, 152, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 153, 154, 0, 0, 0, 155, 156, 0, 0, 167, + 262, 263, 170, 0, 171, 172, 0, 0, 0, 0, + 0, 0, 100, 101, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 173, + 0, 0, 0, 174, 175, 0, 0, 0, 13, 132, + 0, 0, 0, 179, 18, 19, 20, 21, 22, 23, + 137, 25, 26, 27, 141, 142, 143, 144, 145, 146, + 147, 148, 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, 151, 152, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 153, 154, 0, 0, + 0, 155, 156, 0, 0, 167, 329, 169, 170, 0, + 330, 172, 0, 0, 0, 0, 0, 0, 100, 101, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 0, 173, 0, 0, 0, 174, + 175, 0, 0, 0, 13, 132, 0, 0, 0, 179, + 18, 19, 20, 21, 22, 23, 137, 25, 26, 27, + 141, 142, 143, 144, 145, 146, 147, 148, 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, + 151, 152, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 153, 154, 0, 0, 0, 155, 156, 0, + 0, 167, 168, 169, 170, 0, 332, 172, 0, 0, + 0, 0, 0, 0, 100, 101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 0, 173, 0, 0, 0, 174, 175, 0, 0, 0, + 13, 132, 0, 0, 0, 179, 18, 19, 20, 21, + 22, 23, 137, 25, 26, 27, 141, 142, 143, 144, + 145, 146, 147, 148, 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, 151, 152, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 153, 154, + 0, 0, 0, 155, 156, 0, 0, 167, 519, 169, + 170, 0, 171, 172, 0, 0, 0, 0, 0, 0, + 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, + 0, 174, 175, 0, 387, 388, 389, 390, 0, 391, + 0, 179, 392, 393, 0, 394, 0, 395, 396, 397, + 398, 0, 0, 0, 0, 0, 0, 277, 0, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 132, + 0, 0, 0, 0, 510, 133, 134, 135, 136, 23, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 149, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 150, 75, 76, 77, 151, 152, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 153, 154, 0, 0, + 0, 155, 156, 0, 0, 0, 0, 0, 0, 0, + 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 250, 13, 14, 0, 0, 224, 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, + 0, 0, 0, 0, 0, 0, 99, 0, 0, 12, + 13, 14, 0, 100, 101, 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, 277, 0, 0, + 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, + 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, + 0, 277, 0, 0, 0, 287, 0, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 278, 279, 280, + 281, 282, 283, 0, 0, 0, 0, 0, 459, 0, + 0, 0, 284, 285, 286, 0, 0, 0, 277, 0, + 0, 0, 287, 0, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 278, 279, 280, 281, 282, 283, + 0, 0, 0, 0, 0, 460, 0, 0, 0, 284, + 285, 286, 0, 0, 0, 277, 0, 0, 0, 287, + 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, + 0, 0, 466, 0, 0, 0, 284, 285, 286, 0, + 0, 0, 277, 0, 0, 0, 287, 0, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, + 280, 281, 282, 283, 0, 0, 0, 0, 0, 471, + 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, + 0, 0, 0, 287, 0, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, + 283, 0, 0, 0, 0, 0, 475, 0, 0, 0, + 284, 285, 286, 0, 0, 0, 277, 0, 0, 0, + 287, 0, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 278, 279, 280, 281, 282, 283, 0, 0, + 0, 0, 0, 477, 0, 0, 0, 284, 285, 286, + 0, 0, 0, 277, 0, 0, 0, 287, 0, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, + 279, 280, 281, 282, 283, 0, 0, 0, 0, 0, + 479, 0, 0, 0, 284, 285, 286, 0, 0, 0, + 277, 0, 0, 0, 287, 0, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 278, 279, 280, 281, + 282, 283, 0, 0, 0, 0, 0, 481, 0, 0, + 0, 284, 285, 286, 0, 0, 0, 277, 0, 0, + 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 278, 279, 280, 281, 282, 283, 0, + 0, 0, 0, 0, 550, 0, 0, 0, 284, 285, + 286, 0, 0, 0, 277, 0, 0, 0, 287, 0, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, + 0, 564, 0, 0, 0, 284, 285, 286, 0, 0, + 0, 277, 0, 0, 0, 287, 0, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 278, 279, 280, + 281, 282, 283, 0, 0, 0, 0, 0, 597, 0, + 0, 0, 284, 285, 286, 0, 0, 0, 277, 0, + 0, 0, 287, 0, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 278, 279, 280, 281, 282, 283, + 0, 0, 0, 0, 0, 598, 0, 0, 0, 284, + 285, 286, 0, 0, 0, 277, 0, 0, 0, 287, + 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, + 0, 0, 615, 0, 0, 0, 284, 285, 286, 0, + 0, 0, 277, 0, 0, 0, 287, 0, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, + 280, 281, 282, 283, 484, 0, 0, 0, 0, 0, + 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, + 0, 0, 0, 287, 0, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, + 283, 496, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 285, 286, 0, 0, 0, 0, 0, 0, 0, + 287, 0, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 278, 279, 280, 281, 282, 283, 594, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, + 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 13, + 132, 0, 0, 532, 533, 18, 19, 20, 21, 22, + 23, 137, 25, 26, 27, 141, 142, 143, 144, 145, + 146, 147, 148, 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, 151, 152, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 153, 154, 0, + 0, 0, 155, 156, 0, 0, 0, 13, 132, 0, + 0, 0, 161, 18, 19, 20, 21, 22, 23, 137, + 25, 26, 27, 141, 142, 143, 144, 145, 146, 147, + 148, 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, 151, 152, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 153, 154, 0, 0, 0, + 155, 156, 0, 0, 13, 132, 0, 0, 0, 0, + 172, 133, 134, 135, 136, 23, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 149, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 150, 75, 76, 77, + 151, 152, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 153, 154, 0, 0, 0, 155, 156, 0, + 0, 13, 132, 0, 0, 0, 0, 157, 133, 134, + 135, 136, 23, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 149, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 150, 75, 76, 77, 151, 152, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 153, + 154, 277, 0, 0, 155, 156, 0, 0, 0, 0, + 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 278, 279, 280, 281, 282, 283, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, + 285, 286, 0, 0, 0, 277, 461, 0, 0, 287, + 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, + 0, 0, 277, 464, 0, 0, 287, 0, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, + 280, 281, 282, 283, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, + 465, 0, 0, 287, 0, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 285, 286, 0, 0, 0, 277, 467, 0, 0, + 287, 0, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 278, 279, 280, 281, 282, 283, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, + 0, 0, 0, 277, 468, 0, 0, 287, 0, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, + 279, 280, 281, 282, 283, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, + 277, 469, 0, 0, 287, 0, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 278, 279, 280, 281, + 282, 283, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 284, 285, 286, 0, 0, 0, 277, 470, 0, + 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 278, 279, 280, 281, 282, 283, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 284, 285, + 286, 0, 0, 0, 277, 472, 0, 0, 287, 0, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, + 0, 277, 0, 0, 0, 287, 503, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 278, 279, 280, + 281, 282, 283, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 285, 286, 0, 0, 0, 277, 551, + 0, 0, 287, 0, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 278, 279, 280, 281, 282, 283, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, + 285, 286, 0, 0, 0, 277, 554, 0, 0, 287, + 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, + 0, 0, 277, 555, 0, 0, 287, 0, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, + 280, 281, 282, 283, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, + 599, 0, 0, 287, 0, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 285, 286, 0, 0, 0, 277, 0, 0, 0, + 287, 605, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 278, 279, 280, 281, 282, 283, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, + 0, 0, 0, 277, 608, 0, 0, 287, 0, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, + 279, 280, 281, 282, 283, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, + 277, 612, 0, 0, 287, 0, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 278, 279, 280, 281, + 282, 283, 277, 0, 0, 0, 0, 0, 0, 0, + 0, 284, 285, 286, 0, 0, 0, 0, 0, 0, + 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 278, 279, 280, 281, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 284, 285, + 286, 0, 0, 0, 0, 0, 279, 280, 0, 0, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 284, 285, 286, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 387, 388, 389, 390, 574, 391, 0, 0, + 392, 393, 0, 394, 0, 395, 396, 397, 398, 0, + 0, 0, 0, 0, 0, 0, 0, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 387, 388, + 389, 390, 0, 391, 0, 0, 392, 393, 0, 394, + 0, 395, 396, 397, 398, 0, 0, 0, 0, 0, + 0, 0, 0, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449 +}; + +static const yytype_int16 yycheck[] = +{ + 2, 130, 11, 223, 8, 9, 2, 8, 9, 504, + 450, 132, 14, 132, 132, 132, 2, 0, 132, 132, + 156, 132, 132, 132, 57, 132, 151, 152, 14, 132, + 0, 157, 12, 156, 154, 156, 132, 158, 258, 158, + 158, 158, 155, 15, 158, 2, 2, 158, 158, 158, + 153, 158, 157, 15, 151, 152, 157, 14, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 116, 117, 157, + 128, 129, 130, 151, 152, 133, 134, 157, 92, 93, + 151, 152, 157, 57, 133, 157, 157, 151, 152, 57, + 151, 152, 157, 2, 108, 157, 157, 151, 152, 156, + 102, 541, 104, 151, 152, 14, 601, 157, 104, 156, + 605, 144, 145, 146, 157, 117, 102, 157, 104, 157, + 517, 518, 124, 520, 133, 522, 157, 157, 130, 157, + 157, 117, 157, 157, 114, 355, 157, 157, 124, 157, + 157, 157, 157, 2, 130, 102, 157, 104, 104, 157, + 130, 155, 157, 108, 155, 158, 13, 125, 126, 127, + 117, 117, 157, 157, 157, 157, 157, 124, 142, 143, + 144, 145, 146, 130, 142, 143, 144, 145, 146, 157, + 157, 157, 133, 185, 157, 11, 166, 103, 104, 105, + 106, 107, 108, 102, 157, 104, 157, 177, 158, 185, + 158, 132, 156, 57, 176, 158, 158, 157, 117, 158, + 158, 158, 136, 158, 158, 124, 158, 346, 132, 158, + 158, 130, 158, 225, 196, 157, 198, 157, 185, 154, + 107, 154, 108, 108, 196, 108, 198, 157, 210, 225, + 158, 158, 6, 102, 132, 104, 158, 158, 210, 57, + 156, 223, 132, 233, 158, 158, 158, 158, 117, 158, + 158, 158, 158, 483, 136, 156, 104, 126, 225, 225, + 250, 130, 338, 245, 485, 277, 185, 257, 567, 259, + 534, 470, 359, 245, 256, 575, 258, 505, 257, -1, + -1, 277, -1, 273, 256, -1, -1, -1, -1, -1, + -1, -1, -1, 275, -1, -1, -1, -1, -1, 529, + -1, -1, -1, 275, -1, -1, 225, 125, 126, 127, + 277, -1, -1, -1, -1, -1, -1, -1, 187, -1, + -1, 139, 140, 141, 142, 143, 144, 145, 146, -1, + -1, -1, -1, -1, 346, 347, 57, 349, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 338, -1, + 346, 347, -1, 349, -1, -1, 225, 347, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 359, + -1, -1, -1, 355, 356, -1, 358, -1, 57, 346, + -1, -1, 349, 349, 356, -1, 358, -1, -1, 110, + 111, 112, 113, 114, 115, 534, -1, -1, -1, -1, + -1, -1, -1, -1, 125, 126, 127, -1, -1, -1, + -1, 132, -1, -1, 135, -1, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, -1, 346, -1, -1, + 349, 110, 111, 112, 113, 114, 115, 158, -1, -1, + -1, -1, -1, -1, -1, -1, 125, 126, 127, -1, + -1, -1, -1, -1, -1, -1, 135, -1, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, -1, 481, + -1, -1, -1, 485, -1, -1, -1, 346, -1, 158, + 349, -1, -1, -1, -1, 481, -1, -1, -1, 485, + 502, -1, 504, -1, -1, 485, -1, -1, -1, -1, + -1, 483, -1, -1, -1, -1, 502, -1, 504, -1, + -1, 501, -1, 525, 481, 481, -1, -1, -1, -1, + -1, -1, 534, 535, -1, -1, -1, -1, 540, 525, + -1, -1, -1, -1, -1, 502, 502, 504, 534, 535, + -1, -1, 532, -1, 540, -1, -1, 529, -1, -1, + -1, -1, -1, -1, -1, -1, 568, -1, 525, 525, + -1, -1, 481, -1, -1, -1, -1, 534, 535, 535, + -1, -1, 568, 540, 540, -1, -1, -1, -1, -1, + 592, -1, -1, 502, -1, 504, -1, -1, -1, 601, + -1, 603, -1, 605, 606, -1, 592, 609, -1, -1, + -1, 568, 568, -1, -1, 601, 525, 603, -1, 605, + 606, -1, 481, 609, -1, 534, 535, -1, -1, -1, + -1, 540, -1, 57, -1, 592, 592, -1, -1, -1, + -1, -1, -1, 502, 601, 504, 603, 603, 605, 606, + 606, -1, 609, 609, -1, -1, -1, -1, -1, 568, + -1, -1, -1, -1, -1, -1, 525, -1, -1, -1, + -1, -1, -1, -1, -1, 534, 535, -1, -1, -1, + -1, 540, -1, 592, -1, -1, 110, 111, 112, 113, + 114, 115, 601, 131, 603, -1, 605, 606, -1, -1, + 609, 125, 126, 127, -1, -1, -1, -1, -1, 568, + -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 592, 158, 173, 174, 175, -1, -1, + -1, 179, 601, -1, 603, 57, 605, 606, -1, -1, + 609, -1, -1, 191, -1, 193, 194, -1, -1, 197, + -1, 199, 200, 201, 202, -1, -1, -1, -1, -1, + -1, -1, -1, 211, 212, 213, 214, 215, 216, 217, + 218, 219, -1, 221, 222, -1, -1, -1, -1, -1, + 228, -1, 230, -1, -1, -1, 234, -1, 110, 111, + 112, 113, 114, 115, -1, -1, -1, 57, -1, 247, + -1, -1, -1, 125, 126, 127, -1, -1, -1, -1, + 132, -1, 260, 135, -1, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, -1, -1, -1, -1, -1, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, + -1, -1, -1, -1, -1, 135, -1, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 158, 347, + 348, 3, 4, 5, -1, 7, -1, -1, 10, -1, + 12, 13, 14, 15, 16, 17, 18, -1, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 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, -1, -1, -1, -1, -1, -1, 109, 456, 57, + -1, -1, -1, 461, 116, 117, 464, 465, -1, 467, + 468, 469, 470, -1, 472, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 482, -1, -1, 485, -1, -1, + -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, + -1, -1, 154, -1, 156, 503, -1, -1, -1, -1, + -1, -1, 110, 111, 112, 113, 114, 115, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, + -1, -1, -1, -1, -1, 533, -1, 135, -1, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, + 111, 112, 113, 114, 115, -1, 554, 555, -1, -1, + 158, -1, 560, -1, 125, 126, 127, -1, -1, -1, + -1, -1, -1, -1, 135, -1, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, -1, -1, -1, 587, + -1, -1, -1, -1, -1, -1, -1, 158, -1, -1, + -1, 599, -1, -1, -1, -1, -1, -1, 3, 4, + 608, -1, 7, -1, 612, 10, -1, 12, 13, 14, + 15, 16, 17, 18, -1, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 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, -1, -1, + -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, + -1, 116, 117, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 154, + 155, 156, 3, 4, -1, -1, 7, -1, -1, 10, + -1, 12, 13, 14, 15, 16, 17, 18, -1, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 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, -1, -1, -1, -1, -1, -1, 109, -1, + -1, -1, -1, -1, -1, 116, 117, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 154, 155, 156, 3, 4, -1, -1, + 7, -1, -1, 10, -1, 12, 13, 14, 15, 16, + 17, 18, -1, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 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, -1, -1, -1, -1, + -1, -1, 109, -1, -1, -1, -1, -1, -1, 116, + 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 154, 155, 156, + 3, 4, -1, -1, 7, -1, -1, 10, -1, 12, + 13, 14, 15, 16, 17, 18, -1, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 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, + -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, + -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3, 4, -1, -1, 7, + -1, 154, 10, 156, 12, 13, 14, 15, 16, 17, + 18, -1, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 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, -1, -1, -1, -1, -1, + -1, 109, -1, -1, -1, -1, -1, -1, 116, 117, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 16, 17, -1, 154, -1, 156, 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, -1, -1, -1, 99, 100, -1, -1, + 103, 104, 105, 106, -1, 108, 109, -1, -1, -1, + -1, -1, -1, 116, 117, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 143, -1, -1, -1, 147, 148, 5, -1, -1, 152, + -1, 154, -1, 156, 157, -1, -1, 16, 17, -1, + -1, -1, -1, 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, -1, -1, -1, + 99, 100, -1, -1, 103, 104, 105, 106, -1, 108, + 109, -1, -1, -1, -1, -1, -1, 116, 117, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 143, 5, -1, -1, 147, 148, + -1, -1, -1, 152, -1, 154, 16, 17, 157, -1, + -1, -1, 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, -1, -1, -1, 99, + 100, -1, -1, 103, 104, 105, 106, -1, 108, 109, + -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5, -1, 143, -1, -1, -1, 147, 148, -1, + -1, -1, 16, 17, -1, -1, -1, 157, 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, -1, -1, -1, 99, 100, -1, -1, 103, + 104, 105, 106, -1, 108, 109, -1, -1, -1, -1, + -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5, -1, 143, + -1, -1, -1, 147, 148, -1, -1, -1, 16, 17, + -1, -1, -1, 157, 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, -1, -1, + -1, 99, 100, -1, -1, 103, 104, 105, 106, -1, + 108, 109, -1, -1, -1, -1, -1, -1, 116, 117, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5, -1, 143, -1, -1, -1, 147, + 148, -1, -1, -1, 16, 17, -1, -1, -1, 157, + 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, -1, -1, -1, 99, 100, -1, + -1, 103, 104, 105, 106, -1, 108, 109, -1, -1, + -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, + -1, 143, -1, -1, -1, 147, 148, -1, -1, -1, + 16, 17, -1, -1, -1, 157, 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, + -1, -1, -1, 99, 100, -1, -1, 103, 104, 105, + 106, -1, 108, 109, -1, -1, -1, -1, -1, -1, + 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 143, -1, -1, + -1, 147, 148, -1, 15, 16, 17, 18, -1, 20, + -1, 157, 23, 24, -1, 26, -1, 28, 29, 30, + 31, -1, -1, -1, -1, -1, -1, 57, -1, 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, + 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, + -1, -1, -1, -1, -1, 135, -1, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 158, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 16, 17, + -1, -1, -1, -1, 155, 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, -1, -1, + -1, 99, 100, -1, -1, -1, -1, -1, -1, -1, + -1, 109, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 15, 16, 17, -1, -1, 155, 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, + -1, -1, -1, -1, -1, -1, 109, -1, -1, 15, + 16, 17, -1, 116, 117, 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, 57, -1, -1, + -1, -1, -1, 109, -1, -1, -1, -1, -1, -1, + 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, + -1, 57, -1, -1, -1, 135, -1, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 110, 111, 112, + 113, 114, 115, -1, -1, -1, -1, -1, 158, -1, + -1, -1, 125, 126, 127, -1, -1, -1, 57, -1, + -1, -1, 135, -1, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 110, 111, 112, 113, 114, 115, + -1, -1, -1, -1, -1, 158, -1, -1, -1, 125, + 126, 127, -1, -1, -1, 57, -1, -1, -1, 135, + -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, + -1, -1, 158, -1, -1, -1, 125, 126, 127, -1, + -1, -1, 57, -1, -1, -1, 135, -1, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, + 112, 113, 114, 115, -1, -1, -1, -1, -1, 158, + -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, + -1, -1, -1, 135, -1, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, + 115, -1, -1, -1, -1, -1, 158, -1, -1, -1, + 125, 126, 127, -1, -1, -1, 57, -1, -1, -1, + 135, -1, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 110, 111, 112, 113, 114, 115, -1, -1, + -1, -1, -1, 158, -1, -1, -1, 125, 126, 127, + -1, -1, -1, 57, -1, -1, -1, 135, -1, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, + 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, + 158, -1, -1, -1, 125, 126, 127, -1, -1, -1, + 57, -1, -1, -1, 135, -1, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 110, 111, 112, 113, + 114, 115, -1, -1, -1, -1, -1, 158, -1, -1, + -1, 125, 126, 127, -1, -1, -1, 57, -1, -1, + -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 110, 111, 112, 113, 114, 115, -1, + -1, -1, -1, -1, 158, -1, -1, -1, 125, 126, + 127, -1, -1, -1, 57, -1, -1, -1, 135, -1, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, + -1, 158, -1, -1, -1, 125, 126, 127, -1, -1, + -1, 57, -1, -1, -1, 135, -1, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 110, 111, 112, + 113, 114, 115, -1, -1, -1, -1, -1, 158, -1, + -1, -1, 125, 126, 127, -1, -1, -1, 57, -1, + -1, -1, 135, -1, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 110, 111, 112, 113, 114, 115, + -1, -1, -1, -1, -1, 158, -1, -1, -1, 125, + 126, 127, -1, -1, -1, 57, -1, -1, -1, 135, + -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, + -1, -1, 158, -1, -1, -1, 125, 126, 127, -1, + -1, -1, 57, -1, -1, -1, 135, -1, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, + 112, 113, 114, 115, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, + -1, -1, -1, 135, -1, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, + 115, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 125, 126, 127, -1, -1, -1, -1, -1, -1, -1, + 135, -1, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 110, 111, 112, 113, 114, 115, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, + -1, -1, -1, -1, -1, -1, -1, 135, -1, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 16, + 17, -1, -1, 151, 152, 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, -1, + -1, -1, 99, 100, -1, -1, -1, 16, 17, -1, + -1, -1, 109, 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, -1, -1, -1, + 99, 100, -1, -1, 16, 17, -1, -1, -1, -1, + 109, 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, -1, -1, -1, 99, 100, -1, + -1, 16, 17, -1, -1, -1, -1, 109, 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, 57, -1, -1, 99, 100, -1, -1, -1, -1, + -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 110, 111, 112, 113, 114, 115, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, + 126, 127, -1, -1, -1, 57, 132, -1, -1, 135, + -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 125, 126, 127, -1, + -1, -1, 57, 132, -1, -1, 135, -1, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, + 112, 113, 114, 115, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, + 132, -1, -1, 135, -1, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, + 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 125, 126, 127, -1, -1, -1, 57, 132, -1, -1, + 135, -1, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 110, 111, 112, 113, 114, 115, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, + -1, -1, -1, 57, 132, -1, -1, 135, -1, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, + 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 125, 126, 127, -1, -1, -1, + 57, 132, -1, -1, 135, -1, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 110, 111, 112, 113, + 114, 115, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 125, 126, 127, -1, -1, -1, 57, 132, -1, + -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 110, 111, 112, 113, 114, 115, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, 126, + 127, -1, -1, -1, 57, 132, -1, -1, 135, -1, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, + -1, 57, -1, -1, -1, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 110, 111, 112, + 113, 114, 115, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 125, 126, 127, -1, -1, -1, 57, 132, + -1, -1, 135, -1, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 110, 111, 112, 113, 114, 115, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, + 126, 127, -1, -1, -1, 57, 132, -1, -1, 135, + -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 125, 126, 127, -1, + -1, -1, 57, 132, -1, -1, 135, -1, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, + 112, 113, 114, 115, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, + 132, -1, -1, 135, -1, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, + 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 125, 126, 127, -1, -1, -1, 57, -1, -1, -1, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 110, 111, 112, 113, 114, 115, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, + -1, -1, -1, 57, 132, -1, -1, 135, -1, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, + 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 125, 126, 127, -1, -1, -1, + 57, 132, -1, -1, 135, -1, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 110, 111, 112, 113, + 114, 115, 57, -1, -1, -1, -1, -1, -1, -1, + -1, 125, 126, 127, -1, -1, -1, -1, -1, -1, + -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 110, 111, 112, 113, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, 126, + 127, -1, -1, -1, -1, -1, 111, 112, -1, -1, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 125, 126, 127, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 15, 16, 17, 18, 19, 20, -1, -1, + 23, 24, -1, 26, -1, 28, 29, 30, 31, -1, + -1, -1, -1, -1, -1, -1, -1, 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, 15, 16, + 17, 18, -1, 20, -1, -1, 23, 24, -1, 26, + -1, 28, 29, 30, 31, -1, -1, -1, -1, -1, + -1, -1, -1, 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 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 160, 161, 0, 3, 4, 5, 7, 10, 12, + 13, 14, 15, 16, 17, 18, 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, 109, + 116, 117, 154, 156, 162, 163, 165, 166, 167, 168, + 170, 172, 173, 176, 178, 179, 181, 182, 185, 187, + 188, 191, 192, 195, 199, 200, 201, 207, 156, 156, + 157, 157, 17, 23, 24, 25, 26, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 56, + 78, 82, 83, 94, 95, 99, 100, 109, 176, 205, + 206, 109, 192, 195, 200, 201, 16, 103, 104, 105, + 106, 108, 109, 143, 147, 148, 152, 154, 156, 157, + 165, 178, 192, 194, 195, 199, 200, 201, 202, 203, + 204, 157, 154, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 155, 164, 166, 163, 157, 176, + 157, 166, 201, 151, 152, 118, 119, 120, 121, 122, + 123, 124, 128, 129, 130, 133, 134, 198, 199, 156, + 15, 169, 176, 186, 207, 202, 133, 132, 157, 151, + 152, 176, 104, 105, 202, 202, 202, 193, 203, 176, + 196, 197, 202, 157, 201, 133, 199, 57, 110, 111, + 112, 113, 114, 115, 125, 126, 127, 135, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 156, 202, + 208, 202, 202, 158, 203, 202, 203, 202, 202, 202, + 202, 108, 158, 158, 158, 158, 158, 158, 203, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 158, 104, + 108, 202, 108, 202, 193, 155, 166, 202, 157, 202, + 13, 176, 202, 203, 202, 176, 132, 11, 156, 158, + 203, 206, 193, 109, 202, 157, 132, 153, 136, 132, + 155, 158, 176, 177, 203, 200, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 202, 202, 158, 15, 16, 17, + 18, 20, 23, 24, 26, 28, 29, 30, 31, 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, + 209, 210, 214, 158, 158, 158, 132, 158, 158, 158, + 158, 132, 132, 158, 132, 132, 158, 132, 132, 132, + 132, 158, 132, 158, 158, 158, 158, 158, 158, 158, + 177, 158, 157, 157, 153, 11, 207, 176, 180, 192, + 195, 202, 171, 202, 166, 158, 153, 193, 203, 203, + 196, 132, 158, 136, 154, 211, 215, 107, 108, 108, + 155, 214, 202, 202, 108, 202, 202, 202, 202, 104, + 190, 202, 190, 202, 154, 158, 166, 202, 193, 157, + 180, 158, 151, 152, 156, 6, 158, 176, 166, 202, + 164, 209, 103, 104, 105, 106, 107, 108, 212, 213, + 158, 132, 189, 158, 132, 132, 189, 189, 189, 189, + 132, 158, 174, 166, 158, 158, 193, 158, 184, 176, + 202, 186, 166, 155, 19, 132, 92, 93, 108, 158, + 202, 202, 158, 158, 158, 158, 202, 8, 9, 155, + 175, 158, 184, 166, 153, 158, 212, 158, 158, 132, + 202, 136, 166, 183, 202, 136, 164, 166, 132, 164, + 202, 3, 132, 156, 202, 158 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 152 "swf5compiler.y" + { bf = newBuffer(); + bc = newBuffer(); + ;} + break; + + case 3: +#line 155 "swf5compiler.y" + { Buffer b = newBuffer(); + bufferWriteConstants(b); + bufferConcat(b, bf); + bufferConcat(b, bc); + *((Buffer *)buffer) = b; ;} + break; + + case 4: +#line 160 "swf5compiler.y" + { Buffer b = newBuffer(); *((Buffer *)buffer) = b; ;} + break; + + case 7: +#line 170 "swf5compiler.y" + { bufferConcat(bc, (yyvsp[(1) - (1)].action)); ;} + break; + + case 8: +#line 172 "swf5compiler.y" + { bufferConcat(bf, (yyvsp[(1) - (1)].action)); ;} + break; + + case 9: +#line 177 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (1)].action); ;} + break; + + case 10: +#line 180 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (2)].action); + bufferConcat((yyval.action), (yyvsp[(2) - (2)].action)); ;} + break; + + case 11: +#line 185 "swf5compiler.y" + { ;} + break; + + case 12: +#line 189 "swf5compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 13: +#line 190 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].action); ;} + break; + + case 14: +#line 191 "swf5compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 15: +#line 192 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (2)].action); ;} + break; + + case 23: +#line 204 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferWriteOp((yyval.action), SWFACTION_WITH); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(6) - (7)].action))); + bufferConcat((yyval.action), (yyvsp[(6) - (7)].action)); ;} + break; + + case 24: +#line 215 "swf5compiler.y" + { int tmp = chkctx(CTX_FUNCTION); + if(tmp < 0) + swf5error("return outside function"); + (yyval.action) = newBuffer(); + while(--tmp >= 0) + bufferWriteOp((yyval.action), SWFACTION_POP); + bufferWriteNull((yyval.action)); + bufferWriteOp((yyval.action), SWFACTION_RETURN); ;} + break; + + case 25: +#line 225 "swf5compiler.y" + { int tmp = chkctx(CTX_FUNCTION); + if(tmp < 0) + swf5error("return outside function"); + (yyval.action) = newBuffer(); + while(--tmp >= 0) + bufferWriteOp((yyval.action), SWFACTION_POP); + bufferConcat((yyval.action), (yyvsp[(2) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_RETURN); ;} + break; + + case 27: +#line 237 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); ;} + break; + + case 28: +#line 242 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(7) - (7)].action))+5); + bufferConcat((yyval.action), (yyvsp[(7) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (7)].action))); + bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); ;} + break; + + case 29: +#line 253 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (5)].action); + bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); + bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); ;} + break; + + case 30: +#line 262 "swf5compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 31: +#line 263 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (1)].action); ;} + break; + + case 32: +#line 268 "swf5compiler.y" + { addctx(CTX_SWITCH); ;} + break; + + case 33: +#line 274 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferResolveSwitch((yyval.action), &(yyvsp[(6) - (7)].switchcases)); + bufferResolveJumps((yyval.action)); + bufferWriteOp((yyval.action), SWFACTION_POP); + delctx(CTX_SWITCH); + /* FIXME: continue in switch continues surrounding loop, if any */ + ;} + break; + + case 34: +#line 286 "swf5compiler.y" + { (yyval.switchcases).count = 0; + (yyval.switchcases).list = 0; ;} + break; + + case 35: +#line 290 "swf5compiler.y" + { (yyval.switchcases) = (yyvsp[(1) - (2)].switchcases); + (yyval.switchcases).list = (struct switchcase*) realloc((yyval.switchcases).list, ((yyval.switchcases).count+1) * sizeof(struct switchcase)); + (yyval.switchcases).list[(yyval.switchcases).count] = (yyvsp[(2) - (2)].switchcase); + (yyval.switchcases).count++; ;} + break; + + case 36: +#line 298 "swf5compiler.y" + { (yyval.switchcase).cond = (yyvsp[(2) - (6)].action); + (yyval.switchcase).action = (yyvsp[(4) - (6)].action); + (yyval.switchcase).isbreak = 1; ;} + break; + + case 37: +#line 303 "swf5compiler.y" + { (yyval.switchcase).cond = (yyvsp[(2) - (4)].action); + (yyval.switchcase).action = (yyvsp[(4) - (4)].action); + (yyval.switchcase).isbreak = 0; ;} + break; + + case 38: +#line 308 "swf5compiler.y" + { (yyval.switchcase).cond = NULL; + (yyval.switchcase).action = (yyvsp[(3) - (3)].action); + (yyval.switchcase).isbreak = 0; ;} + break; + + case 40: +#line 318 "swf5compiler.y" + { (yyval.str) = strdup("new"); ;} + break; + + case 41: +#line 319 "swf5compiler.y" + { (yyval.str) = strdup("delete"); ;} + break; + + case 42: +#line 320 "swf5compiler.y" + { (yyval.str) = strdup("random"); ;} + break; + + case 43: +#line 321 "swf5compiler.y" + { (yyval.str) = strdup("getTimer"); ;} + break; + + case 44: +#line 322 "swf5compiler.y" + { (yyval.str) = strdup("length"); ;} + break; + + case 45: +#line 323 "swf5compiler.y" + { (yyval.str) = strdup("concat"); ;} + break; + + case 46: +#line 324 "swf5compiler.y" + { (yyval.str) = strdup("substr"); ;} + break; + + case 47: +#line 325 "swf5compiler.y" + { (yyval.str) = strdup("trace"); ;} + break; + + case 48: +#line 326 "swf5compiler.y" + { (yyval.str) = strdup("int"); ;} + break; + + case 49: +#line 327 "swf5compiler.y" + { (yyval.str) = strdup("ord"); ;} + break; + + case 50: +#line 328 "swf5compiler.y" + { (yyval.str) = strdup("chr"); ;} + break; + + case 51: +#line 329 "swf5compiler.y" + { (yyval.str) = strdup("getURL"); ;} + break; + + case 52: +#line 330 "swf5compiler.y" + { (yyval.str) = strdup("getURL1"); ;} + break; + + case 53: +#line 331 "swf5compiler.y" + { (yyval.str) = strdup("nextFrame"); ;} + break; + + case 54: +#line 332 "swf5compiler.y" + { (yyval.str) = strdup("prevFrame"); ;} + break; + + case 55: +#line 333 "swf5compiler.y" + { (yyval.str) = strdup("play"); ;} + break; + + case 56: +#line 334 "swf5compiler.y" + { (yyval.str) = strdup("stop"); ;} + break; + + case 57: +#line 335 "swf5compiler.y" + { (yyval.str) = strdup("toggleQuality"); ;} + break; + + case 58: +#line 336 "swf5compiler.y" + { (yyval.str) = strdup("stopSounds"); ;} + break; + + case 59: +#line 337 "swf5compiler.y" + { (yyval.str) = strdup("dup"); ;} + break; + + case 60: +#line 338 "swf5compiler.y" + { (yyval.str) = strdup("swap"); ;} + break; + + case 61: +#line 339 "swf5compiler.y" + { (yyval.str) = strdup("pop"); ;} + break; + + case 62: +#line 340 "swf5compiler.y" + { (yyval.str) = strdup("push"); ;} + break; + + case 63: +#line 341 "swf5compiler.y" + { (yyval.str) = strdup("setRegister"); ;} + break; + + case 64: +#line 342 "swf5compiler.y" + { (yyval.str) = strdup("callFunction"); ;} + break; + + case 65: +#line 343 "swf5compiler.y" + { (yyval.str) = strdup("callMethod"); ;} + break; + + case 66: +#line 344 "swf5compiler.y" + { (yyval.str) = strdup("and"); ;} + break; + + case 67: +#line 345 "swf5compiler.y" + { (yyval.str) = strdup("or"); ;} + break; + + case 68: +#line 346 "swf5compiler.y" + { (yyval.str) = strdup("xor"); ;} + break; + + case 69: +#line 347 "swf5compiler.y" + { (yyval.str) = strdup("modulo"); ;} + break; + + case 70: +#line 348 "swf5compiler.y" + { (yyval.str) = strdup("add"); ;} + break; + + case 71: +#line 349 "swf5compiler.y" + { (yyval.str) = strdup("lessThan"); ;} + break; + + case 72: +#line 350 "swf5compiler.y" + { (yyval.str) = strdup("equals"); ;} + break; + + case 73: +#line 351 "swf5compiler.y" + { (yyval.str) = strdup("inc"); ;} + break; + + case 74: +#line 352 "swf5compiler.y" + { (yyval.str) = strdup("dec"); ;} + break; + + case 75: +#line 353 "swf5compiler.y" + { (yyval.str) = strdup("typeof"); ;} + break; + + case 76: +#line 354 "swf5compiler.y" + { (yyval.str) = strdup("instanceof"); ;} + break; + + case 77: +#line 355 "swf5compiler.y" + { (yyval.str) = strdup("enumerate"); ;} + break; + + case 78: +#line 356 "swf5compiler.y" + { (yyval.str) = strdup("initobject"); ;} + break; + + case 79: +#line 357 "swf5compiler.y" + { (yyval.str) = strdup("initarray"); ;} + break; + + case 80: +#line 358 "swf5compiler.y" + { (yyval.str) = strdup("getmember"); ;} + break; + + case 81: +#line 359 "swf5compiler.y" + { (yyval.str) = strdup("setmember"); ;} + break; + + case 82: +#line 360 "swf5compiler.y" + { (yyval.str) = strdup("shiftleft"); ;} + break; + + case 83: +#line 361 "swf5compiler.y" + { (yyval.str) = strdup("shiftright"); ;} + break; + + case 84: +#line 362 "swf5compiler.y" + { (yyval.str) = strdup("shiftright2"); ;} + break; + + case 85: +#line 363 "swf5compiler.y" + { (yyval.str) = strdup("varequals"); ;} + break; + + case 86: +#line 364 "swf5compiler.y" + { (yyval.str) = strdup("oldAdd"); ;} + break; + + case 87: +#line 365 "swf5compiler.y" + { (yyval.str) = strdup("subtract"); ;} + break; + + case 88: +#line 366 "swf5compiler.y" + { (yyval.str) = strdup("multiply"); ;} + break; + + case 89: +#line 367 "swf5compiler.y" + { (yyval.str) = strdup("divide"); ;} + break; + + case 90: +#line 368 "swf5compiler.y" + { (yyval.str) = strdup("oldequals"); ;} + break; + + case 91: +#line 369 "swf5compiler.y" + { (yyval.str) = strdup("oldlessthan"); ;} + break; + + case 92: +#line 370 "swf5compiler.y" + { (yyval.str) = strdup("logicaland"); ;} + break; + + case 93: +#line 371 "swf5compiler.y" + { (yyval.str) = strdup("logicalor"); ;} + break; + + case 94: +#line 372 "swf5compiler.y" + { (yyval.str) = strdup("not"); ;} + break; + + case 95: +#line 373 "swf5compiler.y" + { (yyval.str) = strdup("stringeq"); ;} + break; + + case 96: +#line 374 "swf5compiler.y" + { (yyval.str) = strdup("stringlength"); ;} + break; + + case 97: +#line 375 "swf5compiler.y" + { (yyval.str) = strdup("substring"); ;} + break; + + case 98: +#line 376 "swf5compiler.y" + { (yyval.str) = strdup("getvariable"); ;} + break; + + case 99: +#line 377 "swf5compiler.y" + { (yyval.str) = strdup("setvariable"); ;} + break; + + case 100: +#line 378 "swf5compiler.y" + { (yyval.str) = strdup("settargetexpression"); ;} + break; + + case 101: +#line 379 "swf5compiler.y" + { (yyval.str) = strdup("duplicatemovieclip"); ;} + break; + + case 102: +#line 380 "swf5compiler.y" + { (yyval.str) = strdup("removemovieclip"); ;} + break; + + case 103: +#line 381 "swf5compiler.y" + { (yyval.str) = strdup("startdrag"); ;} + break; + + case 104: +#line 382 "swf5compiler.y" + { (yyval.str) = strdup("stopdrag"); ;} + break; + + case 105: +#line 383 "swf5compiler.y" + { (yyval.str) = strdup("stringlessthan"); ;} + break; + + case 106: +#line 384 "swf5compiler.y" + { (yyval.str) = strdup("mblength"); ;} + break; + + case 107: +#line 385 "swf5compiler.y" + { (yyval.str) = strdup("mbsubstring"); ;} + break; + + case 108: +#line 386 "swf5compiler.y" + { (yyval.str) = strdup("mbord"); ;} + break; + + case 109: +#line 387 "swf5compiler.y" + { (yyval.str) = strdup("mbchr"); ;} + break; + + case 110: +#line 388 "swf5compiler.y" + { (yyval.str) = strdup("branchalways"); ;} + break; + + case 111: +#line 389 "swf5compiler.y" + { (yyval.str) = strdup("branchiftrue"); ;} + break; + + case 112: +#line 390 "swf5compiler.y" + { (yyval.str) = strdup("getURL2"); ;} + break; + + case 113: +#line 391 "swf5compiler.y" + { (yyval.str) = strdup("post"); ;} + break; + + case 114: +#line 392 "swf5compiler.y" + { (yyval.str) = strdup("get"); ;} + break; + + case 115: +#line 393 "swf5compiler.y" + { (yyval.str) = strdup("loadvariables"); ;} + break; + + case 116: +#line 394 "swf5compiler.y" + { (yyval.str) = strdup("loadMovie"); ;} + break; + + case 117: +#line 399 "swf5compiler.y" + { (yyval.exprlist).buffer = newBuffer(); + (yyval.exprlist).count = 0; ;} + break; + + case 118: +#line 403 "swf5compiler.y" + { (yyval.exprlist).buffer = newBuffer(); + bufferWriteHardString((yyval.exprlist).buffer, (byte*)(yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + (yyval.exprlist).count = 1; ;} + break; + + case 119: +#line 408 "swf5compiler.y" + { (yyval.exprlist) = (yyvsp[(1) - (3)].exprlist); + bufferWriteHardString((yyval.exprlist).buffer, (byte*)(yyvsp[(3) - (3)].str), strlen((yyvsp[(3) - (3)].str))+1); + ++(yyval.exprlist).count; ;} + break; + + case 120: +#line 415 "swf5compiler.y" + { addctx(CTX_FUNCTION); ;} + break; + + case 121: +#line 420 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_DEFINEFUNCTION); + bufferWriteS16((yyval.action), strlen((yyvsp[(2) - (6)].str)) + + bufferLength((yyvsp[(4) - (6)].exprlist).buffer) + 5); + bufferWriteHardString((yyval.action), (byte*) (yyvsp[(2) - (6)].str), strlen((yyvsp[(2) - (6)].str))+1); + bufferWriteS16((yyval.action), (yyvsp[(4) - (6)].exprlist).count); + bufferConcat((yyval.action), (yyvsp[(4) - (6)].exprlist).buffer); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(6) - (6)].action))); + bufferConcat((yyval.action), (yyvsp[(6) - (6)].action)); + delctx(CTX_FUNCTION); ;} + break; + + case 122: +#line 434 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 123: +#line 439 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferWriteString((yyval.action), (yyvsp[(3) - (3)].str), strlen((yyvsp[(3) - (3)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); + free((yyvsp[(3) - (3)].str)); ;} + break; + + case 124: +#line 445 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (4)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (4)].action)); + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); ;} + break; + + case 127: +#line 456 "swf5compiler.y" + { addctx(CTX_LOOP); ;} + break; + + case 128: +#line 461 "swf5compiler.y" + { addctx(CTX_LOOP); ;} + break; + + case 129: +#line 466 "swf5compiler.y" + { addctx(CTX_LOOP); ;} + break; + + case 130: +#line 471 "swf5compiler.y" + { addctx(CTX_FOR_IN); ;} + break; + + case 131: +#line 476 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (5)].action); + bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); + bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))+5); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); + bufferResolveJumps((yyval.action)); + delctx(CTX_LOOP); ;} + break; + + case 132: +#line 489 "swf5compiler.y" + { if((yyvsp[(2) - (6)].action)) + { (yyval.action) = (yyvsp[(2) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + } + else + (yyval.action) = (yyvsp[(5) - (6)].action); + bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); + bufferResolveJumps((yyval.action)); + delctx(CTX_LOOP); ;} + break; + + case 133: +#line 502 "swf5compiler.y" + { + if((yyvsp[(3) - (10)].action)) + (yyval.action) = (yyvsp[(3) - (10)].action); + else + (yyval.action) = newBuffer(); + + if((yyvsp[(7) - (10)].action)) + { + bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(7) - (10)].action))); + } + else + (yyvsp[(7) - (10)].action) = newBuffer(); + + if((yyvsp[(5) - (10)].action)) + { + bufferConcat((yyvsp[(7) - (10)].action), (yyvsp[(5) - (10)].action)); + bufferWriteOp((yyvsp[(7) - (10)].action), SWFACTION_LOGICALNOT); + bufferWriteOp((yyvsp[(7) - (10)].action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyvsp[(7) - (10)].action), 2); + bufferWriteS16((yyvsp[(7) - (10)].action), bufferLength((yyvsp[(10) - (10)].action))+5); + } + + bufferConcat((yyvsp[(7) - (10)].action), (yyvsp[(10) - (10)].action)); + bufferWriteOp((yyvsp[(7) - (10)].action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyvsp[(7) - (10)].action), 2); + bufferWriteS16((yyvsp[(7) - (10)].action), -(bufferLength((yyvsp[(7) - (10)].action))+2)); + bufferResolveJumps((yyvsp[(7) - (10)].action)); + + bufferConcat((yyval.action), (yyvsp[(7) - (10)].action)); + delctx(CTX_LOOP); + ;} + break; + + case 134: +#line 537 "swf5compiler.y" + { Buffer b2, b3; + int tmp; + + (yyval.action) = (yyvsp[(5) - (8)].action); + bufferWriteOp((yyval.action), SWFACTION_ENUMERATE); + + b2 = newBuffer(); + bufferWriteSetRegister(b2, 0); + bufferWriteOp(b2, SWFACTION_PUSHDATA); + bufferWriteS16(b2, 1); + bufferWriteU8(b2, 2); + bufferWriteOp(b2, SWFACTION_NEWEQUALS); + bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); + bufferWriteS16(b2, 2); + + b3 = newBuffer(); +/* basically a lvalue could be used here rather than an ident !!! */ +/* probably by using reg1 for the test rather than reg0 */ + bufferWriteString(b3, (yyvsp[(3) - (8)].str), strlen((yyvsp[(3) - (8)].str))+1); + bufferWriteRegister(b3, 0); + bufferWriteOp(b3, SWFACTION_SETVARIABLE); + bufferConcat(b3, (yyvsp[(8) - (8)].action)); + bufferWriteS16(b2, bufferLength(b3) + 5); + tmp = bufferLength(b2) + bufferLength(b3) + 5; + bufferConcat((yyval.action), b2); + bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); + bufferWriteS16(b3, 2); + bufferWriteS16(b3, -tmp); + bufferResolveJumps(b3); + bufferConcat((yyval.action), b3); + delctx(CTX_FOR_IN); ;} + break; + + case 135: +#line 570 "swf5compiler.y" + { Buffer b2, b3; + int tmp; + + (yyval.action) = (yyvsp[(6) - (9)].action); + bufferWriteOp((yyval.action), SWFACTION_ENUMERATE); + + b2 = newBuffer(); + bufferWriteSetRegister(b2, 0); + bufferWriteOp(b2, SWFACTION_PUSHDATA); + bufferWriteS16(b2, 1); + bufferWriteU8(b2, 2); + bufferWriteOp(b2, SWFACTION_NEWEQUALS); + bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); + bufferWriteS16(b2, 2); + // add size later + + b3 = newBuffer(); + bufferWriteString(b3, (yyvsp[(4) - (9)].str), strlen((yyvsp[(4) - (9)].str))+1); + bufferWriteRegister(b3, 0); + bufferWriteOp(b3, SWFACTION_VAREQUALS); + bufferConcat(b3, (yyvsp[(9) - (9)].action)); + bufferWriteS16(b2, bufferLength(b3) + 5); + tmp = bufferLength(b2) + bufferLength(b3) + 5; + bufferConcat((yyval.action), b2); + bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); + bufferWriteS16(b3, 2); + bufferWriteS16(b3, -tmp); + bufferResolveJumps(b3); + bufferConcat((yyval.action), b3); + delctx(CTX_FOR_IN); ;} + break; + + case 136: +#line 603 "swf5compiler.y" + { (yyval.action) = NULL; ;} + break; + + case 138: +#line 611 "swf5compiler.y" + { if(chkctx(CTX_CONTINUE) < 0) + swf5error("continue outside loop"); + (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), MAGIC_CONTINUE_NUMBER); ;} + break; + + case 139: +#line 622 "swf5compiler.y" + { int tmp = chkctx(CTX_BREAK); + if(tmp < 0) + swf5error("break outside switch / loop"); + (yyval.action) = newBuffer(); + if(tmp) /* break out of a for .. in */ + bufferWriteOp((yyval.action), SWFACTION_POP); + bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), MAGIC_BREAK_NUMBER); ;} + break; + + case 140: +#line 634 "swf5compiler.y" + { (yyval.getURLMethod) = GETURL_METHOD_NOSEND; ;} + break; + + case 141: +#line 636 "swf5compiler.y" + { (yyval.getURLMethod) = GETURL_METHOD_GET; ;} + break; + + case 142: +#line 638 "swf5compiler.y" + { (yyval.getURLMethod) = GETURL_METHOD_POST; ;} + break; + + case 143: +#line 640 "swf5compiler.y" + { if(strcmp((yyvsp[(2) - (2)].str), "GET") == 0) + (yyval.getURLMethod) = GETURL_METHOD_GET; + else if(strcmp((yyvsp[(2) - (2)].str), "POST") == 0) + (yyval.getURLMethod) = GETURL_METHOD_POST; ;} + break; + + case 144: +#line 648 "swf5compiler.y" + { char *lvlstring = (char*) malloc(12*sizeof(char)); + sprintf(lvlstring, "_level%d", (yyvsp[(1) - (1)].intVal)); + (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), lvlstring, strlen(lvlstring)+1); + free(lvlstring); ;} + break; + + case 145: +#line 655 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), "_level", 7); + bufferConcat((yyval.action), (yyvsp[(1) - (1)].action)); + bufferWriteOp((yyval.action), SWFACTION_STRINGCONCAT); ;} + break; + + case 146: +#line 663 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(3) - (4)].exprlist).count); + bufferWriteString((yyval.action), (yyvsp[(1) - (4)].str), strlen((yyvsp[(1) - (4)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_CALLFUNCTION); + bufferWriteOp((yyval.action), SWFACTION_POP); + free((yyvsp[(1) - (4)].str)); ;} + break; + + case 147: +#line 671 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(2) - (2)].str), strlen((yyvsp[(2) - (2)].str))+1); + free((yyvsp[(2) - (2)].str)); + bufferWriteOp((yyval.action), SWFACTION_DELETE); ;} + break; + + case 148: +#line 677 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (4)].action); + // bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteString((yyval.action), (yyvsp[(4) - (4)].str), strlen((yyvsp[(4) - (4)].str))+1); + free((yyvsp[(4) - (4)].str)); + bufferWriteOp((yyval.action), SWFACTION_DELETEVAR); ;} + break; + + case 149: +#line 684 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (5)].action); + // bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferConcat((yyval.action), (yyvsp[(4) - (5)].action)); + // bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteOp((yyval.action), SWFACTION_DELETEVAR); ;} + break; + + case 150: +#line 691 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_TRACE); ;} + break; + + case 151: +#line 695 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), (yyvsp[(6) - (7)].getURLMethod)); ;} + break; + + case 152: +#line 702 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0xc0+(yyvsp[(6) - (7)].getURLMethod)); ;} + break; + + case 153: +#line 709 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0x80+(yyvsp[(6) - (7)].getURLMethod)); ;} + break; + + case 154: +#line 716 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0x40+(yyvsp[(6) - (7)].getURLMethod)); ;} + break; + + case 155: +#line 723 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (7)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_GETURL2); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), (yyvsp[(6) - (7)].getURLMethod)); ;} + break; + + case 156: +#line 730 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_CALLFRAME); + bufferWriteS16((yyval.action), 0); ;} + break; + + case 157: +#line 736 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), "0", 2); /* no constraint */ + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferConcat((yyval.action), (yyvsp[(3) - (6)].action)); + bufferWriteOp((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} + break; + + case 158: +#line 743 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferConcat((yyval.action), (yyvsp[(7) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(11) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(9) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(13) - (14)].action)); + bufferWriteString((yyval.action), "1", 2); /* has constraint */ + bufferConcat((yyval.action), (yyvsp[(5) - (14)].action)); + bufferConcat((yyval.action), (yyvsp[(3) - (14)].action)); + bufferWriteOp((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} + break; + + case 159: +#line 754 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_STOPDRAGMOVIE); ;} + break; + + case 160: +#line 759 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); + bufferWriteInt((yyval.action), 16384); /* magic number */ + bufferWriteOp((yyval.action), SWFACTION_ADD); + bufferWriteOp((yyval.action), SWFACTION_DUPLICATECLIP); ;} + break; + + case 161: +#line 767 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_REMOVECLIP); ;} + break; + + case 162: +#line 771 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_GETURL); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (6)].str)) + strlen((yyvsp[(5) - (6)].str)) + 2); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (6)].str), strlen((yyvsp[(3) - (6)].str))); + bufferWriteU8((yyval.action), 0); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(5) - (6)].str), strlen((yyvsp[(5) - (6)].str))); + bufferWriteU8((yyval.action), 0); ;} + break; + + case 163: +#line 781 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_NEXTFRAME); ;} + break; + + case 164: +#line 785 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_PREVFRAME); ;} + break; + + case 165: +#line 789 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_PLAY); ;} + break; + + case 166: +#line 793 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_STOP); ;} + break; + + case 167: +#line 797 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_STOPSOUNDS); ;} + break; + + case 168: +#line 801 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_TOGGLEQUALITY); ;} + break; + + case 169: +#line 805 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_GOTOFRAME); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), (yyvsp[(3) - (4)].intVal)); ;} + break; + + case 170: +#line 811 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_GOTOLABEL); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 171: +#line 818 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_GOTOEXPRESSION); + bufferWriteS16((yyval.action), 1); + bufferWriteU8((yyval.action), 0); ;} + break; + + case 172: +#line 824 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_SETTARGET); + bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); + bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); + free((yyvsp[(3) - (4)].str)); ;} + break; + + case 173: +#line 831 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_SETTARGETEXPRESSION); ;} + break; + + case 174: +#line 840 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(3) - (4)].exprlist).count); + bufferWriteString((yyval.action), (yyvsp[(1) - (4)].str), strlen((yyvsp[(1) - (4)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_CALLFUNCTION); + free((yyvsp[(1) - (4)].str)); ;} + break; + + case 175: +#line 847 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); ;} + break; + + case 176: +#line 851 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_GETTIMER); ;} + break; + + case 177: +#line 855 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_RANDOM); ;} + break; + + case 178: +#line 859 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_STRINGLENGTH); ;} + break; + + case 179: +#line 863 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_INT); ;} + break; + + case 180: +#line 867 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_ORD); ;} + break; + + case 181: +#line 871 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_CHR); ;} + break; + + case 182: +#line 875 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (6)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); + bufferWriteOp((yyval.action), SWFACTION_STRINGCONCAT); ;} + break; + + case 183: +#line 880 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (8)].action); + bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); + bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); + bufferWriteOp((yyval.action), SWFACTION_SUBSTRING); ;} + break; + + case 184: +#line 886 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (4)].action); + bufferWriteOp((yyval.action), SWFACTION_TYPEOF); ;} + break; + + case 185: +#line 894 "swf5compiler.y" + { (yyval.exprlist).buffer = newBuffer(); + (yyval.exprlist).count = 0; ;} + break; + + case 186: +#line 898 "swf5compiler.y" + { (yyval.exprlist).buffer = (yyvsp[(1) - (1)].action); + (yyval.exprlist).count = 1; ;} + break; + + case 187: +#line 903 "swf5compiler.y" + { Buffer tmp = newBuffer(); + bufferConcat(tmp, (yyvsp[(3) - (3)].action)); + bufferConcat(tmp, (yyval.exprlist).buffer); + (yyval.exprlist).buffer = tmp; + ++(yyval.exprlist).count; ;} + break; + + case 188: +#line 912 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteOp((yyval.action), SWFACTION_DEFINEFUNCTION); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(3) - (5)].exprlist).buffer) + 5); + bufferWriteU8((yyval.action), 0); /* empty function name */ + bufferWriteS16((yyval.action), (yyvsp[(3) - (5)].exprlist).count); + bufferConcat((yyval.action), (yyvsp[(3) - (5)].exprlist).buffer); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))); + bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); + delctx(CTX_FUNCTION); ;} + break; + + case 189: +#line 925 "swf5compiler.y" + { (yyval.action) = (yyvsp[(5) - (6)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(5) - (6)].exprlist).count); + bufferConcat((yyval.action), (yyvsp[(1) - (6)].action)); + bufferWriteString((yyval.action), (yyvsp[(3) - (6)].str), strlen((yyvsp[(3) - (6)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_CALLMETHOD); + free((yyvsp[(3) - (6)].str)); ;} + break; + + case 190: +#line 933 "swf5compiler.y" + { (yyval.action) = (yyvsp[(6) - (7)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(6) - (7)].exprlist).count); + bufferConcat((yyval.action), (yyvsp[(1) - (7)].action)); + bufferConcat((yyval.action), (yyvsp[(3) - (7)].action)); + bufferWriteOp((yyval.action), SWFACTION_CALLMETHOD); ;} + break; + + case 191: +#line 942 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (3)].str), strlen((yyvsp[(1) - (3)].str))+1); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} + break; + + case 192: +#line 949 "swf5compiler.y" + { (yyval.exprlist).buffer = (yyvsp[(1) - (1)].action); + (yyval.exprlist).count = 1; ;} + break; + + case 193: +#line 953 "swf5compiler.y" + { bufferConcat((yyval.exprlist).buffer, (yyvsp[(3) - (3)].action)); + ++(yyval.exprlist).count; ;} + break; + + case 194: +#line 958 "swf5compiler.y" + { (yyval.op) = SWFACTION_NEWADD; ;} + break; + + case 195: +#line 959 "swf5compiler.y" + { (yyval.op) = SWFACTION_SUBTRACT; ;} + break; + + case 196: +#line 960 "swf5compiler.y" + { (yyval.op) = SWFACTION_MULTIPLY; ;} + break; + + case 197: +#line 961 "swf5compiler.y" + { (yyval.op) = SWFACTION_DIVIDE; ;} + break; + + case 198: +#line 962 "swf5compiler.y" + { (yyval.op) = SWFACTION_MODULO; ;} + break; + + case 199: +#line 963 "swf5compiler.y" + { (yyval.op) = SWFACTION_BITWISEAND; ;} + break; + + case 200: +#line 964 "swf5compiler.y" + { (yyval.op) = SWFACTION_BITWISEOR; ;} + break; + + case 201: +#line 965 "swf5compiler.y" + { (yyval.op) = SWFACTION_BITWISEXOR; ;} + break; + + case 202: +#line 966 "swf5compiler.y" + { (yyval.op) = SWFACTION_SHIFTLEFT; ;} + break; + + case 203: +#line 967 "swf5compiler.y" + { (yyval.op) = SWFACTION_SHIFTRIGHT; ;} + break; + + case 204: +#line 968 "swf5compiler.y" + { (yyval.op) = SWFACTION_SHIFTRIGHT2; ;} + break; + + case 205: +#line 972 "swf5compiler.y" + { (yyval.op) = SWFACTION_INCREMENT; ;} + break; + + case 206: +#line 973 "swf5compiler.y" + { (yyval.op) = SWFACTION_DECREMENT; ;} + break; + + case 207: +#line 992 "swf5compiler.y" + { if((yyvsp[(1) - (1)].lval).obj) + { + (yyval.action) = (yyvsp[(1) - (1)].lval).obj; + + if((yyvsp[(1) - (1)].lval).ident) + bufferConcat((yyval.action), (yyvsp[(1) - (1)].lval).ident); + else + bufferConcat((yyval.action), (yyvsp[(1) - (1)].lval).memexpr); + + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); + } + else + { + (yyval.action) = (yyvsp[(1) - (1)].lval).ident; + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); + } + ;} + break; + + case 210: +#line 1016 "swf5compiler.y" + { (yyval.lval).ident = newBuffer(); + bufferWriteString((yyval.lval).ident, (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); + (yyval.lval).obj = 0; + (yyval.lval).memexpr = 0; ;} + break; + + case 211: +#line 1023 "swf5compiler.y" + { (yyval.lval).obj = (yyvsp[(1) - (3)].action); + (yyval.lval).ident = newBuffer(); + bufferWriteString((yyval.lval).ident, (yyvsp[(3) - (3)].str), strlen((yyvsp[(3) - (3)].str))+1); + (yyval.lval).memexpr = 0; ;} + break; + + case 212: +#line 1029 "swf5compiler.y" + { (yyval.lval).obj = (yyvsp[(1) - (4)].action); + (yyval.lval).memexpr = (yyvsp[(3) - (4)].action); + (yyval.lval).ident = 0; ;} + break; + + case 214: +#line 1040 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteInt((yyvsp[(2) - (2)].action), -1); + bufferWriteOp((yyvsp[(2) - (2)].action), SWFACTION_MULTIPLY); ;} + break; + + case 215: +#line 1045 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteInt((yyvsp[(2) - (2)].action), 0xffffffff); + bufferWriteOp((yyvsp[(2) - (2)].action), SWFACTION_BITWISEXOR); ;} + break; + + case 216: +#line 1050 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); + bufferWriteOp((yyvsp[(2) - (2)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 217: +#line 1054 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(3) - (3)].action))+1); + bufferWriteOp((yyval.action), SWFACTION_POP); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} + break; + + case 218: +#line 1063 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); + bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyval.action), 2); + bufferWriteS16((yyval.action), bufferLength((yyvsp[(3) - (3)].action))+1); + bufferWriteOp((yyval.action), SWFACTION_POP); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} + break; + + case 219: +#line 1073 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_MULTIPLY); ;} + break; + + case 220: +#line 1078 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_DIVIDE); ;} + break; + + case 221: +#line 1083 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_MODULO); ;} + break; + + case 222: +#line 1088 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_NEWADD); ;} + break; + + case 223: +#line 1093 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_SUBTRACT); ;} + break; + + case 224: +#line 1098 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_BITWISEAND); ;} + break; + + case 225: +#line 1103 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_BITWISEOR); ;} + break; + + case 226: +#line 1108 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_BITWISEXOR); ;} + break; + + case 227: +#line 1113 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_NEWLESSTHAN); ;} + break; + + case 228: +#line 1118 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_NEWLESSTHAN); ;} + break; + + case 229: +#line 1123 "swf5compiler.y" + { (yyval.action) = (yyvsp[(3) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_NEWLESSTHAN); + bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); ;} + break; + + case 230: +#line 1129 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_NEWLESSTHAN); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 231: +#line 1134 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_NEWEQUALS); ;} + break; + + case 232: +#line 1138 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_NEWEQUALS); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} + break; + + case 233: +#line 1143 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_SHIFTLEFT); ;} + break; + + case 234: +#line 1147 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_SHIFTRIGHT); ;} + break; + + case 235: +#line 1151 "swf5compiler.y" + { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_SHIFTRIGHT2); ;} + break; + + case 236: +#line 1155 "swf5compiler.y" + { bufferWriteOp((yyvsp[(1) - (5)].action), SWFACTION_BRANCHIFTRUE); + bufferWriteS16((yyvsp[(1) - (5)].action), 2); + bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(5) - (5)].action))+5); + bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(5) - (5)].action)); + bufferWriteOp((yyvsp[(1) - (5)].action), SWFACTION_BRANCHALWAYS); + bufferWriteS16((yyvsp[(1) - (5)].action), 2); + bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(3) - (5)].action))); + bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(3) - (5)].action)); ;} + break; + + case 237: +#line 1165 "swf5compiler.y" + { if((yyvsp[(1) - (3)].lval).obj) /* obj[memexpr] or obj.ident */ + { + (yyval.action) = (yyvsp[(1) - (3)].lval).obj; + + if((yyvsp[(1) - (3)].lval).ident) + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); + else + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).memexpr); + + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); + bufferWriteRegister((yyval.action), 0); + } + else /* just ident */ + { + (yyval.action) = (yyvsp[(3) - (3)].action); + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); + bufferWriteOp((yyval.action), SWFACTION_SWAP); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } +/* tricky case missing here: lvalue ASSIGN expr */ +/* like in x = y += z; */ + ;} + break; + + case 238: +#line 1192 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_INSTANCEOF); ;} + break; + + case 240: +#line 1202 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteInt((yyval.action), 0); + bufferWriteString((yyval.action), (yyvsp[(2) - (2)].str), strlen((yyvsp[(2) - (2)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_NEW); ;} + break; + + case 241: +#line 1208 "swf5compiler.y" + { (yyval.action) = (yyvsp[(4) - (5)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(4) - (5)].exprlist).count); + bufferWriteString((yyval.action), (yyvsp[(2) - (5)].str), strlen((yyvsp[(2) - (5)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_NEW); ;} + break; + + case 242: +#line 1214 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(2) - (3)].exprlist).count); + bufferWriteOp((yyval.action), SWFACTION_INITARRAY); ;} + break; + + case 243: +#line 1219 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteInt((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_INITOBJECT); ;} + break; + + case 244: +#line 1224 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].exprlist).buffer; + bufferWriteInt((yyval.action), (yyvsp[(2) - (3)].exprlist).count); + bufferWriteOp((yyval.action), SWFACTION_INITOBJECT); ;} + break; + + case 249: +#line 1240 "swf5compiler.y" + { if((yyvsp[(2) - (2)].lval).obj) + { + if((yyvsp[(2) - (2)].lval).ident) // expr . identifier + { + (yyval.action) = (yyvsp[(2) - (2)].lval).obj; + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ + bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, a, i */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a */ + bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, i, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); + bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+1 */ + bufferWriteRegister((yyval.action), 0); /* a.i+1 */ + } + else // expr [ expr ] + { + (yyval.action) = (yyvsp[(2) - (2)].lval).memexpr; /* i */ + bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).obj); /* i, a */ + bufferWriteSetRegister((yyval.action), 0); /* ($2.memexpr can use reg0) */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); /* a, i, a[i]+1 */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ + bufferWriteRegister((yyval.action), 0); /* a[i]+1 */ + } + } + else // identifier + { + (yyval.action) = newBuffer(); + bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].lval).ident); + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).ident); + bufferWriteOp((yyval.action), SWFACTION_SWAP); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } + ;} + break; + + case 250: +#line 1285 "swf5compiler.y" + { if((yyvsp[(1) - (2)].lval).obj) + { + if((yyvsp[(1) - (2)].lval).ident) + { + (yyval.action) = (yyvsp[(1) - (2)].lval).obj; /* a */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a.i, a */ + bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a.i, a, i */ + bufferWriteRegister((yyval.action), 0); /* a.i, a, i, a.i */ + bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a.i, a, i, a.i+1 */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); + } + else + { + (yyval.action) = (yyvsp[(1) - (2)].lval).memexpr; + bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).obj); /* i, a */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a, i, a[i]+1 */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); + bufferWriteRegister((yyval.action), 0); /* a[i] */ + } + } + else + { + (yyval.action) = newBuffer(); + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].lval).ident); + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); + bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).ident); + bufferWriteOp((yyval.action), SWFACTION_SWAP); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } + ;} + break; + + case 251: +#line 1330 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (3)].action); ;} + break; + + case 252: +#line 1333 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteInt((yyval.action), -(yyvsp[(2) - (2)].intVal)); ;} + break; + + case 253: +#line 1337 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteInt((yyval.action), (yyvsp[(1) - (1)].intVal)); ;} + break; + + case 254: +#line 1341 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteDouble((yyval.action), -(yyvsp[(2) - (2)].doubleVal)); ;} + break; + + case 255: +#line 1345 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteDouble((yyval.action), (yyvsp[(1) - (1)].doubleVal)); ;} + break; + + case 256: +#line 1349 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteBoolean((yyval.action), (yyvsp[(1) - (1)].intVal)); ;} + break; + + case 257: +#line 1353 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteNull((yyval.action)); ;} + break; + + case 258: +#line 1357 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + free((yyvsp[(1) - (1)].str)); ;} + break; + + case 260: +#line 1366 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (3)].action); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} + break; + + case 261: +#line 1372 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (3)].str), strlen((yyvsp[(1) - (3)].str))+1); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_VAREQUALS); ;} + break; + + case 262: +#line 1378 "swf5compiler.y" + { (yyval.action) = newBuffer(); + bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); + bufferWriteOp((yyval.action), SWFACTION_VAR); ;} + break; + + case 263: +#line 1385 "swf5compiler.y" + { asmBuffer = newBuffer(); ;} + break; + + case 264: +#line 1387 "swf5compiler.y" + { (yyval.action) = asmBuffer; ;} + break; + + case 265: +#line 1390 "swf5compiler.y" + { (yyval.action) = (yyvsp[(2) - (2)].action); ;} + break; + + case 267: +#line 1395 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (1)].action); + bufferWriteOp((yyval.action), SWFACTION_POP); ;} + break; + + case 268: +#line 1399 "swf5compiler.y" + { (yyval.action) = (yyvsp[(1) - (1)].action); + bufferWriteOp((yyval.action), SWFACTION_POP); ;} + break; + + case 269: +#line 1403 "swf5compiler.y" + { if((yyvsp[(2) - (2)].lval).obj) + { + if((yyvsp[(2) - (2)].lval).ident) + { + (yyval.action) = (yyvsp[(2) - (2)].lval).obj; /* a */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ + bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ + bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); /* a, a.i+1 */ + bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, a.i+1, i */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a.i+1 */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+1 */ + } + else + { + /* weird contortions so that $2.memexpr can use reg 0 */ + (yyval.action) = (yyvsp[(2) - (2)].lval).memexpr; /* i */ + bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).obj); /* i, a */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); /* a, i, a[i]+1 */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ + } + } + else + { + (yyval.action) = (yyvsp[(2) - (2)].lval).ident; + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } + ;} + break; + + case 270: +#line 1442 "swf5compiler.y" + { if((yyvsp[(1) - (2)].lval).obj) + { + if((yyvsp[(1) - (2)].lval).ident) + { + (yyval.action) = (yyvsp[(1) - (2)].lval).obj; /* a */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ + bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a, a.i+1 */ + bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a, a.i+1, i */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a.i+1 */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+1 */ + } + else + { + /* weird contortions so that $1.memexpr can use reg 0 */ + (yyval.action) = (yyvsp[(1) - (2)].lval).memexpr; /* i */ + bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).obj); /* i, a */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a, i, a[i]+1 */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ + } + } + else + { + (yyval.action) = (yyvsp[(1) - (2)].lval).ident; + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); + bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } + ;} + break; + + case 271: +#line 1481 "swf5compiler.y" + { if((yyvsp[(1) - (3)].lval).obj) + { + (yyval.action) = (yyvsp[(1) - (3)].lval).obj; + + if((yyvsp[(1) - (3)].lval).ident) + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); + else + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).memexpr); + + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); + } + else + { + (yyval.action) = (yyvsp[(1) - (3)].lval).ident; + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } + ;} + break; + + case 272: +#line 1502 "swf5compiler.y" + { if((yyvsp[(1) - (3)].lval).obj) + { + if((yyvsp[(1) - (3)].lval).ident) + { + (yyval.action) = (yyvsp[(1) - (3)].lval).obj; /* a */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ + bufferWriteBuffer((yyval.action), (yyvsp[(1) - (3)].lval).ident); /* a, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); /* a, a.i, v */ + bufferWriteOp((yyval.action), (yyvsp[(2) - (3)].op)); /* a, a.i+v */ + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); /* a, a.i+v, i */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a.i+v */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+v */ + } + else + { + (yyval.action) = (yyvsp[(1) - (3)].lval).memexpr; /* i */ + bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).obj); /* i, a */ + bufferWriteSetRegister((yyval.action), 0); + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ + bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ + bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); /* a, i, a[i], v */ + bufferWriteOp((yyval.action), (yyvsp[(2) - (3)].op)); /* a, i, a[i]+v */ + bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+v */ + } + } + else + { + (yyval.action) = (yyvsp[(1) - (3)].lval).ident; + bufferWriteOp((yyval.action), SWFACTION_DUP); + bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); + bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); + bufferWriteOp((yyval.action), (yyvsp[(2) - (3)].op)); + bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); + } + ;} + break; + + case 274: +#line 1547 "swf5compiler.y" + { (yyval.len) = (yyvsp[(1) - (2)].len) + (yyvsp[(2) - (2)].len); ;} + break; + + case 275: +#line 1552 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_WITH); ;} + break; + + case 276: +#line 1554 "swf5compiler.y" + { (yyval.len) = (yyvsp[(2) - (4)].len) + (yyvsp[(3) - (4)].len); + bufferPatchLength(asmBuffer, (yyvsp[(3) - (4)].len)); ;} + break; + + case 277: +#line 1559 "swf5compiler.y" + { (yyval.len) = bufferWriteConstantString(asmBuffer,(byte*) (yyvsp[(1) - (1)].str), + strlen((yyvsp[(1) - (1)].str))+1); ;} + break; + + case 278: +#line 1562 "swf5compiler.y" + { bufferWriteU8(asmBuffer, PUSH_INT); + (yyval.len) = bufferWriteInt(asmBuffer, (yyvsp[(1) - (1)].intVal))+1; ;} + break; + + case 279: +#line 1565 "swf5compiler.y" + { bufferWriteU8(asmBuffer, PUSH_DOUBLE); + (yyval.len) = bufferWriteDouble(asmBuffer, (yyvsp[(1) - (1)].doubleVal))+1; ;} + break; + + case 280: +#line 1568 "swf5compiler.y" + { bufferWriteU8(asmBuffer, PUSH_BOOLEAN); + (yyval.len) = bufferWriteU8(asmBuffer, (yyvsp[(1) - (1)].intVal))+1; ;} + break; + + case 281: +#line 1571 "swf5compiler.y" + { (yyval.len) = bufferWriteU8(asmBuffer, PUSH_NULL); ;} + break; + + case 282: +#line 1573 "swf5compiler.y" + { bufferWriteU8(asmBuffer, PUSH_REGISTER); + (yyval.len) = bufferWriteU8(asmBuffer, + (char)atoi((yyvsp[(1) - (1)].str)))+1; ;} + break; + + case 283: +#line 1580 "swf5compiler.y" + { (yyval.len) = (yyvsp[(1) - (1)].len); ;} + break; + + case 284: +#line 1581 "swf5compiler.y" + { (yyval.len) += (yyvsp[(3) - (3)].len); ;} + break; + + case 285: +#line 1585 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_PUSHDATA); + (yyval.len) += bufferWriteS16(asmBuffer, 0); ;} + break; + + case 286: +#line 1588 "swf5compiler.y" + { (yyval.len) = (yyvsp[(2) - (3)].len) + (yyvsp[(3) - (3)].len); + bufferPatchLength(asmBuffer, (yyvsp[(3) - (3)].len)); ;} + break; + + case 288: +#line 1594 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_SETREGISTER); + (yyval.len) += bufferWriteS16(asmBuffer, 1); + (yyval.len) += bufferWriteU8(asmBuffer, + (char)atoi((yyvsp[(2) - (2)].str))); ;} + break; + + case 289: +#line 1600 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_CALLFUNCTION); ;} + break; + + case 290: +#line 1602 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_RETURN); ;} + break; + + case 291: +#line 1604 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_CALLMETHOD); ;} + break; + + case 292: +#line 1606 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_BITWISEAND); ;} + break; + + case 293: +#line 1608 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_BITWISEOR); ;} + break; + + case 294: +#line 1610 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_BITWISEXOR); ;} + break; + + case 295: +#line 1612 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_MODULO); ;} + break; + + case 296: +#line 1614 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_NEWADD); ;} + break; + + case 297: +#line 1616 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_NEWLESSTHAN); ;} + break; + + case 298: +#line 1618 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_NEWEQUALS); ;} + break; + + case 299: +#line 1620 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_INCREMENT); ;} + break; + + case 300: +#line 1622 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_DECREMENT); ;} + break; + + case 301: +#line 1624 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_TYPEOF); ;} + break; + + case 302: +#line 1626 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_INSTANCEOF); ;} + break; + + case 303: +#line 1628 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_ENUMERATE); ;} + break; + + case 304: +#line 1630 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_DELETE); ;} + break; + + case 305: +#line 1632 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_NEW); ;} + break; + + case 306: +#line 1634 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_INITARRAY); ;} + break; + + case 307: +#line 1636 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_INITOBJECT); ;} + break; + + case 308: +#line 1638 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_GETMEMBER); ;} + break; + + case 309: +#line 1640 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_SETMEMBER); ;} + break; + + case 310: +#line 1642 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_SHIFTLEFT); ;} + break; + + case 311: +#line 1644 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_SHIFTRIGHT); ;} + break; + + case 312: +#line 1646 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_SHIFTRIGHT2); ;} + break; + + case 313: +#line 1648 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_VAR); ;} + break; + + case 314: +#line 1650 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, + SWFACTION_VAREQUALS); ;} + break; + + case 315: +#line 1654 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_ADD); ;} + break; + + case 316: +#line 1655 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SUBTRACT); ;} + break; + + case 317: +#line 1656 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MULTIPLY); ;} + break; + + case 318: +#line 1657 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_DIVIDE); ;} + break; + + case 319: +#line 1658 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_EQUAL); ;} + break; + + case 320: +#line 1659 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LESSTHAN); ;} + break; + + case 321: +#line 1660 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LOGICALAND); ;} + break; + + case 322: +#line 1661 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LOGICALOR); ;} + break; + + case 323: +#line 1662 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LOGICALNOT); ;} + break; + + case 324: +#line 1663 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGEQ); ;} + break; + + case 325: +#line 1664 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGLENGTH); ;} + break; + + case 326: +#line 1665 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SUBSTRING); ;} + break; + + case 327: +#line 1666 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_INT); ;} + break; + + case 328: +#line 1667 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_DUP); ;} + break; + + case 329: +#line 1668 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SWAP); ;} + break; + + case 330: +#line 1669 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_POP); ;} + break; + + case 331: +#line 1670 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_GETVARIABLE); ;} + break; + + case 332: +#line 1671 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SETVARIABLE); ;} + break; + + case 333: +#line 1672 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SETTARGETEXPRESSION); ;} + break; + + case 334: +#line 1673 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGCONCAT); ;} + break; + + case 335: +#line 1674 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_DUPLICATECLIP); ;} + break; + + case 336: +#line 1675 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_REMOVECLIP); ;} + break; + + case 337: +#line 1676 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_TRACE); ;} + break; + + case 338: +#line 1677 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGCOMPARE); ;} + break; + + case 339: +#line 1678 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_RANDOM); ;} + break; + + case 340: +#line 1679 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBLENGTH); ;} + break; + + case 341: +#line 1680 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_ORD); ;} + break; + + case 342: +#line 1681 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_CHR); ;} + break; + + case 343: +#line 1682 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_GETTIMER); ;} + break; + + case 344: +#line 1683 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBSUBSTRING); ;} + break; + + case 345: +#line 1684 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBORD); ;} + break; + + case 346: +#line 1685 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBCHR); ;} + break; + + case 347: +#line 1688 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_BRANCHALWAYS); + (yyval.len) += bufferWriteS16(asmBuffer, 2); + (yyval.len) += bufferBranchTarget(asmBuffer, (yyvsp[(2) - (2)].str)); ;} + break; + + case 348: +#line 1692 "swf5compiler.y" + { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_BRANCHIFTRUE); + (yyval.len) += bufferWriteS16(asmBuffer, 2); + (yyval.len) += bufferBranchTarget(asmBuffer, (yyvsp[(2) - (2)].str)); ;} + break; + + +/* Line 1267 of yacc.c. */ +#line 5479 "swf5compiler.tab.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 1697 "swf5compiler.y" + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h new file mode 100644 index 000000000..389d16914 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h @@ -0,0 +1,344 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + BREAK = 258, + CONTINUE = 259, + FUNCTION = 260, + ELSE = 261, + SWITCH = 262, + CASE = 263, + DEFAULT = 264, + FOR = 265, + IN = 266, + IF = 267, + WHILE = 268, + DO = 269, + VAR = 270, + NEW = 271, + DELETE = 272, + RETURN = 273, + END = 274, + WITH = 275, + ASM = 276, + EVAL = 277, + RANDOM = 278, + GETTIMER = 279, + LENGTH = 280, + CONCAT = 281, + SUBSTR = 282, + TRACE = 283, + INT = 284, + ORD = 285, + CHR = 286, + GETURL = 287, + GETURL1 = 288, + NEXTFRAME = 289, + PREVFRAME = 290, + PLAY = 291, + STOP = 292, + TOGGLEQUALITY = 293, + STOPSOUNDS = 294, + DUP = 295, + SWAP = 296, + POP = 297, + PUSH = 298, + SETREGISTER = 299, + CALLFUNCTION = 300, + CALLMETHOD = 301, + AND = 302, + OR = 303, + XOR = 304, + MODULO = 305, + ADD = 306, + LESSTHAN = 307, + EQUALS = 308, + INC = 309, + DEC = 310, + TYPEOF = 311, + INSTANCEOF = 312, + ENUMERATE = 313, + INITOBJECT = 314, + INITARRAY = 315, + GETMEMBER = 316, + SETMEMBER = 317, + SHIFTLEFT = 318, + SHIFTRIGHT = 319, + SHIFTRIGHT2 = 320, + VAREQUALS = 321, + OLDADD = 322, + SUBTRACT = 323, + MULTIPLY = 324, + DIVIDE = 325, + OLDEQUALS = 326, + OLDLESSTHAN = 327, + LOGICALAND = 328, + LOGICALOR = 329, + NOT = 330, + STRINGEQ = 331, + STRINGLENGTH = 332, + SUBSTRING = 333, + GETVARIABLE = 334, + SETVARIABLE = 335, + SETTARGETEXPRESSION = 336, + DUPLICATEMOVIECLIP = 337, + REMOVEMOVIECLIP = 338, + STRINGLESSTHAN = 339, + MBLENGTH = 340, + MBSUBSTRING = 341, + MBORD = 342, + MBCHR = 343, + BRANCHALWAYS = 344, + BRANCHIFTRUE = 345, + GETURL2 = 346, + POST = 347, + GET = 348, + LOADVARIABLES = 349, + LOADMOVIE = 350, + LOADVARIABLESNUM = 351, + LOADMOVIENUM = 352, + CALLFRAME = 353, + STARTDRAG = 354, + STOPDRAG = 355, + GOTOFRAME = 356, + SETTARGET = 357, + NULLVAL = 358, + INTEGER = 359, + DOUBLE = 360, + BOOLEAN = 361, + REGISTER = 362, + STRING = 363, + IDENTIFIER = 364, + EQ = 365, + LE = 366, + GE = 367, + NE = 368, + LAN = 369, + LOR = 370, + INCR = 371, + DECR = 372, + IEQ = 373, + DEQ = 374, + MEQ = 375, + SEQ = 376, + REQ = 377, + AEQ = 378, + OEQ = 379, + SHL = 380, + SHR = 381, + SHR2 = 382, + SHLEQ = 383, + SHREQ = 384, + SHR2EQ = 385, + NOELSE = 386, + UMINUS = 388, + POSTFIX = 389 + }; +#endif +/* Tokens. */ +#define BREAK 258 +#define CONTINUE 259 +#define FUNCTION 260 +#define ELSE 261 +#define SWITCH 262 +#define CASE 263 +#define DEFAULT 264 +#define FOR 265 +#define IN 266 +#define IF 267 +#define WHILE 268 +#define DO 269 +#define VAR 270 +#define NEW 271 +#define DELETE 272 +#define RETURN 273 +#define END 274 +#define WITH 275 +#define ASM 276 +#define EVAL 277 +#define RANDOM 278 +#define GETTIMER 279 +#define LENGTH 280 +#define CONCAT 281 +#define SUBSTR 282 +#define TRACE 283 +#define INT 284 +#define ORD 285 +#define CHR 286 +#define GETURL 287 +#define GETURL1 288 +#define NEXTFRAME 289 +#define PREVFRAME 290 +#define PLAY 291 +#define STOP 292 +#define TOGGLEQUALITY 293 +#define STOPSOUNDS 294 +#define DUP 295 +#define SWAP 296 +#define POP 297 +#define PUSH 298 +#define SETREGISTER 299 +#define CALLFUNCTION 300 +#define CALLMETHOD 301 +#define AND 302 +#define OR 303 +#define XOR 304 +#define MODULO 305 +#define ADD 306 +#define LESSTHAN 307 +#define EQUALS 308 +#define INC 309 +#define DEC 310 +#define TYPEOF 311 +#define INSTANCEOF 312 +#define ENUMERATE 313 +#define INITOBJECT 314 +#define INITARRAY 315 +#define GETMEMBER 316 +#define SETMEMBER 317 +#define SHIFTLEFT 318 +#define SHIFTRIGHT 319 +#define SHIFTRIGHT2 320 +#define VAREQUALS 321 +#define OLDADD 322 +#define SUBTRACT 323 +#define MULTIPLY 324 +#define DIVIDE 325 +#define OLDEQUALS 326 +#define OLDLESSTHAN 327 +#define LOGICALAND 328 +#define LOGICALOR 329 +#define NOT 330 +#define STRINGEQ 331 +#define STRINGLENGTH 332 +#define SUBSTRING 333 +#define GETVARIABLE 334 +#define SETVARIABLE 335 +#define SETTARGETEXPRESSION 336 +#define DUPLICATEMOVIECLIP 337 +#define REMOVEMOVIECLIP 338 +#define STRINGLESSTHAN 339 +#define MBLENGTH 340 +#define MBSUBSTRING 341 +#define MBORD 342 +#define MBCHR 343 +#define BRANCHALWAYS 344 +#define BRANCHIFTRUE 345 +#define GETURL2 346 +#define POST 347 +#define GET 348 +#define LOADVARIABLES 349 +#define LOADMOVIE 350 +#define LOADVARIABLESNUM 351 +#define LOADMOVIENUM 352 +#define CALLFRAME 353 +#define STARTDRAG 354 +#define STOPDRAG 355 +#define GOTOFRAME 356 +#define SETTARGET 357 +#define NULLVAL 358 +#define INTEGER 359 +#define DOUBLE 360 +#define BOOLEAN 361 +#define REGISTER 362 +#define STRING 363 +#define IDENTIFIER 364 +#define EQ 365 +#define LE 366 +#define GE 367 +#define NE 368 +#define LAN 369 +#define LOR 370 +#define INCR 371 +#define DECR 372 +#define IEQ 373 +#define DEQ 374 +#define MEQ 375 +#define SEQ 376 +#define REQ 377 +#define AEQ 378 +#define OEQ 379 +#define SHL 380 +#define SHR 381 +#define SHR2 382 +#define SHLEQ 383 +#define SHREQ 384 +#define SHR2EQ 385 +#define NOELSE 386 +#define UMINUS 388 +#define POSTFIX 389 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +#line 21 "swf5compiler.y" +{ + Buffer action; + char *str; + SWFGetUrl2Method getURLMethod; + int op; + int intVal; + int len; + double doubleVal; + + struct + { + Buffer buffer; + int count; + } exprlist; + struct switchcase switchcase; + struct switchcases switchcases; + struct + { + Buffer obj, ident, memexpr; + } lval; +} +/* Line 1489 of yacc.c. */ +#line 337 "swf5compiler.tab.h" + YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE swf5lval; + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y new file mode 100644 index 000000000..ed3b94f9e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y @@ -0,0 +1,1698 @@ +/* $Id: swf5compiler.y,v 1.2 2008/10/28 13:05:13 kramm Exp $ */ + +%start program + +%{ + +#include +#include +#include +#include "compile.h" +#include "action.h" +#include "assembler.h" + +#define YYPARSE_PARAM buffer + +Buffer bf, bc; + +%} + +%union +{ + Buffer action; + char *str; + SWFGetUrl2Method getURLMethod; + int op; + int intVal; + int len; + double doubleVal; + + struct + { + Buffer buffer; + int count; + } exprlist; + struct switchcase switchcase; + struct switchcases switchcases; + struct + { + Buffer obj, ident, memexpr; + } lval; +} + +/* tokens etc. */ + +%token BREAK CONTINUE FUNCTION ELSE SWITCH CASE DEFAULT FOR IN IF WHILE +%token DO VAR NEW DELETE RETURN END WITH ASM EVAL + +%token RANDOM GETTIMER LENGTH CONCAT SUBSTR TRACE INT ORD CHR GETURL +%token GETURL1 NEXTFRAME PREVFRAME PLAY STOP TOGGLEQUALITY STOPSOUNDS + +%token DUP SWAP POP PUSH SETREGISTER CALLFUNCTION CALLMETHOD +%token AND OR XOR MODULO ADD LESSTHAN EQUALS +%token INC DEC TYPEOF INSTANCEOF ENUMERATE INITOBJECT INITARRAY GETMEMBER +%token SETMEMBER SHIFTLEFT SHIFTRIGHT SHIFTRIGHT2 VAREQUALS OLDADD SUBTRACT +%token MULTIPLY DIVIDE OLDEQUALS OLDLESSTHAN LOGICALAND LOGICALOR NOT +%token STRINGEQ STRINGLENGTH SUBSTRING GETVARIABLE SETVARIABLE +%token SETTARGETEXPRESSION DUPLICATEMOVIECLIP REMOVEMOVIECLIP +%token STRINGLESSTHAN MBLENGTH MBSUBSTRING MBORD MBCHR +%token BRANCHALWAYS BRANCHIFTRUE GETURL2 POST GET +%token LOADVARIABLES LOADMOVIE LOADVARIABLESNUM LOADMOVIENUM +%token CALLFRAME STARTDRAG STOPDRAG GOTOFRAME SETTARGET + +%token NULLVAL +%token INTEGER +%token DOUBLE +%token BOOLEAN +%token REGISTER + +/* these two are strdup'ed in compiler.flex, so free them up here */ +%token STRING +%token IDENTIFIER + +%token EQ "==" +%token LE "<=" +%token GE ">=" +%token NE "!=" +%token LAN "&&" +%token LOR "||" +%token INCR "++" +%token DECR "--" +%token IEQ "+=" +%token DEQ "/=" +%token MEQ "*=" +%token SEQ "-=" +%token REQ "%=" +%token AEQ "&=" +%token OEQ "|=" + +%token SHL "<<" +%token SHR ">>" +%token SHR2 ">>>" +%token SHLEQ "<<=" +%token SHREQ ">>=" +%token SHR2EQ ">>>=" + + +/* ascending order of ops ..? */ + +%nonassoc NOELSE +%nonassoc ELSE +%left ',' +%right '=' "*=" "/=" "%=" "+=" "-=" "&=" "|=" "^=" ">>=" ">>>=" "<<=" +%right '?' ':' +%left "&&" "||" +%left "==" "!=" +%left '<' '>' "<=" ">=" +%left '&' '|' '^' +%left "<<" ">>" ">>>" +%left '+' '-' +%left '*' '/' '%' +%nonassoc "++" "--" +%right '!' '~' UMINUS +%right POSTFIX +%right TYPEOF +%nonassoc INSTANCEOF +%left '.' '[' ']' + + +%type program code +%type stmt stmts +%type if_stmt iter_stmt cont_stmt break_stmt return_stmt +%type with_stmt +%type switch_stmt +%type anon_function_decl function_decl anycode +%type void_function_call function_call method_call +%type assign_stmt assign_stmts assign_stmts_opt +%type expr expr_or_obj objexpr expr_opt obj_ref +%type emptybraces level init_vars init_var primary lvalue_expr +%type lvalue + +%type expr_list objexpr_list formals_list + +%type switch_case +%type switch_cases + +%type assignop incdecop +%type urlmethod + +%type identifier + +%type opcode opcode_list push_item with push_list + +/* +%type integer +%type double +*/ +%% + +/* rules */ + +program + : { bf = newBuffer(); + bc = newBuffer(); + } code + { Buffer b = newBuffer(); + bufferWriteConstants(b); + bufferConcat(b, bf); + bufferConcat(b, bc); + *((Buffer *)buffer) = b; } + | /* nothing */ { Buffer b = newBuffer(); *((Buffer *)buffer) = b; } + ; + +code + : anycode + | code anycode + ; + +anycode + : stmt + { bufferConcat(bc, $1); } + | function_decl + { bufferConcat(bf, $1); } + ; + +stmts + : stmt + { $$ = $1; } + + | stmts stmt + { $$ = $1; + bufferConcat($$, $2); } + ; + +emptybraces + : '{' '}' { } + ; + +stmt + : emptybraces { $$ = NULL; } + | '{' stmts '}' { $$ = $2; } + | ';' { $$ = NULL; } + | assign_stmt ';' { $$ = $1; } + | if_stmt + | iter_stmt + | cont_stmt + | break_stmt + | switch_stmt + | return_stmt + | with_stmt + ; + +with_stmt + : WITH '(' expr ')' '{' stmts '}' + { $$ = $3; + bufferWriteOp($$, SWFACTION_WITH); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($6)); + bufferConcat($$, $6); } + ; + +// only possible if there is an active CTX_FUNCTION +// in some contexts, may have to pop a few values ... +return_stmt + : RETURN ';' + { int tmp = chkctx(CTX_FUNCTION); + if(tmp < 0) + swf5error("return outside function"); + $$ = newBuffer(); + while(--tmp >= 0) + bufferWriteOp($$, SWFACTION_POP); + bufferWriteNull($$); + bufferWriteOp($$, SWFACTION_RETURN); } + + | RETURN expr_or_obj ';' + { int tmp = chkctx(CTX_FUNCTION); + if(tmp < 0) + swf5error("return outside function"); + $$ = newBuffer(); + while(--tmp >= 0) + bufferWriteOp($$, SWFACTION_POP); + bufferConcat($$, $2); + bufferWriteOp($$, SWFACTION_RETURN); } + ; + +assign_stmts + : assign_stmt + | assign_stmts ',' assign_stmt { bufferConcat($1, $3); } + ; + +if_stmt + : IF '(' expr ')' stmt ELSE stmt + { $$ = $3; + bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($7)+5); + bufferConcat($$, $7); + bufferWriteOp($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($5)); + bufferConcat($$, $5); } + + | IF '(' expr ')' stmt %prec NOELSE + { $$ = $3; + bufferWriteOp($$, SWFACTION_LOGICALNOT); + bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($5)); + bufferConcat($$, $5); } + ; + +expr_opt + : /* empty */ { $$ = NULL; } + | expr { $$ = $1; } + ; + +switch_init + : SWITCH + { addctx(CTX_SWITCH); } + ; + +switch_stmt + : switch_init '(' expr ')' '{' + switch_cases '}' + { $$ = $3; + bufferResolveSwitch($$, &$6); + bufferResolveJumps($$); + bufferWriteOp($$, SWFACTION_POP); + delctx(CTX_SWITCH); + /* FIXME: continue in switch continues surrounding loop, if any */ + } + ; + +/* XXX */ +switch_cases + : /* empty */ + { $$.count = 0; + $$.list = 0; } + + | switch_cases switch_case + { $$ = $1; + $$.list = (struct switchcase*) realloc($$.list, ($$.count+1) * sizeof(struct switchcase)); + $$.list[$$.count] = $2; + $$.count++; } + ; + +switch_case + : CASE expr ':' stmts BREAK ';' + { $$.cond = $2; + $$.action = $4; + $$.isbreak = 1; } + + | CASE expr ':' stmts + { $$.cond = $2; + $$.action = $4; + $$.isbreak = 0; } + + | DEFAULT ':' stmts + { $$.cond = NULL; + $$.action = $3; + $$.isbreak = 0; } + ; + + +/* there's GOT to be a better way than this.. */ + +identifier + : IDENTIFIER + | NEW { $$ = strdup("new"); } + | DELETE { $$ = strdup("delete"); } + | RANDOM { $$ = strdup("random"); } + | GETTIMER { $$ = strdup("getTimer"); } + | LENGTH { $$ = strdup("length"); } + | CONCAT { $$ = strdup("concat"); } + | SUBSTR { $$ = strdup("substr"); } + | TRACE { $$ = strdup("trace"); } + | INT { $$ = strdup("int"); } + | ORD { $$ = strdup("ord"); } + | CHR { $$ = strdup("chr"); } + | GETURL { $$ = strdup("getURL"); } + | GETURL1 { $$ = strdup("getURL1"); } + | NEXTFRAME { $$ = strdup("nextFrame"); } + | PREVFRAME { $$ = strdup("prevFrame"); } + | PLAY { $$ = strdup("play"); } + | STOP { $$ = strdup("stop"); } + | TOGGLEQUALITY { $$ = strdup("toggleQuality"); } + | STOPSOUNDS { $$ = strdup("stopSounds"); } + | DUP { $$ = strdup("dup"); } + | SWAP { $$ = strdup("swap"); } + | POP { $$ = strdup("pop"); } + | PUSH { $$ = strdup("push"); } + | SETREGISTER { $$ = strdup("setRegister"); } + | CALLFUNCTION { $$ = strdup("callFunction"); } + | CALLMETHOD { $$ = strdup("callMethod"); } + | AND { $$ = strdup("and"); } + | OR { $$ = strdup("or"); } + | XOR { $$ = strdup("xor"); } + | MODULO { $$ = strdup("modulo"); } + | ADD { $$ = strdup("add"); } + | LESSTHAN { $$ = strdup("lessThan"); } + | EQUALS { $$ = strdup("equals"); } + | INC { $$ = strdup("inc"); } + | DEC { $$ = strdup("dec"); } + | TYPEOF { $$ = strdup("typeof"); } + | INSTANCEOF { $$ = strdup("instanceof"); } + | ENUMERATE { $$ = strdup("enumerate"); } + | INITOBJECT { $$ = strdup("initobject"); } + | INITARRAY { $$ = strdup("initarray"); } + | GETMEMBER { $$ = strdup("getmember"); } + | SETMEMBER { $$ = strdup("setmember"); } + | SHIFTLEFT { $$ = strdup("shiftleft"); } + | SHIFTRIGHT { $$ = strdup("shiftright"); } + | SHIFTRIGHT2 { $$ = strdup("shiftright2"); } + | VAREQUALS { $$ = strdup("varequals"); } + | OLDADD { $$ = strdup("oldAdd"); } + | SUBTRACT { $$ = strdup("subtract"); } + | MULTIPLY { $$ = strdup("multiply"); } + | DIVIDE { $$ = strdup("divide"); } + | OLDEQUALS { $$ = strdup("oldequals"); } + | OLDLESSTHAN { $$ = strdup("oldlessthan"); } + | LOGICALAND { $$ = strdup("logicaland"); } + | LOGICALOR { $$ = strdup("logicalor"); } + | NOT { $$ = strdup("not"); } + | STRINGEQ { $$ = strdup("stringeq"); } + | STRINGLENGTH { $$ = strdup("stringlength"); } + | SUBSTRING { $$ = strdup("substring"); } + | GETVARIABLE { $$ = strdup("getvariable"); } + | SETVARIABLE { $$ = strdup("setvariable"); } + | SETTARGETEXPRESSION { $$ = strdup("settargetexpression"); } + | DUPLICATEMOVIECLIP { $$ = strdup("duplicatemovieclip"); } + | REMOVEMOVIECLIP { $$ = strdup("removemovieclip"); } + | STARTDRAG { $$ = strdup("startdrag"); } + | STOPDRAG { $$ = strdup("stopdrag"); } + | STRINGLESSTHAN { $$ = strdup("stringlessthan"); } + | MBLENGTH { $$ = strdup("mblength"); } + | MBSUBSTRING { $$ = strdup("mbsubstring"); } + | MBORD { $$ = strdup("mbord"); } + | MBCHR { $$ = strdup("mbchr"); } + | BRANCHALWAYS { $$ = strdup("branchalways"); } + | BRANCHIFTRUE { $$ = strdup("branchiftrue"); } + | GETURL2 { $$ = strdup("getURL2"); } + | POST { $$ = strdup("post"); } + | GET { $$ = strdup("get"); } + | LOADVARIABLES { $$ = strdup("loadvariables"); } + | LOADMOVIE { $$ = strdup("loadMovie"); } + ; + +formals_list + : /* empty */ + { $$.buffer = newBuffer(); + $$.count = 0; } + + | identifier + { $$.buffer = newBuffer(); + bufferWriteHardString($$.buffer, (byte*)$1, strlen($1)+1); + $$.count = 1; } + + | formals_list ',' identifier + { $$ = $1; + bufferWriteHardString($$.buffer, (byte*)$3, strlen($3)+1); + ++$$.count; } + ; + +function_init + : FUNCTION + { addctx(CTX_FUNCTION); } + ; + +function_decl + : function_init identifier '(' formals_list ')' stmt + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_DEFINEFUNCTION); + bufferWriteS16($$, strlen($2) + + bufferLength($4.buffer) + 5); + bufferWriteHardString($$, (byte*) $2, strlen($2)+1); + bufferWriteS16($$, $4.count); + bufferConcat($$, $4.buffer); + bufferWriteS16($$, bufferLength($6)); + bufferConcat($$, $6); + delctx(CTX_FUNCTION); } + ; + +obj_ref + : identifier + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + + | expr '.' identifier + { $$ = $1; + bufferWriteString($$, $3, strlen($3)+1); + bufferWriteOp($$, SWFACTION_GETMEMBER); + free($3); } + + | expr '[' expr ']' + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_GETMEMBER); } + + | function_call + + | method_call + ; + +while_init + : WHILE + { addctx(CTX_LOOP); } + ; + +do_init + : DO + { addctx(CTX_LOOP); } + ; + +for_init + : /* empty */ + { addctx(CTX_LOOP); } + ; + +for_in_init + : /* empty */ + { addctx(CTX_FOR_IN); } + ; + +iter_stmt + : while_init '(' expr ')' stmt + { $$ = $3; + bufferWriteOp($$, SWFACTION_LOGICALNOT); + bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($5)+5); + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, -(bufferLength($$)+2)); + bufferResolveJumps($$); + delctx(CTX_LOOP); } + + | do_init stmt WHILE '(' expr ')' + { if($2) + { $$ = $2; + bufferConcat($$, $5); + } + else + $$ = $5; + bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, -(bufferLength($$)+2)); + bufferResolveJumps($$); + delctx(CTX_LOOP); } + + | FOR '(' assign_stmts_opt ';' expr_opt ';' assign_stmts_opt ')' for_init stmt + { + if($3) + $$ = $3; + else + $$ = newBuffer(); + + if($7) + { + bufferWriteOp($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($7)); + } + else + $7 = newBuffer(); + + if($5) + { + bufferConcat($7, $5); + bufferWriteOp($7, SWFACTION_LOGICALNOT); + bufferWriteOp($7, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($7, 2); + bufferWriteS16($7, bufferLength($10)+5); + } + + bufferConcat($7, $10); + bufferWriteOp($7, SWFACTION_BRANCHALWAYS); + bufferWriteS16($7, 2); + bufferWriteS16($7, -(bufferLength($7)+2)); + bufferResolveJumps($7); + + bufferConcat($$, $7); + delctx(CTX_LOOP); + } + + | FOR '(' identifier IN obj_ref ')' for_in_init stmt + { Buffer b2, b3; + int tmp; + + $$ = $5; + bufferWriteOp($$, SWFACTION_ENUMERATE); + + b2 = newBuffer(); + bufferWriteSetRegister(b2, 0); + bufferWriteOp(b2, SWFACTION_PUSHDATA); + bufferWriteS16(b2, 1); + bufferWriteU8(b2, 2); + bufferWriteOp(b2, SWFACTION_NEWEQUALS); + bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); + bufferWriteS16(b2, 2); + + b3 = newBuffer(); +/* basically a lvalue could be used here rather than an ident !!! */ +/* probably by using reg1 for the test rather than reg0 */ + bufferWriteString(b3, $3, strlen($3)+1); + bufferWriteRegister(b3, 0); + bufferWriteOp(b3, SWFACTION_SETVARIABLE); + bufferConcat(b3, $8); + bufferWriteS16(b2, bufferLength(b3) + 5); + tmp = bufferLength(b2) + bufferLength(b3) + 5; + bufferConcat($$, b2); + bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); + bufferWriteS16(b3, 2); + bufferWriteS16(b3, -tmp); + bufferResolveJumps(b3); + bufferConcat($$, b3); + delctx(CTX_FOR_IN); } + + | FOR '(' VAR identifier IN obj_ref ')' for_in_init stmt + { Buffer b2, b3; + int tmp; + + $$ = $6; + bufferWriteOp($$, SWFACTION_ENUMERATE); + + b2 = newBuffer(); + bufferWriteSetRegister(b2, 0); + bufferWriteOp(b2, SWFACTION_PUSHDATA); + bufferWriteS16(b2, 1); + bufferWriteU8(b2, 2); + bufferWriteOp(b2, SWFACTION_NEWEQUALS); + bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); + bufferWriteS16(b2, 2); + // add size later + + b3 = newBuffer(); + bufferWriteString(b3, $4, strlen($4)+1); + bufferWriteRegister(b3, 0); + bufferWriteOp(b3, SWFACTION_VAREQUALS); + bufferConcat(b3, $9); + bufferWriteS16(b2, bufferLength(b3) + 5); + tmp = bufferLength(b2) + bufferLength(b3) + 5; + bufferConcat($$, b2); + bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); + bufferWriteS16(b3, 2); + bufferWriteS16(b3, -tmp); + bufferResolveJumps(b3); + bufferConcat($$, b3); + delctx(CTX_FOR_IN); } + ; + +assign_stmts_opt + : /* empty */ { $$ = NULL; } + | assign_stmts + ; + +// continue only makes sense if there is a CTX_LOOP or CTX_FOR_IN +// on the stack +cont_stmt + : CONTINUE ';' + { if(chkctx(CTX_CONTINUE) < 0) + swf5error("continue outside loop"); + $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, MAGIC_CONTINUE_NUMBER); } + ; + +// break is possible if there is a CTX_LOOP, CTX_FOR_IN or CTX_SWITCH +break_stmt + : BREAK ';' + { int tmp = chkctx(CTX_BREAK); + if(tmp < 0) + swf5error("break outside switch / loop"); + $$ = newBuffer(); + if(tmp) /* break out of a for .. in */ + bufferWriteOp($$, SWFACTION_POP); + bufferWriteOp($$, SWFACTION_BRANCHALWAYS); + bufferWriteS16($$, 2); + bufferWriteS16($$, MAGIC_BREAK_NUMBER); } + ; + +urlmethod + : /* empty */ { $$ = GETURL_METHOD_NOSEND; } + + | ',' GET { $$ = GETURL_METHOD_GET; } + + | ',' POST { $$ = GETURL_METHOD_POST; } + + | ',' STRING { if(strcmp($2, "GET") == 0) + $$ = GETURL_METHOD_GET; + else if(strcmp($2, "POST") == 0) + $$ = GETURL_METHOD_POST; } + ; + +level + : INTEGER + { char *lvlstring = (char*) malloc(12*sizeof(char)); + sprintf(lvlstring, "_level%d", $1); + $$ = newBuffer(); + bufferWriteString($$, lvlstring, strlen(lvlstring)+1); + free(lvlstring); } + + | expr + { $$ = newBuffer(); + bufferWriteString($$, "_level", 7); + bufferConcat($$, $1); + bufferWriteOp($$, SWFACTION_STRINGCONCAT); } + ; + +void_function_call + : IDENTIFIER '(' expr_list ')' + { $$ = $3.buffer; + bufferWriteInt($$, $3.count); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteOp($$, SWFACTION_CALLFUNCTION); + bufferWriteOp($$, SWFACTION_POP); + free($1); } + + | DELETE IDENTIFIER + { $$ = newBuffer(); + bufferWriteString($$, $2, strlen($2)+1); + free($2); + bufferWriteOp($$, SWFACTION_DELETE); } + + | DELETE lvalue_expr '.' IDENTIFIER + { $$ = $2; + // bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteString($$, $4, strlen($4)+1); + free($4); + bufferWriteOp($$, SWFACTION_DELETEVAR); } + + | DELETE lvalue_expr '[' expr ']' + { $$ = $2; + // bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferConcat($$, $4); + // bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteOp($$, SWFACTION_DELETEVAR); } + + | TRACE '(' expr_or_obj ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_TRACE); } + + | GETURL '(' expr ',' expr urlmethod ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, $6); } + + | LOADVARIABLES '(' expr ',' expr urlmethod ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0xc0+$6); } + + | LOADVARIABLESNUM '(' expr ',' level urlmethod ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0x80+$6); } + + | LOADMOVIE '(' expr ',' expr urlmethod ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0x40+$6); } + + | LOADMOVIENUM '(' expr ',' level urlmethod ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_GETURL2); + bufferWriteS16($$, 1); + bufferWriteU8($$, $6); } + + | CALLFRAME '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_CALLFRAME); + bufferWriteS16($$, 0); } + + /* startDrag(target, lock, [left, right, top, bottom]) */ + | STARTDRAG '(' expr ',' expr ')' + { $$ = newBuffer(); + bufferWriteString($$, "0", 2); /* no constraint */ + bufferConcat($$, $5); + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_STARTDRAGMOVIE); } + + | STARTDRAG '(' expr ',' expr ',' expr ',' expr ',' expr ',' expr ')' + { $$ = newBuffer(); + bufferConcat($$, $7); + bufferConcat($$, $11); + bufferConcat($$, $9); + bufferConcat($$, $13); + bufferWriteString($$, "1", 2); /* has constraint */ + bufferConcat($$, $5); + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_STARTDRAGMOVIE); } + + | STOPDRAG '(' ')' /* no args */ + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_STOPDRAGMOVIE); } + + /* duplicateMovieClip(target, new, depth) */ + | DUPLICATEMOVIECLIP '(' expr ',' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferConcat($$, $7); + bufferWriteInt($$, 16384); /* magic number */ + bufferWriteOp($$, SWFACTION_ADD); + bufferWriteOp($$, SWFACTION_DUPLICATECLIP); } + + | REMOVEMOVIECLIP '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_REMOVECLIP); } + + | GETURL1 '(' STRING ',' STRING ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_GETURL); + bufferWriteS16($$, strlen($3) + strlen($5) + 2); + bufferWriteHardString($$, (byte*)$3, strlen($3)); + bufferWriteU8($$, 0); + bufferWriteHardString($$, (byte*)$5, strlen($5)); + bufferWriteU8($$, 0); } + + /* v3 actions */ + | NEXTFRAME '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_NEXTFRAME); } + + | PREVFRAME '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_PREVFRAME); } + + | PLAY '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_PLAY); } + + | STOP '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_STOP); } + + | STOPSOUNDS '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_STOPSOUNDS); } + + | TOGGLEQUALITY '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_TOGGLEQUALITY); } + + | GOTOFRAME '(' INTEGER ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_GOTOFRAME); + bufferWriteS16($$, 2); + bufferWriteS16($$, $3); } + + | GOTOFRAME '(' STRING ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_GOTOLABEL); + bufferWriteS16($$, strlen($3)+1); + bufferWriteHardString($$, (byte*)$3, strlen($3)+1); + free($3); } + + | GOTOFRAME '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_GOTOEXPRESSION); + bufferWriteS16($$, 1); + bufferWriteU8($$, 0); } /* XXX - and stop */ + + | SETTARGET '(' STRING ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_SETTARGET); + bufferWriteS16($$, strlen($3)+1); + bufferWriteHardString($$, (byte*)$3, strlen($3)+1); + free($3); } + + | SETTARGET '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_SETTARGETEXPRESSION); } + + + ; + + +function_call + : IDENTIFIER '(' expr_list ')' + { $$ = $3.buffer; + bufferWriteInt($$, $3.count); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteOp($$, SWFACTION_CALLFUNCTION); + free($1); } + + | EVAL '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_GETVARIABLE); } + + | GETTIMER '(' ')' + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_GETTIMER); } + + | RANDOM '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_RANDOM); } + + | LENGTH '(' expr_or_obj ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_STRINGLENGTH); } + + | INT '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_INT); } + + | ORD '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_ORD); } + + | CHR '(' expr ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_CHR); } + + | CONCAT '(' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferWriteOp($$, SWFACTION_STRINGCONCAT); } + + | SUBSTRING '(' expr ',' expr ',' expr ')' + { $$ = $3; + bufferConcat($$, $5); + bufferConcat($$, $7); + bufferWriteOp($$, SWFACTION_SUBSTRING); } + + | TYPEOF '(' expr_or_obj ')' + { $$ = $3; + bufferWriteOp($$, SWFACTION_TYPEOF); } + + ; + + +expr_list + : /* empty */ + { $$.buffer = newBuffer(); + $$.count = 0; } + + | expr_or_obj + { $$.buffer = $1; + $$.count = 1; } + + /* goes backwards. rrgh. */ + | expr_list ',' expr_or_obj + { Buffer tmp = newBuffer(); + bufferConcat(tmp, $3); + bufferConcat(tmp, $$.buffer); + $$.buffer = tmp; + ++$$.count; } + ; + +anon_function_decl + : function_init '(' formals_list ')' stmt + { $$ = newBuffer(); + bufferWriteOp($$, SWFACTION_DEFINEFUNCTION); + bufferWriteS16($$, bufferLength($3.buffer) + 5); + bufferWriteU8($$, 0); /* empty function name */ + bufferWriteS16($$, $3.count); + bufferConcat($$, $3.buffer); + bufferWriteS16($$, bufferLength($5)); + bufferConcat($$, $5); + delctx(CTX_FUNCTION); } + ; + +method_call + : lvalue_expr '.' identifier '(' expr_list ')' + { $$ = $5.buffer; + bufferWriteInt($$, $5.count); + bufferConcat($$, $1); + bufferWriteString($$, $3, strlen($3)+1); + bufferWriteOp($$, SWFACTION_CALLMETHOD); + free($3); } + + | lvalue_expr '[' expr ']' '(' expr_list ')' + { $$ = $6.buffer; + bufferWriteInt($$, $6.count); + bufferConcat($$, $1); + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_CALLMETHOD); } + ; + +objexpr + : identifier ':' expr_or_obj + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferConcat($$, $3); } + ; + +objexpr_list + : objexpr + { $$.buffer = $1; + $$.count = 1; } + + | objexpr_list ',' objexpr + { bufferConcat($$.buffer, $3); + ++$$.count; } + ; + +assignop + : "+=" { $$ = SWFACTION_NEWADD; } + | "-=" { $$ = SWFACTION_SUBTRACT; } + | "*=" { $$ = SWFACTION_MULTIPLY; } + | "/=" { $$ = SWFACTION_DIVIDE; } + | "%=" { $$ = SWFACTION_MODULO; } + | "&=" { $$ = SWFACTION_BITWISEAND; } + | "|=" { $$ = SWFACTION_BITWISEOR; } + | "^=" { $$ = SWFACTION_BITWISEXOR; } + | "<<=" { $$ = SWFACTION_SHIFTLEFT; } + | ">>=" { $$ = SWFACTION_SHIFTRIGHT; } + | ">>>=" { $$ = SWFACTION_SHIFTRIGHT2; } + ; + +incdecop + : "++" { $$ = SWFACTION_INCREMENT; } + | "--" { $$ = SWFACTION_DECREMENT; } + ; + + +/* +integer + : '-' INTEGER %prec UMINUS { $$ = -$2; } + | INTEGER { $$ = $1; } + ; + +double + : '-' DOUBLE %prec UMINUS { $$ = -$2; } + | DOUBLE { $$ = $1; } + ; +*/ + +/* resolves an lvalue into a buffer */ +lvalue_expr + : lvalue + { if($1.obj) + { + $$ = $1.obj; + + if($1.ident) + bufferConcat($$, $1.ident); + else + bufferConcat($$, $1.memexpr); + + bufferWriteOp($$, SWFACTION_GETMEMBER); + } + else + { + $$ = $1.ident; + bufferWriteOp($$, SWFACTION_GETVARIABLE); + } + } + | function_call + | method_call + ; + +/* lvalue - things you can assign to */ +lvalue + : identifier + { $$.ident = newBuffer(); + bufferWriteString($$.ident, $1, strlen($1)+1); + free($1); + $$.obj = 0; + $$.memexpr = 0; } + + | lvalue_expr '.' identifier %prec '.' + { $$.obj = $1; + $$.ident = newBuffer(); + bufferWriteString($$.ident, $3, strlen($3)+1); + $$.memexpr = 0; } + + | lvalue_expr '[' expr ']' %prec '.' + { $$.obj = $1; + $$.memexpr = $3; + $$.ident = 0; } + ; + +/* these leave a value on the stack */ + +expr + : primary + + | '-' expr %prec UMINUS + { $$ = $2; + bufferWriteInt($2, -1); + bufferWriteOp($2, SWFACTION_MULTIPLY); } + + | '~' expr %prec UMINUS + { $$ = $2; + bufferWriteInt($2, 0xffffffff); + bufferWriteOp($2, SWFACTION_BITWISEXOR); } + + | '!' expr + { $$ = $2; + bufferWriteOp($2, SWFACTION_LOGICALNOT); } + + | expr "||" expr + { $$ = $1; + bufferWriteOp($$, SWFACTION_DUP); + bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($3)+1); + bufferWriteOp($$, SWFACTION_POP); + bufferConcat($$, $3); } + + | expr "&&" expr + { $$ = $1; + bufferWriteOp($$, SWFACTION_DUP); + bufferWriteOp($$, SWFACTION_LOGICALNOT); + bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($$, 2); + bufferWriteS16($$, bufferLength($3)+1); + bufferWriteOp($$, SWFACTION_POP); + bufferConcat($$, $3); } + + | expr '*' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_MULTIPLY); } + + | expr '/' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_DIVIDE); } + + | expr '%' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_MODULO); } + + | expr '+' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_NEWADD); } + + | expr '-' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_SUBTRACT); } + + | expr '&' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_BITWISEAND); } + + | expr '|' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_BITWISEOR); } + + | expr '^' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_BITWISEXOR); } + + | expr '<' expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_NEWLESSTHAN); } + + | expr '>' expr + { $$ = $3; + bufferConcat($$, $1); + bufferWriteOp($$, SWFACTION_NEWLESSTHAN); } + + | expr "<=" expr + { $$ = $3; + bufferConcat($$, $1); + bufferWriteOp($$, SWFACTION_NEWLESSTHAN); + bufferWriteOp($$, SWFACTION_LOGICALNOT); } + + | expr ">=" expr + { bufferConcat($1, $3); + bufferWriteOp($1, SWFACTION_NEWLESSTHAN); + bufferWriteOp($1, SWFACTION_LOGICALNOT); } + + | expr "==" expr + { bufferConcat($1, $3); + bufferWriteOp($1, SWFACTION_NEWEQUALS); } + + | expr "!=" expr + { bufferConcat($1, $3); + bufferWriteOp($1, SWFACTION_NEWEQUALS); + bufferWriteOp($1, SWFACTION_LOGICALNOT); } + + | expr "<<" expr + { bufferConcat($1, $3); + bufferWriteOp($1, SWFACTION_SHIFTLEFT); } + + | expr ">>" expr + { bufferConcat($1, $3); + bufferWriteOp($1, SWFACTION_SHIFTRIGHT); } + + | expr ">>>" expr + { bufferConcat($1, $3); + bufferWriteOp($1, SWFACTION_SHIFTRIGHT2); } + + | expr '?' expr ':' expr + { bufferWriteOp($1, SWFACTION_BRANCHIFTRUE); + bufferWriteS16($1, 2); + bufferWriteS16($1, bufferLength($5)+5); + bufferConcat($1, $5); + bufferWriteOp($1, SWFACTION_BRANCHALWAYS); + bufferWriteS16($1, 2); + bufferWriteS16($1, bufferLength($3)); + bufferConcat($1, $3); } + + | lvalue '=' expr_or_obj + { if($1.obj) /* obj[memexpr] or obj.ident */ + { + $$ = $1.obj; + + if($1.ident) + bufferConcat($$, $1.ident); + else + bufferConcat($$, $1.memexpr); + + bufferConcat($$, $3); + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SETMEMBER); + bufferWriteRegister($$, 0); + } + else /* just ident */ + { + $$ = $3; + bufferWriteOp($$, SWFACTION_DUP); + bufferConcat($$, $1.ident); + bufferWriteOp($$, SWFACTION_SWAP); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } +/* tricky case missing here: lvalue ASSIGN expr */ +/* like in x = y += z; */ + } + + | expr INSTANCEOF lvalue_expr + { $$ = $1; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_INSTANCEOF); } + + ; + +expr_or_obj + : expr + + | NEW identifier + { $$ = newBuffer(); + bufferWriteInt($$, 0); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteOp($$, SWFACTION_NEW); } + + | NEW identifier '(' expr_list ')' + { $$ = $4.buffer; + bufferWriteInt($$, $4.count); + bufferWriteString($$, $2, strlen($2)+1); + bufferWriteOp($$, SWFACTION_NEW); } + + | '[' expr_list ']' + { $$ = $2.buffer; + bufferWriteInt($$, $2.count); + bufferWriteOp($$, SWFACTION_INITARRAY); } + + | emptybraces + { $$ = newBuffer(); + bufferWriteInt($$, 0); + bufferWriteOp($$, SWFACTION_INITOBJECT); } + + | '{' objexpr_list '}' + { $$ = $2.buffer; + bufferWriteInt($$, $2.count); + bufferWriteOp($$, SWFACTION_INITOBJECT); } + + ; + +primary + : function_call + + | anon_function_decl + + | method_call + + | lvalue_expr + + | incdecop lvalue %prec "++" + { if($2.obj) + { + if($2.ident) // expr . identifier + { + $$ = $2.obj; + bufferWriteOp($$, SWFACTION_DUP); /* a, a */ + bufferWriteBuffer($$, $2.ident); /* a, a, i */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a */ + bufferConcat($$, $2.ident); /* a, i, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); + bufferWriteOp($$, $1); + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ + bufferWriteRegister($$, 0); /* a.i+1 */ + } + else // expr [ expr ] + { + $$ = $2.memexpr; /* i */ + bufferConcat($$, $2.obj); /* i, a */ + bufferWriteSetRegister($$, 0); /* ($2.memexpr can use reg0) */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ + bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister($$, 0); /* a, i, i, a */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteOp($$, $1); /* a, i, a[i]+1 */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ + bufferWriteRegister($$, 0); /* a[i]+1 */ + } + } + else // identifier + { + $$ = newBuffer(); + bufferWriteBuffer($$, $2.ident); + bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteOp($$, $1); + bufferWriteOp($$, SWFACTION_DUP); + bufferConcat($$, $2.ident); + bufferWriteOp($$, SWFACTION_SWAP); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } + } + + | lvalue incdecop %prec POSTFIX + { if($1.obj) + { + if($1.ident) + { + $$ = $1.obj; /* a */ + bufferWriteOp($$, SWFACTION_DUP); /* a, a */ + bufferWriteBuffer($$, $1.ident); /* a, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SWAP); /* a.i, a */ + bufferConcat($$, $1.ident); /* a.i, a, i */ + bufferWriteRegister($$, 0); /* a.i, a, i, a.i */ + bufferWriteOp($$, $2); /* a.i, a, i, a.i+1 */ + bufferWriteOp($$, SWFACTION_SETMEMBER); + } + else + { + $$ = $1.memexpr; + bufferConcat($$, $1.obj); /* i, a */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ + bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister($$, 0); /* a, i, i, a */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, $2); /* a, i, a[i]+1 */ + bufferWriteOp($$, SWFACTION_SETMEMBER); + bufferWriteRegister($$, 0); /* a[i] */ + } + } + else + { + $$ = newBuffer(); + bufferWriteBuffer($$, $1.ident); + bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteOp($$, SWFACTION_DUP); + bufferWriteOp($$, $2); + bufferConcat($$, $1.ident); + bufferWriteOp($$, SWFACTION_SWAP); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } + } + + | '(' expr ')' + { $$ = $2; } + + | '-' INTEGER %prec UMINUS + { $$ = newBuffer(); + bufferWriteInt($$, -$2); } + + | INTEGER + { $$ = newBuffer(); + bufferWriteInt($$, $1); } + + | '-' DOUBLE %prec UMINUS + { $$ = newBuffer(); + bufferWriteDouble($$, -$2); } + + | DOUBLE + { $$ = newBuffer(); + bufferWriteDouble($$, $1); } + + | BOOLEAN + { $$ = newBuffer(); + bufferWriteBoolean($$, $1); } + + | NULLVAL + { $$ = newBuffer(); + bufferWriteNull($$); } + + | STRING + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + free($1); } + ; + +init_vars + : init_var + + | init_vars ',' init_var + { $$ = $1; + bufferConcat($$, $3); } + ; + +init_var + : identifier '=' expr_or_obj + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_VAREQUALS); } + + | identifier + { $$ = newBuffer(); + bufferWriteString($$, $1, strlen($1)+1); + bufferWriteOp($$, SWFACTION_VAR); } + ; + +assign_stmt + : ASM '{' + { asmBuffer = newBuffer(); } + opcode_list '}' + { $$ = asmBuffer; } + + | VAR init_vars + { $$ = $2; } + + | void_function_call + + | function_call + { $$ = $1; + bufferWriteOp($$, SWFACTION_POP); } + + | method_call + { $$ = $1; + bufferWriteOp($$, SWFACTION_POP); } + + | incdecop lvalue %prec INCR + { if($2.obj) + { + if($2.ident) + { + $$ = $2.obj; /* a */ + bufferWriteOp($$, SWFACTION_DUP); /* a, a */ + bufferWriteBuffer($$, $2.ident); /* a, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ + bufferWriteOp($$, $1); /* a, a.i+1 */ + bufferConcat($$, $2.ident); /* a, a.i+1, i */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a.i+1 */ + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ + } + else + { + /* weird contortions so that $2.memexpr can use reg 0 */ + $$ = $2.memexpr; /* i */ + bufferConcat($$, $2.obj); /* i, a */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ + bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister($$, 0); /* a, i, i, a */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteOp($$, $1); /* a, i, a[i]+1 */ + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ + } + } + else + { + $$ = $2.ident; + bufferWriteOp($$, SWFACTION_DUP); + bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteOp($$, $1); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } + } + + | lvalue incdecop %prec POSTFIX + { if($1.obj) + { + if($1.ident) + { + $$ = $1.obj; /* a */ + bufferWriteOp($$, SWFACTION_DUP); /* a, a */ + bufferWriteBuffer($$, $1.ident); /* a, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ + bufferWriteOp($$, $2); /* a, a.i+1 */ + bufferConcat($$, $1.ident); /* a, a.i+1, i */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a.i+1 */ + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ + } + else + { + /* weird contortions so that $1.memexpr can use reg 0 */ + $$ = $1.memexpr; /* i */ + bufferConcat($$, $1.obj); /* i, a */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ + bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister($$, 0); /* a, i, i, a */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferWriteOp($$, $2); /* a, i, a[i]+1 */ + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ + } + } + else + { + $$ = $1.ident; + bufferWriteOp($$, SWFACTION_DUP); + bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferWriteOp($$, $2); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } + } + + | lvalue '=' expr_or_obj + { if($1.obj) + { + $$ = $1.obj; + + if($1.ident) + bufferConcat($$, $1.ident); + else + bufferConcat($$, $1.memexpr); + + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_SETMEMBER); + } + else + { + $$ = $1.ident; + bufferConcat($$, $3); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } + } + + | lvalue assignop expr + { if($1.obj) + { + if($1.ident) + { + $$ = $1.obj; /* a */ + bufferWriteOp($$, SWFACTION_DUP); /* a, a */ + bufferWriteBuffer($$, $1.ident); /* a, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ + bufferConcat($$, $3); /* a, a.i, v */ + bufferWriteOp($$, $2); /* a, a.i+v */ + bufferConcat($$, $1.ident); /* a, a.i+v, i */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a.i+v */ + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+v */ + } + else + { + $$ = $1.memexpr; /* i */ + bufferConcat($$, $1.obj); /* i, a */ + bufferWriteSetRegister($$, 0); + bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ + bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ + bufferWriteRegister($$, 0); /* a, i, i, a */ + bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ + bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ + bufferConcat($$, $3); /* a, i, a[i], v */ + bufferWriteOp($$, $2); /* a, i, a[i]+v */ + bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+v */ + } + } + else + { + $$ = $1.ident; + bufferWriteOp($$, SWFACTION_DUP); + bufferWriteOp($$, SWFACTION_GETVARIABLE); + bufferConcat($$, $3); + bufferWriteOp($$, $2); + bufferWriteOp($$, SWFACTION_SETVARIABLE); + } + } + ; + +/* assembler stuff */ + +opcode_list + : opcode + | opcode_list opcode { $$ = $1 + $2; } + ; + +with + : WITH + { $$ = bufferWriteOp(asmBuffer, + SWFACTION_WITH); } + opcode_list END { $$ = $2 + $3; + bufferPatchLength(asmBuffer, $3); } + ; + +push_item + : STRING { $$ = bufferWriteConstantString(asmBuffer,(byte*) $1, + strlen($1)+1); } + + | INTEGER { bufferWriteU8(asmBuffer, PUSH_INT); + $$ = bufferWriteInt(asmBuffer, $1)+1; } + + | DOUBLE { bufferWriteU8(asmBuffer, PUSH_DOUBLE); + $$ = bufferWriteDouble(asmBuffer, $1)+1; } + + | BOOLEAN { bufferWriteU8(asmBuffer, PUSH_BOOLEAN); + $$ = bufferWriteU8(asmBuffer, $1)+1; } + + | NULLVAL { $$ = bufferWriteU8(asmBuffer, PUSH_NULL); } + + | REGISTER { bufferWriteU8(asmBuffer, PUSH_REGISTER); + $$ = bufferWriteU8(asmBuffer, + (char)atoi($1))+1; } + ; + + +push_list + : push_item { $$ = $1; } + | push_list ',' push_item { $$ += $3; } + ; + +opcode + : PUSH { $$ = bufferWriteOp(asmBuffer, + SWFACTION_PUSHDATA); + $$ += bufferWriteS16(asmBuffer, 0); } + push_list { $$ = $2 + $3; + bufferPatchLength(asmBuffer, $3); } + + | with + + | SETREGISTER REGISTER + { $$ = bufferWriteOp(asmBuffer, + SWFACTION_SETREGISTER); + $$ += bufferWriteS16(asmBuffer, 1); + $$ += bufferWriteU8(asmBuffer, + (char)atoi($2)); } + /* no args */ + | CALLFUNCTION { $$ = bufferWriteOp(asmBuffer, + SWFACTION_CALLFUNCTION); } + | RETURN { $$ = bufferWriteOp(asmBuffer, + SWFACTION_RETURN); } + | CALLMETHOD { $$ = bufferWriteOp(asmBuffer, + SWFACTION_CALLMETHOD); } + | AND { $$ = bufferWriteOp(asmBuffer, + SWFACTION_BITWISEAND); } + | OR { $$ = bufferWriteOp(asmBuffer, + SWFACTION_BITWISEOR); } + | XOR { $$ = bufferWriteOp(asmBuffer, + SWFACTION_BITWISEXOR); } + | MODULO { $$ = bufferWriteOp(asmBuffer, + SWFACTION_MODULO); } + | ADD { $$ = bufferWriteOp(asmBuffer, + SWFACTION_NEWADD); } + | LESSTHAN { $$ = bufferWriteOp(asmBuffer, + SWFACTION_NEWLESSTHAN); } + | EQUALS { $$ = bufferWriteOp(asmBuffer, + SWFACTION_NEWEQUALS); } + | INC { $$ = bufferWriteOp(asmBuffer, + SWFACTION_INCREMENT); } + | DEC { $$ = bufferWriteOp(asmBuffer, + SWFACTION_DECREMENT); } + | TYPEOF { $$ = bufferWriteOp(asmBuffer, + SWFACTION_TYPEOF); } + | INSTANCEOF { $$ = bufferWriteOp(asmBuffer, + SWFACTION_INSTANCEOF); } + | ENUMERATE { $$ = bufferWriteOp(asmBuffer, + SWFACTION_ENUMERATE); } + | DELETE { $$ = bufferWriteOp(asmBuffer, + SWFACTION_DELETE); } + | NEW { $$ = bufferWriteOp(asmBuffer, + SWFACTION_NEW); } + | INITARRAY { $$ = bufferWriteOp(asmBuffer, + SWFACTION_INITARRAY); } + | INITOBJECT { $$ = bufferWriteOp(asmBuffer, + SWFACTION_INITOBJECT); } + | GETMEMBER { $$ = bufferWriteOp(asmBuffer, + SWFACTION_GETMEMBER); } + | SETMEMBER { $$ = bufferWriteOp(asmBuffer, + SWFACTION_SETMEMBER); } + | SHIFTLEFT { $$ = bufferWriteOp(asmBuffer, + SWFACTION_SHIFTLEFT); } + | SHIFTRIGHT { $$ = bufferWriteOp(asmBuffer, + SWFACTION_SHIFTRIGHT); } + | SHIFTRIGHT2 { $$ = bufferWriteOp(asmBuffer, + SWFACTION_SHIFTRIGHT2); } + | VAR { $$ = bufferWriteOp(asmBuffer, + SWFACTION_VAR); } + | VAREQUALS { $$ = bufferWriteOp(asmBuffer, + SWFACTION_VAREQUALS); } + + /* f4 ops */ + | OLDADD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ADD); } + | SUBTRACT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBTRACT); } + | MULTIPLY { $$ = bufferWriteOp(asmBuffer, SWFACTION_MULTIPLY); } + | DIVIDE { $$ = bufferWriteOp(asmBuffer, SWFACTION_DIVIDE); } + | OLDEQUALS { $$ = bufferWriteOp(asmBuffer, SWFACTION_EQUAL); } + | OLDLESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_LESSTHAN); } + | LOGICALAND { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALAND); } + | LOGICALOR { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALOR); } + | NOT { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALNOT); } + | STRINGEQ { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGEQ); } + | STRINGLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGLENGTH); } + | SUBSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBSTRING); } + | INT { $$ = bufferWriteOp(asmBuffer, SWFACTION_INT); } + | DUP { $$ = bufferWriteOp(asmBuffer, SWFACTION_DUP); } + | SWAP { $$ = bufferWriteOp(asmBuffer, SWFACTION_SWAP); } + | POP { $$ = bufferWriteOp(asmBuffer, SWFACTION_POP); } + | GETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETVARIABLE); } + | SETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETVARIABLE); } + | SETTARGETEXPRESSION { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETTARGETEXPRESSION); } + | CONCAT { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCONCAT); } + | DUPLICATEMOVIECLIP { $$ = bufferWriteOp(asmBuffer, SWFACTION_DUPLICATECLIP); } + | REMOVEMOVIECLIP { $$ = bufferWriteOp(asmBuffer, SWFACTION_REMOVECLIP); } + | TRACE { $$ = bufferWriteOp(asmBuffer, SWFACTION_TRACE); } + | STRINGLESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCOMPARE); } + | RANDOM { $$ = bufferWriteOp(asmBuffer, SWFACTION_RANDOM); } + | MBLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBLENGTH); } + | ORD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ORD); } + | CHR { $$ = bufferWriteOp(asmBuffer, SWFACTION_CHR); } + | GETTIMER { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETTIMER); } + | MBSUBSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBSUBSTRING); } + | MBORD { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBORD); } + | MBCHR { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBCHR); } + + /* with args */ + | BRANCHALWAYS STRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_BRANCHALWAYS); + $$ += bufferWriteS16(asmBuffer, 2); + $$ += bufferBranchTarget(asmBuffer, $2); } + + | BRANCHIFTRUE STRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_BRANCHIFTRUE); + $$ += bufferWriteS16(asmBuffer, 2); + $$ += bufferBranchTarget(asmBuffer, $2); } + ; + +%% + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/args.h b/fluidbook/tools/swftools-special-swfdump/lib/args.h new file mode 100644 index 000000000..c0350e4a0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/args.h @@ -0,0 +1,250 @@ +/* args.h + Routines to simplify argument handling + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __args_h__ +#define __args_h__ + +#ifndef NO_ARGPARSER + +extern int args_callback_option(char*,char*); +extern int args_callback_longoption(char*,char*); +extern int args_callback_command(char*,char*); +extern void args_callback_usage(char*name); + +//int argn; +//char**argv; + +static void processargs(int argn2,char**argv2) +{ + int t; + if(argn2==1) + { + args_callback_usage(argv2[0]); + exit(1); + } + for(t=1;t2) { + fprintf(stderr, "internal error in command line parsing\n"); + exit(1); + } + t+=num; + } + } +} + +struct options_t +{ + const char*shortoption; + const char*longoption; +}; + +static int args_long2shortoption(struct options_t*options, char*name, char*val) +{ + char*equal = strchr(name,'='); + if (equal) { + *equal = 0; + equal++; + } + while(options->shortoption) { + if(!strcmp(options->longoption, name)) { + char*tmp = (char*)malloc(strlen(options->shortoption) + +(equal?strlen(equal)+2:2)); + strcpy(tmp, options->shortoption); + if(equal) { + //strcpy(&tmp[strlen(tmp)], equal); + int ret = args_callback_option(tmp, equal); + if(!ret) { + fprintf(stderr, "Warning: Option --%s takes no parameter.\n", name); + } + return 0; + } + return args_callback_option(tmp,val); + } + options++; + } + fprintf(stderr, "Unknown option: --%s\n", name); + exit(1); +} + +#endif + +/* check whether the value t is in a given range. + examples: 3 is in range 1-10: true + 7 is in range 2-4,6,8-10: false + 9 is in range 1,2,3-12: true +*/ +static char is_in_range(int t, char*irange) +{ + char*pos = irange; + char*digits; + int num; + char range = 0; + int last=0; + char tmp; + + if(!irange) // no range resembles (-OO,OO) + return 1; + + while(*pos) + { + while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t') + pos++; + + digits = pos; + while(*digits>='0' && *digits<='9') + digits++; + if(digits == pos) { + fprintf(stderr, "Error: \"%s\" is not a valid format (digit expected)\n",irange); + exit(1); + } + + tmp=*digits;*digits=0; + num = atoi(pos); + *digits=tmp; + pos = digits; + + while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t') + pos++; + + if(range && last<=t && num>=t) + return 1; + if(range) { + range = 0; + if(*pos) + pos ++; + continue; + } + + if(*pos=='-') + { + if(range) { + fprintf(stderr, "Error: \"%s\" is not a valid format (too many '-'s)\n",irange); + exit(1); + } + last = num; + range = 1; + if(*pos) + pos ++; + continue; + } + else + { + /* if it isn't a '-', we assume it is a seperator like + ',', ';', ':', whatever. */ + if(t == num) + return 1; + if(*pos) + pos ++; + continue; + } + } + if(range && last<=t) + return 1; + return 0; +} + +static char* filename2template(char*filename, int*startindex) +{ + int l = strlen(filename); + char*newname = (char*)malloc(l+5); + /* first look whether the file is already numbered */ + while(1) { + l--; + if(l<0 || strchr("0123456789", filename[l])) + break; + }; + if(l>=0) { + int lastdigit=l; + int firstdigit=l; + while(firstdigit && strchr("0123456789", filename[firstdigit-1])) + firstdigit--; + *startindex = atoi(filename+firstdigit); + memcpy(newname, filename, firstdigit); + sprintf(newname+firstdigit, "%%%dd", lastdigit+1-firstdigit); + strcat(newname+firstdigit, filename+lastdigit+1); + return newname; + } + /* if it isn't, try to paste a %d between filename and extension */ + char*dot = strrchr(filename, '.'); + if(dot) { + int pos = dot-filename; + memcpy(newname, filename, pos); + newname[pos++] = '.'; + newname[pos++] = '%'; + newname[pos++] = 'd'; + strcpy(newname+pos, dot); + *startindex = 1; + return newname; + } + /* if that didn't work either, just append the number at the end */ + strcpy(newname, filename); + strcat(newname, ".%d"); + *startindex = 1; + return newname; +} + +#endif //__args_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c new file mode 100644 index 000000000..171de47bf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c @@ -0,0 +1,1347 @@ +/* abc.c + + Routines for handling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../rfxswf.h" +#include "../q.h" +#include "abc.h" +#include "assets.h" + +char stringbuffer[2048]; + +int abc_RegisterNameSpace(abc_file_t*file, const char*name); +int abc_RegisterPackageNameSpace(abc_file_t*file, const char*name); +int abc_RegisterPackageInternalNameSpace(abc_file_t*file, const char*name); +int abc_RegisterProtectedNameSpace(abc_file_t*file, const char*name); +int abc_RegisterExplicitNameSpace(abc_file_t*file, const char*name); +int abc_RegisterStaticProtectedNameSpace(abc_file_t*file, const char*name); +int abc_RegisterPrivateNameSpace(abc_file_t*file, const char*name); + +/* TODO: switch to a datastructure with just values */ +#define NO_KEY "" + +static void params_dump(FILE*fo, multiname_list_t*l, constant_list_t*o) +{ + int n = list_length(l); + int no = list_length(o); + int i = 0; + + fprintf(fo, "("); + while(l) { + char*s = multiname_tostring(l->multiname); + fprintf(fo, "%s", s); + free(s); + if(i>=n-no) { + s = constant_tostring(o->constant); + fprintf(fo, " = "); + fprintf(fo, "%s", s); + free(s); + o = o->next; + } + + if(l->next) + fprintf(fo, ", "); + l = l->next;i++; + } + fprintf(fo, ")"); +} + +//#define DEBUG +#define DEBUG if(0) + +static void parse_metadata(TAG*tag, abc_file_t*file, pool_t*pool) +{ + int t; + int num_metadata = swf_GetU30(tag); + + DEBUG printf("%d metadata\n", num_metadata); + for(t=0;tmetadata, entry_name, items); + } +} + +void swf_CopyData(TAG*to, TAG*from, int len) +{ + unsigned char*data = malloc(len); + swf_GetBlock(from, data, len); + swf_SetBlock(to, data, len); + free(data); +} + +abc_file_t*abc_file_new() +{ + abc_file_t*f = malloc(sizeof(abc_file_t)); + memset(f, 0, sizeof(abc_file_t)); + f->metadata = array_new(); + + f->methods = array_new(); + f->classes = array_new(); + f->scripts = array_new(); + f->method_bodies = array_new(); + f->flags = ABCFILE_LAZY; + + return f; +} + +abc_class_t* abc_class_new(abc_file_t*file, multiname_t*classname, multiname_t*superclass) { + + NEW(abc_class_t,c); + if(file) + array_append(file->classes, NO_KEY, c); + + c->file = file; + c->classname = multiname_clone(classname); + c->superclass = multiname_clone(superclass); + c->flags = 0; + c->constructor = 0; + c->static_constructor = 0; + c->traits = list_new(); + return c; +} +abc_class_t* abc_class_new2(abc_file_t*pool, char*classname, char*superclass) +{ + return abc_class_new(pool, multiname_fromstring(classname), multiname_fromstring(superclass)); +} + +void abc_class_sealed(abc_class_t*c) +{ + c->flags |= CLASS_SEALED; +} +void abc_class_final(abc_class_t*c) +{ + c->flags |= CLASS_FINAL; +} +void abc_class_interface(abc_class_t*c) +{ + c->flags |= CLASS_INTERFACE; +} +void abc_class_protectedNS(abc_class_t*c, char*namespace) +{ + c->protectedNS = namespace_new_protected(namespace); + c->flags |= CLASS_PROTECTED_NS; +} +void abc_class_add_interface(abc_class_t*c, multiname_t*interface) +{ + list_append(c->interfaces, multiname_clone(interface)); +} +char*abc_class_fullname(abc_class_t*cls) +{ + const char*package = cls->classname->ns->name; + const char*name = cls->classname->name; + int l1 = strlen(package); + int l2 = strlen(name); + char*fullname = malloc(l1+l2+2); + if(l1) { + memcpy(fullname, package, l1); + fullname[l1++]='.'; + } + memcpy(fullname+l1, name, l2+1); + return fullname; +} + +void abc_method_init(abc_method_t*m, abc_file_t*file, multiname_t*returntype, char body) +{ + /* construct method object */ + m->index = array_length(file->methods); + array_append(file->methods, NO_KEY, m); + m->return_type = returntype; + + if(body) { + /* construct code (method body) object */ + NEW(abc_method_body_t,c); + array_append(file->method_bodies, NO_KEY, c); + c->index = array_length(file->method_bodies); + c->file = file; + c->traits = list_new(); + c->code = 0; + + /* crosslink the two objects */ + m->body = c; + c->method = m; + } +} +abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) +{ + NEW(abc_method_t,m); + abc_method_init(m, file, returntype, body); + return m; +} + +abc_method_t* abc_class_getconstructor(abc_class_t*cls, multiname_t*returntype) +{ + if(cls->constructor) { + return cls->constructor; + } + abc_method_t* m = abc_method_new(cls->file, returntype, 1); + cls->constructor = m; + return m; +} + +abc_method_t* abc_class_getstaticconstructor(abc_class_t*cls, multiname_t*returntype) +{ + if(cls->static_constructor) { + return cls->static_constructor; + } + abc_method_t* m = abc_method_new(cls->file, returntype, 1); + cls->static_constructor = m; + return m; +} + +trait_t*trait_new(int type, multiname_t*name, int data1, int data2, constant_t*v) +{ + trait_t*trait = malloc(sizeof(trait_t)); + memset(trait, 0, sizeof(trait_t)); + trait->kind = type&0x0f; + trait->attributes = type&0xf0; + trait->name = name; + trait->data1 = data1; + trait->data2 = data2; + trait->value = v; + return trait; +} + +trait_t*trait_new_member(trait_list_t**traits, multiname_t*type, multiname_t*name,constant_t*v) +{ + int kind = TRAIT_SLOT; + trait_t*trait = malloc(sizeof(trait_t)); + memset(trait, 0, sizeof(trait_t)); + trait->kind = kind&0x0f; + trait->attributes = kind&0xf0; + trait->name = name; + trait->type_name = type; + + trait->slot_id = list_length(*traits)+1; + trait_list_t*l = *traits; + list_append_(traits, trait); + return trait; +} +trait_t*trait_new_method(trait_list_t**traits, multiname_t*name, abc_method_t*m) +{ + int type = TRAIT_METHOD; + trait_t*trait = malloc(sizeof(trait_t)); + memset(trait, 0, sizeof(trait_t)); + trait->kind = type&0x0f; + trait->attributes = type&0xf0; + trait->name = name; + trait->method = m; + + /* start assigning traits at position #1. + Weird things happen when assigning slot 0- slot 0 and 1 seem + to be identical */ + trait->slot_id = list_length(*traits)+1; + list_append_(traits, trait); + return trait; +} + +abc_method_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, multiname_t*name) +{ + abc_file_t*file = cls->file; + abc_method_t* m = abc_method_new(cls->file, returntype, !(cls->flags&CLASS_INTERFACE)); + m->trait = trait_new_method(&cls->traits, multiname_clone(name), m); + return m; +} +abc_method_t* abc_class_staticmethod(abc_class_t*cls, multiname_t*returntype, multiname_t*name) +{ + abc_file_t*file = cls->file; + abc_method_t* m = abc_method_new(cls->file, returntype, !(cls->flags&CLASS_INTERFACE)); + m->trait = trait_new_method(&cls->static_traits, multiname_clone(name), m); + return m; +} + +trait_t* abc_class_slot(abc_class_t*cls, multiname_t*name, multiname_t*type) +{ + abc_file_t*file = cls->file; + multiname_t*m_name = multiname_clone(name); + multiname_t*m_type = multiname_clone(type); + trait_t*t = trait_new_member(&cls->traits, m_type, m_name, 0); + return t; +} +trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*type) +{ + abc_file_t*file = cls->file; + multiname_t*m_name = multiname_clone(name); + multiname_t*m_type = multiname_clone(type); + trait_t*t = trait_new_member(&cls->static_traits, m_type, m_name, 0); + return t; +} + + +trait_t* traits_find_slotid(trait_list_t*traits, int slotid) +{ + trait_list_t*l; + trait_t*t=0; + for(l=traits;l;l=l->next) { + if(l->trait->slot_id==slotid) { + t=l->trait; + break; + } + } + return t; +} + +void abc_method_body_addClassTrait(abc_method_body_t*code, char*multiname, int slotid, abc_class_t*cls) +{ + abc_file_t*file = code->file; + multiname_t*m = multiname_fromstring(multiname); + trait_t*trait = trait_new(TRAIT_CLASS, m, slotid, 0, 0); + trait->cls = cls; + list_append(code->traits, trait); +} + +/* notice: traits of a method (body) belonging to an init script + and traits of the init script are *not* the same thing */ +trait_t* abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc_class_t*cls) +{ + abc_file_t*file = script->file; + multiname_t*m = multiname_clone(multiname); + int slotid = list_length(script->traits)+1; + trait_t*trait = trait_new(TRAIT_CLASS, m, slotid, 0, 0); + trait->cls = cls; + list_append(script->traits, trait); + return trait; +} + +abc_script_t* abc_initscript(abc_file_t*file) +{ + abc_method_t*m = abc_method_new(file, 0, 1); + abc_script_t* s = malloc(sizeof(abc_script_t)); + s->method = m; + s->traits = list_new(); + s->file = file; + array_append(file->scripts, NO_KEY, s); + return s; +} + +static void traits_dump(FILE*fo, const char*prefix, trait_list_t*traits, abc_file_t*file, dict_t*methods_seen); + +static void dump_method(FILE*fo, const char*prefix, + const char*attr, + const char*type, + const char*name, + abc_method_t*m, abc_file_t*file, dict_t*methods_seen) +{ + if(methods_seen) + dict_put(methods_seen, m, 0); + + char*return_type = 0; + if(m->return_type) + return_type = multiname_tostring(m->return_type); + else + return_type = strdup("*"); + + fprintf(fo, "%s", prefix); + fprintf(fo, "%s %s ", attr, type); + fprintf(fo, "%s %s=%s", return_type, name, m->name); + params_dump(fo, m->parameters, m->optional_parameters); + fprintf(fo, "(%d params, %d optional)\n", list_length(m->parameters), list_length(m->optional_parameters)); + + free(return_type);return_type=0; + + abc_method_body_t*c = m->body; + if(!c) { + return; + } + + fprintf(fo, "%s[stack:%d locals:%d scope:%d-%d flags:", + prefix, c->old.max_stack, c->old.local_count, c->old.init_scope_depth, + c->old.max_scope_depth); + + + int flags = c->method->flags; + if(flags&METHOD_NEED_ARGUMENTS) {fprintf(fo, " need_arguments");flags&=~METHOD_NEED_ARGUMENTS;} + if(flags&METHOD_NEED_ACTIVATION) {fprintf(fo, " need_activation");flags&=~METHOD_NEED_ACTIVATION;} + if(flags&METHOD_NEED_REST) {fprintf(fo, " need_rest");flags&=~METHOD_NEED_REST;} + if(flags&METHOD_HAS_OPTIONAL) {fprintf(fo, " has_optional");flags&=~METHOD_HAS_OPTIONAL;} + if(flags&METHOD_SET_DXNS) {fprintf(fo, " set_dxns");flags&=~METHOD_SET_DXNS;} + if(flags&METHOD_HAS_PARAM_NAMES) {fprintf(fo, " has_param_names");flags&=~METHOD_HAS_PARAM_NAMES;} + if(flags) fprintf(fo, " %02x", flags); + fprintf(fo, "]"); + + if(m->trait) { + fprintf(fo, " slot:%d", m->trait->slot_id); + } + fprintf(fo, "\n"); + + + char prefix2[80]; + sprintf(prefix2, "%s ", prefix); + if(c->traits) + traits_dump(fo, prefix, c->traits, file, methods_seen); + fprintf(fo, "%s{\n", prefix); + code_dump2(c->code, c->exceptions, file, prefix2, fo); + fprintf(fo, "%s}\n\n", prefix); +} + +static void traits_free(trait_list_t*traits) +{ + trait_list_t*t = traits; + while(t) { + if(t->trait->name) { + multiname_destroy(t->trait->name);t->trait->name = 0; + } + if(t->trait->kind == TRAIT_SLOT || t->trait->kind == TRAIT_CONST) { + multiname_destroy(t->trait->type_name); + } + if(t->trait->value) { + constant_free(t->trait->value);t->trait->value = 0; + } + free(t->trait);t->trait = 0; + t = t->next; + } + list_free(traits); +} + +static char trait_is_method(trait_t*trait) +{ + return (trait->kind == TRAIT_METHOD || trait->kind == TRAIT_GETTER || + trait->kind == TRAIT_SETTER || trait->kind == TRAIT_FUNCTION); +} + +static trait_list_t* traits_parse(TAG*tag, pool_t*pool, abc_file_t*file) +{ + int num_traits = swf_GetU30(tag); + trait_list_t*traits = list_new(); + int t; + if(num_traits) { + DEBUG printf("%d traits\n", num_traits); + } + + for(t=0;tname = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); // always a QName (ns,name) + + const char*name = 0; + DEBUG name = multiname_tostring(trait->name); + U8 kind = swf_GetU8(tag); + U8 attributes = kind&0xf0; + kind&=0x0f; + trait->kind = kind; + trait->attributes = attributes; + DEBUG printf(" trait %d) %s type=%02x\n", t, name, kind); + if(kind == TRAIT_METHOD || kind == TRAIT_GETTER || kind == TRAIT_SETTER) { // method / getter / setter + trait->disp_id = swf_GetU30(tag); + trait->method = (abc_method_t*)array_getvalue(file->methods, swf_GetU30(tag)); + trait->method->trait = trait; + DEBUG printf(" method/getter/setter\n"); + } else if(kind == TRAIT_FUNCTION) { // function + trait->slot_id = swf_GetU30(tag); + trait->method = (abc_method_t*)array_getvalue(file->methods, swf_GetU30(tag)); + trait->method->trait = trait; + } else if(kind == TRAIT_CLASS) { // class + trait->slot_id = swf_GetU30(tag); + trait->cls = (abc_class_t*)array_getvalue(file->classes, swf_GetU30(tag)); + DEBUG printf(" class %s %d %p\n", name, trait->slot_id, (int)trait->cls); + } else if(kind == TRAIT_SLOT || kind == TRAIT_CONST) { // slot, const + trait->slot_id = swf_GetU30(tag); + trait->type_name = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); + int vindex = swf_GetU30(tag); + if(vindex) { + int vkind = swf_GetU8(tag); + trait->value = constant_fromindex(pool, vindex, vkind); + } + DEBUG printf(" slot %s %d %s (%s)\n", name, trait->slot_id, trait->type_name->name, constant_tostring(trait->value)); + } else { + fprintf(stderr, "Can't parse trait type %d\n", kind); + } + if(attributes&0x40) { + int num = swf_GetU30(tag); + int s; + for(s=0;sTRAIT_CONST) { + fprintf(stderr, "Can't parse trait type %d\n", kind); + } + if(attributes&0x40) { + int s, num = swf_GetU30(tag); + for(s=0;strait; + + swf_SetU30(tag, pool_register_multiname(pool, trait->name)); + swf_SetU8(tag, trait->kind|trait->attributes); + + swf_SetU30(tag, trait->data1); + + if(trait->kind == TRAIT_CLASS) { + swf_SetU30(tag, trait->cls->index); + } else if(trait->kind == TRAIT_GETTER || + trait->kind == TRAIT_SETTER || + trait->kind == TRAIT_METHOD) { + swf_SetU30(tag, trait->method->index); + } else if(trait->kind == TRAIT_SLOT || + trait->kind == TRAIT_CONST) { + int index = pool_register_multiname(pool, trait->type_name); + swf_SetU30(tag, index); + } else { + swf_SetU30(tag, trait->data2); + } + + if(trait->kind == TRAIT_SLOT || trait->kind == TRAIT_CONST) { + int vindex = constant_get_index(pool, trait->value); + swf_SetU30(tag, vindex); + if(vindex) { + swf_SetU8(tag, trait->value->type); + } + } + if(trait->attributes&0x40) { + // metadata + swf_SetU30(tag, 0); + } + traits = traits->next; + } +} + + +static void traits_dump(FILE*fo, const char*prefix, trait_list_t*traits, abc_file_t*file, dict_t*methods_seen) +{ + int t; + while(traits) { + trait_t*trait = traits->trait; + char*name = multiname_tostring(trait->name); + U8 kind = trait->kind; + U8 attributes = trait->attributes; + + char a = attributes & (TRAIT_ATTR_OVERRIDE|TRAIT_ATTR_FINAL); + char* type = ""; + if(a==TRAIT_ATTR_FINAL) + type = "final "; + else if(a==TRAIT_ATTR_OVERRIDE) + type = "override "; + else if(a==(TRAIT_ATTR_OVERRIDE|TRAIT_ATTR_FINAL)) + type = "final override "; + + if(attributes&TRAIT_ATTR_METADATA) + fprintf(fo, ""); + + if(kind == TRAIT_METHOD) { + abc_method_t*m = trait->method; + dump_method(fo, prefix, type, "method", name, m, file, methods_seen); + } else if(kind == TRAIT_GETTER) { + abc_method_t*m = trait->method; + dump_method(fo, prefix, type, "getter", name, m, file, methods_seen); + } else if(kind == TRAIT_SETTER) { + abc_method_t*m = trait->method; + dump_method(fo, prefix, type, "setter", name, m, file, methods_seen); + } else if(kind == TRAIT_FUNCTION) { // function + abc_method_t*m = trait->method; + dump_method(fo, prefix, type, "function", name, m, file, methods_seen); + } else if(kind == TRAIT_CLASS) { // class + abc_class_t*cls = trait->cls; + if(!cls) { + fprintf(fo, "%sslot %d: class %s=00000000\n", prefix, trait->slot_id, name); + } else { + fprintf(fo, "%sslot %d: class %s=%s\n", prefix, trait->slot_id, name, cls->classname->name); + } + } else if(kind == TRAIT_SLOT || kind == TRAIT_CONST) { // slot, const + int slot_id = trait->slot_id; + char*type_name = multiname_tostring(trait->type_name); + char*value = constant_tostring(trait->value); + fprintf(fo, "%sslot %d: %s %s:%s %s %s\n", prefix, trait->slot_id, + kind==TRAIT_CONST?"const":"var", name, type_name, + trait->value?"=":"", trait->value?value:""); + if(value) free(value); + free(type_name); + } else { + fprintf(fo, "%s can't dump trait type %d\n", prefix, kind); + } + free(name); + traits=traits->next; + } +} + +void* swf_DumpABC(FILE*fo, void*code, char*prefix) +{ + abc_file_t* file = (abc_file_t*)code; + + if(file->name) { + fprintf(fo, "%s#\n", prefix); + fprintf(fo, "%s#name: %s\n", prefix, file->name); + fprintf(fo, "%s#\n", prefix); + } + + int t; + for(t=0;tmetadata->num;t++) { + const char*entry_name = array_getkey(file->metadata, t); + fprintf(fo, "%s#Metadata \"%s\":\n", prefix, entry_name); + int s; + array_t*items = (array_t*)array_getvalue(file->metadata, t); + for(s=0;snum;s++) { + fprintf(fo, "%s# %s=%s\n", prefix, (char*)array_getkey(items, s), (char*)array_getvalue(items,s)); + } + fprintf(fo, "%s#\n", prefix); + } + + dict_t*methods_seen = dict_new2(&ptr_type); + for(t=0;tclasses->num;t++) { + abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); + char prefix2[80]; + sprintf(prefix2, "%s ", prefix); + + fprintf(fo, "%s", prefix); + if(cls->flags&1) fprintf(fo, "sealed "); + if(cls->flags&2) fprintf(fo, "final "); + if(cls->flags&4) fprintf(fo, "interface "); + if(cls->flags&8) { + char*s = namespace_tostring(cls->protectedNS); + fprintf(fo, "protectedNS(%s) ", s); + free(s); + } + + char*classname = multiname_tostring(cls->classname); + fprintf(fo, "class %s", classname); + free(classname); + if(cls->superclass) { + char*supername = multiname_tostring(cls->superclass); + fprintf(fo, " extends %s", supername); + free(supername); + } + if(cls->interfaces) { + multiname_list_t*ilist = cls->interfaces; + if(ilist) + fprintf(fo, " implements"); + while(ilist) { + char*s = multiname_tostring(ilist->multiname); + fprintf(fo, " %s", s); + free(s); + ilist = ilist->next; + } + ilist->next; + } + if(cls->flags&0xf0) + fprintf(fo, "extra flags=%02x\n", cls->flags&0xf0); + fprintf(fo, "%s{\n", prefix); + + dict_put(methods_seen, cls->static_constructor, 0); + dict_put(methods_seen, cls->constructor, 0); + + if(cls->static_constructor) { + dump_method(fo, prefix2, "", "staticconstructor", "", cls->static_constructor, file, methods_seen); + } + traits_dump(fo, prefix2, cls->static_traits, file, methods_seen); + + char*n = multiname_tostring(cls->classname); + if(cls->constructor) + dump_method(fo, prefix2, "", "constructor", n, cls->constructor, file, methods_seen); + free(n); + traits_dump(fo, prefix2,cls->traits, file, methods_seen); + + if(cls->asset) { + swf_DumpAsset(fo, cls->asset, prefix2); + } + + fprintf(fo, "%s}\n", prefix); + } + fprintf(fo, "%s\n", prefix); + + for(t=0;tscripts->num;t++) { + abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t); + dump_method(fo, prefix, "", "initmethod", "init", s->method, file, methods_seen); + traits_dump(fo, prefix, s->traits, file, methods_seen); + } + + char extra=0; + for(t=0;tmethods->num;t++) { + abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); + if(!dict_contains(methods_seen, m)) { + if(!extra) { + extra=1; + fprintf(fo, "\n"); + fprintf(fo, "%s//internal (non-class non-script) methods:\n", prefix); + } + char name[18]; + sprintf(name, "%08x ", m->index); + dump_method(fo, prefix, "", "internalmethod", name, m, file, methods_seen); + } + } + dict_destroy(methods_seen); + + return file; +} + +void* swf_ReadABC(TAG*tag) +{ + abc_file_t* file = abc_file_new(); + pool_t*pool = pool_new(); + + swf_SetTagPos(tag, 0); + int t; + if(tag->id == ST_DOABC) { + U32 abcflags = swf_GetU32(tag); + DEBUG printf("flags=%08x\n", abcflags); + char*name= swf_GetString(tag); + file->name = (name&&name[0])?strdup(name):0; + } + U32 version = swf_GetU32(tag); + if(version!=0x002e0010) { + fprintf(stderr, "Warning: unknown AVM2 version %08x\n", version); + } + + pool_read(pool, tag); + + int num_methods = swf_GetU30(tag); + DEBUG printf("%d methods\n", num_methods); + for(t=0;treturn_type = multiname_clone(pool_lookup_multiname(pool, return_type_index)); + else + m->return_type = 0; + + int s; + for(s=0;sparameters, param); + } + + int namenr = swf_GetU30(tag); + if(namenr) + m->name = strdup(pool_lookup_string(pool, namenr)); + else + m->name = strdup(""); + + m->flags = swf_GetU8(tag); + + DEBUG printf("method %d) %s ", t, m->name); + DEBUG params_dump(stdout, m->parameters, m->optional_parameters); + DEBUG printf("flags=%02x\n", m->flags); + + if(m->flags&0x08) { + m->optional_parameters = list_new(); + int num = swf_GetU30(tag); + int s; + for(s=0;soptional_parameters, c); + + } + } + if(m->flags&0x80) { + /* debug information- not used by avm2 */ + multiname_list_t*l = m->parameters; + while(l) { + const char*name = pool_lookup_string(pool, swf_GetU30(tag)); + l = l->next; + } + } + m->index = array_length(file->methods); + array_append(file->methods, NO_KEY, m); + } + + parse_metadata(tag, file, pool); + + /* skip classes, and scripts for now, and do the real parsing later */ + int num_classes = swf_GetU30(tag); + int classes_pos = tag->pos; + DEBUG printf("%d classes\n", num_classes); + for(t=0;tclasses, NO_KEY, cls); + + cls->flags = swf_GetU8(tag); + DEBUG printf("class %d %02x\n", t, cls->flags); + if(cls->flags&8) + swf_GetU30(tag); //protectedNS + int s; + int inum = swf_GetU30(tag); //interface count + cls->interfaces = 0; + for(s=0;sinterfaces, m); + DEBUG printf(" class %d interface: %s\n", t, m->name); + } + + int iinit = swf_GetU30(tag); //iinit + DEBUG printf("--iinit-->%d\n", iinit); + traits_skip(tag); + } + for(t=0;tclasses, t); + int cinit = swf_GetU30(tag); + DEBUG printf("--cinit(%d)-->%d\n", t, cinit); + cls->static_constructor = (abc_method_t*)array_getvalue(file->methods, cinit); + traits_skip(tag); + } + int num_scripts = swf_GetU30(tag); + DEBUG printf("%d scripts\n", num_scripts); + for(t=0;t= file->methods->num) { + printf("Invalid method number: %d\n", methodnr); + return 0; + } + abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, methodnr); + abc_method_body_t*c = malloc(sizeof(abc_method_body_t)); + memset(c, 0, sizeof(abc_method_body_t)); + c->old.max_stack = swf_GetU30(tag); + c->old.local_count = swf_GetU30(tag); + c->old.init_scope_depth = swf_GetU30(tag); + c->old.max_scope_depth = swf_GetU30(tag); + + c->init_scope_depth = c->old.init_scope_depth; + int code_length = swf_GetU30(tag); + + c->method = m; + m->body = c; + + int pos = tag->pos + code_length; + codelookup_t*codelookup = 0; + c->code = code_parse(tag, code_length, file, pool, &codelookup); + tag->pos = pos; + + int exception_count = swf_GetU30(tag); + int s; + c->exceptions = list_new(); + for(s=0;sfrom = code_atposition(codelookup, swf_GetU30(tag)); + e->to = code_atposition(codelookup, swf_GetU30(tag)); + e->target = code_atposition(codelookup, swf_GetU30(tag)); + + e->exc_type = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); + e->var_name = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); + //e->var_name = pool_lookup_string(pool, swf_GetU30(tag)); + //if(e->var_name) e->var_name = strdup(e->var_name); + list_append(c->exceptions, e); + } + codelookup_free(codelookup); + c->traits = traits_parse(tag, pool, file); + + DEBUG printf("method_body %d) (method %d), %d bytes of code\n", t, methodnr, code_length); + + array_append(file->method_bodies, NO_KEY, c); + } + if(tag->len - tag->pos) { + fprintf(stderr, "ERROR: %d unparsed bytes remaining in ABC block\n", tag->len - tag->pos); + return 0; + } + + swf_SetTagPos(tag, classes_pos); + for(t=0;tclasses, t); + + int classname_index = swf_GetU30(tag); + int superclass_index = swf_GetU30(tag); + cls->classname = multiname_clone(pool_lookup_multiname(pool, classname_index)); + cls->superclass = multiname_clone(pool_lookup_multiname(pool, superclass_index)); + cls->flags = swf_GetU8(tag); + const char*ns = ""; + if(cls->flags&8) { + int ns_index = swf_GetU30(tag); + cls->protectedNS = namespace_clone(pool_lookup_namespace(pool, ns_index)); + } + + int num_interfaces = swf_GetU30(tag); //interface count + int s; + for(s=0;sconstructor = (abc_method_t*)array_getvalue(file->methods, iinit); + cls->traits = traits_parse(tag, pool, file); + } + for(t=0;tclasses, t); + /* SKIP */ + swf_GetU30(tag); // cindex + cls->static_traits = traits_parse(tag, pool, file); + } + int num_scripts2 = swf_GetU30(tag); + for(t=0;tmethods, init); + + abc_script_t*s = malloc(sizeof(abc_script_t)); + memset(s, 0, sizeof(abc_script_t)); + s->method = m; + s->traits = traits_parse(tag, pool, file); + array_append(file->scripts, NO_KEY, s); + } + + pool_destroy(pool); + return file; +} + +static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool) +{ + abc_file_t*file = (abc_file_t*)code; + if(!pool) + pool = pool_new(); + if(!file) + file = abc_file_new(); + + TAG*tmp = swf_InsertTag(0,0); + TAG*tag = tmp; + int t; + + /* add method bodies where needed */ + for(t=0;tclasses->num;t++) { + abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); + if(!c->constructor) { + if(!(c->flags&CLASS_INTERFACE)) { + NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); + NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); + // don't bother to set m->index + body->method = m; m->body = body; + if(c->superclass && c->superclass->name && strcmp(c->superclass->name,"Object")) { + body->code = abc_getlocal_0(body->code); + body->code = abc_constructsuper(body->code, 0); + } + body->code = abc_returnvoid(body->code); + c->constructor = m; + } else { + NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); + c->constructor = m; + } + } + if(!c->static_constructor) { + NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); + NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); + body->method = m; m->body = body; + body->code = abc_returnvoid(0); + c->static_constructor = m; + } + } + + + swf_SetU30(tag, file->methods->num); + /* enumerate classes, methods and method bodies */ + for(t=0;tmethods->num;t++) { + abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); + m->index = t; + } + for(t=0;tclasses->num;t++) { + abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); + c->index = t; + } + for(t=0;tmethod_bodies->num;t++) { + abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t); + m->index = t; + } + + /* generate code statistics */ + for(t=0;tmethod_bodies->num;t++) { + abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t); + m->stats = code_get_statistics(m->code, m->exceptions); + } + + /* level init scope depths: The init scope depth of a method is + always as least as high as the init scope depth of it's surrounding + class. + A method has it's own init_scope_depth if it's an init method + (then its init scope depth is zero), or if it's used as a closure. + + Not sure yet what to do with methods which are used at different + locations- e.g. the nullmethod is used all over the place. + EDIT: flashplayer doesn't allow this anyway- a method can only + be used once + + Also, I have the strong suspicion that flash player uses only + the difference between max_scope_stack and init_scope_stack, anyway. + */ + for(t=0;tclasses->num;t++) { + abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); + trait_list_t*traits = c->traits; + if(c->constructor && c->constructor->body && + c->constructor->body->init_scope_depth < c->init_scope_depth) { + c->constructor->body->init_scope_depth = c->init_scope_depth; + } + if(c->static_constructor && c->static_constructor->body && + c->static_constructor->body->init_scope_depth < c->init_scope_depth) { + c->static_constructor->body->init_scope_depth = c->init_scope_depth; + } + while(traits) { + trait_t*trait = traits->trait; + if(trait_is_method(trait) && trait->method->body) { + abc_method_body_t*body = trait->method->body; + if(body->init_scope_depth < c->init_scope_depth) { + body->init_scope_depth = c->init_scope_depth; + } + } + traits = traits->next; + } + } + + for(t=0;tmethods->num;t++) { + abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); + int n = 0; + multiname_list_t*l = m->parameters; + int num_params = list_length(m->parameters); + swf_SetU30(tag, num_params); + if(m->return_type) + swf_SetU30(tag, pool_register_multiname(pool, m->return_type)); + else + swf_SetU30(tag, 0); + int s; + while(l) { + swf_SetU30(tag, pool_register_multiname(pool, l->multiname)); + l = l->next; + } + if(m->name) { + swf_SetU30(tag, pool_register_string(pool, m->name)); + } else { + swf_SetU30(tag, 0); + } + + U8 flags = m->flags&(METHOD_NEED_REST|METHOD_NEED_ARGUMENTS); + if(m->optional_parameters) + flags |= METHOD_HAS_OPTIONAL; + if(m->body) { + flags |= m->body->stats->flags; + } + + swf_SetU8(tag, flags); + if(flags&METHOD_HAS_OPTIONAL) { + swf_SetU30(tag, list_length(m->optional_parameters)); + constant_list_t*l = m->optional_parameters; + while(l) { + int i = constant_get_index(pool, l->constant); + swf_SetU30(tag, i); + if(!i) { + swf_SetU8(tag, CONSTANT_NULL); + } else { + swf_SetU8(tag, l->constant->type); + } + l = l->next; + } + } + } + + /* write metadata */ + swf_SetU30(tag, file->metadata->num); + for(t=0;tmetadata->num;t++) { + const char*entry_name = array_getkey(file->metadata, t); + swf_SetU30(tag, pool_register_string(pool, entry_name)); + array_t*items = (array_t*)array_getvalue(file->metadata, t); + swf_SetU30(tag, items->num); + int s; + for(s=0;snum;s++) { + int i1 = pool_register_string(pool, array_getkey(items, s)); + int i2 = pool_register_string(pool, array_getvalue(items, s)); + swf_SetU30(tag, i1); + swf_SetU30(tag, i2); + } + } + + swf_SetU30(tag, file->classes->num); + for(t=0;tclasses->num;t++) { + abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); + + int classname_index = pool_register_multiname(pool, c->classname); + int superclass_index = pool_register_multiname(pool, c->superclass); + + swf_SetU30(tag, classname_index); + swf_SetU30(tag, superclass_index); + + swf_SetU8(tag, c->flags); // flags + if(c->flags&0x08) { + int ns_index = pool_register_namespace(pool, c->protectedNS); + swf_SetU30(tag, ns_index); + } + + swf_SetU30(tag, list_length(c->interfaces)); + multiname_list_t*interface= c->interfaces; + while(interface) { + swf_SetU30(tag, pool_register_multiname(pool, interface->multiname)); + interface = interface->next; + } + + assert(c->constructor); + swf_SetU30(tag, c->constructor->index); + + traits_write(pool, tag, c->traits); + } + for(t=0;tclasses->num;t++) { + abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); + assert(c->static_constructor); + swf_SetU30(tag, c->static_constructor->index); + + traits_write(pool, tag, c->static_traits); + } + + swf_SetU30(tag, file->scripts->num); + for(t=0;tscripts->num;t++) { + abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t); + if(!s->method->body || !s->method->body->code) { + fprintf(stderr, "Internal Error: initscript has no body\n"); + } + swf_SetU30(tag, s->method->index); //!=t! + traits_write(pool, tag, s->traits); + } + + swf_SetU30(tag, file->method_bodies->num); + for(t=0;tmethod_bodies->num;t++) { + abc_method_body_t*c = (abc_method_body_t*)array_getvalue(file->method_bodies, t); + abc_method_t*m = c->method; + swf_SetU30(tag, m->index); + + //swf_SetU30(tag, c->old.max_stack); + //swf_SetU30(tag, c->old.local_count); + //swf_SetU30(tag, c->old.init_scope_depth); + //swf_SetU30(tag, c->old.max_scope_depth); + + swf_SetU30(tag, c->stats->max_stack); + int param_num = list_length(c->method->parameters)+1; + if(c->method->flags&METHOD_NEED_REST) + param_num++; + if(param_num <= c->stats->local_count) + swf_SetU30(tag, c->stats->local_count); + else + swf_SetU30(tag, param_num); + + swf_SetU30(tag, c->init_scope_depth); + swf_SetU30(tag, c->stats->max_scope_depth+ + c->init_scope_depth); + + code_write(tag, c->code, pool, file); + + swf_SetU30(tag, list_length(c->exceptions)); + abc_exception_list_t*l = c->exceptions; + while(l) { + // warning: assumes "pos" in each code_t is up-to-date + swf_SetU30(tag, l->abc_exception->from->pos); + swf_SetU30(tag, l->abc_exception->to->pos); + swf_SetU30(tag, l->abc_exception->target->pos); + swf_SetU30(tag, pool_register_multiname(pool, l->abc_exception->exc_type)); + swf_SetU30(tag, pool_register_multiname(pool, l->abc_exception->var_name)); + l = l->next; + } + + traits_write(pool, tag, c->traits); + } + + /* free temporary codestat data again. Notice: If we were to write this + file multiple times, this can also be shifted to abc_file_free() */ + for(t=0;tmethod_bodies->num;t++) { + abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t); + codestats_free(m->stats);m->stats=0; + } + + // --- start to write real tag -- + + tag = abctag; + + if(tag->id == ST_DOABC) { + swf_SetU32(tag, file->flags); // flags + swf_SetString(tag, file->name); + } + + swf_SetU16(tag, 0x10); //version + swf_SetU16(tag, 0x2e); + + pool_write(pool, tag); + + swf_SetBlock(tag, tmp->data, tmp->len); + + swf_DeleteTag(0, tmp); + return pool; +} + +void swf_WriteABC(TAG*abctag, void*code) +{ + pool_t*pool = writeABC(abctag, code, 0); + pool_optimize(pool); + swf_ResetTag(abctag, abctag->id); + writeABC(abctag, code, pool); + pool_destroy(pool); +} + +void abc_file_free(abc_file_t*file) +{ + if(!file) + return; + int t; + if(file->metadata) { + for(t=0;tmetadata->num;t++) { + array_t*items = (array_t*)array_getvalue(file->metadata, t); + int s; + for(s=0;snum;s++) { + free(array_getvalue(items, s)); + } + array_free(items); + } + array_free(file->metadata);file->metadata=0; + } + + for(t=0;tmethods->num;t++) { + abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); + + multiname_list_t*param = m->parameters; + while(param) { + multiname_destroy(param->multiname);param->multiname=0; + param = param->next; + } + list_free(m->parameters);m->parameters=0; + + constant_list_t*opt = m->optional_parameters; + while(opt) { + constant_free(opt->constant);opt->constant=0; + opt = opt->next; + } + list_free(m->optional_parameters);m->optional_parameters=0; + + if(m->name) { + free((void*)m->name);m->name=0; + } + if(m->return_type) { + multiname_destroy(m->return_type); + } + free(m); + } + array_free(file->methods);file->methods=0; + + for(t=0;tclasses->num;t++) { + abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); + traits_free(cls->traits);cls->traits=0; + traits_free(cls->static_traits);cls->static_traits=0; + + if(cls->classname) { + multiname_destroy(cls->classname); + } + if(cls->superclass) { + multiname_destroy(cls->superclass); + } + + multiname_list_t*i = cls->interfaces; + while(i) { + multiname_destroy(i->multiname);i->multiname=0; + i = i->next; + } + list_free(cls->interfaces);cls->interfaces=0; + + if(cls->protectedNS) { + namespace_destroy(cls->protectedNS); + } + free(cls); + } + array_free(file->classes);file->classes=0; + + for(t=0;tscripts->num;t++) { + abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t); + traits_free(s->traits);s->traits=0; + free(s); + } + array_free(file->scripts);file->scripts=0; + + for(t=0;tmethod_bodies->num;t++) { + abc_method_body_t*body = (abc_method_body_t*)array_getvalue(file->method_bodies, t); + code_free(body->code);body->code=0; + traits_free(body->traits);body->traits=0; + + abc_exception_list_t*ee = body->exceptions; + while(ee) { + abc_exception_t*e=ee->abc_exception;ee->abc_exception=0; + e->from = e->to = e->target = 0; + multiname_destroy(e->exc_type);e->exc_type=0; + multiname_destroy(e->var_name);e->var_name=0; + free(e); + ee=ee->next; + } + list_free(body->exceptions);body->exceptions=0; + + free(body); + } + array_free(file->method_bodies);file->method_bodies=0; + + if(file->name) { + free((void*)file->name);file->name=0; + } + + free(file); +} + +void swf_FreeABC(void*code) +{ + abc_file_t*file= (abc_file_t*)code; + abc_file_free(file); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h new file mode 100644 index 000000000..4ba6da320 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h @@ -0,0 +1,229 @@ +/* abc.h + + Routines for handling Flash2 AVM2 ABC Actionscript (header file) + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __swfabc_h__ +#define __swfabc_h__ + +#include "../q.h" +#include "pool.h" + +DECLARE(abc_file); +DECLARE(abc_method); +DECLARE(abc_method_body); +DECLARE(abc_interface); +DECLARE(abc_class); +DECLARE(abc_exception); +DECLARE(abc_asset); +DECLARE(asset_dependency); +DECLARE(asset_tag); +DECLARE_LIST(abc_asset); +DECLARE_LIST(asset_dependency); +DECLARE_LIST(asset_tag); +DECLARE_LIST(abc_exception); +DECLARE_LIST(TAG); + +#include "code.h" +#include "opcodes.h" + +DECLARE(trait); + + +#define METHOD_NEED_ARGUMENTS 1 +#define METHOD_NEED_ACTIVATION 2 +#define METHOD_NEED_REST 4 +#define METHOD_HAS_OPTIONAL 8 +#define METHOD_SET_DXNS 0x40 +#define METHOD_HAS_PARAM_NAMES 0x80 + +struct _abc_method { + multiname_t*return_type; + multiname_list_t*parameters; + constant_list_t*optional_parameters; + const char*name; + U8 flags; + abc_method_body_t*body; + + trait_t*trait; + + int index; //filled in during writing +}; + +#define ABCFILE_LAZY 1 +struct _abc_file { + // abc_file + + const char*name; + U32 flags; + array_t*metadata; + array_t*methods; + array_t*classes; + array_t*scripts; + array_t*method_bodies; +}; + +abc_file_t*abc_file_new(); + +#define TRAIT_SLOT 0 +#define TRAIT_METHOD 1 +#define TRAIT_GETTER 2 +#define TRAIT_SETTER 3 +#define TRAIT_CLASS 4 +#define TRAIT_FUNCTION 5 +#define TRAIT_CONST 6 + +#define TRAIT_ATTR_FINAL 0x10 +#define TRAIT_ATTR_OVERRIDE 0x20 +#define TRAIT_ATTR_METADATA 0x40 + + +struct _trait { + unsigned char kind; + unsigned char attributes; + multiname_t*name; + + union { + int disp_id; + int slot_id; + int data1; + }; + union { + abc_method_t*method; + abc_class_t*cls; + multiname_t*type_name; + int data2; + }; + constant_t*value; +}; + +trait_t*trait_new_method(trait_list_t**traits, multiname_t*name, abc_method_t*m); +trait_t*trait_new_member(trait_list_t**traits, multiname_t*type, multiname_t*name, constant_t*v); + +#define CLASS_SEALED 1 +#define CLASS_FINAL 2 +#define CLASS_INTERFACE 4 +#define CLASS_PROTECTED_NS 8 + +struct _abc_class { + abc_file_t*file; + + multiname_t*classname; + multiname_t*superclass; + namespace_t*protectedNS; + + multiname_list_t*interfaces; + + abc_method_t*constructor; + trait_list_t*traits; + + abc_method_t*static_constructor; + trait_list_t*static_traits; + + U8 flags; + + abc_asset_t*asset; // swf tags needed for this class + + int init_scope_depth; // volatile, might be increased during code verification + int index; //filled in during writing +}; + +void abc_method_init(abc_method_t*m, abc_file_t*file, multiname_t*returntype, char body); +abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body); + +abc_class_t* abc_class_new(abc_file_t*file, multiname_t*classname, multiname_t*superclass); +abc_class_t* abc_class_new2(abc_file_t*file, char*classname, char*superclass); +void abc_class_sealed(abc_class_t*c); +void abc_class_final(abc_class_t*c); +void abc_class_interface(abc_class_t*c); +void abc_class_protectedNS(abc_class_t*c, char*namespace); +void abc_class_add_interface(abc_class_t*c, multiname_t*interface); +char*abc_class_fullname(abc_class_t*cls); + +trait_t* traits_find_slotid(trait_list_t*traits, int slotid); + +abc_method_t* abc_class_getconstructor(abc_class_t*cls, multiname_t*returntype); +abc_method_t* abc_class_getstaticconstructor(abc_class_t*cls, multiname_t*returntype); + +abc_method_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, multiname_t*name); +abc_method_t* abc_class_staticmethod(abc_class_t*cls, multiname_t*returntype, multiname_t*name); +trait_t* abc_class_slot(abc_class_t*cls, multiname_t*name, multiname_t*type); +trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*type); + +struct _abc_exception { + code_t*from; + code_t*to; + code_t*target; + multiname_t*exc_type; + multiname_t*var_name; +}; + +struct _abc_method_body { + abc_file_t*file; + //abc_class_t*cls; + abc_method_t*method; + code_t*code; + + struct { + //for dumping: filled in during parsing + int max_stack; + int local_count; + int max_scope_depth; + int init_scope_depth; + } old; + + int init_scope_depth; // volatile, might be increased during code verification + + abc_exception_list_t* exceptions; + + trait_list_t*traits; + + int index; // filled in during writing + codestats_t*stats; //filled in during writing +}; + +typedef struct _abc_script { + abc_method_t*method; + abc_file_t*file; + trait_list_t*traits; +} abc_script_t; + +struct _asset_dependency { + abc_asset_t*asset; + int patch_pos; +}; +struct _asset_tag { + TAG*tag; + asset_dependency_t*deps; + int num_deps; +}; +struct _abc_asset { + asset_tag_list_t*tags; + U16 id; +}; + +abc_method_t* abc_nullmethod(abc_file_t*file); +abc_script_t* abc_initscript(abc_file_t*file); +trait_t*abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc_class_t*cls); + +#define __ + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c new file mode 100644 index 000000000..f6b4aee87 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c @@ -0,0 +1,216 @@ +#include +#include "../types.h" +#include "../rfxswf.h" +#include "assets.h" + +static void add_dependencies(asset_resolver_t*assets, abc_asset_t*asset, asset_tag_t*atag) +{ + TAG*tag = atag->tag; + atag->num_deps = swf_GetNumUsedIDs(tag); + int*positions = malloc(sizeof(int)*atag->num_deps); + atag->deps = malloc(atag->num_deps*sizeof(atag->deps[0])); + swf_GetUsedIDs(tag, positions); + int t; + for(t=0;tnum_deps;t++) { + asset_dependency_t*d = &atag->deps[t]; + d->patch_pos = positions[t]; + U16 id = GET16(&tag->data[positions[t]]); + d->asset = assets->id2asset[id]; + if(!d->asset) { + fprintf(stderr, "Error: ID %d referenced, but not defined\n", id); + } + } + free(positions); +} + +asset_resolver_t* swf_ParseAssets(SWF*swf) +{ + NEW(asset_resolver_t,assets); + assets->name2asset = dict_new2(&charptr_type); + assets->id2asset = rfx_calloc(sizeof(abc_asset_t*)*65536); + + TAG*tag = swf->firstTag; + while(tag) { + if(swf_isDefiningTag(tag)) { + NEW(abc_asset_t, asset); + assets->id2asset[swf_GetDefineID(tag)] = asset; + } + tag = tag->next; + } + + tag = swf->firstTag; + while(tag) { + if(swf_isDefiningTag(tag)) { + abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)]; + assert(asset); + if(asset) { + NEW(asset_tag_t,t); + t->tag = tag; + list_append(asset->tags, t); + add_dependencies(assets, asset, t); + } + } else if(swf_isPseudoDefiningTag(tag)) { + abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)]; + if(asset) { + NEW(asset_tag_t,t); + t->tag = tag; + list_append(asset->tags, t); + add_dependencies(assets, asset, t); + } + } else if(tag->id == ST_SYMBOLCLASS) { + int t, num = swf_GetU16(tag); + for(t=0;tmainclass_id = id; + } else { + abc_asset_t*asset = assets->id2asset[id]; + if(!asset) { + fprintf(stderr, "Error: ID %d referenced, but not defined.\n", id); + } else { + char*name = swf_GetString(tag); + dict_put(assets->name2asset, name, asset); + } + } + } + } + tag = tag->next; + } + return assets; +} + +void swf_ResolveAssets(asset_resolver_t*assets, abc_file_t*file) +{ + int num = assets->name2asset->num; + int resolved = 0; + int t; + for(t=0;tclasses->num;t++) { + abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); + char*fullname = abc_class_fullname(cls); + abc_asset_t*a = (abc_asset_t*)dict_lookup(assets->name2asset, fullname); + if(a) { + resolved++; + cls->asset = a; + } + free(fullname); + } +} + +static void dump_asset(FILE*fo, abc_asset_t*a, const char*prefix) +{ + asset_tag_list_t*t = a->tags; + while(t) { + TAG*tag = t->asset_tag->tag; + fprintf(fo, "%s[tag] %s defines ID %d\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); + char*prefix2 = allocprintf("%s ", prefix); + int i; + for(i=0;iasset_tag->num_deps;i++) { + asset_dependency_t*d = &t->asset_tag->deps[i]; + dump_asset(fo, d->asset, prefix2); + } + free(prefix2); + t = t->next; + } +} + +void swf_DumpAsset(FILE*fo, abc_asset_t*asset, const char*prefix) +{ + dump_asset(fo, asset, prefix); +} + +static TAG* write_tag(TAG*prev, TAG*tag) +{ + if(prev) { + prev->next = tag; + } + tag->prev = prev; + tag->next = 0; + prev = tag; + return prev; +} +static TAG*write_asset(TAG*tag, abc_asset_t*a, dict_t*written, U16*currentid) +{ + if(!dict_contains(written, a)) { + dict_put(written, a, 0); + a->id = (*currentid)++; + asset_tag_list_t*tags = a->tags; + + while(tags) { + asset_tag_t*t = tags->asset_tag; + int i; + for(i=0;inum_deps;i++) { + asset_dependency_t*dep = &t->deps[i]; + tag = write_asset(tag, dep->asset, written, currentid); + PUT16(&t->tag->data[dep->patch_pos], dep->asset->id); + } + swf_SetDefineID(t->tag, a->id); + tag = write_tag(tag, t->tag); + tags = tags->next; + } + } + return tag; +} + +void swf_WriteABCSymbols(TAG*tag, abc_file_t*file) +{ + int num = 0; + int t; + for(t=0;tclasses->num;t++) { + abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); + abc_asset_t*a = cls->asset; + if(a && a->tags) { + num++; + } + } + swf_SetU16(tag, num); + for(t=0;tclasses->num;t++) { + abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); + abc_asset_t*a = cls->asset; + if(a && a->tags) { + U16 id = swf_GetDefineID(a->tags->asset_tag->tag); + char*fullname = abc_class_fullname(cls); + swf_SetU16(tag, id); + swf_SetString(tag, fullname); + } + } +} + +TAG*swf_AssetsToTags(TAG*itag, asset_bundle_list_t*assets) +{ + U16 currentid = 1; + asset_bundle_list_t*l = assets; + dict_t*written = dict_new2(&ptr_type); + while(l) { + if(l->asset_bundle->used) { + abc_file_t*file = l->asset_bundle->file; + int t; + TAG* tag = 0; + for(t=0;tclasses->num;t++) { + abc_asset_t*a = ((abc_class_t*)array_getvalue(file->classes, t))->asset; + if(a) { + tag = write_asset(tag, a, written, ¤tid); + } + } + + tag = swf_InsertTag(tag, ST_DOABC); + swf_WriteABC(tag, file); + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_WriteABCSymbols(tag, file); + + TAG*first = tag; + while(first && first->prev) + first=first->prev; + + if(!itag) { + itag = first; + } else { + itag->next = first; + first->prev = itag; + itag = tag; + } + } + l = l->next; + } + dict_destroy(written); + return itag; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h new file mode 100644 index 000000000..7dda7c61e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h @@ -0,0 +1,18 @@ +#ifndef __abc_assets_h__ +#define __abc_assets_h__ +#include "abc.h" +#include "registry.h" + +typedef struct _asset_resolver { + SWF*swf; + abc_asset_t**id2asset; + dict_t*name2asset; + U16 mainclass_id; +} asset_resolver_t; + +asset_resolver_t* swf_ParseAssets(SWF*swf); +void swf_ResolveAssets(asset_resolver_t*swf, abc_file_t*file); +void swf_DumpAsset(FILE*fo, abc_asset_t*asset, const char*prefix); +TAG*swf_AssetsToTags(TAG*tag, asset_bundle_list_t*assets); + +#endif //__abc_assets_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c new file mode 100644 index 000000000..592ca5fb8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c @@ -0,0 +1,8951 @@ +#include "builtin.h" + +static classinfo_t flash_text_TextFormat; +static varinfo_t flash_text_TextFormat_leading; +static varinfo_t flash_text_TextFormat_bold; +static varinfo_t flash_text_TextFormat_underline; +static varinfo_t flash_text_TextFormat_color; +static varinfo_t flash_text_TextFormat_letterSpacing; +static varinfo_t flash_text_TextFormat_kerning; +static varinfo_t flash_text_TextFormat_target; +static varinfo_t flash_text_TextFormat_italic; +static varinfo_t flash_text_TextFormat_rightMargin; +static varinfo_t flash_text_TextFormat_bullet; +static varinfo_t flash_text_TextFormat_url; +static varinfo_t flash_text_TextFormat_size; +static varinfo_t flash_text_TextFormat_indent; +static varinfo_t flash_text_TextFormat_leftMargin; +static varinfo_t flash_text_TextFormat_display; +static varinfo_t flash_text_TextFormat_align; +static varinfo_t flash_text_TextFormat_tabStops; +static varinfo_t flash_text_TextFormat_blockIndent; +static varinfo_t flash_text_TextFormat_font; +static varinfo_t flash_text_TextFormat_leading; +static varinfo_t flash_text_TextFormat_bold; +static varinfo_t flash_text_TextFormat_underline; +static varinfo_t flash_text_TextFormat_color; +static varinfo_t flash_text_TextFormat_letterSpacing; +static varinfo_t flash_text_TextFormat_kerning; +static varinfo_t flash_text_TextFormat_target; +static varinfo_t flash_text_TextFormat_italic; +static varinfo_t flash_text_TextFormat_rightMargin; +static varinfo_t flash_text_TextFormat_bullet; +static varinfo_t flash_text_TextFormat_url; +static varinfo_t flash_text_TextFormat_size; +static varinfo_t flash_text_TextFormat_indent; +static varinfo_t flash_text_TextFormat_leftMargin; +static varinfo_t flash_text_TextFormat_display; +static varinfo_t flash_text_TextFormat_align; +static varinfo_t flash_text_TextFormat_tabStops; +static varinfo_t flash_text_TextFormat_blockIndent; +static varinfo_t flash_text_TextFormat_font; +static classinfo_t flash_filters_BitmapFilter; +static methodinfo_t flash_filters_BitmapFilter_clone; +static methodinfo_t flash_filters_BitmapFilter_clone; +static classinfo_t flash_filters_DropShadowFilter; +static varinfo_t flash_filters_DropShadowFilter_alpha; +static varinfo_t flash_filters_DropShadowFilter_strength; +static varinfo_t flash_filters_DropShadowFilter_quality; +static varinfo_t flash_filters_DropShadowFilter_angle; +static varinfo_t flash_filters_DropShadowFilter_knockout; +static varinfo_t flash_filters_DropShadowFilter_color; +static varinfo_t flash_filters_DropShadowFilter_hideObject; +static varinfo_t flash_filters_DropShadowFilter_inner; +static varinfo_t flash_filters_DropShadowFilter_blurX; +static varinfo_t flash_filters_DropShadowFilter_blurY; +static varinfo_t flash_filters_DropShadowFilter_distance; +static methodinfo_t flash_filters_DropShadowFilter_clone; +static varinfo_t flash_filters_DropShadowFilter_alpha; +static varinfo_t flash_filters_DropShadowFilter_strength; +static varinfo_t flash_filters_DropShadowFilter_quality; +static varinfo_t flash_filters_DropShadowFilter_angle; +static varinfo_t flash_filters_DropShadowFilter_knockout; +static varinfo_t flash_filters_DropShadowFilter_color; +static varinfo_t flash_filters_DropShadowFilter_hideObject; +static varinfo_t flash_filters_DropShadowFilter_inner; +static varinfo_t flash_filters_DropShadowFilter_blurX; +static varinfo_t flash_filters_DropShadowFilter_blurY; +static varinfo_t flash_filters_DropShadowFilter_distance; +static methodinfo_t flash_filters_DropShadowFilter_clone; +static classinfo_t adobe_utils_CustomActions; +static classinfo_t flash_text_engine_TextLineValidity; +static classinfo_t flash_display_LineScaleMode; +static classinfo_t flash_geom_Transform; +static varinfo_t flash_geom_Transform_matrix; +static varinfo_t flash_geom_Transform_perspectiveProjection; +static varinfo_t flash_geom_Transform_concatenatedMatrix; +static varinfo_t flash_geom_Transform_colorTransform; +static methodinfo_t flash_geom_Transform_getRelativeMatrix3D; +static varinfo_t flash_geom_Transform_pixelBounds; +static varinfo_t flash_geom_Transform_matrix3D; +static varinfo_t flash_geom_Transform_concatenatedColorTransform; +static varinfo_t flash_geom_Transform_matrix; +static varinfo_t flash_geom_Transform_perspectiveProjection; +static varinfo_t flash_geom_Transform_concatenatedMatrix; +static varinfo_t flash_geom_Transform_colorTransform; +static methodinfo_t flash_geom_Transform_getRelativeMatrix3D; +static varinfo_t flash_geom_Transform_pixelBounds; +static varinfo_t flash_geom_Transform_matrix3D; +static varinfo_t flash_geom_Transform_concatenatedColorTransform; +static classinfo_t flash_ui_KeyLocation; +static classinfo_t flash_events_MouseEvent; +static varinfo_t flash_events_MouseEvent_localY; +static methodinfo_t flash_events_MouseEvent_updateAfterEvent; +static varinfo_t flash_events_MouseEvent_delta; +static varinfo_t flash_events_MouseEvent_stageX; +static methodinfo_t flash_events_MouseEvent_toString; +static varinfo_t flash_events_MouseEvent_relatedObject; +static varinfo_t flash_events_MouseEvent_isRelatedObjectInaccessible; +static varinfo_t flash_events_MouseEvent_shiftKey; +static varinfo_t flash_events_MouseEvent_stageY; +static varinfo_t flash_events_MouseEvent_altKey; +static methodinfo_t flash_events_MouseEvent_clone; +static varinfo_t flash_events_MouseEvent_ctrlKey; +static varinfo_t flash_events_MouseEvent_localX; +static varinfo_t flash_events_MouseEvent_buttonDown; +static varinfo_t flash_events_MouseEvent_localY; +static methodinfo_t flash_events_MouseEvent_updateAfterEvent; +static varinfo_t flash_events_MouseEvent_delta; +static varinfo_t flash_events_MouseEvent_stageX; +static methodinfo_t flash_events_MouseEvent_toString; +static varinfo_t flash_events_MouseEvent_relatedObject; +static varinfo_t flash_events_MouseEvent_isRelatedObjectInaccessible; +static varinfo_t flash_events_MouseEvent_shiftKey; +static varinfo_t flash_events_MouseEvent_stageY; +static varinfo_t flash_events_MouseEvent_altKey; +static methodinfo_t flash_events_MouseEvent_clone; +static varinfo_t flash_events_MouseEvent_ctrlKey; +static varinfo_t flash_events_MouseEvent_localX; +static varinfo_t flash_events_MouseEvent_buttonDown; +static classinfo_t flash_text_engine_LineJustification; +static classinfo_t flash_media_Camera; +static varinfo_t flash_media_Camera_fps; +static methodinfo_t flash_media_Camera_setMode; +static varinfo_t flash_media_Camera_keyFrameInterval; +static varinfo_t flash_media_Camera_motionTimeout; +static varinfo_t flash_media_Camera_width; +static methodinfo_t flash_media_Camera_setCursor; +static methodinfo_t flash_media_Camera_setLoopback; +static varinfo_t flash_media_Camera_height; +static varinfo_t flash_media_Camera_index; +static varinfo_t flash_media_Camera_name; +static varinfo_t flash_media_Camera_currentFPS; +static methodinfo_t flash_media_Camera_setKeyFrameInterval; +static varinfo_t flash_media_Camera_quality; +static varinfo_t flash_media_Camera_motionLevel; +static varinfo_t flash_media_Camera_bandwidth; +static varinfo_t flash_media_Camera_muted; +static varinfo_t flash_media_Camera_activityLevel; +static varinfo_t flash_media_Camera_loopback; +static methodinfo_t flash_media_Camera_setQuality; +static methodinfo_t flash_media_Camera_setMotionLevel; +static varinfo_t flash_media_Camera_fps; +static methodinfo_t flash_media_Camera_setMode; +static varinfo_t flash_media_Camera_keyFrameInterval; +static varinfo_t flash_media_Camera_motionTimeout; +static varinfo_t flash_media_Camera_width; +static methodinfo_t flash_media_Camera_setCursor; +static methodinfo_t flash_media_Camera_setLoopback; +static varinfo_t flash_media_Camera_height; +static varinfo_t flash_media_Camera_index; +static varinfo_t flash_media_Camera_name; +static varinfo_t flash_media_Camera_currentFPS; +static methodinfo_t flash_media_Camera_setKeyFrameInterval; +static varinfo_t flash_media_Camera_quality; +static varinfo_t flash_media_Camera_motionLevel; +static varinfo_t flash_media_Camera_bandwidth; +static varinfo_t flash_media_Camera_muted; +static varinfo_t flash_media_Camera_activityLevel; +static varinfo_t flash_media_Camera_loopback; +static methodinfo_t flash_media_Camera_setQuality; +static methodinfo_t flash_media_Camera_setMotionLevel; +static methodinfo_t flash_net_registerClassAlias; +static classinfo_t flash_accessibility_AccessibilityImplementation; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accState; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accName; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accSelection; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accDoDefaultAction; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accFocus; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accDefaultAction; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accSelect; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accValue; +static varinfo_t flash_accessibility_AccessibilityImplementation_stub; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accRole; +static varinfo_t flash_accessibility_AccessibilityImplementation_errno; +static methodinfo_t flash_accessibility_AccessibilityImplementation_isLabeledBy; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accLocation; +static methodinfo_t flash_accessibility_AccessibilityImplementation_getChildIDArray; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accState; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accName; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accSelection; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accDoDefaultAction; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accFocus; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accDefaultAction; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accSelect; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accValue; +static varinfo_t flash_accessibility_AccessibilityImplementation_stub; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accRole; +static varinfo_t flash_accessibility_AccessibilityImplementation_errno; +static methodinfo_t flash_accessibility_AccessibilityImplementation_isLabeledBy; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accLocation; +static methodinfo_t flash_accessibility_AccessibilityImplementation_getChildIDArray; +static classinfo_t flash_utils_ByteArray; +static methodinfo_t flash_utils_ByteArray_writeBoolean; +static methodinfo_t flash_utils_ByteArray_readDouble; +static methodinfo_t flash_utils_ByteArray_toString; +static methodinfo_t flash_utils_ByteArray_writeByte; +static methodinfo_t flash_utils_ByteArray_writeObject; +static methodinfo_t flash_utils_ByteArray_readUTFBytes; +static methodinfo_t flash_utils_ByteArray_writeMultiByte; +static methodinfo_t flash_utils_ByteArray_uncompress; +static methodinfo_t flash_utils_ByteArray_readUnsignedByte; +static methodinfo_t flash_utils_ByteArray_writeInt; +static methodinfo_t flash_utils_ByteArray_deflate; +static methodinfo_t flash_utils_ByteArray_readMultiByte; +static methodinfo_t flash_utils_ByteArray_readBytes; +static methodinfo_t flash_utils_ByteArray_writeShort; +static varinfo_t flash_utils_ByteArray_position; +static methodinfo_t flash_utils_ByteArray_readShort; +static methodinfo_t flash_utils_ByteArray_writeUTF; +static methodinfo_t flash_utils_ByteArray_writeBytes; +static varinfo_t flash_utils_ByteArray_objectEncoding; +static methodinfo_t flash_utils_ByteArray_readObject; +static varinfo_t flash_utils_ByteArray_length; +static methodinfo_t flash_utils_ByteArray_writeUnsignedInt; +static methodinfo_t flash_utils_ByteArray_writeDouble; +static methodinfo_t flash_utils_ByteArray_writeFloat; +static methodinfo_t flash_utils_ByteArray_readInt; +static methodinfo_t flash_utils_ByteArray_readByte; +static varinfo_t flash_utils_ByteArray_bytesAvailable; +static methodinfo_t flash_utils_ByteArray_clear; +static varinfo_t flash_utils_ByteArray_endian; +static methodinfo_t flash_utils_ByteArray_readUnsignedShort; +static methodinfo_t flash_utils_ByteArray_readUnsignedInt; +static methodinfo_t flash_utils_ByteArray_readFloat; +static methodinfo_t flash_utils_ByteArray_compress; +static methodinfo_t flash_utils_ByteArray_writeUTFBytes; +static methodinfo_t flash_utils_ByteArray_readBoolean; +static methodinfo_t flash_utils_ByteArray_inflate; +static methodinfo_t flash_utils_ByteArray_readUTF; +static methodinfo_t flash_utils_ByteArray_writeBoolean; +static methodinfo_t flash_utils_ByteArray_readDouble; +static methodinfo_t flash_utils_ByteArray_toString; +static methodinfo_t flash_utils_ByteArray_writeByte; +static methodinfo_t flash_utils_ByteArray_writeObject; +static methodinfo_t flash_utils_ByteArray_readUTFBytes; +static methodinfo_t flash_utils_ByteArray_writeMultiByte; +static methodinfo_t flash_utils_ByteArray_uncompress; +static methodinfo_t flash_utils_ByteArray_readUnsignedByte; +static methodinfo_t flash_utils_ByteArray_writeInt; +static methodinfo_t flash_utils_ByteArray_deflate; +static methodinfo_t flash_utils_ByteArray_readMultiByte; +static methodinfo_t flash_utils_ByteArray_readBytes; +static methodinfo_t flash_utils_ByteArray_writeShort; +static varinfo_t flash_utils_ByteArray_position; +static methodinfo_t flash_utils_ByteArray_readShort; +static methodinfo_t flash_utils_ByteArray_writeUTF; +static methodinfo_t flash_utils_ByteArray_writeBytes; +static varinfo_t flash_utils_ByteArray_objectEncoding; +static methodinfo_t flash_utils_ByteArray_readObject; +static varinfo_t flash_utils_ByteArray_length; +static methodinfo_t flash_utils_ByteArray_writeUnsignedInt; +static methodinfo_t flash_utils_ByteArray_writeDouble; +static methodinfo_t flash_utils_ByteArray_writeFloat; +static methodinfo_t flash_utils_ByteArray_readInt; +static methodinfo_t flash_utils_ByteArray_readByte; +static varinfo_t flash_utils_ByteArray_bytesAvailable; +static methodinfo_t flash_utils_ByteArray_clear; +static varinfo_t flash_utils_ByteArray_endian; +static methodinfo_t flash_utils_ByteArray_readUnsignedShort; +static methodinfo_t flash_utils_ByteArray_readUnsignedInt; +static methodinfo_t flash_utils_ByteArray_readFloat; +static methodinfo_t flash_utils_ByteArray_compress; +static methodinfo_t flash_utils_ByteArray_writeUTFBytes; +static methodinfo_t flash_utils_ByteArray_readBoolean; +static methodinfo_t flash_utils_ByteArray_inflate; +static methodinfo_t flash_utils_ByteArray_readUTF; +static methodinfo_t flash_sampler_stopSampling; +static classinfo_t flash_events_SyncEvent; +static methodinfo_t flash_events_SyncEvent_toString; +static methodinfo_t flash_events_SyncEvent_clone; +static varinfo_t flash_events_SyncEvent_changeList; +static methodinfo_t flash_events_SyncEvent_toString; +static methodinfo_t flash_events_SyncEvent_clone; +static varinfo_t flash_events_SyncEvent_changeList; +static methodinfo_t _encodeURIComponent; +static classinfo_t flash_net_Socket; +static methodinfo_t flash_net_Socket_writeBoolean; +static methodinfo_t flash_net_Socket_connect; +static methodinfo_t flash_net_Socket_readDouble; +static methodinfo_t flash_net_Socket_writeByte; +static methodinfo_t flash_net_Socket_writeObject; +static methodinfo_t flash_net_Socket_readUTFBytes; +static methodinfo_t flash_net_Socket_close; +static methodinfo_t flash_net_Socket_writeMultiByte; +static methodinfo_t flash_net_Socket_readUnsignedByte; +static methodinfo_t flash_net_Socket_writeInt; +static methodinfo_t flash_net_Socket_readMultiByte; +static methodinfo_t flash_net_Socket_readBytes; +static methodinfo_t flash_net_Socket_writeShort; +static methodinfo_t flash_net_Socket_readShort; +static methodinfo_t flash_net_Socket_writeUTF; +static varinfo_t flash_net_Socket_timeout; +static methodinfo_t flash_net_Socket_writeBytes; +static varinfo_t flash_net_Socket_connected; +static methodinfo_t flash_net_Socket_readObject; +static varinfo_t flash_net_Socket_objectEncoding; +static methodinfo_t flash_net_Socket_flush; +static methodinfo_t flash_net_Socket_writeUnsignedInt; +static methodinfo_t flash_net_Socket_writeDouble; +static methodinfo_t flash_net_Socket_writeFloat; +static methodinfo_t flash_net_Socket_readInt; +static methodinfo_t flash_net_Socket_readByte; +static varinfo_t flash_net_Socket_bytesAvailable; +static varinfo_t flash_net_Socket_endian; +static methodinfo_t flash_net_Socket_readUnsignedShort; +static methodinfo_t flash_net_Socket_readUnsignedInt; +static methodinfo_t flash_net_Socket_readFloat; +static methodinfo_t flash_net_Socket_writeUTFBytes; +static methodinfo_t flash_net_Socket_readBoolean; +static methodinfo_t flash_net_Socket_readUTF; +static methodinfo_t flash_net_Socket_writeBoolean; +static methodinfo_t flash_net_Socket_connect; +static methodinfo_t flash_net_Socket_readDouble; +static methodinfo_t flash_net_Socket_writeByte; +static methodinfo_t flash_net_Socket_writeObject; +static methodinfo_t flash_net_Socket_readUTFBytes; +static methodinfo_t flash_net_Socket_close; +static methodinfo_t flash_net_Socket_writeMultiByte; +static methodinfo_t flash_net_Socket_readUnsignedByte; +static methodinfo_t flash_net_Socket_writeInt; +static methodinfo_t flash_net_Socket_readMultiByte; +static methodinfo_t flash_net_Socket_readBytes; +static methodinfo_t flash_net_Socket_writeShort; +static methodinfo_t flash_net_Socket_readShort; +static methodinfo_t flash_net_Socket_writeUTF; +static varinfo_t flash_net_Socket_timeout; +static methodinfo_t flash_net_Socket_writeBytes; +static varinfo_t flash_net_Socket_connected; +static methodinfo_t flash_net_Socket_readObject; +static varinfo_t flash_net_Socket_objectEncoding; +static methodinfo_t flash_net_Socket_flush; +static methodinfo_t flash_net_Socket_writeUnsignedInt; +static methodinfo_t flash_net_Socket_writeDouble; +static methodinfo_t flash_net_Socket_writeFloat; +static methodinfo_t flash_net_Socket_readInt; +static methodinfo_t flash_net_Socket_readByte; +static varinfo_t flash_net_Socket_bytesAvailable; +static varinfo_t flash_net_Socket_endian; +static methodinfo_t flash_net_Socket_readUnsignedShort; +static methodinfo_t flash_net_Socket_readUnsignedInt; +static methodinfo_t flash_net_Socket_readFloat; +static methodinfo_t flash_net_Socket_writeUTFBytes; +static methodinfo_t flash_net_Socket_readBoolean; +static methodinfo_t flash_net_Socket_readUTF; +static methodinfo_t _unescape; +static classinfo_t flash_utils_Timer; +static methodinfo_t flash_utils_Timer_reset; +static varinfo_t flash_utils_Timer_running; +static varinfo_t flash_utils_Timer_repeatCount; +static methodinfo_t flash_utils_Timer_stop; +static methodinfo_t flash_utils_Timer_start; +static varinfo_t flash_utils_Timer_currentCount; +static varinfo_t flash_utils_Timer_delay; +static methodinfo_t flash_utils_Timer_reset; +static varinfo_t flash_utils_Timer_running; +static varinfo_t flash_utils_Timer_repeatCount; +static methodinfo_t flash_utils_Timer_stop; +static methodinfo_t flash_utils_Timer_start; +static varinfo_t flash_utils_Timer_currentCount; +static varinfo_t flash_utils_Timer_delay; +static classinfo_t _Array; +static methodinfo_t _Array_forEach; +static methodinfo_t _Array_sortOn; +static methodinfo_t _Array_indexOf; +static methodinfo_t _Array_splice; +static methodinfo_t _Array_lastIndexOf; +static methodinfo_t _Array_map; +static methodinfo_t _Array_concat; +static methodinfo_t _Array_shift; +static methodinfo_t _Array_unshift; +static methodinfo_t _Array_some; +static methodinfo_t _Array_filter; +static methodinfo_t _Array_join; +static methodinfo_t _Array_slice; +static methodinfo_t _Array_every; +static methodinfo_t _Array_pop; +static methodinfo_t _Array_sort; +static methodinfo_t _Array_reverse; +static methodinfo_t _Array_push; +static varinfo_t _Array_length; +static methodinfo_t _Array_forEach; +static methodinfo_t _Array_sortOn; +static methodinfo_t _Array_indexOf; +static methodinfo_t _Array_splice; +static methodinfo_t _Array_lastIndexOf; +static methodinfo_t _Array_map; +static methodinfo_t _Array_concat; +static methodinfo_t _Array_shift; +static methodinfo_t _Array_unshift; +static methodinfo_t _Array_some; +static methodinfo_t _Array_filter; +static methodinfo_t _Array_join; +static methodinfo_t _Array_slice; +static methodinfo_t _Array_every; +static methodinfo_t _Array_pop; +static methodinfo_t _Array_sort; +static methodinfo_t _Array_reverse; +static methodinfo_t _Array_push; +static varinfo_t _Array_length; +static classinfo_t flash_geom_ColorTransform; +static varinfo_t flash_geom_ColorTransform_blueOffset; +static varinfo_t flash_geom_ColorTransform_greenOffset; +static varinfo_t flash_geom_ColorTransform_greenMultiplier; +static varinfo_t flash_geom_ColorTransform_redMultiplier; +static varinfo_t flash_geom_ColorTransform_color; +static methodinfo_t flash_geom_ColorTransform_concat; +static varinfo_t flash_geom_ColorTransform_alphaOffset; +static varinfo_t flash_geom_ColorTransform_blueMultiplier; +static methodinfo_t flash_geom_ColorTransform_toString; +static varinfo_t flash_geom_ColorTransform_alphaMultiplier; +static varinfo_t flash_geom_ColorTransform_redOffset; +static varinfo_t flash_geom_ColorTransform_blueOffset; +static varinfo_t flash_geom_ColorTransform_greenOffset; +static varinfo_t flash_geom_ColorTransform_greenMultiplier; +static varinfo_t flash_geom_ColorTransform_redMultiplier; +static varinfo_t flash_geom_ColorTransform_color; +static methodinfo_t flash_geom_ColorTransform_concat; +static varinfo_t flash_geom_ColorTransform_alphaOffset; +static varinfo_t flash_geom_ColorTransform_blueMultiplier; +static methodinfo_t flash_geom_ColorTransform_toString; +static varinfo_t flash_geom_ColorTransform_alphaMultiplier; +static varinfo_t flash_geom_ColorTransform_redOffset; +static classinfo_t flash_text_GridFitType; +static classinfo_t flash_filters_DisplacementMapFilterMode; +static classinfo_t flash_text_TextFieldType; +static classinfo_t flash_display_IGraphicsStroke; +static classinfo_t flash_media_SoundLoaderContext; +static varinfo_t flash_media_SoundLoaderContext_checkPolicyFile; +static varinfo_t flash_media_SoundLoaderContext_bufferTime; +static varinfo_t flash_media_SoundLoaderContext_checkPolicyFile; +static varinfo_t flash_media_SoundLoaderContext_bufferTime; +static classinfo_t flash_net_IDynamicPropertyOutput; +static methodinfo_t flash_net_IDynamicPropertyOutput_writeDynamicProperty; +static methodinfo_t flash_net_IDynamicPropertyOutput_writeDynamicProperty; +static classinfo_t flash_display_IGraphicsData; +static methodinfo_t flash_utils_getDefinitionByName; +static classinfo_t _Function; +static varinfo_t _Function_length; +static methodinfo_t _Function_apply; +static methodinfo_t _Function_call; +static varinfo_t _Function_prototype; +static varinfo_t _Function_length; +static methodinfo_t _Function_apply; +static methodinfo_t _Function_call; +static varinfo_t _Function_prototype; +static classinfo_t flash_geom_PerspectiveProjection; +static varinfo_t flash_geom_PerspectiveProjection_fieldOfView; +static varinfo_t flash_geom_PerspectiveProjection_projectionCenter; +static methodinfo_t flash_geom_PerspectiveProjection_toMatrix3D; +static varinfo_t flash_geom_PerspectiveProjection_focalLength; +static varinfo_t flash_geom_PerspectiveProjection_fieldOfView; +static varinfo_t flash_geom_PerspectiveProjection_projectionCenter; +static methodinfo_t flash_geom_PerspectiveProjection_toMatrix3D; +static varinfo_t flash_geom_PerspectiveProjection_focalLength; +static classinfo_t flash_text_engine_BreakOpportunity; +static methodinfo_t flash_sampler__getInvocationCount; +static methodinfo_t _parseFloat; +static classinfo_t flash_events_NetStatusEvent; +static methodinfo_t flash_events_NetStatusEvent_toString; +static varinfo_t flash_events_NetStatusEvent_info; +static methodinfo_t flash_events_NetStatusEvent_clone; +static methodinfo_t flash_events_NetStatusEvent_toString; +static varinfo_t flash_events_NetStatusEvent_info; +static methodinfo_t flash_events_NetStatusEvent_clone; +static classinfo_t flash_display_ShaderJob; +static methodinfo_t flash_display_ShaderJob_cancel; +static varinfo_t flash_display_ShaderJob_width; +static methodinfo_t flash_display_ShaderJob_start; +static varinfo_t flash_display_ShaderJob_shader; +static varinfo_t flash_display_ShaderJob_height; +static varinfo_t flash_display_ShaderJob_target; +static varinfo_t flash_display_ShaderJob_progress; +static methodinfo_t flash_display_ShaderJob_cancel; +static varinfo_t flash_display_ShaderJob_width; +static methodinfo_t flash_display_ShaderJob_start; +static varinfo_t flash_display_ShaderJob_shader; +static varinfo_t flash_display_ShaderJob_height; +static varinfo_t flash_display_ShaderJob_target; +static varinfo_t flash_display_ShaderJob_progress; +static classinfo_t _VerifyError; +static classinfo_t flash_events_AsyncErrorEvent; +static methodinfo_t flash_events_AsyncErrorEvent_toString; +static varinfo_t flash_events_AsyncErrorEvent_error; +static methodinfo_t flash_events_AsyncErrorEvent_clone; +static methodinfo_t flash_events_AsyncErrorEvent_toString; +static varinfo_t flash_events_AsyncErrorEvent_error; +static methodinfo_t flash_events_AsyncErrorEvent_clone; +static classinfo_t flash_net_SharedObject; +static varinfo_t flash_net_SharedObject_objectEncoding; +static varinfo_t flash_net_SharedObject_client; +static methodinfo_t flash_net_SharedObject_setProperty; +static methodinfo_t flash_net_SharedObject_clear; +static methodinfo_t flash_net_SharedObject_flush; +static methodinfo_t flash_net_SharedObject_connect; +static varinfo_t flash_net_SharedObject_size; +static methodinfo_t flash_net_SharedObject_setDirty; +static methodinfo_t flash_net_SharedObject_send; +static methodinfo_t flash_net_SharedObject_close; +static varinfo_t flash_net_SharedObject_data; +static varinfo_t flash_net_SharedObject_objectEncoding; +static varinfo_t flash_net_SharedObject_client; +static methodinfo_t flash_net_SharedObject_setProperty; +static methodinfo_t flash_net_SharedObject_clear; +static methodinfo_t flash_net_SharedObject_flush; +static methodinfo_t flash_net_SharedObject_connect; +static varinfo_t flash_net_SharedObject_size; +static methodinfo_t flash_net_SharedObject_setDirty; +static methodinfo_t flash_net_SharedObject_send; +static methodinfo_t flash_net_SharedObject_close; +static varinfo_t flash_net_SharedObject_data; +static classinfo_t _Namespace; +static methodinfo_t _Namespace_valueOf; +static methodinfo_t _Namespace_toString; +static varinfo_t _Namespace_uri; +static varinfo_t _Namespace_prefix; +static methodinfo_t _Namespace_valueOf; +static methodinfo_t _Namespace_toString; +static varinfo_t _Namespace_uri; +static varinfo_t _Namespace_prefix; +static methodinfo_t flash_utils_setTimeout; +static classinfo_t flash_geom_Matrix3D; +static methodinfo_t flash_geom_Matrix3D_decompose; +static methodinfo_t flash_geom_Matrix3D_pointAt; +static methodinfo_t flash_geom_Matrix3D_identity; +static methodinfo_t flash_geom_Matrix3D_transformVector; +static methodinfo_t flash_geom_Matrix3D_appendRotation; +static varinfo_t flash_geom_Matrix3D_determinant; +static methodinfo_t flash_geom_Matrix3D_prependRotation; +static varinfo_t flash_geom_Matrix3D_position; +static methodinfo_t flash_geom_Matrix3D_interpolateTo; +static methodinfo_t flash_geom_Matrix3D_appendScale; +static methodinfo_t flash_geom_Matrix3D_prepend; +static methodinfo_t flash_geom_Matrix3D_recompose; +static methodinfo_t flash_geom_Matrix3D_appendTranslation; +static methodinfo_t flash_geom_Matrix3D_invert; +static varinfo_t flash_geom_Matrix3D_rawData; +static methodinfo_t flash_geom_Matrix3D_prependTranslation; +static methodinfo_t flash_geom_Matrix3D_append; +static methodinfo_t flash_geom_Matrix3D_clone; +static methodinfo_t flash_geom_Matrix3D_prependScale; +static methodinfo_t flash_geom_Matrix3D_deltaTransformVector; +static methodinfo_t flash_geom_Matrix3D_transformVectors; +static methodinfo_t flash_geom_Matrix3D_transpose; +static methodinfo_t flash_geom_Matrix3D_decompose; +static methodinfo_t flash_geom_Matrix3D_pointAt; +static methodinfo_t flash_geom_Matrix3D_identity; +static methodinfo_t flash_geom_Matrix3D_transformVector; +static methodinfo_t flash_geom_Matrix3D_appendRotation; +static varinfo_t flash_geom_Matrix3D_determinant; +static methodinfo_t flash_geom_Matrix3D_prependRotation; +static varinfo_t flash_geom_Matrix3D_position; +static methodinfo_t flash_geom_Matrix3D_interpolateTo; +static methodinfo_t flash_geom_Matrix3D_appendScale; +static methodinfo_t flash_geom_Matrix3D_prepend; +static methodinfo_t flash_geom_Matrix3D_recompose; +static methodinfo_t flash_geom_Matrix3D_appendTranslation; +static methodinfo_t flash_geom_Matrix3D_invert; +static varinfo_t flash_geom_Matrix3D_rawData; +static methodinfo_t flash_geom_Matrix3D_prependTranslation; +static methodinfo_t flash_geom_Matrix3D_append; +static methodinfo_t flash_geom_Matrix3D_clone; +static methodinfo_t flash_geom_Matrix3D_prependScale; +static methodinfo_t flash_geom_Matrix3D_deltaTransformVector; +static methodinfo_t flash_geom_Matrix3D_transformVectors; +static methodinfo_t flash_geom_Matrix3D_transpose; +static methodinfo_t flash_sampler_pauseSampling; +static classinfo_t flash_system_Capabilities; +static methodinfo_t flash_sampler_getSetterInvocationCount; +static methodinfo_t flash_sampler_getGetterInvocationCount; +static classinfo_t flash_filters_BlurFilter; +static varinfo_t flash_filters_BlurFilter_blurY; +static methodinfo_t flash_filters_BlurFilter_clone; +static varinfo_t flash_filters_BlurFilter_quality; +static varinfo_t flash_filters_BlurFilter_blurX; +static varinfo_t flash_filters_BlurFilter_blurY; +static methodinfo_t flash_filters_BlurFilter_clone; +static varinfo_t flash_filters_BlurFilter_quality; +static varinfo_t flash_filters_BlurFilter_blurX; +static methodinfo_t _isFinite; +static classinfo_t flash_media_Video; +static methodinfo_t flash_media_Video_attachCamera; +static varinfo_t flash_media_Video_videoWidth; +static methodinfo_t flash_media_Video_clear; +static varinfo_t flash_media_Video_deblocking; +static varinfo_t flash_media_Video_videoHeight; +static methodinfo_t flash_media_Video_attachNetStream; +static varinfo_t flash_media_Video_smoothing; +static methodinfo_t flash_media_Video_attachCamera; +static varinfo_t flash_media_Video_videoWidth; +static methodinfo_t flash_media_Video_clear; +static varinfo_t flash_media_Video_deblocking; +static varinfo_t flash_media_Video_videoHeight; +static methodinfo_t flash_media_Video_attachNetStream; +static varinfo_t flash_media_Video_smoothing; +static classinfo_t flash_text_engine_TextLineCreationResult; +static classinfo_t _Error; +static varinfo_t _Error_message; +static varinfo_t _Error_errorID; +static methodinfo_t _Error_getStackTrace; +static varinfo_t _Error_name; +static varinfo_t _Error_message; +static varinfo_t _Error_errorID; +static methodinfo_t _Error_getStackTrace; +static varinfo_t _Error_name; +static classinfo_t flash_xml_XMLNode; +static varinfo_t flash_xml_XMLNode_childNodes; +static methodinfo_t flash_xml_XMLNode_appendChild; +static varinfo_t flash_xml_XMLNode_nextSibling; +static varinfo_t flash_xml_XMLNode_nodeType; +static varinfo_t flash_xml_XMLNode_attributes; +static varinfo_t flash_xml_XMLNode_firstChild; +static varinfo_t flash_xml_XMLNode_parentNode; +static methodinfo_t flash_xml_XMLNode_toString; +static varinfo_t flash_xml_XMLNode_prefix; +static varinfo_t flash_xml_XMLNode_localName; +static varinfo_t flash_xml_XMLNode_nodeName; +static methodinfo_t flash_xml_XMLNode_getNamespaceForPrefix; +static methodinfo_t flash_xml_XMLNode_insertBefore; +static varinfo_t flash_xml_XMLNode_lastChild; +static methodinfo_t flash_xml_XMLNode_cloneNode; +static methodinfo_t flash_xml_XMLNode_removeNode; +static varinfo_t flash_xml_XMLNode_namespaceURI; +static varinfo_t flash_xml_XMLNode_previousSibling; +static methodinfo_t flash_xml_XMLNode_hasChildNodes; +static methodinfo_t flash_xml_XMLNode_getPrefixForNamespace; +static varinfo_t flash_xml_XMLNode_nodeValue; +static varinfo_t flash_xml_XMLNode_childNodes; +static methodinfo_t flash_xml_XMLNode_appendChild; +static varinfo_t flash_xml_XMLNode_nextSibling; +static varinfo_t flash_xml_XMLNode_nodeType; +static varinfo_t flash_xml_XMLNode_attributes; +static varinfo_t flash_xml_XMLNode_firstChild; +static varinfo_t flash_xml_XMLNode_parentNode; +static methodinfo_t flash_xml_XMLNode_toString; +static varinfo_t flash_xml_XMLNode_prefix; +static varinfo_t flash_xml_XMLNode_localName; +static varinfo_t flash_xml_XMLNode_nodeName; +static methodinfo_t flash_xml_XMLNode_getNamespaceForPrefix; +static methodinfo_t flash_xml_XMLNode_insertBefore; +static varinfo_t flash_xml_XMLNode_lastChild; +static methodinfo_t flash_xml_XMLNode_cloneNode; +static methodinfo_t flash_xml_XMLNode_removeNode; +static varinfo_t flash_xml_XMLNode_namespaceURI; +static varinfo_t flash_xml_XMLNode_previousSibling; +static methodinfo_t flash_xml_XMLNode_hasChildNodes; +static methodinfo_t flash_xml_XMLNode_getPrefixForNamespace; +static varinfo_t flash_xml_XMLNode_nodeValue; +static classinfo_t flash_net_URLVariables; +static methodinfo_t flash_net_URLVariables_toString; +static methodinfo_t flash_net_URLVariables_decode; +static methodinfo_t flash_net_URLVariables_toString; +static methodinfo_t flash_net_URLVariables_decode; +static classinfo_t flash_display_LoaderInfo; +static varinfo_t flash_display_LoaderInfo_actionScriptVersion; +static varinfo_t flash_display_LoaderInfo_contentType; +static varinfo_t flash_display_LoaderInfo_sameDomain; +static varinfo_t flash_display_LoaderInfo_bytesTotal; +static varinfo_t flash_display_LoaderInfo_loaderURL; +static varinfo_t flash_display_LoaderInfo_width; +static methodinfo_t flash_display_LoaderInfo_dispatchEvent; +static varinfo_t flash_display_LoaderInfo_height; +static varinfo_t flash_display_LoaderInfo_frameRate; +static varinfo_t flash_display_LoaderInfo_parameters; +static varinfo_t flash_display_LoaderInfo_bytesLoaded; +static varinfo_t flash_display_LoaderInfo_url; +static varinfo_t flash_display_LoaderInfo_content; +static varinfo_t flash_display_LoaderInfo_swfVersion; +static varinfo_t flash_display_LoaderInfo_bytes; +static varinfo_t flash_display_LoaderInfo_loader; +static varinfo_t flash_display_LoaderInfo_applicationDomain; +static varinfo_t flash_display_LoaderInfo_parentAllowsChild; +static varinfo_t flash_display_LoaderInfo_childAllowsParent; +static varinfo_t flash_display_LoaderInfo_sharedEvents; +static varinfo_t flash_display_LoaderInfo_actionScriptVersion; +static varinfo_t flash_display_LoaderInfo_contentType; +static varinfo_t flash_display_LoaderInfo_sameDomain; +static varinfo_t flash_display_LoaderInfo_bytesTotal; +static varinfo_t flash_display_LoaderInfo_loaderURL; +static varinfo_t flash_display_LoaderInfo_width; +static methodinfo_t flash_display_LoaderInfo_dispatchEvent; +static varinfo_t flash_display_LoaderInfo_height; +static varinfo_t flash_display_LoaderInfo_frameRate; +static varinfo_t flash_display_LoaderInfo_parameters; +static varinfo_t flash_display_LoaderInfo_bytesLoaded; +static varinfo_t flash_display_LoaderInfo_url; +static varinfo_t flash_display_LoaderInfo_content; +static varinfo_t flash_display_LoaderInfo_swfVersion; +static varinfo_t flash_display_LoaderInfo_bytes; +static varinfo_t flash_display_LoaderInfo_loader; +static varinfo_t flash_display_LoaderInfo_applicationDomain; +static varinfo_t flash_display_LoaderInfo_parentAllowsChild; +static varinfo_t flash_display_LoaderInfo_childAllowsParent; +static varinfo_t flash_display_LoaderInfo_sharedEvents; +static classinfo_t flash_sampler_Sample; +static varinfo_t flash_sampler_Sample_time; +static varinfo_t flash_sampler_Sample_stack; +static varinfo_t flash_sampler_Sample_time; +static varinfo_t flash_sampler_Sample_stack; +static classinfo_t flash_text_engine_DigitWidth; +static classinfo_t flash_net_URLRequestMethod; +static methodinfo_t adobe_utils_MMExecute; +static classinfo_t flash_system_System; +static classinfo_t flash_filters_BitmapFilterQuality; +static classinfo_t flash_display_DisplayObjectContainer; +static methodinfo_t flash_display_DisplayObjectContainer_addChild; +static methodinfo_t flash_display_DisplayObjectContainer_getObjectsUnderPoint; +static methodinfo_t flash_display_DisplayObjectContainer_removeChildAt; +static methodinfo_t flash_display_DisplayObjectContainer_swapChildren; +static methodinfo_t flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint; +static methodinfo_t flash_display_DisplayObjectContainer_setChildIndex; +static varinfo_t flash_display_DisplayObjectContainer_numChildren; +static methodinfo_t flash_display_DisplayObjectContainer_getChildIndex; +static methodinfo_t flash_display_DisplayObjectContainer_getChildAt; +static methodinfo_t flash_display_DisplayObjectContainer_removeChild; +static methodinfo_t flash_display_DisplayObjectContainer_addChildAt; +static methodinfo_t flash_display_DisplayObjectContainer_contains; +static methodinfo_t flash_display_DisplayObjectContainer_getChildByName; +static methodinfo_t flash_display_DisplayObjectContainer_swapChildrenAt; +static varinfo_t flash_display_DisplayObjectContainer_mouseChildren; +static varinfo_t flash_display_DisplayObjectContainer_tabChildren; +static varinfo_t flash_display_DisplayObjectContainer_textSnapshot; +static methodinfo_t flash_display_DisplayObjectContainer_addChild; +static methodinfo_t flash_display_DisplayObjectContainer_getObjectsUnderPoint; +static methodinfo_t flash_display_DisplayObjectContainer_removeChildAt; +static methodinfo_t flash_display_DisplayObjectContainer_swapChildren; +static methodinfo_t flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint; +static methodinfo_t flash_display_DisplayObjectContainer_setChildIndex; +static varinfo_t flash_display_DisplayObjectContainer_numChildren; +static methodinfo_t flash_display_DisplayObjectContainer_getChildIndex; +static methodinfo_t flash_display_DisplayObjectContainer_getChildAt; +static methodinfo_t flash_display_DisplayObjectContainer_removeChild; +static methodinfo_t flash_display_DisplayObjectContainer_addChildAt; +static methodinfo_t flash_display_DisplayObjectContainer_contains; +static methodinfo_t flash_display_DisplayObjectContainer_getChildByName; +static methodinfo_t flash_display_DisplayObjectContainer_swapChildrenAt; +static varinfo_t flash_display_DisplayObjectContainer_mouseChildren; +static varinfo_t flash_display_DisplayObjectContainer_tabChildren; +static varinfo_t flash_display_DisplayObjectContainer_textSnapshot; +static classinfo_t flash_system_LoaderContext; +static varinfo_t flash_system_LoaderContext_checkPolicyFile; +static varinfo_t flash_system_LoaderContext_securityDomain; +static varinfo_t flash_system_LoaderContext_applicationDomain; +static varinfo_t flash_system_LoaderContext_checkPolicyFile; +static varinfo_t flash_system_LoaderContext_securityDomain; +static varinfo_t flash_system_LoaderContext_applicationDomain; +static methodinfo_t flash_utils_clearTimeout; +static methodinfo_t _isXMLName; +static classinfo_t flash_xml_XMLNodeType; +static classinfo_t flash_events_ErrorEvent; +static methodinfo_t flash_events_ErrorEvent_toString; +static methodinfo_t flash_events_ErrorEvent_clone; +static methodinfo_t flash_events_ErrorEvent_toString; +static methodinfo_t flash_events_ErrorEvent_clone; +static classinfo_t flash_utils_IDataOutput; +static methodinfo_t flash_utils_IDataOutput_writeUnsignedInt; +static methodinfo_t flash_utils_IDataOutput_writeInt; +static varinfo_t flash_utils_IDataOutput_objectEncoding; +static methodinfo_t flash_utils_IDataOutput_writeUTFBytes; +static methodinfo_t flash_utils_IDataOutput_writeObject; +static methodinfo_t flash_utils_IDataOutput_writeMultiByte; +static methodinfo_t flash_utils_IDataOutput_writeShort; +static methodinfo_t flash_utils_IDataOutput_writeFloat; +static methodinfo_t flash_utils_IDataOutput_writeUTF; +static methodinfo_t flash_utils_IDataOutput_writeByte; +static methodinfo_t flash_utils_IDataOutput_writeBoolean; +static methodinfo_t flash_utils_IDataOutput_writeDouble; +static methodinfo_t flash_utils_IDataOutput_writeBytes; +static varinfo_t flash_utils_IDataOutput_endian; +static methodinfo_t flash_utils_IDataOutput_writeUnsignedInt; +static methodinfo_t flash_utils_IDataOutput_writeInt; +static varinfo_t flash_utils_IDataOutput_objectEncoding; +static methodinfo_t flash_utils_IDataOutput_writeUTFBytes; +static methodinfo_t flash_utils_IDataOutput_writeObject; +static methodinfo_t flash_utils_IDataOutput_writeMultiByte; +static methodinfo_t flash_utils_IDataOutput_writeShort; +static methodinfo_t flash_utils_IDataOutput_writeFloat; +static methodinfo_t flash_utils_IDataOutput_writeUTF; +static methodinfo_t flash_utils_IDataOutput_writeByte; +static methodinfo_t flash_utils_IDataOutput_writeBoolean; +static methodinfo_t flash_utils_IDataOutput_writeDouble; +static methodinfo_t flash_utils_IDataOutput_writeBytes; +static varinfo_t flash_utils_IDataOutput_endian; +static classinfo_t flash_geom_Utils3D; +static classinfo_t flash_events_TextEvent; +static methodinfo_t flash_events_TextEvent_toString; +static varinfo_t flash_events_TextEvent_text; +static methodinfo_t flash_events_TextEvent_clone; +static methodinfo_t flash_events_TextEvent_toString; +static varinfo_t flash_events_TextEvent_text; +static methodinfo_t flash_events_TextEvent_clone; +static classinfo_t flash_utils_Proxy; +static methodinfo_t flash_utils_Proxy_callProperty; +static methodinfo_t flash_utils_Proxy_setProperty; +static methodinfo_t flash_utils_Proxy_getProperty; +static methodinfo_t flash_utils_Proxy_nextName; +static methodinfo_t flash_utils_Proxy_nextNameIndex; +static methodinfo_t flash_utils_Proxy_hasProperty; +static methodinfo_t flash_utils_Proxy_deleteProperty; +static methodinfo_t flash_utils_Proxy_getDescendants; +static methodinfo_t flash_utils_Proxy_isAttribute; +static methodinfo_t flash_utils_Proxy_nextValue; +static methodinfo_t flash_utils_Proxy_callProperty; +static methodinfo_t flash_utils_Proxy_setProperty; +static methodinfo_t flash_utils_Proxy_getProperty; +static methodinfo_t flash_utils_Proxy_nextName; +static methodinfo_t flash_utils_Proxy_nextNameIndex; +static methodinfo_t flash_utils_Proxy_hasProperty; +static methodinfo_t flash_utils_Proxy_deleteProperty; +static methodinfo_t flash_utils_Proxy_getDescendants; +static methodinfo_t flash_utils_Proxy_isAttribute; +static methodinfo_t flash_utils_Proxy_nextValue; +static classinfo_t flash_text_engine_FontPosture; +static classinfo_t flash_xml_XMLDocument; +static varinfo_t flash_xml_XMLDocument_docTypeDecl; +static varinfo_t flash_xml_XMLDocument_idMap; +static methodinfo_t flash_xml_XMLDocument_toString; +static varinfo_t flash_xml_XMLDocument_xmlDecl; +static methodinfo_t flash_xml_XMLDocument_createElement; +static varinfo_t flash_xml_XMLDocument_ignoreWhite; +static methodinfo_t flash_xml_XMLDocument_createTextNode; +static methodinfo_t flash_xml_XMLDocument_parseXML; +static varinfo_t flash_xml_XMLDocument_docTypeDecl; +static varinfo_t flash_xml_XMLDocument_idMap; +static methodinfo_t flash_xml_XMLDocument_toString; +static varinfo_t flash_xml_XMLDocument_xmlDecl; +static methodinfo_t flash_xml_XMLDocument_createElement; +static varinfo_t flash_xml_XMLDocument_ignoreWhite; +static methodinfo_t flash_xml_XMLDocument_createTextNode; +static methodinfo_t flash_xml_XMLDocument_parseXML; +static classinfo_t flash_display_ShaderInput; +static varinfo_t flash_display_ShaderInput_width; +static varinfo_t flash_display_ShaderInput_input; +static varinfo_t flash_display_ShaderInput_height; +static varinfo_t flash_display_ShaderInput_index; +static varinfo_t flash_display_ShaderInput_channels; +static varinfo_t flash_display_ShaderInput_width; +static varinfo_t flash_display_ShaderInput_input; +static varinfo_t flash_display_ShaderInput_height; +static varinfo_t flash_display_ShaderInput_index; +static varinfo_t flash_display_ShaderInput_channels; +static classinfo_t flash_text_engine_TextBlock; +static methodinfo_t flash_text_engine_TextBlock_createTextLine; +static varinfo_t flash_text_engine_TextBlock_bidiLevel; +static methodinfo_t flash_text_engine_TextBlock_getTextLineAtCharIndex; +static varinfo_t flash_text_engine_TextBlock_lastLine; +static methodinfo_t flash_text_engine_TextBlock_findPreviousWordBoundary; +static methodinfo_t flash_text_engine_TextBlock_findPreviousAtomBoundary; +static varinfo_t flash_text_engine_TextBlock_baselineZero; +static varinfo_t flash_text_engine_TextBlock_applyNonLinearFontScaling; +static varinfo_t flash_text_engine_TextBlock_firstLine; +static varinfo_t flash_text_engine_TextBlock_textJustifier; +static methodinfo_t flash_text_engine_TextBlock_releaseLines; +static varinfo_t flash_text_engine_TextBlock_firstInvalidLine; +static varinfo_t flash_text_engine_TextBlock_baselineFontSize; +static varinfo_t flash_text_engine_TextBlock_lineRotation; +static varinfo_t flash_text_engine_TextBlock_userData; +static varinfo_t flash_text_engine_TextBlock_content; +static varinfo_t flash_text_engine_TextBlock_textLineCreationResult; +static varinfo_t flash_text_engine_TextBlock_baselineFontDescription; +static methodinfo_t flash_text_engine_TextBlock_findNextAtomBoundary; +static methodinfo_t flash_text_engine_TextBlock_findNextWordBoundary; +static varinfo_t flash_text_engine_TextBlock_tabStops; +static methodinfo_t flash_text_engine_TextBlock_dump; +static methodinfo_t flash_text_engine_TextBlock_createTextLine; +static varinfo_t flash_text_engine_TextBlock_bidiLevel; +static methodinfo_t flash_text_engine_TextBlock_getTextLineAtCharIndex; +static varinfo_t flash_text_engine_TextBlock_lastLine; +static methodinfo_t flash_text_engine_TextBlock_findPreviousWordBoundary; +static methodinfo_t flash_text_engine_TextBlock_findPreviousAtomBoundary; +static varinfo_t flash_text_engine_TextBlock_baselineZero; +static varinfo_t flash_text_engine_TextBlock_applyNonLinearFontScaling; +static varinfo_t flash_text_engine_TextBlock_firstLine; +static varinfo_t flash_text_engine_TextBlock_textJustifier; +static methodinfo_t flash_text_engine_TextBlock_releaseLines; +static varinfo_t flash_text_engine_TextBlock_firstInvalidLine; +static varinfo_t flash_text_engine_TextBlock_baselineFontSize; +static varinfo_t flash_text_engine_TextBlock_lineRotation; +static varinfo_t flash_text_engine_TextBlock_userData; +static varinfo_t flash_text_engine_TextBlock_content; +static varinfo_t flash_text_engine_TextBlock_textLineCreationResult; +static varinfo_t flash_text_engine_TextBlock_baselineFontDescription; +static methodinfo_t flash_text_engine_TextBlock_findNextAtomBoundary; +static methodinfo_t flash_text_engine_TextBlock_findNextWordBoundary; +static varinfo_t flash_text_engine_TextBlock_tabStops; +static methodinfo_t flash_text_engine_TextBlock_dump; +static classinfo_t flash_ui_MouseCursor; +static varinfo_t flash_utils_flash_proxy; +static classinfo_t flash_display_MorphShape; +static classinfo_t flash_text_TextDisplayMode; +static classinfo_t flash_net_URLLoaderDataFormat; +static classinfo_t flash_display_StageQuality; +static classinfo_t flash_display_Sprite; +static methodinfo_t flash_display_Sprite_stopDrag; +static varinfo_t flash_display_Sprite_buttonMode; +static varinfo_t flash_display_Sprite_soundTransform; +static varinfo_t flash_display_Sprite_hitArea; +static varinfo_t flash_display_Sprite_useHandCursor; +static varinfo_t flash_display_Sprite_graphics; +static methodinfo_t flash_display_Sprite_startDrag; +static varinfo_t flash_display_Sprite_dropTarget; +static methodinfo_t flash_display_Sprite_stopDrag; +static varinfo_t flash_display_Sprite_buttonMode; +static varinfo_t flash_display_Sprite_soundTransform; +static varinfo_t flash_display_Sprite_hitArea; +static varinfo_t flash_display_Sprite_useHandCursor; +static varinfo_t flash_display_Sprite_graphics; +static methodinfo_t flash_display_Sprite_startDrag; +static varinfo_t flash_display_Sprite_dropTarget; +static classinfo_t flash_ui_Keyboard; +static classinfo_t flash_filters_DisplacementMapFilter; +static varinfo_t flash_filters_DisplacementMapFilter_scaleY; +static varinfo_t flash_filters_DisplacementMapFilter_mapPoint; +static varinfo_t flash_filters_DisplacementMapFilter_scaleX; +static varinfo_t flash_filters_DisplacementMapFilter_mapBitmap; +static varinfo_t flash_filters_DisplacementMapFilter_mode; +static varinfo_t flash_filters_DisplacementMapFilter_color; +static varinfo_t flash_filters_DisplacementMapFilter_componentX; +static methodinfo_t flash_filters_DisplacementMapFilter_clone; +static varinfo_t flash_filters_DisplacementMapFilter_alpha; +static varinfo_t flash_filters_DisplacementMapFilter_componentY; +static varinfo_t flash_filters_DisplacementMapFilter_scaleY; +static varinfo_t flash_filters_DisplacementMapFilter_mapPoint; +static varinfo_t flash_filters_DisplacementMapFilter_scaleX; +static varinfo_t flash_filters_DisplacementMapFilter_mapBitmap; +static varinfo_t flash_filters_DisplacementMapFilter_mode; +static varinfo_t flash_filters_DisplacementMapFilter_color; +static varinfo_t flash_filters_DisplacementMapFilter_componentX; +static methodinfo_t flash_filters_DisplacementMapFilter_clone; +static varinfo_t flash_filters_DisplacementMapFilter_alpha; +static varinfo_t flash_filters_DisplacementMapFilter_componentY; +static methodinfo_t flash_utils_escapeMultiByte; +static methodinfo_t adobe_utils_MMEndCommand; +static classinfo_t flash_display_GradientType; +static classinfo_t flash_media_ID3Info; +static varinfo_t flash_media_ID3Info_comment; +static varinfo_t flash_media_ID3Info_year; +static varinfo_t flash_media_ID3Info_track; +static varinfo_t flash_media_ID3Info_artist; +static varinfo_t flash_media_ID3Info_songName; +static varinfo_t flash_media_ID3Info_genre; +static varinfo_t flash_media_ID3Info_album; +static varinfo_t flash_media_ID3Info_comment; +static varinfo_t flash_media_ID3Info_year; +static varinfo_t flash_media_ID3Info_track; +static varinfo_t flash_media_ID3Info_artist; +static varinfo_t flash_media_ID3Info_songName; +static varinfo_t flash_media_ID3Info_genre; +static varinfo_t flash_media_ID3Info_album; +static classinfo_t flash_display_GraphicsSolidFill; +static varinfo_t flash_display_GraphicsSolidFill_color; +static varinfo_t flash_display_GraphicsSolidFill_alpha; +static varinfo_t flash_display_GraphicsSolidFill_color; +static varinfo_t flash_display_GraphicsSolidFill_alpha; +static classinfo_t flash_filters_ColorMatrixFilter; +static varinfo_t flash_filters_ColorMatrixFilter_matrix; +static methodinfo_t flash_filters_ColorMatrixFilter_clone; +static varinfo_t flash_filters_ColorMatrixFilter_matrix; +static methodinfo_t flash_filters_ColorMatrixFilter_clone; +static classinfo_t flash_net_NetStreamPlayTransitions; +static classinfo_t flash_media_SoundCodec; +static classinfo_t flash_net_ObjectEncoding; +static classinfo_t flash_text_engine_GroupElement; +static methodinfo_t flash_text_engine_GroupElement_groupElements; +static methodinfo_t flash_text_engine_GroupElement_splitTextElement; +static methodinfo_t flash_text_engine_GroupElement_mergeTextElements; +static methodinfo_t flash_text_engine_GroupElement_getElementAtCharIndex; +static varinfo_t flash_text_engine_GroupElement_elementCount; +static methodinfo_t flash_text_engine_GroupElement_setElements; +static methodinfo_t flash_text_engine_GroupElement_getElementAt; +static methodinfo_t flash_text_engine_GroupElement_ungroupElements; +static methodinfo_t flash_text_engine_GroupElement_replaceElements; +static methodinfo_t flash_text_engine_GroupElement_getElementIndex; +static methodinfo_t flash_text_engine_GroupElement_groupElements; +static methodinfo_t flash_text_engine_GroupElement_splitTextElement; +static methodinfo_t flash_text_engine_GroupElement_mergeTextElements; +static methodinfo_t flash_text_engine_GroupElement_getElementAtCharIndex; +static varinfo_t flash_text_engine_GroupElement_elementCount; +static methodinfo_t flash_text_engine_GroupElement_setElements; +static methodinfo_t flash_text_engine_GroupElement_getElementAt; +static methodinfo_t flash_text_engine_GroupElement_ungroupElements; +static methodinfo_t flash_text_engine_GroupElement_replaceElements; +static methodinfo_t flash_text_engine_GroupElement_getElementIndex; +static methodinfo_t _parseInt; +static classinfo_t _QName; +static varinfo_t _QName_localName; +static methodinfo_t _QName_valueOf; +static methodinfo_t _QName_toString; +static varinfo_t _QName_uri; +static varinfo_t _QName_localName; +static methodinfo_t _QName_valueOf; +static methodinfo_t _QName_toString; +static varinfo_t _QName_uri; +static classinfo_t _UninitializedError; +static classinfo_t _Date; +static methodinfo_t _Date_getTimezoneOffset; +static methodinfo_t _Date_getTime; +static methodinfo_t _Date_setUTCMilliseconds; +static varinfo_t _Date_month; +static methodinfo_t _Date_toString; +static methodinfo_t _Date_getHours; +static varinfo_t _Date_date; +static varinfo_t _Date_milliseconds; +static methodinfo_t _Date_setSeconds; +static methodinfo_t _Date_getDate; +static varinfo_t _Date_hoursUTC; +static methodinfo_t _Date_getUTCDate; +static varinfo_t _Date_timezoneOffset; +static methodinfo_t _Date_setTime; +static varinfo_t _Date_millisecondsUTC; +static varinfo_t _Date_minutes; +static methodinfo_t _Date_setUTCHours; +static varinfo_t _Date_minutesUTC; +static methodinfo_t _Date_toLocaleTimeString; +static varinfo_t _Date_fullYearUTC; +static varinfo_t _Date_time; +static varinfo_t _Date_monthUTC; +static methodinfo_t _Date_getUTCMilliseconds; +static methodinfo_t _Date_toDateString; +static methodinfo_t _Date_getMonth; +static methodinfo_t _Date_setMinutes; +static methodinfo_t _Date_toLocaleDateString; +static varinfo_t _Date_fullYear; +static methodinfo_t _Date_getUTCFullYear; +static methodinfo_t _Date_getSeconds; +static varinfo_t _Date_dateUTC; +static methodinfo_t _Date_getMilliseconds; +static methodinfo_t _Date_setUTCMinutes; +static varinfo_t _Date_day; +static methodinfo_t _Date_setUTCSeconds; +static methodinfo_t _Date_setUTCDate; +static methodinfo_t _Date_getUTCMonth; +static methodinfo_t _Date_valueOf; +static varinfo_t _Date_seconds; +static methodinfo_t _Date_getUTCMinutes; +static methodinfo_t _Date_setDate; +static methodinfo_t _Date_getFullYear; +static methodinfo_t _Date_setFullYear; +static methodinfo_t _Date_setHours; +static methodinfo_t _Date_setMonth; +static methodinfo_t _Date_getUTCSeconds; +static methodinfo_t _Date_getMinutes; +static methodinfo_t _Date_toLocaleString; +static methodinfo_t _Date_toUTCString; +static varinfo_t _Date_dayUTC; +static methodinfo_t _Date_getDay; +static methodinfo_t _Date_setUTCMonth; +static varinfo_t _Date_hours; +static methodinfo_t _Date_getUTCDay; +static methodinfo_t _Date_setUTCFullYear; +static varinfo_t _Date_secondsUTC; +static methodinfo_t _Date_toTimeString; +static methodinfo_t _Date_setMilliseconds; +static methodinfo_t _Date_getUTCHours; +static methodinfo_t _Date_getTimezoneOffset; +static methodinfo_t _Date_getTime; +static methodinfo_t _Date_setUTCMilliseconds; +static varinfo_t _Date_month; +static methodinfo_t _Date_toString; +static methodinfo_t _Date_getHours; +static varinfo_t _Date_date; +static varinfo_t _Date_milliseconds; +static methodinfo_t _Date_setSeconds; +static methodinfo_t _Date_getDate; +static varinfo_t _Date_hoursUTC; +static methodinfo_t _Date_getUTCDate; +static varinfo_t _Date_timezoneOffset; +static methodinfo_t _Date_setTime; +static varinfo_t _Date_millisecondsUTC; +static varinfo_t _Date_minutes; +static methodinfo_t _Date_setUTCHours; +static varinfo_t _Date_minutesUTC; +static methodinfo_t _Date_toLocaleTimeString; +static varinfo_t _Date_fullYearUTC; +static varinfo_t _Date_time; +static varinfo_t _Date_monthUTC; +static methodinfo_t _Date_getUTCMilliseconds; +static methodinfo_t _Date_toDateString; +static methodinfo_t _Date_getMonth; +static methodinfo_t _Date_setMinutes; +static methodinfo_t _Date_toLocaleDateString; +static varinfo_t _Date_fullYear; +static methodinfo_t _Date_getUTCFullYear; +static methodinfo_t _Date_getSeconds; +static varinfo_t _Date_dateUTC; +static methodinfo_t _Date_getMilliseconds; +static methodinfo_t _Date_setUTCMinutes; +static varinfo_t _Date_day; +static methodinfo_t _Date_setUTCSeconds; +static methodinfo_t _Date_setUTCDate; +static methodinfo_t _Date_getUTCMonth; +static methodinfo_t _Date_valueOf; +static varinfo_t _Date_seconds; +static methodinfo_t _Date_getUTCMinutes; +static methodinfo_t _Date_setDate; +static methodinfo_t _Date_getFullYear; +static methodinfo_t _Date_setFullYear; +static methodinfo_t _Date_setHours; +static methodinfo_t _Date_setMonth; +static methodinfo_t _Date_getUTCSeconds; +static methodinfo_t _Date_getMinutes; +static methodinfo_t _Date_toLocaleString; +static methodinfo_t _Date_toUTCString; +static varinfo_t _Date_dayUTC; +static methodinfo_t _Date_getDay; +static methodinfo_t _Date_setUTCMonth; +static varinfo_t _Date_hours; +static methodinfo_t _Date_getUTCDay; +static methodinfo_t _Date_setUTCFullYear; +static varinfo_t _Date_secondsUTC; +static methodinfo_t _Date_toTimeString; +static methodinfo_t _Date_setMilliseconds; +static methodinfo_t _Date_getUTCHours; +static classinfo_t flash_text_StyleSheet; +static varinfo_t flash_text_StyleSheet_styleNames; +static methodinfo_t flash_text_StyleSheet_clear; +static methodinfo_t flash_text_StyleSheet_transform; +static methodinfo_t flash_text_StyleSheet_getStyle; +static methodinfo_t flash_text_StyleSheet_parseCSS; +static methodinfo_t flash_text_StyleSheet_setStyle; +static varinfo_t flash_text_StyleSheet_styleNames; +static methodinfo_t flash_text_StyleSheet_clear; +static methodinfo_t flash_text_StyleSheet_transform; +static methodinfo_t flash_text_StyleSheet_getStyle; +static methodinfo_t flash_text_StyleSheet_parseCSS; +static methodinfo_t flash_text_StyleSheet_setStyle; +static classinfo_t flash_display_ActionScriptVersion; +static classinfo_t flash_text_engine_EastAsianJustifier; +static varinfo_t flash_text_engine_EastAsianJustifier_justificationStyle; +static methodinfo_t flash_text_engine_EastAsianJustifier_clone; +static varinfo_t flash_text_engine_EastAsianJustifier_justificationStyle; +static methodinfo_t flash_text_engine_EastAsianJustifier_clone; +static classinfo_t _String; +static methodinfo_t _String_indexOf; +static methodinfo_t _String_replace; +static methodinfo_t _String_lastIndexOf; +static methodinfo_t _String_valueOf; +static methodinfo_t _String_concat; +static methodinfo_t _String_substr; +static methodinfo_t _String_slice; +static methodinfo_t _String_search; +static methodinfo_t _String_toLocaleUpperCase; +static methodinfo_t _String_toString; +static methodinfo_t _String_toUpperCase; +static methodinfo_t _String_charAt; +static methodinfo_t _String_match; +static methodinfo_t _String_charCodeAt; +static methodinfo_t _String_substring; +static methodinfo_t _String_localeCompare; +static methodinfo_t _String_split; +static methodinfo_t _String_toLocaleLowerCase; +static varinfo_t _String_length; +static methodinfo_t _String_toLowerCase; +static methodinfo_t _String_indexOf; +static methodinfo_t _String_replace; +static methodinfo_t _String_lastIndexOf; +static methodinfo_t _String_valueOf; +static methodinfo_t _String_concat; +static methodinfo_t _String_substr; +static methodinfo_t _String_slice; +static methodinfo_t _String_search; +static methodinfo_t _String_toLocaleUpperCase; +static methodinfo_t _String_toString; +static methodinfo_t _String_toUpperCase; +static methodinfo_t _String_charAt; +static methodinfo_t _String_match; +static methodinfo_t _String_charCodeAt; +static methodinfo_t _String_substring; +static methodinfo_t _String_localeCompare; +static methodinfo_t _String_split; +static methodinfo_t _String_toLocaleLowerCase; +static varinfo_t _String_length; +static methodinfo_t _String_toLowerCase; +static classinfo_t flash_media_SoundChannel; +static varinfo_t flash_media_SoundChannel_leftPeak; +static methodinfo_t flash_media_SoundChannel_stop; +static varinfo_t flash_media_SoundChannel_position; +static varinfo_t flash_media_SoundChannel_soundTransform; +static varinfo_t flash_media_SoundChannel_rightPeak; +static varinfo_t flash_media_SoundChannel_leftPeak; +static methodinfo_t flash_media_SoundChannel_stop; +static varinfo_t flash_media_SoundChannel_position; +static varinfo_t flash_media_SoundChannel_soundTransform; +static varinfo_t flash_media_SoundChannel_rightPeak; +static classinfo_t flash_desktop_Clipboard; +static methodinfo_t flash_desktop_Clipboard_setDataHandler; +static methodinfo_t flash_desktop_Clipboard_setData; +static varinfo_t flash_desktop_Clipboard_formats; +static methodinfo_t flash_desktop_Clipboard_clear; +static methodinfo_t flash_desktop_Clipboard_getData; +static methodinfo_t flash_desktop_Clipboard_hasFormat; +static methodinfo_t flash_desktop_Clipboard_clearData; +static methodinfo_t flash_desktop_Clipboard_setDataHandler; +static methodinfo_t flash_desktop_Clipboard_setData; +static varinfo_t flash_desktop_Clipboard_formats; +static methodinfo_t flash_desktop_Clipboard_clear; +static methodinfo_t flash_desktop_Clipboard_getData; +static methodinfo_t flash_desktop_Clipboard_hasFormat; +static methodinfo_t flash_desktop_Clipboard_clearData; +static classinfo_t flash_display_IBitmapDrawable; +static classinfo_t _TypeError; +static classinfo_t _int; +static methodinfo_t _int_valueOf; +static methodinfo_t _int_toString; +static methodinfo_t _int_toExponential; +static methodinfo_t _int_toFixed; +static methodinfo_t _int_toPrecision; +static methodinfo_t _int_valueOf; +static methodinfo_t _int_toString; +static methodinfo_t _int_toExponential; +static methodinfo_t _int_toFixed; +static methodinfo_t _int_toPrecision; +static classinfo_t flash_display_Scene; +static varinfo_t flash_display_Scene_numFrames; +static varinfo_t flash_display_Scene_labels; +static varinfo_t flash_display_Scene_name; +static varinfo_t flash_display_Scene_numFrames; +static varinfo_t flash_display_Scene_labels; +static varinfo_t flash_display_Scene_name; +static classinfo_t flash_text_engine_FontMetrics; +static varinfo_t flash_text_engine_FontMetrics_superscriptOffset; +static varinfo_t flash_text_engine_FontMetrics_underlineThickness; +static varinfo_t flash_text_engine_FontMetrics_subscriptScale; +static varinfo_t flash_text_engine_FontMetrics_strikethroughOffset; +static varinfo_t flash_text_engine_FontMetrics_emBox; +static varinfo_t flash_text_engine_FontMetrics_strikethroughThickness; +static varinfo_t flash_text_engine_FontMetrics_superscriptScale; +static varinfo_t flash_text_engine_FontMetrics_subscriptOffset; +static varinfo_t flash_text_engine_FontMetrics_underlineOffset; +static varinfo_t flash_text_engine_FontMetrics_superscriptOffset; +static varinfo_t flash_text_engine_FontMetrics_underlineThickness; +static varinfo_t flash_text_engine_FontMetrics_subscriptScale; +static varinfo_t flash_text_engine_FontMetrics_strikethroughOffset; +static varinfo_t flash_text_engine_FontMetrics_emBox; +static varinfo_t flash_text_engine_FontMetrics_strikethroughThickness; +static varinfo_t flash_text_engine_FontMetrics_superscriptScale; +static varinfo_t flash_text_engine_FontMetrics_subscriptOffset; +static varinfo_t flash_text_engine_FontMetrics_underlineOffset; +static classinfo_t flash_utils_IExternalizable; +static methodinfo_t flash_utils_IExternalizable_readExternal; +static methodinfo_t flash_utils_IExternalizable_writeExternal; +static methodinfo_t flash_utils_IExternalizable_readExternal; +static methodinfo_t flash_utils_IExternalizable_writeExternal; +static classinfo_t __AS3___vec_Vector; +static classinfo_t flash_filters_GradientBevelFilter; +static varinfo_t flash_filters_GradientBevelFilter_strength; +static varinfo_t flash_filters_GradientBevelFilter_quality; +static varinfo_t flash_filters_GradientBevelFilter_angle; +static varinfo_t flash_filters_GradientBevelFilter_knockout; +static varinfo_t flash_filters_GradientBevelFilter_alphas; +static varinfo_t flash_filters_GradientBevelFilter_type; +static varinfo_t flash_filters_GradientBevelFilter_ratios; +static varinfo_t flash_filters_GradientBevelFilter_colors; +static varinfo_t flash_filters_GradientBevelFilter_blurX; +static varinfo_t flash_filters_GradientBevelFilter_blurY; +static varinfo_t flash_filters_GradientBevelFilter_distance; +static methodinfo_t flash_filters_GradientBevelFilter_clone; +static varinfo_t flash_filters_GradientBevelFilter_strength; +static varinfo_t flash_filters_GradientBevelFilter_quality; +static varinfo_t flash_filters_GradientBevelFilter_angle; +static varinfo_t flash_filters_GradientBevelFilter_knockout; +static varinfo_t flash_filters_GradientBevelFilter_alphas; +static varinfo_t flash_filters_GradientBevelFilter_type; +static varinfo_t flash_filters_GradientBevelFilter_ratios; +static varinfo_t flash_filters_GradientBevelFilter_colors; +static varinfo_t flash_filters_GradientBevelFilter_blurX; +static varinfo_t flash_filters_GradientBevelFilter_blurY; +static varinfo_t flash_filters_GradientBevelFilter_distance; +static methodinfo_t flash_filters_GradientBevelFilter_clone; +static classinfo_t flash_text_TextRun; +static varinfo_t flash_text_TextRun_beginIndex; +static varinfo_t flash_text_TextRun_endIndex; +static varinfo_t flash_text_TextRun_textFormat; +static varinfo_t flash_text_TextRun_beginIndex; +static varinfo_t flash_text_TextRun_endIndex; +static varinfo_t flash_text_TextRun_textFormat; +static classinfo_t flash_text_TextColorType; +static methodinfo_t flash_sampler_getSampleCount; +static classinfo_t flash_net_URLRequestHeader; +static varinfo_t flash_net_URLRequestHeader_value; +static varinfo_t flash_net_URLRequestHeader_name; +static varinfo_t flash_net_URLRequestHeader_value; +static varinfo_t flash_net_URLRequestHeader_name; +static methodinfo_t flash_profiler_showRedrawRegions; +static classinfo_t flash_display_ShaderData; +static classinfo_t flash_text_engine_TextLine; +static varinfo_t flash_text_engine_TextLine_previousLine; +static varinfo_t flash_text_engine_TextLine_validity; +static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockBeginIndex; +static methodinfo_t flash_text_engine_TextLine_getAtomWordBoundaryOnLeft; +static methodinfo_t flash_text_engine_TextLine_getAtomTextRotation; +static varinfo_t flash_text_engine_TextLine_textHeight; +static methodinfo_t flash_text_engine_TextLine_getAtomCenter; +static methodinfo_t flash_text_engine_TextLine_getAtomBounds; +static varinfo_t flash_text_engine_TextLine_mirrorRegions; +static varinfo_t flash_text_engine_TextLine_rawTextLength; +static varinfo_t flash_text_engine_TextLine_userData; +static varinfo_t flash_text_engine_TextLine_textWidth; +static varinfo_t flash_text_engine_TextLine_textBlock; +static varinfo_t flash_text_engine_TextLine_textBlockBeginIndex; +static varinfo_t flash_text_engine_TextLine_unjustifiedTextWidth; +static varinfo_t flash_text_engine_TextLine_ascent; +static methodinfo_t flash_text_engine_TextLine_getBaselinePosition; +static varinfo_t flash_text_engine_TextLine_specifiedWidth; +static methodinfo_t flash_text_engine_TextLine_getMirrorRegion; +static methodinfo_t flash_text_engine_TextLine_getAtomGraphic; +static varinfo_t flash_text_engine_TextLine_hasGraphicElement; +static methodinfo_t flash_text_engine_TextLine_flushAtomData; +static methodinfo_t flash_text_engine_TextLine_dump; +static varinfo_t flash_text_engine_TextLine_nextLine; +static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtCharIndex; +static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockEndIndex; +static varinfo_t flash_text_engine_TextLine_atomCount; +static varinfo_t flash_text_engine_TextLine_descent; +static methodinfo_t flash_text_engine_TextLine_getAtomBidiLevel; +static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtPoint; +static varinfo_t flash_text_engine_TextLine_previousLine; +static varinfo_t flash_text_engine_TextLine_validity; +static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockBeginIndex; +static methodinfo_t flash_text_engine_TextLine_getAtomWordBoundaryOnLeft; +static methodinfo_t flash_text_engine_TextLine_getAtomTextRotation; +static varinfo_t flash_text_engine_TextLine_textHeight; +static methodinfo_t flash_text_engine_TextLine_getAtomCenter; +static methodinfo_t flash_text_engine_TextLine_getAtomBounds; +static varinfo_t flash_text_engine_TextLine_mirrorRegions; +static varinfo_t flash_text_engine_TextLine_rawTextLength; +static varinfo_t flash_text_engine_TextLine_userData; +static varinfo_t flash_text_engine_TextLine_textWidth; +static varinfo_t flash_text_engine_TextLine_textBlock; +static varinfo_t flash_text_engine_TextLine_textBlockBeginIndex; +static varinfo_t flash_text_engine_TextLine_unjustifiedTextWidth; +static varinfo_t flash_text_engine_TextLine_ascent; +static methodinfo_t flash_text_engine_TextLine_getBaselinePosition; +static varinfo_t flash_text_engine_TextLine_specifiedWidth; +static methodinfo_t flash_text_engine_TextLine_getMirrorRegion; +static methodinfo_t flash_text_engine_TextLine_getAtomGraphic; +static varinfo_t flash_text_engine_TextLine_hasGraphicElement; +static methodinfo_t flash_text_engine_TextLine_flushAtomData; +static methodinfo_t flash_text_engine_TextLine_dump; +static varinfo_t flash_text_engine_TextLine_nextLine; +static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtCharIndex; +static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockEndIndex; +static varinfo_t flash_text_engine_TextLine_atomCount; +static varinfo_t flash_text_engine_TextLine_descent; +static methodinfo_t flash_text_engine_TextLine_getAtomBidiLevel; +static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtPoint; +static methodinfo_t flash_sampler_getSamples; +static classinfo_t flash_net_URLRequest; +static varinfo_t flash_net_URLRequest_contentType; +static varinfo_t flash_net_URLRequest_url; +static varinfo_t flash_net_URLRequest_requestHeaders; +static varinfo_t flash_net_URLRequest_method; +static varinfo_t flash_net_URLRequest_digest; +static varinfo_t flash_net_URLRequest_data; +static varinfo_t flash_net_URLRequest_contentType; +static varinfo_t flash_net_URLRequest_url; +static varinfo_t flash_net_URLRequest_requestHeaders; +static varinfo_t flash_net_URLRequest_method; +static varinfo_t flash_net_URLRequest_digest; +static varinfo_t flash_net_URLRequest_data; +static classinfo_t _URIError; +static methodinfo_t flash_net_getClassByAlias; +static classinfo_t flash_display_ShaderParameter; +static varinfo_t flash_display_ShaderParameter_value; +static varinfo_t flash_display_ShaderParameter_index; +static varinfo_t flash_display_ShaderParameter_type; +static varinfo_t flash_display_ShaderParameter_value; +static varinfo_t flash_display_ShaderParameter_index; +static varinfo_t flash_display_ShaderParameter_type; +static classinfo_t flash_filters_BitmapFilterType; +static classinfo_t _SecurityError; +static classinfo_t flash_utils_IDataInput; +static methodinfo_t flash_utils_IDataInput_readUTF; +static methodinfo_t flash_utils_IDataInput_readByte; +static methodinfo_t flash_utils_IDataInput_readUTFBytes; +static methodinfo_t flash_utils_IDataInput_readShort; +static varinfo_t flash_utils_IDataInput_objectEncoding; +static methodinfo_t flash_utils_IDataInput_readUnsignedInt; +static methodinfo_t flash_utils_IDataInput_readDouble; +static methodinfo_t flash_utils_IDataInput_readBytes; +static methodinfo_t flash_utils_IDataInput_readUnsignedByte; +static methodinfo_t flash_utils_IDataInput_readMultiByte; +static methodinfo_t flash_utils_IDataInput_readInt; +static varinfo_t flash_utils_IDataInput_bytesAvailable; +static methodinfo_t flash_utils_IDataInput_readUnsignedShort; +static methodinfo_t flash_utils_IDataInput_readObject; +static methodinfo_t flash_utils_IDataInput_readFloat; +static varinfo_t flash_utils_IDataInput_endian; +static methodinfo_t flash_utils_IDataInput_readBoolean; +static methodinfo_t flash_utils_IDataInput_readUTF; +static methodinfo_t flash_utils_IDataInput_readByte; +static methodinfo_t flash_utils_IDataInput_readUTFBytes; +static methodinfo_t flash_utils_IDataInput_readShort; +static varinfo_t flash_utils_IDataInput_objectEncoding; +static methodinfo_t flash_utils_IDataInput_readUnsignedInt; +static methodinfo_t flash_utils_IDataInput_readDouble; +static methodinfo_t flash_utils_IDataInput_readBytes; +static methodinfo_t flash_utils_IDataInput_readUnsignedByte; +static methodinfo_t flash_utils_IDataInput_readMultiByte; +static methodinfo_t flash_utils_IDataInput_readInt; +static varinfo_t flash_utils_IDataInput_bytesAvailable; +static methodinfo_t flash_utils_IDataInput_readUnsignedShort; +static methodinfo_t flash_utils_IDataInput_readObject; +static methodinfo_t flash_utils_IDataInput_readFloat; +static varinfo_t flash_utils_IDataInput_endian; +static methodinfo_t flash_utils_IDataInput_readBoolean; +static classinfo_t flash_events_IEventDispatcher; +static methodinfo_t flash_events_IEventDispatcher_willTrigger; +static methodinfo_t flash_events_IEventDispatcher_removeEventListener; +static methodinfo_t flash_events_IEventDispatcher_hasEventListener; +static methodinfo_t flash_events_IEventDispatcher_addEventListener; +static methodinfo_t flash_events_IEventDispatcher_dispatchEvent; +static methodinfo_t flash_events_IEventDispatcher_willTrigger; +static methodinfo_t flash_events_IEventDispatcher_removeEventListener; +static methodinfo_t flash_events_IEventDispatcher_hasEventListener; +static methodinfo_t flash_events_IEventDispatcher_addEventListener; +static methodinfo_t flash_events_IEventDispatcher_dispatchEvent; +static classinfo_t _Class; +static varinfo_t _Class_prototype; +static varinfo_t _Class_prototype; +static classinfo_t flash_geom_Rectangle; +static varinfo_t flash_geom_Rectangle_top; +static methodinfo_t flash_geom_Rectangle_intersection; +static methodinfo_t flash_geom_Rectangle_intersects; +static methodinfo_t flash_geom_Rectangle_containsPoint; +static methodinfo_t flash_geom_Rectangle_setEmpty; +static varinfo_t flash_geom_Rectangle_topLeft; +static varinfo_t flash_geom_Rectangle_width; +static methodinfo_t flash_geom_Rectangle_containsRect; +static methodinfo_t flash_geom_Rectangle_isEmpty; +static methodinfo_t flash_geom_Rectangle_equals; +static varinfo_t flash_geom_Rectangle_height; +static varinfo_t flash_geom_Rectangle_left; +static methodinfo_t flash_geom_Rectangle_inflate; +static methodinfo_t flash_geom_Rectangle_inflatePoint; +static methodinfo_t flash_geom_Rectangle_toString; +static methodinfo_t flash_geom_Rectangle_offsetPoint; +static varinfo_t flash_geom_Rectangle_x; +static varinfo_t flash_geom_Rectangle_size; +static varinfo_t flash_geom_Rectangle_bottomRight; +static varinfo_t flash_geom_Rectangle_right; +static methodinfo_t flash_geom_Rectangle_contains; +static methodinfo_t flash_geom_Rectangle_union; +static varinfo_t flash_geom_Rectangle_bottom; +static methodinfo_t flash_geom_Rectangle_clone; +static varinfo_t flash_geom_Rectangle_y; +static methodinfo_t flash_geom_Rectangle_offset; +static varinfo_t flash_geom_Rectangle_top; +static methodinfo_t flash_geom_Rectangle_intersection; +static methodinfo_t flash_geom_Rectangle_intersects; +static methodinfo_t flash_geom_Rectangle_containsPoint; +static methodinfo_t flash_geom_Rectangle_setEmpty; +static varinfo_t flash_geom_Rectangle_topLeft; +static varinfo_t flash_geom_Rectangle_width; +static methodinfo_t flash_geom_Rectangle_containsRect; +static methodinfo_t flash_geom_Rectangle_isEmpty; +static methodinfo_t flash_geom_Rectangle_equals; +static varinfo_t flash_geom_Rectangle_height; +static varinfo_t flash_geom_Rectangle_left; +static methodinfo_t flash_geom_Rectangle_inflate; +static methodinfo_t flash_geom_Rectangle_inflatePoint; +static methodinfo_t flash_geom_Rectangle_toString; +static methodinfo_t flash_geom_Rectangle_offsetPoint; +static varinfo_t flash_geom_Rectangle_x; +static varinfo_t flash_geom_Rectangle_size; +static varinfo_t flash_geom_Rectangle_bottomRight; +static varinfo_t flash_geom_Rectangle_right; +static methodinfo_t flash_geom_Rectangle_contains; +static methodinfo_t flash_geom_Rectangle_union; +static varinfo_t flash_geom_Rectangle_bottom; +static methodinfo_t flash_geom_Rectangle_clone; +static varinfo_t flash_geom_Rectangle_y; +static methodinfo_t flash_geom_Rectangle_offset; +static classinfo_t flash_events_SecurityErrorEvent; +static methodinfo_t flash_events_SecurityErrorEvent_toString; +static methodinfo_t flash_events_SecurityErrorEvent_clone; +static methodinfo_t flash_events_SecurityErrorEvent_toString; +static methodinfo_t flash_events_SecurityErrorEvent_clone; +static classinfo_t flash_net_IDynamicPropertyWriter; +static methodinfo_t flash_net_IDynamicPropertyWriter_writeDynamicProperties; +static methodinfo_t flash_net_IDynamicPropertyWriter_writeDynamicProperties; +static classinfo_t flash_display_InterpolationMethod; +static classinfo_t _Object; +static methodinfo_t _Object_propertyIsEnumerable; +static methodinfo_t _Object_isPrototypeOf; +static methodinfo_t _Object_hasOwnProperty; +static methodinfo_t _Object_propertyIsEnumerable; +static methodinfo_t _Object_isPrototypeOf; +static methodinfo_t _Object_hasOwnProperty; +static classinfo_t flash_errors_EOFError; +static classinfo_t flash_net_NetStream; +static varinfo_t flash_net_NetStream_videoCodec; +static varinfo_t flash_net_NetStream_info; +static methodinfo_t flash_net_NetStream_attachCamera; +static varinfo_t flash_net_NetStream_farNonce; +static methodinfo_t flash_net_NetStream_close; +static methodinfo_t flash_net_NetStream_pause; +static methodinfo_t flash_net_NetStream_onPeerConnect; +static varinfo_t flash_net_NetStream_client; +static methodinfo_t flash_net_NetStream_resume; +static varinfo_t flash_net_NetStream_liveDelay; +static varinfo_t flash_net_NetStream_peerStreams; +static varinfo_t flash_net_NetStream_objectEncoding; +static varinfo_t flash_net_NetStream_bytesLoaded; +static methodinfo_t flash_net_NetStream_receiveVideo; +static varinfo_t flash_net_NetStream_maxPauseBufferTime; +static methodinfo_t flash_net_NetStream_play2; +static varinfo_t flash_net_NetStream_audioCodec; +static methodinfo_t flash_net_NetStream_receiveVideoFPS; +static varinfo_t flash_net_NetStream_bytesTotal; +static varinfo_t flash_net_NetStream_farID; +static methodinfo_t flash_net_NetStream_receiveAudio; +static varinfo_t flash_net_NetStream_bufferLength; +static methodinfo_t flash_net_NetStream_seek; +static methodinfo_t flash_net_NetStream_attachAudio; +static varinfo_t flash_net_NetStream_bufferTime; +static methodinfo_t flash_net_NetStream_play; +static methodinfo_t flash_net_NetStream_publish; +static methodinfo_t flash_net_NetStream_togglePause; +static varinfo_t flash_net_NetStream_checkPolicyFile; +static varinfo_t flash_net_NetStream_nearNonce; +static varinfo_t flash_net_NetStream_decodedFrames; +static methodinfo_t flash_net_NetStream_send; +static varinfo_t flash_net_NetStream_currentFPS; +static varinfo_t flash_net_NetStream_time; +static varinfo_t flash_net_NetStream_soundTransform; +static varinfo_t flash_net_NetStream_videoCodec; +static varinfo_t flash_net_NetStream_info; +static methodinfo_t flash_net_NetStream_attachCamera; +static varinfo_t flash_net_NetStream_farNonce; +static methodinfo_t flash_net_NetStream_close; +static methodinfo_t flash_net_NetStream_pause; +static methodinfo_t flash_net_NetStream_onPeerConnect; +static varinfo_t flash_net_NetStream_client; +static methodinfo_t flash_net_NetStream_resume; +static varinfo_t flash_net_NetStream_liveDelay; +static varinfo_t flash_net_NetStream_peerStreams; +static varinfo_t flash_net_NetStream_objectEncoding; +static varinfo_t flash_net_NetStream_bytesLoaded; +static methodinfo_t flash_net_NetStream_receiveVideo; +static varinfo_t flash_net_NetStream_maxPauseBufferTime; +static methodinfo_t flash_net_NetStream_play2; +static varinfo_t flash_net_NetStream_audioCodec; +static methodinfo_t flash_net_NetStream_receiveVideoFPS; +static varinfo_t flash_net_NetStream_bytesTotal; +static varinfo_t flash_net_NetStream_farID; +static methodinfo_t flash_net_NetStream_receiveAudio; +static varinfo_t flash_net_NetStream_bufferLength; +static methodinfo_t flash_net_NetStream_seek; +static methodinfo_t flash_net_NetStream_attachAudio; +static varinfo_t flash_net_NetStream_bufferTime; +static methodinfo_t flash_net_NetStream_play; +static methodinfo_t flash_net_NetStream_publish; +static methodinfo_t flash_net_NetStream_togglePause; +static varinfo_t flash_net_NetStream_checkPolicyFile; +static varinfo_t flash_net_NetStream_nearNonce; +static varinfo_t flash_net_NetStream_decodedFrames; +static methodinfo_t flash_net_NetStream_send; +static varinfo_t flash_net_NetStream_currentFPS; +static varinfo_t flash_net_NetStream_time; +static varinfo_t flash_net_NetStream_soundTransform; +static classinfo_t _ArgumentError; +static classinfo_t _XMLList; +static methodinfo_t _XMLList_normalize; +static methodinfo_t _XMLList_removeNamespace; +static methodinfo_t _XMLList_prependChild; +static methodinfo_t _XMLList_toXMLString; +static methodinfo_t _XMLList_nodeKind; +static methodinfo_t _XMLList_copy; +static methodinfo_t _XMLList_text; +static methodinfo_t _XMLList_toString; +static methodinfo_t _XMLList_childIndex; +static methodinfo_t _XMLList_setName; +static methodinfo_t _XMLList_setLocalName; +static methodinfo_t _XMLList_namespace; +static methodinfo_t _XMLList_insertChildBefore; +static methodinfo_t _XMLList_addNamespace; +static methodinfo_t _XMLList_propertyIsEnumerable; +static methodinfo_t _XMLList_comments; +static methodinfo_t _XMLList_attributes; +static methodinfo_t _XMLList_descendants; +static methodinfo_t _XMLList_replace; +static methodinfo_t _XMLList_children; +static methodinfo_t _XMLList_contains; +static methodinfo_t _XMLList_hasSimpleContent; +static methodinfo_t _XMLList_elements; +static methodinfo_t _XMLList_hasComplexContent; +static methodinfo_t _XMLList_insertChildAfter; +static methodinfo_t _XMLList_parent; +static methodinfo_t _XMLList_length; +static methodinfo_t _XMLList_processingInstructions; +static methodinfo_t _XMLList_child; +static methodinfo_t _XMLList_appendChild; +static methodinfo_t _XMLList_valueOf; +static methodinfo_t _XMLList_localName; +static methodinfo_t _XMLList_inScopeNamespaces; +static methodinfo_t _XMLList_hasOwnProperty; +static methodinfo_t _XMLList_setNamespace; +static methodinfo_t _XMLList_namespaceDeclarations; +static methodinfo_t _XMLList_name; +static methodinfo_t _XMLList_setChildren; +static methodinfo_t _XMLList_attribute; +static methodinfo_t _XMLList_normalize; +static methodinfo_t _XMLList_removeNamespace; +static methodinfo_t _XMLList_prependChild; +static methodinfo_t _XMLList_toXMLString; +static methodinfo_t _XMLList_nodeKind; +static methodinfo_t _XMLList_copy; +static methodinfo_t _XMLList_text; +static methodinfo_t _XMLList_toString; +static methodinfo_t _XMLList_childIndex; +static methodinfo_t _XMLList_setName; +static methodinfo_t _XMLList_setLocalName; +static methodinfo_t _XMLList_namespace; +static methodinfo_t _XMLList_insertChildBefore; +static methodinfo_t _XMLList_addNamespace; +static methodinfo_t _XMLList_propertyIsEnumerable; +static methodinfo_t _XMLList_comments; +static methodinfo_t _XMLList_attributes; +static methodinfo_t _XMLList_descendants; +static methodinfo_t _XMLList_replace; +static methodinfo_t _XMLList_children; +static methodinfo_t _XMLList_contains; +static methodinfo_t _XMLList_hasSimpleContent; +static methodinfo_t _XMLList_elements; +static methodinfo_t _XMLList_hasComplexContent; +static methodinfo_t _XMLList_insertChildAfter; +static methodinfo_t _XMLList_parent; +static methodinfo_t _XMLList_length; +static methodinfo_t _XMLList_processingInstructions; +static methodinfo_t _XMLList_child; +static methodinfo_t _XMLList_appendChild; +static methodinfo_t _XMLList_valueOf; +static methodinfo_t _XMLList_localName; +static methodinfo_t _XMLList_inScopeNamespaces; +static methodinfo_t _XMLList_hasOwnProperty; +static methodinfo_t _XMLList_setNamespace; +static methodinfo_t _XMLList_namespaceDeclarations; +static methodinfo_t _XMLList_name; +static methodinfo_t _XMLList_setChildren; +static methodinfo_t _XMLList_attribute; +static classinfo_t flash_geom_Point; +static methodinfo_t flash_geom_Point_equals; +static methodinfo_t flash_geom_Point_normalize; +static varinfo_t flash_geom_Point_x; +static methodinfo_t flash_geom_Point_offset; +static methodinfo_t flash_geom_Point_subtract; +static varinfo_t flash_geom_Point_y; +static varinfo_t flash_geom_Point_length; +static methodinfo_t flash_geom_Point_add; +static methodinfo_t flash_geom_Point_toString; +static methodinfo_t flash_geom_Point_clone; +static methodinfo_t flash_geom_Point_equals; +static methodinfo_t flash_geom_Point_normalize; +static varinfo_t flash_geom_Point_x; +static methodinfo_t flash_geom_Point_offset; +static methodinfo_t flash_geom_Point_subtract; +static varinfo_t flash_geom_Point_y; +static varinfo_t flash_geom_Point_length; +static methodinfo_t flash_geom_Point_add; +static methodinfo_t flash_geom_Point_toString; +static methodinfo_t flash_geom_Point_clone; +static classinfo_t flash_printing_PrintJobOptions; +static varinfo_t flash_printing_PrintJobOptions_printAsBitmap; +static varinfo_t flash_printing_PrintJobOptions_printAsBitmap; +static classinfo_t flash_display_DisplayObject; +static varinfo_t flash_display_DisplayObject_rotation; +static varinfo_t flash_display_DisplayObject_filters; +static varinfo_t flash_display_DisplayObject_rotationZ; +static varinfo_t flash_display_DisplayObject_accessibilityProperties; +static varinfo_t flash_display_DisplayObject_mouseX; +static varinfo_t flash_display_DisplayObject_root; +static varinfo_t flash_display_DisplayObject_stage; +static varinfo_t flash_display_DisplayObject_rotationY; +static varinfo_t flash_display_DisplayObject_scaleZ; +static methodinfo_t flash_display_DisplayObject_local3DToGlobal; +static varinfo_t flash_display_DisplayObject_loaderInfo; +static varinfo_t flash_display_DisplayObject_cacheAsBitmap; +static varinfo_t flash_display_DisplayObject_transform; +static varinfo_t flash_display_DisplayObject_scaleY; +static varinfo_t flash_display_DisplayObject_height; +static varinfo_t flash_display_DisplayObject_rotationX; +static varinfo_t flash_display_DisplayObject_scrollRect; +static varinfo_t flash_display_DisplayObject_width; +static varinfo_t flash_display_DisplayObject_scale9Grid; +static varinfo_t flash_display_DisplayObject_parent; +static methodinfo_t flash_display_DisplayObject_hitTestObject; +static methodinfo_t flash_display_DisplayObject_hitTestPoint; +static varinfo_t flash_display_DisplayObject_alpha; +static methodinfo_t flash_display_DisplayObject_getRect; +static varinfo_t flash_display_DisplayObject_opaqueBackground; +static methodinfo_t flash_display_DisplayObject_globalToLocal3D; +static varinfo_t flash_display_DisplayObject_visible; +static varinfo_t flash_display_DisplayObject_blendMode; +static varinfo_t flash_display_DisplayObject_scaleX; +static methodinfo_t flash_display_DisplayObject_globalToLocal; +static methodinfo_t flash_display_DisplayObject_localToGlobal; +static varinfo_t flash_display_DisplayObject_z; +static varinfo_t flash_display_DisplayObject_name; +static methodinfo_t flash_display_DisplayObject_getBounds; +static varinfo_t flash_display_DisplayObject_mask; +static varinfo_t flash_display_DisplayObject_mouseY; +static varinfo_t flash_display_DisplayObject_x; +static varinfo_t flash_display_DisplayObject_y; +static varinfo_t flash_display_DisplayObject_rotation; +static varinfo_t flash_display_DisplayObject_filters; +static varinfo_t flash_display_DisplayObject_rotationZ; +static varinfo_t flash_display_DisplayObject_accessibilityProperties; +static varinfo_t flash_display_DisplayObject_mouseX; +static varinfo_t flash_display_DisplayObject_root; +static varinfo_t flash_display_DisplayObject_stage; +static varinfo_t flash_display_DisplayObject_rotationY; +static varinfo_t flash_display_DisplayObject_scaleZ; +static methodinfo_t flash_display_DisplayObject_local3DToGlobal; +static varinfo_t flash_display_DisplayObject_loaderInfo; +static varinfo_t flash_display_DisplayObject_cacheAsBitmap; +static varinfo_t flash_display_DisplayObject_transform; +static varinfo_t flash_display_DisplayObject_scaleY; +static varinfo_t flash_display_DisplayObject_height; +static varinfo_t flash_display_DisplayObject_rotationX; +static varinfo_t flash_display_DisplayObject_scrollRect; +static varinfo_t flash_display_DisplayObject_width; +static varinfo_t flash_display_DisplayObject_scale9Grid; +static varinfo_t flash_display_DisplayObject_parent; +static methodinfo_t flash_display_DisplayObject_hitTestObject; +static methodinfo_t flash_display_DisplayObject_hitTestPoint; +static varinfo_t flash_display_DisplayObject_alpha; +static methodinfo_t flash_display_DisplayObject_getRect; +static varinfo_t flash_display_DisplayObject_opaqueBackground; +static methodinfo_t flash_display_DisplayObject_globalToLocal3D; +static varinfo_t flash_display_DisplayObject_visible; +static varinfo_t flash_display_DisplayObject_blendMode; +static varinfo_t flash_display_DisplayObject_scaleX; +static methodinfo_t flash_display_DisplayObject_globalToLocal; +static methodinfo_t flash_display_DisplayObject_localToGlobal; +static varinfo_t flash_display_DisplayObject_z; +static varinfo_t flash_display_DisplayObject_name; +static methodinfo_t flash_display_DisplayObject_getBounds; +static varinfo_t flash_display_DisplayObject_mask; +static varinfo_t flash_display_DisplayObject_mouseY; +static varinfo_t flash_display_DisplayObject_x; +static varinfo_t flash_display_DisplayObject_y; +static classinfo_t flash_sampler_DeleteObjectSample; +static varinfo_t flash_sampler_DeleteObjectSample_size; +static varinfo_t flash_sampler_DeleteObjectSample_id; +static varinfo_t flash_sampler_DeleteObjectSample_size; +static varinfo_t flash_sampler_DeleteObjectSample_id; +static methodinfo_t flash_system_fscommand; +static methodinfo_t flash_utils_unescapeMultiByte; +static classinfo_t flash_sampler_StackFrame; +static varinfo_t flash_sampler_StackFrame_name; +static varinfo_t flash_sampler_StackFrame_line; +static methodinfo_t flash_sampler_StackFrame_toString; +static varinfo_t flash_sampler_StackFrame_file; +static varinfo_t flash_sampler_StackFrame_name; +static varinfo_t flash_sampler_StackFrame_line; +static methodinfo_t flash_sampler_StackFrame_toString; +static varinfo_t flash_sampler_StackFrame_file; +static classinfo_t flash_system_JPEGLoaderContext; +static varinfo_t flash_system_JPEGLoaderContext_deblockingFilter; +static varinfo_t flash_system_JPEGLoaderContext_deblockingFilter; +static classinfo_t flash_system_IME; +static methodinfo_t _isNaN; +static classinfo_t flash_system_Security; +static classinfo_t flash_display_Bitmap; +static varinfo_t flash_display_Bitmap_pixelSnapping; +static varinfo_t flash_display_Bitmap_bitmapData; +static varinfo_t flash_display_Bitmap_smoothing; +static varinfo_t flash_display_Bitmap_pixelSnapping; +static varinfo_t flash_display_Bitmap_bitmapData; +static varinfo_t flash_display_Bitmap_smoothing; +static classinfo_t flash_printing_PrintJob; +static varinfo_t flash_printing_PrintJob_paperWidth; +static methodinfo_t flash_printing_PrintJob_addPage; +static varinfo_t flash_printing_PrintJob_pageHeight; +static methodinfo_t flash_printing_PrintJob_start; +static varinfo_t flash_printing_PrintJob_pageWidth; +static methodinfo_t flash_printing_PrintJob_send; +static varinfo_t flash_printing_PrintJob_paperHeight; +static varinfo_t flash_printing_PrintJob_orientation; +static varinfo_t flash_printing_PrintJob_paperWidth; +static methodinfo_t flash_printing_PrintJob_addPage; +static varinfo_t flash_printing_PrintJob_pageHeight; +static methodinfo_t flash_printing_PrintJob_start; +static varinfo_t flash_printing_PrintJob_pageWidth; +static methodinfo_t flash_printing_PrintJob_send; +static varinfo_t flash_printing_PrintJob_paperHeight; +static varinfo_t flash_printing_PrintJob_orientation; +static classinfo_t flash_text_StaticText; +static varinfo_t flash_text_StaticText_text; +static varinfo_t flash_text_StaticText_text; +static classinfo_t flash_text_engine_SpaceJustifier; +static methodinfo_t flash_text_engine_SpaceJustifier_clone; +static varinfo_t flash_text_engine_SpaceJustifier_letterSpacing; +static methodinfo_t flash_text_engine_SpaceJustifier_clone; +static varinfo_t flash_text_engine_SpaceJustifier_letterSpacing; +static classinfo_t flash_events_DataEvent; +static methodinfo_t flash_events_DataEvent_toString; +static methodinfo_t flash_events_DataEvent_clone; +static varinfo_t flash_events_DataEvent_data; +static methodinfo_t flash_events_DataEvent_toString; +static methodinfo_t flash_events_DataEvent_clone; +static varinfo_t flash_events_DataEvent_data; +static classinfo_t flash_events_ActivityEvent; +static methodinfo_t flash_events_ActivityEvent_toString; +static varinfo_t flash_events_ActivityEvent_activating; +static methodinfo_t flash_events_ActivityEvent_clone; +static methodinfo_t flash_events_ActivityEvent_toString; +static varinfo_t flash_events_ActivityEvent_activating; +static methodinfo_t flash_events_ActivityEvent_clone; +static classinfo_t flash_display_GraphicsEndFill; +static classinfo_t flash_display_ColorCorrection; +static classinfo_t flash_events_IOErrorEvent; +static methodinfo_t flash_events_IOErrorEvent_toString; +static methodinfo_t flash_events_IOErrorEvent_clone; +static methodinfo_t flash_events_IOErrorEvent_toString; +static methodinfo_t flash_events_IOErrorEvent_clone; +static classinfo_t flash_display_GraphicsStroke; +static varinfo_t flash_display_GraphicsStroke_scaleMode; +static varinfo_t flash_display_GraphicsStroke_miterLimit; +static varinfo_t flash_display_GraphicsStroke_pixelHinting; +static varinfo_t flash_display_GraphicsStroke_fill; +static varinfo_t flash_display_GraphicsStroke_thickness; +static varinfo_t flash_display_GraphicsStroke_joints; +static varinfo_t flash_display_GraphicsStroke_caps; +static varinfo_t flash_display_GraphicsStroke_scaleMode; +static varinfo_t flash_display_GraphicsStroke_miterLimit; +static varinfo_t flash_display_GraphicsStroke_pixelHinting; +static varinfo_t flash_display_GraphicsStroke_fill; +static varinfo_t flash_display_GraphicsStroke_thickness; +static varinfo_t flash_display_GraphicsStroke_joints; +static varinfo_t flash_display_GraphicsStroke_caps; +static classinfo_t _Boolean; +static methodinfo_t _Boolean_valueOf; +static methodinfo_t _Boolean_toString; +static methodinfo_t _Boolean_valueOf; +static methodinfo_t _Boolean_toString; +static methodinfo_t flash_sampler_getMemberNames; +static methodinfo_t flash_utils_getQualifiedClassName; +static classinfo_t flash_text_engine_GraphicElement; +static varinfo_t flash_text_engine_GraphicElement_graphic; +static varinfo_t flash_text_engine_GraphicElement_elementWidth; +static varinfo_t flash_text_engine_GraphicElement_elementHeight; +static varinfo_t flash_text_engine_GraphicElement_graphic; +static varinfo_t flash_text_engine_GraphicElement_elementWidth; +static varinfo_t flash_text_engine_GraphicElement_elementHeight; +static classinfo_t flash_media_Microphone; +static varinfo_t flash_media_Microphone_codec; +static varinfo_t flash_media_Microphone_gain; +static varinfo_t flash_media_Microphone_index; +static methodinfo_t flash_media_Microphone_setLoopBack; +static methodinfo_t flash_media_Microphone_setSilenceLevel; +static varinfo_t flash_media_Microphone_name; +static methodinfo_t flash_media_Microphone_setUseEchoSuppression; +static varinfo_t flash_media_Microphone_framesPerPacket; +static varinfo_t flash_media_Microphone_muted; +static varinfo_t flash_media_Microphone_soundTransform; +static varinfo_t flash_media_Microphone_encodeQuality; +static varinfo_t flash_media_Microphone_useEchoSuppression; +static varinfo_t flash_media_Microphone_silenceLevel; +static varinfo_t flash_media_Microphone_silenceTimeout; +static varinfo_t flash_media_Microphone_rate; +static varinfo_t flash_media_Microphone_activityLevel; +static varinfo_t flash_media_Microphone_codec; +static varinfo_t flash_media_Microphone_gain; +static varinfo_t flash_media_Microphone_index; +static methodinfo_t flash_media_Microphone_setLoopBack; +static methodinfo_t flash_media_Microphone_setSilenceLevel; +static varinfo_t flash_media_Microphone_name; +static methodinfo_t flash_media_Microphone_setUseEchoSuppression; +static varinfo_t flash_media_Microphone_framesPerPacket; +static varinfo_t flash_media_Microphone_muted; +static varinfo_t flash_media_Microphone_soundTransform; +static varinfo_t flash_media_Microphone_encodeQuality; +static varinfo_t flash_media_Microphone_useEchoSuppression; +static varinfo_t flash_media_Microphone_silenceLevel; +static varinfo_t flash_media_Microphone_silenceTimeout; +static varinfo_t flash_media_Microphone_rate; +static varinfo_t flash_media_Microphone_activityLevel; +static classinfo_t flash_ui_ContextMenuClipboardItems; +static varinfo_t flash_ui_ContextMenuClipboardItems_clear; +static methodinfo_t flash_ui_ContextMenuClipboardItems_clone; +static varinfo_t flash_ui_ContextMenuClipboardItems_paste; +static varinfo_t flash_ui_ContextMenuClipboardItems_selectAll; +static varinfo_t flash_ui_ContextMenuClipboardItems_copy; +static varinfo_t flash_ui_ContextMenuClipboardItems_cut; +static varinfo_t flash_ui_ContextMenuClipboardItems_clear; +static methodinfo_t flash_ui_ContextMenuClipboardItems_clone; +static varinfo_t flash_ui_ContextMenuClipboardItems_paste; +static varinfo_t flash_ui_ContextMenuClipboardItems_selectAll; +static varinfo_t flash_ui_ContextMenuClipboardItems_copy; +static varinfo_t flash_ui_ContextMenuClipboardItems_cut; +static classinfo_t flash_display_GraphicsShaderFill; +static varinfo_t flash_display_GraphicsShaderFill_shader; +static varinfo_t flash_display_GraphicsShaderFill_matrix; +static varinfo_t flash_display_GraphicsShaderFill_shader; +static varinfo_t flash_display_GraphicsShaderFill_matrix; +static classinfo_t flash_errors_IllegalOperationError; +static classinfo_t flash_filters_GradientGlowFilter; +static varinfo_t flash_filters_GradientGlowFilter_strength; +static varinfo_t flash_filters_GradientGlowFilter_quality; +static varinfo_t flash_filters_GradientGlowFilter_angle; +static varinfo_t flash_filters_GradientGlowFilter_knockout; +static varinfo_t flash_filters_GradientGlowFilter_type; +static varinfo_t flash_filters_GradientGlowFilter_alphas; +static varinfo_t flash_filters_GradientGlowFilter_ratios; +static varinfo_t flash_filters_GradientGlowFilter_colors; +static varinfo_t flash_filters_GradientGlowFilter_blurX; +static varinfo_t flash_filters_GradientGlowFilter_blurY; +static varinfo_t flash_filters_GradientGlowFilter_distance; +static methodinfo_t flash_filters_GradientGlowFilter_clone; +static varinfo_t flash_filters_GradientGlowFilter_strength; +static varinfo_t flash_filters_GradientGlowFilter_quality; +static varinfo_t flash_filters_GradientGlowFilter_angle; +static varinfo_t flash_filters_GradientGlowFilter_knockout; +static varinfo_t flash_filters_GradientGlowFilter_type; +static varinfo_t flash_filters_GradientGlowFilter_alphas; +static varinfo_t flash_filters_GradientGlowFilter_ratios; +static varinfo_t flash_filters_GradientGlowFilter_colors; +static varinfo_t flash_filters_GradientGlowFilter_blurX; +static varinfo_t flash_filters_GradientGlowFilter_blurY; +static varinfo_t flash_filters_GradientGlowFilter_distance; +static methodinfo_t flash_filters_GradientGlowFilter_clone; +static classinfo_t flash_display_CapsStyle; +static classinfo_t flash_text_TextSnapshot; +static methodinfo_t flash_text_TextSnapshot_setSelectColor; +static methodinfo_t flash_text_TextSnapshot_setSelected; +static methodinfo_t flash_text_TextSnapshot_getSelectedText; +static methodinfo_t flash_text_TextSnapshot_getTextRunInfo; +static varinfo_t flash_text_TextSnapshot_charCount; +static methodinfo_t flash_text_TextSnapshot_findText; +static methodinfo_t flash_text_TextSnapshot_getSelected; +static methodinfo_t flash_text_TextSnapshot_hitTestTextNearPos; +static methodinfo_t flash_text_TextSnapshot_getText; +static methodinfo_t flash_text_TextSnapshot_setSelectColor; +static methodinfo_t flash_text_TextSnapshot_setSelected; +static methodinfo_t flash_text_TextSnapshot_getSelectedText; +static methodinfo_t flash_text_TextSnapshot_getTextRunInfo; +static varinfo_t flash_text_TextSnapshot_charCount; +static methodinfo_t flash_text_TextSnapshot_findText; +static methodinfo_t flash_text_TextSnapshot_getSelected; +static methodinfo_t flash_text_TextSnapshot_hitTestTextNearPos; +static methodinfo_t flash_text_TextSnapshot_getText; +static classinfo_t flash_text_engine_FontLookup; +static classinfo_t flash_display_InteractiveObject; +static varinfo_t flash_display_InteractiveObject_tabIndex; +static varinfo_t flash_display_InteractiveObject_doubleClickEnabled; +static varinfo_t flash_display_InteractiveObject_tabEnabled; +static varinfo_t flash_display_InteractiveObject_mouseEnabled; +static varinfo_t flash_display_InteractiveObject_contextMenu; +static varinfo_t flash_display_InteractiveObject_focusRect; +static varinfo_t flash_display_InteractiveObject_accessibilityImplementation; +static varinfo_t flash_display_InteractiveObject_tabIndex; +static varinfo_t flash_display_InteractiveObject_doubleClickEnabled; +static varinfo_t flash_display_InteractiveObject_tabEnabled; +static varinfo_t flash_display_InteractiveObject_mouseEnabled; +static varinfo_t flash_display_InteractiveObject_contextMenu; +static varinfo_t flash_display_InteractiveObject_focusRect; +static varinfo_t flash_display_InteractiveObject_accessibilityImplementation; +static classinfo_t flash_text_TextField; +static methodinfo_t flash_text_TextField_getTextFormat; +static varinfo_t flash_text_TextField_border; +static varinfo_t flash_text_TextField_selectedText; +static methodinfo_t flash_text_TextField_pasteRichText; +static varinfo_t flash_text_TextField_bottomScrollV; +static methodinfo_t flash_text_TextField_getLineIndexOfChar; +static methodinfo_t flash_text_TextField_replaceText; +static varinfo_t flash_text_TextField_defaultTextFormat; +static varinfo_t flash_text_TextField_restrict; +static varinfo_t flash_text_TextField_htmlText; +static methodinfo_t flash_text_TextField_copyRichText; +static methodinfo_t flash_text_TextField_getLineText; +static methodinfo_t flash_text_TextField_getFirstCharInParagraph; +static methodinfo_t flash_text_TextField_setSelection; +static varinfo_t flash_text_TextField_length; +static varinfo_t flash_text_TextField_wordWrap; +static methodinfo_t flash_text_TextField_appendText; +static varinfo_t flash_text_TextField_caretIndex; +static varinfo_t flash_text_TextField_mouseWheelEnabled; +static varinfo_t flash_text_TextField_selectionBeginIndex; +static varinfo_t flash_text_TextField_sharpness; +static varinfo_t flash_text_TextField_type; +static methodinfo_t flash_text_TextField_getLineIndexAtPoint; +static methodinfo_t flash_text_TextField_getCharIndexAtPoint; +static methodinfo_t flash_text_TextField_getXMLText; +static methodinfo_t flash_text_TextField_getParagraphLength; +static methodinfo_t flash_text_TextField_getRawText; +static varinfo_t flash_text_TextField_gridFitType; +static methodinfo_t flash_text_TextField_getLineOffset; +static varinfo_t flash_text_TextField_backgroundColor; +static varinfo_t flash_text_TextField_multiline; +static varinfo_t flash_text_TextField_numLines; +static methodinfo_t flash_text_TextField_getImageReference; +static varinfo_t flash_text_TextField_displayAsPassword; +static varinfo_t flash_text_TextField_textWidth; +static varinfo_t flash_text_TextField_autoSize; +static varinfo_t flash_text_TextField_selectable; +static methodinfo_t flash_text_TextField_getCharBoundaries; +static varinfo_t flash_text_TextField_alwaysShowSelection; +static varinfo_t flash_text_TextField_thickness; +static varinfo_t flash_text_TextField_useRichTextClipboard; +static varinfo_t flash_text_TextField_scrollV; +static methodinfo_t flash_text_TextField_getTextRuns; +static methodinfo_t flash_text_TextField_setTextFormat; +static varinfo_t flash_text_TextField_textColor; +static varinfo_t flash_text_TextField_maxScrollV; +static varinfo_t flash_text_TextField_embedFonts; +static varinfo_t flash_text_TextField_scrollH; +static varinfo_t flash_text_TextField_text; +static methodinfo_t flash_text_TextField_getLineLength; +static varinfo_t flash_text_TextField_textHeight; +static varinfo_t flash_text_TextField_antiAliasType; +static varinfo_t flash_text_TextField_styleSheet; +static varinfo_t flash_text_TextField_background; +static methodinfo_t flash_text_TextField_replaceSelectedText; +static varinfo_t flash_text_TextField_borderColor; +static varinfo_t flash_text_TextField_maxScrollH; +static varinfo_t flash_text_TextField_maxChars; +static methodinfo_t flash_text_TextField_getLineMetrics; +static varinfo_t flash_text_TextField_selectionEndIndex; +static methodinfo_t flash_text_TextField_insertXMLText; +static varinfo_t flash_text_TextField_condenseWhite; +static methodinfo_t flash_text_TextField_getTextFormat; +static varinfo_t flash_text_TextField_border; +static varinfo_t flash_text_TextField_selectedText; +static methodinfo_t flash_text_TextField_pasteRichText; +static varinfo_t flash_text_TextField_bottomScrollV; +static methodinfo_t flash_text_TextField_getLineIndexOfChar; +static methodinfo_t flash_text_TextField_replaceText; +static varinfo_t flash_text_TextField_defaultTextFormat; +static varinfo_t flash_text_TextField_restrict; +static varinfo_t flash_text_TextField_htmlText; +static methodinfo_t flash_text_TextField_copyRichText; +static methodinfo_t flash_text_TextField_getLineText; +static methodinfo_t flash_text_TextField_getFirstCharInParagraph; +static methodinfo_t flash_text_TextField_setSelection; +static varinfo_t flash_text_TextField_length; +static varinfo_t flash_text_TextField_wordWrap; +static methodinfo_t flash_text_TextField_appendText; +static varinfo_t flash_text_TextField_caretIndex; +static varinfo_t flash_text_TextField_mouseWheelEnabled; +static varinfo_t flash_text_TextField_selectionBeginIndex; +static varinfo_t flash_text_TextField_sharpness; +static varinfo_t flash_text_TextField_type; +static methodinfo_t flash_text_TextField_getLineIndexAtPoint; +static methodinfo_t flash_text_TextField_getCharIndexAtPoint; +static methodinfo_t flash_text_TextField_getXMLText; +static methodinfo_t flash_text_TextField_getParagraphLength; +static methodinfo_t flash_text_TextField_getRawText; +static varinfo_t flash_text_TextField_gridFitType; +static methodinfo_t flash_text_TextField_getLineOffset; +static varinfo_t flash_text_TextField_backgroundColor; +static varinfo_t flash_text_TextField_multiline; +static varinfo_t flash_text_TextField_numLines; +static methodinfo_t flash_text_TextField_getImageReference; +static varinfo_t flash_text_TextField_displayAsPassword; +static varinfo_t flash_text_TextField_textWidth; +static varinfo_t flash_text_TextField_autoSize; +static varinfo_t flash_text_TextField_selectable; +static methodinfo_t flash_text_TextField_getCharBoundaries; +static varinfo_t flash_text_TextField_alwaysShowSelection; +static varinfo_t flash_text_TextField_thickness; +static varinfo_t flash_text_TextField_useRichTextClipboard; +static varinfo_t flash_text_TextField_scrollV; +static methodinfo_t flash_text_TextField_getTextRuns; +static methodinfo_t flash_text_TextField_setTextFormat; +static varinfo_t flash_text_TextField_textColor; +static varinfo_t flash_text_TextField_maxScrollV; +static varinfo_t flash_text_TextField_embedFonts; +static varinfo_t flash_text_TextField_scrollH; +static varinfo_t flash_text_TextField_text; +static methodinfo_t flash_text_TextField_getLineLength; +static varinfo_t flash_text_TextField_textHeight; +static varinfo_t flash_text_TextField_antiAliasType; +static varinfo_t flash_text_TextField_styleSheet; +static varinfo_t flash_text_TextField_background; +static methodinfo_t flash_text_TextField_replaceSelectedText; +static varinfo_t flash_text_TextField_borderColor; +static varinfo_t flash_text_TextField_maxScrollH; +static varinfo_t flash_text_TextField_maxChars; +static methodinfo_t flash_text_TextField_getLineMetrics; +static varinfo_t flash_text_TextField_selectionEndIndex; +static methodinfo_t flash_text_TextField_insertXMLText; +static varinfo_t flash_text_TextField_condenseWhite; +static classinfo_t flash_printing_PrintJobOrientation; +static classinfo_t flash_text_TextRenderer; +static classinfo_t flash_net_NetConnection; +static varinfo_t flash_net_NetConnection_nearID; +static varinfo_t flash_net_NetConnection_client; +static varinfo_t flash_net_NetConnection_farNonce; +static varinfo_t flash_net_NetConnection_objectEncoding; +static varinfo_t flash_net_NetConnection_farID; +static varinfo_t flash_net_NetConnection_connected; +static methodinfo_t flash_net_NetConnection_call; +static varinfo_t flash_net_NetConnection_usingTLS; +static varinfo_t flash_net_NetConnection_proxyType; +static methodinfo_t flash_net_NetConnection_addHeader; +static varinfo_t flash_net_NetConnection_protocol; +static methodinfo_t flash_net_NetConnection_close; +static varinfo_t flash_net_NetConnection_nearNonce; +static methodinfo_t flash_net_NetConnection_connect; +static varinfo_t flash_net_NetConnection_unconnectedPeerStreams; +static varinfo_t flash_net_NetConnection_maxPeerConnections; +static varinfo_t flash_net_NetConnection_connectedProxyType; +static varinfo_t flash_net_NetConnection_uri; +static varinfo_t flash_net_NetConnection_nearID; +static varinfo_t flash_net_NetConnection_client; +static varinfo_t flash_net_NetConnection_farNonce; +static varinfo_t flash_net_NetConnection_objectEncoding; +static varinfo_t flash_net_NetConnection_farID; +static varinfo_t flash_net_NetConnection_connected; +static methodinfo_t flash_net_NetConnection_call; +static varinfo_t flash_net_NetConnection_usingTLS; +static varinfo_t flash_net_NetConnection_proxyType; +static methodinfo_t flash_net_NetConnection_addHeader; +static varinfo_t flash_net_NetConnection_protocol; +static methodinfo_t flash_net_NetConnection_close; +static varinfo_t flash_net_NetConnection_nearNonce; +static methodinfo_t flash_net_NetConnection_connect; +static varinfo_t flash_net_NetConnection_unconnectedPeerStreams; +static varinfo_t flash_net_NetConnection_maxPeerConnections; +static varinfo_t flash_net_NetConnection_connectedProxyType; +static varinfo_t flash_net_NetConnection_uri; +static methodinfo_t _decodeURIComponent; +static methodinfo_t flash_sampler_isGetterSetter; +static methodinfo_t flash_utils_getQualifiedSuperclassName; +static classinfo_t flash_display_GraphicsPathWinding; +static classinfo_t flash_text_engine_TabStop; +static varinfo_t flash_text_engine_TabStop_alignment; +static varinfo_t flash_text_engine_TabStop_position; +static varinfo_t flash_text_engine_TabStop_decimalAlignmentToken; +static varinfo_t flash_text_engine_TabStop_alignment; +static varinfo_t flash_text_engine_TabStop_position; +static varinfo_t flash_text_engine_TabStop_decimalAlignmentToken; +static classinfo_t flash_text_engine_JustificationStyle; +static methodinfo_t flash_sampler_startSampling; +static classinfo_t flash_text_engine_TextRotation; +static methodinfo_t flash_sampler_clearSamples; +static classinfo_t flash_system_IMEConversionMode; +static classinfo_t flash_display_StageScaleMode; +static methodinfo_t flash_sampler_getSize; +static classinfo_t flash_net_URLStream; +static methodinfo_t flash_net_URLStream_readUTF; +static methodinfo_t flash_net_URLStream_readByte; +static methodinfo_t flash_net_URLStream_readUTFBytes; +static methodinfo_t flash_net_URLStream_readShort; +static varinfo_t flash_net_URLStream_objectEncoding; +static varinfo_t flash_net_URLStream_connected; +static methodinfo_t flash_net_URLStream_readUnsignedInt; +static methodinfo_t flash_net_URLStream_readDouble; +static methodinfo_t flash_net_URLStream_readBytes; +static methodinfo_t flash_net_URLStream_readUnsignedByte; +static methodinfo_t flash_net_URLStream_readMultiByte; +static methodinfo_t flash_net_URLStream_readInt; +static varinfo_t flash_net_URLStream_bytesAvailable; +static methodinfo_t flash_net_URLStream_load; +static methodinfo_t flash_net_URLStream_close; +static methodinfo_t flash_net_URLStream_readUnsignedShort; +static methodinfo_t flash_net_URLStream_readObject; +static methodinfo_t flash_net_URLStream_readFloat; +static varinfo_t flash_net_URLStream_endian; +static methodinfo_t flash_net_URLStream_readBoolean; +static methodinfo_t flash_net_URLStream_readUTF; +static methodinfo_t flash_net_URLStream_readByte; +static methodinfo_t flash_net_URLStream_readUTFBytes; +static methodinfo_t flash_net_URLStream_readShort; +static varinfo_t flash_net_URLStream_objectEncoding; +static varinfo_t flash_net_URLStream_connected; +static methodinfo_t flash_net_URLStream_readUnsignedInt; +static methodinfo_t flash_net_URLStream_readDouble; +static methodinfo_t flash_net_URLStream_readBytes; +static methodinfo_t flash_net_URLStream_readUnsignedByte; +static methodinfo_t flash_net_URLStream_readMultiByte; +static methodinfo_t flash_net_URLStream_readInt; +static varinfo_t flash_net_URLStream_bytesAvailable; +static methodinfo_t flash_net_URLStream_load; +static methodinfo_t flash_net_URLStream_close; +static methodinfo_t flash_net_URLStream_readUnsignedShort; +static methodinfo_t flash_net_URLStream_readObject; +static methodinfo_t flash_net_URLStream_readFloat; +static varinfo_t flash_net_URLStream_endian; +static methodinfo_t flash_net_URLStream_readBoolean; +static classinfo_t flash_display_BlendMode; +static classinfo_t flash_ui_Mouse; +static classinfo_t flash_errors_InvalidSWFError; +static classinfo_t flash_text_engine_RenderingMode; +static classinfo_t flash_display_GraphicsTrianglePath; +static varinfo_t flash_display_GraphicsTrianglePath_culling; +static varinfo_t flash_display_GraphicsTrianglePath_vertices; +static varinfo_t flash_display_GraphicsTrianglePath_indices; +static varinfo_t flash_display_GraphicsTrianglePath_uvtData; +static varinfo_t flash_display_GraphicsTrianglePath_culling; +static varinfo_t flash_display_GraphicsTrianglePath_vertices; +static varinfo_t flash_display_GraphicsTrianglePath_indices; +static varinfo_t flash_display_GraphicsTrianglePath_uvtData; +static classinfo_t flash_display_IGraphicsFill; +static classinfo_t flash_text_engine_TypographicCase; +static classinfo_t _XML; +static methodinfo_t _XML_normalize; +static methodinfo_t _XML_removeNamespace; +static methodinfo_t _XML_prependChild; +static methodinfo_t _XML_toXMLString; +static methodinfo_t _XML_text; +static methodinfo_t _XML_nodeKind; +static methodinfo_t _XML_copy; +static methodinfo_t _XML_toString; +static methodinfo_t _XML_childIndex; +static methodinfo_t _XML_setName; +static methodinfo_t _XML_setLocalName; +static methodinfo_t _XML_namespace; +static methodinfo_t _XML_insertChildBefore; +static methodinfo_t _XML_addNamespace; +static methodinfo_t _XML_propertyIsEnumerable; +static methodinfo_t _XML_comments; +static methodinfo_t _XML_attributes; +static methodinfo_t _XML_descendants; +static methodinfo_t _XML_replace; +static methodinfo_t _XML_setNotification; +static methodinfo_t _XML_children; +static methodinfo_t _XML_contains; +static methodinfo_t _XML_hasSimpleContent; +static methodinfo_t _XML_elements; +static methodinfo_t _XML_hasComplexContent; +static methodinfo_t _XML_insertChildAfter; +static methodinfo_t _XML_parent; +static methodinfo_t _XML_length; +static methodinfo_t _XML_processingInstructions; +static methodinfo_t _XML_child; +static methodinfo_t _XML_appendChild; +static methodinfo_t _XML_valueOf; +static methodinfo_t _XML_localName; +static methodinfo_t _XML_notification; +static methodinfo_t _XML_inScopeNamespaces; +static methodinfo_t _XML_hasOwnProperty; +static methodinfo_t _XML_namespaceDeclarations; +static methodinfo_t _XML_setNamespace; +static methodinfo_t _XML_name; +static methodinfo_t _XML_setChildren; +static methodinfo_t _XML_attribute; +static methodinfo_t _XML_normalize; +static methodinfo_t _XML_removeNamespace; +static methodinfo_t _XML_prependChild; +static methodinfo_t _XML_toXMLString; +static methodinfo_t _XML_text; +static methodinfo_t _XML_nodeKind; +static methodinfo_t _XML_copy; +static methodinfo_t _XML_toString; +static methodinfo_t _XML_childIndex; +static methodinfo_t _XML_setName; +static methodinfo_t _XML_setLocalName; +static methodinfo_t _XML_namespace; +static methodinfo_t _XML_insertChildBefore; +static methodinfo_t _XML_addNamespace; +static methodinfo_t _XML_propertyIsEnumerable; +static methodinfo_t _XML_comments; +static methodinfo_t _XML_attributes; +static methodinfo_t _XML_descendants; +static methodinfo_t _XML_replace; +static methodinfo_t _XML_setNotification; +static methodinfo_t _XML_children; +static methodinfo_t _XML_contains; +static methodinfo_t _XML_hasSimpleContent; +static methodinfo_t _XML_elements; +static methodinfo_t _XML_hasComplexContent; +static methodinfo_t _XML_insertChildAfter; +static methodinfo_t _XML_parent; +static methodinfo_t _XML_length; +static methodinfo_t _XML_processingInstructions; +static methodinfo_t _XML_child; +static methodinfo_t _XML_appendChild; +static methodinfo_t _XML_valueOf; +static methodinfo_t _XML_localName; +static methodinfo_t _XML_notification; +static methodinfo_t _XML_inScopeNamespaces; +static methodinfo_t _XML_hasOwnProperty; +static methodinfo_t _XML_namespaceDeclarations; +static methodinfo_t _XML_setNamespace; +static methodinfo_t _XML_name; +static methodinfo_t _XML_setChildren; +static methodinfo_t _XML_attribute; +static classinfo_t flash_net_NetStreamInfo; +static varinfo_t flash_net_NetStreamInfo_maxBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_dataBufferByteLength; +static varinfo_t flash_net_NetStreamInfo_videoByteCount; +static varinfo_t flash_net_NetStreamInfo_videoBufferLength; +static varinfo_t flash_net_NetStreamInfo_audioBufferByteLength; +static varinfo_t flash_net_NetStreamInfo_dataBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_SRTT; +static varinfo_t flash_net_NetStreamInfo_droppedFrames; +static varinfo_t flash_net_NetStreamInfo_audioByteCount; +static varinfo_t flash_net_NetStreamInfo_audioBufferLength; +static varinfo_t flash_net_NetStreamInfo_byteCount; +static methodinfo_t flash_net_NetStreamInfo_toString; +static varinfo_t flash_net_NetStreamInfo_dataByteCount; +static varinfo_t flash_net_NetStreamInfo_videoBufferByteLength; +static varinfo_t flash_net_NetStreamInfo_dataBufferLength; +static varinfo_t flash_net_NetStreamInfo_audioLossRate; +static varinfo_t flash_net_NetStreamInfo_videoBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_currentBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_audioBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_playbackBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_maxBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_dataBufferByteLength; +static varinfo_t flash_net_NetStreamInfo_videoByteCount; +static varinfo_t flash_net_NetStreamInfo_videoBufferLength; +static varinfo_t flash_net_NetStreamInfo_audioBufferByteLength; +static varinfo_t flash_net_NetStreamInfo_dataBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_SRTT; +static varinfo_t flash_net_NetStreamInfo_droppedFrames; +static varinfo_t flash_net_NetStreamInfo_audioByteCount; +static varinfo_t flash_net_NetStreamInfo_audioBufferLength; +static varinfo_t flash_net_NetStreamInfo_byteCount; +static methodinfo_t flash_net_NetStreamInfo_toString; +static varinfo_t flash_net_NetStreamInfo_dataByteCount; +static varinfo_t flash_net_NetStreamInfo_videoBufferByteLength; +static varinfo_t flash_net_NetStreamInfo_dataBufferLength; +static varinfo_t flash_net_NetStreamInfo_audioLossRate; +static varinfo_t flash_net_NetStreamInfo_videoBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_currentBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_audioBytesPerSecond; +static varinfo_t flash_net_NetStreamInfo_playbackBytesPerSecond; +static classinfo_t flash_display_Stage; +static methodinfo_t flash_display_Stage_setChildIndex; +static varinfo_t flash_display_Stage_stageFocusRect; +static varinfo_t flash_display_Stage_frameRate; +static methodinfo_t flash_display_Stage_invalidate; +static varinfo_t flash_display_Stage_textSnapshot; +static varinfo_t flash_display_Stage_quality; +static methodinfo_t flash_display_Stage_willTrigger; +static methodinfo_t flash_display_Stage_dispatchEvent; +static methodinfo_t flash_display_Stage_isFocusInaccessible; +static methodinfo_t flash_display_Stage_removeChildAt; +static varinfo_t flash_display_Stage_fullScreenWidth; +static methodinfo_t flash_display_Stage_addChildAt; +static varinfo_t flash_display_Stage_height; +static varinfo_t flash_display_Stage_fullScreenSourceRect; +static varinfo_t flash_display_Stage_width; +static methodinfo_t flash_display_Stage_addChild; +static varinfo_t flash_display_Stage_numChildren; +static varinfo_t flash_display_Stage_mouseChildren; +static methodinfo_t flash_display_Stage_swapChildrenAt; +static varinfo_t flash_display_Stage_showDefaultContextMenu; +static methodinfo_t flash_display_Stage_addEventListener; +static varinfo_t flash_display_Stage_stageHeight; +static varinfo_t flash_display_Stage_fullScreenHeight; +static varinfo_t flash_display_Stage_align; +static methodinfo_t flash_display_Stage_hasEventListener; +static varinfo_t flash_display_Stage_displayState; +static varinfo_t flash_display_Stage_scaleMode; +static varinfo_t flash_display_Stage_tabChildren; +static varinfo_t flash_display_Stage_focus; +static varinfo_t flash_display_Stage_colorCorrection; +static varinfo_t flash_display_Stage_colorCorrectionSupport; +static varinfo_t flash_display_Stage_stageWidth; +static methodinfo_t flash_display_Stage_setChildIndex; +static varinfo_t flash_display_Stage_stageFocusRect; +static varinfo_t flash_display_Stage_frameRate; +static methodinfo_t flash_display_Stage_invalidate; +static varinfo_t flash_display_Stage_textSnapshot; +static varinfo_t flash_display_Stage_quality; +static methodinfo_t flash_display_Stage_willTrigger; +static methodinfo_t flash_display_Stage_dispatchEvent; +static methodinfo_t flash_display_Stage_isFocusInaccessible; +static methodinfo_t flash_display_Stage_removeChildAt; +static varinfo_t flash_display_Stage_fullScreenWidth; +static methodinfo_t flash_display_Stage_addChildAt; +static varinfo_t flash_display_Stage_height; +static varinfo_t flash_display_Stage_fullScreenSourceRect; +static varinfo_t flash_display_Stage_width; +static methodinfo_t flash_display_Stage_addChild; +static varinfo_t flash_display_Stage_numChildren; +static varinfo_t flash_display_Stage_mouseChildren; +static methodinfo_t flash_display_Stage_swapChildrenAt; +static varinfo_t flash_display_Stage_showDefaultContextMenu; +static methodinfo_t flash_display_Stage_addEventListener; +static varinfo_t flash_display_Stage_stageHeight; +static varinfo_t flash_display_Stage_fullScreenHeight; +static varinfo_t flash_display_Stage_align; +static methodinfo_t flash_display_Stage_hasEventListener; +static varinfo_t flash_display_Stage_displayState; +static varinfo_t flash_display_Stage_scaleMode; +static varinfo_t flash_display_Stage_tabChildren; +static varinfo_t flash_display_Stage_focus; +static varinfo_t flash_display_Stage_colorCorrection; +static varinfo_t flash_display_Stage_colorCorrectionSupport; +static varinfo_t flash_display_Stage_stageWidth; +static classinfo_t flash_ui_ContextMenuItem; +static varinfo_t flash_ui_ContextMenuItem_separatorBefore; +static varinfo_t flash_ui_ContextMenuItem_enabled; +static varinfo_t flash_ui_ContextMenuItem_caption; +static methodinfo_t flash_ui_ContextMenuItem_clone; +static varinfo_t flash_ui_ContextMenuItem_visible; +static varinfo_t flash_ui_ContextMenuItem_separatorBefore; +static varinfo_t flash_ui_ContextMenuItem_enabled; +static varinfo_t flash_ui_ContextMenuItem_caption; +static methodinfo_t flash_ui_ContextMenuItem_clone; +static varinfo_t flash_ui_ContextMenuItem_visible; +static classinfo_t flash_trace_Trace; +static classinfo_t flash_events_TimerEvent; +static methodinfo_t flash_events_TimerEvent_toString; +static methodinfo_t flash_events_TimerEvent_clone; +static methodinfo_t flash_events_TimerEvent_updateAfterEvent; +static methodinfo_t flash_events_TimerEvent_toString; +static methodinfo_t flash_events_TimerEvent_clone; +static methodinfo_t flash_events_TimerEvent_updateAfterEvent; +static classinfo_t flash_events_SampleDataEvent; +static methodinfo_t flash_events_SampleDataEvent_toString; +static varinfo_t flash_events_SampleDataEvent_position; +static methodinfo_t flash_events_SampleDataEvent_clone; +static varinfo_t flash_events_SampleDataEvent_data; +static methodinfo_t flash_events_SampleDataEvent_toString; +static varinfo_t flash_events_SampleDataEvent_position; +static methodinfo_t flash_events_SampleDataEvent_clone; +static varinfo_t flash_events_SampleDataEvent_data; +static classinfo_t flash_display_ShaderPrecision; +static classinfo_t flash_net_FileReference; +static varinfo_t flash_net_FileReference_type; +static methodinfo_t flash_net_FileReference_browse; +static varinfo_t flash_net_FileReference_creationDate; +static methodinfo_t flash_net_FileReference_upload; +static methodinfo_t flash_net_FileReference_download; +static methodinfo_t flash_net_FileReference_save; +static methodinfo_t flash_net_FileReference_cancel; +static varinfo_t flash_net_FileReference_creator; +static varinfo_t flash_net_FileReference_data; +static varinfo_t flash_net_FileReference_size; +static varinfo_t flash_net_FileReference_name; +static methodinfo_t flash_net_FileReference_load; +static varinfo_t flash_net_FileReference_modificationDate; +static varinfo_t flash_net_FileReference_type; +static methodinfo_t flash_net_FileReference_browse; +static varinfo_t flash_net_FileReference_creationDate; +static methodinfo_t flash_net_FileReference_upload; +static methodinfo_t flash_net_FileReference_download; +static methodinfo_t flash_net_FileReference_save; +static methodinfo_t flash_net_FileReference_cancel; +static varinfo_t flash_net_FileReference_creator; +static varinfo_t flash_net_FileReference_data; +static varinfo_t flash_net_FileReference_size; +static varinfo_t flash_net_FileReference_name; +static methodinfo_t flash_net_FileReference_load; +static varinfo_t flash_net_FileReference_modificationDate; +static classinfo_t _DefinitionError; +static classinfo_t flash_events_EventDispatcher; +static methodinfo_t flash_events_EventDispatcher_willTrigger; +static methodinfo_t flash_events_EventDispatcher_toString; +static methodinfo_t flash_events_EventDispatcher_removeEventListener; +static methodinfo_t flash_events_EventDispatcher_hasEventListener; +static methodinfo_t flash_events_EventDispatcher_addEventListener; +static methodinfo_t flash_events_EventDispatcher_dispatchEvent; +static methodinfo_t flash_events_EventDispatcher_willTrigger; +static methodinfo_t flash_events_EventDispatcher_toString; +static methodinfo_t flash_events_EventDispatcher_removeEventListener; +static methodinfo_t flash_events_EventDispatcher_hasEventListener; +static methodinfo_t flash_events_EventDispatcher_addEventListener; +static methodinfo_t flash_events_EventDispatcher_dispatchEvent; +static classinfo_t flash_net_SharedObjectFlushStatus; +static classinfo_t flash_text_TextLineMetrics; +static varinfo_t flash_text_TextLineMetrics_descent; +static varinfo_t flash_text_TextLineMetrics_width; +static varinfo_t flash_text_TextLineMetrics_ascent; +static varinfo_t flash_text_TextLineMetrics_leading; +static varinfo_t flash_text_TextLineMetrics_height; +static varinfo_t flash_text_TextLineMetrics_x; +static varinfo_t flash_text_TextLineMetrics_descent; +static varinfo_t flash_text_TextLineMetrics_width; +static varinfo_t flash_text_TextLineMetrics_ascent; +static varinfo_t flash_text_TextLineMetrics_leading; +static varinfo_t flash_text_TextLineMetrics_height; +static varinfo_t flash_text_TextLineMetrics_x; +static classinfo_t flash_text_AntiAliasType; +static classinfo_t flash_system_SecurityDomain; +static classinfo_t flash_text_Font; +static methodinfo_t flash_text_Font_hasGlyphs; +static varinfo_t flash_text_Font_fontName; +static varinfo_t flash_text_Font_fontStyle; +static varinfo_t flash_text_Font_fontType; +static methodinfo_t flash_text_Font_hasGlyphs; +static varinfo_t flash_text_Font_fontName; +static varinfo_t flash_text_Font_fontStyle; +static varinfo_t flash_text_Font_fontType; +static classinfo_t _RegExp; +static varinfo_t _RegExp_source; +static methodinfo_t _RegExp_test; +static varinfo_t _RegExp_global; +static methodinfo_t _RegExp_exec; +static varinfo_t _RegExp_ignoreCase; +static varinfo_t _RegExp_dotall; +static varinfo_t _RegExp_lastIndex; +static varinfo_t _RegExp_extended; +static varinfo_t _RegExp_multiline; +static varinfo_t _RegExp_source; +static methodinfo_t _RegExp_test; +static varinfo_t _RegExp_global; +static methodinfo_t _RegExp_exec; +static varinfo_t _RegExp_ignoreCase; +static varinfo_t _RegExp_dotall; +static varinfo_t _RegExp_lastIndex; +static varinfo_t _RegExp_extended; +static varinfo_t _RegExp_multiline; +static classinfo_t flash_accessibility_AccessibilityProperties; +static varinfo_t flash_accessibility_AccessibilityProperties_forceSimple; +static varinfo_t flash_accessibility_AccessibilityProperties_noAutoLabeling; +static varinfo_t flash_accessibility_AccessibilityProperties_description; +static varinfo_t flash_accessibility_AccessibilityProperties_name; +static varinfo_t flash_accessibility_AccessibilityProperties_shortcut; +static varinfo_t flash_accessibility_AccessibilityProperties_silent; +static varinfo_t flash_accessibility_AccessibilityProperties_forceSimple; +static varinfo_t flash_accessibility_AccessibilityProperties_noAutoLabeling; +static varinfo_t flash_accessibility_AccessibilityProperties_description; +static varinfo_t flash_accessibility_AccessibilityProperties_name; +static varinfo_t flash_accessibility_AccessibilityProperties_shortcut; +static varinfo_t flash_accessibility_AccessibilityProperties_silent; +static classinfo_t flash_ui_ContextMenu; +static methodinfo_t flash_ui_ContextMenu_hideBuiltInItems; +static varinfo_t flash_ui_ContextMenu_clipboardItems; +static varinfo_t flash_ui_ContextMenu_builtInItems; +static varinfo_t flash_ui_ContextMenu_customItems; +static methodinfo_t flash_ui_ContextMenu_clone; +static varinfo_t flash_ui_ContextMenu_link; +static varinfo_t flash_ui_ContextMenu_clipboardMenu; +static methodinfo_t flash_ui_ContextMenu_hideBuiltInItems; +static varinfo_t flash_ui_ContextMenu_clipboardItems; +static varinfo_t flash_ui_ContextMenu_builtInItems; +static varinfo_t flash_ui_ContextMenu_customItems; +static methodinfo_t flash_ui_ContextMenu_clone; +static varinfo_t flash_ui_ContextMenu_link; +static varinfo_t flash_ui_ContextMenu_clipboardMenu; +static classinfo_t flash_text_TextFieldAutoSize; +static classinfo_t _Math; +static classinfo_t flash_display_ColorCorrectionSupport; +static classinfo_t flash_errors_IOError; +static methodinfo_t _trace; +static classinfo_t flash_ui_ContextMenuBuiltInItems; +static varinfo_t flash_ui_ContextMenuBuiltInItems_zoom; +static varinfo_t flash_ui_ContextMenuBuiltInItems_save; +static varinfo_t flash_ui_ContextMenuBuiltInItems_loop; +static varinfo_t flash_ui_ContextMenuBuiltInItems_print; +static varinfo_t flash_ui_ContextMenuBuiltInItems_forwardAndBack; +static varinfo_t flash_ui_ContextMenuBuiltInItems_rewind; +static methodinfo_t flash_ui_ContextMenuBuiltInItems_clone; +static varinfo_t flash_ui_ContextMenuBuiltInItems_quality; +static varinfo_t flash_ui_ContextMenuBuiltInItems_play; +static varinfo_t flash_ui_ContextMenuBuiltInItems_zoom; +static varinfo_t flash_ui_ContextMenuBuiltInItems_save; +static varinfo_t flash_ui_ContextMenuBuiltInItems_loop; +static varinfo_t flash_ui_ContextMenuBuiltInItems_print; +static varinfo_t flash_ui_ContextMenuBuiltInItems_forwardAndBack; +static varinfo_t flash_ui_ContextMenuBuiltInItems_rewind; +static methodinfo_t flash_ui_ContextMenuBuiltInItems_clone; +static varinfo_t flash_ui_ContextMenuBuiltInItems_quality; +static varinfo_t flash_ui_ContextMenuBuiltInItems_play; +static classinfo_t flash_net_FileReferenceList; +static varinfo_t flash_net_FileReferenceList_fileList; +static methodinfo_t flash_net_FileReferenceList_browse; +static varinfo_t flash_net_FileReferenceList_fileList; +static methodinfo_t flash_net_FileReferenceList_browse; +static classinfo_t flash_display_TriangleCulling; +static classinfo_t flash_media_SoundMixer; +static classinfo_t adobe_utils_XMLUI; +static methodinfo_t _escape; +static methodinfo_t flash_utils_setInterval; +static classinfo_t flash_events_StatusEvent; +static methodinfo_t flash_events_StatusEvent_toString; +static varinfo_t flash_events_StatusEvent_code; +static methodinfo_t flash_events_StatusEvent_clone; +static varinfo_t flash_events_StatusEvent_level; +static methodinfo_t flash_events_StatusEvent_toString; +static varinfo_t flash_events_StatusEvent_code; +static methodinfo_t flash_events_StatusEvent_clone; +static varinfo_t flash_events_StatusEvent_level; +static classinfo_t flash_display_IGraphicsPath; +static classinfo_t flash_events_ShaderEvent; +static varinfo_t flash_events_ShaderEvent_vector; +static methodinfo_t flash_events_ShaderEvent_toString; +static varinfo_t flash_events_ShaderEvent_bitmapData; +static methodinfo_t flash_events_ShaderEvent_clone; +static varinfo_t flash_events_ShaderEvent_byteArray; +static varinfo_t flash_events_ShaderEvent_vector; +static methodinfo_t flash_events_ShaderEvent_toString; +static varinfo_t flash_events_ShaderEvent_bitmapData; +static methodinfo_t flash_events_ShaderEvent_clone; +static varinfo_t flash_events_ShaderEvent_byteArray; +static classinfo_t flash_display_Shader; +static varinfo_t flash_display_Shader_precisionHint; +static varinfo_t flash_display_Shader_data; +static varinfo_t flash_display_Shader_precisionHint; +static varinfo_t flash_display_Shader_data; +static classinfo_t flash_errors_StackOverflowError; +static methodinfo_t flash_sampler_getInvocationCount; +static classinfo_t flash_text_engine_Kerning; +static classinfo_t flash_text_CSMSettings; +static varinfo_t flash_text_CSMSettings_fontSize; +static varinfo_t flash_text_CSMSettings_outsideCutoff; +static varinfo_t flash_text_CSMSettings_insideCutoff; +static varinfo_t flash_text_CSMSettings_fontSize; +static varinfo_t flash_text_CSMSettings_outsideCutoff; +static varinfo_t flash_text_CSMSettings_insideCutoff; +static classinfo_t _RangeError; +static classinfo_t _Number; +static methodinfo_t _Number_valueOf; +static methodinfo_t _Number_toString; +static methodinfo_t _Number_toExponential; +static methodinfo_t _Number_toFixed; +static methodinfo_t _Number_toPrecision; +static methodinfo_t _Number_valueOf; +static methodinfo_t _Number_toString; +static methodinfo_t _Number_toExponential; +static methodinfo_t _Number_toFixed; +static methodinfo_t _Number_toPrecision; +static classinfo_t flash_display_Graphics; +static methodinfo_t flash_display_Graphics_drawPath; +static methodinfo_t flash_display_Graphics_drawEllipse; +static methodinfo_t flash_display_Graphics_drawRoundRectComplex; +static methodinfo_t flash_display_Graphics_moveTo; +static methodinfo_t flash_display_Graphics_lineShaderStyle; +static methodinfo_t flash_display_Graphics_beginFill; +static methodinfo_t flash_display_Graphics_beginGradientFill; +static methodinfo_t flash_display_Graphics_drawGraphicsData; +static methodinfo_t flash_display_Graphics_lineGradientStyle; +static methodinfo_t flash_display_Graphics_drawRoundRect; +static methodinfo_t flash_display_Graphics_beginBitmapFill; +static methodinfo_t flash_display_Graphics_lineStyle; +static methodinfo_t flash_display_Graphics_lineTo; +static methodinfo_t flash_display_Graphics_endFill; +static methodinfo_t flash_display_Graphics_copyFrom; +static methodinfo_t flash_display_Graphics_lineBitmapStyle; +static methodinfo_t flash_display_Graphics_curveTo; +static methodinfo_t flash_display_Graphics_clear; +static methodinfo_t flash_display_Graphics_drawCircle; +static methodinfo_t flash_display_Graphics_beginShaderFill; +static methodinfo_t flash_display_Graphics_drawTriangles; +static methodinfo_t flash_display_Graphics_drawRect; +static methodinfo_t flash_display_Graphics_drawPath; +static methodinfo_t flash_display_Graphics_drawEllipse; +static methodinfo_t flash_display_Graphics_drawRoundRectComplex; +static methodinfo_t flash_display_Graphics_moveTo; +static methodinfo_t flash_display_Graphics_lineShaderStyle; +static methodinfo_t flash_display_Graphics_beginFill; +static methodinfo_t flash_display_Graphics_beginGradientFill; +static methodinfo_t flash_display_Graphics_drawGraphicsData; +static methodinfo_t flash_display_Graphics_lineGradientStyle; +static methodinfo_t flash_display_Graphics_drawRoundRect; +static methodinfo_t flash_display_Graphics_beginBitmapFill; +static methodinfo_t flash_display_Graphics_lineStyle; +static methodinfo_t flash_display_Graphics_lineTo; +static methodinfo_t flash_display_Graphics_endFill; +static methodinfo_t flash_display_Graphics_copyFrom; +static methodinfo_t flash_display_Graphics_lineBitmapStyle; +static methodinfo_t flash_display_Graphics_curveTo; +static methodinfo_t flash_display_Graphics_clear; +static methodinfo_t flash_display_Graphics_drawCircle; +static methodinfo_t flash_display_Graphics_beginShaderFill; +static methodinfo_t flash_display_Graphics_drawTriangles; +static methodinfo_t flash_display_Graphics_drawRect; +static classinfo_t _SyntaxError; +static classinfo_t flash_sampler_NewObjectSample; +static varinfo_t flash_sampler_NewObjectSample_type; +static varinfo_t flash_sampler_NewObjectSample_object; +static varinfo_t flash_sampler_NewObjectSample_id; +static varinfo_t flash_sampler_NewObjectSample_type; +static varinfo_t flash_sampler_NewObjectSample_object; +static varinfo_t flash_sampler_NewObjectSample_id; +static classinfo_t flash_net_FileFilter; +static varinfo_t flash_net_FileFilter_extension; +static varinfo_t flash_net_FileFilter_description; +static varinfo_t flash_net_FileFilter_macType; +static varinfo_t flash_net_FileFilter_extension; +static varinfo_t flash_net_FileFilter_description; +static varinfo_t flash_net_FileFilter_macType; +static classinfo_t flash_display_BitmapDataChannel; +static methodinfo_t flash_utils_clearInterval; +static classinfo_t flash_text_engine_ContentElement; +static varinfo_t flash_text_engine_ContentElement_eventMirror; +static varinfo_t flash_text_engine_ContentElement_groupElement; +static varinfo_t flash_text_engine_ContentElement_textRotation; +static varinfo_t flash_text_engine_ContentElement_text; +static varinfo_t flash_text_engine_ContentElement_userData; +static varinfo_t flash_text_engine_ContentElement_elementFormat; +static varinfo_t flash_text_engine_ContentElement_textBlock; +static varinfo_t flash_text_engine_ContentElement_rawText; +static varinfo_t flash_text_engine_ContentElement_textBlockBeginIndex; +static varinfo_t flash_text_engine_ContentElement_eventMirror; +static varinfo_t flash_text_engine_ContentElement_groupElement; +static varinfo_t flash_text_engine_ContentElement_textRotation; +static varinfo_t flash_text_engine_ContentElement_text; +static varinfo_t flash_text_engine_ContentElement_userData; +static varinfo_t flash_text_engine_ContentElement_elementFormat; +static varinfo_t flash_text_engine_ContentElement_textBlock; +static varinfo_t flash_text_engine_ContentElement_rawText; +static varinfo_t flash_text_engine_ContentElement_textBlockBeginIndex; +static classinfo_t flash_utils_Endian; +static methodinfo_t flash_net_navigateToURL; +static classinfo_t flash_events_ProgressEvent; +static varinfo_t flash_events_ProgressEvent_bytesLoaded; +static methodinfo_t flash_events_ProgressEvent_toString; +static varinfo_t flash_events_ProgressEvent_bytesTotal; +static methodinfo_t flash_events_ProgressEvent_clone; +static varinfo_t flash_events_ProgressEvent_bytesLoaded; +static methodinfo_t flash_events_ProgressEvent_toString; +static varinfo_t flash_events_ProgressEvent_bytesTotal; +static methodinfo_t flash_events_ProgressEvent_clone; +static classinfo_t flash_media_Sound; +static methodinfo_t flash_media_Sound_extract; +static varinfo_t flash_media_Sound_bytesLoaded; +static varinfo_t flash_media_Sound_id3; +static methodinfo_t flash_media_Sound_play; +static varinfo_t flash_media_Sound_url; +static varinfo_t flash_media_Sound_isBuffering; +static methodinfo_t flash_media_Sound_load; +static varinfo_t flash_media_Sound_bytesTotal; +static varinfo_t flash_media_Sound_length; +static methodinfo_t flash_media_Sound_close; +static methodinfo_t flash_media_Sound_extract; +static varinfo_t flash_media_Sound_bytesLoaded; +static varinfo_t flash_media_Sound_id3; +static methodinfo_t flash_media_Sound_play; +static varinfo_t flash_media_Sound_url; +static varinfo_t flash_media_Sound_isBuffering; +static methodinfo_t flash_media_Sound_load; +static varinfo_t flash_media_Sound_bytesTotal; +static varinfo_t flash_media_Sound_length; +static methodinfo_t flash_media_Sound_close; +static classinfo_t flash_text_TextExtent; +static varinfo_t flash_text_TextExtent_descent; +static varinfo_t flash_text_TextExtent_width; +static varinfo_t flash_text_TextExtent_ascent; +static varinfo_t flash_text_TextExtent_textFieldHeight; +static varinfo_t flash_text_TextExtent_textFieldWidth; +static varinfo_t flash_text_TextExtent_height; +static varinfo_t flash_text_TextExtent_descent; +static varinfo_t flash_text_TextExtent_width; +static varinfo_t flash_text_TextExtent_ascent; +static varinfo_t flash_text_TextExtent_textFieldHeight; +static varinfo_t flash_text_TextExtent_textFieldWidth; +static varinfo_t flash_text_TextExtent_height; +static classinfo_t flash_text_FontStyle; +static classinfo_t flash_text_engine_TextLineMirrorRegion; +static varinfo_t flash_text_engine_TextLineMirrorRegion_mirror; +static varinfo_t flash_text_engine_TextLineMirrorRegion_previousRegion; +static varinfo_t flash_text_engine_TextLineMirrorRegion_bounds; +static varinfo_t flash_text_engine_TextLineMirrorRegion_nextRegion; +static varinfo_t flash_text_engine_TextLineMirrorRegion_element; +static varinfo_t flash_text_engine_TextLineMirrorRegion_textLine; +static varinfo_t flash_text_engine_TextLineMirrorRegion_mirror; +static varinfo_t flash_text_engine_TextLineMirrorRegion_previousRegion; +static varinfo_t flash_text_engine_TextLineMirrorRegion_bounds; +static varinfo_t flash_text_engine_TextLineMirrorRegion_nextRegion; +static varinfo_t flash_text_engine_TextLineMirrorRegion_element; +static varinfo_t flash_text_engine_TextLineMirrorRegion_textLine; +static classinfo_t flash_geom_Vector3D; +static methodinfo_t flash_geom_Vector3D_subtract; +static methodinfo_t flash_geom_Vector3D_scaleBy; +static methodinfo_t flash_geom_Vector3D_decrementBy; +static methodinfo_t flash_geom_Vector3D_equals; +static methodinfo_t flash_geom_Vector3D_normalize; +static methodinfo_t flash_geom_Vector3D_dotProduct; +static methodinfo_t flash_geom_Vector3D_negate; +static methodinfo_t flash_geom_Vector3D_toString; +static varinfo_t flash_geom_Vector3D_lengthSquared; +static varinfo_t flash_geom_Vector3D_x; +static methodinfo_t flash_geom_Vector3D_incrementBy; +static varinfo_t flash_geom_Vector3D_w; +static varinfo_t flash_geom_Vector3D_z; +static methodinfo_t flash_geom_Vector3D_add; +static methodinfo_t flash_geom_Vector3D_project; +static methodinfo_t flash_geom_Vector3D_crossProduct; +static methodinfo_t flash_geom_Vector3D_nearEquals; +static methodinfo_t flash_geom_Vector3D_clone; +static varinfo_t flash_geom_Vector3D_y; +static varinfo_t flash_geom_Vector3D_length; +static methodinfo_t flash_geom_Vector3D_subtract; +static methodinfo_t flash_geom_Vector3D_scaleBy; +static methodinfo_t flash_geom_Vector3D_decrementBy; +static methodinfo_t flash_geom_Vector3D_equals; +static methodinfo_t flash_geom_Vector3D_normalize; +static methodinfo_t flash_geom_Vector3D_dotProduct; +static methodinfo_t flash_geom_Vector3D_negate; +static methodinfo_t flash_geom_Vector3D_toString; +static varinfo_t flash_geom_Vector3D_lengthSquared; +static varinfo_t flash_geom_Vector3D_x; +static methodinfo_t flash_geom_Vector3D_incrementBy; +static varinfo_t flash_geom_Vector3D_w; +static varinfo_t flash_geom_Vector3D_z; +static methodinfo_t flash_geom_Vector3D_add; +static methodinfo_t flash_geom_Vector3D_project; +static methodinfo_t flash_geom_Vector3D_crossProduct; +static methodinfo_t flash_geom_Vector3D_nearEquals; +static methodinfo_t flash_geom_Vector3D_clone; +static varinfo_t flash_geom_Vector3D_y; +static varinfo_t flash_geom_Vector3D_length; +static classinfo_t flash_desktop_ClipboardTransferMode; +static classinfo_t flash_display_SpreadMethod; +static classinfo_t flash_system_SecurityPanel; +static classinfo_t flash_events_HTTPStatusEvent; +static methodinfo_t flash_events_HTTPStatusEvent_toString; +static methodinfo_t flash_events_HTTPStatusEvent_clone; +static varinfo_t flash_events_HTTPStatusEvent_status; +static methodinfo_t flash_events_HTTPStatusEvent_toString; +static methodinfo_t flash_events_HTTPStatusEvent_clone; +static varinfo_t flash_events_HTTPStatusEvent_status; +static classinfo_t flash_net_NetStreamPlayOptions; +static varinfo_t flash_net_NetStreamPlayOptions_len; +static varinfo_t flash_net_NetStreamPlayOptions_streamName; +static varinfo_t flash_net_NetStreamPlayOptions_start; +static varinfo_t flash_net_NetStreamPlayOptions_oldStreamName; +static varinfo_t flash_net_NetStreamPlayOptions_transition; +static varinfo_t flash_net_NetStreamPlayOptions_len; +static varinfo_t flash_net_NetStreamPlayOptions_streamName; +static varinfo_t flash_net_NetStreamPlayOptions_start; +static varinfo_t flash_net_NetStreamPlayOptions_oldStreamName; +static varinfo_t flash_net_NetStreamPlayOptions_transition; +static classinfo_t flash_net_Responder; +static classinfo_t flash_net_XMLSocket; +static methodinfo_t flash_net_XMLSocket_close; +static methodinfo_t flash_net_XMLSocket_connect; +static methodinfo_t flash_net_XMLSocket_send; +static varinfo_t flash_net_XMLSocket_connected; +static varinfo_t flash_net_XMLSocket_timeout; +static methodinfo_t flash_net_XMLSocket_close; +static methodinfo_t flash_net_XMLSocket_connect; +static methodinfo_t flash_net_XMLSocket_send; +static varinfo_t flash_net_XMLSocket_connected; +static varinfo_t flash_net_XMLSocket_timeout; +static classinfo_t flash_filters_ConvolutionFilter; +static varinfo_t flash_filters_ConvolutionFilter_alpha; +static varinfo_t flash_filters_ConvolutionFilter_matrixX; +static varinfo_t flash_filters_ConvolutionFilter_matrix; +static varinfo_t flash_filters_ConvolutionFilter_bias; +static varinfo_t flash_filters_ConvolutionFilter_color; +static varinfo_t flash_filters_ConvolutionFilter_preserveAlpha; +static varinfo_t flash_filters_ConvolutionFilter_divisor; +static methodinfo_t flash_filters_ConvolutionFilter_clone; +static varinfo_t flash_filters_ConvolutionFilter_clamp; +static varinfo_t flash_filters_ConvolutionFilter_matrixY; +static varinfo_t flash_filters_ConvolutionFilter_alpha; +static varinfo_t flash_filters_ConvolutionFilter_matrixX; +static varinfo_t flash_filters_ConvolutionFilter_matrix; +static varinfo_t flash_filters_ConvolutionFilter_bias; +static varinfo_t flash_filters_ConvolutionFilter_color; +static varinfo_t flash_filters_ConvolutionFilter_preserveAlpha; +static varinfo_t flash_filters_ConvolutionFilter_divisor; +static methodinfo_t flash_filters_ConvolutionFilter_clone; +static varinfo_t flash_filters_ConvolutionFilter_clamp; +static varinfo_t flash_filters_ConvolutionFilter_matrixY; +static classinfo_t flash_text_engine_ElementFormat; +static methodinfo_t flash_text_engine_ElementFormat_getFontMetrics; +static varinfo_t flash_text_engine_ElementFormat_digitCase; +static varinfo_t flash_text_engine_ElementFormat_breakOpportunity; +static varinfo_t flash_text_engine_ElementFormat_ligatureLevel; +static varinfo_t flash_text_engine_ElementFormat_dominantBaseline; +static varinfo_t flash_text_engine_ElementFormat_alignmentBaseline; +static varinfo_t flash_text_engine_ElementFormat_color; +static varinfo_t flash_text_engine_ElementFormat_digitWidth; +static varinfo_t flash_text_engine_ElementFormat_kerning; +static varinfo_t flash_text_engine_ElementFormat_fontSize; +static varinfo_t flash_text_engine_ElementFormat_fontDescription; +static varinfo_t flash_text_engine_ElementFormat_baselineShift; +static varinfo_t flash_text_engine_ElementFormat_locale; +static varinfo_t flash_text_engine_ElementFormat_typographicCase; +static varinfo_t flash_text_engine_ElementFormat_trackingLeft; +static varinfo_t flash_text_engine_ElementFormat_locked; +static methodinfo_t flash_text_engine_ElementFormat_clone; +static varinfo_t flash_text_engine_ElementFormat_alpha; +static varinfo_t flash_text_engine_ElementFormat_textRotation; +static varinfo_t flash_text_engine_ElementFormat_trackingRight; +static methodinfo_t flash_text_engine_ElementFormat_getFontMetrics; +static varinfo_t flash_text_engine_ElementFormat_digitCase; +static varinfo_t flash_text_engine_ElementFormat_breakOpportunity; +static varinfo_t flash_text_engine_ElementFormat_ligatureLevel; +static varinfo_t flash_text_engine_ElementFormat_dominantBaseline; +static varinfo_t flash_text_engine_ElementFormat_alignmentBaseline; +static varinfo_t flash_text_engine_ElementFormat_color; +static varinfo_t flash_text_engine_ElementFormat_digitWidth; +static varinfo_t flash_text_engine_ElementFormat_kerning; +static varinfo_t flash_text_engine_ElementFormat_fontSize; +static varinfo_t flash_text_engine_ElementFormat_fontDescription; +static varinfo_t flash_text_engine_ElementFormat_baselineShift; +static varinfo_t flash_text_engine_ElementFormat_locale; +static varinfo_t flash_text_engine_ElementFormat_typographicCase; +static varinfo_t flash_text_engine_ElementFormat_trackingLeft; +static varinfo_t flash_text_engine_ElementFormat_locked; +static methodinfo_t flash_text_engine_ElementFormat_clone; +static varinfo_t flash_text_engine_ElementFormat_alpha; +static varinfo_t flash_text_engine_ElementFormat_textRotation; +static varinfo_t flash_text_engine_ElementFormat_trackingRight; +static classinfo_t flash_display_GraphicsGradientFill; +static varinfo_t flash_display_GraphicsGradientFill_interpolationMethod; +static varinfo_t flash_display_GraphicsGradientFill_focalPointRatio; +static varinfo_t flash_display_GraphicsGradientFill_colors; +static varinfo_t flash_display_GraphicsGradientFill_matrix; +static varinfo_t flash_display_GraphicsGradientFill_type; +static varinfo_t flash_display_GraphicsGradientFill_ratios; +static varinfo_t flash_display_GraphicsGradientFill_spreadMethod; +static varinfo_t flash_display_GraphicsGradientFill_alphas; +static varinfo_t flash_display_GraphicsGradientFill_interpolationMethod; +static varinfo_t flash_display_GraphicsGradientFill_focalPointRatio; +static varinfo_t flash_display_GraphicsGradientFill_colors; +static varinfo_t flash_display_GraphicsGradientFill_matrix; +static varinfo_t flash_display_GraphicsGradientFill_type; +static varinfo_t flash_display_GraphicsGradientFill_ratios; +static varinfo_t flash_display_GraphicsGradientFill_spreadMethod; +static varinfo_t flash_display_GraphicsGradientFill_alphas; +static classinfo_t flash_display_FrameLabel; +static varinfo_t flash_display_FrameLabel_frame; +static varinfo_t flash_display_FrameLabel_name; +static varinfo_t flash_display_FrameLabel_frame; +static varinfo_t flash_display_FrameLabel_name; +static classinfo_t flash_media_SoundTransform; +static varinfo_t flash_media_SoundTransform_pan; +static varinfo_t flash_media_SoundTransform_leftToRight; +static varinfo_t flash_media_SoundTransform_rightToLeft; +static varinfo_t flash_media_SoundTransform_volume; +static varinfo_t flash_media_SoundTransform_leftToLeft; +static varinfo_t flash_media_SoundTransform_rightToRight; +static varinfo_t flash_media_SoundTransform_pan; +static varinfo_t flash_media_SoundTransform_leftToRight; +static varinfo_t flash_media_SoundTransform_rightToLeft; +static varinfo_t flash_media_SoundTransform_volume; +static varinfo_t flash_media_SoundTransform_leftToLeft; +static varinfo_t flash_media_SoundTransform_rightToRight; +static varinfo_t _AS3; +static classinfo_t flash_net_LocalConnection; +static varinfo_t flash_net_LocalConnection_client; +static methodinfo_t flash_net_LocalConnection_allowDomain; +static methodinfo_t flash_net_LocalConnection_connect; +static varinfo_t flash_net_LocalConnection_domain; +static methodinfo_t flash_net_LocalConnection_allowInsecureDomain; +static methodinfo_t flash_net_LocalConnection_send; +static methodinfo_t flash_net_LocalConnection_close; +static varinfo_t flash_net_LocalConnection_client; +static methodinfo_t flash_net_LocalConnection_allowDomain; +static methodinfo_t flash_net_LocalConnection_connect; +static varinfo_t flash_net_LocalConnection_domain; +static methodinfo_t flash_net_LocalConnection_allowInsecureDomain; +static methodinfo_t flash_net_LocalConnection_send; +static methodinfo_t flash_net_LocalConnection_close; +static classinfo_t flash_display_ShaderParameterType; +static classinfo_t flash_events_IMEEvent; +static methodinfo_t flash_events_IMEEvent_toString; +static methodinfo_t flash_events_IMEEvent_clone; +static methodinfo_t flash_events_IMEEvent_toString; +static methodinfo_t flash_events_IMEEvent_clone; +static classinfo_t flash_text_TextFormatDisplay; +static methodinfo_t flash_profiler_profile; +static classinfo_t flash_display_AVM1Movie; +static methodinfo_t flash_display_AVM1Movie_call; +static methodinfo_t flash_display_AVM1Movie_addCallback; +static methodinfo_t flash_display_AVM1Movie_call; +static methodinfo_t flash_display_AVM1Movie_addCallback; +static classinfo_t flash_events_ContextMenuEvent; +static varinfo_t flash_events_ContextMenuEvent_mouseTarget; +static varinfo_t flash_events_ContextMenuEvent_isMouseTargetInaccessible; +static methodinfo_t flash_events_ContextMenuEvent_toString; +static varinfo_t flash_events_ContextMenuEvent_contextMenuOwner; +static methodinfo_t flash_events_ContextMenuEvent_clone; +static varinfo_t flash_events_ContextMenuEvent_mouseTarget; +static varinfo_t flash_events_ContextMenuEvent_isMouseTargetInaccessible; +static methodinfo_t flash_events_ContextMenuEvent_toString; +static varinfo_t flash_events_ContextMenuEvent_contextMenuOwner; +static methodinfo_t flash_events_ContextMenuEvent_clone; +static classinfo_t flash_events_EventPhase; +static classinfo_t flash_display_JointStyle; +static classinfo_t flash_utils_Dictionary; +static classinfo_t flash_display_GraphicsPathCommand; +static classinfo_t flash_filters_BevelFilter; +static varinfo_t flash_filters_BevelFilter_type; +static varinfo_t flash_filters_BevelFilter_highlightColor; +static varinfo_t flash_filters_BevelFilter_knockout; +static varinfo_t flash_filters_BevelFilter_distance; +static varinfo_t flash_filters_BevelFilter_strength; +static varinfo_t flash_filters_BevelFilter_highlightAlpha; +static varinfo_t flash_filters_BevelFilter_blurY; +static varinfo_t flash_filters_BevelFilter_shadowColor; +static varinfo_t flash_filters_BevelFilter_angle; +static varinfo_t flash_filters_BevelFilter_blurX; +static varinfo_t flash_filters_BevelFilter_shadowAlpha; +static varinfo_t flash_filters_BevelFilter_quality; +static methodinfo_t flash_filters_BevelFilter_clone; +static varinfo_t flash_filters_BevelFilter_type; +static varinfo_t flash_filters_BevelFilter_highlightColor; +static varinfo_t flash_filters_BevelFilter_knockout; +static varinfo_t flash_filters_BevelFilter_distance; +static varinfo_t flash_filters_BevelFilter_strength; +static varinfo_t flash_filters_BevelFilter_highlightAlpha; +static varinfo_t flash_filters_BevelFilter_blurY; +static varinfo_t flash_filters_BevelFilter_shadowColor; +static varinfo_t flash_filters_BevelFilter_angle; +static varinfo_t flash_filters_BevelFilter_blurX; +static varinfo_t flash_filters_BevelFilter_shadowAlpha; +static varinfo_t flash_filters_BevelFilter_quality; +static methodinfo_t flash_filters_BevelFilter_clone; +static methodinfo_t flash_utils_getTimer; +static classinfo_t flash_display_Loader; +static varinfo_t flash_display_Loader_content; +static methodinfo_t flash_display_Loader_unloadAndStop; +static methodinfo_t flash_display_Loader_unload; +static methodinfo_t flash_display_Loader_removeChildAt; +static methodinfo_t flash_display_Loader_addChildAt; +static varinfo_t flash_display_Loader_contentLoaderInfo; +static methodinfo_t flash_display_Loader_loadBytes; +static methodinfo_t flash_display_Loader_removeChild; +static methodinfo_t flash_display_Loader_load; +static methodinfo_t flash_display_Loader_addChild; +static methodinfo_t flash_display_Loader_close; +static methodinfo_t flash_display_Loader_setChildIndex; +static varinfo_t flash_display_Loader_content; +static methodinfo_t flash_display_Loader_unloadAndStop; +static methodinfo_t flash_display_Loader_unload; +static methodinfo_t flash_display_Loader_removeChildAt; +static methodinfo_t flash_display_Loader_addChildAt; +static varinfo_t flash_display_Loader_contentLoaderInfo; +static methodinfo_t flash_display_Loader_loadBytes; +static methodinfo_t flash_display_Loader_removeChild; +static methodinfo_t flash_display_Loader_load; +static methodinfo_t flash_display_Loader_addChild; +static methodinfo_t flash_display_Loader_close; +static methodinfo_t flash_display_Loader_setChildIndex; +static classinfo_t flash_display_GraphicsBitmapFill; +static varinfo_t flash_display_GraphicsBitmapFill_smooth; +static varinfo_t flash_display_GraphicsBitmapFill_repeat; +static varinfo_t flash_display_GraphicsBitmapFill_bitmapData; +static varinfo_t flash_display_GraphicsBitmapFill_matrix; +static varinfo_t flash_display_GraphicsBitmapFill_smooth; +static varinfo_t flash_display_GraphicsBitmapFill_repeat; +static varinfo_t flash_display_GraphicsBitmapFill_bitmapData; +static varinfo_t flash_display_GraphicsBitmapFill_matrix; +static varinfo_t _undefined; +static classinfo_t flash_display_SimpleButton; +static varinfo_t flash_display_SimpleButton_overState; +static varinfo_t flash_display_SimpleButton_downState; +static varinfo_t flash_display_SimpleButton_enabled; +static varinfo_t flash_display_SimpleButton_trackAsMenu; +static varinfo_t flash_display_SimpleButton_soundTransform; +static varinfo_t flash_display_SimpleButton_useHandCursor; +static varinfo_t flash_display_SimpleButton_upState; +static varinfo_t flash_display_SimpleButton_hitTestState; +static varinfo_t flash_display_SimpleButton_overState; +static varinfo_t flash_display_SimpleButton_downState; +static varinfo_t flash_display_SimpleButton_enabled; +static varinfo_t flash_display_SimpleButton_trackAsMenu; +static varinfo_t flash_display_SimpleButton_soundTransform; +static varinfo_t flash_display_SimpleButton_useHandCursor; +static varinfo_t flash_display_SimpleButton_upState; +static varinfo_t flash_display_SimpleButton_hitTestState; +static classinfo_t flash_text_engine_TabAlignment; +static classinfo_t flash_text_engine_FontWeight; +static methodinfo_t flash_utils_describeType; +static classinfo_t flash_display_PixelSnapping; +static classinfo_t flash_events_FocusEvent; +static varinfo_t flash_events_FocusEvent_keyCode; +static methodinfo_t flash_events_FocusEvent_toString; +static varinfo_t flash_events_FocusEvent_isRelatedObjectInaccessible; +static methodinfo_t flash_events_FocusEvent_clone; +static varinfo_t flash_events_FocusEvent_shiftKey; +static varinfo_t flash_events_FocusEvent_relatedObject; +static varinfo_t flash_events_FocusEvent_keyCode; +static methodinfo_t flash_events_FocusEvent_toString; +static varinfo_t flash_events_FocusEvent_isRelatedObjectInaccessible; +static methodinfo_t flash_events_FocusEvent_clone; +static varinfo_t flash_events_FocusEvent_shiftKey; +static varinfo_t flash_events_FocusEvent_relatedObject; +static classinfo_t flash_errors_MemoryError; +static classinfo_t flash_events_NetFilterEvent; +static varinfo_t flash_events_NetFilterEvent_header; +static methodinfo_t flash_events_NetFilterEvent_toString; +static methodinfo_t flash_events_NetFilterEvent_clone; +static varinfo_t flash_events_NetFilterEvent_data; +static varinfo_t flash_events_NetFilterEvent_header; +static methodinfo_t flash_events_NetFilterEvent_toString; +static methodinfo_t flash_events_NetFilterEvent_clone; +static varinfo_t flash_events_NetFilterEvent_data; +static methodinfo_t _decodeURI; +static methodinfo_t _encodeURI; +static classinfo_t flash_text_engine_TextBaseline; +static classinfo_t flash_external_ExternalInterface; +static classinfo_t _EvalError; +static classinfo_t flash_text_engine_DigitCase; +static classinfo_t flash_text_TextFormatAlign; +static classinfo_t flash_errors_ScriptTimeoutError; +static classinfo_t _uint; +static methodinfo_t _uint_valueOf; +static methodinfo_t _uint_toString; +static methodinfo_t _uint_toExponential; +static methodinfo_t _uint_toFixed; +static methodinfo_t _uint_toPrecision; +static methodinfo_t _uint_valueOf; +static methodinfo_t _uint_toString; +static methodinfo_t _uint_toExponential; +static methodinfo_t _uint_toFixed; +static methodinfo_t _uint_toPrecision; +static methodinfo_t flash_debugger_enterDebugger; +static classinfo_t flash_geom_Orientation3D; +static classinfo_t flash_text_engine_CFFHinting; +static classinfo_t flash_text_FontType; +static classinfo_t flash_filters_ShaderFilter; +static varinfo_t flash_filters_ShaderFilter_bottomExtension; +static varinfo_t flash_filters_ShaderFilter_shader; +static varinfo_t flash_filters_ShaderFilter_rightExtension; +static varinfo_t flash_filters_ShaderFilter_leftExtension; +static varinfo_t flash_filters_ShaderFilter_topExtension; +static varinfo_t flash_filters_ShaderFilter_bottomExtension; +static varinfo_t flash_filters_ShaderFilter_shader; +static varinfo_t flash_filters_ShaderFilter_rightExtension; +static varinfo_t flash_filters_ShaderFilter_leftExtension; +static varinfo_t flash_filters_ShaderFilter_topExtension; +static classinfo_t flash_display_GraphicsPath; +static methodinfo_t flash_display_GraphicsPath_wideMoveTo; +static varinfo_t flash_display_GraphicsPath_winding; +static methodinfo_t flash_display_GraphicsPath_moveTo; +static methodinfo_t flash_display_GraphicsPath_wideLineTo; +static varinfo_t flash_display_GraphicsPath_commands; +static methodinfo_t flash_display_GraphicsPath_curveTo; +static methodinfo_t flash_display_GraphicsPath_lineTo; +static varinfo_t flash_display_GraphicsPath_data; +static methodinfo_t flash_display_GraphicsPath_wideMoveTo; +static varinfo_t flash_display_GraphicsPath_winding; +static methodinfo_t flash_display_GraphicsPath_moveTo; +static methodinfo_t flash_display_GraphicsPath_wideLineTo; +static varinfo_t flash_display_GraphicsPath_commands; +static methodinfo_t flash_display_GraphicsPath_curveTo; +static methodinfo_t flash_display_GraphicsPath_lineTo; +static varinfo_t flash_display_GraphicsPath_data; +static classinfo_t flash_system_ApplicationDomain; +static methodinfo_t flash_system_ApplicationDomain_hasDefinition; +static methodinfo_t flash_system_ApplicationDomain_getDefinition; +static varinfo_t flash_system_ApplicationDomain_parentDomain; +static varinfo_t flash_system_ApplicationDomain_domainMemory; +static methodinfo_t flash_system_ApplicationDomain_hasDefinition; +static methodinfo_t flash_system_ApplicationDomain_getDefinition; +static varinfo_t flash_system_ApplicationDomain_parentDomain; +static varinfo_t flash_system_ApplicationDomain_domainMemory; +static classinfo_t flash_events_KeyboardEvent; +static varinfo_t flash_events_KeyboardEvent_shiftKey; +static varinfo_t flash_events_KeyboardEvent_keyCode; +static varinfo_t flash_events_KeyboardEvent_keyLocation; +static methodinfo_t flash_events_KeyboardEvent_updateAfterEvent; +static methodinfo_t flash_events_KeyboardEvent_toString; +static varinfo_t flash_events_KeyboardEvent_altKey; +static varinfo_t flash_events_KeyboardEvent_ctrlKey; +static methodinfo_t flash_events_KeyboardEvent_clone; +static varinfo_t flash_events_KeyboardEvent_charCode; +static varinfo_t flash_events_KeyboardEvent_shiftKey; +static varinfo_t flash_events_KeyboardEvent_keyCode; +static varinfo_t flash_events_KeyboardEvent_keyLocation; +static methodinfo_t flash_events_KeyboardEvent_updateAfterEvent; +static methodinfo_t flash_events_KeyboardEvent_toString; +static varinfo_t flash_events_KeyboardEvent_altKey; +static varinfo_t flash_events_KeyboardEvent_ctrlKey; +static methodinfo_t flash_events_KeyboardEvent_clone; +static varinfo_t flash_events_KeyboardEvent_charCode; +static classinfo_t adobe_utils_ProductManager; +static varinfo_t adobe_utils_ProductManager_running; +static methodinfo_t adobe_utils_ProductManager_download; +static varinfo_t adobe_utils_ProductManager_installedVersion; +static varinfo_t adobe_utils_ProductManager_installed; +static methodinfo_t adobe_utils_ProductManager_launch; +static varinfo_t adobe_utils_ProductManager_running; +static methodinfo_t adobe_utils_ProductManager_download; +static varinfo_t adobe_utils_ProductManager_installedVersion; +static varinfo_t adobe_utils_ProductManager_installed; +static methodinfo_t adobe_utils_ProductManager_launch; +static classinfo_t flash_events_Event; +static varinfo_t flash_events_Event_type; +static varinfo_t flash_events_Event_cancelable; +static methodinfo_t flash_events_Event_isDefaultPrevented; +static varinfo_t flash_events_Event_target; +static varinfo_t flash_events_Event_eventPhase; +static varinfo_t flash_events_Event_currentTarget; +static methodinfo_t flash_events_Event_toString; +static methodinfo_t flash_events_Event_stopImmediatePropagation; +static varinfo_t flash_events_Event_bubbles; +static methodinfo_t flash_events_Event_stopPropagation; +static methodinfo_t flash_events_Event_clone; +static methodinfo_t flash_events_Event_preventDefault; +static methodinfo_t flash_events_Event_formatToString; +static varinfo_t flash_events_Event_type; +static varinfo_t flash_events_Event_cancelable; +static methodinfo_t flash_events_Event_isDefaultPrevented; +static varinfo_t flash_events_Event_target; +static varinfo_t flash_events_Event_eventPhase; +static varinfo_t flash_events_Event_currentTarget; +static methodinfo_t flash_events_Event_toString; +static methodinfo_t flash_events_Event_stopImmediatePropagation; +static varinfo_t flash_events_Event_bubbles; +static methodinfo_t flash_events_Event_stopPropagation; +static methodinfo_t flash_events_Event_clone; +static methodinfo_t flash_events_Event_preventDefault; +static methodinfo_t flash_events_Event_formatToString; +static classinfo_t flash_desktop_ClipboardFormats; +static classinfo_t flash_display_MovieClip; +static methodinfo_t flash_display_MovieClip_prevScene; +static methodinfo_t flash_display_MovieClip_gotoAndPlay; +static varinfo_t flash_display_MovieClip_currentLabels; +static methodinfo_t flash_display_MovieClip_nextFrame; +static varinfo_t flash_display_MovieClip_currentScene; +static varinfo_t flash_display_MovieClip_enabled; +static varinfo_t flash_display_MovieClip_currentFrameLabel; +static methodinfo_t flash_display_MovieClip_play; +static varinfo_t flash_display_MovieClip_framesLoaded; +static varinfo_t flash_display_MovieClip_scenes; +static methodinfo_t flash_display_MovieClip_addFrameScript; +static varinfo_t flash_display_MovieClip_currentLabel; +static methodinfo_t flash_display_MovieClip_prevFrame; +static methodinfo_t flash_display_MovieClip_gotoAndStop; +static varinfo_t flash_display_MovieClip_currentFrame; +static methodinfo_t flash_display_MovieClip_nextScene; +static varinfo_t flash_display_MovieClip_totalFrames; +static varinfo_t flash_display_MovieClip_trackAsMenu; +static methodinfo_t flash_display_MovieClip_stop; +static methodinfo_t flash_display_MovieClip_prevScene; +static methodinfo_t flash_display_MovieClip_gotoAndPlay; +static varinfo_t flash_display_MovieClip_currentLabels; +static methodinfo_t flash_display_MovieClip_nextFrame; +static varinfo_t flash_display_MovieClip_currentScene; +static varinfo_t flash_display_MovieClip_enabled; +static varinfo_t flash_display_MovieClip_currentFrameLabel; +static methodinfo_t flash_display_MovieClip_play; +static varinfo_t flash_display_MovieClip_framesLoaded; +static varinfo_t flash_display_MovieClip_scenes; +static methodinfo_t flash_display_MovieClip_addFrameScript; +static varinfo_t flash_display_MovieClip_currentLabel; +static methodinfo_t flash_display_MovieClip_prevFrame; +static methodinfo_t flash_display_MovieClip_gotoAndStop; +static varinfo_t flash_display_MovieClip_currentFrame; +static methodinfo_t flash_display_MovieClip_nextScene; +static varinfo_t flash_display_MovieClip_totalFrames; +static varinfo_t flash_display_MovieClip_trackAsMenu; +static methodinfo_t flash_display_MovieClip_stop; +static classinfo_t flash_display_BitmapData; +static methodinfo_t flash_display_BitmapData_getPixel32; +static methodinfo_t flash_display_BitmapData_draw; +static methodinfo_t flash_display_BitmapData_setPixels; +static methodinfo_t flash_display_BitmapData_copyPixels; +static methodinfo_t flash_display_BitmapData_histogram; +static methodinfo_t flash_display_BitmapData_scroll; +static varinfo_t flash_display_BitmapData_transparent; +static methodinfo_t flash_display_BitmapData_noise; +static methodinfo_t flash_display_BitmapData_threshold; +static methodinfo_t flash_display_BitmapData_paletteMap; +static methodinfo_t flash_display_BitmapData_perlinNoise; +static methodinfo_t flash_display_BitmapData_hitTest; +static methodinfo_t flash_display_BitmapData_getPixel; +static methodinfo_t flash_display_BitmapData_unlock; +static varinfo_t flash_display_BitmapData_height; +static methodinfo_t flash_display_BitmapData_copyChannel; +static varinfo_t flash_display_BitmapData_width; +static methodinfo_t flash_display_BitmapData_clone; +static methodinfo_t flash_display_BitmapData_colorTransform; +static methodinfo_t flash_display_BitmapData_generateFilterRect; +static methodinfo_t flash_display_BitmapData_compare; +static methodinfo_t flash_display_BitmapData_fillRect; +static methodinfo_t flash_display_BitmapData_setVector; +static methodinfo_t flash_display_BitmapData_floodFill; +static methodinfo_t flash_display_BitmapData_pixelDissolve; +static methodinfo_t flash_display_BitmapData_setPixel; +static methodinfo_t flash_display_BitmapData_setPixel32; +static methodinfo_t flash_display_BitmapData_lock; +static methodinfo_t flash_display_BitmapData_getVector; +static methodinfo_t flash_display_BitmapData_getColorBoundsRect; +static methodinfo_t flash_display_BitmapData_getPixels; +static methodinfo_t flash_display_BitmapData_merge; +static varinfo_t flash_display_BitmapData_rect; +static methodinfo_t flash_display_BitmapData_applyFilter; +static methodinfo_t flash_display_BitmapData_dispose; +static methodinfo_t flash_display_BitmapData_getPixel32; +static methodinfo_t flash_display_BitmapData_draw; +static methodinfo_t flash_display_BitmapData_setPixels; +static methodinfo_t flash_display_BitmapData_copyPixels; +static methodinfo_t flash_display_BitmapData_histogram; +static methodinfo_t flash_display_BitmapData_scroll; +static varinfo_t flash_display_BitmapData_transparent; +static methodinfo_t flash_display_BitmapData_noise; +static methodinfo_t flash_display_BitmapData_threshold; +static methodinfo_t flash_display_BitmapData_paletteMap; +static methodinfo_t flash_display_BitmapData_perlinNoise; +static methodinfo_t flash_display_BitmapData_hitTest; +static methodinfo_t flash_display_BitmapData_getPixel; +static methodinfo_t flash_display_BitmapData_unlock; +static varinfo_t flash_display_BitmapData_height; +static methodinfo_t flash_display_BitmapData_copyChannel; +static varinfo_t flash_display_BitmapData_width; +static methodinfo_t flash_display_BitmapData_clone; +static methodinfo_t flash_display_BitmapData_colorTransform; +static methodinfo_t flash_display_BitmapData_generateFilterRect; +static methodinfo_t flash_display_BitmapData_compare; +static methodinfo_t flash_display_BitmapData_fillRect; +static methodinfo_t flash_display_BitmapData_setVector; +static methodinfo_t flash_display_BitmapData_floodFill; +static methodinfo_t flash_display_BitmapData_pixelDissolve; +static methodinfo_t flash_display_BitmapData_setPixel; +static methodinfo_t flash_display_BitmapData_setPixel32; +static methodinfo_t flash_display_BitmapData_lock; +static methodinfo_t flash_display_BitmapData_getVector; +static methodinfo_t flash_display_BitmapData_getColorBoundsRect; +static methodinfo_t flash_display_BitmapData_getPixels; +static methodinfo_t flash_display_BitmapData_merge; +static varinfo_t flash_display_BitmapData_rect; +static methodinfo_t flash_display_BitmapData_applyFilter; +static methodinfo_t flash_display_BitmapData_dispose; +static classinfo_t flash_text_engine_LigatureLevel; +static varinfo_t _Infinity; +static classinfo_t flash_text_engine_FontDescription; +static varinfo_t flash_text_engine_FontDescription_renderingMode; +static varinfo_t flash_text_engine_FontDescription_cffHinting; +static varinfo_t flash_text_engine_FontDescription_fontPosture; +static varinfo_t flash_text_engine_FontDescription_fontName; +static varinfo_t flash_text_engine_FontDescription_fontLookup; +static varinfo_t flash_text_engine_FontDescription_locked; +static varinfo_t flash_text_engine_FontDescription_fontWeight; +static methodinfo_t flash_text_engine_FontDescription_clone; +static varinfo_t flash_text_engine_FontDescription_renderingMode; +static varinfo_t flash_text_engine_FontDescription_cffHinting; +static varinfo_t flash_text_engine_FontDescription_fontPosture; +static varinfo_t flash_text_engine_FontDescription_fontName; +static varinfo_t flash_text_engine_FontDescription_fontLookup; +static varinfo_t flash_text_engine_FontDescription_locked; +static varinfo_t flash_text_engine_FontDescription_fontWeight; +static methodinfo_t flash_text_engine_FontDescription_clone; +static classinfo_t flash_text_engine_TextElement; +static methodinfo_t flash_text_engine_TextElement_replaceText; +static methodinfo_t flash_text_engine_TextElement_replaceText; +static classinfo_t flash_display_SWFVersion; +static classinfo_t flash_net_URLLoader; +static methodinfo_t flash_net_URLLoader_close; +static varinfo_t flash_net_URLLoader_bytesLoaded; +static methodinfo_t flash_net_URLLoader_load; +static varinfo_t flash_net_URLLoader_bytesTotal; +static varinfo_t flash_net_URLLoader_dataFormat; +static varinfo_t flash_net_URLLoader_data; +static methodinfo_t flash_net_URLLoader_close; +static varinfo_t flash_net_URLLoader_bytesLoaded; +static methodinfo_t flash_net_URLLoader_load; +static varinfo_t flash_net_URLLoader_bytesTotal; +static varinfo_t flash_net_URLLoader_dataFormat; +static varinfo_t flash_net_URLLoader_data; +static classinfo_t flash_geom_Matrix; +static varinfo_t flash_geom_Matrix_b; +static methodinfo_t flash_geom_Matrix_deltaTransformPoint; +static methodinfo_t flash_geom_Matrix_identity; +static varinfo_t flash_geom_Matrix_ty; +static methodinfo_t flash_geom_Matrix_translate; +static methodinfo_t flash_geom_Matrix_concat; +static varinfo_t flash_geom_Matrix_c; +static varinfo_t flash_geom_Matrix_a; +static methodinfo_t flash_geom_Matrix_scale; +static varinfo_t flash_geom_Matrix_d; +static methodinfo_t flash_geom_Matrix_transformPoint; +static methodinfo_t flash_geom_Matrix_rotate; +static methodinfo_t flash_geom_Matrix_createGradientBox; +static methodinfo_t flash_geom_Matrix_toString; +static methodinfo_t flash_geom_Matrix_invert; +static methodinfo_t flash_geom_Matrix_clone; +static varinfo_t flash_geom_Matrix_tx; +static methodinfo_t flash_geom_Matrix_createBox; +static varinfo_t flash_geom_Matrix_b; +static methodinfo_t flash_geom_Matrix_deltaTransformPoint; +static methodinfo_t flash_geom_Matrix_identity; +static varinfo_t flash_geom_Matrix_ty; +static methodinfo_t flash_geom_Matrix_translate; +static methodinfo_t flash_geom_Matrix_concat; +static varinfo_t flash_geom_Matrix_c; +static varinfo_t flash_geom_Matrix_a; +static methodinfo_t flash_geom_Matrix_scale; +static varinfo_t flash_geom_Matrix_d; +static methodinfo_t flash_geom_Matrix_transformPoint; +static methodinfo_t flash_geom_Matrix_rotate; +static methodinfo_t flash_geom_Matrix_createGradientBox; +static methodinfo_t flash_geom_Matrix_toString; +static methodinfo_t flash_geom_Matrix_invert; +static methodinfo_t flash_geom_Matrix_clone; +static varinfo_t flash_geom_Matrix_tx; +static methodinfo_t flash_geom_Matrix_createBox; +static classinfo_t flash_accessibility_Accessibility; +static methodinfo_t flash_net_sendToURL; +static classinfo_t flash_filters_GlowFilter; +static varinfo_t flash_filters_GlowFilter_blurY; +static varinfo_t flash_filters_GlowFilter_strength; +static varinfo_t flash_filters_GlowFilter_inner; +static varinfo_t flash_filters_GlowFilter_color; +static methodinfo_t flash_filters_GlowFilter_clone; +static varinfo_t flash_filters_GlowFilter_quality; +static varinfo_t flash_filters_GlowFilter_knockout; +static varinfo_t flash_filters_GlowFilter_alpha; +static varinfo_t flash_filters_GlowFilter_blurX; +static varinfo_t flash_filters_GlowFilter_blurY; +static varinfo_t flash_filters_GlowFilter_strength; +static varinfo_t flash_filters_GlowFilter_inner; +static varinfo_t flash_filters_GlowFilter_color; +static methodinfo_t flash_filters_GlowFilter_clone; +static varinfo_t flash_filters_GlowFilter_quality; +static varinfo_t flash_filters_GlowFilter_knockout; +static varinfo_t flash_filters_GlowFilter_alpha; +static varinfo_t flash_filters_GlowFilter_blurX; +static classinfo_t flash_events_FullScreenEvent; +static methodinfo_t flash_events_FullScreenEvent_toString; +static methodinfo_t flash_events_FullScreenEvent_clone; +static varinfo_t flash_events_FullScreenEvent_fullScreen; +static methodinfo_t flash_events_FullScreenEvent_toString; +static methodinfo_t flash_events_FullScreenEvent_clone; +static varinfo_t flash_events_FullScreenEvent_fullScreen; +static classinfo_t flash_display_StageDisplayState; +static classinfo_t flash_text_engine_TextJustifier; +static varinfo_t flash_text_engine_TextJustifier_lineJustification; +static varinfo_t flash_text_engine_TextJustifier_locale; +static methodinfo_t flash_text_engine_TextJustifier_clone; +static varinfo_t flash_text_engine_TextJustifier_lineJustification; +static varinfo_t flash_text_engine_TextJustifier_locale; +static methodinfo_t flash_text_engine_TextJustifier_clone; +static classinfo_t flash_display_StageAlign; +static varinfo_t _NaN; +static classinfo_t _ReferenceError; +static classinfo_t flash_display_Shape; +static varinfo_t flash_display_Shape_graphics; +static varinfo_t flash_display_Shape_graphics; +static classinfo_t flash_text_TextFormat = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextFormat", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextFormat_leading = {0x01, 0x00, 0x80, 0x16, "", "leading", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_bold = {0x01, 0x00, 0x80, 0x16, "", "bold", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_underline = {0x01, 0x00, 0x80, 0x16, "", "underline", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_letterSpacing = {0x01, 0x00, 0x80, 0x16, "", "letterSpacing", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_kerning = {0x01, 0x00, 0x80, 0x16, "", "kerning", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_target = {0x01, 0x00, 0x80, 0x16, "", "target", 0, &_String, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_italic = {0x01, 0x00, 0x80, 0x16, "", "italic", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_rightMargin = {0x01, 0x00, 0x80, 0x16, "", "rightMargin", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_bullet = {0x01, 0x00, 0x80, 0x16, "", "bullet", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_indent = {0x01, 0x00, 0x80, 0x16, "", "indent", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_leftMargin = {0x01, 0x00, 0x80, 0x16, "", "leftMargin", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_display = {0x01, 0x00, 0x80, 0x16, "", "display", 0, &_String, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_align = {0x01, 0x00, 0x80, 0x16, "", "align", 0, &_String, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_tabStops = {0x01, 0x00, 0x80, 0x16, "", "tabStops", 0, &_Array, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_blockIndent = {0x01, 0x00, 0x80, 0x16, "", "blockIndent", 0, &_Object, &flash_text_TextFormat, 0}; +static varinfo_t flash_text_TextFormat_font = {0x01, 0x00, 0x80, 0x16, "", "font", 0, &_String, &flash_text_TextFormat, 0}; +static classinfo_t flash_filters_BitmapFilter = {0x03, 0x00, 0x80, 0x16, "flash.filters", "BitmapFilter", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_filters_BitmapFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_BitmapFilter, 0}; +static classinfo_t flash_filters_DropShadowFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "DropShadowFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_DropShadowFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_hideObject = {0x01, 0x00, 0x80, 0x16, "", "hideObject", 0, &_Boolean, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_inner = {0x01, 0x00, 0x80, 0x16, "", "inner", 0, &_Boolean, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_DropShadowFilter, 0}; +static varinfo_t flash_filters_DropShadowFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_DropShadowFilter, 0}; +static methodinfo_t flash_filters_DropShadowFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_DropShadowFilter, 0}; +static classinfo_t adobe_utils_CustomActions = {0x03, 0x00, 0x81, 0x16, "adobe.utils", "CustomActions", 0, &_Object, interfaces: {0}}; +static varinfo_t adobe_utils_CustomActions_actionsList = {0x01, 0x00, 0x82, 0x16, "", "actionsList", 0, &_Array, &adobe_utils_CustomActions, 0}; +static methodinfo_t adobe_utils_CustomActions_uninstallActions = {0x02, 0x00, 0x82, 0x16, "", "uninstallActions", 0, &voidclass, &adobe_utils_CustomActions, 0}; +static methodinfo_t adobe_utils_CustomActions_getActions = {0x02, 0x00, 0x82, 0x16, "", "getActions", 0, &_String, &adobe_utils_CustomActions, 0}; +static methodinfo_t adobe_utils_CustomActions_installActions = {0x02, 0x00, 0x82, 0x16, "", "installActions", 0, &voidclass, &adobe_utils_CustomActions, 0}; +static classinfo_t flash_text_engine_TextLineValidity = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLineValidity", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TextLineValidity_STATIC = {0x01, 0x00, 0x82, 0x16, "", "STATIC", 0, &_String, &flash_text_engine_TextLineValidity, 0}; +static varinfo_t flash_text_engine_TextLineValidity_VALID = {0x01, 0x00, 0x82, 0x16, "", "VALID", 0, &_String, &flash_text_engine_TextLineValidity, 0}; +static varinfo_t flash_text_engine_TextLineValidity_INVALID = {0x01, 0x00, 0x82, 0x16, "", "INVALID", 0, &_String, &flash_text_engine_TextLineValidity, 0}; +static varinfo_t flash_text_engine_TextLineValidity_POSSIBLY_INVALID = {0x01, 0x00, 0x82, 0x16, "", "POSSIBLY_INVALID", 0, &_String, &flash_text_engine_TextLineValidity, 0}; +static classinfo_t flash_display_LineScaleMode = {0x03, 0x00, 0x81, 0x16, "flash.display", "LineScaleMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_LineScaleMode_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_display_LineScaleMode, 0}; +static varinfo_t flash_display_LineScaleMode_VERTICAL = {0x01, 0x00, 0x82, 0x16, "", "VERTICAL", 0, &_String, &flash_display_LineScaleMode, 0}; +static varinfo_t flash_display_LineScaleMode_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_display_LineScaleMode, 0}; +static varinfo_t flash_display_LineScaleMode_HORIZONTAL = {0x01, 0x00, 0x82, 0x16, "", "HORIZONTAL", 0, &_String, &flash_display_LineScaleMode, 0}; +static classinfo_t flash_geom_Transform = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Transform", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_geom_Transform_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_geom_Transform, 0}; +static varinfo_t flash_geom_Transform_perspectiveProjection = {0x01, 0x00, 0x80, 0x16, "", "perspectiveProjection", 0, &flash_geom_PerspectiveProjection, &flash_geom_Transform, 0}; +static varinfo_t flash_geom_Transform_concatenatedMatrix = {0x01, 0x00, 0x80, 0x16, "", "concatenatedMatrix", 0, &flash_geom_Matrix, &flash_geom_Transform, 0}; +static varinfo_t flash_geom_Transform_colorTransform = {0x01, 0x00, 0x80, 0x16, "", "colorTransform", 0, &flash_geom_ColorTransform, &flash_geom_Transform, 0}; +static methodinfo_t flash_geom_Transform_getRelativeMatrix3D = {0x02, 0x00, 0x80, 0x16, "", "getRelativeMatrix3D", 0, &flash_geom_Matrix3D, &flash_geom_Transform, 0}; +static varinfo_t flash_geom_Transform_pixelBounds = {0x01, 0x00, 0x80, 0x16, "", "pixelBounds", 0, &flash_geom_Rectangle, &flash_geom_Transform, 0}; +static varinfo_t flash_geom_Transform_matrix3D = {0x01, 0x00, 0x80, 0x16, "", "matrix3D", 0, &flash_geom_Matrix3D, &flash_geom_Transform, 0}; +static varinfo_t flash_geom_Transform_concatenatedColorTransform = {0x01, 0x00, 0x80, 0x16, "", "concatenatedColorTransform", 0, &flash_geom_ColorTransform, &flash_geom_Transform, 0}; +static classinfo_t flash_ui_KeyLocation = {0x03, 0x00, 0x81, 0x16, "flash.ui", "KeyLocation", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_ui_KeyLocation_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_uint, &flash_ui_KeyLocation, 0}; +static varinfo_t flash_ui_KeyLocation_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_uint, &flash_ui_KeyLocation, 0}; +static varinfo_t flash_ui_KeyLocation_NUM_PAD = {0x01, 0x00, 0x82, 0x16, "", "NUM_PAD", 0, &_uint, &flash_ui_KeyLocation, 0}; +static varinfo_t flash_ui_KeyLocation_STANDARD = {0x01, 0x00, 0x82, 0x16, "", "STANDARD", 0, &_uint, &flash_ui_KeyLocation, 0}; +static classinfo_t flash_events_MouseEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "MouseEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_MouseEvent_localY = {0x01, 0x00, 0x80, 0x16, "", "localY", 0, &_Number, &flash_events_MouseEvent, 0}; +static methodinfo_t flash_events_MouseEvent_updateAfterEvent = {0x02, 0x00, 0x80, 0x16, "", "updateAfterEvent", 0, &voidclass, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_delta = {0x01, 0x00, 0x80, 0x16, "", "delta", 0, &_int, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_stageX = {0x01, 0x00, 0x80, 0x16, "", "stageX", 0, &_Number, &flash_events_MouseEvent, 0}; +static methodinfo_t flash_events_MouseEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_relatedObject = {0x01, 0x00, 0x80, 0x16, "", "relatedObject", 0, &flash_display_InteractiveObject, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_isRelatedObjectInaccessible = {0x01, 0x00, 0x80, 0x16, "", "isRelatedObjectInaccessible", 0, &_Boolean, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_shiftKey = {0x01, 0x00, 0x80, 0x16, "", "shiftKey", 0, &_Boolean, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_stageY = {0x01, 0x00, 0x80, 0x16, "", "stageY", 0, &_Number, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_altKey = {0x01, 0x00, 0x80, 0x16, "", "altKey", 0, &_Boolean, &flash_events_MouseEvent, 0}; +static methodinfo_t flash_events_MouseEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_ctrlKey = {0x01, 0x00, 0x80, 0x16, "", "ctrlKey", 0, &_Boolean, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_localX = {0x01, 0x00, 0x80, 0x16, "", "localX", 0, &_Number, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_buttonDown = {0x01, 0x00, 0x80, 0x16, "", "buttonDown", 0, &_Boolean, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_ROLL_OVER = {0x01, 0x00, 0x82, 0x16, "", "ROLL_OVER", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_ROLL_OUT = {0x01, 0x00, 0x82, 0x16, "", "ROLL_OUT", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_MOUSE_DOWN = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_DOWN", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_DOUBLE_CLICK = {0x01, 0x00, 0x82, 0x16, "", "DOUBLE_CLICK", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_MOUSE_WHEEL = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_WHEEL", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_CLICK = {0x01, 0x00, 0x82, 0x16, "", "CLICK", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_MOUSE_MOVE = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_MOVE", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_MOUSE_UP = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_UP", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_MOUSE_OVER = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_OVER", 0, &_String, &flash_events_MouseEvent, 0}; +static varinfo_t flash_events_MouseEvent_MOUSE_OUT = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_OUT", 0, &_String, &flash_events_MouseEvent, 0}; +static classinfo_t flash_text_engine_LineJustification = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "LineJustification", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_LineJustification_ALL_INCLUDING_LAST = {0x01, 0x00, 0x82, 0x16, "", "ALL_INCLUDING_LAST", 0, &_String, &flash_text_engine_LineJustification, 0}; +static varinfo_t flash_text_engine_LineJustification_UNJUSTIFIED = {0x01, 0x00, 0x82, 0x16, "", "UNJUSTIFIED", 0, &_String, &flash_text_engine_LineJustification, 0}; +static varinfo_t flash_text_engine_LineJustification_ALL_BUT_LAST = {0x01, 0x00, 0x82, 0x16, "", "ALL_BUT_LAST", 0, &_String, &flash_text_engine_LineJustification, 0}; +static classinfo_t flash_media_Camera = {0x03, 0x00, 0x81, 0x16, "flash.media", "Camera", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_media_Camera_fps = {0x01, 0x00, 0x80, 0x16, "", "fps", 0, &_Number, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_setMode = {0x02, 0x00, 0x80, 0x16, "", "setMode", 0, &voidclass, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_keyFrameInterval = {0x01, 0x00, 0x80, 0x16, "", "keyFrameInterval", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_motionTimeout = {0x01, 0x00, 0x80, 0x16, "", "motionTimeout", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_setCursor = {0x02, 0x00, 0x80, 0x16, "", "setCursor", 0, &voidclass, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_setLoopback = {0x02, 0x00, 0x80, 0x16, "", "setLoopback", 0, &voidclass, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_currentFPS = {0x01, 0x00, 0x80, 0x16, "", "currentFPS", 0, &_Number, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_setKeyFrameInterval = {0x02, 0x00, 0x80, 0x16, "", "setKeyFrameInterval", 0, &voidclass, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_motionLevel = {0x01, 0x00, 0x80, 0x16, "", "motionLevel", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_bandwidth = {0x01, 0x00, 0x80, 0x16, "", "bandwidth", 0, &_int, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_muted = {0x01, 0x00, 0x80, 0x16, "", "muted", 0, &_Boolean, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_activityLevel = {0x01, 0x00, 0x80, 0x16, "", "activityLevel", 0, &_Number, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_loopback = {0x01, 0x00, 0x80, 0x16, "", "loopback", 0, &_Boolean, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_setQuality = {0x02, 0x00, 0x80, 0x16, "", "setQuality", 0, &voidclass, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_setMotionLevel = {0x02, 0x00, 0x80, 0x16, "", "setMotionLevel", 0, &voidclass, &flash_media_Camera, 0}; +static methodinfo_t flash_media_Camera_getCamera = {0x02, 0x00, 0x82, 0x16, "", "getCamera", 0, &flash_media_Camera, &flash_media_Camera, 0}; +static varinfo_t flash_media_Camera_names = {0x01, 0x00, 0x82, 0x16, "", "names", 0, &_Array, &flash_media_Camera, 0}; +static methodinfo_t flash_net_registerClassAlias = {0x02, 0x00, 0x82, 0x16, "flash.net", "registerClassAlias", 0, &voidclass, 0, 0}; +static classinfo_t flash_accessibility_AccessibilityImplementation = {0x03, 0x00, 0x80, 0x16, "flash.accessibility", "AccessibilityImplementation", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accState = {0x02, 0x00, 0x80, 0x16, "", "get_accState", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accName = {0x02, 0x00, 0x80, 0x16, "", "get_accName", 0, &_String, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accSelection = {0x02, 0x00, 0x80, 0x16, "", "get_accSelection", 0, &_Array, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accDoDefaultAction = {0x02, 0x00, 0x80, 0x16, "", "accDoDefaultAction", 0, &voidclass, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accFocus = {0x02, 0x00, 0x80, 0x16, "", "get_accFocus", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accDefaultAction = {0x02, 0x00, 0x80, 0x16, "", "get_accDefaultAction", 0, &_String, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accSelect = {0x02, 0x00, 0x80, 0x16, "", "accSelect", 0, &voidclass, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accValue = {0x02, 0x00, 0x80, 0x16, "", "get_accValue", 0, &_String, &flash_accessibility_AccessibilityImplementation, 0}; +static varinfo_t flash_accessibility_AccessibilityImplementation_stub = {0x01, 0x00, 0x80, 0x16, "", "stub", 0, &_Boolean, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accRole = {0x02, 0x00, 0x80, 0x16, "", "get_accRole", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; +static varinfo_t flash_accessibility_AccessibilityImplementation_errno = {0x01, 0x00, 0x80, 0x16, "", "errno", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_isLabeledBy = {0x02, 0x00, 0x80, 0x16, "", "isLabeledBy", 0, &_Boolean, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_accLocation = {0x02, 0x00, 0x80, 0x16, "", "accLocation", 0, 0, &flash_accessibility_AccessibilityImplementation, 0}; +static methodinfo_t flash_accessibility_AccessibilityImplementation_getChildIDArray = {0x02, 0x00, 0x80, 0x16, "", "getChildIDArray", 0, &_Array, &flash_accessibility_AccessibilityImplementation, 0}; +static classinfo_t flash_utils_ByteArray = {0x03, 0x00, 0x80, 0x16, "flash.utils", "ByteArray", 0, &_Object, interfaces: {&flash_utils_IDataInput, &flash_utils_IDataOutput, 0}}; +static methodinfo_t flash_utils_ByteArray_writeBoolean = {0x02, 0x00, 0x80, 0x16, "", "writeBoolean", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readDouble = {0x02, 0x00, 0x80, 0x16, "", "readDouble", 0, &_Number, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeByte = {0x02, 0x00, 0x80, 0x16, "", "writeByte", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeObject = {0x02, 0x00, 0x80, 0x16, "", "writeObject", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "readUTFBytes", 0, &_String, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeMultiByte = {0x02, 0x00, 0x80, 0x16, "", "writeMultiByte", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_uncompress = {0x02, 0x00, 0x80, 0x16, "", "uncompress", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readUnsignedByte = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedByte", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeInt = {0x02, 0x00, 0x80, 0x16, "", "writeInt", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_deflate = {0x02, 0x00, 0x80, 0x16, "", "deflate", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readMultiByte = {0x02, 0x00, 0x80, 0x16, "", "readMultiByte", 0, &_String, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readBytes = {0x02, 0x00, 0x80, 0x16, "", "readBytes", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeShort = {0x02, 0x00, 0x80, 0x16, "", "writeShort", 0, &voidclass, &flash_utils_ByteArray, 0}; +static varinfo_t flash_utils_ByteArray_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readShort = {0x02, 0x00, 0x80, 0x16, "", "readShort", 0, &_int, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeUTF = {0x02, 0x00, 0x80, 0x16, "", "writeUTF", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeBytes = {0x02, 0x00, 0x80, 0x16, "", "writeBytes", 0, &voidclass, &flash_utils_ByteArray, 0}; +static varinfo_t flash_utils_ByteArray_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readObject = {0x02, 0x00, 0x80, 0x16, "", "readObject", 0, 0, &flash_utils_ByteArray, 0}; +static varinfo_t flash_utils_ByteArray_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "writeUnsignedInt", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeDouble = {0x02, 0x00, 0x80, 0x16, "", "writeDouble", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeFloat = {0x02, 0x00, 0x80, 0x16, "", "writeFloat", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readInt = {0x02, 0x00, 0x80, 0x16, "", "readInt", 0, &_int, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readByte = {0x02, 0x00, 0x80, 0x16, "", "readByte", 0, &_int, &flash_utils_ByteArray, 0}; +static varinfo_t flash_utils_ByteArray_bytesAvailable = {0x01, 0x00, 0x80, 0x16, "", "bytesAvailable", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_utils_ByteArray, 0}; +static varinfo_t flash_utils_ByteArray_endian = {0x01, 0x00, 0x80, 0x16, "", "endian", 0, &_String, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readUnsignedShort = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedShort", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedInt", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readFloat = {0x02, 0x00, 0x80, 0x16, "", "readFloat", 0, &_Number, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_compress = {0x02, 0x00, 0x80, 0x16, "", "compress", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_writeUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "writeUTFBytes", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readBoolean = {0x02, 0x00, 0x80, 0x16, "", "readBoolean", 0, &_Boolean, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_inflate = {0x02, 0x00, 0x80, 0x16, "", "inflate", 0, &voidclass, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_utils_ByteArray_readUTF = {0x02, 0x00, 0x80, 0x16, "", "readUTF", 0, &_String, &flash_utils_ByteArray, 0}; +static varinfo_t flash_utils_ByteArray_defaultObjectEncoding = {0x01, 0x00, 0x82, 0x16, "", "defaultObjectEncoding", 0, &_uint, &flash_utils_ByteArray, 0}; +static methodinfo_t flash_sampler_stopSampling = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "stopSampling", 0, &voidclass, 0, 0}; +static classinfo_t flash_events_SyncEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "SyncEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_SyncEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_SyncEvent, 0}; +static methodinfo_t flash_events_SyncEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_SyncEvent, 0}; +static varinfo_t flash_events_SyncEvent_changeList = {0x01, 0x00, 0x80, 0x16, "", "changeList", 0, &_Array, &flash_events_SyncEvent, 0}; +static varinfo_t flash_events_SyncEvent_SYNC = {0x01, 0x00, 0x82, 0x16, "", "SYNC", 0, &_String, &flash_events_SyncEvent, 0}; +static methodinfo_t _encodeURIComponent = {0x02, 0x00, 0x82, 0x16, "", "encodeURIComponent", 0, &_String, 0, 0}; +static classinfo_t flash_net_Socket = {0x03, 0x00, 0x80, 0x16, "flash.net", "Socket", 0, &flash_events_EventDispatcher, interfaces: {&flash_utils_IDataInput, &flash_utils_IDataOutput, 0}}; +static methodinfo_t flash_net_Socket_writeBoolean = {0x02, 0x00, 0x80, 0x16, "", "writeBoolean", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readDouble = {0x02, 0x00, 0x80, 0x16, "", "readDouble", 0, &_Number, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeByte = {0x02, 0x00, 0x80, 0x16, "", "writeByte", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeObject = {0x02, 0x00, 0x80, 0x16, "", "writeObject", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "readUTFBytes", 0, &_String, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeMultiByte = {0x02, 0x00, 0x80, 0x16, "", "writeMultiByte", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readUnsignedByte = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedByte", 0, &_uint, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeInt = {0x02, 0x00, 0x80, 0x16, "", "writeInt", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readMultiByte = {0x02, 0x00, 0x80, 0x16, "", "readMultiByte", 0, &_String, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readBytes = {0x02, 0x00, 0x80, 0x16, "", "readBytes", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeShort = {0x02, 0x00, 0x80, 0x16, "", "writeShort", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readShort = {0x02, 0x00, 0x80, 0x16, "", "readShort", 0, &_int, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeUTF = {0x02, 0x00, 0x80, 0x16, "", "writeUTF", 0, &voidclass, &flash_net_Socket, 0}; +static varinfo_t flash_net_Socket_timeout = {0x01, 0x00, 0x80, 0x16, "", "timeout", 0, &_uint, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeBytes = {0x02, 0x00, 0x80, 0x16, "", "writeBytes", 0, &voidclass, &flash_net_Socket, 0}; +static varinfo_t flash_net_Socket_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readObject = {0x02, 0x00, 0x80, 0x16, "", "readObject", 0, 0, &flash_net_Socket, 0}; +static varinfo_t flash_net_Socket_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_flush = {0x02, 0x00, 0x80, 0x16, "", "flush", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "writeUnsignedInt", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeDouble = {0x02, 0x00, 0x80, 0x16, "", "writeDouble", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeFloat = {0x02, 0x00, 0x80, 0x16, "", "writeFloat", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readInt = {0x02, 0x00, 0x80, 0x16, "", "readInt", 0, &_int, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readByte = {0x02, 0x00, 0x80, 0x16, "", "readByte", 0, &_int, &flash_net_Socket, 0}; +static varinfo_t flash_net_Socket_bytesAvailable = {0x01, 0x00, 0x80, 0x16, "", "bytesAvailable", 0, &_uint, &flash_net_Socket, 0}; +static varinfo_t flash_net_Socket_endian = {0x01, 0x00, 0x80, 0x16, "", "endian", 0, &_String, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readUnsignedShort = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedShort", 0, &_uint, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedInt", 0, &_uint, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readFloat = {0x02, 0x00, 0x80, 0x16, "", "readFloat", 0, &_Number, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_writeUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "writeUTFBytes", 0, &voidclass, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readBoolean = {0x02, 0x00, 0x80, 0x16, "", "readBoolean", 0, &_Boolean, &flash_net_Socket, 0}; +static methodinfo_t flash_net_Socket_readUTF = {0x02, 0x00, 0x80, 0x16, "", "readUTF", 0, &_String, &flash_net_Socket, 0}; +static methodinfo_t _unescape = {0x02, 0x00, 0x82, 0x16, "", "unescape", 0, &_String, 0, 0}; +static classinfo_t flash_utils_Timer = {0x03, 0x00, 0x80, 0x16, "flash.utils", "Timer", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_utils_Timer_reset = {0x02, 0x00, 0x80, 0x16, "", "reset", 0, &voidclass, &flash_utils_Timer, 0}; +static varinfo_t flash_utils_Timer_running = {0x01, 0x00, 0x80, 0x16, "", "running", 0, &_Boolean, &flash_utils_Timer, 0}; +static varinfo_t flash_utils_Timer_repeatCount = {0x01, 0x00, 0x80, 0x16, "", "repeatCount", 0, &_int, &flash_utils_Timer, 0}; +static methodinfo_t flash_utils_Timer_stop = {0x02, 0x00, 0x80, 0x16, "", "stop", 0, &voidclass, &flash_utils_Timer, 0}; +static methodinfo_t flash_utils_Timer_start = {0x02, 0x00, 0x80, 0x16, "", "start", 0, &voidclass, &flash_utils_Timer, 0}; +static varinfo_t flash_utils_Timer_currentCount = {0x01, 0x00, 0x80, 0x16, "", "currentCount", 0, &_int, &flash_utils_Timer, 0}; +static varinfo_t flash_utils_Timer_delay = {0x01, 0x00, 0x80, 0x16, "", "delay", 0, &_Number, &flash_utils_Timer, 0}; +static classinfo_t _Array = {0x03, 0x00, 0x88, 0x16, "", "Array", 0, &_Object, interfaces: {0}}; +static methodinfo_t _Array_forEach = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "forEach", 0, &voidclass, &_Array, 0}; +static methodinfo_t _Array_sortOn = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "sortOn", 0, 0, &_Array, 0}; +static methodinfo_t _Array_indexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "indexOf", 0, &_int, &_Array, 0}; +static methodinfo_t _Array_splice = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "splice", 0, 0, &_Array, 0}; +static methodinfo_t _Array_lastIndexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "lastIndexOf", 0, &_int, &_Array, 0}; +static methodinfo_t _Array_map = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "map", 0, &_Array, &_Array, 0}; +static methodinfo_t _Array_concat = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "concat", 0, &_Array, &_Array, 0}; +static methodinfo_t _Array_shift = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "shift", 0, 0, &_Array, 0}; +static methodinfo_t _Array_unshift = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "unshift", 0, &_uint, &_Array, 0}; +static methodinfo_t _Array_some = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "some", 0, &_Boolean, &_Array, 0}; +static methodinfo_t _Array_filter = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "filter", 0, &_Array, &_Array, 0}; +static methodinfo_t _Array_join = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "join", 0, &_String, &_Array, 0}; +static methodinfo_t _Array_slice = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "slice", 0, &_Array, &_Array, 0}; +static methodinfo_t _Array_every = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "every", 0, &_Boolean, &_Array, 0}; +static methodinfo_t _Array_pop = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "pop", 0, 0, &_Array, 0}; +static methodinfo_t _Array_sort = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "sort", 0, 0, &_Array, 0}; +static methodinfo_t _Array_reverse = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "reverse", 0, &_Array, &_Array, 0}; +static methodinfo_t _Array_push = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "push", 0, &_uint, &_Array, 0}; +static varinfo_t _Array_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_uint, &_Array, 0}; +static varinfo_t _Array_DESCENDING = {0x01, 0x00, 0x82, 0x16, "", "DESCENDING", 0, &_uint, &_Array, 0}; +static varinfo_t _Array_UNIQUESORT = {0x01, 0x00, 0x82, 0x16, "", "UNIQUESORT", 0, &_uint, &_Array, 0}; +static varinfo_t _Array_RETURNINDEXEDARRAY = {0x01, 0x00, 0x82, 0x16, "", "RETURNINDEXEDARRAY", 0, &_uint, &_Array, 0}; +static varinfo_t _Array_CASEINSENSITIVE = {0x01, 0x00, 0x82, 0x16, "", "CASEINSENSITIVE", 0, &_uint, &_Array, 0}; +static varinfo_t _Array_NUMERIC = {0x01, 0x00, 0x82, 0x16, "", "NUMERIC", 0, &_uint, &_Array, 0}; +static classinfo_t flash_geom_ColorTransform = {0x03, 0x00, 0x80, 0x16, "flash.geom", "ColorTransform", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_geom_ColorTransform_blueOffset = {0x01, 0x00, 0x80, 0x16, "", "blueOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_greenOffset = {0x01, 0x00, 0x80, 0x16, "", "greenOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_greenMultiplier = {0x01, 0x00, 0x80, 0x16, "", "greenMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_redMultiplier = {0x01, 0x00, 0x80, 0x16, "", "redMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_geom_ColorTransform, 0}; +static methodinfo_t flash_geom_ColorTransform_concat = {0x02, 0x00, 0x80, 0x16, "", "concat", 0, &voidclass, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_alphaOffset = {0x01, 0x00, 0x80, 0x16, "", "alphaOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_blueMultiplier = {0x01, 0x00, 0x80, 0x16, "", "blueMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; +static methodinfo_t flash_geom_ColorTransform_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_alphaMultiplier = {0x01, 0x00, 0x80, 0x16, "", "alphaMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; +static varinfo_t flash_geom_ColorTransform_redOffset = {0x01, 0x00, 0x80, 0x16, "", "redOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; +static classinfo_t flash_text_GridFitType = {0x03, 0x00, 0x81, 0x16, "flash.text", "GridFitType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_GridFitType_SUBPIXEL = {0x01, 0x00, 0x82, 0x16, "", "SUBPIXEL", 0, &_String, &flash_text_GridFitType, 0}; +static varinfo_t flash_text_GridFitType_PIXEL = {0x01, 0x00, 0x82, 0x16, "", "PIXEL", 0, &_String, &flash_text_GridFitType, 0}; +static varinfo_t flash_text_GridFitType_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_GridFitType, 0}; +static classinfo_t flash_filters_DisplacementMapFilterMode = {0x03, 0x00, 0x81, 0x16, "flash.filters", "DisplacementMapFilterMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_filters_DisplacementMapFilterMode_COLOR = {0x01, 0x00, 0x82, 0x16, "", "COLOR", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; +static varinfo_t flash_filters_DisplacementMapFilterMode_WRAP = {0x01, 0x00, 0x82, 0x16, "", "WRAP", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; +static varinfo_t flash_filters_DisplacementMapFilterMode_CLAMP = {0x01, 0x00, 0x82, 0x16, "", "CLAMP", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; +static varinfo_t flash_filters_DisplacementMapFilterMode_IGNORE = {0x01, 0x00, 0x82, 0x16, "", "IGNORE", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; +static classinfo_t flash_text_TextFieldType = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFieldType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextFieldType_DYNAMIC = {0x01, 0x00, 0x82, 0x16, "", "DYNAMIC", 0, &_String, &flash_text_TextFieldType, 0}; +static varinfo_t flash_text_TextFieldType_INPUT = {0x01, 0x00, 0x82, 0x16, "", "INPUT", 0, &_String, &flash_text_TextFieldType, 0}; +static classinfo_t flash_display_IGraphicsStroke = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsStroke", 0, 0, interfaces: {0}}; +static classinfo_t flash_media_SoundLoaderContext = {0x03, 0x00, 0x80, 0x16, "flash.media", "SoundLoaderContext", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_media_SoundLoaderContext_checkPolicyFile = {0x01, 0x00, 0x80, 0x16, "", "checkPolicyFile", 0, &_Boolean, &flash_media_SoundLoaderContext, 0}; +static varinfo_t flash_media_SoundLoaderContext_bufferTime = {0x01, 0x00, 0x80, 0x16, "", "bufferTime", 0, &_Number, &flash_media_SoundLoaderContext, 0}; +static classinfo_t flash_net_IDynamicPropertyOutput = {0x03, 0x00, 0x90, 0x16, "flash.net", "IDynamicPropertyOutput", 0, 0, interfaces: {0}}; +static methodinfo_t flash_net_IDynamicPropertyOutput_writeDynamicProperty = {0x02, 0x00, 0x80, 0x08, "flash.net:IDynamicPropertyOutput", "writeDynamicProperty", 0, &voidclass, &flash_net_IDynamicPropertyOutput, 0}; +static classinfo_t flash_display_IGraphicsData = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsData", 0, 0, interfaces: {0}}; +static methodinfo_t flash_utils_getDefinitionByName = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getDefinitionByName", 0, &_Object, 0, 0}; +static classinfo_t _Function = {0x03, 0x00, 0x88, 0x16, "", "Function", 0, &_Object, interfaces: {0}}; +static varinfo_t _Function_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_int, &_Function, 0}; +static methodinfo_t _Function_apply = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "apply", 0, 0, &_Function, 0}; +static methodinfo_t _Function_call = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "call", 0, 0, &_Function, 0}; +static varinfo_t _Function_prototype = {0x01, 0x00, 0x80, 0x16, "", "prototype", 0, 0, &_Function, 0}; +static classinfo_t flash_geom_PerspectiveProjection = {0x03, 0x00, 0x80, 0x16, "flash.geom", "PerspectiveProjection", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_geom_PerspectiveProjection_fieldOfView = {0x01, 0x00, 0x80, 0x16, "", "fieldOfView", 0, &_Number, &flash_geom_PerspectiveProjection, 0}; +static varinfo_t flash_geom_PerspectiveProjection_projectionCenter = {0x01, 0x00, 0x80, 0x16, "", "projectionCenter", 0, &flash_geom_Point, &flash_geom_PerspectiveProjection, 0}; +static methodinfo_t flash_geom_PerspectiveProjection_toMatrix3D = {0x02, 0x00, 0x80, 0x16, "", "toMatrix3D", 0, &flash_geom_Matrix3D, &flash_geom_PerspectiveProjection, 0}; +static varinfo_t flash_geom_PerspectiveProjection_focalLength = {0x01, 0x00, 0x80, 0x16, "", "focalLength", 0, &_Number, &flash_geom_PerspectiveProjection, 0}; +static classinfo_t flash_text_engine_BreakOpportunity = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "BreakOpportunity", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_BreakOpportunity_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; +static varinfo_t flash_text_engine_BreakOpportunity_ANY = {0x01, 0x00, 0x82, 0x16, "", "ANY", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; +static varinfo_t flash_text_engine_BreakOpportunity_ALL = {0x01, 0x00, 0x82, 0x16, "", "ALL", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; +static varinfo_t flash_text_engine_BreakOpportunity_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; +static methodinfo_t flash_sampler__getInvocationCount = {0x02, 0x00, 0x82, 0x17, "flash.sampler", "_getInvocationCount", 0, &_Number, 0, 0}; +static methodinfo_t _parseFloat = {0x02, 0x00, 0x82, 0x16, "", "parseFloat", 0, &_Number, 0, 0}; +static classinfo_t flash_events_NetStatusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "NetStatusEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_NetStatusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_NetStatusEvent, 0}; +static varinfo_t flash_events_NetStatusEvent_info = {0x01, 0x00, 0x80, 0x16, "", "info", 0, &_Object, &flash_events_NetStatusEvent, 0}; +static methodinfo_t flash_events_NetStatusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_NetStatusEvent, 0}; +static varinfo_t flash_events_NetStatusEvent_NET_STATUS = {0x01, 0x00, 0x82, 0x16, "", "NET_STATUS", 0, &_String, &flash_events_NetStatusEvent, 0}; +static classinfo_t flash_display_ShaderJob = {0x03, 0x00, 0x80, 0x16, "flash.display", "ShaderJob", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_display_ShaderJob_cancel = {0x02, 0x00, 0x80, 0x16, "", "cancel", 0, &voidclass, &flash_display_ShaderJob, 0}; +static varinfo_t flash_display_ShaderJob_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_ShaderJob, 0}; +static methodinfo_t flash_display_ShaderJob_start = {0x02, 0x00, 0x80, 0x16, "", "start", 0, &voidclass, &flash_display_ShaderJob, 0}; +static varinfo_t flash_display_ShaderJob_shader = {0x01, 0x00, 0x80, 0x16, "", "shader", 0, &flash_display_Shader, &flash_display_ShaderJob, 0}; +static varinfo_t flash_display_ShaderJob_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_ShaderJob, 0}; +static varinfo_t flash_display_ShaderJob_target = {0x01, 0x00, 0x80, 0x16, "", "target", 0, &_Object, &flash_display_ShaderJob, 0}; +static varinfo_t flash_display_ShaderJob_progress = {0x01, 0x00, 0x80, 0x16, "", "progress", 0, &_Number, &flash_display_ShaderJob, 0}; +static classinfo_t _VerifyError = {0x03, 0x00, 0x88, 0x16, "", "VerifyError", 0, &_Error, interfaces: {0}}; +static varinfo_t _VerifyError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_VerifyError, 0}; +static classinfo_t flash_events_AsyncErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "AsyncErrorEvent", 0, &flash_events_ErrorEvent, interfaces: {0}}; +static methodinfo_t flash_events_AsyncErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_AsyncErrorEvent, 0}; +static varinfo_t flash_events_AsyncErrorEvent_error = {0x01, 0x00, 0x80, 0x16, "", "error", 0, &_Error, &flash_events_AsyncErrorEvent, 0}; +static methodinfo_t flash_events_AsyncErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_AsyncErrorEvent, 0}; +static varinfo_t flash_events_AsyncErrorEvent_ASYNC_ERROR = {0x01, 0x00, 0x82, 0x16, "", "ASYNC_ERROR", 0, &_String, &flash_events_AsyncErrorEvent, 0}; +static classinfo_t flash_net_SharedObject = {0x03, 0x00, 0x80, 0x16, "flash.net", "SharedObject", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_SharedObject_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_SharedObject, 0}; +static varinfo_t flash_net_SharedObject_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_setProperty = {0x02, 0x00, 0x80, 0x16, "", "setProperty", 0, &voidclass, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_flush = {0x02, 0x00, 0x80, 0x16, "", "flush", 0, &_String, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_SharedObject, 0}; +static varinfo_t flash_net_SharedObject_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_uint, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_setDirty = {0x02, 0x00, 0x80, 0x16, "", "setDirty", 0, &voidclass, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_SharedObject, 0}; +static varinfo_t flash_net_SharedObject_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &_Object, &flash_net_SharedObject, 0}; +static varinfo_t flash_net_SharedObject_defaultObjectEncoding = {0x01, 0x00, 0x82, 0x16, "", "defaultObjectEncoding", 0, &_uint, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_getDiskUsage = {0x02, 0x00, 0x82, 0x16, "", "getDiskUsage", 0, &_int, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_getRemote = {0x02, 0x00, 0x82, 0x16, "", "getRemote", 0, &flash_net_SharedObject, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_deleteAll = {0x02, 0x00, 0x82, 0x16, "", "deleteAll", 0, &_int, &flash_net_SharedObject, 0}; +static methodinfo_t flash_net_SharedObject_getLocal = {0x02, 0x00, 0x82, 0x16, "", "getLocal", 0, &flash_net_SharedObject, &flash_net_SharedObject, 0}; +static classinfo_t _Namespace = {0x03, 0x00, 0x81, 0x16, "", "Namespace", 0, &_Object, interfaces: {0}}; +static methodinfo_t _Namespace_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_String, &_Namespace, 0}; +static methodinfo_t _Namespace_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Namespace, 0}; +static varinfo_t _Namespace_uri = {0x01, 0x00, 0x80, 0x16, "", "uri", 0, &_String, &_Namespace, 0}; +static varinfo_t _Namespace_prefix = {0x01, 0x00, 0x80, 0x16, "", "prefix", 0, 0, &_Namespace, 0}; +static varinfo_t _Namespace_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, 0, &_Namespace, 0}; +static methodinfo_t flash_utils_setTimeout = {0x02, 0x00, 0x82, 0x16, "flash.utils", "setTimeout", 0, &_uint, 0, 0}; +static classinfo_t flash_geom_Matrix3D = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Matrix3D", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_geom_Matrix3D_decompose = {0x02, 0x00, 0x80, 0x16, "", "decompose", 0, &__AS3___vec_Vector, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_pointAt = {0x02, 0x00, 0x80, 0x16, "", "pointAt", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_identity = {0x02, 0x00, 0x80, 0x16, "", "identity", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_transformVector = {0x02, 0x00, 0x80, 0x16, "", "transformVector", 0, &flash_geom_Vector3D, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_appendRotation = {0x02, 0x00, 0x80, 0x16, "", "appendRotation", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static varinfo_t flash_geom_Matrix3D_determinant = {0x01, 0x00, 0x80, 0x16, "", "determinant", 0, &_Number, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_prependRotation = {0x02, 0x00, 0x80, 0x16, "", "prependRotation", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static varinfo_t flash_geom_Matrix3D_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &flash_geom_Vector3D, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_interpolateTo = {0x02, 0x00, 0x80, 0x16, "", "interpolateTo", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_appendScale = {0x02, 0x00, 0x80, 0x16, "", "appendScale", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_prepend = {0x02, 0x00, 0x80, 0x16, "", "prepend", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_recompose = {0x02, 0x00, 0x80, 0x16, "", "recompose", 0, &_Boolean, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_appendTranslation = {0x02, 0x00, 0x80, 0x16, "", "appendTranslation", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_invert = {0x02, 0x00, 0x80, 0x16, "", "invert", 0, &_Boolean, &flash_geom_Matrix3D, 0}; +static varinfo_t flash_geom_Matrix3D_rawData = {0x01, 0x00, 0x80, 0x16, "", "rawData", 0, &__AS3___vec_Vector, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_prependTranslation = {0x02, 0x00, 0x80, 0x16, "", "prependTranslation", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_append = {0x02, 0x00, 0x80, 0x16, "", "append", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Matrix3D, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_prependScale = {0x02, 0x00, 0x80, 0x16, "", "prependScale", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_deltaTransformVector = {0x02, 0x00, 0x80, 0x16, "", "deltaTransformVector", 0, &flash_geom_Vector3D, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_transformVectors = {0x02, 0x00, 0x80, 0x16, "", "transformVectors", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_transpose = {0x02, 0x00, 0x80, 0x16, "", "transpose", 0, &voidclass, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_geom_Matrix3D_interpolate = {0x02, 0x00, 0x82, 0x16, "", "interpolate", 0, &flash_geom_Matrix3D, &flash_geom_Matrix3D, 0}; +static methodinfo_t flash_sampler_pauseSampling = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "pauseSampling", 0, &voidclass, 0, 0}; +static classinfo_t flash_system_Capabilities = {0x03, 0x00, 0x81, 0x16, "flash.system", "Capabilities", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_system_Capabilities_maxLevelIDC = {0x01, 0x00, 0x82, 0x16, "", "maxLevelIDC", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_isDebugger = {0x01, 0x00, 0x82, 0x16, "", "isDebugger", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasStreamingAudio = {0x01, 0x00, 0x82, 0x16, "", "hasStreamingAudio", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_screenColor = {0x01, 0x00, 0x82, 0x16, "", "screenColor", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasIME = {0x01, 0x00, 0x82, 0x16, "", "hasIME", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasEmbeddedVideo = {0x01, 0x00, 0x82, 0x16, "", "hasEmbeddedVideo", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasTLS = {0x01, 0x00, 0x82, 0x16, "", "hasTLS", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_isEmbeddedInAcrobat = {0x01, 0x00, 0x82, 0x16, "", "isEmbeddedInAcrobat", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasScreenPlayback = {0x01, 0x00, 0x82, 0x16, "", "hasScreenPlayback", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasVideoEncoder = {0x01, 0x00, 0x82, 0x16, "", "hasVideoEncoder", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasAudioEncoder = {0x01, 0x00, 0x82, 0x16, "", "hasAudioEncoder", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_pixelAspectRatio = {0x01, 0x00, 0x82, 0x16, "", "pixelAspectRatio", 0, &_Number, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasStreamingVideo = {0x01, 0x00, 0x82, 0x16, "", "hasStreamingVideo", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_screenResolutionX = {0x01, 0x00, 0x82, 0x16, "", "screenResolutionX", 0, &_Number, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasScreenBroadcast = {0x01, 0x00, 0x82, 0x16, "", "hasScreenBroadcast", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasAudio = {0x01, 0x00, 0x82, 0x16, "", "hasAudio", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_language = {0x01, 0x00, 0x82, 0x16, "", "language", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_manufacturer = {0x01, 0x00, 0x82, 0x16, "", "manufacturer", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasPrinting = {0x01, 0x00, 0x82, 0x16, "", "hasPrinting", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_os = {0x01, 0x00, 0x82, 0x16, "", "os", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_localFileReadDisable = {0x01, 0x00, 0x82, 0x16, "", "localFileReadDisable", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasMP3 = {0x01, 0x00, 0x82, 0x16, "", "hasMP3", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_avHardwareDisable = {0x01, 0x00, 0x82, 0x16, "", "avHardwareDisable", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_hasAccessibility = {0x01, 0x00, 0x82, 0x16, "", "hasAccessibility", 0, &_Boolean, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_version = {0x01, 0x00, 0x82, 0x16, "", "version", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_screenDPI = {0x01, 0x00, 0x82, 0x16, "", "screenDPI", 0, &_Number, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_playerType = {0x01, 0x00, 0x82, 0x16, "", "playerType", 0, &_String, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_screenResolutionY = {0x01, 0x00, 0x82, 0x16, "", "screenResolutionY", 0, &_Number, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities__internal = {0x01, 0x00, 0x82, 0x16, "", "_internal", 0, &_uint, &flash_system_Capabilities, 0}; +static varinfo_t flash_system_Capabilities_serverString = {0x01, 0x00, 0x82, 0x16, "", "serverString", 0, &_String, &flash_system_Capabilities, 0}; +static methodinfo_t flash_sampler_getSetterInvocationCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSetterInvocationCount", 0, &_Number, 0, 0}; +static methodinfo_t flash_sampler_getGetterInvocationCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getGetterInvocationCount", 0, &_Number, 0, 0}; +static classinfo_t flash_filters_BlurFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BlurFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_BlurFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_BlurFilter, 0}; +static methodinfo_t flash_filters_BlurFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_BlurFilter, 0}; +static varinfo_t flash_filters_BlurFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_BlurFilter, 0}; +static varinfo_t flash_filters_BlurFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_BlurFilter, 0}; +static methodinfo_t _isFinite = {0x02, 0x00, 0x82, 0x16, "", "isFinite", 0, &_Boolean, 0, 0}; +static classinfo_t flash_media_Video = {0x03, 0x00, 0x80, 0x16, "flash.media", "Video", 0, &flash_display_DisplayObject, interfaces: {0}}; +static methodinfo_t flash_media_Video_attachCamera = {0x02, 0x00, 0x80, 0x16, "", "attachCamera", 0, &voidclass, &flash_media_Video, 0}; +static varinfo_t flash_media_Video_videoWidth = {0x01, 0x00, 0x80, 0x16, "", "videoWidth", 0, &_int, &flash_media_Video, 0}; +static methodinfo_t flash_media_Video_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_media_Video, 0}; +static varinfo_t flash_media_Video_deblocking = {0x01, 0x00, 0x80, 0x16, "", "deblocking", 0, &_int, &flash_media_Video, 0}; +static varinfo_t flash_media_Video_videoHeight = {0x01, 0x00, 0x80, 0x16, "", "videoHeight", 0, &_int, &flash_media_Video, 0}; +static methodinfo_t flash_media_Video_attachNetStream = {0x02, 0x00, 0x80, 0x16, "", "attachNetStream", 0, &voidclass, &flash_media_Video, 0}; +static varinfo_t flash_media_Video_smoothing = {0x01, 0x00, 0x80, 0x16, "", "smoothing", 0, &_Boolean, &flash_media_Video, 0}; +static classinfo_t flash_text_engine_TextLineCreationResult = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLineCreationResult", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TextLineCreationResult_EMERGENCY = {0x01, 0x00, 0x82, 0x16, "", "EMERGENCY", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; +static varinfo_t flash_text_engine_TextLineCreationResult_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "COMPLETE", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; +static varinfo_t flash_text_engine_TextLineCreationResult_SUCCESS = {0x01, 0x00, 0x82, 0x16, "", "SUCCESS", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; +static varinfo_t flash_text_engine_TextLineCreationResult_INSUFFICIENT_WIDTH = {0x01, 0x00, 0x82, 0x16, "", "INSUFFICIENT_WIDTH", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; +static classinfo_t _Error = {0x03, 0x00, 0x88, 0x16, "", "Error", 0, &_Object, interfaces: {0}}; +static varinfo_t _Error_message = {0x01, 0x00, 0x80, 0x16, "", "message", 0, 0, &_Error, 0}; +static varinfo_t _Error_errorID = {0x01, 0x00, 0x80, 0x16, "", "errorID", 0, &_int, &_Error, 0}; +static methodinfo_t _Error_getStackTrace = {0x02, 0x00, 0x80, 0x16, "", "getStackTrace", 0, &_String, &_Error, 0}; +static varinfo_t _Error_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, 0, &_Error, 0}; +static varinfo_t _Error_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Error, 0}; +static methodinfo_t _Error_getErrorMessage = {0x02, 0x00, 0x82, 0x16, "", "getErrorMessage", 0, &_String, &_Error, 0}; +static methodinfo_t _Error_throwError = {0x02, 0x00, 0x82, 0x16, "", "throwError", 0, 0, &_Error, 0}; +static classinfo_t flash_xml_XMLNode = {0x03, 0x00, 0x80, 0x16, "flash.xml", "XMLNode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_xml_XMLNode_childNodes = {0x01, 0x00, 0x80, 0x16, "", "childNodes", 0, &_Array, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_appendChild = {0x02, 0x00, 0x80, 0x16, "", "appendChild", 0, &voidclass, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_nextSibling = {0x01, 0x00, 0x80, 0x16, "", "nextSibling", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_nodeType = {0x01, 0x00, 0x80, 0x16, "", "nodeType", 0, &_uint, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_attributes = {0x01, 0x00, 0x80, 0x16, "", "attributes", 0, &_Object, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_firstChild = {0x01, 0x00, 0x80, 0x16, "", "firstChild", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_parentNode = {0x01, 0x00, 0x80, 0x16, "", "parentNode", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_prefix = {0x01, 0x00, 0x80, 0x16, "", "prefix", 0, &_String, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_localName = {0x01, 0x00, 0x80, 0x16, "", "localName", 0, &_String, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_nodeName = {0x01, 0x00, 0x80, 0x16, "", "nodeName", 0, &_String, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_getNamespaceForPrefix = {0x02, 0x00, 0x80, 0x16, "", "getNamespaceForPrefix", 0, &_String, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_insertBefore = {0x02, 0x00, 0x80, 0x16, "", "insertBefore", 0, &voidclass, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_lastChild = {0x01, 0x00, 0x80, 0x16, "", "lastChild", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_cloneNode = {0x02, 0x00, 0x80, 0x16, "", "cloneNode", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_removeNode = {0x02, 0x00, 0x80, 0x16, "", "removeNode", 0, &voidclass, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_namespaceURI = {0x01, 0x00, 0x80, 0x16, "", "namespaceURI", 0, &_String, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_previousSibling = {0x01, 0x00, 0x80, 0x16, "", "previousSibling", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_hasChildNodes = {0x02, 0x00, 0x80, 0x16, "", "hasChildNodes", 0, &_Boolean, &flash_xml_XMLNode, 0}; +static methodinfo_t flash_xml_XMLNode_getPrefixForNamespace = {0x02, 0x00, 0x80, 0x16, "", "getPrefixForNamespace", 0, &_String, &flash_xml_XMLNode, 0}; +static varinfo_t flash_xml_XMLNode_nodeValue = {0x01, 0x00, 0x80, 0x16, "", "nodeValue", 0, &_String, &flash_xml_XMLNode, 0}; +static classinfo_t flash_net_URLVariables = {0x03, 0x00, 0x88, 0x16, "flash.net", "URLVariables", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_net_URLVariables_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_net_URLVariables, 0}; +static methodinfo_t flash_net_URLVariables_decode = {0x02, 0x00, 0x80, 0x16, "", "decode", 0, &voidclass, &flash_net_URLVariables, 0}; +static classinfo_t flash_display_LoaderInfo = {0x03, 0x00, 0x80, 0x16, "flash.display", "LoaderInfo", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_display_LoaderInfo_actionScriptVersion = {0x01, 0x00, 0x80, 0x16, "", "actionScriptVersion", 0, &_uint, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_contentType = {0x01, 0x00, 0x80, 0x16, "", "contentType", 0, &_String, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_sameDomain = {0x01, 0x00, 0x80, 0x16, "", "sameDomain", 0, &_Boolean, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_loaderURL = {0x01, 0x00, 0x80, 0x16, "", "loaderURL", 0, &_String, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_LoaderInfo, 0}; +static methodinfo_t flash_display_LoaderInfo_dispatchEvent = {0x02, 0x00, 0x80, 0x16, "", "dispatchEvent", 0, &_Boolean, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_frameRate = {0x01, 0x00, 0x80, 0x16, "", "frameRate", 0, &_Number, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_parameters = {0x01, 0x00, 0x80, 0x16, "", "parameters", 0, &_Object, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_content = {0x01, 0x00, 0x80, 0x16, "", "content", 0, &flash_display_DisplayObject, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_swfVersion = {0x01, 0x00, 0x80, 0x16, "", "swfVersion", 0, &_uint, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_bytes = {0x01, 0x00, 0x80, 0x16, "", "bytes", 0, &flash_utils_ByteArray, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_loader = {0x01, 0x00, 0x80, 0x16, "", "loader", 0, &flash_display_Loader, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_applicationDomain = {0x01, 0x00, 0x80, 0x16, "", "applicationDomain", 0, &flash_system_ApplicationDomain, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_parentAllowsChild = {0x01, 0x00, 0x80, 0x16, "", "parentAllowsChild", 0, &_Boolean, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_childAllowsParent = {0x01, 0x00, 0x80, 0x16, "", "childAllowsParent", 0, &_Boolean, &flash_display_LoaderInfo, 0}; +static varinfo_t flash_display_LoaderInfo_sharedEvents = {0x01, 0x00, 0x80, 0x16, "", "sharedEvents", 0, &flash_events_EventDispatcher, &flash_display_LoaderInfo, 0}; +static methodinfo_t flash_display_LoaderInfo_getLoaderInfoByDefinition = {0x02, 0x00, 0x82, 0x16, "", "getLoaderInfoByDefinition", 0, &flash_display_LoaderInfo, &flash_display_LoaderInfo, 0}; +static classinfo_t flash_sampler_Sample = {0x03, 0x00, 0x80, 0x16, "flash.sampler", "Sample", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_sampler_Sample_time = {0x01, 0x00, 0x80, 0x16, "", "time", 0, &_Number, &flash_sampler_Sample, 0}; +static varinfo_t flash_sampler_Sample_stack = {0x01, 0x00, 0x80, 0x16, "", "stack", 0, &_Array, &flash_sampler_Sample, 0}; +static classinfo_t flash_text_engine_DigitWidth = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "DigitWidth", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_DigitWidth_PROPORTIONAL = {0x01, 0x00, 0x82, 0x16, "", "PROPORTIONAL", 0, &_String, &flash_text_engine_DigitWidth, 0}; +static varinfo_t flash_text_engine_DigitWidth_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_engine_DigitWidth, 0}; +static varinfo_t flash_text_engine_DigitWidth_TABULAR = {0x01, 0x00, 0x82, 0x16, "", "TABULAR", 0, &_String, &flash_text_engine_DigitWidth, 0}; +static classinfo_t flash_net_URLRequestMethod = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLRequestMethod", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_URLRequestMethod_GET = {0x01, 0x00, 0x82, 0x16, "", "GET", 0, &_String, &flash_net_URLRequestMethod, 0}; +static varinfo_t flash_net_URLRequestMethod_POST = {0x01, 0x00, 0x82, 0x16, "", "POST", 0, &_String, &flash_net_URLRequestMethod, 0}; +static methodinfo_t adobe_utils_MMExecute = {0x02, 0x00, 0x82, 0x16, "adobe.utils", "MMExecute", 0, &_String, 0, 0}; +static classinfo_t flash_system_System = {0x03, 0x00, 0x81, 0x16, "flash.system", "System", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_system_System_pause = {0x02, 0x00, 0x82, 0x16, "", "pause", 0, &voidclass, &flash_system_System, 0}; +static varinfo_t flash_system_System_useCodePage = {0x01, 0x00, 0x82, 0x16, "", "useCodePage", 0, &_Boolean, &flash_system_System, 0}; +static methodinfo_t flash_system_System_exit = {0x02, 0x00, 0x82, 0x16, "", "exit", 0, &voidclass, &flash_system_System, 0}; +static methodinfo_t flash_system_System_setClipboard = {0x02, 0x00, 0x82, 0x16, "", "setClipboard", 0, &voidclass, &flash_system_System, 0}; +static varinfo_t flash_system_System_totalMemory = {0x01, 0x00, 0x82, 0x16, "", "totalMemory", 0, &_uint, &flash_system_System, 0}; +static methodinfo_t flash_system_System_gc = {0x02, 0x00, 0x82, 0x16, "", "gc", 0, &voidclass, &flash_system_System, 0}; +static methodinfo_t flash_system_System_resume = {0x02, 0x00, 0x82, 0x16, "", "resume", 0, &voidclass, &flash_system_System, 0}; +static varinfo_t flash_system_System_vmVersion = {0x01, 0x00, 0x82, 0x16, "", "vmVersion", 0, &_String, &flash_system_System, 0}; +static varinfo_t flash_system_System_ime = {0x01, 0x00, 0x82, 0x16, "", "ime", 0, &flash_system_IME, &flash_system_System, 0}; +static classinfo_t flash_filters_BitmapFilterQuality = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BitmapFilterQuality", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_filters_BitmapFilterQuality_LOW = {0x01, 0x00, 0x82, 0x16, "", "LOW", 0, &_int, &flash_filters_BitmapFilterQuality, 0}; +static varinfo_t flash_filters_BitmapFilterQuality_MEDIUM = {0x01, 0x00, 0x82, 0x16, "", "MEDIUM", 0, &_int, &flash_filters_BitmapFilterQuality, 0}; +static varinfo_t flash_filters_BitmapFilterQuality_HIGH = {0x01, 0x00, 0x82, 0x16, "", "HIGH", 0, &_int, &flash_filters_BitmapFilterQuality, 0}; +static classinfo_t flash_display_DisplayObjectContainer = {0x03, 0x00, 0x80, 0x16, "flash.display", "DisplayObjectContainer", 0, &flash_display_InteractiveObject, interfaces: {0}}; +static methodinfo_t flash_display_DisplayObjectContainer_addChild = {0x02, 0x00, 0x80, 0x16, "", "addChild", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_getObjectsUnderPoint = {0x02, 0x00, 0x80, 0x16, "", "getObjectsUnderPoint", 0, &_Array, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_removeChildAt = {0x02, 0x00, 0x80, 0x16, "", "removeChildAt", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_swapChildren = {0x02, 0x00, 0x80, 0x16, "", "swapChildren", 0, &voidclass, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint = {0x02, 0x00, 0x80, 0x16, "", "areInaccessibleObjectsUnderPoint", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_setChildIndex = {0x02, 0x00, 0x80, 0x16, "", "setChildIndex", 0, &voidclass, &flash_display_DisplayObjectContainer, 0}; +static varinfo_t flash_display_DisplayObjectContainer_numChildren = {0x01, 0x00, 0x80, 0x16, "", "numChildren", 0, &_int, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_getChildIndex = {0x02, 0x00, 0x80, 0x16, "", "getChildIndex", 0, &_int, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_getChildAt = {0x02, 0x00, 0x80, 0x16, "", "getChildAt", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_removeChild = {0x02, 0x00, 0x80, 0x16, "", "removeChild", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_addChildAt = {0x02, 0x00, 0x80, 0x16, "", "addChildAt", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_contains = {0x02, 0x00, 0x80, 0x16, "", "contains", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_getChildByName = {0x02, 0x00, 0x80, 0x16, "", "getChildByName", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; +static methodinfo_t flash_display_DisplayObjectContainer_swapChildrenAt = {0x02, 0x00, 0x80, 0x16, "", "swapChildrenAt", 0, &voidclass, &flash_display_DisplayObjectContainer, 0}; +static varinfo_t flash_display_DisplayObjectContainer_mouseChildren = {0x01, 0x00, 0x80, 0x16, "", "mouseChildren", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; +static varinfo_t flash_display_DisplayObjectContainer_tabChildren = {0x01, 0x00, 0x80, 0x16, "", "tabChildren", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; +static varinfo_t flash_display_DisplayObjectContainer_textSnapshot = {0x01, 0x00, 0x80, 0x16, "", "textSnapshot", 0, &flash_text_TextSnapshot, &flash_display_DisplayObjectContainer, 0}; +static classinfo_t flash_system_LoaderContext = {0x03, 0x00, 0x80, 0x16, "flash.system", "LoaderContext", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_system_LoaderContext_checkPolicyFile = {0x01, 0x00, 0x80, 0x16, "", "checkPolicyFile", 0, &_Boolean, &flash_system_LoaderContext, 0}; +static varinfo_t flash_system_LoaderContext_securityDomain = {0x01, 0x00, 0x80, 0x16, "", "securityDomain", 0, &flash_system_SecurityDomain, &flash_system_LoaderContext, 0}; +static varinfo_t flash_system_LoaderContext_applicationDomain = {0x01, 0x00, 0x80, 0x16, "", "applicationDomain", 0, &flash_system_ApplicationDomain, &flash_system_LoaderContext, 0}; +static methodinfo_t flash_utils_clearTimeout = {0x02, 0x00, 0x82, 0x16, "flash.utils", "clearTimeout", 0, &voidclass, 0, 0}; +static methodinfo_t _isXMLName = {0x02, 0x00, 0x82, 0x16, "", "isXMLName", 0, &_Boolean, 0, 0}; +static classinfo_t flash_xml_XMLNodeType = {0x03, 0x00, 0x81, 0x16, "flash.xml", "XMLNodeType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_xml_XMLNodeType_PROCESSING_INSTRUCTION_NODE = {0x01, 0x00, 0x82, 0x16, "", "PROCESSING_INSTRUCTION_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static varinfo_t flash_xml_XMLNodeType_CDATA_NODE = {0x01, 0x00, 0x82, 0x16, "", "CDATA_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static varinfo_t flash_xml_XMLNodeType_DOCUMENT_TYPE_NODE = {0x01, 0x00, 0x82, 0x16, "", "DOCUMENT_TYPE_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static varinfo_t flash_xml_XMLNodeType_COMMENT_NODE = {0x01, 0x00, 0x82, 0x16, "", "COMMENT_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static varinfo_t flash_xml_XMLNodeType_XML_DECLARATION = {0x01, 0x00, 0x82, 0x16, "", "XML_DECLARATION", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static varinfo_t flash_xml_XMLNodeType_TEXT_NODE = {0x01, 0x00, 0x82, 0x16, "", "TEXT_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static varinfo_t flash_xml_XMLNodeType_ELEMENT_NODE = {0x01, 0x00, 0x82, 0x16, "", "ELEMENT_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; +static classinfo_t flash_events_ErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ErrorEvent", 0, &flash_events_TextEvent, interfaces: {0}}; +static methodinfo_t flash_events_ErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ErrorEvent, 0}; +static methodinfo_t flash_events_ErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ErrorEvent, 0}; +static varinfo_t flash_events_ErrorEvent_ERROR = {0x01, 0x00, 0x82, 0x16, "", "ERROR", 0, &_String, &flash_events_ErrorEvent, 0}; +static classinfo_t flash_utils_IDataOutput = {0x03, 0x00, 0x90, 0x16, "flash.utils", "IDataOutput", 0, 0, interfaces: {0}}; +static methodinfo_t flash_utils_IDataOutput_writeUnsignedInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeUnsignedInt", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeInt", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static varinfo_t flash_utils_IDataOutput_objectEncoding = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "objectEncoding", 0, &_uint, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeUTFBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeUTFBytes", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeObject = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeObject", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeMultiByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeMultiByte", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeShort = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeShort", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeFloat = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeFloat", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeUTF = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeUTF", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeByte", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeBoolean = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeBoolean", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeDouble = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeDouble", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static methodinfo_t flash_utils_IDataOutput_writeBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeBytes", 0, &voidclass, &flash_utils_IDataOutput, 0}; +static varinfo_t flash_utils_IDataOutput_endian = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "endian", 0, &_String, &flash_utils_IDataOutput, 0}; +static classinfo_t flash_geom_Utils3D = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Utils3D", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_geom_Utils3D_projectVectors = {0x02, 0x00, 0x82, 0x16, "", "projectVectors", 0, &voidclass, &flash_geom_Utils3D, 0}; +static methodinfo_t flash_geom_Utils3D_projectVector = {0x02, 0x00, 0x82, 0x16, "", "projectVector", 0, &flash_geom_Vector3D, &flash_geom_Utils3D, 0}; +static methodinfo_t flash_geom_Utils3D_pointTowards = {0x02, 0x00, 0x82, 0x16, "", "pointTowards", 0, &flash_geom_Matrix3D, &flash_geom_Utils3D, 0}; +static classinfo_t flash_events_TextEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "TextEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_TextEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_TextEvent, 0}; +static varinfo_t flash_events_TextEvent_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_events_TextEvent, 0}; +static methodinfo_t flash_events_TextEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_TextEvent, 0}; +static varinfo_t flash_events_TextEvent_LINK = {0x01, 0x00, 0x82, 0x16, "", "LINK", 0, &_String, &flash_events_TextEvent, 0}; +static varinfo_t flash_events_TextEvent_TEXT_INPUT = {0x01, 0x00, 0x82, 0x16, "", "TEXT_INPUT", 0, &_String, &flash_events_TextEvent, 0}; +static classinfo_t flash_utils_Proxy = {0x03, 0x00, 0x80, 0x16, "flash.utils", "Proxy", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_utils_Proxy_callProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "callProperty", 0, 0, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_setProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "setProperty", 0, &voidclass, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_getProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "getProperty", 0, 0, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_nextName = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "nextName", 0, &_String, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_nextNameIndex = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "nextNameIndex", 0, &_int, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_hasProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "hasProperty", 0, &_Boolean, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_deleteProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "deleteProperty", 0, &_Boolean, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_getDescendants = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "getDescendants", 0, 0, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_isAttribute = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "isAttribute", 0, &_Boolean, &flash_utils_Proxy, 0}; +static methodinfo_t flash_utils_Proxy_nextValue = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "nextValue", 0, 0, &flash_utils_Proxy, 0}; +static classinfo_t flash_text_engine_FontPosture = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontPosture", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_FontPosture_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_engine_FontPosture, 0}; +static varinfo_t flash_text_engine_FontPosture_ITALIC = {0x01, 0x00, 0x82, 0x16, "", "ITALIC", 0, &_String, &flash_text_engine_FontPosture, 0}; +static classinfo_t flash_xml_XMLDocument = {0x03, 0x00, 0x80, 0x16, "flash.xml", "XMLDocument", 0, &flash_xml_XMLNode, interfaces: {0}}; +static varinfo_t flash_xml_XMLDocument_docTypeDecl = {0x01, 0x00, 0x80, 0x16, "", "docTypeDecl", 0, &_Object, &flash_xml_XMLDocument, 0}; +static varinfo_t flash_xml_XMLDocument_idMap = {0x01, 0x00, 0x80, 0x16, "", "idMap", 0, &_Object, &flash_xml_XMLDocument, 0}; +static methodinfo_t flash_xml_XMLDocument_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_xml_XMLDocument, 0}; +static varinfo_t flash_xml_XMLDocument_xmlDecl = {0x01, 0x00, 0x80, 0x16, "", "xmlDecl", 0, &_Object, &flash_xml_XMLDocument, 0}; +static methodinfo_t flash_xml_XMLDocument_createElement = {0x02, 0x00, 0x80, 0x16, "", "createElement", 0, &flash_xml_XMLNode, &flash_xml_XMLDocument, 0}; +static varinfo_t flash_xml_XMLDocument_ignoreWhite = {0x01, 0x00, 0x80, 0x16, "", "ignoreWhite", 0, &_Boolean, &flash_xml_XMLDocument, 0}; +static methodinfo_t flash_xml_XMLDocument_createTextNode = {0x02, 0x00, 0x80, 0x16, "", "createTextNode", 0, &flash_xml_XMLNode, &flash_xml_XMLDocument, 0}; +static methodinfo_t flash_xml_XMLDocument_parseXML = {0x02, 0x00, 0x80, 0x16, "", "parseXML", 0, &voidclass, &flash_xml_XMLDocument, 0}; +static classinfo_t flash_display_ShaderInput = {0x03, 0x00, 0x89, 0x16, "flash.display", "ShaderInput", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ShaderInput_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_ShaderInput, 0}; +static varinfo_t flash_display_ShaderInput_input = {0x01, 0x00, 0x80, 0x16, "", "input", 0, &_Object, &flash_display_ShaderInput, 0}; +static varinfo_t flash_display_ShaderInput_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_ShaderInput, 0}; +static varinfo_t flash_display_ShaderInput_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_display_ShaderInput, 0}; +static varinfo_t flash_display_ShaderInput_channels = {0x01, 0x00, 0x80, 0x16, "", "channels", 0, &_int, &flash_display_ShaderInput, 0}; +static classinfo_t flash_text_engine_TextBlock = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextBlock", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_text_engine_TextBlock_createTextLine = {0x02, 0x00, 0x80, 0x16, "", "createTextLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_bidiLevel = {0x01, 0x00, 0x80, 0x16, "", "bidiLevel", 0, &_int, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_getTextLineAtCharIndex = {0x02, 0x00, 0x80, 0x16, "", "getTextLineAtCharIndex", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_lastLine = {0x01, 0x00, 0x80, 0x16, "", "lastLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_findPreviousWordBoundary = {0x02, 0x00, 0x80, 0x16, "", "findPreviousWordBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_findPreviousAtomBoundary = {0x02, 0x00, 0x80, 0x16, "", "findPreviousAtomBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_baselineZero = {0x01, 0x00, 0x80, 0x16, "", "baselineZero", 0, &_String, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_applyNonLinearFontScaling = {0x01, 0x00, 0x80, 0x16, "", "applyNonLinearFontScaling", 0, &_Boolean, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_firstLine = {0x01, 0x00, 0x80, 0x16, "", "firstLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_textJustifier = {0x01, 0x00, 0x80, 0x16, "", "textJustifier", 0, &flash_text_engine_TextJustifier, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_releaseLines = {0x02, 0x00, 0x80, 0x16, "", "releaseLines", 0, &voidclass, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_firstInvalidLine = {0x01, 0x00, 0x80, 0x16, "", "firstInvalidLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_baselineFontSize = {0x01, 0x00, 0x80, 0x16, "", "baselineFontSize", 0, &_Number, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_lineRotation = {0x01, 0x00, 0x80, 0x16, "", "lineRotation", 0, &_String, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_userData = {0x01, 0x00, 0x80, 0x16, "", "userData", 0, 0, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_content = {0x01, 0x00, 0x80, 0x16, "", "content", 0, &flash_text_engine_ContentElement, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_textLineCreationResult = {0x01, 0x00, 0x80, 0x16, "", "textLineCreationResult", 0, &_String, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_baselineFontDescription = {0x01, 0x00, 0x80, 0x16, "", "baselineFontDescription", 0, &flash_text_engine_FontDescription, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_findNextAtomBoundary = {0x02, 0x00, 0x80, 0x16, "", "findNextAtomBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_findNextWordBoundary = {0x02, 0x00, 0x80, 0x16, "", "findNextWordBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; +static varinfo_t flash_text_engine_TextBlock_tabStops = {0x01, 0x00, 0x80, 0x16, "", "tabStops", 0, &__AS3___vec_Vector, &flash_text_engine_TextBlock, 0}; +static methodinfo_t flash_text_engine_TextBlock_dump = {0x02, 0x00, 0x80, 0x16, "", "dump", 0, &_String, &flash_text_engine_TextBlock, 0}; +static classinfo_t flash_ui_MouseCursor = {0x03, 0x00, 0x81, 0x16, "flash.ui", "MouseCursor", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_ui_MouseCursor_BUTTON = {0x01, 0x00, 0x82, 0x16, "", "BUTTON", 0, &_String, &flash_ui_MouseCursor, 0}; +static varinfo_t flash_ui_MouseCursor_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_ui_MouseCursor, 0}; +static varinfo_t flash_ui_MouseCursor_ARROW = {0x01, 0x00, 0x82, 0x16, "", "ARROW", 0, &_String, &flash_ui_MouseCursor, 0}; +static varinfo_t flash_ui_MouseCursor_IBEAM = {0x01, 0x00, 0x82, 0x16, "", "IBEAM", 0, &_String, &flash_ui_MouseCursor, 0}; +static varinfo_t flash_ui_MouseCursor_HAND = {0x01, 0x00, 0x82, 0x16, "", "HAND", 0, &_String, &flash_ui_MouseCursor, 0}; +static namespace_t flash_utils_flash_proxy_constant_ns = {0x08, "http://www.adobe.com/2006/actionscript/flash/proxy"}; +static constant_t flash_utils_flash_proxy_constant = {type: 8, &flash_utils_flash_proxy_constant_ns}; +static varinfo_t flash_utils_flash_proxy = {0x01, 0x00, 0xa2, 0x16, "flash.utils", "flash_proxy", 0, 0, 0, &flash_utils_flash_proxy_constant}; +static classinfo_t flash_display_MorphShape = {0x03, 0x00, 0x81, 0x16, "flash.display", "MorphShape", 0, &flash_display_DisplayObject, interfaces: {0}}; +static classinfo_t flash_text_TextDisplayMode = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextDisplayMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextDisplayMode_CRT = {0x01, 0x00, 0x82, 0x16, "", "CRT", 0, &_String, &flash_text_TextDisplayMode, 0}; +static varinfo_t flash_text_TextDisplayMode_LCD = {0x01, 0x00, 0x82, 0x16, "", "LCD", 0, &_String, &flash_text_TextDisplayMode, 0}; +static varinfo_t flash_text_TextDisplayMode_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_TextDisplayMode, 0}; +static classinfo_t flash_net_URLLoaderDataFormat = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLLoaderDataFormat", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_URLLoaderDataFormat_VARIABLES = {0x01, 0x00, 0x82, 0x16, "", "VARIABLES", 0, &_String, &flash_net_URLLoaderDataFormat, 0}; +static varinfo_t flash_net_URLLoaderDataFormat_BINARY = {0x01, 0x00, 0x82, 0x16, "", "BINARY", 0, &_String, &flash_net_URLLoaderDataFormat, 0}; +static varinfo_t flash_net_URLLoaderDataFormat_TEXT = {0x01, 0x00, 0x82, 0x16, "", "TEXT", 0, &_String, &flash_net_URLLoaderDataFormat, 0}; +static classinfo_t flash_display_StageQuality = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageQuality", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_StageQuality_LOW = {0x01, 0x00, 0x82, 0x16, "", "LOW", 0, &_String, &flash_display_StageQuality, 0}; +static varinfo_t flash_display_StageQuality_MEDIUM = {0x01, 0x00, 0x82, 0x16, "", "MEDIUM", 0, &_String, &flash_display_StageQuality, 0}; +static varinfo_t flash_display_StageQuality_HIGH = {0x01, 0x00, 0x82, 0x16, "", "HIGH", 0, &_String, &flash_display_StageQuality, 0}; +static varinfo_t flash_display_StageQuality_BEST = {0x01, 0x00, 0x82, 0x16, "", "BEST", 0, &_String, &flash_display_StageQuality, 0}; +static classinfo_t flash_display_Sprite = {0x03, 0x00, 0x80, 0x16, "flash.display", "Sprite", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; +static methodinfo_t flash_display_Sprite_stopDrag = {0x02, 0x00, 0x80, 0x16, "", "stopDrag", 0, &voidclass, &flash_display_Sprite, 0}; +static varinfo_t flash_display_Sprite_buttonMode = {0x01, 0x00, 0x80, 0x16, "", "buttonMode", 0, &_Boolean, &flash_display_Sprite, 0}; +static varinfo_t flash_display_Sprite_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_display_Sprite, 0}; +static varinfo_t flash_display_Sprite_hitArea = {0x01, 0x00, 0x80, 0x16, "", "hitArea", 0, &flash_display_Sprite, &flash_display_Sprite, 0}; +static varinfo_t flash_display_Sprite_useHandCursor = {0x01, 0x00, 0x80, 0x16, "", "useHandCursor", 0, &_Boolean, &flash_display_Sprite, 0}; +static varinfo_t flash_display_Sprite_graphics = {0x01, 0x00, 0x80, 0x16, "", "graphics", 0, &flash_display_Graphics, &flash_display_Sprite, 0}; +static methodinfo_t flash_display_Sprite_startDrag = {0x02, 0x00, 0x80, 0x16, "", "startDrag", 0, &voidclass, &flash_display_Sprite, 0}; +static varinfo_t flash_display_Sprite_dropTarget = {0x01, 0x00, 0x80, 0x16, "", "dropTarget", 0, &flash_display_DisplayObject, &flash_display_Sprite, 0}; +static classinfo_t flash_ui_Keyboard = {0x03, 0x00, 0x81, 0x16, "flash.ui", "Keyboard", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_ui_Keyboard_PAGE_DOWN = {0x01, 0x00, 0x82, 0x16, "", "PAGE_DOWN", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F4 = {0x01, 0x00, 0x82, 0x16, "", "F4", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_ENTER = {0x01, 0x00, 0x82, 0x16, "", "ENTER", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_CONTROL = {0x01, 0x00, 0x82, 0x16, "", "CONTROL", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F7 = {0x01, 0x00, 0x82, 0x16, "", "F7", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F14 = {0x01, 0x00, 0x82, 0x16, "", "F14", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_3 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_3", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_DECIMAL = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_DECIMAL", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_CAPS_LOCK = {0x01, 0x00, 0x82, 0x16, "", "CAPS_LOCK", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_SHIFT = {0x01, 0x00, 0x82, 0x16, "", "SHIFT", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_TAB = {0x01, 0x00, 0x82, 0x16, "", "TAB", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_0 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_0", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_END = {0x01, 0x00, 0x82, 0x16, "", "END", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_1 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_1", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F8 = {0x01, 0x00, 0x82, 0x16, "", "F8", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F9 = {0x01, 0x00, 0x82, 0x16, "", "F9", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_numLock = {0x01, 0x00, 0x82, 0x16, "", "numLock", 0, &_Boolean, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F2 = {0x01, 0x00, 0x82, 0x16, "", "F2", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_4 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_4", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F3 = {0x01, 0x00, 0x82, 0x16, "", "F3", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_2 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_2", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_HOME = {0x01, 0x00, 0x82, 0x16, "", "HOME", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_7 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_7", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_6 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_6", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F6 = {0x01, 0x00, 0x82, 0x16, "", "F6", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F5 = {0x01, 0x00, 0x82, 0x16, "", "F5", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_INSERT = {0x01, 0x00, 0x82, 0x16, "", "INSERT", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_ESCAPE = {0x01, 0x00, 0x82, 0x16, "", "ESCAPE", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F1 = {0x01, 0x00, 0x82, 0x16, "", "F1", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_SUBTRACT = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_SUBTRACT", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_8 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_8", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_SPACE = {0x01, 0x00, 0x82, 0x16, "", "SPACE", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_BACKSPACE = {0x01, 0x00, 0x82, 0x16, "", "BACKSPACE", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_DELETE = {0x01, 0x00, 0x82, 0x16, "", "DELETE", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_MULTIPLY = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_MULTIPLY", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F13 = {0x01, 0x00, 0x82, 0x16, "", "F13", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_ADD = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_ADD", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_9 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_9", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F12 = {0x01, 0x00, 0x82, 0x16, "", "F12", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F15 = {0x01, 0x00, 0x82, 0x16, "", "F15", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F11 = {0x01, 0x00, 0x82, 0x16, "", "F11", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_UP = {0x01, 0x00, 0x82, 0x16, "", "UP", 0, &_uint, &flash_ui_Keyboard, 0}; +static methodinfo_t flash_ui_Keyboard_isAccessible = {0x02, 0x00, 0x82, 0x16, "", "isAccessible", 0, &_Boolean, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_DOWN = {0x01, 0x00, 0x82, 0x16, "", "DOWN", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_capsLock = {0x01, 0x00, 0x82, 0x16, "", "capsLock", 0, &_Boolean, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_PAGE_UP = {0x01, 0x00, 0x82, 0x16, "", "PAGE_UP", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_ENTER = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_ENTER", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_F10 = {0x01, 0x00, 0x82, 0x16, "", "F10", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_5 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_5", 0, &_uint, &flash_ui_Keyboard, 0}; +static varinfo_t flash_ui_Keyboard_NUMPAD_DIVIDE = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_DIVIDE", 0, &_uint, &flash_ui_Keyboard, 0}; +static classinfo_t flash_filters_DisplacementMapFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "DisplacementMapFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_DisplacementMapFilter_scaleY = {0x01, 0x00, 0x80, 0x16, "", "scaleY", 0, &_Number, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_mapPoint = {0x01, 0x00, 0x80, 0x16, "", "mapPoint", 0, &flash_geom_Point, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_scaleX = {0x01, 0x00, 0x80, 0x16, "", "scaleX", 0, &_Number, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_mapBitmap = {0x01, 0x00, 0x80, 0x16, "", "mapBitmap", 0, &flash_display_BitmapData, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_mode = {0x01, 0x00, 0x80, 0x16, "", "mode", 0, &_String, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_componentX = {0x01, 0x00, 0x80, 0x16, "", "componentX", 0, &_uint, &flash_filters_DisplacementMapFilter, 0}; +static methodinfo_t flash_filters_DisplacementMapFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_DisplacementMapFilter, 0}; +static varinfo_t flash_filters_DisplacementMapFilter_componentY = {0x01, 0x00, 0x80, 0x16, "", "componentY", 0, &_uint, &flash_filters_DisplacementMapFilter, 0}; +static methodinfo_t flash_utils_escapeMultiByte = {0x02, 0x00, 0x82, 0x16, "flash.utils", "escapeMultiByte", 0, &_String, 0, 0}; +static methodinfo_t adobe_utils_MMEndCommand = {0x02, 0x00, 0x82, 0x16, "adobe.utils", "MMEndCommand", 0, &voidclass, 0, 0}; +static classinfo_t flash_display_GradientType = {0x03, 0x00, 0x81, 0x16, "flash.display", "GradientType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_GradientType_LINEAR = {0x01, 0x00, 0x82, 0x16, "", "LINEAR", 0, &_String, &flash_display_GradientType, 0}; +static varinfo_t flash_display_GradientType_RADIAL = {0x01, 0x00, 0x82, 0x16, "", "RADIAL", 0, &_String, &flash_display_GradientType, 0}; +static classinfo_t flash_media_ID3Info = {0x03, 0x00, 0x89, 0x16, "flash.media", "ID3Info", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_media_ID3Info_comment = {0x01, 0x00, 0x80, 0x16, "", "comment", 0, &_String, &flash_media_ID3Info, 0}; +static varinfo_t flash_media_ID3Info_year = {0x01, 0x00, 0x80, 0x16, "", "year", 0, &_String, &flash_media_ID3Info, 0}; +static varinfo_t flash_media_ID3Info_track = {0x01, 0x00, 0x80, 0x16, "", "track", 0, &_String, &flash_media_ID3Info, 0}; +static varinfo_t flash_media_ID3Info_artist = {0x01, 0x00, 0x80, 0x16, "", "artist", 0, &_String, &flash_media_ID3Info, 0}; +static varinfo_t flash_media_ID3Info_songName = {0x01, 0x00, 0x80, 0x16, "", "songName", 0, &_String, &flash_media_ID3Info, 0}; +static varinfo_t flash_media_ID3Info_genre = {0x01, 0x00, 0x80, 0x16, "", "genre", 0, &_String, &flash_media_ID3Info, 0}; +static varinfo_t flash_media_ID3Info_album = {0x01, 0x00, 0x80, 0x16, "", "album", 0, &_String, &flash_media_ID3Info, 0}; +static classinfo_t flash_display_GraphicsSolidFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsSolidFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; +static varinfo_t flash_display_GraphicsSolidFill_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_display_GraphicsSolidFill, 0}; +static varinfo_t flash_display_GraphicsSolidFill_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_display_GraphicsSolidFill, 0}; +static classinfo_t flash_filters_ColorMatrixFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "ColorMatrixFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_ColorMatrixFilter_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &_Array, &flash_filters_ColorMatrixFilter, 0}; +static methodinfo_t flash_filters_ColorMatrixFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_ColorMatrixFilter, 0}; +static classinfo_t flash_net_NetStreamPlayTransitions = {0x03, 0x00, 0x80, 0x16, "flash.net", "NetStreamPlayTransitions", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_NetStreamPlayTransitions_RESET = {0x01, 0x00, 0x82, 0x16, "", "RESET", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; +static varinfo_t flash_net_NetStreamPlayTransitions_APPEND = {0x01, 0x00, 0x82, 0x16, "", "APPEND", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; +static varinfo_t flash_net_NetStreamPlayTransitions_SWAP = {0x01, 0x00, 0x82, 0x16, "", "SWAP", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; +static varinfo_t flash_net_NetStreamPlayTransitions_SWITCH = {0x01, 0x00, 0x82, 0x16, "", "SWITCH", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; +static varinfo_t flash_net_NetStreamPlayTransitions_STOP = {0x01, 0x00, 0x82, 0x16, "", "STOP", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; +static classinfo_t flash_media_SoundCodec = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundCodec", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_media_SoundCodec_NELLYMOSER = {0x01, 0x00, 0x82, 0x16, "", "NELLYMOSER", 0, &_String, &flash_media_SoundCodec, 0}; +static varinfo_t flash_media_SoundCodec_SPEEX = {0x01, 0x00, 0x82, 0x16, "", "SPEEX", 0, &_String, &flash_media_SoundCodec, 0}; +static classinfo_t flash_net_ObjectEncoding = {0x03, 0x00, 0x81, 0x16, "flash.net", "ObjectEncoding", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_ObjectEncoding_dynamicPropertyWriter = {0x01, 0x00, 0x82, 0x16, "", "dynamicPropertyWriter", 0, &flash_net_IDynamicPropertyWriter, &flash_net_ObjectEncoding, 0}; +static varinfo_t flash_net_ObjectEncoding_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_uint, &flash_net_ObjectEncoding, 0}; +static varinfo_t flash_net_ObjectEncoding_AMF0 = {0x01, 0x00, 0x82, 0x16, "", "AMF0", 0, &_uint, &flash_net_ObjectEncoding, 0}; +static varinfo_t flash_net_ObjectEncoding_AMF3 = {0x01, 0x00, 0x82, 0x16, "", "AMF3", 0, &_uint, &flash_net_ObjectEncoding, 0}; +static classinfo_t flash_text_engine_GroupElement = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "GroupElement", 0, &flash_text_engine_ContentElement, interfaces: {0}}; +static methodinfo_t flash_text_engine_GroupElement_groupElements = {0x02, 0x00, 0x80, 0x16, "", "groupElements", 0, &flash_text_engine_GroupElement, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_splitTextElement = {0x02, 0x00, 0x80, 0x16, "", "splitTextElement", 0, &flash_text_engine_TextElement, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_mergeTextElements = {0x02, 0x00, 0x80, 0x16, "", "mergeTextElements", 0, &flash_text_engine_TextElement, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_getElementAtCharIndex = {0x02, 0x00, 0x80, 0x16, "", "getElementAtCharIndex", 0, &flash_text_engine_ContentElement, &flash_text_engine_GroupElement, 0}; +static varinfo_t flash_text_engine_GroupElement_elementCount = {0x01, 0x00, 0x80, 0x16, "", "elementCount", 0, &_int, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_setElements = {0x02, 0x00, 0x80, 0x16, "", "setElements", 0, &voidclass, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_getElementAt = {0x02, 0x00, 0x80, 0x16, "", "getElementAt", 0, &flash_text_engine_ContentElement, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_ungroupElements = {0x02, 0x00, 0x80, 0x16, "", "ungroupElements", 0, &voidclass, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_replaceElements = {0x02, 0x00, 0x80, 0x16, "", "replaceElements", 0, &__AS3___vec_Vector, &flash_text_engine_GroupElement, 0}; +static methodinfo_t flash_text_engine_GroupElement_getElementIndex = {0x02, 0x00, 0x80, 0x16, "", "getElementIndex", 0, &_int, &flash_text_engine_GroupElement, 0}; +static methodinfo_t _parseInt = {0x02, 0x00, 0x82, 0x16, "", "parseInt", 0, &_Number, 0, 0}; +static classinfo_t _QName = {0x03, 0x00, 0x81, 0x16, "", "QName", 0, &_Object, interfaces: {0}}; +static varinfo_t _QName_localName = {0x01, 0x00, 0x80, 0x16, "", "localName", 0, &_String, &_QName, 0}; +static methodinfo_t _QName_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_QName, &_QName, 0}; +static methodinfo_t _QName_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_QName, 0}; +static varinfo_t _QName_uri = {0x01, 0x00, 0x80, 0x16, "", "uri", 0, 0, &_QName, 0}; +static varinfo_t _QName_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, 0, &_QName, 0}; +static classinfo_t _UninitializedError = {0x03, 0x00, 0x88, 0x16, "", "UninitializedError", 0, &_Error, interfaces: {0}}; +static varinfo_t _UninitializedError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_UninitializedError, 0}; +static classinfo_t _Date = {0x03, 0x00, 0x89, 0x16, "", "Date", 0, &_Object, interfaces: {0}}; +static methodinfo_t _Date_getTimezoneOffset = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getTimezoneOffset", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getTime = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getTime", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCMilliseconds", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_month = {0x01, 0x00, 0x80, 0x16, "", "month", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Date, 0}; +static methodinfo_t _Date_getHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getHours", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_date = {0x01, 0x00, 0x80, 0x16, "", "date", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_milliseconds = {0x01, 0x00, 0x80, 0x16, "", "milliseconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setSeconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getDate", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_hoursUTC = {0x01, 0x00, 0x80, 0x16, "", "hoursUTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCDate", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_timezoneOffset = {0x01, 0x00, 0x80, 0x16, "", "timezoneOffset", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setTime = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setTime", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_millisecondsUTC = {0x01, 0x00, 0x80, 0x16, "", "millisecondsUTC", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_minutes = {0x01, 0x00, 0x80, 0x16, "", "minutes", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCHours", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_minutesUTC = {0x01, 0x00, 0x80, 0x16, "", "minutesUTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_toLocaleTimeString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleTimeString", 0, &_String, &_Date, 0}; +static varinfo_t _Date_fullYearUTC = {0x01, 0x00, 0x80, 0x16, "", "fullYearUTC", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_time = {0x01, 0x00, 0x80, 0x16, "", "time", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_monthUTC = {0x01, 0x00, 0x80, 0x16, "", "monthUTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCMilliseconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_toDateString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toDateString", 0, &_String, &_Date, 0}; +static methodinfo_t _Date_getMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getMonth", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setMinutes", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_toLocaleDateString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleDateString", 0, &_String, &_Date, 0}; +static varinfo_t _Date_fullYear = {0x01, 0x00, 0x80, 0x16, "", "fullYear", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCFullYear", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getSeconds", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_dateUTC = {0x01, 0x00, 0x80, 0x16, "", "dateUTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getMilliseconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCMinutes", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_day = {0x01, 0x00, 0x80, 0x16, "", "day", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCSeconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCDate", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCMonth", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_seconds = {0x01, 0x00, 0x80, 0x16, "", "seconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCMinutes", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setDate", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getFullYear", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setFullYear", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setHours", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setMonth", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCSeconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getMinutes", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_toLocaleString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleString", 0, &_String, &_Date, 0}; +static methodinfo_t _Date_toUTCString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toUTCString", 0, &_String, &_Date, 0}; +static varinfo_t _Date_dayUTC = {0x01, 0x00, 0x80, 0x16, "", "dayUTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getDay = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getDay", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCMonth", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_hours = {0x01, 0x00, 0x80, 0x16, "", "hours", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCDay = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCDay", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_setUTCFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCFullYear", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_secondsUTC = {0x01, 0x00, 0x80, 0x16, "", "secondsUTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_toTimeString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toTimeString", 0, &_String, &_Date, 0}; +static methodinfo_t _Date_setMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setMilliseconds", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_getUTCHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCHours", 0, &_Number, &_Date, 0}; +static varinfo_t _Date_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Date, 0}; +static methodinfo_t _Date_UTC = {0x02, 0x00, 0x82, 0x16, "", "UTC", 0, &_Number, &_Date, 0}; +static methodinfo_t _Date_parse = {0x02, 0x00, 0x82, 0x16, "", "parse", 0, &_Number, &_Date, 0}; +static classinfo_t flash_text_StyleSheet = {0x03, 0x00, 0x88, 0x16, "flash.text", "StyleSheet", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_text_StyleSheet_styleNames = {0x01, 0x00, 0x80, 0x16, "", "styleNames", 0, &_Array, &flash_text_StyleSheet, 0}; +static methodinfo_t flash_text_StyleSheet_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_text_StyleSheet, 0}; +static methodinfo_t flash_text_StyleSheet_transform = {0x02, 0x00, 0x80, 0x16, "", "transform", 0, &flash_text_TextFormat, &flash_text_StyleSheet, 0}; +static methodinfo_t flash_text_StyleSheet_getStyle = {0x02, 0x00, 0x80, 0x16, "", "getStyle", 0, &_Object, &flash_text_StyleSheet, 0}; +static methodinfo_t flash_text_StyleSheet_parseCSS = {0x02, 0x00, 0x80, 0x16, "", "parseCSS", 0, &voidclass, &flash_text_StyleSheet, 0}; +static methodinfo_t flash_text_StyleSheet_setStyle = {0x02, 0x00, 0x80, 0x16, "", "setStyle", 0, &voidclass, &flash_text_StyleSheet, 0}; +static classinfo_t flash_display_ActionScriptVersion = {0x03, 0x00, 0x81, 0x16, "flash.display", "ActionScriptVersion", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ActionScriptVersion_ACTIONSCRIPT3 = {0x01, 0x00, 0x82, 0x16, "", "ACTIONSCRIPT3", 0, &_uint, &flash_display_ActionScriptVersion, 0}; +static varinfo_t flash_display_ActionScriptVersion_ACTIONSCRIPT2 = {0x01, 0x00, 0x82, 0x16, "", "ACTIONSCRIPT2", 0, &_uint, &flash_display_ActionScriptVersion, 0}; +static classinfo_t flash_text_engine_EastAsianJustifier = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "EastAsianJustifier", 0, &flash_text_engine_TextJustifier, interfaces: {0}}; +static varinfo_t flash_text_engine_EastAsianJustifier_justificationStyle = {0x01, 0x00, 0x80, 0x16, "", "justificationStyle", 0, &_String, &flash_text_engine_EastAsianJustifier, 0}; +static methodinfo_t flash_text_engine_EastAsianJustifier_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_TextJustifier, &flash_text_engine_EastAsianJustifier, 0}; +static classinfo_t _String = {0x03, 0x00, 0x81, 0x16, "", "String", 0, &_Object, interfaces: {0}}; +static methodinfo_t _String_indexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "indexOf", 0, &_int, &_String, 0}; +static methodinfo_t _String_replace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "replace", 0, &_String, &_String, 0}; +static methodinfo_t _String_lastIndexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "lastIndexOf", 0, &_int, &_String, 0}; +static methodinfo_t _String_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_String, &_String, 0}; +static methodinfo_t _String_concat = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "concat", 0, &_String, &_String, 0}; +static methodinfo_t _String_substr = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "substr", 0, &_String, &_String, 0}; +static methodinfo_t _String_slice = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "slice", 0, &_String, &_String, 0}; +static methodinfo_t _String_search = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "search", 0, &_int, &_String, 0}; +static methodinfo_t _String_toLocaleUpperCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleUpperCase", 0, &_String, &_String, 0}; +static methodinfo_t _String_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_String, 0}; +static methodinfo_t _String_toUpperCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toUpperCase", 0, &_String, &_String, 0}; +static methodinfo_t _String_charAt = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "charAt", 0, &_String, &_String, 0}; +static methodinfo_t _String_match = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "match", 0, &_Array, &_String, 0}; +static methodinfo_t _String_charCodeAt = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "charCodeAt", 0, &_Number, &_String, 0}; +static methodinfo_t _String_substring = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "substring", 0, &_String, &_String, 0}; +static methodinfo_t _String_localeCompare = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "localeCompare", 0, &_int, &_String, 0}; +static methodinfo_t _String_split = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "split", 0, &_Array, &_String, 0}; +static methodinfo_t _String_toLocaleLowerCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleLowerCase", 0, &_String, &_String, 0}; +static varinfo_t _String_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_int, &_String, 0}; +static methodinfo_t _String_toLowerCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLowerCase", 0, &_String, &_String, 0}; +static methodinfo_t _String_fromCharCode = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "fromCharCode", 0, &_String, &_String, 0}; +static classinfo_t flash_media_SoundChannel = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundChannel", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_media_SoundChannel_leftPeak = {0x01, 0x00, 0x80, 0x16, "", "leftPeak", 0, &_Number, &flash_media_SoundChannel, 0}; +static methodinfo_t flash_media_SoundChannel_stop = {0x02, 0x00, 0x80, 0x16, "", "stop", 0, &voidclass, &flash_media_SoundChannel, 0}; +static varinfo_t flash_media_SoundChannel_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_Number, &flash_media_SoundChannel, 0}; +static varinfo_t flash_media_SoundChannel_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_media_SoundChannel, 0}; +static varinfo_t flash_media_SoundChannel_rightPeak = {0x01, 0x00, 0x80, 0x16, "", "rightPeak", 0, &_Number, &flash_media_SoundChannel, 0}; +static classinfo_t flash_desktop_Clipboard = {0x03, 0x00, 0x80, 0x16, "flash.desktop", "Clipboard", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_desktop_Clipboard_setDataHandler = {0x02, 0x00, 0x80, 0x16, "", "setDataHandler", 0, &_Boolean, &flash_desktop_Clipboard, 0}; +static methodinfo_t flash_desktop_Clipboard_setData = {0x02, 0x00, 0x80, 0x16, "", "setData", 0, &_Boolean, &flash_desktop_Clipboard, 0}; +static varinfo_t flash_desktop_Clipboard_formats = {0x01, 0x00, 0x80, 0x16, "", "formats", 0, &_Array, &flash_desktop_Clipboard, 0}; +static methodinfo_t flash_desktop_Clipboard_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_desktop_Clipboard, 0}; +static methodinfo_t flash_desktop_Clipboard_getData = {0x02, 0x00, 0x80, 0x16, "", "getData", 0, &_Object, &flash_desktop_Clipboard, 0}; +static methodinfo_t flash_desktop_Clipboard_hasFormat = {0x02, 0x00, 0x80, 0x16, "", "hasFormat", 0, &_Boolean, &flash_desktop_Clipboard, 0}; +static methodinfo_t flash_desktop_Clipboard_clearData = {0x02, 0x00, 0x80, 0x16, "", "clearData", 0, &voidclass, &flash_desktop_Clipboard, 0}; +static varinfo_t flash_desktop_Clipboard_generalClipboard = {0x01, 0x00, 0x82, 0x16, "", "generalClipboard", 0, &flash_desktop_Clipboard, &flash_desktop_Clipboard, 0}; +static classinfo_t flash_display_IBitmapDrawable = {0x03, 0x00, 0x90, 0x16, "flash.display", "IBitmapDrawable", 0, 0, interfaces: {0}}; +static classinfo_t _TypeError = {0x03, 0x00, 0x88, 0x16, "", "TypeError", 0, &_Error, interfaces: {0}}; +static varinfo_t _TypeError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_TypeError, 0}; +static classinfo_t _int = {0x03, 0x00, 0x81, 0x16, "", "int", 0, &_Object, interfaces: {0}}; +static methodinfo_t _int_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_int, &_int, 0}; +static methodinfo_t _int_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_int, 0}; +static methodinfo_t _int_toExponential = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toExponential", 0, &_String, &_int, 0}; +static methodinfo_t _int_toFixed = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toFixed", 0, &_String, &_int, 0}; +static methodinfo_t _int_toPrecision = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toPrecision", 0, &_String, &_int, 0}; +static varinfo_t _int_MAX_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MAX_VALUE", 0, &_int, &_int, 0}; +static varinfo_t _int_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_int, 0}; +static varinfo_t _int_MIN_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MIN_VALUE", 0, &_int, &_int, 0}; +static classinfo_t flash_display_Scene = {0x03, 0x00, 0x81, 0x16, "flash.display", "Scene", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_Scene_numFrames = {0x01, 0x00, 0x80, 0x16, "", "numFrames", 0, &_int, &flash_display_Scene, 0}; +static varinfo_t flash_display_Scene_labels = {0x01, 0x00, 0x80, 0x16, "", "labels", 0, &_Array, &flash_display_Scene, 0}; +static varinfo_t flash_display_Scene_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_display_Scene, 0}; +static classinfo_t flash_text_engine_FontMetrics = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontMetrics", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_FontMetrics_superscriptOffset = {0x01, 0x00, 0x80, 0x16, "", "superscriptOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_underlineThickness = {0x01, 0x00, 0x80, 0x16, "", "underlineThickness", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_subscriptScale = {0x01, 0x00, 0x80, 0x16, "", "subscriptScale", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_strikethroughOffset = {0x01, 0x00, 0x80, 0x16, "", "strikethroughOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_emBox = {0x01, 0x00, 0x80, 0x16, "", "emBox", 0, &flash_geom_Rectangle, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_strikethroughThickness = {0x01, 0x00, 0x80, 0x16, "", "strikethroughThickness", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_superscriptScale = {0x01, 0x00, 0x80, 0x16, "", "superscriptScale", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_subscriptOffset = {0x01, 0x00, 0x80, 0x16, "", "subscriptOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static varinfo_t flash_text_engine_FontMetrics_underlineOffset = {0x01, 0x00, 0x80, 0x16, "", "underlineOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; +static classinfo_t flash_utils_IExternalizable = {0x03, 0x00, 0x90, 0x16, "flash.utils", "IExternalizable", 0, 0, interfaces: {0}}; +static methodinfo_t flash_utils_IExternalizable_readExternal = {0x02, 0x00, 0x80, 0x08, "flash.utils:IExternalizable", "readExternal", 0, &voidclass, &flash_utils_IExternalizable, 0}; +static methodinfo_t flash_utils_IExternalizable_writeExternal = {0x02, 0x00, 0x80, 0x08, "flash.utils:IExternalizable", "writeExternal", 0, &voidclass, &flash_utils_IExternalizable, 0}; +static classinfo_t __AS3___vec_Vector = {0x03, 0x00, 0x89, 0x16, "__AS3__.vec", "Vector", 0, &_Object, interfaces: {0}}; +static classinfo_t flash_filters_GradientBevelFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "GradientBevelFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_GradientBevelFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_alphas = {0x01, 0x00, 0x80, 0x16, "", "alphas", 0, &_Array, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_ratios = {0x01, 0x00, 0x80, 0x16, "", "ratios", 0, &_Array, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_colors = {0x01, 0x00, 0x80, 0x16, "", "colors", 0, &_Array, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; +static varinfo_t flash_filters_GradientBevelFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; +static methodinfo_t flash_filters_GradientBevelFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_GradientBevelFilter, 0}; +static classinfo_t flash_text_TextRun = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextRun", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextRun_beginIndex = {0x01, 0x00, 0x80, 0x16, "", "beginIndex", 0, &_int, &flash_text_TextRun, 0}; +static varinfo_t flash_text_TextRun_endIndex = {0x01, 0x00, 0x80, 0x16, "", "endIndex", 0, &_int, &flash_text_TextRun, 0}; +static varinfo_t flash_text_TextRun_textFormat = {0x01, 0x00, 0x80, 0x16, "", "textFormat", 0, &flash_text_TextFormat, &flash_text_TextRun, 0}; +static classinfo_t flash_text_TextColorType = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextColorType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextColorType_DARK_COLOR = {0x01, 0x00, 0x82, 0x16, "", "DARK_COLOR", 0, &_String, &flash_text_TextColorType, 0}; +static varinfo_t flash_text_TextColorType_LIGHT_COLOR = {0x01, 0x00, 0x82, 0x16, "", "LIGHT_COLOR", 0, &_String, &flash_text_TextColorType, 0}; +static methodinfo_t flash_sampler_getSampleCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSampleCount", 0, &_Number, 0, 0}; +static classinfo_t flash_net_URLRequestHeader = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLRequestHeader", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_URLRequestHeader_value = {0x01, 0x00, 0x80, 0x16, "", "value", 0, &_String, &flash_net_URLRequestHeader, 0}; +static varinfo_t flash_net_URLRequestHeader_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_net_URLRequestHeader, 0}; +static methodinfo_t flash_profiler_showRedrawRegions = {0x02, 0x00, 0x82, 0x16, "flash.profiler", "showRedrawRegions", 0, &voidclass, 0, 0}; +static classinfo_t flash_display_ShaderData = {0x03, 0x00, 0x89, 0x16, "flash.display", "ShaderData", 0, &_Object, interfaces: {0}}; +static classinfo_t flash_text_engine_TextLine = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLine", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; +static varinfo_t flash_text_engine_TextLine_previousLine = {0x01, 0x00, 0x80, 0x16, "", "previousLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_validity = {0x01, 0x00, 0x80, 0x16, "", "validity", 0, &_String, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockBeginIndex = {0x02, 0x00, 0x80, 0x16, "", "getAtomTextBlockBeginIndex", 0, &_int, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomWordBoundaryOnLeft = {0x02, 0x00, 0x80, 0x16, "", "getAtomWordBoundaryOnLeft", 0, &_Boolean, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomTextRotation = {0x02, 0x00, 0x80, 0x16, "", "getAtomTextRotation", 0, &_String, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_textHeight = {0x01, 0x00, 0x80, 0x16, "", "textHeight", 0, &_Number, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomCenter = {0x02, 0x00, 0x80, 0x16, "", "getAtomCenter", 0, &_Number, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomBounds = {0x02, 0x00, 0x80, 0x16, "", "getAtomBounds", 0, &flash_geom_Rectangle, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_mirrorRegions = {0x01, 0x00, 0x80, 0x16, "", "mirrorRegions", 0, &__AS3___vec_Vector, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_rawTextLength = {0x01, 0x00, 0x80, 0x16, "", "rawTextLength", 0, &_int, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_userData = {0x01, 0x00, 0x80, 0x16, "", "userData", 0, 0, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_textWidth = {0x01, 0x00, 0x80, 0x16, "", "textWidth", 0, &_Number, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_textBlock = {0x01, 0x00, 0x80, 0x16, "", "textBlock", 0, &flash_text_engine_TextBlock, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_textBlockBeginIndex = {0x01, 0x00, 0x80, 0x16, "", "textBlockBeginIndex", 0, &_int, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_unjustifiedTextWidth = {0x01, 0x00, 0x80, 0x16, "", "unjustifiedTextWidth", 0, &_Number, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_ascent = {0x01, 0x00, 0x80, 0x16, "", "ascent", 0, &_Number, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getBaselinePosition = {0x02, 0x00, 0x80, 0x16, "", "getBaselinePosition", 0, &_Number, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_specifiedWidth = {0x01, 0x00, 0x80, 0x16, "", "specifiedWidth", 0, &_Number, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getMirrorRegion = {0x02, 0x00, 0x80, 0x16, "", "getMirrorRegion", 0, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomGraphic = {0x02, 0x00, 0x80, 0x16, "", "getAtomGraphic", 0, &flash_display_DisplayObject, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_hasGraphicElement = {0x01, 0x00, 0x80, 0x16, "", "hasGraphicElement", 0, &_Boolean, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_flushAtomData = {0x02, 0x00, 0x80, 0x16, "", "flushAtomData", 0, &voidclass, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_dump = {0x02, 0x00, 0x80, 0x16, "", "dump", 0, &_String, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_nextLine = {0x01, 0x00, 0x80, 0x16, "", "nextLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtCharIndex = {0x02, 0x00, 0x80, 0x16, "", "getAtomIndexAtCharIndex", 0, &_int, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockEndIndex = {0x02, 0x00, 0x80, 0x16, "", "getAtomTextBlockEndIndex", 0, &_int, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_atomCount = {0x01, 0x00, 0x80, 0x16, "", "atomCount", 0, &_int, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_descent = {0x01, 0x00, 0x80, 0x16, "", "descent", 0, &_Number, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomBidiLevel = {0x02, 0x00, 0x80, 0x16, "", "getAtomBidiLevel", 0, &_int, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtPoint = {0x02, 0x00, 0x80, 0x16, "", "getAtomIndexAtPoint", 0, &_int, &flash_text_engine_TextLine, 0}; +static varinfo_t flash_text_engine_TextLine_MAX_LINE_WIDTH = {0x01, 0x00, 0x82, 0x16, "", "MAX_LINE_WIDTH", 0, &_int, &flash_text_engine_TextLine, 0}; +static methodinfo_t flash_sampler_getSamples = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSamples", 0, &_Object, 0, 0}; +static classinfo_t flash_net_URLRequest = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLRequest", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_URLRequest_contentType = {0x01, 0x00, 0x80, 0x16, "", "contentType", 0, &_String, &flash_net_URLRequest, 0}; +static varinfo_t flash_net_URLRequest_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_net_URLRequest, 0}; +static varinfo_t flash_net_URLRequest_requestHeaders = {0x01, 0x00, 0x80, 0x16, "", "requestHeaders", 0, &_Array, &flash_net_URLRequest, 0}; +static varinfo_t flash_net_URLRequest_method = {0x01, 0x00, 0x80, 0x16, "", "method", 0, &_String, &flash_net_URLRequest, 0}; +static varinfo_t flash_net_URLRequest_digest = {0x01, 0x00, 0x80, 0x16, "", "digest", 0, &_String, &flash_net_URLRequest, 0}; +static varinfo_t flash_net_URLRequest_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &_Object, &flash_net_URLRequest, 0}; +static classinfo_t _URIError = {0x03, 0x00, 0x88, 0x16, "", "URIError", 0, &_Error, interfaces: {0}}; +static varinfo_t _URIError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_URIError, 0}; +static methodinfo_t flash_net_getClassByAlias = {0x02, 0x00, 0x82, 0x16, "flash.net", "getClassByAlias", 0, &_Class, 0, 0}; +static classinfo_t flash_display_ShaderParameter = {0x03, 0x00, 0x89, 0x16, "flash.display", "ShaderParameter", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ShaderParameter_value = {0x01, 0x00, 0x80, 0x16, "", "value", 0, &_Array, &flash_display_ShaderParameter, 0}; +static varinfo_t flash_display_ShaderParameter_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_display_ShaderParameter, 0}; +static varinfo_t flash_display_ShaderParameter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_display_ShaderParameter, 0}; +static classinfo_t flash_filters_BitmapFilterType = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BitmapFilterType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_filters_BitmapFilterType_FULL = {0x01, 0x00, 0x82, 0x16, "", "FULL", 0, &_String, &flash_filters_BitmapFilterType, 0}; +static varinfo_t flash_filters_BitmapFilterType_INNER = {0x01, 0x00, 0x82, 0x16, "", "INNER", 0, &_String, &flash_filters_BitmapFilterType, 0}; +static varinfo_t flash_filters_BitmapFilterType_OUTER = {0x01, 0x00, 0x82, 0x16, "", "OUTER", 0, &_String, &flash_filters_BitmapFilterType, 0}; +static classinfo_t _SecurityError = {0x03, 0x00, 0x88, 0x16, "", "SecurityError", 0, &_Error, interfaces: {0}}; +static varinfo_t _SecurityError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_SecurityError, 0}; +static classinfo_t flash_utils_IDataInput = {0x03, 0x00, 0x90, 0x16, "flash.utils", "IDataInput", 0, 0, interfaces: {0}}; +static methodinfo_t flash_utils_IDataInput_readUTF = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUTF", 0, &_String, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readByte", 0, &_int, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readUTFBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUTFBytes", 0, &_String, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readShort = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readShort", 0, &_int, &flash_utils_IDataInput, 0}; +static varinfo_t flash_utils_IDataInput_objectEncoding = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "objectEncoding", 0, &_uint, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readUnsignedInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUnsignedInt", 0, &_uint, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readDouble = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readDouble", 0, &_Number, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readBytes", 0, &voidclass, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readUnsignedByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUnsignedByte", 0, &_uint, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readMultiByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readMultiByte", 0, &_String, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readInt", 0, &_int, &flash_utils_IDataInput, 0}; +static varinfo_t flash_utils_IDataInput_bytesAvailable = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "bytesAvailable", 0, &_uint, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readUnsignedShort = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUnsignedShort", 0, &_uint, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readObject = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readObject", 0, 0, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readFloat = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readFloat", 0, &_Number, &flash_utils_IDataInput, 0}; +static varinfo_t flash_utils_IDataInput_endian = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "endian", 0, &_String, &flash_utils_IDataInput, 0}; +static methodinfo_t flash_utils_IDataInput_readBoolean = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readBoolean", 0, &_Boolean, &flash_utils_IDataInput, 0}; +static classinfo_t flash_events_IEventDispatcher = {0x03, 0x00, 0x90, 0x16, "flash.events", "IEventDispatcher", 0, 0, interfaces: {0}}; +static methodinfo_t flash_events_IEventDispatcher_willTrigger = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "willTrigger", 0, &_Boolean, &flash_events_IEventDispatcher, 0}; +static methodinfo_t flash_events_IEventDispatcher_removeEventListener = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "removeEventListener", 0, &voidclass, &flash_events_IEventDispatcher, 0}; +static methodinfo_t flash_events_IEventDispatcher_hasEventListener = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "hasEventListener", 0, &_Boolean, &flash_events_IEventDispatcher, 0}; +static methodinfo_t flash_events_IEventDispatcher_addEventListener = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "addEventListener", 0, &voidclass, &flash_events_IEventDispatcher, 0}; +static methodinfo_t flash_events_IEventDispatcher_dispatchEvent = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "dispatchEvent", 0, &_Boolean, &flash_events_IEventDispatcher, 0}; +static classinfo_t _Class = {0x03, 0x00, 0x88, 0x16, "", "Class", 0, &_Object, interfaces: {0}}; +static varinfo_t _Class_prototype = {0x01, 0x00, 0x80, 0x16, "", "prototype", 0, 0, &_Class, 0}; +static varinfo_t _Class_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Class, 0}; +static classinfo_t flash_geom_Rectangle = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Rectangle", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_geom_Rectangle_top = {0x01, 0x00, 0x80, 0x16, "", "top", 0, &_Number, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_intersection = {0x02, 0x00, 0x80, 0x16, "", "intersection", 0, &flash_geom_Rectangle, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_intersects = {0x02, 0x00, 0x80, 0x16, "", "intersects", 0, &_Boolean, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_containsPoint = {0x02, 0x00, 0x80, 0x16, "", "containsPoint", 0, &_Boolean, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_setEmpty = {0x02, 0x00, 0x80, 0x16, "", "setEmpty", 0, &voidclass, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_topLeft = {0x01, 0x00, 0x80, 0x16, "", "topLeft", 0, &flash_geom_Point, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_containsRect = {0x02, 0x00, 0x80, 0x16, "", "containsRect", 0, &_Boolean, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_isEmpty = {0x02, 0x00, 0x80, 0x16, "", "isEmpty", 0, &_Boolean, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_equals = {0x02, 0x00, 0x80, 0x16, "", "equals", 0, &_Boolean, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_left = {0x01, 0x00, 0x80, 0x16, "", "left", 0, &_Number, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_inflate = {0x02, 0x00, 0x80, 0x16, "", "inflate", 0, &voidclass, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_inflatePoint = {0x02, 0x00, 0x80, 0x16, "", "inflatePoint", 0, &voidclass, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_offsetPoint = {0x02, 0x00, 0x80, 0x16, "", "offsetPoint", 0, &voidclass, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &flash_geom_Point, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_bottomRight = {0x01, 0x00, 0x80, 0x16, "", "bottomRight", 0, &flash_geom_Point, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_right = {0x01, 0x00, 0x80, 0x16, "", "right", 0, &_Number, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_contains = {0x02, 0x00, 0x80, 0x16, "", "contains", 0, &_Boolean, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_union = {0x02, 0x00, 0x80, 0x16, "", "union", 0, &flash_geom_Rectangle, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_bottom = {0x01, 0x00, 0x80, 0x16, "", "bottom", 0, &_Number, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Rectangle, &flash_geom_Rectangle, 0}; +static varinfo_t flash_geom_Rectangle_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_geom_Rectangle, 0}; +static methodinfo_t flash_geom_Rectangle_offset = {0x02, 0x00, 0x80, 0x16, "", "offset", 0, &voidclass, &flash_geom_Rectangle, 0}; +static classinfo_t flash_events_SecurityErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "SecurityErrorEvent", 0, &flash_events_ErrorEvent, interfaces: {0}}; +static methodinfo_t flash_events_SecurityErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_SecurityErrorEvent, 0}; +static methodinfo_t flash_events_SecurityErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_SecurityErrorEvent, 0}; +static varinfo_t flash_events_SecurityErrorEvent_SECURITY_ERROR = {0x01, 0x00, 0x82, 0x16, "", "SECURITY_ERROR", 0, &_String, &flash_events_SecurityErrorEvent, 0}; +static classinfo_t flash_net_IDynamicPropertyWriter = {0x03, 0x00, 0x90, 0x16, "flash.net", "IDynamicPropertyWriter", 0, 0, interfaces: {0}}; +static methodinfo_t flash_net_IDynamicPropertyWriter_writeDynamicProperties = {0x02, 0x00, 0x80, 0x08, "flash.net:IDynamicPropertyWriter", "writeDynamicProperties", 0, &voidclass, &flash_net_IDynamicPropertyWriter, 0}; +static classinfo_t flash_display_InterpolationMethod = {0x03, 0x00, 0x81, 0x16, "flash.display", "InterpolationMethod", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_InterpolationMethod_RGB = {0x01, 0x00, 0x82, 0x16, "", "RGB", 0, &_String, &flash_display_InterpolationMethod, 0}; +static varinfo_t flash_display_InterpolationMethod_LINEAR_RGB = {0x01, 0x00, 0x82, 0x16, "", "LINEAR_RGB", 0, &_String, &flash_display_InterpolationMethod, 0}; +static classinfo_t _Object = {0x03, 0x00, 0x88, 0x16, "", "Object", 0, 0, interfaces: {0}}; +static methodinfo_t _Object_propertyIsEnumerable = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "propertyIsEnumerable", 0, &_Boolean, &_Object, 0}; +static methodinfo_t _Object_isPrototypeOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "isPrototypeOf", 0, &_Boolean, &_Object, 0}; +static methodinfo_t _Object_hasOwnProperty = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasOwnProperty", 0, &_Boolean, &_Object, 0}; +static methodinfo_t _Object_init = {0x02, 0x00, 0x82, 0x17, "", "init", 0, 0, &_Object, 0}; +static varinfo_t _Object_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Object, 0}; +static methodinfo_t _Object__setPropertyIsEnumerable = {0x02, 0x00, 0x82, 0x1a, "", "_setPropertyIsEnumerable", 0, &voidclass, &_Object, 0}; +static methodinfo_t _Object__dontEnumPrototype = {0x02, 0x00, 0x82, 0x1a, "", "_dontEnumPrototype", 0, &voidclass, &_Object, 0}; +static classinfo_t flash_errors_EOFError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "EOFError", 0, &flash_errors_IOError, interfaces: {0}}; +static classinfo_t flash_net_NetStream = {0x03, 0x00, 0x80, 0x16, "flash.net", "NetStream", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_NetStream_videoCodec = {0x01, 0x00, 0x80, 0x16, "", "videoCodec", 0, &_uint, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_info = {0x01, 0x00, 0x80, 0x16, "", "info", 0, &flash_net_NetStreamInfo, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_attachCamera = {0x02, 0x00, 0x80, 0x16, "", "attachCamera", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_farNonce = {0x01, 0x00, 0x80, 0x16, "", "farNonce", 0, &_String, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_pause = {0x02, 0x00, 0x80, 0x16, "", "pause", 0, &voidclass, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_onPeerConnect = {0x02, 0x00, 0x80, 0x16, "", "onPeerConnect", 0, &_Boolean, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_resume = {0x02, 0x00, 0x80, 0x16, "", "resume", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_liveDelay = {0x01, 0x00, 0x80, 0x16, "", "liveDelay", 0, &_Number, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_peerStreams = {0x01, 0x00, 0x80, 0x16, "", "peerStreams", 0, &_Array, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_receiveVideo = {0x02, 0x00, 0x80, 0x16, "", "receiveVideo", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_maxPauseBufferTime = {0x01, 0x00, 0x80, 0x16, "", "maxPauseBufferTime", 0, &_Number, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_play2 = {0x02, 0x00, 0x80, 0x16, "", "play2", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_audioCodec = {0x01, 0x00, 0x80, 0x16, "", "audioCodec", 0, &_uint, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_receiveVideoFPS = {0x02, 0x00, 0x80, 0x16, "", "receiveVideoFPS", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_farID = {0x01, 0x00, 0x80, 0x16, "", "farID", 0, &_String, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_receiveAudio = {0x02, 0x00, 0x80, 0x16, "", "receiveAudio", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_bufferLength = {0x01, 0x00, 0x80, 0x16, "", "bufferLength", 0, &_Number, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_seek = {0x02, 0x00, 0x80, 0x16, "", "seek", 0, &voidclass, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_attachAudio = {0x02, 0x00, 0x80, 0x16, "", "attachAudio", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_bufferTime = {0x01, 0x00, 0x80, 0x16, "", "bufferTime", 0, &_Number, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_play = {0x02, 0x00, 0x80, 0x16, "", "play", 0, &voidclass, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_publish = {0x02, 0x00, 0x80, 0x16, "", "publish", 0, &voidclass, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_togglePause = {0x02, 0x00, 0x80, 0x16, "", "togglePause", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_checkPolicyFile = {0x01, 0x00, 0x80, 0x16, "", "checkPolicyFile", 0, &_Boolean, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_nearNonce = {0x01, 0x00, 0x80, 0x16, "", "nearNonce", 0, &_String, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_decodedFrames = {0x01, 0x00, 0x80, 0x16, "", "decodedFrames", 0, &_uint, &flash_net_NetStream, 0}; +static methodinfo_t flash_net_NetStream_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_currentFPS = {0x01, 0x00, 0x80, 0x16, "", "currentFPS", 0, &_Number, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_time = {0x01, 0x00, 0x80, 0x16, "", "time", 0, &_Number, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_CONNECT_TO_FMS = {0x01, 0x00, 0x82, 0x16, "", "CONNECT_TO_FMS", 0, &_String, &flash_net_NetStream, 0}; +static varinfo_t flash_net_NetStream_DIRECT_CONNECTIONS = {0x01, 0x00, 0x82, 0x16, "", "DIRECT_CONNECTIONS", 0, &_String, &flash_net_NetStream, 0}; +static classinfo_t _ArgumentError = {0x03, 0x00, 0x88, 0x16, "", "ArgumentError", 0, &_Error, interfaces: {0}}; +static varinfo_t _ArgumentError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_ArgumentError, 0}; +static classinfo_t _XMLList = {0x03, 0x00, 0x89, 0x16, "", "XMLList", 0, &_Object, interfaces: {0}}; +static methodinfo_t _XMLList_normalize = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "normalize", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_removeNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "removeNamespace", 0, &_XML, &_XMLList, 0}; +static methodinfo_t _XMLList_prependChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "prependChild", 0, &_XML, &_XMLList, 0}; +static methodinfo_t _XMLList_toXMLString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toXMLString", 0, &_String, &_XMLList, 0}; +static methodinfo_t _XMLList_nodeKind = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "nodeKind", 0, &_String, &_XMLList, 0}; +static methodinfo_t _XMLList_copy = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "copy", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_text = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "text", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_XMLList, 0}; +static methodinfo_t _XMLList_childIndex = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "childIndex", 0, &_int, &_XMLList, 0}; +static methodinfo_t _XMLList_setName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setName", 0, &voidclass, &_XMLList, 0}; +static methodinfo_t _XMLList_setLocalName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setLocalName", 0, &voidclass, &_XMLList, 0}; +static methodinfo_t _XMLList_namespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespace", 0, 0, &_XMLList, 0}; +static methodinfo_t _XMLList_insertChildBefore = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildBefore", 0, 0, &_XMLList, 0}; +static methodinfo_t _XMLList_addNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "addNamespace", 0, &_XML, &_XMLList, 0}; +static methodinfo_t _XMLList_propertyIsEnumerable = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "propertyIsEnumerable", 0, &_Boolean, &_XMLList, 0}; +static methodinfo_t _XMLList_comments = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "comments", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_attributes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attributes", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_descendants = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "descendants", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_replace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "replace", 0, &_XML, &_XMLList, 0}; +static methodinfo_t _XMLList_children = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "children", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_contains = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "contains", 0, &_Boolean, &_XMLList, 0}; +static methodinfo_t _XMLList_hasSimpleContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasSimpleContent", 0, &_Boolean, &_XMLList, 0}; +static methodinfo_t _XMLList_elements = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "elements", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_hasComplexContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasComplexContent", 0, &_Boolean, &_XMLList, 0}; +static methodinfo_t _XMLList_insertChildAfter = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildAfter", 0, 0, &_XMLList, 0}; +static methodinfo_t _XMLList_parent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "parent", 0, 0, &_XMLList, 0}; +static methodinfo_t _XMLList_length = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "length", 0, &_int, &_XMLList, 0}; +static methodinfo_t _XMLList_processingInstructions = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "processingInstructions", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_child = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "child", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_appendChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "appendChild", 0, &_XML, &_XMLList, 0}; +static methodinfo_t _XMLList_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_XMLList, &_XMLList, 0}; +static methodinfo_t _XMLList_localName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "localName", 0, &_Object, &_XMLList, 0}; +static methodinfo_t _XMLList_inScopeNamespaces = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "inScopeNamespaces", 0, &_Array, &_XMLList, 0}; +static methodinfo_t _XMLList_hasOwnProperty = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasOwnProperty", 0, &_Boolean, &_XMLList, 0}; +static methodinfo_t _XMLList_setNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setNamespace", 0, &voidclass, &_XMLList, 0}; +static methodinfo_t _XMLList_namespaceDeclarations = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespaceDeclarations", 0, &_Array, &_XMLList, 0}; +static methodinfo_t _XMLList_name = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "name", 0, &_Object, &_XMLList, 0}; +static methodinfo_t _XMLList_setChildren = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setChildren", 0, &_XML, &_XMLList, 0}; +static methodinfo_t _XMLList_attribute = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attribute", 0, &_XMLList, &_XMLList, 0}; +static classinfo_t flash_geom_Point = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Point", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_geom_Point_equals = {0x02, 0x00, 0x80, 0x16, "", "equals", 0, &_Boolean, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_normalize = {0x02, 0x00, 0x80, 0x16, "", "normalize", 0, &voidclass, &flash_geom_Point, 0}; +static varinfo_t flash_geom_Point_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_offset = {0x02, 0x00, 0x80, 0x16, "", "offset", 0, &voidclass, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_subtract = {0x02, 0x00, 0x80, 0x16, "", "subtract", 0, &flash_geom_Point, &flash_geom_Point, 0}; +static varinfo_t flash_geom_Point_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_geom_Point, 0}; +static varinfo_t flash_geom_Point_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_Number, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_add = {0x02, 0x00, 0x80, 0x16, "", "add", 0, &flash_geom_Point, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Point, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_polar = {0x02, 0x00, 0x82, 0x16, "", "polar", 0, &flash_geom_Point, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_distance = {0x02, 0x00, 0x82, 0x16, "", "distance", 0, &_Number, &flash_geom_Point, 0}; +static methodinfo_t flash_geom_Point_interpolate = {0x02, 0x00, 0x82, 0x16, "", "interpolate", 0, &flash_geom_Point, &flash_geom_Point, 0}; +static classinfo_t flash_printing_PrintJobOptions = {0x03, 0x00, 0x80, 0x16, "flash.printing", "PrintJobOptions", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_printing_PrintJobOptions_printAsBitmap = {0x01, 0x00, 0x80, 0x16, "", "printAsBitmap", 0, &_Boolean, &flash_printing_PrintJobOptions, 0}; +static classinfo_t flash_display_DisplayObject = {0x03, 0x00, 0x80, 0x16, "flash.display", "DisplayObject", 0, &flash_events_EventDispatcher, interfaces: {&flash_display_IBitmapDrawable, 0}}; +static varinfo_t flash_display_DisplayObject_rotation = {0x01, 0x00, 0x80, 0x16, "", "rotation", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_filters = {0x01, 0x00, 0x80, 0x16, "", "filters", 0, &_Array, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_rotationZ = {0x01, 0x00, 0x80, 0x16, "", "rotationZ", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_accessibilityProperties = {0x01, 0x00, 0x80, 0x16, "", "accessibilityProperties", 0, &flash_accessibility_AccessibilityProperties, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_mouseX = {0x01, 0x00, 0x80, 0x16, "", "mouseX", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_root = {0x01, 0x00, 0x80, 0x16, "", "root", 0, &flash_display_DisplayObject, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_stage = {0x01, 0x00, 0x80, 0x16, "", "stage", 0, &flash_display_Stage, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_rotationY = {0x01, 0x00, 0x80, 0x16, "", "rotationY", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_scaleZ = {0x01, 0x00, 0x80, 0x16, "", "scaleZ", 0, &_Number, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_local3DToGlobal = {0x02, 0x00, 0x80, 0x16, "", "local3DToGlobal", 0, &flash_geom_Point, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_loaderInfo = {0x01, 0x00, 0x80, 0x16, "", "loaderInfo", 0, &flash_display_LoaderInfo, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_cacheAsBitmap = {0x01, 0x00, 0x80, 0x16, "", "cacheAsBitmap", 0, &_Boolean, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_transform = {0x01, 0x00, 0x80, 0x16, "", "transform", 0, &flash_geom_Transform, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_scaleY = {0x01, 0x00, 0x80, 0x16, "", "scaleY", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_rotationX = {0x01, 0x00, 0x80, 0x16, "", "rotationX", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_scrollRect = {0x01, 0x00, 0x80, 0x16, "", "scrollRect", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_scale9Grid = {0x01, 0x00, 0x80, 0x16, "", "scale9Grid", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_parent = {0x01, 0x00, 0x80, 0x16, "", "parent", 0, &flash_display_DisplayObjectContainer, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_hitTestObject = {0x02, 0x00, 0x80, 0x16, "", "hitTestObject", 0, &_Boolean, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_hitTestPoint = {0x02, 0x00, 0x80, 0x16, "", "hitTestPoint", 0, &_Boolean, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_getRect = {0x02, 0x00, 0x80, 0x16, "", "getRect", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_opaqueBackground = {0x01, 0x00, 0x80, 0x16, "", "opaqueBackground", 0, &_Object, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_globalToLocal3D = {0x02, 0x00, 0x80, 0x16, "", "globalToLocal3D", 0, &flash_geom_Vector3D, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_visible = {0x01, 0x00, 0x80, 0x16, "", "visible", 0, &_Boolean, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_blendMode = {0x01, 0x00, 0x80, 0x16, "", "blendMode", 0, &_String, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_scaleX = {0x01, 0x00, 0x80, 0x16, "", "scaleX", 0, &_Number, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_globalToLocal = {0x02, 0x00, 0x80, 0x16, "", "globalToLocal", 0, &flash_geom_Point, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_localToGlobal = {0x02, 0x00, 0x80, 0x16, "", "localToGlobal", 0, &flash_geom_Point, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_z = {0x01, 0x00, 0x80, 0x16, "", "z", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_display_DisplayObject, 0}; +static methodinfo_t flash_display_DisplayObject_getBounds = {0x02, 0x00, 0x80, 0x16, "", "getBounds", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_mask = {0x01, 0x00, 0x80, 0x16, "", "mask", 0, &flash_display_DisplayObject, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_mouseY = {0x01, 0x00, 0x80, 0x16, "", "mouseY", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_display_DisplayObject, 0}; +static varinfo_t flash_display_DisplayObject_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_display_DisplayObject, 0}; +static classinfo_t flash_sampler_DeleteObjectSample = {0x03, 0x00, 0x81, 0x16, "flash.sampler", "DeleteObjectSample", 0, &flash_sampler_Sample, interfaces: {0}}; +static varinfo_t flash_sampler_DeleteObjectSample_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_Number, &flash_sampler_DeleteObjectSample, 0}; +static varinfo_t flash_sampler_DeleteObjectSample_id = {0x01, 0x00, 0x80, 0x16, "", "id", 0, &_Number, &flash_sampler_DeleteObjectSample, 0}; +static methodinfo_t flash_system_fscommand = {0x02, 0x00, 0x82, 0x16, "flash.system", "fscommand", 0, &voidclass, 0, 0}; +static methodinfo_t flash_utils_unescapeMultiByte = {0x02, 0x00, 0x82, 0x16, "flash.utils", "unescapeMultiByte", 0, &_String, 0, 0}; +static classinfo_t flash_sampler_StackFrame = {0x03, 0x00, 0x81, 0x16, "flash.sampler", "StackFrame", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_sampler_StackFrame_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_sampler_StackFrame, 0}; +static varinfo_t flash_sampler_StackFrame_line = {0x01, 0x00, 0x80, 0x16, "", "line", 0, &_uint, &flash_sampler_StackFrame, 0}; +static methodinfo_t flash_sampler_StackFrame_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_sampler_StackFrame, 0}; +static varinfo_t flash_sampler_StackFrame_file = {0x01, 0x00, 0x80, 0x16, "", "file", 0, &_String, &flash_sampler_StackFrame, 0}; +static classinfo_t flash_system_JPEGLoaderContext = {0x03, 0x00, 0x80, 0x16, "flash.system", "JPEGLoaderContext", 0, &flash_system_LoaderContext, interfaces: {0}}; +static varinfo_t flash_system_JPEGLoaderContext_deblockingFilter = {0x01, 0x00, 0x80, 0x16, "", "deblockingFilter", 0, &_Number, &flash_system_JPEGLoaderContext, 0}; +static classinfo_t flash_system_IME = {0x03, 0x00, 0x81, 0x16, "flash.system", "IME", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_system_IME_setCompositionString = {0x02, 0x00, 0x82, 0x16, "", "setCompositionString", 0, &voidclass, &flash_system_IME, 0}; +static varinfo_t flash_system_IME_enabled = {0x01, 0x00, 0x82, 0x16, "", "enabled", 0, &_Boolean, &flash_system_IME, 0}; +static methodinfo_t flash_system_IME_doConversion = {0x02, 0x00, 0x82, 0x16, "", "doConversion", 0, &voidclass, &flash_system_IME, 0}; +static varinfo_t flash_system_IME_conversionMode = {0x01, 0x00, 0x82, 0x16, "", "conversionMode", 0, &_String, &flash_system_IME, 0}; +static methodinfo_t _isNaN = {0x02, 0x00, 0x82, 0x16, "", "isNaN", 0, &_Boolean, 0, 0}; +static classinfo_t flash_system_Security = {0x03, 0x00, 0x81, 0x16, "flash.system", "Security", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_system_Security_sandboxType = {0x01, 0x00, 0x82, 0x16, "", "sandboxType", 0, &_String, &flash_system_Security, 0}; +static varinfo_t flash_system_Security_LOCAL_WITH_NETWORK = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_WITH_NETWORK", 0, &_String, &flash_system_Security, 0}; +static methodinfo_t flash_system_Security_loadPolicyFile = {0x02, 0x00, 0x82, 0x16, "", "loadPolicyFile", 0, &voidclass, &flash_system_Security, 0}; +static methodinfo_t flash_system_Security_allowDomain = {0x02, 0x00, 0x82, 0x16, "", "allowDomain", 0, &voidclass, &flash_system_Security, 0}; +static methodinfo_t flash_system_Security_showSettings = {0x02, 0x00, 0x82, 0x16, "", "showSettings", 0, &voidclass, &flash_system_Security, 0}; +static varinfo_t flash_system_Security_LOCAL_TRUSTED = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_TRUSTED", 0, &_String, &flash_system_Security, 0}; +static varinfo_t flash_system_Security_disableAVM1Loading = {0x01, 0x00, 0x82, 0x16, "", "disableAVM1Loading", 0, &_Boolean, &flash_system_Security, 0}; +static methodinfo_t flash_system_Security_allowInsecureDomain = {0x02, 0x00, 0x82, 0x16, "", "allowInsecureDomain", 0, &voidclass, &flash_system_Security, 0}; +static varinfo_t flash_system_Security_exactSettings = {0x01, 0x00, 0x82, 0x16, "", "exactSettings", 0, &_Boolean, &flash_system_Security, 0}; +static varinfo_t flash_system_Security_REMOTE = {0x01, 0x00, 0x82, 0x16, "", "REMOTE", 0, &_String, &flash_system_Security, 0}; +static varinfo_t flash_system_Security_LOCAL_WITH_FILE = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_WITH_FILE", 0, &_String, &flash_system_Security, 0}; +static classinfo_t flash_display_Bitmap = {0x03, 0x00, 0x80, 0x16, "flash.display", "Bitmap", 0, &flash_display_DisplayObject, interfaces: {0}}; +static varinfo_t flash_display_Bitmap_pixelSnapping = {0x01, 0x00, 0x80, 0x16, "", "pixelSnapping", 0, &_String, &flash_display_Bitmap, 0}; +static varinfo_t flash_display_Bitmap_bitmapData = {0x01, 0x00, 0x80, 0x16, "", "bitmapData", 0, &flash_display_BitmapData, &flash_display_Bitmap, 0}; +static varinfo_t flash_display_Bitmap_smoothing = {0x01, 0x00, 0x80, 0x16, "", "smoothing", 0, &_Boolean, &flash_display_Bitmap, 0}; +static classinfo_t flash_printing_PrintJob = {0x03, 0x00, 0x80, 0x16, "flash.printing", "PrintJob", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_printing_PrintJob_paperWidth = {0x01, 0x00, 0x80, 0x16, "", "paperWidth", 0, &_int, &flash_printing_PrintJob, 0}; +static methodinfo_t flash_printing_PrintJob_addPage = {0x02, 0x00, 0x80, 0x16, "", "addPage", 0, &voidclass, &flash_printing_PrintJob, 0}; +static varinfo_t flash_printing_PrintJob_pageHeight = {0x01, 0x00, 0x80, 0x16, "", "pageHeight", 0, &_int, &flash_printing_PrintJob, 0}; +static methodinfo_t flash_printing_PrintJob_start = {0x02, 0x00, 0x80, 0x16, "", "start", 0, &_Boolean, &flash_printing_PrintJob, 0}; +static varinfo_t flash_printing_PrintJob_pageWidth = {0x01, 0x00, 0x80, 0x16, "", "pageWidth", 0, &_int, &flash_printing_PrintJob, 0}; +static methodinfo_t flash_printing_PrintJob_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_printing_PrintJob, 0}; +static varinfo_t flash_printing_PrintJob_paperHeight = {0x01, 0x00, 0x80, 0x16, "", "paperHeight", 0, &_int, &flash_printing_PrintJob, 0}; +static varinfo_t flash_printing_PrintJob_orientation = {0x01, 0x00, 0x80, 0x16, "", "orientation", 0, &_String, &flash_printing_PrintJob, 0}; +static classinfo_t flash_text_StaticText = {0x03, 0x00, 0x81, 0x16, "flash.text", "StaticText", 0, &flash_display_DisplayObject, interfaces: {0}}; +static varinfo_t flash_text_StaticText_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_text_StaticText, 0}; +static classinfo_t flash_text_engine_SpaceJustifier = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "SpaceJustifier", 0, &flash_text_engine_TextJustifier, interfaces: {0}}; +static methodinfo_t flash_text_engine_SpaceJustifier_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_TextJustifier, &flash_text_engine_SpaceJustifier, 0}; +static varinfo_t flash_text_engine_SpaceJustifier_letterSpacing = {0x01, 0x00, 0x80, 0x16, "", "letterSpacing", 0, &_Boolean, &flash_text_engine_SpaceJustifier, 0}; +static classinfo_t flash_events_DataEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "DataEvent", 0, &flash_events_TextEvent, interfaces: {0}}; +static methodinfo_t flash_events_DataEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_DataEvent, 0}; +static methodinfo_t flash_events_DataEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_DataEvent, 0}; +static varinfo_t flash_events_DataEvent_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &_String, &flash_events_DataEvent, 0}; +static varinfo_t flash_events_DataEvent_DATA = {0x01, 0x00, 0x82, 0x16, "", "DATA", 0, &_String, &flash_events_DataEvent, 0}; +static varinfo_t flash_events_DataEvent_UPLOAD_COMPLETE_DATA = {0x01, 0x00, 0x82, 0x16, "", "UPLOAD_COMPLETE_DATA", 0, &_String, &flash_events_DataEvent, 0}; +static classinfo_t flash_events_ActivityEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ActivityEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_ActivityEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ActivityEvent, 0}; +static varinfo_t flash_events_ActivityEvent_activating = {0x01, 0x00, 0x80, 0x16, "", "activating", 0, &_Boolean, &flash_events_ActivityEvent, 0}; +static methodinfo_t flash_events_ActivityEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ActivityEvent, 0}; +static varinfo_t flash_events_ActivityEvent_ACTIVITY = {0x01, 0x00, 0x82, 0x16, "", "ACTIVITY", 0, &_String, &flash_events_ActivityEvent, 0}; +static classinfo_t flash_display_GraphicsEndFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsEndFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; +static classinfo_t flash_display_ColorCorrection = {0x03, 0x00, 0x81, 0x16, "flash.display", "ColorCorrection", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ColorCorrection_OFF = {0x01, 0x00, 0x82, 0x16, "", "OFF", 0, &_String, &flash_display_ColorCorrection, 0}; +static varinfo_t flash_display_ColorCorrection_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_display_ColorCorrection, 0}; +static varinfo_t flash_display_ColorCorrection_ON = {0x01, 0x00, 0x82, 0x16, "", "ON", 0, &_String, &flash_display_ColorCorrection, 0}; +static classinfo_t flash_events_IOErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "IOErrorEvent", 0, &flash_events_ErrorEvent, interfaces: {0}}; +static methodinfo_t flash_events_IOErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_IOErrorEvent, 0}; +static methodinfo_t flash_events_IOErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_IOErrorEvent, 0}; +static varinfo_t flash_events_IOErrorEvent_IO_ERROR = {0x01, 0x00, 0x82, 0x16, "", "IO_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; +static varinfo_t flash_events_IOErrorEvent_VERIFY_ERROR = {0x01, 0x00, 0x82, 0x16, "", "VERIFY_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; +static varinfo_t flash_events_IOErrorEvent_NETWORK_ERROR = {0x01, 0x00, 0x82, 0x16, "", "NETWORK_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; +static varinfo_t flash_events_IOErrorEvent_DISK_ERROR = {0x01, 0x00, 0x82, 0x16, "", "DISK_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; +static classinfo_t flash_display_GraphicsStroke = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsStroke", 0, &_Object, interfaces: {&flash_display_IGraphicsStroke, &flash_display_IGraphicsData, 0}}; +static varinfo_t flash_display_GraphicsStroke_scaleMode = {0x01, 0x00, 0x80, 0x16, "", "scaleMode", 0, &_String, &flash_display_GraphicsStroke, 0}; +static varinfo_t flash_display_GraphicsStroke_miterLimit = {0x01, 0x00, 0x80, 0x16, "", "miterLimit", 0, &_Number, &flash_display_GraphicsStroke, 0}; +static varinfo_t flash_display_GraphicsStroke_pixelHinting = {0x01, 0x00, 0x80, 0x16, "", "pixelHinting", 0, &_Boolean, &flash_display_GraphicsStroke, 0}; +static varinfo_t flash_display_GraphicsStroke_fill = {0x01, 0x00, 0x80, 0x16, "", "fill", 0, &flash_display_IGraphicsFill, &flash_display_GraphicsStroke, 0}; +static varinfo_t flash_display_GraphicsStroke_thickness = {0x01, 0x00, 0x80, 0x16, "", "thickness", 0, &_Number, &flash_display_GraphicsStroke, 0}; +static varinfo_t flash_display_GraphicsStroke_joints = {0x01, 0x00, 0x80, 0x16, "", "joints", 0, &_String, &flash_display_GraphicsStroke, 0}; +static varinfo_t flash_display_GraphicsStroke_caps = {0x01, 0x00, 0x80, 0x16, "", "caps", 0, &_String, &flash_display_GraphicsStroke, 0}; +static classinfo_t _Boolean = {0x03, 0x00, 0x81, 0x16, "", "Boolean", 0, &_Object, interfaces: {0}}; +static methodinfo_t _Boolean_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_Boolean, &_Boolean, 0}; +static methodinfo_t _Boolean_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Boolean, 0}; +static varinfo_t _Boolean_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Boolean, 0}; +static methodinfo_t flash_sampler_getMemberNames = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getMemberNames", 0, &_Object, 0, 0}; +static methodinfo_t flash_utils_getQualifiedClassName = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getQualifiedClassName", 0, &_String, 0, 0}; +static classinfo_t flash_text_engine_GraphicElement = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "GraphicElement", 0, &flash_text_engine_ContentElement, interfaces: {0}}; +static varinfo_t flash_text_engine_GraphicElement_graphic = {0x01, 0x00, 0x80, 0x16, "", "graphic", 0, &flash_display_DisplayObject, &flash_text_engine_GraphicElement, 0}; +static varinfo_t flash_text_engine_GraphicElement_elementWidth = {0x01, 0x00, 0x80, 0x16, "", "elementWidth", 0, &_Number, &flash_text_engine_GraphicElement, 0}; +static varinfo_t flash_text_engine_GraphicElement_elementHeight = {0x01, 0x00, 0x80, 0x16, "", "elementHeight", 0, &_Number, &flash_text_engine_GraphicElement, 0}; +static classinfo_t flash_media_Microphone = {0x03, 0x00, 0x81, 0x16, "flash.media", "Microphone", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_media_Microphone_codec = {0x01, 0x00, 0x80, 0x16, "", "codec", 0, &_String, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_gain = {0x01, 0x00, 0x80, 0x16, "", "gain", 0, &_Number, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_media_Microphone, 0}; +static methodinfo_t flash_media_Microphone_setLoopBack = {0x02, 0x00, 0x80, 0x16, "", "setLoopBack", 0, &voidclass, &flash_media_Microphone, 0}; +static methodinfo_t flash_media_Microphone_setSilenceLevel = {0x02, 0x00, 0x80, 0x16, "", "setSilenceLevel", 0, &voidclass, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_media_Microphone, 0}; +static methodinfo_t flash_media_Microphone_setUseEchoSuppression = {0x02, 0x00, 0x80, 0x16, "", "setUseEchoSuppression", 0, &voidclass, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_framesPerPacket = {0x01, 0x00, 0x80, 0x16, "", "framesPerPacket", 0, &_int, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_muted = {0x01, 0x00, 0x80, 0x16, "", "muted", 0, &_Boolean, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_encodeQuality = {0x01, 0x00, 0x80, 0x16, "", "encodeQuality", 0, &_int, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_useEchoSuppression = {0x01, 0x00, 0x80, 0x16, "", "useEchoSuppression", 0, &_Boolean, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_silenceLevel = {0x01, 0x00, 0x80, 0x16, "", "silenceLevel", 0, &_Number, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_silenceTimeout = {0x01, 0x00, 0x80, 0x16, "", "silenceTimeout", 0, &_int, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_rate = {0x01, 0x00, 0x80, 0x16, "", "rate", 0, &_int, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_activityLevel = {0x01, 0x00, 0x80, 0x16, "", "activityLevel", 0, &_Number, &flash_media_Microphone, 0}; +static varinfo_t flash_media_Microphone_names = {0x01, 0x00, 0x82, 0x16, "", "names", 0, &_Array, &flash_media_Microphone, 0}; +static methodinfo_t flash_media_Microphone_getMicrophone = {0x02, 0x00, 0x82, 0x16, "", "getMicrophone", 0, &flash_media_Microphone, &flash_media_Microphone, 0}; +static classinfo_t flash_ui_ContextMenuClipboardItems = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenuClipboardItems", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_ui_ContextMenuClipboardItems_clear = {0x01, 0x00, 0x80, 0x16, "", "clear", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; +static methodinfo_t flash_ui_ContextMenuClipboardItems_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenuClipboardItems, &flash_ui_ContextMenuClipboardItems, 0}; +static varinfo_t flash_ui_ContextMenuClipboardItems_paste = {0x01, 0x00, 0x80, 0x16, "", "paste", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; +static varinfo_t flash_ui_ContextMenuClipboardItems_selectAll = {0x01, 0x00, 0x80, 0x16, "", "selectAll", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; +static varinfo_t flash_ui_ContextMenuClipboardItems_copy = {0x01, 0x00, 0x80, 0x16, "", "copy", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; +static varinfo_t flash_ui_ContextMenuClipboardItems_cut = {0x01, 0x00, 0x80, 0x16, "", "cut", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; +static classinfo_t flash_display_GraphicsShaderFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsShaderFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; +static varinfo_t flash_display_GraphicsShaderFill_shader = {0x01, 0x00, 0x80, 0x16, "", "shader", 0, &flash_display_Shader, &flash_display_GraphicsShaderFill, 0}; +static varinfo_t flash_display_GraphicsShaderFill_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_display_GraphicsShaderFill, 0}; +static classinfo_t flash_errors_IllegalOperationError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "IllegalOperationError", 0, &_Error, interfaces: {0}}; +static classinfo_t flash_filters_GradientGlowFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "GradientGlowFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_GradientGlowFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_alphas = {0x01, 0x00, 0x80, 0x16, "", "alphas", 0, &_Array, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_ratios = {0x01, 0x00, 0x80, 0x16, "", "ratios", 0, &_Array, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_colors = {0x01, 0x00, 0x80, 0x16, "", "colors", 0, &_Array, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; +static varinfo_t flash_filters_GradientGlowFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; +static methodinfo_t flash_filters_GradientGlowFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_GradientGlowFilter, 0}; +static classinfo_t flash_display_CapsStyle = {0x03, 0x00, 0x81, 0x16, "flash.display", "CapsStyle", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_CapsStyle_ROUND = {0x01, 0x00, 0x82, 0x16, "", "ROUND", 0, &_String, &flash_display_CapsStyle, 0}; +static varinfo_t flash_display_CapsStyle_SQUARE = {0x01, 0x00, 0x82, 0x16, "", "SQUARE", 0, &_String, &flash_display_CapsStyle, 0}; +static varinfo_t flash_display_CapsStyle_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_display_CapsStyle, 0}; +static classinfo_t flash_text_TextSnapshot = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextSnapshot", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_text_TextSnapshot_setSelectColor = {0x02, 0x00, 0x80, 0x16, "", "setSelectColor", 0, &voidclass, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_setSelected = {0x02, 0x00, 0x80, 0x16, "", "setSelected", 0, &voidclass, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_getSelectedText = {0x02, 0x00, 0x80, 0x16, "", "getSelectedText", 0, &_String, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_getTextRunInfo = {0x02, 0x00, 0x80, 0x16, "", "getTextRunInfo", 0, &_Array, &flash_text_TextSnapshot, 0}; +static varinfo_t flash_text_TextSnapshot_charCount = {0x01, 0x00, 0x80, 0x16, "", "charCount", 0, &_int, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_findText = {0x02, 0x00, 0x80, 0x16, "", "findText", 0, &_int, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_getSelected = {0x02, 0x00, 0x80, 0x16, "", "getSelected", 0, &_Boolean, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_hitTestTextNearPos = {0x02, 0x00, 0x80, 0x16, "", "hitTestTextNearPos", 0, &_Number, &flash_text_TextSnapshot, 0}; +static methodinfo_t flash_text_TextSnapshot_getText = {0x02, 0x00, 0x80, 0x16, "", "getText", 0, &_String, &flash_text_TextSnapshot, 0}; +static classinfo_t flash_text_engine_FontLookup = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontLookup", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_FontLookup_DEVICE = {0x01, 0x00, 0x82, 0x16, "", "DEVICE", 0, &_String, &flash_text_engine_FontLookup, 0}; +static varinfo_t flash_text_engine_FontLookup_EMBEDDED_CFF = {0x01, 0x00, 0x82, 0x16, "", "EMBEDDED_CFF", 0, &_String, &flash_text_engine_FontLookup, 0}; +static classinfo_t flash_display_InteractiveObject = {0x03, 0x00, 0x80, 0x16, "flash.display", "InteractiveObject", 0, &flash_display_DisplayObject, interfaces: {0}}; +static varinfo_t flash_display_InteractiveObject_tabIndex = {0x01, 0x00, 0x80, 0x16, "", "tabIndex", 0, &_int, &flash_display_InteractiveObject, 0}; +static varinfo_t flash_display_InteractiveObject_doubleClickEnabled = {0x01, 0x00, 0x80, 0x16, "", "doubleClickEnabled", 0, &_Boolean, &flash_display_InteractiveObject, 0}; +static varinfo_t flash_display_InteractiveObject_tabEnabled = {0x01, 0x00, 0x80, 0x16, "", "tabEnabled", 0, &_Boolean, &flash_display_InteractiveObject, 0}; +static varinfo_t flash_display_InteractiveObject_mouseEnabled = {0x01, 0x00, 0x80, 0x16, "", "mouseEnabled", 0, &_Boolean, &flash_display_InteractiveObject, 0}; +static varinfo_t flash_display_InteractiveObject_contextMenu = {0x01, 0x00, 0x80, 0x16, "", "contextMenu", 0, &flash_ui_ContextMenu, &flash_display_InteractiveObject, 0}; +static varinfo_t flash_display_InteractiveObject_focusRect = {0x01, 0x00, 0x80, 0x16, "", "focusRect", 0, &_Object, &flash_display_InteractiveObject, 0}; +static varinfo_t flash_display_InteractiveObject_accessibilityImplementation = {0x01, 0x00, 0x80, 0x16, "", "accessibilityImplementation", 0, &flash_accessibility_AccessibilityImplementation, &flash_display_InteractiveObject, 0}; +static classinfo_t flash_text_TextField = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextField", 0, &flash_display_InteractiveObject, interfaces: {0}}; +static methodinfo_t flash_text_TextField_getTextFormat = {0x02, 0x00, 0x80, 0x16, "", "getTextFormat", 0, &flash_text_TextFormat, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_border = {0x01, 0x00, 0x80, 0x16, "", "border", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_selectedText = {0x01, 0x00, 0x80, 0x16, "", "selectedText", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_pasteRichText = {0x02, 0x00, 0x80, 0x17, "", "pasteRichText", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_bottomScrollV = {0x01, 0x00, 0x80, 0x16, "", "bottomScrollV", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getLineIndexOfChar = {0x02, 0x00, 0x80, 0x16, "", "getLineIndexOfChar", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_replaceText = {0x02, 0x00, 0x80, 0x16, "", "replaceText", 0, &voidclass, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_defaultTextFormat = {0x01, 0x00, 0x80, 0x16, "", "defaultTextFormat", 0, &flash_text_TextFormat, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_restrict = {0x01, 0x00, 0x80, 0x16, "", "restrict", 0, &_String, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_htmlText = {0x01, 0x00, 0x80, 0x16, "", "htmlText", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_copyRichText = {0x02, 0x00, 0x80, 0x17, "", "copyRichText", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getLineText = {0x02, 0x00, 0x80, 0x16, "", "getLineText", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getFirstCharInParagraph = {0x02, 0x00, 0x80, 0x16, "", "getFirstCharInParagraph", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_setSelection = {0x02, 0x00, 0x80, 0x16, "", "setSelection", 0, &voidclass, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_wordWrap = {0x01, 0x00, 0x80, 0x16, "", "wordWrap", 0, &_Boolean, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_appendText = {0x02, 0x00, 0x80, 0x16, "", "appendText", 0, &voidclass, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_caretIndex = {0x01, 0x00, 0x80, 0x16, "", "caretIndex", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_mouseWheelEnabled = {0x01, 0x00, 0x80, 0x16, "", "mouseWheelEnabled", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_selectionBeginIndex = {0x01, 0x00, 0x80, 0x16, "", "selectionBeginIndex", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_sharpness = {0x01, 0x00, 0x80, 0x16, "", "sharpness", 0, &_Number, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getLineIndexAtPoint = {0x02, 0x00, 0x80, 0x16, "", "getLineIndexAtPoint", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getCharIndexAtPoint = {0x02, 0x00, 0x80, 0x16, "", "getCharIndexAtPoint", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getXMLText = {0x02, 0x00, 0x80, 0x16, "", "getXMLText", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getParagraphLength = {0x02, 0x00, 0x80, 0x16, "", "getParagraphLength", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getRawText = {0x02, 0x00, 0x80, 0x16, "", "getRawText", 0, &_String, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_gridFitType = {0x01, 0x00, 0x80, 0x16, "", "gridFitType", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getLineOffset = {0x02, 0x00, 0x80, 0x16, "", "getLineOffset", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_backgroundColor = {0x01, 0x00, 0x80, 0x16, "", "backgroundColor", 0, &_uint, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_multiline = {0x01, 0x00, 0x80, 0x16, "", "multiline", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_numLines = {0x01, 0x00, 0x80, 0x16, "", "numLines", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getImageReference = {0x02, 0x00, 0x80, 0x16, "", "getImageReference", 0, &flash_display_DisplayObject, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_displayAsPassword = {0x01, 0x00, 0x80, 0x16, "", "displayAsPassword", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_textWidth = {0x01, 0x00, 0x80, 0x16, "", "textWidth", 0, &_Number, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_autoSize = {0x01, 0x00, 0x80, 0x16, "", "autoSize", 0, &_String, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_selectable = {0x01, 0x00, 0x80, 0x16, "", "selectable", 0, &_Boolean, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getCharBoundaries = {0x02, 0x00, 0x80, 0x16, "", "getCharBoundaries", 0, &flash_geom_Rectangle, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_alwaysShowSelection = {0x01, 0x00, 0x80, 0x16, "", "alwaysShowSelection", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_thickness = {0x01, 0x00, 0x80, 0x16, "", "thickness", 0, &_Number, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_useRichTextClipboard = {0x01, 0x00, 0x80, 0x16, "", "useRichTextClipboard", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_scrollV = {0x01, 0x00, 0x80, 0x16, "", "scrollV", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getTextRuns = {0x02, 0x00, 0x80, 0x16, "", "getTextRuns", 0, &_Array, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_setTextFormat = {0x02, 0x00, 0x80, 0x16, "", "setTextFormat", 0, &voidclass, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_textColor = {0x01, 0x00, 0x80, 0x16, "", "textColor", 0, &_uint, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_maxScrollV = {0x01, 0x00, 0x80, 0x16, "", "maxScrollV", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_embedFonts = {0x01, 0x00, 0x80, 0x16, "", "embedFonts", 0, &_Boolean, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_scrollH = {0x01, 0x00, 0x80, 0x16, "", "scrollH", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getLineLength = {0x02, 0x00, 0x80, 0x16, "", "getLineLength", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_textHeight = {0x01, 0x00, 0x80, 0x16, "", "textHeight", 0, &_Number, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_antiAliasType = {0x01, 0x00, 0x80, 0x16, "", "antiAliasType", 0, &_String, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_styleSheet = {0x01, 0x00, 0x80, 0x16, "", "styleSheet", 0, &flash_text_StyleSheet, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_background = {0x01, 0x00, 0x80, 0x16, "", "background", 0, &_Boolean, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_replaceSelectedText = {0x02, 0x00, 0x80, 0x16, "", "replaceSelectedText", 0, &voidclass, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_borderColor = {0x01, 0x00, 0x80, 0x16, "", "borderColor", 0, &_uint, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_maxScrollH = {0x01, 0x00, 0x80, 0x16, "", "maxScrollH", 0, &_int, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_maxChars = {0x01, 0x00, 0x80, 0x16, "", "maxChars", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_getLineMetrics = {0x02, 0x00, 0x80, 0x16, "", "getLineMetrics", 0, &flash_text_TextLineMetrics, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_selectionEndIndex = {0x01, 0x00, 0x80, 0x16, "", "selectionEndIndex", 0, &_int, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_insertXMLText = {0x02, 0x00, 0x80, 0x16, "", "insertXMLText", 0, &voidclass, &flash_text_TextField, 0}; +static varinfo_t flash_text_TextField_condenseWhite = {0x01, 0x00, 0x80, 0x16, "", "condenseWhite", 0, &_Boolean, &flash_text_TextField, 0}; +static methodinfo_t flash_text_TextField_isFontCompatible = {0x02, 0x00, 0x82, 0x16, "", "isFontCompatible", 0, &_Boolean, &flash_text_TextField, 0}; +static classinfo_t flash_printing_PrintJobOrientation = {0x03, 0x00, 0x81, 0x16, "flash.printing", "PrintJobOrientation", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_printing_PrintJobOrientation_LANDSCAPE = {0x01, 0x00, 0x82, 0x16, "", "LANDSCAPE", 0, &_String, &flash_printing_PrintJobOrientation, 0}; +static varinfo_t flash_printing_PrintJobOrientation_PORTRAIT = {0x01, 0x00, 0x82, 0x16, "", "PORTRAIT", 0, &_String, &flash_printing_PrintJobOrientation, 0}; +static classinfo_t flash_text_TextRenderer = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextRenderer", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextRenderer_displayMode = {0x01, 0x00, 0x82, 0x16, "", "displayMode", 0, &_String, &flash_text_TextRenderer, 0}; +static varinfo_t flash_text_TextRenderer_antiAliasType = {0x01, 0x00, 0x82, 0x16, "", "antiAliasType", 0, &_String, &flash_text_TextRenderer, 0}; +static varinfo_t flash_text_TextRenderer_maxLevel = {0x01, 0x00, 0x82, 0x16, "", "maxLevel", 0, &_int, &flash_text_TextRenderer, 0}; +static methodinfo_t flash_text_TextRenderer_setAdvancedAntiAliasingTable = {0x02, 0x00, 0x82, 0x16, "", "setAdvancedAntiAliasingTable", 0, &voidclass, &flash_text_TextRenderer, 0}; +static classinfo_t flash_net_NetConnection = {0x03, 0x00, 0x80, 0x16, "flash.net", "NetConnection", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_NetConnection_nearID = {0x01, 0x00, 0x80, 0x16, "", "nearID", 0, &_String, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_farNonce = {0x01, 0x00, 0x80, 0x16, "", "farNonce", 0, &_String, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_farID = {0x01, 0x00, 0x80, 0x16, "", "farID", 0, &_String, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_NetConnection, 0}; +static methodinfo_t flash_net_NetConnection_call = {0x02, 0x00, 0x80, 0x16, "", "call", 0, &voidclass, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_usingTLS = {0x01, 0x00, 0x80, 0x16, "", "usingTLS", 0, &_Boolean, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_proxyType = {0x01, 0x00, 0x80, 0x16, "", "proxyType", 0, &_String, &flash_net_NetConnection, 0}; +static methodinfo_t flash_net_NetConnection_addHeader = {0x02, 0x00, 0x80, 0x16, "", "addHeader", 0, &voidclass, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_protocol = {0x01, 0x00, 0x80, 0x16, "", "protocol", 0, &_String, &flash_net_NetConnection, 0}; +static methodinfo_t flash_net_NetConnection_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_nearNonce = {0x01, 0x00, 0x80, 0x16, "", "nearNonce", 0, &_String, &flash_net_NetConnection, 0}; +static methodinfo_t flash_net_NetConnection_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_unconnectedPeerStreams = {0x01, 0x00, 0x80, 0x16, "", "unconnectedPeerStreams", 0, &_Array, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_maxPeerConnections = {0x01, 0x00, 0x80, 0x16, "", "maxPeerConnections", 0, &_uint, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_connectedProxyType = {0x01, 0x00, 0x80, 0x16, "", "connectedProxyType", 0, &_String, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_uri = {0x01, 0x00, 0x80, 0x16, "", "uri", 0, &_String, &flash_net_NetConnection, 0}; +static varinfo_t flash_net_NetConnection_defaultObjectEncoding = {0x01, 0x00, 0x82, 0x16, "", "defaultObjectEncoding", 0, &_uint, &flash_net_NetConnection, 0}; +static methodinfo_t _decodeURIComponent = {0x02, 0x00, 0x82, 0x16, "", "decodeURIComponent", 0, &_String, 0, 0}; +static methodinfo_t flash_sampler_isGetterSetter = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "isGetterSetter", 0, &_Boolean, 0, 0}; +static methodinfo_t flash_utils_getQualifiedSuperclassName = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getQualifiedSuperclassName", 0, &_String, 0, 0}; +static classinfo_t flash_display_GraphicsPathWinding = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsPathWinding", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_GraphicsPathWinding_EVEN_ODD = {0x01, 0x00, 0x82, 0x16, "", "EVEN_ODD", 0, &_String, &flash_display_GraphicsPathWinding, 0}; +static varinfo_t flash_display_GraphicsPathWinding_NON_ZERO = {0x01, 0x00, 0x82, 0x16, "", "NON_ZERO", 0, &_String, &flash_display_GraphicsPathWinding, 0}; +static classinfo_t flash_text_engine_TabStop = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TabStop", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TabStop_alignment = {0x01, 0x00, 0x80, 0x16, "", "alignment", 0, &_String, &flash_text_engine_TabStop, 0}; +static varinfo_t flash_text_engine_TabStop_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_Number, &flash_text_engine_TabStop, 0}; +static varinfo_t flash_text_engine_TabStop_decimalAlignmentToken = {0x01, 0x00, 0x80, 0x16, "", "decimalAlignmentToken", 0, &_String, &flash_text_engine_TabStop, 0}; +static classinfo_t flash_text_engine_JustificationStyle = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "JustificationStyle", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_JustificationStyle_PUSH_OUT_ONLY = {0x01, 0x00, 0x82, 0x16, "", "PUSH_OUT_ONLY", 0, &_String, &flash_text_engine_JustificationStyle, 0}; +static varinfo_t flash_text_engine_JustificationStyle_PRIORITIZE_LEAST_ADJUSTMENT = {0x01, 0x00, 0x82, 0x16, "", "PRIORITIZE_LEAST_ADJUSTMENT", 0, &_String, &flash_text_engine_JustificationStyle, 0}; +static varinfo_t flash_text_engine_JustificationStyle_PUSH_IN_KINSOKU = {0x01, 0x00, 0x82, 0x16, "", "PUSH_IN_KINSOKU", 0, &_String, &flash_text_engine_JustificationStyle, 0}; +static methodinfo_t flash_sampler_startSampling = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "startSampling", 0, &voidclass, 0, 0}; +static classinfo_t flash_text_engine_TextRotation = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextRotation", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TextRotation_ROTATE_270 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_270", 0, &_String, &flash_text_engine_TextRotation, 0}; +static varinfo_t flash_text_engine_TextRotation_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_text_engine_TextRotation, 0}; +static varinfo_t flash_text_engine_TextRotation_ROTATE_0 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_0", 0, &_String, &flash_text_engine_TextRotation, 0}; +static varinfo_t flash_text_engine_TextRotation_ROTATE_90 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_90", 0, &_String, &flash_text_engine_TextRotation, 0}; +static varinfo_t flash_text_engine_TextRotation_ROTATE_180 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_180", 0, &_String, &flash_text_engine_TextRotation, 0}; +static methodinfo_t flash_sampler_clearSamples = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "clearSamples", 0, &voidclass, 0, 0}; +static classinfo_t flash_system_IMEConversionMode = {0x03, 0x00, 0x81, 0x16, "flash.system", "IMEConversionMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_system_IMEConversionMode_JAPANESE_KATAKANA_FULL = {0x01, 0x00, 0x82, 0x16, "", "JAPANESE_KATAKANA_FULL", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_CHINESE = {0x01, 0x00, 0x82, 0x16, "", "CHINESE", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_JAPANESE_KATAKANA_HALF = {0x01, 0x00, 0x82, 0x16, "", "JAPANESE_KATAKANA_HALF", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_UNKNOWN = {0x01, 0x00, 0x82, 0x16, "", "UNKNOWN", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_KOREAN = {0x01, 0x00, 0x82, 0x16, "", "KOREAN", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_ALPHANUMERIC_HALF = {0x01, 0x00, 0x82, 0x16, "", "ALPHANUMERIC_HALF", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_ALPHANUMERIC_FULL = {0x01, 0x00, 0x82, 0x16, "", "ALPHANUMERIC_FULL", 0, &_String, &flash_system_IMEConversionMode, 0}; +static varinfo_t flash_system_IMEConversionMode_JAPANESE_HIRAGANA = {0x01, 0x00, 0x82, 0x16, "", "JAPANESE_HIRAGANA", 0, &_String, &flash_system_IMEConversionMode, 0}; +static classinfo_t flash_display_StageScaleMode = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageScaleMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_StageScaleMode_SHOW_ALL = {0x01, 0x00, 0x82, 0x16, "", "SHOW_ALL", 0, &_String, &flash_display_StageScaleMode, 0}; +static varinfo_t flash_display_StageScaleMode_NO_BORDER = {0x01, 0x00, 0x82, 0x16, "", "NO_BORDER", 0, &_String, &flash_display_StageScaleMode, 0}; +static varinfo_t flash_display_StageScaleMode_EXACT_FIT = {0x01, 0x00, 0x82, 0x16, "", "EXACT_FIT", 0, &_String, &flash_display_StageScaleMode, 0}; +static varinfo_t flash_display_StageScaleMode_NO_SCALE = {0x01, 0x00, 0x82, 0x16, "", "NO_SCALE", 0, &_String, &flash_display_StageScaleMode, 0}; +static methodinfo_t flash_sampler_getSize = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSize", 0, &_Number, 0, 0}; +static classinfo_t flash_net_URLStream = {0x03, 0x00, 0x80, 0x16, "flash.net", "URLStream", 0, &flash_events_EventDispatcher, interfaces: {&flash_utils_IDataInput, 0}}; +static methodinfo_t flash_net_URLStream_readUTF = {0x02, 0x00, 0x80, 0x16, "", "readUTF", 0, &_String, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readByte = {0x02, 0x00, 0x80, 0x16, "", "readByte", 0, &_int, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "readUTFBytes", 0, &_String, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readShort = {0x02, 0x00, 0x80, 0x16, "", "readShort", 0, &_int, &flash_net_URLStream, 0}; +static varinfo_t flash_net_URLStream_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_URLStream, 0}; +static varinfo_t flash_net_URLStream_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedInt", 0, &_uint, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readDouble = {0x02, 0x00, 0x80, 0x16, "", "readDouble", 0, &_Number, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readBytes = {0x02, 0x00, 0x80, 0x16, "", "readBytes", 0, &voidclass, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readUnsignedByte = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedByte", 0, &_uint, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readMultiByte = {0x02, 0x00, 0x80, 0x16, "", "readMultiByte", 0, &_String, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readInt = {0x02, 0x00, 0x80, 0x16, "", "readInt", 0, &_int, &flash_net_URLStream, 0}; +static varinfo_t flash_net_URLStream_bytesAvailable = {0x01, 0x00, 0x80, 0x16, "", "bytesAvailable", 0, &_uint, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readUnsignedShort = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedShort", 0, &_uint, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readObject = {0x02, 0x00, 0x80, 0x16, "", "readObject", 0, 0, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readFloat = {0x02, 0x00, 0x80, 0x16, "", "readFloat", 0, &_Number, &flash_net_URLStream, 0}; +static varinfo_t flash_net_URLStream_endian = {0x01, 0x00, 0x80, 0x16, "", "endian", 0, &_String, &flash_net_URLStream, 0}; +static methodinfo_t flash_net_URLStream_readBoolean = {0x02, 0x00, 0x80, 0x16, "", "readBoolean", 0, &_Boolean, &flash_net_URLStream, 0}; +static classinfo_t flash_display_BlendMode = {0x03, 0x00, 0x81, 0x16, "flash.display", "BlendMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_BlendMode_LAYER = {0x01, 0x00, 0x82, 0x16, "", "LAYER", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_ERASE = {0x01, 0x00, 0x82, 0x16, "", "ERASE", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_HARDLIGHT = {0x01, 0x00, 0x82, 0x16, "", "HARDLIGHT", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_OVERLAY = {0x01, 0x00, 0x82, 0x16, "", "OVERLAY", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_ALPHA = {0x01, 0x00, 0x82, 0x16, "", "ALPHA", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_SUBTRACT = {0x01, 0x00, 0x82, 0x16, "", "SUBTRACT", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_INVERT = {0x01, 0x00, 0x82, 0x16, "", "INVERT", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_DIFFERENCE = {0x01, 0x00, 0x82, 0x16, "", "DIFFERENCE", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_DARKEN = {0x01, 0x00, 0x82, 0x16, "", "DARKEN", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_SHADER = {0x01, 0x00, 0x82, 0x16, "", "SHADER", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_MULTIPLY = {0x01, 0x00, 0x82, 0x16, "", "MULTIPLY", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_ADD = {0x01, 0x00, 0x82, 0x16, "", "ADD", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_SCREEN = {0x01, 0x00, 0x82, 0x16, "", "SCREEN", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_display_BlendMode, 0}; +static varinfo_t flash_display_BlendMode_LIGHTEN = {0x01, 0x00, 0x82, 0x16, "", "LIGHTEN", 0, &_String, &flash_display_BlendMode, 0}; +static classinfo_t flash_ui_Mouse = {0x03, 0x00, 0x81, 0x16, "flash.ui", "Mouse", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_ui_Mouse_cursor = {0x01, 0x00, 0x82, 0x16, "", "cursor", 0, &_String, &flash_ui_Mouse, 0}; +static methodinfo_t flash_ui_Mouse_show = {0x02, 0x00, 0x82, 0x16, "", "show", 0, &voidclass, &flash_ui_Mouse, 0}; +static methodinfo_t flash_ui_Mouse_hide = {0x02, 0x00, 0x82, 0x16, "", "hide", 0, &voidclass, &flash_ui_Mouse, 0}; +static classinfo_t flash_errors_InvalidSWFError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "InvalidSWFError", 0, &_Error, interfaces: {0}}; +static classinfo_t flash_text_engine_RenderingMode = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "RenderingMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_RenderingMode_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_engine_RenderingMode, 0}; +static varinfo_t flash_text_engine_RenderingMode_CFF = {0x01, 0x00, 0x82, 0x16, "", "CFF", 0, &_String, &flash_text_engine_RenderingMode, 0}; +static classinfo_t flash_display_GraphicsTrianglePath = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsTrianglePath", 0, &_Object, interfaces: {&flash_display_IGraphicsPath, &flash_display_IGraphicsData, 0}}; +static varinfo_t flash_display_GraphicsTrianglePath_culling = {0x01, 0x00, 0x80, 0x16, "", "culling", 0, &_String, &flash_display_GraphicsTrianglePath, 0}; +static varinfo_t flash_display_GraphicsTrianglePath_vertices = {0x01, 0x00, 0x80, 0x16, "", "vertices", 0, &__AS3___vec_Vector, &flash_display_GraphicsTrianglePath, 0}; +static varinfo_t flash_display_GraphicsTrianglePath_indices = {0x01, 0x00, 0x80, 0x16, "", "indices", 0, &__AS3___vec_Vector, &flash_display_GraphicsTrianglePath, 0}; +static varinfo_t flash_display_GraphicsTrianglePath_uvtData = {0x01, 0x00, 0x80, 0x16, "", "uvtData", 0, &__AS3___vec_Vector, &flash_display_GraphicsTrianglePath, 0}; +static classinfo_t flash_display_IGraphicsFill = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsFill", 0, 0, interfaces: {0}}; +static classinfo_t flash_text_engine_TypographicCase = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TypographicCase", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TypographicCase_UPPERCASE = {0x01, 0x00, 0x82, 0x16, "", "UPPERCASE", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static varinfo_t flash_text_engine_TypographicCase_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static varinfo_t flash_text_engine_TypographicCase_LOWERCASE = {0x01, 0x00, 0x82, 0x16, "", "LOWERCASE", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static varinfo_t flash_text_engine_TypographicCase_SMALL_CAPS = {0x01, 0x00, 0x82, 0x16, "", "SMALL_CAPS", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static varinfo_t flash_text_engine_TypographicCase_TITLE = {0x01, 0x00, 0x82, 0x16, "", "TITLE", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static varinfo_t flash_text_engine_TypographicCase_CAPS = {0x01, 0x00, 0x82, 0x16, "", "CAPS", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static varinfo_t flash_text_engine_TypographicCase_CAPS_AND_SMALL_CAPS = {0x01, 0x00, 0x82, 0x16, "", "CAPS_AND_SMALL_CAPS", 0, &_String, &flash_text_engine_TypographicCase, 0}; +static classinfo_t _XML = {0x03, 0x00, 0x89, 0x16, "", "XML", 0, &_Object, interfaces: {0}}; +static methodinfo_t _XML_normalize = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "normalize", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_removeNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "removeNamespace", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_prependChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "prependChild", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_toXMLString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toXMLString", 0, &_String, &_XML, 0}; +static methodinfo_t _XML_text = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "text", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_nodeKind = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "nodeKind", 0, &_String, &_XML, 0}; +static methodinfo_t _XML_copy = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "copy", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_XML, 0}; +static methodinfo_t _XML_childIndex = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "childIndex", 0, &_int, &_XML, 0}; +static methodinfo_t _XML_setName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setName", 0, &voidclass, &_XML, 0}; +static methodinfo_t _XML_setLocalName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setLocalName", 0, &voidclass, &_XML, 0}; +static methodinfo_t _XML_namespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespace", 0, 0, &_XML, 0}; +static methodinfo_t _XML_insertChildBefore = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildBefore", 0, 0, &_XML, 0}; +static methodinfo_t _XML_addNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "addNamespace", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_propertyIsEnumerable = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "propertyIsEnumerable", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_comments = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "comments", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_attributes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attributes", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_descendants = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "descendants", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_replace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "replace", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_setNotification = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setNotification", 0, 0, &_XML, 0}; +static methodinfo_t _XML_children = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "children", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_contains = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "contains", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_hasSimpleContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasSimpleContent", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_elements = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "elements", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_hasComplexContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasComplexContent", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_insertChildAfter = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildAfter", 0, 0, &_XML, 0}; +static methodinfo_t _XML_parent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "parent", 0, 0, &_XML, 0}; +static methodinfo_t _XML_length = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "length", 0, &_int, &_XML, 0}; +static methodinfo_t _XML_processingInstructions = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "processingInstructions", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_child = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "child", 0, &_XMLList, &_XML, 0}; +static methodinfo_t _XML_appendChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "appendChild", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_localName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "localName", 0, &_Object, &_XML, 0}; +static methodinfo_t _XML_notification = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "notification", 0, &_Function, &_XML, 0}; +static methodinfo_t _XML_inScopeNamespaces = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "inScopeNamespaces", 0, &_Array, &_XML, 0}; +static methodinfo_t _XML_hasOwnProperty = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasOwnProperty", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_namespaceDeclarations = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespaceDeclarations", 0, &_Array, &_XML, 0}; +static methodinfo_t _XML_setNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setNamespace", 0, &voidclass, &_XML, 0}; +static methodinfo_t _XML_name = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "name", 0, &_Object, &_XML, 0}; +static methodinfo_t _XML_setChildren = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setChildren", 0, &_XML, &_XML, 0}; +static methodinfo_t _XML_attribute = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attribute", 0, &_XMLList, &_XML, 0}; +static varinfo_t _XML_prettyPrinting = {0x01, 0x00, 0x82, 0x16, "", "prettyPrinting", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_setSettings = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "setSettings", 0, &voidclass, &_XML, 0}; +static varinfo_t _XML_ignoreComments = {0x01, 0x00, 0x82, 0x16, "", "ignoreComments", 0, &_Boolean, &_XML, 0}; +static varinfo_t _XML_prettyIndent = {0x01, 0x00, 0x82, 0x16, "", "prettyIndent", 0, &_int, &_XML, 0}; +static methodinfo_t _XML_settings = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "settings", 0, &_Object, &_XML, 0}; +static varinfo_t _XML_ignoreProcessingInstructions = {0x01, 0x00, 0x82, 0x16, "", "ignoreProcessingInstructions", 0, &_Boolean, &_XML, 0}; +static varinfo_t _XML_ignoreWhitespace = {0x01, 0x00, 0x82, 0x16, "", "ignoreWhitespace", 0, &_Boolean, &_XML, 0}; +static methodinfo_t _XML_defaultSettings = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "defaultSettings", 0, &_Object, &_XML, 0}; +static classinfo_t flash_net_NetStreamInfo = {0x03, 0x00, 0x81, 0x16, "flash.net", "NetStreamInfo", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_NetStreamInfo_maxBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "maxBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_dataBufferByteLength = {0x01, 0x00, 0x80, 0x16, "", "dataBufferByteLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_videoByteCount = {0x01, 0x00, 0x80, 0x16, "", "videoByteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_videoBufferLength = {0x01, 0x00, 0x80, 0x16, "", "videoBufferLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_audioBufferByteLength = {0x01, 0x00, 0x80, 0x16, "", "audioBufferByteLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_dataBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "dataBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_SRTT = {0x01, 0x00, 0x80, 0x16, "", "SRTT", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_droppedFrames = {0x01, 0x00, 0x80, 0x16, "", "droppedFrames", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_audioByteCount = {0x01, 0x00, 0x80, 0x16, "", "audioByteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_audioBufferLength = {0x01, 0x00, 0x80, 0x16, "", "audioBufferLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_byteCount = {0x01, 0x00, 0x80, 0x16, "", "byteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static methodinfo_t flash_net_NetStreamInfo_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_dataByteCount = {0x01, 0x00, 0x80, 0x16, "", "dataByteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_videoBufferByteLength = {0x01, 0x00, 0x80, 0x16, "", "videoBufferByteLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_dataBufferLength = {0x01, 0x00, 0x80, 0x16, "", "dataBufferLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_audioLossRate = {0x01, 0x00, 0x80, 0x16, "", "audioLossRate", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_videoBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "videoBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_currentBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "currentBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_audioBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "audioBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static varinfo_t flash_net_NetStreamInfo_playbackBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "playbackBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; +static classinfo_t flash_display_Stage = {0x03, 0x00, 0x80, 0x16, "flash.display", "Stage", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; +static methodinfo_t flash_display_Stage_setChildIndex = {0x02, 0x00, 0x80, 0x16, "", "setChildIndex", 0, &voidclass, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_stageFocusRect = {0x01, 0x00, 0x80, 0x16, "", "stageFocusRect", 0, &_Boolean, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_frameRate = {0x01, 0x00, 0x80, 0x16, "", "frameRate", 0, &_Number, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_invalidate = {0x02, 0x00, 0x80, 0x16, "", "invalidate", 0, &voidclass, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_textSnapshot = {0x01, 0x00, 0x80, 0x16, "", "textSnapshot", 0, &flash_text_TextSnapshot, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_String, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_willTrigger = {0x02, 0x00, 0x80, 0x16, "", "willTrigger", 0, &_Boolean, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_dispatchEvent = {0x02, 0x00, 0x80, 0x16, "", "dispatchEvent", 0, &_Boolean, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_isFocusInaccessible = {0x02, 0x00, 0x80, 0x16, "", "isFocusInaccessible", 0, &_Boolean, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_removeChildAt = {0x02, 0x00, 0x80, 0x16, "", "removeChildAt", 0, &flash_display_DisplayObject, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_fullScreenWidth = {0x01, 0x00, 0x80, 0x16, "", "fullScreenWidth", 0, &_uint, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_addChildAt = {0x02, 0x00, 0x80, 0x16, "", "addChildAt", 0, &flash_display_DisplayObject, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_fullScreenSourceRect = {0x01, 0x00, 0x80, 0x16, "", "fullScreenSourceRect", 0, &flash_geom_Rectangle, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_addChild = {0x02, 0x00, 0x80, 0x16, "", "addChild", 0, &flash_display_DisplayObject, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_numChildren = {0x01, 0x00, 0x80, 0x16, "", "numChildren", 0, &_int, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_mouseChildren = {0x01, 0x00, 0x80, 0x16, "", "mouseChildren", 0, &_Boolean, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_swapChildrenAt = {0x02, 0x00, 0x80, 0x16, "", "swapChildrenAt", 0, &voidclass, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_showDefaultContextMenu = {0x01, 0x00, 0x80, 0x16, "", "showDefaultContextMenu", 0, &_Boolean, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_addEventListener = {0x02, 0x00, 0x80, 0x16, "", "addEventListener", 0, &voidclass, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_stageHeight = {0x01, 0x00, 0x80, 0x16, "", "stageHeight", 0, &_int, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_fullScreenHeight = {0x01, 0x00, 0x80, 0x16, "", "fullScreenHeight", 0, &_uint, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_align = {0x01, 0x00, 0x80, 0x16, "", "align", 0, &_String, &flash_display_Stage, 0}; +static methodinfo_t flash_display_Stage_hasEventListener = {0x02, 0x00, 0x80, 0x16, "", "hasEventListener", 0, &_Boolean, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_displayState = {0x01, 0x00, 0x80, 0x16, "", "displayState", 0, &_String, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_scaleMode = {0x01, 0x00, 0x80, 0x16, "", "scaleMode", 0, &_String, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_tabChildren = {0x01, 0x00, 0x80, 0x16, "", "tabChildren", 0, &_Boolean, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_focus = {0x01, 0x00, 0x80, 0x16, "", "focus", 0, &flash_display_InteractiveObject, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_colorCorrection = {0x01, 0x00, 0x80, 0x16, "", "colorCorrection", 0, &_String, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_colorCorrectionSupport = {0x01, 0x00, 0x80, 0x16, "", "colorCorrectionSupport", 0, &_String, &flash_display_Stage, 0}; +static varinfo_t flash_display_Stage_stageWidth = {0x01, 0x00, 0x80, 0x16, "", "stageWidth", 0, &_int, &flash_display_Stage, 0}; +static classinfo_t flash_ui_ContextMenuItem = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenuItem", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_ui_ContextMenuItem_separatorBefore = {0x01, 0x00, 0x80, 0x16, "", "separatorBefore", 0, &_Boolean, &flash_ui_ContextMenuItem, 0}; +static varinfo_t flash_ui_ContextMenuItem_enabled = {0x01, 0x00, 0x80, 0x16, "", "enabled", 0, &_Boolean, &flash_ui_ContextMenuItem, 0}; +static varinfo_t flash_ui_ContextMenuItem_caption = {0x01, 0x00, 0x80, 0x16, "", "caption", 0, &_String, &flash_ui_ContextMenuItem, 0}; +static methodinfo_t flash_ui_ContextMenuItem_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenuItem, &flash_ui_ContextMenuItem, 0}; +static varinfo_t flash_ui_ContextMenuItem_visible = {0x01, 0x00, 0x80, 0x16, "", "visible", 0, &_Boolean, &flash_ui_ContextMenuItem, 0}; +static classinfo_t flash_trace_Trace = {0x03, 0x00, 0x80, 0x16, "flash.trace", "Trace", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_trace_Trace_METHODS_AND_LINES_WITH_ARGS = {0x01, 0x00, 0x82, 0x16, "", "METHODS_AND_LINES_WITH_ARGS", 0, &_int, &flash_trace_Trace, 0}; +static varinfo_t flash_trace_Trace_FILE = {0x01, 0x00, 0x82, 0x16, "", "FILE", 0, 0, &flash_trace_Trace, 0}; +static varinfo_t flash_trace_Trace_METHODS_WITH_ARGS = {0x01, 0x00, 0x82, 0x16, "", "METHODS_WITH_ARGS", 0, &_int, &flash_trace_Trace, 0}; +static varinfo_t flash_trace_Trace_OFF = {0x01, 0x00, 0x82, 0x16, "", "OFF", 0, &_int, &flash_trace_Trace, 0}; +static varinfo_t flash_trace_Trace_METHODS_AND_LINES = {0x01, 0x00, 0x82, 0x16, "", "METHODS_AND_LINES", 0, &_int, &flash_trace_Trace, 0}; +static varinfo_t flash_trace_Trace_LISTENER = {0x01, 0x00, 0x82, 0x16, "", "LISTENER", 0, 0, &flash_trace_Trace, 0}; +static methodinfo_t flash_trace_Trace_getLevel = {0x02, 0x00, 0x82, 0x16, "", "getLevel", 0, &_int, &flash_trace_Trace, 0}; +static methodinfo_t flash_trace_Trace_setLevel = {0x02, 0x00, 0x82, 0x16, "", "setLevel", 0, 0, &flash_trace_Trace, 0}; +static methodinfo_t flash_trace_Trace_setListener = {0x02, 0x00, 0x82, 0x16, "", "setListener", 0, 0, &flash_trace_Trace, 0}; +static methodinfo_t flash_trace_Trace_getListener = {0x02, 0x00, 0x82, 0x16, "", "getListener", 0, &_Function, &flash_trace_Trace, 0}; +static varinfo_t flash_trace_Trace_METHODS = {0x01, 0x00, 0x82, 0x16, "", "METHODS", 0, &_int, &flash_trace_Trace, 0}; +static classinfo_t flash_events_TimerEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "TimerEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_TimerEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_TimerEvent, 0}; +static methodinfo_t flash_events_TimerEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_TimerEvent, 0}; +static methodinfo_t flash_events_TimerEvent_updateAfterEvent = {0x02, 0x00, 0x80, 0x16, "", "updateAfterEvent", 0, &voidclass, &flash_events_TimerEvent, 0}; +static varinfo_t flash_events_TimerEvent_TIMER_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "TIMER_COMPLETE", 0, &_String, &flash_events_TimerEvent, 0}; +static varinfo_t flash_events_TimerEvent_TIMER = {0x01, 0x00, 0x82, 0x16, "", "TIMER", 0, &_String, &flash_events_TimerEvent, 0}; +static classinfo_t flash_events_SampleDataEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "SampleDataEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_SampleDataEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_SampleDataEvent, 0}; +static varinfo_t flash_events_SampleDataEvent_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_Number, &flash_events_SampleDataEvent, 0}; +static methodinfo_t flash_events_SampleDataEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_SampleDataEvent, 0}; +static varinfo_t flash_events_SampleDataEvent_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_utils_ByteArray, &flash_events_SampleDataEvent, 0}; +static varinfo_t flash_events_SampleDataEvent_SAMPLE_DATA = {0x01, 0x00, 0x82, 0x16, "", "SAMPLE_DATA", 0, &_String, &flash_events_SampleDataEvent, 0}; +static classinfo_t flash_display_ShaderPrecision = {0x03, 0x00, 0x81, 0x16, "flash.display", "ShaderPrecision", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ShaderPrecision_FULL = {0x01, 0x00, 0x82, 0x16, "", "FULL", 0, &_String, &flash_display_ShaderPrecision, 0}; +static varinfo_t flash_display_ShaderPrecision_FAST = {0x01, 0x00, 0x82, 0x16, "", "FAST", 0, &_String, &flash_display_ShaderPrecision, 0}; +static classinfo_t flash_net_FileReference = {0x03, 0x00, 0x80, 0x16, "flash.net", "FileReference", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_FileReference_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_net_FileReference, 0}; +static methodinfo_t flash_net_FileReference_browse = {0x02, 0x00, 0x80, 0x16, "", "browse", 0, &_Boolean, &flash_net_FileReference, 0}; +static varinfo_t flash_net_FileReference_creationDate = {0x01, 0x00, 0x80, 0x16, "", "creationDate", 0, &_Date, &flash_net_FileReference, 0}; +static methodinfo_t flash_net_FileReference_upload = {0x02, 0x00, 0x80, 0x16, "", "upload", 0, &voidclass, &flash_net_FileReference, 0}; +static methodinfo_t flash_net_FileReference_download = {0x02, 0x00, 0x80, 0x16, "", "download", 0, &voidclass, &flash_net_FileReference, 0}; +static methodinfo_t flash_net_FileReference_save = {0x02, 0x00, 0x80, 0x16, "", "save", 0, &voidclass, &flash_net_FileReference, 0}; +static methodinfo_t flash_net_FileReference_cancel = {0x02, 0x00, 0x80, 0x16, "", "cancel", 0, &voidclass, &flash_net_FileReference, 0}; +static varinfo_t flash_net_FileReference_creator = {0x01, 0x00, 0x80, 0x16, "", "creator", 0, &_String, &flash_net_FileReference, 0}; +static varinfo_t flash_net_FileReference_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_utils_ByteArray, &flash_net_FileReference, 0}; +static varinfo_t flash_net_FileReference_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_uint, &flash_net_FileReference, 0}; +static varinfo_t flash_net_FileReference_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_net_FileReference, 0}; +static methodinfo_t flash_net_FileReference_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_net_FileReference, 0}; +static varinfo_t flash_net_FileReference_modificationDate = {0x01, 0x00, 0x80, 0x16, "", "modificationDate", 0, &_Date, &flash_net_FileReference, 0}; +static classinfo_t _DefinitionError = {0x03, 0x00, 0x88, 0x16, "", "DefinitionError", 0, &_Error, interfaces: {0}}; +static varinfo_t _DefinitionError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_DefinitionError, 0}; +static classinfo_t flash_events_EventDispatcher = {0x03, 0x00, 0x80, 0x16, "flash.events", "EventDispatcher", 0, &_Object, interfaces: {&flash_events_IEventDispatcher, 0}}; +static methodinfo_t flash_events_EventDispatcher_willTrigger = {0x02, 0x00, 0x80, 0x16, "", "willTrigger", 0, &_Boolean, &flash_events_EventDispatcher, 0}; +static methodinfo_t flash_events_EventDispatcher_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_EventDispatcher, 0}; +static methodinfo_t flash_events_EventDispatcher_removeEventListener = {0x02, 0x00, 0x80, 0x16, "", "removeEventListener", 0, &voidclass, &flash_events_EventDispatcher, 0}; +static methodinfo_t flash_events_EventDispatcher_hasEventListener = {0x02, 0x00, 0x80, 0x16, "", "hasEventListener", 0, &_Boolean, &flash_events_EventDispatcher, 0}; +static methodinfo_t flash_events_EventDispatcher_addEventListener = {0x02, 0x00, 0x80, 0x16, "", "addEventListener", 0, &voidclass, &flash_events_EventDispatcher, 0}; +static methodinfo_t flash_events_EventDispatcher_dispatchEvent = {0x02, 0x00, 0x80, 0x16, "", "dispatchEvent", 0, &_Boolean, &flash_events_EventDispatcher, 0}; +static classinfo_t flash_net_SharedObjectFlushStatus = {0x03, 0x00, 0x81, 0x16, "flash.net", "SharedObjectFlushStatus", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_SharedObjectFlushStatus_FLUSHED = {0x01, 0x00, 0x82, 0x16, "", "FLUSHED", 0, &_String, &flash_net_SharedObjectFlushStatus, 0}; +static varinfo_t flash_net_SharedObjectFlushStatus_PENDING = {0x01, 0x00, 0x82, 0x16, "", "PENDING", 0, &_String, &flash_net_SharedObjectFlushStatus, 0}; +static classinfo_t flash_text_TextLineMetrics = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextLineMetrics", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextLineMetrics_descent = {0x01, 0x00, 0x80, 0x16, "", "descent", 0, &_Number, &flash_text_TextLineMetrics, 0}; +static varinfo_t flash_text_TextLineMetrics_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_text_TextLineMetrics, 0}; +static varinfo_t flash_text_TextLineMetrics_ascent = {0x01, 0x00, 0x80, 0x16, "", "ascent", 0, &_Number, &flash_text_TextLineMetrics, 0}; +static varinfo_t flash_text_TextLineMetrics_leading = {0x01, 0x00, 0x80, 0x16, "", "leading", 0, &_Number, &flash_text_TextLineMetrics, 0}; +static varinfo_t flash_text_TextLineMetrics_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_text_TextLineMetrics, 0}; +static varinfo_t flash_text_TextLineMetrics_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_text_TextLineMetrics, 0}; +static classinfo_t flash_text_AntiAliasType = {0x03, 0x00, 0x81, 0x16, "flash.text", "AntiAliasType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_AntiAliasType_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_AntiAliasType, 0}; +static varinfo_t flash_text_AntiAliasType_ADVANCED = {0x01, 0x00, 0x82, 0x16, "", "ADVANCED", 0, &_String, &flash_text_AntiAliasType, 0}; +static classinfo_t flash_system_SecurityDomain = {0x03, 0x00, 0x80, 0x16, "flash.system", "SecurityDomain", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_system_SecurityDomain_currentDomain = {0x01, 0x00, 0x82, 0x16, "", "currentDomain", 0, &flash_system_SecurityDomain, &flash_system_SecurityDomain, 0}; +static classinfo_t flash_text_Font = {0x03, 0x00, 0x80, 0x16, "flash.text", "Font", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_text_Font_hasGlyphs = {0x02, 0x00, 0x80, 0x16, "", "hasGlyphs", 0, &_Boolean, &flash_text_Font, 0}; +static varinfo_t flash_text_Font_fontName = {0x01, 0x00, 0x80, 0x16, "", "fontName", 0, &_String, &flash_text_Font, 0}; +static varinfo_t flash_text_Font_fontStyle = {0x01, 0x00, 0x80, 0x16, "", "fontStyle", 0, &_String, &flash_text_Font, 0}; +static varinfo_t flash_text_Font_fontType = {0x01, 0x00, 0x80, 0x16, "", "fontType", 0, &_String, &flash_text_Font, 0}; +static methodinfo_t flash_text_Font_enumerateFonts = {0x02, 0x00, 0x82, 0x16, "", "enumerateFonts", 0, &_Array, &flash_text_Font, 0}; +static methodinfo_t flash_text_Font_registerFont = {0x02, 0x00, 0x82, 0x16, "", "registerFont", 0, &voidclass, &flash_text_Font, 0}; +static classinfo_t _RegExp = {0x03, 0x00, 0x88, 0x16, "", "RegExp", 0, &_Object, interfaces: {0}}; +static varinfo_t _RegExp_source = {0x01, 0x00, 0x80, 0x16, "", "source", 0, &_String, &_RegExp, 0}; +static methodinfo_t _RegExp_test = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "test", 0, &_Boolean, &_RegExp, 0}; +static varinfo_t _RegExp_global = {0x01, 0x00, 0x80, 0x16, "", "global", 0, &_Boolean, &_RegExp, 0}; +static methodinfo_t _RegExp_exec = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "exec", 0, 0, &_RegExp, 0}; +static varinfo_t _RegExp_ignoreCase = {0x01, 0x00, 0x80, 0x16, "", "ignoreCase", 0, &_Boolean, &_RegExp, 0}; +static varinfo_t _RegExp_dotall = {0x01, 0x00, 0x80, 0x16, "", "dotall", 0, &_Boolean, &_RegExp, 0}; +static varinfo_t _RegExp_lastIndex = {0x01, 0x00, 0x80, 0x16, "", "lastIndex", 0, &_int, &_RegExp, 0}; +static varinfo_t _RegExp_extended = {0x01, 0x00, 0x80, 0x16, "", "extended", 0, &_Boolean, &_RegExp, 0}; +static varinfo_t _RegExp_multiline = {0x01, 0x00, 0x80, 0x16, "", "multiline", 0, &_Boolean, &_RegExp, 0}; +static varinfo_t _RegExp_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_RegExp, 0}; +static classinfo_t flash_accessibility_AccessibilityProperties = {0x03, 0x00, 0x80, 0x16, "flash.accessibility", "AccessibilityProperties", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_accessibility_AccessibilityProperties_forceSimple = {0x01, 0x00, 0x80, 0x16, "", "forceSimple", 0, &_Boolean, &flash_accessibility_AccessibilityProperties, 0}; +static varinfo_t flash_accessibility_AccessibilityProperties_noAutoLabeling = {0x01, 0x00, 0x80, 0x16, "", "noAutoLabeling", 0, &_Boolean, &flash_accessibility_AccessibilityProperties, 0}; +static varinfo_t flash_accessibility_AccessibilityProperties_description = {0x01, 0x00, 0x80, 0x16, "", "description", 0, &_String, &flash_accessibility_AccessibilityProperties, 0}; +static varinfo_t flash_accessibility_AccessibilityProperties_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_accessibility_AccessibilityProperties, 0}; +static varinfo_t flash_accessibility_AccessibilityProperties_shortcut = {0x01, 0x00, 0x80, 0x16, "", "shortcut", 0, &_String, &flash_accessibility_AccessibilityProperties, 0}; +static varinfo_t flash_accessibility_AccessibilityProperties_silent = {0x01, 0x00, 0x80, 0x16, "", "silent", 0, &_Boolean, &flash_accessibility_AccessibilityProperties, 0}; +static classinfo_t flash_ui_ContextMenu = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenu", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_ui_ContextMenu_hideBuiltInItems = {0x02, 0x00, 0x80, 0x16, "", "hideBuiltInItems", 0, &voidclass, &flash_ui_ContextMenu, 0}; +static varinfo_t flash_ui_ContextMenu_clipboardItems = {0x01, 0x00, 0x80, 0x16, "", "clipboardItems", 0, &flash_ui_ContextMenuClipboardItems, &flash_ui_ContextMenu, 0}; +static varinfo_t flash_ui_ContextMenu_builtInItems = {0x01, 0x00, 0x80, 0x16, "", "builtInItems", 0, &flash_ui_ContextMenuBuiltInItems, &flash_ui_ContextMenu, 0}; +static varinfo_t flash_ui_ContextMenu_customItems = {0x01, 0x00, 0x80, 0x16, "", "customItems", 0, &_Array, &flash_ui_ContextMenu, 0}; +static methodinfo_t flash_ui_ContextMenu_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenu, &flash_ui_ContextMenu, 0}; +static varinfo_t flash_ui_ContextMenu_link = {0x01, 0x00, 0x80, 0x16, "", "link", 0, &flash_net_URLRequest, &flash_ui_ContextMenu, 0}; +static varinfo_t flash_ui_ContextMenu_clipboardMenu = {0x01, 0x00, 0x80, 0x16, "", "clipboardMenu", 0, &_Boolean, &flash_ui_ContextMenu, 0}; +static classinfo_t flash_text_TextFieldAutoSize = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFieldAutoSize", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextFieldAutoSize_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_String, &flash_text_TextFieldAutoSize, 0}; +static varinfo_t flash_text_TextFieldAutoSize_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_String, &flash_text_TextFieldAutoSize, 0}; +static varinfo_t flash_text_TextFieldAutoSize_CENTER = {0x01, 0x00, 0x82, 0x16, "", "CENTER", 0, &_String, &flash_text_TextFieldAutoSize, 0}; +static varinfo_t flash_text_TextFieldAutoSize_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_TextFieldAutoSize, 0}; +static classinfo_t _Math = {0x03, 0x00, 0x81, 0x16, "", "Math", 0, &_Object, interfaces: {0}}; +static methodinfo_t _Math_ceil = {0x02, 0x00, 0x82, 0x16, "", "ceil", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_SQRT2 = {0x01, 0x00, 0x82, 0x16, "", "SQRT2", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_cos = {0x02, 0x00, 0x82, 0x16, "", "cos", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_abs = {0x02, 0x00, 0x82, 0x16, "", "abs", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_PI = {0x01, 0x00, 0x82, 0x16, "", "PI", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_E = {0x01, 0x00, 0x82, 0x16, "", "E", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_round = {0x02, 0x00, 0x82, 0x16, "", "round", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_LN10 = {0x01, 0x00, 0x82, 0x16, "", "LN10", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_SQRT1_2 = {0x01, 0x00, 0x82, 0x16, "", "SQRT1_2", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_log = {0x02, 0x00, 0x82, 0x16, "", "log", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_LOG10E = {0x01, 0x00, 0x82, 0x16, "", "LOG10E", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_random = {0x02, 0x00, 0x82, 0x16, "", "random", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_acos = {0x02, 0x00, 0x82, 0x16, "", "acos", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_tan = {0x02, 0x00, 0x82, 0x16, "", "tan", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_asin = {0x02, 0x00, 0x82, 0x16, "", "asin", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_exp = {0x02, 0x00, 0x82, 0x16, "", "exp", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_atan2 = {0x02, 0x00, 0x82, 0x16, "", "atan2", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_pow = {0x02, 0x00, 0x82, 0x16, "", "pow", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_min = {0x02, 0x00, 0x82, 0x16, "", "min", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_LN2 = {0x01, 0x00, 0x82, 0x16, "", "LN2", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_sin = {0x02, 0x00, 0x82, 0x16, "", "sin", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_sqrt = {0x02, 0x00, 0x82, 0x16, "", "sqrt", 0, &_Number, &_Math, 0}; +static varinfo_t _Math_LOG2E = {0x01, 0x00, 0x82, 0x16, "", "LOG2E", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_max = {0x02, 0x00, 0x82, 0x16, "", "max", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_atan = {0x02, 0x00, 0x82, 0x16, "", "atan", 0, &_Number, &_Math, 0}; +static methodinfo_t _Math_floor = {0x02, 0x00, 0x82, 0x16, "", "floor", 0, &_Number, &_Math, 0}; +static classinfo_t flash_display_ColorCorrectionSupport = {0x03, 0x00, 0x81, 0x16, "flash.display", "ColorCorrectionSupport", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ColorCorrectionSupport_UNSUPPORTED = {0x01, 0x00, 0x82, 0x16, "", "UNSUPPORTED", 0, &_String, &flash_display_ColorCorrectionSupport, 0}; +static varinfo_t flash_display_ColorCorrectionSupport_DEFAULT_ON = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT_ON", 0, &_String, &flash_display_ColorCorrectionSupport, 0}; +static varinfo_t flash_display_ColorCorrectionSupport_DEFAULT_OFF = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT_OFF", 0, &_String, &flash_display_ColorCorrectionSupport, 0}; +static classinfo_t flash_errors_IOError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "IOError", 0, &_Error, interfaces: {0}}; +static methodinfo_t _trace = {0x02, 0x00, 0x82, 0x16, "", "trace", 0, &voidclass, 0, 0}; +static classinfo_t flash_ui_ContextMenuBuiltInItems = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenuBuiltInItems", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_zoom = {0x01, 0x00, 0x80, 0x16, "", "zoom", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_save = {0x01, 0x00, 0x80, 0x16, "", "save", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_loop = {0x01, 0x00, 0x80, 0x16, "", "loop", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_print = {0x01, 0x00, 0x80, 0x16, "", "print", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_forwardAndBack = {0x01, 0x00, 0x80, 0x16, "", "forwardAndBack", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_rewind = {0x01, 0x00, 0x80, 0x16, "", "rewind", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static methodinfo_t flash_ui_ContextMenuBuiltInItems_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenuBuiltInItems, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static varinfo_t flash_ui_ContextMenuBuiltInItems_play = {0x01, 0x00, 0x80, 0x16, "", "play", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; +static classinfo_t flash_net_FileReferenceList = {0x03, 0x00, 0x80, 0x16, "flash.net", "FileReferenceList", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_FileReferenceList_fileList = {0x01, 0x00, 0x80, 0x16, "", "fileList", 0, &_Array, &flash_net_FileReferenceList, 0}; +static methodinfo_t flash_net_FileReferenceList_browse = {0x02, 0x00, 0x80, 0x16, "", "browse", 0, &_Boolean, &flash_net_FileReferenceList, 0}; +static classinfo_t flash_display_TriangleCulling = {0x03, 0x00, 0x81, 0x16, "flash.display", "TriangleCulling", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_TriangleCulling_POSITIVE = {0x01, 0x00, 0x82, 0x16, "", "POSITIVE", 0, &_String, &flash_display_TriangleCulling, 0}; +static varinfo_t flash_display_TriangleCulling_NEGATIVE = {0x01, 0x00, 0x82, 0x16, "", "NEGATIVE", 0, &_String, &flash_display_TriangleCulling, 0}; +static varinfo_t flash_display_TriangleCulling_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_display_TriangleCulling, 0}; +static classinfo_t flash_media_SoundMixer = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundMixer", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_media_SoundMixer_computeSpectrum = {0x02, 0x00, 0x82, 0x16, "", "computeSpectrum", 0, &voidclass, &flash_media_SoundMixer, 0}; +static methodinfo_t flash_media_SoundMixer_areSoundsInaccessible = {0x02, 0x00, 0x82, 0x16, "", "areSoundsInaccessible", 0, &_Boolean, &flash_media_SoundMixer, 0}; +static varinfo_t flash_media_SoundMixer_soundTransform = {0x01, 0x00, 0x82, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_media_SoundMixer, 0}; +static varinfo_t flash_media_SoundMixer_bufferTime = {0x01, 0x00, 0x82, 0x16, "", "bufferTime", 0, &_int, &flash_media_SoundMixer, 0}; +static methodinfo_t flash_media_SoundMixer_stopAll = {0x02, 0x00, 0x82, 0x16, "", "stopAll", 0, &voidclass, &flash_media_SoundMixer, 0}; +static classinfo_t adobe_utils_XMLUI = {0x03, 0x00, 0x81, 0x16, "adobe.utils", "XMLUI", 0, &_Object, interfaces: {0}}; +static methodinfo_t adobe_utils_XMLUI_cancel = {0x02, 0x00, 0x82, 0x16, "", "cancel", 0, &voidclass, &adobe_utils_XMLUI, 0}; +static methodinfo_t adobe_utils_XMLUI_setProperty = {0x02, 0x00, 0x82, 0x16, "", "setProperty", 0, &voidclass, &adobe_utils_XMLUI, 0}; +static methodinfo_t adobe_utils_XMLUI_getProperty = {0x02, 0x00, 0x82, 0x16, "", "getProperty", 0, &_String, &adobe_utils_XMLUI, 0}; +static methodinfo_t adobe_utils_XMLUI_accept = {0x02, 0x00, 0x82, 0x16, "", "accept", 0, &voidclass, &adobe_utils_XMLUI, 0}; +static methodinfo_t _escape = {0x02, 0x00, 0x82, 0x16, "", "escape", 0, &_String, 0, 0}; +static methodinfo_t flash_utils_setInterval = {0x02, 0x00, 0x82, 0x16, "flash.utils", "setInterval", 0, &_uint, 0, 0}; +static classinfo_t flash_events_StatusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "StatusEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_StatusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_StatusEvent, 0}; +static varinfo_t flash_events_StatusEvent_code = {0x01, 0x00, 0x80, 0x16, "", "code", 0, &_String, &flash_events_StatusEvent, 0}; +static methodinfo_t flash_events_StatusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_StatusEvent, 0}; +static varinfo_t flash_events_StatusEvent_level = {0x01, 0x00, 0x80, 0x16, "", "level", 0, &_String, &flash_events_StatusEvent, 0}; +static varinfo_t flash_events_StatusEvent_STATUS = {0x01, 0x00, 0x82, 0x16, "", "STATUS", 0, &_String, &flash_events_StatusEvent, 0}; +static classinfo_t flash_display_IGraphicsPath = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsPath", 0, 0, interfaces: {0}}; +static classinfo_t flash_events_ShaderEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ShaderEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_ShaderEvent_vector = {0x01, 0x00, 0x80, 0x16, "", "vector", 0, &__AS3___vec_Vector, &flash_events_ShaderEvent, 0}; +static methodinfo_t flash_events_ShaderEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ShaderEvent, 0}; +static varinfo_t flash_events_ShaderEvent_bitmapData = {0x01, 0x00, 0x80, 0x16, "", "bitmapData", 0, &flash_display_BitmapData, &flash_events_ShaderEvent, 0}; +static methodinfo_t flash_events_ShaderEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ShaderEvent, 0}; +static varinfo_t flash_events_ShaderEvent_byteArray = {0x01, 0x00, 0x80, 0x16, "", "byteArray", 0, &flash_utils_ByteArray, &flash_events_ShaderEvent, 0}; +static varinfo_t flash_events_ShaderEvent_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "COMPLETE", 0, &_String, &flash_events_ShaderEvent, 0}; +static classinfo_t flash_display_Shader = {0x03, 0x00, 0x80, 0x16, "flash.display", "Shader", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_Shader_precisionHint = {0x01, 0x00, 0x80, 0x16, "", "precisionHint", 0, &_String, &flash_display_Shader, 0}; +static varinfo_t flash_display_Shader_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_display_ShaderData, &flash_display_Shader, 0}; +static classinfo_t flash_errors_StackOverflowError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "StackOverflowError", 0, &_Error, interfaces: {0}}; +static methodinfo_t flash_sampler_getInvocationCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getInvocationCount", 0, &_Number, 0, 0}; +static classinfo_t flash_text_engine_Kerning = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "Kerning", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_Kerning_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_text_engine_Kerning, 0}; +static varinfo_t flash_text_engine_Kerning_OFF = {0x01, 0x00, 0x82, 0x16, "", "OFF", 0, &_String, &flash_text_engine_Kerning, 0}; +static varinfo_t flash_text_engine_Kerning_ON = {0x01, 0x00, 0x82, 0x16, "", "ON", 0, &_String, &flash_text_engine_Kerning, 0}; +static classinfo_t flash_text_CSMSettings = {0x03, 0x00, 0x81, 0x16, "flash.text", "CSMSettings", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_CSMSettings_fontSize = {0x01, 0x00, 0x80, 0x16, "", "fontSize", 0, &_Number, &flash_text_CSMSettings, 0}; +static varinfo_t flash_text_CSMSettings_outsideCutoff = {0x01, 0x00, 0x80, 0x16, "", "outsideCutoff", 0, &_Number, &flash_text_CSMSettings, 0}; +static varinfo_t flash_text_CSMSettings_insideCutoff = {0x01, 0x00, 0x80, 0x16, "", "insideCutoff", 0, &_Number, &flash_text_CSMSettings, 0}; +static classinfo_t _RangeError = {0x03, 0x00, 0x88, 0x16, "", "RangeError", 0, &_Error, interfaces: {0}}; +static varinfo_t _RangeError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_RangeError, 0}; +static classinfo_t _Number = {0x03, 0x00, 0x81, 0x16, "", "Number", 0, &_Object, interfaces: {0}}; +static methodinfo_t _Number_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_Number, &_Number, 0}; +static methodinfo_t _Number_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Number, 0}; +static methodinfo_t _Number_toExponential = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toExponential", 0, &_String, &_Number, 0}; +static methodinfo_t _Number_toFixed = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toFixed", 0, &_String, &_Number, 0}; +static methodinfo_t _Number_toPrecision = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toPrecision", 0, &_String, &_Number, 0}; +static varinfo_t _Number_MAX_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MAX_VALUE", 0, &_Number, &_Number, 0}; +static varinfo_t _Number_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Number, 0}; +static varinfo_t _Number_MIN_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MIN_VALUE", 0, &_Number, &_Number, 0}; +static varinfo_t _Number_NaN = {0x01, 0x00, 0x82, 0x16, "", "NaN", 0, &_Number, &_Number, 0}; +static varinfo_t _Number_POSITIVE_INFINITY = {0x01, 0x00, 0x82, 0x16, "", "POSITIVE_INFINITY", 0, &_Number, &_Number, 0}; +static varinfo_t _Number_NEGATIVE_INFINITY = {0x01, 0x00, 0x82, 0x16, "", "NEGATIVE_INFINITY", 0, &_Number, &_Number, 0}; +static classinfo_t flash_display_Graphics = {0x03, 0x00, 0x81, 0x16, "flash.display", "Graphics", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_display_Graphics_drawPath = {0x02, 0x00, 0x80, 0x16, "", "drawPath", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawEllipse = {0x02, 0x00, 0x80, 0x16, "", "drawEllipse", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawRoundRectComplex = {0x02, 0x00, 0x80, 0x16, "", "drawRoundRectComplex", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_moveTo = {0x02, 0x00, 0x80, 0x16, "", "moveTo", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_lineShaderStyle = {0x02, 0x00, 0x80, 0x16, "", "lineShaderStyle", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_beginFill = {0x02, 0x00, 0x80, 0x16, "", "beginFill", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_beginGradientFill = {0x02, 0x00, 0x80, 0x16, "", "beginGradientFill", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawGraphicsData = {0x02, 0x00, 0x80, 0x16, "", "drawGraphicsData", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_lineGradientStyle = {0x02, 0x00, 0x80, 0x16, "", "lineGradientStyle", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawRoundRect = {0x02, 0x00, 0x80, 0x16, "", "drawRoundRect", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_beginBitmapFill = {0x02, 0x00, 0x80, 0x16, "", "beginBitmapFill", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_lineStyle = {0x02, 0x00, 0x80, 0x16, "", "lineStyle", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_lineTo = {0x02, 0x00, 0x80, 0x16, "", "lineTo", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_endFill = {0x02, 0x00, 0x80, 0x16, "", "endFill", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_copyFrom = {0x02, 0x00, 0x80, 0x16, "", "copyFrom", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_lineBitmapStyle = {0x02, 0x00, 0x80, 0x16, "", "lineBitmapStyle", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_curveTo = {0x02, 0x00, 0x80, 0x16, "", "curveTo", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawCircle = {0x02, 0x00, 0x80, 0x16, "", "drawCircle", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_beginShaderFill = {0x02, 0x00, 0x80, 0x16, "", "beginShaderFill", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawTriangles = {0x02, 0x00, 0x80, 0x16, "", "drawTriangles", 0, &voidclass, &flash_display_Graphics, 0}; +static methodinfo_t flash_display_Graphics_drawRect = {0x02, 0x00, 0x80, 0x16, "", "drawRect", 0, &voidclass, &flash_display_Graphics, 0}; +static classinfo_t _SyntaxError = {0x03, 0x00, 0x88, 0x16, "", "SyntaxError", 0, &_Error, interfaces: {0}}; +static varinfo_t _SyntaxError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_SyntaxError, 0}; +static classinfo_t flash_sampler_NewObjectSample = {0x03, 0x00, 0x81, 0x16, "flash.sampler", "NewObjectSample", 0, &flash_sampler_Sample, interfaces: {0}}; +static varinfo_t flash_sampler_NewObjectSample_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_Class, &flash_sampler_NewObjectSample, 0}; +static varinfo_t flash_sampler_NewObjectSample_object = {0x01, 0x00, 0x80, 0x16, "", "object", 0, 0, &flash_sampler_NewObjectSample, 0}; +static varinfo_t flash_sampler_NewObjectSample_id = {0x01, 0x00, 0x80, 0x16, "", "id", 0, &_Number, &flash_sampler_NewObjectSample, 0}; +static classinfo_t flash_net_FileFilter = {0x03, 0x00, 0x81, 0x16, "flash.net", "FileFilter", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_net_FileFilter_extension = {0x01, 0x00, 0x80, 0x16, "", "extension", 0, &_String, &flash_net_FileFilter, 0}; +static varinfo_t flash_net_FileFilter_description = {0x01, 0x00, 0x80, 0x16, "", "description", 0, &_String, &flash_net_FileFilter, 0}; +static varinfo_t flash_net_FileFilter_macType = {0x01, 0x00, 0x80, 0x16, "", "macType", 0, &_String, &flash_net_FileFilter, 0}; +static classinfo_t flash_display_BitmapDataChannel = {0x03, 0x00, 0x81, 0x16, "flash.display", "BitmapDataChannel", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_BitmapDataChannel_BLUE = {0x01, 0x00, 0x82, 0x16, "", "BLUE", 0, &_uint, &flash_display_BitmapDataChannel, 0}; +static varinfo_t flash_display_BitmapDataChannel_GREEN = {0x01, 0x00, 0x82, 0x16, "", "GREEN", 0, &_uint, &flash_display_BitmapDataChannel, 0}; +static varinfo_t flash_display_BitmapDataChannel_ALPHA = {0x01, 0x00, 0x82, 0x16, "", "ALPHA", 0, &_uint, &flash_display_BitmapDataChannel, 0}; +static varinfo_t flash_display_BitmapDataChannel_RED = {0x01, 0x00, 0x82, 0x16, "", "RED", 0, &_uint, &flash_display_BitmapDataChannel, 0}; +static methodinfo_t flash_utils_clearInterval = {0x02, 0x00, 0x82, 0x16, "flash.utils", "clearInterval", 0, &voidclass, 0, 0}; +static classinfo_t flash_text_engine_ContentElement = {0x03, 0x00, 0x80, 0x16, "flash.text.engine", "ContentElement", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_ContentElement_eventMirror = {0x01, 0x00, 0x80, 0x16, "", "eventMirror", 0, &flash_events_EventDispatcher, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_groupElement = {0x01, 0x00, 0x80, 0x16, "", "groupElement", 0, &flash_text_engine_GroupElement, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_textRotation = {0x01, 0x00, 0x80, 0x16, "", "textRotation", 0, &_String, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_userData = {0x01, 0x00, 0x80, 0x16, "", "userData", 0, 0, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_elementFormat = {0x01, 0x00, 0x80, 0x16, "", "elementFormat", 0, &flash_text_engine_ElementFormat, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_textBlock = {0x01, 0x00, 0x80, 0x16, "", "textBlock", 0, &flash_text_engine_TextBlock, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_rawText = {0x01, 0x00, 0x80, 0x16, "", "rawText", 0, &_String, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_textBlockBeginIndex = {0x01, 0x00, 0x80, 0x16, "", "textBlockBeginIndex", 0, &_int, &flash_text_engine_ContentElement, 0}; +static varinfo_t flash_text_engine_ContentElement_GRAPHIC_ELEMENT = {0x01, 0x00, 0x82, 0x16, "", "GRAPHIC_ELEMENT", 0, &_uint, &flash_text_engine_ContentElement, 0}; +static classinfo_t flash_utils_Endian = {0x03, 0x00, 0x81, 0x16, "flash.utils", "Endian", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_utils_Endian_LITTLE_ENDIAN = {0x01, 0x00, 0x82, 0x16, "", "LITTLE_ENDIAN", 0, &_String, &flash_utils_Endian, 0}; +static varinfo_t flash_utils_Endian_BIG_ENDIAN = {0x01, 0x00, 0x82, 0x16, "", "BIG_ENDIAN", 0, &_String, &flash_utils_Endian, 0}; +static methodinfo_t flash_net_navigateToURL = {0x02, 0x00, 0x82, 0x16, "flash.net", "navigateToURL", 0, &voidclass, 0, 0}; +static classinfo_t flash_events_ProgressEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ProgressEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_ProgressEvent_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_events_ProgressEvent, 0}; +static methodinfo_t flash_events_ProgressEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ProgressEvent, 0}; +static varinfo_t flash_events_ProgressEvent_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_events_ProgressEvent, 0}; +static methodinfo_t flash_events_ProgressEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ProgressEvent, 0}; +static varinfo_t flash_events_ProgressEvent_PROGRESS = {0x01, 0x00, 0x82, 0x16, "", "PROGRESS", 0, &_String, &flash_events_ProgressEvent, 0}; +static varinfo_t flash_events_ProgressEvent_SOCKET_DATA = {0x01, 0x00, 0x82, 0x16, "", "SOCKET_DATA", 0, &_String, &flash_events_ProgressEvent, 0}; +static classinfo_t flash_media_Sound = {0x03, 0x00, 0x80, 0x16, "flash.media", "Sound", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_media_Sound_extract = {0x02, 0x00, 0x80, 0x16, "", "extract", 0, &_Number, &flash_media_Sound, 0}; +static varinfo_t flash_media_Sound_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_media_Sound, 0}; +static varinfo_t flash_media_Sound_id3 = {0x01, 0x00, 0x80, 0x16, "", "id3", 0, &flash_media_ID3Info, &flash_media_Sound, 0}; +static methodinfo_t flash_media_Sound_play = {0x02, 0x00, 0x80, 0x16, "", "play", 0, &flash_media_SoundChannel, &flash_media_Sound, 0}; +static varinfo_t flash_media_Sound_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_media_Sound, 0}; +static varinfo_t flash_media_Sound_isBuffering = {0x01, 0x00, 0x80, 0x16, "", "isBuffering", 0, &_Boolean, &flash_media_Sound, 0}; +static methodinfo_t flash_media_Sound_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_media_Sound, 0}; +static varinfo_t flash_media_Sound_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_int, &flash_media_Sound, 0}; +static varinfo_t flash_media_Sound_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_Number, &flash_media_Sound, 0}; +static methodinfo_t flash_media_Sound_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_media_Sound, 0}; +static classinfo_t flash_text_TextExtent = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextExtent", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextExtent_descent = {0x01, 0x00, 0x80, 0x16, "", "descent", 0, &_Number, &flash_text_TextExtent, 0}; +static varinfo_t flash_text_TextExtent_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_text_TextExtent, 0}; +static varinfo_t flash_text_TextExtent_ascent = {0x01, 0x00, 0x80, 0x16, "", "ascent", 0, &_Number, &flash_text_TextExtent, 0}; +static varinfo_t flash_text_TextExtent_textFieldHeight = {0x01, 0x00, 0x80, 0x16, "", "textFieldHeight", 0, &_Number, &flash_text_TextExtent, 0}; +static varinfo_t flash_text_TextExtent_textFieldWidth = {0x01, 0x00, 0x80, 0x16, "", "textFieldWidth", 0, &_Number, &flash_text_TextExtent, 0}; +static varinfo_t flash_text_TextExtent_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_text_TextExtent, 0}; +static classinfo_t flash_text_FontStyle = {0x03, 0x00, 0x81, 0x16, "flash.text", "FontStyle", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_FontStyle_REGULAR = {0x01, 0x00, 0x82, 0x16, "", "REGULAR", 0, &_String, &flash_text_FontStyle, 0}; +static varinfo_t flash_text_FontStyle_BOLD = {0x01, 0x00, 0x82, 0x16, "", "BOLD", 0, &_String, &flash_text_FontStyle, 0}; +static varinfo_t flash_text_FontStyle_BOLD_ITALIC = {0x01, 0x00, 0x82, 0x16, "", "BOLD_ITALIC", 0, &_String, &flash_text_FontStyle, 0}; +static varinfo_t flash_text_FontStyle_ITALIC = {0x01, 0x00, 0x82, 0x16, "", "ITALIC", 0, &_String, &flash_text_FontStyle, 0}; +static classinfo_t flash_text_engine_TextLineMirrorRegion = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLineMirrorRegion", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TextLineMirrorRegion_mirror = {0x01, 0x00, 0x80, 0x16, "", "mirror", 0, &flash_events_EventDispatcher, &flash_text_engine_TextLineMirrorRegion, 0}; +static varinfo_t flash_text_engine_TextLineMirrorRegion_previousRegion = {0x01, 0x00, 0x80, 0x16, "", "previousRegion", 0, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLineMirrorRegion, 0}; +static varinfo_t flash_text_engine_TextLineMirrorRegion_bounds = {0x01, 0x00, 0x80, 0x16, "", "bounds", 0, &flash_geom_Rectangle, &flash_text_engine_TextLineMirrorRegion, 0}; +static varinfo_t flash_text_engine_TextLineMirrorRegion_nextRegion = {0x01, 0x00, 0x80, 0x16, "", "nextRegion", 0, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLineMirrorRegion, 0}; +static varinfo_t flash_text_engine_TextLineMirrorRegion_element = {0x01, 0x00, 0x80, 0x16, "", "element", 0, &flash_text_engine_ContentElement, &flash_text_engine_TextLineMirrorRegion, 0}; +static varinfo_t flash_text_engine_TextLineMirrorRegion_textLine = {0x01, 0x00, 0x80, 0x16, "", "textLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextLineMirrorRegion, 0}; +static classinfo_t flash_geom_Vector3D = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Vector3D", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_geom_Vector3D_subtract = {0x02, 0x00, 0x80, 0x16, "", "subtract", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_scaleBy = {0x02, 0x00, 0x80, 0x16, "", "scaleBy", 0, &voidclass, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_decrementBy = {0x02, 0x00, 0x80, 0x16, "", "decrementBy", 0, &voidclass, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_equals = {0x02, 0x00, 0x80, 0x16, "", "equals", 0, &_Boolean, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_normalize = {0x02, 0x00, 0x80, 0x16, "", "normalize", 0, &_Number, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_dotProduct = {0x02, 0x00, 0x80, 0x16, "", "dotProduct", 0, &_Number, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_negate = {0x02, 0x00, 0x80, 0x16, "", "negate", 0, &voidclass, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_lengthSquared = {0x01, 0x00, 0x80, 0x16, "", "lengthSquared", 0, &_Number, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_incrementBy = {0x02, 0x00, 0x80, 0x16, "", "incrementBy", 0, &voidclass, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_w = {0x01, 0x00, 0x80, 0x16, "", "w", 0, &_Number, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_z = {0x01, 0x00, 0x80, 0x16, "", "z", 0, &_Number, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_add = {0x02, 0x00, 0x80, 0x16, "", "add", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_project = {0x02, 0x00, 0x80, 0x16, "", "project", 0, &voidclass, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_crossProduct = {0x02, 0x00, 0x80, 0x16, "", "crossProduct", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_nearEquals = {0x02, 0x00, 0x80, 0x16, "", "nearEquals", 0, &_Boolean, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_Number, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_distance = {0x02, 0x00, 0x82, 0x16, "", "distance", 0, &_Number, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_Z_AXIS = {0x01, 0x00, 0x82, 0x16, "", "Z_AXIS", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_X_AXIS = {0x01, 0x00, 0x82, 0x16, "", "X_AXIS", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static methodinfo_t flash_geom_Vector3D_angleBetween = {0x02, 0x00, 0x82, 0x16, "", "angleBetween", 0, &_Number, &flash_geom_Vector3D, 0}; +static varinfo_t flash_geom_Vector3D_Y_AXIS = {0x01, 0x00, 0x82, 0x16, "", "Y_AXIS", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; +static classinfo_t flash_desktop_ClipboardTransferMode = {0x03, 0x00, 0x80, 0x16, "flash.desktop", "ClipboardTransferMode", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_desktop_ClipboardTransferMode_CLONE_ONLY = {0x01, 0x00, 0x82, 0x16, "", "CLONE_ONLY", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; +static varinfo_t flash_desktop_ClipboardTransferMode_ORIGINAL_PREFERRED = {0x01, 0x00, 0x82, 0x16, "", "ORIGINAL_PREFERRED", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; +static varinfo_t flash_desktop_ClipboardTransferMode_CLONE_PREFERRED = {0x01, 0x00, 0x82, 0x16, "", "CLONE_PREFERRED", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; +static varinfo_t flash_desktop_ClipboardTransferMode_ORIGINAL_ONLY = {0x01, 0x00, 0x82, 0x16, "", "ORIGINAL_ONLY", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; +static classinfo_t flash_display_SpreadMethod = {0x03, 0x00, 0x81, 0x16, "flash.display", "SpreadMethod", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_SpreadMethod_REFLECT = {0x01, 0x00, 0x82, 0x16, "", "REFLECT", 0, &_String, &flash_display_SpreadMethod, 0}; +static varinfo_t flash_display_SpreadMethod_REPEAT = {0x01, 0x00, 0x82, 0x16, "", "REPEAT", 0, &_String, &flash_display_SpreadMethod, 0}; +static varinfo_t flash_display_SpreadMethod_PAD = {0x01, 0x00, 0x82, 0x16, "", "PAD", 0, &_String, &flash_display_SpreadMethod, 0}; +static classinfo_t flash_system_SecurityPanel = {0x03, 0x00, 0x81, 0x16, "flash.system", "SecurityPanel", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_system_SecurityPanel_LOCAL_STORAGE = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_STORAGE", 0, &_String, &flash_system_SecurityPanel, 0}; +static varinfo_t flash_system_SecurityPanel_CAMERA = {0x01, 0x00, 0x82, 0x16, "", "CAMERA", 0, &_String, &flash_system_SecurityPanel, 0}; +static varinfo_t flash_system_SecurityPanel_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_system_SecurityPanel, 0}; +static varinfo_t flash_system_SecurityPanel_SETTINGS_MANAGER = {0x01, 0x00, 0x82, 0x16, "", "SETTINGS_MANAGER", 0, &_String, &flash_system_SecurityPanel, 0}; +static varinfo_t flash_system_SecurityPanel_PRIVACY = {0x01, 0x00, 0x82, 0x16, "", "PRIVACY", 0, &_String, &flash_system_SecurityPanel, 0}; +static varinfo_t flash_system_SecurityPanel_MICROPHONE = {0x01, 0x00, 0x82, 0x16, "", "MICROPHONE", 0, &_String, &flash_system_SecurityPanel, 0}; +static varinfo_t flash_system_SecurityPanel_DISPLAY = {0x01, 0x00, 0x82, 0x16, "", "DISPLAY", 0, &_String, &flash_system_SecurityPanel, 0}; +static classinfo_t flash_events_HTTPStatusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "HTTPStatusEvent", 0, &flash_events_Event, interfaces: {0}}; +static methodinfo_t flash_events_HTTPStatusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_HTTPStatusEvent, 0}; +static methodinfo_t flash_events_HTTPStatusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_HTTPStatusEvent, 0}; +static varinfo_t flash_events_HTTPStatusEvent_status = {0x01, 0x00, 0x80, 0x16, "", "status", 0, &_int, &flash_events_HTTPStatusEvent, 0}; +static varinfo_t flash_events_HTTPStatusEvent_HTTP_STATUS = {0x01, 0x00, 0x82, 0x16, "", "HTTP_STATUS", 0, &_String, &flash_events_HTTPStatusEvent, 0}; +static classinfo_t flash_net_NetStreamPlayOptions = {0x03, 0x00, 0x88, 0x16, "flash.net", "NetStreamPlayOptions", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_NetStreamPlayOptions_len = {0x01, 0x00, 0x80, 0x16, "", "len", 0, &_Number, &flash_net_NetStreamPlayOptions, 0}; +static varinfo_t flash_net_NetStreamPlayOptions_streamName = {0x01, 0x00, 0x80, 0x16, "", "streamName", 0, &_String, &flash_net_NetStreamPlayOptions, 0}; +static varinfo_t flash_net_NetStreamPlayOptions_start = {0x01, 0x00, 0x80, 0x16, "", "start", 0, &_Number, &flash_net_NetStreamPlayOptions, 0}; +static varinfo_t flash_net_NetStreamPlayOptions_oldStreamName = {0x01, 0x00, 0x80, 0x16, "", "oldStreamName", 0, &_String, &flash_net_NetStreamPlayOptions, 0}; +static varinfo_t flash_net_NetStreamPlayOptions_transition = {0x01, 0x00, 0x80, 0x16, "", "transition", 0, &_String, &flash_net_NetStreamPlayOptions, 0}; +static classinfo_t flash_net_Responder = {0x03, 0x00, 0x80, 0x16, "flash.net", "Responder", 0, &_Object, interfaces: {0}}; +static classinfo_t flash_net_XMLSocket = {0x03, 0x00, 0x80, 0x16, "flash.net", "XMLSocket", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_net_XMLSocket_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_XMLSocket, 0}; +static methodinfo_t flash_net_XMLSocket_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_XMLSocket, 0}; +static methodinfo_t flash_net_XMLSocket_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_XMLSocket, 0}; +static varinfo_t flash_net_XMLSocket_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_XMLSocket, 0}; +static varinfo_t flash_net_XMLSocket_timeout = {0x01, 0x00, 0x80, 0x16, "", "timeout", 0, &_int, &flash_net_XMLSocket, 0}; +static classinfo_t flash_filters_ConvolutionFilter = {0x03, 0x00, 0x80, 0x16, "flash.filters", "ConvolutionFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_ConvolutionFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_matrixX = {0x01, 0x00, 0x80, 0x16, "", "matrixX", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &_Array, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_bias = {0x01, 0x00, 0x80, 0x16, "", "bias", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_preserveAlpha = {0x01, 0x00, 0x80, 0x16, "", "preserveAlpha", 0, &_Boolean, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_divisor = {0x01, 0x00, 0x80, 0x16, "", "divisor", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; +static methodinfo_t flash_filters_ConvolutionFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_clamp = {0x01, 0x00, 0x80, 0x16, "", "clamp", 0, &_Boolean, &flash_filters_ConvolutionFilter, 0}; +static varinfo_t flash_filters_ConvolutionFilter_matrixY = {0x01, 0x00, 0x80, 0x16, "", "matrixY", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; +static classinfo_t flash_text_engine_ElementFormat = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "ElementFormat", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_text_engine_ElementFormat_getFontMetrics = {0x02, 0x00, 0x80, 0x16, "", "getFontMetrics", 0, &flash_text_engine_FontMetrics, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_digitCase = {0x01, 0x00, 0x80, 0x16, "", "digitCase", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_breakOpportunity = {0x01, 0x00, 0x80, 0x16, "", "breakOpportunity", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_ligatureLevel = {0x01, 0x00, 0x80, 0x16, "", "ligatureLevel", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_dominantBaseline = {0x01, 0x00, 0x80, 0x16, "", "dominantBaseline", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_alignmentBaseline = {0x01, 0x00, 0x80, 0x16, "", "alignmentBaseline", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_digitWidth = {0x01, 0x00, 0x80, 0x16, "", "digitWidth", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_kerning = {0x01, 0x00, 0x80, 0x16, "", "kerning", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_fontSize = {0x01, 0x00, 0x80, 0x16, "", "fontSize", 0, &_Number, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_fontDescription = {0x01, 0x00, 0x80, 0x16, "", "fontDescription", 0, &flash_text_engine_FontDescription, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_baselineShift = {0x01, 0x00, 0x80, 0x16, "", "baselineShift", 0, &_Number, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_locale = {0x01, 0x00, 0x80, 0x16, "", "locale", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_typographicCase = {0x01, 0x00, 0x80, 0x16, "", "typographicCase", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_trackingLeft = {0x01, 0x00, 0x80, 0x16, "", "trackingLeft", 0, &_Number, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_locked = {0x01, 0x00, 0x80, 0x16, "", "locked", 0, &_Boolean, &flash_text_engine_ElementFormat, 0}; +static methodinfo_t flash_text_engine_ElementFormat_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_ElementFormat, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_textRotation = {0x01, 0x00, 0x80, 0x16, "", "textRotation", 0, &_String, &flash_text_engine_ElementFormat, 0}; +static varinfo_t flash_text_engine_ElementFormat_trackingRight = {0x01, 0x00, 0x80, 0x16, "", "trackingRight", 0, &_Number, &flash_text_engine_ElementFormat, 0}; +static classinfo_t flash_display_GraphicsGradientFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsGradientFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; +static varinfo_t flash_display_GraphicsGradientFill_interpolationMethod = {0x01, 0x00, 0x80, 0x16, "", "interpolationMethod", 0, &_String, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_focalPointRatio = {0x01, 0x00, 0x80, 0x16, "", "focalPointRatio", 0, &_Number, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_colors = {0x01, 0x00, 0x80, 0x16, "", "colors", 0, &_Array, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_ratios = {0x01, 0x00, 0x80, 0x16, "", "ratios", 0, &_Array, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_spreadMethod = {0x01, 0x00, 0x80, 0x16, "", "spreadMethod", 0, &_String, &flash_display_GraphicsGradientFill, 0}; +static varinfo_t flash_display_GraphicsGradientFill_alphas = {0x01, 0x00, 0x80, 0x16, "", "alphas", 0, &_Array, &flash_display_GraphicsGradientFill, 0}; +static classinfo_t flash_display_FrameLabel = {0x03, 0x00, 0x81, 0x16, "flash.display", "FrameLabel", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_FrameLabel_frame = {0x01, 0x00, 0x80, 0x16, "", "frame", 0, &_int, &flash_display_FrameLabel, 0}; +static varinfo_t flash_display_FrameLabel_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_display_FrameLabel, 0}; +static classinfo_t flash_media_SoundTransform = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundTransform", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_media_SoundTransform_pan = {0x01, 0x00, 0x80, 0x16, "", "pan", 0, &_Number, &flash_media_SoundTransform, 0}; +static varinfo_t flash_media_SoundTransform_leftToRight = {0x01, 0x00, 0x80, 0x16, "", "leftToRight", 0, &_Number, &flash_media_SoundTransform, 0}; +static varinfo_t flash_media_SoundTransform_rightToLeft = {0x01, 0x00, 0x80, 0x16, "", "rightToLeft", 0, &_Number, &flash_media_SoundTransform, 0}; +static varinfo_t flash_media_SoundTransform_volume = {0x01, 0x00, 0x80, 0x16, "", "volume", 0, &_Number, &flash_media_SoundTransform, 0}; +static varinfo_t flash_media_SoundTransform_leftToLeft = {0x01, 0x00, 0x80, 0x16, "", "leftToLeft", 0, &_Number, &flash_media_SoundTransform, 0}; +static varinfo_t flash_media_SoundTransform_rightToRight = {0x01, 0x00, 0x80, 0x16, "", "rightToRight", 0, &_Number, &flash_media_SoundTransform, 0}; +static namespace_t _AS3_constant_ns = {0x08, "http://adobe.com/AS3/2006/builtin"}; +static constant_t _AS3_constant = {type: 8, &_AS3_constant_ns}; +static varinfo_t _AS3 = {0x01, 0x00, 0xa2, 0x16, "", "AS3", 0, 0, 0, &_AS3_constant}; +static classinfo_t flash_net_LocalConnection = {0x03, 0x00, 0x80, 0x16, "flash.net", "LocalConnection", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t flash_net_LocalConnection_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_LocalConnection, 0}; +static methodinfo_t flash_net_LocalConnection_allowDomain = {0x02, 0x00, 0x80, 0x16, "", "allowDomain", 0, &voidclass, &flash_net_LocalConnection, 0}; +static methodinfo_t flash_net_LocalConnection_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_LocalConnection, 0}; +static varinfo_t flash_net_LocalConnection_domain = {0x01, 0x00, 0x80, 0x16, "", "domain", 0, &_String, &flash_net_LocalConnection, 0}; +static methodinfo_t flash_net_LocalConnection_allowInsecureDomain = {0x02, 0x00, 0x80, 0x16, "", "allowInsecureDomain", 0, &voidclass, &flash_net_LocalConnection, 0}; +static methodinfo_t flash_net_LocalConnection_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_LocalConnection, 0}; +static methodinfo_t flash_net_LocalConnection_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_LocalConnection, 0}; +static classinfo_t flash_display_ShaderParameterType = {0x03, 0x00, 0x81, 0x16, "flash.display", "ShaderParameterType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_ShaderParameterType_FLOAT = {0x01, 0x00, 0x82, 0x16, "", "FLOAT", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_BOOL = {0x01, 0x00, 0x82, 0x16, "", "BOOL", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_FLOAT2 = {0x01, 0x00, 0x82, 0x16, "", "FLOAT2", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_MATRIX2X2 = {0x01, 0x00, 0x82, 0x16, "", "MATRIX2X2", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_INT = {0x01, 0x00, 0x82, 0x16, "", "INT", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_INT4 = {0x01, 0x00, 0x82, 0x16, "", "INT4", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_MATRIX4X4 = {0x01, 0x00, 0x82, 0x16, "", "MATRIX4X4", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_FLOAT3 = {0x01, 0x00, 0x82, 0x16, "", "FLOAT3", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_BOOL2 = {0x01, 0x00, 0x82, 0x16, "", "BOOL2", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_INT3 = {0x01, 0x00, 0x82, 0x16, "", "INT3", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_BOOL3 = {0x01, 0x00, 0x82, 0x16, "", "BOOL3", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_BOOL4 = {0x01, 0x00, 0x82, 0x16, "", "BOOL4", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_FLOAT4 = {0x01, 0x00, 0x82, 0x16, "", "FLOAT4", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_INT2 = {0x01, 0x00, 0x82, 0x16, "", "INT2", 0, &_String, &flash_display_ShaderParameterType, 0}; +static varinfo_t flash_display_ShaderParameterType_MATRIX3X3 = {0x01, 0x00, 0x82, 0x16, "", "MATRIX3X3", 0, &_String, &flash_display_ShaderParameterType, 0}; +static classinfo_t flash_events_IMEEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "IMEEvent", 0, &flash_events_TextEvent, interfaces: {0}}; +static methodinfo_t flash_events_IMEEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_IMEEvent, 0}; +static methodinfo_t flash_events_IMEEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_IMEEvent, 0}; +static varinfo_t flash_events_IMEEvent_IME_COMPOSITION = {0x01, 0x00, 0x82, 0x16, "", "IME_COMPOSITION", 0, &_String, &flash_events_IMEEvent, 0}; +static classinfo_t flash_text_TextFormatDisplay = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFormatDisplay", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextFormatDisplay_INLINE = {0x01, 0x00, 0x82, 0x16, "", "INLINE", 0, &_String, &flash_text_TextFormatDisplay, 0}; +static varinfo_t flash_text_TextFormatDisplay_BLOCK = {0x01, 0x00, 0x82, 0x16, "", "BLOCK", 0, &_String, &flash_text_TextFormatDisplay, 0}; +static methodinfo_t flash_profiler_profile = {0x02, 0x00, 0x82, 0x16, "flash.profiler", "profile", 0, &voidclass, 0, 0}; +static classinfo_t flash_display_AVM1Movie = {0x03, 0x00, 0x80, 0x16, "flash.display", "AVM1Movie", 0, &flash_display_DisplayObject, interfaces: {0}}; +static methodinfo_t flash_display_AVM1Movie_call = {0x02, 0x00, 0x80, 0x16, "", "call", 0, 0, &flash_display_AVM1Movie, 0}; +static methodinfo_t flash_display_AVM1Movie_addCallback = {0x02, 0x00, 0x80, 0x16, "", "addCallback", 0, &voidclass, &flash_display_AVM1Movie, 0}; +static classinfo_t flash_events_ContextMenuEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ContextMenuEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_ContextMenuEvent_mouseTarget = {0x01, 0x00, 0x80, 0x16, "", "mouseTarget", 0, &flash_display_InteractiveObject, &flash_events_ContextMenuEvent, 0}; +static varinfo_t flash_events_ContextMenuEvent_isMouseTargetInaccessible = {0x01, 0x00, 0x80, 0x16, "", "isMouseTargetInaccessible", 0, &_Boolean, &flash_events_ContextMenuEvent, 0}; +static methodinfo_t flash_events_ContextMenuEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ContextMenuEvent, 0}; +static varinfo_t flash_events_ContextMenuEvent_contextMenuOwner = {0x01, 0x00, 0x80, 0x16, "", "contextMenuOwner", 0, &flash_display_InteractiveObject, &flash_events_ContextMenuEvent, 0}; +static methodinfo_t flash_events_ContextMenuEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ContextMenuEvent, 0}; +static varinfo_t flash_events_ContextMenuEvent_MENU_SELECT = {0x01, 0x00, 0x82, 0x16, "", "MENU_SELECT", 0, &_String, &flash_events_ContextMenuEvent, 0}; +static varinfo_t flash_events_ContextMenuEvent_MENU_ITEM_SELECT = {0x01, 0x00, 0x82, 0x16, "", "MENU_ITEM_SELECT", 0, &_String, &flash_events_ContextMenuEvent, 0}; +static classinfo_t flash_events_EventPhase = {0x03, 0x00, 0x81, 0x16, "flash.events", "EventPhase", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_events_EventPhase_BUBBLING_PHASE = {0x01, 0x00, 0x82, 0x16, "", "BUBBLING_PHASE", 0, &_uint, &flash_events_EventPhase, 0}; +static varinfo_t flash_events_EventPhase_CAPTURING_PHASE = {0x01, 0x00, 0x82, 0x16, "", "CAPTURING_PHASE", 0, &_uint, &flash_events_EventPhase, 0}; +static varinfo_t flash_events_EventPhase_AT_TARGET = {0x01, 0x00, 0x82, 0x16, "", "AT_TARGET", 0, &_uint, &flash_events_EventPhase, 0}; +static classinfo_t flash_display_JointStyle = {0x03, 0x00, 0x81, 0x16, "flash.display", "JointStyle", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_JointStyle_ROUND = {0x01, 0x00, 0x82, 0x16, "", "ROUND", 0, &_String, &flash_display_JointStyle, 0}; +static varinfo_t flash_display_JointStyle_MITER = {0x01, 0x00, 0x82, 0x16, "", "MITER", 0, &_String, &flash_display_JointStyle, 0}; +static varinfo_t flash_display_JointStyle_BEVEL = {0x01, 0x00, 0x82, 0x16, "", "BEVEL", 0, &_String, &flash_display_JointStyle, 0}; +static classinfo_t flash_utils_Dictionary = {0x03, 0x00, 0x88, 0x16, "flash.utils", "Dictionary", 0, &_Object, interfaces: {0}}; +static classinfo_t flash_display_GraphicsPathCommand = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsPathCommand", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_GraphicsPathCommand_NO_OP = {0x01, 0x00, 0x82, 0x16, "", "NO_OP", 0, &_int, &flash_display_GraphicsPathCommand, 0}; +static varinfo_t flash_display_GraphicsPathCommand_MOVE_TO = {0x01, 0x00, 0x82, 0x16, "", "MOVE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; +static varinfo_t flash_display_GraphicsPathCommand_WIDE_MOVE_TO = {0x01, 0x00, 0x82, 0x16, "", "WIDE_MOVE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; +static varinfo_t flash_display_GraphicsPathCommand_CURVE_TO = {0x01, 0x00, 0x82, 0x16, "", "CURVE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; +static varinfo_t flash_display_GraphicsPathCommand_LINE_TO = {0x01, 0x00, 0x82, 0x16, "", "LINE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; +static varinfo_t flash_display_GraphicsPathCommand_WIDE_LINE_TO = {0x01, 0x00, 0x82, 0x16, "", "WIDE_LINE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; +static classinfo_t flash_filters_BevelFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BevelFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_BevelFilter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_highlightColor = {0x01, 0x00, 0x80, 0x16, "", "highlightColor", 0, &_uint, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_highlightAlpha = {0x01, 0x00, 0x80, 0x16, "", "highlightAlpha", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_shadowColor = {0x01, 0x00, 0x80, 0x16, "", "shadowColor", 0, &_uint, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_shadowAlpha = {0x01, 0x00, 0x80, 0x16, "", "shadowAlpha", 0, &_Number, &flash_filters_BevelFilter, 0}; +static varinfo_t flash_filters_BevelFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_BevelFilter, 0}; +static methodinfo_t flash_filters_BevelFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_BevelFilter, 0}; +static methodinfo_t flash_utils_getTimer = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getTimer", 0, &_int, 0, 0}; +static classinfo_t flash_display_Loader = {0x03, 0x00, 0x80, 0x16, "flash.display", "Loader", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; +static varinfo_t flash_display_Loader_content = {0x01, 0x00, 0x80, 0x16, "", "content", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_unloadAndStop = {0x02, 0x00, 0x80, 0x16, "", "unloadAndStop", 0, &voidclass, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_unload = {0x02, 0x00, 0x80, 0x16, "", "unload", 0, &voidclass, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_removeChildAt = {0x02, 0x00, 0x80, 0x16, "", "removeChildAt", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_addChildAt = {0x02, 0x00, 0x80, 0x16, "", "addChildAt", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; +static varinfo_t flash_display_Loader_contentLoaderInfo = {0x01, 0x00, 0x80, 0x16, "", "contentLoaderInfo", 0, &flash_display_LoaderInfo, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_loadBytes = {0x02, 0x00, 0x80, 0x16, "", "loadBytes", 0, &voidclass, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_removeChild = {0x02, 0x00, 0x80, 0x16, "", "removeChild", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_addChild = {0x02, 0x00, 0x80, 0x16, "", "addChild", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_display_Loader, 0}; +static methodinfo_t flash_display_Loader_setChildIndex = {0x02, 0x00, 0x80, 0x16, "", "setChildIndex", 0, &voidclass, &flash_display_Loader, 0}; +static classinfo_t flash_display_GraphicsBitmapFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsBitmapFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; +static varinfo_t flash_display_GraphicsBitmapFill_smooth = {0x01, 0x00, 0x80, 0x16, "", "smooth", 0, &_Boolean, &flash_display_GraphicsBitmapFill, 0}; +static varinfo_t flash_display_GraphicsBitmapFill_repeat = {0x01, 0x00, 0x80, 0x16, "", "repeat", 0, &_Boolean, &flash_display_GraphicsBitmapFill, 0}; +static varinfo_t flash_display_GraphicsBitmapFill_bitmapData = {0x01, 0x00, 0x80, 0x16, "", "bitmapData", 0, &flash_display_BitmapData, &flash_display_GraphicsBitmapFill, 0}; +static varinfo_t flash_display_GraphicsBitmapFill_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_display_GraphicsBitmapFill, 0}; +static varinfo_t _undefined = {0x01, 0x00, 0xa2, 0x16, "", "undefined", 0, 0, 0, 0}; +static classinfo_t flash_display_SimpleButton = {0x03, 0x00, 0x80, 0x16, "flash.display", "SimpleButton", 0, &flash_display_InteractiveObject, interfaces: {0}}; +static varinfo_t flash_display_SimpleButton_overState = {0x01, 0x00, 0x80, 0x16, "", "overState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_downState = {0x01, 0x00, 0x80, 0x16, "", "downState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_enabled = {0x01, 0x00, 0x80, 0x16, "", "enabled", 0, &_Boolean, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_trackAsMenu = {0x01, 0x00, 0x80, 0x16, "", "trackAsMenu", 0, &_Boolean, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_useHandCursor = {0x01, 0x00, 0x80, 0x16, "", "useHandCursor", 0, &_Boolean, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_upState = {0x01, 0x00, 0x80, 0x16, "", "upState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; +static varinfo_t flash_display_SimpleButton_hitTestState = {0x01, 0x00, 0x80, 0x16, "", "hitTestState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; +static classinfo_t flash_text_engine_TabAlignment = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TabAlignment", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TabAlignment_END = {0x01, 0x00, 0x82, 0x16, "", "END", 0, &_String, &flash_text_engine_TabAlignment, 0}; +static varinfo_t flash_text_engine_TabAlignment_CENTER = {0x01, 0x00, 0x82, 0x16, "", "CENTER", 0, &_String, &flash_text_engine_TabAlignment, 0}; +static varinfo_t flash_text_engine_TabAlignment_START = {0x01, 0x00, 0x82, 0x16, "", "START", 0, &_String, &flash_text_engine_TabAlignment, 0}; +static varinfo_t flash_text_engine_TabAlignment_DECIMAL = {0x01, 0x00, 0x82, 0x16, "", "DECIMAL", 0, &_String, &flash_text_engine_TabAlignment, 0}; +static classinfo_t flash_text_engine_FontWeight = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontWeight", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_FontWeight_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_engine_FontWeight, 0}; +static varinfo_t flash_text_engine_FontWeight_BOLD = {0x01, 0x00, 0x82, 0x16, "", "BOLD", 0, &_String, &flash_text_engine_FontWeight, 0}; +static methodinfo_t flash_utils_describeType = {0x02, 0x00, 0x82, 0x16, "flash.utils", "describeType", 0, &_XML, 0, 0}; +static classinfo_t flash_display_PixelSnapping = {0x03, 0x00, 0x81, 0x16, "flash.display", "PixelSnapping", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_PixelSnapping_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_display_PixelSnapping, 0}; +static varinfo_t flash_display_PixelSnapping_NEVER = {0x01, 0x00, 0x82, 0x16, "", "NEVER", 0, &_String, &flash_display_PixelSnapping, 0}; +static varinfo_t flash_display_PixelSnapping_ALWAYS = {0x01, 0x00, 0x82, 0x16, "", "ALWAYS", 0, &_String, &flash_display_PixelSnapping, 0}; +static classinfo_t flash_events_FocusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "FocusEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_FocusEvent_keyCode = {0x01, 0x00, 0x80, 0x16, "", "keyCode", 0, &_uint, &flash_events_FocusEvent, 0}; +static methodinfo_t flash_events_FocusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_isRelatedObjectInaccessible = {0x01, 0x00, 0x80, 0x16, "", "isRelatedObjectInaccessible", 0, &_Boolean, &flash_events_FocusEvent, 0}; +static methodinfo_t flash_events_FocusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_shiftKey = {0x01, 0x00, 0x80, 0x16, "", "shiftKey", 0, &_Boolean, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_relatedObject = {0x01, 0x00, 0x80, 0x16, "", "relatedObject", 0, &flash_display_InteractiveObject, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_FOCUS_IN = {0x01, 0x00, 0x82, 0x16, "", "FOCUS_IN", 0, &_String, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_FOCUS_OUT = {0x01, 0x00, 0x82, 0x16, "", "FOCUS_OUT", 0, &_String, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_KEY_FOCUS_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "KEY_FOCUS_CHANGE", 0, &_String, &flash_events_FocusEvent, 0}; +static varinfo_t flash_events_FocusEvent_MOUSE_FOCUS_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_FOCUS_CHANGE", 0, &_String, &flash_events_FocusEvent, 0}; +static classinfo_t flash_errors_MemoryError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "MemoryError", 0, &_Error, interfaces: {0}}; +static classinfo_t flash_events_NetFilterEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "NetFilterEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_NetFilterEvent_header = {0x01, 0x00, 0x80, 0x16, "", "header", 0, &flash_utils_ByteArray, &flash_events_NetFilterEvent, 0}; +static methodinfo_t flash_events_NetFilterEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_NetFilterEvent, 0}; +static methodinfo_t flash_events_NetFilterEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_NetFilterEvent, 0}; +static varinfo_t flash_events_NetFilterEvent_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_utils_ByteArray, &flash_events_NetFilterEvent, 0}; +static methodinfo_t _decodeURI = {0x02, 0x00, 0x82, 0x16, "", "decodeURI", 0, &_String, 0, 0}; +static methodinfo_t _encodeURI = {0x02, 0x00, 0x82, 0x16, "", "encodeURI", 0, &_String, 0, 0}; +static classinfo_t flash_text_engine_TextBaseline = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextBaseline", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TextBaseline_ROMAN = {0x01, 0x00, 0x82, 0x16, "", "ROMAN", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static varinfo_t flash_text_engine_TextBaseline_DESCENT = {0x01, 0x00, 0x82, 0x16, "", "DESCENT", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static varinfo_t flash_text_engine_TextBaseline_IDEOGRAPHIC_CENTER = {0x01, 0x00, 0x82, 0x16, "", "IDEOGRAPHIC_CENTER", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static varinfo_t flash_text_engine_TextBaseline_USE_DOMINANT_BASELINE = {0x01, 0x00, 0x82, 0x16, "", "USE_DOMINANT_BASELINE", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static varinfo_t flash_text_engine_TextBaseline_IDEOGRAPHIC_BOTTOM = {0x01, 0x00, 0x82, 0x16, "", "IDEOGRAPHIC_BOTTOM", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static varinfo_t flash_text_engine_TextBaseline_ASCENT = {0x01, 0x00, 0x82, 0x16, "", "ASCENT", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static varinfo_t flash_text_engine_TextBaseline_IDEOGRAPHIC_TOP = {0x01, 0x00, 0x82, 0x16, "", "IDEOGRAPHIC_TOP", 0, &_String, &flash_text_engine_TextBaseline, 0}; +static classinfo_t flash_external_ExternalInterface = {0x03, 0x00, 0x81, 0x16, "flash.external", "ExternalInterface", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_external_ExternalInterface_call = {0x02, 0x00, 0x82, 0x16, "", "call", 0, 0, &flash_external_ExternalInterface, 0}; +static varinfo_t flash_external_ExternalInterface_available = {0x01, 0x00, 0x82, 0x16, "", "available", 0, &_Boolean, &flash_external_ExternalInterface, 0}; +static methodinfo_t flash_external_ExternalInterface_addCallback = {0x02, 0x00, 0x82, 0x16, "", "addCallback", 0, &voidclass, &flash_external_ExternalInterface, 0}; +static varinfo_t flash_external_ExternalInterface_marshallExceptions = {0x01, 0x00, 0x82, 0x16, "", "marshallExceptions", 0, &_Boolean, &flash_external_ExternalInterface, 0}; +static varinfo_t flash_external_ExternalInterface_objectID = {0x01, 0x00, 0x82, 0x16, "", "objectID", 0, &_String, &flash_external_ExternalInterface, 0}; +static classinfo_t _EvalError = {0x03, 0x00, 0x88, 0x16, "", "EvalError", 0, &_Error, interfaces: {0}}; +static varinfo_t _EvalError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_EvalError, 0}; +static classinfo_t flash_text_engine_DigitCase = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "DigitCase", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_DigitCase_OLD_STYLE = {0x01, 0x00, 0x82, 0x16, "", "OLD_STYLE", 0, &_String, &flash_text_engine_DigitCase, 0}; +static varinfo_t flash_text_engine_DigitCase_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_engine_DigitCase, 0}; +static varinfo_t flash_text_engine_DigitCase_LINING = {0x01, 0x00, 0x82, 0x16, "", "LINING", 0, &_String, &flash_text_engine_DigitCase, 0}; +static classinfo_t flash_text_TextFormatAlign = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFormatAlign", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_TextFormatAlign_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_String, &flash_text_TextFormatAlign, 0}; +static varinfo_t flash_text_TextFormatAlign_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_String, &flash_text_TextFormatAlign, 0}; +static varinfo_t flash_text_TextFormatAlign_CENTER = {0x01, 0x00, 0x82, 0x16, "", "CENTER", 0, &_String, &flash_text_TextFormatAlign, 0}; +static varinfo_t flash_text_TextFormatAlign_JUSTIFY = {0x01, 0x00, 0x82, 0x16, "", "JUSTIFY", 0, &_String, &flash_text_TextFormatAlign, 0}; +static classinfo_t flash_errors_ScriptTimeoutError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "ScriptTimeoutError", 0, &_Error, interfaces: {0}}; +static classinfo_t _uint = {0x03, 0x00, 0x81, 0x16, "", "uint", 0, &_Object, interfaces: {0}}; +static methodinfo_t _uint_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_uint, &_uint, 0}; +static methodinfo_t _uint_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_uint, 0}; +static methodinfo_t _uint_toExponential = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toExponential", 0, &_String, &_uint, 0}; +static methodinfo_t _uint_toFixed = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toFixed", 0, &_String, &_uint, 0}; +static methodinfo_t _uint_toPrecision = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toPrecision", 0, &_String, &_uint, 0}; +static varinfo_t _uint_MAX_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MAX_VALUE", 0, &_uint, &_uint, 0}; +static varinfo_t _uint_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_uint, 0}; +static varinfo_t _uint_MIN_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MIN_VALUE", 0, &_uint, &_uint, 0}; +static methodinfo_t flash_debugger_enterDebugger = {0x02, 0x00, 0x82, 0x16, "flash.debugger", "enterDebugger", 0, &voidclass, 0, 0}; +static classinfo_t flash_geom_Orientation3D = {0x03, 0x00, 0x81, 0x16, "flash.geom", "Orientation3D", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_geom_Orientation3D_QUATERNION = {0x01, 0x00, 0x82, 0x16, "", "QUATERNION", 0, &_String, &flash_geom_Orientation3D, 0}; +static varinfo_t flash_geom_Orientation3D_EULER_ANGLES = {0x01, 0x00, 0x82, 0x16, "", "EULER_ANGLES", 0, &_String, &flash_geom_Orientation3D, 0}; +static varinfo_t flash_geom_Orientation3D_AXIS_ANGLE = {0x01, 0x00, 0x82, 0x16, "", "AXIS_ANGLE", 0, &_String, &flash_geom_Orientation3D, 0}; +static classinfo_t flash_text_engine_CFFHinting = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "CFFHinting", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_CFFHinting_HORIZONTAL_STEM = {0x01, 0x00, 0x82, 0x16, "", "HORIZONTAL_STEM", 0, &_String, &flash_text_engine_CFFHinting, 0}; +static varinfo_t flash_text_engine_CFFHinting_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_engine_CFFHinting, 0}; +static classinfo_t flash_text_FontType = {0x03, 0x00, 0x81, 0x16, "flash.text", "FontType", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_FontType_EMBEDDED = {0x01, 0x00, 0x82, 0x16, "", "EMBEDDED", 0, &_String, &flash_text_FontType, 0}; +static varinfo_t flash_text_FontType_DEVICE = {0x01, 0x00, 0x82, 0x16, "", "DEVICE", 0, &_String, &flash_text_FontType, 0}; +static varinfo_t flash_text_FontType_EMBEDDED_CFF = {0x01, 0x00, 0x82, 0x16, "", "EMBEDDED_CFF", 0, &_String, &flash_text_FontType, 0}; +static classinfo_t flash_filters_ShaderFilter = {0x03, 0x00, 0x80, 0x16, "flash.filters", "ShaderFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_ShaderFilter_bottomExtension = {0x01, 0x00, 0x80, 0x16, "", "bottomExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; +static varinfo_t flash_filters_ShaderFilter_shader = {0x01, 0x00, 0x80, 0x16, "", "shader", 0, &flash_display_Shader, &flash_filters_ShaderFilter, 0}; +static varinfo_t flash_filters_ShaderFilter_rightExtension = {0x01, 0x00, 0x80, 0x16, "", "rightExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; +static varinfo_t flash_filters_ShaderFilter_leftExtension = {0x01, 0x00, 0x80, 0x16, "", "leftExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; +static varinfo_t flash_filters_ShaderFilter_topExtension = {0x01, 0x00, 0x80, 0x16, "", "topExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; +static classinfo_t flash_display_GraphicsPath = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsPath", 0, &_Object, interfaces: {&flash_display_IGraphicsPath, &flash_display_IGraphicsData, 0}}; +static methodinfo_t flash_display_GraphicsPath_wideMoveTo = {0x02, 0x00, 0x80, 0x16, "", "wideMoveTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; +static varinfo_t flash_display_GraphicsPath_winding = {0x01, 0x00, 0x80, 0x16, "", "winding", 0, &_String, &flash_display_GraphicsPath, 0}; +static methodinfo_t flash_display_GraphicsPath_moveTo = {0x02, 0x00, 0x80, 0x16, "", "moveTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; +static methodinfo_t flash_display_GraphicsPath_wideLineTo = {0x02, 0x00, 0x80, 0x16, "", "wideLineTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; +static varinfo_t flash_display_GraphicsPath_commands = {0x01, 0x00, 0x80, 0x16, "", "commands", 0, &__AS3___vec_Vector, &flash_display_GraphicsPath, 0}; +static methodinfo_t flash_display_GraphicsPath_curveTo = {0x02, 0x00, 0x80, 0x16, "", "curveTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; +static methodinfo_t flash_display_GraphicsPath_lineTo = {0x02, 0x00, 0x80, 0x16, "", "lineTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; +static varinfo_t flash_display_GraphicsPath_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &__AS3___vec_Vector, &flash_display_GraphicsPath, 0}; +static classinfo_t flash_system_ApplicationDomain = {0x03, 0x00, 0x81, 0x16, "flash.system", "ApplicationDomain", 0, &_Object, interfaces: {0}}; +static methodinfo_t flash_system_ApplicationDomain_hasDefinition = {0x02, 0x00, 0x80, 0x16, "", "hasDefinition", 0, &_Boolean, &flash_system_ApplicationDomain, 0}; +static methodinfo_t flash_system_ApplicationDomain_getDefinition = {0x02, 0x00, 0x80, 0x16, "", "getDefinition", 0, &_Object, &flash_system_ApplicationDomain, 0}; +static varinfo_t flash_system_ApplicationDomain_parentDomain = {0x01, 0x00, 0x80, 0x16, "", "parentDomain", 0, &flash_system_ApplicationDomain, &flash_system_ApplicationDomain, 0}; +static varinfo_t flash_system_ApplicationDomain_domainMemory = {0x01, 0x00, 0x80, 0x16, "", "domainMemory", 0, &flash_utils_ByteArray, &flash_system_ApplicationDomain, 0}; +static varinfo_t flash_system_ApplicationDomain_MIN_DOMAIN_MEMORY_LENGTH = {0x01, 0x00, 0x82, 0x16, "", "MIN_DOMAIN_MEMORY_LENGTH", 0, &_uint, &flash_system_ApplicationDomain, 0}; +static varinfo_t flash_system_ApplicationDomain_currentDomain = {0x01, 0x00, 0x82, 0x16, "", "currentDomain", 0, &flash_system_ApplicationDomain, &flash_system_ApplicationDomain, 0}; +static classinfo_t flash_events_KeyboardEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "KeyboardEvent", 0, &flash_events_Event, interfaces: {0}}; +static varinfo_t flash_events_KeyboardEvent_shiftKey = {0x01, 0x00, 0x80, 0x16, "", "shiftKey", 0, &_Boolean, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_keyCode = {0x01, 0x00, 0x80, 0x16, "", "keyCode", 0, &_uint, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_keyLocation = {0x01, 0x00, 0x80, 0x16, "", "keyLocation", 0, &_uint, &flash_events_KeyboardEvent, 0}; +static methodinfo_t flash_events_KeyboardEvent_updateAfterEvent = {0x02, 0x00, 0x80, 0x16, "", "updateAfterEvent", 0, &voidclass, &flash_events_KeyboardEvent, 0}; +static methodinfo_t flash_events_KeyboardEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_altKey = {0x01, 0x00, 0x80, 0x16, "", "altKey", 0, &_Boolean, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_ctrlKey = {0x01, 0x00, 0x80, 0x16, "", "ctrlKey", 0, &_Boolean, &flash_events_KeyboardEvent, 0}; +static methodinfo_t flash_events_KeyboardEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_charCode = {0x01, 0x00, 0x80, 0x16, "", "charCode", 0, &_uint, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_KEY_DOWN = {0x01, 0x00, 0x82, 0x16, "", "KEY_DOWN", 0, &_String, &flash_events_KeyboardEvent, 0}; +static varinfo_t flash_events_KeyboardEvent_KEY_UP = {0x01, 0x00, 0x82, 0x16, "", "KEY_UP", 0, &_String, &flash_events_KeyboardEvent, 0}; +static classinfo_t adobe_utils_ProductManager = {0x03, 0x00, 0x81, 0x16, "adobe.utils", "ProductManager", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static varinfo_t adobe_utils_ProductManager_running = {0x01, 0x00, 0x80, 0x16, "", "running", 0, &_Boolean, &adobe_utils_ProductManager, 0}; +static methodinfo_t adobe_utils_ProductManager_download = {0x02, 0x00, 0x80, 0x16, "", "download", 0, &_Boolean, &adobe_utils_ProductManager, 0}; +static varinfo_t adobe_utils_ProductManager_installedVersion = {0x01, 0x00, 0x80, 0x16, "", "installedVersion", 0, &_String, &adobe_utils_ProductManager, 0}; +static varinfo_t adobe_utils_ProductManager_installed = {0x01, 0x00, 0x80, 0x16, "", "installed", 0, &_Boolean, &adobe_utils_ProductManager, 0}; +static methodinfo_t adobe_utils_ProductManager_launch = {0x02, 0x00, 0x80, 0x16, "", "launch", 0, &_Boolean, &adobe_utils_ProductManager, 0}; +static classinfo_t flash_events_Event = {0x03, 0x00, 0x80, 0x16, "flash.events", "Event", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_events_Event_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_cancelable = {0x01, 0x00, 0x80, 0x16, "", "cancelable", 0, &_Boolean, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_isDefaultPrevented = {0x02, 0x00, 0x80, 0x16, "", "isDefaultPrevented", 0, &_Boolean, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_target = {0x01, 0x00, 0x80, 0x16, "", "target", 0, &_Object, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_eventPhase = {0x01, 0x00, 0x80, 0x16, "", "eventPhase", 0, &_uint, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_currentTarget = {0x01, 0x00, 0x80, 0x16, "", "currentTarget", 0, &_Object, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_stopImmediatePropagation = {0x02, 0x00, 0x80, 0x16, "", "stopImmediatePropagation", 0, &voidclass, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_bubbles = {0x01, 0x00, 0x80, 0x16, "", "bubbles", 0, &_Boolean, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_stopPropagation = {0x02, 0x00, 0x80, 0x16, "", "stopPropagation", 0, &voidclass, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_preventDefault = {0x02, 0x00, 0x80, 0x16, "", "preventDefault", 0, &voidclass, &flash_events_Event, 0}; +static methodinfo_t flash_events_Event_formatToString = {0x02, 0x00, 0x80, 0x16, "", "formatToString", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_REMOVED_FROM_STAGE = {0x01, 0x00, 0x82, 0x16, "", "REMOVED_FROM_STAGE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_CLEAR = {0x01, 0x00, 0x82, 0x16, "", "CLEAR", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_OPEN = {0x01, 0x00, 0x82, 0x16, "", "OPEN", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_TAB_CHILDREN_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "TAB_CHILDREN_CHANGE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_DEACTIVATE = {0x01, 0x00, 0x82, 0x16, "", "DEACTIVATE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_ACTIVATE = {0x01, 0x00, 0x82, 0x16, "", "ACTIVATE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_SOUND_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "SOUND_COMPLETE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_CANCEL = {0x01, 0x00, 0x82, 0x16, "", "CANCEL", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_REMOVED = {0x01, 0x00, 0x82, 0x16, "", "REMOVED", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_INIT = {0x01, 0x00, 0x82, 0x16, "", "INIT", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_FRAME_CONSTRUCTED = {0x01, 0x00, 0x82, 0x16, "", "FRAME_CONSTRUCTED", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_SCROLL = {0x01, 0x00, 0x82, 0x16, "", "SCROLL", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_TAB_INDEX_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "TAB_INDEX_CHANGE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "CHANGE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_ADDED_TO_STAGE = {0x01, 0x00, 0x82, 0x16, "", "ADDED_TO_STAGE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_UNLOAD = {0x01, 0x00, 0x82, 0x16, "", "UNLOAD", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_SELECT = {0x01, 0x00, 0x82, 0x16, "", "SELECT", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_CONNECT = {0x01, 0x00, 0x82, 0x16, "", "CONNECT", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_CUT = {0x01, 0x00, 0x82, 0x16, "", "CUT", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_PASTE = {0x01, 0x00, 0x82, 0x16, "", "PASTE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_ADDED = {0x01, 0x00, 0x82, 0x16, "", "ADDED", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_ID3 = {0x01, 0x00, 0x82, 0x16, "", "ID3", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_ENTER_FRAME = {0x01, 0x00, 0x82, 0x16, "", "ENTER_FRAME", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_RENDER = {0x01, 0x00, 0x82, 0x16, "", "RENDER", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_EXIT_FRAME = {0x01, 0x00, 0x82, 0x16, "", "EXIT_FRAME", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_RESIZE = {0x01, 0x00, 0x82, 0x16, "", "RESIZE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_FULLSCREEN = {0x01, 0x00, 0x82, 0x16, "", "FULLSCREEN", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_MOUSE_LEAVE = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_LEAVE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_CLOSE = {0x01, 0x00, 0x82, 0x16, "", "CLOSE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_SELECT_ALL = {0x01, 0x00, 0x82, 0x16, "", "SELECT_ALL", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_TAB_ENABLED_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "TAB_ENABLED_CHANGE", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_COPY = {0x01, 0x00, 0x82, 0x16, "", "COPY", 0, &_String, &flash_events_Event, 0}; +static varinfo_t flash_events_Event_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "COMPLETE", 0, &_String, &flash_events_Event, 0}; +static classinfo_t flash_desktop_ClipboardFormats = {0x03, 0x00, 0x80, 0x16, "flash.desktop", "ClipboardFormats", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_desktop_ClipboardFormats_TEXT_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "TEXT_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_BITMAP_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "BITMAP_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_FLASH_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "FLASH_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_HTML_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "HTML_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_REFERENCE_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "REFERENCE_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_AIR_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "AIR_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_SERIALIZATION_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "SERIALIZATION_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_RICH_TEXT_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "RICH_TEXT_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_URL_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "URL_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static varinfo_t flash_desktop_ClipboardFormats_FILE_LIST_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "FILE_LIST_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; +static classinfo_t flash_display_MovieClip = {0x03, 0x00, 0x88, 0x16, "flash.display", "MovieClip", 0, &flash_display_Sprite, interfaces: {0}}; +static methodinfo_t flash_display_MovieClip_prevScene = {0x02, 0x00, 0x80, 0x16, "", "prevScene", 0, &voidclass, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_gotoAndPlay = {0x02, 0x00, 0x80, 0x16, "", "gotoAndPlay", 0, &voidclass, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_currentLabels = {0x01, 0x00, 0x80, 0x16, "", "currentLabels", 0, &_Array, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_nextFrame = {0x02, 0x00, 0x80, 0x16, "", "nextFrame", 0, &voidclass, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_currentScene = {0x01, 0x00, 0x80, 0x16, "", "currentScene", 0, &flash_display_Scene, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_enabled = {0x01, 0x00, 0x80, 0x16, "", "enabled", 0, &_Boolean, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_currentFrameLabel = {0x01, 0x00, 0x80, 0x16, "", "currentFrameLabel", 0, &_String, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_play = {0x02, 0x00, 0x80, 0x16, "", "play", 0, &voidclass, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_framesLoaded = {0x01, 0x00, 0x80, 0x16, "", "framesLoaded", 0, &_int, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_scenes = {0x01, 0x00, 0x80, 0x16, "", "scenes", 0, &_Array, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_addFrameScript = {0x02, 0x00, 0x80, 0x16, "", "addFrameScript", 0, &voidclass, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_currentLabel = {0x01, 0x00, 0x80, 0x16, "", "currentLabel", 0, &_String, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_prevFrame = {0x02, 0x00, 0x80, 0x16, "", "prevFrame", 0, &voidclass, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_gotoAndStop = {0x02, 0x00, 0x80, 0x16, "", "gotoAndStop", 0, &voidclass, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_currentFrame = {0x01, 0x00, 0x80, 0x16, "", "currentFrame", 0, &_int, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_nextScene = {0x02, 0x00, 0x80, 0x16, "", "nextScene", 0, &voidclass, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_totalFrames = {0x01, 0x00, 0x80, 0x16, "", "totalFrames", 0, &_int, &flash_display_MovieClip, 0}; +static varinfo_t flash_display_MovieClip_trackAsMenu = {0x01, 0x00, 0x80, 0x16, "", "trackAsMenu", 0, &_Boolean, &flash_display_MovieClip, 0}; +static methodinfo_t flash_display_MovieClip_stop = {0x02, 0x00, 0x80, 0x16, "", "stop", 0, &voidclass, &flash_display_MovieClip, 0}; +static classinfo_t flash_display_BitmapData = {0x03, 0x00, 0x80, 0x16, "flash.display", "BitmapData", 0, &_Object, interfaces: {&flash_display_IBitmapDrawable, 0}}; +static methodinfo_t flash_display_BitmapData_getPixel32 = {0x02, 0x00, 0x80, 0x16, "", "getPixel32", 0, &_uint, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_draw = {0x02, 0x00, 0x80, 0x16, "", "draw", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_setPixels = {0x02, 0x00, 0x80, 0x16, "", "setPixels", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_copyPixels = {0x02, 0x00, 0x80, 0x16, "", "copyPixels", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_histogram = {0x02, 0x00, 0x80, 0x16, "", "histogram", 0, &__AS3___vec_Vector, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_scroll = {0x02, 0x00, 0x80, 0x16, "", "scroll", 0, &voidclass, &flash_display_BitmapData, 0}; +static varinfo_t flash_display_BitmapData_transparent = {0x01, 0x00, 0x80, 0x16, "", "transparent", 0, &_Boolean, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_noise = {0x02, 0x00, 0x80, 0x16, "", "noise", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_threshold = {0x02, 0x00, 0x80, 0x16, "", "threshold", 0, &_uint, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_paletteMap = {0x02, 0x00, 0x80, 0x16, "", "paletteMap", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_perlinNoise = {0x02, 0x00, 0x80, 0x16, "", "perlinNoise", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_hitTest = {0x02, 0x00, 0x80, 0x16, "", "hitTest", 0, &_Boolean, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_getPixel = {0x02, 0x00, 0x80, 0x16, "", "getPixel", 0, &_uint, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_unlock = {0x02, 0x00, 0x80, 0x16, "", "unlock", 0, &voidclass, &flash_display_BitmapData, 0}; +static varinfo_t flash_display_BitmapData_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_copyChannel = {0x02, 0x00, 0x80, 0x16, "", "copyChannel", 0, &voidclass, &flash_display_BitmapData, 0}; +static varinfo_t flash_display_BitmapData_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_display_BitmapData, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_colorTransform = {0x02, 0x00, 0x80, 0x16, "", "colorTransform", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_generateFilterRect = {0x02, 0x00, 0x80, 0x16, "", "generateFilterRect", 0, &flash_geom_Rectangle, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_compare = {0x02, 0x00, 0x80, 0x16, "", "compare", 0, &_Object, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_fillRect = {0x02, 0x00, 0x80, 0x16, "", "fillRect", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_setVector = {0x02, 0x00, 0x80, 0x16, "", "setVector", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_floodFill = {0x02, 0x00, 0x80, 0x16, "", "floodFill", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_pixelDissolve = {0x02, 0x00, 0x80, 0x16, "", "pixelDissolve", 0, &_int, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_setPixel = {0x02, 0x00, 0x80, 0x16, "", "setPixel", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_setPixel32 = {0x02, 0x00, 0x80, 0x16, "", "setPixel32", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_lock = {0x02, 0x00, 0x80, 0x16, "", "lock", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_getVector = {0x02, 0x00, 0x80, 0x16, "", "getVector", 0, &__AS3___vec_Vector, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_getColorBoundsRect = {0x02, 0x00, 0x80, 0x16, "", "getColorBoundsRect", 0, &flash_geom_Rectangle, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_getPixels = {0x02, 0x00, 0x80, 0x16, "", "getPixels", 0, &flash_utils_ByteArray, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_merge = {0x02, 0x00, 0x80, 0x16, "", "merge", 0, &voidclass, &flash_display_BitmapData, 0}; +static varinfo_t flash_display_BitmapData_rect = {0x01, 0x00, 0x80, 0x16, "", "rect", 0, &flash_geom_Rectangle, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_applyFilter = {0x02, 0x00, 0x80, 0x16, "", "applyFilter", 0, &voidclass, &flash_display_BitmapData, 0}; +static methodinfo_t flash_display_BitmapData_dispose = {0x02, 0x00, 0x80, 0x16, "", "dispose", 0, &voidclass, &flash_display_BitmapData, 0}; +static classinfo_t flash_text_engine_LigatureLevel = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "LigatureLevel", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_LigatureLevel_UNCOMMON = {0x01, 0x00, 0x82, 0x16, "", "UNCOMMON", 0, &_String, &flash_text_engine_LigatureLevel, 0}; +static varinfo_t flash_text_engine_LigatureLevel_COMMON = {0x01, 0x00, 0x82, 0x16, "", "COMMON", 0, &_String, &flash_text_engine_LigatureLevel, 0}; +static varinfo_t flash_text_engine_LigatureLevel_EXOTIC = {0x01, 0x00, 0x82, 0x16, "", "EXOTIC", 0, &_String, &flash_text_engine_LigatureLevel, 0}; +static varinfo_t flash_text_engine_LigatureLevel_MINIMUM = {0x01, 0x00, 0x82, 0x16, "", "MINIMUM", 0, &_String, &flash_text_engine_LigatureLevel, 0}; +static varinfo_t flash_text_engine_LigatureLevel_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_engine_LigatureLevel, 0}; +static constant_t _Infinity_constant = {type: 6}; +static varinfo_t _Infinity = {0x01, 0x00, 0xa2, 0x16, "", "Infinity", 0, &_Number, 0, &_Infinity_constant}; +static classinfo_t flash_text_engine_FontDescription = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontDescription", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_FontDescription_renderingMode = {0x01, 0x00, 0x80, 0x16, "", "renderingMode", 0, &_String, &flash_text_engine_FontDescription, 0}; +static varinfo_t flash_text_engine_FontDescription_cffHinting = {0x01, 0x00, 0x80, 0x16, "", "cffHinting", 0, &_String, &flash_text_engine_FontDescription, 0}; +static varinfo_t flash_text_engine_FontDescription_fontPosture = {0x01, 0x00, 0x80, 0x16, "", "fontPosture", 0, &_String, &flash_text_engine_FontDescription, 0}; +static varinfo_t flash_text_engine_FontDescription_fontName = {0x01, 0x00, 0x80, 0x16, "", "fontName", 0, &_String, &flash_text_engine_FontDescription, 0}; +static varinfo_t flash_text_engine_FontDescription_fontLookup = {0x01, 0x00, 0x80, 0x16, "", "fontLookup", 0, &_String, &flash_text_engine_FontDescription, 0}; +static varinfo_t flash_text_engine_FontDescription_locked = {0x01, 0x00, 0x80, 0x16, "", "locked", 0, &_Boolean, &flash_text_engine_FontDescription, 0}; +static varinfo_t flash_text_engine_FontDescription_fontWeight = {0x01, 0x00, 0x80, 0x16, "", "fontWeight", 0, &_String, &flash_text_engine_FontDescription, 0}; +static methodinfo_t flash_text_engine_FontDescription_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_FontDescription, &flash_text_engine_FontDescription, 0}; +static methodinfo_t flash_text_engine_FontDescription_isFontCompatible = {0x02, 0x00, 0x82, 0x16, "", "isFontCompatible", 0, &_Boolean, &flash_text_engine_FontDescription, 0}; +static classinfo_t flash_text_engine_TextElement = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextElement", 0, &flash_text_engine_ContentElement, interfaces: {0}}; +static methodinfo_t flash_text_engine_TextElement_replaceText = {0x02, 0x00, 0x80, 0x16, "", "replaceText", 0, &voidclass, &flash_text_engine_TextElement, 0}; +static classinfo_t flash_display_SWFVersion = {0x03, 0x00, 0x81, 0x16, "flash.display", "SWFVersion", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_SWFVersion_FLASH4 = {0x01, 0x00, 0x82, 0x16, "", "FLASH4", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH7 = {0x01, 0x00, 0x82, 0x16, "", "FLASH7", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH8 = {0x01, 0x00, 0x82, 0x16, "", "FLASH8", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH3 = {0x01, 0x00, 0x82, 0x16, "", "FLASH3", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH6 = {0x01, 0x00, 0x82, 0x16, "", "FLASH6", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH9 = {0x01, 0x00, 0x82, 0x16, "", "FLASH9", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH2 = {0x01, 0x00, 0x82, 0x16, "", "FLASH2", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH5 = {0x01, 0x00, 0x82, 0x16, "", "FLASH5", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH10 = {0x01, 0x00, 0x82, 0x16, "", "FLASH10", 0, &_uint, &flash_display_SWFVersion, 0}; +static varinfo_t flash_display_SWFVersion_FLASH1 = {0x01, 0x00, 0x82, 0x16, "", "FLASH1", 0, &_uint, &flash_display_SWFVersion, 0}; +static classinfo_t flash_net_URLLoader = {0x03, 0x00, 0x80, 0x16, "flash.net", "URLLoader", 0, &flash_events_EventDispatcher, interfaces: {0}}; +static methodinfo_t flash_net_URLLoader_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_URLLoader, 0}; +static varinfo_t flash_net_URLLoader_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_net_URLLoader, 0}; +static methodinfo_t flash_net_URLLoader_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_net_URLLoader, 0}; +static varinfo_t flash_net_URLLoader_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_net_URLLoader, 0}; +static varinfo_t flash_net_URLLoader_dataFormat = {0x01, 0x00, 0x80, 0x16, "", "dataFormat", 0, &_String, &flash_net_URLLoader, 0}; +static varinfo_t flash_net_URLLoader_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, 0, &flash_net_URLLoader, 0}; +static classinfo_t flash_geom_Matrix = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Matrix", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_geom_Matrix_b = {0x01, 0x00, 0x80, 0x16, "", "b", 0, &_Number, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_deltaTransformPoint = {0x02, 0x00, 0x80, 0x16, "", "deltaTransformPoint", 0, &flash_geom_Point, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_identity = {0x02, 0x00, 0x80, 0x16, "", "identity", 0, &voidclass, &flash_geom_Matrix, 0}; +static varinfo_t flash_geom_Matrix_ty = {0x01, 0x00, 0x80, 0x16, "", "ty", 0, &_Number, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_translate = {0x02, 0x00, 0x80, 0x16, "", "translate", 0, &voidclass, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_concat = {0x02, 0x00, 0x80, 0x16, "", "concat", 0, &voidclass, &flash_geom_Matrix, 0}; +static varinfo_t flash_geom_Matrix_c = {0x01, 0x00, 0x80, 0x16, "", "c", 0, &_Number, &flash_geom_Matrix, 0}; +static varinfo_t flash_geom_Matrix_a = {0x01, 0x00, 0x80, 0x16, "", "a", 0, &_Number, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_scale = {0x02, 0x00, 0x80, 0x16, "", "scale", 0, &voidclass, &flash_geom_Matrix, 0}; +static varinfo_t flash_geom_Matrix_d = {0x01, 0x00, 0x80, 0x16, "", "d", 0, &_Number, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_transformPoint = {0x02, 0x00, 0x80, 0x16, "", "transformPoint", 0, &flash_geom_Point, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_rotate = {0x02, 0x00, 0x80, 0x16, "", "rotate", 0, &voidclass, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_createGradientBox = {0x02, 0x00, 0x80, 0x16, "", "createGradientBox", 0, &voidclass, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_invert = {0x02, 0x00, 0x80, 0x16, "", "invert", 0, &voidclass, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Matrix, &flash_geom_Matrix, 0}; +static varinfo_t flash_geom_Matrix_tx = {0x01, 0x00, 0x80, 0x16, "", "tx", 0, &_Number, &flash_geom_Matrix, 0}; +static methodinfo_t flash_geom_Matrix_createBox = {0x02, 0x00, 0x80, 0x16, "", "createBox", 0, &voidclass, &flash_geom_Matrix, 0}; +static classinfo_t flash_accessibility_Accessibility = {0x03, 0x00, 0x81, 0x16, "flash.accessibility", "Accessibility", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_accessibility_Accessibility_active = {0x01, 0x00, 0x82, 0x16, "", "active", 0, &_Boolean, &flash_accessibility_Accessibility, 0}; +static methodinfo_t flash_accessibility_Accessibility_updateProperties = {0x02, 0x00, 0x82, 0x16, "", "updateProperties", 0, &voidclass, &flash_accessibility_Accessibility, 0}; +static methodinfo_t flash_accessibility_Accessibility_sendEvent = {0x02, 0x00, 0x82, 0x16, "", "sendEvent", 0, &voidclass, &flash_accessibility_Accessibility, 0}; +static methodinfo_t flash_net_sendToURL = {0x02, 0x00, 0x82, 0x16, "flash.net", "sendToURL", 0, &voidclass, 0, 0}; +static classinfo_t flash_filters_GlowFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "GlowFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; +static varinfo_t flash_filters_GlowFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_inner = {0x01, 0x00, 0x80, 0x16, "", "inner", 0, &_Boolean, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_GlowFilter, 0}; +static methodinfo_t flash_filters_GlowFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_GlowFilter, 0}; +static varinfo_t flash_filters_GlowFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_GlowFilter, 0}; +static classinfo_t flash_events_FullScreenEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "FullScreenEvent", 0, &flash_events_ActivityEvent, interfaces: {0}}; +static methodinfo_t flash_events_FullScreenEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_FullScreenEvent, 0}; +static methodinfo_t flash_events_FullScreenEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_FullScreenEvent, 0}; +static varinfo_t flash_events_FullScreenEvent_fullScreen = {0x01, 0x00, 0x80, 0x16, "", "fullScreen", 0, &_Boolean, &flash_events_FullScreenEvent, 0}; +static varinfo_t flash_events_FullScreenEvent_FULL_SCREEN = {0x01, 0x00, 0x82, 0x16, "", "FULL_SCREEN", 0, &_String, &flash_events_FullScreenEvent, 0}; +static classinfo_t flash_display_StageDisplayState = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageDisplayState", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_StageDisplayState_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_display_StageDisplayState, 0}; +static varinfo_t flash_display_StageDisplayState_FULL_SCREEN = {0x01, 0x00, 0x82, 0x16, "", "FULL_SCREEN", 0, &_String, &flash_display_StageDisplayState, 0}; +static classinfo_t flash_text_engine_TextJustifier = {0x03, 0x00, 0x80, 0x16, "flash.text.engine", "TextJustifier", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_text_engine_TextJustifier_lineJustification = {0x01, 0x00, 0x80, 0x16, "", "lineJustification", 0, &_String, &flash_text_engine_TextJustifier, 0}; +static varinfo_t flash_text_engine_TextJustifier_locale = {0x01, 0x00, 0x80, 0x16, "", "locale", 0, &_String, &flash_text_engine_TextJustifier, 0}; +static methodinfo_t flash_text_engine_TextJustifier_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_TextJustifier, &flash_text_engine_TextJustifier, 0}; +static methodinfo_t flash_text_engine_TextJustifier_getJustifierForLocale = {0x02, 0x00, 0x82, 0x16, "", "getJustifierForLocale", 0, &flash_text_engine_TextJustifier, &flash_text_engine_TextJustifier, 0}; +static classinfo_t flash_display_StageAlign = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageAlign", 0, &_Object, interfaces: {0}}; +static varinfo_t flash_display_StageAlign_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_BOTTOM = {0x01, 0x00, 0x82, 0x16, "", "BOTTOM", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_BOTTOM_LEFT = {0x01, 0x00, 0x82, 0x16, "", "BOTTOM_LEFT", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_TOP_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "TOP_RIGHT", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_TOP = {0x01, 0x00, 0x82, 0x16, "", "TOP", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_BOTTOM_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "BOTTOM_RIGHT", 0, &_String, &flash_display_StageAlign, 0}; +static varinfo_t flash_display_StageAlign_TOP_LEFT = {0x01, 0x00, 0x82, 0x16, "", "TOP_LEFT", 0, &_String, &flash_display_StageAlign, 0}; +static constant_t _NaN_constant = {type: 6}; +static varinfo_t _NaN = {0x01, 0x00, 0xa2, 0x16, "", "NaN", 0, &_Number, 0, &_NaN_constant}; +static classinfo_t _ReferenceError = {0x03, 0x00, 0x88, 0x16, "", "ReferenceError", 0, &_Error, interfaces: {0}}; +static varinfo_t _ReferenceError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_ReferenceError, 0}; +static classinfo_t flash_display_Shape = {0x03, 0x00, 0x80, 0x16, "flash.display", "Shape", 0, &flash_display_DisplayObject, interfaces: {0}}; +static varinfo_t flash_display_Shape_graphics = {0x01, 0x00, 0x80, 0x16, "", "graphics", 0, &flash_display_Graphics, &flash_display_Shape, 0}; +dict_t* builtin_getclasses() +{ + dict_t*d = dict_new2(&slotinfo_type); + dict_put(d, &flash_text_TextFormat, &flash_text_TextFormat); + dict_init2(&flash_text_TextFormat.members, &memberinfo_type, 31); + dict_init2(&flash_text_TextFormat.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_leading, &flash_text_TextFormat_leading); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_bold, &flash_text_TextFormat_bold); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_underline, &flash_text_TextFormat_underline); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_color, &flash_text_TextFormat_color); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_letterSpacing, &flash_text_TextFormat_letterSpacing); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_kerning, &flash_text_TextFormat_kerning); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_target, &flash_text_TextFormat_target); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_italic, &flash_text_TextFormat_italic); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_rightMargin, &flash_text_TextFormat_rightMargin); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_bullet, &flash_text_TextFormat_bullet); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_url, &flash_text_TextFormat_url); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_size, &flash_text_TextFormat_size); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_indent, &flash_text_TextFormat_indent); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_leftMargin, &flash_text_TextFormat_leftMargin); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_display, &flash_text_TextFormat_display); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_align, &flash_text_TextFormat_align); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_tabStops, &flash_text_TextFormat_tabStops); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_blockIndent, &flash_text_TextFormat_blockIndent); + dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_font, &flash_text_TextFormat_font); + dict_put(d, &flash_filters_BitmapFilter, &flash_filters_BitmapFilter); + dict_init2(&flash_filters_BitmapFilter.members, &memberinfo_type, 8); + dict_init2(&flash_filters_BitmapFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_BitmapFilter.members, &flash_filters_BitmapFilter_clone, &flash_filters_BitmapFilter_clone); + dict_put(d, &flash_filters_DropShadowFilter, &flash_filters_DropShadowFilter); + dict_init2(&flash_filters_DropShadowFilter.members, &memberinfo_type, 15); + dict_init2(&flash_filters_DropShadowFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_alpha, &flash_filters_DropShadowFilter_alpha); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_strength, &flash_filters_DropShadowFilter_strength); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_quality, &flash_filters_DropShadowFilter_quality); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_angle, &flash_filters_DropShadowFilter_angle); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_knockout, &flash_filters_DropShadowFilter_knockout); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_color, &flash_filters_DropShadowFilter_color); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_hideObject, &flash_filters_DropShadowFilter_hideObject); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_inner, &flash_filters_DropShadowFilter_inner); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_blurX, &flash_filters_DropShadowFilter_blurX); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_blurY, &flash_filters_DropShadowFilter_blurY); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_distance, &flash_filters_DropShadowFilter_distance); + dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_clone, &flash_filters_DropShadowFilter_clone); + dict_put(d, &adobe_utils_CustomActions, &adobe_utils_CustomActions); + dict_init2(&adobe_utils_CustomActions.members, &memberinfo_type, 8); + dict_init2(&adobe_utils_CustomActions.static_members, &memberinfo_type, 8); + dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_actionsList, &adobe_utils_CustomActions_actionsList); + dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_uninstallActions, &adobe_utils_CustomActions_uninstallActions); + dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_getActions, &adobe_utils_CustomActions_getActions); + dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_installActions, &adobe_utils_CustomActions_installActions); + dict_put(d, &flash_text_engine_TextLineValidity, &flash_text_engine_TextLineValidity); + dict_init2(&flash_text_engine_TextLineValidity.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextLineValidity.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_STATIC, &flash_text_engine_TextLineValidity_STATIC); + dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_VALID, &flash_text_engine_TextLineValidity_VALID); + dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_INVALID, &flash_text_engine_TextLineValidity_INVALID); + dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_POSSIBLY_INVALID, &flash_text_engine_TextLineValidity_POSSIBLY_INVALID); + dict_put(d, &flash_display_LineScaleMode, &flash_display_LineScaleMode); + dict_init2(&flash_display_LineScaleMode.members, &memberinfo_type, 8); + dict_init2(&flash_display_LineScaleMode.static_members, &memberinfo_type, 8); + dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_NORMAL, &flash_display_LineScaleMode_NORMAL); + dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_VERTICAL, &flash_display_LineScaleMode_VERTICAL); + dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_NONE, &flash_display_LineScaleMode_NONE); + dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_HORIZONTAL, &flash_display_LineScaleMode_HORIZONTAL); + dict_put(d, &flash_geom_Transform, &flash_geom_Transform); + dict_init2(&flash_geom_Transform.members, &memberinfo_type, 15); + dict_init2(&flash_geom_Transform.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_matrix, &flash_geom_Transform_matrix); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_perspectiveProjection, &flash_geom_Transform_perspectiveProjection); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_concatenatedMatrix, &flash_geom_Transform_concatenatedMatrix); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_colorTransform, &flash_geom_Transform_colorTransform); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_getRelativeMatrix3D, &flash_geom_Transform_getRelativeMatrix3D); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_pixelBounds, &flash_geom_Transform_pixelBounds); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_matrix3D, &flash_geom_Transform_matrix3D); + dict_put(&flash_geom_Transform.members, &flash_geom_Transform_concatenatedColorTransform, &flash_geom_Transform_concatenatedColorTransform); + dict_put(d, &flash_ui_KeyLocation, &flash_ui_KeyLocation); + dict_init2(&flash_ui_KeyLocation.members, &memberinfo_type, 8); + dict_init2(&flash_ui_KeyLocation.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_LEFT, &flash_ui_KeyLocation_LEFT); + dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_RIGHT, &flash_ui_KeyLocation_RIGHT); + dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_NUM_PAD, &flash_ui_KeyLocation_NUM_PAD); + dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_STANDARD, &flash_ui_KeyLocation_STANDARD); + dict_put(d, &flash_events_MouseEvent, &flash_events_MouseEvent); + dict_init2(&flash_events_MouseEvent.members, &memberinfo_type, 31); + dict_init2(&flash_events_MouseEvent.static_members, &memberinfo_type, 15); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_localY, &flash_events_MouseEvent_localY); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_updateAfterEvent, &flash_events_MouseEvent_updateAfterEvent); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_delta, &flash_events_MouseEvent_delta); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_stageX, &flash_events_MouseEvent_stageX); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_toString, &flash_events_MouseEvent_toString); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_relatedObject, &flash_events_MouseEvent_relatedObject); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_isRelatedObjectInaccessible, &flash_events_MouseEvent_isRelatedObjectInaccessible); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_shiftKey, &flash_events_MouseEvent_shiftKey); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_stageY, &flash_events_MouseEvent_stageY); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_altKey, &flash_events_MouseEvent_altKey); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_clone, &flash_events_MouseEvent_clone); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_ctrlKey, &flash_events_MouseEvent_ctrlKey); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_localX, &flash_events_MouseEvent_localX); + dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_buttonDown, &flash_events_MouseEvent_buttonDown); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_ROLL_OVER, &flash_events_MouseEvent_ROLL_OVER); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_ROLL_OUT, &flash_events_MouseEvent_ROLL_OUT); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_DOWN, &flash_events_MouseEvent_MOUSE_DOWN); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_DOUBLE_CLICK, &flash_events_MouseEvent_DOUBLE_CLICK); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_WHEEL, &flash_events_MouseEvent_MOUSE_WHEEL); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_CLICK, &flash_events_MouseEvent_CLICK); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_MOVE, &flash_events_MouseEvent_MOUSE_MOVE); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_UP, &flash_events_MouseEvent_MOUSE_UP); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_OVER, &flash_events_MouseEvent_MOUSE_OVER); + dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_OUT, &flash_events_MouseEvent_MOUSE_OUT); + dict_put(d, &flash_text_engine_LineJustification, &flash_text_engine_LineJustification); + dict_init2(&flash_text_engine_LineJustification.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_LineJustification.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_LineJustification.static_members, &flash_text_engine_LineJustification_ALL_INCLUDING_LAST, &flash_text_engine_LineJustification_ALL_INCLUDING_LAST); + dict_put(&flash_text_engine_LineJustification.static_members, &flash_text_engine_LineJustification_UNJUSTIFIED, &flash_text_engine_LineJustification_UNJUSTIFIED); + dict_put(&flash_text_engine_LineJustification.static_members, &flash_text_engine_LineJustification_ALL_BUT_LAST, &flash_text_engine_LineJustification_ALL_BUT_LAST); + dict_put(d, &flash_media_Camera, &flash_media_Camera); + dict_init2(&flash_media_Camera.members, &memberinfo_type, 31); + dict_init2(&flash_media_Camera.static_members, &memberinfo_type, 8); + dict_put(&flash_media_Camera.members, &flash_media_Camera_fps, &flash_media_Camera_fps); + dict_put(&flash_media_Camera.members, &flash_media_Camera_setMode, &flash_media_Camera_setMode); + dict_put(&flash_media_Camera.members, &flash_media_Camera_keyFrameInterval, &flash_media_Camera_keyFrameInterval); + dict_put(&flash_media_Camera.members, &flash_media_Camera_motionTimeout, &flash_media_Camera_motionTimeout); + dict_put(&flash_media_Camera.members, &flash_media_Camera_width, &flash_media_Camera_width); + dict_put(&flash_media_Camera.members, &flash_media_Camera_setCursor, &flash_media_Camera_setCursor); + dict_put(&flash_media_Camera.members, &flash_media_Camera_setLoopback, &flash_media_Camera_setLoopback); + dict_put(&flash_media_Camera.members, &flash_media_Camera_height, &flash_media_Camera_height); + dict_put(&flash_media_Camera.members, &flash_media_Camera_index, &flash_media_Camera_index); + dict_put(&flash_media_Camera.members, &flash_media_Camera_name, &flash_media_Camera_name); + dict_put(&flash_media_Camera.members, &flash_media_Camera_currentFPS, &flash_media_Camera_currentFPS); + dict_put(&flash_media_Camera.members, &flash_media_Camera_setKeyFrameInterval, &flash_media_Camera_setKeyFrameInterval); + dict_put(&flash_media_Camera.members, &flash_media_Camera_quality, &flash_media_Camera_quality); + dict_put(&flash_media_Camera.members, &flash_media_Camera_motionLevel, &flash_media_Camera_motionLevel); + dict_put(&flash_media_Camera.members, &flash_media_Camera_bandwidth, &flash_media_Camera_bandwidth); + dict_put(&flash_media_Camera.members, &flash_media_Camera_muted, &flash_media_Camera_muted); + dict_put(&flash_media_Camera.members, &flash_media_Camera_activityLevel, &flash_media_Camera_activityLevel); + dict_put(&flash_media_Camera.members, &flash_media_Camera_loopback, &flash_media_Camera_loopback); + dict_put(&flash_media_Camera.members, &flash_media_Camera_setQuality, &flash_media_Camera_setQuality); + dict_put(&flash_media_Camera.members, &flash_media_Camera_setMotionLevel, &flash_media_Camera_setMotionLevel); + dict_put(&flash_media_Camera.static_members, &flash_media_Camera_getCamera, &flash_media_Camera_getCamera); + dict_put(&flash_media_Camera.static_members, &flash_media_Camera_names, &flash_media_Camera_names); + dict_put(d, &flash_net_registerClassAlias, &flash_net_registerClassAlias); + dict_put(d, &flash_accessibility_AccessibilityImplementation, &flash_accessibility_AccessibilityImplementation); + dict_init2(&flash_accessibility_AccessibilityImplementation.members, &memberinfo_type, 15); + dict_init2(&flash_accessibility_AccessibilityImplementation.static_members, &memberinfo_type, 8); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accState, &flash_accessibility_AccessibilityImplementation_get_accState); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accName, &flash_accessibility_AccessibilityImplementation_get_accName); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accSelection, &flash_accessibility_AccessibilityImplementation_get_accSelection); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_accDoDefaultAction, &flash_accessibility_AccessibilityImplementation_accDoDefaultAction); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accFocus, &flash_accessibility_AccessibilityImplementation_get_accFocus); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accDefaultAction, &flash_accessibility_AccessibilityImplementation_get_accDefaultAction); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_accSelect, &flash_accessibility_AccessibilityImplementation_accSelect); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accValue, &flash_accessibility_AccessibilityImplementation_get_accValue); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_stub, &flash_accessibility_AccessibilityImplementation_stub); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accRole, &flash_accessibility_AccessibilityImplementation_get_accRole); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_errno, &flash_accessibility_AccessibilityImplementation_errno); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_isLabeledBy, &flash_accessibility_AccessibilityImplementation_isLabeledBy); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_accLocation, &flash_accessibility_AccessibilityImplementation_accLocation); + dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_getChildIDArray, &flash_accessibility_AccessibilityImplementation_getChildIDArray); + dict_put(d, &flash_utils_ByteArray, &flash_utils_ByteArray); + dict_init2(&flash_utils_ByteArray.members, &memberinfo_type, 63); + dict_init2(&flash_utils_ByteArray.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeBoolean, &flash_utils_ByteArray_writeBoolean); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readDouble, &flash_utils_ByteArray_readDouble); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_toString, &flash_utils_ByteArray_toString); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeByte, &flash_utils_ByteArray_writeByte); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeObject, &flash_utils_ByteArray_writeObject); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUTFBytes, &flash_utils_ByteArray_readUTFBytes); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeMultiByte, &flash_utils_ByteArray_writeMultiByte); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_uncompress, &flash_utils_ByteArray_uncompress); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUnsignedByte, &flash_utils_ByteArray_readUnsignedByte); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeInt, &flash_utils_ByteArray_writeInt); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_deflate, &flash_utils_ByteArray_deflate); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readMultiByte, &flash_utils_ByteArray_readMultiByte); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readBytes, &flash_utils_ByteArray_readBytes); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeShort, &flash_utils_ByteArray_writeShort); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_position, &flash_utils_ByteArray_position); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readShort, &flash_utils_ByteArray_readShort); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeUTF, &flash_utils_ByteArray_writeUTF); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeBytes, &flash_utils_ByteArray_writeBytes); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_objectEncoding, &flash_utils_ByteArray_objectEncoding); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readObject, &flash_utils_ByteArray_readObject); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_length, &flash_utils_ByteArray_length); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeUnsignedInt, &flash_utils_ByteArray_writeUnsignedInt); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeDouble, &flash_utils_ByteArray_writeDouble); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeFloat, &flash_utils_ByteArray_writeFloat); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readInt, &flash_utils_ByteArray_readInt); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readByte, &flash_utils_ByteArray_readByte); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_bytesAvailable, &flash_utils_ByteArray_bytesAvailable); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_clear, &flash_utils_ByteArray_clear); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_endian, &flash_utils_ByteArray_endian); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUnsignedShort, &flash_utils_ByteArray_readUnsignedShort); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUnsignedInt, &flash_utils_ByteArray_readUnsignedInt); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readFloat, &flash_utils_ByteArray_readFloat); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_compress, &flash_utils_ByteArray_compress); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeUTFBytes, &flash_utils_ByteArray_writeUTFBytes); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readBoolean, &flash_utils_ByteArray_readBoolean); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_inflate, &flash_utils_ByteArray_inflate); + dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUTF, &flash_utils_ByteArray_readUTF); + dict_put(&flash_utils_ByteArray.static_members, &flash_utils_ByteArray_defaultObjectEncoding, &flash_utils_ByteArray_defaultObjectEncoding); + dict_put(d, &flash_sampler_stopSampling, &flash_sampler_stopSampling); + dict_put(d, &flash_events_SyncEvent, &flash_events_SyncEvent); + dict_init2(&flash_events_SyncEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_SyncEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_SyncEvent.members, &flash_events_SyncEvent_toString, &flash_events_SyncEvent_toString); + dict_put(&flash_events_SyncEvent.members, &flash_events_SyncEvent_clone, &flash_events_SyncEvent_clone); + dict_put(&flash_events_SyncEvent.members, &flash_events_SyncEvent_changeList, &flash_events_SyncEvent_changeList); + dict_put(&flash_events_SyncEvent.static_members, &flash_events_SyncEvent_SYNC, &flash_events_SyncEvent_SYNC); + dict_put(d, &_encodeURIComponent, &_encodeURIComponent); + dict_put(d, &flash_net_Socket, &flash_net_Socket); + dict_init2(&flash_net_Socket.members, &memberinfo_type, 63); + dict_init2(&flash_net_Socket.static_members, &memberinfo_type, 8); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeBoolean, &flash_net_Socket_writeBoolean); + dict_put(&flash_net_Socket.members, &flash_net_Socket_connect, &flash_net_Socket_connect); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readDouble, &flash_net_Socket_readDouble); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeByte, &flash_net_Socket_writeByte); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeObject, &flash_net_Socket_writeObject); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readUTFBytes, &flash_net_Socket_readUTFBytes); + dict_put(&flash_net_Socket.members, &flash_net_Socket_close, &flash_net_Socket_close); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeMultiByte, &flash_net_Socket_writeMultiByte); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readUnsignedByte, &flash_net_Socket_readUnsignedByte); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeInt, &flash_net_Socket_writeInt); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readMultiByte, &flash_net_Socket_readMultiByte); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readBytes, &flash_net_Socket_readBytes); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeShort, &flash_net_Socket_writeShort); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readShort, &flash_net_Socket_readShort); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeUTF, &flash_net_Socket_writeUTF); + dict_put(&flash_net_Socket.members, &flash_net_Socket_timeout, &flash_net_Socket_timeout); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeBytes, &flash_net_Socket_writeBytes); + dict_put(&flash_net_Socket.members, &flash_net_Socket_connected, &flash_net_Socket_connected); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readObject, &flash_net_Socket_readObject); + dict_put(&flash_net_Socket.members, &flash_net_Socket_objectEncoding, &flash_net_Socket_objectEncoding); + dict_put(&flash_net_Socket.members, &flash_net_Socket_flush, &flash_net_Socket_flush); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeUnsignedInt, &flash_net_Socket_writeUnsignedInt); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeDouble, &flash_net_Socket_writeDouble); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeFloat, &flash_net_Socket_writeFloat); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readInt, &flash_net_Socket_readInt); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readByte, &flash_net_Socket_readByte); + dict_put(&flash_net_Socket.members, &flash_net_Socket_bytesAvailable, &flash_net_Socket_bytesAvailable); + dict_put(&flash_net_Socket.members, &flash_net_Socket_endian, &flash_net_Socket_endian); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readUnsignedShort, &flash_net_Socket_readUnsignedShort); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readUnsignedInt, &flash_net_Socket_readUnsignedInt); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readFloat, &flash_net_Socket_readFloat); + dict_put(&flash_net_Socket.members, &flash_net_Socket_writeUTFBytes, &flash_net_Socket_writeUTFBytes); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readBoolean, &flash_net_Socket_readBoolean); + dict_put(&flash_net_Socket.members, &flash_net_Socket_readUTF, &flash_net_Socket_readUTF); + dict_put(d, &_unescape, &_unescape); + dict_put(d, &flash_utils_Timer, &flash_utils_Timer); + dict_init2(&flash_utils_Timer.members, &memberinfo_type, 8); + dict_init2(&flash_utils_Timer.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_reset, &flash_utils_Timer_reset); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_running, &flash_utils_Timer_running); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_repeatCount, &flash_utils_Timer_repeatCount); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_stop, &flash_utils_Timer_stop); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_start, &flash_utils_Timer_start); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_currentCount, &flash_utils_Timer_currentCount); + dict_put(&flash_utils_Timer.members, &flash_utils_Timer_delay, &flash_utils_Timer_delay); + dict_put(d, &_Array, &_Array); + dict_init2(&_Array.members, &memberinfo_type, 31); + dict_init2(&_Array.static_members, &memberinfo_type, 8); + dict_put(&_Array.members, &_Array_forEach, &_Array_forEach); + dict_put(&_Array.members, &_Array_sortOn, &_Array_sortOn); + dict_put(&_Array.members, &_Array_indexOf, &_Array_indexOf); + dict_put(&_Array.members, &_Array_splice, &_Array_splice); + dict_put(&_Array.members, &_Array_lastIndexOf, &_Array_lastIndexOf); + dict_put(&_Array.members, &_Array_map, &_Array_map); + dict_put(&_Array.members, &_Array_concat, &_Array_concat); + dict_put(&_Array.members, &_Array_shift, &_Array_shift); + dict_put(&_Array.members, &_Array_unshift, &_Array_unshift); + dict_put(&_Array.members, &_Array_some, &_Array_some); + dict_put(&_Array.members, &_Array_filter, &_Array_filter); + dict_put(&_Array.members, &_Array_join, &_Array_join); + dict_put(&_Array.members, &_Array_slice, &_Array_slice); + dict_put(&_Array.members, &_Array_every, &_Array_every); + dict_put(&_Array.members, &_Array_pop, &_Array_pop); + dict_put(&_Array.members, &_Array_sort, &_Array_sort); + dict_put(&_Array.members, &_Array_reverse, &_Array_reverse); + dict_put(&_Array.members, &_Array_push, &_Array_push); + dict_put(&_Array.members, &_Array_length, &_Array_length); + dict_put(&_Array.static_members, &_Array_DESCENDING, &_Array_DESCENDING); + dict_put(&_Array.static_members, &_Array_UNIQUESORT, &_Array_UNIQUESORT); + dict_put(&_Array.static_members, &_Array_RETURNINDEXEDARRAY, &_Array_RETURNINDEXEDARRAY); + dict_put(&_Array.static_members, &_Array_CASEINSENSITIVE, &_Array_CASEINSENSITIVE); + dict_put(&_Array.static_members, &_Array_NUMERIC, &_Array_NUMERIC); + dict_put(d, &flash_geom_ColorTransform, &flash_geom_ColorTransform); + dict_init2(&flash_geom_ColorTransform.members, &memberinfo_type, 15); + dict_init2(&flash_geom_ColorTransform.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_blueOffset, &flash_geom_ColorTransform_blueOffset); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_greenOffset, &flash_geom_ColorTransform_greenOffset); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_greenMultiplier, &flash_geom_ColorTransform_greenMultiplier); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_redMultiplier, &flash_geom_ColorTransform_redMultiplier); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_color, &flash_geom_ColorTransform_color); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_concat, &flash_geom_ColorTransform_concat); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_alphaOffset, &flash_geom_ColorTransform_alphaOffset); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_blueMultiplier, &flash_geom_ColorTransform_blueMultiplier); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_toString, &flash_geom_ColorTransform_toString); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_alphaMultiplier, &flash_geom_ColorTransform_alphaMultiplier); + dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_redOffset, &flash_geom_ColorTransform_redOffset); + dict_put(d, &flash_text_GridFitType, &flash_text_GridFitType); + dict_init2(&flash_text_GridFitType.members, &memberinfo_type, 8); + dict_init2(&flash_text_GridFitType.static_members, &memberinfo_type, 8); + dict_put(&flash_text_GridFitType.static_members, &flash_text_GridFitType_SUBPIXEL, &flash_text_GridFitType_SUBPIXEL); + dict_put(&flash_text_GridFitType.static_members, &flash_text_GridFitType_PIXEL, &flash_text_GridFitType_PIXEL); + dict_put(&flash_text_GridFitType.static_members, &flash_text_GridFitType_NONE, &flash_text_GridFitType_NONE); + dict_put(d, &flash_filters_DisplacementMapFilterMode, &flash_filters_DisplacementMapFilterMode); + dict_init2(&flash_filters_DisplacementMapFilterMode.members, &memberinfo_type, 8); + dict_init2(&flash_filters_DisplacementMapFilterMode.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_COLOR, &flash_filters_DisplacementMapFilterMode_COLOR); + dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_WRAP, &flash_filters_DisplacementMapFilterMode_WRAP); + dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_CLAMP, &flash_filters_DisplacementMapFilterMode_CLAMP); + dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_IGNORE, &flash_filters_DisplacementMapFilterMode_IGNORE); + dict_put(d, &flash_text_TextFieldType, &flash_text_TextFieldType); + dict_init2(&flash_text_TextFieldType.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextFieldType.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextFieldType.static_members, &flash_text_TextFieldType_DYNAMIC, &flash_text_TextFieldType_DYNAMIC); + dict_put(&flash_text_TextFieldType.static_members, &flash_text_TextFieldType_INPUT, &flash_text_TextFieldType_INPUT); + dict_put(d, &flash_display_IGraphicsStroke, &flash_display_IGraphicsStroke); + dict_init2(&flash_display_IGraphicsStroke.members, &memberinfo_type, 8); + dict_init2(&flash_display_IGraphicsStroke.static_members, &memberinfo_type, 8); + dict_put(d, &flash_media_SoundLoaderContext, &flash_media_SoundLoaderContext); + dict_init2(&flash_media_SoundLoaderContext.members, &memberinfo_type, 8); + dict_init2(&flash_media_SoundLoaderContext.static_members, &memberinfo_type, 8); + dict_put(&flash_media_SoundLoaderContext.members, &flash_media_SoundLoaderContext_checkPolicyFile, &flash_media_SoundLoaderContext_checkPolicyFile); + dict_put(&flash_media_SoundLoaderContext.members, &flash_media_SoundLoaderContext_bufferTime, &flash_media_SoundLoaderContext_bufferTime); + dict_put(d, &flash_net_IDynamicPropertyOutput, &flash_net_IDynamicPropertyOutput); + dict_init2(&flash_net_IDynamicPropertyOutput.members, &memberinfo_type, 8); + dict_init2(&flash_net_IDynamicPropertyOutput.static_members, &memberinfo_type, 8); + dict_put(&flash_net_IDynamicPropertyOutput.members, &flash_net_IDynamicPropertyOutput_writeDynamicProperty, &flash_net_IDynamicPropertyOutput_writeDynamicProperty); + dict_put(d, &flash_display_IGraphicsData, &flash_display_IGraphicsData); + dict_init2(&flash_display_IGraphicsData.members, &memberinfo_type, 8); + dict_init2(&flash_display_IGraphicsData.static_members, &memberinfo_type, 8); + dict_put(d, &flash_utils_getDefinitionByName, &flash_utils_getDefinitionByName); + dict_put(d, &_Function, &_Function); + dict_init2(&_Function.members, &memberinfo_type, 8); + dict_init2(&_Function.static_members, &memberinfo_type, 8); + dict_put(&_Function.members, &_Function_length, &_Function_length); + dict_put(&_Function.members, &_Function_apply, &_Function_apply); + dict_put(&_Function.members, &_Function_call, &_Function_call); + dict_put(&_Function.members, &_Function_prototype, &_Function_prototype); + dict_put(d, &flash_geom_PerspectiveProjection, &flash_geom_PerspectiveProjection); + dict_init2(&flash_geom_PerspectiveProjection.members, &memberinfo_type, 8); + dict_init2(&flash_geom_PerspectiveProjection.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_fieldOfView, &flash_geom_PerspectiveProjection_fieldOfView); + dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_projectionCenter, &flash_geom_PerspectiveProjection_projectionCenter); + dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_toMatrix3D, &flash_geom_PerspectiveProjection_toMatrix3D); + dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_focalLength, &flash_geom_PerspectiveProjection_focalLength); + dict_put(d, &flash_text_engine_BreakOpportunity, &flash_text_engine_BreakOpportunity); + dict_init2(&flash_text_engine_BreakOpportunity.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_BreakOpportunity.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_AUTO, &flash_text_engine_BreakOpportunity_AUTO); + dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_ANY, &flash_text_engine_BreakOpportunity_ANY); + dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_ALL, &flash_text_engine_BreakOpportunity_ALL); + dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_NONE, &flash_text_engine_BreakOpportunity_NONE); + dict_put(d, &flash_sampler__getInvocationCount, &flash_sampler__getInvocationCount); + dict_put(d, &_parseFloat, &_parseFloat); + dict_put(d, &flash_events_NetStatusEvent, &flash_events_NetStatusEvent); + dict_init2(&flash_events_NetStatusEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_NetStatusEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_NetStatusEvent.members, &flash_events_NetStatusEvent_toString, &flash_events_NetStatusEvent_toString); + dict_put(&flash_events_NetStatusEvent.members, &flash_events_NetStatusEvent_info, &flash_events_NetStatusEvent_info); + dict_put(&flash_events_NetStatusEvent.members, &flash_events_NetStatusEvent_clone, &flash_events_NetStatusEvent_clone); + dict_put(&flash_events_NetStatusEvent.static_members, &flash_events_NetStatusEvent_NET_STATUS, &flash_events_NetStatusEvent_NET_STATUS); + dict_put(d, &flash_display_ShaderJob, &flash_display_ShaderJob); + dict_init2(&flash_display_ShaderJob.members, &memberinfo_type, 8); + dict_init2(&flash_display_ShaderJob.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_cancel, &flash_display_ShaderJob_cancel); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_width, &flash_display_ShaderJob_width); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_start, &flash_display_ShaderJob_start); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_shader, &flash_display_ShaderJob_shader); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_height, &flash_display_ShaderJob_height); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_target, &flash_display_ShaderJob_target); + dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_progress, &flash_display_ShaderJob_progress); + dict_put(d, &_VerifyError, &_VerifyError); + dict_init2(&_VerifyError.members, &memberinfo_type, 8); + dict_init2(&_VerifyError.static_members, &memberinfo_type, 8); + dict_put(&_VerifyError.static_members, &_VerifyError_length, &_VerifyError_length); + dict_put(d, &flash_events_AsyncErrorEvent, &flash_events_AsyncErrorEvent); + dict_init2(&flash_events_AsyncErrorEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_AsyncErrorEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_AsyncErrorEvent.members, &flash_events_AsyncErrorEvent_toString, &flash_events_AsyncErrorEvent_toString); + dict_put(&flash_events_AsyncErrorEvent.members, &flash_events_AsyncErrorEvent_error, &flash_events_AsyncErrorEvent_error); + dict_put(&flash_events_AsyncErrorEvent.members, &flash_events_AsyncErrorEvent_clone, &flash_events_AsyncErrorEvent_clone); + dict_put(&flash_events_AsyncErrorEvent.static_members, &flash_events_AsyncErrorEvent_ASYNC_ERROR, &flash_events_AsyncErrorEvent_ASYNC_ERROR); + dict_put(d, &flash_net_SharedObject, &flash_net_SharedObject); + dict_init2(&flash_net_SharedObject.members, &memberinfo_type, 15); + dict_init2(&flash_net_SharedObject.static_members, &memberinfo_type, 8); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_objectEncoding, &flash_net_SharedObject_objectEncoding); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_client, &flash_net_SharedObject_client); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_setProperty, &flash_net_SharedObject_setProperty); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_clear, &flash_net_SharedObject_clear); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_flush, &flash_net_SharedObject_flush); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_connect, &flash_net_SharedObject_connect); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_size, &flash_net_SharedObject_size); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_setDirty, &flash_net_SharedObject_setDirty); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_send, &flash_net_SharedObject_send); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_close, &flash_net_SharedObject_close); + dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_data, &flash_net_SharedObject_data); + dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_defaultObjectEncoding, &flash_net_SharedObject_defaultObjectEncoding); + dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_getDiskUsage, &flash_net_SharedObject_getDiskUsage); + dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_getRemote, &flash_net_SharedObject_getRemote); + dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_deleteAll, &flash_net_SharedObject_deleteAll); + dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_getLocal, &flash_net_SharedObject_getLocal); + dict_put(d, &_Namespace, &_Namespace); + dict_init2(&_Namespace.members, &memberinfo_type, 8); + dict_init2(&_Namespace.static_members, &memberinfo_type, 8); + dict_put(&_Namespace.members, &_Namespace_valueOf, &_Namespace_valueOf); + dict_put(&_Namespace.members, &_Namespace_toString, &_Namespace_toString); + dict_put(&_Namespace.members, &_Namespace_uri, &_Namespace_uri); + dict_put(&_Namespace.members, &_Namespace_prefix, &_Namespace_prefix); + dict_put(&_Namespace.static_members, &_Namespace_length, &_Namespace_length); + dict_put(d, &flash_utils_setTimeout, &flash_utils_setTimeout); + dict_put(d, &flash_geom_Matrix3D, &flash_geom_Matrix3D); + dict_init2(&flash_geom_Matrix3D.members, &memberinfo_type, 31); + dict_init2(&flash_geom_Matrix3D.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_decompose, &flash_geom_Matrix3D_decompose); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_pointAt, &flash_geom_Matrix3D_pointAt); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_identity, &flash_geom_Matrix3D_identity); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_transformVector, &flash_geom_Matrix3D_transformVector); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_appendRotation, &flash_geom_Matrix3D_appendRotation); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_determinant, &flash_geom_Matrix3D_determinant); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prependRotation, &flash_geom_Matrix3D_prependRotation); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_position, &flash_geom_Matrix3D_position); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_interpolateTo, &flash_geom_Matrix3D_interpolateTo); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_appendScale, &flash_geom_Matrix3D_appendScale); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prepend, &flash_geom_Matrix3D_prepend); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_recompose, &flash_geom_Matrix3D_recompose); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_appendTranslation, &flash_geom_Matrix3D_appendTranslation); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_invert, &flash_geom_Matrix3D_invert); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_rawData, &flash_geom_Matrix3D_rawData); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prependTranslation, &flash_geom_Matrix3D_prependTranslation); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_append, &flash_geom_Matrix3D_append); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_clone, &flash_geom_Matrix3D_clone); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prependScale, &flash_geom_Matrix3D_prependScale); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_deltaTransformVector, &flash_geom_Matrix3D_deltaTransformVector); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_transformVectors, &flash_geom_Matrix3D_transformVectors); + dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_transpose, &flash_geom_Matrix3D_transpose); + dict_put(&flash_geom_Matrix3D.static_members, &flash_geom_Matrix3D_interpolate, &flash_geom_Matrix3D_interpolate); + dict_put(d, &flash_sampler_pauseSampling, &flash_sampler_pauseSampling); + dict_put(d, &flash_system_Capabilities, &flash_system_Capabilities); + dict_init2(&flash_system_Capabilities.members, &memberinfo_type, 8); + dict_init2(&flash_system_Capabilities.static_members, &memberinfo_type, 63); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_maxLevelIDC, &flash_system_Capabilities_maxLevelIDC); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_isDebugger, &flash_system_Capabilities_isDebugger); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasStreamingAudio, &flash_system_Capabilities_hasStreamingAudio); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenColor, &flash_system_Capabilities_screenColor); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasIME, &flash_system_Capabilities_hasIME); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasEmbeddedVideo, &flash_system_Capabilities_hasEmbeddedVideo); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasTLS, &flash_system_Capabilities_hasTLS); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_isEmbeddedInAcrobat, &flash_system_Capabilities_isEmbeddedInAcrobat); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasScreenPlayback, &flash_system_Capabilities_hasScreenPlayback); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasVideoEncoder, &flash_system_Capabilities_hasVideoEncoder); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasAudioEncoder, &flash_system_Capabilities_hasAudioEncoder); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_pixelAspectRatio, &flash_system_Capabilities_pixelAspectRatio); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasStreamingVideo, &flash_system_Capabilities_hasStreamingVideo); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenResolutionX, &flash_system_Capabilities_screenResolutionX); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasScreenBroadcast, &flash_system_Capabilities_hasScreenBroadcast); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasAudio, &flash_system_Capabilities_hasAudio); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_language, &flash_system_Capabilities_language); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_manufacturer, &flash_system_Capabilities_manufacturer); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasPrinting, &flash_system_Capabilities_hasPrinting); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_os, &flash_system_Capabilities_os); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_localFileReadDisable, &flash_system_Capabilities_localFileReadDisable); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasMP3, &flash_system_Capabilities_hasMP3); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_avHardwareDisable, &flash_system_Capabilities_avHardwareDisable); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasAccessibility, &flash_system_Capabilities_hasAccessibility); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_version, &flash_system_Capabilities_version); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenDPI, &flash_system_Capabilities_screenDPI); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_playerType, &flash_system_Capabilities_playerType); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenResolutionY, &flash_system_Capabilities_screenResolutionY); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities__internal, &flash_system_Capabilities__internal); + dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_serverString, &flash_system_Capabilities_serverString); + dict_put(d, &flash_sampler_getSetterInvocationCount, &flash_sampler_getSetterInvocationCount); + dict_put(d, &flash_sampler_getGetterInvocationCount, &flash_sampler_getGetterInvocationCount); + dict_put(d, &flash_filters_BlurFilter, &flash_filters_BlurFilter); + dict_init2(&flash_filters_BlurFilter.members, &memberinfo_type, 8); + dict_init2(&flash_filters_BlurFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_blurY, &flash_filters_BlurFilter_blurY); + dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_clone, &flash_filters_BlurFilter_clone); + dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_quality, &flash_filters_BlurFilter_quality); + dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_blurX, &flash_filters_BlurFilter_blurX); + dict_put(d, &_isFinite, &_isFinite); + dict_put(d, &flash_media_Video, &flash_media_Video); + dict_init2(&flash_media_Video.members, &memberinfo_type, 8); + dict_init2(&flash_media_Video.static_members, &memberinfo_type, 8); + dict_put(&flash_media_Video.members, &flash_media_Video_attachCamera, &flash_media_Video_attachCamera); + dict_put(&flash_media_Video.members, &flash_media_Video_videoWidth, &flash_media_Video_videoWidth); + dict_put(&flash_media_Video.members, &flash_media_Video_clear, &flash_media_Video_clear); + dict_put(&flash_media_Video.members, &flash_media_Video_deblocking, &flash_media_Video_deblocking); + dict_put(&flash_media_Video.members, &flash_media_Video_videoHeight, &flash_media_Video_videoHeight); + dict_put(&flash_media_Video.members, &flash_media_Video_attachNetStream, &flash_media_Video_attachNetStream); + dict_put(&flash_media_Video.members, &flash_media_Video_smoothing, &flash_media_Video_smoothing); + dict_put(d, &flash_text_engine_TextLineCreationResult, &flash_text_engine_TextLineCreationResult); + dict_init2(&flash_text_engine_TextLineCreationResult.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextLineCreationResult.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_EMERGENCY, &flash_text_engine_TextLineCreationResult_EMERGENCY); + dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_COMPLETE, &flash_text_engine_TextLineCreationResult_COMPLETE); + dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_SUCCESS, &flash_text_engine_TextLineCreationResult_SUCCESS); + dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_INSUFFICIENT_WIDTH, &flash_text_engine_TextLineCreationResult_INSUFFICIENT_WIDTH); + dict_put(d, &_Error, &_Error); + dict_init2(&_Error.members, &memberinfo_type, 8); + dict_init2(&_Error.static_members, &memberinfo_type, 8); + dict_put(&_Error.members, &_Error_message, &_Error_message); + dict_put(&_Error.members, &_Error_errorID, &_Error_errorID); + dict_put(&_Error.members, &_Error_getStackTrace, &_Error_getStackTrace); + dict_put(&_Error.members, &_Error_name, &_Error_name); + dict_put(&_Error.static_members, &_Error_length, &_Error_length); + dict_put(&_Error.static_members, &_Error_getErrorMessage, &_Error_getErrorMessage); + dict_put(&_Error.static_members, &_Error_throwError, &_Error_throwError); + dict_put(d, &flash_xml_XMLNode, &flash_xml_XMLNode); + dict_init2(&flash_xml_XMLNode.members, &memberinfo_type, 31); + dict_init2(&flash_xml_XMLNode.static_members, &memberinfo_type, 8); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_childNodes, &flash_xml_XMLNode_childNodes); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_appendChild, &flash_xml_XMLNode_appendChild); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nextSibling, &flash_xml_XMLNode_nextSibling); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nodeType, &flash_xml_XMLNode_nodeType); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_attributes, &flash_xml_XMLNode_attributes); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_firstChild, &flash_xml_XMLNode_firstChild); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_parentNode, &flash_xml_XMLNode_parentNode); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_toString, &flash_xml_XMLNode_toString); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_prefix, &flash_xml_XMLNode_prefix); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_localName, &flash_xml_XMLNode_localName); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nodeName, &flash_xml_XMLNode_nodeName); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_getNamespaceForPrefix, &flash_xml_XMLNode_getNamespaceForPrefix); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_insertBefore, &flash_xml_XMLNode_insertBefore); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_lastChild, &flash_xml_XMLNode_lastChild); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_cloneNode, &flash_xml_XMLNode_cloneNode); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_removeNode, &flash_xml_XMLNode_removeNode); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_namespaceURI, &flash_xml_XMLNode_namespaceURI); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_previousSibling, &flash_xml_XMLNode_previousSibling); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_hasChildNodes, &flash_xml_XMLNode_hasChildNodes); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_getPrefixForNamespace, &flash_xml_XMLNode_getPrefixForNamespace); + dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nodeValue, &flash_xml_XMLNode_nodeValue); + dict_put(d, &flash_net_URLVariables, &flash_net_URLVariables); + dict_init2(&flash_net_URLVariables.members, &memberinfo_type, 8); + dict_init2(&flash_net_URLVariables.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLVariables.members, &flash_net_URLVariables_toString, &flash_net_URLVariables_toString); + dict_put(&flash_net_URLVariables.members, &flash_net_URLVariables_decode, &flash_net_URLVariables_decode); + dict_put(d, &flash_display_LoaderInfo, &flash_display_LoaderInfo); + dict_init2(&flash_display_LoaderInfo.members, &memberinfo_type, 31); + dict_init2(&flash_display_LoaderInfo.static_members, &memberinfo_type, 8); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_actionScriptVersion, &flash_display_LoaderInfo_actionScriptVersion); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_contentType, &flash_display_LoaderInfo_contentType); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_sameDomain, &flash_display_LoaderInfo_sameDomain); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_bytesTotal, &flash_display_LoaderInfo_bytesTotal); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_loaderURL, &flash_display_LoaderInfo_loaderURL); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_width, &flash_display_LoaderInfo_width); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_dispatchEvent, &flash_display_LoaderInfo_dispatchEvent); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_height, &flash_display_LoaderInfo_height); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_frameRate, &flash_display_LoaderInfo_frameRate); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_parameters, &flash_display_LoaderInfo_parameters); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_bytesLoaded, &flash_display_LoaderInfo_bytesLoaded); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_url, &flash_display_LoaderInfo_url); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_content, &flash_display_LoaderInfo_content); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_swfVersion, &flash_display_LoaderInfo_swfVersion); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_bytes, &flash_display_LoaderInfo_bytes); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_loader, &flash_display_LoaderInfo_loader); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_applicationDomain, &flash_display_LoaderInfo_applicationDomain); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_parentAllowsChild, &flash_display_LoaderInfo_parentAllowsChild); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_childAllowsParent, &flash_display_LoaderInfo_childAllowsParent); + dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_sharedEvents, &flash_display_LoaderInfo_sharedEvents); + dict_put(&flash_display_LoaderInfo.static_members, &flash_display_LoaderInfo_getLoaderInfoByDefinition, &flash_display_LoaderInfo_getLoaderInfoByDefinition); + dict_put(d, &flash_sampler_Sample, &flash_sampler_Sample); + dict_init2(&flash_sampler_Sample.members, &memberinfo_type, 8); + dict_init2(&flash_sampler_Sample.static_members, &memberinfo_type, 8); + dict_put(&flash_sampler_Sample.members, &flash_sampler_Sample_time, &flash_sampler_Sample_time); + dict_put(&flash_sampler_Sample.members, &flash_sampler_Sample_stack, &flash_sampler_Sample_stack); + dict_put(d, &flash_text_engine_DigitWidth, &flash_text_engine_DigitWidth); + dict_init2(&flash_text_engine_DigitWidth.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_DigitWidth.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_DigitWidth.static_members, &flash_text_engine_DigitWidth_PROPORTIONAL, &flash_text_engine_DigitWidth_PROPORTIONAL); + dict_put(&flash_text_engine_DigitWidth.static_members, &flash_text_engine_DigitWidth_DEFAULT, &flash_text_engine_DigitWidth_DEFAULT); + dict_put(&flash_text_engine_DigitWidth.static_members, &flash_text_engine_DigitWidth_TABULAR, &flash_text_engine_DigitWidth_TABULAR); + dict_put(d, &flash_net_URLRequestMethod, &flash_net_URLRequestMethod); + dict_init2(&flash_net_URLRequestMethod.members, &memberinfo_type, 8); + dict_init2(&flash_net_URLRequestMethod.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLRequestMethod.static_members, &flash_net_URLRequestMethod_GET, &flash_net_URLRequestMethod_GET); + dict_put(&flash_net_URLRequestMethod.static_members, &flash_net_URLRequestMethod_POST, &flash_net_URLRequestMethod_POST); + dict_put(d, &adobe_utils_MMExecute, &adobe_utils_MMExecute); + dict_put(d, &flash_system_System, &flash_system_System); + dict_init2(&flash_system_System.members, &memberinfo_type, 8); + dict_init2(&flash_system_System.static_members, &memberinfo_type, 15); + dict_put(&flash_system_System.static_members, &flash_system_System_pause, &flash_system_System_pause); + dict_put(&flash_system_System.static_members, &flash_system_System_useCodePage, &flash_system_System_useCodePage); + dict_put(&flash_system_System.static_members, &flash_system_System_exit, &flash_system_System_exit); + dict_put(&flash_system_System.static_members, &flash_system_System_setClipboard, &flash_system_System_setClipboard); + dict_put(&flash_system_System.static_members, &flash_system_System_totalMemory, &flash_system_System_totalMemory); + dict_put(&flash_system_System.static_members, &flash_system_System_gc, &flash_system_System_gc); + dict_put(&flash_system_System.static_members, &flash_system_System_resume, &flash_system_System_resume); + dict_put(&flash_system_System.static_members, &flash_system_System_vmVersion, &flash_system_System_vmVersion); + dict_put(&flash_system_System.static_members, &flash_system_System_ime, &flash_system_System_ime); + dict_put(d, &flash_filters_BitmapFilterQuality, &flash_filters_BitmapFilterQuality); + dict_init2(&flash_filters_BitmapFilterQuality.members, &memberinfo_type, 8); + dict_init2(&flash_filters_BitmapFilterQuality.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_BitmapFilterQuality.static_members, &flash_filters_BitmapFilterQuality_LOW, &flash_filters_BitmapFilterQuality_LOW); + dict_put(&flash_filters_BitmapFilterQuality.static_members, &flash_filters_BitmapFilterQuality_MEDIUM, &flash_filters_BitmapFilterQuality_MEDIUM); + dict_put(&flash_filters_BitmapFilterQuality.static_members, &flash_filters_BitmapFilterQuality_HIGH, &flash_filters_BitmapFilterQuality_HIGH); + dict_put(d, &flash_display_DisplayObjectContainer, &flash_display_DisplayObjectContainer); + dict_init2(&flash_display_DisplayObjectContainer.members, &memberinfo_type, 31); + dict_init2(&flash_display_DisplayObjectContainer.static_members, &memberinfo_type, 8); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_addChild, &flash_display_DisplayObjectContainer_addChild); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getObjectsUnderPoint, &flash_display_DisplayObjectContainer_getObjectsUnderPoint); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_removeChildAt, &flash_display_DisplayObjectContainer_removeChildAt); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_swapChildren, &flash_display_DisplayObjectContainer_swapChildren); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint, &flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_setChildIndex, &flash_display_DisplayObjectContainer_setChildIndex); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_numChildren, &flash_display_DisplayObjectContainer_numChildren); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getChildIndex, &flash_display_DisplayObjectContainer_getChildIndex); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getChildAt, &flash_display_DisplayObjectContainer_getChildAt); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_removeChild, &flash_display_DisplayObjectContainer_removeChild); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_addChildAt, &flash_display_DisplayObjectContainer_addChildAt); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_contains, &flash_display_DisplayObjectContainer_contains); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getChildByName, &flash_display_DisplayObjectContainer_getChildByName); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_swapChildrenAt, &flash_display_DisplayObjectContainer_swapChildrenAt); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_mouseChildren, &flash_display_DisplayObjectContainer_mouseChildren); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_tabChildren, &flash_display_DisplayObjectContainer_tabChildren); + dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_textSnapshot, &flash_display_DisplayObjectContainer_textSnapshot); + dict_put(d, &flash_system_LoaderContext, &flash_system_LoaderContext); + dict_init2(&flash_system_LoaderContext.members, &memberinfo_type, 8); + dict_init2(&flash_system_LoaderContext.static_members, &memberinfo_type, 8); + dict_put(&flash_system_LoaderContext.members, &flash_system_LoaderContext_checkPolicyFile, &flash_system_LoaderContext_checkPolicyFile); + dict_put(&flash_system_LoaderContext.members, &flash_system_LoaderContext_securityDomain, &flash_system_LoaderContext_securityDomain); + dict_put(&flash_system_LoaderContext.members, &flash_system_LoaderContext_applicationDomain, &flash_system_LoaderContext_applicationDomain); + dict_put(d, &flash_utils_clearTimeout, &flash_utils_clearTimeout); + dict_put(d, &_isXMLName, &_isXMLName); + dict_put(d, &flash_xml_XMLNodeType, &flash_xml_XMLNodeType); + dict_init2(&flash_xml_XMLNodeType.members, &memberinfo_type, 8); + dict_init2(&flash_xml_XMLNodeType.static_members, &memberinfo_type, 8); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_PROCESSING_INSTRUCTION_NODE, &flash_xml_XMLNodeType_PROCESSING_INSTRUCTION_NODE); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_CDATA_NODE, &flash_xml_XMLNodeType_CDATA_NODE); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_DOCUMENT_TYPE_NODE, &flash_xml_XMLNodeType_DOCUMENT_TYPE_NODE); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_COMMENT_NODE, &flash_xml_XMLNodeType_COMMENT_NODE); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_XML_DECLARATION, &flash_xml_XMLNodeType_XML_DECLARATION); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_TEXT_NODE, &flash_xml_XMLNodeType_TEXT_NODE); + dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_ELEMENT_NODE, &flash_xml_XMLNodeType_ELEMENT_NODE); + dict_put(d, &flash_events_ErrorEvent, &flash_events_ErrorEvent); + dict_init2(&flash_events_ErrorEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_ErrorEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_ErrorEvent.members, &flash_events_ErrorEvent_toString, &flash_events_ErrorEvent_toString); + dict_put(&flash_events_ErrorEvent.members, &flash_events_ErrorEvent_clone, &flash_events_ErrorEvent_clone); + dict_put(&flash_events_ErrorEvent.static_members, &flash_events_ErrorEvent_ERROR, &flash_events_ErrorEvent_ERROR); + dict_put(d, &flash_utils_IDataOutput, &flash_utils_IDataOutput); + dict_init2(&flash_utils_IDataOutput.members, &memberinfo_type, 31); + dict_init2(&flash_utils_IDataOutput.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeUnsignedInt, &flash_utils_IDataOutput_writeUnsignedInt); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeInt, &flash_utils_IDataOutput_writeInt); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_objectEncoding, &flash_utils_IDataOutput_objectEncoding); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeUTFBytes, &flash_utils_IDataOutput_writeUTFBytes); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeObject, &flash_utils_IDataOutput_writeObject); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeMultiByte, &flash_utils_IDataOutput_writeMultiByte); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeShort, &flash_utils_IDataOutput_writeShort); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeFloat, &flash_utils_IDataOutput_writeFloat); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeUTF, &flash_utils_IDataOutput_writeUTF); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeByte, &flash_utils_IDataOutput_writeByte); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeBoolean, &flash_utils_IDataOutput_writeBoolean); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeDouble, &flash_utils_IDataOutput_writeDouble); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeBytes, &flash_utils_IDataOutput_writeBytes); + dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_endian, &flash_utils_IDataOutput_endian); + dict_put(d, &flash_geom_Utils3D, &flash_geom_Utils3D); + dict_init2(&flash_geom_Utils3D.members, &memberinfo_type, 8); + dict_init2(&flash_geom_Utils3D.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Utils3D.static_members, &flash_geom_Utils3D_projectVectors, &flash_geom_Utils3D_projectVectors); + dict_put(&flash_geom_Utils3D.static_members, &flash_geom_Utils3D_projectVector, &flash_geom_Utils3D_projectVector); + dict_put(&flash_geom_Utils3D.static_members, &flash_geom_Utils3D_pointTowards, &flash_geom_Utils3D_pointTowards); + dict_put(d, &flash_events_TextEvent, &flash_events_TextEvent); + dict_init2(&flash_events_TextEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_TextEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_TextEvent.members, &flash_events_TextEvent_toString, &flash_events_TextEvent_toString); + dict_put(&flash_events_TextEvent.members, &flash_events_TextEvent_text, &flash_events_TextEvent_text); + dict_put(&flash_events_TextEvent.members, &flash_events_TextEvent_clone, &flash_events_TextEvent_clone); + dict_put(&flash_events_TextEvent.static_members, &flash_events_TextEvent_LINK, &flash_events_TextEvent_LINK); + dict_put(&flash_events_TextEvent.static_members, &flash_events_TextEvent_TEXT_INPUT, &flash_events_TextEvent_TEXT_INPUT); + dict_put(d, &flash_utils_Proxy, &flash_utils_Proxy); + dict_init2(&flash_utils_Proxy.members, &memberinfo_type, 15); + dict_init2(&flash_utils_Proxy.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_callProperty, &flash_utils_Proxy_callProperty); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_setProperty, &flash_utils_Proxy_setProperty); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_getProperty, &flash_utils_Proxy_getProperty); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_nextName, &flash_utils_Proxy_nextName); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_nextNameIndex, &flash_utils_Proxy_nextNameIndex); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_hasProperty, &flash_utils_Proxy_hasProperty); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_deleteProperty, &flash_utils_Proxy_deleteProperty); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_getDescendants, &flash_utils_Proxy_getDescendants); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_isAttribute, &flash_utils_Proxy_isAttribute); + dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_nextValue, &flash_utils_Proxy_nextValue); + dict_put(d, &flash_text_engine_FontPosture, &flash_text_engine_FontPosture); + dict_init2(&flash_text_engine_FontPosture.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_FontPosture.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_FontPosture.static_members, &flash_text_engine_FontPosture_NORMAL, &flash_text_engine_FontPosture_NORMAL); + dict_put(&flash_text_engine_FontPosture.static_members, &flash_text_engine_FontPosture_ITALIC, &flash_text_engine_FontPosture_ITALIC); + dict_put(d, &flash_xml_XMLDocument, &flash_xml_XMLDocument); + dict_init2(&flash_xml_XMLDocument.members, &memberinfo_type, 8); + dict_init2(&flash_xml_XMLDocument.static_members, &memberinfo_type, 8); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_docTypeDecl, &flash_xml_XMLDocument_docTypeDecl); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_idMap, &flash_xml_XMLDocument_idMap); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_toString, &flash_xml_XMLDocument_toString); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_xmlDecl, &flash_xml_XMLDocument_xmlDecl); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_createElement, &flash_xml_XMLDocument_createElement); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_ignoreWhite, &flash_xml_XMLDocument_ignoreWhite); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_createTextNode, &flash_xml_XMLDocument_createTextNode); + dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_parseXML, &flash_xml_XMLDocument_parseXML); + dict_put(d, &flash_display_ShaderInput, &flash_display_ShaderInput); + dict_init2(&flash_display_ShaderInput.members, &memberinfo_type, 8); + dict_init2(&flash_display_ShaderInput.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_width, &flash_display_ShaderInput_width); + dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_input, &flash_display_ShaderInput_input); + dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_height, &flash_display_ShaderInput_height); + dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_index, &flash_display_ShaderInput_index); + dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_channels, &flash_display_ShaderInput_channels); + dict_put(d, &flash_text_engine_TextBlock, &flash_text_engine_TextBlock); + dict_init2(&flash_text_engine_TextBlock.members, &memberinfo_type, 31); + dict_init2(&flash_text_engine_TextBlock.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_createTextLine, &flash_text_engine_TextBlock_createTextLine); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_bidiLevel, &flash_text_engine_TextBlock_bidiLevel); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_getTextLineAtCharIndex, &flash_text_engine_TextBlock_getTextLineAtCharIndex); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_lastLine, &flash_text_engine_TextBlock_lastLine); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findPreviousWordBoundary, &flash_text_engine_TextBlock_findPreviousWordBoundary); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findPreviousAtomBoundary, &flash_text_engine_TextBlock_findPreviousAtomBoundary); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_baselineZero, &flash_text_engine_TextBlock_baselineZero); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_applyNonLinearFontScaling, &flash_text_engine_TextBlock_applyNonLinearFontScaling); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_firstLine, &flash_text_engine_TextBlock_firstLine); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_textJustifier, &flash_text_engine_TextBlock_textJustifier); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_releaseLines, &flash_text_engine_TextBlock_releaseLines); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_firstInvalidLine, &flash_text_engine_TextBlock_firstInvalidLine); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_baselineFontSize, &flash_text_engine_TextBlock_baselineFontSize); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_lineRotation, &flash_text_engine_TextBlock_lineRotation); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_userData, &flash_text_engine_TextBlock_userData); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_content, &flash_text_engine_TextBlock_content); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_textLineCreationResult, &flash_text_engine_TextBlock_textLineCreationResult); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_baselineFontDescription, &flash_text_engine_TextBlock_baselineFontDescription); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findNextAtomBoundary, &flash_text_engine_TextBlock_findNextAtomBoundary); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findNextWordBoundary, &flash_text_engine_TextBlock_findNextWordBoundary); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_tabStops, &flash_text_engine_TextBlock_tabStops); + dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_dump, &flash_text_engine_TextBlock_dump); + dict_put(d, &flash_ui_MouseCursor, &flash_ui_MouseCursor); + dict_init2(&flash_ui_MouseCursor.members, &memberinfo_type, 8); + dict_init2(&flash_ui_MouseCursor.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_BUTTON, &flash_ui_MouseCursor_BUTTON); + dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_AUTO, &flash_ui_MouseCursor_AUTO); + dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_ARROW, &flash_ui_MouseCursor_ARROW); + dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_IBEAM, &flash_ui_MouseCursor_IBEAM); + dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_HAND, &flash_ui_MouseCursor_HAND); + dict_put(d, &flash_utils_flash_proxy, &flash_utils_flash_proxy); + dict_put(d, &flash_display_MorphShape, &flash_display_MorphShape); + dict_init2(&flash_display_MorphShape.members, &memberinfo_type, 8); + dict_init2(&flash_display_MorphShape.static_members, &memberinfo_type, 8); + dict_put(d, &flash_text_TextDisplayMode, &flash_text_TextDisplayMode); + dict_init2(&flash_text_TextDisplayMode.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextDisplayMode.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextDisplayMode.static_members, &flash_text_TextDisplayMode_CRT, &flash_text_TextDisplayMode_CRT); + dict_put(&flash_text_TextDisplayMode.static_members, &flash_text_TextDisplayMode_LCD, &flash_text_TextDisplayMode_LCD); + dict_put(&flash_text_TextDisplayMode.static_members, &flash_text_TextDisplayMode_DEFAULT, &flash_text_TextDisplayMode_DEFAULT); + dict_put(d, &flash_net_URLLoaderDataFormat, &flash_net_URLLoaderDataFormat); + dict_init2(&flash_net_URLLoaderDataFormat.members, &memberinfo_type, 8); + dict_init2(&flash_net_URLLoaderDataFormat.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLLoaderDataFormat.static_members, &flash_net_URLLoaderDataFormat_VARIABLES, &flash_net_URLLoaderDataFormat_VARIABLES); + dict_put(&flash_net_URLLoaderDataFormat.static_members, &flash_net_URLLoaderDataFormat_BINARY, &flash_net_URLLoaderDataFormat_BINARY); + dict_put(&flash_net_URLLoaderDataFormat.static_members, &flash_net_URLLoaderDataFormat_TEXT, &flash_net_URLLoaderDataFormat_TEXT); + dict_put(d, &flash_display_StageQuality, &flash_display_StageQuality); + dict_init2(&flash_display_StageQuality.members, &memberinfo_type, 8); + dict_init2(&flash_display_StageQuality.static_members, &memberinfo_type, 8); + dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_LOW, &flash_display_StageQuality_LOW); + dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_MEDIUM, &flash_display_StageQuality_MEDIUM); + dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_HIGH, &flash_display_StageQuality_HIGH); + dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_BEST, &flash_display_StageQuality_BEST); + dict_put(d, &flash_display_Sprite, &flash_display_Sprite); + dict_init2(&flash_display_Sprite.members, &memberinfo_type, 15); + dict_init2(&flash_display_Sprite.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_stopDrag, &flash_display_Sprite_stopDrag); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_buttonMode, &flash_display_Sprite_buttonMode); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_soundTransform, &flash_display_Sprite_soundTransform); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_hitArea, &flash_display_Sprite_hitArea); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_useHandCursor, &flash_display_Sprite_useHandCursor); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_graphics, &flash_display_Sprite_graphics); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_startDrag, &flash_display_Sprite_startDrag); + dict_put(&flash_display_Sprite.members, &flash_display_Sprite_dropTarget, &flash_display_Sprite_dropTarget); + dict_put(d, &flash_ui_Keyboard, &flash_ui_Keyboard); + dict_init2(&flash_ui_Keyboard.members, &memberinfo_type, 8); + dict_init2(&flash_ui_Keyboard.static_members, &memberinfo_type, 127); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_PAGE_DOWN, &flash_ui_Keyboard_PAGE_DOWN); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F4, &flash_ui_Keyboard_F4); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_ENTER, &flash_ui_Keyboard_ENTER); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_CONTROL, &flash_ui_Keyboard_CONTROL); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F7, &flash_ui_Keyboard_F7); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F14, &flash_ui_Keyboard_F14); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_3, &flash_ui_Keyboard_NUMPAD_3); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_DECIMAL, &flash_ui_Keyboard_NUMPAD_DECIMAL); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_CAPS_LOCK, &flash_ui_Keyboard_CAPS_LOCK); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_SHIFT, &flash_ui_Keyboard_SHIFT); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_TAB, &flash_ui_Keyboard_TAB); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_0, &flash_ui_Keyboard_NUMPAD_0); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_END, &flash_ui_Keyboard_END); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_1, &flash_ui_Keyboard_NUMPAD_1); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_LEFT, &flash_ui_Keyboard_LEFT); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F8, &flash_ui_Keyboard_F8); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F9, &flash_ui_Keyboard_F9); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_numLock, &flash_ui_Keyboard_numLock); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F2, &flash_ui_Keyboard_F2); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_4, &flash_ui_Keyboard_NUMPAD_4); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F3, &flash_ui_Keyboard_F3); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_2, &flash_ui_Keyboard_NUMPAD_2); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_HOME, &flash_ui_Keyboard_HOME); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_7, &flash_ui_Keyboard_NUMPAD_7); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_6, &flash_ui_Keyboard_NUMPAD_6); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F6, &flash_ui_Keyboard_F6); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F5, &flash_ui_Keyboard_F5); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_INSERT, &flash_ui_Keyboard_INSERT); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_ESCAPE, &flash_ui_Keyboard_ESCAPE); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F1, &flash_ui_Keyboard_F1); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_SUBTRACT, &flash_ui_Keyboard_NUMPAD_SUBTRACT); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_8, &flash_ui_Keyboard_NUMPAD_8); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_SPACE, &flash_ui_Keyboard_SPACE); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_BACKSPACE, &flash_ui_Keyboard_BACKSPACE); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_DELETE, &flash_ui_Keyboard_DELETE); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_MULTIPLY, &flash_ui_Keyboard_NUMPAD_MULTIPLY); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F13, &flash_ui_Keyboard_F13); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_ADD, &flash_ui_Keyboard_NUMPAD_ADD); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_9, &flash_ui_Keyboard_NUMPAD_9); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F12, &flash_ui_Keyboard_F12); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_RIGHT, &flash_ui_Keyboard_RIGHT); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F15, &flash_ui_Keyboard_F15); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F11, &flash_ui_Keyboard_F11); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_UP, &flash_ui_Keyboard_UP); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_isAccessible, &flash_ui_Keyboard_isAccessible); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_DOWN, &flash_ui_Keyboard_DOWN); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_capsLock, &flash_ui_Keyboard_capsLock); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_PAGE_UP, &flash_ui_Keyboard_PAGE_UP); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_ENTER, &flash_ui_Keyboard_NUMPAD_ENTER); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F10, &flash_ui_Keyboard_F10); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_5, &flash_ui_Keyboard_NUMPAD_5); + dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_DIVIDE, &flash_ui_Keyboard_NUMPAD_DIVIDE); + dict_put(d, &flash_filters_DisplacementMapFilter, &flash_filters_DisplacementMapFilter); + dict_init2(&flash_filters_DisplacementMapFilter.members, &memberinfo_type, 31); + dict_init2(&flash_filters_DisplacementMapFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_scaleY, &flash_filters_DisplacementMapFilter_scaleY); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_mapPoint, &flash_filters_DisplacementMapFilter_mapPoint); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_scaleX, &flash_filters_DisplacementMapFilter_scaleX); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_mapBitmap, &flash_filters_DisplacementMapFilter_mapBitmap); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_mode, &flash_filters_DisplacementMapFilter_mode); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_color, &flash_filters_DisplacementMapFilter_color); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_componentX, &flash_filters_DisplacementMapFilter_componentX); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_clone, &flash_filters_DisplacementMapFilter_clone); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_alpha, &flash_filters_DisplacementMapFilter_alpha); + dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_componentY, &flash_filters_DisplacementMapFilter_componentY); + dict_put(d, &flash_utils_escapeMultiByte, &flash_utils_escapeMultiByte); + dict_put(d, &adobe_utils_MMEndCommand, &adobe_utils_MMEndCommand); + dict_put(d, &flash_display_GradientType, &flash_display_GradientType); + dict_init2(&flash_display_GradientType.members, &memberinfo_type, 8); + dict_init2(&flash_display_GradientType.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GradientType.static_members, &flash_display_GradientType_LINEAR, &flash_display_GradientType_LINEAR); + dict_put(&flash_display_GradientType.static_members, &flash_display_GradientType_RADIAL, &flash_display_GradientType_RADIAL); + dict_put(d, &flash_media_ID3Info, &flash_media_ID3Info); + dict_init2(&flash_media_ID3Info.members, &memberinfo_type, 8); + dict_init2(&flash_media_ID3Info.static_members, &memberinfo_type, 8); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_comment, &flash_media_ID3Info_comment); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_year, &flash_media_ID3Info_year); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_track, &flash_media_ID3Info_track); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_artist, &flash_media_ID3Info_artist); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_songName, &flash_media_ID3Info_songName); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_genre, &flash_media_ID3Info_genre); + dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_album, &flash_media_ID3Info_album); + dict_put(d, &flash_display_GraphicsSolidFill, &flash_display_GraphicsSolidFill); + dict_init2(&flash_display_GraphicsSolidFill.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsSolidFill.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsSolidFill.members, &flash_display_GraphicsSolidFill_color, &flash_display_GraphicsSolidFill_color); + dict_put(&flash_display_GraphicsSolidFill.members, &flash_display_GraphicsSolidFill_alpha, &flash_display_GraphicsSolidFill_alpha); + dict_put(d, &flash_filters_ColorMatrixFilter, &flash_filters_ColorMatrixFilter); + dict_init2(&flash_filters_ColorMatrixFilter.members, &memberinfo_type, 8); + dict_init2(&flash_filters_ColorMatrixFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_ColorMatrixFilter.members, &flash_filters_ColorMatrixFilter_matrix, &flash_filters_ColorMatrixFilter_matrix); + dict_put(&flash_filters_ColorMatrixFilter.members, &flash_filters_ColorMatrixFilter_clone, &flash_filters_ColorMatrixFilter_clone); + dict_put(d, &flash_net_NetStreamPlayTransitions, &flash_net_NetStreamPlayTransitions); + dict_init2(&flash_net_NetStreamPlayTransitions.members, &memberinfo_type, 8); + dict_init2(&flash_net_NetStreamPlayTransitions.static_members, &memberinfo_type, 8); + dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_RESET, &flash_net_NetStreamPlayTransitions_RESET); + dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_APPEND, &flash_net_NetStreamPlayTransitions_APPEND); + dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_SWAP, &flash_net_NetStreamPlayTransitions_SWAP); + dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_SWITCH, &flash_net_NetStreamPlayTransitions_SWITCH); + dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_STOP, &flash_net_NetStreamPlayTransitions_STOP); + dict_put(d, &flash_media_SoundCodec, &flash_media_SoundCodec); + dict_init2(&flash_media_SoundCodec.members, &memberinfo_type, 8); + dict_init2(&flash_media_SoundCodec.static_members, &memberinfo_type, 8); + dict_put(&flash_media_SoundCodec.static_members, &flash_media_SoundCodec_NELLYMOSER, &flash_media_SoundCodec_NELLYMOSER); + dict_put(&flash_media_SoundCodec.static_members, &flash_media_SoundCodec_SPEEX, &flash_media_SoundCodec_SPEEX); + dict_put(d, &flash_net_ObjectEncoding, &flash_net_ObjectEncoding); + dict_init2(&flash_net_ObjectEncoding.members, &memberinfo_type, 8); + dict_init2(&flash_net_ObjectEncoding.static_members, &memberinfo_type, 8); + dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_dynamicPropertyWriter, &flash_net_ObjectEncoding_dynamicPropertyWriter); + dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_DEFAULT, &flash_net_ObjectEncoding_DEFAULT); + dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_AMF0, &flash_net_ObjectEncoding_AMF0); + dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_AMF3, &flash_net_ObjectEncoding_AMF3); + dict_put(d, &flash_text_engine_GroupElement, &flash_text_engine_GroupElement); + dict_init2(&flash_text_engine_GroupElement.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_GroupElement.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_groupElements, &flash_text_engine_GroupElement_groupElements); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_splitTextElement, &flash_text_engine_GroupElement_splitTextElement); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_mergeTextElements, &flash_text_engine_GroupElement_mergeTextElements); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_getElementAtCharIndex, &flash_text_engine_GroupElement_getElementAtCharIndex); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_elementCount, &flash_text_engine_GroupElement_elementCount); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_setElements, &flash_text_engine_GroupElement_setElements); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_getElementAt, &flash_text_engine_GroupElement_getElementAt); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_ungroupElements, &flash_text_engine_GroupElement_ungroupElements); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_replaceElements, &flash_text_engine_GroupElement_replaceElements); + dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_getElementIndex, &flash_text_engine_GroupElement_getElementIndex); + dict_put(d, &_parseInt, &_parseInt); + dict_put(d, &_QName, &_QName); + dict_init2(&_QName.members, &memberinfo_type, 8); + dict_init2(&_QName.static_members, &memberinfo_type, 8); + dict_put(&_QName.members, &_QName_localName, &_QName_localName); + dict_put(&_QName.members, &_QName_valueOf, &_QName_valueOf); + dict_put(&_QName.members, &_QName_toString, &_QName_toString); + dict_put(&_QName.members, &_QName_uri, &_QName_uri); + dict_put(&_QName.static_members, &_QName_length, &_QName_length); + dict_put(d, &_UninitializedError, &_UninitializedError); + dict_init2(&_UninitializedError.members, &memberinfo_type, 8); + dict_init2(&_UninitializedError.static_members, &memberinfo_type, 8); + dict_put(&_UninitializedError.static_members, &_UninitializedError_length, &_UninitializedError_length); + dict_put(d, &_Date, &_Date); + dict_init2(&_Date.members, &memberinfo_type, 127); + dict_init2(&_Date.static_members, &memberinfo_type, 8); + dict_put(&_Date.members, &_Date_getTimezoneOffset, &_Date_getTimezoneOffset); + dict_put(&_Date.members, &_Date_getTime, &_Date_getTime); + dict_put(&_Date.members, &_Date_setUTCMilliseconds, &_Date_setUTCMilliseconds); + dict_put(&_Date.members, &_Date_month, &_Date_month); + dict_put(&_Date.members, &_Date_toString, &_Date_toString); + dict_put(&_Date.members, &_Date_getHours, &_Date_getHours); + dict_put(&_Date.members, &_Date_date, &_Date_date); + dict_put(&_Date.members, &_Date_milliseconds, &_Date_milliseconds); + dict_put(&_Date.members, &_Date_setSeconds, &_Date_setSeconds); + dict_put(&_Date.members, &_Date_getDate, &_Date_getDate); + dict_put(&_Date.members, &_Date_hoursUTC, &_Date_hoursUTC); + dict_put(&_Date.members, &_Date_getUTCDate, &_Date_getUTCDate); + dict_put(&_Date.members, &_Date_timezoneOffset, &_Date_timezoneOffset); + dict_put(&_Date.members, &_Date_setTime, &_Date_setTime); + dict_put(&_Date.members, &_Date_millisecondsUTC, &_Date_millisecondsUTC); + dict_put(&_Date.members, &_Date_minutes, &_Date_minutes); + dict_put(&_Date.members, &_Date_setUTCHours, &_Date_setUTCHours); + dict_put(&_Date.members, &_Date_minutesUTC, &_Date_minutesUTC); + dict_put(&_Date.members, &_Date_toLocaleTimeString, &_Date_toLocaleTimeString); + dict_put(&_Date.members, &_Date_fullYearUTC, &_Date_fullYearUTC); + dict_put(&_Date.members, &_Date_time, &_Date_time); + dict_put(&_Date.members, &_Date_monthUTC, &_Date_monthUTC); + dict_put(&_Date.members, &_Date_getUTCMilliseconds, &_Date_getUTCMilliseconds); + dict_put(&_Date.members, &_Date_toDateString, &_Date_toDateString); + dict_put(&_Date.members, &_Date_getMonth, &_Date_getMonth); + dict_put(&_Date.members, &_Date_setMinutes, &_Date_setMinutes); + dict_put(&_Date.members, &_Date_toLocaleDateString, &_Date_toLocaleDateString); + dict_put(&_Date.members, &_Date_fullYear, &_Date_fullYear); + dict_put(&_Date.members, &_Date_getUTCFullYear, &_Date_getUTCFullYear); + dict_put(&_Date.members, &_Date_getSeconds, &_Date_getSeconds); + dict_put(&_Date.members, &_Date_dateUTC, &_Date_dateUTC); + dict_put(&_Date.members, &_Date_getMilliseconds, &_Date_getMilliseconds); + dict_put(&_Date.members, &_Date_setUTCMinutes, &_Date_setUTCMinutes); + dict_put(&_Date.members, &_Date_day, &_Date_day); + dict_put(&_Date.members, &_Date_setUTCSeconds, &_Date_setUTCSeconds); + dict_put(&_Date.members, &_Date_setUTCDate, &_Date_setUTCDate); + dict_put(&_Date.members, &_Date_getUTCMonth, &_Date_getUTCMonth); + dict_put(&_Date.members, &_Date_valueOf, &_Date_valueOf); + dict_put(&_Date.members, &_Date_seconds, &_Date_seconds); + dict_put(&_Date.members, &_Date_getUTCMinutes, &_Date_getUTCMinutes); + dict_put(&_Date.members, &_Date_setDate, &_Date_setDate); + dict_put(&_Date.members, &_Date_getFullYear, &_Date_getFullYear); + dict_put(&_Date.members, &_Date_setFullYear, &_Date_setFullYear); + dict_put(&_Date.members, &_Date_setHours, &_Date_setHours); + dict_put(&_Date.members, &_Date_setMonth, &_Date_setMonth); + dict_put(&_Date.members, &_Date_getUTCSeconds, &_Date_getUTCSeconds); + dict_put(&_Date.members, &_Date_getMinutes, &_Date_getMinutes); + dict_put(&_Date.members, &_Date_toLocaleString, &_Date_toLocaleString); + dict_put(&_Date.members, &_Date_toUTCString, &_Date_toUTCString); + dict_put(&_Date.members, &_Date_dayUTC, &_Date_dayUTC); + dict_put(&_Date.members, &_Date_getDay, &_Date_getDay); + dict_put(&_Date.members, &_Date_setUTCMonth, &_Date_setUTCMonth); + dict_put(&_Date.members, &_Date_hours, &_Date_hours); + dict_put(&_Date.members, &_Date_getUTCDay, &_Date_getUTCDay); + dict_put(&_Date.members, &_Date_setUTCFullYear, &_Date_setUTCFullYear); + dict_put(&_Date.members, &_Date_secondsUTC, &_Date_secondsUTC); + dict_put(&_Date.members, &_Date_toTimeString, &_Date_toTimeString); + dict_put(&_Date.members, &_Date_setMilliseconds, &_Date_setMilliseconds); + dict_put(&_Date.members, &_Date_getUTCHours, &_Date_getUTCHours); + dict_put(&_Date.static_members, &_Date_length, &_Date_length); + dict_put(&_Date.static_members, &_Date_UTC, &_Date_UTC); + dict_put(&_Date.static_members, &_Date_parse, &_Date_parse); + dict_put(d, &flash_text_StyleSheet, &flash_text_StyleSheet); + dict_init2(&flash_text_StyleSheet.members, &memberinfo_type, 8); + dict_init2(&flash_text_StyleSheet.static_members, &memberinfo_type, 8); + dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_styleNames, &flash_text_StyleSheet_styleNames); + dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_clear, &flash_text_StyleSheet_clear); + dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_transform, &flash_text_StyleSheet_transform); + dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_getStyle, &flash_text_StyleSheet_getStyle); + dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_parseCSS, &flash_text_StyleSheet_parseCSS); + dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_setStyle, &flash_text_StyleSheet_setStyle); + dict_put(d, &flash_display_ActionScriptVersion, &flash_display_ActionScriptVersion); + dict_init2(&flash_display_ActionScriptVersion.members, &memberinfo_type, 8); + dict_init2(&flash_display_ActionScriptVersion.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ActionScriptVersion.static_members, &flash_display_ActionScriptVersion_ACTIONSCRIPT3, &flash_display_ActionScriptVersion_ACTIONSCRIPT3); + dict_put(&flash_display_ActionScriptVersion.static_members, &flash_display_ActionScriptVersion_ACTIONSCRIPT2, &flash_display_ActionScriptVersion_ACTIONSCRIPT2); + dict_put(d, &flash_text_engine_EastAsianJustifier, &flash_text_engine_EastAsianJustifier); + dict_init2(&flash_text_engine_EastAsianJustifier.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_EastAsianJustifier.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_EastAsianJustifier.members, &flash_text_engine_EastAsianJustifier_justificationStyle, &flash_text_engine_EastAsianJustifier_justificationStyle); + dict_put(&flash_text_engine_EastAsianJustifier.members, &flash_text_engine_EastAsianJustifier_clone, &flash_text_engine_EastAsianJustifier_clone); + dict_put(d, &_String, &_String); + dict_init2(&_String.members, &memberinfo_type, 31); + dict_init2(&_String.static_members, &memberinfo_type, 8); + dict_put(&_String.members, &_String_indexOf, &_String_indexOf); + dict_put(&_String.members, &_String_replace, &_String_replace); + dict_put(&_String.members, &_String_lastIndexOf, &_String_lastIndexOf); + dict_put(&_String.members, &_String_valueOf, &_String_valueOf); + dict_put(&_String.members, &_String_concat, &_String_concat); + dict_put(&_String.members, &_String_substr, &_String_substr); + dict_put(&_String.members, &_String_slice, &_String_slice); + dict_put(&_String.members, &_String_search, &_String_search); + dict_put(&_String.members, &_String_toLocaleUpperCase, &_String_toLocaleUpperCase); + dict_put(&_String.members, &_String_toString, &_String_toString); + dict_put(&_String.members, &_String_toUpperCase, &_String_toUpperCase); + dict_put(&_String.members, &_String_charAt, &_String_charAt); + dict_put(&_String.members, &_String_match, &_String_match); + dict_put(&_String.members, &_String_charCodeAt, &_String_charCodeAt); + dict_put(&_String.members, &_String_substring, &_String_substring); + dict_put(&_String.members, &_String_localeCompare, &_String_localeCompare); + dict_put(&_String.members, &_String_split, &_String_split); + dict_put(&_String.members, &_String_toLocaleLowerCase, &_String_toLocaleLowerCase); + dict_put(&_String.members, &_String_length, &_String_length); + dict_put(&_String.members, &_String_toLowerCase, &_String_toLowerCase); + dict_put(&_String.static_members, &_String_fromCharCode, &_String_fromCharCode); + dict_put(d, &flash_media_SoundChannel, &flash_media_SoundChannel); + dict_init2(&flash_media_SoundChannel.members, &memberinfo_type, 8); + dict_init2(&flash_media_SoundChannel.static_members, &memberinfo_type, 8); + dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_leftPeak, &flash_media_SoundChannel_leftPeak); + dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_stop, &flash_media_SoundChannel_stop); + dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_position, &flash_media_SoundChannel_position); + dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_soundTransform, &flash_media_SoundChannel_soundTransform); + dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_rightPeak, &flash_media_SoundChannel_rightPeak); + dict_put(d, &flash_desktop_Clipboard, &flash_desktop_Clipboard); + dict_init2(&flash_desktop_Clipboard.members, &memberinfo_type, 8); + dict_init2(&flash_desktop_Clipboard.static_members, &memberinfo_type, 8); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_setDataHandler, &flash_desktop_Clipboard_setDataHandler); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_setData, &flash_desktop_Clipboard_setData); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_formats, &flash_desktop_Clipboard_formats); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_clear, &flash_desktop_Clipboard_clear); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_getData, &flash_desktop_Clipboard_getData); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_hasFormat, &flash_desktop_Clipboard_hasFormat); + dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_clearData, &flash_desktop_Clipboard_clearData); + dict_put(&flash_desktop_Clipboard.static_members, &flash_desktop_Clipboard_generalClipboard, &flash_desktop_Clipboard_generalClipboard); + dict_put(d, &flash_display_IBitmapDrawable, &flash_display_IBitmapDrawable); + dict_init2(&flash_display_IBitmapDrawable.members, &memberinfo_type, 8); + dict_init2(&flash_display_IBitmapDrawable.static_members, &memberinfo_type, 8); + dict_put(d, &_TypeError, &_TypeError); + dict_init2(&_TypeError.members, &memberinfo_type, 8); + dict_init2(&_TypeError.static_members, &memberinfo_type, 8); + dict_put(&_TypeError.static_members, &_TypeError_length, &_TypeError_length); + dict_put(d, &_int, &_int); + dict_init2(&_int.members, &memberinfo_type, 8); + dict_init2(&_int.static_members, &memberinfo_type, 8); + dict_put(&_int.members, &_int_valueOf, &_int_valueOf); + dict_put(&_int.members, &_int_toString, &_int_toString); + dict_put(&_int.members, &_int_toExponential, &_int_toExponential); + dict_put(&_int.members, &_int_toFixed, &_int_toFixed); + dict_put(&_int.members, &_int_toPrecision, &_int_toPrecision); + dict_put(&_int.static_members, &_int_MAX_VALUE, &_int_MAX_VALUE); + dict_put(&_int.static_members, &_int_length, &_int_length); + dict_put(&_int.static_members, &_int_MIN_VALUE, &_int_MIN_VALUE); + dict_put(d, &flash_display_Scene, &flash_display_Scene); + dict_init2(&flash_display_Scene.members, &memberinfo_type, 8); + dict_init2(&flash_display_Scene.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Scene.members, &flash_display_Scene_numFrames, &flash_display_Scene_numFrames); + dict_put(&flash_display_Scene.members, &flash_display_Scene_labels, &flash_display_Scene_labels); + dict_put(&flash_display_Scene.members, &flash_display_Scene_name, &flash_display_Scene_name); + dict_put(d, &flash_text_engine_FontMetrics, &flash_text_engine_FontMetrics); + dict_init2(&flash_text_engine_FontMetrics.members, &memberinfo_type, 15); + dict_init2(&flash_text_engine_FontMetrics.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_superscriptOffset, &flash_text_engine_FontMetrics_superscriptOffset); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_underlineThickness, &flash_text_engine_FontMetrics_underlineThickness); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_subscriptScale, &flash_text_engine_FontMetrics_subscriptScale); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_strikethroughOffset, &flash_text_engine_FontMetrics_strikethroughOffset); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_emBox, &flash_text_engine_FontMetrics_emBox); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_strikethroughThickness, &flash_text_engine_FontMetrics_strikethroughThickness); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_superscriptScale, &flash_text_engine_FontMetrics_superscriptScale); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_subscriptOffset, &flash_text_engine_FontMetrics_subscriptOffset); + dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_underlineOffset, &flash_text_engine_FontMetrics_underlineOffset); + dict_put(d, &flash_utils_IExternalizable, &flash_utils_IExternalizable); + dict_init2(&flash_utils_IExternalizable.members, &memberinfo_type, 8); + dict_init2(&flash_utils_IExternalizable.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_IExternalizable.members, &flash_utils_IExternalizable_readExternal, &flash_utils_IExternalizable_readExternal); + dict_put(&flash_utils_IExternalizable.members, &flash_utils_IExternalizable_writeExternal, &flash_utils_IExternalizable_writeExternal); + dict_put(d, &__AS3___vec_Vector, &__AS3___vec_Vector); + dict_init2(&__AS3___vec_Vector.members, &memberinfo_type, 8); + dict_init2(&__AS3___vec_Vector.static_members, &memberinfo_type, 8); + dict_put(d, &flash_filters_GradientBevelFilter, &flash_filters_GradientBevelFilter); + dict_init2(&flash_filters_GradientBevelFilter.members, &memberinfo_type, 15); + dict_init2(&flash_filters_GradientBevelFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_strength, &flash_filters_GradientBevelFilter_strength); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_quality, &flash_filters_GradientBevelFilter_quality); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_angle, &flash_filters_GradientBevelFilter_angle); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_knockout, &flash_filters_GradientBevelFilter_knockout); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_alphas, &flash_filters_GradientBevelFilter_alphas); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_type, &flash_filters_GradientBevelFilter_type); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_ratios, &flash_filters_GradientBevelFilter_ratios); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_colors, &flash_filters_GradientBevelFilter_colors); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_blurX, &flash_filters_GradientBevelFilter_blurX); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_blurY, &flash_filters_GradientBevelFilter_blurY); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_distance, &flash_filters_GradientBevelFilter_distance); + dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_clone, &flash_filters_GradientBevelFilter_clone); + dict_put(d, &flash_text_TextRun, &flash_text_TextRun); + dict_init2(&flash_text_TextRun.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextRun.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextRun.members, &flash_text_TextRun_beginIndex, &flash_text_TextRun_beginIndex); + dict_put(&flash_text_TextRun.members, &flash_text_TextRun_endIndex, &flash_text_TextRun_endIndex); + dict_put(&flash_text_TextRun.members, &flash_text_TextRun_textFormat, &flash_text_TextRun_textFormat); + dict_put(d, &flash_text_TextColorType, &flash_text_TextColorType); + dict_init2(&flash_text_TextColorType.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextColorType.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextColorType.static_members, &flash_text_TextColorType_DARK_COLOR, &flash_text_TextColorType_DARK_COLOR); + dict_put(&flash_text_TextColorType.static_members, &flash_text_TextColorType_LIGHT_COLOR, &flash_text_TextColorType_LIGHT_COLOR); + dict_put(d, &flash_sampler_getSampleCount, &flash_sampler_getSampleCount); + dict_put(d, &flash_net_URLRequestHeader, &flash_net_URLRequestHeader); + dict_init2(&flash_net_URLRequestHeader.members, &memberinfo_type, 8); + dict_init2(&flash_net_URLRequestHeader.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLRequestHeader.members, &flash_net_URLRequestHeader_value, &flash_net_URLRequestHeader_value); + dict_put(&flash_net_URLRequestHeader.members, &flash_net_URLRequestHeader_name, &flash_net_URLRequestHeader_name); + dict_put(d, &flash_profiler_showRedrawRegions, &flash_profiler_showRedrawRegions); + dict_put(d, &flash_display_ShaderData, &flash_display_ShaderData); + dict_init2(&flash_display_ShaderData.members, &memberinfo_type, 8); + dict_init2(&flash_display_ShaderData.static_members, &memberinfo_type, 8); + dict_put(d, &flash_text_engine_TextLine, &flash_text_engine_TextLine); + dict_init2(&flash_text_engine_TextLine.members, &memberinfo_type, 63); + dict_init2(&flash_text_engine_TextLine.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_previousLine, &flash_text_engine_TextLine_previousLine); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_validity, &flash_text_engine_TextLine_validity); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomTextBlockBeginIndex, &flash_text_engine_TextLine_getAtomTextBlockBeginIndex); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomWordBoundaryOnLeft, &flash_text_engine_TextLine_getAtomWordBoundaryOnLeft); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomTextRotation, &flash_text_engine_TextLine_getAtomTextRotation); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textHeight, &flash_text_engine_TextLine_textHeight); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomCenter, &flash_text_engine_TextLine_getAtomCenter); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomBounds, &flash_text_engine_TextLine_getAtomBounds); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_mirrorRegions, &flash_text_engine_TextLine_mirrorRegions); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_rawTextLength, &flash_text_engine_TextLine_rawTextLength); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_userData, &flash_text_engine_TextLine_userData); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textWidth, &flash_text_engine_TextLine_textWidth); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textBlock, &flash_text_engine_TextLine_textBlock); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textBlockBeginIndex, &flash_text_engine_TextLine_textBlockBeginIndex); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_unjustifiedTextWidth, &flash_text_engine_TextLine_unjustifiedTextWidth); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_ascent, &flash_text_engine_TextLine_ascent); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getBaselinePosition, &flash_text_engine_TextLine_getBaselinePosition); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_specifiedWidth, &flash_text_engine_TextLine_specifiedWidth); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getMirrorRegion, &flash_text_engine_TextLine_getMirrorRegion); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomGraphic, &flash_text_engine_TextLine_getAtomGraphic); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_hasGraphicElement, &flash_text_engine_TextLine_hasGraphicElement); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_flushAtomData, &flash_text_engine_TextLine_flushAtomData); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_dump, &flash_text_engine_TextLine_dump); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_nextLine, &flash_text_engine_TextLine_nextLine); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomIndexAtCharIndex, &flash_text_engine_TextLine_getAtomIndexAtCharIndex); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomTextBlockEndIndex, &flash_text_engine_TextLine_getAtomTextBlockEndIndex); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_atomCount, &flash_text_engine_TextLine_atomCount); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_descent, &flash_text_engine_TextLine_descent); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomBidiLevel, &flash_text_engine_TextLine_getAtomBidiLevel); + dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomIndexAtPoint, &flash_text_engine_TextLine_getAtomIndexAtPoint); + dict_put(&flash_text_engine_TextLine.static_members, &flash_text_engine_TextLine_MAX_LINE_WIDTH, &flash_text_engine_TextLine_MAX_LINE_WIDTH); + dict_put(d, &flash_sampler_getSamples, &flash_sampler_getSamples); + dict_put(d, &flash_net_URLRequest, &flash_net_URLRequest); + dict_init2(&flash_net_URLRequest.members, &memberinfo_type, 15); + dict_init2(&flash_net_URLRequest.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_contentType, &flash_net_URLRequest_contentType); + dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_url, &flash_net_URLRequest_url); + dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_requestHeaders, &flash_net_URLRequest_requestHeaders); + dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_method, &flash_net_URLRequest_method); + dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_digest, &flash_net_URLRequest_digest); + dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_data, &flash_net_URLRequest_data); + dict_put(d, &_URIError, &_URIError); + dict_init2(&_URIError.members, &memberinfo_type, 8); + dict_init2(&_URIError.static_members, &memberinfo_type, 8); + dict_put(&_URIError.static_members, &_URIError_length, &_URIError_length); + dict_put(d, &flash_net_getClassByAlias, &flash_net_getClassByAlias); + dict_put(d, &flash_display_ShaderParameter, &flash_display_ShaderParameter); + dict_init2(&flash_display_ShaderParameter.members, &memberinfo_type, 8); + dict_init2(&flash_display_ShaderParameter.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ShaderParameter.members, &flash_display_ShaderParameter_value, &flash_display_ShaderParameter_value); + dict_put(&flash_display_ShaderParameter.members, &flash_display_ShaderParameter_index, &flash_display_ShaderParameter_index); + dict_put(&flash_display_ShaderParameter.members, &flash_display_ShaderParameter_type, &flash_display_ShaderParameter_type); + dict_put(d, &flash_filters_BitmapFilterType, &flash_filters_BitmapFilterType); + dict_init2(&flash_filters_BitmapFilterType.members, &memberinfo_type, 8); + dict_init2(&flash_filters_BitmapFilterType.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_BitmapFilterType.static_members, &flash_filters_BitmapFilterType_FULL, &flash_filters_BitmapFilterType_FULL); + dict_put(&flash_filters_BitmapFilterType.static_members, &flash_filters_BitmapFilterType_INNER, &flash_filters_BitmapFilterType_INNER); + dict_put(&flash_filters_BitmapFilterType.static_members, &flash_filters_BitmapFilterType_OUTER, &flash_filters_BitmapFilterType_OUTER); + dict_put(d, &_SecurityError, &_SecurityError); + dict_init2(&_SecurityError.members, &memberinfo_type, 8); + dict_init2(&_SecurityError.static_members, &memberinfo_type, 8); + dict_put(&_SecurityError.static_members, &_SecurityError_length, &_SecurityError_length); + dict_put(d, &flash_utils_IDataInput, &flash_utils_IDataInput); + dict_init2(&flash_utils_IDataInput.members, &memberinfo_type, 31); + dict_init2(&flash_utils_IDataInput.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUTF, &flash_utils_IDataInput_readUTF); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readByte, &flash_utils_IDataInput_readByte); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUTFBytes, &flash_utils_IDataInput_readUTFBytes); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readShort, &flash_utils_IDataInput_readShort); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_objectEncoding, &flash_utils_IDataInput_objectEncoding); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUnsignedInt, &flash_utils_IDataInput_readUnsignedInt); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readDouble, &flash_utils_IDataInput_readDouble); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readBytes, &flash_utils_IDataInput_readBytes); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUnsignedByte, &flash_utils_IDataInput_readUnsignedByte); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readMultiByte, &flash_utils_IDataInput_readMultiByte); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readInt, &flash_utils_IDataInput_readInt); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_bytesAvailable, &flash_utils_IDataInput_bytesAvailable); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUnsignedShort, &flash_utils_IDataInput_readUnsignedShort); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readObject, &flash_utils_IDataInput_readObject); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readFloat, &flash_utils_IDataInput_readFloat); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_endian, &flash_utils_IDataInput_endian); + dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readBoolean, &flash_utils_IDataInput_readBoolean); + dict_put(d, &flash_events_IEventDispatcher, &flash_events_IEventDispatcher); + dict_init2(&flash_events_IEventDispatcher.members, &memberinfo_type, 8); + dict_init2(&flash_events_IEventDispatcher.static_members, &memberinfo_type, 8); + dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_willTrigger, &flash_events_IEventDispatcher_willTrigger); + dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_removeEventListener, &flash_events_IEventDispatcher_removeEventListener); + dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_hasEventListener, &flash_events_IEventDispatcher_hasEventListener); + dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_addEventListener, &flash_events_IEventDispatcher_addEventListener); + dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_dispatchEvent, &flash_events_IEventDispatcher_dispatchEvent); + dict_put(d, &_Class, &_Class); + dict_init2(&_Class.members, &memberinfo_type, 8); + dict_init2(&_Class.static_members, &memberinfo_type, 8); + dict_put(&_Class.members, &_Class_prototype, &_Class_prototype); + dict_put(&_Class.static_members, &_Class_length, &_Class_length); + dict_put(d, &flash_geom_Rectangle, &flash_geom_Rectangle); + dict_init2(&flash_geom_Rectangle.members, &memberinfo_type, 31); + dict_init2(&flash_geom_Rectangle.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_top, &flash_geom_Rectangle_top); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_intersection, &flash_geom_Rectangle_intersection); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_intersects, &flash_geom_Rectangle_intersects); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_containsPoint, &flash_geom_Rectangle_containsPoint); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_setEmpty, &flash_geom_Rectangle_setEmpty); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_topLeft, &flash_geom_Rectangle_topLeft); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_width, &flash_geom_Rectangle_width); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_containsRect, &flash_geom_Rectangle_containsRect); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_isEmpty, &flash_geom_Rectangle_isEmpty); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_equals, &flash_geom_Rectangle_equals); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_height, &flash_geom_Rectangle_height); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_left, &flash_geom_Rectangle_left); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_inflate, &flash_geom_Rectangle_inflate); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_inflatePoint, &flash_geom_Rectangle_inflatePoint); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_toString, &flash_geom_Rectangle_toString); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_offsetPoint, &flash_geom_Rectangle_offsetPoint); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_x, &flash_geom_Rectangle_x); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_size, &flash_geom_Rectangle_size); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_bottomRight, &flash_geom_Rectangle_bottomRight); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_right, &flash_geom_Rectangle_right); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_contains, &flash_geom_Rectangle_contains); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_union, &flash_geom_Rectangle_union); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_bottom, &flash_geom_Rectangle_bottom); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_clone, &flash_geom_Rectangle_clone); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_y, &flash_geom_Rectangle_y); + dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_offset, &flash_geom_Rectangle_offset); + dict_put(d, &flash_events_SecurityErrorEvent, &flash_events_SecurityErrorEvent); + dict_init2(&flash_events_SecurityErrorEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_SecurityErrorEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_SecurityErrorEvent.members, &flash_events_SecurityErrorEvent_toString, &flash_events_SecurityErrorEvent_toString); + dict_put(&flash_events_SecurityErrorEvent.members, &flash_events_SecurityErrorEvent_clone, &flash_events_SecurityErrorEvent_clone); + dict_put(&flash_events_SecurityErrorEvent.static_members, &flash_events_SecurityErrorEvent_SECURITY_ERROR, &flash_events_SecurityErrorEvent_SECURITY_ERROR); + dict_put(d, &flash_net_IDynamicPropertyWriter, &flash_net_IDynamicPropertyWriter); + dict_init2(&flash_net_IDynamicPropertyWriter.members, &memberinfo_type, 8); + dict_init2(&flash_net_IDynamicPropertyWriter.static_members, &memberinfo_type, 8); + dict_put(&flash_net_IDynamicPropertyWriter.members, &flash_net_IDynamicPropertyWriter_writeDynamicProperties, &flash_net_IDynamicPropertyWriter_writeDynamicProperties); + dict_put(d, &flash_display_InterpolationMethod, &flash_display_InterpolationMethod); + dict_init2(&flash_display_InterpolationMethod.members, &memberinfo_type, 8); + dict_init2(&flash_display_InterpolationMethod.static_members, &memberinfo_type, 8); + dict_put(&flash_display_InterpolationMethod.static_members, &flash_display_InterpolationMethod_RGB, &flash_display_InterpolationMethod_RGB); + dict_put(&flash_display_InterpolationMethod.static_members, &flash_display_InterpolationMethod_LINEAR_RGB, &flash_display_InterpolationMethod_LINEAR_RGB); + dict_put(d, &_Object, &_Object); + dict_init2(&_Object.members, &memberinfo_type, 8); + dict_init2(&_Object.static_members, &memberinfo_type, 8); + dict_put(&_Object.members, &_Object_propertyIsEnumerable, &_Object_propertyIsEnumerable); + dict_put(&_Object.members, &_Object_isPrototypeOf, &_Object_isPrototypeOf); + dict_put(&_Object.members, &_Object_hasOwnProperty, &_Object_hasOwnProperty); + dict_put(&_Object.static_members, &_Object_init, &_Object_init); + dict_put(&_Object.static_members, &_Object_length, &_Object_length); + dict_put(&_Object.static_members, &_Object__setPropertyIsEnumerable, &_Object__setPropertyIsEnumerable); + dict_put(&_Object.static_members, &_Object__dontEnumPrototype, &_Object__dontEnumPrototype); + dict_put(d, &flash_errors_EOFError, &flash_errors_EOFError); + dict_init2(&flash_errors_EOFError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_EOFError.static_members, &memberinfo_type, 8); + dict_put(d, &flash_net_NetStream, &flash_net_NetStream); + dict_init2(&flash_net_NetStream.members, &memberinfo_type, 63); + dict_init2(&flash_net_NetStream.static_members, &memberinfo_type, 8); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_videoCodec, &flash_net_NetStream_videoCodec); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_info, &flash_net_NetStream_info); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_attachCamera, &flash_net_NetStream_attachCamera); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_farNonce, &flash_net_NetStream_farNonce); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_close, &flash_net_NetStream_close); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_pause, &flash_net_NetStream_pause); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_onPeerConnect, &flash_net_NetStream_onPeerConnect); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_client, &flash_net_NetStream_client); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_resume, &flash_net_NetStream_resume); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_liveDelay, &flash_net_NetStream_liveDelay); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_peerStreams, &flash_net_NetStream_peerStreams); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_objectEncoding, &flash_net_NetStream_objectEncoding); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bytesLoaded, &flash_net_NetStream_bytesLoaded); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_receiveVideo, &flash_net_NetStream_receiveVideo); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_maxPauseBufferTime, &flash_net_NetStream_maxPauseBufferTime); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_play2, &flash_net_NetStream_play2); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_audioCodec, &flash_net_NetStream_audioCodec); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_receiveVideoFPS, &flash_net_NetStream_receiveVideoFPS); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bytesTotal, &flash_net_NetStream_bytesTotal); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_farID, &flash_net_NetStream_farID); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_receiveAudio, &flash_net_NetStream_receiveAudio); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bufferLength, &flash_net_NetStream_bufferLength); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_seek, &flash_net_NetStream_seek); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_attachAudio, &flash_net_NetStream_attachAudio); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bufferTime, &flash_net_NetStream_bufferTime); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_play, &flash_net_NetStream_play); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_publish, &flash_net_NetStream_publish); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_togglePause, &flash_net_NetStream_togglePause); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_checkPolicyFile, &flash_net_NetStream_checkPolicyFile); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_nearNonce, &flash_net_NetStream_nearNonce); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_decodedFrames, &flash_net_NetStream_decodedFrames); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_send, &flash_net_NetStream_send); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_currentFPS, &flash_net_NetStream_currentFPS); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_time, &flash_net_NetStream_time); + dict_put(&flash_net_NetStream.members, &flash_net_NetStream_soundTransform, &flash_net_NetStream_soundTransform); + dict_put(&flash_net_NetStream.static_members, &flash_net_NetStream_CONNECT_TO_FMS, &flash_net_NetStream_CONNECT_TO_FMS); + dict_put(&flash_net_NetStream.static_members, &flash_net_NetStream_DIRECT_CONNECTIONS, &flash_net_NetStream_DIRECT_CONNECTIONS); + dict_put(d, &_ArgumentError, &_ArgumentError); + dict_init2(&_ArgumentError.members, &memberinfo_type, 8); + dict_init2(&_ArgumentError.static_members, &memberinfo_type, 8); + dict_put(&_ArgumentError.static_members, &_ArgumentError_length, &_ArgumentError_length); + dict_put(d, &_XMLList, &_XMLList); + dict_init2(&_XMLList.members, &memberinfo_type, 63); + dict_init2(&_XMLList.static_members, &memberinfo_type, 8); + dict_put(&_XMLList.members, &_XMLList_normalize, &_XMLList_normalize); + dict_put(&_XMLList.members, &_XMLList_removeNamespace, &_XMLList_removeNamespace); + dict_put(&_XMLList.members, &_XMLList_prependChild, &_XMLList_prependChild); + dict_put(&_XMLList.members, &_XMLList_toXMLString, &_XMLList_toXMLString); + dict_put(&_XMLList.members, &_XMLList_nodeKind, &_XMLList_nodeKind); + dict_put(&_XMLList.members, &_XMLList_copy, &_XMLList_copy); + dict_put(&_XMLList.members, &_XMLList_text, &_XMLList_text); + dict_put(&_XMLList.members, &_XMLList_toString, &_XMLList_toString); + dict_put(&_XMLList.members, &_XMLList_childIndex, &_XMLList_childIndex); + dict_put(&_XMLList.members, &_XMLList_setName, &_XMLList_setName); + dict_put(&_XMLList.members, &_XMLList_setLocalName, &_XMLList_setLocalName); + dict_put(&_XMLList.members, &_XMLList_namespace, &_XMLList_namespace); + dict_put(&_XMLList.members, &_XMLList_insertChildBefore, &_XMLList_insertChildBefore); + dict_put(&_XMLList.members, &_XMLList_addNamespace, &_XMLList_addNamespace); + dict_put(&_XMLList.members, &_XMLList_propertyIsEnumerable, &_XMLList_propertyIsEnumerable); + dict_put(&_XMLList.members, &_XMLList_comments, &_XMLList_comments); + dict_put(&_XMLList.members, &_XMLList_attributes, &_XMLList_attributes); + dict_put(&_XMLList.members, &_XMLList_descendants, &_XMLList_descendants); + dict_put(&_XMLList.members, &_XMLList_replace, &_XMLList_replace); + dict_put(&_XMLList.members, &_XMLList_children, &_XMLList_children); + dict_put(&_XMLList.members, &_XMLList_contains, &_XMLList_contains); + dict_put(&_XMLList.members, &_XMLList_hasSimpleContent, &_XMLList_hasSimpleContent); + dict_put(&_XMLList.members, &_XMLList_elements, &_XMLList_elements); + dict_put(&_XMLList.members, &_XMLList_hasComplexContent, &_XMLList_hasComplexContent); + dict_put(&_XMLList.members, &_XMLList_insertChildAfter, &_XMLList_insertChildAfter); + dict_put(&_XMLList.members, &_XMLList_parent, &_XMLList_parent); + dict_put(&_XMLList.members, &_XMLList_length, &_XMLList_length); + dict_put(&_XMLList.members, &_XMLList_processingInstructions, &_XMLList_processingInstructions); + dict_put(&_XMLList.members, &_XMLList_child, &_XMLList_child); + dict_put(&_XMLList.members, &_XMLList_appendChild, &_XMLList_appendChild); + dict_put(&_XMLList.members, &_XMLList_valueOf, &_XMLList_valueOf); + dict_put(&_XMLList.members, &_XMLList_localName, &_XMLList_localName); + dict_put(&_XMLList.members, &_XMLList_inScopeNamespaces, &_XMLList_inScopeNamespaces); + dict_put(&_XMLList.members, &_XMLList_hasOwnProperty, &_XMLList_hasOwnProperty); + dict_put(&_XMLList.members, &_XMLList_setNamespace, &_XMLList_setNamespace); + dict_put(&_XMLList.members, &_XMLList_namespaceDeclarations, &_XMLList_namespaceDeclarations); + dict_put(&_XMLList.members, &_XMLList_name, &_XMLList_name); + dict_put(&_XMLList.members, &_XMLList_setChildren, &_XMLList_setChildren); + dict_put(&_XMLList.members, &_XMLList_attribute, &_XMLList_attribute); + dict_put(d, &flash_geom_Point, &flash_geom_Point); + dict_init2(&flash_geom_Point.members, &memberinfo_type, 15); + dict_init2(&flash_geom_Point.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Point.members, &flash_geom_Point_equals, &flash_geom_Point_equals); + dict_put(&flash_geom_Point.members, &flash_geom_Point_normalize, &flash_geom_Point_normalize); + dict_put(&flash_geom_Point.members, &flash_geom_Point_x, &flash_geom_Point_x); + dict_put(&flash_geom_Point.members, &flash_geom_Point_offset, &flash_geom_Point_offset); + dict_put(&flash_geom_Point.members, &flash_geom_Point_subtract, &flash_geom_Point_subtract); + dict_put(&flash_geom_Point.members, &flash_geom_Point_y, &flash_geom_Point_y); + dict_put(&flash_geom_Point.members, &flash_geom_Point_length, &flash_geom_Point_length); + dict_put(&flash_geom_Point.members, &flash_geom_Point_add, &flash_geom_Point_add); + dict_put(&flash_geom_Point.members, &flash_geom_Point_toString, &flash_geom_Point_toString); + dict_put(&flash_geom_Point.members, &flash_geom_Point_clone, &flash_geom_Point_clone); + dict_put(&flash_geom_Point.static_members, &flash_geom_Point_polar, &flash_geom_Point_polar); + dict_put(&flash_geom_Point.static_members, &flash_geom_Point_distance, &flash_geom_Point_distance); + dict_put(&flash_geom_Point.static_members, &flash_geom_Point_interpolate, &flash_geom_Point_interpolate); + dict_put(d, &flash_printing_PrintJobOptions, &flash_printing_PrintJobOptions); + dict_init2(&flash_printing_PrintJobOptions.members, &memberinfo_type, 8); + dict_init2(&flash_printing_PrintJobOptions.static_members, &memberinfo_type, 8); + dict_put(&flash_printing_PrintJobOptions.members, &flash_printing_PrintJobOptions_printAsBitmap, &flash_printing_PrintJobOptions_printAsBitmap); + dict_put(d, &flash_display_DisplayObject, &flash_display_DisplayObject); + dict_init2(&flash_display_DisplayObject.members, &memberinfo_type, 63); + dict_init2(&flash_display_DisplayObject.static_members, &memberinfo_type, 8); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotation, &flash_display_DisplayObject_rotation); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_filters, &flash_display_DisplayObject_filters); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotationZ, &flash_display_DisplayObject_rotationZ); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_accessibilityProperties, &flash_display_DisplayObject_accessibilityProperties); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_mouseX, &flash_display_DisplayObject_mouseX); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_root, &flash_display_DisplayObject_root); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_stage, &flash_display_DisplayObject_stage); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotationY, &flash_display_DisplayObject_rotationY); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scaleZ, &flash_display_DisplayObject_scaleZ); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_local3DToGlobal, &flash_display_DisplayObject_local3DToGlobal); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_loaderInfo, &flash_display_DisplayObject_loaderInfo); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_cacheAsBitmap, &flash_display_DisplayObject_cacheAsBitmap); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_transform, &flash_display_DisplayObject_transform); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scaleY, &flash_display_DisplayObject_scaleY); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_height, &flash_display_DisplayObject_height); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotationX, &flash_display_DisplayObject_rotationX); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scrollRect, &flash_display_DisplayObject_scrollRect); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_width, &flash_display_DisplayObject_width); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scale9Grid, &flash_display_DisplayObject_scale9Grid); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_parent, &flash_display_DisplayObject_parent); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_hitTestObject, &flash_display_DisplayObject_hitTestObject); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_hitTestPoint, &flash_display_DisplayObject_hitTestPoint); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_alpha, &flash_display_DisplayObject_alpha); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_getRect, &flash_display_DisplayObject_getRect); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_opaqueBackground, &flash_display_DisplayObject_opaqueBackground); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_globalToLocal3D, &flash_display_DisplayObject_globalToLocal3D); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_visible, &flash_display_DisplayObject_visible); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_blendMode, &flash_display_DisplayObject_blendMode); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scaleX, &flash_display_DisplayObject_scaleX); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_globalToLocal, &flash_display_DisplayObject_globalToLocal); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_localToGlobal, &flash_display_DisplayObject_localToGlobal); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_z, &flash_display_DisplayObject_z); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_name, &flash_display_DisplayObject_name); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_getBounds, &flash_display_DisplayObject_getBounds); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_mask, &flash_display_DisplayObject_mask); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_mouseY, &flash_display_DisplayObject_mouseY); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_x, &flash_display_DisplayObject_x); + dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_y, &flash_display_DisplayObject_y); + dict_put(d, &flash_sampler_DeleteObjectSample, &flash_sampler_DeleteObjectSample); + dict_init2(&flash_sampler_DeleteObjectSample.members, &memberinfo_type, 8); + dict_init2(&flash_sampler_DeleteObjectSample.static_members, &memberinfo_type, 8); + dict_put(&flash_sampler_DeleteObjectSample.members, &flash_sampler_DeleteObjectSample_size, &flash_sampler_DeleteObjectSample_size); + dict_put(&flash_sampler_DeleteObjectSample.members, &flash_sampler_DeleteObjectSample_id, &flash_sampler_DeleteObjectSample_id); + dict_put(d, &flash_system_fscommand, &flash_system_fscommand); + dict_put(d, &flash_utils_unescapeMultiByte, &flash_utils_unescapeMultiByte); + dict_put(d, &flash_sampler_StackFrame, &flash_sampler_StackFrame); + dict_init2(&flash_sampler_StackFrame.members, &memberinfo_type, 8); + dict_init2(&flash_sampler_StackFrame.static_members, &memberinfo_type, 8); + dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_name, &flash_sampler_StackFrame_name); + dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_line, &flash_sampler_StackFrame_line); + dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_toString, &flash_sampler_StackFrame_toString); + dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_file, &flash_sampler_StackFrame_file); + dict_put(d, &flash_system_JPEGLoaderContext, &flash_system_JPEGLoaderContext); + dict_init2(&flash_system_JPEGLoaderContext.members, &memberinfo_type, 8); + dict_init2(&flash_system_JPEGLoaderContext.static_members, &memberinfo_type, 8); + dict_put(&flash_system_JPEGLoaderContext.members, &flash_system_JPEGLoaderContext_deblockingFilter, &flash_system_JPEGLoaderContext_deblockingFilter); + dict_put(d, &flash_system_IME, &flash_system_IME); + dict_init2(&flash_system_IME.members, &memberinfo_type, 8); + dict_init2(&flash_system_IME.static_members, &memberinfo_type, 8); + dict_put(&flash_system_IME.static_members, &flash_system_IME_setCompositionString, &flash_system_IME_setCompositionString); + dict_put(&flash_system_IME.static_members, &flash_system_IME_enabled, &flash_system_IME_enabled); + dict_put(&flash_system_IME.static_members, &flash_system_IME_doConversion, &flash_system_IME_doConversion); + dict_put(&flash_system_IME.static_members, &flash_system_IME_conversionMode, &flash_system_IME_conversionMode); + dict_put(d, &_isNaN, &_isNaN); + dict_put(d, &flash_system_Security, &flash_system_Security); + dict_init2(&flash_system_Security.members, &memberinfo_type, 8); + dict_init2(&flash_system_Security.static_members, &memberinfo_type, 15); + dict_put(&flash_system_Security.static_members, &flash_system_Security_sandboxType, &flash_system_Security_sandboxType); + dict_put(&flash_system_Security.static_members, &flash_system_Security_LOCAL_WITH_NETWORK, &flash_system_Security_LOCAL_WITH_NETWORK); + dict_put(&flash_system_Security.static_members, &flash_system_Security_loadPolicyFile, &flash_system_Security_loadPolicyFile); + dict_put(&flash_system_Security.static_members, &flash_system_Security_allowDomain, &flash_system_Security_allowDomain); + dict_put(&flash_system_Security.static_members, &flash_system_Security_showSettings, &flash_system_Security_showSettings); + dict_put(&flash_system_Security.static_members, &flash_system_Security_LOCAL_TRUSTED, &flash_system_Security_LOCAL_TRUSTED); + dict_put(&flash_system_Security.static_members, &flash_system_Security_disableAVM1Loading, &flash_system_Security_disableAVM1Loading); + dict_put(&flash_system_Security.static_members, &flash_system_Security_allowInsecureDomain, &flash_system_Security_allowInsecureDomain); + dict_put(&flash_system_Security.static_members, &flash_system_Security_exactSettings, &flash_system_Security_exactSettings); + dict_put(&flash_system_Security.static_members, &flash_system_Security_REMOTE, &flash_system_Security_REMOTE); + dict_put(&flash_system_Security.static_members, &flash_system_Security_LOCAL_WITH_FILE, &flash_system_Security_LOCAL_WITH_FILE); + dict_put(d, &flash_display_Bitmap, &flash_display_Bitmap); + dict_init2(&flash_display_Bitmap.members, &memberinfo_type, 8); + dict_init2(&flash_display_Bitmap.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Bitmap.members, &flash_display_Bitmap_pixelSnapping, &flash_display_Bitmap_pixelSnapping); + dict_put(&flash_display_Bitmap.members, &flash_display_Bitmap_bitmapData, &flash_display_Bitmap_bitmapData); + dict_put(&flash_display_Bitmap.members, &flash_display_Bitmap_smoothing, &flash_display_Bitmap_smoothing); + dict_put(d, &flash_printing_PrintJob, &flash_printing_PrintJob); + dict_init2(&flash_printing_PrintJob.members, &memberinfo_type, 15); + dict_init2(&flash_printing_PrintJob.static_members, &memberinfo_type, 8); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_paperWidth, &flash_printing_PrintJob_paperWidth); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_addPage, &flash_printing_PrintJob_addPage); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_pageHeight, &flash_printing_PrintJob_pageHeight); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_start, &flash_printing_PrintJob_start); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_pageWidth, &flash_printing_PrintJob_pageWidth); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_send, &flash_printing_PrintJob_send); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_paperHeight, &flash_printing_PrintJob_paperHeight); + dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_orientation, &flash_printing_PrintJob_orientation); + dict_put(d, &flash_text_StaticText, &flash_text_StaticText); + dict_init2(&flash_text_StaticText.members, &memberinfo_type, 8); + dict_init2(&flash_text_StaticText.static_members, &memberinfo_type, 8); + dict_put(&flash_text_StaticText.members, &flash_text_StaticText_text, &flash_text_StaticText_text); + dict_put(d, &flash_text_engine_SpaceJustifier, &flash_text_engine_SpaceJustifier); + dict_init2(&flash_text_engine_SpaceJustifier.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_SpaceJustifier.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_SpaceJustifier.members, &flash_text_engine_SpaceJustifier_clone, &flash_text_engine_SpaceJustifier_clone); + dict_put(&flash_text_engine_SpaceJustifier.members, &flash_text_engine_SpaceJustifier_letterSpacing, &flash_text_engine_SpaceJustifier_letterSpacing); + dict_put(d, &flash_events_DataEvent, &flash_events_DataEvent); + dict_init2(&flash_events_DataEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_DataEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_DataEvent.members, &flash_events_DataEvent_toString, &flash_events_DataEvent_toString); + dict_put(&flash_events_DataEvent.members, &flash_events_DataEvent_clone, &flash_events_DataEvent_clone); + dict_put(&flash_events_DataEvent.members, &flash_events_DataEvent_data, &flash_events_DataEvent_data); + dict_put(&flash_events_DataEvent.static_members, &flash_events_DataEvent_DATA, &flash_events_DataEvent_DATA); + dict_put(&flash_events_DataEvent.static_members, &flash_events_DataEvent_UPLOAD_COMPLETE_DATA, &flash_events_DataEvent_UPLOAD_COMPLETE_DATA); + dict_put(d, &flash_events_ActivityEvent, &flash_events_ActivityEvent); + dict_init2(&flash_events_ActivityEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_ActivityEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_ActivityEvent.members, &flash_events_ActivityEvent_toString, &flash_events_ActivityEvent_toString); + dict_put(&flash_events_ActivityEvent.members, &flash_events_ActivityEvent_activating, &flash_events_ActivityEvent_activating); + dict_put(&flash_events_ActivityEvent.members, &flash_events_ActivityEvent_clone, &flash_events_ActivityEvent_clone); + dict_put(&flash_events_ActivityEvent.static_members, &flash_events_ActivityEvent_ACTIVITY, &flash_events_ActivityEvent_ACTIVITY); + dict_put(d, &flash_display_GraphicsEndFill, &flash_display_GraphicsEndFill); + dict_init2(&flash_display_GraphicsEndFill.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsEndFill.static_members, &memberinfo_type, 8); + dict_put(d, &flash_display_ColorCorrection, &flash_display_ColorCorrection); + dict_init2(&flash_display_ColorCorrection.members, &memberinfo_type, 8); + dict_init2(&flash_display_ColorCorrection.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ColorCorrection.static_members, &flash_display_ColorCorrection_OFF, &flash_display_ColorCorrection_OFF); + dict_put(&flash_display_ColorCorrection.static_members, &flash_display_ColorCorrection_DEFAULT, &flash_display_ColorCorrection_DEFAULT); + dict_put(&flash_display_ColorCorrection.static_members, &flash_display_ColorCorrection_ON, &flash_display_ColorCorrection_ON); + dict_put(d, &flash_events_IOErrorEvent, &flash_events_IOErrorEvent); + dict_init2(&flash_events_IOErrorEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_IOErrorEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_IOErrorEvent.members, &flash_events_IOErrorEvent_toString, &flash_events_IOErrorEvent_toString); + dict_put(&flash_events_IOErrorEvent.members, &flash_events_IOErrorEvent_clone, &flash_events_IOErrorEvent_clone); + dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_IO_ERROR, &flash_events_IOErrorEvent_IO_ERROR); + dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_VERIFY_ERROR, &flash_events_IOErrorEvent_VERIFY_ERROR); + dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_NETWORK_ERROR, &flash_events_IOErrorEvent_NETWORK_ERROR); + dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_DISK_ERROR, &flash_events_IOErrorEvent_DISK_ERROR); + dict_put(d, &flash_display_GraphicsStroke, &flash_display_GraphicsStroke); + dict_init2(&flash_display_GraphicsStroke.members, &memberinfo_type, 15); + dict_init2(&flash_display_GraphicsStroke.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_scaleMode, &flash_display_GraphicsStroke_scaleMode); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_miterLimit, &flash_display_GraphicsStroke_miterLimit); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_pixelHinting, &flash_display_GraphicsStroke_pixelHinting); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_fill, &flash_display_GraphicsStroke_fill); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_thickness, &flash_display_GraphicsStroke_thickness); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_joints, &flash_display_GraphicsStroke_joints); + dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_caps, &flash_display_GraphicsStroke_caps); + dict_put(d, &_Boolean, &_Boolean); + dict_init2(&_Boolean.members, &memberinfo_type, 8); + dict_init2(&_Boolean.static_members, &memberinfo_type, 8); + dict_put(&_Boolean.members, &_Boolean_valueOf, &_Boolean_valueOf); + dict_put(&_Boolean.members, &_Boolean_toString, &_Boolean_toString); + dict_put(&_Boolean.static_members, &_Boolean_length, &_Boolean_length); + dict_put(d, &flash_sampler_getMemberNames, &flash_sampler_getMemberNames); + dict_put(d, &flash_utils_getQualifiedClassName, &flash_utils_getQualifiedClassName); + dict_put(d, &flash_text_engine_GraphicElement, &flash_text_engine_GraphicElement); + dict_init2(&flash_text_engine_GraphicElement.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_GraphicElement.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_GraphicElement.members, &flash_text_engine_GraphicElement_graphic, &flash_text_engine_GraphicElement_graphic); + dict_put(&flash_text_engine_GraphicElement.members, &flash_text_engine_GraphicElement_elementWidth, &flash_text_engine_GraphicElement_elementWidth); + dict_put(&flash_text_engine_GraphicElement.members, &flash_text_engine_GraphicElement_elementHeight, &flash_text_engine_GraphicElement_elementHeight); + dict_put(d, &flash_media_Microphone, &flash_media_Microphone); + dict_init2(&flash_media_Microphone.members, &memberinfo_type, 31); + dict_init2(&flash_media_Microphone.static_members, &memberinfo_type, 8); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_codec, &flash_media_Microphone_codec); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_gain, &flash_media_Microphone_gain); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_index, &flash_media_Microphone_index); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_setLoopBack, &flash_media_Microphone_setLoopBack); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_setSilenceLevel, &flash_media_Microphone_setSilenceLevel); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_name, &flash_media_Microphone_name); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_setUseEchoSuppression, &flash_media_Microphone_setUseEchoSuppression); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_framesPerPacket, &flash_media_Microphone_framesPerPacket); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_muted, &flash_media_Microphone_muted); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_soundTransform, &flash_media_Microphone_soundTransform); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_encodeQuality, &flash_media_Microphone_encodeQuality); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_useEchoSuppression, &flash_media_Microphone_useEchoSuppression); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_silenceLevel, &flash_media_Microphone_silenceLevel); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_silenceTimeout, &flash_media_Microphone_silenceTimeout); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_rate, &flash_media_Microphone_rate); + dict_put(&flash_media_Microphone.members, &flash_media_Microphone_activityLevel, &flash_media_Microphone_activityLevel); + dict_put(&flash_media_Microphone.static_members, &flash_media_Microphone_names, &flash_media_Microphone_names); + dict_put(&flash_media_Microphone.static_members, &flash_media_Microphone_getMicrophone, &flash_media_Microphone_getMicrophone); + dict_put(d, &flash_ui_ContextMenuClipboardItems, &flash_ui_ContextMenuClipboardItems); + dict_init2(&flash_ui_ContextMenuClipboardItems.members, &memberinfo_type, 8); + dict_init2(&flash_ui_ContextMenuClipboardItems.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_clear, &flash_ui_ContextMenuClipboardItems_clear); + dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_clone, &flash_ui_ContextMenuClipboardItems_clone); + dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_paste, &flash_ui_ContextMenuClipboardItems_paste); + dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_selectAll, &flash_ui_ContextMenuClipboardItems_selectAll); + dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_copy, &flash_ui_ContextMenuClipboardItems_copy); + dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_cut, &flash_ui_ContextMenuClipboardItems_cut); + dict_put(d, &flash_display_GraphicsShaderFill, &flash_display_GraphicsShaderFill); + dict_init2(&flash_display_GraphicsShaderFill.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsShaderFill.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsShaderFill.members, &flash_display_GraphicsShaderFill_shader, &flash_display_GraphicsShaderFill_shader); + dict_put(&flash_display_GraphicsShaderFill.members, &flash_display_GraphicsShaderFill_matrix, &flash_display_GraphicsShaderFill_matrix); + dict_put(d, &flash_errors_IllegalOperationError, &flash_errors_IllegalOperationError); + dict_init2(&flash_errors_IllegalOperationError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_IllegalOperationError.static_members, &memberinfo_type, 8); + dict_put(d, &flash_filters_GradientGlowFilter, &flash_filters_GradientGlowFilter); + dict_init2(&flash_filters_GradientGlowFilter.members, &memberinfo_type, 15); + dict_init2(&flash_filters_GradientGlowFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_strength, &flash_filters_GradientGlowFilter_strength); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_quality, &flash_filters_GradientGlowFilter_quality); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_angle, &flash_filters_GradientGlowFilter_angle); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_knockout, &flash_filters_GradientGlowFilter_knockout); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_type, &flash_filters_GradientGlowFilter_type); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_alphas, &flash_filters_GradientGlowFilter_alphas); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_ratios, &flash_filters_GradientGlowFilter_ratios); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_colors, &flash_filters_GradientGlowFilter_colors); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_blurX, &flash_filters_GradientGlowFilter_blurX); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_blurY, &flash_filters_GradientGlowFilter_blurY); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_distance, &flash_filters_GradientGlowFilter_distance); + dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_clone, &flash_filters_GradientGlowFilter_clone); + dict_put(d, &flash_display_CapsStyle, &flash_display_CapsStyle); + dict_init2(&flash_display_CapsStyle.members, &memberinfo_type, 8); + dict_init2(&flash_display_CapsStyle.static_members, &memberinfo_type, 8); + dict_put(&flash_display_CapsStyle.static_members, &flash_display_CapsStyle_ROUND, &flash_display_CapsStyle_ROUND); + dict_put(&flash_display_CapsStyle.static_members, &flash_display_CapsStyle_SQUARE, &flash_display_CapsStyle_SQUARE); + dict_put(&flash_display_CapsStyle.static_members, &flash_display_CapsStyle_NONE, &flash_display_CapsStyle_NONE); + dict_put(d, &flash_text_TextSnapshot, &flash_text_TextSnapshot); + dict_init2(&flash_text_TextSnapshot.members, &memberinfo_type, 15); + dict_init2(&flash_text_TextSnapshot.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_setSelectColor, &flash_text_TextSnapshot_setSelectColor); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_setSelected, &flash_text_TextSnapshot_setSelected); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getSelectedText, &flash_text_TextSnapshot_getSelectedText); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getTextRunInfo, &flash_text_TextSnapshot_getTextRunInfo); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_charCount, &flash_text_TextSnapshot_charCount); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_findText, &flash_text_TextSnapshot_findText); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getSelected, &flash_text_TextSnapshot_getSelected); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_hitTestTextNearPos, &flash_text_TextSnapshot_hitTestTextNearPos); + dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getText, &flash_text_TextSnapshot_getText); + dict_put(d, &flash_text_engine_FontLookup, &flash_text_engine_FontLookup); + dict_init2(&flash_text_engine_FontLookup.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_FontLookup.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_FontLookup.static_members, &flash_text_engine_FontLookup_DEVICE, &flash_text_engine_FontLookup_DEVICE); + dict_put(&flash_text_engine_FontLookup.static_members, &flash_text_engine_FontLookup_EMBEDDED_CFF, &flash_text_engine_FontLookup_EMBEDDED_CFF); + dict_put(d, &flash_display_InteractiveObject, &flash_display_InteractiveObject); + dict_init2(&flash_display_InteractiveObject.members, &memberinfo_type, 15); + dict_init2(&flash_display_InteractiveObject.static_members, &memberinfo_type, 8); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_tabIndex, &flash_display_InteractiveObject_tabIndex); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_doubleClickEnabled, &flash_display_InteractiveObject_doubleClickEnabled); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_tabEnabled, &flash_display_InteractiveObject_tabEnabled); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_mouseEnabled, &flash_display_InteractiveObject_mouseEnabled); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_contextMenu, &flash_display_InteractiveObject_contextMenu); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_focusRect, &flash_display_InteractiveObject_focusRect); + dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_accessibilityImplementation, &flash_display_InteractiveObject_accessibilityImplementation); + dict_put(d, &flash_text_TextField, &flash_text_TextField); + dict_init2(&flash_text_TextField.members, &memberinfo_type, 127); + dict_init2(&flash_text_TextField.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getTextFormat, &flash_text_TextField_getTextFormat); + dict_put(&flash_text_TextField.members, &flash_text_TextField_border, &flash_text_TextField_border); + dict_put(&flash_text_TextField.members, &flash_text_TextField_selectedText, &flash_text_TextField_selectedText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_pasteRichText, &flash_text_TextField_pasteRichText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_bottomScrollV, &flash_text_TextField_bottomScrollV); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineIndexOfChar, &flash_text_TextField_getLineIndexOfChar); + dict_put(&flash_text_TextField.members, &flash_text_TextField_replaceText, &flash_text_TextField_replaceText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_defaultTextFormat, &flash_text_TextField_defaultTextFormat); + dict_put(&flash_text_TextField.members, &flash_text_TextField_restrict, &flash_text_TextField_restrict); + dict_put(&flash_text_TextField.members, &flash_text_TextField_htmlText, &flash_text_TextField_htmlText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_copyRichText, &flash_text_TextField_copyRichText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineText, &flash_text_TextField_getLineText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getFirstCharInParagraph, &flash_text_TextField_getFirstCharInParagraph); + dict_put(&flash_text_TextField.members, &flash_text_TextField_setSelection, &flash_text_TextField_setSelection); + dict_put(&flash_text_TextField.members, &flash_text_TextField_length, &flash_text_TextField_length); + dict_put(&flash_text_TextField.members, &flash_text_TextField_wordWrap, &flash_text_TextField_wordWrap); + dict_put(&flash_text_TextField.members, &flash_text_TextField_appendText, &flash_text_TextField_appendText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_caretIndex, &flash_text_TextField_caretIndex); + dict_put(&flash_text_TextField.members, &flash_text_TextField_mouseWheelEnabled, &flash_text_TextField_mouseWheelEnabled); + dict_put(&flash_text_TextField.members, &flash_text_TextField_selectionBeginIndex, &flash_text_TextField_selectionBeginIndex); + dict_put(&flash_text_TextField.members, &flash_text_TextField_sharpness, &flash_text_TextField_sharpness); + dict_put(&flash_text_TextField.members, &flash_text_TextField_type, &flash_text_TextField_type); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineIndexAtPoint, &flash_text_TextField_getLineIndexAtPoint); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getCharIndexAtPoint, &flash_text_TextField_getCharIndexAtPoint); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getXMLText, &flash_text_TextField_getXMLText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getParagraphLength, &flash_text_TextField_getParagraphLength); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getRawText, &flash_text_TextField_getRawText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_gridFitType, &flash_text_TextField_gridFitType); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineOffset, &flash_text_TextField_getLineOffset); + dict_put(&flash_text_TextField.members, &flash_text_TextField_backgroundColor, &flash_text_TextField_backgroundColor); + dict_put(&flash_text_TextField.members, &flash_text_TextField_multiline, &flash_text_TextField_multiline); + dict_put(&flash_text_TextField.members, &flash_text_TextField_numLines, &flash_text_TextField_numLines); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getImageReference, &flash_text_TextField_getImageReference); + dict_put(&flash_text_TextField.members, &flash_text_TextField_displayAsPassword, &flash_text_TextField_displayAsPassword); + dict_put(&flash_text_TextField.members, &flash_text_TextField_textWidth, &flash_text_TextField_textWidth); + dict_put(&flash_text_TextField.members, &flash_text_TextField_autoSize, &flash_text_TextField_autoSize); + dict_put(&flash_text_TextField.members, &flash_text_TextField_selectable, &flash_text_TextField_selectable); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getCharBoundaries, &flash_text_TextField_getCharBoundaries); + dict_put(&flash_text_TextField.members, &flash_text_TextField_alwaysShowSelection, &flash_text_TextField_alwaysShowSelection); + dict_put(&flash_text_TextField.members, &flash_text_TextField_thickness, &flash_text_TextField_thickness); + dict_put(&flash_text_TextField.members, &flash_text_TextField_useRichTextClipboard, &flash_text_TextField_useRichTextClipboard); + dict_put(&flash_text_TextField.members, &flash_text_TextField_scrollV, &flash_text_TextField_scrollV); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getTextRuns, &flash_text_TextField_getTextRuns); + dict_put(&flash_text_TextField.members, &flash_text_TextField_setTextFormat, &flash_text_TextField_setTextFormat); + dict_put(&flash_text_TextField.members, &flash_text_TextField_textColor, &flash_text_TextField_textColor); + dict_put(&flash_text_TextField.members, &flash_text_TextField_maxScrollV, &flash_text_TextField_maxScrollV); + dict_put(&flash_text_TextField.members, &flash_text_TextField_embedFonts, &flash_text_TextField_embedFonts); + dict_put(&flash_text_TextField.members, &flash_text_TextField_scrollH, &flash_text_TextField_scrollH); + dict_put(&flash_text_TextField.members, &flash_text_TextField_text, &flash_text_TextField_text); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineLength, &flash_text_TextField_getLineLength); + dict_put(&flash_text_TextField.members, &flash_text_TextField_textHeight, &flash_text_TextField_textHeight); + dict_put(&flash_text_TextField.members, &flash_text_TextField_antiAliasType, &flash_text_TextField_antiAliasType); + dict_put(&flash_text_TextField.members, &flash_text_TextField_styleSheet, &flash_text_TextField_styleSheet); + dict_put(&flash_text_TextField.members, &flash_text_TextField_background, &flash_text_TextField_background); + dict_put(&flash_text_TextField.members, &flash_text_TextField_replaceSelectedText, &flash_text_TextField_replaceSelectedText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_borderColor, &flash_text_TextField_borderColor); + dict_put(&flash_text_TextField.members, &flash_text_TextField_maxScrollH, &flash_text_TextField_maxScrollH); + dict_put(&flash_text_TextField.members, &flash_text_TextField_maxChars, &flash_text_TextField_maxChars); + dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineMetrics, &flash_text_TextField_getLineMetrics); + dict_put(&flash_text_TextField.members, &flash_text_TextField_selectionEndIndex, &flash_text_TextField_selectionEndIndex); + dict_put(&flash_text_TextField.members, &flash_text_TextField_insertXMLText, &flash_text_TextField_insertXMLText); + dict_put(&flash_text_TextField.members, &flash_text_TextField_condenseWhite, &flash_text_TextField_condenseWhite); + dict_put(&flash_text_TextField.static_members, &flash_text_TextField_isFontCompatible, &flash_text_TextField_isFontCompatible); + dict_put(d, &flash_printing_PrintJobOrientation, &flash_printing_PrintJobOrientation); + dict_init2(&flash_printing_PrintJobOrientation.members, &memberinfo_type, 8); + dict_init2(&flash_printing_PrintJobOrientation.static_members, &memberinfo_type, 8); + dict_put(&flash_printing_PrintJobOrientation.static_members, &flash_printing_PrintJobOrientation_LANDSCAPE, &flash_printing_PrintJobOrientation_LANDSCAPE); + dict_put(&flash_printing_PrintJobOrientation.static_members, &flash_printing_PrintJobOrientation_PORTRAIT, &flash_printing_PrintJobOrientation_PORTRAIT); + dict_put(d, &flash_text_TextRenderer, &flash_text_TextRenderer); + dict_init2(&flash_text_TextRenderer.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextRenderer.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_displayMode, &flash_text_TextRenderer_displayMode); + dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_antiAliasType, &flash_text_TextRenderer_antiAliasType); + dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_maxLevel, &flash_text_TextRenderer_maxLevel); + dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_setAdvancedAntiAliasingTable, &flash_text_TextRenderer_setAdvancedAntiAliasingTable); + dict_put(d, &flash_net_NetConnection, &flash_net_NetConnection); + dict_init2(&flash_net_NetConnection.members, &memberinfo_type, 31); + dict_init2(&flash_net_NetConnection.static_members, &memberinfo_type, 8); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_nearID, &flash_net_NetConnection_nearID); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_client, &flash_net_NetConnection_client); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_farNonce, &flash_net_NetConnection_farNonce); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_objectEncoding, &flash_net_NetConnection_objectEncoding); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_farID, &flash_net_NetConnection_farID); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_connected, &flash_net_NetConnection_connected); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_call, &flash_net_NetConnection_call); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_usingTLS, &flash_net_NetConnection_usingTLS); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_proxyType, &flash_net_NetConnection_proxyType); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_addHeader, &flash_net_NetConnection_addHeader); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_protocol, &flash_net_NetConnection_protocol); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_close, &flash_net_NetConnection_close); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_nearNonce, &flash_net_NetConnection_nearNonce); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_connect, &flash_net_NetConnection_connect); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_unconnectedPeerStreams, &flash_net_NetConnection_unconnectedPeerStreams); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_maxPeerConnections, &flash_net_NetConnection_maxPeerConnections); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_connectedProxyType, &flash_net_NetConnection_connectedProxyType); + dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_uri, &flash_net_NetConnection_uri); + dict_put(&flash_net_NetConnection.static_members, &flash_net_NetConnection_defaultObjectEncoding, &flash_net_NetConnection_defaultObjectEncoding); + dict_put(d, &_decodeURIComponent, &_decodeURIComponent); + dict_put(d, &flash_sampler_isGetterSetter, &flash_sampler_isGetterSetter); + dict_put(d, &flash_utils_getQualifiedSuperclassName, &flash_utils_getQualifiedSuperclassName); + dict_put(d, &flash_display_GraphicsPathWinding, &flash_display_GraphicsPathWinding); + dict_init2(&flash_display_GraphicsPathWinding.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsPathWinding.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsPathWinding.static_members, &flash_display_GraphicsPathWinding_EVEN_ODD, &flash_display_GraphicsPathWinding_EVEN_ODD); + dict_put(&flash_display_GraphicsPathWinding.static_members, &flash_display_GraphicsPathWinding_NON_ZERO, &flash_display_GraphicsPathWinding_NON_ZERO); + dict_put(d, &flash_text_engine_TabStop, &flash_text_engine_TabStop); + dict_init2(&flash_text_engine_TabStop.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TabStop.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TabStop.members, &flash_text_engine_TabStop_alignment, &flash_text_engine_TabStop_alignment); + dict_put(&flash_text_engine_TabStop.members, &flash_text_engine_TabStop_position, &flash_text_engine_TabStop_position); + dict_put(&flash_text_engine_TabStop.members, &flash_text_engine_TabStop_decimalAlignmentToken, &flash_text_engine_TabStop_decimalAlignmentToken); + dict_put(d, &flash_text_engine_JustificationStyle, &flash_text_engine_JustificationStyle); + dict_init2(&flash_text_engine_JustificationStyle.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_JustificationStyle.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_JustificationStyle.static_members, &flash_text_engine_JustificationStyle_PUSH_OUT_ONLY, &flash_text_engine_JustificationStyle_PUSH_OUT_ONLY); + dict_put(&flash_text_engine_JustificationStyle.static_members, &flash_text_engine_JustificationStyle_PRIORITIZE_LEAST_ADJUSTMENT, &flash_text_engine_JustificationStyle_PRIORITIZE_LEAST_ADJUSTMENT); + dict_put(&flash_text_engine_JustificationStyle.static_members, &flash_text_engine_JustificationStyle_PUSH_IN_KINSOKU, &flash_text_engine_JustificationStyle_PUSH_IN_KINSOKU); + dict_put(d, &flash_sampler_startSampling, &flash_sampler_startSampling); + dict_put(d, &flash_text_engine_TextRotation, &flash_text_engine_TextRotation); + dict_init2(&flash_text_engine_TextRotation.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextRotation.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_270, &flash_text_engine_TextRotation_ROTATE_270); + dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_AUTO, &flash_text_engine_TextRotation_AUTO); + dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_0, &flash_text_engine_TextRotation_ROTATE_0); + dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_90, &flash_text_engine_TextRotation_ROTATE_90); + dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_180, &flash_text_engine_TextRotation_ROTATE_180); + dict_put(d, &flash_sampler_clearSamples, &flash_sampler_clearSamples); + dict_put(d, &flash_system_IMEConversionMode, &flash_system_IMEConversionMode); + dict_init2(&flash_system_IMEConversionMode.members, &memberinfo_type, 8); + dict_init2(&flash_system_IMEConversionMode.static_members, &memberinfo_type, 8); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_FULL, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_FULL); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_CHINESE, &flash_system_IMEConversionMode_CHINESE); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_HALF, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_HALF); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_UNKNOWN, &flash_system_IMEConversionMode_UNKNOWN); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_KOREAN, &flash_system_IMEConversionMode_KOREAN); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_ALPHANUMERIC_HALF, &flash_system_IMEConversionMode_ALPHANUMERIC_HALF); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_ALPHANUMERIC_FULL, &flash_system_IMEConversionMode_ALPHANUMERIC_FULL); + dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_JAPANESE_HIRAGANA, &flash_system_IMEConversionMode_JAPANESE_HIRAGANA); + dict_put(d, &flash_display_StageScaleMode, &flash_display_StageScaleMode); + dict_init2(&flash_display_StageScaleMode.members, &memberinfo_type, 8); + dict_init2(&flash_display_StageScaleMode.static_members, &memberinfo_type, 8); + dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_SHOW_ALL, &flash_display_StageScaleMode_SHOW_ALL); + dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_NO_BORDER, &flash_display_StageScaleMode_NO_BORDER); + dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_EXACT_FIT, &flash_display_StageScaleMode_EXACT_FIT); + dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_NO_SCALE, &flash_display_StageScaleMode_NO_SCALE); + dict_put(d, &flash_sampler_getSize, &flash_sampler_getSize); + dict_put(d, &flash_net_URLStream, &flash_net_URLStream); + dict_init2(&flash_net_URLStream.members, &memberinfo_type, 31); + dict_init2(&flash_net_URLStream.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUTF, &flash_net_URLStream_readUTF); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readByte, &flash_net_URLStream_readByte); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUTFBytes, &flash_net_URLStream_readUTFBytes); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readShort, &flash_net_URLStream_readShort); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_objectEncoding, &flash_net_URLStream_objectEncoding); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_connected, &flash_net_URLStream_connected); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUnsignedInt, &flash_net_URLStream_readUnsignedInt); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readDouble, &flash_net_URLStream_readDouble); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readBytes, &flash_net_URLStream_readBytes); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUnsignedByte, &flash_net_URLStream_readUnsignedByte); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readMultiByte, &flash_net_URLStream_readMultiByte); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readInt, &flash_net_URLStream_readInt); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_bytesAvailable, &flash_net_URLStream_bytesAvailable); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_load, &flash_net_URLStream_load); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_close, &flash_net_URLStream_close); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUnsignedShort, &flash_net_URLStream_readUnsignedShort); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readObject, &flash_net_URLStream_readObject); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readFloat, &flash_net_URLStream_readFloat); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_endian, &flash_net_URLStream_endian); + dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readBoolean, &flash_net_URLStream_readBoolean); + dict_put(d, &flash_display_BlendMode, &flash_display_BlendMode); + dict_init2(&flash_display_BlendMode.members, &memberinfo_type, 8); + dict_init2(&flash_display_BlendMode.static_members, &memberinfo_type, 31); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_LAYER, &flash_display_BlendMode_LAYER); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_ERASE, &flash_display_BlendMode_ERASE); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_HARDLIGHT, &flash_display_BlendMode_HARDLIGHT); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_OVERLAY, &flash_display_BlendMode_OVERLAY); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_ALPHA, &flash_display_BlendMode_ALPHA); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_SUBTRACT, &flash_display_BlendMode_SUBTRACT); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_INVERT, &flash_display_BlendMode_INVERT); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_DIFFERENCE, &flash_display_BlendMode_DIFFERENCE); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_DARKEN, &flash_display_BlendMode_DARKEN); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_SHADER, &flash_display_BlendMode_SHADER); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_MULTIPLY, &flash_display_BlendMode_MULTIPLY); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_ADD, &flash_display_BlendMode_ADD); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_SCREEN, &flash_display_BlendMode_SCREEN); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_NORMAL, &flash_display_BlendMode_NORMAL); + dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_LIGHTEN, &flash_display_BlendMode_LIGHTEN); + dict_put(d, &flash_ui_Mouse, &flash_ui_Mouse); + dict_init2(&flash_ui_Mouse.members, &memberinfo_type, 8); + dict_init2(&flash_ui_Mouse.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_Mouse.static_members, &flash_ui_Mouse_cursor, &flash_ui_Mouse_cursor); + dict_put(&flash_ui_Mouse.static_members, &flash_ui_Mouse_show, &flash_ui_Mouse_show); + dict_put(&flash_ui_Mouse.static_members, &flash_ui_Mouse_hide, &flash_ui_Mouse_hide); + dict_put(d, &flash_errors_InvalidSWFError, &flash_errors_InvalidSWFError); + dict_init2(&flash_errors_InvalidSWFError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_InvalidSWFError.static_members, &memberinfo_type, 8); + dict_put(d, &flash_text_engine_RenderingMode, &flash_text_engine_RenderingMode); + dict_init2(&flash_text_engine_RenderingMode.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_RenderingMode.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_RenderingMode.static_members, &flash_text_engine_RenderingMode_NORMAL, &flash_text_engine_RenderingMode_NORMAL); + dict_put(&flash_text_engine_RenderingMode.static_members, &flash_text_engine_RenderingMode_CFF, &flash_text_engine_RenderingMode_CFF); + dict_put(d, &flash_display_GraphicsTrianglePath, &flash_display_GraphicsTrianglePath); + dict_init2(&flash_display_GraphicsTrianglePath.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsTrianglePath.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_culling, &flash_display_GraphicsTrianglePath_culling); + dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_vertices, &flash_display_GraphicsTrianglePath_vertices); + dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_indices, &flash_display_GraphicsTrianglePath_indices); + dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_uvtData, &flash_display_GraphicsTrianglePath_uvtData); + dict_put(d, &flash_display_IGraphicsFill, &flash_display_IGraphicsFill); + dict_init2(&flash_display_IGraphicsFill.members, &memberinfo_type, 8); + dict_init2(&flash_display_IGraphicsFill.static_members, &memberinfo_type, 8); + dict_put(d, &flash_text_engine_TypographicCase, &flash_text_engine_TypographicCase); + dict_init2(&flash_text_engine_TypographicCase.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TypographicCase.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_UPPERCASE, &flash_text_engine_TypographicCase_UPPERCASE); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_DEFAULT, &flash_text_engine_TypographicCase_DEFAULT); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_LOWERCASE, &flash_text_engine_TypographicCase_LOWERCASE); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_SMALL_CAPS, &flash_text_engine_TypographicCase_SMALL_CAPS); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_TITLE, &flash_text_engine_TypographicCase_TITLE); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_CAPS, &flash_text_engine_TypographicCase_CAPS); + dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_CAPS_AND_SMALL_CAPS, &flash_text_engine_TypographicCase_CAPS_AND_SMALL_CAPS); + dict_put(d, &_XML, &_XML); + dict_init2(&_XML.members, &memberinfo_type, 63); + dict_init2(&_XML.static_members, &memberinfo_type, 15); + dict_put(&_XML.members, &_XML_normalize, &_XML_normalize); + dict_put(&_XML.members, &_XML_removeNamespace, &_XML_removeNamespace); + dict_put(&_XML.members, &_XML_prependChild, &_XML_prependChild); + dict_put(&_XML.members, &_XML_toXMLString, &_XML_toXMLString); + dict_put(&_XML.members, &_XML_text, &_XML_text); + dict_put(&_XML.members, &_XML_nodeKind, &_XML_nodeKind); + dict_put(&_XML.members, &_XML_copy, &_XML_copy); + dict_put(&_XML.members, &_XML_toString, &_XML_toString); + dict_put(&_XML.members, &_XML_childIndex, &_XML_childIndex); + dict_put(&_XML.members, &_XML_setName, &_XML_setName); + dict_put(&_XML.members, &_XML_setLocalName, &_XML_setLocalName); + dict_put(&_XML.members, &_XML_namespace, &_XML_namespace); + dict_put(&_XML.members, &_XML_insertChildBefore, &_XML_insertChildBefore); + dict_put(&_XML.members, &_XML_addNamespace, &_XML_addNamespace); + dict_put(&_XML.members, &_XML_propertyIsEnumerable, &_XML_propertyIsEnumerable); + dict_put(&_XML.members, &_XML_comments, &_XML_comments); + dict_put(&_XML.members, &_XML_attributes, &_XML_attributes); + dict_put(&_XML.members, &_XML_descendants, &_XML_descendants); + dict_put(&_XML.members, &_XML_replace, &_XML_replace); + dict_put(&_XML.members, &_XML_setNotification, &_XML_setNotification); + dict_put(&_XML.members, &_XML_children, &_XML_children); + dict_put(&_XML.members, &_XML_contains, &_XML_contains); + dict_put(&_XML.members, &_XML_hasSimpleContent, &_XML_hasSimpleContent); + dict_put(&_XML.members, &_XML_elements, &_XML_elements); + dict_put(&_XML.members, &_XML_hasComplexContent, &_XML_hasComplexContent); + dict_put(&_XML.members, &_XML_insertChildAfter, &_XML_insertChildAfter); + dict_put(&_XML.members, &_XML_parent, &_XML_parent); + dict_put(&_XML.members, &_XML_length, &_XML_length); + dict_put(&_XML.members, &_XML_processingInstructions, &_XML_processingInstructions); + dict_put(&_XML.members, &_XML_child, &_XML_child); + dict_put(&_XML.members, &_XML_appendChild, &_XML_appendChild); + dict_put(&_XML.members, &_XML_valueOf, &_XML_valueOf); + dict_put(&_XML.members, &_XML_localName, &_XML_localName); + dict_put(&_XML.members, &_XML_notification, &_XML_notification); + dict_put(&_XML.members, &_XML_inScopeNamespaces, &_XML_inScopeNamespaces); + dict_put(&_XML.members, &_XML_hasOwnProperty, &_XML_hasOwnProperty); + dict_put(&_XML.members, &_XML_namespaceDeclarations, &_XML_namespaceDeclarations); + dict_put(&_XML.members, &_XML_setNamespace, &_XML_setNamespace); + dict_put(&_XML.members, &_XML_name, &_XML_name); + dict_put(&_XML.members, &_XML_setChildren, &_XML_setChildren); + dict_put(&_XML.members, &_XML_attribute, &_XML_attribute); + dict_put(&_XML.static_members, &_XML_prettyPrinting, &_XML_prettyPrinting); + dict_put(&_XML.static_members, &_XML_setSettings, &_XML_setSettings); + dict_put(&_XML.static_members, &_XML_ignoreComments, &_XML_ignoreComments); + dict_put(&_XML.static_members, &_XML_prettyIndent, &_XML_prettyIndent); + dict_put(&_XML.static_members, &_XML_settings, &_XML_settings); + dict_put(&_XML.static_members, &_XML_ignoreProcessingInstructions, &_XML_ignoreProcessingInstructions); + dict_put(&_XML.static_members, &_XML_ignoreWhitespace, &_XML_ignoreWhitespace); + dict_put(&_XML.static_members, &_XML_defaultSettings, &_XML_defaultSettings); + dict_put(d, &flash_net_NetStreamInfo, &flash_net_NetStreamInfo); + dict_init2(&flash_net_NetStreamInfo.members, &memberinfo_type, 31); + dict_init2(&flash_net_NetStreamInfo.static_members, &memberinfo_type, 8); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_maxBytesPerSecond, &flash_net_NetStreamInfo_maxBytesPerSecond); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataBufferByteLength, &flash_net_NetStreamInfo_dataBufferByteLength); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoByteCount, &flash_net_NetStreamInfo_videoByteCount); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoBufferLength, &flash_net_NetStreamInfo_videoBufferLength); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioBufferByteLength, &flash_net_NetStreamInfo_audioBufferByteLength); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataBytesPerSecond, &flash_net_NetStreamInfo_dataBytesPerSecond); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_SRTT, &flash_net_NetStreamInfo_SRTT); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_droppedFrames, &flash_net_NetStreamInfo_droppedFrames); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioByteCount, &flash_net_NetStreamInfo_audioByteCount); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioBufferLength, &flash_net_NetStreamInfo_audioBufferLength); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_byteCount, &flash_net_NetStreamInfo_byteCount); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_toString, &flash_net_NetStreamInfo_toString); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataByteCount, &flash_net_NetStreamInfo_dataByteCount); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoBufferByteLength, &flash_net_NetStreamInfo_videoBufferByteLength); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataBufferLength, &flash_net_NetStreamInfo_dataBufferLength); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioLossRate, &flash_net_NetStreamInfo_audioLossRate); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoBytesPerSecond, &flash_net_NetStreamInfo_videoBytesPerSecond); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_currentBytesPerSecond, &flash_net_NetStreamInfo_currentBytesPerSecond); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioBytesPerSecond, &flash_net_NetStreamInfo_audioBytesPerSecond); + dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_playbackBytesPerSecond, &flash_net_NetStreamInfo_playbackBytesPerSecond); + dict_put(d, &flash_display_Stage, &flash_display_Stage); + dict_init2(&flash_display_Stage.members, &memberinfo_type, 63); + dict_init2(&flash_display_Stage.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Stage.members, &flash_display_Stage_setChildIndex, &flash_display_Stage_setChildIndex); + dict_put(&flash_display_Stage.members, &flash_display_Stage_stageFocusRect, &flash_display_Stage_stageFocusRect); + dict_put(&flash_display_Stage.members, &flash_display_Stage_frameRate, &flash_display_Stage_frameRate); + dict_put(&flash_display_Stage.members, &flash_display_Stage_invalidate, &flash_display_Stage_invalidate); + dict_put(&flash_display_Stage.members, &flash_display_Stage_textSnapshot, &flash_display_Stage_textSnapshot); + dict_put(&flash_display_Stage.members, &flash_display_Stage_quality, &flash_display_Stage_quality); + dict_put(&flash_display_Stage.members, &flash_display_Stage_willTrigger, &flash_display_Stage_willTrigger); + dict_put(&flash_display_Stage.members, &flash_display_Stage_dispatchEvent, &flash_display_Stage_dispatchEvent); + dict_put(&flash_display_Stage.members, &flash_display_Stage_isFocusInaccessible, &flash_display_Stage_isFocusInaccessible); + dict_put(&flash_display_Stage.members, &flash_display_Stage_removeChildAt, &flash_display_Stage_removeChildAt); + dict_put(&flash_display_Stage.members, &flash_display_Stage_fullScreenWidth, &flash_display_Stage_fullScreenWidth); + dict_put(&flash_display_Stage.members, &flash_display_Stage_addChildAt, &flash_display_Stage_addChildAt); + dict_put(&flash_display_Stage.members, &flash_display_Stage_height, &flash_display_Stage_height); + dict_put(&flash_display_Stage.members, &flash_display_Stage_fullScreenSourceRect, &flash_display_Stage_fullScreenSourceRect); + dict_put(&flash_display_Stage.members, &flash_display_Stage_width, &flash_display_Stage_width); + dict_put(&flash_display_Stage.members, &flash_display_Stage_addChild, &flash_display_Stage_addChild); + dict_put(&flash_display_Stage.members, &flash_display_Stage_numChildren, &flash_display_Stage_numChildren); + dict_put(&flash_display_Stage.members, &flash_display_Stage_mouseChildren, &flash_display_Stage_mouseChildren); + dict_put(&flash_display_Stage.members, &flash_display_Stage_swapChildrenAt, &flash_display_Stage_swapChildrenAt); + dict_put(&flash_display_Stage.members, &flash_display_Stage_showDefaultContextMenu, &flash_display_Stage_showDefaultContextMenu); + dict_put(&flash_display_Stage.members, &flash_display_Stage_addEventListener, &flash_display_Stage_addEventListener); + dict_put(&flash_display_Stage.members, &flash_display_Stage_stageHeight, &flash_display_Stage_stageHeight); + dict_put(&flash_display_Stage.members, &flash_display_Stage_fullScreenHeight, &flash_display_Stage_fullScreenHeight); + dict_put(&flash_display_Stage.members, &flash_display_Stage_align, &flash_display_Stage_align); + dict_put(&flash_display_Stage.members, &flash_display_Stage_hasEventListener, &flash_display_Stage_hasEventListener); + dict_put(&flash_display_Stage.members, &flash_display_Stage_displayState, &flash_display_Stage_displayState); + dict_put(&flash_display_Stage.members, &flash_display_Stage_scaleMode, &flash_display_Stage_scaleMode); + dict_put(&flash_display_Stage.members, &flash_display_Stage_tabChildren, &flash_display_Stage_tabChildren); + dict_put(&flash_display_Stage.members, &flash_display_Stage_focus, &flash_display_Stage_focus); + dict_put(&flash_display_Stage.members, &flash_display_Stage_colorCorrection, &flash_display_Stage_colorCorrection); + dict_put(&flash_display_Stage.members, &flash_display_Stage_colorCorrectionSupport, &flash_display_Stage_colorCorrectionSupport); + dict_put(&flash_display_Stage.members, &flash_display_Stage_stageWidth, &flash_display_Stage_stageWidth); + dict_put(d, &flash_ui_ContextMenuItem, &flash_ui_ContextMenuItem); + dict_init2(&flash_ui_ContextMenuItem.members, &memberinfo_type, 8); + dict_init2(&flash_ui_ContextMenuItem.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_separatorBefore, &flash_ui_ContextMenuItem_separatorBefore); + dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_enabled, &flash_ui_ContextMenuItem_enabled); + dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_caption, &flash_ui_ContextMenuItem_caption); + dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_clone, &flash_ui_ContextMenuItem_clone); + dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_visible, &flash_ui_ContextMenuItem_visible); + dict_put(d, &flash_trace_Trace, &flash_trace_Trace); + dict_init2(&flash_trace_Trace.members, &memberinfo_type, 8); + dict_init2(&flash_trace_Trace.static_members, &memberinfo_type, 15); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS_AND_LINES_WITH_ARGS, &flash_trace_Trace_METHODS_AND_LINES_WITH_ARGS); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_FILE, &flash_trace_Trace_FILE); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS_WITH_ARGS, &flash_trace_Trace_METHODS_WITH_ARGS); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_OFF, &flash_trace_Trace_OFF); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS_AND_LINES, &flash_trace_Trace_METHODS_AND_LINES); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_LISTENER, &flash_trace_Trace_LISTENER); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_getLevel, &flash_trace_Trace_getLevel); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_setLevel, &flash_trace_Trace_setLevel); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_setListener, &flash_trace_Trace_setListener); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_getListener, &flash_trace_Trace_getListener); + dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS, &flash_trace_Trace_METHODS); + dict_put(d, &flash_events_TimerEvent, &flash_events_TimerEvent); + dict_init2(&flash_events_TimerEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_TimerEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_TimerEvent.members, &flash_events_TimerEvent_toString, &flash_events_TimerEvent_toString); + dict_put(&flash_events_TimerEvent.members, &flash_events_TimerEvent_clone, &flash_events_TimerEvent_clone); + dict_put(&flash_events_TimerEvent.members, &flash_events_TimerEvent_updateAfterEvent, &flash_events_TimerEvent_updateAfterEvent); + dict_put(&flash_events_TimerEvent.static_members, &flash_events_TimerEvent_TIMER_COMPLETE, &flash_events_TimerEvent_TIMER_COMPLETE); + dict_put(&flash_events_TimerEvent.static_members, &flash_events_TimerEvent_TIMER, &flash_events_TimerEvent_TIMER); + dict_put(d, &flash_events_SampleDataEvent, &flash_events_SampleDataEvent); + dict_init2(&flash_events_SampleDataEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_SampleDataEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_toString, &flash_events_SampleDataEvent_toString); + dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_position, &flash_events_SampleDataEvent_position); + dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_clone, &flash_events_SampleDataEvent_clone); + dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_data, &flash_events_SampleDataEvent_data); + dict_put(&flash_events_SampleDataEvent.static_members, &flash_events_SampleDataEvent_SAMPLE_DATA, &flash_events_SampleDataEvent_SAMPLE_DATA); + dict_put(d, &flash_display_ShaderPrecision, &flash_display_ShaderPrecision); + dict_init2(&flash_display_ShaderPrecision.members, &memberinfo_type, 8); + dict_init2(&flash_display_ShaderPrecision.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ShaderPrecision.static_members, &flash_display_ShaderPrecision_FULL, &flash_display_ShaderPrecision_FULL); + dict_put(&flash_display_ShaderPrecision.static_members, &flash_display_ShaderPrecision_FAST, &flash_display_ShaderPrecision_FAST); + dict_put(d, &flash_net_FileReference, &flash_net_FileReference); + dict_init2(&flash_net_FileReference.members, &memberinfo_type, 31); + dict_init2(&flash_net_FileReference.static_members, &memberinfo_type, 8); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_type, &flash_net_FileReference_type); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_browse, &flash_net_FileReference_browse); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_creationDate, &flash_net_FileReference_creationDate); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_upload, &flash_net_FileReference_upload); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_download, &flash_net_FileReference_download); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_save, &flash_net_FileReference_save); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_cancel, &flash_net_FileReference_cancel); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_creator, &flash_net_FileReference_creator); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_data, &flash_net_FileReference_data); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_size, &flash_net_FileReference_size); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_name, &flash_net_FileReference_name); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_load, &flash_net_FileReference_load); + dict_put(&flash_net_FileReference.members, &flash_net_FileReference_modificationDate, &flash_net_FileReference_modificationDate); + dict_put(d, &_DefinitionError, &_DefinitionError); + dict_init2(&_DefinitionError.members, &memberinfo_type, 8); + dict_init2(&_DefinitionError.static_members, &memberinfo_type, 8); + dict_put(&_DefinitionError.static_members, &_DefinitionError_length, &_DefinitionError_length); + dict_put(d, &flash_events_EventDispatcher, &flash_events_EventDispatcher); + dict_init2(&flash_events_EventDispatcher.members, &memberinfo_type, 8); + dict_init2(&flash_events_EventDispatcher.static_members, &memberinfo_type, 8); + dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_willTrigger, &flash_events_EventDispatcher_willTrigger); + dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_toString, &flash_events_EventDispatcher_toString); + dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_removeEventListener, &flash_events_EventDispatcher_removeEventListener); + dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_hasEventListener, &flash_events_EventDispatcher_hasEventListener); + dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_addEventListener, &flash_events_EventDispatcher_addEventListener); + dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_dispatchEvent, &flash_events_EventDispatcher_dispatchEvent); + dict_put(d, &flash_net_SharedObjectFlushStatus, &flash_net_SharedObjectFlushStatus); + dict_init2(&flash_net_SharedObjectFlushStatus.members, &memberinfo_type, 8); + dict_init2(&flash_net_SharedObjectFlushStatus.static_members, &memberinfo_type, 8); + dict_put(&flash_net_SharedObjectFlushStatus.static_members, &flash_net_SharedObjectFlushStatus_FLUSHED, &flash_net_SharedObjectFlushStatus_FLUSHED); + dict_put(&flash_net_SharedObjectFlushStatus.static_members, &flash_net_SharedObjectFlushStatus_PENDING, &flash_net_SharedObjectFlushStatus_PENDING); + dict_put(d, &flash_text_TextLineMetrics, &flash_text_TextLineMetrics); + dict_init2(&flash_text_TextLineMetrics.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextLineMetrics.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_descent, &flash_text_TextLineMetrics_descent); + dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_width, &flash_text_TextLineMetrics_width); + dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_ascent, &flash_text_TextLineMetrics_ascent); + dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_leading, &flash_text_TextLineMetrics_leading); + dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_height, &flash_text_TextLineMetrics_height); + dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_x, &flash_text_TextLineMetrics_x); + dict_put(d, &flash_text_AntiAliasType, &flash_text_AntiAliasType); + dict_init2(&flash_text_AntiAliasType.members, &memberinfo_type, 8); + dict_init2(&flash_text_AntiAliasType.static_members, &memberinfo_type, 8); + dict_put(&flash_text_AntiAliasType.static_members, &flash_text_AntiAliasType_NORMAL, &flash_text_AntiAliasType_NORMAL); + dict_put(&flash_text_AntiAliasType.static_members, &flash_text_AntiAliasType_ADVANCED, &flash_text_AntiAliasType_ADVANCED); + dict_put(d, &flash_system_SecurityDomain, &flash_system_SecurityDomain); + dict_init2(&flash_system_SecurityDomain.members, &memberinfo_type, 8); + dict_init2(&flash_system_SecurityDomain.static_members, &memberinfo_type, 8); + dict_put(&flash_system_SecurityDomain.static_members, &flash_system_SecurityDomain_currentDomain, &flash_system_SecurityDomain_currentDomain); + dict_put(d, &flash_text_Font, &flash_text_Font); + dict_init2(&flash_text_Font.members, &memberinfo_type, 8); + dict_init2(&flash_text_Font.static_members, &memberinfo_type, 8); + dict_put(&flash_text_Font.members, &flash_text_Font_hasGlyphs, &flash_text_Font_hasGlyphs); + dict_put(&flash_text_Font.members, &flash_text_Font_fontName, &flash_text_Font_fontName); + dict_put(&flash_text_Font.members, &flash_text_Font_fontStyle, &flash_text_Font_fontStyle); + dict_put(&flash_text_Font.members, &flash_text_Font_fontType, &flash_text_Font_fontType); + dict_put(&flash_text_Font.static_members, &flash_text_Font_enumerateFonts, &flash_text_Font_enumerateFonts); + dict_put(&flash_text_Font.static_members, &flash_text_Font_registerFont, &flash_text_Font_registerFont); + dict_put(d, &_RegExp, &_RegExp); + dict_init2(&_RegExp.members, &memberinfo_type, 8); + dict_init2(&_RegExp.static_members, &memberinfo_type, 8); + dict_put(&_RegExp.members, &_RegExp_source, &_RegExp_source); + dict_put(&_RegExp.members, &_RegExp_test, &_RegExp_test); + dict_put(&_RegExp.members, &_RegExp_global, &_RegExp_global); + dict_put(&_RegExp.members, &_RegExp_exec, &_RegExp_exec); + dict_put(&_RegExp.members, &_RegExp_ignoreCase, &_RegExp_ignoreCase); + dict_put(&_RegExp.members, &_RegExp_dotall, &_RegExp_dotall); + dict_put(&_RegExp.members, &_RegExp_lastIndex, &_RegExp_lastIndex); + dict_put(&_RegExp.members, &_RegExp_extended, &_RegExp_extended); + dict_put(&_RegExp.members, &_RegExp_multiline, &_RegExp_multiline); + dict_put(&_RegExp.static_members, &_RegExp_length, &_RegExp_length); + dict_put(d, &flash_accessibility_AccessibilityProperties, &flash_accessibility_AccessibilityProperties); + dict_init2(&flash_accessibility_AccessibilityProperties.members, &memberinfo_type, 8); + dict_init2(&flash_accessibility_AccessibilityProperties.static_members, &memberinfo_type, 8); + dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_forceSimple, &flash_accessibility_AccessibilityProperties_forceSimple); + dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_noAutoLabeling, &flash_accessibility_AccessibilityProperties_noAutoLabeling); + dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_description, &flash_accessibility_AccessibilityProperties_description); + dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_name, &flash_accessibility_AccessibilityProperties_name); + dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_shortcut, &flash_accessibility_AccessibilityProperties_shortcut); + dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_silent, &flash_accessibility_AccessibilityProperties_silent); + dict_put(d, &flash_ui_ContextMenu, &flash_ui_ContextMenu); + dict_init2(&flash_ui_ContextMenu.members, &memberinfo_type, 8); + dict_init2(&flash_ui_ContextMenu.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_hideBuiltInItems, &flash_ui_ContextMenu_hideBuiltInItems); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_clipboardItems, &flash_ui_ContextMenu_clipboardItems); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_builtInItems, &flash_ui_ContextMenu_builtInItems); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_customItems, &flash_ui_ContextMenu_customItems); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_clone, &flash_ui_ContextMenu_clone); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_link, &flash_ui_ContextMenu_link); + dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_clipboardMenu, &flash_ui_ContextMenu_clipboardMenu); + dict_put(d, &flash_text_TextFieldAutoSize, &flash_text_TextFieldAutoSize); + dict_init2(&flash_text_TextFieldAutoSize.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextFieldAutoSize.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_LEFT, &flash_text_TextFieldAutoSize_LEFT); + dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_RIGHT, &flash_text_TextFieldAutoSize_RIGHT); + dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_CENTER, &flash_text_TextFieldAutoSize_CENTER); + dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_NONE, &flash_text_TextFieldAutoSize_NONE); + dict_put(d, &_Math, &_Math); + dict_init2(&_Math.members, &memberinfo_type, 8); + dict_init2(&_Math.static_members, &memberinfo_type, 63); + dict_put(&_Math.static_members, &_Math_ceil, &_Math_ceil); + dict_put(&_Math.static_members, &_Math_SQRT2, &_Math_SQRT2); + dict_put(&_Math.static_members, &_Math_cos, &_Math_cos); + dict_put(&_Math.static_members, &_Math_abs, &_Math_abs); + dict_put(&_Math.static_members, &_Math_PI, &_Math_PI); + dict_put(&_Math.static_members, &_Math_E, &_Math_E); + dict_put(&_Math.static_members, &_Math_round, &_Math_round); + dict_put(&_Math.static_members, &_Math_LN10, &_Math_LN10); + dict_put(&_Math.static_members, &_Math_SQRT1_2, &_Math_SQRT1_2); + dict_put(&_Math.static_members, &_Math_log, &_Math_log); + dict_put(&_Math.static_members, &_Math_LOG10E, &_Math_LOG10E); + dict_put(&_Math.static_members, &_Math_random, &_Math_random); + dict_put(&_Math.static_members, &_Math_acos, &_Math_acos); + dict_put(&_Math.static_members, &_Math_tan, &_Math_tan); + dict_put(&_Math.static_members, &_Math_asin, &_Math_asin); + dict_put(&_Math.static_members, &_Math_exp, &_Math_exp); + dict_put(&_Math.static_members, &_Math_atan2, &_Math_atan2); + dict_put(&_Math.static_members, &_Math_pow, &_Math_pow); + dict_put(&_Math.static_members, &_Math_min, &_Math_min); + dict_put(&_Math.static_members, &_Math_LN2, &_Math_LN2); + dict_put(&_Math.static_members, &_Math_sin, &_Math_sin); + dict_put(&_Math.static_members, &_Math_sqrt, &_Math_sqrt); + dict_put(&_Math.static_members, &_Math_LOG2E, &_Math_LOG2E); + dict_put(&_Math.static_members, &_Math_max, &_Math_max); + dict_put(&_Math.static_members, &_Math_atan, &_Math_atan); + dict_put(&_Math.static_members, &_Math_floor, &_Math_floor); + dict_put(d, &flash_display_ColorCorrectionSupport, &flash_display_ColorCorrectionSupport); + dict_init2(&flash_display_ColorCorrectionSupport.members, &memberinfo_type, 8); + dict_init2(&flash_display_ColorCorrectionSupport.static_members, &memberinfo_type, 8); + dict_put(&flash_display_ColorCorrectionSupport.static_members, &flash_display_ColorCorrectionSupport_UNSUPPORTED, &flash_display_ColorCorrectionSupport_UNSUPPORTED); + dict_put(&flash_display_ColorCorrectionSupport.static_members, &flash_display_ColorCorrectionSupport_DEFAULT_ON, &flash_display_ColorCorrectionSupport_DEFAULT_ON); + dict_put(&flash_display_ColorCorrectionSupport.static_members, &flash_display_ColorCorrectionSupport_DEFAULT_OFF, &flash_display_ColorCorrectionSupport_DEFAULT_OFF); + dict_put(d, &flash_errors_IOError, &flash_errors_IOError); + dict_init2(&flash_errors_IOError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_IOError.static_members, &memberinfo_type, 8); + dict_put(d, &_trace, &_trace); + dict_put(d, &flash_ui_ContextMenuBuiltInItems, &flash_ui_ContextMenuBuiltInItems); + dict_init2(&flash_ui_ContextMenuBuiltInItems.members, &memberinfo_type, 8); + dict_init2(&flash_ui_ContextMenuBuiltInItems.static_members, &memberinfo_type, 8); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_zoom, &flash_ui_ContextMenuBuiltInItems_zoom); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_save, &flash_ui_ContextMenuBuiltInItems_save); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_loop, &flash_ui_ContextMenuBuiltInItems_loop); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_print, &flash_ui_ContextMenuBuiltInItems_print); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_forwardAndBack, &flash_ui_ContextMenuBuiltInItems_forwardAndBack); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_rewind, &flash_ui_ContextMenuBuiltInItems_rewind); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_clone, &flash_ui_ContextMenuBuiltInItems_clone); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_quality, &flash_ui_ContextMenuBuiltInItems_quality); + dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_play, &flash_ui_ContextMenuBuiltInItems_play); + dict_put(d, &flash_net_FileReferenceList, &flash_net_FileReferenceList); + dict_init2(&flash_net_FileReferenceList.members, &memberinfo_type, 8); + dict_init2(&flash_net_FileReferenceList.static_members, &memberinfo_type, 8); + dict_put(&flash_net_FileReferenceList.members, &flash_net_FileReferenceList_fileList, &flash_net_FileReferenceList_fileList); + dict_put(&flash_net_FileReferenceList.members, &flash_net_FileReferenceList_browse, &flash_net_FileReferenceList_browse); + dict_put(d, &flash_display_TriangleCulling, &flash_display_TriangleCulling); + dict_init2(&flash_display_TriangleCulling.members, &memberinfo_type, 8); + dict_init2(&flash_display_TriangleCulling.static_members, &memberinfo_type, 8); + dict_put(&flash_display_TriangleCulling.static_members, &flash_display_TriangleCulling_POSITIVE, &flash_display_TriangleCulling_POSITIVE); + dict_put(&flash_display_TriangleCulling.static_members, &flash_display_TriangleCulling_NEGATIVE, &flash_display_TriangleCulling_NEGATIVE); + dict_put(&flash_display_TriangleCulling.static_members, &flash_display_TriangleCulling_NONE, &flash_display_TriangleCulling_NONE); + dict_put(d, &flash_media_SoundMixer, &flash_media_SoundMixer); + dict_init2(&flash_media_SoundMixer.members, &memberinfo_type, 8); + dict_init2(&flash_media_SoundMixer.static_members, &memberinfo_type, 8); + dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_computeSpectrum, &flash_media_SoundMixer_computeSpectrum); + dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_areSoundsInaccessible, &flash_media_SoundMixer_areSoundsInaccessible); + dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_soundTransform, &flash_media_SoundMixer_soundTransform); + dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_bufferTime, &flash_media_SoundMixer_bufferTime); + dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_stopAll, &flash_media_SoundMixer_stopAll); + dict_put(d, &adobe_utils_XMLUI, &adobe_utils_XMLUI); + dict_init2(&adobe_utils_XMLUI.members, &memberinfo_type, 8); + dict_init2(&adobe_utils_XMLUI.static_members, &memberinfo_type, 8); + dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_cancel, &adobe_utils_XMLUI_cancel); + dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_setProperty, &adobe_utils_XMLUI_setProperty); + dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_getProperty, &adobe_utils_XMLUI_getProperty); + dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_accept, &adobe_utils_XMLUI_accept); + dict_put(d, &_escape, &_escape); + dict_put(d, &flash_utils_setInterval, &flash_utils_setInterval); + dict_put(d, &flash_events_StatusEvent, &flash_events_StatusEvent); + dict_init2(&flash_events_StatusEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_StatusEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_toString, &flash_events_StatusEvent_toString); + dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_code, &flash_events_StatusEvent_code); + dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_clone, &flash_events_StatusEvent_clone); + dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_level, &flash_events_StatusEvent_level); + dict_put(&flash_events_StatusEvent.static_members, &flash_events_StatusEvent_STATUS, &flash_events_StatusEvent_STATUS); + dict_put(d, &flash_display_IGraphicsPath, &flash_display_IGraphicsPath); + dict_init2(&flash_display_IGraphicsPath.members, &memberinfo_type, 8); + dict_init2(&flash_display_IGraphicsPath.static_members, &memberinfo_type, 8); + dict_put(d, &flash_events_ShaderEvent, &flash_events_ShaderEvent); + dict_init2(&flash_events_ShaderEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_ShaderEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_vector, &flash_events_ShaderEvent_vector); + dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_toString, &flash_events_ShaderEvent_toString); + dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_bitmapData, &flash_events_ShaderEvent_bitmapData); + dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_clone, &flash_events_ShaderEvent_clone); + dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_byteArray, &flash_events_ShaderEvent_byteArray); + dict_put(&flash_events_ShaderEvent.static_members, &flash_events_ShaderEvent_COMPLETE, &flash_events_ShaderEvent_COMPLETE); + dict_put(d, &flash_display_Shader, &flash_display_Shader); + dict_init2(&flash_display_Shader.members, &memberinfo_type, 8); + dict_init2(&flash_display_Shader.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Shader.members, &flash_display_Shader_precisionHint, &flash_display_Shader_precisionHint); + dict_put(&flash_display_Shader.members, &flash_display_Shader_data, &flash_display_Shader_data); + dict_put(d, &flash_errors_StackOverflowError, &flash_errors_StackOverflowError); + dict_init2(&flash_errors_StackOverflowError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_StackOverflowError.static_members, &memberinfo_type, 8); + dict_put(d, &flash_sampler_getInvocationCount, &flash_sampler_getInvocationCount); + dict_put(d, &flash_text_engine_Kerning, &flash_text_engine_Kerning); + dict_init2(&flash_text_engine_Kerning.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_Kerning.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_Kerning.static_members, &flash_text_engine_Kerning_AUTO, &flash_text_engine_Kerning_AUTO); + dict_put(&flash_text_engine_Kerning.static_members, &flash_text_engine_Kerning_OFF, &flash_text_engine_Kerning_OFF); + dict_put(&flash_text_engine_Kerning.static_members, &flash_text_engine_Kerning_ON, &flash_text_engine_Kerning_ON); + dict_put(d, &flash_text_CSMSettings, &flash_text_CSMSettings); + dict_init2(&flash_text_CSMSettings.members, &memberinfo_type, 8); + dict_init2(&flash_text_CSMSettings.static_members, &memberinfo_type, 8); + dict_put(&flash_text_CSMSettings.members, &flash_text_CSMSettings_fontSize, &flash_text_CSMSettings_fontSize); + dict_put(&flash_text_CSMSettings.members, &flash_text_CSMSettings_outsideCutoff, &flash_text_CSMSettings_outsideCutoff); + dict_put(&flash_text_CSMSettings.members, &flash_text_CSMSettings_insideCutoff, &flash_text_CSMSettings_insideCutoff); + dict_put(d, &_RangeError, &_RangeError); + dict_init2(&_RangeError.members, &memberinfo_type, 8); + dict_init2(&_RangeError.static_members, &memberinfo_type, 8); + dict_put(&_RangeError.static_members, &_RangeError_length, &_RangeError_length); + dict_put(d, &_Number, &_Number); + dict_init2(&_Number.members, &memberinfo_type, 8); + dict_init2(&_Number.static_members, &memberinfo_type, 8); + dict_put(&_Number.members, &_Number_valueOf, &_Number_valueOf); + dict_put(&_Number.members, &_Number_toString, &_Number_toString); + dict_put(&_Number.members, &_Number_toExponential, &_Number_toExponential); + dict_put(&_Number.members, &_Number_toFixed, &_Number_toFixed); + dict_put(&_Number.members, &_Number_toPrecision, &_Number_toPrecision); + dict_put(&_Number.static_members, &_Number_MAX_VALUE, &_Number_MAX_VALUE); + dict_put(&_Number.static_members, &_Number_length, &_Number_length); + dict_put(&_Number.static_members, &_Number_MIN_VALUE, &_Number_MIN_VALUE); + dict_put(&_Number.static_members, &_Number_NaN, &_Number_NaN); + dict_put(&_Number.static_members, &_Number_POSITIVE_INFINITY, &_Number_POSITIVE_INFINITY); + dict_put(&_Number.static_members, &_Number_NEGATIVE_INFINITY, &_Number_NEGATIVE_INFINITY); + dict_put(d, &flash_display_Graphics, &flash_display_Graphics); + dict_init2(&flash_display_Graphics.members, &memberinfo_type, 63); + dict_init2(&flash_display_Graphics.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawPath, &flash_display_Graphics_drawPath); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawEllipse, &flash_display_Graphics_drawEllipse); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawRoundRectComplex, &flash_display_Graphics_drawRoundRectComplex); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_moveTo, &flash_display_Graphics_moveTo); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineShaderStyle, &flash_display_Graphics_lineShaderStyle); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginFill, &flash_display_Graphics_beginFill); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginGradientFill, &flash_display_Graphics_beginGradientFill); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawGraphicsData, &flash_display_Graphics_drawGraphicsData); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineGradientStyle, &flash_display_Graphics_lineGradientStyle); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawRoundRect, &flash_display_Graphics_drawRoundRect); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginBitmapFill, &flash_display_Graphics_beginBitmapFill); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineStyle, &flash_display_Graphics_lineStyle); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineTo, &flash_display_Graphics_lineTo); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_endFill, &flash_display_Graphics_endFill); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_copyFrom, &flash_display_Graphics_copyFrom); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineBitmapStyle, &flash_display_Graphics_lineBitmapStyle); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_curveTo, &flash_display_Graphics_curveTo); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_clear, &flash_display_Graphics_clear); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawCircle, &flash_display_Graphics_drawCircle); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginShaderFill, &flash_display_Graphics_beginShaderFill); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawTriangles, &flash_display_Graphics_drawTriangles); + dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawRect, &flash_display_Graphics_drawRect); + dict_put(d, &_SyntaxError, &_SyntaxError); + dict_init2(&_SyntaxError.members, &memberinfo_type, 8); + dict_init2(&_SyntaxError.static_members, &memberinfo_type, 8); + dict_put(&_SyntaxError.static_members, &_SyntaxError_length, &_SyntaxError_length); + dict_put(d, &flash_sampler_NewObjectSample, &flash_sampler_NewObjectSample); + dict_init2(&flash_sampler_NewObjectSample.members, &memberinfo_type, 8); + dict_init2(&flash_sampler_NewObjectSample.static_members, &memberinfo_type, 8); + dict_put(&flash_sampler_NewObjectSample.members, &flash_sampler_NewObjectSample_type, &flash_sampler_NewObjectSample_type); + dict_put(&flash_sampler_NewObjectSample.members, &flash_sampler_NewObjectSample_object, &flash_sampler_NewObjectSample_object); + dict_put(&flash_sampler_NewObjectSample.members, &flash_sampler_NewObjectSample_id, &flash_sampler_NewObjectSample_id); + dict_put(d, &flash_net_FileFilter, &flash_net_FileFilter); + dict_init2(&flash_net_FileFilter.members, &memberinfo_type, 8); + dict_init2(&flash_net_FileFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_net_FileFilter.members, &flash_net_FileFilter_extension, &flash_net_FileFilter_extension); + dict_put(&flash_net_FileFilter.members, &flash_net_FileFilter_description, &flash_net_FileFilter_description); + dict_put(&flash_net_FileFilter.members, &flash_net_FileFilter_macType, &flash_net_FileFilter_macType); + dict_put(d, &flash_display_BitmapDataChannel, &flash_display_BitmapDataChannel); + dict_init2(&flash_display_BitmapDataChannel.members, &memberinfo_type, 8); + dict_init2(&flash_display_BitmapDataChannel.static_members, &memberinfo_type, 8); + dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_BLUE, &flash_display_BitmapDataChannel_BLUE); + dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_GREEN, &flash_display_BitmapDataChannel_GREEN); + dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_ALPHA, &flash_display_BitmapDataChannel_ALPHA); + dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_RED, &flash_display_BitmapDataChannel_RED); + dict_put(d, &flash_utils_clearInterval, &flash_utils_clearInterval); + dict_put(d, &flash_text_engine_ContentElement, &flash_text_engine_ContentElement); + dict_init2(&flash_text_engine_ContentElement.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_ContentElement.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_eventMirror, &flash_text_engine_ContentElement_eventMirror); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_groupElement, &flash_text_engine_ContentElement_groupElement); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_textRotation, &flash_text_engine_ContentElement_textRotation); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_text, &flash_text_engine_ContentElement_text); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_userData, &flash_text_engine_ContentElement_userData); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_elementFormat, &flash_text_engine_ContentElement_elementFormat); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_textBlock, &flash_text_engine_ContentElement_textBlock); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_rawText, &flash_text_engine_ContentElement_rawText); + dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_textBlockBeginIndex, &flash_text_engine_ContentElement_textBlockBeginIndex); + dict_put(&flash_text_engine_ContentElement.static_members, &flash_text_engine_ContentElement_GRAPHIC_ELEMENT, &flash_text_engine_ContentElement_GRAPHIC_ELEMENT); + dict_put(d, &flash_utils_Endian, &flash_utils_Endian); + dict_init2(&flash_utils_Endian.members, &memberinfo_type, 8); + dict_init2(&flash_utils_Endian.static_members, &memberinfo_type, 8); + dict_put(&flash_utils_Endian.static_members, &flash_utils_Endian_LITTLE_ENDIAN, &flash_utils_Endian_LITTLE_ENDIAN); + dict_put(&flash_utils_Endian.static_members, &flash_utils_Endian_BIG_ENDIAN, &flash_utils_Endian_BIG_ENDIAN); + dict_put(d, &flash_net_navigateToURL, &flash_net_navigateToURL); + dict_put(d, &flash_events_ProgressEvent, &flash_events_ProgressEvent); + dict_init2(&flash_events_ProgressEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_ProgressEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_bytesLoaded, &flash_events_ProgressEvent_bytesLoaded); + dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_toString, &flash_events_ProgressEvent_toString); + dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_bytesTotal, &flash_events_ProgressEvent_bytesTotal); + dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_clone, &flash_events_ProgressEvent_clone); + dict_put(&flash_events_ProgressEvent.static_members, &flash_events_ProgressEvent_PROGRESS, &flash_events_ProgressEvent_PROGRESS); + dict_put(&flash_events_ProgressEvent.static_members, &flash_events_ProgressEvent_SOCKET_DATA, &flash_events_ProgressEvent_SOCKET_DATA); + dict_put(d, &flash_media_Sound, &flash_media_Sound); + dict_init2(&flash_media_Sound.members, &memberinfo_type, 15); + dict_init2(&flash_media_Sound.static_members, &memberinfo_type, 8); + dict_put(&flash_media_Sound.members, &flash_media_Sound_extract, &flash_media_Sound_extract); + dict_put(&flash_media_Sound.members, &flash_media_Sound_bytesLoaded, &flash_media_Sound_bytesLoaded); + dict_put(&flash_media_Sound.members, &flash_media_Sound_id3, &flash_media_Sound_id3); + dict_put(&flash_media_Sound.members, &flash_media_Sound_play, &flash_media_Sound_play); + dict_put(&flash_media_Sound.members, &flash_media_Sound_url, &flash_media_Sound_url); + dict_put(&flash_media_Sound.members, &flash_media_Sound_isBuffering, &flash_media_Sound_isBuffering); + dict_put(&flash_media_Sound.members, &flash_media_Sound_load, &flash_media_Sound_load); + dict_put(&flash_media_Sound.members, &flash_media_Sound_bytesTotal, &flash_media_Sound_bytesTotal); + dict_put(&flash_media_Sound.members, &flash_media_Sound_length, &flash_media_Sound_length); + dict_put(&flash_media_Sound.members, &flash_media_Sound_close, &flash_media_Sound_close); + dict_put(d, &flash_text_TextExtent, &flash_text_TextExtent); + dict_init2(&flash_text_TextExtent.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextExtent.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_descent, &flash_text_TextExtent_descent); + dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_width, &flash_text_TextExtent_width); + dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_ascent, &flash_text_TextExtent_ascent); + dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_textFieldHeight, &flash_text_TextExtent_textFieldHeight); + dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_textFieldWidth, &flash_text_TextExtent_textFieldWidth); + dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_height, &flash_text_TextExtent_height); + dict_put(d, &flash_text_FontStyle, &flash_text_FontStyle); + dict_init2(&flash_text_FontStyle.members, &memberinfo_type, 8); + dict_init2(&flash_text_FontStyle.static_members, &memberinfo_type, 8); + dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_REGULAR, &flash_text_FontStyle_REGULAR); + dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_BOLD, &flash_text_FontStyle_BOLD); + dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_BOLD_ITALIC, &flash_text_FontStyle_BOLD_ITALIC); + dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_ITALIC, &flash_text_FontStyle_ITALIC); + dict_put(d, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLineMirrorRegion); + dict_init2(&flash_text_engine_TextLineMirrorRegion.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextLineMirrorRegion.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_mirror, &flash_text_engine_TextLineMirrorRegion_mirror); + dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_previousRegion, &flash_text_engine_TextLineMirrorRegion_previousRegion); + dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_bounds, &flash_text_engine_TextLineMirrorRegion_bounds); + dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_nextRegion, &flash_text_engine_TextLineMirrorRegion_nextRegion); + dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_element, &flash_text_engine_TextLineMirrorRegion_element); + dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_textLine, &flash_text_engine_TextLineMirrorRegion_textLine); + dict_put(d, &flash_geom_Vector3D, &flash_geom_Vector3D); + dict_init2(&flash_geom_Vector3D.members, &memberinfo_type, 31); + dict_init2(&flash_geom_Vector3D.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_subtract, &flash_geom_Vector3D_subtract); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_scaleBy, &flash_geom_Vector3D_scaleBy); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_decrementBy, &flash_geom_Vector3D_decrementBy); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_equals, &flash_geom_Vector3D_equals); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_normalize, &flash_geom_Vector3D_normalize); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_dotProduct, &flash_geom_Vector3D_dotProduct); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_negate, &flash_geom_Vector3D_negate); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_toString, &flash_geom_Vector3D_toString); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_lengthSquared, &flash_geom_Vector3D_lengthSquared); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_x, &flash_geom_Vector3D_x); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_incrementBy, &flash_geom_Vector3D_incrementBy); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_w, &flash_geom_Vector3D_w); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_z, &flash_geom_Vector3D_z); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_add, &flash_geom_Vector3D_add); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_project, &flash_geom_Vector3D_project); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_crossProduct, &flash_geom_Vector3D_crossProduct); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_nearEquals, &flash_geom_Vector3D_nearEquals); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_clone, &flash_geom_Vector3D_clone); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_y, &flash_geom_Vector3D_y); + dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_length, &flash_geom_Vector3D_length); + dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_distance, &flash_geom_Vector3D_distance); + dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_Z_AXIS, &flash_geom_Vector3D_Z_AXIS); + dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_X_AXIS, &flash_geom_Vector3D_X_AXIS); + dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_angleBetween, &flash_geom_Vector3D_angleBetween); + dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_Y_AXIS, &flash_geom_Vector3D_Y_AXIS); + dict_put(d, &flash_desktop_ClipboardTransferMode, &flash_desktop_ClipboardTransferMode); + dict_init2(&flash_desktop_ClipboardTransferMode.members, &memberinfo_type, 8); + dict_init2(&flash_desktop_ClipboardTransferMode.static_members, &memberinfo_type, 8); + dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_CLONE_ONLY, &flash_desktop_ClipboardTransferMode_CLONE_ONLY); + dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_ORIGINAL_PREFERRED, &flash_desktop_ClipboardTransferMode_ORIGINAL_PREFERRED); + dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_CLONE_PREFERRED, &flash_desktop_ClipboardTransferMode_CLONE_PREFERRED); + dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_ORIGINAL_ONLY, &flash_desktop_ClipboardTransferMode_ORIGINAL_ONLY); + dict_put(d, &flash_display_SpreadMethod, &flash_display_SpreadMethod); + dict_init2(&flash_display_SpreadMethod.members, &memberinfo_type, 8); + dict_init2(&flash_display_SpreadMethod.static_members, &memberinfo_type, 8); + dict_put(&flash_display_SpreadMethod.static_members, &flash_display_SpreadMethod_REFLECT, &flash_display_SpreadMethod_REFLECT); + dict_put(&flash_display_SpreadMethod.static_members, &flash_display_SpreadMethod_REPEAT, &flash_display_SpreadMethod_REPEAT); + dict_put(&flash_display_SpreadMethod.static_members, &flash_display_SpreadMethod_PAD, &flash_display_SpreadMethod_PAD); + dict_put(d, &flash_system_SecurityPanel, &flash_system_SecurityPanel); + dict_init2(&flash_system_SecurityPanel.members, &memberinfo_type, 8); + dict_init2(&flash_system_SecurityPanel.static_members, &memberinfo_type, 8); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_LOCAL_STORAGE, &flash_system_SecurityPanel_LOCAL_STORAGE); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_CAMERA, &flash_system_SecurityPanel_CAMERA); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_DEFAULT, &flash_system_SecurityPanel_DEFAULT); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_SETTINGS_MANAGER, &flash_system_SecurityPanel_SETTINGS_MANAGER); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_PRIVACY, &flash_system_SecurityPanel_PRIVACY); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_MICROPHONE, &flash_system_SecurityPanel_MICROPHONE); + dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_DISPLAY, &flash_system_SecurityPanel_DISPLAY); + dict_put(d, &flash_events_HTTPStatusEvent, &flash_events_HTTPStatusEvent); + dict_init2(&flash_events_HTTPStatusEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_HTTPStatusEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_HTTPStatusEvent.members, &flash_events_HTTPStatusEvent_toString, &flash_events_HTTPStatusEvent_toString); + dict_put(&flash_events_HTTPStatusEvent.members, &flash_events_HTTPStatusEvent_clone, &flash_events_HTTPStatusEvent_clone); + dict_put(&flash_events_HTTPStatusEvent.members, &flash_events_HTTPStatusEvent_status, &flash_events_HTTPStatusEvent_status); + dict_put(&flash_events_HTTPStatusEvent.static_members, &flash_events_HTTPStatusEvent_HTTP_STATUS, &flash_events_HTTPStatusEvent_HTTP_STATUS); + dict_put(d, &flash_net_NetStreamPlayOptions, &flash_net_NetStreamPlayOptions); + dict_init2(&flash_net_NetStreamPlayOptions.members, &memberinfo_type, 8); + dict_init2(&flash_net_NetStreamPlayOptions.static_members, &memberinfo_type, 8); + dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_len, &flash_net_NetStreamPlayOptions_len); + dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_streamName, &flash_net_NetStreamPlayOptions_streamName); + dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_start, &flash_net_NetStreamPlayOptions_start); + dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_oldStreamName, &flash_net_NetStreamPlayOptions_oldStreamName); + dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_transition, &flash_net_NetStreamPlayOptions_transition); + dict_put(d, &flash_net_Responder, &flash_net_Responder); + dict_init2(&flash_net_Responder.members, &memberinfo_type, 8); + dict_init2(&flash_net_Responder.static_members, &memberinfo_type, 8); + dict_put(d, &flash_net_XMLSocket, &flash_net_XMLSocket); + dict_init2(&flash_net_XMLSocket.members, &memberinfo_type, 8); + dict_init2(&flash_net_XMLSocket.static_members, &memberinfo_type, 8); + dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_close, &flash_net_XMLSocket_close); + dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_connect, &flash_net_XMLSocket_connect); + dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_send, &flash_net_XMLSocket_send); + dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_connected, &flash_net_XMLSocket_connected); + dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_timeout, &flash_net_XMLSocket_timeout); + dict_put(d, &flash_filters_ConvolutionFilter, &flash_filters_ConvolutionFilter); + dict_init2(&flash_filters_ConvolutionFilter.members, &memberinfo_type, 15); + dict_init2(&flash_filters_ConvolutionFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_alpha, &flash_filters_ConvolutionFilter_alpha); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_matrixX, &flash_filters_ConvolutionFilter_matrixX); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_matrix, &flash_filters_ConvolutionFilter_matrix); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_bias, &flash_filters_ConvolutionFilter_bias); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_color, &flash_filters_ConvolutionFilter_color); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_preserveAlpha, &flash_filters_ConvolutionFilter_preserveAlpha); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_divisor, &flash_filters_ConvolutionFilter_divisor); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_clone, &flash_filters_ConvolutionFilter_clone); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_clamp, &flash_filters_ConvolutionFilter_clamp); + dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_matrixY, &flash_filters_ConvolutionFilter_matrixY); + dict_put(d, &flash_text_engine_ElementFormat, &flash_text_engine_ElementFormat); + dict_init2(&flash_text_engine_ElementFormat.members, &memberinfo_type, 31); + dict_init2(&flash_text_engine_ElementFormat.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_getFontMetrics, &flash_text_engine_ElementFormat_getFontMetrics); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_digitCase, &flash_text_engine_ElementFormat_digitCase); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_breakOpportunity, &flash_text_engine_ElementFormat_breakOpportunity); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_ligatureLevel, &flash_text_engine_ElementFormat_ligatureLevel); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_dominantBaseline, &flash_text_engine_ElementFormat_dominantBaseline); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_alignmentBaseline, &flash_text_engine_ElementFormat_alignmentBaseline); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_color, &flash_text_engine_ElementFormat_color); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_digitWidth, &flash_text_engine_ElementFormat_digitWidth); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_kerning, &flash_text_engine_ElementFormat_kerning); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_fontSize, &flash_text_engine_ElementFormat_fontSize); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_fontDescription, &flash_text_engine_ElementFormat_fontDescription); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_baselineShift, &flash_text_engine_ElementFormat_baselineShift); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_locale, &flash_text_engine_ElementFormat_locale); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_typographicCase, &flash_text_engine_ElementFormat_typographicCase); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_trackingLeft, &flash_text_engine_ElementFormat_trackingLeft); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_locked, &flash_text_engine_ElementFormat_locked); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_clone, &flash_text_engine_ElementFormat_clone); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_alpha, &flash_text_engine_ElementFormat_alpha); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_textRotation, &flash_text_engine_ElementFormat_textRotation); + dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_trackingRight, &flash_text_engine_ElementFormat_trackingRight); + dict_put(d, &flash_display_GraphicsGradientFill, &flash_display_GraphicsGradientFill); + dict_init2(&flash_display_GraphicsGradientFill.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsGradientFill.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_interpolationMethod, &flash_display_GraphicsGradientFill_interpolationMethod); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_focalPointRatio, &flash_display_GraphicsGradientFill_focalPointRatio); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_colors, &flash_display_GraphicsGradientFill_colors); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_matrix, &flash_display_GraphicsGradientFill_matrix); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_type, &flash_display_GraphicsGradientFill_type); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_ratios, &flash_display_GraphicsGradientFill_ratios); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_spreadMethod, &flash_display_GraphicsGradientFill_spreadMethod); + dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_alphas, &flash_display_GraphicsGradientFill_alphas); + dict_put(d, &flash_display_FrameLabel, &flash_display_FrameLabel); + dict_init2(&flash_display_FrameLabel.members, &memberinfo_type, 8); + dict_init2(&flash_display_FrameLabel.static_members, &memberinfo_type, 8); + dict_put(&flash_display_FrameLabel.members, &flash_display_FrameLabel_frame, &flash_display_FrameLabel_frame); + dict_put(&flash_display_FrameLabel.members, &flash_display_FrameLabel_name, &flash_display_FrameLabel_name); + dict_put(d, &flash_media_SoundTransform, &flash_media_SoundTransform); + dict_init2(&flash_media_SoundTransform.members, &memberinfo_type, 8); + dict_init2(&flash_media_SoundTransform.static_members, &memberinfo_type, 8); + dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_pan, &flash_media_SoundTransform_pan); + dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_leftToRight, &flash_media_SoundTransform_leftToRight); + dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_rightToLeft, &flash_media_SoundTransform_rightToLeft); + dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_volume, &flash_media_SoundTransform_volume); + dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_leftToLeft, &flash_media_SoundTransform_leftToLeft); + dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_rightToRight, &flash_media_SoundTransform_rightToRight); + dict_put(d, &_AS3, &_AS3); + dict_put(d, &flash_net_LocalConnection, &flash_net_LocalConnection); + dict_init2(&flash_net_LocalConnection.members, &memberinfo_type, 15); + dict_init2(&flash_net_LocalConnection.static_members, &memberinfo_type, 8); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_client, &flash_net_LocalConnection_client); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_allowDomain, &flash_net_LocalConnection_allowDomain); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_connect, &flash_net_LocalConnection_connect); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_domain, &flash_net_LocalConnection_domain); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_allowInsecureDomain, &flash_net_LocalConnection_allowInsecureDomain); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_send, &flash_net_LocalConnection_send); + dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_close, &flash_net_LocalConnection_close); + dict_put(d, &flash_display_ShaderParameterType, &flash_display_ShaderParameterType); + dict_init2(&flash_display_ShaderParameterType.members, &memberinfo_type, 8); + dict_init2(&flash_display_ShaderParameterType.static_members, &memberinfo_type, 31); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT, &flash_display_ShaderParameterType_FLOAT); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL, &flash_display_ShaderParameterType_BOOL); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT2, &flash_display_ShaderParameterType_FLOAT2); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_MATRIX2X2, &flash_display_ShaderParameterType_MATRIX2X2); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT, &flash_display_ShaderParameterType_INT); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT4, &flash_display_ShaderParameterType_INT4); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_MATRIX4X4, &flash_display_ShaderParameterType_MATRIX4X4); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT3, &flash_display_ShaderParameterType_FLOAT3); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL2, &flash_display_ShaderParameterType_BOOL2); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT3, &flash_display_ShaderParameterType_INT3); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL3, &flash_display_ShaderParameterType_BOOL3); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL4, &flash_display_ShaderParameterType_BOOL4); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT4, &flash_display_ShaderParameterType_FLOAT4); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT2, &flash_display_ShaderParameterType_INT2); + dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_MATRIX3X3, &flash_display_ShaderParameterType_MATRIX3X3); + dict_put(d, &flash_events_IMEEvent, &flash_events_IMEEvent); + dict_init2(&flash_events_IMEEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_IMEEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_IMEEvent.members, &flash_events_IMEEvent_toString, &flash_events_IMEEvent_toString); + dict_put(&flash_events_IMEEvent.members, &flash_events_IMEEvent_clone, &flash_events_IMEEvent_clone); + dict_put(&flash_events_IMEEvent.static_members, &flash_events_IMEEvent_IME_COMPOSITION, &flash_events_IMEEvent_IME_COMPOSITION); + dict_put(d, &flash_text_TextFormatDisplay, &flash_text_TextFormatDisplay); + dict_init2(&flash_text_TextFormatDisplay.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextFormatDisplay.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextFormatDisplay.static_members, &flash_text_TextFormatDisplay_INLINE, &flash_text_TextFormatDisplay_INLINE); + dict_put(&flash_text_TextFormatDisplay.static_members, &flash_text_TextFormatDisplay_BLOCK, &flash_text_TextFormatDisplay_BLOCK); + dict_put(d, &flash_profiler_profile, &flash_profiler_profile); + dict_put(d, &flash_display_AVM1Movie, &flash_display_AVM1Movie); + dict_init2(&flash_display_AVM1Movie.members, &memberinfo_type, 8); + dict_init2(&flash_display_AVM1Movie.static_members, &memberinfo_type, 8); + dict_put(&flash_display_AVM1Movie.members, &flash_display_AVM1Movie_call, &flash_display_AVM1Movie_call); + dict_put(&flash_display_AVM1Movie.members, &flash_display_AVM1Movie_addCallback, &flash_display_AVM1Movie_addCallback); + dict_put(d, &flash_events_ContextMenuEvent, &flash_events_ContextMenuEvent); + dict_init2(&flash_events_ContextMenuEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_ContextMenuEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_mouseTarget, &flash_events_ContextMenuEvent_mouseTarget); + dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_isMouseTargetInaccessible, &flash_events_ContextMenuEvent_isMouseTargetInaccessible); + dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_toString, &flash_events_ContextMenuEvent_toString); + dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_contextMenuOwner, &flash_events_ContextMenuEvent_contextMenuOwner); + dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_clone, &flash_events_ContextMenuEvent_clone); + dict_put(&flash_events_ContextMenuEvent.static_members, &flash_events_ContextMenuEvent_MENU_SELECT, &flash_events_ContextMenuEvent_MENU_SELECT); + dict_put(&flash_events_ContextMenuEvent.static_members, &flash_events_ContextMenuEvent_MENU_ITEM_SELECT, &flash_events_ContextMenuEvent_MENU_ITEM_SELECT); + dict_put(d, &flash_events_EventPhase, &flash_events_EventPhase); + dict_init2(&flash_events_EventPhase.members, &memberinfo_type, 8); + dict_init2(&flash_events_EventPhase.static_members, &memberinfo_type, 8); + dict_put(&flash_events_EventPhase.static_members, &flash_events_EventPhase_BUBBLING_PHASE, &flash_events_EventPhase_BUBBLING_PHASE); + dict_put(&flash_events_EventPhase.static_members, &flash_events_EventPhase_CAPTURING_PHASE, &flash_events_EventPhase_CAPTURING_PHASE); + dict_put(&flash_events_EventPhase.static_members, &flash_events_EventPhase_AT_TARGET, &flash_events_EventPhase_AT_TARGET); + dict_put(d, &flash_display_JointStyle, &flash_display_JointStyle); + dict_init2(&flash_display_JointStyle.members, &memberinfo_type, 8); + dict_init2(&flash_display_JointStyle.static_members, &memberinfo_type, 8); + dict_put(&flash_display_JointStyle.static_members, &flash_display_JointStyle_ROUND, &flash_display_JointStyle_ROUND); + dict_put(&flash_display_JointStyle.static_members, &flash_display_JointStyle_MITER, &flash_display_JointStyle_MITER); + dict_put(&flash_display_JointStyle.static_members, &flash_display_JointStyle_BEVEL, &flash_display_JointStyle_BEVEL); + dict_put(d, &flash_utils_Dictionary, &flash_utils_Dictionary); + dict_init2(&flash_utils_Dictionary.members, &memberinfo_type, 8); + dict_init2(&flash_utils_Dictionary.static_members, &memberinfo_type, 8); + dict_put(d, &flash_display_GraphicsPathCommand, &flash_display_GraphicsPathCommand); + dict_init2(&flash_display_GraphicsPathCommand.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsPathCommand.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_NO_OP, &flash_display_GraphicsPathCommand_NO_OP); + dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_MOVE_TO, &flash_display_GraphicsPathCommand_MOVE_TO); + dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_WIDE_MOVE_TO, &flash_display_GraphicsPathCommand_WIDE_MOVE_TO); + dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_CURVE_TO, &flash_display_GraphicsPathCommand_CURVE_TO); + dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_LINE_TO, &flash_display_GraphicsPathCommand_LINE_TO); + dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_WIDE_LINE_TO, &flash_display_GraphicsPathCommand_WIDE_LINE_TO); + dict_put(d, &flash_filters_BevelFilter, &flash_filters_BevelFilter); + dict_init2(&flash_filters_BevelFilter.members, &memberinfo_type, 31); + dict_init2(&flash_filters_BevelFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_type, &flash_filters_BevelFilter_type); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_highlightColor, &flash_filters_BevelFilter_highlightColor); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_knockout, &flash_filters_BevelFilter_knockout); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_distance, &flash_filters_BevelFilter_distance); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_strength, &flash_filters_BevelFilter_strength); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_highlightAlpha, &flash_filters_BevelFilter_highlightAlpha); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_blurY, &flash_filters_BevelFilter_blurY); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_shadowColor, &flash_filters_BevelFilter_shadowColor); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_angle, &flash_filters_BevelFilter_angle); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_blurX, &flash_filters_BevelFilter_blurX); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_shadowAlpha, &flash_filters_BevelFilter_shadowAlpha); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_quality, &flash_filters_BevelFilter_quality); + dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_clone, &flash_filters_BevelFilter_clone); + dict_put(d, &flash_utils_getTimer, &flash_utils_getTimer); + dict_put(d, &flash_display_Loader, &flash_display_Loader); + dict_init2(&flash_display_Loader.members, &memberinfo_type, 15); + dict_init2(&flash_display_Loader.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Loader.members, &flash_display_Loader_content, &flash_display_Loader_content); + dict_put(&flash_display_Loader.members, &flash_display_Loader_unloadAndStop, &flash_display_Loader_unloadAndStop); + dict_put(&flash_display_Loader.members, &flash_display_Loader_unload, &flash_display_Loader_unload); + dict_put(&flash_display_Loader.members, &flash_display_Loader_removeChildAt, &flash_display_Loader_removeChildAt); + dict_put(&flash_display_Loader.members, &flash_display_Loader_addChildAt, &flash_display_Loader_addChildAt); + dict_put(&flash_display_Loader.members, &flash_display_Loader_contentLoaderInfo, &flash_display_Loader_contentLoaderInfo); + dict_put(&flash_display_Loader.members, &flash_display_Loader_loadBytes, &flash_display_Loader_loadBytes); + dict_put(&flash_display_Loader.members, &flash_display_Loader_removeChild, &flash_display_Loader_removeChild); + dict_put(&flash_display_Loader.members, &flash_display_Loader_load, &flash_display_Loader_load); + dict_put(&flash_display_Loader.members, &flash_display_Loader_addChild, &flash_display_Loader_addChild); + dict_put(&flash_display_Loader.members, &flash_display_Loader_close, &flash_display_Loader_close); + dict_put(&flash_display_Loader.members, &flash_display_Loader_setChildIndex, &flash_display_Loader_setChildIndex); + dict_put(d, &flash_display_GraphicsBitmapFill, &flash_display_GraphicsBitmapFill); + dict_init2(&flash_display_GraphicsBitmapFill.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsBitmapFill.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_smooth, &flash_display_GraphicsBitmapFill_smooth); + dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_repeat, &flash_display_GraphicsBitmapFill_repeat); + dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_bitmapData, &flash_display_GraphicsBitmapFill_bitmapData); + dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_matrix, &flash_display_GraphicsBitmapFill_matrix); + dict_put(d, &_undefined, &_undefined); + dict_put(d, &flash_display_SimpleButton, &flash_display_SimpleButton); + dict_init2(&flash_display_SimpleButton.members, &memberinfo_type, 8); + dict_init2(&flash_display_SimpleButton.static_members, &memberinfo_type, 8); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_overState, &flash_display_SimpleButton_overState); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_downState, &flash_display_SimpleButton_downState); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_enabled, &flash_display_SimpleButton_enabled); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_trackAsMenu, &flash_display_SimpleButton_trackAsMenu); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_soundTransform, &flash_display_SimpleButton_soundTransform); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_useHandCursor, &flash_display_SimpleButton_useHandCursor); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_upState, &flash_display_SimpleButton_upState); + dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_hitTestState, &flash_display_SimpleButton_hitTestState); + dict_put(d, &flash_text_engine_TabAlignment, &flash_text_engine_TabAlignment); + dict_init2(&flash_text_engine_TabAlignment.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TabAlignment.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_END, &flash_text_engine_TabAlignment_END); + dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_CENTER, &flash_text_engine_TabAlignment_CENTER); + dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_START, &flash_text_engine_TabAlignment_START); + dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_DECIMAL, &flash_text_engine_TabAlignment_DECIMAL); + dict_put(d, &flash_text_engine_FontWeight, &flash_text_engine_FontWeight); + dict_init2(&flash_text_engine_FontWeight.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_FontWeight.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_FontWeight.static_members, &flash_text_engine_FontWeight_NORMAL, &flash_text_engine_FontWeight_NORMAL); + dict_put(&flash_text_engine_FontWeight.static_members, &flash_text_engine_FontWeight_BOLD, &flash_text_engine_FontWeight_BOLD); + dict_put(d, &flash_utils_describeType, &flash_utils_describeType); + dict_put(d, &flash_display_PixelSnapping, &flash_display_PixelSnapping); + dict_init2(&flash_display_PixelSnapping.members, &memberinfo_type, 8); + dict_init2(&flash_display_PixelSnapping.static_members, &memberinfo_type, 8); + dict_put(&flash_display_PixelSnapping.static_members, &flash_display_PixelSnapping_AUTO, &flash_display_PixelSnapping_AUTO); + dict_put(&flash_display_PixelSnapping.static_members, &flash_display_PixelSnapping_NEVER, &flash_display_PixelSnapping_NEVER); + dict_put(&flash_display_PixelSnapping.static_members, &flash_display_PixelSnapping_ALWAYS, &flash_display_PixelSnapping_ALWAYS); + dict_put(d, &flash_events_FocusEvent, &flash_events_FocusEvent); + dict_init2(&flash_events_FocusEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_FocusEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_keyCode, &flash_events_FocusEvent_keyCode); + dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_toString, &flash_events_FocusEvent_toString); + dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_isRelatedObjectInaccessible, &flash_events_FocusEvent_isRelatedObjectInaccessible); + dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_clone, &flash_events_FocusEvent_clone); + dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_shiftKey, &flash_events_FocusEvent_shiftKey); + dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_relatedObject, &flash_events_FocusEvent_relatedObject); + dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_FOCUS_IN, &flash_events_FocusEvent_FOCUS_IN); + dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_FOCUS_OUT, &flash_events_FocusEvent_FOCUS_OUT); + dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_KEY_FOCUS_CHANGE, &flash_events_FocusEvent_KEY_FOCUS_CHANGE); + dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_MOUSE_FOCUS_CHANGE, &flash_events_FocusEvent_MOUSE_FOCUS_CHANGE); + dict_put(d, &flash_errors_MemoryError, &flash_errors_MemoryError); + dict_init2(&flash_errors_MemoryError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_MemoryError.static_members, &memberinfo_type, 8); + dict_put(d, &flash_events_NetFilterEvent, &flash_events_NetFilterEvent); + dict_init2(&flash_events_NetFilterEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_NetFilterEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_header, &flash_events_NetFilterEvent_header); + dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_toString, &flash_events_NetFilterEvent_toString); + dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_clone, &flash_events_NetFilterEvent_clone); + dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_data, &flash_events_NetFilterEvent_data); + dict_put(d, &_decodeURI, &_decodeURI); + dict_put(d, &_encodeURI, &_encodeURI); + dict_put(d, &flash_text_engine_TextBaseline, &flash_text_engine_TextBaseline); + dict_init2(&flash_text_engine_TextBaseline.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextBaseline.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_ROMAN, &flash_text_engine_TextBaseline_ROMAN); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_DESCENT, &flash_text_engine_TextBaseline_DESCENT); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_IDEOGRAPHIC_CENTER, &flash_text_engine_TextBaseline_IDEOGRAPHIC_CENTER); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_USE_DOMINANT_BASELINE, &flash_text_engine_TextBaseline_USE_DOMINANT_BASELINE); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_IDEOGRAPHIC_BOTTOM, &flash_text_engine_TextBaseline_IDEOGRAPHIC_BOTTOM); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_ASCENT, &flash_text_engine_TextBaseline_ASCENT); + dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_IDEOGRAPHIC_TOP, &flash_text_engine_TextBaseline_IDEOGRAPHIC_TOP); + dict_put(d, &flash_external_ExternalInterface, &flash_external_ExternalInterface); + dict_init2(&flash_external_ExternalInterface.members, &memberinfo_type, 8); + dict_init2(&flash_external_ExternalInterface.static_members, &memberinfo_type, 8); + dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_call, &flash_external_ExternalInterface_call); + dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_available, &flash_external_ExternalInterface_available); + dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_addCallback, &flash_external_ExternalInterface_addCallback); + dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_marshallExceptions, &flash_external_ExternalInterface_marshallExceptions); + dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_objectID, &flash_external_ExternalInterface_objectID); + dict_put(d, &_EvalError, &_EvalError); + dict_init2(&_EvalError.members, &memberinfo_type, 8); + dict_init2(&_EvalError.static_members, &memberinfo_type, 8); + dict_put(&_EvalError.static_members, &_EvalError_length, &_EvalError_length); + dict_put(d, &flash_text_engine_DigitCase, &flash_text_engine_DigitCase); + dict_init2(&flash_text_engine_DigitCase.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_DigitCase.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_DigitCase.static_members, &flash_text_engine_DigitCase_OLD_STYLE, &flash_text_engine_DigitCase_OLD_STYLE); + dict_put(&flash_text_engine_DigitCase.static_members, &flash_text_engine_DigitCase_DEFAULT, &flash_text_engine_DigitCase_DEFAULT); + dict_put(&flash_text_engine_DigitCase.static_members, &flash_text_engine_DigitCase_LINING, &flash_text_engine_DigitCase_LINING); + dict_put(d, &flash_text_TextFormatAlign, &flash_text_TextFormatAlign); + dict_init2(&flash_text_TextFormatAlign.members, &memberinfo_type, 8); + dict_init2(&flash_text_TextFormatAlign.static_members, &memberinfo_type, 8); + dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_LEFT, &flash_text_TextFormatAlign_LEFT); + dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_RIGHT, &flash_text_TextFormatAlign_RIGHT); + dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_CENTER, &flash_text_TextFormatAlign_CENTER); + dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_JUSTIFY, &flash_text_TextFormatAlign_JUSTIFY); + dict_put(d, &flash_errors_ScriptTimeoutError, &flash_errors_ScriptTimeoutError); + dict_init2(&flash_errors_ScriptTimeoutError.members, &memberinfo_type, 8); + dict_init2(&flash_errors_ScriptTimeoutError.static_members, &memberinfo_type, 8); + dict_put(d, &_uint, &_uint); + dict_init2(&_uint.members, &memberinfo_type, 8); + dict_init2(&_uint.static_members, &memberinfo_type, 8); + dict_put(&_uint.members, &_uint_valueOf, &_uint_valueOf); + dict_put(&_uint.members, &_uint_toString, &_uint_toString); + dict_put(&_uint.members, &_uint_toExponential, &_uint_toExponential); + dict_put(&_uint.members, &_uint_toFixed, &_uint_toFixed); + dict_put(&_uint.members, &_uint_toPrecision, &_uint_toPrecision); + dict_put(&_uint.static_members, &_uint_MAX_VALUE, &_uint_MAX_VALUE); + dict_put(&_uint.static_members, &_uint_length, &_uint_length); + dict_put(&_uint.static_members, &_uint_MIN_VALUE, &_uint_MIN_VALUE); + dict_put(d, &flash_debugger_enterDebugger, &flash_debugger_enterDebugger); + dict_put(d, &flash_geom_Orientation3D, &flash_geom_Orientation3D); + dict_init2(&flash_geom_Orientation3D.members, &memberinfo_type, 8); + dict_init2(&flash_geom_Orientation3D.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Orientation3D.static_members, &flash_geom_Orientation3D_QUATERNION, &flash_geom_Orientation3D_QUATERNION); + dict_put(&flash_geom_Orientation3D.static_members, &flash_geom_Orientation3D_EULER_ANGLES, &flash_geom_Orientation3D_EULER_ANGLES); + dict_put(&flash_geom_Orientation3D.static_members, &flash_geom_Orientation3D_AXIS_ANGLE, &flash_geom_Orientation3D_AXIS_ANGLE); + dict_put(d, &flash_text_engine_CFFHinting, &flash_text_engine_CFFHinting); + dict_init2(&flash_text_engine_CFFHinting.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_CFFHinting.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_CFFHinting.static_members, &flash_text_engine_CFFHinting_HORIZONTAL_STEM, &flash_text_engine_CFFHinting_HORIZONTAL_STEM); + dict_put(&flash_text_engine_CFFHinting.static_members, &flash_text_engine_CFFHinting_NONE, &flash_text_engine_CFFHinting_NONE); + dict_put(d, &flash_text_FontType, &flash_text_FontType); + dict_init2(&flash_text_FontType.members, &memberinfo_type, 8); + dict_init2(&flash_text_FontType.static_members, &memberinfo_type, 8); + dict_put(&flash_text_FontType.static_members, &flash_text_FontType_EMBEDDED, &flash_text_FontType_EMBEDDED); + dict_put(&flash_text_FontType.static_members, &flash_text_FontType_DEVICE, &flash_text_FontType_DEVICE); + dict_put(&flash_text_FontType.static_members, &flash_text_FontType_EMBEDDED_CFF, &flash_text_FontType_EMBEDDED_CFF); + dict_put(d, &flash_filters_ShaderFilter, &flash_filters_ShaderFilter); + dict_init2(&flash_filters_ShaderFilter.members, &memberinfo_type, 8); + dict_init2(&flash_filters_ShaderFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_bottomExtension, &flash_filters_ShaderFilter_bottomExtension); + dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_shader, &flash_filters_ShaderFilter_shader); + dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_rightExtension, &flash_filters_ShaderFilter_rightExtension); + dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_leftExtension, &flash_filters_ShaderFilter_leftExtension); + dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_topExtension, &flash_filters_ShaderFilter_topExtension); + dict_put(d, &flash_display_GraphicsPath, &flash_display_GraphicsPath); + dict_init2(&flash_display_GraphicsPath.members, &memberinfo_type, 8); + dict_init2(&flash_display_GraphicsPath.static_members, &memberinfo_type, 8); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_wideMoveTo, &flash_display_GraphicsPath_wideMoveTo); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_winding, &flash_display_GraphicsPath_winding); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_moveTo, &flash_display_GraphicsPath_moveTo); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_wideLineTo, &flash_display_GraphicsPath_wideLineTo); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_commands, &flash_display_GraphicsPath_commands); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_curveTo, &flash_display_GraphicsPath_curveTo); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_lineTo, &flash_display_GraphicsPath_lineTo); + dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_data, &flash_display_GraphicsPath_data); + dict_put(d, &flash_system_ApplicationDomain, &flash_system_ApplicationDomain); + dict_init2(&flash_system_ApplicationDomain.members, &memberinfo_type, 8); + dict_init2(&flash_system_ApplicationDomain.static_members, &memberinfo_type, 8); + dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_hasDefinition, &flash_system_ApplicationDomain_hasDefinition); + dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_getDefinition, &flash_system_ApplicationDomain_getDefinition); + dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_parentDomain, &flash_system_ApplicationDomain_parentDomain); + dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_domainMemory, &flash_system_ApplicationDomain_domainMemory); + dict_put(&flash_system_ApplicationDomain.static_members, &flash_system_ApplicationDomain_MIN_DOMAIN_MEMORY_LENGTH, &flash_system_ApplicationDomain_MIN_DOMAIN_MEMORY_LENGTH); + dict_put(&flash_system_ApplicationDomain.static_members, &flash_system_ApplicationDomain_currentDomain, &flash_system_ApplicationDomain_currentDomain); + dict_put(d, &flash_events_KeyboardEvent, &flash_events_KeyboardEvent); + dict_init2(&flash_events_KeyboardEvent.members, &memberinfo_type, 15); + dict_init2(&flash_events_KeyboardEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_shiftKey, &flash_events_KeyboardEvent_shiftKey); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_keyCode, &flash_events_KeyboardEvent_keyCode); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_keyLocation, &flash_events_KeyboardEvent_keyLocation); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_updateAfterEvent, &flash_events_KeyboardEvent_updateAfterEvent); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_toString, &flash_events_KeyboardEvent_toString); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_altKey, &flash_events_KeyboardEvent_altKey); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_ctrlKey, &flash_events_KeyboardEvent_ctrlKey); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_clone, &flash_events_KeyboardEvent_clone); + dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_charCode, &flash_events_KeyboardEvent_charCode); + dict_put(&flash_events_KeyboardEvent.static_members, &flash_events_KeyboardEvent_KEY_DOWN, &flash_events_KeyboardEvent_KEY_DOWN); + dict_put(&flash_events_KeyboardEvent.static_members, &flash_events_KeyboardEvent_KEY_UP, &flash_events_KeyboardEvent_KEY_UP); + dict_put(d, &adobe_utils_ProductManager, &adobe_utils_ProductManager); + dict_init2(&adobe_utils_ProductManager.members, &memberinfo_type, 8); + dict_init2(&adobe_utils_ProductManager.static_members, &memberinfo_type, 8); + dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_running, &adobe_utils_ProductManager_running); + dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_download, &adobe_utils_ProductManager_download); + dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_installedVersion, &adobe_utils_ProductManager_installedVersion); + dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_installed, &adobe_utils_ProductManager_installed); + dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_launch, &adobe_utils_ProductManager_launch); + dict_put(d, &flash_events_Event, &flash_events_Event); + dict_init2(&flash_events_Event.members, &memberinfo_type, 31); + dict_init2(&flash_events_Event.static_members, &memberinfo_type, 63); + dict_put(&flash_events_Event.members, &flash_events_Event_type, &flash_events_Event_type); + dict_put(&flash_events_Event.members, &flash_events_Event_cancelable, &flash_events_Event_cancelable); + dict_put(&flash_events_Event.members, &flash_events_Event_isDefaultPrevented, &flash_events_Event_isDefaultPrevented); + dict_put(&flash_events_Event.members, &flash_events_Event_target, &flash_events_Event_target); + dict_put(&flash_events_Event.members, &flash_events_Event_eventPhase, &flash_events_Event_eventPhase); + dict_put(&flash_events_Event.members, &flash_events_Event_currentTarget, &flash_events_Event_currentTarget); + dict_put(&flash_events_Event.members, &flash_events_Event_toString, &flash_events_Event_toString); + dict_put(&flash_events_Event.members, &flash_events_Event_stopImmediatePropagation, &flash_events_Event_stopImmediatePropagation); + dict_put(&flash_events_Event.members, &flash_events_Event_bubbles, &flash_events_Event_bubbles); + dict_put(&flash_events_Event.members, &flash_events_Event_stopPropagation, &flash_events_Event_stopPropagation); + dict_put(&flash_events_Event.members, &flash_events_Event_clone, &flash_events_Event_clone); + dict_put(&flash_events_Event.members, &flash_events_Event_preventDefault, &flash_events_Event_preventDefault); + dict_put(&flash_events_Event.members, &flash_events_Event_formatToString, &flash_events_Event_formatToString); + dict_put(&flash_events_Event.static_members, &flash_events_Event_REMOVED_FROM_STAGE, &flash_events_Event_REMOVED_FROM_STAGE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_CLEAR, &flash_events_Event_CLEAR); + dict_put(&flash_events_Event.static_members, &flash_events_Event_OPEN, &flash_events_Event_OPEN); + dict_put(&flash_events_Event.static_members, &flash_events_Event_TAB_CHILDREN_CHANGE, &flash_events_Event_TAB_CHILDREN_CHANGE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_DEACTIVATE, &flash_events_Event_DEACTIVATE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_ACTIVATE, &flash_events_Event_ACTIVATE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_SOUND_COMPLETE, &flash_events_Event_SOUND_COMPLETE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_CANCEL, &flash_events_Event_CANCEL); + dict_put(&flash_events_Event.static_members, &flash_events_Event_REMOVED, &flash_events_Event_REMOVED); + dict_put(&flash_events_Event.static_members, &flash_events_Event_INIT, &flash_events_Event_INIT); + dict_put(&flash_events_Event.static_members, &flash_events_Event_FRAME_CONSTRUCTED, &flash_events_Event_FRAME_CONSTRUCTED); + dict_put(&flash_events_Event.static_members, &flash_events_Event_SCROLL, &flash_events_Event_SCROLL); + dict_put(&flash_events_Event.static_members, &flash_events_Event_TAB_INDEX_CHANGE, &flash_events_Event_TAB_INDEX_CHANGE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_CHANGE, &flash_events_Event_CHANGE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_ADDED_TO_STAGE, &flash_events_Event_ADDED_TO_STAGE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_UNLOAD, &flash_events_Event_UNLOAD); + dict_put(&flash_events_Event.static_members, &flash_events_Event_SELECT, &flash_events_Event_SELECT); + dict_put(&flash_events_Event.static_members, &flash_events_Event_CONNECT, &flash_events_Event_CONNECT); + dict_put(&flash_events_Event.static_members, &flash_events_Event_CUT, &flash_events_Event_CUT); + dict_put(&flash_events_Event.static_members, &flash_events_Event_PASTE, &flash_events_Event_PASTE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_ADDED, &flash_events_Event_ADDED); + dict_put(&flash_events_Event.static_members, &flash_events_Event_ID3, &flash_events_Event_ID3); + dict_put(&flash_events_Event.static_members, &flash_events_Event_ENTER_FRAME, &flash_events_Event_ENTER_FRAME); + dict_put(&flash_events_Event.static_members, &flash_events_Event_RENDER, &flash_events_Event_RENDER); + dict_put(&flash_events_Event.static_members, &flash_events_Event_EXIT_FRAME, &flash_events_Event_EXIT_FRAME); + dict_put(&flash_events_Event.static_members, &flash_events_Event_RESIZE, &flash_events_Event_RESIZE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_FULLSCREEN, &flash_events_Event_FULLSCREEN); + dict_put(&flash_events_Event.static_members, &flash_events_Event_MOUSE_LEAVE, &flash_events_Event_MOUSE_LEAVE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_CLOSE, &flash_events_Event_CLOSE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_SELECT_ALL, &flash_events_Event_SELECT_ALL); + dict_put(&flash_events_Event.static_members, &flash_events_Event_TAB_ENABLED_CHANGE, &flash_events_Event_TAB_ENABLED_CHANGE); + dict_put(&flash_events_Event.static_members, &flash_events_Event_COPY, &flash_events_Event_COPY); + dict_put(&flash_events_Event.static_members, &flash_events_Event_COMPLETE, &flash_events_Event_COMPLETE); + dict_put(d, &flash_desktop_ClipboardFormats, &flash_desktop_ClipboardFormats); + dict_init2(&flash_desktop_ClipboardFormats.members, &memberinfo_type, 8); + dict_init2(&flash_desktop_ClipboardFormats.static_members, &memberinfo_type, 15); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_TEXT_FORMAT, &flash_desktop_ClipboardFormats_TEXT_FORMAT); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_BITMAP_FORMAT, &flash_desktop_ClipboardFormats_BITMAP_FORMAT); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_FLASH_PREFIX, &flash_desktop_ClipboardFormats_FLASH_PREFIX); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_HTML_FORMAT, &flash_desktop_ClipboardFormats_HTML_FORMAT); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_REFERENCE_PREFIX, &flash_desktop_ClipboardFormats_REFERENCE_PREFIX); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_AIR_PREFIX, &flash_desktop_ClipboardFormats_AIR_PREFIX); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_SERIALIZATION_PREFIX, &flash_desktop_ClipboardFormats_SERIALIZATION_PREFIX); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_RICH_TEXT_FORMAT, &flash_desktop_ClipboardFormats_RICH_TEXT_FORMAT); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_URL_FORMAT, &flash_desktop_ClipboardFormats_URL_FORMAT); + dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_FILE_LIST_FORMAT, &flash_desktop_ClipboardFormats_FILE_LIST_FORMAT); + dict_put(d, &flash_display_MovieClip, &flash_display_MovieClip); + dict_init2(&flash_display_MovieClip.members, &memberinfo_type, 31); + dict_init2(&flash_display_MovieClip.static_members, &memberinfo_type, 8); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_prevScene, &flash_display_MovieClip_prevScene); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_gotoAndPlay, &flash_display_MovieClip_gotoAndPlay); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentLabels, &flash_display_MovieClip_currentLabels); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_nextFrame, &flash_display_MovieClip_nextFrame); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentScene, &flash_display_MovieClip_currentScene); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_enabled, &flash_display_MovieClip_enabled); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentFrameLabel, &flash_display_MovieClip_currentFrameLabel); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_play, &flash_display_MovieClip_play); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_framesLoaded, &flash_display_MovieClip_framesLoaded); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_scenes, &flash_display_MovieClip_scenes); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_addFrameScript, &flash_display_MovieClip_addFrameScript); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentLabel, &flash_display_MovieClip_currentLabel); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_prevFrame, &flash_display_MovieClip_prevFrame); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_gotoAndStop, &flash_display_MovieClip_gotoAndStop); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentFrame, &flash_display_MovieClip_currentFrame); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_nextScene, &flash_display_MovieClip_nextScene); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_totalFrames, &flash_display_MovieClip_totalFrames); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_trackAsMenu, &flash_display_MovieClip_trackAsMenu); + dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_stop, &flash_display_MovieClip_stop); + dict_put(d, &flash_display_BitmapData, &flash_display_BitmapData); + dict_init2(&flash_display_BitmapData.members, &memberinfo_type, 63); + dict_init2(&flash_display_BitmapData.static_members, &memberinfo_type, 8); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getPixel32, &flash_display_BitmapData_getPixel32); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_draw, &flash_display_BitmapData_draw); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setPixels, &flash_display_BitmapData_setPixels); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_copyPixels, &flash_display_BitmapData_copyPixels); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_histogram, &flash_display_BitmapData_histogram); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_scroll, &flash_display_BitmapData_scroll); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_transparent, &flash_display_BitmapData_transparent); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_noise, &flash_display_BitmapData_noise); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_threshold, &flash_display_BitmapData_threshold); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_paletteMap, &flash_display_BitmapData_paletteMap); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_perlinNoise, &flash_display_BitmapData_perlinNoise); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_hitTest, &flash_display_BitmapData_hitTest); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getPixel, &flash_display_BitmapData_getPixel); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_unlock, &flash_display_BitmapData_unlock); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_height, &flash_display_BitmapData_height); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_copyChannel, &flash_display_BitmapData_copyChannel); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_width, &flash_display_BitmapData_width); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_clone, &flash_display_BitmapData_clone); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_colorTransform, &flash_display_BitmapData_colorTransform); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_generateFilterRect, &flash_display_BitmapData_generateFilterRect); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_compare, &flash_display_BitmapData_compare); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_fillRect, &flash_display_BitmapData_fillRect); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setVector, &flash_display_BitmapData_setVector); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_floodFill, &flash_display_BitmapData_floodFill); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_pixelDissolve, &flash_display_BitmapData_pixelDissolve); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setPixel, &flash_display_BitmapData_setPixel); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setPixel32, &flash_display_BitmapData_setPixel32); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_lock, &flash_display_BitmapData_lock); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getVector, &flash_display_BitmapData_getVector); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getColorBoundsRect, &flash_display_BitmapData_getColorBoundsRect); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getPixels, &flash_display_BitmapData_getPixels); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_merge, &flash_display_BitmapData_merge); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_rect, &flash_display_BitmapData_rect); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_applyFilter, &flash_display_BitmapData_applyFilter); + dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_dispose, &flash_display_BitmapData_dispose); + dict_put(d, &flash_text_engine_LigatureLevel, &flash_text_engine_LigatureLevel); + dict_init2(&flash_text_engine_LigatureLevel.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_LigatureLevel.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_UNCOMMON, &flash_text_engine_LigatureLevel_UNCOMMON); + dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_COMMON, &flash_text_engine_LigatureLevel_COMMON); + dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_EXOTIC, &flash_text_engine_LigatureLevel_EXOTIC); + dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_MINIMUM, &flash_text_engine_LigatureLevel_MINIMUM); + dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_NONE, &flash_text_engine_LigatureLevel_NONE); + dict_put(d, &_Infinity, &_Infinity); + dict_put(d, &flash_text_engine_FontDescription, &flash_text_engine_FontDescription); + dict_init2(&flash_text_engine_FontDescription.members, &memberinfo_type, 15); + dict_init2(&flash_text_engine_FontDescription.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_renderingMode, &flash_text_engine_FontDescription_renderingMode); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_cffHinting, &flash_text_engine_FontDescription_cffHinting); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontPosture, &flash_text_engine_FontDescription_fontPosture); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontName, &flash_text_engine_FontDescription_fontName); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontLookup, &flash_text_engine_FontDescription_fontLookup); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_locked, &flash_text_engine_FontDescription_locked); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontWeight, &flash_text_engine_FontDescription_fontWeight); + dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_clone, &flash_text_engine_FontDescription_clone); + dict_put(&flash_text_engine_FontDescription.static_members, &flash_text_engine_FontDescription_isFontCompatible, &flash_text_engine_FontDescription_isFontCompatible); + dict_put(d, &flash_text_engine_TextElement, &flash_text_engine_TextElement); + dict_init2(&flash_text_engine_TextElement.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextElement.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextElement.members, &flash_text_engine_TextElement_replaceText, &flash_text_engine_TextElement_replaceText); + dict_put(d, &flash_display_SWFVersion, &flash_display_SWFVersion); + dict_init2(&flash_display_SWFVersion.members, &memberinfo_type, 8); + dict_init2(&flash_display_SWFVersion.static_members, &memberinfo_type, 8); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH4, &flash_display_SWFVersion_FLASH4); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH7, &flash_display_SWFVersion_FLASH7); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH8, &flash_display_SWFVersion_FLASH8); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH3, &flash_display_SWFVersion_FLASH3); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH6, &flash_display_SWFVersion_FLASH6); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH9, &flash_display_SWFVersion_FLASH9); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH2, &flash_display_SWFVersion_FLASH2); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH5, &flash_display_SWFVersion_FLASH5); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH10, &flash_display_SWFVersion_FLASH10); + dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH1, &flash_display_SWFVersion_FLASH1); + dict_put(d, &flash_net_URLLoader, &flash_net_URLLoader); + dict_init2(&flash_net_URLLoader.members, &memberinfo_type, 8); + dict_init2(&flash_net_URLLoader.static_members, &memberinfo_type, 8); + dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_close, &flash_net_URLLoader_close); + dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_bytesLoaded, &flash_net_URLLoader_bytesLoaded); + dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_load, &flash_net_URLLoader_load); + dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_bytesTotal, &flash_net_URLLoader_bytesTotal); + dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_dataFormat, &flash_net_URLLoader_dataFormat); + dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_data, &flash_net_URLLoader_data); + dict_put(d, &flash_geom_Matrix, &flash_geom_Matrix); + dict_init2(&flash_geom_Matrix.members, &memberinfo_type, 31); + dict_init2(&flash_geom_Matrix.static_members, &memberinfo_type, 8); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_b, &flash_geom_Matrix_b); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_deltaTransformPoint, &flash_geom_Matrix_deltaTransformPoint); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_identity, &flash_geom_Matrix_identity); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_ty, &flash_geom_Matrix_ty); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_translate, &flash_geom_Matrix_translate); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_concat, &flash_geom_Matrix_concat); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_c, &flash_geom_Matrix_c); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_a, &flash_geom_Matrix_a); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_scale, &flash_geom_Matrix_scale); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_d, &flash_geom_Matrix_d); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_transformPoint, &flash_geom_Matrix_transformPoint); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_rotate, &flash_geom_Matrix_rotate); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_createGradientBox, &flash_geom_Matrix_createGradientBox); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_toString, &flash_geom_Matrix_toString); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_invert, &flash_geom_Matrix_invert); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_clone, &flash_geom_Matrix_clone); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_tx, &flash_geom_Matrix_tx); + dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_createBox, &flash_geom_Matrix_createBox); + dict_put(d, &flash_accessibility_Accessibility, &flash_accessibility_Accessibility); + dict_init2(&flash_accessibility_Accessibility.members, &memberinfo_type, 8); + dict_init2(&flash_accessibility_Accessibility.static_members, &memberinfo_type, 8); + dict_put(&flash_accessibility_Accessibility.static_members, &flash_accessibility_Accessibility_active, &flash_accessibility_Accessibility_active); + dict_put(&flash_accessibility_Accessibility.static_members, &flash_accessibility_Accessibility_updateProperties, &flash_accessibility_Accessibility_updateProperties); + dict_put(&flash_accessibility_Accessibility.static_members, &flash_accessibility_Accessibility_sendEvent, &flash_accessibility_Accessibility_sendEvent); + dict_put(d, &flash_net_sendToURL, &flash_net_sendToURL); + dict_put(d, &flash_filters_GlowFilter, &flash_filters_GlowFilter); + dict_init2(&flash_filters_GlowFilter.members, &memberinfo_type, 8); + dict_init2(&flash_filters_GlowFilter.static_members, &memberinfo_type, 8); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_blurY, &flash_filters_GlowFilter_blurY); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_strength, &flash_filters_GlowFilter_strength); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_inner, &flash_filters_GlowFilter_inner); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_color, &flash_filters_GlowFilter_color); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_clone, &flash_filters_GlowFilter_clone); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_quality, &flash_filters_GlowFilter_quality); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_knockout, &flash_filters_GlowFilter_knockout); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_alpha, &flash_filters_GlowFilter_alpha); + dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_blurX, &flash_filters_GlowFilter_blurX); + dict_put(d, &flash_events_FullScreenEvent, &flash_events_FullScreenEvent); + dict_init2(&flash_events_FullScreenEvent.members, &memberinfo_type, 8); + dict_init2(&flash_events_FullScreenEvent.static_members, &memberinfo_type, 8); + dict_put(&flash_events_FullScreenEvent.members, &flash_events_FullScreenEvent_toString, &flash_events_FullScreenEvent_toString); + dict_put(&flash_events_FullScreenEvent.members, &flash_events_FullScreenEvent_clone, &flash_events_FullScreenEvent_clone); + dict_put(&flash_events_FullScreenEvent.members, &flash_events_FullScreenEvent_fullScreen, &flash_events_FullScreenEvent_fullScreen); + dict_put(&flash_events_FullScreenEvent.static_members, &flash_events_FullScreenEvent_FULL_SCREEN, &flash_events_FullScreenEvent_FULL_SCREEN); + dict_put(d, &flash_display_StageDisplayState, &flash_display_StageDisplayState); + dict_init2(&flash_display_StageDisplayState.members, &memberinfo_type, 8); + dict_init2(&flash_display_StageDisplayState.static_members, &memberinfo_type, 8); + dict_put(&flash_display_StageDisplayState.static_members, &flash_display_StageDisplayState_NORMAL, &flash_display_StageDisplayState_NORMAL); + dict_put(&flash_display_StageDisplayState.static_members, &flash_display_StageDisplayState_FULL_SCREEN, &flash_display_StageDisplayState_FULL_SCREEN); + dict_put(d, &flash_text_engine_TextJustifier, &flash_text_engine_TextJustifier); + dict_init2(&flash_text_engine_TextJustifier.members, &memberinfo_type, 8); + dict_init2(&flash_text_engine_TextJustifier.static_members, &memberinfo_type, 8); + dict_put(&flash_text_engine_TextJustifier.members, &flash_text_engine_TextJustifier_lineJustification, &flash_text_engine_TextJustifier_lineJustification); + dict_put(&flash_text_engine_TextJustifier.members, &flash_text_engine_TextJustifier_locale, &flash_text_engine_TextJustifier_locale); + dict_put(&flash_text_engine_TextJustifier.members, &flash_text_engine_TextJustifier_clone, &flash_text_engine_TextJustifier_clone); + dict_put(&flash_text_engine_TextJustifier.static_members, &flash_text_engine_TextJustifier_getJustifierForLocale, &flash_text_engine_TextJustifier_getJustifierForLocale); + dict_put(d, &flash_display_StageAlign, &flash_display_StageAlign); + dict_init2(&flash_display_StageAlign.members, &memberinfo_type, 8); + dict_init2(&flash_display_StageAlign.static_members, &memberinfo_type, 15); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_RIGHT, &flash_display_StageAlign_RIGHT); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_BOTTOM, &flash_display_StageAlign_BOTTOM); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_BOTTOM_LEFT, &flash_display_StageAlign_BOTTOM_LEFT); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_TOP_RIGHT, &flash_display_StageAlign_TOP_RIGHT); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_TOP, &flash_display_StageAlign_TOP); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_LEFT, &flash_display_StageAlign_LEFT); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_BOTTOM_RIGHT, &flash_display_StageAlign_BOTTOM_RIGHT); + dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_TOP_LEFT, &flash_display_StageAlign_TOP_LEFT); + dict_put(d, &_NaN, &_NaN); + dict_put(d, &_ReferenceError, &_ReferenceError); + dict_init2(&_ReferenceError.members, &memberinfo_type, 8); + dict_init2(&_ReferenceError.static_members, &memberinfo_type, 8); + dict_put(&_ReferenceError.static_members, &_ReferenceError_length, &_ReferenceError_length); + dict_put(d, &flash_display_Shape, &flash_display_Shape); + dict_init2(&flash_display_Shape.members, &memberinfo_type, 8); + dict_init2(&flash_display_Shape.static_members, &memberinfo_type, 8); + dict_put(&flash_display_Shape.members, &flash_display_Shape_graphics, &flash_display_Shape_graphics); + _NaN_constant.f = __builtin_nan(""); + _Infinity_constant.f = __builtin_inf(); + return d; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h new file mode 100644 index 000000000..f407c7cdf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h @@ -0,0 +1,33 @@ +/* builtin.h + + Flash AVM2 ABC Actionscript standard library + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __builtin_h__ +#define __builtin_h__ + +#include "../q.h" +#include "../types.h" +#include "registry.h" + +dict_t* builtin_getclasses(); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/code.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/code.c new file mode 100644 index 000000000..fb4bf5327 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/code.c @@ -0,0 +1,1289 @@ +/* code.c + + Routines for handling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include "code.h" +#include "pool.h" + +#define OP_REGISTER 1 +#define OP_STACK_ARGS 2 +#define OP_STACK_NS 4 +#define OP_SET_DXNS 8 +#define OP_RETURN 16 +#define OP_THROW 32 +#define OP_BRANCH 64 +#define OP_JUMP 128 +#define OP_LABEL 256 +#define OP_LOOKUPSWITCH 512 +#define OP_NEED_ACTIVATION 1024 +#define OP_STACK_ARGS2 2048 +#define OP_INTERNAL 32768 + +/* 2 = u30 index into multiname + m = u30 index into method + n = u30 number of params + i = u30 index into method info + b = byte + c = u30 index into class + N = u30 index into namespaces + s = string (u30 index into strings) + S = switch + u = u30 + r = register +*/ + +opcode_t opcodes[]={ +{0xa0, "add", "", -2, 1, 0, 0}, +{0xc5, "add_i", "", -2, 1, 0, 0}, +{0x86, "astype", "2", -1, 1, 0, 0}, +{0x87, "astypelate", "", -2, 1, 0, 0}, +{0xA8, "bitand", "", -2, 1, 0, 0}, +{0x97, "bitnot", "", -1, 1, 0, 0}, +{0xa9, "bitor", "", -2, 1, 0, 0}, +{0xaa, "bitxor", "", -2, 1, 0, 0}, +{0x41, "call", "n", -2, 1, 0, OP_STACK_ARGS}, +{0x43, "callmethod", "mn", -1, 1, 0, OP_STACK_ARGS}, +{0x4c, "callproplex", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, +{0x46, "callproperty", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, +{0x4f, "callpropvoid", "2n", -1, 0, 0, OP_STACK_ARGS|OP_STACK_NS}, +{0x44, "callstatic", "in", -1, 1, 0, OP_STACK_ARGS}, +{0x45, "callsuper", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, +{0x4e, "callsupervoid", "2n", -1, 0, 0, OP_STACK_ARGS|OP_STACK_NS}, +{0x78, "checkfilter", "", -1, 1, 0, 0}, +{0x80, "coerce", "2", -1, 1, 0, 0}, +{0x82, "coerce_a", "", -1, 1, 0, 0}, +{0x85, "coerce_s", "", -1, 1, 0, 0}, +{0x42, "construct", "n", -1, 1, 0, OP_STACK_ARGS}, +{0x4a, "constructprop", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, +{0x49, "constructsuper", "n", -1, 0, 0, OP_STACK_ARGS}, +{0x76, "convert_b", "", -1, 1, 0, 0}, +{0x73, "convert_i", "", -1, 1, 0, 0}, +{0x75, "convert_d", "", -1, 1, 0, 0}, +{0x77, "convert_o", "", -1, 1, 0, 0}, +{0x74, "convert_u", "", -1, 1, 0, 0}, +{0x70, "convert_s", "", -1, 1, 0, 0}, +{0xef, "debug", "D", 0, 0, 0, 0}, +{0xf1, "debugfile", "s", 0, 0, 0, 0}, +{0xf0, "debugline", "u", 0, 0, 0, 0}, +{0x94, "declocal", "r", 0, 0, 0, OP_REGISTER}, +{0xc3, "declocal_i", "r", 0, 0, 0, OP_REGISTER}, +{0x93, "decrement", "", -1, 1, 0, 0}, +{0xc1, "decrement_i", "", -1, 1, 0, 0}, +{0x6a, "deleteproperty", "2", -1, 1, 0, OP_STACK_NS}, +{0xa3, "divide", "", -2, 1, 0, 0}, +{0x2a, "dup", "", -1, 2, 0, 0}, +{0x06, "dxns", "s", 0, 0, 0, OP_SET_DXNS}, +{0x07, "dxnslate", "", -1, 0, 0, OP_SET_DXNS}, +{0xab, "equals", "", -2, 1, 0, 0}, +{0x72, "esc_xattr", "", -1, 1, 0, 0}, +{0x71, "esc_xelem", "", -1, 1, 0, 0}, +{0x5e, "findproperty", "2", 0, 1, 0, OP_STACK_NS}, +{0x5d, "findpropstrict", "2", 0, 1, 0, OP_STACK_NS}, +{0x59, "getdescendants", "2", -1, 1, 0, OP_STACK_NS}, +{0x64, "getglobalscope", "", 0, 1, 0, 0}, +{0x6e, "getglobalslot", "u", 0, 1, 0, 0}, +{0x60, "getlex", "2", 0, 1, 0, 0}, //multiname may not be runtime +{0x62, "getlocal", "r", 0, 1, 0, OP_REGISTER}, +{0xd0, "getlocal_0", "", 0, 1, 0, OP_REGISTER}, +{0xd1, "getlocal_1", "", 0, 1, 0, OP_REGISTER}, +{0xd2, "getlocal_2", "", 0, 1, 0, OP_REGISTER}, +{0xd3, "getlocal_3", "", 0, 1, 0, OP_REGISTER}, +{0x66, "getproperty", "2", -1, 1, 0, OP_STACK_NS}, +{0x65, "getscopeobject", "u", 0, 1, 0, 0}, // u = index into scope stack +{0x6c, "getslot", "u", -1, 1, 0, 0}, +{0x04, "getsuper", "2", -1, 1, 0, OP_STACK_NS}, +{0xaf, "greaterthan", "", -2, 1, 0, 0}, +{0xb0, "greaterequals", "", -2, 1, 0, 0}, +{0x1f, "hasnext", "", -2, 1, 0, 0}, +{0x32, "hasnext2", "rr", 0, 1, 0, OP_REGISTER}, +{0x13, "ifeq", "j", -2, 0, 0, OP_BRANCH}, +{0x12, "iffalse", "j", -1, 0, 0, OP_BRANCH}, +{0x18, "ifge", "j", -2, 0, 0, OP_BRANCH}, +{0x17, "ifgt", "j", -2, 0, 0, OP_BRANCH}, +{0x16, "ifle", "j", -2, 0, 0, OP_BRANCH}, +{0x15, "iflt", "j", -2, 0, 0, OP_BRANCH}, +{0x0f, "ifnge", "j", -2, 0, 0, OP_BRANCH}, +{0x0e, "ifngt", "j", -2, 0, 0, OP_BRANCH}, +{0x0d, "ifnle", "j", -2, 0, 0, OP_BRANCH}, +{0x0c, "ifnlt", "j", -2, 0, 0, OP_BRANCH}, +{0x14, "ifne", "j", -2, 0, 0, OP_BRANCH}, +{0x19, "ifstricteq", "j", -2, 0, 0, OP_BRANCH}, +{0x1a, "ifstrictne", "j", -2, 0, 0, OP_BRANCH}, +{0x11, "iftrue", "j", -1, 0, 0, OP_BRANCH}, +{0xb4, "in", "", -2, 1, 0, 0}, +{0x92, "inclocal", "r", 0, 0, 0, OP_REGISTER}, +{0xc2, "inclocal_i", "r", 0, 0, 0, OP_REGISTER}, +{0x91, "increment", "", -1, 1, 0, 0}, +{0xc0, "increment_i", "", -1, 1, 0, 0}, +{0x68, "initproperty", "2", -2, 0, 0, OP_STACK_NS}, +{0xb1, "instanceof", "", -2, 1, 0, 0}, +{0xb2, "istype", "2", -1, 1, 0, 0}, // may not be a runtime multiname +{0xb3, "istypelate", "", -2, 1, 0, 0}, +{0x10, "jump", "j", 0, 0, 0, OP_JUMP}, +{0x08, "kill", "r", 0, 0, 0, OP_REGISTER}, +{0x09, "label", "", 0, 0, 0, OP_LABEL}, +{0xae, "lessequals", "", -2, 1, 0, 0}, +{0xad, "lessthan", "", -2, 1, 0, 0}, +{0x1b, "lookupswitch", "S", -1, 0, 0, OP_LOOKUPSWITCH}, +{0xa5, "lshift", "", -2, 1, 0, 0}, +{0xa4, "modulo", "", -2, 1, 0, 0}, +{0xa2, "multiply", "", -2, 1, 0, 0}, +{0xc7, "multiply_i", "", -2, 1, 0, 0}, +{0x90, "negate", "", -1, 1, 0, 0}, +{0xc4, "negate_i", "", -1, 1, 0, 0}, +{0x57, "newactivation", "", 0, 1, 0, OP_NEED_ACTIVATION}, +{0x56, "newarray", "n", 0, 1, 0, OP_STACK_ARGS}, +{0x5a, "newcatch", "u", 0, 1, 0, 0}, //u = index into exception_info +{0x58, "newclass", "c", -1, 1, 0, 0}, //c = index into class_info +{0x40, "newfunction", "m", 0, 1, 0, 0}, //i = index into method_info +{0x55, "newobject", "n", 0, 1, 0, OP_STACK_ARGS2}, +{0x1e, "nextname", "", -2, 1, 0, 0}, +{0x23, "nextvalue", "", -2, 1, 0, 0}, +{0x02, "nop", "", 0, 0, 0, 0}, +{0x96, "not", "", -1, 1, 0 ,0}, +{0x29, "pop", "", -1, 0, 0, 0}, +{0x1d, "popscope", "", 0, 0,-1, 0}, +{0x24, "pushbyte", "b", 0, 1, 0, 0}, +{0x2f, "pushdouble", "f", 0, 1, 0, 0}, //index into floats +{0x27, "pushfalse", "", 0, 1, 0, 0}, +{0x2d, "pushint", "I", 0, 1, 0, 0}, //index into ints +{0x31, "pushnamespace", "N", 0, 1, 0, 0}, //index into namespace +{0x28, "pushnan", "", 0, 1, 0, 0}, +{0x20, "pushnull", "", 0, 1, 0, 0}, +{0x30, "pushscope", "", -1, 0, 1, 0}, +{0x25, "pushshort", "u", 0, 1, 0, 0}, +{0x2c, "pushstring", "s", 0, 1, 0, 0}, +{0x26, "pushtrue", "", 0, 1, 0, 0}, +{0x2e, "pushuint", "U", 0, 1, 0, 0}, //index into uints +{0x21, "pushundefined", "", 0, 1, 0, 0}, +{0x1c, "pushwith", "", -1, 0, 1, 0}, +{0x48, "returnvalue", "", -1, 0, 0, OP_RETURN}, +{0x47, "returnvoid", "", 0, 0, 0, OP_RETURN}, +{0xa6, "rshift", "", -2, 1, 0, 0}, +{0x63, "setlocal", "r", -1, 0, 0, OP_REGISTER}, +{0xd4, "setlocal_0", "", -1, 0, 0, OP_REGISTER}, +{0xd5, "setlocal_1", "", -1, 0, 0, OP_REGISTER}, +{0xd6, "setlocal_2", "", -1, 0, 0, OP_REGISTER}, +{0xd7, "setlocal_3", "", -1, 0, 0, OP_REGISTER}, +{0x6f, "setglobalslot", "u", -1, 0, 0, 0}, +{0x61, "setproperty", "2", -2, 0, 0, OP_STACK_NS}, +{0x6d, "setslot", "u", -2, 0, 0, 0}, +{0x05, "setsuper", "2", -2, 0, 0, OP_STACK_NS}, +{0xac, "strictequals", "", -2, 1, 0, 0}, +{0xa1, "subtract", "", -2, 1, 0, 0}, +{0xc6, "subtract_i", "", -2, 1, 0, 0}, +{0x2b, "swap", "", -2, 2, 0, 0}, +{0x03, "throw", "", -1, 0, 0, OP_THROW}, +{0x95, "typeof", "", -1, 1, 0, 0}, +{0xa7, "urshift", "", -2, 1, 0, 0}, + +/* opcodes not documented, but seen in the wild */ +{0x53, "applytype", "n", -1, 1, 0, OP_STACK_ARGS}, //seen in builtin.abc + +/* dummy instructions. Warning: these are not actually supported by flash */ +{0xfb, "__pushpackage__", "s", 0, 1, 0, OP_INTERNAL}, +{0xfc, "__rethrow__", "", 0, 0, 0, OP_THROW|OP_INTERNAL}, +{0xfd, "__fallthrough__", "s", 0, 0, 0, OP_INTERNAL}, +{0xfe, "__continue__", "s", 0, 0, 0, OP_RETURN|OP_INTERNAL}, +{0xff, "__break__", "s", 0, 0, 0, OP_RETURN|OP_INTERNAL}, +}; + +static opcode_t* op2op[256] = {0,0,0}; + +static inline opcode_t* opcode_get(U8 op) +{ + int t; + if(!op2op[0x02]) { + memset(op2op, 0, sizeof(op2op)); + for(t=0;tpos; + } + if(pos < 0 || + pos > len || + (pos!=len && !bytepos[pos])) { + /* flex likes to generate these. yuck. */ + if(c) { + opcode_t*op = opcode_get(c->opcode); + fprintf(stderr, "Warning: Invalid jump instruction \"%s\" from %d to %d (%d)\n", op->name, c->pos, pos, len); + } else { + fprintf(stderr, "Warning: Invalid jump to %d (%d)\n", pos, len); + } + return 0; + } else { + if(pos==len) { + //opcode_t*op = opcode_get(c->opcode); + //fprintf(stderr, "Warning: jump beyond end of code in instruction %s at position %d\n", op->name, c->pos); + return 0; + } else { + return bytepos[pos]; + } + } +} +code_t* code_atposition(codelookup_t*l, int pos) +{ + return pos2code(l->bytepos, 0, pos, l->len); +} + +void lookupswitch_print(lookupswitch_t*l) +{ + printf("default: %p\n", l->def); + code_list_t*t = l->targets; + while(t) { + printf("target: %p\n", t->code); + t = t->next; + } +} + +code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool, codelookup_t**codelookup) +{ + code_t*head=0; + code_t*code=0; + int start=tag->pos; + int end=tag->pos+len; + //printf("-->\n");fflush(stdout); + + code_t**bytepos = rfx_calloc(sizeof(code_t*)*len); + + while(tag->pospos-start; + U8 opcode = swf_GetU8(tag); + opcode_t*op = opcode_get(opcode); + if(!op) { + fprintf(stderr, "Can't parse opcode %02x\n", opcode); + continue; + } + //printf("%s\n", op->name);fflush(stdout); + NEW(code_t,c); + c->pos = codepos; + + bytepos[codepos] = c; + + if(!head) { + head = code = c; + } else { + code->next = c; + c->prev = code; + code = c; + } + + c->opcode = opcode; + + char*p = op->params; + int pos = 0; + while(*p) { + void*data = 0; + if(*p == 'n') { // number + data = (void*)(ptroff_t)swf_GetU30(tag); + } else if(*p == '2') { //multiname + data = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); + } else if(*p == 'N') { //namespace + data = namespace_clone(pool_lookup_namespace(pool, swf_GetU30(tag))); + } else if(*p == 'U') { //uint + data = (void*)(ptroff_t)pool_lookup_uint(pool, swf_GetU30(tag)); + } else if(*p == 'I') { //int + data = (void*)(ptroff_t)pool_lookup_int(pool, swf_GetU30(tag)); + } else if(*p == 'f') { //int + double*fp = malloc(sizeof(double)); + *fp = pool_lookup_float(pool, swf_GetU30(tag)); + data = fp; + } else if(*p == 'm') { //method + data = array_getvalue(file->methods, swf_GetU30(tag)); + } else if(*p == 'c') { //classinfo + data = array_getvalue(file->classes, swf_GetU30(tag)); + } else if(*p == 'i') { + data = array_getvalue(file->method_bodies, swf_GetU30(tag)); + } else if(*p == 'u') { // generic integer + data = (void*)(ptroff_t)swf_GetU30(tag); + } else if(*p == 'r') { // local register + data = (void*)(ptroff_t)swf_GetU30(tag); + } else if(*p == 'b') { // byte + data = (void*)(ptroff_t)swf_GetU8(tag); + } else if(*p == 'j') { // jump + int j = swf_GetS24(tag); + data = (void*)(ptroff_t)j; + } else if(*p == 's') { // string + string_t s = pool_lookup_string2(pool, swf_GetU30(tag)); + data = string_dup3(&s); + } else if(*p == 'D') { // debug + /*type, usually 1*/ + U8 type = swf_GetU8(tag); + if(type!=1) + fprintf(stderr, "Unknown debug type: %02x\n", type); + /*register name*/ + code->data[0] = strdup((char*)pool_lookup_string(pool, swf_GetU30(tag))); + /*register index*/ + code->data[1] = (void*)(ptroff_t)swf_GetU8(tag); + /*unused*/ + swf_GetU30(tag); + } else if(*p == 'S') { // switch statement + lookupswitch_t*l = malloc(sizeof(lookupswitch_t)); + l->def = (code_t*)(ptroff_t)swf_GetS24(tag); + l->targets = list_new(); + int num = swf_GetU30(tag)+1; + int t; + for(t=0;ttargets, (code_t*)(ptroff_t)swf_GetS24(tag)); + data = l; + } else { + printf("Can't parse opcode param type \"%c\" (for op %02x %s).\n", *p, code->opcode, op->name); + return 0; + } + code->data[pos++] = data; + p++; + } + } + +//#define DEBUG_BYTES +#ifdef DEBUG_BYTES + int t; + for(t=0;topcode); + if(op->flags & (OP_JUMP|OP_BRANCH)) { + printf("%50d) %02x %s %d\n", t, tag->data[start+t], op->name, c->data[0]); + } else { + printf("%50d) %02x %s\n", t, tag->data[start+t], op->name); + } + } else { + printf("%50d) %02x\n", t, tag->data[start+t]); + } + } + //printf("%05d) %02x\n", t, tag->data[start+t]); +#endif + + code_t*c = head; + while(c) { + opcode_t*op = opcode_get(c->opcode); + if(op->flags & (OP_JUMP|OP_BRANCH)) { + int j = ((int)(ptroff_t)c->data[0]); + c->branch = pos2code(bytepos,c,j+4,len); + } else if(op->flags & (OP_LOOKUPSWITCH)) { + lookupswitch_t*l = (lookupswitch_t*)c->data[0]; + int offset = 0; + l->def = pos2code(bytepos,c,(ptroff_t)l->def+offset,len); + code_list_t*t=l->targets; + while(t) { + t->code = pos2code(bytepos,c,(ptroff_t)t->code+offset,len); + t = t->next; + } + } + c = c->next; + } + + if(codelookup) { + (*codelookup) = malloc(sizeof(codelookup_t)); + (*codelookup)->bytepos = bytepos; + (*codelookup)->len = len; + } else { + free(bytepos); + } + + return head; +} + +void codelookup_free(codelookup_t*codelookup) +{ + free(codelookup->bytepos);codelookup->bytepos=0; + free(codelookup); +} + +void code_free(code_t*c) +{ + c = code_start(c); + while(c) { + code_t*next = c->next; + opcode_t*op = opcode_get(c->opcode); + char*p = op?op->params:""; + int pos=0; + while(*p) { + void*data = c->data[pos]; + if(*p == '2') { //multiname + multiname_destroy(data); + } else if(*p == 'N') { //namespace + namespace_destroy(data); + } else if(strchr("sDf", *p)) { + free(data); + } else if(strchr("S", *p)) { + lookupswitch_t*l = (lookupswitch_t*)data; + list_free(l->targets);l->targets=0; + free(l); + } + c->data[pos]=0; + p++;pos++; + } + memset(c, 0, sizeof(c)); + free(c); + c = next; + } +} + +static int opcode_write(TAG*tag, code_t*c, pool_t*pool, abc_file_t*file, int length) +{ + opcode_t*op = opcode_get(c->opcode); + char*p = op->params; + int pos = 0; + int len = 0; + + if(tag) + swf_SetU8(tag, c->opcode); + len++; + + if(op->flags & OP_INTERNAL) { + if(c->opcode == OPCODE___BREAK__ || + c->opcode == OPCODE___CONTINUE__) { + fprintf(stderr, "Unresolved %s\n", op->name); + } else { + fprintf(stderr, "Error: writing undefined internal opcode %s\n", op->name); + } + } + + while(*p) { + void*data = c->data[pos++]; + assert(pos<=2); + switch(*p) { + case 'n': { // number + len += swf_SetU30(tag, (ptroff_t)data); + break; + } + case '2': { //multiname + multiname_t*m = (multiname_t*)data; + len += swf_SetU30(tag, pool_register_multiname(pool, m)); + break; + } + case 'N': { //namespace + namespace_t*ns = (namespace_t*)data; + len += swf_SetU30(tag, pool_register_namespace(pool, ns)); + break; + } + case 'm': { //method + abc_method_t*m = (abc_method_t*)data; + len += swf_SetU30(tag, m->index); + break; + } + case 'c': { //classinfo + abc_class_t*cls = (abc_class_t*)data; + len += swf_SetU30(tag, cls->index); + break; + } + case 'i': { //methodbody + abc_method_body_t*m = (abc_method_body_t*)data; + len += swf_SetU30(tag, m->index); + break; + } + case 'I': { // int + len += swf_SetU30(tag, pool_register_int(pool, (ptroff_t)data)); + break; + } + case 'U': { // uint + len += swf_SetU30(tag, pool_register_uint(pool, (ptroff_t)data)); + break; + } + case 'f': { // float + len += swf_SetU30(tag, pool_register_float(pool, *(double*)data)); + break; + } + case 'u': { // integer + len += swf_SetU30(tag, (ptroff_t)data); + break; + } + case 'r': { // integer + len += swf_SetU30(tag, (ptroff_t)data); + break; + } + case 'b': { // byte + if(tag) + swf_SetU8(tag, (ptroff_t)data); + len++; + break; + } + case 'j': { // jump + int skip = length-c->pos-4; + if(c->branch) + skip = (c->branch->pos) - c->pos - 4; + len += swf_SetS24(tag, skip); + break; + } + case 's': { // string + int index = pool_register_string2(pool, (string_t*)data); + len += swf_SetU30(tag, index); + break; + } + case 'D': { // debug statement + if(tag) + swf_SetU8(tag, 1); + len++; + len+=swf_SetU30(tag, pool_register_string(pool,c->data[0])); + if(tag) + swf_SetU8(tag, (ptroff_t)c->data[1]); + len++; + len+=swf_SetU30(tag, 0); + break; + } + case 'S': { // switch statement + lookupswitch_t*l = (lookupswitch_t*)data; + int offset = 0; + len+=swf_SetS24(tag, l->def->pos-c->pos+offset); //default + code_list_t*t = l->targets; + if(list_length(t)) { + len+=swf_SetU30(tag, list_length(t)-1); //nr-1 + code_list_t*t = l->targets; + while(t) { + len+=swf_SetS24(tag, t->code->pos - c->pos+offset); + t = t->next; + } + } else { + len+=swf_SetU30(tag, 0); //nr-1 + len+=swf_SetS24(tag, l->def->pos-c->pos+offset); + } + break; + } + default: + printf("Can't parse opcode param type \"%c\"\n", *p); + } + p++; + } + return len; +} + +void code_write(TAG*tag, code_t*code, pool_t*pool, abc_file_t*file) +{ + code = code_start(code); + int pos = 0; + int length = 0; + code_t*c = code; + while(c) { + c->pos = pos; + pos += opcode_write(0, c, pool, file, 0); + c = c->next; + } + length = pos; + swf_SetU30(tag, pos); + int start = tag->len; + c = code; + pos = 0; + while(c) { + opcode_t*op = opcode_get(code->opcode); + if(op->flags&(OP_BRANCH|OP_JUMP)) { + int skip = 0; + } + pos += opcode_write(tag, c, pool, file, length); + c = c->next; + } + assert(tag->len - start == pos); +} + +typedef struct { + int stackpos; + int scopepos; + code_t*code; + char flags; + char error; +} stackpos_t; + +typedef struct { + stackpos_t*stack; + int num; + int maxlocal; + int maxstack; + int maxscope; + int flags; +} currentstats_t; + +static int stack_minus(code_t*c) +{ + opcode_t*op = opcode_get(c->opcode); + if(op->stack_minus>0) { + fprintf(stderr, "Invalid opcode entry %02x %s\n", c->opcode, op->name); + } + int stack = op->stack_minus; + if(op->flags&OP_STACK_NS) { + multiname_t*m = (multiname_t*)c->data[0]; + if(multiname_late_namespace(m)) + stack--; + if(multiname_late_name(m)) + stack--; + } + if(op->flags&OP_STACK_ARGS || op->flags&OP_STACK_ARGS2) { + assert(strchr(op->params, 'n')); + int nr = (ptroff_t)(op->params[0]=='n'?c->data[0]:c->data[1]); + stack-=nr; + if(op->flags&OP_STACK_ARGS2) + stack-=nr; + } + return stack; +} +static void handleregister(currentstats_t*stats, int reg) +{ + if(reg+1 > stats->maxlocal) + stats->maxlocal = reg+1; +} + +#define FLAG_SEEN 1 +#define FLAG_ERROR 2 + +static void dumpstack(currentstats_t*stats) +{ + int t; + for(t=0;tnum;t++) { + code_t*c = stats->stack[t].code; + opcode_t*op = opcode_get(c->opcode); + printf("%05d) %c %d:%d %s", t, (stats->stack[t].flags&FLAG_SEEN)?'x':'|', + stats->stack[t].stackpos, + stats->stack[t].scopepos, + op->name); + + if(op->flags&(OP_BRANCH|OP_JUMP)) { + if(c->branch) + printf(" ->%d\n", c->branch->pos); + else + printf(" 00000000\n"); + } + if(op->params[0]=='2') { + printf(" %s", multiname_tostring(c->data[0])); + } else if(op->params[0]=='N') { + printf(" %s", namespace_tostring(c->data[0])); + } + printf("\n"); + } +} + +static char callcode(currentstats_t*stats, int pos, int stack, int scope) +{ + while(posnum) { + if(stats->stack[pos].flags&FLAG_SEEN) { + if(stats->stack[pos].stackpos != stack || + stats->stack[pos].scopepos != scope) { + //dumpstack(stats); + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "Stack mismatch at pos %d\n", pos); + fprintf(stderr, "Should be: %d:%d, is: %d:%d\n", stack, scope, + stats->stack[pos].stackpos, stats->stack[pos].scopepos); + + /* return error here if we do verification */ + //return 0; + } + return 1; + } + + stats->stack[pos].flags |= FLAG_SEEN; + stats->stack[pos].stackpos = stack; + stats->stack[pos].scopepos = scope; + + code_t*c = stats->stack[pos].code; + opcode_t*op = opcode_get(c->opcode); + + //printf("Walking %s at position %d, stack=%d, scope=%d\n", op->name, pos, stack, scope); + + stack += stack_minus(c); + + if(stack<0) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "error: stack underflow at %d (%s)\n", pos, op->name); + + /* if we would do true verification (if we would be a vm), this is + where we would return the error + return 0; + */ + } + + stack += op->stack_plus; + scope += op->scope_stack_plus; + + if(stack > stats->maxstack) + stats->maxstack = stack; + if(scope > stats->maxscope) + stats->maxscope = scope; + + if(op->flags & OP_SET_DXNS) + stats->flags |= FLAGS_SET_DXNS; + if(op->flags & OP_NEED_ACTIVATION) + stats->flags |= FLAGS_ACTIVATION; + + if(c->opcode == OPCODE_NEWCLASS) { + abc_class_t*cls = (abc_class_t*)(c->data[0]); + if(scope > cls->init_scope_depth) + cls->init_scope_depth = scope; + } + if(c->opcode == OPCODE_NEWFUNCTION) { + abc_method_t*m = (abc_method_t*)(c->data[0]); + if(m->body && scope > m->body->init_scope_depth) + m->body->init_scope_depth = scope; + } + + if(op->flags & OP_REGISTER) { + char*p = op->params; + int pos = 0; + char ok=0; + while(*p) { + if(*p=='r') { + handleregister(stats, (ptroff_t)c->data[pos]); + ok = 1; + } + p++; + } + if(!ok) { + handleregister(stats, c->opcode&3); + } + } + if(op->flags&OP_RETURN) { + if(OP_RETURN==0x48/*returnvalue*/) { + if(stack!=1) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "return(value) with stackposition %d\n", stack); + } + } else if(OP_RETURN==0x47) { + if(stack!=0) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "return(void) with stackposition %d\n", stack); + } + } + } + if(op->flags & (OP_THROW|OP_RETURN)) + return 1; + if(op->flags & OP_JUMP) { + if(!c->branch) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d.\n", op->name, pos); + return 0; + } + c = c->branch; + pos = c->pos; + continue; + } + if(op->flags & OP_BRANCH) { + if(!c->branch) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d\n", op->name, pos); + return 0; + } + int newpos = c->branch->pos; + if(!callcode(stats, newpos, stack, scope)) + return 0; + } + if(op->flags & OP_LOOKUPSWITCH) { + lookupswitch_t*l = c->data[0]; + if(!l->def) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d\n", op->name, pos); + return 0; + } + if(!callcode(stats, l->def->pos, stack, scope)) + return 0; + code_list_t*t = l->targets; + while(t) { + if(!t->code) { + stats->stack[pos].flags |= FLAG_ERROR; + fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d\n", op->name, pos); + return 0; + } + if(!callcode(stats, t->code->pos, stack, scope)) + return 0; + t = t->next; + } + } + + pos++; + if(posnum) { + assert(c->next == stats->stack[pos].code); + } + } + return 1; +} + +static currentstats_t* code_get_stats(code_t*code, abc_exception_list_t*exceptions) +{ + code = code_start(code); + int num = 0; + code_t*c = code; + while(c) { + num++; + c = c->next; + } + currentstats_t* current = malloc(sizeof(currentstats_t)); + current->stack = rfx_calloc(sizeof(stackpos_t)*num); + current->maxlocal = 0; + current->maxstack = 0; + current->maxscope = 0; + current->num = num; + current->flags = 0; + +//#define DEBUG_BYTES +#ifdef DEBUG_BYTES + int t; + c = code; + for(t=0;topcode); + if(op->flags & (OP_JUMP|OP_BRANCH)) { + printf("%05d) %s %p\n", t, op->name, c->branch); + } else if(op->params[0]=='2') { + printf("%05d) %s %s\n", t, op->name, multiname_tostring(c->data[0])); + } else if(op->params[0]=='N') { + printf("%05d) %s %s\n", t, op->name, namespace_tostring(c->data[0])); + } else { + printf("%05d) %s\n", t, op->name); + } + c = c->next; + } + //printf("%05d) %02x\n", t, tag->data[start+t]); +#endif + + num = 0; + c = code; + while(c) { + //crosslink + current->stack[num].code = c; + c->pos = num; + num++; + c = c->next; + } + + if(!callcode(current, 0, 0, 0)) { + free(current); + return 0; + } + abc_exception_list_t*e = exceptions; + while(e) { + if(e->abc_exception->target) + callcode(current, e->abc_exception->target->pos, 1, 0); + e = e->next; + } + + return current; +} + +void stats_free(currentstats_t*stats) +{ + if(stats) { + free(stats->stack);stats->stack=0; + free(stats); + } +} + +int code_dump(code_t*c) +{ + code_t*cc = code_start(c); + while(cc) { + assert(!cc->next || cc->next->prev == cc); + cc = cc->next; + } + + return code_dump2(c, 0, 0, "", stdout); +} +int code_dump2(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*prefix, FILE*fo) +{ + abc_exception_list_t*e = exceptions; + c = code_start(c); + currentstats_t*stats = code_get_stats(c, exceptions); + + int pos = 0; + while(c) { + U8 opcode = c->opcode; + char found = 0; + opcode_t*op = opcode_get(opcode); + + e = exceptions; + while(e) { + if(c==e->abc_exception->from) + fprintf(fo, "%s TRY {\n", prefix); + if(c==e->abc_exception->target) { + char*s1 = multiname_tostring(e->abc_exception->exc_type); + char*s2 = multiname_tostring(e->abc_exception->var_name); + fprintf(fo, "%s CATCH(%s %s)\n", prefix, s1, s2); + free(s1); + free(s2); + } + e = e->next; + } + + if(!op) { + fprintf(stderr, "Can't parse opcode %02x.\n", opcode); + return 0; + } else { + char*p = op->params; + char first = 1; + int i=0; + + if(stats) { + int f = stats->stack[c->pos].flags; + fprintf(fo, "%s%05d) %c %d:%d %s ", prefix, c->pos, + (f&FLAG_ERROR)?'E':((f&FLAG_SEEN)?'+':'|'), + stats->stack[c->pos].stackpos, + stats->stack[c->pos].scopepos, + op->name); + } else { + fprintf(fo, "%s%05d) ? ?:? %s ", prefix, c->pos, op->name); + } + + while(*p) { + void*data = c->data[i]; + if(i>0) + printf(", "); + + if(*p == 'n') { + int n = (ptroff_t)data; + fprintf(fo, "%d params", n); + } else if(*p == '2') { + multiname_t*n = (multiname_t*)data; + char* m = multiname_tostring(n); + fprintf(fo, "%s", m); + free(m); + } else if(*p == 'N') { + namespace_t*ns = (namespace_t*)data; + char* m = namespace_tostring(ns); + fprintf(fo, "%s", m); + free(m); + } else if(*p == 'm') { + abc_method_t*m = (abc_method_t*)data; + fprintf(fo, "[method %08x %s]", m->index, m->name); + } else if(*p == 'c') { + abc_class_t*cls = (abc_class_t*)data; + char*classname = multiname_tostring(cls->classname); + fprintf(fo, "[classinfo %08x %s]", cls->index, classname); + free(classname); + } else if(*p == 'i') { + abc_method_body_t*b = (abc_method_body_t*)data; + fprintf(fo, "[methodbody]"); + } else if(*p == 'u' || *p == 'I' || *p == 'U') { + int n = (ptroff_t)data; + fprintf(fo, "%d", n); + } else if(*p == 'f') { + double f = *(double*)data; + fprintf(fo, "%f", f); + } else if(*p == 'r') { + int n = (ptroff_t)data; + fprintf(fo, "r%d", n); + } else if(*p == 'b') { + int b = (signed char)(ptroff_t)data; + fprintf(fo, "%d", b); + } else if(*p == 'j') { + if(c->branch) + fprintf(fo, "->%d", c->branch->pos); + else + fprintf(fo, "%p", c->branch); + } else if(*p == 's') { + char*s = string_escape((string_t*)data); + fprintf(fo, "\"%s\"", s); + free(s); + } else if(*p == 'D') { + fprintf(fo, "[register %02x=%s]", (int)(ptroff_t)c->data[1], (char*)c->data[0]); + } else if(*p == 'S') { + lookupswitch_t*l = c->data[0]; + fprintf(fo, "["); + if(l->def) + fprintf(fo, "default->%d", l->def->pos); + else + fprintf(fo, "default->00000000"); + code_list_t*t = l->targets; + while(t) { + if(t->code) + fprintf(fo, ",->%d", t->code->pos); + else + fprintf(fo, ",->00000000"); + t = t->next; + } + fprintf(fo, "]"); + } else { + fprintf(stderr, "Can't parse opcode param type \"%c\"\n", *p); + return 0; + } + p++; + i++; + first = 0; + } + fprintf(fo, "\n"); + } + + e = exceptions; + while(e) { + if(c==e->abc_exception->to) { + if(e->abc_exception->target) + fprintf(fo, "%s } // END TRY (HANDLER: %d)\n", prefix, e->abc_exception->target->pos); + else + fprintf(fo, "%s } // END TRY (HANDLER: 00000000)\n", prefix); + } + e = e->next; + } + + pos++; + c = c->next; + } + stats_free(stats); + return 1; +} + +codestats_t* code_get_statistics(code_t*code, abc_exception_list_t*exceptions) +{ + currentstats_t*current = code_get_stats(code, exceptions); + if(!current) + return 0; + codestats_t*stats = rfx_calloc(sizeof(codestats_t)); + stats->local_count = current->maxlocal; + stats->max_stack = current->maxstack; + stats->max_scope_depth = current->maxscope; + stats->flags = current->flags; + + stats_free(current);current=0; + return stats; +} + +void codestats_free(codestats_t*s) +{ + free(s); +} + +code_t* add_opcode(code_t*atag, U8 op) +{ + code_t*tmp = (code_t*)rfx_calloc(sizeof(code_t)); + tmp->opcode = op; + if(atag) { + tmp->prev = atag; + tmp->next = atag->next; + if(tmp->next) + tmp->next->prev = tmp; + atag->next = tmp; + } else { + tmp->prev = 0; + tmp->next = 0; + } + return tmp; +} + +void codestats_print(codestats_t*stats) +{ + printf("max_stack: %d\n", stats->max_stack); + printf("local_count: %d\n", stats->local_count); + printf("scope_depth: %d\n", stats->max_scope_depth); +} + +code_t* code_end(code_t*code) +{ + if(!code) + return 0; + while(code->next) + code = code->next; + return code; +} +code_t* code_start(code_t*code) +{ + if(!code) + return 0; + while(code->prev) + code = code->prev; + return code; +} + +code_t* code_append(code_t*code, code_t*toappend) +{ + if(!code) + return code_end(toappend); + if(!toappend) + return code_end(code); + //find end of first list + while(code->next) { + code = code->next; + } + code_t*start=toappend; + //and start of second list + while(start->prev) { + start = start->prev; + } + code->next = start; + start->prev = code; + return code_end(toappend); +} + +lookupswitch_t*lookupswitch_dup(lookupswitch_t*l) +{ + lookupswitch_t*n = malloc(sizeof(lookupswitch_t)); + fprintf(stderr, "Error: lookupswitch dupping not supported yet\n"); + n->targets = list_clone(l->targets); + return 0; +} + +code_t*code_dup(code_t*c) +{ + if(!c) return 0; + + dict_t*pos2pos = dict_new2(&ptr_type); + + code_t*last = 0; + c = code_start(c); + code_t*start = 0; + char does_branch = 0; + while(c) { + NEW(code_t, n); + memcpy(n, c, sizeof(code_t)); + if(!start) + start=n; + + if(c->opcode == OPCODE_LABEL || c->opcode == OPCODE_NOP) { + dict_put(pos2pos, c, n); + } + if(c->branch) { + does_branch = 1; + } + + opcode_t*op = opcode_get(c->opcode); + + char*p = op?op->params:""; + int pos=0; + while(*p) { + if(*p == '2') { //multiname + c->data[pos] = multiname_clone(c->data[pos]); + } else if(*p == 'N') { //multiname + c->data[pos] = namespace_clone(c->data[pos]); + } else if(*p == 's') { + c->data[pos] = string_dup3(c->data[pos]); + } else if(*p == 'D') { + c->data[pos] = strdup(c->data[pos]); + } else if(*p == 'f') { + double old = *(double*)c->data[pos]; + c->data[pos] = malloc(sizeof(double)); + *(double*)c->data[pos] = old; + } else if(strchr("S", *p)) { + c->data[pos] = lookupswitch_dup(c->data[pos]); + } + p++;pos++; + } + + n->prev = last; + if(last) { + last->next = n; + } + last = n; + c = c->next; + } + + if(does_branch) { + c = start; + while(c) { + if(c->branch) { + code_t*target = dict_lookup(pos2pos, c->branch); + if(!target) { + fprintf(stderr, "Error: Can't find branch target in code_dup\n"); + return 0; + } + c->branch = target; + } + c = c->next; + } + } + dict_destroy(pos2pos); + return last; +} + +code_t*code_cut(code_t*c) +{ + if(!c) return c; + code_t*prev = c->prev; + code_t*next = c->next; + c->prev = 0; + c->next = 0; + if(prev) prev->next=next; + if(next) next->prev=prev; + code_free(c); + + if(next) return code_end(next); + else return prev; +} + +code_t*code_cutlast(code_t*c) +{ + if(!c) return c; + assert(!c->next); + return code_cut(c); +} + +char is_getlocal(code_t*c) +{ + if(!c) return 0; + if(c->opcode == OPCODE_GETLOCAL || + c->opcode == OPCODE_GETLOCAL_0 || + c->opcode == OPCODE_GETLOCAL_1 || + c->opcode == OPCODE_GETLOCAL_2 || + c->opcode == OPCODE_GETLOCAL_3) { + return 1; + } + return 0; +} + +code_t* cut_last_push(code_t*c) +{ + assert(!c->next); + while(c) { + if(!c) break; + opcode_t*op = opcode_get(c->opcode); + /* cut conversion type operations */ + if(op->stack_minus == -1 && op->stack_plus == 1 && !(op->flags)) { + c = code_cutlast(c); + continue; + } + /* cut any type of push */ + else if(op->stack_minus == 0 && op->stack_plus == 1 && !(op->flags)) { + return code_cutlast(c); + } + /* cut register lookups */ + else if(c->opcode == OPCODE_GETLOCAL || + c->opcode == OPCODE_GETLOCAL_0 || + c->opcode == OPCODE_GETLOCAL_1 || + c->opcode == OPCODE_GETLOCAL_2 || + c->opcode == OPCODE_GETLOCAL_3) { + return code_cutlast(c); + } + /* discard function call values */ + else if(c->opcode == OPCODE_CALLPROPERTY) { + c->opcode = OPCODE_CALLPROPVOID; + return c; + } else if(c->opcode == OPCODE_CALLSUPER) { + c->opcode = OPCODE_CALLSUPERVOID; + return c; + } else if((c->opcode == OPCODE_NEWOBJECT || + c->opcode == OPCODE_NEWARRAY) && + !c->data[0]) { + // we can discard these if they're not eating up stack parameters + return code_cutlast(c); + } else if(op->stack_minus ==0 && op->stack_plus == 0 && + !(op->flags&~(OP_REGISTER|OP_SET_DXNS)) && c->prev) { + // trim code *before* the kill, inclocal, declocal, dxns + code_t*p = c->prev; + p->next = 0; + c->prev = 0; + return code_append(cut_last_push(p), c); + } else + break; + } + c = abc_pop(c); + return c; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/code.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/code.h new file mode 100644 index 000000000..d120203a3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/code.h @@ -0,0 +1,109 @@ +/* code.h + + Routines for handling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __abc_code_h__ +#define __abc_code_h__ + +#include "../q.h" + +DECLARE(code); +DECLARE_LIST(code); +DECLARE(codestats); +DECLARE(codelookup); +DECLARE(lookupswitch); + + +#include "abc.h" + +typedef struct _opcode +{ + unsigned char opcode; + char*name; + char*params; + + int stack_minus; + int stack_plus; + int scope_stack_plus; + int flags; +} opcode_t; + +struct _code { + void*data[2]; + code_t*next; + code_t*prev; + + code_t*branch; + int pos; //used during code path evaluation + + U8 opcode; +}; + +struct _lookupswitch { + code_t*def; + code_list_t*targets; +}; + +#define FLAGS_ACTIVATION 0x02 +#define FLAGS_SET_DXNS 0x40 +struct _codestats { + int max_stack; + int local_count; + int max_scope_depth; + int flags; +}; + +struct _codelookup { + code_t**bytepos; + int len; +}; + +code_t*code_dup(code_t*c); + +code_t*add_opcode(code_t*atag, U8 op); + +code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool, codelookup_t**codelookup); +int code_dump(code_t*c); +int code_dump2(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*prefix, FILE*fo); +void code_write(TAG*tag, code_t*code, pool_t*pool, abc_file_t*file); +void code_free(code_t*c); +code_t* code_atposition(codelookup_t*l, int pos); +void codelookup_free(codelookup_t*codelookup); + +code_t*code_cutlast(code_t*c); + +codestats_t* code_get_statistics(code_t*code, abc_exception_list_t*exceptions); + +void codestats_print(codestats_t*s); +void codestats_free(codestats_t*s); + +code_t* code_start(code_t*c); + +code_t* code_append(code_t*code, code_t*toappend); + +code_t* cut_last_push(code_t*_c); + +char is_getlocal(code_t*c); + +#define code_new() (0) + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/common.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/common.c new file mode 100644 index 000000000..5d4d4068d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/common.c @@ -0,0 +1,85 @@ +/* common.c + + Routines for handling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "files.h" +#include "common.h" + +int as3_pass = 0; +int as3_verbosity = 1; + +void as3_error(const char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(as3_verbosity<0) + exit(1); + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + fprintf(stderr, "%s:%d:%d: error: %s\n", current_filename, current_line, current_column, buf); + fprintf(stderr, "%s\n", current_filename_long); + fflush(stderr); + exit(1); +} +void as3_warning(const char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(as3_verbosity<1) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + fprintf(stdout, "%s:%d:%d: warning: %s\n", current_filename, current_line, current_column, buf); + fflush(stdout); +} +void as3_softwarning(const char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(as3_verbosity<2) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + fprintf(stderr, "%s:%d:%d: warning: %s\n", current_filename, current_line, current_column, buf); + fflush(stderr); +} + +void internal_error(const char*file, int line, const char*f) +{ + syntaxerror("internal error in %s, %s:%d", f, file, line); +} + +int a3_error(char*s) +{ + syntaxerror("%s", s); + return 0; //make gcc happy +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/common.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/common.h new file mode 100644 index 000000000..40444229a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/common.h @@ -0,0 +1,39 @@ +/* common.h + + Routines for handling/compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __as3_common_h__ +#define __as3_common_h__ + +extern int as3_lex(); +extern int as3_verbosity; +extern int as3_pass; +#define syntaxerror as3_error +int a3_error(char*s); +void as3_error(const char*format, ...) __attribute__ ((__noreturn__)); +void as3_warning(const char*format, ...); +void as3_softwarning(const char*format, ...); + +void internal_error(const char*file, int line, const char*f); +#define as3_assert(b) {if(!(b)) internal_error(__FILE__, __LINE__,__func__);} + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c new file mode 100644 index 000000000..e6571dbfc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c @@ -0,0 +1,369 @@ +/* compiler.h + + Compiler for parsing Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008/2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "common.h" +#include "tokenizer.h" +#include "files.h" +#include "parser.h" +#include "parser.tab.h" +#include "compiler.h" +#include "registry.h" +#include "assets.h" +#include "../os.h" +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_DIRENT_H +#include +#endif + +/* flex/bison definitions */ +extern int a3_parse(); +extern int as3_lex(); +extern int as3_lex_destroy(); + +static char config_recurse = 0; + +void as3_setverbosity(int level) +{ + as3_verbosity=level; +} +void as3_add_include_dir(char*dir) +{ + add_include_dir(dir); +} +void as3_set_option(const char*key, const char*value) +{ + if(!strcmp(key, "recurse")) { + config_recurse=atoi(value); + } +} + +static char registry_initialized = 0; +static char parser_initialized = 0; + +//#define STORE_TOKENS + +//#define DEBUG +#define DEBUG if(0) + +int a3_lex() +{ + as3_tokencount++; + return as3_lex(); +} + +typedef struct _compile_list { + const char*name; + const char*filename; + struct _compile_list*next; +} compile_list_t; +static compile_list_t*compile_list=0; + +static void as3_parse_file_or_array(const char*name, const char*filename, const void*mem, int length) +{ + if(!registry_initialized) { + registry_initialized = 1; + registry_init(); + } + if(!parser_initialized) { + parser_initialized = 1; + initialize_parser(); + } + + FILE*fi = 0; + if(filename) { + if(as3_pass==1 && !mem) { + // record the fact that we compiled this file + compile_list_t*c = rfx_calloc(sizeof(compile_list_t)); + c->next = compile_list; + c->name = strdup(name); + c->filename = strdup(filename); + compile_list = c; + } + DEBUG printf("[pass %d] parse file %s %s\n", as3_pass, name, filename); + fi = enter_file2(name, filename, 0); + as3_file_input(fi); + } else { + DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", as3_pass, name, length); + enter_file(name, name, 0); + as3_buffer_input((void*)mem, length); + } + + as3_tokencount=0; + initialize_file(name, filename); + a3_parse(); + as3_lex_destroy(); + finish_file(); + if(fi) fclose(fi); +} + +typedef struct _scheduled_file { + char*name; + char*filename; + struct _scheduled_file*next; +} scheduled_file_t; + +static scheduled_file_t*scheduled=0; +dict_t*scheduled_dict=0; + +void as3_parse_scheduled() +{ + DEBUG printf("[pass %d] parse scheduled\n", as3_pass); + + while(scheduled) { + scheduled_file_t*s = scheduled; + scheduled = 0; + while(s) { + scheduled_file_t*old = s; + as3_parse_file_or_array(s->name, s->filename, 0,0); + s = s->next; + + free(old->filename); + free(old->name); + old->filename = old->name = 0; + free(old); + } + } + if(scheduled_dict) { + dict_destroy(scheduled_dict); + scheduled_dict=0; + } +} + +void as3_schedule_file(const char*name, const char*filename) +{ + if(!scheduled_dict) { + scheduled_dict = dict_new(); + } + + filename = normalize_path(filename); + + if(dict_contains(scheduled_dict, filename)) { + return; //already processed + } else { + dict_put(scheduled_dict, filename, 0); + } + DEBUG printf("[pass %d] schedule %s %s\n", as3_pass, name, filename); + + NEW(scheduled_file_t, f); + f->name = strdup(name); + f->filename = strdup(filename); + f->next = scheduled; // dfs + scheduled = f; +} + +void as3_parse_list() +{ + while(compile_list) { + as3_parse_file_or_array(compile_list->name, compile_list->filename, 0,0); + compile_list = compile_list->next; + } +} + +void as3_parse_bytearray(const char*name, const void*mem, int length) +{ + as3_pass = 1; + as3_parse_file_or_array(name, 0, mem, length); + as3_parse_scheduled(); + + registry_resolve_all(); + + as3_pass = 2; + as3_parse_file_or_array(name, 0, mem, length); + as3_parse_list(); +} + +void as3_parse_file(const char*filename) +{ + char*fullfilename = find_file(filename, 1); + if(!fullfilename) + return; // not found + + compile_list = 0; + as3_pass = 1; + as3_schedule_file(filename, fullfilename); + as3_parse_scheduled(); + + registry_resolve_all(); + + as3_pass = 2; + as3_parse_list(); + + free(fullfilename); +} + +void as3_parse_directory(const char*dir) +{ + compile_list = 0; + + as3_pass = 1; + as3_schedule_directory(dir); + if(!scheduled) + as3_warning("Directory %s doesn't contain any ActionScript files", dir); + as3_parse_scheduled(); + + registry_resolve_all(); + + as3_pass = 2; + as3_parse_list(); +} + +char as3_schedule_directory(const char*dirname) +{ + DEBUG printf("[pass %d] schedule directory %s\n", as3_pass, dirname); + char ok=0; +#ifdef HAVE_DIRENT_H + include_dir_t*i = current_include_dirs; + while(i) { + char*fulldirname = concat_paths(i->path, dirname); + DEBUG printf("[pass %d] ... %s\n", as3_pass, fulldirname); + DIR*dir = opendir(fulldirname); + if(dir) { + ok = 1; + struct dirent*ent; + while(1) { + ent = readdir(dir); + if (!ent) + break; + char*name = ent->d_name; + char type = 0; + if(!name) continue; + int l=strlen(name); + if(l<4) + continue; + if(strncasecmp(&name[l-3], ".as", 3)) + continue; + char*fullfilename = concatPaths(fulldirname, name); + as3_schedule_file(name, fullfilename); + free(fullfilename); + } + } + free(fulldirname); + i = i->next; + } +#endif + return ok; +} + +void as3_schedule_package(const char*package) +{ + DEBUG printf("[pass %d] schedule package %s\n", as3_pass, package); + char*dirname = strdup(package); + int s=0; + while(dirname[s]) { + if(dirname[s]=='.') + dirname[s] = path_seperator; + s++; + }; + if(!as3_schedule_directory(dirname)) + as3_softwarning("Could not find package %s in file system", package); +} + +static void schedule_class(const char*package, const char*cls, char error) +{ + if(error) { + DEBUG printf("[pass %d] schedule class %s.%s\n", as3_pass, package, cls); + } + if(!cls) { + as3_schedule_package(package); + return; + } + int l1 = package?strlen(package):0; + int l2 = cls?strlen(cls):0; + char*filename = malloc(l1+l2+5); + int s=0,t=0; + while(package[s]) { + if(package[s]=='.') + filename[t++]='/'; + else + filename[t++] = package[s]; + s++; + } + if(t) + filename[t++] = '/'; + + strcpy(filename+t, cls); + strcpy(filename+t+l2, ".as"); + char*f=find_file(filename, error); + if(!f) { + int i; + filename = filename_to_lowercase(filename); + f=find_file(filename, error); + } + if(!f) { + if(error) { + strcpy(filename+t, cls); + strcpy(filename+t+l2, ".as"); + as3_warning("Could not open file %s", filename); + } + return; + } + as3_schedule_file(filename, f); +} + +void as3_schedule_class(const char*package, const char*cls) +{ + schedule_class(package, cls, 1); +} + +void as3_schedule_class_noerror(const char*package, const char*cls) +{ + if(config_recurse) { + schedule_class(package, cls, 0); + } +} + + +static void*as3code = 0; +void* as3_getcode() +{ + if(parser_initialized) { + parser_initialized = 0; + as3code = finish_parser(); + } + return as3code; +} +void* as3_getassets(void*t) +{ + return swf_AssetsToTags((TAG*)t, registry_getassets()); +} +char* as3_getglobalclass() +{ + return as3_globalclass; +} + +void as3_destroy() +{ + if(parser_initialized) { + parser_initialized = 0; + swf_FreeABC(finish_parser()); +#ifdef STORE_TOKENS + mem_clear(&tokens); +#endif + } + if(as3_globalclass) { + free(as3_globalclass);as3_globalclass=0; + } +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h new file mode 100644 index 000000000..848775571 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h @@ -0,0 +1,48 @@ +/* compiler.h + + Routines for handling/compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __as3_compiler_h__ +#define __as3_compiler_h__ + +void as3_setverbosity(int level); +void as3_add_include_dir(char*dir); + +void as3_set_define(const char*c); +void as3_set_option(const char*key, const char*value); + +void as3_parse_file(const char*filename); +void as3_parse_bytearray(const char*name, const void*mem, int length); +void as3_parse_directory(const char*dir); + +char as3_schedule_directory(const char*dir); +void as3_schedule_package(const char*package); +void as3_schedule_class(const char*package, const char*cls); +void as3_schedule_class_noerror(const char*package, const char*cls); + +void as3_warning(const char*format, ...); +char* as3_getglobalclass(); +void* as3_getcode(); +void* as3_getassets(void*); +void as3_destroy(); + +#endif //__as3_compiler_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c new file mode 100644 index 000000000..1a6759498 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c @@ -0,0 +1,2904 @@ +/* expr.c + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "expr.h" +#include "common.h" +#include "tokenizer.h" + +#define IS_INT(a) (TYPE_IS_INT((a)) || TYPE_IS_UINT((a))) +#define BOTH_INT(a,b) (IS_INT(a) && IS_INT(b)) + +#define READ_HEADER_LEFTRIGHT \ + typedcode_t left = n->child[0]->type->read(n->child[0]);\ + typedcode_t right = n->child[1]->type->read(n->child[1]);\ + code_t*c=0;\ + classinfo_t*t=0; + +#define READ_HEADER_ONE \ + typedcode_t x = n->child[0]->type->read(n->child[0]);\ + code_t*c=0;\ + classinfo_t*t=0; + +#define EXEC_HEADER_ONE \ + code_t* x = n->child[0]->type->exec(n->child[0]);\ + code_t*c=0;\ + classinfo_t*t=0; + +#define EXEC_HEADER_LEFTRIGHT \ + code_t* left = n->child[0]->type->exec(n->child[0]);\ + code_t* right = n->child[1]->type->exec(n->child[1]);\ + code_t*c=0;\ + classinfo_t*t=0; + +#define EVAL_HEADER_LEFTRIGHT \ + constant_t left = n->child[0]->type->eval(n->child[0]);\ + constant_t right = n->child[1]->type->eval(n->child[1]);\ + constant_t r; \ + if(left.type==CONSTANT_UNKNOWN || right.type==CONSTANT_UNKNOWN) {\ + r.type = CONSTANT_UNKNOWN;return r; \ + } + + +#define RET \ + typedcode_t r; \ + r.c = c; \ + r.t = t; \ + return r; + +static classinfo_t*join_types(classinfo_t*type1, classinfo_t*type2, nodetype_t*t) +{ + if(t == &node_plus) { + if((TYPE_IS_XMLLIST(type1) || TYPE_IS_XML(type1)) && + (TYPE_IS_XMLLIST(type2) || TYPE_IS_XML(type2))) + return TYPE_OBJECT; + if(BOTH_INT(type1, type2)) + return TYPE_INT; + if(IS_NUMBER_OR_INT(type1) && IS_NUMBER_OR_INT(type2)) + return TYPE_NUMBER; + if(TYPE_IS_DATE(type1) || TYPE_IS_DATE(type2)) + return TYPE_OBJECT; + if(TYPE_IS_STRING(type1) || TYPE_IS_STRING(type2)) { + /* depending on where the strings come from, the result type + of an "add" might be an object or a string, depending on the + verifier's mood. So basically we just don't know the type. */ + return TYPE_VOID; + } + if(TYPE_IS_ANY(type1) || TYPE_IS_ANY(type2)) + return TYPE_ANY; + return TYPE_OBJECT; // e.g. array+array = object + } + + if(type1 == type2) + return type1; + return TYPE_ANY; +} +static int getlocalnr(code_t*c) +{ + if(c->opcode == OPCODE_GETLOCAL) {return (ptroff_t)c->data[0];} + else if(c->opcode == OPCODE_GETLOCAL_0) {return 0;} + else if(c->opcode == OPCODE_GETLOCAL_1) {return 1;} + else if(c->opcode == OPCODE_GETLOCAL_2) {return 2;} + else if(c->opcode == OPCODE_GETLOCAL_3) {return 3;} + else syntaxerror("Internal error: opcode %02x is not a getlocal call", c->opcode); + return 0; +} + + +int gettempvar(); /* FIXME: we should use a function pointer here */ + + +static code_t* toreadwrite(code_t*in, code_t*middlepart, char justassign, char readbefore, char pushvalue) +{ + /* converts this: + + [prefix code] [read instruction] + + to this: + + [prefix code] ([dup]) [read instruction] [middlepart] [setvar] [write instruction] [getvar] + */ + if(in && in->opcode == OPCODE_COERCE_A) { + in = code_cutlast(in); + } + if(in->next) + syntaxerror("internal error"); + + /* chop off read instruction */ + code_t*prefix = in; + code_t*r = in; + if(r->prev) { + prefix = r->prev;r->prev = 0; + prefix->next=0; + } else { + prefix = 0; + } + + char use_temp_var = readbefore; + + /* generate the write instruction, and maybe append a dup to the prefix code */ + code_t* write = abc_nop(0); + if(r->opcode == OPCODE_GETPROPERTY) { + write->opcode = OPCODE_SETPROPERTY; + multiname_t*m = (multiname_t*)r->data[0]; + write->data[0] = multiname_clone(m); + if(m->type == QNAME || m->type == MULTINAME || + m->type == QNAMEA || m->type == MULTINAMEA) { + if(!justassign) { + prefix = abc_dup(prefix); // we need the object, too + } + use_temp_var = 1; + } else if(m->type == MULTINAMEL || m->type == MULTINAMELA || + m->type == RTQNAME || m->type == RTQNAMEA) { + if(!justassign) { + /* dupping two values on the stack requires 5 operations and one register- + couldn't adobe just have given us a dup2? */ + int temp = gettempvar(); + prefix = abc_setlocal(prefix, temp); + prefix = abc_dup(prefix); + prefix = abc_getlocal(prefix, temp); + prefix = abc_swap(prefix); + prefix = abc_getlocal(prefix, temp); + if(!use_temp_var); + prefix = abc_kill(prefix, temp); + } + use_temp_var = 1; + } else { + syntaxerror("illegal lvalue: can't assign a value to this expression (not a qname/multiname)"); + } + } else if(r->opcode == OPCODE_GETSLOT) { + write->opcode = OPCODE_SETSLOT; + write->data[0] = r->data[0]; + if(!justassign) { + prefix = abc_dup(prefix); // we need the object, too + } + use_temp_var = 1; + } else if(r->opcode == OPCODE_GETLOCAL) { + write->opcode = OPCODE_SETLOCAL; + write->data[0] = r->data[0]; + } else if(r->opcode == OPCODE_GETLOCAL_0) { + write->opcode = OPCODE_SETLOCAL_0; + } else if(r->opcode == OPCODE_GETLOCAL_1) { + write->opcode = OPCODE_SETLOCAL_1; + } else if(r->opcode == OPCODE_GETLOCAL_2) { + write->opcode = OPCODE_SETLOCAL_2; + } else if(r->opcode == OPCODE_GETLOCAL_3) { + write->opcode = OPCODE_SETLOCAL_3; + } else if(r->opcode == OPCODE_GETSUPER) { + write->opcode = OPCODE_SETSUPER; + multiname_t*m = (multiname_t*)r->data[0]; + write->data[0] = multiname_clone(m); + } else { + code_dump(r); + syntaxerror("illegal lvalue: can't assign a value to this expression"); + } + code_t* c = 0; + + int temp = -1; + if(!justassign) { + if(use_temp_var) { + /* with getproperty/getslot, we have to be extra careful not + to execute the read code twice, as it might have side-effects + (e.g. if the property is in fact a setter/getter combination) + + So read the value, modify it, and write it again, + using prefix only once and making sure (by using a temporary + register) that the return value is what we just wrote */ + temp = gettempvar(); + c = code_append(c, prefix); + c = code_append(c, r); + if(pushvalue && readbefore) { + c = abc_dup(c); + c = abc_setlocal(c, temp); + } + c = code_append(c, middlepart); + if(pushvalue && !readbefore) { + c = abc_dup(c); + c = abc_setlocal(c, temp); + } + c = code_append(c, write); + if(pushvalue) { + c = abc_getlocal(c, temp); + c = abc_kill(c, temp); + } + } else { + /* if we're allowed to execute the read code twice *and* + the middlepart doesn't modify the code, things are easier. + */ + //c = code_append(c, prefix); + if(prefix) syntaxerror("internal error (prefix)"); + code_t* r2 = 0; + if(pushvalue) { + r2 = code_dup(r); + } + c = code_append(c, r); + c = code_append(c, middlepart); + c = code_append(c, write); + if(pushvalue) { + c = code_append(c, r2); + } + } + } else { + /* even smaller version: overwrite the value without reading + it out first */ + if(!use_temp_var) { + if(prefix) { + c = code_append(c, prefix); + c = abc_dup(c); + } + c = code_append(c, middlepart); + c = code_append(c, write); + if(pushvalue) { + c = code_append(c, r); + } + } else { + code_free(r);r=0; + temp = gettempvar(); + if(prefix) { + c = code_append(c, prefix); + } + c = code_append(c, middlepart); + if(pushvalue) { + c = abc_dup(c); + c = abc_setlocal(c, temp); + } + c = code_append(c, write); + if(pushvalue) { + c = abc_getlocal(c, temp); + c = abc_kill(c, temp); + } + } + } + return c; +} + +typedcode_t push_constant(constant_t*v) +{ + typedcode_t t; + switch(v->type) { + case CONSTANT_INT: t.c = abc_pushint(0, v->i);t.t = TYPE_INT;break; + case CONSTANT_UINT: t.c = abc_pushuint(0, v->u);t.t = TYPE_UINT;break; + case CONSTANT_FLOAT: t.c = abc_pushdouble(0, v->f);t.t = TYPE_FLOAT;break; + case CONSTANT_TRUE: t.c = abc_pushtrue(0);t.t = TYPE_BOOLEAN;break; + case CONSTANT_FALSE: t.c = abc_pushfalse(0);t.t = TYPE_BOOLEAN;break; + case CONSTANT_STRING: t.c = abc_pushstring2(0, v->s);t.t = TYPE_STRING;break; + case CONSTANT_NULL: t.c = abc_pushnull(0);t.t = TYPE_NULL;break; + case CONSTANT_UNDEFINED: t.c = abc_pushundefined(0);t.t = TYPE_ANY;break; + case CONSTANT_NAMESPACE: + case CONSTANT_NAMESPACE_PACKAGE: + case CONSTANT_NAMESPACE_PACKAGEINTERNAL: + case CONSTANT_NAMESPACE_PROTECTED: + case CONSTANT_NAMESPACE_EXPLICIT: + case CONSTANT_NAMESPACE_STATICPROTECTED: + case CONSTANT_NAMESPACE_PRIVATE: + t.c = abc_pushnamespace(0, v->ns);t.t = TYPE_NAMESPACE;break; + default: + syntaxerror("internal error: bad constant"); + } + return t; +} + +code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to); + +int constant_to_int(constant_t*c) +{ + switch(c->type) { + case CONSTANT_INT: return c->i; + case CONSTANT_UINT: return (int)c->u; + case CONSTANT_FLOAT: return c->f; + case CONSTANT_TRUE: return 1; + case CONSTANT_FALSE: return 0; + case CONSTANT_STRING: return atoi(c->s->str); + default: syntaxerror("can't convert this constant to an integer"); + } +} + +double constant_to_float(constant_t*c) +{ + switch(c->type) { + case CONSTANT_INT: return (double)c->i; + case CONSTANT_UINT: return (double)c->u; + case CONSTANT_FLOAT: return c->f; + case CONSTANT_TRUE: return (double)1; + case CONSTANT_FALSE: return (double)0; + case CONSTANT_STRING: return atof(c->s->str); + default: syntaxerror("can't convert this constant to a float"); + } +} + +// -------------------------- x + y ----------------------------------- + +typedcode_t node_plus_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_plus_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + if(BOTH_INT(left.t, right.t)) { + c = abc_add_i(c); + t = TYPE_INT; + } else { + c = abc_add(c); + t = join_types(left.t,right.t,n->type); + } + RET; +} +code_t* node_plus_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_plus_eval(node_t*n) +{ + EVAL_HEADER_LEFTRIGHT; + char left_int = left.type == CONSTANT_INT || left.type == CONSTANT_UINT; + if(left_int && (right.type == CONSTANT_INT || right.type == CONSTANT_UINT)) { + int i = constant_to_int(&left) + constant_to_int(&right); + r.type = CONSTANT_INT; + r.i = i; + } else if(left_int && right.type == CONSTANT_FLOAT) { + double f = constant_to_int(&left) + constant_to_float(&right); + r.type = CONSTANT_FLOAT; + r.f = f; + } else if(left.type == CONSTANT_STRING) { + char*add = constant_tostring(&right); + int l1 = left.s->len; + int l2 = strlen(add); + char*s = malloc(l1+l2+1); + memcpy(s, left.s->str, l1); + memcpy(s+l1, add, l2); + s[l1+l2]=0; + r.type = CONSTANT_STRING; + r.s = malloc(sizeof(string_t)); + r.s->str = s; + r.s->len = l1+l2; + free(add); + } else { + r.type = CONSTANT_UNKNOWN; + } + return r; +} +nodetype_t node_plus = +{ +name:"plus", +flags:NODE_HAS_CHILDREN, +eval:node_plus_eval, +write:node_plus_write, +read:node_plus_read, +exec:node_plus_exec, +}; + +// -------------------------- x - y ----------------------------------- + +typedcode_t node_minus_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_minus_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + if(BOTH_INT(left.t,right.t)) { + c = abc_subtract_i(c); + t = TYPE_INT; + } else { + c = abc_subtract(c); + t = TYPE_NUMBER; + } + RET; +} +code_t* node_minus_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_minus_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_minus = +{ +name:"minus", +flags:NODE_HAS_CHILDREN, +eval: node_minus_eval, +write: node_minus_write, +read: node_minus_read, +exec: node_minus_exec +}; + +// ---------------------------- ++x ----------------------------------- + +typedcode_t node_lplusplus_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_lplusplus_read(node_t*n) +{ + READ_HEADER_ONE; + t = x.t; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_inclocal_i(c, nr); + c = abc_getlocal(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_inclocal(c, nr); + c = abc_getlocal(c, nr); + } else syntaxerror("internal error"); + } else { + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_increment_i(c); + t = TYPE_INT; + } else { + c = abc_increment(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); + c = toreadwrite(x.c, c, 0, 0, 1); + t = x.t; + } + RET +} +code_t* node_lplusplus_exec(node_t*n) +{ + typedcode_t x = n->child[0]->type->read(n->child[0]); + code_t*c=0; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_inclocal_i(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_inclocal(c, nr); + } else syntaxerror("internal error"); + } else { + classinfo_t*t; + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_increment_i(c); + t = TYPE_INT; + } else { + c = abc_increment(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); //convert back to original type + c = toreadwrite(x.c, c, 0, 0, 0); + t = x.t; + } + return c; +} +constant_t node_lplusplus_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_lplusplus = +{ +name: "lplusplus", +flags:NODE_HAS_CHILDREN, +eval: node_lplusplus_eval, +write: node_lplusplus_write, +read: node_lplusplus_read, +exec: node_lplusplus_exec +}; + + +// ---------------------------- --x ----------------------------------- + +typedcode_t node_lminusminus_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_lminusminus_read(node_t*n) +{ + READ_HEADER_ONE; + t = x.t; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_declocal_i(c, nr); + c = abc_getlocal(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_declocal(c, nr); + c = abc_getlocal(c, nr); + } else syntaxerror("internal error"); + } else { + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_decrement_i(c); + t = TYPE_INT; + } else { + c = abc_decrement(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); + c = toreadwrite(x.c, c, 0, 0, 1); + t = x.t; + } + RET +} +code_t* node_lminusminus_exec(node_t*n) +{ + typedcode_t x = n->child[0]->type->read(n->child[0]); + code_t*c=0; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_declocal_i(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_declocal(c, nr); + } else syntaxerror("internal error"); + } else { + classinfo_t*t; + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_decrement_i(c); + t = TYPE_INT; + } else { + c = abc_decrement(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); //convert back to original type + c = toreadwrite(x.c, c, 0, 0, 0); + t = x.t; + } + return c; +} +constant_t node_lminusminus_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_lminusminus = +{ +name: "lminusminus", +flags:NODE_HAS_CHILDREN, +eval: node_lminusminus_eval, +write: node_lminusminus_write, +read: node_lminusminus_read, +exec: node_lminusminus_exec +}; + + + +// ---------------------------- x++ ----------------------------------- + +typedcode_t node_rplusplus_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_rplusplus_read(node_t*n) +{ + READ_HEADER_ONE; + t = x.t; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_getlocal(0, nr); + c = abc_inclocal_i(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_getlocal(0, nr); + c = abc_inclocal(c, nr); + } else syntaxerror("internal error"); + } else { + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_increment_i(c); + t = TYPE_INT; + } else { + c = abc_increment(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); + c = toreadwrite(x.c, c, 0, 1, 1); + t = x.t; + } + RET +} +code_t* node_rplusplus_exec(node_t*n) +{ + typedcode_t x = n->child[0]->type->read(n->child[0]); + code_t*c=0; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_inclocal_i(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_inclocal(c, nr); + } else syntaxerror("internal error"); + } else { + classinfo_t*t; + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_increment_i(c); + t = TYPE_INT; + } else { + c = abc_increment(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); //convert back to original type + c = toreadwrite(x.c, c, 0, 1, 0); + t = x.t; + } + return c; +} +constant_t node_rplusplus_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_rplusplus = +{ +name: "rplusplus", +flags:NODE_HAS_CHILDREN, +eval: node_rplusplus_eval, +write: node_rplusplus_write, +read: node_rplusplus_read, +exec: node_rplusplus_exec +}; + +// ---------------------------- x-- ----------------------------------- + +typedcode_t node_rminusminus_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_rminusminus_read(node_t*n) +{ + READ_HEADER_ONE; + t = x.t; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_getlocal(0, nr); + c = abc_declocal_i(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_getlocal(0, nr); + c = abc_declocal(c, nr); + } else syntaxerror("internal error"); + } else { + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_decrement_i(c); + t = TYPE_INT; + } else { + c = abc_decrement(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); + c = toreadwrite(x.c, c, 0, 1, 1); + t = x.t; + } + RET +} +code_t* node_rminusminus_exec(node_t*n) +{ + typedcode_t x = n->child[0]->type->read(n->child[0]); + code_t*c=0; + if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { + int nr = getlocalnr(x.c); + code_free(x.c);x.c=0; + if(TYPE_IS_INT(x.t)) { + c = abc_declocal_i(c, nr); + } else if(TYPE_IS_NUMBER(x.t)) { + c = abc_declocal(c, nr); + } else syntaxerror("internal error"); + } else { + classinfo_t*t; + if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { + c = abc_decrement_i(c); + t = TYPE_INT; + } else { + c = abc_decrement(c); + t = TYPE_NUMBER; + } + c = converttype(c, t, x.t); //convert back to original type + c = toreadwrite(x.c, c, 0, 1, 0); + t = x.t; + } + return c; +} +constant_t node_rminusminus_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_rminusminus = +{ +name: "rminusminus", +flags:NODE_HAS_CHILDREN, +eval: node_rminusminus_eval, +write: node_rminusminus_write, +read: node_rminusminus_read, +exec: node_rminusminus_exec +}; + +// ---------------------------- x*y ----------------------------------- + +typedcode_t node_multiply_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_multiply_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + if(BOTH_INT(left.t,right.t)) { + c = abc_multiply_i(c); + t = TYPE_INT; + } else { + c = abc_multiply(c); + t = TYPE_NUMBER; + } + RET +} +code_t* node_multiply_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_multiply_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_multiply = +{ +name: "multiply", +flags:NODE_HAS_CHILDREN, +eval: node_multiply_eval, +write: node_multiply_write, +read: node_multiply_read, +exec: node_multiply_exec +}; + +// ---------------------------- x/y ----------------------------------- + +typedcode_t node_div_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_div_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + c = abc_divide(c); + t = TYPE_NUMBER; + RET +} +code_t* node_div_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_div_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_div = +{ +name: "div", +flags:NODE_HAS_CHILDREN, +eval: node_div_eval, +write: node_div_write, +read: node_div_read, +exec: node_div_exec +}; + +// ---------------------------- x%y ----------------------------------- + +typedcode_t node_mod_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_mod_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + c = abc_modulo(c); + t = TYPE_NUMBER; + RET +} +code_t* node_mod_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_mod_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_mod = +{ +name: "mod", +flags:NODE_HAS_CHILDREN, +eval: node_mod_eval, +write: node_mod_write, +read: node_mod_read, +exec: node_mod_exec +}; + +// ---------------------------- xy ----------------------------------- + +typedcode_t node_gt_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_gt_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_greaterthan(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_gt_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_gt_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_gt = +{ +name: "gt", +flags:NODE_HAS_CHILDREN, +eval: node_gt_eval, +write: node_gt_write, +read: node_gt_read, +exec: node_gt_exec +}; + +// ---------------------------- x<=y ---------------------------------- + +typedcode_t node_le_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_le_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_lessequals(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_le_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_le_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_le = //<= +{ +name: "le", +flags:NODE_HAS_CHILDREN, +eval: node_le_eval, +write: node_le_write, +read: node_le_read, +exec: node_le_exec +}; + +// ---------------------------- x>=y ---------------------------------- + +typedcode_t node_ge_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_ge_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_greaterequals(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_ge_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_ge_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_ge = //>= +{ +name: "ge", +flags:NODE_HAS_CHILDREN, +eval: node_ge_eval, +write: node_ge_write, +read: node_ge_read, +exec: node_ge_exec +}; + +// ---------------------------- x==y ---------------------------------- + +typedcode_t node_eqeq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_eqeq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_equals(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_eqeq_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_eqeq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_eqeq = //== +{ +name: "eqeq", +flags:NODE_HAS_CHILDREN, +eval: node_eqeq_eval, +write: node_eqeq_write, +read: node_eqeq_read, +exec: node_eqeq_exec +}; + +// --------------------------- x===y ---------------------------------- + +typedcode_t node_eqeqeq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_eqeqeq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_strictequals(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_eqeqeq_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_eqeqeq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_eqeqeq = //=== +{ +name: "eqeqeq", +flags:NODE_HAS_CHILDREN, +eval: node_eqeqeq_eval, +write: node_eqeqeq_write, +read: node_eqeqeq_read, +exec: node_eqeqeq_exec +}; + +// --------------------------- x!==y ---------------------------------- + +typedcode_t node_noteqeq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_noteqeq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_strictequals(c); + c = abc_not(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_noteqeq_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_noteqeq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_noteqeq = //!== +{ +name: "noteqeq", +flags:NODE_HAS_CHILDREN, +eval: node_noteqeq_eval, +write: node_noteqeq_write, +read: node_noteqeq_read, +exec: node_noteqeq_exec +}; + +// --------------------------- x!=y ---------------------------------- + +typedcode_t node_noteq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_noteq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_equals(c); + c = abc_not(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_noteq_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_noteq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_noteq = //!= +{ +name: "noteq", +flags:NODE_HAS_CHILDREN, +eval: node_noteq_eval, +write: node_noteq_write, +read: node_noteq_read, +exec: node_noteq_exec +}; + +// --------------------------- x||y ---------------------------------- + +typedcode_t node_oror_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_oror_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + t = join_types(left.t, right.t, n->type); + c = left.c; + c = converttype(c, left.t, t); + c = abc_dup(c); + code_t*jmp = c = abc_iftrue(c, 0); + c = cut_last_push(c); + c = code_append(c, right.c); + c = converttype(c, right.t, t); + code_t*label = c = abc_label(c); + jmp->branch = label; + RET; +} +code_t* node_oror_exec(node_t*n) +{ + typedcode_t left = n->child[0]->type->read(n->child[0]); + code_t* right = n->child[1]->type->exec(n->child[1]); + code_t*c = left.c; + code_t*jmp = c = abc_iftrue(c, 0); + c = code_append(c, right); + code_t*label = c = abc_label(c); + jmp->branch = label; + return c; +} +constant_t node_oror_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_oror = //|| +{ +name: "oror", +flags:NODE_HAS_CHILDREN, +eval: node_oror_eval, +write: node_oror_write, +read: node_oror_read, +exec: node_oror_exec +}; + +// --------------------------- x&&y ---------------------------------- + +typedcode_t node_andand_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_andand_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + t = join_types(left.t, right.t, &node_andand); + c = left.c; + c = converttype(c, left.t, t); + c = abc_dup(c); + code_t*jmp = c = abc_iffalse(c, 0); + c = cut_last_push(c); + c = code_append(c,right.c); + c = converttype(c, right.t, t); + code_t*label = c = abc_label(c); + jmp->branch = label; + RET; +} +code_t* node_andand_exec(node_t*n) +{ + typedcode_t left = n->child[0]->type->read(n->child[0]);\ + code_t* right = n->child[1]->type->exec(n->child[1]);\ + code_t*c = left.c; + code_t*jmp = c = abc_iffalse(c, 0); + c = code_append(c, right); + code_t*label = c = abc_label(c); + jmp->branch = label; + return c; +} +constant_t node_andand_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_andand = //&& +{ +name: "andand", +flags:NODE_HAS_CHILDREN, +eval: node_andand_eval, +write: node_andand_write, +read: node_andand_read, +exec: node_andand_exec +}; + +// ----------------------------- !x ----------------------------------- + +typedcode_t node_not_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_not_read(node_t*n) +{ + READ_HEADER_ONE; + c = x.c; + c = abc_not(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_not_exec(node_t*n) +{ + EXEC_HEADER_ONE; + return x; +} +constant_t node_not_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_not = +{ +name: "not", +flags:NODE_HAS_CHILDREN, +eval: node_not_eval, +write: node_not_write, +read: node_not_read, +exec: node_not_exec +}; + +// ----------------------------- ~x ----------------------------------- + +typedcode_t node_bitnot_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitnot_read(node_t*n) +{ + READ_HEADER_ONE; + c = x.c; + c = abc_bitnot(c); + t = TYPE_INT; + RET; +} +code_t* node_bitnot_exec(node_t*n) +{ + EXEC_HEADER_ONE; + return x; +} +constant_t node_bitnot_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitnot = +{ +name: "bitnot", +flags:NODE_HAS_CHILDREN, +eval: node_bitnot_eval, +write: node_bitnot_write, +read: node_bitnot_read, +exec: node_bitnot_exec +}; + +// ----------------------------- x&y ----------------------------------- + +typedcode_t node_bitand_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitand_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_bitand(c); + t = TYPE_INT; + RET; +} +code_t* node_bitand_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_bitand_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitand = +{ +name: "bitand", +flags:NODE_HAS_CHILDREN, +eval: node_bitand_eval, +write: node_bitand_write, +read: node_bitand_read, +exec: node_bitand_exec +}; + +// ----------------------------- x^y ----------------------------------- + +typedcode_t node_bitxor_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitxor_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_bitxor(c); + t = TYPE_INT; + RET; +} +code_t* node_bitxor_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_bitxor_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitxor = +{ +name: "bitxor", +flags:NODE_HAS_CHILDREN, +eval: node_bitxor_eval, +write: node_bitxor_write, +read: node_bitxor_read, +exec: node_bitxor_exec +}; + +// ----------------------------- x|y ----------------------------------- + +typedcode_t node_bitor_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitor_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_bitor(c); + t = TYPE_INT; + RET; +} +code_t* node_bitor_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_bitor_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitor = +{ +name: "bitor", +flags:NODE_HAS_CHILDREN, +eval: node_bitor_eval, +write: node_bitor_write, +read: node_bitor_read, +exec: node_bitor_exec +}; + +// ---------------------------- x>>y ----------------------------------- + +typedcode_t node_shr_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_shr_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_rshift(c); + t = TYPE_INT; + RET; +} +code_t* node_shr_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_shr_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_shr = //>> +{ +name: "shr", +flags:NODE_HAS_CHILDREN, +eval: node_shr_eval, +write: node_shr_write, +read: node_shr_read, +exec: node_shr_exec +}; + +// ---------------------------- x<>>y ----------------------------------- + +typedcode_t node_ushr_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_ushr_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_urshift(c); + t = TYPE_INT; + RET; +} +code_t* node_ushr_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_ushr_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_ushr = //>>> +{ +name: "ushr", +flags:NODE_HAS_CHILDREN, +eval: node_ushr_eval, +write: node_ushr_write, +read: node_ushr_read, +exec: node_ushr_exec +}; + +// ---------------------------- x in y ---------------------------------- + +typedcode_t node_in_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_in_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c,right.c); + c = abc_in(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_in_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_in_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_in = //in +{ +name: "in", +flags:NODE_HAS_CHILDREN, +eval: node_in_eval, +write: node_in_write, +read: node_in_read, +exec: node_in_exec +}; + +// ---------------------------- x as y ---------------------------------- + +typedcode_t node_as_write(node_t*n) +{ + /* ? */ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_as_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + c = abc_astypelate(c); + if(TYPE_IS_CLASS(right.t) && right.t->data) { + t = (classinfo_t*)right.t->data; + } else { + t = TYPE_ANY; + } + RET; +} +code_t* node_as_exec(node_t*n) +{ + /* we assume here that "as" doesn't have side-effects (like + early run time type checking) */ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_as_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_as = //as +{ +name: "as", +flags:NODE_HAS_CHILDREN, +eval: node_as_eval, +write: node_as_write, +read: node_as_read, +exec: node_as_exec +}; + +// ------------------------- x instanceof y ----------------------------- + +typedcode_t node_instanceof_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_instanceof_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + c = abc_instanceof(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_instanceof_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_instanceof_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_instanceof = //instanceof +{ +name: "instanceof", +flags:NODE_HAS_CHILDREN, +eval: node_instanceof_eval, +write: node_instanceof_write, +read: node_instanceof_read, +exec: node_instanceof_exec +}; + +// ------------------------- x is y -------------------------------------- + +typedcode_t node_is_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_is_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + c = abc_istypelate(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_is_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_is_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_is = //is +{ +name: "is", +flags:NODE_HAS_CHILDREN, +eval: node_is_eval, +write: node_is_write, +read: node_is_read, +exec: node_is_exec +}; + +// ------------------------- x[y] -------------------------------------- + +typedcode_t node_arraylookup_write(node_t*n) +{ + syntaxerror("not implemented yet"); +} +typedcode_t node_arraylookup_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = code_append(left.c, right.c); + + /* XXX not sure whether this access logic is correct */ + namespace_t ns = {left.t?left.t->access:ACCESS_PACKAGE, ""}; + namespace_set_t nsset; + namespace_list_t l;l.next = 0; + nsset.namespaces = &l; + l.namespace = &ns; + multiname_t m = {MULTINAMEL, 0, &nsset, 0}; + + c = abc_getproperty2(c, &m); + t = 0; // array elements have unknown type + RET; +} +code_t* node_arraylookup_exec(node_t*n) +{ + EXEC_HEADER_LEFTRIGHT; + return code_append(left, right); +} +constant_t node_arraylookup_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_arraylookup = +{ +name: "arraylookup", +flags:NODE_HAS_CHILDREN, +eval: node_arraylookup_eval, +write: node_arraylookup_write, +read: node_arraylookup_read, +exec: node_arraylookup_exec +}; + +// ------------------------- typeof(x) ------------------------------------ + +typedcode_t node_typeof_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_typeof_read(node_t*n) +{ + READ_HEADER_ONE; + c = x.c; + c = abc_typeof(c); + t = TYPE_BOOLEAN; + RET; +} +code_t* node_typeof_exec(node_t*n) +{ + EXEC_HEADER_ONE; + return x; +} +constant_t node_typeof_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_typeof = //typeof +{ +name: "typeof", +flags:NODE_HAS_CHILDREN, +eval: node_typeof_eval, +write: node_typeof_write, +read: node_typeof_read, +exec: node_typeof_exec +}; + +// ------------------------- (void)(x) ------------------------------------ + +typedcode_t node_void_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_void_read(node_t*n) +{ + code_t*c = n->type->exec(n); + c = abc_pushundefined(c); + classinfo_t*t = TYPE_ANY; + RET; +} +code_t* node_void_exec(node_t*n) +{ + EXEC_HEADER_ONE; + return x; +} +constant_t node_void_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_void = //void +{ +name: "void", +flags:NODE_HAS_CHILDREN, +eval: node_void_eval, +write: node_void_write, +read: node_void_read, +exec: node_void_exec +}; + +// ---------------------------- -x ---------------------------------------- + +typedcode_t node_neg_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_neg_read(node_t*n) +{ + READ_HEADER_ONE; + c = x.c; + if(IS_INT(x.t)) { + c = abc_negate_i(c); + t = TYPE_INT; + } else { + c = abc_negate(c); + t = TYPE_NUMBER; + } + RET; +} +code_t* node_neg_exec(node_t*n) +{ + EXEC_HEADER_ONE; + return x; +} +constant_t node_neg_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_neg = //- +{ +name: "neg", +flags:NODE_HAS_CHILDREN, +eval: node_neg_eval, +write: node_neg_write, +read: node_neg_read, +exec: node_neg_exec +}; + +// ---------------------------- x*=y ---------------------------------------- + +typedcode_t node_muleq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_muleq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + classinfo_t*f = 0; + if(BOTH_INT(left.t,right.t)) { + c=abc_multiply_i(c); + f = TYPE_INT; + } else { + c=abc_multiply(c); + f = TYPE_NUMBER; + } + c=converttype(c, f, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_muleq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + classinfo_t*f = 0; + if(BOTH_INT(left.t,right.t)) { + c=abc_multiply_i(c); + f = TYPE_INT; + } else { + c=abc_multiply(c); + f = TYPE_NUMBER; + } + c = converttype(c, f, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_muleq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_muleq = +{ +name: "muleq", +flags:NODE_HAS_CHILDREN, +eval: node_muleq_eval, +write: node_muleq_write, +read: node_muleq_read, +exec: node_muleq_exec +}; + +// ---------------------------- x%=y ---------------------------------------- + +typedcode_t node_modeq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_modeq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_modulo(right.c); + c = converttype(c, TYPE_NUMBER, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_modeq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_modulo(right.c); + c = converttype(c, TYPE_NUMBER, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_modeq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_modeq = //%= +{ +name: "modeq", +flags:NODE_HAS_CHILDREN, +eval: node_modeq_eval, +write: node_modeq_write, +read: node_modeq_read, +exec: node_modeq_exec +}; + +// ---------------------------- x<<=y ---------------------------------------- + +typedcode_t node_shleq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_shleq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_lshift(right.c); + c = converttype(c, TYPE_INT, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_shleq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_lshift(right.c); + c = converttype(c, TYPE_INT, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_shleq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_shleq = //<<= +{ +name: "shleq", +flags:NODE_HAS_CHILDREN, +eval: node_shleq_eval, +write: node_shleq_write, +read: node_shleq_read, +exec: node_shleq_exec +}; + +// ---------------------------- x>>=y ---------------------------------------- + +typedcode_t node_shreq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_shreq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_rshift(right.c); + c = converttype(c, TYPE_INT, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_shreq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_rshift(right.c); + c = converttype(c, TYPE_INT, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_shreq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_shreq = //>>= +{ +name: "shreq", +flags:NODE_HAS_CHILDREN, +eval: node_shreq_eval, +write: node_shreq_write, +read: node_shreq_read, +exec: node_shreq_exec +}; + +// --------------------------- x>>>=y ---------------------------------------- + +typedcode_t node_ushreq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_ushreq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_urshift(right.c); + c = converttype(c, TYPE_UINT, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_ushreq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_urshift(right.c); + c = converttype(c, TYPE_UINT, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_ushreq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_ushreq = //>>>= +{ +name: "ushreq", +flags:NODE_HAS_CHILDREN, +eval: node_ushreq_eval, +write: node_ushreq_write, +read: node_ushreq_read, +exec: node_ushreq_exec +}; + +// --------------------------- x/=y ---------------------------------------- + +typedcode_t node_diveq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_diveq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_divide(right.c); + c = converttype(c, TYPE_NUMBER, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_diveq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_divide(right.c); + c = converttype(c, TYPE_NUMBER, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_diveq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_diveq = +{ +name: "diveq", +flags:NODE_HAS_CHILDREN, +eval: node_diveq_eval, +write: node_diveq_write, +read: node_diveq_read, +exec: node_diveq_exec +}; + +// --------------------------- x|=y ---------------------------------------- + +typedcode_t node_bitoreq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitoreq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_bitor(right.c); + c = converttype(c, TYPE_INT, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_bitoreq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_bitor(right.c); + c = converttype(c, TYPE_INT, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_bitoreq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitoreq = //|= +{ +name: "bitoreq", +flags:NODE_HAS_CHILDREN, +eval: node_bitoreq_eval, +write: node_bitoreq_write, +read: node_bitoreq_read, +exec: node_bitoreq_exec +}; + +// --------------------------- x^=y ---------------------------------------- + +typedcode_t node_bitxoreq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitxoreq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_bitxor(right.c); + c = converttype(c, TYPE_INT, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_bitxoreq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_bitxor(right.c); + c = converttype(c, TYPE_INT, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_bitxoreq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitxoreq = //^= +{ +name: "bitxoreq", +flags:NODE_HAS_CHILDREN, +eval: node_bitxoreq_eval, +write: node_bitxoreq_write, +read: node_bitxoreq_read, +exec: node_bitxoreq_exec +}; + +// --------------------------- x&=y ---------------------------------------- + +typedcode_t node_bitandeq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_bitandeq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_bitand(right.c); + c = converttype(c, TYPE_INT, left.t); + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_bitandeq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = abc_bitand(right.c); + c = converttype(c, TYPE_INT, left.t); + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_bitandeq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_bitandeq = //^= +{ +name: "bitandeq", +flags:NODE_HAS_CHILDREN, +eval: node_bitandeq_eval, +write: node_bitandeq_write, +read: node_bitandeq_read, +exec: node_bitandeq_exec +}; + +// --------------------------- x+=y ---------------------------------------- + +typedcode_t node_pluseq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_pluseq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + if(TYPE_IS_INT(left.t)) { + c = abc_add_i(c); + } else { + c = abc_add(c); + c = converttype(c, join_types(left.t,right.t,&node_plus), left.t); + } + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_pluseq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + if(TYPE_IS_INT(left.t)) { + c = abc_add_i(c); + } else { + c = abc_add(c); + c = converttype(c, join_types(left.t,right.t,&node_plus), left.t); + } + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_pluseq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_pluseq = //+= +{ +name: "pluseq", +flags:NODE_HAS_CHILDREN, +eval: node_pluseq_eval, +write: node_pluseq_write, +read: node_pluseq_read, +exec: node_pluseq_exec +}; + +// --------------------------- x-=y ---------------------------------------- + +typedcode_t node_minuseq_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_minuseq_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + if(TYPE_IS_INT(left.t)) { + c = abc_subtract_i(c); + } else { + c = abc_subtract(c); + c = converttype(c, TYPE_NUMBER, left.t); + } + c = toreadwrite(left.c, c, 0, 0, 1); + t = left.t; + RET; +} +code_t* node_minuseq_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + if(TYPE_IS_INT(left.t)) { + c = abc_subtract_i(c); + } else { + c = abc_subtract(c); + c = converttype(c, TYPE_NUMBER, left.t); + } + return toreadwrite(left.c, c, 0, 0, 0); +} +constant_t node_minuseq_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_minuseq = //-= +{ +name: "minuseq", +flags:NODE_HAS_CHILDREN, +eval: node_minuseq_eval, +write: node_minuseq_write, +read: node_minuseq_read, +exec: node_minuseq_exec +}; + +// --------------------------- x=y ----------------------------------------- + +typedcode_t node_assign_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_assign_read(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + c = converttype(c, right.t, left.t); + c = toreadwrite(left.c, c, 1, 0, 1); + t = left.t; + RET; +} +code_t* node_assign_exec(node_t*n) +{ + READ_HEADER_LEFTRIGHT; + c = right.c; + c = converttype(c, right.t, left.t); + return toreadwrite(left.c, c, 1, 0, 0); +} +constant_t node_assign_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_assign = +{ +name: "assign", +flags:NODE_HAS_CHILDREN, +eval: node_assign_eval, +write: node_assign_write, +read: node_assign_read, +exec: node_assign_exec +}; + +// --------------------------- x?y1:y2 -------------------------------------- + +typedcode_t node_tenary_write(node_t*n) +{ + /* TODO: this might actually be kinda useful. + (global?global.x:this.x) = 3; + */ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_tenary_read(node_t*n) +{ + typedcode_t cond = n->child[0]->type->read(n->child[0]); + typedcode_t left = n->child[1]->type->read(n->child[1]); + typedcode_t right = n->child[2]->type->read(n->child[2]); + classinfo_t*t = join_types(left.t,right.t,&node_tenary); + code_t* c = cond.c; + code_t*j1 = c = abc_iffalse(c, 0); + c = code_append(c, left.c); + c = converttype(c, left.t, t); + code_t*j2 = c = abc_jump(c, 0); + c = j1->branch = abc_label(c); + c = code_append(c, right.c); + c = converttype(c, right.t, t); + c = j2->branch = abc_label(c); + RET; +} +code_t* node_tenary_exec(node_t*n) +{ + typedcode_t cond = n->child[0]->type->read(n->child[0]); + code_t* left = n->child[1]->type->exec(n->child[1]); + code_t* right = n->child[2]->type->exec(n->child[2]); + code_t* c = cond.c; + code_t*j1 = c = abc_iffalse(c, 0); + c = code_append(c, left); + code_t*j2 = c = abc_jump(c, 0); + c = j1->branch = abc_label(c); + c = code_append(c, right); + c = j2->branch = abc_label(c); + return c; +} +constant_t node_tenary_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_tenary = +{ +name: "tenary", +flags:NODE_HAS_CHILDREN, +eval: node_tenary_eval, +write: node_tenary_write, +read: node_tenary_read, +exec: node_tenary_exec +}; + +// ---------------------------- comma ---------------------------------------- + +typedcode_t node_comma_write(node_t*n) +{ + syntaxerror("can't assign to this expression"); +} +typedcode_t node_comma_read(node_t*n) +{ + code_t*c = 0; + classinfo_t*t = 0; + int i; + for(i=0;inum_children-1;i++) { + c = code_append(c, n->child[i]->type->exec(n->child[i])); + } + typedcode_t o = n->child[i]->type->read(n->child[i]); + c = code_append(c, o.c); + t = o.t; + RET; +} +code_t* node_comma_exec(node_t*n) +{ + int t; + code_t*c = 0; + for(t=0;tnum_children;t++) { + c = code_append(c, n->child[t]->type->exec(n->child[t])); + } + return c; +} +constant_t node_comma_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_comma = +{ +name: "expr", +flags: NODE_HAS_CHILDREN, +eval: node_comma_eval, +write: node_comma_write, +read: node_comma_read, +exec: node_comma_exec +}; + + +#if 0 +// -------------------------- new x ----------------------------------- + +typedcode_t node_new_write(node_t*n) +{ +} +typedcode_t node_new_read(node_t*n) +{ +} +code_t* node_new_exec(node_t*n) +{ +} +constant_t node_new_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_new = //new +{ +write: node_new_write, +read: node_new_read, +eval: node_new_eval, +exec: node_new_exec +}; + +// ------------------------ delete x ---------------------------------- + +typedcode_t node_delete_write(node_t*n) +{ +} +typedcode_t node_delete_read(node_t*n) +{ +} +code_t* node_delete_exec(node_t*n) +{ +} +constant_t node_delete_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_delete = //delete +{ +write: node_delete_write, +read: node_delete_read, +eval: node_delete_eval, +exec: node_delete_exec +}; + +// ---------------------------- x.y ----------------------------------- + +typedcode_t node_dot_write(node_t*n) +{ +} +typedcode_t node_dot_read(node_t*n) +{ +} +code_t* node_dot_exec(node_t*n) +{ +} +constant_t node_dot_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_dot = +{ +write: node_dot_write, +read: node_dot_read, +eval: node_dot_eval, +exec: node_dot_exec +}; + +// --------------------------- x..y ----------------------------------- + +typedcode_t node_dotdot_write(node_t*n) +{ +} +typedcode_t node_dotdot_read(node_t*n) +{ +} +code_t* node_dotdot_exec(node_t*n) +{ + +} +constant_t node_dotdot_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_dotdot = //.. +{ +write: node_dotdot_write, +read: node_dotdot_read, +eval: node_dotdot_eval, +exec: node_dotdot_exec +}; + +// --------------------------- x.@y ----------------------------------- + +typedcode_t node_dotat_write(node_t*n) +{ +} +typedcode_t node_dotat_read(node_t*n) +{ +} +code_t* node_dotat_exec(node_t*n) +{ +} +constant_t node_dotat_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_dotat = //.@ +{ +write: node_dotat_write, +read: node_dotat_read, +eval: node_dotat_eval, +exec: node_dotat_exec +}; + +// --------------------------- x.*y ----------------------------------- + +typedcode_t node_dotstar_write(node_t*n) +{ +} +typedcode_t node_dotstar_read(node_t*n) +{ +} +code_t* node_dotstar_exec(node_t*n) +{ +} +constant_t node_dotstar_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_dotstar = //.* +{ +write: node_dotstar_write, +read: node_dotstar_read, +eval: node_dotstar_eval, +exec: node_dotstar_exec +}; + +// -------------------------- x.(y) ----------------------------------- + +typedcode_t node_filter_write(node_t*n) +{ +} +typedcode_t node_filter_read(node_t*n) +{ +} +code_t* node_filter_exec(node_t*n) +{ +} +constant_t node_filter_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_filter = //.( +{ +write: node_filter_write, +read: node_filter_read, +eval: node_filter_eval, +exec: node_filter_exec +}; + +// ------------------------ x(y1,...,yn) ------------------------------ + +typedcode_t node_call_write(node_t*n) +{ +} +typedcode_t node_call_read(node_t*n) +{ +} +code_t* node_call_exec(node_t*n) +{ +} +constant_t node_call_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_call = //functioncall +{ +write: node_call_write, +read: node_call_read, +eval: node_call_eval, +exec: node_call_exec +}; + +// ------------------------------ @x ---------------------------------------- + +typedcode_t node_at_write(node_t*n) +{ +} +typedcode_t node_at_read(node_t*n) +{ +} +code_t* node_at_exec(node_t*n) +{ +} +constant_t node_at_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_at = //@ +{ +write: node_at_write, +read: node_at_read, +eval: node_at_eval, +exec: node_at_exec +}; + +// ---------------------------- x.ns::y ---------------------------------------- + +typedcode_t node_dotns_write(node_t*n) +{ +} +typedcode_t node_dotns_read(node_t*n) +{ +} +code_t* node_dotns_exec(node_t*n) +{ +} +constant_t node_dotns_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_dotns = //.:: +{ +write: node_dotns_write, +read: node_dotns_read, +eval: node_dotns_eval, +exec: node_dotns_exec +}; +#endif + +// ------------------------ constant ------------------------------ + +typedcode_t node_const_write(node_t*n) +{ + syntaxerror("can't assign a value to a constant"); +} +typedcode_t node_const_read(node_t*n) +{ + constant_t*v = n->value; + code_t*c=0; + classinfo_t*t=0; + switch(v->type) { + case CONSTANT_INT: + if(v->i>-128 && v->i<128) { + c = abc_pushbyte(0,v->i); + } else if(v->i>=-32768 && v->i<32768) { + c = abc_pushshort(0,v->i); + } else { + c = abc_pushint(0,v->i); + } + t = TYPE_INT; + break; + case CONSTANT_UINT: + c = abc_pushuint(0,v->u); + if(v->u<128) { + c = abc_pushbyte(0,v->u); + } else if(v->u<32768) { + c = abc_pushshort(0,v->u); + } else { + c = abc_pushint(0,v->u); + } + t = TYPE_UINT; + break; + case CONSTANT_FLOAT: + c = abc_pushdouble(0,v->f); + t = TYPE_FLOAT; + break; + case CONSTANT_TRUE: + c = abc_pushtrue(0); + t = TYPE_BOOLEAN; + break; + case CONSTANT_FALSE: + c = abc_pushfalse(0); + t = TYPE_BOOLEAN; + break; + case CONSTANT_NULL: + c = abc_pushnull(0); + t = TYPE_NULL; + break; + case CONSTANT_STRING: + c = abc_pushstring2(0,v->s); + t = TYPE_STRING; + break; + case CONSTANT_UNDEFINED: + c = abc_pushundefined(0); + t = 0; + break; + case CONSTANT_NAMESPACE: + case CONSTANT_NAMESPACE_PACKAGE: + case CONSTANT_NAMESPACE_PACKAGEINTERNAL: + case CONSTANT_NAMESPACE_PROTECTED: + case CONSTANT_NAMESPACE_EXPLICIT: + case CONSTANT_NAMESPACE_STATICPROTECTED: + case CONSTANT_NAMESPACE_PRIVATE: + c = abc_pushnamespace(0, v->ns); + break; + case CONSTANT_UNKNOWN: + syntaxerror("internal error: invalid constant"); + default: + *(int*)0=0; + syntaxerror("invalid constant (%d)", v->type); + + } + RET; +} + +code_t* node_const_exec(node_t*n) +{ + return 0; +} +constant_t node_const_eval(node_t*n) +{ + constant_t*c = constant_clone(n->value); + constant_t r = *c; + free(c); //shallow free + return r; +} +nodetype_t node_const = +{ +name: "const", +flags:0, +eval: node_const_eval, +write: node_const_write, +read: node_const_read, +exec: node_const_exec +}; + +// ------------------------ code node ------------------------------ + +typedcode_t node_code_write(node_t*n) +{ + typedcode_t t; + t.c = 0; + int tmp = gettempvar(); + t.c = abc_setlocal(t.c, tmp); + code_t*w = toreadwrite(n->code.c, abc_getlocal(0,tmp), 1, 0, 0); + t.c = code_append(t.c, w); + t.c = abc_kill(t.c, tmp); + n->code.c=0; + t.t = n->code.t; + return t; +} +typedcode_t node_code_read(node_t*n) +{ + typedcode_t t; + t.c = n->code.c; + n->code.c=0; + t.t = n->code.t; + return t; +} +code_t* node_code_exec(node_t*n) +{ + code_t*c = code_dup(n->code.c); + c = cut_last_push(c); + return c; +} +constant_t node_code_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_code = +{ +name: "code", +flags:0, +eval: node_code_eval, +write: node_code_write, +read: node_code_read, +exec: node_code_exec +}; + +// ------------------------ dummy node ------------------------------ + +typedcode_t node_dummy_write(node_t*n) +{ + syntaxerror("not implemented yet"); +} +typedcode_t node_dummy_read(node_t*n) +{ + typedcode_t t; + t.c = abc_pushundefined(0); + t.t = TYPE_ANY; + return t; +} +code_t* node_dummy_exec(node_t*n) +{ + return 0; +} +constant_t node_dummy_eval(node_t*n) +{ + constant_t r;r.type=CONSTANT_UNKNOWN;return r; +} +nodetype_t node_dummy = +{ +name: "dummy", +flags:0, +eval: node_dummy_eval, +write: node_dummy_write, +read: node_dummy_read, +exec: node_dummy_exec +}; + +// ======================== node handling ============================== + +node_t* mkdummynode() +{ + node_t*n = (node_t*)rfx_calloc(sizeof(node_t)); + n->type = &node_dummy; + return n; +} + +node_t* mkconstnode(constant_t*c) +{ + node_t*n = (node_t*)malloc(sizeof(node_t)); + n->type = &node_const; + n->parent = 0; + n->value = c; + return n; +} + +node_t* mkcodenode(typedcode_t c) +{ + node_t*n = (node_t*)malloc(sizeof(node_t)); + n->type = &node_code; + n->parent = 0; + n->code = c; + return n; +} + +node_t* mkmultinode(nodetype_t*t, node_t*one) +{ + node_t*n = (node_t*)malloc(sizeof(node_t)); + n->type = t; + n->parent = 0; + n->child = (node_t**)malloc(sizeof(node_t*)*1); + n->child[0] = one; + n->num_children = 1; + return n; +} + +node_t* mkstringnode(const char*s) +{ + return mkconstnode(constant_new_string(s)); +} + +node_t* mkaddnode(node_t*n1, node_t*n2) +{ + return mknode2(&node_plus, n1, n2); +} + +node_t* multinode_extend(node_t*n, node_t*add) +{ + n->child = realloc(n->child, (n->num_children+1)*sizeof(node_t*)); + n->child[n->num_children] = add; + n->num_children++; + return n; +} + +node_t* mknode1(nodetype_t*t, node_t*node) +{ + node_t*n = (node_t*)malloc(sizeof(node_t)+sizeof(node_t*)*2); + node_t**x = (node_t**)&n[1]; + n->type = t; + n->parent = 0; + n->child = x; + n->num_children = 1; + x[0] = node; + x[1] = 0; + return n; +}; + +node_t* mknode2(nodetype_t*t, node_t*left, node_t*right) +{ + node_t*n = (node_t*)malloc(sizeof(node_t)+sizeof(node_t*)*3); + node_t**x = (node_t**)&n[1]; + n->type = t; + n->parent = 0; + n->child = x; + n->num_children = 2; + x[0] = left; + x[1] = right; + x[2] = 0; + return n; +} +node_t* mknode3(nodetype_t*t, node_t*one, node_t*two, node_t*three) +{ + node_t*n = (node_t*)malloc(sizeof(node_t)+sizeof(node_t*)*4); + node_t**x = (node_t**)&n[1]; + n->type = t; + n->parent = 0; + n->child = x; + n->num_children = 3; + x[0] = one; + x[1] = two; + x[2] = three; + x[3] = 0; + return n; +} + +void node_free(node_t*n) +{ + int t; + if(n->type == &node_code) { + if(n->code.c) { + code_free(n->code.c);n->code.c = 0; + } + } else if(n->type == &node_const) { + /* keep, this is not our reference */ + } else for(t=0;tnum_children;t++) { + node_free(n->child[t]);n->child[t] = 0; + } + free(n); +} + +typedcode_t node_read(node_t*n) +{ + constant_t c = n->type->eval(n); + if(c.type == CONSTANT_UNKNOWN) { + typedcode_t t = n->type->read(n); + node_free(n); + return t; + } else { + typedcode_t t = push_constant(&c); + node_free(n); + return t; + } +} +typedcode_t node_write(node_t*n) +{ + typedcode_t t = n->type->write(n); + node_free(n); + return t; +} +code_t* node_exec(node_t*n) +{ + code_t*c = n->type->exec(n); + node_free(n); + return c; +} +constant_t node_eval(node_t*n) +{ + constant_t c = n->type->eval(n); + node_free(n); + return c; +} + +/* + | + +-add + | | + | +-code + | | + | +-code + | | + | + + | + +-div + +*/ +void node_dump2(node_t*n, const char*p1, const char*p2, FILE*fi) +{ + if(n->type->flags&NODE_HAS_CHILDREN) { + fprintf(fi, "%s%s\n", p1, n->type->name); + int t; + char*o2 = malloc(strlen(p2)+3); + strcpy(o2, p2);strcat(o2, "| "); + char*o3 = malloc(strlen(p2)+3); + strcpy(o3, p2);strcat(o3, "+-"); + char*o4 = malloc(strlen(p2)+3); + strcpy(o4, p2);strcat(o4, " "); + + for(t=0;tnum_children;t++) { + fprintf(fi, "%s\n", o2); + node_dump2(n->child[t], o3, tnum_children-1?o2:o4, fi); + } + free(o2); + free(o3); + free(o4); + } else if(n->type == &node_const) { + char*s = constant_tostring(n->value); + fprintf(fi, "%s%s (%s)\n", p1, n->type->name, s); + free(s); + } else if(n->type == &node_code) { + fprintf(fi, "%s%s (%s)\n", p1, n->type->name, n->code.t?n->code.t->name:"*"); + code_dump2(n->code.c, 0, 0, (char*)p2, fi); + } else { + fprintf(fi, "%s%s\n", p1, n->type->name); + } +} + +void node_dump(node_t*n) +{ + printf("------------VVVV---------------\n"); + node_dump2(n,"","",stdout); + printf("-------------------------------\n"); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h new file mode 100644 index 000000000..d216c2c20 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h @@ -0,0 +1,149 @@ +/* expr.h + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __expr_h__ +#define __expr_h__ + +#include "../q.h" +#include "code.h" +#include "registry.h" +#include "pool.h" + +DECLARE(node); +DECLARE(typedcode); +DECLARE(nodetype); +DECLARE_LIST(node); + +struct _typedcode { + code_t*c; + classinfo_t*t; +}; + +#define NODE_HAS_CHILDREN 1 + +struct _nodetype { + char*name; + int flags; + typedcode_t (*write)(node_t*n); + typedcode_t (*read)(node_t*n); + code_t* (*exec)(node_t*n); + constant_t (*eval)(node_t*n); +}; + +extern nodetype_t node_plus; +extern nodetype_t node_minus; +extern nodetype_t node_lplusplus; //++x +extern nodetype_t node_lminusminus; //--x +extern nodetype_t node_rplusplus; //x++ +extern nodetype_t node_rminusminus; //x-- +extern nodetype_t node_multiply; +extern nodetype_t node_div; +extern nodetype_t node_mod; +extern nodetype_t node_dot; +extern nodetype_t node_lt; +extern nodetype_t node_gt; +extern nodetype_t node_le; //<= +extern nodetype_t node_ge; //>= +extern nodetype_t node_eqeq; //== +extern nodetype_t node_eqeqeq; //=== +extern nodetype_t node_noteqeq; //!== +extern nodetype_t node_noteq; //!= +extern nodetype_t node_oror; //|| +extern nodetype_t node_andand; //&& +extern nodetype_t node_not; +extern nodetype_t node_bitnot; +extern nodetype_t node_bitand; +extern nodetype_t node_bitxor; +extern nodetype_t node_bitor; +extern nodetype_t node_shr; //>> +extern nodetype_t node_shl; //<< +extern nodetype_t node_ushr; //>>> +extern nodetype_t node_in; //in +extern nodetype_t node_as; //as +extern nodetype_t node_instanceof; //instanceof +extern nodetype_t node_is; //is +extern nodetype_t node_typeof; //typeof +extern nodetype_t node_void; //void +extern nodetype_t node_neg; //- +extern nodetype_t node_muleq; //*= +extern nodetype_t node_modeq; //%= +extern nodetype_t node_shleq; //<<= +extern nodetype_t node_shreq; //>>= +extern nodetype_t node_ushreq; //>>>= +extern nodetype_t node_diveq; ///= +extern nodetype_t node_bitoreq; //|= +extern nodetype_t node_bitxoreq; //^= +extern nodetype_t node_bitandeq; //&= +extern nodetype_t node_pluseq; //+= +extern nodetype_t node_minuseq; //-= +extern nodetype_t node_assign; //-= +extern nodetype_t node_tenary; //?: +extern nodetype_t node_arraylookup; //x[y] +extern nodetype_t node_comma; //(y1,y2,...,yn) + +extern nodetype_t node_const; +extern nodetype_t node_code; + +#if 0 +extern nodetype_t node_dotdot; //.. +extern nodetype_t node_dotat; //.@ +extern nodetype_t node_dotstar; //.* +extern nodetype_t node_filter; //.( +extern nodetype_t node_new; //new +extern nodetype_t node_delete; //delete +extern nodetype_t node_call; //functioncall +extern nodetype_t node_at; //@ +extern nodetype_t node_dotns; //.:: +#endif + +node_t* multinode_extend(node_t*n, node_t*add); + +struct _node { + nodetype_t*type; + node_t*parent; + union { + struct { + node_t**child; + int num_children; + }; + constant_t*value; + char*id; + typedcode_t code; + }; +}; + +node_t* mkdummynode(); +node_t* mkconstnode(constant_t*c); +node_t* mkcodenode(typedcode_t c); +node_t* mkstringnode(const char*s); +node_t* mkaddnode(node_t*n1, node_t*n2); +node_t* mkmultinode(nodetype_t*t, node_t*one); +node_t* mknode1(nodetype_t*t, node_t*node); +node_t* mknode2(nodetype_t*t, node_t*left, node_t*right); +node_t* mknode3(nodetype_t*t, node_t*one, node_t*two, node_t*three); +void node_free(node_t*n); +typedcode_t node_read(node_t*n); //read and free +typedcode_t node_write(node_t*n); //write and free +code_t* node_exec(node_t*n); //exec and free +constant_t node_eval(node_t*n); //eval and free +void node_dump(node_t*n); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/files.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/files.c new file mode 100644 index 000000000..f6284ddf5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/files.c @@ -0,0 +1,327 @@ +/* files.c + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "files.h" +#include "common.h" +#include "tokenizer.h" +#include "../os.h" + +static int verbose = 0; +static void dbg(const char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(!verbose) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(includefilehandler) "); + printf("%s\n", buf); + fflush(stdout); +} + + +int current_line=1; +int current_column=0; +char* current_filename=0; +char* current_filename_short=0; +char* current_filename_long=0; +include_dir_t* current_include_dirs=0; + +#define MAX_INCLUDE_DEPTH 16 + +void*include_stack[MAX_INCLUDE_DEPTH]; +int line_stack[MAX_INCLUDE_DEPTH]; +int column_stack[MAX_INCLUDE_DEPTH]; +char* filename_stack[MAX_INCLUDE_DEPTH]; +char* shortfilename_stack[MAX_INCLUDE_DEPTH]; +char* longfilename_stack[MAX_INCLUDE_DEPTH]; +include_dir_t* includedir_stack[MAX_INCLUDE_DEPTH]; +int include_stack_ptr = 0; + +void add_include_dir(char*dir) +{ + include_dir_t*d = malloc(sizeof(include_dir_t)); + memset(d , 0, sizeof(include_dir_t)); + d->path = strdup(dir); + d->next = current_include_dirs; + current_include_dirs = d; +} + +void del_include_dirs(include_dir_t*d, include_dir_t*d2) +{ + while(d && d!=d2) { + include_dir_t*next = d->next; + free(d->path);d->path=0; + d->next = 0; + free(d); + d = next; + } +} + +char*get_path(const char*file) +{ + char*path = strdup(file); + char*r1 = strrchr(path, '/'); + char*r2 = strrchr(path, '\\'); + if(r1r2) { + *r1=0; + return path; + } else { + return strdup("."); + } +} + +char is_absolute(const char*filename) +{ + if(!filename || !filename[0]) + return 0; + if(filename[0]=='/' || filename[0]=='\\') + return 1; + if(filename[1]==':' && filename[2]=='/') + return 1; + if(filename[1]==':' && filename[2]=='\\') + return 1; + return 0; +} + +char* filename_to_lowercase(const char*name) +{ + char*n = strdup(name); + //char*x1 = strrchr(name, '/'); + //char*x2 = strrchr(name, '\\'); + char*s = n; + //if(x1+1>s) s=x1+1; + //if(x2+1>s) s=x2+1; + while(*s) { + /* FIXME: what we probably should do here is use libc's tolower(). + I don't really know yet, though, how Windows (or MacOS X) handles + lowercasing of Unicode filenames */ + if(*s>='A' && *s<='Z') + *s += 'a'-'A'; + s++; + } + return n; +} + +char* normalize_path(const char*path) +{ + char*n = 0, *d = 0; + if(!is_absolute(path)) { + char buf[512]; + char*c = getcwd(buf,512); + int l = strlen(buf); + d = n = malloc(l+strlen(path)+10); + strcpy(n, buf);d += l; + if(!l || n[l-1]!=path_seperator) { + *d=path_seperator;d++; + } + } else { + d = n = strdup(path); + } + const char*s=path; + char init = 1; + + while(*s) { + if(init && s[0] == '.' && (s[1]==path_seperator || s[1]=='\0')) { + if(!s[1]) break; + s+=2; + init=1; + continue; + } + if(init && s[0] == '.' && s[1] == '.' && (s[2] == path_seperator || s[2]=='\0')) { + // step one down + char*last = 0; + if(d<=n) + return 0; + *--d = 0; + if(!(last=strrchr(n, path_seperator))) { + return 0; + } + d = last+1; + if(!s[2]) break; + s+=3; + init=1; + continue; + } + + *d = *s; + if(*s==path_seperator) init=1; + else init=0; + d++;s++; + } + if(d!=n && d[-1]==path_seperator) + d--; + *d = 0; + +#ifdef LOWERCASE_UPPERCASE + n = filename_to_lowercase(n); +#endif + + return n; +} +static void testnormalize() +{ +#define TEST(x) {printf("%s -> %s\n", (x), normalize_path(x));} + TEST("."); + TEST("../as3"); + TEST("../as3/"); + TEST("../as3/parser.y"); + TEST("../as3/ok/../ok/scope.as"); + TEST("ok/scope.as"); + TEST("ok/./scope.as"); + TEST("./ok/scope.as"); + TEST("./"); + TEST("/tmp/"); + TEST("/./tmp/"); + TEST("../"); + TEST("/"); + TEST("/tmp"); + TEST("/tmp/../usr/"); +} + +char* concat_paths(const char*base, const char*add) +{ + int l1 = strlen(base); + int l2 = strlen(add); + int pos = 0; + char*n = 0; + while(l1 && base[l1-1] == path_seperator) + l1--; + while(pos < l2 && add[pos] == path_seperator) + pos++; + n = (char*)malloc(l1 + (l2-pos) + 2); + memcpy(n,base,l1); + n[l1]=path_seperator; + memcpy(&n[l1+1],&add[pos],l2-pos+1); + return n; +} + +char*find_file(const char*filename, char error) +{ + include_dir_t*i = current_include_dirs; + FILE*fi = 0; + if(is_absolute(filename)) { + FILE*fi = fopen(filename, "rb"); + if(fi) { + fclose(fi); + return strdup(filename); + } + } else { + if(!i && error) { + as3_warning("Include directory stack is empty, while looking for file %s", filename); + } + while(i) { + char*p = concat_paths(i->path, filename); + fi = fopen(p, "rb"); + if(fi) { + fclose(fi); + return p; + } else { + free(p); + } + i = i->next; + } + } + if(!error) { + return 0; + } + + as3_error("Couldn't find file %s", filename); + i = current_include_dirs; + while(i) { + fprintf(stderr, "include dir: %s\n", i->path); + i = i->next; + } + return 0; +} + +void enter_file(const char*name, const char*filename, void*state) +{ + if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { + as3_error("Includes nested too deeply"); + exit(1); + } + include_stack[include_stack_ptr] = state; + line_stack[include_stack_ptr] = current_line; + column_stack[include_stack_ptr] = current_column; + shortfilename_stack[include_stack_ptr] = current_filename_short; + longfilename_stack[include_stack_ptr] = current_filename_long; + filename_stack[include_stack_ptr] = current_filename; + includedir_stack[include_stack_ptr] = current_include_dirs; + + /*char*dir = get_path(filename); + add_include_dir(dir); + free(dir);*/ + + include_stack_ptr++; + + dbg("entering file %s", filename); + + current_line=1; + current_column=0; + current_filename = strdup(name); + current_filename_short = strdup(name); + current_filename_long = strdup(filename); +} + +FILE*enter_file2(const char*name, const char*filename, void*state) +{ + enter_file(name, filename, state); + FILE*fi = fopen(filename, "rb"); + if(!fi) { + as3_error("Couldn't find file %s: %s", filename, strerror(errno)); + } + return fi; +} + +void* leave_file() +{ + dbg("leaving file %s", current_filename); + if(--include_stack_ptr<=0) { + return 0; + } else { + free(current_filename);current_filename = filename_stack[include_stack_ptr]; + free(current_filename_short);current_filename_short = shortfilename_stack[include_stack_ptr]; + free(current_filename_long);current_filename_long = longfilename_stack[include_stack_ptr]; + current_column = column_stack[include_stack_ptr]; + current_line = line_stack[include_stack_ptr]; + del_include_dirs(includedir_stack[include_stack_ptr], current_include_dirs); + current_include_dirs = includedir_stack[include_stack_ptr]; + return include_stack[include_stack_ptr]; + } +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/files.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/files.h new file mode 100644 index 000000000..244df43e9 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/files.h @@ -0,0 +1,48 @@ +/* files.h + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __avm2_files_h__ +#define __avm2_files_h__ + +typedef struct _include_dir { + char*path; + struct _include_dir*next; +} include_dir_t; + +extern int current_line; +extern int current_column; +extern char* current_filename; +extern char* current_filename_short; +extern char* current_filename_long; +extern include_dir_t* current_include_dirs; + +void add_include_dir(char*dir); + +char*find_file(const char*filename, char report_errors); +void enter_file(const char*name, const char*filename, void*state); +FILE* enter_file2(const char*name, const char*filename, void*state); +void* leave_file(); + +char* concat_paths(const char*base, const char*add); +char* normalize_path(const char*path); +char* filename_to_lowercase(const char*name); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/import.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/import.c new file mode 100644 index 000000000..df0271e16 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/import.c @@ -0,0 +1,458 @@ +/* import.c + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "import.h" +#include "abc.h" +#include "registry.h" +#include "common.h" +#include "tokenizer.h" +#include "assets.h" +#include "../os.h" +#include "../xml.h" +#ifdef HAVE_ZZIP +#include "zzip/lib.h" +#endif + +static void import_code(void*_abc, char*filename, int pass, asset_bundle_t*a); + +void as3_import_abc(char*filename) +{ + TAG*tag = swf_InsertTag(0, ST_RAWABC); + memfile_t*file = memfile_open(filename); + tag->data = file->data; + tag->len = file->len; + abc_file_t*abc = swf_ReadABC(tag); + import_code(abc, filename, 0, 0); + import_code(abc, filename, 1, 0); + swf_FreeABC(abc); + memfile_close(file); + free(tag); +} + +typedef struct _deps { + const char*name; + struct _deps*next; +} deps_t; + +void as3_import_swf2(reader_t*r, char*filename, dict_t*deps) +{ + SWF _swf,*swf=&_swf; + if(swf_ReadSWF2(r, &_swf)<0) + return; + swf_FoldAll(swf); + + TAG*tag = swf->firstTag; + + asset_resolver_t* assets = swf_ParseAssets(swf); + + asset_bundle_list_t* asset_bundles = list_new(); + + dict_t*name2bundle = dict_new(); + /* pass 1 */ + while(tag) { + if(tag->id == ST_DOABC || tag->id == ST_RAWABC) { + abc_file_t*abc = swf_ReadABC(tag); + import_code(abc, filename, 0, 0); + NEW(asset_bundle_t, a); + a->file = abc; + if(abc->name) { + dict_put(name2bundle, abc->name, a); + } + list_append(asset_bundles, a); + } + tag = tag->next; + } + + tag = swf->firstTag; + asset_bundle_list_t*b = asset_bundles; + /* pass 2 */ + while(tag) { + if(tag->id == ST_DOABC || tag->id == ST_RAWABC) { + asset_bundle_t*a = b->asset_bundle; + abc_file_t*abc = a->file; + swf_ResolveAssets(assets, abc); + if(deps && abc->name) { + deps_t*d = dict_lookup(deps, abc->name); + while(d) { + if(d->name) { + asset_bundle_t*other = dict_lookup(name2bundle, d->name); + list_append(a->dependencies, other); + } + d = d->next; + } + } + registry_add_asset(a); + import_code(abc, filename, 1, a); + b=b->next; + } + tag = tag->next; + } + + dict_destroy(name2bundle); + list_free(asset_bundles); + + //swf_FreeTags(swf); // FIXME: mem leak +} + +void as3_import_swf(char*filename) +{ + reader_t reader; + reader_init_filereader2(&reader, filename); + as3_import_swf2(&reader, filename, 0); + reader.dealloc(&reader); +} + +#ifdef HAVE_ZZIP +typedef struct _catalog_state { + char*xml_filename; + char in_libraries; + char*library; + char*script; + dict_t*deps; + deps_t*current_deps; + dict_t*name2deps; + dict_t*id2script; + ZZIP_DIR*dir; +} catalog_state_t; + +const char* fa(catalog_state_t*state, xmlattribute_t*attr, const char*name) +{ + while(attr) { + if(!strcmp(attr->name, name)) return attr->value; + attr = attr->next; + } + syntaxerror("error parsing %s: attribute %s missing", state->xml_filename, name); +} + +void catalog_start_tag(xmlconsumer_t*c, char*name, xmlattribute_t*attr) +{ + catalog_state_t*state = (catalog_state_t*)c->internal; + if(!strcmp(name, "libraries")) { + state->in_libraries = 1; + } else if(!strcmp(name, "library")) { + state->library = strdup(fa(state, attr, "path")); + } else if(!strcmp(name, "script")) { + state->script = strdup(fa(state, attr, "name")); + } else if(!strcmp(name, "def")) { + dict_put(state->id2script, strdup(fa(state, attr, "id")), strdup(state->script)); + } else if(!strcmp(name, "dep")) { + NEW(deps_t,d); + d->name = strdup(fa(state, attr, "id")); + d->next = state->current_deps; + state->current_deps = d; + } +} +void catalog_data(xmlconsumer_t*c, char*data, int len) +{ + catalog_state_t*state = (catalog_state_t*)c->internal; +} +void catalog_end_tag(xmlconsumer_t*c, char*name) +{ + catalog_state_t*state = (catalog_state_t*)c->internal; + if(!strcmp(name, "libraries")) { + state->in_libraries = 0; + } else if(!strcmp(name, "library")) { + ZZIP_FILE*file = zzip_file_open(state->dir, state->library, 0); + + DICT_ITERATE_DATA(state->deps,deps_t*,deps) { + while(deps) { + char*script = dict_lookup(state->id2script, deps->name); + if(!script) { + //as3_warning("when importing %s: depencency %s referenced in catalog.xml, but not found.", state->xml_filename, deps->name); + } + deps->name = script; + deps = deps->next; + } + } + + if(!file) { + as3_warning("when importing %s: %s referenced in catalog.xml, but not found.", state->xml_filename, state->library); + } else { + reader_t r; + reader_init_zzipreader(&r, file); + as3_import_swf2(&r, state->library, state->deps); + r.dealloc(&r); + zzip_file_close(file); + } + dict_destroy(state->deps); + state->deps = 0; + free(state->library); + state->library = 0; + } else if(!strcmp(name, "script")) { + dict_put(state->deps, state->script, state->current_deps); + free(state->script); + state->current_deps = 0; + state->script = 0; + } +} +void as3_import_zipfile(char*filename) +{ + ZZIP_DIR*dir = zzip_opendir(filename); + if(!dir) as3_error("Error reading %s\n", filename); + ZZIP_FILE*file = zzip_file_open(dir, "catalog.xml", 0); + reader_t r; + reader_init_zzipreader(&r, file); + + xmlconsumer_t c; + catalog_state_t state; + memset(&state, 0, sizeof(state)); + state.dir = dir; + state.xml_filename = filename; + state.name2deps = dict_new(); + state.id2script = dict_new(); + state.deps = dict_new(); + c.start_tag = catalog_start_tag; + c.data= catalog_data; + c.end_tag = catalog_end_tag; + c.internal = &state; + + xml_parse(&r, &c); + + r.dealloc(&r); +} +#else +void as3_import_zipfile(char*filename) +{ + as3_warning("No zipfile support compiled in- can't import %s\n", filename); +} +#endif + +void as3_import_file(char*filename) +{ + FILE*fi = fopen(filename, "rb"); + if(!fi) return; + char head[3]; + fread(head, 3, 1, fi); + fclose(fi); + if(!strncmp(head, "FWS", 3) || + !strncmp(head, "CWS", 3)) { + as3_import_swf(filename); + } else if(!strncmp(head, "PK", 2)) { + as3_import_zipfile(filename); + } else { + as3_import_abc(filename); + } +} + +static int compare_traits(const void*v1, const void*v2) +{ + trait_t* x1 = *(trait_t**)v1; + trait_t* x2 = *(trait_t**)v2; + int i = strcmp(x1->name->ns->name, x2->name->ns->name); + if(i) + return i; + return strcmp(x1->name->name, x2->name->name); +} + +static classinfo_t*resolve_class(char*filename, char*what, multiname_t*n) +{ + if(!n) return 0; + if(!n->name[0]) return 0; + if(!strcmp(n->name, "void")) + return &voidclass; + + classinfo_t*c = 0; + if(n->ns && n->ns->name) { + c = (classinfo_t*)registry_find(n->ns->name, n->name); + } else if(n->namespace_set) { + namespace_list_t*s = n->namespace_set->namespaces; + while(s) { + c = (classinfo_t*)registry_find(s->namespace->name, n->name); + if(c) + break; + s = s->next; + } + } + + if(!c) { + as3_warning("import %s: couldn't resolve %s %s.%s", filename, what, n->ns->name, n->name); + return 0; + } + if(c->kind != INFOTYPE_CLASS) + as3_warning("import %s: %s %s resolves to something that's not a class", filename, what, n->name); + return c; +} + +static void import_code(void*_abc, char*filename, int pass, asset_bundle_t*asset_bundle) +{ + abc_file_t*abc = _abc; + int t; + if(pass==0) { + for(t=0;tclasses->num;t++) { + abc_class_t*cls = array_getvalue(abc->classes, t); + U8 access = cls->classname->ns->access; + if(access==ACCESS_PRIVATE || + access==ACCESS_PACKAGEINTERNAL) + continue; + //if(!strncmp(cls->classname->ns->name, "__AS3", 5)) + // continue; + + const char*package = strdup(cls->classname->ns->name); + const char*name = strdup(cls->classname->name); + + multiname_list_t*i=cls->interfaces; + classinfo_t*c = classinfo_register(access, package, name, list_length(i)); + c->flags|=FLAG_BUILTIN; + + if(cls->flags & CLASS_FINAL) + c->flags |= FLAG_FINAL; + if(cls->flags & CLASS_INTERFACE) + c->flags |= FLAG_INTERFACE; + if(!(cls->flags & CLASS_SEALED)) + c->flags |= FLAG_DYNAMIC; + } + return; + } + + for(t=0;tclasses->num;t++) { + abc_class_t*cls = array_getvalue(abc->classes, t); + const char*package = strdup(cls->classname->ns->name); + const char*name = strdup(cls->classname->name); + classinfo_t*c = (classinfo_t*)registry_find(package, name); + if(!c) continue; + + c->assets = asset_bundle; + + int nr = 0; + multiname_list_t*i = cls->interfaces; + while(i) { + c->interfaces[nr++] = resolve_class(filename, "interface", i->multiname); + i = i->next; + } + c->superclass = resolve_class(filename, "superclass", cls->superclass); + + trait_list_t*l=0; + char is_static = 0; + l = cls->traits; + if(!l) { + l = cls->static_traits; + is_static = 1; + } + dict_t*names = dict_new(); + while(l) { + trait_t*trait = l->trait; + U8 access = trait->name->ns->access; + + if(access==ACCESS_PRIVATE) + goto cont; + const char*name = trait->name->name; + char* ns = access==ACCESS_NAMESPACE?strdup(trait->name->ns->name):""; + + if(registry_findmember(c, ns, name, 0, is_static)) + goto cont; + + name = strdup(name); + + memberinfo_t*s = 0; + if(trait->kind == TRAIT_METHOD) { + s = (memberinfo_t*)methodinfo_register_onclass(c, access, ns, name, is_static); + s->return_type = resolve_class(filename, "return type", trait->method->return_type); + dict_put(names, name, 0); + } else if(trait->kind == TRAIT_SLOT) { + s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static); + s->type = resolve_class(filename, "type", trait->type_name); + dict_put(names, name, 0); + } else if(trait->kind == TRAIT_GETTER) { + s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static); + s->type = resolve_class(filename, "type", trait->method->return_type); + dict_put(names, name, 0); + } else if(trait->kind == TRAIT_CONST) { + /* some variables (e.g. XML.length) are apparently both a method and a slot. + needs split of static/non-static first */ + if(!dict_contains(names, name)) { + varinfo_t*v = (varinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static); + v->type = resolve_class(filename, "type", trait->type_name); + v->flags |= FLAG_CONST; + /* leave this alone for now- it blows up the file too much + v->value = constant_clone(trait->value);*/ + s = (memberinfo_t*)v; + dict_put(names, name, 0); + } else + goto cont; + + } else { + goto cont; + } + + s->flags = is_static?FLAG_STATIC:0; + s->flags |= FLAG_BUILTIN; + s->parent = c; + + cont: + l = l->next; + if(!l && !is_static) { + l = cls->static_traits; + is_static = 1; + } + } + dict_destroy(names); + } + +# define IS_PUBLIC_MEMBER(trait) ((trait)->kind != TRAIT_CLASS && (trait)->name->ns->access != ACCESS_PRIVATE) + + /* count public functions */ + int num_methods=0; + for(t=0;tscripts->num;t++) { + trait_list_t*l = ((abc_script_t*)array_getvalue(abc->scripts, t))->traits; + for(;l;l=l->next) { + num_methods += IS_PUBLIC_MEMBER(l->trait); + } + } + trait_t**traits = (trait_t**)malloc(num_methods*sizeof(trait_t*)); + num_methods=0; + for(t=0;tscripts->num;t++) { + trait_list_t*l = ((abc_script_t*)array_getvalue(abc->scripts, t))->traits; + for(;l;l=l->next) { + if(IS_PUBLIC_MEMBER(l->trait)) { + traits[num_methods++] = l->trait; + } + } + } + qsort(traits, num_methods, sizeof(trait_t*), compare_traits); + for(t=0;tname->ns->access; + const char*package = strdup(trait->name->ns->name); + const char*name = strdup(trait->name->name); + char np = 0; + memberinfo_t*m = 0; + if(trait->kind == TRAIT_METHOD) { + m = (memberinfo_t*)methodinfo_register_global(access, package, name); + m->return_type = resolve_class(filename, "return type", trait->method->return_type); + } else { + varinfo_t*v = varinfo_register_global(access, package, name); + v->type = resolve_class(filename, "type", trait->type_name); + v->value = constant_clone(trait->value); + v->flags |= trait->kind==TRAIT_CONST?FLAG_CONST:0; + m = (memberinfo_t*)v; + } + m->flags |= FLAG_BUILTIN; + m->parent = 0; + } + } +} + +void as3_import_code(void*_abc) +{ + import_code(_abc, "", 0, 0); + import_code(_abc, "", 1, 0); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/import.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/import.h new file mode 100644 index 000000000..2bfaaa17e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/import.h @@ -0,0 +1,30 @@ +/* import.h + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __as3_import_h__ +#define __as3_import_h__ + +void as3_import_file(char*filename); +void as3_import_swf(char*filename); +void as3_import_abc(char*filename); +void as3_import_code(void*f); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c new file mode 100644 index 000000000..eebfa132a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c @@ -0,0 +1,271 @@ +/* initcode.c + + Routines for handling/compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include "../q.h" +#include "abc.h" +#include "code.h" +#include "common.h" +#include "registry.h" +#include "initcode.h" + +int compare_parsedclass(const void *_v1, const void *_v2) +{ + parsedclass_t*p1 = *(parsedclass_t**)_v1; + parsedclass_t*p2 = *(parsedclass_t**)_v2; + if((p1->cls->flags^p2->cls->flags)&FLAG_INTERFACE) { + return (int)(p2->cls->flags&FLAG_INTERFACE) - (int)(p1->cls->flags&FLAG_INTERFACE); + } + classinfo_t*c2 = dict_lookup(&p1->parents, p2); + classinfo_t*c1 = dict_lookup(&p2->parents, p1); + assert(!c1 || !c2); // otherwise we would have a loop + assert(!c1 || c1==p1->cls); + assert(!c2 || c2==p2->cls); + + if(c1) { + return -1; + } + if(c2) { + return 1; + } + + c2 = dict_lookup(&p1->usedclasses_deep, p2); + c1 = dict_lookup(&p2->usedclasses_deep, p1); + assert(!c1 || !c2); + assert(!c1 || c1==p1->cls); + assert(!c2 || c2==p2->cls); + if(c1) { + return -1; + } + if(c2) { + return 1; + } + + return 0; +} + +static void add_parent(parsedclass_t*p, classinfo_t*c, dict_t*s2p, char soft) +{ + dict_t*parents = soft?(&p->usedclasses_deep):(&p->parents); + int t; + if(dict_contains(parents, p)) { + if(soft) { + as3_warning("circular reference: class %s references self (through static code)", p->cls->name); + return; + } else { + syntaxerror("circular reference: class %s references self", p->cls->name); + } + } + + if(c) { + parsedclass_t*n = dict_lookup(s2p, c); + if(n && !dict_contains(parents, n)) { + assert(n->cls == c); + dict_put(parents, n, c); + } + } else { + c = p->cls; + } + + if(soft && dict_contains(s2p, c)) { + parsedclass_t*pp = dict_lookup(s2p, c); + DICT_ITERATE_KEY(&pp->usedclasses, classinfo_t*, cc) { + add_parent(p, cc, s2p, soft); + } + } + if(c->superclass) { + add_parent(p, c->superclass, s2p, soft); + } + for(t=0;c->interfaces[t];t++) { + add_parent(p, c->interfaces[t], s2p, soft); + } +} + +parsedclass_t* parsedclass_new(classinfo_t*cls, abc_class_t*abc) +{ + NEW(parsedclass_t,p); + p->cls = cls; + p->abc = abc; + dict_init2(&p->parents, &ptr_type, 1); + dict_init2(&p->usedclasses, &ptr_type, 1); + dict_init2(&p->usedclasses_deep, &ptr_type, 1); + return p; +} + +/* sort classes so that + (a) interfaces appear before classes + (b) base classes always appear before their subclasses + (c) classes appear after the classes they use in static code +*/ +parsedclass_t** initcode_sort_classlist(parsedclass_list_t*classes) +{ + dict_t* s2p = dict_new2(&ptr_type); + + /* create hash tables */ + int count = 0; + parsedclass_list_t*l; + for(l=classes;l;l=l->next) { + dict_put(s2p, l->parsedclass->cls, l->parsedclass); + count++; + } + for(l=classes;l;l=l->next) { + add_parent(l->parsedclass, 0, s2p, 0); + DICT_ITERATE_KEY(&l->parsedclass->usedclasses, classinfo_t*, c) { + add_parent(l->parsedclass, c, s2p, 1); + } + } + + parsedclass_t**list = malloc(sizeof(parsedclass_t*)*count); + + /* build an array for each class */ + int i = 0; + for(l=classes;l;l=l->next) { + list[i++] = l->parsedclass; + } + + /* sort and flatten. + We unfortunately need to do insertion sort O(n^2) as + our dependencies are only partially ordered */ + int j; + for(i=0;i0) { + parsedclass_t*p1 = list[i]; + parsedclass_t*p2 = list[j]; + list[i] = p2; + list[j] = p1; + } + } + } + + parsedclass_t**list2 = malloc(sizeof(parsedclass_t*)*(count+1)); + for(i=0;icls->name); + if(p->cls->superclass) + printf(" extends %s\n", p->cls->superclass->name); + int t; + for(t=0;p->cls->interfaces[t];t++) + printf(" interface %s\n", p->cls->interfaces[t]->name); + DICT_ITERATE_KEY(&p->usedclasses, classinfo_t*, c) { + printf(" uses %s\n", c->name); + } + DICT_ITERATE_KEY(&p->parents, parsedclass_t*, pp) { + printf(" depends on (deep) %s\n", pp->cls->name); + } + DICT_ITERATE_KEY(&p->usedclasses_deep, parsedclass_t*, px) { + printf(" uses (deep) %s\n", px->cls->name); + } + printf("\n"); +#endif + } + list2[count]=0; + free(list); + + dict_destroy(s2p); + return list2; +} + +void parsedclass_add_dependency(parsedclass_t*p, classinfo_t*c) +{ + if(!dict_contains(&p->usedclasses, c)) { + dict_put(&p->usedclasses, c, c); + } +} + +void initcode_add_classlist(abc_script_t*init, parsedclass_list_t*_classes) +{ + code_t*c = 0; + + c = abc_getlocal_0(c); + c = abc_pushscope(c); + + parsedclass_t**classes = initcode_sort_classlist(_classes); + + int t; + for(t=0;classes[t];t++) { + abc_class_t*abc = classes[t]->abc; + classinfo_t*cls = classes[t]->cls; + + array_append(init->file->classes, "", abc); + + /* write the construction code for this class to the global init + function */ + MULTINAME(classname2,cls); + trait_t*trait = abc_initscript_addClassTrait(init, &classname2, abc); + + c = abc_getglobalscope(c); + classinfo_t*s = cls->superclass; + + int count=0; + + while(s) { + //TODO: take a look at the current scope stack, maybe + // we can re-use something + s = s->superclass; + if(!s) + break; + + multiname_t*s2 = sig2mname(s); + c = abc_getlex2(c, s2); + multiname_destroy(s2); + + c = abc_pushscope(c); count++; + c = c->prev->prev; // invert + } + /* continue appending after last op end */ + while(c && c->next) c = c->next; + + multiname_t*extends2 = sig2mname(cls->superclass); + /* TODO: if this is one of *our* classes, we can also + do a getglobalscope/getslot (which references + the init function's slots) */ + if(extends2) { + c = abc_getlex2(c, extends2); + c = abc_dup(c); + /* notice: we get a Verify Error #1107 if the top elemnt on the scope + stack is not the superclass */ + c = abc_pushscope(c);count++; + } else { + c = abc_pushnull(c); + /* notice: we get a verify error #1107 if the top element on the scope + stack is not the global object */ + c = abc_getlocal_0(c); + c = abc_pushscope(c);count++; + } + c = abc_newclass(c,abc); + while(count--) { + c = abc_popscope(c); + } + c = abc_setslot(c, trait->slot_id); + multiname_destroy(extends2); + } + c = abc_returnvoid(c); + + free(classes); + + init->method->body->code = c; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h new file mode 100644 index 000000000..03029a6b3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h @@ -0,0 +1,44 @@ +/* initcode.h + + Routines for handling/compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __initcode_h__ +#define __initcode_h__ + +#include "abc.h" +#include "registry.h" + +DECLARE(parsedclass); +DECLARE_LIST(parsedclass); +struct _parsedclass { + classinfo_t*cls; + dict_t parents; + dict_t usedclasses_deep; + dict_t usedclasses; + abc_class_t*abc; +}; + +void initcode_add_classlist(abc_script_t*init, parsedclass_list_t*classes); +parsedclass_t* parsedclass_new(classinfo_t*c, abc_class_t*abc); +void parsedclass_add_dependency(parsedclass_t*p, classinfo_t*c); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c new file mode 100644 index 000000000..93215f09b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c @@ -0,0 +1,1008 @@ +#include "opcodes.h" +code_t* abc_add(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa0); + return self; +} +code_t* abc_add_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xc5); + return self; +} +code_t* abc_astype(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x86); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_astype2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x86); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_astypelate(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x87); + return self; +} +code_t* abc_bitand(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xA8); + return self; +} +code_t* abc_bitnot(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x97); + return self; +} +code_t* abc_bitor(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa9); + return self; +} +code_t* abc_bitxor(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xaa); + return self; +} +code_t* abc_call(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x41); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callmethod(code_t*prev, abc_method_t* m, int v) +{ + code_t*self = add_opcode(prev, 0x43); + self->data[0] = m; + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callproplex(code_t*prev, char* name, int v) +{ + code_t*self = add_opcode(prev, 0x4c); + self->data[0] = multiname_fromstring(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callproplex2(code_t*prev, multiname_t* name, int v) +{ + code_t*self = add_opcode(prev, 0x4c); + self->data[0] = multiname_clone(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callproperty(code_t*prev, char* name, int v) +{ + code_t*self = add_opcode(prev, 0x46); + self->data[0] = multiname_fromstring(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callproperty2(code_t*prev, multiname_t* name, int v) +{ + code_t*self = add_opcode(prev, 0x46); + self->data[0] = multiname_clone(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callpropvoid(code_t*prev, char* name, int v) +{ + code_t*self = add_opcode(prev, 0x4f); + self->data[0] = multiname_fromstring(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callpropvoid2(code_t*prev, multiname_t* name, int v) +{ + code_t*self = add_opcode(prev, 0x4f); + self->data[0] = multiname_clone(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callstatic(code_t*prev, abc_method_body_t* m, int v) +{ + code_t*self = add_opcode(prev, 0x44); + self->data[0] = m; + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callsuper(code_t*prev, char* name, int v) +{ + code_t*self = add_opcode(prev, 0x45); + self->data[0] = multiname_fromstring(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callsuper2(code_t*prev, multiname_t* name, int v) +{ + code_t*self = add_opcode(prev, 0x45); + self->data[0] = multiname_clone(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callsupervoid(code_t*prev, char* name, int v) +{ + code_t*self = add_opcode(prev, 0x4e); + self->data[0] = multiname_fromstring(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_callsupervoid2(code_t*prev, multiname_t* name, int v) +{ + code_t*self = add_opcode(prev, 0x4e); + self->data[0] = multiname_clone(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_checkfilter(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x78); + return self; +} +code_t* abc_coerce(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x80); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_coerce2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x80); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_coerce_a(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x82); + return self; +} +code_t* abc_coerce_s(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x85); + return self; +} +code_t* abc_construct(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x42); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_constructprop(code_t*prev, char* name, int v) +{ + code_t*self = add_opcode(prev, 0x4a); + self->data[0] = multiname_fromstring(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_constructprop2(code_t*prev, multiname_t* name, int v) +{ + code_t*self = add_opcode(prev, 0x4a); + self->data[0] = multiname_clone(name); + self->data[1] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_constructsuper(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x49); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_convert_b(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x76); + return self; +} +code_t* abc_convert_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x73); + return self; +} +code_t* abc_convert_d(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x75); + return self; +} +code_t* abc_convert_o(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x77); + return self; +} +code_t* abc_convert_u(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x74); + return self; +} +code_t* abc_convert_s(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x70); + return self; +} +code_t* abc_debug(code_t*prev, void* debuginfo) +{ + code_t*self = add_opcode(prev, 0xef); + /* FIXME: write debuginfo debuginfo */ + return self; +} +code_t* abc_debugfile(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0xf1); + self->data[0] = string_new4(name); + return self; +} +code_t* abc_debugfile2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0xf1); + self->data[0] = string_dup3(s); + return self; +} +code_t* abc_debugline(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0xf0); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_declocal(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0x94); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_declocal_i(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0xc3); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_decrement(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x93); + return self; +} +code_t* abc_decrement_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xc1); + return self; +} +code_t* abc_deleteproperty(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x6a); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_deleteproperty2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x6a); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_divide(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa3); + return self; +} +code_t* abc_dup(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x2a); + return self; +} +code_t* abc_dxns(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x06); + self->data[0] = string_new4(name); + return self; +} +code_t* abc_dxns2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0x06); + self->data[0] = string_dup3(s); + return self; +} +code_t* abc_dxnslate(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x07); + return self; +} +code_t* abc_equals(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xab); + return self; +} +code_t* abc_esc_xattr(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x72); + return self; +} +code_t* abc_esc_xelem(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x71); + return self; +} +code_t* abc_findproperty(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x5e); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_findproperty2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x5e); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_findpropstrict(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x5d); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_findpropstrict2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x5d); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_getdescendants(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x59); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_getdescendants2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x59); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_getglobalscope(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x64); + return self; +} +code_t* abc_getglobalslot(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x6e); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_getlex(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x60); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_getlex2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x60); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_getlocal(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0x62); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_getlocal_0(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd0); + return self; +} +code_t* abc_getlocal_1(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd1); + return self; +} +code_t* abc_getlocal_2(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd2); + return self; +} +code_t* abc_getlocal_3(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd3); + return self; +} +code_t* abc_getproperty(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x66); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_getproperty2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x66); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_getscopeobject(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x65); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_getslot(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x6c); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_getsuper(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x04); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_getsuper2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x04); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_greaterthan(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xaf); + return self; +} +code_t* abc_greaterequals(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xb0); + return self; +} +code_t* abc_hasnext(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x1f); + return self; +} +code_t* abc_hasnext2(code_t*prev, int reg, int reg2) +{ + code_t*self = add_opcode(prev, 0x32); + self->data[0] = (void*)(ptroff_t)reg; + self->data[1] = (void*)(ptroff_t)reg2; + return self; +} +code_t* abc_ifeq(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x13); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_iffalse(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x12); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifge(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x18); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifgt(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x17); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifle(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x16); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_iflt(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x15); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifnge(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x0f); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifngt(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x0e); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifnle(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x0d); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifnlt(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x0c); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifne(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x14); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifstricteq(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x19); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_ifstrictne(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x1a); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_iftrue(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x11); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_in(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xb4); + return self; +} +code_t* abc_inclocal(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0x92); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_inclocal_i(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0xc2); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_increment(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x91); + return self; +} +code_t* abc_increment_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xc0); + return self; +} +code_t* abc_initproperty(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x68); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_initproperty2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x68); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_instanceof(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xb1); + return self; +} +code_t* abc_istype(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0xb2); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_istype2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0xb2); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_istypelate(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xb3); + return self; +} +code_t* abc_jump(code_t*prev, code_t* label) +{ + code_t*self = add_opcode(prev, 0x10); + self->data[0] = 0; //placeholder + self->branch = label; + return self; +} +code_t* abc_kill(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0x08); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_label(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x09); + return self; +} +code_t* abc_lessequals(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xae); + return self; +} +code_t* abc_lessthan(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xad); + return self; +} +code_t* abc_lookupswitch(code_t*prev, lookupswitch_t* l) +{ + code_t*self = add_opcode(prev, 0x1b); + self->data[0] = l; + return self; +} +code_t* abc_lshift(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa5); + return self; +} +code_t* abc_modulo(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa4); + return self; +} +code_t* abc_multiply(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa2); + return self; +} +code_t* abc_multiply_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xc7); + return self; +} +code_t* abc_negate(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x90); + return self; +} +code_t* abc_negate_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xc4); + return self; +} +code_t* abc_newactivation(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x57); + return self; +} +code_t* abc_newarray(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x56); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_newcatch(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x5a); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_newclass(code_t*prev, abc_class_t* m) +{ + code_t*self = add_opcode(prev, 0x58); + self->data[0] = m; + return self; +} +code_t* abc_newfunction(code_t*prev, abc_method_t* m) +{ + code_t*self = add_opcode(prev, 0x40); + self->data[0] = m; + return self; +} +code_t* abc_newobject(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x55); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_nextname(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x1e); + return self; +} +code_t* abc_nextvalue(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x23); + return self; +} +code_t* abc_nop(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x02); + return self; +} +code_t* abc_not(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x96); + return self; +} +code_t* abc_pop(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x29); + return self; +} +code_t* abc_popscope(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x1d); + return self; +} +code_t* abc_pushbyte(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x24); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_pushdouble(code_t*prev, double f) +{ + code_t*self = add_opcode(prev, 0x2f); + double*fp = malloc(sizeof(double)); + *fp = f; + self->data[0] = fp; + return self; +} +code_t* abc_pushfalse(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x27); + return self; +} +code_t* abc_pushint(code_t*prev, int i) +{ + code_t*self = add_opcode(prev, 0x2d); + self->data[0] = (void*)(ptroff_t)i; + return self; +} +code_t* abc_pushnamespace(code_t*prev, namespace_t* ns) +{ + code_t*self = add_opcode(prev, 0x31); + self->data[0] = namespace_clone(ns); + return self; +} +code_t* abc_pushnan(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x28); + return self; +} +code_t* abc_pushnull(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x20); + return self; +} +code_t* abc_pushscope(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x30); + return self; +} +code_t* abc_pushshort(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x25); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_pushstring(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x2c); + self->data[0] = string_new4(name); + return self; +} +code_t* abc_pushstring2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0x2c); + self->data[0] = string_dup3(s); + return self; +} +code_t* abc_pushtrue(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x26); + return self; +} +code_t* abc_pushuint(code_t*prev, unsigned int u) +{ + code_t*self = add_opcode(prev, 0x2e); + self->data[0] = (void*)(ptroff_t)u; + return self; +} +code_t* abc_pushundefined(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x21); + return self; +} +code_t* abc_pushwith(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x1c); + return self; +} +code_t* abc_returnvalue(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x48); + return self; +} +code_t* abc_returnvoid(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x47); + return self; +} +code_t* abc_rshift(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa6); + return self; +} +code_t* abc_setlocal(code_t*prev, int reg) +{ + code_t*self = add_opcode(prev, 0x63); + self->data[0] = (void*)(ptroff_t)reg; + return self; +} +code_t* abc_setlocal_0(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd4); + return self; +} +code_t* abc_setlocal_1(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd5); + return self; +} +code_t* abc_setlocal_2(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd6); + return self; +} +code_t* abc_setlocal_3(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xd7); + return self; +} +code_t* abc_setglobalslot(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x6f); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_setproperty(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x61); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_setproperty2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x61); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_setslot(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x6d); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc_setsuper(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0x05); + self->data[0] = multiname_fromstring(name); + return self; +} +code_t* abc_setsuper2(code_t*prev, multiname_t* name) +{ + code_t*self = add_opcode(prev, 0x05); + self->data[0] = multiname_clone(name); + return self; +} +code_t* abc_strictequals(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xac); + return self; +} +code_t* abc_subtract(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa1); + return self; +} +code_t* abc_subtract_i(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xc6); + return self; +} +code_t* abc_swap(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x2b); + return self; +} +code_t* abc_throw(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x03); + return self; +} +code_t* abc_typeof(code_t*prev) +{ + code_t*self = add_opcode(prev, 0x95); + return self; +} +code_t* abc_urshift(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xa7); + return self; +} +code_t* abc_applytype(code_t*prev, int v) +{ + code_t*self = add_opcode(prev, 0x53); + self->data[0] = (void*)(ptroff_t)v; + return self; +} +code_t* abc___pushpackage__(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0xfb); + self->data[0] = string_new4(name); + return self; +} +code_t* abc___pushpackage__2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0xfb); + self->data[0] = string_dup3(s); + return self; +} +code_t* abc___rethrow__(code_t*prev) +{ + code_t*self = add_opcode(prev, 0xfc); + return self; +} +code_t* abc___fallthrough__(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0xfd); + self->data[0] = string_new4(name); + return self; +} +code_t* abc___fallthrough__2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0xfd); + self->data[0] = string_dup3(s); + return self; +} +code_t* abc___continue__(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0xfe); + self->data[0] = string_new4(name); + return self; +} +code_t* abc___continue__2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0xfe); + self->data[0] = string_dup3(s); + return self; +} +code_t* abc___break__(code_t*prev, char* name) +{ + code_t*self = add_opcode(prev, 0xff); + self->data[0] = string_new4(name); + return self; +} +code_t* abc___break__2(code_t*prev, string_t* s) +{ + code_t*self = add_opcode(prev, 0xff); + self->data[0] = string_dup3(s); + return self; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h new file mode 100644 index 000000000..b95ed07c9 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h @@ -0,0 +1,531 @@ +#ifndef __opcodes_h__ +#define __opcodes_h__ +#include "abc.h" +#include "pool.h" +#include "code.h" +code_t* abc_add(code_t*prev); +#define add(method) (method->code = abc_add(method->code)) +#define OPCODE_ADD 0xa0 +code_t* abc_add_i(code_t*prev); +#define add_i(method) (method->code = abc_add_i(method->code)) +#define OPCODE_ADD_I 0xc5 +code_t* abc_astype(code_t*prev, char* name); +#define astype(method,name) (method->code = abc_astype(method->code,name)) +#define OPCODE_ASTYPE 0x86 +code_t* abc_astype2(code_t*prev, multiname_t* name); +#define astype2(method,name) (method->code = abc_astype2(method->code,name)) +#define OPCODE_ASTYPE2 0x86 +code_t* abc_astypelate(code_t*prev); +#define astypelate(method) (method->code = abc_astypelate(method->code)) +#define OPCODE_ASTYPELATE 0x87 +code_t* abc_bitand(code_t*prev); +#define bitand(method) (method->code = abc_bitand(method->code)) +#define OPCODE_BITAND 0xA8 +code_t* abc_bitnot(code_t*prev); +#define bitnot(method) (method->code = abc_bitnot(method->code)) +#define OPCODE_BITNOT 0x97 +code_t* abc_bitor(code_t*prev); +#define bitor(method) (method->code = abc_bitor(method->code)) +#define OPCODE_BITOR 0xa9 +code_t* abc_bitxor(code_t*prev); +#define bitxor(method) (method->code = abc_bitxor(method->code)) +#define OPCODE_BITXOR 0xaa +code_t* abc_call(code_t*prev, int v); +#define call(method,v) (method->code = abc_call(method->code,v)) +#define OPCODE_CALL 0x41 +code_t* abc_callmethod(code_t*prev, abc_method_t* m, int v); +#define callmethod(method,m,v) (method->code = abc_callmethod(method->code,m,v)) +#define OPCODE_CALLMETHOD 0x43 +code_t* abc_callproplex(code_t*prev, char* name, int v); +#define callproplex(method,name,v) (method->code = abc_callproplex(method->code,name,v)) +#define OPCODE_CALLPROPLEX 0x4c +code_t* abc_callproplex2(code_t*prev, multiname_t* name, int v); +#define callproplex2(method,name,v) (method->code = abc_callproplex2(method->code,name,v)) +#define OPCODE_CALLPROPLEX2 0x4c +code_t* abc_callproperty(code_t*prev, char* name, int v); +#define callproperty(method,name,v) (method->code = abc_callproperty(method->code,name,v)) +#define OPCODE_CALLPROPERTY 0x46 +code_t* abc_callproperty2(code_t*prev, multiname_t* name, int v); +#define callproperty2(method,name,v) (method->code = abc_callproperty2(method->code,name,v)) +#define OPCODE_CALLPROPERTY2 0x46 +code_t* abc_callpropvoid(code_t*prev, char* name, int v); +#define callpropvoid(method,name,v) (method->code = abc_callpropvoid(method->code,name,v)) +#define OPCODE_CALLPROPVOID 0x4f +code_t* abc_callpropvoid2(code_t*prev, multiname_t* name, int v); +#define callpropvoid2(method,name,v) (method->code = abc_callpropvoid2(method->code,name,v)) +#define OPCODE_CALLPROPVOID2 0x4f +code_t* abc_callstatic(code_t*prev, abc_method_body_t* m, int v); +#define callstatic(method,m,v) (method->code = abc_callstatic(method->code,m,v)) +#define OPCODE_CALLSTATIC 0x44 +code_t* abc_callsuper(code_t*prev, char* name, int v); +#define callsuper(method,name,v) (method->code = abc_callsuper(method->code,name,v)) +#define OPCODE_CALLSUPER 0x45 +code_t* abc_callsuper2(code_t*prev, multiname_t* name, int v); +#define callsuper2(method,name,v) (method->code = abc_callsuper2(method->code,name,v)) +#define OPCODE_CALLSUPER2 0x45 +code_t* abc_callsupervoid(code_t*prev, char* name, int v); +#define callsupervoid(method,name,v) (method->code = abc_callsupervoid(method->code,name,v)) +#define OPCODE_CALLSUPERVOID 0x4e +code_t* abc_callsupervoid2(code_t*prev, multiname_t* name, int v); +#define callsupervoid2(method,name,v) (method->code = abc_callsupervoid2(method->code,name,v)) +#define OPCODE_CALLSUPERVOID2 0x4e +code_t* abc_checkfilter(code_t*prev); +#define checkfilter(method) (method->code = abc_checkfilter(method->code)) +#define OPCODE_CHECKFILTER 0x78 +code_t* abc_coerce(code_t*prev, char* name); +#define coerce(method,name) (method->code = abc_coerce(method->code,name)) +#define OPCODE_COERCE 0x80 +code_t* abc_coerce2(code_t*prev, multiname_t* name); +#define coerce2(method,name) (method->code = abc_coerce2(method->code,name)) +#define OPCODE_COERCE2 0x80 +code_t* abc_coerce_a(code_t*prev); +#define coerce_a(method) (method->code = abc_coerce_a(method->code)) +#define OPCODE_COERCE_A 0x82 +code_t* abc_coerce_s(code_t*prev); +#define coerce_s(method) (method->code = abc_coerce_s(method->code)) +#define OPCODE_COERCE_S 0x85 +code_t* abc_construct(code_t*prev, int v); +#define construct(method,v) (method->code = abc_construct(method->code,v)) +#define OPCODE_CONSTRUCT 0x42 +code_t* abc_constructprop(code_t*prev, char* name, int v); +#define constructprop(method,name,v) (method->code = abc_constructprop(method->code,name,v)) +#define OPCODE_CONSTRUCTPROP 0x4a +code_t* abc_constructprop2(code_t*prev, multiname_t* name, int v); +#define constructprop2(method,name,v) (method->code = abc_constructprop2(method->code,name,v)) +#define OPCODE_CONSTRUCTPROP2 0x4a +code_t* abc_constructsuper(code_t*prev, int v); +#define constructsuper(method,v) (method->code = abc_constructsuper(method->code,v)) +#define OPCODE_CONSTRUCTSUPER 0x49 +code_t* abc_convert_b(code_t*prev); +#define convert_b(method) (method->code = abc_convert_b(method->code)) +#define OPCODE_CONVERT_B 0x76 +code_t* abc_convert_i(code_t*prev); +#define convert_i(method) (method->code = abc_convert_i(method->code)) +#define OPCODE_CONVERT_I 0x73 +code_t* abc_convert_d(code_t*prev); +#define convert_d(method) (method->code = abc_convert_d(method->code)) +#define OPCODE_CONVERT_D 0x75 +code_t* abc_convert_o(code_t*prev); +#define convert_o(method) (method->code = abc_convert_o(method->code)) +#define OPCODE_CONVERT_O 0x77 +code_t* abc_convert_u(code_t*prev); +#define convert_u(method) (method->code = abc_convert_u(method->code)) +#define OPCODE_CONVERT_U 0x74 +code_t* abc_convert_s(code_t*prev); +#define convert_s(method) (method->code = abc_convert_s(method->code)) +#define OPCODE_CONVERT_S 0x70 +code_t* abc_debug(code_t*prev, void* debuginfo); +#define debug(method,debuginfo) (method->code = abc_debug(method->code,debuginfo)) +#define OPCODE_DEBUG 0xef +code_t* abc_debugfile(code_t*prev, char* name); +#define debugfile(method,name) (method->code = abc_debugfile(method->code,name)) +#define OPCODE_DEBUGFILE 0xf1 +code_t* abc_debugfile2(code_t*prev, string_t* s); +#define debugfile2(method,s) (method->code = abc_debugfile2(method->code,s)) +#define OPCODE_DEBUGFILE2 0xf1 +code_t* abc_debugline(code_t*prev, int v); +#define debugline(method,v) (method->code = abc_debugline(method->code,v)) +#define OPCODE_DEBUGLINE 0xf0 +code_t* abc_declocal(code_t*prev, int reg); +#define declocal(method,reg) (method->code = abc_declocal(method->code,reg)) +#define OPCODE_DECLOCAL 0x94 +code_t* abc_declocal_i(code_t*prev, int reg); +#define declocal_i(method,reg) (method->code = abc_declocal_i(method->code,reg)) +#define OPCODE_DECLOCAL_I 0xc3 +code_t* abc_decrement(code_t*prev); +#define decrement(method) (method->code = abc_decrement(method->code)) +#define OPCODE_DECREMENT 0x93 +code_t* abc_decrement_i(code_t*prev); +#define decrement_i(method) (method->code = abc_decrement_i(method->code)) +#define OPCODE_DECREMENT_I 0xc1 +code_t* abc_deleteproperty(code_t*prev, char* name); +#define deleteproperty(method,name) (method->code = abc_deleteproperty(method->code,name)) +#define OPCODE_DELETEPROPERTY 0x6a +code_t* abc_deleteproperty2(code_t*prev, multiname_t* name); +#define deleteproperty2(method,name) (method->code = abc_deleteproperty2(method->code,name)) +#define OPCODE_DELETEPROPERTY2 0x6a +code_t* abc_divide(code_t*prev); +#define divide(method) (method->code = abc_divide(method->code)) +#define OPCODE_DIVIDE 0xa3 +code_t* abc_dup(code_t*prev); +#define dup(method) (method->code = abc_dup(method->code)) +#define OPCODE_DUP 0x2a +code_t* abc_dxns(code_t*prev, char* name); +#define dxns(method,name) (method->code = abc_dxns(method->code,name)) +#define OPCODE_DXNS 0x06 +code_t* abc_dxns2(code_t*prev, string_t* s); +#define dxns2(method,s) (method->code = abc_dxns2(method->code,s)) +#define OPCODE_DXNS2 0x06 +code_t* abc_dxnslate(code_t*prev); +#define dxnslate(method) (method->code = abc_dxnslate(method->code)) +#define OPCODE_DXNSLATE 0x07 +code_t* abc_equals(code_t*prev); +#define equals(method) (method->code = abc_equals(method->code)) +#define OPCODE_EQUALS 0xab +code_t* abc_esc_xattr(code_t*prev); +#define esc_xattr(method) (method->code = abc_esc_xattr(method->code)) +#define OPCODE_ESC_XATTR 0x72 +code_t* abc_esc_xelem(code_t*prev); +#define esc_xelem(method) (method->code = abc_esc_xelem(method->code)) +#define OPCODE_ESC_XELEM 0x71 +code_t* abc_findproperty(code_t*prev, char* name); +#define findproperty(method,name) (method->code = abc_findproperty(method->code,name)) +#define OPCODE_FINDPROPERTY 0x5e +code_t* abc_findproperty2(code_t*prev, multiname_t* name); +#define findproperty2(method,name) (method->code = abc_findproperty2(method->code,name)) +#define OPCODE_FINDPROPERTY2 0x5e +code_t* abc_findpropstrict(code_t*prev, char* name); +#define findpropstrict(method,name) (method->code = abc_findpropstrict(method->code,name)) +#define OPCODE_FINDPROPSTRICT 0x5d +code_t* abc_findpropstrict2(code_t*prev, multiname_t* name); +#define findpropstrict2(method,name) (method->code = abc_findpropstrict2(method->code,name)) +#define OPCODE_FINDPROPSTRICT2 0x5d +code_t* abc_getdescendants(code_t*prev, char* name); +#define getdescendants(method,name) (method->code = abc_getdescendants(method->code,name)) +#define OPCODE_GETDESCENDANTS 0x59 +code_t* abc_getdescendants2(code_t*prev, multiname_t* name); +#define getdescendants2(method,name) (method->code = abc_getdescendants2(method->code,name)) +#define OPCODE_GETDESCENDANTS2 0x59 +code_t* abc_getglobalscope(code_t*prev); +#define getglobalscope(method) (method->code = abc_getglobalscope(method->code)) +#define OPCODE_GETGLOBALSCOPE 0x64 +code_t* abc_getglobalslot(code_t*prev, int v); +#define getglobalslot(method,v) (method->code = abc_getglobalslot(method->code,v)) +#define OPCODE_GETGLOBALSLOT 0x6e +code_t* abc_getlex(code_t*prev, char* name); +#define getlex(method,name) (method->code = abc_getlex(method->code,name)) +#define OPCODE_GETLEX 0x60 +code_t* abc_getlex2(code_t*prev, multiname_t* name); +#define getlex2(method,name) (method->code = abc_getlex2(method->code,name)) +#define OPCODE_GETLEX2 0x60 +code_t* abc_getlocal(code_t*prev, int reg); +#define getlocal(method,reg) (method->code = abc_getlocal(method->code,reg)) +#define OPCODE_GETLOCAL 0x62 +code_t* abc_getlocal_0(code_t*prev); +#define getlocal_0(method) (method->code = abc_getlocal_0(method->code)) +#define OPCODE_GETLOCAL_0 0xd0 +code_t* abc_getlocal_1(code_t*prev); +#define getlocal_1(method) (method->code = abc_getlocal_1(method->code)) +#define OPCODE_GETLOCAL_1 0xd1 +code_t* abc_getlocal_2(code_t*prev); +#define getlocal_2(method) (method->code = abc_getlocal_2(method->code)) +#define OPCODE_GETLOCAL_2 0xd2 +code_t* abc_getlocal_3(code_t*prev); +#define getlocal_3(method) (method->code = abc_getlocal_3(method->code)) +#define OPCODE_GETLOCAL_3 0xd3 +code_t* abc_getproperty(code_t*prev, char* name); +#define getproperty(method,name) (method->code = abc_getproperty(method->code,name)) +#define OPCODE_GETPROPERTY 0x66 +code_t* abc_getproperty2(code_t*prev, multiname_t* name); +#define getproperty2(method,name) (method->code = abc_getproperty2(method->code,name)) +#define OPCODE_GETPROPERTY2 0x66 +code_t* abc_getscopeobject(code_t*prev, int v); +#define getscopeobject(method,v) (method->code = abc_getscopeobject(method->code,v)) +#define OPCODE_GETSCOPEOBJECT 0x65 +code_t* abc_getslot(code_t*prev, int v); +#define getslot(method,v) (method->code = abc_getslot(method->code,v)) +#define OPCODE_GETSLOT 0x6c +code_t* abc_getsuper(code_t*prev, char* name); +#define getsuper(method,name) (method->code = abc_getsuper(method->code,name)) +#define OPCODE_GETSUPER 0x04 +code_t* abc_getsuper2(code_t*prev, multiname_t* name); +#define getsuper2(method,name) (method->code = abc_getsuper2(method->code,name)) +#define OPCODE_GETSUPER2 0x04 +code_t* abc_greaterthan(code_t*prev); +#define greaterthan(method) (method->code = abc_greaterthan(method->code)) +#define OPCODE_GREATERTHAN 0xaf +code_t* abc_greaterequals(code_t*prev); +#define greaterequals(method) (method->code = abc_greaterequals(method->code)) +#define OPCODE_GREATEREQUALS 0xb0 +code_t* abc_hasnext(code_t*prev); +#define hasnext(method) (method->code = abc_hasnext(method->code)) +#define OPCODE_HASNEXT 0x1f +code_t* abc_hasnext2(code_t*prev, int reg, int reg2); +#define hasnext2(method,reg,reg2) (method->code = abc_hasnext2(method->code,reg,reg2)) +#define OPCODE_HASNEXT2 0x32 +code_t* abc_ifeq(code_t*prev, code_t* label); +#define ifeq(method,label) (method->code = abc_ifeq(method->code,label)) +#define OPCODE_IFEQ 0x13 +code_t* abc_iffalse(code_t*prev, code_t* label); +#define iffalse(method,label) (method->code = abc_iffalse(method->code,label)) +#define OPCODE_IFFALSE 0x12 +code_t* abc_ifge(code_t*prev, code_t* label); +#define ifge(method,label) (method->code = abc_ifge(method->code,label)) +#define OPCODE_IFGE 0x18 +code_t* abc_ifgt(code_t*prev, code_t* label); +#define ifgt(method,label) (method->code = abc_ifgt(method->code,label)) +#define OPCODE_IFGT 0x17 +code_t* abc_ifle(code_t*prev, code_t* label); +#define ifle(method,label) (method->code = abc_ifle(method->code,label)) +#define OPCODE_IFLE 0x16 +code_t* abc_iflt(code_t*prev, code_t* label); +#define iflt(method,label) (method->code = abc_iflt(method->code,label)) +#define OPCODE_IFLT 0x15 +code_t* abc_ifnge(code_t*prev, code_t* label); +#define ifnge(method,label) (method->code = abc_ifnge(method->code,label)) +#define OPCODE_IFNGE 0x0f +code_t* abc_ifngt(code_t*prev, code_t* label); +#define ifngt(method,label) (method->code = abc_ifngt(method->code,label)) +#define OPCODE_IFNGT 0x0e +code_t* abc_ifnle(code_t*prev, code_t* label); +#define ifnle(method,label) (method->code = abc_ifnle(method->code,label)) +#define OPCODE_IFNLE 0x0d +code_t* abc_ifnlt(code_t*prev, code_t* label); +#define ifnlt(method,label) (method->code = abc_ifnlt(method->code,label)) +#define OPCODE_IFNLT 0x0c +code_t* abc_ifne(code_t*prev, code_t* label); +#define ifne(method,label) (method->code = abc_ifne(method->code,label)) +#define OPCODE_IFNE 0x14 +code_t* abc_ifstricteq(code_t*prev, code_t* label); +#define ifstricteq(method,label) (method->code = abc_ifstricteq(method->code,label)) +#define OPCODE_IFSTRICTEQ 0x19 +code_t* abc_ifstrictne(code_t*prev, code_t* label); +#define ifstrictne(method,label) (method->code = abc_ifstrictne(method->code,label)) +#define OPCODE_IFSTRICTNE 0x1a +code_t* abc_iftrue(code_t*prev, code_t* label); +#define iftrue(method,label) (method->code = abc_iftrue(method->code,label)) +#define OPCODE_IFTRUE 0x11 +code_t* abc_in(code_t*prev); +#define in(method) (method->code = abc_in(method->code)) +#define OPCODE_IN 0xb4 +code_t* abc_inclocal(code_t*prev, int reg); +#define inclocal(method,reg) (method->code = abc_inclocal(method->code,reg)) +#define OPCODE_INCLOCAL 0x92 +code_t* abc_inclocal_i(code_t*prev, int reg); +#define inclocal_i(method,reg) (method->code = abc_inclocal_i(method->code,reg)) +#define OPCODE_INCLOCAL_I 0xc2 +code_t* abc_increment(code_t*prev); +#define increment(method) (method->code = abc_increment(method->code)) +#define OPCODE_INCREMENT 0x91 +code_t* abc_increment_i(code_t*prev); +#define increment_i(method) (method->code = abc_increment_i(method->code)) +#define OPCODE_INCREMENT_I 0xc0 +code_t* abc_initproperty(code_t*prev, char* name); +#define initproperty(method,name) (method->code = abc_initproperty(method->code,name)) +#define OPCODE_INITPROPERTY 0x68 +code_t* abc_initproperty2(code_t*prev, multiname_t* name); +#define initproperty2(method,name) (method->code = abc_initproperty2(method->code,name)) +#define OPCODE_INITPROPERTY2 0x68 +code_t* abc_instanceof(code_t*prev); +#define instanceof(method) (method->code = abc_instanceof(method->code)) +#define OPCODE_INSTANCEOF 0xb1 +code_t* abc_istype(code_t*prev, char* name); +#define istype(method,name) (method->code = abc_istype(method->code,name)) +#define OPCODE_ISTYPE 0xb2 +code_t* abc_istype2(code_t*prev, multiname_t* name); +#define istype2(method,name) (method->code = abc_istype2(method->code,name)) +#define OPCODE_ISTYPE2 0xb2 +code_t* abc_istypelate(code_t*prev); +#define istypelate(method) (method->code = abc_istypelate(method->code)) +#define OPCODE_ISTYPELATE 0xb3 +code_t* abc_jump(code_t*prev, code_t* label); +#define jump(method,label) (method->code = abc_jump(method->code,label)) +#define OPCODE_JUMP 0x10 +code_t* abc_kill(code_t*prev, int reg); +#define kill(method,reg) (method->code = abc_kill(method->code,reg)) +#define OPCODE_KILL 0x08 +code_t* abc_label(code_t*prev); +#define label(method) (method->code = abc_label(method->code)) +#define OPCODE_LABEL 0x09 +code_t* abc_lessequals(code_t*prev); +#define lessequals(method) (method->code = abc_lessequals(method->code)) +#define OPCODE_LESSEQUALS 0xae +code_t* abc_lessthan(code_t*prev); +#define lessthan(method) (method->code = abc_lessthan(method->code)) +#define OPCODE_LESSTHAN 0xad +code_t* abc_lookupswitch(code_t*prev, lookupswitch_t* l); +#define lookupswitch(method,l) (method->code = abc_lookupswitch(method->code,l)) +#define OPCODE_LOOKUPSWITCH 0x1b +code_t* abc_lshift(code_t*prev); +#define lshift(method) (method->code = abc_lshift(method->code)) +#define OPCODE_LSHIFT 0xa5 +code_t* abc_modulo(code_t*prev); +#define modulo(method) (method->code = abc_modulo(method->code)) +#define OPCODE_MODULO 0xa4 +code_t* abc_multiply(code_t*prev); +#define multiply(method) (method->code = abc_multiply(method->code)) +#define OPCODE_MULTIPLY 0xa2 +code_t* abc_multiply_i(code_t*prev); +#define multiply_i(method) (method->code = abc_multiply_i(method->code)) +#define OPCODE_MULTIPLY_I 0xc7 +code_t* abc_negate(code_t*prev); +#define negate(method) (method->code = abc_negate(method->code)) +#define OPCODE_NEGATE 0x90 +code_t* abc_negate_i(code_t*prev); +#define negate_i(method) (method->code = abc_negate_i(method->code)) +#define OPCODE_NEGATE_I 0xc4 +code_t* abc_newactivation(code_t*prev); +#define newactivation(method) (method->code = abc_newactivation(method->code)) +#define OPCODE_NEWACTIVATION 0x57 +code_t* abc_newarray(code_t*prev, int v); +#define newarray(method,v) (method->code = abc_newarray(method->code,v)) +#define OPCODE_NEWARRAY 0x56 +code_t* abc_newcatch(code_t*prev, int v); +#define newcatch(method,v) (method->code = abc_newcatch(method->code,v)) +#define OPCODE_NEWCATCH 0x5a +code_t* abc_newclass(code_t*prev, abc_class_t* m); +#define newclass(method,m) (method->code = abc_newclass(method->code,m)) +#define OPCODE_NEWCLASS 0x58 +code_t* abc_newfunction(code_t*prev, abc_method_t* m); +#define newfunction(method,m) (method->code = abc_newfunction(method->code,m)) +#define OPCODE_NEWFUNCTION 0x40 +code_t* abc_newobject(code_t*prev, int v); +#define newobject(method,v) (method->code = abc_newobject(method->code,v)) +#define OPCODE_NEWOBJECT 0x55 +code_t* abc_nextname(code_t*prev); +#define nextname(method) (method->code = abc_nextname(method->code)) +#define OPCODE_NEXTNAME 0x1e +code_t* abc_nextvalue(code_t*prev); +#define nextvalue(method) (method->code = abc_nextvalue(method->code)) +#define OPCODE_NEXTVALUE 0x23 +code_t* abc_nop(code_t*prev); +#define nop(method) (method->code = abc_nop(method->code)) +#define OPCODE_NOP 0x02 +code_t* abc_not(code_t*prev); +#define not(method) (method->code = abc_not(method->code)) +#define OPCODE_NOT 0x96 +code_t* abc_pop(code_t*prev); +#define pop(method) (method->code = abc_pop(method->code)) +#define OPCODE_POP 0x29 +code_t* abc_popscope(code_t*prev); +#define popscope(method) (method->code = abc_popscope(method->code)) +#define OPCODE_POPSCOPE 0x1d +code_t* abc_pushbyte(code_t*prev, int v); +#define pushbyte(method,v) (method->code = abc_pushbyte(method->code,v)) +#define OPCODE_PUSHBYTE 0x24 +code_t* abc_pushdouble(code_t*prev, double f); +#define pushdouble(method,f) (method->code = abc_pushdouble(method->code,f)) +#define OPCODE_PUSHDOUBLE 0x2f +code_t* abc_pushfalse(code_t*prev); +#define pushfalse(method) (method->code = abc_pushfalse(method->code)) +#define OPCODE_PUSHFALSE 0x27 +code_t* abc_pushint(code_t*prev, int i); +#define pushint(method,i) (method->code = abc_pushint(method->code,i)) +#define OPCODE_PUSHINT 0x2d +code_t* abc_pushnamespace(code_t*prev, namespace_t* ns); +#define pushnamespace(method,ns) (method->code = abc_pushnamespace(method->code,ns)) +#define OPCODE_PUSHNAMESPACE 0x31 +code_t* abc_pushnan(code_t*prev); +#define pushnan(method) (method->code = abc_pushnan(method->code)) +#define OPCODE_PUSHNAN 0x28 +code_t* abc_pushnull(code_t*prev); +#define pushnull(method) (method->code = abc_pushnull(method->code)) +#define OPCODE_PUSHNULL 0x20 +code_t* abc_pushscope(code_t*prev); +#define pushscope(method) (method->code = abc_pushscope(method->code)) +#define OPCODE_PUSHSCOPE 0x30 +code_t* abc_pushshort(code_t*prev, int v); +#define pushshort(method,v) (method->code = abc_pushshort(method->code,v)) +#define OPCODE_PUSHSHORT 0x25 +code_t* abc_pushstring(code_t*prev, char* name); +#define pushstring(method,name) (method->code = abc_pushstring(method->code,name)) +#define OPCODE_PUSHSTRING 0x2c +code_t* abc_pushstring2(code_t*prev, string_t* s); +#define pushstring2(method,s) (method->code = abc_pushstring2(method->code,s)) +#define OPCODE_PUSHSTRING2 0x2c +code_t* abc_pushtrue(code_t*prev); +#define pushtrue(method) (method->code = abc_pushtrue(method->code)) +#define OPCODE_PUSHTRUE 0x26 +code_t* abc_pushuint(code_t*prev, unsigned int u); +#define pushuint(method,u) (method->code = abc_pushuint(method->code,u)) +#define OPCODE_PUSHUINT 0x2e +code_t* abc_pushundefined(code_t*prev); +#define pushundefined(method) (method->code = abc_pushundefined(method->code)) +#define OPCODE_PUSHUNDEFINED 0x21 +code_t* abc_pushwith(code_t*prev); +#define pushwith(method) (method->code = abc_pushwith(method->code)) +#define OPCODE_PUSHWITH 0x1c +code_t* abc_returnvalue(code_t*prev); +#define returnvalue(method) (method->code = abc_returnvalue(method->code)) +#define OPCODE_RETURNVALUE 0x48 +code_t* abc_returnvoid(code_t*prev); +#define returnvoid(method) (method->code = abc_returnvoid(method->code)) +#define OPCODE_RETURNVOID 0x47 +code_t* abc_rshift(code_t*prev); +#define rshift(method) (method->code = abc_rshift(method->code)) +#define OPCODE_RSHIFT 0xa6 +code_t* abc_setlocal(code_t*prev, int reg); +#define setlocal(method,reg) (method->code = abc_setlocal(method->code,reg)) +#define OPCODE_SETLOCAL 0x63 +code_t* abc_setlocal_0(code_t*prev); +#define setlocal_0(method) (method->code = abc_setlocal_0(method->code)) +#define OPCODE_SETLOCAL_0 0xd4 +code_t* abc_setlocal_1(code_t*prev); +#define setlocal_1(method) (method->code = abc_setlocal_1(method->code)) +#define OPCODE_SETLOCAL_1 0xd5 +code_t* abc_setlocal_2(code_t*prev); +#define setlocal_2(method) (method->code = abc_setlocal_2(method->code)) +#define OPCODE_SETLOCAL_2 0xd6 +code_t* abc_setlocal_3(code_t*prev); +#define setlocal_3(method) (method->code = abc_setlocal_3(method->code)) +#define OPCODE_SETLOCAL_3 0xd7 +code_t* abc_setglobalslot(code_t*prev, int v); +#define setglobalslot(method,v) (method->code = abc_setglobalslot(method->code,v)) +#define OPCODE_SETGLOBALSLOT 0x6f +code_t* abc_setproperty(code_t*prev, char* name); +#define setproperty(method,name) (method->code = abc_setproperty(method->code,name)) +#define OPCODE_SETPROPERTY 0x61 +code_t* abc_setproperty2(code_t*prev, multiname_t* name); +#define setproperty2(method,name) (method->code = abc_setproperty2(method->code,name)) +#define OPCODE_SETPROPERTY2 0x61 +code_t* abc_setslot(code_t*prev, int v); +#define setslot(method,v) (method->code = abc_setslot(method->code,v)) +#define OPCODE_SETSLOT 0x6d +code_t* abc_setsuper(code_t*prev, char* name); +#define setsuper(method,name) (method->code = abc_setsuper(method->code,name)) +#define OPCODE_SETSUPER 0x05 +code_t* abc_setsuper2(code_t*prev, multiname_t* name); +#define setsuper2(method,name) (method->code = abc_setsuper2(method->code,name)) +#define OPCODE_SETSUPER2 0x05 +code_t* abc_strictequals(code_t*prev); +#define strictequals(method) (method->code = abc_strictequals(method->code)) +#define OPCODE_STRICTEQUALS 0xac +code_t* abc_subtract(code_t*prev); +#define subtract(method) (method->code = abc_subtract(method->code)) +#define OPCODE_SUBTRACT 0xa1 +code_t* abc_subtract_i(code_t*prev); +#define subtract_i(method) (method->code = abc_subtract_i(method->code)) +#define OPCODE_SUBTRACT_I 0xc6 +code_t* abc_swap(code_t*prev); +#define swap(method) (method->code = abc_swap(method->code)) +#define OPCODE_SWAP 0x2b +code_t* abc_throw(code_t*prev); +#define throw(method) (method->code = abc_throw(method->code)) +#define OPCODE_THROW 0x03 +code_t* abc_typeof(code_t*prev); +#define typeof(method) (method->code = abc_typeof(method->code)) +#define OPCODE_TYPEOF 0x95 +code_t* abc_urshift(code_t*prev); +#define urshift(method) (method->code = abc_urshift(method->code)) +#define OPCODE_URSHIFT 0xa7 +code_t* abc_applytype(code_t*prev, int v); +#define applytype(method,v) (method->code = abc_applytype(method->code,v)) +#define OPCODE_APPLYTYPE 0x53 +code_t* abc___pushpackage__(code_t*prev, char* name); +#define __pushpackage__(method,name) (method->code = abc___pushpackage__(method->code,name)) +#define OPCODE___PUSHPACKAGE__ 0xfb +code_t* abc___pushpackage__2(code_t*prev, string_t* s); +#define __pushpackage__2(method,s) (method->code = abc___pushpackage__2(method->code,s)) +#define OPCODE___PUSHPACKAGE__2 0xfb +code_t* abc___rethrow__(code_t*prev); +#define __rethrow__(method) (method->code = abc___rethrow__(method->code)) +#define OPCODE___RETHROW__ 0xfc +code_t* abc___fallthrough__(code_t*prev, char* name); +#define __fallthrough__(method,name) (method->code = abc___fallthrough__(method->code,name)) +#define OPCODE___FALLTHROUGH__ 0xfd +code_t* abc___fallthrough__2(code_t*prev, string_t* s); +#define __fallthrough__2(method,s) (method->code = abc___fallthrough__2(method->code,s)) +#define OPCODE___FALLTHROUGH__2 0xfd +code_t* abc___continue__(code_t*prev, char* name); +#define __continue__(method,name) (method->code = abc___continue__(method->code,name)) +#define OPCODE___CONTINUE__ 0xfe +code_t* abc___continue__2(code_t*prev, string_t* s); +#define __continue__2(method,s) (method->code = abc___continue__2(method->code,s)) +#define OPCODE___CONTINUE__2 0xfe +code_t* abc___break__(code_t*prev, char* name); +#define __break__(method,name) (method->code = abc___break__(method->code,name)) +#define OPCODE___BREAK__ 0xff +code_t* abc___break__2(code_t*prev, string_t* s); +#define __break__2(method,s) (method->code = abc___break__2(method->code,s)) +#define OPCODE___BREAK__2 0xff +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h new file mode 100644 index 000000000..1ce738a17 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h @@ -0,0 +1,36 @@ +/* parser.h + + Routines for compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __abc_parser_h__ +#define __abc_parser_h__ + +/* first public class overloading MovieClip, if any */ +extern char*as3_globalclass; + +void set_conditional(const char*part1, const char*part2); + +void initialize_parser(); +void initialize_file(const char*name, const char*filename); +void finish_file(); +void* finish_parser(); +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c new file mode 100644 index 000000000..39a7c89af --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c @@ -0,0 +1,7539 @@ + +/* A Bison parser, made by GNU Bison 2.4.2. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "./skeleton.m4" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse a3_parse +#define yylex a3_lex +#define yyerror a3_error +#define yylval a3_lval +#define yychar a3_char +#define yydebug a3_debug +#define yynerrs a3_nerrs + + +/* Copy the first part of user declarations. */ + +/* Line 198 of skeleton.m4 */ +#line 23 "parser.y" + +#include +#include +#include +#include "abc.h" +#include "pool.h" +#include "files.h" +#include "common.h" +#include "tokenizer.h" +#include "registry.h" +#include "code.h" +#include "opcodes.h" +#include "compiler.h" +#include "expr.h" +#include "initcode.h" +#include "parser_help.h" + +extern int a3_lex(); + + + +/* Line 198 of skeleton.m4 */ +#line 103 "parser.tab.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_IDENTIFIER = 258, + T_STRING = 259, + T_REGEXP = 260, + T_EMPTY = 261, + T_INT = 262, + T_UINT = 263, + T_FLOAT = 264, + T_FOR = 265, + T_WHILE = 266, + T_DO = 267, + T_SWITCH = 268, + KW_IMPLEMENTS = 269, + KW_NAMESPACE = 270, + KW_PACKAGE = 271, + KW_PROTECTED = 272, + KW_ARGUMENTS = 273, + KW_PUBLIC = 274, + KW_PRIVATE = 275, + KW_USE = 276, + KW_INTERNAL = 277, + KW_NEW = 278, + KW_NATIVE = 279, + KW_FUNCTION = 280, + KW_FINALLY = 281, + KW_UNDEFINED = 282, + KW_NAN = 283, + KW_CONTINUE = 284, + KW_CLASS = 285, + KW_CONST = 286, + KW_CATCH = 287, + KW_CASE = 288, + KW_SET = 289, + KW_VOID = 290, + KW_THROW = 291, + KW_STATIC = 292, + KW_WITH = 293, + KW_INSTANCEOF = 294, + KW_IMPORT = 295, + KW_RETURN = 296, + KW_TYPEOF = 297, + KW_INTERFACE = 298, + KW_NULL = 299, + KW_VAR = 300, + KW_DYNAMIC = 301, + KW_OVERRIDE = 302, + KW_FINAL = 303, + KW_EACH = 304, + KW_GET = 305, + KW_TRY = 306, + KW_SUPER = 307, + KW_EXTENDS = 308, + KW_FALSE = 309, + KW_TRUE = 310, + KW_BOOLEAN = 311, + KW_UINT = 312, + KW_INT = 313, + KW_NUMBER = 314, + KW_STRING = 315, + KW_DEFAULT = 316, + KW_DEFAULT_XML = 317, + KW_DELETE = 318, + KW_IF = 319, + KW_ELSE = 320, + KW_BREAK = 321, + KW_IS = 322, + KW_IN = 323, + KW_AS = 324, + T_DICTSTART = 325, + T_EQEQ = 326, + T_EQEQEQ = 327, + T_NE = 328, + T_NEE = 329, + T_LE = 330, + T_GE = 331, + T_ORBY = 332, + T_DIVBY = 333, + T_MODBY = 334, + T_MULBY = 335, + T_ANDBY = 336, + T_PLUSBY = 337, + T_MINUSBY = 338, + T_XORBY = 339, + T_SHRBY = 340, + T_SHLBY = 341, + T_USHRBY = 342, + T_OROR = 343, + T_ANDAND = 344, + T_COLONCOLON = 345, + T_MINUSMINUS = 346, + T_PLUSPLUS = 347, + T_DOTDOT = 348, + T_DOTDOTDOT = 349, + T_SHL = 350, + T_USHR = 351, + T_SHR = 352, + prec_none = 353, + prec_var_read = 354, + below_semicolon = 355, + below_assignment = 356, + below_lt = 357, + below_minus = 358, + minusminus_prefix = 359, + plusplus_prefix = 360, + below_curly = 361, + new2 = 362, + below_identifier = 363, + above_identifier = 364, + below_else = 365, + above_function = 366 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union +/* Line 223 of skeleton.m4 */ +#line 48 "parser.y" +tokenunion +{ + +/* Line 223 of skeleton.m4 */ +#line 48 "parser.y" + + enum yytokentype token; + + classinfo_t*classinfo; + classinfo_list_t*classinfo_list; + slotinfo_t*slotinfo; + slotinfo_list_t*slotinfo_list; + + int number_int; + unsigned int number_uint; + double number_float; + code_t*code; + typedcode_t value; + //typedcode_list_t*value_list; + codeandnumber_t value_list; + param_t* param; + params_t params; + string_t str; + char*id; + constant_t*constant; + for_start_t for_start; + abc_exception_t *exception; + regexp_t regexp; + modifiers_t flags; + namespace_decl_t* namespace_decl; + node_t*node; + struct { + abc_exception_list_t *l; + code_t*finally; + } catch_list; + + + +/* Line 223 of skeleton.m4 */ +#line 287 "parser.tab.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + +/* Line 273 of skeleton.m4 */ +#line 277 "parser.y" + + +#define PASS1 }} if(as3_pass == 1) {{ +#define PASS1END }} if(as3_pass == 2) {{ +#define PASS2 }} if(as3_pass == 2) {{ +#define PASS12 }} if(as3_pass == 1 || as3_pass == 2) {{ +#define PASS12END }} if(as3_pass == 2) {{ +#define PASS_ALWAYS }} {{ + + + +/* Line 273 of skeleton.m4 */ +#line 311 "parser.tab.c" +/* Unqualified %code blocks. */ + +/* Line 274 of skeleton.m4 */ +#line 401 "parser.y" + + char is_subtype_of(classinfo_t*type, classinfo_t*supertype) + { + return 1; // FIXME + } + char do_init_variable(char*name) + { + if(!state->method->no_variable_scoping) + return 0; + if(!state->new_vars) + return 1; + return 1; + } + + +/* Line 274 of skeleton.m4 */ +#line 852 "parser.y" + + static void state_has_imports() + { + state->wildcard_imports = list_clone(state->wildcard_imports); + state->imports = dict_clone(state->imports); + state->has_own_imports = 1; + } + static void import_toplevel(const char*package) + { + char* s = strdup(package); + while(1) { + dict_put(state->import_toplevel_packages, s, 0); + char*x = strrchr(s, '.'); + if(!x) + break; + *x = 0; + } + free(s); + } + + +/* Line 274 of skeleton.m4 */ +#line 995 "parser.y" + + static int slotstate_varconst = 0; + static modifiers_t*slotstate_flags = 0; + static void setslotstate(modifiers_t* flags, int varconst) + { + slotstate_varconst = varconst; + slotstate_flags = flags; + if(state->cls) { + if(flags) { + if(flags->flags&FLAG_STATIC) { + state->method = state->cls->static_init; + } else { + state->method = state->cls->init; + } + } else { + // reset to "default" state (all in class code is static by default) */ + state->method = state->cls->static_init; + } + } else { + as3_assert(state->method); + } + } + static trait_t* add_abc_slot(modifiers_t* modifiers, const char*name, multiname_t*m, code_t***c) + { + int flags = modifiers->flags; + namespace_t ns = modifiers2access(modifiers); + + /* slot name */ + multiname_t mname = {QNAME, &ns, 0, name}; + + trait_list_t**traits; + code_t**code=0; + if(!state->cls) { + // global variable + if(!global->init) global->init = abc_initscript(global->file); + ns.name = state->package; + traits = &global->init->traits; + code = &global->init->method->body->code; + } else if(flags&FLAG_STATIC) { + // static variable + traits = &state->cls->abc->static_traits; + code = &state->cls->static_init->header; + } else { + // instance variable + traits = &state->cls->abc->traits; + code = &state->cls->init->header; + + if(ns.access == ACCESS_PROTECTED) { + ns.name = concat3(state->cls->info->package,":",state->cls->info->name); + } + } + if(c) + *c = code; + if(m) + *m = *multiname_clone(&mname); + + return trait_new_member(traits, 0, multiname_clone(&mname), 0); + } + + +/* Line 274 of skeleton.m4 */ +#line 1169 "parser.y" + + static int xml_level = 0; + + +/* Line 274 of skeleton.m4 */ +#line 1837 "parser.y" + + node_t* resolve_identifier(const char*name); + node_t* get_descendants(node_t*e,const char*ns,const char*subnode,char multi, char attr) + { + typedcode_t v = node_read(e); + typedcode_t w; + + multiname_t m = {0,0,0,subnode}; + namespace_t zero = {ZERONAMESPACE,"*"}; + if(!strcmp(ns,"*")) { + m.ns = &zero; + m.type = attr?QNAMEA:QNAME; + } else { + typedcode_t w = node_read(resolve_identifier(ns)); + if(!TYPE_IS_NAMESPACE(w.t)) { + as3_softwarning("%s might not be a namespace", ns); + } + v.c = code_append(v.c, w.c); + v.c = converttype(v.c, w.t, TYPE_NAMESPACE); + m.type = attr?RTQNAMEA:RTQNAME; + } + + if(!multi) { + v.c = abc_getproperty2(v.c, &m); + } else { + v.c = abc_getdescendants2(v.c, &m); + } + + if(TYPE_IS_XML(v.t)) { + v.t = TYPE_XMLLIST; + } else { + v.c = abc_coerce_a(v.c); + v.t = TYPE_ANY; + } + return mkcodenode(v); + } + + +/* Line 274 of skeleton.m4 */ +#line 2012 "parser.y" + + node_t* var_read(variable_t*v) + { + typedcode_t o; + o.c = abc_getlocal(0, v->index); + o.t = v->type; + return mkcodenode(o); + } + + node_t* resolve_identifier(const char*name) + { + typedcode_t o; + o.t = 0; + o.c = 0; + + slotinfo_t*a = 0; + memberinfo_t*f = 0; + + variable_t*v; + /* look at variables */ + if((v = find_variable(state, name))) { + // name is a local variable + return var_read(v); + } + if((v = find_slot(state->method, name))) { + o.c = abc_getscopeobject(o.c, 1); + o.c = abc_getslot(o.c, v->index); + o.t = v->type; + return mkcodenode(o); + } + + int i_am_static = state->method->is_static; + + if(!state->method->inner && !state->xmlfilter && state->cls) + { + /* look at current class' members */ + if((f = findmember_nsset(state->cls->info, name, 1, i_am_static))) + { + // name is a member or attribute in this class + int var_is_static = (f->flags&FLAG_STATIC); + + if(f->kind == INFOTYPE_VAR && (f->flags&FLAG_CONST)) { + /* if the variable is a constant (and we know what is evaluates to), we + can just use the value itself */ + varinfo_t*v = (varinfo_t*)f; + if(v->value) { + return mkconstnode(v->value); + } + } + + if(var_is_static >= i_am_static) { + if(f->kind == INFOTYPE_METHOD) { + o.t = TYPE_FUNCTION(f); + } else { + o.t = f->type; + } + + if(var_is_static && !i_am_static) { + /* access to a static member from a non-static location. + do this via findpropstrict: + there doesn't seem to be any non-lookup way to access + static properties of a class */ + state->method->late_binding = 1; + o.t = f->type; + namespace_t ns = {f->access, f->package}; + multiname_t m = {QNAME, &ns, 0, name}; + o.c = abc_findpropstrict2(o.c, &m); + o.c = abc_getproperty2(o.c, &m); + return mkcodenode(o); + } else if(f->slot>0) { + o.c = abc_getlocal_0(o.c); + o.c = abc_getslot(o.c, f->slot); + return mkcodenode(o); + } else { + MEMBER_MULTINAME(m, f, name); + o.c = abc_getlocal_0(o.c); + o.c = abc_getproperty2(o.c, &m); + return mkcodenode(o); + } + } + } + /* special case: it's allowed to access non-static constants + from a static context */ + if(i_am_static && (f=findmember_nsset(state->cls->info, name, 1, 0))) { + if(f->kind == INFOTYPE_VAR && (f->flags&FLAG_CONST)) { + varinfo_t*v = (varinfo_t*)f; + if(v->value) { + return mkconstnode(v->value); + } + } + } + } + + /* look at actual classes, in the current package and imported */ + if(!state->xmlfilter && (a = find_class(name))) { + registry_use(a); + if(state->cls && state->cls->info == (classinfo_t*)a && i_am_static) { + o.c = abc_getlocal_0(0); + o.t = TYPE_CLASS((classinfo_t*)a); + } else { + o = push_class(a); + } + return mkcodenode(o); + } + + /* look through package prefixes */ + if(!state->xmlfilter && + (dict_contains(state->import_toplevel_packages, name) || + registry_ispackage(name))) { + o.c = abc___pushpackage__(o.c, (char*)name); + o.t = 0; + return mkcodenode(o); //? + } + + /* unknown object, let the avm2 resolve it */ + if(1) { + if(!state->method->inner && !state->xmlfilter) { + /* we really should make inner functions aware of the class context */ + as3_warning("Couldn't resolve '%s', doing late binding", name); + } + state->method->late_binding = 1; + + multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, name}; + + o.t = 0; + o.c = abc_findpropstrict2(o.c, &m); + o.c = abc_getproperty2(o.c, &m); + return mkcodenode(o); + } + } + + +/* Line 274 of skeleton.m4 */ +#line 2171 "parser.y" + + void add_active_url(const char*url) + { + NEW(namespace_t,n); + n->name = url; + list_append(state->active_namespace_urls, n); + } + + + +/* Line 274 of skeleton.m4 */ +#line 609 "parser.tab.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 162 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 3432 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 137 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 136 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 358 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 615 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 366 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 120, 2, 2, 2, 118, 109, 2, + 124, 136, 117, 115, 102, 114, 129, 116, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 106, 101, + 111, 104, 112, 105, 130, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 126, 2, 127, 108, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 128, 107, 135, 119, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 103, 110, 113, 121, + 122, 123, 125, 131, 132, 133, 134 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 5, 6, 8, 10, 13, 15, 17, + 19, 21, 23, 25, 30, 32, 33, 35, 37, 40, + 42, 44, 46, 48, 50, 55, 60, 62, 64, 65, + 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, + 88, 90, 92, 94, 96, 100, 103, 105, 107, 109, + 111, 113, 115, 117, 122, 125, 127, 129, 130, 134, + 137, 138, 141, 144, 146, 150, 154, 155, 158, 159, + 162, 169, 170, 172, 174, 178, 180, 183, 187, 196, + 203, 209, 216, 218, 221, 223, 226, 227, 229, 231, + 234, 236, 239, 244, 248, 249, 258, 259, 269, 270, + 276, 278, 281, 283, 286, 288, 289, 296, 299, 301, + 306, 309, 311, 313, 315, 317, 321, 323, 324, 331, + 332, 338, 341, 344, 349, 350, 352, 354, 357, 359, + 361, 363, 365, 367, 369, 371, 373, 375, 377, 378, + 381, 382, 385, 386, 389, 390, 400, 401, 410, 411, + 413, 415, 418, 420, 425, 427, 429, 434, 436, 437, + 439, 441, 444, 446, 449, 458, 460, 462, 463, 468, + 470, 474, 478, 479, 482, 484, 486, 488, 490, 492, + 494, 496, 498, 500, 502, 504, 506, 507, 508, 513, + 514, 519, 520, 523, 526, 529, 532, 536, 538, 540, + 541, 543, 550, 561, 573, 575, 578, 580, 584, 588, + 592, 596, 597, 599, 602, 607, 611, 613, 618, 621, + 623, 625, 626, 627, 640, 642, 643, 644, 655, 657, + 661, 663, 665, 667, 671, 673, 675, 677, 680, 681, + 682, 686, 687, 689, 691, 693, 696, 699, 700, 705, + 710, 715, 718, 720, 723, 725, 727, 729, 733, 735, + 739, 740, 742, 744, 746, 748, 750, 752, 756, 762, + 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, + 786, 790, 794, 798, 802, 806, 810, 814, 818, 822, + 826, 830, 833, 836, 840, 844, 848, 852, 856, 860, + 864, 868, 872, 876, 880, 884, 888, 892, 896, 899, + 902, 904, 908, 911, 916, 920, 924, 928, 932, 936, + 940, 944, 948, 952, 956, 960, 964, 970, 973, 976, + 979, 982, 986, 989, 990, 997, 999, 1001, 1003, 1005, + 1009, 1015, 1019, 1025, 1031, 1036, 1043, 1048, 1055, 1062, + 1069, 1073, 1074, 1077, 1080, 1085, 1090, 1093, 1098 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 138, 0, -1, 139, -1, -1, 140, -1, 141, -1, + 140, 141, -1, 189, -1, 201, -1, 199, -1, 235, + -1, 210, -1, 150, -1, 152, 128, 139, 135, -1, + 101, -1, -1, 143, -1, 144, -1, 143, 144, -1, + 201, -1, 199, -1, 235, -1, 210, -1, 150, -1, + 152, 128, 142, 135, -1, 126, 151, 262, 127, -1, + 101, -1, 146, -1, -1, 146, 148, -1, 148, -1, + 271, -1, 192, -1, 164, -1, 165, -1, 166, -1, + 167, -1, 174, -1, 160, -1, 186, -1, 182, -1, + 258, -1, 272, -1, 270, -1, 128, 146, 135, -1, + 128, 135, -1, 101, -1, 147, -1, 154, -1, 168, + -1, 169, -1, 254, -1, 184, -1, 152, 128, 146, + 135, -1, 148, 101, -1, 148, -1, 147, -1, -1, + 3, 90, 3, -1, 104, 262, -1, -1, 45, 155, + -1, 31, 155, -1, 156, -1, 155, 102, 156, -1, + 3, 245, 153, -1, -1, 158, 149, -1, -1, 65, + 157, -1, 64, 124, 256, 136, 157, 159, -1, -1, + 154, -1, 258, -1, 45, 3, 245, -1, 3, -1, + 10, 124, -1, 10, 49, 124, -1, 163, 161, 101, + 256, 101, 258, 136, 157, -1, 163, 162, 68, 256, + 136, 157, -1, 11, 124, 256, 136, 157, -1, 12, + 157, 11, 124, 256, 136, -1, 66, -1, 66, 3, + -1, 29, -1, 29, 3, -1, -1, 171, -1, 173, + -1, 171, 173, -1, 172, -1, 171, 172, -1, 33, + 262, 106, 145, -1, 61, 106, 145, -1, -1, 13, + 124, 175, 262, 136, 128, 170, 135, -1, -1, 32, + 124, 3, 245, 136, 177, 128, 145, 135, -1, -1, + 26, 128, 179, 145, 135, -1, 176, -1, 180, 176, + -1, 180, -1, 180, 178, -1, 178, -1, -1, 51, + 128, 183, 145, 135, 181, -1, 36, 256, -1, 36, + -1, 38, 124, 256, 136, -1, 185, 149, -1, 3, + -1, 16, -1, 15, -1, 28, -1, 188, 129, 187, + -1, 187, -1, -1, 16, 188, 128, 190, 142, 135, + -1, -1, 16, 128, 191, 142, 135, -1, 40, 3, + -1, 40, 241, -1, 40, 188, 129, 117, -1, -1, + 194, -1, 195, -1, 194, 195, -1, 19, -1, 20, + -1, 17, -1, 37, -1, 46, -1, 48, -1, 47, + -1, 24, -1, 22, -1, 3, -1, -1, 53, 242, + -1, -1, 53, 243, -1, -1, 14, 243, -1, -1, + 193, 30, 3, 196, 198, 128, 200, 203, 135, -1, + -1, 193, 43, 3, 197, 128, 202, 206, 135, -1, + -1, 204, -1, 205, -1, 204, 205, -1, 101, -1, + 152, 128, 203, 135, -1, 210, -1, 235, -1, 126, + 151, 262, 127, -1, 147, -1, -1, 207, -1, 208, + -1, 207, 208, -1, 101, -1, 45, 3, -1, 193, + 25, 234, 3, 124, 231, 136, 245, -1, 45, -1, + 31, -1, -1, 193, 209, 211, 212, -1, 213, -1, + 212, 102, 213, -1, 3, 245, 153, -1, -1, 104, + 262, -1, 7, -1, 8, -1, 9, -1, 4, -1, + 55, -1, 54, -1, 44, -1, 27, -1, 28, -1, + 228, -1, 111, -1, 112, -1, -1, -1, 128, 262, + 221, 135, -1, -1, 128, 262, 223, 135, -1, -1, + 224, 220, -1, 224, 4, -1, 224, 112, -1, 228, + 224, -1, 225, 228, 224, -1, 3, -1, 222, -1, + -1, 229, -1, 217, 226, 227, 116, 219, 112, -1, + 217, 226, 227, 218, 224, 111, 116, 226, 219, 112, + -1, 217, 226, 227, 218, 224, 225, 111, 116, 226, + 219, 112, -1, 230, -1, 229, 230, -1, 222, -1, + 222, 104, 4, -1, 222, 104, 222, -1, 3, 104, + 222, -1, 3, 104, 4, -1, -1, 232, -1, 94, + 233, -1, 232, 102, 94, 233, -1, 232, 102, 233, + -1, 233, -1, 3, 106, 244, 214, -1, 3, 214, + -1, 50, -1, 34, -1, -1, -1, 193, 25, 234, + 3, 124, 231, 136, 245, 128, 236, 145, 135, -1, + 3, -1, -1, -1, 25, 237, 124, 231, 136, 245, + 128, 239, 145, 135, -1, 187, -1, 188, 129, 187, + -1, 241, -1, 240, -1, 242, -1, 243, 102, 242, + -1, 242, -1, 117, -1, 35, -1, 106, 244, -1, + -1, -1, 124, 247, 136, -1, -1, 248, -1, 249, + -1, 255, -1, 248, 102, -1, 249, 255, -1, -1, + 23, 262, 250, 246, -1, 262, 124, 247, 136, -1, + 52, 124, 247, 136, -1, 63, 262, -1, 41, -1, + 41, 256, -1, 262, -1, 257, -1, 262, -1, 257, + 102, 262, -1, 262, -1, 258, 102, 262, -1, -1, + 261, -1, 3, -1, 4, -1, 7, -1, 8, -1, + 9, -1, 260, 106, 255, -1, 261, 102, 260, 106, + 255, -1, 238, -1, 266, -1, 251, -1, 253, -1, + 252, -1, 268, -1, 215, -1, 216, -1, 5, -1, + 18, -1, 126, 247, 127, -1, 70, 259, 135, -1, + 262, 111, 262, -1, 262, 112, 262, -1, 262, 75, + 262, -1, 262, 76, 262, -1, 262, 71, 262, -1, + 262, 72, 262, -1, 262, 74, 262, -1, 262, 73, + 262, -1, 262, 88, 262, -1, 262, 89, 262, -1, + 120, 262, -1, 119, 262, -1, 262, 109, 262, -1, + 262, 108, 262, -1, 262, 107, 262, -1, 262, 97, + 262, -1, 262, 96, 262, -1, 262, 95, 262, -1, + 262, 116, 262, -1, 262, 118, 262, -1, 262, 115, + 262, -1, 262, 114, 262, -1, 262, 117, 262, -1, + 262, 68, 262, -1, 262, 69, 262, -1, 262, 39, + 262, -1, 262, 67, 262, -1, 42, 262, -1, 35, + 262, -1, 35, -1, 124, 257, 136, -1, 114, 262, + -1, 262, 126, 262, 127, -1, 262, 80, 262, -1, + 262, 79, 262, -1, 262, 86, 262, -1, 262, 85, + 262, -1, 262, 87, 262, -1, 262, 78, 262, -1, + 262, 77, 262, -1, 262, 84, 262, -1, 262, 81, + 262, -1, 262, 82, 262, -1, 262, 83, 262, -1, + 262, 104, 262, -1, 262, 105, 262, 106, 262, -1, + 262, 92, -1, 262, 91, -1, 92, 262, -1, 91, + 262, -1, 52, 129, 3, -1, 130, 3, -1, -1, + 262, 129, 124, 263, 262, 136, -1, 3, -1, 117, + -1, 187, -1, 117, -1, 262, 90, 262, -1, 262, + 129, 264, 90, 265, -1, 262, 93, 265, -1, 262, + 93, 264, 90, 265, -1, 262, 129, 126, 262, 127, + -1, 262, 129, 130, 265, -1, 262, 129, 130, 264, + 90, 265, -1, 262, 93, 130, 265, -1, 262, 93, + 130, 264, 90, 265, -1, 262, 129, 130, 126, 262, + 127, -1, 262, 93, 130, 126, 262, 127, -1, 262, + 129, 265, -1, -1, 267, 3, -1, 15, 3, -1, + 15, 3, 104, 3, -1, 15, 3, 104, 4, -1, + 193, 269, -1, 62, 15, 104, 262, -1, 21, 15, + 242, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 292, 292, 294, 294, 295, 296, 298, 299, 300, + 301, 302, 303, 304, 305, 307, 307, 308, 309, 311, + 312, 313, 314, 315, 316, 317, 318, 320, 321, 323, + 326, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 346, 347, 348, 349, + 350, 351, 352, 353, 365, 366, 370, 381, 389, 416, + 417, 419, 420, 422, 423, 425, 486, 486, 490, 491, + 494, 510, 511, 512, 517, 521, 526, 527, 529, 549, + 593, 609, 621, 624, 627, 630, 634, 635, 636, 637, + 638, 639, 641, 652, 655, 655, 686, 686, 711, 711, + 727, 728, 729, 730, 738, 747, 747, 796, 801, 812, + 822, 839, 840, 841, 842, 844, 845, 847, 847, 849, + 849, 873, 881, 895, 911, 912, 913, 914, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, 934, 935, + 937, 938, 940, 941, 945, 943, 951, 949, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 968, 974, 975, + 976, 977, 978, 979, 982, 1055, 1055, 1057, 1057, 1059, + 1060, 1062, 1146, 1147, 1155, 1156, 1159, 1160, 1161, 1162, + 1163, 1164, 1165, 1173, 1184, 1185, 1186, 1188, 1188, 1191, + 1191, 1194, 1195, 1198, 1203, 1206, 1209, 1212, 1215, 1219, + 1222, 1226, 1230, 1235, 1241, 1244, 1247, 1250, 1255, 1258, + 1261, 1271, 1275, 1281, 1287, 1295, 1300, 1306, 1314, 1322, + 1323, 1324, 1327, 1326, 1343, 1344, 1346, 1345, 1369, 1389, + 1404, 1405, 1407, 1408, 1410, 1411, 1412, 1421, 1422, 1426, + 1427, 1429, 1430, 1431, 1433, 1437, 1438, 1443, 1444, 1491, + 1541, 1562, 1584, 1587, 1594, 1597, 1600, 1603, 1606, 1609, + 1614, 1615, 1617, 1618, 1619, 1620, 1621, 1623, 1629, 1638, + 1639, 1640, 1641, 1642, 1643, 1645, 1649, 1654, 1672, 1683, + 1693, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, + 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, + 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, + 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, + 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1749, 1750, 1751, + 1752, 1754, 1769, 1777, 1777, 1831, 1832, 1834, 1835, 1876, + 1879, 1882, 1889, 1892, 1903, 1911, 1915, 1922, 1926, 1936, + 1947, 2144, 2145, 2180, 2187, 2194, 2201, 2223, 2230 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_IDENTIFIER", "T_STRING", "T_REGEXP", + "T_EMPTY", "T_INT", "T_UINT", "T_FLOAT", "\"for\"", "\"while\"", + "\"do\"", "\"switch\"", "\"implements\"", "\"namespace\"", "\"package\"", + "\"protected\"", "\"arguments\"", "\"public\"", "\"private\"", "\"use\"", + "\"internal\"", "\"new\"", "\"native\"", "\"function\"", "\"finally\"", + "\"undefined\"", "\"NaN\"", "\"continue\"", "\"class\"", "\"const\"", + "\"catch\"", "\"case\"", "\"set\"", "\"void\"", "\"throw\"", + "\"static\"", "\"with\"", "\"instanceof\"", "\"import\"", "\"return\"", + "\"typeof\"", "\"interface\"", "\"null\"", "\"var\"", "\"dynamic\"", + "\"override\"", "\"final\"", "\"each\"", "\"get\"", "\"try\"", + "\"super\"", "\"extends\"", "\"false\"", "\"true\"", "\"Boolean\"", + "\"uint\"", "\"int\"", "\"Number\"", "\"String\"", "\"default\"", + "\"default xml\"", "\"delete\"", "\"if\"", "\"else\"", "\"break\"", + "\"is\"", "\"in\"", "\"as\"", "\"{ (dictionary)\"", "\"==\"", "\"===\"", + "\"!=\"", "\"!==\"", "\"<=\"", "\">=\"", "\"|=\"", "\"/=\"", "\"%=\"", + "\"*=\"", "\"&=\"", "\"+=\"", "\"-=\"", "\"^=\"", "\">>=\"", "\"<<=\"", + "\">>>=\"", "\"||\"", "\"&&\"", "\"::\"", "\"--\"", "\"++\"", "\"..\"", + "\"...\"", "\"<<\"", "\">>>\"", "\">>\"", "prec_none", "prec_var_read", + "below_semicolon", "';'", "','", "below_assignment", "'='", "'?'", "':'", + "'|'", "'^'", "'&'", "below_lt", "'<'", "'>'", "below_minus", "'-'", + "'+'", "'/'", "'*'", "'%'", "'~'", "'!'", "minusminus_prefix", + "plusplus_prefix", "below_curly", "'('", "new2", "'['", "']'", "'{'", + "'.'", "'@'", "below_identifier", "above_identifier", "below_else", + "above_function", "'}'", "')'", "$accept", "PROGRAM", + "MAYBE_PROGRAM_CODE_LIST", "PROGRAM_CODE_LIST", "PROGRAM_CODE", + "MAYBE_INPACKAGE_CODE_LIST", "INPACKAGE_CODE_LIST", "INPACKAGE_CODE", + "MAYBECODE", "CODE", "CODE_STATEMENT", "CODEPIECE", "CODEBLOCK", + "PACKAGE_INITCODE", "EMBED_START", "CONDITIONAL_COMPILATION", + "MAYBEEXPRESSION", "VARIABLE_DECLARATION", "VARIABLE_LIST", + "ONE_VARIABLE", "IF_CODEBLOCK", "$@1", "MAYBEELSE", "IF", "FOR_INIT", + "FOR_IN_INIT", "FOR_START", "FOR", "FOR_IN", "WHILE", "DO_WHILE", + "BREAK", "CONTINUE", "MAYBE_CASE_LIST", "CASE_LIST", "CASE", "DEFAULT", + "SWITCH", "$@2", "CATCH", "$@3", "FINALLY", "$@4", "CATCH_LIST", + "CATCH_FINALLY_LIST", "TRY", "$@5", "THROW", "WITH_HEAD", "WITH", + "X_IDENTIFIER", "PACKAGE", "PACKAGE_DECLARATION", "$@6", "$@7", "IMPORT", + "MAYBE_MODIFIERS", "MODIFIER_LIST", "MODIFIER", "EXTENDS", + "EXTENDS_LIST", "IMPLEMENTS_LIST", "CLASS_DECLARATION", "$@8", + "INTERFACE_DECLARATION", "$@9", "MAYBE_CLASS_BODY", "CLASS_BODY", + "CLASS_BODY_ITEM", "MAYBE_INTERFACE_BODY", "INTERFACE_BODY", + "IDECLARATION", "VARCONST", "SLOT_DECLARATION", "$@10", "SLOT_LIST", + "ONE_SLOT", "MAYBECONSTANT", "CONSTANT", "XML", "OPEN", "CLOSE", + "CLOSE2", "XMLEXPR1", "$@11", "XMLEXPR2", "$@12", "XMLTEXT", "XML2", + "XML_ID_OR_EXPR", "MAYBE_XMLATTRIBUTES", "XMLNODE", "XMLATTRIBUTES", + "XMLATTRIBUTE", "MAYBE_PARAM_LIST", "PARAM_LIST", "PARAM", "GETSET", + "FUNCTION_DECLARATION", "$@13", "MAYBE_IDENTIFIER", "INNERFUNCTION", + "$@14", "CLASS", "PACKAGEANDCLASS", "CLASS_SPEC", "CLASS_SPEC_LIST", + "TYPE", "MAYBETYPE", "MAYBE_PARAM_VALUES", "MAYBE_EXPRESSION_LIST", + "EXPRESSION_LIST", "EXPRESSION_LIST_AND_COMMA", "XX", "NEW", + "FUNCTIONCALL", "DELETE", "RETURN", "NONCOMMAEXPRESSION", "EXPRESSION", + "COMMA_EXPRESSION", "VOIDEXPRESSION", "MAYBE_DICT_EXPRPAIR_LIST", + "DICTLH", "DICT_EXPRPAIR_LIST", "E", "$@15", "ID_OR_NS", "SUBNODE", + "MEMBER", "NOTHING", "VAR_READ", "NAMESPACE_ID", "NAMESPACE_DECLARATION", + "DEFAULT_NAMESPACE", "USE_NAMESPACE", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 59, 44, 356, 61, 63, 58, 124, 94, 38, + 357, 60, 62, 358, 45, 43, 47, 42, 37, 126, + 33, 359, 360, 361, 40, 362, 91, 93, 123, 46, + 64, 363, 364, 365, 366, 125, 41 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint16 yyr1[] = +{ + 0, 137, 138, 139, 139, 140, 140, 141, 141, 141, + 141, 141, 141, 141, 141, 142, 142, 143, 143, 144, + 144, 144, 144, 144, 144, 144, 144, 145, 145, 146, + 146, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, + 148, 148, 148, 148, 149, 149, 150, 151, 152, 153, + 153, 154, 154, 155, 155, 156, 158, 157, 159, 159, + 160, 161, 161, 161, 162, 162, 163, 163, 164, 165, + 166, 167, 168, 168, 169, 169, 170, 170, 170, 170, + 171, 171, 172, 173, 175, 174, 177, 176, 179, 178, + 180, 180, 181, 181, 181, 183, 182, 184, 184, 185, + 186, 187, 187, 187, 187, 188, 188, 190, 189, 191, + 189, 192, 192, 192, 193, 193, 194, 194, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 196, 196, + 197, 197, 198, 198, 200, 199, 202, 201, 203, 203, + 204, 204, 205, 205, 205, 205, 205, 205, 206, 206, + 207, 207, 208, 208, 208, 209, 209, 211, 210, 212, + 212, 213, 214, 214, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 216, 217, 218, 219, 221, 220, 223, + 222, 224, 224, 224, 224, 225, 225, 226, 226, 227, + 227, 228, 228, 228, 229, 229, 230, 230, 230, 230, + 230, 231, 231, 231, 231, 232, 232, 233, 233, 234, + 234, 234, 236, 235, 237, 237, 239, 238, 240, 241, + 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, + 246, 247, 247, 247, 248, 249, 248, 250, 251, 252, + 252, 253, 254, 254, 255, 256, 257, 257, 258, 258, + 259, 259, 260, 260, 260, 260, 260, 261, 261, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 263, 262, 264, 264, 265, 265, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 266, 267, 268, 269, 269, 269, 270, 271, 272 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 0, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 4, 1, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 4, 4, 1, 1, 0, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 4, 2, 1, 1, 0, 3, 2, + 0, 2, 2, 1, 3, 3, 0, 2, 0, 2, + 6, 0, 1, 1, 3, 1, 2, 3, 8, 6, + 5, 6, 1, 2, 1, 2, 0, 1, 1, 2, + 1, 2, 4, 3, 0, 8, 0, 9, 0, 5, + 1, 2, 1, 2, 1, 0, 6, 2, 1, 4, + 2, 1, 1, 1, 1, 3, 1, 0, 6, 0, + 5, 2, 2, 4, 0, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 0, 2, 0, 2, 0, 9, 0, 8, 0, 1, + 1, 2, 1, 4, 1, 1, 4, 1, 0, 1, + 1, 2, 1, 2, 8, 1, 1, 0, 4, 1, + 3, 3, 0, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 4, 0, + 4, 0, 2, 2, 2, 2, 3, 1, 1, 0, + 1, 6, 10, 11, 1, 2, 1, 3, 3, 3, + 3, 0, 1, 2, 4, 3, 1, 4, 2, 1, + 1, 0, 0, 12, 1, 0, 0, 10, 1, 3, + 1, 1, 1, 3, 1, 1, 1, 2, 0, 0, + 3, 0, 1, 1, 1, 2, 2, 0, 4, 4, + 4, 2, 1, 2, 1, 1, 1, 3, 1, 3, + 0, 1, 1, 1, 1, 1, 1, 3, 5, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, + 1, 3, 2, 4, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 5, 2, 2, 2, + 2, 3, 2, 0, 6, 1, 1, 1, 1, 3, + 5, 3, 5, 5, 4, 6, 4, 6, 6, 6, + 3, 0, 2, 2, 4, 4, 2, 4, 3 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 124, 137, 177, 277, 174, 175, 176, 0, 0, 66, + 0, 0, 130, 278, 128, 129, 0, 136, 351, 135, + 225, 181, 182, 310, 131, 0, 0, 351, 180, 132, + 134, 133, 0, 0, 179, 178, 0, 351, 0, 260, + 351, 351, 14, 184, 351, 351, 351, 351, 241, 124, + 0, 0, 2, 124, 5, 56, 12, 0, 38, 71, + 33, 34, 35, 36, 37, 40, 124, 39, 7, 32, + 0, 125, 126, 9, 8, 11, 275, 276, 0, 183, + 10, 269, 271, 273, 272, 41, 258, 270, 0, 274, + 43, 31, 42, 0, 0, 76, 351, 0, 124, 94, + 111, 113, 112, 114, 119, 116, 0, 0, 247, 224, + 0, 309, 351, 121, 0, 122, 308, 105, 241, 0, + 0, 251, 351, 262, 263, 264, 265, 266, 0, 0, + 261, 330, 329, 312, 292, 291, 0, 256, 0, 242, + 243, 244, 254, 84, 0, 108, 252, 0, 82, 46, + 45, 124, 47, 30, 0, 48, 49, 50, 52, 0, + 51, 332, 1, 6, 124, 75, 0, 72, 0, 0, + 73, 55, 110, 0, 221, 0, 166, 0, 165, 167, + 356, 137, 127, 197, 351, 198, 199, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, + 351, 351, 328, 327, 0, 351, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, + 241, 351, 0, 352, 58, 77, 0, 255, 0, 67, + 351, 124, 117, 0, 228, 0, 231, 230, 358, 239, + 211, 0, 0, 28, 0, 331, 351, 0, 280, 351, + 0, 351, 311, 279, 245, 246, 85, 238, 62, 63, + 107, 253, 61, 83, 44, 29, 124, 0, 238, 351, + 351, 54, 353, 220, 219, 0, 138, 140, 0, 189, + 0, 206, 0, 200, 204, 259, 306, 307, 304, 305, + 285, 286, 288, 287, 283, 284, 320, 319, 315, 314, + 322, 323, 324, 321, 317, 316, 318, 289, 290, 339, + 111, 338, 0, 337, 0, 341, 298, 297, 296, 325, + 0, 295, 294, 293, 281, 282, 302, 301, 299, 303, + 300, 0, 0, 333, 351, 0, 0, 350, 66, 351, + 0, 26, 57, 0, 124, 17, 23, 0, 20, 19, + 22, 21, 124, 115, 0, 241, 248, 172, 0, 0, + 212, 216, 109, 123, 229, 0, 27, 250, 357, 66, + 267, 0, 257, 0, 60, 0, 124, 13, 60, 0, + 0, 0, 0, 0, 142, 0, 0, 238, 168, 169, + 0, 0, 0, 185, 186, 191, 205, 351, 0, 346, + 0, 351, 249, 313, 351, 0, 351, 0, 344, 0, + 80, 0, 0, 351, 120, 18, 124, 0, 0, 351, + 0, 218, 213, 238, 0, 0, 68, 351, 236, 235, + 234, 237, 351, 65, 64, 53, 351, 66, 354, 355, + 211, 139, 0, 0, 232, 141, 146, 60, 0, 190, + 210, 209, 207, 208, 0, 0, 0, 0, 338, 342, + 326, 0, 343, 0, 0, 340, 81, 86, 0, 0, + 118, 240, 173, 172, 0, 0, 215, 0, 0, 100, + 104, 102, 106, 66, 70, 268, 59, 0, 79, 0, + 143, 144, 0, 124, 171, 170, 201, 193, 184, 194, + 351, 192, 0, 191, 349, 347, 334, 348, 345, 351, + 0, 0, 87, 90, 88, 25, 24, 217, 226, 214, + 98, 0, 101, 103, 69, 66, 238, 124, 233, 0, + 162, 0, 0, 124, 160, 0, 187, 184, 191, 195, + 0, 28, 95, 91, 89, 28, 28, 238, 78, 0, + 152, 57, 157, 0, 0, 0, 124, 150, 154, 155, + 163, 221, 147, 161, 186, 0, 0, 196, 28, 93, + 0, 0, 0, 222, 351, 124, 145, 151, 0, 0, + 188, 186, 92, 227, 99, 96, 28, 0, 0, 0, + 202, 0, 0, 0, 156, 153, 211, 203, 28, 223, + 0, 0, 238, 97, 164 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 51, 52, 53, 54, 353, 354, 355, 375, 376, + 152, 153, 172, 356, 423, 154, 443, 155, 272, 269, + 97, 98, 494, 58, 168, 169, 59, 60, 61, 62, + 63, 156, 157, 521, 522, 523, 524, 64, 240, 489, + 602, 490, 556, 491, 492, 65, 253, 158, 66, 67, + 323, 245, 68, 362, 241, 69, 159, 71, 72, 394, + 396, 453, 358, 537, 359, 503, 565, 566, 567, 542, + 543, 544, 179, 360, 288, 398, 399, 431, 76, 77, + 78, 405, 464, 511, 575, 185, 400, 465, 512, 186, + 292, 79, 293, 294, 369, 370, 371, 285, 361, 596, + 110, 81, 555, 246, 247, 440, 455, 441, 384, 366, + 138, 139, 140, 249, 82, 83, 84, 160, 141, 236, + 237, 85, 128, 129, 130, 86, 414, 324, 325, 87, + 88, 89, 180, 90, 91, 92 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -499 +static const yytype_int16 yypact[] = +{ + 431, -19, -499, -499, -499, -499, -499, -22, -35, -499, + -17, 34, -499, -499, -499, -499, 81, -499, 2103, -499, + 75, -499, -499, 2156, -499, -15, 344, 2103, -499, -499, + -499, -499, -11, -3, -499, -499, 109, 2103, 6, 319, + 2103, 2103, -499, -499, 2103, 2103, 2103, 2103, 2022, 719, + 142, 151, -499, 590, -499, -499, -499, 30, -499, 1969, + -499, -499, -499, -499, -499, -499, 1879, -499, -499, -499, + 305, 366, -499, -499, -499, -499, -499, -499, 18, -499, + -499, -499, -499, -499, -499, 69, 2925, -499, 199, -499, + -499, -499, -499, 218, 100, -499, 2103, 222, 1879, -499, + -499, -499, -499, -499, -499, -499, 13, 377, -46, -499, + 111, 708, 2103, 105, 125, -499, 708, -499, 2022, 236, + 136, 708, 2103, -499, -499, -499, -499, -499, 121, 153, + 159, 708, 708, 436, 708, 708, -33, 2862, 135, 163, + 2022, -499, 2862, 269, 270, 2103, 2103, 270, 271, -499, + -499, 848, -499, -499, 147, -499, -499, -499, -499, 267, + -499, -499, -499, -499, 1106, -499, 286, -499, 190, 225, + 69, 193, -499, 294, 86, 296, -499, 298, -499, -499, + -499, -499, -499, -499, 2103, -499, 20, 2103, 2103, 2103, + 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, + 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, + 2103, 2103, -499, -499, 141, 2103, 2103, 2103, 2103, 2103, + 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, + 2022, 2103, 23, -499, -499, -499, 166, 204, 186, -499, + 2103, 1235, -499, 377, 187, 189, -499, -499, -499, 191, + 21, 188, 57, 1751, 195, -499, 2103, 197, -499, 2103, + 319, 2103, -499, -499, -499, -499, -499, 219, 239, -499, + -499, -499, 239, -499, -499, -499, 1879, 210, 219, 2103, + 2103, -499, 242, -499, -499, 346, 299, 317, 348, 2862, + 272, 274, 19, 20, -499, 2862, 1098, 582, 582, 582, + 3303, 3303, 3303, 3303, 1098, 1098, 2862, 2862, 2862, 2862, + 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2988, 3051, -499, + -499, 281, 248, -499, 283, -499, 700, 700, 700, 2862, + 2358, 3114, 3177, 3240, 1098, 1098, 436, 436, 708, 708, + 708, 243, 2421, -499, 2103, 289, 285, -499, -499, 2103, + 2216, -499, 254, 247, 1364, -499, -499, 263, -499, -499, + -499, -499, 1235, -499, 377, 2022, -499, 46, 394, 262, + 306, -499, -499, -499, 280, 265, 1751, -499, 2862, -499, + -499, 310, 2862, 83, 314, 270, 977, -499, -7, 318, + 284, 157, 297, 377, 408, 377, 295, 219, 327, -499, + 302, 15, 42, -499, -499, -499, -499, 2103, 342, -499, + 293, 2103, -499, -499, 2103, 2484, 2103, 343, -499, 293, + -499, 309, 328, 2103, -499, -499, 1235, 322, 324, 2103, + 83, -499, -499, 219, 28, 38, 396, 2103, -499, -499, + -499, -499, 2103, -499, -499, -499, 2103, -499, -499, -499, + 21, -499, 377, 334, -499, 361, -499, 314, 348, -499, + -499, -499, -499, -499, 352, 26, 2547, 293, -499, -499, + 2862, 2287, -499, 2610, 293, -499, -499, 44, 2673, 330, + -499, -499, 2862, 363, 353, 394, -499, 356, 350, -499, + -499, 38, -499, -499, -499, -499, 2862, -28, -499, 336, + 361, -499, 377, 233, -499, -499, -499, -499, 354, -499, + 2103, -499, 365, -499, -499, -499, -499, -499, -499, 2103, + 374, 355, 44, -499, -499, -499, -499, -499, -499, -499, + -499, 484, -499, -499, -499, -499, 219, 1493, -499, 485, + -499, 464, 357, 266, -499, 18, 2862, 375, -499, 110, + 2736, 1751, -499, -499, -499, 1751, 1751, 219, -499, 369, + -499, 254, -499, 371, 50, 367, 1622, -499, -499, -499, + -499, 86, -499, -499, -499, 370, 18, 110, 1751, -499, + 373, 376, 364, -499, 2103, 1493, -499, -499, 501, 397, + -499, -499, -499, -499, -499, -499, 1751, 2799, 378, 382, + -499, 398, 384, 379, -499, -499, 21, -499, 1751, -499, + 380, 383, 219, -499, -499 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -499, -499, 351, -499, 466, -322, -499, 167, -212, -31, + 1, -57, 419, 59, -41, 2, 67, 471, 381, 146, + -334, -499, -499, -499, -499, -499, -499, -499, -499, -499, + -499, -499, -499, -499, -499, 11, 12, -499, -499, 45, + -499, 53, -499, -499, -499, -499, -499, -499, -499, -499, + -6, 56, -499, -499, -499, -499, 0, -499, 475, -499, + -499, -499, 63, -499, 66, -499, -50, -499, -18, -499, + -499, 31, -499, 3, -499, -499, 89, 73, -499, -499, + -499, -499, -498, -499, -499, -170, -499, -461, -499, -497, + -499, -422, -499, 278, -433, -499, -346, -13, 4, -499, + -499, -499, -499, -499, 537, -95, 112, 143, -270, -499, + -105, -499, -499, -499, -499, -499, -499, -499, -130, -54, + 528, -52, -499, 316, -499, -12, -499, 16, -190, -499, + -499, -499, -499, -499, -499, -499 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -352 +static const yytype_int16 yytable[] = +{ + 70, 55, 57, 75, 80, 105, 108, 170, 388, 171, + 265, 111, 248, 254, 420, 116, 291, 499, 151, 460, + 105, 183, 432, 290, 367, 121, 320, 94, 131, 132, + 507, 367, 133, 134, 135, 137, 142, 100, 101, 102, + 427, 171, 347, 513, 211, 436, 462, 214, 574, 101, + 102, 103, 549, 70, 55, 57, 75, 80, 251, 56, + 100, -74, 103, 73, 487, 173, 74, 106, 257, 261, + 488, 93, 101, 102, 187, 174, 589, 519, 109, 591, + 231, 176, 114, 232, 137, 103, 100, 577, 486, 96, + 548, 270, 271, 601, 275, 178, 107, 442, 101, 102, + 137, 244, 95, 262, 479, 520, 142, 99, 535, 112, + 137, 103, 56, 498, 507, 368, 73, 117, 438, 74, + 283, 118, 485, 291, 120, 341, 119, 457, 142, 380, + 122, 403, 409, 137, 137, 404, 284, 508, 509, 529, + 321, 242, 243, 184, 320, 161, 184, 343, 184, 344, + 429, 162, 430, 345, 510, 418, 101, 102, 164, 534, + 448, 449, 104, 484, 70, 55, 57, 75, 80, 103, + 184, 187, 289, 610, 373, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 439, 558, 233, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 142, 342, + 469, 234, 509, 56, 235, 389, 390, 73, 350, 475, + 74, 461, 463, 238, -111, 250, 181, 363, 510, 255, + 256, 70, 55, 357, 378, 386, 374, 142, 346, 382, + 12, 320, 14, 15, 252, 17, 258, 19, 321, 259, + 428, 260, 263, 101, 102, 264, 559, 137, 137, 181, + 24, 322, 266, 267, 273, 276, 103, 515, 539, 29, + 30, 31, 173, 12, 518, 14, 15, 582, 17, 278, + 19, 279, 320, 280, 281, 421, 100, 282, 451, 286, + 454, 287, 348, 24, 101, 102, 261, 495, 101, 102, + 349, 539, 29, 30, 31, 365, -116, 103, 364, 275, + 173, 103, 123, 124, 372, 383, 125, 126, 127, 275, + 174, 377, 415, 379, 540, 175, 176, 137, 408, 579, + 142, 385, 614, 580, 581, 387, 391, 113, 177, 392, + 178, 397, 393, 142, 70, 55, 357, 454, 374, 101, + 102, 417, 70, 55, 357, 321, 592, 540, -158, 181, + 395, -336, 103, 410, 407, 419, 401, 244, 402, 412, + 100, -241, 424, 12, 603, 14, 15, 244, 17, 244, + 19, 426, 101, 102, 497, 466, 611, 367, 433, 470, + 435, -159, 471, 24, 473, 103, 321, 538, 434, -115, + 468, 478, 29, 30, 31, 416, 437, 482, 442, 446, + 447, 450, 452, 456, 244, 142, 70, 55, 357, 458, + 496, -3, 467, 474, 1, 2, 3, 459, 4, 5, + 6, 7, 8, 9, 10, 476, 244, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 477, 480, 21, 22, + 481, 493, 501, 502, 506, 526, 23, 429, 24, 25, + 545, 26, 536, 27, 531, 28, 547, 29, 30, 31, + 551, 528, 32, 33, 530, 34, 35, 557, 570, 571, + 552, 576, 572, 36, 37, 38, 244, 583, 546, 585, + 595, 39, 586, 541, 599, 590, 606, 550, 593, 600, + 607, 594, 608, 605, 609, 277, 612, 239, 613, 163, + 584, 425, 40, 41, 504, 268, 211, 212, 213, 214, + 167, 444, 42, 553, 554, 598, 532, 564, 562, 563, + 568, 569, 43, 541, 533, 44, 182, 505, 587, 142, + 45, 46, 227, 228, 229, 47, 527, 48, 588, 49, + 230, 50, 231, 115, 500, 232, 564, 562, 563, 568, + 569, 406, 597, 483, 573, 136, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 564, 562, 563, 568, 569, + -4, 0, 0, 1, 2, 3, 0, 4, 5, 6, + 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 0, 0, 21, 22, 0, + 0, 188, 0, 0, 0, 23, 0, 24, 25, 0, + 26, 0, 27, 0, 28, 0, 29, 30, 31, 0, + 0, 32, 33, 0, 34, 35, 0, 0, 0, -352, + -352, -352, 36, 37, 38, 0, 0, 196, 197, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 211, 212, 213, 214, 0, 215, 216, 217, + 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, + 0, 42, 0, 223, 224, 0, 225, 226, 227, 228, + 229, 43, 0, 0, 44, 0, 230, 0, 231, 45, + 46, 232, 0, 0, 47, 0, 48, 0, 49, 0, + 50, 0, 1, 2, 3, -4, 4, 5, 6, 7, + 8, 9, 10, 0, 0, 0, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 0, 21, 22, 143, 0, + 144, 0, 0, 0, 23, 145, 24, 25, 0, 26, + 146, 27, 0, 28, 147, 29, 30, 31, 0, 0, + 32, 33, 0, 34, 35, 0, 0, 0, 0, 0, + 0, 36, 37, 38, 0, 148, 0, 0, 0, 39, + 211, 212, 213, 214, 0, 0, 0, 0, 211, 212, + 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 41, 0, 0, 225, 226, 227, 228, 229, 0, + 149, 0, 0, 0, 230, 0, 231, 0, 0, 232, + 43, 0, 230, 44, 231, 0, 0, 232, 45, 46, + 0, 0, 0, 47, 0, 48, 0, 49, 0, 50, + 0, 1, 2, 3, 150, 4, 5, 6, 7, 8, + 9, 10, 0, 0, 0, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 21, 22, 143, 0, 144, + 0, 0, 0, 23, 145, 24, 25, 0, 26, 146, + 27, 0, 28, 147, 29, 30, 31, 0, 0, 32, + 33, 0, 34, 35, 0, 0, 0, 0, 0, 0, + 36, 37, 38, 0, 148, 0, 0, 0, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, + 41, 0, 0, 0, 0, 0, 0, 0, 0, 149, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, + 0, 0, 44, 0, 0, 0, 0, 45, 46, 0, + 0, 0, 47, 0, 48, 0, 49, 0, 50, 0, + 1, 2, 3, 274, 4, 5, 6, 7, 8, 9, + 10, 0, 0, 0, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 0, 21, 22, 143, 0, 144, 0, + 0, 0, 23, 145, 24, 25, 0, 26, 146, 27, + 0, 28, 147, 29, 30, 31, 0, 0, 32, 33, + 0, 34, 35, 0, 0, 0, 0, 0, 0, 36, + 37, 38, 0, 148, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, + 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, + 0, 44, 0, 0, 0, 0, 45, 46, 0, 0, + 0, 47, 0, 48, 0, 49, 0, 50, 0, 1, + 2, 3, 445, 4, 5, 6, 7, 8, 9, 10, + 0, 0, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 0, 0, 21, 22, 0, 0, -352, 0, 0, + 0, 23, 0, 24, 25, 0, 26, 0, 27, 0, + 28, 0, 29, 30, 31, 0, 0, 32, 33, 0, + 34, 35, 0, 0, 0, 0, 0, 0, 36, 37, + 38, 0, 0, -352, -352, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 211, 212, + 213, 214, 0, 215, 216, 217, 0, 40, 41, 0, + 0, 0, 0, 0, 0, 0, 0, 42, 0, -352, + -352, 0, 225, 226, 227, 228, 229, 43, 0, 0, + 44, 0, 230, 0, 231, 45, 46, 232, 0, 0, + 47, 0, 48, 0, 49, 0, 50, 0, 1, 2, + 3, -3, 4, 5, 6, 7, 8, 9, 10, 0, + 0, 0, 12, 13, 14, 15, 16, 17, 18, 19, + 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, + 23, 0, 24, 25, 0, 26, 0, 27, 0, 28, + 0, 29, 30, 31, 0, 0, 32, 33, 0, 34, + 35, 0, 0, 0, 0, 0, 0, 36, 37, 38, + 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 0, 0, 44, + 0, 0, 0, 0, 45, 46, 0, 0, 0, 47, + 0, 352, 0, 49, 0, 50, 0, 1, 2, 3, + -15, 4, 5, 6, 7, 8, 9, 10, 0, 0, + 0, 12, 13, 14, 15, 16, 17, 18, 19, 0, + 0, 21, 22, 0, 0, 0, 0, 0, 0, 23, + 0, 24, 25, 0, 26, 0, 27, 0, 28, 0, + 29, 30, 31, 0, 0, 32, 33, 0, 34, 35, + 0, 0, 0, 0, 0, 0, 36, 37, 38, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, + 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 43, 0, 0, 44, 0, + 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, + 352, 0, 49, 0, 50, 0, 1, 2, 3, -16, + 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, + 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 21, 22, 0, 0, 0, 0, 0, 0, 23, 0, + 24, 25, 0, 26, 0, 27, 0, 28, 0, 29, + 30, 31, 0, 0, 32, 33, 0, 34, 35, 0, + 0, 0, 0, 0, 0, 36, 37, 38, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 0, 44, 0, 0, + 0, 0, 45, 46, 0, 0, 0, 47, 0, 561, + 0, 49, 0, 50, 0, 1, 2, 3, -148, 4, + 5, 6, 7, 8, 9, 10, 0, 0, 0, 12, + 13, 14, 15, 16, 17, 18, 19, 0, 0, 21, + 22, 0, 0, 0, 0, 0, 0, 23, 0, 24, + 25, 0, 26, 0, 27, 0, 28, 0, 29, 30, + 31, 0, 0, 32, 33, 0, 34, 35, 0, 0, + 0, 0, 0, 0, 36, 37, 38, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 43, 0, 0, 44, 0, 0, 0, + 0, 45, 46, 0, 0, 0, 47, 0, 561, 0, + 49, 0, 50, 0, 1, 2, 3, -149, 4, 5, + 6, 7, 8, 9, 10, 0, -124, 0, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, + 143, 0, 144, 0, 0, 0, 23, 145, 24, 25, + 0, 26, 146, 27, 0, 28, 147, 29, 30, 31, + 0, 0, 32, 33, 0, 34, 35, 0, 0, 0, + 0, 0, 0, 36, 37, 38, 0, 148, 0, 0, + 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, + 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 44, 0, 0, 0, 0, + 45, 46, 0, 0, 0, 47, 0, 48, 0, 49, + 0, 50, 1, 2, 3, 0, 4, 5, 6, 7, + 8, 9, 10, 0, 0, 0, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 0, 21, 22, 143, 0, + 144, 0, 0, 0, 23, 145, 24, 25, 0, 26, + 146, 27, 0, 28, 147, 29, 30, 31, 0, 0, + 32, 33, 0, 34, 35, 0, 0, 0, 0, 0, + 0, 36, 37, 38, 0, 148, 0, 0, 0, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 41, 165, 2, 3, 0, 4, 5, 6, 0, + 149, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 43, 0, 18, 44, 20, 0, 21, 22, 45, 46, + 144, 0, 0, 47, 23, 48, 0, 49, 0, 50, + 0, 27, 0, 28, 166, 0, 0, 0, 0, 0, + 0, 33, 0, 34, 35, -351, 2, 3, 0, 4, + 5, 6, 37, 0, 0, 0, 0, 0, 0, 39, + 13, 0, 0, 0, 0, 18, 0, 20, 0, 21, + 22, 0, 0, 0, 0, 0, 0, 23, 0, 0, + 40, 41, 0, 0, 27, 0, 28, 0, 0, 0, + 0, 0, 0, 0, 33, 0, 34, 35, 0, 0, + 43, 0, 0, 44, 0, 37, 0, 0, 45, 46, + 0, 0, 39, 47, 0, 48, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, + 4, 5, 6, 40, 41, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 18, 0, 20, 0, + 21, 22, 0, 43, 0, 0, 44, 0, 23, 0, + 0, 45, 46, 0, 0, 27, 47, 28, 48, 0, + 0, 0, 50, 0, 0, 33, 0, 34, 35, 0, + 2, 3, 0, 4, 5, 6, 37, 0, 0, 0, + 0, 0, 0, 39, 13, 0, 0, 0, 0, 18, + 0, 20, 0, 21, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 0, 0, 0, 33, 0, + 34, 35, 0, 0, 43, 0, 0, 44, 0, 0, + 0, 0, 45, 46, 0, 0, 39, 47, 0, 48, + 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 40, 41, 0, + 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 0, 48, 189, 190, 191, 50, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 217, 0, 0, 0, 0, 0, 0, + 218, 219, 0, 220, 221, 222, 188, 223, 224, 0, + 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, + 230, 0, 231, 0, 0, 232, 0, 0, 0, 0, + 0, 0, 422, 0, 189, 190, 191, 0, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 0, 215, 216, 217, 0, 0, 0, 0, 0, + 0, 218, 219, 0, 220, 221, 222, 188, 223, 224, + 0, 225, 226, 227, 228, 229, 0, 0, 0, 0, + 0, 230, 0, 231, 0, 0, 232, 0, 0, 0, + 0, 0, 0, 516, 0, 189, 190, 191, 0, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 217, 0, 0, 0, 0, + 188, 0, 218, 219, 411, 220, 221, 222, 0, 223, + 224, 0, 225, 226, 227, 228, 229, 0, 0, 0, + 0, 0, 230, 0, 231, 0, 0, 232, 189, 190, + 191, 0, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 0, 215, 216, 217, 0, + 0, 0, 0, 188, 0, 218, 219, 0, 220, 221, + 222, 0, 223, 224, 0, 225, 226, 227, 228, 229, + 0, 0, 0, 0, 0, 230, 0, 231, 413, 0, + 232, 189, 190, 191, 0, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 217, 0, 0, 0, 0, 188, 0, 218, 219, + 0, 220, 221, 222, 0, 223, 224, 0, 225, 226, + 227, 228, 229, 0, 0, 0, 0, 0, 230, 0, + 231, 472, 0, 232, 189, 190, 191, 0, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 0, 215, 216, 217, 0, 0, 0, 0, 188, + 0, 218, 219, 0, 220, 221, 222, 0, 223, 224, + 0, 225, 226, 227, 228, 229, 0, 0, 0, 0, + 0, 230, 0, 231, 514, 0, 232, 189, 190, 191, + 0, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 217, 0, 0, + 0, 0, 188, 0, 218, 219, 0, 220, 221, 222, + 0, 223, 224, 0, 225, 226, 227, 228, 229, 0, + 0, 0, 0, 0, 230, 0, 231, 517, 0, 232, + 189, 190, 191, 0, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 0, 215, 216, + 217, 0, 0, 0, 0, 188, 0, 218, 219, 0, + 220, 221, 222, 0, 223, 224, 0, 225, 226, 227, + 228, 229, 0, 0, 0, 0, 0, 230, 0, 231, + 525, 0, 232, 189, 190, 191, 0, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 217, 0, 0, 0, 0, 188, 0, + 218, 219, 578, 220, 221, 222, 0, 223, 224, 0, + 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, + 230, 0, 231, 0, 0, 232, 189, 190, 191, 0, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 0, 215, 216, 217, 0, 0, 0, + 0, 188, 0, 218, 219, 0, 220, 221, 222, 0, + 223, 224, 0, 225, 226, 227, 228, 229, 0, 0, + 0, 0, 0, 230, 0, 231, 604, 0, 232, 189, + 190, 191, 0, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 217, + 0, 0, 0, 0, 188, 0, 218, 219, 0, 220, + 221, 222, 0, 223, 224, 0, 225, 226, 227, 228, + 229, 0, 0, 0, 0, 0, 230, 0, 231, 0, + 0, 232, 189, 190, 191, 0, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 0, + 215, 216, 217, 0, 0, 0, 0, 188, 0, 218, + 219, 0, 220, 221, 222, 0, 0, 224, 0, 225, + 226, 227, 228, 229, 0, 0, 0, 0, 0, 230, + 0, 231, 0, 0, 232, 189, 190, 191, 0, 192, + 193, 194, 195, 196, 197, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 210, 211, 212, + 213, 214, 0, 215, 216, 217, 0, 0, 0, 0, + 188, 0, 0, 0, 0, 220, 221, 222, 0, 223, + 224, 0, 225, 226, 227, 228, 229, 0, 0, 0, + 0, 0, 230, 0, 231, 0, 0, 232, 189, 190, + 191, 0, 192, 193, 194, 195, 196, 197, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 211, 212, 213, 214, 0, 215, 216, 217, 0, + 0, 0, 0, 188, 0, 0, 0, 0, 220, 221, + 222, 0, 223, 224, 0, 225, 226, 227, 228, 229, + 0, 0, 0, 0, 0, 230, 0, 231, 0, 0, + 232, 189, 190, 191, 0, 192, 193, 194, 195, 196, + 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 211, 212, 213, 214, 0, 215, + 216, 217, 0, 0, 0, 0, 188, 0, 0, 0, + 0, 0, 221, 222, 0, 223, 224, 0, 225, 226, + 227, 228, 229, 0, 0, 0, 0, 0, 230, 0, + 231, 0, 0, 232, 189, 190, 191, 0, 192, 193, + 194, 195, 196, 197, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 211, 212, 213, + 214, 0, 215, 216, 217, 0, 0, 0, 0, 188, + 0, 0, 0, 0, 0, 0, 222, 0, 223, 224, + 0, 225, 226, 227, 228, 229, 0, 0, 0, 0, + 0, 230, 0, 231, 0, 0, 232, 189, 190, 191, + 0, 192, 193, 194, 195, 196, 197, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 211, 212, 213, 214, 0, 215, 216, 217, 0, 0, + 0, 0, 188, 0, 0, 0, 0, 0, 0, -352, + 0, 223, 224, 0, 225, 226, 227, 228, 229, 0, + 0, 0, 0, 0, 230, 0, 231, 0, 0, 232, + 189, 190, 191, 0, -352, -352, -352, -352, 196, 197, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 211, 212, 213, 214, 0, 215, 216, + 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 223, 224, 0, 225, 226, 227, + 228, 229, 0, 0, 0, 0, 0, 230, 0, 231, + 0, 0, 232 +}; + +static const yytype_int16 yycheck[] = +{ + 0, 0, 0, 0, 0, 11, 18, 59, 278, 66, + 140, 23, 107, 118, 348, 27, 186, 450, 49, 4, + 26, 3, 368, 3, 3, 37, 3, 49, 40, 41, + 4, 3, 44, 45, 46, 47, 48, 3, 15, 16, + 362, 98, 232, 465, 90, 379, 4, 93, 545, 15, + 16, 28, 513, 53, 53, 53, 53, 53, 112, 0, + 3, 68, 28, 0, 26, 15, 0, 11, 122, 102, + 32, 90, 15, 16, 102, 25, 574, 33, 3, 576, + 126, 31, 26, 129, 96, 28, 3, 548, 434, 124, + 512, 145, 146, 591, 151, 45, 15, 104, 15, 16, + 112, 107, 124, 136, 426, 61, 118, 124, 136, 124, + 122, 28, 53, 447, 4, 94, 53, 128, 35, 53, + 34, 124, 94, 293, 15, 230, 129, 397, 140, 259, + 124, 112, 322, 145, 146, 116, 50, 111, 112, 485, + 117, 128, 129, 128, 3, 3, 128, 124, 128, 126, + 104, 0, 106, 130, 128, 345, 15, 16, 128, 493, + 3, 4, 128, 433, 164, 164, 164, 164, 164, 28, + 128, 102, 184, 606, 117, 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, + 117, 535, 3, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 410, 3, 112, 164, 124, 279, 280, 164, 240, 419, + 164, 401, 402, 11, 129, 124, 3, 243, 128, 3, + 104, 241, 241, 241, 256, 276, 252, 259, 232, 261, + 17, 3, 19, 20, 129, 22, 135, 24, 117, 106, + 365, 102, 127, 15, 16, 102, 536, 279, 280, 3, + 37, 130, 3, 3, 3, 128, 28, 467, 45, 46, + 47, 48, 15, 17, 474, 19, 20, 557, 22, 3, + 24, 101, 3, 68, 101, 349, 3, 3, 393, 3, + 395, 3, 136, 37, 15, 16, 102, 437, 15, 16, + 124, 45, 46, 47, 48, 124, 129, 28, 129, 376, + 15, 28, 3, 4, 136, 106, 7, 8, 9, 386, + 25, 136, 344, 136, 101, 30, 31, 349, 322, 551, + 352, 102, 612, 555, 556, 135, 104, 3, 43, 3, + 45, 3, 53, 365, 354, 354, 354, 452, 364, 15, + 16, 345, 362, 362, 362, 117, 578, 101, 135, 3, + 53, 90, 28, 90, 126, 90, 104, 383, 104, 136, + 3, 127, 135, 17, 596, 19, 20, 393, 22, 395, + 24, 128, 15, 16, 446, 407, 608, 3, 136, 411, + 135, 135, 414, 37, 416, 28, 117, 502, 102, 129, + 117, 423, 46, 47, 48, 126, 106, 429, 104, 101, + 136, 124, 14, 128, 430, 437, 426, 426, 426, 102, + 442, 0, 90, 90, 3, 4, 5, 135, 7, 8, + 9, 10, 11, 12, 13, 136, 452, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 128, 135, 27, 28, + 136, 65, 128, 102, 112, 135, 35, 104, 37, 38, + 116, 40, 136, 42, 124, 44, 111, 46, 47, 48, + 106, 128, 51, 52, 128, 54, 55, 3, 3, 25, + 135, 116, 135, 62, 63, 64, 502, 128, 510, 128, + 136, 70, 135, 503, 3, 135, 124, 519, 135, 112, + 112, 135, 128, 135, 135, 164, 136, 98, 135, 53, + 561, 354, 91, 92, 457, 144, 90, 91, 92, 93, + 59, 385, 101, 522, 522, 585, 491, 537, 537, 537, + 537, 537, 111, 543, 491, 114, 71, 458, 566, 561, + 119, 120, 116, 117, 118, 124, 483, 126, 571, 128, + 124, 130, 126, 26, 452, 129, 566, 566, 566, 566, + 566, 293, 584, 430, 543, 47, 260, -1, -1, -1, + -1, -1, -1, -1, -1, 585, 585, 585, 585, 585, + 0, -1, -1, 3, 4, 5, -1, 7, 8, 9, + 10, 11, 12, 13, -1, -1, 16, 17, 18, 19, + 20, 21, 22, 23, 24, -1, -1, 27, 28, -1, + -1, 39, -1, -1, -1, 35, -1, 37, 38, -1, + 40, -1, 42, -1, 44, -1, 46, 47, 48, -1, + -1, 51, 52, -1, 54, 55, -1, -1, -1, 67, + 68, 69, 62, 63, 64, -1, -1, 75, 76, -1, + 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 90, 91, 92, 93, -1, 95, 96, 97, + -1, 91, 92, -1, -1, -1, -1, -1, -1, -1, + -1, 101, -1, 111, 112, -1, 114, 115, 116, 117, + 118, 111, -1, -1, 114, -1, 124, -1, 126, 119, + 120, 129, -1, -1, 124, -1, 126, -1, 128, -1, + 130, -1, 3, 4, 5, 135, 7, 8, 9, 10, + 11, 12, 13, -1, -1, -1, 17, 18, 19, 20, + 21, 22, 23, 24, 25, -1, 27, 28, 29, -1, + 31, -1, -1, -1, 35, 36, 37, 38, -1, 40, + 41, 42, -1, 44, 45, 46, 47, 48, -1, -1, + 51, 52, -1, 54, 55, -1, -1, -1, -1, -1, + -1, 62, 63, 64, -1, 66, -1, -1, -1, 70, + 90, 91, 92, 93, -1, -1, -1, -1, 90, 91, + 92, 93, -1, -1, -1, -1, -1, -1, -1, -1, + 91, 92, -1, -1, 114, 115, 116, 117, 118, -1, + 101, -1, -1, -1, 124, -1, 126, -1, -1, 129, + 111, -1, 124, 114, 126, -1, -1, 129, 119, 120, + -1, -1, -1, 124, -1, 126, -1, 128, -1, 130, + -1, 3, 4, 5, 135, 7, 8, 9, 10, 11, + 12, 13, -1, -1, -1, 17, 18, 19, 20, 21, + 22, 23, 24, 25, -1, 27, 28, 29, -1, 31, + -1, -1, -1, 35, 36, 37, 38, -1, 40, 41, + 42, -1, 44, 45, 46, 47, 48, -1, -1, 51, + 52, -1, 54, 55, -1, -1, -1, -1, -1, -1, + 62, 63, 64, -1, 66, -1, -1, -1, 70, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, + 92, -1, -1, -1, -1, -1, -1, -1, -1, 101, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 111, + -1, -1, 114, -1, -1, -1, -1, 119, 120, -1, + -1, -1, 124, -1, 126, -1, 128, -1, 130, -1, + 3, 4, 5, 135, 7, 8, 9, 10, 11, 12, + 13, -1, -1, -1, 17, 18, 19, 20, 21, 22, + 23, 24, 25, -1, 27, 28, 29, -1, 31, -1, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + -1, 44, 45, 46, 47, 48, -1, -1, 51, 52, + -1, 54, 55, -1, -1, -1, -1, -1, -1, 62, + 63, 64, -1, 66, -1, -1, -1, 70, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 111, -1, + -1, 114, -1, -1, -1, -1, 119, 120, -1, -1, + -1, 124, -1, 126, -1, 128, -1, 130, -1, 3, + 4, 5, 135, 7, 8, 9, 10, 11, 12, 13, + -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, + 24, -1, -1, 27, 28, -1, -1, 39, -1, -1, + -1, 35, -1, 37, 38, -1, 40, -1, 42, -1, + 44, -1, 46, 47, 48, -1, -1, 51, 52, -1, + 54, 55, -1, -1, -1, -1, -1, -1, 62, 63, + 64, -1, -1, 75, 76, -1, 70, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 90, 91, + 92, 93, -1, 95, 96, 97, -1, 91, 92, -1, + -1, -1, -1, -1, -1, -1, -1, 101, -1, 111, + 112, -1, 114, 115, 116, 117, 118, 111, -1, -1, + 114, -1, 124, -1, 126, 119, 120, 129, -1, -1, + 124, -1, 126, -1, 128, -1, 130, -1, 3, 4, + 5, 135, 7, 8, 9, 10, 11, 12, 13, -1, + -1, -1, 17, 18, 19, 20, 21, 22, 23, 24, + -1, -1, 27, 28, -1, -1, -1, -1, -1, -1, + 35, -1, 37, 38, -1, 40, -1, 42, -1, 44, + -1, 46, 47, 48, -1, -1, 51, 52, -1, 54, + 55, -1, -1, -1, -1, -1, -1, 62, 63, 64, + -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 91, 92, -1, -1, + -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 111, -1, -1, 114, + -1, -1, -1, -1, 119, 120, -1, -1, -1, 124, + -1, 126, -1, 128, -1, 130, -1, 3, 4, 5, + 135, 7, 8, 9, 10, 11, 12, 13, -1, -1, + -1, 17, 18, 19, 20, 21, 22, 23, 24, -1, + -1, 27, 28, -1, -1, -1, -1, -1, -1, 35, + -1, 37, 38, -1, 40, -1, 42, -1, 44, -1, + 46, 47, 48, -1, -1, 51, 52, -1, 54, 55, + -1, -1, -1, -1, -1, -1, 62, 63, 64, -1, + -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 91, 92, -1, -1, -1, + -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 111, -1, -1, 114, -1, + -1, -1, -1, 119, 120, -1, -1, -1, 124, -1, + 126, -1, 128, -1, 130, -1, 3, 4, 5, 135, + 7, 8, 9, 10, 11, 12, 13, -1, -1, -1, + 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, + 27, 28, -1, -1, -1, -1, -1, -1, 35, -1, + 37, 38, -1, 40, -1, 42, -1, 44, -1, 46, + 47, 48, -1, -1, 51, 52, -1, 54, 55, -1, + -1, -1, -1, -1, -1, 62, 63, 64, -1, -1, + -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 91, 92, -1, -1, -1, -1, + -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 111, -1, -1, 114, -1, -1, + -1, -1, 119, 120, -1, -1, -1, 124, -1, 126, + -1, 128, -1, 130, -1, 3, 4, 5, 135, 7, + 8, 9, 10, 11, 12, 13, -1, -1, -1, 17, + 18, 19, 20, 21, 22, 23, 24, -1, -1, 27, + 28, -1, -1, -1, -1, -1, -1, 35, -1, 37, + 38, -1, 40, -1, 42, -1, 44, -1, 46, 47, + 48, -1, -1, 51, 52, -1, 54, 55, -1, -1, + -1, -1, -1, -1, 62, 63, 64, -1, -1, -1, + -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 91, 92, -1, -1, -1, -1, -1, + -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 111, -1, -1, 114, -1, -1, -1, + -1, 119, 120, -1, -1, -1, 124, -1, 126, -1, + 128, -1, 130, -1, 3, 4, 5, 135, 7, 8, + 9, 10, 11, 12, 13, -1, 15, -1, 17, 18, + 19, 20, 21, 22, 23, 24, 25, -1, 27, 28, + 29, -1, 31, -1, -1, -1, 35, 36, 37, 38, + -1, 40, 41, 42, -1, 44, 45, 46, 47, 48, + -1, -1, 51, 52, -1, 54, 55, -1, -1, -1, + -1, -1, -1, 62, 63, 64, -1, 66, -1, -1, + -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 91, 92, -1, -1, -1, -1, -1, -1, + -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, 114, -1, -1, -1, -1, + 119, 120, -1, -1, -1, 124, -1, 126, -1, 128, + -1, 130, 3, 4, 5, -1, 7, 8, 9, 10, + 11, 12, 13, -1, -1, -1, 17, 18, 19, 20, + 21, 22, 23, 24, 25, -1, 27, 28, 29, -1, + 31, -1, -1, -1, 35, 36, 37, 38, -1, 40, + 41, 42, -1, 44, 45, 46, 47, 48, -1, -1, + 51, 52, -1, 54, 55, -1, -1, -1, -1, -1, + -1, 62, 63, 64, -1, 66, -1, -1, -1, 70, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 91, 92, 3, 4, 5, -1, 7, 8, 9, -1, + 101, -1, -1, -1, -1, -1, -1, 18, -1, -1, + 111, -1, 23, 114, 25, -1, 27, 28, 119, 120, + 31, -1, -1, 124, 35, 126, -1, 128, -1, 130, + -1, 42, -1, 44, 45, -1, -1, -1, -1, -1, + -1, 52, -1, 54, 55, 3, 4, 5, -1, 7, + 8, 9, 63, -1, -1, -1, -1, -1, -1, 70, + 18, -1, -1, -1, -1, 23, -1, 25, -1, 27, + 28, -1, -1, -1, -1, -1, -1, 35, -1, -1, + 91, 92, -1, -1, 42, -1, 44, -1, -1, -1, + -1, -1, -1, -1, 52, -1, 54, 55, -1, -1, + 111, -1, -1, 114, -1, 63, -1, -1, 119, 120, + -1, -1, 70, 124, -1, 126, -1, -1, -1, 130, + -1, -1, -1, -1, -1, -1, -1, 4, 5, -1, + 7, 8, 9, 91, 92, -1, -1, -1, -1, -1, + -1, 18, -1, -1, -1, -1, 23, -1, 25, -1, + 27, 28, -1, 111, -1, -1, 114, -1, 35, -1, + -1, 119, 120, -1, -1, 42, 124, 44, 126, -1, + -1, -1, 130, -1, -1, 52, -1, 54, 55, -1, + 4, 5, -1, 7, 8, 9, 63, -1, -1, -1, + -1, -1, -1, 70, 18, -1, -1, -1, -1, 23, + -1, 25, -1, 27, 28, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 91, 92, -1, -1, -1, -1, + 44, -1, -1, -1, -1, -1, -1, -1, 52, -1, + 54, 55, -1, -1, 111, -1, -1, 114, -1, -1, + -1, -1, 119, 120, -1, -1, 70, 124, -1, 126, + -1, -1, -1, 130, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 91, 92, -1, + -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, -1, 126, 67, 68, 69, 130, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + -1, 95, 96, 97, -1, -1, -1, -1, -1, -1, + 104, 105, -1, 107, 108, 109, 39, 111, 112, -1, + 114, 115, 116, 117, 118, -1, -1, -1, -1, -1, + 124, -1, 126, -1, -1, 129, -1, -1, -1, -1, + -1, -1, 136, -1, 67, 68, 69, -1, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, -1, 95, 96, 97, -1, -1, -1, -1, -1, + -1, 104, 105, -1, 107, 108, 109, 39, 111, 112, + -1, 114, 115, 116, 117, 118, -1, -1, -1, -1, + -1, 124, -1, 126, -1, -1, 129, -1, -1, -1, + -1, -1, -1, 136, -1, 67, 68, 69, -1, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, -1, 95, 96, 97, -1, -1, -1, -1, + 39, -1, 104, 105, 106, 107, 108, 109, -1, 111, + 112, -1, 114, 115, 116, 117, 118, -1, -1, -1, + -1, -1, 124, -1, 126, -1, -1, 129, 67, 68, + 69, -1, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, -1, 95, 96, 97, -1, + -1, -1, -1, 39, -1, 104, 105, -1, 107, 108, + 109, -1, 111, 112, -1, 114, 115, 116, 117, 118, + -1, -1, -1, -1, -1, 124, -1, 126, 127, -1, + 129, 67, 68, 69, -1, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, + 96, 97, -1, -1, -1, -1, 39, -1, 104, 105, + -1, 107, 108, 109, -1, 111, 112, -1, 114, 115, + 116, 117, 118, -1, -1, -1, -1, -1, 124, -1, + 126, 127, -1, 129, 67, 68, 69, -1, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, -1, 95, 96, 97, -1, -1, -1, -1, 39, + -1, 104, 105, -1, 107, 108, 109, -1, 111, 112, + -1, 114, 115, 116, 117, 118, -1, -1, -1, -1, + -1, 124, -1, 126, 127, -1, 129, 67, 68, 69, + -1, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, -1, 95, 96, 97, -1, -1, + -1, -1, 39, -1, 104, 105, -1, 107, 108, 109, + -1, 111, 112, -1, 114, 115, 116, 117, 118, -1, + -1, -1, -1, -1, 124, -1, 126, 127, -1, 129, + 67, 68, 69, -1, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, + 97, -1, -1, -1, -1, 39, -1, 104, 105, -1, + 107, 108, 109, -1, 111, 112, -1, 114, 115, 116, + 117, 118, -1, -1, -1, -1, -1, 124, -1, 126, + 127, -1, 129, 67, 68, 69, -1, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + -1, 95, 96, 97, -1, -1, -1, -1, 39, -1, + 104, 105, 106, 107, 108, 109, -1, 111, 112, -1, + 114, 115, 116, 117, 118, -1, -1, -1, -1, -1, + 124, -1, 126, -1, -1, 129, 67, 68, 69, -1, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, -1, 95, 96, 97, -1, -1, -1, + -1, 39, -1, 104, 105, -1, 107, 108, 109, -1, + 111, 112, -1, 114, 115, 116, 117, 118, -1, -1, + -1, -1, -1, 124, -1, 126, 127, -1, 129, 67, + 68, 69, -1, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, + -1, -1, -1, -1, 39, -1, 104, 105, -1, 107, + 108, 109, -1, 111, 112, -1, 114, 115, 116, 117, + 118, -1, -1, -1, -1, -1, 124, -1, 126, -1, + -1, 129, 67, 68, 69, -1, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, + 95, 96, 97, -1, -1, -1, -1, 39, -1, 104, + 105, -1, 107, 108, 109, -1, -1, 112, -1, 114, + 115, 116, 117, 118, -1, -1, -1, -1, -1, 124, + -1, 126, -1, -1, 129, 67, 68, 69, -1, 71, + 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 89, 90, 91, + 92, 93, -1, 95, 96, 97, -1, -1, -1, -1, + 39, -1, -1, -1, -1, 107, 108, 109, -1, 111, + 112, -1, 114, 115, 116, 117, 118, -1, -1, -1, + -1, -1, 124, -1, 126, -1, -1, 129, 67, 68, + 69, -1, 71, 72, 73, 74, 75, 76, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 90, 91, 92, 93, -1, 95, 96, 97, -1, + -1, -1, -1, 39, -1, -1, -1, -1, 107, 108, + 109, -1, 111, 112, -1, 114, 115, 116, 117, 118, + -1, -1, -1, -1, -1, 124, -1, 126, -1, -1, + 129, 67, 68, 69, -1, 71, 72, 73, 74, 75, + 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 90, 91, 92, 93, -1, 95, + 96, 97, -1, -1, -1, -1, 39, -1, -1, -1, + -1, -1, 108, 109, -1, 111, 112, -1, 114, 115, + 116, 117, 118, -1, -1, -1, -1, -1, 124, -1, + 126, -1, -1, 129, 67, 68, 69, -1, 71, 72, + 73, 74, 75, 76, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 90, 91, 92, + 93, -1, 95, 96, 97, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, -1, 109, -1, 111, 112, + -1, 114, 115, 116, 117, 118, -1, -1, -1, -1, + -1, 124, -1, 126, -1, -1, 129, 67, 68, 69, + -1, 71, 72, 73, 74, 75, 76, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 90, 91, 92, 93, -1, 95, 96, 97, -1, -1, + -1, -1, 39, -1, -1, -1, -1, -1, -1, 109, + -1, 111, 112, -1, 114, 115, 116, 117, 118, -1, + -1, -1, -1, -1, 124, -1, 126, -1, -1, 129, + 67, 68, 69, -1, 71, 72, 73, 74, 75, 76, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 90, 91, 92, 93, -1, 95, 96, + 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 111, 112, -1, 114, 115, 116, + 117, 118, -1, -1, -1, -1, -1, 124, -1, 126, + -1, -1, 129 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint16 yystos[] = +{ + 0, 3, 4, 5, 7, 8, 9, 10, 11, 12, + 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 27, 28, 35, 37, 38, 40, 42, 44, 46, + 47, 48, 51, 52, 54, 55, 62, 63, 64, 70, + 91, 92, 101, 111, 114, 119, 120, 124, 126, 128, + 130, 138, 139, 140, 141, 147, 150, 152, 160, 163, + 164, 165, 166, 167, 174, 182, 185, 186, 189, 192, + 193, 194, 195, 199, 201, 210, 215, 216, 217, 228, + 235, 238, 251, 252, 253, 258, 262, 266, 267, 268, + 270, 271, 272, 90, 49, 124, 124, 157, 158, 124, + 3, 15, 16, 28, 128, 187, 188, 15, 262, 3, + 237, 262, 124, 3, 188, 241, 262, 128, 124, 129, + 15, 262, 124, 3, 4, 7, 8, 9, 259, 260, + 261, 262, 262, 262, 262, 262, 257, 262, 247, 248, + 249, 255, 262, 29, 31, 36, 41, 45, 66, 101, + 135, 146, 147, 148, 152, 154, 168, 169, 184, 193, + 254, 3, 0, 141, 128, 3, 45, 154, 161, 162, + 258, 148, 149, 15, 25, 30, 31, 43, 45, 209, + 269, 3, 195, 3, 128, 222, 226, 102, 39, 67, + 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 95, 96, 97, 104, 105, + 107, 108, 109, 111, 112, 114, 115, 116, 117, 118, + 124, 126, 129, 3, 3, 124, 256, 257, 11, 149, + 175, 191, 128, 129, 187, 188, 240, 241, 242, 250, + 124, 256, 129, 183, 247, 3, 104, 256, 135, 106, + 102, 102, 136, 127, 102, 255, 3, 3, 155, 156, + 256, 256, 155, 3, 135, 148, 128, 139, 3, 101, + 68, 101, 3, 34, 50, 234, 3, 3, 211, 262, + 3, 222, 227, 229, 230, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 3, 117, 130, 187, 264, 265, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 247, 262, 124, 126, 130, 264, 265, 136, 124, + 262, 101, 126, 142, 143, 144, 150, 152, 199, 201, + 210, 235, 190, 187, 129, 124, 246, 3, 94, 231, + 232, 233, 136, 117, 187, 145, 146, 136, 262, 136, + 255, 260, 262, 106, 245, 102, 146, 135, 245, 256, + 256, 104, 3, 53, 196, 53, 197, 3, 212, 213, + 223, 104, 104, 112, 116, 218, 230, 126, 264, 265, + 90, 106, 136, 127, 263, 262, 126, 264, 265, 90, + 157, 256, 136, 151, 135, 144, 128, 142, 247, 104, + 106, 214, 233, 136, 102, 135, 157, 106, 35, 117, + 242, 244, 104, 153, 156, 135, 101, 136, 3, 4, + 124, 242, 14, 198, 242, 243, 128, 245, 102, 135, + 4, 222, 4, 222, 219, 224, 262, 90, 117, 265, + 262, 262, 127, 262, 90, 265, 136, 128, 262, 142, + 135, 136, 262, 244, 245, 94, 233, 26, 32, 176, + 178, 180, 181, 65, 159, 255, 262, 258, 157, 231, + 243, 128, 102, 202, 153, 213, 112, 4, 111, 112, + 128, 220, 225, 228, 127, 265, 136, 127, 265, 33, + 61, 170, 171, 172, 173, 127, 135, 214, 128, 233, + 128, 124, 176, 178, 157, 136, 136, 200, 242, 45, + 101, 193, 206, 207, 208, 116, 262, 111, 228, 224, + 262, 106, 135, 172, 173, 239, 179, 3, 157, 245, + 101, 126, 147, 152, 193, 203, 204, 205, 210, 235, + 3, 25, 135, 208, 226, 221, 116, 224, 106, 145, + 145, 145, 245, 128, 151, 128, 135, 205, 234, 219, + 135, 226, 145, 135, 135, 136, 236, 262, 203, 3, + 112, 219, 177, 145, 127, 135, 124, 112, 128, 135, + 231, 145, 136, 135, 245 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + + case 13: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 304 "parser.y" + {PASS_ALWAYS as3_pass=(yyvsp[(1) - (4)].number_int);} + } + break; + + + + case 24: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 316 "parser.y" + {PASS_ALWAYS as3_pass=(yyvsp[(1) - (4)].number_int);} + } + break; + + + + case 25: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 317 "parser.y" + {PASS_ALWAYS as3_pass=(yyvsp[(2) - (4)].number_int);PASS1 as3_warning("embed command ignored");} + } + break; + + + + case 27: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 320 "parser.y" + {(yyval.code)=(yyvsp[(1) - (1)].code);} + } + break; + + + + case 28: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 321 "parser.y" + {(yyval.code)=code_new();} + } + break; + + + + case 29: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 323 "parser.y" + { + (yyval.code)=code_append((yyvsp[(1) - (2)].code),(yyvsp[(2) - (2)].code)); +} + } + break; + + + + case 30: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 326 "parser.y" + {(yyval.code)=(yyvsp[(1) - (1)].code);} + } + break; + + + + case 44: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 342 "parser.y" + {(yyval.code)=(yyvsp[(2) - (3)].code);} + } + break; + + + + case 45: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 343 "parser.y" + {(yyval.code)=0;} + } + break; + + + + case 46: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 346 "parser.y" + {(yyval.code)=0;} + } + break; + + + + case 53: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 353 "parser.y" + { + PASS_ALWAYS + if(as3_pass) { + (yyval.code) = (yyvsp[(3) - (4)].code); + } else { + (yyval.code) = 0; + } + as3_pass=(yyvsp[(1) - (4)].number_int); +} + } + break; + + + + case 54: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 365 "parser.y" + {(yyval.code)=(yyvsp[(1) - (2)].code);} + } + break; + + + + case 55: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 366 "parser.y" + {(yyval.code)=(yyvsp[(1) - (1)].code);} + } + break; + + + + case 56: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 370 "parser.y" + { + if((yyvsp[(1) - (1)].code)) { + if(!global->init) + global->init = abc_initscript(global->file); + code_t**cc = &global->init->method->body->code; + *cc = code_append(*cc, (yyvsp[(1) - (1)].code)); + } +} + } + break; + + + + case 57: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 381 "parser.y" + { + PASS_ALWAYS + (yyval.number_int) = as3_pass; + as3_pass=0; +} + } + break; + + + + case 58: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 389 "parser.y" + { + PASS12 + (yyval.number_int)=as3_pass; + char*key = concat3((yyvsp[(1) - (3)].id),"::",(yyvsp[(3) - (3)].id)); + if(!definitions || !dict_contains(definitions, key)) { + as3_pass=0; + } + free(key); +} + } + break; + + + + case 59: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 416 "parser.y" + {(yyval.node)=(yyvsp[(2) - (2)].node);} + } + break; + + + + case 60: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 417 "parser.y" + {(yyval.node)=mkdummynode();} + } + break; + + + + case 61: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 419 "parser.y" + {(yyval.code)=(yyvsp[(2) - (2)].code);} + } + break; + + + + case 62: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 420 "parser.y" + {(yyval.code)=(yyvsp[(2) - (2)].code);} + } + break; + + + + case 63: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 422 "parser.y" + {(yyval.code) = (yyvsp[(1) - (1)].code);} + } + break; + + + + case 64: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 423 "parser.y" + {(yyval.code) = code_append((yyvsp[(1) - (3)].code), (yyvsp[(3) - (3)].code));} + } + break; + + + + case 65: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 426 "parser.y" + { +PASS12 + if(variable_exists((yyvsp[(1) - (3)].id))) + syntaxerror("Variable %s already defined", (yyvsp[(1) - (3)].id)); +PASS1 + new_variable(state->method, (yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].classinfo), 1, 0); +PASS2 + + char slot = 0; + int index = 0; + variable_t*v = 0; + if(state->method->uses_slots) { + v = find_slot(state->method, (yyvsp[(1) - (3)].id)); + if(v && !v->init) { + // this variable is stored in a slot + v->init = 1; + v->type = (yyvsp[(2) - (3)].classinfo); + slot = 1; + } + } + if(!v) { + v = new_variable2(state->method, (yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].classinfo), 1, 0); + } + + (yyval.code) = slot?abc_getscopeobject(0, 1):0; + + typedcode_t val = node_read((yyvsp[(3) - (3)].node)); + if(!is_subtype_of(val.t, (yyvsp[(2) - (3)].classinfo))) { + syntaxerror("Can't convert %s to %s", val.t->name, (yyvsp[(2) - (3)].classinfo)->name); + } + if((yyvsp[(2) - (3)].classinfo)) { + if(val.c->prev || val.c->opcode != OPCODE_PUSHUNDEFINED) { + (yyval.code) = code_append((yyval.code), val.c); + (yyval.code) = converttype((yyval.code), val.t, (yyvsp[(2) - (3)].classinfo)); + } else { + code_free(val.c); + (yyval.code) = defaultvalue((yyval.code), (yyvsp[(2) - (3)].classinfo)); + } + } else { + if(val.c->prev || val.c->opcode != OPCODE_PUSHUNDEFINED) { + (yyval.code) = code_append((yyval.code), val.c); + (yyval.code) = abc_coerce_a((yyval.code)); + } else { + // don't do anything + code_free(val.c); + code_free((yyval.code)); + (yyval.code) = 0; + break; + } + } + if(slot) { + (yyval.code) = abc_setslot((yyval.code), v->index); + } else { + (yyval.code) = abc_setlocal((yyval.code), v->index); + v->init = do_init_variable((yyvsp[(1) - (3)].id)); + } +} + } + break; + + + + case 66: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 486 "parser.y" + {PASS12 new_state();} + } + break; + + + + case 67: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 486 "parser.y" + { + (yyval.code) = var_block((yyvsp[(2) - (2)].code), state->vars); + PASS12 old_state(); +} + } + break; + + + + case 68: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 490 "parser.y" + {(yyval.code) = code_new();} + } + break; + + + + case 69: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 491 "parser.y" + {(yyval.code)=(yyvsp[(2) - (2)].code);} + } + break; + + + + case 70: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 494 "parser.y" + { + (yyval.code) = code_new(); + (yyval.code) = code_append((yyval.code), (yyvsp[(3) - (6)].value).c); + code_t*myjmp,*myif = (yyval.code) = abc_iffalse((yyval.code), 0); + + (yyval.code) = code_append((yyval.code), (yyvsp[(5) - (6)].code)); + if((yyvsp[(6) - (6)].code)) { + myjmp = (yyval.code) = abc_jump((yyval.code), 0); + } + myif->branch = (yyval.code) = abc_nop((yyval.code)); + if((yyvsp[(6) - (6)].code)) { + (yyval.code) = code_append((yyval.code), (yyvsp[(6) - (6)].code)); + myjmp->branch = (yyval.code) = abc_nop((yyval.code)); + } +} + } + break; + + + + case 71: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 510 "parser.y" + {(yyval.code)=code_new();} + } + break; + + + + case 74: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 517 "parser.y" + { + PASS1 (yyval.id)=(yyvsp[(2) - (3)].id);new_variable(state->method, (yyvsp[(2) - (3)].id),(yyvsp[(3) - (3)].classinfo),1,0); + PASS2 (yyval.id)=(yyvsp[(2) - (3)].id);new_variable(state->method, (yyvsp[(2) - (3)].id),(yyvsp[(3) - (3)].classinfo),1,0); +} + } + break; + + + + case 75: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 521 "parser.y" + { + PASS12 + (yyval.id)=(yyvsp[(1) - (1)].id); +} + } + break; + + + + case 76: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 526 "parser.y" + {PASS12 new_state();(yyval.for_start).name=(yyvsp[(1) - (2)].id);(yyval.for_start).each=0;} + } + break; + + + + case 77: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 527 "parser.y" + {PASS12 new_state();(yyval.for_start).name=(yyvsp[(1) - (3)].id);(yyval.for_start).each=1;} + } + break; + + + + case 78: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 529 "parser.y" + { + if((yyvsp[(1) - (8)].for_start).each) syntaxerror("invalid syntax: ; not allowed in for each statement"); + (yyval.code) = code_new(); + (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (8)].code)); + code_t*loopstart = (yyval.code) = abc_label((yyval.code)); + (yyval.code) = code_append((yyval.code), (yyvsp[(4) - (8)].value).c); + code_t*myif = (yyval.code) = abc_iffalse((yyval.code), 0); + (yyval.code) = code_append((yyval.code), (yyvsp[(8) - (8)].code)); + code_t*cont = (yyval.code) = abc_nop((yyval.code)); + (yyval.code) = code_append((yyval.code), (yyvsp[(6) - (8)].code)); + (yyval.code) = abc_jump((yyval.code), loopstart); + code_t*out = (yyval.code) = abc_nop((yyval.code)); + breakjumpsto((yyval.code), (yyvsp[(1) - (8)].for_start).name, out); + continuejumpsto((yyval.code), (yyvsp[(1) - (8)].for_start).name, cont); + myif->branch = out; + + (yyval.code) = var_block((yyval.code), state->vars); + PASS12 old_state(); +} + } + break; + + + + case 79: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 549 "parser.y" + { + node_t*n = resolve_identifier((yyvsp[(2) - (6)].id)); + typedcode_t w = node_write(n); + + int it = alloc_local(); + int array = alloc_local(); + + (yyval.code) = code_new(); + (yyval.code) = code_append((yyval.code), (yyvsp[(4) - (6)].value).c); + (yyval.code) = abc_coerce_a((yyval.code)); + (yyval.code) = abc_setlocal((yyval.code), array); + (yyval.code) = abc_pushbyte((yyval.code), 0); + (yyval.code) = abc_setlocal((yyval.code), it); + + code_t*loopstart = (yyval.code) = abc_label((yyval.code)); + + (yyval.code) = abc_hasnext2((yyval.code), array, it); + code_t*myif = (yyval.code) = abc_iffalse((yyval.code), 0); + (yyval.code) = abc_getlocal((yyval.code), array); + (yyval.code) = abc_getlocal((yyval.code), it); + if(!(yyvsp[(1) - (6)].for_start).each) + (yyval.code) = abc_nextname((yyval.code)); + else + (yyval.code) = abc_nextvalue((yyval.code)); + + (yyval.code) = converttype((yyval.code), 0, w.t); + (yyval.code) = code_append((yyval.code), w.c); + + (yyval.code) = code_append((yyval.code), (yyvsp[(6) - (6)].code)); + (yyval.code) = abc_jump((yyval.code), loopstart); + + code_t*out = (yyval.code) = abc_nop((yyval.code)); + breakjumpsto((yyval.code), (yyvsp[(1) - (6)].for_start).name, out); + continuejumpsto((yyval.code), (yyvsp[(1) - (6)].for_start).name, loopstart); + + myif->branch = out; + + (yyval.code) = abc_kill((yyval.code), it); + (yyval.code) = abc_kill((yyval.code), array); + + (yyval.code) = var_block((yyval.code), state->vars); + PASS12 old_state(); +} + } + break; + + + + case 80: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 593 "parser.y" + { + + (yyval.code) = code_new(); + + code_t*myjmp = (yyval.code) = abc_jump((yyval.code), 0); + code_t*loopstart = (yyval.code) = abc_label((yyval.code)); + (yyval.code) = code_append((yyval.code), (yyvsp[(5) - (5)].code)); + code_t*cont = (yyval.code) = abc_nop((yyval.code)); + myjmp->branch = cont; + (yyval.code) = code_append((yyval.code), (yyvsp[(3) - (5)].value).c); + (yyval.code) = abc_iftrue((yyval.code), loopstart); + code_t*out = (yyval.code) = abc_nop((yyval.code)); + breakjumpsto((yyval.code), (yyvsp[(1) - (5)].id), out); + continuejumpsto((yyval.code), (yyvsp[(1) - (5)].id), cont); +} + } + break; + + + + case 81: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 609 "parser.y" + { + (yyval.code) = code_new(); + code_t*loopstart = (yyval.code) = abc_label((yyval.code)); + (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (6)].code)); + code_t*cont = (yyval.code) = abc_nop((yyval.code)); + (yyval.code) = code_append((yyval.code), (yyvsp[(5) - (6)].value).c); + (yyval.code) = abc_iftrue((yyval.code), loopstart); + code_t*out = (yyval.code) = abc_nop((yyval.code)); + breakjumpsto((yyval.code), (yyvsp[(1) - (6)].id), out); + continuejumpsto((yyval.code), (yyvsp[(1) - (6)].id), cont); +} + } + break; + + + + case 82: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 621 "parser.y" + { + (yyval.code) = abc___break__(0, ""); +} + } + break; + + + + case 83: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 624 "parser.y" + { + (yyval.code) = abc___break__(0, (yyvsp[(2) - (2)].id)); +} + } + break; + + + + case 84: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 627 "parser.y" + { + (yyval.code) = abc___continue__(0, ""); +} + } + break; + + + + case 85: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 630 "parser.y" + { + (yyval.code) = abc___continue__(0, (yyvsp[(2) - (2)].id)); +} + } + break; + + + + case 86: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 634 "parser.y" + {(yyval.code)=0;} + } + break; + + + + case 87: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 635 "parser.y" + {(yyval.code)=(yyvsp[(1) - (1)].code);} + } + break; + + + + case 88: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 636 "parser.y" + {(yyval.code)=(yyvsp[(1) - (1)].code);} + } + break; + + + + case 89: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 637 "parser.y" + {(yyval.code)=code_append((yyvsp[(1) - (2)].code),(yyvsp[(2) - (2)].code));} + } + break; + + + + case 90: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 638 "parser.y" + {(yyval.code)=(yyvsp[(1) - (1)].code);} + } + break; + + + + case 91: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 639 "parser.y" + {(yyval.code)=code_append((yyval.code),(yyvsp[(2) - (2)].code));} + } + break; + + + + case 92: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 641 "parser.y" + { + (yyval.code) = abc_getlocal(0, state->switch_var); + (yyval.code) = code_append((yyval.code), node_read((yyvsp[(2) - (4)].node)).c); + code_t*j = (yyval.code) = abc_ifne((yyval.code), 0); + (yyval.code) = code_append((yyval.code), (yyvsp[(4) - (4)].code)); + if((yyval.code)->opcode != OPCODE___BREAK__) { + (yyval.code) = abc___fallthrough__((yyval.code), ""); + } + code_t*e = (yyval.code) = abc_nop((yyval.code)); + j->branch = e; +} + } + break; + + + + case 93: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 652 "parser.y" + { + (yyval.code) = (yyvsp[(3) - (3)].code); +} + } + break; + + + + case 94: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 655 "parser.y" + {PASS12 new_state();state->switch_var=alloc_local();} + } + break; + + + + case 95: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 655 "parser.y" + { + (yyval.code) = node_read((yyvsp[(4) - (8)].node)).c; + (yyval.code) = abc_setlocal((yyval.code), state->switch_var); + (yyval.code) = code_append((yyval.code), (yyvsp[(7) - (8)].code)); + + code_t*out = (yyval.code) = abc_kill((yyval.code), state->switch_var); + breakjumpsto((yyval.code), (yyvsp[(1) - (8)].id), out); + + code_t*c = (yyval.code),*lastblock=0; + while(c) { + if(c->opcode == OPCODE_IFNE) { + if(!c->next) syntaxerror("internal error in fallthrough handling"); + lastblock=c->next; + } else if(c->opcode == OPCODE___FALLTHROUGH__) { + if(lastblock) { + c->opcode = OPCODE_JUMP; + c->branch = lastblock; + } else { + /* fall through end of switch */ + c->opcode = OPCODE_NOP; + } + } + c=c->prev; + } + + (yyval.code) = var_block((yyval.code), state->vars); + PASS12 old_state(); +} + } + break; + + + + case 96: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 686 "parser.y" + {PASS12 new_state(); + state->exception_name=(yyvsp[(3) - (5)].id); + PASS1 new_variable(state->method, (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].classinfo), 0, 0); + PASS2 new_variable(state->method, (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].classinfo), 0, 0); + } + } + break; + + + + case 97: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 691 "parser.y" + { + namespace_t name_ns = {ACCESS_PACKAGE, ""}; + multiname_t name = {QNAME, &name_ns, 0, (yyvsp[(3) - (9)].id)}; + + NEW(abc_exception_t, e) + e->exc_type = sig2mname((yyvsp[(4) - (9)].classinfo)); + e->var_name = multiname_clone(&name); + (yyval.exception) = e; + + code_t*c = 0; + int i = find_variable_safe(state, (yyvsp[(3) - (9)].id))->index; + e->target = c = abc_nop(0); + c = abc_setlocal(c, i); + c = code_append(c, code_dup(state->method->scope_code)); + c = code_append(c, (yyvsp[(8) - (9)].code)); + c = abc_kill(c, i); + + c = var_block(c, state->vars); + PASS12 old_state(); +} + } + break; + + + + case 98: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 711 "parser.y" + {PASS12 new_state();state->exception_name=0;} + } + break; + + + + case 99: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 711 "parser.y" + { + (yyvsp[(4) - (5)].code) = var_block((yyvsp[(4) - (5)].code), state->vars); + if(!(yyvsp[(4) - (5)].code)) { + (yyval.exception)=0; + } else { + NEW(abc_exception_t, e) + e->exc_type = 0; //all exceptions + e->var_name = 0; //no name + e->target = 0; + e->to = abc_nop(0); + e->to = code_append(e->to, (yyvsp[(4) - (5)].code)); + (yyval.exception) = e; + } + PASS12 old_state(); +} + } + break; + + + + case 100: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 727 "parser.y" + {(yyval.catch_list).l=list_new();(yyval.catch_list).finally=0;list_append((yyval.catch_list).l,(yyvsp[(1) - (1)].exception));} + } + break; + + + + case 101: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 728 "parser.y" + {(yyval.catch_list)=(yyvsp[(1) - (2)].catch_list);list_append((yyval.catch_list).l,(yyvsp[(2) - (2)].exception));} + } + break; + + + + case 102: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 729 "parser.y" + {(yyval.catch_list)=(yyvsp[(1) - (1)].catch_list);} + } + break; + + + + case 103: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 730 "parser.y" + { + (yyval.catch_list) = (yyvsp[(1) - (2)].catch_list); + (yyval.catch_list).finally = 0; + if((yyvsp[(2) - (2)].exception)) { + list_append((yyval.catch_list).l,(yyvsp[(2) - (2)].exception)); + (yyval.catch_list).finally = (yyvsp[(2) - (2)].exception)->to;(yyvsp[(2) - (2)].exception)->to=0; + } +} + } + break; + + + + case 104: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 738 "parser.y" + { + (yyval.catch_list).l=list_new(); + (yyval.catch_list).finally = 0; + if((yyvsp[(1) - (1)].exception)) { + list_append((yyval.catch_list).l,(yyvsp[(1) - (1)].exception)); + (yyval.catch_list).finally = (yyvsp[(1) - (1)].exception)->to;(yyvsp[(1) - (1)].exception)->to=0; + } +} + } + break; + + + + case 105: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 747 "parser.y" + {PASS12 new_state(); + state->method->has_exceptions=1; + state->method->late_binding=1;//for invariant scope_code + } + } + break; + + + + case 106: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 750 "parser.y" + { + code_t*out = abc_nop(0); + + code_t*start = abc_nop(0); + (yyval.code) = code_append(start, (yyvsp[(4) - (6)].code)); + if(!is_break_or_jump((yyvsp[(4) - (6)].code))) { + (yyval.code) = abc_jump((yyval.code), out); + } + code_t*end = (yyval.code) = abc_nop((yyval.code)); + + int tmp; + if((yyvsp[(6) - (6)].catch_list).finally) + tmp = alloc_local(); + + abc_exception_list_t*l = (yyvsp[(6) - (6)].catch_list).l; + int count=0; + while(l) { + abc_exception_t*e = l->abc_exception; + if(e->var_name) { + (yyval.code) = code_append((yyval.code), e->target); + (yyval.code) = abc_jump((yyval.code), out); + } else { + as3_assert((ptroff_t)(yyvsp[(6) - (6)].catch_list).finally); + // finally block + e->target = (yyval.code) = abc_nop((yyval.code)); + (yyval.code) = code_append((yyval.code), code_dup(state->method->scope_code)); + (yyval.code) = abc___rethrow__((yyval.code)); + } + + e->from = start; + e->to = end; + + l = l->next; + } + (yyval.code) = code_append((yyval.code), out); + + (yyval.code) = insert_finally((yyval.code), (yyvsp[(6) - (6)].catch_list).finally, tmp); + + list_concat(state->method->exceptions, (yyvsp[(6) - (6)].catch_list).l); + + (yyval.code) = var_block((yyval.code), state->vars); + PASS12 old_state(); +} + } + break; + + + + case 107: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 796 "parser.y" + { + (yyval.code)=(yyvsp[(2) - (2)].value).c; + (yyval.code)=abc_throw((yyval.code)); +} + } + break; + + + + case 108: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 801 "parser.y" + { + if(!state->exception_name) + syntaxerror("re-throw only possible within a catch block"); + variable_t*v = find_variable(state, state->exception_name); + (yyval.code)=code_new(); + (yyval.code)=abc_getlocal((yyval.code), v->index); + (yyval.code)=abc_throw((yyval.code)); +} + } + break; + + + + case 109: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 812 "parser.y" + { + new_state(); + if(state->method->has_exceptions) { + int v = alloc_local(); + state->method->scope_code = abc_getlocal(state->method->scope_code, v); + state->method->scope_code = abc_pushwith(state->method->scope_code); + (yyval.value_list).number = v; + } + (yyval.value_list).cc = (yyvsp[(3) - (4)].value).c; +} + } + break; + + + + case 110: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 822 "parser.y" + { + /* remove getlocal;pushwith from scope code again */ + state->method->scope_code = code_cutlast(code_cutlast(state->method->scope_code)); + + (yyval.code) = (yyvsp[(1) - (2)].value_list).cc; + if(state->method->has_exceptions) { + (yyval.code) = abc_dup((yyval.code)); + (yyval.code) = abc_setlocal((yyval.code), (yyvsp[(1) - (2)].value_list).number); + } + (yyval.code) = abc_pushwith((yyval.code)); + (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (2)].code)); + (yyval.code) = abc_popscope((yyval.code)); + old_state(); +} + } + break; + + + + case 112: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 840 "parser.y" + {PASS12 (yyval.id)="package";} + } + break; + + + + case 113: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 841 "parser.y" + {PASS12 (yyval.id)="namespace";} + } + break; + + + + case 114: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 842 "parser.y" + {PASS12 (yyval.id)="NaN";} + } + break; + + + + case 115: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 844 "parser.y" + {PASS12 (yyval.id) = concat3((yyvsp[(1) - (3)].id),".",(yyvsp[(3) - (3)].id));free((yyvsp[(1) - (3)].id));(yyvsp[(1) - (3)].id)=0;} + } + break; + + + + case 116: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 845 "parser.y" + {PASS12 (yyval.id)=strdup((yyvsp[(1) - (1)].id));} + } + break; + + + + case 117: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 847 "parser.y" + {PASS12 startpackage((yyvsp[(2) - (3)].id));free((yyvsp[(2) - (3)].id));(yyvsp[(2) - (3)].id)=0;} + } + break; + + + + case 118: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 848 "parser.y" + {PASS12 endpackage();(yyval.code)=0;} + } + break; + + + + case 119: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 849 "parser.y" + {PASS12 startpackage("");} + } + break; + + + + case 120: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 850 "parser.y" + {PASS12 endpackage();(yyval.code)=0;} + } + break; + + + + case 121: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 873 "parser.y" + { + PASS12 + slotinfo_t*s = registry_find(state->package, (yyvsp[(2) - (2)].id)); + if(!s && as3_pass==1) {as3_schedule_class(state->package, (yyvsp[(2) - (2)].id));} + state_has_imports(); + dict_put(state->imports, state->package, (yyvsp[(2) - (2)].id)); + (yyval.code)=0; +} + } + break; + + + + case 122: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 881 "parser.y" + { + PASS12 + slotinfo_t*s = registry_find((yyvsp[(2) - (2)].classinfo)->package, (yyvsp[(2) - (2)].classinfo)->name); + if(!s && as3_pass==1) { + as3_schedule_class((yyvsp[(2) - (2)].classinfo)->package, (yyvsp[(2) - (2)].classinfo)->name); + } + /*if(s && s->kind == INFOTYPE_VAR && TYPE_IS_NAMESPACE(s->type)) { + trie_put(active_namespaces, (unsigned char*)$2->name, 0); + }*/ + state_has_imports(); + dict_put(state->imports, (yyvsp[(2) - (2)].classinfo)->name, (yyvsp[(2) - (2)].classinfo)); + import_toplevel((yyvsp[(2) - (2)].classinfo)->package); + (yyval.code)=0; +} + } + break; + + + + case 123: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 895 "parser.y" + { + PASS12 + if(strncmp("flash.", (yyvsp[(2) - (4)].id), 6) && as3_pass==1) { + as3_schedule_package((yyvsp[(2) - (4)].id)); + } + + NEW(import_t,i); + i->package = (yyvsp[(2) - (4)].id); + state_has_imports(); + list_append(state->wildcard_imports, i); + import_toplevel(i->package); + (yyval.code)=0; +} + } + break; + + + + case 124: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 911 "parser.y" + {PASS12 (yyval.flags).flags=0;(yyval.flags).ns=0;} + } + break; + + + + case 125: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 912 "parser.y" + {PASS12 (yyval.flags)=(yyvsp[(1) - (1)].flags);} + } + break; + + + + case 126: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 913 "parser.y" + {PASS12 (yyval.flags)=(yyvsp[(1) - (1)].flags);} + } + break; + + + + case 127: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 914 "parser.y" + { + PASS12 + (yyval.flags).flags=(yyvsp[(1) - (2)].flags).flags|(yyvsp[(2) - (2)].flags).flags; + if((yyvsp[(1) - (2)].flags).ns && (yyvsp[(2) - (2)].flags).ns) syntaxerror("only one namespace allowed in one declaration"); + (yyval.flags).ns=(yyvsp[(1) - (2)].flags).ns?(yyvsp[(1) - (2)].flags).ns:(yyvsp[(2) - (2)].flags).ns; + +} + } + break; + + + + case 128: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 921 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_PUBLIC;(yyval.flags).ns=0;} + } + break; + + + + case 129: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 922 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_PRIVATE;(yyval.flags).ns=0;} + } + break; + + + + case 130: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 923 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_PROTECTED;(yyval.flags).ns=0;} + } + break; + + + + case 131: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 924 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_STATIC;(yyval.flags).ns=0;} + } + break; + + + + case 132: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 925 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_DYNAMIC;(yyval.flags).ns=0;} + } + break; + + + + case 133: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 926 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_FINAL;(yyval.flags).ns=0;} + } + break; + + + + case 134: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 927 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_OVERRIDE;(yyval.flags).ns=0;} + } + break; + + + + case 135: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 928 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_NATIVE;(yyval.flags).ns=0;} + } + break; + + + + case 136: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 929 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_PACKAGEINTERNAL;(yyval.flags).ns=0;} + } + break; + + + + case 137: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 930 "parser.y" + {PASS12 (yyval.flags).flags=FLAG_NAMESPACE; + (yyval.flags).ns=(yyvsp[(1) - (1)].id); + } + } + break; + + + + case 138: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 934 "parser.y" + {PASS12 (yyval.classinfo)=0;} + } + break; + + + + case 139: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 935 "parser.y" + {PASS12 (yyval.classinfo)=(yyvsp[(2) - (2)].classinfo);} + } + break; + + + + case 140: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 937 "parser.y" + {PASS12 (yyval.classinfo_list)=list_new();} + } + break; + + + + case 141: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 938 "parser.y" + {PASS12 (yyval.classinfo_list)=(yyvsp[(2) - (2)].classinfo_list);} + } + break; + + + + case 142: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 940 "parser.y" + {PASS12 (yyval.classinfo_list)=list_new();} + } + break; + + + + case 143: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 941 "parser.y" + {PASS12 (yyval.classinfo_list)=(yyvsp[(2) - (2)].classinfo_list);} + } + break; + + + + case 144: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 945 "parser.y" + {PASS12 startclass(&(yyvsp[(1) - (6)].flags),(yyvsp[(3) - (6)].id),(yyvsp[(4) - (6)].classinfo),(yyvsp[(5) - (6)].classinfo_list));} + } + break; + + + + case 145: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 947 "parser.y" + {PASS12 endclass();(yyval.code)=0;} + } + break; + + + + case 146: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 951 "parser.y" + {PASS12 (yyvsp[(1) - (5)].flags).flags|=FLAG_INTERFACE; + startclass(&(yyvsp[(1) - (5)].flags),(yyvsp[(3) - (5)].id),0,(yyvsp[(4) - (5)].classinfo_list));} + } + break; + + + + case 147: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 954 "parser.y" + {PASS12 endclass();(yyval.code)=0;} + } + break; + + + + case 153: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 963 "parser.y" + {PASS_ALWAYS as3_pass=(yyvsp[(1) - (4)].number_int);} + } + break; + + + + case 156: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 966 "parser.y" + {PASS_ALWAYS as3_pass=(yyvsp[(2) - (4)].number_int);PASS1 as3_warning("embed command ignored");} + } + break; + + + + case 157: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 968 "parser.y" + { + code_t*c = state->cls->static_init->header; + c = code_append(c, (yyvsp[(1) - (1)].code)); + state->cls->static_init->header = c; +} + } + break; + + + + case 163: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 979 "parser.y" + { + syntaxerror("variable declarations not allowed in interfaces"); +} + } + break; + + + + case 164: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 982 "parser.y" + { + PASS12 + (yyvsp[(1) - (8)].flags).flags |= FLAG_PUBLIC; + if((yyvsp[(1) - (8)].flags).flags&(FLAG_PRIVATE|FLAG_PACKAGEINTERNAL|FLAG_PROTECTED)) { + syntaxerror("invalid method modifiers: interface methods always need to be public"); + } + startfunction(&(yyvsp[(1) - (8)].flags),(yyvsp[(3) - (8)].token),(yyvsp[(4) - (8)].id),&(yyvsp[(6) - (8)].params),(yyvsp[(8) - (8)].classinfo)); + endfunction(&(yyvsp[(1) - (8)].flags),(yyvsp[(3) - (8)].token),(yyvsp[(4) - (8)].id),&(yyvsp[(6) - (8)].params),(yyvsp[(8) - (8)].classinfo), 0); + list_deep_free((yyvsp[(6) - (8)].params).list); +} + } + break; + + + + case 167: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1057 "parser.y" + {PASS12 setslotstate(&(yyvsp[(1) - (2)].flags),(yyvsp[(2) - (2)].token));} + } + break; + + + + case 168: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1057 "parser.y" + {PASS12 (yyval.code)=(yyvsp[(4) - (4)].code);setslotstate(0, 0);} + } + break; + + + + case 169: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1059 "parser.y" + {PASS12 (yyval.code)=0;} + } + break; + + + + case 170: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1060 "parser.y" + {PASS12 (yyval.code)=0;} + } + break; + + + + case 171: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1063 "parser.y" + { +PASS12 + int flags = slotstate_flags->flags; + namespace_t ns = modifiers2access(slotstate_flags); + + if(as3_pass == 1) { + + varinfo_t* info = 0; + if(state->cls) { + memberinfo_t*i = registry_findmember(state->cls->info, ns.name, (yyvsp[(1) - (3)].id), 1, slotstate_flags->flags&FLAG_STATIC); + if(i) { + check_override(i, flags); + } + info = varinfo_register_onclass(state->cls->info, ns.access, ns.name, (yyvsp[(1) - (3)].id), slotstate_flags->flags&FLAG_STATIC); + } else { + slotinfo_t*i = registry_find(state->package, (yyvsp[(1) - (3)].id)); + if(i) { + syntaxerror("package %s already contains '%s'", state->package, (yyvsp[(1) - (3)].id)); + } + if(ns.name && ns.name[0]) { + syntaxerror("namespaces not allowed on package-level variables"); + } + info = varinfo_register_global(ns.access, state->package, (yyvsp[(1) - (3)].id)); + } + + info->type = (yyvsp[(2) - (3)].classinfo); + info->flags = flags; + + dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, info); + } + + if(as3_pass == 2) { + varinfo_t*info = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); + + multiname_t mname; + code_t**code; + trait_t*t = add_abc_slot(slotstate_flags, (yyvsp[(1) - (3)].id), &mname, &code); + + if((yyvsp[(2) - (3)].classinfo)) { + MULTINAME(m, (yyvsp[(2) - (3)].classinfo)); + t->type_name = multiname_clone(&m); + } + info->slot = t->slot_id; + + /* workaround for "VerifyError: Error #1053: Illegal override of ::test2 in C1" + FIXME: is there a way to use slots and still don't have conflicting overrides? + */ + info->slot = t->slot_id = 0; + + constant_t cval = (yyvsp[(3) - (3)].node)->type->eval((yyvsp[(3) - (3)].node)); + if(cval.type!=CONSTANT_UNKNOWN) { + /* compile time constant */ + t->value = malloc(sizeof(constant_t)); + memcpy(t->value, &cval, sizeof(constant_t)); + info->value = constant_clone(t->value); + } else { + typedcode_t v = node_read((yyvsp[(3) - (3)].node)); + /* initalization code (if needed) */ + code_t*c = 0; + if(v.c && !is_pushundefined(v.c)) { + c = abc_getlocal_0(c); + c = code_append(c, v.c); + c = converttype(c, v.t, (yyvsp[(2) - (3)].classinfo)); + if(!t->slot_id) { + c = abc_initproperty2(c, &mname); + } else { + c = abc_setslot(c, t->slot_id); + } + } + *code = code_append(*code, c); + } + + if(slotstate_varconst==KW_CONST) { + t->kind= TRAIT_CONST; + info->flags |= FLAG_CONST; + } + } + + (yyval.code)=0; +} + } + break; + + + + case 172: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1146 "parser.y" + {(yyval.constant)=0;} + } + break; + + + + case 173: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1147 "parser.y" + { + (yyval.constant) = malloc(sizeof(constant_t)); + *(yyval.constant) = node_eval((yyvsp[(2) - (2)].node)); + if((yyval.constant)->type == CONSTANT_UNKNOWN) { + syntaxerror("can't evaluate default parameter value (needs to be a compile-time constant)"); + } +} + } + break; + + + + case 174: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1155 "parser.y" + {(yyval.constant) = constant_new_int((yyvsp[(1) - (1)].number_int));} + } + break; + + + + case 175: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1156 "parser.y" + { + (yyval.constant) = constant_new_uint((yyvsp[(1) - (1)].number_uint)); +} + } + break; + + + + case 176: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1159 "parser.y" + {(yyval.constant) = constant_new_float((yyvsp[(1) - (1)].number_float));} + } + break; + + + + case 177: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1160 "parser.y" + {(yyval.constant) = constant_new_string2((yyvsp[(1) - (1)].str).str,(yyvsp[(1) - (1)].str).len);free((char*)(yyvsp[(1) - (1)].str).str);} + } + break; + + + + case 178: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1161 "parser.y" + {(yyval.constant) = constant_new_true((yyvsp[(1) - (1)].token));} + } + break; + + + + case 179: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1162 "parser.y" + {(yyval.constant) = constant_new_false((yyvsp[(1) - (1)].token));} + } + break; + + + + case 180: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1163 "parser.y" + {(yyval.constant) = constant_new_null((yyvsp[(1) - (1)].token));} + } + break; + + + + case 181: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1164 "parser.y" + {(yyval.constant) = constant_new_undefined((yyvsp[(1) - (1)].token));} + } + break; + + + + case 182: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1165 "parser.y" + {(yyval.constant) = constant_new_float(__builtin_nan(""));} + } + break; + + + + case 183: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1173 "parser.y" + { + multiname_t m = {QNAME, &stdns, 0, "XML"}; + typedcode_t v; + v.c = 0; + v.c = abc_getlex2(v.c, &m); + v.c = code_append(v.c, node_read((yyvsp[(1) - (1)].node)).c); + v.c = abc_construct(v.c, 1); + v.t = TYPE_XML; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 184: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1184 "parser.y" + {PASS_ALWAYS if(!xml_level++) tokenizer_begin_xml();} + } + break; + + + + case 185: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1185 "parser.y" + {PASS_ALWAYS tokenizer_begin_xmltext();} + } + break; + + + + case 186: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1186 "parser.y" + {PASS_ALWAYS if(!--xml_level) tokenizer_end_xml(); else tokenizer_begin_xmltext();} + } + break; + + + + case 187: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1188 "parser.y" + {PASS_ALWAYS tokenizer_begin_xmltext();} + } + break; + + + + case 188: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1188 "parser.y" + { + (yyval.node) = (yyvsp[(2) - (4)].node); +} + } + break; + + + + case 189: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1191 "parser.y" + {PASS_ALWAYS tokenizer_begin_xml();} + } + break; + + + + case 190: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1191 "parser.y" + { + (yyval.node) = (yyvsp[(2) - (4)].node); +} + } + break; + + + + case 191: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1194 "parser.y" + {(yyval.node)=mkstringnode("");} + } + break; + + + + case 192: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1195 "parser.y" + { + (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node),(yyvsp[(2) - (2)].node)); +} + } + break; + + + + case 193: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1198 "parser.y" + { + char* str = string_cstr(&(yyvsp[(2) - (2)].str)); + (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node),mkstringnode(str)); + free(str); +} + } + break; + + + + case 194: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1203 "parser.y" + { + (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node), mkstringnode(">")); +} + } + break; + + + + case 195: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1206 "parser.y" + { + (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node),(yyvsp[(2) - (2)].node)); +} + } + break; + + + + case 196: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1209 "parser.y" + { + (yyval.node) = mkaddnode((yyvsp[(1) - (3)].node), mkaddnode((yyvsp[(2) - (3)].node),(yyvsp[(3) - (3)].node))); +} + } + break; + + + + case 197: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1212 "parser.y" + { + (yyval.node) = mkstringnode((yyvsp[(1) - (1)].id)); +} + } + break; + + + + case 198: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1215 "parser.y" + { + (yyval.node) = (yyvsp[(1) - (1)].node); +} + } + break; + + + + case 199: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1219 "parser.y" + { + (yyval.node) = mkstringnode(""); +} + } + break; + + + + case 200: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1222 "parser.y" + { + (yyval.node) = mkaddnode(mkstringnode(" "),(yyvsp[(1) - (1)].node)); +} + } + break; + + + + case 201: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1226 "parser.y" + { + //$$ = allocprintf("<%s%s/>", $2, $3, $5, $8); + (yyval.node) = mkaddnode(mkaddnode(mkaddnode(mkstringnode("<"),(yyvsp[(2) - (6)].node)),(yyvsp[(3) - (6)].node)),mkstringnode("/>")); +} + } + break; + + + + case 202: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1230 "parser.y" + { + //$$ = allocprintf("<%s%s>%s", $2, $3, $5, $8); + (yyval.node) = mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode( + mkstringnode("<"),(yyvsp[(2) - (10)].node)),(yyvsp[(3) - (10)].node)),mkstringnode(">")),(yyvsp[(5) - (10)].node)),mkstringnode("")); +} + } + break; + + + + case 203: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1235 "parser.y" + { + //$$ = allocprintf("<%s%s>%s%s", $2, $3, $5, $6, $9); + (yyval.node) = mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode( + mkstringnode("<"),(yyvsp[(2) - (11)].node)),(yyvsp[(3) - (11)].node)),mkstringnode(">")),(yyvsp[(5) - (11)].node)),(yyvsp[(6) - (11)].node)),mkstringnode("")); +} + } + break; + + + + case 204: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1241 "parser.y" + { + (yyval.node) = (yyvsp[(1) - (1)].node); +} + } + break; + + + + case 205: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1244 "parser.y" + { + (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node), mkaddnode(mkstringnode(" "),(yyvsp[(2) - (2)].node))); +} + } + break; + + + + case 206: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1247 "parser.y" + { + (yyval.node) = (yyvsp[(1) - (1)].node); +} + } + break; + + + + case 207: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1250 "parser.y" + { + char* str = string_cstr(&(yyvsp[(3) - (3)].str)); + (yyval.node) = mkaddnode((yyvsp[(1) - (3)].node), mkstringnode(concat2("=",str))); + free(str); +} + } + break; + + + + case 208: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1255 "parser.y" + { + (yyval.node) = mkaddnode((yyvsp[(1) - (3)].node), mkaddnode(mkstringnode("=\""), mkaddnode((yyvsp[(3) - (3)].node), mkstringnode("\"")))); +} + } + break; + + + + case 209: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1258 "parser.y" + { + (yyval.node) = mkaddnode(mkaddnode(mkstringnode(concat2((yyvsp[(1) - (3)].id),"=\"")), (yyvsp[(3) - (3)].node)), mkstringnode("\"")); +} + } + break; + + + + case 210: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1261 "parser.y" + { + char* str = string_cstr(&(yyvsp[(3) - (3)].str)); + (yyval.node)=mkstringnode(allocprintf("%s=%s", (yyvsp[(1) - (3)].id),str)); + free(str); + free((yyvsp[(1) - (3)].id));free((char*)(yyvsp[(3) - (3)].str).str); +} + } + break; + + + + case 211: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1271 "parser.y" + { + PASS12 + memset(&(yyval.params),0,sizeof((yyval.params))); +} + } + break; + + + + case 212: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1275 "parser.y" + { + PASS12 + (yyval.params)=(yyvsp[(1) - (1)].params); +} + } + break; + + + + case 213: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1281 "parser.y" + { + PASS12 + memset(&(yyval.params),0,sizeof((yyval.params))); + (yyval.params).varargs=1; + list_append((yyval.params).list, (yyvsp[(2) - (2)].param)); +} + } + break; + + + + case 214: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1287 "parser.y" + { + PASS12 + (yyval.params) =(yyvsp[(1) - (4)].params); + (yyval.params).varargs=1; + list_append((yyval.params).list, (yyvsp[(4) - (4)].param)); +} + } + break; + + + + case 215: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1295 "parser.y" + { + PASS12 + (yyval.params) = (yyvsp[(1) - (3)].params); + list_append((yyval.params).list, (yyvsp[(3) - (3)].param)); +} + } + break; + + + + case 216: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1300 "parser.y" + { + PASS12 + memset(&(yyval.params),0,sizeof((yyval.params))); + list_append((yyval.params).list, (yyvsp[(1) - (1)].param)); +} + } + break; + + + + case 217: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1306 "parser.y" + { + PASS12 + (yyval.param) = rfx_calloc(sizeof(param_t)); + (yyval.param)->name=(yyvsp[(1) - (4)].id); + (yyval.param)->type = (yyvsp[(3) - (4)].classinfo); + PASS2 + (yyval.param)->value = (yyvsp[(4) - (4)].constant); +} + } + break; + + + + case 218: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1314 "parser.y" + { + PASS12 + (yyval.param) = rfx_calloc(sizeof(param_t)); + (yyval.param)->name=(yyvsp[(1) - (2)].id); + (yyval.param)->type = TYPE_ANY; + PASS2 + (yyval.param)->value = (yyvsp[(2) - (2)].constant); +} + } + break; + + + + case 221: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1324 "parser.y" + {PASS12 (yyval.token)=0;} + } + break; + + + + case 222: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1327 "parser.y" + {PASS12 startfunction(&(yyvsp[(1) - (9)].flags),(yyvsp[(3) - (9)].token),(yyvsp[(4) - (9)].id),&(yyvsp[(6) - (9)].params),(yyvsp[(8) - (9)].classinfo));} + } + break; + + + + case 223: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1328 "parser.y" + { + PASS1 + endfunction(&(yyvsp[(1) - (12)].flags),(yyvsp[(3) - (12)].token),(yyvsp[(4) - (12)].id),&(yyvsp[(6) - (12)].params),0,0); + PASS2 + if(!state->method->info) syntaxerror("internal error"); + + code_t*c = method_header(state->method); + c = wrap_function(c, 0, (yyvsp[(11) - (12)].code)); + + endfunction(&(yyvsp[(1) - (12)].flags),(yyvsp[(3) - (12)].token),(yyvsp[(4) - (12)].id),&(yyvsp[(6) - (12)].params),(yyvsp[(8) - (12)].classinfo),c); + PASS12 + list_deep_free((yyvsp[(6) - (12)].params).list); + (yyval.code)=0; +} + } + break; + + + + case 225: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1344 "parser.y" + {PASS12 (yyval.id)=0;} + } + break; + + + + case 226: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1346 "parser.y" + {PASS12 innerfunction((yyvsp[(2) - (7)].id),&(yyvsp[(4) - (7)].params),(yyvsp[(6) - (7)].classinfo));} + } + break; + + + + case 227: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1347 "parser.y" + { + PASS1 + endfunction(0,0,(yyvsp[(2) - (10)].id),&(yyvsp[(4) - (10)].params),0,0); + PASS2 + methodinfo_t*f = state->method->info; + if(!f || !f->kind) syntaxerror("internal error"); + + code_t*c = method_header(state->method); + c = wrap_function(c, 0, (yyvsp[(9) - (10)].code)); + + int index = state->method->var_index; + endfunction(0,0,(yyvsp[(2) - (10)].id),&(yyvsp[(4) - (10)].params),(yyvsp[(6) - (10)].classinfo),c); + + (yyval.value).c = abc_getlocal(0, index); + (yyval.value).t = TYPE_FUNCTION(f); + + PASS12 list_deep_free((yyvsp[(4) - (10)].params).list); +} + } + break; + + + + case 228: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1369 "parser.y" + { + PASS1 NEW(unresolvedinfo_t,c); + memset(c, 0, sizeof(*c)); + c->kind = INFOTYPE_UNRESOLVED; + c->name = (yyvsp[(1) - (1)].id); + c->package = get_package_from_name((yyvsp[(1) - (1)].id)); + if(!c->package) { + c->nsset = get_current_imports(); + /* make the compiler look for this class in the current directory, + just in case: */ + as3_schedule_class_noerror(state->package, (yyvsp[(1) - (1)].id)); + } + (yyval.classinfo) = (classinfo_t*)c; + PASS2 + slotinfo_t*s = find_class((yyvsp[(1) - (1)].id)); + if(!s) syntaxerror("Could not find class/method %s (current package: %s)\n", (yyvsp[(1) - (1)].id), state->package); + (yyval.classinfo) = (classinfo_t*)s; + registry_use(s); +} + } + break; + + + + case 229: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1389 "parser.y" + { + PASS1 NEW(unresolvedinfo_t,c); + memset(c, 0, sizeof(*c)); + c->kind = INFOTYPE_UNRESOLVED; + c->package = (yyvsp[(1) - (3)].id); + c->name = (yyvsp[(3) - (3)].id); + (yyval.classinfo) = (classinfo_t*)c; + PASS2 + slotinfo_t*s = registry_find((yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].id)); + if(!s) syntaxerror("Couldn't find class/method %s.%s\n", (yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].id)); + free((yyvsp[(1) - (3)].id));(yyvsp[(1) - (3)].id)=0; + (yyval.classinfo) = (classinfo_t*)s; + registry_use(s); +} + } + break; + + + + case 232: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1407 "parser.y" + {PASS12 (yyval.classinfo_list)=list_new();list_append((yyval.classinfo_list), (yyvsp[(1) - (1)].classinfo));} + } + break; + + + + case 233: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1408 "parser.y" + {PASS12 (yyval.classinfo_list)=(yyvsp[(1) - (3)].classinfo_list);list_append((yyval.classinfo_list),(yyvsp[(3) - (3)].classinfo));} + } + break; + + + + case 234: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1410 "parser.y" + {PASS12 (yyval.classinfo)=(yyvsp[(1) - (1)].classinfo);} + } + break; + + + + case 235: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1411 "parser.y" + {PASS12 (yyval.classinfo)=TYPE_ANY;} + } + break; + + + + case 236: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1412 "parser.y" + {PASS12 (yyval.classinfo)=TYPE_VOID;} + } + break; + + + + case 237: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1421 "parser.y" + {PASS12 (yyval.classinfo)=(yyvsp[(2) - (2)].classinfo);} + } + break; + + + + case 238: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1422 "parser.y" + {PASS12 (yyval.classinfo)=0;} + } + break; + + + + case 239: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1426 "parser.y" + {(yyval.value_list).cc=0;(yyval.value_list).number=0;} + } + break; + + + + case 240: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1427 "parser.y" + {(yyval.value_list)=(yyvsp[(2) - (3)].value_list);} + } + break; + + + + case 241: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1429 "parser.y" + {(yyval.value_list).cc=0;(yyval.value_list).number=0;} + } + break; + + + + case 244: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1433 "parser.y" + {(yyval.value_list).number=1; + (yyval.value_list).cc = (yyvsp[(1) - (1)].value).c; + } + } + break; + + + + case 245: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1437 "parser.y" + {(yyval.value_list) = (yyvsp[(1) - (2)].value_list);} + } + break; + + + + case 246: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1438 "parser.y" + { + (yyval.value_list).number= (yyvsp[(1) - (2)].value_list).number+1; + (yyval.value_list).cc = code_append((yyvsp[(1) - (2)].value_list).cc, (yyvsp[(2) - (2)].value).c); + } + } + break; + + + + case 248: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1444 "parser.y" + { + typedcode_t v = node_read((yyvsp[(2) - (4)].node)); + (yyval.value).c = v.c; + if((yyval.value).c->opcode == OPCODE_COERCE_A) (yyval.value).c = code_cutlast((yyval.value).c); + + code_t*paramcode = (yyvsp[(4) - (4)].value_list).cc; + if((yyval.value).c->opcode == OPCODE_GETPROPERTY) { + multiname_t*name = (yyval.value).c->data[0];(yyval.value).c->data[0]=0; + (yyval.value).c = code_cutlast((yyval.value).c); + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_constructprop2((yyval.value).c, name, (yyvsp[(4) - (4)].value_list).number); + multiname_destroy(name); + } else if(is_getlocal((yyval.value).c)) { + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_construct((yyval.value).c, (yyvsp[(4) - (4)].value_list).number); + } else if(TYPE_IS_CLASS(v.t) && v.t->data) { + code_free((yyval.value).c); + classinfo_t*c = v.t->data; + MULTINAME(m, c); + (yyval.value).c = abc_findpropstrict2(0, &m); + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_constructprop2((yyval.value).c, &m, (yyvsp[(4) - (4)].value_list).number); + /*} else if($$.c->opcode == OPCODE_GETSLOT) { + int slot = (int)(ptroff_t)$$.c->data[0]; + trait_t*t = traits_find_slotid(state->cls->abc->traits,slot);//FIXME + multiname_t*name = t->name; + $$.c = code_cutlast($$.c); + $$.c = code_append($$.c, paramcode); + $$.c = abc_constructprop2($$.c, name, $4.number);*/ + } else { + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_construct((yyval.value).c, (yyvsp[(4) - (4)].value_list).number); + } + + (yyval.value).t = TYPE_ANY; + if(TYPE_IS_CLASS(v.t) && v.t->data) { + (yyval.value).t = v.t->data; + } else { + (yyval.value).c = abc_coerce_a((yyval.value).c); + (yyval.value).t = TYPE_ANY; + } +} + } + break; + + + + case 249: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1491 "parser.y" + { + + typedcode_t v = node_read((yyvsp[(1) - (4)].node)); + (yyval.value).c = v.c; + if((yyval.value).c->opcode == OPCODE_COERCE_A) { + (yyval.value).c = code_cutlast((yyval.value).c); + } + code_t*paramcode = (yyvsp[(3) - (4)].value_list).cc; + + (yyval.value).t = TYPE_ANY; + if((yyval.value).c->opcode == OPCODE_GETPROPERTY) { + multiname_t*name = (yyval.value).c->data[0];(yyval.value).c->data[0]=0; + (yyval.value).c = code_cutlast((yyval.value).c); + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_callproperty2((yyval.value).c, name, (yyvsp[(3) - (4)].value_list).number); + multiname_destroy(name); +/* } else if($$.c->opcode == OPCODE_GETSLOT && $$.c->prev->opcode != OPCODE_GETSCOPEOBJECT) { + int slot = (int)(ptroff_t)$$.c->data[0]; + trait_t*t = traits_find_slotid(state->cls->abc->traits,slot); + if(t->kind!=TRAIT_METHOD) { + //ok: flash allows to assign closures to members. + } + multiname_t*name = t->name; + $$.c = code_cutlast($$.c); + $$.c = code_append($$.c, paramcode); + //$$.c = abc_callmethod($$.c, t->method, len); //#1051 illegal early access binding + $$.c = abc_callproperty2($$.c, name, $3.number);*/ + } else if((yyval.value).c->opcode == OPCODE_GETSUPER) { + multiname_t*name = (yyval.value).c->data[0];(yyval.value).c->data[0]=0; + (yyval.value).c = code_cutlast((yyval.value).c); + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_callsuper2((yyval.value).c, name, (yyvsp[(3) - (4)].value_list).number); + multiname_destroy(name); + } else { + (yyval.value).c = abc_getglobalscope((yyval.value).c); + (yyval.value).c = code_append((yyval.value).c, paramcode); + (yyval.value).c = abc_call((yyval.value).c, (yyvsp[(3) - (4)].value_list).number); + } + + if(TYPE_IS_FUNCTION(v.t) && v.t->data) { + (yyval.value).t = ((methodinfo_t*)(v.t->data))->return_type; + } else if(TYPE_IS_CLASS(v.t) && v.t->data) { + // calling a class is like a typecast + (yyval.value).t = (classinfo_t*)v.t->data; + } else { + (yyval.value).t = TYPE_ANY; + (yyval.value).c = abc_coerce_a((yyval.value).c); + } +} + } + break; + + + + case 250: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1541 "parser.y" + { + if(!state->cls) syntaxerror("super() not allowed outside of a class"); + if(!state->method) syntaxerror("super() not allowed outside of a function"); + if(!state->method->is_constructor) syntaxerror("super() not allowed outside of a constructor"); + + (yyval.value).c = code_new(); + (yyval.value).c = abc_getlocal_0((yyval.value).c); + + (yyval.value).c = code_append((yyval.value).c, (yyvsp[(3) - (4)].value_list).cc); + /* + this is dependent on the control path, check this somewhere else + if(state->method->has_super) + syntaxerror("constructor may call super() only once"); + */ + state->method->has_super = 1; + + (yyval.value).c = abc_constructsuper((yyval.value).c, (yyvsp[(3) - (4)].value_list).number); + (yyval.value).c = abc_pushundefined((yyval.value).c); + (yyval.value).t = TYPE_ANY; +} + } + break; + + + + case 251: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1562 "parser.y" + { + typedcode_t v = node_read((yyvsp[(2) - (2)].node)); + (yyval.value).c = v.c; + if((yyval.value).c->opcode == OPCODE_COERCE_A) { + (yyval.value).c = code_cutlast((yyval.value).c); + } + multiname_t*name = 0; + if((yyval.value).c->opcode == OPCODE_GETPROPERTY) { + (yyval.value).c->opcode = OPCODE_DELETEPROPERTY; + } else if((yyval.value).c->opcode == OPCODE_GETSLOT) { + int slot = (int)(ptroff_t)(yyval.value).c->data[0]; + multiname_t*name = traits_find_slotid(state->cls->abc->traits,slot)->name; + (yyval.value).c = code_cutlast((yyval.value).c); + (yyval.value).c = abc_deleteproperty2((yyval.value).c, name); + } else { + (yyval.value).c = abc_getlocal_0((yyval.value).c); + MULTINAME_LATE(m, v.t?v.t->access:ACCESS_PACKAGE, ""); + (yyval.value).c = abc_deleteproperty2((yyval.value).c, &m); + } + (yyval.value).t = TYPE_BOOLEAN; +} + } + break; + + + + case 252: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1584 "parser.y" + { + (yyval.code) = abc_returnvoid(0); +} + } + break; + + + + case 253: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1587 "parser.y" + { + (yyval.code) = (yyvsp[(2) - (2)].value).c; + (yyval.code) = abc_returnvalue((yyval.code)); +} + } + break; + + + + case 254: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1594 "parser.y" + { + (yyval.value) = node_read((yyvsp[(1) - (1)].node)); +} + } + break; + + + + case 255: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1597 "parser.y" + { + (yyval.value) = node_read((yyvsp[(1) - (1)].node)); +} + } + break; + + + + case 256: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1600 "parser.y" + { + (yyval.node) = mkmultinode(&node_comma, (yyvsp[(1) - (1)].node)); +} + } + break; + + + + case 257: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1603 "parser.y" + { + (yyval.node) = multinode_extend((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); +} + } + break; + + + + case 258: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1606 "parser.y" + { + (yyval.code) = node_exec((yyvsp[(1) - (1)].node)); +} + } + break; + + + + case 259: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1609 "parser.y" + { + (yyval.code) = (yyvsp[(1) - (3)].code); + (yyval.code) = code_append((yyval.code), node_exec((yyvsp[(3) - (3)].node))); +} + } + break; + + + + case 260: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1614 "parser.y" + {(yyval.value_list).cc=0;(yyval.value_list).number=0;} + } + break; + + + + case 261: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1615 "parser.y" + {(yyval.value_list)=(yyvsp[(1) - (1)].value_list);} + } + break; + + + + case 262: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1617 "parser.y" + {(yyval.code)=abc_pushstring(0,(yyvsp[(1) - (1)].id));} + } + break; + + + + case 263: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1618 "parser.y" + {(yyval.code)=abc_pushstring2(0,&(yyvsp[(1) - (1)].str));} + } + break; + + + + case 264: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1619 "parser.y" + {syntaxerror("dictionary keys must be strings");} + } + break; + + + + case 265: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1620 "parser.y" + {syntaxerror("dictionary keys must be strings");} + } + break; + + + + case 266: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1621 "parser.y" + {syntaxerror("dictionary keys must be strings");} + } + break; + + + + case 267: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1623 "parser.y" + { + (yyval.value_list).cc = 0; + (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(1) - (3)].code)); + (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(3) - (3)].value).c); + (yyval.value_list).number = 2; +} + } + break; + + + + case 268: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1629 "parser.y" + { + (yyval.value_list).cc = (yyvsp[(1) - (5)].value_list).cc; + (yyval.value_list).number = (yyvsp[(1) - (5)].value_list).number+2; + (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(3) - (5)].code)); + (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(5) - (5)].value).c); +} + } + break; + + + + case 269: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1638 "parser.y" + {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} + } + break; + + + + case 270: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1639 "parser.y" + {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} + } + break; + + + + case 271: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1640 "parser.y" + {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} + } + break; + + + + case 272: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1641 "parser.y" + {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} + } + break; + + + + case 273: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1642 "parser.y" + {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} + } + break; + + + + case 274: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1643 "parser.y" + {(yyval.node) = (yyvsp[(1) - (1)].node);} + } + break; + + + + case 275: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1645 "parser.y" + { + (yyval.node) = mkconstnode((yyvsp[(1) - (1)].constant)); +} + } + break; + + + + case 276: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1649 "parser.y" + { + (yyval.node) = (yyvsp[(1) - (1)].node); +} + } + break; + + + + case 277: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1654 "parser.y" + { + typedcode_t v; + v.c = 0; + multiname_t m = {QNAME, &stdns, 0, "RegExp"}; + if(!(yyvsp[(1) - (1)].regexp).options) { + v.c = abc_getlex2(v.c, &m); + v.c = abc_pushstring(v.c, (yyvsp[(1) - (1)].regexp).pattern); + v.c = abc_construct(v.c, 1); + } else { + v.c = abc_getlex2(v.c, &m); + v.c = abc_pushstring(v.c, (yyvsp[(1) - (1)].regexp).pattern); + v.c = abc_pushstring(v.c, (yyvsp[(1) - (1)].regexp).options); + v.c = abc_construct(v.c, 2); + } + v.t = TYPE_REGEXP; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 278: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1672 "parser.y" + { + PASS1 + state->method->need_arguments = 1; + PASS2 + typedcode_t v; + v.c = abc_getlocal(0, state->method->need_arguments); + v.t = TYPE_ARRAY; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 279: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1683 "parser.y" + { + typedcode_t v; + v.c = code_new(); + v.c = code_append(v.c, (yyvsp[(2) - (3)].value_list).cc); + v.c = abc_newarray(v.c, (yyvsp[(2) - (3)].value_list).number); + v.t = registry_getarrayclass(); + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 280: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1693 "parser.y" + { + typedcode_t v; + v.c = code_new(); + v.c = code_append(v.c, (yyvsp[(2) - (3)].value_list).cc); + v.c = abc_newobject(v.c, (yyvsp[(2) - (3)].value_list).number/2); + v.t = registry_getobjectclass(); + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 281: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1702 "parser.y" + {(yyval.node) = mknode2(&node_lt,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 282: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1703 "parser.y" + {(yyval.node) = mknode2(&node_gt,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 283: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1704 "parser.y" + {(yyval.node) = mknode2(&node_le,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 284: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1705 "parser.y" + {(yyval.node) = mknode2(&node_ge,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 285: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1706 "parser.y" + {(yyval.node) = mknode2(&node_eqeq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 286: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1707 "parser.y" + {(yyval.node) = mknode2(&node_eqeqeq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 287: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1708 "parser.y" + {(yyval.node) = mknode2(&node_noteqeq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 288: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1709 "parser.y" + {(yyval.node) = mknode2(&node_noteq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 289: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1710 "parser.y" + {(yyval.node) = mknode2(&node_oror,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 290: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1711 "parser.y" + {(yyval.node) = mknode2(&node_andand,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} + } + break; + + + + case 291: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1712 "parser.y" + {(yyval.node) = mknode1(&node_not, (yyvsp[(2) - (2)].node));} + } + break; + + + + case 292: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1713 "parser.y" + {(yyval.node) = mknode1(&node_bitnot, (yyvsp[(2) - (2)].node));} + } + break; + + + + case 293: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1714 "parser.y" + {(yyval.node) = mknode2(&node_bitand, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 294: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1715 "parser.y" + {(yyval.node) = mknode2(&node_bitxor, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 295: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1716 "parser.y" + {(yyval.node) = mknode2(&node_bitor, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 296: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1717 "parser.y" + {(yyval.node) = mknode2(&node_shr, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 297: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1718 "parser.y" + {(yyval.node) = mknode2(&node_ushr, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 298: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1719 "parser.y" + {(yyval.node) = mknode2(&node_shl, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 299: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1720 "parser.y" + {(yyval.node) = mknode2(&node_div, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 300: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1721 "parser.y" + {(yyval.node) = mknode2(&node_mod, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 301: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1722 "parser.y" + {(yyval.node) = mknode2(&node_plus, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 302: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1723 "parser.y" + {(yyval.node) = mknode2(&node_minus, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 303: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1724 "parser.y" + {(yyval.node) = mknode2(&node_multiply, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 304: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1725 "parser.y" + {(yyval.node) = mknode2(&node_in, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 305: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1726 "parser.y" + {(yyval.node) = mknode2(&node_as, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 306: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1727 "parser.y" + {(yyval.node) = mknode2(&node_instanceof, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 307: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1728 "parser.y" + {(yyval.node) = mknode2(&node_is, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 308: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1729 "parser.y" + {(yyval.node) = mknode1(&node_typeof, (yyvsp[(2) - (2)].node));} + } + break; + + + + case 309: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1730 "parser.y" + {(yyval.node) = mknode1(&node_void, (yyvsp[(2) - (2)].node));} + } + break; + + + + case 310: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1731 "parser.y" + { (yyval.node) = mkconstnode(constant_new_undefined());} + } + break; + + + + case 311: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1732 "parser.y" + { (yyval.node)=(yyvsp[(2) - (3)].node);} + } + break; + + + + case 312: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1733 "parser.y" + {(yyval.node) = mknode1(&node_neg, (yyvsp[(2) - (2)].node));} + } + break; + + + + case 313: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1734 "parser.y" + {(yyval.node) = mknode2(&node_arraylookup, (yyvsp[(1) - (4)].node),(yyvsp[(3) - (4)].node));} + } + break; + + + + case 314: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1735 "parser.y" + {(yyval.node) = mknode2(&node_muleq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 315: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1736 "parser.y" + {(yyval.node) = mknode2(&node_modeq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 316: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1737 "parser.y" + {(yyval.node) = mknode2(&node_shleq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 317: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1738 "parser.y" + {(yyval.node) = mknode2(&node_shreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 318: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1739 "parser.y" + {(yyval.node) = mknode2(&node_ushreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 319: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1740 "parser.y" + { (yyval.node) = mknode2(&node_diveq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 320: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1741 "parser.y" + { (yyval.node) = mknode2(&node_bitoreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 321: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1742 "parser.y" + { (yyval.node) = mknode2(&node_bitxoreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 322: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1743 "parser.y" + { (yyval.node) = mknode2(&node_bitandeq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 323: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1744 "parser.y" + { (yyval.node) = mknode2(&node_pluseq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 324: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1745 "parser.y" + { (yyval.node) = mknode2(&node_minuseq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 325: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1746 "parser.y" + { (yyval.node) = mknode2(&node_assign, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} + } + break; + + + + case 326: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1747 "parser.y" + { (yyval.node) = mknode3(&node_tenary, (yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].node), (yyvsp[(5) - (5)].node));} + } + break; + + + + case 327: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1749 "parser.y" + { (yyval.node) = mknode1(&node_rplusplus, (yyvsp[(1) - (2)].node));} + } + break; + + + + case 328: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1750 "parser.y" + { (yyval.node) = mknode1(&node_rminusminus, (yyvsp[(1) - (2)].node));} + } + break; + + + + case 329: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1751 "parser.y" + {(yyval.node) = mknode1(&node_lplusplus, (yyvsp[(2) - (2)].node)); } + } + break; + + + + case 330: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1752 "parser.y" + {(yyval.node) = mknode1(&node_lminusminus, (yyvsp[(2) - (2)].node)); } + } + break; + + + + case 331: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1755 "parser.y" + { if(!state->cls->info) + syntaxerror("super keyword not allowed outside a class"); + classinfo_t*t = state->cls->info->superclass; + if(!t) t = TYPE_OBJECT; + memberinfo_t*f = findmember_nsset(t, (yyvsp[(3) - (3)].id), 1, 0); + MEMBER_MULTINAME(m, f, (yyvsp[(3) - (3)].id)); + typedcode_t v; + v.c = 0; + v.c = abc_getlocal_0(v.c); + v.c = abc_getsuper2(v.c, &m); + v.t = slotinfo_gettype((slotinfo_t*)f); + (yyval.node) = mkcodenode(v); + } + } + break; + + + + case 332: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1769 "parser.y" + { + typedcode_t v; + multiname_t m = {MULTINAMEA, 0, &nopackage_namespace_set, (yyvsp[(2) - (2)].id)}; + v.c = abc_getlex2(0, &m); + v.t = TYPE_STRING; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 333: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1777 "parser.y" + {PASS12 new_state();state->xmlfilter=1;} + } + break; + + + + case 334: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1777 "parser.y" + { + PASS1 old_state(); + PASS2 + typedcode_t v = node_read((yyvsp[(1) - (6)].node)); + typedcode_t w = node_read((yyvsp[(5) - (6)].node)); + code_t*c = 0; + int index = alloc_local(); + int result = alloc_local(); + int tmp = alloc_local(); + int xml = alloc_local(); + + c = code_append(c, v.c); + c = abc_checkfilter(c); + c = abc_coerce_a(c); //hasnext2 converts to * + c = abc_setlocal(c, xml); + multiname_t m = {QNAME, &stdns, 0, "XMLList"}; + c = abc_getlex2(c, &m); + c = abc_construct(c, 0); + c = abc_setlocal(c, result); + c = abc_pushbyte(c, 0); + c = abc_setlocal(c, index); + code_t*jmp = c = abc_jump(c, 0); + code_t*loop = c = abc_label(c); + c = abc_getlocal(c, xml); + c = abc_getlocal(c, index); + c = abc_nextvalue(c); + c = abc_dup(c); + c = abc_setlocal(c, tmp); + c = abc_pushwith(c); + c = code_append(c, w.c); + c = abc_popscope(c); + code_t*b = c = abc_iffalse(c, 0); + c = abc_getlocal(c, result); + c = abc_getlocal(c, index); + c = abc_getlocal(c, tmp); + multiname_t m2 = {MULTINAMEL, 0, &nopackage_namespace_set, 0}; + c = abc_setproperty2(c, &m2); + c = b->branch = jmp->branch = abc_nop(c); + c = abc_kill(c, tmp); + c = abc_hasnext2(c, xml, index); + c = abc_iftrue(c, loop); + c = abc_getlocal(c, result); + c = abc_kill(c, xml); + c = abc_kill(c, result); + c = abc_kill(c, index); + + c = var_block(c, state->vars); + old_state(); + typedcode_t r; + r.c = c; + r.t = TYPE_XMLLIST; + (yyval.node) = mkcodenode(r); +} + } + break; + + + + case 335: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1831 "parser.y" + {(yyval.id)=(yyvsp[(1) - (1)].id);} + } + break; + + + + case 336: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1832 "parser.y" + {(yyval.id)="*";} + } + break; + + + + case 338: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1835 "parser.y" + {(yyval.id)="*";} + } + break; + + + + case 339: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1876 "parser.y" + { +} + } + break; + + + + case 340: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1879 "parser.y" + { + (yyval.node) = get_descendants((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(5) - (5)].id), 0, 0); +} + } + break; + + + + case 341: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1882 "parser.y" + { + typedcode_t v = node_read((yyvsp[(1) - (3)].node)); + multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, (yyvsp[(3) - (3)].id)}; + v.c = abc_getdescendants2(v.c, &m); + v.t = TYPE_XMLLIST; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 342: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1889 "parser.y" + { + (yyval.node) = get_descendants((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(5) - (5)].id), 1, 0); +} + } + break; + + + + case 343: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1892 "parser.y" + { + typedcode_t v = node_read((yyvsp[(1) - (5)].node)); + typedcode_t w = node_read((yyvsp[(4) - (5)].node)); + multiname_t m = {MULTINAMEL, 0, &nopackage_namespace_set, 0}; + v.c = code_append(v.c, w.c); + v.c = converttype(w.c, w.t, TYPE_STRING); + v.c = abc_getproperty2(v.c, &m); + v.t = TYPE_XMLLIST; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 344: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1903 "parser.y" + { + typedcode_t v = node_read((yyvsp[(1) - (4)].node)); + multiname_t m = {MULTINAMEA, 0, &nopackage_namespace_set, (yyvsp[(4) - (4)].id)}; + v.c = abc_getproperty2(v.c, &m); + v.t = TYPE_STRING; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 345: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1911 "parser.y" + { + (yyval.node) = get_descendants((yyvsp[(1) - (6)].node), (yyvsp[(4) - (6)].id), (yyvsp[(6) - (6)].id), 0, 1); +} + } + break; + + + + case 346: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1915 "parser.y" + { + typedcode_t v = node_read((yyvsp[(1) - (4)].node)); + multiname_t m = {MULTINAMEA, 0, &nopackage_namespace_set, (yyvsp[(4) - (4)].id)}; + v.c = abc_getdescendants2(v.c, &m); + v.t = TYPE_STRING; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 347: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1922 "parser.y" + { + (yyval.node) = get_descendants((yyvsp[(1) - (6)].node), (yyvsp[(4) - (6)].id), (yyvsp[(6) - (6)].id), 1, 1); +} + } + break; + + + + case 348: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1926 "parser.y" + { + typedcode_t v = node_read((yyvsp[(1) - (6)].node)); + typedcode_t w = node_read((yyvsp[(5) - (6)].node)); + multiname_t m = {MULTINAMELA, 0, &nopackage_namespace_set, 0}; + v.c = code_append(v.c, w.c); + v.c = converttype(w.c, w.t, TYPE_STRING); + v.c = abc_getproperty2(v.c, &m); + v.t = TYPE_STRING; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 349: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1936 "parser.y" + { + typedcode_t v = node_read((yyvsp[(1) - (6)].node)); + typedcode_t w = node_read((yyvsp[(5) - (6)].node)); + multiname_t m = {MULTINAMELA, 0, &nopackage_namespace_set, 0}; + v.c = code_append(v.c, w.c); + v.c = converttype(w.c, w.t, TYPE_STRING); + v.c = abc_getdescendants2(v.c, &m); + v.t = TYPE_STRING; + (yyval.node) = mkcodenode(v); +} + } + break; + + + + case 350: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 1947 "parser.y" + { + typedcode_t v1 = node_read((yyvsp[(1) - (3)].node)); + (yyval.value).c = v1.c; + classinfo_t*t = v1.t; + char is_static = 0; + if(TYPE_IS_CLASS(t) && t->data) { + t = t->data; + is_static = 1; + } + if(TYPE_IS_XML(t) && !findmember_nsset(t, (yyvsp[(3) - (3)].id), 1, is_static)) { + multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, (yyvsp[(3) - (3)].id)}; + (yyval.value).c = abc_getproperty2((yyval.value).c, &m); + (yyval.value).c = abc_coerce_a((yyval.value).c); + (yyval.value).t = TYPE_XMLLIST; + } else if(t) { + if(t->subtype==INFOTYPE_UNRESOLVED) { + syntaxerror("syntaxerror: trying to resolve property '%s' on incomplete object '%s'", (yyvsp[(3) - (3)].id), t->name); + } + memberinfo_t*f = findmember_nsset(t, (yyvsp[(3) - (3)].id), 1, is_static); + char noslot = 0; + if(f && !is_static != !(f->flags&FLAG_STATIC)) + noslot=1; + if(f && f->slot && !noslot) { + (yyval.value).c = abc_getslot((yyval.value).c, f->slot); + } else { + if(!f) { + if(!TYPE_IS_XMLLIST(t)) { + as3_softwarning("Access of undefined property '%s' in %s", (yyvsp[(3) - (3)].id), t->name); + } + } + MEMBER_MULTINAME(m, f, (yyvsp[(3) - (3)].id)); + (yyval.value).c = abc_getproperty2((yyval.value).c, &m); + } + /* determine type */ + (yyval.value).t = slotinfo_gettype((slotinfo_t*)f); + if(!(yyval.value).t) + (yyval.value).c = abc_coerce_a((yyval.value).c); + + } else if(v1.c && v1.c->opcode == OPCODE___PUSHPACKAGE__) { + string_t*package = v1.c->data[0]; + char*package2 = concat3(package->str, ".", (yyvsp[(3) - (3)].id)); + + slotinfo_t*a = registry_find(package->str, (yyvsp[(3) - (3)].id)); + if(a) { + (yyval.value) = push_class(a); + } else if(dict_contains(state->import_toplevel_packages, package2) || + registry_ispackage(package2)) { + (yyval.value).c = v1.c; + (yyval.value).c->data[0] = string_new4(package2); + (yyval.value).t = 0; + } else { + syntaxerror("couldn't resolve %s", package2); + } + } else { + /* when resolving a property on an unknown type, we do know the + name of the property (and don't seem to need the package), but + we need to make avm2 try out all access modes */ + as3_softwarning("Resolving %s on unknown type", (yyvsp[(3) - (3)].id)); + multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, (yyvsp[(3) - (3)].id)}; + (yyval.value).c = abc_getproperty2((yyval.value).c, &m); + (yyval.value).c = abc_coerce_a((yyval.value).c); + (yyval.value).t = TYPE_ANY; + } +} + } + break; + + + + case 352: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2145 "parser.y" + { + PASS1 + char*name = (yyvsp[(2) - (2)].id); + /* Queue unresolved identifiers for checking against the parent + function's variables. + We consider everything which is not a local variable "unresolved". + This encompasses class names, members of the surrounding class + etc. which is *correct* because local variables of the parent function + would shadow those. + */ + + if(!find_variable(state, name)) { + unknown_variable(name); + /* let the compiler know that it might want to check the current directory/package + for this identifier- maybe there's a file $1.as defining $1. */ + as3_schedule_class_noerror(state->package, name); + } + + (yyval.node) = 0; + PASS2 + char*name = (yyvsp[(2) - (2)].id); + (yyval.node) = resolve_identifier(name); +} + } + break; + + + + case 353: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2180 "parser.y" + { + PASS12 + NEW(namespace_decl_t,n); + n->name = (yyvsp[(2) - (2)].id); + n->url = (yyvsp[(2) - (2)].id); + (yyval.namespace_decl)=n; +} + } + break; + + + + case 354: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2187 "parser.y" + { + PASS12 + NEW(namespace_decl_t,n); + n->name = (yyvsp[(2) - (4)].id); + n->url = (yyvsp[(4) - (4)].id); + (yyval.namespace_decl)=n; +} + } + break; + + + + case 355: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2194 "parser.y" + { + PASS12 + NEW(namespace_decl_t,n); + n->name = (yyvsp[(2) - (4)].id); + n->url = (yyvsp[(4) - (4)].str).str; + (yyval.namespace_decl)=n; +} + } + break; + + + + case 356: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2201 "parser.y" + { + PASS12 + dict_put(state->namespaces, (unsigned char*)(yyvsp[(2) - (2)].namespace_decl)->name, (void*)(yyvsp[(2) - (2)].namespace_decl)->url); + + namespace_t access = modifiers2access(&(yyvsp[(1) - (2)].flags)); + varinfo_t* var = varinfo_register_global(access.access, state->package, (yyvsp[(2) - (2)].namespace_decl)->name); + var->type = TYPE_NAMESPACE; + namespace_t ns; + ns.access = ACCESS_NAMESPACE; + ns.name = (yyvsp[(2) - (2)].namespace_decl)->url; + var->value = constant_new_namespace(&ns); + + if(as3_pass==2) { + MULTINAME(m, TYPE_NAMESPACE); + trait_t*t = add_abc_slot(&(yyvsp[(1) - (2)].flags), (yyvsp[(2) - (2)].namespace_decl)->name, 0, 0); + t->value = var->value; + t->type_name = multiname_clone(&m); + } + + (yyval.code)=0; +} + } + break; + + + + case 357: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2224 "parser.y" + { + (yyval.code) = 0; + (yyval.code) = code_append((yyval.code), node_read((yyvsp[(4) - (4)].node)).c); + (yyval.code) = abc_dxnslate((yyval.code)); +} + } + break; + + + + case 358: + if(as3_pass==2) { + +/* Line 1464 of skeleton.m4 */ +#line 2230 "parser.y" + { + PASS12 + + varinfo_t*s = (varinfo_t*)(yyvsp[(3) - (3)].classinfo); + if(s->kind == INFOTYPE_UNRESOLVED) { + s = (varinfo_t*)registry_resolve((slotinfo_t*)s); + if(!s) + syntaxerror("Couldn't resolve namespace %s", (yyvsp[(3) - (3)].classinfo)->name); + } + + if(!s || s->kind != INFOTYPE_VAR) + syntaxerror("%s.%s is not a public namespace (%d)", (yyvsp[(3) - (3)].classinfo)->package, (yyvsp[(3) - (3)].classinfo)->name, s?s->kind:-1); + if(!s->value || !NS_TYPE(s->value->type)) + syntaxerror("%s.%s is not a namespace", (yyvsp[(3) - (3)].classinfo)->package, (yyvsp[(3) - (3)].classinfo)->name); + + const char*url = s->value->ns->name; + dict_put(state->namespaces, (unsigned char*)(yyvsp[(3) - (3)].classinfo)->name, (void*)url); + add_active_url(url); + (yyval.code)=0; +} + } + break; + + + + +/* Line 1464 of skeleton.m4 */ +#line 7330 "parser.tab.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h new file mode 100644 index 000000000..f2dfefb7a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h @@ -0,0 +1,208 @@ + +/* A Bison parser, made by GNU Bison 2.4.2. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_IDENTIFIER = 258, + T_STRING = 259, + T_REGEXP = 260, + T_EMPTY = 261, + T_INT = 262, + T_UINT = 263, + T_FLOAT = 264, + T_FOR = 265, + T_WHILE = 266, + T_DO = 267, + T_SWITCH = 268, + KW_IMPLEMENTS = 269, + KW_NAMESPACE = 270, + KW_PACKAGE = 271, + KW_PROTECTED = 272, + KW_ARGUMENTS = 273, + KW_PUBLIC = 274, + KW_PRIVATE = 275, + KW_USE = 276, + KW_INTERNAL = 277, + KW_NEW = 278, + KW_NATIVE = 279, + KW_FUNCTION = 280, + KW_FINALLY = 281, + KW_UNDEFINED = 282, + KW_NAN = 283, + KW_CONTINUE = 284, + KW_CLASS = 285, + KW_CONST = 286, + KW_CATCH = 287, + KW_CASE = 288, + KW_SET = 289, + KW_VOID = 290, + KW_THROW = 291, + KW_STATIC = 292, + KW_WITH = 293, + KW_INSTANCEOF = 294, + KW_IMPORT = 295, + KW_RETURN = 296, + KW_TYPEOF = 297, + KW_INTERFACE = 298, + KW_NULL = 299, + KW_VAR = 300, + KW_DYNAMIC = 301, + KW_OVERRIDE = 302, + KW_FINAL = 303, + KW_EACH = 304, + KW_GET = 305, + KW_TRY = 306, + KW_SUPER = 307, + KW_EXTENDS = 308, + KW_FALSE = 309, + KW_TRUE = 310, + KW_BOOLEAN = 311, + KW_UINT = 312, + KW_INT = 313, + KW_NUMBER = 314, + KW_STRING = 315, + KW_DEFAULT = 316, + KW_DEFAULT_XML = 317, + KW_DELETE = 318, + KW_IF = 319, + KW_ELSE = 320, + KW_BREAK = 321, + KW_IS = 322, + KW_IN = 323, + KW_AS = 324, + T_DICTSTART = 325, + T_EQEQ = 326, + T_EQEQEQ = 327, + T_NE = 328, + T_NEE = 329, + T_LE = 330, + T_GE = 331, + T_ORBY = 332, + T_DIVBY = 333, + T_MODBY = 334, + T_MULBY = 335, + T_ANDBY = 336, + T_PLUSBY = 337, + T_MINUSBY = 338, + T_XORBY = 339, + T_SHRBY = 340, + T_SHLBY = 341, + T_USHRBY = 342, + T_OROR = 343, + T_ANDAND = 344, + T_COLONCOLON = 345, + T_MINUSMINUS = 346, + T_PLUSPLUS = 347, + T_DOTDOT = 348, + T_DOTDOTDOT = 349, + T_SHL = 350, + T_USHR = 351, + T_SHR = 352, + prec_none = 353, + prec_var_read = 354, + below_semicolon = 355, + below_assignment = 356, + below_lt = 357, + below_minus = 358, + minusminus_prefix = 359, + plusplus_prefix = 360, + below_curly = 361, + new2 = 362, + below_identifier = 363, + above_identifier = 364, + below_else = 365, + above_function = 366 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union +/* Line 1685 of skeleton.m4 */ +#line 48 "parser.y" +tokenunion +{ + +/* Line 1685 of skeleton.m4 */ +#line 48 "parser.y" + + enum yytokentype token; + + classinfo_t*classinfo; + classinfo_list_t*classinfo_list; + slotinfo_t*slotinfo; + slotinfo_list_t*slotinfo_list; + + int number_int; + unsigned int number_uint; + double number_float; + code_t*code; + typedcode_t value; + //typedcode_list_t*value_list; + codeandnumber_t value_list; + param_t* param; + params_t params; + string_t str; + char*id; + constant_t*constant; + for_start_t for_start; + abc_exception_t *exception; + regexp_t regexp; + modifiers_t flags; + namespace_decl_t* namespace_decl; + node_t*node; + struct { + abc_exception_list_t *l; + code_t*finally; + } catch_list; + + + +/* Line 1685 of skeleton.m4 */ +#line 200 "parser.tab.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +extern YYSTYPE a3_lval; + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c new file mode 100644 index 000000000..e801ecf75 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c @@ -0,0 +1,1435 @@ +#include "parser_help.h" + +global_t*global = 0; + +static namespace_t ns1 = {ACCESS_PRIVATE, ""}; +static namespace_t ns2 = {ACCESS_PROTECTED, ""}; +static namespace_t ns3 = {ACCESS_PACKAGEINTERNAL, ""}; +namespace_t stdns = {ACCESS_PACKAGE, ""}; +static namespace_list_t nl4 = {&stdns,0}; +static namespace_list_t nl3 = {&ns3,&nl4}; +static namespace_list_t nl2 = {&ns2,&nl3}; +static namespace_list_t nl1 = {&ns1,&nl2}; +namespace_set_t nopackage_namespace_set = {&nl1}; + +static char* internal_filename_package = 0; +void initialize_file(char*filename) +{ + if(state) { + syntaxerror("invalid call to initialize_file during parsing of another file"); + } + + new_state(); + state->package = internal_filename_package = strdup(filename); + + global->token2info = dict_lookup(global->file2token2info, + current_filename // use long version + ); + if(!global->token2info) { + global->token2info = dict_new2(&ptr_type); + dict_put(global->file2token2info, current_filename, global->token2info); + } + + if(as3_pass==1) { + state->method = rfx_calloc(sizeof(methodstate_t)); + dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->method); + state->method->late_binding = 1; // init scripts use getglobalscope, so we need a getlocal0/pushscope + state->method->allvars = dict_new(); + } else { + state->method = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); + state->method->variable_count = 0; + if(!state->method) + syntaxerror("internal error: skewed tokencount"); + function_initvars(state->method, 0, 0, 0, 1); + global->init = 0; + } +} + +void finish_file() +{ + if(!state || state->level!=1) { + syntaxerror("unexpected end of file in pass %d", as3_pass); + } + + if(as3_pass==2) { + dict_del(global->file2token2info, current_filename); + code_t*header = method_header(state->method); + //if(global->init->method->body->code || global->init->traits) { + if(global->init) { + code_t*c = wrap_function(header, 0, global->init->method->body->code); + global->init->method->body->code = abc_returnvoid(c); + free(state->method);state->method=0; + } + } + + //free(state->package);state->package=0; // used in registry + state_destroy(state);state=0; +} + +void initialize_parser() +{ + global = rfx_calloc(sizeof(global_t)); + global->file = abc_file_new(); + global->file->flags &= ~ABCFILE_LAZY; + global->file2token2info = dict_new(); + global->token2info = 0; + global->classinit = abc_initscript(global->file); +} + +void* finish_parser() +{ + dict_free_all(global->file2token2info, 1, (void*)dict_destroy); + global->token2info=0; + + initcode_add_classlist(global->classinit, global->classes); + + return global->file; +} + +variable_t* find_variable(state_t*s, const char*name) +{ + if(s->method->no_variable_scoping) { + return dict_lookup(s->method->allvars, name); + } else { + state_t*top = s; + while(s) { + variable_t*v = 0; + v = dict_lookup(s->vars, name); + if(v) return v; + if(s->new_vars) break; + s = s->old; + } + return 0; + } +} +variable_t* find_slot(methodstate_t*m, const char*name) +{ + if(m && m->slots) + return dict_lookup(m->slots, name); + return 0; +} + +variable_t* find_variable_safe(state_t*s, char*name) +{ + variable_t* v = find_variable(s, name); + if(!v) + syntaxerror("undefined variable: %s", name); + return v; +} + +char variable_exists(char*name) +{ + return dict_contains(state->vars, name); +} + +code_t*defaultvalue(code_t*c, classinfo_t*type) +{ + as3_assert(!type || type->kind!=INFOTYPE_UNRESOLVED); + if(TYPE_IS_INT(type)) { + c = abc_pushbyte(c, 0); + } else if(TYPE_IS_UINT(type)) { + c = abc_pushuint(c, 0); + } else if(TYPE_IS_FLOAT(type)) { + c = abc_pushnan(c); + } else if(TYPE_IS_BOOLEAN(type)) { + c = abc_pushfalse(c); + } else if(TYPE_IS_STRING(type)) { + c = abc_pushnull(c); + c = abc_coerce_s(c); + } else if(!type) { + //c = abc_pushundefined(c); + syntaxerror("internal error: can't generate default value for * type"); + } else { + c = abc_pushnull(c); + MULTINAME(m, type); + c = abc_coerce2(c, &m); + } + return c; +} + +int alloc_local() +{ + return state->method->variable_count++; +} + +variable_t* new_variable2(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot) +{ + if(maybeslot) { + variable_t*v = find_slot(method, name); + if(v) { + alloc_local(); + return v; + } + } + + NEW(variable_t, v); + v->type = type; + v->init = v->kill = init; + + if(name) { + if(!method->no_variable_scoping) { + if(dict_contains(state->vars, name)) { + syntaxerror("variable %s already defined", name); + } + v->index = alloc_local(); + dict_put(state->vars, name, v); + } else { + if(as3_pass==2 && dict_contains(state->method->allvars, name)) { + variable_t*v = dict_lookup(state->method->allvars, name); + if(v->type != type && (!v->type || v->type->kind!=INFOTYPE_UNRESOLVED)) { + syntaxerror("variable %s already defined.", name); + } + return v; + } + v->index = alloc_local(); + } + dict_put(state->method->allvars, name, v); + } else { + v->index = alloc_local(); + } + return v; +} +int new_variable(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot) +{ + return new_variable2(method, name, type, init, maybeslot)->index; +} + +#define TEMPVARNAME "__as3_temp__" +int gettempvar() +{ + variable_t*v = find_variable(state, TEMPVARNAME); + int i; + if(v) + i = v->index; + else + i = new_variable(state->method, TEMPVARNAME, 0, 0, 0); + as3_assert(i); + return i; +} +code_t* var_block(code_t*body, dict_t*vars) +{ + code_t*c = 0; + code_t*k = 0; + int t; + DICT_ITERATE_DATA(vars, variable_t*, v) { + if(v->type && v->init) { + c = defaultvalue(c, v->type); + c = abc_setlocal(c, v->index); + } + if(v->type && v->kill) { + k = abc_kill(k, v->index); + } + } + + if(k) { + code_t*x = body; + while(x) { + if(x->opcode== OPCODE___BREAK__ || + x->opcode== OPCODE___CONTINUE__) { + /* link kill code before break/continue */ + code_t*e = code_dup(k); + code_t*s = code_start(e); + s->prev = x->prev; + if(x->prev) { + x->prev->next = s; + } + e->next = x; + x->prev = e; + } + x = x->prev; + } + } + + c = code_append(c, body); + c = code_append(c, k); + return c; +} + +void unknown_variable(char*name) +{ + if(!state->method->unresolved_variables) + state->method->unresolved_variables = dict_new(); + if(!dict_contains(state->method->unresolved_variables, name)) + dict_put(state->method->unresolved_variables, name, 0); +} +code_t* add_scope_code(code_t*c, methodstate_t*m, char init) +{ + if(m->uses_slots || m->innerfunctions || (m->late_binding && !m->inner)) { + c = abc_getlocal_0(c); + c = abc_pushscope(c); + } + if(m->uses_slots) { + /* FIXME: this alloc_local() causes variable indexes to be + different in pass2 than in pass1 */ + if(!m->activation_var) { + m->activation_var = alloc_local(); + } + if(init) { + c = abc_newactivation(c); + c = abc_dup(c); + c = abc_pushscope(c); + c = abc_setlocal(c, m->activation_var); + } else { + c = abc_getlocal(c, m->activation_var); + c = abc_pushscope(c); + } + } + return c; +} + +code_t* method_header(methodstate_t*m) +{ + code_t*c = 0; + + c = add_scope_code(c, m, 1); + + methodstate_list_t*l = m->innerfunctions; + while(l) { + as3_assert(l->methodstate->abc); + if(m->uses_slots && l->methodstate->is_a_slot) { + c = abc_getscopeobject(c, 1); + c = abc_newfunction(c, l->methodstate->abc); + c = abc_dup(c); + c = abc_setlocal(c, l->methodstate->var_index); + c = abc_setslot(c, l->methodstate->slot_index); + } else { + c = abc_newfunction(c, l->methodstate->abc); + c = abc_setlocal(c, l->methodstate->var_index); + } + free(l->methodstate);l->methodstate=0; + l = l->next; + } + if(m->header) { + c = code_append(c, m->header); + m->header = 0; + } + if(m->is_constructor && !m->has_super) { + // call default constructor + c = abc_getlocal_0(c); + c = abc_constructsuper(c, 0); + } + + if(m->slots) { + /* all parameters that are used by inner functions + need to be copied from local to slot */ + as3_assert(m->activation_var); + DICT_ITERATE_ITEMS(m->slots,char*,name,variable_t*,v) { + if(v->is_parameter) { + c = abc_getlocal(c, m->activation_var); + c = abc_getlocal(c, v->index); + c = abc_setslot(c, v->index); + } + } + } + list_free(m->innerfunctions); + m->innerfunctions = 0; + return c; +} + + +code_t* wrap_function(code_t*c,code_t*header, code_t*body) +{ + c = code_append(c, header); + c = code_append(c, var_block(body, state->method->no_variable_scoping?state->method->allvars:state->vars)); + /* append return if necessary */ + if(!c || (c->opcode != OPCODE_RETURNVOID && + c->opcode != OPCODE_RETURNVALUE)) { + c = abc_returnvoid(c); + } + return c; +} + +void startpackage(char*name) +{ + new_state(); + state->package = strdup(name); +} +void endpackage() +{ + //used e.g. in classinfo_register: + //free(state->package);state->package=0; + old_state(); +} + +const char* lookup_namespace(const char*name) +{ + state_t*s = state; + while(s) { + const char*url = dict_lookup(s->namespaces, name); + if(url) + return url; + s = s->old; + } + varinfo_t*a; + registry_find(state->package, name); + if(( a = (varinfo_t*)find_class(name) )) { + if(a->kind == INFOTYPE_VAR) { + if(!a->value || !NS_TYPE(a->value->type)) + syntaxerror("%s.%s is not a namespace", a->package, a->name); + return a->value->ns->name; + } + } + return 0; +} + +namespace_t modifiers2access(modifiers_t*mod) +{ + namespace_t ns; + ns.access = 0; + ns.name = ""; + if(mod->flags&FLAG_NAMESPACE) { + if(mod->flags&(FLAG_PRIVATE|FLAG_PROTECTED|FLAG_PACKAGEINTERNAL)) + syntaxerror("invalid combination of access levels and namespaces"); + ns.access = ACCESS_NAMESPACE; + const char*url = lookup_namespace(mod->ns); + if(!url) { + if(as3_pass>1) { + syntaxerror("unknown namespace: %s (pass %d)", mod->ns, as3_pass); + } else { + url = mod->ns; + } + } + ns.name = url; + } else if(mod->flags&FLAG_PUBLIC) { + if(mod->flags&(FLAG_PRIVATE|FLAG_PROTECTED|FLAG_PACKAGEINTERNAL)) + syntaxerror("invalid combination of access levels"); + ns.access = ACCESS_PACKAGE; + } else if(mod->flags&FLAG_PRIVATE) { + if(mod->flags&(FLAG_PUBLIC|FLAG_PROTECTED|FLAG_PACKAGEINTERNAL)) + syntaxerror("invalid combination of access levels"); + ns.access = ACCESS_PRIVATE; + } else if(mod->flags&FLAG_PROTECTED) { + if(mod->flags&(FLAG_PUBLIC|FLAG_PRIVATE|FLAG_PACKAGEINTERNAL)) + syntaxerror("invalid combination of access levels"); + ns.access = ACCESS_PROTECTED; + } else { + ns.access = ACCESS_PACKAGEINTERNAL; + } + return ns; +} + +memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse, char is_static) +{ + return registry_findmember_nsset(cls, state->active_namespace_urls, name, recurse, is_static); +} + +void innerfunctions2vars(methodstate_t*m) +{ + methodstate_list_t*l = m->innerfunctions; + while(l) { + methodstate_t*m = l->methodstate; + variable_t* v = new_variable2(state->method, m->info->name, TYPE_FUNCTION(m->info), 0, 0); + m->var_index = v->index; + if(m->is_a_slot) + m->slot_index = m->is_a_slot; + v->is_inner_method = m; + l = l->next; + } +} + +void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0) +{ + if(var0) { + int index = -1; + if(m->inner) + index = new_variable(m, "this", 0, 0, 0); + else if(!m->is_global) + index = new_variable(m, (flags&FLAG_STATIC)?"class":"this", state->cls?state->cls->info:0, 0, 0); + else + index = new_variable(m, "globalscope", 0, 0, 0); + if(index) { + DICT_ITERATE_ITEMS(state->vars, char*, name, variable_t*, v) { + printf("%s %d\n", name, v->index); + } + } + as3_assert(!index); + } + + if(has_params) { + param_list_t*p=0; + for(p=params->list;p;p=p->next) { + variable_t*v = new_variable2(m, p->param->name, p->param->type, 0, 1); + v->is_parameter = 1; + } + if(as3_pass==2 && m->need_arguments) { + /* arguments can never be used by an innerfunction (the inner functions + have their own arguments var), so it's ok to not initialize this until + pass 2. (We don't know whether we need it before, anyway) */ + variable_t*v = new_variable2(m, "arguments", TYPE_ARRAY, 0, 0); + m->need_arguments = v->index; + } + } + + innerfunctions2vars(m); + + if(as3_pass==2) { + m->scope_code = add_scope_code(m->scope_code, m, 0); + if(m->slots) { + /* exchange unresolved identifiers with the actual objects */ + DICT_ITERATE_ITEMS(m->slots, char*, name, variable_t*, v1) { + if(v1->type && v1->type->kind == INFOTYPE_UNRESOLVED) { + classinfo_t*type = (classinfo_t*)registry_resolve((slotinfo_t*)v1->type); + if(!type || type->kind != INFOTYPE_CLASS) { + syntaxerror("Couldn't find class %s::%s (%s)", v1->type->package, v1->type->name, name); + } + v1->type = type; + } + } + } + if(m->allvars) { + DICT_ITERATE_ITEMS(m->allvars, char*, name2, variable_t*, v2) { + if(v2->type && v2->type->kind == INFOTYPE_UNRESOLVED) { + classinfo_t*type = (classinfo_t*)registry_resolve((slotinfo_t*)v2->type); + if(!type || type->kind != INFOTYPE_CLASS) { + syntaxerror("Couldn't find class %s::%s (%s)", v2->type->package, v2->type->name, name2); + } + v2->type = type; + } + } + } + } +} + +char*as3_globalclass=0; +void startclass(modifiers_t* mod, char*classname, classinfo_t*extends, classinfo_list_t*implements) +{ + if(state->cls) { + syntaxerror("inner classes now allowed"); + } + + new_state(); + token_list_t*t=0; + classinfo_list_t*mlist=0; + + if(mod->flags&~(FLAG_PACKAGEINTERNAL|FLAG_PUBLIC|FLAG_FINAL|FLAG_DYNAMIC|FLAG_INTERFACE)) + syntaxerror("invalid modifier(s)"); + + if((mod->flags&(FLAG_PUBLIC|FLAG_PACKAGEINTERNAL)) == (FLAG_PUBLIC|FLAG_PACKAGEINTERNAL)) + syntaxerror("public and internal not supported at the same time."); + + if((mod->flags&(FLAG_PROTECTED|FLAG_STATIC)) == (FLAG_PROTECTED|FLAG_STATIC)) + syntaxerror("protected and static not supported at the same time."); + + //if(!(mod->flags&FLAG_INTERFACE) && !extends) { + if(!(mod->flags&FLAG_INTERFACE) && !extends) { + // all classes extend object + extends = registry_getobjectclass(); + } + + /* create the class name, together with the proper attributes */ + int access=0; + char*package=0; + + if(!(mod->flags&FLAG_PUBLIC) && state->package==internal_filename_package) { + access = ACCESS_PRIVATE; package = internal_filename_package; + } else if(!(mod->flags&FLAG_PUBLIC) && state->package!=internal_filename_package) { + access = ACCESS_PACKAGEINTERNAL; package = state->package; + } else if(state->package!=internal_filename_package) { + access = ACCESS_PACKAGE; package = state->package; + } else { + syntaxerror("public classes only allowed inside a package"); + } + + if(as3_pass==1) { + state->cls = rfx_calloc(sizeof(classstate_t)); + state->cls->init = methodstate_new(); + state->cls->static_init = methodstate_new(); + state->cls->static_init->is_static=FLAG_STATIC; + /* notice: we make no effort to initialize the top variable (local0) here, + even though it has special meaning. We just rely on the fact + that pass 1 won't do anything with variables */ + + dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->cls); + + /* set current method to constructor- all code within the class-level (except + static variable initializations) will be executed during construction time */ + state->method = state->cls->init; + + if(registry_find(package, classname)) { + syntaxerror("Package \"%s\" already contains a class called \"%s\"", package, classname); + } + /* build info struct */ + int num_interfaces = (list_length(implements)); + state->cls->info = classinfo_register(access, package, classname, num_interfaces); + state->cls->info->flags |= mod->flags & (FLAG_DYNAMIC|FLAG_INTERFACE|FLAG_FINAL); + state->cls->info->superclass = extends; + + int pos = 0; + classinfo_list_t*l = implements; + for(l=implements;l;l=l->next) { + state->cls->info->interfaces[pos++] = l->classinfo; + } + } + + if(as3_pass == 2) { + state->cls = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); + + as3_assert(state->cls && state->cls->info); + + state->method = state->cls->static_init; + + function_initvars(state->cls->init, 0, 0, 0, 1); + state->cls->static_init->variable_count=1; + function_initvars(state->cls->static_init, 0, 0, 0, 0); + + if(extends && (extends->flags & FLAG_FINAL)) + syntaxerror("Can't extend final class '%s'", extends->name); + + int pos = 0; + while(state->cls->info->interfaces[pos]) { + if(!(state->cls->info->interfaces[pos]->flags & FLAG_INTERFACE)) + syntaxerror("'%s' is not an interface", + state->cls->info->interfaces[pos]->name); + pos++; + } + + /* generate the abc code for this class */ + MULTINAME(classname2,state->cls->info); + multiname_t*extends2 = sig2mname(extends); + + /* don't add the class to the class index just yet- that will be done later + by initscript */ + state->cls->abc = abc_class_new(0, &classname2, extends2); + state->cls->abc->file = global->file; + + multiname_destroy(extends2); + if(state->cls->info->flags&FLAG_FINAL) abc_class_final(state->cls->abc); + if(!(state->cls->info->flags&FLAG_DYNAMIC)) abc_class_sealed(state->cls->abc); + if(state->cls->info->flags&FLAG_INTERFACE) { + abc_class_interface(state->cls->abc); + } + + for(mlist=implements;mlist;mlist=mlist->next) { + MULTINAME(m, mlist->classinfo); + abc_class_add_interface(state->cls->abc, &m); + } + + state->cls->dependencies = parsedclass_new(state->cls->info, state->cls->abc); + list_append(global->classes, state->cls->dependencies); + + /* flash.display.MovieClip handling */ + if(!as3_globalclass && (mod->flags&FLAG_PUBLIC) && slotinfo_equals((slotinfo_t*)registry_getMovieClip(),(slotinfo_t*)extends)) { + if(state->package && state->package[0]) { + as3_globalclass = concat3(state->package, ".", classname); + } else { + as3_globalclass = strdup(classname); + } + } + } +} + +void endclass() +{ + if(as3_pass == 2) { + if(!state->cls->has_constructor && !(state->cls->info->flags&FLAG_INTERFACE)) { + code_t*c = 0; + c = abc_getlocal_0(c); + c = abc_constructsuper(c, 0); + state->cls->init->header = code_append(state->cls->init->header, c); + state->cls->has_constructor=1; + } + if(state->cls->init) { + if(state->cls->info->flags&FLAG_INTERFACE) { + if(state->cls->init->header) + syntaxerror("interface can not have class-level code"); + } else { + abc_method_t*m = abc_class_getconstructor(state->cls->abc, 0); + code_t*c = method_header(state->cls->init); + m->body->code = wrap_function(c, 0, m->body->code); + } + } + if(state->cls->static_init) { + abc_method_t*m = abc_class_getstaticconstructor(state->cls->abc, 0); + code_t*c = method_header(state->cls->static_init); + m->body->code = wrap_function(c, 0, m->body->code); + } + + trait_list_t*trait = state->cls->abc->traits; + /* switch all protected members to the protected ns of this class */ + while(trait) { + trait_t*t = trait->trait; + if(t->name->ns->access == ACCESS_PROTECTED) { + if(!state->cls->abc->protectedNS) { + char*n = concat3(state->cls->info->package, ":", state->cls->info->name); + state->cls->abc->protectedNS = namespace_new_protected(n); + state->cls->abc->flags |= CLASS_PROTECTED_NS; + } + t->name->ns->name = strdup(state->cls->abc->protectedNS->name); + } + trait = trait->next; + } + } + + old_state(); +} + +void check_code_for_break(code_t*c) +{ + while(c) { + if(c->opcode == OPCODE___BREAK__) { + char*name = string_cstr(c->data[0]); + syntaxerror("Unresolved \"break %s\"", name); + } + if(c->opcode == OPCODE___CONTINUE__) { + char*name = string_cstr(c->data[0]); + syntaxerror("Unresolved \"continue %s\"", name); + } + if(c->opcode == OPCODE___RETHROW__) { + syntaxerror("Unresolved \"rethrow\""); + } + if(c->opcode == OPCODE___FALLTHROUGH__) { + syntaxerror("Unresolved \"fallthrough\""); + } + if(c->opcode == OPCODE___PUSHPACKAGE__) { + char*name = string_cstr(c->data[0]); + syntaxerror("Can't reference a package (%s) as such", name); + } + c=c->prev; + } +} + +void check_constant_against_type(classinfo_t*t, constant_t*c) +{ +#define xassert(b) if(!(b)) syntaxerror("Invalid default value %s for type '%s'", constant_tostring(c), t->name) + if(TYPE_IS_NUMBER(t)) { + xassert(c->type == CONSTANT_FLOAT + || c->type == CONSTANT_INT + || c->type == CONSTANT_UINT); + } else if(TYPE_IS_UINT(t)) { + xassert(c->type == CONSTANT_UINT || + (c->type == CONSTANT_INT && c->i>=0)); + } else if(TYPE_IS_INT(t)) { + xassert(c->type == CONSTANT_INT); + } else if(TYPE_IS_BOOLEAN(t)) { + xassert(c->type == CONSTANT_TRUE + || c->type == CONSTANT_FALSE); + } +} + +void check_override(memberinfo_t*m, int flags) +{ + if(!m) + return; + if(m->parent == state->cls->info && !((flags^m->flags)&FLAG_STATIC)) + syntaxerror("class '%s' already contains a method/slot '%s'", m->parent->name, m->name); + if(!m->parent) + syntaxerror("internal error: overriding method %s, which doesn't have parent", m->name); + if(m->access==ACCESS_PRIVATE) + return; + if(m->flags & FLAG_FINAL) + syntaxerror("can't override final member %s", m->name); + + /* allow this. it's no issue. + if((m->flags & FLAG_STATIC) && !(flags&FLAG_STATIC)) + syntaxerror("can't override static member %s", m->name);*/ + + if(!(m->flags & FLAG_STATIC) && (flags&FLAG_STATIC)) + syntaxerror("can't override non-static member %s with static declaration", m->name); + + if(!(flags&FLAG_OVERRIDE) && !(flags&FLAG_STATIC) && !(m->flags&FLAG_STATIC)) { + if(m->parent && !(m->parent->flags&FLAG_INTERFACE)) { + if(m->kind == INFOTYPE_METHOD) + syntaxerror("can't override without explicit 'override' declaration"); + else + syntaxerror("can't override '%s'", m->name); + } + } +} + +methodinfo_t*registerfunction(enum yytokentype getset, modifiers_t*mod, char*name, params_t*params, classinfo_t*return_type, int slot) +{ + methodinfo_t*minfo = 0; + namespace_t ns = modifiers2access(mod); + if(!state->cls) { + //package method + minfo = methodinfo_register_global(ns.access, state->package, name); + minfo->return_type = return_type; + } else if(getset != KW_GET && getset != KW_SET) { + //class method + memberinfo_t* m = registry_findmember(state->cls->info, ns.name, name, 0, mod->flags&FLAG_STATIC); + if(m) { + syntaxerror("class already contains a %s '%s'", infotypename((slotinfo_t*)m), m->name); + } + minfo = methodinfo_register_onclass(state->cls->info, ns.access, ns.name, name, mod->flags&FLAG_STATIC); + minfo->return_type = return_type; + // getslot on a member slot only returns "undefined", so no need + // to actually store these + //state->minfo->slot = state->method->abc->method->trait->slot_id; + } else { + //class getter/setter + int gs = getset==KW_GET?SUBTYPE_GET:SUBTYPE_SET; + classinfo_t*type=0; + if(getset == KW_GET) { + type = return_type; + } else if(params->list && params->list->param && !params->list->next) { + type = params->list->param->type; + } else + syntaxerror("setter function needs to take exactly one argument"); + // not sure wether to look into superclasses here, too + minfo = (methodinfo_t*)registry_findmember(state->cls->info, ns.name, name, 1, mod->flags&FLAG_STATIC); + if(minfo) { + if(minfo->kind!=INFOTYPE_VAR) + syntaxerror("class already contains a method called '%s'", name); + if(!(minfo->subtype & (SUBTYPE_GETSET))) + syntaxerror("class already contains a field called '%s'", name); + if(minfo->subtype & gs) + syntaxerror("getter/setter for '%s' already defined", name); + /* make a setter or getter into a getset */ + minfo->subtype |= gs; + + /* + FIXME: this check needs to be done in pass 2 + + if((!minfo->return_type != !type) || + (minfo->return_type && type && + !strcmp(minfo->return_type->name, type->name))) { + syntaxerror("different type in getter and setter: %s and %s", + minfo->return_type?minfo->return_type->name:"*", + type?type->name:"*"); + }*/ + } else { + minfo = methodinfo_register_onclass(state->cls->info, ns.access, ns.name, name, mod->flags&FLAG_STATIC); + minfo->kind = INFOTYPE_VAR; //hack + minfo->subtype = gs; + minfo->return_type = type; + } + + /* can't assign a slot as getter and setter might have different slots */ + //minfo->slot = slot; + } + if(mod->flags&FLAG_FINAL) minfo->flags |= FLAG_FINAL; + if(mod->flags&FLAG_STATIC) minfo->flags |= FLAG_STATIC; + if(mod->flags&FLAG_OVERRIDE) minfo->flags |= FLAG_OVERRIDE; + + return minfo; +} + +void innerfunction(char*name, params_t*params, classinfo_t*return_type) +{ + //as3_assert(state->method && state->method->info); + + methodstate_t*parent_method = state->method; + variable_t*v = 0; + + if(as3_pass==1) { + return_type = 0; // not valid in pass 1 + if(name) { + v = new_variable2(parent_method, name, 0, 0, 0); + } + } + + new_state(); + state->new_vars = 1; + + if(as3_pass == 1) { + state->method = methodstate_new(); + state->method->inner = 1; + state->method->is_static = parent_method->is_static; + state->method->variable_count = 0; + state->method->abc = rfx_calloc(sizeof(abc_method_t)); + if(v) { + v->is_inner_method = state->method; + } + + NEW(methodinfo_t,minfo); + minfo->kind = INFOTYPE_METHOD; + minfo->access = ACCESS_PACKAGEINTERNAL; + minfo->name = name; + state->method->info = minfo; + + if(parent_method) + list_append(parent_method->innerfunctions, state->method); + + dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->method); + + function_initvars(state->method, 1, params, 0, 1); + } + + if(as3_pass == 2) { + state->method = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); + state->method->variable_count = 0; + as3_assert(state->method); + + state->method->info->return_type = return_type; + function_initvars(state->method, 1, params, 0, 1); + } +} + + +void startfunction(modifiers_t*mod, enum yytokentype getset, char*name, + params_t*params, classinfo_t*return_type) +{ + if(state->method && state->method->info) { + syntaxerror("not able to start another method scope"); + } + new_state(); + state->new_vars = 1; + + if(as3_pass == 1) { + state->method = methodstate_new(); + state->method->has_super = 0; + state->method->is_static = mod->flags&FLAG_STATIC; + + if(state->cls) { + state->method->is_constructor = !strcmp(state->cls->info->name,name); + } else { + state->method->is_global = 1; + state->method->late_binding = 1; // for global methods, always push local_0 on the scope stack + } + if(state->method->is_constructor) + name = "__as3_constructor__"; + + state->method->info = registerfunction(getset, mod, name, params, return_type, 0); + + function_initvars(state->method, 1, params, mod->flags, 1); + + dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->method); + } + + if(as3_pass == 2) { + state->method = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); + + if(!state->method->no_variable_scoping) + state->method->variable_count = 0; + + as3_assert(state->method); + + if(state->cls) { + memberinfo_t*m = registry_findmember(state->cls->info, mod->ns, name, 2, mod->flags&FLAG_STATIC); + check_override(m, mod->flags); + } + + if(state->cls) { + state->cls->has_constructor |= state->method->is_constructor; + } + + function_initvars(state->method, 1, params, mod->flags, 1); + } +} + +void insert_unresolved(methodstate_t*m, dict_t*xvars, dict_t*allvars) +{ + as3_assert(m->inner); + if(m->unresolved_variables) { + dict_t*d = m->unresolved_variables; + int t; + DICT_ITERATE_KEY(d, char*, id) { + /* check parent method's variables */ + variable_t*v; + if(dict_contains(allvars, id)) { + m->uses_parent_function = 1; + state->method->uses_slots = 1; + dict_put(xvars, id, 0); + } + } + } + methodstate_list_t*ml = m->innerfunctions; + while(ml) { + insert_unresolved(ml->methodstate, xvars, allvars); + ml = ml->next; + } +} + +abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, + char*name, params_t*params, classinfo_t*return_type, + code_t*body) +{ + if(as3_pass==1) { + dict_t*xvars = dict_new(); + + if(state->method->unresolved_variables) { + DICT_ITERATE_KEY(state->method->unresolved_variables, char*, vname) { + if(!state->method->no_variable_scoping && dict_contains(state->method->allvars, vname)) { + variable_t*v = dict_lookup(state->method->allvars, vname); + if(!v->is_inner_method) { + state->method->no_variable_scoping = 1; + as3_warning("function %s uses forward or outer block variable references (%s): switching into compatibility mode", name, vname); + } + } + } + } + + methodstate_list_t*ml = state->method->innerfunctions; + while(ml) { + insert_unresolved(ml->methodstate, xvars, state->method->allvars); + ml = ml->next; + } + + if(state->method->uses_slots) { + state->method->slots = dict_new(); + int i = 1; + DICT_ITERATE_ITEMS(state->method->allvars, char*, name, variable_t*, v) { + if(!name) syntaxerror("internal error"); + if(v->index && dict_contains(xvars, name)) { + v->init = v->kill = 0; + v->index = i; + if(v->is_inner_method) { + v->is_inner_method->is_a_slot = i; + } + i++; + dict_put(state->method->slots, name, v); + } + } + state->method->uses_slots = i; + dict_destroy(state->vars);state->vars = 0; + as3_assert(state->new_vars); + } + old_state(); + return 0; + } + + if(as3_pass==2) { + /*if(state->method->uses_parent_function){ + syntaxerror("accessing variables of parent function from inner functions not supported yet"); + }*/ + + abc_method_t*f = 0; + + multiname_t*type2 = sig2mname(return_type); + int slot = 0; + if(state->method->inner) { + f = state->method->abc; + abc_method_init(f, global->file, type2, 1); + } else if(state->method->is_constructor) { + f = abc_class_getconstructor(state->cls->abc, type2); + } else if(!state->method->is_global) { + namespace_t ns = modifiers2access(mod); + multiname_t mname = {QNAME, &ns, 0, name}; + if(mod->flags&FLAG_STATIC) + f = abc_class_staticmethod(state->cls->abc, type2, &mname); + else + f = abc_class_method(state->cls->abc, type2, &mname); + slot = f->trait->slot_id; + } else { + namespace_t mname_ns = {state->method->info->access, state->package}; + multiname_t mname = {QNAME, &mname_ns, 0, name}; + + f = abc_method_new(global->file, type2, 1); + if(!global->init) global->init = abc_initscript(global->file); + trait_t*t = trait_new_method(&global->init->traits, multiname_clone(&mname), f); + //abc_code_t*c = global->init->method->body->code; + } + //flash doesn't seem to allow us to access function slots + //state->method->info->slot = slot; + + if(mod && mod->flags&FLAG_OVERRIDE) f->trait->attributes |= TRAIT_ATTR_OVERRIDE; + if(getset == KW_GET) f->trait->kind = TRAIT_GETTER; + if(getset == KW_SET) f->trait->kind = TRAIT_SETTER; + if(params->varargs) f->flags |= METHOD_NEED_REST; + if(state->method->need_arguments) f->flags |= METHOD_NEED_ARGUMENTS; + + char opt=0; + param_list_t*p=0; + for(p=params->list;p;p=p->next) { + if(params->varargs && !p->next) { + break; //varargs: omit last parameter in function signature + } + multiname_t*m = sig2mname(p->param->type); + list_append(f->parameters, m); + if(p->param->value) { + check_constant_against_type(p->param->type, p->param->value); + opt=1;list_append(f->optional_parameters, p->param->value); + } else if(opt) { + syntaxerror("function %s: non-optional parameter not allowed after optional parameters", name); + } + } + if(state->method->slots) { + DICT_ITERATE_ITEMS(state->method->slots, char*, name, variable_t*, v) { + if(v->index) { + multiname_t*mname = multiname_new(namespace_new(ACCESS_PACKAGE, ""), name); + multiname_t*type = sig2mname(v->type); + trait_t*t = trait_new_member(&f->body->traits, type, mname, 0); + t->slot_id = v->index; + } + } + } + + check_code_for_break(body); + + /* Seems this works now. + if(state->method->exceptions && state->method->uses_slots) { + as3_warning("try/catch and activation not supported yet within the same method"); + }*/ + + if(f->body) { + f->body->code = body; + f->body->exceptions = state->method->exceptions; + } else { //interface + if(body) + syntaxerror("interface methods can't have a method body"); + } + + old_state(); + return f; + } + + return 0; +} + +void breakjumpsto(code_t*c, char*name, code_t*jump) +{ + while(c) { + if(c->opcode == OPCODE___BREAK__) { + string_t*name2 = c->data[0]; + if(!name2->len || !strncmp(name2->str, name, name2->len)) { + c->opcode = OPCODE_JUMP; + c->branch = jump; + } + } + c=c->prev; + } +} + +void continuejumpsto(code_t*c, char*name, code_t*jump) +{ + while(c) { + if(c->opcode == OPCODE___CONTINUE__) { + string_t*name2 = c->data[0]; + if(!name2->len || !strncmp(name2->str, name, name2->len)) { + c->opcode = OPCODE_JUMP; + c->branch = jump; + } + } + c = c->prev; + } +} + +code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to) +{ + if(from==to) + return c; + if(!to) { + return abc_coerce_a(c); + } + MULTINAME(m, to); + if(!from) { + // cast an "any" type to a specific type. subject to + // runtime exceptions + return abc_coerce2(c, &m); + } + + if((TYPE_IS_NUMBER(from) || TYPE_IS_UINT(from) || TYPE_IS_INT(from)) && + (TYPE_IS_NUMBER(to) || TYPE_IS_UINT(to) || TYPE_IS_INT(to))) { + // allow conversion between number types + if(TYPE_IS_UINT(to)) + return abc_convert_u(c); + else if(TYPE_IS_INT(to)) + return abc_convert_i(c); + else if(TYPE_IS_NUMBER(to)) + return abc_convert_d(c); + return abc_coerce2(c, &m); + } + /* allow conversion from string to number */ + if(TYPE_IS_STRING(from) && TYPE_IS_NUMBER(to)) { + return abc_convert_d(c); + } + + if(TYPE_IS_XMLLIST(to) && TYPE_IS_XML(from)) + return c; + + if(TYPE_IS_BOOLEAN(to)) + return abc_convert_b(c); + if(TYPE_IS_STRING(to)) + return abc_convert_s(c); + if(TYPE_IS_OBJECT(to)) + return abc_coerce2(c, &m); + if(TYPE_IS_OBJECT(from) && TYPE_IS_XMLLIST(to)) + return abc_coerce2(c, &m); + if(TYPE_IS_OBJECT(from) && TYPE_IS_ARRAY(to)) + return abc_coerce2(c, &m); + + classinfo_t*supertype = from; + while(supertype) { + if(supertype == to) { + /* target type is one of from's superclasses. + (not sure we need this coerce - as far as the verifier + is concerned, object==object (i think) */ + return abc_coerce2(c, &m); + } + int t=0; + while(supertype->interfaces[t]) { + if(supertype->interfaces[t]==to) { + // target type is one of from's interfaces + return abc_coerce2(c, &m); + } + t++; + } + supertype = supertype->superclass; + } + if(TYPE_IS_FUNCTION(from) && TYPE_IS_FUNCTION(to)) + return c; + if(TYPE_IS_CLASS(from) && TYPE_IS_CLASS(to)) + return c; + if(TYPE_IS_NULL(from) && !IS_NUMBER_OR_INT(to)) + return c; + + + as3_error("can't convert type %s%s%s to %s%s%s", + from->package, from->package[0]?".":"", from->name, + to->package, to->package[0]?".":"", to->name); + + return c; +} + +code_t* coerce_to_type(code_t*c, classinfo_t*t) +{ + if(!t) { + return abc_coerce_a(c); + } else if(TYPE_IS_STRING(t)) { + return abc_coerce_s(c); + } else { + MULTINAME(m, t); + return abc_coerce2(c, &m); + } +} + +char is_pushundefined(code_t*c) +{ + return (c && !c->prev && !c->next && c->opcode == OPCODE_PUSHUNDEFINED); +} + +const char* get_package_from_name(const char*name) +{ + /* try explicit imports */ + dictentry_t* e = dict_get_slot(state->imports, name); + while(e) { + if(!strcmp(e->key, name)) { + slotinfo_t*c = (slotinfo_t*)e->data; + if(c) return c->package; + } + e = e->next; + } + return 0; +} + +namespace_list_t*get_current_imports() +{ + namespace_list_t*searchlist = 0; + + list_append(searchlist, namespace_new_package(state->package)); + + import_list_t*l = state->wildcard_imports; + while(l) { + namespace_t*ns = namespace_new_package(l->import->package); + list_append(searchlist, ns); + l = l->next; + } + list_append(searchlist, namespace_new_package("")); + list_append(searchlist, namespace_new_package(internal_filename_package)); + return searchlist; +} + +slotinfo_t* find_class(const char*name) +{ + slotinfo_t*c=0; + + c = registry_find(state->package, name); + if(c) return c; + + /* try explicit imports */ + dictentry_t* e = dict_get_slot(state->imports, name); + if(c) return c; + while(e) { + if(!strcmp(e->key, name)) { + c = (slotinfo_t*)e->data; + if(c) return c; + } + e = e->next; + } + + /* try package.* imports */ + import_list_t*l = state->wildcard_imports; + while(l) { + //printf("does package %s contain a class %s?\n", l->import->package, name); + c = registry_find(l->import->package, name); + if(c) return c; + l = l->next; + } + + /* try global package */ + c = registry_find("", name); + if(c) return c; + + /* try local "filename" package */ + c = registry_find(internal_filename_package, name); + if(c) return c; + + return 0; +} + +typedcode_t push_class(slotinfo_t*a) +{ + typedcode_t x; + x.c = 0; + x.t = 0; + if(a->access == ACCESS_PACKAGEINTERNAL && + strcmp(a->package, state->package) && + strcmp(a->package, internal_filename_package) + ) { + syntaxerror("Can't access internal %s %s in package '%s' from package '%s'", + infotypename(a), a->name, a->package, state->package); + } + + + if(a->kind != INFOTYPE_CLASS) { + MULTINAME(m, a); + x.c = abc_findpropstrict2(x.c, &m); + x.c = abc_getproperty2(x.c, &m); + if(a->kind == INFOTYPE_METHOD) { + methodinfo_t*f = (methodinfo_t*)a; + x.t = TYPE_FUNCTION(f); + } else { + varinfo_t*v = (varinfo_t*)a; + x.t = v->type; + } + return x; + } else { + if(state->cls && state->method == state->cls->static_init) { + /* we're in the static initializer. + record the fact that we're using this class here */ + parsedclass_add_dependency(state->cls->dependencies, (classinfo_t*)a); + } + classinfo_t*c = (classinfo_t*)a; + //if(c->slot) { + if(0) { //Error #1026: Slot 1 exceeds slotCount=0 of global + x.c = abc_getglobalscope(x.c); + x.c = abc_getslot(x.c, c->slot); + } else { + MULTINAME(m, c); + x.c = abc_getlex2(x.c, &m); + } + x.t = TYPE_CLASS(c); + } + return x; +} + +char is_break_or_jump(code_t*c) +{ + if(!c) + return 0; + if(c->opcode == OPCODE_JUMP || + c->opcode == OPCODE___BREAK__ || + c->opcode == OPCODE___CONTINUE__ || + c->opcode == OPCODE_THROW || + c->opcode == OPCODE_RETURNVOID || + c->opcode == OPCODE_RETURNVALUE) { + return 1; + } + return 0; +} + +#define IS_FINALLY_TARGET(op) \ + ((op) == OPCODE___CONTINUE__ || \ + (op) == OPCODE___BREAK__ || \ + (op) == OPCODE_RETURNVOID || \ + (op) == OPCODE_RETURNVALUE || \ + (op) == OPCODE___RETHROW__) + +static code_t* insert_finally_lookup(code_t*c, code_t*finally, int tempvar) +{ +#define NEED_EXTRA_STACK_ARG + code_t*finally_label = abc_nop(0); + NEW(lookupswitch_t, l); + //_lookupswitch + + code_t*i = c; + int count=0; + while(i) { + code_t*prev = i->prev; + if(IS_FINALLY_TARGET(i->opcode)) { + code_t*p = prev; + char needvalue=0; + if(i->opcode == OPCODE___RETHROW__ || + i->opcode == OPCODE_RETURNVALUE) { + if(i->opcode == OPCODE___RETHROW__) + i->opcode = OPCODE_THROW; + needvalue=1; + p = abc_coerce_a(p); + p = abc_setlocal(p, tempvar); + } + p = abc_pushbyte(p, count++); + p = abc_jump(p, finally_label); + code_t*target = p = abc_label(p); +#ifdef NEED_EXTRA_STACK_ARG + p = abc_pop(p); +#endif + if(needvalue) { + p = abc_getlocal(p, tempvar); + } + + p->next = i;i->prev = p; + list_append(l->targets, target); + } + i = prev; + } + + code_t*j,*f; + c = abc_pushbyte(c, -1); + c = code_append(c, finally_label); + c = code_append(c, finally); + +#ifdef NEED_EXTRA_STACK_ARG + c = abc_dup(c); +#endif + c = abc_lookupswitch(c, l); + c = l->def = abc_label(c); +#ifdef NEED_EXTRA_STACK_ARG + c = abc_pop(c); +#endif + + return c; +} + +static code_t* insert_finally_simple(code_t*c, code_t*finally, int tempvar) +{ + code_t*i = c; + while(i) { + code_t*prev = i->prev; + if(IS_FINALLY_TARGET(i->opcode)) { + if(i->opcode == OPCODE___RETHROW__) + i->opcode = OPCODE_THROW; + code_t*end = code_dup(finally); + code_t*start = code_start(end); + if(prev) prev->next = start; + start->prev = prev; + i->prev = end; + end->next = i; + } + i = prev; + } + return code_append(c, finally); +} + +code_t* insert_finally(code_t*c, code_t*finally, int tempvar) +{ + if(!finally) + return c; + code_t*i = c; + char cantdup=0; + int num_insertion_points=0; + while(i) { + if(IS_FINALLY_TARGET(i->opcode)) + num_insertion_points++; + i = i->prev; + } + i = finally; + int code_size=0; + while(i) { + code_size++; + if(i->branch || i->opcode == OPCODE_LOOKUPSWITCH) { + cantdup=1; + } + i = i->prev; + } + int simple_version_cost = (1+num_insertion_points)*code_size; + int lookup_version_cost = 4*num_insertion_points + 5; + + if(cantdup || simple_version_cost > lookup_version_cost) { + //printf("(use lookup) simple=%d > lookup=%d\n", simple_version_cost, lookup_version_cost); + return insert_finally_lookup(c, finally, tempvar); + } else { + //printf("(use simple) simple=%d < lookup=%d\n", simple_version_cost, lookup_version_cost); + return insert_finally_simple(c, finally, tempvar); + } +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h new file mode 100644 index 000000000..5ee8751b3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h @@ -0,0 +1,132 @@ +#ifndef __parse_help__ +#define __parse_help__ + +#include "state.h" +#include "expr.h" +#include "tokenizer.h" +#include "common.h" + +typedef struct _global { + abc_file_t*file; + + parsedclass_list_t*classes; + abc_script_t*classinit; + + abc_script_t*init; //package-level code + + dict_t*token2info; + dict_t*file2token2info; +} global_t; + +extern global_t*global; + +typedef struct _variable { + int index; + classinfo_t*type; + char init; + char kill; + char is_parameter; + methodstate_t*is_inner_method; +} variable_t; + +void initialize_file(char*filename); +void finish_file(); + +void initialize_parser(); +void* finish_parser(); + +#define FLAG_PUBLIC 256 +#define FLAG_PROTECTED 512 +#define FLAG_PRIVATE 1024 +#define FLAG_PACKAGEINTERNAL 2048 +#define FLAG_NAMESPACE 4096 + +slotinfo_t* find_class(const char*name); +char is_break_or_jump(code_t*c); +code_t* insert_finally(code_t*c, code_t*finally, int tempvar); +typedcode_t push_class(slotinfo_t*a); +slotinfo_t* find_class(const char*name); +namespace_list_t*get_current_imports(); +const char* get_package_from_name(const char*name); +char is_pushundefined(code_t*c); +code_t* coerce_to_type(code_t*c, classinfo_t*t); +code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to); +void continuejumpsto(code_t*c, char*name, code_t*jump); +void breakjumpsto(code_t*c, char*name, code_t*jump); +void insert_unresolved(methodstate_t*m, dict_t*xvars, dict_t*allvars); +void startfunction(modifiers_t*mod, enum yytokentype getset, char*name, params_t*params, classinfo_t*return_type); +void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0); +abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, char*name, params_t*params, classinfo_t*return_type, code_t*body); +void innerfunction(char*name, params_t*params, classinfo_t*return_type); +methodinfo_t*registerfunction(enum yytokentype getset, modifiers_t*mod, char*name, params_t*params, classinfo_t*return_type, int slot); +void check_override(memberinfo_t*m, int flags); +void check_constant_against_type(classinfo_t*t, constant_t*c); +void check_code_for_break(code_t*c); +void startclass(modifiers_t* mod, char*classname, classinfo_t*extends, classinfo_list_t*implements); +void endclass(); +void innerfunctions2vars(methodstate_t*m); +memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse, char is_static); +namespace_t modifiers2access(modifiers_t*mod); +const char* lookup_namespace(const char*name); +void startpackage(char*name); +void endpackage(); +code_t* wrap_function(code_t*c,code_t*header, code_t*body); +code_t* method_header(methodstate_t*m); +code_t* add_scope_code(code_t*c, methodstate_t*m, char init); +void unknown_variable(char*name); +code_t* var_block(code_t*body, dict_t*vars); +int gettempvar(); +int new_variable(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot); +variable_t* new_variable2(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot); +int alloc_local(); +code_t*defaultvalue(code_t*c, classinfo_t*type); +char variable_exists(char*name); +variable_t* find_variable_safe(state_t*s, char*name); +variable_t* find_variable(state_t*s, const char*name); +variable_t* find_slot(methodstate_t*m, const char*name); +code_t* method_header(methodstate_t*m); +code_t* wrap_function(code_t*c,code_t*header, code_t*body); +void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0); +void state_destroy(state_t*state); +void as3_set_define(const char*c); + +/* protected handling here is a big hack: we just assume the protectedns + is package:class. the correct approach would be to add the proper + namespace to all protected members in the registry, even though that + would slow down searching */ +#define MEMBER_MULTINAME(m,f,n) \ + multiname_t m;\ + namespace_t m##_ns;\ + if(f) { \ + m##_ns.access = ((slotinfo_t*)(f))->access; \ + if(m##_ns.access == ACCESS_NAMESPACE) \ + m##_ns.name = ((slotinfo_t*)(f))->package; \ + else if(m##_ns.access == ACCESS_PROTECTED && (f)->parent) \ + m##_ns.name = concat3((f)->parent->package,":",(f)->parent->name); \ + else \ + m##_ns.name = ""; \ + m.type = QNAME; \ + m.ns = &m##_ns; \ + m.namespace_set = 0; \ + m.name = ((slotinfo_t*)(f))->name; \ + } else { \ + m.type = MULTINAME; \ + m.ns =0; \ + m.namespace_set = &nopackage_namespace_set; \ + m.name = n; \ + } + +/* warning: list length of namespace set is undefined */ +#define MULTINAME_LATE(m, access, package) \ + namespace_t m##_ns = {access, package}; \ + namespace_set_t m##_nsset; \ + namespace_list_t m##_l;m##_l.next = 0; \ + m##_nsset.namespaces = &m##_l; \ + m##_nsset = m##_nsset; \ + m##_l.namespace = &m##_ns; \ + multiname_t m = {MULTINAMEL, 0, &m##_nsset, 0}; + +extern namespace_t stdns; +extern namespace_set_t nopackage_namespace_set; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c new file mode 100644 index 000000000..691086263 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c @@ -0,0 +1,1403 @@ +/* pool.c + + Routines for handling Flash2 AVM2 ABC contantpool entries. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include "pool.h" + + +// ----------------------------- float ---------------------------------- + +void* float_clone(const void*_v) { + if(_v==0) + return 0; + const double*v1=_v; + double*v2 = malloc(sizeof(double)); + *v2 = *v1; + return v2; +} +unsigned int float_hash(const void*_v) { + if(!_v) + return 0; + const unsigned char*b=_v; + unsigned int h=0; + int t; + for(t=0;t<8;t++) + h = crc32_add_byte(h, b[t]); + return h; +} +void float_destroy(void*_v) { + double*v = (double*)_v; + if(v) + free(v); +} +char float_equals(const void*_v1, const void*_v2) { + const double*v1=_v1; + const double*v2=_v2; + if(!v1 || !v2) + return v1==v2; + + if(*v1==*v2) return 1; + if(*v1!=*v1 && *v2!=*v2) return 1; //both values are NaN + return 0; +} + +type_t float_type = { + dup: float_clone, + hash: float_hash, + free: float_destroy, + equals: float_equals +}; + +// ----------------------------- uint ---------------------------------- + +unsigned int undefined_uint = 0; + +void*uint_clone(const void*_v) { + if(!_v) + return 0; + const unsigned int*v1=_v; + unsigned int*v2 = malloc(sizeof(unsigned int)); + *v2 = *v1; + return v2; +} +unsigned int uint_hash(const void*_v) { + if(!_v) + return 0; + const unsigned int*v=_v; + return *v; +} +void uint_destroy(void*_v) { + unsigned int*v = (unsigned int*)_v; + if(v) + free(v); +} +char uint_equals(const void*_v1, const void*_v2) { + const unsigned int*v1=_v1; + const unsigned int*v2=_v2; + if(!v1 || !v2) + return v1==v2; + return *v1==*v2; +} + +type_t uint_type = { + dup: (dup_func)uint_clone, + hash: (hash_func)uint_hash, + free: (free_func)uint_destroy, + equals: (equals_func)uint_equals +}; + +// ----------------------------- namespace ---------------------------------- + +unsigned int namespace_hash(namespace_t*n) +{ + if(!n) + return 0; + unsigned int hash = 0; + hash = crc32_add_byte(hash, n->access); + hash = crc32_add_string(hash, n->name); + return hash; +} + +unsigned char namespace_equals(const namespace_t*n1, const namespace_t*n2) +{ + if(!n1 || !n2) + return n1==n2; + if(n1->access != n2->access) + return 0; + if(!(n1->name) != !(n2->name)) + return 0; + if(n1->name && n2->name && strcmp(n1->name, n2->name)) + return 0; + return 1; +} + +char*escape_string(const char*str) +{ + if(!str) + return strdup("NULL"); + int len=0; + unsigned const char*s=(unsigned const char*)str; + while(*s) { + if(*s<10) { + len+=2; // \d + } else if(*s<32) { + len+=3; // \dd + } else if(*s<127) { + len++; + } else { + len+=4; // \xhh + } + s++; + } + char*newstr = malloc(len+1); + char*dest = newstr; + s=(unsigned const char*)str; + while(*s) { + if(*s<9) { + dest+=sprintf(dest, "\\%d", *s); + } else if(*s<32) { + if(*s==13) + dest+=sprintf(dest, "\\r"); + else if(*s==10) + dest+=sprintf(dest, "\\n"); + else if(*s==9) + dest+=sprintf(dest, "\\t"); + else + dest+=sprintf(dest, "\\%2o", *s); + } else if(*s<127) { + *dest++=*s; + } else { + dest+=sprintf(dest, "\\x%02x", *s); + } + s++; + } + *dest = 0; + return newstr; +} + +char* namespace_tostring(namespace_t*ns) +{ + if(!ns) + return strdup("NULL"); + char*access = 0; + U8 type = ns->access; + access = access2str(type); + char*s = escape_string(ns->name); + char*string = (char*)malloc(strlen(access)+strlen(s)+7); + if(!s) + sprintf(string, "[%s]NULL", access); + else if(!*s) + sprintf(string, "[%s]\"\"", access); + else + sprintf(string, "[%s]%s", access, s); + free(s); + return string; +} + +namespace_t* namespace_clone(namespace_t*other) +{ + if(!other) + return 0; + NEW(namespace_t,n); + n->access = other->access; + n->name = other->name?strdup(other->name):0; + return n; +} + +namespace_t* namespace_fromstring(const char*name) +{ + namespace_t*ns = malloc(sizeof(namespace_t)); + memset(ns, 0, sizeof(namespace_t)); + if(name[0] == '[') { + U8 access = 0; + char*n = strdup(name); + char*bracket = strchr(n, ']'); + if(bracket) { + *bracket = 0; + char*a = n+1; + name += (bracket-n)+1; + if(!strcmp(a, "")) access=0x16; + else if(!strcmp(a, "undefined")) access=0x08; // public?? + else if(!strcmp(a, "package")) access=0x16; + else if(!strcmp(a, "public")) access=0x16; + else if(!strcmp(a, "packageinternal")) access=0x17; + else if(!strcmp(a, "protected")) access=0x18; + else if(!strcmp(a, "explicit")) access=0x19; + else if(!strcmp(a, "staticprotected")) access=0x1a; + else if(!strcmp(a, "private")) access=0x05; + else { + fprintf(stderr, "Undefined access level: [%s]\n", a); + free(n); + return 0; + } + } + ns->access = access; + ns->name = strdup(name); + free(n); + return ns; + } else { + ns->access = 0x16; + ns->name = strdup(name); + return ns; + } +} + +namespace_t* namespace_new(U8 access, const char*name) +{ + namespace_t*ns = malloc(sizeof(namespace_t)); + ns->access = access; + /* not sure what namespaces with empty strings are good for, but they *do* exist */ + ns->name = name?strdup(name):0; + return ns; +} +namespace_t* namespace_new_namespace(const char*name) { + return namespace_new(0x08, name); // public? +} +namespace_t* namespace_new_package(const char*name) { + return namespace_new(0x16 , name); +} +namespace_t* namespace_new_packageinternal(const char*name) { + return namespace_new(0x17, name); +} +namespace_t* namespace_new_protected(const char*name) { + return namespace_new(0x18, name); +} +namespace_t* namespace_new_explicit(const char*name) { + return namespace_new(0x19, name); +} +namespace_t* namespace_new_staticprotected(const char*name) { + return namespace_new(0x1a, name); +} +namespace_t* namespace_new_private(const char*name) { + return namespace_new(0x05, name); +} + +void namespace_destroy(namespace_t*n) +{ + if(n) { + free((char*)n->name);n->name=0; + n->access=0x00; + free(n); + } +} + +type_t namespace_type = { + dup: (dup_func)namespace_clone, + hash: (hash_func)namespace_hash, + free: (free_func)namespace_destroy, + equals: (equals_func)namespace_equals +}; + +// ---------------------------namespace sets -------------------------------- + +unsigned int namespace_set_hash(namespace_set_t*set) +{ + if(!set) + return 0; + namespace_list_t*l = set->namespaces; + unsigned int hash = 0; + while(l) { + hash = crc32_add_byte(hash, l->namespace->access); + hash = crc32_add_string(hash, l->namespace->name); + l = l->next; + } + return hash; +} + +int namespace_set_equals(namespace_set_t*m1, namespace_set_t*m2) +{ + if(!m1 || !m2) + return m1==m2; + namespace_list_t*l1 = m1->namespaces; + namespace_list_t*l2 = m2->namespaces; + while(l1 && l2) { + if(l1->namespace->access != l2->namespace->access) + return 0; + if(!(l1->namespace->name) != !(l2->namespace->name)) + return 0; + if(l1->namespace->name && l2->namespace->name && strcmp(l1->namespace->name, l2->namespace->name)) + return 0; + l1 = l1->next; + l2 = l2->next; + } + if(l1||l2) + return 0; + return 1; +} + +namespace_set_t* namespace_set_clone(namespace_set_t*other) +{ + if(!other) + return 0; + NEW(namespace_set_t,set); + set->namespaces = list_new(); + namespace_list_t*l = other->namespaces; + while(l) { + list_append(set->namespaces, namespace_clone(l->namespace)); + l = l->next; + } + return set; +} +namespace_set_t* namespace_set_new() +{ + NEW(namespace_set_t,set); + set->namespaces = list_new(); + return set; +} +char* namespace_set_tostring(namespace_set_t*set) +{ + if(!set) + return strdup("NULL"); + /* TODO: is the order of the namespaces important (does it + change the lookup order?). E.g. flex freely shuffles namespaces + around. + If the order is not important, we can optimize constant pools by sorting + the namespaces. + */ + int l = 0; + namespace_list_t*lns = set->namespaces; + while(lns) { + char*s = namespace_tostring(lns->namespace); + l += strlen(s)+1; + free(s); + lns = lns->next; + } + char*desc = malloc(l+16); + strcpy(desc, "{"); + lns = set->namespaces; + while(lns) { + char*s = namespace_tostring(lns->namespace); + strcat(desc, s); + free(s); + lns = lns->next; + if(lns) + strcat(desc, ","); + } + strcat(desc, "}"); + return desc; +} + +void namespace_set_destroy(namespace_set_t*set) +{ + if(set) { + namespace_list_t*l = set->namespaces; + while(l) { + namespace_destroy(l->namespace);l->namespace=0; + l = l->next; + } + list_free(set->namespaces); + free(set); + } +} + +type_t namespace_set_type = { + dup: (dup_func)namespace_set_clone, + hash: (hash_func)namespace_set_hash, + free: (free_func)namespace_set_destroy, + equals: (equals_func)namespace_set_equals +}; + +// ----------------------------- multiname ---------------------------------- + +unsigned int multiname_hash(multiname_t*m) +{ + if(!m) + return 0; + unsigned int hash = crc32_add_byte(0, m->type); + if(m->name) { + hash = crc32_add_string(hash, m->name); + } + if(m->ns) { + hash = crc32_add_byte(hash, m->ns->access); + hash = crc32_add_string(hash, m->ns->name); + } + if(m->namespace_set) { + namespace_list_t*l = m->namespace_set->namespaces; + while(l) { + hash = crc32_add_byte(hash, l->namespace->access); + hash = crc32_add_string(hash, l->namespace->name); + l = l->next; + } + } + return hash; +} + +int multiname_equals(multiname_t*m1, multiname_t*m2) +{ + if(!m1 || !m2) + return m1==m2; + if(m1->type!=m2->type) + return 0; + + if((!m1->name) != (!m2->name)) + return 0; + if((!m1->ns) != (!m2->ns)) + return 0; + if((!m1->namespace_set) != (!m2->namespace_set)) + return 0; + + if(m1->name && m2->name && strcmp(m1->name,m2->name)) + return 0; + if(m1->ns && m2->ns) { + if(!namespace_equals(m1->ns, m2->ns)) + return 0; + } + if(m1->namespace_set && m2->namespace_set) { + if(!namespace_set_equals(m1->namespace_set, m2->namespace_set)) + return 0; + } + return 1; +} + +multiname_t* multiname_new(namespace_t*ns, const char*name) +{ + NEW(multiname_t,m); + m->type = QNAME; + if(!ns) { + m->ns = namespace_new_packageinternal(""); + } else { + m->ns = namespace_clone(ns); + } + m->name = strdup(name); + return m; +} + +multiname_t* multiname_clone(multiname_t*other) +{ + if(!other) + return 0; + NEW(multiname_t,m); + m->type = other->type; + if(other->ns) + m->ns = namespace_clone(other->ns); + if(other->namespace_set) + m->namespace_set = namespace_set_clone(other->namespace_set); + if(other->name) + m->name = strdup(other->name); + return m; +} + + +char* access2str(int type) +{ + if(type==0x08) return "namespace"; + else if(type==0x16) return "public"; + else if(type==0x17) return "packageinternal"; + else if(type==0x18) return "protected"; + else if(type==0x19) return "explicit"; + else if(type==0x1A) return "staticprotected"; + else if(type==0x05) return "private"; + else if(type==0x00) return "any"; + else { + fprintf(stderr, "Undefined access type %02x\n", type); + return "undefined"; + } +} + + +char multiname_late_namespace(multiname_t*m) +{ + if(!m) + return 0; + return (m->type==RTQNAME || m->type==RTQNAMEA || + m->type==RTQNAMEL || m->type==RTQNAMELA); +} + +char multiname_late_name(multiname_t*m) +{ + if(!m) + return 0; + return m->type==RTQNAMEL || m->type==RTQNAMELA || + m->type==MULTINAMEL || m->type==MULTINAMELA; +} + +char* multiname_tostring(multiname_t*m) +{ + char*mname = 0; + if(!m) + return strdup("NULL"); + if(m->type==0xff) + return strdup("----"); + + char*name = m->name?escape_string(m->name):strdup("*"); + int namelen = strlen(name); + + if(m->type==QNAME || m->type==QNAMEA || m->type==POSTFIXTYPE) { + char*nsname = m->ns?escape_string(m->ns->name):strdup("NULL"); + mname = malloc(strlen(nsname)+namelen+32); + strcpy(mname, "type == QNAMEA) + strcat(mname, ",attr"); + strcat(mname, ">"); + if(m->ns) { + strcat(mname,"["); + strcat(mname,access2str(m->ns->access)); + strcat(mname, "]"); + } + strcat(mname, nsname); + free(nsname); + strcat(mname, "::"); + strcat(mname, name); + } else if(m->type==RTQNAME || m->type==RTQNAMEA) { + mname = malloc(namelen+32); + strcpy(mname, "type == RTQNAMEA) + strcat(mname, ",attr"); + strcat(mname, ">"); + strcat(mname, name); + } else if(m->type==RTQNAMEL) { + mname = strdup(""); + } else if(m->type==RTQNAMELA) { + mname = strdup(""); + } else if(m->type==MULTINAME || m->type==MULTINAMEA) { + char*s = namespace_set_tostring(m->namespace_set); + mname = malloc(strlen(s)+namelen+16); + if(m->type == MULTINAME) + strcpy(mname,""); + else //MULTINAMEA + strcpy(mname,""); + strcat(mname, s); + strcat(mname, "::"); + strcat(mname, name); + free(s); + } else if(m->type==MULTINAMEL || m->type==MULTINAMELA) { + char*s = namespace_set_tostring(m->namespace_set); + mname = malloc(strlen(s)+16); + if(m->type == MULTINAMEL) + strcpy(mname,""); + else //MULTINAMELA + strcpy(mname,""); + strcat(mname,s); + free(s); + } else { + return strdup(""); + } + free(name); + return mname; +} + +multiname_t* multiname_fromstring(const char*name2) +{ + if(!name2) + return 0; + char*n = strdup(name2); + char*p = strstr(n, "::"); + char*namespace=0,*name=0; + if(!p) { + if(strchr(n, ':')) { + fprintf(stderr, "Error: single ':' in name\n"); + } + namespace = ""; + name = n; + } else { + *p = 0; + namespace = n; + name = p+2; + if(strchr(namespace, ':')) { + fprintf(stderr, "Error: single ':' in namespace\n"); + } + if(strchr(name, ':')) { + fprintf(stderr, "Error: single ':' in qualified name\n"); + } + } + + multiname_t*m = malloc(sizeof(multiname_t)); + memset(m, 0, sizeof(multiname_t)); + m->type = QNAME; + m->namespace_set = 0; + m->ns = namespace_fromstring(namespace); + m->name = name?strdup(name):0; + free(n); + return m; +} + +void multiname_destroy(multiname_t*m) +{ + if(m) { + if(m->name) { + free((void*)m->name);m->name = 0; + } + if(m->ns) { + namespace_destroy(m->ns);m->ns = 0; + } + if(m->namespace_set) { + namespace_set_destroy(m->namespace_set);m->namespace_set = 0; + } + m->type=0; + free(m); + } +} + +type_t multiname_type = { + dup: (dup_func)multiname_clone, + hash: (hash_func)multiname_hash, + free: (free_func)multiname_destroy, + equals: (equals_func)multiname_equals +}; + + +// ------------------------------- constants ------------------------------------- + +#define UNIQUE_CONSTANT(x) ((x) == CONSTANT_TRUE || (x) == CONSTANT_FALSE || (x) == CONSTANT_NULL || (x) == CONSTANT_UNDEFINED) + +constant_t* constant_new_int(int i) +{ + NEW(constant_t,c); + c->i = i; + c->type = CONSTANT_INT; + return c; +} +constant_t* constant_new_uint(unsigned int u) +{ + NEW(constant_t,c); + c->u = u; + c->type = CONSTANT_UINT; + return c; +} +constant_t* constant_new_float(double f) +{ + NEW(constant_t,c); + c->f = f; + c->type = CONSTANT_FLOAT; + return c; +} +constant_t* constant_new_string(const char*s) +{ + NEW(constant_t,c); + c->s = string_new4(s); + c->type = CONSTANT_STRING; + return c; +} +constant_t* constant_new_string2(const char*s, int len) +{ + NEW(constant_t,c); + c->s = string_new3(s, len); + c->type = CONSTANT_STRING; + return c; +} +constant_t* constant_new_namespace(namespace_t*ns) +{ + NEW(constant_t,c); + c->ns = namespace_clone(ns); + c->type = ns->access; + assert(NS_TYPE(c->type)); + return c; +} +constant_t* constant_new_true() +{ + NEW(constant_t,c); + c->type = CONSTANT_TRUE; + return c; +} +constant_t* constant_new_false() +{ + NEW(constant_t,c); + c->type = CONSTANT_FALSE; + return c; +} +constant_t* constant_new_null() +{ + NEW(constant_t,c); + c->type = CONSTANT_NULL; + return c; +} +constant_t* constant_new_undefined() +{ + NEW(constant_t,c); + c->type = CONSTANT_UNDEFINED; + return c; +} +constant_t* constant_clone(constant_t*other) +{ + if(!other) return 0; + constant_t*c = malloc(sizeof(constant_t)); + memcpy(c, other, sizeof(constant_t)); + if(NS_TYPE(c->type)) { + c->ns = namespace_clone(other->ns); + } else if(c->type == CONSTANT_STRING) { + c->s = string_dup3(other->s); + } + return c; +} +constant_t* constant_fromindex(pool_t*pool, int index, int type) +{ + if(!index) { + /* even for nonvalued constants (like TRUE/FALSE etc.), a nonzero + index is present to indicate that a type is coming */ + return 0; + } + NEW(constant_t,c); + c->type = type; + if(NS_TYPE(c->type)) { + c->ns = namespace_clone(pool_lookup_namespace(pool, index)); + } else if(c->type == CONSTANT_INT) { + c->i = pool_lookup_int(pool, index); + } else if(c->type == CONSTANT_UINT) { + c->u = pool_lookup_uint(pool, index); + } else if(c->type == CONSTANT_FLOAT) { + c->f = pool_lookup_float(pool, index); + } else if(c->type == CONSTANT_STRING) { + string_t s = pool_lookup_string2(pool, index); + c->s = string_dup3(&s); + } else if(UNIQUE_CONSTANT(c->type)) { + // ok + } else { + fprintf(stderr, "invalid constant type %02x\n", c->type); + } + return c; +} +char* constant_tostring(constant_t*c) +{ + if(!c) + return strdup("NULL"); + char buf[32]; + if(NS_TYPE(c->type)) { + return namespace_tostring(c->ns); + } else if(c->type == CONSTANT_INT) { + sprintf(buf, "%d", c->i); + return strdup(buf); + } else if(c->type == CONSTANT_UINT) { + sprintf(buf, "%u", c->u); + return strdup(buf); + } else if(c->type == CONSTANT_FLOAT) { + char buf[1024]; + sprintf(buf, "%f", c->f); + return strdup(buf); + } else if(c->type == CONSTANT_STRING) { + /* should we escape the string? \0 bytes won't be printed */ + return strdup_n(c->s->str,c->s->len); + } else if(c->type == CONSTANT_TRUE) { + return strdup("true"); + } else if(c->type == CONSTANT_FALSE) { + return strdup("false"); + } else if(c->type == CONSTANT_NULL) { + return strdup("null"); + } else if(c->type == CONSTANT_UNDEFINED) { + return strdup("undefined"); + } else { + fprintf(stderr, "invalid constant type %02x\n", c->type); + return 0; + } +} +char constant_has_index(constant_t*c) +{ + if(!c) + return 0; + return !UNIQUE_CONSTANT(c->type); +} +int constant_get_index(pool_t*pool, constant_t*c) +{ + if(!c) + return 0; + if(NS_TYPE(c->type)) { + assert(c->ns); + /*if(c->type!=c->ns->access) { + printf("%02x<->%02x\n", c->type, c->ns->access); + }*/ + assert(c->type == c->ns->access); + return pool_register_namespace(pool, c->ns); + } else if(c->type == CONSTANT_INT) { + return pool_register_int(pool, c->i); + } else if(c->type == CONSTANT_UINT) { + return pool_register_uint(pool, c->u); + } else if(c->type == CONSTANT_FLOAT) { + return pool_register_float(pool, c->f); + } else if(c->type == CONSTANT_STRING) { + return pool_register_string2(pool, c->s); + } else if(c->type == CONSTANT_UNDEFINED) { + /* write undefined with index 0 (and no type). Otherwise, the FlashPlayer + seems to throw an "attempt to read out of bounds" exception */ + return 0; + } else if(!constant_has_index(c)) { + return 1; + } else { + fprintf(stderr, "invalid constant type %02x\n", c->type); + return 0; + } +} +void constant_free(constant_t*c) +{ + if(!c) + return; + if(c->type == CONSTANT_STRING) { + string_free(c->s); + } else if (NS_TYPE(c->type)) { + namespace_destroy(c->ns);c->ns=0; + } + free(c); +} +// --------------------------- optimizing ----------------------------------- + +static int array_append_or_increase(array_t*array, void*key) +{ + int pos = array_find(array, key); + if(pos>=0) { + array->d[pos].data++; + return pos; + } else { + return array_append(array, key, 0); + } +} +static int compare_arrayentry(const void*_c1, const void*_c2) +{ + const array_entry_t*c1 = _c1; + const array_entry_t*c2 = _c2; + return c2->data - c1->data; +} + +static void* nodup(const void*o) {return (void*)o;} + +static void reshuffle_array(array_t*array) +{ + qsort(array->d+1, array->num-1, sizeof(array->d[0]), compare_arrayentry); + type_t* old_type = array->entry2pos->key_type; + type_t old_type_nodup = *old_type; + old_type_nodup.dup = nodup; + dict_t*d = dict_new2(&old_type_nodup); + dict_destroy_shallow(array->entry2pos); + array->entry2pos = d; + int t; + for(t=0;tnum;t++) { + dict_put(array->entry2pos, array->d[t].name, (void*)(ptroff_t)(t+1)); + } + d->key_type = old_type; + +} + +// ------------------------------- pool ------------------------------------- + +int pool_register_uint(pool_t*p, unsigned int i) +{ + int pos = array_append_or_increase(p->x_uints, &i); + assert(pos!=0); + return pos; +} +int pool_register_int(pool_t*p, int i) +{ + int pos = array_append_or_increase(p->x_ints, &i); + assert(pos!=0); + return pos; +} +int pool_register_float(pool_t*p, double d) +{ + int pos = array_append_or_increase(p->x_floats, &d); + fprintf(stderr, "putting %f at %d\n", d, pos);fflush(stderr); + assert(pos!=0); + return pos; +} +int pool_register_string(pool_t*pool, const char*str) +{ + if(!str) return 0; + string_t s = string_new2(str); + int pos = array_append_or_increase(pool->x_strings, &s); + assert(pos!=0); + return pos; +} +int pool_register_string2(pool_t*pool, string_t*s) +{ + if(!s || !s->str) return 0; + int pos = array_append_or_increase(pool->x_strings, s); + assert(pos!=0); + return pos; +} +int pool_register_namespace(pool_t*pool, namespace_t*ns) +{ + if(!ns) return 0; + int pos = array_append_or_increase(pool->x_namespaces, ns); + assert(pos!=0 || ns->access==ZERONAMESPACE); + return pos; +} +int pool_register_namespace_set(pool_t*pool, namespace_set_t*set) +{ + if(!set) return 0; + int pos = array_append_or_increase(pool->x_namespace_sets, set); + assert(pos!=0); + return pos; +} +int pool_register_multiname(pool_t*pool, multiname_t*n) +{ + if(!n) return 0; + int pos = array_append_or_increase(pool->x_multinames, n); + assert(pos!=0); + return pos; +} +int pool_register_multiname2(pool_t*pool, char*name) +{ + if(!name) return 0; + multiname_t*n = multiname_fromstring(name); + int pos = array_append_or_increase(pool->x_multinames, n); + multiname_destroy(n); + assert(pos!=0); + return pos; +} + + +int pool_find_uint(pool_t*pool, unsigned int x) +{ + int i = array_find(pool->x_uints, &x); + if(i<=0) { + fprintf(stderr, "Couldn't find uint \"%d\" in constant pool\n", x); + return 0; + } + return i; +} +int pool_find_int(pool_t*pool, int x) +{ + int i = array_find(pool->x_ints, &x); + if(i<=0) { + fprintf(stderr, "Couldn't find int \"%d\" in constant pool\n", x); + return 0; + } + return i; +} +int pool_find_float(pool_t*pool, double x) +{ + int i = array_find(pool->x_ints, &x); + if(i<=0) { + fprintf(stderr, "Couldn't find int \"%f\" in constant pool\n", x); + return 0; + } + return i; +} +int pool_find_namespace(pool_t*pool, namespace_t*ns) +{ + if(!ns) + return 0; + int i = array_find(pool->x_namespaces, ns); + if(i<0) { + char*s = namespace_tostring(ns); + fprintf(stderr, "Couldn't find namespace \"%s\" %p in constant pool\n", s, (int)ns); + free(s); + return 0; + } + return i; +} +int pool_find_namespace_set(pool_t*pool, namespace_set_t*set) +{ + if(!set) + return 0; + int i = array_find(pool->x_namespace_sets, set); + if(i<=0) { + char*s = namespace_set_tostring(set); + fprintf(stderr, "Couldn't find namespace_set \"%s\" in constant pool\n", s); + free(s); + return 0; + } + return i; +} +int pool_find_string(pool_t*pool, const char*str) +{ + if(!str) + return 0; + string_t s = string_new2(str); + int i = array_find(pool->x_strings, &s); + if(i<=0) { + fprintf(stderr, "Couldn't find string \"%s\" in constant pool\n", str); + return 0; + } + return i; +} +int pool_find_multiname(pool_t*pool, multiname_t*name) +{ + if(!name) + return 0; + int i = array_find(pool->x_multinames, name); + if(i<=0) { + char*s = multiname_tostring(name); + fprintf(stderr, "Couldn't find multiname \"%s\" in constant pool\n", s); + free(s); + return 0; + } + return i; +} + +int pool_lookup_int(pool_t*pool, int i) +{ + if(!i) return 0; + int*ptr = (int*)array_getkey(pool->x_ints, i); + if(!ptr) return 0; + return *ptr; +} +unsigned int pool_lookup_uint(pool_t*pool, int i) +{ + if(!i) return 0; + return *(unsigned int*)array_getkey(pool->x_uints, i); +} +double pool_lookup_float(pool_t*pool, int i) +{ + if(!i) return __builtin_nan(""); + double*ptr = (double*)array_getkey(pool->x_floats, i); + if(!ptr) + return __builtin_nan(""); + return *ptr; +} +const char*pool_lookup_string(pool_t*pool, int i) +{ + string_t*s = array_getkey(pool->x_strings, i); + if(!s) return 0; + return s->str; +} +string_t pool_lookup_string2(pool_t*pool, int i) +{ + string_t*s = array_getkey(pool->x_strings, i); + return *s; +} +namespace_t*pool_lookup_namespace(pool_t*pool, int i) +{ + return (namespace_t*)array_getkey(pool->x_namespaces, i); +} +namespace_set_t*pool_lookup_namespace_set(pool_t*pool, int i) +{ + return (namespace_set_t*)array_getkey(pool->x_namespace_sets, i); +} +multiname_t*pool_lookup_multiname(pool_t*pool, int i) +{ + return (multiname_t*)array_getkey(pool->x_multinames, i); +} + +static namespace_t zeronamespace={ZERONAMESPACE,"*"}; +pool_t*pool_new() +{ + NEW(pool_t, p); + + p->x_ints = array_new2(&uint_type); + p->x_uints = array_new2(&uint_type); + p->x_floats = array_new2(&float_type); + p->x_strings = array_new2(&stringstruct_type); + p->x_namespaces = array_new2(&namespace_type); + p->x_namespace_sets = array_new2(&namespace_set_type); + p->x_multinames = array_new2(&multiname_type); + + /* add a zero-index entry in each list */ + + array_append(p->x_ints, 0, 0); + array_append(p->x_uints, 0, 0); + array_append(p->x_floats, 0, 0); + array_append(p->x_strings, 0, 0); + array_append(p->x_namespaces, &zeronamespace, 0); + array_append(p->x_namespace_sets, 0, 0); + array_append(p->x_multinames, 0, 0); + return p; +} + +void pool_optimize(pool_t*p) +{ + reshuffle_array(p->x_ints); + reshuffle_array(p->x_uints); + reshuffle_array(p->x_floats); + reshuffle_array(p->x_strings); + reshuffle_array(p->x_namespaces); + reshuffle_array(p->x_namespace_sets); + reshuffle_array(p->x_multinames); +} + +#define DEBUG if(0) +//#define DEBUG + +void pool_read(pool_t*pool, TAG*tag) +{ + int num_ints = swf_GetU30(tag); + DEBUG printf("%d ints\n", num_ints); + int t; + for(t=1;tx_ints, &v, 0); + } + + int num_uints = swf_GetU30(tag); + DEBUG printf("%d uints\n", num_uints); + for(t=1;tx_uints, &v, 0); + } + + int num_floats = swf_GetU30(tag); + DEBUG printf("%d floats\n", num_floats); + for(t=1;tx_floats, &d, 0); + } + + int num_strings = swf_GetU30(tag); + DEBUG printf("%d strings\n", num_strings); + for(t=1;tdata[tag->pos], len); + swf_GetBlock(tag, 0, len); + array_append(pool->x_strings, &s, 0); + DEBUG printf("%d) \"%s\"\n", t, ((string_t*)array_getkey(pool->x_strings, t))->str); + } + int num_namespaces = swf_GetU30(tag); + DEBUG printf("%d namespaces\n", num_namespaces); + for(t=1;tx_namespaces, ns, 0); + DEBUG printf("%d) %02x \"%s\"\n", t, type, namespace_tostring(ns)); + namespace_destroy(ns); + } + int num_sets = swf_GetU30(tag); + DEBUG printf("%d namespace sets\n", num_sets); + for(t=1;tx_namespaces, nsnr); + list_append(nsset->namespaces, namespace_clone(ns)); + } + array_append(pool->x_namespace_sets, nsset, 0); + DEBUG printf("set %d) %s\n", t, namespace_set_tostring(nsset)); + namespace_set_destroy(nsset); + } + + int num_multinames = swf_GetU30(tag); + DEBUG printf("%d multinames\n", num_multinames); + for(t=1;tdata[tag->pos+s]); + printf("\n");*/ + + m.type = swf_GetU8(tag); + if(m.type==0x07 || m.type==0x0d) { + int namespace_index = swf_GetU30(tag); + m.ns = (namespace_t*)array_getkey(pool->x_namespaces, namespace_index); + if(!m.ns) { + fprintf(stderr, "Error: Illegal reference to namespace #%d in constant pool.\n", namespace_index); + } + int name_index = swf_GetU30(tag); + if(name_index) // 0 = '*' (any) + m.name = pool_lookup_string(pool, name_index); + } else if(m.type==0x0f || m.type==0x10) { + int name_index = swf_GetU30(tag); + if(name_index) // 0 = '*' (any name) + m.name = pool_lookup_string(pool, name_index); + } else if(m.type==0x11 || m.type==0x12) { + } else if(m.type==0x09 || m.type==0x0e) { + int name_index = swf_GetU30(tag); + int namespace_set_index = swf_GetU30(tag); + if(name_index) + m.name = pool_lookup_string(pool, name_index); + m.namespace_set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, namespace_set_index); + } else if(m.type==0x1b || m.type==0x1c) { + int namespace_set_index = swf_GetU30(tag); + m.namespace_set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, namespace_set_index); + } else if(m.type==0x1d) { + int v1 = swf_GetU30(tag); //multiname + int v2 = swf_GetU30(tag); //counter? + int v3 = swf_GetU30(tag); //multiname + // e.g. Vector ... we only store the parent object + m = *(multiname_t*)array_getkey(pool->x_multinames, v1); + } else { + printf("can't parse type %d multinames yet\n", m.type); + } + DEBUG printf("multiname %d) %s\n", t, multiname_tostring(&m)); + array_append(pool->x_multinames, &m, 0); + } +} + +void pool_dump(pool_t*pool, FILE*fo, char flags) +{ + int t; + fprintf(fo, "%d integers\n", pool->x_ints->num); + for(t=1;tx_ints->num;t++) { + S32 val = *(int*)array_getkey(pool->x_ints, t); + int freq = (int)(ptroff_t)array_getvalue(pool->x_ints, t); + if(flags&1) fprintf(fo, "%5d %d) %d\n", freq, t, val); + } + fprintf(fo, "%d unsigned integers\n", pool->x_uints->num); + for(t=1;tx_uints->num;t++) { + U32 val = *(unsigned int*)array_getkey(pool->x_uints, t); + int freq = (int)(ptroff_t)array_getvalue(pool->x_uints, t); + if(flags&1) fprintf(fo, "%5d %d) %d\n", freq, t, val); + } + fprintf(fo, "%d floats\n", pool->x_floats->num); + for(t=1;tx_floats->num;t++) { + double d = pool_lookup_float(pool, t); + int freq = (int)(ptroff_t)array_getvalue(pool->x_floats, t); + if(flags&2) fprintf(fo, "%5d %d) %f\n", freq, t, d); + } + fprintf(fo, "%d strings\n", pool->x_strings->num); + for(t=1;tx_strings->num;t++) { + string_t str = pool_lookup_string2(pool, t); + int freq = (int)(ptroff_t)array_getvalue(pool->x_strings, t); + if(flags&1) fprintf(fo, "%5d %d) ", freq, t); + if(flags&1) fwrite(str.str, str.len, 1, fo); + if(flags&1) fprintf(fo, "\n"); + } + fprintf(fo, "%d namespaces\n", pool->x_namespaces->num); + for(t=1;tx_namespaces->num;t++) { + namespace_t*ns= (namespace_t*)array_getkey(pool->x_namespaces, t); + char*s = namespace_tostring(ns); + int freq = (int)(ptroff_t)array_getvalue(pool->x_namespaces, t); + if(flags&1) fprintf(fo, "%5d %d) %s\n", freq, t, s); + free(s); + } + fprintf(fo, "%d namespace sets\n", pool->x_namespace_sets->num); + for(t=1;tx_namespace_sets->num;t++) { + namespace_set_t*set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, t); + char*s = namespace_set_tostring(set); + int freq = (int)(ptroff_t)array_getvalue(pool->x_namespace_sets, t); + if(flags&1) fprintf(fo, "%5d %d) %s\n", freq, t, s); + free(s); + } + + fprintf(fo, "%d multinames\n", pool->x_multinames->num); + for(t=1;tx_multinames->num;t++) { + multiname_t*m = (multiname_t*)array_getkey(pool->x_multinames, t); + char*s = multiname_tostring(m); + int freq = (int)(ptroff_t)array_getvalue(pool->x_multinames, t); + if(flags&1) fprintf(fo, "%5d %d) %s\n", freq, t, s); + free(s); + } +} + +void pool_write(pool_t*pool, TAG*tag) +{ + int t; + + /* make sure that all namespaces used by multinames / namespace sets + and all strings used by namespaces exist */ + + for(t=1;tx_multinames->num;t++) { + multiname_t*m = (multiname_t*)array_getkey(pool->x_multinames, t); + if(m->ns) { + pool_register_namespace(pool, m->ns); + } + if(m->namespace_set) { + pool_register_namespace_set(pool, m->namespace_set); + } + if(m->name) { + pool_register_string(pool, m->name); + } + } + for(t=1;tx_namespace_sets->num;t++) { + namespace_set_t*set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, t); + namespace_list_t*i = set->namespaces; + while(i) { + pool_register_namespace(pool, i->namespace); + i = i->next; + } + } + for(t=1;tx_namespaces->num;t++) { + namespace_t*ns= (namespace_t*)array_getkey(pool->x_namespaces, t); + /* The spec says (page 22): "a value of zero denotes an empty string". + However when actually using zero strings as empty namespaces, the + flash player breaks.*/ + //if(ns->name && ns->name[0]) + pool_register_string(pool, ns->name); + } + + //pool_register_int(pool, 15); + //pool_register_int(pool, 1); + //pool_register_int(pool, 0); + + /* write data */ + swf_SetU30(tag, pool->x_ints->num>1?pool->x_ints->num:0); + for(t=1;tx_ints->num;t++) { + S32 val = *(int*)array_getkey(pool->x_ints, t); + swf_SetABCS32(tag, val); + } + swf_SetU30(tag, pool->x_uints->num>1?pool->x_uints->num:0); + for(t=1;tx_uints->num;t++) { + swf_SetABCU32(tag, *(unsigned int*)array_getkey(pool->x_uints, t)); + } + swf_SetU30(tag, pool->x_floats->num>1?pool->x_floats->num:0); + for(t=1;tx_floats->num;t++) { + double d = pool_lookup_float(pool, t); + swf_SetD64(tag, d); + } + swf_SetU30(tag, pool->x_strings->num>1?pool->x_strings->num:0); + for(t=1;tx_strings->num;t++) { + string_t str = pool_lookup_string2(pool, t); + swf_SetU30String(tag, str.str, str.len); + } + swf_SetU30(tag, pool->x_namespaces->num>1?pool->x_namespaces->num:0); + for(t=1;tx_namespaces->num;t++) { + namespace_t*ns= (namespace_t*)array_getkey(pool->x_namespaces, t); + swf_SetU8(tag, ns->access); + const char*name = ns->name; + int i = 0; + + //if(name && name[0]) + i = pool_find_string(pool, name); + + swf_SetU30(tag, i); + } + swf_SetU30(tag, pool->x_namespace_sets->num>1?pool->x_namespace_sets->num:0); + for(t=1;tx_namespace_sets->num;t++) { + namespace_set_t*set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, t); + namespace_list_t*i = set->namespaces; + int len = list_length(i); + swf_SetU30(tag, len); + while(i) { + int index = pool_find_namespace(pool, i->namespace); + swf_SetU30(tag, index); + i = i->next; + } + } + + swf_SetU30(tag, pool->x_multinames->num>1?pool->x_multinames->num:0); + for(t=1;tx_multinames->num;t++) { + multiname_t*m = (multiname_t*)array_getkey(pool->x_multinames, t); + swf_SetU8(tag, m->type); + + if(m->ns) { + assert(m->type==0x07 || m->type==0x0d); + int i = pool_find_namespace(pool, m->ns); + if(i<0) fprintf(stderr, "internal error: unregistered namespace %02x %s %s\n", m->ns->access, access2str(m->ns->access), m->ns->name); + swf_SetU30(tag, i); + } else { + assert(m->type!=0x07 && m->type!=0x0d); + } + + if(m->name) { + assert(m->type==0x09 || m->type==0x0e || m->type==0x07 || m->type==0x0d || m->type==0x0f || m->type==0x10); + int i = pool_find_string(pool, m->name); + if(i<0) fprintf(stderr, "internal error: unregistered name\n"); + swf_SetU30(tag, i); + } else { + if(m->type == 0x09) { + swf_SetU30(tag, 0); + } + assert(m->type!=0x0e && m->type!=0x07 && m->type!=0x0d && m->type!=0x0f && m->type!=0x10); + } + if(m->namespace_set) { + assert(m->type==0x09 || m->type==0x0e || m->type==0x1c || m->type==0x1b); + int i = pool_find_namespace_set(pool, m->namespace_set); + if(i<0) fprintf(stderr, "internal error: unregistered namespace set\n"); + swf_SetU30(tag, i); + } else { + assert(m->type!=0x09 && m->type!=0x0e && m->type!=0x1c && m->type!=0x1b); + } + } +} + + +void pool_destroy(pool_t*pool) +{ + int t; + array_free(pool->x_ints); + array_free(pool->x_uints); + array_free(pool->x_floats); + array_free(pool->x_strings); + array_free(pool->x_namespaces); + array_free(pool->x_namespace_sets); + array_free(pool->x_multinames); + free(pool); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h new file mode 100644 index 000000000..632fa7f38 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h @@ -0,0 +1,217 @@ +/* pool.h + + Routines for handling Flash2 AVM2 ABC contantpool entries. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __pool_h__ +#define __pool_h__ + +#include "../q.h" +#include "../rfxswf.h" + +DECLARE(pool); +DECLARE(constant); +DECLARE_LIST(constant); +DECLARE(multiname); +DECLARE(namespace); +DECLARE(namespace_set); +DECLARE_LIST(multiname); +DECLARE_LIST(namespace); +DECLARE_LIST(trait); + +/* abc file constant pool */ +struct _pool { + array_t*x_ints; + array_t*x_uints; + array_t*x_floats; + array_t*x_strings; + array_t*x_namespaces; + array_t*x_namespace_sets; + array_t*x_multinames; +}; + +typedef enum access_type +{ACCESS_STANDARD=0x16, + ACCESS_PACKAGE=0x16, + ACCESS_PUBLIC=0x16, + ACCESS_PACKAGEINTERNAL=0x17, + ACCESS_PROTECTED=0x18, + ACCESS_EXPLICIT=0x19, + ACCESS_STATICPROTECTED=0x1a, + ACCESS_PRIVATE=0x05, + ACCESS_NAMESPACE=0x08 +} access_type_t; + + +typedef enum constant_type +{ +CONSTANT_STRING=0x01, +CONSTANT_INT=0x03, +CONSTANT_UINT=0x04, +CONSTANT_FLOAT=0x06, + +CONSTANT_TRUE=0x0B, +CONSTANT_FALSE=0x0A, +CONSTANT_NULL=0x0C, +CONSTANT_UNDEFINED=0x00, + +CONSTANT_NAMESPACE=0x08, +CONSTANT_NAMESPACE_PACKAGE=0x16, +CONSTANT_NAMESPACE_PACKAGEINTERNAL=0x17, +CONSTANT_NAMESPACE_PROTECTED=0x18, +CONSTANT_NAMESPACE_EXPLICIT=0x19, +CONSTANT_NAMESPACE_STATICPROTECTED=0x1A, +CONSTANT_NAMESPACE_PRIVATE=0x05, +CONSTANT_UNKNOWN=0x55, /*used internally */ +} contant_type_t; + +#define NS_TYPE(x) ((x) == 0x08 || (x) == 0x16 || (x) == 0x17 || (x) == 0x18 || (x) == 0x19 || (x) == 0x1a || (x) == 0x05) + +struct _constant { + int type; + union { + string_t* s; + namespace_t*ns; + double f; + int i; + unsigned int u; + }; +}; + +constant_t* constant_clone(); +constant_t* constant_new_int(int x); +constant_t* constant_new_uint(unsigned int x); +constant_t* constant_new_float(double x); +constant_t* constant_new_string(const char*s); +constant_t* constant_new_string2(const char*s, int len); +constant_t* constant_new_namespace(namespace_t*ns); +constant_t* constant_new_true(); +constant_t* constant_new_false(); +constant_t* constant_new_null(); +constant_t* constant_new_undefined(); +char constant_has_index(constant_t*c); +constant_t* constant_fromindex(pool_t*pool, int index, int type); +char* constant_tostring(constant_t*c); +int constant_get_index(pool_t*pool, constant_t*c); +void constant_free(constant_t*c); + +typedef enum multiname_type +{QNAME=0x07, + RTQNAME=0x0F, + RTQNAMEL=0x11, + MULTINAME=0x09, + MULTINAMEL=0x1B, + QNAMEA=0x0D, + RTQNAMEA=0x10, + RTQNAMELA=0x12, + MULTINAMEA=0x0E, + MULTINAMELA=0x1C, + POSTFIXTYPE=0x1D, + ZERONAMESPACE=0 +} multiname_type_t; + +char* access2str(int type); + +struct _namespace { + U8 access; + const char*name; +}; +struct _namespace_set { + namespace_list_t*namespaces; +}; + +extern type_t multiname_type; +struct _multiname { + multiname_type_t type; + namespace_t*ns; + namespace_set_t*namespace_set; + const char*name; +}; + +/* object -> string */ +char* namespace_set_tostring(namespace_set_t*set); +char* multiname_tostring(multiname_t*m); +char* namespace_tostring(namespace_t*ns); + +/* integer -> object */ +int pool_lookup_int(pool_t*pool, int i); +unsigned int pool_lookup_uint(pool_t*pool, int i); +double pool_lookup_float(pool_t*pool, int i); +const char*pool_lookup_string(pool_t*pool, int i); +string_t pool_lookup_string2(pool_t*pool, int i); +namespace_t*pool_lookup_namespace(pool_t*pool, int i); +namespace_set_t*pool_lookup_namespace_set(pool_t*pool, int i); +multiname_t*pool_lookup_multiname(pool_t*pool, int i); + +/* object -> integer (lookup) */ +int pool_find_int(pool_t*pool, int x); +int pool_find_uint(pool_t*pool, unsigned int x); +int pool_find_double(pool_t*pool, double x); +int pool_find_namespace(pool_t*pool, namespace_t*ns); +int pool_find_namespace_set(pool_t*pool, namespace_set_t*set); +int pool_find_string(pool_t*pool, const char*s); +int pool_find_multiname(pool_t*pool, multiname_t*name); + +/* object -> integer (lookup/creation) */ +int pool_register_int(pool_t*p, int i); +int pool_register_uint(pool_t*p, unsigned int i); +int pool_register_float(pool_t*p, double d); +int pool_register_string(pool_t*pool, const char*s); +int pool_register_string2(pool_t*pool, string_t*s); +int pool_register_namespace(pool_t*pool, namespace_t*ns); +int pool_register_namespace_set(pool_t*pool, namespace_set_t*set); +int pool_register_multiname(pool_t*pool, multiname_t*n); +int pool_register_multiname2(pool_t*pool, char*name); + +/* creation */ +namespace_t* namespace_new(U8 access, const char*name); +namespace_t* namespace_new_namespace(const char*name); +namespace_t* namespace_new_package(const char*name); +namespace_t* namespace_new_packageinternal(const char*name); +namespace_t* namespace_new_protected(const char*name); +namespace_t* namespace_new_explicit(const char*name); +namespace_t* namespace_new_staticprotected(const char*name); +namespace_t* namespace_new_private(const char*name); +namespace_t* namespace_clone(namespace_t*ns); + +namespace_t* namespace_fromstring(const char*name); + +multiname_t* multiname_fromstring(const char*name); +multiname_t* multiname_new(namespace_t*ns, const char*name); +multiname_t* multiname_clone(multiname_t*other); + +/* accessors etc. */ +char multiname_late_namespace(multiname_t*m); +char multiname_late_name(multiname_t*m); + +/* freeing */ +void multiname_destroy(multiname_t*m); +void namespace_destroy(namespace_t*n); + +/* pool constructors/destructors */ +pool_t*pool_new(); +void pool_optimize(); +void pool_read(pool_t*pool, TAG*tag); +void pool_write(pool_t*pool, TAG*tag); +void pool_destroy(pool_t*pool); +void pool_dump(pool_t*pool, FILE*fo, char flags); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c new file mode 100644 index 000000000..5aaef97bd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c @@ -0,0 +1,596 @@ +/* registry.c + + Routines for compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include "pool.h" +#include "registry.h" +#include "builtin.h" + +dict_t*registry_classes=0; +asset_bundle_list_t*assets=0; + +// ----------------------- class signature ------------------------------ + +char slotinfo_equals(slotinfo_t*c1, slotinfo_t*c2) +{ + if(!!c1 != !!c2) + return 0; + /* notice: access right is *not* respected */ + if(!strcmp(c1->name, c2->name) && + !strcmp(c1->package, c2->package)) { + return 1; + } + return 0; +} +static unsigned int slotinfo_hash(slotinfo_t*c) +{ + unsigned int hash = 0; + hash = crc32_add_string(hash, c->package); + hash = crc32_add_string(hash, c->name); + return hash; +} +static unsigned int memberinfo_hash(slotinfo_t*c) +{ + unsigned int hash = 0; + hash = crc32_add_string(hash, c->name); + return hash; +} + +static void* dummy_clone(void*other) {return other;} +static void dummy_destroy(slotinfo_t*c) {} + +type_t slotinfo_type = { + hash: (hash_func)slotinfo_hash, + equals: (equals_func)slotinfo_equals, + dup: (dup_func)dummy_clone, // all signatures are static + free: (free_func)dummy_destroy, +}; +type_t memberinfo_type = { + hash: (hash_func)memberinfo_hash, + equals: (equals_func)slotinfo_equals, + dup: (dup_func)dummy_clone, // all signatures are static + free: (free_func)dummy_destroy, +}; + +// ----------------------- assets ------------------------------------- +static void use_asset(asset_bundle_t*a) +{ + a->used = 1; + asset_bundle_list_t*l = a->dependencies; + while(l) { + if(!l->asset_bundle->used) { + use_asset(l->asset_bundle); + } + l = l->next; + } +} +void registry_use(slotinfo_t*s) +{ + if(!s) return; + if(!(s->flags&FLAG_USED)) { + s->flags |= FLAG_USED; + if(s->kind == INFOTYPE_CLASS) { + classinfo_t*c=(classinfo_t*)s; + if(c->assets) { + use_asset(c->assets); + } + int t=0; + while(c->interfaces[t]) { + registry_use((slotinfo_t*)c->interfaces[t]); + t++; + } + while(c->superclass) { + c = c->superclass; + registry_use((slotinfo_t*)c); + } + } else if(s->kind == INFOTYPE_METHOD) { + methodinfo_t*m=(methodinfo_t*)s; + if(m->parent) { + registry_use((slotinfo_t*)m->parent); + } + } else if(s->kind == INFOTYPE_VAR) { + varinfo_t*v=(varinfo_t*)s; + if(v->parent) { + registry_use((slotinfo_t*)v->parent); + } + } + } +} +void registry_add_asset(asset_bundle_t*bundle) +{ + list_append(assets, bundle); +} +asset_bundle_list_t*registry_getassets() +{ + return assets; +} +// ----------------------- resolving ---------------------------------- +slotinfo_t* registry_resolve(slotinfo_t*_s) +{ + if(!_s || _s->kind != INFOTYPE_UNRESOLVED) + return _s; + unresolvedinfo_t*s = (unresolvedinfo_t*)_s; + + if(s->package) + return registry_find(s->package, s->name); + + namespace_list_t*l = s->nsset; + while(l) { + slotinfo_t* n = registry_find(l->namespace->name, s->name); + if(n) return n; + l = l->next; + } + return 0; +} + +static slotinfo_list_t*unresolved = 0; +static void schedule_for_resolve(slotinfo_t*s) +{ + list_append(unresolved, s); +} +static void resolve_on_slot(slotinfo_t*_member) +{ + if(_member->kind == INFOTYPE_VAR) { + varinfo_t*member = (varinfo_t*)_member; + member->type = (classinfo_t*)registry_resolve((slotinfo_t*)member->type); + } else if(_member->kind == INFOTYPE_METHOD) { + methodinfo_t*member = (methodinfo_t*)_member; + member->return_type = (classinfo_t*)registry_resolve((slotinfo_t*)member->return_type); + classinfo_list_t*l = member->params; + while(l) { + l->classinfo = (classinfo_t*)registry_resolve((slotinfo_t*)l->classinfo); + l = l->next; + } + } else fprintf(stderr, "Internal Error: bad slot %s", _member->name); +} +static void resolve_on_class(slotinfo_t*_cls) +{ + classinfo_t*cls = (classinfo_t*)_cls; + cls->superclass = (classinfo_t*)registry_resolve((slotinfo_t*)cls->superclass); + + DICT_ITERATE_DATA(&cls->members,slotinfo_t*,m) { + resolve_on_slot(m); + } + DICT_ITERATE_DATA(&cls->static_members,slotinfo_t*,m2) { + resolve_on_slot(m2); + } + + int t=0; + while(cls->interfaces[t]) { + cls->interfaces[t] = (classinfo_t*)registry_resolve((slotinfo_t*)cls->interfaces[t]); + t++; + } +} +void registry_resolve_all() +{ + while(unresolved) { + slotinfo_t*_s = unresolved->slotinfo; + if(_s->kind == INFOTYPE_CLASS) { + resolve_on_class(_s); + } else if(_s->kind == INFOTYPE_METHOD || _s->kind == INFOTYPE_VAR) { + resolve_on_slot(_s); + } else { + fprintf(stderr, "Internal Error: object %s.%s has bad type\n", _s->package, _s->name); + } + slotinfo_list_t*tofree = unresolved; + unresolved = unresolved->next; + free(tofree); + } +} +// ------------------------- constructors -------------------------------- + +#define AVERAGE_NUMBER_OF_MEMBERS 8 +classinfo_t* classinfo_register(int access, const char*package, const char*name, int num_interfaces) +{ + classinfo_t*c = rfx_calloc(sizeof(classinfo_t)+(sizeof(classinfo_t*)*(num_interfaces+1))); + c->interfaces[0] = 0; + c->kind = INFOTYPE_CLASS; + c->access = access; + c->package = package; + c->name = name; + dict_put(registry_classes, c, c); + dict_init2(&c->members, &memberinfo_type, AVERAGE_NUMBER_OF_MEMBERS); + dict_init2(&c->static_members, &memberinfo_type, AVERAGE_NUMBER_OF_MEMBERS); + + schedule_for_resolve((slotinfo_t*)c); + return c; +} +methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static) +{ + NEW(methodinfo_t,m); + m->kind = INFOTYPE_METHOD; + m->access = access; + m->name = name; + m->package = ns; + m->parent = cls; + if(!is_static) + dict_put(&cls->members, m, m); + else + dict_put(&cls->static_members, m, m); + return m; +} +varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static) +{ + NEW(varinfo_t,m); + m->kind = INFOTYPE_VAR; + m->access = access; + m->name = name; + m->package = ns; + m->parent = cls; + if(!is_static) + dict_put(&cls->members, m, m); + else + dict_put(&cls->static_members, m, m); + return m; +} +methodinfo_t* methodinfo_register_global(U8 access, const char*package, const char*name) +{ + NEW(methodinfo_t, m); + m->kind = INFOTYPE_METHOD; + m->flags = FLAG_STATIC; + m->access = access; + m->package = package; + m->name = name; + m->parent = 0; + dict_put(registry_classes, m, m); + + schedule_for_resolve((slotinfo_t*)m); + return m; +} +varinfo_t* varinfo_register_global(U8 access, const char*package, const char*name) +{ + NEW(varinfo_t, m); + m->kind = INFOTYPE_VAR; + m->flags = FLAG_STATIC; + m->access = access; + m->package = package; + m->name = name; + m->parent = 0; + dict_put(registry_classes, m, m); + + schedule_for_resolve((slotinfo_t*)m); + return m; +} + +// --------------- builtin classes (from builtin.c) ---------------------- + +void registry_init() +{ + if(!registry_classes) + registry_classes = builtin_getclasses(); +} +slotinfo_t* registry_find(const char*package, const char*name) +{ + assert(registry_classes); + slotinfo_t tmp; + tmp.package = package; + tmp.name = name; + slotinfo_t* c = (slotinfo_t*)dict_lookup(registry_classes, &tmp); + /*if(c) + printf("%s.%s->%08x (%s.%s)\n", package, name, c, c->package, c->name);*/ + return c; +} +slotinfo_t* registry_safefind(const char*package, const char*name) +{ + slotinfo_t*c = registry_find(package, name); + if(!c) { + printf("%s.%s\n", package, name); + } + assert(c); + return c; +} +void registry_dump() +{ + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = registry_classes->slots[t]; + while(e) { + slotinfo_t*i = (slotinfo_t*)e->key; + printf("[%s] %s.%s\n", access2str(i->access), i->package, i->name); + e = e->next; + } + } +} + +memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char recursive, char is_static) +{ + memberinfo_t tmp; + tmp.name = name; + tmp.package = ns?ns:""; + + if(!recursive) { + if(!is_static) + return (memberinfo_t*)dict_lookup(&cls->members, &tmp); + else + return (memberinfo_t*)dict_lookup(&cls->static_members, &tmp); + } + /* look at classes directly extended by this class */ + slotinfo_t*m = 0; + classinfo_t*s = cls; + + if(recursive>1) // check *only* superclasses + s = s->superclass; + + while(s) { + if(s->kind == INFOTYPE_UNRESOLVED) + break; + + if(!is_static) { + m = (slotinfo_t*)dict_lookup(&s->members, &tmp); + if(m) return (memberinfo_t*)m; + } + m = (slotinfo_t*)dict_lookup(&s->static_members, &tmp); + if(m) return (memberinfo_t*)m; + + s = s->superclass; + } + /* look at interfaces, and parent interfaces */ + int t=0; + while(cls->interfaces[t]) { + classinfo_t*s = cls->interfaces[t]; + if(s->kind != INFOTYPE_UNRESOLVED) { + while(s) { + if(!is_static) { + m = (slotinfo_t*)dict_lookup(&s->members, &tmp); + if(m) return (memberinfo_t*)m; + } + m = (slotinfo_t*)dict_lookup(&s->static_members, &tmp); + if(m) return (memberinfo_t*)m; + + s = s->superclass; + } + } + t++; + } + return 0; +} + +memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses, char is_static) +{ + memberinfo_t*m = 0; + while(ns) { + m = registry_findmember(cls, ns->namespace->name, name, superclasses, is_static); + if(m) return m; + ns = ns->next; + } + m = registry_findmember(cls, "", name, superclasses, is_static); + if(m) return m; + /* TODO: it maybe would be faster to just store the builtin namespace as "" in + builtins.c (update: some members (e.g. XML.length) are present both for + "" and "http:...builtin") */ + m = registry_findmember(cls, "http://adobe.com/AS3/2006/builtin", name, superclasses, is_static); + if(m) return m; + return 0; +} + + +void registry_fill_multiname(multiname_t*m, namespace_t*n, slotinfo_t*c) +{ + m->type = QNAME; + m->ns = n; + m->ns->access = c->access; + m->ns->name = (char*)c->package; + m->name = c->name; + m->namespace_set = 0; +} +multiname_t* classinfo_to_multiname(slotinfo_t*cls) +{ + if(!cls) + return 0; + multiname_t*m=0; + namespace_t ns = {cls->access, (char*)cls->package}; + return multiname_new(&ns,cls->name); +} + +// ----------------------- memberinfo methods ------------------------------ + +/* hacky code to wrap a variable or function into a "type" + object, but keep a pointer to the "value" */ +static dict_t* functionobjects = 0; +classinfo_t* slotinfo_asclass(slotinfo_t*f) { + if(!functionobjects) { + functionobjects = dict_new2(&ptr_type); + } else { + classinfo_t*c = dict_lookup(functionobjects, f); + if(c) + return c; + } + + classinfo_t*c = rfx_calloc(sizeof(classinfo_t)+sizeof(classinfo_t*)); + c->access = ACCESS_PUBLIC; + c->package = ""; + if(f->kind == INFOTYPE_METHOD) { + c->name = "Function"; + c->superclass = registry_getobjectclass(); + } else if(f->kind == INFOTYPE_CLASS) { + c->name = "Class"; + c->superclass = registry_getobjectclass(); + } else if(f->kind == INFOTYPE_VAR) { + c->name = "Object"; + } else { + c->name = "undefined"; + } + + dict_init2(&c->members, &memberinfo_type, 1); + dict_init2(&c->static_members, &memberinfo_type, 1); + c->data = f; + dict_put(functionobjects, f, c); + return c; +} + +classinfo_t* slotinfo_gettype(slotinfo_t*f) +{ + if(f) { + if(f->kind == INFOTYPE_METHOD) { + return slotinfo_asclass(f); + } else if(f->kind == INFOTYPE_VAR) { + varinfo_t*v = (varinfo_t*)f; + return v->type; + } else + return 0; + } else { + return TYPE_ANY; + } +} + +// ----------------------- package handling --------------------------- +char registry_ispackage(const char*package) +{ + /* crude approximation of "the real thing", but sufficient for now */ + return !strncmp(package, "flash", 5); +} +// ----------------------- builtin types ------------------------------ + +char registry_isfunctionclass(classinfo_t*c) { + return (c && c->package && c->name && + !strcmp(c->package, "") && !strcmp(c->name, "Function")); +} +char registry_isclassclass(classinfo_t*c) { + return (c && c->package && c->name && + !strcmp(c->package, "") && !strcmp(c->name, "Class")); +} + +classinfo_t* registry_getobjectclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "Object"); + return c; +} +classinfo_t* registry_getstringclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "String"); + return c; +} +classinfo_t* registry_getarrayclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "Array"); + return c; +} +classinfo_t* registry_getintclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "int"); + return c; +} +classinfo_t* registry_getuintclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "uint"); + return c; +} +classinfo_t* registry_getbooleanclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "Boolean"); + return c; +} +classinfo_t* registry_getnumberclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "Number"); + return c; +} +classinfo_t* registry_getregexpclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "RegExp"); + return c; +} +classinfo_t* registry_getdateclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "Date"); + return c; +} +classinfo_t* registry_getxmlclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "XML"); + return c; +} +classinfo_t* registry_getxmllistclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "XMLList"); + return c; +} +classinfo_t* registry_getnamespaceclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "Namespace"); + return c; +} +classinfo_t* registry_getMovieClip() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("flash.display", "MovieClip"); + return c; +} + +// ----------------------- builtin dummy types ------------------------- +classinfo_t nullclass = { + INFOTYPE_CLASS,0,0,ACCESS_PACKAGE, "", "null", 0, 0, 0 +}; +classinfo_t* registry_getnullclass() { + return &nullclass; +} +classinfo_t voidclass = { + INFOTYPE_CLASS,0,0,ACCESS_PACKAGE, "", "void", 0, 0, 0 +}; +classinfo_t* registry_getvoidclass() { + return &voidclass; +} + +namespace_t access2namespace(U8 access, char*package) +{ + namespace_t ns; + ns.access = access; + ns.name = package; + return ns; +} + +char* infotypename(slotinfo_t*s) +{ + if(!s) + return "(unknown)"; + if(s->kind == INFOTYPE_CLASS) return "class"; + else if(s->kind == INFOTYPE_VAR) return "var"; + else if(s->kind == INFOTYPE_METHOD) return "function"; + else return "object"; +} + +void slotinfo_dump(slotinfo_t*s) +{ + if(s->package[0]) { + printf("%s %s.%s", infotypename(s), s->package, s->name); + } else { + printf("%s %s", infotypename(s), s->name); + } + if(s->kind == INFOTYPE_CLASS) { + classinfo_t*c = (classinfo_t*)s; + } + else if(s->kind == INFOTYPE_VAR) { + varinfo_t*v = (varinfo_t*)s; + printf(":%s", v->type?v->type->name:"*"); + if(v->value) + printf("=%s", constant_tostring(v->value)); + if(v->slot) + printf(" (slot:%d)", v->slot); + } + else if(s->kind == INFOTYPE_METHOD) { + methodinfo_t*m = (methodinfo_t*)s; + } + else { + } + printf("\n"); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h new file mode 100644 index 000000000..dc5d277db --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h @@ -0,0 +1,231 @@ +/* registry.h + + Routines for compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __abc_registry_h__ +#define __abc_registry_h__ + +#include "abc.h" + +DECLARE(asset_bundle); +DECLARE_LIST(asset_bundle); +DECLARE(slotinfo); +DECLARE(classinfo); +DECLARE(memberinfo); +DECLARE(methodinfo); +DECLARE(unresolvedinfo); +DECLARE(varinfo); +DECLARE_LIST(classinfo); +DECLARE_LIST(slotinfo); + +/* member/class flags */ +#define FLAG_FINAL 1 +#define FLAG_BUILTIN 128 +#define FLAG_USED 64 + +/* member flags */ +#define FLAG_STATIC 2 +#define FLAG_OVERRIDE 8 +#define FLAG_NATIVE 16 +#define FLAG_CONST 32 + +/* class flags */ +#define FLAG_DYNAMIC 8 +#define FLAG_INTERFACE 16 + +#define INFOTYPE_VAR 1 +#define INFOTYPE_METHOD 2 +#define INFOTYPE_CLASS 3 +#define INFOTYPE_UNRESOLVED 4 +#define SUBTYPE_GET 1 +#define SUBTYPE_SET 2 +#define SUBTYPE_GETSET 3 + +#define SLOTINFO_HEAD \ + U8 kind,subtype,flags,access; \ + const char*package; \ + const char*name; \ + int slot; + +struct _slotinfo { + SLOTINFO_HEAD; +}; +struct _unresolvedinfo { + SLOTINFO_HEAD; + namespace_list_t*nsset; +}; +struct _classinfo { + SLOTINFO_HEAD; + classinfo_t*superclass; + dict_t members; + dict_t static_members; + void*data; //TODO: get rid of this- parser.y should pass type/value/code triples around + asset_bundle_t*assets; + classinfo_t*interfaces[]; +}; +struct _memberinfo { + SLOTINFO_HEAD; + union { + classinfo_t*return_type; + classinfo_t*type; + }; + classinfo_t*parent; +}; +struct _methodinfo /*extends memberinfo*/ { + SLOTINFO_HEAD; + classinfo_t*return_type; + classinfo_t*parent; + classinfo_list_t*params; +}; +struct _varinfo /*extends memberinfo*/ { + SLOTINFO_HEAD; + classinfo_t*type; + classinfo_t*parent; + constant_t*value; +}; + +struct _asset_bundle { + abc_file_t*file; + asset_bundle_list_t*dependencies; + char used; +}; + +extern type_t memberinfo_type; +extern type_t slotinfo_type; +char slotinfo_equals(slotinfo_t*c1, slotinfo_t*c2); + +void registry_init(); + +classinfo_t* classinfo_register(int access, const char*package, const char*name, int num_interfaces); +methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static); +methodinfo_t* methodinfo_register_global(U8 access, const char*package, const char*name); +varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static); +varinfo_t* varinfo_register_global(U8 access, const char*package, const char*name); + +slotinfo_t* registry_resolve(slotinfo_t*s); +void registry_resolve_all(); + +slotinfo_t* registry_find(const char*package, const char*name); +void registry_dump(); +memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char superclasses, char is_static); +memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses, char is_static); + +void registry_fill_multiname(multiname_t*m, namespace_t*n, slotinfo_t*c); +#define MULTINAME(m,x) \ + multiname_t m;\ + namespace_t m##_ns;\ + (x)->package; \ + registry_fill_multiname(&m, &m##_ns, (slotinfo_t*)(x)); + +multiname_t* classinfo_to_multiname(slotinfo_t*cls); + +char registry_isfunctionclass(); +char registry_isclassclass(); + +classinfo_t* slotinfo_asclass(slotinfo_t*f); +classinfo_t* slotinfo_gettype(slotinfo_t*); + +namespace_t access2namespace(U8 access, char*package); + +char registry_ispackage(const char*package); + +void registry_add_asset(asset_bundle_t*bundle); +void registry_use(slotinfo_t*s); +asset_bundle_list_t*registry_getassets(); + +// static multinames +classinfo_t voidclass; +classinfo_t* registry_getanytype(); +classinfo_t* registry_getarrayclass(); +classinfo_t* registry_getobjectclass(); +classinfo_t* registry_getnumberclass(); +classinfo_t* registry_getstringclass(); +classinfo_t* registry_getdateclass(); +classinfo_t* registry_getintclass(); +classinfo_t* registry_getuintclass(); +classinfo_t* registry_getnullclass(); +classinfo_t* registry_getvoidclass(); +classinfo_t* registry_getarrayclass(); +classinfo_t* registry_getregexpclass(); +classinfo_t* registry_getxmlclass(); +classinfo_t* registry_getxmllistclass(); +classinfo_t* registry_getbooleanclass(); +classinfo_t* registry_getMovieClip(); +classinfo_t* registry_getclassclass(classinfo_t*a); +classinfo_t* registry_getnamespaceclass(); +extern classinfo_t voidclass; + +char* infotypename(slotinfo_t*s); +void slotinfo_dump(slotinfo_t*s); + +/* convenience functions */ +#define sig2mname(x) (x->superclass,classinfo_to_multiname((slotinfo_t*)(x))) + +#define TYPE_ANY (0) +#define TYPE_IS_ANY(t) ((t) == 0) +#define TYPE_INT registry_getintclass() +#define TYPE_IS_INT(t) ((t) == registry_getintclass()) +#define TYPE_UINT registry_getuintclass() +#define TYPE_IS_UINT(t) ((t) == registry_getuintclass()) +#define TYPE_NUMBER registry_getnumberclass() +#define TYPE_IS_NUMBER(t) ((t) == registry_getnumberclass()) +#define TYPE_FLOAT registry_getnumberclass() +#define TYPE_IS_FLOAT(t) ((t) == registry_getnumberclass()) +#define TYPE_BOOLEAN registry_getbooleanclass() +#define TYPE_IS_BOOLEAN(t) ((t) == registry_getbooleanclass()) +#define TYPE_STRING registry_getstringclass() +#define TYPE_IS_STRING(t) ((t) == registry_getstringclass()) +#define TYPE_DATE registry_getdateclass() +#define TYPE_IS_DATE(t) ((t) == registry_getdateclass()) +#define TYPE_OBJECT registry_getobjectclass() +#define TYPE_IS_OBJECT(t) ((t) == registry_getobjectclass()) +#define TYPE_REGEXP registry_getregexpclass() +#define TYPE_IS_REGEXP(t) ((t) == registry_getregexpclass()) +#define TYPE_VOID registry_getvoidclass() +#define TYPE_IS_VOID(t) ((t) == registry_getvoidclass()) +#define TYPE_ARRAY registry_getarrayclass() +#define TYPE_IS_ARRAY(t) ((t) == registry_getarrayclass()) +#define TYPE_NAMESPACE registry_getnamespaceclass() +#define TYPE_IS_NAMESPACE(t) ((t) == registry_getnamespaceclass()) +#define TYPE_FUNCTION(f) ((f)->return_type,slotinfo_asclass((slotinfo_t*)(f))) +#define TYPE_IS_FUNCTION(t) registry_isfunctionclass(t) +#define TYPE_CLASS(f) ((f)->superclass,slotinfo_asclass((slotinfo_t*)(f))) +#define TYPE_IS_CLASS(t) registry_isclassclass(t) +#define TYPE_NULL registry_getnullclass() +#define TYPE_IS_NULL(t) ((t) == registry_getnullclass()) +#define TYPE_VOID registry_getvoidclass() +#define TYPE_IS_VOID(t) ((t) == registry_getvoidclass()) +#define TYPE_XML registry_getxmlclass() +#define TYPE_IS_XML(t) ((t) == registry_getxmlclass()) +#define TYPE_XMLLIST registry_getxmllistclass() +#define TYPE_IS_XMLLIST(t) ((t) == registry_getxmllistclass()) + +#define TYPE_IS_BUILTIN_SIMPLE(type) (TYPE_IS_INT(type) || \ + TYPE_IS_UINT(type) || \ + TYPE_IS_FLOAT(type) || \ + TYPE_IS_BOOLEAN(type) || \ + TYPE_IS_STRING(type)) + +#define IS_NUMBER_OR_INT(a) (TYPE_IS_INT((a)) || TYPE_IS_UINT((a)) || TYPE_IS_NUMBER((a))) + + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c new file mode 100644 index 000000000..24317ccab --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c @@ -0,0 +1,299 @@ +/* scripts.c + + Some hardcoded abc scripts. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include "abc.h" + +void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) +{ + int num_frames = 0; + int has_buttons = 0; + TAG*tag=swf->firstTag; + + unsigned int checksum = 0; + while(tag) { + if(tag->id == ST_SHOWFRAME) + num_frames++; + if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) + has_buttons = 1; + crc32_add_bytes(checksum, tag->data, tag->len); + tag = tag->next; + } + int t = time(0); + checksum = crc32_add_bytes(checksum, &t, sizeof(t)); + + unsigned char h[16]; + unsigned char file_signature[33]; + sprintf((char*)file_signature, "%x", checksum); + + char scenename1[80], scenename2[80]; + sprintf(scenename1, "rfx.MainTimeline_%s", file_signature); + sprintf(scenename2, "rfx::MainTimeline_%s", file_signature); + + abc_file_t*file = abc_file_new(); + abc_method_body_t*c = 0; + + abc_class_t*cls = abc_class_new2(file, scenename2, "flash.display::MovieClip"); + + TAG*abctag = swf_InsertTagBefore(swf, swf->firstTag, ST_DOABC); + + tag = swf_InsertTag(abctag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, 0); + swf_SetString(tag, scenename1); + + c = abc_class_getstaticconstructor(cls, 0)->body; + c->old.max_stack = 1; + c->old.local_count = 1; + c->old.init_scope_depth = 9; + c->old.max_scope_depth = 10; + + __ getlocal_0(c); + __ pushscope(c); + __ returnvoid(c); + + c = abc_class_getconstructor(cls, 0)->body; + c->old.max_stack = 3; + c->old.local_count = 1; + c->old.init_scope_depth = 10; + c->old.max_scope_depth = 11; + + debugfile(c, "constructor.as"); + + __ getlocal_0(c); + __ pushscope(c); + + __ getlocal_0(c); + __ constructsuper(c,0); + + __ getlex(c, "[package]flash.system::Security"); + __ pushstring(c, "*"); + __ callpropvoid(c, "[package]::allowDomain", 1); + + if(stop_each_frame || has_buttons) { + int frame = 0; + tag = swf->firstTag; + abc_method_body_t*f = 0; //frame script + while(tag && tag->id!=ST_END) { + char framename[80]; + char needs_framescript=0; + char buttonname[80]; + char functionname[80]; + sprintf(framename, "[packageinternal]rfx::frame%d_%s", frame, file_signature); + + if(!f && (tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2 || stop_each_frame)) { + /* make the contructor add a frame script */ + __ findpropstrict(c,"[package]::addFrameScript"); + __ pushuint(c,frame); + __ getlex(c,framename); + __ callpropvoid(c,"[package]::addFrameScript",2); + + f = abc_class_method(cls, 0, multiname_fromstring(framename))->body; + f->old.max_stack = 3; + f->old.local_count = 1; + f->old.init_scope_depth = 10; + f->old.max_scope_depth = 11; + __ debugfile(f, "framescript.as"); + __ debugline(f, 1); + __ getlocal_0(f); + __ pushscope(f); + if(stop_each_frame) { + __ findpropstrict(f, "[package]::stop"); + __ callpropvoid(f, "[package]::stop", 0); + } + } + + if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { + U16 id = swf_GetDefineID(tag); + sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); + __ getlex(f,buttonname); + __ getlex(f,"flash.events::MouseEvent"); + __ getproperty(f, "::CLICK"); + sprintf(functionname, "::clickbutton%d_%s", swf_GetDefineID(tag), file_signature); + __ getlex(f,functionname); + __ callpropvoid(f, "::addEventListener" ,2); + + needs_framescript = 1; + + abc_method_body_t*h = + abc_class_method(cls, 0, multiname_fromstring(functionname))->body; + list_append(h->method->parameters, multiname_fromstring("flash.events::MouseEvent")); + + h->old.max_stack = 6; + h->old.local_count = 2; + h->old.init_scope_depth = 10; + h->old.max_scope_depth = 11; + __ getlocal_0(h); + __ pushscope(h); + + ActionTAG*oldaction = swf_ButtonGetAction(tag); + if(oldaction && oldaction->op == ACTION__GOTOFRAME) { + int framenr = GET16(oldaction->data); + if(!events) { + __ findpropstrict(h,"[package]::gotoAndStop"); + __ pushuint(h,framenr+1); + __ callpropvoid(h,"[package]::gotoAndStop", 1); + } else { + char framename[80]; + sprintf(framename, "frame%d_%s", framenr, file_signature); + __ getlocal_0(h); //this + __ findpropstrict(h, "[package]flash.events::TextEvent"); + __ pushstring(h, "link"); + __ pushtrue(h); + __ pushtrue(h); + __ pushstring(h, framename); + __ constructprop(h,"[package]flash.events::TextEvent", 4); + __ callpropvoid(h,"[package]::dispatchEvent", 1); + } + } else if(oldaction && oldaction->op == ACTION__GETURL) { + if(!events) { + __ findpropstrict(h,"flash.net::navigateToURL"); + __ findpropstrict(h,"flash.net::URLRequest"); + // TODO: target _blank + __ pushstring(h,(char*)oldaction->data); //url + __ constructprop(h,"flash.net::URLRequest", 1); + __ callpropvoid(h,"flash.net::navigateToURL", 1); + } else { + __ getlocal_0(h); //this + __ findpropstrict(h, "[package]flash.events::TextEvent"); + __ pushstring(h, "link"); + __ pushtrue(h); + __ pushtrue(h); + __ pushstring(h,(char*)oldaction->data); //url + __ constructprop(h,"[package]flash.events::TextEvent", 4); + __ callpropvoid(h,"[package]::dispatchEvent", 1); + } + } else if(oldaction) { + fprintf(stderr, "Warning: Couldn't translate button code of button %d to flash 9 abc action\n", id); + } + __ returnvoid(h); + swf_ActionFree(oldaction); + } + if(tag->id == ST_SHOWFRAME) { + if(f) { + __ returnvoid(f); + f = 0; + } + frame++; + } + tag = tag->next; + } + if(f) { + __ returnvoid(f); + } + } + __ returnvoid(c); + + tag = swf->firstTag; + while(tag) { + if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { + char buttonname[80]; + sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); + multiname_t*s = multiname_fromstring(buttonname); + //abc_class_slot(cls, multiname_fromstring(buttonname), s); + abc_class_slot(cls, multiname_fromstring(buttonname), + multiname_fromstring("flash.display::SimpleButton")); + } + tag = tag->next; + } + + + abc_script_t*s = abc_initscript(file); + c = s->method->body; + c->old.max_stack = 2; + c->old.local_count = 1; + c->old.init_scope_depth = 1; + c->old.max_scope_depth = 9; + + __ getlocal_0(c); + __ pushscope(c); + __ getscopeobject(c, 0); + __ getlex(c,"::Object"); + __ pushscope(c); + __ getlex(c,"flash.events::EventDispatcher"); + __ pushscope(c); + __ getlex(c,"flash.display::DisplayObject"); + __ pushscope(c); + __ getlex(c,"flash.display::InteractiveObject"); + __ pushscope(c); + __ getlex(c,"flash.display::DisplayObjectContainer"); + __ pushscope(c); + __ getlex(c,"flash.display::Sprite"); + __ pushscope(c); + __ getlex(c,"flash.display::MovieClip"); + __ pushscope(c); + __ getlex(c,"flash.display::MovieClip"); + __ newclass(c,cls); + __ popscope(c); + __ popscope(c); + __ popscope(c); + __ popscope(c); + __ popscope(c); + __ popscope(c); + __ popscope(c); + __ initproperty(c,scenename2); + __ returnvoid(c); + + //abc_method_body_addClassTrait(c, "rfx:MainTimeline", 1, cls); + multiname_t*classname = multiname_fromstring(scenename2); + abc_initscript_addClassTrait(s, classname, cls); + multiname_destroy(classname); + + swf_WriteABC(abctag, file); +} + +TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname) +{ + tag = swf_InsertTag(tag, ST_DOABC); + abc_file_t*file = abc_file_new(); + + //abc_class_t*cls = abc_class_new2(file, fontname, "flash.display::MovieClip"); + //abc_class_slot(cls, multiname_fromstring(fontname), multiname_fromstring("flash.text::Font")); + + abc_class_t*cls = abc_class_new2(file, fontname, "flash.text::Font"); + + abc_script_t*s = abc_initscript(file); + code_t*c = s->method->body->code; + c = abc_getlocal_0(c); + c = abc_pushscope(c); + c = abc_getscopeobject(c, 0); + c = abc_getlex(c,"flash.text::Font"); + c = abc_pushscope(c); + c = abc_getlex(c,"flash.text::Font"); + c = abc_newclass(c,cls); + c = abc_popscope(c); + c = abc_initproperty(c, fontname); + c = abc_returnvoid(c); + s->method->body->code = c; + + abc_initscript_addClassTrait(s, multiname_fromstring(fontname), cls); + swf_WriteABC(tag, file); + + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, id); + swf_SetString(tag, fontname); + + return tag; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h new file mode 100644 index 000000000..ec2c4772c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h @@ -0,0 +1,30 @@ +/* scripts.h + + Some hardcoded abc scripts (header file) + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#ifdef __abc_scripts_h__ +#define __abc_scripts_h__ + +void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events); +TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/state.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/state.c new file mode 100644 index 000000000..aec9fcf20 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/state.c @@ -0,0 +1,95 @@ +#include "state.h" +#include "common.h" + +state_t* state = 0; + +void new_state() +{ + NEW(state_t, s); + state_t*oldstate = state; + if(state) + memcpy(s, state, sizeof(state_t)); //shallow copy + if(!s->imports) { + s->imports = dict_new(); + } + if(!s->import_toplevel_packages) { + s->import_toplevel_packages = dict_new(); + } + state = s; + state->level++; + state->has_own_imports = 0; + state->vars = dict_new(); + state->old = oldstate; + state->new_vars = 0; + + state->namespaces = dict_new(); + + if(oldstate) + state->active_namespace_urls = list_clone(oldstate->active_namespace_urls); +} + +void state_destroy(state_t*state) +{ + if(state->has_own_imports) { + list_free(state->wildcard_imports); + dict_destroy(state->imports);state->imports=0; + } + if(state->imports && (!state->old || state->old->imports!=state->imports)) { + dict_destroy(state->imports);state->imports=0; + } + if(state->vars) { + dict_destroy(state->vars);state->vars=0; + } + + list_free(state->active_namespace_urls) + state->active_namespace_urls = 0; + + free(state); +} + +void old_state() +{ + if(!state || !state->old) + syntaxerror("invalid nesting"); + state_t*leaving = state; + + state = state->old; + + if(as3_pass>1 && leaving->method && leaving->method != state->method && !leaving->method->inner) { + methodstate_destroy(leaving->method);leaving->method=0; + } + if(as3_pass>1 && leaving->cls && leaving->cls != state->cls) { + free(leaving->cls); + leaving->cls=0; + } + + state_destroy(leaving); +} + +methodstate_t*methodstate_new() +{ + NEW(methodstate_t,m); + m->allvars = dict_new(); + return m; +} + +void methodstate_destroy(methodstate_t*m) +{ + dict_destroy(m->unresolved_variables); m->unresolved_variables = 0; + list_free(m->innerfunctions);m->innerfunctions=0; + + if(m->allvars) { + DICT_ITERATE_DATA(m->allvars, void*, data) {free(data);} + m->allvars = 0; + } +} + +dict_t*definitions=0; +void as3_set_define(const char*c) +{ + if(!definitions) + definitions = dict_new(); + if(!dict_contains(definitions,c)) + dict_put(definitions,c,0); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/state.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/state.h new file mode 100644 index 000000000..b20b31e12 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/state.h @@ -0,0 +1,108 @@ +#ifndef __state_h__ +#define __state_h__ + +#include "../q.h" +#include "abc.h" +#include "registry.h" +#include "initcode.h" + +DECLARE(state); +DECLARE_LIST(state); +DECLARE(import); +DECLARE_LIST(import); +DECLARE(methodstate); +DECLARE_LIST(methodstate); +DECLARE(classstate); + +struct _state { + struct _state*old; + int level; + + char*package; + import_list_t*wildcard_imports; + dict_t*import_toplevel_packages; + dict_t*imports; + + dict_t*namespaces; + namespace_list_t*active_namespace_urls; + + char has_own_imports; + char new_vars; // e.g. transition between two functions + char xmlfilter; // are we inside a xmlobj..() filter? + + classstate_t*cls; + methodstate_t*method; + + char*exception_name; + + int switch_var; + + dict_t*vars; +}; + +extern state_t* state; + +struct _import { + char*package; +}; + +struct _classstate { + /* class data */ + classinfo_t*info; + abc_class_t*abc; + + methodstate_t*init; + methodstate_t*static_init; + //code_t*init; + //code_t*static_init; + parsedclass_t*dependencies; + + char has_constructor; +}; + +struct _methodstate { + /* method data */ + methodinfo_t*info; + char has_exceptions; + char late_binding; + char is_constructor; + char has_super; + char is_global; + char is_static; + int variable_count; + + dict_t*unresolved_variables; + dict_t*allvars; // all variables (in all sublevels, but not for inner functions) + + char inner; + char uses_parent_function; + char no_variable_scoping; + int uses_slots; + dict_t*slots; + int activation_var; + + int need_arguments; + + abc_method_t*abc; + int var_index; // for inner methods + int slot_index; // for inner methods + char is_a_slot; // for inner methods + + code_t*header; + + code_t*scope_code; + abc_exception_list_t*exceptions; + + methodstate_list_t*innerfunctions; +}; + +void new_state(); +void old_state(); + +methodstate_t*methodstate_new(); +void methodstate_destroy(methodstate_t*m); + +extern dict_t*definitions; +void as3_set_define(const char*c); + +#endif //__state_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h new file mode 100644 index 000000000..9a939ec8e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h @@ -0,0 +1,98 @@ +/* tokenizer.h + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __parser_h__ +#define __parser_h__ + +#include "../q.h" +#include "abc.h" +#include "pool.h" +#include "files.h" +#include "tokenizer.h" +#include "registry.h" +#include "code.h" +#include "opcodes.h" +#include "expr.h" + +DECLARE(token); +DECLARE_LIST(token); +DECLARE(param); +DECLARE_LIST(param); +DECLARE(params); +DECLARE(modifiers); +DECLARE(namespace_decl); +DECLARE_LIST(namespace_decl); +DECLARE_LIST(typedcode); + +struct _param { + char*name; + classinfo_t*type; + constant_t*value; +}; + +struct _params { + param_list_t*list; + char varargs; +}; + +struct _modifiers { + int flags; + char*ns; +}; +struct _namespace_decl { + const char*name; + const char*url; +}; + +/* small helper structs: */ +typedef struct _codeandnumber { + code_t*cc; + int number; +} codeandnumber_t; +typedef struct _for_start { + char*name; + char each; +} for_start_t; +typedef struct _regexp { + char*pattern; + char*options; +} regexp_t; + +extern char start_of_expression; + +typedef token_t*tokenptr_t; + +#include "parser.tab.h" + +extern char*token2string(enum yytokentype nr, YYSTYPE v); +extern unsigned int as3_tokencount; + +void as3_buffer_input(void*buffer, int len); +void as3_file_input(FILE*fi); + +void tokenizer_begin_xml(); +void tokenizer_begin_xmltext(); +void tokenizer_end_xmltext(); +void tokenizer_end_xml(); + +#define T_EOF 0 + +extern int avm2_lex(); +extern int avm2_lex_destroy(); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c new file mode 100644 index 000000000..a0850df09 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c @@ -0,0 +1,4232 @@ +#line 2 "tokenizer.yy.c" + +#line 4 "tokenizer.yy.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define yy_create_buffer as3__create_buffer +#define yy_delete_buffer as3__delete_buffer +#define yy_flex_debug as3__flex_debug +#define yy_init_buffer as3__init_buffer +#define yy_flush_buffer as3__flush_buffer +#define yy_load_buffer_state as3__load_buffer_state +#define yy_switch_to_buffer as3__switch_to_buffer +#define yyin as3_in +#define yyleng as3_leng +#define yylex as3_lex +#define yylineno as3_lineno +#define yyout as3_out +#define yyrestart as3_restart +#define yytext as3_text +#define yywrap as3_wrap +#define yyalloc as3_alloc +#define yyrealloc as3_realloc +#define yyfree as3_free + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE as3_restart(as3_in ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern yy_size_t as3_leng; + +extern FILE *as3_in, *as3_out; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up as3_text. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up as3_text again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + yy_size_t yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via as3_restart()), so that the user can continue scanning by + * just pointing as3_in at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when as3_text is formed. */ +static char yy_hold_char; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t as3_leng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow as3_wrap()'s to do buffer switches + * instead of setting up a fresh as3_in. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void as3_restart (FILE *input_file ); +void as3__switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE as3__create_buffer (FILE *file,int size ); +void as3__delete_buffer (YY_BUFFER_STATE b ); +void as3__flush_buffer (YY_BUFFER_STATE b ); +void as3_push_buffer_state (YY_BUFFER_STATE new_buffer ); +void as3_pop_buffer_state (void ); + +static void as3_ensure_buffer_stack (void ); +static void as3__load_buffer_state (void ); +static void as3__init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER as3__flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE as3__scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE as3__scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE as3__scan_bytes (yyconst char *bytes,yy_size_t len ); + +void *as3_alloc (yy_size_t ); +void *as3_realloc (void *,yy_size_t ); +void as3_free (void * ); + +#define yy_new_buffer as3__create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + as3_ensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + as3__create_buffer(as3_in,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + as3_ensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + as3__create_buffer(as3_in,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *as3_in = (FILE *) 0, *as3_out = (FILE *) 0; + +typedef int yy_state_type; + +extern int as3_lineno; + +int as3_lineno = 1; + +extern char *as3_text; +#define yytext_ptr as3_text + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up as3_text. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + as3_leng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 130 +#define YY_END_OF_BUFFER 131 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[705] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 131, 130, 31, 127, 130, 127, 127, 127, + 130, 127, 128, 126, 127, 127, 73, 127, 130, 130, + 130, 75, 127, 127, 127, 125, 125, 126, 127, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 29, 127, 126, 31, + 130, 130, 125, 129, 31, 127, 129, 127, 127, 127, + 129, 127, 128, 126, 127, 127, 73, 127, 129, 129, + 129, 75, 127, 127, 127, 125, 125, 126, 127, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + + 125, 125, 125, 125, 125, 125, 28, 127, 126, 31, + 129, 129, 125, 29, 127, 127, 73, 127, 129, 129, + 129, 17, 17, 19, 20, 18, 16, 16, 129, 12, + 15, 11, 14, 13, 10, 15, 15, 49, 0, 6, + 0, 125, 0, 0, 61, 47, 64, 0, 0, 62, + 56, 57, 55, 59, 72, 0, 3, 0, 60, 34, + 34, 0, 0, 0, 0, 74, 0, 68, 54, 52, + 53, 70, 0, 125, 0, 125, 125, 125, 58, 125, + 124, 125, 125, 125, 125, 125, 44, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 123, 125, 122, 121, + + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 63, 48, 125, 31, 0, 122, 0, 0, 0, + 0, 0, 3, 23, 60, 0, 26, 26, 0, 0, + 0, 0, 17, 0, 0, 9, 15, 0, 15, 50, + 125, 0, 71, 35, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 66, 51, 65, 69, + 0, 0, 0, 0, 0, 0, 0, 125, 36, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 43, 125, 117, 125, 125, 125, 125, + + 125, 116, 125, 125, 125, 125, 125, 125, 125, 118, + 125, 125, 125, 125, 125, 120, 125, 125, 115, 119, + 125, 125, 125, 30, 125, 0, 26, 26, 0, 0, + 27, 23, 0, 0, 0, 23, 0, 23, 23, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 2, 0, 33, 0, 32, 32, 0, 0, 67, 0, + 0, 0, 0, 125, 125, 113, 125, 125, 125, 125, + 125, 125, 125, 108, 112, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 111, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 110, 125, 125, 109, + + 125, 114, 125, 27, 0, 0, 0, 0, 23, 0, + 23, 0, 0, 2, 0, 23, 23, 25, 0, 24, + 24, 0, 0, 0, 0, 2, 37, 0, 39, 0, + 0, 0, 125, 106, 103, 101, 102, 125, 125, 125, + 125, 125, 105, 104, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 125, 107, 125, + 100, 125, 125, 45, 125, 25, 0, 24, 24, 0, + 0, 2, 0, 23, 23, 0, 0, 0, 0, 0, + 0, 38, 0, 0, 125, 125, 125, 93, 125, 125, + 125, 125, 125, 98, 125, 125, 125, 125, 96, 125, + + 125, 125, 125, 95, 94, 97, 46, 99, 125, 125, + 23, 0, 0, 0, 0, 0, 0, 125, 125, 88, + 91, 92, 87, 125, 125, 125, 125, 125, 125, 125, + 89, 90, 125, 125, 125, 23, 8, 21, 0, 0, + 0, 40, 125, 83, 0, 125, 125, 86, 125, 125, + 125, 85, 125, 84, 125, 125, 0, 125, 125, 0, + 0, 41, 82, 0, 125, 125, 125, 125, 78, 80, + 79, 81, 0, 0, 0, 0, 0, 125, 125, 125, + 0, 0, 0, 0, 125, 77, 76, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 125, 0, 125, 125, 125, 0, + 0, 0, 42, 42, 0, 0, 0, 4, 0, 0, + 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 125, 125, 125, 125, 0, 7, 0, 0, + 0, 39, 5, 39, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 125, 22, 0, 7, + 0, 38, 5, 38, 38, 0, 0, 0, 5, 0, + 22, 0, 0, 0, 0, 40, 5, 40, 40, 41, + + 5, 41, 41, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 13, 17, 18, 19, 20, 21, 21, + 22, 21, 21, 21, 21, 21, 21, 23, 13, 24, + 25, 26, 13, 13, 27, 28, 29, 30, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 31, 28, 28, + 28, 28, 28, 32, 28, 28, 28, 28, 28, 28, + 33, 34, 35, 36, 37, 8, 38, 39, 40, 41, + + 42, 43, 44, 45, 46, 28, 47, 48, 49, 50, + 51, 52, 28, 53, 54, 55, 56, 57, 58, 59, + 60, 28, 61, 62, 63, 13, 8, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 64, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 65, 37, 37, 37, + 66, 37, 37, 67, 37, 37, 37, 37, 37, 37, + + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 68, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37 + } ; + +static yyconst flex_int32_t yy_meta[69] = + { 0, + 1, 2, 3, 2, 2, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 5, 4, 6, + 6, 6, 7, 8, 4, 8, 9, 9, 9, 9, + 9, 9, 4, 10, 4, 4, 11, 9, 9, 9, + 9, 12, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 13, 9, + 8, 4, 4, 11, 11, 11, 11, 11 + } ; + +static yyconst flex_int16_t yy_base[749] = + { 0, + 0, 1980, 68, 1979, 1963, 91, 122, 129, 150, 153, + 214, 0, 2022, 3900, 3900, 1996, 147, 90, 1995, 144, + 148, 3900, 3900, 1993, 143, 145, 143, 169, 265, 270, + 275, 1994, 161, 1990, 146, 296, 300, 3900, 1944, 328, + 138, 149, 153, 268, 299, 156, 293, 316, 256, 303, + 272, 320, 326, 334, 345, 348, 3900, 286, 3900, 286, + 1903, 1896, 354, 3900, 3900, 1931, 159, 298, 1903, 283, + 356, 3900, 3900, 1896, 393, 399, 405, 413, 413, 419, + 424, 1887, 424, 1878, 380, 397, 405, 3900, 1875, 0, + 399, 416, 420, 437, 441, 446, 455, 464, 403, 469, + + 459, 473, 479, 484, 492, 495, 3900, 360, 3900, 428, + 1818, 1814, 501, 3900, 164, 451, 538, 538, 146, 1811, + 0, 0, 0, 1827, 3900, 3900, 3900, 3900, 1806, 3900, + 1753, 3900, 3900, 3900, 3900, 1717, 297, 1712, 429, 3900, + 1659, 0, 544, 547, 3900, 3900, 3900, 477, 1646, 3900, + 3900, 3900, 3900, 3900, 1618, 550, 572, 532, 3900, 3900, + 562, 1542, 568, 1572, 1526, 3900, 1510, 1502, 3900, 1455, + 3900, 536, 591, 526, 595, 532, 549, 570, 3900, 562, + 556, 565, 567, 573, 575, 587, 578, 589, 593, 591, + 597, 612, 614, 603, 619, 621, 617, 625, 627, 630, + + 636, 634, 645, 652, 655, 650, 658, 660, 663, 669, + 667, 678, 672, 674, 683, 688, 691, 685, 694, 697, + 699, 3900, 3900, 702, 3900, 1411, 706, 742, 747, 752, + 755, 629, 780, 812, 752, 759, 3900, 770, 1388, 780, + 1421, 179, 0, 486, 1409, 3900, 1388, 0, 1381, 3900, + 0, 783, 3900, 3900, 806, 821, 872, 1377, 754, 3900, + 806, 857, 899, 962, 1370, 1325, 3900, 3900, 3900, 1311, + 1244, 987, 1209, 1206, 1138, 1144, 1104, 726, 734, 776, + 780, 793, 840, 766, 828, 946, 842, 955, 844, 952, + 959, 784, 964, 832, 967, 929, 978, 961, 980, 985, + + 950, 957, 989, 982, 993, 995, 1002, 1005, 1007, 1011, + 1013, 1020, 1016, 1024, 1030, 1026, 1034, 1039, 1032, 1036, + 1041, 1043, 1053, 3900, 1051, 1080, 3900, 1088, 1091, 1142, + 3900, 0, 1113, 1122, 1142, 1123, 1147, 0, 1163, 1098, + 1113, 1223, 1286, 1114, 1112, 1092, 0, 495, 1168, 1312, + 1084, 1322, 3900, 0, 3900, 0, 997, 1014, 3900, 0, + 966, 890, 887, 1105, 1120, 1085, 1132, 1099, 1110, 1134, + 1264, 1145, 1279, 1125, 1253, 1285, 1292, 1302, 1289, 1298, + 1276, 1315, 1304, 1306, 1308, 1310, 1313, 1332, 1334, 1329, + 1327, 1321, 1338, 1323, 1349, 1340, 1325, 1346, 1352, 1354, + + 1359, 1356, 1361, 3900, 1398, 1401, 1443, 1506, 0, 1525, + 1569, 1532, 1559, 873, 1629, 1663, 0, 3900, 0, 3900, + 0, 873, 871, 815, 1423, 3900, 3900, 804, 3900, 0, + 758, 750, 1484, 1375, 1377, 1379, 1381, 1495, 1502, 1504, + 1529, 1511, 1383, 1532, 1535, 1538, 1549, 1584, 1592, 1587, + 1552, 1597, 1603, 1599, 1692, 1694, 1605, 1696, 1500, 1688, + 1523, 1700, 1698, 1607, 1714, 3900, 0, 3900, 0, 1755, + 1760, 0, 1780, 0, 0, 779, 318, 768, 374, 739, + 717, 3900, 670, 660, 1685, 1724, 1718, 1712, 1747, 1732, + 1737, 1751, 1754, 1739, 1758, 1765, 1768, 1771, 1762, 1776, + + 1778, 1781, 1773, 1783, 1785, 1787, 1789, 1791, 1796, 1805, + 681, 467, 1110, 654, 627, 592, 0, 1798, 1812, 1858, + 1802, 1814, 1816, 1821, 1823, 1830, 1838, 1832, 1841, 1845, + 1835, 1843, 1848, 1851, 1904, 598, 3900, 3900, 578, 544, + 0, 3900, 1860, 1862, 1915, 1870, 1873, 1877, 1879, 1888, + 1893, 1890, 1898, 1895, 1909, 1912, 1973, 2040, 1906, 519, + 512, 3900, 1901, 493, 1934, 1936, 1919, 1938, 1940, 1944, + 1946, 1948, 2107, 627, 2112, 2123, 2116, 2189, 457, 0, + 481, 451, 430, 381, 1955, 1951, 1953, 2256, 2260, 2264, + 2268, 2272, 1977, 2276, 409, 1776, 2280, 2285, 2299, 2291, + + 2304, 2371, 2357, 2375, 2382, 2386, 2390, 2404, 2399, 2456, + 2471, 2477, 2482, 2486, 0, 2493, 0, 346, 2560, 354, + 342, 1149, 3900, 1959, 285, 2627, 2631, 2635, 254, 312, + 1952, 2639, 2643, 2647, 2651, 2655, 2667, 225, 2734, 2659, + 2725, 2759, 2770, 2776, 2813, 2782, 2805, 2849, 2827, 2853, + 220, 2860, 0, 0, 0, 144, 1734, 3900, 1822, 137, + 2871, 2884, 2893, 2897, 2901, 2968, 2941, 2950, 3007, 3016, + 3031, 3038, 3023, 3050, 3074, 3044, 0, 3900, 1910, 143, + 1984, 3056, 3089, 3122, 3126, 3130, 3140, 2122, 3144, 3157, + 138, 1988, 3164, 3231, 3294, 3196, 3210, 3214, 3267, 3280, + + 3284, 3319, 3333, 3900, 3400, 3413, 3418, 3431, 3444, 3456, + 3464, 3477, 3490, 3503, 3516, 3524, 3532, 3545, 3557, 3570, + 3579, 3592, 3605, 3617, 3626, 3634, 3647, 3660, 3668, 3673, + 3686, 3699, 3712, 3720, 3733, 3746, 3759, 3767, 3775, 3783, + 3796, 3808, 3821, 3834, 3847, 3860, 3873, 3886 + } ; + +static yyconst flex_int16_t yy_def[749] = + { 0, + 704, 1, 704, 3, 3, 3, 3, 3, 705, 705, + 704, 11, 704, 704, 704, 704, 706, 707, 704, 704, + 708, 704, 704, 704, 704, 704, 704, 704, 709, 709, + 709, 704, 704, 704, 704, 710, 710, 704, 704, 710, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 704, 704, 704, 40, + 711, 711, 40, 704, 704, 704, 706, 707, 704, 704, + 708, 704, 704, 704, 704, 704, 704, 712, 713, 713, + 713, 704, 704, 704, 704, 40, 40, 704, 704, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 40, 40, 40, 704, 704, 704, 40, + 711, 711, 40, 704, 704, 704, 704, 704, 31, 31, + 31, 714, 714, 704, 704, 704, 704, 704, 715, 704, + 716, 704, 704, 704, 704, 716, 716, 704, 706, 704, + 706, 717, 707, 707, 704, 704, 704, 708, 708, 704, + 704, 704, 704, 704, 704, 718, 719, 720, 704, 704, + 718, 31, 704, 721, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 40, 704, 40, 40, 40, 704, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 704, 704, 40, 704, 711, 40, 704, 722, 722, + 723, 712, 724, 720, 712, 712, 704, 723, 81, 704, + 725, 704, 714, 704, 715, 704, 716, 726, 716, 704, + 717, 707, 704, 704, 719, 719, 727, 704, 720, 704, + 718, 718, 704, 721, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 704, 40, 728, 704, 728, 704, 729, + 704, 730, 724, 724, 731, 730, 724, 234, 712, 723, + 723, 704, 725, 704, 704, 704, 726, 732, 719, 727, + 704, 719, 704, 263, 704, 263, 704, 704, 704, 733, + 704, 704, 704, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 704, 728, 728, 704, 729, 730, 734, + 719, 724, 731, 730, 724, 704, 339, 704, 342, 704, + 342, 735, 736, 704, 719, 704, 704, 704, 704, 737, + 704, 704, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 704, 407, 704, 407, 724, + 724, 730, 724, 411, 416, 735, 735, 736, 736, 704, + 704, 704, 704, 704, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 339, 735, 736, 704, 704, 704, 738, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 411, 704, 704, 704, 704, + 739, 704, 40, 40, 704, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 740, 704, 40, 704, + 741, 704, 40, 704, 40, 40, 40, 40, 40, 40, + 40, 40, 742, 743, 744, 742, 742, 704, 578, 558, + 745, 741, 741, 704, 40, 40, 40, 704, 704, 742, + 742, 742, 743, 704, 743, 746, 746, 744, 744, 742, + + 744, 744, 704, 704, 742, 742, 742, 742, 742, 742, + 747, 704, 704, 742, 578, 742, 578, 578, 704, 745, + 745, 741, 704, 40, 704, 742, 704, 704, 704, 746, + 746, 704, 704, 742, 742, 746, 744, 704, 742, 742, + 742, 742, 742, 740, 740, 742, 748, 744, 742, 742, + 704, 742, 578, 578, 619, 578, 745, 704, 741, 704, + 742, 704, 704, 742, 742, 639, 742, 742, 742, 743, + 748, 748, 748, 748, 747, 742, 619, 704, 745, 741, + 741, 704, 704, 742, 742, 742, 742, 743, 743, 748, + 745, 745, 742, 639, 639, 704, 704, 742, 742, 704, + + 704, 742, 742, 0, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704 + } ; + +static yyconst flex_int16_t yy_nxt[3969] = + { 0, + 14, 15, 15, 15, 15, 16, 17, 14, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, + 37, 36, 22, 14, 38, 39, 36, 40, 41, 42, + 43, 44, 45, 46, 36, 47, 36, 36, 36, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 36, 36, + 57, 58, 59, 60, 36, 36, 61, 62, 64, 65, + 15, 65, 65, 66, 67, 64, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 86, 86, 86, 87, 86, + + 72, 64, 88, 89, 86, 90, 91, 92, 93, 94, + 95, 96, 86, 97, 86, 86, 86, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 86, 86, 107, 108, + 109, 110, 86, 86, 111, 112, 113, 115, 116, 117, + 118, 119, 120, 121, 115, 116, 117, 118, 119, 120, + 121, 114, 123, 140, 146, 123, 143, 144, 151, 140, + 155, 153, 156, 156, 156, 140, 167, 152, 147, 154, + 171, 172, 621, 124, 113, 125, 124, 583, 125, 151, + 141, 149, 114, 157, 168, 169, 183, 158, 152, 114, + 182, 174, 141, 159, 186, 344, 184, 196, 704, 185, + + 632, 174, 174, 187, 164, 174, 174, 677, 174, 174, + 126, 266, 188, 126, 64, 127, 128, 127, 127, 64, + 129, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 130, 131, 131, 131, 64, 132, 133, 134, + 131, 131, 131, 131, 131, 131, 64, 64, 64, 64, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 135, 64, 64, 136, 131, 131, + 137, 131, 161, 612, 162, 162, 162, 161, 603, 162, + 162, 162, 161, 146, 162, 162, 162, 173, 173, 173, + + 173, 173, 173, 173, 173, 189, 163, 147, 174, 174, + 222, 163, 204, 208, 596, 190, 163, 627, 175, 248, + 174, 174, 175, 164, 174, 174, 191, 165, 704, 173, + 173, 173, 173, 704, 512, 197, 192, 178, 174, 174, + 205, 198, 199, 704, 193, 174, 200, 223, 588, 194, + 175, 174, 174, 201, 195, 206, 174, 202, 207, 176, + 249, 209, 177, 176, 143, 144, 177, 140, 174, 174, + 213, 203, 174, 174, 210, 211, 657, 212, 214, 174, + 180, 181, 218, 216, 222, 215, 174, 217, 621, 149, + 513, 176, 220, 221, 177, 219, 197, 174, 174, 704, + + 174, 174, 198, 227, 171, 172, 174, 200, 151, 653, + 228, 593, 229, 230, 230, 153, 228, 152, 229, 230, + 230, 223, 155, 154, 231, 231, 231, 233, 623, 242, + 238, 234, 239, 239, 239, 140, 238, 235, 239, 239, + 239, 238, 178, 239, 239, 239, 236, 168, 169, 174, + 174, 182, 174, 183, 240, 174, 174, 174, 174, 204, + 240, 186, 141, 184, 622, 240, 185, 153, 174, 174, + 187, 241, 174, 174, 189, 154, 165, 704, 192, 188, + 174, 174, 704, 512, 190, 583, 193, 196, 140, 174, + 174, 194, 537, 174, 174, 191, 195, 197, 174, 174, + + 208, 201, 345, 198, 199, 202, 205, 174, 200, 425, + 149, 174, 174, 426, 209, 621, 174, 174, 346, 203, + 619, 206, 174, 213, 207, 174, 174, 210, 211, 218, + 212, 214, 174, 216, 260, 260, 174, 217, 215, 220, + 221, 584, 219, 197, 174, 174, 583, 174, 174, 198, + 227, 581, 157, 174, 200, 155, 158, 156, 156, 156, + 269, 270, 159, 142, 142, 142, 142, 142, 142, 156, + 156, 156, 255, 255, 255, 255, 561, 142, 174, 174, + 142, 261, 261, 261, 174, 174, 257, 262, 262, 262, + 258, 163, 173, 173, 173, 173, 272, 272, 272, 272, + + 279, 174, 174, 163, 560, 280, 281, 704, 174, 174, + 284, 252, 278, 175, 174, 174, 258, 174, 174, 174, + 282, 283, 174, 174, 285, 174, 174, 174, 174, 286, + 174, 174, 289, 594, 287, 273, 541, 274, 288, 174, + 174, 174, 174, 174, 290, 174, 174, 332, 275, 174, + 174, 291, 276, 540, 173, 294, 174, 271, 272, 292, + 595, 277, 236, 293, 174, 174, 174, 174, 295, 174, + 174, 174, 174, 174, 174, 296, 297, 174, 174, 174, + 298, 299, 174, 174, 300, 539, 174, 174, 174, 174, + 301, 302, 303, 304, 305, 306, 308, 174, 174, 536, + + 307, 517, 174, 174, 174, 174, 311, 174, 174, 516, + 174, 174, 174, 174, 309, 174, 174, 310, 312, 174, + 174, 174, 174, 313, 314, 174, 174, 174, 318, 315, + 174, 174, 319, 316, 317, 174, 174, 320, 174, 321, + 174, 174, 322, 174, 174, 325, 174, 174, 515, 174, + 174, 174, 174, 323, 174, 174, 260, 260, 174, 298, + 299, 326, 326, 326, 328, 514, 230, 230, 230, 328, + 332, 230, 230, 230, 231, 231, 231, 339, 174, 174, + 333, 333, 255, 333, 479, 236, 174, 174, 329, 340, + 340, 340, 236, 329, 335, 477, 240, 484, 336, 341, + + 341, 341, 142, 142, 142, 330, 255, 255, 255, 255, + 704, 240, 483, 337, 260, 260, 142, 365, 174, 368, + 348, 255, 255, 255, 255, 261, 261, 261, 174, 174, + 481, 364, 174, 174, 366, 348, 174, 377, 338, 338, + 338, 338, 338, 338, 480, 174, 174, 163, 704, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 349, 349, 349, 349, 262, 262, 262, 367, + 174, 369, 370, 372, 174, 174, 350, 479, 374, 477, + 351, 352, 174, 174, 174, 174, 174, 174, 704, 353, + + 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, 354, 354, + 354, 353, 353, 353, 353, 354, 354, 354, 354, 354, + 354, 353, 432, 353, 353, 431, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 353, + 353, 353, 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, 355, 356, + 355, 174, 174, 371, 355, 355, 355, 355, 272, 272, + 272, 272, 373, 375, 355, 385, 355, 355, 174, 174, + + 376, 378, 174, 174, 174, 174, 379, 174, 174, 174, + 174, 174, 174, 174, 174, 382, 174, 174, 430, 174, + 174, 383, 355, 355, 355, 380, 384, 273, 381, 274, + 174, 174, 174, 174, 387, 174, 386, 174, 174, 388, + 275, 174, 174, 428, 276, 174, 174, 174, 174, 427, + 272, 389, 391, 277, 174, 174, 390, 174, 174, 174, + 174, 394, 392, 174, 174, 174, 174, 393, 174, 174, + 395, 397, 174, 174, 396, 398, 174, 174, 174, 174, + 399, 400, 174, 174, 174, 174, 174, 174, 174, 174, + 401, 174, 174, 174, 174, 174, 174, 402, 403, 326, + + 326, 326, 352, 174, 174, 174, 174, 405, 405, 405, + 406, 406, 406, 333, 333, 255, 333, 340, 340, 340, + 424, 329, 333, 333, 255, 333, 513, 410, 423, 329, + 422, 411, 341, 341, 341, 538, 410, 174, 174, 240, + 411, 352, 412, 412, 349, 412, 337, 333, 333, 255, + 333, 174, 436, 433, 704, 337, 413, 174, 174, 407, + 414, 410, 174, 174, 437, 416, 434, 272, 255, 255, + 255, 255, 174, 174, 658, 415, 435, 174, 174, 438, + 337, 332, 348, 659, 174, 174, 174, 174, 363, 417, + 417, 417, 417, 417, 417, 362, 236, 174, 174, 440, + + 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, + 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, + 417, 417, 417, 418, 418, 418, 418, 418, 418, 418, + 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, + 418, 418, 419, 419, 419, 418, 418, 418, 418, 419, + 419, 419, 419, 419, 419, 418, 361, 418, 418, 360, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, + 419, 419, 419, 418, 418, 418, 420, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, + + 420, 420, 420, 421, 420, 174, 174, 173, 420, 420, + 420, 420, 349, 349, 349, 349, 174, 174, 420, 439, + 420, 420, 255, 255, 255, 255, 350, 441, 447, 174, + 351, 174, 174, 443, 442, 359, 348, 174, 174, 446, + 258, 174, 174, 445, 174, 174, 420, 420, 420, 444, + 174, 174, 448, 358, 174, 174, 449, 174, 174, 450, + 174, 174, 174, 174, 451, 452, 174, 174, 174, 453, + 455, 454, 456, 457, 174, 459, 174, 174, 174, 174, + 174, 174, 174, 458, 174, 174, 174, 174, 460, 357, + 174, 174, 174, 174, 463, 352, 462, 461, 174, 174, + + 464, 174, 174, 248, 174, 174, 174, 174, 174, 174, + 248, 174, 174, 174, 174, 246, 465, 405, 405, 405, + 406, 406, 406, 255, 255, 255, 255, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 348, 342, 329, + 704, 351, 704, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 467, 467, 467, 466, 466, 466, 466, 467, + 467, 467, 467, 467, 467, 466, 324, 466, 466, 268, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, + + 467, 467, 467, 466, 466, 466, 468, 468, 468, 468, + 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, + 468, 468, 468, 469, 468, 485, 267, 352, 468, 468, + 468, 468, 333, 333, 255, 333, 174, 174, 468, 471, + 468, 468, 266, 472, 486, 488, 410, 174, 174, 487, + 411, 490, 174, 174, 174, 174, 174, 174, 473, 412, + 412, 349, 412, 174, 174, 337, 468, 468, 468, 255, + 255, 255, 255, 413, 489, 174, 174, 414, 265, 491, + 492, 174, 174, 348, 174, 174, 493, 174, 174, 263, + 174, 174, 415, 499, 704, 474, 474, 474, 474, 474, + + 474, 174, 174, 494, 174, 174, 474, 474, 474, 474, + 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, + 474, 474, 474, 474, 474, 474, 474, 474, 474, 333, + 333, 255, 333, 495, 496, 253, 174, 174, 498, 174, + 174, 497, 500, 410, 174, 174, 501, 416, 148, 174, + 174, 174, 174, 502, 505, 174, 174, 174, 174, 174, + 174, 139, 337, 333, 333, 255, 333, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 410, 334, 334, + 334, 411, 334, 334, 334, 334, 334, 334, 334, 475, + 475, 475, 475, 475, 475, 334, 337, 334, 334, 334, + + 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, + 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, + 475, 475, 475, 334, 334, 334, 334, 334, 334, 334, + 334, 503, 507, 504, 518, 506, 250, 174, 174, 248, + 174, 174, 508, 509, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 510, 333, 333, 255, 333, 678, + 333, 333, 255, 333, 174, 174, 174, 174, 679, 410, + 174, 174, 520, 336, 410, 248, 174, 174, 414, 519, + 333, 333, 255, 333, 174, 522, 521, 594, 337, 174, + 174, 174, 174, 337, 410, 525, 523, 526, 511, 174, + + 174, 524, 527, 174, 174, 528, 174, 174, 529, 630, + 174, 174, 246, 337, 174, 174, 530, 174, 174, 531, + 174, 174, 532, 174, 174, 174, 174, 533, 174, 174, + 174, 174, 244, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 534, 535, 680, 174, 174, + 174, 174, 543, 544, 174, 174, 681, 174, 174, 545, + 545, 545, 545, 704, 174, 174, 174, 174, 174, 174, + 548, 550, 549, 174, 174, 174, 174, 551, 226, 552, + 553, 225, 174, 174, 174, 174, 554, 174, 174, 555, + 174, 174, 556, 174, 174, 174, 174, 174, 174, 179, + + 174, 174, 170, 174, 174, 557, 557, 557, 557, 166, + 174, 174, 174, 563, 174, 174, 173, 173, 173, 173, + 150, 546, 174, 174, 547, 174, 174, 145, 565, 174, + 174, 174, 174, 567, 569, 691, 566, 175, 568, 570, + 174, 174, 174, 174, 692, 174, 174, 174, 174, 571, + 174, 174, 572, 174, 174, 138, 174, 174, 174, 174, + 226, 174, 174, 594, 174, 174, 225, 558, 179, 580, + 559, 174, 586, 564, 557, 557, 557, 557, 173, 574, + 587, 271, 585, 594, 575, 630, 174, 174, 174, 174, + 174, 174, 174, 174, 565, 576, 174, 174, 174, 174, + + 174, 174, 624, 174, 174, 174, 174, 174, 174, 680, + 595, 174, 174, 691, 170, 597, 166, 150, 622, 145, + 138, 704, 657, 114, 113, 63, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 557, 704, 704, 577, + 573, 557, 557, 557, 557, 573, 574, 573, 573, 573, + 573, 575, 573, 573, 573, 573, 573, 573, 573, 578, + 578, 578, 576, 573, 573, 573, 578, 578, 578, 578, + 578, 578, 573, 578, 573, 573, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + + 573, 573, 573, 558, 578, 578, 579, 578, 588, 589, + 588, 590, 596, 597, 589, 597, 598, 588, 589, 588, + 590, 704, 704, 600, 603, 604, 603, 605, 594, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 601, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 595, 704, 704, 704, 704, + 704, 704, 704, 606, 704, 607, 704, 704, 704, 704, + 590, 704, 704, 592, 704, 598, 608, 704, 602, 611, + 609, 704, 592, 704, 704, 670, 605, 704, 704, 610, + 612, 613, 612, 614, 591, 591, 591, 591, 591, 591, + + 591, 591, 591, 591, 591, 591, 591, 591, 615, 615, + 615, 616, 591, 591, 591, 615, 615, 615, 615, 615, + 615, 591, 615, 591, 591, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 615, 615, 615, 591, + 591, 591, 617, 615, 615, 618, 615, 588, 589, 588, + 588, 588, 589, 588, 588, 588, 589, 588, 590, 588, + 589, 588, 590, 588, 589, 588, 590, 627, 628, 627, + 627, 597, 589, 597, 597, 596, 597, 589, 597, 598, + 704, 594, 632, 633, 632, 634, 600, 704, 704, 596, + + 597, 589, 597, 598, 596, 597, 636, 597, 598, 704, + 600, 704, 704, 630, 704, 704, 704, 704, 601, 588, + 704, 704, 625, 588, 704, 704, 625, 590, 704, 704, + 592, 590, 601, 704, 592, 626, 704, 704, 592, 627, + 704, 704, 629, 597, 704, 704, 631, 704, 598, 704, + 704, 602, 704, 704, 634, 704, 704, 635, 603, 604, + 603, 603, 598, 704, 704, 602, 704, 598, 704, 704, + 602, 596, 597, 589, 597, 598, 603, 604, 603, 603, + 704, 704, 600, 603, 604, 603, 605, 588, 589, 588, + 590, 588, 589, 588, 590, 704, 704, 273, 704, 274, + + 588, 589, 588, 590, 601, 588, 589, 588, 590, 704, + 275, 704, 704, 704, 276, 273, 704, 274, 704, 704, + 603, 704, 606, 638, 607, 704, 704, 704, 275, 704, + 704, 704, 276, 704, 637, 608, 639, 602, 603, 609, + 640, 638, 704, 642, 704, 605, 704, 704, 610, 590, + 704, 704, 592, 590, 704, 704, 592, 588, 589, 588, + 590, 641, 590, 704, 704, 592, 704, 590, 704, 704, + 592, 573, 644, 645, 644, 611, 704, 647, 612, 613, + 612, 612, 648, 612, 613, 612, 612, 612, 613, 612, + 614, 704, 704, 649, 603, 604, 603, 605, 704, 175, + + 704, 704, 704, 704, 175, 704, 704, 704, 616, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 643, + 704, 704, 592, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 606, 611, 607, 704, 650, 704, 704, + 612, 704, 704, 651, 704, 612, 608, 704, 651, 614, + 609, 704, 652, 704, 704, 704, 605, 704, 704, 610, + 573, 644, 645, 644, 611, 646, 647, 646, 646, 646, + 646, 648, 646, 646, 646, 646, 646, 646, 646, 654, + 654, 654, 649, 646, 646, 646, 654, 654, 654, 654, + 654, 654, 646, 654, 646, 646, 654, 654, 654, 654, + + 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, + 646, 646, 646, 655, 654, 654, 656, 654, 588, 589, + 588, 590, 627, 628, 627, 627, 627, 628, 627, 627, + 632, 633, 632, 632, 632, 633, 632, 632, 632, 633, + 632, 634, 588, 589, 588, 590, 597, 589, 597, 597, + 588, 589, 588, 590, 704, 704, 594, 596, 597, 589, + 597, 598, 704, 704, 704, 704, 704, 704, 600, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 630, 704, + 590, 704, 704, 592, 627, 704, 704, 629, 627, 704, + + 601, 629, 632, 704, 704, 660, 632, 704, 704, 660, + 634, 666, 704, 635, 661, 704, 704, 592, 597, 704, + 704, 631, 590, 704, 704, 592, 588, 589, 588, 590, + 598, 704, 704, 602, 429, 662, 663, 662, 664, 665, + 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, + 665, 665, 665, 704, 704, 704, 665, 665, 665, 665, + 588, 589, 588, 590, 704, 704, 665, 704, 665, 665, + 667, 603, 604, 603, 605, 704, 704, 644, 645, 644, + 644, 704, 574, 588, 589, 588, 590, 575, 590, 704, + 704, 592, 704, 704, 665, 665, 665, 590, 576, 704, + + 592, 704, 704, 704, 668, 593, 670, 589, 670, 671, + 606, 600, 607, 704, 644, 645, 644, 644, 704, 574, + 704, 704, 590, 608, 575, 592, 704, 609, 603, 604, + 603, 605, 704, 605, 704, 576, 610, 704, 673, 644, + 704, 704, 669, 704, 704, 590, 704, 704, 592, 596, + 597, 589, 597, 598, 588, 589, 588, 590, 704, 704, + 600, 588, 589, 588, 590, 704, 704, 606, 671, 607, + 704, 674, 632, 633, 632, 634, 644, 704, 704, 669, + 608, 704, 601, 704, 609, 588, 589, 588, 588, 704, + 605, 704, 704, 610, 588, 589, 588, 588, 588, 589, + + 588, 590, 588, 589, 588, 590, 704, 704, 704, 704, + 704, 704, 598, 704, 704, 602, 675, 704, 704, 592, + 704, 704, 704, 676, 704, 704, 592, 704, 704, 704, + 704, 704, 704, 704, 634, 704, 704, 635, 704, 704, + 704, 704, 588, 589, 588, 590, 704, 588, 704, 704, + 625, 588, 589, 588, 590, 704, 588, 704, 704, 625, + 590, 704, 704, 592, 590, 704, 704, 592, 482, 682, + 683, 682, 684, 685, 685, 685, 685, 685, 685, 685, + 685, 685, 685, 685, 685, 685, 685, 704, 704, 704, + 685, 685, 685, 685, 704, 686, 704, 687, 704, 704, + + 685, 704, 685, 685, 590, 704, 704, 592, 588, 589, + 588, 590, 704, 590, 704, 704, 592, 670, 589, 670, + 670, 704, 594, 593, 670, 689, 670, 671, 685, 685, + 685, 593, 670, 589, 670, 671, 704, 600, 593, 670, + 589, 670, 671, 704, 600, 612, 613, 612, 614, 595, + 593, 670, 589, 670, 671, 704, 600, 588, 589, 588, + 588, 704, 704, 704, 673, 704, 616, 704, 704, 704, + 675, 673, 704, 592, 573, 644, 645, 644, 611, 670, + 647, 704, 688, 673, 704, 648, 671, 704, 704, 674, + 588, 589, 588, 588, 671, 704, 649, 674, 704, 704, + + 704, 671, 704, 704, 674, 704, 704, 614, 704, 704, + 652, 704, 704, 690, 704, 704, 674, 704, 704, 588, + 704, 704, 625, 588, 589, 588, 590, 588, 589, 588, + 590, 588, 589, 588, 590, 704, 704, 611, 704, 704, + 650, 588, 589, 588, 590, 670, 589, 670, 670, 704, + 594, 704, 588, 704, 704, 625, 704, 593, 670, 589, + 670, 671, 704, 600, 704, 588, 589, 588, 590, 693, + 704, 704, 704, 704, 704, 704, 704, 595, 704, 704, + 704, 694, 704, 704, 704, 590, 704, 704, 592, 590, + 673, 704, 592, 590, 704, 704, 592, 588, 589, 588, + + 588, 704, 704, 590, 704, 704, 592, 670, 695, 704, + 688, 588, 589, 588, 588, 588, 589, 588, 590, 704, + 671, 704, 704, 674, 704, 704, 704, 590, 704, 704, + 592, 542, 696, 697, 696, 698, 699, 699, 699, 699, + 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, + 704, 704, 704, 699, 699, 699, 699, 704, 704, 588, + 704, 704, 625, 699, 704, 699, 699, 704, 588, 589, + 588, 590, 704, 588, 704, 704, 625, 590, 704, 704, + 592, 588, 589, 588, 588, 588, 589, 588, 588, 704, + 704, 699, 699, 699, 562, 700, 701, 700, 702, 703, + + 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, + 703, 703, 703, 704, 704, 704, 703, 703, 703, 703, + 588, 589, 588, 590, 704, 704, 703, 704, 703, 703, + 590, 704, 704, 592, 588, 589, 588, 590, 704, 704, + 704, 704, 704, 588, 704, 704, 625, 588, 704, 704, + 625, 704, 704, 704, 703, 703, 703, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 590, 704, 704, 592, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 590, 704, 704, 592, + + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 139, 139, 704, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 142, 704, 142, 142, + 142, 148, 148, 704, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 160, 160, 160, 160, 160, 160, + 160, 160, 704, 704, 704, 160, 160, 174, 174, 704, + 704, 174, 174, 704, 174, 174, 174, 174, 174, 224, + 704, 704, 224, 224, 224, 224, 224, 232, 232, 704, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 237, 237, 237, 237, 237, 237, 237, 237, 704, 704, + + 704, 237, 237, 243, 243, 243, 243, 243, 243, 243, + 704, 243, 243, 243, 243, 243, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 247, + 247, 704, 247, 704, 247, 247, 247, 251, 704, 704, + 251, 251, 251, 251, 251, 254, 254, 254, 254, 254, + 254, 254, 254, 704, 704, 704, 254, 256, 256, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 264, 264, 704, 704, 264, 704, 704, + 264, 264, 327, 327, 327, 327, 327, 327, 327, 327, + + 704, 704, 704, 327, 327, 331, 331, 331, 331, 331, + 331, 331, 331, 704, 704, 704, 331, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 343, 343, 704, 704, 343, 704, 704, 343, 343, 347, + 704, 704, 347, 704, 347, 347, 347, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 404, 404, 404, 404, 404, 404, 404, 404, 704, 704, + 704, 404, 408, 408, 704, 704, 408, 704, 704, 408, + 408, 409, 704, 704, 409, 409, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 352, + + 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 429, 429, 429, 429, 429, 704, 429, 429, + 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, + 470, 470, 470, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 482, + 482, 482, 482, 482, 704, 482, 482, 542, 542, 542, + 542, 542, 704, 542, 542, 562, 562, 562, 562, 562, + 704, 562, 562, 573, 573, 573, 573, 573, 573, 573, + 573, 573, 573, 573, 573, 573, 582, 582, 582, 582, + + 582, 582, 582, 582, 582, 582, 582, 582, 582, 591, + 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, + 591, 593, 593, 704, 593, 593, 593, 593, 593, 593, + 593, 593, 593, 593, 599, 599, 599, 599, 599, 599, + 599, 599, 599, 599, 599, 599, 599, 620, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 596, 596, 704, 596, 596, 596, 596, 596, 596, 596, + 596, 596, 596, 646, 646, 646, 646, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 13, + + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704 + } ; + +static yyconst flex_int16_t yy_chk[3969] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 6, 7, 7, 7, + 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, + 8, 6, 9, 17, 20, 10, 18, 18, 25, 21, + 27, 26, 27, 27, 27, 67, 33, 25, 20, 26, + 35, 35, 691, 9, 8, 9, 10, 680, 10, 115, + 17, 21, 7, 28, 33, 33, 42, 28, 115, 8, + 41, 41, 67, 28, 43, 242, 42, 46, 119, 42, + + 660, 42, 42, 43, 119, 43, 43, 656, 46, 46, + 9, 242, 43, 10, 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, 11, 11, + 11, 11, 29, 651, 29, 29, 29, 30, 638, 30, + 30, 30, 31, 70, 31, 31, 31, 36, 36, 36, + + 36, 37, 37, 37, 37, 44, 29, 70, 49, 49, + 58, 30, 49, 51, 630, 44, 31, 629, 36, 137, + 44, 44, 37, 29, 51, 51, 44, 31, 30, 40, + 40, 40, 40, 31, 477, 47, 45, 37, 60, 60, + 50, 47, 47, 477, 45, 47, 47, 58, 625, 45, + 40, 45, 45, 48, 45, 50, 50, 48, 50, 36, + 137, 52, 36, 37, 68, 68, 37, 71, 48, 48, + 53, 48, 52, 52, 52, 52, 621, 52, 53, 53, + 40, 40, 55, 54, 108, 53, 54, 54, 620, 71, + 479, 40, 56, 56, 40, 55, 63, 55, 55, 479, + + 56, 56, 63, 63, 85, 85, 63, 63, 75, 618, + 75, 595, 75, 75, 75, 76, 76, 75, 76, 76, + 76, 108, 77, 76, 77, 77, 77, 78, 584, 83, + 79, 78, 79, 79, 79, 139, 80, 78, 80, 80, + 80, 81, 87, 81, 81, 81, 78, 83, 83, 86, + 86, 91, 91, 92, 79, 99, 99, 87, 87, 99, + 80, 93, 139, 92, 583, 81, 92, 116, 92, 92, + 93, 79, 93, 93, 94, 116, 81, 80, 95, 93, + 110, 110, 81, 512, 94, 582, 95, 96, 148, 94, + 94, 95, 512, 95, 95, 94, 95, 97, 96, 96, + + 101, 98, 244, 97, 97, 98, 100, 97, 97, 348, + 148, 101, 101, 348, 102, 581, 98, 98, 244, 98, + 579, 100, 100, 103, 100, 102, 102, 102, 102, 105, + 102, 103, 103, 104, 158, 158, 104, 104, 103, 106, + 106, 564, 105, 113, 105, 105, 561, 106, 106, 113, + 113, 560, 118, 113, 113, 117, 118, 117, 117, 117, + 172, 172, 118, 143, 143, 143, 144, 144, 144, 156, + 156, 156, 157, 157, 157, 157, 540, 143, 174, 174, + 144, 161, 161, 161, 176, 176, 157, 163, 163, 163, + 157, 156, 173, 173, 173, 173, 175, 175, 175, 175, + + 178, 177, 177, 161, 539, 180, 182, 143, 181, 181, + 184, 144, 177, 173, 180, 180, 536, 182, 182, 183, + 183, 183, 178, 178, 185, 184, 184, 185, 185, 186, + 187, 187, 189, 574, 186, 175, 516, 175, 188, 186, + 186, 188, 188, 190, 190, 189, 189, 232, 175, 191, + 191, 191, 175, 515, 173, 194, 194, 173, 175, 192, + 574, 175, 232, 193, 192, 192, 193, 193, 195, 197, + 197, 195, 195, 196, 196, 196, 198, 198, 198, 199, + 199, 199, 200, 200, 201, 514, 202, 202, 201, 201, + 201, 202, 203, 204, 205, 206, 207, 203, 203, 511, + + 206, 484, 206, 206, 204, 204, 210, 205, 205, 483, + 207, 207, 208, 208, 208, 209, 209, 209, 211, 211, + 211, 210, 210, 212, 213, 213, 214, 214, 216, 214, + 212, 212, 217, 214, 215, 215, 215, 218, 218, 219, + 216, 216, 220, 217, 217, 227, 219, 219, 481, 220, + 220, 221, 221, 221, 224, 224, 259, 259, 227, 227, + 227, 228, 228, 228, 229, 480, 229, 229, 229, 230, + 235, 230, 230, 230, 231, 231, 231, 236, 278, 278, + 233, 233, 233, 233, 478, 235, 279, 279, 229, 238, + 238, 238, 236, 230, 233, 476, 231, 432, 233, 240, + + 240, 240, 252, 252, 252, 229, 255, 255, 255, 255, + 230, 238, 431, 233, 234, 234, 252, 281, 284, 284, + 255, 256, 256, 256, 256, 261, 261, 261, 280, 280, + 428, 280, 281, 281, 282, 256, 292, 292, 234, 234, + 234, 234, 234, 234, 424, 282, 282, 261, 252, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, + 234, 234, 257, 257, 257, 257, 262, 262, 262, 283, + 285, 285, 285, 287, 294, 294, 257, 423, 289, 422, + 257, 414, 283, 283, 287, 287, 289, 289, 262, 263, + + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 363, 263, 263, 362, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 296, 296, 286, 264, 264, 264, 264, 272, 272, + 272, 272, 288, 290, 264, 301, 264, 264, 286, 286, + + 291, 293, 301, 301, 290, 290, 295, 288, 288, 302, + 302, 291, 291, 298, 298, 298, 293, 293, 361, 295, + 295, 299, 264, 264, 264, 297, 300, 272, 297, 272, + 297, 297, 299, 299, 304, 304, 303, 300, 300, 305, + 272, 303, 303, 358, 272, 305, 305, 306, 306, 357, + 272, 306, 308, 272, 307, 307, 307, 308, 308, 309, + 309, 312, 309, 310, 310, 311, 311, 311, 313, 313, + 313, 315, 312, 312, 314, 317, 314, 314, 316, 316, + 318, 321, 315, 315, 319, 319, 317, 317, 320, 320, + 322, 318, 318, 321, 321, 322, 322, 323, 325, 326, + + 326, 326, 351, 325, 325, 323, 323, 328, 328, 328, + 329, 329, 329, 333, 333, 333, 333, 340, 340, 340, + 346, 326, 334, 334, 334, 334, 513, 333, 345, 328, + 344, 333, 341, 341, 341, 513, 334, 366, 366, 340, + 334, 336, 335, 335, 335, 335, 333, 337, 337, 337, + 337, 368, 368, 364, 341, 334, 335, 364, 364, 330, + 335, 337, 369, 369, 369, 337, 365, 277, 349, 349, + 349, 349, 365, 365, 622, 335, 367, 374, 374, 370, + 337, 339, 349, 622, 367, 367, 370, 370, 276, 339, + 339, 339, 339, 339, 339, 275, 339, 372, 372, 372, + + 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 274, 342, 342, 273, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + 342, 342, 342, 342, 342, 342, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + + 343, 343, 343, 343, 343, 375, 375, 271, 343, 343, + 343, 343, 350, 350, 350, 350, 371, 371, 343, 371, + 343, 343, 352, 352, 352, 352, 350, 373, 381, 381, + 350, 373, 373, 377, 376, 270, 352, 376, 376, 380, + 352, 379, 379, 379, 377, 377, 343, 343, 343, 378, + 380, 380, 382, 266, 378, 378, 383, 383, 384, 384, + 385, 385, 386, 386, 385, 387, 387, 382, 382, 388, + 390, 389, 391, 392, 392, 394, 394, 397, 397, 391, + 391, 390, 390, 393, 388, 388, 389, 389, 395, 265, + 393, 393, 396, 396, 399, 258, 398, 396, 398, 398, + + 401, 395, 395, 249, 399, 399, 400, 400, 402, 402, + 247, 401, 401, 403, 403, 245, 403, 405, 405, 405, + 406, 406, 406, 425, 425, 425, 425, 434, 434, 435, + 435, 436, 436, 437, 437, 443, 443, 425, 241, 405, + 239, 425, 406, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 226, 407, 407, 170, + 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, + 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, + + 407, 407, 407, 407, 407, 407, 408, 408, 408, 408, + 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, + 408, 408, 408, 408, 408, 433, 168, 410, 408, 408, + 408, 408, 412, 412, 412, 412, 433, 433, 408, 410, + 408, 408, 167, 410, 438, 440, 412, 438, 438, 439, + 412, 442, 459, 459, 439, 439, 440, 440, 410, 413, + 413, 413, 413, 442, 442, 412, 408, 408, 408, 411, + 411, 411, 411, 413, 441, 461, 461, 413, 165, 444, + 445, 441, 441, 411, 444, 444, 446, 445, 445, 164, + 446, 446, 413, 451, 162, 411, 411, 411, 411, 411, + + 411, 447, 447, 447, 451, 451, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, + 411, 411, 411, 411, 411, 411, 411, 411, 411, 415, + 415, 415, 415, 448, 449, 155, 448, 448, 450, 450, + 450, 449, 452, 415, 449, 449, 453, 415, 149, 452, + 452, 454, 454, 454, 457, 453, 453, 457, 457, 464, + 464, 141, 415, 416, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + 416, 455, 460, 456, 485, 458, 138, 485, 485, 136, + 460, 460, 462, 463, 455, 455, 456, 456, 458, 458, + 463, 463, 462, 462, 465, 470, 470, 470, 470, 657, + 471, 471, 471, 471, 488, 488, 465, 465, 657, 470, + 487, 487, 487, 470, 471, 131, 486, 486, 471, 486, + 473, 473, 473, 473, 490, 490, 489, 596, 470, 491, + 491, 494, 494, 471, 473, 493, 491, 495, 473, 489, + + 489, 492, 496, 492, 492, 497, 493, 493, 498, 596, + 495, 495, 129, 473, 499, 499, 500, 496, 496, 501, + 497, 497, 502, 498, 498, 503, 503, 503, 500, 500, + 501, 501, 124, 502, 502, 504, 504, 505, 505, 506, + 506, 507, 507, 508, 508, 509, 510, 659, 509, 509, + 518, 518, 518, 519, 521, 521, 659, 510, 510, 520, + 520, 520, 520, 120, 519, 519, 522, 522, 523, 523, + 524, 526, 525, 524, 524, 525, 525, 527, 112, 528, + 529, 111, 526, 526, 528, 528, 530, 531, 531, 533, + 527, 527, 534, 529, 529, 532, 532, 530, 530, 89, + + 533, 533, 84, 534, 534, 535, 535, 535, 535, 82, + 520, 520, 543, 543, 544, 544, 545, 545, 545, 545, + 74, 520, 546, 546, 520, 547, 547, 69, 546, 548, + 548, 549, 549, 549, 551, 679, 547, 545, 550, 553, + 550, 550, 552, 552, 679, 551, 551, 554, 554, 555, + 553, 553, 556, 563, 563, 66, 535, 535, 559, 559, + 62, 555, 555, 631, 556, 556, 61, 535, 39, 559, + 535, 567, 567, 545, 557, 557, 557, 557, 545, 557, + 568, 545, 565, 593, 557, 631, 565, 565, 566, 566, + 568, 568, 569, 569, 566, 557, 570, 570, 571, 571, + + 572, 572, 585, 586, 586, 587, 587, 585, 585, 681, + 593, 624, 624, 692, 34, 631, 32, 24, 681, 19, + 16, 13, 692, 5, 4, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 557, 0, 0, 557, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, + + 558, 558, 558, 558, 558, 558, 558, 558, 573, 573, + 573, 573, 575, 575, 575, 575, 575, 577, 577, 577, + 577, 0, 0, 575, 576, 576, 576, 576, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 576, 0, 576, 0, 0, 0, 0, + 573, 0, 0, 573, 0, 575, 576, 0, 575, 577, + 576, 0, 577, 0, 0, 688, 576, 0, 0, 576, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 588, 588, 588, + 588, 589, 589, 589, 589, 590, 590, 590, 590, 591, + 591, 591, 591, 592, 592, 592, 592, 594, 594, 594, + 594, 597, 597, 597, 597, 598, 598, 598, 598, 598, + 0, 597, 600, 600, 600, 600, 598, 0, 0, 599, + + 599, 599, 599, 599, 601, 601, 601, 601, 601, 0, + 599, 0, 0, 597, 0, 0, 0, 0, 598, 588, + 0, 0, 588, 589, 0, 0, 589, 590, 0, 0, + 590, 591, 599, 0, 591, 592, 0, 0, 592, 594, + 0, 0, 594, 597, 0, 0, 597, 0, 598, 0, + 0, 598, 0, 0, 600, 0, 0, 600, 603, 603, + 603, 603, 599, 0, 0, 599, 0, 601, 0, 0, + 601, 602, 602, 602, 602, 602, 604, 604, 604, 604, + 0, 0, 602, 605, 605, 605, 605, 606, 606, 606, + 606, 607, 607, 607, 607, 0, 0, 603, 0, 603, + + 609, 609, 609, 609, 602, 608, 608, 608, 608, 0, + 603, 0, 0, 0, 603, 604, 0, 604, 0, 0, + 603, 0, 605, 603, 605, 0, 0, 0, 604, 0, + 0, 0, 604, 0, 602, 605, 606, 602, 604, 605, + 607, 604, 0, 609, 0, 605, 0, 0, 605, 606, + 0, 0, 606, 607, 0, 0, 607, 610, 610, 610, + 610, 608, 609, 0, 0, 609, 0, 608, 0, 0, + 608, 611, 611, 611, 611, 611, 0, 611, 612, 612, + 612, 612, 611, 613, 613, 613, 613, 614, 614, 614, + 614, 0, 0, 611, 616, 616, 616, 616, 0, 612, + + 0, 0, 0, 0, 613, 0, 0, 0, 614, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, + 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 616, 611, 616, 0, 611, 0, 0, + 612, 0, 0, 612, 0, 613, 616, 0, 613, 614, + 616, 0, 614, 0, 0, 0, 616, 0, 0, 616, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, + 619, 619, 619, 619, 619, 619, 619, 619, 626, 626, + 626, 626, 627, 627, 627, 627, 628, 628, 628, 628, + 632, 632, 632, 632, 633, 633, 633, 633, 634, 634, + 634, 634, 635, 635, 635, 635, 636, 636, 636, 636, + 640, 640, 640, 640, 0, 0, 636, 637, 637, 637, + 637, 637, 0, 0, 0, 0, 0, 0, 637, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, + 626, 0, 0, 626, 627, 0, 0, 627, 628, 0, + + 637, 628, 632, 0, 0, 632, 633, 0, 0, 633, + 634, 640, 0, 634, 635, 0, 0, 635, 636, 0, + 0, 636, 640, 0, 0, 640, 641, 641, 641, 641, + 637, 0, 0, 637, 639, 639, 639, 639, 639, 639, + 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, + 639, 639, 639, 0, 0, 0, 639, 639, 639, 639, + 642, 642, 642, 642, 0, 0, 639, 0, 639, 639, + 641, 643, 643, 643, 643, 0, 0, 644, 644, 644, + 644, 0, 644, 646, 646, 646, 646, 644, 641, 0, + 0, 641, 0, 0, 639, 639, 639, 639, 644, 0, + + 639, 0, 0, 0, 642, 647, 647, 647, 647, 647, + 643, 647, 643, 0, 645, 645, 645, 645, 0, 645, + 0, 0, 642, 643, 645, 642, 0, 643, 649, 649, + 649, 649, 0, 643, 0, 645, 643, 0, 647, 644, + 0, 0, 644, 0, 0, 646, 0, 0, 646, 648, + 648, 648, 648, 648, 650, 650, 650, 650, 0, 0, + 648, 652, 652, 652, 652, 0, 0, 649, 647, 649, + 0, 647, 661, 661, 661, 661, 645, 0, 0, 645, + 649, 0, 648, 0, 649, 662, 662, 662, 662, 0, + 649, 0, 0, 649, 663, 663, 663, 663, 664, 664, + + 664, 664, 665, 665, 665, 665, 0, 0, 0, 0, + 0, 0, 648, 0, 0, 648, 650, 0, 0, 650, + 0, 0, 0, 652, 0, 0, 652, 0, 0, 0, + 0, 0, 0, 0, 661, 0, 0, 661, 0, 0, + 0, 0, 667, 667, 667, 667, 0, 662, 0, 0, + 662, 668, 668, 668, 668, 0, 663, 0, 0, 663, + 664, 0, 0, 664, 665, 0, 0, 665, 666, 666, + 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, + 666, 666, 666, 666, 666, 666, 666, 0, 0, 0, + 666, 666, 666, 666, 0, 667, 0, 668, 0, 0, + + 666, 0, 666, 666, 667, 0, 0, 667, 669, 669, + 669, 669, 0, 668, 0, 0, 668, 670, 670, 670, + 670, 0, 670, 673, 673, 673, 673, 673, 666, 666, + 666, 671, 671, 671, 671, 671, 0, 671, 672, 672, + 672, 672, 672, 0, 672, 676, 676, 676, 676, 670, + 674, 674, 674, 674, 674, 0, 674, 682, 682, 682, + 682, 0, 0, 0, 671, 0, 676, 0, 0, 0, + 669, 672, 0, 669, 675, 675, 675, 675, 675, 670, + 675, 0, 670, 674, 0, 675, 673, 0, 0, 673, + 683, 683, 683, 683, 671, 0, 675, 671, 0, 0, + + 0, 672, 0, 0, 672, 0, 0, 676, 0, 0, + 676, 0, 0, 674, 0, 0, 674, 0, 0, 682, + 0, 0, 682, 684, 684, 684, 684, 685, 685, 685, + 685, 686, 686, 686, 686, 0, 0, 675, 0, 0, + 675, 687, 687, 687, 687, 689, 689, 689, 689, 0, + 689, 0, 683, 0, 0, 683, 0, 690, 690, 690, + 690, 690, 0, 690, 0, 693, 693, 693, 693, 686, + 0, 0, 0, 0, 0, 0, 0, 689, 0, 0, + 0, 687, 0, 0, 0, 684, 0, 0, 684, 685, + 690, 0, 685, 686, 0, 0, 686, 696, 696, 696, + + 696, 0, 0, 687, 0, 0, 687, 689, 693, 0, + 689, 697, 697, 697, 697, 698, 698, 698, 698, 0, + 690, 0, 0, 690, 0, 0, 0, 693, 0, 0, + 693, 694, 694, 694, 694, 694, 694, 694, 694, 694, + 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, + 0, 0, 0, 694, 694, 694, 694, 0, 0, 696, + 0, 0, 696, 694, 0, 694, 694, 0, 699, 699, + 699, 699, 0, 697, 0, 0, 697, 698, 0, 0, + 698, 700, 700, 700, 700, 701, 701, 701, 701, 0, + 0, 694, 694, 694, 695, 695, 695, 695, 695, 695, + + 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, + 695, 695, 695, 0, 0, 0, 695, 695, 695, 695, + 702, 702, 702, 702, 0, 0, 695, 0, 695, 695, + 699, 0, 0, 699, 703, 703, 703, 703, 0, 0, + 0, 0, 0, 700, 0, 0, 700, 701, 0, 0, + 701, 0, 0, 0, 695, 695, 695, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 702, 0, 0, 702, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 703, 0, 0, 703, + + 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, + 705, 705, 705, 706, 706, 0, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 707, 0, 707, 707, + 707, 708, 708, 0, 708, 708, 708, 708, 708, 708, + 708, 708, 708, 708, 709, 709, 709, 709, 709, 709, + 709, 709, 0, 0, 0, 709, 709, 710, 710, 0, + 0, 710, 710, 0, 710, 710, 710, 710, 710, 711, + 0, 0, 711, 711, 711, 711, 711, 712, 712, 0, + 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, + 713, 713, 713, 713, 713, 713, 713, 713, 0, 0, + + 0, 713, 713, 714, 714, 714, 714, 714, 714, 714, + 0, 714, 714, 714, 714, 714, 715, 715, 715, 715, + 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, + 716, 0, 716, 0, 716, 716, 716, 717, 0, 0, + 717, 717, 717, 717, 717, 718, 718, 718, 718, 718, + 718, 718, 718, 0, 0, 0, 718, 719, 719, 719, + 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, + 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, + 720, 720, 720, 721, 721, 0, 0, 721, 0, 0, + 721, 721, 722, 722, 722, 722, 722, 722, 722, 722, + + 0, 0, 0, 722, 722, 723, 723, 723, 723, 723, + 723, 723, 723, 0, 0, 0, 723, 724, 724, 724, + 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, + 725, 725, 0, 0, 725, 0, 0, 725, 725, 726, + 0, 0, 726, 0, 726, 726, 726, 727, 727, 727, + 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, + 728, 728, 728, 728, 728, 728, 728, 728, 0, 0, + 0, 728, 729, 729, 0, 0, 729, 0, 0, 729, + 729, 730, 0, 0, 730, 730, 731, 731, 731, 731, + 731, 731, 731, 731, 731, 731, 731, 731, 731, 732, + + 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, + 732, 732, 733, 733, 733, 733, 733, 0, 733, 733, + 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, + 734, 734, 734, 735, 735, 735, 735, 735, 735, 735, + 735, 735, 735, 735, 735, 735, 736, 736, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 737, + 737, 737, 737, 737, 0, 737, 737, 738, 738, 738, + 738, 738, 0, 738, 738, 739, 739, 739, 739, 739, + 0, 739, 739, 740, 740, 740, 740, 740, 740, 740, + 740, 740, 740, 740, 740, 740, 741, 741, 741, 741, + + 741, 741, 741, 741, 741, 741, 741, 741, 741, 742, + 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, + 742, 743, 743, 0, 743, 743, 743, 743, 743, 743, + 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, + 744, 744, 744, 744, 744, 744, 744, 745, 745, 745, + 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, + 746, 746, 0, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 747, 747, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 747, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 748, 748, 704, + + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 704, 704, 704, 704, 704, 704, 704, 704 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int as3__flex_debug; +int as3__flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *as3_text; +#line 1 "tokenizer.lex" +/* tokenizer.lex + + Routines for compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ +#line 24 "tokenizer.lex" + + +#include +#include +#include +#include +#include "../utf8.h" +#include "common.h" +#include "tokenizer.h" +#include "files.h" + +unsigned int as3_tokencount = 0; + +static void dbg(const char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(as3_verbosity<3) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(tokenizer) "); + printf("%s\n", buf); + fflush(stdout); +} + +#ifndef YY_CURRENT_BUFFER +#define YY_CURRENT_BUFFER yy_current_buffer +#endif + +static void*as3_buffer=0; +static int as3_buffer_pos=0; +static int as3_buffer_len=0; +void as3_file_input(FILE*fi) +{ + as3_in = fi; + as3_buffer = 0; +} +void as3_buffer_input(void*buffer, int len) +{ + if(!buffer) + syntaxerror("trying to parse zero bytearray"); + as3_buffer = buffer; + as3_buffer_len = len; + as3_buffer_pos = 0; + as3_in = 0; +} + +//#undef BEGIN +//#define BEGIN(x) {(yy_start) = 1 + 2 *x;dbg("entering state %d", x);} + +#define YY_INPUT(buf,result,max_size) { \ + if(!as3_buffer) { \ + errno=0; \ + while((result = fread(buf, 1, max_size, as3_in))==0 && ferror(as3_in)) \ + { if(errno != EINTR) {YY_FATAL_ERROR("input in flex scanner failed"); break;} \ + errno=0; clearerr(as3_in); \ + } \ + } else { \ + int to_read = max_size; \ + if(to_read + as3_buffer_pos > as3_buffer_len) \ + to_read = as3_buffer_len - as3_buffer_pos; \ + memcpy(buf, as3_buffer+as3_buffer_pos, to_read); \ + as3_buffer_pos += to_read; \ + result=to_read; \ + } \ +} + +void handleInclude(char*text, int len, char quotes) +{ + char*filename = 0; + if(quotes) { + char*p1 = strchr(text, '"'); + char*p2 = strrchr(text, '"'); + if(!p1 || !p2 || p1==p2) { + syntaxerror("Invalid include in line %d\n", current_line); + } + *p2 = 0; + filename = strdup(p1+1); + } else { + int i1=0,i2=len; + // find start + while(!strchr(" \n\r\t\xa0", text[i1])) i1++; + // strip + while(strchr(" \n\r\t\xa0", text[i1])) i1++; + while(strchr(" \n\r\t\xa0", text[i2-1])) i2--; + if(i2!=len) text[i2]=0; + filename = strdup(&text[i1]); + } + + char*fullfilename = find_file(filename, 1); + enter_file2(filename, fullfilename, YY_CURRENT_BUFFER); + as3_in = fopen(fullfilename, "rb"); + if (!as3_in) { + syntaxerror("Couldn't open include file \"%s\"\n", fullfilename); + } + + as3__switch_to_buffer(as3__create_buffer(as3_in,YY_BUF_SIZE ) ); + //BEGIN(DEFAULT); keep context +} + +static int do_unescape(const char*s, const char*end, char*n) +{ + char*o = n; + int len=0; + while(s256) + syntaxerror("octal number out of range (0-255): %d", num); + if(o) o[len] = num;len++; + continue; + } + case 'x': case 'u': { + int max=2; + char bracket = 0; + char unicode = 0; + if(*s == 'u') { + max = 6; + unicode = 1; + } + s++; + if(s==end) syntaxerror("invalid \\u or \\x at end of string"); + if(*s == '{') { + s++; + if(s==end) syntaxerror("invalid \\u{ at end of string"); + bracket=1; + } + unsigned int num=0; + int nr = 0; + while(strchr("0123456789abcdefABCDEF", *s) && (bracket || nr < max) && s='0' && *s<='9') num |= *s - '0'; + if(*s>='a' && *s<='f') num |= *s - 'a' + 10; + if(*s>='A' && *s<='F') num |= *s - 'A' + 10; + nr++; + s++; + } + if(bracket) { + if(*s=='}' && s256) + syntaxerror("byte out of range (0-255): %d", num); + if(o) o[len] = num;len++; + } + break; + } + default: { + if(o) { + o[len+0] = '\\'; + o[len+1] = *s; + } + s++; + len+=2; + break; + } + } + } + if(o) o[len]=0; + return len; +} + +static string_t string_unescape(const char*in, int l) +{ + const char*s = in; + const char*end = &in[l]; + + int len = do_unescape(s, end, 0); + char*n = (char*)malloc(len+1); + do_unescape(s, end, n); + string_t out = string_new(n, len); + return out; +} + +static void handleCData(char*s, int len) +{ + a3_lval.str.str = s+9; // + a3_lval.str.str = strdup_n(a3_lval.str.str, a3_lval.str.len); +} + +static void handleRaw(char*s, int len) +{ + a3_lval.str.len = len; + a3_lval.str.str = strdup_n(s, a3_lval.str.len); +} + +static void handleString(char*s, int len) +{ + if(s[0]=='"') { + if(s[len-1]!='"') syntaxerror("String doesn't end with '\"'"); + s++;len-=2; + } + else if(s[0]=='\'') { + if(s[len-1]!='\'') syntaxerror("String doesn't end with '\"'"); + s++;len-=2; + } + else syntaxerror("String incorrectly terminated"); + + a3_lval.str = string_unescape(s, len); +} + + +char start_of_expression; + +static inline int m(int type) +{ + a3_lval.token = type; + return type; +} + +static char numberbuf[64]; +static char*nrbuf() +{ + if(as3_leng>sizeof(numberbuf)-1) + syntaxerror("decimal number overflow"); + char*s = numberbuf; + memcpy(s, as3_text, as3_leng); + s[as3_leng]=0; + return s; +} + +static inline int setint(int v) +{ + a3_lval.number_int = v; + return T_INT; +} +static inline int setfloat(double v) +{ + a3_lval.number_float = v; + return T_FLOAT; +} + +static inline int handlefloat() +{ + char*s = nrbuf(); + a3_lval.number_float = atof(s); + return T_FLOAT; +} + +static inline int handleint() +{ + char*s = nrbuf(); + char l = (as3_text[0]=='-'); + + //char*max = l?"1073741824":"2147483647"; + char*max = l?"2147483648":"2147483647"; + + if(as3_leng-l>10) { + as3_softwarning("integer overflow: %s (converted to Number)", s); + return handlefloat(); + } + if(as3_leng-l==10) { + int t; + for(t=0;tmax[t]) { + as3_softwarning("integer overflow: %s (converted to Number)", s); + return handlefloat(); + } + else if(as3_text[l+t]='0' && c<='9') + d+=(c&15)*base; + else if((c>='a' && c<='f') || (c>='A' && c<='F')) + d+=((c&0x0f)+9)*base; + } + return setfloat(d); +} +static inline int handlehex() +{ + char l = (as3_text[0]=='-')+2; + int len = as3_leng; + + if(len-l>8) { + char*s = nrbuf(); + syntaxerror("integer overflow %s", s); + } + + int t; + unsigned int v = 0; + for(t=l;t='0' && c<='9') + v|=(c&15); + else if((c>='a' && c<='f') || (c>='A' && c<='F')) + v|=(c&0x0f)+9; + } + if(l && v>=0x80000000) { + char*s = nrbuf(); + as3_softwarning("integer overflow: %s (converted to Number)", s); + return setfloat(v); + } + if(!l && v>0x7fffffff) { + char*s = nrbuf(); + as3_softwarning("integer overflow: %s (converted to Number)", s); + return setfloat(v); + } + + if(l==3) { + return setint(-(int)v); + } else { + return setint(v); + } +} + +void handleLabel(char*text, int len) +{ + int t; + for(t=len-1;t>=0;--t) { + if(text[t]!=' ' && + text[t]!=':') + break; + } + char*s = malloc(t+1); + memcpy(s, as3_text, t); + s[t]=0; + a3_lval.id = s; +} + +static int handleregexp() +{ + char*s = malloc(as3_leng); + int len=as3_leng-1; + memcpy(s, as3_text+1, len); + s[len] = 0; + int t; + for(t=len;t>=0;--t) { + if(s[t]=='/') { + s[t] = 0; + break; + } + } + a3_lval.regexp.pattern = s; + if(t==len) { + a3_lval.regexp.options = 0; + } else { + a3_lval.regexp.options = s+t+1; + } + return T_REGEXP; +} + +void initialize_scanner(); +#define YY_USER_INIT initialize_scanner(); + +/* count the number of lines+columns consumed by this token */ +static inline void l() { + int t; + for(t=0;t]|(-/[^-])|(--/[^>]))*--> + +//{XMLCOMMENT} + + + + + + +#line 2080 "tokenizer.yy.c" + +#define INITIAL 0 +#define REGEXPOK 1 +#define BEGINNING 2 +#define DEFAULT 3 +#define XMLTEXT 4 +#define XML 5 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int as3_lex_destroy (void ); + +int as3_get_debug (void ); + +void as3_set_debug (int debug_flag ); + +YY_EXTRA_TYPE as3_get_extra (void ); + +void as3_set_extra (YY_EXTRA_TYPE user_defined ); + +FILE *as3_get_in (void ); + +void as3_set_in (FILE * in_str ); + +FILE *as3_get_out (void ); + +void as3_set_out (FILE * out_str ); + +yy_size_t as3_get_leng (void ); + +char *as3_get_text (void ); + +int as3_get_lineno (void ); + +void as3_set_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int as3_wrap (void ); +#else +extern int as3_wrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO fwrite( as3_text, as3_leng, 1, as3_out ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + yy_size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( as3_in )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( as3_in ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, as3_in))==0 && ferror(as3_in)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(as3_in); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int as3_lex (void); + +#define YY_DECL int as3_lex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after as3_text and as3_leng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( as3_leng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (as3_text[as3_leng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 536 "tokenizer.lex" + + + +#line 2274 "tokenizer.yy.c" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! as3_in ) + as3_in = stdin; + + if ( ! as3_out ) + as3_out = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + as3_ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + as3__create_buffer(as3_in,YY_BUF_SIZE ); + } + + as3__load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of as3_text. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 705 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 704 ); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 539 "tokenizer.lex" +{l(); /* single line comment */} + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 540 "tokenizer.lex" +{l(); /* multi line comment */} + YY_BREAK +case 3: +YY_RULE_SETUP +#line 541 "tokenizer.lex" +{syntaxerror("syntax error: unterminated comment", as3_text);} + YY_BREAK +case 4: +/* rule 4 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 543 "tokenizer.lex" +{l();handleInclude(as3_text, as3_leng, 1);} + YY_BREAK +case 5: +/* rule 5 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 544 "tokenizer.lex" +{l();handleInclude(as3_text, as3_leng, 0);} + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 545 "tokenizer.lex" +{l(); BEGIN(DEFAULT);handleString(as3_text, as3_leng);return T_STRING;} + YY_BREAK +case 7: +/* rule 7 can match eol */ +YY_RULE_SETUP +#line 546 "tokenizer.lex" +{l(); BEGIN(DEFAULT);handleCData(as3_text, as3_leng);return T_STRING;} + YY_BREAK + +case 8: +/* rule 8 can match eol */ +YY_RULE_SETUP +#line 549 "tokenizer.lex" +{l(); BEGIN(DEFAULT);handleRaw(as3_text, as3_leng);return T_STRING;} + YY_BREAK + + +case 9: +/* rule 9 can match eol */ +YY_RULE_SETUP +#line 553 "tokenizer.lex" +{l(); handleRaw(as3_text, as3_leng);return T_STRING;} + YY_BREAK +case 10: +YY_RULE_SETUP +#line 554 "tokenizer.lex" +{c(); BEGIN(REGEXPOK);return m('{');} + YY_BREAK +case 11: +YY_RULE_SETUP +#line 555 "tokenizer.lex" +{c(); return m('<');} + YY_BREAK +case 12: +YY_RULE_SETUP +#line 556 "tokenizer.lex" +{c(); return m('/');} + YY_BREAK +case 13: +YY_RULE_SETUP +#line 557 "tokenizer.lex" +{c(); return m('>');} + YY_BREAK +case 14: +YY_RULE_SETUP +#line 558 "tokenizer.lex" +{c(); return m('=');} + YY_BREAK +case 15: +YY_RULE_SETUP +#line 559 "tokenizer.lex" +{c(); handleRaw(as3_text, as3_leng);return T_IDENTIFIER;} + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 560 "tokenizer.lex" +{l(); handleRaw(as3_text, as3_leng);return T_STRING;} + YY_BREAK +case YY_STATE_EOF(XML): +#line 561 "tokenizer.lex" +{syntaxerror("unexpected end of file");} + YY_BREAK + + +case 17: +/* rule 17 can match eol */ +YY_RULE_SETUP +#line 565 "tokenizer.lex" +{l(); handleRaw(as3_text, as3_leng);return T_STRING;} + YY_BREAK +case 18: +YY_RULE_SETUP +#line 566 "tokenizer.lex" +{c(); BEGIN(REGEXPOK);return m('{');} + YY_BREAK +case 19: +YY_RULE_SETUP +#line 567 "tokenizer.lex" +{c(); BEGIN(XML);return m('<');} + YY_BREAK +case 20: +YY_RULE_SETUP +#line 568 "tokenizer.lex" +{c(); return m('>');} + YY_BREAK +case 21: +/* rule 21 can match eol */ +YY_RULE_SETUP +#line 569 "tokenizer.lex" +{l(); handleRaw(as3_text, as3_leng);return T_STRING;} + YY_BREAK +case 22: +/* rule 22 can match eol */ +YY_RULE_SETUP +#line 570 "tokenizer.lex" +{l(); handleRaw(as3_text, as3_leng);return T_STRING;} + YY_BREAK +case YY_STATE_EOF(XMLTEXT): +#line 571 "tokenizer.lex" +{syntaxerror("unexpected end of file");} + YY_BREAK + + +case 23: +YY_RULE_SETUP +#line 575 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handleregexp();} + YY_BREAK +case 24: +/* rule 24 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 576 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handlehex();} + YY_BREAK +case 25: +/* rule 25 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 577 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handlehexfloat();} + YY_BREAK +case 26: +/* rule 26 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 578 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handleint();} + YY_BREAK +case 27: +/* rule 27 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 579 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handlefloat();} + YY_BREAK + +case 28: +YY_RULE_SETUP +#line 582 "tokenizer.lex" +{c(); BEGIN(REGEXPOK);return m(T_DICTSTART);} + YY_BREAK +case 29: +YY_RULE_SETUP +#line 583 "tokenizer.lex" +{c(); BEGIN(DEFAULT); return m('{');} + YY_BREAK +case 30: +YY_RULE_SETUP +#line 585 "tokenizer.lex" +{/* utf 8 bom (0xfeff) */} + YY_BREAK +case 31: +/* rule 31 can match eol */ +YY_RULE_SETUP +#line 586 "tokenizer.lex" +{l();} + YY_BREAK +case 32: +/* rule 32 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 588 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handlehex();} + YY_BREAK +case 33: +/* rule 33 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 589 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handlehexfloat();} + YY_BREAK +case 34: +/* rule 34 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 590 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handleint();} + YY_BREAK +case 35: +/* rule 35 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 591 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return handlefloat();} + YY_BREAK +case 36: +YY_RULE_SETUP +#line 592 "tokenizer.lex" +{c(); BEGIN(DEFAULT);return m(KW_NAN);} + YY_BREAK +case 37: +YY_RULE_SETUP +#line 594 "tokenizer.lex" +{/* for debugging: generates a tokenizer-level error */ + syntaxerror("3rr0r");} + YY_BREAK +case 38: +/* rule 38 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 597 "tokenizer.lex" +{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-3);return T_FOR;} + YY_BREAK +case 39: +/* rule 39 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 598 "tokenizer.lex" +{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-2);return T_DO;} + YY_BREAK +case 40: +/* rule 40 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 599 "tokenizer.lex" +{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-5);return T_WHILE;} + YY_BREAK +case 41: +/* rule 41 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up as3_text again */ +YY_RULE_SETUP +#line 600 "tokenizer.lex" +{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-6);return T_SWITCH;} + YY_BREAK +case 42: +/* rule 42 can match eol */ +YY_RULE_SETUP +#line 601 "tokenizer.lex" +{l();BEGIN(DEFAULT);return m(KW_DEFAULT_XML);} + YY_BREAK +case 43: +YY_RULE_SETUP +#line 602 "tokenizer.lex" +{c();BEGIN(DEFAULT);a3_lval.id="";return T_FOR;} + YY_BREAK +case 44: +YY_RULE_SETUP +#line 603 "tokenizer.lex" +{c();BEGIN(DEFAULT);a3_lval.id="";return T_DO;} + YY_BREAK +case 45: +YY_RULE_SETUP +#line 604 "tokenizer.lex" +{c();BEGIN(DEFAULT);a3_lval.id="";return T_WHILE;} + YY_BREAK +case 46: +YY_RULE_SETUP +#line 605 "tokenizer.lex" +{c();BEGIN(DEFAULT);a3_lval.id="";return T_SWITCH;} + YY_BREAK +case 47: +YY_RULE_SETUP +#line 607 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_ANDAND);} + YY_BREAK +case 48: +YY_RULE_SETUP +#line 608 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_OROR);} + YY_BREAK +case 49: +YY_RULE_SETUP +#line 609 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_NE);} + YY_BREAK +case 50: +YY_RULE_SETUP +#line 610 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_NEE);} + YY_BREAK +case 51: +YY_RULE_SETUP +#line 611 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_EQEQEQ);} + YY_BREAK +case 52: +YY_RULE_SETUP +#line 612 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_EQEQ);} + YY_BREAK +case 53: +YY_RULE_SETUP +#line 613 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_GE);} + YY_BREAK +case 54: +YY_RULE_SETUP +#line 614 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_LE);} + YY_BREAK +case 55: +YY_RULE_SETUP +#line 615 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(T_MINUSMINUS);} + YY_BREAK +case 56: +YY_RULE_SETUP +#line 616 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(T_PLUSPLUS);} + YY_BREAK +case 57: +YY_RULE_SETUP +#line 617 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_PLUSBY);} + YY_BREAK +case 58: +YY_RULE_SETUP +#line 618 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_XORBY);} + YY_BREAK +case 59: +YY_RULE_SETUP +#line 619 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_MINUSBY);} + YY_BREAK +case 60: +YY_RULE_SETUP +#line 620 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_DIVBY);} + YY_BREAK +case 61: +YY_RULE_SETUP +#line 621 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_MODBY);} + YY_BREAK +case 62: +YY_RULE_SETUP +#line 622 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_MULBY);} + YY_BREAK +case 63: +YY_RULE_SETUP +#line 623 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_ORBY);} + YY_BREAK +case 64: +YY_RULE_SETUP +#line 624 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_ANDBY);} + YY_BREAK +case 65: +YY_RULE_SETUP +#line 625 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_SHRBY);} + YY_BREAK +case 66: +YY_RULE_SETUP +#line 626 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_SHLBY);} + YY_BREAK +case 67: +YY_RULE_SETUP +#line 627 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_USHRBY);} + YY_BREAK +case 68: +YY_RULE_SETUP +#line 628 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_SHL);} + YY_BREAK +case 69: +YY_RULE_SETUP +#line 629 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_USHR);} + YY_BREAK +case 70: +YY_RULE_SETUP +#line 630 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_SHR);} + YY_BREAK +case 71: +YY_RULE_SETUP +#line 631 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_DOTDOTDOT);} + YY_BREAK +case 72: +YY_RULE_SETUP +#line 632 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_DOTDOT);} + YY_BREAK +case 73: +YY_RULE_SETUP +#line 633 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m('.');} + YY_BREAK +case 74: +YY_RULE_SETUP +#line 634 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(T_COLONCOLON);} + YY_BREAK +case 75: +YY_RULE_SETUP +#line 635 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(':');} + YY_BREAK +case 76: +YY_RULE_SETUP +#line 636 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_INSTANCEOF);} + YY_BREAK +case 77: +YY_RULE_SETUP +#line 637 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_IMPLEMENTS);} + YY_BREAK +case 78: +YY_RULE_SETUP +#line 638 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_INTERFACE);} + YY_BREAK +case 79: +YY_RULE_SETUP +#line 639 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_PROTECTED);} + YY_BREAK +case 80: +YY_RULE_SETUP +#line 640 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_NAMESPACE);} + YY_BREAK +case 81: +YY_RULE_SETUP +#line 641 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_UNDEFINED);} + YY_BREAK +case 82: +YY_RULE_SETUP +#line 642 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_ARGUMENTS);} + YY_BREAK +case 83: +YY_RULE_SETUP +#line 643 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_CONTINUE);} + YY_BREAK +case 84: +YY_RULE_SETUP +#line 644 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_OVERRIDE);} + YY_BREAK +case 85: +YY_RULE_SETUP +#line 645 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_INTERNAL);} + YY_BREAK +case 86: +YY_RULE_SETUP +#line 646 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_FUNCTION);} + YY_BREAK +case 87: +YY_RULE_SETUP +#line 647 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_FINALLY);} + YY_BREAK +case 88: +YY_RULE_SETUP +#line 648 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_DEFAULT);} + YY_BREAK +case 89: +YY_RULE_SETUP +#line 649 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_PACKAGE);} + YY_BREAK +case 90: +YY_RULE_SETUP +#line 650 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_PRIVATE);} + YY_BREAK +case 91: +YY_RULE_SETUP +#line 651 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_DYNAMIC);} + YY_BREAK +case 92: +YY_RULE_SETUP +#line 652 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_EXTENDS);} + YY_BREAK +case 93: +YY_RULE_SETUP +#line 653 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_DELETE);} + YY_BREAK +case 94: +YY_RULE_SETUP +#line 654 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_RETURN);} + YY_BREAK +case 95: +YY_RULE_SETUP +#line 655 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_PUBLIC);} + YY_BREAK +case 96: +YY_RULE_SETUP +#line 656 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_NATIVE);} + YY_BREAK +case 97: +YY_RULE_SETUP +#line 657 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_STATIC);} + YY_BREAK +case 98: +YY_RULE_SETUP +#line 658 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_IMPORT);} + YY_BREAK +case 99: +YY_RULE_SETUP +#line 659 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_TYPEOF);} + YY_BREAK +case 100: +YY_RULE_SETUP +#line 660 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_THROW);} + YY_BREAK +case 101: +YY_RULE_SETUP +#line 661 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_CLASS);} + YY_BREAK +case 102: +YY_RULE_SETUP +#line 662 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_CONST);} + YY_BREAK +case 103: +YY_RULE_SETUP +#line 663 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_CATCH);} + YY_BREAK +case 104: +YY_RULE_SETUP +#line 664 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_FINAL);} + YY_BREAK +case 105: +YY_RULE_SETUP +#line 665 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_FALSE);} + YY_BREAK +case 106: +YY_RULE_SETUP +#line 666 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_BREAK);} + YY_BREAK +case 107: +YY_RULE_SETUP +#line 667 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_SUPER);} + YY_BREAK +case 108: +YY_RULE_SETUP +#line 668 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_EACH);} + YY_BREAK +case 109: +YY_RULE_SETUP +#line 669 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_VOID);} + YY_BREAK +case 110: +YY_RULE_SETUP +#line 670 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_TRUE);} + YY_BREAK +case 111: +YY_RULE_SETUP +#line 671 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_NULL);} + YY_BREAK +case 112: +YY_RULE_SETUP +#line 672 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_ELSE);} + YY_BREAK +case 113: +YY_RULE_SETUP +#line 673 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_CASE);} + YY_BREAK +case 114: +YY_RULE_SETUP +#line 674 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_WITH);} + YY_BREAK +case 115: +YY_RULE_SETUP +#line 675 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_USE);} + YY_BREAK +case 116: +YY_RULE_SETUP +#line 676 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_NEW);} + YY_BREAK +case 117: +YY_RULE_SETUP +#line 677 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_GET);} + YY_BREAK +case 118: +YY_RULE_SETUP +#line 678 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_SET);} + YY_BREAK +case 119: +YY_RULE_SETUP +#line 679 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_VAR);} + YY_BREAK +case 120: +YY_RULE_SETUP +#line 680 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_TRY);} + YY_BREAK +case 121: +YY_RULE_SETUP +#line 681 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_IS) ;} + YY_BREAK +case 122: +YY_RULE_SETUP +#line 682 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_IN) ;} + YY_BREAK +case 123: +YY_RULE_SETUP +#line 683 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(KW_IF) ;} + YY_BREAK +case 124: +YY_RULE_SETUP +#line 684 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(KW_AS);} + YY_BREAK +case 125: +YY_RULE_SETUP +#line 685 "tokenizer.lex" +{c();BEGIN(DEFAULT);return handleIdentifier();} + YY_BREAK +case 126: +YY_RULE_SETUP +#line 687 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(as3_text[0]);} + YY_BREAK +case 127: +YY_RULE_SETUP +#line 688 "tokenizer.lex" +{c();BEGIN(REGEXPOK);return m(as3_text[0]);} + YY_BREAK +case 128: +YY_RULE_SETUP +#line 689 "tokenizer.lex" +{c();BEGIN(DEFAULT);return m(as3_text[0]);} + YY_BREAK + +case 129: +YY_RULE_SETUP +#line 692 "tokenizer.lex" +{tokenerror();} + YY_BREAK + +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(REGEXPOK): +case YY_STATE_EOF(BEGINNING): +case YY_STATE_EOF(DEFAULT): +#line 694 "tokenizer.lex" +{l(); + void*b = leave_file(); + if (!b) { + yyterminate(); + as3__delete_buffer(YY_CURRENT_BUFFER); + return m(T_EOF); + } else { + as3__delete_buffer(YY_CURRENT_BUFFER); + as3__switch_to_buffer(b); + } + } + YY_BREAK +case 130: +YY_RULE_SETUP +#line 706 "tokenizer.lex" +ECHO; + YY_BREAK +#line 3108 "tokenizer.yy.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed as3_in at a new source and called + * as3_lex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = as3_in; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( as3_wrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * as3_text, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of as3_lex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + yy_size_t new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + as3_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + as3_restart(as3_in ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) as3_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 705 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 705 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 704); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up as3_text */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register yy_size_t number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + as3_restart(as3_in ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( as3_wrap( ) ) + return 0; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve as3_text */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void as3_restart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + as3_ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + as3__create_buffer(as3_in,YY_BUF_SIZE ); + } + + as3__init_buffer(YY_CURRENT_BUFFER,input_file ); + as3__load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void as3__switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * as3_pop_buffer_state(); + * as3_push_buffer_state(new_buffer); + */ + as3_ensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + as3__load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (as3_wrap()) processing, but the only time this flag + * is looked at is after as3_wrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void as3__load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + as3_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE as3__create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) as3_alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in as3__create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) as3_alloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in as3__create_buffer()" ); + + b->yy_is_our_buffer = 1; + + as3__init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with as3__create_buffer() + * + */ + void as3__delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + as3_free((void *) b->yy_ch_buf ); + + as3_free((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a as3_restart() or at EOF. + */ + static void as3__init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + as3__flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then as3__init_buffer was _probably_ + * called from as3_restart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void as3__flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + as3__load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void as3_push_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + as3_ensure_buffer_stack(); + + /* This block is copied from as3__switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from as3__switch_to_buffer. */ + as3__load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void as3_pop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + as3__delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + as3__load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void as3_ensure_buffer_stack (void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)as3_alloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in as3_ensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)as3_realloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in as3_ensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE as3__scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) as3_alloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in as3__scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + as3__switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to as3_lex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * as3__scan_bytes() instead. + */ +YY_BUFFER_STATE as3__scan_string (yyconst char * yystr ) +{ + + return as3__scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to as3_lex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE as3__scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n, i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) as3_alloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in as3__scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = as3__scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in as3__scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up as3_text. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + as3_text[as3_leng] = (yy_hold_char); \ + (yy_c_buf_p) = as3_text + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + as3_leng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int as3_get_lineno (void) +{ + + return as3_lineno; +} + +/** Get the input stream. + * + */ +FILE *as3_get_in (void) +{ + return as3_in; +} + +/** Get the output stream. + * + */ +FILE *as3_get_out (void) +{ + return as3_out; +} + +/** Get the length of the current token. + * + */ +yy_size_t as3_get_leng (void) +{ + return as3_leng; +} + +/** Get the current token. + * + */ + +char *as3_get_text (void) +{ + return as3_text; +} + +/** Set the current line number. + * @param line_number + * + */ +void as3_set_lineno (int line_number ) +{ + + as3_lineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see as3__switch_to_buffer + */ +void as3_set_in (FILE * in_str ) +{ + as3_in = in_str ; +} + +void as3_set_out (FILE * out_str ) +{ + as3_out = out_str ; +} + +int as3_get_debug (void) +{ + return as3__flex_debug; +} + +void as3_set_debug (int bdebug ) +{ + as3__flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from as3_lex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + as3_in = stdin; + as3_out = stdout; +#else + as3_in = (FILE *) 0; + as3_out = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * as3_lex_init() + */ + return 0; +} + +/* as3_lex_destroy is for both reentrant and non-reentrant scanners. */ +int as3_lex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + as3__delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + as3_pop_buffer_state(); + } + + /* Destroy the stack itself. */ + as3_free((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * as3_lex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *as3_alloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *as3_realloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void as3_free (void * ptr ) +{ + free( (char *) ptr ); /* see as3_realloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 706 "tokenizer.lex" + + + +int as3_wrap() +{ + return 1; +} + +static int tokenerror() +{ + char c1=as3_text[0]; + char buf[128]; + buf[0] = as3_text[0]; + int t; + for(t=1;t<128;t++) { + char c = buf[t]=input(); + if(c=='\n' || c==EOF) { + buf[t] = 0; + break; + } + } + if(c1>='0' && c1<='9') + syntaxerror("syntax error: %s (identifiers must not start with a digit)"); + else + syntaxerror("syntax error [state=%d]: %s", (yy_start-1)/2, buf); + printf("\n"); + exit(1); + yyterminate(); +} + + +static char mbuf[256]; +char*token2string(enum yytokentype nr, YYSTYPE v) +{ + if(nr==T_STRING) { + char*s = malloc(v.str.len+10); + strcpy(s, ""); + memcpy(s+8, v.str.str, v.str.len); + sprintf(s+8+v.str.len, " (%d bytes)", v.str.len); + return s; + } + else if(nr==T_REGEXP) { + char*s = malloc(strlen(v.regexp.pattern)+10); + sprintf(s, "%s", v.regexp.pattern); + return s; + } + else if(nr==T_IDENTIFIER) { + char*s = malloc(strlen(v.id)+10); + sprintf(s, "%s", v.id); + return s; + } + else if(nr==T_INT) return ""; + else if(nr==T_UINT) return ""; + else if(nr==T_FLOAT) return ""; + else if(nr==T_EOF) return "***END***"; + else if(nr==T_GE) return ">="; + else if(nr==T_LE) return "<="; + else if(nr==T_MINUSMINUS) return "--"; + else if(nr==T_PLUSPLUS) return "++"; + else if(nr==KW_IMPLEMENTS) return "implements"; + else if(nr==KW_INTERFACE) return "interface"; + else if(nr==KW_NAMESPACE) return "namespace"; + else if(nr==KW_PROTECTED) return "protected"; + else if(nr==KW_OVERRIDE) return "override"; + else if(nr==KW_INTERNAL) return "internal"; + else if(nr==KW_FUNCTION) return "function"; + else if(nr==KW_PACKAGE) return "package"; + else if(nr==KW_PRIVATE) return "private"; + else if(nr==KW_BOOLEAN) return "Boolean"; + else if(nr==KW_DYNAMIC) return "dynamic"; + else if(nr==KW_EXTENDS) return "extends"; + else if(nr==KW_PUBLIC) return "public"; + else if(nr==KW_NATIVE) return "native"; + else if(nr==KW_STATIC) return "static"; + else if(nr==KW_IMPORT) return "import"; + else if(nr==KW_NUMBER) return "number"; + else if(nr==KW_CLASS) return "class"; + else if(nr==KW_CONST) return "const"; + else if(nr==KW_FINAL) return "final"; + else if(nr==KW_FALSE) return "False"; + else if(nr==KW_TRUE) return "True"; + else if(nr==KW_UINT) return "uint"; + else if(nr==KW_NULL) return "null"; + else if(nr==KW_ELSE) return "else"; + else if(nr==KW_USE) return "use"; + else if(nr==KW_INT) return "int"; + else if(nr==KW_NEW) return "new"; + else if(nr==KW_GET) return "get"; + else if(nr==KW_SET) return "set"; + else if(nr==KW_VAR) return "var"; + else if(nr==KW_IS) return "is"; + else if(nr==KW_AS) return "as"; + else { + sprintf(mbuf, "%d", nr); + return mbuf; + } +} + +void tokenizer_begin_xml() +{ + dbg("begin reading xml"); + BEGIN(XML); +} +void tokenizer_begin_xmltext() +{ + dbg("begin reading xml text"); + BEGIN(XMLTEXT); +} +void tokenizer_end_xmltext() +{ + dbg("end reading xml text"); + BEGIN(XML); +} +void tokenizer_end_xml() +{ + dbg("end reading xml"); + BEGIN(DEFAULT); +} + +void initialize_scanner() +{ + BEGIN(BEGINNING); +} + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/base64.c b/fluidbook/tools/swftools-special-swfdump/lib/base64.c new file mode 100644 index 000000000..3c5d22fb0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/base64.c @@ -0,0 +1,65 @@ +/* base64.c + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 +*/ + +#include +#include +#include +#include "base64.h" + +static const char base64[65]= +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +void write_base64(FILE*fi, const char* s) +{ + const unsigned char*b = (const unsigned char*)s; + const unsigned char*end = b + strlen(b); + const unsigned char*end_minus_3 = end - 3; + + while(b <= end_minus_3) { + char data[4]; + data[0] = base64[(b[0]>>2)&63 ]; + data[1] = base64[(b[0]<<4|b[1]>>4)&63]; + data[2] = base64[(b[1]<<2|b[2]>>6)&63]; + data[3] = base64[(b[2])&63 ]; + fwrite(data, 4, 1, fi); + b += 3; + } + + unsigned char data[4]; + switch(end - b) { + case 0: + return; //done + case 1: + data[0] = base64[(b[0]>>2)&63]; + data[1] = base64[(b[0]<<4)&63]; + data[2] = '='; + data[3] = '='; + break; + case 2: + data[0] = base64[(b[0]>>2)&63]; + data[1] = base64[(b[0]<<4|b[1]>>4)&63]; + data[2] = base64[(b[1]<<2)&63]; + data[3] = '='; + break; + default: + fprintf(stderr, "internal error in base64 implementation (%d)\n", end-b); + break; + } + fwrite(data, 4, 1, fi); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/base64.h b/fluidbook/tools/swftools-special-swfdump/lib/base64.h new file mode 100644 index 000000000..6921c15a0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/base64.h @@ -0,0 +1,25 @@ +/* base64.h + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef __base64_h__ +#define __base64_h__ + +void write_base64(FILE*fi, const char* s); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/bitio.c b/fluidbook/tools/swftools-special-swfdump/lib/bitio.c new file mode 100644 index 000000000..b84ebe86c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/bitio.c @@ -0,0 +1,871 @@ +/* bitio.c + part of swftools + implementation of bitio.h. + + Copyright (C) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#include +#include +#define __USE_LARGEFILE64 +#include +#include + +#include "../config.h" + +#ifdef HAVE_ZLIB +#include +#define ZLIB_BUFFER_SIZE 16384 +#endif +#include "./bitio.h" + +/* ---------------------------- null reader ------------------------------- */ + +static int reader_nullread(reader_t*r, void* data, int len) +{ + memset(data, 0, len); + return len; +} +static void reader_nullread_dealloc(reader_t*r) +{ + memset(r, 0, sizeof(reader_t)); +} +static int reader_nullseek(reader_t*r, int pos) +{ + return pos; +} +void reader_init_nullreader(reader_t*r) +{ + r->read = reader_nullread; + r->seek = reader_nullseek; + r->dealloc = reader_nullread_dealloc; + r->internal = 0; + r->type = READER_TYPE_NULL; + r->mybyte = 0; + r->bitpos = 8; + r->pos = 0; +} +/* ---------------------------- file reader ------------------------------- */ + +static int reader_fileread(reader_t*reader, void* data, int len) +{ + int ret = read((int)reader->internal, data, len); + if(ret>=0) + reader->pos += ret; + return ret; +} +static void reader_fileread_dealloc(reader_t*r) +{ + if(r->type == READER_TYPE_FILE2) { + close((ptroff_t)r->internal); + } + memset(r, 0, sizeof(reader_t)); +} +static int reader_fileread_seek(reader_t*r, int pos) +{ + return lseek((ptroff_t)r->internal, pos, SEEK_SET); +} +void reader_init_filereader(reader_t*r, int handle) +{ + r->read = reader_fileread; + r->seek = reader_fileread_seek; + r->dealloc = reader_fileread_dealloc; + r->internal = (void*)handle; + r->type = READER_TYPE_FILE; + r->mybyte = 0; + r->bitpos = 8; + r->pos = 0; +} +void reader_init_filereader2(reader_t*r, const char*filename) +{ +#ifdef HAVE_OPEN64 + int fi = open64 +#else + int fi = open +#endif + (filename, +#ifdef O_BINARY + O_BINARY| +#endif + O_RDONLY); + reader_init_filereader(r, fi); + r->type = READER_TYPE_FILE2; +} + +/* ---------------------------- mem reader ------------------------------- */ + +typedef struct _memread +{ + unsigned char*data; + int length; +} memread_t; + +static int reader_memread(reader_t*reader, void* data, int len) +{ + memread_t*mr = (memread_t*)reader->internal; + + if(mr->length - reader->pos < len) { + len = mr->length - reader->pos; + } + if(!len) return 0; + memcpy(data, &mr->data[reader->pos], len); + reader->pos += len; + return len; +} +static int reader_memseek(reader_t*reader, int pos) +{ + memread_t*mr = (memread_t*)reader->internal; + if(pos>=0 && pos<=mr->length) { + reader->pos = pos; + return pos; + } else { + return -1; + } +} +static void reader_memread_dealloc(reader_t*reader) +{ + if(reader->internal) + free(reader->internal); + memset(reader, 0, sizeof(reader_t)); +} +void reader_init_memreader(reader_t*r, void*newdata, int newlength) +{ + memread_t*mr = (memread_t*)malloc(sizeof(memread_t)); + mr->data = (unsigned char*)newdata; + mr->length = newlength; + r->read = reader_memread; + r->seek = reader_memseek; + r->dealloc = reader_memread_dealloc; + r->internal = (void*)mr; + r->type = READER_TYPE_MEM; + r->mybyte = 0; + r->bitpos = 8; + r->pos = 0; +} + +/* ---------------------------- zzip reader ------------------------------ */ +#ifdef HAVE_ZZIP +static int reader_zzip_read(reader_t*reader, void* data, int len) +{ + return zzip_file_read((ZZIP_FILE*)reader->internal, data, len); +} +static void reader_zzip_dealloc(reader_t*reader) +{ + memset(reader, 0, sizeof(reader_t)); +} +static int reader_zzip_seek(reader_t*reader, int pos) +{ + return zzip_seek((ZZIP_FILE*)reader->internal, pos, SEEK_SET); +} +void reader_init_zzipreader(reader_t*r,ZZIP_FILE*z) +{ + r->read = reader_zzip_read; + r->seek = reader_zzip_seek; + r->dealloc = reader_zzip_dealloc; + r->internal = z; + r->type = READER_TYPE_ZZIP; + r->mybyte = 0; + r->bitpos = 8; + r->pos = 0; +} +#endif + +/* ---------------------------- mem writer ------------------------------- */ + +typedef struct _memwrite +{ + unsigned char*data; + int length; +} memwrite_t; + +static int writer_memwrite_write(writer_t*w, void* data, int len) +{ + memwrite_t*mw = (memwrite_t*)w->internal; + if(mw->length - w->pos > len) { + memcpy(&mw->data[w->pos], data, len); + w->pos += len; + return len; + } else { + memcpy(&mw->data[w->pos], data, mw->length - w->pos); + w->pos = mw->length; + return mw->length - w->pos; + } +} +static void writer_memwrite_finish(writer_t*w) +{ + if(w->internal) + free(w->internal); + w->internal = 0; +} +static void dummy_flush(writer_t*w) +{ +} +void writer_init_memwriter(writer_t*w, void*data, int len) +{ + memwrite_t *mr; + mr = (memwrite_t*)malloc(sizeof(memwrite_t)); + mr->data = (unsigned char *)data; + mr->length = len; + memset(w, 0, sizeof(writer_t)); + w->write = writer_memwrite_write; + w->flush = dummy_flush; + w->finish = writer_memwrite_finish; + w->internal = (void*)mr; + w->type = WRITER_TYPE_MEM; + w->bitpos = 0; + w->mybyte = 0; + w->pos = 0; +} + +/* ------------------------- growing mem writer ------------------------------- */ + +typedef struct _growmemwrite +{ + unsigned char*data; + int length; + U32 grow; +} growmemwrite_t; +static int writer_growmemwrite_write(writer_t*w, void* data, int len) +{ + growmemwrite_t*mw = (growmemwrite_t*)w->internal; + if(!mw->data) { + fprintf(stderr, "Illegal write operation: data already given away"); + exit(1); + } + if(mw->length - w->pos < len) { + int newlength = mw->length; + while(newlength - w->pos < len) { + newlength += mw->grow; + } +#ifdef NO_REALLOC + unsigned char*newmem = (unsigned char*)malloc(newlength); + memcpy(newmem, mw->data, mw->length); + free(mw->data); + mw->data = newmem; +#else + mw->data = (unsigned char*)realloc(mw->data, newlength); +#endif + mw->length = newlength; + } + memcpy(&mw->data[w->pos], data, len); + w->pos += len; + return len; +} +static void writer_growmemwrite_finish(writer_t*w) +{ + growmemwrite_t*mw = (growmemwrite_t*)w->internal; + if(mw->data) { + free(mw->data);mw->data = 0; + } + mw->length = 0; + free(w->internal);mw=0; + memset(w, 0, sizeof(writer_t)); +} +void* writer_growmemwrite_memptr(writer_t*w, int*len) +{ + growmemwrite_t*mw = (growmemwrite_t*)w->internal; + if(len) { + *len = w->pos; + } + return mw->data; +} +void* writer_growmemwrite_getmem(writer_t*w) +{ + growmemwrite_t*mw = (growmemwrite_t*)w->internal; + void*ret = mw->data; + /* remove own reference so that neither write() nor finish() can free it. + It's property of the caller now. + */ + mw->data = 0; + return ret; +} +void writer_growmemwrite_reset(writer_t*w) +{ + growmemwrite_t*mw = (growmemwrite_t*)w->internal; + w->pos = 0; + w->bitpos = 0; + w->mybyte = 0; +} +void writer_init_growingmemwriter(writer_t*w, U32 grow) +{ + growmemwrite_t *mw = (growmemwrite_t *)malloc(sizeof(growmemwrite_t)); + mw->length = 4096; + mw->data = (unsigned char *)malloc(mw->length); + mw->grow = grow; + memset(w, 0, sizeof(writer_t)); + w->write = writer_growmemwrite_write; + w->flush = dummy_flush; + w->finish = writer_growmemwrite_finish; + w->internal = (void*)mw; + w->type = WRITER_TYPE_GROWING_MEM; + w->bitpos = 0; + w->mybyte = 0; + w->pos = 0; +} + +/* ---------------------------- file writer ------------------------------- */ + +typedef struct _filewrite +{ + int handle; + char free_handle; +} filewrite_t; + +static int writer_filewrite_write(writer_t*w, void* data, int len) +{ + filewrite_t * fw= (filewrite_t*)w->internal; + w->pos += len; + return write(fw->handle, data, len); +} +static void writer_filewrite_finish(writer_t*w) +{ + filewrite_t *mr = (filewrite_t*)w->internal; + if(mr->free_handle) + close(mr->handle); + free(w->internal); + memset(w, 0, sizeof(writer_t)); +} +void writer_init_filewriter(writer_t*w, int handle) +{ + filewrite_t *mr = (filewrite_t *)malloc(sizeof(filewrite_t)); + mr->handle = handle; + mr->free_handle = 0; + memset(w, 0, sizeof(writer_t)); + w->write = writer_filewrite_write; + w->finish = writer_filewrite_finish; + w->internal = mr; + w->type = WRITER_TYPE_FILE; + w->bitpos = 0; + w->mybyte = 0; + w->pos = 0; +} +void writer_init_filewriter2(writer_t*w, char*filename) +{ +#ifdef HAVE_OPEN64 + int fi = open64 +#else + int fi = open +#endif + (filename, +#ifdef O_BINARY + O_BINARY| +#endif + O_WRONLY|O_CREAT|O_TRUNC, 0644); + writer_init_filewriter(w, fi); + ((filewrite_t*)w->internal)->free_handle = 1; +} + +/* ---------------------------- null writer ------------------------------- */ + +static int writer_nullwrite_write(writer_t*w, void* data, int len) +{ + w->pos += len; + return len; +} +static void writer_nullwrite_finish(writer_t*w) +{ + memset(w, 0, sizeof(writer_t)); +} +void writer_init_nullwriter(writer_t*w) +{ + memset(w, 0, sizeof(writer_t)); + w->write = writer_nullwrite_write; + w->flush = dummy_flush; + w->finish = writer_nullwrite_finish; + w->internal = 0; + w->type = WRITER_TYPE_NULL; + w->bitpos = 0; + w->mybyte = 0; + w->pos = 0; +} +/* ---------------------------- zlibinflate reader -------------------------- */ + +typedef struct _zlibinflate +{ +#ifdef HAVE_ZLIB + z_stream zs; + reader_t*input; + unsigned char readbuffer[ZLIB_BUFFER_SIZE]; +#endif +} zlibinflate_t; + +#ifdef HAVE_ZLIB +static void zlib_error(int ret, char* msg, z_stream*zs) +{ + fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n", + msg, + ret, + zs->msg?zs->msg:"unknown"); + if(errno) perror("errno:"); + exit(1); +} +#endif + +static int reader_zlibinflate(reader_t*reader, void* data, int len) +{ +#ifdef HAVE_ZLIB + zlibinflate_t*z = (zlibinflate_t*)reader->internal; + int ret; + if(!z) { + return 0; + } + if(!len) + return 0; + + z->zs.next_out = (Bytef *)data; + z->zs.avail_out = len; + + while(1) { + if(!z->zs.avail_in) { + z->zs.avail_in = z->input->read(z->input, z->readbuffer, ZLIB_BUFFER_SIZE); + z->zs.next_in = z->readbuffer; + } + if(z->zs.avail_in) + ret = inflate(&z->zs, Z_NO_FLUSH); + else + ret = inflate(&z->zs, Z_FINISH); + + if (ret != Z_OK && + ret != Z_STREAM_END) zlib_error(ret, "bitio:inflate_inflate", &z->zs); + + if (ret == Z_STREAM_END) { + int pos = z->zs.next_out - (Bytef*)data; + ret = inflateEnd(&z->zs); + if (ret != Z_OK) zlib_error(ret, "bitio:inflate_end", &z->zs); + free(reader->internal); + reader->internal = 0; + reader->pos += pos; + return pos; + } + if(!z->zs.avail_out) { + break; + } + } + reader->pos += len; + return len; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif +} +static int reader_zlibseek(reader_t*reader, int pos) +{ + fprintf(stderr, "Erro: seeking not supported for zlib streams"); + return -1; +} +static void reader_zlibinflate_dealloc(reader_t*reader) +{ +#ifdef HAVE_ZLIB + zlibinflate_t*z = (zlibinflate_t*)reader->internal; + /* test whether read() already did basic deallocation */ + if(reader->internal) { + inflateEnd(&z->zs); + free(reader->internal); + } + memset(reader, 0, sizeof(reader_t)); +#endif +} +void reader_init_zlibinflate(reader_t*r, reader_t*input) +{ +#ifdef HAVE_ZLIB + zlibinflate_t*z = (zlibinflate_t*)malloc(sizeof(zlibinflate_t)); + memset(z, 0, sizeof(zlibinflate_t)); + int ret; + memset(r, 0, sizeof(reader_t)); + r->internal = z; + r->read = reader_zlibinflate; + r->seek = reader_zlibseek; + r->dealloc = reader_zlibinflate_dealloc; + r->type = READER_TYPE_ZLIB; + r->pos = 0; + z->input = input; + memset(&z->zs,0,sizeof(z_stream)); + z->zs.zalloc = Z_NULL; + z->zs.zfree = Z_NULL; + z->zs.opaque = Z_NULL; + ret = inflateInit(&z->zs); + if (ret != Z_OK) zlib_error(ret, "bitio:inflate_init", &z->zs); + reader_resetbits(r); +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif +} + +/* ---------------------------- zlibdeflate writer -------------------------- */ + +typedef struct _zlibdeflate +{ +#ifdef HAVE_ZLIB + z_stream zs; + writer_t*output; + unsigned char writebuffer[ZLIB_BUFFER_SIZE]; +#endif +} zlibdeflate_t; + +static int writer_zlibdeflate_write(writer_t*writer, void* data, int len) +{ +#ifdef HAVE_ZLIB + zlibdeflate_t*z = (zlibdeflate_t*)writer->internal; + int ret; + if(writer->type != WRITER_TYPE_ZLIB) { + fprintf(stderr, "Wrong writer ID (writer not initialized?)\n"); + return 0; + } + if(!z) { + fprintf(stderr, "zlib not initialized!\n"); + return 0; + } + if(!len) + return 0; + + z->zs.next_in = (Bytef *)data; + z->zs.avail_in = len; + + while(1) { + ret = deflate(&z->zs, Z_NO_FLUSH); + + if (ret != Z_OK) zlib_error(ret, "bitio:deflate_deflate", &z->zs); + + if(z->zs.next_out != z->writebuffer) { + writer->pos += z->zs.next_out - (Bytef*)z->writebuffer; + z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); + z->zs.next_out = z->writebuffer; + z->zs.avail_out = ZLIB_BUFFER_SIZE; + } + + if(!z->zs.avail_in) { + break; + } + } + return len; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif +} + +void writer_zlibdeflate_flush(writer_t*writer) +{ +#ifdef HAVE_ZLIB + zlibdeflate_t*z = (zlibdeflate_t*)writer->internal; + int ret; + if(writer->type != WRITER_TYPE_ZLIB) { + fprintf(stderr, "Wrong writer ID (writer not initialized?)\n"); + return; + } + if(!z) { + fprintf(stderr, "zlib not initialized!\n"); + return; + } + + z->zs.next_in = 0; + z->zs.avail_in = 0; + while(1) { + ret = deflate(&z->zs, Z_SYNC_FLUSH); + if (ret != Z_OK) zlib_error(ret, "bitio:deflate_flush", &z->zs); + if(z->zs.next_out != z->writebuffer) { + writer->pos += z->zs.next_out - (Bytef*)z->writebuffer; + z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); + z->zs.next_out = z->writebuffer; + z->zs.avail_out = ZLIB_BUFFER_SIZE; + } + /* TODO: how will zlib let us know it needs more buffer space? */ + break; + } + return; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif +} + +static void writer_zlibdeflate_finish(writer_t*writer) +{ +#ifdef HAVE_ZLIB + zlibdeflate_t*z = (zlibdeflate_t*)writer->internal; + writer_t*output; + int ret; + if(writer->type != WRITER_TYPE_ZLIB) { + fprintf(stderr, "Wrong writer ID (writer not initialized?)\n"); + return; + } + if(!z) + return; + output= z->output; + while(1) { + ret = deflate(&z->zs, Z_FINISH); + if (ret != Z_OK && + ret != Z_STREAM_END) zlib_error(ret, "bitio:deflate_finish", &z->zs); + + if(z->zs.next_out != z->writebuffer) { + writer->pos += z->zs.next_out - (Bytef*)z->writebuffer; + z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); + z->zs.next_out = z->writebuffer; + z->zs.avail_out = ZLIB_BUFFER_SIZE; + } + + if (ret == Z_STREAM_END) { + break; + + } + } + ret = deflateEnd(&z->zs); + if (ret != Z_OK) zlib_error(ret, "bitio:deflate_end", &z->zs); + free(writer->internal); + memset(writer, 0, sizeof(writer_t)); + //output->finish(output); +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif +} +void writer_init_zlibdeflate(writer_t*w, writer_t*output) +{ +#ifdef HAVE_ZLIB + zlibdeflate_t*z; + int ret; + memset(w, 0, sizeof(writer_t)); + z = (zlibdeflate_t*)malloc(sizeof(zlibdeflate_t)); + memset(z, 0, sizeof(zlibdeflate_t)); + w->internal = z; + w->write = writer_zlibdeflate_write; + w->flush = writer_zlibdeflate_flush; + w->finish = writer_zlibdeflate_finish; + w->type = WRITER_TYPE_ZLIB; + w->pos = 0; + z->output = output; + memset(&z->zs,0,sizeof(z_stream)); + z->zs.zalloc = Z_NULL; + z->zs.zfree = Z_NULL; + z->zs.opaque = Z_NULL; + ret = deflateInit(&z->zs, 9); + if (ret != Z_OK) zlib_error(ret, "bitio:deflate_init", &z->zs); + w->bitpos = 0; + w->mybyte = 0; + z->zs.next_out = z->writebuffer; + z->zs.avail_out = ZLIB_BUFFER_SIZE; +#else + fprintf(stderr, "Error: swftools was compiled without zlib support"); + exit(1); +#endif +} + +/* ----------------------- bit handling routines -------------------------- */ + +void writer_writebit(writer_t*w, int bit) +{ + if(w->bitpos==8) + { + w->write(w, &w->mybyte, 1); + w->bitpos = 0; + w->mybyte = 0; + } + if(bit&1) + w->mybyte |= 1 << (7 - w->bitpos); + w->bitpos ++; +} +void writer_writebits(writer_t*w, unsigned int data, int bits) +{ + int t; + for(t=0;t> (bits-t-1))&1); + } +} +void writer_resetbits(writer_t*w) +{ + if(w->bitpos) + w->write(w, &w->mybyte, 1); + w->bitpos = 0; + w->mybyte = 0; +} + +unsigned int reader_readbit(reader_t*r) +{ + if(r->bitpos==8) + { + r->bitpos=0; + r->read(r, &r->mybyte, 1); + } + return (r->mybyte>>(7-r->bitpos++))&1; +} +unsigned int reader_readbits(reader_t*r, int num) +{ + int t; + int val = 0; + for(t=0;tmybyte = 0; + r->bitpos = 8; + +} + +U8 reader_readU8(reader_t*r) +{ + U8 b = 0; + if(r->read(r, &b, 1)<1) { + fprintf(stderr, "bitio.c:reader_readU8: Read over end of memory region\n"); + } + return b; +} +U16 reader_readU16(reader_t*r) +{ + U8 b1=0,b2=0; + if(r->read(r, &b1, 1)<1) { + fprintf(stderr, "bitio.c:reader_readU16: Read over end of memory region\n"); + } + if(r->read(r, &b2, 1)<1) { + fprintf(stderr, "bitio.c:reader_readU16: Read over end of memory region\n"); + } + return b1|b2<<8; +} +U32 reader_readU32(reader_t*r) +{ + U8 b1=0,b2=0,b3=0,b4=0; + if(r->read(r, &b1, 1)<1) + fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); + if(r->read(r, &b2, 1)<1) + fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); + if(r->read(r, &b3, 1)<1) + fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); + if(r->read(r, &b4, 1)<1) + fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); + return b1|b2<<8|b3<<16|b4<<24; +} + +float reader_readFloat(reader_t*r) +{ + float f; + r->read(r, &f, 4); + return f; + + U8 b1=0,b2=0,b3=0,b4=0; + r->read(r, &b1, 1); + r->read(r, &b2, 1); + r->read(r, &b3, 1); + r->read(r, &b4, 1); + U32 w = (b1|b2<<8|b3<<16|b4<<24); + return *(float*)&w; +} +double reader_readDouble(reader_t*r) +{ + double f; + r->read(r, &f, 8); + return f; + + U8 b[8]; + r->read(r, b, 8); + U64 w = ((U64)b[0]|(U64)b[1]<<8|(U64)b[2]<<16|(U64)b[3]<<24|(U64)b[4]<<32|(U64)b[5]<<40|(U64)b[6]<<48|(U64)b[7]<<56); + return *(double*)&w; +} +char*reader_readString(reader_t*r) +{ + writer_t g; + writer_init_growingmemwriter(&g, 16); + while(1) { + U8 b = reader_readU8(r); + writer_writeU8(&g, b); + if(!b) + break; + } + char*string = (char*)writer_growmemwrite_getmem(&g); + g.finish(&g); + return string; +} + +void writer_writeString(writer_t*w, const char*s) +{ + int l = strlen(s); + char zero = 0; + w->write(w, (void*)s, l); + w->write(w, &zero, 1); +} +void writer_writeU8(writer_t*w, unsigned char b) +{ + w->write(w, &b, 1); +} +void writer_writeU16(writer_t*w, unsigned short v) +{ + unsigned char b1 = v; + unsigned char b2 = v>>8; + w->write(w, &b1, 1); + w->write(w, &b2, 1); +} +void writer_writeU32(writer_t*w, unsigned long v) +{ + unsigned char b1 = v; + unsigned char b2 = v>>8; + unsigned char b3 = v>>16; + unsigned char b4 = v>>24; + w->write(w, &b1, 1); + w->write(w, &b2, 1); + w->write(w, &b3, 1); + w->write(w, &b4, 1); +} +void writer_writeFloat(writer_t*w, float f) +{ + w->write(w, &f, 4); + return; + + unsigned v = *(unsigned*)&f; + unsigned char b1 = v; + unsigned char b2 = v>>8; + unsigned char b3 = v>>16; + unsigned char b4 = v>>24; + w->write(w, &b1, 1); + w->write(w, &b2, 1); + w->write(w, &b3, 1); + w->write(w, &b4, 1); +} +void writer_writeDouble(writer_t*w, double f) +{ + w->write(w, &f, 8); + return; + + unsigned long long v = *(unsigned long long*)&f; + unsigned char b1 = v; + unsigned char b2 = v>>8; + unsigned char b3 = v>>16; + unsigned char b4 = v>>24; + unsigned char b5 = v>>32; + unsigned char b6 = v>>40; + unsigned char b7 = v>>48; + unsigned char b8 = v>>56; + w->write(w, &b1, 1); + w->write(w, &b2, 1); + w->write(w, &b3, 1); + w->write(w, &b4, 1); + w->write(w, &b5, 1); + w->write(w, &b6, 1); + w->write(w, &b7, 1); + w->write(w, &b8, 1); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/bitio.h b/fluidbook/tools/swftools-special-swfdump/lib/bitio.h new file mode 100644 index 000000000..cf6a3cb45 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/bitio.h @@ -0,0 +1,120 @@ +/* bitio.h + Generic object-oriented reading/writing. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include "types.h" +#include "../config.h" + +#ifdef HAVE_ZZIP +#include "zzip/lib.h" +#endif + +#ifndef __rfxswf_bitio_h__ +#define __rfxswf_bitio_h__ + +#define READER_TYPE_FILE 1 +#define READER_TYPE_MEM 2 +#define READER_TYPE_ZLIB_U 3 +#define READER_TYPE_ZLIB_C 4 +#define READER_TYPE_ZLIB READER_TYPE_ZLIB_U +#define READER_TYPE_NULL 5 +#define READER_TYPE_FILE2 6 +#define READER_TYPE_ZZIP 7 + +#define WRITER_TYPE_FILE 1 +#define WRITER_TYPE_MEM 2 +#define WRITER_TYPE_ZLIB_C 3 +#define WRITER_TYPE_ZLIB_U 4 +#define WRITER_TYPE_NULL 5 +#define WRITER_TYPE_GROWING_MEM 6 +#define WRITER_TYPE_ZLIB WRITER_TYPE_ZLIB_C + +typedef struct _reader +{ + int (*read)(struct _reader*, void*data, int len); + int (*seek)(struct _reader*, int pos); + void (*dealloc)(struct _reader*); + + void *internal; + int type; + unsigned char mybyte; + unsigned char bitpos; + int pos; +} reader_t; + +typedef struct _writer +{ + int (*write)(struct _writer*, void*data, int len); + void (*flush)(struct _writer*); + void (*finish)(struct _writer*); + + void *internal; + int type; + unsigned char mybyte; + unsigned char bitpos; + int pos; +} writer_t; + +void reader_resetbits(reader_t*r); +unsigned int reader_readbit(reader_t*r); +unsigned int reader_readbits(reader_t*r, int num); + +U8 reader_readU8(reader_t*r); +U16 reader_readU16(reader_t*r); +U32 reader_readU32(reader_t*r); +float reader_readFloat(reader_t*r); +double reader_readDouble(reader_t*r); +char*reader_readString(reader_t*r); + +void writer_resetbits(writer_t*w); +void writer_writebit(writer_t*w, int bit); +void writer_writebits(writer_t*w, unsigned int data, int bits); + +void writer_writeU8(writer_t*w, unsigned char b); +void writer_writeU16(writer_t*w, unsigned short v); +void writer_writeU32(writer_t*w, unsigned long v); +void writer_writeFloat(writer_t*w, float f); +void writer_writeDouble(writer_t*w, double f); +void writer_writeString(writer_t*w, const char*s); + +/* standard readers / writers */ + +void reader_init_filereader(reader_t*r, int handle); +void reader_init_filereader2(reader_t*r, const char*filename); +void reader_init_zlibinflate(reader_t*r, reader_t*input); +void reader_init_memreader(reader_t*r, void*data, int length); +void reader_init_nullreader(reader_t*r); +#ifdef HAVE_ZZIP +void reader_init_zzipreader(reader_t*r,ZZIP_FILE*z); +#endif + +void writer_init_filewriter(writer_t*w, int handle); +void writer_init_filewriter2(writer_t*w, char*filename); +void writer_init_zlibdeflate(writer_t*w, writer_t*output); +void writer_init_memwriter(writer_t*r, void*data, int length); +void writer_init_nullwriter(writer_t*w); + +void writer_init_growingmemwriter(writer_t*r, U32 grow); +void* writer_growmemwrite_memptr(writer_t*w, int*len); +void* writer_growmemwrite_getmem(writer_t*w); +void writer_growmemwrite_reset(writer_t*w); + +#endif //__rfxswf_bitio_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c new file mode 100644 index 000000000..8b729c116 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c @@ -0,0 +1,178 @@ +/* bbox.c + + Part of the swftools package. + + Copyright (c) 2006 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include "../types.h" +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" + +typedef struct _internal { + gfxbbox_t bbox; + int do_graphics; + int do_text; +} internal_t; + +void measuregfxline(internal_t*i, gfxline_t*line) +{ + gfxbbox_t b = gfxline_getbbox(line); + if(b.xmin==0 && b.ymin==0 && b.xmax==0 && b.ymax==0) { + return; + } + i->bbox = gfxbbox_expand_to_point(i->bbox, b.xmin, b.ymin); + i->bbox = gfxbbox_expand_to_point(i->bbox, b.xmax, b.ymax); +} + +int bbox_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + if(!strcmp(key, "graphics")) { + i->do_graphics = atoi(value); + return 1; + } else if(!strcmp(key, "text")) { + i->do_text = atoi(value); + return 1; + } + return 0; +} + +void bbox_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + i->bbox.xmin = 0; + i->bbox.ymin = 0; + i->bbox.xmax = 0; + i->bbox.ymax = 0; +} + +void bbox_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void bbox_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void bbox_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->do_graphics) + measuregfxline(i, line); +} + +void bbox_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->do_graphics) + measuregfxline(i, line); +} + +void bbox_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->do_graphics) + measuregfxline(i, line); +} + +void bbox_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->do_graphics) + measuregfxline(i, line); +} + +void bbox_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void bbox_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(!font) + return; + + if(i->do_text) { + gfxglyph_t*glyph = &font->glyphs[glyphnr]; + gfxline_t*line2 = gfxline_clone(glyph->line); + gfxline_transform(line2, matrix); + measuregfxline(i, line2); + gfxline_free(line2); + } +} + +void bbox_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void bbox_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; +} + +gfxresult_t* bbox_finish(gfxdevice_t*dev) +{ + free(dev->internal);dev->internal = 0; + return 0; +} + +gfxbbox_t gfxdevice_bbox_getbbox(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + return i->bbox; +} + +void gfxdevice_bbox_init(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "bbox"; + + dev->internal = i; + + dev->setparameter = bbox_setparameter; + dev->startpage = bbox_startpage; + dev->startclip = bbox_startclip; + dev->endclip = bbox_endclip; + dev->stroke = bbox_stroke; + dev->fill = bbox_fill; + dev->fillbitmap = bbox_fillbitmap; + dev->fillgradient = bbox_fillgradient; + dev->addfont = bbox_addfont; + dev->drawchar = bbox_drawchar; + dev->drawlink = bbox_drawlink; + dev->endpage = bbox_endpage; + dev->finish = bbox_finish; + + i->do_graphics = 1; + i->do_text = 1; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h new file mode 100644 index 000000000..a69803ed1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h @@ -0,0 +1,38 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_bbox_h__ +#define __gfxdevice_bbox_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_bbox_init(gfxdevice_t*self); +gfxbbox_t gfxdevice_bbox_getbbox(gfxdevice_t*self); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_bbox_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c new file mode 100644 index 000000000..43ae1983d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c @@ -0,0 +1,157 @@ +/* dummy.c + + Part of the swftools package. + + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "../types.h" +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" + +typedef struct _internal { + gfxdevice_t*out; +} internal_t; + +int dummy_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) { + return i->out->setparameter(i->out,key,value); + } else { + return 0; + } +} + +void dummy_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->startpage(i->out,width,height); +} +void dummy_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->startclip(i->out,line); +} +void dummy_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->endclip(i->out); +} +void dummy_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); +} + +void dummy_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->fill(i->out, line, color); +} + +void dummy_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->fillbitmap(i->out, line, img, matrix, cxform); +} + +void dummy_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->fillgradient(i->out, line, gradient, type, matrix); +} + +void dummy_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->addfont(i->out, font); +} + +void dummy_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->drawchar(i->out, font, glyphnr, color, matrix); +} + +void dummy_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->drawlink(i->out, line, action, text); +} + +void dummy_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) + i->out->endpage(i->out); +} + +gfxresult_t* dummy_finish(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->out) { + gfxdevice_t*out = i->out; + free(dev->internal);dev->internal = 0;i=0; + return out->finish(out); + } else { + free(dev->internal);dev->internal = 0;i=0; + return 0; + } +} + +void gfxdevice_dummy_init(gfxdevice_t*dev, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "dummy"; + + dev->internal = i; + + dev->setparameter = dummy_setparameter; + dev->startpage = dummy_startpage; + dev->startclip = dummy_startclip; + dev->endclip = dummy_endclip; + dev->stroke = dummy_stroke; + dev->fill = dummy_fill; + dev->fillbitmap = dummy_fillbitmap; + dev->fillgradient = dummy_fillgradient; + dev->addfont = dummy_addfont; + dev->drawchar = dummy_drawchar; + dev->drawlink = dummy_drawlink; + dev->endpage = dummy_endpage; + dev->finish = dummy_finish; + + i->out = out; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h new file mode 100644 index 000000000..ee3e5fbb5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h @@ -0,0 +1,37 @@ +/* dummy.h + Header file for dummy.c + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_dummy_h__ +#define __gfxdevice_dummy_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_dummy_init(gfxdevice_t*dev, gfxdevice_t*out); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_dummy_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/file.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/file.c new file mode 100644 index 000000000..01263aef0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/file.c @@ -0,0 +1,251 @@ +/* gfxdevice_file.cc + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include "../gfxdevice.h" + +typedef struct _internal { + char*filename; + FILE*fi; +} internal_t; + +int file_setparameter(struct _gfxdevice*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "setparameter %s=%s\n", key, value); + return 1; +} + +void file_startpage(struct _gfxdevice*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "startpage %d %d\n", width, height); +} + +static void dumpline(FILE*fi, gfxline_t*line) +{ + while(line) { + if(line->type == gfx_moveTo) { + fprintf(fi, "\tmoveTo %f %f\n", line->x, line->y); + } else if(line->type == gfx_lineTo) { + fprintf(fi, "\tlineTo %f %f\n", line->x, line->y); + } else if(line->type == gfx_splineTo) { + fprintf(fi, "\tsplineTo %f %f %f %f\n", line->sx, line->sy, line->x, line->y); + } + line = line->next; + } +} + +static void dumpmatrix (FILE*fi, gfxmatrix_t*matrix) +{ + fprintf(fi, "| %5.2f %5.2f %5.2f\n", matrix->m00, matrix->m10, matrix->tx); + fprintf(fi, "| %5.2f %5.2f %5.2f\n", matrix->m01, matrix->m11, matrix->ty); +} + +static void dumpgradient (FILE*fi, gfxgradient_t*gradient) +{ + while(gradient) { + fprintf(fi, "pos %f: %02x%02x%02x%02x\n", gradient->pos, gradient->color.r, gradient->color.g, gradient->color.b, gradient->color.a); + gradient = gradient->next; + } +} + +void file_startclip(struct _gfxdevice*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "startclip\n"); + dumpline(i->fi, line); +} + +void file_endclip(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "endclip\n"); +} + +void file_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + char* jointTypes[] = {"joinMiter", "joinRound", "joinBevel"}; + char* capTypes[] = {"capButt", "capRound", "capSquare"}; + + fprintf(i->fi, "stroke %f %f %s %s %02x%02x%02x%02x\n", width, miterLimit, capTypes[cap_style], jointTypes[joint_style], + color->r, color->g, color->b, color->a + ); + dumpline(i->fi, line); +} + +void file_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "fill %02x%02x%02x%02x\n", color->r, color->g, color->b, color->a); + dumpline(i->fi, line); +} + +void file_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "fillbitmap\n"); + dumpmatrix(i->fi, matrix); + dumpline(i->fi, line); +} + +void file_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "fillgradient\n"); + dumpmatrix(i->fi, matrix); + dumpgradient(i->fi, gradient); + dumpline(i->fi, line); +} + +void file_addfont(struct _gfxdevice*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "addfont %s\n", font->id); +} + +void file_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void file_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "drawlink %s\n", action); + dumpline(i->fi, line); +} + +void file_endpage(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + fprintf(i->fi, "endpage\n"); +} + +typedef struct gfxresult_internal +{ + FILE*fi; + char*filename; +} gfxresult_internal_t; + +void fileresult_destroy(struct _gfxresult*gfx) +{ + gfxresult_internal_t*i = (gfxresult_internal_t*)gfx->internal; + unlink(i->filename); + free(i->filename);i->filename = 0; +} + +int fileresult_save(struct _gfxresult*gfx, const char*filename) +{ + gfxresult_internal_t*i = (gfxresult_internal_t*)gfx->internal; + FILE*fi,*fo; + fi = fopen(i->filename, "rb"); + if(!fi) { + perror(i->filename); + return 0; + } + fo = fopen(filename, "wb"); + if(!fo) { + perror(filename); + return 0; + } + + char buf[4096]; + while(!feof(fi)) { + int l = fread(buf, 1, 4096, fi); + if(l>0) { + fwrite(buf, 1, l, fo); + } else { + break; + } + } + + fclose(fi); + fclose(fo); + return 0; +} + +void* fileresult_get(struct _gfxresult*gfx, const char*name) +{ + return 0; +} + +gfxresult_t* file_finish(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + char*filename = strdup(i->filename); + gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); + fclose(i->fi); + i->fi = 0; + if(i->filename) { + free(i->filename); + i->filename = 0; + } + free(dev->internal); + dev->internal = 0; + + memset(result, 0, sizeof(gfxresult_t)); + result->save = fileresult_save; + result->get = fileresult_get; + result->destroy = fileresult_destroy; + result->internal = malloc(sizeof(gfxresult_internal_t)); + ((gfxresult_internal_t*)result->internal)->filename = filename; + + return result; +} + +void gfxdevice_file_init(gfxdevice_t*dev, char*filename) +{ + internal_t*i = (internal_t*)malloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "file"; + + dev->internal = i; + + dev->setparameter = file_setparameter; + dev->startpage = file_startpage; + dev->startclip = file_startclip; + dev->endclip = file_endclip; + dev->stroke = file_stroke; + dev->fill = file_fill; + dev->fillbitmap = file_fillbitmap; + dev->fillgradient = file_fillgradient; + dev->addfont = file_addfont; + dev->drawchar = file_drawchar; + dev->drawlink = file_drawlink; + dev->endpage = file_endpage; + dev->finish = file_finish; + + i->fi = fopen(filename, "wb"); + i->filename = strdup(filename); + if(!i->fi) { + fprintf(stderr, "Couldn't open file %s\n", filename); + exit(1); + } +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/file.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/file.h new file mode 100644 index 000000000..753391676 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/file.h @@ -0,0 +1,38 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_file_h__ +#define __gfxdevice_file_h__ + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../gfxdevice.h" + +void gfxdevice_file_init(gfxdevice_t*, char*filename); + +#ifdef __cplusplus +} +#endif + +#endif //gfxdevice_file_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c new file mode 100644 index 000000000..4326c656f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c @@ -0,0 +1,262 @@ +/* ocr.c + + Part of the swftools package. + + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "../types.h" +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "render.h" + +#include "../gocr/pnm.h" +#include "../gocr/pgm2asc.h" + +typedef struct _textpage { + char*text; + int textpos; + struct _textpage*next; +} textpage_t; + +typedef struct _internal { + gfxdevice_t*render; + int pages; + + textpage_t*first_page; + textpage_t*current_page; +} internal_t; + +int ocr_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + return i->render->setparameter(i->render,key,value); +} + +void ocr_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->render) { + fprintf(stderr, "Call endpage() before calling startpage()\n"); + return; + } + i->render = malloc(sizeof(gfxdevice_t)); + gfxdevice_render_init(i->render); + i->render->startpage(i->render,width,height); + i->pages++; +} +/* passthrough */ +void ocr_startclip(gfxdevice_t*dev, gfxline_t*line) { ((internal_t*)dev->internal)->render->startclip(((internal_t*)dev->internal)->render,line); } +void ocr_endclip(gfxdevice_t*dev) { ((internal_t*)dev->internal)->render->endclip(((internal_t*)dev->internal)->render); } +void ocr_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) { ((internal_t*)dev->internal)->render->stroke(((internal_t*)dev->internal)->render, line, width, color, cap_style, joint_style, miterLimit); } +void ocr_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) { ((internal_t*)dev->internal)->render->fill(((internal_t*)dev->internal)->render, line, color); } +void ocr_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) { ((internal_t*)dev->internal)->render->fillbitmap(((internal_t*)dev->internal)->render, line, img, matrix, cxform); } +void ocr_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) { ((internal_t*)dev->internal)->render->fillgradient(((internal_t*)dev->internal)->render, line, gradient, type, matrix); } +void ocr_addfont(gfxdevice_t*dev, gfxfont_t*font) { ((internal_t*)dev->internal)->render->addfont(((internal_t*)dev->internal)->render, font); } +void ocr_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) { ((internal_t*)dev->internal)->render->drawchar(((internal_t*)dev->internal)->render, font, glyphnr, color, matrix); } +void ocr_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) { ((internal_t*)dev->internal)->render->drawlink(((internal_t*)dev->internal)->render, line, action, text); } + +void ocr_result_write(gfxresult_t*r, int filedesc) +{ + textpage_t*i= (textpage_t*)r->internal; +} +int ocr_result_save(gfxresult_t*r, const char*filename) +{ + textpage_t*i= (textpage_t*)r->internal; + if(!i) { + return 0; // no pages drawn + } + FILE*fi = fopen(filename, "wb"); + if(!fi) + return 0; + while(i) { + fwrite(i->text, i->textpos, 1, fi); + i = i->next; + } + fclose(fi); + return 1; +} + +void*ocr_result_get(gfxresult_t*r, const char*name) +{ + textpage_t*i= (textpage_t*)r->internal; + if(!strcmp(name,"text")) { + textpage_t*j = i; + int len = 0; + while(j) { + len += i->textpos; + j = j->next; + } + char*text = (char*)malloc(len); + int pos = 0; + j = i; + while(j) { + memcpy(&text[pos], i->text, i->textpos); + pos += i->textpos; + j = j->next; + } + text[pos] = 0; + return text; + } else if(!strncmp(name,"page",4)) { + int pagenr = atoi(&name[4]); + if(pagenr<0) + pagenr=0; + while(pagenr>0) { + i = i->next; + if(!i) + return 0; + pagenr++; + } + i->text[i->textpos] = 0; + return strdup(i->text); + } + return 0; +} +void ocr_result_destroy(gfxresult_t*r) +{ + textpage_t*i= (textpage_t*)r->internal; + int t; + r->internal = 0; + while(i) { + textpage_t*next = i->next; + free(i->text);i->text = 0; + free(i); + i = next; + } + free(r); +} + +job_t*JOB; + +void ocr_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->render->endpage(i->render); + + gfxdevice_t*out = i->render; + gfxresult_t* r = out->finish(out); + free(i->render);i->render = 0; + + gfximage_t*img = (gfximage_t*)r->get(r, "page"); + + job_t job; + JOB = &job; + + job_init(&job); + job.cfg.out_format=UTF8; + + job.src.fname = ""; + job.src.p.p = malloc(img->width*img->height); + job.src.p.bpp = 1; + job.src.p.x = img->width; + job.src.p.y = img->height; + int size=img->width*img->height; + int t; + for(t=0;tdata[t].r+img->data[t].g+img->data[t].b)/3; + } + + pgm2asc(&job); + + int linecounter; + const char *line = 0; + int len = 0; + linecounter = 0; + line = getTextLine(linecounter++); + while (line) { + len += strlen(line)+1; + line = getTextLine(linecounter++); + } + + textpage_t*page = malloc(sizeof(textpage_t)); + page->next = 0; + page->text = malloc(len+1); + page->textpos = 0; + if(!i->first_page) { + i->first_page = i->current_page = page; + } else { + i->current_page->next = page; + i->current_page = page; + } + + linecounter = 0; + line = getTextLine(linecounter++); + while (line) { + int l = strlen(line); + memcpy(&page->text[page->textpos], line, l); + page->textpos += l; + page->text[page->textpos++] = '\n'; + + line = getTextLine(linecounter++); + } + page->text[page->textpos++] = 0; + + free_textlines(); + + job_free(&job);JOB=0; + + r->destroy(r); +} + +gfxresult_t* ocr_finish(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + gfxresult_t*r = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); + + r->internal = i->first_page; + r->write = ocr_result_write; + r->save = ocr_result_save; + r->get = ocr_result_get; + r->destroy = ocr_result_destroy; + + free(dev->internal); dev->internal = 0; i = 0; + + return r; +} + +void gfxdevice_ocr_init(gfxdevice_t*dev, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "ocr"; + + dev->internal = i; + + dev->setparameter = ocr_setparameter; + dev->startpage = ocr_startpage; + dev->startclip = ocr_startclip; + dev->endclip = ocr_endclip; + dev->stroke = ocr_stroke; + dev->fill = ocr_fill; + dev->fillbitmap = ocr_fillbitmap; + dev->fillgradient = ocr_fillgradient; + dev->addfont = ocr_addfont; + dev->drawchar = ocr_drawchar; + dev->drawlink = ocr_drawlink; + dev->endpage = ocr_endpage; + dev->finish = ocr_finish; + + i->pages = 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h new file mode 100644 index 000000000..14bd3be12 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h @@ -0,0 +1,37 @@ +/* ocr.h + Header file for ocr.c + + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_ocr_h__ +#define __gfxdevice_ocr_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_ocr_init(gfxdevice_t*dev); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_ocr_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c new file mode 100644 index 000000000..bc0ffeb32 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c @@ -0,0 +1,626 @@ +#include +#include +#include +#include + +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../MD5.h" +#include "../types.h" + +#include +#include +#include +#include + +#include + +//#define ZSTEP (1/65536.0) +#define ZSTEP (1/32.0) +//#define ZSTEP (1/4.0) + +typedef struct _fontlist { + gfxfont_t*font; + struct _fontlist*next; +} fontlist_t; + +typedef struct _internal { + gfxfont_t*font; + char*fontid; + fontlist_t* fontlist; + int width, height; + int currentz; + + int config_polygonoutlines; + + GLUtesselator *tesselator; + GLUtesselator *tesselator_line; + GLUtesselator *tesselator_tex; +} internal_t; + +static int verbose = 0; +static void dbg(char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(!verbose) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(device-opengl) %s\n", buf); + fflush(stdout); +} + +#ifndef CALLBACK +#define CALLBACK +#endif + +typedef void(*callbackfunction_t)(); + +void CALLBACK errorCallback(GLenum errorCode) +{ + const GLubyte *estring; + estring = gluErrorString(errorCode); + printf("Tessellation Error: %s\n", estring); + exit(0); +} +void CALLBACK beginCallback(GLenum which) +{ + glBegin(which); +} +void CALLBACK endCallback(void) +{ + glEnd(); +} +void CALLBACK vertexCallback(GLvoid *vertex) +{ + double*xyz = (GLdouble*)vertex; + glVertex3d(xyz[0],xyz[1],xyz[2]); +} +void CALLBACK combineCallback(GLdouble coords[3], GLdouble *data[4], GLfloat w[4], GLdouble **out) +{ + GLdouble *vertex; + vertex = (GLdouble *) malloc(6 * sizeof(GLdouble)); + vertex[0] = coords[0]; + vertex[1] = coords[1]; + vertex[2] = coords[2]; + *out = vertex; +} +void CALLBACK vertexCallbackTex(GLvoid *vertex) +{ + double*v = (GLdouble*)vertex; + glTexCoord2f(v[3],v[4]); + glVertex3d(v[0],v[1],v[2]); +} +void CALLBACK combineCallbackTex(GLdouble coords[3], GLdouble *data[4], GLfloat w[4], GLdouble **out) +{ + GLdouble *vertex; + vertex = (GLdouble *) malloc(5 * sizeof(GLdouble)); + vertex[0] = coords[0]; + vertex[1] = coords[1]; + vertex[2] = coords[2]; + if(data[2] && data[3]) { + vertex[3] = w[0]*data[0][3] + w[1]*data[1][3] + w[2]*data[2][3] + w[3]*data[3][3]; + vertex[4] = w[0]*data[0][4] + w[1]*data[1][4] + w[2]*data[2][4] + w[3]*data[3][4]; + } else { + vertex[3] = w[0]*data[0][3] + w[1]*data[1][3]; + vertex[4] = w[0]*data[0][4] + w[1]*data[1][4]; + } + *out = vertex; +} + +int opengl_setparameter(struct _gfxdevice*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + dbg("setparameter %s=%s", key, value); + if(!strcmp(key, "polygonoutlines")) { + i->config_polygonoutlines = atoi(value); + } + return 0; +} + +void opengl_startpage(struct _gfxdevice*dev, int width, int height) +{ + dbg("startpage %d %d", width, height); + internal_t*i = (internal_t*)dev->internal; + i->width = width; + i->height = height; + i->currentz = 0; +} + +void opengl_startclip(struct _gfxdevice*dev, gfxline_t*line) +{ + dbg("startclip"); +} + +void opengl_endclip(struct _gfxdevice*dev) +{ + dbg("endclip"); +} + +void opengl_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + dbg("stroke"); + internal_t*i = (internal_t*)dev->internal; + i->currentz++; + char running = 0; + gfxline_t*l=0; + + glColor4f(color->r/255.0, color->g/255.0, color->b/255.0, color->a/255.0); + + //glLineWidth(width*64); + if(width <= 0) { + width = 1.0; + } + glLineWidth(width); + double z = i->currentz*ZSTEP; + + glPolygonOffset(0.0, 500.0); + + l = line; + while(l) { + if(l->type == gfx_moveTo) { + if(running) { + running = 0; + glEnd(); + } + } + if(!running) { + running = 1; + glBegin(GL_LINE_STRIP); + } + glVertex3d(l->x, l->y, z); + l=l->next; + } + if(running) { + running = 0; + glEnd(); + } + glLineWidth(1.0); +} + +#define SPLINE_SUBDIVISION 2 + +void tesselatePolygon(GLUtesselator*tesselator, double z, gfxline_t*line) +{ + int len = 0; + gfxline_t*l=0; + double lastx=0,lasty=0; + double*xyz=0; + char running = 0; + gluTessBeginPolygon(tesselator, NULL); + l = line; + len = 0; + while(l) { + if(l->type == gfx_splineTo) { + double c = sqrt(abs(l->x-2*l->sx+lastx) + abs(l->y-2*l->sy+lasty))*SPLINE_SUBDIVISION; + int steps = (int)c; + if(steps<1) steps = 1; + len += steps; + } else { + len++; + } + l = l->next; + } + //printf("full len:%d\n", len); + xyz = malloc(sizeof(double)*3*len); + l = line; + len = 0; + while(l) { + if(l->type == gfx_moveTo) { + if(running) { + running = 0; + gluTessEndContour(tesselator); + } + } + if(!running) { + running = 1; + gluTessBeginContour(tesselator); + } + + if(l->type == gfx_splineTo) { + int j; + double c = sqrt(abs(l->x-2*l->sx+lastx) + abs(l->y-2*l->sy+lasty))*SPLINE_SUBDIVISION; + int steps = (int)c; + if(steps<1) steps = 1; + //printf("c=%f d1=%f (%f/%f) d2=%f (%f/%f)\n", c,d1,l->x-l->sx,l->y-l->sy,d2,lastx-l->sx,lasty-l->sy); + //printf("%f %f %f\n", lastx, l->sx, l->x); + //printf("%f %f %f\n", lasty, l->sy, l->y); + for(j=1;j<=steps;j++) { + //printf("%d\n", j); + double t = (double)j / (double)steps; + xyz[len*3+0] = lastx*(1-t)*(1-t) + 2*l->sx*(1-t)*t + l->x*t*t; + xyz[len*3+1] = lasty*(1-t)*(1-t) + 2*l->sy*(1-t)*t + l->y*t*t; + xyz[len*3+2] = z; + gluTessVertex(tesselator, &xyz[len*3], &xyz[len*3]); + len++; + } + //printf("%d\n", len); + } else { + xyz[len*3+0] = l->x; + xyz[len*3+1] = l->y; + xyz[len*3+2] = z; + gluTessVertex(tesselator, &xyz[len*3], &xyz[len*3]); + len++; + } + lastx = l->x; + lasty = l->y; + + l=l->next; + } + if(running) { + running = 0; + gluTessEndContour(tesselator); + } + gluTessEndPolygon(tesselator); + free(xyz); +} + +void opengl_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) +{ + double z; + dbg("fill %02x%02x%02x%02x", color->a, color->r, color->g, color->b); + internal_t*i = (internal_t*)dev->internal; + + glDisable(GL_TEXTURE_2D); + glColor4f(color->r/255.0, color->g/255.0, color->b/255.0, color->a/255.0); + + i->currentz ++; + z = (i->currentz*ZSTEP); + tesselatePolygon(i->tesselator, z, line); + + //tesselatePolygon(i->tesselator_line, z, line); +} + +typedef struct _gfxhash +{ + unsigned char d[16]; +} gfxhash_t; + +char gfxhash_compare(gfxhash_t*h1, gfxhash_t*h2) +{ + return !memcmp(h1->d, h2->d, 16); +} + +typedef struct _imgopengl +{ + gfxhash_t hash; + GLuint texID; + int width, height; + unsigned char*data; + struct _imgopengl*next; +} imgopengl_t; + +static imgopengl_t*img2texid = 0; + +static gfxhash_t gfximage_hash(gfximage_t*img) +{ + int t; + int size = img->width*img->height*4; + U8*data = (U8*)img->data; + gfxhash_t hash; + hash_md5(data, size, hash.d); + return hash; +} + +static void delTextures() +{ + imgopengl_t*i = img2texid; + while(i) { + imgopengl_t*next = i->next; + if(i->data) { + glDeleteTextures(1, &i->texID); + free(i->data); + } + memset(i, 0, sizeof(imgopengl_t)); + free(i); + i = next; + } +} + +static imgopengl_t*addTexture(gfximage_t*img) +{ + gfxhash_t hash = gfximage_hash(img); + imgopengl_t*i = img2texid; + + int width_bits = 0; + int height_bits = 0; + while(1<width) + width_bits++; + while(1<height) + height_bits++; + int newwidth = 1<hash) && newwidth==i->width && newheight==i->height) { + return i; + } + i = i->next; + } + + GLuint texIDs[1]; + glGenTextures(1, texIDs); + + i = malloc(sizeof(imgopengl_t)); + i->hash = hash; + i->texID = texIDs[0]; + i->next = img2texid; + img2texid = i; + + i->width = newwidth; + i->height = newheight; + + unsigned char*data = malloc(newwidth*newheight*4); + i->data = data; + int x,y; + for(y=0;yheight;y++) { + for(x=0;xwidth;x++) { + data[(y*newwidth+x)*4+0] = img->data[y*img->width+x].r; + data[(y*newwidth+x)*4+1] = img->data[y*img->width+x].g; + data[(y*newwidth+x)*4+2] = img->data[y*img->width+x].b; + data[(y*newwidth+x)*4+3] = img->data[y*img->width+x].a; + } + int lastx = img->width - 1; + for(;xdata[y*img->width+lastx].r; + data[(y*newwidth+x)*4+1] = img->data[y*img->width+lastx].g; + data[(y*newwidth+x)*4+2] = img->data[y*img->width+lastx].b; + data[(y*newwidth+x)*4+3] = img->data[y*img->width+lastx].a; + } + } + int lasty = img->height - 1; + for(;ydata[lasty*img->width+x].r; + data[(y*newwidth+x)*4+1] = img->data[lasty*img->width+x].g; + data[(y*newwidth+x)*4+2] = img->data[lasty*img->width+x].b; + data[(y*newwidth+x)*4+3] = img->data[lasty*img->width+x].a; + } + } + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, i->texID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, i->width, i->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + + return i; +}; + +void opengl_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + dbg("fillbitmap"); + internal_t*i = (internal_t*)dev->internal; + char running = 0; + int len = 0; + double*xyz=0; + gfxline_t*l=0; + glColor4f(1.0,0,0.7,1.0); + + i->currentz ++; + + imgopengl_t* txt = addTexture(img); + + gfxmatrix_t m2; + gfxmatrix_invert(matrix, &m2); + m2.m00 /= txt->width; + m2.m10 /= txt->width; + m2.tx /= txt->width; + m2.m01 /= txt->height; + m2.m11 /= txt->height; + m2.ty /= txt->height; + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, txt->texID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + gluTessBeginPolygon(i->tesselator_tex, NULL); + l = line; + len = 0; + while(l) { + len++; + l = l->next; + } + xyz = malloc(sizeof(double)*5*len); + l = line; + len = 0; + while(l) { + if(l->type == gfx_moveTo) { + if(running) { + running = 0; + gluTessEndContour(i->tesselator_tex); + } + } + if(!running) { + running = 1; + gluTessBeginContour(i->tesselator_tex); + } + + xyz[len*5+0] = l->x; + xyz[len*5+1] = l->y; + xyz[len*5+2] = (i->currentz*ZSTEP); + xyz[len*5+3] = 0; + xyz[len*5+4] = 0; + gfxmatrix_transform(&m2, /*src*/&xyz[len*5+0], /*dest*/&xyz[len*5+3]); + + gluTessVertex(i->tesselator_tex, &xyz[len*5], &xyz[len*5]); + len++; + + l=l->next; + } + + if(running) { + running = 0; + gluTessEndContour(i->tesselator_tex); + } + gluTessEndPolygon(i->tesselator_tex); + free(xyz); + + glDisable(GL_TEXTURE_2D); +} + +void opengl_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + dbg("fillgradient"); +} + +void opengl_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + + fontlist_t*last=0,*l = i->fontlist; + while(l) { + last = l; + if(!strcmp((char*)l->font->id, font->id)) { + return; // we already know this font + } + l = l->next; + } + l = (fontlist_t*)rfx_calloc(sizeof(fontlist_t)); + l->font = font; + l->next = 0; + if(last) { + last->next = l; + } else { + i->fontlist = l; + } +} + +void opengl_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(!font) + return; + + if(i->font && i->font->id && !strcmp(font->id, i->font->id)) { + // current font is correct + } else { + fontlist_t*l = i->fontlist; + i->font = 0; + while(l) { + if(!strcmp((char*)l->font->id, font->id)) { + i->font = l->font; + break; + } + l = l->next; + } + if(i->font == 0) { + opengl_addfont(dev, font); + i->font = font; + //fprintf(stderr, "Unknown font id: %s", font->id); + //return; + } + } + + gfxglyph_t*glyph = &i->font->glyphs[glyphnr]; + + gfxline_t*line2 = gfxline_clone(glyph->line); + gfxline_transform(line2, matrix); + opengl_fill(dev, line2, color); + gfxline_free(line2); + + i->currentz --; + + return; +} + + + +void opengl_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) +{ + dbg("link"); +} + +void opengl_endpage(struct _gfxdevice*dev) +{ + dbg("endpage"); +} + +int opengl_result_save(struct _gfxresult*gfx, const char*filename) +{ + dbg("result:save"); + return 0; +} +void* opengl_result_get(struct _gfxresult*gfx, const char*name) +{ + dbg("result:get"); + return 0; +} +void opengl_result_destroy(struct _gfxresult*gfx) +{ + dbg("result:destroy"); + free(gfx); + delTextures(); +} + +gfxresult_t*opengl_finish(struct _gfxdevice*dev) +{ + dbg("finish"); + internal_t*i = (internal_t*)dev->internal; + gluDeleteTess(i->tesselator);i->tesselator=0; + gluDeleteTess(i->tesselator_tex);i->tesselator_tex=0; + gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); + memset(result, 0, sizeof(gfxresult_t)); + result->save = opengl_result_save; + result->get = opengl_result_get; + result->destroy = opengl_result_destroy; + return result; +} + +void gfxdevice_opengl_init(gfxdevice_t*dev) +{ + dbg("init"); + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "opengl"; + + dev->internal = i; + + dev->setparameter = opengl_setparameter; + dev->startpage = opengl_startpage; + dev->startclip = opengl_startclip; + dev->endclip = opengl_endclip; + dev->stroke = opengl_stroke; + dev->fill = opengl_fill; + dev->fillbitmap = opengl_fillbitmap; + dev->fillgradient = opengl_fillgradient; + dev->addfont = opengl_addfont; + dev->drawchar = opengl_drawchar; + dev->drawlink = opengl_drawlink; + dev->endpage = opengl_endpage; + dev->finish = opengl_finish; + + i->tesselator = gluNewTess(); + gluTessCallback(i->tesselator, GLU_TESS_ERROR, (callbackfunction_t)errorCallback); + gluTessCallback(i->tesselator, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallback); + gluTessCallback(i->tesselator, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback); + gluTessCallback(i->tesselator, GLU_TESS_END, (callbackfunction_t)endCallback); + gluTessCallback(i->tesselator, GLU_TESS_COMBINE, (callbackfunction_t)combineCallback); + + i->tesselator_line = gluNewTess(); + gluTessCallback(i->tesselator_line, GLU_TESS_ERROR, (callbackfunction_t)errorCallback); + gluTessCallback(i->tesselator_line, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallback); + gluTessCallback(i->tesselator_line, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback); + gluTessCallback(i->tesselator_line, GLU_TESS_END, (callbackfunction_t)endCallback); + gluTessProperty(i->tesselator_line, GLU_TESS_BOUNDARY_ONLY, 1.0); + + i->tesselator_tex = gluNewTess(); + gluTessCallback(i->tesselator_tex, GLU_TESS_ERROR, (callbackfunction_t)errorCallback); + gluTessCallback(i->tesselator_tex, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallbackTex); + gluTessCallback(i->tesselator_tex, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback); + gluTessCallback(i->tesselator_tex, GLU_TESS_END, (callbackfunction_t)endCallback); + gluTessCallback(i->tesselator_tex, GLU_TESS_COMBINE, (callbackfunction_t)combineCallbackTex); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h new file mode 100644 index 000000000..d870127fc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h @@ -0,0 +1,38 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __opengl_h__ +#define __opengl_h__ + +#include "../gfxdevice.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_opengl_init(gfxdevice_t*); + +#ifdef __cplusplus +} +#endif + +#endif //__opengl_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c new file mode 100644 index 000000000..c40dac5e3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c @@ -0,0 +1,195 @@ +/* ops.c + + Part of the swftools package. + + Copyright (c) 2006 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include "../types.h" +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "ops.h" + +typedef struct _internal { + gfxdevice_t*out; + U8 alpha; +} internal_t; + +static int verbose = 1; +static void dbg(char*format, ...) +{ + if(!verbose) + return; + char buf[1024]; + int l; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(device-ops) %s\n", buf); + fflush(stdout); +} + +inline gfxcolor_t transform_color(internal_t*i, gfxcolor_t*col) +{ + gfxcolor_t col2; + /*col2.r = (col->r * i->alpha)>>8; + col2.g = (col->g * i->alpha)>>8; + col2.b = (col->b * i->alpha)>>8;*/ + col2.r = col->r; + col2.g = col->g; + col2.b = col->b; + col2.a = (col->a * i->alpha)/255; + return col2; +} + +int ops_setparameter(struct _gfxdevice*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + return i->out->setparameter(i->out,key,value); +} + +void ops_startpage(struct _gfxdevice*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->startpage(i->out,width,height); +} + +void ops_startclip(struct _gfxdevice*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->startclip(i->out,line); +} + +void ops_endclip(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->endclip(i->out); +} + +void ops_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + gfxcolor_t color2 = transform_color(i, color); + i->out->stroke(i->out, line, width, &color2, cap_style, joint_style, miterLimit); +} + +void ops_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + gfxcolor_t color2 = transform_color(i, color); + i->out->fill(i->out, line, &color2); +} + +void ops_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + gfximage_t img2; + img2.width = img->width; + img2.height = img->height; + img2.data = (gfxcolor_t*)malloc(img->width*img->height*4); + int x,y; + for(y=0;yheight;y++) { + gfxcolor_t*in = &img->data[y*img->width]; + gfxcolor_t*out = &img2.data[y*img->width]; + for(x=0;xwidth;x++) { + out[x] = transform_color(i, &in[x]); + } + } + i->out->fillbitmap(i->out, line, &img2, matrix, cxform); + free(img2.data); +} + +void ops_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->fillgradient(i->out, line, gradient, type, matrix); +} + +void ops_addfont(struct _gfxdevice*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->addfont(i->out, font); +} + +void ops_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + gfxcolor_t color2 = transform_color(i, color); + i->out->drawchar(i->out, font, glyphnr, color, matrix); +} + +void ops_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->drawlink(i->out, line, action, text); +} + +void ops_endpage(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->endpage(i->out); +} + +gfxresult_t* ops_finish(struct _gfxdevice*dev) +{ + if(dev->internal) + free(dev->internal); + dev->internal = 0; + return 0; +} + +void gfxdevice_ops_init(gfxdevice_t*dev, gfxdevice_t*out, U8 alpha) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "ops"; + + dev->internal = i; + + dev->setparameter = ops_setparameter; + dev->startpage = ops_startpage; + dev->startclip = ops_startclip; + dev->endclip = ops_endclip; + dev->stroke = ops_stroke; + dev->fill = ops_fill; + dev->fillbitmap = ops_fillbitmap; + dev->fillgradient = ops_fillgradient; + dev->addfont = ops_addfont; + dev->drawchar = ops_drawchar; + dev->drawlink = ops_drawlink; + dev->endpage = ops_endpage; + dev->finish = ops_finish; + + i->out = out; + i->alpha = alpha; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h new file mode 100644 index 000000000..1739a4b53 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h @@ -0,0 +1,38 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_ops_h__ +#define __gfxdevice_ops_h__ + +#include "../gfxdevice.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_ops_init(gfxdevice_t*self, gfxdevice_t*dest, unsigned char alpha); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_ops_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c new file mode 100644 index 000000000..2e8d4ae43 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c @@ -0,0 +1,597 @@ +/* pdf.c + + Part of the swftools package. + + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "../os.h" +#include "../q.h" +#include "../log.h" +#include "../jpeg.h" +#include "../types.h" +#include "../mem.h" +#include "../log.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../gfximage.h" +#include "../gfxfont.h" + +typedef struct _internal { + PDF* p; + + char config_addblankpages; + double config_xpad; + double config_ypad; + int config_maxdpi; + int config_mindpi; + + int width,height; + int num_pages; + + char*tempfile; + char*page_opts; + double lastx,lasty; + gfxfontlist_t*fontlist; + + char has_matrix; + double m00, m01, m10, m11; +} internal_t; + +static void restore_matrix(internal_t*i) +{ + if(i->has_matrix) { + PDF_restore(i->p); + i->has_matrix=0; + i->m00 = 0; + i->m01 = 0; + i->m10 = 0; + i->m11 = 0; + } +} +static void set_matrix(internal_t*i, double m00, double m01, double m10, double m11) +{ + restore_matrix(i); + + i->m00 = m00; + i->m01 = m01; + i->m10 = m10; + i->m11 = m11; + + PDF_save(i->p); + PDF_setmatrix(i->p, m00, -m01, m10, -m11, 0, i->height+2*i->config_ypad); + i->has_matrix = 1; +} +static void reset_matrix(internal_t*i) +{ + set_matrix(i, 1.0, 0.0, 0.0, 1.0); +} +static void transform_back(internal_t*i, double x, double y, double *ox, double *oy) +{ + double det = i->m00*i->m11 - i->m10*i->m01; + if(!det) { + msg(" Codependent text matrix"); + *ox=*oy=0; + return; + } + *ox = (x*i->m11 - i->m10*y)/det; + *oy = (i->m00*y - x*i->m01)/det; +} + +void pdf_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + + if(!i->tempfile) { + i->tempfile = strdup(mktempname(0, "pdf")); + + PDF_begin_document(i->p, i->tempfile, 0, ""); + //PDF_set_value(i->p, "compress", 0); + PDF_set_parameter(i->p, "usercoordinates", "true"); + PDF_set_parameter(i->p, "topdown", "true"); + } + + int width_plus_pad = width+floor(i->config_xpad*2); + int height_plus_pad = height+floor(i->config_ypad*2); + PDF_begin_page_ext(i->p, width_plus_pad, height_plus_pad, i->page_opts); + PDF_set_value(i->p, "CropBox/llx", 0); + PDF_set_value(i->p, "CropBox/lly", 0); + PDF_set_value(i->p, "CropBox/urx", width_plus_pad); + PDF_set_value(i->p, "CropBox/ury", height_plus_pad); + if(i->config_xpad || i->config_ypad) { + PDF_set_value(i->p, "TrimBox/llx", i->config_xpad); + PDF_set_value(i->p, "TrimBox/lly", i->config_ypad); + PDF_set_value(i->p, "TrimBox/urx", i->config_xpad+width); + PDF_set_value(i->p, "TrimBox/ury", i->config_ypad+height); + } + + PDF_set_parameter(i->p, "fillrule", "evenodd"); + i->width = width; + i->height = height; + i->num_pages++; + + reset_matrix(i); +} + +int pdf_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + if(!strcmp(key, "addblankpages")) { + i->config_addblankpages = atoi(value); + } else if(!strcmp(key, "maxdpi")) { + i->config_maxdpi = atoi(value); + } else if(!strcmp(key, "mindpi")) { + i->config_mindpi = atoi(value); + } else if(!strcmp(key, "xpad")) { + i->config_xpad = atof(value); + } else if(!strcmp(key, "ypad")) { + i->config_ypad = atof(value); + } + return 0; +} + + +static int mkline(gfxline_t*line, PDF*p, double mx, double my, double scale, char fill) +{ + double x=0,y=0; + char first = 1; + int ret = 0; + gfxline_t*free_line = 0; + if(fill) { + line = gfxline_restitch(gfxline_clone(line)); + free_line = line; + } + while(line) { + if(line->type == gfx_moveTo && (x!=line->x || y!=line->y || first)) { + first = 0; + PDF_moveto(p, line->x*scale+mx, line->y*scale+my); + } else if(line->type == gfx_lineTo) { + PDF_lineto(p, line->x*scale+mx, line->y*scale+my); + ret = 1; + } else { + /* when converting a quadratic bezier to a cubic bezier, the + two new control points are both 2/3 the way from the + endpoints to the old control point */ + double c1x = (x + line->sx*2)/3; + double c1y = (y + line->sy*2)/3; + double c2x = (line->x + line->sx*2)/3; + double c2y = (line->y + line->sy*2)/3; + PDF_curveto(p, c1x*scale+mx, c1y*scale+my, + c2x*scale+mx, c2y*scale+my, + line->x*scale+mx, line->y*scale+my); + ret = 1; + } + x = line->x; + y = line->y; + line = line->next; + } + if(free_line) + gfxline_free(free_line); + return ret; +} + +void pdf_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + + restore_matrix(i); + PDF_save(i->p); + + if(mkline(line, i->p, i->config_xpad, i->config_ypad, 1.0, 1)) + PDF_clip(i->p); + else + ; // TODO: strictly speaking, an empty clip clears everything + + reset_matrix(i); +} +void pdf_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + restore_matrix(i); + PDF_restore(i->p); +} +void pdf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + if(width<1e-6) + return; + reset_matrix(i); + PDF_setlinewidth(i->p, width); + PDF_setlinecap(i->p, cap_style==gfx_capButt?0:(cap_style==gfx_capRound?1:2)); + PDF_setlinejoin(i->p, joint_style==gfx_joinMiter?0:(joint_style==gfx_joinRound?1:2)); + + PDF_setrgbcolor_stroke(i->p, color->r/255.0, color->g/255.0, color->b/255.0); + + if(joint_style==gfx_joinMiter) + PDF_setmiterlimit(i->p, miterLimit); + if(mkline(line, i->p, i->config_xpad, i->config_ypad, 1.0, 0)) + PDF_stroke(i->p); +} + +void pdf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + reset_matrix(i); + PDF_setrgbcolor_fill(i->p, color->r/255.0, color->g/255.0, color->b/255.0); + /* + pdf-x (pdf 1.3) doesn't support opacityfill + if(color->a!=255) { + char opacityfill[80]; + sprintf(opacityfill, "opacityfill %f", color->a/256.0); + int gstate = PDF_create_gstate(i->p, opacityfill); + PDF_set_gstate(i->p, gstate); + }*/ + + if(mkline(line, i->p, i->config_xpad, i->config_ypad, 1.0, 1)) { + PDF_fill(i->p); + } +} + +void pdf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + + int t,size=img->width*img->height; + int has_alpha=0; + for(t=0;tdata[t].a!=255) { + has_alpha=1; + break; + } + } + + double w = sqrt(matrix->m00*matrix->m00+matrix->m01*matrix->m01); + double h = sqrt(matrix->m10*matrix->m10+matrix->m11*matrix->m11); + double l1 = w*img->width; + double l2 = h*img->height; + + double dpi_x = 72.0 / w; + double dpi_y = 72.0 / h; + double dpi = dpi_x>dpi_y?dpi_x:dpi_y; + gfximage_t*rescaled_image = 0; + if(i->config_maxdpi && dpi > i->config_maxdpi) { + int newwidth = img->width*i->config_maxdpi/dpi; + int newheight = img->height*i->config_maxdpi/dpi; + rescaled_image = gfximage_rescale(img, newwidth, newheight); + msg(" Downscaling %dx%d image (dpi %f, %.0fx%.0f on page) to %dx%d (dpi %d)", + img->width, img->height, dpi, l1, l2, newwidth, newheight, i->config_maxdpi); + img = rescaled_image; + } + if(i->config_mindpi && dpi < i->config_mindpi && img->width>1 && img->height>1) { + msg(" Found image of size %dx%d with dpi %f, minimum allowed dpi is %d", + img->width, img->height, dpi, i->config_mindpi); + exit(1); + } + + char tempfile[128]; + mktempname(tempfile, "jpg"); + + gfximage_save_jpeg(img, tempfile, 96); + + int imgid=-1; + if(has_alpha) { + char tempfile2[128]; + mktempname(tempfile2, "jpg"); + int t; + int size = img->width*img->height; + unsigned char*alpha = malloc(size); + for(t=0;tdata[t].a; + } + jpeg_save_gray(alpha, img->width, img->height, 97, tempfile2); + free(alpha); + int maskid = PDF_load_image(i->p, "jpeg", tempfile2, 0, "mask"); + unlink(tempfile2); + char masked[80]; + if(maskid<0) { + msg(" Couldn't process mask jpeg of size %dx%d: error code %d", img->width, img->height, maskid); + return; + } + sprintf(masked, "masked %d", maskid); + imgid = PDF_load_image(i->p, "jpeg", tempfile, 0, masked); + } else { + imgid = PDF_load_image(i->p, "jpeg", tempfile, 0, ""); + } + + if(imgid<0) { + msg(" Couldn't process jpeg of size %dx%d: error code %d, file %s", img->width, img->height, imgid, tempfile); + return; + } + unlink(tempfile); + + char options[80]; + set_matrix(i, matrix->m00, matrix->m01, matrix->m10, matrix->m11); + /* an image's (0,0) is at the lower left corner */ + double x=matrix->tx + i->config_xpad + matrix->m10*img->height; + double y=matrix->ty + i->config_ypad + matrix->m11*img->height; + double tx,ty; + transform_back(i, x, y, &tx, &ty); + PDF_place_image(i->p, imgid, tx, ty, 1.0); + PDF_close_image(i->p, imgid); + + if(rescaled_image) + gfximage_free(rescaled_image); +} + +void pdf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; +} + +static const char type3 = 0; +static const char ttf = 1; + +void pdf_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + + int num = font->num_glyphs<256-32?font->num_glyphs:256-32; + if(type3) { + int fontid = 0; + if(!gfxfontlist_hasfont(i->fontlist, font)) { + + static int fontnr = 1; + char fontname[32]; + sprintf(fontname, "font%d", fontnr++); + int l = strlen(fontname); + char fontname2[64]; + int t; + for(t=0;tp, fontname2, l*2, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, ""); + for(t=0;tglyphs[t]; + gfxbbox_t bbox = gfxline_getbbox(g->line); + char name[32]; + sprintf(name, "chr%d", t+32); + PDF_encoding_set_char(i->p, fontname, t+32, name, 0); + PDF_begin_glyph(i->p, name, g->advance, bbox.xmin/64.0, bbox.ymin/64.0, bbox.xmax/64.0, bbox.ymax/64.0); + if(mkline(g->line, i->p, 0, 0, 1.0/64.0, 1)) + PDF_fill(i->p); + PDF_end_glyph(i->p); + } + PDF_end_font(i->p); + fontid = PDF_load_font(i->p, fontname2, l*2, fontname, ""); + + i->fontlist = gfxfontlist_addfont2(i->fontlist, font, (void*)(ptroff_t)fontid); + } + } else if(ttf) { + int fontid = 0; + if(!gfxfontlist_hasfont(i->fontlist, font)) { + char fontname[32],filename[32],fontname2[64]; + static int fontnr = 1; + sprintf(fontname, "font%d", fontnr); + sprintf(filename, "font%d.ttf", fontnr); + fontnr++; + const char*old_id = font->id; + font->id = fontname; + int t; + for(t=0;tglyphs[t].unicode = 32+t; + } + font->max_unicode = 0; + font->unicode2glyph = 0; + gfxfont_save(font, filename); + font->id=old_id; + +#ifdef RUN_TTX + /* for testing the generated fonts: run everything through ttx (fonttools) */ + char cmd[256]; + sprintf(cmd, "mv %s.ttf test.ttf", fontname);system(cmd); + system("rm -f test.ttx"); + if(system("ttx test.ttf")&0xff00) exit(1); + sprintf(cmd, "mv test.ttf %s.old.ttf", fontname, fontname);system(cmd); + sprintf(cmd, "ttx test.ttx;mv test.ttf %s.ttf", fontname);system(cmd); + sprintf(cmd, "rm -f test.ttx");system(cmd); +#endif + + int l = strlen(fontname); + for(t=0;tp, fontname2, l*2, "host", "embedding=true"); + i->fontlist = gfxfontlist_addfont2(i->fontlist, font, (void*)(ptroff_t)fontid); + unlink(filename); + } + } +} + +void pdf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + + if(!font) + return; + + gfxglyph_t*glyph = &font->glyphs[glyphnr]; + char as_shape = 0; + if(!type3 && !ttf) {msg(" No type3 enabled. Drawing char %d as shape", glyphnr);as_shape=1;} + if(glyphnr>256-32) {msg(" Drawing char %d as shape (not < 224)", glyphnr);as_shape=1;} + + if(as_shape) { + reset_matrix(i); + PDF_setrgbcolor_fill(i->p, color->r/255.0, color->g/255.0, color->b/255.0); + gfxline_t*line2 = gfxline_clone(glyph->line); + gfxline_transform(line2, matrix); + if(mkline(line2, i->p, i->config_xpad, i->config_ypad, 1.0, 1)) { + PDF_fill(i->p); + } + gfxline_free(line2); + } else { + assert(gfxfontlist_hasfont(i->fontlist, font)); + int fontid = (int)(ptroff_t)gfxfontlist_getuserdata(i->fontlist, font->id); + + gfxmatrix_t m = *matrix; + + m.m00*=64; + m.m01*=64; + m.m10*=64; + m.m11*=64; + if(ttf) { + m.m10 = -m.m10; + m.m11 = -m.m11; + } + + if(!(fabs(m.m00 - i->m00) < 1e-6 && + fabs(m.m01 - i->m01) < 1e-6 && + fabs(m.m10 - i->m10) < 1e-6 && + fabs(m.m11 - i->m11) < 1e-6)) { + set_matrix(i, m.m00, m.m01, m.m10, m.m11); + } + double tx, ty; + transform_back(i, m.tx+i->config_xpad, m.ty+i->config_ypad, &tx, &ty); + + PDF_setfont(i->p, fontid, ttf?16.0:1.0); + PDF_setrgbcolor_fill(i->p, color->r/255.0, color->g/255.0, color->b/255.0); + + char name[32]; + sprintf(name, "%c", glyphnr+32); + + if(fabs(tx - i->lastx) > 0.001 || ty != i->lasty) { + PDF_show_xy2(i->p, name, strlen(name), tx, ty); + } else { + PDF_show2(i->p, name, strlen(name)); + } + + i->lastx = tx + glyph->advance; + i->lasty = ty; + } +} + +void pdf_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void pdf_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + restore_matrix(i); + PDF_end_page(i->p); +} + +typedef struct pdfresult_internal { + char*tempfile; +} pdfresult_internal_t; + +void pdfresult_destroy(gfxresult_t*gfx) +{ + pdfresult_internal_t*i = (pdfresult_internal_t*)gfx->internal; + unlink(i->tempfile); + free(i->tempfile); + free(gfx->internal);gfx->internal = 0; + free(gfx); +} + +int pdfresult_save(gfxresult_t*gfx, const char*filename) +{ + pdfresult_internal_t*i = (pdfresult_internal_t*)gfx->internal; + FILE*fi = fopen(i->tempfile, "rb"); + FILE*fo = fopen(filename, "wb"); + if(!fo) { + perror(filename); + return -1; + } + char buffer[4096]; + int size = 0; + while((size = fread(buffer, 1, 4096, fi))) { + fwrite(buffer, 1, size, fo); + } + fclose(fi); + fclose(fo); + return 0; +} + +void* pdfresult_get(gfxresult_t*gfx, const char*name) +{ + return 0; +} + +gfxresult_t* pdf_finish(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + if(i->config_addblankpages) { + int mod = i->num_pages%i->config_addblankpages; + if(mod) { + int count = i->config_addblankpages - mod; + int t; + for(t=0;tstartpage(dev, i->width, i->height); + dev->endpage(dev); + } + } + } + + PDF_end_document(i->p, ""); + //PDF_close(i->p); + PDF_delete(i->p); + + gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); + memset(result, 0, sizeof(gfxresult_t)); + result->save = pdfresult_save; + result->get = pdfresult_get; + result->destroy = pdfresult_destroy; + result->internal = 0; + result->internal = malloc(sizeof(pdfresult_internal_t)); + pdfresult_internal_t*ri = (pdfresult_internal_t*)result->internal; + ri->tempfile = i->tempfile;i->tempfile=0; + free(dev->internal);dev->internal = 0;i=0; + return result; +} + +void gfxdevice_pdf_init(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "pdf"; + + dev->internal = i; + + dev->setparameter = pdf_setparameter; + dev->startpage = pdf_startpage; + dev->startclip = pdf_startclip; + dev->endclip = pdf_endclip; + dev->stroke = pdf_stroke; + dev->fill = pdf_fill; + dev->fillbitmap = pdf_fillbitmap; + dev->fillgradient = pdf_fillgradient; + dev->addfont = pdf_addfont; + dev->drawchar = pdf_drawchar; + dev->drawlink = pdf_drawlink; + dev->endpage = pdf_endpage; + dev->finish = pdf_finish; + + i->page_opts = ""; + i->lastx = -1e38; + i->lasty = -1e38; + i->has_matrix = 0; + i->p = PDF_new(); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h new file mode 100644 index 000000000..e64ca7e94 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h @@ -0,0 +1,37 @@ +/* pdf.h + Header file for pdf.c + + Part of the swftools package. + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_pdf_h__ +#define __gfxdevice_pdf_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_pdf_init(gfxdevice_t*dev); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_pdf_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c new file mode 100644 index 000000000..275dc7b0a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c @@ -0,0 +1,443 @@ +/* polyops.c + + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include +#include +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../gfxpoly.h" +#include "../log.h" +#include "polyops.h" + +typedef struct _clip { + gfxpoly_t*poly; + int openclips; + struct _clip*next; +} clip_t; + +typedef struct _internal { + gfxdevice_t*out; + clip_t*clip; + gfxpoly_t*polyunion; + + int good_polygons; + int bad_polygons; +} internal_t; + +static int verbose = 0; + +static void dbg(char*format, ...) +{ + if(!verbose) + return; + char buf[1024]; + int l; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(device-polyops) %s\n", buf); + fflush(stdout); +} + +int polyops_setparameter(struct _gfxdevice*dev, const char*key, const char*value) +{ + dbg("polyops_setparameter"); + internal_t*i = (internal_t*)dev->internal; + if(i->out) return i->out->setparameter(i->out,key,value); + else return 0; +} + +void polyops_startpage(struct _gfxdevice*dev, int width, int height) +{ + dbg("polyops_startpage"); + internal_t*i = (internal_t*)dev->internal; + if(i->out) i->out->startpage(i->out,width,height); +} + +void polyops_startclip(struct _gfxdevice*dev, gfxline_t*line) +{ + dbg("polyops_startclip"); + internal_t*i = (internal_t*)dev->internal; + + gfxpoly_t* oldclip = i->clip?i->clip->poly:0; + gfxpoly_t* poly = gfxpoly_from_fill(line, DEFAULT_GRID); + if(poly) + i->good_polygons++; + else + i->bad_polygons++; + + gfxpoly_t* currentclip = 0; + int type = 0; + + /* we can't rely on gfxpoly actually being able to convert + a gfxline into a gfxpoly- for polygons which are too + complex or just degenerate, this might fail. So handle + all the cases where polygon conversion or intersection + might go awry + UPDATE: this is not needed anymore. The new gfxpoly + implementation is stable enough so it always returns + a valid result. Still, it's good practice. + */ + if(!poly && !oldclip) { + i->out->startclip(i->out,line); + currentclip = 0; + type = 1; + } else if(!poly && oldclip) { + gfxline_t*oldclipline = gfxline_from_gfxpoly(oldclip); + i->out->startclip(i->out,oldclipline); + i->out->startclip(i->out,line); + currentclip = 0; + type = 2; + } else if(poly && oldclip) { + gfxpoly_t*intersection = gfxpoly_intersect(poly, oldclip); + if(intersection) { + i->good_polygons++; + // this case is what usually happens + gfxpoly_destroy(poly);poly=0; + currentclip = intersection; + type = 0; + } else { + i->bad_polygons++; + gfxline_t*oldclipline = gfxline_from_gfxpoly(oldclip); + i->out->startclip(i->out, oldclipline); + currentclip = poly; + type = 1; + } + } else if(poly && !oldclip) { + currentclip = poly; + type = 0; + } + + clip_t*n = i->clip; + i->clip = (clip_t*)rfx_calloc(sizeof(clip_t)); + i->clip->next = n; + i->clip->poly = currentclip; + i->clip->openclips = type; +} + +void polyops_endclip(struct _gfxdevice*dev) +{ + dbg("polyops_endclip"); + internal_t*i = (internal_t*)dev->internal; + + if(!i->clip) { + msg(" endclip without startclip (in: polyops)\n"); + return; + } + + clip_t*old = i->clip; + i->clip = i->clip->next; + if(old->poly) { + gfxpoly_destroy(old->poly);old->poly = 0; + } + int t; + for(t=0;topenclips;t++) + i->out->endclip(i->out); + + old->next = 0;free(old); +} + +static void addtounion(struct _gfxdevice*dev, gfxpoly_t*poly) +{ + internal_t*i = (internal_t*)dev->internal; + if(poly && i->polyunion) { + gfxpoly_t*old = i->polyunion; + gfxpoly_t*newpoly = gfxpoly_union(poly,i->polyunion); + i->polyunion = newpoly; + gfxpoly_destroy(old); + } +} + +static gfxline_t* handle_poly(gfxdevice_t*dev, gfxpoly_t*poly, char*ok) +{ + internal_t*i = (internal_t*)dev->internal; + if(i->clip && i->clip->poly) { + gfxpoly_t*old = poly; + if(poly) { + poly = gfxpoly_intersect(poly, i->clip->poly); + gfxpoly_destroy(old); + } + } + + if(poly) + i->good_polygons++; + else + i->bad_polygons++; + + addtounion(dev, poly); + gfxline_t*gfxline = 0; + if(poly) { + // this is the case where everything went right + gfxline_t*line = gfxline_from_gfxpoly(poly); + gfxpoly_destroy(poly); + *ok = 1; + return line; + } else { + if(i->clip && i->clip->poly) { + /* convert current clipping from a polygon to an + actual "startclip" written to the output */ + assert(i->clip->openclips <= 1); + gfxline_t*clipline = gfxline_from_gfxpoly(i->clip->poly); + i->out->startclip(i->out, clipline); + gfxline_free(clipline); + gfxpoly_destroy(i->clip->poly);i->clip->poly = 0; + i->clip->openclips++; + return 0; + } else { + return 0; + } + } +} + +void polyops_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + dbg("polyops_stroke"); + internal_t*i = (internal_t*)dev->internal; + + gfxpoly_t* poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); + char ok = 0; + gfxline_t*line2 = handle_poly(dev, poly, &ok); + + if(ok) { + if(i->out && line2) i->out->fill(i->out, line2, color); + gfxline_free(line2); + } else { + msg(" .."); + if(i->out) i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); + } +} + +void polyops_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) +{ + dbg("polyops_fill"); + internal_t*i = (internal_t*)dev->internal; + + gfxpoly_t*poly = gfxpoly_from_fill(line, DEFAULT_GRID); + char ok = 0; + gfxline_t*line2 = handle_poly(dev, poly, &ok); + + if(ok) { + if(i->out && line2) i->out->fill(i->out, line2, color); + gfxline_free(line2); + } else { + if(i->out) i->out->fill(i->out, line, color); + } +} + +void polyops_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + dbg("polyops_fillbitmap"); + internal_t*i = (internal_t*)dev->internal; + + gfxpoly_t*poly = gfxpoly_from_fill(line, DEFAULT_GRID); + char ok = 0; + gfxline_t*line2 = handle_poly(dev, poly, &ok); + + if(ok) { + if(i->out && line2) i->out->fillbitmap(i->out, line2, img, matrix, cxform); + gfxline_free(line2); + } else { + if(i->out) i->out->fillbitmap(i->out, line, img, matrix, cxform); + } +} + +void polyops_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + dbg("polyops_fillgradient"); + internal_t*i = (internal_t*)dev->internal; + + gfxpoly_t*poly = gfxpoly_from_fill(line, DEFAULT_GRID); + char ok = 0; + gfxline_t*line2 = handle_poly(dev, poly, &ok); + + if(ok) { + if(i->out && line2) i->out->fillgradient(i->out, line2, gradient, type, matrix); + gfxline_free(line2); + } else { + if(i->out) i->out->fillgradient(i->out, line, gradient, type, matrix); + } +} + +void polyops_addfont(struct _gfxdevice*dev, gfxfont_t*font) +{ + dbg("polyops_addfont"); + internal_t*i = (internal_t*)dev->internal; + if(i->out) i->out->addfont(i->out, font); +} + +void polyops_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + dbg("polyops_drawchar"); + if(!font) + return; + internal_t*i = (internal_t*)dev->internal; + gfxline_t*glyph = gfxline_clone(font->glyphs[glyphnr].line); + gfxline_transform(glyph, matrix); + + if(i->clip && i->clip->poly) { + gfxbbox_t bbox = gfxline_getbbox(glyph); + gfxpoly_t*dummybox = gfxpoly_createbox(bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax, DEFAULT_GRID); + gfxline_t*dummybox2 = gfxline_from_gfxpoly(dummybox); + bbox = gfxline_getbbox(dummybox2); + gfxline_free(dummybox2); + + char ok=0; + gfxline_t*gfxline = handle_poly(dev, dummybox, &ok); + if(ok) { + gfxbbox_t bbox2 = gfxline_getbbox(gfxline); + double w = bbox2.xmax - bbox2.xmin; + double h = bbox2.ymax - bbox2.ymin; + if(fabs((bbox.xmax - bbox.xmin) - w) > DEFAULT_GRID*2 || + fabs((bbox.ymax - bbox.ymin) - h) > DEFAULT_GRID*2) { + /* notable change in character size: character was clipped + TODO: how to deal with diagonal cuts? + */ + msg(" Character %d was clipped: (%f,%f,%f,%f) -> (%f,%f,%f,%f)", + glyphnr, + bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax, + bbox2.xmin,bbox2.ymin,bbox2.xmax,bbox2.ymax); + polyops_fill(dev, glyph, color); + } else { + if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); + } + } else { + if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); + } + gfxline_free(gfxline); + } else { + if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); + } + + gfxline_free(glyph); +} + +void polyops_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) +{ + dbg("polyops_drawlink"); + internal_t*i = (internal_t*)dev->internal; + if(i->out) i->out->drawlink(i->out, line, action, text); +} + +void polyops_endpage(struct _gfxdevice*dev) +{ + dbg("polyops_endpage"); + internal_t*i = (internal_t*)dev->internal; + if(i->out) i->out->endpage(i->out); +} + +gfxresult_t* polyops_finish(struct _gfxdevice*dev) +{ + dbg("polyops_finish"); + internal_t*i = (internal_t*)dev->internal; + + if(i->polyunion) { + gfxpoly_destroy(i->polyunion);i->polyunion=0; + } else { + if(i->bad_polygons) { + msg(" --flatten success rate: %.1f%% (%d failed polygons)", i->good_polygons*100.0 / (i->good_polygons + i->bad_polygons), i->bad_polygons); + } + } + gfxdevice_t*out = i->out; + free(i);memset(dev, 0, sizeof(gfxdevice_t)); + if(out) { + return out->finish(out); + } else { + return 0; + } +} + +gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + return gfxline_from_gfxpoly(i->polyunion); +} + +void gfxdevice_removeclippings_init(gfxdevice_t*dev, gfxdevice_t*out) +{ + dbg("gfxdevice_removeclippings_init"); + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "removeclippings"; + + dev->internal = i; + + dev->setparameter = polyops_setparameter; + dev->startpage = polyops_startpage; + dev->startclip = polyops_startclip; + dev->endclip = polyops_endclip; + dev->stroke = polyops_stroke; + dev->fill = polyops_fill; + dev->fillbitmap = polyops_fillbitmap; + dev->fillgradient = polyops_fillgradient; + dev->addfont = polyops_addfont; + dev->drawchar = polyops_drawchar; + dev->drawlink = polyops_drawlink; + dev->endpage = polyops_endpage; + dev->finish = polyops_finish; + + i->out = out; + i->polyunion = 0; +} + +void gfxdevice_union_init(gfxdevice_t*dev,gfxdevice_t*out) +{ + dbg("gfxdevice_getunion_init"); + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "union"; + + dev->internal = i; + + dev->setparameter = polyops_setparameter; + dev->startpage = polyops_startpage; + dev->startclip = polyops_startclip; + dev->endclip = polyops_endclip; + dev->stroke = polyops_stroke; + dev->fill = polyops_fill; + dev->fillbitmap = polyops_fillbitmap; + dev->fillgradient = polyops_fillgradient; + dev->addfont = polyops_addfont; + dev->drawchar = polyops_drawchar; + dev->drawlink = polyops_drawlink; + dev->endpage = polyops_endpage; + dev->finish = polyops_finish; + + i->out = out; + /* create empty polygon */ + i->polyunion = gfxpoly_from_stroke(0, 0, gfx_capButt, gfx_joinMiter, 0, DEFAULT_GRID); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h new file mode 100644 index 000000000..fa1379e2d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h @@ -0,0 +1,40 @@ +/* gfxdevice_polyops.h + Header file for gfxdevice_polyops.c + + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_polyops_h__ +#define __gfxdevice_polyops_h__ + +#include "../gfxdevice.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_removeclippings_init(gfxdevice_t*self, gfxdevice_t*dest); +void gfxdevice_union_init(gfxdevice_t*self, gfxdevice_t*dest); +gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_polyops_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/record.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/record.c new file mode 100644 index 000000000..f58f7e997 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/record.c @@ -0,0 +1,1016 @@ +/* gfxdevice_record.cc + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../../config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifdef HAVE_IO_H +#include +#endif +#include +#include +#include +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../gfxfont.h" +#include "../types.h" +#include "../bitio.h" +#include "../log.h" +#include "../os.h" +#include "../png.h" +#ifdef HAVE_FASTLZ +#include "../fastlz.h" +#endif +#include "record.h" + +//#define STATS +//#define COMPRESS_IMAGES +//#define FILTER_IMAGES + +typedef struct _state { + char*last_string[16]; + gfxcolor_t last_color[16]; + gfxmatrix_t last_matrix[16]; + +#ifdef STATS + int size_matrices; + int size_positions; + int size_images; + int size_lines; + int size_colors; + int size_fonts; + int size_chars; +#endif +} state_t; + +typedef struct _internal { + gfxfontlist_t* fontlist; + state_t state; + + writer_t w; + int cliplevel; + char use_tempfile; + char*filename; +} internal_t; + +typedef struct _internal_result { + char use_tempfile; + char*filename; + void*data; + int length; +} internal_result_t; + +#define OP_END 0x00 +#define OP_SETPARAM 0x01 +#define OP_STROKE 0x02 +#define OP_STARTCLIP 0x03 +#define OP_ENDCLIP 0x04 +#define OP_FILL 0x05 +#define OP_FILLBITMAP 0x06 +#define OP_FILLGRADIENT 0x07 +#define OP_ADDFONT 0x08 +#define OP_DRAWCHAR 0x09 +#define OP_DRAWLINK 0x0a +#define OP_STARTPAGE 0x0b +#define OP_ENDPAGE 0x0c +#define OP_FINISH 0x0d + +#define FLAG_SAME_AS_LAST 0x10 +#define FLAG_ZERO_FONT 0x20 + +#define LINE_MOVETO 0x0e +#define LINE_LINETO 0x0f +#define LINE_SPLINETO 0x10 + +/* ----------------- reading/writing of low level primitives -------------- */ + +static void dumpLine(writer_t*w, state_t*state, gfxline_t*line) +{ + while(line) { + if(line->type == gfx_moveTo) { + writer_writeU8(w, LINE_MOVETO); + writer_writeDouble(w, line->x); + writer_writeDouble(w, line->y); +#ifdef STATS + state->size_lines += 1+8+8; +#endif + } else if(line->type == gfx_lineTo) { + writer_writeU8(w, LINE_LINETO); + writer_writeDouble(w, line->x); + writer_writeDouble(w, line->y); +#ifdef STATS + state->size_lines += 1+8+8; +#endif + } else if(line->type == gfx_splineTo) { + writer_writeU8(w, LINE_SPLINETO); + writer_writeDouble(w, line->x); + writer_writeDouble(w, line->y); + writer_writeDouble(w, line->sx); + writer_writeDouble(w, line->sy); +#ifdef STATS + state->size_lines += 1+8+8+8+8; +#endif + } + line = line->next; + } + writer_writeU8(w, OP_END); +#ifdef STATS + state->size_lines += 1; +#endif +} +static gfxline_t* readLine(reader_t*r, state_t*s) +{ + gfxline_t*start = 0, *pos = 0; + while(1) { + unsigned char op = reader_readU8(r); + if(op == OP_END) + break; + gfxline_t*line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); + if(!start) { + start = pos = line; + } else { + pos->next = line; + pos = line; + } + if(op == LINE_MOVETO) { + line->type = gfx_moveTo; + line->x = reader_readDouble(r); + line->y = reader_readDouble(r); + } else if(op == LINE_LINETO) { + line->type = gfx_lineTo; + line->x = reader_readDouble(r); + line->y = reader_readDouble(r); + } else if(op == LINE_SPLINETO) { + line->type = gfx_splineTo; + line->x = reader_readDouble(r); + line->y = reader_readDouble(r); + line->sx = reader_readDouble(r); + line->sy = reader_readDouble(r); + } + } + return start; +} + +static void dumpImage(writer_t*w, state_t*state, gfximage_t*img) +{ + int oldpos = w->pos; + writer_writeU16(w, img->width); + writer_writeU16(w, img->height); +#ifdef COMPRESS_IMAGES + //35.3% images (2027305 bytes) (with filter, Z_BEST_COMPRESSION) + //39.9% images (2458904 bytes) (with filter, Z_BEST_SPEED) + //45.2% images (3055340 bytes) (without filter) + //45.9% images (3149247 bytes) (without filter, 5) + //48.0% images (3480495 bytes) (with filter, fastlz) + //48.0% images (3488650 bytes) (without filter, Z_BEST_SPEED) + //55.3% images (4665889 bytes) (without filter, fastlz level 2) + //55.6% images (4726334 bytes) (without filter, fastlz level 1) + //83.0% images (18091804 bytes) (no compression) + + gfxcolor_t*image; +#ifdef FILTER_IMAGES + unsigned char*filter = malloc(img->height); + int y; + image = malloc(img->width*img->height*sizeof(gfxcolor_t)); + for(y=0;yheight;y++) { + filter[y] = png_apply_filter_32( + (void*)&image[y*img->width], + (void*)&img->data[y*img->width], img->width, y); + } +#else + image = img->data; +#endif + int size = img->width*img->height; + uLongf compressdata_size = compressBound(size*sizeof(gfxcolor_t)); + void*compressdata = malloc(compressdata_size); + +#ifdef HAVE_FASTLZ + compressdata_size = fastlz_compress_level(2, (void*)image, size*sizeof(gfxcolor_t), compressdata); +#else + compress2(compressdata, &compressdata_size, (void*)image, sizeof(gfxcolor_t)*size, Z_BEST_SPEED); +#endif + + writer_writeU32(w, compressdata_size); +#ifdef FILTER_IMAGES + w->write(w, filter, img->height); + free(filter); + free(image); +#endif + w->write(w, compressdata, compressdata_size); + free(compressdata); +#else + w->write(w, img->data, img->width*img->height*sizeof(gfxcolor_t)); +#endif +#ifdef STATS + state->size_images += w->pos - oldpos; +#endif +} +static gfximage_t readImage(reader_t*r, state_t*state) +{ + gfximage_t img; + img.width = reader_readU16(r); + img.height = reader_readU16(r); + uLongf size = img.width*img.height*sizeof(gfxcolor_t); + img.data = malloc(size); +#ifdef COMPRESS_IMAGES + uLongf compressdata_size = reader_readU32(r); + void*compressdata = malloc(compressdata_size); +# ifdef FILTER_IMAGES + unsigned char*filter = malloc(img.height); + r->read(r, filter, img.height); +# endif + r->read(r, compressdata, compressdata_size); + +# ifdef HAVE_FASTLZ + fastlz_decompress(compressdata, compressdata_size, (void*)img.data, size); +# else + uncompress((void*)img.data, &size, compressdata, compressdata_size); +# endif + free(compressdata); + +# ifdef FILTER_IMAGES + int y; + unsigned char*line = malloc(img.width*sizeof(gfxcolor_t)); + for(y=0;yread(r, img.data, size); +#endif + return img; +} + +static void dumpMatrix(writer_t*w, state_t*state, gfxmatrix_t*matrix) +{ + writer_writeDouble(w, matrix->m00); + writer_writeDouble(w, matrix->m01); + writer_writeDouble(w, matrix->m10); + writer_writeDouble(w, matrix->m11); + writer_writeDouble(w, matrix->tx); + writer_writeDouble(w, matrix->ty); +#ifdef STATS + state->size_matrices += 6*8; +#endif +} +static gfxmatrix_t readMatrix(reader_t*r, state_t*state) +{ + gfxmatrix_t matrix; + matrix.m00 = reader_readDouble(r); + matrix.m01 = reader_readDouble(r); + matrix.m10 = reader_readDouble(r); + matrix.m11 = reader_readDouble(r); + matrix.tx = reader_readDouble(r); + matrix.ty = reader_readDouble(r); + return matrix; +} +static void dumpXY(writer_t*w, state_t*state, gfxmatrix_t*matrix) +{ + writer_writeDouble(w, matrix->tx); + writer_writeDouble(w, matrix->ty); +#ifdef STATS + state->size_positions += 2*8; +#endif +} +static void readXY(reader_t*r, state_t*state, gfxmatrix_t*m) +{ + m->tx = reader_readDouble(r); + m->ty = reader_readDouble(r); +} + +static void dumpColor(writer_t*w, state_t*state, gfxcolor_t*color) +{ + writer_writeU8(w, color->r); + writer_writeU8(w, color->g); + writer_writeU8(w, color->b); + writer_writeU8(w, color->a); +#ifdef STATS + state->size_colors += 4; +#endif +} +static gfxcolor_t readColor(reader_t*r, state_t*state) +{ + gfxcolor_t col; + col.r = reader_readU8(r); + col.g = reader_readU8(r); + col.b = reader_readU8(r); + col.a = reader_readU8(r); + return col; +} + +static void dumpGradient(writer_t*w, state_t*state, gfxgradient_t*gradient) +{ + while(gradient) { + writer_writeU8(w, 1); + dumpColor(w, state, &gradient->color); + writer_writeFloat(w, gradient->pos); + gradient = gradient->next; + } + writer_writeU8(w, 0); +} +static gfxgradient_t* readGradient(reader_t*r, state_t*state) +{ + gfxgradient_t*start = 0, *pos = 0; + while(1) { + U8 op = reader_readU8(r); + if(!op) + break; + gfxgradient_t*g = (gfxgradient_t*)rfx_calloc(sizeof(gfxgradient_t)); + if(!start) { + start = pos = g; + } else { + pos->next = g; + pos = g; + } + g->color = readColor(r, state); + g->pos = reader_readFloat(r); + } + return start; +} + +static void dumpCXForm(writer_t*w, state_t*state, gfxcxform_t*c) +{ + if(!c) { + writer_writeU8(w, 0); + } else { + writer_writeU8(w, 1); + writer_writeFloat(w, c->rr); writer_writeFloat(w, c->rg); writer_writeFloat(w, c->rb); writer_writeFloat(w, c->ra); + writer_writeFloat(w, c->gr); writer_writeFloat(w, c->gg); writer_writeFloat(w, c->gb); writer_writeFloat(w, c->ga); + writer_writeFloat(w, c->br); writer_writeFloat(w, c->bg); writer_writeFloat(w, c->bb); writer_writeFloat(w, c->ba); + writer_writeFloat(w, c->ar); writer_writeFloat(w, c->ag); writer_writeFloat(w, c->ab); writer_writeFloat(w, c->aa); + } +} +static gfxcxform_t* readCXForm(reader_t*r, state_t*state) +{ + U8 type = reader_readU8(r); + if(!type) + return 0; + gfxcxform_t* c = (gfxcxform_t*)rfx_calloc(sizeof(gfxcxform_t)); + c->rr = reader_readFloat(r); c->rg = reader_readFloat(r); c->rb = reader_readFloat(r); c->ra = reader_readFloat(r); + c->gr = reader_readFloat(r); c->gg = reader_readFloat(r); c->gb = reader_readFloat(r); c->ga = reader_readFloat(r); + c->br = reader_readFloat(r); c->bg = reader_readFloat(r); c->bb = reader_readFloat(r); c->ba = reader_readFloat(r); + c->ar = reader_readFloat(r); c->ag = reader_readFloat(r); c->ab = reader_readFloat(r); c->aa = reader_readFloat(r); + return c; +} + +static void dumpFont(writer_t*w, state_t*state, gfxfont_t*font) +{ + int oldpos = w->pos; +#ifdef STATS + int old_size_lines = state->size_lines; +#endif + writer_writeString(w, font->id); + writer_writeU32(w, font->num_glyphs); + writer_writeU32(w, font->max_unicode); + writer_writeDouble(w, font->ascent); + writer_writeDouble(w, font->descent); + int t; + for(t=0;tnum_glyphs;t++) { + dumpLine(w, state, font->glyphs[t].line); + writer_writeDouble(w, font->glyphs[t].advance); + writer_writeU32(w, font->glyphs[t].unicode); + if(font->glyphs[t].name) { + writer_writeString(w,font->glyphs[t].name); + } else { + writer_writeU8(w,0); + } + } + for(t=0;tmax_unicode;t++) { + writer_writeU32(w, font->unicode2glyph[t]); + } +#ifdef STATS + state->size_lines = old_size_lines; + state->size_fonts += w->pos - oldpos; +#endif +} +static gfxfont_t*readFont(reader_t*r, state_t*state) +{ + gfxfont_t* font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); + font->id = reader_readString(r); + font->num_glyphs = reader_readU32(r); + font->max_unicode = reader_readU32(r); + font->ascent = reader_readDouble(r); + font->descent = reader_readDouble(r); + font->glyphs = (gfxglyph_t*)rfx_calloc(sizeof(gfxglyph_t)*font->num_glyphs); + font->unicode2glyph = (int*)rfx_calloc(sizeof(font->unicode2glyph[0])*font->max_unicode); + int t; + for(t=0;tnum_glyphs;t++) { + font->glyphs[t].line = readLine(r, state); + font->glyphs[t].advance = reader_readDouble(r); + font->glyphs[t].unicode = reader_readU32(r); + font->glyphs[t].name = reader_readString(r); + if(!font->glyphs[t].name[0]) { + free((void*)(font->glyphs[t].name)); + font->glyphs[t].name = 0; + } + } + for(t=0;tmax_unicode;t++) { + font->unicode2glyph[t] = reader_readU32(r); + } + return font; +} + +/* ----------------- reading/writing of primitives with caching -------------- */ + +void state_clear(state_t*state) +{ + int t; + for(t=0;tlast_string)/sizeof(state->last_string[0]);t++) { + if(state->last_string[t]) { + free(state->last_string[t]); + state->last_string[t] = 0; + } + } +} + +static char* read_string(reader_t*r, state_t*state, U8 id, U8 flags) +{ + assert(id>=0 && id<16); + if(flags&FLAG_SAME_AS_LAST) { + assert(state->last_string[id]); + return strdup(state->last_string[id]); + } + char*s = reader_readString(r); + if(state->last_string[id]) { + free(state->last_string[id]); + } + state->last_string[id] = strdup(s); + return s; +} +static gfxcolor_t read_color(reader_t*r, state_t*state, U8 id, U8 flags) +{ + assert(id>=0 && id<16); + if(flags&FLAG_SAME_AS_LAST) + return state->last_color[id]; + gfxcolor_t c = readColor(r, state); + state->last_color[id] = c; + return c; +} +static gfxmatrix_t read_matrix(reader_t*r, state_t*state, U8 id, U8 flags) +{ + assert(id>=0 && id<16); + if(flags&FLAG_SAME_AS_LAST) { + gfxmatrix_t m = state->last_matrix[id]; + readXY(r, state, &m); + return m; + } + gfxmatrix_t m = readMatrix(r, state); + state->last_matrix[id] = m; + return m; +} + +/* --------------------------- record device operations ---------------------- */ + +static int record_setparameter(struct _gfxdevice*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x SETPARAM %s %s\n", dev, key, value); + writer_writeU8(&i->w, OP_SETPARAM); + writer_writeString(&i->w, key); + writer_writeString(&i->w, value); + return 1; +} + +static void record_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x STROKE\n", dev); + writer_writeU8(&i->w, OP_STROKE); + writer_writeDouble(&i->w, width); + writer_writeDouble(&i->w, miterLimit); + dumpColor(&i->w, &i->state, color); + writer_writeU8(&i->w, cap_style); + writer_writeU8(&i->w, joint_style); + dumpLine(&i->w, &i->state, line); +} + +static void record_startclip(struct _gfxdevice*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x STARTCLIP\n", dev); + writer_writeU8(&i->w, OP_STARTCLIP); + dumpLine(&i->w, &i->state, line); + i->cliplevel++; +} + +static void record_endclip(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x ENDCLIP\n", dev); + writer_writeU8(&i->w, OP_ENDCLIP); + i->cliplevel--; + if(i->cliplevel<0) { + msg(" record: endclip() without startclip()"); + } +} + +static void record_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x FILL\n", dev); + writer_writeU8(&i->w, OP_FILL); + dumpColor(&i->w, &i->state, color); + dumpLine(&i->w, &i->state, line); +} + +static void record_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x FILLBITMAP\n", dev); + writer_writeU8(&i->w, OP_FILLBITMAP); + dumpImage(&i->w, &i->state, img); + dumpMatrix(&i->w, &i->state, matrix); + dumpLine(&i->w, &i->state, line); + dumpCXForm(&i->w, &i->state, cxform); +} + +static void record_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x FILLGRADIENT %08x\n", dev, gradient); + writer_writeU8(&i->w, OP_FILLGRADIENT); + writer_writeU8(&i->w, type); + dumpGradient(&i->w, &i->state, gradient); + dumpMatrix(&i->w, &i->state, matrix); + dumpLine(&i->w, &i->state, line); +} + +static void record_addfont(struct _gfxdevice*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x ADDFONT %s\n", dev, font->id); + if(font && !gfxfontlist_hasfont(i->fontlist, font)) { + writer_writeU8(&i->w, OP_ADDFONT); + dumpFont(&i->w, &i->state, font); + i->fontlist = gfxfontlist_addfont(i->fontlist, font); + } +} + +static void record_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(font && !gfxfontlist_hasfont(i->fontlist, font)) { + record_addfont(dev, font); + } + + msg(" record: %08x DRAWCHAR %d\n", glyphnr, dev); + const char*font_id = (font&&font->id)?font->id:"*NULL*"; + + gfxmatrix_t*l = &i->state.last_matrix[OP_DRAWCHAR]; + + U8 flags = 0; + if(!font) + flags |= FLAG_ZERO_FONT; + + char same_font = i->state.last_string[OP_DRAWCHAR] && !strcmp(i->state.last_string[OP_DRAWCHAR], font_id); + char same_matrix = (l->m00 == matrix->m00) && (l->m01 == matrix->m01) && (l->m10 == matrix->m10) && (l->m11 == matrix->m11); + char same_color = !memcmp(color, &i->state.last_color[OP_DRAWCHAR], sizeof(gfxcolor_t)); + + /* FIXME + if(same_font && same_matrix && same_color) + flags |= FLAG_SAME_AS_LAST; + */ + + writer_writeU8(&i->w, OP_DRAWCHAR|flags); + writer_writeU32(&i->w, glyphnr); +#ifdef STATS + i->state.size_chars += 5; +#endif + + if(!(flags&FLAG_SAME_AS_LAST)) { + if(!(flags&FLAG_ZERO_FONT)) + writer_writeString(&i->w, font_id); + dumpColor(&i->w, &i->state, color); + dumpMatrix(&i->w, &i->state, matrix); + + if(i->state.last_string[OP_DRAWCHAR]) + free(i->state.last_string[OP_DRAWCHAR]); + i->state.last_string[OP_DRAWCHAR] = strdup(font_id); + + i->state.last_color[OP_DRAWCHAR] = *color; + i->state.last_matrix[OP_DRAWCHAR] = *matrix; + } else { + dumpXY(&i->w, &i->state, matrix); + } +} + +static void record_startpage(struct _gfxdevice*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x STARTPAGE\n", dev); + writer_writeU8(&i->w, OP_STARTPAGE); + writer_writeU16(&i->w, width); + writer_writeU16(&i->w, height); +} + +static void record_endpage(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x ENDPAGE\n", dev); + writer_writeU8(&i->w, OP_ENDPAGE); +} + +static void record_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x DRAWLINK\n", dev); + writer_writeU8(&i->w, OP_DRAWLINK); + dumpLine(&i->w, &i->state, line); + writer_writeString(&i->w, action?action:""); + writer_writeString(&i->w, text?text:""); +} + +/* ------------------------------- replaying --------------------------------- */ + +static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r, gfxfontlist_t**fontlist) +{ + internal_t*i = 0; + if(dev) { + i = (internal_t*)dev->internal; + } + gfxfontlist_t*_fontlist=0; + if(!fontlist) { + fontlist = &_fontlist; + } + + state_t state; + memset(&state, 0, sizeof(state)); + + while(1) { + unsigned char op; + if(r->read(r, &op, 1)!=1) + break; + unsigned char flags = op&0xf0; + op&=0x0f; + + switch(op) { + case OP_END: + goto finish; + case OP_SETPARAM: { + msg(" replay: SETPARAM"); + char*key; + char*value; + key = reader_readString(r); + value = reader_readString(r); + out->setparameter(out, key, value); + free(key); + free(value); + break; + } + case OP_STARTPAGE: { + msg(" replay: STARTPAGE"); + U16 width = reader_readU16(r); + U16 height = reader_readU16(r); + out->startpage(out, width, height); + break; + } + case OP_ENDPAGE: { + msg(" replay: ENDPAGE"); + out->endpage(out); + break; + } + case OP_FINISH: { + msg(" replay: FINISH"); + break; + } + case OP_STROKE: { + msg(" replay: STROKE"); + double width = reader_readDouble(r); + double miterlimit = reader_readDouble(r); + gfxcolor_t color = readColor(r, &state); + gfx_capType captype; + int v = reader_readU8(r); + switch (v) { + case 0: captype = gfx_capButt; break; + case 1: captype = gfx_capRound; break; + case 2: captype = gfx_capSquare; break; + } + gfx_joinType jointtype; + v = reader_readU8(r); + switch (v) { + case 0: jointtype = gfx_joinMiter; break; + case 1: jointtype = gfx_joinRound; break; + case 2: jointtype = gfx_joinBevel; break; + } + gfxline_t* line = readLine(r, &state); + out->stroke(out, line, width, &color, captype, jointtype,miterlimit); + gfxline_free(line); + break; + } + case OP_STARTCLIP: { + msg(" replay: STARTCLIP"); + gfxline_t* line = readLine(r, &state); + out->startclip(out, line); + gfxline_free(line); + break; + } + case OP_ENDCLIP: { + msg(" replay: ENDCLIP"); + out->endclip(out); + break; + } + case OP_FILL: { + msg(" replay: FILL"); + gfxcolor_t color = readColor(r, &state); + gfxline_t* line = readLine(r, &state); + out->fill(out, line, &color); + gfxline_free(line); + break; + } + case OP_FILLBITMAP: { + msg(" replay: FILLBITMAP"); + gfximage_t img = readImage(r, &state); + gfxmatrix_t matrix = readMatrix(r, &state); + gfxline_t* line = readLine(r, &state); + gfxcxform_t* cxform = readCXForm(r, &state); + out->fillbitmap(out, line, &img, &matrix, cxform); + gfxline_free(line); + if(cxform) + free(cxform); + free(img.data);img.data=0; + break; + } + case OP_FILLGRADIENT: { + msg(" replay: FILLGRADIENT"); + gfxgradienttype_t type; + int v = reader_readU8(r); + switch (v) { + case 0: + type = gfxgradient_radial; break; + case 1: + type = gfxgradient_linear; break; + } + gfxgradient_t*gradient = readGradient(r, &state); + gfxmatrix_t matrix = readMatrix(r, &state); + gfxline_t* line = readLine(r, &state); + out->fillgradient(out, line, gradient, type, &matrix); + break; + } + case OP_DRAWLINK: { + msg(" replay: DRAWLINK"); + gfxline_t* line = readLine(r, &state); + char* s = reader_readString(r); + char* t = reader_readString(r); + out->drawlink(out,line,s, t); + gfxline_free(line); + free(s); + break; + } + case OP_ADDFONT: { + msg(" replay: ADDFONT out=%08x(%s)", out, out->name); + gfxfont_t*font = readFont(r, &state); + if(!gfxfontlist_hasfont(*fontlist, font)) { + *fontlist = gfxfontlist_addfont(*fontlist, font); + out->addfont(out, font); + } else { + gfxfont_free(font); + } + break; + } + case OP_DRAWCHAR: { + U32 glyph = reader_readU32(r); + gfxmatrix_t m = {1,0,0, 0,1,0}; + char* id = 0; + if(!(flags&FLAG_ZERO_FONT)) + id = read_string(r, &state, op, flags); + gfxcolor_t color = read_color(r, &state, op, flags); + gfxmatrix_t matrix = read_matrix(r, &state, op, flags); + + gfxfont_t*font = id?gfxfontlist_findfont(*fontlist, id):0; + if(i && !font) { + font = gfxfontlist_findfont(i->fontlist, id); + } + msg(" replay: DRAWCHAR font=%s glyph=%d (flags=%d)", id, glyph, flags); + out->drawchar(out, font, glyph, &color, &matrix); + if(id) + free(id); + break; + } + } + } +finish: + state_clear(&state); + r->dealloc(r); + if(_fontlist) + gfxfontlist_free(_fontlist, 0); +} +void gfxresult_record_replay(gfxresult_t*result, gfxdevice_t*device, gfxfontlist_t**fontlist) +{ + internal_result_t*i = (internal_result_t*)result->internal; + + reader_t r; + if(i->use_tempfile) { + reader_init_filereader2(&r, i->filename); + } else { + reader_init_memreader(&r, i->data, i->length); + } + + replay(0, device, &r, fontlist); +} + +static void record_result_write(gfxresult_t*r, int filedesc) +{ + internal_result_t*i = (internal_result_t*)r->internal; + if(i->data) { + write(filedesc, i->data, i->length); + } +} +static int record_result_save(gfxresult_t*r, const char*filename) +{ + internal_result_t*i = (internal_result_t*)r->internal; + if(i->use_tempfile) { + move_file(i->filename, filename); + } else { + FILE*fi = fopen(filename, "wb"); + if(!fi) { + fprintf(stderr, "Couldn't open file %s for writing\n", filename); + return -1; + } + fwrite(i->data, i->length, 1, fi); + fclose(fi); + } + return 0; +} +static void*record_result_get(gfxresult_t*r, const char*name) +{ + internal_result_t*i = (internal_result_t*)r->internal; + if(!strcmp(name, "data")) { + return i->data; + } else if(!strcmp(name, "length")) { + return &i->length; + } + return 0; +} +static void record_result_destroy(gfxresult_t*r) +{ + internal_result_t*i = (internal_result_t*)r->internal; + if(i->data) { + free(i->data);i->data = 0; + } + if(i->filename) { + unlink(i->filename); + free(i->filename); + } + free(r->internal);r->internal = 0; + free(r); +} + +static unsigned char printable(unsigned char a) +{ + if(a<32 || a==127) return '.'; + else return a; +} + +static void hexdumpMem(unsigned char*data, int len) +{ + int t; + char ascii[32]; + for(t=0;tinternal; + if(out) { + if(!i->use_tempfile) { + int len=0; + void*data = writer_growmemwrite_memptr(&i->w, &len); + reader_t r; + reader_init_memreader(&r, data, len); + replay(dev, out, &r, fontlist); + writer_growmemwrite_reset(&i->w); + } else { + msg(" Flushing not supported for file based record device"); + exit(1); + } + } +} + +static gfxresult_t* record_finish(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + msg(" record: %08x END", dev); + + if(i->cliplevel) { + msg(" Warning: unclosed cliplevels"); + } + + state_clear(&i->state); + +#ifdef STATS + int total = i->w.pos; + if(total && i->use_tempfile) { + state_t*s = &i->state; + msg(" record device finished. stats:"); + msg(" %4.1f%% matrices (%d bytes)", s->size_matrices*100.0/total, s->size_matrices); + msg(" %4.1f%% positions (%d bytes)", s->size_positions*100.0/total, s->size_positions); + msg(" %4.1f%% colors (%d bytes)", s->size_colors*100.0/total, s->size_colors); + msg(" %4.1f%% lines (%d bytes)", s->size_lines*100.0/total, s->size_lines); + msg(" %4.1f%% fonts (%d bytes)", s->size_fonts*100.0/total, s->size_fonts); + msg(" %4.1f%% images (%d bytes)", s->size_images*100.0/total, s->size_images); + msg(" %4.1f%% characters (%d bytes)", s->size_chars*100.0/total, s->size_chars); + msg(" total: %d bytes", total); + } +#endif + + writer_writeU8(&i->w, OP_END); + + gfxfontlist_free(i->fontlist, 0); + + internal_result_t*ir = (internal_result_t*)rfx_calloc(sizeof(gfxresult_t)); + + ir->use_tempfile = i->use_tempfile; + if(i->use_tempfile) { + ir->filename = i->filename; + } else { + ir->data = writer_growmemwrite_getmem(&i->w); + ir->length = i->w.pos; + } + i->w.finish(&i->w); + + gfxresult_t*result= (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); + result->save = record_result_save; + result->get = record_result_get; + result->destroy = record_result_destroy; + result->internal = ir; + + free(dev->internal);memset(dev, 0, sizeof(gfxdevice_t)); + + return result; +} + +void gfxdevice_record_init(gfxdevice_t*dev, char use_tempfile) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "record"; + + dev->internal = i; + + i->use_tempfile = use_tempfile; + if(!use_tempfile) { + writer_init_growingmemwriter(&i->w, 1048576); + } else { + char buffer[128]; + i->filename = strdup(mktempname(buffer, "gfx")); + writer_init_filewriter2(&i->w, i->filename); + } + i->fontlist = gfxfontlist_create(); + i->cliplevel = 0; + + dev->setparameter = record_setparameter; + dev->startpage = record_startpage; + dev->startclip = record_startclip; + dev->endclip = record_endclip; + dev->stroke = record_stroke; + dev->fill = record_fill; + dev->fillbitmap = record_fillbitmap; + dev->fillgradient = record_fillgradient; + dev->addfont = record_addfont; + dev->drawchar = record_drawchar; + dev->drawlink = record_drawlink; + dev->endpage = record_endpage; + dev->finish = record_finish; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/record.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/record.h new file mode 100644 index 000000000..d47b0ec06 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/record.h @@ -0,0 +1,45 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __record_h__ +#define __record_h__ + +#include "../gfxdevice.h" +#include "../gfxtools.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_record_init(gfxdevice_t*, char use_tempfile); + +gfxdevice_t* gfxdevice_record_new(char*filename); + +void gfxdevice_record_flush(gfxdevice_t*, gfxdevice_t*, gfxfontlist_t**); + +void gfxresult_record_replay(gfxresult_t*, gfxdevice_t*, gfxfontlist_t**); + +#ifdef __cplusplus +} +#endif + +#endif //__record_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/render.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/render.c new file mode 100644 index 000000000..11c63d951 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/render.c @@ -0,0 +1,1084 @@ +/* render.c + + Part of the swftools package. + + Copyright (c) 2005/2006/2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../mem.h" +#include "../types.h" +#include "../png.h" +#include "../log.h" +#include "render.h" + +typedef gfxcolor_t RGBA; + +typedef struct _renderpoint +{ + float x; +} renderpoint_t; + +typedef struct _renderline +{ + renderpoint_t*points; + int size; + int num; +} renderline_t; + +typedef struct _internal_result { + gfximage_t img; + struct _internal_result*next; + char palette; +} internal_result_t; + +typedef struct _clipbuffer { + U32*data; + struct _clipbuffer*next; +} clipbuffer_t; + +typedef struct _internal { + int width; + int height; + int width2; + int height2; + int bitwidth; + int multiply; + int antialize; + int zoom; + int ymin, ymax; + int fillwhite; + + char palette; + + RGBA* img; + + clipbuffer_t*clipbuf; + + renderline_t*lines; + + internal_result_t*results; + internal_result_t*result_next; +} internal_t; + +typedef enum {filltype_solid,filltype_clip,filltype_bitmap,filltype_gradient} filltype_t; + +typedef struct _fillinfo { + filltype_t type; + gfxcolor_t*color; + gfximage_t*image; + gfxmatrix_t*matrix; + gfxcxform_t*cxform; + RGBA*gradient; + char linear_or_radial; +} fillinfo_t; + + +static inline void add_pixel(internal_t*i, float x, int y) +{ + renderpoint_t p; + + if(x >= i->width2 || y >= i->height2 || y<0) return; + p.x = x; + if(yymin) i->ymin = y; + if(y>i->ymax) i->ymax = y; + + renderline_t*l = &i->lines[y]; + + if(l->num == l->size) { + l->size += 32; + l->points = (renderpoint_t*)rfx_realloc(l->points, l->size * sizeof(renderpoint_t)); + } + l->points[l->num] = p; + l->num++; +} + +/* set this to 0.777777 or something if the "both fillstyles set while not inside shape" + problem appears to often */ +#define CUT 0.5 + +#define INT(x) ((int)((x)+16)-16) + +static void add_line(gfxdevice_t*dev , double x1, double y1, double x2, double y2) +{ + internal_t*i = (internal_t*)dev->internal; + double diffx, diffy; + double ny1, ny2, stepx; +/* if(DEBUG&4) { + int l = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); + printf(" l[%d - %.2f/%.2f -> %.2f/%.2f]\n", l, x1/20.0, y1/20.0, x2/20.0, y2/20.0); + }*/ + + if(y2 < y1) { + double x; + double y; + x = x1;x1 = x2;x2=x; + y = y1;y1 = y2;y2=y; + } + + diffx = x2 - x1; + diffy = y2 - y1; + + ny1 = INT(y1)+CUT; + ny2 = INT(y2)+CUT; + + if(ny1 < y1) { + ny1 = INT(y1) + 1.0 + CUT; + } + if(ny2 >= y2) { + ny2 = INT(y2) - 1.0 + CUT; + } + + if(ny1 > ny2) + return; + + stepx = diffx/diffy; + x1 = x1 + (ny1-y1)*stepx; + x2 = x2 + (ny2-y2)*stepx; + + { + int posy=INT(ny1); + int endy=INT(ny2); + double posx=0; + double startx = x1; + + while(posy<=endy) { + float xx = (float)(startx + posx); + add_pixel(i, xx ,posy); + posx+=stepx; + posy++; + } + } +} +#define PI 3.14159265358979 +static void add_solidline(gfxdevice_t*dev, double x1, double y1, double x2, double y2, double width) +{ + /* TODO: handle cap styles */ + + internal_t*i = (internal_t*)dev->internal; + + double dx = x2-x1; + double dy = y2-y1; + double sd; + double d; + + int t; + int segments; + double lastx,lasty; + double vx,vy; + double xx,yy; + + /* Make sure the line is always at least one pixel wide */ +#ifdef LINEMODE1 + /* That's what Macromedia's Player does at least at zoom level >= 1. */ + width += 1.0; +#else + /* That's what Macromedia's Player seems to do at zoom level 0. */ + /* TODO: needs testing */ + + /* TODO: how does this interact with scaling? */ + if(width * i->multiply < 1.0) + width = 1.0 / i->multiply; +#endif + + sd = (double)dx*(double)dx+(double)dy*(double)dy; + d = sqrt(sd); + + if(!dx && !dy) { + vx = 1; + vy = 0; + } else { + vx = ( dy/d); + vy = (-dx/d); + } + + segments = width/2; + if(segments < 2) + segments = 2; + + segments = 8; + + vx=vx*width*0.5; + vy=vy*width*0.5; + + xx = x2+vx; + yy = y2+vy; + add_line(dev, x1+vx, y1+vy, xx, yy); + lastx = xx; + lasty = yy; + for(t=1;tx < b->x) return -1; + if(a->x > b->x) return 1; + return 0; +} + +static void fill_line_solid(RGBA*line, U32*z, int y, int x1, int x2, RGBA col) +{ + int x = x1; + + U32 bit = 1<<(x1&31); + int bitpos = (x1/32); + + if(col.a!=255) { + int ainv = 255-col.a; + col.r = (col.r*col.a)/255; + col.g = (col.g*col.a)/255; + col.b = (col.b*col.a)/255; + do { + if(z[bitpos]&bit) { + line[x].r = ((line[x].r*ainv)/255)+col.r; + line[x].g = ((line[x].g*ainv)/255)+col.g; + line[x].b = ((line[x].b*ainv)/255)+col.b; + //line[x].a = 255; + line[x].a = ((line[x].a*ainv)/255)+col.a; + } + bit <<= 1; + if(!bit) { + bit = 1;bitpos++; + } + } while(++xmatrix; + gfximage_t*b = info->image; + + if(!b || !b->width || !b->height) { + gfxcolor_t red = {255,255,0,0}; + fill_line_solid(line, z, y, x1, x2, red); + return; + } + + double det = m->m00*m->m11 - m->m01*m->m10; + if(fabs(det) < 0.0005) { + /* x direction equals y direction- the image is invisible */ + return; + } + det = 1.0/det; + double xx1 = ( (-m->tx) * m->m11 - (y - m->ty) * m->m10) * det; + double yy1 = (- (-m->tx) * m->m01 + (y - m->ty) * m->m00) * det; + double xinc1 = m->m11 * det; + double yinc1 = m->m01 * det; + + U32 bit = 1<<(x1&31); + int bitpos = (x1/32); + + do { + if(z[bitpos]&bit) { + RGBA col; + int xx = (int)(xx1 + x * xinc1); + int yy = (int)(yy1 - x * yinc1); + int ainv; + + if(info->linear_or_radial) { + if(xx<0) xx=0; + if(xx>=b->width) xx = b->width-1; + if(yy<0) yy=0; + if(yy>=b->height) yy = b->height-1; + } else { + xx %= b->width; + yy %= b->height; + if(xx<0) xx += b->width; + if(yy<0) yy += b->height; + } + + col = b->data[yy*b->width+xx]; + ainv = 255-col.a; + + /* needs bitmap with premultiplied alpha */ + line[x].r = ((line[x].r*ainv)/255)+col.r; + line[x].g = ((line[x].g*ainv)/255)+col.g; + line[x].b = ((line[x].b*ainv)/255)+col.b; + line[x].a = 255; + } + bit <<= 1; + if(!bit) { + bit = 1;bitpos++; + } + } while(++xmatrix; + RGBA*g= info->gradient; + + double det = m->m00*m->m11 - m->m01*m->m10; + if(fabs(det) < 0.0005) { + /* x direction equals y direction */ + return; + } + + det = 1.0/det; + double xx1 = ( (-m->tx) * m->m11 - (y - m->ty) * m->m10) * det; + double yy1 = (- (-m->tx) * m->m01 + (y - m->ty) * m->m00) * det; + double xinc1 = m->m11 * det; + double yinc1 = m->m01 * det; + + U32 bit = 1<<(x1&31); + int bitpos = (x1/32); + + do { + if(z[bitpos]&bit) { + RGBA col; + int ainv; + + int pos = 0; + if(info->linear_or_radial) { + double xx = xx1 + x * xinc1; + double yy = yy1 + y * yinc1; + double r = sqrt(xx*xx + yy*yy); + if(r>1) r = 1; + pos = (int)(r*255.999); + } else { + double r = xx1 + x * xinc1; + if(r>1) r = 1; + if(r<-1) r = -1; + pos = (int)((r+1)*127.999); + } + col = g[pos]; + ainv = 255-col.a; + + /* needs bitmap with premultiplied alpha */ + line[x].r = ((line[x].r*ainv)/255)+col.r; + line[x].g = ((line[x].g*ainv)/255)+col.g; + line[x].b = ((line[x].b*ainv)/255)+col.b; + line[x].a = 255; + } + bit <<= 1; + if(!bit) { + bit = 1;bitpos++; + } + } while(++xtype == filltype_solid) + fill_line_solid(line, zline, y, startx, endx, *fill->color); + else if(fill->type == filltype_clip) + fill_line_clip(line, zline, y, startx, endx); + else if(fill->type == filltype_bitmap) + fill_line_bitmap(line, zline, y, startx, endx, fill); + else if(fill->type == filltype_gradient) + fill_line_gradient(line, zline, y, startx, endx, fill); +} + +void fill(gfxdevice_t*dev, fillinfo_t*fill) +{ + internal_t*i = (internal_t*)dev->internal; + int y; + U32 clipdepth = 0; + for(y=i->ymin;y<=i->ymax;y++) { + renderpoint_t*points = i->lines[y].points; + RGBA*line = &i->img[i->width2*y]; + U32*zline = &i->clipbuf->data[i->bitwidth*y]; + + int n; + int num = i->lines[y].num; + int lastx; + qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); + + for(n=0;nx; + int endx = next?next->x:i->width2; + if(endx > i->width2) + endx = i->width2; + if(startx < 0) + startx = 0; + if(endx < 0) + endx = 0; + + if(!(n&1)) + fill_line(dev, line, zline, y, startx, endx, fill); + + lastx = endx; + if(endx == i->width2) + break; + } + if(fill->type == filltype_clip) { + if(i->clipbuf->next) { + U32*line2 = &i->clipbuf->next->data[i->bitwidth*y]; + int x; + for(x=0;xbitwidth;x++) + zline[x] &= line2[x]; + } + } + + i->lines[y].num = 0; + } +} + +void fill_solid(gfxdevice_t*dev, gfxcolor_t* color) +{ + fillinfo_t info; + memset(&info, 0, sizeof(info)); + info.type = filltype_solid; + info.color = color; + fill(dev, &info); +} + +int render_setparameter(struct _gfxdevice*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + if(!strcmp(key, "antialize") || !strcmp(key, "antialise")) { + i->antialize = atoi(value); + i->zoom = i->antialize * i->multiply; + return 1; + } else if(!strcmp(key, "multiply")) { + i->multiply = atoi(value); + i->zoom = i->antialize * i->multiply; + fprintf(stderr, "Warning: multiply not implemented yet\n"); + return 1; + } else if(!strcmp(key, "fillwhite")) { + i->fillwhite = atoi(value); + return 1; + } else if(!strcmp(key, "palette")) { + i->palette = atoi(value); + return 1; + } + return 0; +} + +void newclip(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + clipbuffer_t*c = (clipbuffer_t*)rfx_calloc(sizeof(clipbuffer_t)); + c->data = (U32*)rfx_calloc(sizeof(U32) * i->bitwidth * i->height2); + c->next = i->clipbuf; + i->clipbuf = c; + memset(c->data, 0, sizeof(U32)*i->bitwidth*i->height2); +} + +void endclip(struct _gfxdevice*dev, char removelast) +{ + internal_t*i = (internal_t*)dev->internal; + + /* test for at least one cliplevel (the one we created ourselves) */ + if(!i->clipbuf || (!i->clipbuf->next && !removelast)) { + fprintf(stderr, "endclip without any active clip buffers\n"); + return; + } + + clipbuffer_t*c = i->clipbuf; + i->clipbuf = i->clipbuf->next; + c->next = 0; + free(c->data);c->data = 0; + free(c); +} + +void render_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + double x,y; + + /*if(cap_style != gfx_capRound || joint_style != gfx_joinRound) { + fprintf(stderr, "Warning: cap/joint style != round not yet supported\n"); + }*/ + + while(line) { + if(line->type == gfx_moveTo) { + } else if(line->type == gfx_lineTo) { + double x1=x*i->zoom,y1=y*i->zoom; + double x3=line->x*i->zoom,y3=line->y*i->zoom; + add_solidline(dev, x1, y1, x3, y3, width * i->zoom); + fill_solid(dev, color); + } else if(line->type == gfx_splineTo) { + int t,parts; + double xx,yy; + + double x1=x*i->zoom,y1=y*i->zoom; + double x2=line->sx*i->zoom,y2=line->sy*i->zoom; + double x3=line->x*i->zoom,y3=line->y*i->zoom; + + double c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1); + xx=x1; + yy=y1; + + parts = (int)(sqrt(c)/3); + if(!parts) parts = 1; + + for(t=1;t<=parts;t++) { + double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); + double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); + + add_solidline(dev, xx, yy, nx, ny, width * i->zoom); + fill_solid(dev, color); + xx = nx; + yy = ny; + } + } + x = line->x; + y = line->y; + line = line->next; + } +} + +static void draw_line(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + double x=0,y=0; + + while(line) + { + int x1,y1,x2,y2,x3,y3; + + if(line->type == gfx_moveTo) { + } else if(line->type == gfx_lineTo) { + double x1=x*i->zoom,y1=y*i->zoom; + double x3=line->x*i->zoom,y3=line->y*i->zoom; + + add_line(dev, x1, y1, x3, y3); + } else if(line->type == gfx_splineTo) { + int c,t,parts,qparts; + double xx,yy; + + double x1=x*i->zoom,y1=y*i->zoom; + double x2=line->sx*i->zoom,y2=line->sy*i->zoom; + double x3=line->x*i->zoom,y3=line->y*i->zoom; + + c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1); + xx=x1; + yy=y1; + + parts = (int)(sqrt(c)); + if(!parts) parts = 1; + + for(t=1;t<=parts;t++) { + double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); + double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); + + add_line(dev, xx, yy, nx, ny); + xx = nx; + yy = ny; + } + } + x = line->x; + y = line->y; + line = line->next; + } +} + +void render_startclip(struct _gfxdevice*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + fillinfo_t info; + memset(&info, 0, sizeof(info)); + newclip(dev); + info.type = filltype_clip; + draw_line(dev, line); + fill(dev, &info); +} + +void render_endclip(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + endclip(dev, 0); +} + +void render_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + + draw_line(dev, line); + fill_solid(dev, color); +} + +void render_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + + gfxmatrix_t m2 = *matrix; + + draw_line(dev, line); + + fillinfo_t info; + memset(&info, 0, sizeof(info)); + info.type = filltype_bitmap; + info.image = img; + info.matrix = &m2; + info.cxform = cxform; + + m2.m00 *= i->zoom; m2.m01 *= i->zoom; m2.tx *= i->zoom; + m2.m10 *= i->zoom; m2.m11 *= i->zoom; m2.ty *= i->zoom; + + fill(dev, &info); +} + +void render_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + + gfxmatrix_t m2 = *matrix; + + draw_line(dev, line); + + RGBA g[256]; + fillinfo_t info; + memset(&info, 0, sizeof(info)); + info.type = filltype_gradient; + info.gradient = g; + info.matrix = &m2; + + m2.m00 *= i->zoom; m2.m01 *= i->zoom; m2.tx *= i->zoom; + m2.m10 *= i->zoom; m2.m11 *= i->zoom; m2.ty *= i->zoom; + + info.linear_or_radial = type == gfxgradient_radial; + + int pos = 0; + gfxcolor_t color = {0,0,0,0}; + pos=0; + while(gradient) { + int nextpos = gradient->pos*256; + int t; + if(nextpos>256) { + msg(" Invalid gradient- contains values > 1.0"); + return; + } + + gfxcolor_t nextcolor = gradient->color; + if(nextpos!=pos) { + double p0 = 1.0; + double p1 = 0.0; + double step = 1.0/(nextpos-pos); + int t; + for(t=pos;tnext; + } + if(pos!=256) { + msg(" Invalid gradient- doesn't end with 1.0"); + } + + fill(dev, &info); +} + +void render_addfont(struct _gfxdevice*dev, gfxfont_t*font) +{ +} + +void render_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + if(!font) + return; + + /* align characters to whole pixels */ + matrix->tx = (int)(matrix->tx * i->antialize) / i->antialize; + matrix->ty = (int)(matrix->ty * i->antialize) / i->antialize; + + gfxglyph_t*glyph = &font->glyphs[glyphnr]; + gfxline_t*line2 = gfxline_clone(glyph->line); + gfxline_transform(line2, matrix); + draw_line(dev, line2); + fill_solid(dev, color); + gfxline_free(line2); + + return; +} + +void render_result_write(gfxresult_t*r, int filedesc) +{ + internal_result_t*i= (internal_result_t*)r->internal; +} +int render_result_save(gfxresult_t*r, const char*filename) +{ + internal_result_t*i= (internal_result_t*)r->internal; + if(!i) { + return 0; // no pages drawn + } + if(i->next) { + int nr=0; + char filenamebuf[256]; + char*origname = strdup(filename); + int l = strlen(origname); + if(l>3 && strchr("gG",origname[l-1]) && strchr("nN",filename[l-2]) && + strchr("pP",origname[l-3]) && filename[l-4]=='.') { + origname[l-4] = 0; + } + while(i->next) { + sprintf(filenamebuf, "%s.%d.png", origname, nr); + if(!i->palette) { + png_write(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } else { + png_write_palette_based_2(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } + nr++; + } + free(origname); + } else { + if(!i->palette) { + png_write(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } else { + png_write_palette_based_2(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } + } + return 1; +} +char*gfximage_asXPM(gfximage_t*img, int depth) +{ + int d= 256/depth; + char*str = (char*)malloc(img->width*img->height*4 + 500 + 16*depth*depth*depth); + char*p = str; + p+= sprintf(p, "static char *noname[] = {\n\"%d %d 262144 3\",\n", img->width, img->height); + int r,g,b; + for(r=0;rheight;y++) { + p+=sprintf(p, "\""); + gfxcolor_t*col = &img->data[y*img->height]; + int x; + for(x=0;xwidth;x++) { + p+=sprintf(p, "%c%c%c", 32+(col->r/d), 32+(col->g/d), 32+(col->b/d)); + } + p+=sprintf(p, "\",\n"); + } + *p = 0; + return p; +} +void*render_result_get(gfxresult_t*r, const char*name) +{ + internal_result_t*i= (internal_result_t*)r->internal; + if(!strncmp(name,"xpm",3)) { + int pagenr = atoi(&name[3]); + if(pagenr<0) + pagenr=0; + while(pagenr>0) { + i = i->next; + if(!i) + return 0; + pagenr--; + } + return gfximage_asXPM(&i->img, 64); + } else if(!strncmp(name,"page",4)) { + int pagenr = atoi(&name[4]); + if(pagenr<0) + pagenr=0; + while(pagenr>0) { + i = i->next; + if(!i) + return 0; + pagenr--; + } + return &i->img; + } + return 0; +} +void render_result_destroy(gfxresult_t*r) +{ + internal_result_t*i= (internal_result_t*)r->internal; + r->internal = 0; + while(i) { + internal_result_t*next = i->next; + free(i->img.data);i->img.data = 0; + + /* FIXME memleak + the following rfx_free causes a segfault on WIN32 machines, + if executed */ + //rfx_free(i); + + i = next; + } + rfx_free(r); +} + +gfxresult_t* render_finish(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + gfxresult_t* res = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); + + res->internal = i->results;i->results = 0; + res->write = render_result_write; + res->save = render_result_save; + res->get = render_result_get; + res->destroy = render_result_destroy; + + free(dev->internal); dev->internal = 0; i = 0; + + return res; +} + +void render_startpage(struct _gfxdevice*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + int y; + + if(i->width2 || i->height2) { + fprintf(stderr, "Error: startpage() called twice (no endpage()?)\n"); + exit(1); + } + + i->width = width*i->multiply; + i->height = height*i->multiply; + i->width2 = width*i->zoom; + i->height2 = height*i->zoom; + i->bitwidth = (i->width2+31)/32; + + i->lines = (renderline_t*)rfx_alloc(i->height2*sizeof(renderline_t)); + for(y=0;yheight2;y++) { + memset(&i->lines[y], 0, sizeof(renderline_t)); + i->lines[y].points = 0; + i->lines[y].num = 0; + } + i->img = (RGBA*)rfx_calloc(sizeof(RGBA)*i->width2*i->height2); + if(i->fillwhite) { + memset(i->img, 0xff, sizeof(RGBA)*i->width2*i->height2); + } + + i->ymin = 0x7fffffff; + i->ymax = -0x80000000; + + + /* initialize initial clipping field, which doesn't clip anything yet */ + newclip(dev); + memset(i->clipbuf->data, 255, sizeof(U32)*i->bitwidth*i->height2); +} + +static void store_image(internal_t*i, internal_result_t*ir) +{ + ir->img.data = (gfxcolor_t*)malloc(i->width*i->height*sizeof(gfxcolor_t)); + ir->img.width = i->width; + ir->img.height = i->height; + + gfxcolor_t*dest = ir->img.data; + + if(i->antialize <= 1) /* no antializing */ { + int y; + for(y=0;yheight;y++) { + RGBA*line = &i->img[y*i->width]; + memcpy(&dest[y*i->width], line, sizeof(RGBA)*i->width); + } + } else { + RGBA**lines = (RGBA**)rfx_calloc(sizeof(RGBA*)*i->antialize); + int q = i->antialize*i->antialize; + int ypos = 0; + int y; + int y2=0; + for(y=0;yheight2;y++) { + int n; + ypos = y % i->antialize; + lines[ypos] = &i->img[y*i->width2]; + if(ypos == i->antialize-1) { + RGBA*out = &dest[(y2++)*i->width]; + int x; + int r,g,b,a; + for(x=0;xwidth;x++) { + int xpos = x*i->antialize; + int yp; + U32 r=0,g=0,b=0,a=0; + for(yp=0;ypantialize;yp++) { + RGBA*lp = &lines[yp][xpos]; + int xp; + for(xp=0;xpantialize;xp++) { + RGBA*p = &lp[xp]; + r += p->r; + g += p->g; + b += p->b; + a += p->a; + } + } + out[x].r = r / q; + out[x].g = g / q; + out[x].b = b / q; + out[x].a = a / q; + } + } + } + rfx_free(lines); + } +} + +void render_endpage(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + if(!i->width2 || !i->height2) { + fprintf(stderr, "Error: endpage() called without corresponding startpage()\n"); + exit(1); + } + + endclip(dev, 1); + int unclosed = 0; + while(i->clipbuf) { + endclip(dev, 1); + unclosed++; + } + + if(unclosed) { + fprintf(stderr, "Warning: %d unclosed clip(s) while processing endpage()\n", unclosed); + } + + internal_result_t*ir= (internal_result_t*)rfx_calloc(sizeof(internal_result_t)); + ir->palette = i->palette; + + int y,x; + + store_image(i, ir); + + ir->next = 0; + if(i->result_next) { + i->result_next->next = ir; + } + if(!i->results) { + i->results = ir; + } + i->result_next = ir; + + for(y=0;yheight2;y++) { + rfx_free(i->lines[y].points); i->lines[y].points = 0; + } + rfx_free(i->lines);i->lines=0; + + if(i->img) {rfx_free(i->img);i->img = 0;} + + i->width2 = 0; + i->height2 = 0; +} + +void render_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) +{ + /* not supported for this output device */ +} + +void gfxdevice_render_init(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "render"; + + dev->internal = i; + + i->width = 0; + i->width2 = 0; + i->height = 0; + i->height2 = 0; + i->antialize = 1; + i->multiply = 1; + i->zoom = 1; + + dev->setparameter = render_setparameter; + dev->startpage = render_startpage; + dev->startclip = render_startclip; + dev->endclip = render_endclip; + dev->stroke = render_stroke; + dev->fill = render_fill; + dev->fillbitmap = render_fillbitmap; + dev->fillgradient = render_fillgradient; + dev->addfont = render_addfont; + dev->drawchar = render_drawchar; + dev->drawlink = render_drawlink; + dev->endpage = render_endpage; + dev->finish = render_finish; +} + + +gfxdevice_t* gfxdevice_render_new() +{ + gfxdevice_t* d = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_render_init(d); + return d; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/render.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/render.h new file mode 100644 index 000000000..589f2a5b2 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/render.h @@ -0,0 +1,39 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __render_h__ +#define __render_h__ + +#include "../gfxdevice.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_render_init(gfxdevice_t*); +gfxdevice_t* gfxdevice_render_new(); + +#ifdef __cplusplus +} +#endif + +#endif //__swfoutput_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c new file mode 100644 index 000000000..413a54299 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c @@ -0,0 +1,340 @@ +/* rescale.c + + Part of the swftools package. + + Copyright (c) 2006 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include +#include "rescale.h" +#include "../types.h" +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" + +typedef struct _internal { + gfxdevice_t*out; + int origwidth; + int origheight; + int targetwidth; + int targetheight; + int centerx, centery; + gfxmatrix_t matrix; + double zoomwidth; + int keepratio; +} internal_t; + +static int verbose = 1; +static void dbg(char*format, ...) +{ + if(!verbose) + return; + char buf[1024]; + int l; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(device-rescale) %s\n", buf); + fflush(stdout); +} + +char gfxline_isRect(gfxline_t*line) +{ + return 1; + if(!line) + return 0; + double x1=line->x,y1=line->x,x2=line->x,y2=line->y; + int nx1=0,nx2=0,ny1=0,ny2=0; + line = line->next; + while(line) { + if(line->type != gfx_lineTo) + return 0; + if(line->x < x1) { + x1 = line->x; + nx1++; + } else if(line->y < y1) { + y1 = line->y; + ny1++; + } else if(line->x > x2) { + x2 = line->x; + nx2++; + } else if(line->y > y1) { + y2 = line->y; + ny2++; + } + line = line->next; + } + return (nx1+nx2)==1 && (ny1+ny2)==1; +} + +gfxline_t*transformgfxline(internal_t*i, gfxline_t*line) +{ + /* special case: transformed rectangle + if(gfxline_isRect(line)) { + gfxbbox_t bbox = gfxline_getbbox(line); + if(fabs(bbox.xmin)<0.1 && fabs(bbox.ymin)<0.1 && + fabs(bbox.ymax-i->origwidth)<0.1 && fabs(bbox.ymax-i->origheight)<0.1) { + gfxline_t r[5]; + r[0].x = 0; r[0].y = 0; r[0].type = gfx_moveTo;r[0].next = &r[1]; + r[1].x = i->targetwidth;r[1].y = 0; r[1].type = gfx_lineTo;r[1].next = &r[2]; + r[2].x = i->targetwidth;r[2].y = i->targetheight;r[2].type = gfx_lineTo;r[2].next = &r[3]; + r[3].x = 0; r[3].y = i->targetheight;r[3].type = gfx_lineTo;r[3].next = &r[4]; + r[4].x = 0; r[4].y = 0; r[4].type = gfx_lineTo;r[4].next = 0; + return gfxline_clone(r); + } + } */ + gfxline_t*line2 = gfxline_clone(line); + gfxline_transform(line2, &i->matrix); + return line2; +} + +int rescale_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + if(!strcmp(key, "keepratio")) { + i->keepratio = atoi(value); + return 1; + } else if(!strcmp(key, "centerx")) { + i->centerx = atoi(value); + return 1; + } else if(!strcmp(key, "centery")) { + i->centery = atoi(value); + return 1; + } else { + if(i->out) { + return i->out->setparameter(i->out,key,value); + } else { + return 0; + } + } +} + +void rescale_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + + i->origwidth = width; + i->origheight = height; + + if(i->targetwidth || i->targetheight) { + int targetwidth = i->targetwidth; + if(!targetwidth) + targetwidth = width*i->targetheight/height; + int targetheight = i->targetheight; + if(!targetheight) + targetheight = height*i->targetwidth/width; + if(i->keepratio) { + double rx = (double)targetwidth / (double)width; + double ry = (double)targetheight / (double)height; + if(rxmatrix.m00 = rx; + i->matrix.m11 = rx; + i->matrix.tx = 0; + if(i->centery) { + i->matrix.ty = (targetheight - height*rx) / 2; + } + } else { + i->matrix.m00 = ry; + i->matrix.m11 = ry; + if(i->centerx) { + i->matrix.tx = (targetwidth - width*ry) / 2; + } + i->matrix.ty = 0; + } + } else { + i->matrix.m00 = (double)targetwidth / (double)width; + i->matrix.m11 = (double)targetheight / (double)height; + } + i->zoomwidth = sqrt(i->matrix.m00*i->matrix.m11); + i->out->startpage(i->out,targetwidth,targetheight); + } else { + i->out->startpage(i->out,(int)(width*i->matrix.m00),(int)(height*i->matrix.m11)); + } +} + +void rescale_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + gfxline_t*line2 = transformgfxline(i, line); + i->out->startclip(i->out,line2); + gfxline_free(line2); +} + +void rescale_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->endclip(i->out); +} + +void rescale_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + gfxline_t*line2 = transformgfxline(i, line); + i->out->stroke(i->out, line2, width*i->zoomwidth, color, cap_style, joint_style, miterLimit); + gfxline_free(line2); +} + +void rescale_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + gfxline_t*line2 = transformgfxline(i, line); + i->out->fill(i->out, line2, color); + gfxline_free(line2); +} + +void rescale_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + gfxline_t*line2 = transformgfxline(i, line); + gfxmatrix_t m2; + gfxmatrix_multiply(&i->matrix, matrix, &m2); + i->out->fillbitmap(i->out, line2, img, &m2, cxform); + gfxline_free(line2); +} + +void rescale_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + gfxline_t*line2 = transformgfxline(i, line); + i->out->fillgradient(i->out, line2, gradient, type, matrix); + gfxline_free(line2); +} + +void rescale_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->addfont(i->out, font); +} + +void rescale_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + gfxmatrix_t m2; + gfxmatrix_multiply(&i->matrix, matrix, &m2); + i->out->drawchar(i->out, font, glyphnr, color, &m2); +} + +void rescale_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + gfxline_t*line2 = transformgfxline(i, line); + i->out->drawlink(i->out, line2, action, text); + gfxline_free(line2); +} + +void rescale_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->endpage(i->out); +} + +gfxresult_t* rescale_finish(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + gfxdevice_t*out = i->out; + free(dev->internal);dev->internal = 0;i=0; + if(out) { + return out->finish(out); + } else { + return 0; + } +} + +void gfxdevice_rescale_init(gfxdevice_t*dev, gfxdevice_t*out, int width, int height, double scale) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "rescale"; + + dev->internal = i; + + dev->setparameter = rescale_setparameter; + dev->startpage = rescale_startpage; + dev->startclip = rescale_startclip; + dev->endclip = rescale_endclip; + dev->stroke = rescale_stroke; + dev->fill = rescale_fill; + dev->fillbitmap = rescale_fillbitmap; + dev->fillgradient = rescale_fillgradient; + dev->addfont = rescale_addfont; + dev->drawchar = rescale_drawchar; + dev->drawlink = rescale_drawlink; + dev->endpage = rescale_endpage; + dev->finish = rescale_finish; + + gfxmatrix_unit(&i->matrix); + i->targetwidth = width; + i->targetheight = height; + i->zoomwidth = 1.0; + i->centerx = 1; + + i->matrix.m00 = scale; + i->matrix.m01 = 0; + i->matrix.m11 = scale; + i->matrix.m10 = 0; + i->matrix.tx = 0; + i->matrix.ty = 0; + i->zoomwidth = scale; + + i->out = out; +} + +void gfxdevice_rescale_setzoom(gfxdevice_t*dev, double scale) +{ + internal_t*i = (internal_t*)dev->internal; + if(strcmp(dev->name, "rescale")) { + fprintf(stderr, "Internal error: can't cast device %s to a rescale device\n", dev->name); + return; + } + i->matrix.m00 = scale; + i->matrix.m01 = 0; + i->matrix.m11 = scale; + i->matrix.m10 = 0; + i->matrix.tx = 0; + i->matrix.ty = 0; + i->zoomwidth = scale; +} +void gfxdevice_rescale_setdevice(gfxdevice_t*dev, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)dev->internal; + if(strcmp(dev->name, "rescale")) { + fprintf(stderr, "Internal error: can't cast device %s to a rescale device\n", dev->name); + return; + } + i->out = out; +} + +gfxdevice_t* gfxdevice_rescale_new(gfxdevice_t*out, int width, int height, double scale) +{ + gfxdevice_t* d = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_rescale_init(d, out, width, height, scale); + return d; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h new file mode 100644 index 000000000..b8ca6bb75 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h @@ -0,0 +1,47 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_rescale_h__ +#define __gfxdevice_rescale_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* either: + width,height = desired output size + or: + scale = desired zoom factor +*/ +void gfxdevice_rescale_init(gfxdevice_t*dev, gfxdevice_t*out, int width, int height, double scale); +gfxdevice_t* gfxdevice_rescale_new(gfxdevice_t*out, int width, int height, double scale); + +void gfxdevice_rescale_setzoom(gfxdevice_t*dev, double scale); +void gfxdevice_rescale_setdevice(gfxdevice_t*dev, gfxdevice_t*out); + + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_rescale_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c new file mode 100644 index 000000000..74d124ce2 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c @@ -0,0 +1,3178 @@ +/* gfxdevice_swf.c + + Part of the swftools package. + + Copyright (c) 2001,2002,2003,2004,2005 Matthias Kramm + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include "../../config.h" +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_ASSERT_H +#include +#else +#define assert(a) +#endif +#include +#include "../mem.h" +#include "../log.h" +#include "../rfxswf.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "swf.h" +#include "../gfxpoly.h" +#include "../gfximage.h" + +#define CHARDATAMAX 1024 +#define CHARMIDX 0 +#define CHARMIDY 0 + +typedef struct _charatposition { + int charid; + SWFFONT*font; + int x; + int y; + int size; + RGBA color; +} charatposition_t; + +typedef struct _chararray { + charatposition_t chr[CHARDATAMAX+1]; + int pos; + struct _chararray *next; +} chararray_t; + +typedef struct _charbuffer { + MATRIX matrix; + chararray_t*array; + chararray_t*last; + struct _charbuffer *next; +} charbuffer_t; + +typedef struct _fontlist +{ + SWFFONT *swffont; + struct _fontlist*next; +} fontlist_t; + +typedef long int twip; + +typedef struct _swfmatrix { + double m11,m12,m21,m22,m31,m32; +} swfmatrix_t; + +typedef struct _swfoutput_internal +{ + gfxdevice_t*dev; // the gfxdevice object where this internal struct resides + + double config_dumpfonts; + double config_ppmsubpixels; + double config_jpegsubpixels; + char hasbuttons; + int config_invisibletexttofront; + int config_dots; + int config_simpleviewer; + int config_opennewwindow; + int config_ignoredraworder; + int config_drawonlyshapes; + int config_frameresets; + int config_linknameurl; + int config_jpegquality; + int config_storeallcharacters; + int config_enablezlib; + int config_insertstoptag; + int config_showimages; + int config_watermark; + int config_noclips; + int config_flashversion; + int config_reordertags; + int config_showclipshapes; + int config_splinemaxerror; + int config_fontsplinemaxerror; + int config_filloverlap; + int config_protect; + int config_bboxvars; + int config_disable_polygon_conversion; + int config_normalize_polygon_positions; + int config_alignfonts; + double config_override_line_widths; + double config_remove_small_polygons; + char config_disablelinks; + RGBA config_linkcolor; + float config_minlinewidth; + double config_caplinewidth; + char* config_linktarget; + char*config_internallinkfunction; + char*config_externallinkfunction; + char config_animate; + double config_framerate; + + SWF* swf; + + fontlist_t* fontlist; + + char storefont; + + MATRIX page_matrix; + + TAG *tag; + int currentswfid; + int startids; + int depth; + int startdepth; + int linewidth; + + SHAPE* shape; + int shapeid; + int textmode; + + int watermarks; + + int fillstyleid; + int linestyleid; + int swflastx; + int swflasty; + int lastwasfill; + int shapeisempty; + char fill; + int min_x,max_x; + int min_y,max_y; + TAG* cliptags[128]; + int clipshapes[128]; + U32 clipdepths[128]; + int clippos; + + /* image cache */ + /* + int pic_xids[1024]; + int pic_yids[1024]; + int pic_ids[1024]; + int pic_width[1024]; + int pic_height[1024]; + int picpos; + */ + + int frameno; + int lastframeno; + + char fillstylechanged; + + int jpeg; //next image type + + int bboxrectpos; + SRECT bboxrect; + + SRECT pagebbox; + + gfxline_t*stored_clipshapes; //for config_showclipshapes + + charbuffer_t* chardata; + charbuffer_t* topchardata; //chars supposed to be above everything else + + int firstpage; + char pagefinished; + + char overflow; + + int current_font_size; + MATRIX fontmatrix; + double lastfontm11,lastfontm12,lastfontm21,lastfontm22; + SWFFONT *swffont; + RGBA strokergb; + RGBA fillrgb; + int drawmode; + + int shapeposx; + int shapeposy; + + char* mark; + +} swfoutput_internal; + +static const int NO_FONT3=0; + +static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform); +static int swf_setparameter(gfxdevice_t*driver, const char*key, const char*value); +static void swf_drawstroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); +static void swf_startclip(gfxdevice_t*dev, gfxline_t*line); +static void swf_endclip(gfxdevice_t*dev); +static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); +static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color); +static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix); +static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); +static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font); +static void swf_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text); +static void swf_startframe(gfxdevice_t*dev, int width, int height); +static void swf_endframe(gfxdevice_t*dev); +static void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points); +static void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points); +static void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points); + +static gfxresult_t* swf_finish(gfxdevice_t*driver); + +static swfoutput_internal* init_internal_struct() +{ + swfoutput_internal*i = (swfoutput_internal*)malloc(sizeof(swfoutput_internal)); + memset(i, 0, sizeof(swfoutput_internal)); + + i->storefont = 0; + i->currentswfid = 0; + i->depth = 0; + i->overflow = 0; + i->startdepth = 0; + i->linewidth = 0; + i->shapeid = -1; + i->textmode = 0; + i->frameno = 0; + i->lastframeno = 0; + + i->mark = 0; + + i->fillstyleid; + i->linestyleid; + i->swflastx=0; + i->swflasty=0; + i->lastwasfill = 0; + i->shapeisempty = 1; + i->fill = 0; + i->clippos = 0; + + i->fillstylechanged = 0; + + i->bboxrectpos = -1; + i->chardata = 0; + i->firstpage = 1; + i->pagefinished = 1; + + i->config_disablelinks=0; + i->config_dumpfonts=0; + i->config_ppmsubpixels=0; + i->config_jpegsubpixels=0; + i->config_opennewwindow=1; + i->config_ignoredraworder=0; + i->config_drawonlyshapes=0; + i->config_jpegquality=85; + i->config_storeallcharacters=0; + i->config_dots=1; + i->config_enablezlib=0; + i->config_insertstoptag=0; + i->config_flashversion=6; + i->config_framerate=0.25; + i->config_splinemaxerror=1; + i->config_fontsplinemaxerror=1; + i->config_filloverlap=0; + i->config_protect=0; + i->config_bboxvars=0; + i->config_override_line_widths=0; + i->config_showclipshapes=0; + i->config_minlinewidth=0.05; + i->config_caplinewidth=1; + i->config_linktarget=0; + i->config_internallinkfunction=0; + i->config_externallinkfunction=0; + i->config_reordertags=1; + i->config_linknameurl=0; + + i->config_linkcolor.r = i->config_linkcolor.g = i->config_linkcolor.b = 255; + i->config_linkcolor.a = 0x40; + + return i; +}; + +static int id_error = 0; + +static U16 getNewID(gfxdevice_t* dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->currentswfid == 65535) { + if(!id_error) { + msg(" ID Table overflow"); + msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); + } + id_error=1; + i->overflow = 1; + exit(1); + } + return ++i->currentswfid; +} +static U16 getNewDepth(gfxdevice_t* dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->depth == 65520) { + if(!id_error) { + msg(" Depth Table overflow"); + msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); + } + id_error=1; + i->overflow = 1; + exit(1); + } + return ++i->depth; +} + +static void startshape(gfxdevice_t* dev); +static void starttext(gfxdevice_t* dev); +static void endshape(gfxdevice_t* dev); +static void endtext(gfxdevice_t* dev); + +typedef struct _plotxy +{ + double x,y; +} plotxy_t; + +static inline int twipsnap(double f) +{ + /* if(f < -0x40000000/20.0) { + fprintf(stderr, "Warning: Coordinate underflow (%f)\n", f); + f = -0x40000000/20.0; + } else if(f>0x3fffffff/20.0) { + fprintf(stderr, "Warning: Coordinate overflow (%f)\n", f); + f = 0x3fffffff/20.0; + }*/ + + /* clamp coordinates to a rectangle with the property that we + can represent a line from the upper left corner to the upper + right corner using no more than 64 strokes */ + const double min = -(1<<(18+4))/20.0; + const double max = ((1<<(18+4))-1)/20.0; + if(f < min) { + fprintf(stderr, "Warning: Coordinate underflow (%f)\n", f); + f = min; + } else if(f>max) { + fprintf(stderr, "Warning: Coordinate overflow (%f)\n", f); + f = max; + } + + return (int)(f*20); +} + +// write a move-to command into the swf +static int movetoxy(gfxdevice_t*dev, TAG*tag, plotxy_t p0) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + int rx = twipsnap(p0.x); + int ry = twipsnap(p0.y); + if(rx!=i->swflastx || ry!=i->swflasty || i->fillstylechanged) { + swf_ShapeSetMove (tag, i->shape, rx,ry); + i->fillstylechanged = 0; + i->swflastx=rx; + i->swflasty=ry; + return 1; + } + return 0; +} +static int moveto(gfxdevice_t*dev, TAG*tag, double x, double y) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + plotxy_t p; + p.x = x; + p.y = y; + return movetoxy(dev, tag, p); +} +static void addPointToBBox(gfxdevice_t*dev, int px, int py) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + SPOINT p; + p.x = px; + p.y = py; + if(i->fill) { + swf_ExpandRect(&i->bboxrect, p); + } else { + swf_ExpandRect3(&i->bboxrect, p, i->linewidth*3/2); + } +} + +/*static void plot(gfxdevice_t*dev, int x, int y, TAG*tag) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + int width = i->linewidth/4; + if(width > 5) + width = 5; + ////square + //swf_ShapeSetLine(tag, i->shape,-width,-width); + //swf_ShapeSetLine(tag, i->shape,width*2,0); + //swf_ShapeSetLine(tag, i->shape,0,width*2); + //swf_ShapeSetLine(tag, i->shape,-width*2,0); + //swf_ShapeSetLine(tag, i->shape,0,-width*2); + //swf_ShapeSetLine(tag, i->shape,width,width); + + // diamond + swf_ShapeSetLine(tag, i->shape,-width,0); + swf_ShapeSetLine(tag, i->shape,width,-width); + swf_ShapeSetLine(tag, i->shape,width,width); + swf_ShapeSetLine(tag, i->shape,-width,width); + swf_ShapeSetLine(tag, i->shape,-width,-width); + swf_ShapeSetLine(tag, i->shape,width,0); + + addPointToBBox(dev, x-width ,y-width); + addPointToBBox(dev, x+width ,y+width); +}*/ + +// write a line-to command into the swf +static void linetoxy(gfxdevice_t*dev, TAG*tag, plotxy_t p0) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + int px = twipsnap(p0.x); + int py = twipsnap(p0.y); + int rx = (px-i->swflastx); + int ry = (py-i->swflasty); + if(rx|ry) { + swf_ShapeSetLine (tag, i->shape, rx,ry); + addPointToBBox(dev, i->swflastx,i->swflasty); + addPointToBBox(dev, px,py); + } /* this is a nice idea, but doesn't work with current flash + players (the pixel will be invisible if they're not + precisely on a pixel boundary) + Besides, we should only do this if this lineto itself + is again followed by a "move". + else if(!i->fill && i->config_dots) { + // treat lines of length 0 as plots, making them + // at least 1 twip wide so Flash will display them + //plot(dev, i->swflastx, i->swflasty, tag); + swf_ShapeSetLine (tag, i->shape, rx+1,ry); + }*/ + + i->shapeisempty = 0; + i->swflastx+=rx; + i->swflasty+=ry; +} +static void lineto(gfxdevice_t*dev, TAG*tag, double x, double y) +{ + plotxy_t p; + p.x = x; + p.y = y; + linetoxy(dev,tag, p); +} + +// write a spline-to command into the swf +static void splineto(gfxdevice_t*dev, TAG*tag, plotxy_t control,plotxy_t end) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + int lastlastx = i->swflastx; + int lastlasty = i->swflasty; + + int cx = (twipsnap(control.x)-i->swflastx); + int cy = (twipsnap(control.y)-i->swflasty); + i->swflastx += cx; + i->swflasty += cy; + int ex = (twipsnap(end.x)-i->swflastx); + int ey = (twipsnap(end.y)-i->swflasty); + i->swflastx += ex; + i->swflasty += ey; + + if((cx || cy) && (ex || ey)) { + swf_ShapeSetCurve(tag, i->shape, cx,cy,ex,ey); + addPointToBBox(dev, lastlastx ,lastlasty ); + addPointToBBox(dev, lastlastx+cx,lastlasty+cy); + addPointToBBox(dev, lastlastx+cx+ex,lastlasty+cy+ey); + } else if(cx || cy || ex || ey) { + swf_ShapeSetLine(tag, i->shape, cx+ex,cy+ey); + addPointToBBox(dev, lastlastx ,lastlasty ); + addPointToBBox(dev, lastlastx+cx,lastlasty+cy); + addPointToBBox(dev, lastlastx+cx+ex,lastlasty+cy+ey); + } + + i->shapeisempty = 0; +} + +/* write a line, given two points and the transformation + matrix. */ +/*static void line(gfxdevice_t*dev, TAG*tag, plotxy_t p0, plotxy_t p1) +{ + moveto(dev, tag, p0); + lineto(dev, tag, p1); +}*/ + +void resetdrawer(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + i->swflastx = 0; + i->swflasty = 0; +} + +static void stopFill(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->lastwasfill!=0) + { + swf_ShapeSetStyle(i->tag,i->shape,i->linestyleid,0x8000,0); + i->fillstylechanged = 1; + i->lastwasfill = 0; + } +} +static void startFill(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->lastwasfill!=1) + { + swf_ShapeSetStyle(i->tag,i->shape,0x8000,i->fillstyleid,0); + i->fillstylechanged = 1; + i->lastwasfill = 1; + } +} + +static inline int colorcompare(RGBA*a,RGBA*b) +{ + + if(a->r!=b->r || + a->g!=b->g || + a->b!=b->b || + a->a!=b->a) { + return 0; + } + return 1; +} + +static SRECT getcharacterbbox(chararray_t*chardata, MATRIX* m, int flashversion) +{ + SRECT r; + char debug = 0; + memset(&r, 0, sizeof(r)); + + int t; + if(debug) printf("\n"); + + double div = 1.0 / 1024.0; + if(flashversion>=8 && !NO_FONT3) { + div = 1.0 / 20480.0; + } + + while(chardata) { + for(t=0;tpos;t++) { + charatposition_t*chr = &chardata->chr[t]; + SRECT b = chr->font->layout->bounds[chr->charid]; + b.xmin = floor((b.xmin*(double)chr->size) *div); + b.ymin = floor((b.ymin*(double)chr->size) *div); + b.xmax = ceil((b.xmax*(double)chr->size) *div); + b.ymax = ceil((b.ymax*(double)chr->size) *div); + + b.xmin += chr->x; + b.ymin += chr->y; + b.xmax += chr->x; + b.ymax += chr->y; + + /* until we solve the INTERNAL_SCALING problem (see below) + make sure the bounding box is big enough */ + b.xmin -= 20; + b.ymin -= 20; + b.xmax += 20; + b.ymax += 20; + + b = swf_TurnRect(b, m); + + if(debug) printf("(%f,%f,%f,%f) -> (%f,%f,%f,%f) [font %d, char %d]\n", + chr->font->layout->bounds[chr->charid].xmin/20.0, + chr->font->layout->bounds[chr->charid].ymin/20.0, + chr->font->layout->bounds[chr->charid].xmax/20.0, + chr->font->layout->bounds[chr->charid].ymax/20.0, + b.xmin/20.0, + b.ymin/20.0, + b.xmax/20.0, + b.ymax/20.0, + chr->font->id, + chr->charid); + swf_ExpandRect2(&r, &b); + } + chardata = chardata->next; + } + if(debug) printf("-----> (%f,%f,%f,%f)\n", + r.xmin/20.0, + r.ymin/20.0, + r.xmax/20.0, + r.ymax/20.0); + return r; +} + +static chararray_t*chararray_reverse(chararray_t*buf) +{ + chararray_t*prev = 0; + while(buf) { + chararray_t*next = buf->next; + buf->next = prev; + prev = buf; + buf = next; + } + return prev; +} + +static void chararray_writetotag(chararray_t*_chardata, TAG*tag) +{ + SWFFONT font; + RGBA color; + color.r = _chardata?_chardata->chr[0].color.r^255:0; + color.g = 0; + color.b = 0; + color.a = 0; + SWFFONT*lastfont; + int lastx; + int lasty; + int lastsize; + int lastchar; + int charids[128]; + int charadvance[128]; + int charstorepos; + int pass; + int glyphbits=1; //TODO: can this be zero? + int advancebits=1; + + if(tag->id != ST_DEFINETEXT && + tag->id != ST_DEFINETEXT2) { + msg(" internal error: charbuffer_put needs an text tag, not %d\n",tag->id); + exit(1); + } + if(!_chardata) { + msg(" charbuffer_put called with zero characters"); + } + + for(pass = 0; pass < 2; pass++) + { + charstorepos = 0; + lastfont = 0; + lastx = CHARMIDX; + lasty = CHARMIDY; + lastsize = -1; + lastchar = -1; + + if(pass==1) + { + advancebits++; // add sign bit + swf_SetU8(tag, glyphbits); + swf_SetU8(tag, advancebits); + } + + chararray_t*chardata = _chardata; + + while(chardata) { + int t; + + assert(!chardata->next || chardata->pos == CHARDATAMAX); + assert(chardata->pos); + + int to = chardata->next?chardata->pos-1:chardata->pos; + + for(t=0;t<=to;t++) + { + char islast = t==chardata->pos; + + charatposition_t*chr = &chardata->chr[t]; + + if(lastfont != chr->font || + lastx!=chr->x || + lasty!=chr->y || + !colorcompare(&color, &chardata->chr[t].color) || + charstorepos==127 || + lastsize != chardata->chr[t].size || + islast) + { + if(charstorepos && pass==0) + { + int s; + for(s=0;s=(1<=(1<writeBit = 0; // Q&D + swf_SetBits(tag, 0, 1); // GLYPH Record + swf_SetBits(tag, charstorepos, 7); // number of glyphs + int s; + for(s=0;sx || + lasty != chr->y) + { + newx = chr->x; + newy = chr->y; + if(newx == 0) + newx = SET_TO_ZERO; + if(newy == 0) + newy = SET_TO_ZERO; + } + if(!colorcompare(&color, &chr->color)) + { + color = chr->color; + newcolor = &color; + } + font.id = chr->font->id; + if(lastfont != chr->font || lastsize != chr->size) + newfont = &font; + + tag->writeBit = 0; // Q&D + swf_TextSetInfoRecord(tag, newfont, chr->size, newcolor, newx, newy); + } + + lastfont = chr->font; + lastx = chr->x; + lasty = chr->y; + lastsize = chr->size; + } + + if(islast) + break; + + int nextx = chr->x; + if(tpos-1) nextx = chardata->chr[t+1].x; + if(t==chardata->pos-1 && chardata->next) nextx = chardata->next->chr[0].x; + int dx = nextx-chr->x; + + int advance; + if(dx>=0 && (dx<(1<<(advancebits-1)) || pass==0)) { + advance = dx; + lastx=nextx; + } else { + advance = 0; + lastx=chr->x; + } + + charids[charstorepos] = chr->charid; + charadvance[charstorepos] = advance; + lastchar = chr->charid; + charstorepos ++; + } + chardata = chardata->next; + } + } +} + +static void chararray_destroy(chararray_t*chr) +{ + while(chr) { + chararray_t*next = chr->next; + chr->next = 0; + free(chr); + chr = next; + } +} + +static inline int matrix_diff(MATRIX*m1, MATRIX*m2) +{ + return memcmp(m1,m2,sizeof(MATRIX)); +} +static charbuffer_t*charbuffer_append(charbuffer_t*buf, SWFFONT*font, int charid, int x,int y, int size, RGBA color, MATRIX*m) +{ + if(!buf || matrix_diff(&buf->matrix,m)) { + charbuffer_t*n = rfx_calloc(sizeof(charbuffer_t)); + n->matrix = *m; + n->next = buf; + buf = n; + } + if(!buf->last || buf->last->pos == CHARDATAMAX) { + chararray_t*n = rfx_calloc(sizeof(chararray_t)); + if(!buf->array) { + buf->array = buf->last = n; + } else { + buf->last->next = n; + buf->last = n; + } + } + chararray_t*a = buf->last; + a->chr[a->pos].font = font; + a->chr[a->pos].charid = charid; + a->chr[a->pos].x = x; + a->chr[a->pos].y = y; + a->chr[a->pos].color = color; + a->chr[a->pos].size = size; + a->pos++; + return buf; +} + +/* Notice: we can only put chars in the range -1639,1638 (-32768/20,32768/20). + So if we set this value to high, the char coordinates will overflow. + If we set it to low, however, the char positions will be inaccurate */ +#define GLYPH_SCALE 1 + +static void chararray_writetodev(gfxdevice_t*dev, chararray_t*array, MATRIX*matrix, char invisible) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + int textid = getNewID(dev); + i->tag = swf_InsertTag(i->tag,ST_DEFINETEXT2); + swf_SetU16(i->tag, textid); + SRECT r; + r = getcharacterbbox(array, matrix, i->config_flashversion); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetMatrix(i->tag, matrix); + msg(" Placing text as ID %d", textid); + chararray_writetotag(array, i->tag); + i->chardata = 0; + + swf_SetU8(i->tag,0); + + if(i->swf->fileVersion >= 8) { + i->tag = swf_InsertTag(i->tag, ST_CSMTEXTSETTINGS); + swf_SetU16(i->tag, textid); + + //swf_SetU8(i->tag, /*subpixel grid*/(2<<3)|/*flashtype*/0x40); + swf_SetU8(i->tag, /*grid*/(1<<3)|/*flashtype*/0x40); + //swf_SetU8(i->tag, /*no grid*/(0<<3)|/*flashtype*/0x40); + + swf_SetU32(i->tag, 0);//thickness + swf_SetU32(i->tag, 0);//sharpness + //swf_SetU32(i->tag, 0x20000);//thickness + //swf_SetU32(i->tag, 0x800000);//sharpness + swf_SetU8(i->tag, 0);//reserved + } + if(invisible && i->config_flashversion>=8) { + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT3); + swf_ObjectPlaceBlend(i->tag,textid,getNewDepth(dev),&i->page_matrix,NULL,NULL,BLENDMODE_MULTIPLY); + } else { + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + swf_ObjectPlace(i->tag,textid,getNewDepth(dev),&i->page_matrix,NULL,NULL); + } +} + +static void charbuffer_writetodevandfree(gfxdevice_t*dev, charbuffer_t*buf, char invisible) +{ + while(buf) { + charbuffer_t*next = buf->next;buf->next = 0; + chararray_writetodev(dev, buf->array, &buf->matrix, invisible); + chararray_destroy(buf->array); + free(buf); + buf = next; + } +} + +static void endtext(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(!i->textmode) + return; + charbuffer_writetodevandfree(dev, i->chardata, 0);i->chardata = 0; + i->textmode = 0; +} + +static int watermark2_width=47; +static int watermark2_height=11; +static int watermark2[47] = {95,1989,71,0,2015,337,1678,0,2015,5,1921,320,1938,25,2006,1024, + 1042,21,13,960,1039,976,8,2000,1359,1088,31,1989,321,1728,0,1152, + 1344,832,0,1984,0,896,1088,1088,896,0,1984,128,256,512,1984}; + +static void draw_watermark(gfxdevice_t*dev, gfxbbox_t r, char drawall) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + double wx = r.xmax / 5.0; + double tx = r.xmax*4.0 / 5.0; + double ty = r.ymax-wx*watermark2_height/watermark2_width; + double sx = (r.xmax - tx) / watermark2_width; + double sy = (r.ymax - ty) / watermark2_height; + double px = sx-0.5; + double py = sy-0.5; + if(ty > 0 && px > 1.0 && py > 1.0) { + int x,y; + for(y=0;y>y)&1)) { + if(!drawall && rand()%5) + continue; + unsigned int b = rand(); + moveto(dev, i->tag, x*sx+tx+((b>>1)&1)/20.0, y*sy+ty+((b>>3)&1)/20.0); + lineto(dev, i->tag, x*sx+px+tx+((b>>2)&1)/20.0, y*sy+ty+((b>>3)&1)/20.0); + lineto(dev, i->tag, x*sx+px+tx+((b>>2)&1)/20.0, y*sy+py+ty+((b>>4)&1)/20.0); + lineto(dev, i->tag, x*sx+tx+((b>>1)&1)/20.0, y*sy+py+ty+((b>>4)&1)/20.0); + lineto(dev, i->tag, x*sx+tx+((b>>1)&1)/20.0, y*sy+ty+((b>>3)&1)/20.0); + } + } + } +} + +static void swfoutput_setfillcolor(gfxdevice_t* dev, U8 r, U8 g, U8 b, U8 a) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->fillrgb.r == r && + i->fillrgb.g == g && + i->fillrgb.b == b && + i->fillrgb.a == a) return; + if(i->shapeid>=0) + endshape(dev); + + i->fillrgb.r = r; + i->fillrgb.g = g; + i->fillrgb.b = b; + i->fillrgb.a = a; +} +static void insert_watermark(gfxdevice_t*dev, char drawall) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(!drawall && i->watermarks>20) + return; + endshape(dev); + endtext(dev); + + if(drawall) { + swfoutput_setfillcolor(dev, 0,0,255,192); + } else { + swfoutput_setfillcolor(dev, rand(),rand(),rand(),(rand()&127)+128); + } + startshape(dev); + startFill(dev); + + gfxbbox_t r; r.xmin = r.ymin = 0; + r.xmax = i->max_x; + r.ymax = i->max_y; + draw_watermark(dev, r, drawall); + endshape(dev); + i->watermarks++; +} + +static void drawoutline(gfxdevice_t*dev, gfxline_t*line); + +static void endpage(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->pagefinished) + return; + + if(i->shapeid>=0) + endshape(dev); + if(i->textmode) + endtext(dev); + if(i->topchardata) { + charbuffer_writetodevandfree(dev, i->topchardata, 1); + i->topchardata=0; + } + + while(i->clippos) + dev->endclip(dev); + + if(i->stored_clipshapes) { + // in case of config_showclipshapes + drawoutline(dev, i->stored_clipshapes); + } + + if(i->config_watermark) { + insert_watermark(dev, 1); + } + + i->pagefinished = 1; +} + +static void addViewer(gfxdevice_t* dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + SHAPE*s; + RGBA button_colors[3]= {{0xbf,0x00,0x00,0x80},{0xbf,0x20,0x20,0xc0}, {0xbf,0xc0,0xc0,0xff}}; + int ids[6]; + int button_sizex = 20; + int button_sizey = 20; + int t; + RGBA black = {255,0,0,0}; + for(t=0;t<6;t++) { + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + swf_ShapeNew(&s); + int ls1 = swf_ShapeAddLineStyle(s,40,&black); + int fs1 = swf_ShapeAddSolidFillStyle(s,&button_colors[t/2]); + int shapeid = ids[t] = getNewID(dev); + swf_SetU16(i->tag,shapeid); + SRECT r; + r.xmin = -20*button_sizex; + r.xmax = 20*button_sizex; + r.ymin = 0; + r.ymax = 40*button_sizey; + swf_SetRect(i->tag,&r); // set shape bounds + swf_SetShapeHeader(i->tag,s); // write all styles to tag + swf_ShapeSetAll(i->tag,s,0*button_sizex,0,ls1,fs1,0); + swf_ShapeSetLine(i->tag,s,(1-(t&1)*2)*20*button_sizex,20*button_sizey); + swf_ShapeSetLine(i->tag,s,-(1-(t&1)*2)*20*button_sizex,20*button_sizey); + swf_ShapeSetLine(i->tag,s,0,-40*button_sizey); + swf_ShapeSetEnd(i->tag); // finish drawing + swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) + } + ActionTAG*a1=0,*a2=0,*a3=0; + a1 = action_NextFrame(a1); + a1 = action_Stop(a1); + a1 = action_End(a1); + + a2 = action_PreviousFrame(a2); + a2 = action_Stop(a2); + a2 = action_End(a2); + + a3 = action_Stop(a3); + a3 = action_End(a3); + + i->tag = swf_InsertTag(i->tag, ST_DOACTION); + swf_ActionSet(i->tag,a3); + + i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); + int buttonid1 = getNewID(dev); + swf_SetU16(i->tag, buttonid1); + swf_ButtonSetRecord(i->tag,BS_UP|BS_HIT,ids[0],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_OVER,ids[2],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_DOWN,ids[4],1,NULL,NULL); + swf_SetU8(i->tag,0); // end of button records + swf_ActionSet(i->tag,a1); + + i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); + int buttonid2 = getNewID(dev); + swf_SetU16(i->tag, buttonid2); + swf_ButtonSetRecord(i->tag,BS_UP|BS_HIT,ids[1],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_OVER,ids[3],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_DOWN,ids[5],1,NULL,NULL); + swf_SetU8(i->tag,0); // end of button records + swf_ActionSet(i->tag,a2); + + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + MATRIX m; + swf_GetMatrix(0, &m); + m.tx = button_sizex*20+200; + swf_ObjectPlace(i->tag, buttonid2, 65534,&m,0,0); + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + m.tx = button_sizex*20+200+200; + swf_ObjectPlace(i->tag, buttonid1, 65535,&m,0,0); +} + + +void swf_startframe(gfxdevice_t*dev, int width, int height) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->firstpage) { + if(i->config_protect) { + i->tag = swf_InsertTag(i->tag, ST_PROTECT); + i->config_protect = 0; + } + if(i->config_simpleviewer) { + addViewer(dev); + } + } + + if(!i->firstpage && !i->pagefinished) + endpage(dev); + + msg(" Starting new SWF page of size %dx%d", width, height); + + swf_GetMatrix(0, &i->page_matrix); + i->page_matrix.tx = 0; + i->page_matrix.ty = 0; + i->min_x = 0; + i->min_y = 0; + i->max_x = width; + i->max_y = height; + i->watermarks = 0; + + /* create a bbox structure with the page size. This is used + for clipping shape and text bounding boxes. As we don't want to + generate bounding boxes which extend beyond the movie size (in + order to not confuse Flash), we clip everything against i->pagebbox */ + i->pagebbox.xmin = 0; + i->pagebbox.ymin = 0; + i->pagebbox.xmax = width*20; + i->pagebbox.ymax = height*20; + + /* increase SWF's bounding box */ + swf_ExpandRect2(&i->swf->movieSize, &i->pagebbox); + + i->lastframeno = i->frameno; + i->firstpage = 0; + i->pagefinished = 0; + i->chardata = 0; +} + +void swf_endframe(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(!i->pagefinished) + endpage(dev); + + if( (i->swf->fileVersion <= 8) && (i->config_insertstoptag) ) { + ActionTAG*atag=0; + atag = action_Stop(atag); + atag = action_End(atag); + i->tag = swf_InsertTag(i->tag,ST_DOACTION); + swf_ActionSet(i->tag,atag); + } + i->tag = swf_InsertTag(i->tag,ST_SHOWFRAME); + i->frameno ++; + + for(i->depth;i->depth>i->startdepth;i->depth--) { + i->tag = swf_InsertTag(i->tag,ST_REMOVEOBJECT2); + swf_SetU16(i->tag,i->depth); + } + i->depth = i->startdepth; + + if(i->config_frameresets) { + for(i->currentswfid;i->currentswfid>i->startids;i->currentswfid--) { + i->tag = swf_InsertTag(i->tag,ST_FREECHARACTER); + swf_SetU16(i->tag,i->currentswfid); + } + i->currentswfid = i->startids; + } +} + +static void setBackground(gfxdevice_t*dev, int x1, int y1, int x2, int y2) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + RGBA rgb; + rgb.a = rgb.r = rgb.g = rgb.b = 0xff; + SRECT r; + SHAPE* s; + int ls1=0,fs1=0; + int shapeid = getNewID(dev); + r.xmin = x1; + r.ymin = y1; + r.xmax = x2; + r.ymax = y2; + i->tag = swf_InsertTag(i->tag, ST_DEFINESHAPE); + swf_ShapeNew(&s); + fs1 = swf_ShapeAddSolidFillStyle(s, &rgb); + swf_SetU16(i->tag,shapeid); + swf_SetRect(i->tag,&r); + swf_SetShapeHeader(i->tag,s); + swf_ShapeSetAll(i->tag,s,x1,y1,ls1,fs1,0); + swf_ShapeSetLine(i->tag,s,(x2-x1),0); + swf_ShapeSetLine(i->tag,s,0,(y2-y1)); + swf_ShapeSetLine(i->tag,s,(x1-x2),0); + swf_ShapeSetLine(i->tag,s,0,(y1-y2)); + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(s); + i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); + swf_ObjectPlace(i->tag,shapeid,getNewDepth(dev),0,0,0); + i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); + swf_ObjectPlaceClip(i->tag,shapeid,getNewDepth(dev),0,0,0,65535); +} + +/* initialize the swf writer */ +void gfxdevice_swf_init(gfxdevice_t* dev) +{ + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "swf"; + + dev->internal = init_internal_struct(); // set config to default values + + dev->startpage = swf_startframe; + dev->endpage = swf_endframe; + dev->finish = swf_finish; + dev->fillbitmap = swf_fillbitmap; + dev->setparameter = swf_setparameter; + dev->stroke = swf_stroke; + dev->startclip = swf_startclip; + dev->endclip = swf_endclip; + dev->fill = swf_fill; + dev->fillgradient = swf_fillgradient; + dev->addfont = swf_addfont; + dev->drawchar = swf_drawchar; + dev->drawlink = swf_drawlink; + + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + i->dev = dev; + + msg(" initializing swf output\n", i->max_x,i->max_y); + + i->swffont = 0; + + i->swf = (SWF*)rfx_calloc(sizeof(SWF)); + i->swf->fileVersion = 0; + i->swf->frameRate = 0x80; + i->swf->movieSize.xmin = 0; + i->swf->movieSize.ymin = 0; + i->swf->movieSize.xmax = 0; + i->swf->movieSize.ymax = 0; + i->swf->fileAttributes = 9; // as3, local-with-network + + i->swf->firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + i->tag = i->swf->firstTag; + RGBA rgb; + rgb.a = rgb.r = rgb.g = rgb.b = 0xff; + //rgb.r = 0; + swf_SetRGB(i->tag,&rgb); + + i->startdepth = i->depth = 0; + i->startids = i->currentswfid = 0; +} + +static void startshape(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + SRECT r; + + if(i->shapeid>=0) + return; + //if(i->chardatapos && i->chardata[i->chardatapos-1].color.a) + endtext(dev); + + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + + swf_ShapeNew(&i->shape); + i->linestyleid = swf_ShapeAddLineStyle(i->shape,i->linewidth,&i->strokergb); + i->fillstyleid = swf_ShapeAddSolidFillStyle(i->shape,&i->fillrgb); + if(i->mark) { + RGBA markcol = {0,i->mark[0],i->mark[1],i->mark[2]}; + swf_ShapeAddSolidFillStyle(i->shape,&markcol); + } + + i->shapeid = getNewID(dev); + + msg(" Using shape id %d", i->shapeid); + + swf_SetU16(i->tag,i->shapeid); // ID + + i->bboxrectpos = i->tag->len; + /* changed later */ + swf_SetRect(i->tag,&i->pagebbox); + + memset(&i->bboxrect, 0, sizeof(i->bboxrect)); + + swf_SetShapeStyles(i->tag,i->shape); + swf_ShapeCountBits(i->shape,NULL,NULL); + swf_SetShapeBits(i->tag,i->shape); + + /* TODO: do we really need this? */ + //swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,i->linestyleid,0,0); + //swf_ShapeSetAll(i->tag,i->shape,/*x*/UNDEFINED_COORD,/*y*/UNDEFINED_COORD,i->linestyleid,0,0); + i->swflastx=i->swflasty=UNDEFINED_COORD; + i->lastwasfill = -1; + i->shapeisempty = 1; +} + +static void starttext(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->shapeid>=0) + endshape(dev); + + if(i->config_watermark) { + insert_watermark(dev, 0); + } + i->textmode = 1; + i->swflastx=i->swflasty=0; +} + + +/* TODO: move to ../lib/rfxswf */ +void changeRect(gfxdevice_t*dev, TAG*tag, int pos, SRECT*newrect) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + /* determine length of old rect */ + tag->pos = pos; + tag->readBit = 0; + SRECT old; + swf_GetRect(tag, &old); + swf_ResetReadBits(tag); + int pos_end = tag->pos; + + int len = tag->len - pos_end; + U8*data = (U8*)malloc(len); + memcpy(data, &tag->data[pos_end], len); + tag->writeBit = 0; + tag->len = pos; + swf_SetRect(tag, newrect); + swf_SetBlock(tag, data, len); + free(data); + tag->pos = tag->readBit = 0; +} + +void cancelshape(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + /* delete old shape tag */ + TAG*todel = i->tag; + i->tag = i->tag->prev; + swf_DeleteTag(0, todel); + if(i->shape) {swf_ShapeFree(i->shape);i->shape=0;} + i->shapeid = -1; + i->bboxrectpos = -1; + +// i->currentswfid--; // doesn't work, for some reason +} + +void fixAreas(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(!i->shapeisempty && i->fill && + (i->bboxrect.xmin == i->bboxrect.xmax || + i->bboxrect.ymin == i->bboxrect.ymax) && + i->config_minlinewidth >= 0.001 + ) { + msg(" Shape has size 0: width=%.2f height=%.2f", + (i->bboxrect.xmax-i->bboxrect.xmin)/20.0, + (i->bboxrect.ymax-i->bboxrect.ymin)/20.0 + ); + + SRECT r = i->bboxrect; + + if(r.xmin == r.xmax && r.ymin == r.ymax) { + /* this thing comes down to a single dot- nothing to fix here */ + return; + } + + cancelshape(dev); + + RGBA save_col = i->strokergb; + int save_width = i->linewidth; + + i->strokergb = i->fillrgb; + i->linewidth = (int)(i->config_minlinewidth*20); + if(i->linewidth==0) i->linewidth = 1; + + startshape(dev); + stopFill(dev); + + moveto(dev, i->tag, r.xmin/20.0,r.ymin/20.0); + lineto(dev, i->tag, r.xmax/20.0,r.ymax/20.0); + + i->strokergb = save_col; + i->linewidth = save_width; + } + +} + +static void endshape_noput(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->shapeid<0) + return; + //changeRect(dev, i->tag, i->bboxrectpos, &i->bboxrect); + i->shapeid = -1; + if(i->shape) { + swf_ShapeFree(i->shape); + i->shape=0; + } + i->fill=0; + i->shapeposx=0; + i->shapeposy=0; +} + +static void endshape(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->shapeid<0) + return; + + fixAreas(dev); + + if(i->shapeisempty || + /*bbox empty?*/ + (i->bboxrect.xmin == i->bboxrect.xmax && + i->bboxrect.ymin == i->bboxrect.ymax)) + { + // delete the shape again, we didn't do anything + msg(" cancelling shape: bbox is (%f,%f,%f,%f)", + i->bboxrect.xmin /20.0, + i->bboxrect.ymin /20.0, + i->bboxrect.xmax /20.0, + i->bboxrect.ymax /20.0 + ); + cancelshape(dev); + return; + } + + swf_ShapeSetEnd(i->tag); + + SRECT r = swf_ClipRect(i->pagebbox, i->bboxrect); + changeRect(dev, i->tag, i->bboxrectpos, &r); + + msg(" Placing shape ID %d", i->shapeid); + + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + MATRIX m = i->page_matrix; + m.tx += i->shapeposx; + m.ty += i->shapeposy; + swf_ObjectPlace(i->tag,i->shapeid,getNewDepth(dev),&m,NULL,NULL); + + swf_ShapeFree(i->shape); + i->shape = 0; + i->shapeid = -1; + i->bboxrectpos = -1; + + i->fill=0; + i->shapeposx=0; + i->shapeposy=0; +} + +void wipeSWF(SWF*swf) +{ + TAG*tag = swf->firstTag; + while(tag) { + TAG*next = tag->next; + if(tag->id != ST_SETBACKGROUNDCOLOR && + tag->id != ST_END && + tag->id != ST_DOACTION && + tag->id != ST_SHOWFRAME) { + swf_DeleteTag(swf, tag); + } + tag = next; + } +} + +void swfoutput_finalize(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(i->tag && i->tag->id == ST_END) + return; //already done + + i->swf->fileVersion = i->config_flashversion; + i->swf->frameRate = i->config_framerate*0x100; + + if(i->config_bboxvars) { + TAG* tag = swf_InsertTag(i->swf->firstTag, ST_DOACTION); + ActionTAG*a = 0; + a = action_PushString(a, "xmin"); + a = action_PushFloat(a, i->swf->movieSize.xmin / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "ymin"); + a = action_PushFloat(a, i->swf->movieSize.ymin / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "xmax"); + a = action_PushFloat(a, i->swf->movieSize.xmax / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "ymax"); + a = action_PushFloat(a, i->swf->movieSize.ymax / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "width"); + a = action_PushFloat(a, (i->swf->movieSize.xmax - i->swf->movieSize.xmin) / 20.0); + a = action_SetVariable(a); + a = action_PushString(a, "height"); + a = action_PushFloat(a, (i->swf->movieSize.ymax - i->swf->movieSize.ymin) / 20.0); + a = action_SetVariable(a); + a = action_End(a); + swf_ActionSet(tag, a); + swf_ActionFree(a); + } + + if(i->mark) { + free(i->mark);i->mark = 0; + } + + endpage(dev); + fontlist_t *iterator = i->fontlist; + char use_font3 = i->config_flashversion>=8 && !NO_FONT3; + + while(iterator) { + TAG*mtag = i->swf->firstTag; + if(iterator->swffont) { + if(!i->config_storeallcharacters) { + msg(" Reducing font %s", iterator->swffont->name); + swf_FontReduce(iterator->swffont); + } + int used = iterator->swffont->use && iterator->swffont->use->used_glyphs; + if(used) { + if(!use_font3) { + mtag = swf_InsertTag(mtag, ST_DEFINEFONT2); + swf_FontSetDefine2(mtag, iterator->swffont); + } else { + mtag = swf_InsertTag(mtag, ST_DEFINEFONT3); + swf_FontSetDefine2(mtag, iterator->swffont); + } + } + } + + iterator = iterator->next; + } + + i->tag = swf_InsertTag(i->tag,ST_END); + TAG* tag = i->tag->prev; + + if(use_font3 && i->config_storeallcharacters && i->config_alignfonts) { + swf_FontPostprocess(i->swf); // generate alignment information + } + + /* remove the removeobject2 tags between the last ST_SHOWFRAME + and the ST_END- they confuse the flash player */ + while(tag->id == ST_REMOVEOBJECT2) { + TAG* prev = tag->prev; + swf_DeleteTag(i->swf, tag); + tag = prev; + } + + if(i->overflow) { + wipeSWF(i->swf); + } + if(i->config_enablezlib || i->config_flashversion>=6) { + i->swf->compressed = 1; + } + + /* Add AVM2 actionscript */ + if(i->config_flashversion>=9 && + (i->config_insertstoptag || i->hasbuttons) && !i->config_linknameurl) { + swf_AddButtonLinks(i->swf, i->config_insertstoptag, + i->config_internallinkfunction||i->config_externallinkfunction); + } +// if(i->config_reordertags) +// swf_Optimize(i->swf); +} + +int swfresult_save(gfxresult_t*gfx, const char*filename) +{ + SWF*swf = (SWF*)gfx->internal; + int fi; + if(filename) + fi = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_WRONLY, 0777); + else + fi = 1; // stdout + + if(fi<=0) { + msg(" Could not create \"%s\". ", FIXNULL(filename)); + return -1; + } + + if FAILED(swf_WriteSWF(fi,swf)) + msg(" WriteSWF() failed.\n"); + + if(filename) + close(fi); + return 0; +} +void* swfresult_get(gfxresult_t*gfx, const char*name) +{ + SWF*swf = (SWF*)gfx->internal; + if(!strcmp(name, "swf")) { + return (void*)swf_CopySWF(swf); + } else if(!strcmp(name, "xmin")) { + return (void*)(ptroff_t)(swf->movieSize.xmin/20); + } else if(!strcmp(name, "ymin")) { + return (void*)(ptroff_t)(swf->movieSize.ymin/20); + } else if(!strcmp(name, "xmax")) { + return (void*)(ptroff_t)(swf->movieSize.xmax/20); + } else if(!strcmp(name, "ymax")) { + return (void*)(ptroff_t)(swf->movieSize.ymax/20); + } else if(!strcmp(name, "width")) { + return (void*)(ptroff_t)((swf->movieSize.xmax - swf->movieSize.xmin)/20); + } else if(!strcmp(name, "height")) { + return (void*)(ptroff_t)((swf->movieSize.ymax - swf->movieSize.ymin)/20); + } + return 0; +} +void swfresult_destroy(gfxresult_t*gfx) +{ + if(gfx->internal) { + swf_FreeTags((SWF*)gfx->internal); + free(gfx->internal); + gfx->internal = 0; + } + memset(gfx, 0, sizeof(gfxresult_t)); + free(gfx); +} + +static void swfoutput_destroy(gfxdevice_t* dev); + +gfxresult_t* swf_finish(gfxdevice_t* dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + gfxresult_t*result; + + if(i->config_linktarget) { + free(i->config_linktarget); + i->config_linktarget = 0; + } + + swfoutput_finalize(dev); + SWF* swf = i->swf;i->swf = 0; + swfoutput_destroy(dev); + + result = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); + result->internal = swf; + result->save = swfresult_save; + result->write = 0; + result->get = swfresult_get; + result->destroy = swfresult_destroy; + return result; +} + +/* Perform cleaning up */ +static void swfoutput_destroy(gfxdevice_t* dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(!i) { + /* not initialized yet- nothing to destroy */ + return; + } + + fontlist_t *tmp,*iterator = i->fontlist; + while(iterator) { + if(iterator->swffont) { + swf_FontFree(iterator->swffont);iterator->swffont=0; + } + tmp = iterator; + iterator = iterator->next; + free(tmp); + } + if(i->swf) {swf_FreeTags(i->swf);free(i->swf);i->swf = 0;} + + free(i);i=0; + memset(dev, 0, sizeof(gfxdevice_t)); +} + +static void swfoutput_setstrokecolor(gfxdevice_t* dev, U8 r, U8 g, U8 b, U8 a) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->strokergb.r == r && + i->strokergb.g == g && + i->strokergb.b == b && + i->strokergb.a == a) return; + + if(i->shapeid>=0) + endshape(dev); + i->strokergb.r = r; + i->strokergb.g = g; + i->strokergb.b = b; + i->strokergb.a = a; +} + +//#define ROUND_UP 19 +//#define ROUND_UP 10 + +static void swfoutput_setlinewidth(gfxdevice_t*dev, double _linewidth) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->linewidth == (U16)(_linewidth*20+19.0/20.0)) + return; + if(i->shapeid>=0) + endshape(dev); + i->linewidth = (U16)(_linewidth*20+19.0/20.0); +} + + +static void drawlink(gfxdevice_t*dev, ActionTAG*,ActionTAG*, gfxline_t*points, char mouseover, char*type, const char*url); +static void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points); +static void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points); +static void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points); + +/*void swfoutput_drawlink(gfxdevice_t*dev, char*url, gfxline_t*points) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + dev->drawlink(dev, points, url); +}*/ + +void swf_drawlink(gfxdevice_t*dev, gfxline_t*points, const char*url, const char*text) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(i->config_disablelinks) + return; + + if(!strncmp("http://pdf2swf:", url, 15)) { + char*tmp = strdup(url); + int l = strlen(tmp); + if(tmp[l-1] == '/') + tmp[l-1] = 0; + swfoutput_namedlink(dev, tmp+15, points); + free(tmp); + return; + } else if(!strncmp("page", url, 4)) { + int t, nodigit=0; + for(t=4;url[t];t++) + if(url[t]<'0' || url[t]>'9') + nodigit = 1; + if(!nodigit) { + int page = atoi(&url[4]); + if(page<0) page = 0; + swfoutput_linktopage(dev, page, points); + } + } else { + swfoutput_linktourl(dev, url, points); + } +} +void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points) +{ + ActionTAG* actions = 0; + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->shapeid>=0) + endshape(dev); + if(i->textmode) + endtext(dev); + + /* TODO: escape special characters in url */ + + if(i->config_externallinkfunction && i->config_flashversion<=8) { + actions = action_PushString(actions, url); //parameter + actions = action_PushInt(actions, 1); //number of parameters (1) + actions = action_PushString(actions, i->config_externallinkfunction); //function name + actions = action_CallFunction(actions); + } else if(!i->config_linktarget) { + if(!i->config_opennewwindow) + actions = action_GetUrl(actions, url, "_parent"); + else + actions = action_GetUrl(actions, url, "_this"); + } else { + actions = action_GetUrl(actions, url, i->config_linktarget); + } + actions = action_End(actions); + + drawlink(dev, actions, 0, points, 0, "url", url); + + swf_ActionFree(actions); +} +void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + ActionTAG* actions = 0; + + if(i->shapeid>=0) + endshape(dev); + if(i->textmode) + endtext(dev); + + if(!i->config_internallinkfunction || i->config_flashversion>=9) { + actions = action_GotoFrame(actions, page-1); + actions = action_End(actions); + } else { + actions = action_PushInt(actions, page); //parameter + actions = action_PushInt(actions, 1); //number of parameters (1) + actions = action_PushString(actions, i->config_internallinkfunction); //function name + actions = action_CallFunction(actions); + actions = action_End(actions); + } + + char name[80]; + sprintf(name, "page%d", page); + + drawlink(dev, actions, 0, points, 0, "page", name); + + swf_ActionFree(actions); +} + +/* Named Links (a.k.a. Acrobatmenu) are used to implement various gadgets + of the viewer objects, like subtitles, index elements etc. +*/ +void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + ActionTAG *actions1,*actions2; + char*tmp = strdup(name); + char mouseover = 1; + + if(i->shapeid>=0) + endshape(dev); + if(i->textmode) + endtext(dev); + + char*type = 0; + if(!strncmp(tmp, "call:", 5)) + { + char*x = strchr(&tmp[5], ':'); + if(!x) { + actions1 = action_PushInt(0, 0); //number of parameters (0) + actions1 = action_PushString(actions1, &tmp[5]); //function name + actions1 = action_CallFunction(actions1); + actions1 = action_End(actions1); + } else { + *x = 0; + actions1 = action_PushString(0, x+1); //parameter + actions1 = action_PushInt(actions1, 1); //number of parameters (1) + actions1 = action_PushString(actions1, &tmp[5]); //function name + actions1 = action_CallFunction(actions1); + actions1 = action_End(actions1); + } + actions2 = action_End(0); + mouseover = 0; + type = "call"; + } + else + { + actions1 = action_PushString(0, "/:subtitle"); + actions1 = action_PushString(actions1, name); + actions1 = action_SetVariable(actions1); + actions1 = action_End(actions1); + + actions2 = action_PushString(0, "/:subtitle"); + actions2 = action_PushString(actions2, ""); + actions2 = action_SetVariable(actions2); + actions2 = action_End(actions2); + type = "subtitle"; + } + + drawlink(dev, actions1, actions2, points, mouseover, type, name); + + swf_ActionFree(actions1); + swf_ActionFree(actions2); + free(tmp); +} + +static void drawgfxline(gfxdevice_t*dev, gfxline_t*line, int fill) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + gfxcoord_t lastx=0,lasty=0,px=0,py=0; + char lastwasmoveto; + int lines= 0, splines=0; + + i->fill = fill; + + while(1) { + if(!line) + break; + /* check whether the next segment is zero */ + if(line->type == gfx_moveTo) { + moveto(dev, i->tag, line->x, line->y); + px = lastx = line->x; + py = lasty = line->y; + lastwasmoveto = 1; + } if(line->type == gfx_lineTo) { + lineto(dev, i->tag, line->x, line->y); + px = line->x; + py = line->y; + lastwasmoveto = 0; + lines++; + } else if(line->type == gfx_splineTo) { + plotxy_t s,p; + s.x = line->sx;p.x = line->x; + s.y = line->sy;p.y = line->y; + splineto(dev, i->tag, s, p); + px = line->x; + py = line->y; + lastwasmoveto = 0; + splines++; + } + line = line->next; + } + msg(" drawgfxline, %d lines, %d splines", lines, splines); +} + + +static void drawlink(gfxdevice_t*dev, ActionTAG*actions1, ActionTAG*actions2, gfxline_t*points, char mouseover, char*type, const char*url) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + RGBA rgb; + SRECT r; + int lsid=0; + int fsid; + int myshapeid; + int myshapeid2; + double posx = 0; + double posy = 0; + int buttonid = getNewID(dev); + gfxbbox_t bbox = gfxline_getbbox(points); + + if(i->config_linknameurl) { + actions1 = 0; + actions2 = 0; + } + + i->hasbuttons = 1; + + /* shape */ + myshapeid = getNewID(dev); + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + swf_ShapeNew(&i->shape); + rgb.r = rgb.b = rgb.a = rgb.g = 0; + fsid = swf_ShapeAddSolidFillStyle(i->shape,&rgb); + swf_SetU16(i->tag, myshapeid); + r.xmin = (int)(bbox.xmin*20); + r.ymin = (int)(bbox.ymin*20); + r.xmax = (int)(bbox.xmax*20); + r.ymax = (int)(bbox.ymax*20); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetShapeStyles(i->tag,i->shape); + swf_ShapeCountBits(i->shape,NULL,NULL); + swf_SetShapeBits(i->tag,i->shape); + swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,0,fsid,0); + i->swflastx = i->swflasty = 0; + drawgfxline(dev, points, 1); + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(i->shape); + + /* shape2 */ + myshapeid2 = getNewID(dev); + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + swf_ShapeNew(&i->shape); + + rgb = i->config_linkcolor; + + fsid = swf_ShapeAddSolidFillStyle(i->shape,&rgb); + swf_SetU16(i->tag, myshapeid2); + r.xmin = (int)(bbox.xmin*20); + r.ymin = (int)(bbox.ymin*20); + r.xmax = (int)(bbox.xmax*20); + r.ymax = (int)(bbox.ymax*20); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetShapeStyles(i->tag,i->shape); + swf_ShapeCountBits(i->shape,NULL,NULL); + swf_SetShapeBits(i->tag,i->shape); + swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,0,fsid,0); + i->swflastx = i->swflasty = 0; + drawgfxline(dev, points, 1); + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(i->shape); + + if(!mouseover) + { + i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); + swf_SetU16(i->tag,buttonid); //id + swf_ButtonSetFlags(i->tag, 0); //menu=no + swf_ButtonSetRecord(i->tag,0x01,myshapeid,i->depth,0,0); + swf_ButtonSetRecord(i->tag,0x02,myshapeid2,i->depth,0,0); + swf_ButtonSetRecord(i->tag,0x04,myshapeid2,i->depth,0,0); + swf_ButtonSetRecord(i->tag,0x08,myshapeid,i->depth,0,0); + swf_SetU8(i->tag,0); + swf_ActionSet(i->tag,actions1); + swf_SetU8(i->tag,0); + } + else + { + i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON2); + swf_SetU16(i->tag,buttonid); //id + swf_ButtonSetFlags(i->tag, 0); //menu=no + swf_ButtonSetRecord(i->tag,0x01,myshapeid,i->depth,0,0); + swf_ButtonSetRecord(i->tag,0x02,myshapeid2,i->depth,0,0); + swf_ButtonSetRecord(i->tag,0x04,myshapeid2,i->depth,0,0); + swf_ButtonSetRecord(i->tag,0x08,myshapeid,i->depth,0,0); + swf_SetU8(i->tag,0); // end of button records + swf_ButtonSetCondition(i->tag, BC_IDLE_OVERUP); + swf_ActionSet(i->tag,actions1); + if(actions2) { + swf_ButtonSetCondition(i->tag, BC_OVERUP_IDLE); + swf_ActionSet(i->tag,actions2); + swf_SetU8(i->tag,0); + swf_ButtonPostProcess(i->tag, 2); + } else { + swf_SetU8(i->tag,0); + swf_ButtonPostProcess(i->tag, 1); + } + } + + char buf[80]; + char*buf2 = 0; + const char* name = 0; + if(i->config_linknameurl) { + buf2 = malloc(strlen(type)+strlen(url)+2); + sprintf(buf2, "%s:%s", type, url); + name = buf2; + } else { + name = buf; + sprintf(buf, "button%d", buttonid); + } + + msg(" Placing link ID %d", buttonid); + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + + if(posx!=0 || posy!=0) { + SPOINT p; + p.x = (int)(posx*20); + p.y = (int)(posy*20); + p = swf_TurnPoint(p, &i->page_matrix); + MATRIX m; + m = i->page_matrix; + m.tx = p.x; + m.ty = p.y; + swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&m,0,(U8*)name); + } else { + swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&i->page_matrix,0,(U8*)name); + } + + if(buf2) + free(buf2); +} + + +/////////// +/* +for(t=0;tinternal; + + msg(" swfdevice: %s=%s", name, value); + if(!strcmp(name, "jpegsubpixels")) { + i->config_jpegsubpixels = atof(value); + } else if(!strcmp(name, "ppmsubpixels")) { + i->config_ppmsubpixels = atof(value); + } else if(!strcmp(name, "subpixels")) { + i->config_ppmsubpixels = i->config_jpegsubpixels = atof(value); + } else if(!strcmp(name, "drawonlyshapes")) { + i->config_drawonlyshapes = atoi(value); + } else if(!strcmp(name, "ignoredraworder")) { + i->config_ignoredraworder = atoi(value); + } else if(!strcmp(name, "mark")) { + if(!value || !value[0]) { + if(i->mark) free(i->mark); + i->mark = 0; + } else { + int t; + i->mark = strdup("..."); + for(t=0;t<3;t++) if(value[t]) i->mark[t] = value[t]; + } + } else if(!strcmp(name, "filloverlap")) { + i->config_filloverlap = atoi(value); + } else if(!strcmp(name, "linksopennewwindow")) { + i->config_opennewwindow = atoi(value); + } else if(!strcmp(name, "opennewwindow")) { + i->config_opennewwindow = atoi(value); + } else if(!strcmp(name, "storeallcharacters")) { + i->config_storeallcharacters = atoi(value); + } else if(!strcmp(name, "enablezlib")) { + i->config_enablezlib = atoi(value); + } else if(!strcmp(name, "bboxvars")) { + i->config_bboxvars = atoi(value); + } else if(!strcmp(name, "dots")) { + i->config_dots = atoi(value); + } else if(!strcmp(name, "frameresets")) { + i->config_frameresets = atoi(value); + } else if(!strcmp(name, "showclipshapes")) { + i->config_showclipshapes = atoi(value); + } else if(!strcmp(name, "reordertags")) { + i->config_reordertags = atoi(value); + } else if(!strcmp(name, "internallinkfunction")) { + i->config_internallinkfunction = strdup(value); + } else if(!strcmp(name, "externallinkfunction")) { + i->config_externallinkfunction = strdup(value); + } else if(!strcmp(name, "linkfunction")) { //sets both internallinkfunction and externallinkfunction + i->config_internallinkfunction = strdup(value); + i->config_externallinkfunction = strdup(value); + } else if(!strcmp(name, "disable_polygon_conversion")) { + i->config_disable_polygon_conversion = atoi(value); + } else if(!strcmp(name, "normalize_polygon_positions")) { + i->config_normalize_polygon_positions = atoi(value); + } else if(!strcmp(name, "wxwindowparams")) { + i->config_watermark = atoi(value); + } else if(!strcmp(name, "insertstop")) { + i->config_insertstoptag = atoi(value); + } else if(!strcmp(name, "protect")) { + i->config_protect = atoi(value); + if(i->config_protect && i->tag) { + i->tag = swf_InsertTag(i->tag, ST_PROTECT); + } + } else if(!strcmp(name, "flashversion")) { + i->config_flashversion = atoi(value); + if(i->swf) { + i->swf->fileVersion = i->config_flashversion; + } + } else if(!strcmp(name, "framerate")) { + i->config_framerate = atof(value); + if(i->swf) { + i->swf->frameRate = i->config_framerate*0x100; + } + } else if(!strcmp(name, "minlinewidth")) { + i->config_minlinewidth = atof(value); + } else if(!strcmp(name, "remove_small_polygons")) { + i->config_remove_small_polygons = atof(value); + } else if(!strcmp(name, "caplinewidth")) { + i->config_caplinewidth = atof(value); + } else if(!strcmp(name, "linktarget")) { + i->config_linktarget = strdup(value); + } else if(!strcmp(name, "invisibletexttofront")) { + i->config_invisibletexttofront = atoi(value); + } else if(!strcmp(name, "noclips")) { + i->config_noclips = atoi(value); + } else if(!strcmp(name, "dumpfonts")) { + i->config_dumpfonts = atoi(value); + } else if(!strcmp(name, "override_line_widths")) { + i->config_override_line_widths = atof(value); + } else if(!strcmp(name, "animate")) { + i->config_animate = atoi(value); + i->config_framerate = 25; + } else if(!strcmp(name, "linknameurl")) { + i->config_linknameurl = atoi(value); + } else if(!strcmp(name, "showimages")) { + i->config_showimages = atoi(value); + } else if(!strcmp(name, "disablelinks")) { + i->config_disablelinks = atoi(value); + } else if(!strcmp(name, "simpleviewer")) { + i->config_simpleviewer = atoi(value); + } else if(!strcmp(name, "next_bitmap_is_jpeg")) { + i->jpeg = 1; + } else if(!strcmp(name, "jpegquality")) { + int val = atoi(value); + if(val<0) val=0; + if(val>101) val=101; + i->config_jpegquality = val; + } else if(!strcmp(name, "splinequality")) { + int v = atoi(value); + v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel + if(v<1) v = 1; + i->config_splinemaxerror = v; + } else if(!strcmp(name, "fontquality")) { + int v = atoi(value); + v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel + if(v<1) v = 1; + i->config_fontsplinemaxerror = v; + } else if(!strcmp(name, "linkcolor")) { + if(strlen(value)!=8) { + fprintf(stderr, "Unknown format for option 'linkcolor'. (%s <-> RRGGBBAA)\n", value); + return 1; + } +# define NIBBLE(s) (((s)>='0' && (s)<='9')?((s)-'0'):((s)&0x0f)+9) + i->config_linkcolor.r = NIBBLE(value[0])<<4 | NIBBLE(value[1]); + i->config_linkcolor.g = NIBBLE(value[2])<<4 | NIBBLE(value[3]); + i->config_linkcolor.b = NIBBLE(value[4])<<4 | NIBBLE(value[5]); + i->config_linkcolor.a = NIBBLE(value[6])<<4 | NIBBLE(value[7]); + } else if(!strcmp(name, "help")) { + printf("\nSWF layer options:\n"); + printf("jpegsubpixels= resolution adjustment for jpeg images (same as jpegdpi, but in pixels)\n"); + printf("ppmsubpixels= shortcut for setting both jpegsubpixels and ppmsubpixels\n"); + printf("drawonlyshapes convert everything to shapes (currently broken)\n"); + printf("ignoredraworder allow to perform a few optimizations for creating smaller SWFs\n"); + printf("linksopennewwindow make links open a new browser window\n"); + printf("linktarget target window name of new links\n"); + printf("linkcolor==6)\n"); + printf("bboxvars store the bounding box of the SWF file in actionscript variables\n"); + printf("dots Take care to handle dots correctly\n"); + printf("reordertags=0/1 (default: 1) perform some tag optimizations\n"); + printf("internallinkfunction= when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called\n"); + printf("externallinkfunction= when the user clicks an external link (e.g. http://www.foo.bar/) on the converted file, this actionscript function is called\n"); + printf("disable_polygon_conversion never convert strokes to polygons (will remove capstyles and joint styles)\n"); + printf("caplinewidth= the minimum thichness a line needs to have so that capstyles become visible (and are converted)\n"); + printf("insertstop put an ActionScript \"STOP\" tag in every frame\n"); + printf("protect add a \"protect\" tag to the file, to prevent loading in the Flash editor\n"); + printf("flashversion= the SWF fileversion (6)\n"); + printf("framerate= SWF framerate\n"); + printf("minlinewidth= convert horizontal/vertical boxes smaller than this width to lines (0.05) \n"); + printf("simpleviewer Add next/previous buttons to the SWF\n"); + printf("animate insert a showframe tag after each placeobject (animate draw order of PDF files)\n"); + printf("jpegquality= set compression quality of jpeg images\n"); + printf("splinequality= Set the quality of spline convertion to value (0-100, default: 100).\n"); + printf("disablelinks Disable links.\n"); + } else { + return 0; + } + return 1; +} + +// -------------------------------------------------------------------- + +static CXFORM gfxcxform_to_cxform(gfxcxform_t* c) +{ + CXFORM cx; + swf_GetCXForm(0, &cx, 1); + if(!c) + return cx; + if(c->rg!=0 || c->rb!=0 || c->ra!=0 || + c->gr!=0 || c->gb!=0 || c->ga!=0 || + c->br!=0 || c->bg!=0 || c->ba!=0 || + c->ar!=0 || c->ag!=0 || c->ab!=0) + msg(" CXForm not SWF-compatible"); + + cx.a0 = (S16)(c->aa*256); + cx.r0 = (S16)(c->rr*256); + cx.g0 = (S16)(c->gg*256); + cx.b0 = (S16)(c->bb*256); + cx.a1 = c->ta; + cx.r1 = c->tr; + cx.g1 = c->tg; + cx.b1 = c->tb; + return cx; +} + +/* TODO */ +static int imageInCache(gfxdevice_t*dev, void*data, int width, int height) +{ + return -1; +} +static void addImageToCache(gfxdevice_t*dev, void*data, int width, int height) +{ +} + +static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int targetheight, int* newwidth, int* newheight) +{ + gfxdevice_t*dev = i->dev; + RGBA*newpic = 0; + RGBA*mem = (RGBA*)img->data; + + int sizex = img->width; + int sizey = img->height; + int is_jpeg = i->jpeg; + i->jpeg = 0; + + int newsizex=sizex, newsizey=sizey; + + /// { + if(is_jpeg && i->config_jpegsubpixels) { + newsizex = (int)(targetwidth*i->config_jpegsubpixels + 0.5); + newsizey = (int)(targetheight*i->config_jpegsubpixels + 0.5); + } else if(!is_jpeg && i->config_ppmsubpixels) { + newsizex = (int)(targetwidth*i->config_ppmsubpixels + 0.5); + newsizey = (int)(targetheight*i->config_ppmsubpixels + 0.5); + } + /// } + + if(sizex<=0 || sizey<=0) + return -1; + if(newsizex<=0) + newsizex = 1; + if(newsizey<=0) + newsizey = 1; + + /* TODO: cache images */ + + if(newsizex Scaling %dx%d image to %dx%d", sizex, sizey, newsizex, newsizey); + gfximage_t*ni = gfximage_rescale(img, newsizex, newsizey); + newpic = (RGBA*)ni->data; + free(ni); + *newwidth = sizex = newsizex; + *newheight = sizey = newsizey; + mem = newpic; + } else { + *newwidth = newsizex = sizex; + *newheight = newsizey = sizey; + } + + int num_colors = swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,0); + int has_alpha = swf_ImageHasAlpha(mem,sizex,sizey); + + msg(" Drawing %dx%d %s%simage (id %d) at size %dx%d (%dx%d), %s%d colors", + sizex, sizey, + has_alpha?(has_alpha==2?"semi-transparent ":"transparent "):"", + is_jpeg?"jpeg-":"", i->currentswfid+1, + newsizex, newsizey, + targetwidth, targetheight, + /*newsizex, newsizey,*/ + num_colors>256?">":"", num_colors>256?256:num_colors); + + /*RGBA* pal = (RGBA*)rfx_alloc(sizeof(RGBA)*num_colors); + swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,pal); + int t; + for(t=0;ttag = swf_AddImage(i->tag, bitid, mem, sizex, sizey, i->config_jpegquality); + addImageToCache(dev, mem, sizex, sizey); + } else { + bitid = cacheid; + } + + if(newpic) + free(newpic); + return bitid; +} + +int line_is_empty(gfxline_t*line) +{ + while(line) { + if(line->type != gfx_moveTo) + return 0; + line = line->next; + } + return 1; +} + +static SRECT gfxline_getSWFbbox(gfxline_t*line) +{ + gfxbbox_t bbox = gfxline_getbbox(line); + SRECT r; + r.xmin = (int)(bbox.xmin*20); + r.ymin = (int)(bbox.ymin*20); + r.xmax = (int)(bbox.xmax*20); + r.ymax = (int)(bbox.ymax*20); + return r; +} + +static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(line_is_empty(line)) + return; + + endshape(dev); + endtext(dev); + + int targetx = (int)(sqrt(matrix->m00*matrix->m00 + matrix->m01*matrix->m01)*img->width); + int targety = (int)(sqrt(matrix->m10*matrix->m10 + matrix->m11*matrix->m11)*img->height); + + int newwidth=0,newheight=0; + int bitid = add_image(i, img, targetx, targety, &newwidth, &newheight); + if(bitid<0) + return; + double fx = (double)img->width / (double)newwidth; + double fy = (double)img->height / (double)newheight; + + MATRIX m; + m.sx = (int)(65536*20*matrix->m00*fx); m.r1 = (int)(65536*20*matrix->m10*fy); + m.r0 = (int)(65536*20*matrix->m01*fx); m.sy = (int)(65536*20*matrix->m11*fy); + m.tx = (int)(matrix->tx*20); + m.ty = (int)(matrix->ty*20); + + /* shape */ + int myshapeid = getNewID(dev); + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE); + SHAPE*shape; + swf_ShapeNew(&shape); + int fsid = swf_ShapeAddBitmapFillStyle(shape,&m,bitid,1); + int lsid = 0; + if(i->config_showimages) { + RGBA pink = {255,255,0,255}; + lsid = swf_ShapeAddLineStyle(shape, 20, &pink); + } + swf_SetU16(i->tag, myshapeid); + SRECT r = gfxline_getSWFbbox(line); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetShapeStyles(i->tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(i->tag,shape); + swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,lsid,fsid,0); + i->swflastx = i->swflasty = UNDEFINED_COORD; + drawgfxline(dev, line, 1); + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(shape); + + msg(" Placing image, shape ID %d, bitmap ID %d", myshapeid, bitid); + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + CXFORM cxform2 = gfxcxform_to_cxform(cxform); + swf_ObjectPlace(i->tag,myshapeid,getNewDepth(dev),&i->page_matrix,&cxform2,NULL); +} + +static RGBA col_purple = {255,255,0,255}; +static void drawoutline(gfxdevice_t*dev, gfxline_t*line) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + int myshapeid = getNewID(dev); + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + + SHAPE*shape; + swf_ShapeNew(&shape); + int lsid = swf_ShapeAddLineStyle(shape,60,&col_purple); + + swf_SetU16(i->tag,myshapeid); + SRECT r = gfxline_getSWFbbox(line); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetShapeStyles(i->tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(i->tag,shape); + swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,lsid,0,0); + drawgfxline(dev, line, 1); + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(shape); + + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + swf_ObjectPlace(i->tag, myshapeid, getNewDepth(dev), 0,0,0); +} + +static void swf_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->config_noclips) + return; + + endtext(dev); + endshape(dev); + + if(i->clippos >= 127) + { + msg(" Too many clip levels."); + i->clippos --; + } + + if(i->config_showclipshapes) { + i->stored_clipshapes = gfxline_append(i->stored_clipshapes, gfxline_clone(line)); + } + + int myshapeid = getNewID(dev); + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + RGBA col; + memset(&col, 0, sizeof(RGBA)); + col.a = 255; + SHAPE*shape; + swf_ShapeNew(&shape); + int fsid = swf_ShapeAddSolidFillStyle(shape,&col); + if(i->mark) { + RGBA markcol = {0,i->mark[0],i->mark[1],i->mark[2]}; + swf_ShapeAddSolidFillStyle(shape,&markcol); + } + swf_SetU16(i->tag,myshapeid); + SRECT r = gfxline_getSWFbbox(line); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetShapeStyles(i->tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(i->tag,shape); + swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,0,fsid,0); + i->swflastx = i->swflasty = UNDEFINED_COORD; + i->shapeisempty = 1; + drawgfxline(dev, line, 1); + if(i->shapeisempty) { + /* an empty clip shape is equivalent to a shape with no area */ + int x = line?line->x:0; + int y = line?line->y:0; + moveto(dev, i->tag, x,y); + lineto(dev, i->tag, x,y); + lineto(dev, i->tag, x,y); + } + if(!i->shapeisempty && i->currentswfid==1 && r.xmin==0 && r.ymin==0 && r.xmax==(int)(i->max_x*20) && r.ymax==(int)(i->max_y*20)) { + if(i->config_watermark) { + gfxbbox_t r; r.xmin = r.ymin = 0;r.xmax = i->max_x;r.ymax = i->max_y; + draw_watermark(dev, r, 1); + } + } + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(shape); + + /* TODO: remember the bbox, and check all shapes against it */ + + msg(" Placing clip ID %d", myshapeid); + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + i->cliptags[i->clippos] = i->tag; + i->clipshapes[i->clippos] = myshapeid; + i->clipdepths[i->clippos] = getNewDepth(dev); + i->clippos++; +} + +static void swf_endclip(gfxdevice_t*dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->config_noclips) + return; + if(i->textmode) + endtext(dev); + if(i->shapeid>=0) + endshape(dev); + + if(!i->clippos) { + msg(" Invalid end of clipping region"); + return; + } + i->clippos--; + /*swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],&i->page_matrix,NULL,NULL, + / * clip to depth: * / i->depth <= i->clipdepths[i->clippos]? i->depth : i->depth - 1); + i->depth ++;*/ + swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],&i->page_matrix,NULL,NULL,i->depth); +} +static int gfxline_type(gfxline_t*line) +{ + int tmplines=0; + int tmpsplines=0; + int lines=0; + int splines=0; + int haszerosegments=0; + int length=0; + while(line) { + if(line->type == gfx_moveTo) { + tmplines=0; + tmpsplines=0; + } else if(line->type == gfx_lineTo) { + tmplines++; + if(tmplines>lines) + lines=tmplines; + } else if(line->type == gfx_splineTo) { + tmpsplines++; + if(tmpsplines>lines) + splines=tmpsplines; + } + length++; + line = line->next; + } + if(length>400) + return 5; + if(lines==0 && splines==0) return 0; + else if(lines==1 && splines==0) return 1; + else if(lines==0 && splines==1) return 2; + else if(splines==0) return 3; + else return 4; +} + +static int gfxline_has_dots(gfxline_t*line) +{ + int tmplines=0; + double x=0,y=0; + double dist = 0; + int isline = 0; + int short_gap = 0; + while(line) { + if(line->type == gfx_moveTo) { + /* test the length of the preceding line, and assume it is a dot if + it's length is less than 1.0. But *only* if there's a noticable + gap between the previous line and the next moveTo. (I've come + across a PDF where thousands of "dots" were stringed together, + forming a line) */ + int last_short_gap = short_gap; + if((fabs(line->x - x) + fabs(line->y - y)) < 1.0) { + short_gap = 1; + } else { + short_gap = 0; + } + if(isline && dist < 1 && !short_gap && !last_short_gap) { + return 1; + } + dist = 0; + isline = 0; + } else if(line->type == gfx_lineTo) { + dist += fabs(line->x - x) + fabs(line->y - y); + isline = 1; + } else if(line->type == gfx_splineTo) { + dist += fabs(line->sx - x) + fabs(line->sy - y) + + fabs(line->x - line->sx) + fabs(line->y - line->sy); + isline = 1; + } + x = line->x; + y = line->y; + line = line->next; + } + if(isline && dist < 1 && !short_gap) { + return 1; + } + return 0; +} + +static int gfxline_fix_short_edges(gfxline_t*line) +{ + double x,y; + while(line) { + if(line->type == gfx_lineTo) { + if(fabs(line->x - x) + fabs(line->y - y) < 0.01) { + line->x += 0.01; + } + } else if(line->type == gfx_splineTo) { + if(fabs(line->sx - x) + fabs(line->sy - y) + + fabs(line->x - line->sx) + fabs(line->y - line->sy) < 0.01) { + line->x += 0.01; + } + } + x = line->x; + y = line->y; + line = line->next; + } + return 0; +} + +static char is_inside_page(gfxdevice_t*dev, gfxcoord_t x, gfxcoord_t y) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(xmin_x || x>i->max_x) return 0; + if(ymin_y || y>i->max_y) return 0; + return 1; +} + +gfxline_t* gfxline_move(gfxline_t*line, double x, double y) +{ + gfxline_t*l = line = gfxline_clone(line); + + while(l) { + l->x += x; + l->y += y; + l->sx += x; + l->sy += y; + l = l->next; + } + return line; +} + +//#define NORMALIZE_POLYGON_POSITIONS + +static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(line_is_empty(line)) + return; + int type = gfxline_type(line); + int has_dots = gfxline_has_dots(line); + gfxbbox_t r = gfxline_getbbox(line); + int is_outside_page = !is_inside_page(dev, r.xmin, r.ymin) || !is_inside_page(dev, r.xmax, r.ymax); + + if(i->config_override_line_widths) { + width = i->config_override_line_widths; + } + + /* TODO: * split line into segments, and perform this check for all segments */ + + if(i->config_disable_polygon_conversion || /*type>=5 ||*/ + (!has_dots && + (width <= i->config_caplinewidth + || (cap_style == gfx_capRound && joint_style == gfx_joinRound) + || (cap_style == gfx_capRound && type<=2)))) + { + // ... + } else { + /* convert line to polygon */ + msg(" draw as polygon, type=%d dots=%d", type, has_dots); + if(has_dots) + gfxline_fix_short_edges(line); + /* we need to convert the line into a polygon */ + gfxpoly_t* poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); + gfxline_t*gfxline = gfxline_from_gfxpoly(poly); + dev->fill(dev, gfxline, color); + gfxline_free(gfxline); + gfxpoly_destroy(poly); + return; + } + + msg(" draw as stroke, type=%d dots=%d", type, has_dots); + endtext(dev); + + if(i->config_normalize_polygon_positions) { + endshape(dev); + double startx = 0, starty = 0; + if(line && line->type == gfx_moveTo) { + startx = line->x; + starty = line->y; + } + line = gfxline_move(line, -startx, -starty); + i->shapeposx = (int)(startx*20); + i->shapeposy = (int)(starty*20); + } + + swfoutput_setstrokecolor(dev, color->r, color->g, color->b, color->a); + swfoutput_setlinewidth(dev, width); + startshape(dev); + stopFill(dev); + drawgfxline(dev, line, 0); + + if(i->config_normalize_polygon_positions) { + free(line); //account for _move + } + +} + +static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(line_is_empty(line)) + return; + if(!color->a) + return; + + gfxbbox_t r = gfxline_getbbox(line); + int is_outside_page = !is_inside_page(dev, r.xmin, r.ymin) || !is_inside_page(dev, r.xmax, r.ymax); + + if(r.xmax - r.xmin < i->config_remove_small_polygons && + r.ymax - r.ymin < i->config_remove_small_polygons) { + msg(" Not drawing %.2fx%.2f polygon", r.xmax - r.xmin, r.ymax - r.ymin); + return; + } + + endtext(dev); + + if(!i->config_ignoredraworder) + endshape(dev); + + if(i->config_normalize_polygon_positions) { + endshape(dev); + double startx = 0, starty = 0; + if(line && line->type == gfx_moveTo) { + startx = line->x; + starty = line->y; + } + line = gfxline_move(line, -startx, -starty); + i->shapeposx = (int)(startx*20); + i->shapeposy = (int)(starty*20); + } + + swfoutput_setfillcolor(dev, color->r, color->g, color->b, color->a); + startshape(dev); + startFill(dev); + drawgfxline(dev, line, 1); + + if(i->currentswfid==2 && r.xmin==0 && r.ymin==0 && r.xmax==i->max_x && r.ymax==i->max_y) { + if(i->config_watermark) { + draw_watermark(dev, r, 1); + } + } + + msg(" end of swf_fill (shapeid=%d)", i->shapeid); + + if(i->config_normalize_polygon_positions) { + free(line); //account for _move + } +} + +static GRADIENT* gfxgradient_to_GRADIENT(gfxgradient_t*gradient) +{ + int num = 0; + gfxgradient_t*g = gradient; + while(g) { + num++; + g = g->next; + } + GRADIENT* swfgradient = malloc(sizeof(GRADIENT)); + swfgradient->num = num; + swfgradient->rgba = malloc(sizeof(swfgradient->rgba[0])*num); + swfgradient->ratios = malloc(sizeof(swfgradient->ratios[0])*num); + + g = gradient; + num = 0; + while(g) { + swfgradient->ratios[num] = g->pos*255; + swfgradient->rgba[num] = *(RGBA*)&g->color; + num++; + g = g->next; + } + return swfgradient; +} + +static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + if(line_is_empty(line)) + return; + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(line_is_empty(line)) + return; + + GRADIENT* swfgradient = gfxgradient_to_GRADIENT(gradient); + if(!swfgradient) + return; + + endshape(dev); + endtext(dev); + + double f = type==gfxgradient_radial?4:4; + MATRIX m; + m.sx = (int)(matrix->m00*20*f); m.r1 = (int)(matrix->m10*20*f); + m.r0 = (int)(matrix->m01*20*f); m.sy = (int)(matrix->m11*20*f); + m.tx = (int)(matrix->tx*20); + m.ty = (int)(matrix->ty*20); + + /* shape */ + int myshapeid = getNewID(dev); + i->tag = swf_InsertTag(i->tag, ST_DEFINESHAPE2); + SHAPE*shape; + swf_ShapeNew(&shape); + int fsid = swf_ShapeAddGradientFillStyle(shape,&m,swfgradient,type==gfxgradient_radial); + swf_SetU16(i->tag, myshapeid); + SRECT r = gfxline_getSWFbbox(line); + r = swf_ClipRect(i->pagebbox, r); + swf_SetRect(i->tag,&r); + swf_SetShapeStyles(i->tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(i->tag,shape); + swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,0,fsid,0); + i->swflastx = i->swflasty = UNDEFINED_COORD; + drawgfxline(dev, line, 1); + swf_ShapeSetEnd(i->tag); + swf_ShapeFree(shape); + + int depth = getNewDepth(dev); + msg(" Placing gradient, shape ID %d, depth %d", myshapeid, depth); + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + swf_ObjectPlace(i->tag,myshapeid,depth,&i->page_matrix,NULL,NULL); + + swf_FreeGradient(swfgradient);free(swfgradient); +} + +static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id, int version) +{ + SWFFONT*swffont = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); + int t; + SRECT bounds = {0,0,0,0}; + swffont->id = -1; + swffont->version = version; + swffont->name = (U8*)strdup(id); + swffont->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); + swffont->layout->ascent = 0; + swffont->layout->descent = 0; + swffont->layout->leading = 0; + swffont->layout->bounds = (SRECT*)rfx_calloc(sizeof(SRECT)*font->num_glyphs); + swffont->encoding = FONT_ENCODING_UNICODE; + swffont->numchars = font->num_glyphs; + swffont->maxascii = font->max_unicode; + swffont->ascii2glyph = (int*)rfx_calloc(sizeof(int)*swffont->maxascii); + swffont->glyph2ascii = (U16*)rfx_calloc(sizeof(U16)*swffont->numchars); + swffont->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH)*swffont->numchars); + swffont->glyphnames = (char**)rfx_calloc(sizeof(char*)*swffont->numchars); + + SRECT max = {0,0,0,0}; + for(t=0;tnum_glyphs;t++) { + drawer_t draw; + gfxline_t*line; + double advance = 0; + int u = font->glyphs[t].unicode; + int s; + char twice=0; + for(s=0;snum_glyphs;s++) { + if(swffont->glyph2ascii[s]==u) + twice=1; + } + if(u >= 0xd800 || u == 0x0000 || twice) { + /* flash 8 flashtype requires unique unicode IDs for each character. + We use the Unicode private user area to assign characters, hoping that + the font doesn't contain more than 8192 glyphs */ + u = 0xe000 + (t&0x1fff); + } + swffont->glyph2ascii[t] = u; + + if(font->glyphs[t].name) { + swffont->glyphnames[t] = strdup(font->glyphs[t].name); + } else { + swffont->glyphnames[t] = 0; + } + advance = font->glyphs[t].advance; + + swf_Shape01DrawerInit(&draw, 0); + line = font->glyphs[t].line; + + const double scale = GLYPH_SCALE; + while(line) { + FPOINT c,to; + c.x = line->sx * scale; c.y = -line->sy * scale; + //to.x = floor(line->x * scale); to.y = floor(-line->y * scale); + to.x = line->x * scale; to.y = -line->y * scale; + + /*if(strstr(swffont->name, "BIRNU") && t==90) { + to.x += 1; + }*/ + + if(line->type == gfx_moveTo) { + draw.moveTo(&draw, &to); + } else if(line->type == gfx_lineTo) { + draw.lineTo(&draw, &to); + } else if(line->type == gfx_splineTo) { + draw.splineTo(&draw, &c, &to); + } + line = line->next; + } + draw.finish(&draw); + swffont->glyph[t].shape = swf_ShapeDrawerToShape(&draw); + + SRECT bbox = swf_ShapeDrawerGetBBox(&draw); + swf_ExpandRect2(&max, &bbox); + + swffont->layout->bounds[t] = bbox; + + if(advance<32768.0/20) { + swffont->glyph[t].advance = (int)(advance*20); + } else { + //msg(" Advance value overflow in glyph %d", t); + swffont->glyph[t].advance = 32767; + } + + draw.dealloc(&draw); + + swf_ExpandRect2(&bounds, &swffont->layout->bounds[t]); + } + + for(t=0;tnum_glyphs;t++) { + SRECT bbox = swffont->layout->bounds[t]; + + /* if the glyph doesn't have a bounding box, use the + combined bounding box (necessary e.g. for space characters) */ + if(!(bbox.xmin|bbox.ymin|bbox.xmax|bbox.ymax)) { + swffont->layout->bounds[t] = bbox = max; + } + + /* check that the advance value is reasonable, by comparing it + with the bounding box */ + if(bbox.xmax>0 && (bbox.xmax*10 < swffont->glyph[t].advance || !swffont->glyph[t].advance)) { + if(swffont->glyph[t].advance) + msg(" fix bad advance value for char %d: bbox=%.2f, advance=%.2f\n", t, bbox.xmax/20.0, swffont->glyph[t].advance/20.0); + swffont->glyph[t].advance = bbox.xmax; + } + //swffont->glyph[t].advance = bbox.xmax - bbox.xmin; + } + + + /* Flash player will use the advance value from the char, and the ascent/descent values + from the layout for text selection. + ascent will extend the char into negative y direction, from the baseline, while descent + will extend in positive y direction, also from the baseline. + The baseline is defined as the y-position zero + */ + + swffont->layout->ascent = bounds.ymin<0?-bounds.ymin:0; + swffont->layout->descent = bounds.ymax>0?bounds.ymax:0; + swffont->layout->leading = bounds.ymax - bounds.ymin; + + /* if the font has proper ascent/descent values (>0) and those define + greater (but not overly large) line spacing than what we estimated + from the bounding boxes, use the font's parameters */ + if(font->ascent*20 > swffont->layout->ascent && font->ascent*20*2 < swffont->layout->ascent) + swffont->layout->ascent = font->ascent*20; + if(font->descent*20 > swffont->layout->descent && font->descent*20*2 < swffont->layout->descent) + swffont->layout->descent = font->descent*20; + + swf_FontSort(swffont); + return swffont; +} + +static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(i->swffont && i->swffont->name && !strcmp((char*)i->swffont->name,font->id)) + return; // the requested font is the current font + + fontlist_t*last=0,*l = i->fontlist; + while(l) { + last = l; + if(!strcmp((char*)l->swffont->name, font->id)) { + return; // we already know this font + } + l = l->next; + } + l = (fontlist_t*)rfx_calloc(sizeof(fontlist_t)); + l->swffont = gfxfont_to_swffont(font, font->id, (i->config_flashversion>=8 && !NO_FONT3)?3:2); + l->next = 0; + if(last) { + last->next = l; + } else { + i->fontlist = l; + } + swf_FontSetID(l->swffont, getNewID(i->dev)); + + if(getScreenLogLevel() >= LOGLEVEL_DEBUG) { + int iii; + // print font information + msg(" Font %s",font->id); + msg(" | ID: %d", l->swffont->id); + msg(" | Version: %d", l->swffont->version); + msg(" | Name: %s", l->swffont->name); + msg(" | Numchars: %d", l->swffont->numchars); + msg(" | Maxascii: %d", l->swffont->maxascii); + msg(" | Style: %d", l->swffont->style); + msg(" | Encoding: %d", l->swffont->encoding); + if(l->swffont->layout) { + msg(" | Ascent: %.2f", l->swffont->layout->ascent / 20.0); + msg(" | Descent: %.2f", l->swffont->layout->descent / 20.0); + msg(" | Leading: %.2f", l->swffont->layout->leading / 20.0); + } + + for(iii=0; iiiswffont->numchars;iii++) { + msg(" | Glyph %d) name=%s, unicode=%d size=%d bbox=(%.2f,%.2f,%.2f,%.2f)\n", iii, l->swffont->glyphnames?l->swffont->glyphnames[iii]:"", l->swffont->glyph2ascii[iii], l->swffont->glyph[iii].shape->bitlen, + l->swffont->layout->bounds[iii].xmin/20.0, + l->swffont->layout->bounds[iii].ymin/20.0, + l->swffont->layout->bounds[iii].xmax/20.0, + l->swffont->layout->bounds[iii].ymax/20.0 + ); + } + } +} + +static void swf_switchfont(gfxdevice_t*dev, const char*fontid) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + if(i->swffont && i->swffont->name && !strcmp((char*)i->swffont->name,fontid)) + return; // the requested font is the current font + + fontlist_t*l = i->fontlist; + while(l) { + if(!strcmp((char*)l->swffont->name, fontid)) { + i->swffont = l->swffont; + return; //done! + } + l = l->next; + } + msg(" Unknown font id: %s", fontid); + return; +} + +/* sets the matrix which is to be applied to characters drawn by swfoutput_drawchar() */ +static void setfontscale(gfxdevice_t*dev,double m11,double m12, double m21,double m22,double x, double y, char force) +{ + m11 *= 1024; + m12 *= 1024; + m21 *= 1024; + m22 *= 1024; + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->lastfontm11 == m11 && + i->lastfontm12 == m12 && + i->lastfontm21 == m21 && + i->lastfontm22 == m22 && !force) + return; + if(i->textmode) + endtext(dev); + + i->lastfontm11 = m11; + i->lastfontm12 = m12; + i->lastfontm21 = m21; + i->lastfontm22 = m22; + + double xsize = sqrt(m11*m11 + m12*m12); + double ysize = sqrt(m21*m21 + m22*m22); + + int extrazoom = 1; + if(i->config_flashversion>=8 && !NO_FONT3) + extrazoom = 20; + + i->current_font_size = (xsize>ysize?xsize:ysize)*extrazoom; + if(i->current_font_size < 1) + i->current_font_size = 1; + + MATRIX m; + swf_GetMatrix(0, &m); + + if(m21 || m12 || fabs(m11+m22)>0.001 || m11<0) { + double ifs = (double)extrazoom/(i->current_font_size); + m.sx = (S32)((m11*ifs)*65536); m.r1 = -(S32)((m21*ifs)*65536); + m.r0 = (S32)((m12*ifs)*65536); m.sy = -(S32)((m22*ifs)*65536); + } + + /* this is the position of the first char to set a new fontmatrix- + we hope that it's close enough to all other characters using the + font, so we use its position as origin for the matrix */ + m.tx = x*20; + m.ty = y*20; + i->fontmatrix = m; +} + + +static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(!font) { + msg(" swf_drawchar called (glyph %d) without font", glyph); + return; + } + + if(i->config_drawonlyshapes) { + gfxglyph_t*g = &font->glyphs[glyph]; + gfxline_t*line2 = gfxline_clone(g->line); + gfxline_transform(line2, matrix); + dev->fill(dev, line2, color); + gfxline_free(line2); + return; + } + + if(!i->swffont || !i->swffont->name || strcmp((char*)i->swffont->name,font->id)) // not equal to current font + { + swf_switchfont(dev, font->id); // set the current font + } + + if(!i->swffont) { + msg(" swf_drawchar: Font is NULL"); + return; + } + if(glyph<0 || glyph>=i->swffont->numchars) { + msg(" No character %d in font %s (%d chars)", glyph, FIXNULL((char*)i->swffont->name), i->swffont->numchars); + return; + } + glyph = i->swffont->glyph2glyph[glyph]; + + setfontscale(dev, matrix->m00, matrix->m01, matrix->m10, matrix->m11, matrix->tx, matrix->ty, 0); + + double det = i->fontmatrix.sx/65536.0 * i->fontmatrix.sy/65536.0 - + i->fontmatrix.r0/65536.0 * i->fontmatrix.r1/65536.0; + if(fabs(det) < 0.0005) { + /* x direction equals y direction- the text is invisible */ + msg(" Not drawing invisible character %d (det=%f, m=[%f %f;%f %f]\n", glyph, + det, + i->fontmatrix.sx/65536.0, i->fontmatrix.r1/65536.0, + i->fontmatrix.r0/65536.0, i->fontmatrix.sy/65536.0); + return; + } + + /*if(i->swffont->glyph[glyph].shape->bitlen <= 16) { + msg(" Glyph %d in current charset (%s, %d characters) is empty", + glyph, FIXNULL((char*)i->swffont->name), i->swffont->numchars); + return 1; + }*/ + + /* calculate character position with respect to the current font matrix */ + double s = 20 * GLYPH_SCALE / det; + double px = matrix->tx - i->fontmatrix.tx/20.0; + double py = matrix->ty - i->fontmatrix.ty/20.0; + int x = (SCOORD)(( px * i->fontmatrix.sy/65536.0 - py * i->fontmatrix.r1/65536.0)*s); + int y = (SCOORD)((- px * i->fontmatrix.r0/65536.0 + py * i->fontmatrix.sx/65536.0)*s); + if(x>32767 || x<-32768 || y>32767 || y<-32768) { + msg(" Moving character origin to %f %f\n", matrix->tx, matrix->ty); + endtext(dev); + setfontscale(dev, matrix->m00, matrix->m01, matrix->m10, matrix->m11, matrix->tx, matrix->ty, 1); + /* since we just moved the char origin to the current char's position, + it now has the relative position (0,0) */ + x = y = 0; + } + + if(i->shapeid>=0) + endshape(dev); + + if(i->config_animate) { + endtext(dev); + i->tag = swf_InsertTag(i->tag,ST_SHOWFRAME); + } + + if(!i->textmode) + starttext(dev); + + msg(" Drawing char %d in font %d at %d,%d in color %02x%02x%02x%02x", + glyph, i->swffont->id, x, y, color->r, color->g, color->b, color->a); + + if(color->a == 0 && i->config_invisibletexttofront) { + RGBA color2 = *(RGBA*)color; + if(i->config_flashversion>=8) { + // use "multiply" blend mode + color2.a = color2.r = color2.g = color2.b = 255; + } + i->topchardata = charbuffer_append(i->topchardata, i->swffont, glyph, x, y, i->current_font_size, color2, &i->fontmatrix); + } else { + i->chardata = charbuffer_append(i->chardata, i->swffont, glyph, x, y, i->current_font_size, *(RGBA*)color, &i->fontmatrix); + } + swf_FontUseGlyph(i->swffont, glyph, i->current_font_size); + return; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h new file mode 100644 index 000000000..efb08fb64 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h @@ -0,0 +1,37 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __swfoutput_h__ +#define __swfoutput_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_swf_init(gfxdevice_t*); + +#ifdef __cplusplus +} +#endif + +#endif //__swfoutput_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/text.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/text.c new file mode 100644 index 000000000..ed7f60ce8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/text.c @@ -0,0 +1,255 @@ +/* text.c + + Part of the swftools package. + + Copyright (c) 2006 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include "../types.h" +#include "../mem.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../utf8.h" + +typedef struct _textpage { + char*text; + int textsize; + int textpos; + struct _textpage*next; +} textpage_t; + +typedef struct _internal { + textpage_t*first_page; + textpage_t*current_page; + double currentx; + double currenty; + double lastadvance; +} internal_t; + +int text_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + return 0; +} +void text_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + if(!i->first_page) { + i->first_page = i->current_page = (textpage_t*)malloc(sizeof(textpage_t)); + } else { + i->current_page->next = (textpage_t*)malloc(sizeof(textpage_t)); + i->current_page = i->current_page->next; + } + i->current_page->textsize = 4096; + i->current_page->text = (char*)malloc(i->current_page->textsize); + i->current_page->textpos = 0; + i->current_page->next = 0; + i->currentx = 0; + i->currenty = 0; + i->lastadvance = 0; +} +void text_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; +} +void text_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; +} +void text_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; +} +void text_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; +} +void text_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; +} +void text_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; +} +void text_addfont(gfxdevice_t*dev, gfxfont_t*font) {} + +static void addchar(gfxdevice_t*dev, int unicode) +{ + internal_t*i = (internal_t*)dev->internal; + if(!i->current_page) { + text_startpage(dev, 0, 0); + } + if(i->current_page->textpos + 10 > i->current_page->textsize) { + i->current_page->textsize += 4096; + i->current_page->text = realloc(i->current_page->text, i->current_page->textsize); + } + writeUTF8(unicode, &i->current_page->text[i->current_page->textpos]); + i->current_page->textpos += strlen(&i->current_page->text[i->current_page->textpos]); +} + +void text_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + double xshift = matrix->tx - i->currentx; + double yshift = matrix->ty - i->currenty; + i->currentx = matrix->tx; + i->currenty = matrix->ty; + + if(fabs(yshift)>1.0) { + addchar(dev, 10); + } else if(xshift > i->lastadvance*1.3 || xshift<0) { + addchar(dev, 32); + } + int u; + if(font) { + i->lastadvance = font->glyphs[glyphnr].advance*matrix->m00; + u = font->glyphs[glyphnr].unicode; + } else { + u = glyphnr; + i->currentx = 0;i->currenty = 0; + } + if(u>13) { + addchar(dev, u); + } +} + +void text_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*drawlink) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void text_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; +} + +void text_result_write(gfxresult_t*r, int filedesc) +{ + textpage_t*i= (textpage_t*)r->internal; +} +int text_result_save(gfxresult_t*r, const char*filename) +{ + textpage_t*i= (textpage_t*)r->internal; + if(!i) { + return 0; // no pages drawn + } + FILE*fi = fopen(filename, "wb"); + if(!fi) + return 0; + while(i) { + fwrite(i->text, i->textpos, 1, fi); + i = i->next; + } + fclose(fi); + return 1; +} +void*text_result_get(gfxresult_t*r, const char*name) +{ + textpage_t*i= (textpage_t*)r->internal; + if(!strcmp(name,"text")) { + textpage_t*j = i; + int len = 0; + while(j) { + len += i->textpos; + j = j->next; + } + char*text = (char*)malloc(len); + int pos = 0; + j = i; + while(j) { + memcpy(&text[pos], i->text, i->textpos); + pos += i->textpos; + j = j->next; + } + text[pos] = 0; + return text; + } else if(!strncmp(name,"page",4)) { + int pagenr = atoi(&name[4]); + if(pagenr<0) + pagenr=0; + while(pagenr>0) { + i = i->next; + if(!i) + return 0; + } + i->text[i->textpos] = 0; + return strdup(i->text); + } + return 0; +} +void text_result_destroy(gfxresult_t*r) +{ + textpage_t*i= (textpage_t*)r->internal; + r->internal = 0; + while(i) { + textpage_t*next = i->next; + free(i->text);i->text = 0; + free(i); + i = next; + } + free(r); +} + +gfxresult_t* text_finish(struct _gfxdevice*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + gfxresult_t* res = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); + + res->internal = i->first_page;i->first_page = 0;i->current_page=0; + res->write = text_result_write; + res->save = text_result_save; + res->get = text_result_get; + res->destroy = text_result_destroy; + + free(dev->internal); dev->internal = 0; i = 0; + + return res; +} + + + +void gfxdevice_text_init(gfxdevice_t*dev, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "text"; + + dev->internal = i; + + dev->setparameter = text_setparameter; + dev->startpage = text_startpage; + dev->startclip = text_startclip; + dev->endclip = text_endclip; + dev->stroke = text_stroke; + dev->fill = text_fill; + dev->fillbitmap = text_fillbitmap; + dev->fillgradient = text_fillgradient; + dev->addfont = text_addfont; + dev->drawchar = text_drawchar; + dev->drawlink = text_drawlink; + dev->endpage = text_endpage; + dev->finish = text_finish; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/text.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/text.h new file mode 100644 index 000000000..1f520931c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/devices/text.h @@ -0,0 +1,37 @@ +/* text.h + Header file for dummy.c + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxdevice_text_h__ +#define __gfxdevice_text_h__ + +#include "../gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void gfxdevice_text_init(gfxdevice_t*dev); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_text_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/drawer.c b/fluidbook/tools/swftools-special-swfdump/lib/drawer.c new file mode 100644 index 000000000..671ac84aa --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/drawer.c @@ -0,0 +1,390 @@ +/* drawer.c + part of swftools + + A generic structure for providing vector drawing. + (Helper routines, spline approximation, simple text drawers) + + Copyright (C) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include "drawer.h" + +static char* getToken(const char**p) +{ + const char*start; + char*result; + while(**p && strchr(" ,()\t\n\r", **p)) { + (*p)++; + } + start = *p; + + /* + SVF pathdata can exclude whitespace after L and M commands. + Ref: http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation + This allows us to use svg files output from gnuplot. + Also checks for relative MoveTo and LineTo (m and l). + 051106 Magnus Lundin, lundin@mlu.mine.nu + */ + if (strchr("LMlm", **p) && (isdigit(*(*p+1))||strchr("+-", *(*p+1)))) { + (*p)++; + } + else while(**p && !strchr(" ,()\t\n\r", **p)) { + (*p)++; + } + result = (char*)malloc((*p)-start+1); + memcpy(result,start,(*p)-start+1); + result[(*p)-start] = 0; + return result; +} + +void draw_conicTo(drawer_t*draw, FPOINT* c, FPOINT* to) +{ + FPOINT* pos = &draw->pos; + FPOINT c1,c2; + c1.x = (pos->x + 2 * c->x) / 3; + c1.y = (pos->y + 2 * c->y) / 3; + c2.x = (2 * c->x + to->x) / 3; + c2.y = (2 * c->y + to->y) / 3; + draw_cubicTo(draw, &c1,&c2,to); + + draw->pos = *to; +} + +/* convenience routine */ +static void draw_conicTo2(drawer_t*draw, double x1, double y1, double x2, double y2) +{ + FPOINT c1,c2; + c1.x = x1; + c1.y = y1; + c2.x = x2; + c2.y = y2; + draw_conicTo(draw, &c1, &c2); +} +/* convenience routine */ +static void draw_moveTo2(drawer_t*draw, double x, double y) +{ + FPOINT c; + c.x = x; c.y = y; + draw->moveTo(draw, &c); +} +/* convenience routine */ +static void draw_lineTo2(drawer_t*draw, double x, double y) +{ + FPOINT c; + c.x = x; c.y = y; + draw->lineTo(draw, &c); +} + +static float getFloat(const char** p) +{ + char* token = getToken(p); + float result = atof(token); + free(token); + return result; +} + +void draw_string(drawer_t*draw, const char*string) +{ + const char*p = string; + while(*p) { + char*token = getToken(&p); + if(!token) + break; + if (!*token) + { + free(token); + break; + } + if(!strncmp(token, "moveTo", 6) || + !strncmp(token, "M", 1) //svg + ) { + FPOINT to; + to.x = getFloat(&p); + to.y = getFloat(&p); + draw->moveTo(draw, &to); + } + else if(!strncmp(token, "lineTo", 6) || + !strncmp(token, "L", 1) //svg + ) { + FPOINT to; + to.x = getFloat(&p); + to.y = getFloat(&p); + draw->lineTo(draw, &to); + } + else if(!strncmp(token, "curveTo", 7) || !strncmp(token, "splineTo", 8)) { + FPOINT mid,to; + mid.x = getFloat(&p); + mid.y = getFloat(&p); + to.x = getFloat(&p); + to.y = getFloat(&p); + draw->splineTo(draw, &mid, &to); + } + else if(!strncmp(token, "conicTo", 5)) { + FPOINT mid,to; + mid.x = getFloat(&p); + mid.y = getFloat(&p); + to.x = getFloat(&p); + to.y = getFloat(&p); + draw_conicTo(draw, &mid, &to); + } + else if(!strncmp(token, "circle", 6)) { + int mx,my,r; + double r2; + mx = getFloat(&p); + my = getFloat(&p); + r = getFloat(&p); + r2 = 0.70710678118654757*r; + draw_moveTo2(draw, mx, my-r); + draw_conicTo2(draw, mx+r2, my-r2, mx+r, my); + draw_conicTo2(draw, mx+r2, my+r2, mx, my+r); + draw_conicTo2(draw, mx-r2, my+r2, mx-r, my); + draw_conicTo2(draw, mx-r2, my-r2, mx, my-r); + } + else if(!strncmp(token, "box", 3)) { + int x1,y1,x2,y2; + x1 = getFloat(&p); + y1 = getFloat(&p); + x2 = getFloat(&p); + y2 = getFloat(&p); + draw_moveTo2(draw, x1, y1); + draw_lineTo2(draw, x1, y2); + draw_lineTo2(draw, x2, y2); + draw_lineTo2(draw, x2, y1); + draw_lineTo2(draw, x1, y1); + } + else if(!strncmp(token, "cubicTo", 5) || + !strncmp(token, "C", 1) //svg + ) { + FPOINT mid1,mid2,to; + mid1.x = getFloat(&p); + mid1.y = getFloat(&p); + mid2.x = getFloat(&p); + mid2.y = getFloat(&p); + to.x = getFloat(&p); + to.y = getFloat(&p); + draw_cubicTo(draw, &mid1, &mid2, &to); + } + else if(!strncmp(token, "z", 1) //svg + ) { + // ignore + } + else + fprintf(stderr, "drawer: Warning: unknown primitive '%s'\n", token); + + free(token); + } +} + +struct SPLINEPOINT +{ + double x,y; +}; + +struct qspline +{ + struct SPLINEPOINT start; + struct SPLINEPOINT control; + struct SPLINEPOINT end; +}; + +struct cspline +{ + struct SPLINEPOINT start; + struct SPLINEPOINT control1; + struct SPLINEPOINT control2; + struct SPLINEPOINT end; +}; + +static inline struct SPLINEPOINT cspline_getpoint(const struct cspline*s, double t) +{ + struct SPLINEPOINT p; + double tt = t*t; + double ttt = tt*t; + double mt = (1-t); + double mtmt = mt*(1-t); + double mtmtmt = mtmt*(1-t); + p.x= s->end.x*ttt + 3*s->control2.x*tt*mt + + 3*s->control1.x*t*mtmt + s->start.x*mtmtmt; + p.y= s->end.y*ttt + 3*s->control2.y*tt*mt + + 3*s->control1.y*t*mtmt + s->start.y*mtmtmt; + return p; +} +static struct SPLINEPOINT qspline_getpoint(const struct qspline*s, double t) +{ + struct SPLINEPOINT p; + p.x= s->end.x*t*t + 2*s->control.x*t*(1-t) + s->start.x*(1-t)*(1-t); + p.y= s->end.y*t*t + 2*s->control.y*t*(1-t) + s->start.y*(1-t)*(1-t); + return p; +} + +static int approximate3(const struct cspline*s, struct qspline*q, int size, double quality2) +{ + unsigned int gran = 0; + unsigned int istep = 0x80000000; + unsigned int istart = 0; + int num = 0; + int level = 0; + + while(istart<0x80000000) + { + unsigned int iend = istart + istep; + double start = istart/(double)0x80000000; + double end = iend/(double)0x80000000; + struct qspline test; + double pos,qpos; + char left = 0,recurse=0; + int t; + int probes = 15; + + /* create simple approximation: a qspline which run's through the + qspline point at 0.5 */ + test.start = cspline_getpoint(s, start); + test.control = cspline_getpoint(s, (start+end)/2); + test.end = cspline_getpoint(s, end); + /* fix the control point: + move it so that the new spline does runs through it */ + test.control.x = -(test.end.x + test.start.x)/2 + 2*(test.control.x); + test.control.y = -(test.end.y + test.start.y)/2 + 2*(test.control.y); + + /* depending on where we are in the spline, we either try to match + the left or right tangent */ + if(start<0.5) + left=1; + /* get derivative */ + pos = left?start:end; + qpos = pos*pos; + test.control.x = s->end.x*(3*qpos) + 3*s->control2.x*(2*pos-3*qpos) + + 3*s->control1.x*(1-4*pos+3*qpos) + s->start.x*(-3+6*pos-3*qpos); + test.control.y = s->end.y*(3*qpos) + 3*s->control2.y*(2*pos-3*qpos) + + 3*s->control1.y*(1-4*pos+3*qpos) + s->start.y*(-3+6*pos-3*qpos); + if(left) { + test.control.x *= (end-start)/2; + test.control.y *= (end-start)/2; + test.control.x += test.start.x; + test.control.y += test.start.y; + } else { + test.control.x *= -(end-start)/2; + test.control.y *= -(end-start)/2; + test.control.x += test.end.x; + test.control.y += test.end.y; + } + +#define PROBES +#ifdef PROBES + /* measure the spline's accurancy, by taking a number of probes */ + for(t=0;tquality2) { + recurse=1;break; + } + qr2 = qspline_getpoint(&test, (1-pos)); + cr2 = cspline_getpoint(s, start+(1-pos)*(end-start)); + + dx = qr2.x - cr2.x; + dy = qr2.y - cr2.y; + dist2 = dx*dx+dy*dy; + + if(dist2>quality2) { + recurse=1;break; + } + } +#else // quadratic error: *much* faster! + + /* convert control point representation to + d*x^3 + c*x^2 + b*x + a */ + double dx,dy; + dx= s->end.x - s->control2.x*3 + s->control1.x*3 - s->start.x; + dy= s->end.y - s->control2.y*3 + s->control1.y*3 - s->start.y; + + /* we need to do this for the subspline between [start,end], not [0,1] + as a transformation of t->a*t+b does nothing to highest coefficient + of the spline except multiply it with a^3, we just need to modify + d here. */ + {double m = end-start; + dx*=m*m*m; + dy*=m*m*m; + } + + /* use the integral over (f(x)-g(x))^2 between 0 and 1 + to measure the approximation quality. + (it boils down to const*d^2) + */ + recurse = (dx*dx + dy*dy > quality2); +#endif + + if(recurse && istep>1 && size-level > num) { + istep >>= 1; + level++; + } else { + *q++ = test; + num++; + istart += istep; + while(!(istart & istep)) { + level--; + istep <<= 1; + } + } + } + return num; +} + +void draw_cubicTo(drawer_t*draw, FPOINT* control1, FPOINT* control2, FPOINT* to) +{ + struct qspline q[128]; + struct cspline c; + //double quality = 80; + double maxerror = 1;//(500-(quality*5)>1?500-(quality*5):1)/20.0; + int t,num; + + c.start.x = draw->pos.x; + c.start.y = draw->pos.y; + c.control1.x = control1->x; + c.control1.y = control1->y; + c.control2.x = control2->x; + c.control2.y = control2->y; + c.end.x = to->x; + c.end.y = to->y; + + num = approximate3(&c, q, 128, maxerror*maxerror); + + for(t=0;tsplineTo(draw, &mid, &to); + } +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/drawer.h b/fluidbook/tools/swftools-special-swfdump/lib/drawer.h new file mode 100644 index 000000000..7c88df5a1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/drawer.h @@ -0,0 +1,52 @@ +/* drawer.h + part of swftools + + A generic structure for providing vector drawing. + + Copyright (C) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __drawer_h__ +#define __drawer_h__ + +typedef struct _FPOINT +{ + float x,y; +} FPOINT; + +typedef struct _drawer_t +{ + void*internal; + + FPOINT pos; //last "to" + + void (*setLineStyle)(struct _drawer_t*draw, void*linestyle); + void (*setFillStyle)(struct _drawer_t*draw, void*fillstyle); + + void (*moveTo)(struct _drawer_t*draw, FPOINT * to); + void (*lineTo)(struct _drawer_t*draw, FPOINT * to); + void (*splineTo)(struct _drawer_t*draw, FPOINT*c, FPOINT * to); + void (*finish)(struct _drawer_t*draw); + + void (*dealloc)(struct _drawer_t*draw); + +} drawer_t; + +void draw_cubicTo(drawer_t*drawer, FPOINT* control1, FPOINT* control2, FPOINT* to); +void draw_conicTo(drawer_t*drawer, FPOINT* control, FPOINT* to); +void draw_string(drawer_t*drawer, const char*code); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c new file mode 100644 index 000000000..98a49af4c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c @@ -0,0 +1,117 @@ +/* alpha.c + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../gfxfilter.h" +#include "../gfxtools.h" +#include "../types.h" +#include "../mem.h" + +typedef struct _internal { + U8 alpha; +} internal_t; + +static inline gfxcolor_t transform_color(internal_t*i, gfxcolor_t*col) +{ + gfxcolor_t col2; + col2.r = col->r; + col2.g = col->g; + col2.b = col->b; + col2.a = (col->a * i->alpha)/255; + return col2; +} + +static void maketransparent_stroke(gfxfilter_t*f, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfxcolor_t color2 = transform_color(i, color); + out->stroke(out, line, width, &color2, cap_style, joint_style, miterLimit); +} +static void maketransparent_fill(gfxfilter_t*f, gfxline_t*line, gfxcolor_t*color, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfxcolor_t color2 = transform_color(i, color); + out->fill(out, line, &color2); +} +static void maketransparent_fillbitmap(gfxfilter_t*f, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfximage_t img2; + img2.width = img->width; + img2.height = img->height; + img2.data = (gfxcolor_t*)rfx_alloc(img->width*img->height*4); + int x,y; + for(y=0;yheight;y++) { + gfxcolor_t*in = &img->data[y*img->width]; + gfxcolor_t*out = &img2.data[y*img->width]; + for(x=0;xwidth;x++) { + out[x] = transform_color(i, &in[x]); + } + } + out->fillbitmap(out, line, &img2, matrix, cxform); + rfx_free(img2.data); +} +static void maketransparent_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfxcolor_t color2 = transform_color(i, color); + out->drawchar(out, font, glyphnr, color, matrix); +} +static void maketransparent_fillgradient(gfxfilter_t*f, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + + gfxgradient_t*g = 0, *prev = 0; + + while(gradient) { + gfxgradient_t*n = rfx_alloc(sizeof(gfxgradient_t)); + n->pos = gradient->pos; + n->color = transform_color(i, &gradient->color); + n->next = 0; + if(prev) { + prev->next = n; + prev = n; + } else { + g = prev = n; + } + gradient = gradient->next; + } + + out->fillgradient(out, line, g, type, matrix); + gfxgradient_destroy(g); +} + +void gfxfilter_maketransparent_init(gfxfilter_t*f, U8 alpha) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + i->alpha = alpha; + + memset(f, 0, sizeof(gfxfilter_t)); + f->type = gfxfilter_onepass; + f->name = "maketransparent"; + f->internal = i; + f->stroke = maketransparent_stroke; + f->fill = maketransparent_fill; + f->fillbitmap = maketransparent_fillbitmap; + f->fillgradient = maketransparent_fillgradient; + f->drawchar = maketransparent_drawchar; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c new file mode 100644 index 000000000..8802171bf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c @@ -0,0 +1,117 @@ +/* remove_font_transform.c + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../gfxfilter.h" +#include "../gfxtools.h" +#include "../gfxfont.h" +#include "../types.h" +#include "../mem.h" + +typedef struct _internal { + gfxfontlist_t*fonts; + gfxfont_t*font; + int num_glyphs; +} internal_t; + +typedef struct _fontdata { + gfxfont_t*font; + int start; +} fontdata_t; + +static void pass1_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + fontdata_t*d = gfxfontlist_getuserdata(i->fonts, font->id); + if(!d) { + d = rfx_calloc(sizeof(fontdata_t)); + d->font = font; + d->start = i->num_glyphs; + i->num_glyphs += font->num_glyphs; + i->fonts = gfxfontlist_addfont2(i->fonts, font, d); + } + out->drawchar(out, font, glyphnr, color, matrix); +} +static gfxresult_t*pass1_finish(gfxfilter_t*f, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfxfont_t*font = i->font = rfx_calloc(sizeof(gfxfont_t)); + font->id = strdup("onebigfont"); + font->num_glyphs = i->num_glyphs; + font->glyphs = rfx_calloc(sizeof(gfxglyph_t)*i->num_glyphs); + gfxfontlist_t*l = i->fonts; + while(l) { + gfxfont_t*old = l->font; + fontdata_t*d = l->user; + memcpy(font->glyphs + d->start, old->glyphs, sizeof(gfxglyph_t)*old->num_glyphs); + if(old->ascent > font->ascent) + font->ascent = old->ascent; + if(old->descent > font->descent) + font->descent = old->descent; + l = l->next; + } + gfxfont_fix_unicode(font, 0); + return out->finish(out); +} + +static void pass2_addfont(gfxfilter_t*f, gfxfont_t*font, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + out->addfont(out, i->font); +} +static void pass2_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + fontdata_t*d = gfxfontlist_getuserdata(i->fonts, font->id); + out->drawchar(out, i->font, glyphnr + d->start, color, matrix); +} +static gfxresult_t*pass2_finish(gfxfilter_t*f, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + // clean up + gfxfontlist_t*l = i->fonts; + while(l) { + free(l->user);l->user=0; + l=l->next; + } + gfxfontlist_free(i->fonts, 0);i->fonts=0; + return out->finish(out); +} + +void gfxtwopassfilter_one_big_font_init(gfxtwopassfilter_t*f) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + + memset(f, 0, sizeof(gfxtwopassfilter_t)); + f->type = gfxfilter_twopass; + + f->pass1.name = "filter \"one big font\" pass 1"; + f->pass1.drawchar = pass1_drawchar; + f->pass1.finish = pass1_finish; + f->pass1.internal = i; + + f->pass2.name = "filter \"one big font\" pass 2"; + f->pass2.addfont = pass2_addfont; + f->pass2.drawchar = pass2_drawchar; + f->pass2.finish = pass2_finish; + f->pass2.internal = i; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c new file mode 100644 index 000000000..e1d05902b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c @@ -0,0 +1,326 @@ +/* remove_font_transform.c + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../gfxfilter.h" +#include "../gfxtools.h" +#include "../gfxfont.h" +#include "../types.h" +#include "../mem.h" +#include "../q.h" +#include "../log.h" + +typedef struct _mymatrix { + float m00,m01,m10,m11; + char*id; + unsigned char alpha; +} mymatrix_t; + +static void* mymatrix_clone(const void*_m) { + if(_m==0) + return 0; + const mymatrix_t*m1=_m; + mymatrix_t*m2 = malloc(sizeof(mymatrix_t)); + *m2 = *m1; + m2->id = strdup(m1->id); + return m2; +} +static unsigned int mymatrix_hash(const void*_m) { + if(!_m) + return 0; + const mymatrix_t*m = (mymatrix_t*)_m; + unsigned int h=0; + h = crc32_add_bytes(h, (char*)&m->m00, sizeof(m->m00)); + h = crc32_add_bytes(h, (char*)&m->m01, sizeof(m->m01)); + h = crc32_add_bytes(h, (char*)&m->m10, sizeof(m->m10)); + h = crc32_add_bytes(h, (char*)&m->m11, sizeof(m->m11)); + h = crc32_add_bytes(h, (char*)&m->alpha, 1); + h = crc32_add_string(h, m->id); + return h; +} +static void mymatrix_destroy(void*_m) { + mymatrix_t*m = (mymatrix_t*)_m; + free(m->id);m->id=0; + free(m); +} +static char mymatrix_equals(const void*_m1, const void*_m2) { + const mymatrix_t*m1=_m1; + const mymatrix_t*m2=_m2; + if(!m1 || !m2) + return m1==m2; + + /* we do a binary comparison of the float32 + bits here instead of a numerical comparison + to prevent the compiler from e.g. removing the + (float) cast during optimization, which would break + the equivalence between equals() and hash() (as + the hash is derived from the float32 values) */ + return *(U32*)&m1->m00 == *(U32*)&m2->m00 && + *(U32*)&m1->m01 == *(U32*)&m2->m01 && + *(U32*)&m1->m10 == *(U32*)&m2->m10 && + *(U32*)&m1->m11 == *(U32*)&m2->m11 && + m1->alpha == m2->alpha && + !strcmp(m1->id, m2->id); +} +type_t mymatrix_type = { + dup: mymatrix_clone, + hash: mymatrix_hash, + free: mymatrix_destroy, + equals: mymatrix_equals +}; + +typedef struct _internal { + dict_t*matrices; + char first; +} internal_t; + + +#ifdef __GNUC__ +int __attribute__((noinline)) + matrix_convert(gfxmatrix_t*in, const char*id, mymatrix_t*out, gfxmatrix_t*scalematrix, unsigned char alpha) +#else +int matrix_convert(gfxmatrix_t*in, const char*id, mymatrix_t*out, gfxmatrix_t*scalematrix, unsigned char alpha) +#endif +{ + double l1 = sqrt(in->m00 * in->m00 + in->m01 * in->m01); + double l2 = sqrt(in->m10 * in->m10 + in->m11 * in->m11); + double l = (l1+l2)/2.0; + if(l < 1e-10) { + memset(out, 0, sizeof(*out)); + return 0; + } + out->m00 = in->m00 / l; + out->m10 = in->m10 / l; + out->m01 = -in->m01 / l; + out->m11 = -in->m11 / l; + out->id = (char*)id; + out->alpha = alpha?1:0; + + if(scalematrix) { + scalematrix->m00 = l; + scalematrix->m01 = 0; + scalematrix->m10 = 0; + scalematrix->m11 = -l; + scalematrix->tx = in->tx; + scalematrix->ty = in->ty; + } + return 1; +} + +typedef struct _matrixdata { + gfxfontlist_t*fonts; +} matrixdata_t; + +typedef struct _transformedfont { + gfxfont_t*orig; + gfxfont_t*font; + mymatrix_t matrix; + int*used; + double dx; +} transformedfont_t; + +static transformedfont_t* transformedfont_new(gfxfont_t*orig, mymatrix_t*m) +{ + transformedfont_t*f = rfx_calloc(sizeof(transformedfont_t)); + f->orig = orig; + f->matrix = *m; + f->used = rfx_calloc(sizeof(f->used[0])*orig->num_glyphs); + int t; + for(t=0;tnum_glyphs;t++) { + if(orig->glyphs[t].unicode==32 && + (!orig->glyphs[t].line || + !orig->glyphs[t].line->next || + !orig->glyphs[t].line->next->next)) + f->used[t]=1; //always preserve the space char in fonts + } + return f; +} + +static void pass1_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + mymatrix_t m; + if(!font->id) + msg(" Font has no ID"); + if(!matrix_convert(matrix, font->id?font->id:"unknown", &m, 0, color->a)) + return; + transformedfont_t*fd = dict_lookup(i->matrices, &m); + if(!fd) { + fd = transformedfont_new(font, &m); + dict_put(i->matrices, &m, fd); + } + fd->used[glyphnr]=1; + out->drawchar(out, font, glyphnr, color, matrix); +} + +static void glyph_transform(gfxglyph_t*g, mymatrix_t*mm) +{ + gfxmatrix_t m; + m.m00 = mm->m00; + m.m01 = mm->m01; + m.m10 = mm->m10; + m.m11 = mm->m11; + m.tx = 0; + m.ty = 0; + if(m.m00>0) + g->advance *= m.m00; + g->line = gfxline_clone(g->line); + gfxline_transform(g->line, &m); +} + +static gfxresult_t* pass1_finish(gfxfilter_t*f, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + DICT_ITERATE_DATA(i->matrices, transformedfont_t*, fd) { + gfxfont_t*font = fd->font = rfx_calloc(sizeof(gfxfont_t)); + char id[80]; + static int fontcount=0; + sprintf(id, "font%d", fontcount++); + font->id = strdup(id); + int t; + int count=0; + for(t=0;torig->num_glyphs;t++) { + if(fd->used[t]) + count++; + } + font->num_glyphs = count; + font->glyphs = rfx_calloc(sizeof(gfxglyph_t)*font->num_glyphs); + count = 0; + for(t=0;torig->num_glyphs;t++) { + if(fd->used[t]) { + font->glyphs[count] = fd->orig->glyphs[t]; + glyph_transform(&font->glyphs[count], &fd->matrix); + fd->used[t] = count + 1; + count++; + } + } + + /* adjust the origin so that every character is to the + right of the origin */ + gfxbbox_t total = {0,0,0,0}; + double average_xmax = 0; + for(t=0;tglyphs[t].line; + gfxbbox_t b = gfxline_getbbox(line); + total = gfxbbox_expand_to_bbox(total, b); + } + if(count) + average_xmax /= count; + + fd->dx = 0;//-total.xmin; + + font->ascent = total.ymax; + font->descent = -total.ymin; + + for(t=0;tglyphs[t]; + gfxline_t*line = font->glyphs[t].line; + + if(fd->matrix.alpha) { + while(line) { + line->x += fd->dx; + line->sx += fd->dx; + line = line->next; + } + } else { + gfxline_free(g->line); + /* for OCR: remove the outlines of characters that are only + ever displayed with alpha=0 */ + g->line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); + g->line->type = gfx_moveTo; + g->line->x = g->advance; + } + } + + gfxfont_fix_unicode(font, 1); + } + return out->finish(out); +} + +static void pass2_addfont(gfxfilter_t*f, gfxfont_t*font, gfxdevice_t*out) +{ + /* we throw away original fonts, and do the addfont() for the transformed + fonts in the first drawchar() */ +} + +static void pass2_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*_color, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfxcolor_t color = *_color; + + if(i->first) { + i->first = 0; + DICT_ITERATE_DATA(i->matrices, transformedfont_t*, fd) { + out->addfont(out, fd->font); + } + } + + mymatrix_t m; + gfxmatrix_t scalematrix; + matrix_convert(matrix, font->id?font->id:"unknown", &m, &scalematrix, color.a); + transformedfont_t*d = dict_lookup(i->matrices, &m); + scalematrix.tx -= d->dx*scalematrix.m00; + + /* if this character is invisible (alpha=0), then we will have removed the + outline, so we make set the alpha color channel to "fully visible" again to allow + output devices to be more performant (transparency is expensive) */ + if(!m.alpha) + color.a = 255; + + out->drawchar(out, d->font, d->used[glyphnr]-1, &color, &scalematrix); +} + +static gfxresult_t* pass2_finish(gfxfilter_t*f, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + DICT_ITERATE_DATA(i->matrices, transformedfont_t*, fd) { + if(fd->used) { + free(fd->used);fd->used=0; + } + free(fd); + } + dict_destroy(i->matrices);i->matrices=0; + return out->finish(out); +} + +void gfxtwopassfilter_remove_font_transforms_init(gfxtwopassfilter_t*f) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + + memset(f, 0, sizeof(gfxtwopassfilter_t)); + f->type = gfxfilter_twopass; + + f->pass1.name = "remove font transforms pass 1"; + f->pass1.drawchar = pass1_drawchar; + f->pass1.finish = pass1_finish; + f->pass1.internal = i; + + f->pass2.name = "remove font transforms pass 2"; + f->pass2.addfont = pass2_addfont; + f->pass2.drawchar = pass2_drawchar; + f->pass2.finish = pass2_finish; + f->pass2.internal = i; + + i->matrices = dict_new2(&mymatrix_type); + i->first = 1; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c new file mode 100644 index 000000000..8cd91ec72 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c @@ -0,0 +1,165 @@ +/* vectors_to_fonts.c + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../gfxfilter.h" +#include "../gfxtools.h" +#include "../gfxpoly.h" +#include "../gfxfont.h" +#include "../types.h" +#include "../mem.h" +#include "../q.h" + +typedef struct _vglyph { + gfxglyph_t glyph; + struct _vglyph*next; +} vglyph_t; + +typedef struct _internal { + vglyph_t*first_glyph; + vglyph_t*last_glyph; + gfxfont_t*font; + char first; + int glyph_nr; +} internal_t; + +#define FONT_SIZE 1024.0 + +static void pass1_fill(gfxfilter_t*f, gfxline_t*line, gfxcolor_t*color, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + gfxbbox_t bbox = gfxline_getbbox(line); + double height = bbox.ymax - bbox.ymin; + double width = bbox.xmax - bbox.xmin; + double size = fmax(width,height); + if(fabs(size) < 1e-3) return; + double scale = FONT_SIZE/size; + gfxmatrix_t m = {scale, 0, -bbox.xmin*scale, + 0, scale, -bbox.ymax*scale}; + line = gfxline_clone(line); + gfxline_transform(line, &m); + line = gfxline_restitch(line); + vglyph_t*v = rfx_calloc(sizeof(vglyph_t)); + v->glyph.line = line; + v->glyph.advance = width*scale; + v->glyph.unicode = 32+i->glyph_nr; + + i->last_glyph->next = v; + i->last_glyph = v; + + gfxmatrix_t m2 = {1.0/scale, 0, bbox.xmin, + 0, 1.0/scale, bbox.ymax}; + out->drawchar(out, 0, i->glyph_nr, color, &m2); + + i->glyph_nr++; +} +static void pass1_stroke(gfxfilter_t*f, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, gfxdevice_t*out) +{ + return; + internal_t*i = (internal_t*)f->internal; + gfxpoly_t*poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); + gfxline_t*line2 = gfxline_from_gfxpoly_with_direction(poly); + pass1_fill(f, line2, color, out); + gfxline_free(line2); + gfxpoly_destroy(poly); +} + +static void make_font(internal_t*i) +{ + i->font = rfx_calloc(sizeof(gfxfont_t)); + i->font->id = "SWFTools-Vector-Magic"; + i->font->num_glyphs = i->glyph_nr; + i->font->glyphs = malloc(sizeof(gfxglyph_t)*i->font->num_glyphs); + i->font->ascent = FONT_SIZE; + i->font->descent = 0; + int pos = 0; + vglyph_t*g = i->first_glyph; + while(g) { + i->font->glyphs[pos] = g->glyph; + pos++; + g = g->next; + } + gfxfont_fix_unicode(i->font, 1); +} + +static void pass2_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)f->internal; + if(i->first) { + make_font(i); + out->addfont(out, i->font); + i->first = 0; + } + if(!font) { + font = i->font; + + gfxcolor_t red = {255,254,1,1}; + int x; + gfxmatrix_t m = {1.0, 0,0, + 0, 1.0,0}; + out->drawchar(out, font, 1, &red, &m); + + /*gfxmatrix_t m2 = {1.0, 0,600, + 0, 1.0,600}; + out->drawchar(out, font, 1, &red, &m2);*/ + gfxline_t*line = gfxline_makerectangle(0, 0, 1, 1); + gfximage_t img; + img.data = color; + img.width = 1; + img.height = 1; + out->fillbitmap(out, line, &img, &m, 0); + } + out->drawchar(out, font, glyphnr, color, matrix); +} + +void gfxtwopassfilter_vectors_to_glyphs_init(gfxtwopassfilter_t*f) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + + memset(f, 0, sizeof(gfxtwopassfilter_t)); + f->type = gfxfilter_twopass; + + f->pass1.name = "vectors to glyphs pass 1"; + f->pass1.fill = pass1_fill; + f->pass1.stroke = pass1_stroke; + f->pass1.internal = i; + + f->pass2.name = "vectors to glyphs pass 2"; + f->pass2.drawchar = pass2_drawchar; + f->pass2.internal = i; + + i->first = 1; + + i->first_glyph = rfx_calloc(sizeof(vglyph_t)); + i->first_glyph->glyph.line = 0; + i->first_glyph->glyph.advance = FONT_SIZE; + i->first_glyph->glyph.unicode = 32; + i->last_glyph = rfx_calloc(sizeof(vglyph_t)); + // dummy char + i->first_glyph->next = i->last_glyph; + i->last_glyph->glyph.line = 0; + i->last_glyph->glyph.advance = FONT_SIZE/8; + i->last_glyph->glyph.unicode = 33; + i->glyph_nr = 2; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h new file mode 100644 index 000000000..fa22bc56e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h @@ -0,0 +1,139 @@ +#ifndef __gfxdevice_h__ +#define __gfxdevice_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define GFX_SUBPIXEL 2560 + +typedef double gfxcoord_t; + +typedef enum {gfx_moveTo, gfx_lineTo, gfx_splineTo} gfx_linetype; +typedef enum {gfx_joinMiter, gfx_joinRound, gfx_joinBevel} gfx_joinType; +typedef enum {gfx_capButt, gfx_capRound, gfx_capSquare} gfx_capType; + +typedef struct _gfxline +{ + gfx_linetype type; + gfxcoord_t x,y; + gfxcoord_t sx,sy; + struct _gfxline*next; /*NULL=end*/ +} gfxline_t; + +typedef struct _gfxglyph +{ + gfxline_t*line; + gfxcoord_t advance; + + int unicode; // array? + const char*name; +} gfxglyph_t; + +typedef struct _gfxfont +{ + const char*id; + int num_glyphs; + int max_unicode; + + double ascent,descent; + + gfxglyph_t*glyphs; + int* unicode2glyph; +} gfxfont_t; + +typedef struct _gfxcolor +{ + unsigned char a; + unsigned char r; + unsigned char g; + unsigned char b; +} gfxcolor_t; + +typedef struct _gfxmatrix +{ + double m00,m10,tx; + double m01,m11,ty; +} gfxmatrix_t; + +typedef struct _gfximage +{ + /* if the data contains an alpha layer (a != 255), the + r,g,b values will have to be premultiplied */ + gfxcolor_t*data; + unsigned width; + unsigned height; +} gfximage_t; + +/* gradients: A radial gradient will start at 0,0 and have a radius of 1,0 + An axial gradient starts at -1,0 and ends at 1,0 + */ +typedef enum {gfxgradient_radial, gfxgradient_linear} gfxgradienttype_t; +typedef struct _gfxgradient +{ + gfxcolor_t color; + float pos; // 0.0 - 1.0 + struct _gfxgradient*next; //NULL=end +} gfxgradient_t; + +typedef struct _gfxcxform +{ + float rr,rg,rb,ra, tr; + float gr,gg,gb,ga, tg; + float br,bg,bb,ba, tb; + float ar,ag,ab,aa, ta; +} gfxcxform_t; + +typedef struct _gfxbbox +{ + gfxcoord_t xmin, ymin, xmax, ymax; +} gfxbbox_t; + +typedef struct _gfxresult +{ + void (*write)(struct _gfxresult*gfx, int filedesc); + int (*save)(struct _gfxresult*gfx, const char*filename); + void* (*get)(struct _gfxresult*gfx, const char*name); + void (*destroy)(struct _gfxresult*gfx); + + void*internal; +} gfxresult_t; + +typedef struct _gfxdevice +{ + const char* name; // gfx device name + + int (*setparameter)(struct _gfxdevice*dev, const char*key, const char*value); + + void (*startpage)(struct _gfxdevice*dev, int width, int height); + + void (*startclip)(struct _gfxdevice*dev, gfxline_t*line); + void (*endclip)(struct _gfxdevice*dev); + void (*stroke)(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); + void (*fill)(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color); + + /* expects alpha channel in image to be non-premultiplied */ + void (*fillbitmap)(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform); //cxform? tiling? + + void (*fillgradient)(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*gradcoord2devcoord); //? + + void (*addfont)(struct _gfxdevice*dev, gfxfont_t*font); + + void (*drawchar)(struct _gfxdevice*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); + + void (*drawlink)(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text); + + void (*endpage)(struct _gfxdevice*dev); + + const char* (*geterror)(); + + gfxresult_t* (*finish)(struct _gfxdevice*dev); + + void* internal; +} gfxdevice_t; + +#ifdef __cplusplus +} +#endif + +#endif //__gfxdevice_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c new file mode 100644 index 000000000..4fba1e863 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c @@ -0,0 +1,442 @@ +/* gfxfilter.c + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "mem.h" +#include "gfxfilter.h" +#include "devices/record.h" +#include "q.h" + +typedef struct _internal { + gfxfilter_t*filter; + gfxdevice_t*out; + + /* for two pass filters: */ + gfxdevice_t*final_out; + int pass; + int num_passes; + gfxdevice_t record; + gfxtwopassfilter_t*twopass; +} internal_t; + +static int filter_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + return i->filter->setparameter(i->filter, key, value, i->out); +} +static void filter_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->startpage(i->filter, width, height, i->out); +} +static void filter_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->startclip(i->filter, line, i->out); +} +static void filter_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->endclip(i->filter, i->out); +} +static void filter_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->stroke(i->filter, line, width, color, cap_style, joint_style, miterLimit, i->out); +} +static void filter_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->fill(i->filter, line, color, i->out); +} +static void filter_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->fillbitmap(i->filter, line, img, matrix, cxform, i->out); +} +static void filter_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->fillgradient(i->filter, line, gradient, type, matrix, i->out); +} +static void filter_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->addfont(i->filter, font, i->out); +} +static void filter_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->drawchar(i->filter, font, glyphnr, color, matrix, i->out); +} +static void filter_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->drawlink(i->filter, line, action, text, i->out); +} +static void filter_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->filter->endpage(i->filter, i->out); +} +static gfxresult_t* filter_finish(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + gfxresult_t*r; + if(i->filter->finish) { + r = i->filter->finish(i->filter, i->out); + } else { + r = i->out->finish(i->out); + } + if(i->filter->internal) { + free(i->filter->internal); + i->filter->internal = 0; + } + free(i->filter);i->filter=0; + free(dev->internal);dev->internal=0;free(dev); + return r; +} + + +static int passthrough_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + internal_t*i = (internal_t*)dev->internal; + return i->out->setparameter(i->out, key, value); +} +static void passthrough_startpage(gfxdevice_t*dev, int width, int height) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->startpage(i->out, width, height); +} +static void passthrough_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->startclip(i->out, line); +} +static void passthrough_endclip(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->endclip(i->out); +} +static void passthrough_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); +} +static void passthrough_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->fill(i->out, line, color); +} +static void passthrough_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->fillbitmap(i->out, line, img, matrix, cxform); +} +static void passthrough_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->fillgradient(i->out, line, gradient, type, matrix); +} +static void passthrough_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->addfont(i->out, font); +} +static void passthrough_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->drawchar(i->out, font, glyphnr, color, matrix); +} +static void passthrough_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->drawlink(i->out, line, action, text); +} +static void passthrough_endpage(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + i->out->endpage(i->out); +} + +int discard_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + return 0; +} +static void discard_startpage(gfxdevice_t*dev, int width, int height) +{ +} +static void discard_startclip(gfxdevice_t*dev, gfxline_t*line) +{ +} +static void discard_endclip(gfxdevice_t*dev) +{ +} +static void discard_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ +} +static void discard_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ +} +static void discard_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) +{ +} +static void discard_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ +} +static void discard_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ +} +static void discard_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ +} +static void discard_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ +} +static void discard_endpage(gfxdevice_t*dev) +{ +} +static gfxresult_t* discard_finish(gfxdevice_t*dev) +{ + return 0; +} + +gfxdevice_t*gfxfilter_apply(gfxfilter_t*_filter, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + gfxdevice_t*dev = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); + gfxfilter_t*filter = (gfxfilter_t*)rfx_alloc(sizeof(gfxfilter_t)); + memcpy(filter, _filter, sizeof(gfxfilter_t)); + + i->out = out; + i->filter = filter; + i->pass = 1; + + dev->internal = i; + dev->name = filter->name?filter->name:"filter"; + dev->setparameter = filter->setparameter?filter_setparameter:passthrough_setparameter; + dev->startpage = filter->startpage?filter_startpage:passthrough_startpage; + dev->startclip = filter->startclip?filter_startclip:passthrough_startclip; + dev->endclip = filter->endclip?filter_endclip:passthrough_endclip; + dev->stroke = filter->stroke?filter_stroke:passthrough_stroke; + dev->fill = filter->fill?filter_fill:passthrough_fill; + dev->fillbitmap = filter->fillbitmap?filter_fillbitmap:passthrough_fillbitmap; + dev->fillgradient = filter->fillgradient?filter_fillgradient:passthrough_fillgradient; + dev->addfont = filter->addfont?filter_addfont:passthrough_addfont; + dev->drawchar = filter->drawchar?filter_drawchar:passthrough_drawchar; + dev->drawlink = filter->drawlink?filter_drawlink:passthrough_drawlink; + dev->endpage = filter->endpage?filter_endpage:passthrough_endpage; + dev->finish = filter_finish; + return dev; +} + +static void setup_twopass(gfxdevice_t*dev, gfxfilter_t*filter) +{ + dev->name = filter->name?filter->name:"filter"; + dev->setparameter = filter->setparameter?filter_setparameter:passthrough_setparameter; + dev->startpage = filter->startpage?filter_startpage:passthrough_startpage; + dev->startclip = filter->startclip?filter_startclip:passthrough_startclip; + dev->endclip = filter->endclip?filter_endclip:passthrough_endclip; + dev->stroke = filter->stroke?filter_stroke:passthrough_stroke; + dev->fill = filter->fill?filter_fill:passthrough_fill; + dev->fillbitmap = filter->fillbitmap?filter_fillbitmap:passthrough_fillbitmap; + dev->fillgradient = filter->fillgradient?filter_fillgradient:passthrough_fillgradient; + dev->addfont = filter->addfont?filter_addfont:passthrough_addfont; + dev->drawchar = filter->drawchar?filter_drawchar:passthrough_drawchar; + dev->drawlink = filter->drawlink?filter_drawlink:passthrough_drawlink; + dev->endpage = filter->endpage?filter_endpage:passthrough_endpage; +} + +static gfxresult_t* twopass_finish(gfxdevice_t*dev) +{ + internal_t*i = (internal_t*)dev->internal; + + gfxresult_t*r; + if(i->filter->finish) { + r = i->filter->finish(i->filter, i->out); + } else { + r = i->out->finish(i->out); + } + + if(i->pass == i->num_passes) { + free(i->twopass); + i->twopass = 0; + i->filter = 0; + free(i); + dev->internal=0; + free(dev); + return r; + } + + /* switch to next pass filter */ + i->filter = &i->twopass->pass2; + setup_twopass(dev, i->filter); + dev->finish = twopass_finish; + + if(i->pass == i->num_passes-1) { + /* we don't record in the final pass- we just stream out to the + next output device */ + i->out = i->final_out; + } else { + // switch to a new tempfile- this only happens for 3 passes or more + assert(i->num_passes>2); + gfxdevice_record_init(&i->record, /*use tempfile*/1); + i->out = &i->record; + } + + i->pass++; + gfxresult_record_replay(r, dev, 0); + r->destroy(r); + + return twopass_finish(dev); +} + +gfxdevice_t*gfxtwopassfilter_apply(gfxtwopassfilter_t*_twopass, gfxdevice_t*out) +{ + internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); + gfxdevice_t*dev = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); + + gfxtwopassfilter_t*twopass = (gfxtwopassfilter_t*)rfx_alloc(sizeof(gfxtwopassfilter_t)); + memcpy(twopass, _twopass, sizeof(gfxtwopassfilter_t)); + + gfxdevice_record_init(&i->record, /*use tempfile*/1); + + i->out = &i->record; + i->final_out = out; + i->twopass = twopass; + i->pass = 1; + i->num_passes = 2; + + dev->internal = i; + + i->filter = &twopass->pass1; + setup_twopass(dev, i->filter); + dev->finish = twopass_finish; + + return dev; +} + +gfxfilterchain_t* gfxfilterchain_parse(const char*_filterexpr) +{ + char*filterexpr = strdup(_filterexpr); + char*f = filterexpr; + char*end = filterexpr+strlen(filterexpr); + dict_t* params = dict_new2(&charptr_type); + char*cmd = 0; + + gfxfilterchain_t*chain = 0; + gfxfilterchain_t*next = 0; + + if(!*f) + return 0; + + while(1) { + char* eq = strchr(f, '='); + char* colon = strchr(f, ':'); + char lastitem = 0; + if(!colon) { + colon = end; + lastitem = 1; + } + *colon = 0; + char*newcmd = 0; + char param = 0; + + /* fixme: change this from a dict_t to gfxparams_t? */ + if(eq && eq < colon) { // parameter + *eq = 0; + if(!cmd) { + fprintf(stderr, "Error: need a filter before specifying parameters (%s=%s)\n", f, eq+1); + return 0; + } + dict_put(params, f, strdup(eq+1)); + param = 1; + } else { + newcmd = f; + } + if(!param || lastitem) { + if(!cmd && lastitem) + cmd = newcmd; + assert(cmd); + gfxfilterbase_t*f = 0; + if(!strcmp(cmd, "maketransparent")) { + char*alphastr = dict_lookup(params, "alpha"); + int alpha = 255; + if(alphastr) alpha=atoi(alphastr); + f = malloc(sizeof(gfxfilter_t)); + gfxfilter_maketransparent_init((gfxfilter_t*)f, alpha); + } else if(!strcmp(cmd, "remove_font_transforms")) { + f = malloc(sizeof(gfxtwopassfilter_t)); + gfxtwopassfilter_remove_font_transforms_init((gfxtwopassfilter_t*)f); + } else if(!strcmp(cmd, "vectors_to_glyphs")) { + f = malloc(sizeof(gfxtwopassfilter_t)); + gfxtwopassfilter_vectors_to_glyphs_init((gfxtwopassfilter_t*)f); + } else if(!strcmp(cmd, "one_big_font")) { + f = malloc(sizeof(gfxtwopassfilter_t)); + gfxtwopassfilter_one_big_font_init((gfxtwopassfilter_t*)f); + } else { + fprintf(stderr, "Unknown filter: %s\n", cmd); + return 0; + } + dict_clear(params); + gfxfilterchain_t*n = rfx_calloc(sizeof(gfxfilterchain_t)); + if(!chain) { + chain = next = n; + } else { + next->next = n; + next = n; + } + n->filter = f; + + cmd = newcmd; + if(lastitem) break; + } + f = colon+1; + } + dict_destroy(params); + return chain; +} + +gfxdevice_t* gfxfilterchain_apply(gfxfilterchain_t*chain, gfxdevice_t*dev) +{ + while(chain) { + if(chain->filter->type == gfxfilter_onepass) { + dev = gfxfilter_apply((gfxfilter_t*)chain->filter, dev); + } else if(chain->filter->type == gfxfilter_twopass) { + dev = gfxtwopassfilter_apply((gfxtwopassfilter_t*)chain->filter, dev); + } else { + fprintf(stderr, "Internal error in gfxfilterchain_apply- unknown filter type %d\n", chain->filter->type); + } + chain = chain->next; + } + return dev; +} + +void gfxfilterchain_destroy(gfxfilterchain_t*chain) +{ + while(chain) { + gfxfilterchain_t*next = chain->next; + free(chain); + chain = next; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h new file mode 100644 index 000000000..9111930da --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h @@ -0,0 +1,107 @@ +/* gfxfilter.h + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxfilter_h__ +#define __gfxfilter_h__ + +#include "gfxdevice.h" +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum {gfxfilter_none, gfxfilter_onepass, gfxfilter_twopass} gfxfiltertype_t; + +typedef struct _gfxfilterbase +{ + gfxfiltertype_t type; +} gfxfilterbase_t; + +typedef struct _gfxfilter +{ + gfxfiltertype_t type; + int num_passes; + const char*name; + + int pass; + + int (*setparameter)(struct _gfxfilter*in, const char*key, const char*value, struct _gfxdevice*out); + void (*startpage)(struct _gfxfilter*in, int width, int height, struct _gfxdevice*out); + void (*startclip)(struct _gfxfilter*in, gfxline_t*line, struct _gfxdevice*out); + void (*endclip)(struct _gfxfilter*in, struct _gfxdevice*out); + void (*stroke)(struct _gfxfilter*in, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, struct _gfxdevice*out); + void (*fill)(struct _gfxfilter*in, gfxline_t*line, gfxcolor_t*color, struct _gfxdevice*out); + void (*fillbitmap)(struct _gfxfilter*in, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform, struct _gfxdevice*out); //cxform? tiling? + void (*fillgradient)(struct _gfxfilter*in, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*gradcoord2devcoord, struct _gfxdevice*out); //? + void (*addfont)(struct _gfxfilter*in, gfxfont_t*font, struct _gfxdevice*out); + void (*drawchar)(struct _gfxfilter*in, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix, struct _gfxdevice*out); + void (*drawlink)(struct _gfxfilter*in, gfxline_t*line, const char*action, const char*text, struct _gfxdevice*out); + void (*endpage)(struct _gfxfilter*in, struct _gfxdevice*out); + gfxresult_t* (*finish)(struct _gfxfilter*in, struct _gfxdevice*out); + + void (*dealloc)(struct _gfxfilter*f); + + void* internal; +} gfxfilter_t; + +typedef struct _gfxtwopassfilter +{ + gfxfiltertype_t type; + gfxfilter_t pass1; + gfxfilter_t pass2; +} gfxtwopassfilter_t; + +gfxdevice_t*gfxfilter_apply(gfxfilter_t*filter, gfxdevice_t*dev); +gfxdevice_t*gfxtwopassfilter_apply(gfxtwopassfilter_t*filter, gfxdevice_t*dev); + +typedef struct _gfxfilterchain { + gfxfilterbase_t*filter; + struct _gfxfilterchain*next; +} gfxfilterchain_t; + +gfxfilterchain_t* gfxfilterchain_parse(const char*filterexpr); +gfxdevice_t* gfxfilterchain_apply(gfxfilterchain_t*chain, gfxdevice_t*dev); +void gfxfilterchain_destroy(gfxfilterchain_t*chain); + +#define wrap_filter(dev, name, args...) \ + {gfxfilter_t f_##name; \ + gfxfilter_##name##_init(&f_##name, ## args); \ + dev = gfxfilter_apply(&f_##name, dev); \ + } + +#define wrap_filter2(dev, name, args...) \ + {gfxtwopassfilter_t f_##name; \ + gfxtwopassfilter_##name##_init(&f_##name, ## args); \ + dev = gfxtwopassfilter_apply(&f_##name, dev); \ + } + +/* known filters */ +void gfxfilter_maketransparent_init(gfxfilter_t*f, U8 alpha); +void gfxtwopassfilter_remove_font_transforms_init(gfxtwopassfilter_t*f); +void gfxtwopassfilter_one_big_font_init(gfxtwopassfilter_t*f); +void gfxtwopassfilter_vectors_to_glyphs_init(gfxtwopassfilter_t*f); + + +#ifdef __cplusplus +} +#endif + +#endif //__gfxfilter_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c new file mode 100644 index 000000000..078b850a4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c @@ -0,0 +1,770 @@ +/* swffont.c + + Functions for loading external fonts. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2003, 2004, 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../config.h" +#include "gfxdevice.h" +#include "gfxtools.h" +#include "gfxfont.h" +#include "ttf.h" +#include "mem.h" +#include "log.h" + +static int loadfont_scale = 64; +static int full_unicode = 1; + +static void glyph_clear(gfxglyph_t*g) +{ + gfxline_t*line; + if(g->name) { + free((void*)g->name); g->name = 0; + } + gfxline_free(g->line);g->line = 0; +} + +#ifdef HAVE_FREETYPE + +#ifdef HAVE_FT2BUILD_H +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SIZES_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H +#else +#include +#include +#include +#include +#include +#include +#endif + +/* Setting subpixels to 64 also means that the "point size" of the + font outlines will be 64. So the font, when rendered at original + size (i.e., the swf fontsize is 1024) will have the same size as + if it was rendered at 64pt */ + +#define FT_SCALE 1 +#define FT_SUBPIXELS 64 + +typedef struct _gfxdrawinfo_t { + gfxdrawer_t* draw; + double quality; +} gfxdrawinfo_t; + +static int ft_move_to(const FT_Vector* _to, void* user) +{ + gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; + gfxdrawer_t* draw = info->draw; + double x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + double y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + draw->moveTo(draw, x,y); + return 0; +} +static int ft_line_to(const FT_Vector* _to, void* user) +{ + gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; + gfxdrawer_t* draw = info->draw; + double x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + double y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + draw->lineTo(draw, x,y); + return 0; +} +static int ft_cubic_to(const FT_Vector* _c1, const FT_Vector* _c2, const FT_Vector* _to, void* user) +{ + gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; + gfxdrawer_t* draw = info->draw; + double tox = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + double toy = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + double c1x = _c1->x*FT_SCALE/(float)FT_SUBPIXELS; + double c1y = -_c1->y*FT_SCALE/(float)FT_SUBPIXELS; + double c2x = _c2->x*FT_SCALE/(float)FT_SUBPIXELS; + double c2y = -_c2->y*FT_SCALE/(float)FT_SUBPIXELS; + gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, info->quality); + return 0; +} +static int ft_conic_to(const FT_Vector* _c, const FT_Vector* _to, void* user) +{ + gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; + gfxdrawer_t* draw = info->draw; + double tox = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + double toy = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + double cx = _c->x*FT_SCALE/(float)FT_SUBPIXELS; + double cy = -_c->y*FT_SCALE/(float)FT_SUBPIXELS; + gfxdraw_conicTo(draw, cx,cy, tox,toy, info->quality); + return 0; +} +static FT_Outline_Funcs outline_functions = +{ + ft_move_to, + ft_line_to, + ft_conic_to, + ft_cubic_to, + 0,0 +}; + +static FT_Library ftlibrary = 0; + +static gfxglyph_t cloneGlyph(gfxglyph_t*src) +{ + gfxglyph_t dest; + memset(&dest, 0, sizeof(dest)); + if(src->name) + dest.name = strdup(src->name); + dest.advance = src->advance; + dest.unicode = src->unicode; + dest.line = gfxline_clone(src->line); + return dest; +} + +static int errorno = 0; + +//#define DEBUG 1 + +gfxfont_t* gfxfont_load(const char*id, const char*filename, unsigned int flags, double quality) +{ + FT_Face face; + FT_Error error; + const char* fontname = 0; + FT_ULong charcode; + FT_UInt gindex; + gfxfont_t* font; + int t; + int*glyph2glyph = 0; + int*glyph2unicode = 0; + int max_unicode = 0; + int charmap = -1; + int isunicode = 1; + int has_had_errors = 0; + int num_names = 0; + + if(ftlibrary == 0) { + if(FT_Init_FreeType(&ftlibrary)) { + fprintf(stderr, "Couldn't init freetype library!\n"); + exit(1); + } + } + error = FT_New_Face(ftlibrary, filename, 0, &face); + FT_Set_Pixel_Sizes (face, 16*loadfont_scale, 16*loadfont_scale); +#ifdef DEBUG + printf("gfxfont_load(%s, %s, %f)\n", id, filename, quality); +#endif + + if(error) { + fprintf(stderr, "Couldn't load file %s- not a TTF file? (error=%02x)\n", filename, error); + return 0; + } + if(face->num_glyphs <= 0) { + fprintf(stderr, "File %s contains %d glyphs\n", filename, (int)face->num_glyphs); + return 0; + } + + font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); + //font->style = ((face->style_flags&FT_STYLE_FLAG_ITALIC)?FONT_STYLE_ITALIC:0) |((face->style_flags&FT_STYLE_FLAG_BOLD)?FONT_STYLE_BOLD:0); + //font->ascent = abs(face->ascender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMin; + //font->descent = abs(face->descender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMax; + //font->leading = font->layout->ascent + font->layout->descent; + //font->encoding = FONT_ENCODING_UNICODE; + font->max_unicode = 0; + font->id = strdup(id); + + font->glyphs = (gfxglyph_t*)rfx_calloc(face->num_glyphs*sizeof(gfxglyph_t)); + glyph2unicode = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); + glyph2glyph = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); + + if(FT_HAS_GLYPH_NAMES(face)) { + //font->glyphnames = rfx_calloc(face->num_glyphs*sizeof(char*)); + } + + fontname = FT_Get_Postscript_Name(face); + +#ifdef DEBUG + for(t=0;tnum_charmaps;t++) { + printf("possible encoding: %c%c%c%c (%d of %d)\n", + (face->charmaps[t]->encoding >> 24)&255, + (face->charmaps[t]->encoding >> 16)&255, + (face->charmaps[t]->encoding >> 8)&255, + (face->charmaps[t]->encoding >> 0)&255, + t+1, face->num_charmaps + ); + } +#endif + + while(1) + { + charcode = FT_Get_First_Char(face, &gindex); + + while(gindex != 0) + { + if(gindex >= 0 && gindexnum_glyphs) { + if(!glyph2unicode[gindex]) { + glyph2unicode[gindex] = charcode; + if(charcode + 1 > font->max_unicode) { + font->max_unicode = charcode + 1; + } + } + } + charcode = FT_Get_Next_Char(face, charcode, &gindex); + } + +#ifdef DEBUG + if(face->charmap) { + printf("ENCODING: %c%c%c%c (%d of %d) max_unicode=%d\n", + (face->charmap->encoding >> 24)&255, + (face->charmap->encoding >> 16)&255, + (face->charmap->encoding >> 8)&255, + (face->charmap->encoding >> 0)&255, + charmap, face->num_charmaps, font->max_unicode + ); + } else { + printf("ENCODING: NONE (%d of %d) max_unicode=%d\n", + charmap, face->num_charmaps, font->max_unicode + ); + } +#endif + + /* if we didn't find a single encoding character, try + the font's charmaps instead. That usually means that + the encoding is no longer unicode. + TODO: find a way to convert the encoding to unicode + */ + if(font->max_unicode == 0 && charmap < face->num_charmaps-1 + && face->charmaps[charmap+1]->encoding != 0x41444243 /* adbc, custom */ + && face->charmaps[charmap+1]->encoding != 0x61726d6e /* armn */ + ) + { + charmap++; + FT_Set_Charmap(face, face->charmaps[charmap]); + isunicode = 0; + } else + break; + } + /* TODO: if isunicode is 1, we now need to permutate the character + order so that each character is at it's encoding position */ + + if(full_unicode) + font->max_unicode = 65535; + + font->unicode2glyph = (int*)rfx_calloc(font->max_unicode*sizeof(int)); + + for(t=0;tmax_unicode;t++) { + int g = FT_Get_Char_Index(face, t); + if(!g || g>=face->num_glyphs) + g = -1; + font->unicode2glyph[t] = g; + if(g>=0) { +#ifdef DEBUG + printf("u%d ->%d\n", t, g); +#endif + max_unicode = t+1; + if(!glyph2unicode[g]) { + glyph2unicode[g] = t; + } + } + } + font->max_unicode = max_unicode; + + font->num_glyphs = 0; + + + for(t=0; t < face->num_glyphs; t++) { + if(FT_HAS_GLYPH_NAMES(face)) { + char name[128]; + error = FT_Get_Glyph_Name(face, t, name, 127); + if(!error && name[0] && !strstr(name, "notdef")) { + num_names++; + } + } + } + + + for(t=0; t < face->num_glyphs; t++) { + FT_Glyph glyph; + char name[128]; + gfxdrawer_t draw; + gfxdrawinfo_t info; + char hasname = 0; + int omit = 0; + name[0]=0; + + font->glyphs[font->num_glyphs].advance = 0; + font->glyphs[font->num_glyphs].line = 0; + font->glyphs[font->num_glyphs].unicode = glyph2unicode[t]; + font->glyphs[font->num_glyphs].name = 0; + + if(FT_HAS_GLYPH_NAMES(face) && (num_names >= face->num_glyphs/10 || num_names > 2)) { + name[0] = 0; + error = FT_Get_Glyph_Name(face, t, name, 127); + if(!error && name[0] && !strstr(name, "notdef")) { + font->glyphs[font->num_glyphs].name = strdup(name); + hasname = 1; + } + } + +#if 0 // some cantonese pdfs fail to work if this is activated + + if(has_had_errors && (isunicode && !glyph2unicode[t]) && !hasname && t>=256) { + /* some freetype versions crash or corrupt memory if we try to load + characters (without unicode index or name) above 256 for some fonts. + So skip those characters once the first error occured */ + omit = 1; + } +#endif + + if(!omit) { + error = FT_Load_Glyph(face, t, FT_LOAD_NO_BITMAP); + if(error) { + if(hasname) + fprintf(stderr, "Warning: glyph %d/%d (unicode %d, name %s) has return code %d\n", t, (int)face->num_glyphs, glyph2unicode[t], name, error); + else + fprintf(stderr, "Warning: glyph %d/%d (unicode %d) has return code %d\n", t, (int)face->num_glyphs, glyph2unicode[t], error); + omit = 2; + +#if 0 + if(!has_had_errors) { + char buf[256]; + if(fontname && *fontname) { + fprintf(stderr, "font has been copied to %s.ttf\n", fontname); + sprintf(buf, "cp %s %s.ttf", filename, fontname); + } else { + fprintf(stderr, "font has been copied to badfont%d.ttf\n", errorno); + sprintf(buf, "cp %s badfont%d.ttf", filename, errorno); + errorno++; + } + system(buf); + } +#endif + has_had_errors = 1; + } + } + if(!omit) { + error = FT_Get_Glyph(face->glyph, &glyph); + if(error) { + fprintf(stderr, "Couldn't get glyph %d/%d, error:%d\n", t, (int)face->num_glyphs, error); + omit = 3; + } + } + + if(!omit) { + gfxline_t*l; + int ok=0; + gfxdrawer_target_gfxline(&draw); + info.draw = &draw; + info.quality = quality; + + //error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &info); + error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &info); + + if(error) { + fprintf(stderr, "Couldn't decompose glyph %d\n", t); + gfxline_free((gfxline_t*)draw.result(&draw)); + FT_Done_Glyph(glyph); + omit = 4; + } else { + font->glyphs[font->num_glyphs].advance = glyph->advance.x/65536; + font->glyphs[font->num_glyphs].line = (gfxline_t*)draw.result(&draw); + } + l = font->glyphs[font->num_glyphs].line; + while(l) { + if(l->type != gfx_moveTo) { + ok = 1; + } + l = l->next; + } + if(!ok && !hasname) { + gfxline_free(font->glyphs[font->num_glyphs].line); + font->glyphs[font->num_glyphs].line = 0; + font->glyphs[font->num_glyphs].advance = 0; + + /* Some PDFs created e.g. by InDesign tend to create + fonts with reduced (empty) characters, which still + have unicode indices attached to them. + Remove that information, in order to not confuse + any converter applications. + */ + font->glyphs[font->num_glyphs].unicode = 0; + if(font->glyphs[font->num_glyphs].name) { + free((void*)font->glyphs[font->num_glyphs].name); + font->glyphs[font->num_glyphs].name = 0; + } + FT_Done_Glyph(glyph); + omit = 5; + } + } + + if(!omit) { + FT_Done_Glyph(glyph); + font->glyphs[font->num_glyphs].unicode = glyph2unicode[t]; + } + + glyph2glyph[t] = font->num_glyphs; + font->num_glyphs++; + } + + /* notice: if skip_unused is true, font->glyph2unicode, font->glyphnames and font->layout->bounds will + have more memory allocated than just font->num_glyphs, but only the first font->numchars + are used/valid */ + + for(t=0;tmax_unicode;t++) { + if(font->unicode2glyph[t]>=0) { + font->unicode2glyph[t] = glyph2glyph[font->unicode2glyph[t]]; + } + } + rfx_free(glyph2glyph); + rfx_free(glyph2unicode); + + FT_Done_Face(face); + FT_Done_FreeType(ftlibrary);ftlibrary=0; + + if(!isunicode && font->num_glyphs>0 && font->max_unicode) { + /* if the encoding isn't unicode, remap the font + so that the encoding equals the char position, and + remove the unicode table */ + int t; + gfxglyph_t*newglyphs = (gfxglyph_t*)rfx_calloc(font->max_unicode*sizeof(gfxglyph_t)); + + for(t=0;tunicode2glyph[t]; + if(c>=font->num_glyphs || c<0) + c = 0; + newglyphs[t] = cloneGlyph(&font->glyphs[c]); + newglyphs[t].unicode = -1; + } + for(t=0;tnum_glyphs;t++) { + glyph_clear(&font->glyphs[t]); + } + free(font->glyphs); + font->glyphs = newglyphs; + font->num_glyphs = font->max_unicode; + + free(font->unicode2glyph);font->unicode2glyph = 0; + font->max_unicode = 0; + } + + if(font->unicode2glyph) { + int t; + int bad = 0; + /* check whether the Unicode indices look o.k. + If they don't, disable the unicode lookup by setting + the unicode map to -1 everywhere */ + for(t=0;tnum_glyphs;t++) { + int c = font->glyphs[t].unicode; + gfxline_t* line = font->glyphs[t].line; + if(c && c < 32 && (line && line->next && line->next->next)) { + // the character maps into the unicode control character range + // between 0001-001f. Yet it is not empty. Treat the one + // mapping as broken, and look how many of those we find. + bad ++; + } + } + if(bad>5) { + free(font->unicode2glyph);font->unicode2glyph = 0; + font->max_unicode = 0; + for(t=0;tnum_glyphs;t++) { + font->glyphs[t].unicode = -1; + } + } + } + + return font; +} +#else + +gfxfont_t* gfxfont_load(const char*id, const char*filename, unsigned int flags, double quality) +{ + fprintf(stderr, "No freetype support compiled in! Not able to load %s\n", filename); + return 0; +} + +#endif + +void gfxfont_free(gfxfont_t*font) +{ + int t; + for(t=0;tnum_glyphs;t++) { + glyph_clear(&font->glyphs[t]); + } + if(font->glyphs) { + free(font->glyphs);font->glyphs = 0; + } + font->num_glyphs = 0; + if(font->unicode2glyph) { + free(font->unicode2glyph);font->unicode2glyph = 0; + } + if(font->id) { + free((void*)font->id);font->id=0; + } + + free(font); +} + +static inline int invalid_unicode(int u) +{ + return (u<32 || (u>=0xd800 && u<0xf900)); +} +void gfxfont_fix_unicode(gfxfont_t*font, char remove_duplicates) +{ + int t; + + /* find the current maximum unicode2glyph */ + int max = 0; + for(t=0;tnum_glyphs;t++) { + int u = font->glyphs[t].unicode; + if(u > max) + max = u; + } + char*used = rfx_calloc(max+1); + + /* now, remap all duplicates (and invalid characters) and + calculate the new maximum */ + int remap_pos=0; + max = 0; + for(t=0;tnum_glyphs;t++) { + int u = font->glyphs[t].unicode; + if(u>=0) { + if(remove_duplicates && used[u]) { + u = font->glyphs[t].unicode = 0xe000 + remap_pos++; + } if(invalid_unicode(u)) { + u = font->glyphs[t].unicode = 0xe000 + remap_pos++; + } else { + used[u] = 1; + } + } + if(u > max) + max = u; + } + free(used); + if(font->unicode2glyph) { + free(font->unicode2glyph); + } + font->unicode2glyph = 0; + font->max_unicode = 0; +} + +void gfxfont_add_unicode2glyph(gfxfont_t*font) +{ + int t; + int max = 0; + for(t=0;tnum_glyphs;t++) { + int u = font->glyphs[t].unicode; + if(u > max) + max = u; + } + if(!font->unicode2glyph) { + /* (re)generate unicode2glyph-to-glyph mapping table by reverse mapping + the glyph unicode2glyph's indexes into the mapping table. For collisions, + we prefer the smaller unicode2glyph value.*/ + font->max_unicode = max+1; + font->unicode2glyph = malloc(sizeof(font->unicode2glyph[0])*(font->max_unicode)); + memset(font->unicode2glyph, -1, sizeof(font->unicode2glyph[0])*(font->max_unicode)); + + for(t=0;tnum_glyphs;t++) { + int u = font->glyphs[t].unicode; + if(u>=0 && font->unicode2glyph[u]<0) { + assert(umax_unicode); + font->unicode2glyph[u] = t; + } + } + } else { + /* add the new glyph indexes (most probably, that's only the remapped values + at 0xe000) to the unicode2glyph table. Notice: Unlike glyph2unicode, we don't + care about collisions in the unicode2glyph table */ + int new_max_unicode = max+1; + if(font->max_unicode < new_max_unicode) { + font->unicode2glyph = rfx_realloc(font->unicode2glyph, sizeof(font->unicode2glyph[0])*(font->max_unicode)); + memset(font->unicode2glyph+font->max_unicode, -1, sizeof(font->unicode2glyph[0])*(new_max_unicode - font->max_unicode)); + } + for(t=0;tnum_glyphs;t++) { + int u = font->glyphs[t].unicode; + if(u>=0 && font->unicode2glyph[u]<0) { + font->unicode2glyph[u] = t; + } + } + font->max_unicode = new_max_unicode; + } +} + +ttf_t* gfxfont_to_ttf(gfxfont_t*font, char eot) +{ + ttf_t*ttf = ttf_new(); + int num_glyphs = font->num_glyphs; + int offset = 0; + int t; + char has_nondef_glyph = + font->num_glyphs && font->glyphs[0].unicode==-1 && + (!font->glyphs[0].line || !font->glyphs[0].line->next); + + if(!has_nondef_glyph) { + /* insert a new .nondef glyph at the start of the font */ + offset++; + num_glyphs++; + } + ttf->num_glyphs = num_glyphs; + ttf->glyphs = rfx_calloc(num_glyphs*sizeof(ttfglyph_t)); + double scale = 1.0; + int max_unicode = font->max_unicode; + int remap_pos=0; + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*src = &font->glyphs[t]; + ttfglyph_t*dest = &ttf->glyphs[t+offset]; + gfxline_t*line = src->line; + int count = 0; + while(line) { + count++; + if(line->type == gfx_splineTo) + count++; + line=line->next; + } + dest->num_points = count; + dest->points = rfx_calloc(count*sizeof(ttfpoint_t)); + count = 0; + line = src->line; + while(line) { + if(line->type == gfx_splineTo) { + dest->points[count].x = line->sx*scale; + dest->points[count].y = line->sy*scale; + count++; + } + dest->points[count].x = line->x*scale; + dest->points[count].y = line->y*scale; + dest->points[count].flags |= GLYPH_ON_CURVE; + if(line->type == gfx_moveTo) { + dest->points[count].flags |= GLYPH_CONTOUR_START; + if(count) + dest->points[count-1].flags |= GLYPH_CONTOUR_END; + } + count++; + line=line->next; + } + if(count) + dest->points[count-1].flags |= GLYPH_CONTOUR_END; + + /* compute bounding box */ + int s; + if(count) { + dest->xmin = dest->xmax = dest->points[0].x; + dest->ymin = dest->ymax = dest->points[0].y; + for(s=1;spoints[s].x < dest->xmin) + dest->xmin = dest->points[s].x; + if(dest->points[s].y < dest->ymin) + dest->ymin = dest->points[s].y; + if(dest->points[s].x > dest->xmax) + dest->xmax = dest->points[s].x; + if(dest->points[s].y > dest->ymax) + dest->ymax = dest->points[s].y; + } + } + + if(eot) { + dest->bearing = dest->xmin; + /* for windows font rendering, make sure coordinates are always + to the right of the origin (and use bearing to shift them "back".) + Don't do this for non-windows platforms though because e.g. OS X + ignores bearing. */ + int xshift=0; + if(dest->xmin < 0) { + xshift = -dest->xmin; + for(s=0;spoints[s].x += xshift; + } + dest->xmin += xshift; + dest->xmax += xshift; + } + } + dest->advance = src->advance*scale; + + //dest->xmin=0; //TODO: might be necessary for some font engines? + + dest->advance = src->advance*scale; + + int u = font->glyphs[t].unicode; + if(u > max_unicode) + max_unicode = u; + } + ttf->unicode_size = max_unicode+1; + ttf->unicode = rfx_calloc(sizeof(unicode_t)*ttf->unicode_size); + + if(!font->unicode2glyph) { + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*src = &font->glyphs[t]; + int u = font->glyphs[t].unicode; + if(u<=0) + continue; + if(u<32) { + msg(" gfxfont_to_ttf: glyph %d has an invalid unicode (%d)", t, u); + continue; + } else if(ttf->unicode[u]) { + msg(" gfxfont_to_ttf: glyph %d has a duplicate unicode (%d)", t, u); + continue; + } + if(uunicode_size) + ttf->unicode[u] = t+offset; + } + } else { + int u; + for(u=1;umax_unicode;u++) { + int g = font->unicode2glyph[u]; + if(g>=0 && u<32) { + msg(" gfxfont_to_ttf: Font contains an invalid unicode (%d)", u); + continue; + } + if(g>=0 && gnum_glyphs && !ttf->unicode[u]) { + ttf->unicode[u] = g+offset; + } + } + } + + ttf->ascent = font->ascent; + ttf->descent = -font->descent; + ttf->lineGap = 0; + + ttf->full_name = strdup(font->id); + ttf->family_name = strdup(font->id); + ttf->subfamily_name = strdup(font->id); + ttf->postscript_name = strdup(font->id); + ttf->version_string = strdup("Version 1.0"); + ttf->font_uid = strdup(font->id); + + ttf_create_truetype_tables(ttf); + return ttf; +} + +void gfxfont_save(gfxfont_t*font, const char*filename) +{ + ttf_t*ttf = gfxfont_to_ttf(font, 0); + ttf_save(ttf, filename); + ttf_destroy(ttf); +} + +void gfxfont_save_eot(gfxfont_t*font, const char*filename) +{ + ttf_t*ttf = gfxfont_to_ttf(font, 1); + ttf_save_eot(ttf, filename); + ttf_destroy(ttf); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h new file mode 100644 index 000000000..9ff7e3390 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h @@ -0,0 +1,46 @@ +/* swffont.h + + Functions for loading external fonts. Header file + of swffont.c + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxfont_h__ +#define __gfxfont_h__ + +#include "gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* The quality parameter is given by 1 divided by the zoom factor at which the font + still looks good. 1=normal, 0.5=double resolution etc. */ +gfxfont_t* gfxfont_load(const char*id, const char*filename, unsigned int flags, double quality); +void gfxfont_save(gfxfont_t*font, const char*filename); +void gfxfont_save_eot(gfxfont_t*font, const char*filename); +void gfxfont_fix_unicode(gfxfont_t*font, char remove_duplicates); +void gfxfont_free(gfxfont_t*font); +void gfxfont_add_unicode2glyph(gfxfont_t*font); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxfont_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfximage.c b/fluidbook/tools/swftools-special-swfdump/lib/gfximage.c new file mode 100644 index 000000000..cbe417baa --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfximage.c @@ -0,0 +1,502 @@ +#include +#include +#include +#include +#include +#include "../config.h" +#include "jpeg.h" +#include "png.h" +#include "mem.h" +#include "gfximage.h" +#include "types.h" +#ifdef HAVE_FFTW3 +#include +#endif + +#define MOD(x,d) (((x)+(d))%(d)) + +gfximage_t*gfximage_new(int width, int height) +{ + gfximage_t*i = rfx_calloc(sizeof(gfximage_t)); + i->data = rfx_calloc(width*height*4); + i->width = width; + i->height = height; + return i; +} + +void gfximage_save_jpeg(gfximage_t*img, const char*filename, int quality) +{ + int x,y; + int l = img->width*img->height; + unsigned char*data = (unsigned char*)rfx_alloc(img->width*img->height*3); + int s,t; + for(t=0,s=0;tdata[t].r; + data[s+1] = img->data[t].g; + data[s+2] = img->data[t].b; + } + jpeg_save(data, img->width, img->height, quality, filename); + free(data); +} + +void gfximage_save_png(gfximage_t*image, const char*filename) +{ + png_write(filename, (void*)image->data, image->width, image->height); +} + +void gfximage_save_png_quick(gfximage_t*image, const char*filename) +{ + png_write_quick(filename, (void*)image->data, image->width, image->height); +} + +typedef struct scale_lookup { + int pos; + unsigned int weight; +} scale_lookup_t; + +typedef struct rgba_int { + unsigned int r,g,b,a; +} rgba_int_t; + +static int bicubic = 0; + +static scale_lookup_t**make_scale_lookup(int width, int newwidth) +{ + scale_lookup_t*lookupx = (scale_lookup_t*)rfx_alloc((width>newwidth?width:newwidth)*2*sizeof(scale_lookup_t)); + scale_lookup_t**lblockx = (scale_lookup_t**)rfx_alloc((newwidth+1)*sizeof(scale_lookup_t**)); + double fx = ((double)width)/((double)newwidth); + double px = 0; + int x; + scale_lookup_t*p_x = lookupx; + + if(newwidth<=width) { + for(x=0;x=width) tox = width-1; + for(xx=fromx;xx<=tox;xx++) { + if(xx==fromx && xx==tox) p_x->weight = 256; + else if(xx==fromx) p_x->weight = xweight; + else if(xx==tox) p_x->weight = 256-w; + else p_x->weight = i; + w+=p_x->weight; + p_x->pos = xx; + p_x++; + } + px = ex; + } + } else { + for(x=0;x=width) ix2=width-1; + lblockx[x] = p_x; + if(bicubic) + r = -2*r*r*r+3*r*r; + p_x[0].weight = (int)(256*(1-r)); + p_x[0].pos = ix1; + p_x[1].weight = 256-p_x[0].weight; + p_x[1].pos = ix2; + p_x+=2; + px += fx; + } + } + lblockx[newwidth] = p_x; + return lblockx; +} + +static void encodeMonochromeImage(gfxcolor_t*data, int width, int height, gfxcolor_t*colors) +{ + int t; + int len = width*height; + + U32* img = (U32*)data; + U32 color1 = img[0]; + U32 color2 = 0; + for(t=1;t> 8; + data[t].g = (colors[0].g * (255-m) + colors[1].g * m) >> 8; + data[t].b = (colors[0].b * (255-m) + colors[1].b * m) >> 8; + data[t].a = (colors[0].a * (255-m) + colors[1].a * m) >> 8; + } +} + +void blurImage(gfxcolor_t*src, int width, int height, int r) __attribute__ ((noinline)); + +void blurImage(gfxcolor_t*src, int width, int height, int r) +{ + int e = 2; // r times e is the sampling interval + double*gauss = (double*)rfx_alloc(r*e*sizeof(double)); + double sum=0; + int x; + for(x=0;x> 16; + d[x].g = g >> 16; + d[x].b = b >> 16; + d[x].a = a >> 16; + } + for(;x> 16; + d[yy].g = g >> 16; + d[yy].b = b >> 16; + d[yy].a = a >> 16; + yy += width; + } + for(;ywidth; + int height = img->height; + + int size = width*height; + int t; + U32* data = (U32*)img->data; + U32 color1 = data[0]; + U32 color2 = 0; + for(t=1;twidth; + int height = image->height; + gfxcolor_t*data = image->data; + + if(gfximage_getNumberOfPaletteEntries(image) == 2) { + monochrome=1; + encodeMonochromeImage(data, width, height, monochrome_colors); + int r1 = width / newwidth; + int r2 = height / newheight; + int r = r14) { + /* high-resolution monochrome images are usually dithered, so + low-pass filter them first to get rid of any moire patterns */ + blurImage(data, width, height, r+1); + } + } + + tmpline = (rgba_int_t*)rfx_alloc(width*sizeof(rgba_int_t)); + newdata = (gfxcolor_t*)rfx_alloc(newwidth*newheight*sizeof(gfxcolor_t)); + + lblockx = make_scale_lookup(width, newwidth); + lblocky = make_scale_lookup(height, newheight); + + for(p=lblocky[0];ppos*=width; + + for(y=0;ypos]; + scale_lookup_t*p_x; + int weight = p_y->weight; + for(x=0;xpos]; + unsigned int weight = p_x->weight; + r += col->r*weight; + g += col->g*weight; + b += col->b*weight; + a += col->a*weight; + p_x++; + } while (p_xr = r >> 16; + destline->g = g >> 16; + destline->b = b >> 16; + destline->a = a >> 16; + + destline++; + } + } + + if(monochrome) + decodeMonochromeImage(newdata, newwidth, newheight, monochrome_colors); + + rfx_free(tmpline); + rfx_free(*lblockx); + rfx_free(lblockx); + rfx_free(*lblocky); + rfx_free(lblocky); + + gfximage_t*image2 = (gfximage_t*)malloc(sizeof(gfximage_t)); + image2->data = newdata; + image2->width = newwidth; + image2->height = newheight; + return image2; +} + +#ifdef HAVE_FFTW3 +gfximage_t* gfximage_rescale_fft(gfximage_t*image, int newwidth, int newheight) +{ + int channel; + + int oldwidth = image->width; + int oldheight = image->height; + + unsigned char*rgba = (unsigned char*)image->data; + + bool has_alpha = gfximage_has_alpha(image); + bool monochrome = 0; + gfxcolor_t monochrome_colors[2]; + if(gfximage_getNumberOfPaletteEntries(image) == 2) { + monochrome=1; + encodeMonochromeImage(image->data, image->width, image->height, monochrome_colors); + } + + float*data = fftwf_malloc(sizeof(float)*oldwidth*oldheight); + int osize = oldwidth*oldheight; + int nsize = newwidth*newheight; + + assert(newwidth <= oldwidth && newheight <= oldheight); + + gfxcolor_t*rgba_new = malloc(newwidth*newheight*sizeof(gfxcolor_t)); + unsigned char*rgba_new_asbytes = (unsigned char*)rgba_new; + + int oxwidth = oldwidth/2+1; + int oxsize = oxwidth*oldheight; + fftwf_complex* fft = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*oxwidth*oldheight); + fftwf_complex* fft2 = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*newwidth*newheight); + fftwf_complex* data2 = fftwf_malloc(sizeof(fftwf_complex)*newwidth*newheight); + fftwf_plan plan1 = fftwf_plan_dft_r2c_2d(oldheight, oldwidth, data, fft, FFTW_ESTIMATE); + fftwf_plan plan2 = fftwf_plan_dft_2d(newheight, newwidth, fft2, data2, FFTW_BACKWARD, FFTW_ESTIMATE); + + double ff = 1.0/osize; + + for(channel=0;channel<4;channel++) { + if(channel==0 && !has_alpha) + continue; + if(channel>=1 && monochrome) + continue; + int t; + for(t=0;t> 2; + for(y=0;y255?255:f); + } + } + fftwf_destroy_plan(plan1); + fftwf_destroy_plan(plan2); + free(fft); + free(fft2); + if(!has_alpha) { + int t; + for(t=0;tdata = rgba_new; + image2->width = newwidth; + image2->height = newheight; + return image2; +} +#endif + +#ifdef HAVE_FFTW3 +gfximage_t* gfximage_rescale(gfximage_t*image, int newwidth, int newheight) +{ + //return gfximage_rescale_fft(image, newwidth, newheight); + return gfximage_rescale_old(image, newwidth, newheight); +} +#else +gfximage_t* gfximage_rescale(gfximage_t*image, int newwidth, int newheight) +{ + return gfximage_rescale_old(image, newwidth, newheight); +} +#endif + +bool gfximage_has_alpha(gfximage_t*img) +{ + int size = img->width*img->height; + gfxcolor_t*data = img->data; + int t; + for(t=0;tdata); + b->data = 0; + free(b); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfximage.h b/fluidbook/tools/swftools-special-swfdump/lib/gfximage.h new file mode 100644 index 000000000..4f4db4b08 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfximage.h @@ -0,0 +1,15 @@ +#ifndef __gfximage_h__ +#define __gfximage_h__ + +#include +#include "gfxdevice.h" + +gfximage_t*gfximage_new(int width, int height); +void gfximage_save_jpeg(gfximage_t*image, const char*filename, int quality); +void gfximage_save_png(gfximage_t*image, const char*filename); +void gfximage_save_png_quick(gfximage_t*image, const char*filename); +gfximage_t* gfximage_rescale(gfximage_t*image, int newwidth, int newheight); +bool gfximage_has_alpha(gfximage_t*image); +void gfximage_free(gfximage_t*b); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c new file mode 100644 index 000000000..a687e6309 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c @@ -0,0 +1,1174 @@ +/* gfxpoly.c + + Various boolean polygon functions. + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "../config.h" +#include "gfxdevice.h" +#include "gfxtools.h" +#include "gfxpoly.h" +#include "mem.h" +#include "art/libart.h" +#include "art/art_svp_intersect.h" +#include "art/art_svp_ops.h" +#include "log.h" +#include +#include +#include + +#define PERTURBATE +//#define SHEAR +//#define DEBUG + +//----------------------------------------- svp renderer ---------------------------------------- + +typedef struct { + int xmin; + int ymin; + int xmax; + int ymax; + int width; + int height; +} intbbox_t; + +typedef struct _renderpoint +{ + double x; + signed char direction; +} renderpoint_t; + +typedef struct _renderline +{ + renderpoint_t*points; + int size; + int num; +} renderline_t; + +typedef struct _renderbuf +{ + intbbox_t bbox; + int width; + int height; + double zoom; + renderline_t*lines; +} renderbuf_t; + +static inline void add_pixel(renderbuf_t*buf, double x, int y, signed char direction) +{ + renderpoint_t p; + p.x = x; + p.direction = direction; + + if(x >= buf->bbox.xmax || y >= buf->bbox.ymax || y < buf->bbox.ymin) + return; + renderline_t*l = &buf->lines[y-buf->bbox.ymin]; + + if(l->num == l->size) { + l->size += 32; + l->points = (renderpoint_t*)rfx_realloc(l->points, l->size * sizeof(renderpoint_t)); + } + l->points[l->num] = p; + l->num++; +} +#define CUT 0.5 +#define INT(x) ((int)((x)+16)-16) +static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, signed char direction) +{ + x1 *= buf->zoom; + y1 *= buf->zoom; + x2 *= buf->zoom; + y2 *= buf->zoom; + double diffx, diffy; + double ny1, ny2, stepx; + if(y2 < y1) { + double x,y; + x = x1;x1 = x2;x2=x; + y = y1;y1 = y2;y2=y; + } + diffx = x2 - x1; + diffy = y2 - y1; + ny1 = INT(y1)+CUT; + ny2 = INT(y2)+CUT; + + if(ny1 < y1) { + ny1 = INT(y1) + 1.0 + CUT; + } + if(ny2 >= y2) { + ny2 = INT(y2) - 1.0 + CUT; + } + if(ny1 > ny2) + return; + + stepx = diffx/diffy; + x1 = x1 + (ny1-y1)*stepx; + x2 = x2 + (ny2-y2)*stepx; + + int posy=INT(ny1); + int endy=INT(ny2); + double posx=0; + double startx = x1; + + while(posy<=endy) { + double xx = startx + posx; + add_pixel(buf, xx, posy, direction); + posx+=stepx; + posy++; + } +} + +static int compare_renderpoints(const void * _a, const void * _b) +{ + renderpoint_t*a = (renderpoint_t*)_a; + renderpoint_t*b = (renderpoint_t*)_b; + if(a->x < b->x) return -1; + if(a->x > b->x) return 1; + return 0; +} + +static void fill_bitwise(unsigned char*line, int x1, int x2) +{ + int p1 = x1>>3; + int p2 = x2>>3; + int b1 = 0xff >> (x1&7); + int b2 = 0xff << (1+7-(x2&7)); + if(p1==p2) { + line[p1] |= b1&b2; + } else { + line[p1] |= b1; + memset(&line[p1+1], 255, p2-(p1+1)); + line[p2] = b2; + } +} + +unsigned char* render_svp(ArtSVP*svp, intbbox_t*bbox, double zoom, ArtWindRule rule) +{ + renderbuf_t _buf, *buf=&_buf; + buf->width = (bbox->xmax - bbox->xmin); + buf->height = (bbox->ymax - bbox->ymin); + buf->bbox = *bbox; + buf->zoom = zoom; + int width8 = (buf->width+7) >> 3; + unsigned char* image = (unsigned char*)malloc(width8*buf->height); + memset(image, 0, width8*buf->height); + + buf->lines = (renderline_t*)rfx_alloc(buf->height*sizeof(renderline_t)); + int y; + for(y=0;yheight;y++) { + memset(&buf->lines[y], 0, sizeof(renderline_t)); + buf->lines[y].points = 0; + buf->lines[y].num = 0; + } + + int t; + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int s; + for(s=0;sn_points-1;s++) { + int dir = seg->dir? 1 : -1; + add_line(buf, seg->points[s].x, seg->points[s].y, seg->points[s+1].x, seg->points[s+1].y, dir); + } + } + for(y=0;yheight;y++) { + renderpoint_t*points = buf->lines[y].points; + unsigned char*line = &image[width8*y]; + int n; + int num = buf->lines[y].num; + int wind = 0; + qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); + int lastx = 0; + int fill = 0; + + for(n=0;nx - bbox->xmin); + + if(x < lastx) + x = lastx; + if(x > buf->width) { + break; + } + if(fill && x!=lastx) { + fill_bitwise(line, lastx, x); + } + wind += p->direction; + if(rule == ART_WIND_RULE_INTERSECT) { + fill = wind>=2; + } else if (rule == ART_WIND_RULE_NONZERO) { + fill = wind!=0; + } else if (rule == ART_WIND_RULE_ODDEVEN) { + fill = wind&1; + } else { // rule == ART_WIND_RULE_POSITIVE + fill = wind>=1; + } + lastx = x; + } + if(fill && lastx!=buf->width) + fill_bitwise(line, lastx, buf->width); + } + + for(y=0;yheight;y++) { + if(buf->lines[y].points) { + free(buf->lines[y].points); + } + memset(&buf->lines[y], 0, sizeof(renderline_t)); + } + free(buf->lines);buf->lines=0; + return image; +} + +#define MAX_WIDTH 8192 +#define MAX_HEIGHT 4096 + +intbbox_t get_svp_bbox(ArtSVP*svp, double zoom) +{ + int t; + intbbox_t b = {0,0,0,0}; + if(svp->n_segs && svp->segs[0].n_points) { + b.xmin = svp->segs[0].points[0].x; + b.ymin = svp->segs[0].points[0].y; + b.xmax = svp->segs[0].points[0].x; + b.ymax = svp->segs[0].points[0].y; + } + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int s; + for(s=0;sn_points;s++) { + double x = seg->points[s].x*zoom; + double y = seg->points[s].y*zoom; + int x1 = floor(x); + int x2 = ceil(x); + int y1 = floor(y); + int y2 = ceil(y); + if(x1 < b.xmin) b.xmin = x1; + if(y1 < b.ymin) b.ymin = y1; + if(x2 > b.xmax) b.xmax = x2; + if(y2 > b.ymax) b.ymax = y2; + } + } + if(b.xmax > (int)(MAX_WIDTH*zoom)) + b.xmax = (int)(MAX_WIDTH*zoom); + if(b.ymax > (int)(MAX_HEIGHT*zoom)) + b.ymax = (int)(MAX_HEIGHT*zoom); + if(b.xmin < -(int)(MAX_WIDTH*zoom)) + b.xmin = -(int)(MAX_WIDTH*zoom); + if(b.ymin < -(int)(MAX_HEIGHT*zoom)) + b.ymin = -(int)(MAX_HEIGHT*zoom); + + if(b.xmin > b.xmax) + b.xmin = b.xmax; + if(b.ymin > b.ymax) + b.ymin = b.ymax; + + b.width = b.xmax - b.xmin; + b.height = b.ymax - b.ymin; + return b; +} + +#define B11100000 0xe0 +#define B01110000 0x70 +#define B00111000 0x38 +#define B00011100 0x1c +#define B00001110 0x0e +#define B00000111 0x07 +#define B10000000 0x80 +#define B01000000 0x40 +#define B00100000 0x20 +#define B00010000 0x10 +#define B00001000 0x08 +#define B00000100 0x04 +#define B00000010 0x02 +#define B00000001 0x01 + +static int compare_bitmaps(intbbox_t*bbox, unsigned char*data1, unsigned char*data2) +{ + if(!data1 || !data2) + return 0; + int x,y; + int height = bbox->height; + int width = bbox->width; + int width8 = (width+7) >> 3; + unsigned char*l1 = &data1[width8]; + unsigned char*l2 = &data2[width8]; + for(y=1;ytype == gfx_moveTo) { + pos ++; + } else if(l2->type == gfx_lineTo) { + pos ++; + } else if(l2->type == gfx_splineTo) { + int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))*subfraction); + if(!parts) parts = 1; + pos += parts + 1; + } + x = l2->x; + y = l2->y; + l2 = l2->next; + } + pos++; + len = pos; + + vec = art_new (ArtVpath, len+1); + + pos = 0; + l2 = line; + int lastmove=-1; + while(l2) { + if(l2->type == gfx_moveTo) { + vec[pos].code = ART_MOVETO_OPEN; + vec[pos].x = l2->x; + vec[pos].y = l2->y; + lastmove=pos; + pos++; + assert(pos<=len); + } else if(l2->type == gfx_lineTo) { + vec[pos].code = ART_LINETO; + vec[pos].x = l2->x; + vec[pos].y = l2->y; + pos++; + assert(pos<=len); + } else if(l2->type == gfx_splineTo) { + int i; + int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))*subfraction); + if(!parts) parts = 1; + double stepsize = 1.0/parts; + for(i=0;i<=parts;i++) { + double t = (double)i*stepsize; + vec[pos].code = ART_LINETO; + vec[pos].x = l2->x*t*t + 2*l2->sx*t*(1-t) + x*(1-t)*(1-t); + vec[pos].y = l2->y*t*t + 2*l2->sy*t*(1-t) + y*(1-t)*(1-t); + pos++; + assert(pos<=len); + } + } + x = l2->x; + y = l2->y; + + /* let closed line segments start w/ MOVETO instead of MOVETO_OPEN */ + if(lastmove>=0 && l2->type!=gfx_moveTo && (!l2->next || l2->next->type == gfx_moveTo)) { + if(vec[lastmove].x == l2->x && + vec[lastmove].y == l2->y) { + assert(vec[lastmove].code == ART_MOVETO_OPEN); + vec[lastmove].code = ART_MOVETO; + } + } + + l2 = l2->next; + } + vec[pos++].code = ART_END; + assert(pos == len); + + if(!fill) { + /* Fix "dotted" lines. Those are lines where singular points are created + by a moveto x,y lineto x,y combination. We "fix" these by shifting the + point in the lineto a little bit to the right + These should only occur in strokes, not in fills, so do this only + when we know we're not filling. + */ + int t; + for(t=0;vec[t].code!=ART_END;t++) { + if(t>0 && (vec[t-1].code==ART_MOVETO_OPEN || vec[t-1].code==ART_MOVETO) + && vec[t].code==ART_LINETO && vec[t+1].code!=ART_LINETO && + vec[t-1].x == vec[t].x && + vec[t-1].y == vec[t].y) { + vec[t].x += 0.01; + } + } + } + + /* Find adjacent identical points. If an ajdacent pair of identical + points is found, the second one is removed. + So moveto x,y lineto x,y becomes moveto x,y + lineto x,y lineto x,y becomes lineto x,y + lineto x,y moveto x,y becomes lineto x,y + moveto x,y moveto x,y becomes moveto x,y + lineto x,y lineto x2,y2 becomes lineto x2,y2 (if dir(x,y) ~= dir(x2,y2)) + */ + pos = 0; + int outpos = 0; + while(1) + { + if(vec[pos].code == ART_END) { + vec[outpos++] = vec[pos++]; + break; + } + + char samedir = 0, samepoint = 0; + if(outpos) { + double dx = vec[pos].x-vec[pos-1].x; + double dy = vec[pos].y-vec[pos-1].y; + /*if(pos= 0) { + samedir=1; + } + }*/ + if(fabs(dx) + fabs(dy) < 0.0001) { + samepoint=1; + } + } + if(!samepoint && !samedir) { + vec[outpos++] = vec[pos++]; + } else { + pos++; // skip + } + } + + return vec; +} + +static void shear_svp(ArtSVP*svp, double v) +{ + /* do a "shearing" on the polygon. We do this to eliminate all + horizontal lines (which libart can't handle properly, even though + it tries). */ + + int t; + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int s; + for(s=0;sn_points;s++) { + ArtPoint* point = &seg->points[s]; + point->y += point->x*v; + } + } +} + +static double find_shear_value(ArtSVP*svp) +{ + /* We try random values until we find one + where there's no slope below a given value, or if that fails, + at least no slope of 0 */ + + double v = 0; + int tries = 0; + while(1) { + char fail = 0; + int t; + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int s; + for(s=0;sn_points-1;s++) { + ArtPoint* p1 = &seg->points[s]; + ArtPoint* p2 = &seg->points[s+1]; + double dx = p2->x - p1->x; + double dy = p2->y - p1->y; + dy += dx*v; + if(dy==0) { + fail = 1; + break; + } + if(tries<100 && dx && fabs(dy / dx) < 1e-5) { + fail = 1; + break; + } + } + if(fail) + break; + } + if(!fail) + break; +#ifdef HAVE_LRAND48 + v = lrand48() / 2000000000.0;; +#elif HAVE_RAND + v = rand() / 2000000000.0; +#else +#error "no lrand48()/rand() implementation found" +#endif + tries++; + } + return v; +} + +void show_path(ArtSVP*path) +{ + int t; + printf("Segments: %d\n", path->n_segs); + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &path->segs[t]; + printf("Segment %d: %d points, %s, BBox: (%f,%f,%f,%f)\n", + t, seg->n_points, seg->dir==0?"UP ":"DOWN", + seg->bbox.x0, seg->bbox.y0, seg->bbox.x1, seg->bbox.y1); + int p; + for(p=0;pn_points;p++) { + ArtPoint* point = &seg->points[p]; + printf(" (%f,%f)\n", point->x, point->y); + } + } + printf("\n"); +} + + +typedef struct svp_segment_part +{ + double y1; + double y2; + char active; +} svp_segment_part_t; + +int compare_double(const void*_y1, const void*_y2) +{ + const double*y1 = _y1; + const double*y2 = _y2; + if(*y1<*y2) return -1; + if(*y1>*y2) return 1; + else return 0; +} + +int compare_seg_start(const void*_s1, const void*_s2) +{ + svp_segment_part_t*s1 = *(svp_segment_part_t**)_s1; + svp_segment_part_t*s2 = *(svp_segment_part_t**)_s2; + if(s1->y1 < s2->y1) return -1; + if(s1->y1 > s2->y1) return 1; + else return 0; +} + +int compare_seg_end(const void*_s1, const void*_s2) +{ + svp_segment_part_t*s1 = *(svp_segment_part_t**)_s1; + svp_segment_part_t*s2 = *(svp_segment_part_t**)_s2; + if(s1->y2 < s2->y2) return -1; + if(s1->y2 > s2->y2) return 1; + else return 0; +} + +void clean_svp(ArtSVP*svp) +{ + int t; + int oldpoints = 0; + int newpoints = 0; + int oldsegs = 0; + int newsegs = 0; + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int p; + int pos=0; + double lasty = 0; + oldpoints += seg->n_points; + for(p=0;pn_points;p++) { + ArtPoint* p1 = &seg->points[p]; + if(!p || lasty!=p1->y) { + seg->points[pos] = seg->points[p]; + pos++; + lasty = p1->y; + } + } + seg->n_points = pos; + newpoints += seg->n_points; + } + int pos = 0; + oldsegs = svp->n_segs; + for(t=0;tn_segs;t++) { + if(svp->segs[t].n_points > 1) { + svp->segs[pos++] = svp->segs[t]; + } + } + svp->n_segs = pos; + newsegs = svp->n_segs; + if(newsegs < oldsegs || newpoints < oldpoints) { + msg(" Simplified polygon from %d points to %d points, %d to %d segs", + oldpoints, newpoints, oldsegs, newsegs); + } +} + +int check_svp(ArtSVP*svp) +{ + /* count number of y coordinates and segs */ + int t; + int num_points = 0; + int num_segs = 0; + for(t=0;tn_segs;t++) { + if(!svp->segs[t].n_points) { + msg(" svp contains segment with zero points\n"); + return 0; + } + num_points += svp->segs[t].n_points; + num_segs += svp->segs[t].n_points - 1; + } + + /* create segs and ys */ + double*y = malloc(sizeof(double)*num_points); + svp_segment_part_t*segs = malloc(sizeof(svp_segment_part_t)*num_segs); + svp_segment_part_t**seg_start = malloc(sizeof(svp_segment_part_t*)*num_segs); + svp_segment_part_t**seg_end = malloc(sizeof(svp_segment_part_t*)*num_segs); + + int c1=0; + num_segs = 0; + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int p; + for(p=0;pn_points;p++) { + y[c1++] = seg->points[p].y; + assert(c1 <= num_points); + } + for(p=0;pn_points-1;p++) { + ArtPoint* p1 = &seg->points[p]; + ArtPoint* p2 = &seg->points[p+1]; + + if(p1->y >= p2->y) { + if(p1->y > p2->y) { + msg(" bad svp, y in seg is non-increasing %.16f -> %.16f\n", p1->y, p2->y); + } + } else { + segs[num_segs].y1 = p1->y; + segs[num_segs].y2 = p2->y; + segs[num_segs].active = 0; + seg_start[num_segs] = &segs[num_segs]; + seg_end[num_segs] = &segs[num_segs]; + num_segs++; + } + } + } + + qsort(y, num_points, sizeof(double), compare_double); + qsort(seg_start, num_segs, sizeof(svp_segment_part_t*), compare_seg_start); + qsort(seg_end, num_segs, sizeof(svp_segment_part_t*), compare_seg_end); + + double lasty = num_points?y[0]+1:0; + int num_active = 0; + int bleed = 0; + double bleedy1=0,bleedy2 = 0; + for(t=0;t svp bleeds from y=%.16f to y=%.16f (%d/%d active segments)\n", + bleedy1, bleedy2, + bleed, num_segs); + free(y);free(segs);free(seg_start);free(seg_end); + return 0; + } + + free(y); + free(segs); + free(seg_start); + free(seg_end); + + return 1; +} + +void write_svp_postscript(const char*filename, ArtSVP*svp) +{ + if(!svp) + return; + FILE*fi = fopen(filename, "wb"); + int i, j; + double xmin=0,ymin=0,xmax=0,ymax=0; + fprintf(fi, "%% begin\n"); + for (i = 0; i < svp->n_segs; i++) { + for (j = 0; j < svp->segs[i].n_points; j++) { + double x = svp->segs[i].points[j].x; + double y = svp->segs[i].points[j].y; + if(i==0 && j==0) { + xmin = xmax = x; + ymin = ymax = y; + } else { + if(x < xmin) xmin = x; + if(x > xmax) xmax = x; + if(y < ymin) ymin = y; + if(y > ymax) ymax = y; + } + } + } + if(xmax == xmin) xmax=xmin+1; + if(ymax == ymin) ymax=ymin+1; + + for (i = 0; i < svp->n_segs; i++) + { + fprintf(fi, "%g setgray\n", svp->segs[i].dir ? 0.7 : 0); + for (j = 0; j < svp->segs[i].n_points; j++) + { + //fprintf(fi, "%g %g %s\n", + // 20 + 550*(svp->segs[i].points[j].x-xmin)/(xmax-xmin), + // 820 - 800*(svp->segs[i].points[j].y-ymin)/(ymax-ymin), + // j ? "lineto" : "moveto"); + fprintf(fi, "%.32f %.32f %s\n", + svp->segs[i].points[j].x, + svp->segs[i].points[j].y, + j ? "lineto" : "moveto"); + } + fprintf(fi, "stroke\n"); + } + + fprintf(fi, "showpage\n"); + fclose(fi); +} + +void write_vpath_postscript(const char*filename, ArtVpath*path) +{ + FILE*fi = fopen(filename, "wb"); + int i, j; + double xmin=0,ymin=0,xmax=0,ymax=0; + fprintf(fi, "%% begin\n"); + ArtVpath*p = path; + char first = 1; + while(p->code != ART_END) { + if(p->code == ART_MOVETO || p->code == ART_MOVETO_OPEN) { + if(!first) + fprintf(fi, "stroke\n"); + first = 0; + fprintf(fi, "0.0 setgray\n"); + fprintf(fi, "%.32f %.32f moveto\n", p->x, p->y); + } else { + fprintf(fi, "%.32f %.32f lineto\n", p->x, p->y); + } + p++; + } + if(!first) + fprintf(fi, "stroke\n"); + fprintf(fi, "showpage\n"); + fclose(fi); +} + +void write_gfxline_postscript(const char*filename, gfxline_t*line) +{ + FILE*fi = fopen(filename, "wb"); + int i, j; + fprintf(fi, "%% begin\n"); + char first = 1; + while(line) { + if(line->type == gfx_moveTo) { + if(!first) + fprintf(fi, "stroke\n"); + first = 0; + fprintf(fi, "0.0 setgray\n"); + fprintf(fi, "%.32f %.32f moveto\n", line->x, line->y); + } else { + fprintf(fi, "%.32f %.32f lineto\n", line->x, line->y); + } + line = line->next; + } + if(!first) + fprintf(fi, "stroke\n"); + fprintf(fi, "showpage\n"); + fclose(fi); +} + +static int vpath_len(ArtVpath*svp) +{ + int len = 0; + while(svp->code != ART_END) { + svp ++; + len ++; + } + return len; +} + +int gfxline_len(gfxline_t*line) +{ + gfxline_t*i = line; + int len = 0; + while(i) { + len ++; + i = i->next; + } + return len; +} + +static ArtVpath*pvpath= 0; +static int cmppos(const void*_p1, const void*_p2) +{ + int*p1 = (int*)_p1; + int*p2 = (int*)_p2; + ArtVpath*v1 = &pvpath[*p1]; + ArtVpath*v2 = &pvpath[*p2]; + if(v1->y < v2->y) + return -1; + else if(v1->y > v2->y) + return 1; + else if(v1->x < v2->x) + return -2; + else if(v1->x > v2->x) + return 2; + else + return 0; +} + +#define PERTURBATION 2e-3 +static void my_perturb(ArtVpath*vpath) +{ + int t; + int len = vpath_len(vpath); + int*pos = (int*)malloc(len*sizeof(int)); + for(t=0;t Casting gfxline of %d segments (%d line segments) to a gfxpoly", gfxline_len(line), vpath_len(vec)); + + if(perturb) { + //ArtVpath* vec2 = art_vpath_perturb(vec); + //free(vec); + //vec = vec2; + my_perturb(vec); + } + ArtSVP *svp = art_svp_from_vpath(vec); + free(vec); + + return svp; +} + +//#ifdef SHEAR +// double shear = find_shear_value(svp); +// gfxline_t*line = gfxline_from_gfxpoly((gfxpoly_t*)svp); +// gfxline_t*l = line; +// while(l) { +// l->y += l->x*shear; +// l->sy += l->sx*shear; +// l= l->next; +// } +// svp = (ArtSVP*)gfxpoly_fillToPoly(line); +// printf("shearing svp by %.16f\n", shear); +//#endif +// .... +//#ifdef SHEAR +// art_svp_free(svp); +// shear_svp(result, -shear); +//#endif + + +ArtSVP* run_intersector(ArtSVP*svp, ArtWindRule rule) +{ + ArtSvpWriter * swr = art_svp_writer_rewind_new(rule); + + double zoom = 1.0; + intbbox_t bbox = get_svp_bbox(svp, zoom); + + art_svp_intersector(svp, swr); + ArtSVP*result = art_svp_writer_rewind_reap(swr); + clean_svp(result); + if(!check_svp(result)) { + current_svp = result; + art_report_error(); // might set art_error_in_intersector + } else { + msg(" Comparing polygon renderings of size %dx%d and %dx%d", bbox.width, bbox.height, bbox.width, bbox.height); + unsigned char*data1 = render_svp(svp, &bbox, zoom, rule); + unsigned char*data2 = render_svp(result, &bbox, zoom, ART_WIND_RULE_ODDEVEN); + if(!compare_bitmaps(&bbox, data1, data2)) { + msg(" Bad SVP rewinding result- polygons don't match"); + current_svp = result; + art_report_error(); // might set art_error_in_intersector + } + free(data1); + free(data2); + } + + if(art_error_in_intersector) { + msg(" Error in polygon processing"); + art_svp_free(result); + art_error_in_intersector=0; + return 0; + } + return result; +} + +gfxline_t* gfxline_from_gfxpoly(gfxpoly_t*poly) +{ + ArtSVP*svp = (ArtSVP*)poly; + int size = 0; + int t; + int pos = 0; + + msg(" Casting polygon of %d segments back to gfxline", svp->n_segs); + + for(t=0;tn_segs;t++) { + size += svp->segs[t].n_points; + } + size = size + 1; + gfxline_t* lines = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)*size); + + for(t=0;tn_segs;t++) { + ArtSVPSeg* seg = &svp->segs[t]; + int p; + for(p=0;pn_points;p++) { + lines[pos].type = p==0?gfx_moveTo:gfx_lineTo; + ArtPoint* point = &seg->points[p]; + lines[pos].x = point->x; + lines[pos].y = point->y; + lines[pos].next = &lines[pos+1]; + pos++; + } + } + if(pos) { + lines[pos-1].next = 0; + return lines; + } else { + return 0; + } +} + +gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize) +{ + /* I'm not sure whether doing perturbation here is actually + a good idea- if that line has been run through the machinery + several times already, it might be safer to leave it alone, + since it should already be in a format libart can handle */ +#ifdef PERTURBATE + ArtSVP* svp = gfxfillToSVP(line, 1); +#else + ArtSVP* svp = gfxfillToSVP(line, 0); +#endif + +#ifdef DEBUG + char filename[80]; + static int counter = 0; + sprintf(filename, "svp%d.ps", counter); + write_svp_postscript(filename, svp); + sprintf(filename, "gfxline%d.ps", counter); + write_gfxline_postscript(filename, line); +#endif + + /* we do xor-filling by default, so dir is always 1 + (actually for oddeven rewinding it makes no difference, but + it's "cleaner") + */ + int t; + for(t=0; tn_segs; t++) { + svp->segs[t].dir = 1; + } + + /* for some reason, we need to rewind / self-intersect the polygons that gfxfillToSVP + returns- art probably uses a different fill mode (circular?) for vpaths */ + ArtSVP*svp_uncrossed=0; + +#ifdef DEBUG + sprintf(filename, "svp%d_in.ps", counter); + write_svp_postscript(filename, svp); + counter++; +#endif + + svp_uncrossed = run_intersector(svp, ART_WIND_RULE_ODDEVEN); + + art_svp_free(svp); + svp=svp_uncrossed; + + return (gfxpoly_t*)svp; +} + +gfxpoly_t* gfxpoly_intersect(gfxpoly_t*poly1, gfxpoly_t*poly2) +{ + ArtSvpWriter *swr; + + static int counter = 0; + + ArtSVP* svp1 = (ArtSVP*)poly1; + ArtSVP* svp2 = (ArtSVP*)poly2; + msg(" Intersecting two polygons of %d and %d segments", svp1->n_segs, svp2->n_segs); + +#ifdef DEBUG + char filename[80]; + sprintf(filename, "isvp%d_src1.ps", counter); + write_svp_postscript(filename, svp1); + sprintf(filename, "isvp%d_src2.ps", counter); + write_svp_postscript(filename, svp2); +#endif + + ArtSVP* svp3 = art_svp_merge (svp1, svp2); + +#ifdef DEBUG + sprintf(filename, "isvp%d_src.ps", counter); + write_svp_postscript(filename, svp3); +#endif + + //write_svp_postscript("svp.ps", svp3); + ArtSVP*svp_new = run_intersector(svp3, ART_WIND_RULE_INTERSECT); + + art_free (svp3); /* shallow free because svp3 contains shared segments */ + +#ifdef DEBUG + sprintf(filename, "isvp%d.ps", counter); + write_svp_postscript(filename, svp_new); +#endif + + counter++; + + //write_svp_postscript("svp_new.ps", svp_new); + + return (gfxpoly_t*)svp_new; +} + +gfxpoly_t* gfxpoly_union(gfxpoly_t*poly1, gfxpoly_t*poly2) +{ + ArtSVP* svp1 = (ArtSVP*)poly1; + ArtSVP* svp2 = (ArtSVP*)poly2; + msg(" Unifying two polygons of %d and %d segments", svp1->n_segs, svp2->n_segs); + + ArtSVP* svp = art_svp_union(svp1, svp2); + return (gfxpoly_t*)svp; +} + +gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, double miterLimit, double gridsize) +{ + ArtVpath* vec = gfxline_to_ArtVpath(line, 0); + msg(" Casting gfxline of %d segments to a stroke-polygon", gfxline_len(line)); + + ArtVpath* vec2 = art_vpath_perturb(vec); + free(vec); + vec = vec2; + + ArtSVP *svp = art_svp_vpath_stroke (vec, + (joint_style==gfx_joinMiter)?ART_PATH_STROKE_JOIN_MITER: + ((joint_style==gfx_joinRound)?ART_PATH_STROKE_JOIN_ROUND: + ((joint_style==gfx_joinBevel)?ART_PATH_STROKE_JOIN_BEVEL:ART_PATH_STROKE_JOIN_BEVEL)), + (cap_style==gfx_capButt)?ART_PATH_STROKE_CAP_BUTT: + ((cap_style==gfx_capRound)?ART_PATH_STROKE_CAP_ROUND: + ((cap_style==gfx_capSquare)?ART_PATH_STROKE_CAP_SQUARE:ART_PATH_STROKE_CAP_SQUARE)), + width, //line_width + miterLimit, //miter_limit + 0.05 //flatness + ); + free(vec); + return (gfxpoly_t*)svp; +} + +gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize) +{ + msg(" Converting circular-filled gfxline of %d segments to even-odd filled gfxline", gfxline_len(line)); + ArtSVP* svp = gfxfillToSVP(line, 1); + + ArtSVP* svp_rewinded; + + svp_rewinded = run_intersector(svp, ART_WIND_RULE_NONZERO); + if(!svp_rewinded) { + art_svp_free(svp); + return 0; + } + + gfxline_t* result = gfxline_from_gfxpoly((gfxpoly_t*)svp_rewinded); + art_svp_free(svp); + art_svp_free(svp_rewinded); + return result; +} + +gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize) +{ + ArtVpath *vec = art_new (ArtVpath, 5+1); + vec[0].code = ART_MOVETO; + vec[0].x = x1; + vec[0].y = y1; + vec[1].code = ART_LINETO; + vec[1].x = x1; + vec[1].y = y2; + vec[2].code = ART_LINETO; + vec[2].x = x2; + vec[2].y = y2; + vec[3].code = ART_LINETO; + vec[3].x = x2; + vec[3].y = y1; + vec[4].code = ART_LINETO; + vec[4].x = x1; + vec[4].y = y1; + vec[5].code = ART_END; + vec[5].x = 0; + vec[5].y = 0; + ArtSVP *svp = art_svp_from_vpath(vec); + free(vec); + return (gfxpoly_t*)svp; +} + +void gfxpoly_destroy(gfxpoly_t*poly) +{ + ArtSVP*svp = (ArtSVP*)poly; + art_svp_free(svp); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h new file mode 100644 index 000000000..b8329c821 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h @@ -0,0 +1,64 @@ +/* gfxpoly.h + + Various boolean polygon functions. + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxpoly_h__ +#define __gfxpoly_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "mem.h" +#include "gfxdevice.h" +#include "gfxtools.h" + +/* A "grid" value is the granularity at which polygon intersection operates. + It usually makes sense this to the smallest value that can actually be represented + in the output device (like 0.05 = 1 twip for SWF). */ +#define DEFAULT_GRID (0.05) + +typedef struct _gfxpoly { +} gfxpoly_t; + +void gfxpoly_destroy(gfxpoly_t*poly); + +/* constructors */ +gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize); +gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, double gridsize); + +/* operators */ +gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2); +gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2); + +/* conversion functions */ +gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize); +gfxline_t* gfxline_from_gfxpoly(gfxpoly_t*poly); +gfxline_t* gfxline_from_gfxpoly_with_direction(gfxpoly_t*poly); +gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxpoly_h__ + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c new file mode 100644 index 000000000..c5f9c02f6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c @@ -0,0 +1,693 @@ +#include +#include +#include +#include "../../config.h" +#include "../q.h" +#include "../types.h" +#include "active.h" + +actlist_t* actlist_new() +{ + NEW(actlist_t, a); + return a; +} +void actlist_destroy(actlist_t*a) +{ + free(a); +} + +void actlist_dump(actlist_t*a, int32_t y, double gridsize) +{ + segment_t*s = a->list; + double lastx; + char bad = 0; + if(!s) fprintf(stderr, "(empty)\n"); + while(s) { + if(y) { + double x = ((double)s->delta.x*(y-s->a.y)/s->delta.y)+s->a.x; + if(s!=a->list) { + if(lastx>x) + fprintf(stderr, "?%.2f<->%.2f? ", lastx * gridsize, x * gridsize); + } + lastx = x; + } + fprintf(stderr, "[%d]", (int)s->nr); + s = s->right; + if(s) fprintf(stderr, " "); + else fprintf(stderr, " y=%.2f\n", y * gridsize); + } +} +void actlist_verify(actlist_t*a, int32_t y) +{ + segment_t*s = a->list; + assert(!s || !s->left); + segment_t*l = 0; + while(s) { + if(y) { + if(l) { + /* we need to re-evaluate the x of the previous segment. if we + try to store it, it might end up being converted to a double, + which will make it non-equal to (and possibly larger than) the + "long double" the FPU has in its register. This only happens + when compiler optimizations are turned on. */ + assert((XPOS(s, y) - XPOS(l, y)) >= 0); + assert(XDIFF(s,l,y) >= 0); + } + l = s; + } + assert(!s->left || s->left->right == s); + assert(!s->right || s->right->left == s); + s = s->right; + } +} + +static inline double single_cmp(segment_t*s, point_t p1) +{ + return LINE_EQ(p1, s); +} + +static inline double cmp(segment_t*s, point_t p1, point_t p2) +{ + double d = LINE_EQ(p1, s); + if(d==0) { + d = LINE_EQ(p2, s); + if(d==0) { + /* We default to always inserting the new segment to the right of the old segment. + We do this so that we don't place new segments into the middle of already + overlapping lines which may have intersections scheduled. + */ + //fprintf(stderr, "Notice: actlist_find: both points (%d,%d) and (%d,%d) exactly on segment [%d]\n", p1.x, p1.y, p2.x, p2.y, s->nr); + } + } + return d; +} + +#ifdef SPLAY +static void actlist_splay_dump(actlist_t*a); +segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2) +{ +#ifdef CHECKS + segment_t*t = a->list; + char to_the_left = 0; + char fail = 0; + while(t) { + /* this check doesn't work out with cmp() because during horizontal + processing, both segments ending as well as segments starting will + be active in this scanline */ + //double d = cmp(t, p1, p2); + double d = single_cmp(t, p1); + if(d>=0 && to_the_left) { + actlist_dump(a, p1.y, 1); + segment_t*s = a->list; + while(s) { + fprintf(stderr, "[%d] %f/%f (%d,%d) -> (%d,%d)\n", SEGNR(s), + single_cmp(s,p1), cmp(s,p1,p2), + s->a.x, s->a.y, s->b.x, s->b.y); + s = s->right; + } + } + assert(!(d>=0 && to_the_left)); + if(d<0) to_the_left=1; + t = t->right; + } +#if 0 + if(a->size > 100) { + static actlist_t*last = 0; + if(last != a) { + last = a; + actlist_splay_dump(a); + } + } +#endif +#endif + segment_t*last=0, *s = a->root; + if(!s) return 0; + double d=0; + int depth = 0; + while(s) { + last = s; + depth++; + d = single_cmp(s, p1); + if(d<=0) { + s = s->leftchild; + } else { + s = s->rightchild; + } + } +//#ifdef DEBUG +#if 0 + if(a->size > 1) { + /* 80% hit, average cost per miss ~ 4 nodes */ + int expected_depth = (int)((double)log2((double)a->size+1))+1; + static int hits = 0; + static int misses = 0; + static int miss_cost = 0; + if(depth <= expected_depth) hits++; + else {misses++; + miss_cost += depth - expected_depth; + } + if(hits && misses) + fprintf(stderr, "%02.2f%% %f\n", hits / (double)(hits+misses), miss_cost / (double)misses); + } +#endif + + /* this can be optimized for (is not needed in) normal mode (as opposed to horizontal postprocess mode) */ + segment_t*out = last; + if(d<0 || (d==0 && LINE_EQ(p2,last)<0)) { + last = last->left; + if(!last) { + assert(cmp(a->list, p1, p2)<0); + return 0; + } + } else { + while(last->right && cmp(last->right, p1, p2)>=0) { + last = last->right; + } + } + +#ifdef CHECKS + segment_t*l=0; + s = a->list; + while(s) { + if(cmp(s, p1, p2)<0) + break; + l = s;s = s->right; + } + if(l!=last) { + printf("[%d]!=[%d]\n", SEGNR(l), SEGNR(last)); + printf("after tree: [%d]\n", SEGNR(out)); + actlist_splay_dump(a); + s = a->list; + while(s) { + double d1 = single_cmp(s,p1); + double d2 = cmp(s,p1,p2); + int x1 = d1<0?-1:(d1>0?1:0); + int x2 = d2<0?-1:(d2>0?1:0); + printf("[%d](%d,%d) ", SEGNR(s), x1, x2); + s = s->right; + } + printf("\n"); + } + assert(l == last); +#endif + + return last; +} +#else +segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2) +{ + segment_t*last=0, *s = a->list; + if(!s) return last; + while(s) { + double d = cmp(s, p1, p2); + if(d<0) + break; + last = s; + s = s->right; + } + return last; +} +#endif + +#ifdef SPLAY + +#define LINK(node,side,child) (node)->side = (child);if(child) {(child)->parent = (node);} + //;fprintf(stderr, "[%d]->%s now [%d]\n", SEGNR(node), __STRING(side), SEGNR(child)); + +// rotates segment's left node to the top +static inline segment_t*rotate_right(actlist_t*a, segment_t*s) +{ + /* s n + / \ + n -> s + \ / + l l + */ + assert(s->leftchild); + segment_t*p = s->parent; + segment_t*n = s->leftchild; + segment_t*l = n->rightchild; + LINK(n,rightchild,s); + LINK(s,leftchild,l); + n->parent = p; + if(p) { + if(p->leftchild == s) + p->leftchild = n; + else if(p->rightchild == s) + p->rightchild = n; + } else { + a->root = n; + } + return n; +} +// rotates segment's right node to the top +static inline segment_t*rotate_left(actlist_t*a, segment_t*s) +{ + /* s n + \ / + n -> s + / \ + r r + */ + assert(s->rightchild); + segment_t*p = s->parent; + segment_t*n = s->rightchild; + segment_t*r = n->leftchild; + LINK(n,leftchild,s); + LINK(s,rightchild,r); + n->parent = p; + if(p) { + if(p->leftchild == s) + p->leftchild = n; + else if(p->rightchild == s) + p->rightchild = n; + } else { + a->root = n; + } + return n; +} + +static int actlist_splay_walk(actlist_t*a, segment_t*s, segment_t**ss, segment_t*parent) +{ + if(!s) return 1; + if(parent != s->parent) { + fprintf(stderr, "Parent mismatch in [%d]: [%d] != [%d]\n", SEGNR(s), SEGNR(parent), SEGNR(s->parent)); + return 0; + } + if(!actlist_splay_walk(a, s->leftchild, ss, s)) return 0; + if(s != *ss) { + fprintf(stderr, "[%d] != [%d]\n", SEGNR(s), SEGNR(*ss)); + return 0; + } + (*ss) = (*ss)->right; + if(!actlist_splay_walk(a, s->rightchild, ss, s)) return 0; + return 1; +} + +static int actlist_splay_verify(actlist_t*a) +{ + segment_t*c = a->list; + if(!actlist_splay_walk(a, a->root, &c, 0)) return 0; + if(c) return 0; + return 1; +} +static void actlist_splay_dump2(actlist_t*a, segment_t*s, char*mid, char*up, char*down) +{ + if(!s) return; + + if(s->leftchild || s->rightchild) { + int t; + + if(s->leftchild) { + char*o3 = malloc(strlen(up)+3); + strcpy(o3, up);strcat(o3, "+-"); + char*newup = malloc(strlen(up)+3); + strcpy(newup, up);strcat(newup, "| "); + char*newup2 = malloc(strlen(up)+3); + strcpy(newup2, up);strcat(newup2, " "); + actlist_splay_dump2(a, s->leftchild, o3, newup2, newup); + fprintf(stderr, "%s| \n", up); + free(newup); + free(newup2); + free(o3); + } + fprintf(stderr, "%s[%d]\n", mid, SEGNR(s)); + if(s->rightchild) { + char*o3 = malloc(strlen(down)+3); + strcpy(o3, down);strcat(o3, "+-"); + char*newdown = malloc(strlen(down)+3); + strcpy(newdown, down);strcat(newdown, "| "); + char*newdown2 = malloc(strlen(down)+3); + strcpy(newdown2, down);strcat(newdown2, " "); + fprintf(stderr, "%s| \n", down); + actlist_splay_dump2(a, s->rightchild, o3, newdown, newdown2); + free(newdown); + free(newdown2); + free(o3); + } + } else { + fprintf(stderr, "%s[%d]\n", mid, SEGNR(s)); + } +} +static void actlist_splay_dump(actlist_t*a) +{ + actlist_splay_dump2(a, a->root, "", "", ""); +} + + +static void move_to_root(actlist_t*a, segment_t*s) +{ + if(!s) return; + /* this is a textbook implementation of the three splay operations + zig, zig-zig and zig-zag */ + int nr=0; + while(a->root != s) { + assert(s->parent); + segment_t*p = s->parent; + if(p == a->root) { + // zig + if(a->root->leftchild == s) { + rotate_right(a, a->root); + } else { + rotate_left(a, a->root); + } + assert(a->root == s); + } else { + segment_t*pp = p->parent; + if(p->leftchild == s && pp->leftchild == p) { + // zig-zig (left) + rotate_right(a, pp); + rotate_right(a, s->parent); + } else if(p->rightchild == s && pp->rightchild == p) { + // zig-zig (right) + rotate_left(a, pp); + rotate_left(a, s->parent); + } else if(p->leftchild == s && pp->rightchild == p) { + // zig-zag (left) + rotate_right(a, p); + rotate_left(a, s->parent); + } else if(p->rightchild == s && pp->leftchild == p) { + // zig-zag (right) + rotate_left(a, p); + rotate_right(a, s->parent); + } else { + assert(0); + } + } + } +} + +static void actlist_splay(actlist_t*a, point_t p1, point_t p2) +{ + if(!a->list) return; + + segment_t tmp; + memset(&tmp, 0, sizeof(tmp)); + segment_t*left=&tmp,*right=&tmp; + + int c = 0; + while(1) { + if(cmp(a->root,p1,p2)<0) { + /* we're to the left of the root */ + if(!a->root->leftchild) { + c = -1;break; + } + if(cmp(a->root->leftchild,p1,p2)<0) { + /* we're also to the left of the root's left child + -> rotate right, so that the left child is root */ + segment_t*s = a->root->leftchild; + LINK(a->root, leftchild, s->rightchild); + LINK(s, rightchild, a->root); + a->root = s; + if(!a->root->leftchild) { + c = -1;break; + } + } + LINK(right, leftchild, a->root); + right = a->root; + a->root = a->root->leftchild; + } else /* cmp(a->root,p1,p2)>=0 */ { + /* we're to the right of the root */ + if(!a->root->rightchild) { + c = 1;break; + } + if(cmp(a->root->rightchild,p1,p2)>=0) { + /* we're also to the right of the root's right child + -> rotate left, so that the right child is root */ + segment_t*s = a->root->rightchild; + LINK(a->root, rightchild, s->leftchild); + LINK(s, leftchild, a->root); + a->root = s; + if(!a->root->rightchild) + c = 1;break; + } + LINK(left, rightchild, a->root); + left = a->root; + a->root = a->root->rightchild; + } + } + LINK(left, rightchild, a->root->leftchild); + LINK(right, leftchild, a->root->rightchild); + LINK(a->root, leftchild, tmp.rightchild); + LINK(a->root, rightchild, tmp.leftchild); + a->root->parent = 0; +} + +#endif + +static void actlist_insert_after(actlist_t*a, segment_t*left, segment_t*s) +{ +#ifdef SPLAY + //fprintf(stderr, "insert [%d] after [%d]\n", SEGNR(s), SEGNR(left)); + //actlist_splay_dump(a); + //actlist_dump(a, s->a.y); +#endif + + s->left = left; + if(left) { + s->right = left->right; + } else { + s->right = a->list; + a->list = s; + } + if(s->left) + s->left->right = s; + if(s->right) + s->right->left = s; + +#ifdef SPLAY + // we insert nodes not trees + assert(!s->leftchild); + assert(!s->rightchild); + + if(a->root) { + move_to_root(a, left); + if(left) { + LINK(s,leftchild,a->root); + // steal right child from (previous) root + LINK(s,rightchild,a->root->rightchild); + a->root->rightchild = 0; + } else { + LINK(s,rightchild,a->root); + } + } + a->root = s; + a->root->parent = 0; + + assert(actlist_splay_verify(a)); +#endif + + a->size++; +} + +void actlist_delete(actlist_t*a, segment_t*s) +{ +#ifdef SPLAY + assert(actlist_splay_verify(a)); + move_to_root(a, s); + assert(actlist_splay_verify(a)); +#endif + if(s->left) { + s->left->right = s->right; + } else { + a->list = s->right; + } + if(s->right) { + s->right->left = s->left; + } + s->left = s->right = 0; + a->size--; +#ifdef SPLAY + assert(a->root == s); + // delete root node + if(!a->root->leftchild) { + a->root = a->root->rightchild; + } else if(!a->root->rightchild) { + a->root = a->root->leftchild; + } else { +#ifdef HAVE_LRAND48 + if(lrand48()&1) { +#else + if(((ptroff_t)s)&16) { +#endif + // free up root->left->right + segment_t*t = a->root->leftchild; + while(t->rightchild) { + segment_t*r = t->rightchild; + segment_t*l = r->leftchild; + LINK(r, leftchild, t); + LINK(t, rightchild, l); + t = r; + } + LINK(a->root,leftchild,t); + assert(!a->root->leftchild->rightchild); + LINK(a->root->leftchild,rightchild,a->root->rightchild); + a->root = a->root->leftchild; + } else { + // free up root->right->left + segment_t*t = a->root->rightchild; + while(t->leftchild) { + segment_t*l = t->leftchild; + segment_t*r = l->rightchild; + LINK(l, rightchild, t); + LINK(t, leftchild, r); + t = l; + } + LINK(a->root,rightchild,t); + assert(!a->root->rightchild->leftchild); + LINK(a->root->rightchild,leftchild,a->root->leftchild); + a->root = a->root->rightchild; + } + } + if(a->root) + a->root->parent = 0; + s->leftchild = s->rightchild = s->parent = 0; + + assert(actlist_splay_verify(a)); +#endif +} +int actlist_size(actlist_t*a) +{ + return a->size; +} + +segment_t* actlist_leftmost(actlist_t*a) +{ + return a->list; +} + +segment_t* actlist_rightmost(actlist_t*a) +{ + /* this is only used in checks, so it doesn't matter that it's slow */ +#ifndef CHECKS + fprintf(stderr, "Warning: actlist_rightmost should not be used\n"); +#endif + segment_t*s = a->list; + segment_t*last = 0; + while(s) { + last = s; + s = s->right; + } + return last; +} + +void actlist_insert(actlist_t*a, point_t p1, point_t p2, segment_t*s) +{ + segment_t*left = actlist_find(a, p1, p2); + actlist_insert_after(a, left, s); +} + +void actlist_swap(actlist_t*a, segment_t*s1, segment_t*s2) +{ +#ifdef SPLAY + assert(actlist_splay_verify(a)); +#endif +#ifdef CHECKS + /* test that s1 is to the left of s2- our swap + code depends on that */ + segment_t*s = s1; + while(s && s!=s2) s = s->right; + assert(s==s2); +#endif +/*#ifndef SPLAY + actlist_delete(a, s1); + actlist_insert_after(a, s2, s1); +#else*/ + segment_t*s1l = s1->left; + segment_t*s1r = s1->right; + segment_t*s2l = s2->left; + segment_t*s2r = s2->right; + if(s1l) s1l->right = s2; + else a->list = s2; + s2->left = s1l; + if(s2r) s2r->left = s1; + s1->right = s2r; + if(s2l!=s1) s1->left = s2l; + else s1->left = s2; + if(s1r!=s2) s2->right = s1r; + else s2->right = s1; + +#ifdef SPLAY + if(s2->parent==s1) { + /* + s1 s2 + / -> / + s2 s1 + */ + segment_t*l = s2->leftchild; + segment_t*r = s2->rightchild; + assert(s1->rightchild == s2); // because s1 < s2 + segment_t*l1 = s1->leftchild; + segment_t*p = s1->parent; + s1->parent = s2; + s2->parent = p; + if(p) { + if(p->leftchild == s1) p->leftchild=s2; + else {assert(p->rightchild == s1);p->rightchild=s2;} + } else { + a->root = s2; + } + s2->leftchild = l1; + s2->rightchild = s1; + s1->leftchild = l; + s1->rightchild = r; + } else if(s1->parent==s2) { + /* + s2 s1 + / -> / + s1 s2 + */ + segment_t*l = s1->leftchild; + segment_t*r = s1->rightchild; + segment_t*r2 = s2->rightchild; + assert(s2->leftchild == s1); // because s1 < s2 + segment_t*p = s2->parent; + s2->parent = s1; + s1->parent = p; + if(p) { + if(p->leftchild == s2) p->leftchild=s1; + else {assert(p->rightchild == s2);p->rightchild=s1;} + } else { + a->root = s1; + } + s1->leftchild = s2; + s1->rightchild = r2; + s2->leftchild = l; + s2->rightchild = r; + } else { + segment_t*s1p = s1->parent; + segment_t*s1l = s1->leftchild; + segment_t*s1r = s1->rightchild; + segment_t*s2p = s2->parent; + segment_t*s2l = s2->leftchild; + segment_t*s2r = s2->rightchild; + s2->parent = s1p; + s2->leftchild = s1l; + s2->rightchild = s1r; + s1->parent = s2p; + s1->leftchild = s2l; + s1->rightchild = s2r; + assert(s1p || s2p); + if(s1p) { + if(s1p->leftchild == s1) s1p->leftchild=s2; + else {assert(s1p->rightchild == s1);s1p->rightchild=s2;} + } else { + a->root = s2; + } + if(s2p) { + if(s2p->leftchild == s2) s2p->leftchild=s1; + else {assert(s2p->rightchild == s2);s2p->rightchild=s1;} + } else { + a->root = s1; + } + } + if(s1->leftchild) s1->leftchild->parent = s1; + if(s2->leftchild) s2->leftchild->parent = s2; + if(s1->rightchild) s1->rightchild->parent = s1; + if(s2->rightchild) s2->rightchild->parent = s2; + + assert(actlist_splay_verify(a)); +#endif + +//#endif +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h new file mode 100644 index 000000000..2dc09fa2b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h @@ -0,0 +1,30 @@ +#ifndef __active_h__ +#define __active_h__ + +#include "poly.h" + +typedef struct _actlist +{ + segment_t*list; + int size; +#ifdef SPLAY + segment_t*root; +#endif +} actlist_t; + +#define actlist_left(a,s) ((s)->left) +#define actlist_right(a,s) ((s)?(s)->right:(a)->list) + +actlist_t* actlist_new(); +void actlist_destroy(actlist_t*a); +int actlist_size(actlist_t*a); +void actlist_verify(actlist_t*a, int32_t y); +void actlist_dump(actlist_t*a, int32_t y, double gridsize); +segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2); // finds segment immediately to the left of p1 (breaking ties w/ p2) +void actlist_insert(actlist_t*a, point_t p1, point_t p2, segment_t*s); +void actlist_delete(actlist_t*a, segment_t*s); +void actlist_swap(actlist_t*a, segment_t*s1, segment_t*s2); +segment_t* actlist_leftmost(actlist_t*a); +segment_t* actlist_rightmost(actlist_t*a); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c new file mode 100644 index 000000000..9fbe40d26 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c @@ -0,0 +1,550 @@ +#include +#include +#include +#include "../gfxdevice.h" +#include "../mem.h" +#include "poly.h" +#include "convert.h" +#include "wind.h" + +/* factor that determines into how many line fragments a spline is converted */ +#define SUBFRACTION (2.4) + +static inline int32_t convert_coord(double x, double z) +{ + /* we clamp to 26 bit because: + a) we use a (x1-x2) shortcut when comparing coordinates + b) we need to be able to multiply two coordinates and store them in a double w/o loss of precision + */ + x *= z; + if(x < -0x2000000) x = -0x2000000; + if(x > 0x1ffffff) x = 0x1ffffff; + return ceil(x); +} + +static void convert_gfxline(gfxline_t*line, polywriter_t*w, double gridsize) +{ + assert(!line || line[0].type == gfx_moveTo); + double lastx=0,lasty=0; + double z = 1.0 / gridsize; + while(line) { + if(line->type == gfx_moveTo) { + if(line->next && line->next->type != gfx_moveTo && (line->x!=lastx || line->y!=lasty)) { + w->moveto(w, convert_coord(line->x,z), convert_coord(line->y,z)); + } + } else if(line->type == gfx_lineTo) { + w->lineto(w, convert_coord(line->x,z), convert_coord(line->y,z)); + } else if(line->type == gfx_splineTo) { + int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + + fabs(line->y-2*line->sy+lasty))*SUBFRACTION); + if(!parts) parts = 1; + double stepsize = 1.0/parts; + int i; + for(i=0;ix*t*t + 2*line->sx*t*(1-t) + lastx*(1-t)*(1-t)); + double sy = (line->y*t*t + 2*line->sy*t*(1-t) + lasty*(1-t)*(1-t)); + w->lineto(w, convert_coord(sx,z), convert_coord(sy,z)); + } + w->lineto(w, convert_coord(line->x,z), convert_coord(line->y,z)); + } + lastx = line->x; + lasty = line->y; + line = line->next; + } +} + +static char* readline(FILE*fi) +{ + char c; + while(1) { + int l = fread(&c, 1, 1, fi); + if(!l) + return 0; + if(c!=10 || c!=13) + break; + } + char line[256]; + int pos = 0; + while(1) { + line[pos++] = c; + line[pos] = 0; + int l = fread(&c, 1, 1, fi); + if(!l || c==10 || c==13) { + return strdup(line); + } + } +} + +static void convert_file(const char*filename, polywriter_t*w, double gridsize) +{ + FILE*fi = fopen(filename, "rb"); + if(!fi) { + perror(filename); + } + double z = 1.0 / gridsize; + int count = 0; + double g = 0; + double lastx=0,lasty=0; + while(1) { + char*line = readline(fi); + if(!line) + break; + double x,y; + char s[256]; + if(sscanf(line, "%lf %lf %s", &x, &y, (char*)&s) == 3) { + if(!strcmp(s,"moveto")) { + w->moveto(w, convert_coord(x,z), convert_coord(y,z)); + count++; + } else if(!strcmp(s,"lineto")) { + w->lineto(w, convert_coord(x,z), convert_coord(y,z)); + count++; + } else { + fprintf(stderr, "invalid command: %s\n", s); + } + } else if(sscanf(line, "%% gridsize %lf", &g) == 1) { + gridsize = g; + z = 1.0 / gridsize; + w->setgridsize(w, g); + } + free(line); + } + fclose(fi); + if(g) { + fprintf(stderr, "loaded %d points from %s (gridsize %f)\n", count, filename, g); + } else { + fprintf(stderr, "loaded %d points from %s\n", count, filename); + } +} + +typedef struct _compactpoly { + gfxpoly_t*poly; + point_t last; + point_t*points; + int num_points; + int points_size; + segment_dir_t dir; + char new; +} compactpoly_t; + +void finish_segment(compactpoly_t*data) +{ + if(data->num_points <= 1) + return; + point_t*p = malloc(sizeof(point_t)*data->num_points); + gfxpolystroke_t*s = rfx_calloc(sizeof(gfxpolystroke_t)); + s->fs = &edgestyle_default; + s->next = data->poly->strokes; + data->poly->strokes = s; + s->num_points = s->points_size = data->num_points; + s->dir = data->dir; + s->points = p; + assert(data->dir != DIR_UNKNOWN); + if(data->dir == DIR_UP) { + int t; + int s = data->num_points; + for(t=0;tnum_points;t++) { + p[--s] = data->points[t]; + } + } else { + memcpy(p, data->points, sizeof(point_t)*data->num_points); + } +#ifdef CHECKS + int t; + for(t=0;tnum_points-1;t++) { + assert(p[t].y<=p[t+1].y); + } +#endif +} +static void compactmoveto(polywriter_t*w, int32_t x, int32_t y) +{ + compactpoly_t*data = (compactpoly_t*)w->internal; + point_t p; + p.x = x; + p.y = y; + if(p.x != data->last.x || p.y != data->last.y) { + data->new = 1; + } + data->last = p; +} + +static inline int direction(point_t p1, point_t p2) +{ + int diff = p1.y - p2.y; + if(diff) return diff; + return p1.x - p2.x; +} + +static void compactlineto(polywriter_t*w, int32_t x, int32_t y) +{ + compactpoly_t*data = (compactpoly_t*)w->internal; + point_t p; + p.x = x; + p.y = y; + + int diff = direction(p, data->last); + if(!diff) + return; + segment_dir_t dir = diff<0?DIR_UP:DIR_DOWN; + + if(dir!=data->dir || data->new) { + finish_segment(data); + data->dir = dir; + data->points[0] = data->last; + data->num_points = 1; + } + data->new = 0; + + if(data->points_size == data->num_points) { + data->points_size <<= 1; + assert(data->points_size > data->num_points); + data->points = rfx_realloc(data->points, sizeof(point_t)*data->points_size); + } + data->points[data->num_points++] = p; + data->last = p; +} +static void compactsetgridsize(polywriter_t*w, double gridsize) +{ + compactpoly_t*d = (compactpoly_t*)w->internal; + d->poly->gridsize = gridsize; +} +/*static int compare_stroke(const void*_s1, const void*_s2) +{ + gfxpolystroke_t*s1 = (gfxpolystroke_t*)_s1; + gfxpolystroke_t*s2 = (gfxpolystroke_t*)_s2; + return s1->points[0].y - s2->points[0].y; +}*/ +static void*compactfinish(polywriter_t*w) +{ + compactpoly_t*data = (compactpoly_t*)w->internal; + finish_segment(data); + //qsort(data->poly->strokes, data->poly->num_strokes, sizeof(gfxpolystroke_t), compare_stroke); + free(data->points); + gfxpoly_t*poly = data->poly; + free(w->internal);w->internal = 0; + return (void*)poly; +} +void gfxpolywriter_init(polywriter_t*w) +{ + w->moveto = compactmoveto; + w->lineto = compactlineto; + w->setgridsize = compactsetgridsize; + w->finish = compactfinish; + compactpoly_t*data = w->internal = rfx_calloc(sizeof(compactpoly_t)); + data->poly = rfx_calloc(sizeof(gfxpoly_t)); + data->poly->gridsize = 1.0; + data->last.x = data->last.y = 0; + data->num_points = 0; + data->points_size = 16; + data->new = 1; + data->dir = DIR_UNKNOWN; + data->points = (point_t*)rfx_alloc(sizeof(point_t)*data->points_size); + data->poly->strokes = 0; +} + +gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize) +{ + polywriter_t writer; + gfxpolywriter_init(&writer); + writer.setgridsize(&writer, gridsize); + convert_gfxline(line, &writer, gridsize); + return (gfxpoly_t*)writer.finish(&writer); +} +gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize) +{ + polywriter_t writer; + gfxpolywriter_init(&writer); + writer.setgridsize(&writer, gridsize); + convert_file(filename, &writer, gridsize); + return (gfxpoly_t*)writer.finish(&writer); +} +void gfxpoly_destroy(gfxpoly_t*poly) +{ + int t; + gfxpolystroke_t*stroke = poly->strokes; + while(stroke) { + gfxpolystroke_t*next = stroke->next; + free(stroke->points); + free(stroke); + stroke = next; + } + free(poly); +} + +typedef struct _polydraw_internal +{ + double lx, ly; + int32_t lastx, lasty; + int32_t x0, y0; + double z; + char last; + polywriter_t writer; +} polydraw_internal_t; + +static void polydraw_moveTo(gfxdrawer_t*d, gfxcoord_t _x, gfxcoord_t _y) +{ + polydraw_internal_t*i = (polydraw_internal_t*)d->internal; + int32_t x = convert_coord(_x, i->z); + int32_t y = convert_coord(_y, i->z); + if(i->lastx != x || i->lasty != y) { + i->writer.moveto(&i->writer, x, y); + } + i->lx = _x; + i->ly = _y; + i->x0 = x; + i->y0 = y; + i->lastx = x; + i->lasty = y; + i->last = 1; +} +static void polydraw_lineTo(gfxdrawer_t*d, gfxcoord_t _x, gfxcoord_t _y) +{ + polydraw_internal_t*i = (polydraw_internal_t*)d->internal; + if(!i->last) { + polydraw_moveTo(d, _x, _y); + return; + } + int32_t x = convert_coord(_x, i->z); + int32_t y = convert_coord(_y, i->z); + if(i->lastx != x || i->lasty != y) { + i->writer.lineto(&i->writer, x, y); + } + i->lx = _x; + i->ly = _y; + i->lastx = x; + i->lasty = y; + i->last = 1; +} +static void polydraw_splineTo(gfxdrawer_t*d, gfxcoord_t sx, gfxcoord_t sy, gfxcoord_t x, gfxcoord_t y) +{ + polydraw_internal_t*i = (polydraw_internal_t*)d->internal; + if(!i->last) { + polydraw_moveTo(d, x, y); + return; + } + double c = fabs(x-2*sx+i->lx) + fabs(y-2*sy+i->ly); + int parts = (int)(sqrt(c)*SUBFRACTION); + if(!parts) parts = 1; + int t; + int32_t nx,ny; + for(t=0;tlx)/(double)(parts*parts), i->z); + ny = convert_coord((double)(t*t*y + 2*t*(parts-t)*sy + (parts-t)*(parts-t)*i->ly)/(double)(parts*parts), i->z); + if(nx != i->lastx || ny != i->lasty) { + i->writer.lineto(&i->writer, nx, ny); + i->lastx = nx; i->lasty = ny; + } + } + nx = convert_coord(x,i->z); + ny = convert_coord(y,i->z); + if(nx != i->lastx || ny != i->lasty) { + i->writer.lineto(&i->writer, nx, ny); + } + i->lx = x; + i->ly = y; + i->lastx = nx; + i->lasty = ny; + i->last = 1; +} +static void polydraw_close(gfxdrawer_t*d) +{ + polydraw_internal_t*i = (polydraw_internal_t*)d->internal; + assert(!(i->last && (i->x0 == INVALID_COORD || i->y0 == INVALID_COORD))); + if(!i->last) + return; + if(i->lastx != i->x0 || i->lasty != i->y0) { + i->writer.lineto(&i->writer, i->x0, i->y0); + i->lastx = i->x0; + i->lasty = i->y0; + } + i->last = 0; + i->x0 = INVALID_COORD; + i->y0 = INVALID_COORD; +} +static void* polydraw_result(gfxdrawer_t*d) +{ + polydraw_internal_t*i = (polydraw_internal_t*)d->internal; + void*result = i->writer.finish(&i->writer); + rfx_free(i); + memset(d, 0, sizeof(gfxdrawer_t)); + return result; +} + +void gfxdrawer_target_poly(gfxdrawer_t*d, double gridsize) +{ + polydraw_internal_t*i = (polydraw_internal_t*)rfx_calloc(sizeof(polydraw_internal_t)); + d->internal = i; + i->lastx = INVALID_COORD; // convert_coord can never return this value + i->lasty = INVALID_COORD; + i->x0 = INVALID_COORD; + i->y0 = INVALID_COORD; + d->moveTo = polydraw_moveTo; + d->lineTo = polydraw_lineTo; + d->splineTo = polydraw_splineTo; + d->close = polydraw_close; + d->result = polydraw_result; + gfxpolywriter_init(&i->writer); + i->writer.setgridsize(&i->writer, gridsize); + i->z = 1.0 / gridsize; +} + +#if 0 +gfxline_t*gfxline_from_gfxpoly(gfxpoly_t*poly) +{ + gfxpolystroke_t*stroke; + int count = 0; + for(stroke=poly->strokes;stroke;stroke=stroke->next) { + assert(stroke->num_points); + count += stroke->num_points; + } + if(!count) return 0; + gfxline_t*l = malloc(sizeof(gfxline_t)*count); + count = 0; + /* TODO: it might make sense to concatenate strokes */ + for(stroke=poly->strokes;stroke;stroke=stroke->next) { + int t; + for(t=0;tnum_points;t++) { + l[count+t].x = stroke->points[t].x * poly->gridsize; + l[count+t].y = stroke->points[t].y * poly->gridsize; + l[count+t].type = gfx_lineTo; + l[count+t].next = &l[count+t+1]; + } + l[count].type = gfx_moveTo; + count+=stroke->num_points; + } + l[count-1].next = 0; + return l; +} +#endif + +static gfxline_t*mkgfxline(gfxpoly_t*poly, char preserve_direction) +{ + gfxpolystroke_t*stroke; + int count = 0; + if(!poly->strokes) + return 0; + dict_t*d = dict_new2(&point_type); + dict_t*todo = dict_new2(&ptr_type); + gfxpolystroke_t*stroke_min= poly->strokes; + int32_t x_min=stroke_min->points[0].x; + int32_t y_min=stroke_min->points[0].y; + for(stroke=poly->strokes;stroke;stroke=stroke->next) { + dict_put(todo, stroke, stroke); + assert(stroke->num_points>1); + count += stroke->num_points; + if(stroke->dir == DIR_UP) { + dict_put(d, &stroke->points[stroke->num_points-1], stroke); + if(!preserve_direction) + dict_put(d, &stroke->points[0], stroke); + } else { + dict_put(d, &stroke->points[0], stroke); + if(!preserve_direction) + dict_put(d, &stroke->points[stroke->num_points-1], stroke); + } + if(stroke->points[0].y < y_min || + (stroke->points[0].y == y_min && stroke->points[0].x < x_min)) { + y_min = stroke->points[0].y; + stroke_min = stroke; + } + } + gfxpolystroke_t*next_todo = poly->strokes; + gfxline_t*l = malloc(sizeof(gfxline_t)*count); + count = 0; + stroke = stroke_min; + + point_t last = {INVALID_COORD, INVALID_COORD}; + char should_connect = 0; + while(stroke) { + if(stroke && !preserve_direction) { + char del1 = dict_del2(d, &stroke->points[0], stroke); + char del2 = dict_del2(d, &stroke->points[stroke->num_points-1], stroke); + assert(del1 && del2); + } + assert(dict_contains(todo, stroke)); + int t; + int pos = 0; + int incr = 1; + if(preserve_direction) { + if(stroke->dir == DIR_UP) { + pos = stroke->num_points-1; + incr = -1; + } + } else { + // try to find matching point on either end. + // Prefer downward. + if(last.x == stroke->points[stroke->num_points-1].x && + last.y == stroke->points[stroke->num_points-1].y) { + pos = stroke->num_points-1; + incr = -1; + } + } + if(last.x != stroke->points[pos].x || last.y != stroke->points[pos].y) { + l[count].x = stroke->points[pos].x * poly->gridsize; + l[count].y = stroke->points[pos].y * poly->gridsize; + l[count].type = gfx_moveTo; + l[count].next = &l[count+1]; + count++; + assert(!should_connect); + } + pos += incr; + for(t=1;tnum_points;t++) { + l[count].x = stroke->points[pos].x * poly->gridsize; + l[count].y = stroke->points[pos].y * poly->gridsize; + l[count].type = gfx_lineTo; + l[count].next = &l[count+1]; + count++; + pos += incr; + } + last = stroke->points[pos-incr]; + char del = dict_del(todo, stroke); + assert(del); + assert(!dict_contains(todo, stroke)); + + /* try to find a poly which starts at the point we drew last */ + stroke = dict_lookup(d, &last); + should_connect = 1; + while(!dict_contains(todo, stroke)) { + should_connect = 0; + stroke = next_todo; + if(!next_todo) { + stroke = 0; + break; + } + next_todo = next_todo->next; + } + } + l[count-1].next = 0; + dict_destroy(todo); + dict_destroy(d); + return l; +} + +gfxline_t*gfxline_from_gfxpoly(gfxpoly_t*poly) +{ + return mkgfxline(poly, 0); +} + +gfxline_t*gfxline_from_gfxpoly_with_direction(gfxpoly_t*poly) +{ + return mkgfxline(poly, 1); +} + +static windcontext_t onepolygon = {1}; +gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize) +{ + gfxpoly_t*poly = gfxpoly_from_fill(line, gridsize); + gfxpoly_t*poly2 = gfxpoly_process(poly, 0, &windrule_circular, &onepolygon); + gfxline_t*line2 = gfxline_from_gfxpoly(poly2); + gfxpoly_destroy(poly); + gfxpoly_destroy(poly2); + return line2; +} + +gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize) +{ + gfxline_t* line = gfxline_makerectangle(x1, y1, x2, y2); + gfxpoly_t* poly = gfxpoly_from_fill(line, gridsize); + gfxline_free(line); + return poly; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h new file mode 100644 index 000000000..c02e38581 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h @@ -0,0 +1,30 @@ +#ifndef __poly_convert_h__ +#define __poly_convert_h__ + +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "poly.h" + +typedef struct _polywriter +{ + void(*moveto)(struct _polywriter*, int32_t x, int32_t y); + void(*lineto)(struct _polywriter*, int32_t x, int32_t y); + void(*setgridsize)(struct _polywriter*, double g); + void*(*finish)(struct _polywriter*); + void*internal; +} polywriter_t; + +void gfxdrawer_target_poly(gfxdrawer_t*d, double gridsize); + +void gfxpolywriter_init(polywriter_t*w); +gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize); +gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize); +void gfxpoly_destroy(gfxpoly_t*poly); + +gfxline_t*gfxline_from_gfxpoly(gfxpoly_t*poly); +gfxline_t*gfxline_from_gfxpoly_with_direction(gfxpoly_t*poly); // preserves up/down + +gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize); +gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize); + +#endif //__poly_convert_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h new file mode 100644 index 000000000..7987337d4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h @@ -0,0 +1,74 @@ +/* heap.h + + An inline heap implementation + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#define HEAP_DEFINE(name,t,lt) \ +typedef struct { \ + t**elements; \ + int size; \ + int max_size; \ +} name##_t; \ +static void name##_put(name##_t*h, t*e) \ +{ \ + int parent = h->size++; \ + if(h->size>=h->max_size) { \ + h->max_size = h->max_size<15?15:(h->max_size+1)*2-1; \ + h->elements = (t**)realloc(h->elements, \ + h->max_size*sizeof(t*)); \ + } \ + int node; \ + do { \ + node = parent; \ + if(!node) break; \ + parent = (node-1)/2; \ + h->elements[node] = h->elements[parent]; \ + } while(lt(e, h->elements[parent])); \ + h->elements[node] = e; \ +} \ +static t* name##_get(name##_t*h) \ +{ \ + if(!h->size) return 0; \ + t*r = h->elements[0]; \ + int node,child = 0; \ + t*node_p = h->elements[--h->size]; \ + h->elements[0] = node_p; /* for the size==1 case */ \ + do { \ + node = child; \ + child = node<<1|1; \ + if(child >= h->size) { \ + break; \ + } \ + if(child+1 < h->size && lt(h->elements[child+1], \ + h->elements[child])) \ + child++; \ + h->elements[node] = h->elements[child]; \ + } while(lt(h->elements[child],node_p)); \ + h->elements[node] = node_p; \ + return r; \ +} \ +static void name##_init(name##_t*h) \ +{ \ + memset(h, 0, sizeof(*h)); \ + h->max_size = 15; \ + h->elements = malloc(h->max_size*sizeof(t*)); \ +} \ +static void name##_destroy(name##_t*h) \ +{ \ + free((h)->elements); \ +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c new file mode 100644 index 000000000..d20bcd377 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c @@ -0,0 +1,1608 @@ +#include +#include +#include +#include "../mem.h" +#include "../types.h" +#include "poly.h" +#include "active.h" +#include "xrow.h" +#include "wind.h" +#include "convert.h" +#include "heap.h" + +#ifdef HAVE_MD5 +#include "MD5.h" +#endif + +static gfxpoly_t*current_polygon = 0; +void gfxpoly_fail(char*expr, char*file, int line, const char*function) +{ + if(!current_polygon) { + fprintf(stderr, "assert(%s) failed in %s in line %d: %s\n", expr, file, line, function); + exit(1); + } + + char filename[32+4+1]; +#ifdef HAVE_MD5 + void*md5 = initialize_md5(); + + int s,t; + gfxpolystroke_t*stroke = current_polygon->strokes; + for(;stroke;stroke=stroke->next) { + for(t=0;tnum_points;t++) { + update_md5(md5, (unsigned char*)&stroke->points[t].x, sizeof(stroke->points[t].x)); + update_md5(md5, (unsigned char*)&stroke->points[t].y, sizeof(stroke->points[t].y)); + } + } + unsigned char h[16]; + finish_md5(md5, h); + sprintf(filename, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x.ps", + h[0],h[1],h[2],h[3],h[4],h[5],h[6],h[7],h[8],h[9],h[10],h[11],h[12],h[13],h[14],h[15]); +#else + sprintf(filename, "%d", time(0)); +#endif + + fprintf(stderr, "assert(%s) failed in %s in line %d: %s\n", expr, file, line, function); + fprintf(stderr, "I'm saving a debug file \"%s\" to the current directory.\n", filename); + + gfxpoly_save(current_polygon, filename); + exit(1); +} + +static char point_equals(const void*o1, const void*o2) +{ + const point_t*p1 = o1; + const point_t*p2 = o2; + return p1->x == p2->x && p1->y == p2->y; +} +static unsigned int point_hash(const void*o) +{ + const point_t*p = o; + return p->x^p->y; +} +static void* point_dup(const void*o) +{ + const point_t*p = o; + point_t*n = malloc(sizeof(point_t)); + n->x = p->x; + n->y = p->y; + return n; +} +static void point_free(void*o) +{ + point_t*p = o; + p->x = 0; + p->y = 0; + free(p); +} +type_t point_type = { + equals: point_equals, + hash: point_hash, + dup: point_dup, + free: point_free, +}; + +typedef struct _event { + eventtype_t type; + point_t p; + segment_t*s1; + segment_t*s2; +} event_t; + +/* compare_events_simple differs from compare_events in that it schedules + events from left to right regardless of type. It's only used in horizontal + processing, in order to get an x-wise sorting of the current scanline */ +static inline int compare_events_simple(const void*_a,const void*_b) +{ + event_t* a = (event_t*)_a; + event_t* b = (event_t*)_b; + int d = b->p.y - a->p.y; + if(d) return d; + d = b->p.x - a->p.x; + if(d) return d; + return 0; +} + +static inline int compare_events(const void*_a,const void*_b) +{ + event_t* a = (event_t*)_a; + event_t* b = (event_t*)_b; + int d = b->p.y - a->p.y; + if(d) return d; + /* we need to schedule end after intersect (so that a segment about + to end has a chance to tear up a few other segs first) and start + events after end (in order not to confuse the intersection check, which + assumes there's an actual y overlap between active segments, and + because ending segments in the active list make it difficult to insert + starting segments at the right position)). + Horizontal lines come last, because the only purpose + they have is to create snapping coordinates for the segments (still) + existing in this scanline. + */ + d = b->type - a->type; + if(d) return d; + return 0; + + /* I don't see any reason why we would need to order by x- at least as long + as we do horizontal lines in a seperate pass */ + //d = b->p.x - a->p.x; + //return d; +} + +#define COMPARE_EVENTS(x,y) (compare_events(x,y)>0) +#define COMPARE_EVENTS_SIMPLE(x,y) (compare_events_simple(x,y)>0) +HEAP_DEFINE(queue,event_t,COMPARE_EVENTS); +HEAP_DEFINE(hqueue,event_t,COMPARE_EVENTS_SIMPLE); + +typedef struct _horizontal { + int32_t y; + int32_t x1, x2; + edgestyle_t*fs; + segment_dir_t dir; + int polygon_nr; + int xpos; + int pos; +} horizontal_t; + +typedef struct _horizdata { + horizontal_t*data; + int num; + int size; +} horizdata_t; + +typedef struct _status { + int32_t y; + double gridsize; + actlist_t*actlist; + queue_t queue; + xrow_t*xrow; + windrule_t*windrule; + windcontext_t*context; + segment_t*ending_segments; + + horizdata_t horiz; + + gfxpolystroke_t*strokes; +#ifdef CHECKS + dict_t*seen_crossings; //list of crossing we saw so far + dict_t*intersecting_segs; //list of segments intersecting in this scanline + dict_t*segs_with_point; //lists of segments that received a point in this scanline +#endif +} status_t; + + +int gfxpoly_num_segments(gfxpoly_t*poly) +{ + gfxpolystroke_t*stroke = poly->strokes; + int count = 0; + for(;stroke;stroke=stroke->next) { + count++; + } + return count; +} +int gfxpoly_size(gfxpoly_t*poly) +{ + int s,t; + int edges = 0; + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + edges += stroke->num_points-1; + } + return edges; +} + +char gfxpoly_check(gfxpoly_t*poly, char updown) +{ + dict_t*d1 = dict_new2(&point_type); + dict_t*d2 = dict_new2(&point_type); + int s,t; + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + /* In order to not confuse the fill/wind logic, existing segments must have + a non-zero edge style */ + assert(stroke->fs); + + /* put all the segments into dictionaries so that we can check + that the endpoint multiplicity is two */ + for(s=0;snum_points;s++) { + point_t p = stroke->points[s]; + int num_xor = (s>=1 && snum_points-1)?2:1; // mid points are two points (start+end) + int num_circ = (s>=1 && snum_points-1)?0:(s==0?1:-1); + if(stroke->dir==DIR_UP) + num_circ=-num_circ; + + if(!dict_contains(d1, &p)) { + dict_put(d1, &p, (void*)(ptroff_t)num_xor); + if(updown) { + assert(!dict_contains(d2, &p)); + dict_put(d2, &p, (void*)(ptroff_t)num_circ); + } + } else { + int count = (ptroff_t)dict_lookup(d1, &p); + dict_del(d1, &p); + count+=num_xor; + dict_put(d1, &p, (void*)(ptroff_t)count); + + if(updown) { + assert(dict_contains(d2, &p)); + count = (ptroff_t)dict_lookup(d2, &p); + dict_del(d2, &p); + count+=num_circ; + dict_put(d2, &p, (void*)(ptroff_t)count); + } + } + } + } + DICT_ITERATE_ITEMS(d1, point_t*, p1, void*, c1) { + int count = (ptroff_t)c1; + if(count&1) { + fprintf(stderr, "Error: Point (%.2f,%.2f) occurs %d times\n", p1->x * poly->gridsize, p1->y * poly->gridsize, count); + dict_destroy(d1); + dict_destroy(d2); + return 0; + } + } + if(updown) { + DICT_ITERATE_ITEMS(d2, point_t*, p2, void*, c2) { + int count = (ptroff_t)c2; + assert(dict_contains(d1, p2)); + int ocount = (ptroff_t)dict_lookup(d1, p2); + if(count!=0) { + if(count>0) fprintf(stderr, "Error: Point (%.2f,%.2f) has %d more incoming than outgoing segments (%d incoming, %d outgoing)\n", p2->x * poly->gridsize, p2->y * poly->gridsize, count, (ocount+count)/2, (ocount-count)/2); + if(count<0) fprintf(stderr, "Error: Point (%.2f,%.2f) has %d more outgoing than incoming segments (%d incoming, %d outgoing)\n", p2->x * poly->gridsize, p2->y * poly->gridsize, -count, (ocount+count)/2, (ocount-count)/2); + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + for(s=0;snum_points-1;s++) { + point_t a = stroke->points[s]; + point_t b = stroke->points[s+1]; + if(a.x == p2->x && a.y == p2->y || + b.x == p2->x && b.y == p2->y) { + fprintf(stderr, "%.2f,%.2f -> %.2f,%.2f\n", + a.x * poly->gridsize, + a.y * poly->gridsize, + b.x * poly->gridsize, + b.y * poly->gridsize); + } + } + } + dict_destroy(d2); + return 0; + } + } + } + dict_destroy(d1); + dict_destroy(d2); + return 1; +} + +void gfxpoly_dump(gfxpoly_t*poly) +{ + int s,t; + double g = poly->gridsize; + fprintf(stderr, "polyon %p (gridsize: %.2f)\n", poly, poly->gridsize); + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + fprintf(stderr, "%11p", stroke); + if(stroke->dir==DIR_UP) { + for(s=stroke->num_points-1;s>=1;s--) { + point_t a = stroke->points[s]; + point_t b = stroke->points[s-1]; + fprintf(stderr, "%s (%.2f,%.2f) -> (%.2f,%.2f)%s%s\n", s!=stroke->num_points-1?" ":"", a.x*g, a.y*g, b.x*g, b.y*g, + s==1?"]":"", a.y==b.y?"H":""); + } + } else { + for(s=0;snum_points-1;s++) { + point_t a = stroke->points[s]; + point_t b = stroke->points[s+1]; + fprintf(stderr, "%s (%.2f,%.2f) -> (%.2f,%.2f)%s%s\n", s?" ":"", a.x*g, a.y*g, b.x*g, b.y*g, + s==stroke->num_points-2?"]":"", a.y==b.y?"H":""); + } + } + } +} + +void gfxpoly_save(gfxpoly_t*poly, const char*filename) +{ + FILE*fi = fopen(filename, "wb"); + fprintf(fi, "%% gridsize %f\n", poly->gridsize); + fprintf(fi, "%% begin\n"); + int s,t; + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + fprintf(fi, "%g setgray\n", stroke->dir==DIR_UP ? 0.7 : 0); + point_t p = stroke->points[0]; + fprintf(fi, "%d %d moveto\n", p.x, p.y); + for(s=1;snum_points;s++) { + p = stroke->points[s]; + fprintf(fi, "%d %d lineto\n", p.x, p.y); + } + fprintf(fi, "stroke\n"); + } + fprintf(fi, "showpage\n"); + fclose(fi); +} + +void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename) +{ + FILE*fi = fopen(filename, "wb"); + fprintf(fi, "%% gridsize %f\n", poly->gridsize); + fprintf(fi, "%% begin\n"); + int t; + double l = 5.0 / poly->gridsize; + double g = poly->gridsize; + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + fprintf(fi, "0 setgray\n"); + + int s = stroke->dir==DIR_UP?stroke->num_points-1:0; + int end = stroke->dir==DIR_UP?-1:stroke->num_points; + int dir = stroke->dir==DIR_UP?-1:1; + + point_t p = stroke->points[s]; + s+=dir; + point_t o = p; + fprintf(fi, "%f %f moveto\n", p.x * g, p.y * g); + for(;s!=end;s+=dir) { + p = stroke->points[s]; + int lx = p.x - o.x; + int ly = p.y - o.y; + double d = sqrt(lx*lx+ly*ly); + if(!d) d=1; + else d = l / d; + double d2 = d*1.5; + fprintf(fi, "%f %f lineto\n", (p.x - lx*d2) * g, (p.y - ly*d2) * g); + fprintf(fi, "%f %f lineto\n", (p.x - lx*d2 + (ly*d))*g, + (p.y - ly*d2 - (lx*d))*g); + fprintf(fi, "%f %f lineto\n", p.x * g, p.y * g); + fprintf(fi, "%f %f lineto\n", (p.x - lx*d2 - (ly*d))*g, + (p.y - ly*d2 + (lx*d))*g); + fprintf(fi, "%f %f lineto\n", (p.x - lx*d2) * g, (p.y - ly*d2) * g); + fprintf(fi, "%f %f moveto\n", p.x * g, p.y * g); + o = p; + } + fprintf(fi, "stroke\n"); + } + fprintf(fi, "showpage\n"); + fclose(fi); +} + +inline static event_t* event_new() +{ + event_t*e = rfx_calloc(sizeof(event_t)); + return e; +} +inline static void event_free(event_t*e) +{ + free(e); +} + +static void event_dump(status_t*status, event_t*e) +{ + if(e->type == EVENT_HORIZONTAL) { + fprintf(stderr, "Horizontal [%d] (%.2f,%.2f) -> (%.2f,%.2f)\n", (int)e->s1->nr, + e->s1->a.x * status->gridsize, e->s1->a.y * status->gridsize, e->s1->b.x * status->gridsize, e->s1->b.y * status->gridsize); + } else if(e->type == EVENT_START) { + fprintf(stderr, "event: segment [%d] starts at (%.2f,%.2f)\n", (int)e->s1->nr, + e->p.x * status->gridsize, e->p.y * status->gridsize); + } else if(e->type == EVENT_END) { + fprintf(stderr, "event: segment [%d] ends at (%.2f,%.2f)\n", (int)e->s1->nr, + e->p.x * status->gridsize, e->p.y * status->gridsize); + } else if(e->type == EVENT_CROSS) { + fprintf(stderr, "event: segment [%d] and [%d] intersect at (%.2f,%.2f)\n", (int)e->s1->nr, (int)e->s2->nr, + e->p.x * status->gridsize, e->p.y * status->gridsize); + } else { + assert(0); + } +} + +static inline int32_t max32(int32_t v1, int32_t v2) {return v1>v2?v1:v2;} +static inline int32_t min32(int32_t v1, int32_t v2) {return v1(%d,%d) ", (int)s->nr, s->a.x, s->a.y, s->b.x, s->b.y); + fprintf(stderr, " dx:%d dy:%d k:%f dx/dy=%f fs=%p\n", s->delta.x, s->delta.y, s->k, + (double)s->delta.x / s->delta.y, s->fs); +} + +static void segment_init(segment_t*s, int32_t x1, int32_t y1, int32_t x2, int32_t y2, int polygon_nr, segment_dir_t dir) +{ + static int segment_count=0; + s->nr = segment_count++; + s->dir = dir; + if(y1!=y2) { + assert(y1x2) { + s->dir = DIR_INVERT(s->dir); + int32_t x = x1;x1=x2;x2=x; + int32_t y = y1;y1=y2;y2=y; + } +#ifdef DEBUG + fprintf(stderr, "Scheduling horizontal segment [%d] (%.2f,%.2f) -> (%.2f,%.2f) %s\n", + segment_count, + x1 * 0.05, y1 * 0.05, x2 * 0.05, y2 * 0.05, s->dir==DIR_UP?"up":"down"); +#endif + } + s->a.x = x1; + s->a.y = y1; + s->b.x = x2; + s->b.y = y2; + s->k = (double)x1*y2-(double)x2*y1; + s->left = s->right = 0; + s->delta.x = x2-x1; + s->delta.y = y2-y1; + s->minx = min32(x1,x2); + s->maxx = max32(x1,x2); + + s->pos = s->a; + s->polygon_nr = polygon_nr; + +#ifdef CHECKS + /* notice: on some systems (with some compilers), for the line + (1073741823,-1073741824)->(1073741823,1073741823) + we get LINE_EQ(s->a, s) == 1. + That's why we now clamp to 26 bit. + */ + assert(LINE_EQ(s->a, s) == 0); + assert(LINE_EQ(s->b, s) == 0); + + /* check that all signs are in order: + a a + |\ /| + | \ / | + minx-b b--maxx + < 0 > 0 + */ + point_t p = s->b; + p.x = min32(s->a.x, s->b.x); + assert(LINE_EQ(p, s) <= 0); + p.x = max32(s->a.x, s->b.x); + assert(LINE_EQ(p, s) >= 0); +#endif + +#ifndef DONT_REMEMBER_CROSSINGS + dict_init2(&s->scheduled_crossings, &ptr_type, 0); +#endif +} + +static segment_t* segment_new(point_t a, point_t b, int polygon_nr, segment_dir_t dir) +{ + segment_t*s = (segment_t*)rfx_calloc(sizeof(segment_t)); + segment_init(s, a.x, a.y, b.x, b.y, polygon_nr, dir); + return s; +} + +static void segment_clear(segment_t*s) +{ +#ifndef DONT_REMEMBER_CROSSINGS + dict_clear(&s->scheduled_crossings); +#endif +} +static void segment_destroy(segment_t*s) +{ + segment_clear(s); + free(s); +} + +static void advance_stroke(queue_t*queue, hqueue_t*hqueue, gfxpolystroke_t*stroke, int polygon_nr, int pos, double gridsize) +{ + if(!stroke) + return; + segment_t*s = 0; + /* we need to queue multiple segments at once because we need to process start events + before horizontal events */ + while(pos < stroke->num_points-1) { + assert(stroke->points[pos].y <= stroke->points[pos+1].y); + s = segment_new(stroke->points[pos], stroke->points[pos+1], polygon_nr, stroke->dir); + s->fs = stroke->fs; + pos++; + s->stroke = 0; + s->stroke_pos = 0; +#ifdef DEBUG + /*if(l->tmp) + s->nr = l->tmp;*/ + fprintf(stderr, "[%d] (%.2f,%.2f) -> (%.2f,%.2f) %s (stroke %p, %d more to come)\n", + s->nr, s->a.x * gridsize, s->a.y * gridsize, + s->b.x * gridsize, s->b.y * gridsize, + s->dir==DIR_UP?"up":"down", stroke, stroke->num_points - 1 - pos); +#endif + event_t* e = event_new(); + e->type = s->delta.y ? EVENT_START : EVENT_HORIZONTAL; + e->p = s->a; + e->s1 = s; + e->s2 = 0; + + if(queue) queue_put(queue, e); + else hqueue_put(hqueue, e); + + if(e->type != EVENT_HORIZONTAL) { + break; + } + } + if(s) { + s->stroke = stroke; + s->stroke_pos = pos; + } +} + +static void gfxpoly_enqueue(gfxpoly_t*p, queue_t*queue, hqueue_t*hqueue, int polygon_nr) +{ + int t; + gfxpolystroke_t*stroke = p->strokes; + for(;stroke;stroke=stroke->next) { + assert(stroke->num_points > 1); + +#ifdef CHECKS + int s; + for(s=0;snum_points-1;s++) { + assert(stroke->points[s].y <= stroke->points[s+1].y); + } +#endif + advance_stroke(queue, hqueue, stroke, polygon_nr, 0, p->gridsize); + } +} + +static void schedule_endpoint(status_t*status, segment_t*s) +{ + // schedule end point of segment + assert(s->b.y > status->y); + event_t*e = event_new(); + e->type = EVENT_END; + e->p = s->b; + e->s1 = s; + e->s2 = 0; + queue_put(&status->queue, e); +} + +static void schedule_crossing(status_t*status, segment_t*s1, segment_t*s2) +{ + /* the code that's required (and the checks you can perform) before + it can be said with 100% certainty that we indeed have a valid crossing + amazes me every time. -mk */ +#ifdef CHECKS + assert(s1!=s2); + assert(s1->right == s2); + assert(s2->left == s1); + int32_t miny1 = min32(s1->a.y,s1->b.y); + int32_t maxy1 = max32(s1->a.y,s1->b.y); + int32_t miny2 = min32(s2->a.y,s2->b.y); + int32_t maxy2 = max32(s2->a.y,s2->b.y); + int32_t minx1 = min32(s1->a.x,s1->b.x); + int32_t minx2 = min32(s2->a.x,s2->b.x); + int32_t maxx1 = max32(s1->a.x,s1->b.x); + int32_t maxx2 = max32(s2->a.x,s2->b.x); + /* check that precomputation is sane */ + assert(minx1 == s1->minx && minx2 == s2->minx); + assert(maxx1 == s1->maxx && maxx2 == s2->maxx); + /* both segments are active, so this can't happen */ + assert(!(maxy1 <= miny2 || maxy2 <= miny1)); + /* we know that right now, s2 is to the right of s1, so there's + no way the complete bounding box of s1 is to the right of s1 */ + assert(!(s1->minx > s2->maxx)); + assert(s1->minx != s2->maxx || (!s1->delta.x && !s2->delta.x)); +#endif + + if(s1->maxx <= s2->minx) { +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: bounding boxes don't intersect\n", s1->nr, s2->nr); +#endif + /* bounding boxes don't intersect */ + return; + } + +#ifndef DONT_REMEMBER_CROSSINGS + if(dict_contains(&s1->scheduled_crossings, (void*)(ptroff_t)s2->nr)) { + /* FIXME: this whole segment hashing thing is really slow */ +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: we already scheduled this intersection\n", s1->nr, s2->nr); +// DICT_ITERATE_KEY(&s1->scheduled_crossings, void*, x) { +// fprintf(stderr, "[%d]<->[%d]\n", s1->nr, (int)(ptroff_t)x); +// } +#endif + return; // we already know about this one + } +#endif + + double det = (double)s1->delta.x*s2->delta.y - (double)s1->delta.y*s2->delta.x; + if(!det) { + if(s1->k == s2->k) { + // lines are exactly on top of each other (ignored) +#ifdef DEBUG + fprintf(stderr, "Notice: segments [%d] and [%d] are exactly on top of each other\n", s1->nr, s2->nr); +#endif + return; + } else { +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: they are parallel to each other\n", s1->nr, s2->nr); +#endif + /* lines are parallel */ + return; + } + } + + double asign2 = LINE_EQ(s1->a, s2); + if(asign2==0) { + // segment1 touches segment2 in a single point (ignored) +#ifdef DEBUG + fprintf(stderr, "Notice: segment [%d]'s start point touches segment [%d]\n", s1->nr, s2->nr); +#endif + return; + } + double bsign2 = LINE_EQ(s1->b, s2); + if(bsign2==0) { + // segment1 touches segment2 in a single point (ignored) +#ifdef DEBUG + fprintf(stderr, "Notice: segment [%d]'s end point touches segment [%d]\n", s1->nr, s2->nr); +#endif + return; + } + + if(asign2<0 && bsign2<0) { + // segment1 is completely to the left of segment2 +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s1->nr, s2->nr); +#endif + return; + } + if(asign2>0 && bsign2>0) { + // segment1 is completely to the right of segment2 +#ifndef DONT_REMEMBER_CROSSINGS + assert(0); +#endif +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s2->nr, s1->nr); +#endif + return; + } + + double asign1 = LINE_EQ(s2->a, s1); + if(asign1==0) { + // segment2 touches segment1 in a single point (ignored) +#ifdef DEBUG + fprintf(stderr, "Notice: segment [%d]'s start point touches segment [%d]\n", s2->nr, s1->nr); +#endif + return; + } + double bsign1 = LINE_EQ(s2->b, s1); + if(asign2==0) { + // segment2 touches segment1 in a single point (ignored) +#ifdef DEBUG + fprintf(stderr, "Notice: segment [%d]'s end point touches segment [%d]\n", s2->nr, s1->nr); +#endif + return; + } + + if(asign1<0 && bsign1<0) { + // segment2 is completely to the left of segment1 +#ifndef DONT_REMEMBER_CROSSINGS + assert(0); +#endif +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s1->nr, s2->nr); +#endif + return; + } + if(asign1>0 && bsign1>0) { + // segment2 is completely to the right of segment1 +#ifdef DEBUG + fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s2->nr, s1->nr); +#endif + return; + } + +#ifdef DONT_REMEMBER_CROSSINGS + /* s2 crosses s1 from *left* to *right*. This is a crossing we already processed- + there's not way s2 would be to the left of s1 otherwise */ + if(asign1<0 && bsign1>0) return; + if(asign2>0 && bsign2<0) return; +#endif + + assert(!(asign1<0 && bsign1>0)); + assert(!(asign2>0 && bsign2<0)); + + /* TODO: should we precompute these? */ + double la = (double)s1->a.x*(double)s1->b.y - (double)s1->a.y*(double)s1->b.x; + double lb = (double)s2->a.x*(double)s2->b.y - (double)s2->a.y*(double)s2->b.x; + + point_t p; + p.x = (int32_t)ceil((-la*s2->delta.x + lb*s1->delta.x) / det); + p.y = (int32_t)ceil((+lb*s1->delta.y - la*s2->delta.y) / det); + + assert(p.y >= status->y); +#ifdef CHECKS + assert(p.x >= s1->minx && p.x <= s1->maxx); + assert(p.x >= s2->minx && p.x <= s2->maxx); + + point_t pair; + pair.x = s1->nr; + pair.y = s2->nr; +#ifndef DONT_REMEMBER_CROSSINGS + assert(!dict_contains(status->seen_crossings, &pair)); + dict_put(status->seen_crossings, &pair, 0); +#endif +#endif +#ifdef DEBUG + fprintf(stderr, "schedule crossing between [%d] and [%d] at (%d,%d)\n", s1->nr, s2->nr, p.x, p.y); +#endif + +#ifndef DONT_REMEMBER_CROSSINGS + /* we insert into each other's intersection history because these segments might switch + places and we still want to look them up quickly after they did */ + dict_put(&s1->scheduled_crossings, (void*)(ptroff_t)(s2->nr), 0); + dict_put(&s2->scheduled_crossings, (void*)(ptroff_t)(s1->nr), 0); +#endif + + event_t* e = event_new(); + e->type = EVENT_CROSS; + e->p = p; + e->s1 = s1; + e->s2 = s2; + queue_put(&status->queue, e); + return; +} + +static void exchange_two(status_t*status, event_t*e) +{ + //exchange two segments in list + segment_t*s1 = e->s1; + segment_t*s2 = e->s2; +#ifdef CHECKS + if(!dict_contains(status->intersecting_segs, s1)) + dict_put(status->intersecting_segs, s1, 0); + if(!dict_contains(status->intersecting_segs, s2)) + dict_put(status->intersecting_segs, s2, 0); +#endif + assert(s2->left == s1); + assert(s1->right == s2); + actlist_swap(status->actlist, s1, s2); + assert(s2->right == s1); + assert(s1->left == s2); + segment_t*left = s2->left; + segment_t*right = s1->right; + if(left) + schedule_crossing(status, left, s2); + if(right) + schedule_crossing(status, s1, right); +} + +typedef struct _box { + point_t left1, left2, right1, right2; +} box_t; +static inline box_t box_new(int32_t x, int32_t y) +{ + box_t box; + box.right1.x = box.right2.x = x; + box.left1.x = box.left2.x = x-1; + box.left1.y = box.right1.y = y-1; + box.left2.y = box.right2.y = y; + return box; +} + +static void store_horizontal(status_t*status, point_t p1, point_t p2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr); + +static void append_stroke(status_t*status, point_t a, point_t b, segment_dir_t dir, edgestyle_t*fs) +{ + gfxpolystroke_t*stroke = status->strokes; + /* find a stoke to attach this segment to. It has to have an endpoint + matching our start point, and a matching edgestyle */ + while(stroke) { + point_t p = stroke->points[stroke->num_points-1]; + if(p.x == a.x && p.y == a.y && stroke->fs == fs && stroke->dir == dir) + break; + stroke = stroke->next; + } + if(!stroke) { + stroke = rfx_calloc(sizeof(gfxpolystroke_t)); + stroke->dir = dir; + stroke->fs = fs; + stroke->next = status->strokes; + status->strokes = stroke; + stroke->points_size = 2; + stroke->points = rfx_calloc(sizeof(point_t)*stroke->points_size); + stroke->points[0] = a; + stroke->num_points = 1; + } else if(stroke->num_points == stroke->points_size) { + assert(stroke->fs); + stroke->points_size *= 2; + stroke->points = rfx_realloc(stroke->points, sizeof(point_t)*stroke->points_size); + } + stroke->points[stroke->num_points++] = b; +} + +static void insert_point_into_segment(status_t*status, segment_t*s, point_t p) +{ + assert(s->pos.x != p.x || s->pos.y != p.y); + +#ifdef CHECKS + if(!dict_contains(status->segs_with_point, s)) + dict_put(status->segs_with_point, s, 0); + assert(s->fs_out_ok); +#endif + + if(s->pos.y != p.y) { + /* non horizontal line- copy to output */ + if(s->fs_out) { + segment_dir_t dir = s->wind.is_filled?DIR_DOWN:DIR_UP; +#ifdef DEBUG + fprintf(stderr, "[%d] receives next point (%.2f,%.2f)->(%.2f,%.2f) (drawing (%s))\n", s->nr, + s->pos.x * status->gridsize, s->pos.y * status->gridsize, + p.x * status->gridsize, p.y * status->gridsize, + dir==DIR_UP?"up":"down" + ); +#endif + assert(s->pos.y != p.y); + append_stroke(status, s->pos, p, dir, s->fs_out); + } else { +#ifdef DEBUG + fprintf(stderr, "[%d] receives next point (%.2f,%.2f) (omitting)\n", s->nr, + p.x * status->gridsize, + p.y * status->gridsize); +#endif + } + } else { + /* horizontal line. we need to look at this more closely at the end of this + scanline */ + store_horizontal(status, s->pos, p, s->fs, s->dir, s->polygon_nr); + } + + s->pos = p; +} + +typedef struct _segrange { + double xmin; + segment_t*segmin; + double xmax; + segment_t*segmax; +} segrange_t; + +static void segrange_adjust_endpoints(segrange_t*range, int32_t y) +{ +#define XPOS_EQ(s1,s2,ypos) (XPOS((s1),(ypos))==XPOS((s2),(ypos))) + segment_t*min = range->segmin; + segment_t*max = range->segmax; + + /* we need this because if two segments intersect exactly on + the scanline, segrange_test_segment_{min,max} can't tell which + one is smaller/larger */ + if(min) while(min->left && XPOS_EQ(min, min->left, y)) { + min = min->left; + } + if(max) while(max->right && XPOS_EQ(max, max->right, y)) { + max = max->right; + } + range->segmin = min; + range->segmax = max; +} +static void segrange_test_segment_min(segrange_t*range, segment_t*seg, int32_t y) +{ + if(!seg) return; + /* we need to calculate the xpos anew (and can't use start coordinate or + intersection coordinate), because we need the xpos exactly at the end of + this scanline. + */ + double x = XPOS(seg, y); + if(!range->segmin || xxmin) { + range->segmin = seg; + range->xmin = x; + } +} +static void segrange_test_segment_max(segrange_t*range, segment_t*seg, int32_t y) +{ + if(!seg) return; + double x = XPOS(seg, y); + if(!range->segmax || x>range->xmax) { + range->segmax = seg; + range->xmax = x; + } +} + +/* + SLOPE_POSITIVE: + \+ \ + +------ I \I + -I\---- I + I \ --I\--- + I \ I \ ------- + + \ + \ +*/ +static void add_points_to_positively_sloped_segments(status_t*status, int32_t y, segrange_t*range) +{ + segment_t*first=0, *last = 0; + int t; + for(t=0;txrow->num;t++) { + box_t box = box_new(status->xrow->x[t], y); + segment_t*seg = actlist_find(status->actlist, box.left2, box.left2); + + seg = actlist_right(status->actlist, seg); + while(seg) { + if(seg->a.y == y) { + // this segment started in this scanline, ignore it + seg->changed = 1;last = seg;if(!first) {first=seg;} + } else if(seg->delta.x <= 0) { + // ignore segment w/ negative slope + } else { + last = seg;if(!first) {first=seg;} + double d1 = LINE_EQ(box.right1, seg); + double d2 = LINE_EQ(box.right2, seg); + if(d1>0 || d2>=0) { + seg->changed = 1; + insert_point_into_segment(status, seg, box.right2); + } else { + /* we unfortunately can't break here- the active list is sorted according + to the *bottom* of the scanline. hence pretty much everything that's still + coming might reach into our box */ + //break; + } + } + seg = seg->right; + } + } + segrange_test_segment_min(range, first, y); + segrange_test_segment_max(range, last, y); +} +/* SLOPE_NEGATIVE: + | + /| + / / + | I / | I / / + | I / | I/ / + | I/ | I / + | I | /I / + | /+ |/ + / +*/ +static void add_points_to_negatively_sloped_segments(status_t*status, int32_t y, segrange_t*range) +{ + segment_t*first=0, *last = 0; + int t; + for(t=status->xrow->num-1;t>=0;t--) { + box_t box = box_new(status->xrow->x[t], y); + segment_t*seg = actlist_find(status->actlist, box.right2, box.right2); + + while(seg) { + if(seg->a.y == y) { + // this segment started in this scanline, ignore it + seg->changed = 1;last = seg;if(!first) {first=seg;} + } else if(seg->delta.x > 0) { + // ignore segment w/ positive slope + } else { + last = seg;if(!first) {first=seg;} + double d1 = LINE_EQ(box.left1, seg); + double d2 = LINE_EQ(box.left2, seg); + if(d1<0 || d2<0) { + seg->changed = 1; + insert_point_into_segment(status, seg, box.right2); + } else { + //break; + } + } + seg = seg->left; + } + } + segrange_test_segment_min(range, last, y); + segrange_test_segment_max(range, first, y); +} + +/* segments ending in the current scanline need xrow treatment like everything else. + (consider an intersection taking place just above a nearly horizontal segment + ending on the current scanline- the intersection would snap down *below* the + ending segment if we don't add the intersection point to the latter right away) + we need to treat ending segments seperately, however. we have to delete them from + the active list right away to make room for intersect operations (which might + still be in the current scanline- consider two 45° polygons and a vertical polygon + intersecting on an integer coordinate). but once they're no longer in the active list, + we can't use the add_points_to_*_sloped_segments() functions anymore, and re-adding + them to the active list just for point snapping would be overkill. + (One other option to consider, however, would be to create a new active list only + for ending segments) +*/ +static void add_points_to_ending_segments(status_t*status, int32_t y) +{ + segment_t*seg = status->ending_segments; + while(seg) { + segment_t*next = seg->right;seg->right=0; + + assert(seg->b.y == status->y); + + if(status->xrow->num == 1) { + // shortcut + assert(seg->b.x == status->xrow->x[0]); + point_t p = {status->xrow->x[0], y}; + insert_point_into_segment(status, seg, p); + } else { + int t; + int start=0,end=status->xrow->num,dir=1; + if(seg->delta.x < 0) { + start = status->xrow->num-1; + end = dir = -1; + } +#ifdef CHECKS + char ok = 0; +#endif + for(t=start;t!=end;t+=dir) { + box_t box = box_new(status->xrow->x[t], y); + double d0 = LINE_EQ(box.left1, seg); + double d1 = LINE_EQ(box.left2, seg); + double d2 = LINE_EQ(box.right1, seg); + double d3 = LINE_EQ(box.right2, seg); + if(!(d0>=0 && d1>=0 && d2>=0 && d3>0 || + d0<=0 && d1<=0 && d2<=0 && d3<0)) { + insert_point_into_segment(status, seg, box.right2); + //break; +#ifdef CHECKS + ok = 1; +#endif + } + } + +#ifdef CHECKS + /* we *need* to find a point to insert. the segment's own end point + is in that list, for Pete's sake. */ + assert(ok); +#endif + } + // now that this is done, too, we can also finally free this segment + segment_destroy(seg); + seg = next; + } + status->ending_segments = 0; +} + +static void recalculate_windings(status_t*status, segrange_t*range) +{ +#ifdef DEBUG + fprintf(stderr, "range: [%d]..[%d]\n", SEGNR(range->segmin), SEGNR(range->segmax)); +#endif + segrange_adjust_endpoints(range, status->y); + + segment_t*s = range->segmin; + segment_t*end = range->segmax; + segment_t*last = 0; + +#ifdef DEBUG + s = actlist_leftmost(status->actlist); + while(s) { + fprintf(stderr, "[%d]%d%s ", s->nr, s->changed, + s == range->segmin?"S":( + s == range->segmax?"E":"")); + s = s->right; + } + fprintf(stderr, "\n"); + s = range->segmin; +#endif +#ifdef CHECKS + /* test sanity: verify that we don't have changed segments + outside of the given range */ + s = actlist_leftmost(status->actlist); + while(s && s!=range->segmin) { + assert(!s->changed); + s = s->right; + } + s = actlist_rightmost(status->actlist); + while(s && s!=range->segmax) { + assert(!s->changed); + s = s->left; + } + /* in check mode, go through the whole interval so we can test + that all polygons where the edgestyle changed also have seg->changed=1 */ + s = actlist_leftmost(status->actlist); + end = 0; +#endif + + if(end) + end = end->right; + while(s!=end) { +#ifndef CHECKS + if(s->changed) +#endif + { + segment_t* left = actlist_left(status->actlist, s); + windstate_t wind = left?left->wind:status->windrule->start(status->context); + s->wind = status->windrule->add(status->context, wind, s->fs, s->dir, s->polygon_nr); + edgestyle_t*fs_old = s->fs_out; + s->fs_out = status->windrule->diff(&wind, &s->wind); + +#ifdef DEBUG + fprintf(stderr, "[%d] dir=%s wind=%d wind.filled=%s fs_old/new=%s/%s %s\n", s->nr, s->dir==DIR_UP?"up":"down", s->wind.wind_nr, s->wind.is_filled?"fill":"nofill", + fs_old?"draw":"omit", s->fs_out?"draw":"omit", + fs_old!=s->fs_out?"CHANGED":""); +#endif + assert(!(!s->changed && fs_old!=s->fs_out)); + s->changed = 0; + +#ifdef CHECKS + s->fs_out_ok = 1; +#endif + } + s = s->right; + } +} + +/* we need to handle horizontal lines in order to add points to segments + we otherwise would miss during the windrule re-evaluation */ +static void intersect_with_horizontal(status_t*status, segment_t*h) +{ + segment_t* left = actlist_find(status->actlist, h->a, h->a); + segment_t* right = actlist_find(status->actlist, h->b, h->b); + + /* h->a.x is not strictly necessary, as it's also done by the event */ + xrow_add(status->xrow, h->a.x); + xrow_add(status->xrow, h->b.x); + + if(!right) { + assert(!left); + return; + } + + left = actlist_right(status->actlist, left); //first seg to the right of h->a + right = right->right; //first seg to the right of h->b + segment_t* s = left; + + point_t o = h->a; + while(s!=right) { + assert(s); + int32_t x = XPOS_INT(s, status->y); + point_t p = {x, status->y}; +#ifdef DEBUG + fprintf(stderr, "...intersecting with [%d] (%.2f,%.2f) -> (%.2f,%.2f) at (%.2f,%.2f)\n", + s->nr, + s->a.x * status->gridsize, s->a.y * status->gridsize, + s->b.x * status->gridsize, s->b.y * status->gridsize, + x * status->gridsize, status->y * status->gridsize + ); +#endif + assert(x >= h->a.x); + assert(x <= h->b.x); + assert(s->delta.x > 0 && x >= s->a.x || s->delta.x <= 0 && x <= s->a.x); + assert(s->delta.x > 0 && x <= s->b.x || s->delta.x <= 0 && x >= s->b.x); + xrow_add(status->xrow, x); + + o = p; + s = s->right; + } +} + +/* while, for a scanline, we need both starting as well as ending segments in order + to *reconstruct* horizontal lines, we only need one or the other to *process* + horizontal lines from the input data. + + So horizontal lines are processed twice: first they create hotpixels by intersecting + all segments on the scanline (EVENT_HORIZTONAL). Secondly, they are processed for + their actual content. The second also happens for all segments that received more than + one point in this scanline. +*/ +void horiz_reset(horizdata_t*horiz) +{ + horiz->num = 0; +} + +void horiz_destroy(horizdata_t*horiz) +{ + if(horiz->data) rfx_free(horiz->data); + horiz->data = 0; +} + +static windstate_t get_horizontal_first_windstate(status_t*status, int x1, int x2) +{ + point_t p1 = {x1,status->y}; + point_t p2 = {x2,status->y}; + segment_t*left = actlist_find(status->actlist, p1, p2); + + segment_t*a = actlist_right(status->actlist, left); + while(a) { + if(a->pos.y == status->y) { + /* we need to iterate through all segments that received a point in this + scanline, as actlist_find above will miss (positively sloped) segments + that are to the right of (x1,y) only as long as we don't take the + hotpixel re-routing into account + TODO: this is inefficient, we should probably be iterating through the + hotpixels on this scanline. + */ + if(a->pos.x == x1) + left = a; + if(a->pos.x > x1) + break; + } + a = a->right; + } + + assert(!left || left->fs_out_ok); +#ifdef DEBUG + fprintf(stderr, " fragment %.2f..%.2f\n", + x1 * status->gridsize, + x2 * status->gridsize); + if(left) { + fprintf(stderr, " segment [%d] (%.2f,%.2f -> %.2f,%2f, at %.2f,%.2f) is to the left\n", + SEGNR(left), + left->a.x * status->gridsize, + left->a.y * status->gridsize, + left->b.x * status->gridsize, + left->b.y * status->gridsize, + left->pos.x * status->gridsize, + left->pos.y * status->gridsize + ); + /* this segment might be a distance away from the left point + of the horizontal line if the horizontal line belongs to a stroke + with segments that just ended (so this horizontal line appears to + be "floating in space" from our current point of view) + assert(left->pos.y == h->y && left->pos.x == h->x1); + */ + } +#endif + return left?left->wind:status->windrule->start(status->context); +} + +static windstate_t process_horizontal_fragment(status_t*status, horizontal_t*h, int x1, int x2, windstate_t below) +{ + windstate_t above = status->windrule->add(status->context, below, h->fs, h->dir, h->polygon_nr); + edgestyle_t*fs = status->windrule->diff(&above, &below); + + segment_dir_t dir = above.is_filled?DIR_DOWN:DIR_UP; + point_t p1 = {x1,h->y}; + point_t p2 = {x2,h->y}; + + if(fs) { + //append_stroke(status, p1, p2, DIR_INVERT(h->dir), fs); + append_stroke(status, p1, p2, dir, fs); + } +#ifdef DEBUG + fprintf(stderr, " ...%s (below: (wind_nr=%d, filled=%d), above: (wind_nr=%d, filled=%d) %s %d-%d\n", + fs?"storing":"ignoring", + below.wind_nr, below.is_filled, + above.wind_nr, above.is_filled, + dir==DIR_UP?"up":"down", x1, x2); +#endif + return above; +} + +typedef enum {hevent_hotpixel,hevent_end,hevent_start} horizontal_event_type_t; +typedef struct _hevent { + int32_t x; + horizontal_t*h; + horizontal_event_type_t type; +} hevent_t; + +typedef struct _hevents { + hevent_t*events; + int num; +} hevents_t; + +static int compare_hevents(const void *_e1, const void *_e2) +{ + hevent_t*e1 = (hevent_t*)_e1; + hevent_t*e2 = (hevent_t*)_e2; + int diff = e1->x - e2->x; + if(diff) return diff; + return e1->type - e2->type; //schedule hotpixel before hend +} + +static hevents_t hevents_fill(status_t*status) +{ + horizdata_t*horiz = &status->horiz; + xrow_t*xrow = status->xrow; + + hevents_t e; + e.events = malloc(sizeof(hevent_t)*(horiz->num*2 + xrow->num)); + e.num = 0; + + int t; + for(t=0;tnum;t++) { + assert(horiz->data[t].x1 != horiz->data[t].x2); + e.events[e.num].x = horiz->data[t].x1; + e.events[e.num].h = &horiz->data[t]; + e.events[e.num].type = hevent_start; + e.num++; + e.events[e.num].x = horiz->data[t].x2; + e.events[e.num].h = &horiz->data[t]; + e.events[e.num].type = hevent_end; + e.num++; + } + for(t=0;tnum;t++) { + e.events[e.num].x = status->xrow->x[t]; + e.events[e.num].h = 0; + e.events[e.num].type = hevent_hotpixel; + e.num++; + } + qsort(e.events, e.num, sizeof(hevent_t), compare_hevents); + return e; + +} + +static void process_horizontals(status_t*status) +{ + horizdata_t*horiz = &status->horiz; + + if(!horiz->num) + return; + + hevents_t events = hevents_fill(status); + int num_open = 0; + horizontal_t**open = malloc(sizeof(horizontal_t*)*horiz->num); + + int s,t; + for(t=0;ttype) { + case hevent_start: + e->h->pos = num_open; + open[num_open++] = e->h; +#ifdef DEBUG + fprintf(stderr, "horizontal (y=%.2f): %.2f -> %.2f dir=%s fs=%p\n", + e->h->y * status->gridsize, + e->h->x1 * status->gridsize, + e->h->x2 * status->gridsize, + e->h->dir==DIR_UP?"up":"down", e->h->fs); +#endif + assert(e->h->y == status->y); + assert(xrow_contains(status->xrow, e->h->x1)); + assert(xrow_contains(status->xrow, e->h->x2)); + break; + case hevent_end: + num_open--; + if(num_open) { + open[num_open]->pos = e->h->pos; + open[e->h->pos] = open[num_open]; + } + break; + case hevent_hotpixel: + { + windstate_t below; + for(s=0;sxpos; + int x2 = e->x; + assert(status->y == open[s]->y); + if(!s) + below = get_horizontal_first_windstate(status, x1, x2); + open[s]->xpos = e->x; + assert(x1 < x2); + below = process_horizontal_fragment(status, open[s], x1, x2, below); + } + } + break; + } + } + free(open); + free(events.events); +} + +static void store_horizontal(status_t*status, point_t p1, point_t p2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr) +{ + assert(p1.y == p2.y); + assert(p1.x != p2.x); // TODO: can this happen? + + if(p1.x > p2.x) { + dir = DIR_INVERT(dir); + point_t p_1 = p1; + point_t p_2 = p2; + p1 = p_2; + p2 = p_1; + } + + /* TODO: convert this into a linked list */ + if(status->horiz.size == status->horiz.num) { + if(!status->horiz.size) + status->horiz.size = 16; + status->horiz.size *= 2; + status->horiz.data = rfx_realloc(status->horiz.data, sizeof(status->horiz.data[0])*status->horiz.size); + } + horizontal_t*h = &status->horiz.data[status->horiz.num++]; + h->y = p1.y; + h->xpos = p1.x; + h->x1 = p1.x; + h->x2 = p2.x; + h->fs = fs; + h->dir = dir; + h->polygon_nr = polygon_nr; +} + + +static void event_apply(status_t*status, event_t*e) +{ +#ifdef DEBUG + event_dump(status, e); +#endif + + switch(e->type) { + case EVENT_HORIZONTAL: { + segment_t*s = e->s1; + intersect_with_horizontal(status, s); + store_horizontal(status, s->a, s->b, s->fs, s->dir, s->polygon_nr); + advance_stroke(&status->queue, 0, s->stroke, s->polygon_nr, s->stroke_pos, status->gridsize); + segment_destroy(s);e->s1=0; + break; + } + case EVENT_END: { + //delete segment from list + segment_t*s = e->s1; +#ifdef CHECKS + dict_del(status->intersecting_segs, s); + dict_del(status->segs_with_point, s); + assert(!dict_contains(status->intersecting_segs, s)); + assert(!dict_contains(status->segs_with_point, s)); +#endif + segment_t*left = s->left; + segment_t*right = s->right; + actlist_delete(status->actlist, s); + if(left && right) + schedule_crossing(status, left, right); + + /* schedule segment for xrow handling */ + s->left = 0; s->right = status->ending_segments; + status->ending_segments = s; + advance_stroke(&status->queue, 0, s->stroke, s->polygon_nr, s->stroke_pos, status->gridsize); + break; + } + case EVENT_START: { + //insert segment into list + segment_t*s = e->s1; + assert(e->p.x == s->a.x && e->p.y == s->a.y); + actlist_insert(status->actlist, s->a, s->b, s); + segment_t*left = s->left; + segment_t*right = s->right; + if(left) + schedule_crossing(status, left, s); + if(right) + schedule_crossing(status, s, right); + schedule_endpoint(status, s); + break; + } + case EVENT_CROSS: { + // exchange two segments + if(e->s1->right == e->s2) { + assert(e->s2->left == e->s1); + exchange_two(status, e); + } else { + assert(e->s2->left != e->s1); +#ifdef DEBUG + fprintf(stderr, "Ignore this crossing ([%d] not next to [%d])\n", e->s1->nr, e->s2->nr); +#endif +#ifndef DONT_REMEMBER_CROSSINGS + /* ignore this crossing for now (there are some line segments in between). + it'll get rescheduled as soon as the "obstacles" are gone */ + char del1 = dict_del(&e->s1->scheduled_crossings, (void*)(ptroff_t)e->s2->nr); + char del2 = dict_del(&e->s2->scheduled_crossings, (void*)(ptroff_t)e->s1->nr); + assert(del1 && del2); +#endif +#ifdef CHECKS + point_t pair; + pair.x = e->s1->nr; + pair.y = e->s2->nr; +#ifndef DONT_REMEMBER_CROSSINGS + assert(dict_contains(status->seen_crossings, &pair)); + dict_del(status->seen_crossings, &pair); +#endif +#endif + } + } + } +} + +#ifdef CHECKS +static void check_status(status_t*status) +{ + DICT_ITERATE_KEY(status->intersecting_segs, segment_t*, s) { + if((s->pos.x != s->b.x || + s->pos.y != s->b.y) && + !dict_contains(status->segs_with_point, s)) { + fprintf(stderr, "Error: segment [%d] (%sslope) intersects in scanline %d, but it didn't receive a point\n", + SEGNR(s), + s->delta.x<0?"-":"+", + status->y); + assert(0); + } + } +} +#endif + +gfxpoly_t* gfxpoly_process(gfxpoly_t*poly1, gfxpoly_t*poly2, windrule_t*windrule, windcontext_t*context) +{ + current_polygon = poly1; + + status_t status; + memset(&status, 0, sizeof(status_t)); + status.gridsize = poly1->gridsize; + + queue_init(&status.queue); + gfxpoly_enqueue(poly1, &status.queue, 0, /*polygon nr*/0); + if(poly2) { + assert(poly1->gridsize == poly2->gridsize); + gfxpoly_enqueue(poly2, &status.queue, 0, /*polygon nr*/1); + } + + status.windrule = windrule; + status.context = context; + status.actlist = actlist_new(); + +#ifdef CHECKS + status.seen_crossings = dict_new2(&point_type); + int32_t lasty=-0x80000000; +#endif + + status.xrow = xrow_new(); + + event_t*e = queue_get(&status.queue); + while(e) { + assert(e->s1->fs); + status.y = e->p.y; +#ifdef CHECKS + assert(status.y>=lasty); + lasty = status.y; + status.intersecting_segs = dict_new2(&ptr_type); + status.segs_with_point = dict_new2(&ptr_type); +#endif + +#ifdef DEBUG + fprintf(stderr, "----------------------------------- %.2f\n", status.y * status.gridsize); + actlist_dump(status.actlist, status.y-1, status.gridsize); +#endif +#ifdef CHECKS + actlist_verify(status.actlist, status.y-1); +#endif + xrow_reset(status.xrow); + horiz_reset(&status.horiz); + + do { + xrow_add(status.xrow, e->p.x); + event_apply(&status, e); + event_free(e); + e = queue_get(&status.queue); + } while(e && status.y == e->p.y); + + xrow_sort(status.xrow); + segrange_t range; + memset(&range, 0, sizeof(range)); +#ifdef DEBUG + actlist_dump(status.actlist, status.y, status.gridsize); + xrow_dump(status.xrow, status.gridsize); +#endif + add_points_to_positively_sloped_segments(&status, status.y, &range); + add_points_to_negatively_sloped_segments(&status, status.y, &range); + add_points_to_ending_segments(&status, status.y); + + recalculate_windings(&status, &range); + + actlist_verify(status.actlist, status.y); + process_horizontals(&status); +#ifdef CHECKS + check_status(&status); + dict_destroy(status.intersecting_segs); + dict_destroy(status.segs_with_point); +#endif + } +#ifdef CHECKS + dict_destroy(status.seen_crossings); +#endif + actlist_destroy(status.actlist); + queue_destroy(&status.queue); + horiz_destroy(&status.horiz); + xrow_destroy(status.xrow); + + gfxpoly_t*p = (gfxpoly_t*)malloc(sizeof(gfxpoly_t)); + p->gridsize = poly1->gridsize; + p->strokes = status.strokes; + +#ifdef CHECKS + /* we only add segments with non-empty edgestyles to strokes in + recalculate_windings, but better safe than sorry */ + gfxpolystroke_t*stroke = p->strokes; + while(stroke) { + assert(stroke->fs); + stroke = stroke->next; + } +#endif + return p; +} + +static windcontext_t twopolygons = {2}; +gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2) +{ + return gfxpoly_process(p1, p2, &windrule_intersect, &twopolygons); +} +gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2) +{ + return gfxpoly_process(p1, p2, &windrule_union, &twopolygons); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h new file mode 100644 index 000000000..0017f8e8b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h @@ -0,0 +1,114 @@ +#ifndef __poly_h__ +#define __poly_h__ + +#include +#include "../q.h" +#include "../types.h" +#include "wind.h" + +/* features */ +#define SPLAY +#define DONT_REMEMBER_CROSSINGS + +typedef enum {EVENT_CROSS, EVENT_END, EVENT_START, EVENT_HORIZONTAL} eventtype_t; +typedef enum {SLOPE_POSITIVE, SLOPE_NEGATIVE} slope_t; + +#define INVALID_COORD (0x7fffffff) +typedef struct _point { + int32_t x; + int32_t y; +} point_t; +type_t point_type; + +#define SEGNR(s) ((int)((s)?(s)->nr:-1)) + +typedef struct _gfxpolystroke { + segment_dir_t dir; + edgestyle_t*fs; + int points_size; + int num_points; + point_t*points; + struct _gfxpolystroke*next; +} gfxpolystroke_t; +typedef struct _gfxpoly { + double gridsize; + gfxpolystroke_t*strokes; +} gfxpoly_t; + +typedef struct _segment { + point_t a; + point_t b; + point_t delta; + double k; //k = a.x*b.y-a.y*b.x = delta.y*a.x - delta.x*a.y (=0 for points on the segment) + int32_t minx, maxx; + + segment_dir_t dir; + edgestyle_t*fs; + edgestyle_t*fs_out; +#ifdef CHECKS + char fs_out_ok; +#endif + + int polygon_nr; + windstate_t wind; + ptroff_t nr; + +#ifdef SPLAY + struct _segment*parent; + struct _segment*leftchild; + struct _segment*rightchild; +#endif + struct _segment*left; + struct _segment*right; + char changed; + + point_t pos; + + gfxpolystroke_t*stroke; + int stroke_pos; + +#ifndef DONT_REMEMBER_CROSSINGS + dict_t scheduled_crossings; +#endif +} segment_t; + +#define LINE_EQ(p,s) ((double)(s)->delta.y*(p).x - (double)(s)->delta.x*(p).y - (s)->k) + +/* x1 + ((x2-x1)*(y-y1)) / dy = + (x1*(y2-y1) + (x2-x1)*(y-y1)) / dy = + (x1*(y2-y) + x2 *(y-y1)) / dy = + (x1*y2 - x2*y1 + x2*y - y*x1) / dy = + (k + x2*y - x1*y) / dy + (k + dx*y) / dy +*/ +//#define XPOS(s,ypos) ((s)->a.x + ((s)->delta.x * (double)((ypos) - (s)->a.y)) / (s)->delta.y) +#define XPOS(s,ypos) (((s)->k + (double)(s)->delta.x*ypos) / (s)->delta.y) + +#define XPOS_INT(s,ypos) ((int)ceil(XPOS((s),ypos))) +#define XDIFF(s1,s2,ypos) (((s1)->k + (double)(s1)->delta.x*ypos)*(s2)->delta.y - \ + ((s2)->k + (double)(s2)->delta.x*ypos)*(s1)->delta.y) + +void gfxpoly_fail(char*expr, char*file, int line, const char*function); + +char gfxpoly_check(gfxpoly_t*poly, char updown); +int gfxpoly_num_segments(gfxpoly_t*poly); +int gfxpoly_size(gfxpoly_t*poly); +void gfxpoly_dump(gfxpoly_t*poly); +void gfxpoly_save(gfxpoly_t*poly, const char*filename); +void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename); +gfxpoly_t* gfxpoly_process(gfxpoly_t*poly1, gfxpoly_t*poly2, windrule_t*windrule, windcontext_t*context); + +gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2); +gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2); + +#ifndef CHECKS +#ifdef assert +#undef assert +#endif +#define assert(x) +#else +#define assert(x) ((x)?0:gfxpoly_fail(__STRING(x), __FILE__, __LINE__, __PRETTY_FUNCTION__)) +#endif + + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c new file mode 100644 index 000000000..0edf5b1e4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c @@ -0,0 +1,400 @@ +#include +#include +#include +#include "renderpoly.h" + +typedef struct _renderpoint +{ + double x; + segment_dir_t dir; + edgestyle_t*fs; + int polygon_nr; +} renderpoint_t; + +typedef struct _renderline +{ + renderpoint_t*points; + int size; + int num; +} renderline_t; + +typedef struct _renderbuf +{ + intbbox_t bbox; + int width; + int height; + double zoom; + renderline_t*lines; +} renderbuf_t; + +static inline void add_pixel(renderbuf_t*buf, double x, int y, segment_dir_t dir, edgestyle_t*fs, int polygon_nr) +{ + renderpoint_t p; + p.x = x; + p.dir = dir; + p.fs = fs; + p.polygon_nr = polygon_nr; + + if(y >= buf->bbox.ymax || y < buf->bbox.ymin) + return; + + renderline_t*l = &buf->lines[y-buf->bbox.ymin]; + + if(l->num == l->size) { + l->size += 32; + l->points = (renderpoint_t*)rfx_realloc(l->points, l->size * sizeof(renderpoint_t)); + } + l->points[l->num] = p; + l->num++; +} +#define CUT 0.5 +static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr) +{ + x1 *= buf->zoom; + y1 *= buf->zoom; + x2 *= buf->zoom; + y2 *= buf->zoom; + double diffx, diffy; + double ny1, ny2, stepx; + + if(y2 < y1) { + dir ^= DIR_UP^DIR_DOWN; + double x,y; + x = x1;x1 = x2;x2=x; + y = y1;y1 = y2;y2=y; + } + + diffx = x2 - x1; + diffy = y2 - y1; + ny1 = floor(y1)+CUT; + ny2 = floor(y2)+CUT; + + if(ny1 < y1) { + ny1 = floor(y1) + 1.0 + CUT; + } + if(ny2 >= y2) { + ny2 = floor(y2) - 1.0 + CUT; + } + if(ny1 > ny2) + return; + + stepx = diffx/diffy; + x1 = x1 + (ny1-y1)*stepx; + x2 = x2 + (ny2-y2)*stepx; + + int posy=floor(ny1); + int endy=floor(ny2); + double posx=0; + double startx = x1; + + //printf("line %d from %f to %f dir=%s\n", polygon_nr, y1, y2, dir==DIR_UP?"up":"down"); + + while(posy<=endy) { + double xx = startx + posx; + add_pixel(buf, xx, posy, dir, fs, polygon_nr); + posx+=stepx; + posy++; + } +} + +static int compare_renderpoints(const void * _a, const void * _b) +{ + renderpoint_t*a = (renderpoint_t*)_a; + renderpoint_t*b = (renderpoint_t*)_b; + if(a->x < b->x) return -1; + if(a->x > b->x) return 1; + return 0; +} + +static void fill_bitwise(unsigned char*line, int x1, int x2) +{ + int p1 = x1>>3; + int p2 = x2>>3; + int b1 = 0xff >> (x1&7); + int b2 = 0xff << (1+7-(x2&7)); + if(p1==p2) { + line[p1] |= b1&b2; + } else { + line[p1] |= b1; + memset(&line[p1+1], 255, p2-(p1+1)); + line[p2] = b2; + } +} + +unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, windrule_t*rule, windcontext_t*context) +{ + renderbuf_t _buf, *buf=&_buf; + buf->width = (bbox->xmax - bbox->xmin); + buf->height = (bbox->ymax - bbox->ymin); + buf->bbox = *bbox; + buf->zoom = zoom * polygon->gridsize; + int width8 = (buf->width+7) >> 3; + char bleeding = 0; + unsigned char* image = (unsigned char*)malloc(width8*buf->height); + memset(image, 0, width8*buf->height); + + buf->lines = (renderline_t*)rfx_alloc(buf->height*sizeof(renderline_t)); + int y; + for(y=0;yheight;y++) { + memset(&buf->lines[y], 0, sizeof(renderline_t)); + buf->lines[y].points = 0; + buf->lines[y].num = 0; + } + + int polygon_nr = 0; + int s,t; + gfxpolystroke_t*stroke = polygon->strokes; + for(;stroke;stroke=stroke->next) { + for(t=0;tnum_points-1;t++) { + point_t a = stroke->points[t]; + point_t b = stroke->points[t+1]; + add_line(buf, a.x, a.y, b.x, b.y, stroke->fs, stroke->dir, polygon_nr); + } + } + + for(y=0;yheight;y++) { + renderpoint_t*points = buf->lines[y].points; + unsigned char*line = &image[width8*y]; + int n; + int num = buf->lines[y].num; + qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); + int lastx = 0; + + windstate_t fill = rule->start(context); + for(n=0;nx - bbox->xmin); + + if(x < lastx) + x = lastx; + if(x > buf->width) + x = buf->width; + + if(fill.is_filled && lastxadd(context, fill, p->fs, p->dir, p->polygon_nr); + lastx = x; + } + if(fill.is_filled && lastx!=buf->width) { + /* we're bleeding, fill over padding, too. */ + fprintf(stderr, "Polygon %p is bleeding in line %d\n", polygon, y); + fill_bitwise(line, lastx, width8*8); + assert(line[width8-1]&0x01); + bleeding = 1; + exit(1); + + } + } + + for(y=0;yheight;y++) { + if(buf->lines[y].points) { + free(buf->lines[y].points); + } + memset(&buf->lines[y], 0, sizeof(renderline_t)); + } + if(bleeding) { + assert(!bitmap_ok(bbox, image)); + } + free(buf->lines);buf->lines=0; + return image; +} + +#define MAX_WIDTH 8192 +#define MAX_HEIGHT 4096 + +static inline double max(double a, double b) {return a>b?a:b;} +static inline double min(double a, double b) {return agridsize; + + if(polygon->strokes && polygon->strokes->num_points) { + b.xmin = polygon->strokes->points[0].x*g; + b.ymin = polygon->strokes->points[0].y*g; + b.xmax = polygon->strokes->points[0].x*g; + b.ymax = polygon->strokes->points[0].y*g; + } + int s,t; + gfxpolystroke_t*stroke = polygon->strokes; + for(;stroke;stroke=stroke->next) { + for(t=0;tnum_points;t++) { + point_t p = stroke->points[t]; + int x1 = floor(p.x); + int y1 = floor(p.y); + int x2 = ceil(p.x); + int y2 = ceil(p.y); + if(x1 < b.xmin) b.xmin = x1; + if(y1 < b.ymin) b.ymin = y1; + if(x2 > b.xmax) b.xmax = x2; + if(y2 > b.ymax) b.ymax = y2; + } + } + + if(b.xmax > (int)(MAX_WIDTH*zoom)) + b.xmax = (int)(MAX_WIDTH*zoom); + if(b.ymax > (int)(MAX_HEIGHT*zoom)) + b.ymax = (int)(MAX_HEIGHT*zoom); + if(b.xmin < -(int)(MAX_WIDTH*zoom)) + b.xmin = -(int)(MAX_WIDTH*zoom); + if(b.ymin < -(int)(MAX_HEIGHT*zoom)) + b.ymin = -(int)(MAX_HEIGHT*zoom); + + if(b.xmin > b.xmax) + b.xmin = b.xmax; + if(b.ymin > b.ymax) + b.ymin = b.ymax; + + b.xmax = adjust_x(b.xmin, b.xmax); + + b.width = b.xmax - b.xmin; + b.height = b.ymax - b.ymin; + return b; +} + +#define B11111000 0xf8 +#define B01111100 0x7c +#define B00111110 0x3e +#define B00011111 0x1f +#define B11100000 0xe0 +#define B01110000 0x70 +#define B00111000 0x38 +#define B00011100 0x1c +#define B00001110 0x0e +#define B00000111 0x07 +#define B10000000 0x80 +#define B01000000 0x40 +#define B00100000 0x20 +#define B00010000 0x10 +#define B00001000 0x08 +#define B00000100 0x04 +#define B00000010 0x02 +#define B00000001 0x01 + +int bitmap_ok(intbbox_t*bbox, unsigned char*data) +{ + int y; + int width8 = (bbox->width+7) >> 3; + for(y=0;yheight;y++) { + if(data[width8-1]&0x01) + return 0; //bleeding + data += width8; + } + return 1; +} + +int compare_bitmaps(intbbox_t*bbox, unsigned char*data1, unsigned char*data2) +{ + if(!data1 || !data2) + return 0; + int x,y; + int height = bbox->height; + int width = bbox->width; + int width8 = (width+7) >> 3; + unsigned char*l1 = &data1[width8*2]; + unsigned char*l2 = &data2[width8*2]; + for(y=2;ywidth+7) >> 3; + unsigned char*data = malloc(b->width*b->height*4*4); + unsigned char*p = data; + int x,y; + unsigned char*b1 = data1; + unsigned char*b2 = data2; + compare_bitmaps(b, data1, data2); +//# define MARK ((abs(x-badx)<3 && abs(y-bady)<3)*255) +#define MARK 0 + for(y=0;yheight;y++) { + for(x=0;xwidth;x++) { + unsigned char c1 = (b1[x>>3]&(0x80>>(x&7)))?255:0; + unsigned char c2 = (b2[x>>3]&(0x80>>(x&7)))?255:0; + *p++ = 255; + *p++ = c1^c2; + *p++ = c1^c2; + *p++ = MARK; + } + for(x=0;xwidth;x++) { + unsigned char c = (b2[x>>3]&(0x80>>(x&7)))?255:0; + *p++ = 255; + *p++ = c; + *p++ = c; + *p++ = MARK; + } + b1 += width8; + b2 += width8; + } + b1 = data1; + for(y=0;yheight;y++) { + for(x=0;xwidth;x++) { + unsigned char c = (b1[x>>3]&(0x80>>(x&7)))?255:0; + *p++ = 255; + *p++ = c; + *p++ = c; + *p++ = MARK; + } + for(x=0;xwidth;x++) { + *p++ = 255; + *p++ = 0; + *p++ = 0; + *p++ = 0; + } + b1 += width8; + } + png_write(filename, data, b->width*2, b->height*2); + free(data); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h new file mode 100644 index 000000000..1c8d183e1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h @@ -0,0 +1,24 @@ +#ifndef __renderpoly_h__ +#define __renderpoly_h__ + +#include "poly.h" +#include "wind.h" + +typedef struct { + int xmin; + int ymin; + int xmax; + int ymax; + int width; + int height; +} intbbox_t; + +unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, windrule_t*rule, windcontext_t*context); + +intbbox_t intbbox_new(int x1, int y1, int x2, int y2); +intbbox_t intbbox_from_polygon(gfxpoly_t*polygon, double zoom); + +int bitmap_ok(intbbox_t*bbox, unsigned char*data); +int compare_bitmaps(intbbox_t*bbox, unsigned char*data1, unsigned char*data2); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c new file mode 100644 index 000000000..b9ccb1073 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c @@ -0,0 +1,233 @@ +#include +#include +#include +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "poly.h" +#include "wind.h" +#include "convert.h" + +/* notice: left/right for a coordinate system where y goes up, not down */ +typedef enum {LEFT=0, RIGHT=1} leftright_t; + +/* factor that determines into how many line fragments a spline is converted */ +#define SUBFRACTION (2.4) + +// spline equation: +// s(t) = t*t*x2 + 2*t*(1-t)*cx + (1-t)*(1-t)*x1 +// +// s(0.5) = 0.25*x2 + 0.5*cx + 0.25*x1 +// ds(t)/dt = 2*t*x2 + (2-2t)*cx + (2t-2)*x1 +// ds(0) = 2*(cx-x1) + +static void draw_arc(gfxdrawer_t*draw, double x, double y, double a1, double a2, double r) +{ + if(a2lineTo(draw, x+cos(a1)*r,y+sin(a1)*r); + for(t=1;t<=steps;t++) { + double a = a1 + t*step; + double c = cos(a)*r; + double s = sin(a)*r; + double xx = c + x; + double yy = s + y; + double dx = x + cos(a-step/2)*r2; + double dy = y + sin(a-step/2)*r2; + draw->splineTo(draw, dx, dy, xx, yy); + lastx = xx; + lasty = yy; + } +} + +static void draw_single_stroke(gfxpoint_t*p, int num, gfxdrawer_t*draw, double width, gfx_capType cap, gfx_joinType join, double limit) +{ + width/=2; + if(width<=0) + width = 0.05; + + /* remove duplicate points */ + int s=1,t; + gfxpoint_t last = p[0]; + for(t=1;t2 && p[0].x == p[num-1].x && p[0].y == p[num-1].y); + + int start = 0; + int end = num-1; + int incr = 1; + int pos = 0; + + double lastw=0; + /* iterate through the points two times: first forward, then backward, + adding a stroke outline to the right side and line caps after each + pass */ + int pass; + for(pass=0;pass<2;pass++) { + if(closed) { + double dx = p[end].x - p[end-incr].x; + double dy = p[end].y - p[end-incr].y; + lastw = atan2(dy,dx); + if(lastw<0) lastw+=M_PI*2; + } + + int pos; + for(pos=start;pos!=end;pos+=incr) { + //printf("%d) %.2f %.2f\n", pos, p[pos].x, p[pos].y); + double dx = p[pos+incr].x - p[pos].x; + double dy = p[pos+incr].y - p[pos].y; + double w = atan2(dy,dx); + if(w<0) w+=M_PI*2; + + if(closed || pos!=start) { + double d = w-lastw; + leftright_t turn; + if(d>=0 && d-M_PI) turn=RIGHT; + else if(d>=M_PI) {turn=RIGHT;} + else if(d<=-M_PI) {turn=LEFT;d+=M_PI*2;} + else {assert(0);} + if(turn!=LEFT || join==gfx_joinBevel) { + // nothing to do. bevel joins are easy + } else if(join==gfx_joinRound) { + draw_arc(draw, p[pos].x, p[pos].y, lastw-M_PI/2, w-M_PI/2, width); + } else if(join==gfx_joinMiter) { + double xw = M_PI/2 - d/2; + if(xw>0) { + double r2 = 1.0 / sin(M_PI/2-d/2); + if(r2 < limit) { + r2 *= width; + double addx = cos(lastw-M_PI/2+d/2)*r2; + double addy = sin(lastw-M_PI/2+d/2)*r2; + draw->lineTo(draw, p[pos].x+addx, p[pos].y+addy); + } + } + } + } + + double addx = cos(w-M_PI/2)*width; + double addy = sin(w-M_PI/2)*width; + draw->lineTo(draw, p[pos].x+addx, p[pos].y+addy); + double px2 = p[pos+incr].x + addx; + double py2 = p[pos+incr].y + addy; + draw->lineTo(draw, p[pos+incr].x+addx, p[pos+incr].y+addy); + lastw = w; + } + + if(closed) { + draw->close(draw); + } else { + /* draw stroke ends. We draw duplicates of some points here. The drawer + implementation should be smart enough to remove them. */ + double c = cos(lastw-M_PI/2)*width; + double s = sin(lastw-M_PI/2)*width; + if(cap == gfx_capButt) { + draw->lineTo(draw, p[pos].x+c, p[pos].y+s); + draw->lineTo(draw, p[pos].x-c, p[pos].y-s); + } else if(cap == gfx_capRound) { + draw_arc(draw, p[pos].x, p[pos].y, lastw-M_PI/2, lastw+M_PI/2, width); + } else if(cap == gfx_capSquare) { + double c = cos(lastw-M_PI/2)*width; + double s = sin(lastw-M_PI/2)*width; + draw->lineTo(draw, p[pos].x+c, p[pos].y+s); + draw->lineTo(draw, p[pos].x+c-s, p[pos].y+s+c); + draw->lineTo(draw, p[pos].x-c-s, p[pos].y-s+c); + draw->lineTo(draw, p[pos].x-c, p[pos].y-s); + } + lastw += M_PI; // for dots + } + start=num-1; + end=0; + incr=-1; + } + if(!closed) + draw->close(draw); +} + +void draw_stroke(gfxline_t*start, gfxdrawer_t*draw, double width, gfx_capType cap, gfx_joinType join, double miterLimit) +{ + if(!start) + return; + assert(start->type == gfx_moveTo); + gfxline_t*line = start; + // measure array size + int size = 0; + int pos = 0; + double lastx,lasty; + while(line) { + if(line->type == gfx_moveTo) { + if(pos>size) size = pos; + pos++; + } else if(line->type == gfx_lineTo) { + pos++; + } else if(line->type == gfx_splineTo) { + int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + fabs(line->y-2*line->sy+lasty))*SUBFRACTION); + if(!parts) parts = 1; + pos+=parts+1; + } + lastx = line->x; + lasty = line->y; + line = line->next; + } + if(pos>size) size = pos; + if(!size) return; + + gfxpoint_t* points = malloc(sizeof(gfxpoint_t)*size); + line = start; + pos = 0; + while(line) { + if(line->type == gfx_moveTo) { + if(pos) + draw_single_stroke(points, pos, draw, width, cap, join, miterLimit); + pos = 0; + } else if(line->type == gfx_splineTo) { + int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + fabs(line->y-2*line->sy+lasty))*SUBFRACTION); + if(!parts) parts = 1; + double stepsize = 1.0/parts; + int i; + for(i=0;ix*t*t + 2*line->sx*t*(1-t) + lastx*(1-t)*(1-t)); + points[pos].y = (line->y*t*t + 2*line->sy*t*(1-t) + lasty*(1-t)*(1-t)); + pos++; + } + } + lastx = points[pos].x = line->x; + lasty = points[pos].y = line->y; + pos++; + line = line->next; + } + if(pos) draw_single_stroke(points, pos, draw, width, cap, join, miterLimit); + free(points); +} + +static windcontext_t onepolygon = {1}; +gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, double gridsize) +{ + gfxdrawer_t d; + gfxdrawer_target_poly(&d, gridsize); + draw_stroke(line, &d, width, cap_style, joint_style, miterLimit); + gfxpoly_t*poly = (gfxpoly_t*)d.result(&d); + assert(gfxpoly_check(poly, 1)); + gfxpoly_t*poly2 = gfxpoly_process(poly, 0, &windrule_circular, &onepolygon); + gfxpoly_destroy(poly); + return poly2; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h new file mode 100644 index 000000000..4b52d5270 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h @@ -0,0 +1,7 @@ +#ifndef __stroke_h__ +#define __stroke_h__ +#include "../gfxdevice.h" +#include "poly.h" +gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, double gridsize); +void draw_stroke(gfxline_t*start, gfxdrawer_t*draw, double width, gfx_capType cap, gfx_joinType join, double miterLimit); +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c new file mode 100644 index 000000000..30a21fd24 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c @@ -0,0 +1,138 @@ +#include "poly.h" + +edgestyle_t edgestyle_default; + +windstate_t windstate_nonfilled = { + is_filled: 0, + wind_nr: 0, +}; + +// -------------------- even/odd ---------------------- + +windstate_t evenodd_start(windcontext_t*context) +{ + return windstate_nonfilled; +} +windstate_t evenodd_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) +{ + assert(edge); + left.is_filled ^= 1; + return left; +} +edgestyle_t* evenodd_diff(windstate_t*left, windstate_t*right) +{ + if(left->is_filled==right->is_filled) + return 0; + else + return &edgestyle_default; +} + +windrule_t windrule_evenodd = { + start: evenodd_start, + add: evenodd_add, + diff: evenodd_diff, +}; + +// -------------------- circular ---------------------- + +windstate_t circular_start(windcontext_t*context) +{ + return windstate_nonfilled; +} + +windstate_t circular_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) +{ + assert(edge); + /* which one is + and which one - doesn't actually make any difference */ + if(dir == DIR_DOWN) + left.wind_nr++; + else + left.wind_nr--; + + left.is_filled = left.wind_nr != 0; + return left; +} + +edgestyle_t* circular_diff(windstate_t*left, windstate_t*right) +{ + if(left->is_filled==right->is_filled) + return 0; + else + return &edgestyle_default; +} + +windrule_t windrule_circular = { + start: circular_start, + add: circular_add, + diff: circular_diff, +}; + +// -------------------- intersect ---------------------- + +windstate_t intersect_start(windcontext_t*context) +{ + return windstate_nonfilled; +} + +windstate_t intersect_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) +{ + assert(master < context->num_polygons); + + left.wind_nr ^= 1<num_polygons)-1); + return left; +} + +edgestyle_t* intersect_diff(windstate_t*left, windstate_t*right) +{ + if(left->is_filled==right->is_filled) + return 0; + else + return &edgestyle_default; +} + +windrule_t windrule_intersect = { + start: intersect_start, + add: intersect_add, + diff: intersect_diff, +}; + +// -------------------- union ---------------------- + +windstate_t union_start(windcontext_t*context) +{ + return windstate_nonfilled; +} + +windstate_t union_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) +{ + assert(masteris_filled==right->is_filled) + return 0; + else + return &edgestyle_default; +} + +windrule_t windrule_union = { + start: union_start, + add: union_add, + diff: union_diff, +}; + + +/* + } else if (rule == WIND_NONZERO) { + fill = wind!=0; + } else if (rule == WIND_ODDEVEN) { + fill = wind&1; + } else { // rule == WIND_POSITIVE + fill = wind>=1; + } + */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h new file mode 100644 index 000000000..a07ed6424 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h @@ -0,0 +1,41 @@ +#ifndef __wind_h__ +#define __wind_h__ + +/* Every segment has an original direction, which is the direction + the segment had in the input data. + as our scanline moves from minimum y to maximum y, "DOWN" means + the the (original) segment's y2 is larger than its y1 */ +typedef enum {DIR_UP, DIR_DOWN, DIR_UNKNOWN} segment_dir_t; + +#define DIR_INVERT(d) ((d)^(DIR_UP^DIR_DOWN)) + +typedef struct _edgestyle { + void*internal; +} edgestyle_t; + +extern edgestyle_t edgestyle_default; + +typedef struct _windstate +{ + char is_filled; + int wind_nr; +} windstate_t; + +typedef struct _windcontext +{ + int num_polygons; +} windcontext_t; + +typedef struct _windrule +{ + windstate_t (*start)(windcontext_t* num_polygons); + windstate_t (*add)(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int polygon_nr); + edgestyle_t* (*diff)(windstate_t*left, windstate_t*right); +} windrule_t; + +extern windrule_t windrule_evenodd; +extern windrule_t windrule_circular; +extern windrule_t windrule_intersect; +extern windrule_t windrule_union; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c new file mode 100644 index 000000000..7987ac15a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include "../mem.h" +#include "xrow.h" +#include "poly.h" + +xrow_t* xrow_new() +{ + xrow_t*r = rfx_calloc(sizeof(xrow_t)); + r->size = 16; + r->x = rfx_alloc(sizeof(r->x[0])*r->size); + return r; +} + +void xrow_add(xrow_t*r, int32_t x) +{ + if(r->num && r->lastx==x) + return; + r->lastx = x; + if(r->num >= r->size) { + r->size *= 2; + r->x = rfx_realloc(r->x, sizeof(r->x[0])*r->size); + } + r->x[r->num++]=x; +} + +int compare_int32(const void*_i1,const void*_i2) +{ + int32_t*i1 = (int32_t*)_i1; + int32_t*i2 = (int32_t*)_i2; + return *i1-*i2; +} + +void xrow_sort(xrow_t*r) +{ + if(!r->num) + return; + qsort(r->x, r->num, sizeof(r->x[0]), compare_int32); + int t; + int pos = 1; + int32_t lastx=r->x[0]; + for(t=1;tnum;t++) { + if(r->x[t]!=lastx) { + r->x[pos++] = lastx = r->x[t]; + } + } + r->num = pos; +} + +int xrow_find(xrow_t*r, int32_t x) +{ + int min, max, i, l; + + for(min=0, max=r->num, i=r->num/2, l=r->num; i != l; l=i, i=(min+max)/2) { + if(x < r->x[i]) max=i; + else min=i; + } + +#ifdef CHECKS + int t; + for(t=0;tnum;t++) { + if(x < r->x[t]) + break; + } + assert(max == t); +#endif + + return max; +} + +char xrow_contains(xrow_t*r, int32_t x) +{ + int pos = xrow_find(r,x) - 1; + return (pos>=0 && r->x[pos]==x); +} + +void xrow_reset(xrow_t*r) +{ + r->num = 0; +} + +void xrow_dump(xrow_t*xrow, double gridsize) +{ + fprintf(stderr, "x: "); + int t; + for(t=0;tnum;t++) { + if(t) + fprintf(stderr, ", "); + fprintf(stderr, "%.2f", xrow->x[t] * gridsize); + } + fprintf(stderr, "\n"); +} + +void xrow_destroy(xrow_t*r) +{ + if(r->x) { + free(r->x);r->x = 0; + } + free(r); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h new file mode 100644 index 000000000..5de10d4c4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h @@ -0,0 +1,25 @@ +#ifndef __xrow_h__ +#define __xrow_h__ + +#include + +#include "poly.h" + +typedef struct _xrow { + int32_t*x; + int num; + int size; + int32_t lastx; +} xrow_t; + +xrow_t* xrow_new(); + +void xrow_add(xrow_t*xrow, int32_t x); +void xrow_sort(xrow_t*xrow); +int xrow_find(xrow_t*r, int32_t x); +char xrow_contains(xrow_t*xrow, int32_t x); +void xrow_dump(xrow_t*xrow, double gridsize); +void xrow_reset(xrow_t*xrow); +void xrow_destroy(xrow_t*xrow); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h new file mode 100644 index 000000000..845eca790 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h @@ -0,0 +1,71 @@ +/* pdfswf.h + Header file for pdfswf.cc. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxsource_h__ +#define __gfxsource_h__ + +#include "gfxdevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct _gfxdocument; +struct _gfxpage; + +typedef struct _gfxsource +{ + void (*setparameter)(struct _gfxsource*src, const char*name, const char*value); + struct _gfxdocument* (*open)(struct _gfxsource*src, const char*filename); + void (*destroy)(struct _gfxsource*src); + void*internal; +} gfxsource_t; + +typedef struct _gfxdocument +{ + gfxsource_t*driver; + int num_pages; + void* (*get)(struct _gfxdocument*gfx, const char*name); + void (*destroy)(struct _gfxdocument*gfx); + void (*setparameter)(struct _gfxdocument*gfx, const char*name, const char*value); + char* (*getinfo)(struct _gfxdocument*gfx, const char*key); + struct _gfxpage* (*getpage)(struct _gfxdocument*gfx, int page); + void (*prepare)(struct _gfxdocument*gfx, gfxdevice_t*device); + void*internal; +} gfxdocument_t; + +typedef struct _gfxpage +{ + gfxdocument_t*parent; + gfxcoord_t width; + gfxcoord_t height; + int nr; + void (*render)(struct _gfxpage*gfx, gfxdevice_t*output); + void (*rendersection)(struct _gfxpage*gfx, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t x1, gfxcoord_t y1, gfxcoord_t x2, gfxcoord_t y2); + void (*destroy)(struct _gfxpage*page); + void*internal; +} gfxpage_t; + +#ifdef __cplusplus +} +#endif + +#endif //__gfxsource_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c new file mode 100644 index 000000000..0f39da7cd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c @@ -0,0 +1,1274 @@ +/* gfxtools.c + + Various utility functions for dealing with gfxdevices. + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include +#include "gfxtools.h" +#include "gfxfont.h" +#include "jpeg.h" +#include "q.h" + +typedef struct _linedraw_internal +{ + gfxline_t*start; + gfxline_t*next; + gfxcoord_t x0,y0; + char has_moveto; +} linedraw_internal_t; + +static void linedraw_moveTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) +{ + linedraw_internal_t*i = (linedraw_internal_t*)d->internal; + gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); + l->type = gfx_moveTo; + i->has_moveto = 1; + i->x0 = x; + i->y0 = y; + l->sx = l->sy = 0; + d->x = l->x = x; + d->y = l->y = y; + l->next = 0; + if(i->next) + i->next->next = l; + i->next = l; + if(!i->start) + i->start = l; +} +static void linedraw_lineTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) +{ + linedraw_internal_t*i = (linedraw_internal_t*)d->internal; + if(!i->has_moveto) { + /* starts with a line, not with a moveto. As this is the first + entry in the list, this is probably *meant* to be a moveto */ + linedraw_moveTo(d, x, y); + return; + } + + gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); + l->type = gfx_lineTo; + d->x = l->x = x; + d->y = l->y = y; + + l->next = 0; + if(i->next) + i->next->next = l; + i->next = l; + if(!i->start) + i->start = l; +} +static void linedraw_splineTo(gfxdrawer_t*d, gfxcoord_t sx, gfxcoord_t sy, gfxcoord_t x, gfxcoord_t y) +{ + linedraw_internal_t*i = (linedraw_internal_t*)d->internal; + if(!i->has_moveto) { + linedraw_moveTo(d, x, y); + return; + } + + gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); + l->type = gfx_splineTo; + d->x = l->x = x; + d->y = l->y = y; + l->sx = sx; + l->sy = sy; + l->next = 0; + if(i->next) + i->next->next = l; + i->next = l; + if(!i->start) + i->start = l; +} +static void linedraw_close(gfxdrawer_t*d) +{ + linedraw_internal_t*i = (linedraw_internal_t*)d->internal; + if(!i->has_moveto) + return; + linedraw_lineTo(d, i->x0, i->y0); + i->has_moveto = 0; + i->x0 = 0; + i->y0 = 0; +} +static void* linedraw_result(gfxdrawer_t*d) +{ + linedraw_internal_t*i = (linedraw_internal_t*)d->internal; + void*result = (void*)i->start; + rfx_free(i); + memset(d, 0, sizeof(gfxdrawer_t)); + return result; +} + +void gfxdrawer_target_gfxline(gfxdrawer_t*d) +{ + linedraw_internal_t*i = (linedraw_internal_t*)rfx_calloc(sizeof(linedraw_internal_t)); + d->x = 0x7fffffff; + d->y = 0x7fffffff; + d->internal = i; + d->moveTo = linedraw_moveTo; + d->lineTo = linedraw_lineTo; + d->splineTo = linedraw_splineTo; + d->close = linedraw_close; + d->result = linedraw_result; +} + +typedef struct _qspline_abc +{ + double ax,bx,cx; + double ay,by,cy; +} qspline_abc_t; + +typedef struct qspline_t +{ + gfxpoint_t start; + gfxpoint_t control; + gfxpoint_t end; +} qspline_t; + +typedef struct cspline_t +{ + gfxpoint_t start; + gfxpoint_t control1; + gfxpoint_t control2; + gfxpoint_t end; +} cspline_t; + +static void mkspline(qspline_abc_t*s, double x, double y, gfxline_t*l) +{ + /* + Form 1: x = t*t*l->x + 2*t*(1-t)*l->sx + (1-t)*(1-t)*x; + Form 2: x = a*t*t + b*t + c + */ + s->cx = x; s->bx = 2*l->sx - 2*x; s->ax = l->x - 2*l->sx + x; + s->cy = y; s->by = 2*l->sy - 2*y; s->ay = l->y - 2*l->sy + y; +} + +static void spline_get_controlpoint(qspline_abc_t*q, double t1, double t2, double*dx, double*dy) +{ + double dt = t2-t1; + double nax = q->ax*dt*dt; + double nay = q->ay*dt*dt; + double nbx = 2*q->ax*dt*t1 + q->bx*dt; + double nby = 2*q->ay*dt*t1 + q->by*dt; + double ncx = q->ax*t1*t1 + q->bx*t1 + q->cx; + double ncy = q->ay*t1*t1 + q->by*t1 + q->cy; + *dx = ncx + nbx/2; + *dy = ncy + nby/2; +} + +static double get_spline_len(qspline_abc_t*s) +{ + int parts = (int)(sqrt(fabs(s->ax) + fabs(s->ay))*3); + int i; + double len = 0; + double r; + double r2; + if(parts < 3) parts = 3; + r = 1.0/parts; + r2 = 1.0/(parts*parts); + for(i=0;iax*(2*i+1)*r2 + s->bx*r; + double dy = s->ay*(2*i+1)*r2 + s->by*r; + len += sqrt(dx*dx+dy*dy); + } + /*printf("Spline from %f,%f to %f,%f has len %f (%f)\n", s->cx, s->cy, + s->cx + s->bx + s->ax, + s->cy + s->by + s->ay, len, + sqrt((s->bx + s->ax)*(s->bx + s->ax) + (s->by + s->ay)*(s->by + s->ay)) + ); + assert(len+0.5 >= sqrt((s->bx + s->ax)*(s->bx + s->ax) + (s->by + s->ay)*(s->by + s->ay))); + */ + return len; +} + +void gfxtool_draw_dashed_line(gfxdrawer_t*d, gfxline_t*line, float*r, float phase) +{ + double x=0,y=0; + double linepos = 0,nextpos = 0; + char on = 0; + int apos=0; + + if(line && line->type != gfx_moveTo) { + fprintf(stderr, "gfxtool: outline doesn't start with a moveTo"); + return; + } + + int i; + double dashlen=0; + for(i=0;r[i]>=0;i++) { + dashlen+=r[i]; + } + if(!r || (r[0]<=0 && r[0]>-0.01) || dashlen<0.001) { + // no dashing. just draw the thing + while(line) { + if(line->type == gfx_moveTo) { + d->moveTo(d, line->x, line->y); + } else if(line->type == gfx_lineTo) { + d->lineTo(d, line->x, line->y); + } else if(line->type == gfx_splineTo) { + d->splineTo(d, line->sx, line->sy, line->x, line->y); + } + line = line->next; + } + return; + } + + if(phase < 0) { + phase = -phase; + } + + if(r[0]<0 || phase<0) { + fprintf(stderr, "gfxtool: invalid (negative) dashes: %f, phase=%f\n", r[0], phase); + return; + } + + for(;line;line=line->next) { + if(line->type == gfx_moveTo) { + d->moveTo(d, line->x, line->y); + on = 1; nextpos = r[0]; apos = 0; linepos = 0; + x = line->x; y = line->y; + while(linepos < phase) { + //printf("[+] linepos: %f, phase: %f, on:%d, apos:%d nextpos:%f\n", linepos, phase, on, apos, nextpos); + linepos += r[apos]; + if(linepos < phase) { + on ^= 1; + if(r[++apos]<0) + apos = 0; + nextpos += r[apos]; + } + } + linepos = phase; + //printf("[k] linepos: %f, phase: %f, on:%d, apos:%d nextpos:%f \n", linepos, phase, on, apos, nextpos); + } else if(line->type == gfx_lineTo) { + double dx = line->x - x; + double dy = line->y - y; + double len = sqrt(dx*dx+dy*dy); + double vx; + double vy; + double lineend = linepos+len; + if(len==0) + continue; + vx = dx/len; + vy = dy/len; + assert(nextpos>=linepos); + //printf("(line) on:%d apos: %d nextpos: %f, line pos: %f, line end: %f\n", on, apos, nextpos, linepos, linepos+len); + while(nextposlineTo(d, nx,ny);/*printf("lineTo %f\n", nextpos);*/} + else {d->moveTo(d, nx,ny);/*printf("moveTo %f\n", nextpos);*/} + on^=1; + if(r[++apos]<0) + apos = 0; + nextpos+=r[apos]; + } + linepos = lineend; + if(on) { + //printf("lineTo %f\n", 1.0); + d->lineTo(d, line->x,line->y); + } + x = line->x; y = line->y; + } else if(line->type == gfx_splineTo) { + qspline_abc_t q; + double len, lineend,lastt; + mkspline(&q, x, y, line); + + len = get_spline_len(&q); + //printf("%f %f -> %f %f, len: %f\n", x, y, line->x, line->y, len); + if(len==0) + continue; + lineend = linepos+len; + lastt = 0; + if(nextpos=linepos); + //printf("(spline) on:%d apos: %d nextpos: %f, line pos: %f, line end: %f\n", on, apos, nextpos, linepos, linepos+len); + while(nextpossplineTo(d, sx, sy, nx,ny); + //printf("splineTo %f\n", nextpos); + } else { + d->moveTo(d, nx,ny); + //printf("moveTo %f\n", nextpos); + } + lastt = t; + on^=1; + if(r[++apos]<0) + apos = 0; + nextpos+=r[apos]; + } + linepos = lineend; + if(on) { + double sx,sy; + spline_get_controlpoint(&q, lastt, 1, &sx, &sy); + d->splineTo(d, sx, sy, line->x,line->y); + //printf("splineTo %f\n", 1.0); + } + x = line->x; y = line->y; + } + } +} + +static char* getToken(const char**p) +{ + const char*start; + char*result; + while(**p && strchr(" ,()\t\n\r", **p)) { + (*p)++; + } + start = *p; + if (strchr("LMlm", **p) && (isdigit(*(*p+1))||strchr("+-", *(*p+1)))) { + (*p)++; + } else while(**p && !strchr(" ,()\t\n\r", **p)) { + (*p)++; + } + result = (char*)malloc((*p)-start+1); + memcpy(result,start,(*p)-start+1); + result[(*p)-start] = 0; + return result; +} + +static float getFloat(const char** p) +{ + char* token = getToken(p); + float result = atof(token); + free(token); + return result; +} + +gfxline_t*gfxline_fromstring(const char*string) +{ + gfxdrawer_t d; + gfxdrawer_target_gfxline(&d); + + const char*p = string; + while(*p) { + char*token = getToken(&p); + if(!token) + break; + if (!*token) { + free(token); + break; + } + if(!strcmp(token, "M")) { + double x = getFloat(&p); + double y = getFloat(&p); + d.moveTo(&d, x, y); + } else if(!strncmp(token, "L", 1)) { + double x = getFloat(&p); + double y = getFloat(&p); + d.lineTo(&d, x, y); + } else if(!strncmp(token, "C", 1)) { + double x1 = getFloat(&p); + double y1 = getFloat(&p); + double x2 = getFloat(&p); + double y2 = getFloat(&p); + double x3 = getFloat(&p); + double y3 = getFloat(&p); + gfxdraw_cubicTo(&d, x1,y1, x2,y2, x3,y3, 0.9); + } else if(!strncmp(token, "z", 1)) { + //ignore + } else + fprintf(stderr, "gfxdraw: Warning: unknown primitive '%s'\n", token); + free(token); + } + gfxline_t*line = d.result(&d); + return line; +} + + +gfxline_t * gfxline_clone(gfxline_t*line) +{ + gfxline_t*dest = 0; + gfxline_t*pos = 0; + while(line) { + gfxline_t*n = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); + *n = *line; + n->next = 0; + if(!pos) { + dest = pos = n; + } else { + pos->next = n; + pos = n; + } + line = line->next; + } + return dest; +} + +static char splineIsStraight(double x, double y, gfxline_t*l) +{ + if(l->type == gfx_moveTo) + return 0; + if(l->type == gfx_lineTo) + return 1; + double dx = l->x-x; + double dy = l->y-y; + double sx = l->sx-x; + double sy = l->sy-y; + if(fabs(dx*sy - dy*sx) < 0.000001 && (dx*sx + dy*sy) >= 0) { + return 1; + } + return 0; +} + +void gfxline_optimize(gfxline_t*line) +{ + gfxline_t*l = line; + /* step 1: convert splines to lines, where possible */ + double x=0,y=0; + while(l) { + if(l->type == gfx_splineTo && splineIsStraight(x,y,l)) { + l->type = gfx_lineTo; + } + x = l->x; + y = l->y; + l = l->next; + } + /* step 2: combine adjacent lines and splines, where possible */ + l = line; + while(l && l->next) { + gfxline_t*next = l->next; + char combine = 0; + double sx=0,sy=0; + if(l->type == gfx_lineTo && next->type == gfx_lineTo) { + double dx = l->x-x; + double dy = l->y-y; + double nx = next->x-l->x; + double ny = next->y-l->y; + if(fabs(dx*ny - dy*nx) < 0.000001 && (dx*nx + dy*ny) >= 0) { + combine = 1; + } + } else if(l->type == gfx_splineTo && next->type == gfx_splineTo) { + /* TODO */ + } + if(combine) { + l->next = next->next; + next->next = 0; + l->x = next->x; + l->y = next->y; + l->sx = sx; + l->sy = sy; + rfx_free(next); + } else { + x = l->x; + y = l->y; + l = l->next; + } + } +} + +gfxline_t* gfxtool_dash_line(gfxline_t*line, float*dashes, float phase) +{ + gfxdrawer_t d; + gfxline_t*result; + gfxdrawer_target_gfxline(&d); + gfxtool_draw_dashed_line(&d, line, dashes, phase); + result= (gfxline_t*)d.result(&d); + return result; +} + +void gfxline_show(gfxline_t*l, FILE*fi) +{ + while(l) { + if(l->type == gfx_moveTo) { + fprintf(fi, "moveTo %.2f,%.2f\n", l->x, l->y); + } + if(l->type == gfx_lineTo) { + fprintf(fi, "lineTo %.2f,%.2f\n", l->x, l->y); + } + if(l->type == gfx_splineTo) { + fprintf(fi, "splineTo %.2f,%.2f %.2f,%.2f\n", l->sx, l->sy, l->x, l->y); + } + l = l->next; + } +} + +void gfxline_free(gfxline_t*l) +{ + if(l && (l+1) == l->next) { + /* flattened */ + rfx_free(l); + } else { + gfxline_t*next; + while(l) { + next = l->next; + l->next = 0; + rfx_free(l); + l = next; + } + } +} + +static inline gfxpoint_t cspline_getpoint(const struct cspline_t*s, double t) +{ + gfxpoint_t p; + double tt = t*t; + double ttt = tt*t; + double mt = (1-t); + double mtmt = mt*(1-t); + double mtmtmt = mtmt*(1-t); + p.x= s->end.x*ttt + 3*s->control2.x*tt*mt + + 3*s->control1.x*t*mtmt + s->start.x*mtmtmt; + p.y= s->end.y*ttt + 3*s->control2.y*tt*mt + + 3*s->control1.y*t*mtmt + s->start.y*mtmtmt; + return p; +} +static gfxpoint_t qspline_getpoint(const qspline_t*s, double t) +{ + gfxpoint_t p; + p.x= s->end.x*t*t + 2*s->control.x*t*(1-t) + s->start.x*(1-t)*(1-t); + p.y= s->end.y*t*t + 2*s->control.y*t*(1-t) + s->start.y*(1-t)*(1-t); + return p; +} + +static int approximate3(const cspline_t*s, qspline_t*q, int size, double quality2) +{ + unsigned int gran = 0; + unsigned int istep = 0x80000000; + unsigned int istart = 0; + int num = 0; + int level = 0; + + while(istart<0x80000000) + { + unsigned int iend = istart + istep; + double start = istart/(double)0x80000000; + double end = iend/(double)0x80000000; + qspline_t test; + double pos,qpos; + char left = 0,recurse=0; + int t; + int probes = 15; + double dx,dy; + + /* create simple approximation: a qspline_t which run's through the + qspline_t point at 0.5 */ + test.start = cspline_getpoint(s, start); + test.control = cspline_getpoint(s, (start+end)/2); + test.end = cspline_getpoint(s, end); + /* fix the control point: + move it so that the new spline does runs through it */ + test.control.x = -(test.end.x + test.start.x)/2 + 2*(test.control.x); + test.control.y = -(test.end.y + test.start.y)/2 + 2*(test.control.y); + + /* depending on where we are in the spline, we either try to match + the left or right tangent */ + if(start<0.5) + left=1; + /* get derivative */ + pos = left?start:end; + qpos = pos*pos; + test.control.x = s->end.x*(3*qpos) + 3*s->control2.x*(2*pos-3*qpos) + + 3*s->control1.x*(1-4*pos+3*qpos) + s->start.x*(-3+6*pos-3*qpos); + test.control.y = s->end.y*(3*qpos) + 3*s->control2.y*(2*pos-3*qpos) + + 3*s->control1.y*(1-4*pos+3*qpos) + s->start.y*(-3+6*pos-3*qpos); + if(left) { + test.control.x *= (end-start)/2; + test.control.y *= (end-start)/2; + test.control.x += test.start.x; + test.control.y += test.start.y; + } else { + test.control.x *= -(end-start)/2; + test.control.y *= -(end-start)/2; + test.control.x += test.end.x; + test.control.y += test.end.y; + } + +//#define PROBES +#ifdef PROBES + /* measure the spline's accurancy, by taking a number of probes */ + for(t=0;tquality2) { + recurse=1;break; + } + qr2 = qspline_getpoint(&test, (1-pos)); + cr2 = cspline_getpoint(s, start+(1-pos)*(end-start)); + + dx = qr2.x - cr2.x; + dy = qr2.y - cr2.y; + dist2 = dx*dx+dy*dy; + + if(dist2>quality2) { + recurse=1;break; + } + } +#else // quadratic error: *much* faster! + + /* convert control point representation to + d*x^3 + c*x^2 + b*x + a */ + dx= s->end.x - s->control2.x*3 + s->control1.x*3 - s->start.x; + dy= s->end.y - s->control2.y*3 + s->control1.y*3 - s->start.y; + + /* we need to do this for the subspline between [start,end], not [0,1] + as a transformation of t->a*t+b does nothing to highest coefficient + of the spline except multiply it with a^3, we just need to modify + d here. */ + {double m = end-start; + dx*=m*m*m; + dy*=m*m*m; + } + + /* use the integral over (f(x)-g(x))^2 between 0 and 1 + to measure the approximation quality. + (it boils down to const*d^2) */ + recurse = (dx*dx + dy*dy > quality2); +#endif + + if(recurse && istep>1 && size-level > num) { + istep >>= 1; + level++; + } else { + *q++ = test; + num++; + istart += istep; + while(!(istart & istep)) { + level--; + istep <<= 1; + } + } + } + return num; +} + +void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality) +{ + double c1x = (draw->x + 2 * cx) / 3; + double c1y = (draw->y + 2 * cy) / 3; + double c2x = (2 * cx + tox) / 3; + double c2y = (2 * cy + toy) / 3; + gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, quality); +} + + +void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality) +{ + qspline_t q[128]; + cspline_t c; + double maxerror = quality>0 ? quality : 1.0; + int t,num; + + c.start.x = draw->x; + c.start.y = draw->y; + c.control1.x = c1x; + c.control1.y = c1y; + c.control2.x = c2x; + c.control2.y = c2y; + c.end.x = x; + c.end.y = y; + + num = approximate3(&c, q, 128, maxerror); + + for(t=0;tsplineTo(draw, mid.x, mid.y, to.x, to.y); + } +} + +gfxbbox_t gfxbbox_expand_to_point(gfxbbox_t box, gfxcoord_t x, gfxcoord_t y) +{ + if(box.xmin==0 && box.ymin==0 && box.xmax==0 && box.ymax==0) { + box.xmin = x; + box.ymin = y; + box.xmax = x; + box.ymax = y; + if(x==0 && y==0) box.xmax = 0.0000001; + return box; + } + if(x < box.xmin) + box.xmin = x; + if(x > box.xmax) + box.xmax = x; + if(y < box.ymin) + box.ymin = y; + if(y > box.ymax) + box.ymax = y; + return box; +} + +gfxbbox_t gfxbbox_expand_to_bbox(gfxbbox_t box, gfxbbox_t box2) +{ + box = gfxbbox_expand_to_point(box, box2.xmin, box2.ymin); + box = gfxbbox_expand_to_point(box, box2.xmax, box2.ymax); + return box; +} + +void gfxbbox_intersect(gfxbbox_t*box1, gfxbbox_t*box2) +{ + if(box2->xmin > box1->xmin) + box1->xmin = box2->xmin; + if(box2->ymin > box1->ymin) + box1->ymin = box2->ymin; + if(box2->xmax < box1->xmax) + box1->xmax = box2->xmax; + if(box2->ymax < box1->ymax) + box1->ymax = box2->ymax; + if(box1->xmin > box1->xmax) + box1->xmax = box1->xmin; + if(box1->ymin > box1->ymax) + box1->ymax = box1->ymin; +} + +gfxbbox_t gfxline_getbbox(gfxline_t*line) +{ + gfxcoord_t x=0,y=0; + gfxbbox_t bbox = {0,0,0,0}; + char last = 0; + while(line) { + if(line->type == gfx_moveTo) { + last = 1; + } else if(line->type == gfx_lineTo) { + if(last) bbox = gfxbbox_expand_to_point(bbox, x, y); + bbox = gfxbbox_expand_to_point(bbox, line->x, line->y); + last = 0; + } else if(line->type == gfx_splineTo) { + if(last) bbox = gfxbbox_expand_to_point(bbox, x, y); + bbox = gfxbbox_expand_to_point(bbox, line->sx, line->sy); + bbox = gfxbbox_expand_to_point(bbox, line->x, line->y); + last = 0; + } + x = line->x; + y = line->y; + line = line->next; + } + return bbox; +} + +gfxline_t* gfxline_append(gfxline_t*line1, gfxline_t*line2) +{ + gfxline_t*l = line1;; + if(!l) + return line2; + while(l->next) { + l = l->next; + } + l->next = line2; + return line1; +} + +void gfxline_transform(gfxline_t*line, gfxmatrix_t*matrix) +{ + while(line) { + double x = matrix->m00*line->x + matrix->m10*line->y + matrix->tx; + double y = matrix->m01*line->x + matrix->m11*line->y + matrix->ty; + line->x = x; + line->y = y; + if(line->type == gfx_splineTo) { + double sx = matrix->m00*line->sx + matrix->m10*line->sy + matrix->tx; + double sy = matrix->m01*line->sx + matrix->m11*line->sy + matrix->ty; + line->sx = sx; + line->sy = sy; + } + line = line->next; + } +} + +void gfxmatrix_dump(gfxmatrix_t*m, FILE*fi, char*prefix) +{ + fprintf(fi, "%s%f %f | %f\n", prefix, m->m00, m->m10, m->tx); + fprintf(fi, "%s%f %f | %f\n", prefix, m->m01, m->m11, m->ty); +} + +void gfxmatrix_transform(gfxmatrix_t*m, double* v, double*dest) +{ + dest[0] = m->m00*v[0] + m->m10*v[1] + m->tx; + dest[1] = m->m01*v[0] + m->m11*v[1] + m->ty; +} +void gfxmatrix_invert(gfxmatrix_t*m, gfxmatrix_t*dest) +{ + double det = m->m00 * m->m11 - m->m10 * m->m01; + if(!det) { + memset(dest, 0, sizeof(gfxmatrix_t)); + return; + } + det = 1/det; + dest->m00 = m->m11 * det; + dest->m01 = -m->m01 * det; + dest->m10 = -m->m10 * det; + dest->m11 = m->m00 * det; + dest->tx = -(dest->m00 * m->tx + dest->m10 * m->ty); + dest->ty = -(dest->m01 * m->tx + dest->m11 * m->ty); +} +void gfxmatrix_unit(gfxmatrix_t*m) +{ + memset(m, 0, sizeof(gfxmatrix_t)); + m->m00 = 1.0; + m->m11 = 1.0; +} +void gfxmatrix_multiply(gfxmatrix_t*m1, gfxmatrix_t*m2, gfxmatrix_t*dest) +{ + dest->m00 = m1->m00*m2->m00 + m1->m10*m2->m01; + dest->m01 = m1->m01*m2->m00 + m1->m11*m2->m01; + dest->m10 = m1->m00*m2->m10 + m1->m10*m2->m11; + dest->m11 = m1->m01*m2->m10 + m1->m11*m2->m11; + dest->tx = m1->m00*m2->tx + m1->m10*m2->ty + m1->tx; + dest->ty = m1->m01*m2->tx + m1->m11*m2->ty + m1->ty; +} + +gfxfontlist_t* gfxfontlist_create() +{ + /* Initial list ist empty */ + return 0; +} + +gfxfont_t*gfxfontlist_findfont(gfxfontlist_t*list, char*id) +{ + gfxfontlist_t*l = list; + while(l) { + if(!strcmp((char*)l->font->id, id)) { + return l->font; + } + l = l->next; + } + return 0; +} +char gfxfontlist_hasfont(gfxfontlist_t*list, gfxfont_t*font) +{ + gfxfontlist_t*l = list; + while(l) { + if(!strcmp((char*)l->font->id, font->id)) { + return 1; + } + l = l->next; + } + return 0; +} +void*gfxfontlist_getuserdata(gfxfontlist_t*list, const char*id) +{ + gfxfontlist_t*l = list; + while(l) { + if(!strcmp((char*)l->font->id, id)) { + return l->user; + } + l = l->next; + } + return 0; +} +gfxfontlist_t*gfxfontlist_addfont2(gfxfontlist_t*list, gfxfont_t*font, void*user) +{ + gfxfontlist_t*last=0,*l = list; + while(l) { + last = l; + if(l->font == font) { + return list; // we already know this font + } + l = l->next; + } + if(!font) { + fprintf(stderr, "Tried to add zero font\n"); + } + l = (gfxfontlist_t*)rfx_calloc(sizeof(gfxfontlist_t)); + l->font = font; + l->user = user; + l->next = 0; + if(last) { + last->next = l; + return list; + } else { + return l; + } +} +gfxfontlist_t*gfxfontlist_addfont(gfxfontlist_t*list, gfxfont_t*font) +{ + return gfxfontlist_addfont2(list, font, 0); +} +void gfxfontlist_free(gfxfontlist_t*list, char deletefonts) +{ + gfxfontlist_t*l = list; + while(l) { + gfxfontlist_t*next = l->next; + if(deletefonts && l->font) { + gfxfont_free(l->font);l->font=0; + } + l->next = 0; + free(l); + l = next; + } +} + +gfxline_t*gfxline_makerectangle(double x1,double y1,double x2, double y2) +{ + gfxline_t* line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)*5); + line[0].x = x1;line[0].y = y1;line[0].type = gfx_moveTo;line[0].next = &line[1]; + line[1].x = x2;line[1].y = y1;line[1].type = gfx_lineTo;line[1].next = &line[2]; + line[2].x = x2;line[2].y = y2;line[2].type = gfx_lineTo;line[2].next = &line[3]; + line[3].x = x1;line[3].y = y2;line[3].type = gfx_lineTo;line[3].next = &line[4]; + line[4].x = x1;line[4].y = y1;line[4].type = gfx_lineTo; + return line; +} + +gfxline_t*gfxline_makecircle(double x,double y,double rx, double ry) +{ + double C1 = 0.2930; + double C2 = 0.4140; + double begin = 0.7070; + gfxline_t** line = (gfxline_t**)rfx_calloc(sizeof(gfxline_t*)*9); + int t; + for(t=0;t<9;t++) { + line[t] = rfx_calloc(sizeof(gfxline_t)); + } + line[0]->type = gfx_moveTo; + line[0]->x = x+begin*rx; + line[0]->y = y+begin*ry; + for(t=1;t<9;t++) { + line[t-1]->next = line[t]; + line[t]->type = gfx_splineTo; + } + line[8]->next = 0; +#define R(nr,cx,cy,mx,my) \ + line[nr]->sx = line[nr-1]->x + (cx); \ + line[nr]->sy = line[nr-1]->y + (cy); \ + line[nr]->x = line[nr]->sx + (mx); \ + line[nr]->y = line[nr]->sy + (my); + R(1, -C1*rx, C1*ry, -C2*rx, 0); + R(2, -C2*rx, 0, -C1*rx, -C1*ry); + R(3, -C1*rx, -C1*ry, 0, -C2*ry); + R(4, 0, -C2*ry, C1*rx, -C1*ry); + R(5, C1*rx, -C1*ry, C2*rx, 0); + R(6, C2*rx, 0, C1*rx, C1*ry); + R(7, C1*rx, C1*ry, 0, C2*ry); + R(8, 0, C2*ry, -C1*rx, C1*ry); + gfxline_t*l = line[0]; + free(line); + return l; +} + +gfxbbox_t* gfxline_isrectangle(gfxline_t*_l) +{ + if(!_l) + return 0; + + gfxline_t*l = gfxline_clone(_l); + gfxline_optimize(l); + + double x1=0,x2=0,y1=0,y2=0; + int xc=0,yc=0; + char corners=0; + + char prev=0; + char fail=0; + for(;l; l=l->next) { + double x = l->x; + double y = l->y; + + char top=0,left=0; + + if(xc==2 && x!=x1 && x!=x2) {fail=1;break;} + else if(xc>=1 && x==x1) {left=0;} + else if(xc==2 && x==x2) {left=1;} + else if(xc==1 && x!=x1) {x2 = x; xc=2; left=1;} + else if(xc==0) {x1 = x; xc=1;left=0;} + else {fprintf(stderr, "Internal error in rectangle detection\n");} + + if(yc==2 && y!=y1 && y!=y2) {fail=1;break;} + else if(yc>=1 && y==y1) {top=0;} + else if(yc==2 && y==y2) {top=1;} + else if(yc==1 && y!=y1) {y2 = y; yc=2; top=1;} + else if(yc==0) {y1 = y; yc=1;top=0;} + else {fprintf(stderr, "Internal error in rectangle detection\n");} + + char pos=top<<1|left; + + if((pos^prev)==3) { + /* diagonal lines not allowed */ + fail=1;break; + } + prev = pos; + + /* no corner except the first one may be touched twice */ + if(pos && (corners & 1<xmin = x1; r->ymin = y1; + r->xmax = x2; r->ymax = y2; + return r; +} + +void gfximage_transform(gfximage_t*img, gfxcxform_t*cxform) +{ + int t; + int size = img->width*img->height; + + int rr,rg,rb,ra, tr; + int gr,gg,gb,ga, tg; + int br,bg,bb,ba, tb; + int ar,ag,ab,aa, ta; + rr = (int)(cxform->rr*256);gr = (int)(cxform->gr*256); + rg = (int)(cxform->rg*256);gg = (int)(cxform->gg*256); + rb = (int)(cxform->rb*256);gb = (int)(cxform->gb*256); + ra = (int)(cxform->ra*256);ga = (int)(cxform->ga*256); + br = (int)(cxform->br*256);ar = (int)(cxform->ar*256);tr = (int)(cxform->tr*256); + bg = (int)(cxform->bg*256);ag = (int)(cxform->ag*256);tg = (int)(cxform->tg*256); + bb = (int)(cxform->bb*256);ab = (int)(cxform->ab*256);tb = (int)(cxform->tb*256); + ba = (int)(cxform->ba*256);aa = (int)(cxform->aa*256);ta = (int)(cxform->ta*256); + + for(t=0;tdata[t]; + unsigned char r = (pixel->r * rr + pixel->g * rg + pixel->b * rb + pixel->a * ra + tr) / 256; + unsigned char g = (pixel->r * gr + pixel->g * gg + pixel->b * gb + pixel->a * ga + tg) / 256; + unsigned char b = (pixel->r * br + pixel->g * bg + pixel->b * bb + pixel->a * ba + tb) / 256; + unsigned char a = (pixel->r * ar + pixel->g * ag + pixel->b * ab + pixel->a * aa + ta) / 256; + pixel->r = r; + pixel->g = g; + pixel->b = b; + pixel->a = a; + } +} +void gfxline_dump(gfxline_t*line, FILE*fi, char*prefix) +{ + while(line) { + if(line->type == gfx_moveTo) { + fprintf(fi, "%smoveTo %.2f %.2f\n", prefix, line->x, line->y); + } else if(line->type == gfx_lineTo) { + fprintf(fi, "%slineTo %.2f %.2f\n", prefix, line->x, line->y); + } else if(line->type == gfx_splineTo) { + fprintf(fi, "%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, line->sx, line->sy, line->x, line->y); + } + line = line->next; + } +} + +static char gfxpoint_equals(void*c1, void*c2) +{ + return !memcmp(c1, c2, sizeof(gfxpoint_t)); +} +static unsigned int gfxpoint_hash(void*c) +{ + return string_hash3(c, sizeof(gfxpoint_t)); +} +static void* gfxpoint_clone(void*c) +{ + void*n = malloc(sizeof(gfxpoint_t)); + memcpy(n, c, sizeof(gfxpoint_t)); + return n; +} +static void gfxpoint_destroy(void*c) +{ + free(c); +} +static type_t gfxpoint_type = { + hash: (hash_func)gfxpoint_hash, + equals: (equals_func)gfxpoint_equals, + dup: (dup_func)gfxpoint_clone, + free: (free_func)gfxpoint_destroy, +}; + +gfxline_t* gfxline_restitch(gfxline_t*line) +{ + dict_t*ff = dict_new2(&gfxpoint_type); + dict_t*rev = dict_new2(&gfxpoint_type); + + gfxline_t*prev=0; + while(line) { + gfxline_t*next = line->next; + if(line->type == gfx_moveTo && (line->next && line->next->type != gfx_moveTo)) { + gfxpoint_t xy = {line->x, line->y}; + dict_put(ff, &xy, line); + prev = line; + } else if(!line->next || line->next->type == gfx_moveTo) { + if(prev) { + gfxpoint_t xy = {line->x, line->y}; + dict_put(rev, &xy, prev); + line->next = 0; + prev=0; + } + } + line = next; + } + + gfxpoint_t pos = {0,0}; + + gfxline_t*result = 0; + gfxline_t*last = 0; + + char first = 1; + while(dict_count(ff)) { + char reverse = 0, stitch = 1; + gfxline_t*l = dict_lookup(ff, &pos); + if(l) { + char d = dict_del2(ff,&pos,l);assert(d); + } else { + l = dict_lookup(rev, &pos); + if(l) { + reverse = 1; + char d = dict_del2(rev,&pos,l);assert(d); + } + } + if(!l) { + /* try to find *any* entry. this is costly, but + doesn't happen too often */ + stitch = 0; + DICT_ITERATE_DATA(ff, gfxline_t*, l2) { + l = l2; + break; + } + assert(l); + gfxpoint_t xy = {l->x,l->y}; + char d = dict_del2(ff,&xy,l);assert(d); + } + + gfxline_t*end = l; + if(!reverse) { + while(end->next) end = end->next; + pos.x = end->x; + pos.y = end->y; + char d = dict_del2(rev,&pos,l);assert(d); + } else { + l = gfxline_reverse(l); + pos.x = end->x; + pos.y = end->y; + char d = dict_del2(ff,&pos,end);assert(d); + } + + assert(l->type == gfx_moveTo); + if(stitch && !first) { + /* cut away the moveTo */ + gfxline_t*next = l->next; + free(l); + l = next; + } + + if(!last) { + result = l; + last = end; + } else { + last->next = l; + last = end; + } + first = 0; + } + dict_destroy(ff); + dict_destroy(rev); + return result; +} + +gfxline_t* gfxline_reverse(gfxline_t*line) +{ + gfxline_t*b = 0; + while(line) { + gfxline_t*next = line->next; + if(next && next->type != gfx_moveTo) { + line->type = next->type; + line->sx = next->sx; + line->sy = next->sy; + } else { + line->type = gfx_moveTo; + } + line->next = b; + b = line; + line = next; + } + return b; +} + +void gfxgradient_destroy(gfxgradient_t*gradient) +{ + while(gradient) { + gfxgradient_t*next = gradient->next; + free(gradient); + gradient = next; + } +} + +gfxparams_t* gfxparams_new() +{ + return (gfxparams_t*)rfx_calloc(sizeof(gfxparams_t)); +} + +void gfxparams_store(gfxparams_t*params, const char*key, const char*value) +{ + gfxparam_t*o = params->params; + while(o) { + if(!strcmp(key, o->key)) { + /* overwrite old value */ + free((void*)o->value); + o->value = strdup(value); + return; + } + o = o->next; + } + gfxparam_t*p = (gfxparam_t*)malloc(sizeof(gfxparam_t)); + p->key = strdup(key); + p->value = strdup(value); + p->next = 0; + + if(params->last) { + params->last->next = p; + params->last = p; + } else { + params->params = p; + params->last = p; + } +} + +void gfxparams_free(gfxparams_t*params) +{ + gfxparam_t*p = params->params; + while(p) { + gfxparam_t*next = p->next; + free((void*)p->key); + if(p->value) free((void*)p->value); + free(p); + p = next; + } + free(params); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h new file mode 100644 index 000000000..555deb34c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h @@ -0,0 +1,124 @@ +/* gfxtools.h + + Various utility functions for dealing with gfxdevices (header file). + + Part of the swftools package. + + Copyright (c) 2005 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __gfxtools_h__ +#define __gfxtools_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "../lib/mem.h" +#include "../lib/gfxdevice.h" + +typedef struct _gfxdrawer +{ + void*internal; + gfxcoord_t x,y; + void (*moveTo)(struct _gfxdrawer*d, gfxcoord_t x, gfxcoord_t y); + void (*lineTo)(struct _gfxdrawer*d, gfxcoord_t x, gfxcoord_t y); + void (*splineTo)(struct _gfxdrawer*d, gfxcoord_t sx, gfxcoord_t sy, gfxcoord_t x, gfxcoord_t y); + void (*close)(struct _gfxdrawer*d); + void* (*result)(struct _gfxdrawer*d); +} gfxdrawer_t; + +typedef struct _gfxpoint +{ + gfxcoord_t x,y; +} gfxpoint_t; + +typedef struct _gfxfontlist +{ + gfxfont_t*font; + void*user; + struct _gfxfontlist*next; +} gfxfontlist_t; + +void gfxdrawer_target_gfxline(gfxdrawer_t*d); + +void gfxtool_draw_dashed_line(gfxdrawer_t*d, gfxline_t*line, float*dashes, float phase); +gfxline_t* gfxtool_dash_line(gfxline_t*line, float*dashes, float phase); + +void gfxline_dump(gfxline_t*l, FILE*fi, char*prefix); +gfxline_t* gfxline_append(gfxline_t*line1, gfxline_t*line2); +void gfxline_free(gfxline_t*l); +gfxline_t* gfxline_clone(gfxline_t*line); +void gfxline_optimize(gfxline_t*line); + +void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality); +void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality); + +gfxline_t*gfxline_fromstring(const char*string); + +gfxbbox_t gfxline_getbbox(gfxline_t*line); +gfxbbox_t gfxbbox_expand_to_point(gfxbbox_t box, gfxcoord_t x, gfxcoord_t y); +void gfxbbox_intersect(gfxbbox_t*box1, gfxbbox_t*box2); + +void gfxline_transform(gfxline_t*line, gfxmatrix_t*matrix); + +/* tries to remove unnecessary moveTos from the gfxline */ +gfxline_t* gfxline_restitch(gfxline_t*line); +/* reverses in place */ +gfxline_t* gfxline_reverse(gfxline_t*line); + +void gfxmatrix_dump(gfxmatrix_t*l, FILE*fi, char*prefix); +void gfxmatrix_transform(gfxmatrix_t*m, gfxcoord_t* v1, gfxcoord_t*dest); +void gfxmatrix_invert(gfxmatrix_t*src, gfxmatrix_t*dest); +void gfxmatrix_unit(gfxmatrix_t*m); +void gfxmatrix_multiply(gfxmatrix_t*m1, gfxmatrix_t*m2, gfxmatrix_t*dest); + +gfxfontlist_t* gfxfontlist_create(); +gfxfontlist_t*gfxfontlist_addfont(gfxfontlist_t*list, gfxfont_t*font); +gfxfontlist_t*gfxfontlist_addfont2(gfxfontlist_t*list, gfxfont_t*font, void*user); +gfxfont_t*gfxfontlist_findfont(gfxfontlist_t*list, char*id); +char gfxfontlist_hasfont(gfxfontlist_t*list, gfxfont_t*font); +void* gfxfontlist_getuserdata(gfxfontlist_t*list, const char*id); +void gfxfontlist_free(gfxfontlist_t*list, char deletefonts); + +gfxbbox_t* gfxline_isrectangle(gfxline_t*_l); +gfxbbox_t gfxbbox_expand_to_bbox(gfxbbox_t box, gfxbbox_t box2); + +gfxline_t*gfxline_makerectangle(double x1, double y1, double x2, double y2); +gfxline_t*gfxline_makecircle(double x,double y,double rx, double ry); +void gfxline_show(gfxline_t*line, FILE*fi); + +void gfxgradient_destroy(gfxgradient_t*gradient); + +typedef struct _gfxparam { + const char*key; + const char*value; + struct _gfxparam* next; +} gfxparam_t; +typedef struct _gfxparams { + gfxparam_t*params; + gfxparam_t*last; +} gfxparams_t; +gfxparams_t* gfxparams_new(); +void gfxparams_store(gfxparams_t*params, const char*name, const char*value); +void gfxparams_free(gfxparams_t*params); + +#ifdef __cplusplus +} +#endif + +#endif //__gfxtools_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c new file mode 100644 index 000000000..f0cc989f8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c @@ -0,0 +1,369 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL address + + */ + +#include +#include +#include +#include +/* do we need #include ? conflicts with INFINITY in unicode.h */ +#include "gocr.h" +#include "pgm2asc.h" + +/* for sorting letters by position on the image +/ ToDo: - use function same line like this or include lines.m1 etc. */ +int box_gt(struct box *box1, struct box *box2) { + // box1 after box2 ? + if (box1->line > box2->line) + return 1; + if (box1->line < box2->line) + return 0; + if (box1->x0 > box2->x1) // before + return 1; + if (box1->x1 < box2->x0) // before + return 0; + if (box1->x0 > box2->x0) // before, overlapping! + return 1; + + return 0; +} + +/* --- copy part of pix p into new pix b ---- len=10000 + * Returns: 0 on success, 1 on error. + * naming it as copybox isnt very clever, because it dont have to do with the + * char boxes (struct box) + */ +int copybox (pix * p, int x0, int y0, int dx, int dy, pix * b, int len) { + int x, y; + + /* test boundaries */ + if (b->p == NULL || dx < 0 || dy < 0 || dx * dy > len) { + fprintf(stderr, " error-copybox x=%5d %5d d=%5d %5d\n", x0, y0, dx, dy); + return 1; + } + + b->x = dx; + b->y = dy; + b->bpp = 1; +#ifdef FASTER_INCOMPLETE + for (y = 0; y < dy; y++) + memcpy(&pixel_atp(b, 0, y), &pixel_atp(p, x0, y + y0 ), dx); + // and unmark pixels +#else + for (y = 0; y < dy; y++) + for (x = 0; x < dx; x++) + pixel_atp(b, x, y) = getpixel(p, x + x0, y + y0); +#endif + + return 0; +} + +/* reset table of alternative chars (and free memory) */ +int reset_box_ac(struct box *box){ + int i; + for (i=0; inum_ac; i++) + if (box->tas[i]) { + /* fprintf(stderr,"DBG free_s[%d] %p %s\n",i,box->tas[i],box->tas[i]); */ + free(box->tas[i]); + box->tas[i]=0; /* prevent double freeing */ + } + box->num_ac=0; /* mark as freed */ + return 0; +} + +/* ini or copy a box: get memory for box and initialize the memory */ +struct box *malloc_box (struct box *inibox) { + struct box *buf; + int i; + + buf = (struct box *) malloc(sizeof(struct box)); + if (!buf) + return NULL; + if (inibox) { + memcpy(buf, inibox, sizeof(struct box)); + /* only pointer are copied, we want to copy the contents too */ + for (i=0;inum_ac;i++) { + if (inibox->tas[i]) { + buf->tas[i]=(char *)malloc(strlen(inibox->tas[i])+1); + memcpy(buf->tas[i], inibox->tas[i], strlen(inibox->tas[i])+1); + } + } + } + else { /* ToDo: init it */ + buf->num_ac=0; + buf->num_frames=0; + } + /* fprintf(stderr,"\nDBG ini_box %p",buf); */ + return buf; +} + +/* free memory of box */ +int free_box (struct box *box) { + if (!box) return 0; + /* fprintf(stderr,"DBG free_box %p\n",box); out_x(box); */ + reset_box_ac(box); /* free alternative char table */ + free(box); /* free the box memory */ + return 0; +} + +/* simplify the vectorgraph, + * but what is the best way? + * a) melting two neighbouring vectors with nearly same direction? + * (nearest angle to pi) + * b) melting three neigbours with smallest area? + * ToDo: + * mode = 0 - only lossless + * mode = 1 - reduce one vector, smallest possible loss + * mode = 2 - remove jitter (todo, or somewhere else) + * ToDo: include also loop around (last - first element) + * ToDo: reduce by 10..50% + */ +int reduce_vectors ( struct box *box1, int mode ) { + int i1, i2, nx, ny, mx, my, len, + minlen=1024, /* minlength of to neighbouring vectors */ + besti1=0, /* frame for best reduction */ + besti2=2; /* vector replacing its predecessor */ + double sprod, maxsprod=-1; + if (mode!=1) fprintf(stderr,"ERR not supported yet, ToDo\n"); + for (i2=1,i1=0; i1num_frames; i1++) { /* every frame */ + for (;i2num_frame_vectors[i1]-1; i2++) { /* every vector */ + /* predecessor n */ + nx = box1->frame_vector[i2-0][0] - box1->frame_vector[i2-1][0]; + ny = box1->frame_vector[i2-0][1] - box1->frame_vector[i2-1][1]; + /* successor m */ + mx = box1->frame_vector[i2+1][0] - box1->frame_vector[i2-0][0]; + my = box1->frame_vector[i2+1][1] - box1->frame_vector[i2-0][1]; + /* angle is w = a*b/(|a|*|b|) = 1 means parallel */ + /* normalized: minimize w^2 = (a*b/(|a|*|b|)-1)^2 */ + /* -1=90grd, 0=0grd, -2=180grd */ + sprod = /* fabs */(abs(nx*mx+ny*my)*(nx*mx+ny*my) + /(1.*(nx*nx+ny*ny)*(mx*mx+my*my))-1); + /* we dont include math.h because INFINITY conflicts to unicode,h */ + if (sprod<0) sprod=-sprod; + len = (mx*mx+my*my)*(nx*nx+ny*ny); /* sum lengths^2 */ +// ..c ###c ... .. ... +// .b. len=2+2 #b.. len=2+5 #bc len=1+2 bc len=1+1 b#a len=4+5 +// a.. spr=0 a... spr=1/10 a.. spr=1/4 a. spr=1 ##c spr=9/5 +// + if ( len* sprod* sprod* sprod* sprod + num_frames>0) + for (i2=besti2; i2num_frame_vectors[ box1->num_frames-1 ]-1; i2++) { + box1->frame_vector[i2][0]=box1->frame_vector[i2+1][0]; + box1->frame_vector[i2][1]=box1->frame_vector[i2+1][1]; + } + for (i1=besti1; i1num_frames; i1++) + box1->num_frame_vectors[i1]--; +// fprintf(stderr,"\nDBG_reduce_vectors i= %d nv= %d sprod=%f len2=%d\n# ...", +// besti2,box1->num_frame_vectors[ box1->num_frames-1 ],maxsprod,minlen); +// out_x(box1); + return 0; +} + +/* add the contents of box2 to box1 + * especially add vectors of box2 to box1 + */ +int merge_boxes( struct box *box1, struct box *box2 ) { + int i1, i2, i3, i4; + struct box tmpbox, *bsmaller, *bbigger; /* for mixing and sorting */ + /* DEBUG, use valgrind to check uninitialized memory */ +#if 0 + fprintf(stderr,"\nDBG merge_boxes_input:"); out_x(box1); out_x(box2); +#endif + /* pair distance is to expendable, taking borders is easier */ + if ((box2->x1 - box2->x0)*(box2->y1 - box2->y0) + >(box1->x1 - box1->x0)*(box1->y1 - box1->y0)) { + bbigger=box2; bsmaller=box1; } + else { + bbigger=box1; bsmaller=box2; } + /* ToDo: does not work if a third box is added */ + if (box2->y0>box1->y1 || box2->y1y0 + || box2->x0>box1->x1 || box2->x1x0) { + box1->num_boxes += box2->num_boxes; /* num seperate objects 2=ij */ + } else { + if (box2->num_boxes>box1->num_boxes) box1->num_boxes=box2->num_boxes; + box1->num_subboxes += box2->num_subboxes+1; /* num holes 1=abdepq 2=B */ + } + box1->dots += box2->dots; /* num i-dots */ + if ( box2->x0 < box1->x0 ) box1->x0 = box2->x0; + if ( box2->x1 > box1->x1 ) box1->x1 = box2->x1; + if ( box2->y0 < box1->y0 ) box1->y0 = box2->y0; + if ( box2->y1 > box1->y1 ) box1->y1 = box2->y1; + i1 = i2 = 0; + if (bbigger->num_frames) + i1 = bbigger->num_frame_vectors[ bbigger->num_frames - 1 ]; + if (bsmaller->num_frames) + i2 = bsmaller->num_frame_vectors[ bsmaller->num_frames - 1 ]; + while (i1+i2 > MaxFrameVectors) { + if (i1>i2) { reduce_vectors( bbigger, 1 ); i1--; } + else { reduce_vectors( bsmaller, 1 ); i2--; } + } + /* if i1+i2>MaxFrameVectors simplify the vectorgraph */ + /* if sum num_frames>MaxNumFrames through shortest graph away and warn */ + /* first copy the bigger box */ + memcpy(&tmpbox, bbigger, sizeof(struct box)); + /* attach the smaller box */ + for (i4=i3=0; i3num_frames; i3++) { + if (tmpbox.num_frames>=MaxNumFrames) break; + + for (; i4num_frame_vectors[i3]; i4++) { + memcpy(tmpbox.frame_vector[i1], + bsmaller->frame_vector[i4],2*sizeof(int)); + i1++; + } + tmpbox.num_frame_vectors[ tmpbox.num_frames ] = i1; + tmpbox.frame_vol[ tmpbox.num_frames ] = bsmaller->frame_vol[ i3 ]; + tmpbox.frame_per[ tmpbox.num_frames ] = bsmaller->frame_per[ i3 ]; + tmpbox.num_frames++; + if (tmpbox.num_frames>=MaxNumFrames) { + if (JOB->cfg.verbose) + fprintf(stderr,"\nDBG merge_boxes MaxNumFrames reached"); + break; + } + } + /* copy tmpbox to destination */ + box1->num_frames = tmpbox.num_frames; + memcpy(box1->num_frame_vectors, + tmpbox.num_frame_vectors,sizeof(int)*MaxNumFrames); + memcpy(box1->frame_vol, + tmpbox.frame_vol,sizeof(int)*MaxNumFrames); + memcpy(box1->frame_per, + tmpbox.frame_per,sizeof(int)*MaxNumFrames); + memcpy(box1->frame_vector, + tmpbox.frame_vector,sizeof(int)*2*MaxFrameVectors); +#if 0 + if (JOB->cfg.verbose) + fprintf(stderr,"\nDBG merge_boxes_result:"); out_x(box1); +#endif + return 0; +} + +/* used for division of glued chars + * after a box is splitted into 2, where vectors are copied to both, + * vectors outside the new box are cutted and thrown away, + * later replaced by + * - 1st remove outside vectors with outside neighbours (complete frames?) + * add vector on outside vector with inside neighbours + * care about connections through box between outside vectors + * - 2nd reduce outside crossings (inclusive splitting frames if necessary) + * depending on direction (rotation) of outside connections + * - 3th shift outside vectors to crossing points + * - split add this points, connect only in-out...out-in, + * - cutting can result in more objects + * ToDo: dont connect --1---2--------3----4-- new-y1 (inside above not drawn) + * \ \->>>>-/ / outside + * \----<<<<-----/ old-y1 + * |======| subtractable? + * + * only connect --1---2--------3----4-- new-y1 + * \>>/ \>>>/ old-y1 outside + * + * ToDo: new vol, per + */ +int cut_box( struct box *box1) { + int i1, i2, i3, i4, x, y, lx, ly, dbg=0; + if (JOB->cfg.verbose) dbg=1; // debug level, enlarge to get more output + if (dbg) fprintf(stderr,"\n cut box x= %3d %3d", box1->x0, box1->y0); + /* check if complete frames are outside the box */ + for (i1=0; i1num_frames; i1++){ + if (dbg>2) fprintf(stderr,"\n checking frame %d outside", i1); + i2 = ((i1)?box1->num_frame_vectors[ i1-1 ]:0); // this frame + i3 = box1->num_frame_vectors[ i1 ]; // next frame + for (i4=i2; i4 < i3; i4++) { + x = box1->frame_vector[i4][0]; + y = box1->frame_vector[i4][1]; + /* break, if one vector is lying inside */ + if (x>=box1->x0 && x<=box1->x1 && y>=box1->y0 && y<=box1->y1) break; + } + if (i4==i3) { /* all vectors outside */ + if (dbg>1) fprintf(stderr,"\n remove frame %d",i1); + /* replace all frames i1,i1+1,... by i1+1,i1+2,... */ + /* replace (x,y) pairs first */ + for (i4=i2; i4num_frame_vectors[ box1->num_frames-1 ]-(i3-i2); + i4++) { + box1->frame_vector[i4][0] = box1->frame_vector[i4+i3-i2][0]; + box1->frame_vector[i4][1] = box1->frame_vector[i4+i3-i2][1]; + } + /* replace the num_frame_vectors */ + for (i4=i1; i4num_frames-1; i4++) + box1->num_frame_vectors[ i4 ] = + box1->num_frame_vectors[ i4+1 ]-(i3-i2); + box1->num_frames--; i1--; + } + } + /* remove vectors outside the box */ + i3=0; + for (i1=0; i1num_frames; i1++){ + if (dbg>2) fprintf(stderr,"\n check cutting vectors on frame %d", i1); + x = box1->frame_vector[0][0]; /* last x */ + y = box1->frame_vector[0][1]; /* last y */ + /* ToDo: start inside to get a closed object */ + if (xx0 || x>box1->x1 || yy0 || y>box1->y1) i3=1; + for (i2=0; i2num_frame_vectors[ i1 ]; i2++) { + lx = x; /* last x */ + ly = y; /* last y */ + x = box1->frame_vector[i2][0]; + y = box1->frame_vector[i2][1]; + // fprintf(stderr,"DBG LEV3 i2= %3d xy= %3d %3d",i2,x,y); + /* check if outside */ + if (xx0 || x>box1->x1 || yy0 || y>box1->y1) { + /* replace by nearest point at border, ToDo: better crossingpoint */ + if (i3==0) { /* wrong if it starts outside */ + if (x < box1->x0) x = box1->frame_vector[i2][0] = box1->x0; + if (x > box1->x1) x = box1->frame_vector[i2][0] = box1->x1; + if (y < box1->y0) y = box1->frame_vector[i2][1] = box1->y0; + if (y > box1->y1) y = box1->frame_vector[i2][1] = box1->y1; + } else { + /* remove vector */ + if (dbg>1) fprintf(stderr,"\n remove vector[%d][%d] x= %2d %2d",i1,i2,x-box1->x0,y-box1->y0); + for (i4=i2;i4num_frame_vectors[ box1->num_frames-1 ]-1;i4++) { + box1->frame_vector[i4][0] = box1->frame_vector[i4+1][0]; + box1->frame_vector[i4][1] = box1->frame_vector[i4+1][1]; + } + for (i4=i1; i4num_frames; i4++) + box1->num_frame_vectors[ i4 ]--; + i2--; /* next element is shiftet now, setting back the counter */ + } + i3++; + // fprintf(stderr," outside i3= %d\n",i3); + continue; + } + // fprintf(stderr," inside i3= %d",i3); + if (i3) { /* ToDo: better crossing point last vector and border */ + if (lx < box1->x0) lx = box1->x0; + if (lx > box1->x1) lx = box1->x1; + if (ly < box1->y0) ly = box1->y0; + if (ly > box1->y1) ly = box1->y1; + x = box1->frame_vector[i2][0] = lx; + y = box1->frame_vector[i2][1] = ly; + i3 = 0; + } + // fprintf(stderr," xy= %3d %3d\n",x,y); + } + } + //if (dbg>2) { fprintf(stderr,"\nDBG cut_box_result:"); out_x(box1); } + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c new file mode 100644 index 000000000..21a4f02ad --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c @@ -0,0 +1,451 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL address + */ + +#include +#include +#include "gocr.h" +#include "pnm.h" +#include "pgm2asc.h" +#include +#include + +#define Blen 256 + +// load boxes from database into boxlist (for faster access) +// used as alternate engine, comparing chars with database +int load_db(void) { + FILE *f1; + char s1[Blen+1], + s2[Blen+1] = "./db/", /* ToDo: replace by constant! by configure */ + *s3; + int i, j, ii, i2, line; + struct box *box1; + pix *pp; + + if( JOB->cfg.db_path ) strncpy(s2,JOB->cfg.db_path,Blen-1); + i2=strlen(s2); + if (JOB->cfg.verbose) + fprintf(stderr, "# load database %s %s ... ",s2,JOB->cfg.db_path); + + strncpy(s2+i2,"db.lst",Blen-i2);s2[Blen]=0; + f1 = fopen(s2, "r"); + if (!f1) { + fprintf(stderr, " DB %s not found\n",s2); + return 1; + } + + line = 0; /* line counter for better error report */ + for (ii = 0; !feof(f1); ii++) { +/* bbg: should write a better input routine */ + if (!fgets(s1, Blen, f1)) break; line++; + j = strlen(s1); + /* remove carriage return sequences from line */ + while (j > 0 && (s1[j - 1] == '\r' || s1[j - 1] == '\n')) + s1[--j] = 0; + if (!j) continue; /* skip empty line */ + if (s1[0]=='#') continue; /* skip comments (v0.44) */ + /* copy file name */ + for (i = 0; i < j && i+i2 < Blen && strchr(" \t,;",s1[i]) == 0; i++) + s2[i2 + i] = s1[i]; + s2[i2+i]=0; + /* skip spaces */ + for (; i < j && strchr(" \t",s1[i]) != 0; i++); + /* by now: read pix, fill box, goto next ??? */ + pp = (pix *)malloc(sizeof(pix)); + if( !pp ) fprintf(stderr,"malloc error in load_db pix\n"); + + //readpgm(s2, pp, 0 * JOB->cfg.verbose); + fprintf(stderr, "Can't call readpgm()\n"); + + box1 = (struct box *)malloc_box(NULL); + if(!box1) fprintf(stderr,"malloc error in load_db box1\n"); + box1->x0 = 0; + box1->x1 = pp->x-1; // white border 1 pixel width + box1->y0 = 0; + box1->y1 = pp->y-1; + box1->x = 1; + box1->y = 1; + box1->dots = 0; + box1->c = 0; + box1->modifier = 0; /* ToDo: obsolete */ + box1->tas[0]=NULL; + box1->tac[0]=0; + box1->wac[0]=100; /* really 100% sure? */ + box1->num_ac=1; + if (s1[i]=='"'){ /* parse a string */ + j=strrchr(s1+i+1,'"')-(s1+i+1); /* we only look for first and last "" */ + if (j>=1) { + s3=(char *)malloc(j+1); + if (!s3) fprintf (stderr, "malloc error in load_db s3\n"); + if (s3) { + memcpy(s3,s1+i+1,j); + s3[j]=0; + box1->tas[0]=s3; + // fprintf(stderr,"\nstring=%s",s3); + } + } else { fprintf(stderr,"load_db: string parse error L%d\n",line); } + } else { + box1->tac[0] = box1->c = s1[i]; /* try to interpret as ASCII */ + /* we can live without hexcode in future if we use UTF8-strings */ + s3=s1+i; + j=strtol( s1+i, &s3, 16); /* try to read 4 to 8 digit hex unicode */ + /* if its an hexcode, ASCII interpretation is overwritten */ + if( j && i+3<=Blen && s3-s1-i>3 ) box1->tac[0] = box1->c = j; + // fprintf(stderr,"\nhexcode=%04x=%04x %d",(int)j,(int)box1->c,s3-s1-i); + } + box1->num = 0; + box1->line = -1; + box1->m1 = 0; /* ToDo: should be given too in the database! */ + box1->m2 = 0; + box1->m3 = 0; + box1->m4 = 0; + box1->p = pp; + list_app(&JOB->tmp.dblist, box1); // append to list +#if 0 + out_x(box1); +#endif + } + fclose(f1); + if (JOB->cfg.verbose) + fprintf(stderr, " %d chars loaded\n", ii); + return 0; +} + +// expand database from box/boxlist name=db_$utime.pbm +// this is added in version v0.3.3 +int store_db(struct box *box1) { + FILE *f1; + char s2[Blen+1] = "./db/", s3[Blen+1]; + int i2, dx, dy; + pix b; /* temporary mini page */ + + if( JOB->cfg.db_path ) strncpy(s2,JOB->cfg.db_path,Blen-1); + i2=strlen(s2); + + /* name generation can cause problems, if called twice within a second */ + if (box1->num_ac && box1->tas[0]) + sprintf(s3,"db_%04x_%lu.pbm", (unsigned int)box1->tas[0][0], + (unsigned long)time(NULL)); + else + sprintf(s3,"db_%04x_%lu.pbm", (unsigned int)box1->c, + (unsigned long)time(NULL)); + /* ToDo: the file name may be not unique */ + strncpy(s2+i2,"db.lst",Blen-i2);s2[Blen]=0; + f1 = fopen(s2, "a"); + if (!f1) { + fprintf(stderr, " could not access %s\n",s2); + return 1; + } + strncpy(s2+i2,s3,strlen(s3)); s2[i2+strlen(s3)]=0; + /* store image and infos about the char */ + /* ToDo: store the vector list instead of the pixelarray */ + + if (JOB->cfg.verbose) + fprintf(stderr, "store_db: add file %s to database\n#",s3); + dx=box1->x1-box1->x0+1; + dy=box1->y1-box1->y0+1; + b.p = (unsigned char *) malloc( dx * dy ); + if( !b.p ){ + fprintf( stderr, "\nFATAL: malloc failed, skip store_db" ); + return 2; + } + if (copybox(box1->p, box1->x0, box1->y0, dx, dy, &b, dx * dy)) + return -1; + + //writepbm(s2,&b); /* What is to do on error? */ + + free(b.p); + + /* store the database line */ + /* some infos about box1->m1,..,m4 should added (base line, high etc.) */ + if (box1->num_ac && box1->tas[0]) { + fprintf(f1, "%s \"%s\"\n",s3,box1->tas[0]); + /* ToDo: what if tas contains '"'? */ + } else { + if( (box1->c >= '0' && box1->c <= '9') + || (box1->c >= 'A' && box1->c <= 'Z') + || (box1->c >= 'a' && box1->c <= 'z') ) + fprintf(f1, "%s %c\n",s3,(char)box1->c); + else { + if (((box1->c)>>16)>>16) + fprintf(f1, "%s %08x\n",s3,(unsigned int)box1->c); + else + fprintf(f1, "%s %04x\n",s3,(unsigned int)box1->c); + } + } + fclose(f1); + return 0; +} + +/* function is only for user prompt on console to identify chars + it prints out a part of pixmap b at point x0,y0 to stderr + using dots .,; if no pixel, and @xoO for pixels + */ +void out_env(struct box *px ){ + int x0,y0,x1,y1,dx,dy,x,y,x2,y2,yy0,tx,ty,i,cs; + char c1, c2; pix *b; + cs=JOB->cfg.cs; + yy0=px->y0; + { /* overwrite rest of arguments */ + b=px->p; + x0=px->x0; x1=px->x1; dx=x1-x0+1; + y0=px->y0; y1=px->y1; dy=y1-y0+1; + y0-=2; y1+=2; + if (px->m4 && y0>px->m1) y0=px->m1; + if (px->m4 && y1m4) y1=px->m4; + if (x1-x0+1<52) { x0-=10; x1+=10; } /* fragment? expand frame */ + if (x1-x0+1<52) { x0-=10; x1+=10; } /* fragment? expand frame */ + if (x1-x0+1<62) { x0-=5; x1+=5; } + if (y1-y0+1<10) { y0-= 4; y1+= 4; } /* fragment? */ + if (x0<0) x0=0; if (x1>=b->x) x1=b->x-1; + if (y0<0) y0=0; if (y1>=b->y) y1=b->y-1; + dx=x1-x0+1; + dy=y1-y0+1; yy0=y0; + fprintf(stderr,"\n# show box + environment"); + fprintf(stderr,"\n# show box x= %4d %4d d= %3d %3d r= %d %d", + px->x0, px->y0, px->x1 - px->x0 + 1, px->y1 - px->y0 + 1, + px->x - px->x0, px->y - px->y0); + if (px->num_ac){ /* output table of chars and its probabilities */ + fprintf(stderr,"\n# list box char: "); + for(i=0;inum_ac && itas[i]) + fprintf(stderr," %s(%d)", px->tas[i] ,px->wac[i]); + else + fprintf(stderr," %s(%d)",decode(px->tac[i],ASCII),px->wac[i]); + } + fprintf(stderr,"\n"); + if (px->dots && px->m2 && px->m1m1; dy=px->y1-yy0+1; } + } + tx=dx/80+1; + ty=dy/40+1; // step, usually 1, but greater on large maps + fprintf(stderr,"# show pattern x= %4d %4d d= %3d %3d t= %d %d\n", + x0,y0,dx,dy,tx,ty); + if (dx>0) + for(y=yy0;yx0 || x > px->x1 + || y+ty-1 < px->y0 || y > px->y1) c1=((c1=='#')?'O':','); + fprintf(stderr,"%c", c1 ); + } + + c1=c2=' '; + /* mark lines with < */ + if (px) if (y==px->m1 || y==px->m2 || y==px->m3 || y==px->m4) c1='<'; + if (y==px->y0 || y==px->y1) c2='-'; /* boxmarks */ + fprintf(stderr,"%c%c\n",c1,c2); + } +} + + +/* +// second variant, for database (with slightly other behaviour) +// new variant +// look at the environment of the pixel too (contrast etc.) +// detailed analysis only of diff pixels! +// +// 100% * distance, 0 is best fit +// = similarity of 2 chars for recognition of noisy chars +// weigth of pixels with only one same neighbour set to 0 +// look at contours too! + ToDo: especially on small boxes distance should only be 0 if + characters are 100% identical! +*/ +// #define DEBUG 2 +int distance2( pix *p1, struct box *box1, + pix *p2, struct box *box2, int cs){ + int rc=0,x,y,v1,v2,i1,i2,rgood=0,rbad=0, + x1,y1,x2,y2,dx,dy,dx1,dy1,dx2,dy2,tx,ty; +#if DEBUG == 2 + if(JOB->cfg.verbose) + fprintf(stderr," DEBUG: distance2\n"); +#endif + x1=box1->x0;y1=box1->y0;x2=box2->x0;y2=box2->y0; + dx1=box1->x1-box1->x0+1; dx2=box2->x1-box2->x0+1; dx=((dx1>dx2)?dx1:dx2);dx=dx1; + dy1=box1->y1-box1->y0+1; dy2=box2->y1-box2->y0+1; dy=((dy1>dy2)?dy1:dy2);dy=dy1; + if(abs(dx1-dx2)>1+dx/16 || abs(dy1-dy2)>1+dy/16) rbad++; // how to weight? + // compare relations to baseline and upper line + if(box1->m4>0 && box2->m4>0){ // used ??? + if(2*box1->y1>box1->m3+box1->m4 && 2*box2->y1m3+box2->m4) rbad+=128; + if(2*box1->y0>box1->m1+box1->m2 && 2*box2->y0m1+box2->m2) rbad+=128; + } + tx=dx/16; if(dx<17)tx=1; // raster + ty=dy/32; if(dy<33)ty=1; + // compare pixels + for( y=0;y0) + rbad+=16*v1; + } + if(rgood+rbad) rc= 100*rbad/(rgood+rbad); else rc=99; + /* if width/high is not correct add badness */ + rc += ( abs(dx1*dy2-dx2*dy1) * 10 ) / (dy1*dy2); + if (rc>100) rc=100; + if(/* rc<10 && */ JOB->cfg.verbose /* &1024 */){ +#if DEBUG == 2 + fprintf(stderr," distance2 rc=%d rgood=%d rbad=%d\n",rc,rgood,rbad); +// out_b(NULL,p1,box1->x0,box1->y0,box1->x1-box1->x0+1, +// box1->y1-box1->y0+1,cs); +// out_b(NULL,p2,box2->x0,box2->y0,box2->x1-box2->x0+1, +// box2->y1-box2->y0+1,cs); + out_x(box1); + out_x(box2); +#endif + } + return rc; +} + +wchar_t ocr_db(struct box *box1) { + int dd = 1000, dist = 1000; + wchar_t c = UNKNOWN; + char buf[200]; + Box *box2, *box3; + + if (!list_empty(&JOB->tmp.dblist)){ + box3 = (Box *)list_get_header(&JOB->tmp.dblist); + if(JOB->cfg.verbose) + fprintf(stderr,"\n#DEBUG: ocr_db (%d,%d) ",box1->x0, box1->y0); + + for_each_data(&JOB->tmp.dblist) { + box2 = (Box *)list_get_current(&JOB->tmp.dblist); + /* do preselect!!! distance() slowly */ + dd = distance2( box2->p, box2, box1->p, box1, JOB->cfg.cs); + if (dd <= dist) { /* new best fit */ + dist = dd; + box3 = box2; /* box3 is a pointer and not copied box2 */ + + if (dist<100 && 100-dist > JOB->cfg.certainty) { + /* some deviation of the pattern is tolerated */ + int i, wa; + for (i=0;inum_ac;i++) { + wa = (100-dist)*box3->wac[i]/100; /* weight *= (100-dist) */ + if (box3->tas[i]) setas(box1,box3->tas[i],wa); + else setac(box1,box3->tac[i],wa); + } + if (box3->num_ac) c=box3->tac[0]; /* 0 for strings (!UNKNOWN) */ + if (JOB->cfg.verbose) + fprintf(stderr, " dist=%4d c= %c 0x%02x %s wc= %3d", dist, + ((box3->c>32 && box3->c<127) ? (char) box3->c : '.'), + (int)box3->c, ((box3->tas[0])?box3->tas[0]:""), box3->wac[0]); + } + if (dd<=0 && ((box3->num_ac && box3->tas[0]) || box3->c >= 128 + || !strchr ("l1|I0O", box3->c))) + break; /* speedup if found */ + } + } end_for_each(&JOB->tmp.dblist); + + } + + if( (JOB->cfg.mode&128) != 0 && c == UNKNOWN ) { /* prompt the user */ + /* should the output go to stderr or special pipe??? */ + int utf8_ok=0; /* trigger this flag if input is ok */ + int i, endchar; /* index */ + out_env(box1); /* old: out_x(box1); */ + fprintf(stderr,"The above pattern was not recognized.\n" + "Enter UTF8 char or string for above pattern. Leave empty if unsure.\n" + "Press RET at the end (ALT+RET to store into RAM only) : " + ); /* ToDo: empty + alt-return (0x1b 0x0a) for help? ^a for skip all */ + /* UTF-8 (man 7 utf-8): + * 7bit = 0xxxxxxx (0000-007F) + * 11bit = 110xxxxx 10xxxxxx (0080-07FF) + * 16bit = 1110xxxx 10xxxxxx 10xxxxxx (0800-FFFF) + * 21bit = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + * 26bit = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + * 31bit = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + */ + buf[0]=0; + /* shift/ctrl/altgr-enter acts like enter or ^j or ^m, + * alt-enter returns 0x1b 0x0a and returns from fgets() + * ^d (EOF) returns (nil) from fgets() + * x+(2*)ctrl-d returns from fgets() without returning a 0x0a + * if not UTF-input-mode, we are in trouble? + * ^a=0x01, ^b=0x02, ^e=05, ..., ToDo: meaning of no-input or <=space + */ + fgets(buf,200,stdin); /* including \n=0x0a */ + dd=strlen(buf); + /* output hexcode if verbose set */ + if (JOB->cfg.verbose) { + fprintf(stderr, "\n# fgets [%d]:", dd); + for(i=0; icfg.mode&=~128; } /* skip all */ + buf[dd=i]=0; /* replace final 0x0a or other special codes */ + if (dd==1 && !(buf[0]&128)) { c=buf[0]; utf8_ok=1; } /* single char */ + if (dd>1 && dd<7) { /* try to decode single wide char (utf8) */ + int u0, u1; /* define UTF8-start sequences, u0=0bits u1=1bits */ + u0= 1<<(7-dd); /* compute start byte from UTF8-length */ + u1=255&~((1<<(8-dd))-1); + for (i=1;i0){ /* ToDo: skip space and tab too? */ + if (utf8_ok==1) { setac(box1, c, 100); } /* store single wchar */ + if (utf8_ok==0) { /* store a string of chars (UTF8-string) */ + c='_'; /* what should we do with c? probably a bad idea? */ + setas(box1, buf, 100); + } + /* decide between + * 0) just help gocr to find the results and (dont remember, 0x01) + * 1) help and remember in the same run (store to memory, 0x1b) + * 2) expand the database (dont store ugly chars to the database!) + */ + if (endchar!=0x01){ /* ^a before hit return */ + /* is there a reason to dont store to memory? */ + list_app(&JOB->tmp.dblist, box1); /* append to list for 1+2 */ + } + if (endchar!=0x01 && endchar!=0x1b){ + store_db(box1); /* store to disk for 2 */ + } + if (JOB->cfg.verbose) + fprintf(stderr, " got char= %c 16bit= 0x%04x string= \"%s\"\n", + ((c>32 && c<127)?(char)c:'.'), (int)c, buf); + } + } + + return c; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c new file mode 100644 index 000000000..bfd3ec9e2 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c @@ -0,0 +1,943 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + check README for my email address +*/ + +#include +#include +#include +#include // toupper, tolower +#include "pgm2asc.h" +#include "gocr.h" + +// ----- detect lines --------------- +/* suggestion: Fourier transform and set line frequency where the + amplitude has a maximum (JS: slow and not smarty enough). + + option: range for line numbers 1..1000 or similar + todo: look for thickest line, and divide if thickness=2*mean_thickness + Set these elements of the box structs: + + m1 <-- top of upper case letters and (bdfhkl) (can differ) + m2 <-- top of letters (acegmnopqrsuvwxyz) + m3 <-- baseline + m4 <-- bottom of hanging letters (gqpy) + + performance can be improved by working with a temporary + list of boxes of the special text line + + - Jun23,00 more robustness of m3 (test liebfrau1) + - Feb01,02 more robustness of m4 (test s46_084.pgm) + - Dec03,12 fix problems with footnotes + ToDo: + - generate lists of boxes per line (faster access) + - use statistics + - for each box look at it neighbours and set box-m1..m4 + - m[1..4].max .min if m4.min-m3.max<1 probability lower + */ +int detect_lines1(pix * p, int x0, int y0, int dx, int dy) +{ + int i, jj, j2, y, yy, my, mi, mc, i1, i2, i3, i4, + m1, m2, m3, m4, ma1, ma2, ma3, ma4, m3pre, m4pre; + struct box *box2, *box3; /* box3 is for verbose / debugging */ + struct tlines *lines = &JOB->res.lines; + + /* ToDo: optional read line-data from external source??? */ + if (lines->num == 0) { // initialize one dummy-line for pictures etc. + lines->m4[0] = 0; + lines->m3[0] = 0; + lines->m2[0] = 0; + lines->m1[0] = 0; + lines->x0[0] = p->x; /* expand to left end during detection */ + lines->x1[0] = 0; /* expand to right end */ + lines->pitch[0] = JOB->cfg.spc; /* default word pitch */ + lines->mono[0] = 0; /* default spacing = prop */ + lines->num++; + } + i = lines->num; + if (dy < 4) + return 0; /* image is to low for latin chars */ + my = jj = 0; + // get the mean height of all hollow chars + // (better than mean value of everything including bg-pattern or dust?) + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if ( box2->c != PICTURE + && box2->num_frames>1 && box2->num_frames<3 /* 1 or 2 holes */ + && box2->y0 >= y0 && box2->y1 <= y0 + dy + && box2->x0 >= x0 && box2->x1 <= x0 + dx + && box2->frame_vol[0]>0 + && box2->frame_vol[1]<0 + ) { + jj++; + my += box2->y1 - box2->y0 + 1; + } + } end_for_each(&(JOB->res.boxlist)); + if (jj==0) { + // get the mean height of all chars + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if ( box2->c != PICTURE + && box2->y1 - box2->y0 + 1 >= 4 /* 4x6 font */ + && box2->y0 >= y0 && box2->y1 <= y0 + dy + && box2->x0 >= x0 && box2->x1 <= x0 + dx ) { + jj++; + my += box2->y1 - box2->y0 + 1; + } + } end_for_each(&(JOB->res.boxlist)); + } + if (jj == 0) + return 0; /* no chars detected */ + + + /* ToDo: a better way could be to mark good boxes (of typical high a-zA-Z0-9) + * first and handle only marked boxes for line scan, exclude ?!,.:;etc + * but without setect the chars itself (using good statistics) + * see adjust_text_lines() + */ + my /= jj; /* we only care about chars with high arround my */ + if (JOB->cfg.verbose & 16) + fprintf(stderr,"\n# detect_lines1(%d %d %d %d) vvv&16 chars=%d my=%d\n# ", + x0, y0, dx, dy, jj, my); + // "my" is the average over the whole image (bad, if different fontsizes) + + if (my < 4) + return 0; /* mean high is to small => error */ + + m4pre=m3pre=y0; /* lower bond of upper line */ + // better function for scanning line around a letter ??? + // or define lines around known chars "eaTmM" + for (j2 = y = y0; y < y0 + dy; y++) { + // look for max. of upper and lower bound of next line + m1 = y0 + dy; + jj = 0; +#if 1 + /* this is only for test runs */ + if (JOB->cfg.verbose & 16) + fprintf(stderr,"searching new line %d\n# ",i /* lines->num */); +#endif + + box3 = NULL; /* mark the most upper box starting next line */ + // find highest point of next line => store to m1-min (m1>=y) + // only objects greater 2/3*my and smaller 3*my are allowed + // a higher "!" at end of line can result in a to low m1 + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->line>0 || box2->c == PICTURE) continue; + if (lines->dx) + yy = lines->dy * box2->x0 / (lines->dx); /* correct crooked lines */ + else yy=0; + if ( box2->y0 >= y + yy && box2->y1 < y0 + dy // lower than y + && box2->x0 >= x0 && box2->x1 < x0 + dx // within box ? + && box2->c != PICTURE // no picture + && box2->num_boxes <= 1 // ignore 2 for "!?i" 3 for "ä" + && 3 * (box2->y1 - box2->y0) > 2 * my // not to small + && (box2->y1 - box2->y0) < 3 * my // not to big + && (box2->y1 - box2->y0) > 4) // minimum absolute size + { + if (box2->y0 < m1 + yy) { + m1 = box2->y0 - yy; /* highest upper boundary */ + box3 = box2; + } + // fprintf(stderr,"\n %3d %3d %+3d %d m1= %3d", + // box2->x0, box2->y0, box2->y1 - box2->y0 + 1, box2->num_boxes, m1); + } + } end_for_each(&(JOB->res.boxlist)); + if (!box3 || m1 >= y0+dy) break; /* no further line found */ + if (JOB->cfg.verbose & 16) + fprintf(stderr," most upper box at new line xy= %4d %4d %+4d %+4d\n# ", + box3->x0, box3->y0, box3->x1-box3->x0, box3->y1-box3->y0); + + // at the moment values depend from single chars, which can + // result in bad values (ex: 4x6 /\=) + // ToDo: 2) mean size of next line (store list of y0,y1) + // ToDo: 3) count num0[(y0-m1)*16/my], num1[(y1-m1)*16/my] + // ToDo: or down-top search horizontal nerarest neighbours + lines->x0[i] = x0 + dx - 1; /* expand during operation to left end */ + lines->x1[i] = x0; /* expand to the right end of line */ + m4=m2=m1; mi=m1+my; m3=m1+2*my; jj=0; + // find limits for upper bound, base line and ground line + // m2-max m3-min m4-max + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->line>0 || box2->c == PICTURE) continue; + if ( box2->y0 < y0 || box2->y1 >= y0 + dy + || box2->x0 < x0 || box2->x1 >= x0 + dx ) continue; // out of image + if (lines->dx) yy = lines->dy * box2->x0 / (lines->dx); + else yy=0; + /* check for ij-dots, used if chars of same high */ + if ( box2->y0 >= y + yy + && box2->y0 >= y + && (box2->y1 - box2->y0) < my + && box2->y1 < m1 + yy + my/4 + && box2->y0 < mi + yy ) { + mi = box2->y0 - yy; /* highest upper boundary i-dot */ + } + // fprintf(stderr,"\n check %3d %3d-%3d y=%d yy=%d m1=%d", box2->x0, box2->y0, box2->y1, y, yy, m1); + /* get m2-max m3-min m4-max */ + if ( box2->y0 >= y + yy // lower than y + && 3 * (box2->y1 - box2->y0 + 1) > 2 * my // right size ? + && (box2->y1 - box2->y0 + 1) < 3 * my // font mix, size = 2.6*my + && (box2->y1 - box2->y0 + 1) > 3 // 4x6 lowercase=4 + && box2->y0 >= m1 // in m1 range? + && box2->y0 <= m1 + yy + 9 * my / 8 // my can be to small if mixed + // ToDo: we need a better (local?) algorithm for big headlines > 2*my + && box2->y1 <= m1 + yy + 3 * my + && box2->y1 >= m1 + yy + my / 2 + // lines can differ in high, my may be to small (smaller headlines) + && box2->y0+box2->y1 <= 2*box3->y1 + ) + { + jj++; // count chars for debugging purpose + if (box2->y0 > m2 + yy) { + m2 = box2->y0 - yy; /* highest upper boundary */ + if (JOB->cfg.verbose & 16) + fprintf(stderr," set m2= %d yy= %d\n# ",m2, yy); + } + if (box2->y1 > m4 + yy && (my>6 || box2->y1 < m3+my)) { + m4 = box2->y1 - yy; /* lowest lower boundary, small font lines can touch */ + } + if ( box2->y1 < m3 + yy + && ( ( 2*box2->y1 > m2+ m4+yy && m2>m1) + || ( 4*box2->y1 > m1+3*m4+yy) ) ) // care for TeX: \(^1\)Footnote 2003 + /* "'!?" could cause trouble here, therefore this lines */ + /* ToDo: get_bw costs time, check pre and next */ + if( get_bw(box2->x0,box2->x1,box2->y1+1 ,box2->y1+my/2,box2->p,JOB->cfg.cs,1) == 0 + || get_bw(box2->x0,box2->x1,box2->y1+my/2,box2->y1+my/2,box2->p,JOB->cfg.cs,1) == 1 + || num_cross(box2->x0,box2->x1,(box2->y0+box2->y1)/2,(box2->y0+box2->y1)/2,box2->p,JOB->cfg.cs)>2 ) + { + m3 = box2->y1 - yy; /* highest lower boundary */ + // printf("\n# set1 m3 m=%3d %+2d %+2d %+2d",m1,m2-m1,m3-m1,m4-m1); + // out_x(box2); + } + if (box2->y0 + box2->y1 > 2*(m3 + yy) + && box2->y1 < m4 + yy - my/4 -1 + && box2->y1 >= (m2 + m4)/2 // care for TeX: \(^1\)Footnote 2003 + && m2 > m1 ) // be sure to not use ', m2 must be ok + { + m3 = box2->y1 - yy; /* highest lower boundary */ + // printf("\n# set2 m3 m=%3d %+2d %+2d %+2d",m1,m2-m1,m3-m1,m4-m1); + // out_x(box2); + } + if (box2->x1>lines->x1[i]) lines->x1[i] = box2->x1; /* right end */ + if (box2->x0x0[i]) lines->x0[i] = box2->x0; /* left end */ + // printf(" m=%3d %+2d %+2d %+2d yy=%3d\n",m1,m2-m1,m3-m1,m4-m1,yy); + } + } end_for_each(&(JOB->res.boxlist)); + +#if 1 + /* this is only for test runs */ + if (JOB->cfg.verbose & 16) + fprintf(stderr," step 1 y=%4d m= %4d %+3d %+3d %+3d" + " my=%2d chars=%3d\n# ", + y, m1, m2-m1, m3-m1, m4-m1, my, jj); +#endif + + if (m3 == m1) + break; +#if 1 /* make averages about the line */ + // same again better estimation + mc = (3 * m3 + m1) / 4; /* lower center ? */ + ma1 = ma2 = ma3 = ma4 = i1 = i2 = i3 = i4 = jj = 0; + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->line>0 || box2->c == PICTURE) continue; + if (lines->dx) yy = lines->dy * box2->x0 / (lines->dx); else yy=0; + if (box2->y0 >= y + yy && box2->y1 < y0 + dy // lower than y + && box2->x0 >= x0 && box2->x1 < x0 + dx // in box ? + && box2->c != PICTURE // no picture + && 2 * (box2->y1 - box2->y0) > my // right size ? + && (box2->y1 - box2->y0) < 4 * my) { + if ( box2->y0 - yy >= m1-my/4 + && box2->y0 - yy <= m2+my/4 + && box2->y1 - yy >= m3-my/4 + && box2->y1 - yy <= m4+my/4 ) { /* its within allowed range! */ + // jj++; // not used + if (abs(box2->y0 - yy - m1) <= abs(box2->y0 - yy - m2)) + { i1++; ma1 += box2->y0 - yy; } + else { i2++; ma2 += box2->y0 - yy; } + if (abs(box2->y1 - yy - m3) < abs(box2->y1 - yy - m4)) + { i3++; ma3 += box2->y1 - yy; } + else { i4++; ma4 += box2->y1 - yy; } + if (box2->x1>lines->x1[i]) lines->x1[i] = box2->x1; /* right end */ + if (box2->x0x0[i]) lines->x0[i] = box2->x0; /* left end */ + } + } + } end_for_each(&(JOB->res.boxlist)); + + if (i1) m1 = (ma1+i1/2) / i1; /* best rounded */ + if (i2) m2 = (ma2+i2/2) / i2; + if (i3) m3 = (ma3+i3-1) / i3; /* round up */ + if (i4) m4 = (ma4+i4-1) / i4; + // printf("\n# .. set3 m3 m=%3d %+2d %+2d %+2d",m1,m2-m1,m3-m1,m4-m1); + +#endif + + /* expand right and left end of line */ + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->line>0 || box2->c == PICTURE) continue; + if (lines->dx) yy = lines->dy * box2->x0 / (lines->dx); else yy=0; + if ( box2->y0 >= y0 && box2->y1 < y0 + dy + && box2->x0 >= x0 && box2->x1 < x0 + dx // in box ? + && box2->c != PICTURE // no picture + && box2->y0 >= m1-1 + && box2->y0 <= m4 + && box2->y1 >= m1 + && box2->y1 <= m4+1 ) { /* its within line */ + if (box2->x1>lines->x1[i]) lines->x1[i] = box2->x1; /* right end */ + if (box2->x0x0[i]) lines->x0[i] = box2->x0; /* left end */ + } + } end_for_each(&(JOB->res.boxlist)); + +#if 1 + /* this is only for test runs */ + if (JOB->cfg.verbose & 16) + fprintf(stderr," step 2 y=%4d m= %4d %+3d %+3d %+3d\n# ", + y,m1,m2-m1,m3-m1,m4-m1); +#endif + + if (m4 == m1) { + if(m3+m4>2*y) y = (m4+m3)/2; /* lower end may overlap the next line */ + continue; + } + jj=0; + lines->wt[i] = 100; + if (5 * (m2 - m1 +1) < m3 - m2 || (m2 - m1) < 2) jj|=1; /* same high */ + if (5 * (m4 - m3 +1) < m3 - m2 || (m4 - m3) < 1) jj|=2; /* same base */ + if (jj&1) lines->wt[i] = 75*lines->wt[i]/100; + if (jj&2) lines->wt[i] = 75*lines->wt[i]/100; + if (jj>0 && JOB->cfg.verbose) { + fprintf(stderr," trouble on line %d, wt*100= %d\n",i,lines->wt[i]); + fprintf(stderr,"# m= %4d %+3d %+3d %+3d\n",m1,m2-m1,m3-m1,m4-m1); + fprintf(stderr,"# i= %3d %3d %3d %3d (counts)\n",i1,i2,i3,i4); + if (jj==3) fprintf(stderr,"# all boxes of same high!\n# "); + if (jj==1) fprintf(stderr,"# all boxes of same upper bound!\n# "); + if (jj==2) fprintf(stderr,"# all boxes of same lower bound!\n# "); + } + /* ToDo: check for dots ij,. to get the missing information */ +#if 1 + /* jj=3: ABCDEF123456 or mnmno or gqpy or lkhfdtb => we are in trouble */ + if (jj==3 && (m4-m1)>my) { jj=0; m2=m1+my/8+1; m4=m3+my/8+1; } /* ABC123 */ + /* using idots, may fail on "ABCDEFGÄÜÖ" */ + if (jj==3 && mi>0 && mim4pre) { jj=2; m1=mi; } /* use ij dots */ + if (jj==1 && m2-(m3-m2)/4>m3pre ) { /* expect: acegmnopqrsuvwxyz */ + if (m1-m4pre0 && JOB->cfg.verbose & 16) { + fprintf(stderr," m= %4d %+2d %+2d %+2d my= %4d\n# ", + m1, m2-m1, m3-m1, m4-m1, my); + } +#endif + + + { // empty space between lines + lines->m4[i] = m4; + lines->m3[i] = m3; + lines->m2[i] = m2; + lines->m1[i] = m1; + lines->pitch[i] = JOB->cfg.spc; /* default word pitch */ + lines->pitch[i] = 0; /* default spacing */ + if (JOB->cfg.verbose & 16) + fprintf(stderr, " m= %4d %+3d %+3d %+3d w= %d (line=%d)\n# ", + m1, m2 - m1, m3 - m1, m4 - m1, lines->wt[i], i); + if (i < MAXlines && m4 - m1 > 4) + i++; + if (i >= MAXlines) { + fprintf(stderr, "Warning: lines>MAXlines\n"); + break; + } + } + if (m3+m4>2*y) y = (m3+m4)/2; /* lower end may overlap the next line */ + if (m3>m3pre) m3pre = m3; else m3=y0; /* set for next-line scan */ + if (m4>m4pre) m4pre = m4; else m4=y0; /* set for next-line scan */ + } + lines->num = i; + if (JOB->cfg.verbose) + fprintf(stderr, " num_lines= %d", lines->num-1); + return 0; +} + +// ----- layout analyzis of dx*dy region at x0,y0 ----- +// ----- detect lines via recursive division (new version) --------------- +// what about text in frames??? +// ToDo: change to bottom-top analyse or/and take rotation into account +int detect_lines2(pix *p,int x0,int y0,int dx,int dy,int r){ + int i,x2,y2,x3,y3,x4,y4,x5,y5,y6,mx,my,x30,x31,y30,y31; + struct box *box2,*box3; + // shrink box + if(dx<=0 || dy<=0) return 0; + if(y0+dy< p->y/128 && y0==0) return 0; /* looks like dust */ + if(y0>p->y-p->y/128 && y0+dy==p->y) return 0; /* looks like dust */ + + if(r>1000){ return -1;} // something is wrong + if(JOB->cfg.verbose)fprintf(stderr,"\n# r=%2d ",r); + + mx=my=i=0; // mean thickness + // remove border, shrink size + x2=x0+dx-1; // min x + y2=y0+dy-1; // min y + x3=x0; // max x + y3=y0; // max y + for_each_data(&(JOB->res.boxlist)) { + box3 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if(box3->y0>=y0 && box3->y1x0>=x0 && box3->x1x1 > x3 ) x3=box3->x1; // max x + if( box3->x0 < x2 ) x2=box3->x0; // min x + if( box3->y1 > y3 ) y3=box3->y1; // max y + if( box3->y0 < y2 ) y2=box3->y0; // min y + if(box3->c!=PICTURE) + if( box3->y1 - box3->y0 > 4 ) + { + i++; + mx+=box3->x1-box3->x0+1; // mean x + my+=box3->y1-box3->y0+1; // mean y + } + } + } end_for_each(&(JOB->res.boxlist)); + x0=x2; dx=x3-x2+1; + y0=y2; dy=y3-y2+1; + + if(i==0 || dx<=0 || dy<=0) return 0; + mx/=i;my/=i; + // better look for widest h/v-gap, ToDo: vertical lines? + if(r<8){ // max. depth + + // detect widest horizontal gap + y2=y3=y4=y5=y6=0; + x2=x3=x4=x5=y5=0;// min. 3 lines + // position and thickness of gap, y6=num_gaps, nbox^2 ops + for_each_data(&(JOB->res.boxlist)) { // not very efficient, sorry + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if( box2->c!=PICTURE ) /* ToDo: not sure, that this is a good idea */ + if( box2->y0>=y0 && box2->y1x0>=x0 && box2->x1y1-box2->y0>my/2 ){ // no pictures & dust??? + + y4=y0+dy-1; // nearest vert. box + x4=x0+dx-1; + // ToDo: rotate back box2->x1,y1 to x21,y21 + // look for nearest lowest (y4) and right (x4) neighbour + // of every box (box2) + for_each_data(&(JOB->res.boxlist)) { + box3 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if(box3!=box2) + if(box3->y0>=y0 && box3->y1x0>=x0 && box3->x1c!=PICTURE) /* ToDo: not sure, that this is a good idea */ + if(box3->y1-box3->y0>my/2 ){ + // ToDo: here we need the rotation around box2 + x30=box3->x0; + x31=box3->x1; + y30=box3->y0; + y31=box3->y1; + // get min. distances to lower and to right direction + if( y31 > box2->y1 && y30 < y4 ) y4=y30-1; + if( x31 > box2->x1 && x30 < x4 ) x4=x30-1; + } + } end_for_each(&(JOB->res.boxlist)); + // set the witdht and position of largest hor./vert. gap + // largest gap: width position + if( y4-box2->y1 > y3 ) { y3=y4-box2->y1; y2=(y4+box2->y1)/2; } + if( x4-box2->x1 > x3 ) { x3=x4-box2->x1; x2=(x4+box2->x1)/2; } + } + } end_for_each(&(JOB->res.boxlist)); + // fprintf(stderr,"\n widest y-gap= %4d %4d",y2,y3); + // fprintf(stderr,"\n widest x-gap= %4d %4d",x2,x3); + + i=0; // i=1 at x, i=2 at y + // this is the critical point + // is this a good decision or not??? + if(x3>0 || y3>0){ + if(x3>mx && x3>2*y3 && (dy>5*x3 || (x3>10*y3 && y3>0))) i=1; else + if(dx>5*y3 && y3>my) i=2; + } + + // compare with largest box??? + for_each_data(&(JOB->res.boxlist)) { // not very efficient, sorry + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if( box2->c == PICTURE ) + if( box2->y0>=y0 && box2->y1x0>=x0 && box2->x1x1-box2->x0+4 > dx && box2->y1+4y1+1; i=2; break; } + if( box2->x1-box2->x0+4 > dx && box2->y0-4>y0 ) { y3=1; y2=box2->y0-1; i=2; break; } + if( box2->y1-box2->y0+4 > dy && box2->x1+4x1+1; i=1; break; } + if( box2->y1-box2->y0+4 > dy && box2->x0-4>x0 ) { x3=1; x2=box2->x0-1; i=1; break; } + } + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose)fprintf(stderr," i=%d",i); + + if(JOB->cfg.verbose && i) fprintf(stderr," divide at %s x=%4d y=%4d dx=%4d dy=%4d", + ((i)?( (i==1)?"x":"y" ):"?"),x2,y2,x3,y3); + // divide horizontally if v-gap is thicker than h-gap + // and length is larger 5*width + if(i==1){ detect_lines2(p,x0,y0,x2-x0+1,dy,r+1); + return detect_lines2(p,x2,y0,x0+dx-x2+1,dy,r+1); } + // divide vertically + if(i==2){ detect_lines2(p,x0,y0,dx,y2-y0+1,r+1); + return detect_lines2(p,x0,y2,dx,y0+dy-y2+1,r+1); + } + } + + + if(JOB->cfg.verbose) if(dx<5 || dy<7)fprintf(stderr," empty box"); + if(dx<5 || dy<7) return 0; // do not care about dust + if(JOB->cfg.verbose)fprintf(stderr, " box detected at %4d %4d %4d %4d",x0,y0,dx,dy); + if(JOB->tmp.ppo.p){ + for(i=0;itmp.ppo,x0+i ,y0 ,255,16); + for(i=0;itmp.ppo,x0+i ,y0+dy-1,255,16); + for(i=0;itmp.ppo,x0 ,y0+i ,255,16); + for(i=0;itmp.ppo,x0+dx-1,y0+i ,255,16); + // writebmp("out10.bmp",p2,JOB->cfg.verbose); // colored should be better + } + return detect_lines1(p,x0-0*1,y0-0*2,dx+0*2,dy+0*3); + +/* + struct tlines *lines = &JOB->res.lines; + i=lines->num; lines->num++; + lines->m1[i]=y0; lines->m2[i]=y0+5*dy/16; + lines->m3[i]=y0+12*dy/16; lines->m4[i]=y0+dy-1; + lines->x0[i]=x0; lines->x1[i]=x0+dx-1; + if(JOB->cfg.verbose)fprintf(stderr," - line= %d",lines->num); + return 0; + */ +} + +/* ToDo: herons algorithm for square root x=(x+y/x)/2 is more efficient + * than interval subdivision (?) (germ.: Intervallschachtelung) + * without using matlib + * see http://www.math.vt.edu/people/brown/doc/sqrts.pdf + */ +int my_sqrt(int x){ + int y0=0,y1=x,ym; + for (;y0res.lines.{dx,dy} + * pass 1: get mean vector to nearest char + * pass 2: get mean vector to nearest char without outriders to pass 1 + * extimate direction as (dx,dy,num)[pass] + * ToDo: estimate an error, boxes only work fine for zero-rotation + * for 45 degree use vectors, not boxes to get base line + */ +#define INorm 1024 /* integer unit 1.0 */ +int detect_rotation_angle(job_t *job){ + struct box *box2, *box3, + *box_nn; /* nearest neighbour box */ + int x2, y2, x3, y3, dist, mindist, pass, + rx=0, ry=0, re=0, // final result + /* to avoid 2nd run, wie store pairs in 2 different categories */ + nn[4]={0,0,0,0}, /* num_pairs used for estimation [(pass-1)%2,pass%2] */ + dx[4]={0,0,0,0}, /* x-component of rotation vector per pass */ + dy[4]={0,0,0,0}, /* y-component of rotation vector per pass */ + er[4]={INorm/4,0,0,0}; /* mean angle deviation to pass-1 (radius^2) */ + // de; /* ToDo: absolute maximum error (dx^2+dy^2) */ + // ToDo: next pass: go to bigger distances and reduce max error + // error is diff between passes? or diff of bottoms and top borders (?) + + rx=1024; ry=0; // default + for (pass=0;pass<4;pass++) { + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box2->c==PICTURE) continue; + /* subfunction probability of char */ + // i? + // if (box2->x1 - box2->x0 < 3) continue; /* smallest font is 4x6 */ + if (box2->y1 - box2->y0 < 4) continue; + /* set maximum possible distance */ + box_nn=box2; // initial box to compare with + + // ToDo: clustering or majority + // the algorithm is far from being perfect, pitfalls are likely + // but its better than the old algorithm, ToDo: database-rotated-images + mindist = job->src.p.x * job->src.p.x + job->src.p.y * job->src.p.y; + /* get middle point of the box */ + x2 = (box2->x0 + box2->x1)/2; + y2 = (box2->y0 + box2->y1)/2; + re=0; + /* search for nearest neighbour box_nn[pass+1] of box_nn[pass] */ + for_each_data(&(job->res.boxlist)) { + box3 = (struct box *)list_get_current(&(job->res.boxlist)); + /* try to select only potential neighbouring chars */ + /* select out all senseless combinations */ + if (box3->c==PICTURE || box3==box2) continue; + x3 = (box3->x0 + box3->x1)/2; + y3 = (box3->y0 + box3->y1)/2; /* get middle point of the box */ + if (x3 pass-1? + // scalprod max in direction, cross prod min in direction + // a,b (vectors): ^2/(|a|*|b|)^2 = 0(90deg)..0.5(45deg).. 1(0deg) + // * 1024 ?? + if (pass>0) { // new variant = scalar product + // danger of int overflow, ToDo: use int fraction + re =(int) ((1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1]) + *(1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1])*INorm + /(1.*((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)) + *(1.*dx[pass-1]*dx[pass-1]+dy[pass-1]*dy[pass-1]))); + if (INorm-re>er[pass-1]) continue; // hits mean deviation + } + /* neighbours should have same order of size (?) */ + if (3*(box3->y1-box3->y0+4) < 2*(box2->y1-box2->y0+1)) continue; + if (2*(box3->y1-box3->y0+1) > 3*(box2->y1-box2->y0+4)) continue; + if (2*(box3->x1-box3->x0+1) > 5*(box2->x1-box2->x0+4)) continue; + if (5*(box3->x1-box3->x0+4) < 2*(box2->x1-box2->x0+1)) continue; + /* should be in right range, Idea: center3 outside box2? noholes */ + if ((x3x1-1) && (x3>box2->x0+1) + && (y3y1-1) && (y3>box2->y0+1)) continue; + // if chars are of different size, connect careful + if ( abs(x3-x2) > 2*(box2->x1 - box2->x0 + box3->x1 - box3 ->x0 + 2)) continue; + if ( abs(y3-y2) > (box2->x1 - box2->x0 + box3->x1 - box3 ->x0 + 2)) continue; + dist = (y3-y2)*(y3-y2) + (x3-x2)*(x3-x2); + // make distances in pass-1 directions shorter or continue if not in pass-1 range? + if (dist<9) continue; /* minimum distance^2 is 3^2 */ + if (distres.boxlist)); + + if (box_nn==box2) continue; /* has no neighbour, next box */ + + box3=box_nn; dist=mindist; + x3 = (box3->x0 + box3->x1)/2; + y3 = (box3->y0 + box3->y1)/2; /* get middle point of the box */ + // dist = my_sqrt(1024*((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))); + // compare with first box + x2 = (box2->x0 + box2->x1)/2; + y2 = (box2->y0 + box2->y1)/2; + // if the high of neighbouring boxes differ, use min diff (y0,y1) + if (pass>0 && 16*abs(dy[pass-1]) < dx[pass-1]) // dont work for strong rot. + if (abs(box2->y1-box2->y0-box3->y1+box3->y0)>(box2->y1-box2->y0)/8) { + // ad eh ck ... + if (abs(box2->y1-box3->y1)y1; y3=box3->y1; } + // ag ep qu ... + if (abs(box2->y0-box3->y0)y0; y3=box3->y0; } + } + if (abs(x3-x2)<4) continue; + dx[pass]+=(x3-x2)*1024; /* normalized before averaging */ + dy[pass]+=(y3-y2)*1024; /* 1024 is for the precision */ + nn[pass]++; + if (pass>0) { // set error = mean deviation from pass -1 + re = INorm-(int)((1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1]) + *(1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1])*INorm + /((1.*(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)) + *(1.*dx[pass-1]*dx[pass-1]+dy[pass-1]*dy[pass-1])) + ); + er[pass]+=re; + } +#if 0 + if(JOB->cfg.verbose) + fprintf(stderr,"# next nb (x,y,dx,dy,re) %6d %6d %5d %5d %5d pass %d\n", + x2, y2, x3-x2, y3-y2, re, pass+1); +#endif + } end_for_each(&(job->res.boxlist)); + if (!nn[pass]) break; + if (nn[pass]) { + /* meanvalues */ + rx=dx[pass]/=nn[pass]; + ry=dy[pass]/=nn[pass]; + if (pass>0) er[pass]/=nn[pass]; + } + if(JOB->cfg.verbose) + fprintf(stderr,"# rotation angle (x,y,maxr,num)" + " %6d %6d %6d %4d pass %d\n", + rx, ry, er[pass], nn[pass], pass+1); + } + if (abs(ry*100)>abs(rx*50)) + fprintf(stderr,"\n"); + /* ToDo: normalize to 2^10 bit (square fits to 32 it) */ + JOB->res.lines.dx=rx; + JOB->res.lines.dy=ry; + return 0; +} + +/* ----- detect lines --------------- */ +int detect_text_lines(pix * pp, int mo) { + + if (JOB->cfg.verbose) + fprintf(stderr, "# detect.c detect_text_lines (vvv=16 for more info) "); + if (mo & 4){ + if (JOB->cfg.verbose) fprintf(stderr, "# zoning\n# ... "); + detect_lines2(pp, 0, 0, pp->x, pp->y, 0); // later replaced by better algo + } else + detect_lines1(pp, 0, 0, pp->x, pp->y); // old algo + + if(JOB->cfg.verbose) fprintf(stderr,"\n"); + return 0; +} + + +/* ----- adjust lines --------------- */ +// rotation angle? JOB->res.lines.dy, .x0 removed later +// this is for cases, where m1..m4 is not very sure detected before +// chars are recognized +int adjust_text_lines(pix * pp, int mo) { + struct box *box2; + int *m, /* summ m1..m4, num_chars for m1..m4, min m1..m4, max. m1..m4 */ + l, i, dy, dx, diff=0, y0, y1; + + if ((l=JOB->res.lines.num)<2) return 0; // ??? + if (JOB->cfg.verbose) + fprintf(stderr, "# adjust text lines "); + m=(int *)malloc(l*16*sizeof(int)); + if (!m) { fprintf(stderr," malloc failed\n"); return 0;} + for (i=0;i<16*l;i++) m[i]=0; /* initialize */ + dy=JOB->res.lines.dy; /* tan(alpha) of skewing */ + dx=JOB->res.lines.dx; /* old: width of image */ + // js: later skewing is replaced by one transformation of vectorized image + + if (dx) + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->line<=0) continue; + if (box2->num_ac<1) continue; + if (box2->wac[0]<95) continue; + if (box2->m2==0 || box2->y1m2) continue; // char outside line + if (box2->m3==4 || box2->y0>box2->m3) continue; // char outside line + y0=box2->y0-((box2->x1)*dy/dx); /* corrected by page skewing */ + y1=box2->y1-((box2->x1)*dy/dx); + if (strchr("aemnr",(char)box2->tac[0])) { // cC vV sS oO ... is unsure! + m[box2->line*16+1]+=y0; m[box2->line*16+5]++; // num m2 + m[box2->line*16+2]+=y1; m[box2->line*16+6]++; // num m3 + if (m[box2->line*16+ 9]>y0) m[box2->line*16+ 9]=y0; /* min m2 */ + if (m[box2->line*16+13]line*16+13]=y0; /* max m2 */ + if (m[box2->line*16+10]>y1) m[box2->line*16+10]=y1; /* min m3 */ + if (m[box2->line*16+14]line*16+14]=y1; /* max m3 */ + } + if (strchr("bdhklABDEFGHIKLMNRT123456789",(char)box2->tac[0])) { + m[box2->line*16+0]+=y0; m[box2->line*16+4]++; // num m1 + m[box2->line*16+2]+=y1; m[box2->line*16+6]++; // num m3 + if (m[box2->line*16+ 8]>y0) m[box2->line*16+ 8]=y0; /* min m1 */ + if (m[box2->line*16+12]line*16+12]=y0; /* max m1 */ + if (m[box2->line*16+10]>y1) m[box2->line*16+10]=y1; /* min m3 */ + if (m[box2->line*16+14]line*16+14]=y1; /* max m3 */ + } + if (strchr("gq",(char)box2->tac[0])) { + m[box2->line*16+1]+=y0; m[box2->line*16+5]++; // num m2 + m[box2->line*16+3]+=y1; m[box2->line*16+7]++; // num m4 + if (m[box2->line*16+ 9]>y0) m[box2->line*16+ 9]=y0; /* min m2 */ + if (m[box2->line*16+13]line*16+13]=y0; /* max m2 */ + if (m[box2->line*16+11]>y1) m[box2->line*16+11]=y1; /* min m4 */ + if (m[box2->line*16+15]line*16+15]=y1; /* max m4 */ + } + } end_for_each(&(JOB->res.boxlist)); + + for (i=1;ires.lines.m1[i]-m[i*16+0]/m[i*16+4]); + if (m[i*16+5]) diff+=abs(JOB->res.lines.m2[i]-m[i*16+1]/m[i*16+5]); + if (m[i*16+6]) diff+=abs(JOB->res.lines.m3[i]-m[i*16+2]/m[i*16+6]); + if (m[i*16+7]) diff+=abs(JOB->res.lines.m4[i]-m[i*16+3]/m[i*16+7]); + /* recalculate sureness, empirically */ + if (m[i*16+4]*m[i*16+5]*m[i*16+6]*m[i*16+7] > 0) + JOB->res.lines.wt[i]=(JOB->res.lines.wt[i]+100)/2; + else + JOB->res.lines.wt[i]=(JOB->res.lines.wt[i]*90)/100; + // set mean values of sure detected bounds (rounded precisely) + if ( m[i*16+4]) JOB->res.lines.m1[i]=(m[i*16+0]+m[i*16+4]/2)/m[i*16+4]; + if ( m[i*16+5]) JOB->res.lines.m2[i]=(m[i*16+1]+m[i*16+5]/2)/m[i*16+5]; + if ( m[i*16+6]) JOB->res.lines.m3[i]=(m[i*16+2]+m[i*16+6]/2)/m[i*16+6]; + if ( m[i*16+7]) JOB->res.lines.m4[i]=(m[i*16+3]+m[i*16+7]/2)/m[i*16+7]; + // care about very small fonts + if (JOB->res.lines.m2[i]-JOB->res.lines.m1[i]<=1 && m[i*16+5]==0 && m[i*16+4]) + JOB->res.lines.m2[i]=JOB->res.lines.m1[i]+2; + if (JOB->res.lines.m2[i]-JOB->res.lines.m1[i]<=1 && m[i*16+4]==0 && m[i*16+5]) + JOB->res.lines.m1[i]=JOB->res.lines.m2[i]-2; + if (JOB->res.lines.m4[i]-JOB->res.lines.m3[i]<=1 && m[i*16+7]==0 && m[i*16+6]) + JOB->res.lines.m4[i]=JOB->res.lines.m3[i]+2; + if (JOB->res.lines.m4[i]-JOB->res.lines.m3[i]<=1 && m[i*16+6]==0 && m[i*16+7]) + JOB->res.lines.m3[i]=JOB->res.lines.m4[i]-2; + if ( m[i*16+7]<1 && + JOB->res.lines.m4[i] + <=JOB->res.lines.m3[i]+(JOB->res.lines.m3[i]-JOB->res.lines.m2[i])/4 ) + JOB->res.lines.m4[i]= + JOB->res.lines.m3[i]+(JOB->res.lines.m3[i]-JOB->res.lines.m2[i])/4; + if ( m[i*16+7]<1 && m[i*16+12+2]>0 && // m4 < max.m3+.. + JOB->res.lines.m4[i] < 2*m[i*16+12+2]-JOB->res.lines.m3[i]+2 ) + JOB->res.lines.m4[i] = 2*m[i*16+12+2]-JOB->res.lines.m3[i]+2; + if (JOB->res.lines.m4[i]<=JOB->res.lines.m3[i]) + JOB->res.lines.m4[i]= JOB->res.lines.m3[i]+1; /* 4x6 */ + + if (JOB->cfg.verbose & 17) + fprintf(stderr, "\n# line= %3d m= %4d %+3d %+3d %+3d " + " n= %2d %2d %2d %2d w= %3d diff= %d", + i, JOB->res.lines.m1[i], + JOB->res.lines.m2[i] - JOB->res.lines.m1[i], + JOB->res.lines.m3[i] - JOB->res.lines.m1[i], + JOB->res.lines.m4[i] - JOB->res.lines.m1[i], + m[i*16+4],m[i*16+5],m[i*16+6],m[i*16+7], + JOB->res.lines.wt[i], diff); + } + diff=0; // count adjusted chars +#if 1 + if (dx) + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->line<=0) continue; + /* check if box was on the wrong line, ToDo: search a better line */ + if (2*box2->y0<2*JOB->res.lines.m1[box2->line] + -JOB->res.lines.m4[box2->line] + +JOB->res.lines.m1[box2->line]) box2->line=0; + if (2*box2->y1>2*JOB->res.lines.m4[box2->line] + +JOB->res.lines.m4[box2->line] + -JOB->res.lines.m1[box2->line]) box2->line=0; + /* do adjustments */ + if (box2->num_ac>0 + && box2->num_ac > 31 && box2->tac[0] < 127 /* islower(>256) may SIGSEGV */ + && strchr("cCoOpPsSuUvVwWxXyYzZ",(char)box2->tac[0])) { // no_wchar + if (box2->y0-((box2->x1)*dy/dx) + < (JOB->res.lines.m1[box2->line]+JOB->res.lines.m2[box2->line])/2 + && islower(box2->tac[0]) + ) { setac(box2,toupper((char)box2->tac[0]),(box2->wac[0]+101)/2); diff++; } + if (box2->y0-((box2->x1)*dy/dx) + > (JOB->res.lines.m1[box2->line]+JOB->res.lines.m2[box2->line]+1)/2 + && isupper(box2->tac[0]) + ){ setac(box2,tolower((char)box2->tac[0]),(box2->wac[0]+101)/2); diff++; } + } + box2->m1=JOB->res.lines.m1[box2->line]+((box2->x1)*dy/dx); + box2->m2=JOB->res.lines.m2[box2->line]+((box2->x1)*dy/dx); + box2->m3=JOB->res.lines.m3[box2->line]+((box2->x1)*dy/dx); + box2->m4=JOB->res.lines.m4[box2->line]+((box2->x1)*dy/dx); + } end_for_each(&(JOB->res.boxlist)); +#endif + + free(m); + if(JOB->cfg.verbose) fprintf(stderr,"\n# changed_chars= %d\n",diff); + return(diff); +} + +/* ---- measure mean character + * recalculate mean width and high after changes in boxlist + * ToDo: only within a Range? + */ +int calc_average() { + int i = 0, x0, y0, x1, y1; + struct box *box4; + + JOB->res.numC = 0; + JOB->res.sumY = 0; + JOB->res.sumX = 0; + for_each_data(&(JOB->res.boxlist)) { + box4 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if( box4->c != PICTURE ){ + x0 = box4->x0; x1 = box4->x1; + y0 = box4->y0; y1 = box4->y1; + i++; + if (JOB->res.avX * JOB->res.avY > 0) { + if (x1 - x0 + 1 > 4 * JOB->res.avX + && y1 - y0 + 1 > 4 * JOB->res.avY) continue; /* small picture */ + if (4 * (y1 - y0 + 1) < JOB->res.avY || y1 - y0 < 2) + continue; // dots .,-_ etc. + } + if (x1 - x0 + 1 < 4 + && y1 - y0 + 1 < 6 ) continue; /* dots etc */ + JOB->res.sumX += x1 - x0 + 1; + JOB->res.sumY += y1 - y0 + 1; + JOB->res.numC++; + } + } end_for_each(&(JOB->res.boxlist)); + if ( JOB->res.numC ) { /* avoid div 0 */ + JOB->res.avY = (JOB->res.sumY+JOB->res.numC/2) / JOB->res.numC; + JOB->res.avX = (JOB->res.sumX+JOB->res.numC/2) / JOB->res.numC; + } + if (JOB->cfg.verbose){ + fprintf(stderr, "# averages: mXmY= %d %d nC= %d n= %d\n", + JOB->res.avX, JOB->res.avY, JOB->res.numC, i); + } + return 0; +} + + +/* ---- analyse boxes, find pictures and mark (do this first!!!) + */ +int detect_pictures(job_t *job) { + int i = 0, x0, y0, x1, y1, num_h; + struct box *box2, *box4; + + if ( job->res.numC == 0 ) { + if (job->cfg.verbose) fprintf(stderr, + "# detect.C L%d Warning: numC=0\n", __LINE__); + return -1; + } + /* ToDo: set Y to uppercase mean value? */ + job->res.avY = (job->res.sumY+job->res.numC/2) / job->res.numC; + job->res.avX = (job->res.sumX+job->res.numC/2) / job->res.numC; + /* ToDo: two highest volumes? crosses, on extreme volume + on border */ + if (job->cfg.verbose) + fprintf(stderr, "# detect.C L%d pictures, frames, mXmY= %d %d ... ", + __LINE__, job->res.avX, job->res.avY); + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box2->c == PICTURE) continue; + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + + /* pictures could be of unusual size */ + if (x1 - x0 + 1 > 4 * job->res.avX || y1 - y0 + 1 > 4 * job->res.avY) { + /* count objects on same baseline which could be chars */ + /* else: big headlines could be misinterpreted as pictures */ + num_h=0; + for_each_data(&(job->res.boxlist)) { + box4 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box4->c == PICTURE) continue; + if (box4->y1-box4->y0 > 2*(y1-y0)) continue; + if (2*(box4->y1-box4->y0) < y1-y0) continue; + if (box4->y0 > y0 + (y1-y0+1)/2 + || box4->y0 < y0 - (y1-y0+1)/2 + || box4->y1 > y1 + (y1-y0+1)/2 + || box4->y1 < y1 - (y1-y0+1)/2) continue; + // ToDo: continue if numcross() only 1, example: |||IIIll||| + num_h++; + } end_for_each(&(job->res.boxlist)); + if (num_h>4) continue; + box2->c = PICTURE; + i++; + } + /* ToDo: pictures could have low contrast=Sum((pixel(p,x,y)-160)^2) */ + } end_for_each(&(job->res.boxlist)); + // start second iteration + if (job->cfg.verbose) { + fprintf(stderr, " %d - boxes %d\n", i, job->res.numC-i); + } + calc_average(); + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h new file mode 100644 index 000000000..a252ba608 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h @@ -0,0 +1,286 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + + sometimes I have written comments in german language, sorry for that + + - look for ??? for preliminary code +*/ + +/* General headerfile with gocr-definitions */ + +#ifndef __GOCR_H__ +#define __GOCR_H__ + +#include "pnm.h" +#include "unicode.h" +#include "list.h" +#include +#ifdef HAVE_GETTIMEOFDAY +#include +#endif + +/* + * wchar_t should always exist (ANSI), but WCHAR.H is sometimes missing + * USE_UNICODE should be removed or replaced by HAVE_WCHAR_H in future + */ +#ifdef HAVE_WCHAR_H +#define USE_UNICODE 1 +#endif + +/* extern "C"{ */ +/* ------------------------ feature extraction ----------------- */ +#define AT 7 /* mark */ +#define M1 1 /* mark */ +enum direction { + UP=1, DO, RI, LE +}; +typedef enum direction DIRECTION; +#define ST 7 /* stop */ +/* ------------------------------------------------------------- */ +/* detect maximas in of line overlapps (return in %) and line koord */ +#define HOR 1 /* horizontal */ +#define VER 2 /* vertikal */ +#define RIS 3 /* rising=steigend */ +#define FAL 4 /* falling=fallend */ + +#define MAXlines 1024 + +/* ToDo: if we have a tree instead of a list, a line could be a node object */ +struct tlines { + int num; + int dx, dy; /* direction of text lines (straight/skew) */ + int m1[MAXlines], /* start of line = upper bound of 'A' */ + m2[MAXlines], /* upper bound of 'e' */ + m3[MAXlines], /* lower bound of 'e' = baseline */ + m4[MAXlines]; /* stop of line = lower bound of 'q' */ + int x0[MAXlines], + x1[MAXlines]; /* left and right border */ + int wt[MAXlines]; /* weight, how sure thats correct in percent, v0.41 */ + int pitch[MAXlines]; /* word pitch (later per box?), v0.41 */ + int mono[MAXlines]; /* spacing type, 0=proportional, 1=monospaced */ +}; + +#define NumAlt 10 /* maximal number of alternative chars (table length) */ +#define MaxNumFrames 8 /* maximum number of frames per char/box */ +#define MaxFrameVectors 128 /* maximum vectors per frame (*8=1KB/box) */ +/* ToDo: use only malloc_box(),free_box(),copybox() for creation, destroy etc. + * adding reference_counter to avoid pointer pointing to freed box + */ +struct box { /* this structure should contain all pixel infos of a letter */ + int x0,x1,y0,y1,x,y,dots; /* xmin,xmax,ymin,ymax,reference-pixel,i-dots */ + int num_boxes, /* 1 "abc", 2 "!i?", 3 "ä" (composed objects) 0.41 */ + num_subboxes; /* 1 for "abdegopqADOPQR", 2 for "B" (holes) 0.41 */ + wchar_t c; /* detected char (same as tac[0], obsolete?) */ + wchar_t modifier; /* default=0, see compose() in unicode.c */ + int num; /* same number = same char */ + int line; /* line number (points to struct tlines lines) */ + int m1,m2,m3,m4; /* m2 = upper boundary, m3 = baseline */ + /* planed: sizeof hole_1, hole_2, certainty (run1=100%,run2=90%,etc.) */ + pix *p; /* pointer to pixmap (v0.2.5) */ + /* tac, wac is used together with setac() to manage very similar chars */ + int num_ac; /* length of table (alternative chars), default=0 */ + wchar_t tac[NumAlt]; /* alternative chars, only used by setac(),getac() */ + int wac[NumAlt]; /* weight of alternative chars */ + char *tas[NumAlt]; /* alternative UTF8-strings or XML codes if tac[]=0 */ + /* replacing old obj */ + /* ToDo: (*obj)[NumAlt] + olen[NumAlt] ??? */ + /* ToDo: bitmap for possible Picture|Object|Char ??? */ +/* char *obj; */ /* pointer to text-object ... -> replaced by tas[] */ + /* ... (melted chars, barcode, picture coords, ...) */ + /* must be freed before box is freed! */ + /* do _not_ copy only the pointer to object */ + /* -------------------------------------------------------- + * extension since v0.41 js05, Store frame vectors, + * which is a table of vectors sourrounding the char and its + * inner white holes. The advantage is the independence from + * resolution, handling of holes, overlap and rotation. + * --------------------------------------------------------- */ + int num_frames; /* number of frames: 1 for cfhklmnrstuvwxyz */ + /* 2 for abdegijopq */ + int frame_vol[MaxNumFrames]; /* volume inside frame +/- (black/white) */ + int frame_per[MaxNumFrames]; /* periphery, summed length of vectors */ + int num_frame_vectors[MaxNumFrames]; /* index to next frame */ + /* biggest frame should be stored first (outer frame) */ + /* biggest has the maximum pair distance */ + /* num vector loops */ + int frame_vector[MaxFrameVectors][2]; /* may be 16*int=fixpoint_number */ + +}; +typedef struct box Box; + +/* true if the coordination pair (a,b) is outside the image p */ +#define outbounds(p, a, b) (a < 0 || b < 0 || a >= (p)->x || b >= (p)->y) + +/* ToDo: this structure seems to be obsolete, remove it */ +typedef struct path { + int start; /* color at the beginning of the path, (0=white, 1=black) */ + int *x; /* x coordinates of transitions */ + int *y; /* y coordinates of transitions */ + int num; /* current number of entries in x or y */ + int max; /* maximum number of entries in x or y */ + /* (if more values need to be stored, the arrays are enlarged) */ +} path_t; + +/* job_t contains all information needed for an OCR task */ +typedef struct job_s { + struct { /* source data */ + char *fname; /* input filename; default value: "-" */ + pix p; /* source pixel data, pixelmap 8bit gray */ + } src; + struct { /* temporary stuff, e.g. buffers */ +#ifdef HAVE_GETTIMEOFDAY + struct timeval init_time; /* starting time of this job */ +#endif + pix ppo; /* pixmap for visual debugging output, obsolete */ + + /* sometimes recognition function is called again and again, if result was 0 + n_run tells the pixel function to return alternative results */ + int n_run; /* num of run, if run_2 critical pattern get other results */ + /* used for 2nd try, pixel uses slower filter function etc. */ + List dblist; /* list of boxes loaded from the character database */ + } tmp; + struct { /* results */ + List boxlist; /* store every object in a box, which contains */ + /* the characteristics of the object (see struct box) */ + List linelist; /* recognized text lines after recognition */ + + struct tlines lines; /* used to access to line-data (statistics) */ + /* here the positions (frames) of lines are */ + /* stored for further use */ + int avX,avY; /* average X,Y (avX=sumX/numC) */ + int sumX,sumY,numC; /* sum of all X,Y; num chars */ + } res; + struct { /* configuration */ + int cs; /* critical grey value (pixel black pixel) */ + /* range: 0..255, 0 means autodetection */ + int spc; /* spacewidth/dots (0 = autodetect); default value: 0 */ + int mode; /* operation modes; default value: 0 */ + /* operation mode (see --help) */ + int dust_size; /* dust size; default value: 10 */ + int only_numbers; /* numbers only; default value: 0 */ + int verbose; /* verbose mode; default value: 0 */ + /* verbose option (see --help) */ + FORMAT out_format; /* output format; default value: ISO8859_1*/ + char *lc; /* debuglist of chars (_ = not recognized chars) */ + /* default value: "_" */ + char *db_path; /* pathname for database; default value: NULL */ + char *cfilter; /* char filter; default value: NULL, ex: "A-Za-z" */ + /* limit of certainty where chars are accepted as identified */ + int certainty; /* in units of 100 (percent); 0..100; default 95 */ + } cfg; +} job_t; + +/* initialze job structure */ +void job_init(job_t *job); + +/* free job structure */ +void job_free(job_t *job); + +/*FIXME jb: remove JOB; */ +extern job_t *JOB; + +/* calculate the overlapp of the line (0-1) with black points + * by rekursiv bisection + * (evl. Fehlertoleranz mit pixel in Umgebung dx,dy suchen) (umschaltbar) ??? + * MidPoint Line Algorithm (Bresenham) Foley: ComputerGraphics better? + * will be replaced by vector functions + */ + +/* gerade y=dy/dx*x+b, implizit d=F(x,y)=dy*x-dx*y+b*dx=0 + * incrementell y(i+1)=m*(x(i)+1)+b, F(x+1,y+1)=f(F(x,y)) */ +int get_line(int x0, int y0, int x1, int y1, pix *p, int cs, int ret); +int get_line2(int x0, int y0, int x1, int y1, pix *p, int cs, int ret); + +/* look for white 0x02 or black 0x01 dots (0x03 = white+black) */ +char get_bw(int x0, int x1, int y0, int y1, + pix *p, int cs,int mask); + +/* look for black crossing a line x0,y0,x1,y1 + * follow line and count crossings ([white]-black-transitions) + */ +int num_cross(int x0, int x1, int y0, int y1, + pix *p, int cs); + +/* memory allocation with error checking */ +void *xrealloc(void *ptr, size_t size); + +/* follow a line x0,y0,x1,y1 recording locations of transitions, + * return count of transitions + */ +int follow_path(int x0, int x1, int y0, int y1, pix *p, int cs, path_t *path); + +/* ------------------------------------------------------------- + * mark edge-points + * - first move forward until b/w-edge + * - more than 2 pixel? + * - loop around + * - if forward pixel : go up, rotate right + * - if forward no pixel : rotate left + * - stop if found first 2 pixel in same order + * mit an rechter-Wand-entlang-gehen strategie + * -------------------------------------------------------------- + * turmite game: inp: start-x,y, regel r_black=UP,r_white=RIght until border + * out: last-position + * Zaehle dabei, Schritte,Sackgassen,xmax,ymax,ro-,ru-,lo-,lu-Ecken + * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * is this the right place for declaration? + */ +void turmite(pix *p, int *x, int *y, + int x0, int x1, int y0, int y1, int cs, int rw, int rb); + +/* test if points are connected via t-pixel (rekursiv!) */ +int joined(pix *p, int x0, int y0, int x1, int y1, int cs); + +/* move from x,y to direction r until pixel or l steps + * return number of steps + */ +int loop(pix *p, int x, int y, int l, int cs, int col, DIRECTION r); + +#define MAX_HOLES 3 +typedef struct list_holes { + int num; /* numbers of holes, initialize with 0 */ + struct hole_s { + int size,x,y,x0,y0,x1,y1; /* size, start point, outer rectangle */ + } hole[MAX_HOLES]; +} holes_t; + +/* look for white holes surrounded by black points + * at moment white point with black in all four directions + */ +int num_hole(int x0, int x1, int y0, int y1, pix *p, int cs, holes_t *holes); + +/* count for black nonconnected objects --- used for i,auml,ouml,etc. */ +int num_obj(int x0, int x1, int y0, int y1, pix *p, int cs); + +int distance( pix *p1, struct box *box1, /* box-frame */ + pix *p2, struct box *box2, int cs); + +/* call the OCR engine ;) */ +/* char whatletter(struct box *box1,int cs); */ + +/* declared in pixel.c */ +/* getpixel() was pixel() but it may collide with netpnm pixel declaration */ +int getpixel(pix *p, int x, int y); +int marked(pix *p, int x, int y); +void put(pix * p, int x, int y, int ia, int io); + +/* } */ /* extern C */ +#endif /* __GOCR_H__ */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c new file mode 100644 index 000000000..9cfb5d86c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c @@ -0,0 +1,86 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for email address */ + +#include +#include +#include +#include "pgm2asc.h" +#include "gocr.h" + +/* initialize job structure */ +void job_init(job_t *job) { + /* init source */ + job->src.fname = "-"; + /* FIXME jb: init pix */ + job->src.p.p = NULL; + + /* init results */ + list_init( &job->res.boxlist ); + list_init( &job->res.linelist ); + job->res.avX = 5; + job->res.avY = 8; + job->res.sumX = 0; + job->res.sumY = 0; + job->res.numC = 0; + job->res.lines.dy=0; + job->res.lines.num=0; + + /* init temporaries */ + list_init( &job->tmp.dblist ); + job->tmp.n_run = 0; + /* FIXME jb: init ppo */ + job->tmp.ppo.p = NULL; + job->tmp.ppo.x = 0; + job->tmp.ppo.y = 0; + + /* init cfg */ + job->cfg.cs = 0; + job->cfg.spc = 0; + job->cfg.mode = 0; + job->cfg.dust_size = -1; /* auto detect */ + job->cfg.only_numbers = 0; + job->cfg.verbose = 0; + job->cfg.out_format = UTF8; /* old: ISO8859_1; */ + job->cfg.lc = "_"; + job->cfg.db_path = (char*)NULL; + job->cfg.cfilter = (char*)NULL; + job->cfg.certainty = 95; +} + +/* free job structure */ +void job_free(job_t *job) { + + /* if tmp is just a copy of the pointer to the original image */ + if (job->tmp.ppo.p==job->src.p.p) job->tmp.ppo.p=NULL; + + /* FIMXE jb: free lists + * list_free( &job->res.linelist ); + * list_free( &job->tmp.dblist ); + */ + + list_and_data_free(&(job->res.boxlist), (void (*)(void *))free_box); + + /* FIXME jb: free pix */ + if (job->src.p.p) { free(job->src.p.p); job->src.p.p=NULL; } + + /* FIXME jb: free pix */ + if (job->tmp.ppo.p) { free(job->tmp.ppo.p); job->tmp.ppo.p=NULL; } + +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c new file mode 100644 index 000000000..396000dd3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c @@ -0,0 +1,348 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address +*/ + +#include +#include +#include +#include +#include +#include "pgm2asc.h" +#include "gocr.h" +#include "unicode.h" + +const char *getTextLine (int line) { + int i; + Element *elem; + + if (line < 0 || line > list_total(&(JOB->res.linelist))) + return NULL; + + for ( i = 0, elem = JOB->res.linelist.start.next; i < line && elem != NULL; i++ ) + elem = elem->next; + + if ( elem != NULL ) + return (const char *)elem->data; + + return NULL; +} + +void free_textlines(void) { + for_each_data(&(JOB->res.linelist)) { + if (list_get_current(&(JOB->res.linelist))) + free(list_get_current(&(JOB->res.linelist))); + } end_for_each(&(JOB->res.linelist)); + list_free(&(JOB->res.linelist)); +} + +/* append a string (s1) to the string buffer (buffer) of length (len) + * if buffer is to small or len==0 realloc buffer, len+=512 + */ +char *append_to_line(char *buffer, const char *s1, int *len) { + char *temp; + int slen=0, alen; + if( s1==NULL || s1[0] == 0 ){ + fprintf(stderr,"\n#BUG: appending 0 to a line makes no sense!"); + return buffer; + } + if ( *len>0 ) slen= strlen(buffer); // used buffer + alen = strlen(s1); + if ( slen+alen+1 >= *len ) { + *len+=512; + temp = (char *)realloc(buffer, *len); + if( !temp ) { fprintf(stderr,"realloc failed!\n"); *len-=512; return buffer; } + else buffer = temp; // buffer successfull enlarged + } + temp = buffer + slen; // end of buffered string + memcpy(temp,s1,alen+1); // copy including end sign '\0' + return buffer; +} + +int calc_median_gap(struct tlines * lines) { + int gaps[MAXlines], l; + if (lines->num<2) return 0; + for (l = 0; l < lines->num - 1; l++) + gaps[l] = lines->m2[l + 1] - lines->m3[l]; + qsort(gaps, lines->num - 1, sizeof(gaps[0]), intcompare); + return gaps[(lines->num - 1) / 2]; +} + +/* + * Return the indent in pixels of the least-indented line. + * Will be subtracted as base_indent to avoid negativ indent. + * + * This is adjusted to account for an angle on the page as + * a whole. For instance, if the page is rotated clockwise, + * lower lines may be physically closer to the left edge + * than higher lines that are logically less indented. + * We rotate around (0,0). Note that this rotation could + * rotate lines "off the left margin", leading to a negative + * indent. + * + * boxlist -- list of character boxes. + * dx, dy -- rotation angle as vector + */ +int get_least_line_indent(List * boxlist, int dx, int dy) { + int min_indent = INT_MAX; + int adjusted_indent; + struct box * box2; + if (JOB->cfg.verbose) + fprintf(stderr, "get_least_line_indent: rot.vector dxdy %d %d\n", + dx, dy); + for_each_data(boxlist) { + box2 = (struct box *)list_get_current(boxlist); + /* if num == -1, indicates this is a space or newline box, + * inserted in list_insert_spaces. */ + if (box2->num != -1) { + adjusted_indent = box2->x0; + if (dx) adjusted_indent += box2->y0 * dy / dx; + if (adjusted_indent < min_indent) { + min_indent = adjusted_indent; + if (dy!=0 && JOB->cfg.verbose) + fprintf(stderr, + "# Line %2d, unadjusted xy %3d %3d, adjusted x %2d\n", + box2->line, box2->x0, box2->y0, adjusted_indent); + } + } + } end_for_each(boxlist); + if (JOB->cfg.verbose) + fprintf(stderr, "# Minimum adjusted x: %d (min_indent)\n", min_indent); + return min_indent; +} + +/* collect all the chars from the box tree and write them to a string buffer + mo is the mode: mode&8 means, use chars even if unsure recognized + ToDo: store full text(?), store decoded text+boxes+position chars (v0.4) + (HTML,UTF,ASCII,XML), not wchar incl. dexcriptions (at<95% in red) + remove decode(*c, job->cfg.out_format) from gocr.c! + XML add alternate-tags, format tags and position tags + ToDo: better output XML to stdout instead of circumstantial store to lines + not all texts/images follow the line concept? + Better use a tree of objects where leafes are chars instead of simple list. + Chars or objects are taken into account. Objects can be text strings + or XML strings. + */ +void store_boxtree_lines(int mo) { + char *buffer; /* temp buffer for text */ + int i = 0, j = 0; + int len = 1024; // initial buffer length for text line + struct box *box2; + int median_gap = 0; + int max_single_space_gap = 0; + struct tlines line_info; + int line, line_gap, oldline=-1; + int left_margin; + int i1=0, i2=0; + + buffer = (char *)malloc(len); + if ( !buffer ) { + fprintf(stderr,"malloc failed!\n"); // ToDo: index_to_error_list + return; + } + *buffer = 0; + + if ( JOB->cfg.verbose&1 ) + fprintf(stderr,"# store boxtree to lines ..."); + + /* wew: calculate the median line gap, to determine line spacing + * for the text output. The line gap used is between one line's + * m3 (baseline) and the next line's m2 (height of non-rising + * lowercase). We use these lines as they are the least likely + * to vary according to actual character content of lines. + */ + median_gap = calc_median_gap(&JOB->res.lines); + if (median_gap <= 0) { + fprintf(stderr, "# Warning: non-positive median line gap of %d\n", + median_gap); + median_gap = 8; + max_single_space_gap = 12; /* arbitrary */ + } else { + max_single_space_gap = median_gap * 7 / 4; + } + + // Will be subtracted as base_indent to avoid negativ indent. + left_margin = get_least_line_indent(&JOB->res.boxlist, + JOB->res.lines.dx, + JOB->res.lines.dy); + + if (JOB->cfg.out_format==XML) { /* subject of change */ + char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ + /* output lot of usefull information for XML filter */ + sprintf(s1,"\n", + 0,0,0,0); + buffer=append_to_line(buffer,s1,&len); + sprintf(s1,"\n", + 0,0,0,0); + buffer=append_to_line(buffer,s1,&len); + } + + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + line = box2->line; + line_info = JOB->res.lines; + /* reset the output char if certainty is below the limit v0.44 */ + if (box2->num_ac && box2->wac[0]cfg.certainty) box2->c=UNKNOWN; + if (line!=oldline) { + if (JOB->cfg.out_format==XML && oldline>-1) { /* subject of change */ + buffer=append_to_line(buffer,"\n",&len); + list_app( &(JOB->res.linelist), (void *)strdup(buffer) ); // wcsdup + memset(buffer, 0, len); + j=0; // reset counter for new line + } + if (JOB->cfg.out_format==XML) { /* subject of change */ + char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ + /* output lot of usefull information for XML filter */ + sprintf(s1,"\n", + line_info.x0[line],line_info.m1[line], + line_info.x1[line]-line_info.x0[line]+1, + line_info.m4[line]-line_info.m1[line],line); + buffer=append_to_line(buffer,s1,&len); + } + oldline=line; + } + if (box2->c > ' ' && + box2->c <= 'z') i1++; /* count non-space chars */ + if (box2->c == '\n') { + if (JOB->cfg.out_format!=XML) { /* subject of change */ + line_info = JOB->res.lines; + line = box2->line; + if (line > 0) { + line_gap = line_info.m2[line] - line_info.m3[line - 1]; + for (line_gap -= max_single_space_gap; line_gap > 0; + line_gap -= median_gap) { + buffer=append_to_line(buffer,"\n",&len); + j++; /* count chars in line */ + } + } + list_app( &(JOB->res.linelist), (void *)strdup(buffer) ); // wcsdup + memset(buffer, 0, len); + j=0; // reset counter for new line + } + } + if (box2->c == ' ') // fill large gaps with spaces + { + if (JOB->res.avX) { /* avoid SIGFPE */ + if (JOB->cfg.out_format==XML) { /* subject of change */ + char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ + /* output lot of usefull information for XML filter */ + sprintf(s1," \n", + box2->x0,box2->y0,box2->x1-box2->x0+1,box2->y1-box2->y0+1); + buffer=append_to_line(buffer,s1,&len); + } else + for (i = (box2->x1 - box2->x0) / (2 * JOB->res.avX) + 1; i > 0; i--) { + buffer=append_to_line(buffer," ",&len); + j++; + } + } + } + else if (box2->c != '\n') { + if (j==0 && JOB->res.avX) /* first char in new line? */ { + int indent = box2->x0 - JOB->res.lines.x0[box2->line]; + /* correct for angle of page as a whole. */ + if (JOB->res.lines.dx) + indent += box2->y0 * JOB->res.lines.dy / JOB->res.lines.dx; + /* subtract the base margin. */ + indent -= left_margin; + if (JOB->cfg.out_format==XML) { /* subject of change */ + char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ + /* output lot of usefull information for XML filter */ + sprintf(s1," \n", + box2->x0,box2->y0,box2->x1-box2->x0+1,box2->y1-box2->y0+1); + buffer=append_to_line(buffer,s1,&len); + } else + for (i = indent / JOB->res.avX; i > 0; i--) { + buffer=append_to_line(buffer," ",&len); j++; + } + } + if (JOB->cfg.out_format==XML) { /* subject of change */ + char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ + /* output lot of usefull information for XML filter */ + sprintf(s1," x0,box2->y0,box2->x1-box2->x0+1,box2->y1-box2->y0+1); + buffer=append_to_line(buffer,s1,&len); + if (box2->num_ac>1) { /* output alist */ + } + } + if (box2->c != UNKNOWN && box2->c!=0) { + buffer= + append_to_line(buffer,decode(box2->c,JOB->cfg.out_format),&len); + if (box2->c > ' ' && + box2->c <= 'z') i2++; /* count non-space chars */ + } else { + wchar_t cc; cc=box2->c; + if (box2->num_ac>0 && box2->tas[0] + && (JOB->cfg.out_format!=XML || box2->tas[0][0]!='<')) { + buffer=append_to_line(buffer,box2->tas[0],&len); + j+=strlen(box2->tas[0]); + } else { + buffer= + append_to_line(buffer,decode(cc,JOB->cfg.out_format),&len); + } + } + if (JOB->cfg.out_format==XML) { + if (box2->num_ac>0) { + /* output alist ToDo: separate */ + int i1; char s1[256]; + sprintf(s1,"\" numac=\"%d\" weights=\"",box2->num_ac); + buffer=append_to_line(buffer,s1,&len); + for (i1=0;i1num_ac;i1++) { + sprintf(s1,"%d",box2->wac[i1]); + buffer=append_to_line(buffer,s1,&len); + if (i1+1num_ac) buffer=append_to_line(buffer,",",&len); + } + if (box2->num_ac>1) + buffer=append_to_line(buffer,"\" achars=\"",&len); + for (i1=1;i1num_ac;i1++) { + if (box2->tas[i1] && box2->tas[i1][0]!='<') + buffer=append_to_line(buffer,box2->tas[i1],&len); + else + buffer=append_to_line(buffer, + decode(box2->tac[i1],JOB->cfg.out_format),&len); + // ToDo: add tas[] (achars->avalues or alternate_strings? + if (i1+1num_ac) buffer=append_to_line(buffer,",",&len); + } + } + buffer=append_to_line(buffer,"\" />\n",&len); + } + if (box2->num_ac && box2->tas[0]) { + if (box2->tas[0][0]=='<') { /* output special XML object */ + buffer=append_to_line(buffer,box2->tas[0],&len); + buffer=append_to_line(buffer,"\n",&len); + j+=strlen(box2->tas[0]); + } + } + j++; + } + i++; + } end_for_each(&(JOB->res.boxlist)); + if (JOB->cfg.out_format==XML && oldline>-1) { /* subject of change */ + buffer=append_to_line(buffer,"\n",&len); + } + if (JOB->cfg.out_format==XML) { /* subject of change */ + buffer=append_to_line(buffer,"\n\n",&len); + } + + /* do not forget last line */ + // is there no \n in the last line? If there is, delete next line. + list_app( &(JOB->res.linelist), (void *)strdup(buffer) ); + free(buffer); + if( JOB->cfg.verbose&1 ) + fprintf(stderr,"... %d lines, boxes= %d, chars= %d\n",i,i1,i2); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c new file mode 100644 index 000000000..332d2bd37 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c @@ -0,0 +1,334 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for email address + + ***********************************IMPORTANT********************************* + Notes to the developers: read the following notes before using these + functions. + * Be careful when using for_each_data() recursively and calling list_del. + It may mangle with the current[] pointers, and possibly segfault or do an + unpredictable or just undesirable behavior. We have been working on a + solution for this problem, and solved some of the biggest problems. + In a few words, the problem is this: when you delete a node, it may be + the current node of a lower level loop. The current code takes care of + access to previous/next elements of the now defunct node. So, if you do + something like: + + for_each_data(l) { + for_each_data(l) { + list_del(l, header_data); + free(header_data); + } end_for_each(l); ++ tempnode = list_cur_next(l); + } end_for_each(l); + + It will work, even though the current node in the outer loop was deleted. + However, if you replace the line marked with + with the following code: + + tempnode = list_next(l, list_get_current(l)); + + it will break, since list_get_current is likely to return NULL or garbage, + since you deleted header_data(). + Conclusion: use list_del carefully. The best way to avoid this problem is + to not use list_del inside a big stack of loops. + * If you have two elements with the same data, the functions will assume + that the first one is the wanted one. Not a bug, a feature. ;-) + * avoid calling list_prev and list_next. They are intensive and slow + functions. Keep the result in a variable or, if you need something more, + use list_get_element_from_data. + + */ + +#include +#include +#include "list.h" +#include "progress.h" + +void list_init( List *l ) { + if ( !l ) + return; + + l->start.next = &l->stop; + l->stop.previous = &l->start; + l->start.previous = l->stop.next = NULL; + l->start.data = l->stop.data = NULL; + l->current = NULL; + l->level = -1; + l->n = 0; +} + +/* inserts data before data_after. If data_after == NULL, appends. + Returns 1 on error, 0 if OK. */ +int list_ins( List *l, void *data_after, void *data) { + Element *e, *after_element; + + /* test arguments */ + if ( !l || !data ) + return 1; + + if ( !data_after || !l->n ) + return list_app(l, data); + + /* get data_after element */ + if ( !(after_element = list_element_from_data(l, data_after)) ) + return 1; + + /* alloc a new element */ + if( !(e = (Element *)malloc(sizeof(Element))) ) + return 1; + e->data = data; + e->next = after_element; + e->previous = after_element->previous; + after_element->previous->next = e; + after_element->previous = e; + l->n++; + + return 0; +} + +/* appends data to the list. Returns 1 on error, 0 if OK. */ +/* same as list_ins(l,NULL,data) ??? */ +int list_app( List *l, void *data ) { + Element *e; + + if ( !l || !data ) + return 1; + if ( !(e = (Element *)malloc(sizeof(Element))) ) + return 1; + + e->data = data; + e->previous = l->stop.previous; + e->next = l->stop.previous->next; + l->stop.previous->next = e; + l->stop.previous = e; + l->n++; + return 0; +} + +/* returns element associated with data. */ +Element *list_element_from_data( List *l, void *data ) { + Element *temp; + + if ( !l || !data || !l->n) + return NULL; + + temp = l->start.next; + + while ( temp->data != data ) { + if ( !temp || temp==&l->stop ) + return NULL; + temp = temp->next; + } + return temp; +} + +/* deletes (first) element with data from list. User must free data. + Returns 0 if OK, 1 on error. + This is the internal version, that shouldn't be called usually. Use the + list_del() macro instead. + */ +int list_del( List *l, void *data ) { + Element *temp; + int i; + + if (!data) return 1; /* do not delete start or stop element */ + + /* find element associated with data */ + if ( !(temp = list_element_from_data(l, data)) ) + return 1; + + /* test if the deleted node is current in some nested loop, and fix it. */ + for ( i = l->level; i >= 0; i-- ) { + if ( l->current[i] == temp ) { + l->current[i] = temp->previous; + } + } + + temp->previous->next = temp->next; + temp->next->previous = temp->previous; + temp->previous = temp->next = NULL; /* mark as freed */ +/* + fprintf(stderr,"\n# list_del=%p start=%p stop=%p",temp,&l->start,&l->stop); +*/ + + /* and free stuff */ + free(temp); /* element pointing to data, fixed mem-leak 0.41 */ + l->n--; + return 0; +} + +/* frees list. See also list_and_data_free() */ +void list_free( List *l ) { + Element *temp, *temp2; + + if ( !l || !l->n ) + return; + + if ( l->current ) { + free(l->current); + } + l->current = NULL; + + temp = l->start.next; + while ( temp && temp!=&l->stop) { + temp2 = temp->next; + free(temp); + temp = temp2; + } + l->start.next = &l->stop; + l->stop.previous = &l->start; +} + +/* setup a new level of for_each */ +int list_higher_level( List *l ) { + Element **newcur; + + if ( !l ) return(1); + + /* + Security-check: NULL pointer passed to realloc. + ANSI allows this, but it may cause portability problems. + */ + newcur = (Element **)realloc(l->current, (l->level+2)*sizeof(Element *)); + if (newcur) { + l->current = newcur; + l->level++; + l->current[l->level] = l->start.next; + } + g_debug(fprintf(stderr, " level++=%d current[]=%p\n", + l->level, l->current);) + if ( !newcur ) { + fprintf(stderr, " realloc failed! abort\n"); return(1); + } + return 0; +} + +void list_lower_level( List *l ) { + if ( !l ) + return; + + if (!l->level) { + free(l->current); /* calm -lefence */ + l->current = NULL; /* could be important */ + } else { + l->current = (Element **)realloc(l->current, l->level*sizeof(Element *)); + } + l->level--; + g_debug(fprintf(stderr, " level--=%d current[]=%p\n", l->level, + l->current);) +} + +/* returns the next item data */ +void *list_next( List *l, void *data ) { + Element *temp; + + if ( !l || !(temp = list_element_from_data(l, data)) ) + return NULL; + if( !temp->next ) return NULL; + return (temp->next->data); +} + +/* returns the previous item data */ +void *list_prev( List *l, void *data ) { + Element *temp; + + if ( !l || !(temp = list_element_from_data(l, data)) ) + return NULL; + if( !temp->previous ) return NULL; + return (temp->previous->data); +} + +/* Similar to qsort. Sorts list, using the (*compare) function, which is + provided by the user. The comparison function must return an integer less + than, equal to, or greater than zero if the first argument is considered to + be respectively less than, equal to, or greater than the second. + Uses the bubble sort algorithm. + */ +void list_sort( List *l, int (*compare)(const void *, const void *) ) { + Element *temp, *prev; + int i, sorted; + progress_counter_t *pc = NULL; + + if ( !l ) + return; + + /* start progress meter, sorting is slow for huge number of elements */ + /* l->n is the worst case, real time is less or equal estimated time */ + pc = open_progress(l->n,"list_sort"); + + for (i = 0; i < l->n; i++ ) { + sorted = 1; /* Flag for early break */ + for ( temp = l->start.next->next; + temp != NULL && temp != &l->stop; temp = temp->next ) { + if ( temp->previous == &l->start ) continue; + if ( compare((const void *)temp->previous->data, + (const void *)temp->data) > 0 ) { + + sorted = 0; /* rest flag */ + /* swap with the previous node */ + prev = temp->previous; + prev->previous->next = temp; + temp->next->previous = prev; + temp->previous = prev->previous; + prev->next = temp->next; + prev->previous = temp; + temp->next = prev; + /* and make sure the node in the for loop is correct */ + temp = prev; + +#ifdef SLOWER_BUT_KEEP_BY_NOW +/* this is a slower version, but guaranteed to work */ + void *data; + + data = temp->data; + prev = temp->previous; + list_del(l, data); + list_ins(l, prev->data, data); + temp = prev; +#endif + } + } + if (sorted) break; + progress(i,pc); /* progress meter */ + } + + close_progress(pc); + g_debug(fprintf(stderr, "list_sort()\n");) +} + +/* calls free_data() for each data in list l, + * before free list with list_free() */ +int list_and_data_free( List *l, void (*free_data)(void *data)) { + void *data; + + if ( !l ) return 0; + if ( !free_data ) return 1; + + for_each_data(l) { + if ((data = list_get_current(l))) + free_data(data); + } end_for_each(l); + + list_free(l); + + g_debug(fprintf(stderr, "list_and_data_free()\n");) + + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h new file mode 100644 index 000000000..dd3009985 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h @@ -0,0 +1,90 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + + */ + +#ifndef GOCR_LIST_H +#define GOCR_LIST_H + +#ifdef DEBUG +#define g_debug(a) a +#else +#define g_debug(a) +#endif + +/* + * Structures + */ + +struct element { + struct element *next, *previous; + void *data; +}; +typedef struct element Element; + +struct list { + Element start; /* simplifies for(each_element) { ... */ + Element stop; /* ... list_del() ... } v0.41 */ + Element **current; /* for(each_element) */ + int n; /* number of elements */ + int level; /* level of nested fors */ +}; +typedef struct list List; + +/* + * Functions + */ + +void list_init ( List *l ); +int list_app ( List *l, void *data ); +int list_ins ( List *l, void *data_after, void *data); +Element*list_element_from_data ( List *l, void *data ); +int list_del ( List *l, void *data ); +void list_free ( List *l ); +int list_and_data_free ( List *l, void (*free_data)(void *data)); +int list_higher_level ( List *l ); +void list_lower_level ( List *l ); +void * list_next ( List *l, void *data ); +void * list_prev ( List *l, void *data ); +void list_sort ( List *l, int (*compare)(const void *, const void *) ); + +#define list_empty(l) ((l)->start.next == &(l)->stop ? 1 : 0) +#define list_get_header(l) ((l)->start.next->data) +#define list_get_tail(l) ((l)->stop.previous->data) +#define list_get_current(l) ((l)->current[(l)->level]->data) +#define list_get_cur_prev(l) ((l)->current[(l)->level]->previous == NULL ? \ + NULL : (l)->current[(l)->level]->previous->data ) +#define list_get_cur_next(l) ((l)->current[(l)->level]->next == NULL ? \ + NULL : (l)->current[(l)->level]->next->data ) +#define list_total(l) ((l)->n) + +#define for_each_data(l) \ + if (list_higher_level(l) == 0) { \ + for ( ; (l)->current[(l)->level] \ + && (l)->current[(l)->level]!=&(l)->stop; (l)->current[(l)->level] = \ + (l)->current[(l)->level]->next ) { + + +#define end_for_each(l) \ + } \ + list_lower_level(l); \ + } + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c new file mode 100644 index 000000000..1066b7cb6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c @@ -0,0 +1,6591 @@ +/* + rule based OCR engine, partly rewritten for edges (old=pixel) + */ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for email address + + >>> DO NOT EDIT THIS FILE IF YOU NOT REALLY KNOW WHAT YOU ARE DOING! <<< + + I have invested lot of time, to write this part of the program. + This engine should recognize chars allways right or return UNKNOWN. + If you change something, test all other example files too, + to be sure that all things work better. (JoergS) + + This engine was pixelbased until 0.40 which was not successfull enough. + Also code changes always hade side effects. The vectorisation of the code + starts from version 0.41 with the chars XNz and seems to be much better + to handle. Vectorization means we frame each character by a chain of + vectors and dont care about pixels anymore. Unfortunatly I have to + replace all the pixel codes, which is a long process. Old code will be lost. + (JorgS) + + +ToDo: + - if box1->p and b differ, reduce probability + - probability makes life much easier here + - use only one box!?, may be bits have usefull infos + - divide this file, suggestion: classify chars: + high=ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhklt, low=acegijmnopqrsuvwxyz + or + often_used=etianmsurwdkgo rarely_used=hvjcflpqxyz.,: + or + every char (large overhead) + - two-pass version (first pass without tolerance) + 2nd pass with tolerance (ex: one tiny more in sdata->holes) + + general feature extraction: + - white holes at middle, upper, lower position (cost much time) + - test lines and triangles insteat of rectangles + + char is removed, wchar_t is used (better code) + + making a static global variable-set x.x0,x.x1, and call test_a, + test_b ... (faster compilation, but not reentrant!) + + - adding slant-angle (if detected) to distinguish between l and / ? + - ac (alternate chars) as string add_ac(box1,"/") => box1->ac="Il/"; + for better context correction or output: "Ha[lI][lI]o!" + +*/ + +#include +#include +// #include "pgm2asc.h" +#include "ocr0.h" +// #include "ocr1.h" +#include "pnm.h" +#include "gocr.h" + +#define IFV if(JOB->cfg.verbose&4) +#define MM {IFV fprintf(stderr,"\nDBG %c L%04d (%d,%d): ",(char)c_ask,__LINE__,box1->x0,box1->y0);} + +// the old debug mode (0.40) was only for a special char, for another char +// code must be recompiled with C_ASK='char' +// new debug mode (0.41) explains why char is declined or accepted as ABC... +// the output can be filtered by external scripts +// ToDo: we could reduce output to filter string +#ifndef DO_DEBUG /* can be defined outside */ +#define DO_DEBUG 0 /* 0 is the default */ +#endif + +/* this macro is for debugging output: "if char is declined, why?" */ +#if DO_DEBUG /* 0=Work mode, 1=debugging mode */ +// Setac: output, that char is choosen with a probability +// Break: output, why the char is not choosen +// MSG: debugging functions for char C_ASK, mostly messages +// DBG: definitions usefull only for debugging +#define Setac(box1,ac,ad) { MM;IFV fprintf(stderr,"setac %d",ad);setac(box1,ac,ad); } +#define Break { MM;IFV fprintf(stderr,"break"); break; } +#define MSG(x) { MM;IFV x } +#define DBG(x) x +#else +#define Setac(box1,ac,ad) setac(box1,ac,ad) +#define Break break +#define MSG(x) +#define DBG(x) +#endif + +/* extern "C"{ */ + +// static inline int sq(int x) { return x*x; } /* square */ + +/* + * go from vector j1 to vector j2 and measure maximum deviation of + * the steps from the line connecting j1 and j2 + * return the squared maximum distance + * in units of the box size times 1024 + * ToDo: 1) better give back max-dx and max-dy ??? + * errors if j1 and j2 are in different frames or belong to + * more then one frame? + * 2) Better get deviation from a complete vector graphic? + * The vectorgraphic is the ideal test char adapted to the + * extrem vertices of the real char. + */ +int line_deviation( struct box *box1, int j1, int j2 ) { + int r1x, r1y, r2x, r2y, r3x, r3y, i, x, y, d, dist, maxdist=0, frame, l2; + r1x=box1->frame_vector[j1][0]; + r1y=box1->frame_vector[j1][1]; + r2x=box1->frame_vector[j2][0]; + r2y=box1->frame_vector[j2][1]; + if (!box1->num_frames) return(-1); + if (j1<0 || j1>box1->num_frame_vectors[box1->num_frames-1] || + j2<0 || j2>box1->num_frame_vectors[box1->num_frames-1]) { + fprintf(stderr,"Error in "__FILE__" L%d: idx out of range",__LINE__); + return(-1); + } + /* get the frame the endvector belongs to */ + for (i=0;inum_frames;i++) + if (j2num_frame_vectors[i]) break; + frame=i; + /* frame(j1)<=frame(j2) possible */ + for (i=j1;;i++) { // do it for each vector between j1 and j2 + if (i >= box1->num_frame_vectors[frame]) + i=((frame)?box1->num_frame_vectors[frame-1]:0); /* go around */ + if (i==j2) break; + // for (i=j1;i!=j2;i=(i+1)%box1->num_frame_vectors[0]) {~} + r3x=box1->frame_vector[i][0]; + r3y=box1->frame_vector[i][1]; + // Language=german + // german: Abstand Punkt von Strecke, Laenge Lotrechte + // germ.Strecke : l1=(r1+r2)/2+d*(r2-r1)/2 for d=-1..1 + // germ.Lotrechte: l2=r3+b*[-(r2-r1).y,(r2-r1).x] + // Schnittpunkt : l1=l2, + // eq1x: (r1x+r2x)/2-r3x+d*(r2x-r1x)/2+b*(r2y-r1y)=0 + // eq1y: (r1y+r2y)/2-r3y+d*(r2y-r1y)/2-b*(r2x-r1x)=0 + // eq2x: b*(r2x-r1x)*(r2y-r1y)=-((r1x+r2x)/2-r3x+d*(r2x-r1x)/2)*(r2x-r1x) + // eq2y: b*(r2x-r1x)*(r2y-r1y)= ((r1y+r2y)/2-r3y+d*(r2y-r1y)/2)*(r2y-r1y) + // eq2y-eq2x: ... in units of 1024 (fast integer rounded correctly) + l2=sq(r2x-r1x)+sq(r2y-r1y); // square of distance r2-r1 + if (l2==0) { + // fprintf(stderr,"ocr0 L%d: r1==r2 r1= %d %d",__LINE__, r1x, r1y); // debugging + d=-1024; + } else + d=-( ((r1x+r2x)-2*r3x)*(r2x-r1x) + +((r1y+r2y)-2*r3y)*(r2y-r1y))*1024/l2; // ..-1024..+1024.. + if (d<=-1024) { x=r1x; y=r1y; } // starting point + else { + if (d>=1024) { x=r2x; y=r2y; } // end point + else { + x=((r1x+r2x)+1)/2+(d*(r2x-r1x))/2048; + y=((r1y+r2y)+1)/2+(d*(r2y-r1y))/2048; + /* we have the crossing point x,y now */ + } + } + dist=sq((x-r3x)*1024/(box1->x1-box1->x0+1)) + +sq((y-r3y)*1024/(box1->y1-box1->y0+1)); // 0..2*sq(1024) + if (dist>maxdist) maxdist=dist; + // for debugging: + // fprintf(stderr,"\nDBG dev: %d-%d-%d dist=%5d max=%5d d=%d %d,%d-%d,%d" + // " vector= %d %d crosspoint= %d %d ", + // j1,i,j2,dist,maxdist,d,r1x,r1y,r2x,r2y,r3x,r3y,x,y); + } + return maxdist; +} + +/* + * search vectors between j1 and j2 for nearest point a to point r + * example: + * + * r-> $$...$$ $ - mark vectors + * @@$..@@ @ - black pixels + * @@$..@@ . - white pixels + * @@@@.$@ + * a-> @@$@$@@ + * @$.@@@@ + * @@..$@@ + * @@..$@@ + * j1 --> $$...$$ <-- j2 + * + * ToDo: vector aa[5] = {rx,ry,x,y,d^2,idx} statt rx,ry? + * j1 and j2 must be in the same frame + * return aa? + */ +int nearest_frame_vector( struct box *box1, int j1, int j2, int rx, int ry) { + int x,y,d,i,aa[4]; /* x,y,normalized_distance^2,vector_index */ + int frame=0, x0=box1->x0, y0=box1->y0, + x1=box1->x1, y1=box1->y1, + dx=box1->x1-x0+1, dy=box1->y1-y0+1; + if (!box1->num_frames) return(-1); + if (j1<0 || j1>box1->num_frame_vectors[box1->num_frames-1] || + j2<0 || j2>box1->num_frame_vectors[box1->num_frames-1]) { + fprintf(stderr,"Error in "__FILE__" L%d: idx %d-%d out of range\n",__LINE__,j1,j2); + //out_x(box1); + return(-1); + } + aa[0]=x=box1->frame_vector[j2][0]; /* x */ + aa[1]=y=box1->frame_vector[j2][1]; /* y */ + /* maximum is (distance*128)^2 if r is inside the box */ + aa[2]=d=2*sq(128)+sq((rx-(x0+x1)/2)*128/dx)+sq((ry-(y0+y1)/2)*128/dy); + aa[3]=j2; /* vector index */ + /* get the frame the endvector belongs to */ + for (i=0;inum_frames;i++) + if (j2num_frame_vectors[i]) break; + frame=i; + /* frame(j1)<=frame(j2) possible */ + for (i=j1;;i++) { + if (i >= box1->num_frame_vectors[frame]) + i=((frame)?box1->num_frame_vectors[frame-1]:0); /* go around */ + x=box1->frame_vector[i][0]; /* take a vector */ + y=box1->frame_vector[i][1]; + /* distance to upper left end, normalized to 128 */ + d=sq((x-rx)*128/dx)+sq((y-ry)*128/dy); + if (d0 and m==1 box1 is changed +// m>0 modify box1->dots +// m==2 modify box1->y0 +// called by pgm2asc + ocr0(?) +int testumlaut(struct box *box1, int cs, int m, wchar_t *modifier){ + // pix p=*(box1->p); + int r,y,x,x0,x1,y0,y1,dx,dy,m1,m2,m3, + xl,xr,yu,yl; // left, right, upper and lower border of dots + wchar_t mod='\0'; /* (TeX-) modifier ~"'` for compose() */ + DBG( wchar_t c_ask='"'; ) + r=0; + x0=box1->x0; x1=box1->x1; dx=x1-x0+1; + y0=box1->y0; y1=box1->y1; dy=y1-y0+1; + m1=box1->m1; m2=box1->m2; m3=box1->m3; + xl=x0; xr=x1; yu=yl=y0; + if( dy < 5 || 4*y0 > 3*m2+m3 ) return 0; // no low chars: .,-= + /* modifier in box included? */ + if( 2*y1 > m1+m2 ){ + /* modifier in box included? */ + for(y=y0;2*yp,cs,1)==0 ) break; + if( 2*y extract */ + yl=y; + while( get_bw(xl,xr,y,y,box1->p,cs,1)==0 && 2*y<=y0+y1) y++; + if( m&2 ) box1->y0=y; /* set new upper bond */ + } + } + if( yu>=yl ) { if(m) box1->dots=0; return 0; } /* nothing found */ + if( get_bw(xl-1,xl-1,yu,yl-1,box1->p,cs,1)==1 ) // neighbour overlap? + while( get_bw(xl ,xl ,yu,yl-1,box1->p,cs,1)==1 && 2*xlp,cs,1)==1 ) break; + for(;xr>xl;xr--)if( get_bw(xr,xr,yu,yl,box1->p,cs,1)==1 ) break; + + if ( yl-1>yu ) { // tall box ij"a"o"u +#if 0 + x=box1->y0; box1->y0=m1; out_x(box1); box1->y0=x; + fprintf(stderr,"\n#testumlaut x= %d %d m1=%d m2=%d",x0,y0,m1-y0,m2-y0); + fprintf(stderr," yu=%d yl=%d xl=%d xr=%d",yu-y0,yl-y0,xl-x0,xr-x0); +#define DEBUG 1 +#endif + { + + x=xl;y=yu; + if( get_bw(xl,x1+1,yu,yl-1,box1->p,cs,1)==0 ) r=0; // neighbour overlap? + else + if( get_bw(xl ,xl ,yu,yl-1,box1->p,cs,1)==0 + || get_bw(xl-1,xl-1,yu,yl-1,box1->p,cs,1)==0 ) // be sure there are gap to neighbours + if( get_bw(xr ,xr ,yu,yl-1,box1->p,cs,1)==0 + || get_bw(xr+1,xr+1,yu,yl-1,box1->p,cs,1)==0 ) + { int i,j,x; + r=1; + // ...@@@.... RING_ABOVE // ..@@@..@@. TILDE + // ..@...@... // @@.@@@@@.. + // ..@...@... // @......... + // ..@..@@... + // ...@@@.... + for (i=yu;ip,cs,1)==1) break; + for ( ;ip,cs,1)==0) break; + for (j=xl;jp,cs,1)==1) break; + for ( ;jp,cs,1)==0) break; + for ( x=j;xp,cs,1)==1) break; + // vert. gap detected + if( j2 + && num_obj(xl,xr,yu,yl-1,box1->p,cs)>=2 // not best!!! + && num_cross(xl,xr,yu +(yl-yu)/4,yu+ (yl-yu)/4,box1->p,cs) == 2 + && num_cross(xl,xr,yl-1-(yl-yu)/2,yl-1-(yl-yu)/2,box1->p,cs) == 2 + ){ // may be the following lines are not quite ok + while( get_bw(xl,xr,yl,yl,box1->p,cs,1)==0 && 2*yly0=yl; +/* if( m&2 ) box1->y0= ( (r==1) ? yu : yl ); */ + // out_x(box1); + } + if(r==0){ // divided fr != fi + while( get_bw(x0,x1,yu,yu,box1->p,cs,1)==0 && 2*yuy0=yu; + } + if( r==1 ){ yl--; +// .@@@. ..@@. +// .@@.. .@@.. +// .@... .@@.. +// +// if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) +// > loop(box1->p,xl,yl,xr-xl,cs,0,RI) // +dx/8 +// && loop(box1->p,xr,yu,xr-xl,cs,0,LE) +// < loop(box1->p,xr,yl,xr-xl,cs,0,LE)) // -dx/8 ) // é Nov03 + if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) + - loop(box1->p,xr,yu,xr-xl,cs,0,LE) + > loop(box1->p,xl,yl,xr-xl,cs,0,RI) // +dx/8 + - loop(box1->p,xr,yl,xr-xl,cs,0,LE)+1) // -dx/8 ) // é Nov03 + mod = ACUTE_ACCENT; // ' + + if( xr-xl+1 > 3*(yl-yu+1) + && get_bw(xl,xr,yu,yl,box1->p,cs,2)==0 ) + mod = MACRON; // "-" above + +// .@@@. .@@.. +// ..@@. ..@@. +// ...@. ..@@. +// +// if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) +// < loop(box1->p,xl,yl,xr-xl,cs,0,RI) // -dx/8 +// && loop(box1->p,xr,yu,xr-xl,cs,0,LE) +// > loop(box1->p,xr,yl,xr-xl,cs,0,LE) ) // +dx/8 ) à Nov03 + if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) + - loop(box1->p,xr,yu,xr-xl,cs,0,LE) + < loop(box1->p,xl,yl,xr-xl,cs,0,RI) // -dx/8 + - loop(box1->p,xr,yl,xr-xl,cs,0,LE) -1 ) // +dx/8 ) à Nov03 + mod = GRAVE_ACCENT; // ` + +#ifdef DEBUG + fprintf(stderr,"\n#testumlaut x= %d %d m1=%d m2=%d",x0,y0,m1-y0,m2-y0); + fprintf(stderr," yu=%d yl=%d xl=%d xr=%d",yu-y0,yl-y0,xl-x0,xr-x0); +#endif + if( (xr-xl+1) < 2*(yl-yu+1)+2 + && 2*(xr-xl+1)+2 > (yl-yu+1) ) { + int i,i1,i2,i3,i4; + i1=loop(box1->p,xl ,(yu+yl)/2,xr-xl+1,cs,0,RI); + i1=loop(box1->p,xl+i1,(yu+yl)/2,xr-xl+1,cs,1,RI); + i2=loop(box1->p,(xl+xr)/2,yu ,yl-yu+1,cs,0,DO); + i2=loop(box1->p,(xl+xr)/2,yu+i2,yl-yu+1,cs,1,DO); + for (i=0;ip,xl+i,yu+i)< cs) break; i3=i; + for ( ;ip,xl+i,yu+i)>=cs) break; i3=i-i3; + for (i=0;ip,xr-i,yu+i)< cs) break; i4=i; + for ( ;ip,xr-i,yu+i)>=cs) break; i4=i-i4; +#ifdef DEBUG + fprintf(stderr,"\n#DEBUG DOT_ABOVE %d %d %d %d",i1,i2,i3,i4); +#endif + if ( (xr-xl<5 && yl-yu<8) /* to small */ + || (i1>=(xr-xl+1)/2+2 && i2>=(yl-yu+1)/2+2 /* symmetrical */ + && abs(i3-i4)<=i1/4+2 && abs(i1-i2)<=i1/4+2 + && abs(i3-i1)<=i1/4+4 && abs(i4-i2)<=i1/4+4) + ) + mod = DOT_ABOVE; // "." above, ToDo: improve it! + } + + if( ( loop(box1->p,xl,yu ,xr-xl,cs,0,RI) + > loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/8 + || loop(box1->p,xl,yu ,xr-xl,cs,0,RI) + > loop(box1->p,xl,yl-1,xr-xl,cs,0,RI)-dx/8 ) + && ( loop(box1->p,xr,yu ,xr-xl,cs,0,LE) + > loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/8 + || loop(box1->p,xr,yu ,xr-xl,cs,0,LE) + > loop(box1->p,xr,yl-1,xr-xl,cs,0,LE)-dx/8 ) + && num_cross(xl,xr,yu ,yu ,box1->p,cs) == 1 + && ( num_cross(xl,xr,yl ,yl ,box1->p,cs) == 2 + || num_cross(xl,xr,yl-1,yl-1,box1->p,cs) == 2 )) + mod = CIRCUMFLEX_ACCENT; // "^" + + if( ( loop(box1->p,xl,yu ,xr-xl,cs,0,RI) + < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 + || loop(box1->p,xl,yu+1,xr-xl,cs,0,RI) + < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 ) + && ( loop(box1->p,xr,yu ,xr-xl,cs,0,LE) + < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 + || loop(box1->p,xr,yu+1,xr-xl,cs,0,LE) + < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 ) + && ( num_cross(xl,xr,yu ,yu ,box1->p,cs) == 2 + || num_cross(xl,xr,yu+1,yu+1,box1->p,cs) == 2 ) + && num_cross(xl,xr,yl ,yl ,box1->p,cs) == 1 ) + mod = CARON; // "v" above + + if( /* test for bow (new0.3.6) */ + loop(box1->p,xl,yu ,xr-xl,cs,0,RI) + + loop(box1->p,xl,yl ,xr-xl,cs,0,RI) + - 2*loop(box1->p,xl,(yl+yu)/2,xr-xl,cs,0,RI) > dx/16+1 + && xr-xl>10) + if( ( loop(box1->p,xl,yu ,xr-xl,cs,0,RI) + < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 + || loop(box1->p,xl,yu+1,xr-xl,cs,0,RI) + < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 ) + && ( loop(box1->p,xr,yu ,xr-xl,cs,0,LE) + < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 + || loop(box1->p,xr,yu+1,xr-xl,cs,0,LE) + < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 ) + && ( num_cross(xl,xr,yu ,yu ,box1->p,cs) == 2 + || num_cross(xl,xr,yu+1,yu+1,box1->p,cs) == 2 ) + && num_cross(xl,xr,yl ,yl ,box1->p,cs) == 1 ) + mod = BREVE; // round "u" above + + if( xr-xl>3 && yl-yu>1 ) + if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) + > loop(box1->p,xl,yl,xr-xl,cs,0,RI) + && loop(box1->p,xr,yu,xr-xl,cs,0,LE) + < loop(box1->p,xr,yl,xr-xl,cs,0,LE) + && num_cross(xl,xr,yu,yu,box1->p,cs) == 2 + && num_cross(xl,xr,yl,yl,box1->p,cs) == 2 ) + mod = TILDE; + + if( xr-xl>2 && yl-yu>2) + if( num_cross(xl,xr,(yu+yl)/2,(yu+yl)/2,box1->p,cs) >1 ) + if( num_cross((xl+xr)/2,(xl+xr)/2,yu,yl,box1->p,cs) >1 ) + if( num_hole(xl,xr,yu,yl,box1->p,cs,NULL) == 1 ) + mod = RING_ABOVE; + +#ifdef DEBUG + printf("\n#DEBUG umlaut mod=0x%04x x=%d..%d y=%d..%d r=%d %s", + (int)mod,yu-box1->y0,yl-box1->y0, + xl-box1->x0,xr-box1->x0,r,((mod==CARON)?"CARON": + ((mod==ACUTE_ACCENT)?"ACUTE": + ((mod==TILDE)?"TILDE":"?")))); + out_x(box1); +#endif + + } + } + if (m) box1->dots=r; // set to 0 also possible after division + if (m) box1->modifier=mod; /* should be resetted after compose ??? */ + MSG(fprintf(stderr,"umlaut mod=%s dots=%d y0o=%d",decode(mod,ASCII),r,y0);) + } +// printf(" modifier=%c",mod); + if (modifier) *modifier=mod; /* set modifier */ + return r; +} + + +static wchar_t ocr0_eE(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + int i,i1,i2,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar,bad_e=0, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ + + // --- most frequent letter e first!!! + // --- test e --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 (smallest seen is 5x6) + DBG( wchar_t c_ask='e'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num != 1) ad=97*ad/100; + /* ToDo: may be a two pass version intolerant/tolerant is better */ + if( loop(box1->p,x0,y0+dy/2,x1-x0,cs,0,RI)>dx/3 ) Break; // rough test + if( loop(box1->p,x0+dx/2,y0,y1-y0,cs,0,DO)>dy/3 ) Break; + if( loop(box1->p,x0+dx/2,y1,y1-y0,cs,0,UP)>dy/3 ) Break; + if( num_cross(x0,x1,y0+dy/4 ,y0+dy/4 ,box1->p,cs) > 2 + && num_cross(x0,x1,y0+dy/4+1,y0+dy/4+1,box1->p,cs) > 2 ) Break; // gt + x=(x0+x1)/2;i= num_cross(x,x,y0,y1,box1->p,cs); // v0.40 + if (i!=3) { x=(x0+2*x1)/3;i= num_cross(x,x,y0,y1,box1->p,cs); } + if (i!=3) { x=(x0+3*x1)/4;i= num_cross(x,x,y0,y1,box1->p,cs); } + if (i!=3) { i= num_cross((x0+2*x1)/3,(x0+x1)/2,y0,y1,box1->p,cs); } + i=loop(box1->p,x0,y0+dy/2,x1-x0,cs,0,RI); if( i>dx/2 ) Break; + j=loop(box1->p,x0,y0 ,x1-x0,cs,0,RI); if( jp,x0,y1 ,x1-x0,cs,0,RI); if( jp,x0+dx/2,y0,y1-y0,cs,0,DO); if( i>dx/2 ) Break; + j=loop(box1->p,x1-dx/3,y0,y1-y0,cs,0,DO); if( jp,x0 ,y0,y1-y0,cs,0,DO); if( jp,x1 ,y0,y1-y0,cs,0,DO); if( jp,x0+dx/2,y1,y1-y0,cs,0,UP); if( i>dx/2 ) Break; + j=loop(box1->p,x0 ,y1,y1-y0,cs,0,UP); if( jp,x1 ,y1,y1-y0,cs,0,UP); if( jp,x0, (y0+y1)/2,x1-x0,cs,0,RI) + -loop(box1->p,x0,(3*y0+y1)/4,x1-x0,cs,0,RI) + -loop(box1->p,x0,(y0+3*y1)/4,x1-x0,cs,0,RI); + if (dx>3 && j>=dx/4) Break; // ~g 4x6font + for(y=1;yp,cs) == 2 ) break; + if( y==dy/2 ) Break; // v0.2.5 ~ bad_t + for(i=0,j=x0+dx/4;j<=x1-dx/4 && i<=dx/4;j++) + if( num_cross(j,j,y0,y1,box1->p,cs) == 3 ) i++; + if( dx>4 && dy>5 && (i set x,y + for(x=0,y=i=y0+dy/3;ip,x1,i,y1-y0,cs,0,LE); + if(j>=x) { x=j;y=i; } + } + if (x 2* smallest thickness right + for(i1=dx,i=y0+dy/3;ip,x0 ,i,y1-y0,cs,0,RI); if (j>dx/2) break; + j =loop(box1->p,x0+j,i,y1-y0,cs,1,RI); + if (jp,x1 ,i,y1-y0,cs,0,LE); + j =loop(box1->p,x1-j,i,y1-y0,cs,1,LE); + if(j2*i1) Break; // not accepted, if right line is not very thinn + x =loop(box1->p,x1 ,y,y1-y0,cs,0,LE); + x+=loop(box1->p,x1-x,y,y1-y0,cs,1,LE); + x+=loop(box1->p,x1-x,y,y1-y0,cs,0,LE); + if (3*i2>i1) ad=99*ad/100; + if (2*i2>i1) ad=99*ad/100; + bad_e=60; // used later? + } + if (xp,cs) > 1 ) i=0; + if( i ) Break; +// ..@@@@...<- +// .@@@@@@;. +// @@,...@@. +// @@.....@, +// @@@@@@@@@ +// @@.,;.@,. <- problem (y) == bad_e>50 +// @@.....@. +// @@,...@@. +// .@@@,@@@. +// ..@@@@;..<- + if (dy>11 && bad_e<50) + if ( num_cross(x0,x1,y,y,box1->p,cs) != 1 ) Break; // except "geschwungenem e" + if ( num_cross(x0,x1-dx/3,y ,y ,box1->p,cs) != 1 + && num_cross(x0,x1-dx/3,y+1,y+1,box1->p,cs) != 1 ) Break; + // if( num_hole(x0, x1, y0 , y ,box1->p,cs,NULL) < 1 ){ + if( sdata->holes.num == 0 || sdata->holes.hole[0].y1 >= y-y0){ + if( sdata->hchar ) Break; // ~ \it t + // look if thinn font (may be h-line is broken) Mai00 + for(j=0,i=x0+dx/8;ip,cs,1) == 1 ) j++; + if(j<2*dx/4) Break; + } + if( sdata->holes.num>0 && sdata->holes.hole[0].y0 > y-y0) Break; + if( sdata->holes.num>1 && sdata->holes.hole[1].y0 > y-y0) Break; + if( sdata->holes.num==1 && sdata->holes.hole[0].x0 >= dx/2) { + ad=95*ad/100; } /* 8*10 @ (=at) is not an e */ + // look for horizontal gap + for(x=0,y=i=y0+dy/4;ip,x0,i,x1-x0,cs,0,RI); + if(j>=x) { x=j;y=i; } + } + if (y>y0+dy/4 && ydx/2) Break; // s + if (x>dx/4) ad=99*ad/100; + + if( num_cross(x0+dx/2,x1 ,y1-dy/4,y1 ,box1->p,cs) == 0 + && num_cross(x0+dx/2,x1-1,y1-dy/4,y1 ,box1->p,cs) == 0 + && num_cross(x0+dx/2,x1 ,y1-dy/4,y1-1,box1->p,cs) == 0 ) { + if (sdata->gchar) Break; // ~p + ad=99*ad/100; + } + /* upper case is for 5x6 box */ + if( sdata->hchar // broken B ? should also work when linedetection fails + && loop(box1->p,x1,y1-dy/3,dx,cs,0,LE)<=dx/8 ) { + x = loop(box1->p,x0,y0+dy/2,dx,cs,0,RI); + if( loop(box1->p,x0,y0+dy/4,dx,cs,0,RI)<=x + && loop(box1->p,x0,y0+dy/8,dx,cs,0,RI)<=x ) Break; + if( loop(box1->p,x0,y1-dy/4,dx,cs,0,RI)<=x + && loop(box1->p,x0,y1-dy/8,dx,cs,0,RI)<=x ) Break; + } + x = loop(sdata->bp,0,dy-2 ,dx,cs,0,RI); + if( loop(sdata->bp,0,dy-1-dy/8,dx,cs,0,RI)>x && dy>16) Break; // some Q + if (box1->m2) { + if (sdata->gchar) ad=99*ad/100; + if (sdata->hchar) ad=99*ad/100; + } else ad=99*ad/100; + + Setac(box1,(wchar_t)'e',ad); + if (ad>=100) return 'e'; + break; + } + // --- test E --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4 ;){ // min 3x4 + // rewritten for vectors 0.43 + int i1, i2, i3, i4, i5; // line derivation + corners + DBG( wchar_t c_ask='E'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the upper right end of the h */ + if (aa[3][2]>d/2) Break; /* [2] = distance, ~dj... */ + if (aa[0][2]>d/2) Break; /* upper left end */ + if (aa[1][2]>d/2) Break; /* lower left end */ + if (aa[2][2]>d/2) Break; /* lowerright end */ +/* + E f near E + + OOOOOOOO OOOO + O5 O O + O4 O + OOOO3 OOOOOO + O2 O + O O + O1 O O + OOOOOOOO OOOOOO +*/ + // check the bow from below + for (i=aa[1][3];i!=aa[2][3];i=(i+1)%box1->num_frame_vectors[0]) { + if (y1-box1->frame_vector[ i][1]>dy/4) break; // fatal! + } if (i!=aa[2][3]) Break; // ~AHKMNRX + // search most left+down between bottom right and top right + i1=nearest_frame_vector(box1, aa[2][3],aa[3][3], x0, y1); + i5=nearest_frame_vector(box1, i1,aa[3][3], x0, y0); + i3=nearest_frame_vector(box1, i1, i5, x1, (y0+y1)/2); + i2=nearest_frame_vector(box1, i1, i3, x0, (2*y0+y1)/3); + i4=nearest_frame_vector(box1, i3, i5, x0, (y0+2*y1)/3); + i =nearest_frame_vector(box1, aa[0][3],aa[1][3], x0-dx/4, (y0+y1)/2); + if (2*box1->frame_vector[i][0] < aa[0][0]+aa[1][0]-1-dx/16) Break; + if (2*box1->frame_vector[i][0] < aa[0][0]+aa[1][0]) ad=99*ad/100; // f + + MSG(fprintf(stderr,"i1-5 %d %d %d %d %d",i1,i2,i3,i4,i5);) + // holes right open? + for( i=1,y=y0; yp,cs,2) == 0 ) i=0; + if( i ) Break; + for( i=1,y=y1; y>y1-dy/4 && i; y-- ) // long black line + if( get_bw(x0+dx/6,x1-dx/4,y,y,box1->p,cs,2) == 0 ) i=0; + if( i ) Break; + for( i=1,y=y0+dy/3; yp,x0 ,y,dx,cs,0,RI); + j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>dx/3 ) i=0; + } if( i ) Break; + x=x1-dx/3; y=y0; // von oben durchbohren! + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,DO,ST); if( y>y0+dy/4 ) Break; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,ST,DO); if( y>y0+dy/3 ) Break; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,RI,DO); if( x<=x1 || y>y0+dy/2 ) Break; + x=x1-dx/3; y=y1; // von unten durchbohren! + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,ST,UP); if( yp,&x,&y,x0,x1,y0,y1,cs,RI,UP); if( x<=x1 || yp,&x,&y,x0,x1,y0,y1,cs,DO,ST); if( y>y0+dy/4 ) Break; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,ST,DO); if( y>y0+dy/3 ) Break; + y+=dy/15; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,LE,ST); if( x15 && x==x0) ad=99*ad/100; // to thin + x+=dx/15+1; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,DO,ST); if( y>y1-dy/3 ) Break; + // if( num_hole(x0, x1, y0 , y1 ,box1->p,cs,NULL) > 0 ) Break; + if (sdata->holes.num > 0) Break; + i=loop(box1->p,x0,y0+dy/4,dx,cs,0,RI); if(i>dx/2) Break; + j=loop(box1->p,x0,y0+dy/2,dx,cs,0,RI); if(ji+dx/8) Break; i=j; + j=loop(box1->p,x0,y1-dy/4,dx,cs,0,RI); if(ji+dx/8) Break; + j=loop(box1->p,x1,y1-dy/4,dx,cs,0,LE); + for( x=dx,y=y0+dy/6; yp,x0,y,dx,cs,0,RI); + if (i>j/2 && ad>98) ad=99*ad/100; + if (i>dx/4) break; + if(i3*dx) // ~[ + if( get_bw(x0+dx/2,x0+dx/2,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) Break; + + if (box1->m2) { + if (!hchar) ad=ad*99/100; + if ( gchar) ad=ad*99/100; + } + Setac(box1,(wchar_t)'E',ad); + if (ad>=100) return 'E'; + break; + } + return box1->c; +} + +static wchar_t ocr0_n(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + int i,j,d,x,y,i1,i2,i3,handwritten=0, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test n --------------------------------------------------- + // glued rm is very similar to glued nn -> thickness of h-line should grow + // may02: tested for 8x12 font + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='n'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + i= num_cross( 0,dx-1,dy/4,dy/4,sdata->bp,cs); + j= num_cross( 0,dx-1,dy/2,dy/2,sdata->bp,cs); + if( (i<2 || i>3) && j!=2 ) Break; + if( loop(sdata->bp,dx/2,0,dy,cs,0,DO) > dy/8 && sdata->hchar ) Break; /* tt */ + y=5*dy/8; /* also for handwritten n, where first bow goes not down enough */ + if( num_cross( 0,dx/2,y ,y ,sdata->bp,cs) != 1 + && num_cross( 0,dx/2,y-1,y-1,sdata->bp,cs) != 1 + && num_cross(dx/2,dx-1,y ,y ,sdata->bp,cs) < 1 ) Break; // n rr + // ~thick_w + y=loop(sdata->bp,dx-1-dx/4,0,dy,cs,0,DO); if(y>dy/2) Break; + if(y>1)if( get_bw(dx-1-dx/4,dx-1,0,y-2,sdata->bp,cs,1) == 1 ) Break; + + y=3*dy/4; + if( num_cross(0, dx/2,y ,y ,sdata->bp,cs) == 1 + && num_cross(dx/2,dx-1,y ,y ,sdata->bp,cs) == 0 ) Break; // ~p + y=dy/2; + if( num_cross(0,dx-1,dy/2-dy/8,dy/2-dy/8,sdata->bp,cs) == 2 + && num_cross(0,dx-1,dy/2, dy/2 ,sdata->bp,cs) == 2 ) { // n rr + /* printed n */ + x =loop(sdata->bp,0,y,dx ,cs,0,RI); if(x> dx/4) Break; // search 1st v-line + x+=loop(sdata->bp,x,y,dx-x,cs,1,RI); if(x> dx/2) Break; i1=x; // 1st gap + x+=loop(sdata->bp,x,y,dx-x,cs,0,RI); if(x< dx/2) Break; i2=x; // 2nd v-line + x+=loop(sdata->bp,x,y,dx-x,cs,1,RI); if(x<3*dx/4) Break; i3=x; // 2nd gap + i=dy/4; y=13*dy/16; + if( num_cross(dx/2,dx-1,y,y,sdata->bp,cs)==2 ) i=3*dy/8; // \it n + if (i<2 && il1 l2 l3 l4 ??? + for(x=i1;xbp,x, 0,dy,cs,0,DO)>=i ) break; + if(x bp,x,dy-1,dy,cs,0,UP) >dy/4 ) break; + if(x==i2) Break; // no gap detected (glued serifs ??? ) + // glued rm as nn ??? + for(y=0,x=(i1+i2)/2;xbp,x,0,dy,cs,0,DO); + i=loop(sdata->bp,x,i,dy,cs,1,DO); // measure thickness + if( i>y ) y=i; if( i7 ) + if( loop(sdata->bp,dx-1,dy-1-dy/8,dx,cs,0,LE) + +loop(sdata->bp, 0,dy-1-dy/8,dx,cs,0,RI)-dx/8-1 + > loop(sdata->bp,dx-1,dy-1-dy/2,dx,cs,0,LE) + +loop(sdata->bp, 0,dy-1-dy/2,dx,cs,0,RI) ) ad=90*ad/100; // broken o + if( dy>7 && dx>7 ) + if( loop(sdata->bp,dx-1, dy/2,dx,cs,0,LE)==0 + && loop(sdata->bp,dx-1,dy-1-dy/8,dx,cs,0,RI)>dx/8 ) ad=98*ad/100; // broken o + } else { /* check handwritten n */ + if( num_cross(0,dx-1,dy/2, dy/2 ,sdata->bp,cs) != 3 + && num_cross(0,dx-1,dy/2-dy/8,dy/2-dy/8,sdata->bp,cs) != 3 ) Break; + i =loop(sdata->bp,0,dy/2-dy/8,dx,cs,0,RI); if (i>dx/4) Break; + i+=loop(sdata->bp,i,dy/2-dy/8,dx,cs,1,RI); if (i>dx/2) Break; + i+=loop(sdata->bp,i,dy/2-dy/8,dx,cs,0,RI); + if( num_cross(i,i, 0,dy/2-2*dy/8,sdata->bp,cs) != 0 ) Break; + i+=loop(sdata->bp,i,dy/2-dy/8,dx,cs,1,RI); + if( num_cross(i,i,dy/2+1, dy-1,sdata->bp,cs) != 0 ) Break; + handwritten=80; + } + + i= loop(sdata->bp,dx-1 ,dy/2,dx,cs,0,LE); if(i>5) + if( get_bw(dx-1-i/2,dx-1-i/2,0,dy/2,sdata->bp,cs,1) == 1 ) Break; // ~rr + i+=loop(sdata->bp,dx-1-i,dy/2,dx,cs,1,LE); + if( get_bw(dx-1-i ,dx-1-i ,0,dy/2,sdata->bp,cs,1) == 0 ) Break; // ~rv + + if( get_bw(dx/2,dx/2,dy/4,dy/4,sdata->bp,cs,1) == 0 + && get_bw(dx/2,dx-1,dy-2,dy-2,sdata->bp,cs,1) == 0 + && get_bw(dx/2,dx/2,dy/4,dy-2,sdata->bp,cs,1) == 1 ) Break; // ~P + + // glued ri ??? + if( box1->dots>0 && box1->m1 ) + if( get_bw((x1+x0)/2,x1,box1->m1,y0-1,box1->p,cs,1) == 1 ) + if( num_cross( 0,dx-1,0 ,0 ,sdata->bp,cs) >2 + || num_cross( 0,dx-1,1 ,1 ,sdata->bp,cs) >2 ) Break; + + + i=loop(sdata->bp,dx-1, dy-1,dx,cs,0,LE); if (i>dx/2) + i=loop(sdata->bp,dx-1, dy-2,dx,cs,0,LE); + x=loop(sdata->bp,dx-1,dy-1-dy/4,dx,cs,0,LE); + if (sdata->hchar && i-x>1) Break; // ß + x=loop(sdata->bp, 0,dy-1,dx,cs,0,LE); // check for serifs + i=loop(sdata->bp, 0,dy-2,dx,cs,0,LE); if (ibp, 0, 1,dx,cs,0,LE); if (ibp, 0, 2,dx,cs,0,LE); if (ihchar && x>0) Break; // fl + + if (num_cross( 0,dx-1,dy/4,dy/4,sdata->bp,cs)>=3) ad=98*ad/100; // small M + if (sdata->hchar || 2*y0m1+box1->m2) ad=96*ad/100; + if (sdata->gchar) ad=96*ad/100; // ß fl + if (dx<5) { // for small fonts no middle line is possible for m + ad=99*ad/100; // 4x6 m + if (num_cross(0,dx-1,dy/8,dy/8,sdata->bp,cs)>=2) { + ad=97*ad/100; // ~m + if (dy<=4) Setac(box1,'m',97); // only for 4x6 font! + } + } + Setac(box1,'n',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_M(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int d,x,y,i0,i1,i2,i3,t1,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // ------------------ test M --------------------------- + for(ad=d=100;dx>3 && dy>3;){ // dy<=dx nicht perfekt! besser mittleres + // min-suchen fuer m + DBG( wchar_t c_ask='M'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1, dy/2, dy/2,bp,cs)<3 + && num_cross(0,dx-1, dy/4, dy/4,bp,cs)<3 + && num_cross(0,dx-1,5*dy/8,5*dy/8,bp,cs)<3 + && num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)<3 + && dx>4 ) Break; + if( num_cross(0,dx-1, dy/4, dy/4,bp,cs)<2 + && num_cross(0,dx-1, dy/8, dy/8,bp,cs)<2 ) Break; /* fat M */ + if( num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)<2 ) Break; + + x = loop(bp,dx-1 ,dy-1,dx,cs,0,LE); // ~ melted kl + x = loop(bp,dx-1-x,dy-1,dx,cs,1,LE); if( x>dx/2 ) Break; + + if( loop(bp, 0,7*dy/16,dx,cs,0,RI) + + loop(bp,dx-1,7*dy/16,dx,cs,0,LE) > dx/2 ) Break; // ~K + + if( dy>8 /* following lines should be extend to range check */ + && loop(bp, dx/4,dy-1, dy,cs,0,UP) 2 + && num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)> 2 ) Break; // ~it_u + if( num_cross(0 ,dx-1,3*dy/4,3*dy/4,bp,cs)==2 + && num_cross(dx/2,dx/2,3*dy/4, dy-1,bp,cs)> 0 ) Break; // ~it_v + + if( loop(bp,3*dx/4, 0,dy,cs,0,DO) + > loop(bp,2*dx/4, 0,dy,cs,0,DO) + && loop(bp,3*dx/4,dy-1,dy,cs,0,UP) + < loop(bp,2*dx/4,dy-1,dy,cs,0,UP) ) Break; // ~N + if( loop(bp,3*dx/4, dy/8,dy,cs,0,DO) + > loop(bp,2*dx/4, dy/8,dy,cs,0,DO) + && loop(bp,3*dx/4,dy-1-dy/8,dy,cs,0,UP) + < loop(bp,2*dx/4,dy-1-dy/8,dy,cs,0,UP) ) Break; // ~serif_N + + // i0 is lower end of upper serifen (widest gap? ) + i0=0; + + if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)!=4 ){ // Is it a N ? + if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)==3 ){ + for(y=dy/2+1;yy-2 ) Break; // ~N + } + } + } + // MNWK + for(i2=0,i1=x=dx/2;xi2) {i2=y;i1=x;} else break; } + i3=i2+loop(bp,i1,i2,dy-i2,cs,1,DO); + if(i2hchar) Break; // rm + ad=99*ad/100; + } + if (i2==0 && dx>8 && dy>12) Break; // glued and bad splitted serifen-MN + + // if( num_hole(x0, x1, y0 , y1 ,box1->p,cs,NULL) != 0 ) Break; // small A + if (sdata->holes.num != 0) Break; + t1=loop(bp,0 ,3*dy/4,dx,cs,0,RI); + t1=loop(bp,t1,3*dy/4,dx,cs,1,RI); // thickness of line? + if( 7*(t1+1)=i2 ) Break; // no good M + i1+=loop(bp,i1, dy/4,dx,cs,1,RI); + i2+=loop(bp,i2,3*dy/4,dx,cs,1,RI); + if( i1>=i2 ) Break; // no good M + i1+=loop(bp,i1, dy/4,dx,cs,0,RI); + i2+=loop(bp,i2,3*dy/4,dx,cs,0,RI); + if( i1<=i2 ) Break; // no good M + } + if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)==2 + && num_cross(0,dx-1,dy/4,dy/4,bp,cs)==2 && !hchar ) Break; // ~ \it u + + if (dy<17) + if( num_cross(0,dx-1, 0, 0,bp,cs)<2 ) ad=99*ad/100; + if (dx>5) /* 4x6 font has only 1 cross at y=1 */ + if( num_cross(0,dx-1, 1, 1,bp,cs)<2 ) ad=96*ad/100; // kt + if( num_cross(dx/2,dx/2, 0, dy-1,bp,cs)!=1) ad=98*ad/100; // kt + if (dx<5 && loop(bp,dx/2,0,dy,cs,0,DO)>=3*dy/8) ad=96*ad/100; // 4x6 H + + if( num_cross(0,dx-1, dy/4, dy/4,bp,cs)<=2 + && num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)<=2 + && dx>8 && dy>12 ){ + ad=98*ad/100; + for(y=5*dy/16;y<5*dy/8;y++) // look for H-line + if( num_cross(0,dx-1,y ,y ,bp,cs)==1 ) break; + if( y<5*dy/8 ) ad=95*ad/100; + if( y<5*dy/8 ) + if( num_cross(2+dx/6,dx-3-dx/6,y-2,y-2,bp,cs)==0 + || num_cross(2+dx/6,dx-3-dx/6,y-1,y-1,bp,cs)==0 ) Break; // ~H bad! + } + + if( loop(bp,3*dx/8, 0,dy,cs,0,DO) >dy/2 + && loop(bp,5*dx/8,dy-1,dy,cs,0,UP) >dy/2 ) ad=95*ad/100; + + if(!hchar){ + ad=98*ad/100; /* not sure */ + if( loop(bp,0, dy/4,dx,cs,0,RI) + < loop(bp,0,dy-1-dy/8,dx,cs,0,RI)-dx/16 ) Break; // ~wi glued + } + if( gchar ) ad=98*ad/100; + if (ad>99 && dx<8) ad=99*ad/100; /* give 5x8 N a chance */ + Setac(box1,'M',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_N(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + int d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + (*aa)[4]=sdata->aa, /* corner-points, (x,y,dist^2,vector_idx) */ + dbg[9], + ad; /* tmp-vars */ + + // --- test N ------- +hchar -gchar + for(ad=d=100;dx>3 && dy>3;){ // 4x6font + DBG( wchar_t c_ask='N'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num > 0) ad=98*ad/100; /* # */ + if (dx<6) ad=99*ad/100; + if (dx<5) ad=99*ad/100; + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the 4 ends of the x */ + if (aa[0][2]>d) Break; + if (aa[1][2]>d) Break; + if (aa[2][2]>d) Break; + if (aa[3][2]>d) Break; + if (aa[3][0]-aa[0][0](dy+2)/5) Break; /* glued tu */ + if (abs(aa[3][1]-aa[0][1])>(dy+4)/8) ad=98*ad/100; /* glued tu */ + /* left and right vertical line */ + d=line_deviation(box1, aa[0][3], aa[1][3]); if (d>2*sq(1024/4)) Break; + ad=(100-(d-sq(1024)/2)/sq(1024)/4)*ad/100; + d=line_deviation(box1, aa[2][3], aa[3][3]); if (d>2*sq(1024/4)) Break; + + /* search uppermost left ^ (between near 0,0) */ + i1=nearest_frame_vector(box1,aa[1][3],aa[2][3], x0+dx/8, y0); + x=box1->frame_vector[i1][0]; + y=box1->frame_vector[i1][1]; + MSG( fprintf(stderr,"i1= %d (%d,%d) left ^", i1,x-x0,y-y0);) + if (y-y0 > 5*dy/8) Break; + if (x-x0 > 5*dx/8) Break; + /* search uppermost right ^ ~H */ + i3=nearest_frame_vector(box1,aa[1][3],aa[2][3], x1, y0); + MSG( fprintf(stderr,"i3= %d (%d,%d) right ^",\ + i3, box1->frame_vector[i3][0]-x0,box1->frame_vector[i3][1]-y0);) + + /* check if upper left and lower right point are joined directly */ + dbg[0]=d=line_deviation(box1,i1, aa[2][3]); + /* check if lower left and lower left point are joined directly */ + dbg[1]=d=line_deviation(box1, aa[1][3],i1); + MSG( fprintf(stderr," i1-a2 %d a1-i1 %d",dbg[0],dbg[1]); ) + if (dbg[0] > sq(1024/4)) Break; + if (dx>4 && dbg[1] > sq(1024/4)) ad=97*ad/100; // d=0..2*sq(1024) + if (dx>4 && dbg[1] > sq(1024/3)) Break; // d=0..2*sq(1024) + // serif N has d=sq(1024/3)=116508 + + /* serach lowest right v, same frame? N-tilde etc.? */ + i2=nearest_frame_vector(box1,aa[3][3],aa[0][3], x1, y1-dy/8); + x=box1->frame_vector[i2][0]; + y=box1->frame_vector[i2][1]; + MSG( fprintf(stderr,"i2= %d (%d,%d) right v",\ + i2, box1->frame_vector[i2][0]-x0,box1->frame_vector[i2][1]-y0);) + if (y-y0 < 3*dy/8) Break; + if (x-x0 < 3*dx/8) Break; + // test H + if ( box1->frame_vector[i3][0]-box1->frame_vector[i1][0]> dx/4 + && box1->frame_vector[i3][1]-box1->frame_vector[i1][1]<=dy/8 + && y<=box1->frame_vector[i1][1]) Break; + /* check if upper left and lower right point are joined directly */ + dbg[2]=d=line_deviation(box1,i2, aa[0][3]); + /* check if lower right and lower right point are joined directly */ + dbg[3]=d=line_deviation(box1, aa[3][3],i2); + MSG( fprintf(stderr," i2-a0 %d a3-i2 %d",dbg[2],dbg[3]); ) + if (dbg[2] > sq(1024/4)) Break; + if (dbg[3] > sq(1024/4)) ad=97*ad/100; // serif N, ToDo: do it better + if (dbg[3] > sq(1024/3)) Break; + + if (abs((box1->frame_vector[i1][1]-y0) + -(y1-box1->frame_vector[i2][1]))>dy/8) ad=99*ad/100; /* ~ tu */ + if (abs(((y0+y1)/2-box1->frame_vector[i1][1]) + -(box1->frame_vector[i2][1]-(y0+y1)/2))>dy/8) ad=99*ad/100; /* ~ tu */ + if (box1->frame_vector[i2][0] + -box1->frame_vector[i1][0]<=dx/8) Break; /* nonsignificant distance */ + if (box1->frame_vector[i2][1] + -box1->frame_vector[i1][1]<=dy/8) ad=97*ad/100; /* too flat (ff,H) */ + if (box1->frame_vector[i2][1] + -box1->frame_vector[i1][1]<=dy/2) ad=99*ad/100; + MSG( \ + fprintf(stderr,"^v %d %d %d %d line deviation %d %d %d %d max %d %d",\ + box1->frame_vector[i1][0]-x0,box1->frame_vector[i1][1]-y0,\ + box1->frame_vector[i2][0]-x0,box1->frame_vector[i2][1]-y0,\ + dbg[0],dbg[1],dbg[2],dbg[3],sq(1024/4),sq(1024));) + ad=(100-(dbg[0]-sq(1024)/2)/sq(1024)/4)*ad/100; + ad=(100-(dbg[1]-sq(1024)/2)/sq(1024)/4)*ad/100; + ad=(100-(dbg[2]-sq(1024)/2)/sq(1024)/4)*ad/100; + ad=(100-(dbg[3]-sq(1024)/2)/sq(1024)/4)*ad/100; + + if (!hchar) ad=99*ad/100; + if ( gchar) ad=98*ad/100; // \sc N + Setac(box1,'N',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_h(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ + + // --- test h --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + // rewritten for vectors 0.42 + int i1, i2, i3, i4, i5, i6, i7, i8; // line derivation + corners + DBG( wchar_t c_ask='h'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the upper right end of the h */ + if (aa[3][2]d/2) Break; /* upper left end */ + if (aa[1][2]>d/2) Break; /* lower left end */ + if (aa[2][2]>d/2) Break; /* lowerright end */ +/* + type A B=italic ??? + 18 OOO + O O O + O O + O7OOO OOOO + O4 O O O + O O O O + O O O O O + 2O3 5O6 O OOO +*/ + i1=i8=aa[0][3]; + i2=i3=aa[1][3]; + i5=i6=aa[2][3]; + // check the bow from below + for (i4=i=i2;i!=i5;i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][1] + frame_vector[i4][1]) i4=i; // get next maximum + if (box1->frame_vector[ i][1]<=y0) break; // fatal! + } + if (box1->frame_vector[i4][1]-y0frame_vector[i4][1]18 ) + if( get_bw(dx-1-dx/3,dx-1,dy/6 ,dy/5 ,bp,cs,1) == 1 ) Break; + if( get_bw(dx-1-dx/3,dx-1,dy-1-dy/4,dy-1 ,bp,cs,1) == 0 ) Break; // s- + for( x=x0+dx/3;xp,cs,1) == 0 ) break; + if( x>=x1-dx/3 ) Break; + for(i=dy/4,y=y0+dy/3;y<=y1 && i;y++){ + if( num_cross(x0,x1 ,y,y, box1->p,cs) == 2 ) i--; + } if( i ) Break; + for(i=dy/4,y=y0;y<=y0+dy/2 && i;y++){ + if( num_cross(x0,x0+dx/2,y,y, box1->p,cs) == 1 ) i--; + } if( i ) Break; + // if( num_hole(x0, x1, y0 , y1 ,box1->p,cs,NULL) > 0 ) // could happen + if (sdata->holes.num > 0) + if (sdata->holes.hole[0].y0 > dy/3 + && sdata->holes.hole[0].y1 < dy-1-dy/3) Break; + // if( num_hole(x0, x1, y0+dy/3 , y1-dy/3 ,box1->p,cs,NULL) != 1 ) Break; // mini + if( loop(bp,dx-1,dy/3,dx,cs,0,LE)+dx/8 + < loop(bp,dx-1,dy/2,dx,cs,0,LE) + && loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)+dx/8 + < loop(bp,dx-1,dy/2,dx,cs,0,LE)) Break; // ~k Okt00 + i=loop(bp,0,dy-1-dy/4,dx,cs,0,RI); + if (i>1 && num_cross(x0,x0,y0+dy/8+2,y0+dy/2, box1->p,cs) == 1 ){ // fi fu + ad=(99-(1<p,cs) == 0 ) ad=97*ad/100; + if (num_cross(x0+dx/2,x0+dx/2,y0,y0+dy/8+2, box1->p,cs) == 1 ) ad=97*ad/100; + if (ad<1) break; + } + i =loop(bp,0,dy/4,dx,cs,0,RI); + i+=loop(bp,i,dy/4,dx,cs,1,RI)+1; + for ( ; i5*dy/8 ) { + ad=98*ad/100; // melted hi, li, but handwritten h + MSG(fprintf(stderr,"ad=%d",ad);) } + if( num_cross(x0,x0,y0+(dy+3)/8,y1,box1->p,cs) > 1 ) { + ad=98*ad/100; // melted fr + MSG(fprintf(stderr,"ad=%d",ad);) } + + i=loop(bp,dx-1,3*dy/4,dx,cs,0,LE); // melted "fr" for vertikal letters + if (i>dx/4 && loop(bp,dx-1-i,dy-1,dy,cs,1,UP)>dy/2) { + ad=94*ad/100; MSG(fprintf(stderr,"ad=%d",ad);) } + + i=loop(bp,dx-1,1+dy/16,dx,cs,0,LE); if (i 0 ) { + ad=95*ad/100; // melted fi + MSG(fprintf(stderr,"ad=%d",ad);) } + if (loop(box1->p,x1,y0+1+dy/16,dx,cs,0,LE)p,x1,y0 ,dx,cs,0,LE)p,x1,y0+1,dx,cs,0,LE)holes.num > 0) ad=97*ad/100; + if (box1->m2) { + if ( gchar) ad=98*ad/100; + if (!hchar) ad=97*ad/100; + } else ad=99*ad/100; + Setac(box1,'h',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_H(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,j1,d,x,y,ya,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test H --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='H'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1,dy/4 ,dy/4 ,bp,cs) != 2 + && num_cross(0,dx-1,dy/4-1,dy/4-1,bp,cs) != 2 ) Break; + if( num_cross(0,dx-1,3*dy/4 ,3*dy/4 ,bp,cs) != 2 + && num_cross(0,dx-1,3*dy/4+1,3*dy/4+1,bp,cs) != 2 ) Break; + if( loop(bp,0 ,dy/8,dx,cs,0,RI) + + loop(bp,dx-1,dy/8,dx,cs,0,LE)>dx/2 ) Break; // ~A + for( j1=0,i=1,y=y0+dy/10; yp,x0 ,y,dx,cs,0,RI) + +loop(box1->p,x1 ,y,dx,cs,0,LE); if( j>dx/2 ) i=0; if(j>j1)j1=j; } + if( !i ) Break; + for( i=1,y=dy/4; ydx/5 ) i=0; } + if( !i ) Break; // ~K Jul00 + for( i=0,ya=y=y0+dy/3; yp,x0 ,y,dx,cs,0,RI); + j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>i ) { i=j; ya=y; } } + if( i<=dx/2 ) Break; ya-=y0; + if( num_cross(0,dx-1,ya ,ya ,bp,cs) != 1 + && num_cross(0,dx-1,ya+1,ya+1,bp,cs) != 1 ) Break; /* Dec00 */ + for( y=ya; y 2 + && num_cross(0,dx-1,y+1,y+1,bp,cs) > 2 ) break; + if ( yp,cs,1) == 0 ) i=0; + } if( i ) Break; + for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ + if( get_bw( x, x,y1-dy/4,y1 ,box1->p,cs,1) == 0 ) i=0; + } if( i ) Break; + for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ + if( num_cross(x,x,y0+dy/8,y1-dy/8, box1->p,cs) == 1 ) i=0; + } if( i ) Break; + for(i=1,y=y0;y<=y0+dy/4 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) Break; + for(i=1,y=y1-dy/4;y<=y1 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) Break; + if( get_bw(x1-dx/8, x1 , y0, y0+dy/8,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0 , x0+dx/8, y1-dy/8, y1,box1->p,cs,1) != 1 ) Break; + i1=loop(bp,dx-1, dy/4,dx,cs,0,LE); if(i1>dx/2) Break; + i2=loop(bp,dx-1, dy/2,dx,cs,0,LE); if(i2i1+dx/8) Break; + i3=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); if(i3i2+dx/8) Break; + if(abs(i1+i3-2*i2)>dx/16+1) Break; + // test for thick tall N looking like a H + if( num_cross(x0,x1,y0,y1, box1->p,cs) < 2 ) Break; // sure N + i1=loop(bp, 0, dy/4,dx,cs,0,RI); + i1=loop(bp, i1, dy/4,dx,cs,1,RI); + i2=loop(bp, 0,dy-1-dy/4,dx,cs,0,RI); + i2=loop(bp, i2,dy-1-dy/4,dx,cs,1,RI); + i3=loop(bp,dx-1 ,dy-1-dy/4,dx,cs,0,LE); + i3=loop(bp,dx-1-i3,dy-1-dy/4,dx,cs,1,LE); + i =loop(bp, 0,dy/2+1+dy/8,dx,cs,0,RI); + i+=loop(bp, i,dy/2+1+dy/8,dx,cs,1,RI); + i =loop(bp, i,dy/2+1+dy/8,dx,cs,0,RI); + if (i6*i2 && 5*i3>6*i2 && i1>i2 && i3>i2 ) Break; + if( dx>8 ) + if ( loop(bp,dx-1, 3*dy/8,dx,cs,0,LE) + -loop(bp,dx-1, dy/8,dx,cs,0,LE)>dx/4 + && loop(bp,dx-1, 3*dy/8,dx,cs,0,LE) + -loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)>dx/4 ) Break; // ~K + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) Break; + if (sdata->holes.num != 0) Break; + if ( gchar) ad=99*ad/100; + if (!hchar) ad=98*ad/100; + Setac(box1,'H',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_k(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ + + // --- test k --------------------------------------------------- + for(ad=100;dx>2 && dy>3;){ // min 3x4 + // rewritten for vectors 0.43 + int d, i1, i2, i3, i4, i5, i6, i7, i8; // line derivation + corners + DBG( wchar_t c_ask='k'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the upper right end of the h */ + if (aa[3][2]d/2) Break; /* upper left end */ + if (aa[1][2]>d/2) Break; /* lower left end */ + if (aa[2][2]>d/2) Break; /* lowerright end */ +/* + type A B=italic ??? + 18 OOO + O O O + O O6 O + O7 OO O OO + O4OO OO OO + O OO O O + O OO O O O + 2O3 O5 O OOO +*/ + i1=i8=aa[0][3]; + i2=i3=aa[1][3]; + i5= aa[2][3]; + // check the bow from below + for (i4=i=i2;i!=i5;i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][1] + frame_vector[i4][1]) i4=i; // get next maximum + if (box1->frame_vector[ i][1]<=y0) break; // fatal! + } + if (box1->frame_vector[i4][1]-y0frame_vector[i4][1]frame_vector[i][0]frame_vector[i][0]dx/2) Break; + i3=loop(bp,0,dy/2+dy/4,dx,cs,0,RI); + if(abs(i1+i3-2*i2)>dx/16+1 || i1p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2,x1, y1-dy/3,y1 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/4,x1, y0 ,y0+3*dy/16,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-dx/4,x1, y0+dy/4,y1-dy/4,box1->p,cs,1) != 1 ) Break; //~1 + if( get_bw(x1-dx/4,x1, y1-dy/8,y1 ,box1->p,cs,1) != 1 ) Break; + if (sdata->holes.num > 0) + if (sdata->holes.hole[0].y0 > dy/4) Break; + // if( num_hole(x0,x1,y0+dy/4,y1,box1->p,cs,NULL) != 0 ) Break; + for(y=y0+1;yp,cs,1) == 0 ) break; + if( yp,cs,100)>50) i=0; + if( i ) Break; // no vertikal line! + + /* check for falling line in the lower left corner */ + for (j=x=0,y=5*dy/8;y<7*dy/8;y++) { + i= loop(bp,dx-1,y,dx,cs,0,LE); if(i>x) { x=i;j=y; } + } // x=dx/6 on fat k + if (x + loop(bp,dx-1-x,y,dx,cs,1,LE)/2 dx/2) + i =loop(bp,dx-1,dy-2,dx,cs,0,LE); if(i>dx/2) Break; + i+=loop(bp,dx-1-i,dy-1,dx,cs,1,LE)/2; + if( get_line(x,y,dx-1-i,dy-1,bp,cs,100)<60 ) Break; + + for(y=y0+dy/3;yp,cs)==2 ) break; + if( y==y1 ) Break; + if( + // num_hole(x0,x1 ,y0 ,y1 ,box1->p,cs,NULL)>0 // ~A happens! + sdata->holes.num > 0 ) + if (sdata->holes.hole[0].x1>dx-1-dx/4 + || sdata->holes.hole[0].y1>dy-1-dy/4 + || sdata->holes.hole[0].y0< dy/4) Break; + // if ( num_hole(x0,x1-dx/4,y0+dy/4,y1-dy/4,box1->p,cs,NULL)==0 ) Break; + i=loop(bp,0,dy-1,dx,cs,0,RI); + i=loop(bp,i,dy-1,dx,cs,1,RI); if (dx>8 && 4*i>3*dx) Break; // ~glued_tz + i =loop(bp,0,dy/4,dx,cs,0,RI); + if (i>dx/4 + && i+loop(bp,i,dy/4,dx,cs,1,RI)>dx/2 + && loop(bp, 0,0,dx,cs,0,RI)<=dx/4 + && loop(bp,dx-1,0,dx,cs,0,LE)>=dx/2 ) ad=90*ad/100; // divided Q + + if( 2*y0>(box1->m1+box1->m2) ) ad=99*ad/100; + + if ( gchar) ad=98*ad/100; + if (!hchar) ad=98*ad/100; + Setac(box1,'k',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_K(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,i1,i2,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad,ya,xa,yb,xb,yc,xc,yd,xd,ye,xe,yf,xf; /* tmp-vars */ + + // --- test K --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // updated 29 Mar 2000 perfect??? + DBG( wchar_t c_ask='K'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + for(y=dy/8;yp,x,y0,y1-y0,cs,0,DO); if (y>3*dy/4) { i=1;break; } + if (dy>15 && j>dy/8){ + j =loop(box1->p,x-1,y0+y-1,x1-x0,cs,0,LE)/2; + y+=loop(box1->p,x-j,y0+y-1,y1-y0,cs,0,DO)-1; + } + if(y>=dy/4) i=0; /* ok, found gap */ + } if( i ) Break; + for(y=0,x=x0+dx/4;x<=x1-dx/4;x++){ // lower h-gap + i=loop(box1->p,x,y1,dy,cs,0,UP); + /* on small chars bypass possible low left serifs */ + if (i>0) { i2=loop(box1->p,x-1,y1-i-1,dy,cs,0,UP); + if (i2>1) i+=i2-1; } + if (i>y) { y=i; i1=x; } + } if( y<=dy/8 ) Break; if (yp,cs) == 2 ) i=0; + } if( i ) Break; + for(i=1,y=y0;y<=y0+dy/4 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) Break; + if( dx<10 ){ + for(i=1,y=y0+dy/3;y<=y1-dy/3 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 1 ) i=0; + } if( i ) Break; + } + for(i=1,y=y1-dy/4;y<=y1 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) Break; + if( get_bw(x1-dx/3,x1,y0,y0+dy/8,box1->p,cs,1) != 1 ) Break; // ~k + if( dy>16 + && loop(bp,0, dy/4,dx,cs,0,RI) + +loop(bp,0,3*dy/4,dx,cs,0,RI) + <2*loop(bp,0, dy/2,dx,cs,0,RI)-2-dx/32 ) Break; // ~X + + i=loop(box1->p,x1,y0+ dy/4,x1-x0+1,cs,0,LE); if(i>dx/2) Break; + j=loop(box1->p,x1,y0+ dy/2,x1-x0+1,cs,0,LE); + x=loop(box1->p,x1,y0+3*dy/8,x1-x0+1,cs,0,LE); if(x>j) j=x; + if(j<=i ) Break; i=j; + j=loop(box1->p,x1,y1-dy/4,x1-x0+1,cs,0,LE); if(j>=i ) Break; + // out_x(box1); // detailed analysis + // + // a d <= that are main points of K + // | / + // b/e + // | \ . + // c f + ya= dy/4;xa=loop(bp,0,ya,dx,cs,0,RI);xa+=loop(bp,xa,ya,dx,cs,1,RI)/2; + yc=dy-dy/4;xc=loop(bp,0,yc,dx,cs,0,RI);xc+=loop(bp,xc,yc,dx,cs,1,RI)/2; + yb=dy/2; xb=dx-1-loop(bp,dx-1,dy/2,dx,cs,0,LE); + for(yd=ye=yf=xe=y=i=0,xf=xd=dx;yxe){ xe=x;ye=dy/2+y; } + x =loop(bp,dx-1,dy/2-y,dx,cs,0,LE); if(x>xe){ xe=x;ye=dy/2-y; } +#if 0 // removed v0.2.4a2 + x =loop(bp,0 ,dy/2+y,dx,cs,0,RI); // middle left border + x+=loop(bp,x ,dy/2+y,dx,cs,1,RI); // test 2nd cross + x+=loop(bp,x ,dy/2+y,dx,cs,0,RI); if(x8 ){ // example szaka0103 + if( xe>5*dx/8 || xb>5*dx/8 ) Break; // ~{\it n} + i=loop(bp,xb,yb,xb,cs,1,LE); // thick center? see font22 + if( get_line2(xb,yb,xd,yd,bp,cs,100)<95 ) // right up + if( get_line2(xb-i/2,yb,xd,yd,bp,cs,100)<95 ) Break; + if( get_line2(xe,ye,xf,yf,bp,cs,100)<95 ) Break; // right down + xe+=loop(bp,xe,ye,dx,cs,1,RI); if( xe>=xf ) Break; // ~{\it n} + } else { + if( dy<16 && !hchar ) Break; + if( loop(bp,0,1,dy,cs,1,DO)<=3*dx/4 + && loop(bp,1,1,dy,cs,1,DO)<=3*dx/4 + && loop(bp,2,1,dy,cs,1,DO)<=3*dx/4 ) Break; // ~x + } + if (loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE)<=dx/8){ + ad=99*ad/100; /* broken B ? */ + if (sdata->holes.num > 0) + if (sdata->holes.hole[0].y1 < dy-1-dy/3) Break; + // if( num_hole(x0,x1,y0,(y0+2*y1)/3,box1->p,cs,NULL)>0) Break; // broken B + } + if(box1->m3 && !hchar) ad=99*ad/100; + if(box1->m3 && gchar) ad=99*ad/100; + // printf(" ok xe=%d",xe); + Setac(box1,'K',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_f(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + (*aa)[4]=sdata->aa, /* the for line ends, (x,y,dist^2,vector_idx) */ + ab[8][4], /* special points (x,y,dist^2,vector_idx) */ + ad; /* tmp-vars */ + /* x=mindist_to_a y=0 "t" + 0>..$$. 0>..$$ 0>..$$ end right bow a--..$$ a--.$7. y>0 "f" + 1>.$..$ 1>.$.. 1>.$$$ start right bow .$7. .$.. + .@... .@.. 2>.@@. start upper end .@.. .@.. + 2>.$... 2>.$.. 3>$$$$ crossing bar .$.. $$$. + 3>$@$$. 3>$@$. $@@$ $@$. .@.. + 4>.$... 4>.$.. 4>.$$. lower end .$.. .$.. + .@... .@.. .@@. .@.. .@.. + .@... .@.. .@@. .@.. .@.. + 5>.$... 5>.$.. 5>.$$. lower start .$.. .$.. + 6>..... 6>$... 6>.... optional left bow + */ + // --- test f like t --------------------------------------------------- + for(ad=d=100;dx>2 && dy>5;){ // sometimes no hchar! + // rewritten for vectors 0.43 + int d, i1, i2, i3, i4, i5, i6, i7, i8, i9; // line derivation + corners + DBG( wchar_t c_ask='f'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the upper right end of the h */ + if (aa[3][2]>d/2) Break; /* [2] = distance, ~BCDEF... */ + if (aa[0][2]>d ) Break; /* upper left end */ +/* + 9 + OOO + O 7 O8 + O6 + 1OOOO5 + O4 + O + 2O3 + OOOOO +*/ + i1=nearest_frame_vector(box1,aa[0][3],aa[1][3],x0-dx/2,(5*y0+3*y1)/8); + /* we need i for 4x6 font, where left side of h-bar is near (x0,y1) */ + i =aa[1][3]; if (box1->frame_vector[i][1]frame_vector[i2][0]-x0>dx/2) Break; // ~3 + i =nearest_frame_vector(box1, aa[0][3], i2, x1+2*dx, (y0+y1)/2); + // MSG(fprintf(stderr,"i %d",i);) + if (box1->frame_vector[i ][0] + -box1->frame_vector[i9][0]>dx/8) Break; // ~3 + + if( (box1->dots) ) Break; // Bold-face is gchar + if (dy<=box1->m3-box1->m2+1) Break; + for(x=0,j=y=2+(3*dy+4)/32;y<=5*dy/8;y++){ // upper cross line min=2 + i=loop(bp,0,y,dx,cs,0,RI); if( y>dy/4 && i>5*dx/8 ) break; + i=loop(bp,i,y,dx,cs,1,RI); if( i>x ) { x=i;j=y; } + if( y<3*dy/4 && y>dy/4 + && num_cross(0,dx-1,y ,y ,bp,cs) != 1 + && num_cross(0,dx-1,y+1,y+1,bp,cs) != 1 // against noise + ) break; + } if( y<=5*dy/8 ) Break; y=j;// if( y>dy/2 || ydy/8 + && num_cross( 0, (dx+1)/2,i,i,bp,cs) > 0 + && num_cross((dx+1)/2,dx-1,i,i,bp,cs) > 0 ) Break; // ~Y + + if (loop(bp,3*dx/4, 0,dy,cs,0,DO)>dy/8 + && loop(bp,3*dx/4-1,0,dy,cs,0,DO)>dy/8) Break; // upper bow + i=3*dy/4; if (box1->m3 && i>=box1->m3) i=box1->m3-1; + if (num_cross(0,dx-1,i,i,bp,cs)!=1) Break; + + // the middle bar appear in a wide vertical range, get part below + for (i1=dx,i2=y,j=y+1;jframe_vector[i3][0]-x0,box1->frame_vector[i3][1]-y0);) + ab[7][0]=box1->frame_vector[i3][0]; + ab[7][1]=box1->frame_vector[i3][1]; + ab[7][3]=i3; + if (ab[7][1]-y0<=dy/16) ad=95*ad/100; // ~t + // because of the dx,dy scaling the horiz. bar could be nearer to (x1,y0) + // as the upper right end of the "t" + if (aa[3][0]-x0>3*dx/4 && aa[3][1]-y0>3*dy/16) ad=99*ad/100; // ~t + + + j=loop(bp,0,dy/8,dx,cs,0,RI); // if j>dx/2 we have italic f + if ((2*x(j+dx/4)) break; + if (iloop(bp,0, 1,dx,cs,0,RI) ) Break; // ~X + + i=y;j=1; // j used as flag + if( num_cross(0,dx-1,0,0,bp,cs)==1 && hchar) //~r + if( num_cross(0,dx-1,dy-1,dy-1,bp,cs)!=1 + && num_cross(0,dx-1,dy-2,dy-2,bp,cs)!=1 ) Break; // ~* etc. + // check for upper bow to right + for(y=1;j && y=cs || dx<7) && getpixel(bp,x+1,y )>=cs + && getpixel(bp,x ,y-1)< cs && getpixel(bp,x+1,y-1)< cs ) + { j=0;break; } + } if(j) ad=98*ad/100; // not detected + + // if( num_hole (x0 , x1 , y0, y1,box1->p,cs,NULL) != 0 ) Break; // ~e + if (sdata->holes.num != 0) Break; // ~e + for(i1=i2=dx,y=7*dy/8;yi2+dx/4) Break; // ~t ~e + if(i1>i2+1) ad=96*ad/100; // ~t ~e + if( loop(bp,0,3*dy/4,dx,cs,0,RI)5 && !hchar) + if( loop(bp,dx-1,dy/2,dx,cs,0,LE)>3*dx/4 ) + if( loop(bp,dx-1,dy-1,dy,cs,0,UP)8 ) + if( loop(bp, 0,2*dy/3 ,dx,cs,0,RI)>2*dx/3 + || loop(bp, 0,2*dy/3-1,dx,cs,0,RI)>2*dx/3 ) + if( loop(bp,dx-1, dy/4 ,dx,cs,0,LE)>2*dx/3 ) Break; // ~5 ~S + + if (!hchar) + if ( get_bw(x0+dx/8,x0+dx/8,y0+dy/4,y1-dy/16,box1->p,cs,2) == 0 + && num_cross(x1-dx/4,x1-dx/4,y0,y1,box1->p,cs)!=2 + && num_cross(x1-dx/8,x1-dx/8,y0,y1,box1->p,cs)!=2 ) Break; // ~r + + if (dy>15) + if( num_cross(x0,x1,y1-dy/4,y1-dy/4,box1->p,cs)>1 + && num_cross(x0,x1,y0+dy/4,y0+dy/4,box1->p,cs)>1 ) Break; // ~H + + if( dx>4 ) + if( loop(bp,dx-1 ,3*dy/4,dx,cs,0,LE)- + loop(bp,0 ,3*dy/4,dx,cs,0,RI)>dx/5+1 + && loop(bp,dx-1-dx/8,dy-1 ,dy,cs,0,UP)=dx/5+1) ad=98*ad/100; // ~E + i=loop(bp,dx/8,0,dy,cs,0,DO); + if (idy/2) { + ad=98*ad/100; // ~E, could also be a "f" with big serifs + MSG(fprintf(stderr,"ad=%d",ad);) } + if (!gchar) { ad=98*ad/100; + MSG(fprintf(stderr,"ad=%d",ad);) } + } + i = loop(bp,dx-1 ,3*dy/4,dx ,cs,0,LE)/2; + if (loop(bp,dx-1-i , dy-1,dy/2,cs,0,UP)1 + && loop(bp,0, 0,dy/4,cs,0,DO)p,cs,2) == 0) { // white pixels? + ad=98*ad/100; // F + MSG(fprintf(stderr,"ad=%d",ad);) } + + if (!hchar) ad=ad*98/100; // d*=100;d/=128 // not 100% ! + if (box1->m4>0 && gchar && ad<99 && + 8*box1->y1 >= box1->m4*7+box1->m3) ad++; + Setac(box1,'f',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_bB(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test B --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='B'; ) + if (sdata->holes.num < 2) Break; /* tolerant against a tiny hole */ + for(i=1,y=y0;yp,cs,1) != 1 ) i=0; + if( !i ) Break; + for(i=1,y=y1-dy/2;yp,cs,1) != 1 ) i=0; + if( !i ) Break; + if( get_bw(x1,x1 , y0 , y0 ,box1->p,cs,1) == 1 ) Break; + if( num_cross(x0+dx/2, x0+dx/2,y0,y1 ,box1->p,cs) != 3 ) + if( num_cross(x1-dx/3, x1-dx/3,y0,y1 ,box1->p,cs) != 3 ) Break; + /* --- detect center of lower hole --- */ + y = loop(box1->p,x0+dx/2,y1 ,dy,cs,0,UP); if (y>1+dy/8) Break; + y+= loop(box1->p,x0+dx/2,y1-y,dy,cs,1,UP); if (y>dy/3) Break; + y=y1-y-loop(box1->p,x0+dx/2,y1-y,dy,cs,0,UP)/2; if (yp,x0,y0+ y ,dx,cs,0,RI) + > loop(box1->p,x0,y0+dy/4,dx,cs,0,RI)+dx/32 ) + if( get_bw(x0,x0,y0,y0,box1->p,cs,1) == 0 ) + if( get_bw(x0,x0,y1,y1,box1->p,cs,1) == 0 ) Break; // ~8 + i1=loop(box1->p,x0,y0+dy/4,dx,cs,0,RI); + i2=loop(box1->p,x0,y0+dy/2,dx,cs,0,RI); + i =loop(box1->p,x0,y0+dy/2-dy/ 8,dx,cs,0,RI); if(i>i2) i2=i; + i =loop(box1->p,x0,y0+dy/2-dy/16,dx,cs,0,RI); if(i>i2) i2=i; + i3=loop(box1->p,x0,y1-dy/4,dx,cs,0,RI); + if(dy>16 && i3p,x0,y0+ 1 ,dx,cs,0,RI) + >= loop(box1->p,x0,y0+ 3 ,dx,cs,0,RI)+dx/32 ) + if( loop(box1->p,x0,y0+ 0 ,dx,cs,0,RI) + > loop(box1->p,x0,y0+ 3 ,dx,cs,0,RI)+dx/32 ) + if( loop(box1->p,x0,y1- 0 ,dx,cs,0,RI) + > loop(box1->p,x0,y1- 3 ,dx,cs,0,RI)+dx/32 ) + if( loop(box1->p,x0,y1- 1 ,dx,cs,0,RI) + > loop(box1->p,x0,y1- 3 ,dx,cs,0,RI)+dx/32 ) Break; // ~8 Aug00 + } + + if (sdata->holes.num != 2) Break; + if (sdata->holes.hole[0].y0 < y-1 + && sdata->holes.hole[1].y0 < y-1 ) Break; + if (sdata->holes.hole[0].y1 > y+1 + && sdata->holes.hole[1].y1 > y+1 ) Break; + // if( num_hole(0,dx-1,0 ,y+1 ,bp,cs,NULL) != 1 ) Break; + // if( num_hole(0,dx-1,y-1,dy-1,bp,cs,NULL) != 1 ) Break; + // out_x(box1); + + for( x=dx,y=dy/6; yp,x0,y0+y,dx,cs,0,RI); if( i>x+dx/9 ) break; + if(ix )break; + } if( yx) x=i; // allow dust + i=loop(bp,0,dy/2+1,dx,cs,0,RI); if (i>x) x=i; + if ( loop(bp,0, dy/8,dx,cs,0,RI) + +loop(bp,0,7*dy/8,dx,cs,0,RI) > 2*x+1 ) Break; // not konvex! + + if(!hchar){ // ~ fat_a + ad=99*ad/100; + x =loop(bp,0,dy/4,dx,cs,0,RI); + if(loop(bp,0,dy/2,dx,cs,0,RI)>x+dx/8) ad=97*ad/100; + } + + if ( (!hchar) && (dx<=10 || dy<=10) ) ad=97*ad/100; // hchar or good_quality + if (gchar) ad=99*ad/100; + Setac(box1,'B',ad); + break; + } + // --- test b --------------------------------------------------- + for(ad=d=100;dx>3 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='b'; ) + if (sdata->holes.num < 1) Break; /* tolerant against a tiny hole */ + for(y=y0;yp,cs,1) != 1 ) Break; + if(yp,cs,1) != 1 ) Break; + if( get_bw(x1- dx/2, x1 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1- dx/3, x1 , y0 , y0+dy/5,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-4*dx/9, x1 , y0+dy/5, y0+dy/5,box1->p,cs,1) == 1 ) Break; + if( num_cross(x0,x1,y0+dy/4 ,y0+dy/4 ,box1->p,cs) > 1 ) // & + if( num_cross(x0,x1,y0+dy/4-1,y0+dy/4-1,box1->p,cs) > 1 ) + if( dy<16 || + num_cross(x0,x1,y0+dy/5 ,y0+dy/5 ,box1->p,cs) > 1 ) Break; // fat b + for(i=j=0,y=dy/2;yholes.num != 1) Break; + if (sdata->holes.hole[0].y0 < dy/4) Break; + if ((sdata->holes.hole[0].y1-sdata->holes.hole[0].y0+1) + *(sdata->holes.hole[0].x1-sdata->holes.hole[0].x0+1)*16 + < dx*dy) ad=90*ad/100; // hole to small + if( num_hole( x0, x1 , y0+dy/4, y1,box1->p,cs,NULL) != 1 ) Break; + i=loop(bp,dx-1,dy-1 ,dx,cs,0,LE); + j=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); if(j>i) Break; + if (!hchar) ad=99*ad/100; + if ( gchar) ad=99*ad/100; + Setac(box1,'b',ad); + if (ad>=100) return 'b'; + break; + } + return box1->c; +} + +static wchar_t ocr0_dD(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,d,x,y,ya,yb,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test D --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='D'; ) + if (sdata->holes.num < 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 ,x0+dx/3,y0+dy/2,y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/3,x1 ,y0+dy/2,y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1 ,x1 ,y0 ,y0+dy/16,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-dx/2,x1 ,y0+dy/4,y0+dy/4 ,box1->p,cs,1) != 1 ) Break; + if( num_cross(x0+dx/2,x0+dx/2,y0 ,y1 ,box1->p,cs) != 2 ) + if( num_cross(x1-dx/3,x1-dx/3,y0 ,y1 ,box1->p,cs) != 2 ) Break; + if( num_cross(x0 ,x1 ,y0+dy/3,y0+dy/3,box1->p,cs) != 2 ) Break; + if( num_cross(x0 ,x1 ,y1-dy/3,y1-dy/3,box1->p,cs) != 2 ) Break; + if (sdata->holes.num != 1) Break; + if (sdata->holes.hole[0].y0 > dy/3) Break; + if (sdata->holes.hole[0].y1 < dy-1-dy/3) Break; + // if( num_hole (x0 ,x1 ,y0 ,y1 ,box1->p,cs,NULL) != 1 ) Break; + // test if left edge is straight + for(x=0,y=bp->y-1-dy/8;y>=dy/5;y--){ + i=loop(bp,0,y,x1-x0,cs,0,RI); + if( i+2+dx/16<=x ) break; + if( i>x ) x=i; + } + if (y>=dy/5 ) Break; + /* test if right edge is falling */ + for(x=dx,y=0;yx-1,y,x1-x0,cs,0,LE); + if( i>x+dx/16 ) break; + if( iy-1;y>2*dy/3;y--){ + i=loop(bp,bp->x-1,y,x1-x0,cs,0,LE); + if( i>x+dx/16 ) break; + if( i2*dy/3 ) Break; + if( loop(bp,dx-1,dy-1 ,dx,cs,0,LE) <= + loop(bp,dx-1,dy-2-dy/16,dx,cs,0,LE) ) Break; // P + + y=loop(bp,dx/2,dy-1,dy,cs,0,UP)-1; if (dy>16) y/=2; + if ( y>=dy/16 ) { y-=dy/16; + if (get_bw(dx/2,dx-1,dy-1-y,dy-1-y,bp,cs,1)==1) Break; // ~A + } + + ya=loop(bp, 0,dy-1,dy,cs,0,UP); + yb=loop(bp,dx/16+1,dy-1,dy,cs,0,UP); + if( yady/16 && ya>yb ) Break; // ~O + + if ( loop(bp, dx/2, 0,dy,cs,0,DO) + -loop(bp, dx/2,dy-1,dy,cs,0,UP) > dy/8 ) ad=97*ad/100; // ~b + + + + if (loop(bp, 0, 0,dx,cs,0,RI)>=dx/2 + && loop(bp,dx-1,dy-1,dx,cs,0,LE)>=dx/2 + && loop(bp, 0,dy/2,dx,cs,0,RI)< 2 ) ad=96*ad/100; // thin O + + if(box1->dots) ad=ad*94/100; + if ( gchar) ad=99*ad/100; + if (!hchar) ad=99*ad/100; + Setac(box1,'D',ad); + break; + } + // --- test d --------------------------------------------------- + for(d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='d'; ) + ad=100; + if (sdata->holes.num < 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 , x0+dx/2, y1-dy/6, y1-dy/9,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0 , x0+dx/2, y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x1 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/4, x1 , y0+dy/8, y0+dy/8,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2, y1-dy/4, y1 ,box1->p,cs,1) != 1 ) Break; + if(dy>19) + if( get_bw(x0 , x0+dx/3, y0 , y0+dy/5,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0 , x0+dx/3, y0 , y0+dy/6,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0 , x0+dx/4, y1-dy/8, y1 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2-1,x0+dx/2,y1-dy/8, y1 ,box1->p,cs,1) != 1 ) Break; // ~"A + if( loop(bp,bp->x-1, bp->y/4,x1-x0,cs,0,LE) > + loop(bp,bp->x-1,3*bp->y/4,x1-x0,cs,0,LE)+1 ) Break; + for(i=dx/8+1,x=0;x 3 ) i++; // ~al + } if( i ) ad=98*ad/100; + for(i=dy/8+1,y=0;yholes.num<1) Break; + if (sdata->holes.num>1) { + if (dx<6) Break; ad=95*ad/100; } // glued j above 8 (4x6 sample) + MSG(fprintf(stderr,"hole[0].y0,y1= %d %d",sdata->holes.hole[0].y0,sdata->holes.hole[0].y1);); + if ( sdata->holes.hole[0].y0 < dy/4 ) Break; + if (dy-sdata->holes.hole[0].y1 > dy/4+1) Break; // glued et + // if( num_hole(x0 , x1 , y0+dy/4 , y1 ,box1->p,cs,NULL) !=1 ) Break; + if( num_cross(0 ,dx-1,dy-1-dy/4,dy-1-dy/4,bp,cs) != 2 ) { // glued al + if (dy>15) { Break; } else ad=96*ad/100; + } + if (!hchar) ad=98*ad/100; + if ( gchar) ad=99*ad/100; + Setac(box1,'d',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_F(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test F --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx + DBG( wchar_t c_ask='F'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0+dx/2,x0+dx/2,y0,y0+dy/8,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0,x0+dx/4,y1-dy/4,y1-dy/4,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0,x0+dx/2,y0+dy/4,y0+dy/4,box1->p,cs,1) != 1 ) Break; + + for (x=0,y=0;yx) x=j; + } if (ydx/2 ) i=0; } + if( i ) Break; + + x=loop(bp,0,dy-1-dy/4,dx,cs,0,RI); + x=loop(bp,x,dy-1-dy/4,dx,cs,1,RI); // strichdicke + for( i=1,y=dy/3; ydx/3 && ((j>2*x && dx>8) || j>x+1)) i=0; } + if( i ) Break; + + y=dy/8; if (y<1) y=1; + for( i=1; y=dx/3) { i=0; break; } + } + if( i ) Break; + + // check for vertical line on left side + for(i=1,y=1;y<=dy/2 && i;y++) + if( get_bw(0,dx/2,y,y,bp,cs,1) != 1 ) i=0; + if( !i ) Break; + + for(i=1,y=dy/2;ydx/8 // no serif + || loop(bp, 0, dy-3,dx,cs,0,RI)<1) break; + ad=99*ad/100; + } + if( get_bw(dx-1-dx/4,dx-1,dy-1-dy/4,dy-1,bp,cs,1) == 1 ) Break; // ~E + if( get_bw(dx-1 ,dx-1,0 ,dy/3,bp,cs,1) != 1 ) Break; + + if( loop(bp,0, bp->y/4,dx,cs,0,RI) < + loop(bp,0,3*bp->y/4,dx,cs,0,RI)-1 ) Break; + // if( num_hole(x0 , x1 , y0 , y1 ,box1->p,cs,NULL) >0 ) Break; + if (sdata->holes.num > 0) Break; + for(i=0,x=dx/4;xy/4,dx,cs,0,RI)-1; + if (i>=0 && loop(bp,dy-1,i,dy,cs,0,UP)<=3*dy/4 ) ad=ad*98/100; + + // check for screen font P + i= loop(bp,bp->x-1,bp->y/4,dx,cs,0,LE); + if (i<1) { + j=i+loop(bp,bp->x-1-i,bp->y/4, dx ,cs,1,LE); + j= loop(bp,bp->x-1-j,bp->y/4,3*dy/4,cs,0,DO); + if (j<=dy/2) { + i=loop(bp,bp->x-1,0,dx,cs,0,LE); + ad=ad*98/100; + if (i>dx/8) Break; + if (i) ad=98*ad/100; + } + } + + if (!hchar) if ((box1->m2-box1->y0)*8>=dy) { // ignore bad m1..4 + if ( num_cross(2*dx/3,2*dx/3,0,dy-1,bp,cs) < 2 ) ad=90*ad/100; // ~r + } + if (gchar) ad=99*ad/100; + Setac(box1,'F',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_uU(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test uU --------------------------------------------------- + // in Mitte so breit wie oben (bei V kontinuierlich schmaler) + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='u'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + for(y=y0+dy/4;yp,cs) < 2 ) break; + if( yi)i=y; if(y1) break; + } if( idy/2)?dx/8:0),y,y,bp,cs); + if( y1 ) i--; // ~{\it v} + if( y2) ) { i--; ad=90*ad/100; } + if( y>dy/2 && j!=1 ) { i--; ad=95*ad/100; } + } if( !i ) Break; + for(i=dy/16+1,y=dy/8;ydy/2 && (j<1 && j>2) ) i--; + if( yp,cs,1) != 1 ) i=0; + } if( i ) Break; + for(i=dx/4+1,x=x0+dx/3;x<=x1-dx/3 && i;x++){ + if( get_bw( x, x,y0+dy/3,y1-dy/3,box1->p,cs,3) != 2 ) i--; + } if( !i ) Break; + for(i=1,x=x0+dx/3;x<=x1-dx/3 && i;x++){ + if( get_bw( x, x,y1-dy/2,y1,box1->p,cs,3) == 2 ) i=0; + if( get_bw( x, x,y1-dy/3,y1,box1->p,cs,3) == 2 ) ad=98*ad/100; + } if( !i ) Break; + if( num_cross(0 ,dx/2, dy/4, dy/4,bp,cs)==2 + && num_cross(dx-dx/2,dx-1,dy-dy/4,dy-dy/4,bp,cs)==1 ) Break; // ~{\it v} + + i=loop(bp,0,dy-1-dy/16,dx,cs,0,RI); + j=loop(bp,0,dy-1-dy/8 ,dx,cs,0,RI); + if( i15) + if( loop(bp,dx-1,dy/16,dx,cs,0,LE) + > loop(bp,dx-1,dy/8 ,dx,cs,0,LE)+1+dx/32 ) Break; // ~bad 0 (thinn) + if( hchar && dy>7) + if( loop(bp, 0, dy-1,dx,cs,1,RI)==dx + && loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/16 + && loop(bp, 0,3*dy/4,dx,cs,0,RI)>dx/16 + && loop(bp,dx-1, dy/2,dx,cs,0,LE)>dx/16 + && loop(bp, 0, dy/2,dx,cs,0,RI)>dx/16 + ) Break; // melted ll + + i=loop(bp, 0,dy-2-dy/8,dx,cs,0,RI); + j=loop(bp,dx-1,dy-2-dy/8,dx,cs,0,LE); + if ( i>dx/4 && j>dx/4 && i+j>=dx/2) Break; // v + if (i+j>=dx/2) ad=97*ad/100; + + if ( num_cross(0,dx-1,dy/2,dy/2,bp,cs)!=2 ) ad=96*ad/100; // w + if ( loop(bp,dx/2,dy-1,dy,cs,0,UP)>0 ) ad=98*ad/100; // w + + if (ad==100) ad=99; // ToDo: only if lines.wt<100 + bc='u'; + if (gchar) ad=98*ad/100; + if (hchar) bc='U'; + if (box1->dots>0) ad=99*ad/100; + Setac(box1,bc,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_micro(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i2,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test \mu µ MICRO_SIGN -------------------------------------- + // in Mitte so breit wie oben (bei V kontinuierlich schmaler) + if( gchar && !hchar ) + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='u'; ) + if (sdata->holes.num > 1) break; /* tolerant against a tiny hole */ + for(y=y0+dy/8;ym3-dy/4;y++) + if( num_cross(x0,x1,y,y,box1->p,cs) < 2 ) break; + if( ym3-dy/4 ) break; + if( get_bw(dx/2,dx/2,3*dy/8,7*dy/8,bp,cs,1)==0 ) break; + if( get_bw(dx/2,dx-1,3*dy/8,7*dy/8,bp,cs,1)==0 ) break; + for(y=dy/2;y5*dx) break; + } if( y>=dy || 2*y>box1->m3+box1->m4) break; i2=y; + for(i=0,x=2*dx/8;xi)i=y; if(y1) break; + } if( im4-box1->m3)-dy/4 && i;y++){ // 12%+1 Fehler + j=num_cross(0,dx/2,y,y,bp,cs); + if( y1 ) i--; // ~{\it v} + if( y2) ) i--; + if( y>dy/2 && j!=1 ) i--; + } if( !i ) break; + for(i=dy/16+1,y=dy/8;ym4-box1->m3)-dy/4 && i;y++){ // 12%+1 Fehler + j=num_cross(dx-dx/2,dx-1,y,y,bp,cs); + if( y>dy/2 && (j<1 && j>2) ) i--; + if( yp,cs,1) != 1 ) i=0; + } if( i ) break; + for(i=dx/4+1,x=x0+dx/3;x<=x1-dx/3 && i;x++){ + if( get_bw( x, x,y0+dy/4,y1-dy/2,box1->p,cs,3) != 2 ) i--; + } if( !i ) break; + if( num_cross(0 ,dx/2, dy/4, dy/4,bp,cs)!=1 ) break; + if( num_cross(dx-dx/2,dx-1,dy-dy/2,dy-dy/2,bp,cs)!=1 ) break; + if( get_bw( (dx+2)/4,dx-1,dy-2-3*dy/16,dy-1,bp,cs,1) == 1 ) break; + if( num_cross(0,dx/4,dy-1,dy-1,bp,cs)!=1 ) break; + + Setac(box1,MICRO_SIGN,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_vV(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test v ------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='v'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + x=loop(bp,dx/2,0,dx,cs,1,RI)+dx/2; // be sure in the upper gap + y=loop(bp, x,0,(dy+1)/2,cs,0,DO)-1; // (x,y) should be in the gap + if (x>3*dx/4 || yp,cs,1) != 1 ) Break; + if( get_bw(x0+x,x1,y0+y,y0+y,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+x,x0+x,y1-dy/2,y1, box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+x, x0+x ,y0, y0+dy/3,box1->p,cs,1) == 1 ) // it v? + if( get_bw(x0+x+1,x0+x+1,y0, y0+dy/3,box1->p,cs,1) == 1 ) Break; + + // UVW + if(((num_cross( 0,dx/2+1,dy/ 8,dy/ 8,bp,cs)!=1) + && (num_cross( 0,dx/2+1,dy/16,dy/16,bp,cs)!=1) // it v + && (num_cross(dx/2+1,dx -1,dy/ 8,dy/ 8,bp,cs)!=1)) /* () added on Sep00 */ + || ((num_cross( 0,dx-1,dy-1-dy/8,dy-1-dy/8,bp,cs)> 1) + && (num_cross( 0,dx-1,dy-1 ,dy-1 ,bp,cs)> 1)) ) Break; + // UV + if( get_bw(0 ,dx/8,dy-1-dy/6,dy-1,bp,cs,1)==1 ) Break; + if( get_bw(dx-1-dx/8,dx-1,dy-1-dy/6,dy-1,bp,cs,1)==1 ) Break; + if( loop(bp,0 ,dy/6 ,dx,cs,0,RI) + >=loop(bp,0 ,dy-1-dy/3,dx,cs,0,RI) && dy>6 ) Break; + if( loop(bp,0 ,dy-1-dy/3,dx,cs,0,RI) + >loop(bp,0 ,dy-1-dy/8,dx,cs,0,RI) + && loop(bp,dx-1,dy-1-dy/3,dx,cs,0,LE) + >loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE) ) Break; // better OR ? + if( loop(bp,0 ,dy-1-dy/3,dx,cs,0,RI) + >=loop(bp,0 ,dy-1-dy/8,dx,cs,0,RI) + && loop(bp,dx-1,dy-1-dy/3,dx,cs,0,LE) + >=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE) ) ad=99*ad/100; // font21 + if( loop(bp,dx-1,dy/6 ,dx,cs,0,LE) + >=loop(bp,dx-1,dy-1-dy/3,dx,cs,0,LE) && dy>6 ) Break; + x=loop(bp,0,dy-1,dx,cs,0,RI); // 3*x>dx changed to 2*x>dx May2001 JS + x=loop(bp,x,dy-1,dx,cs,1,RI); if ( dx>14 && 2*x>dx ) Break; // U + if( num_cross(0 ,dx/2, dy/4, dy/4,bp,cs)==2 + && num_cross(dx-dx/2,dx-1,dy-dy/4,dy-dy/4,bp,cs)==2 ) Break; // ~{\it u} + +#if 0 + // measure thickness of lower v + i=loop(bp, 0,dy-1-dy/16,dx,cs,0,RI) + +loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE); + j=loop(bp, 0,dy-1-dy/4 ,dx,cs,0,RI) + +loop(bp,dx-1,dy-1-dy/4 ,dx,cs,0,LE); + if( box1->m1 && hchar && dy>15 && j>=i-dx/32 ) Break; // ~Y +#endif + /* V has serifs only on upper site! Y also on bottom, check it. Okt00 */ + i=loop(bp, 0, 0,dx,cs,0,RI); + i=loop(bp, i, 0,dx,cs,1,RI); i1=i; // thickness + i=loop(bp, 0, 1,dx,cs,0,RI); + i=loop(bp, i, 1,dx,cs,1,RI); if(i>i1) i1=i; // thiggest + i=loop(bp, 0,dy/4,dx,cs,0,RI); + i=loop(bp, i,dy/4,dx,cs,1,RI); i2=i; + i=loop(bp, 0,dy ,dx,cs,0,RI); + i=loop(bp, i,dy ,dx,cs,1,RI); i3=i; // thickness + i=loop(bp, 0,dy-1,dx,cs,0,RI); + i=loop(bp, i,dy-1,dx,cs,1,RI); if(i>i3) i3=i; // thiggest + if( y0 < box1->m2 ) + if( i1-i2 > dx/32+2 + && i3-i2 > dx/32+2 ) Break; // ~serif_Y + + if( y0 < box1->m2 ) // uppercase V ? + if( i1-i2 < dx/32+2 ) /* no serif detected */ + if( num_cross(0,dx-1,dy-1-dy/4,dy-1-dy/4,bp,cs)==1 ){ + j=loop(bp, 0,dy-1-dy/4 ,dx,cs,0,RI); + j=loop(bp, j,dy-1-dy/4 ,dx,cs,1,RI); + if (jloop(bp,0 ,dy-1 ,dx,cs,0,RI) ) ad=96*ad/100; + + if (gchar) ad=99*ad/100; + bc='v'; + if( hchar ) bc='V'; + Setac(box1, bc, ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_rR(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test r ------- + for(ad=d=100;dy>3 && dx>1;){ // dy>dx, 4x6 font, dx=2 smallest prop-font + DBG( wchar_t c_ask='r'; ) + if (sdata->holes.num > 0 + && ( sdata->holes.hole[0].y1 > dy/2 // tiny hole in upper left + || sdata->holes.hole[0].x1 > dx/2 ) // is tolerated, ~Pp + ) Break; /* tolerant against a tiny hole */ + if( 2*dym3-box1->m1) Break; + + if( loop(bp,dx-1,dy/2,dx,cs,0,LE)<=dx/8 ) Break; + x= loop(bp,dx-1,dy/2,dx,cs,0,LE); if (x<=dx/2) ad=99*ad/100; // ~t + if (loop(bp,dx-1-x/2,0,dy,cs,0,DO)>dy/8) ad=99*ad/100; // ~t + if( dx>4 ) + if( loop(bp,dx-1,dy/2,dx,cs,0,LE)<=dx/8+2 ) Break; // ~v Jun00 + + i=dy-(dy+20)/32; // ignore dust on the ground + + for( y=4*dy/8; y3*dx/8) break; + i2= loop(bp,dx-1,y,dx,cs,0,LE); if(i1>i2) break; + if( (i1+(dx-i2 + -1))/2 >= 4*dx/8 ) break; // mass middle should be left + } + if (y5*dx/8 // not a C + && get_bw(dx-1-dx/8,dx-1,dy-1-dy/4,dy-1,bp,cs,1) ==1 ) Break; + + if( loop(bp, 0,5*dy/8,dx,cs,0,RI)<=dx/8 + && loop(bp,dx-1,5*dy/8,dx,cs,0,LE)>=5*dy/8 + && loop(bp,dx/2, dy-1,dy,cs,0,UP)<=dy/8 ) Break; // ~c + + if( loop(bp, 0,3*dy/8,dx,cs,0,RI) + > loop(bp,dx-1,3*dy/8,dx,cs,0,LE)+dx/8 ) { + if( loop(bp, 0, dy/8,dx,cs,0,RI)3*dx/4 ) Break; // ~i + if( loop(bp,0,dy/4,dx,cs,0,RI)>3*dx/8 // ~I + && get_bw(0,dx/8,0,dy/4,bp,cs,1) ==1 ) Break; + if( num_cross(0,dx-1,dy/2, dy/2 ,bp,cs)!=1 + && num_cross(0,dx-1,dy/2+1,dy/2+1,bp,cs)!=1 ) Break; // ~n 024a3 + + // itallic t is sometimes not high enough, look for v-like shape + for(y=3*dy/4;y1 ) ad=95*ad/100; // ~f + if( num_cross(dx/2 ,dx/2 ,0,dy-1,bp,cs)>2 + && num_cross(dx/2+1,dx/2+1,0,dy-1,bp,cs)>2 ) Break; // ~f + + if (box1->dots) ad=98*ad/100; /* could be modified latin2-r */ + if (hchar) ad=96*ad/100; + if (gchar) ad=97*ad/100; + Setac(box1,'r',ad); + break; // not 100% sure! + } + // --- test R --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='R'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( num_cross(x0,x1,y1-dy/8,y1-dy/8, box1->p,cs) < 2 ) Break; // ~P + if (loop(bp, dx/2, dy/4,dy,cs,0,DO)>dy/2) Break; // ~C + if (loop(bp, dx/2, 0,dy,cs,0,DO)>dy/8 + && loop(bp, dx/2,dy/16,dx,cs,0,RI)=16 ) Break; + for(i=1,y=y0+dy/8;y<=y1-dy/8 && i;y++){ // left v-line + if( get_bw(x0 , x0+dx/2,y, y,box1->p,cs,1) != 1 ) i=0; + } if( !i ) Break; + for(i=1,x=x0+3*dx/8;x<=x1-dx/4 && i;x++){ // upper h-line + if( get_bw( x, x, y0, y0+dy/4,box1->p,cs,1) != 1 ) i=0; + } if( !i ) Break; + for(y=0,x=x0+dx/4;x<=x1-dx/4;x++){ // lower h-gap + i=loop(box1->p,x,y1,dy,cs,0,UP); + /* on small chars bypass possible low left serifs */ + if (i>0) { i2=loop(box1->p,x-1,y1-i-1,dy,cs,0,UP); + if (i2>1) i+=i2-1; } + if (i>y) { y=i; i1=x; } + } if( y<=dy/8 ) Break; if (yp,cs) == 2 ) i=0; + } if( i ) Break; + for(i=1,y=y0;y<=y0+3*dy/8 && i;y++){ // upper 2 vert lines + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) Break; + for(i=1,y=y0+dy/3;y<=y1-dy/3 && i;y++){ // midle h line + if( num_cross(x0,x1,y,y, box1->p,cs) == 1 ) i=0; + } if( i ) ad=95*ad/100; /* sometimes there is a small gap */ + for(i=1,y=y1-dy/4;y<=y1 && i;y++){ // lower 2 vert lies + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) Break; + if( get_bw(x1-dx/3,x1,y0,y0+dy/4,box1->p,cs,1) != 1 ) Break; // pixel ru + x=loop(bp,dx-1, dy/4,dx,cs,0,LE); if(x>dx/2) Break; i=x; // ru + x=loop(bp,dx-1, dy/2,dx,cs,0,LE); if(x<=i ) Break; i=x; // rc + x=loop(bp,dx-1, 5*dy/8,dx,cs,0,LE); if(x>i ) i=x; + x=loop(bp,dx-1, 6*dy/8,dx,cs,0,LE); if(x>i ) i=x; + x=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); if(x>=i ) Break; // rd + + i1=loop(bp,0, dy/4,dx,cs,0,RI); // straight + i2=loop(bp,0, dy/2,dx,cs,0,RI); + i3=loop(bp,0,dy-1-dy/4,dx,cs,0,RI); if( abs(i1+i3-2*i2)>1+dx/16 ) Break; + if (dy>15) + if (loop(bp,dx-1, dy/2,dx,cs,0,LE)>=loop(bp,dx-1, dy-1,dx,cs,0,LE) + && loop(bp,dx-1,3*dy/16,dx,cs,0,LE)>=loop(bp,dx-1,dy/16,dx,cs,0,LE)+dx/8 ) Break; // ~ff + if (dy>7) + if (loop(bp,dx-1,dy-2 ,dx,cs,0,LE) + >loop(bp,dx-1,dy-2-dy/8,dx,cs,0,LE)) { + ad=98*ad/100; + if (loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE)==0 + && loop(bp,dx-1,dy-2-dy/8,dx,cs,0,LE)>0 ) Break; // broken B ?? + } + j=sdata->holes.num; + if (j != 1) { + i=num_hole (x0,x1,y0,y1-dy/3,box1->p,cs,NULL); + // j=num_hole (x0,x1,y0,y1 ,box1->p,cs,NULL); + if (i==0) ad=90*ad/100; /* some times there is a small gap */ + if (j>1 || j>i) Break; + } + if (sdata->holes.num < 1) ad=90*ad/100; + if (sdata->holes.num==1) + if (sdata->holes.hole[0].y1 > 3*dy/4) ad=95*ad/100; // alpha + + if (!hchar) ad=98*ad/100; + if ( gchar) ad=98*ad/100; + Setac(box1,'R',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_m(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,d,x,y,i1,i2,i3,i4,i5,hchar=sdata->hchar,gchar=sdata->gchar, + handwritten=0, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test m ------- + for(ad=d=100;dx>4 && dy>3;){ + DBG( wchar_t c_ask='m'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num > 0) ad=96*ad/100; + x =loop(bp,dx-1,dy/2,dx,cs,0,LE); if(3*x>dx) Break; // ~K + y=dy/2; + i=num_cross(0,dx-1,y ,y ,bp,cs); if (i!=3) + i=num_cross(0,dx-1,y+1,y+1,bp,cs); + if (i<3 && i>5) Break; // m ru rn, handwritten m + // im or glued.mm cut to nm + if (i>3) { ad=99*ad/100; MSG(fprintf(stderr,"ad=%d",ad);) } + for (i=0,y=dy-1-dy/8;y>dy/2;y--) { + i=num_cross(0,dx-1,y,y,bp,cs); if (i>2) break; + } if (i>3) Break; + for ( ;y>dy/2;y--) { + i=num_cross(0,dx-1,y,y,bp,cs); if (i!=3) break; + } if (i>5) Break; y++; i5=y; + if (y> dy/2) handwritten=10; + if (y>3*dy/4) handwritten=60; + /* @@............... + @@......,........ + @@,...@@@....@@@. + @@,,.@@@@..@@@@@, + @@@.@@@@@.@@@@@@, + @@;@@@@@@@@@;,@@, + @@@@@,.@@@@,,,@@@ <- i5 + ,@@@...;@@....@@@ + .@;...........,@@ + ...............@@ + i1 i2 i3 i4 + */ + x =loop(bp,0,y,dx ,cs,0,RI); if(x> dx/4) Break; // search 1st v-line + x+=loop(bp,x,y,dx-x,cs,1,RI); if(x> dx/2) Break; i1=x; // first gap + x+=loop(bp,x,y,dx-x,cs,0,RI); if(x>3*dx/4) Break; i2=x; // 2nd v-line + x+=loop(bp,x,y,dx-x,cs,1,RI); if(x>6*dx/8) Break; i3=x; // 2nd gap + x+=loop(bp,x,y,dx-x,cs,0,RI); if(x<5*dx/8) Break; i4=x; // 3th v-line + if (x>=dx) Break; // missing 3th v-line, ~W + MSG(fprintf(stderr,"y=%d x=%d %d %d %d",y,i1,i2,i3,i4);) + if( abs((i2-i1)-(i4-i3)) > 2+((i2-i1)+(i4-i3))/4 ) Break; // same gap width? rn + if( abs((i2-i1)-(i4-i3)) > 2+((i2-i1)+(i4-i3))/8 ) ad=98*ad/100; // same gap width? rn + // the same game for the lower part =>l1 l2 l3 l4 ??? + i =loop(bp,0,5*dy/8,dx,cs,0,RI); + i =loop(bp,i,5*dy/8,dx,cs,1,RI); + x =loop(bp,0,dy-dy/32-1,dx,cs,0,RI); + x =loop(bp,x,dy-dy/32-1,dx,cs,1,RI); + if( x > i+1 ) i=1; else i=0; /* looks like serif m, Okt00 */ + for(y=0,x=i1;xy) y=i; + } + if(yy) y=i; + } + if(y=dy/2 ) break; + if(xi4-i3+dx/16){ + for(y=0,x=(i1+i2)/2;xy ) y=i; if( 2*i3 ) Break; // melted WT + + x=loop(bp,dx-1,dy/2,dx,cs,0,LE); + if (x>2 && loop(bp,dx-1-x/2,0,dy,cs,0,DO)dy/2) Break; // N + + // {\it m} + if( loop(bp,1, dy/4,dx,cs,0,RI) + >loop(bp,0,7*dy/8,dx,cs,0,RI) ) + Setac(box1,'m',98*ad/100); + + if (handwritten<10){ + x =loop(bp,0,dy/4,dx,cs,0,RI); + x+=loop(bp,x,dy/4,dx,cs,1,RI); + for( ;x=dy/4) ad=99*ad/100; + if (i>(dy+2)/4) ad=95*ad/100; + if (3*i>dy) Break; + } + if(xdots) ad=99*ad/100; + Setac(box1,'m',ad); + if (ad>=100) return 'm'; + break; + + } + return box1->c; +} + +static wchar_t ocr0_tT(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,i1,i2,i3,i4,j,d,x,y,yb,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test T --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // dx>1 dy>2*dx + DBG( wchar_t c_ask='T'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + // upper horizontal line + i1= loop (bp, dx/8,0,dy,cs,0,DO); // left side + i2= loop (bp,dx-1-dx/8,0,dy,cs,0,DO); // right side + i3= loop (bp, dx/8,i1,dy,cs,1,DO); // left side + i4= loop (bp,dx-1-dx/8,i2,dy,cs,1,DO); // right side + if (i1>dy/4 || i2>dy/4) Break; + for (x=dx/8;xi1+dy/8 && i>i2+dy/8) break; + if (idx+1 || i+j>=dx || i+j/23*x) break; //~I + } if( y3*dx/4) Break; // ~7 + i+= loop(bp,i ,dy/4,dx,cs,1,RI);if(i>3*dx/4) Break; + + if( num_cross(0,dx-1, dy-1, dy-1,bp,cs) != 1 + && num_cross(0,dx-1, dy-2, dy-2,bp,cs) != 1 ) Break; + if( num_cross(0,dx-1,2*dy/3,2*dy/3,bp,cs) != 1 + && num_cross(0,dx-1,2*dy/3,2*dy/3,bp,cs) != 1 ) Break; + if (box1->m3 && 2*y1>box1->m3+box1->m4 + && loop(bp,0, 0,dy/2,cs,0,DO)>=dy/4 + && loop(bp,0,dy-1,dy ,cs,0,UP)<=dy/2) ad=96*ad/100; // ~J + if (gchar) ad=98*ad/100; + if( loop(bp,0,dy-1,dx,cs,0,RI)<=dx/8) ad=99*ad/100; // ~J + i = loop(bp,0,dy/2,dx,cs,0,RI); + j = loop(bp,i,dy/2,dx,cs,1,RI); + if( 2*i>=dx || 2*(dx-j-i)=100) return 'T'; + break; + } + // --- test t --------------------------------------------------- + // written t can look like a + or even with missing right side + // smallest t found in win-screenshot (prop-font) dx=2 + for(ad=d=100;dx>1 && dy>=box1->m3-box1->m2-1;){ // sometimes no hchar! + DBG( wchar_t c_ask='t'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (dy<=box1->m3-box1->m2+1) ad=96*ad/100; // bad line detection? + for(x=0,yb=j=y=dy/32+3*dy/16;y<5*dy/8;y++)if(y>0){ // upper cross line + i=loop(bp,0,y,dx,cs,0,RI); + i=loop(bp,i,y,dx,cs,1,RI); if( i>x ) { x=i;yb=j=y; } // hor. line + i=num_cross(0,dx-1,y ,y ,bp,cs); + j=num_cross(0,dx-1,y+1,y+1,bp,cs); if (i>2 && j>2) break; + if( y<11*dy/16 + && num_cross(0,dx-1,y ,y ,bp,cs) != 1 + && ( num_cross(0,dx-1,y+dy/8,y+dy/8,bp,cs) != 1 || dy<13) // against noise + ) break; + } if( y<4*dy/8 ) Break; + if (dy>12 && x>4 && x>dx/2 && yb<=(dy+4)/8) + if ( loop(bp,dx-1-3*x/4,yb,dy,cs,1,UP) + <=loop(bp,dx-1-1*x/4,yb,dy,cs,1,UP)+1 ) + if ( loop(bp,0 ,dy/2,dy,cs,1,UP)>dx/8 ) Break; // ~C + + if (x=dx && 9*dx>=8*dy) { ad=99*ad/100; } // + + + i=loop(bp,dx-1,0,dx,cs,0,LE); + for(y=0;y1) break; i=j; + } + if( yi ) break; + if( y==yb ) break; + + j=loop(bp,0, dy/2,dx,cs,0,RI); + j=loop(bp,j, dy/2,dx,cs,1,RI); i=j; // thickness + j=loop(bp,0, dy/4,dx,cs,0,RI); + j=loop(bp,j, dy/4,dx,cs,1,RI); if (j=loop(bp,dx-1,yb/2,dx,cs,0,LE) ) Break; // ~1 ??? + + j=1; + for(y=1;j && y=cs && getpixel(bp,x+1,y )>=cs + && getpixel(bp,x ,y-1)< cs && getpixel(bp,x+1,y-1)< cs ) { j=0;break; } + } if(!j) Break; + + if( num_cross(0,dx-1,dy-2,dy-2,bp,cs) == 2 + && num_cross(0,dx-1,dy-1,dy-1,bp,cs) == 2 ) Break; // ~* (5er) + + if( dy>= 16 + && loop(bp, 0, 3*dy/4,dx,cs,0,RI) + >=loop(bp, 0, dy-2,dx,cs,0,RI) + && loop(bp,dx-1, 3*dy/4,dx,cs,0,LE) + <=loop(bp,dx-1, dy-2,dx,cs,0,LE) + && loop(bp,dx-1, 1,dx,cs,0,LE)+dx/16 + loop(bp, 0,3*dy/16,dx,cs,0,RI)+dx/16 + || loop(bp,dx-1, 0,dx,cs,0,LE)==0 + || loop(bp,dx-1, 1,dx,cs,0,LE)==0) ) ad=96*ad/100; // ~f Jan02 + if(dx<8 && dy>12){ // thin f's could easily confound with t + x=loop(bp,dx-1,3*dy/16,dx,cs,0,LE); + if (x) + if (loop(bp,dx-x,0,dy,cs,0,DO)<3*dy/16 + && loop(bp, 0, 3*dy/4,dx,cs,0,RI)+1 + >=loop(bp, 0, dy-2,dx,cs,0,RI) + && loop(bp,dx-1, 3*dy/4,dx,cs,0,LE) + <=loop(bp,dx-1, dy-2,dx,cs,0,LE) ) Break; + } + if (dx>7) + if( num_cross( 0,dx-1,2*dy/3,2*dy/3,bp,cs) > 1 + && num_cross( 0,dx/2,2*dy/3,2*dy/3,bp,cs) > 0 + && num_cross(dx/2,dx-1,2*dy/3,2*dy/3,bp,cs) > 0 ) + if (sdata->holes.num > 0) + if (sdata->holes.hole[0].y0 > dy/4) Break; // ~6 + // if ( num_hole( x0, x1, y0+dy/4, y1, box1->p,cs,NULL) > 0 ) Break; // ~6 + + if( num_cross(0,dx-1,3*dy/4, 3*dy/4, bp,cs) >= 2 + && num_cross(0,dx-1,3*dy/4-1,3*dy/4-1,bp,cs) >= 2 ){ + ad=99*ad/100; /* italic t ? */ + if (loop(bp,dx/2 ,dy-1,dy,cs,0,UP)>dy/4) Break; // ~h + if (loop(bp,dx/2+1,dy-1,dy,cs,0,UP)>dy/4) Break; // ~h + } + + x= loop(bp,dx-1,dy/2,dx,cs,0,LE); + i= loop(bp,dx-1,dy/8,dx,cs,0,LE); + if (i>x && loop(bp,dx-x,0,dy,cs,0,DO)>=dy/2) ad=90*ad/100; /* ~\ */ + + x= loop(bp,0, 0,dx,cs,0,RI); + i= loop(bp,0, 1,dx,cs,0,RI); if (i1) Break; // l + + // this happens quite often, do not be to strong + if (!box1->m2) ad=99*ad/100; + if (box1->m2) { + if (!hchar) ad=99*ad/100; /* some times t is not long enough */ + if( y0>=box1->m2-(box1->m2-box1->m1)/4 ) ad=99*ad/100; /* to short */ + if( y0>=box1->m2 ) ad=99*ad/100; /* to short */ + } + + if (sdata->holes.num > 0) ad=95*ad/100; + if (gchar) ad=99*ad/100; + if (box1->dots) ad=90*ad/100; + Setac(box1,'t',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_sS(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + wchar_t ac; + + // --- test sS near 5 --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 (4x6 font) + DBG( wchar_t c_ask='s'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( num_cross( dx/2, dx/2,0,dy-1,bp,cs)!=3 + && num_cross(5*dx/8,3*dx/8,0,dy-1,bp,cs)!=3 + && dy>4 ) Break; + if( num_cross(0,dx-1,dy/2 ,dy/2 ,bp,cs)!=1 + && num_cross(0,dx-1,dy/2-1,dy/2-1,bp,cs)!=1 ) Break; + // get the upper and lower hole koords + y=dy/4; + x =loop(bp,0,y,dx,cs,0,RI); if(x>3*dx/8) Break; /* slanted too */ + x +=loop(bp,x,y,dx,cs,1,RI); if(x>5*dx/8) Break; /* fat too */ + i1 =loop(bp,x,y,dx,cs,0,RI); i1=(i1+2*x)/2; // upper center x + y=11*dy/16; + x =loop(bp,dx-1 ,y,dx,cs,0,LE); if(x>dx/4) Break; + x +=loop(bp,dx-1-x,y,dx,cs,1,LE); if(dx>5 && dy>7 && x>dx/2) Break; + if (x>3*dx/4) Break; if(x>dx/2) { ad=98*ad/100; MSG({})} + i2 =loop(bp,dx-1-x,y,dx,cs,0,LE); i2=dx-1-(i2+2*x)/2; // upper center x + for( y=dy/4;ydx/8) break; + } + if(y==dy/2) Break; // Mai00 + + y=dy/2+loop(bp,0,dy/2,dy/2,cs,1,DO); + if( !joined(bp,0,y,i2,11*dy/16,cs) ) Break; + + if (sdata->holes.num > 0) + if (sdata->holes.hole[0].y0 > dy/4) Break; // ??? + // if( num_hole( x0, x1, y0+dy/4, y1, box1->p,cs,NULL) > 0 ) Break; + + i1=loop(bp,dx-1,dy-1,dx,cs,0,LE); + i2=loop(bp,dx-1,dy-2,dx,cs,0,LE); + if (i2-i1 >= dx/4) Break; // ~{ 5x7font + + i1=loop(bp, 0, 0,dx,cs,0,RI); + i2=loop(bp, 0, 1,dx,cs,0,RI); + if (i2-i1 >= dx/4) Break; // ~} 5x7font + + // sS5 \sl z left upper v-bow ? + + i1=loop(bp, 0,dy/2,dx,cs,0,RI); + i1=loop(bp, i1,dy/2,dx,cs,1,RI); + if (4*i1>=3*dx) ad=97*ad/100; // ~5 7-segment + + i1=loop(bp,0, dy/16,dx,cs,0,RI); + i2=loop(bp,0,4*dy/16,dx,cs,0,RI); + i3=loop(bp,0,7*dy/16,dx,cs,0,RI); + if( 2*i2+dx/32 >= i1+i3 ){ + if( 2*i2+dx/32 > i1+i3 || dx>9 ) Break; + // very small s? + i1+=loop(bp,i1, dy/16,dx,cs,1,RI); + i2+=loop(bp,i2,4*dy/16,dx,cs,1,RI); + i3+=loop(bp,i3,7*dy/16,dx,cs,1,RI); + if( 2*i2+dx/32 >= i1+i3 ) Break; + } + + for(y=7*dy/16;y<5*dy/8;y++){ + if( num_cross( 0,dx-1,y ,y ,bp,cs)==2 ) + if( num_cross( 0,dx-1,y+1,y+1,bp,cs)==1 ) + if( num_cross( 0,dx/4,y,y,bp,cs)==1 ) break; // ~5 + } if(y<5*dy/8) Break; // v0.2.4a5 + if ( loop(bp, dx-1,dy-2-dy/32,dx,cs,0,LE) + > loop(bp, 0, 1+dy/32,dx,cs,0,RI) + dx/4 ) Break; // ~5 Dec00 + ac='s'; + if (gchar) { ad=98*ad/100; MSG({}) } + if( hchar ){ // S but 5 is very similar! check it + ac='S'; + if ( loop(bp, dx-1,dy-1-dy/32,dx,cs,0,LE) + > loop(bp, 0, 0+dy/32,dx,cs,0,RI) ) ad=99*ad/100; // ~5 + if ( loop(bp, 0,dy-1-dy/32,dx,cs,0,RI) + > loop(bp, dx-1, 0+dy/32,dx,cs,0,LE) ) ad=99*ad/100; // ~5 + } + Setac(box1,ac,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_gG(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test g --------------------------------------------------- + /* some g's have crotchet at upper right end, so hchar can be set */ + // ~italic g + for(ad=d=100;dx>2 && dy>4;){ // min 3x5 + DBG( wchar_t c_ask='g'; ) + if (sdata->holes.num > 3) Break; /* tolerant against a tiny hole */ + if( get_bw(x0+dx/2, x0+dx/2, y1-dy/2, y1,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/4, x1 , y1-dy/4, y1,box1->p,cs,1) != 1 ) Break; // ~p + if( get_bw(x0+dx/2, x0+dx/2, y0, y0+dy/2,box1->p,cs,1) != 1 ) Break; + + if( num_cross(x0+dx/2, x0+dx/2, y0, y1, box1->p,cs) < 3 ) + if( num_cross(x1-dx/2, x1-dx/2, y0, y1, box1->p,cs) < 3 ) Break; + if (sdata->holes.num < 1) Break; + for (i=0;iholes.num;i++){ + if (sdata->holes.hole[i].y1 < 5*dy/8+1) break; + } if (i==sdata->holes.num) Break; // no upper hole found + // if( num_hole ( x0, x1, y0, y0+5*dy/8, box1->p,cs,NULL) != 1 ) Break; + for(y=dy/4;y=15*dy) Break; // ~B + + if (num_cross(x1, x1, (y0+y1)/2, y1, box1->p,cs)>1) { + ad=98*ad/100; // ~& + if (num_cross(x1 , x1 , y0, (y0+y1)/2, box1->p,cs)<1 ) ad=96*ad/100; + if (num_cross(x1-1, x1-1, y0, (y0+y1)/2, box1->p,cs)<1 ) ad=95*ad/100; + } + // looking for a gap + for (x=0,y=dy/4;yx) x=i; + } // in a good font x is greater dx/2 + + if (xp,cs) > 2 + || num_cross(x0,x1 ,y0+dy/8,y0+dy/8,box1->p,cs) > 2) ad=90*ad/100; + if( num_cross(x0,x1+dx/4,y1-dy/4,y1-dy/4,box1->p,cs) > 2 + || num_cross(x0,x1+dx/4,y1-dy/8,y1-dy/8,box1->p,cs) > 2) ad=90*ad/100; + } + if( num_cross(0,dx-1,dy/2,dy/2,bp,cs) >2 ) ad=99*ad/100; // ~/o + + /* test for horizontal symmetry ~8 */ + for (y=0;ym4==0) ad=98*ad/100; + if ( hchar) ad=96*ad/100; + if (!gchar) ad=96*ad/100; + ad=98*ad/100; + Setac(box1,'g',ad); + break; + } + // --- test rundes G --------------------------------------------- + for(ad=d=100;dx>3 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='G'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 ,x0+dx/2,y0+dy/3,y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2,x1-dx/4,y0 ,y0+dy/4,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2,x0+dx/2,y1-dy/4,y1 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0 ,x0+dx/2,y1-dy/3,y1-dy/3,box1->p,cs,1) != 1 ) Break; // ~S + for( y=y0+dy/4;yp,cs,1) == 0 ) break; + if( y==y1-dy/3 ) Break; // no gap + + if( num_cross(x0+dx/2 , x0+dx/2 , y0, y, box1->p,cs) != 1 + || num_cross(x0+dx/2+1, x0+dx/2+1, y0, y, box1->p,cs) != 1 ) Break; // ~e + + x=x0; y=y1; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,UP,ST); // left bow? + if( yp,&x,&y,x0,x1,y0,y1,cs,LE,ST); + if( xp,&x,&y,x0,x1,y0,y1,cs,ST,LE); + if( xp,&x,&y,x0,x1,y0,y1,cs,LE,ST); + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,ST,LE); + if( xp,&x,&y,x0,x1,y0,y1,cs,RI,UP); // upper end right midle + if( x<=x1 ) Break; + if( yy1-dy/4 ) Break; + + x=x1-dx/3;y=y1; // follow left C-bow, filter S + turmite(box1->p,&x,&y,x0,x1,y0+dy/4,y1,cs,LE,UP); // w=LE b=UP + if( y>y0+dy/4+1 ) Break; /* leave box below for S or on top for CG */ + MSG(fprintf(stderr,"xy= %d %d",x-x0,y-y0);) + /* if (yp,&x,&y,x0,x1,y0 ,y1,cs,RI,UP); + MSG(fprintf(stderr,"xy= %d %d",x-x0,y-y0);) + if( y>y0 ) Break; + if (sdata->holes.num > 0) Break; + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) > 0 ) Break; + if( dx>4 && dy>6){ // no (<[ + for(i=1,y=0;i && y Z + if( xi ) i=x; + } if( yi){ i=x;i1=y; } + } if( i1<=dy/4 || i1>=dy-dy/4 ) Break; // around the middle ? + // check from above for gap and left vertical line (~S) + x =loop(bp,0,i1,dx ,cs,0,RI); + x+=loop(bp,x,i1,dx-x,cs,1,RI); // left vertical bow + x+=loop(bp,x,i1,dx-x,cs,0,RI); if (x>=dx) ad=90*ad/100; + MSG(fprintf(stderr,"h-bar y dx %d %d ad= %d",i1,i,ad);) + + i=1; // Mar06: adapted to 4x6 font + for(x=dx/2;x=cs + && getpixel(bp,x+1,y )< cs + && getpixel(bp,x+1,y-1)< cs + && getpixel(bp,x ,y-1)< cs ) { i=0;break; } + } + if(i) ad=95*ad/100; // ~C + if(!hchar) ad=98*ad/100; + if( gchar) ad=98*ad/100; + + Setac(box1,'G',ad); + break; + } + // --- test \it g like 9 ---------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx + DBG( wchar_t c_ask='g'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( num_cross(x0+dx/2,x0+dx/2,y0,y1,box1->p,cs) != 3 // pre select + && num_cross(x0+dx/4,x1-dx/4,y0,y1,box1->p,cs) != 3 ) Break; + for( x=0,i=y=y0+dy/2;y<=y1-3*dy/16;y++){ // suche kerbe + j=loop(box1->p,x0,y,dx,cs,0,RI); + if( j>2 && j>dx/4 && yp,x0+j-2,y+1,dx,cs,0,RI)-2; + if( j>x ) { x=j; i=y; } + } + if( x<4*dx/8 ) Break; + if( num_cross(x0+dx/2,x1,i ,y1,box1->p,cs) != 1 + && num_cross(x0+dx/2,x1,i+1,y1,box1->p,cs) != 1 ) Break; + if( num_hole(x0,x1,y0,i+1,box1->p,cs,NULL)!=1 ) Break; + if( num_hole(x0,x1,i-1,y1,box1->p,cs,NULL)!=0 ) Break; + if( loop(box1->p,x0,y1 ,dy,cs,0,RI)>dx/3 && + loop(box1->p,x0,y1-1,dy,cs,0,RI)>dx/3) Break; // no q + for( x=0,i=y=y0+dy/3;y<=y1-dy/3;y++){ // suche kerbe + j=loop(box1->p,x1,y,dx,cs,0,LE); + if( j>x ) { x=j; i=y; } + } if( x>dx/2 ) Break; // no g + i1=loop(bp,dx-1,dy/8 ,dx,cs,0,LE); if(i1>dx/2) Break; + i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); + i2=loop(bp,dx-1,dy/2 ,dx,cs,0,LE); if(i1+i3<2*i2-dx/8) Break; // konvex + i1=loop(bp,dx-1,dy/4 ,dx,cs,0,LE); if(i1>dx/2) Break; + i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); + for(y=dy/4;y0){ x--; // robust + y=loop(bp,dx-x-1, dy-1,dy,cs,0,UP); + if(yp,cs) > 2) ad=90*ad/100; + if( num_cross(x0,x1+dx/4,y1-dy/4,y1-dy/4,box1->p,cs) > 2 + || num_cross(x0,x1+dx/4,y1-dy/8,y1-dy/8,box1->p,cs) > 2) ad=90*ad/100; + + if (box1->m4==0) ad=98*ad/100; + if ( hchar) ad=96*ad/100; + if (!gchar) ad=96*ad/100; + if (ad>99) ad=99; // never be sure to have a 9 + Setac(box1,'g',ad); + break; + } + return box1->c; +} + +// rewritten for vector usage v0.41 +static wchar_t ocr0_xX(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + // pix *bp=sdata->bp; // obsolete + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0, x1=box1->x1, y0=box1->y0, y1=box1->y1; // ,cs=sdata->cs; + int dx=x1-x0+1, dy=y1-y0+1, /* size */ + (*aa)[4]=sdata->aa, /* the for line ends, (x,y,dist^2,vector_idx) */ + ad; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test xX --------------------------------------------------- + // rewritten for vectors 0.41 + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + int ld, i1, i2, i3, i4; // lien derivation, 4 inner edges + DBG( wchar_t c_ask='x'; ) + if (sdata->holes.num > 0) Break; /* # */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the 4 ends of the x */ + if (aa[0][2]>d) Break; + if (aa[1][2]>d) Break; + if (aa[2][2]>d) Break; + if (aa[3][2]>d) Break; + if (aa[3][0]-aa[0][0]num_frame_vectors[0]) { + if (box1->frame_vector[i][0] + >=box1->frame_vector[j][0]) j=i; /* notice most right vector */ + } if (j==i) Break; + /* calculate the distance to the center */ + x=box1->frame_vector[j][0]; + y=box1->frame_vector[j][1]; i1=j; + if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; + if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; + if ( aa[0][0]+aa[1][0]-2*x>=0) Break; + if ( aa[1][0] >= x ) Break; + if ( aa[0][0] > x ) Break; + if ( aa[0][0] >= x ) ad=99*ad/100; + if (x-x02*sq(1024/4)) Break; + /* check if lower left and center point are joined directly */ + ld=line_deviation(box1, j, aa[1][3]); + MSG(fprintf(stderr," X-1 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + + /* only lower side */ + for (j=i=aa[1][3];i!=aa[2][3];i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[i][1] + <=box1->frame_vector[j][1]) j=i; /* notice most upper vector */ + } if (j==i) Break; + /* calculate the distance to the center */ + x=box1->frame_vector[j][0]; + y=box1->frame_vector[j][1]; i2=j; + if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; + if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; + if ( aa[1][1]+aa[2][1]-2*y<=0) Break; + /* check if lower left and center point are joined directly */ + ld=line_deviation(box1, aa[1][3], j); + MSG(fprintf(stderr," 1-X %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + /* check if lower right and center point are joined directly */ + ld=line_deviation(box1, j, aa[2][3]); + MSG(fprintf(stderr," X-2 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + + /* only right side */ + for (j=i=aa[2][3];i!=aa[3][3];i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[i][0] + <=box1->frame_vector[j][0]) j=i; /* notice most left vector */ + } if (j==i) Break; + /* calculate the distance to the center */ + x=box1->frame_vector[j][0]; + y=box1->frame_vector[j][1]; i3=j; + if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; + if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; + if ( aa[2][0]+aa[3][0]-2*x<=0) Break; + if ( aa[3][0] <= x ) Break; + if ( aa[2][0] < x ) Break; + if ( aa[2][0] <= x ) ad=99*ad/100; + if (dx-(x-x0)2*sq(1024/4)) Break; + /* check if upper right and center point are joined directly */ + ld=line_deviation(box1, j, aa[3][3]); + MSG(fprintf(stderr," X-3 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + + /* only upper side */ + for (j=i=aa[3][3];i!=aa[0][3];i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[i][1] + >=box1->frame_vector[j][1]) j=i; /* notice lowest vector */ + } if (j==i) Break; + /* calculate the distance to the center */ + x=box1->frame_vector[j][0]; + y=box1->frame_vector[j][1]; i4=j; + if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; + if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; + if ( aa[3][1]+aa[0][1]-2*y>=0) Break; + /* check if upper left and center point are joined directly */ + ld=line_deviation(box1, aa[3][3], j); + MSG(fprintf(stderr," 3-X %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + /* check if lower left and center point are joined directly */ + ld=line_deviation(box1, j, aa[0][3]); + MSG(fprintf(stderr," X-0 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + + // center crossing of diagonal lines is small? + if (box1->frame_vector[i3][0] - box1->frame_vector[i1][0] > dx/2) Break; + + if (gchar) ad=99*ad/100; + bc='x'; if(hchar) bc='X'; + Setac(box1,bc,ad); + break; + } + // --- test \it x --------------------------------------------------- +#if 0 + for(ad=d=99;dx>4 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='x'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0,x0+dx/4,y0+dy/2,y0+dy/2,box1->p,cs,1) != 0 ) Break; + if( get_bw(x1-dx/4,x1,y0+dy/2,y0+dy/2,box1->p,cs,1) != 0 ) Break; + if( num_cross(x0+dx/4,x1-dx/4,y0+dy/2,y0+dy/2, box1->p,cs) != 1 ) Break; + if( num_cross(x0,x1,y0+dy/4,y0+dy/4, box1->p,cs) != 3 + && num_cross(x0,x1,y0+dy/8,y0+dy/8, box1->p,cs) < 3 ) Break; + if( num_cross(x0,x1,y1-dy/4,y1-dy/4, box1->p,cs) != 3 + && num_cross(x0,x1,y1-dy/8,y1-dy/8, box1->p,cs) < 3 ) Break; + if( gchar ) ad=97*ad/100; + if( hchar ) ad=96*ad/100; + bc='x'; + Setac(box1,bc,ad); + break; + } +#endif + return box1->c; +} + +static wchar_t ocr0_yY(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad,xa,ya,xb,yb,xc,yc,xd,yd; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test italic yY -------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='y'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num > 0) ad=97*ad/100; + if( num_cross(0,dx-1,dy/8,dy/8,bp,cs) < 2 + && num_cross(0,dx-1, 1, 1,bp,cs) < 2 ) Break; + if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 1 + && num_cross(0,dx-1,dy-2,dy-2,bp,cs) != 1 ) Break; + if( num_cross(dx-1,dx-1,0,dy-1,bp,cs) != 1 + && num_cross(dx-2,dx-2,0,dy-1,bp,cs) != 1 ) Break; + if( num_cross(dx/3,dx/3,dy/4,dy-1,bp,cs) != 2 + && num_cross(dx/2,dx/2,dy/4,dy-1,bp,cs) != 2 ) Break; + for(yc=y=0,xc=x=dx/4;xy){ yc=y=i;xc=x; } + } if( y>12*dy/16 || y<3*dy/8 ) Break; + ya=dy/8; xa=xc-loop(bp,xc,ya,dx,cs,0,LE); if(xa< 0) Break; + yb=dy/8; xb=xc+loop(bp,xc,yb,dx,cs,0,RI); if(xb>=dx) Break; + for(y=dy/8;y6*dx/8) ad=99*ad/100; // why this??? + if (loop(bp,dx-1,dy-1,dx,cs,0,LE)<1) Break; + // printf(" abcd=%d %d %d %d %d %d %d %d -",xa,ya,xb,yb,xc,yc,xd,yd); + if( get_line2(xb,yb,xd,yd,bp,cs,100)<95 ) Break; + // if( get_line2(xc,yc,xd,yd,bp,cs,100)<95 ) Break; + // printf("ok"); + bc='y'; + if(gchar && !hchar) bc='y'; else + if(hchar && (!gchar || dy<14)) bc='Y'; else ad=98*ad/100; // SMALL-CAPS ??? + Setac(box1,bc,ad); + break; + } + // --- test yY --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='y'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0,x0,y1-dy/8,y1,box1->p,cs,1) == 1 ) { + if( get_bw(x0,x0+4*dx/8,y0+dy/8,y0+dy/8,box1->p,cs,1) != 1 ) Break; + } else { + if( get_bw(x0,x0+3*dx/8,y0+dy/8,y0+dy/8,box1->p,cs,1) != 1 ) Break; + } + if( num_cross(0,dx-1,dy/8,dy/8,bp,cs) != 2 + && num_cross(0,dx-1, 1, 1,bp,cs) != 2 ) Break; + if( num_cross(dx/2,dx/2,0, 1,bp,cs) != 0 ) Break; + if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 1 + && num_cross(0,dx-1,dy-2,dy-2,bp,cs) != 1 ) Break; + if( num_cross(dx-1,dx-1,0,dy-1,bp,cs) != 1 + && num_cross(dx-2,dx-2,0,dy-1,bp,cs) != 1 + && num_cross(dx-dx/8-1,dx-dx/8-1,0,dy-1,bp,cs) != 1 ) Break; + if( loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)+dx/8+1 // Jul00 + < loop(bp, 0,dy-1-dy/8,dx,cs,0,RI) ) Break; + for(y=0,x=dx/4;xy) y=i; + } if( y>10*dy/16 || y<2*dy/8 ) Break; + for(xc=xb=xa=dx,yc=yb=ya=y=0;ydy/8) Break; + for(i=dx,yc=y=dy/4;y<3*dy/4;y++){ + if( num_cross(0,dx-1,y,y,bp,cs) < 2 ) break; + x =loop(bp,dx-1 ,y,dx,cs,0,LE); + x+=loop(bp,dx-1-x,y,dx,cs,1,LE); + j =loop(bp,dx-1-x,y,dx,cs,0,LE); if(j<=i){ i=j;yc=y;xc=dx-1-x-j/2; } + } yc+=dy/16+1; + yc+=loop(bp,xc,yc,i,cs,1,DO)/2; + xa+= loop(bp,xa ,ya,dx,cs,1,RI)/2; + xb=dx-1-loop(bp,dx-1,yb,dx,cs,1,LE)/2; + yd=dy-1-dy/8;xd=dx-1-loop(bp,dx-1,yd,dx,cs,0,LE); if(xd>6*dx/8) Break; + /* check for serife at lower end */ + for (i=0,x=dx-1;ix+dx/16+1) break; /* detect serif */ + if (j=5*dy/8 && !gchar) + if( get_line2(xa,ya,xd ,yd,bp,cs,100)>95 ) + if( get_line2(xb,yb,xd ,yd,bp,cs,100)>95 ) + { if (dx>4) { Break; } else ad=ad*98/100; } // ~V + xa=loop(bp,0,dy/8,dx,cs,0,RI); + xb=loop(bp,0,dy/2,dx,cs,0,RI); + xc=loop(bp,0,dy-1,dx,cs,0,RI); + if( 2*xb< xa+xc ) ad=98*ad/100; // ~V + if( 2*xb<=xa+xc ) ad=98*ad/100; + if( 2*xb<=xa+xc+1 ) ad=98*ad/100; + + bc='y'; + if ((!gchar) && (!hchar)) ad=98*ad/100; + if(y0m2-(box1->m2-box1->m1)/4) + { bc='Y'; if(gchar) ad=98*ad/100; } + // SMALL-CAPS ??? + Setac(box1,bc,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_zZ(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + int i1,i2,i3,i4,i5,dbg[9], + d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + (*aa)[4]=sdata->aa, /* the for line ends, (x,y,dist^2,vector_idx) */ + ad; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test zZ ------- + for(ad=d=100;dx>3 && dy>3;){ // dy>dx + DBG( wchar_t c_ask='z'; ) /* for debugging purpose */ + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num > 0) ad=98*ad/100; /* # */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the 4 edges of the z */ + if (aa[0][2]>d) Break; + if (aa[1][2]>d) Break; + if (aa[2][2]>d) Break; + if (aa[3][2]>d) Break; + if (aa[3][0]-aa[0][0]dy/8) ad=99*ad/100; + if (aa[0][1]-y0>dy/8) ad=99*ad/100; + if (2*dx2*sq(1024/4)) Break; + ad=(100-(d-sq(1024)/2)/sq(1024)/4)*ad/100; + d=line_deviation(box1, aa[1][3], aa[2][3]); if (d>2*sq(1024/4)) Break; + + /* search uppermost right > */ + i1=nearest_frame_vector(box1,aa[0][3],aa[1][3], x1, y0); + x=box1->frame_vector[i1][0]; + y=box1->frame_vector[i1][1]; + if (y-y0 > 5*dy/8) Break; + if (x-x0 < 3*dx/8) Break; + if (x-aa[0][0]<=dx/4) Break; // ~lI + if (x-aa[0][0]<=dx/3) ad=98*ad/100; // ~lI + if (x-aa[0][0]<=dx/2) ad=99*ad/100; // ~lI + /* search most right > ~2 */ + i3=nearest_frame_vector(box1,aa[0][3],aa[1][3], x1+2*dx, (y0+y1)/2); + MSG(fprintf(stderr,"xy= %d %d %d %d %d %d",x0,y0,x-x0,y-y0,box1->frame_vector[i3][0]-x0,box1->frame_vector[i3][1]-y0);) + if ( box1->frame_vector[i3][1]-y0> dy/4 + && box1->frame_vector[i3][0]-x>=0) Break; + if ( box1->frame_vector[i3][1]-y> dy/8 + && box1->frame_vector[i3][0]-x>=-dx/8) ad=98*ad/100; + if ( box1->frame_vector[i3][1]-y> dy/8 + && box1->frame_vector[i3][0]-x>= 0) ad=97*ad/100; + if (box1->frame_vector[i3][0]-aa[0][0] + < aa[3][0]-box1->frame_vector[i3][0]) break; // ~lI + if (box1->frame_vector[i3][0]-aa[0][0] + <(aa[3][0]-box1->frame_vector[i3][0])*2) ad=98*ad/100; // ~lI + /* better test for a bow or peaked angle */ + /* upper part of a 2, on a Z a and b should be at c + .....$@@@@@@a...c. o1 (o1-a)=(dx+5)^2 =dx^2+10*dx+25 + ...$$@@@@@@@@@.... (o1-b)=(dx+1)^2+4^2=dx^2+ 2*dx+18 + ..$@@$@@@$@@@@@... + ..@@@.....$$@@@@.. + ..@@.......@$@@@b. + ..$.........$@@@@. + .$$..........$@@@. + .$...........@@@@. + .............@@@@.< + .............$@@$. + ............$@@@.. + ............@@$... + ............$@$... + --- snip ---- + */ + i4=nearest_frame_vector(box1,aa[2][3],aa[0][3], x1+dx, y0); + i5=nearest_frame_vector(box1,aa[2][3],aa[0][3], x1, y0-dx); + d=sq(box1->frame_vector[i5][0]-box1->frame_vector[i4][0]) + +sq(box1->frame_vector[i5][1]-box1->frame_vector[i4][1]); + if (d>2*sq(dx/8+1)) break; + + /* check if upper left and upper right point are joined directly */ + dbg[0]=d=line_deviation(box1, aa[0][3], i1); if (d >2*sq(1024/4)) Break; + /* check if lower right and upper left point are joined directly */ + dbg[1]=d=line_deviation(box1, i1, aa[1][3]); if (d >2*sq(1024/4)) Break; + + /* search lowest left < */ + i2=nearest_frame_vector(box1,aa[2][3],aa[3][3], x0, y1); + x=box1->frame_vector[i2][0]; + y=box1->frame_vector[i2][1]; + if (y-y0 < 3*dy/8) Break; + if (x-x0 > 5*dx/8) Break; + if (aa[2][0]-x<=dx/4) Break; // ~lI + if (aa[2][0]-x<=dx/3) ad=98*ad/100; // ~lI + if (aa[2][0]-x<=dx/2) ad=99*ad/100; // ~lI + /* check if upper right and lower left point are joined directly */ + dbg[2]=d=line_deviation(box1,i2, aa[3][3]); if (d >2*sq(1024/4)) Break; + /* check if lower left and lower right point are joined directly */ + dbg[3]=d=line_deviation(box1, aa[2][3],i2); if (d >2*sq(1024/4)) Break; + + if (box1->frame_vector[i1][0] + -box1->frame_vector[i2][0]<=dx/8) Break; /* nonsignificant distance */ + MSG( \ + fprintf(stderr,"^v %d %d %d %d line deviation %d %d %d %d max %d %d",\ + box1->frame_vector[i1][0]-x0,box1->frame_vector[i1][1]-y0,\ + box1->frame_vector[i2][0]-x0,box1->frame_vector[i2][1]-y0,\ + dbg[0],dbg[1],dbg[2],dbg[3],2*sq(1024/4),2*sq(1024));) + ad=(100-(dbg[0]-sq(1024)/2)/sq(1024)/4)*ad/100; + ad=(100-(dbg[1]-sq(1024)/2)/sq(1024)/4)*ad/100; + ad=(100-(dbg[2]-sq(1024)/2)/sq(1024)/4)*ad/100; + ad=(100-(dbg[3]-sq(1024)/2)/sq(1024)/4)*ad/100; + + if ( gchar) ad=98*ad/100; + bc='z'; + if( hchar ) bc='Z'; + Setac(box1,bc,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_wW(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar,handwritten=0, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad,ya,yb,xa,xb,xc,xd,xe,t1; /* tmp-vars */ + wchar_t ac; + + // ------- test w ~{\it w} --------------- + for(ad=d=100;dx>3 && dy>3;){ // dy<=dx + DBG( wchar_t c_ask='w'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + // xa xe + // \ xc / <=ya connected xa-xb-xc-xd-xe + // xb xd <=yb + // get two lowest points i3,i4,ya + // out_x(box1); + // ~ul ~uf + // out_x(box1); + for(y=dy/8;y< dy/2;y++) if( num_cross(0,dx-1,y,y,bp,cs)< 2 ) break; + if(y4) { /* 4x6 is to small */ + for(y=dy-1-dy/16;y>3*dy/4;y--) + if( num_cross(0,dx-1,y,y,bp,cs)==2 ) break; + if(y==3*dy/4) Break; + } + yb=y; + t1=loop(bp,0 ,dy/4,dx,cs,0,RI); + t1=loop(bp,t1,dy/4,dx,cs,1,RI); // thickness of line? + for(i=j=0 ;y> dy/4;y--) if( num_cross(0,dx-1,y,y,bp,cs)==4 ) i++; + else if( num_cross(0,dx-1,y,y,bp,cs)>=3 ) j++; + if(i+56 || dx>4)) Break; + if(i+j==0 && dx<=4){ + if (abs(loop(bp, 1,dy-1,dy,cs,0,UP) + -loop(bp,dx-2,dy-1,dy,cs,0,UP))>dy/8+1) Break; // 4x6 N + if ( ( loop(bp, 1, 0,dy,cs,0,DO)>=dy-2 + && loop(bp, 0,dy-1,dy,cs,0,UP)>0) + || ( loop(bp,dx-2, 0,dy,cs,0,DO)>=dy-2 + && loop(bp,dx-1,dy-1,dy,cs,0,UP)>0)) Break; // 4x6 UV + ad=ad*99/100; // 4x6 font + MSG(fprintf(stderr,"ad=%d",ad);) + } + if( num_cross(0,dx-1, 1, 1,bp,cs)< 2 + && num_cross(0,dx-1,dy/16,dy/16,bp,cs)< 2 ) Break; + x =loop(bp,0 ,yb,dx,cs,0,RI); + xb=loop(bp,x ,yb,dx,cs,1,RI);xb=x+xb/2; if(xb>dx/2) Break; + x =loop(bp,dx-1 ,yb,dx,cs,0,LE); + xd=loop(bp,dx-1-x,yb,dx,cs,1,LE);xd=dx-1-x-xd/2;if(xd<3*dx/8) Break; + for(y=0,xc=x=xb+1;xy){xc=x;y=i;} + if(dx>4 && !y) Break; + ya=dy-1-y; // flat + y=loop(bp,xc,ya,dy,cs,1,UP);if(y)y--; + if (dy>6 || dx>4) { // ~4x6 font + if( num_cross(0 ,xc ,ya-y ,ya-y ,bp,cs)!= 2 + && num_cross(0 ,xc ,ya-y/2,ya-y/2,bp,cs)!= 2 ) Break; + if( num_cross(xc,dx-1,ya-y ,ya-y ,bp,cs)!= 2 + && num_cross(xc,dx-1,ya-y/2,ya-y/2,bp,cs)!= 2 ) Break; + } + ya-=y/2; + x =loop(bp,0 ,1 ,dx,cs,0,RI); + xa=loop(bp,x ,1 ,dx,cs,1,RI); + if( x+xa>xb ){ // may be, here is a small but thick letter + // later add some proofs + xa=x+xa/4; + } else { + xa=x+xa/2; + } + x =loop(bp,dx-1 ,1 ,dx,cs,0,LE); + xe=loop(bp,dx-1-x,1 ,dx,cs,1,LE);xe=dx-1-x-xe/2; + MSG( fprintf(stderr,"a-e: %d %d %d %d %d %d %d %d %d %d", + xa,1,xb,yb,xc,ya,xd,yb,xe,1);) + if (ya94 ) break; + if (x==xa+i) Break; // no vert. line found + if( get_line2(xb,yb-1,xc,ya ,bp,cs,100)<95 + && get_line2(xb,yb-1,xc,ya+dy/32,bp,cs,100)<95 + && get_line2(xb,yb-1,xc,ya+dy/16,bp,cs,100)<95 ) Break; + if( get_line2(xc, ya,xd, yb,bp,cs,100)<95 + && get_line2(xc+1,ya,xd, yb,bp,cs,100)<95 ) Break; + if( get_line2(xd,yb,xe ,1+dy/16,bp,cs,100)<95 + && get_line2(xd,yb,dx-1 ,1+dy/8 ,bp,cs,100)<95 // round w + && get_line2(xd,yb,xe+dx/20,1+dy/16,bp,cs,100)<95 ) Break; + // if( num_hole(0,dx-1,0,dy-1,bp,cs,NULL) != 0 ) Break; + // ~ur + MSG(fprintf(stderr,"ad=%d",ad);) + for(i=0,y=5*dy/8;yi ) i=x; if( x3 && dy>3;){ // dy<=dx 4x6font (like a H with fat bar) + DBG( wchar_t c_ask='w'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + // ~ul ~uf + if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)<2 ) Break; + if( num_cross(0,dx-1,dy/8,dy/8,bp,cs)<2 ) handwritten=40; + if( num_cross(0,dx-1,dy/4,dy/4,bp,cs)<2 ) handwritten=80; + for(i=0,y=0;ydx/2) Break; + xb=loop(bp,x ,yb,dx,cs,0,RI);xb=x+xb/2; if(xb>dx/2) Break; + x =loop(bp,dx-1 ,yb,dx,cs,0,LE); + x+=loop(bp,dx-1-x,yb,dx,cs,1,LE); + xd=loop(bp,dx-1-x,yb,dx,cs,0,LE);xd=dx-1-x-xd/2;if(xd<3*dx/8) Break; + if( num_cross(xb,xd,yb,yb ,bp,cs)!= 1 ) Break; + if( num_cross(xb,xb,yb,dy-1,bp,cs)!= 1 ) Break; + if( num_cross(xd,xd,yb,dy-1,bp,cs)!= 1 ) Break; + if( num_cross(xb,xb, 0,yb ,bp,cs)!= 0 ) Break; + if( num_cross(xd,xd, 0,yb ,bp,cs)!= 0 ) Break; + // if( num_hole(0,dx-1,0,dy-1,bp,cs,NULL) != 0 ) Break; + if (sdata->holes.num != 0) Break; + // ~ur + for(i=0,y=3*dy/4;yi ) i=x; if( xc; +} + +static wchar_t ocr0_aA(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,d,x,y,i1,i2,i3,i4,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad,ya; /* tmp-vars */ + + // --- test A --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='A'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + // first selection (rough sieve) + if( get_bw(dx/2 ,dx/2 ,dy-1-dy/8,dy-1,bp,cs,1) == 1 + && get_bw(dx/2-1,dx/2-1,dy-1-dy/8,dy-1,bp,cs,1) == 1 ) Break; // ~B + ya=0; /* upper end, not 0 for modified A etc. */ + if (box1->modifier) + for (ya=0;ya=dy/2) ya=0; // already subtracted? + if( num_cross(0,dx-1,ya+ 1 ,ya+ 1 ,bp,cs)!=1 // 600dpi + && num_cross(0,dx-1,ya+ dy/8 ,ya+ dy/8 ,bp,cs)!=1 + && num_cross(0,dx-1,ya+ dy/16 ,ya+ dy/16 ,bp,cs)!=1 + && num_cross(0,dx-1,ya+ dy/8+1,ya+ dy/8+1,bp,cs)!=1 ) Break; + if( num_cross(0,dx-1, 7*dy/8 , 7*dy/8 ,bp,cs)!=2 + && num_cross(0,dx-1, 7*dy/8-1, 7*dy/8-1,bp,cs)!=2 ) Break; + if ( num_cross( 0,dx/8,ya+dy/8,ya+0,bp,cs)>0 ) Break; // ~R + for(y=ya+dy/8;y 1 ) break; + if( y==ya+dy/2 ) Break; i1=y; + if (dy>20) i1++; /* get arround some noise fat font */ + + x =loop(bp,0,i1,dx,cs,0,RI); if(x>3*dx/4) Break; + x+=loop(bp,x,i1,dx,cs,1,RI); if(x>3*dx/4) Break; i2=x; + x+=loop(bp,x,i1,dx,cs,0,RI); if(x<3*dx/8) Break; i2=(x+i2)/2; + // hole (i2,i1) + y+=loop(bp,i2,y,dy,cs,1,DO); + y+=loop(bp,i2,y,dy,cs,0,DO); if(y>3*dy/4) ad=ad*99/100; + if (y>5*dy/6) { MSG(fprintf(stderr,"x,y,i1,i2= %d %d %d %d",x,y,i1,i2);) } + if (y>5*dy/6) Break; + + if( sdata->holes.num != ((box1->modifier==RING_ABOVE)?2:1) + || sdata->holes.hole[0].y1-ya >= dy-1-dy/4) Break; + // if( num_hole ( x0, x1, y0, y1-dy/4 ,box1->p,cs,NULL) != 1 ) Break; + // out_x(box1); + i3=0;i4=0; + for(x=dx/3;x<2*dx/3;x++){ + i4=num_cross(i2,x,y ,dy-1,bp,cs);if(i4<1 || i4>2) + i4=num_cross(i2,x,y+dy/16,dy-1,bp,cs);if(i4<1 || i4>2) break; + if(i4==1) i3=x; + } if(i4<1 || i4>2 || i3==0){ +// ToDo: MSG(fprintf(stderr,"x,y,i4,i3= %d %d %d %d",x,y,i4,i3);) + Break; + } + if( get_bw(dx-1-dx/4, dx-1, dy-1-dy/4, dy-1, bp,cs,1) != 1 ) Break; + + i1=loop(bp,dx-1,ya+ (dy-ya)/4,dx,cs,0,LE); + i2=loop(bp,dx-1,ya+ (dy-ya)/2,dx,cs,0,LE); + i3=loop(bp,dx-1,dy-1-(dy-ya)/4,dx,cs,0,LE); + if( 2*i2-dx/8>i1+i3 ) ad=99*ad/100; /* 6*8 font */ + if( 2*i2+dx/4i1+i3 ) Break; + + i1=loop(bp,0 ,ya+ (dy-ya)/4,dx,cs,0,RI); // linke senkr. linie + i2=loop(bp,0 ,ya+ (dy-ya)/2,dx,cs,0,RI); + i3=loop(bp,0 ,dy-1-(dy-ya)/4,dx,cs,0,RI); + if( 2*i2-dx/8>i1+i3 ) ad=98*ad/100; /* 6*8 font */ + if( 2*i2+dx/4i1+i3 || i1i3+dx/16) break; if( i1+120) ad=97*ad/100; // italic-a + + if (!hchar) ad=99*ad/100; // italic-a + Setac(box1,'A',ad); + break; + } + // --- test a ------------------------------------------- + // with a open bow above the circle starting + // on the right side of the circle + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='a'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 , x0+dx/2, y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/3, x1 , y0+dy/3, y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/3, x1 , y0+dy/4, y0+dy/4,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2, y1-dy/3, y1, box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2, y0 , y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/3, x1-dx/3, y0 , y0 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/4, x1-dx/2, y1 , y1 ,box1->p,cs,1) != 1 ) + if( get_bw(x0+dx/4, x1-dx/3, y1-1 , y1-1 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0 , x0 , y0+dy/2, y1 ,box1->p,cs,1) != 1 ) + if( get_bw(x0+dx/8, x0+dx/8, y0+dy/2, y1 ,box1->p,cs,1) != 1 ) Break; + if( loop(bp,3*dx/8,0,dy,cs,0,DO) > 3*dy/16 ) Break; // ~d + if( num_cross(0,dx-1,dy/4 ,dy/4 , bp,cs) >2 // ~glued am != an + && num_cross(0,dx-1,dy/4+1,dy/4+1, bp,cs) >2 ) Break; + + for( x=dx/4;xdy/2) break; + i=loop(bp,x,dy-1,y1-y0,cs,0,UP); if (i>dy/2) break; + } if( xy-1, bp,cs) == 3 ) i--; + } if( i ) Break; + + i1=loop(bp,0, dy/8,dx,cs,0,RI); + i3=loop(bp,0,3*dy/4,dx,cs,0,RI); + for(y=dy/8+1;y<3*dy/4;y++){ + i2=loop(bp,0,y,dx,cs,0,RI);if(2*i2>i1+i3+1) break; + } if(y==3*dy/4) Break; // ~6 + // ~ s (small thick s), look for vertikal line piece + for(x=3*dx/4;xdy/4 ) break; + if( x==dx ) Break; + + if (sdata->holes.num != 1) ad=96*ad/100; else + if (sdata->holes.num == 1) + if( num_hole ( x0, x1, y0+dy/3, y1 ,box1->p,cs,NULL) != 1 ) Break; + // if( num_hole ( x0, x1, y0, y1, box1->p,cs,NULL) != 1 ) Break; + if( num_hole ( x0, x1, y0, y1-dy/3 ,box1->p,cs,NULL) != 0 ){ + i =loop(bp,0,dy/4,dx,cs,0,RI); + i =loop(bp,i,dy/4,dx,cs,1,RI); + if(ii) Break; // ~ 8 + } + /* test for horizontal symmetry ~8 */ + for (y=0;y3 && dy>3;){ // min 4x4 + DBG( wchar_t c_ask='a'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/2 , y1, box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/3 , x0+dx/3,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + i = loop(bp,dx/2, 0 ,dy,cs,0,DO); if (i>dy/4) Break; + i+= loop(bp,dx/2, i ,dy,cs,1,DO); if (i>dy/2) Break; + i = loop(bp,dx/2, i ,dy,cs,0,DO); if (ip,cs,1) == 1 ) Break; + + if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) != 2 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND + if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; + i = loop(bp,dx/2,dy-1 ,dy,cs,0,UP); if (i>dy/3) Break; + y = i+loop(bp,dx/2,dy-1-i,dy,cs,1,UP); if (i>dy/2) Break; + // normal 'a' has a well separated vertical line right from the circle + // but fat 'a' is like a 'o', only bigger on the right side + if( num_cross(x0+dx/2-1,x1,y1 ,y1 ,box1->p,cs) < 2 /* 4x6font */ + && num_cross(x0+dx/2-1,x1,y1-i,y1-i ,box1->p,cs) < 2 /* 2 or 3 */ + && num_cross(x0+dx/2-1,x1,y1-y,y1-y ,box1->p,cs) < 2 ) + { if (loop(bp, 0,dy-1-dy/16,dx,cs,0,RI) + <4*loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE)) { Break;} + else ad=98*ad/100; + } + if( num_cross(x0,x1,y0+dy/2 , y0+dy/2,box1->p,cs) < 2 + || num_cross(x0,x1,y0+dy/3 , y0+dy/3,box1->p,cs) < 2 ) Break; // Jun00 + + if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/4,box1->p,cs) != 1 ) + if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/4,box1->p,cs) != 1 ) Break; + if (sdata->holes.num != 1) + if( num_hole(x0,x1-2,y0 ,y1 ,box1->p,cs,NULL) != 1 ) + // if( num_hole(x0,x1 ,y0 ,y1 ,box1->p,cs,NULL) != 1 ) + Break; + if( num_hole(x0,x1 ,y0+dy/3,y1-1 ,box1->p,cs,NULL) != 0 ) Break; + + if( loop(bp,0 ,0 ,x1-x0,cs,0,RI)<= + loop(bp,0 ,2 ,x1-x0,cs,0,RI) ) Break; + + if( loop(bp,dx-1,dy-1,x1-x0,cs,0,LE)> dx/4 + && loop(bp,dx-1,dy-2,x1-x0,cs,0,LE)> (dx+4)/8 ) ad=97*ad/100; + + x=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); + i=loop(bp,dx-1, dy/4,dx,cs,0,LE); if (abs(x-i)>dx/4) Break; + + for( x=dx/4;xdy/2) break; + i=loop(bp,x,dy-1,y1-y0,cs,0,UP); if (i>dy/2) break; + } if( xp,cs) == 1 ) + if( num_cross(x0 , x1, y0, y0,box1->p,cs) == 1 ) + if( loop(bp,dx-1, 0,y1-y0,cs,0,DO)> dy/4 + && loop(bp,dx-1,dy-1,y1-y0,cs,0,UP)> dy/4 ) Break; // ~o + if( loop(bp,dx/2,dy-1,y1-y0,cs,0,UP)> dy/4 ) Break; // ~q + + if (hchar) ad=98*ad/100; + if (gchar) ad=98*ad/100; + // handwritten-a (alpha) + Setac(box1,'a',ad); + break; + } + // --- test A_A_WITH_OGONEK 0x0104 Centr.Eur.Font ------------------------- + /* not sure if we should move this to a get_CentralEuropean-function */ + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='A'; ) + if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ + // first selection (grobes Sieb) + if( get_bw(dx/2,dx/2,dy-1-dy/8,dy-1,bp,cs,1) == 1 ) break; // ~B + if( num_cross(0,dx-1, 1 , 1 ,bp,cs)!=1 // 600dpi + && num_cross(0,dx-1, dy/8 , dy/8 ,bp,cs)!=1 + && num_cross(0,dx-1, dy/16 , dy/16 ,bp,cs)!=1 + && num_cross(0,dx-1, dy/8+1, dy/8+1,bp,cs)!=1 ) break; + if( num_cross(0,dx-1, dy-1 , dy-1 ,bp,cs)!=1 ) break; + if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs)!=2 + && num_cross(0,dx-1, dy/3 , dy/3 ,bp,cs)!=2 ) break; + if ( num_cross( 0,dx/8,dy/8, 0,bp,cs)>0 ) break; // ~R + for(y=dy/8;y 1 ) break; + if( y==dy/2 ) break; i1=y; + if (dy>20) i1++; /* get arround some noise fat font */ + + x =loop(bp,0,i1,dx,cs,0,RI); if(x>3*dx/4) break; + x+=loop(bp,x,i1,dx,cs,1,RI); if(x>3*dx/4) break; i2=x; + x+=loop(bp,x,i1,dx,cs,0,RI); if(x<3*dx/8) break; i2=(x+i2)/2; + // hole (i2,i1) + y+=loop(bp,i2,y,dy,cs,1,DO); + y+=loop(bp,i2,y,dy,cs,0,DO); if(y>3*dy/4) ad=ad*99/100; + if (y>5*dy/6) break; + + if( sdata->holes.num != 1 || sdata->holes.hole[0].y1 >= dy-1-dy/4) break; + // if( num_hole ( x0, x1, y0, y1-dy/4 ,box1->p,cs,NULL) != 1 ) break; + // out_x(box1); + i3=0;i4=0; + for(x=dx/3;x<2*dx/3;x++){ + i4=num_cross(i2,x,y ,dy-1,bp,cs);if(i4<1 || i4>2) + i4=num_cross(i2,x,y+dy/16,dy-1,bp,cs);if(i4<1 || i4>2) break; + if(i4==1) i3=x; + } if(i4<1 || i4>2 || i3==0){ +// ToDo: g_debug_A(printf(" A: x,y,i4,i3= %d %d %d %d\n",x,y,i4,i3);) + break; + } + if( get_bw(dx-1-dx/4, dx-1, dy-1-dy/4, dy-1, bp,cs,1) != 1 ) break; + /* dy/4 changed to dy/6 because of screenfonts */ + /* there are strange fonts, one has a serif on the upper end of A */ + if ( num_cross( 0,dx/8,dy/6, 0,bp,cs)>0 ) break; + if ( num_cross(dx-1-dx/4,dx-1, 0,dy/6,bp,cs)>0 ) break; + + i1=loop(bp,dx-1, dy/4,dx,cs,0,LE); + i2=loop(bp,dx-1, dy/2,dx,cs,0,LE); + i3=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); + if( 2*i2+dx/4i1+i3 ) break; + + i1=loop(bp,0 , dy/4,dx,cs,0,RI); // linke senkr. linie + i2=loop(bp,0 , dy/2,dx,cs,0,RI); + i3=loop(bp,0 ,dy-1-dy/4,dx,cs,0,RI); + if( 2*i2+dx/4i1+i3 || i1i3+dx/16) break; if( i1+12c; +} + +static wchar_t ocr0_cC(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,i4,i5,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad,t1; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test c,C --------------------------------------------------- + for(ad=d=100;dx>2 && dy>2;){ // min 3x4 + DBG( wchar_t c_ask='c'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 , x0+dx/3,y0+dy/2, y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2,y1-dy/3, y1, box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2,y0 , y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( num_cross(x0,(x0+x1)/2,(y0+y1)/2,(y0+y1)/2,box1->p,cs) > 1 ) Break; // ~ocr-a-[ + + for(y=y0+dy/4;yp,cs,1) == 0 ) break; + if( y==y0+3*dy/4 ) Break; i1=y; // i1: upper end of right gap + + // measure thickness of line! + t1=loop(bp, 0,dy/2,dx,cs,0,RI); + t1=loop(bp,t1,dy/2,dx,cs,1,RI); + if (t1>dx/2) Break; + + for(y=i1,i2=0,x=x0+dx/2;xp,x0+dx/2,i1,dy,cs,0,DO); + if( i>i2 ) { i2=i; } + } if(i2p,x0+5*dx/8,i1,dy,cs,0,UP); + i =y+1-loop(box1->p,x0+4*dx/8,i1,dy,cs,0,UP); if(iy0+ dy/4+t1/2) Break; // highest + + for(y=i1;yp,cs,1) == 1 ) break; + if( y-i1p,cs) < 1 ) Break; // ~L + if (loop(box1->p,x0,y0+3*dy/4,dx,cs,0,RI)>dx/16) + if( num_cross(x0+dx/2,x1,i3 ,y1,box1->p,cs) < 1 + && num_cross(x0+dx/2,x1,y1-dy/4,y1,box1->p,cs) < 1 ) Break; // ~r + + i=1; + for(x=dx/2;x=cs + && getpixel(bp,x+1,y )< cs + && getpixel(bp,x+1,y-1)< cs + && getpixel(bp,x ,y-1)< cs ) { i=0;break; } + } + if(!i) ad=95*ad/100; // ~G + + i=loop(bp,0,dy/2,dx,cs,0,RI); + for(y=0;y=dy/4;y--){ + x =loop(bp,0,y,dx,cs,0,RI); + x+=loop(bp,x,y,dx,cs,1,RI); if(x>i5) i5=x; + i =loop(bp,x,y,dx,cs,0,RI); if(ii4+dx/32 ) break; // unusual for c, more a bad e? + } if( y>=dy/4 ) Break; + + if( !hchar ){ // test for e where the middle line is partly removed + x= loop(bp,0,dy/2,dx,cs,0,RI); + x=x +loop(bp,x,dy/2,dx,cs,1,RI); + y=dy/2-loop(bp,x,dy/2,dy,cs,0,UP)-1; + i=x +loop(bp,x,y,dx,cs,1,RI); + i=i +loop(bp,i,y,dx,cs,0,RI); + if( num_cross(x ,x ,1,dy/2,bp,cs) > 1 + || num_cross(x+1,x+1,1,dy/2,bp,cs) > 1 ) + if( num_cross(i-1,i-1,1,dy/2,bp,cs) > 1 + || num_cross(i ,i ,1,dy/2,bp,cs) > 1 ) Break; // ~bad e + } + if( dy>16 && dy>3*dx && hchar ){ // ~[ + x= loop(bp,0, dy/16,dx,cs,0,RI); + x=+loop(bp,0,dy-1-dy/16,dx,cs,0,RI); + i= loop(bp,0, dy/2 ,dx,cs,0,RI)*2; + if( i>=x ) + if( num_cross(0,dx-1,dy/4,dy/4,bp,cs) < 2 ) Break; + + } + if( get_bw(x0,x0,y0 ,y1 ,box1->p,cs,2) != 2 + && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 + && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 + && get_bw(x1,x1,y0+1,y1-1,box1->p,cs,1) != 1 ) Break; /* ~[ */ + + x =loop(bp, 0,dy/2,dx,cs,0,RI); + i =loop(bp,dx-1,dy/2,dx,cs,0,LE); + if( (i7 ) + if( loop(bp, 0,7*dy/8,dx,cs,0,RI) > x+dx/8 + && loop(bp, 0, dy/8,dx,cs,0,RI) > x+dx/8 + && loop(bp,dx-1,dy-1-dy/ 8,dx,cs,0,LE) + > loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE) + && loop(bp,dx-1, dy/ 8,dx,cs,0,LE) + > loop(bp,dx-1, dy/16,dx,cs,0,LE) ) Break; // ~( + +// printf(" hchar=%d i1=%d i2=%d %d\n",hchar,i1-y0,i2-y0,9*dy/16); + // ~G without characteristic crotchet + if (hchar && dy>15 && dx>7 && i2-y0<9*dy/16 && i1-y0<=dy/4) + if ( loop(bp,5*dx/8,i2-y0,dy,cs,0,DO) > 2*dy/8 ){ + Setac(box1,'G',90); + Break; + } + + if (hchar){ + i=1; + for(x=dx/2;x=cs + && getpixel(bp,x+1,y )< cs + && getpixel(bp,x+1,y-1)< cs + && getpixel(bp,x ,y-1)< cs ) { i=0;break; } + } + if (i) ad=98*ad/100; // ~( + if (dy>2*dx) ad=99*ad/100; + } + if( loop(bp,dx-1,dy/2,dx,cs,0,LE) < 6*dx/8 ) ad=98*ad/100; + + i= loop(bp,dx-1,dy/16,dx,cs,0,LE); + j= loop(bp,dx/2,0 ,dy,cs,0,DO); + if (i>=dx/2 && j>dy/8 && j>2 && j=3*dx && dy>12) ad=99*ad/100; // ( + i= loop(bp,dx-1,dy-1,dy,cs,0,UP); + j= loop(bp,dx/2,dy-1,dy,cs,0,UP); + if (i==0 && j>dy/8) ad=95*ad/100; // < + i= loop(bp,dx-1, 0,dy,cs,0,DO); + j= loop(bp,dx/2, 0,dy,cs,0,DO); + if (i==0 && j>dy/8) ad=95*ad/100; // < + if (loop(bp,0,dy-1-dy/8,dx,cs,0,RI)>= 3*dx/4) ad=98*ad/100; // < + if (loop(bp,0,dy-1-dy/8,dx,cs,0,RI)>=(dx+1)/2) ad=98*ad/100; // < + if (loop(bp,0, dy/8,dx,cs,0,RI)>=dx/2) ad=98*ad/100; // < + + if (gchar) ad=98*ad/100; // could happen for 5x7 font + bc=((hchar)?'C':'c'); + Setac(box1,bc,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_lL(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i0,i1,i2,i3,i4,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test L --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='L'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + i=loop(bp,dx-1,dy/2,dx,cs,0,LE); + if (i<3 && dy>8) {Break;} + if (ip,x0 ,y,dx,cs,0,RI); + j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>i ){ i=j;i1=y; } + } if( i<3*dx/4 ) Break; i1=i; // length of horizontal line + // line thickness (i2) + i=loop(box1->p,x0 ,y0+dy/2,dx,cs,0,RI); if( i>dx/2 ) Break; + j=loop(box1->p,x0+i,y0+dy/2,dx,cs,1,RI); if( i+j>dx/2 ) Break; i2=j; + if (loop(bp,dx-1, 0,dx,cs,0,LE)dx/2 + && loop(bp, 0,5*dy/8,dx,cs,0,RI)p,x0 ,y,dx,cs,0,RI); + if ( j>(dx+2)/4+(y1-dy/4-y)*dx/2/dy ) { i=0; break; } + x=loop(box1->p,x0+j,y,dx,cs,1,RI); + if( ((x>i2+1 || 4*x<3*i2) && y>y0+dy/8) || 4*x>3*i1 ) i=0; + } if( !i ) Break; + if( num_cross(0, dx-1-dx/8, dy-1-dy/2, dy-1-dy/2,bp,cs) != 1 ) Break; + if( num_cross(0, dx-1 , dy/3 , dy/3,bp,cs) != 1 ) Break; + if( num_cross(0, dx-1 , dy/8 , dy/8,bp,cs) != 1 ) Break; + if (loop(bp,0,dy-1,dx,cs,0,RI) + -loop(bp,0,dy-3,dx,cs,0,RI)>1+dx/16) ad=96*ad/100; // ~c + if (loop(box1->p,x0+dx/4,y1,dy,cs,0,UP)>1+dy/16) ad=99*ad/100; // ~4 + + if ( gchar) ad=98*ad/100; + if (!hchar) ad=99*ad/100; + if (5*dx<2*dy && loop(box1->p,x0,y1,dx,cs,0,RI)>dx/4) ad=99*ad/100; // ~l + Setac(box1,'L',ad); + break; + } + // --- test l --------------------------------------------------- + // recognize a "l" is a never ending problem, because there are lots of + // variants and the char is not very unique (under construction) + // --- test italic l --------------------------------------------------- + // --- test l ~italic (set flag-italic) -------------------------------- + // if unsure d should be multiplied by 80..90% + for(ad=d=100; dy>dx && dy>5;){ // min 3x4 + DBG( wchar_t c_ask='l'; ) + if( box1->dots>0 ) Break; + if( num_cross(0, dx-1,dy/2,dy/2,bp,cs) != 1 + || num_cross(0, dx-1,dy/4,dy/4,bp,cs) != 1 ) Break; + // mesure thickness + for(i1=0,i2=dx,y=dy/4;yi1 ) { i1=j; } // thickest + if( j2*i2 ) Break; + if(box1->m3 && dy<=box1->m3-box1->m2) ad=94*ad/100; + if( box1->m2-box1->m1>1 && y0>=box1->m2 ) ad=94*ad/100; + for(i0=0,i3=0,y=0;yi3 ) { i3=j; } // widest space + j = loop(bp,j,y,dx,cs,1,RI); + if( j>i0 ) { i0=j;i3=0; } // thickest + } + if ( i0>4*i2 || 3*i3>2*dx) + if ( loop(bp,dx-1,dy-1,dx,cs,0,LE)>3*dx/8 + || loop(bp, 0,dy-1,dx,cs,0,RI)>3*dx/8) Break; // ~7 + + // detect serifs + x =loop(bp,0, 0,dx,cs,0,RI); + i3=loop(bp,x, 0,dx,cs,0,RI); + x =loop(bp,0, 1,dx,cs,0,RI); + x =loop(bp,x, 1,dx,cs,0,RI); if(x>i3) i3=x; + x =loop(bp,0,dy-1,dx,cs,0,RI); + i4=loop(bp,x,dy-1,dx,cs,0,RI); + x =loop(bp,0,dy-2,dx,cs,0,RI); + x =loop(bp,x,dy-2,dx,cs,0,RI); if(x>i4) i4=x; + if( i3>i1+dx/8+1 && i4>i1+dx/8+1 ) Break; // ~I + + for(i=dx,j=0,y=1;yi+1) break; i=x; + if( num_cross(0,dx-1,y ,y ,bp,cs)==2 + && num_cross(0,dx-1,y+1+dy/32,y+1+dy/32,bp,cs)==2 ) j=1; + } if ( y3) + if( get_bw(dx-1-dx/8,dx-1,0,dy/6,bp,cs,1) != 1 ) + if( get_bw(dx-1-dx/8,dx-1,0,dy/2,bp,cs,1) == 1 ) Break; + + if( get_bw(dx-1-dx/8,dx-1,dy/4,dy/3,bp,cs,1) != 1 ) // large I ??? + if( get_bw(0 ,dx/8,dy/4,dy/3,bp,cs,1) != 1 ) + if( get_bw(dx-1-dx/8,dx-1,0 ,dy/8,bp,cs,1) == 1 ) + if( get_bw(0 ,dx/8,0 ,dy/8,bp,cs,1) == 1 ) ad=ad*97/100; + if( get_bw(dx-1-dx/8,dx-1,dy/2,dy-1,bp,cs,1) != 1 ) // r ??? + if( get_bw(0 ,dx/8,dy/2,dy-1,bp,cs,1) == 1 ) + if( get_bw(dx-1-dx/8,dx-1,0 ,dy/3,bp,cs,1) == 1 ) + if( get_bw(0 ,dx/8,0 ,dy/3,bp,cs,1) == 1 ) Break; + + for( y=1;y<12*dy/16;y++ ) + if( num_cross(0, dx-1, y , y ,bp,cs) != 1 // sure ? + && num_cross(0, dx-1, y-1, y-1,bp,cs) != 1 ) break; + if( y<12*dy/16 ) Break; + + if(dx>3){ + for( y=dy/2;yy-1-5*dy/16;y>=dy/5;y--){ // rechts abfallende Kante/Knick? + i=loop(bp,bp->x-1,y,x1-x0,cs,0,LE); + if( i-2-dx/16>=x ) break; + if( i=dy/5 ) Break; + + // test ob linke Kante gerade + for(x=0,y=bp->y-1-dy/5;y>=dy/5;y--){ // rechts abfallende Kante/Knick? + i=loop(bp,0,y,x1-x0,cs,0,RI); + if( i+2+dx/16x ) x=i; + } + if (y>=dy/5 ) Break; + if (box1->m4 && y1m4) + if ( get_bw(x0,x1,y1+1,box1->m4+dy/8,box1->p,cs,1) == 1 ) + ad=ad*97/100; // unsure !l| + i=loop(bp,dx-1,dy/16,dx,cs,0,LE); + j=loop(bp,dx-1,dy/2 ,dx,cs,0,LE); + if( i>3 && j>3 ) + if( get_bw(dx-1-i/2,dx-1-i/2,0,dy/2,bp,cs,1) == 1 ) Break; // ~t + + for(y=5*dy/8;y8 + && loop(bp, 0,3*dy/4,dx,cs,0,RI)>=dx/4 + && loop(bp, 0,7*dy/8,dx,cs,0,RI)<=dx/8 + && loop(bp,dx-1,3*dy/4,dx,cs,0,LE)<=dx/8 + && loop(bp,dx-1,7*dy/8,dx,cs,0,LE)<=dx/8 ) Break; // ~J + + if ( 2*i3>5*i1 ) // hmm \tt l can look very similar to 7 + if ( loop(bp,0,dy/4,dx,cs,0,RI)>dx/2 + && get_bw(0,dx/8,0,dy/4,bp,cs,1) == 1 ) Break; // ~7 + + if ( loop(bp,dx-1,dy/2,dx,cs,0,LE)>dx/2 + && get_bw(3*dx/4,dx-1,3*dy/4,dy-1,bp,cs,1) == 1) { + if (loop(bp,0,dy-1,dx,cs,0,RI)2*dy) ad=99*ad/100; // ~L + if(5*dx>3*dy) ad=99*ad/100; // ~L + } + if(!hchar){ // right part (bow) of h is never a l + if( get_bw(dx/4,dx/4, 0,dy/4,bp,cs,1) == 1 + && get_bw(dx/4,dx/4,dy/2,dy-1,bp,cs,1) == 0 ) Break; + } + if( dx>3 && dy>3*dx ) + if( loop(bp,dx/4,dy-1 ,dy,cs,0,UP)< dy/4 + && loop(bp, 0,dy-1-dy/8,dx,cs,0,RI)>=dx/2 + && loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)<=dx/4 ){ + ad=98*ad/100; // ~] + if ( loop(bp,dx-1,dy/2,dx,cs,0,LE)==0 ) Break; + } + + for(x=0;xi ) break; + } + if( x>=loop(bp,0,y+1,dx,cs,0,RI) ) + if( loop(bp,0 ,0,dy,cs,0,DO)>1 ) + if( loop(bp,0 ,0,dy,cs,0,DO) + - loop(bp,dx/16+1,0,dy,cs,0,DO) < dx/16+1 ) Break; // ~1 Jul00,Nov00 + if( num_cross(0,dx/2,y-1,y-1,bp,cs)==2 ) Break; // ~1 + } + if(dx<8 && dy<12){ // screen font + i= loop(bp,0,0,dy,cs,0,DO); + if( loop(bp,dx/2,1,dy,cs,1,DO)>=dy-2 + && loop(bp,0,dy/2,dx,cs,0,RI)>=2 + && i>1 && ip,cs,2) != 2 + && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 + && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 + && get_bw(x0,x0+dx/4,y0+1+dy/16,y1-1-dy/16,box1->p,cs,1) != 1 ) Break; /* ~] */ + i=loop(bp,dx-1,dy/2,dx,cs,0,LE); + if( loop(bp, 0,dy/2,dx,cs,0,RI)>=dx/2 + && (ip,cs,2) != 2 + && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 + && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 + && get_bw(x1-dx/4,x1,y0+1+dy/16,y1-1-dy/16,box1->p,cs,1) != 1 ) Break; /* ~[ */ + + x =loop(bp, 0,dy/2,dx,cs,0,RI); // konvex/konkav? ~() + i =loop(bp,dx-1,dy/2,dx,cs,0,LE); + if( loop(bp, 0,7*dy/8,dx,cs,0,RI) > x+dx/8 + && loop(bp, 0, dy/8,dx,cs,0,RI) > x+dx/8 + && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) < i-dx/8 + && loop(bp,dx-1, dy/8,dx,cs,0,LE) < i-dx/8 ) Break; // ~( + if( loop(bp, 0,7*dy/8,dx,cs,0,RI) < x-dx/8 + && loop(bp, 0, dy/8,dx,cs,0,RI) < x-dx/8 + && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) > i+dx/8 + && loop(bp,dx-1, dy/8,dx,cs,0,LE) > i+dx/8 ) Break; // ~) + + i= loop(bp, 0, 0,dy,cs,0,DO); // horizontal line? + if(dy>=12 && i>dy/8 && iloop(bp,dx-1, i,dx,cs,0,LE) + || loop(bp,dx-1,3*dy/16,dx,cs,0,LE)-dx/8 + >loop(bp,dx-1, i+1,dx,cs,0,LE) ) + if( loop(bp,dx-1,8*dy/16,dx,cs,0,LE)-dx/8 + >loop(bp,dx-1, i,dx,cs,0,LE) + || loop(bp,dx-1,8*dy/16,dx,cs,0,LE)-dx/8 + >loop(bp,dx-1, i+1,dx,cs,0,LE) ) + if( loop(bp, 0,3*dy/16,dx,cs,0,RI)-dx/8 + >loop(bp, 0, i,dx,cs,0,RI) + || loop(bp, 0,3*dy/16,dx,cs,0,RI)-dx/8 + >loop(bp, 0, i+1,dx,cs,0,RI) ) + if( loop(bp, 0,8*dy/16,dx,cs,0,RI)-dx/8 + >loop(bp, 0, i,dx,cs,0,RI) + || loop(bp, 0,8*dy/16,dx,cs,0,RI)-dx/8 + >loop(bp, 0, i+1,dx,cs,0,RI) ) Break; // ~t + if( loop(bp, 0,i-1,dx,cs,0,RI)>1 && dx<6 ) Break; // ~t + if( loop(bp, 0,8*dy/16,dx,cs,0,RI)>dx/8 + && loop(bp, 0, i,dx,cs,1,RI)>=dx-1 + && loop(bp,dx-1,8*dy/16,dx,cs,0,LE)>dx/8 + && loop(bp,dx-1, i-1,dx,cs,0,LE)>dx/8 ) Break; // ~t + } +// if( vertical_detected && dx>5 ) + if( loop(bp,0, 1,dx,cs,0,RI)>=dx/2 + && ( loop(bp,0,dy-2,dx,cs,0,RI)<=dx/8 + || loop(bp,0,dy-1,dx,cs,0,RI)<=dx/8 ) ) + if( ( loop(bp,dx-1, 0,dx,cs,0,LE)<=dx/8 + || loop(bp,dx-1, 1,dx,cs,0,LE)<=dx/8 ) + && loop(bp,dx-1,dy-2,dx,cs,0,LE)>=dx/2 ) ad=98*ad/100; // ~/ + + if( get_bw(x0,x1,y0,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; + + if (!hchar || loop(bp,0,dy/4,dx,cs,0,RI)>dx/2){ // ~z + i=loop(bp,0,dy/16 ,dx,cs,0,RI); + i=loop(bp,i,dy/16 ,dx,cs,1,RI); j=i; + i=loop(bp,0,dy/16+1,dx,cs,0,RI); + i=loop(bp,i,dy/16+1,dx,cs,1,RI); if (i>j) j=i; + i=loop(bp,0,dy/16+2,dx,cs,0,RI); + i=loop(bp,i,dy/16+2,dx,cs,1,RI); if (i>j) j=i; + if (j*4>=dx*3) ad=98*ad/100; // ~z + if (j*8>=dx*7) ad=96*ad/100; // ~z + } + + if( get_bw(x0,x0,y1,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; + if( get_bw(x1,x1,y1,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; + if (ad==100) ad--; /* I have to fix that: + .@@@@.<- + @@..@@ + ....@@ + ....@@< + ...@@. + ..@@@. + ..@@.. + .@@... + @@.... + @@@@@@<- + */ + if(!hchar) ad=ad*99/100; + if( gchar) ad=ad*99/100; + Setac(box1,'l',ad); +// if( i<100 ) Break; ???? +// if( loop(bp,0, 1,dx,cs,0,RI)<=dx/8 +// && loop(bp,0,dy/2,dx,cs,0,RI)<=dx/8 +// && loop(bp,0,dy-2,dx,cs,0,RI)<=dx/8 ) vertical_detected=1; + break; + } + return box1->c; +} + +static wchar_t ocr0_oO(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test o,O --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='o'; ) + if (sdata->holes.num !=1 ) Break; + if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/2 , y1, box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/2 , y1-dy/3,box1->p,cs,1) != 0 ) Break; + if (sdata->holes.hole[0].y0 > dy/3 + || sdata->holes.hole[0].y1 < dy-1-dy/3) Break; + + if( num_cross(x0+dx/2 ,x0+dx/2 ,y0, y1 ,box1->p,cs) != 2 + && num_cross(x0+dx/2+1,x0+dx/2+1,y0, y1 ,box1->p,cs) != 2 ) Break; + if( num_cross(x0+dx/3,x1-dx/4,y0 , y0 ,box1->p,cs) != 1 ) // AND + if( num_cross(x0+dx/3,x1-dx/4,y0+1 , y0+1,box1->p,cs) != 1 ) Break; + if( num_cross(x0+dx/4,x1-dx/3,y1 , y1 ,box1->p,cs) != 1 ) // against "rauschen" + if( num_cross(x0+dx/4,x1-dx/3,y1-1 , y1-1,box1->p,cs) != 1 ) Break; + if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + + if( loop(bp,0 ,0 ,x1-x0,cs,0,RI)<= + loop(bp,0 ,2 ,x1-x0,cs,0,RI) ) Break; + + x=loop(bp,dx-1,dy-1-dy/3,x1-x0,cs,0,LE); // should be minimum + for( y=dy-1-dy/3;ydx/8 ) + if( loop(bp,0 , dy/16,dx,cs,0,RI)dx/8 ) + if( loop(bp,0 ,dy-1-dy/16,dx,cs,0,RI)p,cs,1) == 0 + && get_bw(x1-dx/32,x1,y1-dy/32,y1,box1->p,cs,1) == 0 +// && ( get_bw(x0,x0+dx/32,y0,y0+dy/32,box1->p,cs,1) == 1 + && ( get_bw(0,dx/32,0,dy/32,bp,cs,1) == 1 + || get_bw(x0,x0+dx/32,y1-dy/32,y1,box1->p,cs,1) == 1 ) ) Break; // ~D + + // search lowest inner white point + for(y=dy,j=x=0;x 1 ) ad=99*ad/100; // ~a \it a + for(y=0;y 2 ) ad=98*ad/100; // ~a \it a + if (loop(bp,dx-1,dy-1,x1-x0,cs,0,LE)dy/8 + || num_cross(0,dx-1, 0, 0,bp,cs) > 1 + || num_cross(0,dx-1,dy-1,dy-1,bp,cs) > 1 + ) ad=98*ad/100; // ~bq + + if( hchar && 2*y0m1+box1->m2 ) i=1; else i=0; + if (gchar) ad=99*ad/100; + bc='o'; + if( i ){ bc='O'; } + if ( bc=='O' && ad>99) ad=99; /* we can never 100% sure, 0O */ + Setac(box1,bc,ad); + if (bc=='O') Setac(box1,'0',ad); + if (bc=='o') Setac(box1,'0',98*ad/100); + break; + } + return box1->c; +} + +static wchar_t ocr0_pP(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,i4,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test pP --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='p'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( get_bw(0 , dx/2,3*dy/4,3*dy/4,bp,cs,1) != 1 ) Break; + if( get_bw(0 , dx/2, dy/2, dy/2,bp,cs,1) < 1 ) Break; + if( get_bw(dx/4, dx-1, dy/4, dy/4,bp,cs,1) != 1 ) Break; + i= loop(bp,dx-1,3*dy/4,dx,cs,0,LE); if (ip,cs) != 2 ) + if( num_cross(x0+dx/2 ,x0+dx/2 , y0, y1-3*dy/16,box1->p,cs) != 2 ) + if( num_cross(x0+dx/2+1,x0+dx/2+1, y0, y1-3*dy/16,box1->p,cs) != 2 ) Break; + if( num_cross(0,dx-1,7*dy/8 ,7*dy/8 ,bp,cs) != 1 ) + if( num_cross(0,dx-1,7*dy/8-1,7*dy/8-1,bp,cs) != 1 ) Break; + if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs) != 2 ) + if( num_cross(0,dx-1, dy/4-1, dy/4-1,bp,cs) != 3 ) // \it p with nice kurve + if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs) != 2 ) + if( num_cross(0,dx-1, dy/4+1, dy/4+1,bp,cs) != 2 ) Break; + + i= loop(bp,0,dy/2,dx,cs,0,RI); if(i<1) i++; + if( num_cross(i-1,dx-1, dy/4 , dy/4 ,bp,cs) != 2 ) + if( num_cross(i-1,dx-1, dy/4+1, dy/4+1,bp,cs) != 2 ) Break; + + i1= loop(bp, 0,3*dy/8,dx,cs,0,RI); if (i1>=dx/2) ad=90*ad/100; + i2=i1+loop(bp,i1,3*dy/8,dx,cs,1,RI); // upper x-position of v line + i3= loop(bp, 0,7*dy/8,dx,cs,0,RI); + i4=i3+loop(bp,i3,7*dy/8,dx,cs,1,RI); // lower x-position of v line + // out_x(box1);printf(" p:"); + for ( y=dy/8; y<7*dy/8; y++ ){ + x=i2+ (8*y-3*dy)*(i4-i2)/(4*dy); // right limit of line + i= loop(bp,0,y,dx,cs,0,RI); if(i>x+dx/16) break; + } if ( y<7*dy/8 ) Break; + for ( x=0,j=y=dy/3; yx ) { x=i; j=y; } if(x>dx/2) break; + } if ( x=dx) Break; + if( get_bw(3*dx/4,dx-1, y , dy-1,bp,cs,1) == 1 ) Break; + + i=num_hole (x0,x1,y0,y1-dy/5,box1->p,cs,NULL); + // j=num_hole (x0,x1,y0,y1 ,box1->p,cs,NULL); + j=sdata->holes.num; + + if (j!=1 && dx< 8) ad=96*ad/100; + if (j!=1 && dx>=8) ad=98*ad/100; + if (i==0 && j==0) ad=90*ad/100; /* some times there is a small gap */ + if (i>1 || j>1 || j>i) Break; + + // check for serif F + i= loop(bp,bp->x-1, bp->y/4, dx ,cs,0,LE); + i=i+loop(bp,bp->x-1-i,bp->y/4, dx ,cs,1,LE); + j= loop(bp,bp->x-1-i,bp->y/4,3*dy/4,cs,0,DO); + if (j>dy/2) ad=80*ad/100; // its an serif-F + + if( ((!hchar) && (!gchar)) || (hchar && gchar)) ad=95*ad/100; + bc='p'; + if( hchar && ((!gchar) || dy<14)) bc='P'; + if ( hchar && gchar) ad=98*ad/100; // \ss sz + if ((!hchar) && !gchar) ad=98*ad/100; + + Setac(box1,bc,ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_qQ(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad; /* tmp-vars */ + + // --- test Q --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='Q'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( get_bw(x0 ,x0+dx/3,y0+dy/3,y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/3,x1 ,y0+dy/3,y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2,x0+dx/2,y1-dy/3,y1, box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2,x0+dx/2,y0 ,y0+dy/4,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2,x0+dx/2,y0+dy/3,y1-dy/2,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1 ,x1 ,y0 ,y0 ,box1->p,cs,1) == 1 ) Break; //alpha + if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) < 2 ) Break; + if( num_cross(x0+dx/5,x1-dx/5,y0 , y0 ,box1->p,cs) != 1 ) // AND + if( num_cross(x0+dx/5,x1-dx/5,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; + if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + if( get_bw(x1 ,x1 ,y1-dy/8 , y1 ,box1->p,cs,1) == 0 ) + if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + // i=num_hole(x0,x1,y0,y1,box1->p,cs,NULL); + i=sdata->holes.num; + if(!i) Break; + if( i!=1 && (i!=2 || num_hole(x0,x1,y0+dy/2,y1,box1->p,cs,NULL)!=1) ) Break; + x=x1;y=y1; + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,LE,ST); if( xp,&x,&y,x0,x1,y0,y1,cs,ST,LE); + if( x 5*dx/8 ) Break; // ~4 Okt00 + + x= loop(bp,dx-1,3*dy/8,dy,cs,0,LE); if( x>dx/4 ) Break; + if( loop(bp,dx-1-x,0 ,dy,cs,0,DO) + <= loop(bp,dx-2-x,0 ,dy,cs,0,DO) ) Break; // 4 + + if( loop(bp,dx-1,dy-2,dx,cs,0,LE) + <= loop(bp,dx-1,dy/2,dx,cs,0,LE) ) + if( loop(bp, 1,dy-1,dy,cs,0,UP) + <= loop(bp,dx/2,dy-1,dy,cs,0,UP) ) + if( loop(bp, 0,dy-2,dx,cs,0,RI)>dx/2 ) + if( loop(bp, 0, 0,dx,cs,0,RI)>dx/2 ) Break; // 4 + + if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE) + + loop(bp, 0,3*dy/4,dx,cs,0,RI) + < loop(bp,dx-1,2*dy/4,dx,cs,0,LE) + + loop(bp, 0,2*dy/4,dx,cs,0,RI) ) ad=94*ad/100; // 4 + if( loop(bp,0 ,3*dy/4,dx,cs,1,RI) >= dx ) ad=94*ad/100; // 4 + + + if( loop(bp,dx-1,dy/3,dx,cs,0,LE)> dx/4 ) Break; + j=loop(bp,dx/2,dy-1,dy,cs,0,UP); + if (j>1 && j>dy/8) { + if( get_bw(0,dx/2,dy-1-j/2,dy-1-j/2,bp,cs,1) == 1 ) { // ~RA + if (j<5) ad=95*ad/100; + else Break; + } + } + + // italic a + for(i=0,y=0;y 2 ) i++; if(i>dy/8) Break; // ~a \it a + if (i>0) ad=99*ad/100; + + // ~o look at the lower right side for falling line + for(j=x=0,y=dy/2;yx){ x=i; } + if (x-i>j) j=x-i; + if( j>dx/16 ) Break; // falling line detected + } + if (j==0) Break; // no falling line => no Q + if (j<=dx/16) ad=98*ad/100; + if(y1<=box1->m3) ad=98*ad/100; // ~q no underlength! rare + if(!hchar) ad=96*ad/100; + Setac(box1,'Q',ad); + break; + } + // --- test q --------------------------------------------------- + for(ad=d=100;dx>2 && dy>3;){ // min 3x4 + DBG( wchar_t c_ask='q'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + for ( y=y0; 2*y<=y0+y1; y++ ){ // detect ring + if( num_cross(x0,x1, y, y,box1->p,cs) == 2 ) Break; + } if (2*y>y0+y1) Break; /* < */ + for ( y=(y0+y1)/2; y<=y1; y++ ){ // detect vert line + if( num_cross(x0, x1, y, y,box1->p,cs) == 1 + && num_cross(x0,x0+dx/2, y, y,box1->p,cs) == 0 ) Break; + } if (y>y1) Break; /* O (y==y1 for 4x6font-q) */ + for ( x=0,j=y=y0+dy/3; y<=y1-dy/8; y++ ){ // detect baseline + i=loop(box1->p,x0,y,dx,cs,0,RI); + if ( i>x ) { x=i; j=y; } + if ( x>dx/2 ) break; + } if ( x=dx) Break; + if (y1-j+1p,cs) != 0 ) ad=96*ad/100; // ~g + if( loop(box1->p,x0+dx/16,j,dy,cs,0,UP)<1+dy/16 ){ + ad=97*ad/100; + if (hchar || !gchar) Break; // 4 + } + if( loop(box1->p,x0+dx/16,j-dy/32-1,dy,cs,1,RI)>=dx-dx/8 + || loop(box1->p,x0+dx/16,j-dy/16-1,dy,cs,1,RI)>=dx-dx/8 ){ + ad=96*ad/100; // 4 + } + if( get_bw(x1-dx/3, x1, y0+dy/3, y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0, x0+dx/3, y0+dy/3, y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0, x0+dx/4, y1-dy/8, y1-dy/9,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0, x0+dx/4, y1-dy/5, y1-dy/9,box1->p,cs,1) == 1 ) ad=99*ad/100; + if( num_cross(x0+dx/2,x0+dx/2, y0, j ,box1->p,cs) != 2 ) Break; + // if( num_hole (x0 ,x1 , y0, y1 ,box1->p,cs,NULL) != 1 ) + if (sdata->holes.num != 1) + { if (dx<16) ad=98*ad/100; else Break; } + if( num_hole (x0 ,x1 , y0, j ,box1->p,cs,NULL) != 1 ) + { if (dx<16) ad=98*ad/100; else Break; } + // ~\it g + if( loop(bp,0,dy-1-dy/4,dx,cs,0,RI)>5*dx/8 + && get_bw(dx/4,dx/4,dy-1-dy/4,dy-1,bp,cs,1)==1 ) Break; // ~\it g + // what about unsure m1-m4? + if(!gchar){ ad=ad*99/100; } // ~4 + if( hchar){ ad=ad*99/100; } // ~49 + Setac(box1,'q',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_iIjJ(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,i4,i5,hchar=sdata->hchar,gchar=sdata->gchar, + ax,ay,bx,by,cx,cy,ex,ey, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ad,ya,yb,yc,yd,ye,yf,xa,xb, /* tmp-vars */ + (*aa)[4]=sdata->aa; /* the for line ends, (x,y,dist^2,vector_idx) */ + + // --- test i --------------------------------------------------- + // if(box1->dots==1) // what about \it neighbouring ij + for(ad=d=100;dy>3 && dx>0;){ // min 3x4 without dot + DBG( wchar_t c_ask='i'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + // ToDo: ':' check that high of dot is smaller than the vert. line! + /* + * o <== ya + * o + * + * ooo <== yb + * o + * o + * o + * ooo + */ + ya=y0; + if (box1->dots!=1) ad=98*ad/100; + while(dy>3*dx && box1->m2){ // test for vertical i without detected dot + i= loop(bp,dx/2,dy-1 ,dy,cs,0,UP); + if (dy-1-im3-2) break; + i+=loop(bp,dx/2,dy-1-i,dy,cs,1,UP); + // distance upper end to m2 > (m2-m1)/3 + if (3*abs(dy-1-i-box1->m2)>box1->m2-box1->m1) break; + if( get_bw(x0,x1,y0,(box1->m1+box1->m2)/2,box1->p,cs,1) == 1 ) + if( get_bw(x0,x1,y1-i ,y1-i ,box1->p,cs,1) == 0 + || get_bw(x0,x1,y1-i-1,y1-i-1,box1->p,cs,1) == 0 + || get_bw(x0,x1,y1-i-2,y1-i-2,box1->p,cs,1) == 0 ) + { + Setac(box1,'i',ad); + return 'i'; /* beleave me, thats an "i"! */ + } break; + } +// if( box1->dots!=1 ) Break; + if( box1->m2 && 2*y0>=box1->m2+box1->m1 ) ya=box1->m1; + +// out_x(box1); + for (y=ya;2*yp,cs,1) == 1 ) break; + if (2*y>=ya+y1) Break; // hmm, gap only, no dot? + ya=y; + if (box1->m2 && ya>box1->m2+2) Break; + for ( ;2*yp,cs,1) != 1 ) break; + if (2*y>=ya+y1) Break; // hmm no gap + for ( ;2*yp,cs,1) == 1 ) break; + yb=y; + if (5*yb>=3*ya+2*y1) ad=99*ad/100; // large gap + if (2*yb>= ya+ y1) ad=97*ad/100; // very large gap, ~: + if (5*yb>=2*ya+3*y1) Break; // huge gap, ~: + if (loop(bp,dx-1,y+(y1-ya+1)/32,dx,cs,0,LE)>dx/2) // unusual (right part of ouml) + ad=95*ad/100; + + // printf(" num_cross dy/2=%d %d\n",dy/2, num_cross(0,dx-1,dy/2,dy/2,bp,cs)); + // printf(" dots=%d\n",box1->dots); out_x(box1); + // \sl ~f. ! + for (y=y1;y>ya;y--) if( get_bw(x0,x1,y,y,box1->p,cs,1) != 1 ) break; + if (y>(ya+3*y1)/4) Break; + if (y>(ya+2*y1)/3) ad=96*ad/100; + + y=(y1-yb+1)/2+yb-y0; /* only one vertical line, italic i is more an tall S */ + if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) Break; + for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } yc=y; + for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yd=y; + if( yd<3*(y1-yb+1)/4+yb-y0 ) Break; + y=(y1-yb+1)/2+yb-y0; + for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } ye=y; + for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yf=y; + if( yf>(y1-yb+1)/4+yb-y0 ) Break; + if(yd>yc+2){ + xa=loop(bp, 0,yc-1,dx,cs,0,RI); + xb=loop(bp,dx-1,yc-1,dx,cs,0,LE); + if( + xb-loop(bp,dx-1,yc,dx,cs,0,LE) /* Dec00 */ + > xa-loop(bp, 0,yc,dx,cs,0,RI) ){ + y= loop(bp,dx-xb,yc-1,dy,cs,0,DO); + if(y>0){ + i=loop(bp,dx-xb-1,yc-1+y-1,dy,cs,0,DO); + if( i>0 ) y+=i-1; + } + if( yc-1+y < yd-1 ) Break; + } else { + y= loop(bp,11*xa/16,yc-1,dy,cs,0,DO); + if( yc-1+y < yd-2 ) Break; + } + } + if(yf0 ) y+=i-1; + if( ye+1-y > yf+1 ) Break; + } + if( 2*y0 <= box1->m1+box1->m2 + && loop(bp,0, 0,dx,cs,0,RI)+1 + < loop(bp,0,dx/2,dx,cs,0,RI) ) ad=97*ad/100; + + if( gchar ) // i is more often than j, be sure that realy correct Mai00 + if( loop(bp, 0,2*dy/4,dx,cs,0,RI) + -loop(bp,dx-1,2*dy/4,dx,cs,0,LE)>dx/8 ) Break; + + // could be a broken + or similar thing? + if( 3 * ya > box1->m1 + 2*box1->m2 ) ad=90*ad/100; + + if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/2 + && loop(bp,dx-1, dy-1,dx,cs,0,LE)5 && num_cross(x0+dx/2,x0+dx/2, ya, y1 ,box1->p,cs) >= 3 ) + ad=95*ad/100; + + Setac(box1,'i',ad); + break; + } + // --- test j --------------------------------------------------- + // if(box1->dots==1) // what about \it neighbouring ij + for(ad=d=100;dy>4 && dx>0;){ // min 3x4 + DBG( wchar_t c_ask='j'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + ya=y0; + if( box1->m2 && 2*y0>=box1->m2+box1->m1 ) ya=box1->m1; + + for(y=ya;2*yp,cs,1) == 1 ) break; + if(2*y>=ya+y1) Break; // hmm only gap + ya=y; + if( box1->m2 && ya>box1->m2+2 ) Break; + for( ;2*yp,cs,1) != 1 ) break; + if(2*y>=ya+y1) Break; // hmm no gap + for( ;2*yp,cs,1) == 1 ) break; + if(2*y>=ya+y1) Break; // hmm very large gap + yb=y; + if( loop(bp,dx-1,y+(y1-ya+1)/32,dx,cs,0,LE)>dx/2 ) Break; // unusual (right part of ouml) + + // printf(" num_cross dy/2=%d %d\n",dy/2, num_cross(0,dx-1,dy/2,dy/2,bp,cs)); + // printf(" dots=%d\n",box1->dots); out_x(box1); + // \sl ~f. ! + for(y=(ya+y1)/2;y<=y1;y++) if( get_bw(x0,x1,y,y,box1->p,cs,1) != 1 ) break; + if(y<=y1) Break; + + y=(y1-yb+1)/2+yb-y0; /* only one vertical line, italic i is more an tall S */ + if( num_cross(0,dx-1,y,y,bp,cs) >2 ) Break; + for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } yc=y; + for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yd=y; + if( yd<3*(y1-yb+1)/4+yb-y0 ) Break; + y=(y1-yb+1)/2+yb-y0; + for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } ye=y; + for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yf=y; + if( yf>(y1-yb+1)/4+yb-y0 ) Break; + if(yd>yc+2){ + xa=loop(bp, 0,yc-1,dx,cs,0,RI); + xb=loop(bp,dx-1,yc-1,dx,cs,0,LE); + if( + xb-loop(bp,dx-1,yc,dx,cs,0,LE) /* Dec00 */ + > xa-loop(bp, 0,yc,dx,cs,0,RI) ){ + y= loop(bp,dx-xb,yc-1,dy,cs,0,DO); + if(y>0){ + i=loop(bp,dx-xb-1,yc-1+y-1,dy,cs,0,DO); + if( i>0 ) y+=i-1; + } + if( yc-1+y < yd-1 ) Break; + } else { + y= loop(bp,11*xa/16,yc-1,dy,cs,0,DO); + if( yc-1+y < yd-2 ) Break; + } + } + if(yf0 ) y+=i-1; + if( ye+1-y > yf+1 ) Break; + } + if( 2*y0 <= box1->m1+box1->m2 + && loop(bp,0, 0,dx,cs,0,RI)+1 + < loop(bp,0,dx/2,dx,cs,0,RI) ) ad=97*ad/100; + if (loop(bp,0,dy-1,dx,cs,0,RI) + -loop(bp,0,dy-3,dx,cs,0,RI)>1+dx/16) ad=96*ad/100; // ~c + + if( gchar ) // i is more often than j, be sure that realy correct Mai00 + if( loop(bp, 0,2*dy/4,dx,cs,0,RI) + -loop(bp,dx-1,2*dy/4,dx,cs,0,LE)<=dx/8 ) Break; + // could be a broken + or similar thing? + if( 3 * ya > box1->m1 + 2*box1->m2 ) ad=80*ad/100; + if (!gchar) ad=96*ad/100; + if( box1->dots!=1 ) ad=98*ad/100; + + Setac(box1,'j',ad); + + break; + } + // --- test I --------------------------------------------------- + for(ad=d=100;dy>4 && dy>dx && 5*dy>4*(box1->m3-box1->m2);){ // min 3x4 + DBG( wchar_t c_ask='I'; ) + if( box1->dots==1 ) Break; + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + + x =loop(bp,0, dy/2,dx,cs,0,RI); // konvex? divided Q + if(loop(bp,0,7*dy/8,dx,cs,0,RI) > x+dx/8) Break; + for( y=dy/16;y1+dx/8 ) break; + } if( y<3*dy/4 ) Break; + // out_x(box1); + + // upper max width + for(i2=i1=0,y=0;yi1){ i1=x;i2=y; } + } + for(i4=i3=0,y=3*dy/4;yi3){ i3=x;i4=y; } + } + if( abs(i3-i1)>1+dx/8 ) Break; // if i3>>i5 more sure! + if( i1>i5 ){ // look for edges else *80% + } + if(i1+1i2 ) i2=i; + + // printf(" get_line(%d,%d) %d\n",i1,i2, + // get_line2(i1,dy/8,i2,dy-1-dy/8,bp,cs,100)); + if( get_line2(i1,dy/8,i2,dy-1-dy/8,bp,cs,100)<95 ) Break; + x =(i1-i2+4)/8; i1+=x; i2-=x; + + // upper and lower width (what about serifs?) + y=dy/8; + x =loop(bp,i1, y+0,dx,cs,1,LE); i=x; + x =loop(bp,i1, y+1,dx,cs,1,LE); if(x>i)i=x; + x =loop(bp,i1, y+0,dx,cs,1,RI); j=x; + x =loop(bp,i1, y+1,dx,cs,1,RI); if(x>j)j=x; if(abs(i-j)>1+dx/8)Break; + x =loop(bp,i2,dy-y-1,dx,cs,1,LE); j=x; + x =loop(bp,i2,dy-y-2,dx,cs,1,LE); if(x>j)j=x; if(abs(i-j)>1+dx/8)Break; + x =loop(bp,i2,dy-y-1,dx,cs,1,RI); j=x; + x =loop(bp,i2,dy-y-2,dx,cs,1,RI); if(x>j)j=x; if(abs(i-j)>1+dx/8)Break; + + if(dy>15) // v024a4 + if( loop(bp,dx-1,dy/16 ,dx,cs,0,LE) + > loop(bp,dx-1,dy/4 ,dx,cs,0,LE)+1+dx/32 ) Break; // ~bad ) (thinn) + + for(i=0,y=dy/16;y<15*dy/16 && i<2;y++) + if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) i++; + if( i>1 ) Break; + + if(!hchar){ // right part (bow) of h is never a l + if( get_bw(dx/4,dx/4, 0,dy/4,bp,cs,1) == 1 + && get_bw(dx/4,dx/4,dy/2,dy-1,bp,cs,1) == 0 ) Break; + if( loop(bp, 0,dy/4,dx,cs,0,RI)> dx/4 + && loop(bp,dx-1,dy/4,dx,cs,0,LE)<=dx/4 + && loop(bp, 1, 0,dy,cs,0,DO)<=dy/4 ) Break; // ~z + } + + if( get_bw(x1,x1,y0 ,y1 ,box1->p,cs,2) != 2 + && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 + && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 + && get_bw(x0,x0,y0+1,y1-1,box1->p,cs,1) != 1 ) Break; /* ~] */ + + if ( loop(bp,dx-1, dy/4,dx,cs,0,LE) > dx/2 + && loop(bp,dx-1,3*dy/4,dx,cs,0,LE) > dx/2 + && loop(bp, 0, dy/2,dx,cs,0,RI) < dx/4 ) Break; /* ~[ */ + + x =loop(bp, 0,dy/2,dx,cs,0,RI); // konvex/konkav? ~() + i =loop(bp,dx-1,dy/2,dx,cs,0,LE); + if( loop(bp, 0,7*dy/8,dx,cs,0,RI) > x+dx/8 + && loop(bp, 0, dy/8,dx,cs,0,RI) > x+dx/8 + && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) < i-dx/8 + && loop(bp,dx-1, dy/8,dx,cs,0,LE) < i-dx/8 ) Break; // ~( + if( loop(bp, 0,7*dy/8,dx,cs,0,RI) < x-dx/8 + && loop(bp, 0, dy/8,dx,cs,0,RI) < x-dx/8 + && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) > i+dx/8 + && loop(bp,dx-1, dy/8,dx,cs,0,LE) > i+dx/8 ) Break; // ~) + if( loop(bp, 0, dy/8,dx,cs,0,RI) + -(dx-loop(bp,dx-1,7*dy/8,dx,cs,0,LE)) > dx/4 ) Break; // ~/ + if( loop(bp, 0, 0,dx,cs,0,RI) > dx/2 // ToDo: check for serifs + && loop(bp, 0, dy/8,dx,cs,0,RI) > dx/2 + && loop(bp,dx-1,dy-1 ,dx,cs,0,LE) > dx/2 + && loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE) > dx/2 ) ad=99*ad/100; // ~/ + + if (box1->m2 && 3*y0>box1->m1+2*box1->m2) + if( get_bw(x0+dx/8,x1-dx/8,box1->m1,(box1->m1+box1->m2)/2,box1->p,cs,1) == 1 ) + Break; // ~i + + if(i1+1p,cs,1) != 1 + || get_bw(x0+i4/4,x0+i4/4,y1-dy/4,y1,box1->p,cs,1) != 1 ) + { ad=99*ad/100; MSG(fprintf(stderr,"ad=%d",ad);) } // ToDo: improve it + if(!hchar){ ad=96*ad/100; MSG({}) } // ~bad_small_r + if (box1->m4 && y1m4) { // probably lower dot? + if ((dx>2 && get_bw(x0+1,x1-1,y1+1,box1->m4,box1->p,cs,1) == 1) + || (dx<3 && get_bw(x0 ,x1 ,y1+1,box1->m4,box1->p,cs,1) == 1)) { + ad=96*ad/100; + } + } // ~! + // a---b + // I + // I + // c---e + // check against Z + for(bx=0,ax=dx,ay=by=y=0;ybx) { bx=dx-1-i; by=y; } + i+=loop(bp,dx-1-i,y,dx,cs,1,LE); if (dx-i-1dy-1-dy/4;y--){ + i =loop(bp,0,y,dx,cs,0,RI); if (iex) { ex=i; ey=y; } + } + x=(3*ax+cx)/4; y=(3*ay+cy)/4; i= loop(bp,x,y,dx,cs,0,RI); + x=(3*bx+ex)/4; y=(3*by+ey)/4; j= loop(bp,x,y,dx,cs,0,LE); + if (j>0 && (2*i>3*j || 3*i<2*j )) ad=99*ad/100; + if (j>0 && ( i>2*j || 2*i< j )) ad=97*ad/100; + i=loop(bp,0,0,dy,cs,0,DO); + if (i>dy/8 && idx/4) ad=96*ad/100; // ~l 5x7 + + if( get_bw(x0,x1,y0,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; + if (gchar) ad=98*ad/100; // J + if (box1->m3 && 2*y1<=box1->m2+box1->m3) ad=96*ad/100; // ' + + Setac(box1,'I',ad); + break; + } + // --- test J --------------------------------------------------- 22Nov06 + for(ad=d=100;dy>4 && dy>=dx && dx>2;){ // min 3x4 ~Y)]d', + // rewritten for vectors 0.42 + int ld, i1, i2, i3, i4, i5, i6, i7; // line derivation + corners + DBG( wchar_t c_ask='J'; ) + if (sdata->holes.num > 0) Break; /* no hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the upper right end of the J */ + if (aa[3][2]>d) Break; /* [2] = distance */ + /* searching for 4 notches between neighbouring ends */ + +/* + type A B + + 6OOOO 6O5 + 7O5 7O + O O + O O + 2O 1O4 1O4 + OO 2OO + 3 3 +*/ + + /* Warning: aa0 can be left upper or left lower point for type B */ + /* get a point on the inner low left side of the J */ + i =nearest_frame_vector(box1,aa[3][3],aa[1][3],(x0+x1)/2,y0); + i1=nearest_frame_vector(box1,i ,aa[1][3], x1+dx,(y0+3*y1)/4); + /* get the most left point on the lower part of the J */ + i2=nearest_frame_vector(box1,i1,aa[3][3], x0-2*dx, y1-dy/8); + /* get a point on the middle of the bottom of the J */ + i3=nearest_frame_vector(box1,aa[1][3],aa[2][3], (x0+x1)/2, y1); + /* get a point on the outer low right side of the J */ + i4=nearest_frame_vector(box1,aa[1][3],aa[3][3], x1, (y0+2*y1)/3); + /* get a point on the outer right side below top serif */ + i5=nearest_frame_vector(box1,aa[2][3],aa[3][3], (x0+2*x1)/3,y0); + /* get a point on the left side of upper serif */ + i6=nearest_frame_vector(box1,aa[3][3],i1, x0, y0); + /* get a point on the most right left side of upper serif */ + i7=nearest_frame_vector(box1,i6,i1, x1, y0); + MSG(fprintf(stderr," i1-i7 %d %d %d %d %d %d %d",i1,i2,i3,i4,i5,i6,i7);) + + /* check the highest point on lower left area */ + i =nearest_frame_vector(box1,i1,i3,x0,y0); + if (box1->frame_vector[i ][1]-y0frame_vector[i ][1]-y0<=dy/2) ad=97*ad/100; // imperfect a + /* check the lowest point on upper left area, serife? */ + j =nearest_frame_vector(box1,i6,i7,x0,y1); + if (box1->frame_vector[i ][1] + -box1->frame_vector[j ][1]<=dy/4) Break; // imperfect a + if (box1->frame_vector[i7][1]>y0+dy/4) Break; // not to low + if (box1->frame_vector[i1][1] + -box1->frame_vector[i7][1]frame_vector[i4][1] + -box1->frame_vector[i5][1]frame_vector[i7][0]frame_vector[i1][0] + -box1->frame_vector[i2][0]<=dx/8) Break; // ~1 + if (box1->frame_vector[i1][0] + -box1->frame_vector[i2][0]<=dx/4) ad=ad*99/100; // ~1 + if (box1->frame_vector[i6][1]>y0+dy/8) ad=99*ad/100; // ~1 + if (aa[0][2]==0) { // ]? + ad=99*ad/100; + if (aa[1][2]==0) ad=98*ad/100; + if (aa[2][2]<=aa[3][2]) ad=97*ad/100; + } + + /* check for left bow */ + for (j=i=i2;i!=i4;i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][0] /* [0]=x */ + frame_vector[i1][0]) break; /* curve? */ + } if (i==i4) Break; // ~I + /* check for no right bow */ + for (j=i=i2;i!=i4;i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][0] /* [0]=x */ + >box1->frame_vector[i4][0]) break; + } if (i!=i4) Break; // ~I + /* check for no right bow */ + for (j=i=i5;i!=i6;i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][1] > y0+dy/4) break; + } if (i!=i6) Break; // ~Y + /* check if upper left and lower left points are joined directly */ + ld=line_deviation(box1, i7, i1); + MSG(fprintf(stderr," i7,i1 %d %d linedist= %d/%d",i7,i1,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + if (5*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 + if (6*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 + if (7*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 + if (8*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 + /* check if lower right and upper right points are joined directly */ + ld=line_deviation(box1, i4, i5); + MSG(fprintf(stderr," i4,i5 %d %d linedist= %d/%d",i4,i5,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + if (5*ld >4*2*sq(1024/4)) ad=99*ad/100; + + // J exists as gchar and ~gchar + if(!hchar){ ad=99*ad/100; } + Setac(box1,'J',ad); + break; + } + return box1->c; +} + +static wchar_t ocr0_brackets(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i1,i2,i3,i4,i5,i6,hchar=sdata->hchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + (*aa)[4]=sdata->aa, /* corner-points, (x,y,dist^2,vector_idx) */ + ad,r1,r2; /* tmp-vars */ + wchar_t bc=UNKNOWN; + + // --- test > derived from xX --------------------------------------------------- + // rewritten for vectors v0.41 + for(ad=d=100;dx>1 && dy>2;){ // min 3x2 + // 0 - indizes 0,1,i1,i2 pointing to edges of the char + // \ . + // \ . + // i1,i2 + // / + // / + // 1 + DBG( wchar_t c_ask='>'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num > 0 && (dx<6 || dy<6)) Break; /* # */ + /* calculate the half distance to the center */ + d=2*sq(128/4); + /* now we check for the 2 left ends of the > */ + if (aa[0][2]>d) Break; /* upper left end */ + if (aa[1][2]>d) Break; /* lower left end */ + if (aa[1][1]-aa[0][1]num_frame_vectors[0]) { + if (box1->frame_vector[i][0] + >=box1->frame_vector[j][0]) j=i; /* notice most right vector */ + } if (j==i || j==aa[0][3]) Break; + /* calculate the distance to the center */ + x=box1->frame_vector[j][0]; + y=box1->frame_vector[j][1]; + if (2*x-aa[0][0]-aa[1][0](dy+2)) Break; + if ( aa[0][0]+aa[1][0]-2*x>=0) Break; + i1=j; + d=line_deviation(box1, aa[0][3], j) >sq(1024/4); + /* check if upper left and center point are joined directly */ + MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) + if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); + MSG(fprintf(stderr,"ad=%d", ad);) + d=line_deviation(box1, j, aa[1][3]); + /* check if lower left and center point are joined directly */ + MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) + if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); + MSG(fprintf(stderr,"ad=%d", ad);) + + /* run along right side from bottom to top */ + for (j=i=aa[1][3];i!=aa[0][3];i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[i][0] + >=box1->frame_vector[j][0]) j=i; /* notice most right vector */ + // MSG(fprintf(stderr,"search right: %d %d %d %d",i,j,aa[1][3],aa[0][3]);) + } if (j==i || j==aa[1][3]) Break; + /* calculate the distance to the center */ + x=box1->frame_vector[j][0]; + y=box1->frame_vector[j][1]; + if ( (aa[0][0]+aa[1][0]-2*x)>= 0 ) Break; + if (abs(aa[0][1]+aa[1][1]-2*y)>(dy+2)/4) Break; + if (aa[0][0]>=x || aa[1][0]>=x) Break; + i2=j; + d=line_deviation(box1, j, aa[0][3]); + /* check if upper left and center point are directly joined directly */ + MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) + if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); + MSG(fprintf(stderr,"ad=%d", ad);) + d=line_deviation(box1, aa[1][3], j); + /* check if lower left and center point are directly joined */ + MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) + if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); + MSG(fprintf(stderr,"ad=%d", ad);) + + /* + ToDo: calculate momentums or max derivations + along lines to distinguish )]}> + i1,i2 + */ + + if (sdata->gchar) ad=98*ad/100; + if (sdata->hchar) ad=99*ad/100; + bc='>'; + Setac(box1,bc,ad); + break; + } + // --- test /\\ ------------------------------------------------ +// if(bc==UNKNOWN) +// if(!box1->dots) + for(ad=d=100;dx>3 && dy>3;){ // min 4x4 for 4x6 font + DBG( wchar_t c_ask='/'; ) + if (sdata->holes.num > 0) Break; /* tolerant against a tiny hole */ +#if 1 + for(i=y=0;y2 || (i>0 && dy<16)) Break; +#endif + /* get the center as exact as possible */ + i2=dx-1-loop(bp,dx-1,dy/2 ,dx,cs,0,LE) // be exact for small fonts + +dx-1-loop(bp,dx-1,dy/2+dy%2-1,dx,cs,0,LE) + + loop(bp, 0,dy/2 ,dx,cs,0,RI) + + loop(bp, 0,dy/2+dy%2-1,dx,cs,0,RI); + if (abs(i2-2*dx)>1+dx/2) Break; + if (abs(i2-2*dx)> dx/2) ad=99*ad/100; + + i1=loop(bp,dx-1,dy/16,dx,cs,0,LE); // right side + i3=loop(bp,dx-1,dy-1 ,dx,cs,0,LE); + i4=loop(bp, 0,0 ,dx,cs,0,RI); // left side + i6=loop(bp, 0,dy-1 ,dx,cs,0,RI); + i=(box1->m4+box1->m3)/2-box1->m2; + // + // out_x(box1);printf("() %d %d %d %d %d %d %d\n",i,i1,i2,i3,i4,i5,i6); + + // ~lI + for(i=i4,y=0;ydx/6+1 ) break; i=x; + } if( ydx/6+1 ) break; i=x; + } if( ydx/4 ) { Setac(box1,(bc='/'),ad);break; } + if(i4<=dx/8 && i3<=dx/8 && i6-(dx-i1)>dx/4 ) { Setac(box1,(bc='\\'),ad);break; } + Break; + } + // --- test ()<> ------------------------------------------------ +// if(bc==UNKNOWN) +// if(!box1->dots) + for(ad=d=100;dx>1 && dy>4;){ // min 3x4 + DBG( wchar_t c_ask='('; ) + if (sdata->holes.num > 1) {Break;}; /* tolerant against a tiny hole */ +#if 1 + for(i=y=0;y2 || (i>0 && dy<16)) {Break;}; +#endif + /* look for the extrema => r1..r2 */ + for(i=dx,r1=r2=y=dy/2-dy/8;y<=dy/2+dy/8;y++){ + j=loop(bp, 0,y,dx,cs,0,RI); if(j==i) r2=y; if(jdy){ +// from Aug06 vector-version of greater is used +// if(i2==0 && 3*i5>dx && i4<=dx/8 && i6<=dx/8) { Setac(box1,(bc='>'),98);{Break;}; } + if(i5==0 && 3*i2>dx && i1<=dx/8 && i3<=dx/8) { Setac(box1,(bc='<'),98);{Break;}; } + } + if( dx > 2 && 9*dx>=5*dy ){ // 4x6 screen-font (3*5) + ad=98; + if (dx<8) ad=99*ad/100; + if (dx<6) ad=96*ad/100; + if( 2*dx > JOB->res.avX && 4*dx>dy ) ad=98; +// printf(" %d %d %d %d %d %d\n",i5,i1,i3,i2,i4,i6); + if( i5==0 && i1<=dx/8+1 && i3<=dx/8+1 && i1+i3<=dx/8+1 + && i2>=dx/2 && i4>=3*dx/4 && i6>=3*dx/4 ) { + if (2*loop(bp, 0, y/2,dx,cs,0,RI)+1+dx/16=dx/2 && i1>=3*dx/4 && i3>=3*dx/4 ) { + if (2*loop(bp,dx-1, y/2,dx,cs,0,LE)+1+dx/16m4+box1->m3)/2-box1->m2; + // + // out_x(box1);printf("() %d %d %d %d %d %d %d\n",i,i1,i2,i3,i4,i5,i6); + if(2*i2i4+i6 && 2*dx=i){ + Setac(box1,(bc=')'),98);break; } + if(2*i2>i1+i3 && 2*i5=i){ + if(2*i2<=i1+i3+1 || 2*i5>=i4+i6-1) ad=98*ad/100; + if(2*i2<=i1+i3+2 || 2*i5>=i4+i6-2) ad=98*ad/100; + for(x=y=0;yx ) x=i; + } + for(y=0;y<(dy+2)/4;y++){ + i=loop(bp,0,y+dy/8,dx,cs,0,RI);if( i2 && dy>4 && dy>=2*dx;){ // (3,6) on 4x6 font + DBG( wchar_t c_ask=']'; ) + if (sdata->holes.num > 1) { Break;} /* tolerant against a tiny hole */ + if (!hchar) ad=97*ad/100; + for(y=0;yp,cs,2) == 2 + && get_bw(x0,x1,y0+1,y0+1,box1->p,cs,2) == 2 ) {Break;}; + if( get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) == 2 + && get_bw(x0,x1,y1-1,y1-1,box1->p,cs,2) == 2 ) {Break;}; + if( get_bw(x0 ,x0,y0 ,y1 ,box1->p,cs,2) == 0 + || get_bw(x0+1 ,x0+1,y0 ,y1 ,box1->p,cs,2) == 0 ) + if( get_bw(x0+dx/2,x1,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) + { Setac(box1,(bc='['),ad);break; } + if( get_bw(x1 ,x1,y0 ,y1 ,box1->p,cs,2) == 0 + || get_bw(x1-1 ,x1-1,y0 ,y1 ,box1->p,cs,2) == 0 ) + if( get_bw(x0,x1-dx/2,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) + { Setac(box1,(bc=']'),ad);break; } + break; + } + +#if CODE_NOT_COMPLETED + // --- test ] ------- + for(ad=d=100;dx>2 && dy>3;){ + DBG( wchar_t c_ask=']'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num > 0) ad=98*ad/100; /* # */ + /* 1/8 distance to the center */ + d=2*sq(128/16); + /* now we check for the 4 ends of the x */ + if (aa[0][2]>d) Break; + if (aa[1][2]>d) Break; + if (aa[2][2]>d) Break; + if (aa[3][2]>d) Break; + if (aa[3][0]-aa[0][0]<7*dx/8) Break; + if (aa[2][0]-aa[1][0]<7*dx/8) Break; + if (aa[1][1]-aa[0][1]<7*dy/8) Break; + if (aa[2][1]-aa[3][1]<7*dy/8) Break; + if (aa[3][0]-aa[0][0]<2) Break; /* to small */ + if (aa[2][0]-aa[1][0]<2) Break; /* to small */ + MSG( fprintf(stderr," aa %d %d %d %d %d %d %d %d d %d %d %d %d",\ + aa[0][0]-x0,aa[0][1]-y0,aa[1][0]-x0,aa[1][1]-y0,\ + aa[2][0]-x0,aa[2][1]-y0,aa[3][0]-x0,aa[3][1]-y0,\ + aa[0][2],aa[1][2],aa[2][2],aa[3][2]);) + /* left and right vertical line */ + d=line_deviation(box1, aa[0][3], aa[1][3]); if (d>2*sq(1024/4)) Break; + ad=(100-(d-sq(1024)/2)/sq(1024)/4)*ad/100; + d=line_deviation(box1, aa[2][3], aa[3][3]); if (d>2*sq(1024/4)) Break; + + /* search uppermost left ^ */ + i1=nearest_frame_vector(box1,aa[1][3],aa[2][3], x0, y0); + x=box1->frame_vector[i1][0]; + y=box1->frame_vector[i1][1]; + if (y-y0 > 5*dy/8) Break; + if (x-x0 > 5*dx/8) Break; + /* search uppermost right ^ ~H */ + i3=nearest_frame_vector(box1,aa[1][3],aa[2][3], x1, y0); + if ( box1->frame_vector[i3][0]-x> dx/4 + && box1->frame_vector[i3][1]-y<=dy/8) Break; + + /* check if upper left and lower right point are joined directly */ + dbg[0]=d=line_deviation(box1,i1, aa[2][3]); if (d >2*sq(1024/4)) Break; + /* check if lower left and lower left point are joined directly */ + dbg[1]=d=line_deviation(box1, aa[1][3],i1); if (d >2*sq(1024/4)) Break; + + if (!hchar) ad=99*ad/100; + if ( gchar) ad=98*ad/100; // \sc N + ac=(wchar_t) ']'; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } +#endif + // --------- test ocr-a-[] -------------------------------- + if(bc==UNKNOWN) + for(ad=d=98;dx>5 && dy>7 && 2*dy>3*dx;){ // only for accurate font at the moment + DBG( wchar_t c_ask='['; ) + if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ + if (!hchar) ad=97*ad/100; + if( num_cross(0,dx-1, 0, 0,bp,cs) != 1 ) break; + if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 1 ) break; + if ( loop(bp,dx-1,dy/2,dx,cs,0,LE) + +loop(bp, 0,dy/2,dx,cs,0,RI) <= dx/4 ) break; // O + for(y=dy/8;yp,cs,1) == 0) + { Setac(box1,(bc='['),ad);break; } + if( get_bw(x0,(5*x0+3*x1)/8,y0+3*dy/16,y1-3*dy/16,box1->p,cs,1) == 0) + { Setac(box1,(bc=']'),ad);break; } + break; + } + // --------- test {} -------------------------------- + for(ad=d=99;dx>2 && dy>5 && 2*dy>3*dx;){ + DBG( wchar_t c_ask='{'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if (!hchar) ad=97*ad/100; + for(y=0;y3*dx/4 ) ad=99*ad/100; + if ( loop(bp,0, 0,dx,cs,0,RI)>3*dx/4 ) ad=99*ad/100; // < + if ( loop(bp,0, 0,dy,cs,0,DO)=dx/8 ) ad=98*ad/100; // < + if ( loop(bp,dx-2,dy-1,dy,cs,0,UP)>dy/4 ) Break; // f + if ( get_bw(x0,x0,y0,y0+dy/4,box1->p,cs,1) == 1 + || get_bw(x0,x0,y1-dy/4,y1,box1->p,cs,1) == 1 ) Break; + Setac(box1,(bc='{'),ad);Break; + } + for(ad=d=99;dx>2 && dy>5 && 2*dy>3*dx;){ + DBG( wchar_t c_ask='}'; ) + if (!hchar) ad=97*ad/100; + for(y=0;y3*dx/4 ) {ad=99*ad/100;} + if ( loop(bp,dx-1, 0,dx,cs,0,LE)>3*dx/4 ) {ad=99*ad/100;} // > + if ( loop(bp,dx-1, 0,dy,cs,0,DO)=dx/8 ) ad=98*ad/100; // < + if ( loop(bp,1,dy-1,dy,cs,0,UP)>dy/4 ) Break; // ??? + if ( get_bw(x1,x1,y0,y0+dy/4,box1->p,cs,1) == 1 + || get_bw(x1,x1,y1-dy/4,y1,box1->p,cs,1) == 1 ) Break; + Setac(box1,(bc='}'),ad);Break; + } + return box1->c; +} + +#if 0 +/* ---------- empty prototype function for copy and expand ---------- */ +static wchar_t ocr0_XXX(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,i0,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, + x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + ac,ad; /* tmp-vars */ + + // --- test XXX --------------------------------------------------- + return box1->c; +} +#endif + + +/* ----------------------- part9 -------------------------------- */ +static wchar_t ocr0p9(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + i1,i2,i3,i4; /* tmp-vars */ + int xa,xb, /* used for store significant points of char */ + dbg[9]={0,0,0,0,0,0,0,0,0}, /* debugging space */ + ya,ad,cs=sdata->cs; + wchar_t ac,bc=UNKNOWN; // bestletter + int hchar; // char is higher than e + int gchar; // char has ink lower than m3 + // --- hchar --- gchar ------------------------- + hchar=0;if( 2*y0<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; + gchar=0;if( 2*y1>=2*box1->m3+(box1->m4-box1->m3) ) gchar=1; + // if the char is slightly moved down correction can be done + if ( y0m2 && y1>box1->m3 && 2*y1m3+box1->m4) // moved + if( 2*(y0-(y1-box1->m3))<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; + + /* reserved for the future */ + // --- test beta,\3,sz,"s --------------------------------------------- + if(bc==UNKNOWN && hchar) + for(ad=d=100;dx>3 && dy>6;){ // min 4x7 + DBG( wchar_t c_ask='S'; ) + if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ + /* this part is provisorium, should be changed! + a-\ + | d + b| / + | \ + -c / + */ + if( num_cross(x0 ,x1 ,y0+dy/4 ,y0+dy/4 ,box1->p,cs) != 2 + && num_cross(x0 ,x1 ,y0+dy/4+1,y0+dy/4+1,box1->p,cs) != 2 ) break; + for(i=1+dy/16,y=y0+dy/8;y0;y++){ + if( yp,cs) != 2 ) i--;} + else { if( num_cross(x0 ,x1 ,y,y,box1->p,cs) < 2 ) i--;} + if( get_bw(x0,x0+dx/2,y,y,box1->p,cs,1) == 0 ) i--; + if( yp,cs,1) == 0 ) i--; + } if( i<=0 ) break; + // out_x(box1); + + for(y=y0+dy/3;yp,x1,y,dx,cs,0,LE); + if( i>=dx/8 ) break; + i+=loop(box1->p,x1-i,y,dx,cs,1,LE); + if( i>=dx/2 ) break; + } if( y>=y1-dy/3 ) break; + + for(y=y0+dy/5;yp,cs,1) == 1 ) break; + if( y>=y0+dy/3 ) break; + + for(y=y0+dy/2;yp,cs,1) == 1 ) break; + if( y>=y1 ) break; + + for(y=y1-dy/3;yp,x1,y,dx,cs,0,LE); + if( i>dx/4 + && get_bw(x1-dx/8,x1-dx/8,y,y1,box1->p,cs,1) == 1 ) break; + } if( ym3==0 || 2*y1m3+box1->m4 ) + if( loop(box1->p,x1,y1, dx,cs,0,LE)==0 + && loop(box1->p,x1,y1-dy/4,dx,cs,0,LE)>dx/8 ) break; // ~R + + + for(x=x0+dx/4;xp,cs) == 3 ) break; + if( x>=x1-dx/4 ) break; + + i=loop(bp,dx/2,dy-1,dy,cs,0,UP)+dy/64; // Jul00 + for(x=dx/5;x i ) break; + if( x==dx/2 ) break; + + x=x0+loop(bp,0,dy/4,dx,cs,0,RI); + for(;xp,cs,1) == 0 ) break; + if( xp,cs,NULL) != 0 ) break; + if (sdata->holes.num != 0) break; + + bc=LATIN_SMALL_LETTER_SHARP_S; + Setac(box1,(wchar_t)bc,98); + break; + } + // --- test + ------------------------------------------------ + for(ad=d=100;dx>2 && dy>2;){ // min 3x3 + DBG( wchar_t c_ask='+'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + xa=(dx+1)/3-1; ya=(dy+1)/3-1; + xb=(dx+1)/4; + if( get_bw(x0,x0+xa,y0,y0+ya,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0,x0+xa,y1-ya,y1,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-xb,x1,y0,y0+ya,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-xa,x1,y1-ya,y1,box1->p,cs,1) == 1 ) Break; + for(i=0,y=y0+ya;y<=y1-ya;y++){ // horizontal line + if( get_bw(x0+dx/9,x1-dx/9,y,y,box1->p,cs,2) == 0 ) { i=y; break; } + } + if (3*dx<2*dy) ad=99*ad/100; // ~t + if( !i ) Break; + ac=(wchar_t) '+'; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } + // --- test $ ------------------------------------------------ + for(ad=d=99;dx>3 && dy>5;){ // min 3x4 + DBG( wchar_t c_ask='$'; ) + if (sdata->holes.num != 2) Break; + + if( get_bw(x0,x0+dx/5,y0 ,y0+dy/18,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0,x0+dx/9,y1-dy/23,y1 ,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-dx/9,x1,y0 ,y0+dy/18,box1->p,cs,1) == 1 ) Break; + if( get_bw(x1-dx/5,x1,y1-dy/23,y1 ,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0,x0+dx/3,y0+dy/3 ,y0+dy/2 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/3,x1,y1-dy/2 ,y1-dy/3 ,box1->p,cs,1) != 1 ) Break; + i1=x0+loop(box1->p,x0,y0,dx,cs,0,RI); if( i1x1-dx/5 ) Break; + i2=x0+loop(box1->p,x0,y1,dx,cs,0,RI); if( i2i1 ) Break; + ad= get_line2(i1,y0,i2,y1,box1->p,cs,100)*ad/100; + // check upper left and lower right half circle, $ + for (x=0,i3=y=0;yp,cs) == 2 ) { + i = loop(box1->p,x0,y0+dy/2-y,dx,cs,0,RI); + if (i>x) { x=i; i3=y0+dy/2-y; } + } if (x<=dx/4) Break; + for (x=0,i4=y=0;yp,cs) == 2 ) { + i = loop(box1->p,x0,y0+dy/2+y,dx,cs,0,RI); + if (i>x) { x=i; i4=y0+dy/2+y; } + } if (x<=dx/4) Break; + if (ad<95) Break; + ac=(wchar_t) '$'; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } + // --- test & ------------------------------------------------ + for(ad=d=99;dx>3 && dy>4;){ /* 4x6 font */ + DBG( wchar_t c_ask='&'; ) + if (sdata->holes.num != 2) Break; + if( get_bw(x1-dx/9,x1,y0,y0+dy/4,box1->p,cs,1) == 1 ) Break; // g + if( loop(bp,dx/2,0,dy,cs,0,DO)>dy/2) Break; + i1=loop(bp,0,dy/8 ,dx,cs,0,RI); if (i1>dx/2) Break; + i =loop(bp,0,dy/4 ,dx,cs,0,RI); if (i1>dx/2) Break; if (idx/2) Break; + i =loop(bp,0,dy-dy/4-1,dx,cs,0,RI); if (i3>dx/2) Break; if (ii1) Break; + for( i2=0, y=dy/4; y<=dy/2+1; y++ ){ + i =loop(bp,0,y,dx,cs,0,RI); if( i>i2 ) i2=i; + } + if(2*i2-i1-i3<1) Break; + // if( num_hole(x0,x1 ,y0,y1,box1->p,cs,NULL)!=2 ) Break; + if( num_hole(x0,x1-dx/4,y0,y1,box1->p,cs,NULL)!=2 ) Break; + if( num_cross(dx-1,dx-1,dy/4,dy-1,bp,cs) < 1 ) Break; + for( x=dx-1; x>=dx/2; x-- ){ + if( num_cross(x,x,dy/4,dy-1,bp,cs) > 1 ) break; + } if( x<=3*dx/4 && x 3 ) { // glued ah + if (dy>15) { Break; } else ad=96*ad/100; + } + if (!hchar) ad=98*ad/100; + bc=(wchar_t) '&'; + Setac(box1,bc,ad); + if (ad>=100) return bc; + break; + } + // --- test \it & like \epsilon\tau ------------------------------ + if(bc==UNKNOWN) + for(ad=d=100;dx>7 && dy>7;){ + DBG( wchar_t c_ask='&'; ) + if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1, dy/4, dy/4,bp,cs) != 3 ) break; + if( num_cross(0,dx-1, dy/2, dy/2,bp,cs) != 4 ) break; + if( num_cross(dx/2,dx-1,dy/2, dy/2,bp,cs) != 2 ) break; + if( num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs) != 2 ) break; + if( num_cross(0,dx-1, dy-1, dy-1,bp,cs) != 1 ) break; + if( num_cross( 0, 0,0,dy-1,bp,cs) != 1 ) break; + if( num_cross( dx/3, dx/3,0,dy-1,bp,cs) != 4 ) break; + if( num_cross(13*dx/16,13*dx/16,0,dy/8,bp,cs) != 0 ) break; + if( num_cross(4*dx/8,4*dx/8,dy-dy/4,dy-1,bp,cs) != 1 ) break; + if( num_cross(3*dx/8,3*dx/8,dy-dy/4,dy-1,bp,cs) != 1 ) break; + if( num_cross(5*dx/8,5*dx/8,dy-dy/4,dy-1,bp,cs) != 1 ) break; + if( num_hole(x0 ,(x0+x1)/2,y0, y1,box1->p,cs,NULL) != 1 ) break; + if( num_hole(x0+dx/8,x1-dx/4,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) break; + ac=(wchar_t) '&'; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } + // --- test ? --------------------------------------------------- + for(ad=d=98;dx>2 && dy>5;){ // min 3x(4+2) + DBG( wchar_t c_ask='?'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + if ( num_cross(x0, x1, y0, y0, box1->p, cs) !=1 ) Break; // ~? + if ( num_cross(x0, x1, y1, y1, box1->p, cs) > 1 ) Break; // ~? + for(y=y0;yp,cs,1) != 1 ) break; // lower end + if (2*ym4) { // probably lower dot not catched in box? + if (get_bw(x0+1,x1-1,y1+1,box1->m4,box1->p,cs,1) != 1 ) Break; + i1=box1->m4; + for(;i1>y1;i1--) // new y1 + if( get_bw(x0, x1,i1,i1,box1->p,cs,1) == 1 ) break; // lower dot + } + y--; i=y-y0+1; // new dy + for (y=0;yp, cs) == 2 ) break; + if (y==dy/2) Break; + // if( num_hole( x0, x1, y0, y1, box1->p,cs,NULL) > 0 ) Break; + if (sdata->holes.num > 0) Break; + for(y=y0+dy/2;y<=i1;y++) + if( get_bw(x0,x1,y,y,box1->p,cs,1) == 0 ) break; + if( y==i1 ) Break; + for( ;y<=i1;y++) + if( get_bw(x0,x1,y,y,box1->p,cs,1) == 1 ) break; + if( get_bw(x0,x1,y,y,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+7*dx/8,x1,y,i1,box1->p,cs,1) == 1 ) Break; // broken thin 2 + bc='?'; + Setac(box1,(wchar_t)bc,98); + return bc; + } + // --- test !| --------------------------------------------------- + for(ad=d=99; dy>4 && dy>2*dx;){ // min 3x4 + DBG( wchar_t c_ask='!'; ) + if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ + // measure thickness + if (num_cross(x0,x1,y0 ,y0 ,box1->p,cs)!=1) Break; + if (num_cross(x0,x1,y0+dy/2,y0+dy/2,box1->p,cs)!=1) Break; + for(y=y0;yp,cs,1) != 1 ) break; // lower end + if (2*ybox1->m3-dy/8) ad=ad*97/100; /* missing dot? */ + i1=y1; + if (y==y1 && box1->m4) { // probably lower dot not catched in box? + if ((dx>2 && get_bw(x0+1,x1-1,y1+1,box1->m4,box1->p,cs,1) == 1) + || (dx<3 && get_bw(x0 ,x1 ,y1+1,box1->m4,box1->p,cs,1) == 1 )) { + i1=box1->m4; + for(;i1>y1;i1--) // new y1 + if( get_bw(x0, x1,i1,i1,box1->p,cs,1) == 1 ) break; // lower dot + } + } i2=i1; + for( i1=0,y=y0;y<=i2;y++){ + i=num_cross(x0,x1,y,y,box1->p,cs); if(i>1) break; + if(i==0 && i1==0) i1=y; + } if(y<=i2 || i1==0 || i1dx/4+1 ) Break; // f + + if (!hchar) ad=96*ad/100; + Setac(box1,(wchar_t)'!',ad); + break; + } + // --- test * five egdes (jagges? beames?) what is the right english word? ---- + for(ad=d=99;dx>2 && dy>4;){ + DBG( wchar_t c_ask='*'; ) + if (sdata->holes.num > 0) Break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1, 0,dy-1,bp,cs) != 1 + && num_cross(0,dx-1, 1,dy-2,bp,cs) != 1 ) Break; + if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 2 + && num_cross(0,dx-1,dy-2,dy-2,bp,cs) != 2 ) Break; + x=dx/2;y=(6*dy+8)/16; // center point 6/8=6/2^3 rounded + /* upwarts from center */ + dbg[0]=i=get_line2(x,y,x ,0,bp,cs,100); if(i<95) Break; + if (dx<8) /* be exact on small fonts, where get_line2 returns 100 (ToDo change) */ + if (get_bw(x,x,0,y,bp,cs,2)==2) Break; + /* horizontal */ + dbg[1]=i=get_line2(0,y,dx-1,y,bp,cs,100); if(i<95) Break; + if (dy<8) + if (get_bw(0,dx-1,y ,y ,bp,cs,2)==2 + && get_bw(0,dx-1,y+1,y+1,bp,cs,2)==2) Break; + /* down (right) */ + i=get_line2(x,y,(5*dx+4)/8,dy-1,bp,cs,100); + j=get_line2(x,y,(6*dx+4)/8,dy-1,bp,cs,100); if(j>i) dbg[2]=i=j; + if(i<95) Break; + /* down (left) */ + dbg[3]=i=get_line2(x, y,(2*dx+4)/8,dy-1,bp,cs,100); if(i<95) Break; // straight up + /* check for lower gap at bottom */ + dbg[4]=i=get_bw( x, x,dy-1-dy/8,dy-1,bp,cs,1); if(i==1) Break; + dbg[5]=i=get_line2( dx/4,dy/4, 0,0,bp,cs,101); if(i<95) Break; // upper left gap + dbg[6]=i=get_line2(dx-1-dx/4,dy/4,dx-1,0,bp,cs,101); if(i<95) Break; // upper right gap + MSG(fprintf(stderr,"%d %d %d %d %d %d %d",dbg[0],dbg[1],dbg[2],dbg[3],dbg[4],dbg[5],dbg[6]);) + Setac(box1,(wchar_t)'*',ad); + break; + } + // --- test * six egdes (jagges? beames?) what is the right english word? ---- + for(ad=d=100;dx>4 && dy>4;){ + DBG( wchar_t c_ask='*'; ) + if (sdata->holes.num > 0) Break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1, dy/8, dy/8,bp,cs) != 3 + && num_cross(0,dx-1, 1+dy/8, 1+dy/8,bp,cs) != 3) Break; + if( num_cross(0,dx-1,dy-2-dy/8,dy-2-dy/8,bp,cs) != 3) Break; + if( num_cross(0 , 0, 0,dy-1,bp,cs) != 2) Break; + if( num_cross(dx-1,dx-1, 0,dy-1,bp,cs) != 2) Break; + if( num_cross(0,dx-1,dy/2,dy/2,bp,cs) != 1) Break; + if( num_cross( 0 ,dx/8,dy/2,dy/2,bp,cs) != 0) Break; + if( num_cross(dx-1-dx/8,dx-1,dy/2,dy/2,bp,cs) != 0) Break; + if (dx>5) { + dbg[0]=i=get_line2(0,dy-2-dy/8,dx-1,dy/8,bp,cs,100); if(i<95) Break; // black upwarts beam + dbg[1]=i=get_line2(0,dy/8,dx-1,dy-2-dy/8,bp,cs,100); if(i<95) Break; // black downwards beam + /* check vertical line */ + dbg[2]=i=get_line2(dx/2,0,dx/2, dy-1,bp,cs,100); if(i<95) Break; + } + MSG(fprintf(stderr,"%d %d %d %d %d %d",dbg[0],dbg[1],dbg[2],dbg[3],dbg[4],dbg[5]);) + Setac(box1,(wchar_t)'*',98); + break; + } + // --- test @ - a popular char should be detectable! added in version v0.2.4a5 + if(bc==UNKNOWN) + for(ad=d=99;dx>5 && dy>7;){ + DBG( wchar_t c_ask='@'; ) + if (sdata->holes.num > 3) Break; /* tolerant against a tiny hole */ + if (loop(bp, 0,dy/2,dx,cs,0,RI)>dx/4) Break; + if (loop(bp,dx-1,dy/2,dx,cs,0,LE)>dx/4) Break; + if (loop(bp,dx/2,dy-1,dy,cs,0,UP)>dx/8) Break; + if (loop(bp,dx/2, 0,dy,cs,0,DO)>dx/8) Break; + /* ..@@@@..<- 8*10 example + .@@..@@. + @@....@@ + @@..@@@@< + @@.@@.@@ + @@.@@.@@ + @@..@@@. + @@...... + .@@...@@ + ..@@@@@.<- */ + x=6*dx/16; + y=dy/2; + i=num_cross(0,dx-1,y,y,bp,cs); + if (i<3 || i>4) Break; + if( i != 4 && dx>8 ) ad=98*ad/100; + + i=num_cross(x,x,0,dy-1,bp,cs); if (i<2) Break; + if (i!=4) { j=num_cross(x+1,x+1,0,dy-1,bp,cs); + if (abs(4-j)4) Break; + if (i!=4) ad=97*ad/100; + if( num_cross(0, x,y,y,bp,cs) != 2 ) Break; + if( num_cross(x,dx-1,y,y,bp,cs) != 2 ) Break; + if( num_cross(x,x,0, y,bp,cs) != 2 ) Break; + if( num_cross(x,x,y,dy-1,bp,cs) != 2 ) Break; + if (dx>7) { + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 1 ) Break; + if (sdata->holes.num != 1) Break; + if( num_hole(x0+dx/8,x1-3*dx/16,y0+dy/8,y1-dy/8,box1->p,cs,NULL) != 1 ) Break; + } + Setac(box1,(wchar_t)'@',ad); + break; + } + // --- test paragraph v0.2.6 + if(bc==UNKNOWN && hchar) + for(ad=d=100;dx>4 && dy>15;){ + DBG( wchar_t c_ask='$'; ) + if (sdata->holes.num > 3) break; /* tolerant against a tiny hole */ + if( get_bw( 0,dx/2,3*dy/4,3*dy/4,bp,cs,1) == 1 ) break; + if( get_bw(3*dx/4,dx-1,3*dy/4,3*dy/4,bp,cs,1) == 0 ) break; + if( get_bw( 0,dx/4, dy/4, dy/4,bp,cs,1) == 0 ) break; + if( get_bw( dx/2,dx-1, dy/4, dy/4,bp,cs,1) == 1 ) break; + if( get_bw(dx/2,dx/2, 0, dy/4,bp,cs,1) == 0 ) break; + if( get_bw(dx/2,dx/2,dy-1-dy/4, dy-1,bp,cs,1) == 0 ) break; + if( num_cross(dx/2,dx/2,0,dy-1,bp,cs) != 4 ) break; + if( num_cross(x0,x1,y0+dy/2,y0+dy/2,box1->p,cs) != 2 ) break; + if( num_hole( x0,x1,y0+dy/4,y1-dy/4,box1->p,cs,NULL) != 1 ) break; + Setac(box1,SECTION_SIGN,96); + break; // paragraph=0xA7=167 + } + + return bc; +} + +/* ----------------------- partx -------------------------------- */ +static wchar_t ocr0px(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int i,j,d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + i1,i2,i3,i4,j1,cs=sdata->cs; /* tmp-vars */ + int ya,ad; /* used for store significant points of char */ + wchar_t ac,bc=UNKNOWN; // bestletter + int hchar; // char is higher than e + int gchar; // char has ink lower than m3 + // --- hchar --- gchar ------------------------- + hchar=0;if( 2*y0<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; + gchar=0;if( 2*y1>=2*box1->m3+(box1->m4-box1->m3) ) gchar=1; + // if the char is slightly moved down correction can be done + if ( y0m2 && y1>box1->m3 && 2*y1m3+box1->m4) // moved + if( 2*(y0-(y1-box1->m3))<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; + + /* reserved for special chars, to test at the end */ + // --- test 'ff' --------------------------------------------------- + // ToDo: better check and call test 'f' and 'f' with subboxes + if( bc==UNKNOWN ) + for(ad=98;dx>4 && dy>6;){ // Dec00 body copied from H + DBG( wchar_t c_ask='f'; ) + if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs) != 2 + && num_cross(0,dx-1,3*dy/16,3*dy/16,bp,cs) != 2 ) break; + if( num_cross(0,dx-1,3*dy/4 ,3*dy/4 ,bp,cs) != 2 + && num_cross(0,dx-1,3*dy/4+1,3*dy/4+1,bp,cs) != 2 ) break; + if( loop(bp,0 ,dy/8,dx,cs,0,RI) + + loop(bp,dx-1,dy/8,dx,cs,0,LE)>dx/2 ) break; // ~A + for( j1=0,i=1,y=y0+dy/10; yp,x0 ,y,dx,cs,0,RI) + +loop(box1->p,x1 ,y,dx,cs,0,LE); + if( j>10*dx/16 ) i=0; if ( j>j1 ) j1=j; } + if( !i ) break; + for( x=dx/4; x 3*dy/8 ) break; + if ( 10*y > dy ){ /* italic */ + i=loop(bp,x ,dy-y,dx,cs,0,RI); + if( i>1 && y+loop(bp,x+i-1,dy-y,dy,cs,0,UP)>3*dy/8 ) break; + } + } if( x>=dx/2 ) break; + x=loop(box1->p,x0 ,y1-dy/8,dx,cs,0,RI) + +loop(box1->p,x1 ,y1-dy/8,dx,cs,0,LE); + for( i=1,y=dy/4; ydx/5 ) i=0; } + if( !i ) break; // ~K Jul00 + for( i=0,ya=y=y0+dy/4; yp,x0 ,y,dx,cs,0,RI); + j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>i ) { i=j; ya=y; } } + if( i<=dx/2 ) break; ya-=y0; + if( num_cross(0,dx-1,ya ,ya ,bp,cs) != 1 + && num_cross(0,dx-1,ya+1,ya+1,bp,cs) != 1 ) break; /* Dec00 */ + for( y=ya; y 2 + && num_cross(0,dx-1,y+1,y+1,bp,cs) > 2 ) break; + if ( yp,cs,1) == 0 ) i=0; + } if( !i ) break; + for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ + if( get_bw( x, x,y1-dy/4,y1 ,box1->p,cs,1) == 0 ) i=0; + } if( i ) break; + for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ + if( num_cross(x,x,y0+dy/8,y1-dy/8, box1->p,cs) == 1 ) i=0; + } if( i ) break; + for(i=1,y=y0;y<=y0+dy/4 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) break; + for(i=1,y=y1-dy/4;y<=y1 && i;y++){ + if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; + } if( i ) break; + if( num_cross(x0 ,x0+dx/8 ,y0+dy/8 ,y0 ,box1->p,cs) != 0 ) ad=96*ad/100; + if( get_bw(x1-dx/8, x1 , y0, y0+dy/8,box1->p,cs,1) != 1 ) break; + if( get_bw(x0 , x0+dx/8, y1-dy/8, y1,box1->p,cs,1) != 1 ) break; + i1=loop(bp,dx-1, dy/4,dx,cs,0,LE); if(i1>dx/2) break; + i2=loop(bp,dx-1, dy/2,dx,cs,0,LE); if(i2i1+dx/8) break; + i3=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); if(i3i2+dx/8) break; + if(abs(i1+i3-2*i2)>dx/16+1) break; + if( num_hole(x0,x1,y0+dy/4,y1,box1->p,cs,NULL) != 0 ) break; + if (!hchar) ad=96*ad/100; + if (!gchar) ad=99*ad/100; + ac=LATIN_SMALL_LIGATURE_FF; + Setac(box1,ac,ad); + break; + } + // --- test ae --------------------------------------------------- + if( bc==UNKNOWN ) + for(ad=98;dx>4 && dy>6;){ // provisorium + DBG( wchar_t c_ask=LATIN_SMALL_LETTER_AE; ) + if (sdata->holes.num > 4) Break; /* tolerant against a tiny hole */ + if( num_cross( dx/4,dx-1,3*dy/16,3*dy/16,bp,cs) != 2 + && num_cross(dx-1-dx/4,dx-1,3*dy/16,3*dy/16,bp,cs) != 1 ) Break; + if( num_cross(0,dx-1,3*dy/ 4,3*dy/ 4,bp,cs) < 2 ) Break; + if( num_cross(0,dx-1, 0, dy-1,bp,cs) < 3 ) Break; + if( num_cross(dx-1,0, 0, dy-1,bp,cs) < 3 ) Break; + if( num_cross(0,dx-1, dy/16, dy/16,bp,cs) < 2 ) + if( num_cross(0,dx-1,1+dy/16,1+dy/16,bp,cs) < 2 ) Break; + if( num_cross(0,dx-1,dy-1-dy/16,dy-1-dy/16,bp,cs) < 2 ) Break; + for( x=0,i2=y=dy/4; y<3*dy/4; y++ ){ + j=loop(bp,0,y,dx,cs,0,RI); if(j>x) { i2=y; x=j; } + } if( x3*dx/4 ) Break; + for( x=0,i4=y=dy/4; y<3*dy/4; y++ ){ + j=loop(bp,dx-1,y,dx,cs,0,LE); if(j>x) { i4=y; x=j; } + } if( x3*dx/4 ) Break; + for( x=0,i4=y=dy/8; y<3*dy/4; y++ ){ + j=loop(bp,dx-1 ,y,dx,cs,0,LE); + j=loop(bp,dx-1-j,y,dx,cs,1,LE); + if(j>x) { i4=y; x=j; } + } if( xp,cs,NULL) != 1 ) Break; + if( num_hole(x0+dx/2-1,x1,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) Break; + ac=LATIN_SMALL_LETTER_AE; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + + } + // --- test AE --------------------------------------------------- + if( bc==UNKNOWN ) + for(ad=98;dx>5 && dy>6;){ // provisorium + DBG( wchar_t c_ask=LATIN_CAPITAL_LETTER_AE; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( num_cross(0,dx-1,3*dy/16,3*dy/16,bp,cs) < 2 ) Break; + if( num_cross(0,dx-1,3*dy/ 4,3*dy/ 4,bp,cs) < 2 ) Break; + if( num_cross(0,dx-1, 0, dy-1,bp,cs) < 3 ) Break; + if( num_cross(0,dx-1, dy/16, dy/16,bp,cs) != 1 + && num_cross(0,dx-1, dy/32, dy/32,bp,cs) != 1 + && num_cross(0,dx-1, 0, 0,bp,cs) != 1 ) Break; + // check for upper horizontal line + j=loop(bp,dx-1 ,0,dx,cs,0,LE); x=j; + j=loop(bp,dx-1-j,0,dx,cs,1,LE); + i=loop(bp,dx-1 ,1,dx,cs,0,LE); if (ij) j=i; + if (x>dx/8) Break; + if (jx) break; x=j; + j=loop(bp, j,y,dx,cs,1,RI); if(j>i1) { i1=j; i2=y; } + j=loop(bp,dx-1 ,y,dx,cs,0,LE); + j=loop(bp,dx-1-j,y,dx,cs,1,LE); if(j>i3) { i3=j; i4=y; } + } if( y<3*dy/4 || i1i1) { i1=j; } + j=loop(bp,dx-1 ,dy-1-y,dx,cs,0,LE); + j=loop(bp,dx-1-j,dy-1-y,dx,cs,1,LE); if(j>i3) { i3=j; } + } if( i1<=dx/4 || i3<=dx/4 ) Break; + for( x=dx-1-dx/8; x>dx/2; x-- ){ // look for right the E + if( num_cross(x,x, 0,dy-1,bp,cs) == 3 ) + if( num_cross(x,x, 0,dy/4,bp,cs) == 1 ) + if( num_cross(x-1,dx-1-dx/8,3*dy/4,3*dy/4,bp,cs) == 0 ) + if( num_cross(x,x,3*dy/4,dy-1,bp,cs) == 1 ) break; + } if (x<=dx/2) Break; // not found + if (sdata->holes.num != 1) Break; + if( num_hole(x0,x0+3*dx/4,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) Break; + // if( num_hole(x0, x1,y0,y1 ,box1->p,cs,NULL) != 1 ) Break; + ac=LATIN_CAPITAL_LETTER_AE; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + + } + // --- test /0 /o /O O_WITH_STROKE ----------------------------------------- + for(ad=99;dx>4 && dy>4;){ // provisorium + DBG( wchar_t c_ask=LATIN_SMALL_LETTER_O_WITH_STROKE; ) + if (sdata->holes.num > 3) Break; /* tolerant against a tiny hole */ + if( num_cross( 0,dx-1,dy/2,dy/2,bp,cs) != 3 ) Break; + if( num_cross(dx/2,dx/2, 0,dy-1,bp,cs) != 3 ) Break; + if (loop(bp,dx-1,3*dy/8,dx,cs,0,RI)>dx/8) Break; + if (loop(bp, 0,5*dy/8,dx,cs,0,RI)>dx/8) Break; + if( num_cross( 0,dx-1, 0, 0,bp,cs) > 2 ) Break; + if( num_cross(dx/4,dx-1, 0, 0,bp,cs) > 2 ) Break; + if( num_cross( 0,dx-1,dy-1,dy-1,bp,cs) > 2 ) Break; + if( num_cross( 0,3*dx/4,dy-1,dy-1,bp,cs) > 2 ) Break; + if( num_cross( 0, 0, 0,dy-1,bp,cs) > 2 ) Break; + if( num_cross(dx-1,dx-1, 0,dy-1,bp,cs) > 2 ) Break; + if( num_cross( 0, 0,dy/4,dy-1,bp,cs) > 2 ) Break; + if( num_cross(dx-1,dx-1, 0,3*dy/4,bp,cs) > 2 ) Break; + i1 =loop(bp,dx-1 , 0,dx,cs,0,LE); if( i1>dx/8 ) Break; + i1+=loop(bp,dx-1-i1, 0,dx,cs,1,LE); if( i1>dx/3 ) Break; i1=dx-1-i1; + i2 =loop(bp, 0,dy-1,dx,cs,0,RI); if( i2>dx/8 ) Break; + for(y=1;y3*dx/16 ) break; + } if( yholes.num != 2) Break; + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 2 ) Break; + + if ( hchar && 2*y0m1+box1->m2 ) + ac=LATIN_CAPITAL_LETTER_O_WITH_STROKE; + else ac=LATIN_SMALL_LETTER_O_WITH_STROKE; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + + } + // --- test /c /C C_WITH_STROKE CENT_SIGN -------------------------- + // here only the version with a continuously vertical line (not broken variant) + if( bc==UNKNOWN ) + for(ad=98;dx>4 && dy>4;){ // provisorium + DBG( wchar_t c_ask=CENT_SIGN; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if( num_cross( 0,dx-1,dy/2,dy/2,bp,cs) != 2 ) Break; + if( num_cross(0,dx-1-dx/4,dy/2,dy/2,bp,cs) != 2 ) Break; + if( num_cross(dx/2,dx/2, 0,dy-1,bp,cs) != 3 ) Break; + if( num_cross( 0,dx-1, 0, 0,bp,cs) > 2 ) Break; + if( num_cross(dx/4,dx-1, 0, 0,bp,cs) > 2 ) Break; + if( num_cross( 0,dx-1,dy-1,dy-1,bp,cs) > 2 ) Break; + if( num_cross( 0,3*dx/4,dy-1,dy-1,bp,cs) > 2 ) Break; + if( num_cross( 0, 0, 0,dy-1,bp,cs) > 2 ) Break; + if( num_cross(dx-1,dx-1, 0,dy-1,bp,cs) > 3 ) Break; + if( num_cross( 0, 0,dy/4,dy-1,bp,cs) > 2 ) Break; + if( num_cross(dx-1,dx-1, 0,3*dy/4,bp,cs) > 3 ) Break; + i1 =loop(bp,dx-1 , 0,dx,cs,0,LE); if( i1>dx/4 ) Break; + i1+=loop(bp,dx-1-i1, 0,dx,cs,1,LE); if( i1>dx/4 ) Break; i1=dx-1-i1; + i2 =loop(bp, 0,dy-1,dx,cs,0,RI); if( i2>dx/4 ) Break; + for(y=0;ydx/16+1) x-=dx/16+1; + j=loop(bp,x,y,dx,cs,0,RI); // fprintf(stderr,"\n x=%d j=%d",x,j); + if( j>(dx+4)/8 ) ad=96*ad/100; + if( j>(dx+2)/4 ) break; + } if( yp,cs,NULL) != 1 ) Break; + if (sdata->holes.num != 1) Break; + + ac=CENT_SIGN; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + + } + // --- test EURO_CURRENCY_SIGN ----------------------------------------- + if( bc==UNKNOWN ) + for(ad=98;dx>4 && dy>6;){ // provisorium + DBG( wchar_t c_ask='&'; ) + if (sdata->holes.num > 1) break; /* tolerant against a tiny hole */ + if( num_cross(dx/2,dx/2, 0,dy-1,bp,cs) != 4 ) break; + if( num_cross( 0,dx-1, 0, 0,bp,cs) != 1 ) break; + if( num_cross( 0,dx-1,dy-1,dy-1,bp,cs) != 1 ) break; + if( num_cross( 0,dx-1,dy/2,dy/2,bp,cs) != 1 ) break; + for(i=0,y=dy/4;ydx/4 ) break; + j=loop(bp,x,y,dx,cs,1,RI); if( j>i ) i=j; + } if( ydx/2 ) break; + } if( y>=dy-dy/4-1 ) break; + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) break; + if (sdata->holes.num != 0) break; + ac=EURO_CURRENCY_SIGN; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } + // --- test LETTER_C_WITH_CEDILLA --------------------------------------------------- + if (bc==UNKNOWN) + if (gchar) + for(ad=98;dx>3 && dy>6;){ // provisorium + DBG( wchar_t c_ask='c'; ) + if (sdata->holes.num > 0) break; /* no tolerant against tiny holes */ + j=loop(bp,dx-1,dy/16 ,dy,cs,0,LE); + x=loop(bp,dx-1,dy/16+1,dy,cs,0,LE); if (xdx) Break; // ~4 ocr-b + if( num_cross(0,dx-1,3*dy/16,3*dy/16,bp,cs) > 2 ) break; + if( num_cross(0,dx-1, 0, dy-1,bp,cs) < 2 ) break; + if( num_cross(0,dx-1, dy/16, dy/16,bp,cs) > 2 ) break; + for( x=dx,i2=y=dy/4; y<3*dy/4; y++ ){ + j=loop(bp,0,y,dx,cs,0,RI); if(j0 ) break; i1=x; + for( x=0,i4=y=dy/4; y<5*dy/8; y++ ){ + j=loop(bp,dx-1,y,dx,cs,0,LE); if(j>x) { i4=y; x=j; } + } if( xdy/4) break; + j =loop(bp,dx/2,j,dy,cs,0,DO); if(j3*dx) break; + j =loop(bp,dx-1-j/2,dy-1-dy/8,dy,cs,0,UP); if(j>dy/2) break; // ~() + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) break; + if (sdata->holes.num) break; + if( hchar ) ac= LATIN_CAPITAL_LETTER_C_WITH_CEDILLA; + else ac= LATIN_SMALL_LETTER_C_WITH_CEDILLA; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + + } + // --- test # --------------------------------------------------- + for(ad=99;dx>4 && dy>4;){ // never sure? + DBG( wchar_t c_ask='#'; ) + if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ + if (sdata->holes.num < 1) Break; + if( num_cross(0,dx-1, dy/8, dy/8,bp,cs) != 2 ) Break; + if( num_cross(0,dx-1,dy-1-dy/8,dy-1-dy/8,bp,cs) != 2 ) Break; + if( num_cross(0,dx-1, dy/2, dy/2,bp,cs) != 2 ) Break; + if( num_cross(0,dx/2, dy/2, dy/2,bp,cs) != 1 ) Break; + /* fat "#" have only small ends on left and right side, we tolerate this */ + j=loop(bp, 0,dy/8,dx,cs,0,RI); if(j<1 || j=dx/2) Break; if (j=dx/2) Break; if (j3*dx/4) { i1=0; break; } + j=loop(bp,j, y,dx,cs,1,RI); if(j>i1) { i1=j; } + j=loop(bp,0,dy-1-y,dx,cs,0,RI); if(j>3*dx/4) { i1=0; break; } + j=loop(bp,j,dy-1-y,dx,cs,1,RI); if(j>i3) { i3=j; } + } + if (i1holes.num != 1) {ad=95*ad/100;} + if( num_hole(x0+dx/8,x1-dx/8,y0+dy/8,y1-dy/8,box1->p,cs,NULL) != 1 ) Break; + // if( num_hole(x0 ,x1 ,y0 ,y1 ,box1->p,cs,NULL) != 1 ) Break; + + ac=(wchar_t) '#'; + if( gchar ) {ad=99*ad/100;} + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } + // --- test bullet, full_box, grabbed cursor, ZapfDingBats_156 + if (bc==UNKNOWN) + for(ad=96;dx>4 && dy>4 && 2*dx>dy;){ // provisorium + DBG( wchar_t c_ask='#'; ) + if( get_bw(x0,x1,y0,y1,box1->p,cs,2) != 0 ) break; + ac=BULLET; + if (gchar && !hchar) ad=80*ad/100; + Setac(box1,ac,ad); + if (ad>=100) return ac; + break; + } + /* --- test | (vertical line, could be a I or l) --- */ + for(ad=99;dy>4 && 2*dxp,cs,2) != 0 ) break; + /* more unsure if the borders are not exact */ + if( get_bw(x0 ,x0+dx/8,y0+dy/9,y1-dy/9,box1->p,cs,2) != 0 ) ad=99*ad/100; + if( get_bw(x1-dx/8,x1 ,y0+dy/9,y1-dy/9,box1->p,cs,2) != 0 ) ad=99*ad/100; + if( get_bw(x0+dx/8,x1-dx/8,y0 ,y0+dy/8,box1->p,cs,2) != 0 ) ad=99*ad/100; + if( get_bw(x0+dx/8,x1-dx/8,y1-dy/8,y1 ,box1->p,cs,2) != 0 ) ad=99*ad/100; + if (3*dxm2 && 2*y1> box1->m2+box1->m3) Break; + if (box1->m2 && 3*y1>2*box1->m2+box1->m3) ad=95*ad/100; + ac='|'; + if (!hchar) ad=98*ad/100; + Setac(box1,ac,ad); + break; + } + // --- test % --------------------------------------------------- + for(ad=100;dx>5 && dy>7;){ // provisorium + DBG( wchar_t c_ask='%'; ) + if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ + if( num_cross(x0,x1 ,y0+dy/4,y0+dy/4,box1->p,cs) != 3 + && num_cross(x0,x1 ,y0+dy/8,y0+dy/8,box1->p,cs) != 3 ) Break; + if( num_cross(x0,x1+dx/4,y1-dy/4,y1-dy/4,box1->p,cs) != 3 + && num_cross(x0,x1+dx/4,y1-dy/8,y1-dy/8,box1->p,cs) != 3 ) Break; + if( num_cross(x0,x1, y0, y1,box1->p,cs) < 4 + && num_cross(x0+dx/8,x1, y0, y1,box1->p,cs) < 4 + && num_cross(x0,x1+dx/4, y0, y1,box1->p,cs) < 4 + && dx>7 && dy>15) Break; + if( num_cross(x0,x1, y0, y1,box1->p,cs) !=5 ) ad=99*ad/100; + + if (dx>7 && dy>12) { + if( num_hole(x0 ,x1 ,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) Break; + if( num_hole(x0+dx/4,x1+dx/4,y0+dy/4,y1,box1->p,cs,NULL) != 1 ) Break; + if( num_hole(x0 ,x1+dx/4,y0,y1 ,box1->p,cs,NULL) != 2 ) Break; + } else ad=98*ad/100; + // use box1->p instead of b, because % is a sum of 3 objects + if ( loop(box1->p,x0,y0 ,dx,cs,0,RI) + <= loop(box1->p,x0,y0+dy/16+1,dx,cs,0,RI) ) ad=96*ad/100; // X + if ( loop(box1->p,x1,y1 ,dx,cs,0,LE) + <= loop(box1->p,x1,y1-1-dy/16,dx,cs,0,LE) ) ad=96*ad/100; // X + for (x=0;xp,cs,2) != 2 ) break; + } if (x=100) return ac; + break; + } + // --- test Omega --------------------------------------------------- + for(ad=d=99;dx>7 && dy>7;){ // min 3x4 + DBG( wchar_t c_ask=GREEK_CAPITAL_LETTER_OMEGA; ) + if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/3 , y1-dy/3,box1->p,cs,1) != 0 ) Break; + + if( num_cross(x0+dx/2,x0+dx/2,y0 , y1-dy/3,box1->p,cs) != 1 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND + if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y1 , y1 ,box1->p,cs) != 2 ) // against "rauschen" + if( num_cross(x0+dx/3,x1-dx/3,y1-1 , y1-1 ,box1->p,cs) != 2 ) Break; + if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + if (sdata->holes.num) Break; + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) break; + + if( loop(bp,0 ,0 ,x1-x0,cs,0,RI)<= + loop(bp,0 ,2 ,x1-x0,cs,0,RI) ) Break; + if( loop(bp,dx/2,dy-dy/4,x1-x0,cs,0,RI)>dx/4 + || loop(bp,dx/2,dy-dy/4,x1-x0,cs,0,LE)>dx/4 ) Break; + if( loop(bp,dx/2,3*dy/8,x1-x0,cs,0,RI)dx/8) Break; + x=loop(bp,i,dy-1-dy/16,x1-x0,cs,1,RI); i+=x; if(i<3*dx/8 || i>dx/2) Break; + x=loop(bp,i,dy-1-dy/16,x1-x0,cs,0,RI); i+=x; if(i5*dx/8) Break; + x=loop(bp,i,dy-1-dy/16,x1-x0,cs,1,RI); i+=x; if(i<7*dx/8) Break; + + /* look for a vertikal gap at lower end */ + for( x=dx/4;x<3*dx/4;x++ ){ + i=loop(bp,x,dy-1,y1-y0,cs,0,UP); + if( i>3*dy/4 ) break; + } + if( x>=3*dx/4 ) Break; + + if( !hchar ) ad=60*ad/100; + bc=GREEK_CAPITAL_LETTER_OMEGA; + Setac(box1,bc,ad); + break; + } + + return bc; +} + +// -------------------- OCR engine ;) ---------------------------- +wchar_t ocr0(struct box *box1, pix *bp, int cs){ + // pix p=*(box1->p); + int i,j,d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; + int dx=x1-x0+1,dy=y1-y0+1, /* size */ + rx,ry,r1,r2,i1,i2,ad; /* tmp-vars */ + // ad,ac will be used in future + wchar_t bc = UNKNOWN; // bestletter + wchar_t um = SPACE; // modifier '" + int hchar; // char is higher than e + int gchar; // char has ink lower than m3 + int aa[4][4]; /* corner points, see xX, (x,y,dist^2,vector_idx) v0.41 */ + ocr0_shared_t sdata; // data used in all subfunctions + + sdata.box1=box1; + sdata.bp=bp; + sdata.cs=cs; + // --- hchar --- gchar ------------------------- + hchar=0;if( y0 < box1->m2-(box1->m2-box1->m1)/2 ) hchar=1; + gchar=0;if( y1 > box1->m3+(box1->m4-box1->m3)/2 ) gchar=1; + // if the char is slightly moved down correction can be done + if ( y0m2 && y1>box1->m3 && 2*y1m3+box1->m4) // moved + if( 2*(y0-(y1-box1->m3))<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; + + sdata.hchar=hchar; + sdata.gchar=gchar; + + /* search for nearest points to the 4 courners, typical for xX */ + /* this is faster as calling nearest_frame_vector 4 times */ + aa[0][0]=aa[1][0]=aa[2][0]=aa[3][0]=(x0+x1)/2; /* set to center */ + aa[0][1]=aa[1][1]=aa[2][1]=aa[3][1]=(y0+y1)/2; /* set to center */ + aa[0][2]=aa[1][2]=aa[2][2]=aa[3][2]=2*sq(128); /* distance to box edges */ + aa[0][3]=aa[1][3]=aa[2][3]=aa[3][3]=0; /* vector index */ + /* searching for 4 diagonal line ends */ + for (i=0;inum_frame_vectors[0];i++) { + x=box1->frame_vector[i][0]; /* take a vector */ + y=box1->frame_vector[i][1]; + /* distance to upper left end, normalized to 128 */ + j=0; d=sq((x-x0)*128/dx)+sq((y-y0)*128/dy); + // fprintf(stderr," setaa i= %2d xy= %3d %3d d=%5d aa[3]=%2d\n",i,x-x0,y-y0,d,aa[0][3]); + if (dnum_frames>0) // speedup v0.42 + num_hole(x0,x1,y0,y1,box1->p,cs,&sdata.holes); // call once + // printf(" num_holes=%d\n",sdata.holes.num); + + /* + after division of two glued chars, boundaries could be wrong, + check this first (ToDo: only if a flag set?) + */ + if (2*y0 < box1->m2+box1->m3) + if (box1->m4>box1->m3 && 2*box1->y1>box1->m4+box1->m3){ + /* could be a "I" from divided "Ij" or "Ig" */ + for(y=(box1->m3+box1->m2)/2;2*ym3+box1->m4;y++) + if( get_bw(x0,x1,y,y,box1->p,cs,1)==0 ) break; + if(2*ym3+box1->m4) + if( get_bw((x0+x1)/2,(x0+x1)/2,y,box1->m4,box1->p,cs,1)==0 ){ + /* be sure, ~_ */ + if (y>y0) y1=box1->y1=y; + } + } + + DBG( IFV fprintf(stderr,"\nDBG L%d (%d,%d): ",__LINE__,box1->x0,box1->y0); ) + DBG( IFV out_b(box1,sdata.bp,0,0,dx,dy,160); ) + DBG( IFV fprintf(stderr,"# aa[] %d %d %d %d %d %d %d %d (4 corners)" + " d= %d %d %d %d", + aa[0][0]-x0,aa[0][1]-y0,aa[1][0]-x0,aa[1][1]-y0, + aa[2][0]-x0,aa[2][1]-y0,aa[3][0]-x0,aa[3][1]-y0, + aa[0][2], aa[1][2], aa[2][2], aa[3][2]);) + DBG( IFV fprintf(stderr,"\n# holes %d gchar=%d hchar=%d",sdata.holes.num, gchar, hchar);) + + // --- test thin lines - --------------------------------- + for( ad=100; 2*dym3-box1->m2 && 3*dx>=4*dy && dx>2; ){ // min 3x3 (small font) + DBG( wchar_t c_ask='-'; ) + if( get_bw(x0+dx/8+1,x1-dx/8-1,y0+dy/8+((dy>2)?1:0), + y1-dy/8-((dy>2)?1:0),box1->p,cs,2)==2 ) break; + if( box1->dots ) { Setac(box1,'=',97);break; } + if (dx<=2*dy) ad=98*ad/100; + if (dx<=3*dy) ad=99*ad/100; + if (!box1->m4) ad=96*ad/100; + else { + if (y1>=box1->m3) { + if ( dx<2*dy) ad=98*ad/100; + if (2*dx<3*dy) ad=98*ad/100; + Setac(box1,'_',ad); + break; + } + } + Setac(box1,'-',ad); if (ad>=100) return '-'; + break; + } + // --- test thin lines = --------------------------------- + for( ; dy>2 && dx>2; ){ // min 3x3 (small font) + DBG( wchar_t c_ask='='; ) + for( y=y0;yp,cs,1)==1 ) break; + if( get_bw(x0+dx/10,x1-dx/10,y ,y ,box1->p,cs,2)==2 ) break; + if( get_bw(x0 ,x1 ,(y+y1)/2,(y+y1)/2,box1->p,cs,1)==1 ) break; + if( get_bw(x0+dx/10,x1-dx/10,y1 ,y1 ,box1->p,cs,2)==2 ) break; + Setac(box1,'=',100); + return '='; + } + // --- test dots : --------------------------------- + for( ad=100; dy>2 && dy>=2*dx; ){ // max 3x3 (small font) + + DBG( wchar_t c_ask=':'; ) + // check the gap hight + for( i1=dy/16;i1p,cs,1)==0 ) break; + if (i1>=dy/2) break; + for( i2=dy/16;i2p,cs,1)==0 ) break; + if (i2>=dy/2) Break; + MSG(fprintf(stderr,"gap y12 %d %d",i1,i2);) + + if (box1->m3 && y1>box1->m3) ad=98*ad/100; // ~; + if (box1->m3 && 2*y0> box1->m2+box1->m1) ad=98*ad/100; // ~i + if (gchar) ad=99*ad/100; + ad=ad-abs(i1-i2)/dy*20; + if (abs(i1-dx)>dy/4) Break; // round or quadratic dots? + if (abs(i1-dx)>dy/8) ad=98*ad/100; + if (abs(i2-dx)>dy/4) Break; // round or quadratic dots? + if (abs(i2-dx)>dy/8) ad=98*ad/100; + if (box1->dots!=1) ad=96*ad/100; + Setac(box1,':',ad); // dx<=3 ad-- + if (ad>=100) return ':'; + break; + } + // --- test dots ; --------------------------------- + if( 2*y0> box1->m2+box1->m1 ) // ~i + if( 4*y1>=3*box1->m3+box1->m2 ) // ~: + for( ad=100; dy>5 && dx>1 && dy>2*dx; ){ // max 3x3 (small font) + DBG( wchar_t c_ask=';'; ) + // better would it be to detect round pixelcluster on top + // check high of upper and lower dot + for( i1=0;i1p,cs,1)==0 ) break; + if (i1>=dy/2) break; + for( i2=0;i2p,cs,1)==0 ) break; + if (i2m3) ad=97*ad/100; + if (i2-i1=100) return ';'; + break; + } + // --- first test small dots . --------------------------------- + if( 3*dym4-box1->m1 && abs(dx-dy)<(dx+dy)/4+2 + && 3*y1>=(2*box1->m3+ box1->m2) // dot near baseline? + && 5*y0>=(3*box1->m3+2*box1->m2) ){ // Jul00 + DBG( wchar_t c_ask='.'; ) + d=0; r1=60;r2=140; ad=99; + for(x=x0;x<=x1;x++)for(y=y0;y<=y1;y++){ /* circle equation */ + rx=100*(2*x-(x0+x1))/dx; // normalize to 15bit number + ry=100*(2*y-(y0+y1))/dy; + if( rx*rx + ry*ry < r1*r1 ) if( getpixel(box1->p,x,y)>=cs ){ d++;x=x1+1;y=y1+1; } + if( rx*rx + ry*ry > r2*r2 ) if( getpixel(box1->p,x,y)< cs ){ d++;x=x1+1;y=y1+1; } + // fprintf(stderr,"\nDBG . x= %3d %3d r= %6d %6d %6d", rx, ry, rx*rx+ry*ry, r1*r1, r2*r2); + } + if(d==0) + if( loop(box1->p,x0,y0,x1-x0,cs,0,RI) + <= loop(box1->p,x0,y1,x1-x0,cs,0,RI) + || loop(box1->p,x1,y0,x1-x0,cs,0,LE) + >= loop(box1->p,x1,y1,x1-x0,cs,0,LE) ) + { + bc='.'; if (box1->dots) { Setac(box1,':',ad); ad=98*ad/100; } + Setac(box1,bc,ad); + } + } + // --- first test small dots , --------------------------------- + if( 3*dy<2*(box1->m4-box1->m1) + && 2*y0> box1->m2+box1->m3 + && (2*dx<3*dy + || get_bw(0,dx/2,dy/2,dy-1,bp,cs,1)==0) ){ // ocr-a-, + DBG( wchar_t c_ask=','; ) + ad=100; bc=','; + if (dy==1 && dx==1) ad=98*ad/100; + if (dy==2 && dx==1) ad=99*ad/100; // this is a problem case + if (dx>=dy) ad=99*ad/100; + if( 2*dy >= box1->m4-box1->m1) ad=98*ad/100; + if( loop(box1->p,x0,y0,x1-x0,cs,0,RI) /* simple line */ + > loop(box1->p,x0,y1,x1-x0,cs,0,RI) + && loop(box1->p,x1,y0,x1-x0,cs,0,LE) + < loop(box1->p,x1,y1,x1-x0,cs,0,LE) ) { ad=99*ad/100; } + else { /* with upper circle */ + if( loop(box1->p,x0,(y0+y1+1)/2,x1-x0,cs,0,RI)p,x1, y1 ,x1-x0,cs,0,LE)p,x0,y1-((dy>5)?1:0),x1-x0,cs,0,LE)>(dx+1)/2 ) + if( loop(box1->p,x0, y1 ,x1-x0,cs,0,LE)>(dx+1)/2 ) ad=96*ad/100; + } + if(box1->dots==1) { Setac(box1,';',ad); ad=99*ad/100; } + Setac(box1,bc,ad); + } + // --- first test small dots '" --------------------------------- + if( 2*dy < box1->m4 -box1->m1+1 + && 2*y0 < box1->m2 +box1->m3 + && 3*y1 < box1->m2+2*box1->m3+2 ){ + DBG( wchar_t c_ask='\''; ) + ad=100; bc='\''; + if (2*y1 >= box1->m2+box1->m3) { ad=96*ad/100; MSG({}) } // ~! + if (3*y1>=2*box1->m2+box1->m3) { ad=96*ad/100; MSG({}) } + if (get_bw(x0,x1,(box1->m2+box1->m3)/2,box1->m4,box1->p,cs,1)!=0) + { ad=98*ad/100; MSG({}) } + if (dx>4 + && num_cross(x0,x1,y1,y1,box1->p,cs) == 2) { // " " + bc='"'; + // ocr-a-" has no gap! + if ( get_bw((x0+x1)/2,(x0+x1)/2,y0,y1,box1->p,cs,1)!=0 ) ad=96*ad/100; + } else { + if ( num_cross(x0,x1, y0 , y0 ,box1->p,cs)!=1) ad=96*ad/100; + if ( num_cross(x0,x1,(y0+y1)/2,(y0+y1)/2,box1->p,cs)!=1) ad=98*ad/100; + if (dx>dy) { ad=96*ad/100; MSG({}) } + } + if (2*y0 > box1->m1+box1->m2) ad=99*ad/100; + Setac(box1,bc,ad); + if (ad>=100) return bc; + } + // --- TILDE ~ --------------------------------- + if( 2*dym4-box1->m1 && dx>=dy && dx>3 && dy>1 + && 2*y0< box1->m1+box1->m2 + && 3*y1<2*box1->m2+box1->m3 ){ + if( loop(box1->p,x0,y0,dx,cs,0,RI) + > loop(box1->p,x0,y1,dx,cs,0,RI) + && loop(box1->p,x1,y0,dx,cs,0,LE) + < loop(box1->p,x1,y1,dx,cs,0,LE) + && num_cross(x0,x1,y0,y0,box1->p,cs) == 2 + && num_cross(x0,x1,y1,y1,box1->p,cs) == 2 ) { + DBG( wchar_t c_ask='~'; ) + bc=TILDE; + Setac(box1,bc,99); + } + } + // --- CIRCUMFLEX, hat ^ --------------------------------- + if( 2*dym4-box1->m1 && dx>=dy && dx>2 && dy>1 + && 2*y0< box1->m1+box1->m2 + && 3*y1<2*box1->m2+box1->m3 ){ + DBG( wchar_t c_ask='^'; ) + if( ( loop(box1->p,x0,y0 ,dx,cs,0,RI) + > loop(box1->p,x0,y1 ,dx,cs,0,RI)-dx/8 + || loop(box1->p,x0,y0 ,dx,cs,0,RI) + > loop(box1->p,x0,y1-1,dx,cs,0,RI)-dx/8 ) + && ( loop(box1->p,x1,y0 ,dx,cs,0,LE) + > loop(box1->p,x1,y1 ,dx,cs,0,LE)-dx/8 + || loop(box1->p,x1,y0 ,dx,cs,0,LE) + > loop(box1->p,x1,y1-1,dx,cs,0,LE)-dx/8 ) + && num_cross(x0,x1,y0 ,y0 ,box1->p,cs) == 1 + && ( num_cross(x0,x1,y1 ,y1 ,box1->p,cs) == 2 + || num_cross(x0,x1,y1-1,y1-1,box1->p,cs) == 2 )) { + bc='^'; + Setac(box1,bc,99); + } + } + // ------------------------------------------------------ +// if( dots==1 ){ um='\''; } +#if 0 /* ToDo: change to vectors, call here or in whatletter */ + if (box1->dots==0) { // i-dots ??? (if dots==0 is wrong) + y=box1->m1; + for(;yp,cs,1)==1) break; + { i1=y; + if( yp,cs,1)==0) break; + if( ybox1->m2-box1->m1){ + testumlaut(box1,cs,2,&um); // set modifier + new y0 ??? + + } + } + } +#else + um = box1->modifier; +#endif + if ( /* um==ACUTE_ACCENT || */ um==DIAERESIS){ + for(y=y1;y>y0;y--) + if( get_bw(x0,x1,y,y,box1->p,cs,1)==0) { y0=y; dy=y1-y0+1; break; } // scan "a "o "u + } + + // --- test numbers 0..9 --- separated for faster compilation + if( JOB->cfg.only_numbers ) return ocr0n(&sdata); + + // bc=ocr1(box1,bp,cs); + if(bc!=UNKNOWN && box1->num_ac>0 && box1->wac[0]==100) + return bc; // for fast compilable tests + + // ------ separated for faster compilation + // ToDo: inser ocr0_shared_t here and split into a,b,cC,d,e,f,g9,... +#define IF_NOT_SURE if(bc==UNKNOWN || box1->num_ac==0 || box1->wac[0]<100) + + IF_NOT_SURE bc=ocr0_eE(&sdata); + IF_NOT_SURE bc=ocr0_f(&sdata); + IF_NOT_SURE bc=ocr0_bB(&sdata); + IF_NOT_SURE bc=ocr0_dD(&sdata); + IF_NOT_SURE bc=ocr0_F(&sdata); + IF_NOT_SURE bc=ocr0_uU(&sdata); + IF_NOT_SURE bc=ocr0_micro(&sdata); + IF_NOT_SURE bc=ocr0_vV(&sdata); + IF_NOT_SURE bc=ocr0_rR(&sdata); + IF_NOT_SURE bc=ocr0_m(&sdata); + IF_NOT_SURE bc=ocr0_tT(&sdata); + IF_NOT_SURE bc=ocr0_sS(&sdata); + IF_NOT_SURE bc=ocr0_gG(&sdata); + IF_NOT_SURE bc=ocr0_xX(&sdata); + IF_NOT_SURE bc=ocr0_yY(&sdata); + IF_NOT_SURE bc=ocr0_zZ(&sdata); + IF_NOT_SURE bc=ocr0_wW(&sdata); + IF_NOT_SURE bc=ocr0_aA(&sdata); + IF_NOT_SURE bc=ocr0_cC(&sdata); + IF_NOT_SURE bc=ocr0_lL(&sdata); + IF_NOT_SURE bc=ocr0_oO(&sdata); + IF_NOT_SURE bc=ocr0_pP(&sdata); + IF_NOT_SURE bc=ocr0_qQ(&sdata); + IF_NOT_SURE bc=ocr0_iIjJ(&sdata); + IF_NOT_SURE bc=ocr0_n(&sdata); + IF_NOT_SURE bc=ocr0_M(&sdata); + IF_NOT_SURE bc=ocr0_N(&sdata); + IF_NOT_SURE bc=ocr0_h(&sdata); + IF_NOT_SURE bc=ocr0_H(&sdata); + IF_NOT_SURE bc=ocr0_k(&sdata); + IF_NOT_SURE bc=ocr0_K(&sdata); + IF_NOT_SURE bc=ocr0n(&sdata); + IF_NOT_SURE bc=ocr0_brackets(&sdata); + IF_NOT_SURE bc=ocr0p9(&sdata); + IF_NOT_SURE bc=ocr0px(&sdata); + + + if(box1->num_ac==0 && bc!=UNKNOWN) fprintf(stderr,""); + if(box1->num_ac>0 && box1->wac[0]>95) box1->c=bc=box1->tac[0]; + /* will be removed later, only fix old things */ + for (i=0;inum_ac;i++) if (box1->tac[i]==bc) { bc=box1->tac[0]; } + + return bc; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h new file mode 100644 index 000000000..4c67d77ba --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h @@ -0,0 +1,63 @@ +#ifndef _OCR0_H +#define _OCR0_H +#include "pgm2asc.h" + +/* ---------------------------------------------------------------- + - functions with thousand of lines make the compilation very slow + therefore the ocr0-function is splitted in subfunctions + - shared data used often in ocr0-subroutines are stored + in ocr0_shared structure. + * ------------------------------------------------------------ */ + +typedef struct ocr0_shared { /* shared variables and properties */ + + struct box *box1; /* box in whole image */ + pix *bp; /* extracted temporarly box, cleaned */ + int cs; /* global threshold value (gray level) */ + + /* ToDo: or MACROS: X0 = box1->x0 */ + int x0, x1, y0, y1; /* box coordinates related to box1 */ + int dx, dy; /* size of box */ + int hchar, gchar; /* relation to m1..m4 */ + int aa[4][4]; /* corner points, see xX (x,y,dist^2,vector_idx) v0.41 */ + holes_t holes; /* list of holes (max MAX_HOLES) */ + +} ocr0_shared_t; + +/* tests for umlaut */ +int testumlaut(struct box *box1, int cs, int m, wchar_t *modifier); +/* detect chars */ +wchar_t ocr0(struct box *box1, pix *b, int cs); +/* detect numbers */ +wchar_t ocr0n(ocr0_shared_t *sdata); + +static inline int sq(int x) { return x*x; } /* square */ + +/* + * go from vector j1 to vector j2 and measure maximum deviation of + * the steps from the line connecting j1 and j2 + * return the squared maximum distance + * in units of the box size times 1024 + */ +int line_deviation( struct box *box1, int j1, int j2 ); + +/* + * search vectors between j1 and j2 for nearest point a to point r + * example: + * + * r-> $$...$$ $ - mark vectors + * @@$..@@ @ - black pixels + * @@$..@@ . - white pixels + * @@@@.$@ + * a-> @@$@$@@ + * @$.@@@@ + * @@..$@@ + * @@..$@@ + * j1 --> $$...$$ <-- j2 + * + * ToDo: vector aa[5] = {rx,ry,x,y,d^2,idx} statt rx,ry? + * j1 and j2 must be in the same frame + * return aa? + */ +int nearest_frame_vector( struct box *box1, int j1, int j2, int rx, int ry); +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c new file mode 100644 index 000000000..c833c5886 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c @@ -0,0 +1,1254 @@ +/* ocr-engine numbers only */ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + + OCR engine (c) Joerg Schulenburg + first engine: rule based --- numbers 0..9 + +*/ + +#include +#include +/* #include "pgm2asc.h" */ +#include "ocr0.h" +#include "ocr1.h" +#include "gocr.h" + +/* only for debugging and development */ +#define IFV if(JOB->cfg.verbose&4) +#define MM {IFV fprintf(stderr,"\nDBG %c L%04d (%d,%d): ",(char)c_ask,__LINE__,box1->x0,box1->y0);} + +/* the old debug mode (0.40) was only for a special char, for another char + * code must be recompiled with C_ASK='char' + * new debug mode (0.41) explains why char is declined or accepted as ABC... + * the output can be filtered by external scripts + * ToDo: we could reduce output to filter string + */ +#ifndef DO_DEBUG /* can be defined outside */ +#define DO_DEBUG 0 /* 0 is the default */ +#endif + +/* this macro is for debugging output: "if char is declined, why?" */ +#if DO_DEBUG /* 0=Work mode, 1=debugging mode */ +// Setac: output, that char is choosen with a probability +// Break: output, why the char is not choosen +// MSG: debugging functions for char C_ASK, mostly messages +// DBG: definitions usefull only for debugging +#define Setac(box1,ac,ad) { MM;IFV fprintf(stderr,"setac %d",ad);setac(box1,ac,ad); } +#define Break { MM;IFV fprintf(stderr,"break"); break; } +#define MSG(x) { MM;IFV x } +#define DBG(x) x +#else +#define Setac(box1,ac,ad) setac(box1,ac,ad) +#define Break break +#define MSG(x) +#define DBG(x) +#endif + +/* extern "C"{ */ + +// OCR engine ;) +wchar_t ocr0n(ocr0_shared_t *sdata){ + struct box *box1=sdata->box1; + pix *bp=sdata->bp; + int d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; + int dx=x1-x0+1,dy=y1-y0+1,cs=sdata->cs; // size + int xa,xb,ya,yb, /* tmp-vars */ + i1,i2,i3,i4,i,j; + int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ + wchar_t bc=UNKNOWN; // best char + int ad=0; // propability 0..100 + int hchar=sdata->hchar; // char is higher than 'e' + int gchar=sdata->gchar; // char has ink lower than m3 + int dots=box1->dots; + // --- test 5 near S --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( char c_ask='5'; ) + if (sdata->holes.num > 1) Break; /* be tolerant */ + if( num_cross( dx/2, dx/2,0,dy-1,bp,cs)!=3 + && num_cross(5*dx/8,3*dx/8,0,dy-1,bp,cs)!=3 ) Break; + + i1=loop(bp,dx-1,dy-1,dx,cs,0,LE); + i2=loop(bp,dx-1,dy-2,dx,cs,0,LE); + if (i2-i1 >= dx/4) Break; // ~{ 5x7font + + // get the upper and lower hole koords, y around dy/4 ??? + x=5*dx/8; + y =loop(bp,x,0,dy,cs,0,DO); if(y>dy/8) Break; + y +=loop(bp,x,y,dy,cs,1,DO); if(y>dy/4) Break; + i1 =loop(bp,x,y,dy,cs,0,DO)+y; if(i1>5*dy/8) Break; + i3=y=(y+i1)/2; // upper end can be shifted to the right for italic + x =loop(bp,0,y,dx,cs,0,RI); if(x>4*dx/8) Break; + x +=loop(bp,x,y,dx,cs,1,RI); if(x>5*dx/8) Break; + i1 =loop(bp,x,y,dx,cs,0,RI); i1=(i1+2*x)/2; // upper center (i1,i3) + y=11*dy/16; + x =loop(bp,dx-1 ,y,dx,cs,0,LE); if(x>dx/4) Break; + x +=loop(bp,dx-1-x,y,dx,cs,1,LE); if(x>dx/2) Break; + i2 =loop(bp,dx-1-x,y,dx,cs,0,LE); i2=dx-1-(i2+2*x)/2; // lower center x + + MSG( fprintf(stderr,"i1,i3=%d,%d i2=%d (upper+lower center)",i1,i3,i2);) + + y =loop(bp,i1,0,dy,cs,0,DO); + y +=loop(bp,i1,y,dy,cs,1,DO); + y =(3*y+i3)/4; + if( num_cross( i1, dx-1, y, y,bp,cs)>0 ){ /* S or serif5 ? */ + y =loop(bp,i1 ,i3,dy,cs,0,DO); + i =loop(bp,i1-1,i3,dy,cs,0,DO); + if (y>i ) ad=99*ad/100; /* looks like S */ + y =loop(bp,i1 ,i3,dy,cs,0,UP); + i =loop(bp,i1+1,i3,dy,cs,0,UP); + if (ii ) ad=99*ad/100; /* looks like S */ + if( num_cross( 0, dx/2, dy-1, dy-1,bp,cs)>1 + && num_cross( dx/2,dx-1, 0, 0,bp,cs)>1 ) ad=98*ad/100; /* serifs */ + if (loop(bp,0,dy-1,dx,cs,0,RI)==0) ad=98*ad/100; /* S or 7segment */ + ad=99*ad/100; + } + + for(y=dy/5;y<3*dy/4;y++) // right gap? + if( num_cross(i1,dx-1,y,y,bp,cs)==0 ) break; + if( y==3*dy/4 ) Break; + + for(y=dy/4;y<=11*dy/16;y++) // left gap? + if( num_cross(0,i2,y,y,bp,cs)==0 ) break; + if( y>11*dy/16 ) Break; + + // if( num_hole( x0, x1, y0, y1, box1->p,cs,NULL) > 0 ) break; + if (sdata->holes.num>0) Break; + + // sS5 \sl z left upper v-bow ? + for(x=dx,i=y=dy/4;yi2 ) i2=i; + i3=loop(bp,0, y ,dx,cs,0,RI); + i =loop(bp,0, y-1,dx,cs,0,RI); if( i=20 && dx<16 ) /* tall S */ + if( loop(bp,0, dy/5 ,dx,cs,0,RI) + ==loop(bp,0, dy/4 ,dx,cs,0,RI) + && + loop(bp,0, dy/10 ,dx,cs,0,RI) + >loop(bp,0, dy/4 ,dx,cs,0,RI) + && + loop(bp,0, 1 ,dx,cs,0,RI) + >loop(bp,0, dy/4 ,dx,cs,0,RI)+1 + && + loop(bp,dx-1, 0 ,dx,cs,0,LE) + >loop(bp,dx-1, 1 ,dx,cs,0,LE) ) Break; + + if( dy>=30 && dx>15 ) /* large S */ + if( loop(bp,dx/4,3*dy/10,dy,cs,1,DO)>0 ) // check start + if( loop(bp,dx-2,3*dy/4 ,dy,cs,1,UP)>0 ) // check end + if( num_cross(dx/4,dx-2,3*dy/10,3*dy/4,bp,cs)==1 ) Break; // connected? + + if( dy>17 && dx>9 ) /* S */ + if( loop(bp, 0,dy/2 ,dx,cs,0,RI)0 ) // check start + if( loop(bp,dx-2,2*dy/3 ,dy,cs,1,UP)>0 ) // check end + if( loop(bp, 0, dy/16,dx,cs,0,RI) + >= loop(bp,dx-1, dy-1-dy/16,dx,cs,0,LE) ) ad=ad*98/100; + if( loop(bp,dx-1, dy/16,dx,cs,0,LE) + >= loop(bp, 0, dy-1-dy/16,dx,cs,0,RI) + && loop(bp,dx-1, dy/16,dx,cs,0,LE) + >= loop(bp, 0, dy-1,dx,cs,0,RI) ) ad=ad*98/100; + + if ( gchar) ad=99*ad/100; + if (!hchar) ad=99*ad/100; + Setac(box1,(wchar_t)'5',ad); + if (ad==100) return '5'; + break; + + } + // --- test 1 --------------------------------------------------- + for(ad=d=100;dy>4 && dy>dx && 2*dy>box1->m3-box1->m2;){ // min 3x4 + DBG( char c_ask='1'; ) + if( dots==1 ) Break; + if (sdata->holes.num > 1) Break; /* be tolerant */ + + if( num_cross(0, dx-1, 0 , 0 ,bp,cs) != 1 + && num_cross(0, dx-1, 1 , 1 ,bp,cs) != 1 ) Break; + if( num_cross(0, dx-1,dy/2,dy/2,bp,cs) != 1 ) Break; + if( num_cross(0, dx-1,dy-1,dy-1,bp,cs) != 1 + && num_cross(0, dx-1,dy-2,dy-2,bp,cs) != 1 ) Break; + /* 5x7 micr + + ooo + .$. ooo + $@. oo + .$. oo + .@. ooooo + .$. ooooo + $@$ ooooo + + */ + + i4=0; // human font + if( num_cross(0, dx-1,3*dy/4,3*dy/4,bp,cs) != 2 ) { // except ocr-a + for( y=1; y=dy/2) ad=98*ad/100; + for( i=dy/8,y=7*dy/16;y8 && !i ) Break; + } else { // ocr-a-1 + /* @@@.. + ..@.. + ..@.. + ..@.. + ..@.@ + ..@.@ + @@@@@ */ + i= loop(bp,dx/2,0,dy,cs,0,DO); + if (loop(bp,dx/2,i,dy,cs,1,DO) 1 + && num_cross(0, dx-1, 1 , 1 ,bp,cs) > 1 ) Break; // ~/it_7 + + // calculate upper and lower mass center (without lower serif) + + x =loop(bp,0,7*dy/8-1,dx,cs,0,RI); i2=x; + x+=loop(bp,x,7*dy/8-1,dx,cs,1,RI)-1; i2=(i2+x)/2; + + i1=loop(bp,dx-1 ,1+0* dy/4,dx,cs,0,LE); i1=dx-1-i1-(x-i2)/2; + + x =(i1-i2+4)/8; i1+=x; i2-=x; + + if( get_line2(i1,0,i2,dy-1,bp,cs,100)<95 ) { // dont work for ocr-a-1 + i1=loop(bp,dx-1 ,1+0* dy/4,dx,cs,0,LE); i1=dx-1-i1; + if( get_line2(i1,0,i2,dy-1,bp,cs,100)<95 ) Break; + } + // upper and lower width + x =loop(bp,(i1+i2)/2,dy/2,dx,cs,1,RI); i=x; i3=0; + for(y=0;y<7*dy/8;y++) + if( loop(bp,i1+y*(i2-i1)/dy, y,dx,cs,1,RI)-i > 1+dx/8 ) break; + if(y<7*dy/8) ad=98*ad/100; // serif or ocr-a-1 ? + if(y<6*dy/8) ad=99*ad/100; /* MICR E-13B font Jan07 */ + if(y<4*dy/8) Break; +// out_x(box1); printf(" i12=%d %d\n",i1,i2); + x =loop(bp,i2,dy-1,dx,cs,1,LE); j=x; + x =loop(bp,i2,dy-2,dx,cs,1,LE); if(x>j)j=x; i=j; + x =loop(bp,i2,dy-1,dx,cs,1,RI); j=x; + x =loop(bp,i2,dy-2,dx,cs,1,RI); if(x>j)j=x; + if(abs(i-j)>1+dx/8) i3|=1; + if(i3) Break; +// out_x(box1);printf(" 11 i=%d j=%d i2=%d dx=%d\n",i,j,i1,dx); + // get most left upper point (i,j) + for(i=dx,j=y=0;y<7*dy/16;y++){ + x =loop(bp,0,y,dx,cs,0,RI); if(x 7*dx/16 MICR E-13B font + if ( i1-i<4*dx/16 ) Break; + x =loop(bp,0,dy/2,dx,cs,0,RI); // right distance + j =loop(bp,x,dy/2,dx,cs,1,RI); // thickness + if( j>x+(dy+16)/32 ) ad=98*ad/100; // ~l but MICR E-13B font + x =loop(bp,0,0,dx,cs,0,RI); // straight line ??? + j =loop(bp,0,1,dx,cs,0,RI); if( j>x ) Break; // ~l + if( x==j ) j =loop(bp,0,dy/8,dx,cs,0,RI); if( j>x && !i4) Break; + if( x==j ) if(loop(bp,0,dy/4,dx,cs,0,RI)>x) { // ~l + // check micr-1 first before taken as 'l' + if (loop(bp,dx-1,dy/8,dx,cs,0,LE)<=dx/4 + && loop(bp,0,3*dy/4,dx,cs,1,RI)=x ) Break; x=j; // ~l +// j =loop(bp,0, 0,dx,cs,0,DO); if( !j ) Break; // ~7 + if( !hchar ) // ~ right part of n + if( loop(bp,dx-1, 1,dx,cs,0,LE)-dy/6 + > loop(bp,dx-1,dy/4,dx,cs,0,LE) + || get_bw(x1+1,x1+2,y0,y0+dy/8,box1->p,cs,1)==1 ) Break; // Mai00 + if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE) > dx/2 + && get_bw(x1-dx/4,x1,y1-1,y1,box1->p,cs,1)==1 ) Break; // ~z Jun00 + + i=loop(bp, dx/8,0,dy,cs,0,DO); + for (y=dy,x=dx/2;x<3*dx/4;x++){ /* get upper end */ + j=loop(bp,x,0,dy,cs,0,DO); if (j=i) ad=97*ad/100; // ~\tt l ??? ocr-a_1 + + if( loop(bp, 0, dy/8,dx,cs,0,RI) + -(dx-loop(bp,dx-1,7*dy/8,dx,cs,0,LE)) > dx/4 ) Break; // ~/ + + i= loop(bp, 0, 0,dy,cs,0,DO); // horizontal line? + if(dy>=12 && i>dy/8 && iloop(bp,dx-1, i,dx,cs,0,LE) + || loop(bp,dx-1,3*dy/16,dx,cs,0,LE)-dx/8 + >loop(bp,dx-1, i+1,dx,cs,0,LE) ) Break; // ~t,~f + i= loop(bp, 0,dy-1-dy/32,dx,cs,0,RI); + x= loop(bp, 0,dy-2-dy/32,dx,cs,0,RI); if (idx/8 + && loop(bp,dx-1, 3*dy/4,dx,cs,0,LE)-dx/8 + >loop(bp,dx-1,dy-1-dy/32,dx,cs,0,LE) ) Break; // ~t + if( loop(bp, 0,i-1,dx,cs,0,RI)>1 && dx<6) { + ad=99*ad/100; + if ( loop(bp,dx-1,i-1,dx,cs,0,LE)>1 ) Break; // ~t + } + } + + if (dx>8){ + if (loop(bp,0,3*dy/4,dx,cs,0,RI)- + loop(bp,0,dy/2-1,dx,cs,0,RI)>dx/4) ad=95*ad/100; // ~3 + if (loop(bp,dx-1,dy/2-1,dx,cs,0,LE)- + loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/8) ad=95*ad/100; // ~3 + if (loop(bp,dx-1, dy/16,dx,cs,0,LE)- + loop(bp,dx-1, dy/4,dx,cs,0,LE)>dx/8) ad=95*ad/100; // ~23 + } + /* font 5x9 "2" recognized as "1" */ + i=loop(bp,dx-1-dx/8,dy-1,dy,cs,0,UP); + if (i<=dy/4) { + i+=loop(bp,dx-1-dx/8,dy-1-i,dy,cs,1,UP); + if (i<=dy/4) { + i=loop(bp,dx-1-dx/8,dy-1-i,dy,cs,0,LE); + if (2*i>=dx && loop(bp,dx/4,0,dy,cs,0,DO)i+dx/8) { break; } + } if (y>=dy/2) ad=95*ad/100; // Feb07 care plates, right black border + + if (sdata->holes.num > 0) Break; // mini holes should be filtered + if (!box1->m3 && ad>98) ad=98; else { + if (!hchar) ad=99*ad/100; + if (box1->y0>box1->m2) ad=98*ad/100; + if (box1->y1<(1*box1->m2+3*box1->m3)/4) ad=98*ad/100; + if (box1->y1-box1->y0<(box1->m3-box1->m1)/2) ad=98*ad/100; + if ( gchar) ad=99*ad/100; + } + + Setac(box1,(wchar_t)'1',ad); + break; + } + // --- test 2 old pixelbased - remove! ----------------------------- +#ifdef Old_pixel_based + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + DBG( char c_ask='2'; ) + if (sdata->holes.num > 1) Break; /* be tolerant */ + if( get_bw(x0+dx/2, x0+dx/2 , y1-dy/5, y1 ,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2 , y0 , y0+dy/5,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/8, x1-dx/3 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; + + if( get_bw(x1-dx/3, x1 , y0+dy/3 , y0+dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0 , x0+dx/ 8, y1-dy/16, y1 ,box1->p,cs,1) != 1 ) Break; + if( num_cross(x0, x1-dx/8, y0+dy/2, y0+dy/2,box1->p,cs) != 1 ) Break; + if( get_bw(x0, x0+dx/9 , y0 , y0 ,box1->p,cs,1) == 1 + && get_bw(x0, x0+dx/2 ,y0+3*dy/16,y0+3*dy/16,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0, x0+dx/9 , y0 , y0 ,box1->p,cs,1) + != get_bw(x1-dx/9, x1 , y0 , y0 ,box1->p,cs,1) ) + { if (dx<6 && dy<9) ad=99*ad/100; else Break; } + // out_x(box1); + + for( x=x0+dx/4;xp,cs) == 2 ) break; + if( x>=x1-dx/6 ) Break; + + for( x=x0+dx/4;xp,cs) == 2 ) break; + if( x>=x1-dx/6 ) Break; + + for(i=1,y=y0;yp,cs) == 2 ) i=0; + if( i ) ad=99*ad/100; // ToDo: ocr-a-2 should have 100% + + for(i=1,y=y0+dy/5;yp,cs,1) == 0 ) i=0; + if( i ) Break; + + x=x1-dx/3,y=y1; /* center bottom */ + turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,ST,UP); if( yp,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,RI,ST); + if( xp,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,RI,ST); + if( xp,x1,y0+y,dx,cs,0,LE); // use p (not b) for broken chars + if( ix ) x=i; + } + if (y>dy/3 ) Break; // z + + // hole is only allowed in beauty fonts + // if( num_hole( x0, x1, y0, y1,box1->p,cs,NULL) > 0 ) // there is no hole + // if( num_hole( x0, x0+dx/2, y0, y0+dy/2,box1->p,cs,NULL) == 0 ) // except in some beauty fonts + if (sdata->holes.num>0) + if (sdata->holes.hole[0].x1 >= dx/2 || sdata->holes.hole[0].y1 >= dy/2) + Break; + + i1=loop(bp,dx-1-dx/16,0,dy,cs,0,DO); // Jul00 + i2=loop(bp, dx/ 2,0,dy,cs,0,DO); if( i2+dy/32>=i1 ) Break; // ~z + i1=loop(bp,dx-1,dy-3*dy/16,dx,cs,0,LE); + i2=loop(bp, 0,dy-3*dy/16,dx,cs,0,RI); if( i2>i1 ) ad=98*ad/100; // ~i + if (dots) ad=98*ad/100; // i + if (loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE)>dx/4) ad=96*ad/100; // \it i + + if ((!hchar) && box1->m4!=0) ad=80*ad/100; + Setac(box1,(wchar_t)'2',ad); + if (ad==100) return '2'; + break; + } +#endif + // --- test 2 new edge based v0.44 -------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // min 3x4 + // rewritten for vectors 0.42 + int ld, i1, i2, i3, i4, i5, i6, i7; // line derivation + corners + DBG( wchar_t c_ask='2'; ) + if (sdata->holes.num > 0) Break; /* no hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the lower ends, must be near to the corner */ + if (aa[1][2]>d/4) Break; /* [2] = distance, ~7... */ + if (aa[2][2]>d/2) Break; /* [2] = distance, ~r... */ + if (aa[0][2]>d/1) Break; /* [2] = distance, ~d... */ + if (aa[3][2]>d/1) Break; /* [2] = distance, ~bhk... */ + /* searching for 4 notches between neighbouring ends */ + +/* + type A B + + 1OOO OO + 2 1 2 <- 6 + 7-> OOOO O + O O <- 5 + 3OO4 3OO4 +*/ + + /* get a point on the inner low left side of the J */ + i =box1->num_frame_vectors[0] - 1; + /* rightmost point on upper left side */ + i2=nearest_frame_vector(box1, aa[0][3], aa[1][3], x1+dx, y0+dy/4); + /* upper leftmost vector */ + i1=nearest_frame_vector(box1, aa[0][3], i2, x0-dx, (y0+y1)/2); + i3=aa[1][3]; + /* low leftmost vector */ + i5=nearest_frame_vector(box1, aa[2][3], aa[3][3], x0, y1); + /* low mostright vector */ + i4=nearest_frame_vector(box1, aa[1][3], i5, x1+dx, y1); + /* next local max_x-point after i5 */ + i6=i5; + for (i=i5;i!=aa[0][3];i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][0] + >box1->frame_vector[i6][0]) i6=i; // get next maximum + if (box1->frame_vector[ i][0]frame_vector[ i][1]frame_vector[i6][0]>x0+dx/2) break; // 5 + } + /* which type? ToDo: have a more sure algorithm */ + i7=nearest_frame_vector(box1, i2, i3, x0-dx/8, (y0+y1)/2); + if (box1->frame_vector[i7][0]<=x0+ dx/4 + && box1->frame_vector[i7][1]<=y0+2*dy/3) { + MSG(fprintf(stderr,"7-segment-type");) + } else { /* regular-book-type */ + if (aa[3][0]>=x1-dx/8 + && aa[3][1]<=y0+dy/8) ad=99*ad/100; + if (aa[0][0]<=x0+dx/8 + && aa[0][1]<=y0+dy/8) ad=99*ad/100; + if (aa[3][2]<=aa[1][2]) ad=97*ad/100; + } + // ToDo: output no=(x,y) + MSG(fprintf(stderr,"i1-7 %d %d %d %d %d %d %d",i1,i2,i3,i4,i5,i6,i7);) + if (i5==i6) Break; // ~+ + + if (box1->frame_vector[i5][1] + -box1->frame_vector[i6][1]frame_vector[i1][1]>y0+dy/2) Break; // not to low + if (box1->frame_vector[i1][0]>x0+dx/8) Break; + if (box1->frame_vector[i2][1]>(y0+ y1)/2) Break; + if (box1->frame_vector[i2][1]>(5*y0+3*y1)/8) ad=99*ad/100; + if (box1->frame_vector[i2][0]<(x0+x1+1)/2) Break; // fat tiny fonts? + if (box1->frame_vector[i2][0]<(x0+2*x1)/3) ad=99*ad/100; + if (box1->frame_vector[i3][0]>(3*x0+x1)/4) Break; + if (box1->frame_vector[i3][0]>(7*x0+x1)/8) ad=99*ad/100; + if (box1->frame_vector[i3][1]<(y0+3*y1)/4) Break; + if (box1->frame_vector[i3][1]>(y0+7*y1)/8) ad=99*ad/100; + /* check lower leftmost point from right side */ + if (box1->frame_vector[i5][0]>(x0+2*x1)/3) Break; + if (box1->frame_vector[i5][0]>(x0+ x1)/2) ad=98*ad/100; + if (box1->frame_vector[i5][0]>(2*x0+x1)/3) ad=99*ad/100; + if (box1->frame_vector[i5][1]<(3*y0+5*y1)/8) Break; + if (box1->frame_vector[i5][1]<(y0+3*y1)/4) ad=99*ad/100; + if (box1->frame_vector[i6][1]>(y0+2*y1)/3) Break; + if (box1->frame_vector[i6][1]>(y0+ y1)/2) ad=99*ad/100; + if (box1->frame_vector[i6][0]<(x0+3*x1)/4) Break; + if (box1->frame_vector[i6][0]<(x0+7*x1)/8) ad=99*ad/100; + + /* check for zZ */ + + /* check if lower left and right points are joined directly */ + ld=line_deviation(box1, i3, i4); + MSG(fprintf(stderr," i1-i2 %d %d dist= %d/%d",i1,i2,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + if (ld > sq(1024/4)) ad=99*ad/100; + + if (box1->m3) { + if(!hchar){ ad=99*ad/100; } + if( gchar){ ad=99*ad/100; } + } else { if (ad==100) ad=99; } /* not 100% sure */ + Setac(box1,'2',ad); + if (ad==100) return '2'; + break; + } + // --- test 3 ------- + for(ad=d=100;dx>3 && dy>4;){ // dy<=dx nicht perfekt! besser mittleres + // min-suchen fuer m + DBG( char c_ask='3'; ) + if (sdata->holes.num > 1) Break; /* be tolerant */ + // if( get_bw(x0+dx/2,x0+dx/2,y0,y0+dy/4,box1->p,cs,1) == 0 ) Break; // ~4 + // if( get_bw(x0+dx/2,x0+dx/2,y1-dy/8,y1,box1->p,cs,1) == 0 ) Break; // ~4 + // if( num_cross(x0+dx/2,x0+dx/2,y0 ,y1,box1->p,cs) < 2 ) Break; + // if( num_cross(x0+dx/4,x0+dx/4,y1-dy/2,y1,box1->p,cs) == 0 ) Break; + if( get_bw(dx/2,dx/2, 0,dy/6,bp,cs,1) == 0 ) Break; // ~4 + if( get_bw(dx/2,dx-1, dy/6,dy/6,bp,cs,1) == 0 ) Break; // ~j + if( get_bw(dx/2,dx/2,dy-1-dy/8,dy-1,bp,cs,1) == 0 ) Break; // ~4 + if( num_cross(dx/2,dx/2,0 ,dy-1,bp,cs) < 2 // normal + && num_cross(dx/3,dx/3,0 ,dy-1,bp,cs) < 2 ) Break; // fat LCD + if( num_cross(dx/4,dx/4,dy-1-dy/2,dy-1,bp,cs) == 0 ) Break; + if( loop(bp,dx/2, 0 ,dy,cs,0,DO)>dy/4 ) Break; + if( loop(bp,dx/2, dy-1,dy,cs,0,UP)>dy/4 ) Break; + if( loop(bp,dx-1, dy/3,dy,cs,0,LE)>dy/4 /* 3 with upper bow */ + && loop(bp,dx-1, dy/8,dy,cs,0,LE)>dy/4 /* 3 with horizontal line */ + && loop(bp,dx/4, dy/8,dy,cs,1,RI)dy/4 ) Break; + if( loop(bp,dx-1,3*dy/4,dy,cs,0,LE)>dy/2 ) Break; // ~2 Feb06 + if( loop(bp,dx-1,7*dy/8,dy,cs,0,LE)>dy/2 ) Break; // ~2 Feb06 + // search upper right half circle + for( i3=x=0,i1=y=dy/5;yx) { i3=x=i; i1=y; } + } i3--; if (i31+dx/8) ad=ad*99/100; // ~1 with a pixel + // search lower right half circle + for( i4=x=0,i2=y=dy-1-dy/8;y>=dy/2;y-- ){ + i=loop(bp,0,y,dx,cs,0,RI); + if( i>x ) { i4=x=i;i2=y; } + } i4--; if(i41+dx/8) ad=ad*99/100; // ~1 with a pixel + + for( x=xa=0,ya=y=dy/4;y<3*dy/4;y++ ){ // right gap, not on LCD-font + i=loop(bp,dx-1,y,dx,cs,0,LE); + if (i>=xa) { xa=i;ya=y;x=xa+loop(bp,dx-1-xa,y,dx,cs,1,LE); } + } if (dy>3*dx) if (xa<2 && x-xa1+dx/8 // noLCD + && xa<=loop(bp,dx-1,i2,dx,cs,0,LE)) ad=ad*99/100; // ~1 with a pixel + if (xa>1+dx/8 // noLCD + && xa<=loop(bp,dx-1,i1,dx,cs,0,LE)) ad=ad*99/100; // ~1 with a pixel + + + if( get_bw(i3,i3,i1,i2 ,bp,cs,1) != 1 ) Break; + if( get_bw(i4,i4,i1,i2 ,bp,cs,1) != 1 ) Break; + if( get_bw(i3,i3,0 ,i1 ,bp,cs,1) != 1 ) Break; + if( get_bw(i4,i4,i1,dy-1,bp,cs,1) != 1 ) Break; // m like + // hole is only allowed in beauty fonts + // if( num_hole( x0, x1, y0, y1,box1->p,cs,NULL) > 0 ) // there is no hole + // if( num_hole( x0, x0+dx/2, y0, y0+dy/2,box1->p,cs,NULL) == 0 ) // except in some beauty fonts + if (sdata->holes.num>0) + if (sdata->holes.hole[0].x1 >= dx/2 || sdata->holes.hole[0].y1 >= dy/2) + Break; + Setac(box1,(wchar_t)'3',ad); + if (ad==100) return '3'; + break; + } + // --- test 4 --------------------------------------------------- 25Nov06 + for(ad=d=100;dy>3 && dx>2;){ // min 3x4 ~holes.num > 1) Break; /* no or one hole */ + /* half distance to the center */ + d=2*sq(128/4); + /* now we check for the lower left end, must be far away */ + if (aa[1][2]num_frame_vectors[0] - 1; + /* leftmost upper point */ + i1=nearest_frame_vector(box1, 0, i, x0, y0-dy); + /* lowest from leftmost vector can be very low (20/23) */ + i2=nearest_frame_vector(box1, 0, i, x0-2*dx, (y0+7*y1)/8); + /* lowest vector */ + i4=nearest_frame_vector(box1, 0, i, (x0+2*x1)/3, y1+dy); + /* right center crossing point */ + i3=nearest_frame_vector(box1, i2, i4, x1, (3*y0+y1)/4); + /* get a point on the outer right side below top serif */ + /* next local max_y-point after i4 */ + i5=i4; + for (i=i4;i!=i2;i=(i+1)%box1->num_frame_vectors[0]) { + if (box1->frame_vector[ i][1] + frame_vector[i5][1]) i5=i; // get next maximum + if (box1->frame_vector[ i][1] + >box1->frame_vector[i5][1]+1) break; // break after maximum + if (box1->frame_vector[ i][0]num_frames>1) { // type C D + i = box1->num_frame_vectors[0] - 1; // end outer loop + j = box1->num_frame_vectors[1] - 1; // end inner loop + i6=nearest_frame_vector(box1, i+1, j, x1, y1); + i7=nearest_frame_vector(box1, i+1, j, x0, y1); + if (box1->frame_vector[i1][0] + -box1->frame_vector[i2][0]frame_vector[i ][0]-x0frame_vector[i ][1]-y07) ad=97*ad/100; // q + + } else { // type A B + i6=nearest_frame_vector(box1, i5, i1, (x0+3*x1)/4, y1-dy/8); + i7=nearest_frame_vector(box1, i5, i1, x0 , y1-dy/8); + MSG(fprintf(stderr,"open type");) + } + // ToDo: output no=(x,y) + MSG(fprintf(stderr,"i1-7 %d %d %d %d %d %d %d",i1,i2,i3,i4,i5,i6,i7);) + if (i5==i6) Break; // ~+ + + if (box1->frame_vector[i1][1]>y0+dy/8) Break; // not to low + if (box1->frame_vector[i2][1] + -box1->frame_vector[i1][1]frame_vector[i3][0] + -box1->frame_vector[i2][0]frame_vector[i3][1] + -box1->frame_vector[i2][1])>dy/4) Break; + if (box1->frame_vector[i2][0]>x0+dx/8) Break; + if (box1->frame_vector[i2][1]>y1-dy/8) Break; + if (box1->frame_vector[i4][1] + -box1->frame_vector[i2][1]frame_vector[i4][1] + -box1->frame_vector[i2][1]frame_vector[i4][1] + -box1->frame_vector[i3][1]<1+dy/16) Break; + if (box1->frame_vector[i4][1] + -box1->frame_vector[i3][1]frame_vector[i4][1] + -box1->frame_vector[i3][1]frame_vector[i4][1]frame_vector[i3][0]frame_vector[i3][0]frame_vector[i3][1]>y1-1) Break; + if (box1->frame_vector[i3][1]>y1-dy/16) Break; + if (box1->frame_vector[i3][1]>=y1) Break; // ~5x5# + if (box1->frame_vector[i5][0]frame_vector[i5][1]>y0+2*dy/3) Break; + if (box1->frame_vector[i6][1] + -box1->frame_vector[i5][1]<1+dy/16) Break; + if (box1->frame_vector[i6][0]frame_vector[i7][0]>x0+dx/2) Break; + if (box1->frame_vector[i7][0]>x0+dx/3) ad=ad*99/100; + if (box1->frame_vector[i6][1]frame_vector[i6][0]frame_vector[i6][0]=y1-1-dy/8) ad=96*ad/100; // ~ 42 + if (box1->frame_vector[i7][1]frame_vector[i3][1] + -box1->frame_vector[i2][1])>dy/4) Break; + + /* check if upper left and lower left points are joined directly */ + ld=line_deviation(box1, i1, i2); + MSG(fprintf(stderr," i1-i2 %d %d dist= %d/%d",i1,i2,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + /* check if lower right and upper right points are joined directly */ + ld=line_deviation(box1, i2, i3); + MSG(fprintf(stderr," i2-i3 %d %d dist= %d/%d",i2,i3,ld,2*sq(1024/4));) + if (ld > sq(1024/4)) Break; + /* check if lower right and upper right points are joined directly */ + ld=line_deviation(box1, i3, i4); + MSG(fprintf(stderr," i3-i4 %d %d dist= %d/%d",i3,i4,ld,2*sq(1024/4));) + if (ld > sq(1024/4)) Break; + /* check if lower right and upper right points are joined directly */ + ld=line_deviation(box1, i6, i7); + MSG(fprintf(stderr," i6-i7 %d %d dist= %d/%d",i6,i7,ld,2*sq(1024/4));) + if (ld >2*sq(1024/4)) Break; + + // 4 exists as gchar and ~gchar + if(!hchar){ ad=99*ad/100; } + Setac(box1,'4',ad); + break; + } +#ifdef Old_pixel_based + // --- old test 4 pixelbased ------- remove! + for(ad=d=100;dx>3 && dy>5;){ // dy>dx, min 4x6 font + DBG( char c_ask='4'; ) + if (sdata->holes.num > 2) Break; /* be tolerant */ + if (sdata->holes.num > 1) ad=97*ad/100; + // upper raising or vertical line + if( loop(bp,0 ,3*dy/16,dx,cs,0,RI) + < loop(bp,0 ,2*dy/4 ,dx,cs,0,RI)-dx/8 ) Break; + // search for a vertical line on lower end + for (y=0;y= dx/2 ) break; + if (y>=dy/4) Break; + if( loop(bp,0 ,dy-1-dy/8,dx,cs,0,RI) < dx/4 ) Break; + // --- follow line from (1,0) to (0,.7) + y=0; x=loop(bp,0,0,dx,cs,0,RI); + if (x<=dx/4) { // ocr-a-4 + i=loop(bp,0,dy/4,dx,cs,0,RI); if (i>dx/4) Break; + i=loop(bp,i,dy/4,dx,cs,1,RI); if (i>dx/2) Break; + j=loop(bp,i,dy/4,dy,cs,0,DO)+dy/4; if (j>7*dy/8) Break; + } + turmite(bp,&x,&y,0,dx-1,0,dy-1,cs,DO,LE); if( x>=0 ) Break; + + y=loop(bp,0,0,dy,cs,0,DO); + if( (y+loop(bp,0,y,dy,cs,1,DO)) < dy/2 ) Break; + if( get_bw(x0 , x0+3*dx/8, y1-dy/7, y1-dy/7,box1->p,cs,1) == 1 ) Break; + if( get_bw(x0+dx/2, x1 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2, x0+dx/2, y0+dy/3, y1-dy/5,box1->p,cs,1) != 1 ) Break; + i=loop(bp,bp->x-1, bp->y/4,dx,cs,0,LE); + if( i > loop(bp,bp->x-1,2*bp->y/4,dx,cs,0,LE)+1 + && i > loop(bp,bp->x-1,3*bp->y/8,dx,cs,0,LE)+1 ) Break; + if (loop(bp,0,0,dx,cs,0,RI)>dx/4) { + for(i=dx/8+1,x=0;x15 && i ) Break; + for(i=dy/10+1,y=dy-1-dy/4;yp,cs,NULL); + // ToDo: + // - get start and endpoint of left edge of left vert. line + // and check if that is an streight line + // - check the right edge of the inner hole (if there) too + i4 = sdata->holes.num; + if (sdata->holes.num >0) { // ~q + i = loop(bp,0,dy/16,dx,cs,0,RI); + if (i < dx/3) Break; + if (i < dx/2) ad=98*ad/100; // hole? + if ( loop(bp, 0,dy-1,dy,cs,0,UP) + -loop(bp,dx/8+1,dy-1,dy,cs,0,UP)>dy/16) ad=97*ad/100; + } + // thickness of left vertical line + for (j=y=0;yj) j=i; + } + if (j>=dx/2) ad=98*ad/100; // ~q handwritten a (or very thinn 4) + // ToDo: check y of masscenter of the hole q4 + + if( i4 ) if( dx > 15 ) + if( loop(bp, dx/2, 0,dy,cs,0,DO)3*dx/4 + && i-loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)>dx/4 ) Break; + + i =loop(bp,dx-1-dx/4,dy-1,dx,cs,0,UP); + if (i> dy/2) ad=97*ad/100; + if (i>3*dy/4) ad=97*ad/100; /* handwritten n */ + + if( num_cross(0 ,dx-1,dy/16 ,dy/16 , bp,cs) == 2 // ~9 + && loop(bp,dx-1,dy/16 ,dx,cs,0,LE)> + loop(bp,dx-1,dy/16+1+dy/32,dx,cs,0,LE) ) Break; + if ( !hchar) ad=99*ad/100; + if (gchar && !hchar) ad=98*ad/100; // ~q + Setac(box1,(wchar_t)'4',ad); + if (ad>99) bc='4'; + break; + } +#endif + // --- test 6 ------- ocr-a-6 looks like a b :( + for(ad=d=100;dx>3 && dy>4;){ // dy>dx + DBG( char c_ask='6'; ) + if (sdata->holes.num > 2) Break; /* be tolerant */ + if( loop(bp, 0, dy/4,dx,cs,0,RI)>dx/2 // ocr-a=6 + && loop(bp,dx-1, 0,dy,cs,0,DO)>dy/4 ) Break; // italic-6 + if( loop(bp, 0, dy/2,dx,cs,0,RI)>dx/4 ) Break; + if( loop(bp, 0,3*dy/4,dx,cs,0,RI)>dx/4 ) Break; + if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/2 ) Break; + if( num_cross(x0+ dx/2,x0+ dx/2,y0 ,y1 ,box1->p,cs) != 3 + && num_cross(x0+5*dx/8,x0+5*dx/8,y0 ,y1 ,box1->p,cs) != 3 ) { + if( num_cross(x0+ dx/2,x0+ dx/2,y0+dy/4,y1 ,box1->p,cs) != 2 + && num_cross(x0+5*dx/8,x0+5*dx/8,y0+dy/4,y1 ,box1->p,cs) != 2 ) Break; + // here we have the problem to decide between ocr-a-6 and b + if ( loop(box1->p,(x0+x1)/2,y0,dy,cs,0,DO)p,x0+dx/2,y0,dx,cs,0,DO)>dy/8 + && loop(box1->p,x1-dx/4,y0,dx,cs,0,DO)>dy/8 ) Break; + } + if( num_cross(x0 ,x1 ,y1-dy/4,y1-dy/4,box1->p,cs) != 2 ) Break; + for( y=y0+dy/6;yp,x1 ,y ,dx,cs,0,LE); if( x>dx/2 ) break; + x+=loop(box1->p,x1-x+1,y-1,dx,cs,0,LE); if( x>dx/2 ) break; + } if( y>=y0+dy/2 ) Break; + if (loop(box1->p,x0,y1-dy/3,dx,cs,0,RI)>dx/4 ) Break; + if (loop(box1->p,x1,y1-dy/3,dx,cs,0,LE)>dx/4 ) Break; + + if (sdata->holes.num != 1) Break; + if (sdata->holes.hole[0].y1 < dy/2) ad=95*ad/100; // whats good for? + if (sdata->holes.hole[0].y0 < dy/4) Break; +// if( num_hole ( x0, x1, y0, y0+dy/2,box1->p,cs,NULL) > 0 ) ad=95*ad/100; +// if( num_hole ( x0, x1, y0+dy/4, y1,box1->p,cs,NULL) != 1 ) Break; +// if( num_hole ( x0, x1, y0 , y1,box1->p,cs,NULL) != 1 ) Break; +// out_x(box1); printf(" x0 y0 %d %d\n",x0,y0); + /* check left vertical bow */ + i1=loop(bp,0,dy/8 ,dx,cs,0,RI); + i3=loop(bp,0,dy-1-dy/8,dx,cs,0,RI); + i2=loop(bp,0,dy/2 ,dx,cs,0,RI); + if(i1+i3-2*i2<-2-dx/16 && i1+i2+i3>0) Break; // convex from left + if(i1+i3-2*i2<1 && i1+i2+i3>0) ad=99*ad/100; // 7-segment-font + for( x=dx,y=0;ydx/2 && i2>dx/4) break; /* its a 6 (example: 7-segment) */ + if (i1x) break; /* may be serifen b */ + } if (y 1 ) i++; if( i>dy/8 ) break; + } if( ydots ) ad=98*ad/100; + Setac(box1,(wchar_t)'6',ad); + bc='6'; + break; + } + // --- test 7 --------------------------------------------------- + for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx + DBG( char c_ask='7'; ) + if (sdata->holes.num > 1) Break; /* be tolerant */ + if( loop(bp,dx/2,0,dy,cs,0,DO)>dy/8 ) Break; + if( num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs) != 1 ) Break; // preselect + for( yb=xb=y=0;y0 && j>dx/4) break; // gap after h-line + j=loop(bp,j,y,dx,cs,1,RI);if(j>xb){ xb=j;yb=y; } // h-line + } if( xbx ) x=j-1; + } if( yj) Break; + j=loop(bp, 0,j,dx,cs,0,RI); + if(j>dx/4 && j<=i+dx/16) Break; // tall T + } + + MSG( fprintf(stderr,"7: ad= %d",ad); ) + if( loop(bp, 0,3*dy/8,dx,cs,0,RI) + <=loop(bp,dx-1,3*dy/8,dx,cs,0,LE)+dx/8 ) ad=ad*98/100; // l + MSG( fprintf(stderr,"7: ad= %d",ad); ) + if( num_cross(0,dx-1,dy/4,dy/4,bp,cs) == 1 + && loop(bp,0,dy/4,dx,cs,0,RI) < dx/2 ) ad=ad*96/100; // J + MSG( fprintf(stderr,"7: ad= %d",ad); ) + + if (box1->m3 && dym3-box1->m2) ad=99*ad/100; // too small + if (box1->m3 && 2*dym3-box1->m2) ad=96*ad/100; // too small + if (dy>3*dx) ad=99*ad/100; // ) + if ( gchar) ad=99*ad/100; // J + if (!hchar) ad=99*ad/100; + Setac(box1,(wchar_t)'7',ad); + break; + } + // --- test 8 --------------------------------------------------- + // last change: May15th,2000 JS + for(ad=d=100;dx>2 && dy>4;){ // or we need large height + DBG( char c_ask='8'; ) + if (sdata->holes.num != 2) Break; + if( num_cross(x0,x1,y0 +dy/4,y0 +dy/4,box1->p,cs) != 2 ) Break; // ~gr (glued) + if( num_cross(x0,x1,y1 -dy/4,y1 -dy/4,box1->p,cs) != 2 + && num_cross(x0,x1,y1-3*dy/8,y1-3*dy/8,box1->p,cs) != 2 ) Break; + if( get_bw(x0,x0+dx/4,y1-dy/4,y1-dy/4,box1->p,cs,1) == 0 ) Break; // ~9 + if( get_bw(x0,x0+dx/2,y0+dy/4,y0+dy/4,box1->p,cs,1) == 0 ) Break; + if( get_bw(x0+dx/2,x0+dx/2,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) Break; // ~0 +// MSG( printf(" x0 y0 %d %d\n",x0,y0); ) + for( i2=i1=x=0,i=y=y0+dy/3;y<=y1-dy/3;y++){ // check left middle nick + j=loop(box1->p,x0,y,dx,cs,0,RI); + if (j>x || (abs(j-x)<=dx/8 /* care about MICR E-13B font */ + && (i1=loop(box1->p,x0+j,y,dx,cs,1,RI))>dx/2)) { + if (j>x) x=j; i=y; if (i1>i2) i2=i1; } + } if(i>=y1-dy/3 || (xdx/2) Break; // no gB + if (x< dx/4) ad=99*ad/100; // no B + if (x<=dx/8) ad=98*ad/100; // no B + j = loop(box1->p,x1,y1- dy/4,dx,cs,0,LE); + if( j>loop(box1->p,x1,y1- dy/5,dx,cs,0,LE) + && j>loop(box1->p,x1,y1-2*dy/5,dx,cs,0,LE) ) Break; // & + // check for upper hole + for (j=0;jholes.num;j++) { + if (sdata->holes.hole[j].y1 < i-y0+1 ) break; + if (sdata->holes.hole[j].y1 < i-y0+dy/8) break; + } if (j==sdata->holes.num) Break; // not found + // if( num_hole(x0,x1,y0,i+1 ,box1->p,cs,NULL)!=1 ) + // if( num_hole(x0,x1,y0,i+dy/8,box1->p,cs,NULL)!=1 ) Break; // upper hole + // check for lower hole + for (j=0;jholes.num;j++) { + if (sdata->holes.hole[j].y0 > i-y0-1 ) break; + } if (j==sdata->holes.num) Break; // not found + // if( num_hole(x0,x1,i-1,y1,box1->p,cs,NULL)!=1 ) Break; + i1=i; // left middle nick + /* find the middle right nick */ + for( x=0,i2=i=y=y0+dy/3;y<=y1-dy/3;y++){ + j=loop(box1->p,x1,y,dx,cs,0,LE); if( j>=x ) i2=y; + /* we care also for 7-segment and unusual fonts */ + if (j>x || (abs(j-x)<=(dx+4)/8 + && loop(box1->p,x1-j,y,dx,cs,1,LE)>dx/2)){ + if (j>x) x=j; i=y; } + // MSG(fprintf(stderr," yjix %d %d %d %d %d %d",y-y0,j,i-y0,x,loop(box1->p,x1-j,y,dx,cs,1,LE),dx/2);) + } + if( i>y0+dy/2+dy/10 ) Break; + // if( xdx/2 ) Break; + MSG(fprintf(stderr,"center bar at y= %d %d x=%d+%d i1=%d",i-y0,i2-y0,x,j,i1);) + if( num_cross(x0,x1, i , i ,box1->p,cs) != 1 + && num_cross(x0,x1, i+1 , i+1 ,box1->p,cs) != 1 + && num_cross(x0,x1,(i+i2)/2,(i+i2)/2,box1->p,cs) != 1 ) Break; // no g + if(abs(i1-i)>(dy+5)/10) ad=99*ad/100; // y-distance right-left-nick + if(abs(i1-i)>(dy+4)/8) ad=99*ad/100; // y-distance right-left-nick + if(abs(i1-i)>(dy+2)/4) Break; + // ~B ff + for(i=dx,y=0;yi+dx/16 ) break; + } if( yi+dx/16 ) break; + } if( y16 && num_cross(0,dx-1,dy-1,dy-1,bp,cs) > 1 + && loop(bp,0,dy-1,dx,cs,0,RI) 2 ) i++; if( i>dy/8 ) break; + } if( y 1) ad=98*ad/100; // & + if (num_cross(dx-1,dx-1,dy/2,dy-1,bp,cs) > 1) ad=98*ad/100; // & + if (num_cross( 0,dx-1, 0, 0,bp,cs) > 1) ad=98*ad/100; + if (dy>15) + if (num_cross( 0,dx-1, 1, 1,bp,cs) > 1) ad=98*ad/100; + /* if m1..4 is unsure ignore hchar and gchar ~ga */ + if (!hchar) { + if ((box1->m2-box1->y0)*8>=dy) ad=98*ad/100; + else ad=99*ad/100; + } + if ( gchar + && (box1->y1-box1->m3)*8>=dy) ad=99*ad/100; + Setac(box1,(wchar_t)'8',ad); + break; + } + // --- test 9 \it g --------------------------------------------------- + /* + * lcd micr + * ooo ooo + * o o o o + * ooo ooo + * o o + * ooo o + */ + for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx + DBG( char c_ask='9'; ) + if (sdata->holes.num > 1) Break; + if( num_cross(x0+ dx/2,x0+ dx/2,y0,y1-dy/4,box1->p,cs) != 2 // pre select + && num_cross(x0+ dx/2,x0+ dx/2,y0, y1,box1->p,cs) != 3 // pre select + && num_cross(x0+3*dx/8,x0+3*dx/8,y0,y1,box1->p,cs) != 3 + && num_cross(x0+ dx/4,x1 -dx/4,y0,y1,box1->p,cs) != 3 ) Break; + if( num_cross(x0+ dx/2,x0 +dx/2,y0,y0+dy/4,box1->p,cs) < 1 ) Break; + if( num_cross(x0+ dx/2,x1, y0+dy/2 ,y0+dy/2,box1->p,cs) < 1 ) Break; + if( num_cross(x0,x1, y0+ dy/4 ,y0+ dy/4,box1->p,cs) != 2 + && num_cross(x0,x1, y0+3*dy/8 ,y0+3*dy/8,box1->p,cs) != 2 ) Break; + if( num_cross(x1-dx/8,x1,y0+dy/4,y0+dy/4,box1->p,cs) == 0) ad=ad*97/100; // ~4 + for( x=0,i=y=y0+dy/2;y<=y1-dy/4;y++){ // find notch (suche kerbe) + j=loop(box1->p,x0,y,dx,cs,0,RI); + if( j>x ) { x=j; i=y; } + } if (x<1 || xp,x0+x-1,y,dy/8+1,cs,0,DO)/2; y=i=y+j; + j=loop(box1->p,x0+x-1,y,dx/2 ,cs,0,RI); x+=j; + if (x5) + if( num_cross(x0+dx/2,x1,i,y1 ,box1->p,cs) != 1 /* fails on 5x8 */ + && num_cross(x0+dx/2,x1,i,y1-dy/8,box1->p,cs) != 1 ) Break; + if( num_cross(x0+dx/2,x0+dx/2,i,y1,box1->p,cs) > 1 ) Break; + if( num_cross(x0+dx/2,x1 ,i, i,box1->p,cs) != 1 ) Break; + + if (sdata->holes.num < 1) { /* happens for 5x7 font */ + if (dx<8) ad=98*ad/100; else Break; } + else { + if (sdata->holes.hole[0].y1 >= i+1) Break; + if (sdata->holes.hole[0].y0 > i-1) Break; + if (sdata->holes.num > 1) + if (sdata->holes.hole[1].y0 > i-1) Break; + // if( num_hole(x0,x1,y0,i+1,box1->p,cs,NULL)!=1 ) Break; + // if( num_hole(x0,x1,i-1,y1,box1->p,cs,NULL)!=0 ) Break; + } + if( loop(box1->p,x0,y1 ,dy,cs,0,RI)>dx/3 && + loop(box1->p,x0,y1-1,dy,cs,0,RI)>dx/3 + && (box1->m3==0 || (box1->m3!=0 && (!hchar || gchar)))) ad=98*ad/100; // no q OR ocr-a-9 + for( x=0,i=y=y0+dy/3;y<=y1-dy/3;y++){ // suche kerbe + j=loop(box1->p,x1,y,dx,cs,0,LE); + if( j>x ) { x=j; i=y; } + } if( x>dx/2 ) Break; // no g + i1=loop(bp,dx-1,dy/8 ,dx,cs,0,LE); if(i1>dx/2) Break; + i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); + i2=loop(bp,dx-1,dy/2 ,dx,cs,0,LE); if(i1+i3-2*i2<-1-dx/16) Break; // konvex + i1=loop(bp,dx-1,dy/4 ,dx,cs,0,LE); if(i1>dx/2) Break; + i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); + for(y=dy/4;y0){ + x--; // robust + y=loop(bp,dx-x-1, dy-1,dy,cs,0,UP); + if(ym3) { + if( gchar) ad=99*ad/100; /* unsure */ + if(!hchar) ad=99*ad/100; /* unsure */ + } else { if (ad==100) ad=99; } /* not 100% sure */ + Setac(box1,(wchar_t)'9',ad); + break; + } + // 0 is same as O !? + // --- test 0 (with one big hole in it ) ----------------------------- + for(d=ad=100;dx>2 && dy>3;){ // min 3x4 + DBG( char c_ask='0'; ) + if (sdata->holes.num > 1) Break; /* be tolerant */ + if( get_bw(x0 , x0+dx/3,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/3 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + /* could be an O, unless we find a dot in the center */ + if( get_bw(x0 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 3 ) ad=99; + if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/3 , y1,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/3,box1->p,cs,1) != 1 ) Break; + /* accept 0 with dot in center, accept \/0 too ... */ + if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/3 , y1-dy/3,box1->p,cs,1) != 0 ) Break; + + if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) != 2 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND + if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y1 , y1 ,box1->p,cs) != 1 ) // against "rauschen" + if( num_cross(x0+dx/3,x1-dx/3,y1-1 , y1-1 ,box1->p,cs) != 1 ) Break; + if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 1 ) Break; + if (sdata->holes.num != 1) Break; + + i= loop(bp,0 ,0 ,x1-x0,cs,0,RI)- + loop(bp,0 ,2 ,x1-x0,cs,0,RI); + if (i<0) Break; + if (i==0) { + if (loop(bp,dx-1,0 ,x1-x0,cs,0,LE)> + loop(bp,dx-1,2 ,x1-x0,cs,0,LE) ) ad=98*ad/100; + ad=99*ad/100; /* LCD-type? */ + } + + x=loop(bp,dx-1,dy-1-dy/3,x1-x0,cs,0,LE); // should be minimum + for (y=dy-1-dy/3;yx) x=i; + } + if( ydx/8 ) + if( loop(bp,0 , dy/16,dx,cs,0,RI)dx/8 ) + if( loop(bp,0 ,dy-1-dy/16,dx,cs,0,RI)p,cs,1) == 0 + && get_bw(x1-dx/32,x1,y1-dy/32,y1,box1->p,cs,1) == 0 + && ( get_bw(x0,x0+dx/32,y0,y0+dy/32,box1->p,cs,1) == 1 + || get_bw(x0,x0+dx/32,y1-dy/32,y1,box1->p,cs,1) == 1 ) ) { + if (dx<32) ad=ad*99/100; else Break; // ~D + } + + // search lowest inner white point + for(y=dy,j=x=0;x 1 ) ad=99*ad/100; // ~a \it a + + if (loop(bp, 0, 0,x1-x0,cs,0,RI)>=dx/8) { // round, notLCD + if (loop(bp,dx-1,dy-1,x1-x0,cs,0,LE)dy/8 + || num_cross(0,dx-1, 0, 0,bp,cs) > 1 + || num_cross(0,dx-1,dy-1,dy-1,bp,cs) > 1 + ) ad=98*ad/100; // ~bq + + if (box1->m3) { + if (!hchar) ad=98*ad/100; else // ~o + if ( gchar) ad=99*ad/100; // wrong line detection? + } else { if (ad==100) ad=99; } /* not 100% sure */ + if (ad>99) ad=99; /* we can never be sure having a O, + let context correction decide, see below! */ + Setac(box1,(wchar_t)'0',ad); + break; + } + // --- test 0 with a straight line in it ------------------- + for(ad=100;dx>4 && dy>5;){ /* v0.3.1+ */ + DBG( char c_ask='0'; ) + if (sdata->holes.num > 3) Break; /* be tolerant */ + if (sdata->holes.num < 1) Break; + if (sdata->holes.num != 2) ad=95*ad/100; + if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/2 , y1,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; + if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/3 , y1-dy/3,box1->p,cs,1) != 1 ) Break; + // out_x(box1); printf(" x0 y0 %d %d\n",x0,y0); + if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) != 3 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND + if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; + if( num_cross(x0+dx/3,x1-dx/3,y1 , y1 ,box1->p,cs) != 1 ) // against "rauschen" + if( num_cross(x0+dx/3,x1-dx/3,y1-1 , y1-1 ,box1->p,cs) != 1 ) Break; + if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) + if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; + // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 2 ) Break; + if (sdata->holes.num != 2) ad=85*ad/100; + + if( loop(bp,0 , 0,x1-x0,cs,0,RI)<= + loop(bp,0 , 2+dy/32,x1-x0,cs,0,RI) ) Break; + x= loop(bp,0 ,dy/2 ,x1-x0,cs,0,RI); + i= loop(bp,0 ,dy/2-1,x1-x0,cs,0,RI); if (i>x) x=i; + i= loop(bp,0 ,dy/2-2,x1-x0,cs,0,RI); if (i>x && dy>8) x=i; + if( loop(bp,0 , dy/4,x1-x0,cs,0,RI)x) x=i; + i= loop(bp,dx-1,dy/2-1,x1-x0,cs,0,LE); if(i>x && dy>8) x=i; + if( loop(bp,dx-1,3*dy/4,x1-x0,cs,0,LE)x) x=i; + } + if( ydy/4) Break; + y+=loop(bp,dx/2,dy-1-y,y1-y0,cs,1,UP); if(y>dy/3) Break; if (y>dy/4) ad=ad*99/100; + y+=loop(bp,dx/2,dy-1-y,y1-y0,cs,0,UP); if(3*y>2*dy) Break; + x =loop(bp,dx/2,dy-y,dx/2,cs,0,RI); if(x==0) Break; + // MM; fprintf(stderr," y=%d x=%d\n",y-1,x); + if( loop(bp,dx/2+x-1-dx/16,dy-y,y1-y0,cs,0,UP)==0 ) Break; + // $ + for(i=0,y=dy/4;y dx/4 + || loop(bp,dx-1,y,dx-1,cs,0,LE) > dx/4 ) break; + if( ydx/8 ) + if( loop(bp,0 , dy/16,dx,cs,0,RI)dx/8 ) + if( loop(bp,0 ,dy-1-dy/16,dx,cs,0,RI)p,cs,1) == 0 + && get_bw(x1-dx/32,x1,y1-dy/32,y1,box1->p,cs,1) == 0 + && ( get_bw(x0,x0+dx/32,y0,y0+dy/32,box1->p,cs,1) == 1 + || get_bw(x0,x0+dx/32,y1-dy/32,y1,box1->p,cs,1) == 1 ) ) Break; // ~D + + /* 5x9 font "9" is like "0" */ + if (dx<16) + if ( num_cross(x0,x0,y0,y1,box1->p,cs) != 1 ) ad=98*ad/100; + + // italic a + for(i=0,y=6*dy/8;y 2 ) i++; else i--; + if(i>0) ad=ad*98/100; // ~'a' \it a + if( !hchar ) ad=90*ad/100; + Setac(box1,(wchar_t)'0',ad); + break; + } + return box1->c; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c new file mode 100644 index 000000000..7ddcc9707 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c @@ -0,0 +1,84 @@ +// test routines - faster to compile +#include +#include +#include "pgm2asc.h" +#include "unicode.h" +#include "gocr.h" + +// for learn_mode/analyze_mode high, with, yoffset, num of pattern_i, +// - holes (center,radius in relative coordinates) etc. => cluster analyze +// num_hole => min-volume, tolerance border +// pattern: @@ @. @@ +// .@ @. .. +// regular filter for large resolutions to make edges more smooth (on boxes) +// extra-filter (only if not recognized?) +// map + same color to (#==change) +// - anti color +// . not used +// strongest neighbour pixels (3x3) => directions +// second/third run with more and more tolerance!? + +/* FIXME jb: following is unused */ +#if 0 +struct lobj { // line-object (for fitting to near lines) + int x0,y0; // starting point (left up) + int x1,y1; // end point (right down) + int mt; // minimum thickness + int q; // quality, overlapp +}; + +/* FIXME jb global */ +struct lobj obj1; +#endif + +// that is the first draft of feature extraction +// detect main lines and bows +// seems bad implemented, looking for better algorithms (ToDo: use autotrace) +#define MAXL 10 +void ocr2(pix *b,int cs){ + int x1,y1,x2,y2,l,i,j,xa[MAXL],ya[MAXL],xb[MAXL],yb[MAXL],ll[MAXL]; + for(i=0;ix;x1++) // very slowly, but simple to program + for(y1=0;y1y;y1++) // brute force + for(x2=0;x2x;x2++) + for(y2=y1+1;y2y;y2++) + { + if( get_line2(x1,y1,x2,y2,b,cs,100)>99 ) + { // line ??? + l=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); // len + for(i=0;ix/2 + && abs(y1+y2-ya[i]-yb[i])<1+b->y/2 + && abs(y1-ya[i])<1+b->y/4 + && abs(x1-xa[i])<1+b->x/4 + ) + { + if( l>ll[i] ) + { + for(j=i;jll[i] ){ // insert if larger + for(j=MAXL-1;j>i;j--){ // shift table + xa[j]=xa[j-1];ya[j]=ya[j-1]; + xb[j]=xb[j-1];yb[j]=yb[j-1];ll[j]=ll[j-1]; + } + xa[i]=x1;ya[i]=y1;xb[i]=x2;yb[i]=y2;ll[i]=l; + break; + } + } + } + } + for(i=0;i + + The algorithm is very simple but works good hopefully. + + Compare the grayscale histogram with a mass density diagram: + I think the algorithm is a kind of + divide a body into two parts in a way that the mass + centers have the largest distance from each other, + the function is weighted in a way that same masses have a advantage + + - otsu algorithm is failing on diskrete multi color images + + TODO: + RGB: do the same with all colors (CMYG?) seperately + + test: hardest case = two colors + bbg: test done, using a two color gray file. Output: + # threshold: Value = 43 gmin=43 gmax=188 + + my changes: + - float -> double + - debug option added (vvv & 1..2) + - **image => *image, &image[i][1] => &image[i*cols+1] + - do only count pixels near contrast regions + this makes otsu much better for shadowed fonts or multi colored text + on white background + + (m) Joerg Schulenburg (see README for email address) + + ToDo: + - measure contrast + - detect low-contrast regions + + */ + +#include +#include + +#define Abs(x) ((x<0)?-(x):x) + +/*======================================================================*/ +/* global thresholding routine */ +/* takes a 2D unsigned char array pointer, number of rows, and */ +/* number of cols in the array. returns the value of the threshold */ +/*======================================================================*/ +int +otsu (unsigned char *image, int rows, int cols, + int x0, int y0, int dx, int dy, int vvv) { + + unsigned char *np; // pointer to position in the image we are working with + unsigned char op1, op2; // predecessor of pixel *np (start value) + int maxc=0; // maximum contrast (start value) + int thresholdValue=1; // value we will threshold at + int ihist[256]; // image histogram + int chist[256]; // contrast histogram + + int i, j, k; // various counters + int is, i1, i2, ns, n1, n2, gmin, gmax; + double m1, m2, sum, csum, fmax, sb; + + // zero out histogram ... + memset(ihist, 0, sizeof(ihist)); + memset(chist, 0, sizeof(chist)); + op1=op2=0; + + gmin=255; gmax=0; k=dy/512+1; + // v0.43 first get max contrast, dont do it together with next step + // because it failes if we have pattern as background (on top) + for (i = 0; i < dy ; i+=k) { + np = &image[(y0+i)*cols+x0]; + for (j = 0; j < dx ; j++) { + ihist[*np]++; + if(*np > gmax) gmax=*np; + if(*np < gmin) gmin=*np; + if (Abs(*np-op1)>maxc) maxc=Abs(*np-op1); /* new maximum contrast */ + if (Abs(*np-op2)>maxc) maxc=Abs(*np-op2); /* new maximum contrast */ + /* we hope that maxc will be find its maximum very fast */ + op2=op1; /* shift old pixel to next older */ + op1=*np; /* store old pixel for contrast check */ + np++; /* next pixel */ + } + } + + // generate the histogram + // Aug06 images with large white or black homogeneous + // areas give bad results, so we only add pixels on contrast edges + for (i = 0; i < dy ; i+=k) { + np = &image[(y0+i)*cols+x0]; + for (j = 0; j < dx ; j++) { + if (Abs(*np-op1)>maxc/4 + || Abs(*np-op2)>maxc/4) + chist[*np]++; // count only relevant pixels + op2=op1; /* shift old pixel to next older */ + op1=*np; /* store old pixel for contrast check */ + np++; /* next pixel */ + } + } + + // set up everything + sum = csum = 0.0; + ns = 0; + is = 0; + + for (k = 0; k <= 255; k++) { + sum += (double) k * (double) chist[k]; /* x*f(x) cmass moment */ + ns += chist[k]; /* f(x) cmass */ + is += ihist[k]; /* f(x) imass */ + // Debug: output to out_hist.dat? + // fprintf(stderr,"\chistogram %3d %6d (brightness weight)", k, ihist[k]); + } + + if (!ns) { + // if n has no value we have problems... + fprintf (stderr, "NOT NORMAL, thresholdValue = 160\n"); + return (160); + } + + // ToDo: only care about extremas in a 3 pixel environment + // check if there are more than 2 mass centers (more colors) + // return object colors and color radius instead of threshold value + // also the reagion, where colored objects are found + // what if more than one background color? no otsu at all? + // whats background? box with lot of other boxes in it + // threshold each box (examples/invers.png,colors.png) + // get maximum white and minimum black pixel color (possible range) + // check range between them for low..high contrast ??? + // typical scenes (which must be covered): + // - white page with text of different colors (gray values) + // - binear page: background (gray=1) + black text (gray=0) + // - text mixed with big (dark) images + // ToDo: recursive clustering for maximum multipol moments? + // idea: normalize ihist to max=1024 before otsu? + + // do the otsu global thresholding method + + if ((vvv&1)) // Debug + fprintf(stderr,"# threshold: value ihist chist mass_dipol_moment\n"); + fmax = -1.0; + n1 = 0; + for (k = 0; k < 255; k++) { + n1 += chist[k]; // left mass (integration) + if (!n1) continue; // we need at least one foreground pixel + n2 = ns - n1; // right mass (num pixels - left mass) + if (n2 == 0) break; // we need at least one background pixel + csum += (double) k *chist[k]; // left mass moment + m1 = csum / n1; // left mass center (black chars) + m2 = (sum - csum) / n2; // right mass center (white background) + // max. dipol moment? + // orig: sb = (double) n1 *(double) n2 * (m1 - m2) * (m1 - m2); + sb = (double) n1 *(double) n2 * (m2 - m1); // seems to be better Aug06 + /* bbg: note: can be optimized. */ + if (sb > fmax) { + fmax = sb; + thresholdValue = k + 1; + // thresholdValue = (m1 + 3 * m2) / 4; + } + if ((vvv&1) && ihist[k]) // Debug + fprintf(stderr,"# threshold: %3d %6d %6d %8.2f\n", + k, ihist[k], chist[k], + sb/(dx*dy)); /* normalized dipol moment */ + } + // ToDo: error = left/right point where sb is 90% of maximum? + // now we count all pixels for background detection + i1 = 0; + for (k = 0; k < thresholdValue; k++) { + i1 += ihist[k]; // left mass (integration) + } + i2 = is - i1; // right mass (num pixels - left mass) + + // at this point we have our thresholding value + // black_char: value=cs + + // can it happen? check for sureness + if (thresholdValue > gmax) { + fprintf(stderr,"# threshold: Value >gmax\n"); + thresholdValue = gmax; + } + if (thresholdValue <= gmin) { + fprintf(stderr,"# threshold: Value<=gmin\n"); + thresholdValue = gmin+1; + } + + // debug code to display thresholding values + if ( vvv & 1 ) + fprintf(stderr,"# threshold: Value = %d gmin=%d gmax=%d cmax=%d" + " i= %d %d\n", + thresholdValue, gmin, gmax, maxc, i1, i2); + + if (i1>=4*i2) { // black>=4*white, obviously black is background + if ( vvv & 1 ) + fprintf(stderr,"# threshold: invert the image\n"); + // we do inversion here (no data lost) + for (i = 0; i < dy ; i++) { + np = &image[(y0+i)*cols+x0]; + for (j = 0; j < dx ; j++) { + *np=255-*np; + np++; /* next pixel */ + } + } + thresholdValue=255-thresholdValue+1; + } + + return(thresholdValue); + /* range: 0 < thresholdValue <= 255, example: 1 on b/w images */ + /* 0..threshold-1 is foreground */ + /* threshold..255 is background */ + /* ToDo: min=blackmasscenter/2,thresh,max=(whitemasscenter+255)/2 */ +} + +/*======================================================================*/ +/* thresholding the image (set threshold to 128+32=160=0xA0) */ +/* now we have a fixed thresholdValue good to recognize on gray image */ +/* - so lower bits can used for other things (bad design?) */ +/* ToDo: different foreground colors, gray on black/white background */ +/*======================================================================*/ +int +thresholding (unsigned char *image, int rows, int cols, + int x0, int y0, int dx, int dy, int thresholdValue) { + + unsigned char *np; // pointer to position in the image we are working with + + int i, j; // various counters + int gmin=255,gmax=0; + int nmin=255,nmax=0; + + // calculate min/max (twice?) + for (i = y0 + 1; i < y0 + dy - 1; i++) { + np = &image[i*cols+x0+1]; + for (j = x0 + 1; j < x0 + dx - 1; j++) { + if(*np > gmax) gmax=*np; + if(*np < gmin) gmin=*np; + np++; /* next pixel */ + } + } + + /* allowed_threshold=gmin+1..gmax v0.43 */ + if (thresholdValue<=gmin || thresholdValue>gmax){ + thresholdValue=(gmin+gmax+1)/2; /* range=0..1 -> threshold=1 */ + fprintf(stderr,"# thresholdValue out of range %d..%d, reset to %d\n", + gmin, gmax, thresholdValue); + } + + /* b/w: min=0,tresh=1,max=1 v0.43 */ + // actually performs the thresholding of the image... + // later: grayvalues should also be used, only rescaling threshold=160=0xA0 + for (i = y0; i < y0+dy; i++) { + np = &image[i*cols+x0]; + for (j = x0; j < x0+dx; j++) { + *np = (unsigned char) (*np >= thresholdValue ? + (255-(gmax - *np)* 80/(gmax - thresholdValue + 1)) : + ( 0+(*np - gmin)*150/(thresholdValue - gmin )) ); + if(*np > nmax) nmax=*np; + if(*np < nmin) nmin=*np; + np++; + } + } + + // fprintf(stderr,"# thresholding: nmin=%d nmax=%d\n", nmin, nmax); + + return(128+32); // return the new normalized threshold value + /* 0..159 is foreground */ + /* 160..255 is background */ +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h new file mode 100644 index 000000000..acb16378c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h @@ -0,0 +1,23 @@ +/* + + see README for EMAIL-address + + */ + + +/*======================================================================*/ +/* OTSU global thresholding routine */ +/* takes a 2D unsigned char array pointer, number of rows, and */ +/* number of cols in the array. returns the value of the threshold */ +/*======================================================================*/ +int +otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv); + + +/*======================================================================*/ +/* thresholding the image (set threshold to 128+32=160=0xA0) */ +/* now we have a fixed thresholdValue good to recognize on gray image */ +/* - so lower bits can used for other things (bad design?) */ +/*======================================================================*/ +int +thresholding (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int thresholdValue); diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c new file mode 100644 index 000000000..62d55872e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c @@ -0,0 +1,193 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL address +*/ + +#include +#include "unicode.h" +#include "output.h" +#include "gocr.h" /* extern job_t JOB; */ + +/* function is only for debugging and for developing + it prints out a part of pixmap b at point x0,y0 to stderr + using dots .,; if no pixel, and @xoO for pixels + modify n_run and print out what would happen on 2nd, 3th loop! + new: output original and copied pixmap in the same figure + */ +void out_b(struct box *px, pix *b, int x0, int y0, int dx, int dy, int cs ){ + int x,y,x2,y2,yy0,tx,ty,n1,i; + char c1, c2; + yy0=y0; + if(px){ /* overwrite rest of arguments */ + if (!b) { + b=px->p; + x0=px->x0; dx=px->x1-px->x0+1; + y0=px->y0; dy=px->y1-px->y0+1; yy0=y0; + } + if(cs==0) cs=JOB->cfg.cs; + fprintf(stderr,"\n# list box x= %4d %4d d= %3d %3d r= %3d %3d" + " nrun=%d p=%p", /* ToDo: r,nrun is obsolete */ + px->x0, px->y0, px->x1 - px->x0 + 1, px->y1 - px->y0 + 1, + px->x - px->x0, px->y - px->y0, JOB->tmp.n_run, (void*)px); + fprintf(stderr,"\n# dots=%d boxes=%d subboxes=%d c=%s mod=%s" + " line=%d m= %d %d %d %d", + px->dots, px->num_boxes, px->num_subboxes, + decode(px->c,ASCII), decode(px->modifier,ASCII), px->line, + px->m1 - px->y0, px->m2 - px->y0, px->m3 - px->y0, px->m4 - px->y0); + if (px->num_frames) { + int i,j,jo; + fprintf(stderr,"\n# frames= %d (sumvects=%d)",px->num_frames, + ((px->num_frames)?px->num_frame_vectors[px->num_frames-1]:-1)); + for (jo=j=i=0; inum_frames; i++, jo=j) { + fprintf(stderr,"\n# frame %d (%+4d,%3d,%2d) ", + i, px->frame_vol[i], px->frame_per[i], + px->num_frame_vectors[i]-jo); + /* print only the first vectors of each frame */ + for (;jnum_frame_vectors[i] && jframe_vector[j][0] - px->x0, + px->frame_vector[j][1] - px->y0); + } + } + if (px->num_ac){ /* output table of chars and its probabilities */ + fprintf(stderr,"\n# list box char: "); + for(i=0;inum_ac && itas[i]) + fprintf(stderr," %s(%d)", px->tas[i] ,px->wac[i]); + else + fprintf(stderr," %s(%d)",decode(px->tac[i],ASCII),px->wac[i]); + } + fprintf(stderr,"\n"); + if (px->dots && px->m2 && px->m1m1; dy=px->y1-yy0+1; } + } + tx=dx/80+1; + ty=dy/40+1; /* step, usually 1, but greater on large maps */ + fprintf(stderr,"# list pattern x= %4d %4d d= %3d %3d t= %d %d\n", + x0,y0,dx,dy,tx,ty); + if (dx>0) + for(y=yy0;yp,x2-x0+px->x0, + y2-y0+px->y0)num_frames) { /* mark vectors */ + int i; + if (c1!='$' && c1!='S') /* dont mark twice */ + for (i=0;inum_frame_vectors[px->num_frames-1];i++) + if ((px->frame_vector[i][0]-px->x0)/tx==(x-x0)/tx + && (px->frame_vector[i][1]-px->y0)/ty==(y-y0)/ty) + { c1=((c1=='@')?'$':'S'); break; } + } + fprintf(stderr,"%c", c1 ); + } + + /* 2nd image is the boxframe in the original bitmap */ + if (dx<40) fprintf(stderr," "); + if (dx<40) /* do it only, if we have enough place */ + for(x=x0;xy0==px->m1 || y-y0+px->y0==px->m2 + || y-y0+px->y0==px->m3 || y-y0+px->y0==px->m4) c1='<'; + if (y==y0 || y==yy0+dy-1) c2='-'; /* boxmarks */ + + fprintf(stderr,"%c%c\n",c1,c2); + } +} + +/* same as out_b, but for faster use, only a box as argument + */ +void out_x(struct box *px) { + out_b(px,NULL,0, 0, 0, 0, JOB->cfg.cs); +} + + +/* print out two boxes side by side, for debugging comparision algos */ +void out_x2(struct box *box1, struct box *box2){ + int x,y,i,tx,ty,dy; + /*FIXME jb static*/static char *c1="OXXXXxx@.,,,,,,,"; + pix *b=&JOB->src.p; + dy=(box1->y1-box1->y0+1); + if(dyy1-box2->y0+1)dy=box2->y1-box2->y0+1; + tx=(box1->x1-box1->x0)/40+1; + ty=(box1->y1-box1->y0)/40+1; /* step, usually 1, but greater on large maps */ + if(box2)fprintf(stderr,"\n# list 2 patterns"); + for(i=0;iy0+i; + for(x=box1->x0;x<=box1->x1;x+=tx) + fprintf(stderr,"%c", c1[ ((getpixel(b,x,y)cfg.cs)?0:8)+marked(b,x,y) ] ); + if(!box2) continue; + fprintf(stderr," "); y=box2->y0+i; + for(x=box2->x0;x<=box2->x1;x+=tx) + fprintf(stderr,"%c", c1[ ((getpixel(b,x,y)cfg.cs)?0:8)+marked(b,x,y) ] ); + } +} + + +/* ---- list output ---- for debugging --- + * list all boxes where the results can be found within the c-option + */ +int output_list(job_t *job) { + int i = 0, j; + struct box *box2; + pix *pp = &job->src.p; + char *lc = job->cfg.lc; + + fprintf(stderr,"\n# list shape for charlist %s",lc); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *) list_get_current(&(JOB->res.boxlist)); + for (j=0; jnum_ac; j++) + if (!lc || (box2->tac[j] && strchr(lc, box2->tac[j])) + || (box2->tas[j] && strstr(lc, box2->tas[j]))) break; + if (jnum_ac) + fprintf(stderr,"\n# box found in charlist"); + if (!lc || (strchr(lc, box2->c) && box2->c < 256 && box2->c) + || (strchr(lc, '_') && box2->c==UNKNOWN) /* for compability */ + || jnum_ac ){ /* also list alternative chars */ + if (!pp) pp=box2->p; + fprintf(stderr, + "\n# list shape %3d x=%4d %4d d= %3d %3d vf=%d ac=%d %04x %s", + i, box2->x0, box2->y0, + box2->x1 - box2->x0 + 1, + box2->y1 - box2->y0 + 1, + box2->num_frames, box2->num_ac, + (int)box2->c, /* wchar_t -> char ???? */ + decode(box2->c,ASCII) ); + if (JOB->cfg.verbose & 4) out_x(box2); + } + i++; + } end_for_each(&(JOB->res.boxlist)); + fprintf(stderr,"\n"); + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h new file mode 100644 index 000000000..68b00ecd2 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h @@ -0,0 +1,36 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address */ + +#ifndef OUTPUT_H +#define OUTPUT_H + +#include +#include +#include "pnm.h" +#include "gocr.h" +#include "list.h" + +void out_b(struct box *px, pix *b, int x0, int y0, int dx, int dy, int cs ); +void out_x(struct box *px); +void out_x2(struct box *box1,struct box *box2); +int output_list(job_t *job); + + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c new file mode 100644 index 000000000..9d7a3ef40 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c @@ -0,0 +1,2875 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + + sometimes I have written comments in german language, sorry for that + + - look for ??? for preliminary code + - space: avX=22 11-13 (empirical estimated) + avX=16 5-7 + avX= 7 5-6 + + ToDo: - add filter (r/s mismatch) g300c1 + - better get_line2 function (problems on high resolution) + - write parallelizable code! + - learnmode (optimize filter) + - use ispell for final control or if unsure + - better line scanning (if not even) + - step 5: same chars differ? => expert mode + - chars dx>dy and above 50% hor-crossing > 4 is char-group ? + - detect color of chars and background + - better word space calculation (look at the examples) + (distance: left-left, middle-middle, left-right, thickness of e *0.75) + + GLOBAL DATA (mostly structures) + - pix : image - one byte per pixel bits0-2=working + - lines : rows of the text (points to pix) + - box : list of bounding box for character + - obj : objects (lines, splines, etc. building a character) + */ + + +#include +#include +#include +#include +#include +#include "../../config.h" +#ifdef HAVE_WCHAR_H +#include +#endif + +#include "list.h" +#include "pgm2asc.h" +// #include "pcx.h" /* needed for writebmp (removed later) */ +/* ocr1 is the test-engine - remember: this is development version */ +#include "ocr1.h" +/* first engine */ +#include "ocr0.h" +#include "otsu.h" +#include "progress.h" + +#include "gocr.h" + +/* wew: will be exceeded by capitals at 1200dpi */ +#define MaxBox (100*200) // largest possible letter (buffersize) +#define MAX(a,b) ((a) >= (b) ? (a) : (b)) + +/* if the system does not know about wchar.h, define functions here */ +#ifndef HAVE_WCHAR_H +/* typedef unsigned wchar_t; */ +/* Find the first occurrence of WC in WCS. */ +const wchar_t *wcschr (const wchar_t *wcs, const wchar_t wc) { + int i; for(i=0;wcs[i];i++) if (wcs[i]==wc) return wcs+i; return NULL; +} +const wchar_t *wcscpy (wchar_t *dest, const wchar_t *src) { + int i; for(i=0;src[i];i++) dest[i]=src[i]; dest[i]=0; return dest; +} +size_t wcslen (const wchar_t *s){ + size_t i; for(i=0;s[i];i++); return i; +} +#endif +#ifndef HAVE_WCSDUP +wchar_t * wcsdup (const wchar_t *WS) { /* its a gnu extension */ + wchar_t *copy; + copy = (wchar_t *) malloc((wcslen(WS)+1)*sizeof(wchar_t)); + if (!copy)return NULL; + wcscpy(copy, WS); + return copy; +} +#endif + +// ------------------------ feature extraction ----------------- +// ------------------------------------------------------------- +// detect maximas in of line overlaps (return in %) and line coordinates +// this is for future use +#define HOR 1 // horizontal +#define VER 2 // vertical +#define RIS 3 // rising=steigend +#define FAL 4 // falling=fallend + +/* exchange two variables */ +static void swap(int *a, int *b) { + int c = *a; + *a = *b; + *b = c; +} + +// calculate the overlapping of the line (0-1) with black points +// by recursive bisection +// line: y=dy/dx*x+b, implicit form: d=F(x,y)=dy*x-dx*y+b*dx=0 +// incremental y(i+1)=m*(x(i)+1)+b, F(x+1,y+1)=f(F(x,y)) +// ret & 1 => inverse pixel! +// d=2*F(x,y) integer numbers +int get_line(int x0, int y0, int x1, int y1, pix *p, int cs, int ret){ + int dx,dy,incrE,incrNE,d,x,y,r0,r1,ty,tx, + *px,*py,*pdx,*pdy,*ptx,*pty,*px1; + dx=abs(x1-x0); tx=((x1>x0)?1:-1); // tx=x-spiegelung (new) + dy=abs(y1-y0); ty=((y1>y0)?1:-1); // ty=y-spiegelung (new) + // rotate coordinate system if dy>dx +/*bbg: can be faster if instead of pointers we use the variables and swaps? */ +/*js: Do not know, I am happy that the current code is working and is small */ + if(dx>dy){ pdx=&dx;pdy=&dy;px=&x;py=&y;ptx=&tx;pty=&ty;px1=&x1; } + else { pdx=&dy;pdy=&dx;px=&y;py=&x;ptx=&ty;pty=&tx;px1=&y1; } + if( *ptx<0 ){ swap(&x0,&x1);swap(&y0,&y1);tx=-tx;ty=-ty; } + d=((*pdy)<<1)-(*pdx); incrE=(*pdy)<<1; incrNE=((*pdy)-(*pdx))<<1; + x=x0; y=y0; r0=r1=0; /* dd=tolerance (store max drift) */ + while( (*px)<=(*px1) ){ + if( ((getpixel(p,x,y) percentage % +} + +// this function should detect whether a direct connection between points +// exists or not, not finally implemented +// ret & 1 => inverse pixel! +// d=2*F(x,y) integer numbers, ideal line: ,I pixel: I@ +// ..@ @@@ .@. ...,@2@. +1..+3 floodfill around line ??? +// ..@ .@@ .@. ...,.@@@ +2..+4 <= that's not implemented yet +// ..@ ..@ .@. ...,.@@@ +2..+4 +// @.@ @.. .@. ...,@@@. +1..+3 +// @.@ @@. .@. ...I@@@. 0..+3 +// @@@ @@@ .@. ..@1@@.. 0..+2 +// 90% 0% 100% 90% r1-r2 +// I am not satisfied with it +int get_line2(int x0, int y0, int x1, int y1, pix *p, int cs, int ret){ + int dx,dy,incrE,incrNE,d,x,y,r0,r1,ty,tx,q,ddy,rx,ry, + *px,*py,*pdx,*pdy,*ptx,*pty,*px1; + dx=abs(x1-x0); tx=((x1>x0)?1:-1); // tx=x-spiegelung (new) + dy=abs(y1-y0); ty=((y1>y0)?1:-1); // ty=y-spiegelung (new) + // rotate coordinate system if dy>dx + if(dx>dy){ pdx=&dx;pdy=&dy;px=&x;py=&y;ptx=&tx;pty=&ty;px1=&x1;rx=1;ry=0; } + else { pdx=&dy;pdy=&dx;px=&y;py=&x;ptx=&ty;pty=&tx;px1=&y1;rx=0;ry=1; } + if( *ptx<0 ){ swap(&x0,&x1);swap(&y0,&y1);tx=-tx;ty=-ty; } + d=((*pdy)<<1)-(*pdx); incrE=(*pdy)<<1; incrNE=((*pdy)-(*pdx))<<1; + x=x0; y=y0; r0=r1=0; ddy=3; // tolerance = bit 1 + bit 0 = left+right + // int t=(*pdx)/16,tl,tr; // tolerance, left-,right delimiter + while( (*px)<=(*px1) ){ // not finaly implemented + q=((getpixel(p,x,y) percentage % +} + +/* Look for dots in the rectangular region x0 <= x <= x1 and y0 <= y + <= y1 in pixmap p. The two low order bits in mask indicate the color + of dots to look for: If mask==1 then look for black dots (where a + pixel value less than cs is considered black). If mask==2 then look + for white dots. If mask==3 then look for both black and white dots. + If the dots are found, the corresponding bits are set in the returned + value. Heavily used by the engine ocr0*.cc */ +char get_bw(int x0, int x1, int y0, int y1, pix * p, int cs, int mask) { + char rc = 0; // later with error < 2% (1 dot) + int x, y; + + if (x0 < 0) x0 = 0; + if (x1 >= p->x) x1 = p->x - 1; + if (y0 < 0) y0 = 0; + if (y1 >= p->y) y1 = p->y - 1; + + for ( y = y0; y <= y1; y++) + for ( x = x0; x <= x1; x++) { + rc |= ((getpixel(p, x, y) < cs) ? 1 : 2); // break if rc==3 + if ((rc & mask) == mask) + return mask; // break loop + } + return (rc & mask); +} + +/* more general Mar2000 (x0,x1,y0,y1 instead of x0,y0,x1,y1! (history)) + * look for black crossings throw a line from x0,y0 to x1,y1 and count them + * follow line and count crossings ([white]-black-transitions) + * ex: horizontal num_cross of 'm' would return 3 */ +int num_cross(int x0, int x1, int y0, int y1, pix *p, int cs) { + int rc = 0, col = 0, k, x, y, i, d; // rc=crossings col=0=white + int dx = x1 - x0, dy = y1 - y0; + + d = MAX(abs(dx), abs(dy)); + for (i = 0, x = x0, y = y0; i <= d; i++) { + if (d) { + x = x0 + i * dx / d; + y = y0 + i * dy / d; + } + k = ((getpixel(p, x, y) < cs) ? 1 : 0); // 0=white 1=black + if (col == 0 && k == 1) + rc++; + col = k; + } + return rc; +} + +/* check if test matches pattern + * possible pattern: "a-zA-Z0-9+\-\\" (x-y dont work for c>127) + * ToDo: wchar_t cc + matching UTF-8 pattern for nonASCII + */ +int my_strchr( char *pattern, wchar_t cc ) { + char *s1; + if (pattern==(char *)NULL) return 0; + + /* if (!(cc&0x80)) s1=strchr(pattern,(char)cc); else */ + s1=strstr(pattern,decode(cc, UTF8)); + switch (cc) { + case '-': + case '\\': + if ((!s1) || s1-pattern<1 || *(s1-1)!='\\') return 0; + else return 1; + default: + if (s1) return 1; /* cc simply matches */ + s1=pattern+1; + while (s1) { + if ((!s1[0]) || (!s1[1])) return 0; /* end of string */ + if (*(s1-1)!='\\' && *(s1-1)<=cc && *(s1+1)>=cc) return 1; + s1=strchr(s1+1,'-'); /* look for next '-' */ + } + } + return 0; +} + +/* set alternate chars and its weight, called from the engine + if a char is recognized to (weight) percent + can be used for filtering (only numbers etc) + often usefull if Il1 are looking very similar + should this function stay in box.c ??? + weight is between 0 and 100 in percent, 100 means absolutely sure + - not final, not time critical (js) + - replace it by a string-function setaobj(*b,"string",weight) + and let call setac the setas function + */ + +int setas(struct box *b, char *as, int weight){ + int i,j; + if (b->num_ac > NumAlt || b->num_ac<0) { + fprintf(stderr,"\nDBG: There is something wrong with setas()!"); + b->num_ac=0; + } + if (as==NULL) { + fprintf(stderr,"\nDBG: setas(NULL) makes no sense!"); return 0; } + if (as[0]==0) { + fprintf(stderr,"\nDBG: setas(\"\") makes no sense!" + " x= %d %d", b->x0, b->y0); + // out_x(b); + return 0; + } + + /* char filter (ex: only numbers) ToDo: cfilter as UTF-8 */ + if (JOB->cfg.cfilter) { + /* do not accept chars which are not in the cfilter string */ + if ( as[0]>0 && as[1]==0 ) + if ( !my_strchr(JOB->cfg.cfilter,as[0]) ) return 0; + } +#if 0 /* obsolete, done in setac */ + /* not sure that this is the right place, but where else? */ + if ( as[0]>0 && as[1]==0 ) + if (b->modifier != SPACE && b->modifier != 0) { + wchar_t newac; + newac = compose(as[0], b->modifier); + as = (char *)decode(newac, UTF8); /* was (const char *) */ + if (newac == as[0]) { /* nothing composed */ + fprintf(stderr, "\nDBG setas compose was useless %d %d",b->x0,b->y0); + // out_x(b); + } + } +#endif + + /* only the first run gets the full weight */ + weight=(100-JOB->tmp.n_run)*weight/100; + + /* remove same entries from table */ + for (i=0;inum_ac;i++) + if (b->tas[i]) + if (strcmp(as,b->tas[i])==0) break; + if (b->num_ac>0 && inum_ac){ + if (weight<=b->wac[i]) return 0; /* if found + less weight ignore it */ + /* to insert the new weigth on the right place, we remove it first */ + if (b->tas[i]) free(b->tas[i]); + for (j=i;jnum_ac-1;j++){ /* shift lower entries */ + b->tac[j]=b->tac[j+1]; /* copy the char */ + b->tas[j]=b->tas[j+1]; /* copy the pointer to the string */ + b->wac[j]=b->wac[j+1]; /* copy the weight */ + } + b->num_ac--; /* shrink table */ + } + /* sorting and add it to the table */ + for (i=0;inum_ac;i++) if (weight>b->wac[i]) break; + if (b->num_acnum_ac++; /* enlarge table */ + for (j=b->num_ac-1;j>i;j--){ /* shift lower entries */ + b->tac[j]=b->tac[j-1]; /* copy the char */ + b->tas[j]=b->tas[j-1]; /* copy the pointer to the string */ + b->wac[j]=b->wac[j-1]; /* copy the weight */ + } + if (inum_ac) { /* insert new entry */ + b->tac[i]=0; /* insert the char=0 ... */ + b->tas[i]=(char *)malloc(strlen(as)+1); /* ... string */ + if (b->tas[i]) memcpy(b->tas[i],as,strlen(as)+1); + b->wac[i]=weight; /* ... and its weight */ + } + if (i==0) b->c=b->tac[0]; /* char or 0 for string */ + return 0; +} + +/* ToDo: this function will be replaced by a call of setas() later */ +int setac(struct box *b, wchar_t ac, int weight){ + int i,j; + if ((!b) || b->num_ac > NumAlt || b->num_ac<0) { + fprintf(stderr,"\nDBG: This is a bad call to setac()!"); + b->num_ac=0; + } + if (ac==0 || ac==UNKNOWN) { + fprintf(stderr,"\nDBG: setac(0) makes no sense!"); + return 0; + } + /* char filter (ex: only numbers) ToDo: cfilter as UTF-8 */ + if (JOB->cfg.cfilter) { + /* do not accept chars which are not in the cfilter string */ + /* if ( ac>255 || !strchr(JOB->cfg.cfilter,(char)ac) ) return 0; */ + if ( !my_strchr(JOB->cfg.cfilter,ac) ) return 0; + } + /* not sure that this is the right place, but where else? */ + if (b->modifier != SPACE && b->modifier != 0) { + wchar_t newac; + newac = compose(ac, b->modifier); + if (newac == ac) { /* nothing composed */ + if(JOB->cfg.verbose & 7) + fprintf(stderr, "\nDBG setac(%s): compose was useless @ %d %d", + decode(ac,ASCII), b->x0, b->y0); + } + ac = newac; + } + + /* only the first run gets the full weight */ + weight=(100-JOB->tmp.n_run)*weight/100; + + /* remove same entries from table */ + for (i=0;inum_ac;i++) if (ac==b->tac[i]) break; + if (b->num_ac>0 && inum_ac){ + if (weight<=b->wac[i]) return 0; + if (b->tas[i]) free(b->tas[i]); + for (j=i;jnum_ac-1;j++){ /* shift lower entries */ + b->tac[j]=b->tac[j+1]; /* copy the char */ + b->tas[j]=b->tas[j+1]; /* copy the pointer to the string */ + b->wac[j]=b->wac[j+1]; /* copy the weight */ + } + b->num_ac--; /* shrink table */ + } + /* sorting it to the table */ + for (i=0;inum_ac;i++) if (weight>b->wac[i]) break; + if (b->num_acnum_ac++; /* enlarge table */ + for (j=b->num_ac-1;j>i;j--){ /* shift lower entries */ + b->tac[j]=b->tac[j-1]; /* copy the char */ + b->tas[j]=b->tas[j-1]; /* copy the pointer to the string */ + b->wac[j]=b->wac[j-1]; /* copy the weight */ + } + if (inum_ac) { /* insert new entry */ + b->tac[i]=ac; /* insert the char ... */ + b->tas[j]=NULL; /* ... no string (?) */ + b->wac[i]=weight; /* ... and its weight */ + } + if (i==0) b->c=ac; /* store best result to b->c (will be obsolete) */ + + return 0; +} + +/* test if ac in wac-table + usefull for contextcorrection and box-splitting + return 0 if not found + return wac if found (wac>0) + */ +int testac(struct box *b, wchar_t ac){ + int i; + if (b->num_ac > NumAlt || b->num_ac<0) { + fprintf(stderr,"\n#DEBUG: There is something wrong with testac()!"); + b->num_ac=0; + } + /* search entries in table */ + for (i=0;inum_ac;i++) if (ac==b->tac[i]) return b->wac[i]; + return 0; +} + + +/* look for edges: follow a line from x0,y0 to x1,y1, record the + * location of each transition, and return their number. + * ex: horizontal num_cross of 'm' would return 6 + * remark: this function is not used, obsolete? ToDo: remove? + */ +int follow_path(int x0, int x1, int y0, int y1, pix *p, int cs, path_t *path) { + int rc = 0, prev, x, y, i, d, color; // rc=crossings col=0=white + int dx = x1 - x0, dy = y1 - y0; + + d = MAX(abs(dx), abs(dy)); + prev = getpixel(p, x0, y0) < cs; // 0=white 1=black + path->start = prev; + for (i = 1, x = x0, y = y0; i <= d; i++) { + if (d) { + x = x0 + i * dx / d; + y = y0 + i * dy / d; + } + color = getpixel(p, x, y) < cs; // 0=white 1=black + if (color != prev){ + if (rc>=path->max){ + int n=path->max*2+10; + path->x = (int *) xrealloc(path->x, n*sizeof(int)); + path->y = (int *) xrealloc(path->y, n*sizeof(int)); + path->max = n; + } + path->x[rc]=x; + path->y[rc]=y; + rc++; + } + prev = color; + } + path->num=rc; + return rc; +} + +/* ToDo: only used in follow_path, which is obsolete, remove? */ +void *xrealloc(void *ptr, size_t size){ + void *p; + p = realloc(ptr, size); + if (size>0 && (!p)){ + fprintf(stderr, "insufficient memory"); + exit(1); + } + return p; +} + +/* + * ------------------------------------------------------------- + * mark edge-points + * - first move forward until b/w-edge + * - more than 2 pixel? + * - loop around + * - if forward pixel : go up, rotate right + * - if forward no pixel : rotate left + * - stop if found first 2 pixel in same order + * go_along_the_right_wall strategy is very similar and used otherwhere + * -------------------------------------------------------------- + * turmite game: inp: start-x,y, regel r_black=UP,r_white=RIght until border + * out: last-position + * + * could be used to extract more features: + * by counting stepps, dead-end streets ,xmax,ymax,ro-,ru-,lo-,lu-edges + * + * use this little animal to find features, I first was happy about it + * but now I prefer the loop() function + */ + +void turmite(pix *p, int *x, int *y, + int x0, int x1, int y0, int y1, int cs, int rw, int rb) { + int r; + if (outbounds(p, x0, y0)) // out of pixmap + return; + while (*x >= x0 && *y >= y0 && *x <= x1 && *y <= y1) { + r = ((getpixel(p, *x, *y) < cs) ? rb : rw); // select rule + switch (r) { + case UP: (*y)--; break; + case DO: (*y)++; break; + case RI: (*x)++; break; + case LE: (*x)--; break; + case ST: break; + default: assert(0); + } + if( r==ST ) break; /* leave the while-loop */ + } +} + +/* search a way from p0 to p1 without crossing pixels of type t + * only two directions, useful to test if there is a gap 's' + * labyrinth algorithm - do you know a faster way? */ +int joined(pix *p, int x0, int y0, int x1, int y1, int cs){ + int t,r,x,y,dx,dy,xa,ya,xb,yb; + x=x0;y=y0;dx=1;dy=0; + if(x1>x0){xa=x0;xb=x1;} else {xb=x0;xa=x1;} + if(y1>y0){ya=y0;yb=y1;} else {yb=y0;ya=y1;} + t=((getpixel(p,x,y)=xa && x+dy<=xb && y-dx>=ya && y-dx<=yb) // wall + { r=dy;dy=-dx;dx=r;x+=dx;y+=dy; } // rotate right and step forward + else { r=dx;dx=-dy;dy=r; } // rotate left + // fprintf(stderr," path xy %d-%d %d-%d %d %d %d %d\n",xa,xb,ya,yb,x,y,dx,dy); + if( x==x1 && y==y1 ) return 1; + if( x==x0 && y==y0 && dx==1) return 0; + } + // return 0; // endless loop ? +} + +/* move from x,y to direction r until pixel of color col is found + * or maximum of l steps + * return the number of steps done */ +int loop(pix *p,int x,int y,int l,int cs,int col, DIRECTION r){ + int i=0; + if(x>=0 && y>=0 && xx && yy){ + switch (r) { + case UP: + for( ;i=0;i++,y--) + if( (getpixel(p,x,y)y;i++,y++) + if( (getpixel(p,x,y)=0;i++,x--) + if( (getpixel(p,x,y)x;i++,x++) + if( (getpixel(p,x,y)maxstack) maxstack=blen; + blen--; /* reduce the stack */ + x=buf[blen*2+0]; + y=buf[blen*2+1]; + if (y < *y0) *y0 = y; + if (y > *y1) *y1 = y; + /* first go to leftmost pixel */ + for ( ; x>0 && (col == ((getpixel(p, x-1, y) < cs) ? 0 : 1)) ; x--); + if ((marked(p,x,y)&mark)==mark) continue; /* already scanned */ + for (dx=-1;dx<2;dx+=2) /* look at upper and lower line, left */ + if ( diag && xx && x-1>0 && y+dx >=0 && y+dx < p->y + && col != ((getpixel(p, x , y+dx) < cs) ? 0 : 1) + && col == ((getpixel(p, x-1, y+dx) < cs) ? 0 : 1) + && !((marked(p,x-1,y+dx)&mark)==mark) + ) { + if (blen+1>=bmax) { overflow|=1; continue; } + buf[blen*2+0]=x-1; + buf[blen*2+1]=y+dx; + blen++; + } + if (x < *x0) *x0 = x; + /* second go right, mark and get new starting points */ + for ( ; xx && (col == ((getpixel(p, x , y) < cs) ? 0 : 1)) ; x++) { + p->p[x + y * p->x] |= (mark & 7); rc++; /* mark pixel */ + /* enlarge frame */ + if (x > *x1) *x1 = x; + for (dx=-1;dx<2;dx+=2) /* look at upper and lower line */ + if ( col == ((getpixel(p, x , y+dx) < cs) ? 0 : 1) + && ( + col != ((getpixel(p, x-1, y ) < cs) ? 0 : 1) + || col != ((getpixel(p, x-1, y+dx) < cs) ? 0 : 1) ) + && !((marked(p,x,y+dx)&mark)==mark) && y+dxy && y+dx>=0 + ) { + if (blen+1>=bmax) { overflow|=1; continue; } + buf[blen*2+0]=x; + buf[blen*2+1]=y+dx; + blen++; + } + } + for (dx=-1;dx<2;dx+=2) /* look at upper and lower line, right */ + if ( diag && xx && x-1>0 && y+dx >=0 && y+dx < p->y + && col == ((getpixel(p, x-1, y ) < cs) ? 0 : 1) + && col != ((getpixel(p, x , y ) < cs) ? 0 : 1) + && col != ((getpixel(p, x-1, y+dx) < cs) ? 0 : 1) + && col == ((getpixel(p, x , y+dx) < cs) ? 0 : 1) + && !((marked(p,x,y+dx)&mark)==mark) + ) { + if (blen+1>=bmax) { overflow|=1; continue; } + buf[blen*2+0]=x; + buf[blen*2+1]=y+dx; + blen++; + } + } + + /* debug, ToDo: use info maxstack and pixels for image classification */ + g_debug(fprintf(stderr," maxstack= %4d pixels= %6d",maxstack,rc);) + if (overflow==1){ + overflow|=2; + fprintf(stderr,"# Warning: frame_nn stack oerflow\n"); + } + free(buf); +#else /* old version, ToDo: improve it for tmp04/005*.pgm.gz */ + int i, j, d, dx, ox, oy, od, nx, ny, rc = 0, rot = 0, x2 = x, y2 = y, ln; + + static const int d0[8][2] = { { 0, -1} /* up */, {-1, -1}, + {-1, 0} /* left */, {-1, 1}, + { 0, 1} /* down */, { 1, 1}, + { 1, 0} /* right */, { 1, -1}}; + + /* check bounds */ + if (outbounds(p, x, y)) + return 0; + /* check if already marked */ + if ((marked(p,x,y)&mark)==mark) + return 0; + + i = ((getpixel(p, x, y) < cs) ? 0 : 1); + rc = 0; + + g_debug(fprintf(stderr," start frame:");) + + for (ln = 0; ln < 2 && rot >= 0; ln++) { // repeat if right-loop + g_debug(fprintf(stderr," ln=%d diag=%d cs=%d x=%d y=%d - go to border\n",ln,diag,cs,x,y);) + + od=d=(8+4*ln-diag)&7; // start robot looks up, right is a wall + // go to right (left) border + if (ln==1) { + x=x2; y=y2; + } + /* start on leftmost position */ + for (dx = 1 - 2*ln; x + dx < p->x && x + dx >= 0 /* bounds */ && + i == ((getpixel(p, x + dx, y) < cs) ? 0 : 1) /* color */; + x += dx); + + g_debug(fprintf(stderr," ln=%d diag=%d cs=%d x=%d y=%d\n",ln,diag,cs,x,y);) + + /* robot stores start-position */ + ox = x; oy = y; + for (rot = 0; abs(rot) <= 64; ) { /* for sure max. 8 spirals */ + /* leftmost position */ + if (ln == 0 && x < x2) { + x2 = x; y2 = y; + } + + g_debug(fprintf(stderr," x=%3d y=%3d d=%d i=%d p=%3d rc=%d\n",x,y,d,i,getpixel(p,x,y),rc);) + + if ( abs(d0[d][1]) ) { /* mark left (right) pixels */ + for (j = 0, dx = d0[d][1]; x + j >= 0 && x + j < p->x + && i == ((getpixel(p, x + j, y) < cs) ? 0 : 1); j += dx) { + if (!((marked(p, x + j, y)&mark)==mark)) + rc++; + p->p[x + j + y * p->x] |= (mark & 7); + } + } + /* look to the front of robot */ + nx = x + d0[d][0]; + ny = y + d0[d][1]; + /* if right is a wall */ + if ( outbounds(p, nx, ny) || i != ((getpixel(p,nx,ny) *x1) *x1 = x; + if (y < *y0) *y0 = y; + if (y > *y1) *y1 = y; + } + if(x==ox && y==oy && d==od) break; // round trip finished + } + } + g_debug(fprintf(stderr," rot=%d\n",rot);) +#endif + return rc; +} + +/* obsolete! replaced by vectors + * mark neighbouring pixel of same color, return number + * better with neighbours of same color (more general) ??? + * parameters: (&~7)-pixmap, start-point, critical_value, mark + * recursion is removed */ +int mark_nn(pix * p, int x, int y, int cs, int r) { + /* out of bounds or already marked? */ + if (outbounds(p, x, y) || (marked(p, x, y)&r)==r) + return 0; + { + int x0, x1, y0, y1; + x0 = x1 = x; + y0 = y1 = y; // not used + return frame_nn(p, x, y, &x0, &x1, &y0, &y1, cs, r, JOB->tmp.n_run & 1); + // using same scheme + } +} + +/* ToDo: finish to replace old frame by this new one + * + * @...........#@@@@@@@. # = marked as already scanned black pixels + * @........@@@@@@@@@@@# only left and right border + * .......#@@@@@@@@@@@@@ left side on even y + * ......@@@@@@@@#.@@@@# right side on odd y + * .....#@@@@@......#@@@ no border is marked twice + * ....@@@@@#......@@@#. works also for thinn lines + * ...#@@@@........#@@@. - outer loop is stored as first + * ..@@@@#........@@@#.. - inner loop is stored as second + * .#@@@@........#@@@@.. 1st in an extra box (think on white chars) + * @@@@#.......@@@@#.... 2nd merge in an extra step + * #@@@@@....#@@@@@..... + * @@@@@@@@@@@@@@#...... + * .#@@@@@@@@@@@@....... + * + * run around the chape using laby-robot + * - used for scanning boxes, look for horizontal b/w transitions + * with unmarked black pixels and call this routine + * - stop if crossing a marked box in same direction (left=up, right=down) + * box - char box, store frame_vectors and box + * x,y - starting point + * mark - 3 bit marker, mark each valid pixel with it + * diag - 0: only pi/2 direction, 1: pi/4 directions (diagonal) + * ds - start direction, 6=right of right border, 2=left of left border + * ret - 0=ok, -1=already marked, -2=max_num_frames_exceeded + * -7=no border in direction ds + */ +#if 0 +#undef g_debug +#define g_debug(x) x +#endif +/* grep keywords: scan_vectors frame_vector */ +int frame_vector(struct box *box1, int x, int y, + int cs, int mark, int diag, int ds) { + int i1, i2, i2o, + new_x=1, /* flag for storing the vector x,y */ + steps=1, /* steps between stored vectors, speedup for big frames */ + d, /* direction */ + ox, oy, /* starting point */ + nx, ny, mx, my, /* used for simplification */ + /* ToDo: add periphery to box (german: Umfang?) */ + rc = 1, /* return code, circumference, sum vector lengths */ + rot = 0, /* memory for rotation, rot=8 means one full rotation */ + vol = 0; /* volume inside frame, negative for white inside black */ + pix *p=box1->p; + + /* translate the 8 directions to (x,y) pairs, + * if only four directions are used, only every 2nd vector is accessed, + * +1 turn left, -1 turn right + */ + static const int d0[8][2] = + { { 0, -1}, /* up */ {-1, -1}, /* up-le */ + {-1, 0}, /* left */ {-1, 1}, /* do-le */ + { 0, 1}, /* down */ { 1, 1}, /* do-ri */ + { 1, 0}, /* right */ { 1, -1} }; /* up-ri */ + + /* check bounds */ + if (outbounds(p, x, y)) + return 0; + + /* pixel color we are looking for, 0=black, 1=white */ + d = ds; + i1 = ((getpixel(p, x, y ) < cs) ? 0 : 1); + i2 = ((getpixel(p, x + d0[d][0], y + d0[d][1]) < cs) ? 0 : 1); + + g_debug(fprintf(stderr,"\nLEV2 frame_vector @ %3d %3d d%d %2d %2d" + " %d-%d pix=%3d mark=%d cs=%d",\ + x,y,ds,d0[ds][0],d0[ds][1],i1,i2,getpixel(p,x,y),mark,cs);) + + if (i1==i2){ + fprintf(stderr,"ERROR frame_vector: no border\n"); + return -7; /* no border detected */ + } + + /* initialize boxframe outside this function + box1->x0=box1->x1=x; + box1->y0=box1->y1=y; + */ + + /* initialize boxvector outside this function + box1->num_frames=0 + num_frame_vectors[0]=0 ??? + and store start value + */ + if (box1->num_frames > MaxNumFrames) return -2; + /* index to next (x,y) */ + i2o=i2=( (box1->num_frames==0)?0: + box1->num_frame_vectors[ box1->num_frames ] ); +#if 0 // obsolete v0.43 + box1->frame_vector[i2][0]=x; + box1->frame_vector[i2][1]=y; + i2++; + box1->num_frame_vectors[ box1->num_frames ]=i2; +#endif + box1->num_frames++; + + /* robot stores start-position */ + ox = x; oy = y; /* look forward to white pixel */ + + for (;;) { /* stop if same marked pixel touched */ + + g_debug(fprintf(stderr,"\nLEV3: x= %3d %3d d= %d rot= %2d %3d",x,y,d,rot,i2);) + + /* ToDo: store max. abs(rot) ??? for better recognition */ + if (new_x) { + g_debug(fprintf(stderr,"\nLEV2: markB xy= %3d %3d ", x, y);) + p->p[x + y * p->x] |= (mark & 7); /* mark black pixel */ + } + + /* store a new vector or enlarge the predecessor */ + if (new_x && (rc%steps)==0) { /* dont store everything on big chars */ + if (i2>=MaxFrameVectors) { + box1->num_frame_vectors[ box1->num_frames-1 ]=i2; + reduce_vectors(box1,1); /* simplify loop */ + i2=box1->num_frame_vectors[ box1->num_frames-1 ]; + /* enlarge steps on big chars getting speedup */ + steps=(box1->y1-box1->y0+box1->x1-box1->x0)/32+1; + } + /* store frame-vector */ + if (i2frame_vector[i2][0]=x; + box1->frame_vector[i2][1]=y; + /* test if older vector points to the same direction */ + if (i2>1) { + /* get predecessor */ + nx=box1->frame_vector[i2-1][0]-box1->frame_vector[i2-2][0]; + ny=box1->frame_vector[i2-1][1]-box1->frame_vector[i2-2][1]; + mx=x -box1->frame_vector[i2-1][0]; + my=y -box1->frame_vector[i2-1][1]; + /* same direction? */ + if (nx*my-ny*mx==0 && nx*mx>=0 && ny*my>=0) { + /* simplify by removing predecessor */ + i2--; + box1->frame_vector[i2][0]=x; + box1->frame_vector[i2][1]=y; + } /* do not simplify */ + } + i2++; + box1->num_frame_vectors[ box1->num_frames-1 ]=i2; + } + g_debug(fprintf(stderr," stored @ %3d steps= %d", i2-1, steps);) + } + new_x=0; /* work for new pixel (x,y) done */ + + /* check if round trip is finished */ + if (x==ox && y==oy && abs(rot)>=8) break; + + /* look to the front of robot (turtle or ant) */ + nx = x + d0[d][0]; + ny = y + d0[d][1]; + + /* next step, if right is a wall turn the turtle left */ + if ( outbounds(p, nx, ny) || i1 != ((getpixel(p,nx,ny)=0 && nxx) { /* if inbound */ + g_debug(fprintf(stderr,"\nLEV2: markW xy= %3d %3d ", nx, ny);) + p->p[nx + ny * p->x] |= (mark & 7); /* mark white pixel */ + } + /* rotate left 90 or 45 degrees */ + d=(d+2-diag) & 7; rot+=2-diag; + /* calculate volume inside frame */ + switch (d+diag) { + case 2+2: vol-=x-1; break; + case 6+2: vol+=x; break; + } + } + else { /* if no wall, go forward and turn right (90 or 45 degrees) */ + x=nx; y=ny; + /* turn back and rotate left */ + d=(d+4+2-diag) & 7; rot+=2-diag-4; + rc++; /* counting steps, used for speedup */ + + /* enlarge frame */ + if (x < box1->x0) box1->x0 = x; + if (x > box1->x1) box1->x1 = x; + if (y < box1->y0) box1->y0 = y; + if (y > box1->y1) box1->y1 = y; + + new_x=1; + } + } + + /* to distinguish inner and outer frames, store volume as +v or -v */ + box1->frame_vol[ box1->num_frames-1 ] = vol; + box1->frame_per[ box1->num_frames-1 ] = rc-1; + + /* dont count and store the first vector twice */ + if (i2-i2o>1) { + i2--; rc--; box1->num_frame_vectors[ box1->num_frames-1 ]=i2; + } + /* output break conditions */ + g_debug(fprintf(stderr,"\nLEV2 o= %3d %3d x= %3d %3d r=%d v=%d",ox,oy,x,y,rot,vol);) + /* rc=1 for a single point, rc=2 for a two pixel sized point */ + g_debug(fprintf(stderr," steps= %3d vectors= %3d",rc,i2);) + /* out_x(box1); ToDo: output only the first thousend */ + return rc; /* return number of bordering pixels = periphery? */ +} + + + +/* clear lowest 3 (marked) bits (they are used for marking) */ +void clr_bits(pix * p, int x0, int x1, int y0, int y1) { + int x, y; + for ( y=y0; y <= y1; y++) + for ( x=x0; x <= x1; x++) + p->p[x+y*p->x] &= ~7; +} + +/* look for white holes surrounded by black points + * at the moment look for white point with black in all four directions + * - store position of hole in coordinates relativ to box! + * ToDo: count only holes with vol>10% ??? + * ToDo: rewrite for frame vectors (faster, no malloc) + * holes are frames rotating left hand + * obsolete, do it with vectors + */ +int num_hole(int x0, int x1, int y0, int y1, pix * p, int cs, holes_t *holes) { + int num_holes = 0, x, y, hole_size; + pix b; // temporary mini-page + int dx = x1 - x0 + 1, dy = y1 - y0 + 1; + unsigned char *buf; // 2nd copy of picture, for working + + if (holes) holes->num=0; + if(dx<3 || dy<3) return 0; + b.p = buf = (unsigned char *) malloc( dx * dy ); + if( !buf ){ + fprintf( stderr, "\nFATAL: malloc(%d) failed, skip num_hole", dx*dy ); + return 0; + } + if (copybox(p, x0, y0, dx, dy, &b, dx * dy)) + { free(b.p); return -1;} + + // printf(" num_hole("); + /* --- mark white-points connected with border */ + for (x = 0; x < b.x; x++) { + if (getpixel(&b, x, 0) >= cs) + mark_nn(&b, x, 0, cs, AT); + if (getpixel(&b, x, b.y - 1) >= cs) + mark_nn(&b, x, b.y - 1, cs, AT); + } + for (y = 0; y < b.y; y++) { + if (getpixel(&b, 0, y) >= cs) + mark_nn(&b, 0, y, cs, AT); + if (getpixel(&b, b.x - 1, y) >= cs) + mark_nn(&b, b.x - 1, y, cs, AT); + } + + //g_debug(out_b(NULL,&b,0,0,b.x,b.y,cs);) + // --- look for unmarked white points => hole + for (x = 0; x < b.x; x++) + for (y = 0; y < b.y; y++) + if (!((marked(&b, x, y)&AT)==AT)) // unmarked + if (getpixel(&b, x, y) >= cs) { // hole found +#if 0 + hole_size=mark_nn(&b, x, y, cs, AT); /* old version */ + if (hole_size > 1 || dx * dy <= 40) + num_holes++; +#else + { /* new version, for future store of hole characteristics */ + int x0, x1, y0, y1, i, j; + x0 = x1 = x; + y0 = y1 = y; // not used + hole_size=frame_nn(&b, x, y, &x0, &x1, &y0, &y1, cs, AT, JOB->tmp.n_run & 1); + // store hole for future use, num is initialized with 0 + if (hole_size > 1 || dx * dy <= 40){ + num_holes++; + if (holes) { + // sort in table + for (i=0;inum && ihole[i].size < hole_size) break; + for (j=MAX_HOLES-2;j>=i;j--) + holes->hole[j+1]=holes->hole[j]; + if (ihole[i].size=hole_size; + holes->hole[i].x=x; + holes->hole[i].y=y; + holes->hole[i].x0=x0; + holes->hole[i].y0=y0; + holes->hole[i].x1=x1; + holes->hole[i].y1=y1; + } + holes->num++; + } + } + } +#endif + } + free(b.p); + // printf(")=%d",num_holes); + return num_holes; +} + +/* count for black nonconnected objects --- used for i,auml,ouml,etc. */ +/* ToDo: obsolete, replaced by vectors and box.num_boxes */ +int num_obj(int x0, int x1, int y0, int y1, pix * p, int cs) { + int x, y, rc = 0; // rc=num_obj + unsigned char *buf; // 2nd copy of picture, for working + pix b; + + if(x1x0;y1=box1->y0;x2=box2->x0;y2=box2->y0; + dx1=box1->x1-box1->x0+1; dx2=box2->x1-box2->x0+1; dx=((dx1>dx2)?dx1:dx2); + dy1=box1->y1-box1->y0+1; dy2=box2->y1-box2->y0+1; dy=((dy1>dy2)?dy1:dy2); + if(abs(dx1-dx2)>1+dx/16 || abs(dy1-dy2)>1+dy/16) return 100; + // compare relations to baseline and upper line + if(2*box1->y1>box1->m3+box1->m4 && 2*box2->y1m3+box2->m4) rbad+=128; + if(2*box1->y0>box1->m1+box1->m2 && 2*box2->y0m1+box2->m2) rbad+=128; + // compare pixels + for( y=0;y0) rbad+=16*v1; + else rbad++; + } + if(rgood+rbad) rc= (100*rbad+(rgood+rbad-1))/(rgood+rbad); else rc=99; + if(rc<10 && JOB->cfg.verbose & 7){ + fprintf(stderr,"\n# distance rc=%d good=%d bad=%d",rc,rgood,rbad); +// out_x(box1);out_x(box2); + } + return rc; +} + + + +// ============================= call OCR engine ================== ;) +// nrun=0 from outside, nrun=1 from inside (allows modifications, oobsolete) +wchar_t whatletter(struct box *box1, int cs, int nrun){ + wchar_t bc=UNKNOWN; // best letter + wchar_t um=SPACE; // umlaut? '" => modifier + pix *p=box1->p; // whole image + int x,y,dots,xa,ya,x0,x1,y0,y1,dx,dy,i; + pix b; // box + struct box bbuf=*box1; // restore after modifikation! + + if (box1->num_ac>0 && box1->wac[0]>=JOB->cfg.certainty && bc==UNKNOWN) { + bc=box1->tac[0]; + } + // if (bc!=UNKNOWN) return bc; + // if whatletter() called again, only unknown chars are processed + // bad for splitting! + + // store box data, which can be modified for modified chars in 2nd run + bbuf.x0=box1->x0; bbuf.y0=box1->y0; + bbuf.x1=box1->x1; bbuf.y1=box1->y1; + + xa=box1->x; ya=box1->y; + x0=box1->x0; y0=box1->y0; + x1=box1->x1; y1=box1->y1; + // int vol=(y1-y0+1)*(x1-x0+1); // volume + // crossed l-m , divided chars + while( get_bw(x0,x1,y0,y0,p,cs,1)!=1 && y0+15 && box1->num_boxes>1) + testumlaut(box1,cs,2,&um); /* set box1->modifier + new y0 */ + + dots=box1->dots; + y0 =box1->y0; // dots==2 => y0 below double dots + dy =y1-y0+1; + + // move upper and lower border (for divided letters) + while( get_bw(x0,x1,y0,y0,p,cs,1)==0 && y0+1x0=x0; box1->y0=y0; // set reduced frame + box1->x1=x1; box1->y1=y1; + + // set good startpoint (probably bad from division)? + if( xax1 || yay1 + || getpixel(p,xa,ya)>=cs /* || 2*ya0 ){ + // subfunction? also called after division of two glued chars? + for(y=y1;y>=y0;y--) // low to high (not i-dot) + for(x=(x0+x1)/2,i=0;x>=x0 && x<=x1;i++,x+=((2*i&2)-1)*i) /* is that ok? */ + if (getpixel(p,x,y)x,y be set? */ + } + + // ----- create char-only-box ------------------------------------- + // ToDo: this will be obsolete if vectors are used only + if(dx<1 || dy<1) return bc; /* should not happen */ + b.p = (unsigned char *) malloc( dx * dy ); + if (!b.p) fprintf(stderr,"Warning: malloc failed L%d\n",__LINE__); + if( copybox(p,x0,y0,dx,dy,&b,dx*dy) ) + { free(b.p); return bc; } + // clr_bits(&b,0,b.x-1,0,b.y-1); + // ------ use diagonal too (only 2nd run?) + /* following code failes on ! and ? obsolete if vectors are used + ToDo: + - mark pixels neighoured to pixels outside and remove them from &b + v0.40 + will be replaced by list of edge vectors + - mark accents, dots and remove them from &b + */ +#if 1 /* becomes obsolate by vector code */ + if (y0>0) // mark upper overlap + for ( x=x0; x<=x1; x++) { + if (getpixel(p,x,y0-1)0) // mark left overlap + for ( y=y0; y<=y1; y++) { + if (getpixel(p,x0-1,y)x-1) // mark right overlap + for ( y=y0; y<=y1; y++) { + if (getpixel(p,x1+1,y)num_ac>0 && box1->wac[0]>=JOB->cfg.certainty && bc==UNKNOWN) { + bc=box1->tac[0]; + } + + if (um!=0 && um!=SPACE && bc<127) { /* ToDo: is that obsolete now? */ + wchar_t newbc; + newbc = compose(bc, um ); + if (newbc == bc) { /* nothing composed */ + if(JOB->cfg.verbose & 7) + fprintf(stderr, "\nDBG whatletter: compose(%s) was useless (%d,%d)", + decode(bc,ASCII), box1->x0, box1->y0); + // if(JOB->cfg.verbose & 6) out_x(box1); + } + bc = newbc; + } + // restore modified boxes + box1->x0=bbuf.x0; box1->y0=bbuf.y0; + box1->x1=bbuf.x1; box1->y1=bbuf.y1; +// if (box1->c==UNKNOWN) out_b(box1,&b,0,0,dx,dy,cs); // test + + free(b.p); + return bc; +} + +/* +** creates a list of boxes/frames around objects detected +** on the pixmap p for further work +** returns number of boxes created. +** - by the way: get average X, Y (avX=sumX/numC,..) +*/ +int scan_boxes( pix *p ){ + int x, y, nx, cs, rc, ds; + struct box *box3; + + if (JOB->cfg.verbose) + fprintf(stderr,"# scanning boxes"); + + cs = JOB->cfg.cs; + JOB->res.sumX = JOB->res.sumY = JOB->res.numC = 0; + + /* clear the lowest bits of each pixel, later used as "scanned"-marker */ + clr_bits( p, 0, p->x - 1, 0, p->y - 1); + + for (y=0; y < p->y; y++) + for (x=0; x < p->x; x++) + for (ds=2; ds<7; ds+=4) { // NO - dust of size 1 is not removed !!! + nx=x+((ds==2)?-1:+1); + if (nx<0 || nx>=p->x) continue; /* out of image, ex: recframe */ + if ( getpixel(p, x,y)>=cs || getpixel(p,nx,y)< cs) // b/w transition? + continue; + if ((marked(p, x,y) & 1)&&(marked(p, nx, y) & 1)) + continue; + /* check (and mark) only horizontal b/w transitions */ + // --- insert new box in list + box3 = (struct box *)malloc_box(NULL); + box3->x0=box3->x1=box3->x=x; + box3->y0=box3->y1=box3->y=y; + box3->num_frames=0; + box3->dots=0; + box3->num_boxes=1; + box3->num_subboxes=0; + box3->modifier='\0'; + box3->num=JOB->res.numC; + box3->line=0; // not used here + box3->m1=0; box3->m2=0; box3->m3=0; box3->m4=0; + box3->p=p; + box3->num_ac=0; // for future use + +/* frame, vectorize and mark only odd/even horizontal b/w transitions + * args: box, x,y, cs, mark, diag={0,1}, ds={2,6} + * ds - start direction, 6=right of right border, 2=left of left border + * ret - 0=ok, -1=already marked, -2=max_num_frames_exceeded + * -7=no border in direction ds + * ToDo: count errors and print out for debugging + */ + rc=frame_vector(box3, x, y, cs, 1, 1, ds); + g_debug(fprintf(stderr,"\n# ... scan xy= %3d %3d rc= %2d", x, y, rc);) + if (rc<0) { free_box(box3); continue; } + if (box3->num_frames && !box3->num_frame_vectors[0]) + fprintf(stderr,"\nERROR scan_boxes: no vector in frame (%d,%d)",x,y); + + JOB->res.numC++; + JOB->res.sumX += box3->x1 - box3->x0 + 1; + JOB->res.sumY += box3->y1 - box3->y0 + 1; + + box3->c=(((box3->y1-box3->y0+1) + *(box3->x1-box3->x0+1)>=MaxBox)? PICTURE : UNKNOWN); + list_app(&(JOB->res.boxlist), box3); // append to list + // ToDo: debug + // if (JOB->cfg.verbose && box3->y0==29) out_x(box3); + } + if(JOB->res.numC){ + if (JOB->cfg.verbose) + fprintf(stderr," nC= %3d avD= %2d %2d\n",JOB->res.numC, + (JOB->res.sumX+JOB->res.numC/2)/JOB->res.numC, + (JOB->res.sumY+JOB->res.numC/2)/JOB->res.numC); + } + return JOB->res.numC; +} + +/* compare ints for sorting. Return -1, 0, or 1 according to + whether *vr < *vs, vr == *vs, or *vr > *vs */ +int +intcompare (const void *vr, const void *vs) +{ + int *r=(int *)vr; + int *s=(int *)vs; + + if (*r < *s) return -1; + if (*r > *s) return 1; + return 0; +} + +/* + * measure_pitch - detect monospaced font and measure the pitch + * measure overall pitch for difficult lines, + * after that measure pitch per line + * dists arrays are limited to 1024 elements to reduce + * cpu usage for qsort on images with extreme high number of objects + * insert space if dist>=pitch in list_insert_spaces() + * ToDo: ??? + * - min/max distance-matrix a-a,a-b,a-c,a-d ... etc; td,rd > ie,el,es + * - OR measuring distance as min. pixel distance instead of box distance + * especially useful for italic font! + */ +void measure_pitch( job_t *job ){ + int numdists=0, spc=0, /* number of stored distances */ + pitch_p=2, pdist, pdists[1024], /* proportional distances */ + pitch_m=6, mdist, mdists[1024], /* monospaced distances */ + monospaced=0, l1; + struct box *box2, *prev=NULL; + + if(job->cfg.verbose){ fprintf(stderr,"# check for word pitch"); } + for (l1=0; l1res.lines.num; l1++) + { /* 0 means all lines */ + if(job->cfg.verbose){ fprintf(stderr,"\n# line %2d",l1); } + numdists = 0; /* clear distance lists */ + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (l1>0 && box2->line!=l1) continue; /* ignore other lines */ + /* ignore dots and pictures (min. font is 4x6) */ + if (box2->y1 - box2->y0 + 1 < 4 || box2->c==PICTURE) { prev=NULL; } + if (!prev) { prev=box2; continue; } /* we need a predecessor */ + /* use center distance for monospaced fonts */ + mdist = ((box2->x0 + box2->x1) - (prev->x0 + prev->x1) + 1)/2; + /* use gap for proportional fonts */ + pdist = box2->x0 - prev->x1 + 1; + /* ToDo: better take 3 instead of 2 neighbours?, smallest font 4x6 */ + /* fonts are expected to be 6 to 60 pixels high, which is about + 4 to 50 pixels wide. We allow some extra margin. */ + if (3 < mdist && mdist < 150) { /* better mdist < 3*Xaverage ? */ + /* two options for overflow: 1) ignore, 2) store randomly */ + if (numdists<1024) { /* we do ignore here */ + mdists[numdists] = mdist; + pdists[numdists] = pdist; + numdists++; + } + } + prev = box2; + } end_for_each(&(job->res.boxlist)); + + if(job->cfg.verbose){ fprintf(stderr," num_gaps= %2d",numdists); } + if( numdists<8 ){ + if (job->cfg.verbose && l1==0) /* only for all lines */ + fprintf(stderr," (WARNING num_gaps<8)"); + } + if (numdists>0) { + int i,diff,ni_min,max,best_m,best_p,ni; double v; + /* aware: takes long time for big data sets */ + /* dilute? (german: ausduennen?) */ + qsort (mdists, numdists, sizeof (int), intcompare); + qsort (pdists, numdists, sizeof (int), intcompare); + /* the new method, div0? */ + v = (mdists[numdists*7/10]-mdists[numdists/5]) + /(double)mdists[numdists/5]; + /* measurements showed v=.09 for Courier and .44 for Times-Roman */ + if (l1==0) monospaced = (v < .22); + best_m= numdists/5; + best_p=4*numdists/5; + /* try to find better pitch for monospaced font (ok for prop) */ + for (i=numdists/5+1;i=3*mdists[best_m]) { best_m=i-1; break; } + } + /* try to find better pitch for proportional font */ + // the largest diff could be the best, if diff is always 1, + // take the diff with the lowest weight + for (ni=ni_min=1024,max=0,i=numdists/2+1;imax) { + max=diff; best_p=i-1; + if ((job->cfg.verbose&(32+16))==48) + fprintf(stderr," best_p=%d maxdiff=%d\n# ...", pdists[best_p], max); + if (max>3 && 3*pdists[i]>=4*pdists[i-1]) { break; } + } + if (diff) { + if (ni16) best_p=i-1; + if ((job->cfg.verbose&(32+16))==48) + fprintf(stderr," best_p=%d ni_min=%d\n# ...", pdists[best_p], ni_min); + } + ni=1; + } else ni++; + } + if (numdists<16 && max<=1 && ni_min>1) best_p=numdists-1; // one word +#if 1 /* debugging */ + if ((job->cfg.verbose&(32+16))==48) { + fprintf(stderr,"\n# ..."); + for (i=0;i0 && job->cfg.spc==0) { + job->res.lines.pitch[l1]=(monospaced?pitch_m:pitch_p); + job->res.lines.mono[l1]=monospaced; + } + if (job->cfg.verbose) { + fprintf(stderr,"\n# ..." + " mono: v=%f (v<0.22) line=%d numdists=%d\n# ...", + v, l1, numdists); + fprintf(stderr," mono: min=%3d max=%3d pitch=%3d @ %2d%%\n# ...", + mdists[0],mdists[numdists-1],pitch_m,best_m*100/numdists); + fprintf(stderr," prop: min=%3d max=%3d pitch=%3d @ %2d%%\n# ...", + pdists[0],pdists[numdists-1],pitch_p,best_p*100/numdists); + fprintf(stderr," result: distance >= %d considered space\n# ...", + job->res.lines.pitch[l1]); + } + } /* if (not) enough spaces */ + if (l1==0) { /* set default spaces to each line */ + int l2; + spc = job->cfg.spc; + if (spc==0) /* set only if not set by option */ + spc = ((monospaced)?pitch_m:pitch_p); + for (l2=0; l2res.lines.num; l2++ ) + job->res.lines.pitch[l2]=spc; + } + } /* each line */ + if (job->cfg.spc==0) + job->cfg.spc = spc; + if (job->cfg.verbose) + fprintf(stderr," overall space width is %d %s\n", + spc, ((monospaced)?"monospaced":"proportional")); + + +} + +/* ---- count subboxes (white holes within black area) -------- + * new: count boxes lying inside another box (usually holes, ex: "aeobdg") + * needed for glue_boxes, dont glue textboxes, tables and other complex + * objects + * ToDo: count only frames of invers spin? do we need sorted list here? -> no + */ +int count_subboxes( pix *pp ){ + int ii=0, num_mini=0, num_same=0, cnt=0; + struct box *box2,*box4; + progress_counter_t *pc = NULL; + if (JOB->cfg.verbose) { fprintf(stderr,"# count subboxes\n# ..."); } + + pc = open_progress(JOB->res.boxlist.n,"count_subboxes"); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + box2->num_subboxes=0; + progress(cnt++,pc); + if ( (box2->x1 - box2->x0)<2 + || (box2->y1 - box2->y0)<2) continue; /* speedup for dotted bg */ + // holes inside box2 char, aoebdqg, 0.41 + for_each_data(&(JOB->res.boxlist)) { + box4=(struct box *)list_get_current(&(JOB->res.boxlist)); + if (box4->y0 > box2->y1) break; // faster, but boxes need to be sorted + // ToDo: better use binary tree (above/below x) to find near boxes? + if (box4==box2) continue; + if( box4->x0==box2->x0 && box4->x1==box2->x1 + && box4->y0==box2->y0 && box4->y1==box2->y1) + num_same++; /* erroneous!? */ + if ( box4->x0 >= box2->x0 && box4->x1 <= box2->x1 + && box4->y0 >= box2->y0 && box4->y1 <= box2->y1 + && box4->num_subboxes==0 ) /* box4 inside box2? */ + { + box2->num_subboxes++; ii++; + if ((box4->x1 - box4->x0 + 1) + *(box4->y1 - box4->y0 + 1)<17) num_mini++; + } + } end_for_each(&(JOB->res.boxlist)); +#if 0 + if (cnt < 1000 && JOB->cfg.verbose) + fprintf(stderr," %4d box %4d %4d %+3d %+3d subboxes %4d\n# ...", + cnt, box2->x0, box2->y0, box2->x1-box2->x0, + box2->y1-box2->y0, box2->num_subboxes); +#endif + } end_for_each(&(JOB->res.boxlist)); + close_progress(pc); + if (JOB->cfg.verbose) + fprintf(stderr," %3d subboxes counted (mini=%d, same=%d) nC= %d\n", + ii, num_mini, num_same/2 /* counted twice */, cnt); + return 0; +} + +/* ---- glue holes tochars( before step1 ) v0.42 ----------------------- + glue boxes lying inside another box (usually holes, ex: "aeobdg46890") + Dont add dust to a char! + lines are not detected yet +*/ +int glue_holes_inside_chars( pix *pp ){ + int ii, cs, x0, y0, x1, y1, cnt=0, + glued_same=0, glued_holes=0; + struct box *box2, *box4; + progress_counter_t *pc = NULL; + cs=JOB->cfg.cs; + { + count_subboxes( pp ); /* move to pgm2asc() later */ + + pc = open_progress(JOB->res.boxlist.n,"glue_holes_inside_chars"); + if (JOB->cfg.verbose) + fprintf(stderr,"# glue holes to chars nC= %d\n# ...",JOB->res.numC); + ii=0; + for_each_data(&(JOB->res.boxlist)) { + // get the smaller box which may be extended by bigger boxes around it + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + + progress(cnt++,pc); + + // would it better than moving vectors to build a sub-box-tree? + + // do not remove chars inside pictures (car plates on photos) + if( box2->c == PICTURE || box2->num_subboxes > 7) continue; + + // holes inside char, aoebdqg, 0.41 + // dont merge boxes which have subboxes by itself! + // search boxes inside box2 + // if (x1-x0+1>2 || y1-y0+1>2) /* skip tiny boxes, bad for 4x6 */ + for_each_data(&(JOB->res.boxlist)) { + box4=(struct box *)list_get_current(&(JOB->res.boxlist)); + if(box4!=box2 && box4->c != PICTURE ) + { + // ToDo: dont glue, if size differs by big factors (>16?) + if ( ( box4->x0==x0 && box4->x1==x1 + && box4->y0==y0 && box4->y1==y1 ) /* do not happen !? */ + || ( box4->x0>=x0 && box4->x1<=x1 + && box4->y0>=y0 && box4->y1<=y1 + && box4->num_subboxes==0 ) ) /* no or very small subboxes? */ + { // fkt melt(box2,box4) + // same box, if very small but hollow char (4x5 o) + if( box4->x0==x0 && box4->x1==x1 + && box4->y0==y0 && box4->y1==y1) glued_same++; else glued_holes++; + // fprintf(stderr,"\n# DEBUG merge:"); + // out_x(box2); // small + // out_x(box4); // big + if ((JOB->cfg.verbose & 7)==7) // LEV3 + fprintf(stderr," glue hole (%4d %4d %+3d %+3d %+4d)" + " (%4d %4d %+3d %+3d %+4d) %d\n# ...", + x0, y0, x1-x0+1, y1-y0+1, box2->frame_vol[0], + box4->x0, box4->y0, + box4->x1-box4->x0+1, box4->y1-box4->y0+1, + box4->frame_vol[0], glued_same); + if ((box4->x1-box4->x0+1)< 8*(x1-x0+1) + || (box4->y1-box4->y0+1)<12*(y1-y0+1)) // skip dust + merge_boxes( box2, box4 ); // add box4 to box2 + // out_x(box2); + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + JOB->res.numC--; // dont count fragments as chars + ii++; // count removed + list_del(&(JOB->res.boxlist), box4); // remove box4 + free_box(box4); + // now search another hole inside box2 + } + } + } end_for_each(&(JOB->res.boxlist)); + + } end_for_each(&(JOB->res.boxlist)); + + if (JOB->cfg.verbose) + fprintf(stderr," glued: %3d holes, %3d same, nC= %d\n", + glued_holes, glued_same, JOB->res.numC); + close_progress(pc); + } + return 0; +} + + +/* ---- glue broken chars ( before step1 ??? ) ----------------------- + use this carefully, do not destroy previous detection ~fi, broken K=k' g + glue if boxes are near or diagonally connected + other strategy: mark boxes for deleting and delete in extra loop at end + faster: check only next two following boxes because list is sorted! + ToDo: store m4 of upper line to m4_of_prev_line, and check that "-points are below + done: glue boxes lying inside another box (usually holes, ex: "aeobdg") + Dont add dust to a char! + lines should be detected already (Test it for m1-m4 unknown) + ToDo: divide in glue_idots, glue_thin_chars etc. and optimize it +*/ +int glue_broken_chars( pix *pp ){ + int ii, y, cs, x0, y0, x1, y1, cnt=0, + num_frags=0, glued_frags=0, glued_hor=0; + struct box *box2, *box4; + progress_counter_t *pc = NULL; + cs=JOB->cfg.cs; + { + count_subboxes( pp ); /* move to pgm2asc() later */ + + pc = open_progress(JOB->res.boxlist.n,"glue_broken_chars"); + if (JOB->cfg.verbose) + fprintf(stderr,"# glue broken chars nC= %d\n# ...",JOB->res.numC); + ii=0; + for_each_data(&(JOB->res.boxlist)) { + // get the box which may be extended by boxes around it + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + + progress(cnt++,pc); + + // vertical broken (g965T umlauts etc.) + // not: f, + + // would it better than moving vectors to build a sub-box-tree? + + // do not remove chars inside pictures (car plates on photos) + if( box2->c == PICTURE || box2->num_subboxes > 7) continue; + + /* continue loop if box is below or above line */ + if( box2->m4>0 && y0>box2->m4 ) continue; /* dust outside ? */ + if( box2->m1>0 && y0m1-(box2->m3-box2->m2) ) continue; + /* ToDo: + * - check that y0 is greater as m3 of the char/line above + */ + + // check small boxes (box2) whether they belong + // to near same size or bigger boxes (box4) + if( 2*(y1-y0) < box2->m4 - box2->m1 // care for dots etc. + && ( 2*y1<=(box2->m3+box2->m2) // upper fragments + || 2*y0>=(box2->m3+box2->m2)) ) { // lower fragments + struct box *box5=NULL, *box6=NULL; // nearest and next nearest box + box4=NULL; + num_frags++; /* count for debugging */ + // get the [2nd] next x-nearest box in the same line + for_each_data(&(JOB->res.boxlist)) { + box4=(struct box *)list_get_current(&(JOB->res.boxlist)); + if (box4 == box2 || box4->c == PICTURE) continue; + /* 0.42 speed up for backround pixel pattern, box4 to small */ + if ( box4->x1 - box4->x0 + 1 < x1-x0+1 + && box4->y1 - box4->y0 + 1 < y1-y0+1 ) continue; + // have in mind that line number may be wrong for dust + if (box4->line>=0 && box2->line>=0 && box4->line==box2->line) + { + if (!box5) box5=box4; + if ( abs(box4->x0 + box4->x1 - 2*box2->x0) + x0 + box5->x1 - 2*box2->x0)) + { box6=box5; box5=box4; } + } + } end_for_each(&(JOB->res.boxlist)); + box4=box5; // next nearest box within the same line + if (box4) { +#if 0 /* set this to 1 for debugging of melting bugs */ + if (JOB->cfg.verbose & 7) { + fprintf(stderr,"\n# next two boxes are candidates for melting "); + out_x(box2); + out_x(box4); } +#endif + if( /* umlaut "a "o "u, ij; box2 is the small dot, box4 the body */ + ( y1 <= box2->m2 + && box4->y1 >= box2->m2 // dont melt dots together + && 2* y1 < box4->y1 + box4->y0 // box2 above box4 + && box4->x1+JOB->res.avX/2>=x0 + && box4->x0-JOB->res.avX/2<=x1 + && (y1 < box4->y0 || x0 < box4->x1) // dont melt "d'" + && 3* ( y1 - box4->y0) + <= 2* (box4->y1 - box4->y0) // too far away? dust! + && 8* ( x1 - x0 + 1) + >= (box4->x1 - box4->x0 + 1) // dot must have minimum size + && 10* ( y1 - y0 + 1) + >= (box4->y1 - box4->y0 + 1) // dot must have minimum size + ) || ( 0 && /* broken T */ + 3*(box2->x1 - box2->x0) > 2*JOB->res.avX + && 4*box4->x0>3*box2->x0+box2->x1 + && 4*box4->x1x0+3*box2->x1 + ) + || /* !?; box2 is the dot, box4 the body */ + ( 2*box4->x1>=x0+x1 /* test if box4 is around box2 */ + && 2*box4->x0<=2*x1 /* +x0+1 Jan00 */ + && ( x1-x0 <= box4->x1-box4->x0+2 ) + && 2*y0>=box2->m2+box2->m3 + && 4*y1>=box2->m2+3*box2->m3 + && 4*(y1-y0)m4-box2->m1 + && (8*box4->y1 < box4->m2+7*box4->m3 + || box4->m4-box4->m1<16) /* Jan00 */ + ) + || /* =;: box2 is the upper box, box4 the lower box */ + ( 2*box4->x1>=x0+x1 /* test if box4 is around box2 */ + && 2*box4->x0<=2*x1 /* +x0+1 */ + && ( x1-x0 <= box4->x1-box4->x0+4 ) + && ( 4*x0 <= 3*box4->x1+box4->x0 ) + && (( box2->m2 && box4->m2 + && y1< box2->m3 + && 2*box4->y1 > box4->m3+box4->m2 // can be bigger than m3 + && 4*box4->y0 >= 3*box4->m2+box4->m3 + && 2*box2->y0 < box2->m3+box2->m2 + ) + || ( (!box2->m2) || (!box4->m2) ) + ) + ) + ) + { // fkt melt(box2,box4) + if (JOB->cfg.verbose & 7) + fprintf(stderr," glue objects (%3d %3d %+3d %+3d)" + " (%3d %3d %+3d %+3d)\n# ...", + x0, y0, x1-x0+1, y1-y0+1, box4->x0, box4->y0, + box4->x1-box4->x0+1, box4->y1-box4->y0+1); + // fprintf(stderr,"\n# DEBUG merge:"); // d=7x34 @ (109,51) ??? + // out_x(box2); + // out_x(box4); + merge_boxes( box2, box4 ); // add box4 to box2 + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + // if (JOB->cfg.verbose & 4) out_x(box2); + // JOB->res.numC--; // dont count fragments as chars + ii++; glued_frags++; // remove + // output_list(JOB); + list_del(&(JOB->res.boxlist), box4); /* ret&1: error-message ??? */ + // output_list(JOB); + free_box(box4); + } + } + } +// continue; + + // horizontally broken w' K' + if( 2*y1 < (box2->m3+box2->m2) ) + if( 2*(y1-y0) < (box2->m3+box2->m2) ) // fragment + for_each_data(&(JOB->res.boxlist)) { + box4=(struct box *)list_get_current(&(JOB->res.boxlist)); + if(box4!=box2 && box4->c != PICTURE ) + { + if( box4->line>=0 && box4->line==box2->line + && box4->x1>=x0-1 && box4->x1x0+3*box4->x1<4*x0) + if( get_bw(x0 ,x0 ,y1,y1 ,pp,cs,1) == 1) + if( get_bw(x0-2,x0-1,y1,y1+2,pp,cs,1) == 1) + { // fkt melt(box2,box4) + put(pp,x0,y1+1,~(128+64),0); + merge_boxes( box2, box4 ); + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + JOB->res.numC--; ii++; // remove + glued_hor++; + list_del(&(JOB->res.boxlist), box4); + free_box(box4); + } + } + } end_for_each(&(JOB->res.boxlist)); + + // horizontally broken n h (h=l_) v0.2.5 Jun00 + if( abs(box2->m2-y0)<=(y1-y0)/8 ) + if( abs(box2->m3-y1)<=(y1-y0)/8 ) + if( num_cross(x0, x1,(y0+ y1)/2,(y0+ y1)/2,pp,cs) == 1) + if( num_cross(x0, x1,(y0+3*y1)/4,(y0+3*y1)/4,pp,cs) == 1) + if( get_bw((3*x0+x1)/4,(3*x0+x1)/4,(3*y0+y1)/4,y1,pp,cs,1) == 0) + if( get_bw(x0,(3*x0+x1)/4,(3*y0+y1)/4,(y0+3*y1)/4,pp,cs,1) == 0) + if( get_bw(x0, x0, y0,(3*y0+y1)/4,pp,cs,1) == 1) + for_each_data(&(JOB->res.boxlist)) { + box4=(struct box *)list_get_current(&(JOB->res.boxlist)); + if(box4!=box2 && box4->c != PICTURE ) + { + if( box4->line>=0 && box4->line==box2->line + && box4->x1>x0-3 && box4->x1-2y1-box2->m3)<2) + { // fkt melt(box2,box4) + y=loop(pp,x0,y0,y1-y0,cs,0,DO);if(2*y>y1-y0) continue; + put(pp,x0-1,y0+y ,~(128+64),0); + put(pp,x0-1,y0+y+1,~(128+64),0); + merge_boxes( box2, box4 ); // add box4 to box2 + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; + JOB->res.numC--; ii++; // remove + glued_hor++; + list_del(&(JOB->res.boxlist), box4); + free_box(box4); + } + } + } end_for_each(&(JOB->res.boxlist)); + } end_for_each(&(JOB->res.boxlist)); + if (JOB->cfg.verbose) + fprintf(stderr," glued: %3d fragments (found %3d), %3d rest, nC= %d\n", + glued_frags, num_frags, glued_hor, JOB->res.numC); + close_progress(pc); + } + return 0; +} + +/* +** this is a simple way to improve results on noisy images: +** - find similar chars (build cluster of same chars) +** - analyze clusters (could be used for generating unknown font-base) +** - the quality of the result depends mainly on the distance function +*/ + // ---- analyse boxes, compare chars, compress picture ------------ + // ToDo: - error-correction only on large chars! +int find_same_chars( pix *pp){ + int i,k,d,cs,dist,n1,dx; struct box *box2,*box3,*box4,*box5; + pix p=(*pp); + cs=JOB->cfg.cs; + { + if(JOB->cfg.verbose)fprintf(stderr,"# packing"); + i = list_total(&(JOB->res.boxlist)); + for_each_data(&(JOB->res.boxlist)) { + box4 = box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + dist=1000; // 100% maximum + dx = box2->x1 - box2->x0 + 1; + + if(JOB->cfg.verbose)fprintf(stderr,"\r# packing %5d",i); + if( dx>3 ) + for(box3=(struct box *)list_next(&(JOB->res.boxlist),box2);box3; + box3=(struct box *)list_next(&(JOB->res.boxlist),box3)) { + if(box2->num!=box3->num){ + int d=distance(&p,box2,&p,box3,cs); + if ( dnum; // set all num==box2.num to box2.num + for_each_data(&(JOB->res.boxlist)) { + box5=(struct box *)(struct box *)list_get_current(&(JOB->res.boxlist)); + if(box5!=box2) + if( box5->num==n1 ) box5->num=box2->num; + } end_for_each(&(JOB->res.boxlist)); + // out_x2(box2,box5); + // fprintf(stderr," dist=%d\n",d); + } + } + } + // nearest dist to box2 has box4 + // out_b2(box2,box4); + // fprintf(stderr," dist=%d\n",dist); + } end_for_each(&(JOB->res.boxlist)); + k=0; + if(JOB->cfg.verbose)fprintf(stderr," %d different chars",i); + for_each_data(&(JOB->res.boxlist)) { + struct box *box3,*box4; + int j,dist; + box2=(struct box *)list_get_current(&(JOB->res.boxlist)); + for(box3=(struct box *)list_get_header(&(JOB->res.boxlist)); + box3!=box2 && box3!=NULL; + box3=(struct box *)list_next(&(JOB->res.boxlist), box3)) + if(box3->num==box2->num)break; + if(box3!=box2 && box3!=NULL)continue; + i++; + // count number of same chars + dist=0;box4=box2; + + for(box3=box2,j=0;box3; + box3=(struct box *)list_next(&(JOB->res.boxlist), box3)) { + if(box3->num==box2->num){ + j++; + d=distance(&p,box2,&p,box3,cs); + if ( d>dist ) { dist=d; box4=box3; } // worst fit + } + } + if(JOB->cfg.verbose&8){ + fprintf(stderr," no %d char %4d %5d times maxdist=%d\n",i,box2->num,j,dist); + } + // calculate mean-char (error-correction) + // ToDo: calculate maxdist in group + k+=j; + // if(j>1) + // out_b(box1,NULL,0,0,0,0,cs); + if(JOB->cfg.verbose&8) + fprintf(stderr," no %d char %4d %5d times sum=%d\n",i,box2->num,j,k); + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose)fprintf(stderr," ok\n"); + } + return 0; +} + +/* +** call the first engine for all boxes and set box->c=result; +** +*/ +int char_recognition( pix *pp, int mo){ + int i,ii,ni,cs,x0,y0,x1,y1; + struct box *box2; + progress_counter_t *pc; + wchar_t cc; + cs=JOB->cfg.cs; + // ---- analyse boxes, find chars --------------------------------- + if (JOB->cfg.verbose) + fprintf(stderr,"# char recognition"); + i=ii=ni=0; + for_each_data(&(JOB->res.boxlist)) { /* count boxes */ + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + /* wew: isn't this just JOB->res.numC? */ + /* js: The program is very complex. I am not sure anymore + wether numC is the number of boxes or the number of valid + characters. + Because its not time consuming I count the boxes here. */ + if (box2->c==UNKNOWN) i++; + if (box2->c==PICTURE) ii++; + ni++; + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose) + fprintf(stderr," unknown= %d picts= %d boxes= %d\n# ",i,ii,ni); + if (!ni) return 0; + i=ii=0; + pc = open_progress(ni,"char_recognition"); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + x0=box2->x0;x1=box2->x1; + y0=box2->y0;y1=box2->y1; // box + cc=box2->c; + if (cc==PICTURE) continue; + + if ((mo&256)==0) { /* this case should be default (main engine) */ + if(cc==UNKNOWN || box2->num_ac==0 || box2->wac[0]cfg.certainty) + cc=whatletter(box2,cs ,0); + } + + if(mo&2) + if(cc==UNKNOWN || box2->num_ac==0 || box2->wac[0]cfg.certainty) + cc=ocr_db(box2); + + + // box2->c=cc; bad idea (May03 removed) + // set(box2,cc,95); ToDo: is that better? + + if(cc==UNKNOWN) + i++; + ii++; + + if(JOB->cfg.verbose&8) { + fprintf(stderr,"\n# code= %04lx %c",(long)cc,(char)((cc<255)?cc:'_')); + //out_b(box2,pp,x0,y0,x1-x0+1,y1-y0+1,cs); + } + progress(ii,pc); /* ii = 0..ni */ + + } end_for_each(&(JOB->res.boxlist)); + close_progress(pc); + if(JOB->cfg.verbose)fprintf(stderr," %d of %d chars unidentified\n",i,ii); + return 0; +} + + +/* +** compare unknown with known chars, +** very similar to the find_similar_char_function but here only to +** improve the result +*/ +int compare_unknown_with_known_chars(pix * pp, int mo) { + int i, cs = JOB->cfg.cs, dist, d, ad, wac, ni, ii; + struct box *box2, *box3, *box4; + progress_counter_t *pc=NULL; + wchar_t bc; + i = ii = 0; // ---- ------------------------------- + if (JOB->cfg.verbose) + fprintf(stderr, "# try to compare unknown with known chars !(mode&8)"); + if (!(mo & 8)) + { + ii=ni=0; + for_each_data(&(JOB->res.boxlist)) { ni++; } end_for_each(&(JOB->res.boxlist)); + pc = open_progress(ni,"compare_chars"); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); ii++; + if (box2->c == UNKNOWN || (box2->num_ac>0 && box2->wac[0]<97)) + if (box2->y1 - box2->y0 > 4 && box2->x1 - box2->x0 > 1) { // no dots! + box4 = (struct box *)list_get_header(&(JOB->res.boxlist));; + dist = 1000; /* 100% maximum */ + bc = UNKNOWN; /* best fit char */ + for_each_data(&(JOB->res.boxlist)) { + box3 = (struct box *)list_get_current(&(JOB->res.boxlist)); + wac=((box3->num_ac>0)?box3->wac[0]:100); + if (box3 == box2 || box3->c == UNKNOWN + || waccfg.certainty) continue; + if (box2->y1 - box2->y0 < 5 || box2->x1 - box2->x0 < 3) continue; + d = distance(pp, box2, pp, box3, cs); + if (d < dist) { + dist = d; bc = box3->c; box4 = box3; + } + } end_for_each(&(JOB->res.boxlist)); + if (dist < 10) { + /* sureness can be maximal of box3 */ + if (box4->num_ac>0) ad = box4->wac[0]; + else ad = 97; + ad-=dist; if(ad<1) ad=1; + /* ToDo: ad should depend on ad of bestfit */ + setac(box2,(wchar_t)bc,ad); + i++; + } // limit as option??? + // => better max distance('e','e') ??? + if (dist < 50 && (JOB->cfg.verbose & 7)) { // only for debugging + fprintf(stderr,"\n# L%02d best fit was %04x=%c dist=%3d%% i=%d", + box2->line, (int)bc, (char)((bc<128)?bc:'_'), dist, i); + if(box4->num_ac>0)fprintf(stderr," w= %3d%%",box4->wac[0]); + } + progress(ii,pc); + } + } end_for_each(&(JOB->res.boxlist)); + close_progress(pc); + } + if (JOB->cfg.verbose) + fprintf(stderr, " - found %d (nC=%d)\n", i, ii); + return 0; +} + +/* +// ---- divide overlapping chars which !strchr("_,.:;",c); +// block-splitting (two ore three glued chars) +// division if dots>0 does not work properly! ??? +// +// what about glued "be"? +// what about recursive division? +// ToDo: mark divided boxes to give the engine a chance to +// handle wrong divisions +*/ +int try_to_divide_boxes( pix *pp, int mo){ + struct box *box2, boxa, boxb; + int cs=JOB->cfg.cs, ad=100, + a2[8], ar, // certainty of each part, ar = product of all certainties + cbest; // best certainty, skip search of certaintycfg.verbose) + fprintf(stderr,"# try to divide unknown chars !(mode&16)"); + if(!(mo&16)) // put this to the caller + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + // don't try to split simple structures (ex: 400x30 square) + if ((!box2->num_frames) + || box2->num_frame_vectors[ box2->num_frames-1 ]<9) continue; + if((box2->c==UNKNOWN || (box2->num_ac && box2->wac[0]cfg.certainty)) + && box2->x1-box2->x0>5 && box2->y1-box2->y0>4){ + x0=box2->x0; x1=box2->x1; + y0=box2->y0; y1=box2->y1; + ad=100; + cbest=0; + + /* get minimum vertical lines */ + n1 = num_cross(x0,x1,( y1+y0)/2,( y1+y0)/2,pp,cs); + ii = num_cross(x0,x1,(3*y1+y0)/4,(3*y1+y0)/4,pp,cs); if (iim2 && box2->m3 > box2->m2+2) + for (i=box2->m2+1;i<=box2->m3-1;i++) { + if (loop(pp,x0+1,i,x1-x0,cs,1,RI) > (x1-x0-2)) continue; // ll + ii = num_cross(x0,x1,i,i,pp,cs); if (iim3+box2->m4 /* baseline char ? */ + && num_cross(x0,x1,y1-1,y1-1,pp,cs)==1 // -1 for slopes + && num_cross((x0+2*x1)/3,(x0+3*x1)/4,y0,y1,pp,cs)<3 // not exclude tz + && num_cross((3*x0+x1)/4,(2*x0+x1)/3,y0,y1,pp,cs)<3 // not exclude zl + && loop(pp,x0,y1-(y1-y0)/32,x1-x0,cs,0,RI) + +loop(pp,x1,y1-(y1-y0)/32,x1-x0,cs,0,LE) > (x1-x0+1)/2 + ) continue; /* do not try on bvdo"o etc. */ + + // one vertical line can not be two glued chars, lc? + if ( num_cross(x0,x1,(y1+y0)/2,(y1+y0)/2,pp,cs)<=1 ) continue; + { // doublet = 2 letters + // char buf[4]="\0\0\0"; // 4th byte is string end == \0 + // buf[0]=c1; // c1 is wchar_t! (0xbf00 to 0) failes + // buf[1]=c2; + char buf[64]=""; // end == \0 + if (JOB->cfg.verbose&2){ + fprintf(stderr, "\n#\n# divide box: %4d %4d %3d %3d\n", + x0, y0, x1-x0+1, y1-y0+1); + } + // it would be better if testing is only if most right and left char + // is has no horizontal gap (below m2) ex: be + i=0; // num splittet chars + xi[0]=x0; xi[1]=x0+3; xi[2]=x1; + for ( ; ; xi[i+1]++) { // x[i] .. x[i+1], slower? but better v0.42 + /* break if x is to near to the right border */ + if (xi[i+1]>x1-3) { if (i==0) break; i--; xi[i+2]=x1; continue; } + // ToDo: skip if not a local dy-min for speedup + { int ymin=y1, ymax=y0, bow=0, // min max at cutting point + max0=y0, max1=y0, // max y on left and right side + min0=y1, min1=y1; // min y on left and right side + for (dy=0,ii=0;iinum_frame_vectors[ 0 ];ii++) { + int pre=ii-1, next=(ii+1)%box2->num_frame_vectors[ 0 ]; + if (pre<0) pre=box2->num_frame_vectors[ 0 ]-1; + // check if vector is inside box to cut + if ( box2->frame_vector[ii ][0]<=xi[i ]) continue; + if ( box2->frame_vector[ii ][0]> xi[i+2]) continue; + // 2nd derivation of y(x) + if (abs(box2->frame_vector[ii ][0]-xi[i+1])<2) { + dy= 2*box2->frame_vector[ii ][1] + -box2->frame_vector[next][1] + -box2->frame_vector[pre ][1]; + dx= box2->frame_vector[next][0] + -box2->frame_vector[pre ][0]; + // rotate 180 degree if dx<0 + if (((dx>0)?dy:-dy)<-abs(dx)/2) { bow=1; } + } + // its not the best if we think on glued fi fo etc. + if (( box2->frame_vector[pre ][0]<=xi[i+1] + && box2->frame_vector[next][0]>=xi[i+1]) + || ( box2->frame_vector[pre ][0]>=xi[i+1] + && box2->frame_vector[next][0]<=xi[i+1])) { + if ( box2->frame_vector[ii ][1]>ymax) + ymax= box2->frame_vector[ii ][1]; + if ( box2->frame_vector[ii ][1]frame_vector[ii ][1]; + } + // min and max of left and right side + if ( box2->frame_vector[ii ][1]>max0 + && box2->frame_vector[ii ][0]<=xi[i+1]) + max0=box2->frame_vector[ii ][1]; + if ( box2->frame_vector[ii ][1]>max1 + && box2->frame_vector[ii ][0]> xi[i+1]) + max1=box2->frame_vector[ii ][1]; + if ( box2->frame_vector[ii ][1]frame_vector[ii ][0]<=xi[i+1]) + min0=box2->frame_vector[ii ][1]; + if ( box2->frame_vector[ii ][1]frame_vector[ii ][0]> xi[i+1]) + min1=box2->frame_vector[ii ][1]; + } + if(JOB->cfg.verbose&2) + fprintf(stderr,"\n# test if to split at x%d= %2d %2d %2d" + " bow,(max-min)[i,0,1] %d %3d %3d %3d" + , i, xi[i]-x0, xi[i+1]-x0, xi[i+2]-x0, bow, ymax-ymin, max0-min0, max1-min1); + /* skip if no local minimum at xi[i+1] or if its not thin enough */ + if (bow==0 || 4*(ymax-ymin)>2*(y1-y0)) continue; + // cuttet parts should have about the same height (max-min) + // we dont want to cut an 'n' in three parts! + if (2*(max0-min0+1)<(y1-y0+1)) continue; // left height + if (2*(max1-min1+1)<(y1-y0+1)) continue; // right height + // ToDo: thickness on xi[i+1]? + } + // try to split successive right box if left box is recognised, + // else shift the splitting point further to the right border + // removing ->dots if dot only above one char !!! ??? not implemented + if(JOB->cfg.verbose&2) + fprintf(stderr,"\n# try to split, newbox[%d].x= %2d ... %2d " + "dy= %d ", i, xi[i]-x0, xi[i+1]-x0, dy); + boxa=*box2; // copy contents, ToDo: reset ac-list (in cut_box?) + boxa.x=xi[i]; boxa.y=y0; // obsolete? mark pixel, overlap? + boxa.x0=xi[i];boxa.x1=xi[i+1]; // new horizontal box range + cut_box(&boxa); boxa.num_ac=0; + // out_x(&boxa); + // get wchar + certainty + ci[i]=whatletter(&boxa,cs,0); a2[i]=testac(&boxa,ci[i]); + if(JOB->cfg.verbose&2) + fprintf(stderr,"\n# certainty %d limit= %d cbest= %d ", + a2[i], JOB->cfg.certainty, cbest); + if (a2[i]cfg.certainty || a2[i]cfg.certainty/100 || arcfg.verbose&2) + fprintf(stderr,"\n try end split [%d]=%d [%d]=%d ", + i, xi[i]-x0, i+1, xi[i+1]-x0); + boxb=*box2; // try rest if it has to be split again + boxb.x=xi[i]+1; boxb.y=y0; + boxb.x0=xi[i]+1;boxb.x1=xi[i+1]; + cut_box(&boxb); boxb.num_ac=0; + ci[i]=whatletter(&boxb,cs,0); a2[i]=testac(&boxb,ci[i]); + if (a2[i]cfg.certainty || a2[i]cfg.verbose&2) { + fprintf(stderr,"\n split at/to: "); + for (ii=0;ii<=i;ii++) + fprintf(stderr," %2d %s (%3d)", xi[ii+1]-x0, + decode(ci[ii],ASCII), a2[ii]); + fprintf(stderr,"\n"); + } + // boxa..c changed!!! dots should be modified!!! + // Question: cut it into boxes v0.40 or set a string v0.41? + // new way of building a string v0.41 (can call setas multiple) + // usefull if compare unknown with known strings (except barcode?) + // ToDo: also create alternate variants? ex: I <-> l + for (buf[0]=0,ar=ad,ii=0;ii<=i;ii++) { + ar=a2[ii]*ar/100; // multiply all probabilities + if (i>0 && ci[ii]=='n' && ci[ii-1]=='r') ar--; // m == rn + strncat(buf,decode(ci[ii],JOB->cfg.out_format),20); + } + + if (ar>cbest) cbest=ar; // best (highest) certainty found + // reduce, but not if we cross certainty border + if (99*ar/100 > JOB->cfg.certainty) ar=99*ar/100; + if (JOB->cfg.verbose&2) + fprintf(stderr,"\n split result= %s (%3d) ",buf, ar); + setas(box2,buf,ar); // char *, does it disturb further splitting? + buf[0]=0; + i--; xi[i+2]=x1; + } + } + } + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose)fprintf(stderr,", numC %d\n",JOB->res.numC); + return 0; +} + +/* +// ---- divide vertical glued boxes (ex: g above T); +*/ +int divide_vert_glued_boxes( pix *pp, int mo){ + struct box *box2,*box3,*box4; + int y0,y1,y,dy,flag_found,dx; + if(JOB->cfg.verbose)fprintf(stderr,"# divide vertical glued boxes"); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->c != UNKNOWN) continue; /* dont try on pictures */ + y0=box2->y0; y1=box2->y1; dy=y1-y0+1; + dx=4*(JOB->res.avX+box2->x1-box2->x0+1); // we want to be sure to look at 4ex distance + if ( dy>2*JOB->res.avY && dy<6*JOB->res.avY && box2->m1 + && y0<=box2->m2+2 && y0>=box2->m1-2 + && y1>=box2->m4+JOB->res.avY-2) + { // test if lower end fits one of the other lines? + box4=box2; flag_found=0; + for_each_data(&(JOB->res.boxlist)) { + box4 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box4->c != UNKNOWN) continue; /* dont try on pictures */ + if (box4->x1x0-dx || box4->x0>box2->x1+dx) continue; // ignore far boxes + if (box4->line==box2->line ) flag_found|=1; // near char on same line + if (box4->line==box2->line+1) flag_found|=2; // near char on next line + if (flag_found==3) break; // we have two vertical glued chars + } end_for_each(&(JOB->res.boxlist)); + if (flag_found!=3) continue; // do not divide big chars or special symbols + y=box2->m4; // lower end of the next line + if(JOB->cfg.verbose&2){ + fprintf(stderr,"\n# divide box below y=%4d",y-y0); + } + // --- insert box3 before box2 + box3= (struct box *) malloc_box(box2); + box3->y1=y; + box2->y0=y+1; box2->line++; // m1..m4 should be corrected! + if (box4->line == box2->line){ + box2->m1=box4->m1; box2->m2=box4->m2; + box2->m3=box4->m3; box2->m4=box4->m4; + } + box3->num=JOB->res.numC; + if (list_ins(&(JOB->res.boxlist), box2, box3)) { + fprintf(stderr,"ERROR list_ins\n"); }; + JOB->res.numC++; + } + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose)fprintf(stderr,", numC %d\n",JOB->res.numC); + return 0; +} + + +/* + on some systems isupper(>255) cause a segmentation fault SIGSEGV + therefore this function + ToDo: should be replaced (?) by wctype if available on every system + */ +int wisupper(wchar_t cc){ return ((cc<128)?isupper(cc):0); } +int wislower(wchar_t cc){ return ((cc<128)?islower(cc):0); } +int wisalpha(wchar_t cc){ return ((cc<128)?isalpha(cc):0); } +int wisdigit(wchar_t cc){ return ((cc<128)?isdigit(cc):0); } +int wisspace(wchar_t cc){ return ((cc<128)?isspace(cc):0); } + +/* set box2->c to cc if cc is in the ac-list of box2, return 1 on success */ +int setc(struct box *box2, wchar_t cc){ + int ret=0, w1, w2; + w1=((box2->num_ac) ? box2->wac[0] : 0); // weight of replaced char + w2=testac(box2,cc); + if (JOB->cfg.verbose) + fprintf(stderr, "\n# change %s (%d) to %s (%d) at (%d,%d)", + decode(box2->c,ASCII), w1, decode(cc,ASCII), w2, box2->x0, box2->y0); + if (w2) { if (box2->c!=cc) { ret=1; setac(box2,cc,(100+w2)/2); } } + // if(JOB->cfg.verbose & 4) out_x(box2); + // ToDo: modify per setac (shift ac) + return ret; +} + + +/* ---- proof difficult chars Il1 by context view ---- + context: separator, number, vowel, nonvowel, upper case ???? + could be also used to find unknown chars if the environment (nonumbers) + can be found in other places! + ToDo: + - box->tac[] as set of possible chars, ac set by engine, example: + ac="l/" (not "Il|/\" because serifs detected and slant>0) + correction only to one of the ac-set (alternative chars)! + - should be language-settable; Unicode compatible + - box2->ad and wac should be changed? (not proper yet) + * ------------- */ +int context_correction( job_t *job ) { + // const static char + char *l_vowel="aeiouy"; + // *l_Vowel="AEIOU",chars if the environment (nonumbers) + char *l_nonvo = "bcdfghjklmnpqrstvwxz"; + struct box *box4, *box3, *box2, *prev, *next; + // pix *pp = &(job->src.p); + int nc=0, ns=0; // num corrections + + if (job->cfg.verbose) + fprintf(stderr, "# context correction Il1 0O"); + + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box2->c > 0xFF) continue; // temporary UNICODE fix + prev = (struct box *)list_get_cur_prev(&(job->res.boxlist)); + next = (struct box *)list_get_cur_next(&(job->res.boxlist)); + if( (prev) && (prev->c > 0xFF)) continue; // temporary UNICODE fix 2 + if( (next) && (next->c > 0xFF)) continue; // temporary UNICODE fix 3 + if (box2->num_ac<2) continue; // no alternatives + if (box2->wac[0]==100 && box2->wac[1]<100) continue; + if (box2->num_ac && box2->tas[0]) continue; // buggy space_remove 0.42 + + /* check for Il1| which are general difficult to distinguish */ + /* bbg: not very good. Should add some tests to check if is preceded by '.', + spelling, etc */ + /* ToDo: only correct if not 100% sure (wac[i]<100) + and new char is in wat[] */ + if (strchr("Il1|", box2->c) && next && prev) { +// if( strchr(" \n",prev->c) // SPC +// && strchr(" \n",next->c) ) box2->c='I'; else // bad idea! I have ... + if (wisalpha(next->c) && next->c!='i' && + ( prev->c == '\n' || + ( prev->c == ' ' && + ( box4=(struct box *)list_prev(&(job->res.boxlist), prev)) && + box4->c == '.' ) ) ) { nc+=setc(box2,(wchar_t)'I'); } + else if (box2->c!='1' && strchr(l_nonvo,next->c) && + strchr("\" \n",prev->c)) /* lnt => Int, but 1st */ + /* do not change he'll to he'Il! */ + { nc+=setc(box2,(wchar_t)'I'); } // set box2->c to 'I' if 'I' is in the ac-list + else if (strchr(l_vowel,next->c)) /* unusual? Ii Ie Ia Iy Iu */ + /* && strchr("KkBbFfgGpP",prev->c)) */ /* kle Kla Kli */ + { nc+=setc(box2,(wchar_t)'l'); } + else if (wisupper(next->c) + && !strchr("O0I123456789",next->c) + && !strchr("O0I123456789",prev->c)) /* avoid lO => IO (10) */ + { nc+=setc(box2,(wchar_t)'I'); } + else if (wislower(prev->c)) + { nc+=setc(box2,(wchar_t)'l'); } + else if (wisdigit(prev->c) || wisdigit(next->c) + || (next->c=='O' && !wisalpha(prev->c))) /* lO => 10 */ + { nc+=setc(box2,(wchar_t)'1'); } + } + + /* check for O0 */ + else if (strchr("O0", box2->c) && next && prev) { + if (wisspace(prev->c) && wisalpha(next->c)) /* initial letter */ + { nc+=setc(box2,(wchar_t)'O'); } + else if (wisalpha(prev->c) && wisalpha(next->c) + && wisupper(next->c)) /* word in upper case */ + { nc+=setc(box2,(wchar_t)'O'); } + else if (wisdigit(prev->c) || wisdigit(next->c)) + { nc+=setc(box2,(wchar_t)'0'); } + } + + /* check for 5S */ + else if (strchr("5S", box2->c) && next && prev) { + if (wisspace(prev->c) && wisalpha(next->c)) /* initial letter */ + { nc+=setc(box2,(wchar_t)'S'); } + else if (wisalpha(prev->c) && wisalpha(next->c) + && wisupper(next->c)) /* word in upper case */ + { nc+=setc(box2,(wchar_t)'S'); } + else if (wisdigit(prev->c) || wisdigit(next->c)) + { nc+=setc(box2,(wchar_t)'5'); } + } + + /* was a space not found? xXx => x Xx ??? */ + if (wisupper(box2->c) && next && prev) { + if (wislower(prev->c) && wislower(next->c) + && 2 * (box2->x0 - prev->x1) > 3 * (next->x0 - box2->x1)) { + struct box *box3 = malloc_box((struct box *) NULL); + box3->x0 = prev->x1 + 2; + box3->x1 = box2->x0 - 2; + box3->y0 = box2->y0; + box3->y1 = box2->y1; + box3->x = box2->x0 - 1; + box3->y = box2->y0; + box3->dots = 0; + box3->num_boxes = 0; + box3->num_subboxes = 0; + box3->c = ' '; + box3->modifier = 0; + setac(box3,' ',99); /* ToDo: weight depends from distance */ + box3->num = -1; + box3->line = prev->line; + box3->m1 = box3->m2 = box3->m3 = box3->m4 = 0; + box3->p = &(job->src.p); + list_ins(&(job->res.boxlist), box2, box3); + } + } + + /* a space before punctuation? but not " ./file" */ + if ( prev && next) + if (prev->c == ' ' && strchr(" \n" , next->c) + && strchr(".,;:!?)", box2->c)) + if (prev->x1 - prev->x0 < 2 * job->res.avX) { // carefully on tables + box3 = prev; + if ( !list_del(&(job->res.boxlist), box3) ) free_box(box3); + prev = (struct box *)list_get_cur_prev(&(job->res.boxlist)); + ns++; + } + + /* \'\' to \" */ + if ( prev ) + if ( (prev->c == '`' || prev->c == '\'') + && (box2->c == '`' || box2->c == '\'') ) + if (prev->x1 - box2->x0 < job->res.avX) { // carefully on tables + box2->c='\"'; + box3 = prev; + list_del(&(job->res.boxlist), box3); + free_box(box3); + } + } end_for_each(&(job->res.boxlist)); + if (job->cfg.verbose) + fprintf(stderr, " num_corrected= %d removed_spaces= %d\n", nc, ns); + return 0; +} + + +/* ---- insert spaces ---- + * depends strongly from the outcome of measure_pitch() + * ------------------------ */ +int list_insert_spaces( pix *pp, job_t *job ) { + int i=0, j1, j2, i1, maxline=-1, dy=0; char cc; + struct box *box2, *box3=NULL, *box4=NULL; + + // measure mean line height + for(i1=1;i1res.lines.num;i1++) { + dy+=job->res.lines.m4[i1]-job->res.lines.m1[i1]+1; + } if (job->res.lines.num>1) dy/=(job->res.lines.num-1); + i=0; j2=0; + for(i1=1;i1res.lines.num;i1++) { + j1=job->res.lines.m4[i1]-job->res.lines.m1[i1]+1; + if (j1>dy*120/100 || j10 && j2/i>7) dy=j2/i; + if( job->cfg.verbose&1 ) + fprintf(stderr,"# insert space between words (dy=%d) ...",dy); + if (!dy) dy=(job->res.avY)*110/100+1; + + i=0; + for_each_data(&(job->res.boxlist)) { + box2 =(struct box *)list_get_current(&(job->res.boxlist)); + cc=0; + if (box2->line>maxline) { // lines and chars must be sorted! + if (maxline>=0) cc='\n'; // NL + maxline=box2->line; + } + if((box3 = (struct box *)list_prev(&(job->res.boxlist), box2))){ + if (maxline && !box2->line && cc==0) cc=' '; + if (box2->line<=maxline && cc==0) { // lines and chars must be sorted! + int thispitch = job->res.lines.pitch[box2->line]; + int thismono = job->res.lines.mono[box2->line]; + int mdist = (box2->x1 + box2->x0 - (box3->x1 + box3->x0) + 1)/2; + int pdist = box2->x0 - box3->x1 + 1; + if (box2->x1 - box2->x0 < thispitch) pdist=pdist*4/3; + /* allow extra pixels around small characters .,'!: etc */ + // fprintf(stderr,"#\n ... mono= %2d pitch= %2d mdist= %2d pdist= %2d", + // thismono, thispitch, mdist, pdist); + if ((thismono!=0 && mdist >= thispitch) + || (thismono==0 && pdist >= thispitch)) + cc=' '; // insert SPACE + } + } + if(cc){ + box4=(struct box *)list_prev(&(job->res.boxlist), box2); + box3=(struct box *)malloc_box(NULL); + box3->x0=box2->x0-2; box3->x1=box2->x0-2; + box3->y0=box2->y0; box3->y1=box2->y1; + if(cc!='\n' && box4) + box3->x0=box4->x1+2; + if(cc=='\n' || !box4) + box3->x0=job->res.lines.x0[box2->line]; + if(cc=='\n' && box4){ + box3->y0=box4->y1; // better use lines.y1[box2->pre] ??? + box3->y1=box2->y0; + } + box3->x =box2->x0-1; box3->y=box2->y0; + box3->dots=0; box3->c=cc; + box3->num_boxes = 0; + box3->num_subboxes = 0; + box3->modifier='\0'; + box3->num=-1; box3->line=box2->line; + box3->m1=box2->m1; box3->m2=box2->m2; + box3->m3=box2->m3; box3->m4=box2->m4; + box3->p=pp; + setac(box3,cc,99); /* ToDo: weight depends from distance */ + list_ins(&(job->res.boxlist),box2,box3); + if( job->cfg.verbose&1 ) { + fprintf(stderr,"\n# insert space &%d; at x= %4d %4d box= %p", + (int)cc, box3->x0, box3->y0, (void*)box3); + /* out_x(box3); */ + } + i++; + } + } end_for_each(&(job->res.boxlist)); + if( job->cfg.verbose&1 ) fprintf(stderr," found %d\n",i); + return 0; +} + + +/* + add infos where the box is positioned to the box + this is useful for better recognition +*/ +int add_line_info(/* List *boxlist2 */){ + // pix *pp=&JOB->src.p; + struct tlines *lines = &JOB->res.lines; + struct box *box2; + int i,xx,m1,m2,m3,m4,num_line_members=0,num_rest=0; + if( JOB->cfg.verbose&1 ) fprintf(stderr,"# add line infos to boxes ..."); + for_each_data(&(JOB->res.boxlist)) { + box2 =(struct box *)list_get_current(&(JOB->res.boxlist)); + for(i=1;ires.lines.num;i++) /* line 0 is a place holder */ + { + if (lines->dx) xx=lines->dy*((box2->x1+box2->x0)/2)/lines->dx; else xx=0; + m1=lines->m1[i]+xx; + m2=lines->m2[i]+xx; + m3=lines->m3[i]+xx; + m4=lines->m4[i]+xx; + // fprintf(stderr," test line %d m1=%d %d %d %d\n",i,m1,m2,m3,m4); + if (m4-m1==0) continue; /* no text line (line==0) */ +#if 0 + if( box2->y1+2*JOB->res.avY >= m1 + && box2->y0-2*JOB->res.avY <= m4 ) /* not to far away */ +#endif + /* give also a comma behind the line a chance */ + if( box2->x0 >= lines->x0[i] && box2->x1 <= lines->x1[i]+JOB->res.avX ) + if( box2->m2==0 || abs(box2->y0-box2->m2) > abs(box2->y0-m2) ) + { /* found nearest line */ + box2->m1=m1; + box2->m2=m2; + box2->m3=m3; + box2->m4=m4; + box2->line=i; + } + } + if( box2->y1+2 < box2->m1 + || box2->y0 < box2->m1 - (box2->m3-box2->m1)/2 + || box2->y0-2 > box2->m4 + || box2->y1 > box2->m3 + (box2->m3-box2->m1) + ) /* to far away */ + { /* reset */ + box2->m1=0; + box2->m2=0; + box2->m3=0; + box2->m4=0; + box2->line=0; + num_rest++; + } else num_line_members++; + } end_for_each(&(JOB->res.boxlist)); + if( JOB->cfg.verbose&1 ) + fprintf(stderr," done, num_line_chars=%d rest=%d\n", + num_line_members, num_rest); + return 0; +} + + +/* + * bring the boxes in right order + * add_line_info must be executed first! + */ +int sort_box_func (const void *a, const void *b) { + struct box *boxa, *boxb; + + boxa = (struct box *)a; + boxb = (struct box *)b; + + if ( ( boxb->line < boxa->line ) || + ( boxb->line == boxa->line && boxb->x0 < boxa->x0 ) ) + return 1; + return -1; +} + +// ------------------------------------------------------------- +// ------ use this for entry from other programs +// include pnm.h pgm2asc.h +// ------------------------------------------------------------- +// entry point for gocr.c or if it is used as lib +// better name is call_ocr ??? +// jb: OLD COMMENT: not removed due to set_options_* () +// args after pix *pp should be removed and new functions +// set_option_mode(int mode), set_option_spacewidth() .... etc. +// should be used instead, before calling pgm2asc(pix *pp) +// ! change if you can ! - used by X11 frontend +int pgm2asc(job_t *job) +{ + pix *pp; + progress_counter_t *pc; + + assert(job); + /* FIXME jb: remove pp */ + pp = &(job->src.p); + + if( job->cfg.verbose ) + fprintf(stderr, "# db_path= %s\n", job->cfg.db_path); + + pc = open_progress(100,"pgm2asc_main"); + progress(0,pc); /* start progress output 0% 0% */ + + /* ----- count colors ------ create histogram ------- + - this should be used to create a upper and lower limit for cs + - cs is the optimum gray value between cs_min and cs_max + - also inverse scans could be detected here later */ + if (job->cfg.cs==0) + job->cfg.cs=otsu( pp->p,pp->y,pp->x,0,0,pp->x,pp->y, job->cfg.verbose & 1 ); + /* renormalize the image and set the normalized threshold value */ + job->cfg.cs=thresholding( pp->p,pp->y,pp->x,0,0,pp->x,pp->y, job->cfg.cs ); + if( job->cfg.verbose ) + fprintf(stderr, "# thresholding new_threshold= %d\n", job->cfg.cs); + + progress(5,pc); /* progress is only estimated */ + +#if 0 /* dont vast memory */ + /* FIXME jb: malloc */ + if ( job->cfg.verbose & 32 ) { + // generate 2nd imagebuffer for debugging output + job->tmp.ppo.p = (unsigned char *)malloc(job->src.p.y * job->src.p.x); + // buffer + assert(job->tmp.ppo.p); + copybox(&job->src.p, + 0, 0, job->src.p.x, job->src.p.y, + &job->tmp.ppo, + job->src.p.x * job->src.p.y); + } +#else + job->tmp.ppo=job->src.p; /* temporarely, removed later */ +#endif + + /* load character data base */ + if ( job->cfg.mode&2 ) + load_db(); + + /* this is first step for reorganize the PG + ---- look for letters, put rectangular frames around letters + letter = connected points near color F + should be used by dust removing (faster) and line detection! + ---- 0..cs = black letters, last change = Mai99 */ + + progress(8,pc); /* progress is only estimated */ + + scan_boxes( pp ); + if ( !job->res.numC ){ + fprintf( stderr,"# no boxes found - stopped\n" ); + //if(job->cfg.verbose&32) debug_img("out01",job,8); + /***** should free stuff, etc) */ + return(1); + } + // if (job->cfg.verbose&32) debug_img("out00",job,4+8); + + progress(10,pc); /* progress is only estimated */ + // if(job->cfg.verbose&32) debug_img("out01",job,4+8); + // output_list(job); // for debugging + // ToDo: matrix printer preprocessing + + remove_dust( job ); /* from the &(job->res.boxlist)! */ +// if(job->cfg.verbose&32) debug_img("out02",job,4+8); +// output_list(job); // for debugging + smooth_borders( job ); /* only for big chars */ + progress(12,pc); /* progress is only estimated */ +// if(job->cfg.verbose&32) debug_img("out03",job,4+8); +// output_list(job); // for debugging + + //detect_barcode( job ); /* mark barcode */ +// if(job->cfg.verbose&32) debug_img("out04",job,4+8); +// output_list(job); // for debugging + + detect_pictures( job ); /* mark pictures */ +// if(job->cfg.verbose&32) debug_img("out05",job,4+8); +// output_list(job); // for debugging + + remove_pictures( job ); /* do this as early as possible, before layout */ +// if(job->cfg.verbose&32) debug_img("out06",job,4+8); +// output_list(job); // for debugging + + glue_holes_inside_chars( pp ); /* including count subboxes (holes) */ + + detect_rotation_angle( job ); + +#if 1 /* Rotate the whole picture! move boxes */ + if( job->res.lines.dy!=0 ){ // move down lowest first, move up highest first + // in work! ??? (at end set dy=0) think on ppo! + } +#endif + detect_text_lines( pp, job->cfg.mode ); /* detect and mark JOB->tmp.ppo */ +// if(job->cfg.verbose&32) debug_img("out07",job,4+8); + progress(20,pc); /* progress is only estimated */ + + add_line_info(/* &(job->res.boxlist) */); + //if (job->cfg.verbose&32) debug_img("out10",job,4+8); + + divide_vert_glued_boxes( pp, job->cfg.mode); /* after add_line_info, before list_sort! */ +// if(job->cfg.verbose&32) debug_img("out11",job,0); + + remove_melted_serifs( pp ); /* make some corrections on pixmap */ + /* list_ins seems to sort in the boxes on the wrong place ??? */ +// if(job->cfg.verbose&32) debug_img("out12",job,4+8); + + glue_broken_chars( pp ); /* 2nd glue */ +// if(job->cfg.verbose&32) debug_img("out14",job,4+8); + + remove_rest_of_dust( ); +// if(job->cfg.verbose&32) debug_img("out15",job,4+8); + + /* better sort after dust is removed (slow for lot of pixels) */ + list_sort(&(job->res.boxlist), sort_box_func); + + measure_pitch( job ); + + if(job->cfg.mode&64) find_same_chars( pp ); + progress(30,pc); /* progress is only estimated */ +// if(job->cfg.verbose&32) debug_img("out16",job,4+8); + + char_recognition( pp, job->cfg.mode); + progress(60,pc); /* progress is only estimated */ +// if(job->cfg.verbose&32) debug_img("out17",job,4+8); + + if ( adjust_text_lines( pp, job->cfg.mode ) ) { /* correct using chars */ + /* may be, characters/pictures have changed line number */ + list_sort(&(job->res.boxlist), sort_box_func); + // 2nd recognition call if lines are adjusted + char_recognition( pp, job->cfg.mode); + } + +#define BlownUpDrawing 1 /* german: Explosionszeichnung, temporarly */ +#if BlownUpDrawing == 1 /* german: Explosionszeichnung */ +{ /* just for debugging */ + int i,ii,ni; struct box *box2; + i=ii=ni=0; + for_each_data(&(JOB->res.boxlist)) { /* count boxes */ + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->c==UNKNOWN) i++; + if (box2->c==PICTURE) ii++; + ni++; + } end_for_each(&(JOB->res.boxlist)); + if (JOB->cfg.verbose) + fprintf(stderr,"# debug: unknown= %d picts= %d boxes= %d\n",i,ii,ni); +} +#endif + // ----------- write out20.pgm ----------- mark lines + boxes + //if (job->cfg.verbose&32) debug_img("out20",job,1+4+8); + + compare_unknown_with_known_chars( pp, job->cfg.mode); + progress(70,pc); /* progress is only estimated */ + + try_to_divide_boxes( pp, job->cfg.mode); + progress(80,pc); /* progress is only estimated */ + + /* --- list output ---- for debugging --- */ + //if (job->cfg.verbose&6) output_list(job); + + /* ---- insert spaces ---- */ + list_insert_spaces( pp , job ); + + // ---- proof difficult chars Il1 by context view ---- + if (JOB->cfg.verbose) + fprintf(stderr,"# context correction if !(mode&32)\n"); + if (!(job->cfg.mode&32)) context_correction( job ); + + store_boxtree_lines( job->cfg.mode ); + progress(90,pc); /* progress is only estimated */ + +/* 0050002.pgm.gz ca. 109 digits, only 50 recognized (only in lines?) + * ./gocr -v 39 -m 56 -e - -m 4 -C 0-9 -f XML tmp0406/0050002.pbm.gz + * awk 'BEGIN{num=0}/1<\/box>/{num++;}END{print num}' o + * 15*0 24*1 18*2 19*3 15*4 6*5 6*6 6*7 4*8 8*9 sum=125digits counted boxes + * 9*0 19*1 14*2 15*3 11*4 6*5 5*6 6*7 4*8 8*9 sum=97digits recognized + * 1*1 1*7 not recognized (Oct04) + * 33*SPC 76*NL = 109 spaces + 36*unknown sum=241 * 16 missed + */ +#if BlownUpDrawing == 1 /* german: Explosionszeichnung */ +{ /* just for debugging */ + int i,ii,ni; struct box *box2; const char *testc="0123456789ABCDEFGHIJK"; + i=ii=ni=0; + for_each_data(&(JOB->res.boxlist)) { /* count boxes */ + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->c==UNKNOWN) i++; + if (box2->c==PICTURE) ii++; + if (box2->c>' ' && box2->c<='z') ni++; + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose) + fprintf(stderr,"# debug: (_)= %d picts= %d chars= %d",i,ii,ni); + for (i=0;i<20;i++) { + ni=0; + for_each_data(&(JOB->res.boxlist)) { /* count boxes */ + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->c==testc[i]) ni++; + } end_for_each(&(JOB->res.boxlist)); + if(JOB->cfg.verbose && ni>0) + fprintf(stderr," (%c)=%d",testc[i],ni); + } + if(JOB->cfg.verbose) + fprintf(stderr,"\n"); +} +#endif + + // ---- frame-size-histogram + // ---- (my own defined) distance between letters + // ---- write internal picture of textsite + // ----------- write out30.pgm ----------- + //if( job->cfg.verbose&32 ) debug_img("out30",job,2+4); + + progress(100,pc); /* progress is only estimated */ + + close_progress(pc); + + return 0; /* what should I return? error-state? num-of-chars? */ +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h new file mode 100644 index 000000000..9cd8b1fdb --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h @@ -0,0 +1,106 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + +*/ + +#ifndef PGM2ASC_H +#define PGM2ASC_H 1 + +#include "pnm.h" +//#include "output.h" +#include "list.h" +#include "unicode.h" +#include "gocr.h" + +#define pixel_at(pic, xx, yy) (pic).p[(xx)+((yy)*((pic).x))] +#define pixel_atp(pic, xx, yy) (pic)->p[(xx)+((yy)*((pic)->x))] + +#ifndef HAVE_WCHAR_H +const wchar_t *wcschr (const wchar_t *wcs, wchar_t wc); +const wchar_t *wcscpy (wchar_t *dest, const wchar_t *src); +size_t wcslen (const wchar_t *s); +#endif +#ifndef HAVE_WCSDUP +wchar_t * wcsdup (const wchar_t *WS); /* its a gnu extension */ +#endif + +/* declared in pgm2asc.c */ +/* set alternate chars and its weight, called from the engine + if a char is recognized to (weight) percent */ +int setas(struct box *b, char *as, int weight); /* string + xml */ +int setac(struct box *b, wchar_t ac, int weight); /* wchar */ + +/* for qsort() call */ +int intcompare (const void *vr, const void *vs); + +/* declared in box.c */ +int box_gt(struct box *box1, struct box *box2); +int reset_box_ac(struct box *box); /* reset and free char table */ +struct box *malloc_box( struct box *inibox ); /* alloc memory for a box */ +int free_box( struct box *box ); /* free memory of a box */ +int copybox( pix *p, int x0, int y0, int dx, int dy, pix *b, int len); +int reduce_vectors ( struct box *box1, int mode ); +int merge_boxes( struct box *box1, struct box *box2 ); +int cut_box( struct box *box1); + + +/* declared in database.c */ +int load_db(void); +wchar_t ocr_db(struct box *box1); + +/* declared in detect.c */ +int detect_lines1(pix * p, int x0, int y0, int dx, int dy); +int detect_lines2(pix *p,int x0,int y0,int dx,int dy,int r); +int detect_rotation_angle(job_t *job); +int detect_text_lines(pix * pp, int mo); +int adjust_text_lines(pix * pp, int mo); +int detect_pictures(job_t *job); + +/* declared in lines.c */ +void store_boxtree_lines( int mo ); + /* free memory for internal stored textlines. + * Needs to be called _after_ having retrieved the text. + * After freeing, no call to getTextLine is possible any + * more + */ +void free_textlines( void ); + + /* get result of ocr for a given line number. + * If the line is out of range, the function returns 0, + * otherwise a pointer to a complete line. + */ +const char *getTextLine( int ); + +/* declared in remove.c */ +int remove_dust( job_t *job ); +int remove_pictures( job_t *job); +int remove_melted_serifs( pix *pp ); +int remove_rest_of_dust(); +int smooth_borders( job_t *job ); + +/* declared in pixel.c */ +int marked(pix * p, int x, int y); +int pixel(pix *p, int x, int y); +void put(pix * p, int x, int y, int ia, int io); + +/* start ocr on a image in job.src.p */ +int pgm2asc(job_t *job); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c new file mode 100644 index 000000000..41647f396 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c @@ -0,0 +1,537 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2006 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + Joerg.Schulenburg@physik.uni-magdeburg.de */ + +/* Filter by tree, filter by number methods added by + * William Webber, william@williamwebber.com. */ + +#include "pgm2asc.h" +#include +#include + +/* + * Defining this causes assert() calls to be turned off runtime. + * + * This is normally taken care of by make. + */ +/* #define NDEBUG */ + +// ------------------ (&~7)-pixmap-functions ------------------------ + +/* test if pixel marked? + * Returns: 0 if not marked, least 3 bits if marked. + */ +int marked (pix * p, int x, int y) { + if (x < 0 || y < 0 || x >= p->x || y >= p->y) + return 0; + return (pixel_atp(p, x, y) & 7); +} + +#define Nfilt3 6 /* number of 3x3 filter */ +/* + * Filters to correct possible scanning or image errors. + * + * Each of these filters represents a 3x3 pixel area. + * 0 represents a white or background pixel, 1 a black or + * foreground pixel, and 2 represents a pixel of either value. + * Note that this differs from the meaning of pixel values in + * the image, where a high value means "white" (background), + * and a low value means "black" (foreground). + * + * These filters are applied to the 3x3 environment of a pixel + * to be retrieved from the image, centered around that pixel + * (that is, the to-be-retrieved pixel corresponds with the + * the fifth position of the filter). + * If the filter matches that pixel environment, then + * the returned value of the pixel is inverted (black->white + * or white->black). + * + * So, for instance, the second filter below matches this + * pattern: + * + * 000 + * X0X + * 000 + * + * and "fills in" the middle (retrieved) pixel to rejoin a line + * that may have been broken by a scanning or image error. + */ +const char filt3[Nfilt3][9]={ + {0,0,0, 0,0,1, 1,0,0}, /* (-1,-1) (0,-1) (1,-1) (-1,0) (0,0) ... */ + {0,0,0, 1,0,1, 0,0,0}, + {1,0,0, 0,0,1, 0,0,0}, + {1,1,0, 0,1,0, 2,1,1}, + {0,0,1, 0,0,0, 2,1,0}, + {0,1,0, 0,0,0, 1,2,0} +}; +/* 2=ignore_pixel, 0=white_background, 1=black_pixel */ + + +/* + * Filter by matrix uses the above matrix of filters directly. Pixel + * environments to be filtered are compared pixel by pixel against + * these filters. + * + * Filter by number converts these filters into integer representations + * and stores them in a table. Pixel environments are similarly + * converted to integers, and looked up in the table. + * + * Filter by tree converts these filters into a binary tree. Pixel + * environments are matched by traversing the tree. + * + * A typical performance ratio for these three methods is 20:9:7 + * respectively (i.e., the tree method takes around 35% of the + * time of the matrix method). + */ +#define FILTER_BY_MATRIX 0 +#define FILTER_BY_NUMBER 1 +#define FILTER_BY_TREE 2 + +#define FILTER_METHOD FILTER_BY_TREE + +/* + * Defining FILTER_CHECKED causes filter results from either the tree + * or the number method to be checked against results of the other + * two methods to ensure correctness. This is for bug checking purposes + * only. + */ +/* #define FILTER_CHECKED */ + +/* + * Defining FILTER_STATISTICS causes statistics to be kept on how many + * times the filters are tried, how many times a filter matches, and + * of these matches how many flip a black pixel to white, and how many + * the reverse. These statistics are printed to stderr at the end of + * the program run. Currently, statistics are only kept if the tree + * filter method is being used. + */ +/* #define FILTER_STATISTICS */ + +#ifdef FILTER_STATISTICS +static int filter_tries = 0; +static int filter_matches = 0; +static int filter_blackened = 0; +static int filter_whitened = 0; +#endif + +#ifdef FILTER_STATISTICS +void print_filter_stats() { + fprintf(stderr, "\n# Error filter statistics: tries %d, matches %d, " + "blackened %d, whitened %d\n", + filter_tries, filter_matches, filter_blackened, filter_whitened); +} +#endif + +#if FILTER_METHOD == FILTER_BY_MATRIX || defined(FILTER_CHECKED) +/* + * Filter the pixel at (x,y) by directly applying the matrix. + */ +int pixel_filter_by_matrix(pix * p, int x, int y) { + int i; + static char c33[9]; + memset(c33, 0, sizeof(c33)); + /* copy environment of a point (only highest bit) +bbg: FASTER now. It has 4 ifs less at least, 8 at most. */ + if (x > 0) { c33[3] = pixel_atp(p,x-1, y )>>7; + if (y > 0) c33[0] = pixel_atp(p,x-1,y-1)>>7; + if (y+1 < p->y) c33[6] = pixel_atp(p,x-1,y+1)>>7; + } + if (x+1 < p->x) { c33[5] = pixel_atp(p,x+1, y )>>7; + if (y > 0) c33[2] = pixel_atp(p,x+1,y-1)>>7; + if (y+1 < p->y) c33[8] = pixel_atp(p,x+1,y+1)>>7; + } + if (y > 0) c33[1] = pixel_atp(p, x ,y-1)>>7; + c33[4] = pixel_atp(p, x , y )>>7; + if (y+1 < p->y) c33[7] = pixel_atp(p, x ,y+1)>>7; + + /* do filtering */ + for (i = 0; i < Nfilt3; i++) + if( ( (filt3[i][0]>>1) || c33[0]!=(1 & filt3[i][0]) ) + && ( (filt3[i][1]>>1) || c33[1]!=(1 & filt3[i][1]) ) + && ( (filt3[i][2]>>1) || c33[2]!=(1 & filt3[i][2]) ) + && ( (filt3[i][3]>>1) || c33[3]!=(1 & filt3[i][3]) ) + && ( (filt3[i][4]>>1) || c33[4]!=(1 & filt3[i][4]) ) + && ( (filt3[i][5]>>1) || c33[5]!=(1 & filt3[i][5]) ) + && ( (filt3[i][6]>>1) || c33[6]!=(1 & filt3[i][6]) ) + && ( (filt3[i][7]>>1) || c33[7]!=(1 & filt3[i][7]) ) + && ( (filt3[i][8]>>1) || c33[8]!=(1 & filt3[i][8]) ) ) { + return ((filt3[i][4])?JOB->cfg.cs:0); + } + return pixel_atp(p, x, y) & ~7; +} +#endif + +#if FILTER_METHOD == FILTER_BY_NUMBER || defined(FILTER_CHECKED) + +#define NUM_TABLE_SIZE 512 /* max value of 9-bit value */ +/* + * Recursively generates entries in the number table for a matrix filter. + * + * gen_num_filt is the number representation of the matrix filter. + * This generation is handled recursively because this is the easiest + * way to handle 2 (either value) entries in the filter, which lead + * to 2 distinct entries in the number table (one for each alternate + * value). + */ +void rec_generate_number_table(char * num_table, const char * filter, + int i, unsigned short gen_num_filt) { + if (i == 9) { + /* Invert the value of the number representation, to reflect the + * fact that the "white" is 0 in the filter, 1 (high) in the image. */ + gen_num_filt = ~gen_num_filt; + gen_num_filt &= 0x01ff; + assert(gen_num_filt < NUM_TABLE_SIZE); + num_table[gen_num_filt] = 1; + } else { + if (filter[i] == 0 || filter[i] == 2) + rec_generate_number_table(num_table, filter, i + 1, gen_num_filt); + if (filter[i] == 1 || filter[i] == 2) { + gen_num_filt |= (1 << (8 - i)); + rec_generate_number_table(num_table, filter, i + 1, gen_num_filt); + } + } +} + +/* + * Filter the pixel at (x, y) using a number table. + * + * Each filter can be converted into a 9-bit representation, where + * filters containing 2 (either value) pixels are converted into + * a separate numerical representation for each pixel, where position + * i in the filter corresponds to bit i in the number. Each resulting + * numerical representation N is represented as a 1 value in the Nth + * position of a lookup table. A pixel's environment is converted in + * the same way to a numeric representation P, and that environment + * matches a filter if num_table[P] == 1. + */ +int pixel_filter_by_number(pix * p, int x, int y) { + unsigned short val = 0; + static char num_table[NUM_TABLE_SIZE]; + static int num_table_generated = 0; + if (!num_table_generated) { + int f; + memset(num_table, 0, sizeof(num_table)); + for (f = 0; f < Nfilt3; f++) + rec_generate_number_table(num_table, filt3[f], 0, 0); + num_table_generated = 1; + } + + /* calculate a numeric value for the 3x3 square around the pixel. */ + if (x > 0) { val |= (pixel_atp(p,x-1, y )>>7) << (8 - 3); + if (y > 0) val |= (pixel_atp(p,x-1,y-1)>>7) << (8 - 0); + if (y+1 < p->y) val |= (pixel_atp(p,x-1,y+1)>>7) << (8 - 6); + } + if (x+1 < p->x) { val |= (pixel_atp(p,x+1, y )>>7) << (8 - 5); + if (y > 0) val |= (pixel_atp(p,x+1,y-1)>>7) << (8 - 2); + if (y+1 < p->y) val |= (pixel_atp(p,x+1,y+1)>>7) << (8 - 8); + } + if (y > 0) val |= (pixel_atp(p, x ,y-1)>>7) << (8 - 1); + val |= (pixel_atp(p, x , y )>>7) << (8 - 4); + if (y+1 < p->y) val |= (pixel_atp(p, x ,y+1)>>7) << (8 - 7); + assert(val < NUM_TABLE_SIZE); + + if (num_table[val]) + return (val & (1 << 4)) ? 0 : JOB->cfg.cs; + else + return pixel_atp(p, x, y) & ~7; +} +#endif + +#if FILTER_METHOD == FILTER_BY_TREE || defined(FILTER_CHECKED) + +#define TREE_ARRAY_SIZE 1024 +/* 1+ number of nodes in a complete binary tree of height 10 */ + +/* + * Recursively generate a tree representation of a filter. + */ +void rec_generate_tree(char * tree, const char * filter, int i, int n) { + assert(i >= 0 && i <= 9); + assert(n < TREE_ARRAY_SIZE); + if (i == 9) { + if (filter[4] == 0) + tree[n] = 2; + else + tree[n] = 1; + return; + } + /* first iteration has n == -1, does not set any values of the tree, + just to find whether to start to the left or the right */ + if (n != -1) + tree[n] = 1; + if (filter[i] == 0) + rec_generate_tree(tree, filter, i + 1, n * 2 + 2); + else if (filter[i] == 1) + rec_generate_tree(tree, filter, i + 1, n * 2 + 3); + else { + rec_generate_tree(tree, filter, i + 1, n * 2 + 2); + rec_generate_tree(tree, filter, i + 1, n * 2 + 3); + } +} + +/* + * Filter the pixel at (x, y) using the tree method. + * + * Each filter is represented by a single branch of a binary + * tree, except for filters contain "either value" entries, which + * bifurcate at that point in the branch. Each white pixel in the filter + * is a left branch in the tree, each black pixel a right branch. The + * final node of a branch indicates whether this filter turns a white + * pixel black, or a black one white. + * + * We match a pixel's environment against this tree by similarly + * using the pixels in that environment to traverse the tree. If + * we run out of nodes before getting to the end of a branch, then + * the environment doesn't match against any of the filters represented + * by the tree. Otherwise, we return the value specified by the + * final node. + * + * Since the total tree size, even including missing nodes, is small + * (2 ^ 10), we can use a standard array representation of a binary + * tree, where for the node tree[n], the left child is tree[2n + 2], + * and the right tree[2n + 3]. The only information we want + * from a non-leaf node is whether it exists (that is, is part of + * a filter-representing branch). We represent this with the value + * 1 at the node's slot in the array, the contrary by 0. For the + * leaf node, 0 again represents non-existence, 1 that the filter + * represented by this branch turns a black pixel white, and 2 a + * white pixel black. + */ +int pixel_filter_by_tree(pix * p, int x, int y) { + static char tree[TREE_ARRAY_SIZE]; + static int tree_generated = 0; + int n; + int pixel_val = pixel_atp(p, x, y) & ~7; +#ifdef FILTER_STATISTICS + static int registered_filter_stats = 0; + if (!registered_filter_stats) { + atexit(print_filter_stats); + registered_filter_stats = 1; + } + filter_tries++; +#endif /* FILTER_STATISTICS */ + if (!tree_generated) { + int f; + memset(tree, 0, sizeof(tree)); + for (f = 0; f < Nfilt3; f++) { + const char * filter = filt3[f]; + rec_generate_tree(tree, filter, 0, -1); + } + tree_generated = 1; + } + n = -1; + + /* Note that for the image, low is black, high is white, whereas + * for the filter, 0 is white, 1 is black. For the image, then, + * high (white) means go left, low (black) means go right. */ + +#define IS_BLACK(_dx,_dy) !(pixel_atp(p, x + (_dx), y + (_dy)) >> 7) +#define IS_WHITE(_dx,_dy) (pixel_atp(p, x + (_dx), y + (_dy)) >> 7) +#define GO_LEFT n = n * 2 + 2 +#define GO_RIGHT n = n * 2 + 3 +#define CHECK_NO_MATCH if (tree[n] == 0) return pixel_val + + /* Top row */ + if (y == 0) { + /* top 3 pixels off edge == black == right + n = 2 * (2 * (2 * -1 + 3) + 3) + 3 = 13 */ + n = 13; + } else { + if (x == 0 || IS_BLACK(-1, -1)) + GO_RIGHT; + else + GO_LEFT; + + if (IS_WHITE(0, -1)) + GO_LEFT; + else + GO_RIGHT; + CHECK_NO_MATCH; + + if (x + 1 == p->x || IS_BLACK(+1, -1)) + GO_RIGHT; + else + GO_LEFT; + CHECK_NO_MATCH; + } + + /* Second row */ + if (x == 0 || IS_BLACK(-1, 0)) + GO_RIGHT; + else + GO_LEFT; + CHECK_NO_MATCH; + + if (IS_WHITE(0, 0)) + GO_LEFT; + else + GO_RIGHT; + CHECK_NO_MATCH; + + if (x + 1 == p->x || IS_BLACK(+1, 0)) + GO_RIGHT; + else + GO_LEFT; + CHECK_NO_MATCH; + + /* bottom row */ + if (y + 1 == p->y) { + /* bottom 3 pixels off edge == black == right + n' = 2 * (2 * (2n + 3) + 3) + 3 + = 2 * (4n + 9) + 3 + = 8n + 21 */ + n = 8 * n + 21; + } else { + if (x == 0 || IS_BLACK(-1, +1)) + GO_RIGHT; + else + GO_LEFT; + CHECK_NO_MATCH; + + if (IS_WHITE(0, 1)) + GO_LEFT; + else + GO_RIGHT; + CHECK_NO_MATCH; + + if (x + 1 == p->x || IS_BLACK(+1, +1)) + GO_RIGHT; + else + GO_LEFT; + } + assert(n < TREE_ARRAY_SIZE); + assert(tree[n] == 0 || tree[n] == 1 || tree[n] == 2); + CHECK_NO_MATCH; +#ifdef FILTER_STATISTICS + filter_matches++; +#endif + if (tree[n] == 1) { +#ifdef FILTER_STATISTICS + if (pixel_atp(p, x, y) < JOB->cfg.cs) + filter_whitened++; +#endif + return JOB->cfg.cs; + } else { +#ifdef FILTER_STATISTICS + if (pixel_atp(p, x, y) >= JOB->cfg.cs) + filter_blackened++; +#endif + return 0; + } +} +#endif /* FILTER_METHOD == FILTER_BY_TREE */ + +/* + * This simple filter attempts to correct "fax"-like scan errors. + */ +int pixel_faxfilter(pix *p, int x, int y) { + int r; // filter + r = pixel_atp(p,x,y)&~7; + /* {2,2,2, 2,0,1, 2,1,0} */ + if ((r&128) && (~pixel_atp(p,x+1, y )&128) + && (~pixel_atp(p, x ,y+1)&128) + && ( pixel_atp(p,x+1,y+1)&128)) + r = 64; /* faxfilter */ + + else + /* {2,2,2, 1,0,2, 0,1,2} */ + if ((r&128) && (~pixel_atp(p,x-1, y )&128) + && (~pixel_atp(p, x ,y+1)&128) + && ( pixel_atp(p,x-1,y+1)&128)) + r = 64; /* faxfilter */ + return r & ~7; +} + +#ifdef FILTER_CHECKED +/* + * Print out the 3x3 environment of a pixel as a 9-bit binary. + * + * For debugging purposes only. + */ +void print_pixel_env(FILE * out, pix * p, int x, int y) { + int x0, y0; + for (y0 = y - 1; y0 < y + 2; y0++) { + for (x0 = x - 1; x0 < x + 2; x0++) { + if (x0 < 0 || x0 >= p->x || y0 < 0 || y0 >= p->y) + fputc('?', out); + else if (pixel_atp(p, x0, y0) >> 7) + fputc('0', out); + else + fputc('1', out); + } + } +} +#endif + +/* this function is heavily used + * test if pixel was set, remove low bits (marks) --- later with error-correction + * result depends on n_run, if n_run>0 filter are used + * Returns: pixel-color (without marks) + */ +int getpixel(pix *p, int x, int y){ + if ( x < 0 || y < 0 || x >= p->x || y >= p->y ) + return 255 & ~7; + + /* filter will be used only once later, when vectorization replaces pixel + * processing + */ + if (JOB->tmp.n_run > 0) { /* use the filters (correction of errors) */ +#if FILTER_METHOD == FILTER_BY_NUMBER + int pix = pixel_filter_by_number(p, x, y); +#ifdef FILTER_CHECKED + int pix2 = pixel_filter_by_matrix(p, x, y); + if (pix != pix2) { + fprintf(stderr, + "# BUG: pixel_filter: by number: %d; by matrix: %d, " + "by atp %d; env: ", pix, pix2, pixel_atp(p, x, y) & ~7); + print_pixel_env(stderr, p, x, y); + fputc('\n', stderr); + } +#endif /* FILTER_CHECKED */ + return pix; +#elif FILTER_METHOD == FILTER_BY_MATRIX + return pixel_filter_by_matrix(p, x, y); +#elif FILTER_METHOD == FILTER_BY_TREE + int pix = pixel_filter_by_tree(p, x, y); +#ifdef FILTER_CHECKED + int pix2 = pixel_filter_by_matrix(p, x, y); + int pix3 = pixel_filter_by_number(p, x, y); + if (pix != pix2 || pix != pix3) { + fprintf(stderr, + "# BUG: pixel_filter: tree: %d; matrix: %d, " + "number: %d, atp %d; env: ", pix, pix2, pix3, + pixel_atp(p, x, y) & ~7); + print_pixel_env(stderr, p, x, y); + fputc('\n', stderr); + } +#endif /* FILTER_CHECKED */ + return pix; +#else +#error FILTER_METHOD not defined +#endif /* FILTER_BY_NUMBER */ + } + + return (pixel_atp(p,x,y) & ~7); +} + +/* modify pixel, test if out of range */ +void put(pix * p, int x, int y, int ia, int io) { + if (x < p->x && x >= 0 && y >= 0 && y < p->y) + pixel_atp(p, x, y) = (pixel_atp(p, x, y) & ia) | io; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h new file mode 100644 index 000000000..7d5bc8a1a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h @@ -0,0 +1,24 @@ +/* Handle PNM-files Dez98 JS + * 0,0 = left up + * PAM-formats + * PAM any P7 + * PNM-formats + * PGM gray ASCII=P2 RAW=P5 dx dy col gray + * PPM RGB ASCII=P3 RAW=P6 dx dy col RGB + * PBM B/W ASCII=P1 RAW=P4 dx dy bitmap + */ + +#ifndef GOCR_PNM_H +#define GOCR_PNM_H 1 + +#include "../../config.h" + +struct pixmap { + unsigned char *p; /* pointer of image buffer (pixmap) */ + int x; /* xsize */ + int y; /* ysize */ + int bpp; /* bytes per pixel: 1=gray 3=rgb */ + }; +typedef struct pixmap pix; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c new file mode 100644 index 000000000..14804ed8d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c @@ -0,0 +1,87 @@ +/* ---------------------------- progress output ---------------------- */ +#include +#include +#include "progress.h" + +FILE *fp=NULL; /* output stream for progress info */ +time_t printinterval = 10; /* approx. seconds between printouts, 1.. */ + +/* initialization of progress output, fname="","","-" */ +int ini_progress(char *fname){ + int fd; + if (fp) { fclose(fp); fp=NULL; } + if (fname) if (fname[0]) { + fd=atoi(fname); + if(fd>255 || fname[((fd>99)?3:((fd>9)?2:1))]) fd=-1; /* be sure */ + if (fname[0]=='-' && fname[1]==0) { fp=stdout; } +#ifdef __USE_POSIX + else if (fd>0) { fp=fdopen(fd,"w"); } /* not sure that "w" is ok ???? */ +#endif + else { fp=fopen(fname,"w");if(!fp)fp=fopen(fname,"a"); } + if (!fp) { + fprintf(stderr,"could not open %s for progress output\n",fname); + return -1; /* no success */ + } + } + /* fprintf(stderr,"# progress: fd=%d\n",fileno(fp)); */ + return 0; /* no error */ +} + +progress_counter_t *open_progress(int maxcount, const char *name){ + progress_counter_t *pc; + pc = (progress_counter_t*) malloc( sizeof(progress_counter_t) ); + if (!pc) return 0; /* nonfatal */ + pc->starttime = time(NULL); + pc->maxcount = maxcount; + pc->numskip = 0; + pc->lastprintcount = -1; + pc->name = name; + pc->lastprinttime = pc->starttime; + return pc; +} +/* free counter */ +int close_progress(progress_counter_t *counter){ + if (counter) free(counter); + return 0; +} +/* progress meter output + * only 1output/10s, + estimated endtime (test on pixelfields) + * ToDo: to stderr by default? remove subprogress, ini_progress? rm_progress? + * test on tcl + */ +int progress(int counter, progress_counter_t *pc){ + /* we try to save computing time, so we skip early */ + if ((!fp) || counter - pc->lastprintcount <= pc->numskip) return 0; + { + char cr='\n'; + time_t now = time(NULL); +#if 0 /* debugging */ + if (counter) + fprintf(fp," progress %s %3d / %d time %d skip %d\n", + pc->name,counter,pc->maxcount,(int)(now - pc->starttime), + pc->numskip); fflush(fp); +#endif + if (5*(now - pc->lastprinttime) < 2*printinterval + && counter - pc->lastprintcount >= pc->numskip) { /* save for tests */ + if (pc->numskip < 1024) pc->numskip += pc->numskip+1; + } + if (3*(now - pc->lastprinttime) < 2*printinterval ) { + return 0; /* to early for printing */ + } + if (2*(now - pc->lastprinttime) > 3*printinterval ) { + pc->numskip >>= 1; /* to late for printing */ + } + if (fileno(fp)<3) cr='\r'; /* may be choosen in ini? */ + if (counter) + fprintf(fp," progress %s %5d / %d time[s] %5d / %5d (skip=%d)%c", + pc->name,counter,pc->maxcount, + (int)(now - pc->starttime), /* time gone since start */ + (int)(now - pc->starttime)*pc->maxcount/(counter), /* estimated */ + pc->numskip, cr); + fflush(fp); + pc->lastprintcount=counter; + pc->lastprinttime=now; + } + return 0; /* no error */ +} +/* --------------------- end of progress output ---------------------- */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h new file mode 100644 index 000000000..d31e7a829 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h @@ -0,0 +1,42 @@ +/* + ---------------------- progress output ---------------------- + output progress for GUIs to a pipe + format: "counter_name" counter maxcounter time estimated_time \r|\n + */ +#ifndef GOCR_PROGRESS_H +#define GOCR_PROGRESS_H "Oct06" +#include + +/* initialization of progress output, fname="","","-" */ +int ini_progress(char *fname); + +/* ToDo: add by open_* and close_* */ +/* place to store values for progress calculation, called often, but + * dont call systime so often + */ +typedef struct progress_counter { + const char *name; /* name of counter */ + int lastprintcount; /* last counter printed for extrapolation */ + int maxcount; /* max counter */ + int numskip; /* num of counts to skip before timecall 0..maxcount */ + time_t starttime; /* start time of this counter */ + time_t lastprinttime; /* last time printed in seconds */ + +} progress_counter_t; + +/* progress output p1=main_progress_0..100% p2=sub_progress_0..100% */ +/* ToDo: improved_progress: counter, maxcount(ini), counter_name(ini), + * printinterval=10 # time before printing out progressmeter + * *numskip=1 # if (counter-lastprintcounter +#include +#include "pgm2asc.h" +#include "gocr.h" +#include "progress.h" + +/* measure mean thickness as an criteria for big chars */ +int mean_thickness( struct box *box2 ){ + int mt=0, i, y, dx=box2->x1-box2->x0+1, dy; + for (y=box2->y0+1; yy1; y++) { + i=loop(box2->p,box2->x0+0,y,dx,JOB->cfg.cs,0,RI); + i=loop(box2->p,box2->x0+i,y,dx,JOB->cfg.cs,1,RI); + mt+=i; + } + dy = box2->y1 - box2->y0 - 1; + if (dy) mt=(mt+dy/2)/dy; + return mt; +} + +/* ---- remove dust --------------------------------- + What is dust? I think, this is a very small pixel cluster without + neighbours. Of course not all dust clusters can be detected correct. + This feature should be possible to switch off via option. + -> may be, all clusters should be stored here? + speed is very slow, I know, but I am happy that it is working well +*/ +int remove_dust( job_t *job ){ + /* new dust removing */ + /* FIXME jb:remove pp */ + pix *pp = &job->src.p; + int i1,i,j,x,y,x0,x1,y0,y1,nC,sX,sY,sP, cs,vvv=job->cfg.verbose; + struct box *box2; +#define HISTSIZE 220 /* histogramm */ + int histo[HISTSIZE]; + cs=job->cfg.cs; sP=sX=sY=nC=0; + /* + * count number of black pixels within a box and store it in .dots + * later .dots is re-used for number of objects belonging to the character + * should be done in the flood-fill algorithm + * volume of white pixels is estimated to big here (left/right rot) + * ToDo: mean thickness of char lines? + * or interval nesting (minP..maxP) to remove outriders + */ + j=0; + for (i1=0;i1res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (!box2->num_frames) continue; + if (box2->frame_vol[0]<0) continue; /* don't count inner holes */ + j = abs(box2->frame_vol[0]); + if ((box2->y1-box2->y0+1)>3) { + nC++; /* only count potential chars v0.42 */ + sX+=box2->x1 - box2->x0 + 1; + sY+=box2->y1 - box2->y0 + 1; + sP+=j; + } + if (jres.boxlist)); + + if (job->cfg.dust_size < 0 && nC > 0) { /* auto detection */ + /* this formula is empirically, high resolution scans have bigger dust */ + /* maximum allowed dustsize (min=4*7 ca. 32) + * does not work for background pattern! + */ + job->cfg.dust_size = ( ( sX/nC ) * ( sY/nC ) + 16) / 32; + if (vvv) fprintf(stderr, "# dust size detection, vol num" + " #obj=%d maxDust=%d mpixel= %3d mxy= %2d %2d", + nC, job->cfg.dust_size, sP/nC, sX/nC, sY/nC); + /* we assume that for random dust applies histo[i+1]=nC) continue; /* v0.42 lot of pixels -> bg pattern < 3 */ + if (i>=job->cfg.dust_size) break; /* maximum = mean size / 32 */ + if (histo[i+1]==0) break; /* bad statistic */ + if ((histo[i+2]+histo[i+3]) + >=(histo[i] +histo[i+1])) break; /* no noise, but to late? */ + if ( histo[i-1] > 1024*histo[i] && + 2*histo[i+1] >=histo[i]) break; /* bg pattern */ + } + if (vvv) fprintf(stderr," break"); + if (vvv) for (i1=0,j=i+1;j20) break; /* dont do excessive output */ + } + } + job->cfg.dust_size=i-1; + /* what is the statistic of random dust? + * if we have p pixels on a x*y image we should have + * (p/(x*y))^1 * (x*y) = p singlets + * (p/(x*y))^2 * (x*y) = p^2/(x*y) doublets and + * (p/(x*y))^3 * (x*y) = p^3/(x*y)^2 triplets + */ + if (vvv) fprintf(stderr,"\n# auto dust size = %d nC= %3d .. %3d" + " avD= %2d %2d .. %2d %2d\n", + job->cfg.dust_size, nC, job->res.numC, + (job->res.sumX+job->res.numC/2)/job->res.numC, + (job->res.sumY+job->res.numC/2)/job->res.numC, sX/nC, sY/nC); + } + if (job->cfg.dust_size) + { i=0; + if(vvv){ + fprintf(stderr,"# remove dust of size %2d",job->cfg.dust_size); + /* Warning: better use (1/(x*y))^2 as 1/((x*y)^2), + * because (x*y)^2 may overflow */ + fprintf(stderr," histo=%d,%d(?=%d),%d(?=%d),...\n# ...", + histo[1],histo[2],histo[1]*histo[1]/(pp->x*pp->y), + histo[3], histo[1]*histo[1]/(pp->x*pp->y) + *histo[1]/(pp->x*pp->y)); + } + i = 0; + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + x0=box2->x0;x1=box2->x1;y0=box2->y0;y1=box2->y1; /* box */ + j=abs(box2->frame_vol[0]); + if(j<=job->cfg.dust_size) /* remove this tiny object */ + { /* here we should distinguish dust and i-dots, + * may be we should sort out dots to a seperate dot list and + * after line detection decide, which is dust and which not + * dust should be removed to make recognition easier (ToDo) + */ +#if 0 + if(get_bw((3*x0+x1)/4,(x0+3*x1)/4,y1+y1-y0+1,y1+8*(y1-y0+1),pp,cs,1)) + continue; /* this idea was to simple, see kscan003.jpg sample */ +#endif + /* remove from average */ + job->res.numC--; + job->res.sumX-=x1-x0+1; + job->res.sumY-=y1-y0+1; + /* remove pixels (should only be done with dust) */ + for(x=x0;x<=x1;x++) + for(y=y0;y<=y1;y++){ put(pp,x,y,0,255&~7); } + /* remove from list */ + list_del(&(job->res.boxlist),box2); + /* free memory */ + free_box(box2); + i++; /* count as dust particle */ + continue; + } + } end_for_each(&(job->res.boxlist)); + if(vvv)fprintf(stderr," %3d cluster removed, nC= %3d\n",i,job->res.numC); + } + /* reset dots to 0 and remove white pixels (new) */ + i=0; + for_each_data(&(job->res.boxlist)) { + box2 = ((struct box *)list_get_current(&(job->res.boxlist))); + if (box2->frame_vol[0]<0) continue; /* for black areas only */ + x0=box2->x0;x1=box2->x1;y0=box2->y0;y1=box2->y1; /* box */ + if (x1-x0>16 && y1-y0>30) /* only on large enough chars */ + for(x=x0+1;x<=x1-1;x++) + for(y=y0+1;y<=y1-1;y++){ + if( pixel_atp(pp,x ,y )>=cs + && pixel_atp(pp,x-1,y ) res.boxlist)); + if (vvv) fprintf(stderr,"# ... %3d white pixels removed, cs=%d nC= %3d\n", + i,cs,job->res.numC); + return 0; +} + +/* ---- smooth big chars --------------------------------- + * Big chars often do not have smooth borders, which let fail + * the engine. Here we smooth the borders of big chars (>7x16). + * Smoothing is important for b/w scans, where we often have + * comb like pattern on a vertikal border. I also received + * samples with lot of white pixels (sample: 04/02/25). + * ToDo: obsolete if vector code is complete + */ +int smooth_borders( job_t *job ){ + pix *pp = &job->src.p; + int ii=0,x,y,x0,x1,y0,y1,dx,dy,cs,i0,i1,i2,i3,i4,n1,n2, + cn[8],cm,vvv=job->cfg.verbose; /* dust found */ + struct box *box2; + cs=job->cfg.cs; n1=n2=0; + if(vvv){ fprintf(stderr,"# smooth big chars 7x16 cs=%d",cs); } + /* filter for each big box */ + for_each_data(&(job->res.boxlist)) { n2++; /* count boxes */ + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + /* do not touch small characters! but how we define small characters? */ + if (box2->x1-box2->x0+1<7 || box2->y1-box2->y0+1<16 ) continue; + if (box2->c==PICTURE) continue; + if (mean_thickness(box2)<3) continue; + n1++; /* count boxes matching big-char criteria */ + x0=box2->x0; y0=box2->y0; + x1=box2->x1; y1=box2->y1; + dx=x1-x0+1; dy=y1-y0-1; + /* out_x(box2); + * dont change to much! only change if absolutely sure! + * ....... 1 2 3 + * ex: .?##### 0 * 4 + * ....... 7 6 5 + * we should also avoid removing lines by sytematic remove + * from left end to the right, so we concern also about distance>1 + */ + for(x=box2->x0;x<=box2->x1;x++) + for(y=box2->y0;y<=box2->y1;y++){ /* filter out high frequencies */ + /* this is a very primitive solution, only for learning */ + cn[0]=getpixel(pp,x-1,y); + cn[4]=getpixel(pp,x+1,y); /* horizontal */ + cn[2]=getpixel(pp,x,y-1); + cn[6]=getpixel(pp,x,y+1); /* vertical */ + cn[1]=getpixel(pp,x-1,y-1); + cn[3]=getpixel(pp,x+1,y-1); /* diagonal */ + cn[7]=getpixel(pp,x-1,y+1); + cn[5]=getpixel(pp,x+1,y+1); + cm=getpixel(pp,x,y); + /* check for 5 other and 3 same surrounding pixels */ + for (i0=0;i0<8;i0++) + if ((cn[i0 ]=5 && i3>=3 && i4>=3) { /* change only on borders */ + ii++; /* white : black */ + put(pp,x,y,7,((cmx0,y-box2->y0,i0,i1,i2,i3,i3,cm,getpixel(pp,x,y),cs); +#endif + } + } +#if 0 /* debugging */ + out_x(box2); +#endif + } end_for_each(&(job->res.boxlist)); + if(vvv)fprintf(stderr," ... %3d changes in %d of %d\n",ii,n1,n2); + return 0; +} + +/* test if a corner of box1 is within box2 */ +int box_nested( struct box *box1, struct box *box2){ + /* box1 in box2, +1..-1 frame for pixel-patterns */ + if ( ( ( box1->x0>=box2->x0-1 && box1->x0<=box2->x1+1 ) + || ( box1->x1>=box2->x0-1 && box1->x1<=box2->x1+1 ) ) + && ( ( box1->y0>=box2->y0-1 && box1->y0<=box2->y1+1 ) + || ( box1->y1>=box2->y0-1 && box1->y1<=box2->y1+1 ) ) ) + return 1; + return 0; +} + +/* test if box1 is within box2 */ +int box_covered( struct box *box1, struct box *box2){ + /* box1 in box2, +1..-1 frame for pixel-patterns */ + if ( ( box1->x0>=box2->x0-1 && box1->x1<=box2->x1+1 ) + && ( box1->y0>=box2->y0-1 && box1->y1<=box2->y1+1 ) ) + return 1; + return 0; +} + +/* ---- remove pictures ------------------------------------------ + * may be, not deleting or moving to another list is much better! + * should be renamed to remove_pictures and border boxes + */ +int remove_pictures( job_t *job){ + struct box *box4,*box2; + int j=0, j2=0, num_del=0; + + if (job->cfg.verbose) + fprintf(stderr, "# "__FILE__" L%d: remove pictures\n# ...", + __LINE__); + + /* ToDo: output a list for picture handle scripts */ + j=0; j2=0; + if(job->cfg.verbose) + for_each_data(&(job->res.boxlist)) { + box4 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box4->c==PICTURE) j++; else j2++; + } end_for_each(&(job->res.boxlist)); + if (job->cfg.verbose) + fprintf(stderr," status: pictures= %d other= %d nC= %d\n# ...", + j, j2, job->res.numC); + + /* remove table frames */ + if (job->res.numC > 8) + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box2->c==PICTURE + && box2->x1-box2->x0+1>box2->p->x/2 /* big table? */ + && box2->y1-box2->y0+1>box2->p->y/2 ){ j=0; + /* count boxes nested with the picture */ + for_each_data(&(job->res.boxlist)) { + box4 = (struct box *)list_get_current(&(job->res.boxlist)); + if( box4 != box2 ) /* not count itself */ + if (box_nested(box4,box2)) j++; /* box4 in box2 */ + } end_for_each(&(job->res.boxlist)); + if( j>8 ){ /* remove box if more than 8 chars are within box */ + list_del(&(job->res.boxlist), box2); /* does not work proper ?! */ + free_box(box2); num_del++; + } + } + } end_for_each(&(job->res.boxlist)); + if (job->cfg.verbose) + fprintf(stderr, " deleted= %d pictures (table frames)\n# ...", + num_del); + num_del=0; + + /* remove dark-border-boxes (typical for hard copy of book site, + * or spam random border) */ + if (job->res.numC > 1) /* dont remove the only char */ + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if (box2->c!=PICTURE) continue; // ToDo: PICTUREs set already? + if ( box2->x1-box2->x0+1 > box2->p->x/2 + && box2->y1-box2->y0+1 > box2->p->y/2 ) continue; + j=0; + if (box2->x0==0) j++; + if (box2->y0==0) j++; /* on border? */ + if (box2->x1==box2->p->x-1) j++; + if (box2->y1==box2->p->y-1) j++; + if (j>2){ /* ToDo: check corner pixel */ + int cs=job->cfg.cs; + j=0; + if (getpixel(box2->p,box2->x0,box2->y0)p,box2->x1,box2->y0)p,box2->x0,box2->y1)p,box2->x1,box2->y1)2) { + list_del(&(job->res.boxlist), box2); + free_box(box2); num_del++; + } + } + } end_for_each(&(job->res.boxlist)); + if (job->cfg.verbose) + fprintf(stderr, " deleted= %d pictures (on border)\n# ...", + num_del); + num_del=0; + + j=0; j2=0; + if(job->cfg.verbose) + for_each_data(&(job->res.boxlist)) { + box4 = (struct box *)list_get_current(&(job->res.boxlist)); + if( box4->c==PICTURE ) j++; else j2++; + } end_for_each(&(job->res.boxlist)); + if (job->cfg.verbose) + fprintf(stderr," status: pictures= %d other= %d nC= %d\n# ...", + j, j2, job->res.numC); + + for(j=1;j;){ j=0; /* this is only because list_del does not work */ + /* can be slow on gray images */ + for_each_data(&(job->res.boxlist)) { + box2 = (struct box *)list_get_current(&(job->res.boxlist)); + if( box2->c==PICTURE && box2->num_ac==0) + for(j=1;j;){ /* let it grow to max before leave */ + j=0; box4=NULL; + /* find boxes nested with the picture and remove */ + /* its for pictures build by compounds */ + for_each_data(&(job->res.boxlist)) { + box4 = (struct box *)list_get_current(&(job->res.boxlist)); + if( box4!=box2 /* not destroy self */ + && (box4->num_ac==0) /* dont remove barcodes etc. */ + && (/* box4->c==UNKNOWN || */ + box4->c==PICTURE) ) /* dont remove valid chars */ + if( + /* box4 in box2, +1..-1 frame for pixel-patterns */ + box_nested(box4,box2) + /* or box2 in box4 */ + || box_nested(box2,box4) /* same? */ + ) + if ( box4->x1-box4->x0+1>2*job->res.avX + || box4->x1-box4->x0+1res.avX/2 + || box4->y1-box4->y0+1>2*job->res.avY + || box4->y1-box4->y0+1res.avY/2 + || box_covered(box4,box2) ) /* box4 completely within box2 */ + /* dont remove chars! see rotate45.fig */ + { + /* do not remove boxes in inner loop (bug?) ToDo: check why! */ + /* instead we leave inner loop and mark box4 as valid */ + if( box4->x0x0 ) box2->x0=box4->x0; + if( box4->x1>box2->x1 ) box2->x1=box4->x1; + if( box4->y0y0 ) box2->y0=box4->y0; + if( box4->y1>box2->y1 ) box2->y1=box4->y1; + j=1; /* mark box4 as valid */ + break; /* and leave inner loop */ + } + } end_for_each(&(job->res.boxlist)); + if (j!=0 && box4!=NULL) { /* check for valid box4 */ + /* ToDo: melt */ + list_del(&(job->res.boxlist), box4); /* does not work proper ?! */ + free_box(box4); /* break; ToDo: necessary to leave after del??? */ + num_del++; + } + + } + } end_for_each(&(job->res.boxlist)); + } + + if (job->cfg.verbose) + fprintf(stderr, " deleted= %d nested pictures\n# ...", num_del); + + /* output a list for picture handle scripts */ + j=0; j2=0; + if(job->cfg.verbose) + for_each_data(&(job->res.boxlist)) { + box4 = (struct box *)list_get_current(&(job->res.boxlist)); + if( box4->c==PICTURE ) { + fprintf(stderr," found picture at %4d %4d size %4d %4d\n# ...", + box4->x0, box4->y0, box4->x1-box4->x0+1, box4->y1-box4->y0+1 ); + j++; + } else j2++; + } end_for_each(&(job->res.boxlist)); + if (job->cfg.verbose) + fprintf(stderr," status: pictures= %d other= %d nC= %d\n", + j, j2, job->res.numC); + return 0; +} + + + + /* ---- remove melted serifs --------------------------------- v0.2.5 + >>v<< + ##########.######## <-y0 + ################### like X VW etc. + ...###.......###... <-y + ...###......###.... + j1 j2 j3 + - can generate new boxes if two characters were glued + */ +int remove_melted_serifs( pix *pp ){ + int x,y,j1,j2,j3,j4,i2,i3,i,ii,ni,cs,x0,x1,xa,xb,y0,y1,vvv=JOB->cfg.verbose; + struct box *box2, *box3; + progress_counter_t *pc = NULL; + + cs=JOB->cfg.cs; i=0; ii=0; ni=0; + for_each_data(&(JOB->res.boxlist)) { + ni++; + } end_for_each(&(JOB->res.boxlist)); + pc = open_progress(ni,"remove_melted_serifs"); + ni = 0; + + if(vvv){ fprintf(stderr,"# searching melted serifs ..."); } + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->c != UNKNOWN) continue; /* dont try on pictures */ + x0=box2->x0; x1=box2->x1; + y0=box2->y0; y1=box2->y1; /* box */ + /* upper serifs */ + for(j1=x0;j1+4x1+1) break; + y =loop(pp,j1,y0+1,x1-x0,cs,1,RI); if(y>x) x=y; if(j1+x>x1+1) break; + /* measure mean thickness of serif */ + for(j2=j3=j4=0,i2=j1;i2y1-y0) break; + i3+=loop(pp,j1,y0+i3,y1-y0,cs,1,DO); if(8*i3>y1-y0) break; + if(8*i3j3)j3=i3; + j3 = j3 + loop(pp,j3,y ,x1-j3,cs,1,RI); + i3 = loop(pp,j3,y ,x1-j3,cs,0,RI); + if(i3<2 || j3>=j1+x){j1+=x;continue;} + j3 += i3/2; + + if(x>5) + { + i++; /* snip! */ + for(y=0;y<(y1-y0+1+4)/8;y++)put(pp,j2,y0+y,255,128+64); /* clear highest bit */ + if(vvv&4){ + fprintf(stderr,"\n"); + //out_x(box2); + fprintf(stderr,"# melted serifs corrected on %d %d j1=%d j3=%d", + j2-x0, y, j1-x0, j3-x0); + } + for(xb=0,xa=0;xa<(x1-x0+4)/8;xa++){ /* detect vertical gap */ + i3=y1; + if(box2->m3>y0 && 2*y1>box2->m3+box2->m4) i3=box2->m3; /* some IJ */ + if( loop(pp,j2-xa,i3,i3-y0,cs,0,UP) > (y1-y0+1)/2 + && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,LE) >=xa ){ xb=-xa; break; } + if( loop(pp,j2+xa,i3,i3-y0,cs,0,UP) > (y1-y0+1)/2 + && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,RI) >=xa ){ xb= xa; break; } + } + if( get_bw(j2 ,j2 ,y0,(y0+y1)/2,pp,cs,1) == 0 + && get_bw(j2+xb,j2+xb,(y0+y1)/2,i3,pp,cs,1) == 0 ) + { /* divide */ + box3=malloc_box(box2); + box3->x1=j2-1; + box2->x0=j2+1; x1=box2->x1; + cut_box(box2); /* cut vectors outside the box */ + cut_box(box3); + box3->num=JOB->res.numC; + list_ins(&(JOB->res.boxlist),box2,box3); JOB->res.numC++; ii++; /* insert box3 before box2 */ + if(vvv&4) fprintf(stderr," => splitted"); + j1=x0=box2->x0; x=0; /* hopefully ok, UVW */ + } + } + j1+=x; + } + /* same on lower serifs -- change this later to better function + // #### ### + // #### v ### # <-y + // #################### <-y1 + // j1 j2 j3 + */ + for(j1=x0;j1x1+1) break; + y =loop(pp,j1,y1-1,x1-x0,cs,1,RI); if(y>x) x=y; if(j1+x>x1+1) break; + /* measure mean thickness of serif */ + for(j2=j3=j4=0,i2=j1;i2y1-y0) break; + i3+=loop(pp,j1,y1-i3,y1-y0,cs,1,UP); if(8*i3>y1-y0) break; + if(8*i3j3)j3=i3; + j3 = j3 + loop(pp,j3,y ,x1-j3,cs,1,RI); + i3 = loop(pp,j3,y,x1-j3,cs,0,RI); + if(i3<2 || j3>=j1+x){j1+=x;continue;} + j3 += i3/2; + + /* y =y1-(y1-y0+1+4)/8; */ + if(x>5) + { + i++; /* snip! */ + for(i3=0;i3<(y1-y0+1+4)/8;i3++) + put(pp,j2,y1-i3,255,128+64); /* clear highest bit */ + if(vvv&4){ + fprintf(stderr,"\n"); + //out_x(box2); + fprintf(stderr,"# melted serifs corrected on %d %d j1=%d j3=%d",j2-x0,y-y0,j1-x0,j3-x0); + } + for(xb=0,xa=0;xa<(x1-x0+4)/8;xa++){ /* detect vertical gap */ + if( loop(pp,j2-xa,y0,y1-y0,cs,0,DO) > (y1-y0+1)/2 + && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,LE) >=xa ){ xb=-xa; break; } + if( loop(pp,j2+xa,y0,y1-y0,cs,0,DO) > (y1-y0+1)/2 + && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,RI) >=xa ){ xb= xa; break; } + } + if( get_bw(j2 ,j2 ,(y0+y1)/2,y1,pp,cs,1) == 0 + && get_bw(j2+xb,j2+xb,y0,(y0+y1)/2,pp,cs,1) == 0 ) + { /* divide */ + box3=malloc_box(box2); + box3->x1=j2-1; + box2->x0=j2; x1=box2->x1; + cut_box(box2); /* cut vectors outside the box */ + cut_box(box3); + box3->num=JOB->res.numC; + list_ins(&(JOB->res.boxlist),box2,box3); JOB->res.numC++; ii++; + /* box3,box2 in correct order??? */ + if(vvv&4) fprintf(stderr," => splitted"); + j1=x0=box2->x0; x=0; /* hopefully ok, NMK */ + } + } + j1+=x; + } + progress(ni++,pc); + } end_for_each(&(JOB->res.boxlist)); + close_progress(pc); + if(vvv)fprintf(stderr," %3d cluster corrected, %d new boxes\n",i,ii); + return 0; +} + +/* remove black borders often seen on bad scanned copies of books + - dust around the border + */ +int remove_rest_of_dust() { + int i1, i2, vvv = JOB->cfg.verbose, x0, x1, y0, y1, cnt=0; + struct box *box2, *box4; + progress_counter_t *pc = NULL; + + i1 = i2 = 0; /* counter for removed boxes */ + if (vvv) + fprintf(stderr, "# detect dust (avX,nC), ... "); + /* remove fragments from border */ + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (box2->c == UNKNOWN) { + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; /* box */ + /* box in char ??? */ + if ( 2 * JOB->res.numC * (y1 - y0 + 1) < 3 * JOB->res.sumY + && ( y1 < box2->p->y/4 || y0 > 3*box2->p->y/4 ) /* not single line */ + && JOB->res.numC > 1 /* do not remove everything */ + && ( box2->m4 == 0 ) ) /* remove this */ + { + JOB->res.numC--; /* ToDo: dont count tiny pixels */ + /* ToDo: res.sumX,Y must also be corrected */ + i1++; + list_del(&(JOB->res.boxlist), box2); + free_box(box2); + } + } + } end_for_each(&(JOB->res.boxlist)); + + pc = open_progress(JOB->res.boxlist.n,"remove_dust2"); + for_each_data(&(JOB->res.boxlist)) { + box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); + progress(cnt++,pc); + if (box2->c == PICTURE) continue; + x0 = box2->x0; x1 = box2->x1; + y0 = box2->y0; y1 = box2->y1; /* box */ + /* remove tiny box2 if to far away from bigger boxes */ + /* ToDo: remove clouds of tiny pixels (count near small, compare with num bigger) */ + /* 0.42: remove far away pixel? ToDo: do it at earlier? */ + if (x1-x0+1<3 && y1-y0+1<3){ + int xn, yn, xs, ys; + int found=0; /* nearest bigger box */ + /* search near bigger box */ + for_each_data(&(JOB->res.boxlist)) { + box4 = (struct box *)list_get_current(&(JOB->res.boxlist)); + if (found || box4 == box2) continue; + if (box4->x1-box4->x0+1<3 && box4->y1-box4->y0+1<3) continue; + xs = box4->x1-box4->x0+1; + ys = box4->y1-box4->y0+1; + xn = abs((box4->x0+box4->x1)/2 - box2->x0); + yn = abs((box4->y0+box4->y1)/2 - box2->y0); + if (2*xn < 3*xs && 2*yn < 3*ys) { found=1; } + } end_for_each(&(JOB->res.boxlist)); + if (!found) { /* found nothing, box2 to far from big boxes */ + i2++; + list_del(&(JOB->res.boxlist), box2); + free_box(box2); + } + } + } end_for_each(&(JOB->res.boxlist)); + close_progress(pc); + if (vvv) + fprintf(stderr, " %3d + %3d boxes deleted, nC= %d ?\n", + i1, i2, JOB->res.numC); + + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c new file mode 100644 index 000000000..d8ed70367 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c @@ -0,0 +1,1314 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + */ + +#include "unicode.h" +#include + +/* FIXME jb global */ +int warn=0; /* if 1 a message is generated if composition is not defined */ + +/* Arguments: the character (main), and the modifier (accent, etc). See the + function if you want to know the modifiers. + Description: This function intends to be a small helper, to avoid having + to write switches in functions. It's therefore mainly to accents, and + specially for the most usual ones. It supports the basic greek + characters too, which is actually not very helpful. + Returns: the unicode character corresponding to the composed character. + + ToDo: + - It seems to me, that tables should be more effectiv. + So we should use tables in future? (js) + */ +wchar_t compose(wchar_t main, wchar_t modifier) { +/* supported by now: part of ISO8859-1, basic greek characters */ + if( main == UNKNOWN || main == PICTURE ) return main; +#ifdef DEBUG + if(modifier!=UNICODE_NULL && modifier!=SPACE) + printf(" compose(%c,%d)",(char)main,(int)modifier); +#endif + if(main>127 && modifier!=0 && modifier!=SPACE && warn) + fprintf(stderr,"# Warning compose %04x + %04x>127\n", + (int)modifier,(int)main); + switch (modifier) { + case UNICODE_NULL: + case SPACE: + return (wchar_t)main; + + case APOSTROPHE: /* do NOT USE this. It's here for compatibility only. + Use ACUTE_ACCENT instead. */ + fprintf( stderr, "COMPOSE: got APOSTROPHE instead of ACUTE_ACCENT"); + + case ACUTE_ACCENT: /* acute/cedilla */ + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_ACUTE; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_ACUTE; + case LATIN_SMALL_LETTER_AE: return LATIN_SMALL_LETTER_AE_WITH_ACUTE; + case LATIN_CAPITAL_LETTER_AE: return LATIN_CAPITAL_LETTER_AE_WITH_ACUTE; + case 'c': return LATIN_SMALL_LETTER_C_WITH_ACUTE; + case 'C': return LATIN_CAPITAL_LETTER_C_WITH_ACUTE; + case 'e': return LATIN_SMALL_LETTER_E_WITH_ACUTE; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_ACUTE; + case 'g': return LATIN_SMALL_LETTER_G_WITH_ACUTE; + case 'G': return LATIN_CAPITAL_LETTER_G_WITH_ACUTE; + case 'i': return LATIN_SMALL_LETTER_I_WITH_ACUTE; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_ACUTE; + case 'l': return LATIN_SMALL_LETTER_L_WITH_ACUTE; + case 'L': return LATIN_CAPITAL_LETTER_L_WITH_ACUTE; + case 'n': return LATIN_SMALL_LETTER_N_WITH_ACUTE; + case 'N': return LATIN_CAPITAL_LETTER_N_WITH_ACUTE; + case 'o': return LATIN_SMALL_LETTER_O_WITH_ACUTE; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_ACUTE; + case '0': return LATIN_CAPITAL_LETTER_O_WITH_ACUTE; + case 'r': return LATIN_SMALL_LETTER_R_WITH_ACUTE; + case 'R': return LATIN_CAPITAL_LETTER_R_WITH_ACUTE; + case 's': return LATIN_SMALL_LETTER_S_WITH_ACUTE; + case 'S': return LATIN_CAPITAL_LETTER_S_WITH_ACUTE; + case 'u': return LATIN_SMALL_LETTER_U_WITH_ACUTE; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_ACUTE; + case 'y': return LATIN_SMALL_LETTER_Y_WITH_ACUTE; + case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_ACUTE; + case 'z': return LATIN_SMALL_LETTER_Z_WITH_ACUTE; + case 'Z': return LATIN_CAPITAL_LETTER_Z_WITH_ACUTE; + default: + if(warn)fprintf( stderr, " COMPOSE: ACUTE_ACCENT+%04x not defined\n",(int)main); + } + break; + + case BREVE: /* caron (latin2) "u"-above-... (small bow) */ + switch (main) { + /* FIXME write separate heuristics for breve */ + case 'a': return LATIN_SMALL_LETTER_A_WITH_BREVE; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_BREVE; + case 'e': return LATIN_SMALL_LETTER_E_WITH_BREVE; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_BREVE; + case 'g': return LATIN_SMALL_LETTER_G_WITH_BREVE; + case 'G': return LATIN_CAPITAL_LETTER_G_WITH_BREVE; + case 'i': return LATIN_SMALL_LETTER_I_WITH_BREVE; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_BREVE; + case 'o': return LATIN_SMALL_LETTER_O_WITH_BREVE; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_BREVE; + case 'u': return LATIN_SMALL_LETTER_U_WITH_BREVE; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_BREVE; + default: + if(warn)fprintf( stderr, " COMPOSE: BREVE+%04x not defined\n",(int)main); + } + break; + + case CARON: /* caron (latin2) "v"-above-... */ + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_CARON; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_CARON; + case 'c': return LATIN_SMALL_LETTER_C_WITH_CARON; + case 'C': return LATIN_CAPITAL_LETTER_C_WITH_CARON; + case 'e': return LATIN_SMALL_LETTER_E_WITH_CARON; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_CARON; + case 'i': return LATIN_SMALL_LETTER_I_WITH_CARON; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_CARON; + case 'o': return LATIN_SMALL_LETTER_O_WITH_CARON; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_CARON; + case '0': return LATIN_CAPITAL_LETTER_O_WITH_CARON; + case 's': return LATIN_SMALL_LETTER_S_WITH_CARON; + case 'S': return LATIN_CAPITAL_LETTER_S_WITH_CARON; + case 'u': return LATIN_SMALL_LETTER_U_WITH_CARON; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_CARON; + case 'z': return LATIN_SMALL_LETTER_Z_WITH_CARON; + case 'Z': return LATIN_CAPITAL_LETTER_Z_WITH_CARON; + default: + if(warn)fprintf( stderr, " COMPOSE: CARON+%04x not defined\n",(int)main); + } + break; + + case CEDILLA: + switch (main) { + case 'c': return LATIN_SMALL_LETTER_C_WITH_CEDILLA; + case 'C': return LATIN_CAPITAL_LETTER_C_WITH_CEDILLA; + default: + if(warn)fprintf( stderr, " COMPOSE: CEDILLA+%04x not defined\n",(int)main); + } + break; + + case TILDE: + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_TILDE; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_TILDE; + case 'i': return LATIN_SMALL_LETTER_I_WITH_TILDE; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_TILDE; + case 'n': return LATIN_SMALL_LETTER_N_WITH_TILDE; + case 'N': return LATIN_CAPITAL_LETTER_N_WITH_TILDE; + case 'o': return LATIN_SMALL_LETTER_O_WITH_TILDE; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_TILDE; + case '0': return LATIN_CAPITAL_LETTER_O_WITH_TILDE; + case 'u': return LATIN_SMALL_LETTER_U_WITH_TILDE; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_TILDE; + default: + if(warn)fprintf( stderr, " COMPOSE: TILDE+%04x not defined\n",(int)main); + } + break; + + case GRAVE_ACCENT: + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_GRAVE; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_GRAVE; + case 'e': return LATIN_SMALL_LETTER_E_WITH_GRAVE; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_GRAVE; + case 'i': return LATIN_SMALL_LETTER_I_WITH_GRAVE; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_GRAVE; + case 'n': return LATIN_SMALL_LETTER_N_WITH_GRAVE; + case 'N': return LATIN_CAPITAL_LETTER_N_WITH_GRAVE; + case 'o': return LATIN_SMALL_LETTER_O_WITH_GRAVE; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_GRAVE; + case '0': return LATIN_CAPITAL_LETTER_O_WITH_GRAVE; + case 'u': return LATIN_SMALL_LETTER_U_WITH_GRAVE; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_GRAVE; + default: + if(warn)fprintf( stderr, " COMPOSE: GRAVE_ACCENT+%04x not defined\n",(int)main); + } + break; + + case QUOTATION_MARK: /* do NOT USE this. It's here for compatibility only. + Use DIAERESIS instead. */ + fprintf( stderr, "COMPOSE: got APOSTROPHE instead of ACUTE_ACCENT"); + + case DIAERESIS: + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_DIAERESIS; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS; + case 'e': return LATIN_SMALL_LETTER_E_WITH_DIAERESIS; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS; + case 'i': return LATIN_SMALL_LETTER_I_WITH_DIAERESIS; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS; + case 'o': return LATIN_SMALL_LETTER_O_WITH_DIAERESIS; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS; + case '0': return LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS; + case 'u': return LATIN_SMALL_LETTER_U_WITH_DIAERESIS; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS; + case 'y': return LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; + case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS; + default: + if(warn)fprintf( stderr, " COMPOSE: DIAERESIS+%04x (%c) not defined\n",(int)main,(char)main); + } + break; + + case CIRCUMFLEX_ACCENT: /* ^ */ + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX; + case 'c': return LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX; + case 'C': return LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX; + case 'e': return LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX; + case 'g': return LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX; + case 'G': return LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX; + case 'h': return LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX; + case 'H': return LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX; + case 'i': return LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX; + case 'j': return LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX; + case 'J': return LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX; + case 'o': return LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX; + case '0': return LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX; + case 's': return LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX; + case 'S': return LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX; + case 'u': return LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX; + case 'w': return LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX; + case 'W': return LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX; + case 'y': return LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX; + case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX; + default: + if(warn)fprintf( stderr, " COMPOSE: CIRCUMFLEX_ACCENT+%04x not defined\n",(int)main); + } + break; + + case MACRON: /* a minus sign above the char (latin2) */ + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_MACRON; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_MACRON; + case 'e': return LATIN_SMALL_LETTER_E_WITH_MACRON; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_MACRON; + case 'i': return LATIN_SMALL_LETTER_I_WITH_MACRON; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_MACRON; + case 'o': return LATIN_SMALL_LETTER_O_WITH_MACRON; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_MACRON; + case 'u': return LATIN_SMALL_LETTER_U_WITH_MACRON; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_MACRON; + case 'y': return LATIN_SMALL_LETTER_Y_WITH_MACRON; + case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_MACRON; + case LATIN_SMALL_LETTER_AE: return LATIN_SMALL_LETTER_AE_WITH_MACRON; + case LATIN_CAPITAL_LETTER_AE: return LATIN_CAPITAL_LETTER_AE_WITH_MACRON; + case '=': return IDENTICAL_TO; + case '-': return '='; + case ' ': return MODIFIER_LETTER_MACRON; + default: + if(warn)fprintf( stderr, " COMPOSE: MACRON+%04x not defined\n",(int)main); + } + break; + + case DOT_ABOVE: /* latin2 */ + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE; + case 'c': return LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE; + case 'C': return LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE; + case 'e': return LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE; + case 'E': return LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE; + case 'g': return LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE; + case 'G': return LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE; + case 'l': return 'i'; /* correct wrong recognition */ + case 'i': return 'i'; + case LATIN_SMALL_LETTER_DOTLESS_I: return 'i'; + case 'I': return LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE; + case 'j': return 'j'; + case 'o': return LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE; + case 'O': return LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE; + case 'z': return LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE; + case 'Z': return LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE; + case ',': return ';'; + case '.': return ':'; + default: + if(warn)fprintf( stderr, " COMPOSE: DOT_ABOVE+%04x not defined\n",(int)main); + } + break; + + case RING_ABOVE: + switch (main) { + case 'a': return LATIN_SMALL_LETTER_A_WITH_RING_ABOVE; + case 'A': return LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE; + case 'u': return LATIN_SMALL_LETTER_U_WITH_RING_ABOVE; + case 'U': return LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE; + default: + if(warn)fprintf( stderr, " COMPOSE: RING_ABOVE+%04x not defined\n",(int)main); + } + break; + + case 'e': /* e ligatures: ae, oe. */ + case 'E': + switch (main) { + case 'a': return LATIN_SMALL_LETTER_AE; + case 'A': return LATIN_CAPITAL_LETTER_AE; + case 'o': return LATIN_SMALL_LIGATURE_OE; + case 'O': return LATIN_CAPITAL_LIGATURE_OE; + case '0': return LATIN_CAPITAL_LIGATURE_OE; + default: + if(warn)fprintf( stderr, " COMPOSE: %04x+e/E not defined\n",(int)main); + } + break; + + case 'g': /* greek */ + switch (main) { + /* missing 0x37A-0x390 */ + /* weird cases: Q -> theta (it resembles a little, doesn't it?) + V -> psi (what can I do?) */ + case 'A': return GREEK_CAPITAL_LETTER_ALPHA; + case 'B': return GREEK_CAPITAL_LETTER_BETA; + case 'G': return GREEK_CAPITAL_LETTER_GAMMA; + case 'D': return GREEK_CAPITAL_LETTER_DELTA; + case 'E': return GREEK_CAPITAL_LETTER_EPSILON; + case 'Z': return GREEK_CAPITAL_LETTER_ZETA; + case 'H': return GREEK_CAPITAL_LETTER_ETA; + case 'Q': return GREEK_CAPITAL_LETTER_THETA; + case 'I': return GREEK_CAPITAL_LETTER_IOTA; + case 'K': return GREEK_CAPITAL_LETTER_KAPPA; + case 'L': return GREEK_CAPITAL_LETTER_LAMDA; + case 'M': return GREEK_CAPITAL_LETTER_MU; + case 'N': return GREEK_CAPITAL_LETTER_NU; + case 'X': return GREEK_CAPITAL_LETTER_XI; + case 'O': return GREEK_CAPITAL_LETTER_OMICRON; + case 'P': return GREEK_CAPITAL_LETTER_PI; + case 'R': return GREEK_CAPITAL_LETTER_RHO; + case 'S': return GREEK_CAPITAL_LETTER_SIGMA; + case 'T': return GREEK_CAPITAL_LETTER_TAU; + case 'Y': return GREEK_CAPITAL_LETTER_UPSILON; + case 'F': return GREEK_CAPITAL_LETTER_PHI; + case 'C': return GREEK_CAPITAL_LETTER_CHI; + case 'V': return GREEK_CAPITAL_LETTER_PSI; + case 'W': return GREEK_CAPITAL_LETTER_OMEGA; +/* + case '': return GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA; + case '': return GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA; + case '': return GREEK_SMALL_LETTER_ALPHA_WITH_TONOS; + case '': return GREEK_SMALL_LETTER_EPSILON_WITH_TONOS; + case '': return GREEK_SMALL_LETTER_ETA_WITH_TONOS; + case '': return GREEK_SMALL_LETTER_IOTA_WITH_TONOS; + case '': return GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS; +*/ + case 'a': return GREEK_SMALL_LETTER_ALPHA; + case 'b': return GREEK_SMALL_LETTER_BETA; + case 'g': return GREEK_SMALL_LETTER_GAMMA; + case 'd': return GREEK_SMALL_LETTER_DELTA; + case 'e': return GREEK_SMALL_LETTER_EPSILON; + case 'z': return GREEK_SMALL_LETTER_ZETA; + case 'h': return GREEK_SMALL_LETTER_ETA; + case 'q': return GREEK_SMALL_LETTER_THETA; + case 'i': return GREEK_SMALL_LETTER_IOTA; + case 'k': return GREEK_SMALL_LETTER_KAPPA; + case 'l': return GREEK_SMALL_LETTER_LAMDA; + case 'm': return GREEK_SMALL_LETTER_MU; + case 'n': return GREEK_SMALL_LETTER_NU; + case 'x': return GREEK_SMALL_LETTER_XI; + case 'o': return GREEK_SMALL_LETTER_OMICRON; + case 'p': return GREEK_SMALL_LETTER_PI; + case 'r': return GREEK_SMALL_LETTER_RHO; + case '&': return GREEK_SMALL_LETTER_FINAL_SIGMA; + case 's': return GREEK_SMALL_LETTER_SIGMA; + case 't': return GREEK_SMALL_LETTER_TAU; + case 'y': return GREEK_SMALL_LETTER_UPSILON; + case 'f': return GREEK_SMALL_LETTER_PHI; + case 'c': return GREEK_SMALL_LETTER_CHI; + case 'v': return GREEK_SMALL_LETTER_PSI; + case 'w': return GREEK_SMALL_LETTER_OMEGA; +/* + case '': return GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA; + case '': return GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA; + case '': return GREEK_SMALL_LETTER_OMICRON_WITH_TONOS; + case '': return GREEK_SMALL_LETTER_UPSILON_WITH_TONOS; + case '': return GREEK_SMALL_LETTER_OMEGA_WITH_TONOS; + case '': return GREEK_BETA_SYMBOL; + case '': return GREEK_THETA_SYMBOL; + case '': return GREEK_UPSILON_WITH_HOOK_SYMBOL; + case '': return GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL; + case '': return GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL; + case '': return GREEK_PHI_SYMBOL; + case '': return GREEK_PI_SYMBOL; +*/ + default: + if(warn)fprintf( stderr, " COMPOSE: GREEK %04x not defined\n",(int)main); + } + break; + + default: + fprintf( stderr, " COMPOSE: modifier %04x not defined\n",(int)modifier); + } + return (wchar_t)main; +} + +#define UNDEFINED "~" + +/* Arguments: character in Unicode format, type of format to convert to. + Returns: a string containing the Unicode character converted to the chosen + format. This string is statically allocated and should not be freed. + ToDo: better using tables? + */ +const char *decode(wchar_t c, FORMAT type) { + /* static char d; --- js: big bug (missing \0) if &d returned */ + /*FIXME jb static*/ static char bbuf[8*32]; /* space for 8 buffers, rotating */ + /*FIXME jb static*/ static char *buf=bbuf; /* used for UTF8 sequences and undefined codes */ + buf+=32; if(buf>=bbuf+8*32) buf=bbuf; + buf[0]=buf[1]=buf[2]=0; + switch (type) { + case ISO8859_1: + if ( c <= 0xFF ) { /* UNICODE == ISO8859-1 */ + buf[0] = (char)c; + return buf; + } + switch (c) { /* not found in list, but perhaps we can describe it */ + /* todo: add greek. GREEK_SMALL_LETTER_ALPHA = alpha */ + + /* general puctuation */ + case HYPHEN: + return (const char *)"-"; + case FIGURE_DASH: + case EN_DASH: + return (const char *)"--"; + case EM_DASH: + return (const char *)"---"; + case LEFT_SINGLE_QUOTATION_MARK: + return (const char *)"`"; + case RIGHT_SINGLE_QUOTATION_MARK: + return (const char *)"'"; + case SINGLE_LOW_9_QUOTATION_MARK: + return (const char *)","; + case SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: + return (const char *)UNDEFINED; + case LEFT_DOUBLE_QUOTATION_MARK: + return (const char *)"``"; + case RIGHT_DOUBLE_QUOTATION_MARK: + return (const char *)"''"; + case DOUBLE_LOW_9_QUOTATION_MARK: + return (const char *)",,"; + case DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: + return (const char *)UNDEFINED; + case DAGGER: + return (const char *)"+"; + case DOUBLE_DAGGER: + return (const char *)"*"; + case BULLET: + return (const char *)"*"; + case TRIANGULAR_BULLET: + return (const char *)"*"; + case HYPHENATION_POINT: + return (const char *)"-"; + case HORIZONTAL_ELLIPSIS: + return (const char *)"..."; + case PER_MILLE_SIGN: + return (const char *)"%%"; /* awk! */ + case SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK: + return (const char *)"<"; + case SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK: + return (const char *)">"; + case EURO_CURRENCY_SIGN: + return (const char *)"EUR"; /* change it! */ + + /* ligatures */ + case LATIN_SMALL_LIGATURE_FF: + return (const char *)"ff"; + case LATIN_SMALL_LIGATURE_FI: + return (const char *)"fi"; + case LATIN_SMALL_LIGATURE_FL: + return (const char *)"fl"; + case LATIN_SMALL_LIGATURE_FFI: + return (const char *)"ffi"; + case LATIN_SMALL_LIGATURE_FFL: + return (const char *)"ffl"; + case LATIN_SMALL_LIGATURE_LONG_S_T: + case LATIN_SMALL_LIGATURE_ST: + return (const char *)"st"; + + /* extra */ + case UNKNOWN: + return (const char *)"_"; + case PICTURE: + return (const char *)"_"; /* Due to Mobile OCR */ + + default: + /* snprintf seems to be no standard, so I use insecure sprintf */ + sprintf(buf,"\\code(%04x)",(unsigned)c); + return buf; /* UNDEFINED; */ + } + break; + case TeX: + if ( c >= SPACE && c <= TILDE ) { /* ASCII */ + switch (c) { + case '$': + return (const char *)"\\$"; + case '&': + return (const char *)"\\&"; + case '%': + return (const char *)"\\%"; + case '#': + return (const char *)"\\#"; + case '_': + return (const char *)"\\_"; + case '{': + return (const char *)"\\{"; + case '}': + return (const char *)"\\}"; + case '\\': + return (const char *)"$\\backslash$"; + case '~': + return (const char *)"\\~{}"; + case '^': + return (const char *)"\\^{}"; + default: + buf[0] = (char)c; + return (const char *)buf; + } + } + switch (c) { + /* ISO8859_1 */ + case NO_BREAK_SPACE: + return (const char *)"~"; + case INVERTED_EXCLAMATION_MARK: + return (const char *)"!'"; + case CENT_SIGN: + return (const char *)"\\textcent"; /* \usepackage{textcomp} */ + case POUND_SIGN: + return (const char *)"\\pounds"; + case EURO_CURRENCY_SIGN: + return (const char *)"\\euro"; /* \usepackage{eurosans} */ + case CURRENCY_SIGN: + return (const char *)"\\textcurrency"; /* \usepackage{textcomp} */ + case YEN_SIGN: + return (const char *)"\\textyen"; /* \usepackage{textcomp} */ + case BROKEN_BAR: + return (const char *)"\\textbrokenbar"; /* \usepackage{textcomp} */ + case SECTION_SIGN: + return (const char *)"\\S"; + case DIAERESIS: + return (const char *)"\""; + case COPYRIGHT_SIGN: + return (const char *)"\\copyright"; + case FEMININE_ORDINAL_INDICATOR: + return (const char *)"$^{\\underbar{a}}$"; + case LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: + return (const char *)"\\flqq{}"; + case NOT_SIGN: + return (const char *)"$\\lnot$"; + case SOFT_HYPHEN: + return (const char *)"\\-"; + case REGISTERED_SIGN: + return (const char *)"\\textregistered";/* \usepackage{textcomp} */ + case MACRON: + return (const char *)"\\textasciimacron";/* \usepackage{textcomp} */ + case DEGREE_SIGN: + return (const char *)"$^{o}$"; + case PLUS_MINUS_SIGN: + return (const char *)"$\\pm$"; + case SUPERSCRIPT_TWO: + return (const char *)"$^{2}$"; + case SUPERSCRIPT_THREE: + return (const char *)"$^{3}$"; + case ACUTE_ACCENT: + return (const char *)"\\( \\prime \\)"; + case MICRO_SIGN: + return (const char *)"$\\mu$"; + case PILCROW_SIGN: + return (const char *)"\\P"; + case MIDDLE_DOT: + return (const char *)"$\\cdot$"; + case CEDILLA: + return (const char *)"\\,"; + case SUPERSCRIPT_ONE: + return (const char *)"$^{1}$"; + case MASCULINE_ORDINAL_INDICATOR: + return (const char *)"$^{\\underbar{o}}$"; + case RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: + return (const char *)"\\frqq{}"; + case VULGAR_FRACTION_ONE_QUARTER: /* these fractions are not good*/ + return (const char *)"\\( 1\\over 4 \\)"; + case VULGAR_FRACTION_ONE_HALF: + return (const char *)"\\( 1\\over 2 \\)"; + case VULGAR_FRACTION_THREE_QUARTERS: + return (const char *)"\\( 3\\over 4 \\)"; + case INVERTED_QUESTION_MARK: + return (const char *)"?'"; + case LATIN_CAPITAL_LETTER_A_WITH_GRAVE: + return (const char *)"\\`A"; + case LATIN_CAPITAL_LETTER_A_WITH_ACUTE: + return (const char *)"\\'A"; + case LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: + return (const char *)"\\^A"; + case LATIN_CAPITAL_LETTER_A_WITH_TILDE: + return (const char *)"\\~A"; + case LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS: + return (const char *)"\\\"A"; + case LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE: + return (const char *)"\\AA"; + case LATIN_CAPITAL_LETTER_AE: + return (const char *)"\\AE"; + case LATIN_CAPITAL_LETTER_C_WITH_CARON: + return (const char *)"\\v{C}"; + case LATIN_CAPITAL_LETTER_C_WITH_CEDILLA: + return (const char *)"\\C"; + case LATIN_CAPITAL_LETTER_E_WITH_GRAVE: + return (const char *)"\\`E"; + case LATIN_CAPITAL_LETTER_E_WITH_ACUTE: + return (const char *)"\\'E"; + case LATIN_CAPITAL_LETTER_E_WITH_CARON: + return (const char *)"\\v{E}"; + case LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: + return (const char *)"\\^E"; + case LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: + return (const char *)"\\\"E"; + case LATIN_CAPITAL_LETTER_I_WITH_GRAVE: + return (const char *)"\\`I"; + case LATIN_CAPITAL_LETTER_I_WITH_ACUTE: + return (const char *)"\\'I"; + case LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: + return (const char *)"\\^I"; + case LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: + return (const char *)"\\\"I"; + case LATIN_CAPITAL_LETTER_ETH: + return (const char *)UNDEFINED; + case LATIN_CAPITAL_LETTER_N_WITH_TILDE: + return (const char *)"\\~N"; + case LATIN_CAPITAL_LETTER_O_WITH_GRAVE: + return (const char *)"\\`O"; + case LATIN_CAPITAL_LETTER_O_WITH_ACUTE: + return (const char *)"\\'O"; + case LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: + return (const char *)"\\^O"; + case LATIN_CAPITAL_LETTER_O_WITH_TILDE: + return (const char *)"\\~O"; + case LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS: + return (const char *)"\\\"O"; + case MULTIPLICATION_SIGN: + return (const char *)"$\\times$"; + case LATIN_CAPITAL_LETTER_O_WITH_STROKE: + return (const char *)"\\O"; + case LATIN_CAPITAL_LETTER_S_WITH_CARON: + return (const char *)"\\v{S}"; + case LATIN_CAPITAL_LETTER_U_WITH_GRAVE: + return (const char *)"\\`U"; + case LATIN_CAPITAL_LETTER_U_WITH_ACUTE: + return (const char *)"\\'U"; + case LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: + return (const char *)"\\^U"; + case LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS: + return (const char *)"\\\"U"; + case LATIN_CAPITAL_LETTER_Y_WITH_ACUTE: + return (const char *)"\\'Y"; + case LATIN_CAPITAL_LETTER_Z_WITH_CARON: + return (const char *)"\\v{Z}"; + case LATIN_CAPITAL_LETTER_THORN: + return (const char *)UNDEFINED; + case LATIN_SMALL_LETTER_SHARP_S: + return (const char *)"\\ss"; + case LATIN_SMALL_LETTER_A_WITH_GRAVE: + return (const char *)"\\`a"; + case LATIN_SMALL_LETTER_A_WITH_ACUTE: + return (const char *)"\\'a"; + case LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX: + return (const char *)"\\^a"; + case LATIN_SMALL_LETTER_A_WITH_TILDE: + return (const char *)"\\~a"; + case LATIN_SMALL_LETTER_A_WITH_DIAERESIS: + return (const char *)"\\\"a"; + case LATIN_SMALL_LETTER_A_WITH_RING_ABOVE: + return (const char *)"\\aa"; + case LATIN_SMALL_LETTER_AE: + return (const char *)"\\ae"; + case LATIN_SMALL_LETTER_C_WITH_CARON: + return (const char *)"\\v{c}"; + case LATIN_SMALL_LETTER_C_WITH_CEDILLA: + return (const char *)"\\c"; + case LATIN_SMALL_LETTER_E_WITH_GRAVE: + return (const char *)"\\`e"; + case LATIN_SMALL_LETTER_E_WITH_ACUTE: + return (const char *)"\\'e"; + case LATIN_SMALL_LETTER_E_WITH_CARON: + return (const char *)"\\v{e}"; + case LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX: + return (const char *)"\\^e"; + case LATIN_SMALL_LETTER_E_WITH_DIAERESIS: + return (const char *)"\\\"e"; + case LATIN_SMALL_LETTER_I_WITH_GRAVE: + return (const char *)"\\`i"; + case LATIN_SMALL_LETTER_I_WITH_ACUTE: + return (const char *)"\\'i"; + case LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX: + return (const char *)"\\^i"; + case LATIN_SMALL_LETTER_I_WITH_DIAERESIS: + return (const char *)"\\\"i"; + case LATIN_SMALL_LETTER_ETH: + return (const char *)UNDEFINED; + case LATIN_SMALL_LETTER_N_WITH_TILDE: + return (const char *)"\\~n"; + case LATIN_SMALL_LETTER_O_WITH_GRAVE: + return (const char *)"\\`o"; + case LATIN_SMALL_LETTER_O_WITH_ACUTE: + return (const char *)"\\'o"; + case LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX: + return (const char *)"\\^o"; + case LATIN_SMALL_LETTER_O_WITH_TILDE: + return (const char *)"\\~o"; + case LATIN_SMALL_LETTER_O_WITH_DIAERESIS: + return (const char *)"\\\"o"; + case DIVISION_SIGN: + return (const char *)"$\\div$"; + case LATIN_SMALL_LETTER_O_WITH_STROKE: + return (const char *)"\\o"; + case LATIN_SMALL_LETTER_S_WITH_CARON: + return (const char *)"\\v{s}"; + case LATIN_SMALL_LETTER_U_WITH_GRAVE: + return (const char *)"\\`u"; + case LATIN_SMALL_LETTER_U_WITH_ACUTE: + return (const char *)"\\'u"; + case LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX: + return (const char *)"\\^u"; + case LATIN_SMALL_LETTER_U_WITH_DIAERESIS: + return (const char *)"\\\"u"; + case LATIN_SMALL_LETTER_Y_WITH_ACUTE: + return (const char *)"\\'y"; + case LATIN_SMALL_LETTER_THORN: + return (const char *)UNDEFINED; + case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS: + return (const char *)"\\\"y"; + case LATIN_SMALL_LETTER_Z_WITH_CARON: + return (const char *)"\\v{z}"; + + /* greek */ + /* some (punctuation, accents, accented capital) greek letters missing*/ + case GREEK_CAPITAL_LETTER_ALPHA: + return (const char *)"A"; + case GREEK_CAPITAL_LETTER_BETA: + return (const char *)"B"; + case GREEK_CAPITAL_LETTER_GAMMA: + return (const char *)"\\( \\Gamma \\)"; + case GREEK_CAPITAL_LETTER_DELTA: + return (const char *)"\\( \\Delta \\)"; + case GREEK_CAPITAL_LETTER_EPSILON: + return (const char *)"E"; + case GREEK_CAPITAL_LETTER_ZETA: + return (const char *)"Z"; + case GREEK_CAPITAL_LETTER_ETA: + return (const char *)"H"; + case GREEK_CAPITAL_LETTER_THETA: + return (const char *)"\\( \\Theta \\)"; + case GREEK_CAPITAL_LETTER_IOTA: + return (const char *)"I"; + case GREEK_CAPITAL_LETTER_KAPPA: + return (const char *)"K"; + case GREEK_CAPITAL_LETTER_LAMDA: + return (const char *)"\\( \\Lambda \\)"; + case GREEK_CAPITAL_LETTER_MU: + return (const char *)"M"; + case GREEK_CAPITAL_LETTER_NU: + return (const char *)"N"; + case GREEK_CAPITAL_LETTER_XI: + return (const char *)"\\( \\Xi \\)"; + case GREEK_CAPITAL_LETTER_OMICRON: + return (const char *)"O"; + case GREEK_CAPITAL_LETTER_PI: + return (const char *)"\\( \\Pi \\)"; + case GREEK_CAPITAL_LETTER_RHO: + return (const char *)"P"; + case GREEK_CAPITAL_LETTER_SIGMA: + return (const char *)"\\( \\Sigma \\)"; + case GREEK_CAPITAL_LETTER_TAU: + return (const char *)"T"; + case GREEK_CAPITAL_LETTER_UPSILON: + return (const char *)"\\( \\Upsilon \\)"; + case GREEK_CAPITAL_LETTER_PHI: + return (const char *)"\\( \\Phi \\)"; + case GREEK_CAPITAL_LETTER_CHI: + return (const char *)"\\( \\Chi \\)"; + case GREEK_CAPITAL_LETTER_PSI: + return (const char *)"\\( \\Psi \\)"; + case GREEK_CAPITAL_LETTER_OMEGA: + return (const char *)"\\( \\Omega \\)"; + case GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA: + return (const char *)UNDEFINED; + case GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_ALPHA_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_EPSILON_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_ETA_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_IOTA_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_ALPHA: + return (const char *)"\\( \\alpha \\)"; + case GREEK_SMALL_LETTER_BETA: + return (const char *)"\\( \\beta \\)"; + case GREEK_SMALL_LETTER_GAMMA: + return (const char *)"\\( \\gamma \\)"; + case GREEK_SMALL_LETTER_DELTA: + return (const char *)"\\( \\delta \\)"; + case GREEK_SMALL_LETTER_EPSILON: + return (const char *)"\\( \\epsilon \\)"; + case GREEK_SMALL_LETTER_ZETA: + return (const char *)"\\( \\zeta \\)"; + case GREEK_SMALL_LETTER_ETA: + return (const char *)"\\( \\eta \\)"; + case GREEK_SMALL_LETTER_THETA: + return (const char *)"\\( \\theta \\)"; + case GREEK_SMALL_LETTER_IOTA: + return (const char *)"\\( \\iota \\)"; + case GREEK_SMALL_LETTER_KAPPA: + return (const char *)"\\( \\kappa \\)"; + case GREEK_SMALL_LETTER_LAMDA: + return (const char *)"\\( \\lambda \\)"; + case GREEK_SMALL_LETTER_MU: + return (const char *)"\\( \\mu \\)"; + case GREEK_SMALL_LETTER_NU: + return (const char *)"\\( \\nu \\)"; + case GREEK_SMALL_LETTER_XI: + return (const char *)"\\( \\xi \\)"; + case GREEK_SMALL_LETTER_OMICRON: + return (const char *)"\\( \\omicron \\)"; + case GREEK_SMALL_LETTER_PI: + return (const char *)"\\( \\pi \\)"; + case GREEK_SMALL_LETTER_RHO: + return (const char *)"\\( \\rho \\)"; + case GREEK_SMALL_LETTER_FINAL_SIGMA: + return (const char *)"\\( \\varsigma \\)"; + case GREEK_SMALL_LETTER_SIGMA: + return (const char *)"\\( \\sigma \\)"; + case GREEK_SMALL_LETTER_TAU: + return (const char *)"\\( \\tau \\)"; + case GREEK_SMALL_LETTER_UPSILON: + return (const char *)"\\( \\upsilon \\)"; + case GREEK_SMALL_LETTER_PHI: + return (const char *)"\\( \\varphi \\)"; + case GREEK_SMALL_LETTER_CHI: + return (const char *)"\\( \\chi \\)"; + case GREEK_SMALL_LETTER_PSI: + return (const char *)"\\( \\psi \\)"; + case GREEK_SMALL_LETTER_OMEGA: + return (const char *)"\\( \\omega \\)"; + case GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_OMICRON_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_UPSILON_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_SMALL_LETTER_OMEGA_WITH_TONOS: + return (const char *)UNDEFINED; + case GREEK_BETA_SYMBOL: + return (const char *)UNDEFINED; + case GREEK_THETA_SYMBOL: + return (const char *)"\\( \\vartheta \\)"; + case GREEK_UPSILON_WITH_HOOK_SYMBOL: + return (const char *)UNDEFINED; + case GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL: + return (const char *)UNDEFINED; + case GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL: + return (const char *)UNDEFINED; + case GREEK_PHI_SYMBOL: + return (const char *)"\\( \\phi \\)"; + case GREEK_PI_SYMBOL: + return (const char *)"\\( \\varpi \\)"; + /* and some greek letters missing*/ + + /* punctuation (partial) */ + case HYPHEN: + return (const char *)"-"; + case NON_BREAKING_HYPHEN: + return (const char *)UNDEFINED; + case FIGURE_DASH: + case EN_DASH: + return (const char *)"--"; + case EM_DASH: + return (const char *)"---"; + case HORIZONTAL_BAR: + return (const char *)UNDEFINED; + case LEFT_SINGLE_QUOTATION_MARK: + return (const char *)"`"; + case RIGHT_SINGLE_QUOTATION_MARK: + return (const char *)"'"; + case SINGLE_LOW_9_QUOTATION_MARK: + return (const char *)"\\glq{}"; + case SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: + return (const char *)UNDEFINED; + case LEFT_DOUBLE_QUOTATION_MARK: + return (const char *)"``"; + case RIGHT_DOUBLE_QUOTATION_MARK: + return (const char *)"''"; + case DOUBLE_LOW_9_QUOTATION_MARK: + return (const char *)"\\glqq{}"; + case DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: + return (const char *)UNDEFINED; + case DAGGER: + return (const char *)"\\dag"; + case DOUBLE_DAGGER: + return (const char *)"\\ddag"; + case BULLET: + return (const char *)"$\\bullet$"; + case TRIANGULAR_BULLET: + return (const char *)"$\\blacktriangleright"; + case HYPHENATION_POINT: + return (const char *)"\\-"; + case HORIZONTAL_ELLIPSIS: + return (const char *)"\\ldots"; + case PER_MILLE_SIGN: + return (const char *)UNDEFINED; + case SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK: + return (const char *)"\\flq{}"; + case SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK: + return (const char *)"\\frq{}"; + /* ligatures */ + case LATIN_SMALL_LIGATURE_FF: + return (const char *)"ff"; + case LATIN_SMALL_LIGATURE_FI: + return (const char *)"fi"; + case LATIN_SMALL_LIGATURE_FL: + return (const char *)"fl"; + case LATIN_SMALL_LIGATURE_FFI: + return (const char *)"ffi"; + case LATIN_SMALL_LIGATURE_FFL: + return (const char *)"ffl"; + case LATIN_SMALL_LIGATURE_LONG_S_T: + case LATIN_SMALL_LIGATURE_ST: + return (const char *)"st"; + /* reserved */ + case 0: + return (const char *)""; + case UNKNOWN: + return (const char *)"\\_"; + case PICTURE: + return (const char *)"(PICTURE)"; + default: + /* snprintf seems to be no standard, so I use insecure sprintf */ + sprintf(buf,"\\symbol{%u}",(unsigned)c); + return buf; /* UNDEFINED; */ + } + case HTML: + if ( c >= SPACE && c <= TILDE ) { /* ASCII */ + switch (c) { + case '&': + return (const char *)"&"; + /* semicolon must not be coded */ + case '\'': + return (const char *)"'"; + case '"': + return (const char *)"""; + case '<': + return (const char *)"<"; + case '>': + return (const char *)">"; + } + buf[0] = (char)c; + return buf; + } + switch (c) { + case PICTURE: + return (const char *)""; + case UNKNOWN: + return (const char *)"_"; /* better use colored symbol? */ + case LINE_FEED: + return (const char *)"
"; /* \n handled somwhere else? */ + case FORM_FEED: + case CARRIAGE_RETURN: + return (const char *)"
"; + case NO_BREAK_SPACE: + return (const char *)""; + case INVERTED_EXCLAMATION_MARK: + return (const char *)"¡"; + case CENT_SIGN: + return (const char *)"¢"; + case POUND_SIGN: + return (const char *)"£"; + case CURRENCY_SIGN: + return (const char *)"¤"; + case YEN_SIGN: + return (const char *)"¥"; + case BROKEN_BAR: + return (const char *)"¦"; + case SECTION_SIGN: + return (const char *)"§"; + case DIAERESIS: + return (const char *)"¨"; + case COPYRIGHT_SIGN: + return (const char *)"©"; + case FEMININE_ORDINAL_INDICATOR: + return (const char *)"ªem;"; + case LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: + return (const char *)"«"; + case NOT_SIGN: + return (const char *)"¬"; + case SOFT_HYPHEN: + return (const char *)"­"; + case REGISTERED_SIGN: + return (const char *)"®"; + case MACRON: + return (const char *)"¯"; + case DEGREE_SIGN: + return (const char *)"°"; + case PLUS_MINUS_SIGN: + return (const char *)"±"; + case SUPERSCRIPT_TWO: + return (const char *)"²"; + case SUPERSCRIPT_THREE: + return (const char *)"³"; + case ACUTE_ACCENT: + return (const char *)"´"; + case MICRO_SIGN: + return (const char *)"µ"; + case PILCROW_SIGN: + return (const char *)"¶"; + case MIDDLE_DOT: + return (const char *)"·"; + case CEDILLA: + return (const char *)"¸"; + case SUPERSCRIPT_ONE: + return (const char *)"¹"; + case MASCULINE_ORDINAL_INDICATOR: + return (const char *)"º"; + case RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: + return (const char *)"»"; + case VULGAR_FRACTION_ONE_QUARTER: + return (const char *)"¼"; + case VULGAR_FRACTION_ONE_HALF: + return (const char *)"½"; + case VULGAR_FRACTION_THREE_QUARTERS: + return (const char *)"¾"; + case INVERTED_QUESTION_MARK: + return (const char *)"¿"; + case LATIN_CAPITAL_LETTER_A_WITH_GRAVE: + return (const char *)"À"; + case LATIN_CAPITAL_LETTER_A_WITH_ACUTE: + return (const char *)"Á"; + case LATIN_CAPITAL_LETTER_A_WITH_BREVE: + return (const char *)"Ă"; + case LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: + return (const char *)"Â"; + case LATIN_CAPITAL_LETTER_A_WITH_TILDE: + return (const char *)"Ã"; + case LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS: + return (const char *)"Ä"; + case LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE: + return (const char *)"Å"; + case LATIN_CAPITAL_LETTER_AE: + return (const char *)"Æ"; + case LATIN_CAPITAL_LETTER_C_WITH_CARON: + return (const char *)"Č"; + case LATIN_CAPITAL_LETTER_C_WITH_CEDILLA: + return (const char *)"Ç"; + case LATIN_CAPITAL_LETTER_E_WITH_GRAVE: + return (const char *)"È"; + case LATIN_CAPITAL_LETTER_E_WITH_ACUTE: + return (const char *)"É"; + case LATIN_CAPITAL_LETTER_E_WITH_CARON: + return (const char *)"Ě"; + case LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: + return (const char *)"Ê"; + case LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: + return (const char *)"Ë"; + case LATIN_CAPITAL_LETTER_I_WITH_GRAVE: + return (const char *)"Ì"; + case LATIN_CAPITAL_LETTER_I_WITH_ACUTE: + return (const char *)"Í"; + case LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: + return (const char *)"Î"; + case LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: + return (const char *)"Ï"; + case LATIN_CAPITAL_LETTER_ETH: + return (const char *)"Ð"; + case LATIN_CAPITAL_LETTER_N_WITH_TILDE: + return (const char *)"Ñ"; + case LATIN_CAPITAL_LETTER_O_WITH_GRAVE: + return (const char *)"Ò"; + case LATIN_CAPITAL_LETTER_O_WITH_ACUTE: + return (const char *)"Ó"; + case LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: + return (const char *)"Ô"; + case LATIN_CAPITAL_LETTER_O_WITH_TILDE: + return (const char *)"Õ"; + case LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS: + return (const char *)"Ö"; + case MULTIPLICATION_SIGN: + return (const char *)"×"; + case LATIN_CAPITAL_LETTER_O_WITH_STROKE: + return (const char *)"Ø"; + case LATIN_CAPITAL_LETTER_S_WITH_CARON: + return (const char *)"Š"; + case LATIN_CAPITAL_LETTER_U_WITH_GRAVE: + return (const char *)"Ù"; + case LATIN_CAPITAL_LETTER_U_WITH_ACUTE: + return (const char *)"Ú"; + case LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: + return (const char *)"Û"; + case LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS: + return (const char *)"Ü"; + case LATIN_CAPITAL_LETTER_Y_WITH_ACUTE: + return (const char *)"Ý"; + case LATIN_CAPITAL_LETTER_Z_WITH_CARON: + return (const char *)"Ž"; + case LATIN_CAPITAL_LETTER_THORN: + return (const char *)"Þ"; + case LATIN_SMALL_LETTER_SHARP_S: + return (const char *)"ß"; + case LATIN_SMALL_LETTER_A_WITH_GRAVE: + return (const char *)"à"; + case LATIN_SMALL_LETTER_A_WITH_ACUTE: + return (const char *)"á"; + case LATIN_SMALL_LETTER_A_WITH_BREVE: + return (const char *)"ă"; + case LATIN_SMALL_LETTER_A_WITH_CARON: + return (const char *)"&acaron;"; + case LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX: + return (const char *)"â"; + case LATIN_SMALL_LETTER_A_WITH_TILDE: + return (const char *)"ã"; + case LATIN_SMALL_LETTER_A_WITH_DIAERESIS: + return (const char *)"ä"; + case LATIN_SMALL_LETTER_A_WITH_RING_ABOVE: + return (const char *)"å"; + case LATIN_SMALL_LETTER_AE: + return (const char *)"æ"; + case LATIN_SMALL_LETTER_C_WITH_CARON: + return (const char *)"č"; + case LATIN_SMALL_LETTER_C_WITH_CEDILLA: + return (const char *)"ç"; + case LATIN_SMALL_LETTER_E_WITH_GRAVE: + return (const char *)"è"; + case LATIN_SMALL_LETTER_E_WITH_ACUTE: + return (const char *)"é"; + case LATIN_SMALL_LETTER_E_WITH_CARON: + return (const char *)"ě"; + case LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX: + return (const char *)"ê"; + case LATIN_SMALL_LETTER_E_WITH_DIAERESIS: + return (const char *)"ë"; + case LATIN_SMALL_LETTER_I_WITH_GRAVE: + return (const char *)"ì"; + case LATIN_SMALL_LETTER_I_WITH_ACUTE: + return (const char *)"í"; + case LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX: + return (const char *)"î"; + case LATIN_SMALL_LETTER_I_WITH_DIAERESIS: + return (const char *)"ï"; + case LATIN_SMALL_LETTER_ETH: + return (const char *)"ð"; + case LATIN_SMALL_LETTER_N_WITH_TILDE: + return (const char *)"ñ"; + case LATIN_SMALL_LETTER_O_WITH_GRAVE: + return (const char *)"ò"; + case LATIN_SMALL_LETTER_O_WITH_ACUTE: + return (const char *)"ó"; + case LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX: + return (const char *)"ô"; + case LATIN_SMALL_LETTER_O_WITH_TILDE: + return (const char *)"õ"; + case LATIN_SMALL_LETTER_O_WITH_DIAERESIS: + return (const char *)"ö"; + case DIVISION_SIGN: + return (const char *)"÷"; + case LATIN_SMALL_LETTER_O_WITH_STROKE: + return (const char *)"ø"; + case LATIN_SMALL_LETTER_S_WITH_CARON: + return (const char *)"š"; + case LATIN_SMALL_LETTER_U_WITH_GRAVE: + return (const char *)"ù"; + case LATIN_SMALL_LETTER_U_WITH_ACUTE: + return (const char *)"ú"; + case LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX: + return (const char *)"û"; + case LATIN_SMALL_LETTER_U_WITH_DIAERESIS: + return (const char *)"ü"; + case LATIN_SMALL_LETTER_Y_WITH_ACUTE: + return (const char *)"ý"; + case LATIN_SMALL_LETTER_THORN: + return (const char *)"þ"; + case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS: + return (const char *)"ÿ"; + case LATIN_SMALL_LETTER_Z_WITH_CARON: + return (const char *)"ž"; + case EURO_CURRENCY_SIGN: + return (const char *)"€"; + case 0: + return (const char *)""; + default: + sprintf(buf,"&#%u;",(unsigned)c); + return buf; /* undefined */ + } + /* break; unreachable code */ + case XML: /* only 5 &xxx;-ENTITIES ar defined by default */ + if ( c >= SPACE && c <= TILDE ) { /* ASCII */ + switch (c) { + case '&': + return (const char *)"&"; + case '\'': + return (const char *)"'"; + case '"': + return (const char *)"""; + case '<': + return (const char *)"<"; + case '>': + return (const char *)">"; + } + buf[0] = (char)c; + return buf; + } + switch (c) { /* subject of change! */ + case PICTURE: + return (const char *)"(PICTURE)"; + case UNKNOWN: + return (const char *)"_"; /* better use colored symbol? */ + case LINE_FEED: /* \n handled somwhere else? */ + case FORM_FEED: + case CARRIAGE_RETURN: + return (const char *)"
"; + case NO_BREAK_SPACE: + return (const char *)"
"; + case 0: + return (const char *)""; + default: + sprintf(buf,"&#x%03x;",(unsigned)c); + return buf; /* undefined */ + } + /* break; unreachable code */ + case SGML: + switch (c) { + default: + sprintf(buf,"&#%u;",(unsigned)c); + return buf; /* UNDEFINED */ + } + /* break; unreachable code */ + case ASCII: /* mainly used for debugging */ + if ( c=='\n' || (c>= 0x20 && c <= 0x7F) ) { + buf[0] = (char)c; + return buf; + } + switch (c) { + /* extra */ + case UNKNOWN: + return (const char *)"(?)"; + case PICTURE: + return (const char *)"(?)"; + + default: + /* snprintf seems to be no standard, so I use insecure sprintf */ + if ((unsigned)c>255) sprintf(buf,"(0x%04x)",(unsigned)c); + else sprintf(buf,"(0x%02x)",(unsigned)c); + return buf; /* UNDEFINED; */ + } + /* break; unreachable code */ + default: /* use UTF8 as default, test with xterm -u8 */ + /* extra */ + if ( c == UNKNOWN ) return (const char *)"_"; + if ( c == PICTURE ) return (const char *)"_"; /* Due to Mobile OCR */ + if ( c <= (wchar_t)0x0000007F ) { /* UTF8 == 7bit ASCII */ + buf[0] = (char)c; + return buf; + } + if ( c <= (wchar_t)0x000007FF ) { /* UTF8 == 11bit */ + buf[0] = (char)(0xc0|((c>> 6) & 0x1f)); /* 110xxxxx */ + buf[1] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ + buf[2] = (char)0; /* terminate string */ + return buf; + } + /* wchar_t is 16bit for Borland-C !? Jan07 */ + if ( c <= (wchar_t)0x0000FFFF ) { /* UTF8 == 16bit */ + buf[0] = (char)(0xe0|((c>>12) & 0x0f)); /* 1110xxxx */ + buf[1] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ + buf[2] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ + buf[3] = (char)0; /* terminate string */ + return buf; + } + if ( c <= (wchar_t)0x001FFFFF ) { /* UTF8 == 21bit */ + buf[0] = (char)(0xf0|((c>>18) & 0x07)); /* 11110xxx */ + buf[1] = (char)(0x80|((c>>12) & 0x3f)); /* 10xxxxxx */ + buf[2] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ + buf[3] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ + buf[4] = (char)0; /* terminate string */ + return buf; + } + if ( c <= (wchar_t)0x03FFFFFF ) { /* UTF8 == 26bit */ + buf[0] = (char)(0xf8|((c>>24) & 0x03)); /* 111110xx */ + buf[1] = (char)(0x80|((c>>18) & 0x3f)); /* 10xxxxxx */ + buf[2] = (char)(0x80|((c>>12) & 0x3f)); /* 10xxxxxx */ + buf[3] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ + buf[4] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ + buf[5] = (char)0; /* terminate string */ + return buf; + } + if ( c <= (wchar_t)0x7FFFFFFF ) { /* UTF8 == 31bit */ + buf[0] = (char)(0xfc|((c>>30) & 0x01)); /* 1111110x */ + buf[1] = (char)(0x80|((c>>24) & 0x3f)); /* 10xxxxxx */ + buf[2] = (char)(0x80|((c>>18) & 0x3f)); /* 10xxxxxx */ + buf[3] = (char)(0x80|((c>>12) & 0x3f)); /* 10xxxxxx */ + buf[4] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ + buf[5] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ + buf[6] = (char)0; /* terminate string */ + return buf; + } + return (const char *)UNDEFINED; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h new file mode 100644 index 000000000..b85fd444f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h @@ -0,0 +1,1257 @@ +/* +This is a Optical-Character-Recognition program +Copyright (C) 2000-2007 Joerg Schulenburg + + The character codes in this file are Copyright (c) 1991-1999 Unicode, Inc. + All Rights reserved. + + This file is provided as-is by Unicode, Inc. (The Unicode Consortium). + No claims are made as to fitness for any particular purpose. No + warranties of any kind are expressed or implied. The recipient + agrees to determine applicability of information provided. If this + file has been provided on optical media by Unicode, Inc., the sole + remedy for any claim will be exchange of defective media within 90 + days of receipt. + + Unicode, Inc. hereby grants the right to freely use the information + supplied in this file in the creation of products supporting the + Unicode Standard, and to make copies of this file in any form for + internal or external distribution as long as this notice remains + attached. + +For the rest of the file, the following applies: + +This program is free software; you can redistribute it and/or +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. + + see README for EMAIL-address + */ + +/* + Only the codes judged necessary by the developers are present in this + file. It conforms with MES-1. You'll find also Greek characters, + mathematical symbols and some extra symbols. + + Use the following regular expression to help add new codes from the + Unicode data files: ([\w\s]*);([\w\s]*);[^\n]* +*/ + +#ifndef G_UNICODE_H +#define G_UNICODE_H + +#include + +enum format { + ISO8859_1, TeX, HTML, XML, SGML, UTF8, ASCII +}; +typedef enum format FORMAT; + +/* + * Prototypes + */ +wchar_t compose(wchar_t main, wchar_t modifier); +const char *decode(wchar_t c, FORMAT type); + +/* + * Unicode codes + */ + +/* E000-F8FF are for private use. We'll reserve E000-E0FF by now. */ +/* the next line isnt proper, but was the easiest way to fix a problem */ +#ifndef UNKNOWN +#define UNKNOWN 0xE000 +#endif +#define PICTURE 0xE001 +#define HEADER_FILE 0xE010 + +/* most codes 0x00-0x1F are not needed, but we provide them anyway. U0000 had + the name changed from NULL to UNICODE_NULL to avoid conflicts. */ +#define UNICODE_NULL 0x0000 +#define START_OF_HEADING 0x0001 +#define START_OF_TEXT 0x0002 +#define END_OF_TEXT 0x0003 +#define END_OF_TRANSMISSION 0x0004 +#define ENQUIRY 0x0005 +#define ACKNOWLEDGE 0x0006 +#define BELL 0x0007 +#define BACKSPACE 0x0008 +#define HORIZONTAL_TABULATION 0x0009 +#define LINE_FEED 0x000A +#define VERTICAL_TABULATION 0x000B +#define FORM_FEED 0x000C +#define CARRIAGE_RETURN 0x000D +#define SHIFT_OUT 0x000E +#define SHIFT_IN 0x000F +#define DATA_LINK_ESCAPE 0x0010 +#define DEVICE_CONTROL_ONE 0x0011 +#define DEVICE_CONTROL_TWO 0x0012 +#define DEVICE_CONTROL_THREE 0x0013 +#define DEVICE_CONTROL_FOUR 0x0014 +#define NEGATIVE_ACKNOWLEDGE 0x0015 +#define SYNCHRONOUS_IDLE 0x0016 +#define END_OF_TRANSMISSION_BLOCK 0x0017 +#define CANCEL 0x0018 +#define END_OF_MEDIUM 0x0019 +#define SUBSTITUTE 0x001A +#define ESCAPE 0x001B +#define FILE_SEPARATOR 0x001C +#define GROUP_SEPARATOR 0x001D +#define RECORD_SEPARATOR 0x001E +#define UNIT_SEPARATOR 0x001F + +/* ASCII */ +#define SPACE 0x0020 +#define EXCLAMATION_MARK 0x0021 +#define QUOTATION_MARK 0x0022 +#define NUMBER_SIGN 0x0023 +#define DOLLAR_SIGN 0x0024 +#define PERCENT_SIGN 0x0025 +#define AMPERSAND 0x0026 +#define APOSTROPHE 0x0027 +#define LEFT_PARENTHESIS 0x0028 +#define RIGHT_PARENTHESIS 0x0029 +#define ASTERISK 0x002A +#define PLUS_SIGN 0x002B +#define COMMA 0x002C +#define HYPHEN_MINUS 0x002D +#define FULL_STOP 0x002E +#define SOLIDUS 0x002F +#define DIGIT_ZERO 0x0030 +#define DIGIT_ONE 0x0031 +#define DIGIT_TWO 0x0032 +#define DIGIT_THREE 0x0033 +#define DIGIT_FOUR 0x0034 +#define DIGIT_FIVE 0x0035 +#define DIGIT_SIX 0x0036 +#define DIGIT_SEVEN 0x0037 +#define DIGIT_EIGHT 0x0038 +#define DIGIT_NINE 0x0039 +#define COLON 0x003A +#define SEMICOLON 0x003B +#define LESS_THAN_SIGN 0x003C +#define EQUALS_SIGN 0x003D +#define GREATER_THAN_SIGN 0x003E +#define QUESTION_MARK 0x003F +#define COMMERCIAL_AT 0x0040 +#define LATIN_CAPITAL_LETTER_A 0x0041 +#define LATIN_CAPITAL_LETTER_B 0x0042 +#define LATIN_CAPITAL_LETTER_C 0x0043 +#define LATIN_CAPITAL_LETTER_D 0x0044 +#define LATIN_CAPITAL_LETTER_E 0x0045 +#define LATIN_CAPITAL_LETTER_F 0x0046 +#define LATIN_CAPITAL_LETTER_G 0x0047 +#define LATIN_CAPITAL_LETTER_H 0x0048 +#define LATIN_CAPITAL_LETTER_I 0x0049 +#define LATIN_CAPITAL_LETTER_J 0x004A +#define LATIN_CAPITAL_LETTER_K 0x004B +#define LATIN_CAPITAL_LETTER_L 0x004C +#define LATIN_CAPITAL_LETTER_M 0x004D +#define LATIN_CAPITAL_LETTER_N 0x004E +#define LATIN_CAPITAL_LETTER_O 0x004F +#define LATIN_CAPITAL_LETTER_P 0x0050 +#define LATIN_CAPITAL_LETTER_Q 0x0051 +#define LATIN_CAPITAL_LETTER_R 0x0052 +#define LATIN_CAPITAL_LETTER_S 0x0053 +#define LATIN_CAPITAL_LETTER_T 0x0054 +#define LATIN_CAPITAL_LETTER_U 0x0055 +#define LATIN_CAPITAL_LETTER_V 0x0056 +#define LATIN_CAPITAL_LETTER_W 0x0057 +#define LATIN_CAPITAL_LETTER_X 0x0058 +#define LATIN_CAPITAL_LETTER_Y 0x0059 +#define LATIN_CAPITAL_LETTER_Z 0x005A +#define LEFT_SQUARE_BRACKET 0x005B +#define REVERSE_SOLIDUS 0x005C +#define RIGHT_SQUARE_BRACKET 0x005D +#define CIRCUMFLEX_ACCENT 0x005E +#define LOW_LINE 0x005F +#define GRAVE_ACCENT 0x0060 +#define LATIN_SMALL_LETTER_A 0x0061 +#define LATIN_SMALL_LETTER_B 0x0062 +#define LATIN_SMALL_LETTER_C 0x0063 +#define LATIN_SMALL_LETTER_D 0x0064 +#define LATIN_SMALL_LETTER_E 0x0065 +#define LATIN_SMALL_LETTER_F 0x0066 +#define LATIN_SMALL_LETTER_G 0x0067 +#define LATIN_SMALL_LETTER_H 0x0068 +#define LATIN_SMALL_LETTER_I 0x0069 +#define LATIN_SMALL_LETTER_J 0x006A +#define LATIN_SMALL_LETTER_K 0x006B +#define LATIN_SMALL_LETTER_L 0x006C +#define LATIN_SMALL_LETTER_M 0x006D +#define LATIN_SMALL_LETTER_N 0x006E +#define LATIN_SMALL_LETTER_O 0x006F +#define LATIN_SMALL_LETTER_P 0x0070 +#define LATIN_SMALL_LETTER_Q 0x0071 +#define LATIN_SMALL_LETTER_R 0x0072 +#define LATIN_SMALL_LETTER_S 0x0073 +#define LATIN_SMALL_LETTER_T 0x0074 +#define LATIN_SMALL_LETTER_U 0x0075 +#define LATIN_SMALL_LETTER_V 0x0076 +#define LATIN_SMALL_LETTER_W 0x0077 +#define LATIN_SMALL_LETTER_X 0x0078 +#define LATIN_SMALL_LETTER_Y 0x0079 +#define LATIN_SMALL_LETTER_Z 0x007A +#define LEFT_CURLY_BRACKET 0x007B +#define VERTICAL_LINE 0x007C +#define RIGHT_CURLY_BRACKET 0x007D +#define TILDE 0x007E + +/* codes 0x7F-0xBF are not needed */ +#define NO_BREAK_SPACE 0x00A0 +#define INVERTED_EXCLAMATION_MARK 0x00A1 +#define CENT_SIGN 0x00A2 +#define POUND_SIGN 0x00A3 +#define CURRENCY_SIGN 0x00A4 +#define YEN_SIGN 0x00A5 +#define BROKEN_BAR 0x00A6 +#define SECTION_SIGN 0x00A7 +#define DIAERESIS 0x00A8 +#define COPYRIGHT_SIGN 0x00A9 +#define FEMININE_ORDINAL_INDICATOR 0x00AA +#define LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK 0x00AB +#define NOT_SIGN 0x00AC +#define SOFT_HYPHEN 0x00AD +#define REGISTERED_SIGN 0x00AE +#define MACRON 0x00AF +#define DEGREE_SIGN 0x00B0 +#define PLUS_MINUS_SIGN 0x00B1 +#define SUPERSCRIPT_TWO 0x00B2 +#define SUPERSCRIPT_THREE 0x00B3 +#define ACUTE_ACCENT 0x00B4 +#define MICRO_SIGN 0x00B5 +#define PILCROW_SIGN 0x00B6 +#define MIDDLE_DOT 0x00B7 +#define CEDILLA 0x00B8 +#define SUPERSCRIPT_ONE 0x00B9 +#define MASCULINE_ORDINAL_INDICATOR 0x00BA +#define RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK 0x00BB +#define VULGAR_FRACTION_ONE_QUARTER 0x00BC +#define VULGAR_FRACTION_ONE_HALF 0x00BD +#define VULGAR_FRACTION_THREE_QUARTERS 0x00BE +#define INVERTED_QUESTION_MARK 0x00BF +#define LATIN_CAPITAL_LETTER_A_WITH_GRAVE 0x00C0 +#define LATIN_CAPITAL_LETTER_A_WITH_ACUTE 0x00C1 +#define LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX 0x00C2 +#define LATIN_CAPITAL_LETTER_A_WITH_TILDE 0x00C3 +#define LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS 0x00C4 +#define LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE 0x00C5 +#define LATIN_CAPITAL_LETTER_AE 0x00C6 +#define LATIN_CAPITAL_LETTER_C_WITH_CEDILLA 0x00C7 +#define LATIN_CAPITAL_LETTER_E_WITH_GRAVE 0x00C8 +#define LATIN_CAPITAL_LETTER_E_WITH_ACUTE 0x00C9 +#define LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX 0x00CA +#define LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS 0x00CB +#define LATIN_CAPITAL_LETTER_I_WITH_GRAVE 0x00CC +#define LATIN_CAPITAL_LETTER_I_WITH_ACUTE 0x00CD +#define LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX 0x00CE +#define LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS 0x00CF +#define LATIN_CAPITAL_LETTER_ETH 0x00D0 +#define LATIN_CAPITAL_LETTER_N_WITH_TILDE 0x00D1 +#define LATIN_CAPITAL_LETTER_O_WITH_GRAVE 0x00D2 +#define LATIN_CAPITAL_LETTER_O_WITH_ACUTE 0x00D3 +#define LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX 0x00D4 +#define LATIN_CAPITAL_LETTER_O_WITH_TILDE 0x00D5 +#define LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS 0x00D6 +#define MULTIPLICATION_SIGN 0x00D7 +#define LATIN_CAPITAL_LETTER_O_WITH_STROKE 0x00D8 +#define LATIN_CAPITAL_LETTER_U_WITH_GRAVE 0x00D9 +#define LATIN_CAPITAL_LETTER_U_WITH_ACUTE 0x00DA +#define LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX 0x00DB +#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS 0x00DC +#define LATIN_CAPITAL_LETTER_Y_WITH_ACUTE 0x00DD +#define LATIN_CAPITAL_LETTER_THORN 0x00DE +#define LATIN_SMALL_LETTER_SHARP_S 0x00DF +#define LATIN_SMALL_LETTER_A_WITH_GRAVE 0x00E0 +#define LATIN_SMALL_LETTER_A_WITH_ACUTE 0x00E1 +#define LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX 0x00E2 +#define LATIN_SMALL_LETTER_A_WITH_TILDE 0x00E3 +#define LATIN_SMALL_LETTER_A_WITH_DIAERESIS 0x00E4 +#define LATIN_SMALL_LETTER_A_WITH_RING_ABOVE 0x00E5 +#define LATIN_SMALL_LETTER_AE 0x00E6 +#define LATIN_SMALL_LETTER_C_WITH_CEDILLA 0x00E7 +#define LATIN_SMALL_LETTER_E_WITH_GRAVE 0x00E8 +#define LATIN_SMALL_LETTER_E_WITH_ACUTE 0x00E9 +#define LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX 0x00EA +#define LATIN_SMALL_LETTER_E_WITH_DIAERESIS 0x00EB +#define LATIN_SMALL_LETTER_I_WITH_GRAVE 0x00EC +#define LATIN_SMALL_LETTER_I_WITH_ACUTE 0x00ED +#define LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX 0x00EE +#define LATIN_SMALL_LETTER_I_WITH_DIAERESIS 0x00EF +#define LATIN_SMALL_LETTER_ETH 0x00F0 +#define LATIN_SMALL_LETTER_N_WITH_TILDE 0x00F1 +#define LATIN_SMALL_LETTER_O_WITH_GRAVE 0x00F2 +#define LATIN_SMALL_LETTER_O_WITH_ACUTE 0x00F3 +#define LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX 0x00F4 +#define LATIN_SMALL_LETTER_O_WITH_TILDE 0x00F5 +#define LATIN_SMALL_LETTER_O_WITH_DIAERESIS 0x00F6 +#define DIVISION_SIGN 0x00F7 +#define LATIN_SMALL_LETTER_O_WITH_STROKE 0x00F8 +#define LATIN_SMALL_LETTER_U_WITH_GRAVE 0x00F9 +#define LATIN_SMALL_LETTER_U_WITH_ACUTE 0x00FA +#define LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX 0x00FB +#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS 0x00FC +#define LATIN_SMALL_LETTER_Y_WITH_ACUTE 0x00FD +#define LATIN_SMALL_LETTER_THORN 0x00FE +#define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0x00FF + +/* latin extended-A */ +#define LATIN_CAPITAL_LETTER_A_WITH_MACRON 0x0100 +#define LATIN_SMALL_LETTER_A_WITH_MACRON 0x0101 +#define LATIN_CAPITAL_LETTER_A_WITH_BREVE 0x0102 +#define LATIN_SMALL_LETTER_A_WITH_BREVE 0x0103 +#define LATIN_CAPITAL_LETTER_A_WITH_OGONEK 0x0104 +#define LATIN_SMALL_LETTER_A_WITH_OGONEK 0x0105 +#define LATIN_CAPITAL_LETTER_C_WITH_ACUTE 0x0106 +#define LATIN_SMALL_LETTER_C_WITH_ACUTE 0x0107 +#define LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX 0x0108 +#define LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX 0x0109 +#define LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE 0x010A +#define LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE 0x010B +#define LATIN_CAPITAL_LETTER_C_WITH_CARON 0x010C +#define LATIN_SMALL_LETTER_C_WITH_CARON 0x010D +#define LATIN_CAPITAL_LETTER_D_WITH_CARON 0x010E +#define LATIN_SMALL_LETTER_D_WITH_CARON 0x010F +#define LATIN_CAPITAL_LETTER_D_WITH_STROKE 0x0110 +#define LATIN_SMALL_LETTER_D_WITH_STROKE 0x0111 +#define LATIN_CAPITAL_LETTER_E_WITH_MACRON 0x0112 +#define LATIN_SMALL_LETTER_E_WITH_MACRON 0x0113 +#define LATIN_CAPITAL_LETTER_E_WITH_BREVE 0x0114 +#define LATIN_SMALL_LETTER_E_WITH_BREVE 0x0115 +#define LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE 0x0116 +#define LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE 0x0117 +#define LATIN_CAPITAL_LETTER_E_WITH_OGONEK 0x0118 +#define LATIN_SMALL_LETTER_E_WITH_OGONEK 0x0119 +#define LATIN_CAPITAL_LETTER_E_WITH_CARON 0x011A +#define LATIN_SMALL_LETTER_E_WITH_CARON 0x011B +#define LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX 0x011C +#define LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX 0x011D +#define LATIN_CAPITAL_LETTER_G_WITH_BREVE 0x011E +#define LATIN_SMALL_LETTER_G_WITH_BREVE 0x011F +#define LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE 0x0120 +#define LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE 0x0121 +#define LATIN_CAPITAL_LETTER_G_WITH_CEDILLA 0x0122 +#define LATIN_SMALL_LETTER_G_WITH_CEDILLA 0x0123 +#define LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX 0x0124 +#define LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX 0x0125 +#define LATIN_CAPITAL_LETTER_H_WITH_STROKE 0x0126 +#define LATIN_SMALL_LETTER_H_WITH_STROKE 0x0127 +#define LATIN_CAPITAL_LETTER_I_WITH_TILDE 0x0128 +#define LATIN_SMALL_LETTER_I_WITH_TILDE 0x0129 +#define LATIN_CAPITAL_LETTER_I_WITH_MACRON 0x012A +#define LATIN_SMALL_LETTER_I_WITH_MACRON 0x012B +#define LATIN_CAPITAL_LETTER_I_WITH_BREVE 0x012C +#define LATIN_SMALL_LETTER_I_WITH_BREVE 0x012D +#define LATIN_CAPITAL_LETTER_I_WITH_OGONEK 0x012E +#define LATIN_SMALL_LETTER_I_WITH_OGONEK 0x012F +#define LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE 0x0130 +#define LATIN_SMALL_LETTER_DOTLESS_I 0x0131 +#define LATIN_CAPITAL_LIGATURE_IJ 0x0132 +#define LATIN_SMALL_LIGATURE_IJ 0x0133 +#define LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX 0x0134 +#define LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX 0x0135 +#define LATIN_CAPITAL_LETTER_K_WITH_CEDILLA 0x0136 +#define LATIN_SMALL_LETTER_K_WITH_CEDILLA 0x0137 +#define LATIN_SMALL_LETTER_KRA 0x0138 +#define LATIN_CAPITAL_LETTER_L_WITH_ACUTE 0x0139 +#define LATIN_SMALL_LETTER_L_WITH_ACUTE 0x013A +#define LATIN_CAPITAL_LETTER_L_WITH_CEDILLA 0x013B +#define LATIN_SMALL_LETTER_L_WITH_CEDILLA 0x013C +#define LATIN_CAPITAL_LETTER_L_WITH_CARON 0x013D +#define LATIN_SMALL_LETTER_L_WITH_CARON 0x013E +#define LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT 0x013F +#define LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT 0x0140 +#define LATIN_CAPITAL_LETTER_L_WITH_STROKE 0x0141 +#define LATIN_SMALL_LETTER_L_WITH_STROKE 0x0142 +#define LATIN_CAPITAL_LETTER_N_WITH_ACUTE 0x0143 +#define LATIN_SMALL_LETTER_N_WITH_ACUTE 0x0144 +#define LATIN_CAPITAL_LETTER_N_WITH_CEDILLA 0x0145 +#define LATIN_SMALL_LETTER_N_WITH_CEDILLA 0x0146 +#define LATIN_CAPITAL_LETTER_N_WITH_CARON 0x0147 +#define LATIN_SMALL_LETTER_N_WITH_CARON 0x0148 +#define LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE 0x0149 +#define LATIN_CAPITAL_LETTER_ENG 0x014A +#define LATIN_SMALL_LETTER_ENG 0x014B +#define LATIN_CAPITAL_LETTER_O_WITH_MACRON 0x014C +#define LATIN_SMALL_LETTER_O_WITH_MACRON 0x014D +#define LATIN_CAPITAL_LETTER_O_WITH_BREVE 0x014E +#define LATIN_SMALL_LETTER_O_WITH_BREVE 0x014F +#define LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE 0x0150 +#define LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE 0x0151 +#define LATIN_CAPITAL_LIGATURE_OE 0x0152 +#define LATIN_SMALL_LIGATURE_OE 0x0153 +#define LATIN_CAPITAL_LETTER_R_WITH_ACUTE 0x0154 +#define LATIN_SMALL_LETTER_R_WITH_ACUTE 0x0155 +#define LATIN_CAPITAL_LETTER_R_WITH_CEDILLA 0x0156 +#define LATIN_SMALL_LETTER_R_WITH_CEDILLA 0x0157 +#define LATIN_CAPITAL_LETTER_R_WITH_CARON 0x0158 +#define LATIN_SMALL_LETTER_R_WITH_CARON 0x0159 +#define LATIN_CAPITAL_LETTER_S_WITH_ACUTE 0x015A +#define LATIN_SMALL_LETTER_S_WITH_ACUTE 0x015B +#define LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX 0x015C +#define LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX 0x015D +#define LATIN_CAPITAL_LETTER_S_WITH_CEDILLA 0x015E +#define LATIN_SMALL_LETTER_S_WITH_CEDILLA 0x015F +#define LATIN_CAPITAL_LETTER_S_WITH_CARON 0x0160 +#define LATIN_SMALL_LETTER_S_WITH_CARON 0x0161 +#define LATIN_CAPITAL_LETTER_T_WITH_CEDILLA 0x0162 +#define LATIN_SMALL_LETTER_T_WITH_CEDILLA 0x0163 +#define LATIN_CAPITAL_LETTER_T_WITH_CARON 0x0164 +#define LATIN_SMALL_LETTER_T_WITH_CARON 0x0165 +#define LATIN_CAPITAL_LETTER_T_WITH_STROKE 0x0166 +#define LATIN_SMALL_LETTER_T_WITH_STROKE 0x0167 +#define LATIN_CAPITAL_LETTER_U_WITH_TILDE 0x0168 +#define LATIN_SMALL_LETTER_U_WITH_TILDE 0x0169 +#define LATIN_CAPITAL_LETTER_U_WITH_MACRON 0x016A +#define LATIN_SMALL_LETTER_U_WITH_MACRON 0x016B +#define LATIN_CAPITAL_LETTER_U_WITH_BREVE 0x016C +#define LATIN_SMALL_LETTER_U_WITH_BREVE 0x016D +#define LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE 0x016E +#define LATIN_SMALL_LETTER_U_WITH_RING_ABOVE 0x016F +#define LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE 0x0170 +#define LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE 0x0171 +#define LATIN_CAPITAL_LETTER_U_WITH_OGONEK 0x0172 +#define LATIN_SMALL_LETTER_U_WITH_OGONEK 0x0173 +#define LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX 0x0174 +#define LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX 0x0175 +#define LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX 0x0176 +#define LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX 0x0177 +#define LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS 0x0178 +#define LATIN_CAPITAL_LETTER_Z_WITH_ACUTE 0x0179 +#define LATIN_SMALL_LETTER_Z_WITH_ACUTE 0x017A +#define LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE 0x017B +#define LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE 0x017C +#define LATIN_CAPITAL_LETTER_Z_WITH_CARON 0x017D +#define LATIN_SMALL_LETTER_Z_WITH_CARON 0x017E +#define LATIN_SMALL_LETTER_LONG_S 0x017F + +/* latin extended B */ +#define LATIN_SMALL_LETTER_B_WITH_STROKE 0x0180 +#define LATIN_CAPITAL_LETTER_B_WITH_HOOK 0x0181 +#define LATIN_CAPITAL_LETTER_B_WITH_TOPBAR 0x0182 +#define LATIN_SMALL_LETTER_B_WITH_TOPBAR 0x0183 +#define LATIN_CAPITAL_LETTER_TONE_SIX 0x0184 +#define LATIN_SMALL_LETTER_TONE_SIX 0x0185 +#define LATIN_CAPITAL_LETTER_OPEN_O 0x0186 +#define LATIN_CAPITAL_LETTER_C_WITH_HOOK 0x0187 +#define LATIN_SMALL_LETTER_C_WITH_HOOK 0x0188 +#define LATIN_CAPITAL_LETTER_AFRICAN_D 0x0189 +#define LATIN_CAPITAL_LETTER_D_WITH_HOOK 0x018A +#define LATIN_CAPITAL_LETTER_D_WITH_TOPBAR 0x018B +#define LATIN_SMALL_LETTER_D_WITH_TOPBAR 0x018C +#define LATIN_SMALL_LETTER_TURNED_DELTA 0x018D +#define LATIN_CAPITAL_LETTER_REVERSED_E 0x018E +#define LATIN_CAPITAL_LETTER_SCHWA 0x018F +#define LATIN_CAPITAL_LETTER_OPEN_E 0x0190 +#define LATIN_CAPITAL_LETTER_F_WITH_HOOK 0x0191 +#define LATIN_SMALL_LETTER_F_WITH_HOOK 0x0192 +#define LATIN_CAPITAL_LETTER_G_WITH_HOOK 0x0193 +#define LATIN_CAPITAL_LETTER_GAMMA 0x0194 +#define LATIN_SMALL_LETTER_HV 0x0195 +#define LATIN_CAPITAL_LETTER_IOTA 0x0196 +#define LATIN_CAPITAL_LETTER_I_WITH_STROKE 0x0197 +#define LATIN_CAPITAL_LETTER_K_WITH_HOOK 0x0198 +#define LATIN_SMALL_LETTER_K_WITH_HOOK 0x0199 +#define LATIN_SMALL_LETTER_L_WITH_BAR 0x019A +#define LATIN_SMALL_LETTER_LAMBDA_WITH_STROKE 0x019B +#define LATIN_CAPITAL_LETTER_TURNED_M 0x019C +#define LATIN_CAPITAL_LETTER_N_WITH_LEFT_HOOK 0x019D +#define LATIN_SMALL_LETTER_N_WITH_LONG_RIGHT_LEG 0x019E +#define LATIN_CAPITAL_LETTER_O_WITH_MIDDLE_TILDE 0x019F +#define LATIN_CAPITAL_LETTER_O_WITH_HORN 0x01A0 +#define LATIN_SMALL_LETTER_O_WITH_HORN 0x01A1 +#define LATIN_CAPITAL_LETTER_OI 0x01A2 +#define LATIN_SMALL_LETTER_OI 0x01A3 +#define LATIN_CAPITAL_LETTER_P_WITH_HOOK 0x01A4 +#define LATIN_SMALL_LETTER_P_WITH_HOOK 0x01A5 +#define LATIN_LETTER_YR 0x01A6 +#define LATIN_CAPITAL_LETTER_TONE_TWO 0x01A7 +#define LATIN_SMALL_LETTER_TONE_TWO 0x01A8 +#define LATIN_CAPITAL_LETTER_ESH 0x01A9 +#define LATIN_LETTER_REVERSED_ESH_LOOP 0x01AA +#define LATIN_SMALL_LETTER_T_WITH_PALATAL_HOOK 0x01AB +#define LATIN_CAPITAL_LETTER_T_WITH_HOOK 0x01AC +#define LATIN_SMALL_LETTER_T_WITH_HOOK 0x01AD +#define LATIN_CAPITAL_LETTER_T_WITH_RETROFLEX_HOOK 0x01AE +#define LATIN_CAPITAL_LETTER_U_WITH_HORN 0x01AF +#define LATIN_SMALL_LETTER_U_WITH_HORN 0x01B0 +#define LATIN_CAPITAL_LETTER_UPSILON 0x01B1 +#define LATIN_CAPITAL_LETTER_V_WITH_HOOK 0x01B2 +#define LATIN_CAPITAL_LETTER_Y_WITH_HOOK 0x01B3 +#define LATIN_SMALL_LETTER_Y_WITH_HOOK 0x01B4 +#define LATIN_CAPITAL_LETTER_Z_WITH_STROKE 0x01B5 +#define LATIN_SMALL_LETTER_Z_WITH_STROKE 0x01B6 +#define LATIN_CAPITAL_LETTER_EZH 0x01B7 +#define LATIN_CAPITAL_LETTER_EZH_REVERSED 0x01B8 +#define LATIN_SMALL_LETTER_EZH_REVERSED 0x01B9 +#define LATIN_SMALL_LETTER_EZH_WITH_TAIL 0x01BA +#define LATIN_LETTER_TWO_WITH_STROKE 0x01BB +#define LATIN_CAPITAL_LETTER_TONE_FIVE 0x01BC +#define LATIN_SMALL_LETTER_TONE_FIVE 0x01BD +#define LATIN_LETTER_INVERTED_GLOTTAL_STOP_WITH_STROKE 0x01BE +#define LATIN_LETTER_WYNN 0x01BF +#define LATIN_LETTER_DENTAL_CLICK 0x01C0 +#define LATIN_LETTER_LATERAL_CLICK 0x01C1 +#define LATIN_LETTER_ALVEOLAR_CLICK 0x01C2 +#define LATIN_LETTER_RETROFLEX_CLICK 0x01C3 +#define LATIN_CAPITAL_LETTER_DZ_WITH_CARON 0x01C4 +#define LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z_WITH_CARON 0x01C5 +#define LATIN_SMALL_LETTER_DZ_WITH_CARON 0x01C6 +#define LATIN_CAPITAL_LETTER_LJ 0x01C7 +#define LATIN_CAPITAL_LETTER_L_WITH_SMALL_LETTER_J 0x01C8 +#define LATIN_SMALL_LETTER_LJ 0x01C9 +#define LATIN_CAPITAL_LETTER_NJ 0x01CA +#define LATIN_CAPITAL_LETTER_N_WITH_SMALL_LETTER_J 0x01CB +#define LATIN_SMALL_LETTER_NJ 0x01CC +#define LATIN_CAPITAL_LETTER_A_WITH_CARON 0x01CD +#define LATIN_SMALL_LETTER_A_WITH_CARON 0x01CE +#define LATIN_CAPITAL_LETTER_I_WITH_CARON 0x01CF +#define LATIN_SMALL_LETTER_I_WITH_CARON 0x01D0 +#define LATIN_CAPITAL_LETTER_O_WITH_CARON 0x01D1 +#define LATIN_SMALL_LETTER_O_WITH_CARON 0x01D2 +#define LATIN_CAPITAL_LETTER_U_WITH_CARON 0x01D3 +#define LATIN_SMALL_LETTER_U_WITH_CARON 0x01D4 +#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON 0x01D5 +#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON 0x01D6 +#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE 0x01D7 +#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE 0x01D8 +#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON 0x01D9 +#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON 0x01DA +#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE 0x01DB +#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE 0x01DC +#define LATIN_SMALL_LETTER_TURNED_E 0x01DD +#define LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON 0x01DE +#define LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON 0x01DF +#define LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON 0x01E0 +#define LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON 0x01E1 +#define LATIN_CAPITAL_LETTER_AE_WITH_MACRON 0x01E2 +#define LATIN_SMALL_LETTER_AE_WITH_MACRON 0x01E3 +#define LATIN_CAPITAL_LETTER_G_WITH_STROKE 0x01E4 +#define LATIN_SMALL_LETTER_G_WITH_STROKE 0x01E5 +#define LATIN_CAPITAL_LETTER_G_WITH_CARON 0x01E6 +#define LATIN_SMALL_LETTER_G_WITH_CARON 0x01E7 +#define LATIN_CAPITAL_LETTER_K_WITH_CARON 0x01E8 +#define LATIN_SMALL_LETTER_K_WITH_CARON 0x01E9 +#define LATIN_CAPITAL_LETTER_O_WITH_OGONEK 0x01EA +#define LATIN_SMALL_LETTER_O_WITH_OGONEK 0x01EB +#define LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON 0x01EC +#define LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON 0x01ED +#define LATIN_CAPITAL_LETTER_EZH_WITH_CARON 0x01EE +#define LATIN_SMALL_LETTER_EZH_WITH_CARON 0x01EF +#define LATIN_SMALL_LETTER_J_WITH_CARON 0x01F0 +#define LATIN_CAPITAL_LETTER_DZ 0x01F1 +#define LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z 0x01F2 +#define LATIN_SMALL_LETTER_DZ 0x01F3 +#define LATIN_CAPITAL_LETTER_G_WITH_ACUTE 0x01F4 +#define LATIN_SMALL_LETTER_G_WITH_ACUTE 0x01F5 +#define LATIN_CAPITAL_LETTER_HWAIR 0x01F6 +#define LATIN_CAPITAL_LETTER_WYNN 0x01F7 +#define LATIN_CAPITAL_LETTER_N_WITH_GRAVE 0x01F8 +#define LATIN_SMALL_LETTER_N_WITH_GRAVE 0x01F9 +#define LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE 0x01FA +#define LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE 0x01FB +#define LATIN_CAPITAL_LETTER_AE_WITH_ACUTE 0x01FC +#define LATIN_SMALL_LETTER_AE_WITH_ACUTE 0x01FD +#define LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE 0x01FE +#define LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE 0x01FF +#define LATIN_CAPITAL_LETTER_A_WITH_DOUBLE_GRAVE 0x0200 +#define LATIN_SMALL_LETTER_A_WITH_DOUBLE_GRAVE 0x0201 +#define LATIN_CAPITAL_LETTER_A_WITH_INVERTED_BREVE 0x0202 +#define LATIN_SMALL_LETTER_A_WITH_INVERTED_BREVE 0x0203 +#define LATIN_CAPITAL_LETTER_E_WITH_DOUBLE_GRAVE 0x0204 +#define LATIN_SMALL_LETTER_E_WITH_DOUBLE_GRAVE 0x0205 +#define LATIN_CAPITAL_LETTER_E_WITH_INVERTED_BREVE 0x0206 +#define LATIN_SMALL_LETTER_E_WITH_INVERTED_BREVE 0x0207 +#define LATIN_CAPITAL_LETTER_I_WITH_DOUBLE_GRAVE 0x0208 +#define LATIN_SMALL_LETTER_I_WITH_DOUBLE_GRAVE 0x0209 +#define LATIN_CAPITAL_LETTER_I_WITH_INVERTED_BREVE 0x020A +#define LATIN_SMALL_LETTER_I_WITH_INVERTED_BREVE 0x020B +#define LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_GRAVE 0x020C +#define LATIN_SMALL_LETTER_O_WITH_DOUBLE_GRAVE 0x020D +#define LATIN_CAPITAL_LETTER_O_WITH_INVERTED_BREVE 0x020E +#define LATIN_SMALL_LETTER_O_WITH_INVERTED_BREVE 0x020F +#define LATIN_CAPITAL_LETTER_R_WITH_DOUBLE_GRAVE 0x0210 +#define LATIN_SMALL_LETTER_R_WITH_DOUBLE_GRAVE 0x0211 +#define LATIN_CAPITAL_LETTER_R_WITH_INVERTED_BREVE 0x0212 +#define LATIN_SMALL_LETTER_R_WITH_INVERTED_BREVE 0x0213 +#define LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_GRAVE 0x0214 +#define LATIN_SMALL_LETTER_U_WITH_DOUBLE_GRAVE 0x0215 +#define LATIN_CAPITAL_LETTER_U_WITH_INVERTED_BREVE 0x0216 +#define LATIN_SMALL_LETTER_U_WITH_INVERTED_BREVE 0x0217 +#define LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW 0x0218 +#define LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW 0x0219 +#define LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW 0x021A +#define LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW 0x021B +#define LATIN_CAPITAL_LETTER_YOGH 0x021C +#define LATIN_SMALL_LETTER_YOGH 0x021D +#define LATIN_CAPITAL_LETTER_H_WITH_CARON 0x021E +#define LATIN_SMALL_LETTER_H_WITH_CARON 0x021F +#define LATIN_CAPITAL_LETTER_OU 0x0222 +#define LATIN_SMALL_LETTER_OU 0x0223 +#define LATIN_CAPITAL_LETTER_Z_WITH_HOOK 0x0224 +#define LATIN_SMALL_LETTER_Z_WITH_HOOK 0x0225 +#define LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE 0x0226 +#define LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE 0x0227 +#define LATIN_CAPITAL_LETTER_E_WITH_CEDILLA 0x0228 +#define LATIN_SMALL_LETTER_E_WITH_CEDILLA 0x0229 +#define LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON 0x022A +#define LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON 0x022B +#define LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON 0x022C +#define LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON 0x022D +#define LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE 0x022E +#define LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE 0x022F +#define LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON 0x0230 +#define LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON 0x0231 +#define LATIN_CAPITAL_LETTER_Y_WITH_MACRON 0x0232 +#define LATIN_SMALL_LETTER_Y_WITH_MACRON 0x0233 + +/* IPA extensions */ +#define LATIN_SMALL_LETTER_TURNED_A 0x0250 +#define LATIN_SMALL_LETTER_ALPHA 0x0251 +#define LATIN_SMALL_LETTER_TURNED_ALPHA 0x0252 +#define LATIN_SMALL_LETTER_B_WITH_HOOK 0x0253 +#define LATIN_SMALL_LETTER_OPEN_O 0x0254 +#define LATIN_SMALL_LETTER_C_WITH_CURL 0x0255 +#define LATIN_SMALL_LETTER_D_WITH_TAIL 0x0256 +#define LATIN_SMALL_LETTER_D_WITH_HOOK 0x0257 +#define LATIN_SMALL_LETTER_REVERSED_E 0x0258 +#define LATIN_SMALL_LETTER_SCHWA 0x0259 +#define LATIN_SMALL_LETTER_SCHWA_WITH_HOOK 0x025A +#define LATIN_SMALL_LETTER_OPEN_E 0x025B +#define LATIN_SMALL_LETTER_REVERSED_OPEN_E 0x025C +#define LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_HOOK 0x025D +#define LATIN_SMALL_LETTER_CLOSED_REVERSED_OPEN_E 0x025E +#define LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE 0x025F +#define LATIN_SMALL_LETTER_G_WITH_HOOK 0x0260 +#define LATIN_SMALL_LETTER_SCRIPT_G 0x0261 +#define LATIN_LETTER_SMALL_CAPITAL_G 0x0262 +#define LATIN_SMALL_LETTER_GAMMA 0x0263 +#define LATIN_SMALL_LETTER_RAMS_HORN 0x0264 +#define LATIN_SMALL_LETTER_TURNED_H 0x0265 +#define LATIN_SMALL_LETTER_H_WITH_HOOK 0x0266 +#define LATIN_SMALL_LETTER_HENG_WITH_HOOK 0x0267 +#define LATIN_SMALL_LETTER_I_WITH_STROKE 0x0268 +#define LATIN_SMALL_LETTER_IOTA 0x0269 +#define LATIN_LETTER_SMALL_CAPITAL_I 0x026A +#define LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE 0x026B +#define LATIN_SMALL_LETTER_L_WITH_BELT 0x026C +#define LATIN_SMALL_LETTER_L_WITH_RETROFLEX_HOOK 0x026D +#define LATIN_SMALL_LETTER_LEZH 0x026E +#define LATIN_SMALL_LETTER_TURNED_M 0x026F +#define LATIN_SMALL_LETTER_TURNED_M_WITH_LONG_LEG 0x0270 +#define LATIN_SMALL_LETTER_M_WITH_HOOK 0x0271 +#define LATIN_SMALL_LETTER_N_WITH_LEFT_HOOK 0x0272 +#define LATIN_SMALL_LETTER_N_WITH_RETROFLEX_HOOK 0x0273 +#define LATIN_LETTER_SMALL_CAPITAL_N 0x0274 +#define LATIN_SMALL_LETTER_BARRED_O 0x0275 +#define LATIN_LETTER_SMALL_CAPITAL_OE 0x0276 +#define LATIN_SMALL_LETTER_CLOSED_OMEGA 0x0277 +#define LATIN_SMALL_LETTER_PHI 0x0278 +#define LATIN_SMALL_LETTER_TURNED_R 0x0279 +#define LATIN_SMALL_LETTER_TURNED_R_WITH_LONG_LEG 0x027A +#define LATIN_SMALL_LETTER_TURNED_R_WITH_HOOK 0x027B +#define LATIN_SMALL_LETTER_R_WITH_LONG_LEG 0x027C +#define LATIN_SMALL_LETTER_R_WITH_TAIL 0x027D +#define LATIN_SMALL_LETTER_R_WITH_FISHHOOK 0x027E +#define LATIN_SMALL_LETTER_REVERSED_R_WITH_FISHHOOK 0x027F +#define LATIN_LETTER_SMALL_CAPITAL_R 0x0280 +#define LATIN_LETTER_SMALL_CAPITAL_INVERTED_R 0x0281 +#define LATIN_SMALL_LETTER_S_WITH_HOOK 0x0282 +#define LATIN_SMALL_LETTER_ESH 0x0283 +#define LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE_AND_HOOK 0x0284 +#define LATIN_SMALL_LETTER_SQUAT_REVERSED_ESH 0x0285 +#define LATIN_SMALL_LETTER_ESH_WITH_CURL 0x0286 +#define LATIN_SMALL_LETTER_TURNED_T 0x0287 +#define LATIN_SMALL_LETTER_T_WITH_RETROFLEX_HOOK 0x0288 +#define LATIN_SMALL_LETTER_U_BAR 0x0289 +#define LATIN_SMALL_LETTER_UPSILON 0x028A +#define LATIN_SMALL_LETTER_V_WITH_HOOK 0x028B +#define LATIN_SMALL_LETTER_TURNED_V 0x028C +#define LATIN_SMALL_LETTER_TURNED_W 0x028D +#define LATIN_SMALL_LETTER_TURNED_Y 0x028E +#define LATIN_LETTER_SMALL_CAPITAL_Y 0x028F +#define LATIN_SMALL_LETTER_Z_WITH_RETROFLEX_HOOK 0x0290 +#define LATIN_SMALL_LETTER_Z_WITH_CURL 0x0291 +#define LATIN_SMALL_LETTER_EZH 0x0292 +#define LATIN_SMALL_LETTER_EZH_WITH_CURL 0x0293 +#define LATIN_LETTER_GLOTTAL_STOP 0x0294 +#define LATIN_LETTER_PHARYNGEAL_VOICED_FRICATIVE 0x0295 +#define LATIN_LETTER_INVERTED_GLOTTAL_STOP 0x0296 +#define LATIN_LETTER_STRETCHED_C 0x0297 +#define LATIN_LETTER_BILABIAL_CLICK 0x0298 +#define LATIN_LETTER_SMALL_CAPITAL_B 0x0299 +#define LATIN_SMALL_LETTER_CLOSED_OPEN_E 0x029A +#define LATIN_LETTER_SMALL_CAPITAL_G_WITH_HOOK 0x029B +#define LATIN_LETTER_SMALL_CAPITAL_H 0x029C +#define LATIN_SMALL_LETTER_J_WITH_CROSSED_TAIL 0x029D +#define LATIN_SMALL_LETTER_TURNED_K 0x029E +#define LATIN_LETTER_SMALL_CAPITAL_L 0x029F +#define LATIN_SMALL_LETTER_Q_WITH_HOOK 0x02A0 +#define LATIN_LETTER_GLOTTAL_STOP_WITH_STROKE 0x02A1 +#define LATIN_LETTER_REVERSED_GLOTTAL_STOP_WITH_STROKE 0x02A2 +#define LATIN_SMALL_LETTER_DZ_DIGRAPH 0x02A3 +#define LATIN_SMALL_LETTER_DEZH_DIGRAPH 0x02A4 +#define LATIN_SMALL_LETTER_DZ_DIGRAPH_WITH_CURL 0x02A5 +#define LATIN_SMALL_LETTER_TS_DIGRAPH 0x02A6 +#define LATIN_SMALL_LETTER_TESH_DIGRAPH 0x02A7 +#define LATIN_SMALL_LETTER_TC_DIGRAPH_WITH_CURL 0x02A8 +#define LATIN_SMALL_LETTER_FENG_DIGRAPH 0x02A9 +#define LATIN_SMALL_LETTER_LS_DIGRAPH 0x02AA +#define LATIN_SMALL_LETTER_LZ_DIGRAPH 0x02AB +#define LATIN_LETTER_BILABIAL_PERCUSSIVE 0x02AC +#define LATIN_LETTER_BIDENTAL_PERCUSSIVE 0x02AD + +/* spacing modifier letters */ +#define MODIFIER_LETTER_SMALL_H 0x02B0 +#define MODIFIER_LETTER_SMALL_H_WITH_HOOK 0x02B1 +#define MODIFIER_LETTER_SMALL_J 0x02B2 +#define MODIFIER_LETTER_SMALL_R 0x02B3 +#define MODIFIER_LETTER_SMALL_TURNED_R 0x02B4 +#define MODIFIER_LETTER_SMALL_TURNED_R_WITH_HOOK 0x02B5 +#define MODIFIER_LETTER_SMALL_CAPITAL_INVERTED_R 0x02B6 +#define MODIFIER_LETTER_SMALL_W 0x02B7 +#define MODIFIER_LETTER_SMALL_Y 0x02B8 +#define MODIFIER_LETTER_PRIME 0x02B9 +#define MODIFIER_LETTER_DOUBLE_PRIME 0x02BA +#define MODIFIER_LETTER_TURNED_COMMA 0x02BB +#define MODIFIER_LETTER_APOSTROPHE 0x02BC +#define MODIFIER_LETTER_REVERSED_COMMA 0x02BD +#define MODIFIER_LETTER_RIGHT_HALF_RING 0x02BE +#define MODIFIER_LETTER_LEFT_HALF_RING 0x02BF +#define MODIFIER_LETTER_GLOTTAL_STOP 0x02C0 +#define MODIFIER_LETTER_REVERSED_GLOTTAL_STOP 0x02C1 +#define MODIFIER_LETTER_LEFT_ARROWHEAD 0x02C2 +#define MODIFIER_LETTER_RIGHT_ARROWHEAD 0x02C3 +#define MODIFIER_LETTER_UP_ARROWHEAD 0x02C4 +#define MODIFIER_LETTER_DOWN_ARROWHEAD 0x02C5 +#define MODIFIER_LETTER_CIRCUMFLEX_ACCENT 0x02C6 +#define CARON 0x02C7 +#define MODIFIER_LETTER_VERTICAL_LINE 0x02C8 +#define MODIFIER_LETTER_MACRON 0x02C9 +#define MODIFIER_LETTER_ACUTE_ACCENT 0x02CA +#define MODIFIER_LETTER_GRAVE_ACCENT 0x02CB +#define MODIFIER_LETTER_LOW_VERTICAL_LINE 0x02CC +#define MODIFIER_LETTER_LOW_MACRON 0x02CD +#define MODIFIER_LETTER_LOW_GRAVE_ACCENT 0x02CE +#define MODIFIER_LETTER_LOW_ACUTE_ACCENT 0x02CF +#define MODIFIER_LETTER_TRIANGULAR_COLON 0x02D0 +#define MODIFIER_LETTER_HALF_TRIANGULAR_COLON 0x02D1 +#define MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING 0x02D2 +#define MODIFIER_LETTER_CENTRED_LEFT_HALF_RING 0x02D3 +#define MODIFIER_LETTER_UP_TACK 0x02D4 +#define MODIFIER_LETTER_DOWN_TACK 0x02D5 +#define MODIFIER_LETTER_PLUS_SIGN 0x02D6 +#define MODIFIER_LETTER_MINUS_SIGN 0x02D7 +#define BREVE 0x02D8 +#define DOT_ABOVE 0x02D9 +#define RING_ABOVE 0x02DA +#define OGONEK 0x02DB +#define SMALL_TILDE 0x02DC +#define DOUBLE_ACUTE_ACCENT 0x02DD +#define MODIFIER_LETTER_RHOTIC_HOOK 0x02DE +#define MODIFIER_LETTER_CROSS_ACCENT 0x02DF +#define MODIFIER_LETTER_SMALL_GAMMA 0x02E0 +#define MODIFIER_LETTER_SMALL_L 0x02E1 +#define MODIFIER_LETTER_SMALL_S 0x02E2 +#define MODIFIER_LETTER_SMALL_X 0x02E3 +#define MODIFIER_LETTER_SMALL_REVERSED_GLOTTAL_STOP 0x02E4 +#define MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR 0x02E5 +#define MODIFIER_LETTER_HIGH_TONE_BAR 0x02E6 +#define MODIFIER_LETTER_MID_TONE_BAR 0x02E7 +#define MODIFIER_LETTER_LOW_TONE_BAR 0x02E8 +#define MODIFIER_LETTER_EXTRA_LOW_TONE_BAR 0x02E9 +#define MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK 0x02EA +#define MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK 0x02EB +#define MODIFIER_LETTER_VOICING 0x02EC +#define MODIFIER_LETTER_UNASPIRATED 0x02ED +#define MODIFIER_LETTER_DOUBLE_APOSTROPHE 0x02EE + +/* combining diacritical marks */ +#define COMBINING_GRAVE_ACCENT 0x0300 +#define COMBINING_ACUTE_ACCENT 0x0301 +#define COMBINING_CIRCUMFLEX_ACCENT 0x0302 +#define COMBINING_TILDE 0x0303 +#define COMBINING_MACRON 0x0304 +#define COMBINING_OVERLINE 0x0305 +#define COMBINING_BREVE 0x0306 +#define COMBINING_DOT_ABOVE 0x0307 +#define COMBINING_DIAERESIS 0x0308 +#define COMBINING_HOOK_ABOVE 0x0309 +#define COMBINING_RING_ABOVE 0x030A +#define COMBINING_DOUBLE_ACUTE_ACCENT 0x030B +#define COMBINING_CARON 0x030C +#define COMBINING_VERTICAL_LINE_ABOVE 0x030D +#define COMBINING_DOUBLE_VERTICAL_LINE_ABOVE 0x030E +#define COMBINING_DOUBLE_GRAVE_ACCENT 0x030F +#define COMBINING_CANDRABINDU 0x0310 +#define COMBINING_INVERTED_BREVE 0x0311 +#define COMBINING_TURNED_COMMA_ABOVE 0x0312 +#define COMBINING_COMMA_ABOVE 0x0313 +#define COMBINING_REVERSED_COMMA_ABOVE 0x0314 +#define COMBINING_COMMA_ABOVE_RIGHT 0x0315 +#define COMBINING_GRAVE_ACCENT_BELOW 0x0316 +#define COMBINING_ACUTE_ACCENT_BELOW 0x0317 +#define COMBINING_LEFT_TACK_BELOW 0x0318 +#define COMBINING_RIGHT_TACK_BELOW 0x0319 +#define COMBINING_LEFT_ANGLE_ABOVE 0x031A +#define COMBINING_HORN 0x031B +#define COMBINING_LEFT_HALF_RING_BELOW 0x031C +#define COMBINING_UP_TACK_BELOW 0x031D +#define COMBINING_DOWN_TACK_BELOW 0x031E +#define COMBINING_PLUS_SIGN_BELOW 0x031F +#define COMBINING_MINUS_SIGN_BELOW 0x0320 +#define COMBINING_PALATALIZED_HOOK_BELOW 0x0321 +#define COMBINING_RETROFLEX_HOOK_BELOW 0x0322 +#define COMBINING_DOT_BELOW 0x0323 +#define COMBINING_DIAERESIS_BELOW 0x0324 +#define COMBINING_RING_BELOW 0x0325 +#define COMBINING_COMMA_BELOW 0x0326 +#define COMBINING_CEDILLA 0x0327 +#define COMBINING_OGONEK 0x0328 +#define COMBINING_VERTICAL_LINE_BELOW 0x0329 +#define COMBINING_BRIDGE_BELOW 0x032A +#define COMBINING_INVERTED_DOUBLE_ARCH_BELOW 0x032B +#define COMBINING_CARON_BELOW 0x032C +#define COMBINING_CIRCUMFLEX_ACCENT_BELOW 0x032D +#define COMBINING_BREVE_BELOW 0x032E +#define COMBINING_INVERTED_BREVE_BELOW 0x032F +#define COMBINING_TILDE_BELOW 0x0330 +#define COMBINING_MACRON_BELOW 0x0331 +#define COMBINING_LOW_LINE 0x0332 +#define COMBINING_DOUBLE_LOW_LINE 0x0333 +#define COMBINING_TILDE_OVERLAY 0x0334 +#define COMBINING_SHORT_STROKE_OVERLAY 0x0335 +#define COMBINING_LONG_STROKE_OVERLAY 0x0336 +#define COMBINING_SHORT_SOLIDUS_OVERLAY 0x0337 +#define COMBINING_LONG_SOLIDUS_OVERLAY 0x0338 +#define COMBINING_RIGHT_HALF_RING_BELOW 0x0339 +#define COMBINING_INVERTED_BRIDGE_BELOW 0x033A +#define COMBINING_SQUARE_BELOW 0x033B +#define COMBINING_SEAGULL_BELOW 0x033C +#define COMBINING_X_ABOVE 0x033D +#define COMBINING_VERTICAL_TILDE 0x033E +#define COMBINING_DOUBLE_OVERLINE 0x033F +#define COMBINING_GRAVE_TONE_MARK 0x0340 +#define COMBINING_ACUTE_TONE_MARK 0x0341 +#define COMBINING_GREEK_PERISPOMENI 0x0342 +#define COMBINING_GREEK_KORONIS 0x0343 +#define COMBINING_GREEK_DIALYTIKA_TONOS 0x0344 +#define COMBINING_GREEK_YPOGEGRAMMENI 0x0345 +#define COMBINING_BRIDGE_ABOVE 0x0346 +#define COMBINING_EQUALS_SIGN_BELOW 0x0347 +#define COMBINING_DOUBLE_VERTICAL_LINE_BELOW 0x0348 +#define COMBINING_LEFT_ANGLE_BELOW 0x0349 +#define COMBINING_NOT_TILDE_ABOVE 0x034A +#define COMBINING_HOMOTHETIC_ABOVE 0x034B +#define COMBINING_ALMOST_EQUAL_TO_ABOVE 0x034C +#define COMBINING_LEFT_RIGHT_ARROW_BELOW 0x034D +#define COMBINING_UPWARDS_ARROW_BELOW 0x034E +#define COMBINING_DOUBLE_TILDE 0x0360 +#define COMBINING_DOUBLE_INVERTED_BREVE 0x0361 +#define COMBINING_DOUBLE_RIGHTWARDS_ARROW_BELOW 0x0362 + +/* greek letters */ +#define GREEK_NUMERAL_SIGN 0x0374 +#define GREEK_LOWER_NUMERAL_SIGN 0x0375 +#define GREEK_YPOGEGRAMMENI 0x037A +#define GREEK_QUESTION_MARK 0x037E +#define GREEK_TONOS 0x0384 +#define GREEK_DIALYTIKA_TONOS 0x0385 +#define GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS 0x0386 +#define GREEK_ANO_TELEIA 0x0387 +#define GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS 0x0388 +#define GREEK_CAPITAL_LETTER_ETA_WITH_TONOS 0x0389 +#define GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS 0x038A +#define GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS 0x038C +#define GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS 0x038E +#define GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS 0x038F +#define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS 0x0390 +#define GREEK_CAPITAL_LETTER_ALPHA 0x0391 +#define GREEK_CAPITAL_LETTER_BETA 0x0392 +#define GREEK_CAPITAL_LETTER_GAMMA 0x0393 +#define GREEK_CAPITAL_LETTER_DELTA 0x0394 +#define GREEK_CAPITAL_LETTER_EPSILON 0x0395 +#define GREEK_CAPITAL_LETTER_ZETA 0x0396 +#define GREEK_CAPITAL_LETTER_ETA 0x0397 +#define GREEK_CAPITAL_LETTER_THETA 0x0398 +#define GREEK_CAPITAL_LETTER_IOTA 0x0399 +#define GREEK_CAPITAL_LETTER_KAPPA 0x039A +#define GREEK_CAPITAL_LETTER_LAMDA 0x039B +#define GREEK_CAPITAL_LETTER_MU 0x039C +#define GREEK_CAPITAL_LETTER_NU 0x039D +#define GREEK_CAPITAL_LETTER_XI 0x039E +#define GREEK_CAPITAL_LETTER_OMICRON 0x039F +#define GREEK_CAPITAL_LETTER_PI 0x03A0 +#define GREEK_CAPITAL_LETTER_RHO 0x03A1 +#define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 +#define GREEK_CAPITAL_LETTER_TAU 0x03A4 +#define GREEK_CAPITAL_LETTER_UPSILON 0x03A5 +#define GREEK_CAPITAL_LETTER_PHI 0x03A6 +#define GREEK_CAPITAL_LETTER_CHI 0x03A7 +#define GREEK_CAPITAL_LETTER_PSI 0x03A8 +#define GREEK_CAPITAL_LETTER_OMEGA 0x03A9 +#define GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA 0x03AA +#define GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA 0x03AB +#define GREEK_SMALL_LETTER_ALPHA_WITH_TONOS 0x03AC +#define GREEK_SMALL_LETTER_EPSILON_WITH_TONOS 0x03AD +#define GREEK_SMALL_LETTER_ETA_WITH_TONOS 0x03AE +#define GREEK_SMALL_LETTER_IOTA_WITH_TONOS 0x03AF +#define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS 0x03B0 +#define GREEK_SMALL_LETTER_ALPHA 0x03B1 +#define GREEK_SMALL_LETTER_BETA 0x03B2 +#define GREEK_SMALL_LETTER_GAMMA 0x03B3 +#define GREEK_SMALL_LETTER_DELTA 0x03B4 +#define GREEK_SMALL_LETTER_EPSILON 0x03B5 +#define GREEK_SMALL_LETTER_ZETA 0x03B6 +#define GREEK_SMALL_LETTER_ETA 0x03B7 +#define GREEK_SMALL_LETTER_THETA 0x03B8 +#define GREEK_SMALL_LETTER_IOTA 0x03B9 +#define GREEK_SMALL_LETTER_KAPPA 0x03BA +#define GREEK_SMALL_LETTER_LAMDA 0x03BB +#define GREEK_SMALL_LETTER_MU 0x03BC +#define GREEK_SMALL_LETTER_NU 0x03BD +#define GREEK_SMALL_LETTER_XI 0x03BE +#define GREEK_SMALL_LETTER_OMICRON 0x03BF +#define GREEK_SMALL_LETTER_PI 0x03C0 +#define GREEK_SMALL_LETTER_RHO 0x03C1 +#define GREEK_SMALL_LETTER_FINAL_SIGMA 0x03C2 +#define GREEK_SMALL_LETTER_SIGMA 0x03C3 +#define GREEK_SMALL_LETTER_TAU 0x03C4 +#define GREEK_SMALL_LETTER_UPSILON 0x03C5 +#define GREEK_SMALL_LETTER_PHI 0x03C6 +#define GREEK_SMALL_LETTER_CHI 0x03C7 +#define GREEK_SMALL_LETTER_PSI 0x03C8 +#define GREEK_SMALL_LETTER_OMEGA 0x03C9 +#define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA 0x03CA +#define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA 0x03CB +#define GREEK_SMALL_LETTER_OMICRON_WITH_TONOS 0x03CC +#define GREEK_SMALL_LETTER_UPSILON_WITH_TONOS 0x03CD +#define GREEK_SMALL_LETTER_OMEGA_WITH_TONOS 0x03CE +#define GREEK_BETA_SYMBOL 0x03D0 +#define GREEK_THETA_SYMBOL 0x03D1 +#define GREEK_UPSILON_WITH_HOOK_SYMBOL 0x03D2 +#define GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL 0x03D3 +#define GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL 0x03D4 +#define GREEK_PHI_SYMBOL 0x03D5 +#define GREEK_PI_SYMBOL 0x03D6 +#define GREEK_KAI_SYMBOL 0x03D7 +#define GREEK_LETTER_STIGMA 0x03DA +#define GREEK_SMALL_LETTER_STIGMA 0x03DB +#define GREEK_LETTER_DIGAMMA 0x03DC +#define GREEK_SMALL_LETTER_DIGAMMA 0x03DD +#define GREEK_LETTER_KOPPA 0x03DE +#define GREEK_SMALL_LETTER_KOPPA 0x03DF +#define GREEK_LETTER_SAMPI 0x03E0 +#define GREEK_SMALL_LETTER_SAMPI 0x03E1 + +/* general punctuation (partial) */ +#define HYPHEN 0x2010 +#define NON_BREAKING_HYPHEN 0x2011 +#define FIGURE_DASH 0x2012 +#define EN_DASH 0x2013 +#define EM_DASH 0x2014 +#define HORIZONTAL_BAR 0x2015 +#define LEFT_SINGLE_QUOTATION_MARK 0x2018 +#define RIGHT_SINGLE_QUOTATION_MARK 0x2019 +#define SINGLE_LOW_9_QUOTATION_MARK 0x201A +#define SINGLE_HIGH_REVERSED_9_QUOTATION_MARK 0x201B +#define LEFT_DOUBLE_QUOTATION_MARK 0x201C +#define RIGHT_DOUBLE_QUOTATION_MARK 0x201D +#define DOUBLE_LOW_9_QUOTATION_MARK 0x201E +#define DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK 0x201F +#define DAGGER 0x2020 +#define DOUBLE_DAGGER 0x2021 +#define BULLET 0x2022 +#define TRIANGULAR_BULLET 0x2023 +#define HYPHENATION_POINT 0x2027 +#define HORIZONTAL_ELLIPSIS 0x2026 +#define PER_MILLE_SIGN 0x2030 +#define SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK 0x2039 +#define SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK 0x203A +#define EURO_CURRENCY_SIGN 0x20AC + +/* mathematical operators */ +#define FOR_ALL 0x2200 +#define COMPLEMENT 0x2201 +#define PARTIAL_DIFFERENTIAL 0x2202 +#define THERE_EXISTS 0x2203 +#define THERE_DOES_NOT_EXIST 0x2204 +#define EMPTY_SET 0x2205 +#define INCREMENT 0x2206 +#define NABLA 0x2207 +#define ELEMENT_OF 0x2208 +#define NOT_AN_ELEMENT_OF 0x2209 +#define SMALL_ELEMENT_OF 0x220A +#define CONTAINS_AS_MEMBER 0x220B +#define DOES_NOT_CONTAIN_AS_MEMBER 0x220C +#define SMALL_CONTAINS_AS_MEMBER 0x220D +#define END_OF_PROOF 0x220E +#define N_ARY_PRODUCT 0x220F +#define N_ARY_COPRODUCT 0x2210 +#define N_ARY_SUMMATION 0x2211 +#define MINUS_SIGN 0x2212 +#define MINUS_OR_PLUS_SIGN 0x2213 +#define DOT_PLUS 0x2214 +#define DIVISION_SLASH 0x2215 +#define SET_MINUS 0x2216 +#define ASTERISK_OPERATOR 0x2217 +#define RING_OPERATOR 0x2218 +#define BULLET_OPERATOR 0x2219 +#define SQUARE_ROOT 0x221A +#define CUBE_ROOT 0x221B +#define FOURTH_ROOT 0x221C +#define PROPORTIONAL_TO 0x221D +/* INFINITY conflicts with math.h */ +#define INFINITY 0x221E +#define RIGHT_ANGLE 0x221F +#define ANGLE 0x2220 +#define MEASURED_ANGLE 0x2221 +#define SPHERICAL_ANGLE 0x2222 +#define DIVIDES 0x2223 +#define DOES_NOT_DIVIDE 0x2224 +#define PARALLEL_TO 0x2225 +#define NOT_PARALLEL_TO 0x2226 +#define LOGICAL_AND 0x2227 +#define LOGICAL_OR 0x2228 +#define INTERSECTION 0x2229 +#define UNION 0x222A +#define INTEGRAL 0x222B +#define DOUBLE_INTEGRAL 0x222C +#define TRIPLE_INTEGRAL 0x222D +#define CONTOUR_INTEGRAL 0x222E +#define SURFACE_INTEGRAL 0x222F +#define VOLUME_INTEGRAL 0x2230 +#define CLOCKWISE_INTEGRAL 0x2231 +#define CLOCKWISE_CONTOUR_INTEGRAL 0x2232 +#define ANTICLOCKWISE_CONTOUR_INTEGRAL 0x2233 +#define THEREFORE 0x2234 +#define BECAUSE 0x2235 +#define RATIO 0x2236 +#define PROPORTION 0x2237 +#define DOT_MINUS 0x2238 +#define EXCESS 0x2239 +#define GEOMETRIC_PROPORTION 0x223A +#define HOMOTHETIC 0x223B +#define TILDE_OPERATOR 0x223C +#define REVERSED_TILDE 0x223D +#define INVERTED_LAZY_S 0x223E +#define SINE_WAVE 0x223F +#define WREATH_PRODUCT 0x2240 +#define NOT_TILDE 0x2241 +#define MINUS_TILDE 0x2242 +#define ASYMPTOTICALLY_EQUAL_TO 0x2243 +#define NOT_ASYMPTOTICALLY_EQUAL_TO 0x2244 +#define APPROXIMATELY_EQUAL_TO 0x2245 +#define APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO 0x2246 +#define NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO 0x2247 +#define ALMOST_EQUAL_TO 0x2248 +#define NOT_ALMOST_EQUAL_TO 0x2249 +#define ALMOST_EQUAL_OR_EQUAL_TO 0x224A +#define TRIPLE_TILDE 0x224B +#define ALL_EQUAL_TO 0x224C +#define EQUIVALENT_TO 0x224D +#define GEOMETRICALLY_EQUIVALENT_TO 0x224E +#define DIFFERENCE_BETWEEN 0x224F +#define APPROACHES_THE_LIMIT 0x2250 +#define GEOMETRICALLY_EQUAL_TO 0x2251 +#define APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF 0x2252 +#define IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO 0x2253 +#define COLON_EQUALS 0x2254 +#define EQUALS_COLON 0x2255 +#define RING_IN_EQUAL_TO 0x2256 +#define RING_EQUAL_TO 0x2257 +#define CORRESPONDS_TO 0x2258 +#define ESTIMATES 0x2259 +#define EQUIANGULAR_TO 0x225A +#define STAR_EQUALS 0x225B +#define DELTA_EQUAL_TO 0x225C +#define EQUAL_TO_BY_DEFINITION 0x225D +#define MEASURED_BY 0x225E +#define QUESTIONED_EQUAL_TO 0x225F +#define NOT_EQUAL_TO 0x2260 +#define IDENTICAL_TO 0x2261 +#define NOT_IDENTICAL_TO 0x2262 +#define STRICTLY_EQUIVALENT_TO 0x2263 +#define LESS_THAN_OR_EQUAL_TO 0x2264 +#define GREATER_THAN_OR_EQUAL_TO 0x2265 +#define LESS_THAN_OVER_EQUAL_TO 0x2266 +#define GREATER_THAN_OVER_EQUAL_TO 0x2267 +#define LESS_THAN_BUT_NOT_EQUAL_TO 0x2268 +#define GREATER_THAN_BUT_NOT_EQUAL_TO 0x2269 +#define MUCH_LESS_THAN 0x226A +#define MUCH_GREATER_THAN 0x226B +#define BETWEEN 0x226C +#define NOT_EQUIVALENT_TO 0x226D +#define NOT_LESS_THAN 0x226E +#define NOT_GREATER_THAN 0x226F +#define NEITHER_LESS_THAN_NOR_EQUAL_TO 0x2270 +#define NEITHER_GREATER_THAN_NOR_EQUAL_TO 0x2271 +#define LESS_THAN_OR_EQUIVALENT_TO 0x2272 +#define GREATER_THAN_OR_EQUIVALENT_TO 0x2273 +#define NEITHER_LESS_THAN_NOR_EQUIVALENT_TO 0x2274 +#define NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO 0x2275 +#define LESS_THAN_OR_GREATER_THAN 0x2276 +#define GREATER_THAN_OR_LESS_THAN 0x2277 +#define NEITHER_LESS_THAN_NOR_GREATER_THAN 0x2278 +#define NEITHER_GREATER_THAN_NOR_LESS_THAN 0x2279 +#define PRECEDES 0x227A +#define SUCCEEDS 0x227B +#define PRECEDES_OR_EQUAL_TO 0x227C +#define SUCCEEDS_OR_EQUAL_TO 0x227D +#define PRECEDES_OR_EQUIVALENT_TO 0x227E +#define SUCCEEDS_OR_EQUIVALENT_TO 0x227F +#define DOES_NOT_PRECEDE 0x2280 +#define DOES_NOT_SUCCEED 0x2281 +#define SUBSET_OF 0x2282 +#define SUPERSET_OF 0x2283 +#define NOT_A_SUBSET_OF 0x2284 +#define NOT_A_SUPERSET_OF 0x2285 +#define SUBSET_OF_OR_EQUAL_TO 0x2286 +#define SUPERSET_OF_OR_EQUAL_TO 0x2287 +#define NEITHER_A_SUBSET_OF_NOR_EQUAL_TO 0x2288 +#define NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO 0x2289 +#define SUBSET_OF_WITH_NOT_EQUAL_TO 0x228A +#define SUPERSET_OF_WITH_NOT_EQUAL_TO 0x228B +#define MULTISET 0x228C +#define MULTISET_MULTIPLICATION 0x228D +#define MULTISET_UNION 0x228E +#define SQUARE_IMAGE_OF 0x228F +#define SQUARE_ORIGINAL_OF 0x2290 +#define SQUARE_IMAGE_OF_OR_EQUAL_TO 0x2291 +#define SQUARE_ORIGINAL_OF_OR_EQUAL_TO 0x2292 +#define SQUARE_CAP 0x2293 +#define SQUARE_CUP 0x2294 +#define CIRCLED_PLUS 0x2295 +#define CIRCLED_MINUS 0x2296 +#define CIRCLED_TIMES 0x2297 +#define CIRCLED_DIVISION_SLASH 0x2298 +#define CIRCLED_DOT_OPERATOR 0x2299 +#define CIRCLED_RING_OPERATOR 0x229A +#define CIRCLED_ASTERISK_OPERATOR 0x229B +#define CIRCLED_EQUALS 0x229C +#define CIRCLED_DASH 0x229D +#define SQUARED_PLUS 0x229E +#define SQUARED_MINUS 0x229F +#define SQUARED_TIMES 0x22A0 +#define SQUARED_DOT_OPERATOR 0x22A1 +#define RIGHT_TACK 0x22A2 +#define LEFT_TACK 0x22A3 +#define DOWN_TACK 0x22A4 +#define UP_TACK 0x22A5 +#define ASSERTION 0x22A6 +#define MODELS 0x22A7 +#define TRUEx 0x22A8 +#define FORCES 0x22A9 +#define TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE 0x22AA +#define DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE 0x22AB +#define DOES_NOT_PROVE 0x22AC +#define NOT_TRUE 0x22AD +#define DOES_NOT_FORCE 0x22AE +#define NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE 0x22AF +#define PRECEDES_UNDER_RELATION 0x22B0 +#define SUCCEEDS_UNDER_RELATION 0x22B1 +#define NORMAL_SUBGROUP_OF 0x22B2 +#define CONTAINS_AS_NORMAL_SUBGROUP 0x22B3 +#define NORMAL_SUBGROUP_OF_OR_EQUAL_TO 0x22B4 +#define CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO 0x22B5 +#define ORIGINAL_OF 0x22B6 +#define IMAGE_OF 0x22B7 +#define MULTIMAP 0x22B8 +#define HERMITIAN_CONJUGATE_MATRIX 0x22B9 +#define INTERCALATE 0x22BA +#define XOR 0x22BB +#define NAND 0x22BC +#define NOR 0x22BD +#define RIGHT_ANGLE_WITH_ARC 0x22BE +#define RIGHT_TRIANGLE 0x22BF +#define N_ARY_LOGICAL_AND 0x22C0 +#define N_ARY_LOGICAL_OR 0x22C1 +#define N_ARY_INTERSECTION 0x22C2 +#define N_ARY_UNION 0x22C3 +#define DIAMOND_OPERATOR 0x22C4 +#define DOT_OPERATOR 0x22C5 +#define STAR_OPERATOR 0x22C6 +#define DIVISION_TIMES 0x22C7 +#define BOWTIE 0x22C8 +#define LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT 0x22C9 +#define RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT 0x22CA +#define LEFT_SEMIDIRECT_PRODUCT 0x22CB +#define RIGHT_SEMIDIRECT_PRODUCT 0x22CC +#define REVERSED_TILDE_EQUALS 0x22CD +#define CURLY_LOGICAL_OR 0x22CE +#define CURLY_LOGICAL_AND 0x22CF +#define DOUBLE_SUBSET 0x22D0 +#define DOUBLE_SUPERSET 0x22D1 +#define DOUBLE_INTERSECTION 0x22D2 +#define DOUBLE_UNION 0x22D3 +#define PITCHFORK 0x22D4 +#define EQUAL_AND_PARALLEL_TO 0x22D5 +#define LESS_THAN_WITH_DOT 0x22D6 +#define GREATER_THAN_WITH_DOT 0x22D7 +#define VERY_MUCH_LESS_THAN 0x22D8 +#define VERY_MUCH_GREATER_THAN 0x22D9 +#define LESS_THAN_EQUAL_TO_OR_GREATER_THAN 0x22DA +#define GREATER_THAN_EQUAL_TO_OR_LESS_THAN 0x22DB +#define EQUAL_TO_OR_LESS_THAN 0x22DC +#define EQUAL_TO_OR_GREATER_THAN 0x22DD +#define EQUAL_TO_OR_PRECEDES 0x22DE +#define EQUAL_TO_OR_SUCCEEDS 0x22DF +#define DOES_NOT_PRECEDE_OR_EQUAL 0x22E0 +#define DOES_NOT_SUCCEED_OR_EQUAL 0x22E1 +#define NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO 0x22E2 +#define NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO 0x22E3 +#define SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO 0x22E4 +#define SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO 0x22E5 +#define LESS_THAN_BUT_NOT_EQUIVALENT_TO 0x22E6 +#define GREATER_THAN_BUT_NOT_EQUIVALENT_TO 0x22E7 +#define PRECEDES_BUT_NOT_EQUIVALENT_TO 0x22E8 +#define SUCCEEDS_BUT_NOT_EQUIVALENT_TO 0x22E9 +#define NOT_NORMAL_SUBGROUP_OF 0x22EA +#define DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP 0x22EB +#define NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO 0x22EC +#define DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL 0x22ED +#define VERTICAL_ELLIPSIS 0x22EE +#define MIDLINE_HORIZONTAL_ELLIPSIS 0x22EF +#define UP_RIGHT_DIAGONAL_ELLIPSIS 0x22F0 +#define DOWN_RIGHT_DIAGONAL_ELLIPSIS 0x22F1 + +/* Optical Character Recognition in Unicode (see wikipedia/OCR) + * range: 0x2440-0x245F + */ +#define OCR_Hook 0x2440 +#define OCR_Chair 0x2441 +#define OCR_Fork 0x2442 +#define OCR_Inverted_Fork 0x2443 +#define OCR_Belt_Buckle 0x2444 +#define OCR_Bow_Tie 0x2445 + +/* the following 4 MICR chars (magnetic ink character recognition) + * They look like: |: ,|' ||' ||| (known also as MICR-A,B,C,D) + */ +#define OCR_Branch_Bank_Identification 0x2446 +#define OCR_Amount_Of_Check 0x2447 +#define OCR_Customer_Account_Number 0x2448 +#define OCR_Dash 0x2449 + +#define OCR_Double_Backslash 0x244A + +/* latin ligatures */ +#define LATIN_SMALL_LIGATURE_FF 0xFB00 +#define LATIN_SMALL_LIGATURE_FI 0xFB01 +#define LATIN_SMALL_LIGATURE_FL 0xFB02 +#define LATIN_SMALL_LIGATURE_FFI 0xFB03 +#define LATIN_SMALL_LIGATURE_FFL 0xFB04 +#define LATIN_SMALL_LIGATURE_LONG_S_T 0xFB05 +#define LATIN_SMALL_LIGATURE_ST 0xFB06 + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/graphcut.c b/fluidbook/tools/swftools-special-swfdump/lib/graphcut.c new file mode 100644 index 000000000..f8216b7fa --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/graphcut.c @@ -0,0 +1,679 @@ +/* + graphcut- a graphcut implementation based on the Boykov Kolmogorov algorithm + + Part of the swftools package. + + Copyright (c) 2007,2008,2009 Matthias Kramm + + This program is free software: you can 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 . +*/ + +#include +#include +#include +#include +#include "graphcut.h" +#include "mem.h" + +//#define DEBUG + +//#define CHECKS + +#ifdef DEBUG +#define DBG +#include +#else +#define DBG if(0) +#define assert(x) (x) +#endif + +#define ACTIVE 0x10 +#define IN_TREE 0x20 + +#define TWOTREES + +typedef struct _posqueue_entry { + node_t*pos; + struct _posqueue_entry*next; +} posqueue_entry_t; + +typedef struct _posqueue { + posqueue_entry_t*list; +} posqueue_t; + +typedef struct _graphcut_workspace { + unsigned char*flags1; + unsigned char*flags2; + halfedge_t**back; + graph_t*graph; + node_t*pos1; + node_t*pos2; + posqueue_t*queue1; + posqueue_t*queue2; + posqueue_t*tmpqueue; +} graphcut_workspace_t; + +static posqueue_t*posqueue_new() +{ + posqueue_t*m = (posqueue_t*)malloc(sizeof(posqueue_t)); + memset(m, 0, sizeof(posqueue_t)); + return m; +} +static void posqueue_delete(posqueue_t*q) +{ + posqueue_entry_t*l = q->list; + while(l) { + posqueue_entry_t*next = l->next; + free(l); + l = next; + } + free(q); +} +static inline void posqueue_addpos(posqueue_t*queue, node_t*pos) +{ + posqueue_entry_t*old = queue->list; + queue->list = malloc(sizeof(posqueue_entry_t)); + queue->list->pos = pos; + queue->list->next = old; +} +static inline node_t* posqueue_extract(posqueue_t*queue) +{ + posqueue_entry_t*item = queue->list; + node_t*pos; + if(!item) + return 0; + pos = item->pos; + queue->list = queue->list->next; + free(item); + return pos; +} +static inline int posqueue_notempty(posqueue_t*queue) +{ + return (int)queue->list; +} + +#define NR(p) ((p)->nr) + +static void posqueue_print(graphcut_workspace_t*w, posqueue_t*queue) +{ + posqueue_entry_t*e = queue->list; + while(e) { + halfedge_t*back = w->back[NR(e->pos)]; + printf("%d(%d) ", NR(e->pos), back?NR(back->fwd->node):-1); + e = e->next; + } + printf("\n"); +} +static void posqueue_purge(posqueue_t*queue) +{ + posqueue_entry_t*e = queue->list; + while(e) { + posqueue_entry_t*next = e->next; + e->next = 0;free(e); + e = next; + } + queue->list = 0; +} + +graph_t* graph_new(int num_nodes) +{ + graph_t*graph = rfx_calloc(sizeof(graph_t)); + graph->num_nodes = num_nodes; + graph->nodes = rfx_calloc(sizeof(node_t)*num_nodes); + int t; + for(t=0;tnodes[t].nr = t; + } + return graph; +} + +void graph_delete(graph_t*graph) +{ + int t; + for(t=0;tnum_nodes;t++) { + halfedge_t*e = graph->nodes[t].edges; + while(e) { + halfedge_t*next = e->next; + free(e); + e = next; + } + } + free(graph->nodes);graph->nodes=0; + free(graph); +} + +static graphcut_workspace_t*graphcut_workspace_new(graph_t*graph, node_t*pos1, node_t*pos2) +{ + graphcut_workspace_t*workspace = malloc(sizeof(graphcut_workspace_t)); + workspace->flags1 = rfx_calloc(graph->num_nodes); + workspace->flags2 = rfx_calloc(graph->num_nodes); + workspace->back = rfx_calloc(graph->num_nodes*sizeof(halfedge_t*)); + workspace->pos1 = pos1; + workspace->pos2 = pos2; + workspace->graph = graph; + workspace->queue1 = posqueue_new(); + workspace->queue2 = posqueue_new(); + workspace->tmpqueue = posqueue_new(); + return workspace; +} +static void graphcut_workspace_delete(graphcut_workspace_t*w) +{ + posqueue_delete(w->queue1);w->queue1=0; + posqueue_delete(w->queue2);w->queue2=0; + posqueue_delete(w->tmpqueue);w->tmpqueue=0; + if(w->flags1) free(w->flags1);w->flags1=0; + if(w->flags2) free(w->flags2);w->flags2=0; + if(w->back) free(w->back);w->back=0; + free(w); +} + +typedef struct _path { + node_t**pos; + halfedge_t**dir; + unsigned char*firsthalf; + int length; +} path_t; + +static path_t*path_new(int len) +{ + path_t*p = malloc(sizeof(path_t)); + p->pos = malloc(sizeof(node_t*)*len); + p->dir = malloc(sizeof(halfedge_t*)*len); + p->firsthalf = malloc(sizeof(unsigned char)*len); + p->length = len; + return p; +} +static void path_delete(path_t*path) +{ + free(path->pos);path->pos = 0; + free(path->dir);path->dir = 0; + free(path->firsthalf);path->firsthalf = 0; + free(path); +} + +static path_t*extract_path(graphcut_workspace_t*work, unsigned char*mytree, unsigned char*othertree, node_t*pos, node_t*newpos, halfedge_t*dir) +{ + int t; + node_t*p = pos; + node_t*nodes = work->graph->nodes; + int len1 = 0; + /* walk up tree1 */ + DBG printf("walk back up (1) to %d\n", NR(work->pos1)); + while(p != work->pos1) { + halfedge_t*back = work->back[NR(p)]; + DBG printf("walk backward (1): %d %d\n", NR(p), back?NR(back->fwd->node):-1); + node_t*old = p; + p = work->back[NR(p)]->fwd->node; + assert(p!=old); + len1++; + } + p = newpos; + int len2 = 0; + DBG printf("walk back up (2) to %d\n", NR(work->pos2)); + /* walk up tree2 */ + while(p != work->pos2) { + DBG printf("walk backward (2): %d\n", NR(p)); + p = work->back[NR(p)]->fwd->node; + len2++; + } + path_t*path = path_new(len1+len2+2); + + t = len1; + path->pos[t] = p = pos; + path->dir[t] = dir; + path->firsthalf[t] = 1; + while(p != work->pos1) { + assert(mytree[NR(p)]&IN_TREE); + halfedge_t*dir = work->back[NR(p)]; + assert(dir->node == p); + p = dir->fwd->node; + t--; + path->pos[t] = p; + path->dir[t] = dir->fwd; + path->firsthalf[t] = 1; + } + assert(!t); + + t = len1+1; + + p = newpos; + while(p != work->pos2) { + assert(othertree[NR(p)]&IN_TREE); + halfedge_t*dir = work->back[NR(p)]; + path->pos[t] = p; + path->dir[t] = dir; + path->firsthalf[t] = 0; + p = dir->fwd->node; + t++; + } + + /* terminator */ + path->pos[t] = p; + path->dir[t] = 0; // last node + path->firsthalf[t] = 0; + + assert(t == len1+len2+1); + return path; +} + +static void path_print(path_t*path) +{ + int t; + for(t=0;tlength;t++) { + node_t*n = path->pos[t]; + printf("%d (firsthalf: %d)", NR(n), path->firsthalf[t]); + if(tlength-1) { + printf(" -(%d/%d)-> \n", + path->dir[t]->used, + path->dir[t]->fwd->used); + } else { + printf("\n"); + } + } + + for(t=0;tlength-1;t++) { + if(path->firsthalf[t]==path->firsthalf[t+1]) { + assert(( path->firsthalf[t] && path->dir[t]->used) || + (!path->firsthalf[t] && path->dir[t]->fwd->used)); + } + } + printf("\n"); +} + + +static void workspace_print(graphcut_workspace_t*w) +{ + printf("queue1: ");posqueue_print(w, w->queue1); + printf("queue2: ");posqueue_print(w, w->queue2); +} + +static void myassert(graphcut_workspace_t*w, char assertion, const char*file, int line, const char*func) +{ + if(!assertion) { + printf("Assertion %s:%d (%s) failed:\n", file, line, func); + workspace_print(w); + exit(0); + } +} + +#define ASSERT(w,c) {myassert(w,c,__FILE__,__LINE__,__func__);} + +static path_t* expand_pos(graphcut_workspace_t*w, posqueue_t*queue, node_t*pos, char reverse, unsigned char*mytree, unsigned char*othertree) +{ + graph_t*graph = w->graph; + int dir; + if((mytree[NR(pos)]&(IN_TREE|ACTIVE)) != (IN_TREE|ACTIVE)) { + /* this node got deleted or marked inactive in the meantime. ignore it */ + DBG printf("node %d is deleted or inactive\n", NR(pos)); + return 0; + } + + halfedge_t*e = pos->edges; + for(;e;e=e->next) { + node_t*newpos = e->fwd->node; + weight_t weight = reverse?e->fwd->weight:e->weight; + if(mytree[NR(newpos)]) continue; // already known + + if(weight) { + if(othertree[NR(newpos)]) { + DBG printf("found connection: %d connects to %d\n", NR(pos), NR(newpos)); + posqueue_addpos(queue, pos); mytree[NR(pos)] |= ACTIVE; // re-add, this vertex might have other connections + + path_t*path; + if(reverse) { + path = extract_path(w, othertree, mytree, newpos, pos, e->fwd); + } else { + path = extract_path(w, mytree, othertree, pos, newpos, e); + } + return path; + } else { + DBG printf("advance from %d to new pos %d\n", NR(pos), NR(newpos)); + w->back[NR(newpos)] = e->fwd; + e->used = 1; + posqueue_addpos(queue, newpos); mytree[NR(newpos)] |= ACTIVE|IN_TREE; // add + } + } + } + /* if we can't expand this node anymore, it's now an inactive node */ + mytree[NR(pos)] &= ~ACTIVE; + return 0; +} + +static int node_count_edges(node_t*node) +{ + halfedge_t*e = node->edges; + int num = 0; + while(e) { + num++; + e = e->next; + } + return num; +} + +static void bool_op(graphcut_workspace_t*w, unsigned char*flags, node_t*pos, unsigned char and, unsigned char or) +{ + posqueue_t*q = w->tmpqueue; + posqueue_purge(q); + posqueue_addpos(q, pos); + + while(posqueue_notempty(q)) { + node_t*p = posqueue_extract(q); + flags[NR(p)] = (flags[NR(p)]&and)|or; + halfedge_t*e = p->edges; + while(e) { + if(e->used) { + posqueue_addpos(q, e->fwd->node); + } + e = e->next; + } + } +} + +static weight_t decrease_weights(graph_t*map, path_t*path) +{ + int t; + assert(path->length); + + weight_t min = path->dir[0]->weight; + for(t=0;tlength-1;t++) { + int w = path->dir[t]->weight; + DBG printf("%d->%d (%d)\n", NR(path->dir[t]->node), NR(path->dir[t]->fwd->node), w); + if(t==0 || w < min) min = w; + } + assert(min); + if(min<=0) + return 0; + + for(t=0;tlength-1;t++) { + path->dir[t]->weight-=min; + path->dir[t]->fwd->weight+=min; + } + return min; +} + +static int reconnect(graphcut_workspace_t*w, unsigned char*flags, node_t*pos, char reverse) +{ + graph_t*graph = w->graph; + + halfedge_t*e = pos->edges; + for(;e;e=e->next) { + node_t*newpos = e->fwd->node; + int weight; + if(!reverse) { + weight = e->fwd->weight; + } else { + weight = e->weight; + } + if(weight && (flags[NR(newpos)]&IN_TREE)) { + DBG printf("successfully reconnected node %d to %d (%d->%d) (reverse:%d)\n", + NR(pos), NR(newpos), NR(e->node), NR(e->fwd->node), reverse); + + w->back[NR(pos)] = e; + e->fwd->used = 1; + return 1; + } + } + return 0; +} + +static void clear_node(graphcut_workspace_t*w, node_t*n) +{ + w->flags1[NR(n)] = 0; + w->flags2[NR(n)] = 0; + w->back[NR(n)] = 0; + halfedge_t*e = n->edges; + while(e) {e->used = 0;e=e->next;} +} + +static void destroy_subtree(graphcut_workspace_t*w, unsigned char*flags, node_t*pos, posqueue_t*posqueue) +{ + DBG printf("destroying subtree starting with %d\n", NR(pos)); + + posqueue_t*q = w->tmpqueue; + posqueue_purge(q); + posqueue_addpos(q, pos); + + while(posqueue_notempty(q)) { + node_t*p = posqueue_extract(q); + halfedge_t*e = p->edges; + while(e) { + node_t*newpos = e->fwd->node; + if(e->used) { + posqueue_addpos(q, newpos); + } else if((flags[NR(newpos)]&(ACTIVE|IN_TREE)) == IN_TREE) { + // re-activate all nodes that surround our subtree. + // TODO: we should check the weight of the edge from that other + // node to our node. if it's zero, we don't need to activate that node. + posqueue_addpos(posqueue, newpos); + flags[NR(newpos)]|=ACTIVE; + } + e = e->next; + } + + clear_node(w, p); + DBG printf("removed pos %d\n", NR(p)); + } +} + +static void combust_tree(graphcut_workspace_t*w, posqueue_t*q1, posqueue_t*q2, path_t*path) +{ + graph_t*graph = w->graph; + int t; + for(t=0;tlength-1 && path->firsthalf[t+1];t++) { + node_t*pos = path->pos[t]; + halfedge_t*dir = path->dir[t]; + node_t*newpos = dir->fwd->node; + if(!dir->weight) { + /* disconnect node */ + DBG printf("remove link %d -> %d from tree 1\n", NR(pos), NR(newpos)); + + dir->used = 0; + w->flags1[NR(newpos)] &= ACTIVE; + bool_op(w, w->flags1, newpos, ~IN_TREE, 0); + + /* try to reconnect the path to some other tree part */ + if(reconnect(w, w->flags1, newpos, 0)) { + bool_op(w, w->flags1, newpos, ~0, IN_TREE); + } else { + destroy_subtree(w, w->flags1, newpos, q1); + break; + } + } + } + + for(t=path->length-1;t>0 && !path->firsthalf[t-1];t--) { + node_t*pos = path->pos[t]; + node_t*newpos = path->pos[t-1]; + halfedge_t*dir = path->dir[t-1]->fwd; + node_t*newpos2 = dir->fwd->node; + assert(newpos == newpos2); + if(!dir->fwd->weight) { + /* disconnect node */ + DBG printf("remove link %d->%d from tree 2\n", NR(pos), NR(newpos)); + + dir->used = 0; + w->flags2[NR(newpos)] &= ACTIVE; + bool_op(w, w->flags2, newpos, ~IN_TREE, 0); + + /* try to reconnect the path to some other tree part */ + if(reconnect(w, w->flags2, newpos, 1)) { + bool_op(w, w->flags2, newpos, ~0, IN_TREE); + } else { + destroy_subtree(w, w->flags2, newpos, q2); + break; + } + } + } +} + +static void check_graph(graph_t*g) +{ + int t; + for(t=0;tnum_nodes;t++) { + assert(g->nodes[t].nr==t); + halfedge_t*e = g->nodes[t].edges; + while(e) { + assert(!e->used || !e->fwd->used); + e = e->next; + } + } +} + +void graph_reset(graph_t*g) +{ + int t; + for(t=0;tnum_nodes;t++) { + g->nodes[t].nr = t; + assert(g->nodes[t].nr==t); + halfedge_t*e = g->nodes[t].edges; + while(e) { + e->used = 0; + e->weight = e->init_weight; + e = e->next; + } + } +} + +weight_t graph_maxflow(graph_t*graph, node_t*pos1, node_t*pos2) +{ + int max_flow = 0; + graphcut_workspace_t* w = graphcut_workspace_new(graph, pos1, pos2); + + graph_reset(graph); + DBG check_graph(graph); + + posqueue_addpos(w->queue1, pos1); w->flags1[pos1->nr] |= ACTIVE|IN_TREE; + posqueue_addpos(w->queue2, pos2); w->flags2[pos2->nr] |= ACTIVE|IN_TREE; + DBG workspace_print(w); + + while(1) { + path_t*path; + while(1) { + char done1=0,done2=0; + node_t* p1 = posqueue_extract(w->queue1); + if(!p1) { + graphcut_workspace_delete(w); + return max_flow; + } + DBG printf("extend 1 from %d (%d edges)\n", NR(p1), node_count_edges(p1)); + path = expand_pos(w, w->queue1, p1, 0, w->flags1, w->flags2); + if(path) + break; + DBG workspace_print(w); + +#ifdef TWOTREES + node_t* p2 = posqueue_extract(w->queue2); + if(!p2) { + graphcut_workspace_delete(w); + return max_flow; + } + DBG printf("extend 2 from %d (%d edges)\n", NR(p2), node_count_edges(p2)); + path = expand_pos(w, w->queue2, p2, 1, w->flags2, w->flags1); + if(path) + break; + DBG workspace_print(w); +#endif + + } + DBG printf("found connection between tree1 and tree2\n"); + DBG path_print(path); + + DBG printf("decreasing weights\n"); + max_flow += decrease_weights(graph, path); + DBG workspace_print(w); + + DBG printf("destroying trees\n"); + combust_tree(w, w->queue1, w->queue2, path); + DBG workspace_print(w); + + DBG check_graph(w->graph); + + path_delete(path); + } + graphcut_workspace_delete(w); + return max_flow; +} + +halfedge_t*graph_add_edge(node_t*from, node_t*to, weight_t forward_weight, weight_t backward_weight) +{ + halfedge_t*e1 = (halfedge_t*)rfx_calloc(sizeof(halfedge_t)); + halfedge_t*e2 = (halfedge_t*)rfx_calloc(sizeof(halfedge_t)); + e1->fwd = e2; + e2->fwd = e1; + e1->node = from; + e2->node = to; + e1->init_weight = forward_weight; + e2->init_weight = backward_weight; + e1->weight = forward_weight; + e2->weight = backward_weight; + + e1->next = from->edges; + from->edges = e1; + e2->next = to->edges; + to->edges = e2; + return e1; +} + +static void do_dfs(node_t*n, int color) +{ + int t; + n->tmp = color; + halfedge_t*e = n->edges; + while(e) { + if(e->fwd->node->tmp<0) + do_dfs(e->fwd->node, color); + e = e->next; + } +} + +int graph_find_components(graph_t*g) +{ + int t; + int count = 0; + for(t=0;tnum_nodes;t++) { + g->nodes[t].tmp = -1; + } + for(t=0;tnum_nodes;t++) { + if(g->nodes[t].tmp<0) { + do_dfs(&g->nodes[t], count++); + } + } + return count; +} + +#ifdef MAIN +int main() +{ + int t; + int s; + for(s=0;s<10;s++) { + int width = (lrand48()%8)+1; + graph_t*g = graph_new(width*width); + for(t=0;t0) graph_add_edge(&g->nodes[t], &g->nodes[t-1], R, R); + if(xnodes[t], &g->nodes[t+1], R, R); + if(y>0) graph_add_edge(&g->nodes[t], &g->nodes[t-width], R, R); + if(ynodes[t], &g->nodes[t+width], R, R); + } + + int x = graph_maxflow(g, &g->nodes[0], &g->nodes[width*width-1]); + printf("max flow: %d\n", x); + graph_delete(g); + } +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/graphcut.h b/fluidbook/tools/swftools-special-swfdump/lib/graphcut.h new file mode 100644 index 000000000..9b15a44cb --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/graphcut.h @@ -0,0 +1,60 @@ +/* + graphcut- a graphcut implementation based on the Boykov Kolmogorov algorithm + + Part of the swftools package. + + Copyright (c) 2007,2008,2009 Matthias Kramm + + This program is free software: you can 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 . +*/ +#ifndef __graphcut_h__ +#define __graphcut_h__ + +typedef signed int weight_t; + +typedef struct _halfedge halfedge_t; +typedef struct _node node_t; +typedef struct _graph graph_t; + +struct _halfedge { + node_t*node; + struct _halfedge*fwd; + weight_t weight; + weight_t init_weight; + char used; + halfedge_t*next; +}; + +struct _node { + halfedge_t*edges; + union { + int tmp; + int component; + int color; + }; + int nr; +}; + +struct _graph { + node_t* nodes; + int num_nodes; +}; + +graph_t* graph_new(int num_nodes); +halfedge_t*graph_add_edge(node_t*from, node_t*to, weight_t forward_weight, weight_t backward_weight); +weight_t graph_maxflow(graph_t*graph, node_t*pos1, node_t*pos2); +int graph_find_components(graph_t*g); +void graph_delete(graph_t*); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c b/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c new file mode 100644 index 000000000..de3eafa2b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c @@ -0,0 +1,199 @@ +/* dct.c + + DCT implementations and test routines. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include + +int zigzagtable[64] = { + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63}; + +static double table[8][8] = +{ +{0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548}, +{0.980785280403230,0.831469612302545,0.555570233019602,0.195090322016128,-0.195090322016128,-0.555570233019602,-0.831469612302545,-0.980785280403230}, +{0.923879532511287,0.382683432365090,-0.382683432365090,-0.923879532511287,-0.923879532511287,-0.382683432365090,0.382683432365090,0.923879532511287}, +{0.831469612302545,-0.195090322016128,-0.980785280403230,-0.555570233019602,0.555570233019602,0.980785280403230,0.195090322016129,-0.831469612302545}, +{0.707106781186548,-0.707106781186547,-0.707106781186548,0.707106781186547,0.707106781186548,-0.707106781186547,-0.707106781186547,0.707106781186547}, +{0.555570233019602,-0.980785280403230,0.195090322016128,0.831469612302545,-0.831469612302545,-0.195090322016128,0.980785280403231,-0.555570233019602}, +{0.382683432365090,-0.923879532511287,0.923879532511287,-0.382683432365090,-0.382683432365091,0.923879532511287,-0.923879532511286,0.382683432365090}, +{0.195090322016128,-0.555570233019602,0.831469612302545,-0.980785280403231,0.980785280403230,-0.831469612302545,0.555570233019602,-0.195090322016129} +}; + +void dct(int*src) +{ + double tmp[64]; + int x,y,u,v,t; + + for(v=0;v<8;v++) + for(u=0;u<8;u++) + { + double c = 0; + for(x=0;x<8;x++) + { + c+=table[u][x]*src[v*8+x]; + } + tmp[v*8+u] = c; + } + for(u=0;u<8;u++) + for(v=0;v<8;v++) + { + double c = 0; + for(y=0;y<8;y++) + { + c+=table[v][y]*tmp[y*8+u]; + } + src[v*8+u] = (int)(c*0.25+0.5); + } +} + +void idct(int*src) +{ + double tmp[64]; + int x,y,u,v; + for(y=0;y<8;y++) + for(x=0;x<8;x++) + { + double c = 0; + for(u=0;u<8;u++) + { + c+=table[u][x]*src[y*8+u]; + } + tmp[y*8+x] = c; + } + for(y=0;y<8;y++) + for(x=0;x<8;x++) + { + double c = 0; + for(v=0;v<8;v++) + { + c+=table[v][y]*tmp[v*8+x]; + } + src[y*8+x] = (int)(c*0.25+0.5); + } +} + +static double c[8] = {1.0, +0.980785280403230, // cos(Pi*1/16), sin(Pi*7/16) +0.923879532511287, // cos(Pi*2/16), sin(Pi*6/16) +0.831469612302545, // cos(Pi*3/16), sin(Pi*5/16) +0.707106781186548, // cos(Pi*4/16), sin(Pi*4/16), 1/sqrt(2) +0.555570233019602, // cos(Pi*5/16), sin(Pi*3/16) +0.382683432365090, // cos(Pi*6/16), sin(Pi*2/16) +0.195090322016128 // cos(Pi*7/16), sin(Pi*1/16) +}; + +static double cc[8]; +static int ccquant = -1; + +void preparequant(int quant) +{ + if(ccquant == quant) + return; + cc[0] = c[0]/(quant*2*4); + cc[1] = c[1]/(quant*2*4); + cc[2] = c[2]/(quant*2*4); + cc[3] = c[3]/(quant*2*4); + cc[4] = c[4]/(quant*2*4); + cc[5] = c[5]/(quant*2*4); + cc[6] = c[6]/(quant*2*4); + cc[7] = c[7]/(quant*2*4); + ccquant = quant; +} + +inline static void innerdct(const double*a,double*b, const double*c) +{ + // c1*c7*2 = c6 + // c2*c6*2 = c4 + // c3*c5*2 = c2 + // c4*c4*2 = 1 + + //{ 1, 3, 5, 7, -7, -5, -3, -1}, + //{ 3, -7, -1, -5, 5, 1, 7, -3}, + //{ 5, -1, 7, 3, -3, -7, 1, -5}, + //{ 7, -5, 3, -1, 1, -3, 5, -7} + double b0,b1,b2,b3,b4,b5; + b2 = (a[0]+a[7]); + b3 = (a[1]+a[6]); + b4 = (a[2]+a[5]); + b5 = (a[3]+a[4]); + + b0 = (b2+b5)*c[4]; + b1 = (b3+b4)*c[4]; + b[0*8] = b0 + b1; + b[4*8] = b0 - b1; + b[2*8] = (b2-b5)*c[2] + (b3-b4)*c[6]; + b[6*8] = (b2-b5)*c[6] + (b4-b3)*c[2]; + + b0 = (a[0]-a[7]); + b1 = (a[1]-a[6]); + b2 = (a[2]-a[5]); + b3 = (a[3]-a[4]); + + b[1*8] = b0*c[1] + b1*c[3] + b2*c[5] + b3*c[7]; + b[3*8] = b0*c[3] - b1*c[7] - b2*c[1] - b3*c[5]; + b[5*8] = b0*c[5] - b1*c[1] + b2*c[7] + b3*c[3]; + b[7*8] = b0*c[7] - b1*c[5] + b2*c[3] - b3*c[1]; +} + +void dct2(int*src, int*dest) +{ + double tmp[64], tmp2[64]; + double*p; + int u,x,v,t; + + for(t=0;t<64;t++) + tmp2[t] = src[t]; + + for(v=0;v<8;v++) + { + double* a=&tmp2[v*8]; + double* b=&tmp[v]; + innerdct(a,b,c); + } + for(v=0;v<8;v++) + { + double* a=&tmp[v*8]; + double* b=&tmp2[v]; + innerdct(a,b,cc); + } + for(t=0;t<64;t++) { + int v = (int)(tmp2[t]); + dest[zigzagtable[t]] = v; + } +} + + +void zigzag(int*src) +{ + int tmp[64]; + int t; + for(t=0;t<64;t++) { + tmp[zigzagtable[t]] = src[t]; + } + memcpy(src, tmp, sizeof(int)*64); +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h b/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h new file mode 100644 index 000000000..eb71bd649 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h @@ -0,0 +1,31 @@ +/* dct.h + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __dct_h__ +#define __dct_h__ + +void dct(int*src); +void idct(int*src); + +void preparequant(int quant); +void dct2(int*src, int*dest); + +extern int zigzagtable[64]; +void zigzag(int*src); + +#endif //__dct_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c b/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c new file mode 100644 index 000000000..384ffb10d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c @@ -0,0 +1,308 @@ +/* h263tables.c + + Huffman Tables for h.263 encoding. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "h263tables.h" + +struct huffcode mcbpc_intra[] = { +{"1",1, 0}, /*cbpc-00 mb type 3*/ +{"001",3, 1}, /*cbpc-01 mb type 3*/ +{"010",3, 2}, /*cbpc-10 mb type 3*/ +{"011",3, 3}, /*cbpc-11 mb type 3*/ +{"0001",4, 4}, /*cbpc-00 mb type 4*/ +{"000001",6, 5}, /*cbpc-01 mb type 4*/ +{"000010",6, 6}, /*cbpc-10 mb type 4*/ +{"000011",6, 7}, /*cbpc-11 mb type 4*/ +{"000000001",9, 8}, /* stuffing */ +{0,0,0}, +}; + +struct mcbpc_intra_params + mcbpc_intra_params[] = +{{0, 3, 0}, //00 + {1, 3, 1}, //01 + {2, 3, 2}, //10 + {3, 3, 3}, //11 + {4, 4, 0}, //00 + {5, 4, 1}, //01 + {6, 4, 2}, //10 + {7, 4, 3}, //11 + {8 -1, -1} +}; + +struct huffcode mcbpc_inter[] = { +{"1", 1, 0}, +{"0011", 4, 1}, +{"0010", 4 ,2}, +{"000101", 6, 3}, +{"011", 3, 4}, +{"0000111", 7, 5}, +{"0000110", 7, 6}, +{"000000101", 9, 7}, +{"010", 3, 8}, +{"0000101", 7, 9}, +{"0000100", 7, 10}, +{"00000101", 8, 11}, +{"00011", 5, 12}, +{"00000100", 8, 13}, +{"00000011", 8, 14}, +{"0000011", 7, 15}, +{"000100", 6, 16}, +{"000000100", 9, 17}, +{"000000011", 9, 18}, +{"000000010", 9, 19}, +{"000000001", 9, 20}, /*stuffing*/ + +/* h.263+ only +{"00000000010", 11, 21}, +{"0000000001100", 13, 22}, +{"0000000001110", 13, 23}, +{"0000000001111", 13, 24}, +*/ +{0,0,0} +}; + +struct mcbpc_inter_params + mcbpc_inter_params[] = +{ {0, 0, 0}, {1, 0, 1}, {2, 0, 2}, {3, 0, 3}, + {4, 1, 0}, {5, 1, 1}, {6, 1, 2}, {7, 1, 3}, + {8, 2, 0}, {9, 2, 1}, {10, 2, 2}, {11, 2, 3}, + {12, 3, 0}, {13, 3, 1}, {14, 3, 2}, {15, 3, 3}, + {16, 4, 0}, {17, 4, 1}, {18, 4, 2}, {19, 4, 3}, + {20, -1, -1}, //stuffing + //{21, 5, 0}, {22, 5, 1}, {23, 5, 2}, {24, 5, 3}, //h.263+ only +}; + +struct huffcode cbpy[] = { +{"0011", 4, 0}, +{"00101", 5, 1}, +{"00100", 5, 2}, +{"1001", 4, 3}, +{"00011", 5, 4}, +{"0111", 4, 5}, +{"000010", 6, 6}, +{"1011", 4, 7}, +{"00010", 5, 8}, +{"000011", 6, 9}, +{"0101", 4, 10}, +{"1010", 4, 11}, +{"0100", 4, 12}, +{"1000", 4, 13}, +{"0110", 4, 14}, +{"11", 2, 15}, +{0,0,0} +}; + +struct huffcode mvd[] = +{ +{"0000000000101", 13, 0}, +{"0000000000111", 13, 1}, +{"000000000101", 12, 2}, +{"000000000111", 12, 3}, +{"000000001001", 12, 4}, +{"000000001011", 12, 5}, +{"000000001101", 12, 6}, +{"000000001111", 12, 7}, +{"00000001001", 11, 8}, +{"00000001011", 11, 9}, +{"00000001101", 11, 10}, +{"00000001111", 11, 11}, +{"00000010001", 11, 12}, +{"00000010011", 11, 13}, +{"00000010101", 11, 14}, +{"00000010111", 11, 15}, +{"00000011001", 11, 16}, +{"00000011011", 11, 17}, +{"00000011101", 11, 18}, +{"00000011111", 11, 19}, +{"00000100001", 11, 20}, +{"00000100011", 11, 21}, +{"0000010011", 10, 22}, +{"0000010101", 10, 23}, +{"0000010111", 10, 24}, +{"00000111", 8, 25}, +{"00001001", 8, 26}, +{"00001011", 8, 27}, +{"0000111", 7, 28}, +{"00011", 5, 29}, +{"0011", 4, 30}, +{"011", 3, 31}, +{"1", 1, 32}, +{"010", 3, 33}, +{"0010", 4, 34}, +{"00010", 5, 35}, +{"0000110", 7, 36}, +{"00001010", 8, 37}, +{"00001000", 8, 38}, +{"00000110", 8, 39}, +{"0000010110", 10, 40}, +{"0000010100", 10, 41}, +{"0000010010", 10, 42}, +{"00000100010", 11, 43}, +{"00000100000", 11, 44}, +{"00000011110", 11, 45}, +{"00000011100", 11, 46}, +{"00000011010", 11, 47}, +{"00000011000", 11, 48}, +{"00000010110", 11, 49}, +{"00000010100", 11, 50}, +{"00000010010", 11, 51}, +{"00000010000", 11, 52}, +{"00000001110", 11, 53}, +{"00000001100", 11, 54}, +{"00000001010", 11, 55}, +{"00000001000", 11, 56}, +{"000000001110", 12, 57}, +{"000000001100", 12, 58}, +{"000000001010", 12, 59}, +{"000000001000", 12, 60}, +{"000000000110", 12, 61}, +{"000000000100", 12, 62}, +{"0000000000110", 13, 63}, +{0,0,0}}; + +struct huffcode rle[] = +{ +{"10", 2, 0}, +{"1111", 4, 1}, +{"010101", 6, 2}, +{"0010111", 7, 3}, +{"00011111", 8, 4}, +{"000100101", 9, 5}, +{"000100100", 9, 6}, +{"0000100001", 10, 7}, +{"0000100000", 10, 8}, +{"00000000111", 11, 9}, +{"00000000110", 11, 10}, +{"00000100000", 11, 11}, +{"110", 3, 12}, +{"010100", 6, 13}, +{"00011110", 8, 14}, +{"0000001111", 10, 15}, +{"00000100001", 11, 16}, +{"000001010000", 12, 17}, +{"1110", 4, 18}, +{"00011101", 8, 19}, +{"0000001110", 10, 20}, +{"000001010001", 12, 21}, +{"01101", 5, 22}, +{"000100011", 9, 23}, +{"0000001101", 10, 24}, +{"01100", 5, 25}, +{"000100010", 9, 26}, +{"000001010010", 12, 27}, +{"01011", 5, 28}, +{"0000001100", 10, 29}, +{"000001010011", 12, 30}, +{"010011", 6, 31}, +{"0000001011", 10, 32}, +{"000001010100", 12, 33}, +{"010010", 6, 34}, +{"0000001010", 10, 35}, +{"010001", 6, 36}, +{"0000001001", 10, 37}, +{"010000", 6, 38}, +{"0000001000", 10, 39}, +{"0010110", 7, 40}, +{"000001010101", 12, 41}, +{"0010101", 7, 42}, +{"0010100", 7, 43}, +{"00011100", 8, 44}, +{"00011011", 8, 45}, +{"000100001", 9, 46}, +{"000100000", 9, 47}, +{"000011111", 9, 48}, +{"000011110", 9, 49}, +{"000011101", 9, 50}, +{"000011100", 9, 51}, +{"000011011", 9, 52}, +{"000011010", 9, 53}, +{"00000100010", 11, 54}, +{"00000100011", 11, 55}, +{"000001010110", 12, 56}, +{"000001010111", 12, 57}, +{"0111", 4, 58}, +{"000011001", 9, 59}, +{"00000000101", 11, 60}, +{"001111", 6, 61}, +{"00000000100", 11, 62}, +{"001110", 6, 63}, +{"001101", 6, 64}, /* ?? */ +{"001100", 6, 65}, +{"0010011", 7, 66}, +{"0010010", 7, 67}, +{"0010001", 7, 68}, +{"0010000", 7, 69}, +{"00011010", 8, 70}, +{"00011001", 8, 71}, +{"00011000", 8, 72}, +{"00010111", 8, 73}, +{"00010110", 8, 74}, +{"00010101", 8, 75}, +{"00010100", 8, 76}, +{"00010011", 8, 77}, +{"000011000", 9, 78}, +{"000010111", 9, 79}, +{"000010110", 9, 80}, +{"000010101", 9, 81}, +{"000010100", 9, 82}, +{"000010011", 9, 83}, +{"000010010", 9, 84}, +{"000010001", 9, 85}, +{"0000000111", 10, 86}, +{"0000000110", 10, 87}, +{"0000000101", 10, 88}, +{"0000000100", 10, 89}, +{"00000100100", 11, 90}, +{"00000100101", 11, 91}, +{"00000100110", 11, 92}, +{"00000100111", 11, 93}, +{"000001011000", 12, 94}, +{"000001011001", 12, 95}, +{"000001011010", 12, 96}, +{"000001011011", 12, 97}, +{"000001011100", 12, 98}, +{"000001011101", 12, 99}, +{"000001011110", 12, 100}, +{"000001011111", 12, 101}, +{"0000011", 7, 102}, /*ESCAPE*/ +{0,0,0} +}; + +struct rle_params + rle_params[] = +{{0,0,0,1}, {1,0,0,2}, {2,0,0,3}, {3,0,0,4}, {4,0,0,5}, {5,0,0,6}, {6,0,0,7}, +{7,0,0,8}, {8,0,0,9}, {9,0,0,10}, {10,0,0,11}, {11,0,0,12}, {12,0,1,1}, {13,0,1,2}, +{14,0,1,3}, {15,0,1,4}, {16,0,1,5}, {17,0,1,6}, {18,0,2,1}, {19,0,2,2}, {20,0,2,3}, {21,0,2,4}, +{22,0,3,1}, {23,0,3,2}, {24,0,3,3}, {25,0,4,1}, {26,0,4,2}, {27,0,4,3}, {28,0,5,1}, +{29,0,5,2}, {30,0,5,3}, {31,0,6,1}, {32,0,6,2}, {33,0,6,3}, +{34,0,7,1}, {35,0,7,2}, {36,0,8,1}, {37,0,8,2}, {38,0,9,1}, {39,0,9,2}, {40,0,10,1}, +{41,0,10,2}, {42,0,11,1}, {43,0,12,1}, {44,0,13,1}, {45,0,14,1}, {46,0,15,1}, +{47,0,16,1}, {48,0,17,1}, {49,0,18,1}, {50,0,19,1}, {51,0,20,1}, {52,0,21,1}, +{53,0,22,1}, {54,0,23,1}, {55,0,24,1}, {56,0,25,1}, {57,0,26,1}, +{58,1,0,1}, {59,1,0,2}, {60,1,0,3}, {61,1,1,1}, {62,1,1,2}, {63,1,2,1}, {64,1,3,1}, {65, 1,4,1}, +{66,1,5,1}, {67,1,6,1}, {68,1,7,1}, {69,1,8,1}, {70,1,9,1}, {71,1,10,1}, +{72,1,11,1}, {73,1,12,1}, {74,1,13,1}, {75,1,14,1}, {76,1,15,1}, {77,1,16,1}, +{78,1,17,1}, {79,1,18,1}, {80,1,19,1}, {81,1,20,1}, {82,1,21,1}, {83,1,22,1}, +{84,1,23,1}, {85,1,24,1}, {86,1,25,1}, {87,1,26,1}, {88,1,27,1}, {89,1,28,1}, +{90,1,29,1}, {91,1,30,1}, {92,1,31,1}, {93,1,32,1}, {94,1,33,1}, {95,1,34,1}, +{96,1,35,1}, {97,1,36,1}, {98,1,37,1}, {99,1,38,1}, {100,1,39,1}, {101,1,40,1}, +{102,-1, -1, -1} +}; + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h b/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h new file mode 100644 index 000000000..b9fdbbb3a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h @@ -0,0 +1,59 @@ +/* h263tables.h + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +struct huffcode { + char*code; + int len; + int index; +}; + +struct mcbpc_intra_params +{ + int index; + int mb_type; + int cbpc; +}; + +struct mcbpc_inter_params +{ + int index; + int mb_type; + int cbpc; +}; + +struct rle_params +{ + int index; + int last; + int run; + int level; +}; + +#define MCBPC_INTRA_STUFFING 8 +#define MCBPC_INTER_STUFFING 20 +#define RLE_ESCAPE 102 + +extern struct huffcode mcbpc_intra[]; +extern struct mcbpc_intra_params mcbpc_intra_params[]; +extern struct mcbpc_inter_params mcbpc_inter_params[]; +extern struct rle_params rle_params[]; + +extern struct huffcode mcbpc_inter[]; +extern struct huffcode cbpy[]; +extern struct huffcode mvd[]; +extern struct huffcode rle[]; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c b/fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c new file mode 100644 index 000000000..d9e180376 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c @@ -0,0 +1,1645 @@ +/* swfvideo.c + Routines for handling h.263 video tags + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "../rfxswf.h" +#include "h263tables.h" +#include "dct.h" + +/* TODO: + - use prepare* / write* in encode_IFrame_block + - check whether mvd steps of 2 lead to (much) smaller results +*/ + +#ifdef MAIN +U16 totalframes = 0; +#endif +void swf_SetVideoStreamDefine(TAG*tag, VIDEOSTREAM*stream, U16 frames, U16 width, U16 height) +{ +#ifdef MAIN + totalframes = frames; +#endif + memset(stream, 0, sizeof(VIDEOSTREAM)); + stream->olinex = width; + stream->owidth = width; + stream->oheight = height; + width+=15;width&=~15; + height+=15;height&=~15; + stream->linex = width; + stream->width = width; + stream->height = height; + stream->bbx = width/16; + stream->bby = height/16; + stream->current = (YUV*)rfx_calloc(width*height*sizeof(YUV)); + stream->oldpic = (YUV*)rfx_calloc(width*height*sizeof(YUV)); + stream->mvdx = (int*)rfx_alloc(stream->bbx*stream->bby*sizeof(int)); + stream->mvdy = (int*)rfx_alloc(stream->bbx*stream->bby*sizeof(int)); + stream->do_motion = 0; + + assert((stream->width&15) == 0); + assert((stream->height&15) == 0); + assert((stream->bbx*16) == stream->width); + assert((stream->bby*16) == stream->height); + + swf_SetU16(tag, frames); + swf_SetU16(tag, width); + swf_SetU16(tag, height); + //swf_SetU8(tag, 1); /* smoothing on */ + swf_SetU8(tag, 0); /* smoothing off */ + swf_SetU8(tag, 2); /* codec = h.263 sorenson spark */ + +} +void swf_VideoStreamClear(VIDEOSTREAM*stream) +{ + rfx_free(stream->oldpic);stream->oldpic = 0; + rfx_free(stream->current);stream->current = 0; + rfx_free(stream->mvdx);stream->mvdx=0; + rfx_free(stream->mvdy);stream->mvdy=0; +} + +typedef struct _block_t +{ + int y1[64]; + int y2[64]; + int y3[64]; + int y4[64]; + int u[64]; + int v[64]; +} block_t; + +static inline int truncate256(int a) +{ + if(a>255) return 255; + if(a<0) return 0; + return a; +} + +static void getregion(block_t* bb, YUV*pic, int posx, int posy, int linex) +{ + YUV*p1; + YUV*p2; + int i=0; + int x,y; + posx*=16; + posy*=16; + p1 = &pic[posy*linex+posx]; + p2 = p1; + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + bb->u[i] = (p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4; + bb->v[i] = (p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4; + bb->y1[i] = p1[x].y; + bb->y2[i] = p1[x+8].y; + bb->y3[i] = p1[linex*8+x].y; + bb->y4[i] = p1[linex*8+x+8].y; + i++; + } + p1+=linex; + p2+=linex*2; + } +} + +/* This function is pretty complex. Let's hope it works correctly */ +static void getmvdregion(block_t* bb, YUV*pic, int posx, int posy, int mvdx, int mvdy, int linex) +{ + YUV*p1; + YUV*p2; + int yy=0,uv=0; + int x,y; + int yhp = 0, uvhp=0; + int uvposx, uvposy; + posx = posx*16 + ((mvdx&~1)/2); //works also for negative mvdx (unlike mvdx/2) + posy = posy*16 + ((mvdy&~1)/2); + p1 = &pic[posy*linex+posx]; + p2 = &pic[(posy&~1)*linex+(posx&~1)]; + uvhp = ((mvdx&1)|((mvdx>>1)&1))|((mvdy&2)|((mvdy&1)<<1)); + yhp = ((mvdy&1)<<1|(mvdx&1)); + + /* y */ + if(yhp==0 || yhp==2) { + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + bb->y1[yy] = p1[x].y; + bb->y2[yy] = p1[x+8].y; + bb->y3[yy] = p1[linex*8+x].y; + bb->y4[yy] = p1[linex*8+x+8].y; + yy++; + } + p1+=linex; + + if(yhp==2) { + yy-=8; + for(x=0;x<8;x++) { + bb->y1[yy] += p1[x].y; bb->y1[yy] /= 2; + bb->y2[yy] += p1[x+8].y; bb->y2[yy] /= 2; + bb->y3[yy] += p1[linex*8+x].y; bb->y3[yy] /= 2; + bb->y4[yy] += p1[linex*8+x+8].y; bb->y4[yy] /= 2; + yy++; + } + } + } + } else if(yhp==1 || yhp==3) { + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + bb->y1[yy] = (p1[x].y + p1[x+1].y); + bb->y2[yy] = (p1[x+8].y + p1[x+8+1].y); + bb->y3[yy] = (p1[linex*8+x].y + p1[linex*8+x+1].y); + bb->y4[yy] = (p1[linex*8+x+8].y + p1[linex*8+x+8+1].y); + yy++; + } + yy-=8; + p1+=linex; + if(yhp==3) { + for(x=0;x<8;x++) { + bb->y1[yy] += (p1[x].y + p1[x+1].y); bb->y1[yy]/=4; + bb->y2[yy] += (p1[x+8].y + p1[x+8+1].y); bb->y2[yy]/=4; + bb->y3[yy] += (p1[linex*8+x].y + p1[linex*8+x+1].y); bb->y3[yy]/=4; + bb->y4[yy] += (p1[linex*8+x+8].y + p1[linex*8+x+8+1].y); bb->y4[yy]/=4; + yy++; + } + } else { + for(x=0;x<8;x++) { + bb->y1[yy]/=2; bb->y2[yy]/=2; bb->y3[yy]/=2; bb->y4[yy]/=2; + yy++; + } + } + } + } + + /* u,v */ + if(uvhp==0 || uvhp==2) { + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + bb->u[uv] = (p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4; + bb->v[uv] = (p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4; + uv++; + } + p2+=linex*2; + if(uvhp==2) { + uv-=8; + for(x=0;x<8;x++) { + bb->u[uv] += (p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4; + bb->v[uv] += (p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4; + bb->u[uv] /= 2; + bb->v[uv] /= 2; + uv++; + } + } + } + } else /* uvhp==1 || uvhp==3 */ { + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + bb->u[uv] = ((p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4+ + (p2[x*2+2].u + p2[x*2+1+2].u + p2[linex+x*2+2].u + p2[linex+x*2+1+2].u)/4); + bb->v[uv] = ((p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4+ + (p2[x*2+2].v + p2[x*2+1+2].v + p2[linex+x*2+2].v + p2[linex+x*2+1+2].v)/4); + uv++; + } + uv-=8; + p2+=linex*2; + if(uvhp==3) { + for(x=0;x<8;x++) { + bb->u[uv] += ((p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4+ + (p2[x*2+2].u + p2[x*2+1+2].u + p2[linex+x*2+2].u + p2[linex+x*2+1+2].u)/4); + bb->v[uv] += ((p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4+ + (p2[x*2+2].v + p2[x*2+1+2].v + p2[linex+x*2+2].v + p2[linex+x*2+1+2].v)/4); + bb->u[uv] /= 4; + bb->v[uv] /= 4; + uv++; + } + } else { + for(x=0;x<8;x++) { + bb->u[uv] /= 2; + bb->v[uv] /= 2; + uv++; + } + } + } + } +} + +static void rgb2yuv(YUV*dest, RGBA*src, int dlinex, int slinex, int width, int height) +{ + int x,y; + for(y=0;y>8; + + dest[y*dlinex+x].y = (r*((int)( 0.299*256)) + g*((int)( 0.587*256)) + b*((int)( 0.114 *256)))>>8; + dest[y*dlinex+x].u = (r*((int)(-0.169*256)) + g*((int)(-0.332*256)) + b*((int)( 0.500 *256))+ 128*256)>>8; + dest[y*dlinex+x].v = (r*((int)( 0.500*256)) + g*((int)(-0.419*256)) + b*((int)(-0.0813*256))+ 128*256)>>8; + } + } +} + +static void copyregion(VIDEOSTREAM*s, YUV*dest, YUV*src, int bx, int by) +{ + YUV*p1 = &dest[by*s->linex*16+bx*16]; + YUV*p2 = &src[by*s->linex*16+bx*16]; + int y; + for(y=0;y<16;y++) { + memcpy(p1, p2, 16*sizeof(YUV)); + p1+=s->linex;p2+=s->linex; + } +} + +static void yuv2rgb(RGBA*dest, YUV*src, int linex, int width, int height) +{ + int x,y; + for(y=0;y>8)); + dest[y*linex+x].g = truncate256(yy - ((88*(u-128)+183*(v-128))>>8)); + dest[y*linex+x].b = truncate256(yy + ((455 * (u-128))>>8)); + } + } +} +static void copy_block_pic(VIDEOSTREAM*s, YUV*dest, block_t*b, int bx, int by) +{ + YUV*p1 = &dest[(by*16)*s->linex+bx*16]; + YUV*p2 = &dest[(by*16+8)*s->linex+bx*16]; + int x,y; + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + int u,v,yy; + p1[x+0].u = b->u[(y/2)*8+(x/2)]; + p1[x+0].v = b->v[(y/2)*8+(x/2)]; + p1[x+0].y = b->y1[y*8+x]; + p1[x+8].u = b->u[(y/2)*8+(x/2)+4]; + p1[x+8].v = b->v[(y/2)*8+(x/2)+4]; + p1[x+8].y = b->y2[y*8+x]; + p2[x+0].u = b->u[(y/2+4)*8+(x/2)]; + p2[x+0].v = b->v[(y/2+4)*8+(x/2)]; + p2[x+0].y = b->y3[y*8+x]; + p2[x+8].u = b->u[(y/2+4)*8+(x/2)+4]; + p2[x+8].v = b->v[(y/2+4)*8+(x/2)+4]; + p2[x+8].y = b->y4[y*8+x]; + } + p1+=s->linex; + p2+=s->linex; + } +} + +static int compare_pic_pic(VIDEOSTREAM*s, YUV*pp1, YUV*pp2, int bx, int by) +{ + int linex = s->width; + YUV*p1 = &pp1[by*linex*16+bx*16]; + YUV*p2 = &pp2[by*linex*16+bx*16]; + int diffy=0, diffuv = 0; + int x,y; + for(y=0;y<16;y++) { + for(x=0;x<16;x++) { + YUV*m = &p1[x]; + YUV*n = &p2[x]; + int y = m->y - n->y; + int u = m->u - n->u; + int v = m->v - n->v; + diffy += abs(y); + diffuv += abs(u)+abs(v); + } + p1+=linex; + p2+=linex; + } + return diffy + diffuv/4; +} + +static int compare_pic_block(VIDEOSTREAM*s, block_t* b, YUV*pic, int bx, int by) +{ + int linex = s->width; + YUV*y1 = &pic[(by*2)*linex*8+bx*16]; + YUV*y2 = &pic[(by*2)*linex*8+bx*16+8]; + YUV*y3 = &pic[(by*2+1)*linex*8+bx*16]; + YUV*y4 = &pic[(by*2+1)*linex*8+bx*16+8]; + YUV*uv1 = y1; + YUV*uv2 = &y1[linex]; + int diffy=0, diffuv = 0; + int x,y; + for(y=0;y<8;y++) { + for(x=0;x<8;x++) { + int yy,u1,v1,u2,v2,u3,v3,u4,v4; + int y8x = y*8+x; + yy = y1[x].y - b->y1[y8x]; + diffy += abs(yy); + yy = y2[x].y - b->y2[y8x]; + diffy += abs(yy); + yy = y3[x].y - b->y3[y8x]; + diffy += abs(yy); + yy = y4[x].y - b->y4[y8x]; + diffy += abs(yy); + u1 = uv1[x*2].u - b->u[y8x]; + v1 = uv1[x*2].v - b->v[y8x]; + u2 = uv1[x*2+1].u - b->u[y8x]; + v2 = uv1[x*2+1].v - b->v[y8x]; + u3 = uv2[x*2].u - b->u[y8x]; + v3 = uv2[x*2].v - b->v[y8x]; + u4 = uv2[x*2+1].u - b->u[y8x]; + v4 = uv2[x*2+1].v - b->v[y8x]; + diffuv += (abs(u1)+abs(v1)); + diffuv += (abs(u2)+abs(v2)); + diffuv += (abs(u3)+abs(v3)); + diffuv += (abs(u4)+abs(v4)); + } + y1+=linex; + y2+=linex; + y3+=linex; + y4+=linex; + uv1+=linex*2; + uv2+=linex*2; + } + return diffy + diffuv/4; +} + +static inline int valtodc(int val) +{ + assert(val>=0); + + /* table 12/h.263 */ + + //val+=4; //round + val/=8; + /* TODO: what to do for zero values? skip the block? */ + if(val==0) + return 1; + if(val==128) + return 255; + if(val>254) + return 254; + return val; +} +static int dctoval(int dc) +{ + int val; + assert(dc>0); + assert(dc!=128); + assert(dc<256); + /* table 12/h.263 */ + val = dc*8; + if(val == 255*8) + val = 128*8; + return val; +} + +/* TODO: we could also just let the caller pass only the string table[index] here */ +static int codehuffman(TAG*tag, struct huffcode*table, int index) +{ + /* TODO: !optimize! */ + int i=0; + while(table[index].code[i]) { + if(table[index].code[i]=='0') + swf_SetBits(tag, 0, 1); + else + swf_SetBits(tag, 1, 1); + i++; + } + return i; +} + +static void quantize8x8(int*src, int*dest, int has_dc, int quant) +{ + int t,pos=0; + double q = 1.0/(quant*2); + if(has_dc) { + dest[0] = valtodc((int)src[0]); /*DC*/ + pos++; + } + for(t=pos;t<64;t++) + { + //dest[t] = (int)src[t]; + /* exact: if(quant&1){dest[t] = (dest[t]/quant - 1)/2;}else{dest[t] = ((dest[t]+1)/quant - 1)/2;} */ + //if(quant&1){dest[t] = (dest[t]/quant - 1)/2;}else{dest[t] = ((dest[t]+1)/quant - 1)/2;} + //dest[t] = dest[t]/(quant*2); + dest[t] = (int)(src[t]*q); + /* TODO: warn if this happens- the video will be buggy */ + if(dest[t]>127) dest[t]=127; + if(dest[t]<-127) dest[t]=-127; + } +} + +static void dequantize8x8(int*b, int has_dc, int quant) +{ + int t,pos=0; + if(has_dc) { + b[0] = dctoval(b[0]); //DC + pos++; + } + for(t=pos;t<64;t++) { + if(b[t]) { + int sign = 0; + if(b[t]<0) { + b[t] = -b[t]; + sign = 1; + } + + if(quant&1) { + b[t] = quant*(2*b[t]+1); //-7,8,24,40 + } else { + b[t] = quant*(2*b[t]+1)-1; //-8,7,23,39 + } + + if(sign) + b[t] = -b[t]; + } + + /* paragraph 6.2.2, "clipping of reconstruction levels": */ + if(b[t]>2047) b[t]=2047; + if(b[t]<-2048) b[t]=-2048; + } +} + +static int hascoef(int*b, int has_dc) +{ + int t; + int pos=0; + if(has_dc) + pos++; + for(t=pos;t<64;t++) { + if(b[t]) + return 1; + } + return 0; +} + +static int coefbits8x8(int*bb, int has_dc) +{ + int t; + int pos=0; + int bits=0; + int last; + + if(has_dc) { + bits+=8; + pos++; + } + for(last=63;last>=pos;last--) { + if(bb[last]) + break; + } + if(last < pos) + return bits; + while(1) { + int run=0, level=0, islast=0,t; + while(!bb[pos] && pos=pos;last--) { + /* TODO: we could leave out small coefficients + after a certain point (32?) */ + if(bb[last]) + break; + } + /* blocks without coefficients should not be included + in the cbpy/cbpc patterns: */ + assert(bb[last]); + + while(1) { + int run=0; + int level=0; + int islast=0; + int sign=0; + int t; + while(!bb[pos] && pos127) { + fprintf(stderr, "Warning: Overflow- Level %d at pos %d\n", level, pos); + if(level<-127) level=-127; + if(level>127) level=127; + } + + assert(level); + assert(level>=-127); + assert(level<=127); //TODO: known to fail for pos=0 (with custom frames?) + + swf_SetBits(tag, islast, 1); + swf_SetBits(tag, run, 6); + swf_SetBits(tag, level, 8); //FIXME: fixme?? + bits += 1 + 6 + 8; + } + + if(islast) + break; + pos++; + } + } + return bits; +} + +static void quantize(block_t*fb, block_t*b, int has_dc, int quant) +{ + quantize8x8(fb->y1, b->y1, has_dc, quant); + quantize8x8(fb->y2, b->y2, has_dc, quant); + quantize8x8(fb->y3, b->y3, has_dc, quant); + quantize8x8(fb->y4, b->y4, has_dc, quant); + quantize8x8(fb->u, b->u, has_dc, quant); + quantize8x8(fb->v, b->v, has_dc, quant); +} + +static void dodct(block_t*fb) +{ + dct(fb->y1); dct(fb->y2); dct(fb->y3); dct(fb->y4); + dct(fb->u); dct(fb->v); + zigzag(fb->y1); + zigzag(fb->y2); + zigzag(fb->y3); + zigzag(fb->y4); + zigzag(fb->u); + zigzag(fb->v); +} + +static void dodctandquant(block_t*fb, block_t*b, int has_dc, int quant) +{ + int t; + if(has_dc) { + dodct(fb); + quantize(fb,b,has_dc,quant); + return; + } + preparequant(quant); + dct2(fb->y1,b->y1); dct2(fb->y2,b->y2); dct2(fb->y3,b->y3); dct2(fb->y4,b->y4); + dct2(fb->u,b->u); dct2(fb->v,b->v); + + for(t=0;t<64;t++) { + /* prepare for encoding (only values in (-127..-1,1..127) are + allowed as non-zero, non-dc values */ + if(b->y1[t]<-127) b->y1[t]=-127; + if(b->y2[t]<-127) b->y2[t]=-127; + if(b->y3[t]<-127) b->y3[t]=-127; + if(b->y4[t]<-127) b->y4[t]=-127; + if(b->u[t]<-127) b->u[t]=-127; + if(b->v[t]<-127) b->v[t]=-127; + + if(b->y1[t]>127) b->y1[t]=127; + if(b->y2[t]>127) b->y2[t]=127; + if(b->y3[t]>127) b->y3[t]=127; + if(b->y4[t]>127) b->y4[t]=127; + if(b->u[t]>127) b->u[t]=127; + if(b->v[t]>127) b->v[t]=127; + } +} + +static void doidct(block_t*b) +{ + block_t fb; + int t; + for(t=0;t<64;t++) { + fb.y1[t] = b->y1[zigzagtable[t]]; + fb.y2[t] = b->y2[zigzagtable[t]]; + fb.y3[t] = b->y3[zigzagtable[t]]; + fb.y4[t] = b->y4[zigzagtable[t]]; + fb.u[t] = b->u[zigzagtable[t]]; + fb.v[t] = b->v[zigzagtable[t]]; + } + idct(fb.y1); idct(fb.y2); idct(fb.y3); idct(fb.y4); + idct(fb.u); idct(fb.v); + + memcpy(b, &fb, sizeof(block_t)); +} + +static void truncateblock(block_t*b) +{ + int t; + for(t=0;t<64;t++) { + b->y1[t] = truncate256(b->y1[t]); + b->y2[t] = truncate256(b->y2[t]); + b->y3[t] = truncate256(b->y3[t]); + b->y4[t] = truncate256(b->y4[t]); + b->u[t] = truncate256(b->u[t]); + b->v[t] = truncate256(b->v[t]); + } +} + +static void dequantize(block_t*b, int has_dc, int quant) +{ + dequantize8x8(b->y1, has_dc, quant); + dequantize8x8(b->y2, has_dc, quant); + dequantize8x8(b->y3, has_dc, quant); + dequantize8x8(b->y4, has_dc, quant); + dequantize8x8(b->u, has_dc, quant); + dequantize8x8(b->v, has_dc, quant); +} + +static void getblockpatterns(block_t*b, int*cbpybits,int*cbpcbits, int has_dc) +{ + *cbpybits = 0; + *cbpcbits = 0; + + *cbpybits|=hascoef(b->y1, has_dc)*8; + *cbpybits|=hascoef(b->y2, has_dc)*4; + *cbpybits|=hascoef(b->y3, has_dc)*2; + *cbpybits|=hascoef(b->y4, has_dc)*1; + + *cbpcbits|=hascoef(b->u, has_dc)*2; + *cbpcbits|=hascoef(b->v, has_dc)*1; +} + +static void setQuant(TAG*tag, int dquant) +{ + int code = 0; + /* 00 01 10 11 + -1 -2 +1 +2 + */ + if(dquant == -1) { + swf_SetBits(tag, 0x0, 2); + } else if(dquant == -2) { + swf_SetBits(tag, 0x1, 2); + } else if(dquant == +1) { + swf_SetBits(tag, 0x2, 2); + } else if(dquant == +2) { + swf_SetBits(tag, 0x3, 2); + } else { + assert(0*strlen("invalid dquant")); + } +} + +static void change_quant(int quant, int*dquant) +{ + /* TODO */ + *dquant = 0; +} + +static void yuvdiff(block_t*a, block_t*b) +{ + int t; + for(t=0;t<64;t++) { + a->y1[t] = (a->y1[t] - b->y1[t]); + a->y2[t] = (a->y2[t] - b->y2[t]); + a->y3[t] = (a->y3[t] - b->y3[t]); + a->y4[t] = (a->y4[t] - b->y4[t]); + a->u[t] = (a->u[t] - b->u[t]); + a->v[t] = (a->v[t] - b->v[t]); + } +} + +static void predictmvd(VIDEOSTREAM*s, int bx, int by, int*px, int*py) +{ + int i1,i2; + int x1,y1,x2,y2,x3,y3; + int x4,y4,p; + if(bx) {x1=s->mvdx[by*s->bbx+bx-1]; + y1=s->mvdy[by*s->bbx+bx-1]; + } else {x1=y1=0;} + + if(by) {x2=s->mvdx[(by-1)*s->bbx+bx]; + y2=s->mvdy[(by-1)*s->bbx+bx]; + if(bxbbx-1) { + x3=s->mvdx[(by-1)*s->bbx+bx+1]; + y3=s->mvdy[(by-1)*s->bbx+bx+1]; + } else { + x3=y3=0; + } + } + else {x2=x3=x1;y2=y3=y1;} + + if((x1 <= x2 && x2 <= x3) || + (x3 <= x2 && x2 <= x1)) { + x4=x2; + } else if((x2 <= x1 && x1 <= x3) || + (x3 <= x1 && x1 <= x2)) { + x4=x1; + } else if((x1 <= x3 && x3 <= x2) || + (x2 <= x3 && x3 <= x1)) { + x4=x3; + } else { + x4=0; + assert(x4); + } + + if((y1 <= y2 && y2 <= y3) || + (y3 <= y2 && y2 <= y1)) { + y4=y2; + } else if((y2 <= y1 && y1 <= y3) || + (y3 <= y1 && y1 <= y2)) { + y4=y1; + } else if((y1 <= y3 && y3 <= y2) || + (y2 <= y3 && y3 <= y1)) { + y4=y3; + } else { + y4=0; + assert(y4); + } + + *px = x4; + *py = y4; + assert((x4>=-32 && x4<=31) && (y4>=-32 && y4<=31)); +} + +static inline int mvd2index(int px, int py, int x, int y, int xy) +{ + + if((x<-32 && x>31) || (y<-32 && y>31)) + fprintf(stderr, "(%d,%d)\n", x,y); + assert((x>=-32 && x<=31) && (y>=-32 && y<=31)); + //assert((x&1)==0 && (y&1)==0);//for now + //assert((x&2)==0 && (y&2)==0);//for now(2) + + x-=px; + y-=py; + + if(xy) + x=y; + x+=32; + + /* (x&63) */ + if(x>63) + x-=64; + if(x<0) + x+=64; + + assert(x>=0 && x<64); + return x; +} + +typedef struct _iblockdata_t +{ + block_t b; //transformed quantized coefficients + block_t reconstruction; + int bits; + int bx,by; + struct huffcode*ctable; //table to use for chrominance encoding (different for i-frames) + int iframe; // 1 if this is part of an iframe +} iblockdata_t; + +typedef struct _mvdblockdata_t +{ + block_t b; + block_t fbold; + block_t reconstruction; + int xindex; + int yindex; + int movex; + int movey; + int bits; + int bx,by; +} mvdblockdata_t; + +void prepareIBlock(VIDEOSTREAM*s, iblockdata_t*data, int bx, int by, block_t* fb, int*bits, int iframe) +{ + /* consider I-block */ + block_t fb_i; + block_t b; + int y,c; + struct huffcode*ctable; + + data->bx = bx; + data->by = by; + + data->iframe = iframe; + if(!iframe) { + data->ctable = &mcbpc_inter[3*4]; + } else { + data->ctable = &mcbpc_intra[0]; + } + + memcpy(&fb_i, fb, sizeof(block_t)); + dodctandquant(&fb_i, &data->b, 1, s->quant); + getblockpatterns(&data->b, &y, &c, 1); + *bits = 0; + if(!data->iframe) { + *bits += 1; //cod + } + *bits += data->ctable[c].len; + *bits += cbpy[y].len; + *bits += coefbits8x8(data->b.y1, 1); + *bits += coefbits8x8(data->b.y2, 1); + *bits += coefbits8x8(data->b.y3, 1); + *bits += coefbits8x8(data->b.y4, 1); + *bits += coefbits8x8(data->b.u, 1); + *bits += coefbits8x8(data->b.v, 1); + data->bits = *bits; + + /* -- reconstruction -- */ + memcpy(&data->reconstruction,&data->b,sizeof(block_t)); + dequantize(&data->reconstruction, 1, s->quant); + doidct(&data->reconstruction); + truncateblock(&data->reconstruction); +} + +int writeIBlock(VIDEOSTREAM*s, TAG*tag, iblockdata_t*data) +{ + int c = 0, y = 0; + int has_dc=1; + int bits = 0; + block_t b; + + getblockpatterns(&data->b, &y, &c, has_dc); + if(!data->iframe) { + swf_SetBits(tag,0,1); bits += 1; // COD + } + bits += codehuffman(tag, data->ctable, c); + bits += codehuffman(tag, cbpy, y); + + /* luminance */ + bits += encode8x8(tag, data->b.y1, has_dc, y&8); + bits += encode8x8(tag, data->b.y2, has_dc, y&4); + bits += encode8x8(tag, data->b.y3, has_dc, y&2); + bits += encode8x8(tag, data->b.y4, has_dc, y&1); + + /* chrominance */ + bits += encode8x8(tag, data->b.u, has_dc, c&2); + bits += encode8x8(tag, data->b.v, has_dc, c&1); + + copy_block_pic(s, s->current, &data->reconstruction, data->bx, data->by); + assert(data->bits == bits); + return bits; +} + +int getmvdbits(VIDEOSTREAM*s,block_t*fb, int bx,int by,int hx,int hy) +{ + block_t b; + block_t fbold; + block_t fbdiff; + int bits = 0; + memcpy(&fbdiff, fb, sizeof(block_t)); + getmvdregion(&fbold, s->oldpic, bx, by, hx, hy, s->linex); + yuvdiff(&fbdiff, &fbold); + dodctandquant(&fbdiff, &b, 0, s->quant); + bits += coefbits8x8(b.y1, 0); + bits += coefbits8x8(b.y2, 0); + bits += coefbits8x8(b.y3, 0); + bits += coefbits8x8(b.y4, 0); + bits += coefbits8x8(b.u, 0); + bits += coefbits8x8(b.v, 0); + return bits; +} + +void prepareMVDBlock(VIDEOSTREAM*s, mvdblockdata_t*data, int bx, int by, block_t* fb, int*bits) +{ /* consider mvd(x,y)-block */ + + int t; + int y,c; + block_t fbdiff; + int predictmvdx; + int predictmvdy; + + data->bx = bx; + data->by = by; + predictmvd(s,bx,by,&predictmvdx,&predictmvdy); + + data->bits = 65535; + data->movex=0; + data->movey=0; + + if(s->do_motion) { + int hx,hy; + int bestx=0,besty=0,bestbits=65536; + int startx=-32,endx=31; + int starty=-32,endy=31; + + if(!bx) startx=0; + if(!by) starty=0; + if(bx==s->bbx-1) endx=0; + if(by==s->bby-1) endy=0; + + for(hx=startx;hx<=endx;hx+=4) + for(hy=starty;hy<=endy;hy+=4) + { + int bits = 0; + bits = getmvdbits(s,fb,bx,by,hx,hy); + if(bits startx) startx = bestx-3; + if(besty-3 > starty) starty = besty-3; + if(bestx+3 < endx) endx = bestx+3; + if(besty+3 < endy) endy = besty+3; + + for(hx=startx;hx<=endx;hx++) + for(hy=starty;hy<=endy;hy++) + { + int bits = 0; + bits = getmvdbits(s,fb,bx,by,hx,hy); + if(bitsmovex = bestx; + data->movey = besty; + } + + memcpy(&fbdiff, fb, sizeof(block_t)); + getmvdregion(&data->fbold, s->oldpic, bx, by, data->movex, data->movey, s->linex); + yuvdiff(&fbdiff, &data->fbold); + dodctandquant(&fbdiff, &data->b, 0, s->quant); + getblockpatterns(&data->b, &y, &c, 0); + + data->xindex = mvd2index(predictmvdx, predictmvdy, data->movex, data->movey, 0); + data->yindex = mvd2index(predictmvdx, predictmvdy, data->movex, data->movey, 1); + + *bits = 1; //cod + *bits += mcbpc_inter[0*4+c].len; + *bits += cbpy[y^15].len; + *bits += mvd[data->xindex].len; // (0,0) + *bits += mvd[data->yindex].len; + *bits += coefbits8x8(data->b.y1, 0); + *bits += coefbits8x8(data->b.y2, 0); + *bits += coefbits8x8(data->b.y3, 0); + *bits += coefbits8x8(data->b.y4, 0); + *bits += coefbits8x8(data->b.u, 0); + *bits += coefbits8x8(data->b.v, 0); + data->bits = *bits; + + /* -- reconstruction -- */ + memcpy(&data->reconstruction, &data->b, sizeof(block_t)); + dequantize(&data->reconstruction, 0, s->quant); + doidct(&data->reconstruction); + for(t=0;t<64;t++) { + data->reconstruction.y1[t] = + truncate256(data->reconstruction.y1[t] + (int)data->fbold.y1[t]); + data->reconstruction.y2[t] = + truncate256(data->reconstruction.y2[t] + (int)data->fbold.y2[t]); + data->reconstruction.y3[t] = + truncate256(data->reconstruction.y3[t] + (int)data->fbold.y3[t]); + data->reconstruction.y4[t] = + truncate256(data->reconstruction.y4[t] + (int)data->fbold.y4[t]); + data->reconstruction.u[t] = + truncate256(data->reconstruction.u[t] + (int)data->fbold.u[t]); + data->reconstruction.v[t] = + truncate256(data->reconstruction.v[t] + (int)data->fbold.v[t]); + } +} + +int writeMVDBlock(VIDEOSTREAM*s, TAG*tag, mvdblockdata_t*data) +{ + int c = 0, y = 0; + int t; + int has_dc=0; // mvd w/o mvd24 + /* mvd (0,0) block (mode=0) */ + int mode = 0; + int bx = data->bx; + int by = data->by; + int bits = 0; + + getblockpatterns(&data->b, &y, &c, has_dc); + swf_SetBits(tag,0,1); bits += 1; // COD + bits += codehuffman(tag, mcbpc_inter, mode*4+c); + bits += codehuffman(tag, cbpy, y^15); + + /* vector */ + bits += codehuffman(tag, mvd, data->xindex); + bits += codehuffman(tag, mvd, data->yindex); + + /* luminance */ + bits += encode8x8(tag, data->b.y1, has_dc, y&8); + bits += encode8x8(tag, data->b.y2, has_dc, y&4); + bits += encode8x8(tag, data->b.y3, has_dc, y&2); + bits += encode8x8(tag, data->b.y4, has_dc, y&1); + + /* chrominance */ + bits += encode8x8(tag, data->b.u, has_dc, c&2); + bits += encode8x8(tag, data->b.v, has_dc, c&1); + + s->mvdx[by*s->bbx+bx] = data->movex; + s->mvdy[by*s->bbx+bx] = data->movey; + + copy_block_pic(s, s->current, &data->reconstruction, data->bx, data->by); + assert(data->bits == bits); + return bits; +} + +static int encode_PFrame_block(TAG*tag, VIDEOSTREAM*s, int bx, int by) +{ + block_t fb; + int diff1,diff2; + int bits_i; + int bits_vxy; + + iblockdata_t iblock; + mvdblockdata_t mvdblock; + + getregion(&fb, s->current, bx, by, s->linex); + prepareIBlock(s, &iblock, bx, by, &fb, &bits_i, 0); + + /* encoded last frame <=> original current block: */ + diff1 = compare_pic_pic(s, s->current, s->oldpic, bx, by); + /* encoded current frame <=> original current block: */ + diff2 = compare_pic_block(s, &iblock.reconstruction, s->current, bx, by); + + if(diff1 <= diff2) { + swf_SetBits(tag, 1,1); /* cod=1, block skipped */ + /* copy the region from the last frame so that we have a complete reconstruction */ + copyregion(s, s->current, s->oldpic, bx, by); + return 1; + } + prepareMVDBlock(s, &mvdblock, bx, by, &fb, &bits_vxy); + + if(bits_i > bits_vxy) { + return writeMVDBlock(s, tag, &mvdblock); + } else { + return writeIBlock(s, tag, &iblock); + } +} + +/* should be called encode_IFrameBlock */ +static void encode_IFrame_block(TAG*tag, VIDEOSTREAM*s, int bx, int by) +{ + block_t fb; + iblockdata_t data; + int bits; + + getregion(&fb, s->current, bx, by, s->width); + prepareIBlock(s, &data, bx, by, &fb, &bits, 1); + writeIBlock(s, tag, &data); +} + +#ifdef MAIN +static int bmid = 0; + +void setdbgpic(TAG*tag, RGBA*pic, int width, int height) +{ + MATRIX m; + tag = tag->prev; + + tag = swf_InsertTag(tag,ST_REMOVEOBJECT2); + swf_SetU16(tag, 133); + + tag = swf_InsertTag(tag, ST_DEFINEBITSLOSSLESS); + swf_SetU16(tag, 1000+bmid); + swf_SetLosslessBits(tag, width, height, (void*)pic, BMF_32BIT); + + tag = swf_InsertTag(tag, ST_DEFINESHAPE); + swf_SetU16(tag, 2000+bmid); + swf_ShapeSetBitmapRect(tag, 1000+bmid, width, height); + + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_GetMatrix(0,&m); + m.tx = width*20; + swf_ObjectPlace(tag, 2000+bmid, 133, &m, 0, 0); + + bmid++; +} +#endif + +#define TYPE_IFRAME 0 +#define TYPE_PFRAME 1 + +static void writeHeader(TAG*tag, int width, int height, int frame, int quant, int type) +{ + U32 i32; + swf_SetU16(tag, frame); + swf_SetBits(tag, 1, 17); /* picture start code*/ + swf_SetBits(tag, 0, 5); /* version=0, version 1 would optimize rle behaviour*/ + swf_SetBits(tag, frame, 8); /* time reference */ + + /* write dimensions, taking advantage of some predefined sizes + if the opportunity presents itself */ + i32 = width<<16|height; + switch(i32) + { + case 352<<16|288: swf_SetBits(tag, 2, 3);break; + case 176<<16|144: swf_SetBits(tag, 3, 3);break; + case 128<<16|96: swf_SetBits(tag, 4, 3);break; + case 320<<16|240: swf_SetBits(tag, 5, 3);break; + case 160<<16|120: swf_SetBits(tag, 6, 3);break; + default: + if(width>255 || height>255) { + swf_SetBits(tag, 1, 3); + swf_SetBits(tag, width, 16); + swf_SetBits(tag, height, 16); + } else { + swf_SetBits(tag, 0, 3); + swf_SetBits(tag, width, 8); + swf_SetBits(tag, height, 8); + } + } + + swf_SetBits(tag, type, 2); /* I-Frame or P-Frame */ + swf_SetBits(tag, 0, 1); /* No deblock filter */ + assert(quant>0); + assert(quant<32); + swf_SetBits(tag, quant, 5); /* quantizer (1-31), may be updated later on*/ + swf_SetBits(tag, 0, 1); /* No extra info */ +} + +void swf_SetVideoStreamIFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant) +{ + int bx, by; + + if(quant<1) quant=1; + if(quant>31) quant=31; + s->quant = quant; + + writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_IFRAME); + + /* fixme: should fill with 0,128,128, not 0,0,0 */ + memset(s->current, 0, s->linex*s->height*sizeof(YUV)); + + rgb2yuv(s->current, pic, s->linex, s->olinex, s->owidth, s->oheight); + + for(by=0;bybby;by++) + { + for(bx=0;bxbbx;bx++) + { + encode_IFrame_block(tag, s, bx, by); + } + } + s->frame++; + memcpy(s->oldpic, s->current, s->width*s->height*sizeof(YUV)); +} +void swf_SetVideoStreamBlackFrame(TAG*tag, VIDEOSTREAM*s) +{ + int bx, by; + int quant = 31; + int x,y; + s->quant = quant; + + writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_IFRAME); + + for(y=0;yheight;y++) + for(x=0;xwidth;x++) { + s->current[y*s->width+x].y = 0; + s->current[y*s->width+x].u = 128; + s->current[y*s->width+x].v = 128; + } + for(x=0;x<16;x++) + for(y=0;y<16;y++) { + s->current[y*s->width+x].y = 64; + s->current[y*s->width+x].u = 128; + s->current[y*s->width+x].v = 128; + } + + for(by=0;bybby;by++) + { + for(bx=0;bxbbx;bx++) + { + encode_IFrame_block(tag, s, bx, by); + } + } + s->frame++; + memcpy(s->oldpic, s->current, s->width*s->height*sizeof(YUV)); +} + +void swf_SetVideoStreamPFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant) +{ + int bx, by; + + if(quant<1) quant=1; + if(quant>31) quant=31; + s->quant = quant; + + writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_PFRAME); + + /* fixme: should fill with 0,128,128, not 0,0,0 */ + memset(s->current, 0, s->linex*s->height*sizeof(YUV)); + + rgb2yuv(s->current, pic, s->linex, s->olinex, s->owidth, s->oheight); + memset(s->mvdx, 0, s->bbx*s->bby*sizeof(int)); + memset(s->mvdy, 0, s->bbx*s->bby*sizeof(int)); + + for(by=0;bybby;by++) + { + for(bx=0;bxbbx;bx++) + { + encode_PFrame_block(tag, s, bx, by); + } + } + s->frame++; + memcpy(s->oldpic, s->current, s->width*s->height*sizeof(YUV)); + +#ifdef MAIN +#ifdef PNG + yuv2rgb(pic, s->current, s->linex, s->width, s->height); + setdbgpic(tag, pic, s->width, s->height); +#endif +#endif +} + +void swf_SetVideoStreamMover(TAG*tag, VIDEOSTREAM*s, signed char* movex, signed char* movey, void**pictures, int quant) +{ + int bx, by; + YUV pic[16*16]; + + if(quant<1) quant=1; + if(quant>31) quant=31; + s->quant = quant; + + writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_PFRAME); + + memset(s->mvdx, 0, s->bbx*s->bby*sizeof(int)); + memset(s->mvdy, 0, s->bbx*s->bby*sizeof(int)); + + for(by=0;bybby;by++) + { + for(bx=0;bxbbx;bx++) + { + int predictmvdx=0, predictmvdy=0; + int mvx=movex[by*s->bbx+bx]; + int mvy=movey[by*s->bbx+bx]; + void*picture = pictures?pictures[by*s->bbx+bx]:0; + + if(mvx<-32) mvx=-32; + if(mvx>31) mvx=31; + if(mvy<-32) mvy=-32; + if(mvy>31) mvy=31; + + if(mvx == 0 && mvy == 0 && picture == 0) { + swf_SetBits(tag,1,1); // COD skip + } else { + int mode = 0; + int has_dc=0; + int y=0,c=0; + block_t b; + block_t b2; + + swf_SetBits(tag,0,1); // COD + + if(mvx==0 && mvy==0 && picture) { // only picture + mode = 3; + has_dc = 1; + } + + if(picture) { + RGBA* picblock = (RGBA*)picture; + rgb2yuv(pic, picblock,16,16,16,16); + /* TODO: if has_dc!=1, subtract 128 from rgb values */ + getregion(&b, pic, 0,0,16); + dodctandquant(&b, &b2, 1, s->quant); + getblockpatterns(&b2, &y, &c, 1); + } else { + y=0;c=0; + } + + codehuffman(tag, mcbpc_inter, mode*4+c); + codehuffman(tag, cbpy, mode==3?y:y^15); + + if(mode < 3) { + /* has motion vector */ + predictmvd(s,bx,by,&predictmvdx,&predictmvdy); + codehuffman(tag, mvd, mvd2index(predictmvdx, predictmvdy, mvx, mvy, 0)); + codehuffman(tag, mvd, mvd2index(predictmvdx, predictmvdy, mvx, mvy, 1)); + s->mvdx[by*s->bbx+bx] = mvx; + s->mvdy[by*s->bbx+bx] = mvy; + } + + if(has_dc||y||c) { + encode8x8(tag, b2.y1, has_dc, y&8); + encode8x8(tag, b2.y2, has_dc, y&4); + encode8x8(tag, b2.y3, has_dc, y&2); + encode8x8(tag, b2.y4, has_dc, y&1); + encode8x8(tag, b2.u, has_dc, c&2); + encode8x8(tag, b2.v, has_dc, c&1); + } + } + } + } + s->frame++; +} + +#define TESTS +#ifdef TESTS +void test_copy_diff() +{ + VIDEOSTREAM stream; + VIDEOSTREAM* s = &stream; + TAG*tag; + RGBA*pic = (RGBA*)rfx_alloc(256*256*sizeof(RGBA)); + block_t fb; + int x,y; + int bx,by; + for(x=0;x<256;x++) + for(y=0;y<256;y++) { + pic[y*256+x].r = x*y; + pic[y*256+x].g = x+y; + pic[y*256+x].b = (x+1)%(y+1); + } + tag = swf_InsertTag(0, ST_DEFINEVIDEOSTREAM); + swf_SetU16(tag, 33); + swf_SetVideoStreamDefine(tag, s, 10, 256, 256); + + rgb2yuv(s->current, pic, s->linex, s->olinex, s->owidth, s->oheight); + for(by=0;by<16;by++) + for(bx=0;bx<16;bx++) { + int diff1,diff2; + /* test1: does compare pic pic return zero for identical blocks? */ + diff1 = compare_pic_pic(s, s->current, s->current, bx, by); + assert(!diff1); + /* test2: do blocks which are copied back return zero diff? */ + getregion(&fb, s->current, bx, by, s->linex); + copy_block_pic(s, s->oldpic, &fb, bx, by); + diff1 = compare_pic_block(s, &fb, s->oldpic, bx, by); + assert(!diff1); + /* test3: does compare_pic_block return the same result as compare_pic_pic? */ + getregion(&fb, s->current, 15-bx, 15-by, s->linex); + copy_block_pic(s, s->oldpic, &fb, bx, by); + diff1 = compare_pic_block(s, &fb, s->current, bx, by); + diff2 = compare_pic_pic(s, s->current, s->oldpic, bx, by); + assert(diff1 == diff2); + } +} + +#endif + +#ifdef MAIN +#include "png.h" + +int compileSWFActionCode(const char *script, int version, void**data, int*len) {return 0;} + +void mkblack() +{ + SWF swf; + SWFPLACEOBJECT obj; + int frames = 88; + int width = 160; + int height = 112; + int x,y; + TAG*tag = 0; + RGBA rgb; + RGBA* pic = 0; + VIDEOSTREAM stream; + + pic = rfx_calloc(width*height*4); + + memset(&swf,0,sizeof(SWF)); + memset(&obj,0,sizeof(obj)); + + swf.fileVersion = 6; + swf.frameRate = 15*256; + swf.movieSize.xmax = 20*width; + swf.movieSize.ymax = 20*height; + + swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + tag = swf.firstTag; + rgb.r = 0x00;rgb.g = 0x30;rgb.b = 0xff; + swf_SetRGB(tag,&rgb); + + tag = swf_InsertTag(tag, ST_DEFINEVIDEOSTREAM); + swf_SetU16(tag, 1); + swf_SetVideoStreamDefine(tag, &stream, frames, width, height); + stream.do_motion = 0; + + for(y=0;y +#include +#include +#include "jpeg.h" +#include "../config.h" + +#ifdef HAVE_JPEGLIB +#define HAVE_BOOLEAN +#include + +#define OUTBUFFER_SIZE 0x8000 + +static FILE*fi; +static JOCTET * buffer; +static unsigned char*dest; +static int len; +static int destlen; +static unsigned char*data; +static int pos; +static int size; + +static void file_init_destination(j_compress_ptr cinfo) +{ + struct jpeg_destination_mgr*dmgr = + (struct jpeg_destination_mgr*)(cinfo->dest); + buffer = (JOCTET*)malloc(OUTBUFFER_SIZE); + if(!buffer) { + perror("malloc"); + printf("Out of memory!\n"); + exit(1); + } + dmgr->next_output_byte = buffer; + dmgr->free_in_buffer = OUTBUFFER_SIZE; +} + +static boolean file_empty_output_buffer(j_compress_ptr cinfo) +{ + struct jpeg_destination_mgr*dmgr = + (struct jpeg_destination_mgr*)(cinfo->dest); + if(fi) + fwrite(buffer, OUTBUFFER_SIZE, 1, fi); + dmgr->next_output_byte = buffer; + dmgr->free_in_buffer = OUTBUFFER_SIZE; + return 1; +} + +static void file_term_destination(j_compress_ptr cinfo) +{ struct jpeg_destination_mgr*dmgr = + (struct jpeg_destination_mgr*)(cinfo->dest); + if(fi) + fwrite(buffer, OUTBUFFER_SIZE-dmgr->free_in_buffer, 1, fi); + free(buffer); + buffer = 0; + dmgr->free_in_buffer = 0; +} + +static void mem_init_destination(j_compress_ptr cinfo) +{ + struct jpeg_destination_mgr*dmgr = + (struct jpeg_destination_mgr*)(cinfo->dest); + dmgr->next_output_byte = dest; + dmgr->free_in_buffer = destlen; +} + +static boolean mem_empty_output_buffer(j_compress_ptr cinfo) +{ + printf("jpeg mem overflow!\n"); + exit(1); +} + +static void mem_term_destination(j_compress_ptr cinfo) +{ + struct jpeg_destination_mgr*dmgr = + (struct jpeg_destination_mgr*)(cinfo->dest); + len = destlen - dmgr->free_in_buffer; + dmgr->free_in_buffer = 0; +} + +int jpeg_save(unsigned char*data, unsigned width, unsigned height, int quality, const char*filename) +{ + struct jpeg_destination_mgr mgr; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + int t; + + if(filename) + fi = fopen(filename, "wb"); + else + fi = 0; + + memset(&cinfo, 0, sizeof(cinfo)); + memset(&jerr, 0, sizeof(jerr)); + memset(&mgr, 0, sizeof(mgr)); + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + + mgr.init_destination = file_init_destination; + mgr.empty_output_buffer = file_empty_output_buffer; + mgr.term_destination = file_term_destination; + cinfo.dest = &mgr; + + // init compression + + cinfo.image_width = width; + cinfo.image_height = height; + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo,quality,TRUE); + + //jpeg_write_tables(&cinfo); + //jpeg_suppress_tables(&cinfo, TRUE); + jpeg_start_compress(&cinfo, FALSE); + + for(t=0;tsrc; + mgr->next_input_byte = data; + mgr->bytes_in_buffer = size; + //printf("init %d\n", size - mgr->bytes_in_buffer); +} + +boolean mem_fill_input_buffer (j_decompress_ptr cinfo) +{ + struct jpeg_source_mgr* mgr = cinfo->src; + printf("fill %d\n", size - mgr->bytes_in_buffer); + return 0; +} + +void mem_skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + struct jpeg_source_mgr* mgr = cinfo->src; + printf("skip %d +%ld\n", size - mgr->bytes_in_buffer, num_bytes); + if(num_bytes<=0) + return; + mgr->next_input_byte += num_bytes; + mgr->bytes_in_buffer -= num_bytes; +} + +boolean mem_resync_to_restart (j_decompress_ptr cinfo, int desired) +{ + struct jpeg_source_mgr* mgr = cinfo->src; + printf("resync %d\n", size - mgr->bytes_in_buffer); + mgr->next_input_byte = data; + mgr->bytes_in_buffer = size; + return 1; +} + +void mem_term_source (j_decompress_ptr cinfo) +{ + struct jpeg_source_mgr* mgr = cinfo->src; + //printf("term %d\n", size - mgr->bytes_in_buffer); +} + +int jpeg_load_from_mem(unsigned char*_data, int _size, unsigned char**dest, unsigned*width, unsigned*height) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_source_mgr mgr; + + data = _data; + size = _size; + + jpeg_create_decompress(&cinfo); + + mgr.next_input_byte = data; + mgr.bytes_in_buffer = size; + mgr.init_source =mem_init_source ; + mgr.fill_input_buffer =mem_fill_input_buffer ; + mgr.skip_input_data =mem_skip_input_data ; + mgr.resync_to_restart =mem_resync_to_restart ; + mgr.term_source =mem_term_source ; + + cinfo.err = jpeg_std_error(&jerr); + cinfo.src = &mgr; + + jpeg_read_header(&cinfo, TRUE); + cinfo.out_color_space == JCS_RGB; + jpeg_start_decompress(&cinfo); + + *width = cinfo.output_width; + *height = cinfo.output_height; + *dest = malloc(cinfo.output_width * cinfo.output_height * 4); + + unsigned char*scanline = malloc(cinfo.output_width * 4); + int y; + for(y=0;y 0xffffffff) { + *_width = 0; + *_height = 0; + return 0; + } + *dest = (unsigned char*)malloc(image_size); + + int y; + for (y=0;y= 0; x--) { + line[x].a = 255; + line[x].r = js[x*3+0]; + line[x].g = js[x*3+1]; + line[x].b = js[x*3+2]; + } + } else if (cinfo.out_color_space == JCS_YCCK) { + fprintf(stderr, "Error: Can't convert YCCK to RGB.\n"); + return 0; + } else if (cinfo.out_color_space == JCS_YCbCr) { + for (x = 0; x < width; x++) { + int y = js[x * 3 + 0]; + int u = js[x * 3 + 1]; + int v = js[x * 3 + 1]; + line[x].a = 255; + line[x].r = y + ((360 * (v - 128)) >> 8); + line[x].g = y - ((88 * (u - 128) + 183 * (v - 128)) >> 8); + line[x].b = y + ((455 * (u - 128)) >> 8); + } + } else if (cinfo.out_color_space == JCS_CMYK) { + for (x = 0; x < width; x++) { + int white = 255 - js[x * 4 + 3]; + line[x].a = 255; + line[x].r = white - ((js[x * 4] * white) >> 8); + line[x].g = white - ((js[x * 4 + 1] * white) >> 8); + line[x].b = white - ((js[x * 4 + 2] * white) >> 8); + } + } + } + + free(scanline); + + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + fclose(fi); + return 1; +} + +void jpeg_get_size(const char *filename, unsigned *width, unsigned*height) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + FILE *fi; + *width = 0; + *height = 0; + cinfo.err = jpeg_std_error(&jerr); + cinfo.image_width = 0; + cinfo.image_height = 0; + jpeg_create_decompress(&cinfo); + if ((fi = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "couldn't open %s\n", filename); + return; + } + jpeg_stdio_src(&cinfo, fi); + jpeg_read_header(&cinfo, TRUE); + *width = cinfo.image_width; + *height = cinfo.image_height; + jpeg_destroy_decompress(&cinfo); + fclose(fi); +} + +#else + +int jpeg_save(unsigned char*data, unsigned width, unsigned height, int quality, const char*filename) +{ + fprintf(stderr, "jpeg_save: No JPEG support compiled in\n"); + return 0; +} +int jpeg_save_to_file(unsigned char*data, unsigned width, unsigned height, int quality, FILE*fi) +{ + fprintf(stderr, "jpeg_save_to_file: No JPEG support compiled in\n"); + return 0; +} +int jpeg_save_to_mem(unsigned char*data, unsigned width, unsigned height, int quality, unsigned char*dest, int destsize) +{ + fprintf(stderr, "jpeg_save_tomem: No JPEG support compiled in\n"); + return 0; +} +int jpeg_load_from_mem(unsigned char*_data, int size, unsigned char**dest, unsigned*width, unsigned*height) +{ + fprintf(stderr, "jpeg_load_from_mem: No JPEG support compiled in\n"); + return 0; +} +int jpeg_load(const char*filename, unsigned char**dest, unsigned*_width, unsigned*_height) +{ + fprintf(stderr, "jpeg_load: No JPEG support compiled in\n"); + return 0; +} +void jpeg_get_size(const char *fname, unsigned *width, unsigned *height) +{ + *width = 0; + *height = 0; + fprintf(stderr, "jpeg_get_size: No JPEG support compiled in\n"); +} + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/jpeg.h b/fluidbook/tools/swftools-special-swfdump/lib/jpeg.h new file mode 100644 index 000000000..c6ef30b26 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/jpeg.h @@ -0,0 +1,22 @@ +#ifndef __jpeg_h__ +#define __jpeg_h__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int jpeg_save(unsigned char*data, unsigned int width, unsigned int height, int quality, const char*filename); +int jpeg_save_gray(unsigned char*data, unsigned int width, unsigned int height, int quality, const char*filename); +int jpeg_save_to_file(unsigned char*data, unsigned int width, unsigned int height, int quality, FILE*fi); +int jpeg_save_to_mem(unsigned char*data, unsigned int width, unsigned int height, int quality, unsigned char*dest, int destsize); +int jpeg_load(const char*filename, unsigned char**dest, unsigned int*width, unsigned int*height); +int jpeg_load_from_mem(unsigned char*_data, int _size, unsigned char**dest, unsigned int*width, unsigned int*height); +void jpeg_get_size(const char *fname, unsigned int *width, unsigned int *height); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/kdtree.c b/fluidbook/tools/swftools-special-swfdump/lib/kdtree.c new file mode 100644 index 000000000..b3e8ae44e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/kdtree.c @@ -0,0 +1,507 @@ +/* kdtree.c + Implementation of 2d kd trees. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "q.h" +#include "kdtree.h" + +/* 0=right 1=down 2=left 3=up */ +static int vx_and[4] = {INT_MAX, 0, INT_MAX, 0}; +static int vy_and[4] = {0, INT_MAX, 0, INT_MAX}; +static int vx[4] = {1, 0, -1, 0}; +static int vy[4] = {0, 1, 0, -1}; +static int vsign[4] = {1,1,-1,-1}; +static char* vname[4] = {"right", "down", "left", "up"}; + +kdarea_t* kdarea_new(void*data) +{ + NEW(kdarea_t,area); + area->bbox.xmin = INT_MIN; + area->bbox.ymin = INT_MIN; + area->bbox.xmax = INT_MAX; + area->bbox.ymax = INT_MAX; + area->data = data; + return area; +} + +kdtree_t* kdtree_new() +{ + NEW(kdtree_t,tree); + tree->root = kdarea_new(0); + return tree; +} + +static inline int32_t max32(int32_t v1, int32_t v2) {return v1>v2?v1:v2;} +static inline int32_t min32(int32_t v1, int32_t v2) {return v1type = type; + b->xy = xy; + return b; +} + +kdarea_t*kdbranch_follow(const kdbranch_t*tree, int32_t x, int32_t y) +{ + /* + int follow = 0; + switch(tree->type) { + case KD_LEFT: + follow = (x < tree->xy); + break; + case KD_RIGHT: + follow = (x > tree->xy); + break; + case KD_UP: + follow = (y < tree->xy); + break; + case KD_DOWN: + follow = (y > tree->xy); + break; + } + return &tree->side[follow]; + */ + int32_t s = x*vx[tree->type] + y*vy[tree->type]; + int32_t v = tree->xy*vsign[tree->type]; + if(s == v) + return 0; //point is on the boundary + return tree->side[s < v]; +} + +static kdarea_list_t* kdarea_list_new(kdarea_t*area) +{ + NEW(kdarea_list_t,b); + b->area = area; + b->next = b->prev = b; + return b; +} + +static kdarea_list_t*kdarea_list_concatenate(kdarea_list_t*l1, kdarea_list_t*l2) +{ + if(!l1) return l2; + if(!l2) return l1; + l2->prev->next = l1->next; + l1->next->prev = l2->prev; + l2->prev = l1; + l1->next = l2; + return l1; +} + +static kdbbox_t bbox_for_halfplane(int xy, int dir) +{ + kdbbox_t b = {INT_MIN,INT_MIN,INT_MAX,INT_MAX}; + switch(dir) { + case KD_LEFT: + b.xmax = xy; + break; + case KD_RIGHT: + b.xmin = xy; + break; + case KD_UP: + b.ymax = xy; + break; + case KD_DOWN: + b.ymin = xy; + break; + } + return b; +} + +static kdbbox_t intersect_bbox(const kdbbox_t*box1, const kdbbox_t*box2) +{ + kdbbox_t b = *box1; + if(box2->xmin > b.xmin) + b.xmin = box2->xmin; + if(box2->ymin > b.ymin) + b.ymin = box2->ymin; + if(box2->xmax < b.xmax) + b.xmax = box2->xmax; + if(box2->ymax < b.ymax) + b.ymax = box2->ymax; + if(b.xmin > b.xmax) + b.xmax = b.xmin; + if(b.ymin > b.ymax) + b.ymax = b.ymin; + return b; +} + +static void kdarea_split(kdarea_t*area, int xy, int dir, + int32_t x1, int32_t y1, + int32_t x2, int32_t y2) +{ + if(!area->split) { + kdbranch_t*b = area->split = kdbranch_new(xy, dir); + kdbbox_t b1 = bbox_for_halfplane(xy, dir); + kdbbox_t b2 = bbox_for_halfplane(xy, dir^2); + b->side[0] = kdarea_new(area->data); + b->side[1] = kdarea_new(area->data); + b->side[0]->bbox = intersect_bbox(&area->bbox,&b1); + b->side[1]->bbox = intersect_bbox(&area->bbox,&b2); + memcpy(b->side[0]->neighbors, area->neighbors, sizeof(area->neighbors)); + memcpy(b->side[1]->neighbors, area->neighbors, sizeof(area->neighbors)); + b->side[0]->neighbors[dir^2] = b->side[1]; + b->side[1]->neighbors[dir] = b->side[0]; + area->data = 0; + } else { + kdbranch_t*split = area->split; + kdarea_t*first = kdbranch_follow(split, x1,y1); + kdarea_t*second = kdbranch_follow(split, x2,y2); + + if(!first) { + if(!second) { + /* line is on top of an already existing segment */ + return; + } else { + /* first point is directly on the split */ + kdarea_split(second, xy, dir, x1,y1, x2,y2); + return; + } + } else { + if(!second) { + /* second point is directly on the split */ + kdarea_split(first, xy, dir, x1,y1, x2,y2); + return; + } else if(first == second) { + /* both points are to the same side of this split */ + kdarea_split(first, xy, dir, x1,y1, x2,y2); + return; + } else { + kdarea_split(first, xy, dir, x1,y1, x2,y2); + kdarea_split(second, xy, dir, x1,y1, x2,y2); + return; + } + } + } +} + +static kdarea_list_t* kdarea_filter(kdarea_t*area, int xy, int dir) +{ + if(!area->split) { + return kdarea_list_new(area); + } else { + kdbranch_t*branch = area->split; + if((branch->type^dir) == 0) { + /* both filter as well as branch point into the same direction */ + if(xy*vsign[dir] >= branch->xy*vsign[dir]) { + /* filter splits the primary node. We can skip the other one. */ +#ifdef DEBUG + printf("%p: using %p, skipping %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); +#endif + return kdarea_filter(branch->side[0], xy, dir); + } else { + /* filter splits the secondary node. the primary node is left completely intact, + and returned as such */ +#ifdef DEBUG + printf("%p: expanding %p, filtering %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); +#endif + kdarea_list_t*l1 = kdarea_list_new(branch->side[0]); + kdarea_list_t*l2 = kdarea_filter(branch->side[1], xy, dir); + return kdarea_list_concatenate(l1,l2); + } + } else if((branch->type^dir) == 2) { + /* filter and branch point into opposite directions */ + if(xy*vsign[dir] >= branch->xy*vsign[dir]) { + // filter splits the secondary node. We can skip the primary node. +#ifdef DEBUG + printf("%p: skipping %p, using %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); +#endif + return kdarea_filter(branch->side[1], xy, dir); + } else { + /* filter splits the primary node. the secondary node is left completely intact, + and returned as such */ +#ifdef DEBUG + printf("%p: filtering %p, expanding %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); +#endif + kdarea_list_t*l1 = kdarea_filter(branch->side[0], xy, dir); + kdarea_list_t*l2 = kdarea_list_new(branch->side[1]); + return kdarea_list_concatenate(l1,l2); + } + } else { + /* filter segment is perpendicular to the node */ + return kdarea_list_new(area); + } + } +} + +static kdarea_t* kdarea_find(kdarea_t*node, int x, int y) +{ + while(node) { + if(!node->split) + break; + node = kdbranch_follow(node->split, x,y); + } + return node; +} + +kdarea_t*kdtree_find(kdtree_t*tree, int x, int y) +{ + return kdarea_find(tree->root, x,y); +} + +void kdarea_list_destroy(kdarea_list_t*list) +{ + kdarea_list_t*i = list; + if(i) do { + kdarea_list_t*next = i->next; + free(i); + i = next; + } while(i!=list); +} + +static kdarea_list_t* kdarea_list_add(kdarea_list_t*l, kdarea_t*area) +{ + return kdarea_list_concatenate(l,kdarea_list_new(area)); +} + +static kdarea_list_t* kdarea_all_children(kdarea_t*area, int32_t x1, int32_t y1, int32_t x2, int32_t y2, kdarea_list_t*result) +{ + if(!area->split) { + if(area->bbox.xmin >= x1 && + area->bbox.ymin >= y1 && + area->bbox.xmax <= x2 && + area->bbox.ymax <= y2) { + result = kdarea_list_add(result, area); + } + } else { + result = kdarea_all_children(area->split->side[0], x1, y1, x2, y2, result); + result = kdarea_all_children(area->split->side[1], x1, y1, x2, y2, result); + } + return result; +} + +/* return all areas that are contained in, or partly intersect, the given bounding box */ +kdarea_list_t* kdtree_filter(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, char leafs) +{ + kdarea_list_t*result = 0; + kdarea_list_t*branches1 = kdarea_filter(tree->root, x2, KD_LEFT); + kdarea_list_t*i = branches1; + +#ifdef DEBUG + kdarea_list_t*u = branches1; + if(u) do {printf("%p [%d %d %d %d] is to the left of %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, x2);u = u->next;} while(u!=branches1); +#endif + if(i) do { + kdarea_list_t*branches2 = kdarea_filter(i->area, y2, KD_UP); + kdarea_list_t*j = branches2; + +#ifdef DEBUG + kdarea_list_t*u = branches2; + if(u) do {printf("%p [%d %d %d %d] is above %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, y2);u = u->next;} while(u!=branches2); +#endif + if(j) do { + kdarea_list_t*branches3 = kdarea_filter(j->area, x1, KD_RIGHT); + kdarea_list_t*k = branches3; +#ifdef DEBUG + kdarea_list_t*u = branches3; + if(u) do {printf("%p [%d %d %d %d] is to the right of %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, x1);u = u->next;} while(u!=branches3); +#endif + if(k) do { + kdarea_list_t*branches4 = kdarea_filter(k->area, y1, KD_DOWN); + kdarea_list_t*l = branches4; +#ifdef DEBUG + kdarea_list_t*u = branches4; + if(u) do {printf("%p [%d %d %d %d] is below %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, y1);u = u->next;} while(u!=branches4); +#endif + if(leafs) { + if(l) do { + result = kdarea_list_concatenate(result, kdarea_all_children(l->area, x1, y1, x2, y2, 0)); + l = l->next; + } while(l!=branches4); + kdarea_list_destroy(branches4); + } else { + result = kdarea_list_concatenate(result, l); + } + k = k->next; + } while(k!=branches3); + kdarea_list_destroy(branches3); + j = j->next; + } while(j!=branches2); + kdarea_list_destroy(branches2); + i = i->next; + } while(i!=branches1); + kdarea_list_destroy(branches1); + return result; +} + +static void kdtree_modify_box(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, void*(*f)(void*user,void*data), void*user) +{ + kdarea_split(tree->root, x2, KD_LEFT, x2,y1, x2,y2); + kdarea_split(tree->root, y2, KD_UP, x1,y2, x2,y2); + kdarea_split(tree->root, x1, KD_RIGHT, x1,y1, x1,y2); + kdarea_split(tree->root, y1, KD_DOWN, x1,y1, x2,y1); +#ifdef DEBUG + printf("inserting (%d,%d,%d,%d) %p\n", x1, y1, x2, y2, user); +#endif + kdarea_list_t*l = kdtree_filter(tree, x1, y1, x2, y2, 1); + kdarea_list_t*i = l; + if(l) do { +#ifdef DEBUG + printf("%p [%d,%d,%d,%d], is contained in [%d %d %d %d]\n", i->area, + i->area->bbox.xmin, + i->area->bbox.ymin, + i->area->bbox.xmax, + i->area->bbox.ymax, + x1, y1, x2, y2); +#endif + i->area->data = f(user, i->area->data); + i = i->next; + } while(i!=l); + kdarea_list_destroy(l); +} + +static void* overwrite(void*user, void*data) +{ + return user; +} + +void kdtree_add_box(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, void*data) +{ + kdtree_modify_box(tree, x1, y1, x2, y2, overwrite, data); +} + +kdarea_t*kdarea_neighbor(kdarea_t*area, int dir, int xy) +{ + int x,y; + switch(dir) { + case KD_LEFT: + x = area->bbox.xmin; + y = xy; + break; + case KD_RIGHT: + x = area->bbox.xmax; + y = xy; + break; + case KD_UP: + x = xy; + y = area->bbox.ymin; + break; + case KD_DOWN: + x = xy; + y = area->bbox.ymax; + break; + } + kdarea_t*n = area->neighbors[dir]; + if(!n) + return 0; + return kdarea_find(n, x, y); +} + +static void do_indent(int l) +{ + int i; + for(i=0;itype], branch->xy); + kdbbox_t b = bbox_for_halfplane(branch->xy, branch->type); + kdarea_print(branch->side[0], indent+4); + kdarea_print(branch->side[1], indent+4); +} + +void kdarea_print(kdarea_t*area, int indent) +{ + int i; + assert(area); + do_indent(indent);printf("[%p] area (%d,%d,%d,%d) %p (l:%p r:%p u:%p d:%p)\n", area, + area->bbox.xmin, + area->bbox.ymin, + area->bbox.xmax, + area->bbox.ymax, + area->data, + area->neighbors[KD_LEFT], + area->neighbors[KD_RIGHT], + area->neighbors[KD_UP], + area->neighbors[KD_DOWN]); + if(area->split) { + kdbranch_print(area->split, indent+4); + } +} + +void kdtree_print(kdtree_t*tree) +{ + kdarea_print(tree->root, 0); +} + + +void kdbranch_destroy(kdbranch_t*b) +{ + if(b->side[0]) { + kdarea_destroy(b->side[0]); + b->side[0] = 0; + } + if(b->side[1]) { + kdarea_destroy(b->side[1]); + b->side[1] = 0; + } + free(b); +} + +void kdarea_destroy(kdarea_t*area) +{ + if(area->split) { + kdbranch_destroy(area->split); + } + free(area); +} + +void kdtree_destroy(kdtree_t*tree) +{ + kdarea_destroy(tree->root); + tree->root = 0; + free(tree); +} + +#ifdef MAIN +int main() +{ + assert((1^vx[2]) < 0); + + kdtree_t*tree = kdtree_new(); + kdtree_add_box(tree, 10,30,20,40, "hello world"); + kdtree_add_box(tree, 12,50,15,60, "hello world"); + //kdtree_print(tree); + kdarea_t*a = kdtree_find(tree, 15,35); + kdarea_t*left = kdarea_neighbor(a, KD_LEFT, /*y*/35); + kdarea_t*right = kdarea_neighbor(a, KD_RIGHT, /*y*/35); + kdarea_t*up = kdarea_neighbor(a, KD_UP, /*x*/15); + kdarea_t*down = kdarea_neighbor(a, KD_DOWN, /*x*/15); + + a = kdtree_find(tree, 15,25); + assert(!a || !a->data); + a = kdtree_find(tree, 15,45); + assert(!a || !a->data); + a = kdtree_find(tree, 5,35); + assert(!a || !a->data); + a = kdtree_find(tree, 45,35); + assert(!a || !a->data); + + kdtree_destroy(tree); +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/kdtree.h b/fluidbook/tools/swftools-special-swfdump/lib/kdtree.h new file mode 100644 index 000000000..24fb12afe --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/kdtree.h @@ -0,0 +1,98 @@ +/* kdtree.h + Implementation of 2d kd trees. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __kdtree_h__ +#define __kdtree_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* + 3 + A + | + | + 2 <---- ----> 0 + | + | + V + 1 +*/ + +typedef enum {KD_RIGHT=0, KD_DOWN=1, KD_LEFT=2, KD_UP=3} kdtype_t; + +typedef struct _kdbbox { + int32_t xmin, ymin, xmax, ymax; +} kdbbox_t; + +struct _kdbranch; +struct _kdarea; +typedef struct _kdbranch kdbranch_t; +typedef struct _kdarea kdarea_t; + +struct _kdbranch { + kdtype_t type; + kdarea_t*side[2]; + int32_t xy; +}; + +struct _kdarea { + kdarea_t*neighbors[4]; + kdbbox_t bbox; + kdbranch_t*split; + void*data; +}; + +typedef struct _kdtree { + kdarea_t*root; +} kdtree_t; + +/* usually a subset of the tree, e.g. caused by + intersecting the tree with a halfplane */ +typedef struct _kdarea_list { + struct _kdarea_list*next; + struct _kdarea_list*prev; + kdarea_t*area; +} kdarea_list_t; + +kdtree_t* kdtree_new(); +void kdarea_destroy(kdarea_t*area); +void kdbranch_destroy(kdbranch_t*b); +void kdtree_destroy(kdtree_t*tree); +kdarea_t* kdtree_find(kdtree_t*tree, int x, int y); +void kdtree_add_box(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, void*data); +void kdtree_print(kdtree_t*tree); + +kdarea_t*kdarea_neighbor(kdarea_t*area, int dir, int xy); + +#define kdarea_left_neighbor(area, y) (kdarea_neighbor((area), KD_LEFT, (y))) +#define kdarea_right_neighbor(area, y) (kdarea_neighbor((area), KD_RIGHT, (y))) +#define kdarea_top_neighbor(area, x) (kdarea_neighbor((area), KD_TOP, (x))) +#define kdarea_bottom_neighbor(area, x) (kdarea_neighbor((area), KD_BOTTOM, (x))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/log.c b/fluidbook/tools/swftools-special-swfdump/lib/log.c new file mode 100644 index 000000000..c53e1c060 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/log.c @@ -0,0 +1,221 @@ +/* log.c + Logging facilities for displaying information on screen, as well as + (optional) storing it to a file and transmitting it over the network. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#ifdef WIN32 +//#include "stdafx.h" +#include +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +#else +#include +#include +#endif + +#include "log.h" + +int maxloglevel = 1; +static int screenloglevel = 1; +static int fileloglevel = -1; +static FILE *logFile = 0; + +int getScreenLogLevel() +{ + return screenloglevel; +} +int getLogLevel() +{ + return maxloglevel; +} + +void setConsoleLogging(int level) +{ + if(level>maxloglevel) + maxloglevel=level; + screenloglevel = level; +} +void setFileLogging(char*filename, int level, char append) +{ + if(level>maxloglevel) + maxloglevel=level; + if(logFile) { + fclose(logFile);logFile=0; + } + if(filename && level>=0) { + logFile = fopen(filename, append?"ab+":"wb"); + fileloglevel = level; + } else { + logFile = 0; + fileloglevel = 0; + } +} +/* deprecated */ +void initLog(char* filename, int filelevel, char* s00, char* s01, int s02, int screenlevel) +{ + setFileLogging(filename, filelevel, 0); + setConsoleLogging(screenlevel); +} + +void exitLog() +{ + // close file + if(logFile != NULL) { + fclose(logFile); + logFile = 0; + fileloglevel = -1; + screenloglevel = 1; + maxloglevel = 1; + } +} + +static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug","Trace"}; +static int loglevels=7; +static char * logimportance2[]= {" ","FATAL ","ERROR ","WARNING","NOTICE ","VERBOSE","DEBUG ", "TRACE "}; + +static inline void log_str(const char* logString) +{ + char timebuffer[32]; + char* logBuffer; + char dbuffer[9]; + char tbuffer[9]; + int level; + char*lt; + char*gt; + int l; + + logBuffer = (char*)malloc (strlen(logString) + 24 + 15); +#ifndef __NT__ + { + /*time_t t = time(0); + tm*t2 = localtime(t); + strftime(dbuffer, 8, "%m %d", t2); + strftime(tbuffer, 8, "%m %d", t2); + dbuffer[0]=0; //FIXME + tbuffer[0]=0;*/ + time_t t = time(0); + char* a = ctime(&t); + int l = strlen(a); + while(a[l-1] == 13 || a[l-1] == 10) + l--; + a[l]=0; + sprintf(timebuffer, "%s", a); + } +#else + _strdate( dbuffer ); + _strtime( tbuffer ); + sprintf(timebuffer, "%s - %s",dbuffer,tbuffer); +#endif + + // search for field + level = -1; + lt=strchr(logString, '<'); + gt=strchr(logString, '>'); + if(lt && gt && lt=0) + { + logBuffer[l]=0; + l--; + } + + if (level <= screenloglevel) + { + printf("%s\n", logBuffer); + fflush(stdout); + } + + if (level <= fileloglevel) + { + if (logFile != NULL) + { + fprintf(logFile, "%s\r\n", logBuffer); + fflush(logFile); + } + } + + free (logBuffer); +} + +void msg_str(const char* buf) +{ + if(buf[0]=='<') { + char*z = "fewnvdt"; + char*x = strchr(z,buf[1]); + if(x && (x-z)>maxloglevel) + return; + } + log_str(buf); +} + +char char2loglevel[32] = +/* a b c d e f g h i j k l m n o */ +{-1,-1,-1,-1, /*debug*/5, /*error*/1, /*fatal*/0, -1, -1, -1,-1,-1,-1,-1,/*notice*/3,-1, +/* p q r s t u v w x y z */ + -1,-1,-1, -1, /*trace*/6, -1,/*verbose*/4,/*warning*/2, -1,-1,-1, -1,-1,-1,-1,-1}; + +int msg_internal(const char* format, ...) +{ + char buf[1024]; + va_list arglist; + va_start(arglist, format); + + /* speed up hack */ + if(format[0]=='<') { + char*z = "fewnvdt"; + char*x = strchr(z,format[1]); + if(x && (x-z)>maxloglevel) + return 0; + } + + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + strcat(buf, "\n"); + log_str(buf); + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/log.h b/fluidbook/tools/swftools-special-swfdump/lib/log.h new file mode 100644 index 000000000..a467e825c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/log.h @@ -0,0 +1,62 @@ +/* log.h + Header file for log.c. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __log_h__ +#define __log_h__ +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define LOGLEVEL_FATAL 0 +#define LOGLEVEL_ERROR 1 +#define LOGLEVEL_WARNING 2 +#define LOGLEVEL_NOTICE 3 +#define LOGLEVEL_VERBOSE 4 +#define LOGLEVEL_DEBUG 5 +#define LOGLEVEL_TRACE 6 + +extern int getLogLevel(); +extern int getScreenLogLevel(); + +extern void initLog(char* pLogDir, int fileloglevel, char* servAddr, char* logPort, int serverloglevel, int screenloglevel); +extern void setConsoleLogging(int level); +extern void setFileLogging(char*filename, int level, char append); + +extern int maxloglevel; +extern char char2loglevel[32]; + +#define msg(fmt,args...) \ + (((fmt)[0]=='<' && char2loglevel[(fmt)[1]&31]<=maxloglevel)?msg_internal((fmt),## args):0) + +extern int msg_internal(const char* logFormat, ...); +extern void msg_str(const char* log); +extern void exitLog(void); + +#define FIXNULL(a) ((a)?(a):"NULL") + +#ifdef __cplusplus +} +#endif +#endif // __log_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mem.c b/fluidbook/tools/swftools-special-swfdump/lib/mem.c new file mode 100644 index 000000000..6dd58f59c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/mem.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include "mem.h" + +// memory allocation + +void rfx_free(void*ptr) +{ + if(!ptr) + return; + free(ptr); +} + +void start_debugger() +{ + //*(int*)0=0; +} + +void* rfx_alloc(int size) +{ + void*ptr; + if(size == 0) { + //*(int*)0 = 0xdead; + //fprintf(stderr, "Warning: Zero alloc\n"); + return 0; + } + + ptr = malloc(size); + if(!ptr) { + fprintf(stderr, "FATAL: Out of memory (while trying to claim %d bytes)\n", size); + start_debugger(); + exit(1); + } + return ptr; +} +void* rfx_realloc(void*data, int size) +{ + void*ptr; + if(size == 0) { + //*(int*)0 = 0xdead; + //fprintf(stderr, "Warning: Zero realloc\n"); + rfx_free(data); + return 0; + } + if(!data) { + ptr = malloc(size); + } else { + ptr = realloc(data, size); + } + + if(!ptr) { + fprintf(stderr, "FATAL: Out of memory (while trying to claim %d bytes)\n", size); + start_debugger(); + exit(1); + } + return ptr; +} +void* rfx_calloc(int size) +{ + void*ptr; + if(size == 0) { + //*(int*)0 = 0xdead; + //fprintf(stderr, "Warning: Zero alloc\n"); + return 0; + } +#ifdef HAVE_CALLOC + ptr = calloc(1, size); +#else + ptr = malloc(size); +#endif + if(!ptr) { + fprintf(stderr, "FATAL: Out of memory (while trying to claim %d bytes)\n", size); + start_debugger(); + exit(1); + } +#ifndef HAVE_CALLOC + memset(ptr, 0, size); +#endif + return ptr; +} +#ifndef HAVE_CALLOC +void* rfx_calloc_replacement(int nmemb, int size) +{ + rfx_calloc(nmemb*size); +} +#endif + +#ifdef MEMORY_INFO +long rfx_memory_used() +{ +} + +char* rfx_memory_used_str() +{ +} +#endif + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mem.h b/fluidbook/tools/swftools-special-swfdump/lib/mem.h new file mode 100644 index 000000000..e864bbf0b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/mem.h @@ -0,0 +1,27 @@ +#ifndef __mem_h__ +#define __mem_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../config.h" + +#define ALLOC_ARRAY(type, num) (((type)*)rfxalloc(sizeof(type)*(num))) +void* rfx_alloc(int size); +void* rfx_calloc(int size); +void* rfx_realloc(void*data, int size); +void rfx_free(void*data); +#ifndef HAVE_CALLOC +void* rfx_calloc_replacement(int nmemb, int size); +#endif +#ifdef MEMORY_INFO +long rfx_memory_used(); +char* rfx_memory_used_str(); +#endif + +#ifdef __cplusplus +} +#endif + +#endif //__mem_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c new file mode 100644 index 000000000..3d701bbad --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c @@ -0,0 +1,1137 @@ +/* swfaction.c + + Actionscript generation and parsing routines + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "../rfxswf.h" + +#define MAX_LOOKUP 1024 // make cross references in dumps + +struct Action +{ + int version; + char*name; + U8 op; + char*flags; +} static actions[] = +{ +/* +f: frame (word) +u: url (string) +t: target (string) +l: label (string) +C: constant pool header (word) +c: constant pool entry (string) +s: skip (byte) (number of actions) +m: method (byte) swf_GetUrl2:(0=none, 1=get, 2=post)/GotoFrame2:(1=play) +b: branch (word) (number of bytes) +p (push): type(byte), type=0:string, type=1:double +{: define function (name (string), num (word), params (num strings), codesize (word) +o: codesize (word) object (string) +r: register (byte) + */ +{3,"End", 0x00, ""}, +{3,"GotoFrame", 0x81, "f"}, +{4,"GotoFrame2", 0x9f, "m"}, // -1 (/Movieclip:3) +{3,"GetUrl", 0x83, "ul"}, +{4,"GetUrl2", 0x9a, "m"}, //-2 +{3,"NextFrame", 0x04, ""}, +{3,"PreviousFrame", 0x05, ""}, +{3,"Play", 0x06, ""}, +{3,"Stop", 0x07, ""}, +{3,"ToggleQuality", 0x08, ""}, +{3,"StopSounds", 0x09, ""}, +{3,"WaitForFrame", 0x8a, "fs"}, +{4,"WaitForFrame2", 0x8d, "s"}, // -1 +{3,"SetTarget", 0x8b, "t"}, +{4,"SetTarget2", 0x20, ""}, //-1 +{3,"GotoLabel", 0x8c, "l"}, +{4,"Add", 0x0a, ""}, // -2, +1 +{4,"Multiply", 0x0c, ""}, // -2, +1 +{4,"Divide", 0x0d, ""}, // -2, +1 +{4,"Subtract", 0x0b, ""}, // -2, +1 +{4,"Less", 0x0f, ""}, // -2, +1 +{4,"Equals", 0x0e, ""}, // -2, +1 +{4,"And", 0x10, ""}, // -2, +1 +{4,"Or", 0x11, ""}, // -2, +1 +{4,"Not", 0x12, ""}, // -1, +1 +{4,"StringAdd", 0x21, ""}, // -2,+1 +{4,"StringLength", 0x14, ""}, // -1, +1 +{4,"MBStringLength", 0x31, ""}, // -1, +1 +{4,"StringEquals", 0x13, ""}, // -2, +1 +{4,"StringLess", 0x29, ""}, //-2, +1 +{4,"StringExtract", 0x15, ""}, // -3, +1 +{4,"MBStringExtract", 0x35, ""}, //-3 +1 +{4,"Push", 0x96, "p"}, // +1 +{4,"Pop", 0x17, ""}, // -1 +{4,"ToInteger", 0x18, ""}, // -1, +1 +{4,"CharToAscii", 0x32, ""}, // -1, +1 +{4,"AsciiToChar", 0x33, ""}, // -1, +1 +{4,"MBCharToAscii", 0x36, ""}, // -1, +1 +{4,"MBAsciiToChar", 0x37, ""}, // -1, +1 +{4,"Jump", 0x99, "b"}, +{4,"If", 0x9d, "b"}, // -1 +{4,"Call", 0x9e, ""}, //-1 (frame label/number) (high bit is wrong.) +{4,"GetVariable", 0x1c,""}, // -1, +1 +{4,"SetVariable", 0x1d,""}, // -2 +{4,"GetProperty", 0x22,""}, //-2, +1 +{4,"SetProperty", 0x23, ""}, // -3 +{4,"RemoveSprite", 0x25, ""}, //-1 +{4,"StartDrag", 0x27, ""}, // -2, -1, (-4) +{4,"EndDrag", 0x28, ""}, +{4,"CloneSprite", 0x24, ""}, // -3 +{4,"Trace", 0x26, ""}, //-1 +{4,"GetTime", 0x34, ""}, //+1 +{4,"RandomNumber", 0x30, ""}, //-1,+1 +{5,"Modulo", 0x3f,""}, +{5,"BitAnd", 0x60,""}, +{5,"BitLShift", 0x63,""}, +{5,"BitOr", 0x61,""}, +{5,"BitRShift", 0x64,""}, +{5,"BitURShift", 0x65,""}, +{5,"BitXor", 0x62,""},//66? +{5,"Decrement", 0x51,""}, +{5,"Increment", 0x50,""}, +{5,"PushDuplicate", 0x4c,""}, +{5,"StackSwap", 0x4d,""}, //? +{5,"StoreRegister", 0x87,"r"}, +{5,"CallFunction", 0x3d,""}, +{5,"DefineFunction", 0x9b, "{"}, +{5,"Return", 0x3e,""}, +{5,"GetMember", 0x4e,""}, +{5,"SetMember", 0x4f,""}, +{5,"CallMethod", 0x52,""}, +{5,"Constantpool", 0x88, "Cc"}, +{5,"DefineLocal", 0x3c,""}, +{5,"DefineLocal2", 0x41,""}, +{5,"Makehash", 0x43, ""}, //?? +{5,"Delete", 0x3a,""}, //? +{5,"Delete2", 0x3b,""}, +{5,"Enumerate", 0x46,""}, +{5,"Equals2", 0x49,""}, +{5,"InitArray", 0x42,""}, // InitObject? +{5,"NewMethod", 0x53,""}, //? +{5,"NewObject", 0x40,""}, +{5,"TargetPath", 0x45,""}, //? +{5,"With", 0x94, "o"}, +{5,"ToNumber", 0x4a,""}, //? +{5,"ToString", 0x4b,""}, //? +{5,"TypeOf", 0x44,""}, +{5,"Add2", 0x47,""}, +{5,"Less2", 0x48,""}, +{6,"Greater", 0x67,""}, +{6,"StringGreater", 0x68,""}, +{6,"Enumerate2", 0x55,""}, +{6,"InstanceOf", 0x54,""}, +{6,"StrictEquals", 0x66,""} +}; +static int definedactions = sizeof(actions)/sizeof(struct Action); + +ActionTAG* swf_ActionGet(TAG*tag) +{ + U8 op = 1; + int length; + ActionTAG tmp; + ActionTAG*action = &tmp; + U8*data; + while(op) + { + action->next = (ActionTAG*)rfx_calloc(sizeof(ActionTAG)); + action->next->prev = action; + action->next->next = 0; + action->next->parent = tmp.next; + action = action->next; + + op = swf_GetU8(tag); + if(op<0x80) + length = 0; + else + length = swf_GetU16(tag); + + if(length) { + data = (U8*)rfx_alloc(length); + swf_GetBlock(tag, data, length); + } else { + data = 0; + } + action->op = op; + action->len = length; + action->data = data; + } + return tmp.next; +} + +void swf_ActionFree(ActionTAG*action) +{ + if(!action) { + return; + } + action = action->parent; + if(!action) { + fprintf(stderr, "Warning: freeing zero action (no parent)"); + return; + } + + while(action) + { + ActionTAG*tmp; + if(action->data && action->data != action->tmp) { + rfx_free(action->data); + action->data = 0; + } + action->len = 0; + + tmp = action; + action=action->next; + rfx_free(tmp); + } +} + +void swf_ActionSet(TAG*tag, ActionTAG*action) +{ + if(!action) { + return; + } + action=action->parent; + while(action) + { + swf_SetU8(tag, action->op); + if(action->op & 128) + swf_SetU16(tag, action->len); + + swf_SetBlock(tag, action->data, action->len); + + action = action->next; + } +} + +int OpAdvance(char c, U8*data) +{ + switch (c) + { + case 'f': + return 2; + case 'u': + return strlen((const char*)data)+1; + case 't': + return strlen((const char*)data)+1; + case 'l': + return strlen((const char*)data)+1; + case 'c': + return strlen((const char*)data)+1; + case 'C': + return 2; + case 's': + return 1; + case 'm': + return 1; + case 'b': + return 2; + case 'r': + return 1; + case 'p': { + U8 type = *data++; + if(type == 0) { + return 1+strlen((const char*)data)+1; //string + } else if (type == 1) { + return 1+4; //float + } else if (type == 2) { + return 1+0; //NULL + } else if (type == 3) { + return 1+0; //Undefined + } else if (type == 4) { + return 1+1; //register + } else if (type == 5) { + return 1+1; //bool + } else if (type == 6) { + return 1+8; //double + } else if (type == 7) { + return 1+4; //int + } else if (type == 8) { + return 1+1; //lookup + } else if (type == 9) { + return 1+2; //lookup 16 + } else return 1; + break; + } + case 'o': { + return 2; + } + case '{': { + U16 num; + U16 codesize; + U8* odata = data; + int t; + while(*data++); //name + num = (*data++)*256; //num + num += (*data++); + for(t=0;tlen + 1 + ((atag)->op&0x80?2:0)) +#define MAX_LEVELS 16 +/* TODO: * this should be in swfdump.c */ +void swf_DumpActions(ActionTAG*atag, char*prefix) +{ + int t; + U8*data; + char* cp; + int entry = 0; + char spaces[MAX_LEVELS*4+1]; + struct { + char*text; + int count; + } counter[MAX_LEVELS]; + int countpos = 0; +#ifdef MAX_LOOKUP + char * lookup[MAX_LOOKUP]; + memset(lookup,0x00,sizeof(lookup)); +#endif + memset(spaces, 32, sizeof(spaces)); + spaces[sizeof(spaces)-1] = 0; + + if (!prefix) + prefix=""; + + while(atag) + { + char*indent = &spaces[sizeof(spaces)-1-countpos*4]; + U16 poollen = 0; + for(t=0;top) + break; + + if(t==definedactions) { + printf("%s (%5d bytes) action:%s unknown[%02x]", prefix, atag->len, indent, atag->op); + } else { + printf("%s (%5d bytes) action:%s %s", prefix, atag->len, indent, actions[t].name); + } + data = atag->data; + if(atag->len && t!=definedactions) //TODO: check for consistency: should we have a length? + { + cp = actions[t].flags; + while(*cp) + { + switch(*cp) + { + case 'f': { //frame + printf(" %d", data[0]+256*data[1]); + } break; + case 'u': { + printf(" URL:\"%s\"", data); + } break; + case 't': { + printf(" Target:\"%s\"", data); + } break; + case 'l': { + printf(" Label:\"%s\"", data); + } break; + case 'c': { + printf(" String:\"%s\"", data); +#ifdef MAX_LOOKUP + if (entry=15) { + printf("Error: nested too deep\n"); + continue; + } + counter[countpos].text = "}"; + counter[countpos].count = codesize + ATAG_FULLLENGTH(atag); + countpos++; + } break; + case 'o': { + int t; + U16 codesize = data[0]+256*data[1]; + printf(" codesize:%d ", codesize); + + /* the following tries to find the "string" + the flash documentation speaks of- I've + never actually seen one yet. -mk */ + for(t=2;tlen;t++) + printf("[%02x]", atag->data[t]); + + printf("\n%s %s{", prefix, indent); + if(countpos>=15) { + printf("Error: nested too deep\n"); + continue; + } + counter[countpos].text = "}"; + counter[countpos].count = codesize + ATAG_FULLLENGTH(atag); + countpos++; + } break; + case 'b': { + printf(" %d", data[0]+256*(signed char)data[1]); + } break; + case 'r': { + printf(" %d", data[0]); + } break; + case 'p': { + U8 type = *data; + unsigned char*value = data+1; + if(type == 0) { + printf(" String:\"%s\"", value); + } else if (type == 1) { + U32 f = value[0]+(value[1]<<8)+ + (value[2]<<16)+(value[3]<<24); + printf(" Float:%f", *(float*)&f); + } else if (type == 2) { + printf(" NULL"); + } else if (type == 3) { + printf(" Undefined"); + } else if (type == 4) { + printf(" register:%d", *value); + } else if (type == 5) { + printf(" bool:%s", *value?"true":"false"); + } else if (type == 6) { + U8 a[8]; + memcpy(&a[4],value,4); + memcpy(a,&value[4],4); +#ifdef WORDS_BIGENDIAN + int t; + for(t=0;t<4;t++) { + U8 tmp = a[t]; + a[t]=a[7-t]; + a[7-t] = tmp; + } +#endif + printf(" double:%f", *(double*)a); + } else if (type == 7) { + printf(" int:%d", value[0]+(value[1]<<8)+ + (value[2]<<16)+(value[3]<<24)); + } else if (type == 8) { + printf(" Lookup:%d", *value); +#ifdef MAX_LOOKUP + if (lookup[*value]) + printf(" (\"%s\")",lookup[*value]); +#endif + } else if (type == 9) { + U32 offset = value[0]+(value[1]<<8); + printf(" Lookup16:%d", offset); +#ifdef MAX_LOOKUP + if (lookup[offset]) + printf(" (\"%s\")",lookup[offset]); +#endif + } else { + printf(" UNKNOWN[%02x]",type); + } + } break; + } + data += OpAdvance(*cp, data); + if((*cp!='c' || !poollen) && + (*cp!='p' || !(data<&atag->data[atag->len]))) + cp++; + if(poollen) + poollen--; + } + } + + if(data < atag->data + atag->len) + { + int nl = ((atag->data+atag->len)-data); + int t; + printf(" (remainder of %d bytes:\"", nl); + for(t=0;tnext; + } + +#ifdef MAX_LOOKUP + for (t=0;top) + break; + + if(t==definedactions) { + // unknown actiontag + atag = atag->next; + count++; + continue; + } + cp = actions[t].flags; + data = atag->data; + if(atag->len) { + while(*cp) { + U8 * replacepos = 0; + int replacelen = 0; + U8 * replacement = 0; + switch(*cp) + { + case 'u': { + if(type&TYPE_URL) + { + replacelen = strlen((const char*)data); + replacepos = data; + replacement = (U8*)callback((char*)data); // may be null + } + } break; + case 't': { + if(type&TYPE_TARGET) + { + replacelen = strlen((const char*)data); + replacepos = data; + replacement = (U8*)callback((char*)data); // may be null + } + } break; + case 'c': { + if(type&TYPE_STRING) + { + replacelen = strlen((const char*)data); + replacepos = data; + replacement = (U8*)callback((char*)data); // may be null + } + } break; + case 'C': { + poollen = (data[0]+256*data[1]); + } break; + case 'o': { + } break; + case 'p': { + U8 datatype = *data; + char*value = (char*)&data[1]; + if(datatype == 0) { //string + if(type&TYPE_STRING) + { + replacelen = strlen(value); + replacepos = (U8*)value; + replacement = (U8*)callback(value); // may be null + } + } else if (datatype == 8) { //lookup + } + } break; + } + data += OpAdvance(*cp, data); + if(*cp!='c' || !poollen) + cp++; + if(poollen) + poollen--; + + if(replacement) + { + int newlen = strlen((const char *)replacement); + char * newdata = (char*)rfx_alloc(atag->len - replacelen + newlen); + int rpos = replacepos - atag->data; + memcpy(newdata, atag->data, rpos); + memcpy(&newdata[rpos], replacement, newlen); + memcpy(&newdata[rpos+newlen], &replacepos[replacelen], + &data[atag->len] - &replacepos[replacelen]); + rfx_free(atag->data); + atag->data = (U8*)newdata; + data = &atag->data[rpos+newlen+1]; + } + } + } + atag = atag->next; + count ++; + } + return count; +} + +void swf_ActionEnumerateTargets(ActionTAG*atag, char*(*callback)(char*)) +{ + swf_ActionEnumerate(atag, callback, TYPE_TARGET); +} +void swf_ActionEnumerateStrings(ActionTAG*atag, char*(*callback)(char*)) +{ + swf_ActionEnumerate(atag, callback, TYPE_STRING); +} +void swf_ActionEnumerateURLs(ActionTAG*atag, char*(*callback)(char*)) +{ + swf_ActionEnumerate(atag, callback, TYPE_URL); +} + +/*static ActionTAG* swf_ActionStart() +{ + ActionTAG*atag; + atag = (ActionTAG*)rfx_alloc(sizeof(ActionTAG)); + atag->prev = 0; + atag->next = 0; + atag->parent = 0; + atag->data = 0; + atag->len = 0; + return atag; +} + +void swf_ActionEnd(ActionTAG* atag) +{ + ActionTAG*last; + while(atag) { + last = atag; + atag=atag->next; + } + + last->prev->next = 0; + rfx_free(last); +}*/ + +static ActionTAG*lastATAG(ActionTAG*atag) +{ + ActionTAG*last = 0; + while(atag) { + last = atag; + atag=atag->next; + } + return last; +} + +ActionTAG* swf_AddActionTAG(ActionTAG*atag, U8 op, U8*data, U16 len) +{ + ActionTAG*tmp; + tmp = (ActionTAG*)rfx_alloc(sizeof(ActionTAG)); + tmp->next = 0; + if(atag) { + tmp->prev = atag; + atag->next = tmp; + tmp->parent = atag->parent; + } else { + tmp->prev = 0; + tmp->parent = tmp; + } + if(data || !len) { + tmp->data = data; + } else { + tmp->data = tmp->tmp; + } + + tmp->len = len; + tmp->op = op; + return tmp; +} + +ActionMarker action_setMarker(ActionTAG*atag) +{ + ActionMarker m; + m.atag = atag; + return m; +} + +int inline ActionTagSize(ActionTAG*atag) +{ + return (atag->op&0x80)?3+(atag->len):1+0; +} + + +#define ACTION_END 0x00 +#define ACTION_NEXTFRAME 0x04 +#define ACTION_PREVIOUSFRAME 0x05 +#define ACTION_PLAY 0x06 +#define ACTION_STOP 0x07 +#define ACTION_TOGGLEQUALITY 0x08 +#define ACTION_STOPSOUNDS 0x09 +#define ACTION_ADD 0x0a +#define ACTION_SUBTRACT 0x0b +#define ACTION_MULTIPLY 0x0c +#define ACTION_DIVIDE 0x0d +#define ACTION_EQUALS 0x0e +#define ACTION_LESS 0x0f +#define ACTION_AND 0x10 +#define ACTION_OR 0x11 +#define ACTION_NOT 0x12 +#define ACTION_STRINGEQUALS 0x13 +#define ACTION_STRINGLENGTH 0x14 +#define ACTION_STRINGEXTRACT 0x15 +#define ACTION_POP 0x17 +#define ACTION_TOINTEGER 0x18 +#define ACTION_GETVARIABLE 0x1c +#define ACTION_SETVARIABLE 0x1d +#define ACTION_SETTARGET2 0x20 +#define ACTION_STRINGADD 0x21 +#define ACTION_GETPROPERTY 0x22 +#define ACTION_SETPROPERTY 0x23 +#define ACTION_CLONESPRITE 0x24 +#define ACTION_REMOVESPRITE 0x25 +#define ACTION_TRACE 0x26 +#define ACTION_STARTDRAG 0x27 +#define ACTION_ENDDRAG 0x28 +#define ACTION_STRINGLESS 0x29 +#define ACTION_RANDOMNUMBER 0x30 +#define ACTION_MBSTRINGLENGTH 0x31 +#define ACTION_CHARTOASCII 0x32 +#define ACTION_ASCIITOCHAR 0x33 +#define ACTION_GETTIME 0x34 +#define ACTION_MBSTRINGEXTRACT 0x35 +#define ACTION_MBCHARTOASCII 0x36 +#define ACTION_MBASCIITOCHAR 0x37 +#define ACTION_DELETE 0x3a +#define ACTION_DELETE2 0x3b +#define ACTION_DEFINELOCAL 0x3c +#define ACTION_CALLFUNCTION 0x3d +#define ACTION_RETURN 0x3e +#define ACTION_MODULO 0x3f +#define ACTION_NEWOBJECT 0x40 +#define ACTION_DEFINELOCAL2 0x41 +#define ACTION_INITARRAY 0x42 +#define ACTION_MAKEHASH 0x43 +#define ACTION_TYPEOF 0x44 +#define ACTION_TARGETPATH 0x45 +#define ACTION_ENUMERATE 0x46 +#define ACTION_ADD2 0x47 +#define ACTION_LESS2 0x48 +#define ACTION_EQUALS2 0x49 +#define ACTION_TONUMBER 0x4a +#define ACTION_TOSTRING 0x4b +#define ACTION_PUSHDUPLICATE 0x4c +#define ACTION_STACKSWAP 0x4d +#define ACTION_GETMEMBER 0x4e +#define ACTION_SETMEMBER 0x4f +#define ACTION_INCREMENT 0x50 +#define ACTION_DECREMENT 0x51 +#define ACTION_CALLMETHOD 0x52 +#define ACTION_NEWMETHOD 0x53 +#define ACTION_BITAND 0x60 +#define ACTION_BITOR 0x61 +#define ACTION_BITXOR 0x62 +#define ACTION_BITLSHIFT 0x63 +#define ACTION_BITRSHIFT 0x64 +#define ACTION_BITURSHIFT 0x65 +#define ACTION_GOTOFRAME 0x81 +#define ACTION_GETURL 0x83 +#define ACTION_STOREREGISTER 0x87 +#define ACTION_CONSTANTPOOL 0x88 +#define ACTION_WAITFORFRAME 0x8a +#define ACTION_SETTARGET 0x8b +#define ACTION_GOTOLABEL 0x8c +#define ACTION_WAITFORFRAME2 0x8d +#define ACTION_WITH 0x94 +#define ACTION_PUSH 0x96 +#define ACTION_JUMP 0x99 +#define ACTION_GETURL2 0x9a +#define ACTION_DEFINEFUNCTION 0x9b +#define ACTION_IF 0x9d +#define ACTION_CALL 0x9e +#define ACTION_GOTOFRAME2 0x9f + +void action_fixjump(ActionMarker m1, ActionMarker m2) +{ + ActionTAG* a1 = m1.atag; + ActionTAG* a2 = m2.atag; + ActionTAG* a; + int len = 0; + int oplen = 0; + a = a1; + + a = a->next; //first one is free + while(a && a!=a2) + { + len += ActionTagSize(a); + oplen ++; + a = a->next; + } + if(!a) + { len = 0; + oplen = 0; + a = a2; + while(a && a!=a1) { + len -= ActionTagSize(a); + oplen --; + a = a->next; + } + if(!a) { + fprintf(stderr, "action_fixjump: couldn't find second tag\n"); + return; + } + len -= ActionTagSize(a); + oplen --; + } + + if (a1->op == ACTION_IF || a1->op == ACTION_JUMP) + { + *(U16*)(a1->data) = LE_16_TO_NATIVE(len); + } + else if(a1->op == ACTION_WAITFORFRAME) + { + ((U8*)(a1->data))[2] = oplen; + } + else if(a1->op == ACTION_WAITFORFRAME2) + { + ((U8*)(a1->data))[0] = oplen; + } + +} + +ActionTAG* action_NextFrame(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NEXTFRAME, 0, 0);} +ActionTAG* action_PreviousFrame(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_PREVIOUSFRAME, 0, 0);} +ActionTAG* action_Play(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_PLAY, 0, 0);} +ActionTAG* action_Stop(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STOP, 0, 0);} +ActionTAG* action_ToggleQuality(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TOGGLEQUALITY, 0, 0);} +ActionTAG* action_StopSounds(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STOPSOUNDS, 0, 0);} +ActionTAG* action_Add(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ADD, 0, 0);} +ActionTAG* action_Subtract(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SUBTRACT, 0, 0);} +ActionTAG* action_Multiply(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MULTIPLY, 0, 0);} +ActionTAG* action_Divide(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DIVIDE, 0, 0);} +ActionTAG* action_Equals(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_EQUALS, 0, 0);} +ActionTAG* action_Less(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_LESS, 0, 0);} +ActionTAG* action_And(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_AND, 0, 0);} +ActionTAG* action_Or(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_OR, 0, 0);} +ActionTAG* action_Not(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NOT, 0, 0);} +ActionTAG* action_StringEquals(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGEQUALS, 0, 0);} +ActionTAG* action_StringLength(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGLENGTH, 0, 0);} +ActionTAG* action_StringExtract(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGEXTRACT, 0, 0);} +ActionTAG* action_Pop(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_POP, 0, 0);} +ActionTAG* action_ToInteger(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TOINTEGER, 0, 0);} +ActionTAG* action_GetVariable(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETVARIABLE, 0, 0);} +ActionTAG* action_SetVariable(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETVARIABLE, 0, 0);} +ActionTAG* action_SetTarget2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETTARGET2, 0, 0);} +ActionTAG* action_StringAdd(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGADD, 0, 0);} +ActionTAG* action_GetProperty(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETPROPERTY, 0, 0);} +ActionTAG* action_SetProperty(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETPROPERTY, 0, 0);} +ActionTAG* action_CloneSprite(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CLONESPRITE, 0, 0);} +ActionTAG* action_RemoveSprite(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_REMOVESPRITE, 0, 0);} +ActionTAG* action_Trace(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TRACE, 0, 0);} +ActionTAG* action_StartDrag(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STARTDRAG, 0, 0);} +ActionTAG* action_EndDrag(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ENDDRAG, 0, 0);} +ActionTAG* action_StringLess(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGLESS, 0, 0);} +ActionTAG* action_RandomNumber(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_RANDOMNUMBER, 0, 0);} +ActionTAG* action_MBStringLength(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBSTRINGLENGTH, 0, 0);} +ActionTAG* action_CharToAscii(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CHARTOASCII, 0, 0);} +ActionTAG* action_AsciiToChar(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ASCIITOCHAR, 0, 0);} +ActionTAG* action_GetTime(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETTIME, 0, 0);} +ActionTAG* action_MBStringExtract(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBSTRINGEXTRACT, 0, 0);} +ActionTAG* action_MBCharToAscii(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBCHARTOASCII, 0, 0);} +ActionTAG* action_MBAsciiToChar(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBASCIITOCHAR, 0, 0);} +ActionTAG* action_Delete(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DELETE, 0, 0);} +ActionTAG* action_Delete2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DELETE2, 0, 0);} +ActionTAG* action_DefineLocal(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DEFINELOCAL, 0, 0);} +ActionTAG* action_CallFunction(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CALLFUNCTION, 0, 0);} +ActionTAG* action_Return(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_RETURN, 0, 0);} +ActionTAG* action_Modulo(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MODULO, 0, 0);} +ActionTAG* action_NewObject(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NEWOBJECT, 0, 0);} +ActionTAG* action_DefineLocal2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DEFINELOCAL2, 0, 0);} +ActionTAG* action_InitArray(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_INITARRAY, 0, 0);} +ActionTAG* action_Makehash(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MAKEHASH, 0, 0);} +ActionTAG* action_TypeOf(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TYPEOF, 0, 0);} +ActionTAG* action_TargetPath(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TARGETPATH, 0, 0);} +ActionTAG* action_Enumerate(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ENUMERATE, 0, 0);} +ActionTAG* action_Add2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ADD2, 0, 0);} +ActionTAG* action_Less2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_LESS2, 0, 0);} +ActionTAG* action_Equals2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_EQUALS2, 0, 0);} +ActionTAG* action_ToNumber(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TONUMBER, 0, 0);} +ActionTAG* action_ToString(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TOSTRING, 0, 0);} +ActionTAG* action_PushDuplicate(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_PUSHDUPLICATE, 0, 0);} +ActionTAG* action_StackSwap(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STACKSWAP, 0, 0);} +ActionTAG* action_GetMember(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETMEMBER, 0, 0);} +ActionTAG* action_SetMember(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETMEMBER, 0, 0);} +ActionTAG* action_Increment(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_INCREMENT, 0, 0);} +ActionTAG* action_Decrement(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DECREMENT, 0, 0);} +ActionTAG* action_CallMethod(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CALLMETHOD, 0, 0);} +ActionTAG* action_NewMethod(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NEWMETHOD, 0, 0);} +ActionTAG* action_BitAnd(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITAND, 0, 0);} +ActionTAG* action_BitOr(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITOR, 0, 0);} +ActionTAG* action_BitXor(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITXOR, 0, 0);} +ActionTAG* action_BitLShift(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITLSHIFT, 0, 0);} +ActionTAG* action_BitRShift(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITRSHIFT, 0, 0);} +ActionTAG* action_BitURShift(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITURSHIFT, 0, 0);} +ActionTAG* action_Call(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CALL, 0, 0);} +ActionTAG* action_End(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_END, 0, 0);} +ActionTAG* action_GotoFrame(ActionTAG*atag, U16 frame) +{ + atag = swf_AddActionTAG(atag, ACTION_GOTOFRAME, 0, 2); + *(U16*)atag->tmp = LE_16_TO_NATIVE(frame); + return atag; +} + +ActionTAG* action_Jump(ActionTAG*atag, U16 branch) +{ + atag = swf_AddActionTAG(atag, ACTION_JUMP, 0, 2); + *(U16*)atag->tmp = LE_16_TO_NATIVE(branch); + return atag; +} +ActionTAG* action_If(ActionTAG*atag, U16 branch) +{ + atag = swf_AddActionTAG(atag, ACTION_IF, 0, 2); + *(U16*)atag->tmp = LE_16_TO_NATIVE(branch); + return atag; +} +ActionTAG* action_StoreRegister(ActionTAG*atag, U8 reg) +{ + atag = swf_AddActionTAG(atag, ACTION_STOREREGISTER, 0, 1); + *(U8*)atag->tmp = reg; + return atag; +} +ActionTAG* action_GotoFrame2(ActionTAG*atag, U8 method) +{ + atag = swf_AddActionTAG(atag, ACTION_GOTOFRAME2, 0, 1); + *(U8*)atag->tmp = method; + return atag; +} +ActionTAG* action_GetUrl2(ActionTAG*atag, U8 method) +{ + atag = swf_AddActionTAG(atag, ACTION_GETURL2, 0, 1); + *(U8*)atag->tmp = method; + return atag; +} +ActionTAG* action_WaitForFrame2(ActionTAG*atag, U8 skip) +{ + atag = swf_AddActionTAG(atag, ACTION_WAITFORFRAME2, 0, 1); + *(U8*)atag->tmp = skip; + return atag; +} +ActionTAG* action_WaitForFrame(ActionTAG*atag, U16 frame, U8 skip) +{ + atag = swf_AddActionTAG(atag, ACTION_WAITFORFRAME, 0, 3); + *(U16*)atag->tmp = LE_16_TO_NATIVE(frame); + *(U8*)&atag->tmp[2] = skip; + return atag; +} +ActionTAG* action_SetTarget(ActionTAG*atag, const char* target) +{ + char*ptr = strdup(target); + return swf_AddActionTAG(atag, ACTION_SETTARGET, (U8*)ptr, strlen(ptr)+1); +} +ActionTAG* action_PushNULL(ActionTAG*atag) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 1); + *(U8*)atag->tmp = 2; //NULL + return atag; +} +ActionTAG* action_PushUndefined(ActionTAG*atag) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 1); + *(U8*)atag->tmp = 3; //Undefined + return atag; +} +ActionTAG* action_PushBoolean(ActionTAG*atag, char c) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2); + *(U8*)atag->tmp = 5; //bool + *(U8*)&atag->tmp[1] = c; + return atag; +} +ActionTAG* action_PushRegister(ActionTAG*atag, U8 reg) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2); + *(U8*)atag->tmp = 4; //register + *(U8*)&atag->tmp[1] = reg; + return atag; +} +ActionTAG* action_PushLookup(ActionTAG*atag, U8 index) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2); + *(U8*)atag->tmp = 8; //lookup + *(U8*)&atag->tmp[1] = index; + return atag; +} +ActionTAG* action_PushLookup16(ActionTAG*atag, U16 index) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 3); + *(U8*)atag->tmp = 9; //lookup + *(U8*)&atag->tmp[1] = (U8)index; + *(U8*)&atag->tmp[2] = index>>8; + return atag; +} +ActionTAG* action_PushString(ActionTAG*atag, const char*str) +{ + int l = strlen(str); + char*ptr = (char*)rfx_alloc(l+2); + ptr[0] = 0; // string + strcpy(&ptr[1], str); + return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, l+2); +} +ActionTAG* action_PushFloat(ActionTAG*atag, float f) +{ + char*ptr = (char*)rfx_alloc(5); + U32 fd = *(U32*)&f; + ptr[0] = 1; //float + ptr[1] = fd; + ptr[2] = fd>>8; + ptr[3] = fd>>16; + ptr[4] = fd>>24; + return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, 5); +} +ActionTAG* action_PushDouble(ActionTAG*atag, double d) +{ + char*ptr = (char*)rfx_alloc(9); + U8*dd = (U8*)&d; + ptr[0] = 6; //double +#ifdef WORDS_BIGENDIAN + ptr[1] = dd[7];ptr[2] = dd[6]; + ptr[3] = dd[5];ptr[4] = dd[4]; + ptr[5] = dd[3];ptr[6] = dd[2]; + ptr[7] = dd[1];ptr[8] = dd[0]; +#else + ptr[1] = dd[0];ptr[2] = dd[1]; + ptr[3] = dd[2];ptr[4] = dd[3]; + ptr[5] = dd[4];ptr[6] = dd[5]; + ptr[7] = dd[6];ptr[8] = dd[7]; +#endif + return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, 9); +} +ActionTAG* action_PushInt(ActionTAG*atag, int i) +{ + atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 5); + atag->tmp[0] = 7; //int + atag->tmp[1] = i; + atag->tmp[2] = i>>8; + atag->tmp[3] = i>>16; + atag->tmp[4] = i>>24; + return atag; +} +ActionTAG* action_GotoLabel(ActionTAG*atag, char* label) +{ + char*ptr = strdup(label); + return swf_AddActionTAG(atag, ACTION_GOTOLABEL, (U8*)ptr, strlen(ptr)); +} +ActionTAG* action_GetUrl(ActionTAG*atag, const char* url, char* label) +{ + int l1= strlen(url); + int l2= strlen(label); + char*ptr = (char*)rfx_alloc(l1+l2+2); + strcpy(ptr, url); + strcpy(&ptr[l1+1], label); + return swf_AddActionTAG(atag, ACTION_GETURL, (U8*)ptr, l1+l2+2); +} +//TODO: +ActionTAG* action_DefineFunction(ActionTAG*atag, U8*data, int len) {return atag;} +ActionTAG* action_Constantpool(ActionTAG*atag, char* constantpool) {return atag;} +ActionTAG* action_With(ActionTAG*atag, char*object) {return atag;} + +#include "../action/actioncompiler.h" + +ActionTAG* swf_ActionCompile(const char* source, int version) +{ + TAG* tag; + ActionTAG* a = 0; + void*buffer = 0; + int len = 0; + int ret; + + tag = swf_InsertTag(NULL, ST_DOACTION); + ret = compileSWFActionCode(source, version, &buffer, &len); + if(!ret || buffer==0 || len == 0) + return 0; + + swf_SetBlock(tag, (U8*)buffer, len); + swf_SetU8(tag, 0); + + rfx_free(buffer); + + a = swf_ActionGet(tag); + swf_DeleteTag(0, tag); + return a; +} + + +/* + Properties: + + _X 0 + _Y 1 + _xscale 2 + _yscale 3 + _currentframe 4 + _totalframes 5 + _alpha 6 + _visible 7 + _width 8 + _height 9 + _rotation 10 + _target 11 + _framesloaded 12 + _name 13 + _droptarget 14 + _url 15 + _highquality 16 + _focusrect 17 + _soundbuftime 18 + _quality* 19 + _xmouse* 20 + _ymouse* 21 +*/ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c new file mode 100644 index 000000000..94558ee96 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c @@ -0,0 +1,366 @@ +#include "../rfxswf.h" +#include "../graphcut.c" +#include "../log.h" + +static inline double sqr(double x) {return x*x;} + +static void draw_line(float*row, float x1, float x2, float y1, float y2, int min, int max, double weight) +{ + if(x2max) { + fprintf(stderr, "error: glyph x stroke out of bounds\n"); + return; + } + x1 -= min; + x2 -= min; + + double d = sqrt(sqr(y2-y1)+sqr(x2-x1)); + if(floor(x1)==floor(x2)) { + row[(int)floor(x1)] += d*weight; + } else { + double i = d/(x2-x1); + int x; + int xx1 = ceil(x1); + int xx2 = floor(x2); + row[xx1] += i*(xx1-x1)*weight; + row[xx2] += i*(x2-xx2)*weight; + for(x=xx1;xxmin, area->xmax, weight); + draw_line(column, y1, y2, x1, x2, area->ymin, area->ymax, weight); +} + +static void find_best(float*_row, int width, int*_x1, int*_x2, int min_size, int from, int to, int num, char debug) +{ + int x1=-1, x2=-1; + float max1=-1e20,max2=-1e20; + int t; + + if(from==to) { + *_x1 = from; + return; + } + + float*row = malloc(sizeof(float)*(width+1)); + int filter_size = 25; + float* filter = malloc(sizeof(float)*(filter_size*2+1)); + double var = filter_size/3; + double sum = 0; + for(t=-filter_size;t<=filter_size;t++) { + double v = t/var; + float r = v*v/2; + filter[filter_size+t] = exp(-r); + sum += filter[filter_size+t]; + } + for(t=-filter_size;t<=filter_size;t++) { + filter[filter_size+t]/=sum; + } + + //filter[0]=1;filter_size=0; + + for(t=0;t<=width;t++) { + int s; + double sum = 0; + for(s=-filter_size;s<=filter_size;s++) { + if(t+s<0) continue; + if(t+s>width) continue; + sum += _row[t+s]*filter[s+filter_size]; + } + row[t] = sum; + } + free(filter); + + for(t=from;t<=to;t++) { + if(row[t]>max1) { + max1 = row[t]; + x1 = t; + } + } + + + if(num<=1) { + *_x1=x1; + } else { + /* this code is slightly wrong, in that it assumes that the glyph distortion problem + gets worse when the font sizes get smaller. it doesn't. in fact, the smaller + the font size, the more of the scaling bugs disappear (http://www.quiss.org/files/scaletest.swf) + A better way would probably to use the font size you need for the two alignzones + to come to lie in different pixels, which what I think is what makes the problems + appear/disappear. + */ + + double scale = min_size/1024.0; + for(t=from;t<=to;t++) { + if(t==x1) { + row[t]=-1e20; + continue; + } + double r1 = (t=1 || add2>=1) { + row[t]=-1e20; + } + } + + for(t=from;t<=to;t++) { + if(row[t]>max2) { + max2 = row[t]; + x2 = t; + } + } + + if(x1>=0 && x2>=0 && x1>x2) {int x=x1;x1=x2;x2=x;} + + *_x1=x1; + *_x2=x2; + } + + free(row); +} + +static void negate_y(SRECT* b) +{ + // negate y + int by1=b->ymin,by2=b->ymax; + b->ymin = -by2; + b->ymax = -by1; +} + +static void draw_char(SWFFONT * f, int nr, float*row, float*column, SRECT b, double weight) +{ + SWFGLYPH*g = &f->glyph[nr]; + + SHAPE2*s = swf_ShapeToShape2(g->shape); + SHAPELINE*l = s->lines; + int x=0,y=0; + while(l) { + if(l->type == lineTo) { + draw_line_xy(row,column,x,-y,l->x,-l->y,&b,weight); + } else if(l->type == splineTo) { + double x1=x,x2=l->sx,x3=l->x; + double y1=y,y2=l->sy,y3=l->y; + double c = fabs(x3-2*x2+x1) + fabs(y3-2*y2+y1); + int parts = ((int)(sqrt(c)/6))*2+1; + float xx=x1,yy=y1; + int t; + for(t=1;t<=parts;t++) { + float nx = ((t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts)); + float ny = ((t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts)); + draw_line_xy(row,column,xx,-yy,nx,-ny,&b,weight); + xx = nx; + yy = ny; + } + } + x = l->x; + y = l->y; + l = l->next; + } + swf_Shape2Free(s); + free(s); +} + +static ALIGNZONE detect_for_char(SWFFONT * f, float*row, float*column, SRECT font_bbox, SRECT char_bbox) +{ + ALIGNZONE a = {0xffff,0xffff,0xffff,0xffff}; + int width = font_bbox.xmax - font_bbox.xmin; + int height = font_bbox.ymax - font_bbox.ymin; + if(!width || !height) + return a; + + /* find two best x values */ + int x1=-1,y1=-1,x2=-1,y2=-1; + + int nr_x = 0; + find_best(row, width, &x1, &x2, f->use->smallest_size, + char_bbox.xmin - font_bbox.xmin, + char_bbox.xmax - font_bbox.xmin, nr_x, + 0); + if(nr_x>0 && x1>=0) a.x = floatToF16((x1+font_bbox.xmin) / 20480.0); + if(nr_x>1 && x2>=0) a.dx = floatToF16((x2-x1) / 20480.0); + + find_best(column, height, &y1, &y2, f->use->smallest_size, + char_bbox.ymin - font_bbox.ymin, + char_bbox.ymax - font_bbox.ymin, 2, + 0); + if(y1>=0) a.y = floatToF16((y1+font_bbox.ymin) / 20480.0); + if(y2>=0) a.dy = floatToF16((y2-y1) / 20480.0); + return a; +} + +static graph_t*make_graph(SWFFONT*f) +{ + FONTUSAGE*use = f->use; + graph_t*g = graph_new(f->numchars); + int s,t; + for(s=1;snumchars;s++) { + for(t=0;tglyph2ascii) { + int c1 = f->glyph2ascii[s]; + int c2 = f->glyph2ascii[t]; + if((c1<'a' && c2>='a' && c2<='z') || + (c2<'a' && c1>='a' && c1<='z')) { + /* never connect lowercase with any uppercase + or punctuation */ + continue; + } + } + + int pos1 = swf_FontUseGetPair(f, s, t); + int pos2 = swf_FontUseGetPair(f, t, s); + if(pos1 || pos2) { + int weight1 = pos1?use->neighbors[pos1-1].num:0; + int weight2 = pos2?use->neighbors[pos2-1].num:0; + int weight = weight1+weight2; + + /*printf("font %d: pair %c and %c\n", + f->id, f->glyph2ascii[t], f->glyph2ascii[s]);*/ + graph_add_edge(&g->nodes[s], &g->nodes[t], weight, weight); + } + } + } + return g; +} + +void swf_FontCreateAlignZones(SWFFONT * f) +{ + if(f->alignzones) + return; + + if(!f->layout) { + fprintf(stderr, "Error: font needs a layout for alignzones to be detected."); + return; + } + + f->alignzones = (ALIGNZONE*)rfx_calloc(sizeof(ALIGNZONE)*f->numchars); + f->alignzone_flags = FONTALIGN_MEDIUM; + + if(!f->layout || !f->use) { + int t; + for(t=0;tnumchars;t++) { + // just align the baseline + f->alignzones[t].x = 0xffff; + f->alignzones[t].y = 0; + f->alignzones[t].dx = 0xffff; + f->alignzones[t].dy = 0xffff;//floatToF16(460.80 / 1024.0); + } + } else { + graph_t*g = make_graph(f); + + int num_components = graph_find_components(g); + msg(" Building font alignzone information for font %d (%d characters, %d components, %d pairs)\n", + f->id, f->numchars, num_components, f->use->num_neighbors); + + SRECT bounds = {0,0,0,0}; + int t; + for(t=0;tnumchars;t++) { + SRECT b = f->layout->bounds[t]; + negate_y(&b); + swf_ExpandRect2(&bounds, &b); + } + + int width = bounds.xmax - bounds.xmin; + int height = bounds.ymax - bounds.ymin; + float*row = rfx_calloc(sizeof(float)*(width+1)); + float*global_column = rfx_calloc(sizeof(float)*(height+1)); + float*column = rfx_calloc(sizeof(float)*(height+1)); + + const double SELF_WEIGHT = 0.00; // ignore own char + + int c; + for(c=0;cnumchars;t++) { + if(g->nodes[t].tmp == c) { + draw_char(f, t, row, global_column, bounds, 1.0-SELF_WEIGHT); + SRECT b = f->layout->bounds[t]; + negate_y(&b); + swf_ExpandRect2(&local_bounds, &b); + drawn++; + } + } + + for(t=0;t<=height;t++) { + global_column[t] /= drawn; + } + + memcpy(column, global_column, sizeof(float)*(height+1)); + memset(row, 0, sizeof(float)*(width+1)); + ALIGNZONE a = detect_for_char(f, row, column, bounds, local_bounds); + + for(t=0;tnumchars;t++) { + if(g->nodes[t].tmp == c) { + f->alignzones[t] = a; + } + } + } + free(row); + free(column); + free(global_column); + + graph_delete(g); + } +} + +void swf_FontPostprocess(SWF*swf) +{ + TAG*tag = swf->firstTag; + while(tag) { + TAG*next = tag->next; + if(tag->id == ST_DEFINEFONT3) { + U16 id = swf_GetDefineID(tag); + SWFFONT*font = 0; + swf_FontExtract(swf, id, &font); + if(!font->alignzones) { + swf_FontCreateAlignZones(font); + tag = swf_InsertTag(tag, ST_DEFINEFONTALIGNZONES); + swf_FontSetAlignZones(tag, font); + } + swf_FontFree(font); + } + tag = next; + } +} + +void swf_FontSetAlignZones(TAG*t, SWFFONT *f) +{ + swf_SetU16(t, f->id); + swf_SetU8(t, f->alignzone_flags); + int i; + for(i=0;inumchars;i++) { + ALIGNZONE*a = &f->alignzones[i]; + U8 flags = 0; + if((a->x & a->dx)!=0xffff) + flags |= 1; + if((a->y & a->dy)!=0xffff) + flags |= 2; + int num = 1; + if(a->dx != 0xffff || a->dy != 0xffff) + num++; + swf_SetU8(t, num); + if(flags&1) swf_SetU16(t, a->x); else swf_SetU16(t, 0); + if(flags&2) swf_SetU16(t, a->y); else swf_SetU16(t, 0); + if(num==2) { + if((flags&1) && a->dx!=0xffff) swf_SetU16(t, a->dx); else swf_SetU16(t, 0); + if((flags&2) && a->dy!=0xffff) swf_SetU16(t, a->dy); else swf_SetU16(t, 0); + } + swf_SetU8(t, flags); + } +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c new file mode 100644 index 000000000..c2dcf254e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c @@ -0,0 +1,1266 @@ +/* swfbits.c + + Bitmap functions (needs libjpeg) + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../../config.h" +#ifdef HAVE_ZLIB +#include +#include +#endif +#include +#include + +#ifdef HAVE_JPEGLIB +#define HAVE_BOOLEAN +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif +#endif // HAVE_JPEGLIB + +#include "../rfxswf.h" + +#define OUTBUFFER_SIZE 0x8000 + +int swf_ImageHasAlpha(RGBA*img, int width, int height) +{ + int len = width*height; + int t; + int hasalpha=0; + for(t=0;t= 4 && img[t].a < 0xfc) + return 2; + if(img[t].a < 4) + hasalpha=1; + } + return hasalpha; +} + +/*int swf_ImageGetNumberOfPaletteEntries(RGBA*img, int width, int height, RGBA*palette) +{ + int len = width*height; + int t; + int palsize = 0; + RGBA pal[512]; + U32*pal32=(U32*)pal; + int palette_overflow = 0; + U32 lastcol32 = 0; + + if(sizeof(RGBA)!=sizeof(U32)) + fprintf(stderr, "rfxswf: sizeof(RGBA)!=sizeof(U32))"); + + lastcol32 = pal32[palsize++] = *(U32*)&img[0]; + + for(t=1;t> 17) ^ col32; + hash ^= ((hash>>8) + 1) ^ hash; + hash &= 255; + + csize = size[hash]; + cpal = &pal[hash*256]; + for(i=0;idest; + dmgr->buffer = (JOCTET *) rfx_alloc(OUTBUFFER_SIZE); + dmgr->mgr.next_output_byte = dmgr->buffer; + dmgr->mgr.free_in_buffer = OUTBUFFER_SIZE; +} + +static boolean RFXSWF_empty_output_buffer(j_compress_ptr cinfo) +{ + JPEGDESTMGR *dmgr = (JPEGDESTMGR *) cinfo->dest; + swf_SetBlock(dmgr->t, (U8 *) dmgr->buffer, OUTBUFFER_SIZE); + dmgr->mgr.next_output_byte = dmgr->buffer; + dmgr->mgr.free_in_buffer = OUTBUFFER_SIZE; + return TRUE; +} + +static void RFXSWF_term_destination(j_compress_ptr cinfo) +{ + JPEGDESTMGR *dmgr = (JPEGDESTMGR *) cinfo->dest; + swf_SetBlock(dmgr->t, (U8 *) dmgr->buffer, + OUTBUFFER_SIZE - dmgr->mgr.free_in_buffer); + rfx_free(dmgr->buffer); + dmgr->mgr.free_in_buffer = 0; +} + +JPEGBITS *swf_SetJPEGBitsStart(TAG * t, int width, int height, int quality) +{ + JPEGDESTMGR *jpeg; + + // redirect compression lib output to local SWF Tag structure + + jpeg = (JPEGDESTMGR *) rfx_calloc(sizeof(JPEGDESTMGR)); + + jpeg->cinfo.err = jpeg_std_error(&jpeg->jerr); + + jpeg_create_compress(&jpeg->cinfo); + + jpeg->mgr.init_destination = RFXSWF_init_destination; + jpeg->mgr.empty_output_buffer = RFXSWF_empty_output_buffer; + jpeg->mgr.term_destination = RFXSWF_term_destination; + + jpeg->t = t; + + jpeg->cinfo.dest = (struct jpeg_destination_mgr *) jpeg; + + // init compression + + jpeg->cinfo.image_width = width; + jpeg->cinfo.image_height = height; + jpeg->cinfo.input_components = 3; + jpeg->cinfo.in_color_space = JCS_RGB; + + jpeg_set_defaults(&jpeg->cinfo); + jpeg_set_quality(&jpeg->cinfo, quality, TRUE); + + // write tables to SWF + + jpeg_write_tables(&jpeg->cinfo); + + // compess image to SWF + + jpeg_suppress_tables(&jpeg->cinfo, TRUE); + jpeg_start_compress(&jpeg->cinfo, FALSE); + + return (JPEGBITS *) jpeg; +} + +int swf_SetJPEGBitsLines(JPEGBITS * jpegbits, U8 ** data, int n) +{ + JPEGDESTMGR *jpeg = (JPEGDESTMGR *) jpegbits; + if (!jpeg) + return -1; + jpeg_write_scanlines(&jpeg->cinfo, data, n); + return 0; +} + +int swf_SetJPEGBitsLine(JPEGBITS * jpegbits, U8 * data) +{ + return swf_SetJPEGBitsLines(jpegbits, &data, 1); +} + +int swf_SetJPEGBitsFinish(JPEGBITS * jpegbits) +{ + JPEGDESTMGR *jpeg = (JPEGDESTMGR *) jpegbits; + if (!jpeg) + return -1; + jpeg_finish_compress(&jpeg->cinfo); + jpeg_destroy_compress(&jpeg->cinfo); + rfx_free(jpeg); + return 0; +} + +#if defined(HAVE_JPEGLIB) +void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) +{ + JPEGBITS *jpeg; + int y; + jpeg = swf_SetJPEGBitsStart(tag, width, height, quality); + U8 *scanline = (U8*)rfx_alloc(3 * width); + for (y = 0; y < height; y++) { + int x, p = 0; + for (x = 0; x < width; x++) { + scanline[p++] = bitmap[width * y + x].r; + scanline[p++] = bitmap[width * y + x].g; + scanline[p++] = bitmap[width * y + x].b; + } + swf_SetJPEGBitsLine(jpeg, scanline); + } + rfx_free(scanline); + swf_SetJPEGBitsFinish(jpeg); +} +#else +void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) +{ + fprintf(stderr, "Error: swftools compiled without jpeglib\n"); + return -1; +} +#endif + +void swf_GetJPEGSize(const char *fname, int *width, int *height) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + FILE *fi; + *width = 0; + *height = 0; + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + if ((fi = fopen(fname, "rb")) == NULL) { + fprintf(stderr, "rfxswf: file open error\n"); + return; + } + jpeg_stdio_src(&cinfo, fi); + jpeg_read_header(&cinfo, TRUE); + *width = cinfo.image_width; + *height = cinfo.image_height; + jpeg_destroy_decompress(&cinfo); + fclose(fi); +} + +int swf_SetJPEGBits(TAG * t, const char *fname, int quality) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + JPEGBITS *out; + FILE *f; + U8 *scanline; + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + + if ((f = fopen(fname, "rb")) == NULL) { + fprintf(stderr, "rfxswf: file open error\n"); + return -1; + } + + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + + out = + swf_SetJPEGBitsStart(t, cinfo.output_width, cinfo.output_height, + quality); + scanline = (U8 *) rfx_alloc(4 * cinfo.output_width); + + if (scanline) { + int y; + U8 *js = scanline; + if (cinfo.out_color_space == JCS_GRAYSCALE) { + for (y = 0; y < cinfo.output_height; y++) { + int x; + jpeg_read_scanlines(&cinfo, &js, 1); + for (x = cinfo.output_width - 1; x >= 0; x--) { + js[x * 3] = js[x * 3 + 1] = js[x * 3 + 2] = js[x]; + } + swf_SetJPEGBitsLines(out, (U8 **) & js, 1); + } + } else if (cinfo.out_color_space == JCS_RGB) { + for (y = 0; y < cinfo.output_height; y++) { + jpeg_read_scanlines(&cinfo, &js, 1); + swf_SetJPEGBitsLines(out, (U8 **) & js, 1); + } + } else if (cinfo.out_color_space == JCS_YCCK) { + //FIXME + fprintf(stderr, "Error: Can't convert YCCK to RGB.\n"); + return -1; + } else if (cinfo.out_color_space == JCS_YCbCr) { + for (y = 0; y < cinfo.output_height; y++) { + int x; + for (x = 0; x < cinfo.output_width; x++) { + int y = js[x * 3 + 0]; + int u = js[x * 3 + 1]; + int v = js[x * 3 + 1]; + js[x * 3 + 0] = y + ((360 * (v - 128)) >> 8); + js[x * 3 + 1] = + y - ((88 * (u - 128) + 183 * (v - 128)) >> 8); + js[x * 3 + 2] = y + ((455 * (u - 128)) >> 8); + } + } + } else if (cinfo.out_color_space == JCS_CMYK) { + for (y = 0; y < cinfo.output_height; y++) { + int x; + jpeg_read_scanlines(&cinfo, &js, 1); + /* This routine seems to work for now- + It's a mixture of 3 different + CMYK->RGB conversion routines I found in the + web. (which all produced garbage) + I'm happily accepting suggestions. (mk) */ + for (x = 0; x < cinfo.output_width; x++) { + int white = 255 - js[x * 4 + 3]; + js[x * 3 + 0] = white - ((js[x * 4] * white) >> 8); + js[x * 3 + 1] = white - ((js[x * 4 + 1] * white) >> 8); + js[x * 3 + 2] = white - ((js[x * 4 + 2] * white) >> 8); + } + swf_SetJPEGBitsLines(out, (U8 **) & js, 1); + } + } + } + + rfx_free(scanline); + swf_SetJPEGBitsFinish(out); + jpeg_finish_decompress(&cinfo); + fclose(f); + + return 0; +} + +typedef struct _JPEGFILEMGR { + struct jpeg_destination_mgr mgr; + JOCTET *buffer; + struct jpeg_compress_struct* cinfo; + struct jpeg_error_mgr* jerr; + FILE*fi; +} JPEGFILEMGR; + +static void file_init_destination(j_compress_ptr cinfo) +{ + JPEGFILEMGR*fmgr = (JPEGFILEMGR*)(cinfo->dest); + struct jpeg_destination_mgr*dmgr = &fmgr->mgr; + + fmgr->buffer = (JOCTET*)rfx_alloc(OUTBUFFER_SIZE); + if(!fmgr->buffer) { + perror("malloc"); + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + + dmgr->next_output_byte = fmgr->buffer; + dmgr->free_in_buffer = OUTBUFFER_SIZE; +} + +static boolean file_empty_output_buffer(j_compress_ptr cinfo) +{ + JPEGFILEMGR*fmgr = (JPEGFILEMGR*)(cinfo->dest); + struct jpeg_destination_mgr*dmgr = &fmgr->mgr; + + if(fmgr->fi) + fwrite(fmgr->buffer, OUTBUFFER_SIZE, 1, fmgr->fi); + + dmgr->next_output_byte = fmgr->buffer; + dmgr->free_in_buffer = OUTBUFFER_SIZE; + return 1; +} + +static void file_term_destination(j_compress_ptr cinfo) +{ + JPEGFILEMGR*fmgr = (JPEGFILEMGR*)(cinfo->dest); + struct jpeg_destination_mgr*dmgr = &fmgr->mgr; + + if(fmgr->fi) + fwrite(fmgr->buffer, OUTBUFFER_SIZE-dmgr->free_in_buffer, 1, fmgr->fi); + + rfx_free(fmgr->buffer); + fmgr->buffer = 0; + dmgr->free_in_buffer = 0; + dmgr->next_output_byte = 0; +} + +void swf_SaveJPEG(char*filename, RGBA*pixels, int width, int height, int quality) +{ + JPEGFILEMGR fmgr; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + unsigned char*data2 = 0; + int y; + + FILE*fi = fopen(filename, "wb"); + if(!fi) { + char buf[256]; + sprintf(buf, "rfxswf: Couldn't create %s", filename); + perror(buf); + return; + } + data2 = (unsigned char *)rfx_calloc(width*3); + + memset(&cinfo, 0, sizeof(cinfo)); + memset(&jerr, 0, sizeof(jerr)); + memset(&fmgr, 0, sizeof(fmgr)); + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + + fmgr.mgr.init_destination = file_init_destination; + fmgr.mgr.empty_output_buffer = file_empty_output_buffer; + fmgr.mgr.term_destination = file_term_destination; + fmgr.fi = fi; + fmgr.cinfo = &cinfo; + fmgr.jerr = &jerr; + cinfo.dest = (struct jpeg_destination_mgr*)&fmgr; + + // init compression + + cinfo.image_width = width; + cinfo.image_height = height; + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + jpeg_set_defaults(&cinfo); + cinfo.dct_method = JDCT_IFAST; + jpeg_set_quality(&cinfo,quality,TRUE); + + //jpeg_write_tables(&cinfo); + //jpeg_suppress_tables(&cinfo, TRUE); + jpeg_start_compress(&cinfo, FALSE); + + for(y=0;yclient_data; + if (tag->id == ST_DEFINEBITSJPEG3) { + swf_SetTagPos(tag, 6); + } else { + swf_SetTagPos(tag, 2); + } + cinfo->src->bytes_in_buffer = 0; +} +static boolean tag_fill_input_buffer(struct jpeg_decompress_struct *cinfo) +{ + TAG *tag = (TAG *) cinfo->client_data; + if (tag->pos + 4 <= tag->len && + tag->data[tag->pos + 0] == 0xff && + tag->data[tag->pos + 1] == 0xd9 && + tag->data[tag->pos + 2] == 0xff && + tag->data[tag->pos + 3] == 0xd8) { + tag->pos += 4; + } + if (tag->pos >= tag->len) { + cinfo->src->next_input_byte = 0; + cinfo->src->bytes_in_buffer = 0; + return 0; + } + cinfo->src->next_input_byte = &tag->data[tag->pos]; + cinfo->src->bytes_in_buffer = 1; //tag->len - tag->pos; + tag->pos += 1; + return 1; +} +static void tag_skip_input_data(struct jpeg_decompress_struct *cinfo, long count) +{ + TAG *tag = (TAG *) cinfo->client_data; + cinfo->src->next_input_byte = 0; + cinfo->src->bytes_in_buffer = 0; + tag->pos += count; +} +static boolean tag_resync_to_restart(struct jpeg_decompress_struct *cinfo, int desired) +{ + return jpeg_resync_to_restart(cinfo, desired); +} +static void tag_term_source(struct jpeg_decompress_struct *cinfo) +{ + TAG *tag = (TAG *) cinfo->client_data; +} +RGBA *swf_JPEG2TagToImage(TAG * tag, int *width, int *height) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_source_mgr mgr; + RGBA *dest; + int y; + int offset = 0; + int oldtaglen = 0; + *width = 0; + *height = 0; + + if (tag->id == ST_DEFINEBITSJPEG) { + fprintf(stderr, "rfxswf: extracting from definebitsjpeg not yet supported\n"); + return 0; + } + if (tag->id == ST_DEFINEBITSJPEG3) { +#ifdef HAVE_ZLIB + offset = swf_GetU32(tag); + oldtaglen = tag->len; + tag->len = offset+6; +#else + fprintf(stderr, "rfxswf: extracting from definebitsjpeg3 not possible: no zlib\n"); + return 0; +#endif + } + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + + cinfo.client_data = (void *) tag; + cinfo.src = &mgr; + cinfo.src->init_source = tag_init_source; + cinfo.src->fill_input_buffer = tag_fill_input_buffer; + cinfo.src->skip_input_data = tag_skip_input_data; + cinfo.src->resync_to_restart = jpeg_resync_to_restart; + cinfo.src->term_source = tag_term_source; + cinfo.out_color_space = JCS_RGB; + + jpeg_read_header(&cinfo, TRUE); + *width = cinfo.image_width; + *height = cinfo.image_height; + dest = (RGBA*) + rfx_alloc(sizeof(RGBA) * cinfo.image_width * cinfo.image_height); + + jpeg_start_decompress(&cinfo); + for (y = 0; y < cinfo.output_height; y++) { + RGBA *line = &dest[y * cinfo.image_width]; + U8 *to = (U8 *) line; + int x; + jpeg_read_scanlines(&cinfo, &to, 1); + for (x = cinfo.output_width - 1; x >= 0; --x) { + int r = to[x * 3 + 0]; + int g = to[x * 3 + 1]; + int b = to[x * 3 + 2]; + line[x].r = r; + line[x].g = g; + line[x].b = b; + line[x].a = 255; + } + } + + jpeg_finish_decompress(&cinfo); + + jpeg_destroy_decompress(&cinfo); + +#ifdef HAVE_ZLIB + if(offset) { + uLongf datalen = cinfo.output_width*cinfo.output_height; + U8* alphadata = (U8*)rfx_alloc(datalen); + int error; + tag->len = oldtaglen; + swf_SetTagPos(tag, 6+offset); + error = uncompress(alphadata, &datalen, &tag->data[tag->pos], tag->len - tag->pos); + if (error != Z_OK) { + fprintf(stderr, "rfxswf: Zlib error %d while extracting definejpeg3\n", error); + return 0; + } + for(y=0;ynext_out = data; + zs->avail_out = OUTBUFFER_SIZE; + while (1) { + int status = deflate(zs, Z_NO_FLUSH); + + if (status != Z_OK) { + fprintf(stderr, "rfxswf: zlib compression error (%i)\n", status); + rfx_free(data); + return status; + } + + if (zs->next_out != data) { + swf_SetBlock(t, data, zs->next_out - data); + zs->next_out = data; + zs->avail_out = OUTBUFFER_SIZE; + } + + if (zs->avail_in == 0) + break; + } + + if (!finish) { + rfx_free(data); + return 0; + } + + while (1) { + int status = deflate(zs, Z_FINISH); + if (status != Z_OK && status != Z_STREAM_END) { + fprintf(stderr, "rfxswf: zlib compression error (%i)\n", status); + rfx_free(data); + return status; + } + + if (zs->next_out != data) { + swf_SetBlock(t, data, zs->next_out - data); + zs->next_out = data; + zs->avail_out = OUTBUFFER_SIZE; + } + + if (status == Z_STREAM_END) + break; + } + rfx_free(data); + return 0; +} + + +int swf_SetLosslessBits(TAG * t, U16 width, U16 height, void *bitmap, U8 bitmap_flags) +{ + int res = 0; + int bps; + + switch (bitmap_flags) { + case BMF_8BIT: + return swf_SetLosslessBitsIndexed(t, width, height, (U8*)bitmap, NULL, 256); + case BMF_16BIT: + bps = BYTES_PER_SCANLINE(sizeof(U16) * width); + break; + case BMF_32BIT: + bps = width * 4; + break; + default: + fprintf(stderr, "rfxswf: unknown bitmap type %d\n", bitmap_flags); + return -1; + } + + swf_SetU8(t, bitmap_flags); + swf_SetU16(t, width); + swf_SetU16(t, height); + + { + z_stream zs; + + memset(&zs, 0x00, sizeof(z_stream)); + zs.zalloc = Z_NULL; + zs.zfree = Z_NULL; + + if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) == Z_OK) { + zs.avail_in = bps * height; + zs.next_in = (Bytef *)bitmap; + + if (RFXSWF_deflate_wraper(t, &zs, TRUE) < 0) + res = -3; + deflateEnd(&zs); + + } else + res = -3; // zlib error + } + return res; +} + +int swf_SetLosslessBitsIndexed(TAG * t, U16 width, U16 height, U8 * bitmap, RGBA * palette, U16 ncolors) +{ + RGBA *pal = palette; + int bps = BYTES_PER_SCANLINE(width); + int res = 0; + + if (!pal) // create default palette for grayscale images + { + int i; + pal = (RGBA*)rfx_alloc(256 * sizeof(RGBA)); + for (i = 0; i < 256; i++) { + pal[i].r = pal[i].g = pal[i].b = i; + pal[i].a = 0xff; + } + ncolors = 256; + } + + if ((ncolors < 2) || (ncolors > 256) || (!t)) { + fprintf(stderr, "rfxswf: unsupported number of colors: %d\n", + ncolors); + return -1; // parameter error + } + + swf_SetU8(t, BMF_8BIT); + swf_SetU16(t, width); + swf_SetU16(t, height); + swf_SetU8(t, ncolors - 1); // number of pal entries + + { + z_stream zs; + + memset(&zs, 0x00, sizeof(z_stream)); + zs.zalloc = Z_NULL; + zs.zfree = Z_NULL; + + if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) == Z_OK) { + U8 *zpal; // compress palette + if ((zpal = (U8*)rfx_alloc(ncolors * 4))) { + U8 *pp = zpal; + int i; + + /* be careful with ST_DEFINEBITSLOSSLESS2, because + the Flash player produces great bugs if you use too many + alpha colors in your palette. The only sensible result that + can be archeived is setting one color to r=0,b=0,g=0,a=0 to + make transparent parts in sprites. That's the cause why alpha + handling is implemented in lossless routines of rfxswf. + + Indeed: I haven't understood yet how flash player handles + alpha values different from 0 and 0xff in lossless bitmaps... + */ + + if (swf_GetTagID(t) == ST_DEFINEBITSLOSSLESS2) // have alpha channel? + { + for (i = 0; i < ncolors; i++) { + pp[0] = pal[i].r; + pp[1] = pal[i].g; + pp[2] = pal[i].b; + pp[3] = pal[i].a; + pp += 4; + } + zs.avail_in = 4 * ncolors; + } else { + for (i = 0; i < ncolors; i++) // pack RGBA structures to RGB + { + pp[0] = pal[i].r; + pp[1] = pal[i].g; + pp[2] = pal[i].b; + pp += 3; + } + zs.avail_in = 3 * ncolors; + } + + zs.next_in = zpal; + + if (RFXSWF_deflate_wraper(t, &zs, FALSE) < 0) + res = -3; + + // compress bitmap + zs.next_in = bitmap; + zs.avail_in = (bps * height * sizeof(U8)); + + if (RFXSWF_deflate_wraper(t, &zs, TRUE) < 0) + res = -3; + + deflateEnd(&zs); + + rfx_free(zpal); + } else + res = -2; // memory error + } else + res = -3; // zlib error + } + + if (!palette) + rfx_free(pal); + + return res; +} + +int swf_SetLosslessBitsGrayscale(TAG * t, U16 width, U16 height, U8 * bitmap) +{ + return swf_SetLosslessBitsIndexed(t, width, height, bitmap, NULL, 256); +} + +void swf_PreMultiplyAlpha(RGBA*data, int width, int height) +{ + int num = width*height; + int t; + for(t=0;tid = ST_DEFINEBITSLOSSLESS; + } else { + tag->id = ST_DEFINEBITSLOSSLESS2; + /* FIXME: we're destroying the callers data here */ + swf_PreMultiplyAlpha(data, width, height); + } + num = swf_ImageGetNumberOfPaletteEntries(data, width, height, 0); + if(num>1 && num<=256) { + RGBA*palette = (RGBA*)malloc(sizeof(RGBA)*num); + int width2 = BYTES_PER_SCANLINE(width); + U8*data2 = (U8*)malloc(width2*height); + int len = width*height; + int x,y; + int r; + swf_ImageGetNumberOfPaletteEntries(data, width, height, palette); + for(y=0;yid == ST_DEFINEBITSLOSSLESS2; + int t, x, y; + RGBA *palette = 0; + U8 *data, *data2; + RGBA *dest; + if (tag->id != ST_DEFINEBITSLOSSLESS && + tag->id != ST_DEFINEBITSLOSSLESS2) { + fprintf(stderr, "rfxswf: Object %d is not a PNG picture!\n", + GET16(tag->data)); + return 0; + } + swf_SetTagPos(tag, 0); + id = swf_GetU16(tag); + format = swf_GetU8(tag); + if (format == 3) + bpp = 8; + if (format == 4) + bpp = 16; + if (format == 5) + bpp = 32; + if (format != 3 && format != 5) { + if (format == 4) + fprintf(stderr, + "rfxswf: Can't handle 16-bit palette images yet (image %d)\n", + id); + else + fprintf(stderr, "rfxswf: Unknown image type %d in image %d\n", + format, id); + return 0; + } + *dwidth = width = swf_GetU16(tag); + *dheight = height = swf_GetU16(tag); + + dest = (RGBA*)rfx_alloc(sizeof(RGBA) * width * height); + + if (format == 3) + cols = swf_GetU8(tag) + 1; + else + cols = 0; + + data = 0; + datalen = (width * height * bpp / 8 + cols * 8); + do { + if (data) + rfx_free(data); + datalen += 4096; + data = (U8*)rfx_alloc(datalen); + error = + uncompress(data, &datalen, &tag->data[tag->pos], + tag->len - tag->pos); + } while (error == Z_BUF_ERROR); + if (error != Z_OK) { + fprintf(stderr, "rfxswf: Zlib error %d (image %d)\n", error, id); + return 0; + } + pos = 0; + + if (cols) { + palette = (RGBA *) rfx_alloc(cols * sizeof(RGBA)); + for (t = 0; t < cols; t++) { + palette[t].r = data[pos++]; + palette[t].g = data[pos++]; + palette[t].b = data[pos++]; + if (alpha) { + palette[t].a = data[pos++]; + } else { + palette[t].a = 255; + } + } + } + + for (y = 0; y < height; y++) { + int srcwidth = width * (bpp / 8); + if (bpp == 32) { + if (!alpha) { + // 32 bit to 24 bit "conversion" + for (x = 0; x < width; x++) { + dest[pos2].r = data[pos + 1]; + dest[pos2].g = data[pos + 2]; + dest[pos2].b = data[pos + 3]; + dest[pos2].a = 255; + pos2++; + pos += 4; //ignore padding byte + } + } else { + for (x = 0; x < width; x++) { + /* remove premultiplication */ + int alpha = data[pos+0]; + if(alpha) + alpha = 0xff0000/alpha; + dest[pos2].r = (data[pos + 1]*alpha)>>16; + dest[pos2].g = (data[pos + 2]*alpha)>>16; + dest[pos2].b = (data[pos + 3]*alpha)>>16; + dest[pos2].a = data[pos + 0]; //alpha + pos2++; + pos += 4; + } + } + } else { + for (x = 0; x < srcwidth; x++) { + dest[pos2] = palette[data[pos++]]; + pos2++; + } + } + pos += ((srcwidth + 3) & ~3) - srcwidth; //align + } + if (palette) + rfx_free(palette); + rfx_free(data); + return dest; +} + +#endif // HAVE_ZLIB + +#if defined(HAVE_ZLIB) && defined(HAVE_JPEGLIB) + +/* expects bitmap to be non-premultiplied */ +int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) +{ + JPEGBITS *jpeg; + int y; + int pos; + int res = 0; + U8 *data; + z_stream zs; + + pos = tag->len; + swf_SetU32(tag, 0); //placeholder + jpeg = swf_SetJPEGBitsStart(tag, width, height, quality); + U8 *scanline = (U8*)rfx_alloc(3 * width); + for (y = 0; y < height; y++) { + int x, p = 0; + for (x = 0; x < width; x++) { + //int ia = bitmap[width*y+x].a; + //if(ia) { + // /* remove premultiplication */ + // ia = 0xff0000/ia; + //} + //scanline[p++] = (bitmap[width * y + x].r*ia)>>16; + //scanline[p++] = (bitmap[width * y + x].g*ia)>>16; + //scanline[p++] = (bitmap[width * y + x].b*ia)>>16; + scanline[p++] = bitmap[width * y + x].r; + scanline[p++] = bitmap[width * y + x].g; + scanline[p++] = bitmap[width * y + x].b; + } + swf_SetJPEGBitsLine(jpeg, scanline); + } + rfx_free(scanline); + swf_SetJPEGBitsFinish(jpeg); + PUT32(&tag->data[pos], tag->len - pos - 4); + + data = (U8*)rfx_alloc(OUTBUFFER_SIZE); + memset(&zs, 0x00, sizeof(z_stream)); + + if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) { + fprintf(stderr, "rfxswf: zlib compression failed"); + return -3; + } + + zs.next_out = data; + zs.avail_out = OUTBUFFER_SIZE; + + scanline = (U8*)rfx_alloc(width); + for (y = 0; y < height; y++) { + int x, p = 0; + for (x = 0; x < width; x++) { + scanline[p++] = bitmap[width * y + x].a; + } + zs.avail_in = width; + zs.next_in = scanline; + + while (1) { + if (deflate(&zs, Z_NO_FLUSH) != Z_OK) { + fprintf(stderr, "rfxswf: zlib compression failed"); + return -4; + } + if (zs.next_out != data) { + swf_SetBlock(tag, data, zs.next_out - data); + zs.next_out = data; + zs.avail_out = OUTBUFFER_SIZE; + } + if (!zs.avail_in) { + break; + } + } + } + + rfx_free(scanline); + + while (1) { + int ret = deflate(&zs, Z_FINISH); + if (ret != Z_OK && ret != Z_STREAM_END) { + fprintf(stderr, "rfxswf: zlib compression failed"); + return -5; + } + if (zs.next_out != data) { + swf_SetBlock(tag, data, zs.next_out - data); + zs.next_out = data; + zs.avail_out = OUTBUFFER_SIZE; + } + if (ret == Z_STREAM_END) { + break; + } + } + + deflateEnd(&zs); + rfx_free(data); + return 0; +} + +#else +int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) +{ + fprintf(stderr, "Error: swftools compiled without jpeglib\n"); + return -1; +} +#endif + + +/* expects mem to be non-premultiplied */ +TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quality) +{ + TAG *tag1 = 0, *tag2 = 0; + int has_alpha = swf_ImageHasAlpha(mem,width,height); + + /* try lossless image */ + +#ifdef NO_LOSSLESS + tag1 = swf_InsertTag(0, /*ST_DEFINEBITSLOSSLESS1/2*/0); + tag1->len = 0x7fffffff; +#else + tag1 = swf_InsertTag(0, /*ST_DEFINEBITSLOSSLESS1/2*/0); + swf_SetU16(tag1, bitid); + swf_SetLosslessImage(tag1, mem, width, height); +#endif + +#if defined(HAVE_JPEGLIB) + /* try jpeg image. Notice that if (and only if) we tried the lossless compression + above, the data will now be premultiplied with alpha. */ + if(has_alpha) { + tag2 = swf_InsertTag(0, ST_DEFINEBITSJPEG3); + swf_SetU16(tag2, bitid); + swf_SetJPEGBits3(tag2, width, height, mem, quality); + } else { + tag2 = swf_InsertTag(0, ST_DEFINEBITSJPEG2); + swf_SetU16(tag2, bitid); + swf_SetJPEGBits2(tag2, width, height, mem, quality); + } +#endif + + if(quality>100 || !tag2 || (tag1 && tag1->len < tag2->len)) { + /* use the zlib version- it's smaller */ + tag1->prev = tag; + if(tag) tag->next = tag1; + tag = tag1; + swf_DeleteTag(0, tag2); + } else { + /* use the jpeg version- it's smaller */ + tag2->prev = tag; + if(tag) tag->next = tag2; + tag = tag2; + swf_DeleteTag(0, tag1); + } + return tag; +} + +RGBA *swf_ExtractImage(TAG * tag, int *dwidth, int *dheight) +{ + RGBA *img; + + swf_SetTagPos(tag, 2); // id is 2 bytes + + if (tag->id == ST_DEFINEBITSJPEG || + tag->id == ST_DEFINEBITSJPEG2 || tag->id == ST_DEFINEBITSJPEG3) { +#ifdef HAVE_JPEGLIB + return swf_JPEG2TagToImage(tag, dwidth, dheight); +#else + fprintf(stderr, "rfxswf: Error: No JPEG library compiled in"); + return 0; +#endif + } + if (tag->id == ST_DEFINEBITSLOSSLESS || + tag->id == ST_DEFINEBITSLOSSLESS2) { +#ifdef HAVE_ZLIB + return swf_DefineLosslessBitsTagToImage(tag, dwidth, dheight); +#else + fprintf(stderr, "rfxswf: Error: No JPEG library compiled in"); + return 0; +#endif + } + fprintf(stderr, "rfxswf: Error: Invalid tag (%d, %s)", tag->id, + swf_TagGetName(tag)); + return 0; +} + +#undef OUTBUFFER_SIZE + + +void swf_RemoveJPEGTables(SWF * swf) +{ + TAG *tag = swf->firstTag; + TAG *tables_tag = 0; + while (tag) { + if (tag->id == ST_JPEGTABLES) { + tables_tag = tag; + } + tag = tag->next; + } + + if (!tables_tag) + return; + + tag = swf->firstTag; + while (tag) { + if (tag->id == ST_DEFINEBITSJPEG) { + int len = tag->len; + void *data = rfx_alloc(len); + swf_GetBlock(tag, (U8*)data, tag->len); + swf_ResetTag(tag, ST_DEFINEBITSJPEG2); + swf_SetBlock(tag, &((U8*)data)[0], 2); //id + swf_SetBlock(tag, tables_tag->data, tables_tag->len); + swf_SetBlock(tag, &((U8*)data)[2], len-2); + free(data); + } + tag = tag->next; + } + if (swf->firstTag == tables_tag) + swf->firstTag = tables_tag->next; + swf_DeleteTag(swf, tables_tag); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c new file mode 100644 index 000000000..40684aa7e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c @@ -0,0 +1,148 @@ +/* swfbutton.c + + Button functions + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include "../rfxswf.h" + +int swf_ButtonSetRecord(TAG * t,U8 state,U16 id,U16 layer,MATRIX * m,CXFORM * cx) + +{ swf_SetU8(t,state); + swf_SetU16(t,id); + swf_SetU16(t,layer); + swf_SetMatrix(t,m); + if (swf_GetTagID(t)==ST_DEFINEBUTTON2) swf_SetCXForm(t,cx,1); + return 0; +} + +int swf_ButtonSetCondition(TAG * t,U16 condition) +{ swf_SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess + swf_SetU16(t,condition); + return 0; +} + +int swf_ButtonSetFlags(TAG * t,U8 flags) +{ if (swf_GetTagID(t)==ST_DEFINEBUTTON2) + { swf_SetU8(t,flags); + swf_SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess + } + return 0; +} + +void swf_SetButtonOffset(TAG * t,U32 offsetpos) +{ U32 now = swf_GetTagPos(t); + U16 diff = now-offsetpos; + swf_SetTagPos(t,offsetpos); + t->data[t->pos++] = (U8)(diff&0xff); + t->data[t->pos++] = (U8)(diff>>8); + swf_SetTagPos(t,now); +} + +int swf_ButtonPostProcess(TAG * t,int anz_action) +{ if (swf_GetTagID(t)==ST_DEFINEBUTTON2) + { U32 oldTagPos; + U32 offsetpos; + + oldTagPos = swf_GetTagPos(t); + + // scan DefineButton2 Record + + swf_GetU16(t); // Character ID + swf_GetU8(t); // Flags; + + offsetpos = swf_GetTagPos(t); // first offset + swf_GetU16(t); + + while (swf_GetU8(t)) // state -> parse ButtonRecord + { swf_GetU16(t); // id + swf_GetU16(t); // layer + swf_GetMatrix(t,NULL); // matrix + swf_GetCXForm(t,NULL,1);// CXForm + } + + swf_SetButtonOffset(t,offsetpos); + + while(anz_action) + { U8 a; + + offsetpos = swf_GetTagPos(t); // offset + swf_GetU16(t); + + swf_GetU16(t); // condition + + while ((a=swf_GetU8(t))) // skip action records + { if (a&0x80) + { U16 l = swf_GetU16(t); + swf_GetBlock(t,NULL,l); + } + } + + if (--anz_action) swf_SetButtonOffset(t,offsetpos); + } + + swf_SetTagPos(t,oldTagPos); + } + return 0; +} + +ActionTAG* swf_Button1GetAction(TAG*tag) +{ + swf_GetU16(tag); //button id + while(1) + { + U8 flags = swf_GetU8(tag); + if(!flags) + break; + swf_GetU16(tag); //char + swf_GetU16(tag); //layer + swf_ResetReadBits(tag); + swf_GetMatrix(tag, NULL); + } + return swf_ActionGet(tag); +} + +ActionTAG* swf_Button2GetAction(TAG*tag) +{ + swf_GetU16(tag); //button id + swf_GetU8(tag); //flag + U16 offset = swf_GetU16(tag); //offset + swf_SetTagPos(tag, offset); + swf_GetU16(tag); // next offset + swf_GetU16(tag); // condition + + /* notice: this only returns the *first* action block. + For the current appliances, this is enough. + */ + return swf_ActionGet(tag); +} + +ActionTAG* swf_ButtonGetAction(TAG*t) +{ + if(t->id == ST_DEFINEBUTTON) { + return swf_Button1GetAction(t); + } else if(t->id == ST_DEFINEBUTTON2) { + return swf_Button2GetAction(t); + } else { + fprintf(stderr, "error in buttongetaction: not a button tag\n"); + return 0; + } +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c new file mode 100644 index 000000000..aa86e4938 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c @@ -0,0 +1,193 @@ +/* swfcgi.c + + Parse CGI parameters + + Partly adopted from Steven Grimm's uncgi tool and library. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../rfxswf.h" + +#define ishex(x) (((x) >= '0' && (x) <= '9') || ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F')) + +#define PREFIX "WWW_" + +static int swf_htoi(unsigned char * s) +{ int value; + char c; + + c = s[0]; + if (isupper(c)) c = tolower(c); + value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16; + + c = s[1]; + if (isupper(c)) c = tolower(c); + value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10; + + return (value); +} + +static void swf_url_unescape(unsigned char * s) +{ unsigned char *dest = s; + + while (s[0]) + { if (s[0] == '+') dest[0] = ' '; + else + { if (s[0] == '%' && ishex(s[1]) && ishex(s[2])) + { dest[0] = (unsigned char) swf_htoi(s + 1); + s += 2; + } + else dest[0] = s[0]; + } + s++;dest++; + } + dest[0] = 0; +} + +static void swf_cgienv(unsigned char * var) +{ unsigned char *buf, *c, *s, *t, *oldval = NULL, *newval; + int despace = 0, got_cr = 0; + + // fprintf(stderr,"%s\n",var); + swf_url_unescape(var); + // fprintf(stderr,"%s\n",var); + + + buf = (unsigned char*)rfx_alloc(strlen((const char*)var) + sizeof(PREFIX) + 2); + if (!buf) return; + + strcpy((char*)buf, (const char*)PREFIX); + if (var[0] == '_') + { strcpy((char*)&buf[sizeof(PREFIX)-1], (const char*)&var[1]); + despace = 1; + } + else strcpy((char*)&buf[sizeof(PREFIX)-1], (const char*)var); + + for (c = buf; c[0] ; c++) + { if (c[0] == '.') c[0] = '_'; + if (c[0] == '=') break; + } + if (!c[0]) c[1] = 0; + c[0] = 0; + + if (despace && c[1]) + { for (s = c+1; s[0] && isspace(s[0]); s++); + t = c + 1; + while (s[0]) + { if (s[0] == '\r') + { got_cr = 1; + s++; + continue; + } + if (got_cr) + { if (s[0] != '\n') + *t++ = '\n'; + got_cr = 0; + } + *t++ = *s++; + } + while (t > c && isspace(*--t)); + t[1] = 0; + } + + if ((oldval = (unsigned char*)getenv((const char*)buf))) + { newval = (unsigned char*)rfx_alloc(strlen((const char*)oldval) + strlen((const char *)buf) + strlen((const char*)&c[1]) + 3); + if (!newval) return; + + c[0] = '='; + sprintf((char*)newval, "%s#%s", buf, oldval); + c[0] = 0; + + oldval -= strlen((const char*)buf) + 1; // skip past VAR= + } + else + { c[0] = '='; + newval = buf; + } + + putenv((char *)newval); + + if (oldval) + { rfx_free(oldval); + rfx_free(buf); + } +} + +static void swf_scanquery(char * q) +{ char *next = q; + if (!q) return; + + while (next) + { next = strchr(q, '&'); + if (next) next[0] = 0; + swf_cgienv((unsigned char*)q); + if (next) + { next[0] = '&'; + q = next+1; + } + } +} + +char * swf_postread() +{ char * buf = NULL; + int size = 0, sofar = 0, got; + + buf = getenv("CONTENT_TYPE"); + if ((!buf) || strcmp(buf, "application/x-www-form-urlencoded")) return NULL; + + buf = getenv("CONTENT_LENGTH"); + if (!buf) return NULL; + + size = atoi(buf); + buf = (char*)rfx_alloc(size + 1); + if (buf) + { do + { got = fread(buf + sofar, 1, size - sofar, stdin); + sofar += got; + } while (got && sofar < size); + buf[sofar] = 0; + } + + return buf; +} + +void swf_uncgi() +{ char *query, *dupquery, *method; + + query = getenv("QUERY_STRING"); + if ((query) && strlen(query)) + { dupquery = strdup(query); + swf_scanquery(dupquery); + rfx_free(dupquery); + } + + method = getenv("REQUEST_METHOD"); + if ((method) && ! strcmp(method, "POST")) + { query = swf_postread(); + if ((query)&&(query[0]!=0)) swf_scanquery(query); + rfx_free(query); + } + +} + +#undef ishex +#undef PREFIX diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c new file mode 100644 index 000000000..ba601a3c4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c @@ -0,0 +1,221 @@ +// swfdraw.c + +#include "../rfxswf.h" + +typedef struct _SWFSHAPEDRAWER +{ + SHAPE*shape; + TAG*tag; + int tagfree; + SCOORD firstx; + SCOORD firsty; + SCOORD lastx; + SCOORD lasty; + SRECT bbox; + char isfinished; +} SWFSHAPEDRAWER; + +static void swf_ShapeDrawerSetLineStyle(drawer_t*draw, void*style); +static void swf_ShapeDrawerSetFillStyle(drawer_t*draw, void*style); +static void swf_ShapeDrawerMoveTo(drawer_t*draw, FPOINT * to); +static void swf_ShapeDrawerLineTo(drawer_t*draw, FPOINT * to); +static void swf_ShapeDrawerSplineTo(drawer_t*draw, FPOINT * c1, FPOINT* to); +static void swf_ShapeDrawerFinish(drawer_t*draw); +static void swf_ShapeDrawerClear(drawer_t*draw); + +static void swf_ShapeDrawerInit(drawer_t*draw, TAG*tag, int fillstylebits, int linestylebits) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)rfx_calloc(sizeof(SWFSHAPEDRAWER)); + draw->internal = sdraw; + + draw->setLineStyle = swf_ShapeDrawerSetLineStyle; + draw->setFillStyle = swf_ShapeDrawerSetFillStyle; + draw->moveTo = swf_ShapeDrawerMoveTo; + draw->lineTo = swf_ShapeDrawerLineTo; + draw->splineTo = swf_ShapeDrawerSplineTo; + draw->finish = swf_ShapeDrawerFinish; + draw->dealloc = swf_ShapeDrawerClear; + + sdraw->tagfree = 0; + if(tag == 0) { + tag = swf_InsertTag(0, ST_DEFINESHAPE); + sdraw->tagfree = 1; + } + sdraw->tag = tag; + swf_ShapeNew(&sdraw->shape); + draw->pos.x = 0; + draw->pos.y = 0; + + swf_SetU8(sdraw->tag,0); + sdraw->shape->bits.fill = fillstylebits; + sdraw->shape->bits.line = linestylebits; + + sdraw->bbox.xmin = sdraw->bbox.ymin = SCOORD_MAX; + sdraw->bbox.xmax = sdraw->bbox.ymax = SCOORD_MIN; + + sdraw->isfinished = 0; + + swf_ShapeSetStyle(sdraw->tag,sdraw->shape,linestylebits?1:0,fillstylebits?1:0,0/*?*/); +} + +void swf_Shape10DrawerInit(drawer_t*draw, TAG*tag) +{ + swf_ShapeDrawerInit(draw, tag, 0, 1); +} + +void swf_Shape01DrawerInit(drawer_t*draw, TAG*tag) +{ + swf_ShapeDrawerInit(draw, tag, 1, 0); +} + +void swf_Shape11DrawerInit(drawer_t*draw, TAG*tag) +{ + swf_ShapeDrawerInit(draw, tag, 1, 1); +} + +static void swf_ShapeDrawerSetLineStyle(drawer_t*draw, void*style) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; +} +static void swf_ShapeDrawerSetFillStyle(drawer_t*draw, void*style) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; +} +static void fixEndPoint(drawer_t*draw) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + if( sdraw->firstx != sdraw->lastx + || sdraw->firsty != sdraw->lasty) { + /* fix non-closing shapes */ + FPOINT to; + to.x = sdraw->firstx/20.0; + to.y = sdraw->firsty/20.0; + if(sdraw->shape->bits.fill) // do this only if the shape is filled + draw->lineTo(draw, &to); + } +} +static void swf_ShapeDrawerMoveTo(drawer_t*draw, FPOINT * to) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + int x = floor(to->x*20); + int y = floor(to->y*20); + + /* Flash will ignore a moveto (0,0) in glyphs. Hence, we map + all (0,0)s to (0.05,0)s in moveto,lineto and splineto. */ + + if(!x&&!y) + x++; + + /* we need to write moveto always- it + might be that it signals the end of a polygon, otherwise + we would end up connecting two polygons which should + be seperate + TODO: check if the last operation was a moveTo- if + yes we *can* skip it. + */ + + //if(sdraw->lastx != x || sdraw->lasty != y) { + fixEndPoint(draw); + swf_ShapeSetMove(sdraw->tag,sdraw->shape,x,y); + sdraw->firstx = sdraw->lastx = x; + sdraw->firsty = sdraw->lasty = y; + draw->pos = *to; + //} +} +static void swf_ShapeDrawerLineTo(drawer_t*draw, FPOINT * to) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + int x = floor(to->x*20); + int y = floor(to->y*20); + if(!x&&!y) + x++; + if(sdraw->lastx < sdraw->bbox.xmin) sdraw->bbox.xmin = sdraw->lastx; + if(sdraw->lasty < sdraw->bbox.ymin) sdraw->bbox.ymin = sdraw->lasty; + if(sdraw->lastx > sdraw->bbox.xmax) sdraw->bbox.xmax = sdraw->lastx; + if(sdraw->lasty > sdraw->bbox.ymax) sdraw->bbox.ymax = sdraw->lasty; + if(x < sdraw->bbox.xmin) sdraw->bbox.xmin = x; + if(y < sdraw->bbox.ymin) sdraw->bbox.ymin = y; + if(x > sdraw->bbox.xmax) sdraw->bbox.xmax = x; + if(y > sdraw->bbox.ymax) sdraw->bbox.ymax = y; + swf_ShapeSetLine(sdraw->tag,sdraw->shape,x-sdraw->lastx,y-sdraw->lasty); + sdraw->lastx = x; + sdraw->lasty = y; + draw->pos = *to; +} +static void swf_ShapeDrawerSplineTo(drawer_t*draw, FPOINT * c1, FPOINT* to) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + int tx = floor(c1->x*20); + int ty = floor(c1->y*20); + int x = floor(to->x*20); + int y = floor(to->y*20); + if(!x&&!y) + x++; + if(sdraw->lastx < sdraw->bbox.xmin) sdraw->bbox.xmin = sdraw->lastx; + if(sdraw->lasty < sdraw->bbox.ymin) sdraw->bbox.ymin = sdraw->lasty; + if(sdraw->lastx > sdraw->bbox.xmax) sdraw->bbox.xmax = sdraw->lastx; + if(sdraw->lasty > sdraw->bbox.ymax) sdraw->bbox.ymax = sdraw->lasty; + if(x < sdraw->bbox.xmin) sdraw->bbox.xmin = x; + if(y < sdraw->bbox.ymin) sdraw->bbox.ymin = y; + if(x > sdraw->bbox.xmax) sdraw->bbox.xmax = x; + if(y > sdraw->bbox.ymax) sdraw->bbox.ymax = y; + if(tx < sdraw->bbox.xmin) sdraw->bbox.xmin = tx; + if(ty < sdraw->bbox.ymin) sdraw->bbox.ymin = ty; + if(tx > sdraw->bbox.xmax) sdraw->bbox.xmax = tx; + if(ty > sdraw->bbox.ymax) sdraw->bbox.ymax = ty; + swf_ShapeSetCurve(sdraw->tag,sdraw->shape, tx-sdraw->lastx,ty-sdraw->lasty, x-tx,y-ty); + sdraw->lastx = x; + sdraw->lasty = y; + draw->pos = *to; +} +static void swf_ShapeDrawerFinish(drawer_t*draw) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + if(sdraw->isfinished) + return; + + fixEndPoint(draw); + + if(sdraw->bbox.xmin == SCOORD_MAX) { + /* no points at all -> empty bounding box */ + sdraw->bbox.xmin = sdraw->bbox.ymin = + sdraw->bbox.xmax = sdraw->bbox.ymax = 0; + } + sdraw->isfinished = 1; + swf_ShapeSetEnd(sdraw->tag); +} + +static void swf_ShapeDrawerClear(drawer_t*draw) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + if(sdraw->tagfree) { + swf_DeleteTag(0, sdraw->tag); + sdraw->tag = 0; + } + swf_ShapeFree(sdraw->shape); + sdraw->shape = 0; + + rfx_free(draw->internal); + draw->internal = 0; +} + +SRECT swf_ShapeDrawerGetBBox(drawer_t*draw) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + return sdraw->bbox; +} + +SHAPE* swf_ShapeDrawerToShape(drawer_t*draw) +{ + SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; + SHAPE* shape = (SHAPE*)rfx_alloc(sizeof(SHAPE)); + if(!sdraw->isfinished) { + fprintf(stderr, "Warning: you should Finish() your drawer before calling DrawerToShape"); + swf_ShapeDrawerFinish(draw); + } + memcpy(shape, sdraw->shape, sizeof(SHAPE)); + shape->bitlen = (sdraw->tag->len-1)*8; + shape->data = (U8*)rfx_alloc(sdraw->tag->len-1); + memcpy(shape->data, &sdraw->tag->data[1], sdraw->tag->len-1); + return shape; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c new file mode 100644 index 000000000..92cce4f58 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c @@ -0,0 +1,275 @@ +/* swfdump.c + + Dump / debug functions + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../rfxswf.h" + +void swf_DumpHeader(FILE * f,SWF * swf) +{ if (!f) f = stderr; + fprintf(f,"File size\t%u\n",swf->fileSize); + fprintf(f,"Movie width\t%u\n",(swf->movieSize.xmax - swf->movieSize.xmin)/20); + fprintf(f,"Movie height\t%u\n",(swf->movieSize.ymax - swf->movieSize.ymin)/20); + fprintf(f,"Frame rate\t%u.%u\n",swf->frameRate>>8,swf->frameRate&0xff); + fprintf(f,"Frame count\t%u\n",swf->frameCount); +} + +void swf_DumpMatrix(FILE * f,MATRIX * m) +{ if (!f) f = stderr; + /*fprintf(f,"[%08x][%08x]\n",m->sx,m->r1); + fprintf(f,"[%08x][%08x]\n",m->r0,m->sy); + fprintf(f," %08x, %08x\n",m->tx,m->ty);*/ + fprintf(f,"[%08x][%08x] %5.2f %5.2f %5.2f\n",m->sx,m->r1, m->sx/65536.0,m->r1/65536.0, m->tx/20.0); + fprintf(f,"[%08x][%08x] %5.2f %5.2f %5.2f\n",m->r0,m->sy, m->r0/65536.0,m->sy/65536.0, m->ty/20.0 ); + fprintf(f," %08x, %08x \n",m->tx,m->ty); +} + +void swf_DumpGradient(FILE * f,GRADIENT * g) +{ if (!f) f = stderr; + fprintf(f, "%d gradient steps\n", g->num); + int t; + for(t=0;tnum;t++) { + RGBA c = g->rgba[t]; + fprintf(f, "%d) %02x%02x%02x%02x at %d\n", t, c.r,c.g,c.b,c.a, g->ratios[t]); + } +} + +void swf_DumpTag(FILE * f,TAG * t) +{ int i; + if (!f) f = stderr; + for (i=0;ilen;i++) + { if (!(i&15)) fprintf(f,"\n"); + fprintf(f,"%02x ",t->data[i]); + } + fprintf(f,"\n"); +} + +void swf_DumpSWF(FILE * f, SWF*swf) +{ + TAG* tag = swf->firstTag; + fprintf(f, "vvvvvvvvvvvvvvvvvvvvv\n"); + while(tag) { + printf("%8d %s\n", tag->len, swf_TagGetName(tag)); + tag = tag->next; + } + fprintf(f, "^^^^^^^^^^^^^^^^^^^^^\n"); +} + +void swf_DumpFont(SWFFONT * font) +{ + printf("ID: %d\n", font->id); + printf("Version: %d\n", font->version); + printf("name: %s\n", font->name); + printf("characters: %d\n", font->numchars); + printf("biggest mapped ascii value: %d\n", font->maxascii); + printf("layout: %s\n", font->layout?"yes":"no"); + if(font->layout) + { + printf(" ascent:%d\n", font->layout->ascent); + printf(" descent:%d\n", font->layout->descent); + printf(" leading:%d\n", font->layout->leading); + printf(" bounds: (not shown)\n"); + printf(" kerning records:%d\n", font->layout->kerningcount); + printf(" kerning records: (not shown)\n"); + } + printf("style: %d\n", font->style); + printf("encoding: %d\n", font->encoding); + printf("language: %d\n", font->language); +} + +void swf_DumpShape(SHAPE2*shape2) +{ + SHAPELINE*l = shape2->lines; + while(l) { + if(l->type == moveTo) { + //printf("fill %d/%d line %d\n", l->fillstyle0, l->fillstyle1, l->linestyle); + printf("moveTo %.2f,%.2f (fill0:%d fill1:%d line:%d)\n", l->x/20.0, l->y/20.0, l->fillstyle0, l->fillstyle1, l->linestyle); + } + if(l->type == lineTo) { + //printf("fill %d/%d line %d\n", l->fillstyle0, l->fillstyle1, l->linestyle); + printf("lineTo %.2f,%.2f (fill0:%d fill1:%d line:%d)\n", l->x/20.0, l->y/20.0, l->fillstyle0, l->fillstyle1, l->linestyle); + } + if(l->type == splineTo) { + //printf("fill %d/%d line %d\n", l->fillstyle0, l->fillstyle1, l->linestyle); + printf("splineTo %.2f,%.2f %.2f,%.2f (fill0:%d fill1:%d line:%d)\n", l->sx/20.0, l->sy/20.0, l->x/20.0, l->y/20.0, l->fillstyle0, l->fillstyle1, l->linestyle); + } + l = l->next; + } +} + +char* swf_TagGetName(TAG*tag) +{ + switch(tag->id) + { + case ST_END: + return "END"; + case ST_SHOWFRAME: + return "SHOWFRAME"; + case ST_DEFINESHAPE: + return "DEFINESHAPE"; + case ST_FREECHARACTER: + return "FREECHARACTER"; + case ST_PLACEOBJECT: + return "PLACEOBJECT"; + case ST_REMOVEOBJECT: + return "REMOVEOBJECT"; + case ST_DEFINEBITSJPEG: + return "DEFINEBITSJPEG"; + case ST_DEFINEBUTTON: + return "DEFINEBUTTON"; + case ST_JPEGTABLES: + return "JPEGTABLES"; + case ST_SETBACKGROUNDCOLOR: + return "SETBACKGROUNDCOLOR"; + case ST_DEFINEFONT: + return "DEFINEFONT"; + case ST_DEFINETEXT: + return "DEFINETEXT"; + case ST_DEFINEEDITTEXT: + return "DEFINEEDITTEXT"; + case ST_DOACTION: + return "DOACTION"; + case ST_DOABC: + return "DOABC"; + case ST_RAWABC: + return "RAWABC"; + case ST_DEFINEFONTINFO: + return "DEFINEFONTINFO"; + case ST_DEFINESOUND: + return "DEFINESOUND"; + case ST_STARTSOUND: + return "STARTSOUND"; + case ST_DEFINEBUTTONSOUND: + return "DEFINEBUTTONSOUND"; + case ST_SOUNDSTREAMHEAD: + return "SOUNDSTREAMHEAD"; + case ST_SOUNDSTREAMBLOCK: + return "SOUNDSTREAMBLOCK"; + case ST_DEFINEBITSLOSSLESS: + return "DEFINEBITSLOSSLESS"; + case ST_DEFINEBITSJPEG2: + return "DEFINEBITSJPEG2"; + case ST_DEFINESHAPE2: + return "DEFINESHAPE2"; + case ST_DEFINEBUTTONCXFORM: + return "DEFINEBUTTONCXFORM"; + case ST_PROTECT: + return "PROTECT"; + case ST_PLACEOBJECT2: + return "PLACEOBJECT2"; + case ST_REMOVEOBJECT2: + return "REMOVEOBJECT2"; + case ST_DEFINESHAPE3: + return "DEFINESHAPE3"; + case ST_DEFINETEXT2: + return "DEFINETEXT2"; + case ST_DEFINEBUTTON2: + return "DEFINEBUTTON2"; + case ST_DEFINEBITSJPEG3: + return "DEFINEBITSJPEG3"; + case ST_DEFINEBITSLOSSLESS2: + return "DEFINEBITSLOSSLESS2"; + case ST_DEFINESPRITE: + return "DEFINESPRITE"; + case ST_NAMECHARACTER: + return "NAMECHARACTER"; + case ST_SERIALNUMBER: + return "SERIALNUMBER"; + case ST_GENERATORTEXT: + return "GENERATORTEXT"; + case ST_FRAMELABEL: + return "FRAMELABEL"; + case ST_SOUNDSTREAMHEAD2: + return "SOUNDSTREAMHEAD2"; + case ST_DEFINEMORPHSHAPE: + return "DEFINEMORPHSHAPE"; + case ST_DEFINEMORPHSHAPE2: + return "DEFINEMORPHSHAPE2"; + case ST_DEFINEFONT2: + return "DEFINEFONT2"; + case ST_TEMPLATECOMMAND: + return "TEMPLATECOMMAND"; + case ST_GENERATOR3: + return "GENERATOR3"; + case ST_EXTERNALFONT: + return "EXTERNALFONT"; + case ST_EXPORTASSETS: + return "EXPORTASSETS"; + case ST_SYMBOLCLASS: + return "SYMBOLCLASS"; + case ST_DEFINEBINARY: + return "DEFINEBINARY"; + case ST_IMPORTASSETS: + return "IMPORTASSETS"; + case ST_ENABLEDEBUGGER: + return "ENABLEDEBUGGER"; + case ST_DOINITACTION: + return "DOINITACTION"; + case ST_DEFINEMOVIE: + return "DEFINEMOVIE"; + case ST_DEFINEVIDEOSTREAM: + return "DEFINEVIDEOSTREAM"; + case ST_VIDEOFRAME: + return "VIDEOFRAME"; + case ST_DEFINEFONTINFO2: + return "DEFINEFONTINFO2"; + case ST_FILEATTRIBUTES: + return "FILEATTRIBUTES"; + case ST_IMPORTASSETS2: + return "IMPORTASSETS2"; + case ST_DEFINESCALINGGRID: + return "DEFINESCALINGGRID"; + case ST_DEFINESHAPE4: + return "DEFINESHAPE4"; + case ST_DEFINEFONT3: + return "DEFINEFONT3"; + case ST_DEFINEFONTALIGNZONES: + return "DEFINEFONTALIGNZONES"; + case ST_DEFINEFONTNAME: + return "DEFINEFONTNAME"; + case ST_CSMTEXTSETTINGS: + return "CSMTEXTSETTINGS"; + case ST_FREEALL: + return "FREEALL"; + case ST_MX4: + return "MX4"; + case ST_SCRIPTLIMITS: + return "SCRIPTLIMITS"; + case ST_SETTABINDEX: + return "SETTABINDEX"; + case ST_ENABLEDEBUGGER2: + return "ENABLEDEBUGGER2"; + case ST_PLACEOBJECT3: + return "PLACEOBJECT3"; + case ST_METADATA: + return "METADATA"; + case ST_SCENEDESCRIPTION: + return "SCENEDESCRIPTION"; + + case ST_REFLEX: + return "REFLEX"; + case ST_GLYPHNAMES: + return "GLYPHNAMES"; + } + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c new file mode 100644 index 000000000..02ef5dbdc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c @@ -0,0 +1,170 @@ +#include +#include +#include "../rfxswf.h" + +char* filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel", 0}; + +void swf_SetFilter(TAG*tag, FILTER*filter) +{ + swf_SetU8(tag, filter->type); + if(filter->type == FILTERTYPE_BLUR) { + FILTER_BLUR*f = (FILTER_BLUR*)filter; + swf_SetFixed(tag, f->blurx); + swf_SetFixed(tag, f->blury); + U8 flags = f->passes << 3; + swf_SetU8(tag, flags); + } else if(filter->type == FILTERTYPE_GLOW) { + FILTER_GLOW*f = (FILTER_GLOW*)filter; + } else if(filter->type == FILTERTYPE_DROPSHADOW) { + FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter; + swf_SetRGBA(tag, &f->color); + swf_SetFixed(tag, f->blurx); + swf_SetFixed(tag, f->blury); + swf_SetFixed(tag, f->angle); + swf_SetFixed(tag, f->distance); + swf_SetFixed8(tag, f->strength); + U8 flags = f->innershadow<<7|f->knockout<<6|f->composite<<5|f->passes; + swf_SetU8(tag, flags); + } else if(filter->type == FILTERTYPE_GRADIENTGLOW) { + FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter; + swf_SetU8(tag, f->gradient->num); + int s; + for(s=0;sgradient->num;s++) + swf_SetRGBA(tag, &f->gradient->rgba[s]); + for(s=0;sgradient->num;s++) + swf_SetU8(tag, f->gradient->ratios[s]); + + swf_SetFixed(tag, f->blurx); + swf_SetFixed(tag, f->blury); + swf_SetFixed(tag, f->angle); + swf_SetFixed(tag, f->distance); + swf_SetFixed8(tag, f->strength); + U8 flags = f->passes|f->innershadow<<7|f->knockout<<6|f->composite<<5|f->ontop<<4; + swf_SetU8(tag, flags); + } else if(filter->type == FILTERTYPE_BEVEL) { + FILTER_BEVEL*f = (FILTER_BEVEL*)filter; + swf_SetRGBA(tag, &f->shadow); + swf_SetRGBA(tag, &f->highlight); + swf_SetFixed(tag, f->blurx); + swf_SetFixed(tag, f->blury); + swf_SetFixed(tag, f->angle); + swf_SetFixed(tag, f->distance); + swf_SetFixed8(tag, f->strength); + U8 flags = f->passes|f->innershadow<<7|f->knockout<<6|f->composite<<5|f->ontop<<4; + swf_SetU8(tag, flags); + } else { + fprintf(stderr, "Writing of filter type %02x not supported yet\n", filter->type); + } +} + +FILTER*swf_GetFilter(TAG*tag) +{ + U8 type = swf_GetU8(tag); + FILTER*filter; + if(type == FILTERTYPE_BLUR) { + FILTER_BLUR* f = (FILTER_BLUR*)rfx_calloc(sizeof(FILTER_BLUR)); + f->type = type; + f->blurx = swf_GetFixed(tag); + f->blury = swf_GetFixed(tag); + U8 flags = swf_GetU8(tag); + f->passes = (flags&15)<<3; + return (FILTER*)f; + } else if(type == FILTERTYPE_GLOW) { + FILTER_GLOW* f = (FILTER_GLOW*)rfx_calloc(sizeof(FILTER_GLOW)); + f->type = type; + swf_GetRGBA(tag, &f->rgba); + f->blurx = swf_GetFixed(tag); + f->blury = swf_GetFixed(tag); + f->strength = swf_GetFixed8(tag); + U8 flags = swf_GetU8(tag); + f->passes = flags&31; + f->innerglow = (flags>>7)&1; + f->knockout = (flags>>6)&1; + f->composite = (flags>>5)&1; + return (FILTER*)f; + } else if(type == FILTERTYPE_GRADIENTGLOW) { + FILTER_GRADIENTGLOW* f = (FILTER_GRADIENTGLOW*)rfx_calloc(sizeof(FILTER_GRADIENTGLOW)); + f->type = type; + f->gradient = (GRADIENT*)rfx_calloc(sizeof(GRADIENT)); + f->gradient->num = swf_GetU8(tag); + f->gradient->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*f->gradient->num); + f->gradient->ratios = (U8*)rfx_calloc(sizeof(U8)*f->gradient->num); + int s; + for(s=0;sgradient->num;s++) + swf_GetRGBA(tag, &f->gradient->rgba[s]); + for(s=0;sgradient->num;s++) + f->gradient->ratios[s] = swf_GetU8(tag); + + f->blurx = swf_GetFixed(tag); + f->blury = swf_GetFixed(tag); + f->angle = swf_GetFixed(tag); + f->distance = swf_GetFixed(tag); + f->strength = swf_GetFixed8(tag); + U8 flags = swf_GetU8(tag); + f->passes = flags&15; + f->innershadow = (flags>>7)&1; + f->knockout = (flags>>6)&1; + f->composite = (flags>>5)&1; + f->ontop = (flags>>4)&1; + return (FILTER*)f; + } else if(type == FILTERTYPE_DROPSHADOW) { + FILTER_DROPSHADOW* f = (FILTER_DROPSHADOW*)rfx_calloc(sizeof(FILTER_DROPSHADOW)); + f->type = type; + swf_GetRGBA(tag, &f->color); + f->blurx = swf_GetFixed(tag); + f->blury = swf_GetFixed(tag); + f->angle = swf_GetFixed(tag); + f->distance = swf_GetFixed(tag); + f->strength = swf_GetFixed8(tag); + U8 flags = swf_GetU8(tag); + f->passes = flags&31; + f->innershadow = (flags>>7)&1; + f->knockout = (flags>>6)&1; + f->composite = (flags>>5)&1; + return (FILTER*)f; + } else if(type == FILTERTYPE_BEVEL) { + FILTER_BEVEL* f = (FILTER_BEVEL*)rfx_calloc(sizeof(FILTER_BEVEL)); + f->type = type; + swf_GetRGBA(tag, &f->shadow); + swf_GetRGBA(tag, &f->highlight); + f->blurx = swf_GetFixed(tag); + f->blury = swf_GetFixed(tag); + f->angle = swf_GetFixed(tag); + f->distance = swf_GetFixed(tag); + f->strength = swf_GetFixed8(tag); + U8 flags = swf_GetU8(tag); + f->passes = flags&15; + f->innershadow = (flags>>7)&1; + f->knockout = (flags>>6)&1; + f->composite = (flags>>5)&1; + f->ontop = (flags>>4)&1; + return (FILTER*)f; + } else { + fprintf(stderr, "Reading of filter type %02x not supported yet\n", type); + } + return 0; +} + +FILTER*swf_NewFilter(U8 type) +{ + FILTER*f = 0; + if(type == FILTERTYPE_BLUR) + f = (FILTER*)rfx_calloc(sizeof(FILTER_BLUR)); + else if(type == FILTERTYPE_GRADIENTGLOW) + f = (FILTER*)rfx_calloc(sizeof(FILTER_GRADIENTGLOW)); + else if(type == FILTERTYPE_DROPSHADOW) + f = (FILTER*)rfx_calloc(sizeof(FILTER_DROPSHADOW)); + else if(type == FILTERTYPE_BEVEL) + f = (FILTER*)rfx_calloc(sizeof(FILTER_BEVEL)); + else + fprintf(stderr, "Creation of filter type %02x not supported yet\n", type); + if(f) + f->type = type; + return f; +} + +void swf_DeleteFilter(FILTER*f) +{ + //FIXME + free(f); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c new file mode 100644 index 000000000..986c07d72 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c @@ -0,0 +1,605 @@ +/* swffont.c + + Functions for loading external fonts. + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2003, 2004 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../rfxswf.h" + +static int loadfont_scale = 4; +static int skip_unused = 1; +static int full_unicode = 0; + +void swf_SetLoadFontParameters(int _scale, int _skip_unused, int _full_unicode) +{ + if(_scale) loadfont_scale = _scale; + skip_unused = _skip_unused; + full_unicode = _full_unicode; +} + +#ifdef HAVE_FREETYPE + +#ifdef HAVE_FT2BUILD_H +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SIZES_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H +#else +#include +#include +#include +#include +#include +#include +#endif + +/* Setting subpixels to 64 also means that the "point size" of the + font outlines will be 64. So the font, when rendered at original + size (i.e., the swf fontsize is 1024) will have the same size as + if it was rendered at 64pt */ + +#define FT_SCALE 1 +#define FT_SUBPIXELS 64 + +static int ft_move_to(const FT_Vector* _to, void* user) +{ + drawer_t* draw = (drawer_t*)user; + FPOINT to; + to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + draw->moveTo(draw, &to); + return 0; +} +static int ft_line_to(const FT_Vector* _to, void* user) +{ + drawer_t* draw = (drawer_t*)user; + FPOINT to; + to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + draw->lineTo(draw, &to); + return 0; +} +static int ft_conic_to(const FT_Vector* _c, const FT_Vector* _to, void* user) +{ + drawer_t* draw = (drawer_t*)user; + FPOINT c,to; + to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + c.x = _c->x*FT_SCALE/(float)FT_SUBPIXELS; + c.y = -_c->y*FT_SCALE/(float)FT_SUBPIXELS; + draw_conicTo(draw, &c, &to); + return 0; +} +static int ft_cubic_to(const FT_Vector* _c1, const FT_Vector* _c2, const FT_Vector* _to, void* user) +{ + drawer_t* draw = (drawer_t*)user; + FPOINT c1,c2,to; + to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; + to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; + c1.x = _c1->x*FT_SCALE/(float)FT_SUBPIXELS; + c1.y = -_c1->y*FT_SCALE/(float)FT_SUBPIXELS; + c2.x = _c2->x*FT_SCALE/(float)FT_SUBPIXELS; + c2.y = -_c2->y*FT_SCALE/(float)FT_SUBPIXELS; + draw_cubicTo(draw, &c1, &c2, &to); + return 0; +} +static FT_Outline_Funcs outline_functions = +{ + ft_move_to, + ft_line_to, + ft_conic_to, + ft_cubic_to, + 0,0 +}; + +static FT_Library ftlibrary = 0; + +SWFFONT* swf_LoadTrueTypeFont(const char*filename, char flashtype) +{ + FT_Face face; + FT_Error error; + const char* name = 0; + FT_ULong charcode; + FT_UInt gindex; + SWFFONT* font; + int t; + int*glyph2glyph; + int max_unicode = 0; + int charmap = -1; + + if(ftlibrary == 0) { + if(FT_Init_FreeType(&ftlibrary)) { + fprintf(stderr, "Couldn't init freetype library!\n"); + exit(1); + } + } + error = FT_New_Face(ftlibrary, filename, 0, &face); + + if(error || !face) { + fprintf(stderr, "Couldn't load file %s- not a TTF file?\n", filename); + return 0; + } + + int scale = flashtype?20:1; + FT_Set_Pixel_Sizes (face, 16*loadfont_scale*scale, 16*loadfont_scale*scale); + + if(face->num_glyphs <= 0) { + fprintf(stderr, "File %s contains %d glyphs\n", filename, (int)face->num_glyphs); + return 0; + } + + font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); + font->id = -1; + font->version = flashtype?3:2; + + font->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); + font->layout->bounds = (SRECT*)rfx_calloc(face->num_glyphs*sizeof(SRECT)); + font->style = ((face->style_flags&FT_STYLE_FLAG_ITALIC)?FONT_STYLE_ITALIC:0) + |((face->style_flags&FT_STYLE_FLAG_BOLD)?FONT_STYLE_BOLD:0); + font->encoding = FONT_ENCODING_UNICODE; + font->glyph2ascii = (U16*)rfx_calloc(face->num_glyphs*sizeof(U16)); + font->maxascii = 0; + font->glyph = (SWFGLYPH*)rfx_calloc(face->num_glyphs*sizeof(SWFGLYPH)); + if(FT_HAS_GLYPH_NAMES(face)) { + font->glyphnames = (char**)rfx_calloc(face->num_glyphs*sizeof(char*)); + } + + font->layout->kerningcount = 0; + + name = face->family_name; + if(!(name && *name)) + name = FT_Get_Postscript_Name(face); + if(name && *name) + font->name = (U8*)strdup(name); + + while(1) + { + /* // Map Glyphs to Unicode, version 1 (quick and dirty): + int t; + for(t=0;t<65536;t++) { + int index = FT_Get_Char_Index(face, t); + if(index>=0 && indexnum_glyphs) { + if(font->glyph2ascii[index]<0) + font->glyph2ascii[index] = t; + } + }*/ + + // Map Glyphs to Unicode, version 2 (much nicer): + // (The third way would be the AGL algorithm, as proposed + // by Werner Lemberg on freetype@freetype.org) + + charcode = FT_Get_First_Char(face, &gindex); + while(gindex != 0) + { + if(gindex >= 0 && gindexnum_glyphs) { + if(!font->glyph2ascii[gindex]) { + font->glyph2ascii[gindex] = charcode; + if(charcode + 1 > font->maxascii) { + font->maxascii = charcode + 1; + } + } + } + charcode = FT_Get_Next_Char(face, charcode, &gindex); + } + + /* if we didn't find a single encoding character, try + the font's charmaps instead. That usually means that + the encoding is no longer unicode. + TODO: find a way to convert the encoding to unicode + */ + if(font->maxascii == 0 && charmap < face->num_charmaps - 1) { + charmap++; + FT_Set_Charmap(face, face->charmaps[charmap]); + font->encoding = 0;//anything but unicode FIXME + } else + break; + } + + if(full_unicode) + font->maxascii = 65535; + + font->ascii2glyph = (int*)rfx_calloc(font->maxascii*sizeof(int)); + + for(t=0;tmaxascii;t++) { + int g = FT_Get_Char_Index(face, t); + if(!g || g>=face->num_glyphs) + g = -1; + font->ascii2glyph[t] = g; + if(g>=0) { + max_unicode = t+1; + if(!font->glyph2ascii[g]) { + font->glyph2ascii[g] = t; + } + } + } + font->maxascii = max_unicode; + + font->numchars = 0; + + glyph2glyph = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); + + SRECT fontbbox = {0,0,0,0}; + + for(t=0; t < face->num_glyphs; t++) { + FT_Glyph glyph; + FT_BBox bbox; + char name[128]; + drawer_t draw; + char hasname = 0; + name[0]=0; + if(FT_HAS_GLYPH_NAMES(face)) { + error = FT_Get_Glyph_Name(face, t, name, 127); + if(!error && name[0] && !strstr(name, "notdef")) { + font->glyphnames[font->numchars] = strdup(name); + hasname = 1; + } + } + if(!font->glyph2ascii[t] && !hasname && skip_unused) { + continue; + } + error = FT_Load_Glyph(face, t, FT_LOAD_NO_BITMAP); + if(error) { + //tends to happen with some pdfs + fprintf(stderr, "Warning: Glyph %d has return code %d\n", t, error); + glyph=0; + if(skip_unused) + continue; + } else { + error = FT_Get_Glyph(face->glyph, &glyph); + if(error) { + fprintf(stderr, "Couldn't get glyph %d, error:%d\n", t, error); + glyph=0; + if(skip_unused) + continue; + } + } + + if(glyph) + FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); + else + memset(&bbox, 0, sizeof(bbox)); + + bbox.yMin = -bbox.yMin; + bbox.yMax = -bbox.yMax; + if(bbox.xMax < bbox.xMin) { + // swap + bbox.xMax ^= bbox.xMin; + bbox.xMin ^= bbox.xMax; + bbox.xMax ^= bbox.xMin; + } + if(bbox.yMax < bbox.yMin) { + // swap + bbox.yMax ^= bbox.yMin; + bbox.yMin ^= bbox.yMax; + bbox.yMax ^= bbox.yMin; + } + + swf_Shape01DrawerInit(&draw, 0); + + //error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); + if(glyph) + error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); + else + error = 0; + draw.finish(&draw); + + if(error) { + fprintf(stderr, "Couldn't decompose glyph %d\n", t); + draw.dealloc(&draw); + continue; + } + +#if 0 + if(bbox.xMin > 0) { + font->glyph[font->numchars].advance = (bbox.xMax*20*FT_SCALE)/FT_SUBPIXELS; + } else { + font->glyph[font->numchars].advance = ((bbox.xMax - bbox.xMin)*20*FT_SCALE)/FT_SUBPIXELS; + } +#else + if(glyph) + font->glyph[font->numchars].advance = glyph->advance.x*20/65536; + else + font->glyph[font->numchars].advance = 0; +#endif + + SRECT b = swf_ShapeDrawerGetBBox(&draw); + + //font->layout->bounds[font->numchars].xmin = (bbox.xMin*FT_SCALE*20)/FT_SUBPIXELS; + //font->layout->bounds[font->numchars].ymin = (bbox.yMin*FT_SCALE*20)/FT_SUBPIXELS; + //font->layout->bounds[font->numchars].xmax = (bbox.xMax*FT_SCALE*20)/FT_SUBPIXELS; + //font->layout->bounds[font->numchars].ymax = (bbox.yMax*FT_SCALE*20)/FT_SUBPIXELS; + + font->layout->bounds[font->numchars] = b; + font->glyph[font->numchars].shape = swf_ShapeDrawerToShape(&draw); + + swf_ExpandRect2(&fontbbox, &font->layout->bounds[font->numchars]); + + draw.dealloc(&draw); + + if(glyph) + FT_Done_Glyph(glyph); + font->glyph2ascii[font->numchars] = font->glyph2ascii[t]; + glyph2glyph[t] = font->numchars; + font->numchars++; + } + + //font->layout->ascent = abs(face->ascender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMin; + //font->layout->descent = abs(face->descender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMax; + //font->layout->leading = font->layout->ascent + font->layout->descent; + + if(-fontbbox.ymin < 0) + font->layout->ascent = 0; + else + font->layout->ascent = -fontbbox.ymin; + + if(fontbbox.ymax < 0) + font->layout->descent = 0; + else + font->layout->descent = fontbbox.ymax; + + int leading = fontbbox.ymax - fontbbox.ymin; + font->layout->leading = leading>0x7fff?0x7fff:leading; + + /* notice: if skip_unused is true, font->glyph2ascii, font->glyphnames and font->layout->bounds will + have more memory allocated than just font->numchars, but only the first font->numchars + are used/valid */ + + for(t=0;tmaxascii;t++) { + if(font->ascii2glyph[t]>=0) { + font->ascii2glyph[t] = glyph2glyph[font->ascii2glyph[t]]; + } + } + rfx_free(glyph2glyph); + + FT_Done_Face(face); + FT_Done_FreeType(ftlibrary);ftlibrary=0; + + return font; +} +#else //HAVE_FREETYPE + +SWFFONT* swf_LoadTrueTypeFont(const char*filename, char flashtype) +{ + fprintf(stderr, "Warning: no freetype library- not able to load %s\n", filename); + return 0; +} + +#endif + +#ifdef HAVE_T1LIB + +#include + +static int t1lib_initialized = 0; + +static int counter = 0; + +SWFFONT* swf_LoadT1Font(const char*filename) +{ + SWFFONT * font; + int nr; + float angle,underline; + char*fontname,*fullname,*familyname; + BBox bbox; + int s,num; + char**charnames; + char**charname; + char*encoding[256]; + int c; + int t; + + if(!t1lib_initialized) { + T1_SetBitmapPad(16); + if ((T1_InitLib(NO_LOGFILE)==NULL)){ + fprintf(stderr, "Initialization of t1lib failed\n"); + return 0; + } + t1lib_initialized = 1; + } + nr = T1_AddFont(filename); + T1_LoadFont(nr); + + charnames = T1_GetAllCharNames(nr); + if(!charnames) { + fprintf(stderr, "No Charnames record- not a Type1 Font?\n"); + return 0; + } + + angle = T1_GetItalicAngle(nr); + fontname = T1_GetFontName(nr); + fullname = T1_GetFullName(nr); + familyname = T1_GetFamilyName(nr); + underline = T1_GetUnderlinePosition(nr); + bbox = T1_GetFontBBox(nr); + + font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); + + font->version = 2; + if(fontname) + font->name = (U8*)strdup(fontname); + else + font->name = 0; + font->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); + + num = 0; + charname = charnames; + while(*charname) { + charname++; + if(num<256) { + if(*charname) encoding[num] = strdup(*charname); + else encoding[num] = strdup(".notdef"); + } + num++; + } + for(t=num;t<256;t++) + encoding[t] = strdup(".notdef"); + + //T1_ReencodeFont(nr, encoding); + + font->maxascii = num; + font->numchars = num; + + font->style = (/*bold*/0?FONT_STYLE_BOLD:0) + (angle>0.05?FONT_STYLE_ITALIC:0); + + font->glyph = (SWFGLYPH*)rfx_calloc(num*sizeof(SWFGLYPH)); + font->glyph2ascii = (U16*)rfx_calloc(num*sizeof(U16)); + font->ascii2glyph = (int*)rfx_calloc(font->maxascii*sizeof(int)); + font->layout->ascent = (U16)(underline - bbox.lly); + font->layout->descent = (U16)(bbox.ury - underline); + font->layout->leading = (U16)(font->layout->ascent - + font->layout->descent - + (bbox.lly - bbox.ury)); + font->layout->bounds = (SRECT*)rfx_calloc(sizeof(SRECT)*num); + font->layout->kerningcount = 0; + font->layout->kerning = 0; + font->glyphnames = rfx_calloc(num*sizeof(char*)); + + num = 0; + + charname = charnames; + for(c=0;cnumchars;c++) { + drawer_t draw; + SRECT bbox; + T1_OUTLINE * outline; + FPOINT pos,last; + int firstx; + + outline = T1_GetCharOutline(nr, c, 100.0, 0); + firstx = outline->dest.x/0xffff; + + pos.x = 0; + pos.y = 0; + last = pos; + + font->glyphnames[c] = strdup(*charname); + + if(cmaxascii) + font->ascii2glyph[c] = c; + font->glyph2ascii[c] = c; + + swf_Shape01DrawerInit(&draw, 0); + + while(outline) { + pos.x += (outline->dest.x/(float)0xffff); + pos.y += (outline->dest.y/(float)0xffff); + + if(outline->type == T1_PATHTYPE_MOVE) { + draw.moveTo(&draw,&pos); + } else if(outline->type == T1_PATHTYPE_LINE) { + draw.lineTo(&draw,&pos); + } else if(outline->type == T1_PATHTYPE_BEZIER) { + T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline; + FPOINT b,c; + b.x = o2->B.x/(float)0xffff+last.x; + b.y = o2->B.y/(float)0xffff+last.y; + c.x = o2->C.x/(float)0xffff+last.x; + c.y = o2->C.y/(float)0xffff+last.y; + draw_cubicTo(&draw,&b,&c,&pos); + } else { + fprintf(stderr, "loadT1Font: unknown outline type:%d\n", outline->type); + } + last = pos; + outline = outline->link; + } + + draw.finish(&draw); + + font->glyph[c].shape = swf_ShapeDrawerToShape(&draw); + bbox = swf_ShapeDrawerGetBBox(&draw); + draw.dealloc(&draw); + + font->layout->bounds[c] = bbox; + font->glyph[c].advance = bbox.xmax; + if(!font->glyph[c].advance) { + font->glyph[c].advance = firstx; + } + charname++; + } + T1_DeleteFont(nr); + + for(t=0;t<256;t++) + rfx_free(encoding[t]); + return font; +} + +#else + +SWFFONT* swf_LoadT1Font(const char*filename) +{ + fprintf(stderr, "Warning: no t1lib- not able to load %s\n", filename); + return 0; +} + +#endif + +SWFFONT* swf_DummyFont() +{ + SWFFONT*font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); + return font; +} + +static int isSWF(const char*filename) +{ + FILE*fi = fopen(filename, "rb"); + char a[8]; + if(!fi) { + perror(filename); + return -1; + } + memset(a, 0, sizeof(a)); + fread(a, 4, 1, fi); + fclose(fi); + + if(!strncmp(a, "FWS", 3) || !strncmp(a, "CWS", 3)) { + return 1; + } + return 0; +} + +SWFFONT* swf_LoadFont(const char*filename, char flashtype) +{ + int is_swf; + if(filename == 0) + return swf_DummyFont(); + is_swf = isSWF(filename); + if(is_swf<0) + return 0; + if(is_swf) { + SWFFONT*font = swf_ReadFont(filename); + if(flashtype && font->version==2) + fprintf(stderr, "Warning: Can't load font v2 file as flashtype (%s)\n", filename); + return font; + } + +#if defined(HAVE_FREETYPE) + return swf_LoadTrueTypeFont(filename, flashtype); +#elif defined(HAVE_T1LIB) + return swf_LoadT1Font(filename); +#else + fprintf(stderr, "Error: Neither T1lib nor FreeType support compiled in. Could not load %s\n", filename); + return 0; +#endif +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c new file mode 100644 index 000000000..ab621e62e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c @@ -0,0 +1,221 @@ +/* swfobject.c + + Object place and move routines + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include "../rfxswf.h" + + +char*blendModeNames[] = {"normal","normal2","layer","multiply", + "screen","lighten", "darken","add", + "substract","difference","invert","alpha", + "erase","overlay","hardlight",0}; + +int isUnitMatrix(MATRIX* m) +{ + /* a matrix with all zeros is also considered + "unit matrix", as a zeroed out MATRIX structure + usually means that the caller doesn't want to + set the matrix */ + if(( (m->sx == 0x10000 && m->sy == 0x10000) + || (m->sx == 0 && m->sy == 0)) + && ((m->r0|m->r1|m->tx|m->ty) == 0) + ) + return 1; + return 0; +} + +int isUnitCXForm(CXFORM* cx) +{ + if((cx->a0==256 && cx->r0==256 && cx->g0==256 && cx->b0==256) && + (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0)) + return 1; + /* A CXForm of all zeros is, unfortunately, not as unlikely + as a matrix of all zeros. However, we still treat it + as non-existent/uniform transform */ + if((cx->a0==0 && cx->r0==0 && cx->g0==0 && cx->b0==0) && + (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0)) + return 1; + return 0; +} + +static int objectplace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name, U16 clipaction, U8 blendmode, FILTERLIST*filters) +{ U8 flags,flags2; + if (!t) return -1; + + if(cx && id && cx->r1==0 && cx->g1==0 && cx->b1==0 && cx->a1==0 + && cx->r0==256 && cx->g0==256 && cx->b0==256 && cx->a0==256) + cx = 0; + + if(m && id && isUnitMatrix(m)) + m = 0; + + flags = (id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(name?PF_NAME:0)|((m||cx)&&(!id)?PF_MOVE:0)|(clipaction?PF_CLIPDEPTH:0); + flags2 = (0?PF2_ASBITMAP:0)|(blendmode?PF2_BLENDMODE:0)|(filters?PF2_FILTERS:0); + + swf_SetU8(t,flags); + if(t->id == ST_PLACEOBJECT3) + swf_SetU8(t, flags2); + swf_SetU16(t,depth); + if (flags&PF_CHAR) swf_SetU16(t,id); + if (flags&PF_MATRIX) swf_SetMatrix(t,m); + if (flags&PF_CXFORM) swf_SetCXForm(t,cx,1); + if (flags&PF_RATIO) swf_SetU16(t,0); + /* ??? The spec states that name comes first? */ + if (flags&PF_CLIPDEPTH) swf_SetU16(t, clipaction); + if (flags&PF_NAME) swf_SetString(t,name); + + if (flags2&PF2_BLENDMODE) + swf_SetU8(t,blendmode); + return 0; +} +int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name) +{ + return objectplace(t,id,depth,m,cx,name,0,0,0); +} +int swf_ObjectPlaceClip(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name, U16 clipaction) +{ + return objectplace(t,id,depth,m,cx,name,clipaction,0,0); +} +int swf_ObjectPlaceBlend(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name, U8 blend) +{ + if(t->id != ST_PLACEOBJECT3) + fprintf(stderr, "wrong tag- ignoring blend mode\n"); + return objectplace(t,id,depth,m,cx,name,0,blend,0); +} +int swf_ObjectMove(TAG * t,U16 depth,MATRIX * m,CXFORM * cx) +{ + return objectplace(t,0,depth,m,cx,0,0,0,0); +} + +void swf_SetPlaceObject(TAG * t,SWFPLACEOBJECT* obj) +{ + if (!t) return ; + if(t->id == ST_PLACEOBJECT) { + swf_SetU16(t, obj->id); + swf_SetU16(t, obj->depth); + swf_SetMatrix(t, &obj->matrix); + swf_SetCXForm(t, &obj->cxform, 0); + } else { + U8 flags,flags2; + int m = !isUnitMatrix(&obj->matrix); + int cx = !isUnitCXForm(&obj->cxform); + + flags = (obj->id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(obj->ratio?PF_RATIO:0)| + (obj->name?PF_NAME:0)|(obj->move?PF_MOVE:0)| + (obj->clipdepth?PF_CLIPDEPTH:0); + flags2 = (0?PF2_ASBITMAP:0)|(obj->blendmode?PF2_BLENDMODE:0)|(obj->filters?PF2_FILTERS:0); + + swf_SetU8(t,flags); + if(t->id == ST_PLACEOBJECT3) + swf_SetU8(t,flags2); + swf_SetU16(t,obj->depth); + if (flags&PF_CHAR) swf_SetU16(t,obj->id); + if (flags&PF_MATRIX) swf_SetMatrix(t,&obj->matrix); + if (flags&PF_CXFORM) swf_SetCXForm(t,&obj->cxform,1); + if (flags&PF_RATIO) swf_SetU16(t,obj->ratio); + + /* ??? The spec states that name comes first? */ + if (flags&PF_CLIPDEPTH) swf_SetU16(t,obj->clipdepth); + if (flags&PF_NAME) swf_SetString(t,obj->name); + + if (flags2&PF2_FILTERS) { + swf_SetU8(t,obj->filters->num); + int s; + for(s=0;sfilters->num;s++) + swf_SetFilter(t,obj->filters->filter[s]); + } + if (flags2&PF2_BLENDMODE) + swf_SetU8(t,obj->blendmode); + if (flags&PF_ACTIONEVENT) { + // ... + } + } +} + +void swf_GetPlaceObject(TAG * tag,SWFPLACEOBJECT* obj) +{ + if(obj) + memset(obj, 0, sizeof(SWFPLACEOBJECT)); + + if(!tag) { + swf_GetMatrix(0, &obj->matrix); + swf_GetCXForm(0, &obj->cxform, 1); + //obj->internal = PF_CHAR|PF_MATRIX|PF_CXFORM; + return; + } + swf_SetTagPos(tag, 0); + + if(tag->id == ST_PLACEOBJECT) { + obj->id = swf_GetU16(tag); + obj->depth = swf_GetU16(tag); + swf_GetMatrix(tag, &obj->matrix); + swf_GetCXForm(tag, &obj->cxform, 0); + //obj->internal = PF_CHAR|PF_MATRIX|PF_CXFORM; + } else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { + U8 flags,flags2=0; + flags = swf_GetU8(tag); + if(tag->id == ST_PLACEOBJECT3) + flags2 = swf_GetU8(tag); + memset(obj,0,sizeof(SWFPLACEOBJECT)); + + swf_GetMatrix(0,&obj->matrix); + swf_GetCXForm(0,&obj->cxform,1); + + obj->flags = flags; + obj->depth = swf_GetU16(tag); + //obj->internal = flags; + if(flags&PF_MOVE) obj->move = 1; + if(flags&PF_CHAR) obj->id = swf_GetU16(tag); + if(flags&PF_MATRIX) swf_GetMatrix(tag, &obj->matrix); + if(flags&PF_CXFORM) swf_GetCXForm(tag, &obj->cxform,1); + if(flags&PF_RATIO) obj->ratio = swf_GetU16(tag); + /* if you modify the order of these operations, also + modify it in ../src/swfcombine.c */ + if(flags&PF_CLIPDEPTH) + obj->clipdepth = swf_GetU16(tag); //clip + if(flags&PF_NAME) { + int l,t; + U8*data; + swf_ResetReadBits(tag); + l = strlen((const char *)&tag->data[tag->pos]); + t = 0; + data = (U8*)rfx_alloc(l+1); + obj->name = (char*)data; + while((data[t++] = swf_GetU8(tag))); + } + if(flags2&PF2_BLENDMODE) { + obj->blendmode = swf_GetU8(tag); + } + + /* Actionscript ignored (for now) */ + obj->actions = 0; + } else { + fprintf(stderr, "rfxswf: Bad Tag: %d not a placeobject\n", tag->id); + } +} + +void swf_PlaceObjectFree(SWFPLACEOBJECT* obj) +{ + if(obj->name) + rfx_free(obj->name); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c new file mode 100644 index 000000000..6c5262a7c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c @@ -0,0 +1,1352 @@ +/* swfrender.c + + functions for rendering swf content + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2004 Mederra Oy + Copyright (c) 2004 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../rfxswf.h" + +/* one bit flag: */ +#define clip_type 0 +#define fill_type 1 + +typedef struct _renderpoint +{ + float x; + U32 depth; + + SHAPELINE*shapeline; + SHAPE2*s; + +} renderpoint_t; + +/* + enum {clip_type, solidfill_type, texturefill_type, gradientfill_type} type; + float fx; + int x; + U32 depth; + U32 clipdepth; + + // solidfill; + RGBA color; + + // texturefill + bitmap_t* bitmap; + + // gradientfill + gradient_t* gradient; + + // texture- & gradientfill; + U32 x,y; + U32 dx,dy; + +*/ + +typedef struct _renderline +{ + TAG*points; //incremented in 128 byte steps + int num; + U32 pending_clipdepth; +} renderline_t; + +typedef struct _bitmap { + int width; + int height; + RGBA*data; + int id; + struct _bitmap*next; +} bitmap_t; + +typedef struct _renderbuf_internal +{ + renderline_t*lines; + bitmap_t*bitmaps; + int antialize; + int multiply; + int width2,height2; + int shapes; + int ymin, ymax; + + RGBA* img; + int* zbuf; +} renderbuf_internal; + +#define DEBUG 0 + +static inline void add_pixel(RENDERBUF*dest, float x, int y, renderpoint_t*p) +{ + renderbuf_internal*i = (renderbuf_internal*)dest->internal; + if(x >= i->width2 || y >= i->height2 || y<0) return; + p->x = x; + if(yymin) i->ymin = y; + if(y>i->ymax) i->ymax = y; + + i->lines[y].num++; + swf_SetBlock(i->lines[y].points, (U8*)p, sizeof(renderpoint_t)); +} + +/* set this to 0.777777 or something if the "both fillstyles set while not inside shape" + problem appears to often */ +#define CUT 0.77887789 + +#define INT(x) ((int)((x)+16)-16) + +static void add_line(RENDERBUF*buf, double x1, double y1, double x2, double y2, renderpoint_t*p) +{ + renderbuf_internal*i = (renderbuf_internal*)buf->internal; + double diffx, diffy; + double ny1, ny2, stepx; +/* if(DEBUG&4) { + int l = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); + printf(" l[%d - %.2f/%.2f -> %.2f/%.2f]\n", l, x1/20.0, y1/20.0, x2/20.0, y2/20.0); + }*/ + assert(p->shapeline); + + y1=y1*i->multiply; + y2=y2*i->multiply; + x1=x1*i->multiply; + x2=x2*i->multiply; + + y1 = y1/20.0; + y2 = y2/20.0; + x1 = x1/20.0; + x2 = x2/20.0; + + if(y2 < y1) { + double x; + double y; + x = x1;x1 = x2;x2=x; + y = y1;y1 = y2;y2=y; + } + + diffx = x2 - x1; + diffy = y2 - y1; + + ny1 = INT(y1)+CUT; + ny2 = INT(y2)+CUT; + + if(ny1 < y1) { + ny1 = INT(y1) + 1.0 + CUT; + } + if(ny2 >= y2) { + ny2 = INT(y2) - 1.0 + CUT; + } + + if(ny1 > ny2) + return; + + stepx = diffx/diffy; + x1 = x1 + (ny1-y1)*stepx; + x2 = x2 + (ny2-y2)*stepx; + + { + int posy=INT(ny1); + int endy=INT(ny2); + double posx=0; + double startx = x1; + + while(posy<=endy) { + float xx = (float)(startx + posx); + add_pixel(buf, xx ,posy, p); + posx+=stepx; + posy++; + } + } +} +#define PI 3.14159265358979 +static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double y2, double width, renderpoint_t*p) +{ + renderbuf_internal*i = (renderbuf_internal*)buf->internal; + + double dx = x2-x1; + double dy = y2-y1; + double sd; + double d; + + int t; + int segments; + double lastx,lasty; + double vx,vy; + double xx,yy; + + /* Make sure the line is always at least one pixel wide */ +#ifdef LINEMODE1 + /* That's what Macromedia's Player does at least at zoom level >= 1. */ + width += 20; +#else + /* That's what Macromedia's Player seems to do at zoom level 0. */ + /* TODO: needs testing */ + + /* TODO: how does this interact with scaling? */ + if(width * i->multiply < 20) + width = 20 / i->multiply; +#endif + + sd = (double)dx*(double)dx+(double)dy*(double)dy; + d = sqrt(sd); + + if(!dx && !dy) { + vx = 1; + vy = 0; + } else { + vx = ( dy/d); + vy = (-dx/d); + } + + segments = (int)(width/2); + if(segments < 2) + segments = 2; + + segments = 8; + + vx=vx*width*0.5; + vy=vy*width*0.5; + + xx = x2+vx; + yy = y2+vy; + add_line(buf, x1+vx, y1+vy, xx, yy, p); + lastx = xx; + lasty = yy; + for(t=1;tx < b->x) return -1; + if(a->x > b->x) return 1; + return 0; +} + +void swf_Render_Init(RENDERBUF*buf, int posx, int posy, int width, int height, int antialize, int multiply) +{ + renderbuf_internal*i; + int y; + memset(buf, 0, sizeof(RENDERBUF)); + buf->width = width*multiply; + buf->height = height*multiply; + buf->posx = posx; + buf->posy = posy; + buf->internal = (renderbuf_internal*)rfx_calloc(sizeof(renderbuf_internal)); + i = (renderbuf_internal*)buf->internal; + if(antialize < 1) + antialize = 1; + i->antialize = antialize; + i->multiply = multiply*antialize; + i->height2 = antialize*buf->height; + i->width2 = antialize*buf->width; + i->lines = (renderline_t*)rfx_alloc(i->height2*sizeof(renderline_t)); + for(y=0;yheight2;y++) { + memset(&i->lines[y], 0, sizeof(renderline_t)); + i->lines[y].points = swf_InsertTag(0, 0); + i->lines[y].num = 0; + } + i->zbuf = (int*)rfx_calloc(sizeof(int)*i->width2*i->height2); + i->img = (RGBA*)rfx_calloc(sizeof(RGBA)*i->width2*i->height2); + i->shapes = 0; + i->ymin = 0x7fffffff; + i->ymax = -0x80000000; +} +void swf_Render_SetBackground(RENDERBUF*buf, RGBA*img, int width, int height) +{ + renderbuf_internal*i = (renderbuf_internal*)buf->internal; + int x,xx,y,yy; + int xstep=width*65536/i->width2; + int ystep=height*65536/i->height2; + if(i->shapes) { + fprintf(stderr, "rfxswf: Warning: swf_Render_SetBackground() called after drawing shapes\n"); + } + for(y=0,yy=0;yheight2;y++,yy+=ystep) { + RGBA*src = &img[(yy>>16) * width]; + RGBA*line = &i->img[y * i->width2]; + for(x=0,xx=0;xwidth2;x++,xx+=xstep) { + line[x] = src[xx>>16]; + } + } +} +void swf_Render_SetBackgroundColor(RENDERBUF*buf, RGBA color) +{ + swf_Render_SetBackground(buf, &color, 1, 1); +} +void swf_Render_AddImage(RENDERBUF*buf, U16 id, RGBA*img, int width, int height) +{ + renderbuf_internal*i = (renderbuf_internal*)buf->internal; + + bitmap_t*bm = (bitmap_t*)rfx_calloc(sizeof(bitmap_t)); + bm->id = id; + bm->width = width; + bm->height = height; + bm->data = (RGBA*)rfx_alloc(width*height*4); + memcpy(bm->data, img, width*height*4); + + bm->next = i->bitmaps; + i->bitmaps = bm; +} +void swf_Render_ClearCanvas(RENDERBUF*dest) +{ + renderbuf_internal*i = (renderbuf_internal*)dest->internal; + int y; + for(y=0;yheight2;y++) { + swf_ClearTag(i->lines[y].points); + } + memset(i->zbuf, 0, sizeof(int)*i->width2*i->height2); + memset(i->img, 0, sizeof(RGBA)*i->width2*i->height2); +} +void swf_Render_Delete(RENDERBUF*dest) +{ + renderbuf_internal*i = (renderbuf_internal*)dest->internal; + int y; + bitmap_t*b = i->bitmaps; + + /* delete canvas */ + rfx_free(i->zbuf); + rfx_free(i->img); + + /* delete line buffers */ + for(y=0;yheight2;y++) { + swf_DeleteTag(0, i->lines[y].points); + i->lines[y].points = 0; + } + + /* delete bitmaps */ + while(b) { + bitmap_t*next = b->next; + free(b->data);b->data=0; + rfx_free(b); + b = next; + } + + rfx_free(i->lines); i->lines = 0; + rfx_free(dest->internal); dest->internal = 0; +} + +static SHAPE2* linestyle2fillstyle(SHAPE2*shape) +{ + SHAPE2*s = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); + int t; + s->numfillstyles = shape->numlinestyles; + s->fillstyles = (FILLSTYLE*)rfx_calloc(sizeof(FILLSTYLE)*shape->numlinestyles); + s->lines = (SHAPELINE*)rfx_calloc(sizeof(SHAPELINE)*shape->numlinestyles); + for(t=0;tnumlinestyles;t++) { + s->lines[t].fillstyle0 = t+1; + s->fillstyles[t].type = FILL_SOLID; + s->fillstyles[t].color = shape->linestyles[t].color; + } + return s; +} + +void swf_Process(RENDERBUF*dest, U32 clipdepth); + +double matrixsize(MATRIX*m) +{ + double l1 = sqrt((m->sx /65536.0) * (m->sx /65536.0) + (m->r0 /65536.0) * (m->r0/65536.0) ); + double l2 = sqrt((m->r1 /65536.0) * (m->r1 /65536.0) + (m->sy /65536.0) * (m->sy/65536.0) ); + return sqrt(l1*l2); +} + +void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 _depth,U16 _clipdepth) +{ + renderbuf_internal*i = (renderbuf_internal*)dest->internal; + + SHAPELINE*line; + int x=0,y=0; + MATRIX mat = *m; + SHAPE2* s2 = 0; + SHAPE2* lshape = 0; + renderpoint_t p, lp; + U32 clipdepth; + double widthmultiply = matrixsize(m); + + memset(&p, 0, sizeof(renderpoint_t)); + memset(&lp, 0, sizeof(renderpoint_t)); + + clipdepth = _clipdepth? _clipdepth << 16 | 0xffff : 0; + p.depth = _depth << 16; + + mat.tx -= dest->posx*20; + mat.ty -= dest->posy*20; + + s2 = swf_Shape2Clone(shape); + line = s2->lines; + if(shape->numfillstyles) { + int t; + p.s = s2; + /* multiply fillstyles matrices with placement matrix- + important for texture and gradient fill */ + for(t=0;tnumfillstyles;t++) { + MATRIX nm; + swf_MatrixJoin(&nm, &mat, &s2->fillstyles[t].m); + /*nm.sx *= i->multiply; + nm.sy *= i->multiply; + nm.r0 *= i->multiply; + nm.r1 *= i->multiply; + nm.tx *= i->multiply; + nm.ty *= i->multiply;*/ + s2->fillstyles[t].m = nm; + } + } + + if(shape->numlinestyles) { + lshape = linestyle2fillstyle(shape); + lp.s = lshape; + lp.depth = (_depth << 16)+1; + } + + + while(line) + { + int x1,y1,x2,y2,x3,y3; + + if(line->type == moveTo) { + } else if(line->type == lineTo) { + transform_point(&mat, x, y, &x1, &y1); + transform_point(&mat, line->x, line->y, &x3, &y3); + + if(line->linestyle && ! clipdepth) { + lp.shapeline = &lshape->lines[line->linestyle-1]; + add_solidline(dest, x1, y1, x3, y3, shape->linestyles[line->linestyle-1].width * widthmultiply, &lp); + lp.depth++; + } + if(line->fillstyle0 || line->fillstyle1) { + assert(shape->numfillstyles); + p.shapeline = line; + add_line(dest, x1, y1, x3, y3, &p); + } + } else if(line->type == splineTo) { + int c,t,parts,qparts; + double xx,yy; + + transform_point(&mat, x, y, &x1, &y1); + transform_point(&mat, line->sx, line->sy, &x2, &y2); + transform_point(&mat, line->x, line->y, &x3, &y3); + + c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1); + xx=x1; + yy=y1; + + parts = (int)(sqrt((float)c)/3); + if(!parts) parts = 1; + + for(t=1;t<=parts;t++) { + double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); + double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); + + if(line->linestyle && ! clipdepth) { + lp.shapeline = &lshape->lines[line->linestyle-1]; + add_solidline(dest, xx, yy, nx, ny, shape->linestyles[line->linestyle-1].width * widthmultiply, &lp); + lp.depth++; + } + if(line->fillstyle0 || line->fillstyle1) { + assert(shape->numfillstyles); + p.shapeline = line; + add_line(dest, xx, yy, nx, ny, &p); + } + + xx = nx; + yy = ny; + } + } + x = line->x; + y = line->y; + line = line->next; + } + + swf_Process(dest, clipdepth); + + if(s2) { + swf_Shape2Free(s2);rfx_free(s2);s2=0; + } + if(lshape) { + swf_Shape2Free(lshape);rfx_free(lshape);lshape=0; + } + +} + +static RGBA color_red = {255,255,0,0}; +static RGBA color_white = {255,255,255,255}; +static RGBA color_black = {255,0,0,0}; + +static void fill_clip(RGBA*line, int*z, int y, int x1, int x2, U32 depth) +{ + int x = x1; + if(x1>=x2) + return; + do { + if(depth > z[x]) { + z[x] = depth; + } + } while(++x>8; + col.g = (col.g*col.a)>>8; + col.b = (col.b*col.a)>>8; + col.a = 255; + do { + if(depth >= z[x]) { + line[x].r = ((line[x].r*ainv)>>8)+col.r; + line[x].g = ((line[x].g*ainv)>>8)+col.g; + line[x].b = ((line[x].b*ainv)>>8)+col.b; + line[x].a = 255; + z[x] = depth; + } + } while(++x= z[x]) { + line[x] = col; + z[x] = depth; + } + } while(++x255) return 255; + else return v; +} + +static void fill_bitmap(RGBA*line, int*z, int y, int x1, int x2, MATRIX*m, bitmap_t*b, int clipbitmap, U32 depth, double fmultiply) +{ + int x = x1; + + double m11= m->sx*fmultiply/65536.0, m21= m->r1*fmultiply/65536.0; + double m12= m->r0*fmultiply/65536.0, m22= m->sy*fmultiply/65536.0; + double rx = m->tx*fmultiply/20.0; + double ry = m->ty*fmultiply/20.0; + + double det = m11*m22 - m12*m21; + if(fabs(det) < 0.0005) { + /* x direction equals y direction- the image is invisible */ + return; + } + det = 20.0/det; + + if(!b->width || !b->height) { + fill_solid(line, z, y, x1, x2, color_red, depth); + return; + } + + do { + if(depth >= z[x]) { + RGBA col; + int xx = (int)(( (x - rx) * m22 - (y - ry) * m21)*det); + int yy = (int)((- (x - rx) * m12 + (y - ry) * m11)*det); + int ainv; + + if(clipbitmap) { + if(xx<0) xx=0; + if(xx>=b->width) xx = b->width-1; + if(yy<0) yy=0; + if(yy>=b->height) yy = b->height-1; + } else { + xx %= b->width; + yy %= b->height; + if(xx<0) xx += b->width; + if(yy<0) yy += b->height; + } + + col = b->data[yy*b->width+xx]; + ainv = 255-col.a; + + line[x].r = clamp(((line[x].r*ainv)>>8)+col.r); + line[x].g = clamp(((line[x].g*ainv)>>8)+col.g); + line[x].b = clamp(((line[x].b*ainv)>>8)+col.b); + line[x].a = 255; + + z[x] = depth; + } + } while(++xsx*fmultiply/80, m21= m->r1*fmultiply/80; + double m12= m->r0*fmultiply/80, m22= m->sy*fmultiply/80; + double rx = m->tx*fmultiply/20.0; + double ry = m->ty*fmultiply/20.0; + + double det = m11*m22 - m12*m21; + if(fabs(det) < 0.0005) { + /* x direction equals y direction- the image is invisible */ + return; + } + det = 1.0/det; + + RGBA palette[512]; + RGBA oldcol = g->rgba[0]; + int r0 = g->ratios[0]*2; + int t; + for(t=0;tnum;t++) { + int r1 = g->ratios[t]*2; + RGBA newcol = g->rgba[t]; + if(r0 == r1) + continue; + //printf("%d %d->%d %02x%02x%02x%02x->%02x%02x%02x%02x\n", + // t, r0, r1, oldcol.r,oldcol.g,oldcol.b,oldcol.a, + // newcol.r,newcol.g,newcol.b,newcol.a); + double f = 1.0 / (r1-r0); + double p0 = 1; + double p1 = 0; + int s; + for(;r0<=r1;r0++) { + palette[r0].r = oldcol.r*p0 + newcol.r*p1; + palette[r0].g = oldcol.g*p0 + newcol.g*p1; + palette[r0].b = oldcol.b*p0 + newcol.b*p1; + palette[r0].a = oldcol.a*p0 + newcol.a*p1; + p0 -= f; + p1 += f; + } + oldcol = newcol; + } + for(t=r0;t<512;t++) + palette[t] = oldcol; + + do { + if(depth >= z[x]) { + RGBA col; + double xx = ( (x - rx) * m22 - (y - ry) * m21)*det; + double yy = (- (x - rx) * m12 + (y - ry) * m11)*det; + + if(type == FILL_LINEAR) { + int xr = xx*256; + if(xr<-256) + xr = -256; + if(xr>255) + xr = 255; + col = palette[xr+256]; + } else { + int xr = sqrt(xx*xx+yy*yy)*511; + if(xr<0) + xr = 0; + if(xr>511) + xr = 511; + col = palette[xr]; + } + int ainv; + ainv = 255-col.a; + line[x].r = clamp(((line[x].r*ainv)>>8)+col.r); + line[x].g = clamp(((line[x].g*ainv)>>8)+col.g); + line[x].b = clamp(((line[x].b*ainv)>>8)+col.b); + line[x].a = 255; + + z[x] = depth; + } + } while(++xinternal; + int clip=1; + + layer_t*l = fillstate->layers; + + if(x1>=x2) //zero width? nothing to do. + return; + + while(l) { + if(l->fillid == 0) { + /* not filled. TODO: we should never add those in the first place */ + if(DEBUG&2) + printf("(not filled)"); + } else if(l->fillid > l->p->s->numfillstyles) { + fprintf(stderr, "Fill style out of bounds (%d>%d)", l->fillid, l->p->s->numlinestyles); + } else if(clipdepth) { + /* filled region- not used for clipping */ + clip = 0; + } else { + FILLSTYLE*f; + if(DEBUG&2) + printf("(%d -> %d style %d)", x1, x2, l->fillid); + + f = &l->p->s->fillstyles[l->fillid-1]; + + if(f->type == FILL_SOLID) { + /* plain color fill */ + fill_solid(line, zline, y, x1, x2, f->color, l->p->depth); + } else if(f->type == FILL_TILED || f->type == FILL_CLIPPED || f->type == (FILL_TILED|2) || f->type == (FILL_CLIPPED|2)) { + /* TODO: optimize (do this in add_pixel()?) */ + bitmap_t* b = i->bitmaps; + while(b && b->id != f->id_bitmap) { + b = b->next; + } + if(!b) { + fprintf(stderr, "Shape references unknown bitmap %d\n", f->id_bitmap); + fill_solid(line, zline, y, x1, x2, color_red, l->p->depth); + } else { + fill_bitmap(line, zline, y, x1, x2, &f->m, b, /*clipped?*/f->type&1, l->p->depth, i->multiply); + } + } else if(f->type == FILL_LINEAR || f->type == FILL_RADIAL) { + fill_gradient(line, zline, y, x1, x2, &f->m, &f->gradient, f->type, l->p->depth, i->multiply); + } else { + fprintf(stderr, "Undefined fillmode: %02x\n", f->type); + } + } + l = l->next; + } + if(clip && clipdepth) { + fill_clip(line, zline, y, x1, x2, clipdepth); + } +} + +static void search_layer(state_t*state, int depth, layer_t**before, layer_t**self, layer_t**after) +{ + layer_t*last=0,*l = state->layers; + while(l && l->p->depth < depth) { + last = l; + l = l->next; + } + *before = last; + if(l && l->p->depth == depth) + *self = l; + else + *after = l; +} +static void delete_layer(state_t*state, layer_t*todel) +{ + layer_t*before=todel->prev; + layer_t*next = todel->next; + rfx_free(todel); + if(!before) { + state->layers = next; + if(next) + next->prev = 0; + } else { + before->next = next; + if(before->next) + before->next->prev = before; + } +} +static void add_layer(state_t*state, layer_t*before, layer_t*toadd) +{ + if(!before) { + toadd->next = state->layers; + toadd->prev = 0; + state->layers=toadd; + } else { + toadd->next = before->next; + toadd->prev = before; + before->next = toadd; + } + if(toadd->next) + toadd->next->prev = toadd; +} +static void free_layers(state_t* state) +{ + layer_t*l = state->layers; + while(l) { + layer_t*next = l->next; + rfx_free(l); + l = next; + } +} + +static void change_state(int y, state_t* state, renderpoint_t*p) +{ + layer_t*before=0, *self=0, *after=0; + + if(DEBUG&2) { + printf("[(%f,%d)/%d/%d-%d]", p->x, y, p->depth, p->shapeline->fillstyle0, p->shapeline->fillstyle1); + } + + search_layer(state, p->depth, &before, &self, &after); + + if(self) { + /* shape update */ + if(self->fillid<0/*??*/ || !p->shapeline->fillstyle0 || !p->shapeline->fillstyle1) { + /* filling ends */ + if(DEBUG&2) printf(""); + + delete_layer(state, self); + } else { + /*both fill0 and fill1 are set- exchange the two, updating the layer */ + if(self->fillid == p->shapeline->fillstyle0) { + self->fillid = p->shapeline->fillstyle1; + self->p = p; + if(DEBUG&2) printf(""); + } else if(self->fillid == p->shapeline->fillstyle1) { + self->fillid = p->shapeline->fillstyle0; + self->p = p; + if(DEBUG&2) printf(""); + } else { + /* buggy shape. keep everything as-is. */ + if(DEBUG&2) printf(""); + //fprintf(stderr, "\n", y); + } + } + return; + } else { + layer_t* n = 0; + if(p->shapeline && p->shapeline->fillstyle0 && p->shapeline->fillstyle1) { + /* this is a hack- a better way would be to make sure that + we always get (0,32), (32, 33), (33, 0) in the right order if + they happen to fall on the same pixel. + (not: (0,32), (33, 0), (32, 33)) + Notice: Weird fill styles appear if linestyles are involved, too. + */ + fprintf(stderr, "\n", y); + return; + } + + n = (layer_t*)rfx_calloc(sizeof(layer_t)); + + if(DEBUG&2) printf("<+>"); + + n->fillid = p->shapeline->fillstyle0 ? p->shapeline->fillstyle0 : p->shapeline->fillstyle1; + n->p = p; + + add_layer(state, before, n); + } +} + +void swf_Process(RENDERBUF*dest, U32 clipdepth) +{ + renderbuf_internal*i = (renderbuf_internal*)dest->internal; + int y; + + if(i->ymax < i->ymin) { + /* shape is empty. return. + only, if it's a clipshape, remember the clipdepth */ + if(clipdepth) { + for(y=0;yheight2;y++) { + if(clipdepth > i->lines[y].pending_clipdepth) + i->lines[y].pending_clipdepth = clipdepth; + } + } + return; //nothing (else) to do + } + + if(clipdepth) { + /* lines outside the clip shape are not filled + immediately, only the highest clipdepth so far is + stored there. They will be clipfilled once there's + actually something about to happen in that line */ + for(y=0;yymin;y++) { + if(clipdepth > i->lines[y].pending_clipdepth) + i->lines[y].pending_clipdepth = clipdepth; + } + for(y=i->ymax+1;yheight2;y++) { + if(clipdepth > i->lines[y].pending_clipdepth) + i->lines[y].pending_clipdepth = clipdepth; + } + } + + for(y=i->ymin;y<=i->ymax;y++) { + int n; + TAG*tag = i->lines[y].points; + int num = i->lines[y].num; + renderpoint_t*points = (renderpoint_t*)tag->data; + RGBA*line = &i->img[i->width2*y]; + int*zline = &i->zbuf[i->width2*y]; + int lastx = 0; + state_t fillstate; + memset(&fillstate, 0, sizeof(state_t)); + qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); + /* resort points */ + /*if(y==884) { + for(n=0;nfillstyle0, + points[n].shapeline->fillstyle1, + points[n].shapeline->linestyle); + } + }*/ + + if(i->lines[y].pending_clipdepth && !clipdepth) { + fill_clip(line, zline, y, 0, i->width2, i->lines[y].pending_clipdepth); + i->lines[y].pending_clipdepth=0; + } + + for(n=0;nx; + int endx = (int)(next?next->x:i->width2); + if(endx > i->width2) + endx = i->width2; + if(startx < 0) + startx = 0; + if(endx < 0) + endx = 0; + + if(clipdepth) { + /* for clipping, the inverse is filled + TODO: lastx!=startx only at the start of the loop, + so this might be moved up + */ + fill_clip(line, zline, y, lastx, startx, clipdepth); + } + change_state(y, &fillstate, p); + + fill(dest, line, zline, y, startx, endx, &fillstate, clipdepth); +/* if(y == 0 && startx == 232 && endx == 418) { + printf("ymin=%d ymax=%d\n", i->ymin, i->ymax); + for(n=0;nx, p->depth); + } + }*/ + + lastx = endx; + if(endx == i->width2) + break; + } + if(clipdepth) { + /* TODO: is lastx *ever* != i->width2 here? */ + fill_clip(line, zline, y, lastx, i->width2, clipdepth); + } + free_layers(&fillstate); + + i->lines[y].num = 0; + swf_ClearTag(i->lines[y].points); + } + i->ymin = 0x7fffffff; + i->ymax = -0x80000000; +} + +RGBA* swf_Render(RENDERBUF*dest) +{ + renderbuf_internal*i = (renderbuf_internal*)dest->internal; + RGBA* img = (RGBA*)rfx_alloc(sizeof(RGBA)*dest->width*dest->height); + int y; + int antialize = i->antialize; + + if(antialize <= 1) /* no antializing */ { + for(y=0;yheight2;y++) { + RGBA*line = &i->img[y*i->width2]; + memcpy(&img[y*dest->width], line, sizeof(RGBA)*dest->width); + } + } else { + RGBA**lines = (RGBA**)rfx_calloc(sizeof(RGBA*)*antialize); + int q = antialize*antialize; + int ypos = 0; + for(y=0;yheight2;y++) { + int n; + ypos = y % antialize; + lines[ypos] = &i->img[y*i->width2]; + if(ypos == antialize-1) { + RGBA*out = &img[(y / antialize)*dest->width]; + int x; + int r,g,b,a; + for(x=0;xwidth;x++) { + int xpos = x*antialize; + int yp; + U32 r=0,g=0,b=0,a=0; + for(yp=0;ypr; + g += p->g; + b += p->b; + a += p->a; + } + } + out[x].r = r / q; + out[x].g = g / q; + out[x].b = b / q; + out[x].a = a / q; + } + } + } + rfx_free(lines); + } + return img; +} + +typedef struct +{ + int numchars; + SHAPE2**glyphs; +} font_t; + +enum CHARACTER_TYPE {none_type, shape_type, image_type, text_type, edittext_type, font_type, sprite_type}; +typedef struct +{ + TAG*tag; + SRECT*bbox; + enum CHARACTER_TYPE type; + union { + SHAPE2*shape; + font_t*font; + } obj; +} character_t; + +int compare_placements(const void *v1, const void *v2) +{ + SWFPLACEOBJECT*p1 = (SWFPLACEOBJECT*)v1; + SWFPLACEOBJECT*p2 = (SWFPLACEOBJECT*)v2; + if(p1->depth != p2->depth) + return (int)p1->depth - (int)p2->depth; + else + if(p2->clipdepth) + return 1; // do the clip first + else + return -1; + +/* if(!p1->clipdepth) { + if(!p2->clipdepth) { + // !p1->clipdepth && !p2->clipdepth + return (int)p1->depth - (int)p2->depth; + } else { + // !p1->clipdepth && p2->clipdepth + if(p1->depth != p2->clipdepth) + return (int)p1->depth - (int)p2->clipdepth; + else + return 1; // do the clip first + } + } else { + if(!p2->clipdepth) { + // p1->clipdepth && !p2->clipdepth + if(p1->clipdepth != p2->depth) + return (int)p1->clipdepth - (int)p2->depth; + else + return -1;// do the clip first + } else { + if(p1->clipdepth != p2->clipdepth) + return (int)p1->clipdepth - (int)p2->clipdepth; + else + return (int)p1->depth - (int)p2->depth; + } + }*/ +} + +typedef struct textcallbackblock +{ + character_t*idtable; + U16 depth; + U16 clipdepth; + CXFORM* cxform; + MATRIX m; + RENDERBUF*buf; +} textcallbackblock_t; + +static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, + int xstart, int ystart, RGBA* color) +{ + textcallbackblock_t * info = (textcallbackblock_t*)self; + font_t*font = 0; + int t; + if(info->idtable[fontid].type != font_type) { + fprintf(stderr, "ID %d is not a font\n", fontid); + return; + } else if(!info->idtable[fontid].obj.font) { + fprintf(stderr, "Font %d unknown\n", fontid); + return; + } else { + font = info->idtable[fontid].obj.font; + } + for(t=0;tm; + SPOINT p; + + p.x = x; p.y = y; + p = swf_TurnPoint(p, &m); + + m.sx = (m.sx * fontsize) / 1024; + m.sy = (m.sy * fontsize) / 1024; + m.r0 = (m.r0 * fontsize) / 1024; + m.r1 = (m.r1 * fontsize) / 1024; + m.tx = p.x; + m.ty = p.y; + + if(chars[t]<0 || chars[t]>= font->numchars) { + fprintf(stderr, "Character out of range: %d\n", chars[t]); + } else { + SHAPE2*shape = font->glyphs[chars[t]]; + shape->fillstyles[0].color = *color; //q&d + /*printf("Rendering char %d (size %d, x:%d, y:%d) color:%02x%02x%02x%02x\n", chars[t], fontsize, x, y, + color->a, color->r, color->g, color->b); + swf_DumpMatrix(stdout, &m); + swf_DumpShape(shape);*/ + swf_RenderShape(info->buf, shape, &m, info->cxform, info->depth, info->clipdepth); + } + } +} + +static void renderFromTag(RENDERBUF*buf, character_t*idtable, TAG*firstTag, MATRIX*m) +{ + TAG*tag = 0; + int numplacements = 0; + SWFPLACEOBJECT* placements; + + tag = firstTag; + numplacements = 0; + while(tag) { + if(tag->id == ST_PLACEOBJECT || + tag->id == ST_PLACEOBJECT2) { + numplacements++; + } + if(tag->id == ST_SHOWFRAME || tag->id == ST_END) + break; + tag = tag->next; + } + placements = (SWFPLACEOBJECT*)rfx_calloc(sizeof(SWFPLACEOBJECT)*numplacements); + numplacements = 0; + + tag = firstTag; + while(tag) { + if(swf_isPlaceTag(tag)) { + SWFPLACEOBJECT p; + swf_GetPlaceObject(tag, &p); + /* TODO: add move and deletion */ + placements[numplacements++] = p; + swf_PlaceObjectFree(&p); //dirty! but it only frees fields we don't use + } + if(tag->id == ST_SHOWFRAME || tag->id == ST_END) + break; + tag = tag->next; + } + + qsort(placements, numplacements, sizeof(SWFPLACEOBJECT), compare_placements); + + int t; + for(t=0;tid; + MATRIX m2; + swf_MatrixJoin(&m2, m, &p->matrix); + + if(!idtable[id].tag) { + fprintf(stderr, "rfxswf: Id %d is unknown\n", id); + continue; + } + + if(idtable[id].type == shape_type) { + //SRECT sbbox = swf_TurnRect(*idtable[id].bbox, &p->matrix); + swf_RenderShape(buf, idtable[id].obj.shape, &m2, &p->cxform, p->depth, p->clipdepth); + } else if(idtable[id].type == sprite_type) { + swf_UnFoldSprite(idtable[id].tag); + renderFromTag(buf, idtable, idtable[id].tag->next, &m2); + swf_FoldSprite(idtable[id].tag); + } else if(idtable[id].type == text_type) { + TAG* tag = idtable[id].tag; + textcallbackblock_t info; + MATRIX mt; + + swf_SetTagPos(tag, 0); + swf_GetU16(tag); + swf_GetRect(tag,0); + swf_GetMatrix(tag,&mt); + swf_MatrixJoin(&info.m, &m2, &mt); + /*printf("Text matrix:\n"); + swf_DumpMatrix(stdout, &m); + printf("Placement matrix:\n"); + swf_DumpMatrix(stdout, &p->matrix); + printf("Final matrix:\n"); + swf_DumpMatrix(stdout, &info.m);*/ + + info.idtable = idtable; + info.depth = p->depth; + info.cxform = &p->cxform; + info.clipdepth = p->clipdepth; + info.buf = buf; + + swf_ParseDefineText(tag, textcallback, &info); + } else if(idtable[id].type == edittext_type) { + TAG* tag = idtable[id].tag; + U16 flags = swf_GetBits(tag, 16); + if(flags & ET_HASTEXT) { + fprintf(stderr, "edittext not supported yet (id %d)\n", id); + } + } else { + fprintf(stderr, "Unknown/Unsupported Object Type for id %d: %s\n", id, swf_TagGetName(idtable[id].tag)); + } + } + + free(placements); +} + +void swf_RenderSWF(RENDERBUF*buf, SWF*swf) +{ + TAG*tag; + int t; + RGBA color; + + swf_OptimizeTagOrder(swf); + swf_FoldAll(swf); + + character_t* idtable = (character_t*)rfx_calloc(sizeof(character_t)*65536); // id to character mapping + + /* set background color */ + color = swf_GetSWFBackgroundColor(swf); + swf_Render_SetBackgroundColor(buf, color); + + /* parse definitions */ + tag = swf->firstTag; + while(tag) { + if(swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + idtable[id].tag = tag; + idtable[id].bbox = (SRECT*)rfx_alloc(sizeof(SRECT)); + *idtable[id].bbox = swf_GetDefineBBox(tag); + + if(swf_isShapeTag(tag)) { + SHAPE2* shape = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); + swf_ParseDefineShape(tag, shape); + idtable[id].type = shape_type; + idtable[id].obj.shape = shape; + } else if(swf_isImageTag(tag)) { + int width,height; + RGBA*data = swf_ExtractImage(tag, &width, &height); + idtable[id].type = image_type; + swf_Render_AddImage(buf, id, data, width, height); + free(data); + } else if(tag->id == ST_DEFINEFONT || + tag->id == ST_DEFINEFONT2) { + int t; + SWFFONT*swffont; + font_t*font = (font_t*)rfx_calloc(sizeof(font_t)); + idtable[id].obj.font = font; + swf_FontExtract(swf,id,&swffont); + font->numchars = swffont->numchars; + font->glyphs = (SHAPE2**)rfx_calloc(sizeof(SHAPE2*)*font->numchars); + for(t=0;tnumchars;t++) { + if(!swffont->glyph[t].shape->fillstyle.n) { + /* the actual fill color will be overwritten while rendering */ + swf_ShapeAddSolidFillStyle(swffont->glyph[t].shape, &color_white); + } + font->glyphs[t] = swf_ShapeToShape2(swffont->glyph[t].shape); + } + swf_FontFree(swffont); + idtable[id].type = font_type; + + } else if(tag->id == ST_DEFINEFONTINFO || + tag->id == ST_DEFINEFONTINFO2) { + idtable[id].type = font_type; + } else if(tag->id == ST_DEFINETEXT || + tag->id == ST_DEFINETEXT2) { + idtable[id].type = text_type; + } else if(tag->id == ST_DEFINESPRITE) { + idtable[id].type = sprite_type; + } else if(tag->id == ST_DEFINEEDITTEXT) { + idtable[id].type = edittext_type; + } + } + tag = tag->next; + } + MATRIX m; + swf_GetMatrix(0, &m); + renderFromTag(buf, idtable, swf->firstTag, &m); + + /* free id and depth tables again */ + for(t=0;t<65536;t++) { + if(idtable[t].bbox) { + free(idtable[t].bbox); + idtable[t].bbox=0; + } + if(idtable[t].type == shape_type) { + SHAPE2* shape = idtable[t].obj.shape; + if(shape) { + swf_Shape2Free(shape); // FIXME + free(idtable[t].obj.shape);idtable[t].obj.shape = 0; + } + } else if(idtable[t].type == font_type) { + font_t* font = idtable[t].obj.font; + if(font) { + if(font->glyphs) { + int t; + for(t=0;tnumchars;t++) { + swf_Shape2Free(font->glyphs[t]); + free(font->glyphs[t]); font->glyphs[t] = 0; + } + free(font->glyphs); + font->glyphs = 0; + } + free(idtable[t].obj.font); idtable[t].obj.font = 0; + font = 0; + } + } + } + free(idtable); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c new file mode 100644 index 000000000..bc972d494 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c @@ -0,0 +1,1124 @@ +/* swfshape.c + + shape functions + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include "../rfxswf.h" + +#define SF_MOVETO 0x01 +#define SF_FILL0 0x02 +#define SF_FILL1 0x04 +#define SF_LINE 0x08 +#define SF_NEWSTYLE 0x10 + +void swf_ShapeFree(SHAPE * s) +{ + if(!s) + return; + if (s->linestyle.data) rfx_free(s->linestyle.data); + s->linestyle.data = NULL; + s->linestyle.n = 0; + if (s->fillstyle.data) rfx_free(s->fillstyle.data); + s->fillstyle.data = NULL; + s->fillstyle.n = 0; + if (s->data) rfx_free(s->data); + s->data = NULL; + rfx_free(s); +} + +int swf_ShapeNew(SHAPE * * s) +{ + SHAPE * sh; + if (!s) return -1; + sh = (SHAPE *)rfx_calloc(sizeof(SHAPE)); + *s = sh; + return 0; +} + +int swf_GetSimpleShape(TAG * t,SHAPE * * s) // without Linestyle/Fillstyle Record +{ SHAPE * sh; + int bitl, len; + int end; + U32 pos; + + if (FAILED(swf_ShapeNew(s))) return -1; + sh = s[0]; + + swf_ResetReadBits(t); + sh->bits.fill = (U16)swf_GetBits(t,4); + sh->bits.line = (U16)swf_GetBits(t,4); + bitl = 0; end = 0; pos = swf_GetTagPos(t); + + while (!end) + { int edge = swf_GetBits(t,1); bitl+=1; + if (edge) + { bitl+=1; + if (swf_GetBits(t,1)) // Line + { U16 nbits = swf_GetBits(t,4)+2; + bitl+=5; + + if (swf_GetBits(t,1)) // x/y Line + { swf_GetBits(t,nbits); + swf_GetBits(t,nbits); + bitl+=nbits*2; + } + else // hline/vline + { swf_GetBits(t,nbits+1); + bitl+=nbits+1; + } + } + else // Curve + { U16 nbits = swf_GetBits(t,4)+2; + bitl+=4; + + swf_GetBits(t,nbits); + swf_GetBits(t,nbits); + swf_GetBits(t,nbits); + swf_GetBits(t,nbits); + + bitl+=4*nbits; + } + } + else + { U16 flags = swf_GetBits(t,5); bitl+=5; + if (flags) + { + if (flags&SF_MOVETO) + { U16 nbits = swf_GetBits(t,5); bitl+=5; + swf_GetBits(t,nbits); + swf_GetBits(t,nbits); + bitl+=2*nbits; + } + + if (flags&SF_FILL0) + { swf_GetBits(t,sh->bits.fill); + bitl+=sh->bits.fill; + } + + if (flags&SF_FILL1) + { swf_GetBits(t,sh->bits.fill); + bitl+=sh->bits.fill; + } + + if (flags&SF_LINE) + { swf_GetBits(t,sh->bits.line); + bitl+=sh->bits.line; + } + + if (flags&SF_NEWSTYLE) + { fprintf(stderr,"RFXSWF: Can't process extended styles in shape.\n"); + } + } + else end = 1; + } + } + swf_SetTagPos(t,pos); + len = (bitl+7)/8; + + if (sh->data) rfx_free(sh->data); + sh->data = (U8*)rfx_alloc(len); + + if (sh->data) + { sh->bitlen = bitl; + swf_GetBlock(t,sh->data,len); + } + else return -1; + + return len; +} + +int swf_SetSimpleShape(TAG * t,SHAPE * s) // without Linestyle/Fillstyle Record +{ int l; + + if (!s) return -1; + l = (s->bitlen+7)/8; + + if (t) + { swf_ResetWriteBits(t); + + swf_SetBits(t,s->bits.fill,4); + swf_SetBits(t,s->bits.line,4); + swf_SetBlock(t,s->data,l); + + swf_ResetWriteBits(t); + } + return l+1; +} + +int swf_SetFillStyle(TAG * t,FILLSTYLE * f) +{ if ((!t)||(!f)) return -1; + swf_SetU8(t,f->type); + + switch (f->type) + { case FILL_SOLID: + if (swf_GetTagID(t)!=ST_DEFINESHAPE3) swf_SetRGB(t,&f->color); + else swf_SetRGBA(t,&f->color); + break; + + case FILL_TILED: + case FILL_CLIPPED: + swf_SetU16(t,f->id_bitmap); + swf_SetMatrix(t,&f->m); + break; + case FILL_LINEAR: + case FILL_RADIAL: + swf_SetMatrix(t,&f->m); + swf_SetGradient(t,&f->gradient,/*alpha?*/t->id==ST_DEFINESHAPE3?1:0); + break; + } + + return 0; +} + +int swf_SetLineStyle(TAG * t,LINESTYLE * l) +{ if ((!l)||(!t)) return -1; + swf_SetU16(t,l->width); + + if (swf_GetTagID(t)!=ST_DEFINESHAPE3) swf_SetRGB(t,&l->color); + else swf_SetRGBA(t,&l->color); + + return 0; +} + +int swf_SetShapeStyleCount(TAG * t,U16 n) +{ if (n>254) + { swf_SetU8(t,0xff); + swf_SetU16(t,n); + return 3; + } + else + { swf_SetU8(t,(U8)n); + return 1; + } +} + +int swf_SetShapeStyles(TAG * t,SHAPE * s) +{ int i,l; + if (!s) return -1; + + l = 0; + l += swf_SetShapeStyleCount(t,s->fillstyle.n); + + for (i=0;ifillstyle.n;i++) + l+=swf_SetFillStyle(t,&s->fillstyle.data[i]); + + l += swf_SetShapeStyleCount(t,s->linestyle.n); + + for (i=0;ilinestyle.n;i++) + l+=swf_SetLineStyle(t,&s->linestyle.data[i]); + + return l; +} + +int swf_ShapeCountBits(SHAPE * s,U8 * fbits,U8 * lbits) +{ if (!s) return -1; + s->bits.fill = swf_CountUBits(s->fillstyle.n, 0); + s->bits.line = swf_CountUBits(s->linestyle.n, 0); + if (fbits) fbits[0] = s->bits.fill; + if (lbits) lbits[0] = s->bits.line; + return 0; +} + +int swf_SetShapeBits(TAG * t,SHAPE * s) +{ if ((!t)||(!s)) return -1; + swf_ResetWriteBits(t); + swf_SetBits(t,s->bits.fill,4); + swf_SetBits(t,s->bits.line,4); + return 0; +} + +int swf_SetShapeHeader(TAG * t,SHAPE * s) +{ int res; + res = swf_SetShapeStyles(t,s); + if (res>=0) res = swf_ShapeCountBits(s,NULL,NULL); + if (res>=0) res = swf_SetShapeBits(t,s); + return res; +} + +int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitmap, GRADIENT*gradient) +{ RGBA def_c; + MATRIX def_m; + GRADIENT def_g; + + // handle defaults + + if (!s) return -1; + if (!color) + { color = &def_c; + def_c.a = 0xff; + def_c.r = def_c.g = def_c.b = 0; + } + if (!m) + { m = &def_m; + swf_GetMatrix(NULL,m); + } + if(!gradient) + { + gradient = &def_g; + swf_GetGradient(NULL, gradient, 1); + } + + // handle memory + + if (s->fillstyle.data) + { FILLSTYLE * xnew = (FILLSTYLE *)rfx_realloc(s->fillstyle.data,(s->fillstyle.n+1)*sizeof(FILLSTYLE)); + if (!xnew) return -1; + s->fillstyle.data = xnew; + } + else + { s->fillstyle.data = (FILLSTYLE *)rfx_alloc(sizeof(FILLSTYLE)); + s->fillstyle.n = 0; + if (!s->fillstyle.data) return -1; + } + + // set fillstyle + + s->fillstyle.data[s->fillstyle.n].type = type; + s->fillstyle.data[s->fillstyle.n].id_bitmap = id_bitmap; + memcpy(&s->fillstyle.data[s->fillstyle.n].m,m,sizeof(MATRIX)); + memcpy(&s->fillstyle.data[s->fillstyle.n].color,color,sizeof(RGBA)); + memcpy(&s->fillstyle.data[s->fillstyle.n].gradient,gradient,sizeof(GRADIENT)); + + return (++s->fillstyle.n); +} +int swf_ShapeAddFillStyle2(SHAPE * s,FILLSTYLE*fs) +{ + return swf_ShapeAddFillStyle(s, fs->type, &fs->m, &fs->color, fs->id_bitmap, &fs->gradient); +} + +int swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color) +{ return swf_ShapeAddFillStyle(s,FILL_SOLID,NULL,color,0,0); +} + +int swf_ShapeAddBitmapFillStyle(SHAPE * s,MATRIX * m,U16 id_bitmap,int clip) +{ return swf_ShapeAddFillStyle(s,clip?FILL_CLIPPED:FILL_TILED,m,NULL,id_bitmap,0); +} + +int swf_ShapeAddGradientFillStyle(SHAPE * s,MATRIX * m,GRADIENT* gradient,int radial) +{ return swf_ShapeAddFillStyle(s,radial?FILL_RADIAL:FILL_LINEAR,m,NULL,0,gradient); +} + +int swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color) +{ RGBA def; + if (!s) return -1; + if (!color) + { color = &def; + def.a = 0xff; + def.r = def.g = def.b = 0; + } + if (s->linestyle.data) + { LINESTYLE * xnew = (LINESTYLE *)rfx_realloc(s->linestyle.data,(s->linestyle.n+1)*sizeof(LINESTYLE)); + if (!xnew) return -1; + s->linestyle.data = xnew; + } + else + { s->linestyle.data = (LINESTYLE *)rfx_alloc(sizeof(LINESTYLE)); + s->linestyle.n = 0; + if (!s->linestyle.data) return -1; + } + + s->linestyle.data[s->linestyle.n].width = width; + memcpy(&s->linestyle.data[s->linestyle.n].color,color,sizeof(RGBA)); + + return (++s->linestyle.n); +} + +int swf_ShapeSetMove(TAG * t,SHAPE * s,S32 x,S32 y) +{ U8 b; + if (!t) return -1; + swf_SetBits(t,0,1); + swf_SetBits(t,SF_MOVETO,5); + + b = swf_CountBits(x,0); + b = swf_CountBits(y,b); + + if(b>31) { + fprintf(stderr, "Warning: bad moveTo (%f,%f)\n", x/20.0, y/20.0); + b=31; + } + + swf_SetBits(t,b,5); + swf_SetBits(t,x,b); + swf_SetBits(t,y,b); + + return 0; +} + +int swf_ShapeSetStyle(TAG * t,SHAPE * s,int line,int fill0,int fill1) +{ if ((!t)||(!s)) return -1; + + swf_SetBits(t,0,1); + swf_SetBits(t,(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); + + if (fill0) swf_SetBits(t,fill0,s->bits.fill); + if (fill1) swf_SetBits(t,fill1,s->bits.fill); + if (line) swf_SetBits(t,line ,s->bits.line); + + return 0; +} + +/* TODO: sometimes we want to set fillstyle 0, as that's the empty fill + used for line drawings. At the moment, we can't, as 0 fill be considered + nonexistent and therefore not set. + these defines are a workaround (they also reduce the maximal number of + fill styles to 32768) + */ +#define UNDEFINED_COORD 0x7fffffff + +int swf_ShapeSetAll(TAG * t,SHAPE * s,S32 x,S32 y,int line,int fill0,int fill1) +{ U8 b; + U8 hasmove = 0; + if ((!t)||(!s)) return -1; + + if(x!=UNDEFINED_COORD || y!=UNDEFINED_COORD) + hasmove=1; + + swf_SetBits(t,0,1); + swf_SetBits(t,(hasmove?SF_MOVETO:0)|(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); + + if(hasmove) { + b = swf_CountBits(x,0); + b = swf_CountBits(y,b); + swf_SetBits(t,b,5); + swf_SetBits(t,x,b); + swf_SetBits(t,y,b); + } + + if (fill0) swf_SetBits(t,fill0,s->bits.fill); + if (fill1) swf_SetBits(t,fill1,s->bits.fill); + if (line) swf_SetBits(t,line ,s->bits.line); + + return 0; +} + +int swf_ShapeSetEnd(TAG * t) +{ if (!t) return -1; + swf_SetBits(t,0,6); + swf_ResetWriteBits(t); + return 0; +} + +int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y) +{ + U8 b; + if (!t) return -1; + + b = swf_CountBits(x,2); + b = swf_CountBits(y,b); + if (b<2) b=2; + if(b >= 18) { + if(b > 18 + 6) { + /* do not split into more than 64 segments. If the line is *that* long, something's broken */ + fprintf(stderr, "Warning: Line to %.2f,%.2f is too long (%d bits)\n", (double)x,(double)y, b); + return -1; + } else { + /* split line */ + int x1,y1,x2,y2; + if(x>=0) { x1 = x/2;x2 = (x+1)/2;} + else { x1 = x/2;x2 = (x-1)/2;} + if(y>=0) { y1 = y/2;y2 = (y+1)/2;} + else { y1 = y/2;y2 = (y-1)/2;} + swf_ShapeSetLine(t, s, x1,y1); + swf_ShapeSetLine(t, s, x2,y2); + return 0; + } + } + + if(x!=0 && y!=0) { //(!s)||((x!=0)&&(y!=0))) + swf_SetBits(t,3,2); // Straight Edge + swf_SetBits(t, b-2, 4); //Number of Bits in x/y + swf_SetBits(t,1,1); // Diagonal + swf_SetBits(t,x,b); + swf_SetBits(t,y,b); + } else if (x==0) { + swf_SetBits(t,3,2); // Straight Edge + swf_SetBits(t, b-2, 4); //Number of Bits in y + swf_SetBits(t,1,2); // Vertical + swf_SetBits(t,y,b); + } else { + swf_SetBits(t,3,2); // Straight Edge + swf_SetBits(t, b-2, 4); //Number of Bits in x + swf_SetBits(t,0,2); // Horizontal + swf_SetBits(t,x,b); + } + return 0; +} + +int swf_ShapeSetCurve(TAG * t,SHAPE * s,S32 x,S32 y,S32 ax,S32 ay) +{ + U8 b; + if (!t) return -1; + + b = swf_CountBits(ax,2); + b = swf_CountBits(ay,b); + b = swf_CountBits(x,b); + b = swf_CountBits(y,b); + + if(b >= 18) { + fprintf(stderr, "Bit overflow in swf_ShapeSetCurve- %d (%d,%d,%d,%d)\n", b, ax,ay,x,y); + return swf_ShapeSetLine(t, s, x+ax, y+ay); + } + + swf_SetBits(t,2,2); + swf_SetBits(t,b-2,4); + swf_SetBits(t,x,b); + swf_SetBits(t,y,b); + swf_SetBits(t,ax,b); + swf_SetBits(t,ay,b); + return 0; +} + +int swf_ShapeSetCircle(TAG * t,SHAPE * s,S32 x,S32 y,S32 rx,S32 ry) +{ double C1 = 0.2930; + double C2 = 0.4140; + double begin = 0.7070; + + if (!t) return -1; + + swf_ShapeSetMove(t,s,x+begin*rx,y+begin*ry); + swf_ShapeSetCurve(t,s, -C1*rx, C1*ry, -C2*rx, 0); + swf_ShapeSetCurve(t,s, -C2*rx, 0, -C1*rx, -C1*ry); + swf_ShapeSetCurve(t,s, -C1*rx, -C1*ry, 0, -C2*ry); + swf_ShapeSetCurve(t,s, 0, -C2*ry, C1*rx, -C1*ry); + swf_ShapeSetCurve(t,s, C1*rx, -C1*ry, C2*rx, 0); + swf_ShapeSetCurve(t,s, C2*rx, 0, C1*rx, C1*ry); + swf_ShapeSetCurve(t,s, C1*rx, C1*ry, 0, C2*ry); + swf_ShapeSetCurve(t,s, 0, C2*ry, -C1*rx, C1*ry); + + return 0; +} + +void dummycallback1(TAG*tag, int x, void*y) +{ +} + +// from swftools.c: +void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph); + +static void parseFillStyle(FILLSTYLE*dest, TAG*tag, int num) +{ + int type = swf_GetU8(tag); //type + dest->type = type; + if(type == 0) { + /* plain color */ + if(num >= 3) + swf_GetRGBA(tag, &dest->color); + else + swf_GetRGB(tag, &dest->color); + } + else if(type == 0x10 || type == 0x11 || type == 0x12 || type == 0x13) + { + /* linear/radial gradient fill */ + swf_ResetReadBits(tag); + swf_GetMatrix(tag, &dest->m); + swf_ResetReadBits(tag); + swf_GetGradient(tag, &dest->gradient, num>=3?1:0); + if(type == 0x13) + swf_GetU16(tag); + } + else if(type == 0x40 || type == 0x41 || type == 0x42 || type == 0x43) + { + /* bitmap fill */ + swf_ResetReadBits(tag); + dest->id_bitmap = swf_GetU16(tag); //id + swf_ResetReadBits(tag); //? + swf_GetMatrix(tag, &dest->m); + } + else { + fprintf(stderr, "rfxswf:swfshape.c Unknown fillstyle:0x%02x in tag %02d\n",type, tag->id); + } +} +static int parseFillStyleArray(TAG*tag, SHAPE2*shape) +{ + U16 count; + int t; + int num=0; + int fillstylestart = shape->numfillstyles; + int linestylestart = shape->numlinestyles; + + if(tag->id == ST_DEFINESHAPE) + num = 1; + else if(tag->id == ST_DEFINESHAPE2) + num = 2; + else if(tag->id == ST_DEFINESHAPE3) + num = 3; + else if(tag->id == ST_DEFINESHAPE4) + num = 4; + + count = swf_GetU8(tag); + if(count == 0xff && num>1) // defineshape2,3 only + count = swf_GetU16(tag); + + shape->numfillstyles += count; + if(shape->numfillstyles) { + shape->fillstyles = (FILLSTYLE*)rfx_realloc(shape->fillstyles, sizeof(FILLSTYLE)*shape->numfillstyles); + + for(t=fillstylestart;tnumfillstyles;t++) { + parseFillStyle(&shape->fillstyles[t], tag, num); + } + } + + swf_ResetReadBits(tag); + count = swf_GetU8(tag); // line style array + if(count == 0xff) + count = swf_GetU16(tag); + + shape->numlinestyles += count; + if(count) { + shape->linestyles = (LINESTYLE*)rfx_realloc(shape->linestyles, sizeof(LINESTYLE)*shape->numlinestyles); + /* TODO: should we start with 1 and insert a correct definition of the + "built in" linestyle 0? */ + for(t=linestylestart;tnumlinestyles;t++) + { + char fill = 0; + shape->linestyles[t].width = swf_GetU16(tag); + + if(num >= 4) { + U16 flags = swf_GetU16(tag); + if((flags & 0x30) == 0x20) + swf_GetU16(tag); // miter limit + if(flags & 0x08) { + fprintf(stderr, "Warning: Filled strokes parsing not yet fully supported\n"); + fill = 1; + } + } + + if(fill) { + FILLSTYLE f; + parseFillStyle(&f, tag, num); + shape->linestyles[t].color = f.color; + } else { + if(num >= 3) + swf_GetRGBA(tag, &shape->linestyles[t].color); + else + swf_GetRGB(tag, &shape->linestyles[t].color); + } + } + } + return 1; +} + +char swf_ShapeIsEmpty(SHAPE*s) +{ + if(!s || !s->data) return 1; + TAG _tag; + TAG* tag = &_tag; + memset(tag, 0, sizeof(TAG)); + tag->data = s->data; + tag->len = tag->memsize = (s->bitlen+7)/8; + tag->pos = 0; + + while(1) { + if(!swf_GetBits(tag, 1)) { + U16 flags = swf_GetBits(tag, 5); + if(!flags) break; + if(flags&1) { //move + int n = swf_GetBits(tag, 5); + swf_GetSBits(tag, n); //x + swf_GetSBits(tag, n); //y + } + if(flags&2) swf_GetBits(tag, s->bits.fill); + if(flags&4) swf_GetBits(tag, s->bits.fill); + if(flags&8) swf_GetBits(tag, s->bits.line); + if(flags&16) {return 0;} + } else { + return 0; + } + } + return 1; +} + +/* todo: merge this with swf_GetSimpleShape */ +static SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits, int version, SHAPE2*shape2) +{ + SHAPELINE _lines; + SHAPELINE*lines = &_lines; + + TAG _tag; + TAG* tag = &_tag; + int fill0 = 0; + int fill1 = 0; + int line = 0; + int x=0,y=0; + int linestyleadd=0; + int fillstyleadd=0; + + memset(tag, 0, sizeof(TAG)); + tag->data = data; + tag->len = tag->memsize = (bits+7)/8; + tag->pos = 0; + tag->id = version==1?ST_DEFINESHAPE:(version==2?ST_DEFINESHAPE2:(version==3?ST_DEFINESHAPE3:ST_DEFINESHAPE4)); + + lines->next = 0; + while(1) { + int flags; + flags = swf_GetBits(tag, 1); + if(!flags) { //style change + flags = swf_GetBits(tag, 5); + if(!flags) + break; + if(flags&1) { //move + int n = swf_GetBits(tag, 5); + x = swf_GetSBits(tag, n); //x + y = swf_GetSBits(tag, n); //y + } + if(flags&2) + fill0 = swf_GetBits(tag, fillbits) + fillstyleadd; + if(flags&4) + fill1 = swf_GetBits(tag, fillbits) + fillstyleadd; + if(flags&8) + line = swf_GetBits(tag, linebits) + linestyleadd; + if(flags&16) { + if(!shape2) { + fprintf(stderr, "rfxswf: Error: Additional fillstyles not supported\n");fflush(stderr); + enumerateUsedIDs_styles(tag, dummycallback1, 0, version, 0); + } else { + linestyleadd = shape2->numlinestyles; + fillstyleadd = shape2->numfillstyles; + if(!parseFillStyleArray(tag, shape2)) + return 0; + } + fillbits = swf_GetBits(tag, 4); + linebits = swf_GetBits(tag, 4); + } + if(flags&1) { //move + lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); + lines = lines->next; + lines->type = moveTo; + lines->x = x; + lines->y = y; + lines->sx = lines->sy = 0; + lines->fillstyle0 = fill0; + lines->fillstyle1 = fill1; + lines->linestyle = line; + lines->next = 0; + } + } else { + flags = swf_GetBits(tag, 1); + if(flags) { //straight edge + int n = swf_GetBits(tag, 4) + 2; + if(swf_GetBits(tag, 1)) { //line flag + x += swf_GetSBits(tag, n); //delta x + y += swf_GetSBits(tag, n); //delta y + } else { + int v=swf_GetBits(tag, 1); + int d; + d = swf_GetSBits(tag, n); //vert/horz + if(v) y += d; + else x += d; + } + lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); + lines = lines->next; + lines->type = lineTo; + lines->x = x; + lines->y = y; + lines->sx = lines->sy = 0; + lines->fillstyle0 = fill0; + lines->fillstyle1 = fill1; + lines->linestyle = line; + lines->next = 0; + } else { //curved edge + int n = swf_GetBits(tag, 4) + 2; + int x1,y1; + x += swf_GetSBits(tag, n); + y += swf_GetSBits(tag, n); + x1 = x; + y1 = y; + x += swf_GetSBits(tag, n); + y += swf_GetSBits(tag, n); + + lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); + lines = lines->next; + lines->type = splineTo; + lines->sx = x1; + lines->sy = y1; + lines->x = x; + lines->y = y; + lines->fillstyle0 = fill0; + lines->fillstyle1 = fill1; + lines->linestyle = line; + lines->next = 0; + } + } + } + return _lines.next; +} + +SRECT swf_GetShapeBoundingBox(SHAPE2*shape2) +{ + SRECT r; + SHAPELINE*l = shape2->lines; + int lastx=0,lasty=0; + int valid = 0; + r.xmin = r.ymin = SCOORD_MAX; + r.xmax = r.ymax = SCOORD_MIN; + + while(l) { + int t1; + if(l->linestyle>0) { + t1 = shape2->linestyles[l->linestyle - 1].width*3/2; + } else { + t1 = 0; + } + + if(l->type == lineTo || l->type == splineTo) + { + valid = 1; + if(lastx - t1 < r.xmin) r.xmin = lastx - t1; + if(lasty - t1 < r.ymin) r.ymin = lasty - t1; + if(lastx + t1 > r.xmax) r.xmax = lastx + t1; + if(lasty + t1 > r.ymax) r.ymax = lasty + t1; + if(l->x - t1 < r.xmin) r.xmin = l->x - t1; + if(l->y - t1 < r.ymin) r.ymin = l->y - t1; + if(l->x + t1 > r.xmax) r.xmax = l->x + t1; + if(l->y + t1 > r.ymax) r.ymax = l->y + t1; + if(l->type == splineTo) { + if(l->sx - t1 < r.xmin) r.xmin = l->sx - t1; + if(l->sy - t1 < r.ymin) r.ymin = l->sy - t1; + if(l->sx + t1 > r.xmax) r.xmax = l->sx + t1; + if(l->sy + t1 > r.ymax) r.ymax = l->sy + t1; + } + } + lastx = l->x; + lasty = l->y; + l = l->next; + } + if(!valid) memset(&r, 0, sizeof(SRECT)); + return r; +} + +void swf_Shape2Free(SHAPE2 * s) +{ + SHAPELINE*line = s->lines; + s->lines = 0; + while(line) { + SHAPELINE*next = line->next; + line->next = 0; + rfx_free(line); + line = next; + } + + if(s->linestyles) { + rfx_free(s->linestyles); + s->linestyles = 0; + } + if(s->fillstyles) { + rfx_free(s->fillstyles); + s->fillstyles = 0; + } + if(s->bbox) { + rfx_free(s->bbox); + s->bbox = 0; + } +} + +SHAPE2* swf_Shape2Clone(SHAPE2 * s) +{ + SHAPELINE*line = s->lines; + SHAPELINE*prev = 0; + SHAPE2*s2 = (SHAPE2*)rfx_alloc(sizeof(SHAPE2)); + memcpy(s2,s,sizeof(SHAPE2)); + s2->linestyles = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*s->numlinestyles); + memcpy(s2->linestyles, s->linestyles, sizeof(LINESTYLE)*s->numlinestyles); + s2->fillstyles = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*s->numfillstyles); + memcpy(s2->fillstyles, s->fillstyles, sizeof(FILLSTYLE)*s->numfillstyles); + + while(line) { + SHAPELINE*line2 = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); + memcpy(line2, line, sizeof(SHAPELINE)); + line2->next = 0; + if(prev) + prev->next = line2; + else + s2->lines = line2; + prev = line2; + line = line->next; + } + if(s->bbox) { + s2->bbox = (SRECT*)rfx_alloc(sizeof(SRECT)); + memcpy(s2->bbox, s->bbox, sizeof(SRECT)); + } + return s2; +} + +SHAPE2* swf_ShapeToShape2(SHAPE*shape) { + + SHAPE2*shape2 = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); + + shape2->numlinestyles = shape->linestyle.n; + if(shape2->numlinestyles) { + shape2->linestyles = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*shape->linestyle.n); + memcpy(shape2->linestyles, shape->linestyle.data, sizeof(LINESTYLE)*shape->linestyle.n); + } + + shape2->numfillstyles = shape->fillstyle.n; + if(shape2->numfillstyles) { + shape2->fillstyles = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*shape->fillstyle.n); + memcpy(shape2->fillstyles, shape->fillstyle.data, sizeof(FILLSTYLE)*shape->fillstyle.n); + } + + shape2->lines = swf_ParseShapeData(shape->data, shape->bitlen, shape->bits.fill, shape->bits.line, 1, 0); + shape2->bbox = 0; + return shape2; +}; + +void swf_ShapeSetBitmapRect(TAG*tag, U16 gfxid, int width, int height) +{ + SHAPE*shape; + MATRIX m; + RGBA rgb; + SRECT r; + int lines = 0; + int ls=0,fs; + swf_ShapeNew(&shape); + rgb.b = rgb.g = rgb.r = 0xff; + if(lines) + ls = swf_ShapeAddLineStyle(shape,20,&rgb); + swf_GetMatrix(NULL,&m); + m.sx = 20*65536; + m.sy = 20*65536; + + fs = swf_ShapeAddBitmapFillStyle(shape,&m,gfxid,0); + r.xmin = 0; + r.ymin = 0; + r.xmax = width*20; + r.ymax = height*20; + swf_SetRect(tag,&r); + + swf_SetShapeStyles(tag,shape); + swf_ShapeCountBits(shape,NULL,NULL); + swf_SetShapeBits(tag,shape); + + swf_ShapeSetAll(tag,shape,0,0,lines?ls:0,fs,0); + + swf_ShapeSetLine(tag,shape,width*20,0); + swf_ShapeSetLine(tag,shape,0,height*20); + swf_ShapeSetLine(tag,shape,-width*20,0); + swf_ShapeSetLine(tag,shape,0,-height*20); + swf_ShapeSetEnd(tag); + swf_ShapeFree(shape); +} + +void swf_ShapeSetRectangle(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba) +{ + RGBA white={255,255,255,255}; + if(!rgba) { + rgba = &white; + } + SHAPE* s; + swf_ShapeNew(&s); + int fs = swf_ShapeAddSolidFillStyle(s, rgba); + swf_SetU16(tag,shapeid); + SRECT r; + r.xmin = 0; + r.xmax = 0; + r.ymin = width; + r.ymax = height; + swf_SetRect(tag,&r); + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,0,fs,0); + swf_ShapeSetLine(tag,s,width,0); + swf_ShapeSetLine(tag,s,0,height); + swf_ShapeSetLine(tag,s,-width,0); + swf_ShapeSetLine(tag,s,0,-height); + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); +} + +void swf_ShapeSetRectangleWithBorder(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba, int linewidth, RGBA*linecolor) +{ + RGBA white={255,255,255,255}; + if(!rgba) { + rgba = &white; + } + SHAPE* s; + swf_ShapeNew(&s); + int fs = swf_ShapeAddSolidFillStyle(s, rgba); + int ls = swf_ShapeAddLineStyle(s, linewidth, linecolor); + swf_SetU16(tag,shapeid); + SRECT r; + r.xmin = 0; + r.xmax = 0; + r.ymin = width; + r.ymax = height; + swf_SetRect(tag,&r); + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,ls,fs,0); + swf_ShapeSetLine(tag,s,width,0); + swf_ShapeSetLine(tag,s,0,height); + swf_ShapeSetLine(tag,s,-width,0); + swf_ShapeSetLine(tag,s,0,-height); + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); +} + +void swf_Shape2ToShape(SHAPE2*shape2, SHAPE*shape) +{ + TAG*tag = swf_InsertTag(0,0); + SHAPELINE*l; + int newx=0,newy=0,lastx=0,lasty=0,oldls=0,oldfs0=0,oldfs1=0; + + memset(shape, 0, sizeof(SHAPE)); + + shape->linestyle.n = shape2->numlinestyles; + shape->linestyle.data = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*shape->linestyle.n); + memcpy(shape->linestyle.data, shape2->linestyles, sizeof(LINESTYLE)*shape->linestyle.n); + + shape->fillstyle.n = shape2->numfillstyles; + shape->fillstyle.data = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*shape->fillstyle.n); + memcpy(shape->fillstyle.data, shape2->fillstyles, sizeof(FILLSTYLE)*shape->fillstyle.n); + + swf_ShapeCountBits(shape,NULL,NULL); + + l = shape2->lines; + + while(l) { + int ls=0,fs0=0,fs1=0; + + if(l->type != moveTo) { + if(oldls != l->linestyle) {oldls = ls = l->linestyle;if(!ls) ls=0x8000;} + if(oldfs0 != l->fillstyle0) {oldfs0 = fs0 = l->fillstyle0;if(!fs0) fs0=0x8000;} + if(oldfs1 != l->fillstyle1) {oldfs1 = fs1 = l->fillstyle1;if(!fs1) fs1=0x8000;} + + if(ls || fs0 || fs1 || newx!=0x7fffffff || newy!=0x7fffffff) { + swf_ShapeSetAll(tag,shape,newx,newy,ls,fs0,fs1); + newx = 0x7fffffff; + newy = 0x7fffffff; + } + } + + if(l->type == lineTo) { + swf_ShapeSetLine(tag,shape,l->x-lastx,l->y-lasty); + } else if(l->type == splineTo) { + swf_ShapeSetCurve(tag,shape, l->sx-lastx,l->sy-lasty, l->x-l->sx,l->y-l->sy); + } + if(l->type == moveTo) { + newx = l->x; + newy = l->y; + } + + lastx = l->x; + lasty = l->y; + l = l->next; + } + swf_ShapeSetEnd(tag); + shape->data = tag->data; + shape->bitlen = tag->len*8; + free(tag); +} + +void swf_SetShape2(TAG*tag, SHAPE2*shape2) +{ + SHAPE shape; + swf_Shape2ToShape(shape2, &shape); + + swf_SetRect(tag,shape2->bbox); + swf_SetShapeStyles(tag, &shape); + //swf_ShapeCountBits(&shape,NULL,NULL); // done in swf_Shape2ToShape() + swf_SetShapeBits(tag,&shape); + + swf_SetBlock(tag, shape.data, (shape.bitlen+7)/8); +} + +void swf_ParseDefineShape(TAG*tag, SHAPE2*shape) +{ + int num = 0, id; + U16 fill,line; + SHAPELINE*l; + if(tag->id == ST_DEFINESHAPE) + num = 1; + else if(tag->id == ST_DEFINESHAPE2) + num = 2; + else if(tag->id == ST_DEFINESHAPE3) + num = 3; + else if(tag->id == ST_DEFINESHAPE4) + num = 4; + else { + fprintf(stderr, "parseDefineShape must be called with a shape tag"); + } + swf_SetTagPos(tag, 0); + + id = swf_GetU16(tag); //id + memset(shape, 0, sizeof(SHAPE2)); + shape->bbox = (SRECT*)rfx_alloc(sizeof(SRECT)); + swf_GetRect(tag, shape->bbox); + if(num>=4) { + SRECT r2; + swf_ResetReadBits(tag); + swf_GetRect(tag, &r2); // edge bounds + U8 flags = swf_GetU8(tag); // flags, &1: contains scaling stroke, &2: contains non-scaling stroke + } + + if(!parseFillStyleArray(tag, shape)) { + return; + } + + swf_ResetReadBits(tag); + fill = (U16)swf_GetBits(tag,4); + line = (U16)swf_GetBits(tag,4); + if(!fill && !line) { + fprintf(stderr, "fill/line bits are both zero\n"); + } + + shape->lines = swf_ParseShapeData(&tag->data[tag->pos], (tag->len - tag->pos)*8, fill, line, num, shape); + + l = shape->lines; +} + +static void free_lines(SHAPELINE* lines) +{ + if (lines->next) + free_lines(lines->next); + free(lines); +} + +void swf_RecodeShapeData(U8*data, int bitlen, int in_bits_fill, int in_bits_line, + U8**destdata, U32*destbitlen, int out_bits_fill, int out_bits_line) +{ + SHAPE2 s2; + SHAPE s; + SHAPELINE*line; + memset(&s2, 0, sizeof(s2)); + s2.lines = swf_ParseShapeData(data, bitlen, in_bits_fill, in_bits_line, 1, 0); + s2.numfillstyles = out_bits_fill?1<<(out_bits_fill-1):0; + s2.numlinestyles = out_bits_line?1<<(out_bits_line-1):0; + s2.fillstyles = (FILLSTYLE*)rfx_calloc(sizeof(FILLSTYLE)*s2.numfillstyles); + s2.linestyles = (LINESTYLE*)rfx_calloc(sizeof(LINESTYLE)*s2.numlinestyles); + + line = s2.lines; + while(line) { + if(line->fillstyle0 > s2.numfillstyles) line->fillstyle0 = 0; + if(line->fillstyle1 > s2.numfillstyles) line->fillstyle1 = 0; + if(line->linestyle > s2.numlinestyles) line->linestyle = 0; + line = line->next; + } + + swf_Shape2ToShape(&s2,&s); + + free_lines(s2.lines); + free(s2.fillstyles); + free(s2.linestyles); + free(s.fillstyle.data); + free(s.linestyle.data); + *destdata = s.data; + *destbitlen = s.bitlen; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c new file mode 100644 index 000000000..d76baec51 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c @@ -0,0 +1,333 @@ +/* swfaction.c + + SWF Sound handling routines + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001, 2002 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef NO_MP3 + +#include "../rfxswf.h" + +#ifdef BLADEENC +#define HAVE_SOUND + +CodecInitOut * init = 0; +void swf_SetSoundStreamHead(TAG*tag, U16 avgnumsamples) +{ + U8 playbackrate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit + U8 playbacktype = 0; // 0 = mono, 1 = stereo + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser + U8 rate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = 0; // 0 = mono, 1 = stereo + + CodecInitIn params; + memset(¶ms, 0, sizeof(params)); + params.frequency = 44100; //48000, 44100 or 32000 + params.mode = 3; //0 = Stereo, 2 = Dual Channel, 3 = Mono + params.emphasis = 0; //0 = None, 1 = 50/15 microsec, 3 = CCITT J.17 + params.bitrate = 128; //default is 128 (64 for mono) + init = codecInit(¶ms); + + swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); + swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); + swf_SetU16(tag,avgnumsamples); + + printf("numSamples:%d\n",init->nSamples); + printf("bufferSize:%d\n",init->bufferSize); +} + +void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int numsamples, char first) +{ + char*buf; + int len = 0; + + buf = rfx_alloc(init->bufferSize); + if(!buf) + return; + + len = codecEncodeChunk (numsamples, samples, buf); + len += codecFlush (&buf[len]); + len += codecExit (&buf[len]); + + if(first) { + swf_SetU16(tag, numsamples); // number of samples + swf_SetU16(tag, 0); // seek + } + swf_SetBlock(tag, buf, len); + rfx_free(buf); +} +#endif + +void swf_SetSoundDefineRaw(TAG*tag, S16*samples, int numsamples) +{ + swf_SetU8(tag,(/*compression*/0<<4)|(/*rate*/3<<2)|(/*size*/1<<1)|/*mono*/0); + swf_SetU32(tag, numsamples); // 44100 -> 11025 + swf_SetBlock(tag, (U8*)samples, numsamples*2); +} + +/* TODO: find a better way to set these from the outside */ + +int swf_mp3_in_samplerate = 44100; +int swf_mp3_out_samplerate = 11025; +int swf_mp3_channels = 1; +int swf_mp3_bitrate = 32; + +#ifdef HAVE_LAME +#define HAVE_SOUND + +#include +#include + +static lame_global_flags*lame_flags; + +void null_errorf(const char *format, va_list ap) +{ +} + +static void initlame() +{ + unsigned char buf[4096]; + int bufsize = 1152*2; + + lame_flags = lame_init(); + + lame_set_in_samplerate(lame_flags, swf_mp3_in_samplerate); + lame_set_num_channels(lame_flags, swf_mp3_channels); + lame_set_scale(lame_flags, 0); + + // MPEG1 32, 44.1, 48khz + // MPEG2 16, 22.05, 24 + // MPEG2.5 8, 11.025, 12 + lame_set_out_samplerate(lame_flags, swf_mp3_out_samplerate); + + lame_set_quality(lame_flags, 0); + lame_set_mode(lame_flags, MONO/*3*/); + lame_set_brate(lame_flags, swf_mp3_bitrate); + //lame_set_compression_ratio(lame_flags, 11.025); + lame_set_bWriteVbrTag(lame_flags, 0); + + lame_init_params(lame_flags); + lame_init_bitstream(lame_flags); + + lame_set_errorf(lame_flags, null_errorf); + /* The first two flush calls to lame always fail, for + some reason. Do them here where they cause no damage. */ + lame_encode_flush_nogap(lame_flags, buf, bufsize); + //printf("init:flush_nogap():%d\n", len); + lame_encode_flush(lame_flags, buf, bufsize); + //printf("init:flush():%d\n", len); + lame_set_errorf(lame_flags, 0); +} + +void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples) +{ + int len; + + U8 playbackrate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit + U8 playbacktype = 0; // 0 = mono, 1 = stereo + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser + U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = 0; // 0 = mono, 1 = stereo + + if(swf_mp3_out_samplerate == 5512) playbackrate = rate = 0; // lame doesn't support this + else if(swf_mp3_out_samplerate == 11025) playbackrate = rate = 1; + else if(swf_mp3_out_samplerate == 22050) playbackrate = rate = 2; + else if(swf_mp3_out_samplerate == 44100) playbackrate = rate = 3; + else fprintf(stderr, "Invalid samplerate: %d\n", swf_mp3_out_samplerate); + + initlame(); + + swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); + swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); + swf_SetU16(tag,avgnumsamples); +} + +void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int seek, char first) +{ + char*buf; + int len = 0; + int bufsize = 16384; + int numsamples = (int)(((swf_mp3_out_samplerate > 22050) ? 1152 : 576) * ((double)swf_mp3_in_samplerate/swf_mp3_out_samplerate)); + int fs = 0; + + buf = rfx_alloc(bufsize); + if(!buf) + return; + + if(first) { + fs = lame_get_framesize(lame_flags); + swf_SetU16(tag, fs * first); // samples per mp3 frame + swf_SetU16(tag, seek); // seek + } + + len += lame_encode_buffer(lame_flags, samples, samples, numsamples, &buf[len], bufsize-len); + len += lame_encode_flush_nogap(lame_flags, &buf[len], bufsize-len); + swf_SetBlock(tag, buf, len); + if(len == 0) { + fprintf(stderr, "error: mp3 empty block, %d samples, first:%d, framesize:%d\n", + numsamples, first, fs); + }/* else { + fprintf(stderr, "ok: mp3 nonempty block, %d samples, first:%d, framesize:%d\n", + numsamples, first, fs); + }*/ + rfx_free(buf); +} + +void swf_SetSoundStreamEnd(TAG*tag) +{ + lame_close (lame_flags); +} + +void swf_SetSoundDefine(TAG*tag, S16*samples, int num) +{ + char*buf; + int oldlen=0,len = 0; + int bufsize = 16384; + int blocksize = (int)(((swf_mp3_out_samplerate > 22050) ? 1152 : 576) * ((double)swf_mp3_in_samplerate/swf_mp3_out_samplerate)); + int t; + int blocks; + + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser + U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = 0; // 0 = mono, 1 = stereo + + if(swf_mp3_out_samplerate == 5512) rate = 0; + else if(swf_mp3_out_samplerate == 11025) rate = 1; + else if(swf_mp3_out_samplerate == 22050) rate = 2; + else if(swf_mp3_out_samplerate == 44100) rate = 3; + else fprintf(stderr, "Invalid samplerate: %d\n", swf_mp3_out_samplerate); + + blocks = num / (blocksize); + + swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); + + swf_SetU32(tag, (int)(tag,blocks*blocksize / + ((double)swf_mp3_in_samplerate/swf_mp3_out_samplerate)) // account for resampling + ); + + buf = rfx_alloc(bufsize); + if(!buf) + return; + + initlame(); + + swf_SetU16(tag, 0); //delayseek + for(t=0;tstop?SOUNDINFO_STOP:0) + |(info->nomultiple?SOUNDINFO_NOMULTIPLE:0) + |(info->envelopes?SOUNDINFO_HASENVELOPE:0) + |(info->loops?SOUNDINFO_HASLOOPS:0) + |(info->outpoint?SOUNDINFO_HASOUTPOINT:0) + |(info->inpoint?SOUNDINFO_HASINPOINT:0); + swf_SetU8(tag, flags); + if(flags&SOUNDINFO_HASINPOINT) + swf_SetU32(tag, info->inpoint); + if(flags&SOUNDINFO_HASOUTPOINT) + swf_SetU32(tag, info->outpoint); + if(flags&SOUNDINFO_HASLOOPS) + swf_SetU16(tag, info->loops); + if(flags&SOUNDINFO_HASENVELOPE) { + int t; + swf_SetU8(tag, info->envelopes); + for(t=0;tenvelopes;t++) { + swf_SetU32(tag, info->pos[t]); + swf_SetU16(tag, info->left[t]); + swf_SetU16(tag, info->right[t]); + } + } +} + + +void swf_SetSoundDefineMP3(TAG*tag, U8* data, unsigned length, + unsigned SampRate, + unsigned Channels, + unsigned NumFrames) +{ + U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser + U8 rate; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz + U8 size = 1; // 0 = 8 bit, 1 = 16 bit + U8 type = Channels==2; // 0=mono, 1=stereo + + rate = (SampRate >= 40000) ? 3 + : (SampRate >= 19000) ? 2 + : (SampRate >= 8000) ? 1 + : 0; + + swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); + + swf_SetU32(tag, NumFrames * 576); + + swf_SetU16(tag, 0); //delayseek + swf_SetBlock(tag, data, length); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c new file mode 100644 index 000000000..62546db2a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c @@ -0,0 +1,2162 @@ +/* swftext.c + + Text and font routines + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + Copyright (c) 2003,2004,2005,2006,2007,2008,2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "../rfxswf.h" + +U32 readUTF8char(U8 ** text) +{ + U32 c = 0; + if (!(*(*text) & 0x80)) + return *((*text)++); + + /* 0000 0080-0000 07FF 110xxxxx 10xxxxxx */ + if (((*text)[0] & 0xe0) == 0xc0 && (*text)[1]) { + c = ((*text)[0] & 0x1f) << 6 | ((*text)[1] & 0x3f); + (*text) += 2; + return c; + } + /* 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx */ + if (((*text)[0] & 0xf0) == 0xe0 && (*text)[1] && (*text)[2]) { + c = ((*text)[0] & 0x0f) << 12 | ((*text)[1] & 0x3f) << 6 | ((*text)[2] & 0x3f); + (*text) += 3; + return c; + } + /* 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (((*text)[0] & 0xf8) == 0xf0 && (*text)[1] && (*text)[2] + && (*text)[3]) { + c = ((*text)[0] & 0x07) << 18 | ((*text)[1] & 0x3f) << 12 | ((*text)[2] & 0x3f) << 6 | ((*text)[3] & 0x3f); + (*text) += 4; + return c; + } + /* 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (((*text)[0] & 0xfc) == 0xf8 && (*text)[1] && (*text)[2] + && (*text)[3] + && (*text)[4]) { + c = ((*text)[0] & 0x03) << 24 | ((*text)[1] & 0x3f) << 18 | ((*text)[2] & 0x3f) << 12 | ((*text)[3] & 0x3f) << 6 | ((*text)[4] & 0x3f); + (*text) += 5; + return c; + } + /* 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx */ + if (((*text)[0] & 0xfe) == 0xfc && (*text)[1] && (*text)[2] + && (*text)[3] + && (*text)[4] && (*text)[5]) { + c = ((*text)[0] & 0x01) << 30 | ((*text)[1] & 0x3f) << 24 | + ((*text)[2] & 0x3f) << 18 | ((*text)[3] & 0x3f) << 12 | ((*text)[4] & 0x3f) << 6 | ((*text)[5] & 0x3f) << 6; + (*text) += 6; + return c; + } + return *((*text)++); +} + +#define TF_TEXTCONTROL 0x80 +#define TF_HASFONT 0x08 +#define TF_HASCOLOR 0x04 +#define TF_HASYOFFSET 0x02 +#define TF_HASXOFFSET 0x01 + +#define FF_WIDECODES 0x01 +#define FF_BOLD 0x02 +#define FF_ITALIC 0x04 +#define FF_ANSI 0x08 +#define FF_SHIFTJIS 0x10 +#define FF_UNICODE 0x20 + +#define FF2_BOLD 0x01 +#define FF2_ITALIC 0x02 +#define FF2_WIDECODES 0x04 +#define FF2_WIDEOFFSETS 0x08 +#define FF2_ANSI 0x10 +#define FF2_UNICODE 0x20 +#define FF2_SHIFTJIS 0x40 +#define FF2_LAYOUT 0x80 + +int swf_FontIsItalic(SWFFONT * f) +{ + return f->style & FONT_STYLE_ITALIC; +} + +int swf_FontIsBold(SWFFONT * f) +{ + return f->style & FONT_STYLE_BOLD; +} + +static const int WRITEFONTID = 0x4e46; // font id for WriteFont and ReadFont + +int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*self) +{ + int n; + TAG *t; + if (!swf) + return -1; + t = swf->firstTag; + n = 0; + + while (t) { + if (swf_isFontTag(t)) { + n++; + if (FontCallback) { + U16 id; + int l; + U8 s[257]; + s[0] = 0; + swf_SetTagPos(t, 0); + + id = swf_GetU16(t); + if (swf_GetTagID(t) == ST_DEFINEFONT2 || swf_GetTagID(t) == ST_DEFINEFONTINFO || swf_GetTagID(t) == ST_DEFINEFONTINFO2) { + swf_GetU16(t); + l = swf_GetU8(t); + swf_GetBlock(t, s, l); + s[l] = 0; + } + + (FontCallback) (self, id, s); + } + } + t = swf_NextTag(t); + } + return n; +} + +int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t) +{ + U16 fid; + swf_SetTagPos(t, 0); + + fid = swf_GetU16(t); + if ((!id) || (id == fid)) { + U16 of; + int n, i; + + id = fid; + f->version = 1; + f->id = fid; + + of = swf_GetU16(t); + n = of / 2; + f->numchars = n; + f->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH) * n); + + for (i = 1; i < n; i++) + swf_GetU16(t); + for (i = 0; i < n; i++) + swf_GetSimpleShape(t, &f->glyph[i].shape); + } + return id; +} + +int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t) +{ + U16 fid; + U16 maxcode; + U8 flags; + swf_SetTagPos(t, 0); + + fid = swf_GetU16(t); + if (fid == id) { + U8 l = swf_GetU8(t); + int i; + + if (f->version > 1) { + /* Especially with Flash MX, DefineFont2 may have FontInfo fields, + too. However, they only add little information to what's already + inside the DefineFont2 tag */ + return id; + } + + if (f->name) + rfx_free(f->name); + + f->name = (U8 *) rfx_alloc(l + 1); + swf_GetBlock(t, f->name, l); + f->name[l] = 0; + + flags = swf_GetU8(t); + if (flags & 2) + f->style |= FONT_STYLE_BOLD; + if (flags & 4) + f->style |= FONT_STYLE_ITALIC; + if (flags & 8) + f->encoding |= FONT_ENCODING_ANSI; + if (flags & 16) + f->encoding |= FONT_ENCODING_SHIFTJIS; + if (flags & 32) + f->encoding |= FONT_ENCODING_UNICODE; + + if (t->id == ST_DEFINEFONTINFO2) { + f->language = swf_GetU8(t); + } + + f->glyph2ascii = (U16 *) rfx_alloc(sizeof(U16) * f->numchars); + maxcode = 0; + for (i = 0; i < f->numchars; i++) { + f->glyph2ascii[i] = ((flags & FF_WIDECODES) ? swf_GetU16(t) : swf_GetU8(t)); + if (f->glyph2ascii[i] > maxcode) + maxcode = f->glyph2ascii[i]; + } + maxcode++; + if (maxcode < 256) + maxcode = 256; + f->maxascii = maxcode; + f->ascii2glyph = (int *) rfx_alloc(sizeof(int) * maxcode); + memset(f->ascii2glyph, -1, sizeof(int) * maxcode); + + for (i = 0; i < f->numchars; i++) + f->ascii2glyph[f->glyph2ascii[i]] = i; + } + return id; +} + +int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag) +{ + U16 fid; + swf_SetTagPos(tag, 0); + + fid = swf_GetU16(tag); + + if (fid == id) { + int num = swf_GetU16(tag); + int t; + f->glyphnames = (char**)rfx_alloc(sizeof(char *) * num); + for (t = 0; t < num; t++) { + f->glyphnames[t] = strdup(swf_GetString(tag)); + } + } + return id; +} + + +int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) +{ + int t, glyphcount; + int maxcode; + int fid; + U32 offset_start; + U32 *offset; + U8 flags1, langcode, namelen; + swf_SetTagPos(tag, 0); + font->version = tag->id==ST_DEFINEFONT3?3:2; + fid = swf_GetU16(tag); + if (id && id != fid) + return id; + font->id = fid; + flags1 = swf_GetU8(tag); + langcode = swf_GetU8(tag); //reserved flags + + if (flags1 & 1) + font->style |= FONT_STYLE_BOLD; + if (flags1 & 2) + font->style |= FONT_STYLE_ITALIC; + if (flags1 & 16) + font->encoding |= FONT_ENCODING_ANSI; + if (flags1 & 32) + font->encoding |= FONT_ENCODING_UNICODE; + if (flags1 & 64) + font->encoding |= FONT_ENCODING_SHIFTJIS; + + namelen = swf_GetU8(tag); + font->name = (U8 *) rfx_alloc(namelen + 1); + font->name[namelen] = 0; + swf_GetBlock(tag, font->name, namelen); + glyphcount = swf_GetU16(tag); + font->numchars = glyphcount; + + font->glyph = (SWFGLYPH *) rfx_calloc(sizeof(SWFGLYPH) * glyphcount); + font->glyph2ascii = (U16 *) rfx_calloc(sizeof(U16) * glyphcount); + + offset = (U32*)rfx_calloc(sizeof(U32)*(glyphcount+1)); + offset_start = tag->pos; + + if (flags1 & 8) { // wide offsets + for (t = 0; t < glyphcount; t++) + offset[t] = swf_GetU32(tag); //offset[t] + + if (glyphcount) /* this _if_ is not in the specs */ + offset[glyphcount] = swf_GetU32(tag); // fontcodeoffset + else + offset[glyphcount] = tag->pos; + } else { + for (t = 0; t < glyphcount; t++) + offset[t] = swf_GetU16(tag); //offset[t] + + if (glyphcount) /* this _if_ is not in the specs */ + offset[glyphcount] = swf_GetU16(tag); // fontcodeoffset + else + offset[glyphcount] = tag->pos; + } + for (t = 0; t < glyphcount; t++) { + swf_SetTagPos(tag, offset[t]+offset_start); + swf_GetSimpleShape(tag, &(font->glyph[t].shape)); + } + + if(glyphcount) + swf_SetTagPos(tag, offset[glyphcount]+offset_start); + + free(offset); + + maxcode = 0; + for (t = 0; t < glyphcount; t++) { + int code; + if (flags1 & 4) // wide codes (always on for definefont3) + code = swf_GetU16(tag); + else + code = swf_GetU8(tag); + font->glyph2ascii[t] = code; + if (code > maxcode) + maxcode = code; + } + maxcode++; + if (maxcode < 256) + maxcode = 256; + font->maxascii = maxcode; + font->ascii2glyph = (int *) rfx_alloc(sizeof(int) * maxcode); + memset(font->ascii2glyph, -1, sizeof(int) * maxcode); + for (t = 0; t < glyphcount; t++) { + font->ascii2glyph[font->glyph2ascii[t]] = t; + } + + if (flags1 & 128) { // has layout + U16 kerningcount; + font->layout = (SWFLAYOUT *) rfx_alloc(sizeof(SWFLAYOUT)); + font->layout->ascent = swf_GetU16(tag); + font->layout->descent = swf_GetU16(tag); + font->layout->leading = swf_GetU16(tag); + for (t = 0; t < glyphcount; t++) { + S16 advance = swf_GetS16(tag); + font->glyph[t].advance = advance; + } + font->layout->bounds = (SRECT*)rfx_alloc(glyphcount * sizeof(SRECT)); + for (t = 0; t < glyphcount; t++) { + swf_ResetReadBits(tag); + swf_GetRect(tag, &font->layout->bounds[t]); + SRECT b = font->layout->bounds[t]; + if((b.xmin|b.xmax|b.ymin|b.ymax) == 0) { + // recalculate bounding box + SHAPE2 *shape2 = swf_ShapeToShape2(font->glyph[t].shape); + font->layout->bounds[t] = swf_GetShapeBoundingBox(shape2); + swf_Shape2Free(shape2);free(shape2); + } + } + + kerningcount = swf_GetU16(tag); + font->layout->kerningcount = kerningcount; + + font->layout->kerning = (SWFKERNING *) rfx_alloc(sizeof(SWFKERNING) * kerningcount); + if (kerningcount) { + font->layout->kerning = (SWFKERNING*)rfx_alloc(sizeof(*font->layout->kerning) * kerningcount); + for (t = 0; t < kerningcount; t++) { + if (flags1 & 4) { // wide codes + font->layout->kerning[t].char1 = swf_GetU16(tag); + font->layout->kerning[t].char2 = swf_GetU16(tag); + } else { + font->layout->kerning[t].char1 = swf_GetU8(tag); + font->layout->kerning[t].char2 = swf_GetU8(tag); + } + font->layout->kerning[t].adjustment = swf_GetS16(tag); + } + } + } + return font->id; +} + +int swf_FontExtract_DefineFontAlignZones(int id, SWFFONT * font, TAG * tag) +{ + U16 fid; + swf_SetTagPos(tag, 0); + fid = swf_GetU16(tag); + + if (fid == id) { + font->alignzone_flags = swf_GetU8(tag); + font->alignzones = rfx_calloc(sizeof(ALIGNZONE)*font->numchars); + int i=0; + while(tag->pos < tag->len) { + if(i>=font->numchars) + break; + int nr = swf_GetU8(tag); // should be 2 + if(nr!=1 && nr!=2) { + fprintf(stderr, "rfxswf: Can't parse alignzone tags with %d zones", nr); + break; + } + U16 x = swf_GetU16(tag); + U16 y = swf_GetU16(tag); + U16 dx = (nr==2)?swf_GetU16(tag):0xffff; + U16 dy = (nr==2)?swf_GetU16(tag):0xffff; + U8 xy = swf_GetU8(tag); + +#ifdef DEBUG_RFXSWF + if((!(xy&1) && (x!=0 || (dx!=0 && dx!=0xffff))) || + (!(xy&2) && (y!=0 || (dy!=0 && dy!=0xffff)))) { + fprintf(stderr, "Warning: weird combination of alignzone bits and values (%d x:%04x-%04x y:%04x-%04x)\n", xy, + x,dx,y,dy); + } +#endif + if(!(xy&1)) { + x = 0xffff; + dx = 0xffff; + } else if(!(xy&2)) { + y = 0xffff; + dy = 0xffff; + } + font->alignzones[i].x = x; + font->alignzones[i].y = y; + font->alignzones[i].dx = dx; + font->alignzones[i].dy = dy; + i++; + } + } + return id; +} + + +#define FEDTJ_PRINT 0x01 +#define FEDTJ_MODIFY 0x02 +#define FEDTJ_CALLBACK 0x04 + +static int +swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs, + void (*callback) (void *self, + int *chars, int *xpos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA * color), void *self) +{ + U16 cid; + SRECT r; + MATRIX m; + U8 gbits, abits; + int fid = -1; + RGBA color; + int x = 0, y = 0; + int fontsize = 0; + + memset(&color, 0, sizeof(color)); + + swf_SetTagPos(t, 0); + + cid = swf_GetU16(t); + swf_GetRect(t, &r); + swf_GetMatrix(t, &m); + gbits = swf_GetU8(t); + abits = swf_GetU8(t); + + while (1) { + int flags, num; + flags = swf_GetU8(t); + if (!flags) + break; + + if (flags & TF_TEXTCONTROL) { + if (flags & TF_HASFONT) + fid = swf_GetU16(t); + if (flags & TF_HASCOLOR) { + color.r = swf_GetU8(t); // rgb + color.g = swf_GetU8(t); + color.b = swf_GetU8(t); + if (swf_GetTagID(t) == ST_DEFINETEXT2) + color.a = swf_GetU8(t); + else + color.a = 255; + } + if (flags & TF_HASXOFFSET) + x = swf_GetS16(t); + if (flags & TF_HASYOFFSET) + y = swf_GetS16(t); + if (flags & TF_HASFONT) + fontsize = swf_GetU16(t); + } + + num = swf_GetU8(t); + if (!num) + break; + + { + int i; + int buf[256]; + int advance[256]; + int xpos = 0; + for (i = 0; i < num; i++) { + int glyph; + int adv = 0; + advance[i] = xpos; + glyph = swf_GetBits(t, gbits); + adv = swf_GetBits(t, abits); + xpos += adv; + + if (id == fid) { + if (jobs & FEDTJ_PRINT) { + int code = f->glyph2ascii[glyph]; + printf("%lc", code); + } + if (jobs & FEDTJ_MODIFY) + f->glyph[glyph].advance = adv * 20; //? + } + + buf[i] = glyph; + } + if ((id == fid) && (jobs & FEDTJ_PRINT)) + printf("\n"); + if (jobs & FEDTJ_CALLBACK) + callback(self, buf, advance, num, fid, fontsize, x, y, &color); + x += xpos; + } + } + + return id; +} + +int swf_ParseDefineText(TAG * tag, + void (*callback) (void *self, int *chars, int *xpos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA * color), void *self) +{ + return swf_FontExtract_DefineTextCallback(-1, 0, tag, FEDTJ_CALLBACK, callback, self); +} + +int swf_FontExtract_DefineText(int id, SWFFONT * f, TAG * t, int jobs) +{ + return swf_FontExtract_DefineTextCallback(id, f, t, jobs, 0, 0); +} + +typedef struct _usagetmp { + SWFFONT*font; + int lastx,lasty; + int last; +} usagetmp_t; +static void updateusage(void *self, int *chars, int *xpos, int nr, + int fontid, int fontsize, int xstart, int ystart, RGBA * color) +{ + usagetmp_t*u = (usagetmp_t*)self; + if(!u->font->use) { + swf_FontInitUsage(u->font); + } + if(fontid!=u->font->id) + return; + + int t; + for(t=0;tu->font->numchars) + continue; + swf_FontUseGlyph(u->font, c, fontsize); + if(u->lasty == y && x>=u->lastx-200 && abs(u->lastx-x)<200 && + u->last!=c && !swf_ShapeIsEmpty(u->font->glyph[u->last].shape) && + !swf_ShapeIsEmpty(u->font->glyph[c].shape)) + { + swf_FontUsePair(u->font, u->last, c); + } + u->lasty = y; + /* FIXME: do we still need to divide advance by 20 for definefont3? */ + u->lastx = x + (u->font->glyph[c].advance*fontsize/20480); + u->last = c; + } +} + +void swf_FontUpdateUsage(SWFFONT*f, TAG* tag) +{ + usagetmp_t u; + u.font = f; + u.lastx = -0x80000000; + u.lasty = -0x80000000; + u.last = 0; + swf_ParseDefineText(tag, updateusage, &u); +} + +int swf_FontExtract(SWF * swf, int id, SWFFONT * *font) +{ + TAG *t; + SWFFONT *f; + + if ((!swf) || (!font)) + return -1; + + f = (SWFFONT *) rfx_calloc(sizeof(SWFFONT)); + + t = swf->firstTag; + + while (t) { + int nid = 0; + switch (swf_GetTagID(t)) { + case ST_DEFINEFONT: + nid = swf_FontExtract_DefineFont(id, f, t); + break; + + case ST_DEFINEFONT2: + case ST_DEFINEFONT3: + nid = swf_FontExtract_DefineFont2(id, f, t); + break; + + case ST_DEFINEFONTALIGNZONES: + nid = swf_FontExtract_DefineFontAlignZones(id, f, t); + break; + + case ST_DEFINEFONTINFO: + case ST_DEFINEFONTINFO2: + nid = swf_FontExtract_DefineFontInfo(id, f, t); + break; + + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + if(!f->layout) { + nid = swf_FontExtract_DefineText(id, f, t, FEDTJ_MODIFY); + } + if(f->version>=3 && f->layout) + swf_FontUpdateUsage(f, t); + break; + + case ST_GLYPHNAMES: + nid = swf_FontExtract_GlyphNames(id, f, t); + break; + } + if (nid > 0) + id = nid; + t = swf_NextTag(t); + } + if (f->id != id) { + rfx_free(f); + f = 0; + } + font[0] = f; + return 0; +} + +int swf_FontSetID(SWFFONT * f, U16 id) +{ + if (!f) + return -1; + f->id = id; + return 0; +} + +void swf_LayoutFree(SWFLAYOUT * l) +{ + if (l) { + if (l->kerning) + rfx_free(l->kerning); + l->kerning = NULL; + if (l->bounds) + rfx_free(l->bounds); + l->bounds = NULL; + } + rfx_free(l); +} + + +static void font_freeglyphnames(SWFFONT*f) +{ + if (f->glyphnames) + { + int t; + for (t = 0; t < f->numchars; t++) + { + if (f->glyphnames[t]) + { + rfx_free(f->glyphnames[t]); + f->glyphnames[t] = 0; + } + } + rfx_free(f->glyphnames); + f->glyphnames = 0; + } +} +static void font_freeusage(SWFFONT*f) +{ + if (f->use) { + if(f->use->chars) { + rfx_free(f->use->chars);f->use->chars = 0; + } + if(f->use->neighbors) { + rfx_free(f->use->neighbors);f->use->neighbors = 0; + } + if(f->use->neighbors_hash) { + rfx_free(f->use->neighbors_hash);f->use->neighbors_hash = 0; + } + rfx_free(f->use); f->use = 0; + } +} +static void font_freelayout(SWFFONT*f) +{ + if (f->layout) { + swf_LayoutFree(f->layout); + f->layout = 0; + } +} +static void font_freename(SWFFONT*f) +{ + if (f->name) { + rfx_free(f->name); + f->name = 0; + } +} + +int swf_FontReduce_old(SWFFONT * f) +{ + int i, j; + int max_unicode = 0; + if ((!f) || (!f->use) || f->use->is_reduced) + return -1; + + j = 0; + + for (i = 0; i < f->numchars; i++) { + if (f->glyph[i].shape && f->use->chars[i]) { + f->glyph2ascii[j] = f->glyph2ascii[i]; + f->glyph[j] = f->glyph[i]; + f->use->chars[i] = j; + j++; + } else { + f->glyph2ascii[i] = 0; + if(f->glyph[i].shape) { + swf_ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = 0; + f->glyph[i].advance = 0; + } + f->use->chars[i] = -1; + j++; //TODO: remove + } + } + for (i = 0; i < f->maxascii; i++) { + if(f->use->chars[f->ascii2glyph[i]]<0) { + f->ascii2glyph[i] = -1; + } else { + f->ascii2glyph[i] = f->use->chars[f->ascii2glyph[i]]; + max_unicode = i; + } + } + f->maxascii = max_unicode; + f->use->is_reduced = 1; + f->numchars = j; + font_freelayout(f); + font_freeglyphnames(f); + font_freename(f); + return j; +} + +int swf_FontReduce_swfc(SWFFONT * f) +{ + int i, j; + int max_unicode = 0; + if ((!f) || (!f->use) || f->use->is_reduced) + return -1; + + font_freeglyphnames(f); + + j = 0; + for (i = 0; i < f->numchars; i++) { + if (f->glyph[i].shape && f->use->chars[i]) { + f->glyph2ascii[j] = f->glyph2ascii[i]; + if (f->layout) + f->layout->bounds[j] = f->layout->bounds[i]; + f->glyph[j] = f->glyph[i]; + f->use->chars[i] = j; + j++; + } else { + f->glyph2ascii[i] = 0; + if(f->glyph[i].shape) { + swf_ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = 0; + f->glyph[i].advance = 0; + } + f->use->chars[i] = -1; + } + } + f->use->used_glyphs = j; + for (i = 0; i < f->maxascii; i++) { + if(f->ascii2glyph[i] > -1) { + if (f->use->chars[f->ascii2glyph[i]]<0) { + f->use->chars[f->ascii2glyph[i]] = 0; + f->ascii2glyph[i] = -1; + } else { + f->ascii2glyph[i] = f->use->chars[f->ascii2glyph[i]]; + f->use->chars[f->ascii2glyph[i]] = 1; + max_unicode = i + 1; + } + } + } + f->maxascii = max_unicode; + f->use->is_reduced = 1; + f->numchars = j; + font_freename(f); + return j; +} + +int swf_FontReduce(SWFFONT * f) +{ + int i; + int max_unicode = 0; + int max_glyph = 0; + if ((!f) || (!f->use) || f->use->is_reduced) + return -1; + + font_freelayout(f); + font_freeglyphnames(f); + + f->use->used_glyphs= 0; + for (i = 0; i < f->numchars; i++) { + if(!f->use->chars[i]) { + if(f->glyph2ascii) { + f->glyph2ascii[i] = 0; + } + if(f->glyph[i].shape) { + swf_ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = 0; + f->glyph[i].advance = 0; + } +// f->use->used_glyphs++; + } else { + f->use->used_glyphs++; + max_glyph = i+1; + } + } + for (i = 0; i < f->maxascii; i++) { + if(f->ascii2glyph[i] > -1 && !f->use->chars[f->ascii2glyph[i]]) { + if(f->ascii2glyph) { + f->ascii2glyph[i] = -1; + } + } else { + max_unicode = i+1; + } + } + f->maxascii = max_unicode; + f->numchars = max_glyph; + font_freename(f); + return 0; +} + +static SWFFONT* font_to_sort; +int cmp_chars(const void*a, const void*b) +{ + int x = *(const int*)a; + int y = *(const int*)b; + return 0; +} + +void swf_FontSort(SWFFONT * font) +{ + int i, j; + int *newplace; + int *newpos; + if (!font) + return; + + newplace = (int*)rfx_alloc(sizeof(int) * font->numchars); + + for (i = 0; i < font->numchars; i++) { + newplace[i] = i; + } + //qsort(newplace, sizeof(newplace[0]), font->numchars, cmp_chars); + + for (i = 0; i < font->numchars; i++) + for (j = 0; j < i; j++) { + if (font->glyph2ascii[i] < font->glyph2ascii[j]) { + int n1, n2; + char *c1, *c2; + SWFGLYPH g1, g2; + SRECT r1, r2; + n1 = newplace[i]; + n2 = newplace[j]; + newplace[j] = n1; + newplace[i] = n2; + n1 = font->glyph2ascii[i]; + n2 = font->glyph2ascii[j]; + font->glyph2ascii[j] = n1; + font->glyph2ascii[i] = n2; + g1 = font->glyph[i]; + g2 = font->glyph[j]; + font->glyph[j] = g1; + font->glyph[i] = g2; + if (font->glyphnames) { + c1 = font->glyphnames[i]; + c2 = font->glyphnames[j]; + font->glyphnames[j] = c1; + font->glyphnames[i] = c2; + } + if (font->layout) { + r1 = font->layout->bounds[i]; + r2 = font->layout->bounds[j]; + font->layout->bounds[j] = r1; + font->layout->bounds[i] = r2; + } + } + } + newpos = (int*)rfx_alloc(sizeof(int) * font->numchars); + for (i = 0; i < font->numchars; i++) { + newpos[newplace[i]] = i; + } + for (i = 0; i < font->maxascii; i++) { + if (font->ascii2glyph[i] >= 0) + font->ascii2glyph[i] = newpos[font->ascii2glyph[i]]; + } + + rfx_free(newplace); + font->glyph2glyph = newpos; +} + +void swf_FontPrepareForEditText(SWFFONT * font) +{ + if (!font->layout) + swf_FontCreateLayout(font); + swf_FontSort(font); +} + +int swf_FontInitUsage(SWFFONT * f) +{ + if (!f) + return -1; + if(f->use) { + fprintf(stderr, "Usage initialized twice"); + return -1; + } + f->use = (FONTUSAGE*)rfx_calloc(sizeof(FONTUSAGE)); + f->use->smallest_size = 0xffff; + f->use->chars = (int*)rfx_calloc(sizeof(f->use->chars[0]) * f->numchars); + return 0; +} + +void swf_FontClearUsage(SWFFONT * f) +{ + if (!f || !f->use) + return; + rfx_free(f->use->chars); f->use->chars = 0; + rfx_free(f->use); f->use = 0; +} + +int swf_FontUse(SWFFONT * f, U8 * s) +{ + if( (!s)) + return -1; + while (*s) { + if(*s < f->maxascii && f->ascii2glyph[*s]>=0) + swf_FontUseGlyph(f, f->ascii2glyph[*s], /*FIXME*/0xffff); + s++; + } + return 0; +} + +int swf_FontUseUTF8(SWFFONT * f, const U8 * s, U16 size) +{ + if( (!s)) + return -1; + int ascii; + while (*s) + { + ascii = readUTF8char((U8**)&s); + if(ascii < f->maxascii && f->ascii2glyph[ascii]>=0) + swf_FontUseGlyph(f, f->ascii2glyph[ascii], size); + } + return 0; +} + +int swf_FontUseAll(SWFFONT* f) +{ + int i; + + if (!f->use) + swf_FontInitUsage(f); + for (i = 0; i < f->numchars; i++) + f->use->chars[i] = 1; + f->use->used_glyphs = f->numchars; + return 0; +} + +static unsigned hash2(int char1, int char2) +{ + unsigned hash = char1^(char2<<8); + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; +} +static void hashadd(FONTUSAGE*u, int char1, int char2, int nr) +{ + unsigned hash = hash2(char1, char2); + while(1) { + hash = hash%u->neighbors_hash_size; + if(!u->neighbors_hash[hash]) { + u->neighbors_hash[hash] = nr+1; + return; + } + hash++; + } +} +int swf_FontUseGetPair(SWFFONT * f, int char1, int char2) +{ + FONTUSAGE*u = f->use; + if(!u || !u->neighbors_hash_size) + return 0; + unsigned hash = hash2(char1, char2); + while(1) { + hash = hash%u->neighbors_hash_size; + int pos = u->neighbors_hash[hash]; + if(!pos) + return 0; + if(pos && + u->neighbors[pos-1].char1 == char1 && + u->neighbors[pos-1].char2 == char2) { + return pos; + } + hash++; + } + +} +void swf_FontUsePair(SWFFONT * f, int char1, int char2) +{ + if (!f->use) + swf_FontInitUsage(f); + FONTUSAGE*u = f->use; + + if(u->num_neighbors*3 >= u->neighbors_hash_size*2) { + if(u->neighbors_hash) { + free(u->neighbors_hash); + } + u->neighbors_hash_size = u->neighbors_hash_size?u->neighbors_hash_size*2:1024; + u->neighbors_hash = rfx_calloc(u->neighbors_hash_size*sizeof(int)); + int t; + for(t=0;tnum_neighbors;t++) { + hashadd(u, u->neighbors[t].char1, u->neighbors[t].char2, t); + } + } + + int nr = swf_FontUseGetPair(f, char1, char2); + if(!nr) { + if(u->num_neighbors == u->neighbors_size) { + u->neighbors_size += 4096; + u->neighbors = rfx_realloc(u->neighbors, sizeof(SWFGLYPHPAIR)*u->neighbors_size); + } + u->neighbors[u->num_neighbors].char1 = char1; + u->neighbors[u->num_neighbors].char2 = char2; + u->neighbors[u->num_neighbors].num = 1; + hashadd(u, char1, char2, u->num_neighbors); + u->num_neighbors++; + } else { + u->neighbors[nr-1].num++; + } +} + +int swf_FontUseGlyph(SWFFONT * f, int glyph, U16 size) +{ + if (!f->use) + swf_FontInitUsage(f); + if(glyph < 0 || glyph >= f->numchars) + return -1; + if(!f->use->chars[glyph]) + f->use->used_glyphs++; + f->use->chars[glyph] = 1; + if(size && size < f->use->smallest_size) + f->use->smallest_size = size; + return 0; +} + +int swf_FontSetDefine(TAG * t, SWFFONT * f) +{ + U16 *ofs = (U16 *) rfx_alloc(f->numchars * 2); + int p, i, j; + + if ((!t) || (!f)) + return -1; + swf_ResetWriteBits(t); + swf_SetU16(t, f->id); + + p = 0; + j = 0; + for (i = 0; i < f->numchars; i++) + if (f->glyph[i].shape) { + ofs[j++] = p; + p += swf_SetSimpleShape(NULL, f->glyph[i].shape); + } + + for (i = 0; i < j; i++) + swf_SetU16(t, ofs[i] + j * 2); + if (!j) { + fprintf(stderr, "rfxswf: warning: Font is empty\n"); + swf_SetU16(t, 0); + } + + for (i = 0; i < f->numchars; i++) + if (f->glyph[i].shape) + swf_SetSimpleShape(t, f->glyph[i].shape); + + swf_ResetWriteBits(t); + rfx_free(ofs); + return 0; +} + +static inline int fontSize(SWFFONT * font) +{ + int t; + int size = 0; + for (t = 0; t < font->numchars; t++) { + int l = 0; + if(font->glyph[t].shape) + l = (font->glyph[t].shape->bitlen + 7) / 8; + else + l = 8; + size += l + 1; + } + return size + (font->numchars + 1) * 2; +} + +int swf_FontSetDefine2(TAG * tag, SWFFONT * f) +{ + U8 flags = 0; + int t; + int pos; + swf_SetU16(tag, f->id); + + if (f->layout) flags |= 128; // haslayout + if (f->numchars > 256) + flags |= 4; // widecodes + if (f->style & FONT_STYLE_BOLD) + flags |= 1; // bold + if (f->style & FONT_STYLE_ITALIC) + flags |= 2; // italic + if (f->maxascii >= 256) + flags |= 4; //wide codecs + if (fontSize(f) > 65535) + flags |= 8; //wide offsets + flags |= 8 | 4; //FIXME: the above check doesn't work + + if (f->encoding & FONT_ENCODING_ANSI) + flags |= 16; // ansi + if (f->encoding & FONT_ENCODING_UNICODE) + flags |= 32; // unicode + if (f->encoding & FONT_ENCODING_SHIFTJIS) + flags |= 64; // shiftjis + + swf_SetU8(tag, flags); + swf_SetU8(tag, 0); //reserved flags + if (f->name) { + /* font name */ + swf_SetU8(tag, strlen((const char*)f->name)+1); + swf_SetBlock(tag, f->name, strlen((const char*)f->name)+1); + } else { + /* font name (="") */ + swf_SetU8(tag, 1); + swf_SetU8(tag, 0); + } + /* number of glyphs */ + swf_SetU16(tag, f->numchars); + /* font offset table */ + pos = tag->len; + for (t = 0; t <= f->numchars; t++) { + if (flags & 8) + swf_SetU32(tag, /* fontoffset */ 0); /*placeholder */ + else + swf_SetU16(tag, /* fontoffset */ 0); /*placeholder */ + } + + for (t = 0; t <= f->numchars; t++) { + if (flags & 8) { + tag->data[pos + t * 4] = (tag->len - pos); + tag->data[pos + t * 4 + 1] = (tag->len - pos) >> 8; + tag->data[pos + t * 4 + 2] = (tag->len - pos) >> 16; + tag->data[pos + t * 4 + 3] = (tag->len - pos) >> 24; + } else { + if (tag->len - pos > 65535) { + fprintf(stderr, "Internal error: Font too big and WideOffsets flag not set\n"); + exit(1); + } + tag->data[pos + t * 2] = (tag->len - pos); + tag->data[pos + t * 2 + 1] = (tag->len - pos) >> 8; + } + if (t < f->numchars) { + if(f->glyph[t].shape) { + swf_SetSimpleShape(tag, f->glyph[t].shape); + } else { + swf_SetU8(tag, 0); //non-edge(1) + edge flags(5) + } + } + } + + + /* font code table */ + for (t = 0; t < f->numchars; t++) { + if (flags & 4) { /* wide codes */ + if(f->glyph2ascii[t]) { + swf_SetU16(tag, f->glyph2ascii[t]); + } else { + swf_SetU16(tag, 0); + } + } else { + if(f->glyph2ascii[t]) { + swf_SetU8(tag, f->glyph2ascii[t]); + } else { + swf_SetU8(tag, 0); + } + } + } + + if (f->layout) { + swf_SetU16(tag, f->layout->ascent); + swf_SetU16(tag, f->layout->descent); + swf_SetU16(tag, 0); // flash ignores leading + + for (t = 0; t < f->numchars; t++) + swf_SetU16(tag, f->glyph[t].advance); + for (t = 0; t < f->numchars; t++) { + swf_ResetWriteBits(tag); + /* not used by flash, so leave this empty */ + SRECT b = {0,0,0,0}; + swf_SetRect(tag, &b); + } + swf_SetU16(tag, f->layout->kerningcount); + for (t = 0; t < f->layout->kerningcount; t++) { + if (flags & 4) { /* wide codes */ + swf_SetU16(tag, f->layout->kerning[t].char1); + swf_SetU16(tag, f->layout->kerning[t].char2); + } else { + swf_SetU8(tag, f->layout->kerning[t].char1); + swf_SetU8(tag, f->layout->kerning[t].char2); + } + swf_SetU16(tag, f->layout->kerning[t].adjustment); + } + } + return 0; +} + +void swf_FontAddLayout(SWFFONT * f, int ascent, int descent, int leading) +{ + f->layout = (SWFLAYOUT *) rfx_alloc(sizeof(SWFLAYOUT)); + f->layout->ascent = ascent; + f->layout->descent = descent; + f->layout->leading = leading; + f->layout->kerningcount = 0; + f->layout->kerning = 0; + f->layout->bounds = (SRECT *) rfx_calloc(sizeof(SRECT) * f->numchars); +} + +int swf_FontSetInfo(TAG * t, SWFFONT * f) +{ + int l, i; + U8 wide = 0; + U8 flags = 0; + if ((!t) || (!f)) + return -1; + swf_ResetWriteBits(t); + swf_SetU16(t, f->id); + l = f->name ? strlen((const char *)f->name) : 0; + if (l > 255) + l = 255; + swf_SetU8(t, l); + if (l) + swf_SetBlock(t, f->name, l); + if (f->numchars >= 256) + wide = 1; + + if (f->style & FONT_STYLE_BOLD) + flags |= 2; + if (f->style & FONT_STYLE_ITALIC) + flags |= 4; + if (f->style & FONT_ENCODING_ANSI) + flags |= 8; + if (f->style & FONT_ENCODING_SHIFTJIS) + flags |= 16; + if (f->style & FONT_ENCODING_UNICODE) + flags |= 32; + + swf_SetU8(t, (flags & 0xfe) | wide); + + for (i = 0; i < f->numchars; i++) { + if (f->glyph[i].shape) { + int g2a = f->glyph2ascii?f->glyph2ascii[i]:0; + wide ? swf_SetU16(t, g2a) : swf_SetU8(t, g2a); + } + } + + return 0; +} + +int swf_TextPrintDefineText(TAG * t, SWFFONT * f) +{ + int id = swf_GetTagID(t); + if ((id == ST_DEFINETEXT) || (id == ST_DEFINETEXT2)) + swf_FontExtract_DefineText(f->id, f, t, FEDTJ_PRINT); + else + return -1; + return 0; +} + +static void font_freealignzones(SWFFONT * f) +{ + if(f->alignzones) + free(f->alignzones); + f->alignzones = 0; +} + +void swf_FontFree(SWFFONT * f) +{ + int i; + if (!f) + return; + + if (f->glyph) + { + for (i = 0; i < f->numchars; i++) + if (f->glyph[i].shape) + { + swf_ShapeFree(f->glyph[i].shape); + f->glyph[i].shape = NULL; + } + rfx_free(f->glyph); + f->glyph = NULL; + } + if (f->ascii2glyph) + { + rfx_free(f->ascii2glyph); + f->ascii2glyph = NULL; + } + if (f->glyph2ascii) + { + rfx_free(f->glyph2ascii); + f->glyph2ascii = NULL; + } + if (f->glyph2glyph) { + rfx_free(f->glyph2glyph); + f->glyph2glyph = NULL; + } + font_freename(f); + font_freelayout(f); + font_freeglyphnames(f); + font_freeusage(f); + font_freealignzones(f); + + rfx_free(f); +} + +int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int x, int y) +{ + U8 flags; + if (!t) + return -1; + + flags = TF_TEXTCONTROL | (font ? TF_HASFONT : 0) | (color ? TF_HASCOLOR : 0) | (x ? TF_HASXOFFSET : 0) + | (y ? TF_HASYOFFSET : 0); + + swf_SetU8(t, flags); + if (font) + swf_SetU16(t, font->id); + if (color) { + if (swf_GetTagID(t) == ST_DEFINETEXT2) + swf_SetRGBA(t, color); + else + swf_SetRGB(t, color); + } + if (x) { + if(x != SET_TO_ZERO) { + if(x>32767 || x<-32768) + fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", x); + swf_SetS16(t, x); + } else { + swf_SetS16(t, 0); + } + } + if (y) { + if(y != SET_TO_ZERO) { + if(y>32767 || y<-32768) + fprintf(stderr, "Warning: Vertical char position overflow: %d\n", y); + swf_SetS16(t, y); + } else { + swf_SetS16(t, 0); + } + } + if (font) + swf_SetU16(t, size); + + return 0; +} + +static int swf_TextCountBits2(SWFFONT * font, U8 * s, int scale, U8 * gbits, U8 * abits, char *encoding) +{ + U16 g, a; + char utf8 = 0; + if ((!s) || (!font) || ((!gbits) && (!abits)) || (!font->ascii2glyph)) + return -1; + g = a = 0; + + if (!strcmp(encoding, "UTF8")) + utf8 = 1; + else if (!strcmp(encoding, "iso-8859-1")) + utf8 = 0; + else + fprintf(stderr, "Unknown encoding: %s", encoding); + + while (*s) { + int glyph = -1, c; + + if (!utf8) + c = *s++; + else + c = readUTF8char(&s); + + if (c < font->maxascii) + glyph = font->ascii2glyph[c]; + if (glyph >= 0) { + g = swf_CountUBits(glyph, g); + a = swf_CountBits(((((U32) font->glyph[glyph].advance) * scale) / 20) / 100, a); + } + } + + if (gbits) + gbits[0] = (U8) g; + if (abits) + abits[0] = (U8) a; + return 0; +} + +static int swf_TextSetCharRecord2(TAG * t, SWFFONT * font, U8 * s, int scale, U8 gbits, U8 abits, char *encoding) +{ + int l = 0, pos; + char utf8 = 0; + + if ((!t) || (!font) || (!s) || (!font->ascii2glyph)) + return -1; + + if (!strcmp(encoding, "UTF8")) + utf8 = 1; + else if (!strcmp(encoding, "iso-8859-1")) + utf8 = 0; + else + fprintf(stderr, "Unknown encoding: %s", encoding); + + pos = t->len; + swf_SetU8(t, l); //placeholder + + while (*s) { + int g = -1, c; + + if (!utf8) + c = *s++; + else + c = readUTF8char(&s); + + if (c < font->maxascii) + g = font->ascii2glyph[c]; + if (g >= 0) { + swf_SetBits(t, g, gbits); + swf_SetBits(t, ((((U32) font->glyph[g].advance) * scale) / 20) / 100, abits); + l++; + /* We split into 127 characters per text field. + We could do 255, by the (formerly wrong) flash specification, + but some SWF parsing code out there still assumes that char blocks + are at max 127 characters, and it would save only a few bits. + */ + if (l == 0x7f) + break; + } + } + + PUT8(&t->data[pos], l); + + swf_ResetWriteBits(t); + return 0; +} + +int swf_TextCountBits(SWFFONT * font, U8 * s, int scale, U8 * gbits, U8 * abits) +{ + return swf_TextCountBits2(font, s, scale, gbits, abits, "iso-8859-1"); +} + +int swf_TextSetCharRecord(TAG * t, SWFFONT * font, U8 * s, int scale, U8 gbits, U8 abits) +{ + return swf_TextSetCharRecord2(t, font, s, scale, gbits, abits, "iso-8859-1"); +} + +int swf_TextCountBitsUTF8(SWFFONT * font, U8 * s, int scale, U8 * gbits, U8 * abits) +{ + return swf_TextCountBits2(font, s, scale, gbits, abits, "UTF8"); +} + +int swf_TextSetCharRecordUTF8(TAG * t, SWFFONT * font, U8 * s, int scale, U8 gbits, U8 abits) +{ + return swf_TextSetCharRecord2(t, font, s, scale, gbits, abits, "UTF8"); +} + +U32 swf_TextGetWidth(SWFFONT * font, U8 * s, int scale) +{ + U32 res = 0; + + if (font && s) { + while (s[0]) { + int g = -1; + if (*s < font->maxascii) + g = font->ascii2glyph[*s]; + if (g >= 0) + res += font->glyph[g].advance / 20; + s++; + } + if (scale) + res = (res * scale) / 100; + } + return res; +} + +SRECT swf_TextCalculateBBoxUTF8(SWFFONT * font, U8 * s, int scale) +{ + int xpos = 0; + int ypos = 0; + SRECT r; + swf_GetRect(0, &r); + while (*s) { + int c = readUTF8char(&s); + if(c==13 || c==10) { + if(s[0] == 10) { + s++; + } + xpos=0; + ypos+=font->layout->leading; + continue; + } + if (c < font->maxascii) { + int g = font->ascii2glyph[c]; + if (g >= 0) { + SRECT rn = font->layout->bounds[g]; + rn.xmin = (rn.xmin * scale) / 20 / 100 + xpos; + rn.xmax = (rn.xmax * scale) / 20 / 100 + xpos; + rn.ymin = (rn.ymin * scale) / 20 / 100 + ypos; + rn.ymax = (rn.ymax * scale) / 20 / 100 + ypos; + swf_ExpandRect2(&r, &rn); + xpos += (font->glyph[g].advance * scale) / 20 / 100; + } + } + } + return r; +} + + +SWFFONT *swf_ReadFont(const char *filename) +{ + int f; + SWF swf; + if (!filename) + return 0; + f = open(filename, O_RDONLY|O_BINARY); + + if (f < 0 || swf_ReadSWF(f, &swf) < 0) { + fprintf(stderr, "%s is not a valid SWF font file or contains errors.\n", filename); + close(f); + return 0; + } else { + SWFFONT *font; + close(f); + if (swf_FontExtract(&swf, WRITEFONTID, &font) < 0) + return 0; + swf_FreeTags(&swf); + return font; + } +} + +void swf_SetEditText(TAG * tag, U16 flags, SRECT r, const char *text, RGBA * color, int maxlength, U16 font, U16 height, EditTextLayout * layout, const char *variable) +{ + swf_SetRect(tag, &r); + swf_ResetWriteBits(tag); + + flags &= ~(ET_HASTEXT | ET_HASTEXTCOLOR | ET_HASMAXLENGTH | ET_HASFONT | ET_HASLAYOUT); + if (text) + flags |= ET_HASTEXT; + if (color) + flags |= ET_HASTEXTCOLOR; + if (maxlength) + flags |= ET_HASMAXLENGTH; + if (font) + flags |= ET_HASFONT; + if (layout) + flags |= ET_HASLAYOUT; + + swf_SetBits(tag, flags, 16); + + if (flags & ET_HASFONT) { + swf_SetU16(tag, font); //font + swf_SetU16(tag, height); //fontheight + } + if (flags & ET_HASTEXTCOLOR) { + swf_SetRGBA(tag, color); + } + if (flags & ET_HASMAXLENGTH) { + swf_SetU16(tag, maxlength); //maxlength + } + if (flags & ET_HASLAYOUT) { + swf_SetU8(tag, layout->align); //align + swf_SetU16(tag, layout->leftmargin); //left margin + swf_SetU16(tag, layout->rightmargin); //right margin + swf_SetU16(tag, layout->indent); //indent + swf_SetU16(tag, layout->leading); //leading + } + swf_SetString(tag, variable); + if (flags & ET_HASTEXT) + swf_SetString(tag, text); +} + +SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, const char *text, int scale) +{ + SRECT r; + U8 gbits, abits; + U8 *utext = (U8 *) strdup(text); + U8 *upos = utext; + int x = 0, y = 0; + int pos = 0; + int ystep = 0; + if (font->layout) { + r = swf_TextCalculateBBoxUTF8(font, (U8*)text, scale * 20); + ystep = font->layout->leading; + } else { + fprintf(stderr, "No layout information- can't compute text bbox accurately"); + /* Hm, without layout information, we can't compute a bounding + box. We could call swf_FontCreateLayout to create a layout, + but the caller probably doesn't want us to mess up his font + structure. + */ + r.xmin = r.ymin = 0; + r.xmax = r.ymax = 1024 * 20; + ystep = 100; + } + + swf_SetRect(tag, &r); + + /* The text matrix is pretty boring, as it doesn't apply to + individual characters, but rather whole text objects (or + at least whole char records- haven't tested). + So it can't do anything which we can't already do with + the placeobject tag we use for placing the text on the scene. + */ + swf_SetMatrix(tag, 0); + + swf_TextCountBitsUTF8(font, (U8*)text, scale * 20, &gbits, &abits); + swf_SetU8(tag, gbits); + swf_SetU8(tag, abits); + + while(*upos) { + U8*next = upos; + int count = 0; + + swf_TextSetInfoRecord(tag, font, (scale * 1024) / 100, rgb, x, y); //scale + x = 0; + + while(*next && *next!=13 && *next!=10 && count<127) { + readUTF8char(&next); + count++; + } + if(next[0] == 13 || next[0] == 10) { + x = SET_TO_ZERO; + y += ystep; + } + + if(next[0] == 13 && next[1] == 10) + next++; + + if(next[0] == 13 || next[0] == 10) { + *next = 0; + next++; + } + + /* now set the text params- notice that a font size of + 1024 (or 1024*20 for definefont3) means that the glyphs will + be displayed exactly as they would be in/with a defineshape. + This is not documented in the specs. + */ + + /* set the actual text- notice that we just pass our scale + parameter over, as TextSetCharRecord calculates with + percent, too */ + swf_TextSetCharRecordUTF8(tag, font, upos, scale * 20, gbits, abits); + + upos= next; + } + free(utext); + + swf_SetU8(tag, 0); + return r; +} + +void swf_FontCreateLayout(SWFFONT * f) +{ + S16 leading = 0; + int t; + if (f->layout) + return; + if (!f->numchars) + return; + + f->layout = (SWFLAYOUT *) rfx_calloc(sizeof(SWFLAYOUT)); + f->layout->bounds = (SRECT *) rfx_alloc(f->numchars * sizeof(SRECT)); + f->layout->ascent = 0; + f->layout->descent = 0; + + for (t = 0; t < f->numchars; t++) { + SHAPE2 *shape2; + SRECT bbox; + int width; + shape2 = swf_ShapeToShape2(f->glyph[t].shape); + if (!shape2) { + fprintf(stderr, "Shape parse error\n"); + exit(1); + } + bbox = swf_GetShapeBoundingBox(shape2); + swf_Shape2Free(shape2); + f->layout->bounds[t] = bbox; + + width = (bbox.xmax); + + /* The following is a heuristic- it may be that extractfont_DefineText + has already found out some widths for individual characters (from the way + they are used)- we now have to guess whether that width might be possible, + which is the case if it isn't either much too big or much too small */ + if (width > f->glyph[t].advance * 3 / 2 || width < f->glyph[t].advance / 2) + f->glyph[t].advance = width; + + if (-bbox.ymin > f->layout->ascent) + f->layout->ascent = -bbox.ymin; + if (bbox.ymax > f->layout->descent) + f->layout->descent = bbox.ymax; + } +} + +void swf_DrawText(drawer_t * draw, SWFFONT * font, int size, const char *text) +{ + U8 *s = (U8 *) text; + int advance = 0; + while (*s) { + SHAPE *shape; + SHAPE2 *shape2; + SHAPELINE *l; + U32 c = readUTF8char(&s); + int g = font->ascii2glyph[c]; + shape = font->glyph[g].shape; + if (((int) g) < 0) { + fprintf(stderr, "No char %d in font %s\n", c, font->name ? (char *) font->name : "?"); + continue; + } + shape2 = swf_ShapeToShape2(shape); + l = shape2->lines; + while (l) { + if (l->type == moveTo) { + FPOINT to; + to.x = l->x * size / 100.0 / 20.0 + advance; + to.y = l->y * size / 100.0 / 20.0; + draw->moveTo(draw, &to); + } else if (l->type == lineTo) { + FPOINT to; + to.x = l->x * size / 100.0 / 20.0 + advance; + to.y = l->y * size / 100.0 / 20.0; + draw->lineTo(draw, &to); + } else if (l->type == splineTo) { + FPOINT mid, to; + mid.x = l->sx * size / 100.0 / 20.0 + advance; + mid.y = l->sy * size / 100.0 / 20.0; + to.x = l->x * size / 100.0 / 20.0 + advance; + to.y = l->y * size / 100.0 / 20.0; + draw->splineTo(draw, &mid, &to); + } + l = l->next; + } + swf_Shape2Free(shape2); + advance += font->glyph[g].advance * size / 100.0 / 20.0; + } +} + +void swf_WriteFont_AS3(SWFFONT * font, char *filename) +{ + if(!font->layout) + swf_FontCreateLayout(font); + + SWF swf; + memset(&swf, 0, sizeof(SWF)); + swf.fileVersion = 9; + swf.frameRate = 0x4000; + swf.movieSize.xmax = 200; + swf.movieSize.ymax = 200; + + if(!font->id) font->id=1; + + TAG *tag; + swf.firstTag = tag = swf_InsertTag(tag, ST_DEFINEFONT3); + swf_FontSetDefine2(tag, font); + + char*name = font->name?(char*)font->name:"font"; + + tag = swf_InsertTag(tag, ST_NAMECHARACTER); + swf_SetU16(tag, font->id); + swf_SetString(tag, name); + tag = swf_InsertTag(tag, ST_EXPORTASSETS); + swf_SetU16(tag, 1); + swf_SetU16(tag, font->id); + swf_SetString(tag, name); + tag = swf_AddAS3FontDefine(tag, font->id, (char*)font->name); + + tag = swf_InsertTag(tag, ST_END); + swf_SaveSWF(&swf, filename); + swf_FreeTags(&swf); +} + +void swf_WriteFont(SWFFONT * font, char *filename) +{ + if(!font->layout) + swf_FontCreateLayout(font); + + char viewer = 1; + U16 id = 1; + U16 depth = 1; + + font->id = id++; + + SWF swf; + memset(&swf, 0, sizeof(SWF)); + swf.fileVersion = 8; + swf.frameRate = 0x4000; + swf.movieSize.xmax = 1024*20; + swf.movieSize.ymax = 768*20; + + TAG *tag; + swf.firstTag = tag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); + swf_SetU8(tag, 0xe0);swf_SetU8(tag, 0xe0);swf_SetU8(tag, 0xff); + + tag = swf_InsertTag(tag, ST_DEFINEFONT3); + swf_FontSetDefine2(tag, font); + + if(font->glyphnames) { + int c; + tag = swf_InsertTag(tag, ST_GLYPHNAMES); + swf_SetU16(tag, font->id); + swf_SetU16(tag, font->numchars); + for (c = 0; c < font->numchars; c++) { + if (font->glyphnames[c]) + swf_SetString(tag, font->glyphnames[c]); + else + swf_SetString(tag, ""); + } + } + + if(viewer) + { + RGBA white = {255,255,255,255}; + RGBA black = {255,0,0,0}; + RGBA gray50 = {255,128,128,128}; + RGBA green = {255,0,255,0}; + int t; + SCOORD miny = SCOORD_MAX; + SCOORD maxy = SCOORD_MIN; + double width = 0; + U16 max_advance = 0; + char*flags = rfx_calloc(font->numchars); + double*xmin = rfx_calloc(sizeof(double)*(font->numchars+1)); + double*xmax = rfx_calloc(sizeof(double)*(font->numchars+1)); + int*xpos = rfx_calloc(sizeof(int)*(font->numchars+1)); + for(t=0;tnumchars;t++) { + SHAPE*s = font->glyph[t].shape; + SHAPE2*s2 = swf_ShapeToShape2(s); + SRECT r = swf_GetShapeBoundingBox(s2); + + // inside a definefont3, everything is 20x the resolution: + double rx1 = r.xmin / 20.0; + double ry1 = r.ymin / 20.0; + double rx2 = r.xmax / 20.0; + double ry2 = r.ymax / 20.0; + + xmin[t]= rx1; + xmax[t]= rx2; + + if(ry1maxy) {maxy=ry2;} + swf_Shape2Free(s2);free(s2); + width += font->glyph[t].advance; + if(font->glyph[t].advance>max_advance) + max_advance = font->glyph[t].advance; + } + + if(miny==SCOORD_MAX) miny=maxy=0; + if(miny==maxy) maxy=miny+1; + + /* scale the font so that it's 256 pixels high */ + double scale = (int)((256.0*1024.0/(maxy-miny))*20.0); + double overlarge_factor; + int fontsize; + if(scale > 32767) { + fontsize = 32767; + overlarge_factor = scale / 32767.0; + } else { + fontsize = scale; + overlarge_factor = 1.0; + } + + int textid = id++; + int spriteid = id++; + SRECT r; + r.xmin = 0; + r.ymin = miny*fontsize/1024; + r.xmax = width*fontsize/20480; + r.ymax = maxy*fontsize/1024; + tag = swf_InsertTag(tag, ST_DEFINETEXT); + swf_SetU16(tag, textid); + swf_SetRect(tag, &r); + swf_SetMatrix(tag, NULL); + + U8 abits = 15; + U8 gbits = swf_CountBits(font->numchars, 0); + swf_SetU8(tag, gbits); + swf_SetU8(tag, abits); + + RGBA rgb = {255,0,0,0}; + + swf_TextSetInfoRecord(tag, font, fontsize, &rgb, SET_TO_ZERO, SET_TO_ZERO); + ActionTAG*array = 0; + double x=0; + array = action_PushString(array, "xpos"); + for(t=0;tnumchars;t++) { + swf_SetU8(tag, 1); + int width = abs((xmax[t] - xmin[t+1])*fontsize/1024) + 60; + array = action_PushInt(array, x/20 +(xmin[t]*scale/1024)/20); + x += width * overlarge_factor; + swf_SetBits(tag, t, gbits); + swf_SetBits(tag, width, abits); + swf_SetU8(tag, 128); + } + array = action_PushInt(array, x/20); + array = action_PushInt(array, font->numchars+1); + array = action_InitArray(array); + array = action_SetVariable(array); + swf_SetU8(tag, 0); + + if(font->layout) { + tag = swf_InsertTag(tag, ST_DEFINESHAPE2); + SHAPE* s; + swf_ShapeNew(&s); + int ls = swf_ShapeAddLineStyle(s,20,&white); + int shapeid = id++; + swf_SetU16(tag,shapeid); + SRECT r; + r.xmin = 0; + r.xmax = 1024*20; + r.ymin = 0; + r.ymax = 256*20; + swf_SetRect(tag,&r); + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,ls,0,0); + + /* Ç and  are good chars to test ascent/descent extend */ + int y1 = (-font->layout->ascent-miny*20.0)*256.0/(maxy-miny); + int y2 = (font->layout->descent-miny*20.0)*256.0/(maxy-miny); + + swf_ShapeSetMove(tag,s,0,y1); + swf_ShapeSetLine(tag,s,width,0); + swf_ShapeSetMove(tag,s,0,y2); + swf_ShapeSetLine(tag,s,width,0); + + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, shapeid, depth++, NULL, NULL, NULL); + } + + /* shapes */ + + for(t=0;tnumchars;t++) { + tag = swf_InsertTag(tag, ST_DEFINESHAPE2); + SHAPE* s; + swf_ShapeNew(&s); + int ls = swf_ShapeAddLineStyle(s,20*2,&black); + int ls2 = swf_ShapeAddLineStyle(s,20*2,&green); + int fs = swf_ShapeAddSolidFillStyle(s, &gray50); + int shapeid = id++; + swf_SetU16(tag,shapeid); + SRECT r; + r.xmin = 0; + r.xmax = 1024*20; + r.ymin = 0; + r.ymax = 512*20; + swf_SetRect(tag,&r); + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,ls,fs,0); + SHAPE2*s2 = swf_ShapeToShape2(font->glyph[t].shape); + SHAPELINE*l = s2->lines; + int lastx=0,lasty=0; + + double x1 = (1024*20 - (xmax[t] - xmin[t])*20*2*scale/20480.0)/2; + double y1 = -miny*20*scale*2/20480.0; + double scalex = scale*2/20480.0; + double scaley = scale*2/20480.0; + + while(l) { + int lx = (l->x)*scalex+x1; + int ly = (l->y)*scaley+y1; + int sx = (l->sx)*scalex+x1; + int sy = (l->sy)*scaley+y1; + if(l->type == moveTo) { + swf_ShapeSetMove(tag,s,lx,ly); + } else if(l->type == lineTo) { + swf_ShapeSetLine(tag,s,lx-lastx,ly-lasty); + } else if(l->type == splineTo) { + swf_ShapeSetCurve(tag,s,sx-lastx,sy-lasty,lx-sx,ly-sy); + } + lastx = lx; + lasty = ly; + l = l->next; + } + + if(font->alignzones) { + ALIGNZONE*zone = &font->alignzones[t]; + swf_ShapeSetAll(tag,s,0,0,ls2,SET_TO_ZERO,SET_TO_ZERO); + if((zone->x&zone->dx)!=0xffff) { + double x = F16toFloat(zone->x)*20480.0*scalex+x1; + double dx = (F16toFloat(zone->x)+F16toFloat(zone->dx))*20480.0*scalex+x1; + swf_ShapeSetMove(tag,s,x,0); + swf_ShapeSetLine(tag,s,0,1024*20); + swf_ShapeSetMove(tag,s,dx,0); + swf_ShapeSetLine(tag,s,0,1024*20); + } + if((zone->y&zone->dy)!=0xffff) { + double y = -F16toFloat(zone->y)*20480.0*scaley+y1; + double dy = -(F16toFloat(zone->y)+F16toFloat(zone->dy))*20480.0*scaley+y1; + swf_ShapeSetMove(tag,s,0,y); + swf_ShapeSetLine(tag,s,1024*20,0); + swf_ShapeSetMove(tag,s,0,dy); + swf_ShapeSetLine(tag,s,1024*20,0); + } + } + + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); + + tag = swf_InsertTag(tag, ST_DEFINESPRITE); + U16 spriteid=id++; + swf_SetU16(tag, spriteid); + swf_SetU16(tag, 1); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, shapeid, 1, NULL, NULL, NULL); + tag = swf_InsertTag(tag, ST_END); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + MATRIX m; + swf_GetMatrix(0, &m); + m.ty = 20000; + char txt[80]; + sprintf(txt, "char%d", font->numchars-t); + swf_ObjectPlace(tag, spriteid, depth++, &m, NULL, txt); + } + + /* marker */ + tag = swf_InsertTag(tag, ST_DEFINESHAPE2); + int shapeid=id++; + RGBA blue = {0xff,0xc0,0xc0,0xff}; + swf_ShapeSetRectangle(tag, shapeid, 20, 20, &blue); + tag = swf_InsertTag(tag, ST_DEFINESPRITE); + U16 spriteid2=id++; + swf_SetU16(tag, spriteid2); + swf_SetU16(tag, 1); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, shapeid, 1, NULL, NULL, NULL); + tag = swf_InsertTag(tag, ST_END); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, spriteid2, depth++, NULL, NULL, "marker"); + + /* textbar */ + tag = swf_InsertTag(tag, ST_DEFINESPRITE); + swf_SetU16(tag, spriteid); + swf_SetU16(tag, 1); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + MATRIX m; + swf_GetMatrix(0, &m); + m.sx = 65536 * overlarge_factor; + m.sy = 65536 * overlarge_factor; + m.tx = 0; + m.ty = -miny*256*20/(maxy-miny); + swf_ObjectPlace(tag, textid, 1, &m, NULL, NULL); + tag = swf_InsertTag(tag, ST_END); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, spriteid, depth++, NULL, NULL, "textbar"); + + /* marker2 */ + RGBA blue2 = {0x80,0x80,0xff,0x80}; + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); + int shapeid2=id++; + swf_ShapeSetRectangleWithBorder(tag, shapeid2, 20, 20, &blue2, 0, &white); + tag = swf_InsertTag(tag, ST_DEFINESPRITE); + U16 spriteid3=id++; + swf_SetU16(tag, spriteid3); + swf_SetU16(tag, 1); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, shapeid2, 1, NULL, NULL, NULL); + tag = swf_InsertTag(tag, ST_END); + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_ObjectPlace(tag, spriteid3, depth++, NULL, NULL, "marker2"); + + +char*data = +" var mouseListener = new Object();" +" var speed = 0;" +" var myx = 0;" +" var currentMouseOver, currentChar;" +" mouseListener.onMouseDown = function() { " +" eval(\"_root.char\"+currentChar)._y = 20000;" +" currentChar = currentMouseOver;" +" var i = currentMouseOver;" +" eval(\"_root.char\"+i)._y = 256;" +" _root.marker2._yscale=256*100;" +" _root.marker2._xscale=(xpos[i-1]-xpos[i])*100;" +" _root.marker2._x=xpos[i]+myx;" +" };" +" mouseListener.onMouseMove = function() { " +" if(_ymouse<256) {" +" speed = Math.abs(_xmouse-512)>256?(512-_xmouse)/8:0;" +" } else {" +" speed = 0;" +" }; " +" }; " +" setInterval( function(){ " +" if(_ymouse<256) {" +" var i, x=_xmouse-_root.textbar._x;" +" for(i=xpos.length-1;i>0;i--) {" +" if(x0) {" +" speed=0;" +" } else if(myx+speed<-xpos[0]+1024) {" +" speed=0;" +" }" +" myx+=speed;" +" _root.textbar._x = myx;" +" _root.marker._x += speed;" +" _root.marker2._x += speed;" +" }, 20);" +" Mouse.addListener(mouseListener);" +; + ActionTAG* atag = swf_ActionCompile(data, 6); + + tag = swf_InsertTag(tag, ST_DOACTION); + swf_ActionSet(tag, array); + swf_ActionSet(tag, atag); + swf_SetU8(tag, 0); + swf_ActionFree(atag); + + tag = swf_InsertTag(tag, ST_SHOWFRAME); + + free(flags); + free(xmin); + free(xmax); + } + + tag = swf_InsertTag(tag, ST_END); + + swf.compressed = -1; + swf_SaveSWF(&swf, filename); + swf_FreeTags(&swf); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c new file mode 100644 index 000000000..6baecd105 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c @@ -0,0 +1,1388 @@ +/* swftools.c + + Math and matrix functions, misc tools + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +// Matrix & Math tools for SWF files + +#include "../rfxswf.h" + +#define S64 long long +SFIXED RFXSWF_SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2) +{ S64 a = ((S64)a1*(S64)b1+(S64)a2*(S64)b2)>>16; + SFIXED result = (SFIXED)(a); + if(a!=result) + fprintf(stderr, "Warning: overflow in matrix multiplication\n"); + return result; +} +SFIXED RFXSWF_QFIX(int zaehler,int nenner) // bildet Quotient von zwei INTs in SFIXED +{ S64 z = zaehler<<16; + S64 a = z/(S64)nenner; + return (SFIXED)a; +} +#undef S64 + +MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2) +{ + if (!d) return NULL; + if (!s1) return (s2)?(MATRIX *)memcpy(d,s2,sizeof(MATRIX)):NULL; + if (!s2) return (MATRIX *)memcpy(d,s1,sizeof(MATRIX)); + + d->tx = s1->tx + RFXSWF_SP(s1->sx,s1->r1,s2->tx,s2->ty); + d->ty = s1->ty + RFXSWF_SP(s1->r0,s1->sy,s2->tx,s2->ty); + + d->sx = RFXSWF_SP(s1->sx,s1->r1,s2->sx,s2->r0); + d->r0 = RFXSWF_SP(s1->r0,s1->sy,s2->sx,s2->r0); + + d->r1 = RFXSWF_SP(s1->sx,s1->r1,s2->r1,s2->sy); + d->sy = RFXSWF_SP(s1->r0,s1->sy,s2->r1,s2->sy); + + //DumpMatrix(NULL,d); + + return d; +} + +MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy,int x0,int y0, + int x1,int y1,int x2,int y2) +{ int dx1 = x1 - x0; + int dy1 = y1 - y0; + int dx2 = x2 - x0; + int dy2 = y2 - y0; + + if (!m) return NULL; + if ((!dx)||(!dy)) return NULL; // check DIV by zero + + m->tx = x0; + m->ty = y0; + m->sx = RFXSWF_QFIX(dx1,dx); + m->sy = RFXSWF_QFIX(dy2,dy); + m->r0 = RFXSWF_QFIX(dy1,dx); + m->r1 = RFXSWF_QFIX(dx2,dy); + + return m; +} + +void swf_SetDefineID(TAG * tag, U16 newid) +{ + int oldlen = tag->len; + tag->len = 0; + swf_SetU16(tag, newid); /* set defining ID */ + tag->len = oldlen; +} + +U16 swf_GetDefineID(TAG * t) +// up to SWF 4.0 +{ U32 oldTagPos; + U16 id = 0; + + oldTagPos = swf_GetTagPos(t); + swf_SetTagPos(t,0); + + switch (swf_GetTagID(t)) + { case ST_DEFINESHAPE: + case ST_DEFINESHAPE2: + case ST_DEFINESHAPE3: + case ST_DEFINESHAPE4: + case ST_DEFINEMORPHSHAPE: + case ST_DEFINEMORPHSHAPE2: + case ST_DEFINEEDITTEXT: + case ST_DEFINEBITS: + case ST_DEFINEBITSJPEG2: + case ST_DEFINEBITSJPEG3: + case ST_DEFINEBITSLOSSLESS: + case ST_DEFINEBITSLOSSLESS2: + case ST_DEFINESCALINGGRID: //pseudodefine + case ST_DEFINEBUTTON: + case ST_DEFINEBUTTON2: + case ST_DEFINEBUTTONCXFORM: //pseudodefine + case ST_DEFINEBUTTONSOUND: //pseudodefine + case ST_CSMTEXTSETTINGS: //pseudodefine + case ST_DEFINEFONT: + case ST_DEFINEFONT2: + case ST_DEFINEFONT3: + case ST_DEFINEFONTINFO: //pseudodefine + case ST_DEFINEFONTINFO2: //pseudodefine + case ST_DEFINEFONTALIGNZONES: //pseudodefine + case ST_DEFINEFONTNAME: //pseudodefine + case ST_DEFINETEXT: + case ST_DEFINEBINARY: + case ST_DEFINETEXT2: + case ST_DEFINESOUND: + case ST_DEFINESPRITE: + case ST_DEFINEMOVIE: + case ST_DEFINEVIDEOSTREAM: + case ST_GLYPHNAMES: //pseudodefine + case ST_VIDEOFRAME: //pseudodefine + case ST_NAMECHARACTER: //pseudodefine + case ST_DOINITACTION: //pseudodefine + id = swf_GetU16(t); + break; + default: + fprintf(stderr, "rfxswf: Error: tag %d (%s) has no id\n", t->id, swf_TagGetName(t)); + } + + swf_SetTagPos(t,oldTagPos); + + return id; +} + +SRECT swf_GetDefineBBox(TAG * t) +{ + U32 oldTagPos; + U16 id = 0; + SRECT b1,b2; + memset(&b1, 0, sizeof(b1)); + + oldTagPos = swf_GetTagPos(t); + swf_SetTagPos(t,0); + + swf_GetRect(0, &b1); + + switch (swf_GetTagID(t)) + { case ST_DEFINESHAPE: + case ST_DEFINESHAPE2: + case ST_DEFINESHAPE3: + case ST_DEFINESHAPE4: + case ST_DEFINEEDITTEXT: + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + case ST_DEFINEVIDEOSTREAM: + id = swf_GetU16(t); + swf_GetRect(t, &b1); + break; + case ST_DEFINEMORPHSHAPE: + id = swf_GetU16(t); + swf_GetRect(t, &b1); + swf_GetRect(t, &b2); + swf_ExpandRect2(&b1, &b2); + break; + case ST_DEFINEBITSLOSSLESS: + case ST_DEFINEBITSLOSSLESS2: + case ST_DEFINEBITS: + case ST_DEFINEBITSJPEG2: + case ST_DEFINEBITSJPEG3: + // FIXME + break; + } + + swf_SetTagPos(t,oldTagPos); + + return b1; +} + +U16 swf_GetPlaceID(TAG * t) +// up to SWF 4.0 +{ U32 oldTagPos; + U16 id = 0; + + oldTagPos = swf_GetTagPos(t); + swf_SetTagPos(t,0); + + switch (swf_GetTagID(t)) + { case ST_PLACEOBJECT: + case ST_REMOVEOBJECT: + case ST_FREECHARACTER: + case ST_STARTSOUND: + id = swf_GetU16(t); + break; + + case ST_PLACEOBJECT2: + { U8 flags = swf_GetU8(t); + U16 d = swf_GetU16(t); + id = (flags&PF_CHAR)?swf_GetU16(t):id; + } break; + case ST_PLACEOBJECT3: + { U8 flags = swf_GetU8(t); + U8 flags2 = swf_GetU8(t); + U16 d = swf_GetU16(t); + id = (flags&PF_CHAR)?swf_GetU16(t):id; + } break; + + } + + swf_SetTagPos(t,oldTagPos); + + return id; +} + +static int swf_definingtagids[] = +{ST_DEFINESHAPE, + ST_DEFINESHAPE2, + ST_DEFINESHAPE3, + ST_DEFINESHAPE4, + ST_DEFINEMORPHSHAPE, + ST_DEFINEMORPHSHAPE2, + ST_DEFINEFONT, + ST_DEFINEFONT2, + ST_DEFINEFONT3, + ST_DEFINETEXT, + ST_DEFINETEXT2, + ST_DEFINEEDITTEXT, + ST_DEFINEBITS, + ST_DEFINEBITSJPEG2, + ST_DEFINEBITSJPEG3, + ST_DEFINEBITSLOSSLESS, + ST_DEFINEBITSLOSSLESS2, + ST_DEFINEMOVIE, + ST_DEFINESPRITE, + ST_DEFINEBUTTON, + ST_DEFINEBUTTON2, + ST_DEFINESOUND, + ST_DEFINEVIDEOSTREAM, + ST_DEFINEBINARY, + -1 +}; + +// tags which may be used inside a sprite definition +static int swf_spritetagids[] = +{ST_SHOWFRAME, + ST_PLACEOBJECT, + ST_PLACEOBJECT2, + ST_PLACEOBJECT3, + ST_REMOVEOBJECT, + ST_REMOVEOBJECT2, + ST_DOACTION, + ST_DOABC, + ST_STARTSOUND, + ST_FRAMELABEL, + ST_SOUNDSTREAMHEAD, + ST_SOUNDSTREAMHEAD2, + ST_SOUNDSTREAMBLOCK, + ST_END, + -1 +}; + +/* tags which add content or information to a character with a given ID */ +static int swf_pseudodefiningtagids[] = +{ + ST_DEFINEFONTINFO, + ST_DEFINEFONTINFO2, + ST_DEFINEFONTALIGNZONES, + ST_DEFINEFONTNAME, + ST_DEFINEBUTTONCXFORM, + ST_DEFINEBUTTONSOUND, + ST_DEFINESCALINGGRID, + ST_CSMTEXTSETTINGS, + ST_NAMECHARACTER, + ST_DOINITACTION, + ST_VIDEOFRAME, + ST_GLYPHNAMES, + -1 +}; + +U8 swf_isAllowedSpriteTag(TAG * tag) +{ + int id = tag->id; + int t=0; + while(swf_spritetagids[t]>=0) + { + if(swf_spritetagids[t] == id) + return 1; + t++; + } + return 0; +} + +U8 swf_isDefiningTag(TAG * tag) +{ + int id = tag->id; + int t=0; + while(swf_definingtagids[t]>=0) + { + if(swf_definingtagids[t] == id) + return 1; + t++; + } + return 0; +} + +U8 swf_isPseudoDefiningTag(TAG * tag) +{ + int id = tag->id; + int t=0; + while(swf_pseudodefiningtagids[t]>=0) + { + if(swf_pseudodefiningtagids[t] == id) + return 1; + t++; + } + return 0; +} + +int swf_GetDepth(TAG * t) +{ + int depth = -1; + U32 oldTagPos; + oldTagPos = swf_GetTagPos(t); + swf_SetTagPos(t,0); + + switch (swf_GetTagID(t)) + { case ST_PLACEOBJECT: + case ST_REMOVEOBJECT: + swf_GetU16(t); //id + depth = swf_GetU16(t); + break; + case ST_REMOVEOBJECT2: + depth = swf_GetU16(t); + break; + case ST_PLACEOBJECT2: + { U8 flags = swf_GetU8(t); + depth = swf_GetU16(t); + } break; + case ST_PLACEOBJECT3: + { U8 flags = swf_GetU8(t); + U8 flags2 = swf_GetU8(t); + depth = swf_GetU16(t); + } break; + case ST_SETTABINDEX: + { + depth = swf_GetU16(t); + } + } + swf_SetTagPos(t,oldTagPos); + return depth; +} + +void swf_SetDepth(TAG * t, U16 depth) +{ + switch (swf_GetTagID(t)) + { case ST_PLACEOBJECT: + case ST_REMOVEOBJECT: + PUT16(t->data, depth); + break; + case ST_REMOVEOBJECT2: + PUT16(t->data, depth); + break; + case ST_PLACEOBJECT2: + PUT16(&t->data[1], depth); + break; + case ST_SETTABINDEX: + PUT16(t->data, depth); + break; + default: + fprintf(stderr, "rfxswf: Error: tag %d has no depth\n", t->id); + } +} + +char* swf_GetName(TAG * t) +{ + char* name = 0; + U32 oldTagPos; + MATRIX m; + CXFORM c; + oldTagPos = swf_GetTagPos(t); + swf_SetTagPos(t,0); + switch(swf_GetTagID(t)) + { + case ST_FRAMELABEL: + name = (char*)&t->data[swf_GetTagPos(t)]; + break; + case ST_PLACEOBJECT3: + case ST_PLACEOBJECT2: { + U8 flags = swf_GetU8(t); + if(t->id == ST_PLACEOBJECT3) + swf_GetU8(t); + swf_GetU16(t); //depth; + if(flags&PF_CHAR) + swf_GetU16(t); //id + if(flags&PF_MATRIX) + swf_GetMatrix(t, &m); + if(flags&PF_CXFORM) + swf_GetCXForm(t, &c, 1); + if(flags&PF_RATIO) + swf_GetU16(t); + if(flags&PF_CLIPDEPTH) + swf_GetU16(t); + if(flags&PF_NAME) { + swf_ResetReadBits(t); + name = (char*)&t->data[swf_GetTagPos(t)]; + } + } + break; + } + swf_SetTagPos(t,oldTagPos); + return name; +} + +/* used in enumerateUsedIDs */ +void swf_GetMorphGradient(TAG * tag, GRADIENT * gradient1, GRADIENT * gradient2) +{ + int t; + int num = swf_GetU8(tag) & 15; + if(gradient1) gradient1->num = num; + if(gradient2) gradient2->num = num; + + if(gradient1) { + gradient1->num = num; + gradient1->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient1->num); + gradient1->ratios = (U8*)rfx_calloc(sizeof(gradient1->ratios[0])*gradient1->num); + } + if(gradient2) { + gradient2->num = num; + gradient2->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient2->num); + gradient2->ratios = (U8*)rfx_calloc(sizeof(gradient2->ratios[0])*gradient2->num); + } + for(t=0;tratios[t] = ratio; + gradient1->rgba[t] = color; + } + + ratio = swf_GetU8(tag); + swf_GetRGBA(tag, &color); + if(gradient2) { + gradient2->ratios[t] = ratio; + gradient2->rgba[t] = color; + } + } +} + +#define DEBUG_ENUMERATE if(0) +//#define DEBUG_ENUMERATE + +void enumerateUsedIDs_fillstyle(TAG * tag, int t, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) +{ + int type; + type = swf_GetU8(tag); //type + DEBUG_ENUMERATE printf("fill style %d) type=%02x (tagpos=%d)\n", t, type, tag->pos); + if(type == 0) { + RGBA color; + if(num >= 3) + {swf_GetRGBA(tag, &color);if(morph) swf_GetRGBA(tag, NULL);} + else + {swf_GetRGB(tag, &color);if(morph) swf_GetRGB(tag, NULL);} + DEBUG_ENUMERATE printf(" %02x%02x%02x%02x\n", color.r,color.g,color.b,color.a); + } + else if(type == 0x10 || type == 0x12 || type == 0x13) + { + swf_ResetReadBits(tag); + MATRIX m; + swf_GetMatrix(tag, &m); + DEBUG_ENUMERATE swf_DumpMatrix(stdout, &m); + if(morph) { + swf_GetMatrix(tag, &m); + DEBUG_ENUMERATE swf_DumpMatrix(stdout, &m); + } + swf_ResetReadBits(tag); + if(morph) { + swf_GetMorphGradient(tag, NULL, NULL); + if(type == 0x13) { + swf_GetU16(tag); + swf_GetU16(tag); + } + } else { + GRADIENT g; + swf_GetGradient(tag, &g, /*alpha*/ num>=3?1:0); + DEBUG_ENUMERATE swf_DumpGradient(stdout, &g); + if(type == 0x13) + swf_GetU16(tag); + } + } + else if(type == 0x40 || type == 0x41 || type == 0x42 || type == 0x43) + { + swf_ResetReadBits(tag); + if(tag->data[tag->pos] != 0xff || + tag->data[tag->pos+1] != 0xff) + (callback)(tag, tag->pos, callback_data); + + swf_GetU16(tag); + swf_ResetReadBits(tag); + swf_GetMatrix(tag, NULL); + if(morph) + swf_GetMatrix(tag, NULL); + } + else { + fprintf(stderr, "rfxswf:swftools.c Unknown fillstyle:0x%02x in tag %02d\n",type, tag->id); + } +} + +void enumerateUsedIDs_linestyle(TAG * tag, int t, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) +{ + U16 width; + RGBA color; + width = swf_GetU16(tag); + char fill=0; + if(morph) + swf_GetU16(tag); + if(num >= 4) { + U16 flags = swf_GetU16(tag); + DEBUG_ENUMERATE printf("line style %d) flags: %08x\n", t, flags); + if((flags & 0x30) == 0x20) { + U16 miter = swf_GetU16(tag); // miter limit + DEBUG_ENUMERATE printf("line style %d) miter join: %08x\n", t, miter); + } + if(flags & 0x08) { + fill = 1; + } + } + if(!fill) { + if(num >= 3) + {swf_GetRGBA(tag, &color);if(morph) swf_GetRGBA(tag, NULL);} + else + {swf_GetRGB(tag, &color);if(morph) swf_GetRGB(tag, NULL);} + } else { + enumerateUsedIDs_fillstyle(tag, t, callback, callback_data, num, morph); + } + DEBUG_ENUMERATE printf("line style %d) width=%.2f color=%02x%02x%02x%02x \n", t, width/20.0, color.r,color.g,color.b,color.a); +} + +void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) +{ + U16 count; + int t; + count = swf_GetU8(tag); + if(count == 0xff && num>1) // defineshape2,3,4 only + count = swf_GetU16(tag); + + DEBUG_ENUMERATE printf("%d fill styles\n", count); + for(t=0;tpos = 0; + switch(tag->id) + { + case ST_DEFINEBUTTONSOUND: { + int t; + callback(tag, tag->pos + base, callback_data); + swf_GetU16(tag); //button id + for(t=0;t<4;t++) { + int flags; + callback(tag, tag->pos + base, callback_data); + U16 sound_id = swf_GetU16(tag); //sound id + if(!sound_id) + continue; + flags = swf_GetU8(tag); + if(flags&1) + swf_GetU32(tag); // in point + if(flags&2) + swf_GetU32(tag); // out points + if(flags&4) + swf_GetU16(tag); // loop count + if(flags&8) + { + int npoints = swf_GetU8(tag); + int s; + for(s=0;spos + base, callback_data); //button id + break; + + case ST_SYMBOLCLASS: + case ST_EXPORTASSETS: { + int num = swf_GetU16(tag); + int t; + for(t=0;tpos + base, callback_data); //button id + swf_GetU16(tag); //id + while(swf_GetU8(tag)); //name + } + } break; + + case ST_IMPORTASSETS: + case ST_IMPORTASSETS2: { + swf_GetString(tag); //count + swf_GetU8(tag); //reserved + swf_GetU8(tag); //reserved + int num = swf_GetU16(tag); //url + int t; + for(t=0;tpos + base, callback_data); //button id + swf_GetU16(tag); //id + while(swf_GetU8(tag)); //name + } + } break; + + case ST_DOABC: + case ST_RAWABC: + break; + + case ST_FREECHARACTER: /* unusual tags, which all start with an ID */ + case ST_NAMECHARACTER: + case ST_DEFINEFONTNAME: + case ST_GENERATORTEXT: + callback(tag, tag->pos + base, callback_data); + break; + case ST_PLACEOBJECT: + callback(tag, tag->pos + base, callback_data); + break; + case ST_PLACEOBJECT2: + // only if placeflaghascharacter + if(!(tag->data[0]&2)) + break; + callback(tag, 3 + base, callback_data); + break; + case ST_PLACEOBJECT3: + // only if placeflaghascharacter + if(!(tag->data[0]&2)) + break; + callback(tag, 4 + base, callback_data); + break; + case ST_REMOVEOBJECT: + callback(tag, tag->pos + base, callback_data); + break; + case ST_STARTSOUND: + callback(tag, tag->pos + base, callback_data); + break; + case ST_DEFINESPRITE: { + if(tag->len <= 4) + break; // sprite is expanded + + swf_GetU16(tag); // id + swf_GetU16(tag); // framenum + + while(1) { + U16 flags = swf_GetU16(tag); + U32 len; + U16 id = flags>>6; + TAG *tag2 = swf_InsertTag(NULL, id); + len = flags&0x3f; + if(len == 63) + len = swf_GetU32(tag); + if(id == ST_END) + break; + tag2->len = tag2->memsize = len; + tag2->data = (U8*)rfx_alloc(len); + memcpy(tag2->data, &tag->data[tag->pos], len); + /* I never saw recursive sprites, but they are (theoretically) + possible, so better add base here again */ + enumerateUsedIDs(tag2, tag->pos + base, callback, callback_data); + swf_DeleteTag(0, tag2); + swf_GetBlock(tag, NULL, len); + } + } + break; + case ST_DEFINEBUTTON2: // has some font ids in the button records + num++; + //fallthrough + case ST_DEFINEBUTTON: { + swf_GetU16(tag); //button id + if(num>1) + { + int offset; + swf_GetU8(tag); //flag + offset = swf_GetU16(tag); //offset + } + while(1) + { + U8 flags = swf_GetU8(tag); + if(!flags) //flags + break; + callback(tag, tag->pos + base, callback_data); + swf_GetU16(tag); //char + swf_GetU16(tag); //layer + swf_ResetReadBits(tag); + swf_GetMatrix(tag, NULL); + if(num>1) { + swf_ResetReadBits(tag); + swf_GetCXForm(tag, NULL, 1); + } + if(flags&0x10) { + U8 num = swf_GetU8(tag); + int t; + for(t=0;tpos + base, callback_data); + } + break; + case ST_DEFINETEXT2: + num ++; + case ST_DEFINETEXT: { + int glyphbits, advancebits; + int id; + id = swf_GetU16(tag); //id + swf_GetRect(tag, NULL); //bounding box + swf_ResetReadBits(tag); + swf_GetMatrix(tag, NULL); //matrix + swf_ResetReadBits(tag); + glyphbits = swf_GetU8(tag); //glyphbits + advancebits = swf_GetU8(tag); //advancebits + while(1) { + U16 flags; + int t; + swf_ResetReadBits(tag); + flags = swf_GetBits(tag, 8); + if(!flags) break; + + swf_ResetReadBits(tag); + if(flags & 8) { // hasfont + callback(tag, tag->pos + base, callback_data); + id = swf_GetU16(tag); + } + if(flags & 4) { // hascolor + if(num==1) swf_GetRGB(tag, NULL); + else swf_GetRGBA(tag, NULL); + } + if(flags & 2) { //has x offset + swf_ResetReadBits(tag); + swf_GetU16(tag); + } + if(flags & 1) { //has y offset + swf_ResetReadBits(tag); + swf_GetU16(tag); + } + if(flags & 8) { //has height + swf_ResetReadBits(tag); + swf_GetU16(tag); + } + + flags = swf_GetBits(tag, 8); + if(!flags) break; + swf_ResetReadBits(tag); + for(t=0;tpos + base, callback_data); + break; + case ST_DEFINEVIDEOSTREAM: + break; + + case ST_DOINITACTION: + callback(tag, tag->pos + base, callback_data); + break; + + case ST_DEFINEMORPHSHAPE2: + case ST_DEFINESHAPE4: + num++; + case ST_DEFINEMORPHSHAPE: + case ST_DEFINESHAPE3: + num++; //fallthrough + case ST_DEFINESHAPE2: + num++; //fallthrough + case ST_DEFINESHAPE: { + int fillbits; + int linebits; + int id; + int numshapes = 1; + int morph = 0; + if(tag->id == ST_DEFINEMORPHSHAPE || tag->id==ST_DEFINEMORPHSHAPE2) { + numshapes = 2; + morph = 1; + } + + id = swf_GetU16(tag); // id; + SRECT r={0,0,0,0},r2={0,0,0,0}; + swf_GetRect(tag, &r); // shape bounds + if(morph) { + swf_ResetReadBits(tag); + swf_GetRect(tag, NULL); // shape bounds2 + if(num>=4) { + swf_ResetReadBits(tag); + swf_GetRect(tag, NULL); // edge bounds1 + } + } + if(num>=4) { + swf_ResetReadBits(tag); + swf_GetRect(tag, &r2); // edge bounds + U8 flags = swf_GetU8(tag); // flags, &1: contains scaling stroke, &2: contains non-scaling stroke + DEBUG_ENUMERATE printf("flags: %02x (1=scaling strokes, 2=non-scaling strokes)\n", flags); + } + if(morph) { + swf_GetU32(tag); //offset to endedges + } + + DEBUG_ENUMERATE printf("Tag:%d Name:%s ID:%d\n", tag->id, swf_TagGetName(tag), id); + DEBUG_ENUMERATE printf("BBox %.2f %.2f %.2f %.2f\n", r.xmin/20.0,r.ymin/20.0,r.xmax/20.0,r.ymax/20.0); + DEBUG_ENUMERATE printf("BBox %.2f %.2f %.2f %.2f\n", r2.xmin/20.0,r2.ymin/20.0,r2.xmax/20.0,r2.ymax/20.0); + + DEBUG_ENUMERATE printf("style tag pos: %d\n", tag->pos); + enumerateUsedIDs_styles(tag, callback, callback_data, num, morph); + DEBUG_ENUMERATE printf("-------\n"); + swf_ResetReadBits(tag); + while(--numshapes>=0) /* morph shapes define two shapes */ + { + DEBUG_ENUMERATE printf("shape:%d\n", numshapes); + fillbits = swf_GetBits(tag, 4); + linebits = swf_GetBits(tag, 4); + DEBUG_ENUMERATE printf("fillbits=%d linebits=%d\n", fillbits, linebits); + swf_ResetReadBits(tag); + int x=0,y=0; + while(1) { + int flags; + flags = swf_GetBits(tag, 1); + if(!flags) { //style change + flags = swf_GetBits(tag, 5); + if(!flags) + break; + if(flags&1) { //move + int n = swf_GetBits(tag, 5); + x = swf_GetBits(tag, n); //x + y = swf_GetBits(tag, n); //y + DEBUG_ENUMERATE printf("moveTo %.2f %.2f\n",x/20.0,y/20.0); + } + if(flags&2) { //fill0 + int fill0; + fill0 = swf_GetBits(tag, fillbits); + DEBUG_ENUMERATE printf("fill0 %d\n", fill0); + } + if(flags&4) { //fill1 + int fill1; + fill1 = swf_GetBits(tag, fillbits); + DEBUG_ENUMERATE printf("fill1 %d\n", fill1); + } + if(flags&8) { //linestyle + int line; + line = swf_GetBits(tag, linebits); + DEBUG_ENUMERATE printf("linestyle %d\n",line); + } + if(flags&16) { + DEBUG_ENUMERATE printf("more fillstyles\n"); + enumerateUsedIDs_styles(tag, callback, callback_data, num, 0); + fillbits = swf_GetBits(tag, 4); + linebits = swf_GetBits(tag, 4); + } + } else { + flags = swf_GetBits(tag, 1); + if(flags) { //straight edge + int n = swf_GetBits(tag, 4) + 2; + if(swf_GetBits(tag, 1)) { //line flag + x += swf_GetSBits(tag, n); //delta x + y += swf_GetSBits(tag, n); //delta y + DEBUG_ENUMERATE printf("lineTo %.2f %.2f\n",x/20.0,y/20.0); + } else { + int v=swf_GetBits(tag, 1); + int d; + d = swf_GetSBits(tag, n); //vert/horz + if(!v) + x += d; + else + y += d; + DEBUG_ENUMERATE printf("lineTo %.2f %.2f (%s)\n",x/20.0,y/20.0, v?"vertical":"horizontal"); + } + } else { //curved edge + int n = swf_GetBits(tag, 4) + 2; + int x1,y1,x2,y2; + x1 = swf_GetSBits(tag, n); + y1 = swf_GetSBits(tag, n); + x2 = swf_GetSBits(tag, n); + y2 = swf_GetSBits(tag, n); + DEBUG_ENUMERATE printf("splineTo %.2f %.2f %.2f %.2f\n", x1/20.0, y1/20.0, x2/20.0, y2/20.0); + } + } + } + } + } + break; + default: + break; + } +} + +void callbackCount(TAG * t,int pos, void*ptr) +{ + (*(int*)ptr)++; + DEBUG_ENUMERATE printf("callback(%d) %d\n", pos, *(U16*)&t->data[pos]); +} + +void callbackFillin(TAG * t,int pos, void*ptr) +{ + **(int**)ptr = pos; + (*(int**)ptr)++; + DEBUG_ENUMERATE printf("callback(%d) %d\n", pos, *(U16*)&t->data[pos]); +} + +int swf_GetNumUsedIDs(TAG * t) +{ + int num = 0; + enumerateUsedIDs(t, 0, callbackCount, &num); + return num; +} + +void swf_GetUsedIDs(TAG * t, int * positions) +{ + int * ptr = positions; + enumerateUsedIDs(t, 0, callbackFillin, &ptr); +} + +char swf_Relocate (SWF*swf, char*bitmap) +{ + TAG*tag; + int slaveids[65536]; + memset(slaveids, -1, sizeof(slaveids)); + tag = swf->firstTag; + char ok = 1; + + int current_id=0; +#define NEW_ID(n) \ + for(current_id++;current_id<65536;current_id++) { \ + if(!bitmap[current_id]) { \ + n = current_id; \ + break; \ + } \ + } \ + if(current_id==65536) { \ + fprintf(stderr, "swf_Relocate: Couldn't relocate: Out of IDs\n"); \ + return 0; \ + } + + while(tag) + { + int num; + int *ptr; + + if(swf_isDefiningTag(tag)) + { + int newid; + int id; + + id = swf_GetDefineID(tag); //own id + + if(!bitmap[id]) { //free + newid = id; + } else if(slaveids[id]>0) { + newid = slaveids[id]; + } else { + NEW_ID(newid); + } + + bitmap[newid] = 1; + slaveids[id] = newid; + + swf_SetDefineID(tag, newid); + } + + num = swf_GetNumUsedIDs(tag); + if(num) { + ptr = (int*)rfx_alloc(sizeof(int)*num); + swf_GetUsedIDs(tag, ptr); + int t; + for(t=0;tdata[ptr[t]]); + if(slaveids[id]<0) { + if(!id && bitmap[id]) { + /* id 0 is only used in SWF versions >=9. It's the ID of + the main timeline. It's used in e.g. SYMBOLTAG tags, but + never defined, so if we're asked to reallocate it, we have + to allocate an ID for it on the fly. */ + int newid; + NEW_ID(newid); + bitmap[newid] = 1; + slaveids[id] = newid; + id = newid; + } else if(!bitmap[id]) { + /* well- we don't know this id, but it's not reserved anyway, so just + leave it alone */ + } else { + /* this actually happens with files created with Flash CS4 and never. + Apparently e.g. DefineButton tags are able to use forward declarations of objects. */ + fprintf(stderr, "warning: Mapping id (%d) never encountered before in %s\n", id, + swf_TagGetName(tag)); + int newid; + NEW_ID(newid); + id = slaveids[id] = newid; + ok = 0; + } + } else { + id = slaveids[id]; + } + PUT16(&tag->data[ptr[t]], id); + } + free(ptr); + } + tag=tag->next; + } + return ok; +} + +/* untested */ +void swf_Relocate2(SWF*swf, int*id2id) +{ + TAG*tag; + tag = swf->firstTag; + while(tag) { + if(swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + id = id2id[id]; + if(id>=0) { + swf_SetDefineID(tag, id); + } + } + int num = swf_GetNumUsedIDs(tag); + if(num) { + int *ptr; + int t; + ptr = (int*)rfx_alloc(sizeof(int)*num); + swf_GetUsedIDs(tag, ptr); + for(t=0;tdata[ptr[t]]); + id = id2id[id]; + if(id>=0) { + PUT16(&tag->data[ptr[t]], id); + } + } + free(ptr); + } + } +} + +void swf_RelocateDepth(SWF*swf, char*bitmap) +{ + TAG*tag; + int nr; + tag = swf->firstTag; + for(nr=65535;nr>=0;nr--) { + if(bitmap[nr] != 0) + break; + } + // now nr is the highest used depth. So we start + // assigning depths at nr+1 + nr++; + + while(tag) + { + int depth; + /* TODO * clip depths + * sprites + */ + if(tag->id == ST_PLACEOBJECT2) { + SWFPLACEOBJECT obj; + swf_GetPlaceObject(tag, &obj); + if(obj.clipdepth) { + int newdepth = obj.clipdepth+nr; + if(newdepth>65535) { + fprintf(stderr, "Couldn't relocate depths: too large values\n"); + newdepth = 65535; + } + obj.clipdepth = newdepth; + swf_ResetTag(tag, ST_PLACEOBJECT2); + swf_SetPlaceObject(tag, &obj); + } + swf_PlaceObjectFree(&obj); + } + + depth = swf_GetDepth(tag); + if(depth>=0) { + int newdepth = depth+nr; + if(newdepth>65535) { + fprintf(stderr, "Couldn't relocate depths: too large values\n"); + newdepth = 65535; + } + swf_SetDepth(tag, newdepth); + } + tag=tag->next; + } +} + +U8 swf_isShapeTag(TAG*tag) +{ + if(tag->id == ST_DEFINESHAPE || + tag->id == ST_DEFINESHAPE2 || + tag->id == ST_DEFINESHAPE3 || + tag->id == ST_DEFINESHAPE4) + return 1; + return 0; +} + +U8 swf_isPlaceTag(TAG*tag) +{ + if(tag->id == ST_PLACEOBJECT || + tag->id == ST_PLACEOBJECT2 || + tag->id == ST_PLACEOBJECT3) + return 1; + return 0; +} +U8 swf_isTextTag(TAG*tag) +{ + if(tag->id == ST_DEFINETEXT || + tag->id == ST_DEFINETEXT2) + return 1; + return 0; +} + +U8 swf_isFontTag(TAG*tag) +{ + if(tag->id == ST_DEFINEFONT || + tag->id == ST_DEFINEFONT2 || + tag->id == ST_DEFINEFONT3 || + tag->id == ST_DEFINEFONTINFO) + return 1; + return 0; +} + +U8 swf_isImageTag(TAG*tag) +{ + if(tag->id == ST_DEFINEBITSJPEG || + tag->id == ST_DEFINEBITSJPEG2 || + tag->id == ST_DEFINEBITSJPEG3 || + tag->id == ST_DEFINEBITSLOSSLESS || + tag->id == ST_DEFINEBITSLOSSLESS2) + return 1; + return 0; +} + +TAG* swf_Concatenate (TAG*list1,TAG*list2) +{ + TAG*tag=0,*lasttag=0; + char bitmap[65536]; + char depthmap[65536]; + SWF swf1,swf2; + memset(bitmap, 0, sizeof(bitmap)); + memset(depthmap, 0, sizeof(depthmap)); + memset(&swf1, 0, sizeof(swf1)); + memset(&swf2, 0, sizeof(swf2)); + + swf1.firstTag = list1; + swf_FoldAll(&swf1); + swf2.firstTag = list2; + swf_FoldAll(&swf2); + + tag = list1; + while(tag) { + if(!swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + bitmap[id] = 1; + } + if(tag->id == ST_PLACEOBJECT || + tag->id == ST_PLACEOBJECT2) { + int depth = swf_GetDepth(tag); + depthmap[depth] = 1; + } + if(tag->id == ST_REMOVEOBJECT || + tag->id == ST_REMOVEOBJECT2) { + int depth = swf_GetDepth(tag); + depthmap[depth] = 0; + } + tag = tag->next; + lasttag = tag; + } + swf_Relocate(&swf2, bitmap); + swf_RelocateDepth(&swf2, depthmap); + lasttag->next = swf2.firstTag; + swf2.firstTag->prev = lasttag; + + return swf1.firstTag; +} + +static int tagHash(TAG*tag) +{ + int t, h=0; + unsigned int a = 0x6b973e5a; + /* start at pos 2, as 0 and 1 are the id */ + for(t=2;tlen;t++) { + unsigned int b = a; + a >>= 8; + a += tag->data[t]*0xefbc35a5*b*(t+1); + } + return a&0x7fffffff; //always return positive number +} + +void swf_Optimize(SWF*swf) +{ + const int hash_size = 131072; + char* dontremap = (char*)rfx_calloc(sizeof(char)*65536); + U16* remap = (U16*)rfx_alloc(sizeof(U16)*65536); + TAG* id2tag = (TAG*)rfx_calloc(sizeof(TAG*)*65536); + TAG** hashmap = (TAG**)rfx_calloc(sizeof(TAG*)*hash_size); + TAG* tag; + int t; + for(t=0;t<65536;t++) { + remap[t] = t; + } + + swf_FoldAll(swf); + + tag = swf->firstTag; + while(tag) { + /* make sure we don't remap to this tag, + as it might have different "helper tags" + FIXME: a better way would be to compare + the helper tags, too. + */ + if(swf_isPseudoDefiningTag(tag) && + tag->id != ST_NAMECHARACTER) { + dontremap[swf_GetDefineID(tag)] = 1; + } + tag=tag->next; + } + tag = swf->firstTag; + while(tag) { + TAG*next = tag->next; + + /* remap the tag */ + int num = swf_GetNumUsedIDs(tag); + int*positions = (int*)rfx_alloc(sizeof(int)*num); + int t; + swf_GetUsedIDs(tag, positions); + for(t=0;tdata[positions[t]]); + id = remap[id]; + PUT16(&tag->data[positions[t]], id); + } + rfx_free(positions); + + /* now look for previous tags with the same + content */ + if(swf_isDefiningTag(tag)) { + TAG*tag2; + int id = swf_GetDefineID(tag); + int hash = tagHash(tag); + int match=0; + if(!dontremap[id]) + while((tag2 = hashmap[hash%hash_size])) { + if(tag2 != (TAG*)0 && tag->len == tag2->len) { + if(memcmp(&tag->data[2],&tag2->data[2],tag->len-2) == 0) { + match = 1; + break; + } + } + hash++; + } + if(!match) { + while(hashmap[hash%hash_size]) hash++; + hashmap[hash%hash_size] = tag; + } else { + /* we found two identical tags- remap one + of them */ + remap[id] = swf_GetDefineID(tag2); + swf_DeleteTag(swf, tag); + } + } else if(swf_isPseudoDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + if(remap[id]!=id) { + /* if this tag was remapped, we don't + need the helper tag anymore. Discard + it. */ + swf_DeleteTag(swf, tag); + } + } + + tag = next; + } + + rfx_free(dontremap); + rfx_free(remap); + rfx_free(id2tag); + rfx_free(hashmap); +} + +void swf_SetDefineBBox(TAG * tag, SRECT newbbox) +{ + U16 id = 0; + SRECT b1; + swf_SetTagPos(tag,0); + + switch (swf_GetTagID(tag)) + { + case ST_DEFINESHAPE: + case ST_DEFINESHAPE2: + case ST_DEFINESHAPE3: + case ST_DEFINEEDITTEXT: + case ST_DEFINETEXT: + case ST_DEFINETEXT2: + case ST_DEFINEVIDEOSTREAM: { + U32 after_bbox_offset = 0, len; + U8*data; + id = swf_GetU16(tag); + swf_GetRect(tag, &b1); + swf_ResetReadBits(tag); + after_bbox_offset = tag->pos; + len = tag->len - after_bbox_offset; + data = (U8*)malloc(len); + memcpy(data, &tag->data[after_bbox_offset], len); + tag->writeBit = 0; + tag->len = 2; + swf_SetRect(tag, &newbbox); + swf_SetBlock(tag, data, len); + free(data); + tag->pos = tag->readBit = 0; + + } break; + default: + fprintf(stderr, "rfxswf: Tag %d (%s) has no bbox\n", tag->id, swf_TagGetName(tag)); + } +} + +RGBA swf_GetSWFBackgroundColor(SWF*swf) +{ + TAG*t=swf->firstTag; + RGBA color; + color.r = color.b = color.g = 0; + color.a = 255; + while(t) { + if(t->id == ST_SETBACKGROUNDCOLOR) { + swf_SetTagPos(t, 0); + color.r = swf_GetU8(t); + color.g = swf_GetU8(t); + color.b = swf_GetU8(t); + break; + } + t=t->next; + } + return color; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mp3.c b/fluidbook/tools/swftools-special-swfdump/lib/mp3.c new file mode 100644 index 000000000..48f03d12a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/mp3.c @@ -0,0 +1,236 @@ +/* mp3.c + Routines for handling .mp3 files + + Part of the swftools package. + + Copyright (c) 2005 Joel Yliluoma + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include + +#include "mp3.h" + +struct MP3Frame +{ + unsigned bitrate; + unsigned samprate; + unsigned chanmode; + unsigned framesize; + unsigned char* data; + struct MP3Frame* next; +}; + +// 0 4 8 C +static const unsigned BR_mpeg1[16] = {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}; +static const unsigned BR_mpeg2[16] = {0,8, 16,24,32,40,48,56, 64, 80, 96,112,128,144,160,0}; +static const unsigned BR_reserved[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; +static const unsigned*const BR[4] = {BR_mpeg2, BR_reserved, BR_mpeg2, BR_mpeg1}; + +static const unsigned SR_mpeg1[4] = {44100,48000,32000,0}; +static const unsigned SR_mpeg2[4] = {22050,24000,16000,0}; +static const unsigned SR_mpeg25[4] = {11025,12000,8000,0}; +static const unsigned SR_reserved[4] = {0,0,0,0}; +static const unsigned*const SR[4] = {SR_mpeg25, SR_reserved, SR_mpeg2, SR_mpeg1}; + +int mp3_read(struct MP3*mp3, const char* filename) +{ + struct MP3Frame* root = 0; + struct MP3Frame** cur = &root; + + unsigned totalsize = 0; + unsigned first_samprate = 0; + unsigned nframes = 0; + int first_chanmode = -1; + + FILE*fi = fopen(filename, "rb"); + if(!fi) return 0; + + for(;;) + { + unsigned char FrameBuf[2048]; + unsigned char* hdr = FrameBuf; + unsigned char* data = FrameBuf+4; + unsigned char* frdata; + + unsigned char mpegver; + unsigned padding; + unsigned bitrate; + unsigned samprate; + unsigned framesize; + int chanmode; + + if(fread(hdr,1,4,fi) < 4) break; + + if(hdr[0] == 'I' && hdr[1] == 'D' && hdr[2] == '3') + { + /* Skip ID3 header */ + unsigned id3_size = 0; + if(fread(FrameBuf, 1, 6, fi) < 6) break; + + id3_size = (FrameBuf[5]) + + (FrameBuf[4] << 7) + + (FrameBuf[3] << 14) + + (FrameBuf[2] << 21); + fprintf(stderr, "readMP3: skipping ID3 tag (10+%u bytes)\n", id3_size); + if(fseek(fi, id3_size, SEEK_CUR) < 0) + { + /* Cannot seek? Try reading. */ + char* tmpbuf = (char*)malloc(id3_size); + int nread=0; + if(!tmpbuf) + { + fprintf(stderr, "readMP3: fseek and malloc both failed?\n"); + break; + } + nread = fread(tmpbuf, 1, id3_size, fi); + free(tmpbuf); + if(nread < id3_size) break; + } + continue; + } + + + if(hdr[0] != 0xFF + || (hdr[1] & 0xE0) != 0xE0) + { + fprintf(stderr, "readMP3: invalid header %02X %02X %02X %02X\n", + hdr[0],hdr[1],hdr[2],hdr[3]); + break; + } + + mpegver = (hdr[1] >> 3) & 0x03; + + bitrate = BR[mpegver][ (hdr[2] >> 4) & 0x0F ] * 1000; + samprate = SR[mpegver][ (hdr[2] >> 2) & 0x03 ]; + chanmode = (hdr[3] >> 6) & 0x03; + + padding = (hdr[2] & 2) ? 1 : 0; + + if(!bitrate || !samprate) + { + /* Invalid frame */ + /*break;*/ + } + if(!first_samprate) first_samprate = samprate; + else if(first_samprate != samprate) + { + /* Sampling rate changed?!? */ + fprintf(stderr, "readMP3: sampling rate changed?\n"); + /*break;*/ + } + if(first_chanmode<0) first_chanmode = chanmode; + else if(first_chanmode != chanmode) + { + /* Channel mode changed?!? */ + fprintf(stderr, "readMP3: chanmode changed?\n"); + /*break;*/ + } + + framesize = ((mpegver == 3 ? 144 : 72) * bitrate) / samprate + padding; + +/* + fprintf(stderr, "%02X %02X %02X %02X - bitrate=%u,samprate=%u,chanmode=%u,padding=%u,framesize=%u\n", + hdr[0],hdr[1],hdr[2],hdr[3],bitrate,samprate,chanmode,padding,framesize); +*/ + if(framesize > sizeof(FrameBuf)) break; + if(fread(data, 1, framesize - 4, fi) < framesize-4) + { + fprintf(stderr, "readMP3: short read at frame %u\n", nframes); + break; + } + + if(!bitrate || !samprate) continue; + + frdata = (unsigned char*)malloc(framesize); + if(!frdata) + { + fprintf(stderr, "readMP3: malloc failed\n"); + break; + } + + *cur = (struct MP3Frame*)malloc(sizeof(*root)); + if(!*cur) + { + fprintf(stderr, "readMP3: malloc failed\n"); + free(frdata); + break; + } + + (*cur)->next = 0; + (*cur)->bitrate = bitrate; + (*cur)->samprate = samprate; + (*cur)->chanmode = chanmode; + (*cur)->framesize = framesize; + (*cur)->data = frdata; + + memcpy(frdata, FrameBuf, framesize); + cur = &(*cur)->next; + + totalsize += framesize; + ++nframes; + } + if(!root) + { + fprintf(stderr, "readMP3: not a MP3 file\n"); + fclose(fi); + return 0; + } + + /* + fprintf(stderr, "readMP3: read %u frames (%u bytes)\n", nframes, totalsize); + */ + + mp3->SampRate = first_samprate; + mp3->Channels = first_chanmode == 3 ? 1 : 2; + mp3->NumFrames = nframes; + mp3->size = totalsize; + mp3->data = (unsigned char*)malloc(mp3->size); + if(mp3->data) + { + unsigned pos=0; + struct MP3Frame* it; + for(it=root; it; it=it->next) + { + memcpy(mp3->data + pos, it->data, it->framesize); + pos += it->framesize; + } + } + else + { + fprintf(stderr, "readMP3: malloc failed\n"); + } + + while(root) + { + struct MP3Frame* next = root->next; + free(root->data); + free(root); + root = next; + } + + fclose(fi); + return mp3->data != NULL; +} + +void mp3_clear(struct MP3*mp3) +{ + free(mp3->data); + mp3->data = 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mp3.h b/fluidbook/tools/swftools-special-swfdump/lib/mp3.h new file mode 100644 index 000000000..a49c9ad20 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/mp3.h @@ -0,0 +1,19 @@ +/* mp3.h + Header file for mp3.c + + Part of the swftools package. + + Copyright (c) 2005 Joel Yliluoma + + This file is distributed under the GPL, see file COPYING for details */ + +struct MP3 { + unsigned short SampRate; + unsigned char Channels; + unsigned int NumFrames; + unsigned char* data; + unsigned long size; +}; + +int mp3_read(struct MP3*mp3, const char* filename); +void mp3_clear(struct MP3*mp3); diff --git a/fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h b/fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h new file mode 100644 index 000000000..be79454c1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h @@ -0,0 +1,41 @@ +/* old_rfxswf.h + + File which defines macros and typedefs for old versions of + the rfxswf lib functions and datatypes. (For routines which + still use them) + + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include "rfxswf.h" + +/* +#define DataPos dataReadPos +#define DataSize dataWritePos +#define bitcount bitWritePos +#define bitmask bitWritePos + +*/ +#define GetDataSize GetTagLen +#define GetDataSizePtr GetTagLenPtr +#define RFXSWF_ReadTag(a,b) swf_ReadTag(a,b) +#define RFXSWF_WriteTag(a,b) swf_WriteTag(a,b) +#define RFXSWF_UpdateFrame(a,b) swf_UpdateFrame(a,b) +#define RFXSWF_WriteTag(a,b) swf_WriteTag(a,b) +#define RFXSWF_DefineSprite_GetRealSize(a) swf_DefineSprite_GetRealSize(a) + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/os.c b/fluidbook/tools/swftools-special-swfdump/lib/os.c new file mode 100644 index 000000000..c95b7775a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/os.c @@ -0,0 +1,325 @@ +/* os.c + +operating system dependent functions + +Part of the swftools package. + +Copyright (c) 2005 Matthias Kramm + +This program is free software; you can redistribute it and/or 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 */ + +#include "os.h" +#include +#include +#include +#ifdef WIN32 +#include +#else +#include +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#else +#undef HAVE_STAT +#endif +#ifdef HAVE_SYS_MMAN_H +#include +#else +#undef HAVE_MMAP +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#else +#undef HAVE_STAT +#endif + +#if defined(CYGWIN) +char path_seperator = '/'; +#elif defined(WIN32) +char path_seperator = '\\'; +#else +char path_seperator = '/'; +#endif + +#ifdef WIN32 +char* getRegistryEntry(char*path) +{ + int res = 0; + HKEY key; + long rc; + long size = 0; + DWORD type; + char*buf; + rc = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_ALL_ACCESS, &key); + if(rc) + rc = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &key); + if(rc) + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS, &key); + if(rc) + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &key); + + if (rc) { + fprintf(stderr, "RegOpenKeyEx failed\n"); + return 0; + } + rc = RegQueryValueEx(key, NULL, 0, 0, 0, (LPDWORD)&size) ; + if(rc) { + fprintf(stderr, "RegQueryValueEx(1) failed: %d\n", rc); + return 0; + } + buf = (char*)malloc(size+1); + rc = RegQueryValueEx(key, NULL, 0, &type, (BYTE*)buf, (LPDWORD)&size); + if(rc) { + fprintf(stderr, "RegQueryValueEx(2) failed: %d\n", rc); + return 0; + } + if(type == REG_SZ || type == REG_EXPAND_SZ) { + while(size && buf[size-1] == '\0') + --size; + buf[size] = 0; + /* TODO: convert */ + return buf; + } else if(type == REG_BINARY) { + return buf; + } + return 0; +} + +int setRegistryEntry(char*key,char*value) +{ + HKEY hkey1; + HKEY hkey2; + int ret1 = 0, ret2=0; + ret1 = RegCreateKey(HKEY_CURRENT_USER, key, &hkey1); + ret2 = RegCreateKey(HKEY_LOCAL_MACHINE, key, &hkey2); + if(ret1 && ret2) { + fprintf(stderr, "registry: CreateKey %s failed\n", key); + return 0; + } + if(!ret1) + ret1 = RegSetValue(hkey1, NULL, REG_SZ, value, strlen(value)+1); + if(!ret2) + ret2 = RegSetValue(hkey2, NULL, REG_SZ, value, strlen(value)+1); + if(ret1 && ret2) { + fprintf(stderr, "registry: SetValue %s failed\n", key); + return 0; + } + return 1; +} + + +#endif + +//HINSTANCE me = GetModuleHandle(NULL); + +char* getInstallationPath() +{ +#if defined(WIN32) + char* path = getRegistryEntry("Software\\quiss.org\\swftools\\InstallPath"); + if(path) + return path; + else + return 0; +#elif defined(CYGWIN) + return SWFTOOLS_DATADIR; +#else + return SWFTOOLS_DATADIR; +#endif +} + +char* concatPaths(const char*base, const char*add) +{ + int l1 = strlen(base); + int l2 = strlen(add); + int pos = 0; + char*n = 0; + while(l1 && base[l1-1] == path_seperator) + l1--; + while(pos < l2 && add[pos] == path_seperator) + pos++; + + n = (char*)malloc(l1 + (l2-pos) + 2); + memcpy(n,base,l1); + n[l1]=path_seperator; + strcpy(&n[l1+1],&add[pos]); + return n; +} + +char* stripFilename(const char*filename, const char*newext) +{ + char*last1 = strrchr(filename, '/'); + char*last2 = strrchr(filename, '\\'); + const char*pos = filename; + char*name; + char*dot; + if(last1>pos) pos = last1 + 1; + if(last2>pos) pos = last2 + 1; + name = (char*)malloc(strlen(pos)+2+(newext?strlen(newext):3)); + strcpy(name, pos); + dot = strrchr(name, '.'); + if(dot) { + *dot = 0; + } + if(newext) + strcat(name, newext); + return name; +} + +static char* getTempDir() +{ +#ifdef WIN32 + char*dir = getenv("TMP"); + if(!dir) dir = getenv("TEMP"); + if(!dir) dir = getenv("tmp"); + if(!dir) dir = getenv("temp"); + if(!dir) dir = "C:\\"; +#else + char* dir = "/tmp/"; +#endif + return dir; +} + +char* mktempname(char*ptr, const char*ext) { + static char tmpbuf[160]; + char*dir = getTempDir(); + int l = strlen(dir); + char*sep = ""; + if(!ptr) + ptr = tmpbuf; + if(l && dir[l-1]!='/' && dir[l-1]!='\\') { +#ifdef WIN32 + sep = "\\"; +#else + sep = "/"; +#endif + } + +#ifdef HAVE_LRAND48 + unsigned int r1 = (unsigned int)lrand48(); + unsigned int r2 = (unsigned int)lrand48(); +#elif HAVE_RAND + unsigned int r1 = rand(); + unsigned int r2 = rand(); +#else + static int count = 1; + unsigned int r1 = time(0); + unsigned int r2 = (unsigned int)tmpbuf<<8^count; + count ++; +#endif + if(ext) { + sprintf(ptr, "%s%s%04x%04x.%s",dir,sep,r1,r2,ext); + } else { + sprintf(ptr, "%s%s%04x%04x",dir,sep,r1,r2); + } + return ptr; +} + +memfile_t* memfile_open(const char*path) +{ + memfile_t*file = malloc(sizeof(memfile_t)); +#if defined(HAVE_MMAP) && defined(HAVE_STAT) + int fi = open(path, O_RDONLY); + if(fi<0) { + perror(path); + free(file); + return 0; + } + struct stat sb; + if(fstat(fi, &sb)<0) { + perror(path); + return 0; + } + file->len = sb.st_size; + file->data = mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, fi, 0); + close(fi); +#else + FILE*fi = fopen(path, "rb"); + if(!fi) { + perror(path); + free(file); + return 0; + } + fseek(fi, 0, SEEK_END); + file->len = ftell(fi); + fseek(fi, 0, SEEK_SET); + file->data = malloc(file->len); + if(!file->data) { + fprintf(stderr, "Out of memory while allocating memory for file %s\n", path); + free(file); + return 0; + } + fread(file->data, file->len, 1, fi); + fclose(fi); +#endif + return file; +} + +void memfile_close(memfile_t*file) +{ +#if defined(HAVE_MMAP) && defined(HAVE_STAT) + munmap(file->data, file->len); +#else + free(file->data); +#endif + file->data = 0; + file->len = 0; + free(file); +} + +void move_file(const char*from, const char*to) +{ + int result = rename(from, to); + + if(result==0) return; //done! + + /* if we can't rename, for some reason, copy the file + manually */ + FILE*fi = fopen(from, "rb"); + if(!fi) { + perror(from); + return; + } + FILE*fo = fopen(to, "wb"); + if(!fo) { + perror(to); + return; + } + char buffer[16384]; + while(1) { + int bytes = fread(buffer, 16384, 1, fi); + if(bytes<=0) + return; + fwrite(buffer, bytes, 1, fo); + } + + fclose(fo); + fclose(fi); +} + +char file_exists(const char*filename) +{ +#ifdef HAVE_STAT + struct stat sb; + return stat(filename, &sb) >= 0; +#else + int fi = open(filename, O_RDONLY); + if(fi>=0) { + close(fi); + return 1; + } + return 0; +#endif +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/os.h b/fluidbook/tools/swftools-special-swfdump/lib/os.h new file mode 100644 index 000000000..3efd8f306 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/os.h @@ -0,0 +1,59 @@ +/* os.h + +header file for operating system dependent functions + +Part of the swftools package. + +Copyright (c) 2005 Matthias Kramm + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#ifndef __os_h__ +#define __os_h__ +#include "../config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern char path_seperator; + +#ifdef WIN32 +char* getRegistryEntry(char*path); +int setRegistryEntry(char*key,char*value); +#endif + +typedef struct _memfile { + void*data; + int len; +} memfile_t; +memfile_t* memfile_open(const char*path); +void memfile_close(memfile_t*file); + +char* getInstallationPath(); +char* concatPaths(const char*base, const char*add); +char* stripFilename(const char*filename, const char*newext); + +char* mktempname(char*buffer, const char*ext); + +void move_file(const char*from, const char*to); +char file_exists(const char*filename); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc new file mode 100644 index 000000000..7b175b36d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc @@ -0,0 +1,2071 @@ +/* InfoOutputDev.h + + Output Device which creates a bitmap. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include +#include +#include "BitmapOutputDev.h" +#include "CharOutputDev.h" + +#ifdef HAVE_POPPLER + #include "splash/SplashBitmap.h" + #include "splash/SplashPattern.h" + #include "splash/Splash.h" +#else + #include "xpdf/config.h" + #include "SplashBitmap.h" + #include "SplashGlyphBitmap.h" + #include "SplashPattern.h" + #include "Splash.h" +#endif + +#include "../log.h" +#include "../png.h" +#include "../devices/record.h" +#include "../gfxtools.h" +#include "../types.h" +#include "bbox.h" + +#define UNKNOWN_BOUNDING_BOX 0,0,0,0 + +static SplashColor splash_white = {255,255,255}; +static SplashColor splash_black = {0,0,0}; + +ClipState::ClipState() +{ + this->next = 0; + this->clipbitmap = 0; + this->written = 0; +} + +static gfxdevice_t* device_new_record() +{ + gfxdevice_t*dev = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_record_init(dev, 0); + return dev; +} + +BitmapOutputDev::BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) +:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) +{ + this->info = info; + this->doc = doc; + this->xref = doc->getXRef(); + + /* color graphic output device, for creating bitmaps */ + this->rgbdev = new SplashOutputDev(splashModeRGB8, 1, gFalse, splash_white, gTrue, gTrue); + + /* color mode for binary bitmaps */ + SplashColorMode colorMode = splashModeMono1; + + /* two devices for testing things against clipping: one clips, the other doesn't */ + this->clip0dev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); + this->clip1dev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); + + /* device indicating where polygonal pixels were drawn */ + this->boolpolydev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); + /* device indicating where text pixels were drawn */ + this->booltextdev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); + + /* device for handling texts and links */ + this->gfxdev = new CharOutputDev(info, this->doc, page2page, num_pages, x, y, x1, y1, x2, y2); + + this->rgbdev->startDoc(this->xref); + this->boolpolydev->startDoc(this->xref); + this->booltextdev->startDoc(this->xref); + this->clip0dev->startDoc(this->xref); + this->clip1dev->startDoc(this->xref); + + this->gfxoutput_string = device_new_record(); + this->gfxoutput = device_new_record(); + this->gfxdev->setDevice(this->gfxoutput); + + this->config_extrafontdata = 0; + this->config_optimizeplaincolorfills = 0; + this->config_skewedtobitmap = 0; + this->config_alphatobitmap = 0; + this->bboxpath = 0; + //this->clipdev = 0; + //this->clipstates = 0; +} +BitmapOutputDev::~BitmapOutputDev() +{ + if(this->gfxoutput) { + gfxresult_t*r = this->gfxoutput->finish(this->gfxoutput); + r->destroy(r); + free(this->gfxoutput);this->gfxoutput = 0; + } + if(this->gfxoutput_string) { + gfxresult_t*r = this->gfxoutput_string->finish(this->gfxoutput_string); + r->destroy(r); + free(this->gfxoutput_string);this->gfxoutput_string = 0; + } + if(this->bboxpath) { + delete this->bboxpath;this->bboxpath = 0; + } + if(this->rgbdev) { + delete this->rgbdev;this->rgbdev = 0; + } + if(this->gfxdev) { + delete this->gfxdev;this->gfxdev= 0; + } + if(this->boolpolydev) { + delete this->boolpolydev;this->boolpolydev = 0; + } + if(this->stalepolybitmap) { + delete this->stalepolybitmap;this->stalepolybitmap = 0; + } + if(this->staletextbitmap) { + delete this->staletextbitmap;this->staletextbitmap = 0; + } + if(this->booltextdev) { + delete this->booltextdev;this->booltextdev = 0; + } + if(this->clip0dev) { + delete this->clip0dev;this->clip0dev = 0; + } + if(this->clip1dev) { + delete this->clip1dev;this->clip1dev = 0; + } + //if(this->clipbitmap) { + // delete this->clipbitmap;this->clipbitmap = 0; + //} + //if(this->clipdev) { + // delete this->clipdev;this->clipdev = 0; + //} + +} + +GBool BitmapOutputDev::getVectorAntialias() +{ + return this->rgbdev->getVectorAntialias(); +} +void BitmapOutputDev::setVectorAntialias(GBool vaa) +{ + this->rgbdev->setVectorAntialias(vaa); +} +void BitmapOutputDev::setDevice(gfxdevice_t*dev) +{ + this->dev = dev; +} +void BitmapOutputDev::setParameter(const char*key, const char*value) +{ + if(!strcmp(key, "extrafontdata")) { + this->config_extrafontdata = atoi(value); + } else if(!strcmp(key, "skewedtobitmap")) { + this->config_skewedtobitmap = atoi(value); + } else if(!strcmp(key, "alphatobitmap")) { + this->config_alphatobitmap = atoi(value); + } + + this->gfxdev->setParameter(key, value); +} + +void writeBitmap(SplashBitmap*bitmap, char*filename); +void writeAlpha(SplashBitmap*bitmap, char*filename); + +static int dbg_btm_counter=1; + +void BitmapOutputDev::flushBitmap() +{ + int bitmap_width = rgbdev->getBitmapWidth(); + int bitmap_height = rgbdev->getBitmapHeight(); + + if(sizeof(SplashColor)!=3) { + msg(" sizeof(SplashColor)!=3"); + return; + } + + /*static int counter=0; + if(!counter) { + writeBitmap(rgbdev->getBitmap(), "test.png"); + } counter++;*/ + + /*static int counter=0; + char filename[160]; + sprintf(filename, "test%d.png", counter++); + writeBitmap(rgbbitmap, filename);*/ + + SplashColorPtr rgb = rgbbitmap->getDataPtr(); + Guchar*alpha = rgbbitmap->getAlphaPtr(); + + Guchar*alpha2 = stalepolybitmap->getDataPtr(); + int bitmap_width8 = (stalepolybitmap->getWidth()+7)/8; + + /*char filename[80]; + sprintf(filename, "flush%d_mask.png", dbg_btm_counter); + writeAlpha(stalepolybitmap, filename); + sprintf(filename, "flush%d_alpha.png", dbg_btm_counter); + writeAlpha(rgbbitmap, filename); + sprintf(filename, "flush%d_bitmap.png", dbg_btm_counter); + writeBitmap(rgbbitmap, filename);*/ + + ibbox_t pagebox = {-movex, -movey, -movex + this->width, -movey + this->height, 0}; + ibbox_t bitmapbox = {0, 0, bitmap_width, bitmap_height, 0}; + ibbox_t c = ibbox_clip(&bitmapbox, &pagebox); + ibbox_t* boxes = get_bitmap_bboxes((unsigned char*)(alpha+c.ymin*bitmap_width+c.xmin), c.xmax - c.xmin, c.ymax - c.ymin, bitmap_width); + + ibbox_t*b; + for(b=boxes;b;b=b->next) { + int xmin = b->xmin - this->movex; + int ymin = b->ymin - this->movey; + int xmax = b->xmax - this->movex; + int ymax = b->ymax - this->movey; + + /* clip against (-movex, -movey, -movex+width, -movey+height) */ + + msg(" Flushing bitmap (bbox: %d,%d,%d,%d %dx%d) (clipped against %d,%d,%d,%d)", xmin,ymin,xmax,ymax, xmax-xmin, ymax-ymin, + -this->movex, -this->movey, -this->movex+this->width, -this->movey+this->height); + + if(xmin < -this->movex) { + xmin = -this->movex; + if(xmax < -this->movex) continue; + } + if(ymin < -this->movey) { + ymin = -this->movey; + if(ymax < -this->movey) continue; + } + if(xmax >= -this->movex + this->width) { + xmax = -this->movex+this->width; + if(xmin >= -this->movex + this->width) continue; + } + if(ymax >= -this->movey + this->height) { + ymax = -this->movey+this->height; + if(ymin >= -this->movey + this->height) continue; + } + + if((xmax-xmin)<=0 || (ymax-ymin)<=0) // no bitmap, nothing to do + continue; + + int rangex = xmax-xmin; + int rangey = ymax-ymin; + gfximage_t*img = (gfximage_t*)malloc(sizeof(gfximage_t)); + img->data = (gfxcolor_t*)malloc(rangex * rangey * 4); + img->width = rangex; + img->height = rangey; + int x,y; + for(y=0;ydata[y*rangex]; + Guchar*ain = &alpha[(y+ymin)*bitmap_width+xmin]; + Guchar*ain2 = &alpha2[(y+ymin)*bitmap_width8]; + if(this->emptypage) { + for(x=0;x>((x+xmin)&7)))) { + /* cut away pixels that we don't remember drawing (i.e., that are + not in the monochrome bitmap). Prevents some "hairlines" showing + up to the left and right of bitmaps. */ + out[x].r = 0;out[x].g = 0;out[x].b = 0;out[x].a = 0; + } else { + /* according to endPage()/compositeBackground() in xpdf/SplashOutputDev.cc, this + data has non-premultiplied alpha, which is exactly what the output device + expects, so don't premultiply it here, either. + */ + out[x].r = in[x*3+0]; + out[x].g = in[x*3+1]; + out[x].b = in[x*3+2]; + out[x].a = ain[x]; + } + } + } + } + + /* transform bitmap rectangle to "device space" */ + xmin += movex; + ymin += movey; + xmax += movex; + ymax += movey; + + gfxmatrix_t m; + m.tx = xmin; + m.ty = ymin; + m.m00 = m.m11 = 1; + m.m10 = m.m01 = 0; + m.tx -= 0.5; + m.ty -= 0.5; + + gfxline_t* line = gfxline_makerectangle(xmin, ymin, xmax, ymax); + dev->fillbitmap(dev, line, img, &m, 0); + gfxline_free(line); + + if(img->data) { + free(img->data);img->data=0; + } + free(img);img=0; + } + ibbox_destroy(boxes); + + memset(rgbbitmap->getAlphaPtr(), 0, rgbbitmap->getWidth()*rgbbitmap->getHeight()); + memset(rgbbitmap->getDataPtr(), 0, rgbbitmap->getRowSize()*rgbbitmap->getHeight()); + + this->emptypage = 0; +} + +void BitmapOutputDev::flushText() +{ + msg(" Flushing text"); + + static gfxfontlist_t*output_font_list = 0; + static gfxdevice_t*last = 0; + if(last != this->dev) { + if(output_font_list) + gfxfontlist_free(output_font_list, 0); + output_font_list = gfxfontlist_create(); + } + gfxdevice_record_flush(this->gfxoutput, this->dev, &output_font_list); + last = this->dev; + + this->emptypage = 0; +} + +void writeMonoBitmap(SplashBitmap*btm, char*filename) +{ + int width8 = (btm->getWidth()+7)/8; + int width = btm->getWidth(); + int height = btm->getHeight(); + gfxcolor_t*b = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); + unsigned char*data = btm->getDataPtr(); + int x,y; + for(y=0;y>3]&(128>>(x&7))) { + d[x].r = d[x].b = d[x].a = 255; + d[x].g = 0; + } else { + d[x].r = d[x].g = d[x].b = d[x].a = 0; + } + } + } + png_write_quick(filename, (unsigned char*)b, width, height); + free(b); +} + +void writeBitmap(SplashBitmap*bitmap, char*filename) +{ + int y,x; + + int width = bitmap->getWidth(); + int height = bitmap->getHeight(); + + gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); + + if(bitmap->getMode()==splashModeMono1) { + writeMonoBitmap(bitmap, filename); + return; + } + + for(y=0;ygetPixel(x,y,c); + line[x].r = c[0]; + line[x].g = c[1]; + line[x].b = c[2]; + line[x].a = bitmap->getAlpha(x,y); + } + } + png_write_quick(filename, (unsigned char*)data, width, height); + free(data); +} + +void writeAlpha(SplashBitmap*bitmap, char*filename) +{ + int y,x; + + int width = bitmap->getWidth(); + int height = bitmap->getHeight(); + + if(bitmap->getMode()==splashModeMono1) { + writeMonoBitmap(bitmap, filename); + return; + } + + gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); + + for(y=0;ygetAlpha(x,y); + line[x].r = a; + line[x].g = 0; + line[x].b = a; + line[x].a = a; + } + } + png_write_quick(filename, (unsigned char*)data, width, height); + free(data); +} + +static const char*STATE_NAME[] = {"parallel", "textabovebitmap", "bitmapabovetext"}; + +int checkAlphaSanity(SplashBitmap*boolbtm, SplashBitmap*alphabtm) +{ + assert(boolbtm->getWidth() == alphabtm->getWidth()); + assert(boolbtm->getHeight() == alphabtm->getHeight()); + if(boolbtm->getMode()==splashModeMono1) { + return 1; + } + + int width = boolbtm->getWidth(); + int height = boolbtm->getHeight(); + + int bad=0; + int x,y; + for(y=0;ygetAlpha(x,y); + int a2 = boolbtm->getAlpha(x,y); + if(a1!=a2) { + bad++; + } + } + } + double badness = bad/(double)(width*height); + if(badness>0.2) { + msg(" Bitmaps don't correspond: %d out of %d pixels wrong (%.2f%%)", bad, width*height, + badness*100.0); + return 0; + } + msg(" %f", badness); + return 1; +} + +static inline GBool fixBBox(int*x1, int*y1, int*x2, int*y2, int width, int height) +{ + if(!(*x1|*y1|*x2|*y2)) { + // undefined bbox + *x1 = *y1 = 0; + *x2 = width; + *y2 = height; + return gTrue; + } + if(*x2<=*x1) return gFalse; + if(*x2<0) return gFalse; + if(*x1<0) *x1 = 0; + if(*x1>=width) return gFalse; + if(*x2>width) *x2=width; + + if(*y2<=*y1) return gFalse; + if(*y2<0) return gFalse; + if(*y1<0) *y1 = 0; + if(*y1>=height) return gFalse; + if(*y2>height) *y2=height; + return gTrue; +} + +static void update_bitmap(SplashBitmap*bitmap, SplashBitmap*update, int x1, int y1, int x2, int y2, char overwrite) +{ + assert(bitmap->getMode()==splashModeMono1); + assert(update->getMode()==splashModeMono1); + + int width8 = (bitmap->getWidth()+7)/8; + assert(width8 == bitmap->getRowSize()); + assert(width8 == update->getRowSize()); + int height = bitmap->getHeight(); + assert(height == update->getHeight()); + + if(!fixBBox(&x1, &y1, &x2, &y2, bitmap->getWidth(), bitmap->getHeight())) + return; + + Guchar*b = bitmap->getDataPtr() + y1*width8 + x1/8; + Guchar*u = update->getDataPtr() + y1*width8 + x1/8; + int yspan = y2-y1; + int xspan = (x2+7)/8 - x1/8; + int size = (y2-y1)*width8; + + if(overwrite) { + int y; + for(y=0;ygetWidth(), btm->getHeight())) + return; + + if(btm->getMode()==splashModeMono1) { + int width8 = (btm->getWidth()+7)/8; + assert(width8 == btm->getRowSize()); + int width = btm->getWidth(); + int height = btm->getHeight(); + Guchar*data = btm->getDataPtr(); + memset(data+y1*width8, 0, width8*(y2-y1)); + } else { + int width = btm->getAlphaRowSize(); + int height = btm->getHeight(); + memset(btm->getAlphaPtr(), 0, width*height); + } +} + +void BitmapOutputDev::dbg_newdata(char*newdata) +{ + if(0) { + char filename1[80]; + char filename2[80]; + char filename3[80]; + char filename4[80]; + char filename5[80]; + sprintf(filename1, "state%03dboolbitmap_after%s.png", dbg_btm_counter, newdata); + sprintf(filename2, "state%03dbooltext_after%s.png", dbg_btm_counter, newdata); + sprintf(filename3, "state%03dstalebitmap_after%s.png", dbg_btm_counter, newdata); + sprintf(filename4, "state%03dstaletext_after%s.png", dbg_btm_counter, newdata); + sprintf(filename5, "state%03dbitmap_after%s.png", dbg_btm_counter, newdata); + msg(" %s %s %s", filename1, filename2, filename5); + writeAlpha(boolpolybitmap, filename1); + writeAlpha(booltextbitmap, filename2); + writeAlpha(stalepolybitmap, filename3); + writeAlpha(staletextbitmap, filename4); + writeBitmap(rgbdev->getBitmap(), filename5); + } + dbg_btm_counter++; +} + +static void getBitmapBBox(SplashBitmap*b, int*xmin, int*ymin, int*xmax, int*ymax) +{ + int width = b->getWidth(); + int height = b->getHeight(); + int width8 = (width+7)>>3; + Guchar*pixels = b->getDataPtr(); + int x,y; + *xmin = *ymin = *xmax = *ymax = 0; + for(x=0;x>xb)) { + *xmin = x*8+xb; + break; + } + } + } + if(y=0;x--) { + int xb; + for(xb=7;xb>=0;xb--) { + for(y=0;y>xb)) { + *xmax = x*8+xb; + break; + } + } + if(y=0;y--) { + for(x=0;x Testing new text data against current bitmap data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter); + + GBool ret = false; + if(intersection(booltextbitmap, stalepolybitmap, x1,y1,x2,y2)) { + if(layerstate==STATE_PARALLEL) { + /* the new text is above the bitmap. So record that fact. */ + msg(" Text is above current bitmap/polygon data"); + layerstate=STATE_TEXT_IS_ABOVE; + update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 0); + } else if(layerstate==STATE_BITMAP_IS_ABOVE) { + /* there's a bitmap above the (old) text. So we need + to flush out that text, and record that the *new* + text is now *above* the bitmap + */ + msg(" Text is above current bitmap/polygon data (which is above some other text)"); + flushText(); + layerstate=STATE_TEXT_IS_ABOVE; + + clearBoolTextDev(); + /* re-apply the update (which we would otherwise lose) */ + update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 1); + ret = true; + } else { + /* we already know that the current text section is + above the current bitmap section- now just new + bitmap data *and* new text data was drawn, and + *again* it's above the current bitmap. */ + msg(" Text is still above current bitmap/polygon data"); + update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 0); + } + } else { + update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 0); + } + + /* clear the thing we just drew from our temporary drawing bitmap */ + clearBooleanBitmap(booltextbitmap, x1, y1, x2, y2); + +#ifdef DEBUG + if(intersection(booltextbitmap, booltextbitmap, UNKNOWN_BOUNDING_BOX)) { + msg(" Text bitmap is not empty after clear. Bad bounding box?"); + exit(1); + } + clearBooleanBitmap(booltextbitmap, UNKNOWN_BOUNDING_BOX); +#endif + return ret; +} +GBool BitmapOutputDev::checkNewBitmap(int x1, int y1, int x2, int y2) +{ + /* similar to checkNewText() above, only in reverse */ + msg(" Testing new graphics data against current text data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter); + + GBool ret = false; + if(intersection(boolpolybitmap, staletextbitmap, x1,y1,x2,y2)) { + if(layerstate==STATE_PARALLEL) { + msg(" Bitmap is above current text data"); + layerstate=STATE_BITMAP_IS_ABOVE; + update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 0); + } else if(layerstate==STATE_TEXT_IS_ABOVE) { + msg(" Bitmap is above current text data (which is above some bitmap)"); + flushBitmap(); + layerstate=STATE_BITMAP_IS_ABOVE; + clearBoolPolyDev(); + update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 1); + ret = true; + } else { + msg(" Bitmap is still above current text data"); + update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 0); + } + } else { + update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 0); + } + + /* clear the thing we just drew from our temporary drawing bitmap */ + clearBooleanBitmap(boolpolybitmap, x1, y1, x2, y2); + +#ifdef DEBUG + if(intersection(boolpolybitmap, boolpolybitmap, UNKNOWN_BOUNDING_BOX)) { + writeAlpha(boolpolybitmap, "notempty.png"); + msg(" Polygon bitmap is not empty after clear. Bad bounding box?"); + int _x1, _y1, _x2, _y2; + getBitmapBBox(boolpolybitmap, &_x1, &_y1, &_x2, &_y2); + printf("expected: %d %d %d %d <=> real: %d %d %d %d (%d,%d)\n", + x1, y1, x2, y2, _x1, _y1, _x2, _y2, movex, movey); + exit(1); + } + clearBooleanBitmap(boolpolybitmap, UNKNOWN_BOUNDING_BOX); +#endif + return ret; +} + +void scan_bitmap(SplashBitmap*bitmap) +{ + int width = bitmap->getWidth(); + int width8 = (width+7)/8; + int height = bitmap->getHeight(); + + int x,y; + int x1=width,y1=height,x2=0,y2=0; + for(y=0;ygetDataPtr() + y*width8; + for(x=0;xy2) y2=y; + int x8; + for(x8=0;x8<8;x8++) { + if((b[x]<=0;x--) { + if(b[x]) { + int x8; + for(x8=7;x8>=0;x8--) { + if((b[x]<x2) x2 = x; + break; + } + } + } + if(x1>x2 || y1>y2) { + printf("bitmap is empty\n"); + } else { + printf("bounding box of bitmap is %d,%d,%d,%d\n", x1, y1, x2, y2); + } +} + +//void checkNewText() { +// Guchar*alpha = rgbbitmap->getAlphaPtr(); +// Guchar*charpixels = clip1bitmap->getDataPtr(); +// int xx,yy; +// for(yy=0;yy>3; +// /* TODO: is the bit order correct? */ +// if(aline[xx] && (cline[bytepos]&(1<getMode()==splashModeMono1) { + int width = clip0bitmap->getWidth(); + int width8 = (width+7)/8; + int height = clip0bitmap->getHeight(); + + if(!fixBBox(&x1,&y1,&x2,&y2,width,height)) { + /* area is outside or null */ + return gFalse; + } + + SplashBitmap*clip0 = clip0bitmap; + SplashBitmap*clip1 = clip1bitmap; + int x18 = x1/8; + int x28 = (x2+7)/8; + int y; + + for(y=y1;ygetDataPtr()[width8*y+x18]; + unsigned char*row2 = &clip1bitmap->getDataPtr()[width8*y+x18]; + if(memcmp(row1, row2, x28-x18)) { + return gTrue; + } + } + return gFalse; + } else { + SplashBitmap*clip0 = clip0bitmap; + SplashBitmap*clip1 = clip1bitmap; + int width = clip0->getAlphaRowSize(); + int height = clip0->getHeight(); + + if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { + x1=y1=0;x2=y2=1; + } + + Guchar*a0 = clip0->getAlphaPtr(); + Guchar*a1 = clip1->getAlphaPtr(); + int x,y; + char differs=0; + for(y=y1;y Strange internal error (2)"); + else if(!differs && differs2) { + msg(" Bad Bounding Box: Difference in clip0 and clip1 outside bbox"); + msg(" %d %d %d %d", x1, y1, x2, y2); + } + return differs2; + } +} + +GBool compare8(unsigned char*data1, unsigned char*data2, int len) +{ + if(!len) + return 0; + if(((ptroff_t)data1&7)==((ptroff_t)data2&7)) { + // oh good, we can align both to 8 byte + while((ptroff_t)data1&7) { + if(*data1&*data2) + return 1; + data1++; + data2++; + if(!--len) + return 0; + } + } + /* use 64 bit for the (hopefully aligned) middle section */ + int l8 = len/8; + long long unsigned int*d1 = (long long unsigned int*)data1; + long long unsigned int*d2 = (long long unsigned int*)data2; + long long unsigned int x = 0; + int t; + for(t=0;tgetMode()==splashModeMono1) { + /* alternative implementation, using one bit per pixel- + needs the no-dither patch in xpdf */ + + int width = boolpoly->getWidth(); + int height = boolpoly->getHeight(); + + if(!fixBBox(&x1,&y1,&x2,&y2, width, height)) { + return gFalse; + } + + Guchar*polypixels = boolpoly->getDataPtr(); + Guchar*textpixels = booltext->getDataPtr(); + + int width8 = (width+7)/8; + int runx = width8; + int runy = height; + + if(x1|y1|x2|y2) { + polypixels+=y1*width8+x1/8; + textpixels+=y1*width8+x1/8; + runx=(x2+7)/8 - x1/8; + runy=y2-y1; + } + + int t; + unsigned char c=0; + + /*assert(sizeof(unsigned long long int)==8); + if(((ptroff_t)polypixels&7) || ((ptroff_t)textpixels&7)) { + //msg(" Non-optimal alignment"); + }*/ + + int x,y; + unsigned char*data1 = (unsigned char*)polypixels; + unsigned char*data2 = (unsigned char*)textpixels; + msg(" Testing area (%d,%d,%d,%d), runx=%d,runy=%d,state=%d", x1,y1,x2,y2, runx, runy, dbg_btm_counter); + for(y=0;ygetAlphaRowSize(); + int height = boolpoly->getHeight(); + + if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { + x1=y1=0;x2=y2=1; + } + Guchar*polypixels = boolpoly->getAlphaPtr(); + Guchar*textpixels = booltext->getAlphaPtr(); + + int x,y; + char overlap1 = 0; + char overlap2 = 0; + for(x=x1;xx?ax2:x; + ay2 = ay2>y?ay2:y; + } + } + } + } + if(overlap1 && !overlap2) + msg(" strange internal error"); + if(!overlap1 && overlap2) { + msg(" Bad bounding box: intersection outside bbox"); + msg(" given bbox: %d %d %d %d", x1, y1, x2, y2); + msg(" changed area: %d %d %d %d", ax1, ay1, ax2, ay2); + } + return overlap2; + } +} + +GBool BitmapOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) +{ + this->setPage(page); + gfxdev->setPage(page); + return gTrue; +} + +void BitmapOutputDev::beginPage(GfxState *state, int pageNum) +{ + rgbdev->startPage(pageNum, state); + boolpolydev->startPage(pageNum, state); + booltextdev->startPage(pageNum, state); + clip0dev->startPage(pageNum, state); + clip1dev->startPage(pageNum, state); + gfxdev->startPage(pageNum, state); + + boolpolybitmap = boolpolydev->getBitmap(); + stalepolybitmap = new SplashBitmap(boolpolybitmap->getWidth(), boolpolybitmap->getHeight(), 1, boolpolybitmap->getMode(), 0); + assert(stalepolybitmap->getRowSize() == boolpolybitmap->getRowSize()); + + booltextbitmap = booltextdev->getBitmap(); + staletextbitmap = new SplashBitmap(booltextbitmap->getWidth(), booltextbitmap->getHeight(), 1, booltextbitmap->getMode(), 0); + assert(staletextbitmap->getRowSize() == booltextbitmap->getRowSize()); + + msg(" startPage %dx%d (%dx%d)", this->width, this->height, booltextbitmap->getWidth(), booltextbitmap->getHeight()); + + clip0bitmap = clip0dev->getBitmap(); + clip1bitmap = clip1dev->getBitmap(); + rgbbitmap = rgbdev->getBitmap(); + + flushText(); // write out the initial clipping rectangle + + /* just in case any device did draw a white background rectangle + into the device */ + clearBoolTextDev(); + clearBoolPolyDev(); + + this->layerstate = STATE_PARALLEL; + this->emptypage = 1; + msg(" startPage done"); +} + +void BitmapOutputDev::endPage() +{ + msg(" endPage (BitmapOutputDev)"); +} +void BitmapOutputDev::finishPage() +{ + msg(" finishPage (BitmapOutputDev)"); + + flushEverything(); + gfxdev->endPage(); + flushEverything(); + + /* splash will now destroy alpha, and paint the + background color into the "holes" in the bitmap */ + boolpolydev->endPage(); + booltextdev->endPage(); + rgbdev->endPage(); + clip0dev->endPage(); + clip1dev->endPage(); +} + +GBool BitmapOutputDev::upsideDown() +{ + boolpolydev->upsideDown(); + booltextdev->upsideDown(); + clip0dev->upsideDown(); + clip1dev->upsideDown(); + return rgbdev->upsideDown(); +} + +GBool BitmapOutputDev::useDrawChar() +{ + boolpolydev->useDrawChar(); + booltextdev->useDrawChar(); + clip0dev->useDrawChar(); + clip1dev->useDrawChar(); + return rgbdev->useDrawChar(); +} + +GBool BitmapOutputDev::useTilingPatternFill() +{ + boolpolydev->useTilingPatternFill(); + booltextdev->useTilingPatternFill(); + clip0dev->useTilingPatternFill(); + clip1dev->useTilingPatternFill(); + return rgbdev->useTilingPatternFill(); +} + +GBool BitmapOutputDev::useShadedFills() +{ + boolpolydev->useShadedFills(); + booltextdev->useShadedFills(); + clip0dev->useShadedFills(); + clip1dev->useShadedFills(); + return rgbdev->useShadedFills(); +} + +GBool BitmapOutputDev::useDrawForm() +{ + boolpolydev->useDrawForm(); + booltextdev->useDrawForm(); + clip0dev->useDrawForm(); + clip1dev->useDrawForm(); + return rgbdev->useDrawForm(); +} + +GBool BitmapOutputDev::interpretType3Chars() +{ + boolpolydev->interpretType3Chars(); + booltextdev->interpretType3Chars(); + clip0dev->interpretType3Chars(); + clip1dev->interpretType3Chars(); + return rgbdev->interpretType3Chars(); +} + +GBool BitmapOutputDev::needNonText() +{ + boolpolydev->needNonText(); + booltextdev->needNonText(); + clip0dev->needNonText(); + clip1dev->needNonText(); + return rgbdev->needNonText(); +} +void BitmapOutputDev::setDefaultCTM(double *ctm) +{ + boolpolydev->setDefaultCTM(ctm); + booltextdev->setDefaultCTM(ctm); + rgbdev->setDefaultCTM(ctm); + clip0dev->setDefaultCTM(ctm); + clip1dev->setDefaultCTM(ctm); + gfxdev->setDefaultCTM(ctm); +} +void BitmapOutputDev::saveState(GfxState *state) +{ + boolpolydev->saveState(state); + booltextdev->saveState(state); + rgbdev->saveState(state); + clip0dev->saveState(state); + clip1dev->saveState(state); + + /*ClipState*cstate = new ClipState(); + cstate->next = this->clipstates; + this->clipstates = cstate;*/ +} +void BitmapOutputDev::restoreState(GfxState *state) +{ + boolpolydev->restoreState(state); + booltextdev->restoreState(state); + rgbdev->restoreState(state); + clip0dev->restoreState(state); + clip1dev->restoreState(state); + + /*if(this->clipstates) { + ClipState*old = this->clipstates; + if(old->written) { + gfxdev->restoreState(state); + } + this->clipstates = this->clipstates->next; + delete(old); + } else { + msg(" invalid restoreState()"); + }*/ +} +void BitmapOutputDev::updateAll(GfxState *state) +{ + boolpolydev->updateAll(state); + booltextdev->updateAll(state); + rgbdev->updateAll(state); + clip0dev->updateAll(state); + clip1dev->updateAll(state); + gfxdev->updateAll(state); +} +void BitmapOutputDev::updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32) +{ + boolpolydev->updateCTM(state,m11,m12,m21,m22,m31,m32); + booltextdev->updateCTM(state,m11,m12,m21,m22,m31,m32); + rgbdev->updateCTM(state,m11,m12,m21,m22,m31,m32); + clip0dev->updateCTM(state,m11,m12,m21,m22,m31,m32); + clip1dev->updateCTM(state,m11,m12,m21,m22,m31,m32); + gfxdev->updateCTM(state,m11,m12,m21,m22,m31,m32); +} +void BitmapOutputDev::updateLineDash(GfxState *state) +{ + boolpolydev->updateLineDash(state); + booltextdev->updateLineDash(state); + rgbdev->updateLineDash(state); + clip0dev->updateLineDash(state); + clip1dev->updateLineDash(state); + gfxdev->updateLineDash(state); +} +void BitmapOutputDev::updateFlatness(GfxState *state) +{ + boolpolydev->updateFlatness(state); + booltextdev->updateFlatness(state); + rgbdev->updateFlatness(state); + clip0dev->updateFlatness(state); + clip1dev->updateFlatness(state); + gfxdev->updateFlatness(state); +} +void BitmapOutputDev::updateLineJoin(GfxState *state) +{ + boolpolydev->updateLineJoin(state); + booltextdev->updateLineJoin(state); + rgbdev->updateLineJoin(state); + clip0dev->updateLineJoin(state); + clip1dev->updateLineJoin(state); + gfxdev->updateLineJoin(state); +} +void BitmapOutputDev::updateLineCap(GfxState *state) +{ + boolpolydev->updateLineCap(state); + booltextdev->updateLineCap(state); + rgbdev->updateLineCap(state); + clip0dev->updateLineCap(state); + clip1dev->updateLineCap(state); + gfxdev->updateLineCap(state); +} +void BitmapOutputDev::updateMiterLimit(GfxState *state) +{ + boolpolydev->updateMiterLimit(state); + booltextdev->updateMiterLimit(state); + rgbdev->updateMiterLimit(state); + clip0dev->updateMiterLimit(state); + clip1dev->updateMiterLimit(state); + gfxdev->updateMiterLimit(state); +} +void BitmapOutputDev::updateLineWidth(GfxState *state) +{ + boolpolydev->updateLineWidth(state); + booltextdev->updateLineWidth(state); + rgbdev->updateLineWidth(state); + clip0dev->updateLineWidth(state); + clip1dev->updateLineWidth(state); + gfxdev->updateLineWidth(state); +} +void BitmapOutputDev::updateStrokeAdjust(GfxState *state) +{ + boolpolydev->updateStrokeAdjust(state); + booltextdev->updateStrokeAdjust(state); + rgbdev->updateStrokeAdjust(state); + clip0dev->updateStrokeAdjust(state); + clip1dev->updateStrokeAdjust(state); + gfxdev->updateStrokeAdjust(state); +} +void BitmapOutputDev::updateFillColorSpace(GfxState *state) +{ + boolpolydev->updateFillColorSpace(state); + booltextdev->updateFillColorSpace(state); + rgbdev->updateFillColorSpace(state); + clip0dev->updateFillColorSpace(state); + clip1dev->updateFillColorSpace(state); + gfxdev->updateFillColorSpace(state); +} +void BitmapOutputDev::updateStrokeColorSpace(GfxState *state) +{ + boolpolydev->updateStrokeColorSpace(state); + booltextdev->updateStrokeColorSpace(state); + rgbdev->updateStrokeColorSpace(state); + clip0dev->updateStrokeColorSpace(state); + clip1dev->updateStrokeColorSpace(state); + gfxdev->updateStrokeColorSpace(state); +} +void BitmapOutputDev::updateFillColor(GfxState *state) +{ + boolpolydev->updateFillColor(state); + booltextdev->updateFillColor(state); + rgbdev->updateFillColor(state); + clip0dev->updateFillColor(state); + clip1dev->updateFillColor(state); + gfxdev->updateFillColor(state); +} +void BitmapOutputDev::updateStrokeColor(GfxState *state) +{ + boolpolydev->updateStrokeColor(state); + booltextdev->updateStrokeColor(state); + rgbdev->updateStrokeColor(state); + clip0dev->updateStrokeColor(state); + clip1dev->updateStrokeColor(state); + gfxdev->updateStrokeColor(state); +} +void BitmapOutputDev::updateBlendMode(GfxState *state) +{ + boolpolydev->updateBlendMode(state); + booltextdev->updateBlendMode(state); + rgbdev->updateBlendMode(state); + clip0dev->updateBlendMode(state); + clip1dev->updateBlendMode(state); + gfxdev->updateBlendMode(state); +} +void BitmapOutputDev::updateFillOpacity(GfxState *state) +{ + boolpolydev->updateFillOpacity(state); + booltextdev->updateFillOpacity(state); + rgbdev->updateFillOpacity(state); + clip0dev->updateFillOpacity(state); + clip1dev->updateFillOpacity(state); + gfxdev->updateFillOpacity(state); +} +void BitmapOutputDev::updateStrokeOpacity(GfxState *state) +{ + boolpolydev->updateStrokeOpacity(state); + booltextdev->updateStrokeOpacity(state); + rgbdev->updateStrokeOpacity(state); + clip0dev->updateStrokeOpacity(state); + clip1dev->updateStrokeOpacity(state); + gfxdev->updateStrokeOpacity(state); +} +void BitmapOutputDev::updateFillOverprint(GfxState *state) +{ + boolpolydev->updateFillOverprint(state); + booltextdev->updateFillOverprint(state); + rgbdev->updateFillOverprint(state); + clip0dev->updateFillOverprint(state); + clip1dev->updateFillOverprint(state); + gfxdev->updateFillOverprint(state); +} +void BitmapOutputDev::updateStrokeOverprint(GfxState *state) +{ + boolpolydev->updateStrokeOverprint(state); + booltextdev->updateStrokeOverprint(state); + rgbdev->updateStrokeOverprint(state); + clip0dev->updateStrokeOverprint(state); + clip1dev->updateStrokeOverprint(state); + gfxdev->updateStrokeOverprint(state); +} +void BitmapOutputDev::updateTransfer(GfxState *state) +{ + boolpolydev->updateTransfer(state); + booltextdev->updateTransfer(state); + rgbdev->updateTransfer(state); + clip0dev->updateTransfer(state); + clip1dev->updateTransfer(state); + gfxdev->updateTransfer(state); +} + +void BitmapOutputDev::updateFont(GfxState *state) +{ + boolpolydev->updateFont(state); + booltextdev->updateFont(state); + rgbdev->updateFont(state); + clip0dev->updateFont(state); + clip1dev->updateFont(state); + gfxdev->updateFont(state); +} +void BitmapOutputDev::updateTextMat(GfxState *state) +{ + boolpolydev->updateTextMat(state); + booltextdev->updateTextMat(state); + rgbdev->updateTextMat(state); + clip0dev->updateTextMat(state); + clip1dev->updateTextMat(state); + gfxdev->updateTextMat(state); +} +void BitmapOutputDev::updateCharSpace(GfxState *state) +{ + boolpolydev->updateCharSpace(state); + booltextdev->updateCharSpace(state); + rgbdev->updateCharSpace(state); + clip0dev->updateCharSpace(state); + clip1dev->updateCharSpace(state); + gfxdev->updateCharSpace(state); +} +void BitmapOutputDev::updateRender(GfxState *state) +{ + boolpolydev->updateRender(state); + booltextdev->updateRender(state); + rgbdev->updateRender(state); + clip0dev->updateRender(state); + clip1dev->updateRender(state); + gfxdev->updateRender(state); +} +void BitmapOutputDev::updateRise(GfxState *state) +{ + boolpolydev->updateRise(state); + booltextdev->updateRise(state); + rgbdev->updateRise(state); + clip0dev->updateRise(state); + clip1dev->updateRise(state); + gfxdev->updateRise(state); +} +void BitmapOutputDev::updateWordSpace(GfxState *state) +{ + boolpolydev->updateWordSpace(state); + booltextdev->updateWordSpace(state); + rgbdev->updateWordSpace(state); + clip0dev->updateWordSpace(state); + clip1dev->updateWordSpace(state); + gfxdev->updateWordSpace(state); +} +void BitmapOutputDev::updateHorizScaling(GfxState *state) +{ + boolpolydev->updateHorizScaling(state); + booltextdev->updateHorizScaling(state); + rgbdev->updateHorizScaling(state); + clip0dev->updateHorizScaling(state); + clip1dev->updateHorizScaling(state); + gfxdev->updateHorizScaling(state); +} +void BitmapOutputDev::updateTextPos(GfxState *state) +{ + boolpolydev->updateTextPos(state); + booltextdev->updateTextPos(state); + rgbdev->updateTextPos(state); + clip0dev->updateTextPos(state); + clip1dev->updateTextPos(state); + gfxdev->updateTextPos(state); +} +void BitmapOutputDev::updateTextShift(GfxState *state, double shift) +{ + boolpolydev->updateTextShift(state, shift); + booltextdev->updateTextShift(state, shift); + rgbdev->updateTextShift(state, shift); + clip0dev->updateTextShift(state, shift); + clip1dev->updateTextShift(state, shift); + gfxdev->updateTextShift(state, shift); +} + +gfxbbox_t BitmapOutputDev::getBBox(GfxState*state) +{ + GfxPath * path = state->getPath(); + int num = path->getNumSubpaths(); + gfxbbox_t bbox = {0,0,1,1}; + char valid=0; + int t; + for(t = 0; t < num; t++) { + GfxSubpath *subpath = path->getSubpath(t); + int subnum = subpath->getNumPoints(); + int s; + for(s=0;stransform(subpath->getX(s),subpath->getY(s),&x,&y); + if(!valid) { + bbox.xmin = x; bbox.ymin = y; + bbox.xmax = x; bbox.ymax = y; + valid = 1; + } else { + bbox.xmin = fmin(bbox.xmin, x); + bbox.ymin = fmin(bbox.ymin, y); + bbox.xmax = fmax(bbox.xmax, x); + bbox.ymax = fmax(bbox.ymax, y); + } + } + } + return bbox; +} + +void BitmapOutputDev::stroke(GfxState *state) +{ + msg(" stroke"); + boolpolydev->stroke(state); + gfxbbox_t bbox = getBBox(state); + double width = ceil(state->getTransformedLineWidth()); + bbox.xmin -= width; bbox.ymin -= width; + bbox.xmax += width; bbox.ymax += width; + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->stroke(state); + dbg_newdata("stroke"); +} + +char area_is_plain_colored(GfxState*state, SplashBitmap*boolpoly, SplashBitmap*rgbbitmap, int x1, int y1, int x2, int y2) +{ + int width = boolpoly->getWidth(); + int height = boolpoly->getHeight(); + if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { + return 0; + } + gfxcolor_t color = gfxstate_getfillcolor(state); + SplashColorPtr rgb = rgbbitmap->getDataPtr() + + (y1*width+x1)*sizeof(SplashColor); + int width8 = (width+7)/8; + unsigned char*bits = (unsigned char*)boolpoly->getDataPtr() + + (y1*width8+x1); + int x,y; + int w = x2-x1; + int h = y2-y1; + for(y=0;y fill"); + boolpolydev->fill(state); + gfxbbox_t bbox = getBBox(state); + if(config_optimizeplaincolorfills) { + if(area_is_plain_colored(state, boolpolybitmap, rgbbitmap, bbox.xmin, bbox.ymin, bbox.xmax, bbox.ymax)) { + return; + } + } + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->fill(state); + dbg_newdata("fill"); +} +void BitmapOutputDev::eoFill(GfxState *state) +{ + msg(" eoFill"); + boolpolydev->eoFill(state); + gfxbbox_t bbox = getBBox(state); + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->eoFill(state); + dbg_newdata("eofill"); +} + +POPPLER_TILING_PATERN_RETURN BitmapOutputDev::tilingPatternFill(GfxState *state, POPPLER_TILING_PATERN_GFX Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) +{ + msg(" tilingPatternFill"); + boolpolydev->tilingPatternFill(state, POPPLER_TILING_PATERN_GFX_ARG str, paintType, resDict, mat, + bbox, x0, y0, x1, y1, xStep, yStep); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + rgbdev->tilingPatternFill(state, POPPLER_TILING_PATERN_GFX_ARG str, paintType, resDict, mat, + bbox, x0, y0, x1, y1, xStep, yStep); + dbg_newdata("tilingpatternfill"); +#ifdef HAVE_POPPLER + return gTrue; +#endif +} + +GBool BitmapOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) +{ + msg(" functionShadedFill"); + boolpolydev->functionShadedFill(state, shading); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + return rgbdev->functionShadedFill(state, shading); +} + +GBool BitmapOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX) +{ + msg(" axialShadedFill"); + boolpolydev->axialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + return rgbdev->axialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); +} + +GBool BitmapOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX) +{ + msg(" radialShadedFill"); + boolpolydev->radialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + return rgbdev->radialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); +} + +SplashColor black = {0,0,0}; +SplashColor white = {255,255,255}; + +void BitmapOutputDev::clip(GfxState *state) +{ + msg(" clip"); + boolpolydev->clip(state); + booltextdev->clip(state); + rgbdev->clip(state); + clip1dev->clip(state); +} +void BitmapOutputDev::eoClip(GfxState *state) +{ + msg(" eoClip"); + boolpolydev->eoClip(state); + booltextdev->eoClip(state); + rgbdev->eoClip(state); + clip1dev->eoClip(state); +} +void BitmapOutputDev::clipToStrokePath(GfxState *state) +{ + msg(" clipToStrokePath"); + boolpolydev->clipToStrokePath(state); + booltextdev->clipToStrokePath(state); + rgbdev->clipToStrokePath(state); + clip1dev->clipToStrokePath(state); +} + +void BitmapOutputDev::beginStringOp(GfxState *state) +{ + msg(" beginStringOp"); + clip0dev->beginStringOp(state); + clip1dev->beginStringOp(state); + booltextdev->beginStringOp(state); + gfxdev->beginStringOp(state); + this->gfxdev->setDevice(this->gfxoutput_string); +} +void BitmapOutputDev::beginString(GfxState *state, GString *s) +{ + msg(" beginString"); + clip0dev->beginString(state, s); + clip1dev->beginString(state, s); + booltextdev->beginString(state, s); + gfxdev->beginString(state, s); + text_x1 = INT_MAX; + text_y1 = INT_MAX; + text_x2 = INT_MIN; + text_y2 = INT_MIN; +} + +void BitmapOutputDev::clearClips(int x1, int y1, int x2, int y2) +{ + clearBooleanBitmap(clip0bitmap, x1,y1,x2,y2); + clearBooleanBitmap(clip1bitmap, x1,y1,x2,y2); +} +void BitmapOutputDev::clearBoolPolyDev() +{ + clearBooleanBitmap(stalepolybitmap, 0, 0, stalepolybitmap->getWidth(), stalepolybitmap->getHeight()); +} +void BitmapOutputDev::clearBoolTextDev() +{ + clearBooleanBitmap(staletextbitmap, 0, 0, staletextbitmap->getWidth(), staletextbitmap->getHeight()); +} + +#define USE_GETGLYPH_BBOX + +static void getGlyphBbox(GfxState*state, SplashOutputDev*splash, double x, double y, double originX, double originY, CharCode code, int*_x1, int*_y1, int*_x2, int*_y2) +{ +#ifdef USE_GETGLYPH_BBOX + /* use getglyph to derive bounding box */ + if(splash->needFontUpdate) { + splash->doUpdateFont(state); + } + SplashGlyphBitmap glyph; + double xt,yt; + state->transform(x-originX, y-originY, &xt, &yt); + int x1 = (int)xt, x2 = (int)xt+1, y1 = (int)yt, y2 = (int)yt+1; + SplashFont*font = splash->getCurrentFont(); + int x0 = splashFloor(xt); + int xFrac = splashFloor((xt - x0) * splashFontFraction); + int y0 = splashFloor(yt); + int yFrac = splashFloor((yt - y0) * splashFontFraction); + + SplashCoord*matrix = font->getMatrix(); + + if(font && font->getGlyph(code, xFrac, yFrac, &glyph)) { + x1 = floor(x0-glyph.x); + y1 = floor(y0-glyph.y); + x2 = ceil(x0-glyph.x+glyph.w); + y2 = ceil(y0-glyph.y+glyph.h); + if (glyph.freeData) { + gfree(glyph.data); + } + } +#else + /* derive bounding box from the polygon path */ + double x0,y0; + state->transform(x-originX,y-originY,&x0,&y0); + int x1 = (int)x0, x2 = (int)x0+1, y1 = (int)y0, y2 = (int)y0+1; + SplashFont*font = clip0dev->getCurrentFont(); + SplashPath*path = font?font->getGlyphPath(code):NULL; + if(path) { + path->offset((SplashCoord)x, (SplashCoord)y); + int t; + for(t=0;tgetLength();t++) { + double xx,yy; + Guchar f; + path->getPoint(t,&xx,&yy,&f); + state->transform(xx,yy,&xx,&yy); + int px = (int)xx; + int py = (int)yy; + if(!t) { + x1=x2=px; + y1=y2=py; + } + if(xx=x2) x2=px+1; + if(yy>=y2) y2=py+1; + } + delete(path);path=0; + } +#endif + *_x1 = x1; + *_y1 = y1; + *_x2 = x2; + *_y2 = y2; +} + +void BitmapOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) +{ + msg(" drawChar render=%d", state->getRender()); + + char render_as_bitmap = 0; + + if(config_skewedtobitmap) { + if(text_matrix_is_skewed(state)) { + render_as_bitmap = 1; + } + } + if(config_alphatobitmap) { + double opaq = state->getFillOpacity(); + if(opaq < 0.9) + render_as_bitmap = 1; + } + if((state->getRender()&3)) { + render_as_bitmap = 1; + } + + if(state->getRender()&RENDER_CLIP) { + //char is, amongst others, a clipping boundary + rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + clip1dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + } else if(rgbbitmap != rgbdev->getBitmap()) { + // we're doing softmasking or transparency grouping + boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + } else { + // we're drawing a regular char + int x1, y1, x2, y2; + + /* Calculate the bbox of this character (relative to splash's coordinate + system, which is offset from our coordinate system by (-movex,-movey)) + */ + getGlyphBbox(state, boolpolydev, x, y, originX, originY, code, &x1, &y1, &x2, &y2); + + if(x1 < text_x1) text_x1 = x1; + if(y1 < text_y1) text_y1 = y1; + if(x2 > text_x2) text_x2 = x2; + if(y2 > text_y2) text_y2 = y2; + + /* only clear the area we're going to check */ + clearClips(x1,y1,x2,y2); + clip0dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + clip1dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + + int page_area_x1 = -this->movex; + int page_area_y1 = -this->movey; + int page_area_x2 = this->width-this->movex; + int page_area_y2 = this->height-this->movey; + char char_is_outside = (x1page_area_x2 || + y2>page_area_y2); + + /* if this character is affected somehow by the various clippings (i.e., it looks + different on a device without clipping), then draw it on the bitmap, not as + text */ + if(char_is_outside || render_as_bitmap || clip0and1differ(x1,y1,x2,y2)) { + + if(char_is_outside) msg(" Char %d is outside the page (%d,%d,%d,%d)", code, x1, y1, x2, y2); + else if(render_as_bitmap) msg(" Char %d needs to be rendered as bitmap", code); + else msg(" Char %d is affected by clipping", code); + + boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + checkNewBitmap(x1,y1,x2,y2); + rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + if(config_extrafontdata && render_as_bitmap) { + /* we draw invisible glyphs on top of the bitmap text for text selection. + We don't do this for clipped text, though- there's no way the pass 1 font + logic would know that the text will end up being clipped */ + int oldrender = state->getRender(); + state->setRender(3); //invisible + gfxdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + state->setRender(oldrender); + } + } else { + /* this char is not at all affected by clipping. + Now just dump out the bitmap we're currently working on, if necessary. */ + booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + gfxdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); + } + } + dbg_newdata("text"); +} +void BitmapOutputDev::drawString(GfxState *state, GString *s) +{ + msg(" internal error: drawString not implemented"); + return; +} +void BitmapOutputDev::endTextObject(GfxState *state) +{ + msg(" endTextObject"); + rgbdev->endTextObject(state); + clip0dev->endTextObject(state); + clip1dev->endTextObject(state); + booltextdev->endTextObject(state); + /* the only thing "drawn" here is clipping */ + //checkNewText(UNKNOWN_BOUNDING_BOX); + gfxdev->endTextObject(state); + dbg_newdata("endtextobject"); +} +void BitmapOutputDev::endString(GfxState *state) +{ + msg(" endString"); + clip0dev->endString(state); + clip1dev->endString(state); + booltextdev->endString(state); + gfxdev->endString(state); + dbg_newdata("endstring"); + checkNewText(text_x1,text_y1,text_x2,text_y2); + gfxdevice_record_flush(this->gfxoutput_string, this->gfxoutput, 0); + this->gfxdev->setDevice(this->gfxoutput); +} +void BitmapOutputDev::endStringOp(GfxState *state) +{ + msg(" endStringOp"); + clip0dev->endStringOp(state); + clip1dev->endStringOp(state); + booltextdev->endStringOp(state); + gfxdev->endStringOp(state); + dbg_newdata("endstringop"); +} + +/* TODO: these four operations below *should* do nothing, as type3 + chars are drawn using operations like fill() */ +GBool BitmapOutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) +{ + msg(" beginType3Char"); + /* call gfxdev so that it can generate "invisible" characters + on top of the actual graphic content, for text extraction */ + return gfxdev->beginType3Char(state, x, y, dx, dy, code, u, uLen); +} +void BitmapOutputDev::type3D0(GfxState *state, double wx, double wy) +{ + msg(" type3D0"); + return gfxdev->type3D0(state, wx, wy); +} +void BitmapOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) +{ + msg(" type3D1"); + return gfxdev->type3D1(state, wx, wy, llx, lly, urx, ury); +} +void BitmapOutputDev::endType3Char(GfxState *state) +{ + msg(" endType3Char"); + gfxdev->endType3Char(state); +} + +class CopyStream: public Object +{ + Dict*dict; + char*buf; + MemStream*memstream; + public: + CopyStream(Stream*str, int len) + { + buf = 0; + str->reset(); + if(len) { + buf = (char*)malloc(len); + int t; + for (t=0; tgetChar(); + } + str->close(); + this->dict = str->getDict(); + this->memstream = new MemStream(buf, 0, len, this); + } + ~CopyStream() + { + ::free(this->buf);this->buf = 0; + delete this->memstream; + } + Dict* getDict() {return dict;} + Stream* getStream() {return this->memstream;}; +}; + +gfxbbox_t BitmapOutputDev::getImageBBox(GfxState*state) +{ + gfxbbox_t bbox; + double x,y; + state->transform(0, 1, &x, &y); + bbox.xmin=bbox.xmax = x; + bbox.ymin=bbox.ymax = y; + state->transform(0, 0, &x, &y); + bbox.xmin=fmin(bbox.xmin,x); + bbox.ymin=fmin(bbox.ymin,y); + bbox.xmax=fmax(bbox.xmax,x); + bbox.ymax=fmax(bbox.ymax,y); + state->transform(1, 0, &x, &y); + bbox.xmin=fmin(bbox.xmin,x); + bbox.ymin=fmin(bbox.ymin,y); + bbox.xmax=fmax(bbox.xmax,x); + bbox.ymax=fmax(bbox.ymax,y); + state->transform(1, 1, &x, &y); + bbox.xmin=fmin(bbox.xmin,x); + bbox.ymin=fmin(bbox.ymin,y); + bbox.xmax=fmax(bbox.xmax,x); + bbox.ymax=fmax(bbox.ymax,y); + return bbox; +} + +GBool invalid_size(int width, int height) +{ + if((U64)width*(U64)height > 0x7fffffffll) + return 1; + return 0; +} + +void BitmapOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, POPPLER_INTERPOLATE + GBool inlineImg) +{ + msg(" drawImageMask streamkind=%d", str->getKind()); + if(invalid_size(width,height)) return; + + CopyStream*cpystr = new CopyStream(str, height * ((width + 7) / 8)); + str = cpystr->getStream(); + + boolpolydev->drawImageMask(state, ref, str, width, height, invert, POPPLER_INTERPOLATE_ARG inlineImg); + gfxbbox_t bbox = getImageBBox(state); + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->drawImageMask(state, ref, str, width, height, invert, POPPLER_INTERPOLATE_ARG inlineImg); + delete cpystr; + dbg_newdata("imagemask"); +} +void BitmapOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + int *maskColors, GBool inlineImg) +{ + msg(" drawImage streamkind=%d", str->getKind()); + if(invalid_size(width,height)) return; + + CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); + str = cpystr->getStream(); + + boolpolydev->drawImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskColors, inlineImg); + gfxbbox_t bbox=getImageBBox(state); + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->drawImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskColors, inlineImg); + delete cpystr; + dbg_newdata("image"); +} +void BitmapOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert POPPLER_MASK_INTERPOLATE) +{ + msg(" drawMaskedImage streamkind=%d", str->getKind()); + if(invalid_size(width,height)) return; + + CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); + str = cpystr->getStream(); + + boolpolydev->drawMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskInvert POPPLER_MASK_INTERPOLATE_ARG); + gfxbbox_t bbox=getImageBBox(state); + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->drawMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskInvert POPPLER_MASK_INTERPOLATE_ARG); + delete cpystr; + dbg_newdata("maskedimage"); +} +void BitmapOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap POPPLER_MASK_INTERPOLATE) +{ + msg(" drawSoftMaskedImage %dx%d (%dx%d) streamkind=%d", width, height, maskWidth, maskHeight, str->getKind()); + if(invalid_size(width,height)) return; + + CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); + str = cpystr->getStream(); + + boolpolydev->drawSoftMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskColorMap POPPLER_MASK_INTERPOLATE_ARG); + gfxbbox_t bbox=getImageBBox(state); + checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); + rgbdev->drawSoftMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskColorMap POPPLER_MASK_INTERPOLATE_ARG); + delete cpystr; + dbg_newdata("softmaskimage"); +} +void BitmapOutputDev::drawForm(Ref id) +{ + msg(" drawForm"); + boolpolydev->drawForm(id); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + rgbdev->drawForm(id); +} + +void BitmapOutputDev::processLink(Link *link, Catalog *catalog) +{ + msg(" processLink"); + gfxdev->processLink(link, catalog); +} +void BitmapOutputDev::flushEverything() +{ + if(layerstate == STATE_BITMAP_IS_ABOVE) { + this->flushText(); + this->flushBitmap(); + } else { + this->flushBitmap(); + this->flushText(); + } +} + +void BitmapOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask) +{ + msg(" beginTransparencyGroup"); +#if (xpdfMajorVersion*10000 + xpdfMinorVersion*100 + xpdfUpdateVersion) < 30207 + GfxState*state1 = state->copy(); + GfxState*state2 = state->copy(); + state1->setPath(0); + state1->setPath(state->getPath()->copy()); + state2->setPath(0); + state2->setPath(state->getPath()->copy()); +#else + GfxState*state1 = state->copy(gTrue); + GfxState*state2 = state->copy(gTrue); +#endif + boolpolydev->beginTransparencyGroup(state1, bbox, blendingColorSpace, isolated, knockout, forSoftMask); + rgbdev->beginTransparencyGroup(state2, bbox, blendingColorSpace, isolated, knockout, forSoftMask); + clip1dev->beginTransparencyGroup(state, bbox, blendingColorSpace, isolated, knockout, forSoftMask); + delete state1; + delete state2; + dbg_newdata("endtransparencygroup"); +} +void BitmapOutputDev::endTransparencyGroup(GfxState *state) +{ + msg(" endTransparencyGroup"); +#if (xpdfMajorVersion*10000 + xpdfMinorVersion*100 + xpdfUpdateVersion) < 30207 + GfxState*state1 = state->copy(); + GfxState*state2 = state->copy(); + state1->setPath(0); + state1->setPath(state->getPath()->copy()); + state2->setPath(0); + state2->setPath(state->getPath()->copy()); +#else + GfxState*state1 = state->copy(gTrue); + GfxState*state2 = state->copy(gTrue); +#endif + boolpolydev->endTransparencyGroup(state1); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + rgbdev->endTransparencyGroup(state2); + delete state1; + delete state2; + clip1dev->endTransparencyGroup(state); + dbg_newdata("endtransparencygroup"); +} +void BitmapOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) +{ + msg(" paintTransparencyGroup"); + boolpolydev->paintTransparencyGroup(state,bbox); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + rgbdev->paintTransparencyGroup(state,bbox); + clip1dev->paintTransparencyGroup(state,bbox); + dbg_newdata("painttransparencygroup"); +} +void BitmapOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor) +{ + msg(" setSoftMask"); + boolpolydev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + rgbdev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); + clip1dev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); + dbg_newdata("setsoftmask"); +} +void BitmapOutputDev::clearSoftMask(GfxState *state) +{ + msg(" clearSoftMask"); + boolpolydev->clearSoftMask(state); + checkNewBitmap(UNKNOWN_BOUNDING_BOX); + rgbdev->clearSoftMask(state); + clip1dev->clearSoftMask(state); + dbg_newdata("clearsoftmask"); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h new file mode 100644 index 000000000..3644a0eef --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h @@ -0,0 +1,236 @@ +/* BitmapOutputDev.cc + Output device which creates a bitmap. + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __BitmapOutputDev_h__ +#define __BitmapOutputDev_h__ + +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../gfxtools.h" + +#include "../../config.h" +#include "CharOutputDev.h" +#include "InfoOutputDev.h" +#include "PDFDoc.h" +#include "CommonOutputDev.h" +#include "popplercompat.h" + +struct ClipState +{ + ClipState*next; + SplashBitmap*clipbitmap; + char written; + ClipState(); +}; + +#define STATE_PARALLEL 0 +#define STATE_TEXT_IS_ABOVE 1 +#define STATE_BITMAP_IS_ABOVE 2 + +class BitmapOutputDev: public CommonOutputDev { +public: + BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); + virtual ~BitmapOutputDev(); + + virtual void dbg_newdata(char*newdata); + + // CommonOutputDev: + virtual void setDevice(gfxdevice_t*dev); + virtual void setParameter(const char*key, const char*value); + + // OutputDev: + virtual GBool upsideDown(); + virtual GBool useDrawChar(); + virtual GBool useTilingPatternFill(); + virtual GBool useShadedFills(); + virtual GBool useDrawForm(); + virtual GBool interpretType3Chars(); + virtual GBool needNonText(); + virtual void setDefaultCTM(double *ctm); + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + virtual void beginPage(GfxState *state, int pageNum); + virtual void endPage(); + virtual void finishPage(); + + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateStrokeAdjust(GfxState *state); + virtual void updateFillColorSpace(GfxState *state); + virtual void updateStrokeColorSpace(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateBlendMode(GfxState *state); + virtual void updateFillOpacity(GfxState *state); + virtual void updateStrokeOpacity(GfxState *state); + virtual void updateFillOverprint(GfxState *state); + virtual void updateStrokeOverprint(GfxState *state); + virtual void updateTransfer(GfxState *state); + virtual void updateFont(GfxState *state); + virtual void updateTextMat(GfxState *state); + virtual void updateCharSpace(GfxState *state); + virtual void updateRender(GfxState *state); + virtual void updateRise(GfxState *state); + virtual void updateWordSpace(GfxState *state); + virtual void updateHorizScaling(GfxState *state); + virtual void updateTextPos(GfxState *state); + virtual void updateTextShift(GfxState *state, double shift); + + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + virtual POPPLER_TILING_PATERN_RETURN tilingPatternFill( + GfxState *state, POPPLER_TILING_PATERN_GFX Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + + virtual GBool functionShadedFill(GfxState *state, + GfxFunctionShading *shading); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX); + + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + virtual void clipToStrokePath(GfxState *state); + + virtual void beginStringOp(GfxState *state); + virtual void endStringOp(GfxState *state); + virtual void beginString(GfxState *state, GString *s); + virtual void endString(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + virtual void drawString(GfxState *state, GString *s); + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + virtual void endTextObject(GfxState *state); + + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + POPPLER_INTERPOLATE + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert + POPPLER_MASK_INTERPOLATE); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap + POPPLER_MASK_INTERPOLATE); + + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); + + virtual void drawForm(Ref id); + + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask); + virtual void endTransparencyGroup(GfxState *state); + virtual void paintTransparencyGroup(GfxState *state, double *bbox); + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor); + virtual void clearSoftMask(GfxState *state); + + virtual void processLink(Link *link, Catalog *catalog); + + virtual void setVectorAntialias(GBool vaa); + virtual GBool getVectorAntialias(); + + +private: + void flushEverything(); + void clearClips(int x1, int y1, int x2, int y2); + void clearBoolPolyDev(); + void clearBoolTextDev(); + void flushText(); + void flushBitmap(); + GBool checkNewText(int x1, int y1, int x2, int y2); + GBool checkNewBitmap(int x1, int y1, int x2, int y2); + GBool clip0and1differ(int x1,int y1,int x2,int y2); + GBool intersection(SplashBitmap*boolpoly, SplashBitmap*booltext, int x1, int y1, int x2, int y2); + + virtual gfxbbox_t getImageBBox(GfxState*state); + virtual gfxbbox_t getBBox(GfxState*state); + + char config_extrafontdata; + char config_optimizeplaincolorfills; + char config_skewedtobitmap; + char config_alphatobitmap; + + int text_x1,text_y1,text_x2,text_y2; + + int layerstate; + GBool emptypage; + + SplashPath*bboxpath; + + SplashOutputDev*rgbdev; + SplashOutputDev*clip0dev; + SplashOutputDev*clip1dev; + SplashOutputDev*boolpolydev; + SplashOutputDev*booltextdev; + + SplashBitmap*rgbbitmap; + SplashBitmap*clip0bitmap; + SplashBitmap*clip1bitmap; + SplashBitmap*boolpolybitmap; + SplashBitmap*stalepolybitmap; + SplashBitmap*booltextbitmap; + SplashBitmap*staletextbitmap; + + gfxdevice_t* gfxoutput; + gfxdevice_t* gfxoutput_string; + CharOutputDev*gfxdev; + gfxdevice_t*dev; + + //ClipState*clipstates; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc new file mode 100644 index 000000000..ff57471ea --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc @@ -0,0 +1,1305 @@ +/* CharOutputDev.cc + implements a pdf output device (OutputDev). + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include +#include +#include + +#include "../../config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FONTCONFIG +#include +#endif + +// xpdf header files +#include "popplercompat.h" +#include "CharOutputDev.h" + +// swftools header files +#include "../os.h" +#include "../log.h" +#include "../mem.h" +#include "../utf8.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../gfxfont.h" +#include "../gfxpoly.h" +#include "../devices/record.h" +#include "../devices/ops.h" +#include "../devices/polyops.h" +#include "../devices/render.h" +#include "../png.h" + +// linked-in font data +#include "fonts.h" + +typedef struct _fontfile +{ + const char*filename; + int len; // basename length + int used; + struct _fontfile*next; +} fontfile_t; + +// for pdfswf_addfont +static fontfile_t* global_fonts = 0; +static fontfile_t* global_fonts_next = 0; + +static int fontnum = 0; + +/* config */ +struct fontentry { + const char*pdffont; + const char*filename; + char*afm; + int afmlen; + char*pfb; + int pfblen; + char*fullfilename; + DisplayFontParam *dfp; +} pdf2t1map[] ={ +{"Times-Roman", "n021003l", n021003l_afm, n021003l_afm_len, n021003l_pfb, n021003l_pfb_len}, +{"Times-Italic", "n021023l", n021023l_afm, n021023l_afm_len, n021023l_pfb, n021023l_pfb_len}, +{"Times-Bold", "n021004l", n021004l_afm, n021004l_afm_len, n021004l_pfb, n021004l_pfb_len}, +{"Times-BoldItalic", "n021024l", n021024l_afm, n021024l_afm_len, n021024l_pfb, n021024l_pfb_len}, +{"Helvetica", "n019003l", n019003l_afm, n019003l_afm_len, n019003l_pfb, n019003l_pfb_len}, +{"Helvetica-Oblique", "n019023l", n019023l_afm, n019023l_afm_len, n019023l_pfb, n019023l_pfb_len}, +{"Helvetica-Bold", "n019004l", n019004l_afm, n019004l_afm_len, n019004l_pfb, n019004l_pfb_len}, +{"Helvetica-BoldOblique", "n019024l", n019024l_afm, n019024l_afm_len, n019024l_pfb, n019024l_pfb_len}, +{"Courier", "n022003l", n022003l_afm, n022003l_afm_len, n022003l_pfb, n022003l_pfb_len}, +{"Courier-Oblique", "n022023l", n022023l_afm, n022023l_afm_len, n022023l_pfb, n022023l_pfb_len}, +{"Courier-Bold", "n022004l", n022004l_afm, n022004l_afm_len, n022004l_pfb, n022004l_pfb_len}, +{"Courier-BoldOblique", "n022024l", n022024l_afm, n022024l_afm_len, n022024l_pfb, n022024l_pfb_len}, +{"Symbol", "s050000l", s050000l_afm, s050000l_afm_len, s050000l_pfb, s050000l_pfb_len}, +{"ZapfDingbats", "d050000l", d050000l_afm, d050000l_afm_len, d050000l_pfb, d050000l_pfb_len}}; + + +typedef struct _drawnchar +{ + gfxcoord_t x,y; + int charid; + gfxcolor_t color; +} drawnchar_t; + +class CharBuffer +{ + drawnchar_t * chars; + int buf_size; + int num_chars; + +public: + + CharBuffer() + { + buf_size = 32; + chars = (drawnchar_t*)malloc(sizeof(drawnchar_t)*buf_size); + memset(chars, 0, sizeof(drawnchar_t)*buf_size); + num_chars = 0; + } + ~CharBuffer() + { + free(chars);chars = 0; + } + + void grow(int size) + { + if(size>=buf_size) { + buf_size += 32; + chars = (drawnchar_t*)realloc(chars, sizeof(drawnchar_t)*buf_size); + } + } + + void addChar(int charid, gfxcoord_t x, gfxcoord_t y, gfxcolor_t color) + { + grow(num_chars); + chars[num_chars].x = x; + chars[num_chars].y = y; + chars[num_chars].color = color; + chars[num_chars].charid = charid; + } +}; + +char* writeOutStdFont(fontentry* f) +{ + FILE*fi; + char namebuf1[512]; + char namebuf2[512]; + char* tmpFileName = mktmpname(namebuf1); + + sprintf(namebuf2, "%s.afm", tmpFileName); + fi = fopen(namebuf2, "wb"); + if(!fi) + return 0; + fwrite(f->afm, 1, f->afmlen, fi); + fclose(fi); + + sprintf(namebuf2, "%s.pfb", tmpFileName); + fi = fopen(namebuf2, "wb"); + if(!fi) + return 0; + fwrite(f->pfb, 1, f->pfblen, fi); + fclose(fi); + return strdup(namebuf2); +} +void unlinkfont(char* filename) +{ + int l; + if(!filename) + return; + msg(" Removing temporary font file %s", filename); + l=strlen(filename); + unlink(filename); + if(!strncmp(&filename[l-4],".afm",4)) { + memcpy(&filename[l-4],".pfb",4); unlink(filename); + memcpy(&filename[l-4],".pfa",4); unlink(filename); + memcpy(&filename[l-4],".afm",4); + return; + } else + if(!strncmp(&filename[l-4],".pfa",4)) { + memcpy(&filename[l-4],".afm",4); unlink(filename); + memcpy(&filename[l-4],".pfa",4); + return; + } else + if(!strncmp(&filename[l-4],".pfb",4)) { + memcpy(&filename[l-4],".afm",4); unlink(filename); + memcpy(&filename[l-4],".pfb",4); + return; + } +} + +static int config_use_fontconfig = 1; +static int fcinitcalled = 0; + +GFXGlobalParams::GFXGlobalParams() +: GlobalParams((char*)"") +{ + //setupBaseFonts(char *dir); //not tested yet +} +GFXGlobalParams::~GFXGlobalParams() +{ + msg(" Performing cleanups"); + int t; + for(t=0;t=32 && *s1<=63) s1++; + while(*s2>=32 && *s2<=63) s2++; + if(*s1!=*s2) + break; + s1++;s2++; + } + return *s1 - *s2; +} + +static char fc_ismatch(FcPattern*match, char*family, char*style) +{ + char*fcfamily=0,*fcstyle=0,*fcfullname=0,*filename=0; + FcBool scalable=FcFalse, outline=FcFalse; + FcPatternGetString(match, "family", 0, (FcChar8**)&fcfamily); + FcPatternGetString(match, "style", 0, (FcChar8**)&fcstyle); + FcPatternGetString(match, "file", 0, (FcChar8**)&filename); + FcPatternGetBool(match, "outline", 0, &outline); + FcPatternGetBool(match, "scalable", 0, &scalable); + + if(scalable!=FcTrue || outline!=FcTrue) + return 0; + + if (!stralphacmp(fcfamily, family)) { + msg(" Font %s-%s (%s) is a match for %s%s%s", fcfamily, fcstyle, filename, family, style?"-":"", style?style:""); + return 1; + } else { + //msg(" Font %s-%s (%s) is NOT a match for %s%s%s", fcfamily, fcstyle, filename, family, style?"-":"", style?style:""); + return 0; + } +} +#endif + +static inline char islowercase(char c) +{ + return (c>='a' && c<='z'); +} + +char* fontconfig_searchForFont(char*name) +{ +#ifdef HAVE_FONTCONFIG + if(!config_use_fontconfig) + return 0; + + // call init ony once + if (!fcinitcalled) { + fcinitcalled = 1; + + // check whether we have a config file + char* configfile = (char*)FcConfigFilename(0); + int configexists = 0; + FILE*fi = fopen(configfile, "rb"); + if(fi) { + configexists = 1;fclose(fi); + msg(" Initializing FontConfig (configfile=%s)", configfile); + } else { + msg(" Initializing FontConfig (no configfile)"); + } + + if(!configexists) { + /* A fontconfig instance which didn't find a configfile is unbelievably + cranky, so let's just write out a small xml file and make fontconfig + happy */ + FcConfig*c = FcConfigCreate(); + char namebuf[512]; + char* tmpFileName = mktmpname(namebuf); + FILE*fi = fopen(tmpFileName, "wb"); + fprintf(fi, "\n\n");// +#ifdef WIN32 + fprintf(fi, "WINDOWSFONTDIR\n"); +#endif + fprintf(fi, "~/.fonts\n"); +#ifdef WIN32 + fprintf(fi, "WINDOWSTEMPDIR_FONTCONFIG_CACHE\n"); +#endif + fprintf(fi, "~/.fontconfig\n"); + fprintf(fi, "\n"); + fclose(fi); + FcConfigParseAndLoad(c, (FcChar8*)tmpFileName, 1); + FcConfigBuildFonts(c); + FcConfigSetCurrent(c); + } + + if(!FcInit()) { + msg(" FontConfig Initialization failed. Disabling."); + config_use_fontconfig = 0; + return 0; + } + FcConfig * config = FcConfigGetCurrent(); + if(!config) { + msg(" FontConfig Config Initialization failed. Disabling."); + config_use_fontconfig = 0; + return 0; + } + + /* add external fonts to fontconfig's config, too. */ + fontfile_t*fd = global_fonts; + while(fd) { + FcConfigAppFontAddFile(config, (FcChar8*)fd->filename); + msg(" Adding font %s to fontconfig", fd->filename); + fd = fd->next; + } + + FcFontSet * set = FcConfigGetFonts(config, FcSetSystem); + msg(" FontConfig initialized. Found %d fonts", set?set->nfont:0); + if(!set || !set->nfont) { + msg(" FontConfig has zero fonts. Disabling."); + config_use_fontconfig = 0; + return 0; + } + + if(getLogLevel() >= LOGLEVEL_TRACE) { + int t; + int p; + for(p=0;p<2;p++) { + if(set) { + for(t=0;tnfont;t++) { + char*fcfamily=0,*fcstyle=0,*filename=0; + FcBool scalable=FcFalse, outline=FcFalse; + FcPatternGetString(set->fonts[t], "family", 0, (FcChar8**)&fcfamily); + FcPatternGetString(set->fonts[t], "style", 0, (FcChar8**)&fcstyle); + FcPatternGetString(set->fonts[t], "file", 0, (FcChar8**)&filename); + FcPatternGetBool(set->fonts[t], "outline", 0, &outline); + FcPatternGetBool(set->fonts[t], "scalable", 0, &scalable); + if(scalable && outline) { + msg(" %s (%s) -> %s", fcfamily, fcstyle, filename); + } + } + } + set = FcConfigGetFonts(config, FcSetApplication); + } + } + } + + char*family = strdup(name); + int len = strlen(family); + + const char*styles[] = {"Medium", "Regular", "Bold", "Italic", "Black", "Narrow"}; + const char*style = 0; + int t; + for(t=0;tl+1 && !strcmp(family+len-l, styles[t]) && islowercase(family[len-l-1])) { + style = styles[t]; + family[len-l]=0; + break; + } + } + if(!style) { + char*dash = strchr(family, '-'); + if(!dash) dash = strchr(family, ','); + if(dash) { + *dash = 0; + style = dash+1; + } + } + FcPattern*pattern = 0; + if(style) { + msg(" FontConfig: Looking for font %s (family=%s style=%s)", name, family, style); + pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, FC_STYLE, FcTypeString, style, NULL); + } else { + msg(" FontConfig: Looking for font %s (family=%s)", name, family); + pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, NULL); + } + pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, NULL); + + FcResult result; + FcConfigSubstitute(0, pattern, FcMatchPattern); + FcDefaultSubstitute(pattern); + + FcFontSet*set = FcFontSort(0, pattern, 1, 0, &result); + if(set) { + int t; + for(t=0;tnfont;t++) { + FcPattern*match = set->fonts[t]; + //FcPattern*match = FcFontMatch(0, pattern, &result); + if(fc_ismatch(match, family, (char*)style)) { + char*filename=0; + if(FcPatternGetString(match, "file", 0, (FcChar8**)&filename) != FcResultMatch) { + msg(" FontConfig: Couldn't get fontconfig's filename for font %s", name); + filename=0; + } + //FcPatternDestroy(match); + msg(" fontconfig: returning filename %s", filename); + free(family); + FcPatternDestroy(pattern); + FcFontSetDestroy(set); + return filename?strdup(filename):0; + } + } + } + free(family); + FcPatternDestroy(pattern); + FcFontSetDestroy(set); + return 0; +#else + return 0; +#endif +} + +static DisplayFontParamKind detectFontType(const char*filename) +{ + if(strstr(filename, ".ttf") || strstr(filename, ".TTF")) + return displayFontTT; + if(strstr(filename, ".pfa") || strstr(filename, ".PFA") || strstr(filename, ".pfb")) + return displayFontT1; + return displayFontTT; +} + +DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) +{ + msg(" looking for font %s", fontName->getCString()); + + char*name = fontName->getCString(); + + /* see if it is a pdf standard font */ + int t; + for(t=0;t Couldn't save default font- is the Temp Directory writable?"); + } else { + msg(" Storing standard PDF font %s at %s", name, pdf2t1map[t].fullfilename); + } + DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), displayFontT1); + dfp->t1.fileName = new GString(pdf2t1map[t].fullfilename); + pdf2t1map[t].dfp = dfp; + } + return pdf2t1map[t].dfp; + } + } + + int bestlen = 0x7fffffff; + const char*bestfilename = 0; + +#ifndef HAVE_FONTCONFIG + /* if we don't have fontconfig, try a simple filename-comparison approach */ + fontfile_t*f = global_fonts; + while(f) { + if(strstr(f->filename, name)) { + if(f->len < bestlen) { + bestlen = f->len; + bestfilename = f->filename; + } + } + f = f->next; + } +#endif + + /* if we didn't find anything up to now, try looking for the + font via fontconfig */ + char*filename = 0; + if(!bestfilename) { + filename = fontconfig_searchForFont(name); + } else { + filename = strdup(bestfilename); + } + + if(filename) { + msg(" Font %s maps to %s\n", name, filename); + DisplayFontParamKind kind = detectFontType(filename); + DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), kind); + if(kind == displayFontTT) { + dfp->tt.fileName = new GString(filename); + } else { + dfp->t1.fileName = new GString(filename); + } + free(filename); + return dfp; + } else { + msg(" Font %s not found\n", name); + return GlobalParams::getDisplayFont(fontName); + } +} + +CharOutputDev::CharOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) +:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) +{ + this->type3active = 0; + this->xref = 0; + this->current_text_stroke = 0; + this->current_text_clip = 0; + this->config_bigchar=0; + this->config_extrafontdata = 0; + this->config_detectspaces = 1; + this->config_space_between_lines = 0; + this->config_linkdatafile = 0; + this->page2page = 0; + this->num_pages = 0; + this->links = 0; + this->last_link = 0; +}; + +CharOutputDev::~CharOutputDev() +{ +} + +void CharOutputDev::setParameter(const char*key, const char*value) +{ + if(!strcmp(key,"detectspaces")) { + this->config_detectspaces = atoi(value); + } else if(!strcmp(key,"space_between_lines")) { + this->config_space_between_lines = atoi(value); + } else if(!strcmp(key,"extrafontdata")) { + this->config_extrafontdata = atoi(value); + } else if(!strcmp(key,"linkdatafile")) { + this->config_linkdatafile = strdup(value); + } +} + +void CharOutputDev::setDevice(gfxdevice_t*dev) +{ + this->device = dev; +} + +static char*getFontName(GfxFont*font) +{ + char*fontid; + GString*gstr = font->getName(); + char* fname = gstr==0?0:gstr->getCString(); + if(fname==0) { + char buf[32]; + Ref*r=font->getID(); + sprintf(buf, "UFONT%d", r->num); + fontid = strdup(buf); + } else { + fontid = strdup(fname); + } + + char*fontname= 0; + char* plus = strchr(fontid, '+'); + if(plus && plus < &fontid[strlen(fontid)-1]) { + fontname = strdup(plus+1); + } else { + fontname = strdup(fontid); + } + free(fontid); + return fontname; +} + +static void dumpFontInfo(const char*loglevel, GfxFont*font); +static int lastdumps[1024]; +static int lastdumppos = 0; +/* nr = 0 unknown + nr = 1 substituting + nr = 2 type 3 + */ +static void showFontError(GfxFont*font, int nr) +{ + Ref*r=font->getID(); + int t; + for(t=0;tnum) + break; + if(t < lastdumppos) + return; + if(lastdumpposnum; + if(nr == 0) + msg(" The following font caused problems:"); + else if(nr == 1) + msg(" The following font caused problems (substituting):"); + else if(nr == 2) + msg(" The following Type 3 Font will be rendered as graphics:"); + dumpFontInfo("", font); +} + +static void dumpFontInfo(const char*loglevel, GfxFont*font) +{ + char* id = getFontID(font); + char* name = getFontName(font); + Ref* r=font->getID(); + msg("%s=========== %s (ID:%d,%d) ==========", loglevel, name, r->num,r->gen); + + GString*gstr = font->getTag(); + + msg("%s| Tag: %s", loglevel, id); + + if(font->isCIDFont()) msg("%s| is CID font", loglevel); + + GfxFontType type=font->getType(); + switch(type) { + case fontUnknownType: + msg("%s| Type: unknown",loglevel); + break; + case fontType1: + msg("%s| Type: 1",loglevel); + break; + case fontType1C: + msg("%s| Type: 1C",loglevel); + break; + case fontType3: + msg("%s| Type: 3",loglevel); + break; + case fontTrueType: + msg("%s| Type: TrueType",loglevel); + break; + case fontCIDType0: + msg("%s| Type: CIDType0",loglevel); + break; + case fontCIDType0C: + msg("%s| Type: CIDType0C",loglevel); + break; + case fontCIDType2: + msg("%s| Type: CIDType2",loglevel); + break; + } + + Ref embRef; + GBool embedded = font->getEmbeddedFontID(&embRef); + char*embeddedName=0; + if(font->getEmbeddedFontName()) { + embeddedName = font->getEmbeddedFontName()->getCString(); + } + if(embedded) + msg("%s| Embedded id: %s id: %d",loglevel, FIXNULL(embeddedName), embRef.num); + + gstr = font->getExtFontFile(); + if(gstr) + msg("%s| External Font file: %s", loglevel, FIXNULL(gstr->getCString())); + + // Get font descriptor flags. + if(font->isFixedWidth()) msg("%s| is fixed width", loglevel); + if(font->isSerif()) msg("%s| is serif", loglevel); + if(font->isSymbolic()) msg("%s| is symbolic", loglevel); + if(font->isItalic()) msg("%s| is italic", loglevel); + if(font->isBold()) msg("%s| is bold", loglevel); + + free(id); + free(name); +} + +GBool CharOutputDev::needNonText() +{ + return gFalse; +} + +void CharOutputDev::endPage() +{ + msg(" endPage (GfxOutputDev)"); + + if(this->links) { + kdtree_destroy(this->links); + this->links = 0; + } + GFXLink*l = this->last_link; + while(l) { + GFXLink*last = l->last; + l->draw(this,device); + delete l; + l = last; + } + this->last_link = 0; +} + +static inline double sqr(double x) {return x*x;} + +GBool CharOutputDev::upsideDown() +{ + return gTrue; +}; +GBool CharOutputDev::useDrawChar() +{ + return gTrue; +} + +const char*renderModeDesc[]= {"fill", "stroke", "fill+stroke", "invisible", + "clip+fill", "stroke+clip", "fill+stroke+clip", "clip"}; + +static char tmp_printstr[4096]; +char* makeStringPrintable(char*str) +{ + int len = strlen(str); + int dots = 0; + if(len>=80) { + len = 80; + dots = 1; + } + int t; + for(t=0;t124) { + c = '.'; + } + tmp_printstr[t] = c; + } + if(dots) { + tmp_printstr[len++] = '.'; + tmp_printstr[len++] = '.'; + tmp_printstr[len++] = '.'; + } + tmp_printstr[len] = 0; + return tmp_printstr; +} + +void CharOutputDev::updateTextMat(GfxState*state) +{ +} + +void CharOutputDev::beginString(GfxState *state, GString *s) +{ + int render = state->getRender(); + if(current_text_stroke) { + msg(" Error: Incompatible change of text rendering to %d while inside cliptext", render); + } + msg(" beginString(%s) render=%d", makeStringPrintable(s->getCString()), render); +} + +static gfxline_t* mkEmptyGfxShape(double x, double y) +{ + gfxline_t*line = (gfxline_t*)malloc(sizeof(gfxline_t)); + line->x = x;line->y = y;line->type = gfx_moveTo;line->next = 0; + return line; +} + +void CharOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode charid, int nBytes, Unicode *_u, int uLen) +{ + FontInfo*current_fontinfo = this->info->getFontInfo(state); + + if(!current_fontinfo || (unsigned)charid >= current_fontinfo->num_glyphs || !current_fontinfo->glyphs[charid]) { + msg(" Invalid charid %d for font %p (%d characters)", charid, current_fontinfo, current_fontinfo?current_fontinfo->num_glyphs:0); + return; + } + + gfxfont_t*current_gfxfont = current_fontinfo->getGfxFont(); + if(!current_fontinfo->seen) { + dumpFontInfo("", state->getFont()); + device->addfont(device, current_gfxfont); + current_fontinfo->seen = 1; + } + + CharCode glyphid = current_fontinfo->glyphs[charid]->glyphid; + + int render = state->getRender(); + gfxcolor_t col = gfxstate_getfillcolor(state); + + GFXLink*link = 0; + if(links) { + kdarea_t*a = kdtree_find(this->links, x+dx/2,y+dy/2); + if(a) { + link = (GFXLink*)a->data; +#if 0 + if(link) { + printf("area [%d %d %d %d] (link [%f %f %f %f]) contains (%f,%f)\n", + a->bbox.xmin, a->bbox.ymin, a->bbox.xmax, a->bbox.ymax, + link->x1, link->y1, link->x2, link->y2, + x+dx/2, y+dy/2 + ); + } +#endif + } + if(link != previous_link) { + previous_link = link; + device->setparameter(device, "link", link?link->action:""); + } + } + + // check for invisible text -- this is used by Acrobat Capture + if (render == RENDER_INVISIBLE) { + col.a = 0; + if(!config_extrafontdata) + return; + } + + GfxFont*font = state->getFont(); + + if(font->getType() == fontType3) { + /* type 3 chars are passed as graphics */ + msg(" type3 char at %f/%f", x, y); + return; + } + + Unicode u = uLen?(_u[0]):0; + + gfxmatrix_t m = current_fontinfo->get_gfxmatrix(state); + this->transformXY(state, x-originX, y-originY, &m.tx, &m.ty); + + gfxbbox_t bbox; + + msg(" drawChar(%f,%f,c='%c' (%d), u=%d <%d> '%c') CID=%d render=%d glyphid=%d font=%p",m.tx,m.ty,(charid&127)>=32?charid:'?', charid, u, uLen, u, font->isCIDFont(), render, glyphid, current_gfxfont); + + int space = current_fontinfo->space_char; + if(config_extrafontdata && config_detectspaces && space>=0 && m.m00 && !m.m01) { + /* space char detection */ + //bool different_y = last_char_y - m.ty; + bool different_y = m.ty < last_char_y - last_ascent*last_char_y_fontsize + || m.ty > last_char_y + last_descent*last_char_y_fontsize; + if((!different_y || config_space_between_lines) && + !last_char_was_space) { + double expected_x = last_char_x + last_char_advance*last_char_x_fontsize; + int space = current_fontinfo->space_char; + float width = fmax(m.m00*current_fontinfo->average_advance, last_char_x_fontsize*last_average_advance); + if(different_y) { + expected_x = m.tx - width/2; + } + if(m.tx - expected_x >= width*4/10) { + msg(" There's a %f pixel gap between char %d and char %d (expected no more than %f), I'm inserting a space here", + m.tx-expected_x, + last_char, glyphid, + width*4/10 + ); +#ifdef VISUALIZE_CHAR_GAPS + bbox = gfxline_getbbox(current_gfxfont->glyphs[glyphid].line); + gfxline_t*rect = gfxline_makerectangle(last_char_x,m.ty,m.tx,m.ty+10); + gfxcolor_t red = {255,255,0,0}; + device->fill(device, rect, &red); + gfxline_free(rect); +#endif + gfxmatrix_t m2 = m; + m2.tx = expected_x + (m.tx - expected_x - current_gfxfont->glyphs[space].advance*m.m00)/2; + if(m2.tx < expected_x) m2.tx = expected_x; + device->drawchar(device, current_gfxfont, space, &col, &m2); + if(link) { + link->addchar(32); + } + } + } + last_average_advance = current_fontinfo->average_advance; + last_char_advance = current_gfxfont->glyphs[glyphid].advance; + last_char_x_fontsize = m.m00; + last_char_y_fontsize = -m.m11; + last_char = glyphid; + last_char_x = m.tx; + last_char_y = m.ty; + last_ascent = current_gfxfont->ascent; + last_descent = fmax(current_gfxfont->descent, current_gfxfont->ascent/3); + last_char_was_space = GLYPH_IS_SPACE(¤t_gfxfont->glyphs[glyphid]); + } + device->drawchar(device, current_gfxfont, glyphid, &col, &m); + + if(link) { + link->addchar(current_gfxfont->glyphs[glyphid].unicode); + } +} + +void CharOutputDev::endString(GfxState *state) +{ +} + +void CharOutputDev::endTextObject(GfxState *state) +{ +} + +/* the logic seems to be as following: + first, beginType3Char is called, with the charcode and the coordinates. + if this function returns true, it already knew about the char and has now drawn it. + if the function returns false, it's a new char, and type3D0 and/or type3D1 might be + called with some parameters. + Afterwards, all draw operations until endType3Char are part of the char (which in this moment is + at the position first passed to beginType3Char). the char ends with endType3Char. + + The drawing operations between beginType3Char and endType3Char are somewhat different to + the normal ones. For example, the fillcolor equals the stroke color. (Because the stroke + color determines the color of a font) +*/ + +GBool CharOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode charid, Unicode *u, int uLen) +{ + msg(" beginType3Char %d u=%d", charid, uLen?u[0]:0); + type3active = 1; + + if(config_extrafontdata) { + + FontInfo*current_fontinfo = info->getFontInfo(state); + if(!current_fontinfo) { + msg(" Couldn't find font info"); + return gFalse; + } + gfxfont_t*current_gfxfont = current_fontinfo->getGfxFont(); + + /*m.m00*=INTERNAL_FONT_SIZE; + m.m01*=INTERNAL_FONT_SIZE; + m.m10*=INTERNAL_FONT_SIZE; + m.m11*=INTERNAL_FONT_SIZE;*/ + + if(!current_fontinfo || (unsigned)charid >= current_fontinfo->num_glyphs || !current_fontinfo->glyphs[charid]) { + msg(" Invalid type3 charid %d for font %p", charid, current_fontinfo); + return gFalse; + } + gfxcolor_t col={0,0,0,0}; + CharCode glyphid = current_fontinfo->glyphs[charid]->glyphid; + gfxmatrix_t m = current_fontinfo->get_gfxmatrix(state); + this->transformXY(state, 0, 0, &m.tx, &m.ty); + device->drawchar(device, current_gfxfont, glyphid, &col, &m); + } + + + /* the character itself is going to be passed using the draw functions */ + return gFalse; /* gTrue= is_in_cache? */ +} + +void CharOutputDev::type3D0(GfxState *state, double wx, double wy) { +} +void CharOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) { +} + +void CharOutputDev::endType3Char(GfxState *state) +{ + type3active = 0; + msg(" endType3Char"); +} + +void CharOutputDev::beginPage(GfxState *state, int pageNum) +{ + this->currentpage = pageNum; + this->last_char_was_space = 1; + this->last_char_y = 0; + this->last_char_y_fontsize = 0; + this->last_ascent = 0; + this->last_descent = 0; + this->previous_link = 0; +} + +void GFXLink::draw(CharOutputDev*out, gfxdevice_t*dev) +{ + int x1,y1,x2,y2; + out->transformXY_stateless(this->x1, this->y1, &x1, &y1); + out->transformXY_stateless(this->x2, this->y2, &x2, &y2); + + gfxline_t points[5]; + points[0].type = gfx_moveTo; + points[0].x = x1; + points[0].y = y1; + points[0].next = &points[1]; + points[1].type = gfx_lineTo; + points[1].x = x1; + points[1].y = y2; + points[1].next = &points[2]; + points[2].type = gfx_lineTo; + points[2].x = x2; + points[2].y = y2; + points[2].next = &points[3]; + points[3].type = gfx_lineTo; + points[3].x = x2; + points[3].y = y1; + points[3].next = &points[4]; + points[4].type = gfx_lineTo; + points[4].x = x1; + points[4].y = y1; + points[4].next = 0; + msg(" drawing link %.2f/%.2f %.2f/%.2f %.2f/%.2f %.2f/%.2f to %s (\"%s\")", + points[0].x, points[0].y, + points[1].x, points[1].y, + points[2].x, points[2].y, + points[3].x, points[3].y, action, text); + + dev->drawlink(dev, points, action, text); +} + +void GFXLink::addchar(int unicode) +{ + msg(" Adding '%c' (%d) to link %s", unicode, unicode, action); + char buf[8]; + int l = writeUTF8(unicode, buf); + while(size+l+1>=buf_size) { + buf_size += 32; + text = (char*)rfx_realloc(text, buf_size); + } + strcpy(text+size, buf); + size += l; +} + +GFXLink::GFXLink(GFXLink*last, const char*action, double x1, double y1, double x2, double y2) +{ + this->buf_size = 0; + this->size = 0; + this->text = 0; + this->last = last; + this->action = strdup(action); + this->x1 = x1; + this->y1 = y1; + this->x2 = x2; + this->y2 = y2; +} + +GFXLink::~GFXLink() +{ + free((void*)this->action); + if(this->text) + free(this->text); + this->text = 0; + this->action = 0; +} + + +void CharOutputDev::processLink(Link *link, Catalog *catalog) +{ + double x1, y1, x2, y2; + + msg(" drawlink"); + + link->getRect(&x1, &y1, &x2, &y2); + + LinkAction*actionobj=link->getAction(); + char buf[128]; + char*s = 0; + const char*type = "-?-"; + char*named = 0; + int page = -1; + msg(" drawlink actionobj=%d", actionobj->getKind()); + switch(actionobj->getKind()) + { + case actionGoTo: { + type = "GoTo"; + LinkGoTo *ha=(LinkGoTo *)link->getAction(); + LinkDest *dest=NULL; + if (ha->getDest()==NULL) + dest=catalog->findDest(ha->getNamedDest()); + else + dest=ha->getDest()->copy(); + if (dest){ + if (dest->isPageRef()){ + Ref pageref=dest->getPageRef(); + page=catalog->findPage(pageref.num,pageref.gen); + } + else page=dest->getPageNum(); + sprintf(buf, "%d", page); + s = strdup(buf); + delete dest; + } + } + break; + case actionGoToR: { + type = "GoToR"; + LinkGoToR*l = (LinkGoToR*)actionobj; + GString*g = l->getFileName(); + if(g) + s = strdup(g->getCString()); + if(!s) { + /* if the GoToR link has no filename, then + try to find a refernce in the *local* + file */ + GString*g = l->getNamedDest(); + if(g) + s = strdup(g->getCString()); + } + } + break; + case actionNamed: { + type = "Named"; + LinkNamed*l = (LinkNamed*)actionobj; + GString*name = l->getName(); + if(name) { + s = strdup(name->lowerCase()->getCString()); + named = name->getCString(); + if(!strchr(s,':')) + { + if(strstr(s, "next") || strstr(s, "forward")) + { + page = currentpage + 1; + } + else if(strstr(s, "prev") || strstr(s, "back")) + { + page = currentpage - 1; + } + else if(strstr(s, "last") || strstr(s, "end")) + { + if(this->page2page && this->num_pages) { + page = this->page2page[this->num_pages-1]; + } + } + else if(strstr(s, "first") || strstr(s, "top")) + { + page = 1; + } + } + } + } + break; + case actionLaunch: { + type = "Launch"; + LinkLaunch*l = (LinkLaunch*)actionobj; + GString * str = new GString(l->getFileName()); + GString * params = l->getParams(); + if(params) + str->append(params); + s = strdup(str->getCString()); + delete str; + } + break; + case actionURI: { + char*url = 0; + type = "URI"; + LinkURI*l = (LinkURI*)actionobj; + GString*g = l->getURI(); + if(g) { + url = g->getCString(); + s = strdup(url); + } + } + break; + case actionUnknown: { + type = "Unknown"; + LinkUnknown*l = (LinkUnknown*)actionobj; + s = strdup(""); + } + break; + default: { + msg(" Unknown link type!"); + break; + } + } + + if(!s) s = strdup("-?-"); + + if(!getGfxGlobals()->linkinfo && (page || s)) + { + msg(" File contains links"); + getGfxGlobals()->linkinfo = 1; + } + + char*action = 0; + if(page>0) { + int t; + int lpage = -1; + for(t=1;t<=this->num_pages;t++) { + if(this->page2page[t]==page) { + lpage = t; + break; + } + } + if(lpage<0) { + lpage = page; + } + + char buf[80]; + sprintf(buf, "page%d", lpage); + action = buf; + } + else if(s) + { + action = s; + if(this->config_linkdatafile) { + FILE*fi = fopen(config_linkdatafile, "ab+"); + fprintf(fi, "%s\n", s); + fclose(fi); + } + } + + this->last_link = new GFXLink(this->last_link, action, x1, y1, x2, y2); + if(!this->links) { + this->links = kdtree_new(); + } + kdtree_add_box(this->links, x1,y1,x2,y2, this->last_link); +#if 0 + printf("adding link %p at %f %f %f %f to tree\n", this->last_link, x1, y1, x2, y2); +#endif + + msg(" storing \"%s\" link to \"%s\"", type, FIXNULL(action)); + free(s);s=0; +} + +void CharOutputDev::saveState(GfxState *state) { + msg(" saveState %p", state); + updateAll(state); +}; + +void CharOutputDev::restoreState(GfxState *state) +{ + updateAll(state); +} + +void CharOutputDev::updateFont(GfxState *state) +{ + GfxFont* gfxFont = state->getFont(); + if (!gfxFont) { + return; + } + + char*id = getFontID(gfxFont); + msg(" Updating font to %s", FIXNULL(id)); + free(id);id=0; + + if(gfxFont->getType() == fontType3) { + infofeature("Type3 fonts"); + } + updateTextMat(state); +} + +static const char* dirseparator() +{ +#ifdef WIN32 + return "\\"; +#else + return "/"; +#endif +} + +void addGlobalFont(const char*filename) +{ + fontfile_t* f = (fontfile_t*)malloc(sizeof(fontfile_t)); + memset(f, 0, sizeof(fontfile_t)); + f->filename = filename; + int len = strlen(filename); + char*r1 = strrchr((char*)filename, '/'); + char*r2 = strrchr((char*)filename, '\\'); + if(r2>r1) + r1 = r2; + if(r1) { + len = strlen(r1+1); + } + f->len = len; + + msg(" Adding font \"%s\".", filename); + if(global_fonts_next) { + global_fonts_next->next = f; + global_fonts_next = global_fonts_next->next; + } else { + global_fonts_next = global_fonts = f; + } +} + +void addGlobalLanguageDir(const char*dir) +{ +#ifdef HAVE_POPPLER + msg(" NOT adding %s to language pack directories (not implemented with poppler)", dir); +#else + msg(" Adding %s to language pack directories", dir); + + FILE*fi = 0; + char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc") + 1); + strcpy(config_file, dir); + strcat(config_file, dirseparator()); + strcat(config_file, "add-to-xpdfrc"); + + fi = fopen(config_file, "rb"); + if(!fi) { + msg(" Could not open %s", config_file); + return; + } + globalParams->parseFile(new GString(config_file), fi); + fclose(fi); +#endif +} + +void addGlobalFontDir(const char*dirname) +{ +#ifdef HAVE_DIRENT_H + DIR*dir = opendir(dirname); + if(!dir) { + msg(" Couldn't open directory %s", dirname); + return; + } + struct dirent*ent; + int fonts = 0; + while(1) { + ent = readdir (dir); + if (!ent) + break; + int l; + char*name = ent->d_name; + char type = 0; + if(!name) continue; + l=strlen(name); + if(l<4) + continue; + if(!strncasecmp(&name[l-4], ".pfa", 4)) + type=1; + if(!strncasecmp(&name[l-4], ".pfb", 4)) + type=3; + if(!strncasecmp(&name[l-4], ".ttf", 4)) + type=2; + if(type) { + char*fontname = (char*)malloc(strlen(dirname)+strlen(name)+2); + strcpy(fontname, dirname); + strcat(fontname, dirseparator()); + strcat(fontname, name); + addGlobalFont(fontname); + fonts++; + } + } + msg(" Added %s to font directories (%d fonts)", dirname, fonts); + closedir(dir); +#else + msg(" No dirent.h"); +#endif +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h new file mode 100644 index 000000000..d22dd536d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h @@ -0,0 +1,118 @@ +#ifndef __charoutputdev_h__ +#define __charoutputdev_h__ + +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../gfxtools.h" +#include "../kdtree.h" + +#include "InfoOutputDev.h" +#include "PDFDoc.h" +#include "GlobalParams.h" +#include "CommonOutputDev.h" + +extern void addGlobalFont(const char*filename); +extern void addGlobalLanguageDir(const char*dir); +extern void addGlobalFontDir(const char*dirname); + +class GFXLink; + +class CharOutputDev: public CommonOutputDev { +public: + gfxdevice_t* device; + + CharOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); + virtual ~CharOutputDev(); + + virtual void setDevice(gfxdevice_t*dev); + virtual void setParameter(const char*key, const char*value); + + virtual void beginPage(GfxState *state, int pageNum); + virtual void endPage(); + + virtual GBool upsideDown(); + virtual GBool useDrawChar(); + + virtual void processLink(Link *link, Catalog *catalog); + virtual void saveState(GfxState *state) ; + virtual void restoreState(GfxState *state) ; + + //----- update graphics state + virtual void updateFont(GfxState *state); + virtual void updateTextMat(GfxState *state); + + //----- text drawing + virtual void beginString(GfxState *state, GString *s) ; + virtual void endString(GfxState *state) ; + virtual void endTextObject(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + + //----- type 3 chars + virtual GBool beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); + + virtual GBool needNonText(); + + private: + + int currentpage; + int type3active; // are we between beginType3()/endType3()? + + gfxline_t* current_text_stroke; + gfxline_t* current_text_clip; + + // state variables for space char detection + int last_char; + double last_char_x; + double last_char_y; + double last_char_x_fontsize; + double last_char_y_fontsize; + double last_char_advance; + double last_average_advance; + double last_ascent; + double last_descent; + char last_char_was_space; + + GFXLink*last_link; + GFXLink*previous_link; + kdtree_t*links; + + /* config */ + int config_use_fontconfig; + int config_remapunicode; + int config_extrafontdata; + int config_bigchar; + int config_detectspaces; + int config_space_between_lines; + double config_fontquality; + char* config_linkdatafile; +}; + +class GFXLink { + double x1,y1,x2,y2; + int size; + int buf_size; + char*text; + public: + const char*action; + GFXLink*last; + void draw(CharOutputDev*out, gfxdevice_t*dev); + void addchar(int unicode); + GFXLink(GFXLink*last, const char*action, double x1, double y1, double x2, double y2); + ~GFXLink(); +}; + +class GFXGlobalParams: public GlobalParams { + public: + GFXGlobalParams(); + ~GFXGlobalParams(); + virtual DisplayFontParam *getDisplayFont(GString *fontName); +}; + +#endif //__charoutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc new file mode 100644 index 000000000..803c8aa51 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc @@ -0,0 +1,153 @@ +#include "popplercompat.h" +#include "CommonOutputDev.h" +#include "../log.h" +#include "../gfxdevice.h" + +int config_break_on_warning = 0; + +CommonOutputDev::CommonOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) +{ + this->info = info; + this->doc = doc; + this->xref = doc->getXRef(); + + if(x2user_movex = x; + this->user_movey = y; + this->user_clipx1 = x1; + this->user_clipy1 = y1; + this->user_clipx2 = x2; + this->user_clipy2 = y2; +} + +void CommonOutputDev::startPage(int pageNum, GfxState*state) +{ + double x1,y1,x2,y2; + PDFRectangle *r = this->page->getCropBox(); + state->transform(r->x1,r->y1,&x1,&y1); + state->transform(r->x2,r->y2,&x2,&y2); + if(x2movex = -(int)x1 - this->user_clipx1 + this->user_movex; + this->movey = -(int)y1 - this->user_clipy1 + this->user_movey; + + if(this->user_clipx1|this->user_clipy1|this->user_clipx2|this->user_clipy2) { + this->width = this->user_clipx2 - this->user_clipx1; + this->height = this->user_clipy2 - this->user_clipy1; + } else { + this->width = x2-x1; + this->height = y2-y1; + } + beginPage(state, pageNum); +} + +void CommonOutputDev::transformXY(GfxState*state, double x, double y, double*nx, double*ny) +{ + state->transform(x,y,nx,ny); + *nx += movex; + *ny += movey; +} +void CommonOutputDev::transformXY_stateless(double x, double y, int*xout, int*yout) +{ + cvtUserToDev(x, y, xout, yout); + *xout += movex; + *yout += movey; +} + +GBool CommonOutputDev::interpretType3Chars() +{ + return gTrue; +} + +GFXOutputGlobals::GFXOutputGlobals() +{ + this->featurewarnings = 0; + this->jpeginfo = 0; + this->textmodeinfo = 0; + this->linkinfo = 0; + this->pbminfo = 0; +} +GFXOutputGlobals::~GFXOutputGlobals() +{ + feature_t*f = this->featurewarnings; + while(f) { + feature_t*next = f->next; + if(f->string) { + free(f->string);f->string =0; + } + f->next = 0; + free(f); + f = next; + } + this->featurewarnings = 0; +} + +static GFXOutputGlobals*gfxglobals=0; + +static void showfeature(const char*feature, char fully, char warn) +{ + if(!gfxglobals) + gfxglobals = new GFXOutputGlobals(); + + feature_t*f = gfxglobals->featurewarnings; + while(f) { + if(!strcmp(feature, f->string)) + return; + f = f->next; + } + f = (feature_t*)malloc(sizeof(feature_t)); + f->string = strdup(feature); + f->next = gfxglobals->featurewarnings; + gfxglobals->featurewarnings = f; + if(warn) { + msg(" %s not yet %ssupported!",feature,fully?"fully ":""); + } else { + msg(" File contains %s",feature); + } +} +void warnfeature(const char*feature,char fully) +{ + showfeature(feature,fully,1); + if(config_break_on_warning) { + msg(" Aborting conversion due to unsupported feature"); + exit(1); + } +} +void infofeature(const char*feature) +{ + showfeature(feature,0,0); +} +GFXOutputGlobals* getGfxGlobals() +{ + if(!gfxglobals) + gfxglobals = new GFXOutputGlobals(); + return gfxglobals; +} + +gfxcolor_t gfxstate_getfillcolor(GfxState * state) +{ + GfxRGB rgb; + double opaq = state->getFillOpacity(); + state->getFillRGB(&rgb); + gfxcolor_t col; + col.r = colToByte(rgb.r); + col.g = colToByte(rgb.g); + col.b = colToByte(rgb.b); + col.a = (unsigned char)(opaq*255); + return col; +} + +bool text_matrix_is_skewed(GfxState * state) +{ + double*ctm = state->getCTM(); + double*tm = state->getTextMat(); + double m00 = ctm[0]*tm[0] + ctm[2]*tm[1]; + double m01 = ctm[1]*tm[0] + ctm[3]*tm[1]; + double m10 = ctm[0]*tm[2] + ctm[2]*tm[3]; + double m11 = ctm[1]*tm[2] + ctm[3]*tm[3]; + return (m00<0 || m10<0); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h new file mode 100644 index 000000000..db2f4d804 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h @@ -0,0 +1,109 @@ +/* InfoOutputDev.h + Superclass for BitmapOutputDev, GFXOutputDev etc. + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __commonoutputdev_h__ +#define __commonoutputdev_h__ + +#include "OutputDev.h" +#include "InfoOutputDev.h" +#include "../gfxdevice.h" + +#define RENDER_FILL 0 +#define RENDER_STROKE 1 +#define RENDER_FILLSTROKE 2 +#define RENDER_INVISIBLE 3 +#define RENDER_CLIP 4 + +typedef struct _feature +{ + char*string; + struct _feature*next; +} feature_t; + +class GFXOutputGlobals { +public: + feature_t*featurewarnings; + + int textmodeinfo; // did we write "Text will be rendered as polygon" yet? + int jpeginfo; // did we write "File contains jpegs" yet? + int pbminfo; // did we write "File contains jpegs" yet? + int linkinfo; // did we write "File contains links" yet? + + GFXOutputGlobals(); + ~GFXOutputGlobals(); +}; +extern GFXOutputGlobals* getGfxGlobals(); + +extern void warnfeature(const char*feature,char fully); +extern void infofeature(const char*feature); + +gfxcolor_t gfxstate_getfillcolor(GfxState * state); +bool text_matrix_is_skewed(GfxState * state); + +class CommonOutputDev: public OutputDev +{ + public: + CommonOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); + + virtual void setDevice(gfxdevice_t*dev) = 0; + virtual void setParameter(const char*key, const char*value) = 0; + + virtual void startPage(int pageNum, GfxState*state); + virtual void beginPage(GfxState*state, int page) = 0; + + virtual void setPage(Page *page) { this->page = page; } + virtual void finishPage() {}; + + void transformXY(GfxState*state, double x, double y, double*nx, double*ny); + void transformXY_stateless(double x, double y, int*xout, int*yout); + + virtual GBool interpretType3Chars(); + + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL) + { + this->setPage(page); + return gTrue; + } + + protected: + Page *page; + PDFDoc* doc; + XRef* xref; + InfoOutputDev* info; + + /* if set, will use a user bounding box instead of the PDF's bounding box */ + int user_movex,user_movey; + int user_clipx1,user_clipx2,user_clipy1,user_clipy2; + + /* movex,movey is the upper left corner of clipping rectangle (cropbox)- + this needs to be added to all drawing coordinates to give the + impression that all pages start at (0,0)*/ + int movex, movey; + int width, height; + + /* for page mapping */ + int* page2page; + int num_pages; +}; +#endif //__deviceinterface_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc new file mode 100644 index 000000000..8faaa0b1f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc @@ -0,0 +1,575 @@ +/* FullBitmapOutputDev.cc + + Output Device which creates a bitmap. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include "FullBitmapOutputDev.h" +#include "CharOutputDev.h" + +#ifdef HAVE_POPPLER + #include "splash/SplashBitmap.h" + #include "splash/SplashPattern.h" + #include "splash/Splash.h" +#else + #include "xpdf/config.h" + #include "SplashBitmap.h" + #include "SplashPattern.h" + #include "Splash.h" +#endif + +#include "../log.h" +#include "../png.h" +#include "../devices/record.h" + +static SplashColor splash_white = {255,255,255}; +static SplashColor splash_black = {0,0,0}; + +FullBitmapOutputDev::FullBitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) +:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) +{ + this->doc = doc; + this->xref = doc->getXRef(); + + msg(" Rendering everything to a bitmap"); + + /* color graphic output device, for creating bitmaps */ + this->rgbdev = new SplashOutputDev(splashModeRGB8, 1, gFalse, splash_white, gTrue, gTrue); + + /* device for handling links */ + this->gfxdev = new CharOutputDev(info, this->doc, page2page, num_pages, x, y, x1, y1, x2, y2); + + this->rgbdev->startDoc(this->xref); +} +FullBitmapOutputDev::~FullBitmapOutputDev() +{ + if(this->rgbdev) { + delete this->rgbdev;this->rgbdev = 0; + } + if(this->gfxdev) { + delete this->gfxdev;this->gfxdev= 0; + } +} + +GBool FullBitmapOutputDev::getVectorAntialias() +{ + return this->rgbdev->getVectorAntialias(); +} +void FullBitmapOutputDev::setVectorAntialias(GBool vaa) +{ + this->rgbdev->setVectorAntialias(vaa); +} +void FullBitmapOutputDev::setDevice(gfxdevice_t*dev) +{ + this->dev = dev; + gfxdev->setDevice(dev); +} + +void FullBitmapOutputDev::setParameter(const char*key, const char*value) +{ +} +static void getBitmapBBox(Guchar*alpha, int width, int height, int*xmin, int*ymin, int*xmax, int*ymax) +{ + *ymin = -1; + *xmin = width; + *xmax = 0; + int x,y; + for(y=0;y*xmax) *xmax = right; + } + } + if(*xmin>=*xmax || *ymin>=*ymax) { + *xmin = 0; + *ymin = 0; + *xmax = 0; + *ymax = 0; + } +} + +void FullBitmapOutputDev::flushBitmap() +{ + int width = rgbdev->getBitmapWidth(); + int height = rgbdev->getBitmapHeight(); + + SplashColorPtr rgb = rgbdev->getBitmap()->getDataPtr(); + Guchar*alpha = rgbdev->getBitmap()->getAlphaPtr(); + + int xmin,ymin,xmax,ymax; + getBitmapBBox(alpha, width, height, &xmin,&ymin,&xmax,&ymax); + + /* clip against (-movex, -movey, -movex+width, -movey+height) */ + if(xmin < -this->movex) xmin = -this->movex; + if(ymin < -this->movey) ymin = -this->movey; + if(xmax > -this->movex + width) xmax = -this->movex+this->width; + if(ymax > -this->movey + height) ymax = -this->movey+this->height; + + msg(" Flushing bitmap (bbox: %d,%d,%d,%d)", xmin,ymin,xmax,ymax); + + if((xmax-xmin)<=0 || (ymax-ymin)<=0) // no bitmap, nothing to do + return; + + if(sizeof(SplashColor)!=3) { + msg(" sizeof(SplashColor)!=3"); + return; + } + //xmin = ymin = 0; + //xmax = width; + //ymax = height; + + int rangex = xmax-xmin; + int rangey = ymax-ymin; + gfximage_t*img = (gfximage_t*)malloc(sizeof(gfximage_t)); + img->data = (gfxcolor_t*)malloc(rangex * rangey * 4); + img->width = rangex; + img->height = rangey; + int x,y; + for(y=0;ydata[y*rangex]; + Guchar*ain = &alpha[(y+ymin)*width+xmin]; + for(x=0;xfillbitmap(dev, line, img, &m, 0); + gfxline_free(line); + + free(img->data);img->data=0;free(img);img=0; +} + +GBool FullBitmapOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) +{ + this->setPage(page); + gfxdev->setPage(page); + return gTrue; +} + +void FullBitmapOutputDev::beginPage(GfxState *state, int pageNum) +{ + msg(" startPage"); + rgbdev->startPage(pageNum, state); + gfxdev->startPage(pageNum, state); +} + +void FullBitmapOutputDev::endPage() +{ + msg(" endPage (FullBitmapOutputDev)"); + flushBitmap(); + rgbdev->endPage(); + gfxdev->endPage(); +} +GBool FullBitmapOutputDev::upsideDown() +{ + return rgbdev->upsideDown(); +} +GBool FullBitmapOutputDev::useDrawChar() +{ + return rgbdev->useDrawChar(); +} +GBool FullBitmapOutputDev::useTilingPatternFill() +{ + return rgbdev->useTilingPatternFill(); +} +GBool FullBitmapOutputDev::useShadedFills() +{ + return rgbdev->useShadedFills(); +} +GBool FullBitmapOutputDev::useDrawForm() +{ + return rgbdev->useDrawForm(); +} +GBool FullBitmapOutputDev::interpretType3Chars() +{ + return rgbdev->interpretType3Chars(); +} +GBool FullBitmapOutputDev::needNonText() +{ + return rgbdev->needNonText(); +} +void FullBitmapOutputDev::setDefaultCTM(double *ctm) +{ + rgbdev->setDefaultCTM(ctm); + gfxdev->setDefaultCTM(ctm); +} +void FullBitmapOutputDev::saveState(GfxState *state) +{ + rgbdev->saveState(state); +} +void FullBitmapOutputDev::restoreState(GfxState *state) +{ + rgbdev->restoreState(state); +} +void FullBitmapOutputDev::updateAll(GfxState *state) +{ + rgbdev->updateAll(state); +} +void FullBitmapOutputDev::updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32) +{ + rgbdev->updateCTM(state,m11,m12,m21,m22,m31,m32); + gfxdev->updateCTM(state,m11,m12,m21,m22,m31,m32); +} +void FullBitmapOutputDev::updateLineDash(GfxState *state) +{ + rgbdev->updateLineDash(state); +} +void FullBitmapOutputDev::updateFlatness(GfxState *state) +{ + rgbdev->updateFlatness(state); +} +void FullBitmapOutputDev::updateLineJoin(GfxState *state) +{ + rgbdev->updateLineJoin(state); +} +void FullBitmapOutputDev::updateLineCap(GfxState *state) +{ + rgbdev->updateLineCap(state); +} +void FullBitmapOutputDev::updateMiterLimit(GfxState *state) +{ + rgbdev->updateMiterLimit(state); +} +void FullBitmapOutputDev::updateLineWidth(GfxState *state) +{ + rgbdev->updateLineWidth(state); +} +void FullBitmapOutputDev::updateStrokeAdjust(GfxState *state) +{ + rgbdev->updateStrokeAdjust(state); +} +void FullBitmapOutputDev::updateFillColorSpace(GfxState *state) +{ + rgbdev->updateFillColorSpace(state); +} +void FullBitmapOutputDev::updateStrokeColorSpace(GfxState *state) +{ + rgbdev->updateStrokeColorSpace(state); +} +void FullBitmapOutputDev::updateFillColor(GfxState *state) +{ + rgbdev->updateFillColor(state); +} +void FullBitmapOutputDev::updateStrokeColor(GfxState *state) +{ + rgbdev->updateStrokeColor(state); +} +void FullBitmapOutputDev::updateBlendMode(GfxState *state) +{ + rgbdev->updateBlendMode(state); +} +void FullBitmapOutputDev::updateFillOpacity(GfxState *state) +{ + rgbdev->updateFillOpacity(state); +} +void FullBitmapOutputDev::updateStrokeOpacity(GfxState *state) +{ + rgbdev->updateStrokeOpacity(state); +} +void FullBitmapOutputDev::updateFillOverprint(GfxState *state) +{ + rgbdev->updateFillOverprint(state); +} +void FullBitmapOutputDev::updateStrokeOverprint(GfxState *state) +{ + rgbdev->updateStrokeOverprint(state); +} +void FullBitmapOutputDev::updateTransfer(GfxState *state) +{ + rgbdev->updateTransfer(state); +} +void FullBitmapOutputDev::updateFont(GfxState *state) +{ + rgbdev->updateFont(state); +} +void FullBitmapOutputDev::updateTextMat(GfxState *state) +{ + rgbdev->updateTextMat(state); +} +void FullBitmapOutputDev::updateCharSpace(GfxState *state) +{ + rgbdev->updateCharSpace(state); +} +void FullBitmapOutputDev::updateRender(GfxState *state) +{ + rgbdev->updateRender(state); +} +void FullBitmapOutputDev::updateRise(GfxState *state) +{ + rgbdev->updateRise(state); +} +void FullBitmapOutputDev::updateWordSpace(GfxState *state) +{ + rgbdev->updateWordSpace(state); +} +void FullBitmapOutputDev::updateHorizScaling(GfxState *state) +{ + rgbdev->updateHorizScaling(state); +} +void FullBitmapOutputDev::updateTextPos(GfxState *state) +{ + rgbdev->updateTextPos(state); +} +void FullBitmapOutputDev::updateTextShift(GfxState *state, double shift) +{ + rgbdev->updateTextShift(state, shift); +} + +void FullBitmapOutputDev::stroke(GfxState *state) +{ + msg(" stroke"); + rgbdev->stroke(state); +} +void FullBitmapOutputDev::fill(GfxState *state) +{ + msg(" fill"); + rgbdev->fill(state); +} +void FullBitmapOutputDev::eoFill(GfxState *state) +{ + msg(" eoFill"); + rgbdev->eoFill(state); +} +POPPLER_TILING_PATERN_RETURN FullBitmapOutputDev::tilingPatternFill(GfxState *state, POPPLER_TILING_PATERN_GFX + Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) +{ + msg(" tilingPatternFill"); +#ifdef HAVE_POPPLER + return +#endif + rgbdev->tilingPatternFill(state, POPPLER_TILING_PATERN_GFX_ARG str, paintType, resDict, mat, bbox, x0, y0, x1, y1, xStep, yStep); +} + +GBool FullBitmapOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) +{ + msg(" functionShadedFill"); + return rgbdev->functionShadedFill(state, shading); +} +GBool FullBitmapOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX) +{ + msg(" axialShadedFill"); + return rgbdev->axialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); +} +GBool FullBitmapOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX) +{ + msg(" radialShadedFill"); + return rgbdev->radialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); +} + +void FullBitmapOutputDev::clip(GfxState *state) +{ + msg(" clip"); + rgbdev->clip(state); +} +void FullBitmapOutputDev::eoClip(GfxState *state) +{ + msg(" eoClip"); + rgbdev->eoClip(state); +} +void FullBitmapOutputDev::clipToStrokePath(GfxState *state) +{ + msg(" clipToStrokePath"); + rgbdev->clipToStrokePath(state); +} + +void FullBitmapOutputDev::beginStringOp(GfxState *state) +{ + msg(" beginStringOp"); + rgbdev->beginStringOp(state); +} +void FullBitmapOutputDev::endStringOp(GfxState *state) +{ + msg(" endStringOp"); + rgbdev->endStringOp(state); +} +void FullBitmapOutputDev::beginString(GfxState *state, GString *s) +{ + msg(" beginString"); + rgbdev->beginString(state, s); +} +void FullBitmapOutputDev::endString(GfxState *state) +{ + msg(" endString"); + rgbdev->endString(state); +} +void FullBitmapOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) +{ + msg(" drawChar"); + rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); +} +void FullBitmapOutputDev::drawString(GfxState *state, GString *s) +{ + msg(" internal error: drawString not implemented"); + rgbdev->drawString(state, s); +} +void FullBitmapOutputDev::endTextObject(GfxState *state) +{ + /* FIXME: the below might render things (stroke outlines etc.) to gfxdev which + might end up unflushed- should be handled similarily as + drawChar() above + */ + msg(" endTextObject"); + rgbdev->endTextObject(state); +} + +/* TODO: these four operations below *should* do nothing, as type3 + chars are drawn using operations like fill() */ +GBool FullBitmapOutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) +{ + msg(" beginType3Char"); + return rgbdev->beginType3Char(state, x, y, dx, dy, code, u, uLen); +} +void FullBitmapOutputDev::type3D0(GfxState *state, double wx, double wy) +{ + msg(" type3D0"); + rgbdev->type3D0(state, wx, wy); +} +void FullBitmapOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) +{ + msg(" type3D1"); + rgbdev->type3D1(state, wx, wy, llx, lly, urx, ury); +} +void FullBitmapOutputDev::endType3Char(GfxState *state) +{ + msg(" endType3Char"); + rgbdev->endType3Char(state); +} +void FullBitmapOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, POPPLER_INTERPOLATE + GBool inlineImg) +{ + msg(" drawImageMask"); + rgbdev->drawImageMask(state, ref, str, width, height, invert, POPPLER_INTERPOLATE_ARG inlineImg); +} +void FullBitmapOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, POPPLER_INTERPOLATE + int *maskColors, GBool inlineImg) +{ + msg(" drawImage"); + rgbdev->drawImage(state, ref, str, width, height, colorMap, + POPPLER_INTERPOLATE_ARG maskColors, inlineImg); +} +void FullBitmapOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, POPPLER_INTERPOLATE + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert POPPLER_MASK_INTERPOLATE) +{ + msg(" drawMaskedImage"); + rgbdev->drawMaskedImage(state, ref, str, width, height, colorMap, + POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, + maskInvert POPPLER_MASK_INTERPOLATE_ARG); +} +void FullBitmapOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, POPPLER_INTERPOLATE + Stream *maskStr, int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap POPPLER_MASK_INTERPOLATE) +{ + msg(" drawSoftMaskedImage"); + rgbdev->drawSoftMaskedImage(state, ref, str, width, height, colorMap, + POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, + maskColorMap POPPLER_MASK_INTERPOLATE_ARG); +} +void FullBitmapOutputDev::drawForm(Ref id) +{ + msg(" drawForm"); + rgbdev->drawForm(id); +} + +void FullBitmapOutputDev::processLink(Link *link, Catalog *catalog) +{ + msg(" processLink"); + gfxdev->processLink(link, catalog); +} + +void FullBitmapOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask) +{ + msg(" beginTransparencyGroup"); + rgbdev->beginTransparencyGroup(state, bbox, blendingColorSpace, isolated, knockout, forSoftMask); +} +void FullBitmapOutputDev::endTransparencyGroup(GfxState *state) +{ + msg(" endTransparencyGroup"); + rgbdev->endTransparencyGroup(state); +} +void FullBitmapOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) +{ + msg(" paintTransparencyGroup"); + rgbdev->paintTransparencyGroup(state,bbox); +} +void FullBitmapOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor) +{ + msg(" setSoftMask"); + rgbdev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); +} +void FullBitmapOutputDev::clearSoftMask(GfxState *state) +{ + msg(" clearSoftMask"); + rgbdev->clearSoftMask(state); +} + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h new file mode 100644 index 000000000..d9eb5435e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h @@ -0,0 +1,187 @@ +/* FullBitmapOutputDev.cc + Output device which creates a bitmap. + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __FullBitmapOutputDev_h__ +#define __FullBitmapOutputDev_h__ + +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../gfxtools.h" + +#include "../../config.h" +#include "CharOutputDev.h" +#include "InfoOutputDev.h" +#include "PDFDoc.h" +#include "CommonOutputDev.h" + +#define STATE_PARALLEL 0 +#define STATE_TEXT_IS_ABOVE 1 +#define STATE_BITMAP_IS_ABOVE 2 + +class FullBitmapOutputDev: public CommonOutputDev { +public: + FullBitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); + virtual ~FullBitmapOutputDev(); + + // CommonOutputDev: + virtual void setDevice(gfxdevice_t*dev); + virtual void setParameter(const char*key, const char*value); + + // OutputDev: + virtual GBool upsideDown(); + virtual GBool useDrawChar(); + virtual GBool useTilingPatternFill(); + virtual GBool useShadedFills(); + virtual GBool useDrawForm(); + virtual GBool interpretType3Chars(); + virtual GBool needNonText(); + virtual void setDefaultCTM(double *ctm); + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + virtual void beginPage(GfxState *state, int pageNum); + virtual void endPage(); + + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateStrokeAdjust(GfxState *state); + virtual void updateFillColorSpace(GfxState *state); + virtual void updateStrokeColorSpace(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateBlendMode(GfxState *state); + virtual void updateFillOpacity(GfxState *state); + virtual void updateStrokeOpacity(GfxState *state); + virtual void updateFillOverprint(GfxState *state); + virtual void updateStrokeOverprint(GfxState *state); + virtual void updateTransfer(GfxState *state); + virtual void updateFont(GfxState *state); + virtual void updateTextMat(GfxState *state); + virtual void updateCharSpace(GfxState *state); + virtual void updateRender(GfxState *state); + virtual void updateRise(GfxState *state); + virtual void updateWordSpace(GfxState *state); + virtual void updateHorizScaling(GfxState *state); + virtual void updateTextPos(GfxState *state); + virtual void updateTextShift(GfxState *state, double shift); + + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + virtual POPPLER_TILING_PATERN_RETURN tilingPatternFill(GfxState *state, + POPPLER_TILING_PATERN_GFX Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + + virtual GBool functionShadedFill(GfxState *state, + GfxFunctionShading *shading); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX); + + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + virtual void clipToStrokePath(GfxState *state); + + virtual void beginStringOp(GfxState *state); + virtual void endStringOp(GfxState *state); + virtual void beginString(GfxState *state, GString *s); + virtual void endString(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + virtual void drawString(GfxState *state, GString *s); + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + virtual void endTextObject(GfxState *state); + + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + POPPLER_INTERPOLATE + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert + POPPLER_MASK_INTERPOLATE); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap + POPPLER_MASK_INTERPOLATE); + + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); + + virtual void drawForm(Ref id); + + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask); + virtual void endTransparencyGroup(GfxState *state); + virtual void paintTransparencyGroup(GfxState *state, double *bbox); + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor); + virtual void clearSoftMask(GfxState *state); + + virtual void processLink(Link *link, Catalog *catalog); + + virtual void setVectorAntialias(GBool vaa); + virtual GBool getVectorAntialias(); + + +private: + void flushBitmap(); + char config_extrafontdata; + SplashOutputDev*rgbdev; + + CharOutputDev*gfxdev; + gfxdevice_t*dev; +}; + +#endif + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc new file mode 100644 index 000000000..53ffc75cf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc @@ -0,0 +1,965 @@ +#include "../../config.h" +#include "Object.h" +#include "InfoOutputDev.h" +#include "SplashOutputDev.h" +#include "GfxState.h" +#include "CommonOutputDev.h" +#include "../log.h" +#include "../types.h" +#include "../q.h" +#include "../gfxdevice.h" +#include "../gfxfont.h" +#include +#include + +int config_unique_unicode = 1; +int config_poly2bitmap_pass1 = 0; +int config_skewedtobitmap_pass1 = 0; +int config_addspace = 1; +int config_fontquality = 10; +int config_bigchar = 0; +int config_marker_glyph = 0; +int config_normalize_fonts = 0; +int config_remove_font_transforms = 0; +int config_remove_invisible_outlines = 0; + +static void* fontclass_clone(const void*_m) { + if(_m==0) + return 0; + const fontclass_t*m1=(const fontclass_t*)_m; + fontclass_t*m2 = (fontclass_t*)malloc(sizeof(fontclass_t)); + *m2 = *m1; + m2->id = strdup(m1->id); + return m2; +} +static unsigned int fontclass_hash(const void*_m) { + if(!_m) + return 0; + const fontclass_t*m = (fontclass_t*)_m; + unsigned int h=0; + if(config_remove_font_transforms) { + U32 m00 = (*(U32*)&m->m00)&0xfff00000; + U32 m01 = (*(U32*)&m->m01)&0xfff00000; + U32 m10 = (*(U32*)&m->m10)&0xfff00000; + U32 m11 = (*(U32*)&m->m11)&0xfff00000; + h = crc32_add_bytes(h, (char*)&m00, sizeof(m00)); + h = crc32_add_bytes(h, (char*)&m01, sizeof(m01)); + h = crc32_add_bytes(h, (char*)&m10, sizeof(m10)); + h = crc32_add_bytes(h, (char*)&m11, sizeof(m11)); + } + if(config_remove_invisible_outlines) { + h = crc32_add_bytes(h, (char*)&m->alpha, 1); + } + return crc32_add_string(h, m->id); +} +static void fontclass_destroy(void*_m) { + fontclass_t*m = (fontclass_t*)_m; + free(m->id);m->id=0; + free(m); +} +static char fontclass_equals(const void*_m1, const void*_m2) { + const fontclass_t*m1=(const fontclass_t*)_m1; + const fontclass_t*m2=(const fontclass_t*)_m2; + if(!m1 || !m2) + return m1==m2; + + if(config_remove_font_transforms) { + /* we do a binary comparison of the float32 + bits here instead of a numerical comparison + to prevent the compiler from e.g. removing the + (float) cast during optimization, which would break + the equivalence between equals() and hash() (as + the hash is derived from the float32 values) */ + if(((*(U32*)&m1->m00 ^ *(U32*)&m2->m00)&0xfff00000) || + ((*(U32*)&m1->m01 ^ *(U32*)&m2->m01)&0xfff00000) || + ((*(U32*)&m1->m10 ^ *(U32*)&m2->m10)&0xfff00000) || + ((*(U32*)&m1->m11 ^ *(U32*)&m2->m11)&0xfff00000)) + return 0; + } + if(config_remove_invisible_outlines) { + if(m1->alpha != m2->alpha) + return 0; + } + return !strcmp(m1->id, m2->id); +} + +static type_t fontclass_type = { + fontclass_equals, + fontclass_hash, + fontclass_clone, + fontclass_destroy +}; + +InfoOutputDev::InfoOutputDev(XRef*xref) +{ + num_links = 0; + num_jpeg_images = 0; + num_ppm_images = 0; + num_chars = 0; + num_fonts = 0; + num_polygons= 0; + num_layers = 0; + num_text_breaks = 0; + currentglyph = 0; + previous_was_char = 0; + SplashColor white = {255,255,255}; + splash = new SplashOutputDev(splashModeRGB8,320,0,white,0,0); + splash->startDoc(xref); + last_font = 0; + current_type3_font = 0; + fontcache = dict_new2(&fontclass_type); +} +InfoOutputDev::~InfoOutputDev() +{ + GHashIter*i; + + DICT_ITERATE_DATA(this->fontcache, FontInfo*, fd) { + delete fd; + } + dict_destroy(this->fontcache);this->fontcache=0; + + delete splash;splash=0; +} + +void FontInfo::grow(int size) +{ + if(size >= this->num_glyphs) { + this->glyphs = (GlyphInfo**)realloc(this->glyphs, sizeof(GlyphInfo*)*(size)); + memset(&this->glyphs[this->num_glyphs], 0, sizeof(SplashPath*)*((size)-this->num_glyphs)); + this->num_glyphs = size; + } +} +FontInfo::FontInfo(fontclass_t*fontclass) +{ + if(config_remove_font_transforms) { + char buf[128]; + static int counter=1; + sprintf(buf, "font%d", counter++); + this->id = strdup(buf); + } else { + this->id = strdup(fontclass->id); + } + + this->fontclass = (fontclass_t*)fontclass_type.dup(fontclass); + this->seen = 0; + this->num_glyphs = 0; + this->glyphs = 0; + this->gfxfont = 0; + this->space_char = -1; + this->ascender = 0; + this->descender = 0; + this->scale = 1.0; + resetPositioning(); +} +FontInfo::~FontInfo() +{ + if(this->id) {free(this->id);this->id=0;} + this->font = 0; + int t; + for(t=0;tpath;glyphs[t]->path = 0; + delete glyphs[t]; + glyphs[t]=0; + } + } + free(glyphs);glyphs=0; + if(this->gfxfont) + gfxfont_free(this->gfxfont); + + if(this->fontclass) { + fontclass_type.free(this->fontclass); + this->fontclass=0; + } +} + +void FontInfo::resetPositioning() +{ + this->lastchar = -1; + this->lastx = 0; + this->lasty = 0; + this->lastadvance = 0; +} + +static int findSpace(gfxfont_t*font) +{ + int first_space = -1; + int t; + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*g = &font->glyphs[t]; + if(GLYPH_IS_SPACE(g)) { + if(g->unicode == 32) { + /* now that we have found a space char, make sure it's unique */ + int s; + for(s=0;snum_glyphs;s++) { + if(s!=t && font->glyphs[s].unicode==32) + font->glyphs[s].unicode=0; + } + return t; + } + } + } + return -1; +} + +static int addSpace(gfxfont_t*font) +{ + /* first, make sure the new space char is the only char that'll use unicode 32 */ + int t; + for(t=0;tnum_glyphs;t++) { + if(font->glyphs[t].unicode==32) + font->glyphs[t].unicode=0; + } + // createGfxFont reserves space for up to two extra characters, so we don't need to realloc. + int space_glyph = font->num_glyphs++; + gfxglyph_t*g = &font->glyphs[space_glyph]; + memset(g, 0, sizeof(*g)); + g->unicode = 32; + g->advance = fabs(font->ascent + font->descent) / 5.0; + if(font->max_unicode > 32) + font->unicode2glyph[32] = space_glyph; +#if 0 + g->line = gfxline_makerectangle(0, -font->ascent, g->advance, font->descent); +#endif + return space_glyph; +} + +static void transform_glyph(gfxglyph_t*g, fontclass_t*mm, double scale) +{ + gfxmatrix_t m; + m.m00 = mm->m00 * scale; + m.m01 = mm->m01 * scale; + m.m10 = mm->m10 * scale; + m.m11 = mm->m11 * scale; + m.tx = 0; + m.ty = 0; + if(m.m00>0) + g->advance *= m.m00; + g->line = gfxline_clone(g->line); + gfxline_transform(g->line, &m); +} + +void gfxfont_transform(gfxfont_t*font, gfxmatrix_t*m) +{ + int t; + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*g = &font->glyphs[t]; + gfxline_t*line = g->line; + gfxline_transform(line, m); + if(m->m00>0) + g->advance *= m->m00; + } +} + +gfxbbox_t gfxfont_bbox(gfxfont_t*font) +{ + gfxbbox_t tmp = {0,0,0,0}; + int t; + for(t=0;tnum_glyphs;t++) { + gfxline_t*line = font->glyphs[t].line; + gfxbbox_t b = gfxline_getbbox(line); + tmp = gfxbbox_expand_to_bbox(tmp, b); + } + return tmp; +} + +gfxfont_t* FontInfo::createGfxFont() +{ + gfxfont_t*font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); + + font->glyphs = (gfxglyph_t*)malloc(sizeof(gfxglyph_t)*(this->num_glyphs+2)); + memset(font->glyphs, 0, sizeof(gfxglyph_t)*this->num_glyphs); + font->id = 0; + int t; + + double quality = (INTERNAL_FONT_SIZE * 200 / config_fontquality) / this->max_size; + //printf("%d glyphs\n", font->num_glyphs); + font->num_glyphs = 0; + font->ascent = fabs(this->ascender); + font->descent = fabs(this->descender); + + for(t=0;tnum_glyphs;t++) { + if(this->glyphs[t]) { + SplashPath*path = this->glyphs[t]->path; + int len = path?path->getLength():0; + //printf("glyph %d) %08x (%d line segments)\n", t, path, len); + gfxglyph_t*glyph = &font->glyphs[font->num_glyphs]; + this->glyphs[t]->glyphid = font->num_glyphs; + glyph->unicode = this->glyphs[t]->unicode; + gfxdrawer_t drawer; + gfxdrawer_target_gfxline(&drawer); + int s; + int count = 0; + double xmax = 0; + for(s=0;sgetPoint(s, &x, &y, &f); + if(!s || x > xmax) + xmax = x; + if(f&splashPathFirst) { + drawer.moveTo(&drawer, x, y); + } + if(f&splashPathCurve) { + double x2,y2; + path->getPoint(++s, &x2, &y2, &f); + if(f&splashPathCurve) { + double x3,y3; + path->getPoint(++s, &x3, &y3, &f); + gfxdraw_cubicTo(&drawer, x, y, x2, y2, x3, y3, quality); + } else { + drawer.splineTo(&drawer, x, y, x2, y2); + } + } else { + drawer.lineTo(&drawer, x, y); + } + // printf("%f %f %s %s\n", x, y, (f&splashPathCurve)?"curve":"", + // (f&splashPathFirst)?"first":"", + // (f&splashPathLast)?"last":""); + } + + glyph->line = (gfxline_t*)drawer.result(&drawer); + if(this->glyphs[t]->advance>0) { + glyph->advance = this->glyphs[t]->advance; + } else { + glyph->advance = fmax(xmax, 0); + } + if(config_bigchar) { + double max = this->glyphs[t]->advance_max; + if(max>0 && max > glyph->advance) { + glyph->advance = max; + } + } + + font->num_glyphs++; + } + } + + if(config_remove_font_transforms) { + gfxmatrix_t glyph_transform; + glyph_transform.m00 = fontclass->m00; + glyph_transform.m01 = fontclass->m01; + glyph_transform.m10 = fontclass->m10; + glyph_transform.m11 = fontclass->m11; + glyph_transform.tx = 0; + glyph_transform.ty = 0; + /* apply the font transformation to the font */ + gfxfont_transform(font, &glyph_transform); + + gfxbbox_t total = gfxfont_bbox(font); + font->ascent = total.ymax; + font->descent = -total.ymin; + } + + if(config_normalize_fonts) { + /* make all chars 1024 high */ + gfxbbox_t bbox = gfxfont_bbox(font); + double height = bbox.ymax - bbox.ymin; + double scale = 1.0; + if(height>1e-5) { + scale = 1024.0 / height; + } + this->scale = 1.0 / scale; + gfxmatrix_t scale_matrix = {scale,0,0, + 0,scale,0}; + gfxfont_transform(font, &scale_matrix); + font->ascent *= scale; + font->descent *= scale; + } + + if(config_remove_invisible_outlines) { + /* for OCR docs: remove the outlines of characters that are only + ever displayed with alpha=0 */ + if(!fontclass->alpha) { + for(t=0;tnum_glyphs;t++) { + gfxglyph_t*g = &font->glyphs[t]; + gfxline_t*line = font->glyphs[t].line; + gfxline_free(g->line); + g->line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); + g->line->type = gfx_moveTo; + g->line->x = g->advance; + } + } + } + + return font; +} + +static float find_average_glyph_advance(gfxfont_t*f) +{ + if(!f->num_glyphs) + return 0.0; + + float*values = (float*)malloc(sizeof(float)*f->num_glyphs); + int t; + for(t=0;tnum_glyphs;t++) { + values[t] = f->glyphs[t].advance; + } + float m = medianf(values, f->num_glyphs); + free(values); + return m; +} + +gfxfont_t* FontInfo::getGfxFont() +{ + if(!this->gfxfont) { + this->gfxfont = this->createGfxFont(); + this->gfxfont->id = strdup(this->id); + this->space_char = findSpace(this->gfxfont); + this->average_advance = find_average_glyph_advance(this->gfxfont); + + if(this->space_char>=0) { + msg(" Font %s has space char %d (unicode=%d)", + this->id, this->space_char, + this->gfxfont->glyphs[this->space_char].unicode); + } else if(config_addspace) { + this->space_char = addSpace(this->gfxfont); + msg(" Appending space char to font %s, position %d, width %f", this->gfxfont->id, this->space_char, this->gfxfont->glyphs[this->space_char].advance); + } + gfxfont_fix_unicode(this->gfxfont, config_unique_unicode); + + /* optionally append a marker glyph */ + if(config_marker_glyph) { + msg(" Appending marker char to font %s, position %d, unicode %d", this->gfxfont->id, this->gfxfont->num_glyphs, config_marker_glyph); + gfxglyph_t*g = &this->gfxfont->glyphs[this->gfxfont->num_glyphs++]; + g->name = 0; + g->unicode = config_marker_glyph; + g->advance = 2048; + g->line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); + g->line->type = gfx_moveTo; + g->line->x = g->advance; + } + } + return this->gfxfont; +} + +GBool InfoOutputDev::upsideDown() {return gTrue;} +GBool InfoOutputDev::useDrawChar() {return gTrue;} +GBool InfoOutputDev::interpretType3Chars() {return gTrue;} +GBool InfoOutputDev::useTilingPatternFill() {return gFalse;} + +GBool InfoOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) +{ + this->page = page; + return gTrue; +} + +void InfoOutputDev::startPage(int pageNum, GfxState *state) +{ + PDFRectangle *r = this->page->getCropBox(); + double x1,y1,x2,y2; + state->transform(r->x1,r->y1,&x1,&y1); + state->transform(r->x2,r->y2,&x2,&y2); + if(x2x1 = (int)x1; + this->y1 = (int)y1; + this->x2 = (int)x2; + this->y2 = (int)y2; + msg(" Generating info structure for page %d", pageNum); + num_links = 0; + num_jpeg_images = 0; + num_ppm_images = 0; + num_chars = 0; + num_fonts = 0; + num_polygons= 0; + num_layers = 0; + average_char_size = 0; +} +void InfoOutputDev::endPage() +{ + if(num_chars) + average_char_size /= num_chars; +} +void InfoOutputDev::drawLink(Link *link, Catalog *catalog) +{ + num_links++; +} + +/* } else if(!strcmp(key,"fontquality")) { + this->config_fontquality = atof(value); + if(this->config_fontquality<=1) + this->config_fontquality=1; + } else if(!strcmp(key,"bigchar")) { + this->config_bigchar = atoi(value); + } + */ + +char*getFontID(GfxFont*font) +{ + Ref*ref = font->getID(); + GString*gstr = font->getName(); + char* fname = gstr==0?0:gstr->getCString(); + char buf[128]; + if(fname==0) { + if(font->getType() == fontType3) { + sprintf(buf, "t3font-%d-%d", ref->num, ref->gen); + } else { + sprintf(buf, "font-%d-%d", ref->num, ref->gen); + } + } else { + sprintf(buf, "%s-%d-%d", fname, ref->num, ref->gen); + } + return strdup(buf); +} + +gfxmatrix_t gfxmatrix_from_state(GfxState*state) +{ + double* ctm = state->getCTM(); + double fontSize = state->getFontSize(); + double*textMat = state->getTextMat(); + + /* taking the absolute value of horizScaling seems to be required for + some italic fonts. FIXME: SplashOutputDev doesn't need this- why? */ + double hscale = fabs(state->getHorizScaling()); + + // from xpdf-3.02/SplashOutputDev:updateFont + double mm11 = textMat[0] * fontSize * hscale; + double mm12 = textMat[1] * fontSize * hscale; + double mm21 = textMat[2] * fontSize; + double mm22 = textMat[3] * fontSize; + + // multiply with ctm, like state->getFontTransMat() does + gfxmatrix_t m; + m.m00 = (ctm[0]*mm11 + ctm[2]*mm12) / INTERNAL_FONT_SIZE; + m.m01 = (ctm[1]*mm11 + ctm[3]*mm12) / INTERNAL_FONT_SIZE; + m.m10 = (ctm[0]*mm21 + ctm[2]*mm22) / INTERNAL_FONT_SIZE; + m.m11 = (ctm[1]*mm21 + ctm[3]*mm22) / INTERNAL_FONT_SIZE; + m.tx = 0; + m.ty = 0; + return m; +} + +void InfoOutputDev::updateTextMat(GfxState*state) +{ +} + +GBool InfoOutputDev::needNonText() +{ + /* this switches off certain expensive operations, like + pattern fill and forms */ + return gFalse; +} + +void InfoOutputDev::updateFont(GfxState *state) +{ + GfxFont*font = state->getFont(); + if(!font) { + current_splash_font = 0; + return; + } + if(font->getType() == fontType3) { + current_splash_font = 0; + return; + } + GfxState* state2 = state->copy(); + state2->setPath(0); + state2->setCTM(1.0,0,0,1.0,0,0); + splash->updateCTM(state2, 0,0,0,0,0,0); + state2->setTextMat(1.0,0,0,1.0,0,0); + state2->setFont(font, 1024.0); + splash->doUpdateFont(state2); + + current_splash_font = splash->getCurrentFont(); + delete state2; +} + +double matrix_scale_factor(gfxmatrix_t*m) +{ + double l1 = sqrt(m->m00 * m->m00 + m->m01 * m->m01); + double l2 = sqrt(m->m10 * m->m10 + m->m11 * m->m11); + return (l1+l2)/2.0; +} + +#ifdef __GNUC__ +int __attribute__((noinline)) + font_classify(fontclass_t*out, gfxmatrix_t*in, const char*id, gfxcolor_t* color) +#else +int font_classify(fontclass_t*out, gfxmatrix_t*in, const char*id, gfxcolor_t* color) +#endif +{ + out->id = (char*)id; + + if(!config_remove_font_transforms) { + out->m00 = 1.0; + out->m11 = 1.0; + out->m01 = 0.0; + out->m10 = 0.0; + } else { + double l = matrix_scale_factor(in); + if(l < 1e-10) { + /* treat all singularity characters the same */ + memset(out, 0, sizeof(*out)); + l = 0; + } else { + out->m00 = in->m00 / l; + out->m10 = in->m10 / l; + out->m01 = -in->m01 / l; + out->m11 = -in->m11 / l; + } + + if(!color->a) { + /* for invisible characters, transforms don't need to be that + precise- use only 3 bits precision for mantissa. */ + + /* 0x80000000 //sign + 0x78000000 //exponent + 0x07ffffff //mantissa */ + *(U32*)&out->m00 = (*(U32*)&out->m00)&0xffe00000; + *(U32*)&out->m01 = (*(U32*)&out->m01)&0xffe00000; + *(U32*)&out->m10 = (*(U32*)&out->m10)&0xffe00000; + *(U32*)&out->m11 = (*(U32*)&out->m11)&0xffe00000; + } + } + out->alpha = color->a?1:0; + + return 1; +} + +void fontclass_print(fontclass_t*cls) +{ + printf("[%f %f %f %f] %s alpha=%d\n", + cls->m00, cls->m01, cls->m10, cls->m11, + cls->id, + cls->alpha + ); +} + +gfxcolor_t gfxstate_getfontcolor(GfxState*state) +{ + /* FIXME: instead of duplicating BitmapOutputDev's and VectorOutputDev's transparent + character logic here, we should move this code to CommonOutputDev and + call it from all three places */ + + gfxcolor_t col = gfxstate_getfillcolor(state); + /* HACK: if skewedtobitmap is on, weirdly rotated characters will + be drawn transparently in BitmapOutputDev. In order to anticipate this, + we duplicate the logic here */ + if(config_remove_invisible_outlines && + config_skewedtobitmap_pass1 && + text_matrix_is_skewed(state)) { + col.a = 0; + } + if(state->getRender() == RENDER_INVISIBLE) { + col.a = 0; + } + if(config_poly2bitmap_pass1 && (state->getRender()&3)) { + /* with poly2bitmap, stroke or stroke+fill characters are drawn + to the bitmap and potentially overlaid with a transparent character. + duplicate that logic here. */ + col.a = 0; + } + return col; +} + +static inline fontclass_t fontclass_from_state(GfxState*state) +{ + fontclass_t cls; + gfxcolor_t col = gfxstate_getfontcolor(state); + char*id = getFontID(state->getFont()); + gfxmatrix_t m = gfxmatrix_from_state(state); + font_classify(&cls, &m, id, &col); + return cls; +} +static inline void fontclass_clear(fontclass_t*cls) +{ + free(cls->id);cls->id=0; +} + +FontInfo* InfoOutputDev::getOrCreateFontInfo(GfxState*state) +{ + GfxFont*font = state->getFont(); + fontclass_t fontclass = fontclass_from_state(state); + + FontInfo* fontinfo = (FontInfo*)dict_lookup(this->fontcache, &fontclass); + if(!fontinfo) { + fontinfo = new FontInfo(&fontclass); + dict_put(this->fontcache, &fontclass, fontinfo); + fontinfo->font = font; + fontinfo->max_size = 0; + if(current_splash_font) { + fontinfo->ascender = current_splash_font->ascender; + fontinfo->descender = current_splash_font->descender; + } else { + fontinfo->ascender = fontinfo->descender = 0; + } + num_fonts++; + } + + if(last_font && fontinfo!=last_font) { + last_font->resetPositioning(); + } + + this->last_font = fontinfo; + fontclass_clear(&fontclass); + return fontinfo; +} + +FontInfo* InfoOutputDev::getFontInfo(GfxState*state) +{ + fontclass_t fontclass = fontclass_from_state(state); + FontInfo*result = (FontInfo*)dict_lookup(this->fontcache, &fontclass); + if(!result) { + printf("NOT FOUND: "); + fontclass_print(&fontclass); + } + fontclass_clear(&fontclass); + return result; +} + +gfxmatrix_t FontInfo::get_gfxmatrix(GfxState*state) +{ + gfxmatrix_t m = gfxmatrix_from_state(state); + if(!config_remove_font_transforms) { + return m; + } else { + double scale = matrix_scale_factor(&m) * this->scale; + gfxmatrix_t m = {scale, 0, 0, + 0, -scale, 0}; + return m; + } +} + +void InfoOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) +{ + double m11,m21,m12,m22; + state->getFontTransMat(&m11, &m12, &m21, &m22); + m11 *= state->getHorizScaling(); + m21 *= state->getHorizScaling(); + double lenx = sqrt(m11*m11 + m12*m12); + double leny = sqrt(m21*m21 + m22*m22); + double len = lenx>leny?lenx:leny; + + FontInfo*fontinfo = getOrCreateFontInfo(state); + + if(!fontinfo) { + msg(" Internal error: No fontinfo for font"); + return; //error + } + if(!current_splash_font) { + msg(" Internal error: No current splash fontinfo"); + return; //error + } + if(fontinfo && fontinfo->max_size < len) { + fontinfo->max_size = len; + } + + average_char_size += fmax(lenx,leny); + num_chars++; + + if(!previous_was_char) + num_layers++; + previous_was_char=1; + + fontinfo->grow(code+1); + GlyphInfo*g = fontinfo->glyphs[code]; + if(!g) { + g = fontinfo->glyphs[code] = new GlyphInfo(); + g->advance_max = 0; + current_splash_font->last_advance = -1; + g->path = current_splash_font->getGlyphPath(code); + g->advance = current_splash_font->last_advance; + g->unicode = 0; + } + if(uLen && ((u[0]>=32 && u[0]unicode) || !g->unicode)) { + g->unicode = u[0]; + } + if(fontinfo->lastchar>=0 && fontinfo->lasty == y) { + double xshift = (x - fontinfo->lastx); + if(xshift>=0 && xshift > g->advance_max) { + g->advance_max = xshift; + } + } else { + num_text_breaks++; + } + + fontinfo->lastx = x; + fontinfo->lasty = y; + fontinfo->lastchar = code; + fontinfo->lastadvance = g->advance; +} + +static char path_is_rectangular(GfxState* state) +{ + GfxPath * path = state->getPath(); + int num = path->getNumSubpaths(); + if(num!=1) return 0; + GfxSubpath*subpath = path->getSubpath(0); + int subnum = path->getSubpath(0)->getNumPoints(); + + if(subnum>5) return 0; + int s; + for(s=1;sgetCurve(s)) + return 0; + if(subpath->getX(s) != subpath->getX(s-1) && + subpath->getY(s) != subpath->getY(s-1)) { + return 0; + } + } + return 1; +} + +void InfoOutputDev::fill(GfxState *state) +{ + if(!path_is_rectangular(state)) + previous_was_char=0; + num_polygons++; +} + +void InfoOutputDev::eoFill(GfxState *state) +{ + if(!path_is_rectangular(state)) + previous_was_char=0; + num_polygons++; +} + +GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen) +{ + GfxFont*font = state->getFont(); + if(!font) + return gTrue; + if(font->getType() != fontType3) + return gTrue; + + current_splash_font = 0; + + fontclass_t fontclass = fontclass_from_state(state); + FontInfo* fontinfo = (FontInfo*)dict_lookup(this->fontcache, &fontclass); + if(!fontinfo) { + fontinfo = new FontInfo(&fontclass); + dict_put(this->fontcache, &fontclass, fontinfo); + fontinfo->font = font; + fontinfo->max_size = 0; + num_fonts++; + } + fontclass_clear(&fontclass); + + current_type3_font = fontinfo; + fontinfo->grow(code+1); + if(!fontinfo->glyphs[code]) { + currentglyph = fontinfo->glyphs[code] = new GlyphInfo(); + currentglyph->unicode = uLen?u[0]:0; + currentglyph->path = new SplashPath(); + currentglyph->x1=0; + currentglyph->y1=0; + currentglyph->x2=dx; + currentglyph->y2=dy; + currentglyph->advance=dx; + return gFalse; + } else { + return gTrue; + } +} + +void InfoOutputDev::type3D0(GfxState *state, double wx, double wy) +{ + currentglyph->x1=0; + currentglyph->y1=0; + currentglyph->x2=wx; + currentglyph->y2=wy; +} + +void InfoOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) +{ + if(-lly>current_type3_font->descender) + current_type3_font->descender = -lly; + if(ury>current_type3_font->ascender) + current_type3_font->ascender = ury; + + currentglyph->x1=llx; + currentglyph->y1=lly; + currentglyph->x2=urx; + currentglyph->y2=ury; +} + +void InfoOutputDev::endType3Char(GfxState *state) +{ + double x1 = currentglyph->x1; + double y1 = currentglyph->y1; + double x2 = currentglyph->x2; + double y2 = currentglyph->y2; + currentglyph->path->moveTo(x1,y1); + currentglyph->path->lineTo(x2,y1); + currentglyph->path->lineTo(x2,y2); + currentglyph->path->lineTo(x1,y2); + currentglyph->path->close(); +} + +void InfoOutputDev::saveState(GfxState *state) +{ + updateAll(state); +} + +void InfoOutputDev::restoreState(GfxState *state) +{ + updateAll(state); +} + +void InfoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + POPPLER_INTERPOLATE + GBool inlineImg) +{ + previous_was_char=0; + if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; + + OutputDev::drawImageMask(state,ref,str,width,height,invert, POPPLER_INTERPOLATE_ARG inlineImg); +} +void InfoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + int *maskColors, GBool inlineImg) +{ + previous_was_char=0; + if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; + + OutputDev::drawImage(state,ref,str,width,height,colorMap, POPPLER_INTERPOLATE_ARG maskColors,inlineImg); +} +void InfoOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert + POPPLER_MASK_INTERPOLATE) +{ + previous_was_char=0; + if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; + + OutputDev::drawMaskedImage(state,ref,str,width,height,colorMap, POPPLER_INTERPOLATE_ARG maskStr,maskWidth,maskHeight,maskInvert POPPLER_MASK_INTERPOLATE_ARG); +} + +void InfoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap + POPPLER_MASK_INTERPOLATE) +{ + previous_was_char=0; + if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; + + OutputDev::drawSoftMaskedImage(state,ref,str,width,height,colorMap, POPPLER_INTERPOLATE_ARG maskStr,maskWidth,maskHeight,maskColorMap POPPLER_MASK_INTERPOLATE_ARG); +} + +void InfoOutputDev::dumpfonts(gfxdevice_t*dev) +{ + GHashIter*i; + GString*key; + + DICT_ITERATE_DATA(fontcache, FontInfo*, info) { + dev->addfont(dev, info->getGfxFont()); + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h new file mode 100644 index 000000000..870e6bc87 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h @@ -0,0 +1,203 @@ +/* InfoOutputDev.h + A special output device which collects information about a PDF file, + like fonts, Type3 glyphs and so on. + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __infooutputdev_h__ +#define __infooutputdev_h__ + +#include "popplercompat.h" +#include "GfxFont.h" +#include "OutputDev.h" +#include "SplashOutputDev.h" +#include "Page.h" + +#ifdef HAVE_POPPLER + #include + #include + #include + #include +#else + #include "xpdf/config.h" + #include "SplashTypes.h" + #include "SplashPath.h" + #include "SplashFont.h" + #include "SplashFontFile.h" +#endif + +#ifdef HAVE_POPPLER +#include +#else +#include "GHash.h" +#endif +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../gfxfont.h" +#include "../q.h" + +#define INTERNAL_FONT_SIZE 1024.0 +#define GLYPH_IS_SPACE(g) ((!(g)->line || ((g)->line->type==gfx_moveTo && !(g)->line->next)) && (g)->advance) + +struct GlyphInfo +{ + SplashPath*path; + int unicode; + int glyphid; + double advance; + double x1,y1,x2,y2; + + double advance_max; +}; + +typedef struct _fontclass { + float m00,m01,m10,m11; + char*id; + unsigned char alpha; +} fontclass_t; + +class FontInfo +{ + gfxfont_t*gfxfont; + + char*id; + double scale; + + gfxfont_t* createGfxFont(); +public: + fontclass_t*fontclass; + FontInfo(fontclass_t*fontclass); + ~FontInfo(); + + gfxmatrix_t get_gfxmatrix(GfxState*state); + gfxfont_t* getGfxFont(); + + double lastx,lasty; + int lastchar; + double lastadvance; + + double ascender,descender; + + void grow(int size); + void resetPositioning(); + + GfxFont*font; + double max_size; + int num_glyphs; + GlyphInfo**glyphs; + + char seen; + int space_char; + float average_advance; +}; + +extern char*getFontID(GfxFont*font); +extern gfxmatrix_t gfxmatrix_from_state(GfxState*state); + +class InfoOutputDev: public OutputDev +{ + GlyphInfo* currentglyph; + SplashOutputDev*splash; + char previous_was_char; + Page *page; + + dict_t*fontcache; + FontInfo*last_font; + FontInfo*current_type3_font; + SplashFont*current_splash_font; + + public: + int x1,y1,x2,y2; + int num_links; + int num_ppm_images; + int num_jpeg_images; + int num_fonts; + int num_polygons; + int num_chars; + int num_layers; + int num_text_breaks; + double average_char_size; + + void dumpfonts(gfxdevice_t*dev); + FontInfo* getFontInfo(GfxState*state); + + InfoOutputDev(XRef*xref); + virtual ~InfoOutputDev(); + virtual GBool useTilingPatternFill(); + virtual GBool upsideDown(); + virtual GBool needNonText(); + virtual GBool useDrawChar(); + virtual GBool interpretType3Chars(); + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + virtual void startPage(int pageNum, GfxState *state); + virtual void endPage(); + virtual void drawLink(Link *link, Catalog *catalog); + virtual void updateFont(GfxState *state); + + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + virtual GBool beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen); + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); + virtual void endType3Char(GfxState *state); + + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + + virtual void updateTextMat(GfxState*state); + + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + POPPLER_INTERPOLATE + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert + POPPLER_MASK_INTERPOLATE); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + POPPLER_INTERPOLATE + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap + POPPLER_MASK_INTERPOLATE); + private: + + FontInfo* getOrCreateFontInfo(GfxState*state); +}; + +#endif //__infooutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile new file mode 100644 index 000000000..af2c4d9cc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile @@ -0,0 +1,217 @@ +# Generated automatically from Makefile.in by configure. +top_builddir = ../.. +srcdir = . +top_srcdir = ../.. +include ../../Makefile.common + +all-local: ../libgfxpdf$(A) pdf2swf$(E) pdf2jpeg$(E) + +all: ../libgfxpdf$(A) + +libgfxpdf: ../libgfxpdf$(A) + +libgfxpdf_objects = VectorGraphicOutputDev.$(O) BitmapOutputDev.$(O) FullBitmapOutputDev.$(O) CharOutputDev.$(O) CommonOutputDev.$(O) InfoOutputDev.$(O) XMLOutputDev.$(O) pdf.$(O) fonts.$(O) bbox.$(O) popplercompat.$(O) + +xpdf_in_source = $(xpdf_objects) + +xpdf_objects = xpdf/GHash.$(O) xpdf/GList.$(O) xpdf/GString.$(O) xpdf/gmem.$(O) xpdf/gfile.$(O) \ + xpdf/FoFiTrueType.$(O) xpdf/FoFiType1.$(O) xpdf/FoFiType1C.$(O) xpdf/FoFiBase.$(O) xpdf/FoFiEncodings.$(O) \ + xpdf/OutputDev.$(O) xpdf/PDFDoc.$(O) xpdf/Error.$(O) xpdf/Stream.$(O) xpdf/Object.$(O) \ + xpdf/Decrypt.$(O) xpdf/Array.$(O) xpdf/XRef.$(O) xpdf/Dict.$(O) xpdf/Parser.$(O) \ + xpdf/Lexer.$(O) xpdf/Outline.$(O) xpdf/PDFDocEncoding.$(O) xpdf/Catalog.$(O) \ + xpdf/Link.$(O) xpdf/GlobalParams.$(O) xpdf/JBIG2Stream.$(O) xpdf/Page.$(O) xpdf/JPXStream.$(O) \ + xpdf/JArithmeticDecoder.$(O) xpdf/Gfx.$(O) xpdf/GfxFont.$(O) xpdf/CMap.$(O) xpdf/CharCodeToUnicode.$(O) \ + xpdf/PSTokenizer.$(O) xpdf/FontEncodingTables.$(O) xpdf/BuiltinFont.$(O) xpdf/BuiltinFontTables.$(O) \ + xpdf/GfxState.$(O) xpdf/Function.$(O) xpdf/Annot.$(O) xpdf/NameToCharCode.$(O) xpdf/UnicodeMap.$(O) \ + xpdf/SecurityHandler.$(O) xpdf/TextOutputDev.$(O) xpdf/UnicodeTypeTable.$(O) + #xpdf/OptionalContent.$(O) + +splash_in_source = $(splash_objects) +splash_objects = xpdf/SplashOutputDev.$(O) xpdf/SplashFont.$(O) xpdf/SplashState.$(O) xpdf/Splash.$(O) \ + xpdf/SplashBitmap.$(O) xpdf/SplashClip.$(O) xpdf/SplashPattern.$(O) \ + xpdf/SplashFontEngine.$(O) xpdf/SplashFontFile.$(O) xpdf/SplashFontFileID.$(O) \ + xpdf/SplashScreen.$(O) xpdf/SplashPath.$(O) xpdf/SplashXPath.$(O) xpdf/SplashXPathScanner.$(O) \ + xpdf/SplashFTFontEngine.$(O) xpdf/SplashFTFontFile.$(O) xpdf/SplashFTFont.$(O) + +xpdf_include = -I xpdf + +popplercompat.$(O): popplercompat.cc + $(C) -I ./ $(xpdf_include) popplercompat.cc -o $@ +fonts.$(O): fonts.c + $(C) fonts.c -o $@ +bbox.$(O): bbox.c + $(C) bbox.c -o $@ +cmyk.$(O): cmyk.cc + $(CC) -I ./ $(xpdf_include) cmyk.cc -o $@ +CommonOutputDev.$(O): CommonOutputDev.cc InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) CommonOutputDev.cc -o $@ +VectorGraphicOutputDev.$(O): VectorGraphicOutputDev.cc VectorGraphicOutputDev.h CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h + $(CC) -I ./ $(xpdf_include) VectorGraphicOutputDev.cc -o $@ +CharOutputDev.$(O): CharOutputDev.cc CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h + $(CC) -I ./ $(xpdf_include) CharOutputDev.cc -o $@ +InfoOutputDev.$(O): InfoOutputDev.cc InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) InfoOutputDev.cc -o $@ +BitmapOutputDev.$(O): BitmapOutputDev.cc BitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) BitmapOutputDev.cc -o $@ +XMLOutputDev.$(O): XMLOutputDev.cc XMLOutputDev.h xpdf/TextOutputDev.h + $(CC) -I ./ $(xpdf_include) XMLOutputDev.cc -o $@ +FullBitmapOutputDev.$(O): FullBitmapOutputDev.cc FullBitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) FullBitmapOutputDev.cc -o $@ +DummyOutputDev.$(O): DummyOutputDev.cc DummyOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) DummyOutputDev.cc -o $@ +pdf.$(O): pdf.cc VectorGraphicOutputDev.h CharOutputDev.h InfoOutputDev.h CommonOutputDev.h BitmapOutputDev.h FullBitmapOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) pdf.cc -o $@ + +XPDFOK = xpdf/Gfx.cc +ifeq ($(shell echo inject*xpdf.pl),inject-xpdf.pl) +$(XPDFOK): Makefile.in inject-xpdf.pl xpdf-*tar.gz xpdf*patch + @if test xpdf-changes.patch -nt $(XPDFOK);then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi + @if test '!' -d xpdf;then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi +endif + +xpdf/UnicodeMap.$(O): xpdf/UnicodeMap.cc + $(CC) -I ./ -I xpdf xpdf/UnicodeMap.cc -o $@ +xpdf/NameToCharCode.$(O): xpdf/NameToCharCode.cc + $(CC) -I ./ -I xpdf xpdf/NameToCharCode.cc -o $@ +xpdf/Annot.$(O): xpdf/Annot.cc + $(CC) -I ./ -I xpdf xpdf/Annot.cc -o $@ +xpdf/Function.$(O): xpdf/Function.cc + $(CC) -I ./ -I xpdf xpdf/Function.cc -o $@ +xpdf/BuiltinFontTables.$(O): xpdf/BuiltinFontTables.cc + $(CC) -I ./ -I xpdf xpdf/BuiltinFontTables.cc -o $@ +xpdf/BuiltinFont.$(O): xpdf/BuiltinFont.cc + $(CC) -I ./ -I xpdf xpdf/BuiltinFont.cc -o $@ +xpdf/FontEncodingTables.$(O): xpdf/FontEncodingTables.cc + $(CC) -I ./ -I xpdf xpdf/FontEncodingTables.cc -o $@ +xpdf/PSTokenizer.$(O): xpdf/PSTokenizer.cc + $(CC) -I ./ -I xpdf xpdf/PSTokenizer.cc -o $@ +xpdf/CharCodeToUnicode.$(O): xpdf/CharCodeToUnicode.cc + $(CC) -I ./ -I xpdf xpdf/CharCodeToUnicode.cc -o $@ +xpdf/CMap.$(O): xpdf/CMap.cc + $(CC) -I ./ -I xpdf xpdf/CMap.cc -o $@ +xpdf/GfxFont.$(O): xpdf/GfxFont.cc + $(CC) -I ./ -I xpdf xpdf/GfxFont.cc -o $@ +xpdf/Gfx.$(O): xpdf/Gfx.cc + $(CC) -I ./ -I xpdf xpdf/Gfx.cc -o $@ +xpdf/GfxState.$(O): xpdf/GfxState.cc + $(CC) -I ./ -I xpdf xpdf/GfxState.cc -o $@ +xpdf/JArithmeticDecoder.$(O): xpdf/JArithmeticDecoder.cc + $(CC) -I ./ -I xpdf xpdf/JArithmeticDecoder.cc -o $@ +xpdf/JPXStream.$(O): xpdf/JPXStream.cc + $(CC) -I ./ -I xpdf xpdf/JPXStream.cc -o $@ +xpdf/GlobalParams.$(O): xpdf/GlobalParams.cc xpdf/GlobalParams.h + $(CC) -I ./ -I xpdf xpdf/GlobalParams.cc -o $@ +xpdf/JBIG2Stream.$(O): xpdf/JBIG2Stream.cc + $(CC) -I ./ -I xpdf xpdf/JBIG2Stream.cc -o $@ +xpdf/Page.$(O): xpdf/Page.cc + $(CC) -I ./ -I xpdf xpdf/Page.cc -o $@ +xpdf/Link.$(O): xpdf/Link.cc + $(CC) -I ./ -I xpdf xpdf/Link.cc -o $@ +xpdf/Catalog.$(O): xpdf/Catalog.cc + $(CC) -I ./ -I xpdf xpdf/Catalog.cc -o $@ +xpdf/PDFDocEncoding.$(O): xpdf/PDFDocEncoding.cc + $(CC) -I ./ -I xpdf xpdf/PDFDocEncoding.cc -o $@ +xpdf/Outline.$(O): xpdf/Outline.cc + $(CC) -I ./ -I xpdf xpdf/Outline.cc -o $@ +xpdf/Lexer.$(O): xpdf/Lexer.cc + $(CC) -I ./ -I xpdf xpdf/Lexer.cc -o $@ +xpdf/Parser.$(O): xpdf/Parser.cc + $(CC) -I ./ -I xpdf xpdf/Parser.cc -o $@ +xpdf/XRef.$(O): xpdf/XRef.cc + $(CC) -I ./ -I xpdf xpdf/XRef.cc -o $@ +xpdf/Array.$(O): xpdf/Array.cc + $(CC) -I ./ -I xpdf xpdf/Array.cc -o $@ +xpdf/Dict.$(O): xpdf/Dict.cc + $(CC) -I ./ -I xpdf xpdf/Dict.cc -o $@ +xpdf/Decrypt.$(O): xpdf/Decrypt.cc + $(CC) -I ./ -I xpdf xpdf/Decrypt.cc -o $@ +xpdf/Object.$(O): xpdf/Object.cc + $(CC) -I ./ -I xpdf xpdf/Object.cc -o $@ +xpdf/Error.$(O): xpdf/Error.cc aconf.h + $(CC) -I ./ -I xpdf xpdf/Error.cc -o $@ +xpdf/Stream.$(O): xpdf/Stream.cc + $(CC) -I ./ -I xpdf xpdf/Stream.cc -o $@ +xpdf/PDFDoc.$(O): xpdf/PDFDoc.cc + $(CC) -I ./ -I xpdf xpdf/PDFDoc.cc -o $@ +xpdf/SecurityHandler.$(O): xpdf/SecurityHandler.cc xpdf/SecurityHandler.h + $(CC) -I ./ -I xpdf xpdf/SecurityHandler.cc -o $@ +xpdf/OutputDev.$(O): xpdf/OutputDev.cc xpdf/GfxState.h xpdf/Stream.h xpdf/Object.h xpdf/OutputDev.h xpdf/gtypes.h xpdf/CharTypes.h + $(CC) -I ./ -I xpdf xpdf/OutputDev.cc -o $@ +xpdf/FoFiBase.$(O): xpdf/FoFiBase.cc + $(CC) -I ./ -I xpdf xpdf/FoFiBase.cc -o $@ +xpdf/FoFiTrueType.$(O): xpdf/FoFiTrueType.cc xpdf/FoFiBase.h + $(CC) -I ./ -I xpdf xpdf/FoFiTrueType.cc -o $@ +xpdf/FoFiEncodings.$(O): xpdf/FoFiEncodings.cc xpdf/FoFiEncodings.h + $(CC) -I ./ -I xpdf xpdf/FoFiEncodings.cc -o $@ +xpdf/FoFiType1C.$(O): xpdf/FoFiType1C.cc xpdf/FoFiBase.h + $(CC) -I ./ -I xpdf xpdf/FoFiType1C.cc -o $@ +xpdf/FoFiType1.$(O): xpdf/FoFiType1.cc xpdf/FoFiBase.h + $(CC) -I ./ -I xpdf xpdf/FoFiType1.cc -o $@ +xpdf/GList.$(O): xpdf/GList.cc + $(CC) -I ./ -I xpdf xpdf/GList.cc -o $@ +xpdf/GString.$(O): xpdf/GString.cc + $(CC) -I ./ -I xpdf xpdf/GString.cc -o $@ +xpdf/GHash.$(O): xpdf/GHash.cc + $(CC) -I ./ -I xpdf xpdf/GHash.cc -o $@ +xpdf/gfile.$(O): xpdf/gfile.cc + $(CC) -I ./ -I xpdf xpdf/gfile.cc -o $@ +xpdf/gmem.$(O): xpdf/gmem.cc + $(C) -I ./ -I xpdf xpdf/gmem.cc -o $@ +xpdf/parseargs.$(O): xpdf/parseargs.c + $(C) -I ./ -I xpdf xpdf/parseargs.c -o $@ + +xpdf/%.$(O): xpdf/%.cc + $(CC) -I ./ -I xpdf $< -o $@ + + +../libgfxpdf$(A): $(XPDFOK) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) + rm -f ../libgfxpdf$(A) + $(AR) r ../libgfxpdf$(A) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) + $(RANLIB) ../libgfxpdf$(A) + +xpdfapp_sources=xpdf/XPDFApp.cc xpdf/XPDFCore.cc xpdf/XPDFTree.cc xpdf/XPDFViewer.cc xpdf/PDFCore.cc xpdf/TextOutputDev.cc xpdf/xpdf.cc xpdf/CoreOutputDev.cc xpdf/UnicodeTypeTable.cc xpdf/PSOutputDev.cc +splash_sources=xpdf/Splash.cc xpdf/SplashBitmap.cc xpdf/SplashClip.cc xpdf/SplashFTFont.cc xpdf/SplashFTFontEngine.cc xpdf/SplashFTFontFile.cc xpdf/SplashFont.cc xpdf/SplashFontEngine.cc xpdf/SplashFontFile.cc xpdf/SplashFontFileID.cc xpdf/SplashOutputDev.cc xpdf/SplashPath.cc xpdf/SplashPattern.cc xpdf/SplashScreen.cc xpdf/SplashState.cc xpdf/SplashT1Font.cc xpdf/SplashT1FontEngine.cc xpdf/SplashT1FontFile.cc xpdf/SplashXPath.cc xpdf/SplashXPathScanner.cc +xpdfapp_objects=xpdf/XPDFApp.$(O) xpdf/XPDFCore.$(O) xpdf/XPDFTree.$(O) xpdf/XPDFViewer.$(O) xpdf/PDFCore.$(O) xpdf/xpdf.$(O) xpdf/CoreOutputDev.$(O) xpdf/PSOutputDev.$(O) + +xxpdf$(E): $(xpdf_objects) $(xpdfapp_objects) $(splash_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g -I xpdf -I . $(xpdfapp_objects) $(xpdf_objects) $(splash_objects) xpdf/parseargs.c -o xxpdf$(E) $(LIBS) -lXm -lX11 + +pdftoppm.$(O): $(XPDFOK) xpdf/pdftoppm.cc $(xpdf_objects) $(splash_objects) + $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftoppm.cc +pdftotext.$(O): $(XPDFOK) xpdf/pdftotext.cc $(xpdf_objects) + $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftotext.cc +pdfinfo.$(O): $(XPDFOK) xpdf/pdfinfo.cc $(xpdf_objects) + $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdfinfo.cc + +pdftoppm$(E): $(XPDFOK) xpdf/pdftoppm.$(O) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftoppm.$(O) $(xpdf_objects) $(splash_objects) xpdf/parseargs.$(O) -o pdftoppm$(E) $(LIBS) +pdftotext$(E): $(XPDFOK) xpdf/pdftotext.$(O) xpdf/parseargs.$(O) $(xpdf_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftotext.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdftotext$(E) $(LIBS) +pdfinfo$(E): $(XPDFOK) xpdf/pdfinfo.$(O) xpdf/parseargs.$(O) $(xpdf_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdfinfo.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdfinfo$(E) $(LIBS) + +gfx_objects = ../libgfxswf$(A) ../libgfx$(A) ../librfxswf$(A) ../libbase$(A) +gfx_objects2 = $(gfx_objects) ../libocr$(A) + +pdf2jpeg$(E): $(XPDFOK) pdf2jpeg.c ../libbase$(A) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE $(xpdf_include) -I. -g pdf2jpeg.c xpdf/parseargs.$(O) ../libbase$(A) $(xpdf_objects) $(splash_objects) -o pdf2jpeg$(E) $(LIBS) +pdf2swf$(E): $(XPDFOK) ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) + $(LL) $(CPPFLAGS) -g ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2swf$(E) $(LIBS) +pdf2pdf$(E): $(XPDFOK) ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) + $(LL) $(CPPFLAGS) -g ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2pdf$(E) $(LIBS) +gfx2gfx$(E): $(XPDFOK) ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) + $(LL) $(CPPFLAGS) -g ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) -o gfx2gfx$(E) $(LIBS) + +install: + $(mkinstalldirs) $(bindir) + @for file in pdfinfo pdftoppm pdftotext; do if test -f $$file;then $(INSTALL_BIN);fi;done + +uninstall: + + +clean: + rm -f xpdf/*.o xpdf/*.obj *.o pdf2swf pdftoppm pdftotext pdf2swf.exe pdftoppm.exe pdftotext.exe *.obj *.lo *.a *.lib *.la gmon.out + +.PHONY: clean install uninstall check all xpdf + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in new file mode 100644 index 000000000..77ff347fe --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in @@ -0,0 +1,217 @@ +# Generated automatically from Makefile.in by configure. +top_builddir = ../.. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../../Makefile.common + +all-local: ../libgfxpdf$(A) pdf2swf$(E) pdf2jpeg$(E) + +all: ../libgfxpdf$(A) + +libgfxpdf: ../libgfxpdf$(A) + +libgfxpdf_objects = VectorGraphicOutputDev.$(O) BitmapOutputDev.$(O) FullBitmapOutputDev.$(O) CharOutputDev.$(O) CommonOutputDev.$(O) InfoOutputDev.$(O) XMLOutputDev.$(O) pdf.$(O) fonts.$(O) bbox.$(O) popplercompat.$(O) + +xpdf_in_source = @xpdf_in_source@ + +xpdf_objects = xpdf/GHash.$(O) xpdf/GList.$(O) xpdf/GString.$(O) xpdf/gmem.$(O) xpdf/gfile.$(O) \ + xpdf/FoFiTrueType.$(O) xpdf/FoFiType1.$(O) xpdf/FoFiType1C.$(O) xpdf/FoFiBase.$(O) xpdf/FoFiEncodings.$(O) \ + xpdf/OutputDev.$(O) xpdf/PDFDoc.$(O) xpdf/Error.$(O) xpdf/Stream.$(O) xpdf/Object.$(O) \ + xpdf/Decrypt.$(O) xpdf/Array.$(O) xpdf/XRef.$(O) xpdf/Dict.$(O) xpdf/Parser.$(O) \ + xpdf/Lexer.$(O) xpdf/Outline.$(O) xpdf/PDFDocEncoding.$(O) xpdf/Catalog.$(O) \ + xpdf/Link.$(O) xpdf/GlobalParams.$(O) xpdf/JBIG2Stream.$(O) xpdf/Page.$(O) xpdf/JPXStream.$(O) \ + xpdf/JArithmeticDecoder.$(O) xpdf/Gfx.$(O) xpdf/GfxFont.$(O) xpdf/CMap.$(O) xpdf/CharCodeToUnicode.$(O) \ + xpdf/PSTokenizer.$(O) xpdf/FontEncodingTables.$(O) xpdf/BuiltinFont.$(O) xpdf/BuiltinFontTables.$(O) \ + xpdf/GfxState.$(O) xpdf/Function.$(O) xpdf/Annot.$(O) xpdf/NameToCharCode.$(O) xpdf/UnicodeMap.$(O) \ + xpdf/SecurityHandler.$(O) xpdf/TextOutputDev.$(O) xpdf/UnicodeTypeTable.$(O) + #xpdf/OptionalContent.$(O) + +splash_in_source = @splash_in_source@ +splash_objects = xpdf/SplashOutputDev.$(O) xpdf/SplashFont.$(O) xpdf/SplashState.$(O) xpdf/Splash.$(O) \ + xpdf/SplashBitmap.$(O) xpdf/SplashClip.$(O) xpdf/SplashPattern.$(O) \ + xpdf/SplashFontEngine.$(O) xpdf/SplashFontFile.$(O) xpdf/SplashFontFileID.$(O) \ + xpdf/SplashScreen.$(O) xpdf/SplashPath.$(O) xpdf/SplashXPath.$(O) xpdf/SplashXPathScanner.$(O) \ + xpdf/SplashFTFontEngine.$(O) xpdf/SplashFTFontFile.$(O) xpdf/SplashFTFont.$(O) + +xpdf_include = @xpdf_include@ + +popplercompat.$(O): popplercompat.cc + $(C) -I ./ $(xpdf_include) popplercompat.cc -o $@ +fonts.$(O): fonts.c + $(C) fonts.c -o $@ +bbox.$(O): bbox.c + $(C) bbox.c -o $@ +cmyk.$(O): cmyk.cc + $(CC) -I ./ $(xpdf_include) cmyk.cc -o $@ +CommonOutputDev.$(O): CommonOutputDev.cc InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) CommonOutputDev.cc -o $@ +VectorGraphicOutputDev.$(O): VectorGraphicOutputDev.cc VectorGraphicOutputDev.h CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h + $(CC) -I ./ $(xpdf_include) VectorGraphicOutputDev.cc -o $@ +CharOutputDev.$(O): CharOutputDev.cc CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h + $(CC) -I ./ $(xpdf_include) CharOutputDev.cc -o $@ +InfoOutputDev.$(O): InfoOutputDev.cc InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) InfoOutputDev.cc -o $@ +BitmapOutputDev.$(O): BitmapOutputDev.cc BitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) BitmapOutputDev.cc -o $@ +XMLOutputDev.$(O): XMLOutputDev.cc XMLOutputDev.h xpdf/TextOutputDev.h + $(CC) -I ./ $(xpdf_include) XMLOutputDev.cc -o $@ +FullBitmapOutputDev.$(O): FullBitmapOutputDev.cc FullBitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) FullBitmapOutputDev.cc -o $@ +DummyOutputDev.$(O): DummyOutputDev.cc DummyOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) DummyOutputDev.cc -o $@ +pdf.$(O): pdf.cc VectorGraphicOutputDev.h CharOutputDev.h InfoOutputDev.h CommonOutputDev.h BitmapOutputDev.h FullBitmapOutputDev.h InfoOutputDev.h + $(CC) -I ./ $(xpdf_include) pdf.cc -o $@ + +XPDFOK = xpdf/Gfx.cc +ifeq ($(shell echo inject*xpdf.pl),inject-xpdf.pl) +$(XPDFOK): Makefile.in inject-xpdf.pl xpdf-*tar.gz xpdf*patch + @if test xpdf-changes.patch -nt $(XPDFOK);then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi + @if test '!' -d xpdf;then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi +endif + +xpdf/UnicodeMap.$(O): xpdf/UnicodeMap.cc + $(CC) -I ./ -I xpdf xpdf/UnicodeMap.cc -o $@ +xpdf/NameToCharCode.$(O): xpdf/NameToCharCode.cc + $(CC) -I ./ -I xpdf xpdf/NameToCharCode.cc -o $@ +xpdf/Annot.$(O): xpdf/Annot.cc + $(CC) -I ./ -I xpdf xpdf/Annot.cc -o $@ +xpdf/Function.$(O): xpdf/Function.cc + $(CC) -I ./ -I xpdf xpdf/Function.cc -o $@ +xpdf/BuiltinFontTables.$(O): xpdf/BuiltinFontTables.cc + $(CC) -I ./ -I xpdf xpdf/BuiltinFontTables.cc -o $@ +xpdf/BuiltinFont.$(O): xpdf/BuiltinFont.cc + $(CC) -I ./ -I xpdf xpdf/BuiltinFont.cc -o $@ +xpdf/FontEncodingTables.$(O): xpdf/FontEncodingTables.cc + $(CC) -I ./ -I xpdf xpdf/FontEncodingTables.cc -o $@ +xpdf/PSTokenizer.$(O): xpdf/PSTokenizer.cc + $(CC) -I ./ -I xpdf xpdf/PSTokenizer.cc -o $@ +xpdf/CharCodeToUnicode.$(O): xpdf/CharCodeToUnicode.cc + $(CC) -I ./ -I xpdf xpdf/CharCodeToUnicode.cc -o $@ +xpdf/CMap.$(O): xpdf/CMap.cc + $(CC) -I ./ -I xpdf xpdf/CMap.cc -o $@ +xpdf/GfxFont.$(O): xpdf/GfxFont.cc + $(CC) -I ./ -I xpdf xpdf/GfxFont.cc -o $@ +xpdf/Gfx.$(O): xpdf/Gfx.cc + $(CC) -I ./ -I xpdf xpdf/Gfx.cc -o $@ +xpdf/GfxState.$(O): xpdf/GfxState.cc + $(CC) -I ./ -I xpdf xpdf/GfxState.cc -o $@ +xpdf/JArithmeticDecoder.$(O): xpdf/JArithmeticDecoder.cc + $(CC) -I ./ -I xpdf xpdf/JArithmeticDecoder.cc -o $@ +xpdf/JPXStream.$(O): xpdf/JPXStream.cc + $(CC) -I ./ -I xpdf xpdf/JPXStream.cc -o $@ +xpdf/GlobalParams.$(O): xpdf/GlobalParams.cc xpdf/GlobalParams.h + $(CC) -I ./ -I xpdf xpdf/GlobalParams.cc -o $@ +xpdf/JBIG2Stream.$(O): xpdf/JBIG2Stream.cc + $(CC) -I ./ -I xpdf xpdf/JBIG2Stream.cc -o $@ +xpdf/Page.$(O): xpdf/Page.cc + $(CC) -I ./ -I xpdf xpdf/Page.cc -o $@ +xpdf/Link.$(O): xpdf/Link.cc + $(CC) -I ./ -I xpdf xpdf/Link.cc -o $@ +xpdf/Catalog.$(O): xpdf/Catalog.cc + $(CC) -I ./ -I xpdf xpdf/Catalog.cc -o $@ +xpdf/PDFDocEncoding.$(O): xpdf/PDFDocEncoding.cc + $(CC) -I ./ -I xpdf xpdf/PDFDocEncoding.cc -o $@ +xpdf/Outline.$(O): xpdf/Outline.cc + $(CC) -I ./ -I xpdf xpdf/Outline.cc -o $@ +xpdf/Lexer.$(O): xpdf/Lexer.cc + $(CC) -I ./ -I xpdf xpdf/Lexer.cc -o $@ +xpdf/Parser.$(O): xpdf/Parser.cc + $(CC) -I ./ -I xpdf xpdf/Parser.cc -o $@ +xpdf/XRef.$(O): xpdf/XRef.cc + $(CC) -I ./ -I xpdf xpdf/XRef.cc -o $@ +xpdf/Array.$(O): xpdf/Array.cc + $(CC) -I ./ -I xpdf xpdf/Array.cc -o $@ +xpdf/Dict.$(O): xpdf/Dict.cc + $(CC) -I ./ -I xpdf xpdf/Dict.cc -o $@ +xpdf/Decrypt.$(O): xpdf/Decrypt.cc + $(CC) -I ./ -I xpdf xpdf/Decrypt.cc -o $@ +xpdf/Object.$(O): xpdf/Object.cc + $(CC) -I ./ -I xpdf xpdf/Object.cc -o $@ +xpdf/Error.$(O): xpdf/Error.cc aconf.h + $(CC) -I ./ -I xpdf xpdf/Error.cc -o $@ +xpdf/Stream.$(O): xpdf/Stream.cc + $(CC) -I ./ -I xpdf xpdf/Stream.cc -o $@ +xpdf/PDFDoc.$(O): xpdf/PDFDoc.cc + $(CC) -I ./ -I xpdf xpdf/PDFDoc.cc -o $@ +xpdf/SecurityHandler.$(O): xpdf/SecurityHandler.cc xpdf/SecurityHandler.h + $(CC) -I ./ -I xpdf xpdf/SecurityHandler.cc -o $@ +xpdf/OutputDev.$(O): xpdf/OutputDev.cc xpdf/GfxState.h xpdf/Stream.h xpdf/Object.h xpdf/OutputDev.h xpdf/gtypes.h xpdf/CharTypes.h + $(CC) -I ./ -I xpdf xpdf/OutputDev.cc -o $@ +xpdf/FoFiBase.$(O): xpdf/FoFiBase.cc + $(CC) -I ./ -I xpdf xpdf/FoFiBase.cc -o $@ +xpdf/FoFiTrueType.$(O): xpdf/FoFiTrueType.cc xpdf/FoFiBase.h + $(CC) -I ./ -I xpdf xpdf/FoFiTrueType.cc -o $@ +xpdf/FoFiEncodings.$(O): xpdf/FoFiEncodings.cc xpdf/FoFiEncodings.h + $(CC) -I ./ -I xpdf xpdf/FoFiEncodings.cc -o $@ +xpdf/FoFiType1C.$(O): xpdf/FoFiType1C.cc xpdf/FoFiBase.h + $(CC) -I ./ -I xpdf xpdf/FoFiType1C.cc -o $@ +xpdf/FoFiType1.$(O): xpdf/FoFiType1.cc xpdf/FoFiBase.h + $(CC) -I ./ -I xpdf xpdf/FoFiType1.cc -o $@ +xpdf/GList.$(O): xpdf/GList.cc + $(CC) -I ./ -I xpdf xpdf/GList.cc -o $@ +xpdf/GString.$(O): xpdf/GString.cc + $(CC) -I ./ -I xpdf xpdf/GString.cc -o $@ +xpdf/GHash.$(O): xpdf/GHash.cc + $(CC) -I ./ -I xpdf xpdf/GHash.cc -o $@ +xpdf/gfile.$(O): xpdf/gfile.cc + $(CC) -I ./ -I xpdf xpdf/gfile.cc -o $@ +xpdf/gmem.$(O): xpdf/gmem.cc + $(C) -I ./ -I xpdf xpdf/gmem.cc -o $@ +xpdf/parseargs.$(O): xpdf/parseargs.c + $(C) -I ./ -I xpdf xpdf/parseargs.c -o $@ + +xpdf/%.$(O): xpdf/%.cc + $(CC) -I ./ -I xpdf $< -o $@ + + +../libgfxpdf$(A): $(XPDFOK) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) + rm -f ../libgfxpdf$(A) + $(AR) r ../libgfxpdf$(A) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) + $(RANLIB) ../libgfxpdf$(A) + +xpdfapp_sources=xpdf/XPDFApp.cc xpdf/XPDFCore.cc xpdf/XPDFTree.cc xpdf/XPDFViewer.cc xpdf/PDFCore.cc xpdf/TextOutputDev.cc xpdf/xpdf.cc xpdf/CoreOutputDev.cc xpdf/UnicodeTypeTable.cc xpdf/PSOutputDev.cc +splash_sources=xpdf/Splash.cc xpdf/SplashBitmap.cc xpdf/SplashClip.cc xpdf/SplashFTFont.cc xpdf/SplashFTFontEngine.cc xpdf/SplashFTFontFile.cc xpdf/SplashFont.cc xpdf/SplashFontEngine.cc xpdf/SplashFontFile.cc xpdf/SplashFontFileID.cc xpdf/SplashOutputDev.cc xpdf/SplashPath.cc xpdf/SplashPattern.cc xpdf/SplashScreen.cc xpdf/SplashState.cc xpdf/SplashT1Font.cc xpdf/SplashT1FontEngine.cc xpdf/SplashT1FontFile.cc xpdf/SplashXPath.cc xpdf/SplashXPathScanner.cc +xpdfapp_objects=xpdf/XPDFApp.$(O) xpdf/XPDFCore.$(O) xpdf/XPDFTree.$(O) xpdf/XPDFViewer.$(O) xpdf/PDFCore.$(O) xpdf/xpdf.$(O) xpdf/CoreOutputDev.$(O) xpdf/PSOutputDev.$(O) + +xxpdf$(E): $(xpdf_objects) $(xpdfapp_objects) $(splash_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g -I xpdf -I . $(xpdfapp_objects) $(xpdf_objects) $(splash_objects) xpdf/parseargs.c -o xxpdf$(E) $(LIBS) -lXm -lX11 + +pdftoppm.$(O): $(XPDFOK) xpdf/pdftoppm.cc $(xpdf_objects) $(splash_objects) + $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftoppm.cc +pdftotext.$(O): $(XPDFOK) xpdf/pdftotext.cc $(xpdf_objects) + $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftotext.cc +pdfinfo.$(O): $(XPDFOK) xpdf/pdfinfo.cc $(xpdf_objects) + $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdfinfo.cc + +pdftoppm$(E): $(XPDFOK) xpdf/pdftoppm.$(O) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftoppm.$(O) $(xpdf_objects) $(splash_objects) xpdf/parseargs.$(O) -o pdftoppm$(E) $(LIBS) +pdftotext$(E): $(XPDFOK) xpdf/pdftotext.$(O) xpdf/parseargs.$(O) $(xpdf_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftotext.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdftotext$(E) $(LIBS) +pdfinfo$(E): $(XPDFOK) xpdf/pdfinfo.$(O) xpdf/parseargs.$(O) $(xpdf_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdfinfo.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdfinfo$(E) $(LIBS) + +gfx_objects = ../libgfxswf$(A) ../libgfx$(A) ../librfxswf$(A) ../libbase$(A) +gfx_objects2 = $(gfx_objects) ../libocr$(A) + +pdf2jpeg$(E): $(XPDFOK) pdf2jpeg.c ../libbase$(A) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) + $(LL) $(CPPFLAGS) -DXPDFEXE $(xpdf_include) -I. -g pdf2jpeg.c xpdf/parseargs.$(O) ../libbase$(A) $(xpdf_objects) $(splash_objects) -o pdf2jpeg$(E) $(LIBS) +pdf2swf$(E): $(XPDFOK) ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) + $(LL) $(CPPFLAGS) -g ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2swf$(E) $(LIBS) +pdf2pdf$(E): $(XPDFOK) ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) + $(LL) $(CPPFLAGS) -g ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2pdf$(E) $(LIBS) +gfx2gfx$(E): $(XPDFOK) ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) + $(LL) $(CPPFLAGS) -g ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) -o gfx2gfx$(E) $(LIBS) + +install: + $(mkinstalldirs) $(bindir) + @for file in pdfinfo pdftoppm pdftotext; do if test -f $$file;then $(INSTALL_BIN);fi;done + +uninstall: + + +clean: + rm -f xpdf/*.o xpdf/*.obj *.o pdf2swf pdftoppm pdftotext pdf2swf.exe pdftoppm.exe pdftotext.exe *.obj *.lo *.a *.lib *.la gmon.out + +.PHONY: clean install uninstall check all xpdf + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc new file mode 100644 index 000000000..8c1b3af12 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc @@ -0,0 +1,1730 @@ +/* VectorGraphicOutputDev.cc + implements a pdf output device (OutputDev). + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include "../../config.h" + +//xpdf header files +#include "popplercompat.h" +#include "VectorGraphicOutputDev.h" + +// swftools header files +#include "../os.h" +#include "../log.h" +#include "../mem.h" +#include "../utf8.h" +#include "../gfxdevice.h" +#include "../gfxtools.h" +#include "../gfxfont.h" +#include "../gfxpoly.h" +#include "../devices/record.h" +#include "../devices/ops.h" +#include "../devices/polyops.h" +#include "../devices/render.h" + +#include "../png.h" + +/* config */ +static int verbose = 0; +static int dbgindent = 1; +static void dbg(const char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(!verbose) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + printf("(pdf) "); + int indent = dbgindent; + while(indent) { + printf(" "); + indent--; + } + printf("%s\n", buf); + fflush(stdout); +} + +GFXOutputState::GFXOutputState() { + this->clipping = 0; + this->createsoftmask = 0; + this->transparencygroup = 0; + this->softmask = 0; + this->grouprecording = 0; + this->isolated = 0; +} + +VectorGraphicOutputDev::VectorGraphicOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) +:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) +{ + this->type3active = 0; + this->statepos = 0; + this->xref = 0; + this->current_gfxfont = 0; + this->current_fontinfo = 0; + this->current_text_stroke = 0; + this->current_text_clip = 0; + this->outer_clip_box = 0; + this->config_convertgradients=1; + this->config_transparent=0; + this->config_disable_polygon_conversion = 0; + this->config_multiply = 1; + this->config_textonly = 0; + + /* for processing drawChar events */ + this->charDev = new CharOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2); + memset(&this->char_output_dev, 0, sizeof(gfxdevice_t)); + this->char_output_dev.internal = this; + this->char_output_dev.drawchar = drawchar_callback; + this->char_output_dev.addfont = addfont_callback; + + memset(states, 0, sizeof(states)); +}; + +void VectorGraphicOutputDev::setParameter(const char*key, const char*value) +{ + if(!strcmp(key,"transparent")) { + this->config_transparent = atoi(value); + } else if(!strcmp(key,"convertgradients")) { + this->config_convertgradients = atoi(value); + } else if(!strcmp(key,"textonly")) { + this->config_textonly = atoi(value); + } else if(!strcmp(key,"multiply")) { + this->config_multiply = atoi(value); + if(this->config_multiply<1) + this->config_multiply=1; + } else if(!strcmp(key,"disable_polygon_conversion")) { + this->config_disable_polygon_conversion = atoi(value); + } + this->charDev->setParameter(key, value); +} + +void VectorGraphicOutputDev::setDevice(gfxdevice_t*dev) +{ + this->device = dev; + charDev->setDevice(dev); +} + +//void VectorGraphicOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) {printf("void VectorGraphicOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) \n");} +//void VectorGraphicOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) {printf("void VectorGraphicOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) \n");} + +void dump_outline(gfxline_t*line) +{ + /*gfxbbox_t*r = gfxline_isrectangle(line); + if(!r) + printf("is not a rectangle\n"); + else + printf("is a rectangle: (%f,%f)-(%f-%f)\n", r->xmin, r->ymin, r->xmax, r->ymax); + */ + + while(line) { + if(line->type == gfx_moveTo) { + msg(" | moveTo %.2f %.2f", line->x,line->y); + } else if(line->type == gfx_lineTo) { + msg(" | lineTo %.2f %.2f", line->x,line->y); + } else if(line->type == gfx_splineTo) { + msg(" | splineTo (%.2f %.2f) %.2f %.2f", line->sx,line->sy, line->x, line->y); + } + line = line->next; + } +} + +void gfxPath_dump(GfxPath*path) +{ + int num = path->getNumSubpaths(); + int t; + int cpos=0; + for(t = 0; t < num; t++) { + GfxSubpath *subpath = path->getSubpath(t); + int subnum = subpath->getNumPoints(); + int s; + for(s=0;sgetX(s); + double y=subpath->getY(s); + if(s==0 && !subpath->getCurve(s)) { + printf("M %f %f\n", x, y); + } else if(s==0 && subpath->getCurve(s)) { + printf("E %f %f\n", x, y); + } else if(subpath->getCurve(s)) { + printf("C %f %f\n", x, y); + } else { + printf("T %f %f\n", x, y); + } + } + } +} + +gfxline_t* VectorGraphicOutputDev::gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed) +{ + int num = path->getNumSubpaths(); + int s,t; + int cpos = 0; + double lastx=0,lasty=0,posx=0,posy=0; + int needsfix=0; + if(!num) { + msg(" empty path"); + return 0; + } + gfxdrawer_t draw; + gfxdrawer_target_gfxline(&draw); + + for(t = 0; t < num; t++) { + GfxSubpath *subpath = path->getSubpath(t); + int subnum = subpath->getNumPoints(); + double bx=0,by=0,cx=0,cy=0; + + for(s=0;stransformXY(state, subpath->getX(s),subpath->getY(s),&x,&y); + + if(s==0) { + if(closed && needsfix && (fabs(posx-lastx)+fabs(posy-lasty))>0.001) { + draw.lineTo(&draw, lastx, lasty); + } + draw.moveTo(&draw, x,y); + posx = lastx = x; + posy = lasty = y; + cpos = 0; + needsfix = 0; + } else if(subpath->getCurve(s) && cpos==0) { + bx = x; + by = y; + cpos = 1; + } else if(subpath->getCurve(s) && cpos==1) { + cx = x; + cy = y; + cpos = 2; + } else { + posx = x; + posy = y; + if(cpos==0) { + draw.lineTo(&draw, x,y); + } else { + gfxdraw_cubicTo(&draw, bx,by, cx,cy, x,y, 0.05); + } + needsfix = 1; + cpos = 0; + } + } + } + /* fix non-closed lines */ + if(closed && needsfix && (fabs(posx-lastx)+fabs(posy-lasty))>0.001) { + draw.lineTo(&draw, lastx, lasty); + } + gfxline_t*result = (gfxline_t*)draw.result(&draw); + + gfxline_optimize(result); + + return result; +} + +GBool VectorGraphicOutputDev::useTilingPatternFill() +{ + infofeature("tiled patterns"); +// if(config_convertgradients) +// return gTrue; + return gFalse; +} +GBool VectorGraphicOutputDev::useShadedFills() +{ + infofeature("shaded fills"); + if(config_convertgradients) + return gTrue; + return gFalse; +} + +POPPLER_TILING_PATERN_RETURN VectorGraphicOutputDev::tilingPatternFill(GfxState *state, + POPPLER_TILING_PATERN_GFX + Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) +{ + msg(" tilingPatternFill"); + infofeature("tiling pattern fills"); +#ifdef HAVE_POPPLER + // since we don't implement this method yet, + // reduce it to a series of other drawing operations. + return gFalse; +#endif +} + +GBool VectorGraphicOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) +{ + msg(" functionShadedFill not supported yet"); + infofeature("function shaded fills"); + return gFalse; +} +static gfxcolor_t col2col(GfxColorSpace*colspace, GfxColor* col) +{ + gfxcolor_t c; + GfxRGB rgb; + colspace->getRGB(col, &rgb); + c.r = colToByte(rgb.r); + c.g = colToByte(rgb.g); + c.b = colToByte(rgb.b); + c.a = 255; + return c; +} + +GBool VectorGraphicOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading) +{ + if(config_textonly) {return gTrue;} + + double x0,y0,r0,x1,y1,x2,y2,x9,y9,r1; + shading->getCoords(&x0,&y0,&r0,&x9,&y9,&r1); + x1=x0+r1;y1=y0; + x2=x0; y2=y0+r1; + this->transformXY(state, x0,y0, &x0,&y0); + this->transformXY(state, x1,y1, &x1,&y1); + this->transformXY(state, x2,y2, &x2,&y2); + + GfxColor color0; + GfxColor color1; + GfxColor color2; + shading->getColor(0.0, &color0); + shading->getColor(0.5, &color1); + shading->getColor(1.0, &color2); + + GfxColorSpace* colspace = shading->getColorSpace(); + + msg(" radialShadedFill %f %f %f %f %f %f %02x%02x%02x->%02x%02x%02x", x0, y0, x1, y1, x2, y2, + colToByte(color0.c[0]), colToByte(color0.c[1]), colToByte(color0.c[2]), + colToByte(color1.c[0]), colToByte(color1.c[1]), colToByte(color1.c[2]), + colToByte(color2.c[0]), colToByte(color2.c[1]), colToByte(color2.c[2])); + infofeature("radial shaded fills"); + + gfxgradient_t gr[3]; + gfxgradient_t*g = &gr[0]; + g[0].next = &g[1]; + g[1].next = &g[2]; + g[2].next = 0; + g[0].color = col2col(colspace, &color0); + g[1].color = col2col(colspace, &color1); + g[2].color = col2col(colspace, &color2); + g[0].pos = 0.0; + g[1].pos = 0.5; + g[2].pos = 1.0; + + gfxbbox_t b = states[statepos].clipbbox; + gfxline_t p1,p2,p3,p4,p5; + p1.type=gfx_moveTo;p1.x=b.xmin; p1.y=b.ymin; p1.next=&p2; + p2.type=gfx_lineTo;p2.x=b.xmin; p2.y=b.ymax; p2.next=&p3; + p3.type=gfx_lineTo;p3.x=b.xmax; p3.y=b.ymax; p3.next=&p4; + p4.type=gfx_lineTo;p4.x=b.xmax; p4.y=b.ymin; p4.next=&p5; + p5.type=gfx_lineTo;p5.x=b.xmin; p5.y=b.ymin; p5.next=0; + + gfxmatrix_t m; + //m.m00 = (x3-x0); m.m10 = (x1-x0); + //m.m01 = (y3-y0); m.m11 = (y1-y0); + //x3/y3 specifies another (the ending) circle, not the second radius of an ellipse + m.m00 = (x1-x0); m.m10 = (x2-x0); + m.m01 = (y1-y0); m.m11 = (y2-y0); + m.tx = x0 - 0.5; + m.ty = y0 - 0.5; + + device->fillgradient(device, &p1, g, gfxgradient_radial, &m); + return gTrue; +} + +GBool VectorGraphicOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading) +{ + if(config_textonly) {return gTrue;} + + double x0,y0,x1,y1; + shading->getCoords(&x0,&y0,&x1,&y1); + this->transformXY(state, x0,y0,&x0,&y0); + this->transformXY(state, x1,y1,&x1,&y1); + + GfxColor color0; + GfxColor color1; + GfxColor color2; + shading->getColor(0.0, &color0); + shading->getColor(0.5, &color1); + shading->getColor(1.0, &color2); + + GfxColorSpace* colspace = shading->getColorSpace(); + + msg(" axialShadedFill %f %f %f %f %02x%02x%02x->%02x%02x%02x->%02x%02x%02x", x0, y0, x1, y1, + colToByte(color0.c[0]), colToByte(color0.c[1]), colToByte(color0.c[2]), + colToByte(color1.c[0]), colToByte(color1.c[1]), colToByte(color1.c[2]), + colToByte(color2.c[0]), colToByte(color2.c[1]), colToByte(color2.c[2]) + ); + infofeature("axial shaded fills"); + + gfxgradient_t*g = (gfxgradient_t*)malloc(sizeof(gfxgradient_t)*3); + g[0].next = &g[1]; + g[1].next = &g[2]; + g[2].next = 0; + g[0].color = col2col(colspace, &color0); + g[1].color = col2col(colspace, &color1); + g[2].color = col2col(colspace, &color2); + g[0].pos = 0.0; + g[1].pos = 0.5; + g[2].pos = 1.0; + + double xMin,yMin,xMax,yMax; + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + this->transformXY(state, xMin, yMin, &xMin, &yMin); + msg(" userClipBox %f %f %f %f", xMin, yMin, xMax, yMax); + + xMin = 0; yMin = 0; + xMin = 1024; yMin = 1024; + + gfxbbox_t b = states[statepos].clipbbox; + gfxline_t p1,p2,p3,p4,p5; + p1.type=gfx_moveTo;p1.x=b.xmin; p1.y=b.ymin; p1.next=&p2; + p2.type=gfx_lineTo;p2.x=b.xmin; p2.y=b.ymax; p2.next=&p3; + p3.type=gfx_lineTo;p3.x=b.xmax; p3.y=b.ymax; p3.next=&p4; + p4.type=gfx_lineTo;p4.x=b.xmax; p4.y=b.ymin; p4.next=&p5; + p5.type=gfx_lineTo;p5.x=b.xmin; p5.y=b.ymin; p5.next=0; + + /* the gradient starts at (-1.0,0.0), so move (0,0) to + the middle of the two control points */ + gfxmatrix_t m; + m.m00 = (x1-x0)/2; m.m10 = -(y1-y0)/2; + m.m01 = (y1-y0)/2; m.m11 = (x1-x0)/2; + m.tx = (x0 + x1)/2 - 0.5; + m.ty = (y0 + y1)/2 - 0.5; + + device->fillgradient(device, &p1, g, gfxgradient_linear, &m); + + free(g); + return gTrue; +} + +GBool VectorGraphicOutputDev::useDrawForm() +{ + infofeature("forms"); + return gFalse; +} +void VectorGraphicOutputDev::drawForm(Ref id) +{ + msg(" drawForm not implemented"); +} +GBool VectorGraphicOutputDev::needNonText() +{ + return gTrue; +} +void VectorGraphicOutputDev::endPage() +{ + msg(" endPage (VectorGraphicOutputDev)"); + charDev->endPage(); // link postprocessing + if(outer_clip_box) { + device->endclip(device); + outer_clip_box = 0; + } +} +void VectorGraphicOutputDev::setDefaultCTM(double *ctm) +{ + charDev->setDefaultCTM(ctm); + OutputDev::setDefaultCTM(ctm); +} + +static inline double sqr(double x) {return x*x;} + +#define STROKE_FILL 1 +#define STROKE_CLIP 2 +void VectorGraphicOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) +{ + int lineCap = state->getLineCap(); // 0=butt, 1=round 2=square + int lineJoin = state->getLineJoin(); // 0=miter, 1=round 2=bevel + double miterLimit = state->getMiterLimit(); + double width = state->getTransformedLineWidth(); + + GfxRGB rgb; + double opaq = state->getStrokeOpacity(); + if(type3active) + state->getFillRGB(&rgb); + else + state->getStrokeRGB(&rgb); + gfxcolor_t col; + col.r = colToByte(rgb.r); + col.g = colToByte(rgb.g); + col.b = colToByte(rgb.b); + col.a = (unsigned char)(opaq*255); + + gfx_capType capType = gfx_capRound; + if(lineCap == 0) capType = gfx_capButt; + else if(lineCap == 1) capType = gfx_capRound; + else if(lineCap == 2) capType = gfx_capSquare; + else msg(" Invalid line cap type"); + + gfx_joinType joinType = gfx_joinRound; + if(lineJoin == 0) joinType = gfx_joinMiter; + else if(lineJoin == 1) joinType = gfx_joinRound; + else if(lineJoin == 2) joinType = gfx_joinBevel; + else msg(" Invalid line join type"); + + gfxline_t*line2 = 0; + + int dashLength = states[statepos].dashLength; + double*dashPattern = states[statepos].dashPattern; + double dashStart = states[statepos].dashStart; + if(dashLength && dashPattern) { + float * dash = (float*)malloc(sizeof(float)*(dashLength+1)); + int t; + + /* try to find out how much the transformation matrix would + stretch the dashes, and factor that into the dash lengths. + This is not the entirely correct approach- it would be + better to first convert the path to an unscaled version, + then apply dashing, and then transform the path using + the current transformation matrix. However there are few + PDFs which actually stretch a dashed path in a non-orthonormal + way */ + double tx1, ty1, tx2, ty2, tx3, ty3; + this->transformXY(state, 0, 0, &tx1, &ty1); + this->transformXY(state, 0, 1, &tx2, &ty2); + this->transformXY(state, 1, 0, &tx3, &ty3); + double d1 = sqrt(sqr(tx2-tx1)+sqr(ty2-ty1)); + double d2 = sqrt(sqr(tx3-tx1)+sqr(ty3-ty1)); + if(fabs(d1-d2)>0.5) + warnfeature("non-ortogonally dashed strokes", 0); + double f = (d1+d2)/2; + + msg(" %d dashes", dashLength); + msg(" | phase: %f", dashStart); + for(t=0;t | d%-3d: %f", t, dashPattern[t]); + } + dash[dashLength] = -1; + if(getLogLevel() >= LOGLEVEL_TRACE) { + dump_outline(line); + } + + line2 = gfxtool_dash_line(line, dash, (float)(dashStart*f)); + line = line2; + + free(dash); + msg(" After dashing:"); + } + + if(getLogLevel() >= LOGLEVEL_TRACE) { + msg(" stroke width=%f join=%s cap=%s dashes=%d color=%02x%02x%02x%02x", + width, + lineJoin==0?"miter": (lineJoin==1?"round":"bevel"), + lineCap==0?"butt": (lineCap==1?"round":"square"), + dashLength, + col.r,col.g,col.b,col.a + ); + dump_outline(line); + } + + if(flags&STROKE_FILL) { + gfxpoly_t* poly = gfxpoly_from_stroke(line, width, capType, joinType, miterLimit, DEFAULT_GRID); + gfxline_t*gfxline = gfxline_from_gfxpoly(poly); + if(getLogLevel() >= LOGLEVEL_TRACE) { + dump_outline(gfxline); + } + if(!gfxline) { + msg(" Empty polygon (resulting from stroked line)"); + } + if(flags&STROKE_CLIP) { + device->startclip(device, gfxline); + states[statepos].clipping++; + } else { + device->fill(device, gfxline, &col); + } + gfxline_free(gfxline); + gfxpoly_destroy(poly); + } else { + if(flags&STROKE_CLIP) + msg(" Stroke&clip not supported at the same time"); + device->stroke(device, line, width, &col, capType, joinType, miterLimit); + } + + if(line2) + gfxline_free(line2); +} + +void VectorGraphicOutputDev::fillGfxLine(GfxState *state, gfxline_t*line, char evenodd) +{ + gfxcolor_t col = gfxstate_getfillcolor(state); + + if(getLogLevel() >= LOGLEVEL_TRACE) { + msg(" %sfill %02x%02x%02x%02x", evenodd?"eo":"", col.r, col.g, col.b, col.a); + dump_outline(line); + } + device->fill(device, line, &col); +} + +void VectorGraphicOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line, char evenodd) +{ + if(getLogLevel() >= LOGLEVEL_TRACE) { + msg(" %sclip", evenodd?"eo":""); + dump_outline(line); + } + gfxbbox_t bbox = gfxline_getbbox(line); + gfxbbox_intersect(&states[statepos].clipbbox, &bbox); + + device->startclip(device, line); + states[statepos].clipping++; +} + +void VectorGraphicOutputDev::clip(GfxState *state) +{ + GfxPath * path = state->getPath(); + msg(" clip"); + gfxline_t*line = gfxPath_to_gfxline(state, path, 1); + if(!config_disable_polygon_conversion) { + gfxline_t*line2 = gfxpoly_circular_to_evenodd(line, DEFAULT_GRID); + gfxline_free(line); + line = line2; + } + clipToGfxLine(state, line, 0); + gfxline_free(line); +} + +void VectorGraphicOutputDev::eoClip(GfxState *state) +{ + GfxPath * path = state->getPath(); + gfxline_t*line = gfxPath_to_gfxline(state, path, 1); + clipToGfxLine(state, line, 1); + gfxline_free(line); +} +void VectorGraphicOutputDev::clipToStrokePath(GfxState *state) +{ + GfxPath * path = state->getPath(); + gfxline_t*line= gfxPath_to_gfxline(state, path, 0); + + if(getLogLevel() >= LOGLEVEL_TRACE) { + double width = state->getTransformedLineWidth(); + msg(" cliptostrokepath width=%f", width); + dump_outline(line); + } + + strokeGfxline(state, line, STROKE_FILL|STROKE_CLIP); + gfxline_free(line); +} + +void VectorGraphicOutputDev::finish() +{ + if(outer_clip_box) { + if(device) { + device->endclip(device); + } + outer_clip_box = 0; + } +} + +VectorGraphicOutputDev::~VectorGraphicOutputDev() +{ + finish(); + delete charDev;charDev=0; +}; +GBool VectorGraphicOutputDev::upsideDown() +{ + return gTrue; +}; +GBool VectorGraphicOutputDev::useDrawChar() +{ + return gTrue; +} + +void VectorGraphicOutputDev::updateFontMatrix(GfxState*state) +{ + this->current_font_matrix = gfxmatrix_from_state(state); + charDev->updateTextMat(state); +} + +void VectorGraphicOutputDev::updateFont(GfxState*state) +{ + charDev->updateFont(state); +} + +void VectorGraphicOutputDev::processLink(Link *link, Catalog *catalog) +{ + charDev->processLink(link, catalog); +} + +void VectorGraphicOutputDev::beginString(GfxState *state, GString *s) +{ + int render = state->getRender(); + if(current_text_stroke) { + msg(" Error: Incompatible change of text rendering to %d while inside cliptext", render); + } + charDev->beginString(state, s); +} + +static gfxline_t* mkEmptyGfxShape(double x, double y) +{ + gfxline_t*line = (gfxline_t*)malloc(sizeof(gfxline_t)); + line->x = x;line->y = y;line->type = gfx_moveTo;line->next = 0; + return line; +} + +void addfont_callback(gfxdevice_t*dev, gfxfont_t*font) +{ + VectorGraphicOutputDev*self = (VectorGraphicOutputDev*)dev->internal; + self->device->addfont(self->device, font); +} +void drawchar_callback(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + VectorGraphicOutputDev*self = (VectorGraphicOutputDev*)dev->internal; + self->gfxfont_from_callback = font; + self->glyphnr_from_callback = glyph; + memcpy(&self->textcolor_from_callback, color, sizeof(gfxcolor_t)); + memcpy(&self->textmatrix_from_callback, matrix, sizeof(gfxmatrix_t)); +} + +void VectorGraphicOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode charid, int nBytes, Unicode *_u, int uLen) +{ + int render = state->getRender(); + if(((render == RENDER_FILL) || + (render == RENDER_FILLSTROKE && state->getTransformedLineWidth()<1.0) || + (render == RENDER_INVISIBLE))) { + charDev->drawChar(state, x, y, dx, dy, originX, originY, charid, nBytes, _u, uLen); + return; + } + + msg(" Drawing glyph %d as shape", charid); + infofeature("text rendered as shape"); + + charDev->setDevice(&char_output_dev); + this->gfxfont_from_callback = 0; + this->glyphnr_from_callback = 0; + charDev->drawChar(state, x, y, dx, dy, originX, originY, charid, nBytes, _u, uLen); + charDev->setDevice(device); + + if(!gfxfont_from_callback) { + // some chars are ignored by CharOutputDev + return; + } + gfxline_t*glyph = gfxfont_from_callback->glyphs[glyphnr_from_callback].line; + + gfxline_t*tglyph = gfxline_clone(glyph); + gfxline_transform(tglyph, &textmatrix_from_callback); + if((render&3) != RENDER_INVISIBLE) { + gfxline_t*add = gfxline_clone(tglyph); + current_text_stroke = gfxline_append(current_text_stroke, add); + } + if(render&RENDER_CLIP) { + gfxline_t*add = gfxline_clone(tglyph); + current_text_clip = gfxline_append(current_text_clip, add); + if(!current_text_clip) { + current_text_clip = mkEmptyGfxShape(textmatrix_from_callback.tx, textmatrix_from_callback.ty); + } + } + gfxline_free(tglyph); +} + +void VectorGraphicOutputDev::endString(GfxState *state) +{ + int render = state->getRender(); + msg(" endString() render=%d textstroke=%p", render, current_text_stroke); + + if(current_text_stroke) { + /* fillstroke and stroke text rendering objects we can process right + now (as there may be texts of other rendering modes in this + text object)- clipping objects have to wait until endTextObject, + however */ + device->setparameter(device, "mark","TXT"); + if((render&3) == RENDER_FILL) { + fillGfxLine(state, current_text_stroke, 0); + gfxline_free(current_text_stroke); + current_text_stroke = 0; + } else if((render&3) == RENDER_FILLSTROKE) { + fillGfxLine(state, current_text_stroke, 0); + strokeGfxline(state, current_text_stroke,0); + gfxline_free(current_text_stroke); + current_text_stroke = 0; + } else if((render&3) == RENDER_STROKE) { + strokeGfxline(state, current_text_stroke,0); + gfxline_free(current_text_stroke); + current_text_stroke = 0; + } + device->setparameter(device, "mark",""); + } +} + +void VectorGraphicOutputDev::endTextObject(GfxState *state) +{ + int render = state->getRender(); + msg(" endTextObject() render=%d textstroke=%p clipstroke=%p", render, current_text_stroke, current_text_clip); + + if(current_text_clip) { + device->setparameter(device, "mark","TXT"); + clipToGfxLine(state, current_text_clip, 0); + device->setparameter(device, "mark",""); + gfxline_free(current_text_clip); + current_text_clip = 0; + } +} + +/* the logic seems to be as following: + first, beginType3Char is called, with the charcode and the coordinates. + if this function returns true, it already knew about the char and has now drawn it. + if the function returns false, it's a new char, and type3D0 and/or type3D1 might be + called with some parameters. + Afterwards, all draw operations until endType3Char are part of the char (which in this moment is + at the position first passed to beginType3Char). the char ends with endType3Char. + + The drawing operations between beginType3Char and endType3Char are somewhat different to + the normal ones. For example, the fillcolor equals the stroke color. (Because the stroke + color determines the color of a font) +*/ + +GBool VectorGraphicOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode charid, Unicode *u, int uLen) +{ + return charDev->beginType3Char(state, x, y, dx, dy, charid, u, uLen); +} + +void VectorGraphicOutputDev::type3D0(GfxState *state, double wx, double wy) +{ + charDev->type3D0(state, wx, wy); +} +void VectorGraphicOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) +{ + charDev->type3D1(state, wx, wy, llx, lly, urx, ury); +} + +void VectorGraphicOutputDev::endType3Char(GfxState *state) +{ + charDev->endType3Char(state); +} + +GBool VectorGraphicOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) +{ + this->setPage(page); + charDev->setPage(page); + return gTrue; +} + + +void VectorGraphicOutputDev::beginPage(GfxState *state, int pageNum) +{ + this->currentpage = pageNum; + int rot = doc->getPageRotate(1); + gfxcolor_t white = {255,255,255,255}; + gfxcolor_t black = {255,0,0,0}; + laststate = state; + gfxline_t clippath[5]; + + msg(" processing PDF page %d (%dx%d:%d:%d)", pageNum, this->width, this->height, -this->movex, -this->movey); + if(rot!=0) + msg(" page is rotated %d degrees", rot); + + clippath[0].type = gfx_moveTo;clippath[0].x = 0; clippath[0].y = 0; clippath[0].next = &clippath[1]; + clippath[1].type = gfx_lineTo;clippath[1].x = width; clippath[1].y = 0; clippath[1].next = &clippath[2]; + clippath[2].type = gfx_lineTo;clippath[2].x = width; clippath[2].y = height; clippath[2].next = &clippath[3]; + clippath[3].type = gfx_lineTo;clippath[3].x = 0; clippath[3].y = height; clippath[3].next = &clippath[4]; + clippath[4].type = gfx_lineTo;clippath[4].x = 0; clippath[4].y = 0; clippath[4].next = 0; + + device->startclip(device, clippath); outer_clip_box = 1; + if(!config_transparent) { + device->fill(device, clippath, &white); + } + states[statepos].clipbbox.xmin = 0; + states[statepos].clipbbox.ymin = 0; + states[statepos].clipbbox.xmax = this->width; + states[statepos].clipbbox.ymax = this->height; + + states[statepos].dashPattern = 0; + states[statepos].dashLength = 0; + states[statepos].dashStart = 0; + + charDev->startPage(pageNum, state); +} + +void VectorGraphicOutputDev::saveState(GfxState *state) { + dbg("saveState %p", state); dbgindent+=2; + + msg(" saveState %p", state); + updateAll(state); + if(statepos>=64) { + msg(" Too many nested states in pdf."); + exit(1); + } + statepos ++; + states[statepos].state = state; + states[statepos].createsoftmask = states[statepos-1].createsoftmask; + states[statepos].transparencygroup = states[statepos-1].transparencygroup; + states[statepos].clipping = 0; + states[statepos].olddevice = 0; + states[statepos].clipbbox = states[statepos-1].clipbbox; + + states[statepos].dashPattern = states[statepos-1].dashPattern; + states[statepos].dashStart = states[statepos-1].dashStart; + states[statepos].dashLength = states[statepos-1].dashLength; +}; + +void VectorGraphicOutputDev::restoreState(GfxState *state) { + dbgindent-=2; dbg("restoreState %p", state); + + if(statepos==0) { + msg(" Invalid restoreState"); + exit(1); + } + msg(" restoreState %p%s%s", state, + states[statepos].softmask?" (end softmask)":"", + states[statepos].clipping?" (end clipping)":""); + if(states[statepos].softmask) { + clearSoftMask(state); + } + + if(states[statepos].dashPattern) { + if(!statepos || states[statepos-1].dashPattern != states[statepos].dashPattern) { + free(states[statepos].dashPattern); + states[statepos].dashPattern = 0; + } + } + + updateAll(state); + + while(states[statepos].clipping) { + device->endclip(device); + states[statepos].clipping--; + } + if(states[statepos].state!=state) { + msg(" bad state nesting"); + if(verbose) { + int t; + for(t=0;t<=statepos;t++) { + printf("%p ", states[t].state); + } + printf("\n"); + } + exit(1); + } + states[statepos].state=0; + statepos--; +} + +void VectorGraphicOutputDev::updateLineDash(GfxState *state) +{ + if(states[statepos].dashPattern && + (!statepos || states[statepos-1].dashPattern != states[statepos].dashPattern)) { + free(states[statepos].dashPattern); + states[statepos].dashPattern = 0; + } + double *pattern = 0; + int dashLength; + double dashStart; + state->getLineDash(&pattern, &dashLength, &dashStart); + msg(" updateLineDash, %d dashes", dashLength); + if(!dashLength) { + states[statepos].dashPattern = 0; + states[statepos].dashLength = 0; + } else { + double*p = (double*)malloc(dashLength*sizeof(states[statepos].dashPattern[0])); + memcpy(p, pattern, dashLength*sizeof(states[statepos].dashPattern[0])); + states[statepos].dashPattern = p; + states[statepos].dashLength = dashLength; + states[statepos].dashStart = dashStart; + } +} + +#define SQR(x) ((x)*(x)) +unsigned char* antialize(unsigned char*data, int width, int height, int newwidth, int newheight, int palettesize) +{ + if((newwidth<1 || newheight<1) || + (width<=newwidth || height<=newheight)) + return 0; + unsigned char*newdata; + int x,y; + newdata= (unsigned char*)malloc(newwidth*newheight); + double fx = ((double)width)/newwidth; + double fy = ((double)height)/newheight; + double px = 0; + int blocksize = (int)(8192/(fx*fy)); + int r = 8192*256/palettesize; + for(x=0;x=width) + tox = width-1; + if(toy>=height) + toy = height-1; + for(xx=fromx;xx<=tox;xx++) + for(yy=fromy;yy<=toy;yy++) { + int b = 1-data[width*yy+xx]; + int weight=256; + if(xx==fromx) weight = (weight*xweight1)/256; + if(xx==tox) weight = (weight*xweight2)/256; + if(yy==fromy) weight = (weight*yweight1)/256; + if(yy==toy) weight = (weight*yweight2)/256; + a+=b*weight; + } + //if(a) a=(palettesize-1)*r/blocksize; + newdata[y*newwidth+x] = (a*blocksize)/r; + py = ey; + } + px = ex; + } + return newdata; +} + +#define IMAGE_TYPE_JPEG 0 +#define IMAGE_TYPE_LOSSLESS 1 + +static void drawimage(gfxdevice_t*dev, gfxcolor_t* data, int sizex,int sizey, + double x1,double y1, + double x2,double y2, + double x3,double y3, + double x4,double y4, int type, int multiply) +{ + gfxcolor_t*newpic=0; + + double l1 = sqrt((x4-x1)*(x4-x1) + (y4-y1)*(y4-y1)); + double l2 = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); + + gfxline_t p1,p2,p3,p4,p5; + p1.type=gfx_moveTo;p1.x=x1; p1.y=y1;p1.next=&p2; + p2.type=gfx_lineTo;p2.x=x2; p2.y=y2;p2.next=&p3; + p3.type=gfx_lineTo;p3.x=x3; p3.y=y3;p3.next=&p4; + p4.type=gfx_lineTo;p4.x=x4; p4.y=y4;p4.next=&p5; + p5.type=gfx_lineTo;p5.x=x1; p5.y=y1;p5.next=0; + + {p1.x = (int)(p1.x*20)/20.0; + p1.y = (int)(p1.y*20)/20.0; + p2.x = (int)(p2.x*20)/20.0; + p2.y = (int)(p2.y*20)/20.0; + p3.x = (int)(p3.x*20)/20.0; + p3.y = (int)(p3.y*20)/20.0; + p4.x = (int)(p4.x*20)/20.0; + p4.y = (int)(p4.y*20)/20.0; + p5.x = (int)(p5.x*20)/20.0; + p5.y = (int)(p5.y*20)/20.0; + } + + gfxmatrix_t m; + m.m00 = (p4.x-p1.x)/sizex; m.m10 = (p2.x-p1.x)/sizey; + m.m01 = (p4.y-p1.y)/sizex; m.m11 = (p2.y-p1.y)/sizey; + + m.tx = p1.x - 0.5*multiply; + m.ty = p1.y - 0.5*multiply; + + gfximage_t img; + img.data = (gfxcolor_t*)data; + img.width = sizex; + img.height = sizey; + + if(type == IMAGE_TYPE_JPEG) + /* TODO: pass image_dpi to device instead */ + dev->setparameter(dev, "next_bitmap_is_jpeg", "1"); + + dump_outline(&p1); + dev->fillbitmap(dev, &p1, &img, &m, 0); +} + +void drawimagejpeg(gfxdevice_t*dev, gfxcolor_t*mem, int sizex,int sizey, + double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4, int multiply) +{ + drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_JPEG, multiply); +} + +void drawimagelossless(gfxdevice_t*dev, gfxcolor_t*mem, int sizex,int sizey, + double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4, int multiply) +{ + drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_LOSSLESS, multiply); +} + + +void VectorGraphicOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap*colorMap, GBool invert, + GBool inlineImg, int mask, int*maskColors, + Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap) +{ + /* the code in this function is *old*. It's not pretty, but it works. */ + + double x1,y1,x2,y2,x3,y3,x4,y4; + ImageStream *imgStr; + Guchar pixBuf[4]; + GfxRGB rgb; + int ncomps = 1; + int bits = 1; + unsigned char* maskbitmap = 0; + + if(colorMap) { + ncomps = colorMap->getNumPixelComps(); + bits = colorMap->getBits(); + } + + if(maskStr) { + int x,y; + unsigned char buf[8]; + maskbitmap = (unsigned char*)malloc(maskHeight*maskWidth); + if(maskColorMap) { + ImageStream*imgMaskStr = new ImageStream(maskStr, maskWidth, maskColorMap->getNumPixelComps(), maskColorMap->getBits()); + imgMaskStr->reset(); + unsigned char pal[256]; + int n = 1 << colorMap->getBits(); + int t; + for(t=0;tgetGray(pixBuf, &gray); + pal[t] = colToByte(gray); + } + for (y = 0; y < maskHeight; y++) { + for (x = 0; x < maskWidth; x++) { + imgMaskStr->getPixel(buf); + maskbitmap[y*maskWidth+x] = pal[buf[0]]; + } + } + delete imgMaskStr; + } else { + ImageStream*imgMaskStr = new ImageStream(maskStr, maskWidth, 1, 1); + imgMaskStr->reset(); + for (y = 0; y < maskHeight; y++) { + for (x = 0; x < maskWidth; x++) { + imgMaskStr->getPixel(buf); + buf[0]^=maskInvert; + maskbitmap[y*maskWidth+x] = (buf[0]^1)*255; + } + } + delete imgMaskStr; + } + maskStr->close(); + } + + imgStr = new ImageStream(str, width, ncomps,bits); + imgStr->reset(); + + if(!width || !height || ((height+width)<=1 && (maskWidth+maskHeight)<=1)) + { + msg(" Ignoring %d by %d image", width, height); + unsigned char buf[8]; + int x,y; + for (y = 0; y < height; ++y) + for (x = 0; x < width; ++x) { + imgStr->getPixel(buf); + } + delete imgStr; + if(maskbitmap) + free(maskbitmap); + return; + } + + this->transformXY(state, 0, 1, &x1, &y1); + this->transformXY(state, 0, 0, &x2, &y2); + this->transformXY(state, 1, 0, &x3, &y3); + this->transformXY(state, 1, 1, &x4, &y4); + + if(type3active) { + /* as type 3 bitmaps are antialized, we need to place them + at integer coordinates, otherwise flash player's antializing + will kick in and make everything blurry */ + x1 = (int)(x1);y1 = (int)(y1); + x2 = (int)(x2);y2 = (int)(y2); + x3 = (int)(x3);y3 = (int)(y3); + x4 = (int)(x4);y4 = (int)(y4); + } + + if(!(str->getKind()==strDCT)) { + if(!type3active) { + if(mask) infofeature("masked pbm pictures"); + else infofeature("pbm pictures"); + } + if(mask) + msg(" drawing %d by %d masked picture", width, height); + } + if(str->getKind()==strDCT) { + infofeature("jpeg pictures"); + } + + if(mask) { + unsigned char buf[8]; + int x,y; + unsigned char*pic = new unsigned char[width*height]; + gfxcolor_t pal[256]; + GfxRGB rgb; + state->getFillRGB(&rgb); + + memset(pal,255,sizeof(pal)); + pal[0].r = (int)(colToByte(rgb.r)); pal[1].r = 0; + pal[0].g = (int)(colToByte(rgb.g)); pal[1].g = 0; + pal[0].b = (int)(colToByte(rgb.b)); pal[1].b = 0; + pal[0].a = 255; pal[1].a = 0; + + int numpalette = 2; + int realwidth = (int)sqrt(SQR(x2-x3) + SQR(y2-y3)); + int realheight = (int)sqrt(SQR(x1-x2) + SQR(y1-y2)); + for (y = 0; y < height; ++y) + for (x = 0; x < width; ++x) + { + imgStr->getPixel(buf); + if(invert) + buf[0]=1-buf[0]; + pic[width*y+x] = buf[0]; + } + + if(type3active) { + unsigned char*pic2 = 0; + numpalette = 16; + + pic2 = antialize(pic,width,height,realwidth,realheight,numpalette); + + if(!pic2) { + delete[] pic; + delete imgStr; + return; + } + + width = realwidth; + height = realheight; + delete[] pic; + pic = pic2; + + /* make a black/white palette */ + + float r = 255./(float)(numpalette-1); + int t; + for(t=0;tgetNumPixelComps()!=1 || str->getKind()==strDCT) { + gfxcolor_t*pic=new gfxcolor_t[width*height]; + for (y = 0; y < height; ++y) { + for (x = 0; x < width; ++x) { + imgStr->getPixel(pixBuf); + colorMap->getRGB(pixBuf, &rgb); + pic[width*y+x].r = (unsigned char)(colToByte(rgb.r)); + pic[width*y+x].g = (unsigned char)(colToByte(rgb.g)); + pic[width*y+x].b = (unsigned char)(colToByte(rgb.b)); + pic[width*y+x].a = 255;//(U8)(rgb.a * 255 + 0.5); + if(maskbitmap) { + int x1 = x*maskWidth/width; + int y1 = y*maskHeight/height; + int x2 = (x+1)*maskWidth/width; + int y2 = (y+1)*maskHeight/height; + int xx,yy; + unsigned int alpha=0; + unsigned int count=0; + for(xx=x1;xxgetKind()==strDCT) + drawimagejpeg(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); + else + drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); + delete[] pic; + delete imgStr; + if(maskbitmap) free(maskbitmap); + return; + } else { + gfxcolor_t*pic=new gfxcolor_t[width*height]; + gfxcolor_t pal[256]; + int n = 1 << colorMap->getBits(); + int t; + for(t=0;t<256;t++) { + pixBuf[0] = t; + colorMap->getRGB(pixBuf, &rgb); + pal[t].r = (unsigned char)(colToByte(rgb.r)); + pal[t].g = (unsigned char)(colToByte(rgb.g)); + pal[t].b = (unsigned char)(colToByte(rgb.b)); + pal[t].a = 255;//(U8)(rgb.b * 255 + 0.5); + } + for (y = 0; y < height; ++y) { + for (x = 0; x < width; ++x) { + imgStr->getPixel(pixBuf); + pic[width*y+x] = pal[pixBuf[0]]; + if(maskColors && *maskColors==pixBuf[0]) { + pic[width*y+x].a = 0; + } + } + } + if(maskbitmap) { + if(maskWidth < width && maskHeight < height) { + for(y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + pic[width*y+x].a = maskbitmap[(y*maskHeight/height)*maskWidth+(x*maskWidth/width)]; + } + } + } else { + msg(" resampling %dx%d to mask size (%dx%d)", width, height, maskWidth, maskHeight); + gfxcolor_t*newpic=new gfxcolor_t[maskWidth*maskHeight]; + double dx = width / (double)maskWidth; + double dy = height / (double)maskHeight; + double yy = 0; + for(y = 0; y < maskHeight; y++) { + double xx = 0; + for (x = 0; x < maskWidth; x++) { + newpic[maskWidth*y+x] = pic[int(yy)*width+int(xx)]; + newpic[maskWidth*y+x].a = maskbitmap[maskWidth*y+x]; + xx += dx; + } + yy += dy; + } + delete[] pic; + pic = newpic; + width = maskWidth; + height = maskHeight; + } + } + drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); + + delete[] pic; + delete imgStr; + if(maskbitmap) free(maskbitmap); + return; + } +} + +void VectorGraphicOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg) +{ + if(config_textonly) { + OutputDev::drawImageMask(state,ref,str,width,height,invert,inlineImg); + return; + } + dbg("drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg); + msg(" drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg); + drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1, 0, 0,0,0,0, 0); +} + +void VectorGraphicOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg) +{ + if(config_textonly) { + OutputDev::drawImage(state,ref,str,width,height,colorMap,maskColors,inlineImg); + return; + } + dbg("drawImage %dx%d, %s, %s, inline=%d", width, height, + colorMap?"colorMap":"no colorMap", + maskColors?"maskColors":"no maskColors", + inlineImg); + msg(" drawImage %dx%d, %s, %s, inline=%d", width, height, + colorMap?"colorMap":"no colorMap", + maskColors?"maskColors":"no maskColors", + inlineImg); + if(colorMap) + msg(" colorMap pixcomps:%d bits:%d mode:%d", colorMap->getNumPixelComps(), + colorMap->getBits(),colorMap->getColorSpace()->getMode()); + drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0,maskColors, 0,0,0,0, 0); +} + +void VectorGraphicOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert) +{ + if(config_textonly) { + OutputDev::drawMaskedImage(state,ref,str,width,height,colorMap,maskStr,maskWidth,maskHeight,maskInvert); + return; + } + dbg("drawMaskedImage %dx%d, %s, %dx%d mask", width, height, + colorMap?"colorMap":"no colorMap", + maskWidth, maskHeight); + msg(" drawMaskedImage %dx%d, %s, %dx%d mask", width, height, + colorMap?"colorMap":"no colorMap", + maskWidth, maskHeight); + if(colorMap) + msg(" colorMap pixcomps:%d bits:%d mode:%d", colorMap->getNumPixelComps(), + colorMap->getBits(),colorMap->getColorSpace()->getMode()); + drawGeneralImage(state,ref,str,width,height,colorMap,0,0,0,0, maskStr, maskWidth, maskHeight, maskInvert, 0); +} + +void VectorGraphicOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap) +{ + if(config_textonly) { + OutputDev::drawSoftMaskedImage(state,ref,str,width,height,colorMap,maskStr,maskWidth,maskHeight,maskColorMap); + return; + } + dbg("drawSoftMaskedImage %dx%d, %s, %dx%d mask", width, height, + colorMap?"colorMap":"no colorMap", + maskWidth, maskHeight); + msg(" drawSoftMaskedImage %dx%d, %s, %dx%d mask", width, height, + colorMap?"colorMap":"no colorMap", + maskWidth, maskHeight); + if(colorMap) + msg(" colorMap pixcomps:%d bits:%d mode:%d", colorMap->getNumPixelComps(), + colorMap->getBits(),colorMap->getColorSpace()->getMode()); + drawGeneralImage(state,ref,str,width,height,colorMap,0,0,0,0, maskStr, maskWidth, maskHeight, 0, maskColorMap); +} + + +void VectorGraphicOutputDev::stroke(GfxState *state) +{ + if(config_textonly) {return;} + + dbg("stroke"); + + GfxPath * path = state->getPath(); + gfxline_t*line= gfxPath_to_gfxline(state, path, 0); + strokeGfxline(state, line, 0); + gfxline_free(line); +} + +void VectorGraphicOutputDev::fill(GfxState *state) +{ + if(config_textonly) {return;} + + gfxcolor_t col = gfxstate_getfillcolor(state); + dbg("fill %02x%02x%02x%02x",col.r,col.g,col.b,col.a); + + GfxPath * path = state->getPath(); + gfxline_t*line= gfxPath_to_gfxline(state, path, 1); + if(!config_disable_polygon_conversion) { + gfxline_t*line2 = gfxpoly_circular_to_evenodd(line, DEFAULT_GRID); + gfxline_free(line); + line = line2; + } + fillGfxLine(state, line, 0); + gfxline_free(line); +} + +void VectorGraphicOutputDev::eoFill(GfxState *state) +{ + if(config_textonly) {return;} + + gfxcolor_t col = gfxstate_getfillcolor(state); + dbg("eofill %02x%02x%02x%02x",col.r,col.g,col.b,col.a); + + GfxPath * path = state->getPath(); + gfxline_t*line= gfxPath_to_gfxline(state, path, 1); + fillGfxLine(state, line, 1); + gfxline_free(line); +} + + +void VectorGraphicOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask) +{ + const char*colormodename = ""; + + if(blendingColorSpace) { + colormodename = GfxColorSpace::getColorSpaceModeName(blendingColorSpace->getMode()); + } + dbg("beginTransparencyGroup device=%p %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", device, bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); + msg(" beginTransparencyGroup %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); + + //states[statepos].createsoftmask |= forSoftMask; + states[statepos].createsoftmask = forSoftMask; + states[statepos].transparencygroup = !forSoftMask; + states[statepos].isolated = isolated; + + states[statepos].olddevice = this->device; + this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); + dbg("this->device now %p (old: %p)", this->device, states[statepos].olddevice); + + gfxdevice_record_init(this->device, 0); + + /*if(!forSoftMask) { ////??? + state->setFillOpacity(0.0); + }*/ + dbgindent+=2; +} + +void VectorGraphicOutputDev::endTransparencyGroup(GfxState *state) +{ + dbgindent-=2; + gfxdevice_t*r = this->device; + + dbg("endTransparencyGroup this->device now back to %p (destroying %p)", states[statepos].olddevice, this->device); + + this->device = states[statepos].olddevice; + if(!this->device) { + msg(" Invalid state nesting"); + } + states[statepos].olddevice = 0; + + gfxresult_t*recording = r->finish(r); + + dbg(" forsoftmask=%d recording=%p/%p", states[statepos].createsoftmask, r, recording); + msg(" endTransparencyGroup forsoftmask=%d recording=%p/%p", states[statepos].createsoftmask, r, recording); + + if(states[statepos].createsoftmask) { + states[statepos-1].softmaskrecording = recording; + } else { + states[statepos-1].grouprecording = recording; + } + + states[statepos].createsoftmask = 0; + states[statepos].transparencygroup = 0; + free(r); +} + +void VectorGraphicOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) +{ + const char*blendmodes[] = {"normal","multiply","screen","overlay","darken", "lighten", + "colordodge","colorburn","hardlight","softlight","difference", + "exclusion","hue","saturation","color","luminosity"}; + + dbg("paintTransparencyGroup blend=%s softmaskon=%d recording=%p", blendmodes[state->getBlendMode()], states[statepos].softmask, states[statepos].grouprecording); + msg(" paintTransparencyGroup blend=%s softmaskon=%d", blendmodes[state->getBlendMode()], states[statepos].softmask); + + if(state->getBlendMode() == gfxBlendNormal) + infofeature("transparency groups"); + else { + char buffer[80]; + sprintf(buffer, "%s blended transparency groups", blendmodes[state->getBlendMode()]); + warnfeature(buffer, 0); + } + + gfxresult_t*grouprecording = states[statepos].grouprecording; + + int blendmode = state->getBlendMode(); + if(blendmode == gfxBlendNormal || blendmode == gfxBlendMultiply) { + int alpha = (int)(state->getFillOpacity()*255); + if(blendmode == gfxBlendMultiply && alpha>200) + alpha = 128; + gfxdevice_t ops; + dbg("this->device=%p, this->device->name=%s\n", this->device, this->device->name); + gfxdevice_ops_init(&ops, this->device, alpha); + gfxresult_record_replay(grouprecording, &ops, 0); + ops.finish(&ops); + } + grouprecording->destroy(grouprecording); + + states[statepos].grouprecording = 0; +} + +void VectorGraphicOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *rgb) +{ + if(states[statepos].softmask) { + /* shouldn't happen, but *does* happen */ + clearSoftMask(state); + } + + /* alpha = 1: retrieve mask values from alpha layer + alpha = 0: retrieve mask values from luminance */ + + dbg("setSoftMask %.1f/%.1f/%.1f/%.1f alpha=%d backdrop=%02x%02x%02x", + bbox[0], bbox[1], bbox[2], bbox[3], alpha, colToByte(rgb->c[0]), colToByte(rgb->c[1]), colToByte(rgb->c[2])); + msg(" setSoftMask %.1f/%.1f/%.1f/%.1f alpha=%d backdrop=%02x%02x%02x", + bbox[0], bbox[1], bbox[2], bbox[3], alpha, colToByte(rgb->c[0]), colToByte(rgb->c[1]), colToByte(rgb->c[2])); + if(!alpha) + infofeature("soft masks"); + else + warnfeature("soft masks from alpha channel",0); + + if(states[statepos].olddevice) { + msg(" Internal error: badly balanced softmasks/transparency groups"); + exit(1); + } + states[statepos].olddevice = this->device; + this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); + gfxdevice_record_init(this->device, 0); + + dbg("softmaskrecording is %p (dev=%p) at statepos %d\n", states[statepos].softmaskrecording, this->device, statepos); + + states[statepos].softmask = 1; + states[statepos].softmask_alpha = alpha; +} + +static inline Guchar div255(int x) { + return (Guchar)((x + (x >> 8) + 0x80) >> 8); +} + +static unsigned char clampU8(unsigned char c, unsigned char min, unsigned char max) +{ + if(c < min) c = min; + if(c > max) c = max; + return c; +} + +void VectorGraphicOutputDev::clearSoftMask(GfxState *state) +{ + if(!states[statepos].softmask) + return; + states[statepos].softmask = 0; + dbg("clearSoftMask statepos=%d", statepos); + msg(" clearSoftMask statepos=%d", statepos); + + if(!states[statepos].softmaskrecording || strcmp(this->device->name, "record")) { + msg(" Error in softmask/tgroup ordering"); + return; + } + + gfxresult_t*mask = states[statepos].softmaskrecording; + gfxresult_t*below = this->device->finish(this->device);free(this->device); + this->device = states[statepos].olddevice; + + /* get outline of all objects below the soft mask */ + gfxdevice_t uniondev; + gfxdevice_union_init(&uniondev, 0); + gfxresult_record_replay(below, &uniondev, 0); + gfxline_t*belowoutline = gfxdevice_union_getunion(&uniondev); + uniondev.finish(&uniondev); + gfxbbox_t bbox = gfxline_getbbox(belowoutline); + gfxline_free(belowoutline);belowoutline=0; +#if 0 + this->device->startclip(this->device, belowoutline); + gfxresult_record_replay(below, this->device, 0); + gfxresult_record_replay(mask, this->device, 0); + this->device->endclip(this->device); +#endif + + int width = (int)bbox.xmax,height = (int)bbox.ymax; + if(width<=0 || height<=0) + return; + + gfxdevice_t belowrender; + gfxdevice_render_init(&belowrender); + if(states[statepos+1].isolated) { + belowrender.setparameter(&belowrender, "fillwhite", "1"); + } + belowrender.setparameter(&belowrender, "antialize", "2"); + belowrender.startpage(&belowrender, width, height); + gfxresult_record_replay(below, &belowrender, 0); + belowrender.endpage(&belowrender); + gfxresult_t* belowresult = belowrender.finish(&belowrender); + gfximage_t* belowimg = (gfximage_t*)belowresult->get(belowresult,"page0"); + //png_write("below.png", (unsigned char*)belowimg->data, belowimg->width, belowimg->height); + + gfxdevice_t maskrender; + gfxdevice_render_init(&maskrender); + maskrender.startpage(&maskrender, width, height); + gfxresult_record_replay(mask, &maskrender, 0); + maskrender.endpage(&maskrender); + gfxresult_t* maskresult = maskrender.finish(&maskrender); + gfximage_t* maskimg = (gfximage_t*)maskresult->get(maskresult,"page0"); + + if(belowimg->width != maskimg->width || belowimg->height != maskimg->height) { + msg(" Internal error in mask drawing"); + return; + } + + int y,x; + for(y=0;ydata[maskimg->width*y]; + gfxcolor_t* l2 = &belowimg->data[belowimg->width*y]; + for(x=0;xa; + } else { + alpha = (77*l1->r + 151*l1->g + 28*l1->b) >> 8; + } + + l2->a = div255(alpha*l2->a); + + /* DON'T premultiply alpha- this is done by fillbitmap, + depending on the output device */ + //l2->r = div255(alpha*l2->r); + //l2->g = div255(alpha*l2->g); + //l2->b = div255(alpha*l2->b); + + l1++; + l2++; + } + } + gfxline_t*line = gfxline_makerectangle(0,0,width,height); + + gfxmatrix_t matrix; + matrix.m00 = 1.0; matrix.m10 = 0.0; matrix.tx = 0.0; + matrix.m01 = 0.0; matrix.m11 = 1.0; matrix.ty = 0.0; + + if(!config_textonly) { + this->device->fillbitmap(this->device, line, belowimg, &matrix, 0); + } + + mask->destroy(mask); + below->destroy(below); + maskresult->destroy(maskresult); + belowresult->destroy(belowresult); + states[statepos].softmaskrecording = 0; +} + +//class MemCheck +//{ +// public: ~MemCheck() +// { +// delete globalParams;globalParams=0; +// Object::memCheck(stderr); +// gMemReport(stderr); +// } +//} myMemCheck; + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h new file mode 100644 index 000000000..479d77b91 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h @@ -0,0 +1,219 @@ +#ifndef __vectorgraphicsoutputdev_h__ +#define __vectorgraphicsoutputdev_h__ + +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../gfxtools.h" +#include "../kdtree.h" + +#include "CommonOutputDev.h" +#include "InfoOutputDev.h" +#include "CharOutputDev.h" +#include "PDFDoc.h" +#include "GlobalParams.h" + +class GFXOutputState { + public: + int clipping; + int textRender; + char createsoftmask; + char transparencygroup; + char softmask; + char softmask_alpha; + char isolated; + + gfxbbox_t clipbbox; + + GFXOutputState(); + + gfxresult_t* grouprecording; // for transparency groups + gfxresult_t* softmaskrecording; // for soft masks + + gfxdevice_t* olddevice; + + double *dashPattern; + int dashLength; + double dashStart; + + GfxState*state; +}; + +void addGlobalFont(const char*filename); +void addGlobalLanguageDir(const char*dir); +void addGlobalFontDir(const char*dirname); + +class GFXLink; + +void drawchar_callback(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); +void addfont_callback(gfxdevice_t*dev, gfxfont_t*font); + +class VectorGraphicOutputDev: public CommonOutputDev { +public: + gfxdevice_t* device; + + VectorGraphicOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); + virtual ~VectorGraphicOutputDev() ; + + virtual void setDevice(gfxdevice_t*dev); + virtual void setParameter(const char*key, const char*value); + + // Start a page. + virtual void beginPage(GfxState *state, int pageNum); + virtual void endPage(); + + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown(); + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar(); + + //virtual GBool useShadedFills() { return gTrue; } + + //----- link borders + virtual void processLink(Link *link, Catalog *catalog); + virtual void setDefaultCTM(double *ctm); + + //----- save/restore graphics state + virtual void saveState(GfxState *state) ; + virtual void restoreState(GfxState *state) ; + + //----- update graphics state + virtual void updateLineDash(GfxState *state); + virtual void updateFont(GfxState *state); + virtual void updateFontMatrix(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state) ; + virtual void fill(GfxState *state) ; + virtual void eoFill(GfxState *state) ; + + //----- path clipping + virtual void clip(GfxState *state) ; + virtual void eoClip(GfxState *state) ; + virtual void clipToStrokePath(GfxState *state); + + //----- shaded fills + virtual GBool useTilingPatternFill(); + virtual GBool useShadedFills(); + +virtual POPPLER_TILING_PATERN_RETURN tilingPatternFill(GfxState *state, + POPPLER_TILING_PATERN_GFX + Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep); + virtual GBool functionShadedFill(GfxState *state, + GfxFunctionShading *shading); + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading); + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading); + + //----- text drawing + virtual void beginString(GfxState *state, GString *s) ; + virtual void endString(GfxState *state) ; + virtual void endTextObject(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap); + + //----- transparency groups and soft masks (xpdf >= ~ 3.01.16) + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask); + virtual void endTransparencyGroup(GfxState *state); + virtual void paintTransparencyGroup(GfxState *state, double *bbox); + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor); + virtual void clearSoftMask(GfxState *state); + + //----- type 3 chars + virtual GBool beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); + + char* searchForSuitableFont(GfxFont*gfxFont); + + void finish(); + + virtual GBool useDrawForm(); + virtual void drawForm(Ref id); + virtual GBool needNonText(); + + private: + gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed); + + void drawGeneralImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap*colorMap, GBool invert, + GBool inlineImg, int mask, int *maskColors, + Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap); + + void strokeGfxline(GfxState *state, gfxline_t*line, int flags); + void clipToGfxLine(GfxState *state, gfxline_t*line, char evenodd); + void fillGfxLine(GfxState *state, gfxline_t*line, char evenodd); + + int currentpage; + char outer_clip_box; //whether the page clip box is still on + GFXOutputState states[64]; + int statepos; + + int type3active; // are we between beginType3()/endType3()? + GfxState *laststate; + + gfxline_t* current_text_stroke; + gfxline_t* current_text_clip; + gfxfont_t* current_gfxfont; + FontInfo*current_fontinfo; + gfxmatrix_t current_font_matrix; + + /* config */ + int config_break_on_warning; + int config_remapunicode; + int config_transparent; + int config_convertgradients; + int config_disable_polygon_conversion; + int config_multiply; + int config_drawonlyshapes; + int config_textonly; + + gfxdevice_t char_output_dev; + CharOutputDev*charDev; + friend void drawchar_callback(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); + friend void addfont_callback(gfxdevice_t*dev, gfxfont_t*font); + gfxfont_t*gfxfont_from_callback; + int glyphnr_from_callback; + gfxcolor_t textcolor_from_callback; + gfxmatrix_t textmatrix_from_callback; +}; + +#endif //__vectorgraphicsoutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc new file mode 100644 index 000000000..06aad0275 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc @@ -0,0 +1,160 @@ +/* XMLOutputDev.cc + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "../../config.h" +#include +#include +#include "XMLOutputDev.h" +#include "GfxState.h" +#include "popplercompat.h" +#ifndef HAVE_POPPLER + #include "gfile.h" +#endif + +XMLOutputDev::XMLOutputDev(char*filename) +:TextOutputDev(mktmpname(0), false, false, false) +{ + out = fopen(filename, "wb"); + if(!out) { + perror(filename); + exit(-1); + } + fprintf(out, "\n"); + fprintf(out, "\n"); +} + +XMLOutputDev::~XMLOutputDev() +{ + fprintf(out, "\n"); + fclose(out); +} + +void XMLOutputDev::startPage(int pageNum, GfxState *state) +{ + TextOutputDev::startPage(pageNum, state); + fprintf(out, "\n", pageNum, + state->getPageWidth(), state->getPageHeight()); +} + +void XMLOutputDev::endPage() +{ + TextOutputDev::endPage(); + TextWordList* list = makeWordList(); + int len = list->getLength(); + int i; + + char textTag = 0; + GString*fontname = new GString(); + double fontsize = -99999; + double base = -9999; + double color_r = -1; + double color_g = -1; + double color_b = -1; + for(i=0;iget(i); + GString*newfont = word->getFontName(); + double newsize = word->getFontSize(); +#ifdef HAVE_POPPLER + double newbase = word->getBaseline(); +#else + double newbase = word->base; +#endif + double newcolor_r; + double newcolor_g; + double newcolor_b; + word->getColor(&newcolor_r, &newcolor_g, &newcolor_b); + + if((newfont && newfont->cmp(fontname)) || + newsize != fontsize || + newbase != base || + newcolor_r != color_r || + newcolor_g != color_g || + newcolor_b != color_b + ) + { + TextFontInfo*info = word->getFontInfo(); + if(textTag) + fprintf(out, "\n"); + textTag = 1; + GBool italic = gFalse; + GBool bold = gFalse; + GBool serif = gFalse; + + if(info->isItalic()) italic = gTrue; + if(info->isBold()) bold = gTrue; + if(info->isSerif()) serif = gTrue; + char*name = (char*)""; + if(newfont) { + name = newfont->lowerCase()->getCString(); + if(strlen(name)>7 && name[6]=='+') + name += 7; + if(strstr(name, "ital")) italic = gTrue; + if(strstr(name, "slan")) italic = gTrue; + if(strstr(name, "obli")) italic = gTrue; + if(strstr(name, "bold")) bold = gTrue; + if(strstr(name, "heav")) bold = gTrue; + if(strstr(name, "medi")) bold = gTrue; + if(strstr(name, "serif")) serif = gTrue; + } + + double xMin,yMin,xMax,yMax; + word->getBBox(&xMin, &yMin, &xMax, &yMax); + + int rot = word->getRotation(); + + fprintf(out, "", + name, + newbase, + (rot&1)?yMin:xMin, + (rot&1)?yMin:xMin, + (rot&1)?xMin:yMin, + (rot&1)?yMax:xMax, + (rot&1)?xMax:yMax, + info->isFixedWidth()?"fixed;":"", + serif?"serif;":"", + italic?"italic;":"", + bold?"bold;":"", + newsize, + ((int)(newcolor_r*255))&0xff, + ((int)(newcolor_g*255))&0xff, + ((int)(newcolor_b*255))&0xff + ); + fontname = newfont->copy(); + fontsize = newsize; + base = newbase; + color_r = newcolor_r; + color_g = newcolor_g; + color_b = newcolor_b; + } + char*s = word->getText()->getCString(); + while(*s) { + switch(*s) { + case '<': fprintf(out, "<");break; + case '>': fprintf(out, ">");break; + case '&': fprintf(out, "&");break; + default: fwrite(s, 1, 1, out); + } + s++; + } + if(word->getSpaceAfter()) + fprintf(out, " "); + } + if(textTag) fprintf(out, "\n"); + fprintf(out, "\n"); +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h new file mode 100644 index 000000000..414462209 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h @@ -0,0 +1,35 @@ +/* XMLOutputDev.h + + This file is part of swftools. + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __xmloutputdev_h__ +#define __xmloutputdev_h__ + +#include "OutputDev.h" +#include "TextOutputDev.h" + +class XMLOutputDev: public TextOutputDev +{ + public: + XMLOutputDev(char*filename); + virtual void startPage(int pageNum, GfxState *state); + virtual void endPage(); + virtual ~XMLOutputDev(); + private: + FILE*out; +}; +#endif //__xmloutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h new file mode 100644 index 000000000..53817a488 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h @@ -0,0 +1,28 @@ +/* aconf.h. Generated by configure. */ +/* + * aconf.h + * + * Copyright 2002 Glyph & Cog, LLC + */ + +#ifndef ACONF_H +#define ACONF_H +#include "../../config.h" + +#define SYSTEM_XPDFRC "/etc/xpdf/xpdfrc" + +#define HAVE_STRINGS_H 1 + +#define TEXTOUT_WORD_LIST 1 + +// todo: +// +// HAVE_STRINGS_H +// HAVE_BSTRING_H +// HAVE_SYS_SELECT_H +// SELECT_TAKES_INT +// HAVE_FSEEK64 +// HAVE_MKSTEMPS +// HAVE_FSEEKO 1 + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c b/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c new file mode 100644 index 000000000..ac7285cc4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c @@ -0,0 +1,481 @@ +#include +#include +#include +#include +#include +#include "../types.h" +#include "../mem.h" + +typedef struct _ibbox { + int xmin,ymin,xmax,ymax; + struct _ibbox*next; +} ibbox_t; + +ibbox_t* ibbox_new(int x1, int y1, int x2, int y2) +{ + ibbox_t*b = (ibbox_t*)rfx_calloc(sizeof(ibbox_t)); + b->xmin = x1; + b->ymin = y1; + b->xmax = x2; + b->ymax = y2; + return b; +} + +void ibbox_destroy(ibbox_t*b) +{ + while(b) { + ibbox_t*next = b->next; + free(b); + b = next; + } +} + +ibbox_t*get_bitmap_bboxes_simple(unsigned char*alpha, int width, int height, int rowsize) +{ + int ymin = -1; + int ymax = -1; + int xmin = width; + int xmax = 0; + + int x,y; + for(y=0;yxmax) xmax = right; + } + } + ibbox_t* bbox = 0; + if(xminwidth*y+x; + head_t*h = rfx_calloc(sizeof(head_t)); + h->magic = HEAD_MAGIC; + h->nr = context->count++; + h->pos = pos; + h->x = x; + h->y = y; + h->bbox.xmin = h->bbox.xmax = x; + h->bbox.ymin = h->bbox.ymax = y; + h->next = context->heads; + context->heads = h; + if(h->next) { + h->next->prev = h; + } + return h; +} + +static void head_delete(context_t*context, head_t*h) +{ + if(h->prev) { + h->prev->next = h->next; + } + if(h->next) { + h->next->prev = h->prev; + } + if(h==context->heads) { + assert(!h->prev); + context->heads = h->next; + } + free(h); +} + +#define POINTS_TO_HEAD(ptr) (((head_t*)(ptr))->magic==HEAD_MAGIC) + +static inline void link_to(context_t*context, int from, int to) +{ + // path compression + void**data = context->group; + int head = to; + assert(data[head]); + while(!POINTS_TO_HEAD(data[head])) { + assert(data[head]!=(void*)&data[head]); // check that we're not in an infinite loop + head=(void**)data[head]-(void**)data; + } + head_t*h = (head_t*)data[head]; + int x = from%context->width; + int y = from/context->width; + if(x < h->bbox.xmin) h->bbox.xmin = x; + if(y < h->bbox.ymin) h->bbox.ymin = y; + if(x > h->bbox.xmax) h->bbox.xmax = x; + if(y > h->bbox.ymax) h->bbox.ymax = y; + + data[from] = (void*)&data[head]; +} +static char ibbox_does_overlap(ibbox_t*b1, ibbox_t*b2) +{ + if(b1->xmax < b2->xmin) return 0; + if(b2->xmax < b1->xmin) return 0; + if(b1->ymax < b2->ymin) return 0; + if(b2->ymax < b1->ymin) return 0; + return 1; +} +static void ibbox_expand(ibbox_t*src, ibbox_t*add) +{ + if(add->xmin < src->xmin) + src->xmin = add->xmin; + if(add->ymin < src->ymin) + src->ymin = add->ymin; + if(add->xmax > src->xmax) + src->xmax = add->xmax; + if(add->ymax > src->ymax) + src->ymax = add->ymax; +} +static inline void merge(context_t*context, int set1, int set2) +{ + void**data = context->group; + assert(data[set1]); + assert(data[set2]); + int head1 = set1; + int head2 = set2; + while(!POINTS_TO_HEAD(data[head1])) { + head1=(void**)data[head1]-(void**)data; + } + while(!POINTS_TO_HEAD(data[head2])) { + head2=(void**)data[head2]-(void**)data; + } + head_t*h1 = (head_t*)data[head1]; + head_t*h2 = (head_t*)data[head2]; + if(h1==h2) + return; + + if(h1->rank>h2->rank) { + h1->rank++; + ibbox_expand(&h1->bbox,&h2->bbox); + data[head2] = (void*)&data[head1]; + head_delete(context, h2); + } else { + h2->rank++; + ibbox_expand(&h2->bbox,&h1->bbox); + data[head1] = (void*)&data[head2]; + head_delete(context, h1); + } +} + +ibbox_t ibbox_clip(ibbox_t* outer, ibbox_t* inner) +{ + ibbox_t i = {inner->xmin, inner->ymin, inner->xmax, inner->ymax, 0}; + if(i.xmax > outer->xmax) i.xmax = outer->xmax; + if(i.ymax > outer->ymax) i.ymax = outer->ymax; + if(i.xmax < outer->xmin) i.xmax = outer->xmin; + if(i.ymax < outer->ymin) i.ymax = outer->ymin; + + if(i.xmin > outer->xmax) i.xmin = outer->xmax; + if(i.ymin > outer->ymax) i.ymin = outer->ymax; + if(i.xmin < outer->xmin) i.xmin = outer->xmin; + if(i.ymin < outer->ymin) i.ymin = outer->ymin; + return i; +} + +static void** annotate(context_t*context) +{ + unsigned char*alpha = context->alpha; + int width = context->width; + int height = context->height; + void** group = rfx_calloc(width*height*sizeof(void*)); + context->group = group; + int x,y; + + for(x=1;xrowsize; + if(alpha[apos]) { + if(group[pos-width]) + link_to(context,pos,pos-width); + else + group[pos]=head_new(context,0,y); + } + for(x=1;xheads; + changed = 0; + while(h1) { + head_t*next = h1->next; + head_t*h2 = context->heads; + while(h2) { + if(h1!=h2) { + if(ibbox_does_overlap(&h1->bbox, &h2->bbox)) { + merge(context, h1->pos, h2->pos); + changed = 1; + break; + } + } + h2 = h2->next; + } + h1 = next; + } + } while(changed); +} + +typedef struct _circle_coord { + S16 x,y; +} circle_coord_t; + +static int compare_circle_coord(const void *_v1, const void *_v2) +{ + circle_coord_t*v1=(circle_coord_t*)_v1; + circle_coord_t*v2=(circle_coord_t*)_v2; + return (v1->x*v1->x + v1->y*v1->y) - (v2->x*v2->x + v2->y*v2->y); +} + +static head_t* search_vicinity(context_t*context, head_t*h, int max_radius, double*cos, double*sin) +{ + static circle_coord_t*circle_order = 0; + static int circle_order_size = 0; + + if(!circle_order) { + circle_order_size = (max_radius*(max_radius+1))/2; + circle_order = malloc(sizeof(circle_coord_t)*circle_order_size); + int x,y; + int i = 0; + for(y=0;ygroup; + int signx[4] = {-1,1,-1,1}; + int signy[4] = {-1,-1,1,1}; + for(t=1;tx+xx*signx[s]; + int y=h->y+yy*signy[s]; + if(x>=0 && y>=0 && xwidth && yheight) { + int pos = y*context->width+x; + if(data[pos]) { + while(!POINTS_TO_HEAD(data[pos])) { + pos=(void**)data[pos]-(void**)data; + } + head_t*new_head = (head_t*)data[pos]; + if(new_head != h) { + return new_head; + } + } + } + } + } + return 0; +} + +static void fix_small_boxes(context_t*context) +{ + double sintab[256]; + double costab[256]; + int t; + for(t=0;t<256;t++) { + sintab[t] = sin(t*M_PI/128); + costab[t] = cos(t*M_PI/128); + } + + head_t*h = context->heads; + while(h) { + h->seen = 0; + h = h->next; + } + + char changed; + do { + changed = 0; + head_t*h = context->heads; + while(h) { + head_t*next = h->next; + if(!h->seen) { + if(h->bbox.xmax - h->bbox.xmin < 32 + || h->bbox.ymax - h->bbox.ymin < 32) { + head_t*other = search_vicinity(context, h, 64, costab, sintab); + if(other) { + merge(context, h->pos, other->pos); + changed = 1; + break; + } else { + //printf("nothing in the vicinity of %d,%d,%d,%d\n", h->bbox); + h->seen = 1; + } + } /*else { + printf("area %d,%d,%d,%d is large enough (%dx%d)\n", + h->bbox.xmin, + h->bbox.ymin, + h->bbox.xmax, + h->bbox.ymax, + h->bbox.xmax - h->bbox.xmin, + h->bbox.ymax - h->bbox.ymin); + } */ + } + h = next; + } + } while(changed); +} + +static void display(context_t*context) +{ + int width = context->width; + int height = context->height; + void**group = context->group; + + int x,y; + for(y=0;ynr); + } else { + printf("x%02d ", (void**)group[y*width+x]-(void**)group); + } + } + printf("\n"); + } + + head_t*h = context->heads; + while(h) { + printf("head: %d\n", h->nr); + printf(" pos: %d/%d\n", h->pos%width, h->pos/width); + printf(" bbox: [%d/%d,%d/%d]\n", h->bbox.xmin, h->bbox.ymin, h->bbox.xmax, h->bbox.ymax); + h = h->next; + } +} + +ibbox_t*get_bitmap_bboxes(unsigned char*alpha, int width, int height, int rowsize) +{ + int size = width*height; + if(width<=1 || height<=1) + return get_bitmap_bboxes_simple(alpha, width, height, rowsize); + + context_t context; + context.alpha = alpha; + context.rowsize = rowsize; + context.width = width; + context.height = height; + context.heads = 0; + context.count = 1; + + void**group = annotate(&context); + fix_small_boxes(&context); + overlap_bboxes(&context); +#ifdef MAIN + display(&context); +#endif + + ibbox_t*bboxes = 0; + + head_t*h = context.heads; + while(h) { + head_t*next = h->next; + ibbox_t*bbox = malloc(sizeof(ibbox_t)); + memcpy(bbox, &h->bbox, sizeof(ibbox_t)); + + /* ibbox_t defines the open upper bound */ + bbox->xmax++; + bbox->ymax++; + + bbox->next = bboxes; + bboxes = bbox; + free(h); + h = next; + } + free(context.group); + return bboxes; +} + +#ifdef MAIN +int main(int argn, char*argv[]) +{ + unsigned char alpha[8*8]= + "\0\0\1\0\0\0\0\0" + "\1\0\0\1\0\1\0\0" + "\0\0\0\0\0\0\1\0" + "\0\0\1\0\1\0\0\0" + "\1\0\1\0\1\0\0\0" + "\1\0\1\1\1\0\0\1" + "\1\0\0\0\0\0\1\0" + "\1\1\1\0\0\0\0\0"; + + get_bitmap_bboxes(alpha, 8,8, 8); +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h new file mode 100644 index 000000000..8ee94872e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h @@ -0,0 +1,23 @@ +#ifndef __bbox_h__ +#define __bbox_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _ibbox { + int xmin,ymin,xmax,ymax; + struct _ibbox*next; +} ibbox_t; + +ibbox_t ibbox_clip(ibbox_t* outer, ibbox_t* inner); + +ibbox_t* ibbox_new(int x1, int y1, int x2, int y2, int rowsize); +void ibbox_destroy(ibbox_t*b); +ibbox_t*get_bitmap_bboxes(unsigned char*alpha, int width, int height, int rowsize); + +#ifdef __cplusplus +} +#endif + +#endif //__bbox_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc new file mode 100644 index 000000000..c74f743bc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc @@ -0,0 +1,661 @@ +#include +#include +#include +#include "GfxState.h" +static struct _rgb {unsigned char r,g,b;} +cmyk2rgb[8*16*16*8] = { +{255,255,255},{222,223,225},{191,192,195},{162,164,167},{133,135,138},{106,107,110},{73,74,75},{34,30,31},{255,254,241},{223,222,212},{192,191,184},{163,163,157},{134,134,129},{107,106,103},{74,73,70},{33,29,27},{255,253,227},{223,221,199},{192,191,174},{163,163,147},{135,134,121},{107,106,96},{74,73,65},{33,29,23},{255,252,214},{224,220,188},{193,190,164},{164,162,140},{135,133,115},{107,105,90},{74,72,61},{32,28,19}, +{255,251,201},{225,220,177},{193,190,154},{164,162,132},{135,133,108},{107,105,85},{74,72,56},{32,28,15},{255,250,187},{226,219,165},{194,189,144},{164,161,122},{135,132,100},{107,104,79},{74,72,52},{31,28,9},{255,249,173},{227,219,154},{195,189,134},{164,160,113},{135,132,92},{107,104,72},{74,72,47},{31,28,5},{255,248,160},{226,218,142},{195,188,123},{165,159,104},{135,131,85},{107,103,65},{74,71,41},{30,27,2}, +{255,247,147},{227,216,130},{196,187,112},{165,158,95},{135,131,77},{107,103,59},{74,71,35},{29,26,0},{255,246,133},{228,215,117},{197,186,101},{165,157,86},{135,130,69},{107,103,52},{74,70,29},{28,26,0},{255,245,117},{228,214,103},{196,186,90},{165,157,76},{135,130,60},{107,103,44},{74,70,21},{27,26,0},{255,244,100},{227,214,89},{195,185,78},{165,157,65},{135,129,50},{107,102,35},{73,70,12},{26,26,0}, +{255,244,78},{227,213,72},{195,184,62},{165,156,51},{135,129,38},{107,102,22},{73,70,6},{25,26,0},{255,243,54},{228,212,52},{196,183,44},{165,155,36},{135,128,24},{107,101,7},{72,69,1},{24,25,0},{255,242,27},{228,212,27},{196,183,22},{165,155,18},{135,128,12},{107,101,3},{72,69,0},{24,25,0},{255,241,0},{227,212,0},{195,182,0},{165,154,0},{136,127,0},{107,100,0},{72,69,0},{24,25,0}, +{253,241,246},{220,210,216},{190,182,189},{161,154,161},{133,127,133},{106,101,105},{74,69,72},{34,26,28},{254,240,232},{221,209,204},{191,181,178},{162,154,152},{133,127,125},{106,100,99},{74,68,67},{33,25,24},{254,239,219},{222,209,193},{191,181,168},{162,154,143},{134,127,117},{106,100,92},{74,68,62},{33,25,20},{254,238,207},{222,208,182},{192,180,159},{163,153,135},{134,126,111},{106,99,87},{74,67,58},{32,24,16}, +{254,237,194},{223,207,172},{192,179,149},{163,153,127},{134,126,104},{106,99,82},{74,67,53},{32,24,11},{255,236,181},{224,206,160},{193,178,140},{163,152,118},{134,125,97},{106,98,76},{73,67,49},{31,24,6},{255,235,168},{225,206,149},{193,178,130},{163,151,110},{134,124,89},{106,98,69},{73,67,44},{31,23,2},{255,234,155},{225,205,137},{194,177,119},{164,150,101},{134,124,82},{106,97,62},{73,66,38},{30,23,1}, +{255,233,143},{225,204,126},{194,176,108},{164,149,92},{134,124,74},{106,97,56},{73,66,32},{29,22,0},{255,232,129},{226,203,114},{195,176,98},{164,148,83},{134,123,66},{106,97,49},{73,65,26},{28,22,0},{255,231,114},{226,202,100},{194,176,88},{164,148,73},{134,123,57},{106,97,41},{73,65,19},{27,22,0},{255,230,98},{226,202,86},{194,175,76},{164,148,63},{134,122,48},{106,96,32},{72,65,10},{26,22,0}, +{255,230,77},{226,201,70},{194,174,61},{164,147,49},{134,122,36},{106,96,20},{72,65,5},{26,22,0},{255,229,56},{226,200,53},{194,173,45},{164,146,35},{134,121,22},{106,95,6},{72,64,0},{25,21,0},{255,229,28},{226,200,28},{194,173,23},{164,146,17},{134,121,11},{106,95,2},{72,64,0},{25,21,0},{255,228,0},{226,200,1},{194,172,2},{164,146,0},{135,120,0},{106,94,0},{72,64,0},{24,21,0}, +{252,226,237},{219,197,207},{189,172,182},{161,145,155},{133,119,128},{106,94,101},{75,63,70},{34,21,26},{253,225,224},{220,197,196},{190,171,172},{162,145,146},{133,119,121},{105,93,95},{74,62,65},{33,20,22},{254,224,211},{221,197,186},{191,171,162},{162,145,138},{133,119,114},{105,93,89},{74,62,59},{33,20,16},{254,223,199},{221,196,176},{192,170,153},{162,144,130},{133,118,108},{105,92,84},{74,61,55},{32,20,12}, +{254,222,187},{221,195,166},{192,169,144},{162,144,122},{133,118,101},{105,92,79},{74,61,51},{32,20,8},{255,221,175},{223,194,154},{192,168,135},{163,143,115},{133,117,94},{105,91,73},{73,61,46},{31,19,3},{255,220,162},{224,194,144},{192,168,126},{163,142,107},{133,116,86},{105,91,67},{73,61,41},{31,18,0},{255,219,150},{224,193,133},{193,167,115},{163,141,98},{134,116,79},{106,91,60},{73,60,36},{30,18,0}, +{255,219,138},{224,192,122},{193,166,105},{163,141,89},{134,116,72},{106,91,54},{73,60,30},{29,18,0},{255,218,126},{224,191,111},{193,166,96},{163,140,81},{134,115,64},{106,90,47},{73,60,24},{28,17,0},{255,218,111},{225,191,98},{193,166,86},{163,140,71},{134,115,55},{106,90,39},{73,60,17},{27,17,0},{255,217,96},{226,190,84},{194,165,75},{164,140,61},{134,114,46},{106,89,30},{72,59,8},{26,17,0}, +{255,217,77},{226,190,69},{194,165,60},{164,139,48},{134,114,34},{106,89,18},{72,59,4},{26,17,0},{255,216,57},{225,189,53},{193,164,45},{163,138,34},{133,113,21},{105,88,6},{72,59,0},{25,17,0},{255,216,30},{225,189,28},{193,164,24},{163,138,17},{133,113,10},{105,88,2},{72,59,0},{25,17,0},{255,215,1},{226,188,3},{194,163,3},{163,138,0},{134,113,0},{106,88,0},{72,59,0},{24,16,0}, +{250,214,229},{217,186,201},{188,162,176},{160,137,151},{133,112,124},{105,88,97},{74,59,66},{34,15,22},{251,212,217},{218,185,190},{189,161,167},{161,137,142},{133,112,117},{105,87,91},{73,58,61},{34,15,18},{252,211,204},{219,185,180},{190,161,158},{161,137,134},{133,112,110},{105,87,85},{73,58,56},{34,15,12},{252,211,193},{220,184,170},{190,160,149},{161,136,126},{132,111,104},{105,86,81},{73,57,52},{33,15,8}, +{253,210,181},{220,184,161},{190,160,140},{161,135,118},{132,111,97},{105,86,75},{73,57,48},{32,15,4},{253,209,169},{221,183,150},{191,159,131},{162,135,111},{132,110,90},{104,85,69},{73,57,44},{32,14,2},{253,208,158},{221,183,140},{191,159,122},{162,135,103},{132,110,83},{104,85,63},{73,57,39},{32,14,0},{254,207,146},{222,182,129},{191,158,112},{162,134,95},{133,109,76},{105,85,57},{73,56,33},{31,14,0}, +{254,207,134},{222,182,118},{191,157,103},{162,134,87},{133,109,70},{105,85,51},{73,56,27},{30,14,0},{254,206,122},{223,181,108},{191,157,94},{162,133,79},{133,108,62},{105,84,45},{73,56,22},{29,13,0},{254,206,108},{223,181,96},{191,156,83},{162,133,69},{133,108,53},{105,84,37},{73,56,15},{28,13,0},{254,205,94},{223,180,83},{192,155,72},{162,132,59},{133,108,44},{105,84,28},{72,55,6},{27,13,0}, +{254,205,76},{223,180,68},{192,155,58},{162,132,46},{133,108,33},{105,84,17},{72,55,3},{27,13,0},{255,204,58},{223,179,53},{191,155,44},{162,131,33},{133,107,20},{105,84,5},{72,55,0},{26,13,0},{255,204,34},{223,179,30},{191,155,25},{162,131,18},{133,107,10},{105,84,2},{72,55,0},{26,13,0},{254,203,9},{224,178,7},{192,154,5},{162,130,1},{133,106,0},{105,83,0},{72,55,0},{25,12,0}, +{249,201,221},{216,175,194},{188,151,170},{160,129,146},{133,105,120},{105,81,94},{74,54,63},{34,10,19},{250,199,209},{217,174,183},{189,150,161},{161,129,137},{133,105,113},{105,81,88},{73,53,58},{34,10,14},{250,198,197},{218,174,173},{189,150,152},{161,129,129},{133,105,106},{105,81,82},{73,53,53},{34,10,8},{251,198,186},{219,173,164},{189,150,144},{160,128,122},{132,104,100},{105,81,78},{73,52,49},{33,10,5}, +{252,198,175},{220,173,156},{189,150,135},{160,127,114},{132,103,94},{105,81,72},{73,52,45},{32,10,2},{252,197,164},{219,172,146},{190,149,126},{161,127,107},{132,103,87},{104,80,66},{73,52,41},{32,9,1},{252,196,153},{219,172,136},{191,149,118},{161,127,99},{132,103,80},{104,80,60},{73,52,36},{32,9,0},{252,195,142},{220,171,125},{190,148,109},{161,126,92},{132,102,73},{104,80,54},{73,52,30},{31,9,0}, +{252,195,130},{221,171,115},{190,148,100},{161,126,84},{132,102,67},{104,80,48},{73,52,24},{30,9,0},{253,194,118},{221,170,105},{190,147,91},{162,125,76},{133,101,60},{105,79,42},{73,51,19},{29,9,0},{253,194,105},{221,170,93},{190,147,80},{162,125,66},{133,101,51},{105,79,35},{73,51,13},{28,9,0},{253,193,91},{221,169,81},{191,146,69},{161,124,56},{132,101,43},{104,79,27},{72,51,5},{27,8,0}, +{253,193,76},{221,169,68},{191,146,57},{161,124,45},{132,101,32},{104,79,17},{72,51,2},{27,8,0},{254,192,59},{222,168,53},{190,146,44},{162,123,33},{133,100,20},{105,78,5},{72,51,0},{26,9,0},{254,192,38},{222,168,32},{190,146,25},{162,123,18},{133,100,10},{105,78,2},{72,51,0},{26,9,0},{253,191,16},{222,167,12},{190,145,7},{161,122,2},{133,99,0},{105,78,0},{72,51,0},{26,8,0}, +{247,187,214},{215,164,187},{187,141,164},{159,120,140},{132,98,115},{104,75,90},{73,48,60},{34,4,15},{248,185,202},{216,163,177},{188,140,155},{159,119,132},{132,98,108},{104,75,84},{73,47,55},{34,4,10},{249,184,190},{217,162,167},{188,140,146},{159,119,124},{132,98,101},{104,75,78},{73,47,51},{34,4,6},{250,184,179},{218,161,158},{188,140,138},{159,119,117},{131,97,96},{105,75,74},{74,47,47},{33,4,3}, +{250,184,169},{218,161,150},{188,140,130},{159,118,110},{131,96,90},{105,75,70},{74,47,43},{33,4,1},{250,183,158},{218,160,140},{189,139,122},{160,118,103},{131,96,84},{104,74,64},{73,47,39},{32,3,0},{250,183,147},{218,160,130},{189,139,114},{160,118,95},{131,96,77},{104,74,58},{73,47,34},{32,3,0},{250,182,136},{219,159,121},{189,138,105},{160,117,88},{132,95,70},{104,74,52},{72,46,28},{31,3,0}, +{250,181,126},{220,159,111},{189,138,96},{160,117,80},{132,95,64},{104,74,46},{72,46,22},{29,3,0},{251,180,114},{219,159,101},{189,137,87},{161,116,73},{132,94,57},{104,73,40},{73,46,17},{28,3,0},{251,180,102},{219,159,91},{189,137,78},{161,116,64},{132,94,49},{104,73,33},{73,46,11},{28,3,0},{251,179,89},{219,158,79},{189,136,67},{160,115,54},{131,94,41},{104,73,25},{72,46,4},{28,3,0}, +{251,179,75},{219,158,66},{189,136,55},{160,115,44},{131,94,30},{104,73,15},{72,46,1},{28,3,0},{252,179,60},{220,157,52},{189,136,43},{160,114,32},{132,93,18},{104,72,4},{72,46,0},{27,3,0},{252,179,41},{220,157,34},{189,136,26},{160,114,17},{132,93,9},{104,72,2},{72,46,0},{27,3,0},{251,178,22},{220,156,16},{189,135,9},{160,114,2},{132,93,0},{104,72,0},{71,46,0},{27,3,0}, +{246,173,206},{214,152,181},{186,131,158},{158,111,135},{131,90,110},{104,69,86},{73,42,57},{34,0,11},{247,172,194},{215,152,171},{187,130,149},{158,110,127},{131,90,104},{104,69,81},{73,42,52},{34,0,7},{247,171,182},{215,151,161},{187,130,140},{158,110,119},{131,90,97},{104,69,75},{73,42,48},{34,0,3},{248,170,173},{216,150,152},{187,130,133},{159,110,112},{131,89,93},{105,69,71},{74,42,44},{33,0,2}, +{248,170,163},{216,150,144},{187,130,125},{159,110,106},{131,89,87},{105,69,67},{74,42,40},{33,0,0},{248,170,153},{217,149,135},{187,129,118},{159,109,99},{131,88,81},{104,68,61},{73,42,36},{32,0,0},{248,170,142},{217,149,126},{187,129,110},{159,109,92},{131,88,74},{104,68,56},{73,42,31},{32,0,0},{248,169,132},{217,148,117},{188,128,101},{160,108,85},{132,88,67},{104,68,50},{72,41,25},{31,0,0}, +{249,169,122},{218,148,107},{188,128,93},{160,108,77},{132,88,61},{104,68,44},{72,41,20},{29,0,0},{250,168,111},{217,148,98},{188,127,84},{160,107,70},{132,87,54},{104,67,38},{73,41,15},{28,0,0},{250,168,99},{217,148,88},{188,127,75},{160,107,61},{132,87,47},{104,67,31},{73,41,9},{28,0,0},{249,167,87},{217,147,77},{188,126,65},{160,106,52},{131,87,39},{104,67,23},{72,41,4},{28,0,0}, +{249,167,73},{217,147,64},{188,126,53},{160,106,42},{131,87,28},{104,67,14},{72,41,1},{28,0,0},{250,166,59},{218,146,51},{188,126,42},{159,106,31},{131,86,17},{103,66,4},{72,41,0},{27,0,0},{250,166,43},{218,146,35},{188,126,27},{159,106,17},{131,86,9},{103,66,2},{72,41,0},{27,0,0},{249,165,27},{218,145,19},{188,125,11},{159,106,3},{132,86,0},{104,66,0},{71,41,0},{27,0,0}, +{245,160,198},{213,140,174},{185,121,152},{157,102,130},{130,83,106},{104,62,83},{73,37,54},{34,0,8},{246,159,187},{214,140,164},{186,120,143},{157,101,122},{131,82,100},{104,62,78},{73,37,49},{34,0,4},{246,159,175},{214,140,155},{186,120,135},{157,101,114},{131,82,94},{104,62,72},{73,37,46},{34,0,1},{247,158,166},{215,139,147},{186,120,128},{158,101,108},{130,82,89},{104,62,68},{73,37,42},{33,0,1}, +{247,158,158},{215,139,139},{186,120,121},{158,101,102},{130,82,84},{104,62,64},{73,37,38},{33,0,0},{246,157,148},{216,138,130},{186,119,114},{158,100,95},{131,81,78},{103,61,58},{72,37,33},{32,0,0},{246,157,138},{216,138,122},{186,119,106},{158,100,88},{131,81,71},{103,61,53},{72,37,28},{32,0,0},{247,157,129},{216,137,113},{187,118,98},{159,99,81},{131,81,65},{103,61,48},{71,36,23},{31,0,0}, +{248,157,119},{216,137,104},{187,118,90},{159,99,74},{131,81,59},{103,61,42},{71,36,18},{30,0,0},{249,156,108},{216,137,95},{187,118,82},{159,99,67},{131,80,52},{103,61,35},{72,36,12},{29,0,0},{249,156,97},{216,137,85},{187,118,73},{159,99,60},{131,80,44},{103,61,28},{72,36,8},{29,0,0},{248,155,85},{216,136,75},{187,117,63},{159,99,51},{131,80,37},{103,61,21},{72,36,3},{28,0,0}, +{248,155,72},{216,136,63},{187,117,52},{159,99,41},{131,80,27},{103,61,13},{72,36,1},{28,0,0},{248,154,58},{217,135,50},{187,117,41},{158,98,30},{130,79,16},{103,60,3},{71,36,0},{27,0,0},{248,154,43},{217,135,36},{187,117,28},{158,98,18},{130,79,8},{103,60,1},{71,36,0},{27,0,0},{248,153,28},{216,134,22},{187,116,15},{158,98,5},{131,79,0},{103,60,0},{71,36,0},{26,0,0}, +{243,147,190},{212,128,168},{184,111,146},{157,93,124},{130,75,102},{104,56,79},{73,30,51},{34,0,4},{244,147,179},{213,128,158},{185,110,138},{157,93,118},{131,74,96},{104,56,74},{73,31,47},{34,0,2},{244,147,169},{213,128,149},{185,110,130},{157,93,110},{131,74,90},{104,56,69},{73,31,43},{34,0,0},{245,146,160},{214,127,141},{185,110,124},{157,93,104},{130,75,85},{104,56,65},{73,31,39},{33,0,0}, +{245,146,152},{214,127,133},{185,110,117},{157,93,98},{130,75,80},{104,56,60},{73,31,35},{33,0,0},{244,145,142},{214,127,125},{184,109,110},{156,92,91},{130,74,74},{103,55,55},{72,31,31},{32,0,0},{244,144,133},{214,127,117},{184,109,102},{156,92,84},{130,74,68},{103,55,50},{72,31,26},{31,0,0},{245,145,124},{215,126,109},{185,108,94},{157,91,77},{130,73,62},{102,55,45},{71,30,21},{31,0,0}, +{246,145,115},{215,126,100},{185,108,86},{157,91,71},{130,73,56},{102,55,40},{71,30,16},{30,0,0},{247,144,105},{214,125,92},{185,108,79},{157,91,65},{130,73,50},{103,55,33},{72,31,10},{29,0,0},{247,144,94},{214,125,83},{185,108,71},{157,91,58},{130,73,42},{103,55,26},{72,31,6},{29,0,0},{246,143,83},{214,125,73},{185,108,61},{157,91,49},{130,73,35},{103,55,19},{72,31,2},{28,0,0}, +{246,143,70},{214,125,61},{185,108,50},{157,91,39},{130,73,25},{103,55,11},{72,31,1},{28,0,0},{246,142,57},{215,124,49},{185,107,40},{157,90,28},{130,73,14},{103,54,3},{71,30,0},{27,0,0},{246,142,44},{215,124,37},{185,107,29},{157,90,18},{130,73,7},{103,54,1},{71,30,0},{27,0,0},{246,141,30},{215,124,24},{185,107,18},{157,90,6},{130,72,0},{103,54,0},{71,30,0},{26,0,0}, +{242,135,182},{211,116,161},{183,101,140},{156,84,119},{130,67,98},{103,49,75},{72,23,48},{35,0,1},{243,134,172},{212,116,151},{184,101,133},{156,84,113},{130,67,92},{103,49,71},{72,24,44},{34,0,1},{243,134,162},{212,116,142},{184,101,125},{156,84,106},{130,67,86},{103,49,66},{72,24,40},{33,0,0},{244,134,154},{213,116,135},{184,101,119},{156,84,100},{130,67,81},{103,49,62},{72,24,36},{32,0,0}, +{244,134,146},{213,116,128},{184,101,112},{156,84,94},{130,67,76},{103,49,57},{72,24,32},{32,0,0},{243,133,137},{213,116,120},{183,100,105},{155,83,88},{129,67,70},{102,49,52},{71,24,28},{31,0,0},{243,132,128},{213,116,112},{183,100,97},{155,83,81},{129,67,65},{102,49,47},{71,24,23},{30,0,0},{244,132,119},{214,115,105},{184,99,90},{156,83,74},{129,66,59},{103,48,42},{72,24,19},{30,0,0}, +{245,132,110},{214,115,96},{184,99,83},{156,83,68},{129,66,53},{103,48,37},{72,24,14},{30,0,0},{245,132,101},{213,114,89},{184,99,76},{156,83,62},{130,66,48},{102,48,32},{71,25,7},{29,0,0},{245,132,91},{213,114,80},{184,99,68},{156,83,55},{130,66,41},{102,48,25},{71,25,4},{29,0,0},{245,131,81},{213,115,70},{184,99,59},{156,82,47},{129,66,34},{102,48,18},{71,25,1},{28,0,0}, +{245,131,69},{213,115,60},{184,99,49},{156,82,38},{129,66,24},{102,48,10},{71,25,1},{28,0,0},{245,130,56},{214,114,48},{184,98,39},{156,82,27},{129,66,13},{102,48,3},{71,25,0},{28,0,0},{245,130,45},{214,114,37},{184,98,29},{156,82,17},{129,66,6},{102,48,1},{71,25,0},{28,0,0},{245,130,32},{214,114,25},{184,98,19},{156,81,6},{129,65,0},{102,48,0},{70,25,0},{27,0,0}, +{242,121,175},{211,104,154},{183,90,135},{156,74,114},{129,58,93},{103,41,72},{72,14,45},{33,0,0},{242,120,165},{211,104,145},{183,90,128},{156,74,108},{130,58,88},{103,41,68},{72,15,41},{32,0,0},{242,120,156},{211,104,137},{183,90,120},{156,74,102},{130,58,82},{103,41,63},{72,15,37},{31,0,0},{242,120,148},{212,104,130},{184,90,114},{156,74,96},{129,58,78},{103,42,59},{72,15,33},{31,0,0}, +{242,120,140},{212,104,123},{184,90,107},{156,74,90},{129,58,73},{103,42,54},{72,15,29},{31,0,0},{242,119,132},{212,104,115},{183,90,101},{155,74,85},{129,58,67},{102,42,49},{71,16,25},{30,0,0},{242,119,123},{212,104,107},{183,90,93},{155,74,78},{129,58,62},{102,42,44},{71,16,20},{29,0,0},{243,119,115},{213,103,100},{183,89,86},{155,74,71},{129,58,56},{102,41,39},{71,16,16},{29,0,0}, +{243,119,106},{213,103,93},{183,88,80},{156,74,65},{129,58,50},{102,41,34},{71,16,11},{29,0,0},{243,118,97},{212,103,86},{184,89,73},{156,74,59},{129,58,45},{102,41,29},{71,17,5},{28,0,0},{243,118,88},{212,103,77},{184,89,65},{156,74,52},{129,58,39},{102,41,23},{71,17,3},{28,0,0},{244,118,78},{212,103,67},{184,89,57},{155,73,45},{129,58,32},{102,41,16},{71,17,1},{27,0,0}, +{244,118,67},{212,103,58},{184,89,47},{155,73,36},{129,58,22},{102,41,9},{71,17,1},{27,0,0},{243,117,55},{212,103,47},{183,88,38},{155,73,27},{129,58,12},{102,41,3},{71,18,0},{27,0,0},{243,117,44},{212,103,37},{183,88,29},{155,73,17},{129,58,6},{102,41,1},{71,18,0},{27,0,0},{244,117,33},{213,103,25},{184,88,19},{156,73,7},{129,57,0},{102,42,0},{70,18,0},{27,0,0}, +{241,106,169},{210,92,148},{182,78,129},{155,64,109},{128,48,89},{103,32,69},{72,5,42},{31,0,0},{241,106,159},{210,92,139},{182,78,122},{155,64,103},{129,49,84},{103,32,64},{72,5,38},{30,0,0},{241,106,150},{210,92,131},{182,78,114},{155,64,97},{129,49,78},{103,32,59},{72,5,35},{29,0,0},{241,106,142},{211,92,125},{183,78,108},{155,64,91},{128,49,74},{103,33,55},{72,5,31},{29,0,0}, +{241,106,134},{211,92,118},{183,78,103},{155,64,86},{128,49,69},{103,33,51},{72,5,27},{29,0,0},{241,105,126},{211,92,111},{182,79,97},{155,64,81},{128,48,64},{102,33,47},{71,6,23},{28,0,0},{241,105,118},{211,92,103},{182,79,90},{155,64,76},{128,48,59},{102,33,42},{71,6,18},{27,0,0},{241,105,111},{211,91,96},{182,78,83},{154,64,69},{128,49,54},{101,33,37},{70,6,13},{27,0,0}, +{241,105,103},{211,91,89},{182,78,77},{155,64,63},{128,49,48},{101,33,32},{70,7,8},{27,0,0},{242,104,94},{211,91,82},{183,79,70},{156,64,57},{128,49,43},{102,33,27},{71,8,3},{26,0,0},{242,104,85},{211,91,74},{183,79,63},{155,64,50},{128,49,37},{102,33,21},{71,8,2},{26,0,0},{242,105,75},{210,91,65},{183,79,55},{154,64,43},{128,49,30},{101,34,14},{70,8,1},{26,0,0}, +{242,104,65},{210,91,56},{183,79,46},{154,64,34},{128,49,20},{101,34,7},{70,8,1},{26,0,0},{242,103,53},{211,91,45},{182,78,37},{154,64,26},{128,49,10},{102,34,2},{70,9,0},{26,0,0},{242,103,43},{211,91,36},{182,78,28},{154,64,17},{128,49,5},{102,34,1},{70,9,0},{26,0,0},{243,103,33},{211,91,26},{183,78,19},{155,64,8},{128,50,0},{101,35,0},{70,10,0},{26,0,0}, +{239,89,161},{209,76,141},{181,64,123},{155,51,104},{128,36,85},{103,20,65},{72,2,39},{28,0,0},{240,88,152},{210,77,134},{182,64,117},{155,51,98},{129,37,80},{103,20,61},{72,2,35},{27,0,0},{240,88,143},{210,77,126},{182,64,109},{155,51,92},{129,37,74},{103,20,56},{72,2,32},{27,0,0},{241,88,136},{210,77,120},{182,64,103},{155,51,87},{128,37,70},{102,21,52},{72,2,28},{27,0,0}, +{241,89,129},{210,77,113},{182,64,98},{155,51,83},{128,37,66},{102,21,48},{72,2,24},{27,0,0},{241,89,121},{210,77,106},{182,65,92},{154,52,77},{128,37,61},{102,21,44},{71,2,20},{26,0,0},{241,89,114},{210,77,99},{182,65,86},{154,52,72},{128,38,56},{102,21,39},{71,2,15},{26,0,0},{240,89,107},{210,77,92},{182,65,80},{154,52,66},{128,38,51},{101,22,34},{70,2,10},{25,0,0}, +{240,89,99},{210,77,86},{182,65,74},{155,53,60},{128,39,45},{101,22,29},{70,3,6},{25,0,0},{241,89,91},{210,77,79},{182,66,67},{155,53,54},{128,39,40},{102,22,24},{71,4,3},{25,0,0},{241,89,82},{210,77,71},{182,66,60},{154,53,47},{128,39,34},{102,22,18},{71,4,2},{25,0,0},{241,89,72},{210,77,62},{182,66,53},{154,53,41},{128,39,27},{101,23,11},{70,4,1},{25,0,0}, +{241,89,62},{210,77,54},{182,66,44},{154,53,33},{128,39,19},{101,23,6},{70,4,1},{25,0,0},{241,88,52},{211,77,44},{182,65,36},{154,53,25},{127,39,10},{102,24,2},{70,5,0},{25,0,0},{241,88,43},{211,77,36},{182,65,28},{154,54,17},{127,39,5},{102,24,1},{70,5,0},{25,0,0},{242,88,33},{210,78,27},{182,66,20},{154,54,9},{127,41,0},{101,25,0},{70,5,0},{25,0,0}, +{237,71,154},{208,59,134},{180,50,117},{154,38,100},{128,22,81},{102,6,61},{72,0,36},{25,0,0},{238,70,145},{209,60,128},{181,49,111},{154,38,94},{128,23,76},{102,7,57},{72,0,32},{25,0,0},{239,69,137},{209,61,121},{181,49,105},{154,38,88},{128,24,70},{102,7,53},{72,0,29},{25,0,0},{240,70,130},{208,61,115},{181,50,99},{154,39,83},{128,25,66},{101,7,49},{71,0,25},{25,0,0}, +{240,71,123},{208,61,108},{181,50,94},{154,39,79},{128,25,62},{101,7,45},{71,0,21},{25,0,0},{240,72,117},{209,62,102},{181,51,88},{153,39,73},{127,25,57},{101,8,40},{71,0,17},{24,0,0},{240,72,110},{209,62,95},{181,51,82},{153,39,68},{127,26,52},{101,9,35},{71,0,12},{24,0,0},{239,72,103},{209,63,88},{181,52,76},{154,40,62},{127,26,47},{101,10,31},{70,0,8},{23,0,0}, +{239,72,95},{209,63,82},{181,52,70},{154,41,56},{127,27,42},{101,10,26},{70,0,5},{23,0,0},{239,73,88},{209,62,75},{180,52,64},{153,41,51},{127,28,37},{102,10,21},{71,0,3},{23,0,0},{239,73,79},{209,62,68},{180,52,57},{153,41,45},{127,28,31},{102,10,15},{71,0,1},{23,0,0},{239,72,69},{209,63,60},{181,53,50},{154,41,39},{127,28,25},{101,11,8},{70,1,0},{23,0,0}, +{239,72,60},{209,63,52},{181,53,42},{154,41,31},{127,28,17},{101,11,4},{70,1,0},{23,0,0},{239,73,51},{210,63,43},{181,53,35},{154,41,24},{126,28,9},{101,12,1},{69,1,0},{23,0,0},{239,73,43},{210,63,35},{181,53,28},{154,42,17},{126,29,5},{101,13,1},{69,1,0},{23,0,0},{240,73,34},{209,64,28},{181,54,21},{153,43,10},{126,31,1},{101,14,0},{70,1,0},{23,0,0}, +{237,37,147},{207,30,128},{180,26,112},{154,19,95},{128,11,77},{102,2,58},{72,0,33},{23,0,0},{238,36,139},{208,31,122},{181,25,106},{154,19,89},{128,11,72},{102,3,54},{72,0,29},{23,0,0},{238,36,131},{208,31,115},{181,25,99},{154,19,83},{128,12,67},{102,3,50},{72,0,26},{23,0,0},{239,37,124},{207,32,109},{181,26,94},{154,20,79},{128,12,63},{101,3,46},{71,0,22},{23,0,0}, +{239,38,117},{207,32,103},{181,26,90},{154,20,75},{128,12,59},{101,3,42},{71,0,18},{23,0,0},{238,42,111},{208,34,97},{180,26,84},{153,20,70},{127,13,54},{101,3,37},{71,0,14},{22,0,0},{238,45,104},{208,35,92},{180,27,78},{153,20,64},{127,13,49},{101,4,33},{71,0,10},{22,0,0},{238,44,97},{208,37,85},{180,28,73},{153,20,59},{127,13,44},{101,4,29},{70,0,7},{22,0,0}, +{239,45,91},{208,38,79},{180,29,67},{153,21,54},{127,14,40},{101,4,24},{70,0,4},{22,0,0},{238,47,84},{208,37,72},{180,28,61},{153,21,49},{127,14,35},{101,5,19},{71,0,3},{22,0,0},{238,48,76},{208,38,66},{180,29,55},{153,22,43},{127,14,29},{101,5,13},{71,0,1},{22,0,0},{238,49,68},{208,40,59},{180,31,48},{153,22,37},{127,14,23},{101,5,7},{70,1,0},{22,0,0}, +{238,49,59},{208,41,51},{180,32,41},{153,23,30},{127,14,16},{101,5,3},{70,1,0},{22,0,0},{239,50,50},{209,42,43},{180,33,34},{154,24,23},{126,14,8},{101,6,1},{69,1,0},{22,0,0},{239,50,43},{209,42,35},{180,33,28},{154,24,17},{126,15,5},{101,6,1},{69,1,0},{22,0,0},{239,51,34},{208,42,28},{181,34,21},{153,25,10},{126,16,1},{101,7,0},{70,1,0},{23,0,0}, +{237,0,140},{206,0,122},{179,0,108},{153,0,91},{128,0,73},{102,0,54},{71,0,30},{20,0,0},{237,0,133},{207,0,116},{180,0,101},{153,0,85},{127,0,68},{102,0,50},{71,0,26},{20,0,0},{237,0,125},{207,0,110},{180,0,94},{153,0,79},{127,0,63},{102,0,46},{71,0,23},{20,0,0},{237,1,119},{206,1,104},{180,0,90},{153,0,75},{127,0,59},{102,0,42},{71,0,19},{20,0,0}, +{237,3,112},{206,2,99},{180,0,86},{153,0,71},{127,0,55},{102,0,38},{71,0,15},{20,0,0},{236,11,106},{206,4,93},{179,0,80},{152,0,66},{126,0,51},{101,0,34},{70,0,11},{20,0,0},{236,16,99},{206,7,88},{179,1,75},{152,0,61},{126,0,46},{101,0,30},{70,0,8},{20,0,0},{237,15,92},{206,10,81},{179,3,69},{152,0,56},{126,0,41},{100,0,26},{69,0,5},{20,0,0}, +{238,16,86},{206,12,75},{179,4,63},{152,0,51},{126,0,37},{100,0,22},{69,0,3},{20,0,0},{237,19,80},{207,11,69},{180,3,58},{153,0,46},{126,0,33},{100,0,17},{70,0,2},{20,0,0},{237,22,73},{207,13,63},{180,5,52},{153,1,41},{126,0,27},{100,0,11},{70,0,1},{20,0,0},{237,24,66},{207,16,57},{179,8,46},{152,2,35},{126,0,21},{100,0,5},{69,0,0},{20,0,0}, +{237,25,58},{207,19,50},{179,11,40},{152,3,29},{126,0,14},{100,0,2},{69,0,0},{20,0,0},{238,25,49},{207,21,43},{179,13,33},{153,5,22},{127,0,7},{100,0,0},{69,0,0},{20,0,0},{238,26,42},{207,21,36},{179,13,27},{153,5,16},{127,0,4},{100,0,0},{69,0,0},{21,0,0},{238,28,35},{207,20,29},{180,13,22},{152,5,10},{126,0,1},{100,0,0},{69,0,0},{22,0,0}, +{215,240,252},{188,210,222},{162,182,193},{136,154,165},{113,128,136},{88,101,108},{59,69,76},{22,27,32},{217,238,238},{189,209,210},{163,181,183},{137,154,156},{114,127,129},{89,100,102},{59,69,71},{20,26,28},{218,237,224},{189,209,198},{163,181,173},{138,154,147},{114,127,121},{89,100,96},{59,69,65},{19,26,24},{219,236,212},{191,208,188},{164,180,164},{139,153,139},{114,126,114},{89,99,90},{59,68,61},{19,26,20}, +{219,236,200},{192,207,177},{165,180,154},{139,153,131},{114,126,107},{89,99,85},{59,68,56},{19,26,17},{221,235,187},{193,206,165},{166,179,144},{140,152,122},{115,125,100},{90,98,79},{59,67,51},{18,25,11},{222,234,174},{194,206,154},{167,179,134},{141,151,114},{115,125,93},{90,98,73},{59,67,46},{17,25,6},{223,233,160},{195,205,143},{168,178,124},{141,150,105},{116,124,86},{90,97,66},{60,66,41},{16,25,2}, +{224,232,147},{195,204,131},{168,177,114},{141,150,96},{116,124,78},{90,97,60},{60,66,35},{15,25,0},{225,231,135},{196,203,119},{168,176,104},{142,149,87},{116,123,71},{90,96,53},{59,66,30},{14,24,0},{225,231,120},{196,202,106},{168,176,92},{142,149,77},{116,123,62},{90,96,46},{59,66,23},{13,24,0},{226,230,105},{196,201,93},{169,175,81},{142,148,67},{116,122,53},{91,96,38},{60,65,15},{12,24,0}, +{226,230,87},{197,201,77},{169,175,67},{142,148,55},{116,122,42},{91,96,27},{60,65,8},{11,24,0},{226,229,68},{198,200,60},{170,174,53},{143,147,43},{117,121,31},{91,95,16},{60,65,2},{10,24,0},{227,229,46},{198,200,41},{170,174,35},{143,147,26},{117,121,17},{91,95,8},{60,65,1},{10,24,0},{228,229,22},{198,200,21},{170,173,17},{143,146,9},{116,120,2},{90,95,0},{59,64,0},{9,23,0}, +{214,226,243},{187,198,215},{162,172,187},{137,146,159},{113,121,132},{88,95,104},{60,64,73},{23,22,29},{216,225,230},{189,197,203},{163,171,177},{138,145,151},{114,120,125},{89,94,98},{60,64,68},{21,21,25},{217,225,217},{190,197,192},{164,171,168},{139,145,142},{114,120,117},{89,94,92},{60,64,62},{20,21,21},{218,224,205},{191,196,182},{165,170,159},{140,144,135},{115,119,110},{90,93,87},{60,63,58},{20,21,17}, +{218,223,193},{191,195,171},{165,170,149},{140,144,127},{115,119,103},{90,93,82},{60,63,53},{20,21,13},{220,222,181},{193,194,160},{165,169,140},{140,143,118},{114,118,96},{89,92,76},{60,63,49},{19,21,7},{221,222,168},{194,194,149},{166,169,130},{140,143,110},{114,118,90},{89,92,70},{60,63,44},{18,21,3},{221,221,155},{194,193,138},{167,168,120},{141,142,102},{115,117,83},{89,91,63},{60,62,39},{17,21,1}, +{222,220,143},{194,193,127},{167,167,110},{141,141,93},{115,117,75},{89,91,57},{60,62,33},{16,21,0},{223,219,131},{195,192,115},{167,166,101},{141,140,84},{115,116,68},{90,91,50},{60,61,27},{15,20,0},{224,218,117},{196,191,103},{167,166,89},{141,140,74},{115,116,59},{90,91,43},{60,61,21},{14,20,0},{224,218,103},{196,190,90},{168,165,78},{141,140,64},{115,115,51},{90,90,35},{60,61,13},{13,20,0}, +{224,217,86},{196,190,76},{168,165,65},{141,140,53},{115,115,40},{90,90,25},{60,61,7},{12,20,0},{225,216,68},{197,189,60},{169,164,52},{142,139,41},{116,114,29},{91,90,14},{60,61,2},{10,20,0},{225,216,48},{197,189,42},{169,164,35},{142,139,26},{116,114,16},{91,90,6},{60,61,1},{10,20,0},{226,216,27},{197,189,24},{169,164,19},{142,139,11},{116,114,3},{90,89,0},{59,60,0},{10,19,0}, +{214,213,235},{187,187,207},{162,163,180},{137,138,153},{113,113,127},{88,88,101},{61,59,70},{23,17,26},{216,212,222},{189,186,196},{163,162,171},{139,137,145},{114,112,121},{89,87,95},{61,58,65},{22,16,22},{217,211,209},{190,186,185},{164,162,162},{139,137,137},{114,112,114},{89,87,89},{61,58,60},{21,16,18},{218,211,197},{191,185,175},{165,161,153},{140,136,130},{115,112,107},{90,87,84},{61,58,56},{20,16,14}, +{218,211,186},{191,184,164},{165,161,144},{140,136,122},{115,112,100},{90,87,79},{61,58,51},{20,16,10},{219,210,174},{192,183,154},{165,160,135},{140,135,114},{114,111,93},{89,86,73},{61,57,47},{19,16,4},{220,209,162},{193,183,144},{165,160,126},{140,135,106},{114,110,87},{89,86,67},{61,57,42},{19,16,1},{220,208,151},{193,182,133},{166,159,117},{140,134,99},{114,109,80},{89,85,61},{60,57,37},{18,16,0}, +{221,207,139},{193,182,123},{166,158,107},{140,133,90},{114,109,73},{89,85,55},{60,57,31},{17,16,0},{222,206,127},{194,181,112},{167,157,98},{141,132,81},{115,108,65},{90,85,48},{60,57,25},{16,15,0},{223,206,114},{195,181,100},{167,157,87},{141,132,72},{115,108,57},{90,85,41},{60,57,19},{15,15,0},{223,206,101},{196,180,88},{167,156,77},{141,132,62},{115,108,49},{90,84,33},{60,56,12},{14,15,0}, +{223,205,85},{196,180,75},{167,156,64},{141,132,52},{115,108,39},{90,84,23},{60,56,6},{13,15,0},{224,204,68},{196,179,60},{168,155,51},{142,131,40},{116,107,28},{91,84,12},{60,56,2},{11,15,0},{224,204,49},{196,179,43},{168,155,35},{142,131,26},{116,107,16},{91,84,5},{60,56,1},{11,15,0},{225,204,31},{196,178,26},{168,155,20},{142,131,12},{116,107,3},{90,83,0},{59,56,0},{11,15,0}, +{213,201,227},{187,177,200},{162,153,175},{138,130,149},{114,106,123},{89,83,97},{61,55,67},{24,11,24},{215,200,215},{188,176,190},{163,153,165},{138,129,141},{114,106,117},{89,83,92},{61,54,62},{23,11,20},{216,199,202},{189,176,179},{163,153,156},{138,129,133},{114,106,110},{89,83,86},{61,54,57},{23,11,15},{217,199,191},{190,175,169},{164,152,148},{139,129,126},{114,105,103},{89,83,81},{61,54,53},{22,11,10}, +{217,199,181},{190,174,160},{164,152,140},{139,129,118},{114,105,97},{89,83,76},{61,54,49},{22,11,6},{218,198,170},{191,173,150},{164,151,131},{140,128,110},{115,105,91},{90,82,70},{60,53,45},{21,11,2},{219,197,158},{192,173,140},{164,151,122},{140,128,102},{115,104,84},{90,82,65},{60,53,40},{20,11,0},{219,196,147},{192,172,129},{165,150,113},{140,127,95},{115,103,77},{90,81,59},{61,53,35},{19,11,0}, +{220,195,135},{192,172,119},{165,149,103},{140,126,87},{115,103,71},{90,81,53},{61,53,29},{18,11,0},{221,194,124},{193,171,109},{166,148,94},{141,125,79},{115,102,63},{90,81,46},{61,53,23},{17,11,0},{221,194,112},{193,171,98},{166,148,85},{141,125,70},{115,102,56},{90,81,39},{61,53,17},{15,11,0},{222,194,98},{194,170,86},{166,147,75},{140,125,60},{115,102,47},{90,80,32},{60,52,10},{14,11,0}, +{222,194,83},{194,170,73},{166,147,62},{140,125,50},{115,102,37},{90,80,21},{60,52,5},{14,11,0},{223,193,67},{195,169,59},{167,146,50},{141,124,39},{115,101,26},{90,80,10},{60,52,1},{13,11,0},{223,193,50},{195,169,44},{167,146,36},{141,124,26},{115,101,15},{90,80,4},{60,52,0},{12,11,0},{224,192,35},{195,169,28},{167,146,22},{141,124,13},{115,101,4},{90,79,0},{60,52,0},{12,11,0}, +{213,189,219},{187,166,193},{162,144,169},{138,122,144},{114,99,119},{89,78,94},{61,51,64},{24,6,21},{214,188,207},{188,165,183},{163,144,160},{138,121,137},{114,99,113},{89,78,89},{61,50,59},{24,6,17},{215,187,195},{189,165,173},{163,144,151},{138,121,129},{114,99,106},{89,78,83},{61,50,54},{24,6,12},{216,187,185},{190,164,164},{164,143,143},{139,121,122},{114,98,100},{89,77,78},{61,50,50},{23,6,7}, +{217,187,175},{190,164,155},{164,143,135},{139,121,114},{114,98,94},{89,77,73},{61,50,46},{22,6,3},{218,186,165},{191,163,145},{164,142,126},{140,120,107},{115,98,88},{90,77,67},{60,49,42},{21,6,1},{219,185,154},{191,163,135},{164,142,118},{140,120,99},{115,98,81},{90,77,62},{60,49,37},{21,6,0},{219,184,143},{191,162,125},{165,141,109},{140,119,92},{115,97,74},{90,76,56},{61,49,32},{20,6,0}, +{219,184,132},{191,162,115},{165,141,100},{140,119,84},{115,97,68},{90,76,50},{61,49,26},{18,6,0},{220,183,121},{192,161,106},{166,140,91},{141,118,76},{115,96,61},{90,76,44},{61,49,21},{17,6,0},{220,183,109},{192,161,95},{166,140,82},{141,118,68},{115,96,54},{90,76,37},{61,49,14},{15,6,0},{221,183,95},{193,160,84},{166,139,72},{140,117,59},{115,96,45},{90,75,30},{60,48,8},{14,7,0}, +{222,183,82},{193,160,71},{166,139,61},{140,117,49},{115,96,35},{90,75,20},{60,48,4},{14,7,0},{223,182,67},{194,159,59},{167,138,49},{141,116,38},{115,95,25},{90,75,9},{60,48,0},{14,7,0},{223,182,51},{194,159,44},{167,138,37},{141,116,26},{115,95,15},{90,75,4},{60,48,0},{13,7,0},{223,181,36},{194,159,30},{167,137,24},{141,116,14},{115,95,4},{90,75,0},{60,48,0},{12,6,0}, +{212,176,210},{186,154,186},{162,134,162},{138,113,139},{114,92,115},{90,72,90},{62,45,60},{25,3,17},{213,175,200},{187,154,176},{163,134,154},{139,113,132},{114,92,109},{89,72,85},{61,45,56},{24,2,13},{214,175,189},{188,154,166},{163,134,145},{139,113,124},{114,92,102},{89,72,79},{61,45,51},{24,2,8},{215,175,179},{189,153,158},{163,133,138},{139,112,117},{114,91,96},{90,71,75},{61,44,47},{23,2,4}, +{216,175,169},{189,153,149},{164,133,131},{139,112,110},{114,91,90},{90,71,70},{61,44,43},{23,2,1},{217,174,159},{190,153,140},{164,133,122},{139,112,103},{114,91,84},{89,71,64},{61,44,39},{22,2,0},{217,173,148},{190,153,131},{164,133,114},{139,112,96},{114,91,78},{89,71,59},{61,44,35},{21,2,0},{218,172,137},{190,152,121},{164,132,105},{140,111,89},{114,90,71},{90,70,54},{61,44,30},{20,2,0}, +{219,172,127},{190,152,111},{165,132,97},{140,111,82},{114,90,65},{90,70,48},{61,44,24},{18,2,0},{220,171,117},{191,151,102},{166,131,89},{140,110,74},{114,90,59},{90,70,42},{60,44,19},{17,2,0},{220,171,105},{191,151,93},{166,131,80},{140,110,66},{114,90,52},{90,70,35},{60,44,12},{16,2,0},{220,171,93},{192,150,82},{165,130,70},{140,109,57},{114,89,43},{89,69,28},{60,44,6},{15,3,0}, +{220,171,80},{192,150,69},{165,130,59},{140,109,47},{114,89,34},{89,69,18},{60,44,3},{15,3,0},{221,170,66},{193,149,57},{166,129,47},{140,109,36},{114,89,24},{89,69,8},{60,44,0},{15,3,0},{221,170,51},{193,149,44},{166,129,36},{140,109,26},{114,89,14},{89,69,3},{60,44,0},{14,3,0},{221,169,37},{193,149,31},{166,128,24},{140,108,14},{114,89,4},{89,69,0},{59,43,0},{13,2,0}, +{212,164,202},{186,143,179},{162,124,156},{138,105,134},{114,86,110},{90,66,86},{62,40,57},{25,0,14},{213,163,192},{187,143,169},{163,124,148},{139,105,127},{114,85,104},{90,66,81},{61,40,53},{24,0,9},{214,163,182},{187,143,160},{163,124,140},{139,105,119},{114,85,98},{90,66,76},{61,40,48},{24,0,5},{215,162,173},{188,142,152},{163,124,133},{139,104,112},{114,85,92},{90,65,72},{61,39,44},{23,0,2}, +{216,162,163},{188,142,144},{164,124,126},{139,104,106},{114,85,87},{90,65,67},{61,39,40},{23,0,0},{216,162,153},{189,142,135},{164,123,117},{139,104,100},{114,84,81},{89,65,61},{61,39,36},{22,0,0},{216,161,142},{189,142,126},{164,123,109},{139,104,93},{114,84,75},{89,65,56},{61,39,32},{21,0,0},{217,161,132},{190,141,117},{164,122,102},{140,103,86},{114,84,68},{90,64,51},{61,39,27},{20,0,0}, +{218,160,122},{190,141,108},{165,122,94},{140,103,79},{114,84,62},{90,64,45},{61,39,21},{18,0,0},{219,159,113},{191,140,99},{166,122,86},{140,102,72},{114,83,56},{90,64,39},{60,39,16},{17,0,0},{219,159,102},{191,140,90},{166,122,77},{140,102,64},{114,83,49},{90,64,32},{60,39,10},{17,0,0},{219,159,91},{191,139,80},{165,121,67},{140,101,55},{114,83,41},{89,63,25},{60,39,5},{16,0,0}, +{219,159,78},{191,139,67},{165,121,57},{140,101,45},{114,83,32},{89,63,16},{60,39,2},{16,0,0},{220,159,66},{192,138,56},{166,120,46},{140,101,35},{114,83,23},{89,63,7},{60,39,0},{15,0,0},{220,159,51},{192,138,44},{166,120,36},{140,101,26},{114,83,14},{89,63,3},{60,39,0},{14,0,0},{220,158,37},{192,138,32},{165,120,24},{140,100,14},{114,83,4},{89,63,0},{59,38,0},{13,0,0}, +{212,152,195},{185,132,173},{161,115,150},{137,98,128},{113,79,106},{90,59,83},{62,34,54},{23,0,10},{213,151,185},{186,132,163},{162,115,143},{138,97,122},{114,78,100},{90,59,78},{62,34,50},{23,0,6},{214,151,175},{186,132,154},{162,115,135},{138,97,114},{114,78,94},{90,59,73},{62,34,46},{23,0,2},{214,150,166},{187,131,147},{163,115,128},{138,97,108},{114,78,89},{90,59,69},{61,34,42},{22,0,1}, +{215,150,158},{187,131,139},{163,115,121},{138,97,102},{114,78,84},{90,59,64},{61,34,38},{21,0,0},{215,150,148},{188,131,130},{163,114,113},{138,96,96},{114,77,78},{90,59,58},{61,34,34},{20,0,0},{215,150,138},{188,131,122},{163,114,105},{138,96,89},{114,77,72},{90,59,53},{61,34,29},{20,0,0},{216,149,128},{189,130,113},{164,113,98},{139,96,82},{114,77,65},{90,58,48},{61,34,24},{19,0,0}, +{217,149,118},{189,130,104},{164,113,90},{139,96,76},{114,77,59},{90,58,42},{61,34,19},{18,0,0},{218,148,109},{190,130,96},{165,113,83},{139,95,69},{113,76,53},{90,58,37},{61,34,13},{17,0,0},{218,148,99},{190,130,87},{165,113,74},{139,95,61},{113,76,47},{90,58,31},{61,34,8},{17,0,0},{218,148,88},{190,129,77},{164,112,65},{139,94,53},{113,76,40},{89,58,24},{60,34,4},{16,0,0}, +{218,148,76},{190,129,66},{164,112,55},{139,94,44},{113,76,31},{89,58,15},{60,34,1},{15,0,0},{219,147,64},{191,128,55},{165,111,45},{139,94,34},{114,76,22},{90,58,6},{60,34,0},{14,0,0},{219,147,52},{191,128,44},{165,111,35},{139,94,25},{114,76,13},{90,58,2},{60,34,0},{14,0,0},{219,147,38},{191,128,33},{165,111,25},{139,93,13},{113,76,3},{89,58,0},{59,34,0},{14,0,0}, +{212,140,189},{185,122,167},{161,106,144},{137,90,123},{113,72,102},{90,53,79},{62,27,52},{22,0,6},{213,139,179},{186,122,157},{162,105,137},{138,89,117},{114,71,96},{90,53,74},{62,28,48},{22,0,3},{214,139,169},{186,122,148},{162,105,130},{138,89,110},{114,71,90},{90,53,69},{62,28,44},{22,0,0},{214,138,160},{187,121,141},{163,105,123},{138,89,104},{114,71,85},{90,53,65},{61,28,40},{21,0,0}, +{214,138,152},{187,121,133},{163,105,116},{138,89,98},{114,71,80},{90,53,61},{61,28,36},{20,0,0},{215,138,143},{187,121,126},{163,105,109},{138,88,92},{114,71,74},{90,53,56},{61,29,32},{19,0,0},{215,138,134},{187,121,118},{163,105,101},{138,88,85},{114,71,68},{90,53,51},{61,29,27},{19,0,0},{215,137,124},{188,120,109},{163,104,94},{138,88,79},{114,71,63},{90,52,46},{61,28,22},{18,0,0}, +{215,137,114},{188,120,100},{163,104,87},{138,88,73},{114,71,57},{90,52,40},{61,28,17},{17,0,0},{216,136,105},{189,120,93},{163,104,80},{138,87,66},{113,70,51},{90,52,35},{61,28,11},{16,0,0},{216,136,96},{189,120,84},{163,104,72},{138,87,58},{113,70,45},{90,52,29},{61,28,6},{16,0,0},{217,136,86},{188,119,75},{164,103,63},{138,87,51},{113,70,38},{89,52,22},{60,28,3},{15,0,0}, +{217,136,74},{188,119,64},{164,103,53},{138,87,42},{113,70,29},{89,52,13},{60,28,1},{14,0,0},{217,135,62},{189,118,53},{164,103,43},{139,87,32},{114,70,20},{90,52,5},{60,28,0},{13,0,0},{217,135,52},{189,118,44},{164,103,35},{139,87,24},{114,70,11},{90,52,2},{60,28,0},{13,0,0},{218,135,40},{189,118,34},{164,103,25},{139,86,14},{113,70,3},{89,52,0},{59,29,0},{13,0,0}, +{211,127,182},{185,111,160},{161,97,139},{136,81,118},{113,64,98},{90,46,76},{61,20,49},{21,0,3},{212,127,172},{186,111,151},{162,96,132},{137,81,112},{113,64,92},{90,46,71},{62,21,45},{20,0,2},{213,127,162},{186,111,143},{162,96,125},{137,81,106},{113,64,86},{90,46,66},{62,21,41},{19,0,0},{214,126,153},{186,111,136},{162,96,119},{138,81,100},{113,64,81},{90,46,62},{61,21,37},{18,0,0}, +{214,126,145},{186,111,128},{162,96,112},{138,81,94},{113,64,76},{90,46,58},{61,21,33},{18,0,0},{214,126,138},{186,111,121},{163,96,105},{138,81,88},{113,64,70},{90,46,53},{61,22,29},{17,0,0},{214,126,130},{186,111,113},{163,96,98},{138,81,82},{113,64,65},{90,46,48},{61,22,25},{16,0,0},{214,125,120},{187,110,105},{163,95,91},{138,80,76},{113,64,60},{89,46,43},{61,22,20},{16,0,0}, +{214,125,111},{187,110,97},{163,95,85},{138,80,70},{113,64,54},{89,46,37},{61,22,15},{15,0,0},{215,125,102},{188,110,90},{162,95,78},{137,80,63},{113,63,48},{89,46,32},{61,23,9},{14,0,0},{215,125,93},{188,110,81},{162,95,70},{137,80,56},{113,63,42},{89,46,26},{61,23,5},{13,0,0},{216,125,83},{187,109,72},{163,94,61},{138,80,49},{113,63,36},{89,46,20},{60,22,3},{12,0,0}, +{216,125,73},{187,109,63},{163,94,52},{138,80,41},{113,63,27},{89,46,12},{60,22,1},{12,0,0},{216,124,61},{188,109,52},{163,95,42},{138,79,31},{113,63,19},{89,46,4},{59,23,0},{12,0,0},{216,124,51},{188,109,43},{163,95,34},{138,79,23},{113,63,10},{89,46,2},{59,23,0},{12,0,0},{217,124,41},{188,109,33},{163,94,25},{138,79,15},{113,63,3},{89,45,0},{59,23,0},{12,0,0}, +{211,114,174},{184,100,153},{161,87,134},{136,72,113},{113,55,93},{90,39,73},{61,13,46},{19,0,1},{212,114,165},{185,100,145},{162,87,127},{137,72,107},{113,56,88},{90,39,68},{62,13,42},{17,0,1},{212,114,156},{186,100,137},{162,87,120},{137,72,101},{113,56,83},{90,39,63},{62,13,38},{16,0,0},{213,114,148},{186,100,131},{162,87,114},{138,72,96},{113,56,78},{90,39,59},{61,14,34},{15,0,0}, +{213,114,140},{186,100,123},{162,87,107},{138,72,91},{113,56,73},{90,39,55},{61,14,30},{15,0,0},{213,114,133},{186,100,116},{163,86,101},{138,72,85},{113,56,67},{90,39,50},{61,14,26},{14,0,0},{213,114,125},{186,100,108},{163,86,95},{138,72,79},{113,56,62},{90,39,45},{61,14,22},{14,0,0},{214,114,116},{186,100,101},{163,86,88},{138,71,73},{113,56,57},{89,39,40},{61,14,17},{13,0,0}, +{214,114,107},{186,100,94},{163,86,82},{138,71,67},{113,56,51},{89,39,35},{61,14,12},{12,0,0},{214,114,99},{187,100,87},{162,86,75},{137,71,60},{113,56,46},{89,39,30},{61,15,7},{12,0,0},{214,114,90},{187,100,79},{162,86,67},{137,71,54},{113,56,40},{89,39,24},{61,16,4},{11,0,0},{215,114,80},{187,99,70},{163,85,59},{138,71,47},{113,56,34},{89,39,18},{60,15,2},{10,0,0}, +{215,114,71},{187,99,61},{163,85,50},{138,71,39},{113,56,25},{89,39,10},{60,15,1},{10,0,0},{215,113,60},{188,99,51},{163,86,41},{137,71,30},{113,55,17},{89,40,4},{59,16,0},{10,0,0},{215,113,51},{188,99,43},{163,86,33},{137,71,22},{113,55,9},{89,40,2},{59,16,0},{10,0,0},{215,113,41},{188,99,33},{163,85,25},{138,71,15},{113,55,3},{89,39,0},{59,16,0},{10,0,0}, +{210,102,167},{183,89,147},{161,76,128},{136,62,109},{112,46,89},{90,30,69},{62,5,43},{15,0,0},{211,101,158},{184,89,139},{162,76,121},{137,62,103},{113,47,84},{90,30,65},{62,5,39},{14,0,0},{211,101,150},{185,89,131},{162,76,114},{137,62,97},{113,47,79},{90,30,60},{62,5,36},{14,0,0},{212,102,142},{185,89,125},{162,77,109},{137,62,92},{112,47,75},{90,31,56},{61,5,32},{13,0,0}, +{212,102,135},{185,89,118},{162,77,103},{137,62,87},{112,47,70},{90,31,52},{61,5,28},{13,0,0},{212,102,127},{186,89,111},{162,76,97},{137,62,81},{112,47,65},{90,31,48},{61,5,24},{12,0,0},{212,102,119},{186,89,104},{162,76,91},{137,62,76},{112,47,60},{90,31,43},{61,5,20},{12,0,0},{213,102,111},{186,89,97},{162,76,84},{137,62,70},{112,48,54},{90,32,38},{61,5,15},{11,0,0}, +{213,102,103},{186,89,91},{162,76,78},{137,62,64},{112,48,49},{89,32,33},{61,5,10},{10,0,0},{213,101,95},{186,90,84},{162,76,71},{137,62,58},{112,48,44},{88,32,28},{60,6,5},{10,0,0},{213,101,87},{186,90,77},{162,76,64},{137,62,52},{112,48,38},{88,32,22},{60,7,3},{10,0,0},{214,102,78},{186,89,68},{162,75,57},{137,62,45},{112,48,32},{88,32,16},{59,8,1},{9,0,0}, +{214,102,69},{186,89,59},{162,75,48},{137,62,37},{112,48,23},{88,32,9},{59,8,1},{9,0,0},{214,101,58},{187,89,49},{162,76,39},{136,62,29},{112,48,15},{89,33,3},{59,8,0},{9,0,0},{214,101,50},{187,89,41},{162,76,32},{136,62,21},{112,48,8},{89,33,1},{59,8,0},{9,0,0},{214,101,41},{188,89,34},{162,75,25},{137,62,14},{112,48,3},{88,33,0},{59,9,0},{9,0,0}, +{209,86,160},{183,74,141},{161,63,123},{136,49,104},{112,34,85},{90,18,65},{62,2,40},{11,0,0},{210,86,152},{184,75,134},{162,63,116},{137,50,98},{113,35,80},{90,19,61},{62,2,36},{11,0,0},{211,86,144},{185,75,126},{162,63,109},{137,50,93},{113,36,75},{90,19,57},{62,2,33},{11,0,0},{212,87,137},{185,75,120},{161,64,104},{137,51,88},{112,36,71},{90,19,53},{61,2,29},{10,0,0}, +{212,87,130},{185,75,113},{161,64,99},{137,51,83},{112,36,67},{90,19,49},{61,2,25},{10,0,0},{212,87,122},{186,75,107},{162,63,93},{137,51,78},{112,37,62},{90,20,45},{61,2,21},{10,0,0},{212,87,114},{186,76,100},{162,63,87},{137,51,73},{112,37,57},{90,20,40},{61,2,17},{10,0,0},{212,87,107},{186,76,94},{162,64,81},{137,51,67},{112,38,51},{90,21,35},{61,2,12},{9,0,0}, +{212,87,100},{186,76,88},{162,64,75},{137,51,61},{112,38,46},{89,21,30},{61,2,8},{8,0,0},{212,87,92},{186,76,81},{161,64,68},{137,52,55},{112,38,41},{88,22,25},{60,3,4},{8,0,0},{212,87,84},{186,76,74},{161,64,61},{137,52,49},{112,38,35},{88,22,19},{60,3,3},{8,0,0},{213,88,75},{186,76,65},{162,64,54},{137,52,42},{112,38,29},{88,22,13},{59,4,1},{7,0,0}, +{213,88,67},{186,76,57},{162,64,46},{137,52,35},{112,38,22},{88,22,8},{59,4,1},{7,0,0},{213,87,57},{187,76,48},{162,65,38},{136,52,28},{112,39,14},{89,23,3},{59,4,0},{6,0,0},{213,87,50},{187,76,41},{162,65,32},{136,52,20},{112,39,8},{89,23,1},{59,4,0},{6,0,0},{213,87,41},{187,76,34},{162,64,25},{137,52,14},{112,39,3},{88,23,0},{59,5,0},{6,0,0}, +{208,69,153},{183,59,135},{160,49,118},{137,36,99},{113,22,81},{90,6,61},{61,0,36},{8,0,0},{209,70,146},{184,60,128},{161,50,112},{137,37,94},{112,23,76},{90,7,57},{61,0,33},{8,0,0},{210,70,138},{185,60,121},{161,50,105},{137,38,89},{112,24,71},{90,7,53},{61,0,30},{8,0,0},{211,71,131},{185,60,115},{160,50,100},{137,39,84},{113,24,67},{90,7,49},{61,0,26},{7,0,0}, +{211,71,124},{185,60,109},{160,50,95},{137,39,79},{113,24,63},{90,7,45},{61,0,22},{6,0,0},{212,72,117},{185,61,103},{161,51,89},{136,39,74},{112,25,58},{89,8,41},{60,0,18},{6,0,0},{212,72,110},{185,62,96},{161,51,83},{136,39,69},{112,25,53},{89,8,36},{60,0,14},{6,0,0},{211,72,103},{185,63,90},{161,52,77},{136,39,63},{112,26,48},{89,9,32},{60,0,9},{6,0,0}, +{211,72,96},{185,63,84},{161,52,71},{136,39,57},{112,26,43},{89,9,28},{60,0,6},{6,0,0},{211,73,89},{185,62,77},{160,52,64},{136,40,52},{112,27,38},{88,10,23},{59,1,3},{6,0,0},{211,73,81},{185,62,70},{160,52,58},{136,40,46},{112,27,32},{88,10,17},{59,1,2},{6,0,0},{212,73,73},{186,63,63},{161,52,52},{136,41,40},{112,28,26},{88,11,11},{59,1,1},{6,0,0}, +{212,73,65},{186,63,55},{161,52,44},{136,41,34},{112,28,20},{88,12,6},{59,1,1},{5,0,0},{212,73,56},{186,63,47},{161,53,37},{136,41,27},{112,29,13},{88,13,2},{58,1,0},{4,0,0},{212,73,49},{186,63,40},{161,53,31},{136,41,19},{112,29,8},{88,13,1},{58,1,0},{4,0,0},{212,73,42},{186,64,34},{161,52,25},{136,42,13},{112,29,3},{88,13,0},{58,1,0},{4,0,0}, +{208,43,146},{183,32,129},{160,25,112},{137,18,94},{113,11,77},{90,2,59},{61,0,34},{6,0,0},{209,45,139},{184,34,122},{161,26,106},{137,19,89},{112,11,72},{90,3,55},{61,0,31},{6,0,0},{210,46,131},{185,35,115},{161,26,100},{137,19,84},{112,12,68},{90,3,51},{61,0,28},{6,0,0},{210,47,125},{185,37,110},{160,26,95},{136,20,80},{113,12,64},{90,3,47},{61,0,24},{5,0,0}, +{210,48,118},{185,38,104},{160,27,90},{136,20,76},{113,12,60},{90,3,43},{61,0,20},{5,0,0},{211,49,112},{185,40,98},{161,29,85},{136,20,71},{112,13,55},{89,3,39},{60,0,16},{5,0,0},{211,50,105},{185,41,92},{161,30,80},{136,20,66},{112,13,50},{89,3,34},{60,0,12},{5,0,0},{211,50,99},{184,42,87},{161,31,74},{136,21,60},{112,13,46},{89,4,30},{60,0,8},{5,0,0}, +{211,51,93},{184,42,81},{161,32,68},{136,21,55},{112,13,41},{89,4,26},{60,0,6},{5,0,0},{211,52,86},{185,42,74},{160,33,62},{136,22,50},{112,14,36},{88,5,21},{59,1,3},{5,0,0},{211,52,79},{185,43,67},{160,34,56},{136,23,44},{112,14,31},{88,5,15},{59,1,2},{5,0,0},{212,53,71},{185,44,61},{161,35,50},{136,24,38},{112,14,25},{88,5,9},{59,1,1},{5,0,0}, +{212,53,63},{185,44,53},{161,35,43},{136,24,32},{112,14,19},{88,6,5},{59,1,1},{4,0,0},{212,53,55},{185,45,46},{161,36,37},{136,25,26},{111,15,12},{88,6,2},{58,1,0},{4,0,0},{212,53,49},{185,45,39},{161,36,30},{136,25,19},{111,15,7},{88,6,1},{58,1,0},{4,0,0},{212,53,42},{186,45,33},{161,37,25},{136,26,13},{112,15,3},{88,6,0},{58,1,0},{4,0,0}, +{207,15,140},{184,3,123},{159,0,106},{136,0,90},{112,0,73},{90,0,56},{61,0,31},{3,0,0},{208,17,133},{185,5,117},{160,1,101},{136,0,85},{112,0,69},{89,0,52},{61,0,28},{3,0,0},{209,19,125},{185,7,110},{160,1,95},{136,0,80},{112,0,64},{89,0,48},{61,0,25},{3,0,0},{209,21,119},{185,11,105},{160,2,91},{135,0,76},{112,0,60},{89,0,44},{60,0,21},{3,0,0}, +{209,22,113},{185,14,100},{160,4,86},{135,0,72},{112,0,56},{89,0,40},{60,0,18},{3,0,0},{210,24,107},{184,17,94},{160,6,81},{135,0,67},{112,0,52},{89,0,36},{60,0,13},{3,0,0},{210,26,101},{184,19,88},{160,8,76},{135,0,62},{112,0,47},{89,0,31},{60,0,9},{3,0,0},{210,27,95},{183,20,83},{160,10,71},{135,1,57},{112,0,43},{89,0,27},{60,0,7},{3,0,0}, +{210,29,89},{183,21,77},{160,12,65},{135,2,52},{112,0,39},{89,0,23},{60,0,5},{3,0,0},{210,30,82},{184,22,70},{160,14,60},{135,3,47},{111,0,34},{88,0,18},{59,0,3},{3,0,0},{210,31,76},{184,23,64},{160,16,54},{135,4,42},{111,0,29},{88,0,13},{59,0,1},{3,0,0},{211,31,69},{184,25,58},{160,18,48},{135,6,36},{111,0,23},{88,0,7},{58,0,0},{3,0,0}, +{211,32,61},{184,26,51},{160,18,42},{135,7,30},{111,0,17},{88,0,4},{58,0,0},{3,0,0},{211,33,54},{184,27,44},{160,19,36},{135,9,24},{111,1,10},{88,0,1},{58,0,0},{3,0,0},{211,33,48},{184,27,38},{160,20,30},{135,9,18},{111,1,6},{88,0,1},{58,0,0},{3,0,0},{211,34,42},{185,27,32},{160,21,24},{135,10,13},{111,1,2},{88,0,0},{58,0,0},{3,0,0}, +{175,226,249},{153,198,220},{132,173,192},{112,147,164},{91,121,135},{71,96,107},{45,65,75},{7,24,33},{177,225,236},{155,197,208},{134,172,181},{113,146,155},{92,120,128},{71,95,102},{45,64,70},{6,23,29},{179,224,223},{156,196,197},{135,172,171},{115,146,146},{93,120,121},{71,95,96},{45,64,65},{6,23,25},{181,223,211},{158,196,187},{137,171,162},{116,145,139},{94,120,114},{72,95,90},{45,64,61},{5,23,21}, +{182,223,199},{160,196,176},{138,170,154},{116,144,131},{94,120,107},{72,95,85},{45,64,56},{5,23,18},{183,222,187},{161,195,165},{139,169,144},{117,144,122},{95,119,101},{72,94,79},{45,63,52},{4,22,13},{184,221,174},{162,194,154},{139,169,134},{118,144,114},{95,119,94},{72,94,73},{45,63,47},{4,22,8},{185,220,161},{163,193,143},{140,168,124},{118,143,105},{96,118,86},{73,93,66},{46,62,42},{4,22,3}, +{187,219,149},{163,192,131},{141,167,114},{118,142,96},{96,118,79},{73,93,60},{46,62,37},{3,22,0},{189,218,137},{164,191,120},{142,166,105},{119,141,88},{96,117,72},{74,92,54},{45,62,31},{2,22,0},{190,218,123},{164,191,109},{142,166,94},{119,141,79},{96,117,64},{74,92,47},{45,62,25},{1,22,0},{191,217,109},{165,190,97},{143,166,84},{119,140,70},{96,116,55},{74,91,40},{45,61,19},{0,22,0}, +{191,217,93},{166,190,82},{143,165,71},{119,140,59},{96,116,45},{74,91,31},{45,61,11},{0,22,0},{192,216,77},{168,189,68},{144,164,57},{120,139,47},{97,115,35},{74,91,21},{46,61,3},{0,22,0},{193,216,62},{168,189,54},{144,164,45},{120,139,36},{97,115,24},{74,91,12},{46,61,1},{0,22,0},{194,216,46},{168,189,39},{144,164,33},{120,139,24},{97,114,13},{75,90,3},{45,60,0},{0,22,0}, +{176,213,240},{154,187,212},{134,163,186},{113,139,158},{92,115,131},{72,90,104},{46,60,72},{8,19,30},{178,212,228},{156,186,201},{136,163,176},{115,138,150},{93,114,124},{72,89,98},{46,60,67},{7,18,26},{179,212,216},{158,186,190},{137,163,166},{116,138,141},{94,114,117},{72,89,92},{46,60,62},{7,18,22},{182,211,204},{160,185,181},{138,162,157},{117,137,134},{95,113,110},{73,89,87},{46,59,58},{6,18,18}, +{183,210,193},{161,185,170},{139,161,149},{117,137,127},{95,113,103},{74,89,82},{46,59,54},{6,18,14},{185,209,181},{162,184,160},{140,160,139},{118,136,118},{96,112,97},{73,88,76},{46,59,49},{6,17,10},{186,209,169},{162,183,149},{140,160,130},{118,136,110},{96,112,90},{73,88,70},{46,59,44},{6,17,5},{186,208,156},{163,182,138},{141,159,120},{119,135,102},{96,111,83},{74,87,63},{47,58,39},{5,18,2}, +{187,207,144},{163,182,127},{141,158,111},{119,135,93},{96,111,76},{74,87,57},{47,58,34},{4,18,0},{188,206,133},{164,181,117},{142,157,102},{119,134,85},{96,110,69},{74,87,51},{46,58,29},{4,17,0},{189,206,120},{165,181,106},{142,157,92},{119,134,76},{96,110,61},{74,87,45},{46,58,23},{2,17,0},{191,205,107},{166,180,94},{142,157,82},{119,133,67},{97,110,53},{75,86,38},{46,57,17},{1,18,0}, +{191,205,91},{167,180,80},{143,156,69},{119,133,57},{97,110,44},{75,86,29},{46,57,9},{1,18,0},{192,204,76},{168,180,66},{144,155,56},{120,132,45},{97,109,34},{75,86,19},{46,57,2},{0,17,0},{193,204,61},{168,180,52},{144,155,44},{120,132,35},{97,109,23},{75,86,10},{46,57,1},{0,17,0},{194,204,47},{167,179,40},{144,155,32},{120,132,24},{97,109,12},{75,85,2},{46,56,0},{0,17,0}, +{177,201,232},{155,177,204},{135,154,179},{114,131,152},{93,107,127},{72,84,101},{47,55,70},{9,13,27},{179,200,220},{157,177,193},{137,154,169},{116,130,144},{94,107,120},{73,83,95},{47,55,65},{8,13,23},{180,200,208},{159,177,183},{138,154,160},{117,130,136},{95,107,113},{73,83,89},{47,55,60},{8,13,19},{182,199,197},{160,176,174},{139,153,151},{117,129,129},{96,106,107},{74,83,84},{47,54,56},{7,13,15}, +{183,198,186},{161,175,164},{139,152,143},{117,129,122},{96,106,100},{74,83,79},{47,54,52},{7,13,11},{185,197,175},{162,174,154},{140,151,134},{118,128,115},{96,105,94},{74,82,73},{48,54,47},{6,12,7},{186,197,163},{162,174,144},{140,151,126},{118,128,107},{96,105,87},{74,82,67},{48,54,42},{6,12,3},{186,196,151},{163,173,134},{141,150,117},{119,127,99},{96,104,80},{75,81,61},{47,53,37},{6,13,1}, +{187,196,140},{163,173,124},{141,150,108},{119,127,91},{96,104,73},{75,81,55},{47,53,32},{5,13,0},{188,195,129},{164,172,114},{142,149,99},{119,126,83},{96,103,66},{74,81,49},{47,53,27},{4,12,0},{189,195,118},{165,172,103},{142,149,90},{119,126,74},{96,103,59},{74,81,43},{47,53,21},{3,12,0},{191,194,105},{166,171,92},{143,148,80},{119,125,65},{97,103,52},{75,80,36},{47,53,15},{1,13,0}, +{191,194,90},{167,171,79},{143,148,68},{119,125,56},{97,103,43},{75,80,27},{47,53,8},{1,13,0},{192,193,76},{168,170,65},{144,147,56},{120,125,44},{97,102,33},{75,80,17},{47,53,2},{0,12,0},{192,193,61},{168,170,52},{144,147,44},{120,125,34},{97,102,23},{75,80,9},{47,53,1},{0,12,0},{193,193,48},{167,169,40},{144,146,31},{120,124,24},{98,102,12},{75,79,2},{46,53,0},{0,13,0}, +{178,189,224},{156,168,198},{136,145,173},{115,124,148},{95,101,123},{74,79,97},{48,51,67},{10,7,24},{180,188,213},{158,167,188},{137,145,164},{116,123,140},{96,101,116},{74,79,91},{48,51,62},{9,7,20},{181,188,201},{160,167,178},{138,145,156},{116,123,132},{96,101,109},{74,79,85},{48,51,57},{9,7,16},{182,188,191},{161,166,169},{139,144,147},{117,122,125},{96,100,103},{75,79,81},{48,50,53},{9,8,12}, +{183,188,180},{161,166,160},{140,144,139},{118,122,118},{96,100,96},{75,79,76},{48,50,49},{9,8,7},{185,187,170},{162,165,150},{140,143,130},{118,122,111},{96,99,90},{75,78,70},{48,50,45},{8,8,4},{186,187,159},{162,165,140},{140,143,122},{118,122,103},{96,99,84},{75,78,64},{48,50,40},{7,8,1},{187,186,147},{163,164,130},{141,142,113},{119,121,96},{97,99,77},{75,77,59},{48,49,35},{6,9,0}, +{187,185,136},{163,164,120},{141,142,104},{119,121,88},{97,99,71},{75,77,53},{48,49,30},{6,9,0},{188,184,125},{164,163,110},{142,141,95},{120,120,80},{97,98,64},{75,77,47},{48,49,25},{4,8,0},{189,184,114},{165,163,100},{142,141,86},{120,120,72},{97,98,57},{75,77,41},{48,49,19},{3,8,0},{190,184,102},{166,162,90},{143,140,77},{120,119,63},{98,98,50},{75,76,34},{48,49,13},{1,9,0}, +{190,184,88},{166,162,77},{143,140,66},{120,119,54},{98,98,41},{75,76,25},{48,49,7},{1,9,0},{191,183,74},{167,161,64},{144,139,54},{120,119,43},{98,97,31},{75,76,15},{47,49,2},{1,8,0},{191,183,60},{167,161,52},{144,139,43},{120,119,33},{98,97,21},{75,76,8},{47,49,1},{1,8,0},{192,182,48},{168,160,40},{144,139,32},{121,118,24},{98,97,11},{76,75,2},{47,49,0},{0,9,0}, +{178,178,216},{157,158,192},{136,137,168},{115,116,143},{95,95,119},{75,74,94},{49,47,64},{11,2,21},{180,177,205},{159,157,182},{137,136,159},{116,116,136},{96,95,112},{74,74,88},{49,46,59},{10,3,17},{182,177,194},{160,157,172},{138,136,151},{116,116,128},{96,95,105},{74,74,82},{49,46,54},{10,3,13},{183,177,184},{161,156,164},{140,136,143},{117,115,121},{96,94,99},{75,73,78},{49,46,50},{9,3,9}, +{184,177,175},{162,156,155},{141,136,135},{118,115,114},{96,94,93},{75,73,73},{49,46,46},{9,3,4},{186,176,165},{162,155,145},{140,135,126},{119,114,107},{97,93,87},{75,73,67},{48,46,42},{9,3,2},{187,176,154},{162,155,135},{140,135,118},{119,114,100},{97,93,81},{75,73,61},{48,46,37},{8,3,0},{187,175,143},{163,154,126},{141,134,109},{119,114,93},{97,93,74},{75,72,56},{49,45,32},{7,4,0}, +{187,175,132},{163,154,116},{141,134,101},{119,114,85},{97,93,68},{75,72,50},{49,45,28},{6,4,0},{188,174,122},{164,153,107},{142,133,92},{120,113,78},{98,92,61},{75,72,45},{48,45,23},{4,4,0},{188,174,111},{165,153,97},{142,133,83},{120,113,69},{98,92,55},{75,72,39},{48,45,17},{3,4,0},{189,173,99},{166,153,87},{143,133,74},{120,112,61},{98,92,48},{75,72,32},{48,45,10},{1,4,0}, +{190,173,86},{166,153,75},{143,133,64},{120,112,52},{98,92,39},{75,72,24},{48,45,6},{1,4,0},{191,173,73},{166,152,63},{144,132,53},{120,111,42},{98,91,30},{75,71,14},{47,45,2},{1,4,0},{191,173,60},{167,152,52},{144,132,43},{120,111,33},{98,91,20},{75,71,8},{47,45,1},{1,4,0},{191,172,48},{168,152,41},{144,131,32},{121,111,23},{98,91,11},{76,71,2},{47,45,0},{0,5,0}, +{180,166,209},{158,147,185},{137,128,162},{116,109,138},{96,88,114},{76,68,90},{50,41,61},{12,1,19},{181,166,198},{160,147,175},{138,127,153},{117,108,131},{96,88,108},{75,68,84},{50,41,57},{11,1,14},{182,166,188},{161,147,166},{139,127,145},{118,108,124},{96,88,101},{75,68,79},{50,41,52},{11,1,9},{183,165,178},{162,146,158},{140,127,138},{118,108,117},{97,87,96},{76,67,75},{50,41,48},{10,2,5}, +{184,165,169},{162,146,149},{141,127,130},{119,108,110},{97,87,90},{76,67,70},{50,41,44},{10,2,2},{185,164,159},{163,145,140},{141,126,122},{120,107,103},{97,87,84},{75,67,64},{49,41,40},{10,2,1},{186,164,148},{163,145,131},{141,126,114},{120,107,96},{97,87,78},{75,67,59},{49,41,35},{8,2,0},{186,164,139},{163,144,122},{141,126,106},{119,107,89},{97,86,72},{76,66,54},{49,41,30},{7,2,0}, +{187,164,128},{164,144,113},{142,126,98},{119,107,83},{97,86,66},{76,66,48},{49,41,26},{6,2,0},{188,163,119},{165,143,104},{143,125,90},{120,106,76},{98,86,59},{76,66,43},{49,41,21},{5,2,0},{188,163,108},{165,143,95},{143,125,81},{120,106,67},{98,86,53},{76,66,37},{49,41,15},{4,2,0},{189,162,97},{165,143,85},{142,124,72},{121,105,59},{98,85,46},{76,66,30},{48,41,8},{3,2,0}, +{189,162,84},{166,143,73},{142,124,62},{121,105,50},{98,85,38},{76,66,22},{48,41,4},{3,2,0},{190,162,72},{166,142,61},{143,123,51},{120,104,40},{98,85,29},{76,65,13},{48,41,1},{3,2,0},{190,162,60},{167,142,51},{143,123,42},{120,104,31},{98,85,19},{76,65,7},{48,41,1},{2,2,0},{190,161,48},{167,142,41},{143,123,32},{121,104,22},{98,85,10},{76,65,1},{48,41,0},{1,2,0}, +{180,155,201},{159,137,179},{137,120,156},{117,101,133},{96,82,110},{76,62,86},{50,36,58},{11,0,16},{181,154,191},{160,136,169},{138,119,148},{118,100,126},{97,81,104},{76,62,81},{50,36,54},{11,0,11},{182,154,182},{161,136,160},{139,119,140},{119,100,119},{97,81,98},{76,62,76},{50,36,49},{11,0,6},{183,154,172},{162,136,152},{140,118,133},{119,100,113},{97,81,93},{76,61,72},{50,36,45},{11,0,2}, +{184,154,163},{162,136,144},{141,118,125},{119,100,106},{97,81,87},{76,61,67},{50,36,41},{10,0,0},{185,153,153},{163,135,135},{141,118,117},{120,99,100},{97,80,81},{75,61,61},{50,36,37},{9,0,0},{185,153,143},{163,135,127},{141,118,110},{120,99,93},{97,80,75},{75,61,56},{50,36,32},{7,0,0},{186,153,134},{163,135,118},{141,118,103},{119,99,86},{97,80,69},{76,61,51},{49,36,28},{6,0,0}, +{187,153,124},{164,135,109},{142,118,95},{119,99,80},{97,80,63},{76,61,46},{49,36,24},{5,0,0},{188,152,115},{165,134,101},{143,117,87},{120,98,73},{98,79,57},{76,60,41},{49,36,19},{4,0,0},{188,152,105},{165,134,92},{143,117,79},{120,98,65},{98,79,51},{76,60,34},{49,36,13},{4,0,0},{189,151,95},{165,134,82},{142,116,70},{121,97,57},{98,79,44},{76,60,28},{48,36,6},{4,0,0}, +{189,151,82},{165,134,71},{142,116,60},{121,97,48},{98,79,36},{76,60,20},{48,36,3},{4,0,0},{190,151,70},{166,133,60},{143,115,50},{120,97,39},{98,79,27},{76,59,11},{48,36,1},{3,0,0},{190,151,60},{166,133,50},{143,115,41},{120,97,30},{98,79,18},{76,59,7},{48,36,1},{3,0,0},{190,150,48},{167,133,41},{143,115,32},{121,96,22},{98,79,9},{76,59,1},{48,36,0},{2,0,0}, +{181,144,194},{159,127,173},{138,111,151},{118,94,128},{97,75,106},{76,56,83},{51,30,55},{9,0,12},{182,143,184},{160,127,163},{139,110,143},{119,93,121},{98,74,100},{76,55,78},{50,31,51},{10,0,7},{183,143,175},{161,127,154},{139,110,135},{119,93,114},{98,74,94},{76,55,73},{50,31,46},{10,0,3},{184,143,166},{162,127,147},{140,110,128},{119,93,108},{98,74,89},{76,55,69},{50,31,42},{8,0,1}, +{184,143,158},{162,127,139},{140,110,120},{119,93,102},{98,74,84},{76,55,64},{50,31,38},{7,0,0},{185,142,148},{163,126,130},{141,109,113},{120,92,96},{98,73,78},{76,56,59},{50,31,34},{6,0,0},{185,142,139},{163,126,122},{141,109,106},{120,92,90},{98,73,72},{76,56,54},{50,31,30},{6,0,0},{186,142,130},{164,125,113},{141,109,99},{120,92,83},{98,73,66},{76,55,49},{50,31,26},{5,0,0}, +{186,142,120},{164,125,105},{141,109,91},{120,92,77},{98,73,60},{76,55,43},{50,31,21},{4,0,0},{187,141,111},{164,125,98},{142,108,84},{119,91,70},{98,72,54},{76,55,38},{50,31,16},{4,0,0},{188,141,102},{165,125,89},{142,108,76},{119,91,62},{98,72,48},{76,55,32},{50,31,10},{4,0,0},{189,141,92},{165,124,80},{142,107,68},{120,90,55},{98,72,42},{76,55,26},{49,31,4},{3,0,0}, +{189,141,80},{165,124,70},{142,107,59},{120,90,47},{98,72,35},{76,55,19},{49,31,2},{3,0,0},{189,141,68},{165,124,59},{142,107,49},{120,90,38},{98,72,26},{77,54,10},{49,31,0},{2,0,0},{189,141,59},{165,124,49},{142,107,40},{120,90,29},{98,72,17},{77,54,6},{49,31,0},{2,0,0},{190,141,49},{166,124,41},{143,107,31},{120,89,21},{98,72,8},{76,54,1},{48,31,0},{1,0,0}, +{181,133,187},{159,117,167},{138,102,145},{118,86,124},{98,68,102},{76,50,79},{51,23,52},{7,0,8},{182,133,178},{160,117,157},{139,101,137},{119,85,117},{98,68,96},{76,49,74},{50,24,48},{7,0,4},{183,133,169},{161,117,148},{139,101,130},{119,85,110},{98,68,90},{76,49,69},{50,25,44},{7,0,1},{184,133,160},{162,117,141},{140,101,123},{119,85,104},{98,68,85},{77,49,65},{50,25,40},{6,0,0}, +{184,133,152},{163,117,134},{140,101,116},{119,85,98},{98,68,80},{77,49,61},{50,25,36},{6,0,0},{185,132,143},{163,116,126},{141,101,109},{120,84,92},{98,67,74},{77,50,57},{50,25,32},{5,0,0},{186,132,135},{163,116,118},{141,101,102},{120,84,86},{98,67,69},{77,50,52},{50,25,28},{4,0,0},{186,132,126},{164,115,109},{141,100,95},{120,84,80},{98,67,64},{77,49,47},{50,25,24},{4,0,0}, +{186,132,116},{164,115,101},{141,100,88},{120,84,74},{98,67,58},{77,49,41},{50,25,19},{3,0,0},{187,131,107},{164,115,94},{141,100,81},{119,84,67},{98,66,52},{76,49,36},{50,26,14},{2,0,0},{188,131,98},{164,115,86},{141,100,74},{119,84,60},{98,66,46},{76,49,30},{50,26,8},{2,0,0},{188,131,89},{165,114,78},{142,99,66},{120,83,53},{98,66,40},{76,49,24},{49,26,3},{2,0,0}, +{188,131,78},{165,114,68},{142,99,57},{120,83,45},{98,66,33},{76,49,17},{49,26,1},{1,0,0},{189,131,66},{165,114,57},{142,99,47},{120,83,36},{98,66,24},{77,49,8},{49,27,0},{1,0,0},{189,131,57},{165,114,49},{142,99,39},{120,83,28},{98,66,15},{77,49,4},{49,27,0},{1,0,0},{189,131,49},{166,114,40},{143,99,31},{120,83,20},{98,66,7},{76,49,1},{48,27,0},{1,0,0}, +{182,122,180},{160,107,160},{138,93,139},{118,77,119},{98,61,98},{77,43,76},{51,16,49},{5,0,4},{183,122,171},{161,107,151},{139,92,132},{119,77,113},{98,61,92},{77,43,71},{51,17,45},{5,0,2},{184,122,162},{162,107,143},{140,92,125},{119,77,106},{98,61,86},{77,43,66},{51,18,42},{5,0,0},{185,122,154},{162,107,136},{140,92,119},{119,77,100},{98,61,81},{77,43,62},{50,18,38},{4,0,0}, +{185,122,146},{162,107,129},{140,92,112},{119,77,94},{98,61,76},{77,43,58},{50,18,34},{4,0,0},{185,122,138},{163,107,122},{141,92,105},{119,77,88},{98,60,71},{77,44,54},{51,19,30},{3,0,0},{185,122,130},{163,107,114},{141,92,98},{119,77,83},{98,60,66},{77,44,49},{51,19,26},{3,0,0},{186,121,121},{163,106,105},{142,91,91},{119,77,77},{98,60,61},{77,43,44},{50,20,22},{2,0,0}, +{186,121,112},{163,106,98},{142,91,85},{119,77,71},{98,60,56},{77,43,40},{50,20,17},{1,0,0},{187,121,104},{164,106,91},{142,91,78},{119,77,64},{98,60,51},{77,43,35},{50,21,12},{1,0,0},{187,121,95},{164,106,83},{142,91,71},{119,77,58},{98,60,45},{77,43,29},{50,21,7},{1,0,0},{187,121,86},{164,105,75},{142,91,64},{119,76,52},{98,60,39},{77,43,23},{49,21,3},{1,0,0}, +{187,121,76},{164,105,66},{142,91,56},{119,76,44},{98,60,31},{77,43,15},{49,21,1},{1,0,0},{188,120,65},{165,105,56},{142,91,46},{120,76,35},{98,59,23},{76,43,7},{48,21,0},{0,0,0},{188,120,56},{165,105,48},{142,91,38},{120,76,27},{98,59,14},{76,43,3},{48,21,0},{0,0,0},{188,120,48},{165,105,39},{143,90,30},{120,76,20},{98,59,6},{76,43,0},{48,22,0},{0,0,0}, +{182,110,173},{160,96,153},{139,83,134},{118,68,114},{98,53,94},{77,36,73},{51,10,46},{3,0,2},{183,110,164},{161,96,145},{140,83,127},{119,69,108},{98,53,89},{77,36,68},{51,11,42},{3,0,1},{184,110,156},{162,96,137},{140,83,120},{119,69,101},{98,53,83},{77,36,63},{51,11,39},{3,0,0},{185,110,149},{162,96,131},{141,83,114},{119,69,96},{98,53,78},{77,36,59},{50,12,35},{2,0,0}, +{185,110,141},{162,96,124},{141,83,107},{119,69,91},{98,53,73},{77,36,55},{50,12,31},{2,0,0},{185,110,133},{163,97,117},{141,83,101},{119,68,85},{98,53,68},{77,37,51},{51,12,27},{1,0,0},{185,110,125},{163,97,109},{141,83,95},{119,68,80},{98,53,63},{77,37,46},{51,12,23},{1,0,0},{186,110,117},{163,96,102},{142,82,88},{119,69,74},{98,53,58},{77,37,41},{50,13,19},{1,0,0}, +{186,110,109},{163,96,95},{142,82,82},{119,69,68},{98,53,53},{77,37,37},{50,13,14},{1,0,0},{187,110,101},{164,96,88},{142,82,75},{119,68,61},{98,53,48},{77,37,32},{50,14,10},{1,0,0},{187,110,92},{164,96,80},{142,82,69},{119,68,55},{98,53,42},{77,37,27},{50,14,5},{1,0,0},{187,110,84},{164,96,73},{142,82,62},{119,68,49},{98,53,36},{77,37,21},{49,15,3},{0,0,0}, +{187,110,74},{164,96,64},{142,82,54},{119,68,42},{98,53,29},{77,37,13},{49,15,1},{0,0,0},{188,109,64},{165,96,55},{142,82,45},{120,68,34},{98,53,21},{76,37,6},{48,15,0},{0,0,0},{188,109,55},{165,96,47},{142,82,37},{120,68,26},{98,53,13},{76,37,3},{48,15,0},{0,0,0},{188,109,47},{165,95,39},{143,82,30},{120,68,19},{98,53,6},{76,37,0},{48,16,0},{0,0,0}, +{182,98,167},{160,86,147},{139,73,128},{119,59,109},{98,44,90},{77,27,70},{51,4,44},{1,0,0},{183,98,158},{161,86,139},{140,73,122},{120,60,103},{98,44,85},{78,28,65},{51,5,40},{1,0,0},{183,98,150},{162,86,131},{141,73,115},{120,60,97},{98,44,79},{78,28,61},{51,5,37},{1,0,0},{184,98,143},{162,86,125},{141,73,109},{120,60,93},{98,45,75},{77,29,57},{50,5,33},{1,0,0}, +{185,98,136},{162,86,118},{141,73,103},{120,60,88},{98,45,70},{77,29,53},{50,5,29},{1,0,0},{185,98,128},{163,87,112},{141,73,97},{120,59,82},{98,46,65},{77,30,49},{50,5,25},{0,0,0},{185,98,120},{163,87,105},{141,73,91},{120,59,76},{98,46,60},{77,30,44},{50,5,21},{0,0,0},{186,98,113},{163,86,98},{141,73,85},{120,60,71},{98,46,55},{77,30,39},{50,6,16},{0,0,0}, +{186,98,105},{163,86,92},{141,73,79},{120,60,65},{98,46,51},{77,30,35},{50,6,12},{0,0,0},{186,98,98},{163,86,85},{141,73,73},{120,59,59},{98,46,46},{76,30,30},{49,7,8},{0,0,0},{186,98,90},{163,86,78},{141,73,67},{120,59,53},{98,46,40},{76,30,25},{49,7,4},{0,0,0},{187,98,81},{163,86,71},{141,73,60},{119,60,47},{98,46,34},{76,31,19},{48,8,2},{0,0,0}, +{187,98,72},{163,86,62},{141,73,52},{119,60,40},{98,46,27},{76,31,11},{48,8,1},{0,0,0},{187,98,62},{164,86,53},{142,73,43},{119,60,33},{98,46,19},{76,31,5},{48,9,0},{0,0,0},{187,98,54},{164,86,45},{142,73,36},{119,60,25},{98,46,12},{76,31,2},{48,9,0},{0,0,0},{188,98,47},{165,85,38},{143,73,29},{120,60,18},{98,47,6},{76,31,0},{47,10,0},{0,0,0}, +{182,84,161},{160,73,141},{139,61,123},{119,48,104},{98,33,86},{77,17,66},{51,2,41},{1,0,0},{183,84,152},{161,73,134},{140,62,117},{120,49,99},{98,34,81},{78,18,62},{51,2,37},{1,0,0},{183,84,144},{162,73,126},{141,62,110},{120,49,93},{98,34,75},{78,18,58},{51,2,34},{1,0,0},{184,84,138},{162,73,120},{141,62,105},{120,49,89},{98,35,71},{77,19,54},{50,2,30},{0,0,0}, +{185,84,131},{162,73,114},{141,62,99},{120,49,84},{98,35,67},{77,19,50},{50,2,26},{0,0,0},{185,85,123},{163,74,108},{141,63,93},{120,50,79},{98,36,62},{77,19,46},{50,2,22},{0,0,0},{185,85,116},{163,74,101},{141,63,88},{120,50,73},{98,36,57},{77,19,41},{50,2,18},{0,0,0},{186,85,109},{163,75,95},{141,63,82},{120,50,68},{98,36,52},{77,20,36},{50,2,13},{0,0,0}, +{186,85,102},{163,75,89},{141,63,76},{120,50,62},{98,36,48},{77,20,32},{50,2,9},{0,0,0},{186,85,95},{163,74,82},{141,63,70},{120,50,56},{98,37,43},{76,20,27},{49,3,6},{0,0,0},{186,85,87},{163,74,75},{141,63,64},{120,50,50},{98,37,37},{76,21,22},{49,3,3},{0,0,0},{187,85,79},{163,74,68},{141,63,57},{119,51,44},{98,38,31},{76,21,16},{48,4,2},{0,0,0}, +{187,85,71},{163,74,60},{141,63,50},{119,51,38},{98,38,25},{76,21,10},{48,4,1},{0,0,0},{187,85,61},{164,75,52},{142,63,42},{119,51,32},{98,38,18},{76,22,4},{48,5,0},{0,0,0},{187,85,54},{164,75,45},{142,63,36},{119,51,24},{98,38,12},{76,22,2},{48,5,0},{0,0,0},{188,85,47},{165,74,38},{143,63,29},{120,51,18},{98,38,6},{76,23,0},{47,5,0},{0,0,0}, +{182,69,154},{160,59,136},{140,48,118},{119,36,100},{98,21,82},{78,5,62},{51,0,38},{0,0,0},{183,70,146},{161,60,129},{141,49,112},{120,37,95},{98,22,77},{78,6,58},{50,0,34},{0,0,0},{184,70,138},{162,60,121},{141,49,106},{120,37,89},{98,22,71},{78,6,54},{50,0,31},{0,0,0},{185,71,132},{162,60,115},{140,50,101},{120,38,85},{99,23,67},{78,7,50},{50,0,27},{0,0,0}, +{185,71,125},{162,60,110},{140,50,95},{120,38,80},{99,23,63},{78,7,46},{50,0,24},{0,0,0},{185,72,119},{162,61,104},{140,51,89},{120,38,75},{98,24,59},{77,7,42},{50,0,20},{0,0,0},{185,72,112},{162,62,97},{140,51,84},{120,38,70},{98,25,54},{77,7,38},{50,0,15},{0,0,0},{185,72,105},{162,63,91},{140,51,78},{119,39,64},{98,26,49},{77,8,33},{50,0,10},{0,0,0}, +{185,72,98},{162,63,85},{140,51,72},{119,39,59},{98,26,45},{77,9,29},{50,0,7},{0,0,0},{186,73,91},{163,62,79},{141,51,67},{119,40,54},{98,27,40},{77,10,25},{50,1,4},{0,0,0},{186,73,84},{163,62,73},{141,51,61},{119,40,48},{98,27,35},{77,10,20},{50,1,2},{0,0,0},{186,73,77},{163,63,66},{141,51,55},{120,41,42},{98,28,29},{76,11,14},{49,1,1},{0,0,0}, +{186,73,69},{163,63,58},{141,51,48},{120,41,36},{98,28,23},{76,11,9},{49,1,1},{0,0,0},{187,72,60},{163,63,51},{141,52,41},{120,41,30},{98,29,17},{76,12,4},{48,1,0},{0,0,0},{187,72,53},{163,63,44},{141,52,35},{120,41,23},{98,29,10},{76,12,2},{48,1,0},{0,0,0},{187,72,46},{164,63,38},{142,52,29},{119,41,17},{98,29,4},{76,13,0},{48,1,0},{0,0,0}, +{182,49,147},{160,37,130},{140,26,113},{119,18,95},{98,10,77},{78,2,59},{51,0,35},{0,0,0},{183,50,140},{161,39,123},{141,28,107},{120,19,90},{98,11,73},{78,3,55},{50,0,32},{0,0,0},{184,50,132},{162,40,116},{141,29,101},{120,19,85},{98,11,69},{78,3,52},{50,0,29},{0,0,0},{185,51,126},{162,41,110},{140,30,96},{120,20,81},{99,12,65},{78,3,48},{50,0,25},{0,0,0}, +{185,52,120},{162,42,105},{140,31,91},{120,21,77},{99,12,61},{78,3,44},{50,0,21},{0,0,0},{185,53,114},{162,44,99},{140,33,86},{120,22,72},{98,12,56},{77,3,40},{50,0,17},{0,0,0},{185,54,108},{162,45,94},{140,34,81},{120,22,67},{98,13,52},{77,3,36},{50,0,13},{0,0,0},{185,54,101},{162,45,88},{140,34,75},{119,23,61},{98,13,47},{77,4,31},{50,0,9},{0,0,0}, +{185,55,94},{162,45,82},{140,35,70},{119,24,57},{98,13,43},{77,4,27},{50,0,6},{0,0,0},{186,55,87},{163,46,76},{141,36,65},{119,25,52},{98,14,38},{77,5,23},{50,1,4},{0,0,0},{186,55,81},{163,46,70},{141,37,59},{119,25,47},{98,14,33},{77,5,18},{50,1,2},{0,0,0},{186,56,75},{163,47,64},{141,37,53},{120,26,41},{98,15,28},{76,5,12},{49,1,1},{0,0,0}, +{186,56,67},{163,47,57},{141,38,47},{120,27,35},{98,15,22},{76,5,8},{49,1,1},{0,0,0},{187,56,59},{163,47,50},{141,38,40},{120,28,29},{98,16,16},{76,6,3},{48,1,0},{0,0,0},{187,56,53},{163,47,43},{141,38,34},{120,28,23},{98,16,10},{76,6,2},{48,1,0},{0,0,0},{187,56,46},{164,48,37},{142,39,29},{119,28,17},{98,16,4},{76,6,0},{48,1,0},{0,0,0}, +{183,28,141},{161,16,124},{140,3,108},{119,0,91},{99,0,73},{78,0,56},{50,0,32},{0,0,0},{184,29,134},{162,18,118},{140,6,102},{120,0,86},{99,0,69},{78,0,52},{50,0,29},{0,0,0},{184,29,127},{162,19,111},{140,8,96},{120,1,81},{99,0,66},{78,0,49},{50,0,26},{0,0,0},{185,31,121},{162,21,106},{141,9,92},{120,2,77},{99,0,62},{78,0,45},{50,0,22},{0,0,0}, +{185,32,116},{162,23,101},{141,11,87},{120,2,73},{99,0,58},{78,0,41},{50,0,19},{0,0,0},{185,34,110},{162,25,95},{140,14,82},{120,3,68},{99,0,53},{78,0,37},{49,0,14},{0,0,0},{185,35,104},{162,26,90},{140,16,77},{120,4,63},{99,0,49},{78,0,33},{49,0,10},{0,0,0},{185,35,97},{162,27,84},{140,17,72},{119,5,58},{99,0,45},{77,0,29},{49,0,7},{0,0,0}, +{185,36,91},{162,28,78},{140,19,67},{119,6,54},{99,0,41},{77,0,25},{49,0,5},{0,0,0},{185,37,84},{162,29,73},{140,20,62},{119,7,50},{98,1,36},{77,0,21},{49,0,4},{0,0,0},{185,38,78},{162,30,67},{140,21,56},{119,9,45},{98,1,31},{77,0,15},{49,0,2},{0,0,0},{185,39,72},{163,31,61},{140,22,50},{119,10,39},{98,1,26},{76,0,9},{48,0,0},{0,0,0}, +{185,39,65},{163,31,55},{140,23,45},{119,11,33},{98,2,20},{76,0,6},{48,0,0},{0,0,0},{186,38,58},{163,31,48},{141,24,39},{119,13,27},{98,3,14},{76,0,2},{47,0,0},{0,0,0},{186,38,52},{163,32,42},{141,24,33},{119,13,22},{98,3,9},{76,0,1},{47,0,0},{0,0,0},{186,39,46},{163,33,36},{141,25,28},{119,14,17},{98,3,4},{76,0,0},{47,0,0},{0,0,0}, +{132,213,247},{116,187,218},{101,164,190},{84,139,162},{67,114,135},{49,90,107},{25,61,75},{0,21,33},{135,212,234},{119,186,206},{103,163,180},{86,138,153},{69,114,128},{50,89,101},{25,61,70},{0,21,29},{138,212,221},{122,186,195},{105,163,171},{88,138,145},{70,114,120},{52,89,95},{25,61,65},{0,21,26},{141,211,209},{124,185,186},{107,162,162},{90,137,138},{72,113,114},{53,89,90},{26,60,61},{0,21,22}, +{144,210,198},{126,185,175},{109,162,153},{90,137,131},{72,113,107},{53,89,85},{26,60,57},{0,21,18},{145,209,187},{128,184,165},{109,161,144},{91,136,122},{73,112,101},{53,88,79},{27,60,52},{0,20,14},{147,209,174},{129,184,154},{110,161,134},{92,136,114},{73,112,94},{53,88,73},{27,60,47},{0,20,9},{148,208,162},{129,183,143},{112,160,125},{93,135,105},{74,111,87},{54,87,66},{28,60,42},{0,21,4}, +{150,207,150},{130,182,132},{113,159,115},{94,135,97},{75,111,80},{55,87,60},{28,60,37},{0,21,1},{152,206,138},{132,181,122},{114,158,105},{94,134,89},{75,111,73},{56,87,55},{28,59,32},{0,20,0},{154,206,126},{134,181,111},{114,158,95},{94,134,81},{75,111,65},{56,87,49},{28,59,26},{0,20,0},{155,206,112},{135,180,99},{115,157,85},{95,133,72},{76,110,57},{56,86,42},{29,59,20},{0,20,0}, +{155,206,99},{136,180,86},{116,157,74},{96,133,62},{76,110,48},{56,86,33},{29,59,13},{0,20,0},{157,205,84},{137,180,74},{117,156,62},{97,132,51},{77,109,39},{57,86,25},{29,58,4},{0,20,0},{158,205,71},{137,180,62},{117,156,52},{97,132,42},{77,109,30},{57,86,16},{29,58,2},{0,20,0},{160,204,58},{139,180,51},{118,156,42},{97,132,33},{77,108,22},{57,86,7},{29,58,0},{0,20,0}, +{136,202,239},{120,178,211},{104,155,184},{87,132,157},{69,108,131},{52,85,104},{28,57,72},{0,16,30},{138,201,226},{122,177,200},{106,154,174},{89,131,149},{71,108,124},{53,84,98},{28,56,67},{0,16,26},{141,200,214},{124,177,189},{108,154,165},{90,131,140},{72,108,116},{53,84,91},{28,56,62},{0,16,23},{144,199,203},{126,176,180},{110,153,156},{91,130,133},{73,107,110},{54,84,87},{29,56,58},{0,16,19}, +{146,199,192},{128,176,170},{111,153,148},{92,130,126},{74,107,103},{55,84,82},{29,56,54},{0,16,15},{148,198,181},{129,175,160},{112,152,139},{93,129,118},{75,106,97},{55,83,76},{30,56,50},{0,15,11},{149,198,169},{130,174,149},{113,152,130},{94,129,110},{75,106,90},{55,83,70},{30,56,45},{0,15,6},{150,197,157},{131,173,138},{114,151,121},{95,128,102},{76,106,83},{56,83,64},{30,56,40},{0,16,2}, +{152,196,145},{132,173,128},{114,150,112},{95,128,94},{76,106,77},{56,83,58},{30,56,35},{0,16,0},{154,195,134},{134,172,118},{115,149,102},{96,127,86},{76,105,70},{57,82,52},{30,55,30},{0,15,0},{155,195,123},{135,172,108},{115,149,93},{96,127,78},{76,105,62},{57,82,46},{30,55,24},{0,15,0},{157,195,110},{136,171,96},{116,148,83},{97,126,69},{77,104,55},{58,82,40},{30,55,18},{0,15,0}, +{157,195,96},{137,171,84},{117,148,72},{97,126,60},{77,104,46},{58,82,31},{30,55,11},{0,15,0},{158,194,83},{138,171,72},{118,147,60},{98,125,50},{78,103,37},{58,81,23},{30,54,3},{0,15,0},{159,194,70},{139,171,61},{118,147,51},{98,125,41},{78,103,29},{58,81,15},{30,54,1},{0,15,0},{160,193,58},{140,170,50},{118,147,41},{98,125,32},{78,103,21},{58,81,6},{30,54,0},{0,15,0}, +{139,190,231},{122,168,203},{106,146,177},{88,124,152},{71,102,126},{53,79,101},{30,52,70},{0,11,28},{142,189,218},{124,168,192},{108,145,168},{90,123,143},{73,101,119},{54,79,95},{31,52,65},{0,10,24},{144,189,206},{126,168,182},{109,145,159},{92,123,135},{74,101,112},{55,79,88},{31,52,60},{0,10,21},{146,188,196},{128,167,173},{111,144,150},{93,122,128},{75,100,106},{56,78,84},{31,51,56},{0,10,17}, +{148,188,185},{129,167,164},{113,144,142},{94,122,121},{76,100,100},{57,78,79},{31,51,52},{0,10,13},{150,187,174},{131,166,154},{114,143,134},{95,121,115},{76,100,94},{56,78,73},{32,52,48},{0,10,8},{151,187,163},{132,165,144},{114,143,126},{95,121,107},{76,100,87},{56,78,67},{32,52,43},{0,10,4},{152,186,152},{133,164,134},{115,142,117},{96,120,99},{77,99,80},{57,78,62},{31,51,38},{0,10,1}, +{153,186,141},{134,164,124},{115,142,109},{96,120,91},{77,99,74},{57,78,56},{31,51,33},{0,10,0},{154,185,131},{135,163,115},{116,141,100},{97,119,84},{77,98,67},{58,77,50},{32,51,28},{0,9,0},{155,185,120},{136,163,105},{116,141,91},{97,119,76},{77,98,60},{58,77,44},{32,51,22},{0,9,0},{157,184,108},{137,162,94},{117,140,81},{98,119,67},{78,98,53},{58,77,38},{32,51,16},{0,10,0}, +{158,184,95},{138,162,82},{118,140,71},{98,119,58},{78,98,45},{58,77,30},{32,51,9},{0,10,0},{159,183,82},{139,162,70},{119,139,59},{99,118,49},{78,97,36},{58,76,21},{32,51,3},{0,9,0},{159,183,70},{139,162,60},{119,139,50},{99,118,40},{78,97,28},{58,76,13},{32,51,1},{0,9,0},{160,183,58},{140,161,49},{119,139,40},{99,118,32},{79,97,20},{59,76,5},{32,50,0},{0,9,0}, +{142,180,223},{124,159,197},{109,138,173},{91,118,148},{74,96,122},{55,75,97},{33,48,66},{1,5,25},{145,179,211},{127,158,187},{110,137,164},{93,117,139},{75,95,115},{56,75,91},{33,48,62},{0,5,21},{147,179,200},{129,158,177},{111,137,155},{93,117,131},{75,95,108},{56,75,85},{33,48,58},{0,5,17},{148,178,190},{130,158,168},{113,137,146},{95,116,124},{76,95,102},{57,74,81},{33,47,54},{0,5,13}, +{149,178,179},{131,158,160},{114,137,138},{95,116,117},{77,95,97},{58,74,76},{33,47,50},{0,5,9},{151,178,169},{132,157,150},{115,136,130},{96,115,111},{77,94,91},{58,74,70},{34,48,45},{0,5,4},{152,178,159},{133,156,140},{115,136,122},{96,115,103},{77,94,84},{58,74,64},{34,48,40},{0,5,2},{153,177,148},{134,155,130},{116,135,113},{97,114,96},{78,94,77},{59,73,59},{33,47,36},{0,6,0}, +{154,176,137},{135,155,120},{116,135,105},{98,114,89},{78,94,71},{59,73,54},{33,47,31},{0,6,0},{155,175,127},{136,154,111},{117,134,96},{99,114,82},{79,93,65},{59,73,48},{33,47,26},{0,5,0},{156,175,116},{137,154,102},{117,134,88},{99,114,74},{79,93,58},{59,73,42},{33,47,20},{0,5,0},{158,175,105},{138,153,92},{118,133,79},{99,113,65},{79,93,51},{60,73,36},{33,47,14},{0,5,0}, +{159,175,92},{138,153,80},{119,133,69},{99,113,56},{79,93,43},{60,73,28},{33,47,8},{0,5,0},{160,174,80},{139,153,69},{119,132,57},{99,112,47},{79,92,35},{60,72,19},{33,47,3},{0,5,0},{160,174,68},{140,153,59},{119,132,49},{99,112,39},{79,92,27},{60,72,12},{33,47,1},{0,5,0},{160,173,58},{141,152,48},{120,132,41},{100,112,31},{80,92,19},{60,72,4},{33,46,0},{0,5,0}, +{144,169,215},{127,150,190},{110,130,167},{94,110,143},{75,90,118},{57,70,93},{34,44,63},{1,1,22},{146,168,204},{129,149,181},{112,130,159},{95,110,135},{76,90,111},{58,70,88},{34,44,59},{0,1,18},{148,168,193},{131,149,172},{113,130,150},{95,110,127},{76,90,104},{58,70,82},{34,44,55},{0,1,14},{150,168,184},{132,148,163},{114,129,142},{96,109,120},{77,89,99},{59,69,78},{35,43,51},{0,1,10}, +{151,168,174},{133,148,155},{115,129,134},{97,109,113},{77,89,94},{59,69,73},{35,43,47},{0,1,6},{153,167,164},{134,148,145},{115,128,126},{97,109,107},{78,89,88},{59,69,67},{35,44,42},{0,1,2},{153,167,154},{134,147,136},{116,128,118},{98,109,100},{78,89,81},{59,69,61},{35,44,37},{0,1,0},{154,166,143},{135,147,127},{117,127,110},{98,108,93},{79,89,74},{59,68,56},{35,43,33},{0,2,0}, +{155,166,133},{136,147,117},{117,127,102},{98,108,86},{79,89,68},{59,68,51},{35,43,29},{0,2,0},{156,165,124},{137,146,108},{118,127,93},{99,107,79},{80,88,62},{60,68,46},{35,43,24},{0,2,0},{156,165,113},{138,146,99},{118,127,85},{99,107,71},{80,88,56},{60,68,40},{35,43,18},{0,2,0},{158,164,102},{139,145,89},{119,126,76},{99,107,63},{80,88,49},{60,68,34},{34,43,12},{0,2,0}, +{159,164,89},{139,145,78},{119,126,67},{99,107,55},{80,88,42},{60,68,26},{34,43,8},{0,2,0},{160,164,78},{140,144,67},{119,125,56},{99,106,46},{80,87,34},{60,67,18},{34,43,3},{0,2,0},{160,164,68},{141,144,58},{119,125,48},{99,106,38},{80,87,26},{60,67,11},{34,43,1},{0,2,0},{161,163,57},{142,144,48},{120,125,40},{100,105,30},{80,87,18},{61,67,4},{34,42,0},{0,2,0}, +{146,158,208},{129,140,184},{112,122,161},{95,103,137},{77,84,114},{59,64,89},{36,38,61},{1,0,20},{148,158,197},{131,139,175},{114,121,153},{96,103,130},{78,84,107},{59,64,84},{36,39,57},{1,1,15},{150,158,187},{132,139,166},{115,121,144},{97,103,123},{78,84,101},{59,64,79},{36,39,52},{1,1,10},{151,158,178},{134,138,157},{116,121,137},{97,102,116},{79,83,96},{60,64,75},{36,38,48},{1,1,6}, +{152,158,168},{135,138,149},{116,121,130},{98,102,110},{79,83,91},{60,64,70},{36,38,44},{1,1,3},{154,157,159},{136,138,139},{117,120,122},{99,102,103},{79,83,85},{60,63,65},{36,39,40},{1,1,1},{154,157,149},{136,138,131},{117,120,114},{99,102,96},{79,83,79},{60,63,59},{36,39,35},{0,1,0},{155,156,139},{137,137,122},{118,120,106},{99,101,89},{80,83,72},{60,63,54},{36,39,31},{0,1,0}, +{156,156,129},{137,137,113},{118,120,98},{99,101,83},{80,83,66},{60,63,49},{36,39,27},{0,1,0},{157,155,120},{138,136,105},{118,119,91},{99,100,76},{80,82,60},{61,63,44},{36,39,22},{0,1,0},{158,155,110},{138,136,96},{118,119,83},{99,100,69},{80,82,54},{61,63,38},{36,39,16},{0,1,0},{159,154,100},{139,136,87},{119,118,74},{100,100,61},{81,82,47},{61,63,32},{36,39,10},{0,1,0}, +{160,154,87},{140,136,76},{119,118,65},{100,100,53},{81,82,40},{61,63,24},{36,39,6},{0,1,0},{161,154,76},{141,135,66},{120,117,55},{100,99,44},{81,81,32},{61,62,16},{35,39,2},{0,1,0},{161,154,67},{141,135,57},{120,117,47},{100,99,37},{81,81,24},{61,62,10},{35,39,1},{0,1,0},{161,153,56},{141,135,48},{121,117,39},{100,99,29},{81,81,16},{61,62,3},{35,38,0},{0,1,0}, +{148,147,200},{131,130,178},{113,114,155},{96,95,132},{78,78,110},{59,59,86},{37,33,58},{1,0,17},{150,147,190},{133,130,169},{115,113,147},{97,95,125},{79,78,104},{60,58,81},{37,34,54},{1,0,12},{152,147,181},{134,130,160},{116,113,139},{98,95,118},{79,78,98},{61,58,76},{37,34,49},{1,0,7},{153,147,172},{135,129,151},{117,112,132},{98,95,112},{80,77,93},{61,58,72},{37,33,45},{1,0,3}, +{154,147,163},{135,129,143},{117,112,125},{98,95,107},{80,77,88},{61,58,67},{37,33,41},{1,0,1},{155,146,154},{136,129,134},{118,112,118},{99,94,100},{80,77,82},{61,58,62},{37,34,37},{1,0,0},{155,146,144},{137,129,126},{118,112,111},{99,94,93},{80,77,76},{61,58,57},{37,34,33},{0,0,0},{156,145,135},{137,129,118},{119,112,103},{99,94,86},{80,77,70},{61,58,52},{36,34,29},{0,0,0}, +{157,145,125},{137,129,110},{119,112,95},{99,94,80},{80,77,64},{61,58,47},{36,34,25},{0,0,0},{158,144,116},{138,128,102},{119,111,88},{99,94,73},{80,76,58},{62,58,41},{36,34,20},{0,0,0},{158,144,107},{138,128,93},{119,111,80},{99,94,66},{80,76,52},{62,58,35},{36,34,14},{0,0,0},{159,144,97},{139,127,84},{120,110,72},{100,93,59},{81,76,45},{62,58,29},{36,34,8},{0,0,0}, +{160,144,85},{140,127,74},{120,110,63},{100,93,51},{81,76,38},{62,58,22},{36,34,4},{0,0,0},{161,144,74},{141,127,64},{121,109,53},{101,93,42},{82,75,30},{62,57,15},{36,34,1},{0,0,0},{161,144,66},{141,127,56},{121,109,46},{101,93,35},{82,75,22},{62,57,9},{36,34,1},{0,0,0},{161,144,56},{141,126,48},{121,109,38},{101,93,28},{82,75,15},{62,57,3},{35,34,0},{0,0,0}, +{150,137,193},{132,121,172},{114,106,150},{97,88,128},{79,71,106},{60,53,83},{38,28,55},{0,0,13},{152,137,183},{134,121,163},{116,105,142},{98,88,121},{80,71,100},{61,53,78},{38,28,51},{1,0,8},{153,137,174},{135,121,154},{117,105,134},{99,88,114},{80,71,94},{62,53,73},{38,28,47},{1,0,4},{154,137,166},{136,120,146},{118,105,127},{99,88,108},{81,71,90},{62,53,69},{38,28,43},{1,0,2}, +{155,137,158},{136,120,138},{118,105,120},{99,88,103},{81,71,85},{62,53,64},{38,28,39},{1,0,0},{156,136,149},{137,120,130},{119,104,114},{100,87,97},{81,70,79},{62,53,59},{38,29,35},{0,0,0},{156,136,139},{137,120,122},{119,104,107},{100,87,90},{81,70,73},{62,53,54},{38,29,31},{0,0,0},{157,136,130},{138,120,114},{120,104,99},{100,87,83},{81,70,67},{62,53,49},{37,29,26},{0,0,0}, +{158,136,121},{138,120,106},{120,104,92},{100,87,77},{81,70,61},{62,53,44},{37,29,22},{0,0,0},{159,135,112},{138,119,98},{120,103,85},{100,87,70},{81,70,55},{62,53,39},{37,29,17},{0,0,0},{159,135,103},{139,119,90},{120,103,77},{100,87,64},{81,70,49},{62,53,33},{37,29,11},{0,0,0},{160,135,94},{140,119,82},{121,103,70},{101,86,57},{82,70,43},{62,53,27},{37,29,5},{0,0,0}, +{161,135,83},{140,119,72},{121,103,61},{101,86,49},{82,70,37},{62,53,21},{37,29,3},{0,0,0},{161,135,73},{141,118,62},{121,102,52},{101,86,41},{82,69,29},{63,52,14},{36,30,1},{0,0,0},{161,135,65},{141,118,54},{121,102,45},{101,86,34},{82,69,21},{63,52,8},{36,30,1},{0,0,0},{162,135,56},{142,118,47},{121,102,37},{101,86,27},{82,69,14},{63,52,2},{36,30,0},{0,0,0}, +{152,127,187},{134,111,166},{116,97,145},{99,82,124},{80,65,102},{62,47,79},{39,21,53},{0,0,9},{153,127,177},{135,111,157},{117,97,138},{100,82,117},{81,65,96},{62,47,74},{38,22,49},{0,0,5},{154,127,168},{136,111,148},{118,97,130},{100,82,110},{81,65,90},{62,47,70},{38,22,45},{0,0,1},{155,127,160},{137,111,141},{119,97,123},{100,82,104},{82,65,86},{63,47,66},{38,23,41},{0,0,1}, +{156,127,152},{137,111,134},{119,97,116},{100,82,99},{82,65,81},{63,47,62},{38,23,37},{0,0,0},{157,126,144},{138,111,126},{119,96,110},{101,81,93},{82,64,75},{63,47,57},{38,23,33},{0,0,0},{158,126,135},{138,111,118},{119,96,103},{101,81,87},{82,64,69},{63,47,52},{38,23,29},{0,0,0},{158,126,126},{139,110,110},{120,96,95},{101,81,80},{82,64,64},{63,47,47},{38,24,24},{0,0,0}, +{158,126,117},{139,110,102},{120,96,89},{101,81,74},{82,64,58},{63,47,42},{38,24,20},{0,0,0},{159,125,109},{139,110,95},{120,96,82},{101,81,68},{82,64,53},{62,47,37},{38,25,15},{0,0,0},{159,125,100},{140,110,88},{120,96,75},{101,81,62},{82,64,47},{62,47,31},{38,25,9},{0,0,0},{160,125,91},{140,110,80},{121,96,68},{101,80,55},{82,64,41},{62,47,25},{38,25,4},{0,0,0}, +{161,125,81},{140,110,70},{121,96,59},{101,80,47},{82,64,35},{62,47,19},{38,25,2},{0,0,0},{161,125,71},{141,109,60},{121,95,50},{101,80,39},{82,63,27},{63,47,12},{37,26,1},{0,0,0},{161,125,63},{141,109,52},{121,95,43},{101,80,32},{82,63,19},{63,47,6},{37,26,1},{0,0,0},{162,125,55},{142,109,46},{121,95,36},{101,80,26},{82,63,13},{63,47,2},{36,26,0},{0,0,0}, +{153,117,180},{135,103,159},{117,89,140},{100,75,119},{81,58,98},{63,40,76},{39,14,50},{0,0,5},{154,117,171},{136,103,151},{118,89,133},{101,75,113},{82,58,92},{63,41,71},{39,15,46},{0,0,3},{156,117,162},{137,103,143},{119,89,125},{101,75,106},{82,58,86},{63,41,67},{39,16,42},{0,0,0},{157,117,154},{138,103,136},{119,89,119},{101,75,100},{82,58,82},{63,41,63},{39,17,38},{0,0,0}, +{157,117,146},{138,103,129},{119,89,112},{101,75,95},{82,58,77},{63,41,59},{39,17,35},{0,0,0},{158,116,139},{139,103,122},{120,89,106},{101,74,89},{83,57,71},{64,41,54},{39,18,31},{0,0,0},{158,116,131},{139,103,114},{120,89,99},{101,74,84},{83,57,66},{64,41,49},{39,18,27},{0,0,0},{159,116,122},{139,102,106},{121,88,92},{101,74,78},{82,58,61},{63,41,45},{39,19,23},{0,0,0}, +{159,116,113},{139,102,99},{121,88,86},{101,74,72},{82,58,57},{63,41,41},{39,19,18},{0,0,0},{159,116,106},{140,102,92},{121,88,79},{101,74,65},{82,58,52},{63,42,36},{39,20,13},{0,0,0},{159,116,98},{140,102,85},{121,88,73},{101,74,59},{82,58,46},{63,42,30},{39,20,8},{0,0,0},{160,116,89},{141,102,77},{121,88,66},{101,73,53},{82,57,40},{63,42,24},{38,20,4},{0,0,0}, +{161,116,79},{141,102,69},{121,88,58},{101,73,46},{82,57,33},{63,42,17},{38,20,2},{0,0,0},{162,115,70},{141,101,59},{121,88,49},{102,73,38},{83,57,26},{63,42,10},{37,21,0},{0,0,0},{162,115,62},{141,101,51},{121,88,42},{102,73,31},{83,57,18},{63,42,5},{37,21,0},{0,0,0},{161,115,54},{142,101,45},{122,88,35},{102,73,25},{83,57,12},{63,42,2},{37,21,0},{0,0,0}, +{154,106,173},{135,93,153},{118,80,134},{100,66,114},{82,51,94},{63,33,73},{40,9,47},{0,0,3},{155,106,164},{137,94,145},{119,80,128},{101,67,108},{83,51,89},{63,34,68},{40,10,43},{0,0,1},{156,106,156},{138,94,138},{119,80,120},{101,67,101},{83,51,83},{63,34,64},{40,10,39},{0,0,0},{157,106,149},{138,94,131},{120,80,114},{102,66,97},{83,51,79},{63,34,60},{40,11,35},{0,0,0}, +{158,106,141},{139,94,124},{120,80,108},{102,66,92},{83,51,74},{63,34,56},{40,11,32},{0,0,0},{158,106,134},{139,94,117},{120,80,102},{102,66,86},{83,51,68},{64,35,52},{40,12,28},{0,0,0},{158,106,126},{139,94,110},{120,80,96},{102,66,81},{83,51,63},{64,35,47},{40,12,24},{0,0,0},{159,106,118},{139,93,103},{121,80,89},{101,66,75},{82,51,58},{63,35,42},{39,13,20},{0,0,0}, +{159,106,110},{139,93,96},{121,80,83},{101,66,69},{82,51,54},{63,35,38},{39,13,16},{0,0,0},{159,106,103},{140,93,89},{121,80,76},{102,66,62},{83,52,49},{63,36,34},{39,14,11},{0,0,0},{159,106,95},{140,93,82},{121,80,70},{102,66,57},{83,52,44},{63,36,28},{39,14,7},{0,0,0},{160,106,86},{141,93,74},{121,80,63},{101,66,51},{82,51,38},{63,36,22},{38,14,3},{0,0,0}, +{161,106,77},{141,93,66},{121,80,56},{101,66,44},{82,51,31},{63,36,15},{38,14,1},{0,0,0},{162,106,68},{141,92,58},{121,80,47},{102,66,37},{83,51,24},{63,36,8},{37,15,0},{0,0,0},{162,106,60},{141,92,50},{121,80,40},{102,66,30},{83,51,17},{63,36,5},{37,15,0},{0,0,0},{161,105,53},{142,92,44},{122,80,35},{102,66,24},{83,51,11},{63,36,2},{37,15,0},{0,0,0}, +{155,96,167},{136,83,147},{119,71,128},{101,57,109},{83,42,90},{64,25,70},{41,3,45},{0,0,1},{156,95,158},{138,84,139},{120,71,122},{102,58,103},{84,43,85},{64,26,65},{40,4,41},{0,0,0},{157,95,150},{139,84,132},{120,71,115},{102,58,97},{84,43,79},{64,27,61},{40,4,37},{0,0,0},{158,95,143},{139,84,126},{121,71,110},{103,58,93},{84,43,75},{64,27,57},{40,5,33},{0,0,0}, +{159,95,136},{139,84,119},{121,71,104},{103,58,88},{84,43,71},{64,27,54},{40,5,30},{0,0,0},{159,96,129},{140,84,113},{121,71,98},{103,58,82},{84,44,66},{64,28,50},{40,5,26},{0,0,0},{159,96,121},{140,84,106},{121,71,92},{103,58,77},{84,44,61},{64,28,45},{40,5,22},{0,0,0},{160,96,114},{140,84,99},{121,71,86},{102,58,72},{83,44,56},{64,29,40},{40,6,18},{0,0,0}, +{160,96,107},{140,84,93},{121,71,80},{102,58,66},{83,44,52},{64,29,36},{40,6,14},{0,0,0},{160,96,100},{140,83,86},{121,72,74},{103,58,60},{84,45,47},{64,29,32},{39,7,9},{0,0,0},{160,96,92},{140,83,79},{121,72,68},{103,58,55},{84,45,42},{64,29,26},{39,7,5},{0,0,0},{161,95,83},{141,83,72},{121,71,61},{102,58,49},{83,45,36},{63,30,20},{39,8,3},{0,0,0}, +{161,95,75},{141,83,64},{121,71,54},{102,58,42},{83,45,29},{63,30,14},{39,8,1},{0,0,0},{161,96,66},{142,83,56},{122,71,46},{102,58,35},{83,45,22},{63,30,7},{38,8,0},{0,0,0},{161,96,59},{142,83,49},{122,71,39},{102,58,29},{83,45,15},{63,30,4},{38,8,0},{0,0,0},{162,95,52},{142,83,43},{123,71,34},{103,58,23},{84,45,9},{63,30,1},{37,9,0},{0,0,0}, +{155,83,161},{137,72,141},{119,60,123},{101,47,105},{83,32,86},{64,16,67},{41,1,42},{0,0,0},{157,83,153},{138,72,134},{120,61,117},{102,48,99},{84,33,81},{64,16,62},{40,2,38},{0,0,0},{157,83,145},{139,72,127},{120,61,110},{102,48,93},{84,33,76},{64,17,58},{40,2,34},{0,0,0},{158,83,138},{140,72,121},{121,61,106},{103,48,89},{84,34,72},{64,17,54},{40,2,30},{0,0,0}, +{159,83,131},{140,72,115},{121,61,100},{103,48,84},{84,34,68},{64,17,51},{40,2,27},{0,0,0},{159,84,124},{140,73,109},{121,61,94},{103,49,79},{84,35,63},{64,18,47},{40,2,23},{0,0,0},{159,84,117},{140,73,102},{121,61,88},{103,49,74},{84,35,58},{64,18,42},{40,2,19},{0,0,0},{160,84,110},{140,73,96},{121,62,83},{103,49,69},{84,36,53},{64,19,37},{40,2,15},{0,0,0}, +{160,84,103},{140,73,90},{121,62,77},{103,49,63},{84,36,49},{64,19,33},{40,3,11},{0,0,0},{160,84,96},{140,73,83},{121,62,71},{103,49,57},{84,36,44},{64,19,29},{39,4,7},{0,0,0},{160,84,89},{141,73,76},{121,62,65},{103,49,52},{84,36,39},{64,20,24},{39,4,4},{0,0,0},{161,84,81},{141,73,70},{121,62,58},{102,50,46},{83,37,33},{63,21,18},{39,4,2},{0,0,0}, +{161,84,73},{141,73,62},{121,62,51},{102,50,40},{83,37,27},{63,21,13},{39,4,1},{0,0,0},{161,84,65},{142,73,55},{122,62,45},{102,50,34},{83,37,21},{63,21,6},{38,4,0},{0,0,0},{161,84,58},{142,73,48},{122,62,38},{102,50,28},{83,37,14},{63,21,3},{38,4,0},{0,0,0},{162,84,52},{143,73,42},{123,62,33},{103,50,22},{84,37,8},{63,22,1},{37,5,0},{0,0,0}, +{156,70,154},{138,60,136},{120,48,118},{102,35,101},{84,20,82},{65,5,63},{41,0,39},{0,0,0},{158,70,147},{139,60,129},{121,49,112},{103,36,95},{84,22,77},{65,6,59},{40,0,35},{0,0,0},{159,70,139},{140,60,122},{121,49,106},{103,37,89},{84,23,72},{65,6,55},{40,0,32},{0,0,0},{160,71,132},{140,60,116},{122,49,102},{104,38,85},{85,23,68},{65,6,51},{40,0,28},{0,0,0}, +{160,71,126},{140,60,111},{122,49,96},{104,38,80},{85,23,64},{65,6,47},{40,0,25},{0,0,0},{160,72,120},{140,61,105},{121,50,90},{103,39,75},{84,24,60},{65,7,43},{40,0,21},{0,0,0},{160,72,113},{140,61,98},{121,50,84},{103,39,70},{84,25,55},{65,7,39},{40,0,17},{0,0,0},{160,72,106},{140,62,92},{122,50,79},{103,39,65},{84,26,50},{65,8,35},{40,0,12},{0,0,0}, +{160,72,99},{140,62,86},{122,50,74},{103,39,60},{84,27,46},{65,9,31},{40,0,8},{0,0,0},{161,72,92},{141,62,80},{122,51,68},{103,40,55},{84,27,42},{64,9,27},{40,0,5},{0,0,0},{161,72,86},{141,62,74},{122,51,62},{103,40,50},{84,27,37},{64,10,22},{40,0,3},{0,0,0},{161,72,79},{142,62,68},{122,51,56},{103,40,44},{84,28,31},{64,11,16},{39,1,1},{0,0,0}, +{161,72,71},{142,62,60},{122,51,49},{103,40,38},{84,28,25},{64,11,11},{39,1,1},{0,0,0},{162,72,63},{142,62,53},{122,51,43},{103,41,32},{84,28,19},{64,12,5},{38,1,0},{0,0,0},{162,72,57},{142,62,47},{122,51,37},{103,41,26},{84,28,13},{64,12,2},{38,1,0},{0,0,0},{162,72,51},{143,62,41},{122,52,32},{102,41,21},{83,29,7},{63,13,0},{38,1,0},{0,0,0}, +{157,53,148},{138,42,130},{121,29,113},{102,18,96},{84,10,78},{65,2,60},{40,0,36},{0,0,0},{158,53,141},{139,43,124},{121,31,107},{103,20,91},{84,11,74},{65,3,56},{40,0,33},{0,0,0},{159,53,133},{140,43,117},{121,32,101},{103,20,86},{84,12,69},{65,3,52},{40,0,30},{0,0,0},{160,53,127},{140,44,111},{122,33,97},{104,21,82},{85,12,65},{65,3,48},{40,0,26},{0,0,0}, +{160,54,121},{140,44,106},{122,34,92},{104,22,77},{85,12,61},{65,3,45},{40,0,22},{0,0,0},{160,55,115},{140,45,101},{122,35,87},{103,23,73},{84,12,57},{65,3,41},{40,0,18},{0,0,0},{160,56,109},{140,46,95},{122,36,82},{103,24,68},{84,13,53},{65,3,37},{40,0,15},{0,0,0},{160,56,102},{140,47,89},{122,36,77},{103,25,63},{84,13,48},{65,4,33},{40,0,11},{0,0,0}, +{160,56,96},{140,47,83},{122,37,72},{103,26,58},{84,14,44},{65,4,29},{40,0,7},{0,0,0},{161,57,89},{141,47,78},{122,37,66},{103,27,53},{84,15,40},{64,4,25},{40,0,5},{0,0,0},{161,57,83},{141,47,72},{122,38,60},{103,27,48},{84,15,35},{64,5,20},{40,0,3},{0,0,0},{161,57,77},{142,48,66},{122,39,54},{103,27,42},{84,16,29},{64,5,14},{39,1,1},{0,0,0}, +{161,57,69},{142,49,59},{122,39,48},{103,28,37},{84,16,24},{64,5,9},{39,1,1},{0,0,0},{162,58,62},{142,49,52},{122,40,42},{103,29,31},{84,16,18},{64,6,4},{38,1,0},{0,0,0},{162,58,56},{142,49,46},{122,40,36},{103,29,25},{84,16,12},{64,6,2},{38,1,0},{0,0,0},{162,58,50},{143,49,41},{122,40,31},{102,29,20},{83,17,6},{63,6,0},{38,1,0},{0,0,0}, +{158,35,142},{139,25,125},{122,10,108},{103,1,91},{85,0,74},{65,0,57},{39,0,33},{0,0,0},{159,35,135},{140,26,119},{122,13,103},{103,2,87},{85,0,70},{65,0,53},{39,0,30},{0,0,0},{160,35,128},{140,27,112},{122,15,97},{103,3,82},{85,0,66},{65,0,50},{39,0,27},{0,0,0},{160,37,122},{141,28,107},{122,17,93},{103,5,78},{85,0,62},{65,0,46},{39,0,23},{0,0,0}, +{160,38,117},{141,28,102},{122,18,88},{103,6,74},{85,0,58},{65,0,42},{39,0,19},{0,0,0},{160,39,111},{140,30,97},{122,19,84},{103,7,70},{85,0,54},{65,0,38},{39,0,15},{0,0,0},{160,40,105},{140,31,92},{122,21,79},{103,9,65},{85,0,50},{65,0,34},{39,0,12},{0,0,0},{160,41,98},{141,32,86},{122,22,74},{104,10,60},{85,1,46},{65,0,30},{39,0,9},{0,0,0}, +{160,41,92},{141,32,80},{122,23,69},{104,12,56},{85,1,42},{65,0,26},{39,0,6},{0,0,0},{161,42,86},{141,33,75},{122,24,64},{103,13,51},{84,2,38},{64,0,22},{38,0,4},{0,0,0},{161,42,80},{141,33,69},{122,25,58},{103,14,46},{84,2,33},{64,0,17},{38,0,2},{0,0,0},{161,43,74},{142,34,63},{122,26,52},{103,15,40},{84,3,27},{64,0,11},{37,0,1},{0,0,0}, +{161,43,67},{142,35,57},{122,27,47},{103,16,35},{84,3,22},{64,0,7},{37,0,1},{0,0,0},{162,44,61},{142,36,51},{122,28,41},{103,17,30},{84,4,16},{64,0,3},{37,0,0},{0,0,0},{162,44,55},{142,36,45},{122,28,35},{103,17,24},{84,4,11},{64,0,2},{37,0,0},{0,0,0},{163,44,49},{142,37,40},{123,28,30},{103,17,19},{84,4,5},{64,0,0},{36,0,0},{0,0,0}, +{76,202,245},{68,178,216},{56,155,188},{45,132,161},{32,108,134},{17,86,107},{5,58,75},{0,19,34},{82,201,232},{74,177,204},{62,154,178},{50,132,152},{35,108,127},{19,85,101},{5,57,70},{0,18,30},{89,200,219},{80,176,193},{67,154,169},{54,132,144},{38,108,119},{20,85,94},{5,57,65},{0,18,27},{94,199,207},{82,176,184},{70,153,160},{56,131,137},{41,108,113},{22,85,90},{6,57,61},{0,18,23}, +{98,199,196},{85,176,174},{72,153,152},{59,131,129},{43,108,107},{24,85,85},{6,57,57},{0,18,20},{100,198,185},{88,175,164},{74,152,142},{61,130,122},{44,107,101},{25,84,79},{7,57,53},{0,18,14},{102,197,173},{90,174,153},{76,152,134},{62,130,114},{45,107,94},{27,84,74},{8,57,48},{0,18,10},{104,197,162},{91,173,143},{78,151,125},{63,129,106},{47,106,87},{29,83,67},{8,56,44},{0,18,6}, +{107,196,151},{93,173,133},{80,150,116},{65,129,98},{48,106,80},{30,83,61},{8,56,39},{0,18,3},{109,195,139},{96,172,123},{81,149,107},{66,128,91},{49,105,73},{31,83,56},{9,56,34},{0,17,1},{111,195,128},{98,172,112},{82,149,97},{67,128,83},{49,105,66},{31,83,50},{9,56,28},{0,17,0},{113,194,115},{99,171,101},{84,149,87},{68,127,74},{51,105,59},{33,82,43},{9,56,22},{0,17,0}, +{115,194,102},{100,171,90},{85,149,77},{68,127,64},{52,105,51},{33,82,36},{9,56,15},{0,17,0},{118,194,89},{101,170,78},{86,148,66},{69,126,55},{53,104,43},{34,82,29},{10,56,8},{0,17,0},{119,194,77},{102,170,68},{87,148,58},{69,126,47},{53,104,35},{34,82,21},{10,56,4},{0,17,0},{121,193,66},{104,170,57},{88,148,48},{70,126,39},{53,104,28},{34,82,13},{9,55,1},{0,16,0}, +{85,191,237},{76,168,209},{64,147,182},{52,125,156},{38,103,129},{23,81,103},{7,53,72},{0,13,31},{91,190,224},{81,167,198},{68,146,172},{55,125,148},{41,103,123},{24,80,97},{8,53,67},{0,13,27},{96,190,212},{85,167,187},{72,146,164},{59,125,140},{43,103,115},{26,80,91},{8,53,63},{0,13,24},{100,189,201},{88,167,178},{75,145,155},{61,124,133},{45,102,109},{27,80,87},{9,53,59},{0,12,20}, +{103,188,190},{90,167,168},{77,145,147},{63,124,125},{46,102,103},{29,80,82},{9,53,55},{0,12,17},{105,187,179},{92,166,159},{79,144,138},{64,123,118},{48,101,97},{30,79,76},{10,53,50},{0,12,11},{107,187,168},{94,165,148},{80,144,130},{65,123,110},{49,101,91},{31,79,71},{10,53,45},{0,12,7},{109,186,158},{95,164,139},{82,143,121},{66,122,103},{50,101,84},{33,79,65},{10,52,41},{0,12,4}, +{112,186,147},{97,164,129},{83,143,112},{68,122,95},{51,101,77},{34,79,59},{10,52,37},{0,12,1},{114,185,136},{99,163,119},{84,142,104},{69,121,88},{52,100,71},{35,78,54},{11,52,32},{0,11,0},{115,185,125},{101,163,109},{85,142,95},{70,121,80},{53,100,64},{35,78,48},{11,52,26},{0,11,0},{117,184,112},{103,162,99},{87,142,85},{71,120,71},{54,99,57},{36,78,41},{11,52,20},{0,11,0}, +{119,184,100},{104,162,88},{88,142,75},{71,120,62},{54,99,49},{36,78,34},{11,52,13},{0,11,0},{121,183,87},{105,161,76},{89,141,64},{72,120,53},{55,99,41},{36,77,27},{11,52,6},{0,11,0},{122,183,76},{105,161,66},{89,141,56},{72,120,46},{55,99,33},{36,77,19},{11,52,3},{0,11,0},{123,183,65},{107,161,56},{90,141,48},{73,119,38},{56,99,26},{37,77,11},{11,51,1},{0,11,0}, +{94,180,229},{84,159,201},{72,139,175},{59,118,150},{44,97,125},{28,75,100},{10,49,69},{0,7,29},{99,179,216},{87,158,191},{75,138,166},{61,117,143},{46,97,119},{30,75,94},{10,49,65},{0,7,25},{103,179,205},{91,158,181},{77,138,158},{63,117,135},{48,97,112},{31,75,88},{10,49,61},{0,7,22},{106,178,194},{93,158,171},{79,137,150},{65,116,129},{49,96,106},{33,74,84},{11,49,57},{0,6,18}, +{109,178,183},{94,158,163},{81,137,142},{66,116,121},{50,96,100},{34,74,79},{11,49,53},{0,6,15},{111,177,173},{96,157,153},{83,136,134},{67,115,114},{51,95,94},{34,74,73},{11,49,48},{0,6,9},{113,177,163},{97,157,144},{84,136,126},{68,115,107},{52,95,88},{35,74,68},{11,49,43},{0,6,5},{114,176,153},{99,156,135},{85,135,117},{69,115,100},{53,95,81},{36,74,63},{11,48,39},{0,6,2}, +{116,176,143},{101,155,125},{86,135,109},{71,115,93},{54,95,75},{36,74,57},{11,48,35},{0,6,0},{117,175,133},{102,155,116},{87,134,101},{72,114,86},{54,94,69},{37,73,52},{11,49,30},{0,5,0},{118,175,122},{104,155,107},{88,134,93},{72,114,78},{55,94,62},{37,73,46},{11,49,24},{0,5,0},{120,174,110},{105,154,97},{89,134,83},{73,113,69},{56,93,55},{38,73,40},{11,49,18},{0,5,0}, +{122,174,98},{106,154,86},{90,134,74},{73,113,61},{56,93,47},{38,73,32},{11,49,11},{0,5,0},{123,174,86},{107,153,74},{91,133,63},{74,113,52},{56,93,40},{39,72,25},{11,48,4},{0,5,0},{124,174,75},{107,153,65},{91,133,55},{74,113,45},{57,93,32},{39,72,17},{11,48,2},{0,5,0},{125,173,65},{108,153,56},{92,133,48},{75,113,38},{58,93,25},{40,72,9},{11,48,1},{0,5,0}, +{100,170,221},{89,151,195},{76,132,171},{63,112,146},{48,92,121},{32,71,96},{12,45,66},{0,3,27},{104,170,209},{92,150,185},{79,131,162},{65,111,139},{50,91,115},{33,71,90},{12,45,62},{0,3,23},{107,170,198},{95,150,175},{81,131,154},{66,111,131},{51,91,108},{34,71,85},{12,45,58},{0,3,18},{110,169,188},{97,150,167},{82,130,146},{68,110,125},{52,91,103},{36,70,81},{13,45,54},{0,3,14}, +{112,169,179},{98,150,159},{84,130,138},{69,110,117},{53,91,97},{37,70,77},{13,45,50},{0,3,11},{114,168,169},{99,149,149},{86,129,130},{71,109,110},{54,90,91},{37,70,71},{13,45,46},{0,3,6},{116,168,159},{101,149,140},{87,129,122},{71,109,103},{55,90,85},{38,70,65},{13,45,41},{0,3,3},{117,167,149},{102,148,131},{88,128,114},{72,109,96},{56,90,78},{39,69,60},{13,44,37},{0,3,1}, +{118,167,139},{103,148,121},{88,128,106},{73,109,90},{57,90,72},{40,69,55},{13,44,33},{0,3,0},{119,166,129},{104,147,112},{89,128,98},{74,108,83},{57,89,67},{40,69,50},{14,45,28},{0,2,0},{121,166,118},{106,147,103},{90,128,90},{74,108,75},{57,89,60},{40,69,44},{14,45,22},{0,2,0},{122,165,107},{107,146,94},{91,127,81},{75,107,67},{58,89,53},{41,69,38},{14,45,16},{0,2,0}, +{124,165,96},{107,146,84},{92,127,72},{75,107,59},{58,89,45},{41,69,30},{14,45,10},{0,2,0},{126,165,84},{108,146,73},{93,126,61},{75,107,50},{58,88,38},{41,68,23},{15,44,4},{0,2,0},{126,165,73},{109,146,64},{93,126,53},{76,107,43},{59,88,31},{41,68,15},{15,44,2},{0,2,0},{127,164,64},{110,146,55},{94,126,46},{76,107,36},{60,88,24},{41,68,8},{14,44,1},{0,2,0}, +{106,160,213},{94,143,189},{80,124,166},{67,105,142},{52,86,117},{36,66,92},{13,41,63},{0,0,24},{109,160,202},{96,142,179},{83,124,157},{69,105,135},{54,86,111},{37,66,87},{13,41,59},{0,0,20},{111,160,191},{98,142,170},{84,124,149},{71,105,127},{54,86,104},{38,66,82},{13,41,55},{0,0,15},{113,160,182},{100,142,162},{86,123,142},{72,104,121},{55,85,100},{39,65,78},{14,41,51},{0,0,11}, +{115,160,174},{101,142,154},{87,123,134},{72,104,114},{56,85,94},{40,65,74},{15,41,47},{0,0,7},{117,159,164},{103,141,145},{88,122,126},{73,103,107},{57,85,88},{41,65,68},{15,41,43},{0,0,4},{119,159,154},{103,141,136},{89,122,118},{74,103,100},{58,85,82},{41,65,62},{15,41,38},{0,0,1},{120,158,144},{104,140,127},{90,121,111},{75,103,93},{59,85,75},{41,64,57},{15,40,34},{0,0,0}, +{122,158,134},{105,140,118},{91,121,103},{75,103,87},{59,85,69},{42,64,52},{16,40,30},{0,0,0},{123,157,125},{106,139,109},{92,121,95},{76,102,80},{59,84,64},{42,65,47},{17,41,26},{0,0,0},{123,157,115},{108,139,100},{92,121,87},{76,102,72},{59,84,58},{42,65,41},{17,41,20},{0,0,0},{124,157,104},{109,138,91},{93,120,78},{77,102,65},{60,84,51},{42,64,35},{16,41,14},{0,0,0}, +{126,157,93},{109,138,81},{93,120,69},{77,102,57},{60,84,44},{42,64,28},{16,41,9},{0,0,0},{128,157,81},{110,138,71},{94,119,60},{77,101,49},{60,83,37},{43,64,22},{17,40,3},{0,0,0},{128,157,72},{111,138,63},{94,119,52},{77,101,42},{60,83,30},{43,64,14},{17,40,2},{0,0,0},{129,156,63},{112,138,54},{95,119,45},{78,101,35},{60,83,23},{43,64,7},{16,40,1},{0,0,0}, +{110,150,206},{97,134,183},{84,117,160},{71,98,137},{55,80,113},{39,60,89},{16,35,61},{0,0,21},{113,150,195},{99,133,173},{86,116,151},{72,98,130},{56,80,107},{41,60,84},{17,35,57},{0,0,17},{115,150,185},{101,133,164},{87,116,143},{73,98,122},{57,80,100},{41,60,79},{18,35,53},{0,0,12},{117,150,176},{103,132,156},{89,116,136},{74,97,116},{58,79,96},{42,60,75},{19,36,49},{0,0,8}, +{119,150,168},{104,132,148},{90,116,129},{75,97,110},{58,79,90},{42,60,70},{19,36,45},{0,0,4},{121,150,158},{105,132,140},{91,115,122},{75,97,103},{59,79,84},{42,60,66},{19,36,41},{0,0,2},{121,150,149},{106,132,132},{92,115,114},{75,97,97},{59,79,79},{42,60,60},{19,36,36},{0,0,0},{122,149,140},{107,131,123},{92,114,107},{76,97,90},{60,79,73},{43,60,55},{19,36,32},{0,0,0}, +{124,149,130},{107,131,114},{92,114,99},{77,97,84},{61,79,67},{43,60,50},{19,36,28},{0,0,0},{125,148,121},{108,130,106},{93,113,92},{77,96,77},{61,78,61},{44,60,45},{20,36,24},{0,0,0},{126,148,112},{109,130,98},{94,113,85},{78,96,70},{61,78,55},{44,60,39},{20,36,18},{0,0,0},{127,147,102},{110,129,89},{95,113,76},{79,96,63},{61,78,49},{44,60,33},{19,36,12},{0,0,0}, +{128,147,90},{111,129,79},{95,113,67},{79,96,55},{61,78,42},{44,60,26},{19,36,8},{0,0,0},{129,147,79},{112,129,69},{96,112,58},{79,95,47},{62,77,35},{44,60,20},{20,36,3},{0,0,0},{129,147,71},{112,129,61},{96,112,51},{79,95,40},{62,77,28},{44,60,13},{20,36,1},{0,0,0},{130,147,62},{113,129,52},{97,112,44},{80,95,34},{62,77,21},{44,59,6},{19,36,0},{0,0,0}, +{114,140,199},{100,124,177},{87,109,154},{74,91,132},{58,74,109},{42,55,86},{19,30,58},{0,0,18},{117,140,189},{102,124,167},{89,108,146},{75,91,125},{59,74,103},{43,55,81},{20,30,54},{0,0,14},{119,140,179},{104,124,158},{91,108,138},{75,91,118},{60,74,97},{43,55,76},{20,30,50},{0,0,9},{120,140,170},{106,124,151},{92,108,131},{76,91,112},{61,73,92},{44,55,72},{21,31,46},{0,0,5}, +{121,140,162},{106,124,143},{92,108,124},{77,91,106},{61,73,87},{44,55,67},{21,31,42},{0,0,2},{123,140,153},{107,123,135},{93,107,118},{78,90,100},{61,73,81},{44,55,63},{21,31,38},{0,0,1},{124,140,144},{108,123,127},{94,107,110},{78,90,94},{61,73,76},{44,55,58},{21,31,34},{0,0,0},{124,139,135},{109,123,119},{95,107,103},{79,90,87},{62,73,70},{45,55,53},{22,31,30},{0,0,0}, +{126,139,127},{110,123,111},{95,107,96},{79,90,81},{62,73,64},{45,55,48},{22,31,26},{0,0,0},{127,139,118},{111,122,103},{95,106,89},{79,90,74},{62,72,58},{45,55,43},{22,32,22},{0,0,0},{128,139,109},{111,122,95},{95,106,82},{79,90,68},{62,72,52},{45,55,37},{22,32,16},{0,0,0},{129,138,99},{112,121,86},{96,106,74},{80,89,61},{63,72,46},{45,55,31},{22,31,10},{0,0,0}, +{129,138,88},{113,121,77},{96,106,65},{80,89,53},{63,72,40},{45,55,24},{22,31,6},{0,0,0},{130,138,77},{114,121,67},{97,105,57},{81,89,45},{63,72,33},{45,55,18},{22,32,3},{0,0,0},{130,138,70},{114,121,59},{97,105,50},{81,89,39},{63,72,26},{45,55,11},{22,32,1},{0,0,0},{131,138,62},{114,121,52},{97,105,43},{81,89,33},{63,71,19},{45,54,5},{21,32,0},{0,0,0}, +{117,131,192},{104,115,170},{89,101,149},{75,84,127},{59,67,105},{43,50,83},{22,25,55},{0,0,15},{119,131,182},{105,115,161},{91,101,141},{76,84,120},{60,67,100},{44,50,78},{22,25,51},{0,0,10},{121,131,173},{107,115,153},{92,101,133},{77,84,114},{61,67,94},{45,50,73},{22,25,47},{0,0,6},{122,131,165},{108,115,146},{93,101,127},{78,84,108},{62,67,89},{45,50,69},{23,26,43},{0,0,3}, +{123,131,157},{109,115,138},{94,101,120},{79,84,103},{62,67,84},{45,50,64},{23,26,40},{0,0,1},{124,131,148},{110,115,130},{95,100,114},{79,83,97},{63,67,78},{46,50,60},{23,26,36},{0,0,0},{125,131,139},{110,115,122},{95,100,107},{79,83,91},{63,67,73},{46,50,55},{23,26,32},{0,0,0},{126,130,131},{111,114,115},{96,100,100},{80,83,84},{63,67,67},{46,50,51},{24,26,28},{0,0,0}, +{127,130,123},{111,114,108},{96,100,93},{80,83,78},{63,67,62},{46,50,46},{24,26,24},{0,0,0},{128,130,114},{112,114,100},{96,99,86},{80,83,72},{63,67,57},{46,50,41},{24,27,19},{0,0,0},{129,130,105},{112,114,92},{96,99,79},{80,83,66},{63,67,51},{46,50,35},{24,27,13},{0,0,0},{130,129,96},{113,113,84},{97,99,72},{81,83,59},{64,67,45},{46,50,29},{24,27,7},{0,0,0}, +{130,129,86},{114,113,75},{97,99,64},{81,83,51},{64,67,39},{46,50,23},{24,27,5},{0,0,0},{131,129,76},{115,113,66},{98,98,56},{82,83,44},{64,67,32},{46,50,17},{23,28,2},{0,0,0},{131,129,69},{115,113,58},{98,98,49},{82,83,38},{64,67,25},{46,50,10},{23,28,1},{0,0,0},{132,129,61},{115,113,51},{98,98,42},{82,82,32},{64,66,18},{46,49,4},{22,28,0},{0,0,0}, +{120,121,186},{106,107,164},{92,93,143},{77,78,122},{61,61,101},{45,44,80},{24,19,53},{0,0,11},{122,121,176},{108,107,156},{93,93,137},{78,78,116},{62,61,96},{46,44,75},{24,20,49},{0,0,7},{123,121,167},{109,107,148},{94,93,129},{79,78,110},{63,61,90},{47,44,70},{24,20,45},{0,0,3},{124,121,159},{110,107,141},{95,93,123},{80,78,104},{64,61,86},{47,44,66},{25,21,41},{0,0,1}, +{125,121,152},{111,107,133},{96,93,116},{81,78,99},{64,61,81},{47,44,62},{25,21,38},{0,0,0},{126,121,143},{112,107,126},{96,93,110},{81,77,93},{64,61,76},{48,44,57},{25,21,34},{0,0,0},{127,121,135},{112,107,118},{96,93,103},{81,77,87},{64,61,70},{48,44,53},{25,21,30},{0,0,0},{128,121,127},{113,106,111},{97,92,96},{81,77,82},{64,61,65},{47,45,49},{26,22,26},{0,0,0}, +{128,121,119},{113,106,104},{97,92,90},{81,77,76},{64,61,60},{47,45,44},{26,22,22},{0,0,0},{129,121,111},{114,106,97},{98,92,83},{81,77,70},{65,61,55},{47,45,39},{26,23,17},{0,0,0},{130,121,102},{114,106,89},{98,92,77},{81,77,64},{65,61,49},{47,45,33},{26,23,11},{0,0,0},{131,120,93},{114,106,82},{99,92,70},{82,77,57},{65,61,43},{48,45,27},{26,23,6},{0,0,0}, +{131,120,84},{115,106,73},{99,92,62},{82,77,49},{65,61,37},{48,45,21},{26,23,4},{0,0,0},{132,120,74},{116,105,64},{99,91,54},{82,77,42},{65,61,30},{48,45,15},{25,24,2},{0,0,0},{132,120,67},{116,105,56},{100,91,47},{82,77,36},{65,61,23},{48,45,9},{25,24,1},{0,0,0},{133,120,59},{116,105,49},{100,91,40},{83,76,30},{65,61,17},{47,45,4},{24,24,0},{0,0,0}, +{122,112,179},{109,99,159},{93,85,138},{80,71,118},{63,55,98},{46,38,77},{25,12,50},{0,0,7},{124,112,170},{110,99,151},{95,85,132},{81,71,112},{64,55,93},{47,39,72},{25,13,46},{0,0,4},{126,112,161},{111,99,143},{96,85,125},{81,71,106},{65,55,87},{48,39,67},{25,13,43},{0,0,1},{127,112,154},{112,99,136},{97,85,119},{82,71,100},{65,55,83},{48,39,63},{26,14,39},{0,0,0}, +{127,112,147},{112,99,129},{97,85,113},{82,71,95},{65,55,78},{48,39,59},{26,14,35},{0,0,0},{128,112,139},{113,99,122},{97,86,107},{82,71,89},{65,55,73},{49,39,55},{26,15,31},{0,0,0},{129,112,131},{113,99,114},{97,86,100},{82,71,84},{65,55,68},{49,39,51},{26,15,28},{0,0,0},{129,112,123},{114,98,107},{98,85,93},{82,70,79},{65,55,63},{48,39,46},{27,16,24},{0,0,0}, +{129,112,115},{114,98,101},{98,85,87},{82,70,73},{65,55,59},{48,39,42},{27,17,20},{0,0,0},{130,112,108},{115,98,94},{99,85,80},{82,70,67},{66,56,54},{48,40,38},{27,18,15},{0,0,0},{131,112,100},{115,98,86},{99,85,74},{82,70,61},{66,56,48},{48,40,32},{27,18,10},{0,0,0},{132,111,91},{115,98,79},{100,85,68},{83,70,55},{66,55,42},{49,40,26},{27,19,5},{0,0,0}, +{132,111,82},{116,98,71},{100,85,60},{83,70,48},{66,55,35},{49,40,20},{27,19,3},{0,0,0},{133,111,73},{117,98,63},{100,84,52},{83,70,41},{66,55,29},{49,40,14},{26,19,1},{0,0,0},{133,111,66},{117,98,55},{101,84,46},{83,70,35},{66,55,22},{49,40,8},{26,19,1},{0,0,0},{134,111,58},{117,97,48},{101,84,39},{84,70,29},{66,55,16},{48,40,3},{25,19,0},{0,0,0}, +{125,102,173},{110,90,153},{95,77,133},{81,63,114},{65,48,94},{48,31,74},{26,7,47},{0,0,4},{126,102,164},{111,90,146},{97,77,127},{82,63,108},{66,48,89},{49,32,69},{27,8,43},{0,0,2},{127,102,156},{112,90,138},{98,77,120},{83,63,102},{66,48,84},{49,32,64},{27,8,40},{0,0,0},{128,102,149},{113,90,131},{98,77,114},{83,63,97},{66,48,80},{49,32,60},{28,9,36},{0,0,0}, +{129,102,142},{113,90,124},{98,77,109},{83,63,92},{66,48,75},{49,32,56},{28,9,33},{0,0,0},{130,103,134},{114,90,118},{99,78,103},{83,64,86},{66,49,70},{49,33,52},{28,10,29},{0,0,0},{130,103,126},{114,90,111},{99,78,97},{83,64,81},{66,49,65},{49,33,48},{28,10,26},{0,0,0},{130,102,119},{114,90,104},{99,77,90},{83,64,76},{66,49,60},{49,33,44},{28,11,22},{0,0,0}, +{131,102,112},{114,90,98},{99,77,84},{83,64,70},{66,49,56},{49,33,40},{28,11,18},{0,0,0},{132,103,105},{115,90,91},{100,77,78},{84,64,64},{67,50,51},{49,34,35},{27,12,13},{0,0,0},{133,103,97},{115,90,84},{100,77,72},{84,64,59},{67,50,46},{49,34,30},{27,12,8},{0,0,0},{134,102,88},{116,90,76},{100,77,65},{83,64,53},{66,49,40},{49,34,24},{27,13,5},{0,0,0}, +{134,102,80},{116,90,68},{100,77,58},{83,64,46},{66,49,33},{49,34,18},{27,13,3},{0,0,0},{134,102,71},{117,90,61},{101,77,50},{84,63,40},{67,49,27},{49,34,12},{26,13,1},{0,0,0},{134,102,64},{117,90,54},{101,77,44},{84,63,34},{67,49,21},{49,34,7},{26,13,1},{0,0,0},{135,102,57},{118,89,48},{102,77,38},{84,64,28},{67,49,15},{49,34,3},{25,13,0},{0,0,0}, +{127,92,167},{112,81,147},{97,69,128},{83,55,109},{66,40,90},{50,23,70},{28,3,45},{0,0,1},{128,92,158},{113,81,140},{99,69,122},{84,56,104},{67,41,85},{50,24,66},{29,3,41},{0,0,0},{129,92,150},{114,81,133},{100,69,116},{84,56,98},{68,41,80},{50,25,62},{29,3,38},{0,0,0},{130,92,143},{115,81,127},{100,69,110},{84,56,94},{68,41,76},{50,25,58},{29,3,34},{0,0,0}, +{131,92,136},{115,81,120},{100,69,105},{84,56,89},{68,41,72},{50,25,54},{29,3,31},{0,0,0},{132,93,129},{116,81,114},{100,69,99},{85,56,84},{68,42,68},{50,26,50},{29,4,27},{0,0,0},{132,93,122},{116,81,108},{100,69,94},{85,56,79},{68,42,63},{50,26,46},{29,4,24},{0,0,0},{132,93,115},{116,81,101},{101,69,88},{84,56,74},{67,42,58},{50,27,42},{29,4,20},{0,0,0}, +{133,93,109},{116,81,95},{101,69,82},{84,56,68},{67,42,54},{50,27,38},{29,4,16},{0,0,0},{133,93,102},{116,81,88},{101,70,76},{85,56,62},{68,43,49},{50,27,33},{28,5,11},{0,0,0},{134,93,94},{116,81,81},{101,70,70},{85,56,57},{68,43,44},{50,27,28},{28,5,6},{0,0,0},{135,92,86},{117,81,74},{101,69,63},{84,56,51},{67,43,38},{50,28,22},{28,6,4},{0,0,0}, +{135,92,78},{117,81,66},{101,69,56},{84,56,44},{67,43,31},{50,28,16},{28,6,2},{0,0,0},{135,92,69},{118,81,59},{102,69,48},{84,56,38},{67,43,25},{50,28,10},{27,6,1},{0,0,0},{135,92,62},{118,81,53},{102,69,42},{84,56,32},{67,43,19},{50,28,6},{27,6,1},{0,0,0},{136,92,56},{118,81,47},{103,69,37},{85,56,27},{68,43,13},{50,28,3},{26,7,0},{0,0,0}, +{129,81,161},{113,70,142},{99,58,124},{83,45,105},{67,30,87},{51,14,67},{29,1,42},{0,0,0},{131,81,153},{114,70,135},{100,59,118},{84,46,100},{68,31,82},{51,14,63},{29,1,38},{0,0,0},{131,81,145},{115,70,128},{100,59,112},{84,46,95},{68,32,77},{51,15,59},{29,1,35},{0,0,0},{132,81,138},{116,70,122},{101,59,106},{85,46,91},{68,32,73},{51,16,55},{29,1,31},{0,0,0}, +{132,81,132},{116,70,116},{101,59,101},{85,46,86},{68,32,69},{51,16,51},{29,1,28},{0,0,0},{133,82,125},{116,71,110},{101,59,95},{85,47,81},{68,33,65},{51,17,47},{29,1,25},{0,0,0},{133,82,118},{116,71,104},{101,59,90},{85,47,76},{68,34,60},{51,18,43},{29,1,21},{0,0,0},{134,82,111},{116,71,98},{101,60,85},{85,48,71},{68,34,55},{51,18,39},{29,2,17},{0,0,0}, +{134,82,105},{116,71,92},{101,60,79},{85,48,65},{68,34,51},{51,18,35},{29,2,13},{0,0,0},{134,82,98},{117,71,85},{101,60,73},{85,48,59},{68,35,46},{50,19,31},{28,2,9},{0,0,0},{134,82,91},{117,71,78},{101,60,67},{85,48,54},{68,35,41},{50,19,26},{28,2,6},{0,0,0},{135,82,83},{117,71,72},{101,60,60},{84,48,48},{67,35,35},{50,20,20},{28,3,4},{0,0,0}, +{135,82,75},{117,71,64},{101,60,53},{84,48,43},{67,35,30},{50,20,15},{28,3,2},{0,0,0},{135,82,68},{118,71,57},{102,60,47},{85,48,37},{67,36,24},{50,20,8},{27,3,1},{0,0,0},{135,82,61},{118,71,51},{102,60,41},{85,48,31},{67,36,18},{50,20,5},{27,3,1},{0,0,0},{136,82,55},{119,71,46},{103,61,36},{85,48,26},{68,36,12},{50,21,3},{26,3,0},{0,0,0}, +{130,69,155},{115,58,137},{100,48,120},{85,35,101},{68,20,83},{52,4,64},{28,0,40},{0,0,0},{132,69,148},{116,59,131},{101,48,114},{85,36,96},{68,21,78},{52,5,60},{28,0,36},{0,0,0},{133,69,140},{117,59,124},{101,48,108},{85,36,91},{68,22,73},{52,5,56},{28,0,33},{0,0,0},{134,69,134},{117,59,118},{102,49,102},{86,37,87},{69,23,69},{52,6,52},{28,0,29},{0,0,0}, +{134,69,127},{117,59,112},{102,49,97},{86,37,82},{69,23,65},{52,6,48},{28,0,26},{0,0,0},{134,70,121},{117,60,106},{102,49,91},{85,38,77},{68,24,61},{52,8,44},{28,0,22},{0,0,0},{134,71,114},{117,60,100},{102,49,86},{85,38,72},{68,25,56},{52,8,41},{28,0,18},{0,0,0},{134,71,107},{117,61,94},{102,50,81},{86,39,67},{69,26,52},{52,9,37},{28,1,13},{0,0,0}, +{134,71,101},{117,61,88},{102,50,75},{86,39,62},{69,26,48},{52,10,33},{28,1,10},{0,0,0},{135,71,94},{118,61,82},{102,50,70},{85,39,57},{68,27,44},{51,11,29},{28,1,7},{0,0,0},{135,71,88},{118,61,76},{102,50,64},{85,39,52},{68,27,39},{51,11,24},{28,1,5},{0,0,0},{135,71,81},{118,61,70},{102,51,58},{85,40,46},{68,28,33},{51,12,18},{27,1,3},{0,0,0}, +{135,71,73},{118,61,62},{102,51,51},{85,40,41},{68,28,28},{51,12,13},{27,1,1},{0,0,0},{136,72,66},{119,62,55},{103,51,45},{86,41,35},{68,29,23},{51,13,7},{26,1,0},{0,0,0},{136,72,60},{119,62,49},{103,51,40},{86,41,30},{68,29,17},{51,13,4},{26,1,0},{0,0,0},{137,71,54},{120,62,44},{103,52,35},{86,41,25},{68,29,11},{51,14,2},{26,1,0},{0,0,0}, +{131,55,149},{116,45,131},{101,33,115},{86,20,97},{69,10,80},{52,2,62},{27,0,38},{0,0,0},{133,55,142},{117,45,125},{102,34,109},{86,22,93},{69,11,75},{53,2,58},{27,0,34},{0,0,0},{134,55,135},{118,45,119},{102,35,103},{86,22,88},{69,11,71},{53,2,54},{27,0,31},{0,0,0},{134,55,129},{118,46,113},{103,35,99},{86,23,84},{69,12,67},{52,3,50},{27,0,27},{0,0,0}, +{134,56,123},{118,46,108},{103,36,94},{86,24,79},{69,12,63},{52,3,46},{27,0,24},{0,0,0},{135,57,117},{118,47,102},{103,37,88},{86,25,75},{69,13,59},{52,4,42},{28,0,20},{0,0,0},{135,58,111},{118,48,97},{103,37,83},{86,26,70},{69,14,54},{52,4,39},{28,0,16},{0,0,0},{135,58,104},{118,49,91},{102,38,78},{86,27,65},{69,15,50},{52,5,35},{27,1,12},{0,0,0}, +{135,58,98},{118,49,85},{102,39,73},{86,28,60},{69,15,46},{52,5,31},{27,1,9},{0,0,0},{135,59,91},{118,49,80},{103,39,68},{85,28,55},{68,16,42},{52,5,27},{27,1,6},{0,0,0},{135,59,85},{118,49,74},{103,40,62},{85,28,50},{68,16,37},{52,5,22},{27,1,4},{0,0,0},{136,59,79},{119,50,68},{103,41,56},{85,29,44},{68,17,31},{51,6,16},{26,1,2},{0,0,0}, +{136,59,72},{119,50,61},{103,41,50},{85,30,39},{68,17,26},{51,6,11},{26,1,1},{0,0,0},{137,60,65},{119,51,54},{104,41,44},{86,31,34},{68,18,21},{51,6,6},{25,1,0},{0,0,0},{137,60,59},{119,51,48},{104,41,39},{86,31,29},{68,18,15},{51,6,4},{25,1,0},{0,0,0},{137,60,53},{120,51,43},{104,42,34},{86,31,24},{68,18,10},{51,7,2},{25,1,0},{0,0,0}, +{133,40,144},{117,30,126},{102,17,110},{87,4,93},{70,0,76},{53,0,59},{25,0,35},{0,0,0},{134,40,137},{118,31,120},{103,19,105},{87,6,89},{70,0,72},{53,0,55},{26,0,31},{0,0,0},{135,40,130},{119,31,114},{103,20,99},{87,7,84},{70,0,68},{53,0,52},{26,0,28},{0,0,0},{136,41,124},{119,32,109},{103,21,95},{87,9,80},{70,1,64},{53,0,48},{26,0,24},{0,0,0}, +{136,42,119},{119,32,104},{103,22,90},{87,10,76},{70,1,60},{53,0,44},{26,0,21},{0,0,0},{136,43,113},{119,34,98},{104,23,85},{87,11,72},{70,2,56},{53,0,40},{27,0,17},{0,0,0},{136,44,107},{119,35,93},{104,24,80},{87,13,67},{70,2,52},{53,0,36},{27,0,13},{0,0,0},{136,45,100},{120,36,88},{103,25,75},{87,14,62},{70,3,48},{53,0,32},{26,0,10},{0,0,0}, +{136,45,94},{120,36,82},{103,26,71},{87,15,58},{70,3,44},{53,0,28},{26,0,7},{0,0,0},{136,46,88},{119,37,77},{104,27,66},{86,16,53},{69,4,40},{52,0,24},{26,0,5},{0,0,0},{136,46,82},{119,37,71},{104,28,60},{86,16,48},{69,4,35},{52,0,19},{26,0,3},{0,0,0},{137,47,76},{120,37,65},{104,29,54},{86,17,42},{69,5,29},{52,0,13},{25,0,1},{0,0,0}, +{137,47,70},{120,38,59},{104,29,49},{86,18,37},{69,5,24},{52,0,9},{25,0,1},{0,0,0},{138,47,63},{120,39,53},{104,30,43},{87,19,32},{69,6,19},{51,0,5},{24,0,0},{0,0,0},{138,47,57},{120,39,47},{104,30,38},{87,19,27},{69,6,13},{51,0,3},{24,0,0},{0,0,0},{137,47,52},{120,40,42},{105,31,33},{87,20,22},{69,6,8},{51,0,1},{23,0,0},{0,0,0}, +{15,192,243},{14,169,214},{11,147,187},{8,126,160},{5,103,133},{1,81,106},{0,55,75},{0,16,34},{18,191,230},{16,168,202},{13,146,177},{10,125,151},{6,103,126},{1,81,100},{0,54,70},{0,15,31},{20,190,218},{18,167,191},{15,146,168},{12,125,143},{7,103,119},{2,81,94},{0,54,65},{0,14,28},{22,189,206},{19,167,182},{16,145,159},{12,124,136},{8,102,113},{2,81,90},{0,54,61},{0,14,24}, +{23,189,195},{20,167,173},{17,145,150},{13,124,129},{9,102,106},{3,81,85},{0,54,57},{0,14,21},{24,188,183},{21,166,163},{17,144,141},{14,123,121},{9,102,100},{4,80,79},{0,54,53},{0,14,15},{24,187,172},{22,165,153},{18,144,133},{15,123,113},{10,102,94},{4,80,74},{0,54,48},{0,14,11},{25,187,162},{22,164,144},{19,143,125},{15,122,106},{10,101,87},{5,80,68},{1,54,44},{0,13,7}, +{30,186,152},{27,164,134},{22,143,117},{15,122,99},{11,101,81},{6,80,62},{1,54,40},{0,12,4},{40,185,140},{37,163,124},{27,142,108},{16,121,92},{11,101,74},{6,80,57},{1,54,35},{0,12,1},{49,185,129},{44,163,113},{32,142,99},{18,121,84},{11,101,67},{6,80,51},{1,54,29},{0,12,0},{57,184,117},{48,163,103},{38,142,89},{22,120,76},{12,100,60},{7,79,44},{1,54,23},{0,11,0}, +{62,184,104},{52,163,92},{40,142,80},{24,120,67},{12,100,52},{7,79,37},{1,54,16},{0,11,0},{66,184,92},{55,162,82},{41,141,70},{25,120,58},{12,99,45},{7,78,31},{1,54,10},{0,11,0},{69,184,83},{57,162,73},{43,141,62},{27,120,51},{13,99,39},{7,78,24},{1,54,6},{0,11,0},{71,183,73},{60,162,64},{45,141,54},{29,119,44},{15,99,33},{7,78,18},{1,53,2},{0,11,0}, +{19,181,235},{17,160,207},{14,140,181},{11,119,155},{7,97,128},{3,76,102},{0,51,72},{0,9,31},{21,180,223},{19,159,196},{15,139,171},{12,118,147},{8,98,122},{3,76,97},{0,50,67},{0,8,28},{23,180,211},{21,159,186},{18,139,163},{13,118,139},{9,98,115},{4,76,91},{0,50,63},{0,7,25},{30,179,200},{25,158,177},{21,138,154},{15,117,132},{10,97,109},{4,76,87},{1,50,59},{0,7,21}, +{37,179,189},{30,158,168},{24,138,146},{16,117,125},{10,97,103},{5,76,82},{1,50,55},{0,7,18},{40,178,178},{33,157,158},{28,137,137},{19,116,117},{11,96,97},{6,75,76},{1,50,51},{0,7,13},{42,177,167},{36,157,149},{30,137,129},{21,116,110},{13,96,91},{6,75,71},{1,50,46},{0,7,8},{45,177,158},{38,156,140},{31,136,121},{23,116,103},{13,96,84},{7,75,65},{1,50,42},{0,7,4}, +{49,176,148},{42,156,130},{34,136,113},{25,116,96},{14,96,78},{7,75,60},{1,50,38},{0,6,2},{56,175,137},{48,155,120},{38,135,105},{26,115,89},{15,95,71},{7,75,54},{1,50,33},{0,6,0},{61,175,126},{53,155,110},{42,135,96},{29,115,81},{16,95,65},{7,75,49},{1,50,27},{0,6,0},{66,174,114},{57,154,100},{46,135,87},{31,114,73},{17,95,58},{9,74,42},{1,50,21},{0,6,0}, +{70,174,102},{60,154,90},{48,135,78},{33,114,65},{18,95,50},{9,74,35},{1,50,14},{0,6,0},{74,174,90},{63,154,79},{50,134,68},{34,114,56},{20,94,43},{10,74,29},{1,50,8},{0,6,0},{76,174,81},{64,154,71},{50,134,60},{35,114,49},{20,94,37},{10,74,22},{1,50,5},{0,6,0},{77,174,71},{66,154,62},{53,134,53},{37,113,43},{22,94,31},{10,74,16},{1,49,2},{0,6,0}, +{23,171,227},{21,151,200},{18,132,174},{14,111,149},{10,91,124},{5,71,99},{1,46,69},{0,2,29},{26,170,215},{23,151,189},{19,131,165},{15,111,142},{10,92,118},{6,71,94},{1,46,65},{0,2,25},{29,170,204},{25,151,180},{21,131,157},{16,111,134},{11,92,112},{6,71,88},{1,46,61},{0,2,22},{40,169,193},{33,150,171},{26,131,149},{18,111,128},{12,91,106},{7,70,84},{1,46,57},{0,1,18}, +{50,169,182},{41,150,162},{31,131,142},{20,111,121},{12,91,100},{7,70,80},{1,46,53},{0,1,15},{55,168,172},{45,149,153},{37,130,134},{24,110,114},{13,90,94},{7,70,74},{1,46,49},{0,1,11},{59,168,162},{49,149,145},{42,130,126},{27,110,107},{15,90,88},{8,70,68},{1,46,44},{0,1,6},{62,168,153},{53,148,136},{43,129,118},{31,109,100},{16,90,82},{8,70,63},{1,46,40},{0,1,2}, +{66,167,143},{56,148,126},{46,129,110},{34,109,93},{18,90,76},{8,70,58},{1,46,36},{0,1,0},{70,166,134},{59,147,117},{49,128,102},{36,108,86},{19,89,69},{8,70,52},{1,46,31},{0,1,0},{73,166,123},{63,147,107},{52,128,94},{38,108,79},{20,89,63},{8,70,47},{1,46,25},{0,1,0},{75,165,112},{65,146,98},{53,127,85},{40,108,71},{22,89,57},{9,70,41},{1,46,19},{0,1,0}, +{78,165,101},{68,146,88},{55,127,76},{41,108,63},{24,89,49},{10,70,34},{1,46,13},{0,1,0},{82,165,89},{70,146,77},{57,127,67},{42,107,55},{27,88,42},{11,70,28},{1,46,7},{0,1,0},{83,165,80},{71,146,69},{58,127,59},{43,107,48},{28,88,36},{11,70,21},{1,46,4},{0,1,0},{84,165,70},{72,146,61},{59,127,52},{45,107,42},{29,88,30},{12,69,15},{1,46,2},{0,1,0}, +{36,162,220},{32,144,194},{28,125,170},{19,105,145},{11,87,120},{6,67,95},{1,42,66},{0,1,27},{42,161,208},{37,143,184},{31,124,161},{23,105,138},{13,87,114},{7,67,90},{1,42,62},{0,1,23},{48,161,198},{41,143,175},{34,124,153},{25,105,130},{15,87,108},{7,67,85},{1,42,58},{0,1,18},{55,161,188},{46,143,166},{38,124,145},{28,105,124},{17,87,102},{9,66,81},{1,42,54},{0,1,14}, +{61,161,178},{51,143,158},{42,124,138},{30,105,117},{18,87,97},{9,66,76},{1,42,50},{0,1,11},{65,160,168},{55,142,149},{45,123,130},{33,104,110},{19,86,91},{10,66,71},{1,42,46},{0,1,7},{68,160,158},{57,142,141},{48,123,122},{36,104,104},{21,86,85},{10,66,66},{1,42,42},{0,1,4},{70,159,149},{61,141,132},{50,122,114},{38,104,97},{23,86,79},{10,66,61},{1,42,38},{0,1,1}, +{74,159,139},{63,141,122},{52,122,106},{40,104,91},{25,86,73},{11,66,56},{1,42,34},{0,1,0},{76,158,130},{65,140,113},{55,121,99},{41,103,84},{25,85,67},{11,66,50},{2,42,29},{0,0,0},{79,158,119},{68,140,104},{57,121,91},{43,103,76},{26,85,61},{11,66,45},{2,42,23},{0,0,0},{81,158,109},{69,139,95},{58,121,83},{45,103,69},{28,85,55},{12,66,39},{2,42,17},{0,0,0}, +{83,158,98},{71,139,86},{59,121,74},{45,103,61},{29,85,47},{12,66,32},{2,42,11},{0,0,0},{85,157,86},{74,139,75},{61,120,65},{46,102,53},{31,84,40},{13,66,26},{2,42,5},{0,0,0},{86,157,78},{74,139,67},{61,120,57},{47,102,46},{31,84,34},{13,66,19},{2,42,3},{0,0,0},{87,157,69},{75,139,60},{63,120,50},{48,102,40},{32,84,29},{14,65,14},{2,42,1},{0,0,0}, +{49,153,212},{43,136,188},{37,118,165},{25,99,141},{15,82,117},{9,63,92},{1,38,63},{0,0,24},{57,153,201},{50,135,179},{42,117,156},{31,99,134},{18,82,111},{9,62,87},{1,38,59},{0,0,20},{64,153,191},{55,135,170},{45,117,148},{35,99,126},{20,82,104},{9,62,82},{1,38,55},{0,0,15},{67,153,182},{58,135,161},{49,117,141},{38,99,120},{23,82,99},{10,62,78},{1,38,51},{0,0,11}, +{71,153,173},{61,135,153},{51,117,134},{40,99,113},{25,82,94},{11,62,73},{2,38,47},{0,0,7},{73,152,163},{63,134,145},{53,116,126},{41,99,107},{26,81,88},{12,62,68},{2,38,43},{0,0,4},{76,152,154},{66,134,137},{55,116,118},{42,99,101},{28,81,82},{12,62,63},{2,38,39},{0,0,2},{79,151,145},{67,133,128},{56,115,111},{44,98,94},{29,81,76},{13,62,58},{2,38,35},{0,0,1}, +{81,151,135},{70,133,119},{58,115,103},{46,98,88},{30,81,70},{14,62,53},{2,38,31},{0,0,0},{82,150,126},{71,132,110},{60,115,96},{46,98,81},{31,80,64},{14,62,48},{3,38,26},{0,0,0},{84,150,116},{73,132,101},{61,115,88},{47,98,73},{32,80,58},{14,62,42},{3,38,21},{0,0,0},{86,150,106},{74,131,92},{62,114,80},{49,97,66},{34,80,52},{15,62,36},{3,38,15},{0,0,0}, +{88,150,95},{76,131,83},{63,114,71},{50,97,58},{34,80,45},{15,62,30},{3,38,10},{0,0,0},{90,149,84},{78,132,74},{65,114,62},{51,97,51},{35,79,39},{16,62,24},{3,38,4},{0,0,0},{90,149,76},{78,132,66},{65,114,56},{51,97,45},{35,79,33},{16,62,18},{3,38,2},{0,0,0},{91,149,68},{79,131,59},{66,113,49},{52,97,39},{36,79,27},{17,61,12},{3,38,1},{0,0,0}, +{62,143,205},{54,127,182},{47,111,159},{35,93,136},{23,76,113},{11,57,89},{2,33,61},{0,0,21},{67,143,194},{59,126,173},{50,110,151},{39,93,129},{26,76,107},{12,57,84},{3,33,57},{0,0,17},{72,143,185},{63,126,164},{53,110,143},{42,93,122},{28,76,100},{13,57,79},{3,33,53},{0,0,12},{75,143,176},{66,126,156},{56,110,136},{44,93,116},{30,76,95},{14,58,75},{4,33,49},{0,0,8}, +{78,143,167},{67,126,148},{57,110,129},{45,93,109},{30,76,90},{15,58,70},{4,33,45},{0,0,5},{80,143,157},{69,125,139},{59,109,122},{46,93,103},{32,75,84},{16,58,66},{4,34,41},{0,0,2},{82,143,149},{72,125,131},{60,109,114},{47,93,97},{33,75,79},{17,58,61},{4,34,37},{0,0,1},{84,142,140},{73,124,123},{61,108,107},{49,92,91},{34,75,74},{18,58,56},{4,34,33},{0,0,0}, +{85,142,131},{75,124,115},{62,108,100},{50,92,85},{35,75,68},{19,58,51},{4,34,29},{0,0,0},{87,141,122},{76,124,107},{64,108,93},{51,92,78},{36,74,62},{19,57,46},{4,34,24},{0,0,0},{89,141,113},{77,124,99},{65,108,85},{52,92,71},{37,74,56},{19,57,40},{4,34,19},{0,0,0},{91,141,103},{78,123,90},{66,107,78},{53,91,64},{38,74,50},{20,57,34},{4,34,13},{0,0,0}, +{92,141,93},{79,123,81},{67,107,69},{53,91,56},{38,74,43},{20,57,28},{4,34,8},{0,0,0},{94,140,82},{81,123,72},{69,107,60},{54,91,49},{39,74,37},{21,57,22},{5,34,3},{0,0,0},{94,140,74},{81,123,64},{69,107,54},{55,91,43},{39,74,31},{21,57,16},{5,34,2},{0,0,0},{95,140,67},{82,123,57},{70,107,48},{56,91,38},{39,74,25},{21,57,10},{4,34,1},{0,0,0}, +{73,134,198},{63,118,176},{54,103,154},{44,87,131},{30,70,109},{14,52,86},{3,28,58},{0,0,18},{76,134,188},{66,118,167},{57,103,146},{46,87,124},{33,70,103},{16,52,81},{4,28,54},{0,0,14},{79,134,179},{70,118,158},{60,103,138},{48,87,117},{35,70,97},{18,52,76},{4,28,50},{0,0,9},{81,134,170},{72,118,151},{61,102,131},{49,87,112},{36,70,92},{19,53,72},{5,28,46},{0,0,5}, +{83,134,161},{73,118,143},{62,102,124},{50,87,106},{36,70,87},{19,53,67},{5,28,42},{0,0,2},{86,134,152},{75,117,135},{64,102,118},{51,87,100},{37,70,81},{20,53,63},{5,29,38},{0,0,1},{88,134,144},{76,117,127},{64,102,111},{52,87,94},{38,70,76},{21,53,58},{5,29,34},{0,0,0},{89,133,136},{77,116,119},{65,102,104},{53,86,88},{39,70,71},{22,53,53},{5,29,30},{0,0,0}, +{91,133,128},{79,116,111},{67,102,97},{53,86,82},{39,70,65},{23,53,49},{5,29,26},{0,0,0},{92,133,119},{80,116,104},{68,101,90},{54,86,75},{39,69,59},{23,52,44},{6,30,22},{0,0,0},{94,133,110},{80,116,96},{69,101,82},{55,86,69},{40,69,53},{23,52,38},{6,30,17},{0,0,0},{95,132,100},{81,115,87},{70,101,75},{56,85,62},{41,69,47},{23,52,32},{5,30,11},{0,0,0}, +{95,132,90},{82,115,79},{70,101,67},{56,85,54},{41,69,41},{23,52,26},{5,30,7},{0,0,0},{97,131,80},{84,115,70},{71,101,59},{57,85,47},{42,69,35},{24,52,20},{6,30,3},{0,0,0},{97,131,73},{84,115,62},{72,101,52},{57,85,41},{42,69,29},{24,52,14},{6,30,2},{0,0,0},{98,132,66},{85,115,55},{73,101,46},{58,85,36},{43,69,24},{24,52,8},{6,30,1},{0,0,0}, +{79,125,192},{69,111,169},{59,96,149},{48,81,127},{35,65,105},{19,47,83},{5,23,55},{0,0,15},{82,125,182},{72,110,161},{62,96,141},{50,81,120},{37,65,99},{21,47,78},{5,23,51},{0,0,11},{85,125,173},{74,110,153},{64,96,133},{51,81,113},{38,65,93},{23,47,73},{6,23,48},{0,0,6},{87,125,165},{76,110,146},{66,95,127},{52,81,108},{39,65,89},{23,48,69},{7,24,44},{0,0,3}, +{89,125,156},{77,110,138},{67,95,120},{53,81,103},{40,65,84},{23,48,64},{7,24,40},{0,0,1},{90,125,148},{79,110,131},{68,95,114},{54,81,97},{41,65,78},{24,48,60},{7,24,36},{0,0,0},{92,125,140},{79,110,123},{68,95,108},{54,81,91},{41,65,73},{25,48,55},{7,24,32},{0,0,0},{93,124,132},{80,109,116},{69,95,101},{55,80,85},{42,65,68},{26,48,51},{7,25,28},{0,0,0}, +{94,124,124},{82,109,108},{69,95,94},{56,80,79},{42,65,62},{26,48,47},{7,25,24},{0,0,0},{95,124,115},{83,109,101},{70,94,87},{56,80,73},{42,64,57},{26,47,42},{7,26,20},{0,0,0},{96,124,107},{84,109,93},{71,94,80},{57,80,67},{43,64,52},{26,47,37},{7,26,15},{0,0,0},{97,124,97},{85,108,85},{72,94,73},{58,80,60},{44,64,46},{27,47,31},{7,26,9},{0,0,0}, +{98,124,88},{85,108,77},{73,94,65},{58,80,53},{44,64,40},{27,47,25},{7,26,6},{0,0,0},{99,123,79},{87,108,68},{73,94,58},{59,80,46},{44,64,34},{27,47,19},{7,26,2},{0,0,0},{99,123,72},{87,108,61},{74,94,51},{59,80,40},{44,64,28},{27,47,13},{7,26,1},{0,0,0},{100,123,65},{87,108,54},{74,94,45},{60,80,35},{44,64,23},{27,47,7},{7,26,0},{0,0,0}, +{86,117,186},{75,103,164},{64,90,144},{52,75,123},{39,59,101},{23,42,80},{7,17,53},{0,0,12},{88,117,176},{77,103,156},{66,89,137},{54,75,116},{41,59,95},{25,42,75},{8,18,49},{0,0,8},{89,117,167},{78,103,148},{68,89,129},{55,75,109},{42,59,90},{27,42,70},{8,18,46},{0,0,3},{91,117,160},{79,103,141},{69,89,123},{56,75,104},{43,59,86},{28,42,66},{8,19,42},{0,0,1}, +{93,117,152},{80,103,134},{69,89,116},{57,75,99},{43,59,81},{28,42,62},{8,19,38},{0,0,0},{94,117,144},{82,103,127},{70,89,110},{57,75,93},{44,59,75},{29,42,58},{8,19,34},{0,0,0},{95,117,136},{83,103,119},{71,89,104},{57,75,87},{44,59,70},{29,42,53},{8,19,30},{0,0,0},{96,116,128},{84,103,112},{72,89,97},{58,74,82},{45,59,65},{29,42,49},{8,20,26},{0,0,0}, +{97,116,120},{85,103,105},{72,89,91},{58,74,76},{45,59,60},{29,42,45},{8,20,22},{0,0,0},{98,116,112},{86,102,98},{73,88,84},{59,74,71},{45,59,55},{29,43,40},{9,21,18},{0,0,0},{99,116,104},{86,102,90},{74,88,78},{59,74,65},{45,59,50},{29,43,35},{8,21,13},{0,0,0},{100,116,95},{87,102,83},{75,88,71},{60,74,58},{46,59,44},{29,43,29},{8,22,7},{0,0,0}, +{100,116,86},{88,102,75},{75,88,63},{60,74,51},{46,59,38},{29,43,23},{8,22,4},{0,0,0},{101,115,77},{89,102,66},{75,88,56},{61,74,44},{46,59,32},{29,43,17},{8,22,2},{0,0,0},{101,115,70},{89,102,59},{76,88,49},{61,74,38},{46,59,26},{29,43,11},{8,22,1},{0,0,0},{102,115,63},{89,101,52},{76,88,43},{62,74,33},{46,59,21},{30,43,5},{8,22,0},{0,0,0}, +{90,108,179},{79,96,159},{67,83,139},{56,68,118},{43,52,97},{27,36,77},{8,10,50},{0,0,8},{92,108,170},{81,96,152},{70,82,132},{57,68,112},{44,53,92},{28,37,72},{9,11,46},{0,0,5},{93,108,162},{83,96,144},{71,82,124},{58,68,105},{45,53,87},{29,37,68},{9,11,43},{0,0,1},{95,108,155},{84,96,137},{72,82,119},{59,68,101},{45,53,83},{30,37,64},{9,12,39},{0,0,0}, +{96,108,147},{84,96,129},{72,82,113},{59,68,96},{45,53,78},{31,37,60},{10,12,36},{0,0,0},{97,108,139},{85,96,123},{73,82,107},{60,68,90},{46,53,72},{31,37,55},{10,13,32},{0,0,0},{97,108,131},{85,96,115},{73,82,100},{60,68,84},{46,53,67},{31,37,51},{10,13,28},{0,0,0},{98,108,124},{86,96,108},{74,82,93},{61,67,79},{46,53,63},{31,37,47},{10,14,24},{0,0,0}, +{100,108,116},{87,96,101},{74,82,87},{61,67,73},{46,53,59},{31,37,43},{11,15,20},{0,0,0},{101,108,109},{87,95,95},{75,82,81},{61,68,68},{47,54,54},{31,38,38},{11,16,16},{0,0,0},{101,108,101},{88,95,87},{75,82,75},{61,68,62},{47,54,49},{31,38,33},{11,16,11},{0,0,0},{102,108,92},{89,95,80},{76,82,69},{62,68,56},{47,53,43},{31,38,27},{10,17,6},{0,0,0}, +{102,108,84},{89,95,72},{76,82,61},{62,68,50},{47,53,37},{31,38,22},{10,17,3},{0,0,0},{103,107,75},{90,95,65},{77,81,54},{63,68,43},{47,54,31},{32,38,16},{10,17,1},{0,0,0},{103,107,68},{90,95,58},{77,81,48},{63,68,37},{47,54,25},{32,38,10},{10,17,1},{0,0,0},{104,107,62},{91,94,51},{77,81,42},{63,67,32},{47,54,20},{31,38,4},{9,17,0},{0,0,0}, +{94,99,173},{83,88,153},{71,75,134},{59,61,114},{45,46,94},{31,29,74},{8,5,48},{0,0,5},{95,99,164},{84,88,146},{73,75,127},{61,61,108},{46,46,89},{31,30,69},{9,6,44},{0,0,3},{96,99,156},{86,88,139},{74,75,120},{61,61,102},{47,47,84},{31,30,65},{10,7,41},{0,0,0},{98,99,150},{87,88,132},{74,75,114},{62,61,98},{48,47,80},{32,31,61},{11,7,37},{0,0,0}, +{99,99,142},{87,88,124},{74,75,109},{62,61,93},{48,47,75},{33,31,57},{11,7,33},{0,0,0},{100,100,134},{88,88,118},{75,75,103},{62,62,87},{48,47,70},{33,31,53},{12,8,30},{0,0,0},{100,100,127},{88,88,112},{75,75,97},{62,62,81},{48,47,65},{33,31,48},{12,8,26},{0,0,0},{101,100,120},{89,88,105},{76,75,91},{63,61,76},{48,47,60},{33,31,44},{12,9,22},{0,0,0}, +{103,100,113},{89,88,98},{76,75,85},{63,61,71},{48,47,56},{33,31,40},{12,9,18},{0,0,0},{104,99,106},{90,87,92},{76,75,79},{63,62,65},{49,48,52},{33,32,36},{12,10,13},{0,0,0},{104,99,98},{90,87,85},{77,75,73},{63,62,60},{49,48,47},{33,32,31},{12,10,9},{0,0,0},{105,99,90},{91,87,78},{78,75,67},{64,62,54},{48,47,41},{33,32,25},{11,11,6},{0,0,0}, +{105,99,82},{91,87,70},{78,75,59},{64,62,48},{48,47,35},{33,32,20},{11,11,3},{0,0,0},{105,99,73},{92,87,63},{79,75,52},{64,62,42},{49,48,29},{33,32,14},{11,11,1},{0,0,0},{105,99,66},{92,87,56},{79,75,46},{64,62,36},{49,48,23},{33,32,8},{11,11,1},{0,0,0},{106,99,60},{93,87,51},{79,75,41},{64,61,30},{49,48,18},{33,32,4},{11,11,0},{0,0,0}, +{97,90,167},{86,79,147},{74,67,128},{62,53,110},{48,38,90},{33,21,70},{10,3,46},{0,0,2},{99,90,158},{87,79,140},{75,67,122},{63,54,105},{49,39,86},{33,22,66},{11,3,42},{0,0,1},{100,90,150},{88,79,133},{76,67,116},{63,54,99},{49,40,81},{33,23,63},{11,3,39},{0,0,0},{101,90,144},{89,79,127},{77,67,110},{64,54,94},{50,40,77},{34,24,59},{12,3,35},{0,0,0}, +{102,90,137},{90,79,120},{77,67,105},{64,54,89},{50,40,72},{34,24,55},{12,3,31},{0,0,0},{102,91,130},{90,79,114},{77,67,99},{64,54,84},{50,41,68},{34,25,51},{13,4,28},{0,0,0},{102,91,123},{90,79,108},{77,67,94},{64,54,79},{50,41,63},{34,25,46},{13,4,24},{0,0,0},{103,91,116},{91,79,102},{78,67,89},{65,55,74},{50,41,58},{34,25,42},{13,5,20},{0,0,0}, +{105,91,110},{91,79,96},{78,67,83},{65,55,69},{50,41,54},{34,25,38},{13,5,16},{0,0,0},{105,90,103},{92,79,90},{78,68,77},{65,55,63},{51,42,50},{34,26,34},{13,5,11},{0,0,0},{106,90,95},{92,79,83},{79,68,71},{65,55,58},{51,42,45},{34,26,29},{13,5,7},{0,0,0},{107,90,88},{93,79,76},{80,67,65},{65,55,52},{50,41,39},{34,26,23},{12,6,5},{0,0,0}, +{107,90,80},{93,79,68},{80,67,57},{65,55,46},{50,41,33},{34,26,18},{12,6,3},{0,0,0},{107,90,71},{94,79,61},{81,68,50},{66,55,40},{51,42,27},{35,26,12},{12,6,1},{0,0,0},{107,90,65},{94,79,55},{81,68,45},{66,55,34},{51,42,22},{35,26,7},{12,6,1},{0,0,0},{108,90,59},{94,79,50},{81,68,40},{66,55,29},{51,42,17},{34,27,4},{12,6,0},{0,0,0}, +{101,79,161},{89,69,142},{77,57,124},{64,44,106},{50,29,87},{35,13,67},{10,1,43},{0,0,1},{102,80,153},{90,69,135},{78,57,118},{65,45,101},{51,30,82},{35,14,63},{11,1,39},{0,0,0},{103,80,145},{91,69,129},{79,57,112},{65,45,95},{51,31,78},{35,14,60},{11,1,36},{0,0,0},{104,80,139},{91,69,123},{80,58,107},{66,46,91},{51,32,74},{36,15,56},{12,1,32},{0,0,0}, +{104,80,133},{92,69,116},{80,58,102},{66,46,86},{51,32,69},{36,15,52},{12,1,28},{0,0,0},{105,81,126},{92,69,110},{80,58,96},{65,46,81},{51,32,65},{35,16,48},{13,2,25},{0,0,0},{105,81,119},{92,69,104},{80,58,90},{65,46,76},{51,33,60},{35,17,43},{13,2,21},{0,0,0},{106,81,112},{93,70,99},{80,58,85},{66,47,71},{52,33,55},{35,17,39},{13,3,17},{0,0,0}, +{106,81,106},{93,70,93},{80,58,80},{66,47,66},{52,33,51},{35,17,35},{13,3,13},{0,0,0},{107,81,99},{93,70,87},{81,59,74},{66,47,60},{51,34,47},{36,18,31},{13,3,9},{0,0,0},{107,81,92},{93,70,80},{81,59,68},{66,47,55},{51,34,42},{36,18,26},{13,3,6},{0,0,0},{108,80,85},{94,70,73},{81,59,62},{66,47,49},{51,34,37},{36,19,21},{13,3,4},{0,0,0}, +{108,80,77},{94,70,66},{81,59,55},{66,47,44},{51,34,32},{36,19,16},{13,3,2},{0,0,0},{108,81,70},{95,70,59},{82,59,49},{67,47,39},{51,35,26},{36,19,10},{13,3,1},{0,0,0},{108,81,64},{95,70,53},{82,59,44},{67,47,33},{51,35,21},{36,19,7},{13,3,1},{0,0,0},{109,80,58},{96,70,48},{82,60,39},{67,47,28},{51,35,16},{35,20,4},{12,3,0},{0,0,0}, +{104,68,156},{91,58,137},{80,48,120},{66,35,102},{52,20,83},{37,4,64},{10,0,40},{0,0,0},{105,68,149},{92,59,131},{81,48,114},{67,36,97},{53,21,78},{37,5,60},{11,0,36},{0,0,0},{106,68,141},{93,59,125},{81,48,108},{68,36,91},{53,22,74},{37,5,57},{11,0,33},{0,0,0},{107,69,135},{94,59,119},{82,49,103},{68,37,87},{53,23,70},{38,6,53},{12,0,29},{0,0,0}, +{107,69,129},{94,59,112},{82,49,98},{68,37,82},{53,23,66},{38,6,49},{12,0,26},{0,0,0},{107,70,122},{95,60,106},{82,49,92},{67,38,77},{53,24,61},{37,7,45},{12,0,23},{0,0,0},{107,70,115},{95,60,100},{82,49,86},{67,38,72},{53,24,57},{37,8,41},{12,0,19},{0,0,0},{108,70,108},{95,61,95},{82,49,81},{67,39,67},{53,25,53},{37,9,37},{12,1,14},{0,0,0}, +{108,70,102},{95,61,89},{82,49,76},{67,39,63},{53,26,49},{37,10,33},{13,1,10},{0,0,0},{109,70,95},{95,61,83},{82,50,71},{68,39,58},{52,26,45},{37,10,29},{14,1,7},{0,0,0},{109,70,89},{95,61,77},{82,50,65},{68,39,53},{52,26,40},{37,10,24},{14,1,5},{0,0,0},{109,71,82},{96,61,71},{82,50,59},{68,39,47},{53,27,35},{37,11,19},{13,1,3},{0,0,0}, +{109,71,75},{96,61,64},{82,50,53},{68,39,42},{53,27,30},{37,11,14},{13,1,1},{0,0,0},{110,71,68},{97,61,57},{83,51,47},{69,40,37},{52,28,25},{37,12,9},{13,1,0},{0,0,0},{110,71,62},{97,61,51},{83,51,42},{69,40,32},{52,28,19},{37,12,6},{13,1,0},{0,0,0},{111,71,56},{97,61,46},{83,51,37},{69,40,27},{52,29,14},{37,13,3},{12,1,0},{0,0,0}, +{106,56,150},{93,46,132},{81,35,116},{68,22,98},{53,10,80},{38,2,62},{10,0,38},{0,0,0},{107,56,143},{94,47,126},{82,36,110},{69,23,93},{54,11,76},{38,2,58},{11,0,34},{0,0,0},{108,56,136},{95,47,120},{82,36,104},{69,23,88},{54,12,72},{38,2,55},{11,0,31},{0,0,0},{109,57,130},{96,47,114},{83,37,100},{69,25,84},{54,13,68},{38,3,51},{11,0,27},{0,0,0}, +{109,57,124},{96,47,109},{83,37,95},{69,25,80},{54,13,64},{38,3,47},{11,0,24},{0,0,0},{109,58,118},{96,49,103},{83,38,89},{68,26,75},{54,14,59},{38,3,43},{12,0,21},{0,0,0},{109,59,112},{96,49,98},{83,38,84},{68,27,70},{54,14,55},{38,4,39},{12,0,17},{0,0,0},{109,59,105},{96,50,92},{82,39,79},{68,28,65},{54,15,51},{38,4,35},{13,1,12},{0,0,0}, +{109,60,99},{96,50,86},{82,40,74},{68,29,61},{54,16,47},{38,5,31},{13,1,9},{0,0,0},{110,60,93},{96,51,81},{83,40,69},{68,29,56},{53,16,43},{38,5,28},{13,1,6},{0,0,0},{110,60,87},{96,51,75},{83,41,63},{68,29,51},{53,16,38},{38,5,23},{13,1,4},{0,0,0},{110,61,80},{97,51,69},{83,41,57},{68,30,46},{53,17,33},{38,6,17},{13,1,2},{0,0,0}, +{110,61,73},{97,51,63},{83,41,52},{68,30,41},{53,18,28},{38,6,13},{13,1,1},{0,0,0},{111,61,67},{98,51,56},{84,42,46},{69,31,36},{53,19,23},{37,6,8},{13,1,0},{0,0,0},{111,61,61},{98,51,50},{84,42,41},{69,31,31},{53,19,18},{37,6,5},{13,1,0},{0,0,0},{112,61,55},{98,51,45},{84,42,36},{69,31,26},{53,19,13},{37,7,3},{12,1,0},{0,0,0}, +{108,44,145},{96,33,127},{82,22,111},{70,8,95},{55,0,77},{39,0,60},{9,0,36},{0,0,0},{109,43,138},{97,34,121},{83,23,106},{70,9,90},{55,1,73},{39,0,56},{10,0,32},{0,0,0},{110,43,131},{97,34,115},{84,24,100},{70,10,85},{55,1,69},{39,0,52},{10,0,29},{0,0,0},{111,44,125},{98,35,110},{84,25,96},{70,12,81},{55,2,65},{39,0,48},{11,0,25},{0,0,0}, +{111,45,120},{98,35,105},{84,26,91},{70,13,77},{55,2,61},{39,0,45},{12,0,22},{0,0,0},{111,46,114},{98,37,99},{84,27,86},{70,15,72},{55,3,57},{39,0,41},{13,0,18},{0,0,0},{111,47,108},{98,38,94},{84,27,81},{70,16,67},{55,3,53},{39,0,37},{13,0,14},{0,0,0},{111,47,102},{97,39,89},{84,28,76},{70,17,62},{55,4,49},{39,0,33},{13,0,10},{0,0,0}, +{111,48,96},{97,39,83},{84,29,72},{70,17,58},{55,5,45},{39,0,29},{13,0,7},{0,0,0},{111,49,90},{98,39,78},{84,30,67},{69,18,54},{54,6,41},{39,0,25},{13,0,5},{0,0,0},{111,49,84},{98,39,72},{84,30,61},{69,19,49},{54,6,36},{39,0,21},{13,0,3},{0,0,0},{112,49,78},{99,39,66},{85,31,55},{70,20,44},{54,6,31},{39,1,15},{13,0,1},{0,0,0}, +{112,49,71},{99,40,61},{85,31,50},{70,20,39},{54,7,26},{39,1,11},{13,0,1},{0,0,0},{113,49,65},{99,41,55},{85,31,45},{70,21,34},{54,8,21},{38,1,7},{13,0,1},{0,0,0},{113,49,59},{99,41,49},{85,31,40},{70,21,29},{54,8,16},{38,1,4},{13,0,1},{0,0,0},{112,50,54},{99,41,44},{85,32,35},{70,22,24},{54,9,11},{37,1,2},{12,0,0},{0,0,0}, +{0,182,240},{0,161,213},{0,140,186},{0,120,159},{0,99,133},{0,77,105},{0,51,74},{0,10,34},{0,181,228},{0,160,202},{0,140,176},{0,119,151},{0,99,126},{0,77,99},{0,51,70},{0,9,31},{0,180,217},{0,160,191},{0,140,167},{0,119,143},{0,99,118},{0,77,93},{0,51,65},{0,9,29},{0,179,205},{0,159,182},{0,139,159},{0,118,136},{0,98,112},{0,77,89},{0,51,61},{0,9,25}, +{0,179,194},{0,158,172},{0,139,151},{0,118,129},{0,98,106},{0,77,84},{0,51,57},{0,9,21},{0,178,184},{0,157,162},{0,138,142},{0,118,121},{0,98,100},{0,76,78},{0,51,53},{0,9,17},{0,178,173},{0,157,153},{0,138,133},{0,118,113},{0,98,94},{0,76,73},{0,51,48},{0,9,12},{0,177,162},{0,157,144},{0,137,125},{0,117,106},{0,97,87},{0,76,68},{0,50,44},{0,8,7}, +{1,177,152},{1,157,134},{0,137,117},{0,117,99},{0,97,81},{0,76,63},{0,50,40},{0,8,4},{2,176,142},{2,156,125},{1,137,109},{0,116,92},{0,96,75},{0,76,58},{0,51,35},{0,7,1},{4,175,130},{3,155,115},{2,137,100},{0,116,85},{0,96,69},{0,76,52},{0,51,30},{0,7,0},{5,174,118},{4,154,105},{3,136,91},{1,116,77},{0,96,62},{0,75,46},{0,50,24},{0,7,0}, +{6,174,107},{5,154,95},{3,136,82},{1,116,69},{0,96,55},{0,75,39},{0,50,18},{0,7,0},{7,174,95},{5,154,85},{4,135,73},{1,115,60},{0,95,48},{0,75,33},{0,50,12},{0,7,0},{7,174,86},{6,154,77},{4,135,66},{2,115,54},{0,95,42},{0,75,27},{0,50,7},{0,7,0},{7,174,76},{6,154,68},{4,134,58},{2,115,48},{0,95,37},{0,74,22},{0,50,2},{0,7,0}, +{0,173,233},{0,153,206},{0,133,180},{0,114,154},{0,93,128},{0,72,102},{0,47,71},{0,5,32},{0,172,221},{0,152,196},{0,133,170},{0,113,146},{0,94,122},{0,72,96},{0,47,67},{0,4,28},{0,171,210},{0,151,185},{0,133,162},{0,113,138},{0,94,114},{0,72,90},{0,47,62},{0,4,26},{1,170,199},{1,151,176},{1,132,154},{0,112,132},{0,93,108},{0,72,86},{0,47,58},{0,4,22}, +{2,170,189},{2,151,167},{1,132,146},{0,112,125},{0,93,103},{0,72,81},{0,47,54},{0,4,18},{3,169,179},{2,150,158},{2,131,138},{1,112,117},{0,92,97},{0,71,75},{0,47,50},{0,4,13},{3,169,168},{2,150,149},{2,131,129},{1,112,110},{0,92,91},{0,71,70},{0,47,46},{0,4,9},{3,168,157},{3,149,140},{2,130,121},{1,111,103},{0,92,84},{0,71,65},{0,46,42},{0,3,4}, +{4,168,147},{3,149,130},{2,130,113},{2,111,96},{0,92,78},{0,71,60},{0,46,38},{0,3,2},{5,167,138},{4,148,121},{3,130,106},{2,110,89},{1,91,72},{0,71,55},{0,47,33},{0,3,0},{6,166,127},{5,148,112},{4,130,97},{2,110,82},{1,91,66},{0,71,50},{0,47,28},{0,3,0},{7,166,116},{6,147,102},{4,129,89},{2,110,75},{1,91,60},{0,71,44},{0,46,22},{0,3,0}, +{7,166,105},{6,147,93},{5,129,80},{3,110,67},{1,91,53},{0,71,37},{0,46,16},{0,3,0},{8,166,93},{7,147,83},{5,128,71},{3,109,59},{1,90,46},{0,71,31},{0,46,10},{0,3,0},{8,166,84},{7,147,75},{5,128,64},{3,109,52},{1,90,40},{0,71,25},{0,46,6},{0,3,0},{8,165,75},{7,147,66},{5,128,57},{3,109,47},{2,90,35},{0,70,20},{0,46,2},{0,3,0}, +{0,164,225},{0,145,199},{0,126,173},{0,107,148},{0,87,124},{0,67,99},{0,42,68},{0,0,30},{0,163,214},{0,144,189},{0,125,164},{0,107,141},{0,88,118},{0,67,94},{0,42,64},{0,0,26},{1,162,203},{1,143,179},{0,125,156},{0,107,134},{0,88,111},{0,67,88},{0,42,60},{0,0,23},{2,162,193},{2,143,170},{1,125,149},{0,106,128},{0,87,105},{0,67,84},{0,43,56},{0,0,19}, +{4,162,183},{3,143,162},{2,125,142},{1,106,121},{0,87,100},{0,67,79},{0,43,52},{0,0,15},{5,161,173},{4,142,153},{3,124,134},{1,105,114},{0,86,94},{0,67,73},{0,43,48},{0,0,10},{6,160,162},{5,142,144},{4,124,126},{2,105,107},{1,86,88},{0,67,68},{0,43,44},{0,0,6},{6,160,152},{5,141,135},{4,123,118},{2,105,100},{1,86,82},{0,67,63},{0,43,40},{0,0,2}, +{7,159,143},{6,141,127},{4,123,110},{3,105,94},{1,86,76},{0,67,58},{0,43,36},{0,0,0},{7,158,134},{6,140,118},{5,122,103},{3,104,87},{1,85,70},{0,67,53},{0,43,31},{0,0,0},{8,158,124},{7,140,109},{5,122,95},{4,104,80},{1,85,64},{0,67,48},{0,43,26},{0,0,0},{8,158,114},{7,139,100},{6,122,87},{4,104,73},{2,85,58},{0,67,42},{0,43,21},{0,0,0}, +{9,158,103},{7,139,91},{6,122,79},{4,104,65},{2,85,51},{0,67,36},{0,43,15},{0,0,0},{9,158,92},{8,139,81},{6,121,70},{4,103,58},{2,84,45},{0,66,30},{0,43,9},{0,0,0},{10,158,83},{8,139,73},{6,121,63},{4,103,51},{2,84,39},{0,66,24},{0,43,5},{0,0,0},{10,157,74},{9,139,65},{6,121,56},{5,103,45},{3,84,34},{1,66,19},{0,43,2},{0,0,0}, +{2,155,219},{2,138,193},{2,120,169},{1,101,144},{0,83,120},{0,63,95},{0,38,66},{0,0,27},{3,154,208},{3,137,183},{2,119,160},{1,101,137},{0,83,114},{0,63,90},{0,38,62},{0,0,23},{4,154,197},{3,136,174},{3,119,152},{2,101,130},{1,83,107},{0,63,85},{0,38,58},{0,0,19},{5,154,187},{4,136,166},{3,119,145},{2,101,124},{1,83,102},{0,63,81},{0,39,54},{0,0,15}, +{6,154,178},{5,136,158},{4,119,138},{2,101,117},{1,83,97},{0,63,76},{0,39,50},{0,0,11},{6,153,169},{5,135,149},{4,118,130},{3,100,110},{1,82,91},{0,63,71},{0,39,46},{0,0,6},{7,153,158},{6,135,140},{5,118,122},{3,100,104},{1,82,86},{0,63,66},{0,39,42},{0,0,4},{7,152,148},{6,134,131},{5,117,114},{4,100,97},{2,82,79},{0,63,61},{0,39,38},{0,0,1}, +{8,152,139},{7,134,123},{5,117,107},{4,100,91},{2,82,73},{0,63,56},{0,39,34},{0,0,0},{8,151,130},{7,134,114},{6,117,100},{4,99,84},{2,81,68},{0,63,51},{0,39,29},{0,0,0},{9,151,120},{7,134,106},{6,117,92},{4,99,77},{2,81,62},{0,63,46},{0,39,24},{0,0,0},{9,151,110},{8,133,97},{6,116,84},{5,99,71},{2,81,56},{1,63,40},{0,39,19},{0,0,0}, +{10,151,100},{8,133,88},{6,116,76},{5,99,63},{3,81,49},{1,63,34},{0,39,13},{0,0,0},{11,150,89},{8,133,79},{7,116,68},{5,98,56},{3,80,43},{1,62,28},{0,39,7},{0,0,0},{15,150,81},{11,133,71},{7,116,61},{5,98,50},{3,80,37},{1,62,23},{0,39,4},{0,0,0},{19,150,73},{15,132,63},{7,116,54},{5,98,44},{3,80,32},{1,62,18},{0,39,2},{0,0,0}, +{4,147,212},{3,130,187},{3,113,164},{2,95,140},{0,78,116},{0,59,91},{0,34,63},{0,0,24},{5,146,201},{5,129,178},{4,113,155},{2,95,133},{1,78,110},{0,59,87},{0,34,59},{0,0,20},{6,146,191},{5,129,169},{4,113,147},{3,95,126},{1,78,104},{0,59,82},{0,34,55},{0,0,15},{7,146,182},{6,129,161},{5,112,141},{4,95,120},{2,78,99},{0,59,78},{0,35,51},{0,0,11}, +{8,146,173},{6,129,153},{5,112,134},{4,95,113},{2,78,94},{0,59,73},{0,35,47},{0,0,7},{8,145,164},{7,128,144},{6,112,126},{4,95,107},{2,77,88},{1,59,68},{0,35,43},{0,0,4},{8,145,154},{7,128,136},{6,112,118},{4,95,101},{2,77,83},{1,59,63},{0,35,39},{0,0,2},{10,144,144},{7,127,127},{6,111,111},{5,94,94},{3,77,76},{1,59,58},{0,35,35},{0,0,1}, +{11,144,135},{9,127,119},{6,111,104},{5,94,88},{3,77,70},{1,59,54},{0,35,31},{0,0,0},{12,143,126},{10,127,111},{7,111,97},{5,94,81},{3,76,65},{1,59,49},{0,35,27},{0,0,0},{12,143,117},{11,127,103},{8,111,89},{5,94,74},{3,76,59},{1,59,44},{0,35,22},{0,0,0},{13,143,107},{11,126,94},{9,110,81},{6,93,68},{3,76,53},{1,59,38},{0,35,17},{0,0,0}, +{15,143,97},{12,126,85},{10,110,73},{6,93,61},{3,76,47},{1,59,32},{0,35,11},{0,0,0},{17,142,87},{12,126,76},{10,110,65},{6,93,55},{4,75,42},{1,58,26},{0,35,6},{0,0,0},{23,142,79},{17,126,69},{10,110,59},{7,93,49},{4,75,36},{1,58,21},{0,35,4},{0,0,0},{29,142,72},{21,125,62},{10,109,53},{7,93,43},{4,75,31},{1,58,16},{0,35,2},{0,0,0}, +{6,138,205},{5,122,181},{5,106,158},{3,89,135},{2,72,112},{0,54,89},{0,30,61},{0,0,21},{7,137,194},{6,122,172},{5,106,151},{4,89,129},{2,72,106},{1,54,84},{0,30,57},{0,0,17},{8,137,185},{7,122,163},{6,106,143},{4,89,122},{3,72,100},{1,54,79},{0,30,53},{0,0,13},{8,137,176},{7,121,156},{6,105,136},{5,89,116},{3,72,95},{1,54,75},{0,31,49},{0,0,9}, +{9,137,167},{7,121,148},{6,105,129},{5,89,110},{3,72,90},{1,54,70},{0,31,45},{0,0,5},{9,137,158},{8,120,140},{6,105,122},{5,89,104},{3,71,85},{1,54,66},{0,31,41},{0,0,2},{10,137,149},{8,120,132},{7,105,114},{5,89,98},{3,71,80},{1,54,61},{0,31,37},{0,0,1},{14,136,140},{9,120,123},{7,104,107},{5,88,91},{3,71,74},{1,54,56},{0,31,33},{0,0,0}, +{18,136,131},{13,120,115},{9,104,101},{6,88,85},{4,71,68},{1,54,52},{0,31,29},{0,0,0},{21,136,123},{18,120,108},{12,104,94},{6,88,78},{4,71,63},{2,54,47},{0,31,25},{0,0,0},{25,136,114},{21,120,100},{14,104,87},{7,88,72},{4,71,57},{2,54,42},{0,31,20},{0,0,0},{29,135,105},{24,119,92},{17,103,79},{8,87,66},{4,70,51},{2,53,36},{0,31,15},{0,0,0}, +{32,135,95},{26,119,83},{19,103,71},{10,87,59},{4,70,45},{2,53,30},{0,31,9},{0,0,0},{35,134,85},{29,119,74},{22,103,63},{11,87,53},{4,71,40},{2,54,24},{0,31,4},{0,0,0},{38,134,77},{31,119,67},{23,103,57},{12,87,47},{4,71,34},{2,54,19},{0,31,3},{0,0,0},{41,135,70},{34,118,61},{23,103,52},{12,87,41},{5,70,29},{2,53,14},{0,31,1},{0,0,0}, +{8,130,198},{7,114,175},{6,99,153},{5,83,130},{3,66,108},{1,49,86},{0,25,58},{0,0,18},{10,129,188},{9,114,166},{7,99,146},{6,83,124},{3,66,103},{1,49,81},{0,26,54},{0,0,14},{12,129,179},{10,114,158},{8,99,138},{6,83,117},{4,66,97},{1,49,76},{0,26,50},{0,0,10},{13,129,170},{12,113,151},{9,98,131},{6,83,112},{4,66,92},{1,49,72},{0,26,46},{0,0,6}, +{15,129,161},{13,113,143},{10,98,124},{7,83,107},{4,66,87},{1,49,67},{0,26,42},{0,0,2},{16,129,152},{14,113,135},{11,98,118},{7,83,101},{4,66,82},{2,49,63},{0,26,38},{0,0,1},{18,129,144},{14,113,127},{12,98,111},{7,83,95},{4,66,77},{2,49,58},{0,26,35},{0,0,0},{22,128,136},{16,112,120},{12,98,104},{8,82,88},{5,66,72},{2,49,54},{0,27,31},{0,0,0}, +{27,128,128},{20,112,112},{15,98,98},{9,82,82},{5,66,66},{2,49,49},{0,27,27},{0,0,0},{32,128,120},{27,112,105},{18,97,91},{10,82,75},{5,66,60},{2,49,44},{0,27,23},{0,0,0},{38,128,111},{31,112,97},{22,97,84},{12,82,69},{5,66,54},{2,49,39},{0,27,18},{0,0,0},{42,127,102},{35,111,89},{25,97,77},{13,81,63},{5,65,48},{2,48,33},{0,27,12},{0,0,0}, +{45,127,93},{37,111,81},{28,97,69},{15,81,57},{6,65,43},{2,48,28},{0,27,8},{0,0,0},{49,126,83},{41,111,72},{32,97,61},{17,82,51},{6,66,38},{2,49,22},{0,27,3},{0,0,0},{51,126,75},{42,111,65},{32,97,55},{18,82,45},{6,66,32},{2,49,17},{0,27,2},{0,0,0},{52,127,68},{44,111,59},{33,97,50},{19,81,39},{7,65,28},{2,48,12},{0,27,1},{0,0,0}, +{9,121,191},{8,107,169},{7,92,148},{5,77,126},{4,61,104},{2,44,83},{0,20,56},{0,0,15},{15,121,182},{14,106,161},{10,92,141},{7,77,120},{4,61,99},{2,44,78},{0,21,52},{0,0,11},{21,121,173},{19,106,153},{15,92,133},{9,77,113},{4,61,93},{2,44,73},{0,21,48},{0,0,6},{26,121,164},{23,106,146},{18,91,127},{10,77,108},{5,61,89},{2,44,69},{0,21,44},{0,0,3}, +{30,121,156},{25,106,138},{21,91,120},{12,77,103},{5,61,84},{2,44,64},{0,21,41},{0,0,1},{33,120,148},{27,106,131},{22,91,114},{12,77,97},{5,61,79},{2,44,60},{0,22,37},{0,0,0},{35,120,140},{28,106,123},{23,91,108},{14,77,92},{5,61,74},{2,44,55},{0,22,33},{0,0,0},{38,120,132},{31,105,116},{25,91,101},{16,77,85},{6,61,69},{3,44,51},{0,22,29},{0,0,0}, +{41,120,124},{35,105,109},{27,91,95},{18,77,79},{8,61,63},{3,44,47},{0,22,25},{0,0,0},{46,120,116},{38,105,102},{29,90,88},{19,76,74},{8,61,58},{3,44,43},{0,23,21},{0,0,0},{49,120,108},{41,105,94},{32,90,81},{21,76,68},{8,61,53},{3,44,38},{0,23,16},{0,0,0},{51,120,99},{44,104,87},{34,90,74},{22,76,61},{9,60,47},{3,44,32},{0,23,10},{0,0,0}, +{53,120,90},{46,104,79},{36,90,66},{23,76,55},{10,60,42},{3,44,27},{0,23,7},{0,0,0},{56,119,82},{48,104,70},{38,90,59},{25,76,49},{11,61,36},{4,44,21},{0,22,2},{0,0,0},{57,119,74},{49,104,64},{38,90,53},{25,76,43},{11,61,31},{4,44,16},{0,22,2},{0,0,0},{58,119,67},{50,104,58},{39,90,48},{26,76,38},{12,60,27},{4,44,11},{0,22,1},{0,0,0}, +{19,113,185},{17,99,164},{13,86,143},{10,71,122},{6,55,100},{2,38,80},{0,14,53},{0,0,12},{26,113,176},{24,99,156},{18,85,136},{13,71,116},{6,56,95},{2,39,75},{0,15,50},{0,0,8},{33,113,167},{29,99,148},{23,85,129},{15,71,109},{7,56,89},{3,39,70},{0,16,46},{0,0,3},{38,113,159},{33,99,141},{26,85,123},{17,71,104},{8,55,85},{4,39,66},{0,16,42},{0,0,1}, +{43,113,151},{36,99,134},{29,85,116},{19,71,99},{8,55,81},{4,39,62},{0,16,39},{0,0,0},{46,112,144},{38,99,127},{31,85,110},{20,71,93},{9,55,76},{4,39,58},{0,17,35},{0,0,0},{48,112,136},{40,99,119},{33,85,104},{21,71,88},{9,55,71},{4,39,53},{0,17,31},{0,0,0},{50,112,128},{43,99,112},{35,85,97},{23,71,82},{10,56,66},{4,40,49},{0,17,27},{0,0,0}, +{52,112,120},{45,99,105},{36,85,91},{25,71,77},{12,56,61},{4,40,45},{0,17,23},{0,0,0},{55,112,112},{47,98,99},{37,84,86},{26,70,72},{13,56,56},{4,40,41},{1,18,19},{0,0,0},{57,112,104},{49,98,92},{39,84,79},{28,70,66},{13,56,51},{4,40,36},{0,18,14},{0,0,0},{59,112,96},{50,98,85},{40,84,72},{29,70,59},{14,56,45},{4,40,30},{0,18,8},{0,0,0}, +{61,112,88},{51,98,77},{41,84,64},{29,70,53},{15,56,40},{4,40,25},{0,18,5},{0,0,0},{62,111,80},{52,98,68},{43,84,57},{31,70,47},{16,56,34},{5,40,19},{0,18,2},{0,0,0},{63,111,72},{53,98,62},{43,84,51},{31,70,41},{16,56,29},{5,40,14},{0,18,2},{0,0,0},{64,111,65},{55,98,56},{44,84,46},{32,70,36},{16,56,25},{5,40,9},{1,18,1},{0,0,0}, +{37,105,180},{34,92,159},{27,79,139},{19,65,118},{9,49,97},{3,33,77},{0,9,50},{0,0,9},{43,105,171},{38,92,152},{30,78,132},{21,65,112},{10,50,92},{4,34,72},{1,10,47},{0,0,5},{47,105,162},{41,92,144},{33,78,124},{23,65,105},{12,50,86},{4,34,68},{1,11,44},{0,0,1},{49,105,155},{43,92,137},{35,78,119},{25,65,101},{13,50,82},{5,34,64},{1,11,40},{0,0,0}, +{51,105,147},{45,92,130},{36,78,113},{27,65,96},{14,50,78},{5,34,60},{1,11,37},{0,0,0},{54,104,140},{47,92,123},{38,78,107},{28,65,90},{15,50,73},{5,34,56},{1,11,33},{0,0,0},{56,104,132},{48,92,115},{39,78,101},{29,65,85},{16,50,68},{5,34,51},{1,11,29},{0,0,0},{58,104,124},{49,92,108},{41,78,94},{30,64,80},{17,51,63},{5,35,47},{1,11,25},{0,0,0}, +{60,104,116},{51,92,102},{43,78,88},{31,64,74},{17,51,59},{5,35,43},{1,11,21},{0,0,0},{62,104,109},{51,91,96},{44,79,83},{32,65,69},{18,51,54},{5,35,39},{1,12,17},{0,0,0},{63,104,101},{53,91,89},{44,79,77},{32,65,63},{18,51,49},{5,35,34},{1,12,13},{0,0,0},{65,104,94},{55,91,82},{45,78,70},{33,65,57},{19,51,44},{6,35,29},{1,13,7},{0,0,0}, +{65,104,86},{56,91,75},{46,78,63},{33,65,51},{20,51,39},{6,35,24},{1,13,4},{0,0,0},{66,104,77},{57,91,67},{47,78,56},{34,65,45},{21,51,33},{6,35,18},{1,13,2},{0,0,0},{67,104,71},{58,91,61},{47,78,50},{34,65,40},{21,51,28},{6,35,13},{1,13,1},{0,0,0},{68,104,64},{59,91,55},{47,78,45},{35,65,35},{20,51,24},{7,36,8},{1,13,0},{0,0,0}, +{50,97,174},{45,84,153},{36,71,134},{27,58,114},{15,43,94},{5,27,74},{0,5,48},{0,0,6},{54,97,165},{47,84,146},{39,72,127},{30,59,108},{17,44,89},{6,28,69},{1,6,44},{0,0,3},{57,97,157},{49,84,139},{40,72,120},{31,59,102},{18,44,83},{6,28,65},{1,7,41},{0,0,0},{58,97,150},{50,84,132},{42,72,115},{32,59,98},{19,44,79},{7,28,61},{1,7,37},{0,0,0}, +{59,97,142},{51,84,125},{43,72,110},{32,59,93},{19,44,75},{7,28,57},{1,7,34},{0,0,0},{61,96,135},{52,84,119},{44,72,104},{33,59,87},{20,44,70},{8,29,53},{1,7,31},{0,0,0},{62,96,128},{54,84,112},{45,72,98},{34,59,82},{20,44,65},{8,29,49},{1,7,27},{0,0,0},{63,96,121},{55,84,105},{46,72,91},{35,58,77},{21,45,61},{8,29,45},{1,7,22},{0,0,0}, +{65,96,113},{56,84,99},{46,72,85},{35,58,72},{21,45,57},{8,29,41},{1,7,18},{0,0,0},{66,95,106},{56,84,93},{47,72,80},{36,59,66},{22,45,52},{9,30,36},{1,8,14},{0,0,0},{68,95,98},{58,84,86},{47,72,74},{36,59,61},{23,45,47},{9,30,32},{1,8,10},{0,0,0},{69,96,91},{59,84,79},{48,72,68},{37,59,55},{24,46,42},{10,30,27},{1,8,6},{0,0,0}, +{69,96,83},{60,84,72},{49,72,61},{37,59,49},{24,46,37},{10,30,22},{1,8,4},{0,0,0},{70,96,75},{61,83,65},{50,72,54},{38,59,43},{25,46,31},{9,30,16},{1,8,2},{0,0,0},{71,96,69},{61,83,59},{50,72,49},{38,59,38},{25,46,26},{9,30,11},{1,8,1},{0,0,0},{72,96,63},{62,83,53},{51,72,44},{39,59,33},{25,46,22},{10,31,6},{1,8,0},{0,0,0}, +{59,88,167},{52,76,147},{44,64,129},{35,51,110},{22,37,91},{7,20,71},{1,3,46},{0,0,4},{61,88,159},{54,76,140},{45,65,123},{36,52,105},{23,38,86},{8,21,67},{1,4,42},{0,0,1},{62,88,151},{56,76,133},{46,65,116},{36,52,99},{24,38,81},{9,22,63},{1,4,39},{0,0,0},{63,88,145},{57,76,127},{47,65,111},{38,52,94},{25,38,77},{10,22,59},{2,4,35},{0,0,0}, +{64,88,138},{57,76,121},{48,65,106},{38,52,89},{25,38,72},{10,22,55},{2,4,32},{0,0,0},{66,88,131},{58,77,115},{48,65,100},{38,52,84},{26,38,68},{11,23,51},{2,4,29},{0,0,0},{68,88,124},{58,77,109},{48,65,94},{38,52,79},{26,38,63},{11,23,47},{2,4,25},{0,0,0},{69,88,117},{59,76,102},{49,65,89},{39,52,75},{27,39,59},{12,23,43},{2,4,20},{0,0,0}, +{71,88,110},{61,76,96},{50,65,83},{39,52,70},{27,39,55},{12,23,39},{2,4,16},{0,0,0},{72,88,103},{61,77,90},{51,65,78},{40,53,64},{27,39,50},{13,24,34},{2,4,12},{0,0,0},{72,88,96},{62,77,84},{51,65,72},{40,53,59},{27,39,45},{13,24,30},{2,4,8},{0,0,0},{72,88,89},{62,77,77},{52,66,66},{41,53,53},{28,40,40},{13,25,25},{2,5,5},{0,0,0}, +{73,88,81},{63,77,70},{52,66,59},{41,53,47},{28,40,35},{13,25,20},{2,5,3},{0,0,0},{74,88,73},{64,76,63},{53,65,53},{42,53,42},{29,40,29},{13,25,14},{2,5,1},{0,0,0},{74,88,67},{64,76,57},{53,65,48},{42,53,37},{29,40,24},{13,25,9},{2,5,1},{0,0,0},{74,88,62},{65,76,52},{54,65,43},{42,53,32},{29,40,20},{13,25,4},{2,5,0},{0,0,0}, +{66,78,161},{58,67,143},{49,56,125},{40,43,106},{27,29,88},{12,12,68},{1,1,43},{0,0,2},{67,79,154},{59,68,136},{50,57,119},{41,44,101},{28,30,83},{13,13,64},{2,2,39},{0,0,1},{68,79,146},{60,68,128},{51,57,112},{41,44,95},{29,30,78},{14,14,60},{2,2,36},{0,0,0},{69,79,140},{61,68,123},{52,57,108},{42,44,91},{30,30,74},{15,15,56},{2,2,32},{0,0,0}, +{70,79,133},{62,68,117},{52,57,103},{42,44,86},{30,30,69},{15,15,52},{2,2,29},{0,0,0},{72,79,127},{62,68,111},{52,57,97},{42,44,81},{30,31,65},{14,16,48},{2,2,26},{0,0,0},{72,79,120},{62,68,105},{52,57,91},{42,44,76},{30,31,60},{14,16,44},{2,2,22},{0,0,0},{73,79,113},{63,68,99},{53,57,86},{43,45,72},{30,32,56},{15,16,40},{2,2,17},{0,0,0}, +{75,79,107},{63,68,93},{53,57,80},{43,45,67},{30,32,52},{15,16,36},{2,2,13},{0,0,0},{76,79,100},{64,69,87},{54,57,75},{43,46,61},{30,33,47},{15,17,32},{2,2,10},{0,0,0},{76,79,93},{65,69,81},{54,57,69},{43,46,56},{30,33,42},{15,17,27},{2,2,7},{0,0,0},{76,79,86},{66,69,75},{55,58,63},{44,46,50},{30,34,38},{16,18,23},{2,3,5},{0,0,0}, +{76,79,78},{66,69,68},{55,58,57},{44,46,45},{30,34,33},{16,18,18},{2,3,3},{0,0,0},{77,79,71},{67,68,61},{56,57,51},{45,46,40},{31,34,28},{16,18,12},{2,3,1},{0,0,0},{77,79,66},{67,68,56},{56,57,46},{45,46,36},{31,34,23},{16,18,8},{2,3,1},{0,0,0},{78,80,61},{68,68,51},{57,57,42},{45,47,31},{31,34,19},{16,19,4},{2,3,0},{0,0,0}, +{72,68,157},{62,58,139},{53,48,121},{44,35,102},{31,20,84},{17,4,64},{2,0,40},{0,0,0},{73,69,150},{63,59,132},{54,48,115},{45,36,97},{32,21,79},{17,5,60},{3,0,36},{0,0,0},{74,69,142},{64,59,124},{55,48,108},{45,36,91},{32,21,74},{17,5,57},{3,0,33},{0,0,0},{75,69,136},{65,59,119},{56,48,104},{46,37,87},{33,22,70},{18,6,53},{3,0,29},{0,0,0}, +{75,69,129},{65,59,113},{56,48,99},{46,37,83},{33,23,66},{18,6,49},{3,0,26},{0,0,0},{76,70,123},{65,59,107},{56,49,93},{45,37,78},{33,24,62},{18,7,45},{3,0,23},{0,0,0},{76,70,116},{66,59,101},{56,49,87},{45,37,73},{33,24,57},{18,7,42},{3,0,19},{0,0,0},{77,70,109},{66,60,95},{57,49,82},{46,38,68},{33,25,53},{19,8,38},{3,0,15},{0,0,0}, +{78,70,103},{67,60,90},{57,49,77},{46,38,63},{33,25,49},{19,9,34},{3,0,11},{0,0,0},{79,70,97},{68,61,85},{58,50,72},{46,39,58},{33,26,45},{19,10,30},{3,1,8},{0,0,0},{79,70,90},{69,61,79},{58,50,66},{46,39,53},{33,26,40},{19,10,25},{3,1,6},{0,0,0},{79,70,83},{70,60,73},{58,50,60},{46,39,48},{34,27,36},{20,10,21},{3,1,4},{0,0,0}, +{79,70,76},{70,60,66},{59,50,55},{46,39,43},{34,27,31},{20,10,16},{3,1,2},{0,0,0},{79,70,69},{70,61,60},{60,50,49},{47,40,38},{34,27,26},{20,11,10},{3,1,1},{0,0,0},{80,70,64},{70,61,54},{60,50,44},{47,40,34},{34,27,22},{20,11,7},{3,1,1},{0,0,0},{81,71,59},{71,61,49},{60,50,40},{47,40,30},{34,28,18},{20,12,4},{3,1,0},{0,0,0}, +{75,57,151},{66,48,134},{57,38,117},{46,24,99},{33,11,81},{19,2,62},{2,0,38},{0,0,0},{76,58,144},{67,49,127},{58,38,111},{47,25,94},{34,12,77},{19,2,58},{3,0,35},{0,0,0},{77,58,136},{68,49,120},{59,38,104},{47,25,89},{35,12,72},{19,2,55},{3,0,32},{0,0,0},{78,59,131},{68,49,114},{59,38,100},{47,27,85},{35,13,68},{20,3,51},{3,0,28},{0,0,0}, +{78,59,125},{68,49,109},{59,39,96},{47,27,81},{35,14,64},{20,3,48},{3,0,24},{0,0,0},{79,60,119},{69,50,104},{59,40,90},{47,28,75},{34,15,60},{19,3,44},{3,0,21},{0,0,0},{79,60,113},{69,50,99},{59,40,85},{47,28,71},{34,15,55},{19,3,40},{3,0,17},{0,0,0},{80,60,106},{69,51,93},{59,40,80},{47,29,66},{35,16,51},{20,4,36},{3,0,13},{0,0,0}, +{80,60,100},{69,51,88},{59,40,75},{47,29,62},{35,16,47},{20,4,32},{3,0,10},{0,0,0},{81,61,94},{70,52,82},{60,41,70},{47,30,57},{35,17,44},{20,5,29},{3,1,7},{0,0,0},{81,61,88},{71,52,77},{60,41,65},{47,30,52},{35,17,39},{20,5,24},{3,1,5},{0,0,0},{81,61,81},{71,52,71},{60,42,59},{48,31,47},{35,18,35},{21,5,19},{3,1,3},{0,0,0}, +{81,61,74},{71,52,64},{61,42,54},{48,31,42},{35,18,30},{21,5,14},{3,1,2},{0,0,0},{81,61,68},{72,52,58},{61,42,48},{48,32,37},{35,18,25},{20,6,9},{3,1,1},{0,0,0},{82,61,62},{72,52,53},{61,42,43},{48,32,33},{35,19,21},{20,6,6},{3,1,1},{0,0,0},{82,62,57},{73,52,48},{62,42,39},{48,32,29},{36,20,16},{20,7,4},{3,1,0},{0,0,0}, +{78,46,146},{70,37,129},{60,26,113},{48,12,96},{36,2,78},{20,0,60},{2,0,36},{0,0,0},{80,47,139},{71,38,123},{61,27,107},{49,13,91},{37,2,74},{20,0,56},{2,0,33},{0,0,0},{81,47,131},{72,38,116},{62,27,100},{50,14,86},{37,2,70},{20,0,53},{3,0,30},{0,0,0},{82,48,126},{72,39,110},{62,28,96},{50,16,82},{37,3,66},{21,0,49},{3,0,26},{0,0,0}, +{82,48,121},{72,39,105},{62,29,92},{50,17,78},{37,4,62},{21,0,46},{3,0,22},{0,0,0},{82,49,115},{72,40,101},{62,30,87},{49,18,72},{36,5,58},{20,0,42},{3,0,19},{0,0,0},{82,50,109},{72,41,96},{62,30,82},{49,18,68},{36,5,53},{20,0,38},{3,0,15},{0,0,0},{83,50,102},{72,41,91},{61,31,77},{49,19,64},{37,6,49},{21,0,34},{3,0,11},{0,0,0}, +{83,50,96},{72,41,85},{61,31,73},{49,20,60},{37,7,45},{21,0,30},{3,0,8},{0,0,0},{84,51,91},{73,42,79},{62,32,68},{50,21,55},{37,8,42},{21,1,27},{3,0,6},{0,0,0},{84,51,85},{73,42,74},{62,32,63},{50,21,50},{37,8,38},{21,1,23},{3,0,4},{0,0,0},{84,51,79},{73,43,68},{63,33,57},{50,22,45},{37,9,33},{22,1,17},{3,0,2},{0,0,0}, +{84,51,72},{73,43,62},{63,33,52},{50,22,40},{37,9,28},{22,1,12},{3,0,1},{0,0,0},{84,52,66},{74,42,56},{63,33,46},{50,23,36},{37,9,24},{21,1,8},{3,0,0},{0,0,0},{84,52,60},{74,42,51},{63,33,41},{50,23,31},{37,10,19},{21,1,5},{3,0,0},{0,0,0},{84,52,55},{75,43,46},{63,34,37},{50,24,27},{38,11,14},{21,2,3},{3,0,0},{0,0,0}, +{0,174,239},{0,154,211},{0,134,185},{0,114,158},{0,95,132},{0,74,105},{0,49,74},{0,3,35},{0,173,227},{0,153,200},{0,134,175},{0,114,150},{0,94,125},{0,74,99},{0,49,70},{0,4,31},{0,172,216},{0,153,190},{0,134,166},{0,114,142},{0,94,117},{0,74,93},{0,49,65},{0,4,28},{0,171,205},{0,152,180},{0,133,158},{0,113,135},{0,93,112},{0,73,89},{0,49,61},{0,4,24}, +{0,171,194},{0,151,171},{0,133,150},{0,113,128},{0,93,106},{0,73,84},{0,49,57},{0,4,21},{0,170,184},{0,150,162},{0,132,141},{0,112,121},{0,93,100},{0,73,78},{0,48,53},{0,3,17},{0,170,173},{0,150,153},{0,131,133},{0,112,113},{0,93,94},{0,73,73},{0,48,48},{0,3,12},{0,169,162},{0,150,144},{0,131,125},{0,112,106},{0,93,88},{0,73,68},{0,49,44},{0,3,7}, +{0,168,152},{0,149,134},{0,131,117},{0,112,100},{0,93,82},{0,73,63},{0,49,40},{0,3,4},{0,167,142},{0,148,125},{0,130,110},{0,111,93},{0,92,76},{0,73,59},{0,49,36},{0,3,1},{0,167,131},{0,148,116},{0,130,101},{0,111,86},{0,92,70},{0,73,53},{0,49,31},{0,3,0},{0,167,121},{0,148,106},{0,130,92},{0,111,78},{0,91,63},{0,72,47},{0,48,25},{0,3,0}, +{0,167,110},{0,148,96},{0,130,84},{0,111,70},{0,91,56},{0,72,41},{0,48,20},{0,3,0},{0,166,98},{0,147,87},{0,129,75},{0,110,63},{0,92,50},{0,72,35},{0,48,14},{0,3,0},{0,166,89},{0,147,79},{0,129,68},{0,110,57},{0,92,44},{0,72,30},{0,48,9},{0,3,0},{0,165,79},{0,147,72},{0,128,62},{0,110,52},{0,92,39},{0,73,25},{0,49,4},{0,3,0}, +{0,165,232},{0,146,204},{0,127,179},{0,108,153},{0,90,127},{0,69,101},{0,45,71},{0,1,32},{0,164,220},{0,145,194},{0,127,170},{0,108,146},{0,89,121},{0,70,96},{0,45,67},{0,2,28},{0,163,209},{0,145,185},{0,127,161},{0,108,138},{0,89,114},{0,70,90},{0,45,62},{0,2,25},{0,163,199},{0,145,175},{0,126,154},{0,107,131},{0,88,108},{0,69,86},{0,45,58},{0,2,21}, +{0,163,188},{0,144,166},{0,126,146},{0,107,124},{0,88,103},{0,69,81},{0,45,54},{0,2,18},{0,162,178},{0,143,157},{0,126,137},{0,107,117},{0,88,97},{0,69,75},{0,44,50},{0,1,14},{0,162,168},{0,143,148},{0,125,129},{0,107,110},{0,88,91},{0,69,70},{0,44,46},{0,1,9},{0,161,157},{0,143,140},{0,125,122},{0,106,103},{0,88,85},{0,69,65},{0,45,42},{0,1,4}, +{0,160,147},{0,142,131},{0,125,114},{0,106,97},{0,88,79},{0,69,61},{0,45,38},{0,1,2},{0,160,138},{0,141,122},{0,124,107},{0,105,90},{0,87,73},{0,69,56},{0,45,34},{0,1,0},{0,160,128},{0,141,113},{0,124,98},{0,105,83},{0,87,67},{0,69,50},{0,45,29},{0,1,0},{0,160,118},{0,141,103},{0,124,90},{0,106,76},{0,87,60},{0,68,44},{0,44,23},{0,1,0}, +{0,160,107},{0,141,94},{0,124,82},{0,106,68},{0,87,54},{0,68,39},{0,44,18},{0,1,0},{0,159,96},{0,140,84},{0,123,73},{0,105,61},{0,87,48},{0,68,33},{0,44,12},{0,1,0},{0,159,87},{0,140,77},{0,123,66},{0,105,55},{0,87,42},{0,68,28},{0,44,7},{0,1,0},{0,158,78},{0,140,70},{0,122,60},{0,105,50},{0,87,38},{0,68,23},{0,45,3},{0,1,0}, +{0,157,224},{0,138,197},{0,120,173},{0,102,148},{0,84,123},{0,64,98},{0,40,69},{0,0,30},{0,156,212},{0,137,188},{0,119,164},{0,102,141},{0,84,117},{0,65,93},{0,41,64},{0,0,26},{0,155,201},{0,137,179},{0,119,156},{0,102,133},{0,84,111},{0,65,88},{0,41,60},{0,0,23},{0,155,192},{0,137,170},{0,119,149},{0,101,126},{0,83,105},{0,65,84},{0,41,56},{0,0,19}, +{0,155,182},{0,137,161},{0,119,141},{0,101,120},{0,83,100},{0,65,79},{0,41,52},{0,0,15},{0,154,172},{0,136,152},{0,119,133},{0,101,114},{0,82,94},{0,65,73},{0,41,48},{0,0,11},{0,154,162},{0,135,144},{0,119,126},{0,101,107},{0,82,88},{0,65,68},{0,41,44},{0,0,7},{0,153,152},{0,135,135},{0,118,119},{0,100,100},{0,82,82},{0,64,63},{0,41,40},{0,0,2}, +{0,152,143},{0,135,127},{0,118,111},{0,100,94},{0,82,76},{0,64,59},{0,41,36},{0,0,0},{0,152,134},{0,134,119},{0,117,104},{0,99,87},{0,81,70},{0,64,54},{0,41,32},{0,0,0},{0,152,125},{0,134,110},{0,117,96},{0,99,80},{0,81,64},{0,64,48},{0,41,27},{0,0,0},{0,152,115},{0,133,101},{0,117,88},{0,100,74},{0,82,58},{0,64,42},{0,41,21},{0,0,0}, +{0,152,104},{0,133,92},{0,117,80},{0,100,66},{0,82,52},{0,64,37},{0,41,16},{0,0,0},{0,151,94},{0,133,82},{0,116,72},{0,99,59},{0,81,46},{0,64,31},{0,41,10},{0,0,0},{0,151,86},{0,133,75},{0,116,65},{0,99,53},{0,81,41},{0,64,26},{0,41,6},{0,0,0},{0,150,78},{0,133,68},{0,116,58},{0,99,48},{0,81,37},{0,64,21},{0,41,2},{0,0,0}, +{0,149,218},{0,131,192},{0,115,169},{0,97,144},{0,79,119},{0,60,94},{0,36,66},{0,0,27},{0,148,206},{0,130,183},{0,114,160},{0,97,137},{0,79,113},{0,61,89},{0,37,62},{0,0,23},{0,148,196},{0,130,174},{0,114,151},{0,97,129},{0,79,107},{0,61,84},{0,37,58},{0,0,19},{0,147,187},{0,130,166},{0,113,144},{0,96,122},{0,79,101},{0,61,80},{0,37,54},{0,0,15}, +{0,147,178},{0,130,157},{0,113,137},{0,96,116},{0,79,96},{0,61,76},{0,37,50},{0,0,11},{0,147,168},{0,129,148},{0,113,129},{0,96,110},{0,78,90},{0,61,71},{0,37,46},{0,0,7},{0,147,158},{0,129,140},{0,113,122},{0,96,104},{0,78,85},{0,61,66},{0,37,42},{0,0,4},{0,146,148},{0,129,131},{0,112,115},{0,96,97},{0,78,80},{0,60,61},{0,37,38},{0,0,1}, +{0,145,139},{0,129,123},{0,112,107},{0,96,91},{0,78,74},{0,60,57},{0,37,34},{0,0,0},{0,145,130},{0,128,115},{0,112,100},{0,95,84},{0,77,68},{0,60,52},{0,37,30},{0,0,0},{0,145,121},{0,128,107},{0,112,93},{0,95,78},{0,77,62},{0,60,46},{0,37,25},{0,0,0},{0,145,111},{0,127,99},{0,111,85},{0,95,72},{0,78,56},{0,60,41},{0,37,20},{0,0,0}, +{0,145,101},{0,127,90},{0,111,77},{0,95,64},{0,78,50},{0,60,36},{0,37,15},{0,0,0},{0,144,91},{0,127,80},{0,111,70},{0,94,57},{0,77,44},{0,60,30},{0,37,9},{0,0,0},{0,144,84},{0,127,73},{0,111,63},{0,94,51},{0,77,39},{0,60,25},{0,37,5},{0,0,0},{0,144,77},{0,127,66},{0,111,57},{0,94,47},{0,77,35},{0,60,20},{0,37,2},{0,0,0}, +{0,141,211},{0,124,187},{0,109,164},{0,92,139},{0,74,115},{0,56,91},{0,32,63},{0,0,24},{0,140,200},{0,123,178},{0,108,155},{0,92,132},{0,74,110},{0,56,86},{0,33,59},{0,0,20},{0,140,190},{0,123,169},{0,108,146},{0,92,124},{0,74,104},{0,56,81},{0,33,55},{0,0,16},{0,139,182},{0,123,161},{0,107,139},{0,91,118},{0,74,98},{0,57,77},{0,33,51},{0,0,12}, +{0,139,173},{0,123,153},{0,107,132},{0,91,113},{0,74,93},{0,57,73},{0,33,47},{0,0,7},{0,139,164},{0,122,144},{0,107,125},{0,91,107},{0,74,87},{0,57,68},{0,34,43},{0,0,4},{0,139,154},{0,122,136},{0,107,118},{0,91,101},{0,74,82},{0,57,63},{0,34,39},{0,0,2},{0,138,144},{0,122,127},{0,106,111},{0,91,94},{0,73,77},{0,56,58},{0,33,35},{0,0,1}, +{0,138,135},{0,122,119},{0,106,104},{0,91,88},{0,73,71},{0,56,54},{0,33,31},{0,0,0},{0,138,126},{0,121,112},{0,106,97},{0,90,81},{0,73,65},{0,56,49},{0,33,27},{0,0,0},{0,138,117},{0,121,104},{0,106,90},{0,90,75},{0,73,60},{0,56,44},{0,33,22},{0,0,0},{0,137,107},{0,121,96},{0,105,82},{0,90,69},{0,73,54},{0,56,39},{0,33,18},{0,0,0}, +{0,137,98},{0,121,87},{0,105,74},{0,90,62},{0,73,49},{0,56,34},{0,33,13},{0,0,0},{0,136,89},{0,120,78},{0,105,67},{0,89,55},{0,73,43},{0,56,28},{0,33,7},{0,0,0},{0,136,82},{0,120,71},{0,105,61},{0,89,50},{0,73,38},{0,56,23},{0,33,5},{0,0,0},{0,137,75},{0,120,64},{0,105,56},{0,89,45},{0,73,33},{0,56,19},{0,33,2},{0,0,0}, +{0,134,204},{0,117,181},{0,102,158},{0,86,134},{0,69,111},{0,52,89},{0,28,61},{0,0,21},{0,133,194},{0,116,172},{0,102,150},{0,86,128},{0,69,106},{0,52,84},{0,29,57},{0,0,17},{0,132,184},{0,116,163},{0,102,142},{0,86,120},{0,69,100},{0,52,79},{0,29,53},{0,0,13},{0,132,176},{0,116,155},{0,101,135},{0,85,114},{0,69,95},{0,52,75},{0,29,49},{0,0,9}, +{0,132,167},{0,116,147},{0,101,128},{0,85,109},{0,69,90},{0,52,70},{0,29,45},{0,0,5},{0,132,158},{0,115,140},{0,101,121},{0,85,103},{0,69,85},{0,52,66},{0,29,41},{0,0,2},{0,132,150},{0,115,132},{0,101,114},{0,85,98},{0,69,80},{0,52,61},{0,29,37},{0,0,1},{0,131,140},{0,115,123},{0,100,107},{0,85,91},{0,68,75},{0,52,56},{0,29,33},{0,0,0}, +{0,130,132},{0,115,115},{0,100,101},{0,85,85},{0,68,69},{0,52,52},{0,29,29},{0,0,0},{0,130,123},{0,114,108},{0,100,94},{0,84,79},{0,68,63},{0,52,47},{0,29,25},{0,0,0},{0,130,114},{0,114,101},{0,100,88},{0,84,73},{0,68,58},{0,52,42},{0,29,20},{0,0,0},{0,130,105},{0,114,93},{0,99,80},{0,84,67},{0,68,52},{0,51,37},{0,29,16},{0,0,0}, +{0,130,96},{0,114,85},{0,99,72},{0,84,60},{0,68,47},{0,51,32},{0,29,11},{0,0,0},{0,129,87},{0,113,76},{0,99,65},{0,84,53},{0,68,41},{0,51,26},{0,29,5},{0,0,0},{0,129,80},{0,113,69},{0,99,59},{0,84,48},{0,68,36},{0,51,21},{0,29,4},{0,0,0},{0,130,73},{0,113,62},{0,99,54},{0,84,43},{0,68,31},{0,52,17},{0,29,2},{0,0,0}, +{0,126,198},{0,109,175},{0,96,152},{0,80,129},{0,64,108},{0,47,86},{0,23,58},{0,0,18},{0,125,188},{0,109,166},{0,96,145},{0,80,123},{0,64,103},{0,47,81},{0,24,54},{0,0,14},{0,124,178},{0,109,158},{0,96,137},{0,80,117},{0,64,97},{0,47,76},{0,24,50},{0,0,10},{0,124,170},{0,109,150},{0,95,131},{0,80,111},{0,64,92},{0,47,72},{0,24,46},{0,0,6}, +{0,124,162},{0,109,142},{0,95,125},{0,80,106},{0,64,87},{0,47,67},{0,24,43},{0,0,2},{0,124,153},{0,109,135},{0,95,118},{0,80,100},{0,64,82},{0,47,63},{0,24,39},{0,0,1},{0,124,145},{0,109,127},{0,95,111},{0,80,95},{0,64,77},{0,47,58},{0,24,35},{0,0,0},{0,123,137},{0,108,119},{0,94,104},{0,79,88},{0,63,72},{0,47,54},{0,24,31},{0,0,0}, +{0,122,129},{0,108,112},{0,94,98},{0,79,82},{0,63,66},{0,47,49},{0,24,27},{0,0,0},{0,122,120},{0,108,105},{0,94,91},{0,79,76},{0,63,61},{0,47,44},{0,24,23},{0,0,0},{0,122,111},{0,108,98},{0,94,85},{0,79,70},{0,63,56},{0,47,40},{0,24,18},{0,0,0},{0,122,102},{0,107,90},{0,93,78},{0,79,64},{0,63,50},{0,46,34},{0,24,13},{0,0,0}, +{0,122,94},{0,107,82},{0,93,70},{0,79,58},{0,63,45},{0,46,29},{0,24,8},{0,0,0},{0,121,85},{0,107,74},{0,93,63},{0,79,51},{0,63,39},{0,46,24},{0,24,4},{0,0,0},{0,121,78},{0,107,67},{0,93,57},{0,79,46},{0,63,34},{0,46,19},{0,24,3},{0,0,0},{0,122,71},{0,107,61},{0,93,52},{0,79,41},{0,63,29},{0,47,15},{0,24,2},{0,0,0}, +{0,118,191},{0,102,168},{0,89,147},{0,75,125},{0,59,105},{0,42,83},{0,18,56},{0,0,15},{0,117,181},{0,102,161},{0,89,140},{0,75,119},{0,59,99},{0,42,78},{0,18,52},{0,0,11},{0,117,172},{0,102,153},{0,89,133},{0,75,113},{0,59,93},{0,42,73},{0,18,48},{0,0,6},{0,117,165},{0,102,145},{0,89,127},{0,75,108},{0,59,89},{0,42,69},{0,18,44},{0,0,3}, +{0,117,157},{0,102,137},{0,89,121},{0,75,103},{0,59,84},{0,42,65},{0,18,41},{0,0,1},{0,116,148},{0,102,130},{0,89,115},{0,75,97},{0,59,79},{0,42,60},{0,18,37},{0,0,0},{0,116,140},{0,102,123},{0,89,108},{0,75,92},{0,59,74},{0,42,55},{0,18,33},{0,0,0},{0,116,133},{0,102,116},{0,88,101},{0,74,86},{0,58,69},{0,42,51},{0,19,30},{0,0,0}, +{0,115,125},{0,102,109},{0,88,95},{0,74,80},{0,58,64},{0,42,47},{0,19,26},{0,0,0},{0,115,116},{0,101,102},{0,88,88},{0,74,74},{0,58,60},{0,42,43},{0,19,22},{0,0,0},{0,115,108},{0,101,95},{0,88,82},{0,74,68},{0,58,54},{0,42,39},{0,19,17},{0,0,0},{0,115,99},{0,101,87},{0,88,76},{0,74,62},{0,58,48},{0,42,33},{0,18,11},{0,0,0}, +{0,115,91},{0,101,79},{0,88,68},{0,74,56},{0,58,43},{0,42,28},{0,18,7},{0,0,0},{0,114,83},{0,101,72},{0,88,61},{0,74,50},{0,58,38},{0,42,23},{0,19,3},{0,0,0},{0,114,76},{0,101,66},{0,88,55},{0,74,45},{0,58,32},{0,42,17},{0,19,2},{0,0,0},{0,115,70},{0,101,60},{0,87,50},{0,73,40},{0,58,27},{0,42,12},{0,19,1},{0,0,0}, +{0,110,185},{0,96,163},{0,83,142},{0,69,121},{0,53,101},{0,36,80},{0,13,54},{0,0,12},{0,109,175},{0,96,156},{0,83,136},{0,69,115},{0,53,95},{0,37,75},{0,13,50},{0,0,8},{0,109,166},{0,96,148},{0,83,129},{0,69,109},{0,53,90},{0,37,71},{0,13,46},{0,0,3},{0,109,159},{0,96,141},{0,83,123},{0,69,104},{0,54,86},{0,38,67},{0,13,42},{0,0,1}, +{0,109,152},{0,96,133},{0,83,117},{0,69,99},{0,54,81},{0,38,63},{0,13,39},{0,0,0},{0,109,144},{0,96,126},{0,83,111},{0,69,93},{0,54,76},{0,38,58},{0,13,35},{0,0,0},{0,109,136},{0,96,119},{0,83,104},{0,69,88},{0,54,71},{0,38,53},{0,13,31},{0,0,0},{0,109,129},{0,96,112},{0,82,97},{0,68,83},{0,54,66},{0,38,49},{0,14,28},{0,0,0}, +{0,109,121},{0,96,106},{0,82,91},{0,68,77},{0,54,62},{0,38,45},{0,14,24},{0,0,0},{0,108,112},{0,95,99},{0,82,86},{0,68,72},{0,54,58},{0,38,41},{0,14,20},{0,0,0},{0,108,105},{0,95,92},{0,82,80},{0,68,66},{0,54,52},{0,38,37},{0,14,15},{0,0,0},{0,108,97},{0,95,85},{0,82,74},{0,68,60},{0,54,46},{0,38,31},{0,13,9},{0,0,0}, +{0,108,89},{0,95,77},{0,82,66},{0,68,54},{0,54,41},{0,38,26},{0,13,6},{0,0,0},{0,108,81},{0,95,70},{0,82,59},{0,68,48},{0,54,36},{0,38,21},{0,14,2},{0,0,0},{0,108,74},{1,95,64},{0,82,53},{0,68,43},{0,54,30},{0,38,15},{0,14,2},{0,0,0},{0,108,68},{2,95,58},{0,81,48},{0,68,38},{0,54,25},{0,38,10},{0,14,1},{0,0,0}, +{0,102,179},{0,89,158},{0,76,138},{0,63,117},{0,47,97},{0,31,77},{0,9,51},{0,0,9},{0,102,170},{0,89,151},{0,76,132},{0,63,112},{0,48,92},{0,32,72},{0,9,47},{0,0,5},{0,102,161},{0,89,143},{0,76,125},{0,63,106},{0,48,87},{0,32,68},{0,9,44},{0,0,1},{0,102,154},{0,89,137},{0,77,119},{0,63,101},{0,49,83},{0,33,64},{0,9,40},{0,0,0}, +{0,102,147},{0,89,129},{0,77,113},{0,63,96},{0,49,78},{0,33,60},{0,9,37},{0,0,0},{0,102,140},{0,89,122},{0,76,107},{0,63,90},{0,49,74},{0,33,56},{0,10,33},{0,0,0},{0,102,132},{0,89,116},{0,76,101},{0,63,85},{0,49,69},{0,33,52},{0,10,30},{0,0,0},{0,102,125},{0,89,109},{0,77,94},{0,63,80},{0,49,64},{0,33,47},{0,10,26},{0,0,0}, +{0,102,117},{0,89,103},{0,77,88},{0,63,74},{0,49,59},{0,33,43},{0,10,22},{0,0,0},{0,101,109},{0,88,96},{0,76,83},{0,63,69},{0,49,55},{0,34,39},{0,10,18},{0,0,0},{0,101,102},{0,88,90},{0,76,77},{0,63,64},{0,49,50},{0,34,35},{0,10,13},{0,0,0},{0,101,96},{0,88,83},{0,76,71},{0,63,58},{0,49,44},{0,34,30},{0,10,8},{0,0,0}, +{0,101,88},{0,88,76},{0,76,65},{0,63,53},{0,49,39},{0,34,25},{0,10,5},{0,0,0},{0,101,79},{0,88,69},{0,76,58},{0,62,47},{0,49,34},{0,34,20},{0,10,2},{0,0,0},{0,101,72},{2,88,62},{0,76,52},{0,62,42},{0,49,29},{0,34,14},{0,10,1},{0,0,0},{1,101,66},{5,88,56},{0,76,47},{0,63,37},{0,49,24},{0,34,9},{0,10,0},{0,0,0}, +{0,94,173},{0,82,153},{0,70,134},{0,57,114},{0,41,94},{0,25,74},{0,6,48},{0,0,6},{0,94,165},{0,82,146},{0,70,127},{0,57,109},{0,42,89},{0,26,69},{0,6,45},{0,0,3},{0,94,156},{0,82,138},{0,70,120},{0,57,103},{0,42,84},{0,26,66},{0,6,42},{0,0,0},{0,94,149},{0,82,132},{0,70,115},{0,57,98},{0,43,80},{0,27,62},{0,6,38},{0,0,0}, +{1,94,142},{0,82,125},{0,70,110},{0,57,93},{0,43,75},{0,27,58},{0,6,34},{0,0,0},{3,94,135},{2,82,119},{0,70,104},{0,57,87},{0,43,71},{0,27,54},{0,7,31},{0,0,0},{5,94,128},{4,82,113},{1,70,98},{0,57,82},{0,43,66},{0,27,49},{0,7,28},{0,0,0},{5,94,121},{4,82,106},{1,71,91},{0,57,77},{0,43,62},{0,28,45},{0,7,24},{0,0,0}, +{6,94,114},{4,82,100},{2,71,86},{0,57,72},{0,43,57},{0,28,41},{0,7,19},{0,0,0},{7,93,106},{5,82,93},{3,70,80},{0,57,67},{0,44,53},{0,29,37},{0,7,15},{0,0,0},{8,93,99},{6,82,87},{4,70,74},{1,57,62},{0,44,48},{0,29,33},{0,7,11},{0,0,0},{9,93,93},{7,82,80},{4,70,68},{1,57,56},{0,44,42},{0,29,28},{0,7,7},{0,0,0}, +{9,93,85},{8,82,73},{5,70,62},{2,57,51},{0,44,37},{0,29,23},{0,7,4},{0,0,0},{10,93,77},{9,82,67},{6,70,56},{2,57,45},{0,44,32},{0,29,17},{0,7,2},{0,0,0},{10,93,70},{11,82,60},{6,70,51},{2,57,40},{0,44,27},{0,29,12},{0,7,1},{0,0,0},{11,93,64},{13,82,54},{6,70,46},{3,57,35},{0,44,23},{0,29,7},{0,7,0},{0,0,0}, +{0,86,167},{0,75,148},{0,63,130},{0,50,111},{0,35,91},{0,18,71},{0,2,46},{0,0,4},{0,86,159},{0,75,141},{0,63,123},{0,50,105},{0,36,86},{0,20,67},{0,3,43},{0,0,1},{0,86,151},{0,75,133},{0,63,116},{0,50,99},{0,36,81},{0,20,64},{0,3,40},{0,0,0},{0,86,144},{0,75,127},{1,63,111},{0,51,94},{0,37,77},{0,21,60},{0,4,36},{0,0,0}, +{2,86,137},{1,75,121},{1,63,106},{0,51,89},{0,37,73},{0,21,56},{0,4,32},{0,0,0},{8,86,131},{6,75,115},{1,64,100},{0,51,84},{0,37,69},{0,21,52},{0,4,29},{0,0,0},{12,86,124},{10,75,109},{2,64,94},{0,51,79},{0,37,64},{0,21,47},{0,4,26},{0,0,0},{13,86,117},{10,75,103},{3,64,89},{0,51,75},{0,37,60},{0,22,43},{0,4,22},{0,0,0}, +{16,86,111},{11,75,97},{5,64,84},{0,51,70},{0,37,55},{0,22,39},{0,4,17},{0,0,0},{19,86,104},{14,75,90},{8,64,78},{1,51,65},{0,38,51},{0,23,35},{0,4,12},{0,0,0},{22,86,97},{16,75,84},{10,64,72},{2,51,60},{0,38,46},{0,23,31},{0,4,9},{0,0,0},{23,86,90},{19,75,78},{11,64,66},{3,51,54},{0,38,41},{0,24,26},{0,5,6},{0,0,0}, +{24,86,83},{22,75,71},{14,64,60},{4,51,49},{0,38,36},{0,24,21},{0,5,3},{0,0,0},{26,86,75},{23,75,65},{16,64,54},{6,51,43},{0,38,30},{0,23,15},{0,4,1},{0,0,0},{27,86,69},{24,75,58},{16,64,49},{6,51,38},{0,38,25},{0,23,10},{0,4,1},{0,0,0},{28,86,63},{24,75,53},{16,64,44},{7,51,34},{0,38,21},{0,23,5},{0,4,0},{0,0,0}, +{12,77,162},{8,67,143},{7,55,126},{3,42,107},{0,27,88},{0,11,68},{0,1,43},{0,0,2},{13,77,154},{10,67,136},{8,55,119},{4,43,102},{1,28,83},{0,12,64},{0,1,40},{0,0,1},{14,77,146},{12,67,128},{8,55,113},{5,43,96},{1,29,78},{0,13,61},{0,1,37},{0,0,0},{14,78,140},{12,67,123},{10,55,108},{5,43,91},{2,30,74},{0,13,57},{0,2,33},{0,0,0}, +{15,78,133},{13,67,117},{10,55,103},{6,43,86},{2,30,70},{0,14,53},{0,2,29},{0,0,0},{20,78,127},{17,67,111},{11,56,97},{6,44,81},{2,31,66},{0,15,49},{0,2,26},{0,0,0},{24,78,121},{20,67,106},{11,56,91},{6,44,76},{2,31,61},{0,15,44},{0,2,23},{0,0,0},{25,78,114},{21,67,100},{12,56,86},{6,45,72},{2,31,57},{0,16,40},{0,2,19},{0,0,0}, +{27,78,108},{22,67,94},{14,56,81},{6,45,68},{2,31,53},{0,16,36},{0,2,14},{0,0,0},{30,78,101},{24,67,87},{16,56,75},{7,45,63},{2,32,48},{0,17,32},{0,2,10},{0,0,0},{32,78,94},{26,67,81},{17,56,69},{8,45,57},{2,32,43},{0,17,28},{0,2,7},{0,0,0},{33,78,87},{28,67,75},{19,56,63},{10,45,51},{2,32,39},{0,17,24},{0,3,5},{0,0,0}, +{34,78,80},{30,67,69},{21,56,57},{10,45,46},{2,32,34},{0,17,19},{0,3,3},{0,0,0},{36,78,73},{31,67,62},{23,56,52},{12,45,41},{2,33,29},{0,17,13},{0,2,1},{0,0,0},{37,78,67},{32,67,57},{23,56,47},{12,45,37},{2,33,24},{0,17,9},{0,2,1},{0,0,0},{38,78,61},{32,67,52},{24,56,43},{12,45,33},{2,33,20},{0,17,5},{0,2,0},{0,0,0}, +{28,68,156},{19,58,138},{17,47,122},{7,35,103},{0,20,84},{0,5,65},{0,0,40},{0,0,0},{31,68,149},{23,58,131},{19,48,115},{9,36,98},{2,21,80},{0,5,61},{0,0,36},{0,0,0},{33,68,142},{27,58,124},{20,48,109},{11,36,92},{3,22,75},{0,5,57},{0,0,33},{0,0,0},{33,69,136},{28,59,119},{22,48,104},{12,36,88},{4,23,71},{0,6,53},{0,0,29},{0,0,0}, +{33,69,129},{28,59,113},{22,48,99},{13,36,83},{4,23,67},{0,7,50},{0,0,26},{0,0,0},{34,70,123},{29,59,107},{23,49,93},{14,37,78},{4,24,62},{0,8,46},{0,0,23},{0,0,0},{36,70,117},{32,59,102},{23,49,88},{15,37,73},{4,24,58},{0,8,42},{0,0,19},{0,0,0},{37,70,110},{33,59,96},{24,49,83},{14,38,69},{4,25,54},{0,9,38},{0,1,15},{0,0,0}, +{39,70,104},{34,59,90},{24,49,78},{14,38,65},{4,25,50},{0,9,34},{0,1,11},{0,0,0},{41,70,97},{34,59,85},{25,49,73},{14,38,60},{4,26,46},{0,10,30},{0,1,8},{0,0,0},{41,70,91},{35,59,79},{26,49,67},{15,38,55},{4,26,41},{0,10,26},{0,1,6},{0,0,0},{42,70,85},{36,60,73},{28,49,61},{17,38,49},{5,26,37},{0,10,22},{0,1,4},{0,0,0}, +{43,70,78},{36,60,67},{28,49,55},{17,38,44},{5,26,32},{0,10,17},{0,1,2},{0,0,0},{44,70,71},{37,60,60},{29,49,50},{18,39,40},{5,27,27},{0,11,11},{0,1,1},{0,0,0},{45,70,65},{38,60,55},{29,49,45},{18,39,35},{5,27,23},{0,11,8},{0,1,1},{0,0,0},{46,70,59},{39,60,50},{30,49,41},{18,39,31},{6,28,19},{0,11,5},{0,1,0},{0,0,0}, +{37,58,151},{30,49,133},{25,38,118},{14,25,100},{5,12,82},{0,2,63},{0,0,38},{0,0,0},{40,58,144},{33,49,127},{27,39,112},{17,26,95},{6,12,78},{1,2,59},{0,0,35},{0,0,0},{41,58,137},{36,49,120},{27,39,106},{18,26,89},{7,13,73},{1,2,56},{0,0,32},{0,0,0},{41,59,131},{36,50,115},{29,39,101},{19,27,85},{8,14,69},{1,3,52},{0,0,28},{0,0,0}, +{41,60,125},{36,50,110},{29,39,96},{20,27,80},{8,14,65},{1,3,48},{0,0,25},{0,0,0},{42,61,119},{37,50,104},{30,40,90},{20,28,76},{8,15,60},{1,4,44},{0,0,21},{0,0,0},{44,61,113},{38,50,99},{30,40,85},{20,29,71},{8,15,56},{1,4,40},{0,0,17},{0,0,0},{45,61,107},{38,51,93},{30,41,81},{20,30,67},{9,16,52},{1,4,36},{0,1,13},{0,0,0}, +{46,61,101},{39,51,88},{30,41,76},{20,30,63},{9,16,48},{1,4,32},{0,1,10},{0,0,0},{47,61,95},{40,51,83},{31,41,71},{20,30,58},{9,17,44},{1,5,29},{0,1,7},{0,0,0},{47,61,89},{41,51,77},{31,41,66},{21,30,53},{9,17,40},{1,5,25},{0,1,5},{0,0,0},{47,62,83},{41,52,71},{33,41,60},{23,30,48},{10,18,36},{1,5,20},{0,1,3},{0,0,0}, +{48,62,76},{41,52,65},{33,41,54},{23,30,43},{10,18,31},{1,5,15},{0,1,2},{0,0,0},{49,62,69},{42,52,59},{34,41,48},{23,31,38},{9,19,26},{1,6,10},{0,1,1},{0,0,0},{49,62,64},{42,52,54},{34,41,44},{23,31,34},{10,19,21},{1,6,7},{0,1,1},{0,0,0},{50,62,58},{43,52,49},{35,41,40},{23,31,30},{11,20,17},{2,6,4},{0,1,0},{0,0,0}, +{46,48,146},{41,39,129},{33,29,114},{23,15,97},{10,3,79},{1,0,60},{0,0,36},{0,0,0},{47,48,139},{42,39,123},{34,29,108},{24,16,92},{11,3,75},{2,0,57},{0,0,33},{0,0,0},{48,48,132},{43,39,116},{34,29,102},{25,16,86},{12,3,70},{2,0,54},{0,0,30},{0,0,0},{48,49,127},{43,40,111},{35,30,97},{26,17,82},{13,4,66},{2,0,50},{0,0,26},{0,0,0}, +{48,50,121},{43,40,106},{35,30,92},{26,18,77},{13,5,62},{2,0,46},{0,0,23},{0,0,0},{49,51,115},{44,41,100},{35,31,87},{25,19,73},{13,5,58},{2,0,42},{0,0,19},{0,0,0},{50,51,109},{44,41,95},{35,31,82},{25,20,69},{13,5,54},{2,0,38},{0,0,15},{0,0,0},{51,52,103},{43,42,90},{35,32,78},{25,21,65},{14,6,50},{3,0,34},{0,0,11},{0,0,0}, +{52,52,97},{44,42,85},{35,32,74},{25,21,61},{14,7,46},{3,0,30},{0,0,8},{0,0,0},{52,52,92},{45,43,80},{36,33,69},{26,22,56},{14,8,42},{3,1,27},{0,0,6},{0,0,0},{52,52,86},{46,43,74},{36,33,64},{27,22,51},{14,8,38},{3,1,23},{0,0,4},{0,0,0},{52,53,80},{45,43,68},{37,34,58},{28,23,46},{15,9,34},{3,1,18},{0,0,2},{0,0,0}, +{52,53,73},{45,43,63},{37,34,52},{28,23,41},{15,9,29},{3,1,13},{0,0,1},{0,0,0},{53,53,67},{46,43,57},{38,33,46},{28,23,36},{14,10,24},{3,1,8},{0,0,0},{0,0,0},{53,53,62},{46,43,52},{38,33,42},{28,23,32},{15,10,19},{3,1,5},{0,0,0},{0,0,0},{54,53,57},{47,44,48},{39,34,38},{28,24,28},{16,11,15},{4,2,3},{0,0,0},{0,0,0}}; +// START + +#define PC (16*16*8) +#define PM ( 16*8) +#define PY ( 8) +#define PK ( 1) +#define RC (7) +#define RM (15) +#define RY (15) +#define RK (7) + +static inline double clip01(double x) { + return (x < 0) ? 0 : ((x > 1) ? 1 : x); +} + +void old_getRGB(GfxColor *color, GfxRGB *rgb) +{ + double c, m, y, aw, ac, am, ay, ar, ag, ab; + + c = clip01(color->c[0] + color->c[3]); + m = clip01(color->c[1] + color->c[3]); + y = clip01(color->c[2] + color->c[3]); + aw = (1-c) * (1-m) * (1-y); + ac = c * (1-m) * (1-y); + am = (1-c) * m * (1-y); + ay = (1-c) * (1-m) * y; + ar = (1-c) * m * y; + ag = c * (1-m) * y; + ab = c * m * (1-y); + rgb->r = clip01(aw + 0.9137*am + 0.9961*ay + 0.9882*ar); + rgb->g = clip01(aw + 0.6196*ac + ay + 0.5176*ag); + rgb->b = clip01(aw + 0.7804*ac + 0.5412*am + 0.0667*ar + 0.2118*ag + 0.4863*ab); +} + +int check(float c, float m, float y, float k, float r, float g, float b) +{ + GfxRGB rgb2; + memset(&rgb2,0,sizeof(GfxRGB)); + GfxColor col; + col.c[0] = c; + col.c[1] = m; + col.c[2] = y; + col.c[3] = k; + old_getRGB(&col, &rgb2); + + double dr = r - rgb2.r; + double dg = g - rgb2.g; + double db = b - rgb2.b; + if(sqrt(dr*dr+dg*dg+db*db) > 0.5) { + printf("%f %f %f %f -> %02x%02x%02x / %02x%02x%02x\n", + c,m,y,k, + (int)(r*255),(int)(g*255),(int)(b*255), + (int)(rgb2.r*255), (int)(rgb2.g*255), (int)(rgb2.b*255)); + return 0; + } + return 1; +} +void convert_cmyk2rgb(float c,float m,float y,float k, unsigned char*r, unsigned char*g, unsigned char*b) +{ + c = c<0?0:(c>1?1:c<=1?c:0.5); + m = m<0?0:(m>1?1:m<=1?m:0.5); + y = y<0?0:(y>1?1:y<=1?y:0.5); + k = k<0?0:(k>1?1:k<=1?k:0.5); + + int cc = (int)(c*7.0); + int mm = (int)(m*15.0); + int yy = (int)(y*15.0); + int kk = (int)(k*7.0); + + float rc = c*7.0 - cc; + float rm = m*15.0 - mm; + float ry = y*15.0 - yy; + float rk = k*7.0 - kk; + + int pp = cc*PC + mm*PM + yy*PY + kk*PK; + int pc = cc>=RC?pp:pp + PC; + int pm = mm>=RM?pp:pp + PM; + int py = yy>=RY?pp:pp + PY; + int pk = kk>=RK?pp:pp + PK; + + int rr = (int)((int)cmyk2rgb[pp].r + + ((int)cmyk2rgb[pc].r - (int)cmyk2rgb[pp].r)*rc + + ((int)cmyk2rgb[pm].r - (int)cmyk2rgb[pp].r)*rm + + ((int)cmyk2rgb[py].r - (int)cmyk2rgb[pp].r)*ry + + ((int)cmyk2rgb[pk].r - (int)cmyk2rgb[pp].r)*rk); + int gg = (int)((int)cmyk2rgb[pp].g + + ((int)cmyk2rgb[pc].g - (int)cmyk2rgb[pp].g)*rc + + ((int)cmyk2rgb[pm].g - (int)cmyk2rgb[pp].g)*rm + + ((int)cmyk2rgb[py].g - (int)cmyk2rgb[pp].g)*ry + + ((int)cmyk2rgb[pk].g - (int)cmyk2rgb[pp].g)*rk); + int bb = (int)((int)cmyk2rgb[pp].b + + ((int)cmyk2rgb[pc].b - (int)cmyk2rgb[pp].b)*rc + + ((int)cmyk2rgb[pm].b - (int)cmyk2rgb[pp].b)*rm + + ((int)cmyk2rgb[py].b - (int)cmyk2rgb[pp].b)*ry + + ((int)cmyk2rgb[pk].b - (int)cmyk2rgb[pp].b)*rk); + *r = rr<0?0:(rr>255?255:rr); + *g = gg<0?0:(gg>255?255:gg); + *b = bb<0?0:(bb>255?255:bb); + + int t; + float r2=0,g2=0,b2=0; + for(t=0;t<16;t++) { + int p2 = pp; + if(t&1) p2+=(pc-pp); + if(t&2) p2+=(pm-pp); + if(t&4) p2+=(py-pp); + if(t&8) p2+=(pk-pp); + float rrc = t&1?rc:1-rc; + float rrm = t&2?rm:1-rm; + float rry = t&4?ry:1-ry; + float rrk = t&8?rk:1-rk; + float f = rrc*rrm*rry*rrk; + r2 += cmyk2rgb[p2].r*f; + g2 += cmyk2rgb[p2].g*f; + b2 += cmyk2rgb[p2].b*f; + } + + if(r2<0)r2=0; if(r2>255)r2=255; + if(g2<0)g2=0; if(g2>255)g2=255; + if(b2<0)b2=0; if(b2>255)b2=255; + + *r = (unsigned char)r2; + *g = (unsigned char)g2; + *b = (unsigned char)b2; + + /*f(!check(c,m,y,k, *r/255.0, *g/255.0, *b/255.0)) { + for(t=0;t<16;t++) { + int p2 = pp; + if(t&1) p2+=(pc-pp); + if(t&2) p2+=(pm-pp); + if(t&4) p2+=(py-pp); + if(t&8) p2+=(pk-pp); + float rrc = t&1?rc:1-rc; + float rrm = t&2?rm:1-rm; + float rry = t&4?ry:1-ry; + float rrk = t&8?rk:1-rk; + float f = rrc*rrm*rry*rrk; + //printf("%d%d%d%d %f %02x%02x%02x\n", !!(t&8),!!(t&4),!!(t&2),!!(t&1), f, cmyk2rgb[p2].r, cmyk2rgb[p2].g, cmyk2rgb[p2].b); + } + }*/ +} + +// END diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h new file mode 100644 index 000000000..1efb467dc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h @@ -0,0 +1,4 @@ +#ifndef __cmyk_h__ +#define __cmyk_h__ +void convert_cmyk2rgb(float c,float m,float y,float k, unsigned char*r, unsigned char*g, unsigned char*b); +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c b/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c new file mode 100644 index 000000000..eeb83c659 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c @@ -0,0 +1,26585 @@ +#include "fonts.h" + +int d050000l_afm_len = 9381; +char* d050000l_afm = +"StartFontMetrics 3.0\nComment Copyright URW Software, Copyright 1997 by URW\nCom" +"ment Creation Date: 10/19/1999\nComment See the file COPYING (GNU General Public" +" License) for license conditions.\nFontName Dingbats\nFullName Dingbats \nFamily" +"Name Dingbats\nWeight Regular\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePos" +"ition -72\nUnderlineThickness 36\nVersion 001.005\nNotice URW Software, Copyrigh" +"t 1997 by URW\nEncodingScheme FontSpecific\nFontBBox -1 -143 981 819\nCapHeight " +"691\nXHeight 567\nDescender -143\nAscender 691\nStartCharMetrics 203\nC 32 ; WX " +"278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 974 ; N a1 ; B 35 71 939 617 ;\nC 34 ; WX" +" 961 ; N a2 ; B 35 81 927 611 ;\nC 35 ; WX 974 ; N a202 ; B 35 69 939 615 ;\nC 3" +"6 ; WX 980 ; N a3 ; B 35 0 945 691 ;\nC 37 ; WX 719 ; N a4 ; B 34 138 685 566 ;\n" +"C 38 ; WX 789 ; N a5 ; B 35 -13 755 707 ;\nC 39 ; WX 790 ; N a119 ; B 35 -14 755" +" 706 ;\nC 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;\nC 41 ; WX 690 ; N a117 ; B " +"35 137 655 556 ;\nC 42 ; WX 960 ; N a11 ; B 35 122 925 568 ;\nC 43 ; WX 939 ; N " +"a12 ; B 35 133 904 559 ;\nC 44 ; WX 549 ; N a13 ; B 29 -10 516 706 ;\nC 45 ; WX " +"855 ; N a14 ; B 33 59 820 632 ;\nC 46 ; WX 911 ; N a15 ; B 35 51 876 641 ;\nC 47" +" ; WX 933 ; N a16 ; B 35 141 899 550 ;\nC 48 ; WX 911 ; N a105 ; B 35 49 876 636" +" ;\nC 49 ; WX 945 ; N a17 ; B 35 139 909 550 ;\nC 50 ; WX 974 ; N a18 ; B 35 103" +" 938 588 ;\nC 51 ; WX 755 ; N a19 ; B 34 -14 721 706 ;\nC 52 ; WX 846 ; N a20 ; " +"B 36 -14 811 706 ;\nC 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;\nC 54 ; WX 761 ; N " +"a22 ; B 35 0 727 692 ;\nC 55 ; WX 571 ; N a23 ; B -1 -69 572 660 ;\nC 56 ; WX 67" +"7 ; N a24 ; B 36 -14 642 705 ;\nC 57 ; WX 763 ; N a25 ; B 35 0 728 694 ;\nC 58 ;" +" WX 760 ; N a26 ; B 35 0 726 691 ;\nC 59 ; WX 759 ; N a27 ; B 35 0 725 690 ;\nC " +"60 ; WX 754 ; N a28 ; B 35 0 720 685 ;\nC 61 ; WX 494 ; N a6 ; B 35 0 460 691 ;\n" +"C 62 ; WX 552 ; N a7 ; B 35 0 517 691 ;\nC 63 ; WX 537 ; N a8 ; B 35 0 503 691 ;" +"\nC 64 ; WX 577 ; N a9 ; B 35 96 542 595 ;\nC 65 ; WX 692 ; N a10 ; B 35 -14 657" +" 702 ;\nC 66 ; WX 786 ; N a29 ; B 35 -13 751 705 ;\nC 67 ; WX 788 ; N a30 ; B 35" +" -14 752 703 ;\nC 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;\nC 69 ; WX 790 ; N a3" +"2 ; B 35 -14 756 707 ;\nC 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;\nC 71 ; WX 79" +"4 ; N a34 ; B 35 -14 759 705 ;\nC 72 ; WX 816 ; N a35 ; B 35 -13 782 707 ;\nC 73" +" ; WX 823 ; N a36 ; B 35 2 787 719 ;\nC 74 ; WX 789 ; N a37 ; B 35 -13 754 706 ;" +"\nC 75 ; WX 841 ; N a38 ; B 35 -14 807 706 ;\nC 76 ; WX 823 ; N a39 ; B 35 -12 7" +"89 706 ;\nC 77 ; WX 833 ; N a40 ; B 35 -14 798 706 ;\nC 78 ; WX 816 ; N a41 ; B " +"35 -13 782 705 ;\nC 79 ; WX 831 ; N a42 ; B 35 -13 796 707 ;\nC 80 ; WX 923 ; N " +"a43 ; B 35 -13 888 706 ;\nC 81 ; WX 744 ; N a44 ; B 35 0 710 691 ;\nC 82 ; WX 72" +"3 ; N a45 ; B 35 0 688 691 ;\nC 83 ; WX 749 ; N a46 ; B 35 0 714 691 ;\nC 84 ; W" +"X 790 ; N a47 ; B 34 -15 756 706 ;\nC 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;\n" +"C 86 ; WX 695 ; N a49 ; B 35 -16 661 706 ;\nC 87 ; WX 776 ; N a50 ; B 35 -7 741 " +"698 ;\nC 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;\nC 89 ; WX 792 ; N a52 ; B 35 -" +"1 757 720 ;\nC 90 ; WX 759 ; N a53 ; B 35 0 725 693 ;\nC 91 ; WX 707 ; N a54 ; B" +" 35 -11 672 704 ;\nC 92 ; WX 708 ; N a55 ; B 35 -14 672 704 ;\nC 93 ; WX 682 ; N" +" a56 ; B 35 -3 647 694 ;\nC 94 ; WX 701 ; N a57 ; B 35 -13 666 708 ;\nC 95 ; WX " +"826 ; N a58 ; B 35 -18 791 716 ;\nC 96 ; WX 815 ; N a59 ; B 35 -16 780 705 ;\nC " +"97 ; WX 789 ; N a60 ; B 35 -14 754 704 ;\nC 98 ; WX 789 ; N a61 ; B 35 -14 754 7" +"04 ;\nC 99 ; WX 707 ; N a62 ; B 33 0 674 717 ;\nC 100 ; WX 687 ; N a63 ; B 36 0 " +"651 688 ;\nC 101 ; WX 696 ; N a64 ; B 35 0 661 693 ;\nC 102 ; WX 689 ; N a65 ; B" +" 35 0 655 681 ;\nC 103 ; WX 786 ; N a66 ; B 34 -14 751 703 ;\nC 104 ; WX 787 ; N" +" a67 ; B 35 -15 752 704 ;\nC 105 ; WX 713 ; N a68 ; B 35 -13 678 709 ;\nC 106 ; " +"WX 791 ; N a69 ; B 35 -14 756 707 ;\nC 107 ; WX 785 ; N a70 ; B 36 -14 751 701 ;" +"\nC 108 ; WX 791 ; N a71 ; B 35 -14 757 708 ;\nC 109 ; WX 873 ; N a72 ; B 35 -13" +" 838 705 ;\nC 110 ; WX 761 ; N a73 ; B 35 0 726 691 ;\nC 111 ; WX 762 ; N a74 ; " +"B 35 0 727 691 ;\nC 112 ; WX 762 ; N a203 ; B 35 0 727 691 ;\nC 113 ; WX 759 ; N" +" a75 ; B 35 0 725 691 ;\nC 114 ; WX 759 ; N a204 ; B 35 0 725 691 ;\nC 115 ; WX " +"892 ; N a76 ; B 35 0 858 706 ;\nC 116 ; WX 892 ; N a77 ; B 35 -14 858 691 ;\nC 1" +"17 ; WX 788 ; N a78 ; B 35 -14 754 705 ;\nC 118 ; WX 784 ; N a79 ; B 35 -14 749 " +"705 ;\nC 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;\nC 120 ; WX 138 ; N a82 ; B 3" +"5 0 104 691 ;\nC 121 ; WX 277 ; N a83 ; B 35 0 242 691 ;\nC 122 ; WX 415 ; N a84" +" ; B 35 0 380 691 ;\nC 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;\nC 124 ; WX 392" +" ; N a98 ; B 34 262 357 705 ;\nC 125 ; WX 668 ; N a99 ; B 35 263 633 707 ;\nC 12" +"6 ; WX 668 ; N a100 ; B 36 261 634 705 ;\nC 161 ; WX 732 ; N a101 ; B 35 -143 69" +"7 805 ;\nC 162 ; WX 544 ; N a102 ; B 56 -14 488 705 ;\nC 163 ; WX 544 ; N a103 ;" +" B 34 -14 508 704 ;\nC 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;\nC 165 ; WX 667" +" ; N a106 ; B 35 -13 633 706 ;\nC 166 ; WX 760 ; N a107 ; B 35 -13 726 705 ;\nC " +"167 ; WX 760 ; N a108 ; B 0 121 758 570 ;\nC 168 ; WX 776 ; N a112 ; B 35 0 741 " +"705 ;\nC 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;\nC 170 ; WX 694 ; N a110 ; B" +" 35 -14 659 704 ;\nC 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;\nC 172 ; WX 788 ; " +"N a120 ; B 35 -13 754 706 ;\nC 173 ; WX 788 ; N a121 ; B 35 -13 754 706 ;\nC 174" +" ; WX 788 ; N a122 ; B 35 -13 754 706 ;\nC 175 ; WX 788 ; N a123 ; B 35 -14 754 " +"705 ;\nC 176 ; WX 788 ; N a124 ; B 35 -13 754 706 ;\nC 177 ; WX 788 ; N a125 ; B" +" 35 -13 754 706 ;\nC 178 ; WX 788 ; N a126 ; B 35 -13 754 706 ;\nC 179 ; WX 788 " +"; N a127 ; B 35 -13 754 706 ;\nC 180 ; WX 788 ; N a128 ; B 35 -13 754 706 ;\nC 1" +"81 ; WX 788 ; N a129 ; B 35 -13 754 706 ;\nC 182 ; WX 788 ; N a130 ; B 35 -13 75" +"4 706 ;\nC 183 ; WX 788 ; N a131 ; B 35 -13 754 706 ;\nC 184 ; WX 788 ; N a132 ;" +" B 35 -13 754 706 ;\nC 185 ; WX 788 ; N a133 ; B 35 -13 754 706 ;\nC 186 ; WX 78" +"8 ; N a134 ; B 35 -13 754 706 ;\nC 187 ; WX 788 ; N a135 ; B 35 -13 754 706 ;\nC" +" 188 ; WX 788 ; N a136 ; B 35 -13 754 706 ;\nC 189 ; WX 788 ; N a137 ; B 35 -13 " +"754 706 ;\nC 190 ; WX 788 ; N a138 ; B 35 -13 754 706 ;\nC 191 ; WX 788 ; N a139" +" ; B 35 -13 754 706 ;\nC 192 ; WX 788 ; N a140 ; B 35 -13 754 706 ;\nC 193 ; WX " +"788 ; N a141 ; B 35 -13 754 706 ;\nC 194 ; WX 788 ; N a142 ; B 35 -13 754 706 ;\n" +"C 195 ; WX 788 ; N a143 ; B 35 -13 754 706 ;\nC 196 ; WX 788 ; N a144 ; B 35 -13" +" 754 706 ;\nC 197 ; WX 788 ; N a145 ; B 35 -13 754 706 ;\nC 198 ; WX 788 ; N a14" +"6 ; B 35 -13 754 706 ;\nC 199 ; WX 788 ; N a147 ; B 35 -13 754 706 ;\nC 200 ; WX" +" 788 ; N a148 ; B 35 -13 754 706 ;\nC 201 ; WX 788 ; N a149 ; B 35 -13 754 706 ;" +"\nC 202 ; WX 788 ; N a150 ; B 35 -13 755 706 ;\nC 203 ; WX 788 ; N a151 ; B 34 -" +"13 754 706 ;\nC 204 ; WX 788 ; N a152 ; B 34 -13 754 706 ;\nC 205 ; WX 788 ; N a" +"153 ; B 35 -13 754 706 ;\nC 206 ; WX 788 ; N a154 ; B 35 -13 754 706 ;\nC 207 ; " +"WX 788 ; N a155 ; B 35 -13 754 706 ;\nC 208 ; WX 788 ; N a156 ; B 35 -13 754 706" +" ;\nC 209 ; WX 788 ; N a157 ; B 35 -13 754 706 ;\nC 210 ; WX 788 ; N a158 ; B 35" +" -13 754 706 ;\nC 211 ; WX 788 ; N a159 ; B 35 -13 754 706 ;\nC 212 ; WX 894 ; N" +" a160 ; B 35 58 860 634 ;\nC 213 ; WX 838 ; N a161 ; B 35 151 803 537 ;\nC 214 ;" +" WX 1016 ; N a163 ; B 34 151 981 537 ;\nC 215 ; WX 458 ; N a164 ; B 35 -128 422 " +"819 ;\nC 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;\nC 217 ; WX 924 ; N a165 ; B " +"35 140 890 551 ;\nC 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;\nC 219 ; WX 918 ; " +"N a166 ; B 35 167 884 526 ;\nC 220 ; WX 927 ; N a167 ; B 35 28 892 664 ;\nC 221 " +"; WX 928 ; N a168 ; B 35 129 891 562 ;\nC 222 ; WX 928 ; N a169 ; B 35 129 893 5" +"61 ;\nC 223 ; WX 834 ; N a170 ; B 35 154 799 537 ;\nC 224 ; WX 873 ; N a171 ; B " +"35 97 838 594 ;\nC 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;\nC 226 ; WX 924 ; " +"N a173 ; B 35 82 889 610 ;\nC 227 ; WX 924 ; N a162 ; B 35 82 889 610 ;\nC 228 ;" +" WX 917 ; N a174 ; B 35 4 882 688 ;\nC 229 ; WX 930 ; N a175 ; B 35 83 896 608 ;" +"\nC 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;\nC 231 ; WX 463 ; N a177 ; B 35 -1" +"00 429 790 ;\nC 232 ; WX 883 ; N a178 ; B 35 70 848 621 ;\nC 233 ; WX 836 ; N a1" +"79 ; B 35 43 802 648 ;\nC 234 ; WX 836 ; N a193 ; B 35 43 802 648 ;\nC 235 ; WX " +"867 ; N a180 ; B 35 101 832 589 ;\nC 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;\n" +"C 237 ; WX 696 ; N a181 ; B 35 44 661 651 ;\nC 238 ; WX 696 ; N a200 ; B 35 44 6" +"61 646 ;\nC 239 ; WX 874 ; N a182 ; B 35 75 840 613 ;\nC 241 ; WX 874 ; N a201 ;" +" B 35 75 840 613 ;\nC 242 ; WX 760 ; N a183 ; B 35 1 725 690 ;\nC 243 ; WX 946 ;" +" N a184 ; B 35 159 911 532 ;\nC 244 ; WX 771 ; N a197 ; B 34 36 736 655 ;\nC 245" +" ; WX 865 ; N a185 ; B 35 209 830 483 ;\nC 246 ; WX 771 ; N a194 ; B 34 36 736 6" +"55 ;\nC 247 ; WX 888 ; N a198 ; B 34 -18 853 711 ;\nC 248 ; WX 967 ; N a186 ; B " +"35 123 932 568 ;\nC 249 ; WX 888 ; N a195 ; B 34 -20 853 710 ;\nC 250 ; WX 831 ;" +" N a187 ; B 35 113 796 578 ;\nC 251 ; WX 873 ; N a188 ; B 36 116 838 576 ;\nC 25" +"2 ; WX 927 ; N a189 ; B 35 149 891 542 ;\nC 253 ; WX 970 ; N a190 ; B 35 75 931 " +"615 ;\nC 254 ; WX 918 ; N a191 ; B 34 99 884 592 ;\nC -1 ; WX 334 ; N a95 ; B 35" +" 0 299 691 ;\nC -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ;\nC -1 ; WX 234 ; N a87 " +"; B 35 -14 199 705 ;\nC -1 ; WX 410 ; N a86 ; B 35 0 375 691 ;\nC -1 ; WX 410 ; " +"N a206 ; B 35 0 375 691 ;\nC -1 ; WX 509 ; N a85 ; B 35 0 475 691 ;\nC -1 ; WX 3" +"34 ; N a96 ; B 35 0 299 691 ;\nC -1 ; WX 276 ; N a91 ; B 35 0 242 691 ;\nC -1 ; " +"WX 317 ; N a94 ; B 35 0 283 691 ;\nC -1 ; WX 317 ; N a93 ; B 35 0 283 691 ;\nC -" +"1 ; WX 390 ; N a90 ; B 35 -14 355 705 ;\nC -1 ; WX 390 ; N a89 ; B 35 -14 356 70" +"5 ;\nC -1 ; WX 276 ; N a92 ; B 35 0 242 691 ;\nC -1 ; WX 509 ; N a205 ; B 35 0 4" +"75 691 ;\nC -1 ; WX 278 ; N .notdef ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetric" +"s\n" +; +int d050000l_pfb_len = 45955; +char* d050000l_pfb = +"\x80\x1\xb6\x12\x0\x0%!PS-AdobeFont-1.0: Dingbats 001.005\n%%CreationDate: Tue O" +"ct 19 1999\n% Copyright URW Software, Copyright 1997 by URW\n% URW Software, Cop" +"yright 1997 by URW\n% See the file COPYING (GNU General Public License) for lice" +"nse conditions.\n% As a special exception, permission is granted to include this" +" font\n% program in a Postscript or PDF file that consists of a document that\n%" +" contains text to be displayed or printed using this font, regardless\n% of the " +"conditions or license applying to the document itself.\n12 dict begin\n/FontInfo" +" 10 dict dup begin\n/version (001.005) readonly def\n/Notice (URW Software, Copy" +"right 1997 by URW. See the file COPYING (GNU General Public License) for license" +" conditions. As a special exception, permission is granted to include this font " +"program in a Postscript or PDF file that consists of a document that contains te" +"xt to be displayed or printed using this font, regardless of the conditions or l" +"icense applying to the document itself.) readonly def\n/Copyright (Copyright URW" +" Software, Copyright 1997 by URW) readonly def\n/FullName (Dingbats ) readonly d" +"ef\n/FamilyName (Dingbats) readonly def\n/Weight (Regular) readonly def\n/Italic" +"Angle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -72 def\n/UnderlineTh" +"ickness 36 def\nend readonly def\n/FontName /Dingbats def\n/PaintType 0 def\n/WM" +"ode 0 def\n/FontBBox {-1 -143 981 819} readonly def\n/FontType 1 def\n/FontMatri" +"x [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding 256 array \n0 1 255 {1 i" +"ndex exch /.notdef put} for \ndup 32 /space put\ndup 33 /a1 put\ndup 34 /a2 put\n" +"dup 35 /a202 put\ndup 36 /a3 put\ndup 37 /a4 put\ndup 38 /a5 put\ndup 39 /a119 p" +"ut\ndup 40 /a118 put\ndup 41 /a117 put\ndup 42 /a11 put\ndup 43 /a12 put\ndup 44" +" /a13 put\ndup 45 /a14 put\ndup 46 /a15 put\ndup 47 /a16 put\ndup 48 /a105 put\n" +"dup 49 /a17 put\ndup 50 /a18 put\ndup 51 /a19 put\ndup 52 /a20 put\ndup 53 /a21 " +"put\ndup 54 /a22 put\ndup 55 /a23 put\ndup 56 /a24 put\ndup 57 /a25 put\ndup 58 " +"/a26 put\ndup 59 /a27 put\ndup 60 /a28 put\ndup 61 /a6 put\ndup 62 /a7 put\ndup " +"63 /a8 put\ndup 64 /a9 put\ndup 65 /a10 put\ndup 66 /a29 put\ndup 67 /a30 put\nd" +"up 68 /a31 put\ndup 69 /a32 put\ndup 70 /a33 put\ndup 71 /a34 put\ndup 72 /a35 p" +"ut\ndup 73 /a36 put\ndup 74 /a37 put\ndup 75 /a38 put\ndup 76 /a39 put\ndup 77 /" +"a40 put\ndup 78 /a41 put\ndup 79 /a42 put\ndup 80 /a43 put\ndup 81 /a44 put\ndup" +" 82 /a45 put\ndup 83 /a46 put\ndup 84 /a47 put\ndup 85 /a48 put\ndup 86 /a49 put" +"\ndup 87 /a50 put\ndup 88 /a51 put\ndup 89 /a52 put\ndup 90 /a53 put\ndup 91 /a5" +"4 put\ndup 92 /a55 put\ndup 93 /a56 put\ndup 94 /a57 put\ndup 95 /a58 put\ndup 9" +"6 /a59 put\ndup 97 /a60 put\ndup 98 /a61 put\ndup 99 /a62 put\ndup 100 /a63 put\n" +"dup 101 /a64 put\ndup 102 /a65 put\ndup 103 /a66 put\ndup 104 /a67 put\ndup 105 " +"/a68 put\ndup 106 /a69 put\ndup 107 /a70 put\ndup 108 /a71 put\ndup 109 /a72 put" +"\ndup 110 /a73 put\ndup 111 /a74 put\ndup 112 /a203 put\ndup 113 /a75 put\ndup 1" +"14 /a204 put\ndup 115 /a76 put\ndup 116 /a77 put\ndup 117 /a78 put\ndup 118 /a79" +" put\ndup 119 /a81 put\ndup 120 /a82 put\ndup 121 /a83 put\ndup 122 /a84 put\ndu" +"p 123 /a97 put\ndup 124 /a98 put\ndup 125 /a99 put\ndup 126 /a100 put\ndup 161 /" +"a101 put\ndup 162 /a102 put\ndup 163 /a103 put\ndup 164 /a104 put\ndup 165 /a106" +" put\ndup 166 /a107 put\ndup 167 /a108 put\ndup 168 /a112 put\ndup 169 /a111 put" +"\ndup 170 /a110 put\ndup 171 /a109 put\ndup 172 /a120 put\ndup 173 /a121 put\ndu" +"p 174 /a122 put\ndup 175 /a123 put\ndup 176 /a124 put\ndup 177 /a125 put\ndup 17" +"8 /a126 put\ndup 179 /a127 put\ndup 180 /a128 put\ndup 181 /a129 put\ndup 182 /a" +"130 put\ndup 183 /a131 put\ndup 184 /a132 put\ndup 185 /a133 put\ndup 186 /a134 " +"put\ndup 187 /a135 put\ndup 188 /a136 put\ndup 189 /a137 put\ndup 190 /a138 put\n" +"dup 191 /a139 put\ndup 192 /a140 put\ndup 193 /a141 put\ndup 194 /a142 put\ndup " +"195 /a143 put\ndup 196 /a144 put\ndup 197 /a145 put\ndup 198 /a146 put\ndup 199 " +"/a147 put\ndup 200 /a148 put\ndup 201 /a149 put\ndup 202 /a150 put\ndup 203 /a15" +"1 put\ndup 204 /a152 put\ndup 205 /a153 put\ndup 206 /a154 put\ndup 207 /a155 pu" +"t\ndup 208 /a156 put\ndup 209 /a157 put\ndup 210 /a158 put\ndup 211 /a159 put\nd" +"up 212 /a160 put\ndup 213 /a161 put\ndup 214 /a163 put\ndup 215 /a164 put\ndup 2" +"16 /a196 put\ndup 217 /a165 put\ndup 218 /a192 put\ndup 219 /a166 put\ndup 220 /" +"a167 put\ndup 221 /a168 put\ndup 222 /a169 put\ndup 223 /a170 put\ndup 224 /a171" +" put\ndup 225 /a172 put\ndup 226 /a173 put\ndup 227 /a162 put\ndup 228 /a174 put" +"\ndup 229 /a175 put\ndup 230 /a176 put\ndup 231 /a177 put\ndup 232 /a178 put\ndu" +"p 233 /a179 put\ndup 234 /a193 put\ndup 235 /a180 put\ndup 236 /a199 put\ndup 23" +"7 /a181 put\ndup 238 /a200 put\ndup 239 /a182 put\ndup 241 /a201 put\ndup 242 /a" +"183 put\ndup 243 /a184 put\ndup 244 /a197 put\ndup 245 /a185 put\ndup 246 /a194 " +"put\ndup 247 /a198 put\ndup 248 /a186 put\ndup 249 /a195 put\ndup 250 /a187 put\n" +"dup 251 /a188 put\ndup 252 /a189 put\ndup 253 /a190 put\ndup 254 /a191 put\nread" +"only def\n/UniqueID 5020164 def\ncurrentdict end\ncurrentfile eexec\r\x80\x2\xa5" +"\x9e\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93" +"\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6" +"\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd" +"fA-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e" +"\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9d" +"n\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13" +"\x1d\xee\x0[AX\x5\xa1m\x8a\x12\x36\xdc\x4\xce\x1a\xf8,\xb5\xf0\xbf\x35\xab\x8b\xe7" +"\xfc\xffr\xacm`o!VUt\x85\xf5\x0\x30-\xaf\xf8\xef\xe1Y3y\x17\x38\xf1\xd6\x15\x31\xd6" +"\\\x16V\xd8 \x9f#\xf0\x9e\xd1\xc0u\x93\xc6\xdd\xd3L\xf9\xf8\x15\x6&~D:g\xa9\xbc\x95" +"Y\xb7\xcf\xdcn\xf0\x31\xe7\x90\xc4\xdf\xf2\x7\xae\x44\x18\xd0\xc6\x1f\xa0\xbe\xbd" +"\xb2\x9d\x14\xe6\x86\xe3\xd8\"O\xe9\xf4\xf6\xe6\x32\xadU\x7f\x43\x1e\xb5 \x95\xb1" +"\x1f\x92I\xb5'\xfcK\xf8\xe0\xcd\x41\xaa\xbe\x44\x8f\xb\xa0m\xb\xe3u\xcb\xa2\xffp" +"\x8b\xeai\xd1\xe2\x1e\x8a\x9b\xad\xc1\x34\xdc\x82\x61\xdb\x9e\xe\x44\xf\xf6/\x8b" +"\xa7\xcb\x31Ky\n0\xefs=\xb5\xe3\xc4\x9f\xfa\xc9gR|\x92Zb\xeb\x4\x8d\xec\xc0\xa6\xc2\x44\xf9\\p\xe3\x3\x99t!\xef" +"\x88\r\xcd\x9c\xf1\xd1+\xb3\xd0\x96\x7f\x33\xb2\xff\xae]\xb6\x16o\xfd\x1au\xa2\x95" +"5\x12\x65\x8c\x95\xc2g\xc6\x15S:\xfd\xca\xb1\xe5\x96\xbf\xea\x46, 1\xd1\x7f\xdc\xef" +"R\xb4\xabZxv\x84\x95q\xce\x1b\xafv\x97M\x0\xc8\x65\xf5\x64\x80\xcb>\xc4\x43\xc4\xff" +"\x6\xdf\xf1\x90W\xbc\xdc\x87\xed\xf8\x9dnK\x6Y8\xdb\x92\xfc\xc9\x91\xdf\xf2\xb1\xd7" +"\x10\x19~|\x1f\x9f\xa4\x15\xbf\x10\x9dm\xaf\x7\xaf\xd7>\xc2\x8f\xfb\xf4\xc3\xd1\x13" +"\xdf\x45H\x8c\x62\xd0\xf2X6\xe0t\x17\xf\x62\x33\x9e\x9c\xc0\r\xe9\xc\xcb\n%y\x1b" +"\xda\x7W\x2\x1\x30U&\x6\x33\x5\xde\x8c\x5\xe5\xde\xey\xe3tN\x11\xac\xc2M`\xf3\xb8" +"\xf2hJ3\x18\x61\xa5hK\xc6\x8e\x84w\xe5\x30\xb8\x8b\xa5\x8cn\x8\x11\x8d\xc5\xd4u\xa1" +"\xf8\xb2\xc2 /\xf8\xce\xa6I\x11\x41#V\xb9\xe9x\xba\xdc\x35OGhw\xa6y\xbd\xb3;\xa0" +"\xf9\xfb\xda\x11l\xbe\x4\x8c\x2\x6\xb3\x9c\xeb\x34h\x9c\xc6\xef\nG\x93\x6\xc7@\x17" +"\xd2\xa8*\xb7'\xbe\x61\xfb\xf1Z36\r\xea\x36\xdd=\x87\xf3\x32\x19\xfb\x41\xe8\xc6" +"\xa9\xb6.\xd0\xae\xc1\xb\xad\x41\\\x3\\\x89o\xd5!\xa3\xff\xc2m\xba\xcc:3_\x8\x1e" +"\xa6\x9d\n\x80\x89?\xc9\xd9\x12Y \xf1\xa1\xd5\x81\x9e]\xf6\xee\x87'-]O\x1e]i\xd9" +"\xc\x2\x35'\xe\xa6xzBW\xa8\xd2\x16\x8d\x12\x99\xca\x31\xbau\xb1\xdbx\xec\x42\x35" +"\xbd\x83\x87\x37G\x80\x1f\xc6\x14\x1d^K\r\x10\xba\x8c#I\xcc\x3\xf4\xb7i\xa9\x8g%" +"n\x8b\x84g2.\xb6Z/\x8b\x35\xab \xc9\xa4\xc9_\x5\x91\xf8\xf5\x97o\xcb\xb6\x94\xc5" +"\x18\xec\xa7\xa9s\x94\xce\x61\x44\n\x19\xce\xe3\x16\xeb\xd8\x12\xd5P\"|\x6\xbe%\xc" +"\xfd\xbc!(\x11\x0+0&A\xd3\x35\xaa\xe3\xd0\x38\x91-ly\x11\xdf\xd6\x98N\x95\x89/\x8a" +"\xb2$`\nK\xf7\xe4\\\x90\x4N6\xaaY\xf3Mp3\x86\x44)2\x82\x95\xd6_\"\xd3\x15\xbe\xe2" +"\xe7\x84\xf4\n\xbc\xb5\xdaK\x99\x94\xb7L?\xc2u\xfe\xb7\x37\xc0\xc\xa2@\r\x4\xa1|" +"\xe6|:U\xec<\xe3\xcf\x62\x65\xa1\xe9n\xed\xe\x9f\x43\xe9\x61\x12\xddptQ\x1cW'\xe1" +"5\xc7(\x8bq\x3\xb4\xff\xb\xcf\xa0\xd1\x96\x17\x9a\xd3\x5n'4I\xeb\xad\xf2\xb9\x82" +"X\xabT\x9f\xbe\xae\xf5/\x94L\x6\xb5n\x93H;5(\x82!\xabS\xa1\xeb\xdc\xe9x\x9d\x82\xc3" +"1\x9d\xfe\xe8\x8b\x39\xdc\xe8l\xbZ_\x1b\x62,8[`e\xe5\x94\xb2-\xbb\xc1qP\x16\xad\\" +"\xca\xb5\xe6\xe4;\xbb` \xf9;\xfd\x65\xba\xe2j\xe4\xa2\x39q\xe7g\x95\x18\x61\x99\x98" +"b\xb6\xe\xe5(!t:D\xba\x98)\x90\x89Hi}\xfe[\xfa/\x8d\xa0\xc6\\\xe7\x46~6\x9a\xc6W" +"$\xe0\xe2\xe9\x44\x18[\x19Z\ra\xa2\xe5\xcf\xc7\xedK3\xb3\xbc\xb7\xc0M\xb1\xfa{y\x84" +"O\x10V\xf7\x1a\xd5T\x8e|*\xb2\r\xf5\xb4\x30\x37\xc8\x8\xbd)Q\x95\xe7\xd9\x41\x7\x90" +"\x16{\xe5\x42[\xeb\xfc\x84u\x91`R\x9bo\x97\x15\xbb&0\x1fs\x1\x2s\x93V\xf4\x90+\xf4" +"mh\xc5\xd3\rqz\x7\x18\x8avI\xd8\xd1\x43p\xb9\x9\xfe\xb2u )\xfb\x91%\x86\x7f=i\xcf" +"\xc\x43=,v\xa2:3\xaa\x83\xe9\x99j\x81;\xb4\x34\xd0\xff\xb0\xde\xb4I=+\xee\xda\xed" +"\x9a.Ih\x82R\x6\x11\x16Z\xaf\xb7\xfb\x9Q\x1f\x1e\xf1\xa3\xe3\xbd\x33\xd2\xddV\xba" +"\xa0\xceN\xa1X('*(t\xc2\xe7\x36l&\x13V\xd1\xf3\xe2\x8\xccP\xab\xb3\xf1\xc3\xaa\xbd" +"\xce\xda\x35_O\xdf\x1b\xb7{\x89\xab\x8f\xcb\xd3\x62W\xfc\x8a\x18\x92\x8cHTQx\xcd" +"X>\x9\x8b\xe0\xf1h\xd4\xd1)P\xfa~\xdc\x32\xf7\xab\x66\xe9\x88\xd7K5\x2\xcc\xfc@\x8a" +"X\x14\xc4\x36\xb9\x38\xac\x2\x1e\x39\xf6\x0\xf6\x1c\x14$~\x8a.\xe9\xdf\xf0\x10\xef" +"\xad\x42\x8b\xf3\xfd\x1\xcd\xe7M;\xa1\xe9(\xf2\x30\x89Ou\xf8\x11\xf\x32\x96\x1c\xd8" +".\xc6&\xc9\x36 \x9aR\xf3q\xf2.\xc2\xa6\xb9\xf7,\x9f\xfb\xf0I\xf4P\xabZ\xa8\xca\x30" +"\xec\xc8\xb0\x14\x41^\xcb[\x3\x97\xf7(1=+\x1c\xae\xc\xb\x38\xf2\x85\x9b\xc7\x2h\"" +" S\x95\x5\xa9\\\x9b\x0\x1c\xee\xf1l*\xa5\xc8\xbc\xdd\xdf\xcbj\x87\xc5\x32n\xa5\xa7" +"\x91\x82w\xf6\xee`|\x91\x85\xc4\xd1\x65\xcc\x9d\xaf\x31v\"x\xa0\x89\xacM\xfe\x64" +"\xb\x9a\xc8\x41W\x1e\x9c\xd2\x86\xf6\xcf\x7f\x83\x66R\xd6'\xb5\xd7pg\xb5\x1e\xa7" +"\xeeZ>\xfd\x38\xc4\xb\xc3Mu\xf5\xbc\xcdG\xa2~U\xf2\x1b\x8a\xb0\x99\x41\xfc\xaa\x91" +"\x1e\x1b\x9b\xd3.\xcd \x90\x8fw\xc0\xacu\x95\x65\xa6`\x83\xf0\xb\x33\x1d\x85=,T\xe5" +"\xee:\xb6\xac\x97\x13\x39#\xe9\x65>0\xde\xaf\xd7\x65l\xa4\x9cmrV\xeb\xe0\xdf\"\xd9" +"\xc\x1a\x82\x7f\x8a\xc8z\xc0\xdf\x39\xb1\x5\x7f\xfb\x92-\xf5\xf0\xce\xf8;\x5Z\xb5" +"\xd5\xce$\xd4\x8d\x85\xf6i/\x9\x89\x14\xaeX\x93#\xa3\xe2\x87k\xef\x80\xc0\x1c*[\xb1" +"\xc8>\xc6\x7f_\xdb\xcc\x44\x45\xb\x9f\xd1\xd9\xe7\xde\x97\x35\xbb\xf8y\x9a\x87\xd6" +"*Q\xb/|[\\\xfc\xfa\x41\x89\x93\xf5\x64<\x9\x99\xfcj\xfe\x2\x85>6\xdaq]x\xaa\xb0\x11" +"\x11\x39\x92\xe2\x14\xba\x10&I\xf1\xe5\xaa\xa0W\"\x1c\xe6 w5\xa6\xe4\xf8\x12\x45" +"H34c\x8cG\xd7<\x13\x93M\x10kVS\xd2\x37\x8d\xd5\xc\x44\x37\xbL\x1e\xdc/]\xf5Y\x97" +"v\xee\x91\x0\xf2\xa5\xa3\xdb\x81v\xf9\xc2qQ\xa8\xb3%\xef\xe4\xeb\xa4\xa9\xa2\xf2" +"\xf9\x30\x10+c\x8a\xb9\x1dSm\xbcp|\x8d\x0\x9a\xda\x89\xf1K\xd6\xd4\xe3\x83\xff\xd4" +"\x94\xcazD\"*\xe2\x8aqEZp\x14I\x97\x6\xf3\x3`kF\xe3\x9\xe5R\x91\x8d\xd7\x91\xb2\x92" +"\x4\xe5v\xc5\x8c\x9b\x3\xca\xad\xf1\xc1\x9\xb2\xe7Z\x9e\x9c\xdf\xe1Md\x89\x36it\xc7" +"\xb9\x63\x1\x98\x7Y\x6\x32\xe9\x84R\xdb%\x62k\xb2\xcb\x63U\xdd\xa8\x87\xa3\xd7\xda" +"A|\x90l\xba\xf5\xac\xb5\xf8\x32\x32\xe6*\xcc\x1\x16\xb1\x34\x99~\xd1" +"\x8a\xdd\x64\xa0\xa7\xafN2=\xdc\xb\x91\xe7:*\xfd_\x8d\x9\x9Iks\x88m\x86\xfd\xaa\x80" +"S8\xe4\x43$\xf9G\xb2\x46\xd4n\x7V\x85\x86\xaf\x8fh\xc0?qX\xc4\xe8\r\xf2\xa5\x46\xbe" +"m\xd1\xd5<\xfe\x80\xb0n\x9d\x85\xf8\xe1\xa4\xb3\"\x2\x13,\x0\xc3\xe6\x9d\x1c\x8e" +",\xe1\xf2S\xfd\x41L./\x1f\xb1\xf9\x86\xa5\xe6-\xeM\xb5\xa4X\x9+L\x9f\x8b\xe6\xb6" +"l\xe5\x93\xb2\xf\x41Z\x91\x1f\xc1k\x92\x8d\x96\x43\x3-,\xc3\x90\x85\x12+\x8d\x39" +"\xbd\x7f\xaf,\x18\xb\"\x97`l\xba\x1a\x65\xd9;M1Rq+\x84ol\x84\xc5 9 O\xc7\xde#\x92" +"\x90X\xb8\xc9\x10?*\xa2\xce\x97i\xedy\xd4\xec\xa8Hk\x14\xd0\xa5\x66H\xf5\x9c\xd2" +"\xfc\x88N2\x84\x1ek\xe1\xa4]\x8e\xbd\xf9\xa5\x0^\x89\xba\xf\xf6\x86\x61\xdc\xba\xea" +"\xc6\x66\xfa\x99\x1d\x93\"\x9\xb3\xf4\xc8\x62\x87Un\x9d\x1a\x13\xd2\xfc\xff<\xe5" +"\xf\xea\xbf\x3\x82\xf7\x80\xce\xe3\xb7\xc9\xa8[\xa4\xfc\x6\xcf\xb3\xa2\x30\xe7\xb2" +"\xea\x65\x18Y\xc7s+\xd5\x7f\x5\xbd\xc1\xc6i\x1c\x18\x38y\xcb\x39v\\\xad$\x6\xb1\xc2" +"/J\xd2\xb3\xdb\x11\xfa\xf5\xa5\x42\xd4\xdf\x16\xbb\xa1\rn\xab<\xfd\xf7G\xe\xc\xcf" +"\xcb\xc5lTL\xb8}(C\x84\xd6\xad\x8\xe2\x88\xd3}o\xcf\xea[\xcb\xa2\xbb\x82\xfa\xd0" +"10\x3\xaf[\x1d\xa4\xe6\x0\xad>\x1a=[G\x1c\xad\x46r\x80\x1en,F\x1d\xbaxP\x8cS\xf5" +"\xc3\xa0\x1b;\xd2\x43\x94\x13\xed\xf1\xd3o\xff\xa1,\xfd\xe\x92GO\x80yjR\xd0\x8d-" +"\x81\xc7\xbf\xae\xa5(\x90\xaa\xf0\x8a\x94\x35\x93\x62\xf2G\xb\x36\xb6\xdc*\xa7\x84" +"\xf0\x64\x7f\x18\xe3\xc3\x61\\\xa7\xdap\x97\x1f'd!]P\x97\xfc/\xd9\xac\x2\xb2>9\x8e" +"\xa4\x9f\xcd\xd4\x12\xcb\xb8Z\xdd!\xd5\xa5\x30\x31\xf8X\x9e\xf\xb\xa5\x9c\xcc\xfb" +"\x9d\x3\x33\xdb\xf3\xf2\x94\xebVm\xda\xb5?k\xc1\xfb\xc1\x1b\xca\xac\x98\xbc\xddu" +"\x98\x44\xc5\xa0\x1aG~+\x0\xe\x96\x7\xfc\x16\x84\x87\xee\xab\xce\xa0\x1\xa3v\x93" +"\x99\xde\xe4\xab\xc6\xc3\xb8\x38\xd8\xc1kq\x8\x2\x18\xa0H\xb0+\x9d\x10\x42\x35\xc8" +"_\x8f\x86\x13j,\xa7\x15O\xc8\x97\xaah\xdb\xd9\xd6\xd3s\xc2\xf0\xfa\x45\xe\x13\xdf" +"q+\x96X\xd0\xc1\x15\x9e\xe3\x0\x84\x94`\x8\xa8w8\x9c\x96\xceT\xd4\x8M\xb5\xfb\x80" +"5\r\xbb\xb5[\xc4\xb8\x1d\xf6\x3`\x96\x39\x8d\x8d\x10\xd8\x8eMb\xcf+\xea\x44\x96<" +"\x15\xd4\xc9H,\xd2<\xf1\x35\x80\xfa\x1e\x62\xe1\xeb\xe1\x99\x38\x45\xc1\xb2:\xb5" +"\x1b\xc3\xa3\xf2\x18\x9d\x97\xab\xb9\xcc\x66\x63\xc7\x17Sj\xcc\x41\x8\x4*\xc6:\x94" +"\xd6\xad\x81\xca\xe1\x93o'nm3o\xcc\xec\xf0\xbd\xf6\xd9\x42\xc4Y#\xa9^$Ez<\x8a\xcb" +"\xd7\xfe\x39\xf3\xbb\xfa\xb3\xe0\x84\xb9g\xce\x31\xc5\xf1\x9dn\\JR\xcf\xcb\xe3\xe6" +"\x14\xc7\x90\xf6:\xef\xf1\x35\xa7\x96\x99\xf3\x92\x15\xfb\xf5\x2\xbb\xf4\xa5\xbd" +"m\xd4PDz\xc4\xed\x46Q\xdc\x9d\xa3 \xf7\xe3Zy\x89'\xc2\xfa\x66\r\x43\xcf\xf5z\x8e" +"N\xeaq\xa8\xb?\xe2\x33\x1\x90\x80\x32\xa4(P\rQ\xed$\xbd\xe\xc1\xb3\x90\n\x8aj\xb" +"\x93\xfdy\x98\x95!T\xd4\xd3\x99\x41u~[\xd1\x38\xeb\x39\x35\xf8\xc3\xb1\xa2\xf6\x17" +"\x5\x9b\x1d#\x17\xe4\xb2\xcb\xa2/%\xad\xa5'\x1e\xcf\x63)\xa7\x85\xa0|\xd1?O2\x3\x8f" +"\xc8\xcfPq\xc\x1dix\xe2\xf4\x97n\xd7\x1b\x94\x63x\x9b\x81\xd3\x65Y\x16\x46\xda}7" +"0\x1b\xb7\xab#\xf1\xe3\xe1\xa4&\x9e^D\x1b\xb8(a\xe4l\xc1\xe5}\xd4\xb2\xa8\xf7\xbc" +"\x10)\xb3@\xf\x90\xed\xc3\x99s\x1ct\xfcq\x1f[D\x9c\x37\xab\xf6r\x15`\xc8\x86%\xe4" +"\x94pY\x9a=$\x87\x80h\xa9\"M\xbe`\xd4\x14\xa3\xb4~\x11\x94\x13\xdd\x95V\x8a~\x17" +"\xac\x44K\xee\x95\x9b\xa6\x66\xca:\xd0icg\x85\x16T\xd8&\xfb\xc6\xee\x66\x85\x80\xde" +"\xf3\xe0\x30\xbf\x81\xd1\xa1\x89}\ry\xe3p\x84-\xfc\"\x10\xaf\xabO\xfb\x97\x30V\xf6" +"/\xc1\x45\x93\xfb\x10\x41\xf1QBK|\x7f\xf6\x9d\xabvMRk\xe0n\x95\xc9\xd5\x9a\x9a\xfd" +"f\xa8j\x92\xd3\x35iY\xdb\x61\xe2\x64\xd8\xd0\xe4\x46P8\x1e\x96\xd9G~\xa4\xc4\xa2" +"\xa9\xd9\xde\x8a\xd2]K\xffpw\x0\xa5\x17\xe0~^\xc7\xd4\xfS\xac\x32\xb6\x82\xe\x64" +"\x99\xeeTL\x1c\x96\xd8sJM\xa1\x83\xdb'5c\x93\xe2<\xb3\xbf\xe7\x9fv\x95q\x16e" +"\xda\xc3\xcb/\xe2\xa6\xe9t\xd9[\x8\"\xa0\xce\x31wHjn\xce\x97\xd1?\xcc\x1b\xef\xe2" +"\x83\xabv\x9f\x1a\xe0\x7f\xf5\xc8\x13\xb4\x30'\xbc\xb2\xa2\n\x13x\xce\x89\xbd\xde" +"\xa4\xdcraJdg\x7\xcd\xed\xa6\x19\x91-nS3\xfe\x35\xe0\xa6|.\x97(\xab\xac\x39\x10\xb8" +"\xb8\xe9*\xf0\xb9\x18?%\n\xc5\xcc-\"dn\xaf\x82\x39\xa0\xe2\xdf\xc1=[m\x1a\x9f\xf7" +"\x1a,\xf3k\xbb\x1\xc5\xa6\xf6\x99P\xc2$\\Om\xfc)\"\xccy`\x16\r\xb9s\x1e\xads\xf2" +":\xda\x9\xae\xb3V\x98K\x3\xe1\xb3\xc9\xd0\x10(\xe6\xf0\xab\xe2k\x1c\xd0hX\r\\\xf5" +"\xd7\xce\x87\xfe\r>0\xfd\xc~\xa0\xed\x92\x39\xa9\xc9G\xb3:R\x86\x87\xef\x42l\xba" +"/\xfa\x96\x16?0qE6\xda\xf9\x80\xdb\xa6p\xe4\xeb@H\x90-\xd3\xd9\xe9\xf3\n\xedn\xba" +"s\xa6\xf9GcH\xc5M\xd3>\xf3\x19Z\x82!\xfdQ\xa1\x90\xc8\xfc\xf9\xe6\x93\x9f\x8,W\xb1" +"\x97i\xb4\xd1&\x1aX\x9a{\xa8\x41\xa1 zKP\x8aL\xcex\xb6\x13\x11\x13I\xa6\xa0\x36\x10" +"X#\x80\xb3\xef\x30\x30~\x90\x66^W\xa5\xedlg/\xa1Gnw\xb2'\xef\x98:\x19\xc3!9\xe9\x90" +"\xf8 \xe2\xe4\xa2\x33\x16\xe9s\xebN\xec\xe\xba\xe1\x1a\x1c\xe5Ro7\x95\xae\xaaO\x8f" +"\xb7N(\x94\x19&\"\xd4j\x9bLY\xba\xe5\xf3\xd9\x35\xbc\x97G\xb6\xbf\xa7\xea\x5}\xfd" +"bJ\xb2>\xed\xf3\xee\x8f\xc0\xdf+s9I\xc5#\x1f\x12\xee\xe3\xfc\xef\xf2'\xa5\xa2\xec" +"\xb3\x9e\x3\xeb\xb5w\xd4-\n\xacJ\xbe\x8\x86\x38[\xf9\x5\xc7\xd8lX8\xc4\x45\xb5Q3" +"\x16\xc8\x1fN3X\x3\x86\x1b\x80?\x90\xcfn\xff\xa7\x86T\xa5+\xa8\x16\xc3\x45@\xc7\x1d" +"\xecS\xe9\xcfM!f\xec\x4\x82\x5\xe5\xc2\xbe\xb7\xc2\x39\xec\x95\xda\xf1\x8b\xcd\x9" +"\xc3=\xe8\xf1}\x8c\x39\x0\x83]==f\xc\x84\xe\x12\xb\x95\xbe\xc9}49\x17\x85\xdeO0T" +"\xcc\xb=\xae\xd1\x81\xb6k\\\xb3\xae\x13\xff\xd8\xf7\"\x83\x34\xd8\xe3L\x8d\x98S\xfe" +":\x11\x8e \x97\x9a\x39*\xa3\xc3\xfcL\xf0\xd7\x95Yp&\x8\x30\xcf\xf7\xb2\x30\x91-\x11" +"\xbcR\xc6\x16\xba\xfb`\xd8r\xbcNT\xb4J\x14\x90S\x89\x14S\xa6&\xafVR9\x8d*\xa9\xfd" +"s\xf5{\xaa\x4W\xfd Ma1\xd3\x66\xd2\xb8\x8d`\x85\x91\x8d\xf5-\xdbmg\xe0\xde\xd4P\xaf" +"\xc9U\x98i3\x92\xd2\x96\x34w\x19\x33\xcf\\P\xeal\xcc\xd9\xd2\xb4\x13\xdc\xb\xed\x36" +"I\x8a\x16@y\x99\x18\x13\x99\xac\xf1\x38\xb\x9f\x19=\xf0\x8a\x93\x63\xa9\xdd\xd5\xb5" +"\x8b\xc8\x93\xa2\x32\xf8\xfa\xe3\x93'p\x11\"\x31M\x8\x92\xa6\xad\x31\x11\xc1k\x90" +"CI\xc2M!ux\xf9}nS\xee\xf5\xb2x\xafO><)\xb7\x62\xd6\xd0I\xa7:\xc9K;\xe0\xe1K\xf5\xe9" +"\xaa\xa0gnu\xb8\x64\xcf\x8a\xcfX\xa9\x9e\xed\x91\xc4 \x8f\xb3&Hv\xcd\x46\xcd\xdb" +"\x8S`\xe9]e&\xa8/\x84\xff\xf0\xf3y[5?\xc\xef\xc5Q\x1\x8bK\x8f\x64\xf9\xce\xc0/x[" +"*]\x9b\x6\xc7\xc0\x8a\x12\x87LO.5\x92\x8a\x1\xca\x0\"\x9c\xb0N\x92\xe3)&T@\xceo\x5" +"\xbanh\xfe\xb9\xd1\x2lU\xb2\xbf\xdb\xe0\xfe\xa8\x9dN\x93\xb\n\x1a\xc0\xbd\xccY\xe" +"\x5ZS\xfe\x97\xb9G\x84\x45\x94rLr\x7\x43\xb4\x5\xcd\xb1\xdb\xad\xa2\x1e\x45\xb9\xf3" +"v\x13\xc$\xd8\x86\xcd,\xab\xab\xd8\x62W\x16\xec-\xa6rA\xac\xfe$\"\xa9]\xe6\xa7\xdd" +"\x94z`p\x9b\x90\x4\xa3\x7\\u\xb8\x15U\xa1\x9f\"!\xb2\x90\xb3\xba\x43\x39\x96\x8e" +"\x95\x97\xee\x64w\x15\x84\x4\xde\r\xd7g3\xcelI\x4\xcf\xc2\xa1\xdb#\x80\xf8\xbc\xee" +"\xa1\xc7\xc0z\xf\xdb\xe9\x36\xf2_\xfa\x83to!\xa7\x4\xbb\x31M.\xa8\xa3{\xc2]\x9e\xf0" +"\"\x94\xf2\xfd\xd7\x31]'\xae)ag\x18\x64\xac\xc2\x9W\xddsw\xc4\xd4\x9d\x89\xad\x10" +"\x8\xe8>\xd7\xff\xcd}\xa3\xb5\xd3_\xdf\xfd$|\x11\xaf\x85t\x94qQ\xd5\x45\xbb\xd8g" +"\x1f\xe6>\xc9x\\j\x94\x90Y8\xc9\x9d\x8a\x93\xdc\xd8\xdc\x1a\x83\xf6\xbe\x81\x8e\x8a" +"\xa4\xf8\xe6\xe3\x82R&dv\x95\x14\x1e\xa4\xbcL\x3\xe6\x11\xce\xd3\x8e\x7\xd9NFh\xb1" +"\xfH\xb1&\x83\x96[\x97\xe7\xe5\xdd\xb2\xc0\x99\xa4\xb8\xac\x88.1\x9a\x14\xacH\xcd" +"z\xf1\x19\x45\x98v\x17\x14NI\x9e\x1a\xb7\xf1!K\x93(\r\x97'\xf8\xa9Go\xaf&\xae\xe3" +"\xcd\xd2Q\xce\xffiS\xfd\"\xea\x8b\xf6\xbeM\xd7\x9c\xa1,5\x84meMG3\xe2\x9c\x64\xcc" +"\xc5\xce\n\x9d\xba]\xb0\xa3\xf7U}2\xb1\x87ic\xc5:\xe0\x8eR?r\xe5\xe3\xe2\x44\x9\x9d" +"\xdc\xb5\xba#\xa0\xaf{\xb4x%\xdd\x9a\x87\xae\x61\xf3K\x98\x95\xac\"\x31\x80\x62\x0" +"s1$\xb1\xac\x10\xb4@\x87\x19\x66\x43\x37!0\xf0\x97\x8e=\xbc\xba\xa2\x36\x42\xe1\xa4" +"}\xe0\xf4\xf1,\xbf!=\xc2\xbd\xf6\x43\x81\xd3W\xe.V;J\xef\xc9\x65\xe6\x32\xf8\xbb" +"Z6t\x11i2\x9aj\x15\xa0Q\xa5\x82\x17.\xe1\x8c\xc3\xea\xd5\x11~\xd6\x1dGr\xdc\x89\xfa" +"M!\xdb\x8c\xf6?\xcc~\xcb\xbd\x8\xc5i\xba\xc5\x10\xb8\xe9\xf0: ,\x98J\xb0\xeb\x9d" +"I\x10\x0mPr\x87HE\xf2\xae\x98\x3\xd8lH\x9a\x4\xa4_\xdf\x85\xff\x62g\x3.<\x9b\xfc" +"\x80\x61'\xef\xa5[5\xfc\x64.\xa9\x95\xd8\x9e\x41\xee}g\xdb\xa1\xea\xf2\x9e\x1f\x36" +"\x1c\x94\xd6\xa4\x30UE=g)\xd6\x88\xc8\x87*q\xf4KL\x9\x8f\xae}\xa6\xe4~4\xb1\x63\xa0" +"\xf9\x9f\x7\xa3\x33\x81\xdc\xd6\x96R\x11\xa7\xc3\xfd\x1a\xf\x32\x98\x8f\xc2\xfbr" +"\xddz\xe8 \x95\xd6Y\x4'\xf8\x0NN\x2\x8d\x61\x1d\x45G\xd3\x9a\x87}\xdf\x1a\x8f\xe8" +"u\xe\x6\x44u\xc0\xc0,\xb\x44vr#l\x8f>\x93\xa2\xb5I\xe\x44#X^'\x8]\x15\x86\x5x\xb1" +"l\x0O\x5\xeeU.\x1\xfd\xc6\x1c\xde\x89\xc5\x9c.\xc9\xcap\x4\x1\x9aG\xcd\x9c\x8\xa6" +"@\x83\xab\xd1\x1/x{\x7f\x83\xf6\x1aO\x84\x1dV~O\xb5\x46\x13\xd6\x0gKF\x9d\x1c*_\xff" +"B\xaaz\xb2o\xcb\xaf\x9d\x5\x44\xc1\xa6m\x94Q%\x8b\xdes`\x6\xc5\x88\xb0\x62!\xc0\xd8" +"\xb4\xaaTh}\x8\x9f\x8bH\xb2\x65\x34PB\xe\x82\x13\xae\r\xe9\xb7\xc8\xcc\xe4\xd1\x9d" +"l\x86l\x14\x42\x30\x8fI<\xc1\x1f\xf6\xcc\xb3>]\x95\xc8;$\xb1\xee$\x9d\xce\x93 w#" +"\xa7\xb1\x97qQ\xe3O\x18.\x9by4\xf4\xbd*&\x97\xc0\x64\xe6w\x13\xc\xf1\xe\xa3W7\xe2" +"q\x17\xc7\xe5\x96IS\xc0\x41\x39\xec\xcf\x1f\x1e\xc9\xdd\xce\x1b\x30@\x90\x41\x9a" +"C\xb4\x12\x1\xb2:\xa1\xd7\x9b\xf8^\r\x0\xe\xccN\xdf\xdfI\x9c_\x1d\x37\xc\xd1&\xe7" +"\xda\xdb\x7f\x81\x9c&\xdb\x98\x8M*\xf6\x84\x42\xf3\xe8\x45\x34\\Z\xf2\x37+7\x8e\x11" +"G\xb7\xb4\x8f\xf0\x9c\x9a\x92\r\x83\x97\xf8\xac\x8az\xa2\x35\xe0\xc6\x98\xe7\xf1" +"V\xb8\xeaw~\x8f\xe6\x39\xd2\x6\x7^\xcdw\x8c;x_\x6\xb2\x16p\x90Q*H\xf8\xbc\xb2\x9b" +"J\xf7w\x11\x87M\rl\xc2\x95P\xed\x81\xb8\xc6\xca^q6\\\x19\xc0\x97\x0\xe9\xee\x30\x39" +"U\x7f\xf2\x8f\x1dG\x93\xe5Z\x8a\x45m\x80+\xa8\x41&\xff<\xc6\x12q\xe2\xe9`\xc7IB\xf5" +"cj!ob\xac\x80\x16\xc9RB7\x87\x83\xd2\xc9\xce=\xcd\x37\r\x9b\x10\xb4\\O\x9at<\x2j" +"6\xab\x99XG^\"]\xc4\x64\x3\x3O\xd2\xbb\xae\xa0\xcf\x1b\"\xb9\x31\x0\x83qi\xb5\x16" +"\xef\xf5\xf6\xc9\x95R0\xc0P6\x8a;\xaf\x10\xd3\xe0l(\x5\xb8\xefq]\xfdU\xaf\xc\xd6" +"Pa\xe7\xa1\xbc_|\xc7\xb8\x2\x6\xc9>I(V\xa4\x1b`/\x1b\xa1\xe9\x8c\xfe\x15+\xd6y\x98" +"]\xef\xf5\xb8r\xb8\xdd\xe0\x37\x5_\xf9\xc\xfe\xej\xe6\xecn-\xde\xf9\xc3\xc5\xff\x32" +"\x5\x4\x8c\xe7uD\xa1\xcd\xd7\xea\xe4\xb6<\n\x13_\x81t\x7f\xf1\x99\xa8&g\xee\xe4\xd8" +"0\xae\xa2\xa2\xd9\x19<\x94\xed\x9d\xd0\xe\x9f\xb2\x6:\x96\x18r\x99=\xa8L\xbf\x61" +"\xa0\x89o4\r\r\xeb\xadi\x1a\x31\x85\xa6\xcc\xfc\x97\x38:h\x3\xa1\x7f<\xa5\xa0\x13" +"\xd9\x33\x99R9`\x1b|?H\xaa\xdf\xb4\"\x1b]\xd7\xe4\xaf\x86\xa7^\xbb\x8b\xc9P^\x82" +"\xe7\"\x95\x1\x8b,'\xfa\xf3\x92\xf6\x86\xc0\xd3uc0\xa2jc\xb%\xae\xd6@6\x5P%1\x9e" +"\xa2\xfc\x1ar\xad\x14\x9f]_u\x15=\x84\x80\x41>\x14\xa2'^\xf0\xa1\xef\x39\x17\x44" +"\xe3\x43\x88\x6\x17\xd1\xce\xb7\xb0\x2Q\xacys\xde%R\xcb\xb8{\xae\x7f\xad\x10\xb8" +"N\xb3\n\x4\x9\x5\xd3\x42\x83\xd9\xf\x43y\xc2'&\x80\x1=\xf1M\x6\x65\x1e\"X_\x80\xcf" +"\xb6\x9c\xea\x1b\x10\x1d*\x7f\x7G\x92\xfc\x8e\xb6\xeb\x8f \x8c&\x80&\xa5\xc3\xdf" +"a;\x8f\xf1\xa3;A\x87\x1f\x64x\xfbq\xc8\x9\xcc\x32\xc7\xbz\x1e\x83%O\xfa\x8\x9f\x35" +"\xd5\xa1+\xc3\"\x7\xa6\x1b\xc4\xbbTI\xbc\xf4-\x8f\x8f\xa3\xe9\"\xa1\xda\xc8%\xab" +"a|\xaduwx\xe0n\x98\x36g\x94(\xf7%=e-\xd8\xf4\x14\x97t7\xce\x7\x9qe\xe8\x9\xbf\x45" +"k\x99\x1c\xe9\x9a\x9c\x9e\x8f\xe2{B'K\xae\x39\xec\x88\xba\xc9\x8e\xea\xc9\xf8\xf3" +"H\xff\xef,^):\xe7I\xf0%\xcb\xf2\xd8W\x1c]V\xec\x1f_r7\x13\xacX\x16\xc4\xe\xacJr\x89" +"z\xf0~\xaa\xe3{\xf4\xf0\x8dW\x80 \xce\xc4\xb2Gl\x9d\xf8t\xb6\x14\xeaP\x15\x63S\x9e" +"\xd8\xbdRA\x19r\x1c;\x1f\x46\x1c\xf4\x87\xce\x8\xf8\x84\x8c\xc*\xd0\x9aPJ\xe8\xe0" +"e\xc8Z\xc1\x98\x81(\x8e\xc6\x19\xd4\x15\xb8\x62g\x84>\xb9\x19\xac/\xf1\xfe\xe2\x11" +"_\x1d-\x1fU7\x15\xac\xfc\xfb\xea\x18\x87\x9f\x9d\x8b\xa6\x99\xa1&\xde\xf7\xa3\xfb" +"\x1d\xb8`\xb3\xab$3\xe3\x66u\x1b\xc0\xb6 p\xa3\x6\xf\xc7jr\xeau\x80\x44\xb2\xde\xf" +"W\xd9\x39\xe\\\xfryO\xb3\xde\xbe\xbe\x9e\x41\xa0\xb1V\x80\xe3\xa1\x62G8\xbb\x66\xfd" +"F\xabx\xd7|zL\x14\x1f\xfbWpvC\xc9\xb7\xdd\xd5L\x8b\x1d\xc1\xe5\xae\x9d\x8fs\xee\xaa" +"\xd2\\\xfd{\xca&\xe9R\x84s\x19\xef\x6\xb2\xe\xbbq\xba\x9bVz\x9f)\x97\x63\xf7\x37" +"\xaa\xcf\xa9z\xce\x6\xfcg]\xbe\xc0\x11\xec\x44\xba\x9d\x6\xf2m\xcdr\x9f\x93Yr)\x8e" +"\r\x94\xdf\x8\xf5_\x93\x62\xdf\n\r?O\xe7\x9bl\xb3\x15\x1c\r\x43\x45\xe5\x31\xd0Q" +"\xa9'\xb9\x46\x7f\x31\xa2\x4`,\xdem\x98\x1b\x9c\x6\xe1\x1c\xe\xc3z\x82\xe1\xe8\xbf" +"\xc4\xaa\xd0\x6\x43\x90\x12?\x0\x33\x97\xa4+\xbe<\xd9\xbb\xf3\x36\xf1\x31\xe9\x41" +"\xf2#\xb5\xab\x34\xec\x37Q/\xba*w\x90Q\xad\xc9\xc2\xf3\xc\xb\x9x\xa2#\x14\xd4\xcc" +"wo\x11h\xabY_~\x6\x98@\x81\xe2\xf1'}\xbf\x12\x1f\xf0\xe0\xb\x45\xeb\x30\x1e x\x95" +"Pt\x85\xc1R\xd5Q\xd8\x83+\x88\x1a\xc3\xbcU\x8a[\x15n~\xfe\x86\x80\x10\xeb\x14#{\xd9" +"D\xe5\x41\xb2\x19\xc\x1f\xcM\xa4\xa6\x9d\x90\x80\x38\xf9\x8b\x31\xa2\x9fw\xa4T\xef" +"s\xe0qZ\x9a\x44N\xb6\xa3\x92\x1c\x33\xa0\xff\xb2N\xf4\xf1\xe0\x38+\xb8\xc1Q\x7f\xc6" +"\x14\xb0\xb7\xa0\xf3\xf0\xab\x1d\x30.m\x96VBl\xdb\x1\xb4\xd3:\xf9\xef\x7f\x44\x34" +"\xfe\xbd\x1d\x63\xcf(\xae\x64\x81\x80\xd0\xd0>\x9a^\x1e\xa5\x81|V\xf3\xc5\xc7H]\x95" +"9\x95\xbc\x93\x32\xa3\xf0\xbc\xbb\x32l\x9e\r\xefYJ0\x7\x37*\xf8\x0-e\xd1\x91\xe5" +"c\xa8\xc7\x9cW\x8a\xf2\x18Q\xbe\xbe\x91\x82?.\xc4\xed>U\xb6S\x16U\x6\x13\xa1*\x8" +"r\xdaJ\xb5\xf\xca\x44\xffO%|\xc4\x9\xe6\xe2\x99[\xc4?\x99_6\x7f;\x95\x41\xb\x34\x5" +"\xb4\xf7K>j\xd4\x93\x6y\x8b\xc4Q\xf4\xba\xaf\x13\xcdI\x86\xd8u7\xf=J\x1aW\x82\x8" +"=Q\xeb\x91[\x7f\x32\xa4\x61\xb2\xb8\xfc%n!)_\n\x1b\xac\xb1s\x98L,\x88\x9eL\x1dv\x0" +"\x5\xaa`\xe7G\x14\x11\xd1Q\xd3z\x94\xed\x8d\x14\xbf\xf0\xa0\xa8\x38\xb7=\xeet\\\xc2" +"\xf0\x17\x15w\x8cW\xd1\x45(\x5_\xb2\xd0\x31j\x8b\xe\xe9\xfb\x1f\xba\x6\x3\n\xa7\xed" +"\xc4\xcY\xe7\x11>\x95\x89\xb6\xd0\x88\x1f\xb3\x99\x61J\xfI)\xaeK~\x91/8i\x89\xce" +"\x13\x7\x2)\x18\xfP\xf4\xccZq\xf0\x14.\xe6T\xc2\n\x45\xf\xb5q\xa7LY\xfc\xc2\xdd\x42" +"\x8e\xe3\x14\xde\x30\x90\xf7\xff\x12\x5\xe7\x1e\xc4\x96g{\xcdV\xfc\x9c\x91\xd2\xb5" +"\"\xf4\xdc-\x14\x82\xae\xfe\xb6\x81\xd7\xab\x87\x36\xe5\xeb@~~\xfe\xf4\xc0 \xe4W" +"{P\x1c\x9fT\xd7\xde\x19\x45qQi\xaco\xc7\xf5R\x92\x6T\x8a\x62\x2\xde\x12n\x87\x9\xe0" +"\x1eo+\xc3\xe8M\x9c\x81?sgK\xc9\xdbTo\xb7\xab\xbaR@\xc4\x16m9\xa6\xbbk>\xdb\x88\x98" +"\xcf\xek\xa8\xa5[#\xc0\x33\x7f\xf1\x34\xc5\x5m\xeKN\xa1\x7f\xbf$\xdas{'\x1\xd7\xa4" +"\xda|\xba/\xa4\xa1\x39\x46K\x8=l}\xae\xd6\x30\xfa\x6\xc2\xb5\xe2\xc2\x6\x81\x1a " +"\xdc\xc4\xbu\x88\xb4_\x95^\xa6\xb6\x33\xc6,\xbf\x36\xcd\x93\xb\n\x38\xda\xf0\x9b" +"Cc\xcb\x6\xa5u\x92\xb0\x7\xdd\r\xc2\x14\xc1\xect(^\x9e\x9c\x6\xf2 \n\xc0\xf6\x9\x90" +"#\x4T\xee\x0\x1a\x85\xebr\x10\x11\x30Pi\x9a(\xc3\xe3\x1Q\xf\xfa)\xde\xb0\xc6\x4\x84" +"\xd3\x11\xe3KWRm&\n\x94\x31\xbc\x80\xe1\xd9\x18\x3\xdeR\xecY\xed\x35[\xd5\xfe\xc" +"`\x86l\x1d\x38/\xce\"\xe0\xb6\xd8\xc1G\xeeQ\x1c%\xaf\xb0q\xd6\x95\x8e`\xea\x18\x45" +"F\x96\x83\x46|\x1a\xa7\x0vb\x9c J\x3=\x94\xe2\x94\x8b\xb0\x45\x88\xb7~\x99\xdd\x13" +"\xe0u\xfa\xeaq\xfc\xf1\xb7ST\xdc\xe0TsB\x9d\x8fk\xbe!\x8e'\xe3\x8e\x33\x13\x83:1" +"\x9a\x84\x42\x95\x5\x88HK/\x9bH\x81\x80\xf3\xc2\x92\xa4\x8dpF\xcfx\x1es&\x7f\x88" +"\xba\x64\xadJ:g\x95\x34\x8al2\x1d\xd5\rP\xba\x99\\T\xda\xf\xf8VW\xe\x1f\xc1\x18\xe9" +"\xbb<\x10K\\m\x9e\x11!\xdfK\xda\x33\x66 /1\x97\xcc\xa7\xb3\x65\xa9\\\xdf\xf6\x97" +"{\xa9\x65\xe2\xa6\x86x\x9\xf4\x8a\xfd\x63{\xd4UZ\xdf\xce\x32,\xce\xe9n\x9d\xe2.w" +"\xd8\xf6\x32-\xd8+\xf\x62~\xc2'?(\xdf \xa2\x1\x19*\x1d\xea\xfd\xb8\xca\xbe\x17\x98" +"\x12Q%}\xcbq\xb4\xb1\xa6r7\x86\xe4\xac\xbc\xc1*n\xd6\x61\xfa\x1c\xdc<\x8dN\xdcP)" +"ldf!\xfd\xfdW9\x8c^\xe4\x8eh\xc5\xce?\xa7\x9dP\xb6\xd6\xcd\xcd\x65;I\x12\xff\xaf" +"\rTSP\xe\x65\x97\x1\xfd\x8\x11\x93\xf4x\xae\x9b\x88\xef\x15\x98\x33\x85\x97\xd9\xcf" +"'\xabh\xbb\xe7\x89\xa2\xce&?\xbfJ1\x87\x81\x1\x37\x92\x36\xa3\xc9|\xfe\xfd\xadr?" +"I\xd2L8&Mn\x1e\xa8\xc3\xc5\xc9\x5o%\x1\xe5\x37\x90\xa0\xf6O\xe5\x91\xd5\r\xe4\nm" +"\x9f\xd0(N8\x96U\x1e\x96\xb7\xc5\xc0&\x96&\x1b\xcz\x99\xa4\xc7)a\x90)\xe0\xae\xdf" +"6\xc1\xed\xbe\x42\xd6\x99\\\x1aJ\xcb\xb1\xea\xcc\x9f<\r\xeb\xb9\xedX+\x81\x1f\xec" +"U\xf2\xfe\xaa\x37G\xe5\xe2\x83?-\x98\xfb\x1dXq\xa0'\x83xA\x91:+P\xcdQe\xc3\x1c\x9a" +"\xf\x1d\xecZ\xbK\xf1\x85\xd2\x3\x7f\xd0K'\xc4\xbfpz\x92=\xe0\xc2\x8bo\xeb\xae\xbc" +"\x9fx\xbc\x9c\x11\xccGi\xc1\x8b\xae\x18\xbc\x42\x32\x95z\x1\xa4\xb8\x85\x91\x10\x64" +"l\x86\xcf\x34\x99\\\x82\xdb\xf0\n@E\xec\xe0\xc3\xb5\xb9\xb3:z\xbdW\xab\x87:of\x14" +"\xb6@\x91n::n8\x88\r\xda\x39\x98\x9c\xe4$\xad\xb9\x66\x1g)\x8eu\x86?\x7\x5/\xfb\x99" +"\xa8\x5'\xc4\xa8\x3Iu6\xae\x17\x45\x98\xb8\xba=%g.\x16\n\x3\xc4\xfc\xb0\x66\xb3\xc3" +"\x14\xfez4\xa0\xa7\x11?\xa9/s\xef\x44n!\x8d\xc9\xfd\xa4L\x93y^\xcd\x9\xe6\x1a\xfd" +"\xde\xb3sZl\xd9\x3\xa7\x89\xcb\x9c\xb4\xfdxQB\x85\x0:~4\x97r\x81k\x0\x37\xb8w\xd5" +"\xfe\xe\x15:\xf7i5kn\xa5\x9f\x7fk\xc4\r\xf9\xfe$5\x15< \x1ajkOR\xc8\xe3\xb1\x10\xb6" +",Z\x8e\x89\xa5\xf8{\x8b\xbf\x9b\xbb\xccPZ\xba\x8a\xc0\xaej\x8m*D\xf2\xcd\xa0\xeb" +"\xd6\x41#\x1bO\x7f\x8e?oO\x19\x0\xbe\xacP\x14[.\xa9=$\xb6\x8a\xc1\xd2l\x95\x94u\xca" +"5x\xc7\x99\xb8R\r\x12\xb3\xce\xe5\x93\x19L\x1c\x4\x66Q\xb0\"G#i3\xe2\x5\x42[p`\xf5" +"\xb4r\xb5\x1\xbc\x31\x90\xaf\x11\xf0\xb4\x91\xcc\xb7\xe\x44\x88\xa0\xbc\xb0\x63H" +"\xf1\x7\xfa:\xb8\x66\x66\xa9Rk\xa1\xd3r\xb4\x1\x66Jb\xe2\xa5\xf9SJ\xf5\x3\xd0\xab" +"\xa0\xb1\x12\x97\xd3\x36+\xca\xf7\x9b\xde\x1em:\x13\xbb\xaa\x39\xdc\x8e\x83\xc4\xe9" +"\x1b\x98\xba\xb3\x0y\n\xfb\xf3[@\xf2R\xe1\xdbyQ\xe1\x7\xbb\x39^\x9aj\x96\xe5\x46" +"\x96\x81\x3\xa0\xe\xae\x92\x30\x44L\xee M\xa9\x91\xa6\xd3\xf1\x6\x3%\x0*\x11\xd1" +"\x10\xb8\x14\x19\x9c\x8d\x45\xf6\xf6\xa1\xf6\xe1\xd6\x13\x89\xf1z\r\xfeS\xbem\x3" +"n\xce\x85\x1f\xa2\xe2\xe\x1a\x41+\xe7\xa3\xb5\xb4O\xdb\x9f\xa7\x7\xf4\xff\xfd\xab" +"3\x6\xdd\xce&\xad\x2\x95\x38(\x87\xf9\xd5'\xcd\x4|\xb5\x83\xd2\x0?A\xae&\xfa\xd6" +"U\x9b=:\xea\x92/\xda\xf6\x91-\xcc\xf1\x86\xeb\xde\x3\x17\x82\xcd\x14Z7\xaf\xbc\x30" +"\xb6\xe]\x9d\xfc\x10VkV>W\xb8p\x96x\x8mlHdY\xf9#GN2\x1d\x7\x37\xf9W\xb9\x42\x96}" +"\x4\r\xca\xad\xd8\x32\xd4\x9f+\x82\x16\xd1\xda\xa3\xa4\xee(\xb\xaa\xf8\x63\xcc:\xea" +"\xae<\xb8TI\x0\x84\x8d},\x90\xb2\x1aL\xed\xab\x9e\x61|\xf7\"\x14\x0\x35\xc6*\x9c" +"\xcf>[7Uv\xe8\x12>K\x1\x9e\x9#\xd2\xe8\x15\xff\x36\ny\x8b#0\x8a\x32\xa9\x19\x42\xe4" +"X\xa0\xf1\xaeM\xb8\xcf\x31)\xcc\x33\xc8\xaaJ\xb8\xf3\x33\x61\x66\xae\x1d\x14k\x7" +"c\x12\x1bM~)\x90\xf1\x92\x6M\xb7\xfb\xd9\x64u3/\xf7\x0 \xcd\xe6\xf\x0\x14\x9c\x35" +"QWT\xd2$\xd1\x91u\xcf\xa7\x91\x64#H\xce\x9b\x8b\xa3\xde\xe2\x10\x63*i\xd7\x8e\xb4" +"U\xf5\x87\xf8\x96J\x9fL\xeb\xe1\x1b\x9d\xc6\x14\x9b\xef}\xf7\x81\xb1\x97\xec\xbf" +"K\x9a\xdax\xf1x\xc0\xce\x1a'\xd7\x7f\xac\xce\x96\x32\xc0\xf8u-\x88R\xfe,Z\x6\xe1" +"G\xd1@\xf\xf5\xb4\xb9\xffK\xf0\xc5\xc4\xbe\x13P\xd9\xd2\xfd\xe1\x7f\x12w\x90zl0\x88" +"\x4*Cr\xca>k\x82\xb6\x88\xe3 /D\xf\xfc\xc1j~\x10U\x1c}\xdd\x34\x35\xb9\xb5\x9e\x9a" +"\xda\xaf\xe3\xb8}\xe1O=\xc3\x1d\x1b\x87%\x1d\xd4<\x94\x83\xf8\xa4\xc6\x12@\xed\xac" +"\x88\xeP\x87\xdd\xdf\xcd\x8_\xf\xcc\xfd\x1b\x16\xde\x94\x63&\x2\xf1L\xbf\xe7\x6\x31" +"b\xfe\x66Ph\x8f\x93\xeb..\x9e [7\x86\x9b\x15\x6U\xf2*\xcbO\xb3\x44\x63v\x99y\x1b" +"\x94r+\xc3+\xb7\xb4\xf6\x3\x90\xe4\xd1K\xa4\x92\x45&\x84\xca\xdd\x33\xe5p\xac\xb3" +"\xaa\xdd\x96\xf\x89#\xff/:)\xe4G\xa0)\xa3\xb9.%\xfc\xa0\x17\xa1\xc5\xbdO\xaa\x8c" +"\xab$\xe9\x14\xf5\xf\xabY\x6\xfaP\xb3\x39\xa0\xd5\xa8\x39\x89w\x1f\x41\xa3\x91\x3" +"\xa9#\xd5\xc9V>[\xean\xe3n\x1bJ6$\x18\x4\r\x35\xc6\xb0\xdb\x2\x38\xce\x97/\x95\x15" +"\xc6/=eapL\xa5p\x81\xca\x41\x98_\x17\xdd\x86\x13\xa2\x92\x9b\xa1s\x99\x31\xaa&\xc" +">d\xebM\x94\x98\xd6\xcc\x14\x80\x13\x66\x9e(.\x96\xf5]\xa0\x1a\xed\xa6\x94\x99Q~" +"\xdcLR\x0\n\\t\xd2\x93\x8d\xfa\xf7`_&\xf7\x99\xdf&zX\xa0\xb9\xfb\x30z\xc2\x6\x83" +"k\xf7\xe0\xb1X\xcb\xd3i\x95v\xdegq\x7f\x0\xdd\x38\xc3\xcd\x8Yd\xe8\xc5x\x7f\x9d\x32" +"^\xb2\r\xc0\xb2\xea/\xc8y\xe7\xa4|\x14\x9e\xd8\xfa\x8e\xde\x30\xfb\xf1|\xfc\xd3\x9d" +"\xe5\x16% \x1f\x90G\xc5\xc\xa3\xc4\xefZ\xe0]\xb8\x1c\xda\x36\x34\x93NH:\xaf~\x9{" +"\xdf\xe3\x88\xcc\xc6X[\\\x92\x8f\xfa\xb4\x13\xc7v\xa8\xb5\xa7\x9f:\xa7&\x89\xde\x1d" +"G\xf0\x2\xda~\xfa\x84\xd8\xea\x99\x36\xc2\x32\x12\xd7\xf0@\x98\xdf\xca\x1c\xf1\xe0" +"GdW3\x85\xd4K\xe7\xde\"+\x80\xe1\xe\x11Hm,\x12\x18\xe9+n\xbf\xd1KI$\xd7\xedrfK\xf3" +"Ec\x99j\x96\xe5\x63\xef\x62\xec\xad\x11\x81\xf8\x44@\xf5\x8f\x41\x16\x34\x9\xd3\xf1" +"\x1+t'\xaf\xaf\x31\x37\x97\xcc\x10\x9f\xda\x1\x7\x39\xb4\x44Tq\x7\x93\x10R\x5\x44" +"\x19\xe\x6\x15\x8aX\x86\xd2\x97\x39\x33\x85\xbbX|pA\xca\x2\xe4\xd9~74}O\xdf\xa3\xcc" +"\x1c\x42\x30\xac$u\xe5\xb2\x81\xbf\x84N\xa7\xa9\xb1M_\x8a\xb4\xed*\xa0\xe9\xe2\x91" +"\x80Z\xfa\x66HA\x1b]\xeb\x86\x35sg\xc3t\x99\xc8\xcb\x91\xf1\xcb\xeb\x2\xbf<\x10\x8e" +"\n\xcf\xa1\x11\x8aS\xbcv\xf1\xd3\xa6\x5/\xf8\x17*\x8\xe4&\xa4r\x89\xd1\xe8\xc1\x35" +"\xf8\xb2\xdc\x9e\xa5\"\x99\xf3\x7\x43\x99z^u!fP\x7f>\xae\x9f\x9b\x9f\xd7\x94\xef" +"\x1e\x89\xcc\xff\"\x42\x87|\xc1\x80\xf9\xab\xb\x8c\xc0\x64%\xc6\x93\x5\x45W\xa3L" +"\xaa\xab'\xa6\x81\x8\x1\x82\xb4\x8c\xae\x13^ \xf9\xb6\xf6ht\x1e\x35m1\xb4\xdcY\xc4" +"z\xc1\xe6\xdd\xfb\xcb\xa4&FlM\xdf\x89\x1c\xd4\xf3\xd2#\x6\xfd\x86p%6XFQ\x1\x17\x19" +"\x1N\x9e\xfe&\x8bLdb\xa8\xf4\xef\x97v8\xef\x31[\xff\xd8\xa8 \xd6/\xbb\xbe\x63L\xfa" +"2 \xb3\x66Ws\xe2W'\x9\xc6l\rOL\xd7\x8d\xe4\xc0.\xab\x9L\x9aN\xdc\x9aY\xaf\xa4\xb3" +"\xb0\x8\xb0'\xb0\x8b>\xfc\xba\xe6\xe8\xa5\xd9\xe6\xd9\x18jT)$}|\x9d\x82\xdb\x9e\xca" +"\xe8H\x13\xae\xc3T\x18y\x18\xd9\xee\x11\x86\x1d\x61,e\x3`\xb3\\\xba\xe9\x97G\xd7" +"\xf8k:!\xda]?.D\x84\xd8)\xcfx\xa7\x1e\xe7\xab\x1ei\x11\x18\xcb\x9c}A\x18M\xe1\xa0" +"\xed\x91PAh\xff\xeaVe1tMA^\x92\xda%\xc6\xb6z\xfa\x98O\xeb\xd3*\xc8,<\xc2\x11S\x87" +"\x93Y\xec\xad\xf3Ma\x0\r\xd7$\x10&\xfd\x97\xed\x95\xe\xb4\xe2*U\x8a\xa4g9\xc2\xee" +"\xf2\x33>\xfc\x88\xa8\x32q\xebX\x8c\xe1'\xe2\xc9\x18o\xac\xd7Pl\x8f\x31<\x9f\x98" +"\xc3p\xdeU~c\xe6>D\xfbO\xfd\x9c\x85\x39\xf0j#RZ\xcb\xbc\x91\xe9\x2\x66\x94@\xebU" +"\xc5\xff\x1a\xe\x34\xb7\xb9\xe1\x12\xeR\xf3\x91\xb2\xf8\xbe\xf7\x63\x8c\xc2\xf4\xca" +"\xb7\x94\xea>\x8c?\x14\xc2y\xec\x36\xfd\x9c\xa3\xa0\xe9\x7JjY\xe6\xf8\xd2\x90\x94" +"\xcbV}\xb1\xf7:\xb5\xf4\xee\xac[\xeb\x31\xe8\x37\xe4\xafG\xe8|\x98\xd0H\xc3\xd5\xd7" +"S\xf2\x30\xbb=\xb5'C/N\xdb\x7\xa6\x36\xa1\x45\xb2\xe\xcb+5d\xee\x9c\x6/\n(\xc7\xd3\xa3\xaf\xd1\xa9\x1b\x37N\xb5, \xc8\xfb\x18/\xdd,\xbe" +"}\x88\x18\x82(.\xdd\x9cG\x86V\xdd\xb5\x9c{\xb2\xff\xa4\xc4@{SV\x9e\xc2*\xaf\xba\x9e" +"\x19xI@\xf5\xc6t\xce`s\xbe\x8f\xd3u\xcf\x15\xc0\xcc\x88\xab\xc9! \xba\x2\xec\x83" +"tdd\xfdrm\x9c\xb{\xb9X\x9f\xcc\x34\xaa?F?\xbb\xe0(\x7f+<\xbfz\xfe\x3\xce\xc2\xc7" +"*\x4I\x3\xc3$n\x94K)#\xdf+L|X\xed\x5\x66H\xb5)VJ\xeb\x1c\"\x87\xd5\x62\x98\x8\xb0" +"\xce\xa3sN\xdb\xeeM\xb3I8\xda\x8e#\xc0\xd4\x39\xae\xa4\xbe#\x87\x96\x42\xe7UH\xdc" +"T|\xfe\xa6\x94\x13\xfc\x9d]D\xf0\xb6%\x18\n\x8\x35|\xe4\x85\xdc\xfcw\x85\x36\x9f" +"%\x8e\xeer=~/\xcaq-\xb0\x95[Y\xbc\x94\x88\xf4\xeb\x9e\xab\x1d\xe\x8b\xe8)/\x91\x1" +"\xce\xae\xd0\x86\x80\x92\xba\x9et=R\x83L\xd4\xaa\x1a\xf0\r\x95\x91:\xfaO\x1d\xba" +"\xef\x9dh\xb0\x1b\x63\xd0N\n\xd2X\x8bL\xc2\x3\xee\xe7\x18s\xad.W\x92\xbe\xb3\xcb" +"i\xad\xde\x9f\x99Z{6\xf1\x3\x94?\xc4\x93\x66\xaf_\xee\x96\x8dj?\xaf\x39\x36)\x95\xa2\x2\x9ext\x9e" +"\x89os\x94\x86\xb2/\xce\x11\xa4:hUF\x8e\x7V%\xd5\xe8\xc4\x89\xebX\xb0\xfc^\x1a`\x94" +"[\xf5\xa6\xea\xa0\x19\xf8>\xbf\xacTs\xfa&B5\x8e\x16/\x1d\x8b\x30L]\xc0Y\x89K\x85" +"\xf1\xfb\xf5\xc7\x1e\xcb Mm\xf\x1d\xcf\xf0\x90\x9\x91\x6\x1ez\xc4\x92>\x80\xe6Q|" +"`><\xa4\xf8X\xbd\xb7t\xa0\xc6/W\\1_{g\xa6\xfa;\x4\xdc\xb2\x92\x32\xfd\xb5\x94^\xf2" +",E\x1a\xa2\x1e\xa4\x8b\x98%\x42ys\xc\x87\x96O\xb\x45\x8fG$\xbf\xd9\x8f\xe2\x9e\x46" +"\xa3\x63]*b\x8e<)\xcf\x87\xb1\x34\xe0l\x97x\xcc\xdc\xb2z=\xd5\xe5&\x16W\x90%\xd8" +"B-\xb7\x85\xab\xc7\xa4M\xad\xa4\x5\x99Y!`j#\xa6\x1a\x36\xfdh\xa3/\xae\x31\xdd\x66" +"\x1a\xeb\x31\x33\xc5\x1a\x86\xed\x85\x16\x94&\xa9\x90\xe\x82\xd7;\xfd\xd8\x5$^\xe6" +"6\xccwy\x85\x46\x39O\xf1j\xb4\x1cp\xdfh\xa2\x7\x8a\xfd\x14\xewH:2bo\xf\xff\x30H\xf6" +"|\xff\x6q\xcd\xbf\x64;d;\xf4\x3\x7\xb8S\x8b\"<\r)\xd3$\xbf\x80\xbc\xce\x8\xa2\x9c\x63\x9e\x92\x89# \xb6z\x98\xbb" +"\xd3^\x9\xa0\x30k\xaaY\xbc@\x1c?\xbe\x9a<\xf8\xa4\x45\x1f\xcc\xb7o\xae\x8c\x91\xb7" +"\xb?\xff\xac\xd3\xb5\xa1\x62`x\xe4\x4`\xb3\xec\xe5X?*\x97\xf9=\x8f\xca\xdf\x61W\x1a" +"[p\x8b\xdb\xa5\x88\x1c`#\x7\x19\x7f\x96\xfb\xeb\x14\xaa\xc5\xb1\x1f\xc0\xe9\xe7t" +"Mnj\xf2\xdd\x97\xd0\x0W\xdf\xe7\xf9] \x15\xae&9\xf9\xdc\xb9\x9c|\x10\xf0\xb4\xb6" +"J\xd6\xe1~O\x2\x8b[\x11h\xe4\xebJ\xea\x96\xf3\xd2v\x92\x9b/\xd2\xa4\xffl\xb2\xde" +"\x3\x8\xd2\xfa\x7\x33\x1d\x35\x62\xfd\x18\xd7$\xfZu\x86t\x83\xb0\xe0V\xbd\x9f\xec" +"w\x82\xd6}\xdf%\xe:\xab\xac\x1-y\xd2O\x15,\\\xd0\xbs\x90\xcd<\x87\xdb\x8bq\xb2}M" +"-G\xac\x82\x43\x44\"*u\xa4\xfe\x12\xad\xd4\x80v<\x91\x17\x95s\xa7\xd0\xb8pc\xc7\x8" +"\xce\x1\xf2\\U-\xc1\x0\x30\xb4v\x19P\xfe}\xf2\xcf\xc3\xd8h\xa2!a\x1}\x1e\xd6]\x11" +"\xa9\xadN\x7fL\x91\xc8\x7\xf1\xa3\xb2\x9e\x36\xe6\x8c:\xdb\x98\xb8\xe7\xcf\x30o_" +"Z\xbcT\xe3\xfd\x83>\x8d\x86\x42\x1f\x5\x0*\x9f\xcf+O\xef\x30\x45w\xda\x43M\x9e\xab" +"\xbb\xef\xcb\x98\xde\xb0\xa4\xb4@\xe7_&~\xa7\xeb\x92Zq\xca\x94x\xc7\xd6~Y/\xdf\xea" +"h\xb6\xb4\x35Y\xf4\x9e^\xde\x82\xed\x83\xb2\n\x8b\xb1\xba\x96\x86\xbb\xee\xef\x33" +"E\xcf\xa4\x46\xc5\x41|\x12;\x9f\xa7\x9d\xc6\xcb(\x94%\x65 \x94\x35^\x12\xe4\xbf " +"\xd2\x42\xe0\"\xf0\xa3j\x1c\x19.{\x81\xcc\xd2\x92\xc5\x0\xab\xc0\x19\xepM\xe2m\x93" +"\xaf\x82\xd4\xe1\x61*\x7f\x34\xb3\xe9gO\x90\xcc\x8c\xd1h\xfc\xc5\x9d\x37\xbd\xbe" +"-9\xd0\xa3\xde\xba\r\x94}\n\x4\xeQ\xc6mj\xb1WP60Mgt)\xb2\xd7x\r`\x6\x5%\xff\x34\xc8" +"\xf4g\x10.\xe4\x64\xe2\x42\x8R1L\r\xb2\xe5\x17t\x4&Z\xe\xcd\xd0\xea\x2<\xd5\xc3\xe3" +"\xeb\xc5\x1\xb6YsW\xf3\x1e\xf1on\x8d)\xcd\xe7\x0\x13\x1el\x87\xa6\x18\xcb\xc2\xba" +"\xfa\xda\xee\x8f\x9d\xces(\xdeG\xf4L4\xf2\xdf\xc7\x90_KUKO\x10 \x2\x8cK\x94!<\x0" +"\xa3\xdb\xb\xd2\xabj\xd9\x13'\x86\xba\x38M\xa8\xc0\xd1\xc\xb\x97\xb5\x3U}\xba\x7" +"\xeb\xe9|O?\x88\xf2\xbe\x1d\x88\xbf\x8b.'lm`\x9d\xf7\xe2\xb7m\xfa\x33\x8d(\xa9\xd3" +"\xd6%!T\xd9\xd0\x30\x85\x16\xcf X\xc0Y$m/\xb\xbc\xd1\xc8`e\xf6\x41\x33\\Z\x1b\xfc" +"\x1b\x66\xbd\xc9\xd2?n\x82\xb8 \xb1\x80nq\xafO\xc2\x44\x33\x8aK\xa0{\xe5\x19l\xa9" +"c\xc1\x1eq\xe2\x99\xcQ\xaa\xf5\x8d\x31\xc4\x8d\xfe\xb2\x0\xb8\xa1\xff(b\x1a\x9b\x15" +"\x8e\xbbU\x85i\xd6\xc2\xc8\xf8\x33\x46!\x83\x7f\x9c_\x19\x32\xc0\xeb\xc5\x1a\xe4" +"\x1aPF`\xde\x31H\xe8I\xf1\x32G\xdcs~\xbd,\x8\x15\x61t\xc0\xf9\xffx\xbb\xf6-\xd5\xd2" +"\x0\x2\xb6OIhT\x8aZe\xcdl)\x1d\xe4\xef\xde]\xb8\xf7v\xec\x93\x13\xd7v\xd9\x36\xdc" +"\x2\xc5\x61K1;\xfe/R\x82\xb2\xc2\x2l\x4\xca\x93\x1\x99\x62\x9cs\xa2V\xb8\xc5\"\x94" +"\xc3\x63\xf4\xa7@J\xdbm\xcb\xf2x\x13\xea\x8d\x8d\x95\x12\xdf\x10\xc7\xec|\xbd\xce" +"F]\x9dLx\xe7/:.\xfa\x66\x14\xf0\x1e\xde\r#\x4\x1cO\xc1l\xe4PK\xeb\x17\x6:\x97\x5" +"-\xec\xe3\x1b\xec\xe5\xba\xa5\x82\x14\x44\x7f\xa9*u\xb9\xae\xe8\r\xe8\xc5\xae\xb8" +"D\x16\x10\x6\xb4P\xc2\x9bul\x1d\xe7q\xb3\xff\xd0\x92\xbb\xed\x88\xc1\x31\xe5N0\x91" +"Z\xf3\x1a\x12\x9a\x15\x42o7k\x7M[\x85^\x19\x99Z\xb0\xbe\x1c\xb2\xbd\xe4#h\r&\x87" +"\xbb\xfa\x66G\xc3\x96pA/yR7:F\xc1\xf1\xad\xf9\xc2\xdc\xca\x37\xb3`#C\"\x6\xb\x38" +"\x18\xca\xcdP\x99\xc3\x80\x14\x96\xc2\xf0\xd6\x5\x61\x84$\x10\xba\xfd\x9e\xf4\xa0" +"n\xf\xa0\xbf\xb1\xae\xf8|\x81+d\xda\xae\xf7\x1\xad\x1f\xd5\x38\x10\x86\xf1\x1&28" +"\x1d\x7\xab\x95T\xd0\xac\xa3\xe\xd1\x1a \x8[\x14\x1f\x8d\x94m\x91\x83L\xbe\xce\xb0" +"\x92zp\xaa\x62\xc2\x92\xec\\'E\xa8\x1b\x9c\x8b\x9a\x90\x13 \x17*\xe1t\x1f\xaaR\xdc" +"\x9f('\xba\xc1\x8b\x1b\x5\xeb%{8\xb8\x44\xf5\xff\x4\x42\x41Y\x1f\x5+\x91h\"\"\xb3" +"\xcc+?n\xe1r\xb\x1c\xf9\xa2\x8e\\\x9b\x91\x15\x18\x45\xab[\xffte\xe1\x8f\x35\\\x0" +"\xd6W\xce\x61\xb0\xf2&\xa5\xcd\xda\xd9O\xf\xdd\xfa\xc9P>\x16\x87\xb2\xbb\xf7w\x1f" +"m\x8e\xec\x8e\xc5\xa3\x37}\xdc\xc7'X\x5\xa6\xc\xe2l\x1a\xce\x8b\xcd\x8f\x64\x6\xcb" +"\x0\xad\x46\x45]\xf9\xdf\x46\xde\xfe-\x8b?\xf7\x33\xdd\xb1\x4\x96R\x9a\xad\xee\x8b" +"\x9\xb9\xf9\xd8r\xbe\xfb\x9b\xbb(\x98X[\xf4N\xfe\"}\xf\xa9\xec\xf6\x34\x30!6`T\x89" +"\xec-$dj\x1|^\x82|\xc7\xe6\xb5'\x17{H\x1\x9c\x91\xe8,\x80\xe0\x64\x8\xccRM\xbe\x12" +"U\xdf\xab\x32\xe9\xa2\x1f\x39\x38\x32\xf1\xc7|\xdbt\xdc\x11)\xe3\xe\xb8r\xea\xf8" +"\xc0\xb1O\xbc\xb4\xc7\x7jR\xf2\xb2\xfdK\xdd\xd6%\xb1\x1f\xc2\xd7\xd7\x90\xff\x4\x15" +"\x19\xb6\xf8\x31m\xc1\x8f\x89\n\x8e\x80\xc2\xe5\xce\xe9\xfd\x19\xec\x9b\xa6;\xa9" +"\x17v\xdb&\xeb" +"\xb9`\xd3R&Z\xfa]`)w\xe9\xc\xf\x9d\xe8)\"\xa6\x9e\xe6\xaf\xfb\xd7R\x16\xc7\xf5:\xc" +"n\x11\x9bR\x4\xce\xaeJ\xd9\x94\xdb\xdb\x65\xf0i\x99\xe0`E\xdaV\x86\xe0\xf3\xd2\xbd" +"!\xbd\xd3\xf9\xce\x1c\xbc\x9b\xb6U\xf0\xd2\x95\xa7\xa4\x98qc9\x81\xd1w\xc9\xc8i4" +"Ps\x89$\xd9TG\xb9)\xb4\x63X5\xe9\xcd\xd9 \xb0\xf7\xe2\xc3*\xf5\x85\x34\xe2\xe4\x38" +"\x96\x7f\x1c\xfe\xf4\xfc\xc3l\xe\xf7?I\x99\x8c\x14\x97\xb7N\xd2\xd4\x37G\x9d\xc7" +"X\xb2\r\x8b\x8e\xcaO\x89\x36\x8b\x8dJ\xb3\xdaS\x8fo\x88\x12\xd4\xf8Z\x15\x7P%\x80" +"fvy\xf2\xb0\x65\xe3\xe8\r\xa2\xad\x87\xafZo\xc7\xe\xa1\xfd\xd2\xf2\xab\x91v\x92\xb7" +"\xb2\x92\x89v\x1Y\xa2\xcf\x95\x88\xc5\x87\x91\x10\xd4\xb2\x1e $\x1c\xc3\xb\x37\x9d" +"\x13\x85SH\x97\x0\xa0\xff\xf3\xf6\x35\xe2 w\xff\xaa$W\xa3\\\xf1\xab\xf7\xc6$\x82" +"\xf1j\xa5\xad\x99<\x8c\x1e\xfc\xa7\x9c\xf5\x18o\x1e\xe2\x82\xd3\x0\x8b\x80Z\xf\x17" +"\xed\xaa\x33\x0.iI\xa0\xb8\xc4^\xb5u\xc3\xf4\x8f\x9b\x83\x39.\xeb\x37\x96\xdf\x6" +"l\xb6\xf4\x1c.,\xdb\x39H\xd0\xab\x8a\x12\xd2\x1f\xf1qxL\xc1\r\xafJ\xf5\x38\xceg\xff" +"C\xf3\xc5 X\xedi\xc9\xea_\xe9\xcay\x94\xa9\x87\x9\x45|\x80\xdak1\xfb\x63O\xf4zZ\xa2" +"K\xe0\xcb\x39\xf9\xe\xc4\xb6\xb1\xb8\x82\xaa\xd8)\x9f\x11?\xa4\x88\x1e\xa0\xc5\xc1" +"\xae\xe1\xeeH\xc4\xed\x37\xe7\x3\xd4\n\x41\xc6\x8e\x1c\x8f\xf8\xee\x17\xdfy\xb7\xc4" +"Jv\x1a>\x94\xcdO\xcg\xddZMp\xce\xb2\xc3\x9cU\xc0\x0\x15\xb\x32\xed\x99\x38\x1c\xae" +"'n\x88\xf4\x39(\xe1\x13\xdd\xfc\x95\xd9S\xee\x30\x46\x1fY\xa2.\xb8(\x9e*BJ\x95\xf1" +"\x95\x5\x1chp\xbb\x90\x38WY\x9\x15\xc4\xca\xdb\x39\xa8\xad\x9e>8\x9d\x1a\xec\x37" +"W\x84]\xa5\x17\x65S\xc6\x1d\x88\x99l\x9d_\xe1P\x87\xd5\x1\xbd\x6\xfe\x44\x9b\xb7" +"\x85\x1cs|\x96|\x9dLT\x9\xa2\x7fp\xdb|,\xb6]?\xd0\x35(\x8eZ\xe0\xfd\xf2\xe4\rRj|" +"\x80Y4]\xda\x30\x6\x45\xa4\x5\xa5\xfd\xc\xcf\x1f\x9\x41)\x80\xff\xb/\xfbn\x81N)x" +"S\xeb>$\x3(\xcJ\xfe\x1e(~]}2\x18\xe2\x98\x62Y\x86\xfco\x7\x8b\xec\xdf\x95\xc4\xba" +"!+\x87}e\xae_a\x92\xf5\xd0\x99\x1a\x9a\x35v?\x97y>a\xa7\xf1\x2\x9f\xa5\xe9[\xdbl" +"\x9c\x8aQ\xa1~_\xa7\xe2\x8f\xdbG\xedX\xbd\x17\xf4|d5\xc9\xb4\xd9L\xab\x9bo\xe9\xaa" +"\xd8\x86n\xb4\r\xf2\xd1\xd1\xf2,\xaa\x96q&\xdf\x87\xa4\x35\xc3\x18\x6J\xa0\xb4;1" +"F$\xd6\r\x43_x\xc0\xf0\xe\x62\x39\xfe\x9OANg\xc2\x9b\xdf\xd5\x95\x8a\xf8\x3\x91\xc5" +"X+nd\x91\xf2\xd4\x89M\xa1\x15\x6\xa1\xfb\xde\x3:\xc9\\\xde{\x1d\x37k\xf5\xc2\x63" +"\x98\xb9\x9b\xf9\xdd\x95#\x85I\xee\x8b\xa1\x11\xfbx\xbd\xfcI\xd0\x5\x99\x81\x63\x64" +"P%v\xb5\x83\xc\x46\x90\x36\xac\xdd\x1f\x2\x5\xdd\xb5\xadh\xcf\x9b\xaa%vzh[\xb0S\x6" +"\x1a\x0\xd9(\xd7\x1e,B\xad\xe1\x61\xb7\xfa\xc0\xcbM\xd3\xb9&2\xd0\x93\xe2\xed\x95" +"\x90\xa2\x14\xb8\x41\xe5\x33\xc2L:\x8dg\x17\xb8\xc\xb6\x1a\x1e\xa6I9=\x83\xc0\x90" +"(\xb1\x16\xa2\xda\xd7\x14\x9b\x17z\xc0\x0\xbf\xf1\xcf\x31Sj\xee\x64\xc8\",\xf7v " +"\x86\x84\x95)\xf4\xd9\x43\xbd\xb5H\xeb\x1c(\xf1{u\xf9\xb1\xcdt\xdc\x93\xefL\xfb\xb9" +"2\xa2[_\"\xe7p\xd2p\xc7\xde*\xd9v\x92{\x8fu\x5\xc3\xfal\xc8\xba\xec\x8\xf6\xb4\x84" +"\x1f\xa8\x1d\x16`\xc7\x11\xa4\xf\xe7\xfeP)\x10)\x7\x37\x44\x41\x31\xeb\x93\x19~\xea" +"\xe8\x0\x89\xfc]2D\x0\xf2\xdcKC\xd5M5`\xbe\x9e\x8b\x9c\x1f\x96\x13<\xaa\xe4\xa4\xa1" +"P \x7f\xb\xa3+jm\xdb\xcc\x9f\xe2\xc3\x31\x3\xb1\xf7\xcc\xde\xab\xa1x\n\xf8\xfe\x61" +"c\xc5\x14?[\xa8s\x2\xde\x83\x97\xee\x8b\xde\x46\xe2\xd9\xe9\xa9:\xc8\x83\xc6xb\xc1" +"\xcd\x9a\x94j\xe0\xd5\xcdu\x9\xcdY\x14\x1d\"\xb9\xedR\xaf\x36w\xaf#\xeanC\\PU\xed" +"F\xad\xd9-+\xc6\x88\xc0\xc7\xab\xf\xe1n\xd2\x84\x98n\xe4\xa4\x18\xe5\xda\x8\xa2\xc5" +"\xc0\x63\xff\xd3NG\x2O\xd2\x83KC\x1\x33\xfe?\xa7\x86\x1e\xda\xf9%\x1a\xce\xf0-\xb3" +"\xf2\x65\x1\x12G\x5WGz\x15\xa5\x85\xa4\rRe\x1L\x12Oc\x99ye\x89\x90v\xd9\xd1!.\xeb" +"\x16J\xb0\x9e\x95\xff\x84\xc9#=\xb6uB\xad\xa3|\xe7\x9c} \x17\xe0~]=KD\x3`\xe4\x98" +"\xc1\xe\x33\x31\xda)\xfb\xff&\xde\x8c\xa7\xc5>0j\xef\xee\xbb\xc5\x15\x1a_\xa1\x90" +"Z\x94\xed\x81\xc0\xdav\x8f\xee\xc1\xb9.0f\xc3\x39\xff\xb5#$_q;\x93\xdb\xda\xb6\xa4" +"8\xfe\xbe\xfb\xa3\xa0\xd0\x86\x18n\x1d\xff\xf2\x95\x35\xe9\xa7\x13]\xb1\x1d\x34\x6" +"\xe8\xc9H&:\xac\x97\x94\xf2\xa5L:\xc3)\x86\xb5\xe3\x11\xf9\x92(NS\xee\x6\x9b\x8e" +"\xf2\xd8m\xb6\x39\xd1\xf7\xa0\x3\xcb\xbe\xdb\x1c;\xd9\xc2^\x1c\x15Vx\x12\x4o\x82" +"H\xdd;\xd7\xbo\xb4\xd0\xddoNX\xde\x66\x19\x96\x85\x81\x13(o\xcf\x45\xf7.\xa9\xd1" +"\xf1~|\\\xc9\xbfu/T\xc0M\xbd\x85\xa7-\xf2(\xed\xb1?\xb0\xd4\x99\xa0\x82\xa7/r-\x9b" +"\xacV^\xdf\xdb\xdb\xab\x1aZ\x7l\xb\x92zW,\xba\xf0\xd1\xe6Z\xeR\xac|\xa7\xea\x91\xc1" +"r\x8c\xd3\xa0\x82>\xa3M(S\x8cu\x1e\x1Nka\x19\xdbo2A\x7f\xbc\x37\xdd\x39\xf8yi\x7f" +"\xb3\x95\x3PD\xef\x92n\xe9\xb2\xf0x\xdf\x8d\x9eK\xf7\x14\x36\xe1\x90\x89\xaa\xfb" +"R\xc1\xb9i\nc\xc4!\xf0\xc2\x66\xdc\xa9\xdc\x1c\xd5\xc5\xea\xae\xf1\xb6\x63\xf=\xc1" +"\x81\xfc\x9d\xf0\x43\x9fQ)\xad\xe1\x37\xed\xf9\xaf\x0X\xec\xdb\x46\xd9M\xe2t\xae" +"\x8e\xbf\x91\x7\xaf\xb5RaV\xed\x35\x64\xfbU\xb7iu\x1c\x92\x9cX7\xf2\xd0\x17\xf6\x12" +"\"IPa]\xa2\x3\x38\xca\xe6\x36\"l\xcf\xe5\xbf\xeeL\xc1\x93UJ\xc1\x63\xe4\x93\\\xea" +"\x9b\xd1\xa7\x1apNb.\x2\xfe:eD'\x2\xf2\x46\x31\x98\x42k\x1d\xf8\x39\xeai\xc4\xaa" +"\xf9\x30\x18\x41*z\xd0H8\xf2\x0\xde\xad\x98\x17\xe1yl\xcb\xe4\xf0\x1\xe4\xec\x3\xef" +"\x16\xef\x9dkP\x18\x17\xac\xf4\xcd\x12.\xb7v\x8f\xd6\x32\xf7\x98\x92\x13\xdd(\xfd" +"\x19M?\xf8J;\xff\x1\x37s\xa7\x7f\xc\x8e\xf7\x83\xa8\x1a\xb5\xbf<\xba\xc9\x4\x19\x88" +"\xdd\xe3>\xe#\xa9\x11\x84`\xae\x8b\x14\x93q\xddN1\xcd\xee\x3\x16\x1b\x36\xa0\x85" +"\xdewO\xb4\xb7\xa2\xbf\x14\xee\xc9\xd5\x99\xf3\x99\xa8Y\x9f\x86_\xe0\xb3}\x8e" +"T]\x88=?\xc8\x33\xd9\xe6\x97\xe9+g\x19\xfeJ\xf3\xef\xaf\x93\x82\x82JK\x99\x12#\x90" +"\xb7Zo3/\xd6R\xe7\x46\xafg\xe5\xdb#\xb2:g\xe4\xb3\xb0@\xa7\xda$\xecQ\xe8\xf\xbf\xc4" +"\xf2\xf9\xe3\x62&pdO\xe1\x11\xffG\xa8 \xfe\xc5\xb7!\xb9\x44\xbb\x31\xe0\xd4\x81\xc1" +"T\xde\x1bz\xe0\xe5\x3\x8b@\x18\x38\x33\x34\x81\x81\xa7\x17|J\x2u\x1b_x\xe6\xc2\\" +"\x1d\xa2\xc1j\xe4\xf0\xc6\xdb\x5\x7f\x1cP\n\xdf\xe3$\x83\x38\n\xad\x8e\x98\r\x43" +"U!N\\?\xf2\x2\x17\xf4P\\\xf7\x8d\x9a\x39\xeb\x87\xfc\x9aG1\x16\x42\xec\x8f\xf7\xcc" +"\xa0\xf2\xe3\x8e\x99;\x4\x9c\x1e\xb3;\xaan5Q\xb5;\xa6\xf3\x39\x44'`8JEb\xc0\xd4&" +"a\xbf\x62[\xa8\xeMY1\xcb\xb8\x97\x94\x85\xa3;Xoxs0\x0\xab\x4Z\xe5J\xa1\x1b\x31\x88" +"U\x98`\x9a\xec\xf-LE\xb{\xc6\xac \x91\xc4\x85\x9b\x83\xe8\"YOYy\xda\xbb:\x6\xd1\x9a" +"d8\xf5\xf5\xdc\xd2\x6o#\xae\x1\x11\xd7t\x1f\xcd_};9\x15\xd5\xeb\x9fuEc\xda\x1/\xdb" +"\xacL\xe4?\x18\xbfm{\x5\x9aK\xee\xa6s\xf3\x1e\x8e\x7\xae\xf9\x8\x38\xf2\xe9\x8a!" +"L%\x10m]\xcd\x15\xdb\xef\x8b\x7f\xe1})~7P$\x9\x1c\xa8k\xd9\x9c\r\xe5\xa4\xbe\x1b" +"\x90\xa6q\xc4Q>\x82\xed\xd9\x42\x96\xf3\xf5\x91\x8e\xe1\x88\xe4\xc9\xc2\xdd\xd0\xf5" +"y\xfc\xa3&\x14\xbaV\xb4\x84\xbf\xf5\xa3\xea\x11\xf5\xb7n\xe7\xf5\xbf\xb1\xb8\xe1" +"\x0\xcc|I\x95s\xb9\x61\x46.VDT\xb7\xb2h\x93\xf0\xf9\x92\x9a\x9f\xde\xfa\x2\xfd\xa1" +"B\xc5.\xdb\xb9_x]\xb3\x86G\xd8vg\xc8\xe0\x95\xacw\xd9\xda\x34\x18\x7f\x84j\x16KS" +"\x7f\xec\x8c\x99\x1d+\x0\x9a\xcc,F\x88G\xf7\xd5\x98\xe1\xbe\xc5I\xb6\x81\x64\x42" +"\xd7\xb6H\x96\xd0pj\xad\x33w>\x91h;\r\x9a\x12z\xa2h\x18\x84H\x89\xdd&\xe0\x86\x9f" +"\xae\x9$\xa4\xe2\x89?b\xb\x34.\xec\xfd\\\x3.\xec\x31\\\x1b\x92\x97\xe7\x33\x81\x9b" +"\xeb\x4mP\x91p3\xe4k\x1dqqQ\x8d\xa1\x1c\xdd?k\xc0jN{0\xe4$\x2\xda\x19\x1\x30\xa7" +"\xd4\xd7\xa9\x30\x84\xdaY\xfd\xe4\x98\xf0U\x84&\xb7\xbe\x30\x1er:\xca\xfa\xa1T\x9f" +"\xa3\x41\x90Zjj\xa3m6\xcfLgx\xeb\xbd\xc7q\xc5\x33\x35~\xca]R\xa8\xe7\x87\x32\xdc" +"4\x18:\xb9\xd6\x41\xf0K\xf0\x37\x38\xa4\xbf\xa3l\xd1%s\xcb\x63U-?\x8b\xef\x43[H\x8b" +"\x7f\xfa\xec\xa0\xfbg\x13\x46\xb8\xaf\"\xbf\x63\x4\xa8\xb8\xb0v\xe5\xe0\x6\xe2\x30" +"\x9\xc9>\x7=\xf2\xa0\x1e\xbci\xc5\xbb\x80\x84\x9b\x85\xfc\x63]\xcdG\xfb\xfd(v9,\xd1" +"\xb6\x9c\xc2\x38?F\xef.\xc5/\x1e\x44\x7\x86\xe0\\\xd2\xc6g\x88\xd3\x5\xe1h\xb\xe" +"\x9f\xeb\x94OH\xa7Ph\xae\xcc)\xac\x0\x15#|4Kz\x16\xd7\x66\xf0\x45\xb1\xdc\x34\xb1" +"\x16h6@Ne\xc7\xdeP\xf3\x30\x39\x83\xf0\xb1Y\xdb\xe8\x83\xbc\xd9\xf1]\xd4\xb0\xf3" +"O\xe1N?Ee\x92<\xaaz\xd7\x10p\x10Q\xb3\x86\xf8g\x19\xb3H\xc5\x9c\x9f\xe2\xee\xf3J" +"\x16\xfe\xe\x33\xb0?\xe5m\xf6\x65S\xbc\xb\x30\xdb;\x96\xa1\x1a\xe8\xe2\xcc\x36u\x4" +"\xe9\xf9\x11)\x1e\xea+\x92\xf6\nZ\x9d\x92\x2\xc1R\x9f\x39\xbc\xa8\x61\xbc\x37\xc5" +"`)\xbf\xbcp\xd3\x9e\x66\x34\xb1\x1b\xad\xcamx\xf7\xb8\xc7\xce\xfb\xf8\x1\x32wp=\xfb" +";\xbn-?\xef\xc6\xa5W\xe1K\xfe\xd0*8\xd6\x13\x43=\xbd\"\xfd\xa5\xa8\xe7\x9e\x0\x98" +"\x82\x62>\xb8im\x9dr\x9f\x92\"\x1c\xf0\xde\x45\n\x97\xd5\xe5\xbd\xf4\xc2\x6=\xd5" +"\xbc\x62\x15#\x8\x94\xacoe>\x99]\xc6\x1a\xd8\xc\xc5U\xa9G\x96\x5\xd2\xfc\x42Vi\x8b" +"\xd3\x17u\xf9\xff\xee\xfb-\x8aR\xa5\x15=Z\x92p\x11\xcb\xc-\xcck8\xe\xad\x6RtKL\xdb" +"W\xcd}\x98\x81\xe8\x5i\xff\\\x83\xe9\xabT\xf8I\x16]z\xef\x96\x7i\xf0\x92\xc0\xc1" +"\xe4@\xc3];\xe6W\xe7\xbb\x88\xcd\x61\x19\x31\xbJwu\xe7\xe5_\x13\xd8\xc2\x81(\x1b" +"\xaa\x65\x16\x43z\xbe\x9d\x90\x2\xc6q7#\x9d\xae@\xd9\xe4\xedlj\xde#\xbcnk=,\xb0g" +"=\x18y\xf8\xb3\xe5\x89\x85\x9c\x9d,#\x89\xdb\xed\xd2p\xe6J\x3(\xb7\xad\x43\xe4Z\xea" +"\xe5\xac\xea\xe5S\x9e\xc0\x18\xbb`\x3\x92\xba\xaa\xef\xd5\xf\xc1m\xe0\x1a\x18-\x94" +"z\xef\x11Z\xa3\xd5\x32\xbfW\xb7\xc1\"R\xe8\xf0\xda\x91\x8f\xbfqh\n\xb5\xc\xff\xcd" +"a9u'\xf2\xcc\x1\xed\xef\xcbG\x6\xf3\x4\xed/\x8f\xb4`\xc2\xf9)yv*}\x98\xc8Q%i\x9f" +"\x14\xec&C\xf6\x90\xe6\xe5\x1d\x94|'\xca\xe3n\xc6G\xe1\x82\x3\x99\x86h\r\x2\x90v" +"\xf|\x95\xf8+\xb0.\xe9%TH\xb7\xa2_o\x80\xd5\xb5\r\x31\x39\x82~\xc5\xc1\xab\xe6_\xda" +"\xe\xfaS]<\xf2\x1b\x4L\xe9\xc\x8b\x7fK\x8d\xa3\xca\x38$\xab\n~\x87\xf3\\\xdb\x35" +"\x1du\x85\xbf\xa7\xaf\xfc\x1cM\xev\xec\xfan\x3\xdf\x84\xe2gN,@\x1\xa3\x18?\xbc\xfa" +"\xe9\xc9\xb9\x6\xd2\xc2o\xbc\xd0OpL.\xad\xa7p\x12\xfb`\xc5\xe2\x92L\xa2\\\x19\x8b" +"Qf\xf5n\xe9\xe3L\xb6\xe7G\x89\xd8 \xec\x41\xc3\xe1\xd1\xbf\x38\xc7Q\xba\x9d\xa7\xfd" +"\xb9\xcc\n\x38\xcdO\x8a\xa4\xa1\x9f\xf3Geh\xe8&\xcb\x9d\xf6\x10\xbf\x96\x9c\x3\xea" +"SNm\n-\x97}\x81\xf5\x66\x32\x43\xd5\xba\xe8'\xf8\x5\xb\xeek7\xe1\x1f\r\xfd\xfe %" +"S+\x6\x39G\x1a\x46Y\xba B\xc4lD\xe3[\xb1\x34\xf3\xe6\xcf\xf4 ,\xcblg\x83\x61i\x9" +"(\xe6\x99\x83\xac\x90\x7f\xfbi\xbe\xdahg\xf5-%<\x12\x63'5\xc9\x9c\xd1qoF\xe8\xb9" +"\xb5\x96\xfc\x1b>l\xda\xe8\xbe\x34\xac\xe2\x98|eF\xebN\xdf\xc0\x9d\xabH\x9eO\xaf" +"\x9eN\xff\x9eP\xfb\x89\x5\x96g9\xae\x94\xfdP\xe3\xfaz\x8ak\xe0T\xb8\xb2U\x9\xbc\xc5" +"B\xf8x0\xc6\x1d\x38\x5\xd5\x98\x93\xaf\xb5\x96\xc5W\x8d}\xee`\xf1\xe6\xc9\xc8,`7" +"b6\xc2\x12\xc4\xb1\x36h(\xb8\xac\x8d\xa8\x9fN\xf1|8\xd8\xb0\xfe\xb4\x65|\x95\xd7" +"c(QqW\x3\xdb\xbf\x11\x63y\xa3\x38R\xf8\x85LH\x8a\x1\xe7\xad\x81l0B\xf\\\x12O+\xf1" +"`\xfeH&\x16\x9b\x97\x85\xb5GX\x0\x33\x64\xe1\x32\xd2<1\xa2vr\xb7u\xb5\\\x89;\xac" +"B\xd0X-tc!\xac{a$r\xa8\xb1\xa6\x37\xcc\xd0h\xa8gs\x6u\xeb\xd1\xb6\x0\xf2\x37\x65" +"T\xdd\xdb}\rt#\xf8\x4\xb3\x4T\xd4\xddz\xaa\xa8\xd7\xf9}S\xd8\xce\xe2\x36\x37t\xd7" +"\xe6\xb2\x81=\xa6\x4!Z\x8b>a\xcf\xf1h\x1rviT\xc2\xc5\xbf#N\x98M\xd8\x9b\x18\xfb\x95" +"}\x81~\x89\x95LE\xf1\xff\x8aT>\x84\xfa\xc6\x31q\xc6\x9a\xda\x1TLn\xd7L\\\xa2\x84" +"\xbb|\x96\x82\x8a\xb2\xc3s\x8\xd9#rw\xb2\x1esW\x14UM\xc0\xb9\xcb\x96N[8\xfxW\xe9" +"\xe1rO?\xf6,\xd5\xe1r\xa3\x62\x18\xf1\x1\x7fT\xe2\xf2\x7f\x8\x1bN\x7\xa8\xa3\x6\xd4" +"\x99K\xef\xc3\x37K\x7\xd7&\x14X\xc7\xa6)\xdd]#i \xdf\x81\xa8\xcd&\x98Y\x19\xaaY\x8f" +"\xa2u^\xec\x82\x12\xf9\xd2)\xb3.\xd5\xaa\x83U\x1f\xc4\xd6\x97\xef\xc\xfaTa\x16\x1e" +"i\xd1\x6\x7\xf4^\x84$Jy\x9b\xad\x91\x31#[\xc6\xf7\xb1\xa3\xb6\xcc\r\x85+\xd5\x99" +"\xd8Ti\xbb\x9a\xa6\x16\x61\xd8\n\xf8\xd4n\xc1\x1e\xb4\x91Z&Q,\x0\x8\xc4\xca\x38." +"\xb6\xcd\x1aRa|\x93\x16]\xed\xc\x90\xcdt\x7\xfer*\xfc*[\x92j#\xf5\x4W\x85\x96+;w" +"I\x95\xe4\xe3\x8b\x64!}\xcbP\x17\xfd\x38\xb2W_\xa0L{<\xc0\xb5\x1f|\x90\xd7\xe8\xfe" +"\x89\xb3^So\x6\xb4\xf3\x1b\xdb\xcc\x31\x6[\xdd\xc8\x9a\xb\n\xbck\\*+\x8M\xee\xd7" +"t\xdd\xc0\xf2X\xca\x9a\x9\xa7\x95\xe5\x32\xe6\x62\xd7hR\xc7\xc2[\xeb\x9bqU\xf1*\xab" +"\xd7V\xb3\xee\xe3\xaai?\x7f\x96\"\x8a\xca\x62\xef;rP\x85\xb3\x9c\xa0\x35\xa8P\xf" +"D\xd4\xcf\xb2\x10\x64\x6\xc1N6\x1f\x85\x3\xc2\xcd\xffN:v\x1d\xf6\xd6\xfd\xdb\x90" +"\xfd\xb3\x94\xc6\xee\xe6\xa8\x34\xba\x66\x3>Y^\xd5\xdd\xec\xb4\xf4\xa6z\xe6\xb9\r" +"\xea\x98qbp\xbe\x19\xd8\x16\x7NNO9\x84q\xfd\xbe\x9c\xb0\x95\x41\xaa\x96\x8d\xdc\xba" +"\x9e\xe6\x34S$6`[hF\xfe\x94\xae\x1(DfHo\xe3X\xa3\xd7v$\x8f\xd5~\x5\xdf\x94\xe8\x44" +"w\x1ak\"\xab\x13\xd3N\x96w,A\x93\xeaN\xe2sM\x9tQb\xb5\x33i\xc5\xcdg\xad:}\x85\xac" +":\x1f\xe8\xbf\x3\xf\x62pu\xb1\x41\xd3\xe\xf2\xf3H\xf0\x32\x38X\xb2=\x9d{\xa8\x8b\x9a\xa2\xaa/%<" +"\x12J\x1f\xd2\xab-+\x9b\x1b\x8d\xf9\x8b\x84};\xfb\xd8\xbb\x13\x14\x65\x88\x9b\x19" +"P}\x85\\\xac\x90\x33\xb\xcb>\xd2\xc\xb5\xf\xbe/\xb9\xf3\xf3[j\xcao\x90\x9e\xf4&x" +"\xa3\xd4s\xbet\x15\x4\x90TiO\xbfg\x1e\x38\xfe\x65\x64\x1e~$\xc0\x14N\xa2\x8d\xe8" +"\xb8Q\xf5\xefG\xe5<\xc1\xad\xed\x9a;\x94L&!3\x87\x89\xd0\x38\xa1\xec\x95]\x93k\xba" +"aw\x95\xfdO\xe5\x17\x17\xdf_\x8a.9\xf4\x15\x35\xf6\xc7\x87\xbe\xdf\xc2\xae\xd4\x37" +"\xd0\xeb\x81\x1c\x91\xcd\x1a\x14_\x4?,\xe7\x6\xe3\x9f\x30j\x92\xb1P\x1c\xd2\x39t" +"\xe7mD\xdc\xe1\xac\x81\xce\x96\xfc\x8bX>V\x5\x33\x35v\x12pe.K\"\xa3\xd7\x12\xb2\xe6" +"\x1e\xa2/N\xdd/\xe0K\xe1\\>\x9a\x8e\x9f\x44\xd4\xfe\x90\xf3\xf7P\x9a\x62\x8a\xf4" +"\xb4\xde\x43\x15h> M_H\xf\x8f\xc9\x14\xbc\x96>\x12\xf\x1d\x16\xben\xcc\x92\xa7\xe3" +")s\xcc\xb5\xbaq]pj\xc8\x6^\xda\xfb\xbe*\x91\x64\xe9\x8a\x8bpa\x87\xb3\xbe\x7|\x9" +"\xf7G\x82\x85\xbe\x1b\x1b\xa0\x89\xec\xeblbk\xcd|\\L\x2\x62\x9d\x7\x8e\x9a\x93\xf4" +"\xe2\x2)\x12\x1frz\xa8\x1c\xa6\xac\xca\xe5\x86\xab\xb3\xc0\xae\x2\x16\xf6\x1e\xb0" +"\xb1^\xfa\x96\xfaPaj\xb0\xa2Y\x1e\xdd{J\xb0\x9a\xc8}\\$\xde\x37H\x92\xa6\x8e\x2j" +"y\x1b\x45\xef\x30\x8\xff\xcc\x6R_\xf8\xb5\xf5\x46]\xeb\xcd\xd0\xc6w/3vW\x17W\x1d" +"\xc2\xaa\xb6\x61W\x99R\xcb}\\JIF\x14\xbf\xe5\\\xb5\x1b\xfc\x82\n\x9'\xae\xc3\xf4" +"\xca\xfaSm\x98-\xd9m\xbeG\x88\xb8&.j_\xea\x61\xbf\xbdj\x80\x94|\xfb\xe5\x38\xc7\x17" +"\xd4p\x1fu\x80\x31\xb9\xeb\xf8Y\xcaq\x97\\q\x14\x84\xb3*\x6GW`};\xe6\xfa\x32\x1a" +">\x1\x89\xc3\xd5\xf9\x16\xd6\xc1'Q\xc0\x64\x41\xfd\xd8\x33\x14\xe3\xeb\xa0\xa2)\xa2" +"\xa6v0Z\x13\xe1\x9e\xb6#\x93\x8\xdd\xbb\xdb\xbd\x38\xa5V\x17\xbc\xd4\x82>G\xb0y\x3" +"\xe1\x8cn\x83\xf8]U}\x1f\x15\x9d\xf6\xce?\xcd\x63\xf1\x82\xbc\x45\xd0\xb6\x8f\xe3" +"\xab\xf1\x19\x7f\xb2\xb0xI\xc5\xa5Q\xacJ}3r\xd3o\xd0\"\xe\xf3\xeb\x16{\xcd\x95Xi" +"\xb8\x5\x87\xd1p=\x8f\xe7vA\x18\xbd\xd2t\x8\x1c\x8d\xd5\xad\x8d \xda\x66\xa4k\xc2" +"\x96\xc7\x80\x7\x88\xff\xe2\x1eR\x10\xa7\x8f\x16\x7f\x38r\xde\xfa;\xe5;\xf\xd0\xd4" +"7\x18\x7\x16\x1b\xe1/\xae\x19V\xe2\"\x45l\x99|\xe5. \xf3\x65H\x8e/h+}\xce\xde\xa4" +"\xff\xd4v\xb1\xfc\xe\xff\x1fL\xacVS\nE\x9f\xbfm*\x80V\xed\xdc!\x1e\xd4k1Q\xbd\xa1" +"\xda:\xb\x81\xa3Z8C\xf0vL\x9c\xe8\x36i\x11q\xe3v\"\xda.\xe\x8e\xd2~\x9c\x66\xef\\" +"\"\n\xc2\x31\xb2\x8b/V6#\x1f=\x7v\x95\xd8\xfa\x5\xbc\x3K\x13\x90\xd7\xdf\xe1KuG\xc2" +",>\xff\x1b\x8d\xa0\xed\x34\xa1\x3\x64\x15\xfa\x35\xc8:A\x1c\x88\xfb\x5\xa2\xb4\xaf" +"7\xc2 \x94->\xferF\xa1qH\xdd\x97\xbf\r\x1dN\xe1\xee\x89\xb5W8\xb7\x16\xee\x1\x1a" +"3(3\x82 D-\x84|i\xd6\xaf\x46\xe8]\x17~0\xc7\xe9\xc5\xd9-\xe6\x1a\xde\xc5\x65\x10" +"1R\x80\xf3\xb7\xf4\xb0p}7\x9b\xde\x95U\x8d\x16\x8cP\xfa$\x2\x15\x9a\xe8\x9a!\x8a" +"\xc9_\xb9\x82\xfc-N\xe8w\x9f\xb0\xb9i\xd9N\x97\xc4\xce\x94\x93p\x94\xd2\xc3\x0\x96" +"\xcd\xb4;5\x7f\x11\xdc\xba\xc4\xd8\xe0\x2\xe3\xa6\xeb\xa6=\xaa\x9ew\xf1\xdc\x14\x88" +"0\x86\"W\xa1\xb0~\r\xbf$\xc6\x8\xf3x\xf9!hj\xe2\xc6|d\xc6\xc3|d1\r\xd0\x84\xe\xe5" +"\x94\x9d]\x1a~$p\x9\x19\xee\xdfx\"[F\x12p\xd1\xf1\x6]\xe7'J\x17J\xc4\x98\x1e\x93" +"\xa8\xd6\xb#\xa7\x31\x96\x39\xdf\x9d\xe8\xce\x8c\xe5\xde\\\x3I\xdb\x11\xa9\xd5\x84" +"\xc5\x8d\xc5\xd5>\xeb\x44\x9\x10\x36\x1e\x8b\x43\x44\xa1\xc8\x1d\x99\x38\x94\n\x90" +"f=\xcd)\x1a\x16+xd\xb9\xc0R\xe4]M\xa7\x11+\xd2\x44\x99\x0gp@\xd3\xce\x35\xc1\x8\xfa" +"Y\xb2\xa1\xa5\x10\xc8\xa2\x81\xbd\xb3hx\xb7\xf8\xf3\x9bJ\xa8\xa1\x1\xd9#GBI\x85\x87" +"7\xf2T\xe3\xcdut\x90Z=\x6\xf3\x17\x3(K\xf3\xe3\xbd\xb1X\xae\x44\x8esh>\x1b\x14h:" +"u\x9d\xb6Z\xca]\xf\xe6!P5,\x9dG\xd8\x61\\\x65\x97\xd8GT\xbf\x2\xf2\x1\xb7\x65\xcc" +"x\xf3\xa0O\xe0\xa7\x97\x8\x44/\xb2\xf6\xda\x97\xc5\xfc\xa3\xc0\xdbP\xb8\xeb;\x82" +"\xee\xbcPO\xb0\xcc\x42\xb&~.\xe5\x1d\x82\xef\xbc\x8f\x30\xd4\x38\xa0\xc0\x2]\x8a" +"\xdf\xb)\xed\xdf\x42\x16m\x95\xe8\xc4o\xeb\x63,\xfb^\xfd\x96\x80\x11\x9d\x1e\x38" +"\x8Q\xd2\xde\x3\xea\x38]\xc0(U!\xb9\x85\x9d%\xd8\x43\x15\x15\x19\xc5\xfaK~\xed\xdc" +"\x81\x96H\xdd\x8f\x9c\x17\x19\xd1\x8f\x34\xd0 U\x85\x84\x8c\x95(=H\xc5;\xee\x86G" +"\x1c\x81\xd4\xf0U1\xfb\x44v\xfe\x8W\xd7\x1cW|\x13:%\x84\x38\x43p8#R\xec\xe2y\x8f" +"\x16`\xa2T6\xdd\xc4\xb\x94\x7j\x9d\x14\xba-\xf0\x4n\xd9\x16\xe8\xf0v\xe8\xe7\"`e" +"E\xf9\xc4J6Y\x1b\xb1\xbd\xe1\xa2\x3\x8c\xcc\x14\x1f\xab\x66P\x86:\x10\x1d\xb6\xbd" +"\xcb\x95\x8a\x1f\x42\xe5\x96\x1c\x10\xc9x\xc0\xa6\xb6/\xfe\xd9kL\xf7_T\x82>\x9a\xb5" +"{! \xbe\x1f\xbb\x8f]\xe4\xc0\xf1N\x16\x9H\xa5K\xd0\xa3\xe9\x8\xca\xeb\x64\xb5h\xfc" +"*\x4\x39\x83\xe6\x61\xd7]\xad\x80\x65\x1fj\xb9\xdb/\xc\xae\xb\x81#\xa7\xfe\x9dj$" +"\x2\x99\r\"i\x2X\xfbjd\x97\xa1\x35*V\x8f\xb7\x8c\xcd^`\xae" +"\xca\x9\xf9\xcc\xccY\x11v\r\x82\\Y]\xdf_8\x91\x61\r\xe8\xeb\x35\x13\xdeGRmk\x88\xee" +"\x8e\xff\xd3\\\x16*\xe7\xd0\xfc/k\xb5\xfd\xeaO\xdb\x0y\x2\x7\xd7y_\xb3\xba\xa3\xf8" +"B\xa5\xd0\x1a}\xfc\x41\xea\xf3R!\x91\xb8Zd\xe6u\xd6\xcc\xf6y\xb6]\xf5\xe6Y\xc3\xcb" +"\xbe\x3\xfb\xe7M\xc0\xb8XS\xd5\x63\x92\xbe\x16^L\x8e\x8f\x9b\xfb\xe6G|\xd9\xa3g\x8f" +"P\x89\x44\x99\xd5\x1c\x15\xb7\xed\xd4\xf4\xec\xdfy\xa1R\xa9#;\xfc\xb1!=\xcb\xab\xa9" +"\xbd!k\x83$\x1e\x9c\xd5\x9\xaa\x1d\x8a\x34=R7\xa5\xb0\x91M:\x84\xd3\xb9lW$\xbe=r" +"\xe5\xf5/\\\xb\x82d\xc1*\xc9" +"3\x5\x95\x7\xf9gDS\xdc\x18v\x11\xd9{\x8c\xcbs\x1e\xd5\x91\x9d\xda/\xa9\xca\xdc\x16" +"\xae\xec,\xc1\xa4P\xc0\xf5\xd1tN\xc3\xcb\xbb\xb2\xe3\x13\x36\xe9\x8ez\xa2\xd9\xb1" +"'zy\xd9\x42\x39\x16\xc9\x15\xe6\xc6\xb5\x1/\xd5\x7\x92\x44#\xdc\xd5\x5K\xc4\xe3\x95" +"-B&Ji\x85k\xe4\xbf\xd2\x66\x88T\x93\xab\n\xae{W-\x17\x1)5\xca\xf8;\xfb\x88\x1d.x" +"\xd0i\xd8ji`\x81\xd3\x1f\xc3#\xe1\x87\x1e\xe4\x41\x97rj=k\xc3:\x1c\x95\xe5%\xcd\xb5" +"Z\x91\r\x6\xe6\x8f\x90\xe4R\x5#\xad\x8c\x1e\x82\xc5\x42\xc3\xc3\xd6\x85!<\xda\xde" +"\\\xcc\xeb%\x92\x98v\x8ct-\x7\x98\x1e_\xed\xc1\x42\x4IZ#t\x92\x10\x37\x35\xda\xe" +"\x99\xe1\xf9\xc7>\xee\x0\x33\xcd\x36\x9f\xac\x43\xa2\r\xb2y\xca\xaa\x91\x37\x88\xcb" +"W\xcc\x87\x93\x83\x14\xcf\x80\xf4#\xfc\xfd^\x87\x1f\x31\x83/A\xc7\xa4z\x84\xaa\x15" +"\xf1\x1\xf4\x1c \xf\xea\xd5\n\xc4\x35[\xa8\xa3\x0Q\xb\x8c\x9e\x9c\xa6\x80\xda\x9a" +")9\xd1(\xe6j\xe1&\xb9\x18\xd5\x62\xbf}\xdf\xcbqC4\xc3\xb5\xb\xf9 \xc\x17\xe7P7\x9b\xa9\xaf" +"h\x98\xe4SG\x7f\xb3\x38W\xa3v\xc6\xb3=\xe0\x1c\xf8|-\xcd\xe5\xaa\xe6\r\x1\xc5\x91" +"\xdd\xa0\x87SA5\x8dv\xb0\xc5V[o\xf9\xa6N\xc3}\\\xa4\x1b\x98\xa4\xc4\xe7\x87\x9fR" +"%a\xcbZ:\xe9&2m?\x8dr\xa6t\xc3\xd6\x61v\xcc=\xd4\xdf\xec\xb4\x44|2\xa8\x8c\x9c\xc7" +"W\x91]\x1c\")\x18r\x0)T\x1c\x41\xa7\x65\xabR0\xb6\x17s{\xdb,\x7f\xce\x42\x12\x5g\xb\x90\x9a\xb7\xd6\xd7NTq\xaf" +".d\xa4\xb8\xf5\x6[\xe3_\xc8\xb\xd6\x42\xf3[7ia\x99\x8L\xf8\xeb\xb3\x81\x41!\xa2\xb9" +" |\x12\x32\xfcz\x1f\xd5\xa4\xc1\xc5U\x89\x17\xc6\xba \xc2\xe6\xc9\x1d\x13\x63\xa3" +"\xe1K\xc9+\xb6\xc7\xfb\x61\xc0\x3\xdf`\x14\xe1\xf1\xbf\xe5\xe3\xa2\xf0\x87^\x8f," +"\xf4.\x6i\xd9O\xd4|\xa6\xc1\xe6\xb6\xe3uW4@\xd9q=\xac\xefi\xed\xd2\xe5\xc1\xbe\xc8" +"[I\x93\xed\xb4tY+\xbf\x15\x93\xdeO\xe4\xe9\xc9\xff\xf7\r\x1ck\xefo\xa3\xcfM\xb2\x13" +"\x95\x89g\xa9\xf\n\xd2\x64\x81\x85\x94\xa1\x92\xb8\x83\xa2U\xd8O\xc5\xca\xa8\xc5" +"\xdf\x35Y\xa8\x15\x8a\xc9\x11\xcd#\x9f\xd1m\x19\xc9\xfe\xb4\x1b\x1bK\xee\"\xc9\x9c" +"\xa2\xae\xf4\xa9\xdc\xa9\xcd|1\xa8\xd8\xbb\x1h\xc0\x31G\xc1\x90\x89\xf3\x93!\xfd" +"\xfd\xe1J\x97{5rsU\x84\xb3\x6\x82<\xc3\x65t\x3\x43\x31\xf0hz\x89\x81\xc2\x12\x1d" +"\x1b\xcfn\xa5\x9a\"?R\xeaq\x95\xb7\x3\xc\x9c\xe\xdb\x31\x9b\x85%\xb9\xe9%\x38_\x7f" +"\xfft\x13QQ\x8d\xb7\x14s\xbcYFX\xdc\xf4M\xf7l\xf2]\x11\x8d\x44r&3q`\xf\xfc\xb3\xbf" +" \xc6\xa3{\xbcj\x13\xf0\x99\xfe\xa7\xe5r)\x8e*\xf1\xea\x1c\xfe\xca\x85\xe7x \xea" +"p\x1f\xc4@\xf2-\xd8\x7fo\xe0\xb0\x96\xb\xf0\xaa\xaa\x12\x9b\x10\xdaN\xd2\x7f\xb2" +";\xd8YMSJ\xb7v\xa6\x36\x42\x93K\xb\x6\xa6\xdb\xb7\x85$r\xe3\xc5\x82\x90\xb7\x8f\xe4" +"\xca\xfe\x84\xeb\xb9{\x89\x94\x98\x99\xa7\xed\x18\xcf\xeeP\xb-\x13\x81\x90\xe8\x9" +"\x84\xfbU^\xcb*O\xbd\xdaL$ a\x94\xd5\xaa|A,\xc9!\x13\x39\xf8\xf6x\xb1\xad\xc9N;\x8" +"\xd6*\xb5\x0\xb9\x92\xb9\x35\xf7;\x9ct\x12p+\x6\xd6\xd0\x36\xb6\x8\xb3YHI'\xefV)" +"f\xae\x7f&\xb9\xce\x37\x9f\x97W\x10\xcc#\x16P\xe\x37W\xc\xa2\x1a(\xe9`\x19\x5\x39" +"\x85P\xc2\x1d\x13\x12_\x9f\x46\x65\xec\xbd\xba\x9a'\xb0o\x9b\xca\x8\x61\x1b\x1c\x86" +"DE\xe4u\xc5\x91\x66\xfa{\xfc\"\xc4\xbd\xdau\xf3\"w\xa9=-\x90\xd3\xf7Rpq\xfa\xe6#" +",\xd8\xd4\xb0\xac\x81\xe9\xfek\xf6I\x80\xe3\xe5\x82\xa7\xa1\xddg\x92\x9e(\x17\x9a" +"\xe7t\x4w?\x92\xb7\x41\xcdM5\xea>\x7fZ`v\x9\xeum^/\x1bQ\xce\x99\x88s\x6z\x15\xfb" +"\x14\xb2\x16\x4\x18\xcf\xd0%\x97t\xb3\x32\xac\x12K\x90\x8d\xe7\xa3\xae\x62\x8b\xf9" +"|.\x9a\x86xu\xe4\xb2\xd8X\x4\xfe\xfbZ\x88\xfeZ\xce\xfe=[\xa2\xc5:\x1f\xf9\x83\x81" +"\x16k|\xbd\x1c\xcf\x90\x15\xd9:\x7L\xfh\x88\x32^\x2\x90^rs\x91t\xf0\x1d\xdb\xa1\xff" +"\x1f\x66\xfbh\x1e\xf2\xa2\xfb\xd2:\xf6\xb8\xaf\x8cvk&\x94\xbb\xce\x32\x39\xb9t\x82" +"X\x9d\x31\x99\xb1\x36\xe4LT\xec\x34\x8a\x1b\x9dV\x99\x93\x81sN\xfaJ\x8c\x8a\x39\"" +"yWX\xd9\x9b\xb0\x1c^z\xc7\xc9\xe0GA\xb9\x36\x96\x9dw\x16\x12\xbc\xf9)\xe7\x0\x34" +"\xef\x9dx\x9a\x66\x87\xee\x9dq{\xca\x31\x39\xe1\xb1\xae\xfb\x9e\x13#\xe9\xb8\xbe" +"uP\xf3H\xe\xeeJ\xf7\"\xbc\xd7\x80\x8e!\x10@+\xc1\xdf\x63\x1a\"\x88\xe9n\xf8\xd8\xc1" +"Z\xde\x87\xf2\xe2\n\xee\x9ejW\xd4\n\xc4\xda\x8!V$\xc7\x65\x6N\x9d/F\x89\xf6\xb6\x41" +"\xf0\xeb\x32\xc0\r=M\x93\x62\x98\xe9\xfb\x0\x10\n\x93\r\x9\x32\xf2\\\x19O\x9d\xfd" +"\xa3\x96\xe\xd8\xd3\x15\x86_\x17:Q=L\xfa\x9e\xd3\x9a\xaa\x9\x90\x35\x85!\x89\xd2" +"`\xeb\xcG\x7\xb;\x8f*|\xa3k\xfd\x7\xc1%M\x90\x95\xde\xa7#8\xc7]\xbd\x8bj\x0\xf0*" +"io\xe6o\x85\xc8\n=ZU\x19\x4Q6\xcc\xb4S(\xf\x91V\x8j;\x8f\xb4\xd3\x63\x94\xa2h\xa0" +"yBK\x1d/\xb7\x85\x36\r\x7\xaaH\xda\xd4\xdf\x45\xe5\xa8\x86\xe6\xad\xc9\x9c+9Ph\xe4" +"\xdf\xa3\xf3\x1f(\xcd\x81\xe2\xe4L\xf\x35\xc5#\x0\xb1\x8f\xbd\xdc\xd8\xcd\xe4\x82" +"\xb7\xba\x91\x38G\xf5\x1\x89\x10\xbaZ\xa8\xd6\x8a\xbe\x46Y\xa2\xdd_\xfd\xa1\x2\x99" +"\xc\x1\xcf\xb2\xdd\x16\xc9\xedpa\xf5[\x12\x42\xafn\xfa\x7f\x61\x7\xa3\xf\x4\x96w" +"\xfe\xc3vM\xe4\x94\n\xc6\x62?\x3`\xfZ\xe\x17\x3\x98\xbd\x9-\xcb,t\xea\x9c\x9d\xd1" +"Ii\xcb\x63\"\xd3\xcb\xd3\x9c\xb7\x32\xbb{\xf3\xa0\xe8R0\x9\xb3\xbd\x1e\x39wB\xde" +"\xa6\xfe\x12PW.\xfb\xdb\xe4\x15\xab\xa3V\xea\x92\x9f\x6\xda\xb0\xb6\xb3\xa2\x8f\x65" +"e\xb6\xed/\xe7\xa4\xfd\xen*\xd2\xa4\xc2\x7f\xb9\xc0\x39M/'\x18\xc5.|\xfc\xce\x39" +"\xc5\xce?\xbe#\xf2\xac\x7\xc6\xbax\x17\x44\xa1\x6\x12\xf2\xdcM\x8a\x93\x83\xe\x43" +"\x17>\xd5I]-\xf\x1\xccL\\3\\\x14\xfa\x7\xd4q\x1e\xea\xd4I@\xbf\xd7\x88\xf2\x95N\xc9" +"\"\xac\x32\xe3 \xc6\xf2\xec#\xd5\x11M\xd2\x38\xd2o\xf2\x9fN[\xf6:\x1f\x3\xbb\xde" +"\xb8&\x9f\x36\x8\xc3\x45\xe2\x15l\xd3\x42rc\xe4\x43}\xcc`\xd7\xc9T\x3\x5K\x84\xd5" +"\x9c\x83\xeb<\xe9\x7f\xebV\xa6\xd2l\xf5\xa0`w\xa2\xdf\xdb$\x0\x37\xac\x30\xd4\x33" +"|\xf1\xd0\xd6\x1b\xa6\x1a\xd8\x8a+\x90,q^\xcc\xdd\x8e\x80\x11\x8b\xf9\xce\xb6\x88" +"%\xf3\xd4\"\x93\x12\x99X\x17\x96\xf7u\xc3\xd1\xd4\xda\xb0\x2)j\x9fmC\xc7\x89\x5\xba" +"NH\xd8h\xe1\xdf\xcd\x61y$3\x99\xafPL\xb\x61\xdd\x32\xfa\x99K\xc6\x39\x1b\\\x35-F" +"\x16\xfn\x1f|\"\x19\xd3\x87\xe0No\xa6\xdc\x8c\xb\x84\xed\xb8\x94\xb\xb2\xaa\x1c\x3" +"\x7\x7f\xae\xbb\xba\xa2\x36\x11\xa9+^\xeeN\xe6\xfbv\xf1v\xb8\xfa \x1dk\xdb;\x8e\xec" +"fA\xd9\xb7w\x17'\xfeq\xd1&\xe0\x7\x9c\xc9\x14\x8a\xa4X\xea\xd2\xf0|/f9\xa8s\x9a\xe9" +"\xb1\xc6\x89#\xa9%\x14\x91\x4+\xbb\xe9\x9f\xafkP\xd6q)\xd2s\xf1k\x9~\xab\xe8\x81" +"~=\xaeO \"\xf8\x63\xd8\xec\x96J\xac,'\xbd\x99\x9a\x85\xa5\x7\x91\xa7&\xbbt\x8c\xe9" +"\x2\x98U\x80\xe8\xb5;=\x1b\xbd\x99#;}T\x1f\x8c\x9e\xdc\x8d\xe0\x4kWh\xd6\xc8\xb1" +"\xff\xd2\x12\x97\x14\x82\xd5\xa3n\xb1\x43\x32\xb3\xd6\xd7\x1b\x96\xf2\x8c\xe6\x9b" +"\xb1zZQ\x8a\xd5\xde\xdazG\xe2\x10n\xa3R\xe9$\x8c!\x91(\xfc^\x97O\xe4\x12\xb7\x84" +"\xf\x1d\xfc\x5\xac\x9a\x8c\xc3$\x2\x14\x6Q\xe5;\xf\x9d\x94V\xf0N\xfbY\xae\xba\x33" +"\xdd\x8[z.\xf8\xd4N\x14\x1b\xb8\x62\xc6\xbd?\x95\x8d\x5o\x9d\x61\x30\x98\xd9\xe\xe8" +"\xed\xbc\x9:\x1f\xd2\x66\xa5\x1b\xb8N\xc\x6#+\x8c\\I\xe3\x3\x8e\x89\x64\x96\x1\xe3" +"\xe5?K\xff\x8b\xca\x4\x0^rz\xd0K*\xfbS\xcbY\x8O\xe6\x98\x7\xbc_7\xc3\xda\x82K\x93" +"&\xfbS\xc7\x90\xc5\xf8p}g\xca\xd2\xbd\xb7;\xf1V\x1\xed\xa8\xc6<\xa0q\x9a\x42\x9d" +"+\xda\xe4)\x14\xbq\x6\xee\xe3%\xbd\xc4\xcf\xa1\xdbG\xf1\xe7\x90Y\xc6\x45'\xa2\x62" +"\x86\xadt\x8ay/\xf5\xce}\xdc\x9biaV\xef\x3\xfb~\xf7\x34\x37\xee%\xd5\x37\xb8K!\x8a" +"\xe2z{\xc7\x42\x16\xb4\x90\xc3\xa0\x83\x36k1\x14\xe9\x99\xca[\x80Ml\x16\xca\xef\x84" +"\xf7\x12\x88yS;\xf5\xa0?\x88\x41\x8f_\x19\x8a\xc0o\xd9\x35\xc5\xf0\r\xf6\x45\x6x" +"=\x84\x81\xccG\x8x-\x95\xf5\x7f\xc8\x8e\x1b\xbb\xe7\\\x4\xda\x44 \xc\xc5\x1\x44\x19" +"\xad:\xe2\xb9#\xe7\xb2\x8eY\x89\x11,\xefH\x88\x41l0s\xb4\x1a*\x81N\xad\x6\xeb\xe" +"\xe1\x9b\xe2\x96\xfb\xcc\x1d\xbe\xfaY,\xc\\\xa0\xfc\xf1#\x7f<\xab\xb\xc6\xdf\x38" +"1\xd4\xe2#\x96\x83\x8f-#jW\xd8:\xe7jJ\xf7\xf\xd1\xd5\xcd\xb3\xc9\x9c\xc0" +"\x81}x\x14r\xcf\x7f\xc6\x1\xa1+,\xa1\xc8\xf5\xa1\x30\xa1|h\x80N\xe4\xb5\x19\x0\xbd" +"!8\x97\xb\xe7\xb1\x36\x43\x62\x90Q\xd6\x44\x4\xb0\xda\xfc\xce?\x8b\xb9K\x8e\x41\xc7" +"\xe3\xbf>\xea\xc3I\xc7l\xcc\x13,\x83\\ P\xc6\xe4\x65\xddR\xd5\x63\x1f\xbaY:\xa9\xee" +"a\x0\xa9\xa3?\x1c\x12\xa3\x92u\xaa.x\x99\xbaZ\n`\xac\xd9\xc3\x91\x9b\x8\x66\x65i" +"d\r>\x82\x65\x0\xbf\xb1\xce\xec\xc8\xe0^!s\x1\xb6\xa6N\xe8\xec\x8f\x89G\x0\x87\x82" +"\xf0\xf1}2?\xb6\x17\xd2\x1d\xbc\xd3)lw\xcb\x6R\xc0\xc0\x19\xe8z#\\F=`\xf8\xde\x9b" +"\x80:{\xfd\x30\x97#\xd2\xde+\xb5O\x84\xb5\xd1?R{\xcd\xe9\xae\x18t\xea\xfc\x95T\x88" +"\xed,Z.\x88\x1d\x9a\x8e\x94\x90\x9d\x81\xac_\xbd\x16\xf2\x98\x92\xb6\xd8\x18\x65" +"\xdeR\xfcg=\x8d\xc4` \xc1t\xb6g\xf1\x84R\xebq\xe2$~N\xe5\x4[\xf5\x85za\xd1g\\y\x13" +";\xb6\xdd;9A\x1c\x98m?F\xc7\xa2\xda%\xe5\x9\xca\x89z\xe1\xde\xf8\x90\xb7)\xe4\x8f" +"\xe3\x94\x8e\x97\xa3\x62\x95\xb\xf2\x8a\x61\xf0\x83@(\xdb\x36\xecN\x90Y\xdd&\xaa" +"\xc4\xff\xf5\x83\x90\xf0\x7;\xf4\xbf\xb4\x86\x45\x6\x1a\xa5\xe2\x94\xbc\x11\x66." +"\xc9\xfi\x5w\xca\xc4l~'\x8d\xd7\x87\xd6\x6\xac\xbf\x43\x0\xb9W\xc0`\xe0\x81\xecm" +"\x19;m`\x8bxR\x99\x18\x41\x41\x18\x9f\x11\x3\xeen\xa5\xd7\xfbi<\x9a|{\xfcy\xb\xf0" +"\x14!\x8d\xfd\xa2\x7Y\n.\x98\xf5=yOY\xd7\xf2\xa9\x8\x18\xa4_\xe0\xb6/\xb2\xac]\xd0" +"\xd3I\x1e\xe9[\xb0;\xeb\xc\x80^\xc5\xc3\xcc\x62\x6\xec\xc1\xbe\x90)\x96I$k\x7f\xd0" +"\xe5\xfe\x16\x63rO1\x9\x32\xf4G\xa9T\xf7\x92H\xbf\x7f|\xba\x8e\x0\xdf%\xcf\x43\x1b" +"y\x7\x44S\xed\xf5\xe3L\xef\x8f\xc2\xbbSZ\\?\xf6\x9\x34 \xdc^\x91\x19\x62\xac\xdb" +"\x83\xfb#\xfa\x93\xcb\xee\xb7\x8a/\x8eT7?\x97\x18\x87}\xa7\xfc\x1a\xe8\x8as=W\x1d" +"\xe6\xf0\xa4u\xa3=\xb9Sb\xdcr^\xcf=\xdcK\x80\x91\x4\xcf\x9c'y\xa8\x19\xc9\x12n\x8c" +"\xbd\xa4\xe7\xab\xaa\x1e\xce\xf5\xc\xca\x61\x33\xf2\xe5\x37\x81\x1e\xee\nJ\x92jM" +"\x5K\x83\xba\x87\x31\x30\x7\x39Q\xc5\x9f>\x9\x15\x7f\"M\xe0\xd4I\x80\xe>*\x81\x9d" +"\xc9[\x81\xce\x93N\xe7\x31\x33{\x90\xeaS\xa0\x19%\x9e@\xb4\xad\x31\xe6\xc8)\x91\xbe" +"\xd5\xe7~\x7\xc3niGI\x8b\x34\x64\x46!\xa3`\xc2\x14Ye\xc1\x9f \xaal\x98\xce}\xc2q" +"\xa2u}\xb5q\xf6\xf3\x8e\x80\xc0\x87q<\x8c!\xd9\xcc\x4\xe1\x87\xbe\xf6\x7f\xfa\xe" +"\x13?)w\xb0u\xf6\x82\x1a\x8c\x8bO\xd8[\x81\x16Zo\xa3|\xb7N.\xc\x62\xbb\x8f\xf6|\x18" +"x\x9fyK\xa2xG\x81\x2\r\x31\xe6\xfc`\xf8\xc7\x96\xbe\xcf\xbb\x99|\x9_p0\xc1\x95\xdd" +"\xd8\xd6\xab\xdd\x91\xdd\xb0\x11yq\x2\xf5\x7\r\x9\x86\xd4\x63\xaa\xa7\xfb\x12pBf" +"1\x0\\{\x91\xe5\x46\rI\x8f\xbf\n\x1\x42\x42\xb\\\x96Iv\x5\x1\xb0;\xfd\x85\xd7\x4" +"\xc8~\xce\x8e]\xbb\xb3.\xc4\xa3\xdb\x90$\xb0ZK\xe4\xc9\xe8\xc8@\xc3]8h\xe2\x34\xcd" +"\x80\xac\xf8\x1d\xe8\xb6\xc8\xa3W\x81\x17\xd8\x9aG]:\xf3gIn4\x7\xfc\x96\x86o\x1d" +"f\x8e\x90\xc7\xe6\xe6\x8e][\xb8R\xba\xf\xb2\xdf\x43\xf2\xbe\xb8\xcb\xb4\x66\xd7\x45" +":7x\xb5\xb2\xa7,\xcc&w\r\"\xc0?@\xd6\x80\x2\xf7g\x82\xb4\xe0\xa6\xa3\xfd,<\x0 \xfc" +"p\xbes%\xae`\xbe\xf3\x5\xad\x89\x1b*\xdd\x61m\x1b\x37\xfY\xb2\x99\xd9\xc\xd4\x5\xbe" +"\x1al\x2\x81\x7\x80\xcdQ\x80\x80\xf9Vw\x1c{Q\xfa\x8f\x32\xfb\xb5\xc0!\xe5\xd9.\xfa" +"\x14\x1f\xbd\xd2\xb8\x91\xa8\x43\x61t\xb4Z\xee\x93\x80\x8c\x66\nO!\x81#\x8b\xc2\xd7" +"\xf5z\xf3\x7f&L\xb6\xca\xad\x8c\xf4\x85\xa5\xab\xb5X\r\xed\xc0\x2\x89\xc5\xed\r\xce" +"~\x4\xd0\x2Y+\xbb\xee\x15\x81\xba\xe2\xf7\x98)\xb5ke\xc4\xe9P\x80\xe8\xddY\x7\xf4" +"D\xb9\x9I1\xcbX\xd7\x62\xaa\xfdqY3P\xda\x9b\xbf\x8\x34`\xfc\x87\x88p\xb6\xb4~\xc8" +"\xf1\x41\x0Zc\x83\x30~\x4:\xe8\x8e\x1dG\xb8]\x80\xc\xc1|0\x9f\x36g\xba\xbS\x99>S" +"\x96\xdd\x9d\x10\x8c\x35\x11t,\x9f\xf6\xf2\xb3\x1c\xda\x90\x44\xb2\x9e\xd3;f\x2\xea" +"R\x97\xaf\xf7'3y7\xf5Z\x98\xaa\xd0x6x\xcb\x7f\xce\x87\x82\xdb\xee\xfaJ\xe2\xfc\x39" +"\x8ft*\r<\x85\xdeY\xf1\xc4 n:\x19\xcO\x1b\xe2Y\xff\xaeX\xe9<\x2\x96@\x97\x14r\xf1" +"\xe2\x91&\xbb\xe1\x98k\xb2Vm.\xa7\xd5\xd3M\xca.\x1d\x16\xc\x99\xfa\x0\xce\xb4p\"" +"6\xdd\xbcn\xd3\xba\x0\x92\xa2\xaa\xed\x18\x11\xbf\x45\xda\x9d\xeb\x45\xde\xa4\x66" +"9\xa7Z\x4g\xc\xd6\x96\xe8J\xe2\xebh\x98\xd3\xc7\xb5\x45\x33\\\xa2\xc4\xdb\x65\x97" +"\x4O\x84\xeb\x90\xee\xaerl<\xa7/\x88\x64U\xbd\xd8\x4>\xb2\x18\x17\x90\xae/\x83\x1c" +"74-\xe2\x44\xa5\xb3\xba\r\x19Jw\x8czJS\xc5\xe\xd3\x8e\xed\xfd\x15\xbdR\x85\xff\xa9" +"F\x8e\xe0\xa1P\xbb\x81\xfb;\x8f\x93\x16\x95\x18\xe6\x17j\xe4Y\xf5\xea\xaf\xa7\x81" +"\xc5\x4\xec\x83\xd9`\x99\xeb\xcf\x89%K\xb6&\x1c\xc7\xfb\xf0\x94\xd0\xf6n\xa3\xe5" +"\xb2\x42\x9d\x8e;\xec\x8c*{\xc1|\xd7\xe6\xf4?\x3\xdeG.Q\x5\xf4\xfa\xc\x1d\xb4\x16" +"?\xfd\xck)\xf9\xe2n\x8f\xcf\xb9Ie$yI\x6\xac\xd8M\xbb\x89\xebv--\x83\xa4\xce\x1b\xe9" +"\xcc\xbb\xcb\x19\x9/\xa5\xd8\x1f\x96\xeeY\xbe\xf0" +"\xe\x64{\xfbU\x84\xc4\xb8G(\xef@Q\x96\xb6\x3u$\x19\xee\x12\xcdp\x8e\xb7\x46\x9e\xac" +" \xc6\xa7\x62\xc3n\xec\xf1<\xb9\xf6(\x82\xd3+\xcf\xb0\x92\x9d\x94\xf5.\xf7\x42\x94" +"\xfbwpx\xba}8J\x1.k\x5\xbb\x3U$\x16\x81\x99\xfcH\xeb\x5\xdf\xcb\x45\xc0\xbe\xa3:" +"\xbb\x42\x36~l\x86\x38\x8f\xdc\xb3\xbe\x18\xbfs~\x98\xf1\x14m)\xa8(7\xf5\xf9\xcb" +"\x7f\x11\x30\x9an_\\\xa8+i[\x94\x1aY\xcb#m\xb4\x1d\xad:\x96,\xac\xc4\xf7\xaei`Av" +"\xb6=\xa4\x16\xba\xc7\x1f\x6h\x8am\r\xce\xbc+e@\x1aMzdI\xd7Q\x88V\xbh\xe7\xd4\xed" +"S\x83!\x9c\x33\x6/\x85\xf0\xd8\x1b\xa3l\xdd\xc2\x87\xbe\xb0\x87\xee\xfd\xf7\x91\xd9" +",\xb3\"U\xb5?\xde\x3\xa0@\x80\xcfN\xf1\xf9\x42\xdb\x43.\xb4\x8\x19\xa1\xcc\x5\xd5" +"\xb7\x85\xd5_\x9c\x99\x91\x80\x87\xbehI\xff\x2q\xa0\x14$\xaa\xeX\xff\x89\xcb\xf0" +"\xbd\x95*P\xbak\xfc\x91\x8f\xc6\x8\x43\xd1u\x1duC\xec\xb0\xc5?\xe2U\x7\xef\x33\xb7" +"Fi\xba\x1b\xd1\xd6,\x95\x37J\x99\xaf\x32\xec.\x9a\xfd\xe9T\x8fk\x9a\xf7Su\xc7\x88" +"s\xe5\xe4\x85z[\x13gj\x9d[[\xd1\xf6\xf1\x45OHE\x1a{\x85uK\xfd\x62Vm\xee\x12`\xd4" +"B\\&\xa6\x1x\xb8\xe8\xf8\xb9\x39;\xbc\x4\x0I\xe7h\xb2\xf7\x45,\x96\xeb\x8a\x9ez\x96" +"\xf7;\xf2\xca\xad\x83l\x98\x1c\x34m?\xed\xa0\x42*(\xfb\xf8\x9a\x0\xa9\x9a\xf0\x34" +"\xcf\r]X\xd2\x41\xee\x8fOIY\x9b+=i\x16\xd9\xdb\xda\xb6\xa4\x38\xf4G\xff\x9c\x14\xc3" +"\xe4\xe6\x81\x9a\xfd\x4\xf0\xbd\x32\xb\x92Pf\xfc(Y\xeb\xe6\x43\xad\xd4H\xf6\xa4\xe6" +"\xd2\x9f$\x8a\xf5,\xd0\xcf\xfa\xfe\xbf\x5\xce\xb4\xec\x46y\xd4\xf2\xd8\rg\x19\xe9" +"\xd9\xe2\x34$)\xcf\xba\xd1\x9d\xf8\x1d\xa3\xda]\x95\xed\xee\xd6R!^4l\xadoF\xb5\x88" +"\xd8\xe4\x81\x9f$r'H\x91\xf2\x17\xdb~\xd7\x89M\x9f\x1b\xfa\xdcK\x8d\xd7\xec\x9dY" +"\x87\xb\xe7\x9f^\x8$\xaf\xb0\xb5>\x12\xe0\xf2yJ\x5\xe0\xb\xe4r\xc3\xad\xb5_J\x80" +"4\x86xt\xe\x99$\xf8H\xdf~\xda&\xbb\xeas\x81\xc8i$,\xd2\x8f)R\x9a\x35\xf4\xb\x14<" +"_o\xad>J?%\xb7\xeS\xc4\x85R\x9f\xc0\xef\x13\xb1\x9f\x35\xeb\x44\x37\x46t8\xdc\x1b" +"a\xca\xa4\x34\xaf\xa2ZD\x9c\xee\x8b\x19\x8e\xc7\xcfJ!\xe9Vp\xf5\xac\r\xd5M\xfa\xe0" +"\xd4\x63\x9b\x61j\x81\xb2\xe1\x83\xec\x63\x1c<\x90;\x11W`\xa2V\xec\xe5\x12\x87\xc3" +"V\x91\x90\xa9\xe9\\\x94\x36\x8a\x8c\xff\xf6\x66\x1a\x46\xf7qCfb\xebr\xab\xb4 7B\x88" +"\xb3\xd4Y\xbcP\x86\xcf\xe6\xd1\\\xe9\x41\xdb\x96Uh@\xfb\xc9m\xa4w\xc5\x9a\x15H\xd5" +"\xd1\xec\x1e{\xbf\xdah;w\x1f*\x9f\xb4m\xd7\xba\xf0\x17\x2\xc9X\xf4\x30\rz\xea\x36" +"\x8\xfb\n\xa5Vb\xd1\x12w/\xd7m\x1e\xb5\xb3\x8a*-\x84\x96\xe9\xb8\x30\x90-x\x2\xfe" +"5\xb3\x34\xb4t\x9b;\xa2n\xc5\x8b/5Et\xae\xa8\xf4\xd7\x65;\xce\x99\x19\x8d/\x9b\x6" +"\xbb\x81\xa4\xf7V\xb8\xe5\x89\xca\xc5}r\x7\x30\xa2\x17\xc1Y\x87\xb5\x9e\xe5M'\xaa" +"Ak\xb6\xeeQ\xfa\xa8\xdcq\xcb\x7\xa4\xda\xb5\xf2\xa4\x64\xb\x82\x61\xdb\x1c\xads\x83" +"N\x93,f\xe4\x12y\x5\xaa\xea\xe7\x99\x43$6\xdc\"\x85}\xc`\xd1\xd9\x7[\x1c\xe7\x81" +"\x89\xe5/R\x9d\xed\x81\xf8\x7fx\x19;\x16i\x17\x38\x97\xd7\x9a\x3\x97\x97YZ`+jH;I" +"\x0\x17\xa2\x87Y\xf9\"\xe2U\x1d(\xde\x9b\x19]\x81\xa4\xbc\xf1\xd8\xcc\x1b$3\xc0`" +"*z\xa7\xa8\xd2\x8e\x88\xff\x9f\xf2\xac\xb5\xc7v\xe5T|\x9b\xef\n\x81\x44\xfe\xe9\xc7" +"5)F1\x1\xc7\xcf\x19\xe\x64\x1c\xe3\xe0X*\x5\x96\xfd\xda,\xd3\xa8 \xbb\x37\x86\x0" +"\x81%\xa5\xc2vBM\xb\xbc\xa5\x7f\xc4\xe9\xf1:b+\x95\xa5\xf1-/9{\xf7\x16\xcf\x2\xf9" +"\x81\xe0r\xe3\xeb\xd3/\x0\x90\xd2x\x88[\xf5\x19\x6{\x9e)\x9f\xe9\xee\x12V\xc3\xcc" +"\xad\x63\x9b\xb1\xa6\n\x18\xb7\x3\x31\xbaKt\xb0\x98\xfe\xa7\x3j\xcfh\xd8m#\xco\xfb" +"\x9\xb3\x1a\x8b,\xe6\xa4\xa2p|\xc7\x93\xc3;\n;\xec\xb8\x1a\xc7\x93K\xe0\x86\x0\xba" +":\xf5\x97\xbd E\xe4l\xb5\xd9\xb9\x34\xfd\xe3\xcc\xb6&P\xc7\x87\x85\xb1\xb9\x0\xf7" +"6|\xd7\xbb\xd7\x31)\xbf\xfe\xcd\xfbX\xbaP\x97\xf0\x89!\xe8\x14\x9a\xce\x1c\xe0\x19" +"\xf9\x98\xf2\xa5\xf3\xf7\xcd\x81!\x97\x11\x7\xb9\x1b\x12^\xcdP\x1a\xd5\xbd'\x4\xb7" +"\x8e^\x81$\xf3\xfc\xca=\xe9\x61\xbe\xa4\x39\xf7%\xe8\xc5\xe6\x9d\xb9n\x99\x38\x81" +"\xad!\xcc\x9e\nK,\xfc\x91\xc\x86\xe2\x83\x9b\xf\x32\xb7\x97\xe1o{Eq\x88\x11*\xb8" +";\x94\x86\x96\xfdu\x4}\xf2\x12\xc0tf\x7f\xe1\xa1\xdam\x83}~\xc5\xdd)\x8c\xf4\x0\x11" +":4\x91\xf5\xe0\xd9\xaf\x1\x16\x9d\xbc\xf0\xf2\x36\xc2q\\\xc5\xa4\x8a\x13\x37\xb1" +"\x1e\x9c\xaf\x6\x37\x2\x8\xae\xffk\xd4\x16g;\xe6\x17\xaf\x15\xc6j\x90\xc9={\xcb\xcb" +"l9\xc7J\x19\x1evz\xe2w\x13\xa8\xee\x1b\xf6\xb8\x8c\xd3\x10\x9b\xb6\xfb\xdc\x85\x61" +"$1\x81h\x91\x9d\xf1u\xed@\x10/\x8\xc7Oh\xdd\xc7\x1e\x8a\xf1\x31\xc9\xd1\x93P\xd1" +"\xfe\xdbT]9l\xe3=\xe4\xc7\xe6\x83\xbc\xad<\xd6? u&P\xf2\xb1G\xbe\xc5\x1b\xcf\x9a" +"?\xe\xea\x1aO,\x2\x5\x8\xdb_\xaf\x8a\x6\xda\x9b\xa2\xd6\xbb\xb0\x8c\xc1\x62\xabo" +"p\xf0\xde\xcf\x45\x9fX\x94\xe7`!a\x91\x42\x42\x31\xbe\xd5U\x1f\xf3\x15S3\xf8\x8f" +"=\xf9o\xe0:\xf7\xae\x41\xda\x8eJ\xe4\x10\xc\x13s\x9\xe2\x61\n\xad\xa9\x13`\x82\x1a" +"\xca\x30\x9en\x99 \xe5\x8e\x81\xb5\xe5^w\xf2i\x7f\x39\xa0Y\x12w\x0\xfd\xdf\x31 \x11" +"\xf1\x9f\x94\xf8\xbd\xab\xcd\xf7\xa3\x83\x66\x61\x46W\xa5{\xb0\xaa\x1\x84)\xb7\xbc" +"hk\x1f\x44\xb6\xbbL\x2\x6\xeaO.\xb4@\x4\xae\xe8\x10\xbd\xd9\x1f\x1b\x8f\xfa\xa6+" +"\xf3\xb4\x89\xd5\x46\x98\xf1\x85\xf1]aK8S\"N\xd2M\xe3\xaa~\x9d@r\xfc\xad\x9b\x9\x88" +"\xa7\x94\xf8\x16\x7\xf0\xdb*\xe2\x43\x61\x62\xda\x63W\x89\xe3;\x98\xb6\xb5\xa2me" +"\xc8p\x8e\x9f\x99\xac\x8d\x9b\x46)\xe1i\x17\xeO`\xbeW\xb8i\xf0H\x17\x96\x2p\xb5\xfa" +"\xfehtN8\x3\xd4|\x96\xa2tU&\xfa^41G\x8a\xdfi\xab\x30\xb5\x90up\xa9\x81@\x80\xb0=" +"\x81\x10so\x86s\x8d\x98\xc6\xc6Y$\xf%\xe6\x89\xfb\x19z\n\xe7\xd0?N\xf\xb7.\x86\xc4" +"5<\xfa\x44\xd2\x44\x89\xd4\x15!]\x92\xa0|79\n\xeb\x43\x44\xc4\xa7\xe\x0)-\xcc\xb3" +"g2\x15\x92\x9a\x36\xb9g{&\x9?\xa8\xe5\xb1\x36nq\\\x1dy\x1f\x62\\\x18\xaf\xad\xce" +"1\xbc-\x96Ijh\xef\x32@\xca\x91\xac>+\xcd\xbe\xfe\x31q\xcb\x6\xc9\x3zu\xf1Z\xb9\xd3" +"\xb1\x91\xfa\x3$\xdc\x95>\x18\xe8\xc8\x35\xf8v\x91\xf0\x33\xf2\x8a\xda\xbe\x15\x36" +"\xb5\xdd\xf0T9\xf6.[\x15\xd8\xa9\x34\xd2>N,\xaa\x85\x8\x62\xa4\xae[\xb8)\x13\x16" +"\x1\x62\xf9[\xb5\xc\xbcX\xe9\xca\x95\x13\x7\xacW\xa7\xe8q\x97\xa9(\xa8\x8e/\xec\x42" +"\xfe*6\x81\xca\x39\x37u\xfc\xf\x39*@b\xb1\xf6@\x9e\x36\xcd\x45\xa5\xfb\xd9$JSX\xf8" +"#V\n\xb3\x3\x87\x42h\x15Z\xe1\x84~B\x11S7\x89\xa7{!\xa4\xb5\xb8\xfb[\xeew\xcL\xdd" +"\xeb\x88\xf3\x41\xf1Z\x9\x5\xab\xdfZ\xc8\x38P\xc4\x64\xfaY`N\xc0\x34+-\xea\x0'@\x87" +"R[\x7f\xeb\n\x3\x83\x18\xb0\xe6\xf6\x8b\x88\xc7\x61\xb6\xbf*,\x12\xb1\xae\xc7\x3" +"\x91\xb4\xc9Y\x8?L\xda-\x8f\x33UR\x1a\x8a\xd2q\xef\x93\x8f\xf6\x64\xfc\x80\x64\x12" +"Z\xb0x\xeJ\x18\\\x1e\x80\x4\x0\x1f\xd2\xd5\x13\xac\x9e\x1b\x18\x80\xa4\xc6\x62\xee" +"_\xe9\xee\x7f\r\x1d\x98\x13\xf2\xd6\xe2\x2q`\xdf\xf),G\xe0\x66\xae\xb0\xed\xd0:\x16" +">\x83XE\x12\xc0\xe1\xcd(\xdd\xce\x95\xa6\x37\xd6\x34\xfb\xdb\xa3z)#\x9c\xcd\xb8\xa2" +"TO\x18Zs=\xad\x41q\xb3Zi\xd3\xd8s\\\xd9\x14\xda%~U[\xac\xf6;m\x9f\xdc\x8\x8f\x9b" +"\xb6\xed\xa9\xd7\x9e\xe7\x66@?|\xd1\xd7R}\x8a\xca\x91k\rx\x98K\x8dO>F\xdd\xf\x8a" +"\xd8=\x15\x37\x35\xfe\x95\x63\x8\xc2\x98\x7f\xff'\xc6X\xe9\x96\\\xd0\xbd\x12N>>V" +"\xc6\xcb\x13$\xb3\xc\xf3\x1b\x64,\xc8\x6i\xab\xba^\xc9k\xf\xe3\xff\xb9g\x1d\x92\xac" +"\x99k\xeR\xb8\xcf+ \x10\x64\x83k\x9\xcN\xc4\x8d\x13\xca\x17v\xeb\x11\x89\xbd\x83" +",\xd7\x19\"\x9b\x62R\xd8\xd1\xcf;\xbc_K\xfaRd\x86L\xd4\x8\xa0\x8d\xcf\xdc/\xcb I" +"\xc5\xca\xc6\xa5L\x7fT\xa6\x17\x61\x88\xd5R\x13\x12\x81\xc7U\xa4\xb4\xf8\xa4T?\xf7" +"r@\x8b\x93\x5\xfe(\xfa\xae\x97OZ\xae`k\";\xb2\xdf\x83k.\x9\xe7\x13\x34\x81Oe\x19" +"d\x9b\x8c\x42\x99\x93\xa8\xadz\xeb:\x19\xb4\xfei+\xef\xa9-\x96\x44\x16\x84\xe6O\xf2" +";\xd6\x61`\xd3\x1b\xf\x41\x1\xe0\xc8\xee\x46\xde\x8c\x5L\xfaS\xb\xf5\"u=Al\xcf\xdc" +"%\x89\x35\xc5\x63\xb5\xc9\x63rf\xd5\xf5 \xad&\xbe\"\xb3t\xc7;N\x9\x61\x62/\xde\x1" +"\xb6i3\x19\xc8\xbc/\x81\x1fw\x13w-\xc0\xc5\x88\x9b\xf6\x8a\xf5\xa3\xe7o\x8fkkNu\x11" +"S{9\xf\x87\x83h\xbf\x41\x8b|\xd9_\xea|\x19\x88\x18\x84\xae\x65\x18\x2t\xe0\xe9\x80" +"\xb0\x37\xb9\xcfh6\x9\xf2L\"\xd4\x9b_f\xf3\x83\x94\xb6\x8aP\x95\x45\xac%!\xfai\x10" +"\xf\xf1\x9bIv\xf8'K\xa6 \x9e\x1dH\x8f\xfc\xf2\xf8\xed\xca\xae\xffy\xf\x1b\xff\xb1" +"w\x9e\x3\x1\x10\xad\xab\xca\xbb\x37>ri\xbf\xb0\xfb\x8a\x8aY\xc\xc5\x36\x86\x18\xda" +"\x2)\xee\r\xeb`\xfpY\xde\xb0\x94h\x9\x3\x17{b\xcc\x1a$\xbf\xa6pe\xe4\x1e$\xb1uKJ" +"\xc2>Y\xf4V!\xdf\xfb\xab\xbb\x83\x10\x94\xfu\xd4\x8\x8&q\xdc\xf6\xb6\x12\xb5\x4\xd3" +"\xc0\x10\xf\xb6\xb1\x93\x1cG\x1a\xfb}A8\xaa\xb9\x1fp\xb2\x8d\xca\xa3*\x8a \xa3\x5" +":|k\xaf\xd2\x93\xaf\x2\xf\xfc\xf4>\x97W\x8fp\x13\xca\xdb\x61\x32)\x85\x8a\xe5o\n" +"I\x1a\x9\x1fl\x9\xb\x82\xc9\xf9\x88\x8a\x83\x31:\xd6\xc6\x7fo\xaa\xf3\x7fS\xdd\xbd" +"\xf6\x8cv,\xf3\x2\x12\x7\xaeL3\xaf\xe2^\x7\xdd\xf3\x41'\xd5\x12<\xa7\xcb\x45\xcc" +"<\xa9\xcd\xe4\x15\xc5 Y\xc2\x39\x3s\xfd;C\xa1x\xc8o\x9a\x32\xc6Z\xf5\x17\xc4:#\xf8" +"{L\x14\xd1\xad;\x16\xef\xfe\xa2\x43\x6[\xdd\xa8u\x13#4H\x1dh$[\xb6\xc5' \x7fS\xb2" +"\x1\xee\xd4\xf5N\xf4\x80\xae\x5\xa6QlIzs\x82!\xd8Y\xb2xSIx\x3)ES\x12\xf8\x6uT-m\xe5" +"\xa1\x62\xe6\x62k\x82\x1\x1e\x1a\x31\x30\xc2\x8eMlf\xbe\x1d\xc\xe3\xe:\xf0PK\xcb" +"\xc6>IVN&\xa7\xc1]\xe8\x85\xb0\x7)\x85g\xb8\x83\xb4yq\xe8\xa5\x8f\xf1\xca\xdb\xd1" +"z\xdc:\x3\x19~\xca/K\xf7\x9b\\\xcd\xa3\xba\xd8\xde\x41\xb3\x7\xa8\x8\xdd\xb5\x94" +"ka;\xf6\x64\x7f\xed\n\xff\x1f\x33\xfb\xb5\x86\x87\xdd\xcb*qg7G72F\x9c\x3\x4\x9c\xe7" +"O\xb7\xa3\\\xbr\xcf\xb1%\xce\xcf\xf3\x9e\xf7\xbf\x94\x87\x33\xd7sx\x10X\xc5\xf2\xc1" +"\xc0\x34&B?b>\x1f\xfc/\xca\x7L3\x10\xd4\x7f\xe5\x66&\xa0\x91\x41\x9b\x9b\x15k\x1e" +"\x15\xa5\x1d\xad\xe4\xad\xfb\xaa\x1f LP\xb7T?\x9e\x33\x12\x9\xdf\x33\xb7@j\x80\xc" +"\xe3\x81\xf7=\\\xd9\xb0\x85M\xc8\x44\\\xda\xe9\x88i\xbe\x15\x7f\xc0\xa8\x14\xbcL" +"\xde[D\xa2&\xf9xbh\xd0PJ[X\xac\x4Z \xf9TB^l\xcd\xd1\x43\xda\xfd\x30\x88\x95m\x9b" +"\xb6u\xdd\xd5\xee&\xf9\x97\x33\xa2\x1c\xddp\r+i\xa1\xb0\xc8nR_\x9a\x1z4\xa1\x8a\r" +"\xf6\xcf\x33\xf2\xeb.\x91u\x99\xf4@\xaf\xfaw6\xee\x34\x61\xca\xed\x83\xef\x66\xfe" +"2p9\x90\xca\xef\xf9\xcf\x44\xdf\xd1 L\x93\xf2\x8a\x8d\xfa\xd8\n*dV\x98x\xde\xf5\x86" +"WN\xeag\xc8\xf0\x13\x1dM\xd0\x38\xeeSx\xff_\xd5QL\xd0hI\xa8@\xb6\xc8\xe9\x1c\x63" +"\xa5\xb\xc6\xcf\x92Y\xf3\xf4\x90s\x7f\x8dN\xf4\x93\xf2\x16\xc\x9e\xf2\x99\xff\x98" +"8\x8c'L\x9e{8_\xb5\xf0\x45\"\\\x94\xbb\xf3\xccIvu\xc4\\u\xdfJ{X\xdc\xaf\xac,\xeH" +"Y\x17r\x97+/`}\xbe\xed\xc\xd7\xb2i\xddi+\xb4\xfb\xeex\x1f-\r\xd6\x31\xeftb9\xbf\xcc" +"|a\xdc\xd1\xb8Xk\xce\xd1*N\x1awe\xb2\x31\x46\x87\x65|\xe6VW\xb3\x37H\x82o\"a\xa0" +"\xd9\x7)C\xae\xe\xaf)B\x16\x66\x9bX=';>\x9<\x94\xf1\xc5\xa1(\xb8\x13y\x1c\r\xb7\x93" +"\xe0\x17Uk\x9c\xff\xdb\x84\xcf+\xc5#\xb0w=|YT\xa3\xd7\xb4\xe4\x39\xec\x66\xc9\xda" +"\x84Y\xfc}Z\x9ej\xe7\xf6[\x84\x11\xa8\x1d\xc3l\xbe\x3\x12\x9cG]?*\x90\x96\xe6\x8d" +"\xa4\xd3\xae\x1d\xbc\x85\x89=(\xe4\x83\x86\x1p\x98I7z\xb2\xb2\x2\x87\x5\xc7\xac\x13" +"\x0y\x7f\x16\xc5\xea\xf1,\x1b\xab\xed^\xcd\x5\x93i\xab\x32o\xe5\xa3\x46\x43\x10\xb0" +"\x8b\xa0\xc\x92\xff\xe7\x14\xc3\xb9R(#\x1b\x82\x9ex\xf5\xd7W\xc8\x9>?\x8e,)\xfd\xd5" +"9\\]\xac\x93\xf{\x89,i\xc4\"\xc\xe3\x91\x61\xa6\x11J\xd9\xfaOu\x15'\xaa\x1\xfev\x5" +"WPH\x83R8\x3\x0'\xff\xbb\xb2\xef\xd4\xbc\xd2 \xbb{\xd3\x94X\xa2\xa1\x14\x1exq\x6" +"7\x8\xc6tQ\x87\x41\x17\x9a\xc9\x39\x8e\x36\xe3\x9a\x8e\xe5\xadV\xefutw\\>,\x95\xa0" +"\xb9.\\\xc7\xeu\xbc\xd0X\xd3\x4\x9\xf4\x31\x34\x99\\\x8f|\x11\xa6\x13\xfd\x80\xab" +"?c)\x9e\xaa\xc3\x44\x12\xd1\x62\xa9\xd3\x86\xf3\xe9m\x98\xa2\xe7\x14\xce\xa6\r\xa8" +"\x9e\xd2\x90i;}\xa7\x8b\x92\xaf\xbd\x9c\x7\x16*\x3pb\x97\x8fs\xa9\x64\xbb@\xaao$" +"\xfc\xf0\x44$\\\xdc\r\x81\x89Q\xd3h@\x15\x15.\xee\xbfn\x1\xc4\xc4\xf6\xd8RR\xa1\xea" +"(\x4\x18\x2\xfc<\xc3\xc6\x1e\x1f{\xb6\x6Ww\xeb\xc4\xc7G~\x89\x9aZ\xf5\x10\x82GJ\xda" +"\xdc\x99\x8e\xca\xca}\x14\xe2h\xc6\xe3\xe\xcb\x66\x36\x45\xfe\xa3[o6\x89\xeb\xfb" +"\\\xa2\xa1\xc4Mz\xddM\r\xd2\x2(\x9f\x33\xad\xdf\xe2\rH\x99.\x9dib\xba&6\xb6\xc3\xc8" +"$\xbd\x63k\xb\x37\x1a\x9f\xb1\xe5\xaa\xc4<#\xe0\xa8\xd5\x1f\x96\xed\xf6N\xf1\x66" +"\xb\xa7\xed\x81\x1b\xa3~\xd4(\xe\xc3\xe0\x9fh}\xc7\x87\x31\x1a\xd8\xcc:\xcd}\xf4" +"A\xc0\xaf\x33\x86\x32\x66\xfa\xc\xca\x34\xf3\x0tm9\xe8\xc4^\xe1\x12\n\x1d\xdb\x1f" +"\xb9U\xe3\xcf\x87G\xaf|6\x10&\xcbV\x10\xee\xc4>\xbc\xdd\xd1R{\xdc\xe2>^\xdf\x45\x98" +"\xf1`)P\x5\xcbK\xe6\xe2\x1c\xeb\xa0t\x94\xc1\x2\x34\xf7\x82\xf2n\xe3\x5Z3P\xadP3" +"\xc}AZ\x80H\x86\xe9\xefn\x84\xae\xdf&%\xa2z\xc2\x43\xc7\xe1\xbf\x1d<\xa6\x97\x35" +"\xf\x88\x1b\x89\xe1\x9k_II^\x9\xe1vS\xbd\xa2\x8e\xca\xba~\xb7\xd8\n\x35\xbb\x98\x42" +"w\xf7;4\xdf\xd1\x8e\x32\"\xbd\xc9v\xa1\x8e\x0\x35\xd7\x33\xb1\x9d\xa7\xeb!\xe9j\x7" +"A\x84G\xfe\xdd'7\xc,~\xe3M\xa3\xf2\xf7@\x87\xb9\x99#\xc8\xc0\xee^\x1c\xde\xc\x36" +"\x1d\x41\x8f:\xa9J\x1b\xbf\xd1\xe1\x89\x66\x96\xff\x32{\xbe\xb0\x6\xd8~\xf9g\xc6" +"Z\xc7\xc7\xed\xb5\xbf\xc4\xa5\xb1\xa2\x1e\x9\x8a\xad\xcc\xf5s I\xa7\xdc?%\xd4\x1f" +"\xd4<\xef\xc2\xfe\x1c\xfe\x44\xc9\x41\x1a\xac\x1b\xd7]\xb5\xa4'\x15\xfd\r\xbb\x38\xd6\xf6\xd6\x10" +"P\xf8`\x9e\xe4\xcd\x84\xcd\xa6\xd2\\\x17\x65za\xab'F\x1e\x33\xf4)\x94LS\xb9X\xbf" +"\xde\xf1\xb4\xa2\xa6+\xaa\x33^\x92*\x1p\x7\xcd\x8e\x38\\\x99\xb4\x31\xab\x13\xb6" +"|\xcd\xc1\xd3#\xcc\x46\x30\xa8\xbc\xdd-\xd7\x32\x8d\x91,\x9e\xd0\xdf({]k\xe6\x64" +"F\xcb\n\xa0\xc2\x62\xa4\r?\xa7g\x15\xcd\xa7O\x19\xd3Z\\\xfb\xa5P<\x8e\xf8k\xd5\xcb" +"\xd9\n\xaa\xc5,\x4\x1bQI\x11\xab%\xd3/\xabLO\x97\x16\xc7OVViI\x9c/\xdd\xf2\xcf\xdd" +"q\xbd\xcb\xaeV\xcf\x9v\x85\xb6ku\xb8\x14\xbe\x9a\xe\xc6:\xb1\xe6G%\xe1\x95\xb8*<" +"\xab\xc6\x13\xe1\xf3l\xfe\x65\x2\xa2\xb3\x11W\x14\xf6v\xf4x\xa2u\x96>\x9f\x66QO\xd1" +"\xaf\x33\xa7$\xa5\xd4\x65\x88\x18;\x8e\x30KO\xc=\x95\xc2\x9QR\xac\x35V8\x96}\x9d" +"\x93\x34\x89\xfc\x1a\xfe\x9a=L\x8d\xfdk\r\x11U\xeb\x19\x8f\xaf\x5\xbe]\xe4\xb5?\x84" +"v\x94hn\xeQ\xbd\xb8\xe8\xd1\x18\xf9\x88N\xad/'\"\xd5 \xba\xdbk\x0\x96?\x1e^\xd5\x35" +"\x7f\xe5\x5\xe2\xbfY\xa3\x84\xbao'\xactep&\x10\x66\x37\xb4N\xdd\x9e\x14\x8b\xda\xb8" +"\xcbJ\x9b\x9e\xe7T\x16\x88X\xc6\x44\xec\x63GY\xc8V\x7\xb4\x8\x1\xe9\xda\xe3\xb0\x1b" +"x\xeb\xf\x65v\x90<\x12}\xb5\x93}\xeh\xe8\x18R3`i]C\x14\x18\x85k5E6\xd0\xa1\x1\xcf" +"\xa1\xbd\x9f\xd6\x9c\xea!,\x1\x1a]\xc3g\xb1~\x1e\xb>\xdc\x32\xfa\xfeX\xd1\xc3\x8" +"o7\xfc\xbc}\xfb^\x19\xad<\xae\xc8\xe\xd1\xd0j\x97\x9e\xb1\n\xf9\x31\xf3z\x98\xc3" +"\xce\x15\x8\xfc{\x8c\xc9M\x16%\xd0m\xcb\x96\x1e\x8d!\xf9:\xfe\xf3\xacq\x1\x10&\xcd" +"\xf8\x62\xdb\x89V\xf7\x1e;;acu\xda[\xa6kp\x1e\xdf\xac\xe0\xc8\xbb\xe6\xe5\x1f\x9b" +"\x99\x1a\xeeGi\xd9\xe6\x17\xfd`\xfe/\xb9\x30\x93\xf7\xf1p\xe5\xcc\xb6\xb0\xa1\xa9" +"\xb1\xc8U!\xf\x96\xff P\xb5\xe7Gh\xc7\x65\x1e\xceo\xce\xc2\xa2\xa6$yy\xed\xbb\x65" +"\xd1sZ\x5{\xe8&\x82\xdc\xca\x16\xb1\x90i\xf8\xb5\\\xec\xdf\xf9GSi\xf8\xb0\xc1\xcc" +";\xfc\x45\xad\x8a\x5m\xd6\x65\xee\"\xc7\xa2O\xc\x8c\xaa\x97&o\x93\xe9\xf0\xdd)^\xb5" +"\xf9}\xdetMR\x8a\xf7\x99X^\xed!o\xd3\x1 \x7\xaa\x39+\xff\x33\xcb\x2k\xfe\xc0\xac" +"\x7-AA\xfc\xa8\xc\x15\xeb+-0J\xb7\xcd\x5?R&6(\xb9\x8f\xd4s\xda\x93\x41_b\x8bM\x0" +"wzp\xbb\x41 \xa5\xd1mF\x9a \xce=\x4\xa4\xc1\xd2\xde\x84\xc7\xe3\xde\x14\xd4\xe0\xa2" +"I\x16\x7f\x32\x9\xcf{v\xbb\x9c<\xc4m\xa4\xd6\xc7\x63%P\xe2\x62i<\xd4Q\xb7\x12\xdc" +"\x1\xc8\x89\x61\x9a\x8<|7\xb6)\xed\xf1/\xc4\xb4*#\x1d\xc5\x6\x15\x8a\xa0\xc8:\x1c" +"\xe4}\xdd\xa9\x1yJ\xa1\xe9\xc1\x97J\xf8\x18\xefZ\x19\xc4\xf7?\x89\x88\x3\x46O\xd6" +"|\x8a\x1b\xf0\xcb\xb2\xbe\xd5\x16\x1e\x9c\xca\x12\x30\x19\x91\xd0W\xe5\xe9?Ux\x87" +"\x8c\x98Q\x80+\xe4\xff\x9e\x45n\x1_\x17\x32\xd3<\xd2\xc6\x5\x86\\\x90i\xef\xc4\xb5" +"\xf7\x2\xe2jUlb\xd4uId<^>Q\xf6\r\x61\xe4\x88\x39J\xc1\xb4\x5\xa0\xcc\x30\x91\xa8" +"\xc1+\"D\xec'\xb\xb2\xa6\xc5\xa6\xf\x43\xb)X)h\xd2\xf6\\\xfb\x9bj\xd2\x92\x1c\xfd" +"}^\xbd\xbc\x33,\xfdV\x8a\xde\xc5Oa\x0j\xdd\r\x64|S\xff;\xd3\xa0\xc5H\x98H\xc5\xfc" +"\xee\xc0\xbch\x95\xdcj:\x8c\xfd\x64\xc9Qc\xab\xb5\xf8\xac\x5\x38\xa8\x80\x8d\x19" +"\xe6\x1b(\xfax\xfa\x1a\xe2&\xb4\x8f\x38\xfd\xc4\xbb\x38\xc5&]\xa7s$\xbe\x5s\xbf\x86" +"\x9b\xa5\xe3`\xe4\nq\x8\x9a\x1c\x8cm=\xaa.\xecr\x7\xcbiF~\xea\xb3rB\x89-\x8c\xd5" +"\xb5\xed\xb3\xf2\xf7\xb0\x11\xd9\x15\xc0\xe8\xbc\x3\xc6\xdf\x4\x99\xea\xff\xb6\xb5" +"\xc6\x41\x80j\xcaI$`\x87\xc0\x38\xad&E:\xf2\xaa\x39R\xf2+\xce\x83\x5j\xe\xb7\xf5" +"s\x8e\xc1\xb5\x63\xc4\xd5z\xc2\x8e\xea\x8\xc4\xe4\"r\xbe\xb6\n\x8\xbe\xd0m:\x80\xaf" +"\x90\x45\xa9\xd6\xec'\xe2\x65\xc2\x64\xb2\x7f\x92\xe6.\xe2\x43\xd4\xdb\xb1\x62:\x15" +"\xff]" +"\xd0\xf6\x10\xc4\xffrm\x84V\xcd\x88\xda\xba^\xfa\xdf.Y\x1dg\xe9\xdc\xb4\xfdMEuy\\" +"\x1a\"~\xe9\xd2\x98\xbfM.\x4\xb6\xe1\xf5\xd8\xc3\xb5j\xa9\x8f\xea\xaa\xfOxl\x15\xd8" +"#i\x12m\xfd\x7f\x84J\xf6\x62\xfb\x62\xafn\x0\xd3\x9f|[\xae\xd5I_\xe\x66\x81\\\xbe" +"\x9d\xff\x82O\xbeJ\xd0\xd2\xa3\x37\xd2M\x91u\x4\x8d\x5\x35\x81\xd7!j\xac\xba\x90" +"\xab\r\xd7_X\xa8\xaeL-D\xf1!$#\xab\x1d\x0\xd0)\x19P\xab\x4\xac\x34\x1c\x16\xef\x66" +"\x93\xa4\xc4\xce\x8e\\\xa5\xa7%\xdcg\xd8\xe7\xa2\xbb{s\xea\xde\x64\xe4\xd7 \xd8\xcb" +"\xa7\x1\xb6\xe9\xba)-\xc4\xf7H\xbe\x14\xba#\x90\xb2\x91\xe4K\x99\xc\xa0He\xf7T4\xf0" +"\x94\x85\xaa\x34O.\x86\xd3\x6(\x9e\x90\x94*\xca\xf8J\xe6hn\xeb\x6\xa1}H\xdeH\xf8" +"\x88\xa5\x9W\xf9\xb1\x18\xa8\xa7\xf2\x82\xf4h\xa9\xe1\x0,\xb5\xa0o\xb7N`\x98Ht\xe9" +"\xf3\x43\x63\xd2\xe8\xc5\xe5\x63\x7f~\x18\x42\x34J\xbb\xbf\xa0\x35j\xc8\x19\xf5\xad" +"\x8d.\x92\xbf\xec\xa9\x1d>y\x8dz(\xaa\x8l;\x19\xf0\xd2\xf4\x8a\x97\xd0#4\x8\x38\xdb" +"\xa5\x5U\xc\xb3\x8e~\x7f%qT\xa1\xf0I\x8f?\xc8\x96\x35\x9f<3l`\xa9\xa4\xff\xd7\xbb" +"Q\x8e\\Q\x91\x3\xb0/\x84\xf\xb0`\x91m\xe-\x89\x33\xb9\x64.}\xa8\xd6\xc1\xaf\x1b\xe1" +"\xfd\xd5\xd0\x2?\x97\xdf\xc9\xd6\x94\xf2\xe8\xcb\x91\xa4R\x89\xc0\x1b\x46\xf4\x94" +"\x15\x45*o[9\x83\x6}\xe6\x97\xd2'\xceTx`\xf5\x16\x8fke\x9c&g\x6\x9f\xcc\xd0\x11o" +"\xa9\x2\x8b\x9c\xa6\xdc\xba\x81vn\x83\xf5\x1c\x94\xaaR\xba\x98\xc8\xdf\xfc\xcd\xef" +"#\xa2\xab\xda\x1c\xa9\xf5)\x8d\xc3\x9a\x95-\xd1\xb\x93\xb2\x43\x34\x36\xbc\n\x13" +"\x85\x8c\x8c>.\xd3K\x9f\x6\x0\xa0\x96\x87\x16|B\x15\xcesHC\xd1\xa2M\x8f\x12}M\xcd" +"53\xea\xd3\xd1g\xd3=W\xeb:\xb9\xe2\x90\x83X6:\x9f=\xf1TW\x1b\xd9\xbdN\x90\xca\xf4" +"*\x0\x8fL!\x8a}\xb0\x96Gp\xa3p\x0|L\x93\x1'\x1d\xa1\x89\x19\x1f\xbb\x8b\xb3\xf2\x89" +"M\xc\xcd\xd5\xb4\x44\xaf\xe4\xa0\xa5\xefG\xfd\x8d(\x5\x83\xfb/\xb5\x94\xb0\x46\xbe" +"\xfa\xe4\x0\x80=gB\x9c\x8d\x15\xf5s\xae\x18\xd1\x8c\x10\xac\xfb\xc0\x1d\xf9\x11@" +"\xb3\x96o\x5\xb4\xe0m\x1e?\x7\x42\xb8\xa8\xabM'J\xa6\x81\xa7\xd1-5\xbf$\xe9\xfa\xc4" +"\x8cp5S[\xe0\xd4\x19\xbc\x9a {w9ads8\x82s\xf6H%\x9c\xe\xa5\x9cum\xc\xe1V1\xf6\x9b" +"\x90\xf4\x31\xbd#\xfd\x8f\xe5\x96\x0-\xab\xab\xc7\xf5n2\x9fSjq\xd2\x89Q\xebR\x8b" +"r!^\xa3WwZ*\xc6\x93\x98\x8bk\"\xc3\xfc\xa3!U*\xdc \x93\x1c\xb4\xdbIq\xd9\xec$\xd2" +"t\x0\x46\x46\x62z\xa1\xc1 \xe&%\xff\x96!\x9c\xcc\xe1\xa1*\x8di\xef\xd1\xe7\x34\x13" +"!\xf\x91H4\xe8Mm\xed\x8d\xe9m\x3\xf5\x8cIb\x17\xa7\xb7/\xb1\x0Y\x5\xe7\xcag~\x9G" +"4=6\xdc\x17\x86\x86\xb1\xfe\xde\xe4\xc4\xb5\xb3P\xf2 \xbe\x8e\x5\xd5L9\x9d\x86\xbe" +"2\xef\x11!\xbd][\x1c\xa5\xbb\x11\x90\x13\xdf\xb6\xaf\xf9Nk\\\xaaQ\xe3\xdc\x1a\xe" +"\xac\x95Mu/\xf3\xb3\x12Q\xcd\x17\x97ly\x8b\xfd\xcbk[\xfa\x1aJD\x9d\xea\xa4/\xf7\x1a" +"\xc5\xb3\x97\xdb\xdb\x64\xab\x9a\x9ax\xf7U\xa0\x14\xca\x44\xa3\xa2\x82@\xc7\x8=\xa7" +"\x16\xe7\xa9GP\x8c\x5\x1aKp\x2G\r\xd2\x9b\x65\x37\n\x1f\xe0\x31\x1b_\xaa\xcf\xda" +"n\xa7\"\x97\xecz\xa4,0^\x7\x98.^\xado\xcfZe\x9\x10\x1s\\\xb1\xd0w\xc8\xc5\xd5\x64" +":\xb0\x86\x82\x9ej\xf2]\xa5{7G\x99\n\x61\x8b\x98\xa2\x8b\xa3\x95|\x95?\xf9\x9a\xdb" +"Q\xb9\xab\xd2M\xb7\x87\xda\x85\xb0\x30\xed\x64$\xe3k\x87\x38K\xa9\x1b\xf5\x44[^2" +"5\xb5\xf3\x38\x39\x86\xc4\x13\xcb\xf2\x83\xf\x45\x3_\xd1(-\xc6\xf6\xc0\x90&\xbe\xe8" +"\x1c\xc2\xd3[\xbb\x86Z\x13g\x17X\xd4\xc3\xb8G\x84\xf9R\xa2\x42\x44\"\x39s\x8e\xea" +"%\xcf\xa9\x9b\xc1\x8e\xc4\xd1\x35\xc5\x35r\x89S=\xcb\"_\xd5\xab\x33M\xb7\xbd\x7f" +"\xc9\x39\x64\x46\x9cJ\x6\x37\x65\xc1\x7fn\x2\x99\x38\x98\xe6\x39\xb6\xf3\xc7#\xcf" +"\xbb\x5\x0\x97\xa7:\xf9\x94/M<\x11\xeb\xa1{)KV\xb\xce\x19>.9\xb7\xa0\x17\xf5M\x85" +"\x92\xd6\x35 \xe5(\xf5YW\x8en\x95\x0~\xf6\xe6\xbe;\xdf|G\xc\x18s\xe9X4.\xca\xb9/" +"\x2\xae\x42\xb4\x5S\xef\xb4\xebOY\x8e\xc8\xcaq\xad&\xea\x1a\x17\x46QA#q\xe6\xcb\xba" +"\xd5\x82\x96\xc7:\x12\x63\x14\xc1\xbc$x|\xf9LtsF\xb6pC's\xb9\x9a\x87\xc4\x9f( \xb1" +"\x1e\xa1\xff\xad\x64\xa3Y)\x82\xe9.\x91\xe1\xb8\x8c\x32Sx\xf6\xddm\xcf\xa8\xe7\xb7" +":B6%^\xe9!\xb4y\xa0\x1a\xf6\"\x9b\xce\xf6[\n\xf2\xca|L\xb1^\xc5\xf8\xfd\xa4\xd1\xa7" +"\xd7\x42\xf7\xb9\x1ch\xaa\x61\xf8z\x86I\x93\x8e\x8b\xa9*Ku\xc9?\x81\x9\xb3w\x8e\xe2" +"#\x92_\x81\x19\x17\\\xbe\xab\x90&@\xb7P\xd8\xc2\x30\x8\xf2<\xc\x10\x96\x13\x35\xb8" +"\x7\xcf\x83\x30\xfd\x41\x8e%\xe1\x84\x8f\xcd\x8d\r\xb1\x84\x18\x11\xb3\xb0\x39\x1d" +"9\xebVkz\xb8\xc2R`\x9d\x13N\xb7\x92\xba\x36\"\xe6\x30K_\xe7Y\xb3\"H\xdf\x9d\xda\x84" +"*\xa0\x8m6\x8c\xc8G\x88+\x1d\xf\x95\x16\xb5\xb6\xaa\xdd\xc1\xa8 \xb4\x86\xaf\x34" +"\x88rI\xb2Q\xe7\x8d>\xd2\x85\x65t\xc7\xb2\xb8\x1c\xaao\xccq\xdb\x34\xa2\xcc\xfc&" +"\xaf\xb1\xbd\x12g\xf2\xad\xb1\x42\x9cM\x93K\x10\xcb\xfd\x38\"\xa1\xdd\xc5\x8a\xe7" +"_\xb1L6\x17\x8e\xf5\xae\x4\x7\xe1\xbb\x99\xe4gt\x17\xba\x7f\xe6\xe5\xfc\xb9\xe6\xf4" +"-\xc3\xf4ou\x0\x62\x90j\xb9H\xe0\xd6\x96\x18\x8b\x19\xe1\x6\x10\xa8\xab\xdf(s\x9c" +"Nh9\xaf\xf3H2\x19\xf3\xb2\xdd\xdc\xaa\x9d\x0\xf6z\xfb\xf1\xbbo\x1d\xfa\x7\xa5*\x85" +"(\xe7\xf5\x97\xc1\xbaiH{\n\x9b\x13j\xfd\xd7\xe0\xcc%+\xeW\x85\xec\xc1\xfe\xc\xab" +"\xcf\xb9\x90m\xb9\x32\xa9\xa7\x66\x89\xd1\x62\x18\xd6\x95?\xc\x37H\xda\xee\xcdo\xf7" +"\xa5\xe5\x85\xab\x34\x62\xe\x1b\x7\xdb|\x1d\x66O\xf1v\xf4M6!6\xd3o\xb\x7\xf0\xa1" +"Yc]?\xe3\x15\xedv\x10\xc5\x5\xb9j\xf2\xc4\xed%\xf6\x13\xdf\xc4?\xee\x39\x1d%\x43" +".k\x8a\xa1\xefr\xb0\x8f-F\xc7\xc4\x84\x8f\x32{U\xa9_\xea\x83y\xd9+\xb3\xd0\xd9\xd7" +"v\xb7\x8\xec\xa6\xeb\x3\x9b\x45\xa0\xb5\x64Jz\x9dm\x4\xcf\xddL\x13\xf6\\\x82`\x1d" +"}|\xeet,L\xf1\xf8\xe5\xea\x12\xc1\xc\xeeQ\xf0\x41\x7\x6\xc7\xab\x9f\x4\xe7\xd1\xb8" +"\x81\x5\xa6\x9bH\xb3\xa0\x45\xf3\x1d\x36\xdf\xb8\xf3S\xac/\xd6:\xad\x15\x66\xe7m" +"$u\xb7\xca\xb4\x98m\xe0\x8d\x95\x1\xf0\xfa\xa0\x41\xb3\xd2x\xa9\xcf\x63v\xaa\x89" +"\x95\xc0\xb0\x39\x30\xfd\xeb\x8b\xcb\xaa\x1dz\xad\x34\x9a\x31\xdf\x1dRY\x93\x1bT" +"h\x8d\x95\xcb\x36\xe4\xe0@A\xf9zrm'\x8H\x8e\xd6\xdb\xe3\x1e\x92g\xc9\x46`\x8a\xe7" +"H(\xc8\xefK\xa3@#\xe8N\xa8\"\xbb\xcc\xab\x19\x63 MY\x91\x9a\x82\x99\xca\xe9\x88\x14" +"/Bp\x84\xe9\xb6\x32\x9b(:]\xbbJli\x9a\x94\x6\xcZ\xd6^\xbb\xaf\x44\x9d,\xea\r\xcb" +"\x9c\x99\x66\xfa\xa6\x39~\x8f\x99j\xdf\xaa\xfc*\xaf[+\x93\xb6\x7f\x41-%M@\x8d$.\x1c" +"\xc7\xc8/\xc6\x18\x94v\x88\x34.\x82[\xacn: `\x84P\xd6\x31*\xc5\x8c\x8c^\xc0-\x1\x9" +"4\xbb*\x92\x32\xd9\x1f\xe4V\x83l\x15\xbe\x3\xc5\x6kW\xe5\x18\xae\xa7\xec\x9\xd0J" +"1P\x8cm\xc\"\xb7\xfe\xe3Mw\x92\"\x1\x65\x85\x1\xa3\x9\xc8\xdc\xcfOM\xef\xdc\xf9\xa8" +"j\x8b\xd4N\x18h\xee\xa7I\x86\x82,\xb9o\xc7\xd0\x17\x82\xe7ME\xddLh\xed\x64\x8e\xdd" +"\xd1!\xb7'\xe8\x9bU\xdb\xce\x35\xc3\xeeMh\x98\x9f\x1e\x90\xbb\xbe\xabo\xcd\xa7\x85" +"\n\xeb\xfev\x12\xa1\xc6\xb3\x9b=0\xb0\xb4\xe5\x3\x1d\xd2\xc7\x88\x32J\xf5\xca\xf7" +"\x97Q\xe2\xda\xa2\x32\xcbr\x91\x96:\xaeO&\xe\xc6ju\xcaY\xa7\xb\x91\xf9\x9T\xc7\x45" +"\xd8\xe`H\x8a\xb1\xf3\x1c\x1cv\xd6\xe6\xc7=\xea\x17\xd1(4\r\xac\x0\xbe\xce\xeb\x64" +"|\xe\x90\xd5\xd3\xac\xd4\xd1\x16\xfd\xe7w\xb6)\x19\x64\xe6\x12\xda\x14\x65\x9e\x9f" +".|\x18\x42\xd8\x9e,\xe5;\x4\xa6\x1d\x80\x18\xd1\xa0x\xd4\xd4\x44\xaa\x15\x5q\xca" +"\xbfi\xe5R,\x99\xb0jS}\xa3\xe7\x31R\x1fK\x14O@;\xcb>\x93X\x1c\xc3\x66\x94\xe3\x9b" +"\xec\xc\xae\xc\x3\x65V\xa3\xe1\xd4\xbb\x33\xd9\xdb\xac\x66\x45\xabXb\x10\xbd\x9f" +"\xd2\xbe\x62\xe9x\x9b\x1dR\x9d\xcd \x95\xe6\x1l\xdd\x80\x91s\x9c\xdf\xc\xb2\x12\x82" +"\xa2?\xe9V\xe5\xa4\x8c\x12\xfb=\xc7\x63\xe7\xb6g\xe5(\x92\xb3\x95\xd3\xad\xeb\x82" +"\xc3\x8fx\xdd=\\\x10\xbf\x9f\xcc" +"\xea\x1c\x19\xb\xc8i\xdcm\x1e!gmj\xfe\x8\xe9\x8bO\xc2\xd2Z\x14(\x95I\xc7\x90\x9f" +"vp\xbc \xb3\xcfU\x9c\x30p\xa9)\xb1\x5\x83\x94\x87M\xd9\"\xaa\xc1\x93\xce\x97\xc7" +"E\xac\x17\xb9*]e/\xa7od\xd1\xa9\x62\xe3\x98U\xb3\x4\x96\x1f\xdc\xc6\xf\xee\x9d\x3" +"\xf8Va\xf0\xe1\xde\xe5 &s\x11\x38Y\xa5\x9dx6(\xc8\x1fq\x5\xa8\x5g \x80\xd0\xd0\x87" +"\x93\x1d\x39]\x86\x66RA\xf8<5\x16\xe8\xd0\xb4\x96\x0\xecs\xe5\xf3\xc9\x66\x0\x92" +"\x12w\xfc\x9c\x45\x94\x86\x91\xf9\xab`i1B\xd0\xb1\xc4\xaa!\xa3\xbe\xe9\x5+\x7\xb8" +"\xb:|\xd6\n\xe\xe9$[\xdb\x61\x10\x1b\x63\xc9\xf7\x63\xe5\x43\xf0\xda\x90\x16QM\xcc" +"\x12\x86\x12\x66\x4\x18\x9\xa3\xc8[o,)>\xa3\x1e\xd8\xc0\x7f\xe\xf8\x84\xd7\x1b\x90" +"\x7f\xcc_U\xfd?\xa5\xb1(\xd0w}@c\\\x86\xd2\x88\x66ih\xef#\xde\x31\xd1\x1\xca\xd7" +"\xd5\xbd\xff\xe1W\x9b\xca\x42\xeeK\xaa\x92\xe1z\x80S\xc2\xd5i?\x95,\xa2\xf9\xc8\x46\xd3" +")\xdf*\xaa\xec\xe3v,'\xef\xa0\x14\x9e\xe4?\xbb\x38\xf6r\xfa\xb2jK\xc3\n\xc4\xb5\xc2" +"\xf6\xc9\xa5\xc2!g\x9b\x87\xb3\xe9\x11\xa5\x61\xc1\xad\x62IdPJ\xce^7\xf9+a\x4\xba" +"\xa2Q!\xc8\xce\x7f\x86\xb4\x98'\xc9\xfao\xf4\xc3\x96\xc8\xba{$J\x8c\x8e\xf6\xbfv" +"\x84<\xa8\x3\xdeyc\x9dh\xfa\x81\xf7\xfb\x12\x43\xd7.\xa4\xde[\\\x83\xd8s\x17|f\x8d" +"P\xe5~\xc6\"\x1\xa0v\x9bL\xf3\xa8\xdf\xc2\x15\xec\xb7\xae\x65q\xbb\x33|\xff\xb0\xb3" +"\x8b:LPoOJZ7\xc0\xba\xb7\xb7\xac\xb9]\x5+\xc0\xf\x7\xb5\x5\x9\xdb_\xc5\x19\xd0lX" +"\xc3\xfb\xfc\x97\xce\xb0\x31\x88\x7\xaa\xeb/t\x11\x65\xb7\x9\x1e$o8f\xdb\x42\xed" +"\xf7\x35\xc0\x39\x83>\x18-\xc9\x4\xb8\x1b\x87)\x17\xdc)\xd0\xd1\xef\x36?~ \x7Z\r" +"\xe6=\xf9\xe0\x9br\xc1\xa7{\xcd\xdf\xb\xaf\xaa\x3\xc9\xcdg\xe7\xa0\xad\x8\x99\xe5" +"%\xea\xaa\x0GW\xf8,h\x80\x9c\xe4\xda\x96\xdfP\xb7\xd8@\x1u$\x88nc\x2<%\xb4N\xaf\xa9" +"\xf2\x9c+\x12Z8\xe8\xebh\x86\xdf\x9f\xb9\xc8\xf8\xeb\x42\x64\xc1G\xaa\xd9~\xbf!6" +"\xde\x44\x13\x1f\xc6\x33J\x89\x9f\xc\xb3\xd8\xaf\xa5\xf0\x9c\x89\xc6\x4\r\xd6\xc8" +"~\xa2;\xd1:1\xe6~\x93\xaf\x3gzH\x1\xc7ix\x90\xcc\xf8\xfc\xbdV%\xb/\xe0\xc9\xc9\xd3" +"K\xff\x1c\x85\xc1\x9f\xa5\xb3\x80 6\xb2\x9eYY4\xe2R\x8a\xb9\xeb\xedT\xcc\xe7\x6\xa9" +"\x99&\x16k\xc1\xbc\xb0\xf1\x34\x44\x9e\xd1\x86\x6\xb8yE\xf5\xfd\xfc\xa8\xbe\x38T" +"\x9a@$d\xcd\x8e@w\xe6\xb\xcdn \xd5\x11\xb0\xe2w:\xe2\xd3\x1f\xe9\xb5\x17\x93\xb8" +"}\xac\xcc\ny-\xfc\xbd\x9c\xd8\xa6\x8b\xd7\x41<\x8b\x5\x9e\xe6z\x10y\xef\xf8\xbd\x8c" +"p\xf2\x8a\x0$\x8a\xfe:\x8a\x8cn\x82\x9b.\xc8\x1cx\xb5\xf3\x4Y\xc2\x1bG/\x87\xc7\x8a" +"\xac\xd1\xf2x\xdeT\xe4z|.\xa6\xa9\x8a\x8f\x8e&\xbf\x82t\xa2\x7\x33\x3\x34\xea\x94" +"\xbf\x9d\x12\xf0\xb9\xba\x9e~\x8eq\xb5\xd9\xb3Y\xa4o\x9\x43\xf2U\xb5\x1a\xbd\xd8" +"\xa6\x1\x14(C\xcd\xf2\x12\xde\xca\xa5\xe7\xa5?\xa8Ig^\xa5\xd5\xa6\x44\x46\x9d\x36" +"\xb8\xb0\xab\x9e 6`\x9b\x81O\xf8mbb\xb3\x96WV\xce\x64\xdb\x39,*\xe3\x9dti\xed\xec" +"\x93\xa0\xca\x86\xdfs\x0}\x19\x9f\xf7\xd5\x1fXL\x12P\xe4\x33\x0N\x2\x80\xde\x93\xfd" +"\x13}\x80\xa7um\xe6Y\x95}\x9b\x39g'\x2\xd5\x80\x92>\xf7|\x81" +"\x92\xcdX\xc9\x5\xb9\x6\x86M.@\x13\x84\x37+\xc7\xac]\x3\xea\r<\x7f'`q\x1\x8c\xae" +"\x13}\xe4'\x1a\xf9\xf9\x8V\x7\xd9\x8e\x65\x87h\x9a\x44\xdd\xbd\xb0\x88\x3\x11\x82" +"I\xb2\x7f_{\xae\xef\xa8\x10\xea\xe6\xf6\x2|\n\xa7\x2\xcb\xc1\xe7\x10\x35l\xd6\x81" +"F#\xb3\x35\x91\x90\xc3\xc2%,)\xe9\xbf\x86\x8d;\xa4\x1e#[\xa1\x89\x87\xbeH\x9a\x9d" +"\xdb\xc3|\xf0*\x1\x1fV\x19M\xd0\xb4\x7f{\xe5\x17\xda\xb\x37\xa2\xc0\xf9\x16s\x10" +"\xe\x8bZP\x94j4\x2\xcd\xca;\x95\xb3\x11\xd1\xbf\xa1\xa3\xc7\x18\x0\x61\x90\x19\x15" +"\xc0\x9cL\xd0M\xe1\x44\x80\xceX\xc3\xf6n4o~R\x9e\xa0{Ra\x85\xa6\x46\x43\xa2\xf8\x1c" +"\x9c=x|&U\xfa\x31\xe8\x43Q\x92\x95\x11\x6@\xab&\x85<\xc\xfc\xc\xeb\xbcU\x16\xb4\x1d" +"\x98\xba\x5\xac\xfe\xb\x96\xe5\xd6\x9c'\xd8\xbd&!AR\x9e]q\"/\x1e\x82}G\x9b^\xac\xbd" +"\xee/\xef\xc9IK\xc8\xd7\xb3\x8c]X\xd5\x13\xed\xceVgDU\xb0\xe2g\x11\x65\x8e\x36\x36" +"6+k\xa2\x1e\x66S=\x88\xfb-\x17\x5%H\xbf\xb0\xd7\x18\xc<\xe0\x80\x1a\x9d\xaa\xa4\x8d" +"p\xb3\xec\x94\\\xdb\xabJ\xf1t\x3\xaf\xd5\xc0\x1cM\xa0\x9b\xef\xc3s\x84\x12\xf3\xd2" +"\xa9\xf4\xd2\"^`\x8d\x11/\x94\xd0\xb6\x33\x65\x80\x61\x39\x15Z\xe0\x80N\x1f\x1X\x14" +"\xbf\xae\x85\x38\x64]\xfd\xbe\x1d\xd9\x37+=\x1a\xf4\xf5\xd1#\xae\xba\x34\xb2\x42" +"\xcf\x11\x41\x9\xadL?\x5\xb\xdbv\xff\xbcw\xae\x8I\n,\x1c\xf9Ve%c\x7\x1f\x9fH\x84" +"\xbb\x2\xe7\xfb\x1eg\x1a\x7\xc0\x94\xd7|z\xe5/\x92\xc6\x1b\x8f\x30\xe8\x85,Y\xbd" +"\xdb\"\xae\x5$\x1c\x8/\x91\x9fG\xc5\x8c\x35\xcM\x13Uz\xf1\x35\x33\xfd\xca,\xfe\x12" +"\x9c\x94\x14\xd6H\x92\xab\x1b\xa5\xa6h\xe9kJ\xc5\xc8\xda\x0\xee\xe\x16\x97\xc2\"" +"\x1ZM\x1G\xae\x18\x99@\xbU&\x97\xa0n\xe6\xa9\xd8$G21\xfch\xf6\x9b\x35\xd7\x8b\xe9" +"\x8c\x39\x1d\x83H\xb\xcd'\x95-\x96\xf5\xe0\xb4\x42\xec.\x6[,\xcf\xaaR\xb2\r\xfe\xe1" +"\xc4\x9b\xea\x41\x81\x14i\x96\xd9/\xc5\xcc\xd8H.\xc7\xc\xa6\xa0\x1%Jd\xc6=\xf0\x1" +"t\x91%\xcc\x66\x85H\x8d\xcd\x13\xca\xd4\xa4\xe0\x38`\xf9\xe1o\xfc\xa4\xf4v\xc7W\xf5" +"\x16\x8e\x99\x6%\x9b\xfc\xcb(\x8\x36\x9fy\x85\x8a\x88\x87V(yOG\xc6\n\xb1\xb9\\.t" +"\xd1\x30\xdaPj\x92\xb2P\xa4?\x82\xce\x1a\x5#b9\n/\xefI\xcb\xdaN\xbc\xa4?\xa9)\xb3" +"\xadP\x9d\xce\x91\x8f]\xc3\x9d\x65x\x14]\xff;+\xbb\xd1\xe9'|\x80\x81\x8e\x13\xb6" +"\x19\xf1\xe\x82Y-\xf3L\x88\xe3\xa6\n\x66\xd0x\x1b\xd7\x63\xfag\x1c\xca\xa7\xc6\xc" +"\xb2\xd5 \xce\xd2\xda\xe8\xdd\xf1\x95\x96\x1c\xaf$1\xb5nO\xb5w\xaa\xb3\xeID\xa1\x39" +"\xea)\xf3\xa4JG\x19\xe4\xe1\xd8w)\x98\xf2\xbft\xaa)\xc1\xc4\x1aG*\xfc\xd1\x34\xaf" +"ra\xe1\x9e\xbx\xb3N;\xf2:\x90\x8a^\x96\xad\xc3\x41\x15g\xbf\xd0N\x16\x9e\xcc\xa0" +"@\xb2\xb0\x41\\\x2l\xe6\xd0\xc9\xe1\x5\x8e!s=\xa3\x8d'o\xad\x38\x10\xea\x1e\xdf\x96" +"\xee\xfa\xb9\xa0z\x99\xeb\\\x9d\xda\x97.\x1e\xb\x83<\x8c\x45\xf4`g$9\xe7N\xb8\xfa" +"\x1c\xd0\xdc\x93\x13\xb\x9eY\xb9&{J\x9d#\xc2]\xe6\xcd\x9c\x38\x0\xfb\x33\xa5\x17" +"\xb5\xebJ\xd2\x37\x9c\xb7p\xe0\x83\xa7" +"\xcd:\x93\xee\xe6\x15sD\xe5g-\xa5\xee\x42\xab\xfbNj\xf4\x98\xb5\x43Q\x8aj]1;\x1a" +"\x85\x45#0\xb0g\xd9Ln\xc2\x9\xf2/\x7f>\x9c\x10\x9a\xd7\x8f\xdd\xa9 \x14\xd8\x46\x98" +"\x87K\xb8\x33\x1f\x97,F\xa3\xda\xb9\x43<\x6\x34\xee\xd2\xa9&\x17\x4w]\xe2U\x10\xf1" +"\xe1?\xf8\x92\x8cJ\xa2\xf\xc4\xbbY\x16\x43\x80t\n\x86\xbdL\x9a_\xfd\xe\x35\xbe\x9a" +"K\xe*\xa4\xc6j\xe1}\xe8|\xf4\x4\x9b\xd7\xa4\xa2x\xe6\x88\x90\xday\x1f=\x0*\xb1\x12" +"\xeb(\xf7UM\xfd|M\xc3\x98\xbe\xd5\x93^(P>-\xc4\xe7\x10Yqp\xbf`\xae\xc8\x8fh\xe7l" +"\xc3\xbc=\x12\xd9NYa\xe0\xdd\x1d\n\x92\xc4\x38[)?g9\xe5\x8\xf1%(w/\xf5o|H*xy\nV\x89" +"Xh\x18;)\x9e\xbe\xad\xce\xf9\xe4\x99\x36\x31\xf1\xa7\xcb\xf3V#\xd7\xd8`\x1e!\x8c" +"\x2Q\xf2\xf8\xdf\xd8\x1b\x92\x8#\x91\x7\xc2v\xa5V\xe\xf7k\xaf\x91ZI\xeI\x4\xe4\x97" +"\xf1\x9c\x3\xf7\x1\xfb\xeG\xec\x38\x88\xc0:u\xb6$Z\xdb\xe\x87\x8b\x4}}\xeb\x88T\xfd" +"\xfc\xaf\xac\xd0m4\xe9}\xcc\x43\xd2\xfb\xf3\x81\xcf\x19PJ\r\x96\x84\x64@JF\xc7!\xee" +"\xd8m\x1fv<1\x1\xeck\x83\x8e\xa6\xa3\x94'\xf4\x7\x1c\xee\x96\x12\x1b\x1a\xf6\xab" +"t\xdd\xeekNK\x15\x66|\x96\xf1\xcd\x1d\x1\xdc\xef,\xd5\x30\x36\x7f]*\x97\x88^&i\xda" +"R\x17\x9d\xc4\xd7.K\xa7Q,aY\xb7\x1fO\x93\xeb!\xbdOb\x1cV./H\xbf\xda\xb3\x9eq;\xd6" +"N\xb1z\xf6I\xef}\xf8@\xa4\x39\xdf\xb\x1.\xfa\x81\xf1\x66\x62\x14\xc5\xb4P\xf0\xa4" +"\xf7\x6Z\x97\xbl\n\x84\x6yp0\xd6\xee\x94}\x97\x1dx{ba]hZ'\xd3\xae\x3\x85.\xf8.\x1e" +"Qzv\x12S\x84\x8\xcai\x83\x14\x19\x33\xc4\x85\x2\xfb\x2\x36\x62\xe2)\xfd@w~>\xd9\x96" +"\x8dM>\x99\x44_\xc\xdd>\xbe{\xe5.\xd2\xcb\x83y\x5\x41\x64\xf0\x0\xb2\xec\xba\xc4" +">\x1\xc8\x81K@\xfaK|\xb4P\xa9\xc4_\xcc\xb6\x11,\x9f\xc8\x9\xea\x18\\\xd9\x15g\xcd" +"h\xa4\xe8\xf\n\x35W\x86(\x8eO\x8e\xdc\xa8\x16m\\\"\xe1\xdd\xf4\xde(kA|\xf7\xf3t\xa4" +"\xb0\x99j\x13\xf6GD\x95!\xcb\xc3z\xec\x62T\x1c\xabm\xab\xdc.\xc9\xf4q\xdaT5\xea(" +"\x9a\xfd\xf2\x34\xefI\xa2\x0\x43\xa7\xfe\xa4\x38\xed\xa1\xd8\x44\xd3P\xf0\xdeI\xc" +"\xb4\x36\xe7\x14\xb5\x65\x5\xdd\xff\xa9\x9ajw:\\\x92\x42\x8\xad\xb8\xa8\x65\x90\x1b" +"\x9b\xfd\x16k\xd9H\x8a\"\x8d\xb8VC\xf1Y\x81\x8f>\xb9\x38O\x83\x9d\xc4mK\xd7\x9a\xcf" +"~c\xe\x99\xeb\xf0\xb2\x5\x85O\x9b\xf1\xf0z\xd8\xc2\xce\xd1\xbf 5\xaekD\xbc\"\x81" +"\xfe\xda{\xff\x65\xaf^C\xb6R\xee\x17!1IG&\xdam7\xcbJ\xce\x43\x9d\xe1\xcb\xee\x9a" +"\x7\xb\x1f\xb9T\xe\xa4\xf7\x13\x8c\x37\x10\xd0Hg\xed\xb8[\x95\xdd\xdc\xea<\xf2\x33" +"\xc7\xb8;\xeb*\r\xfe\x43\xc7\x8?\xb9\xde\x10[m3\x88\x8f\x1bk\xf8I\r\xa0\xc2=\xa2" +"S\xb\xc2\x43\nPj\x97\xe8\xcd\xcf)#D\x8a\xb2\xabN&\xc3\xc5\xbf\xbar\x1d\x65\x8c\x80" +"\x9c\x1\xf0\xa8Jb\xc1\xb7#d~K`&`k\x8e\x43\xea\x1e\xaf\xd3\x12\x1d\x85w\x93U#\xa9" +"~\x7f\xd1\xd2\x98l6\xb2P\x96\x97T`\xc8\x91\xe8\x11If\xd4\x39}\xd8\xcc/\x1d\xd5H\xee" +"\x2\x45\x16U\x9c\xcct\x7f\x91$\x8a\xae\xfb\xbfW\x83VX\x84\xb3\x38\x97\x1T\xc5\xe3" +"1\xe2\x94/L\x94\xed\xbc\xd3:\xd1\xb9W\xf2\x98\xc4\xf9\x7f\xf\xe\x11\xf2$\xdei\x86" +"vR~\xb0wmo/4\xe9\xb7,\xdc\x1c\xf8v~\xa1 \\x\xc5\x19+\x97\xbb\xe8gQn\xd4\xcd\x32#" +"\xb3\x96\xb3!\x8b\xe1\xf8\x8e\x97o\xeew\x4\xa2\xdb\x84/\xb1\xaf^Ne\xbb\xcb\xa5t\x8a" +"\xfc\x1bow\x96\xce\xda\xaag\xd7t\xb\xc9\rU\xac\xbaI\xf\x8d~\xc9~\x16\xdbo\x4g?" +"\xdc\x89\xf3X\xbb\xed`\xce_GS\xa9\x86z\xe6\x61\x66\xc6$\xcf%\xe3\x9d<\xd1\xc1\xad" +"w\xe9&P\n.\x14\xe7\xe6\x15\x46\x94\x44*\xad\xdb\xb4\xde\n\x1\xc4\xbb\x1a\x66\xbd" +"\"\xa5\xc2rn\x8\xf7\x31\x85T\xa2\x96\xc9\xc9\x44\xbb\x1f\xeb\xd6y+_\x99g[?I\x4\xb8" +"p\xf3%\x1fk\x86\xfc>\xdaRL\xda\x9e>\x11\x4\xf4`;e\x5\xaa\n[\x14\x8f\xd5?T\xf6\xc4" +"F\x8ahf\xepP\xc8\xbe\xeb\x63\xb/(\x98@m\xc2\xa3\x16\x9a\xc1y\x9\xa5\xbb\x9\xe4mF" +"\xf4\xeb\xc1L\xed\xd8\xd7\xe1?_\x7!\xb3\x96\x37\xde\xf0h\x89\xcd\xdd\xd2Rc\x8f\xe8" +"\x89\x99\xc3\xd7\x1_\xeb\x37\xdf\x98\xc5|\x17O\xd4m\xa3k\xea\xc0\xd8\x7\xba\x9c\x39" +"\xb2\xb9\xf\xfb\x91\xc8\xa8\x63\x66\x37\x8e\xc\xed\xda\x99\xa9\x82\x1e\xb4\x61\x17" +"\x9d\xd3w\x90\x43\x98\x13\xf1\x31\xe0\xac\xf0\xa7\xee\xd5\xa6}\x88\xe4\x35\x12\x93" +"\xdc\xd4M e\xf0\x19\\S\xd7\x7V\xaf\xd5L\rV$\x1\xa0\xf2q\x7\x8f;\xe7\x34Y\nW\xad\x46" +"m\xde\xf0R.%\xf0\xf8^\x9\n\n.N7Lm\x10X\x8e\xbc\x32\xc9\x90\xe\xeb\xb6\x2\xd5\x44" +"\xb0y@6\x12\x0\x8a\x39\x33\x5\xc8\xb0\xc5\x36\xcb\x8\xa3\x9c$`5\xbaV\xd9\xcb\x35" +"\xa2\xd6u\xfd\x33\x98\x9c\x13\x3\x43\xc2\xa1\xaf\xd1\x9e\xf6\xf7u\xb8\x10z>\xb3\x1b" +"\x9an\xd3\x85\xa4\x86\x84\n\xb\xd0\x15-\xa1\xa6NF\xcfG\x1e\xd8\x11'\x86>\xb7\x1a" +"!\x8\x32\x97>\xa6\xfa\x32\x65\x99\x90\xe9?\x7H\xdaz\xd2wO\x81\x63\xfa\xed\xf1S\xf1" +"v\r\xc9\xeaW\xe\xc0\x34zD\xf6\xf8\xee\x44\xa9J\xc\xd0\x94\x8f\x34\x1a\xe2\x33\xf3" +"\x19|\xab%\xb\xd9o\xa7`\x92\xe8x`\xb5\x18\xb8Qj$\xa3\xe2zI\xce\x8c\xe9\x36\xd5\x91" +"S\xe_0\x94`\n\x19\xe9\xebq\xad+\x14\x8e\\\x0\x95\x96\x97w\xf4\x63\x1\xf5\xce\xd7" +"\xb3\xba\xb5\x96\x65\x94?\xec\xa8\xb8\xd5~\x15\xe3\x39h%#t\xdd^@}I\xf2,:\x14\x84" +"^s\x98\xaa\xa2\x1fs\xef\x80x\xd7,\x94\xf2\x91\xda'\xbd\x8a(\xe8\x83\xe1r\xf8&\x80" +"|\xb4}\xa3#=\r\xef\xe\xfb\xf9\xf1\xa0\x7\xe3U\x8fo\xfcR\x1d\x66\x9a\xb8\x45VX\x4" +"e}\xa8\x31S\xd6:\xd0\xed\xb4\x43\xc$\"\x91\xf\x91\x14[\xa3\xd6\x92\xbe\xac\xd4\x46" +"\xae\xf8\x14 U\xfa\xb1\x36V\xba\x9b\x33I\x1b\xd1)>\x16\xbc\xbd\xdb\x62HJ\x99\x92" +"\xdf\x98n\x89,X\x93\x1a\xd5X>\x1a\xc3\x80u\xf8o\xeb%\xc1\xac\xb3\x94\xbd\x1c\xbd" +"\x8f-{8\xc5\xa9\xd8\x82K\xd0\x81\xeesW\xf7\xcd'\xad\xa7\xea@2\xee\x1d;\xee\x65\x91" +"\"\x11{\x87\x4\x66\xfb\xc7\xa1\xe5\xc%\xffP\x6\x8d\xb3N\xce\xa6\xf1\xef\xa1\x9^e" +"\x12\x42\x18\xaf\x0\x44m\xa1\xb9\x8f\xcbo\x9a\x32IM\x7f\x13\x12\xeb\xef\x41\x32x" +"\xbe*\xcbLp\x15p\xd9V1h\xf0\xc9i\xba&\xb7\xfa\r\x34\x86*\xa4\xa0\xa0\xf2\x1fk\xdd" +";\x98\x95\xc5\x9f\xfd(\x95\xde\xd8\x1f\xc5\xa1\x33\xdc\xd2\xdb\x30\xfe\xd8i#\x8f" +"\x1\x9a\xc\xc4O5\xc6N\xf2\xd8\x42\x85\x3gv\xd6P\x93\xeal\x82\xa8W}z\xb2\xc8\x96l" +"(\xb\x6\xd5\xf0\x66\x5Mlkd\x83\x33\xf5\xcf/'\x1bjK2\xb3I\x1b}N\x7\x94\xc2t\xf8\x9e" +"M\x91\x91\x34\x1c\x85\xc7\x8f\xa7yq\x8a\xd5\xdc\xe5\xe3\r\x44H\xd3}%\xc7\xc4\xc1" +"w\x9e\xeN\x16\x9b\x8al\x9a\xe4TJ1'\x1f\xc6&\x91\xc7\x9b)\x8f\x31\xc4\xc4}\xc\xfd" +"hhq\xf0\xc3\x9f\xec\xb\xfa'Dy\xf\x90[X\xd2_\xbf\xb1\xdc\x98\xf\x11\x85\x17\xc2\x19" +"W\xc9\x8cMnYk\x9b\xc2\x46\xfd\x9a\x96\x1e:\xb2\xd3\xf4\xd7\x37\x9\x92\x93Q\xee\x13" +"\xf3\x64\x8d\xc\xac\x93_\xf9\x8b_#\xff\x86:\xefM\xb9$\n(\xad\x1\xa0\xbe,7\xa7\xe7" +"\xe\x34\xc\x91\x14\xb2,\xe7GU\x96\xa1\x32\x3\x87y\xd9%\xf9\x19\xe9\x30\xf4\xa8\xb8" +"\xa2\xf7_\x6\x1d\x5\n\x92\x18YM\xf9\x9e\x8fz\xd8\x85\x46Y<\x94Ir\x88OllI\x7f_\xff" +"\x1f\xe0\x9#\xcd\xf5\xd1\xe3\xb9\xa2\xcc\xce\x3\xe8\x15s\xe0\xb6\xf8\x11/Y\xa9\x12" +")\xf2\xf2\x1b\\&i\x7f\xc4\xc6.\xdc\xe9\x35\x65\xeV\xb1\xaf\xc7u\x7~\x8c\xbe\xb1\xdf" +"\x1b\x1b\xe5\xd1\x38\x8e\x33\x12\xabG\x1cH\xf8\x42\xb5\xb8%%\xd0\x39s\xba^\xbd\xa3" +"\xf1\x37y\xa6\xc1\x9d\xda\xcb\xc8-_AVJ\xfc*\xae\x90\xde\x85(\x1bt\xf8\xf2\x86\xe8" +"\xf`j\x9e\n\xdd\x5\xbf\x90[\x9a\x3\xffN!L\xb4\"\xed\xc\x8c]\xa7\x65\xcfpWtbQM\r>" +"z\xfb\xc5\xa0>\xc5\x35\xd5\x42\xd3\x8d~\x9e\xe6\x9g\xaa\xd3\x8e\xcf\x18\x94\x44`" +"_7w\xac\xbc\xbe\xce\xf6\x19}o_0W\x8b\xd5\x89~\xf2*|V/T@z\xb1\x0S}\x12\xb3r\xecy\xbe" +"\x1b\xe6\x15\xbc\x1c\x89&> \x8a\\\x16\x96\r)5\x87\xac\xbb\xd9\xa0\xd4\x95\xfe\xa8" +"\x14\x8b\xe7\x43q\xc1\x39\xeb\x1a\xf1*\xa1\xcd\xb9\xb6\xfb\x92\xb6trx\xf4\xaf]\xf4" +"\xe2/\x9fq\xee\xb3\xa5Irg\xc4\xf9xB\xa4\x91\xe5\x66\x8e_0y\x8\x13\xadK\xed\x38\xca" +"\xfa\xa4Lr]#\x9b\xf2\xc6\xf\x83\xec\xde\xe4\xabj\xed\xd7G\x1b\xa4\x99t\xae\x3\x16" +"F\xc6\x37\xd5\x43\x66\xae\xa0\x87\r@{Y\xf1\x9e\xa2\x81\xf2\x12\x35\x1f\xb4.m\x98" +"\xb7\xa1\x36\xdb\x8a\xd9\xf3\x5Or\xed\xc\xa0\x45\x1e\xfb\xd1N3\x8\x94\x0T\xfd\xfe" +"\xc9\xaa\x8\xef\xe9U\xcf\xaa\x42\x16\xd8.\xc6vt2\xc1Q^\xbaP\xe7\x30\xffX\x1e\xc1" +":\xfd\xd9\xfb\x9bI\x15\x7f\x95\xae|\xad:\xf3~]\x1\xc3\x17\x7\n\x5\x66J4\x9a\xe1r" +"\xb2\xd3\xc4\x98\xab\xbc\x82\x1b}\xad\x91\xfa\x8cG\xe3\xd2\xc2\xba\xb3\x1d,&I01!" +"\x84\xc\xe=\xf0\xee\x1\xf0\x1|\x88\xe5\xc9Y\x8b\xca\xa0\x98\x91\xab\x36Z\xf9\x6\xca" +"\xec\x82\x9c\xa6\xd2j\xe4\x1cM\x84\xc7\xb6Hz#/ `\x3\"\xc1hF\x7\xdd\\P\xeaO\x94o\xd0" +"\n\xae!\r\x1fM\xea^\xd7\x9\xfd\xeaz\xe7.\xaa\xfd\x14\x7\xf0\x8d\x8b\xbe_\xaa.\xc2" +"e\xf5\xff\xeZ\x1d\xcK/ H\xe9_\xffjX\x1b\xd0{-\x81\xc4Uj\x15\xf\xf8\xf8\xbN\x96\xa3" +"\xbb\xb4$\x12\xeb\x37\xd1\xc9\x1b\xca\xc4\xfcs\xbd!\xdf\x9e\xf4k\xc2\xd0\xcat\x3" +"'b\xfb\xef\xfVY(\xe7\xa0\x8bh\x1b\x86\xcew\\\x9c\x87\xd7\x98S\xa0Y\xff\xb2\xb2r\xee" +"\xab\x39\x8b\n\xc4\xe0\xb8\x92\x1f\x89\xab\xf2\x41)A\x8c\xaf\x9f\xed\x0\x45\xd6(" +"\xf8t\xd7I\xbe\xd0\x9f]y\xf1\xed\xc8T\x7\xcc\x1a\xb6{1\x3\xfb\xd2\xc4?\xd0\x66\xf2" +"\r\x91\xb5\xe9\xed\x86\xe9\xe3!\xe0\x8a\xd1\x13\x5\xff\x83G\xaa\x9\xeb\x31\x80\xf9" +"Qj\xbe\r\xf5X\xa5hVD\xf4T_s\x89(\x8e\x5?41\xd0\x8a\xfe\xbd\x84\xb0\x5\xb5\x9b\x18" +"\xe7\x43\xed;\x1c\xa4\x43\x88\x1f\xb9\xbd)\x9c\xa0=\xa3v\xe4\xe8\x1f\xe2\xc3\x91" +"\xfdH\x6\xc3\x9a *_)\x85\x91\xa9@F\xa0'\xe3\xd6\xd3\x1b\xfb\xfa@\x6=\xd5\xd2\xd8" +"\x98\xd7\xd0*\xa1\x45\x63-8\xb\x33s]-\xf5\xf\x45\xc\x8\x1d!z\x9b.\xd6\xf\x81\xec" +"2\xd6\xf1\x9f\x9d\x64\x1\xf9\xb6-\xa0\xad\xc6\xe7\x5\x85\x89P\x1c\xd3\x13\xe9\xcf" +"X\xb5\xdc\x34\xe1 G\xe2P\x12\xa8\xac\x95\x85\x2\x62\x81\xbe\x33\x44\xdb\xce\xaa\xc5" +"\x98\x33\xe5\x31M\xc4\xd4\x45,\xb\xbc%\xc6\x65\x8c\x35K\x1c\x4\x16I\xccq\xd3\xe2" +"\xacw@n\x19\x3\xed\xd2\x1a\x91\xd2\\*e\xb1\xb2\x16g\xba,\xa4:\x11\xec\x43\xf3\\L" +"c\xae\xc3\x97\x91\x1c#h&\xbb\x7f\xb9\xab\x86\xfa\xdf\x9c\x9e\x18t\x7\xca\xed\xa7" +"\x82\x2\xb0\x97\x95\xed\xf2m\xad\xdfWH\x0\xc3\x92\xbeQt\x8f\xc2\xbdg\xe4l`\xe8;\xec" +"^\xf8T%K6X\xe2T[\x1b\x62\xa5\xda\xc0\x8e\xa0\xaa\x8a\xe3\xc4\xc1\xcb\xb1\x89\x64" +"\xba\xf7\xa0?\x93\xeb\xeb\x8a\x61j\xdc\xe5\xc5\xcf\xfb^\x1d\xa8\xa1L\xe1\xbb\x43" +"\xf7\x1c\xb8\x98\xda\x1\xb2t1q\xe4\x99N\x7f\xf0,\xa8\xef\xdd\xffH]\xd1\xfd\xab?\x9f" +"\x1f\x38\x87\x3\x33:?\xee\xb7\x99\xc4\x1a\xffw\x0\x0\x1f\xc8\x9e\xc4\xb4\xba\x45" +"\xa2\x98\xbc\xf8\x12\x12vI\x8c\x9f;\x19:\x16\x10\x94'\xdc\xd7\xa1Z\xf2S}\xa6\x15" +"lE}\xe6\x18!S\xf8\xd0\x91\xa8\x94\x65Mn\xe3#\x82\x81\xe\xb8\xf0^\n\xb0\x99q\x3 \xd3" +"\x19\xad_\x97\x9aJ\xb8M\xef^\xf1\xea\xf1RK\x90#\xbbI+\xbc\x89\x5\xc5\r\xdf\x45\xe6" +"\xd1v\xed\xb2\xc8\xc7\x9bMN\xc\x84\x83\x98\xcd`\xdd\xa8\xf3\x46\xe1\"\x31\xbf\x95" +"\x7f\xee\xdd\xbe\xd7\xa4\xbd\x91\xac\x45s$\xfd\xb2\x86\x66\x86\xfb\x18@U\xe7\xf\xf5" +"\x87\x1e\xdd\x1\xcaO\xc8\x45{\x87\xbdw\xe2\\:x\xe6V~\x90Z\xc3U\xd9\xa4\xe\xd2Y\x84" +"\xb2p&\xb7\xca\xd4\x30\xc\x88=\xee\xc8\xd4\x9@^;\xb5 A\xd5\x1aU\xee\x10\xfV\x5\x37" +"O\xb0\xa5\x35\xe6\xba\xff\xb9\x86.@\x9a\x43q\xae\x2\x12\x1n\x8bi\xe4\x8a*\xdd\xb7" +"\xa3&f\x1\x86\xa3\" " +"h\xa9:A\x17\xc4;2Yt\xd4\xf+U-\xfd\xe5\r\xb7g\xcc\xa8\x9e\xa3(\xdapG\xbeL\x90-\x1e" +".vb\xb5\xba\x30(\xc7\x8a\x95\xe3\x15\x64\x1d\x89\xb0\x35R%\xdf\xc3\xac\xc6\x9f \xca" +"9x\x96\x15\xcf|\xa7\xe\x30\x9b\xddVn)\xfer\xba;L\x1e\xab\xc1\x37T\x5\x8e}K\xc9\xe4" +"\x8\xf8\xec\xec\xb5\xe1\xceU1\xa4g\x80y\x9f)\xed\xd0=oV|w\xc1\x93\x13\xe2\x90J\x8f" +"\xc0\xd8\xcc)\xf8\xbc\xb6\x9dNq}\xf7\xf5\xf2-\x92\x1e\xbb\x43zl\x1d\xe1\x2\xeb,\xf2" +">0\xe9H%\xd2;\x1d\xc0\x62\xcf\xd3_W\xc0\xaf\x1f\xd0\xe4\xdd\x11J\x83\"\x8fS6u\x9e" +"@\xa4Qh\xb\xe6\xe5\xd6\x9e\xce\xa3\r\xb8\xb6\xbf\xa1*\x94\xb8\xe5?\x1d\xfb\xc2\xe5" +"\x98:\xe3\xb2\x11\xb3\xd1\xe9\xd7\xae\xec'\xee\xf3\x98\x66MNB\x9fP[\xc2\x1\n\x1d" +"\xa8L\xea\x64\xb9G\xda\xdf\x34\x94\x61\x97\x33=\x1a\xf4\x39t\xac\x64\xb\xa0|\xba" +"/bp\xc1\x1b'\xb7\xbc\x9d\xf4\x1dNv\xcd\xcf\xf5\xe5\xf3\xedN\xbc\xfW=1\xfe\xe2\x89" +"\x5\xb1\xbc\xf\x61p8p%+\xda\xba\x64\x4\xd5\x9J\xedh\xfaL\xa0k \xacya\x99\xce*\xc4.\xa2\xe8\xcf\xe7" +"\xae\x6\x19\xb1\xde{<\xc9{\xb5\xb3@s\xe1\xa4y\xaf\xc4\xa0\x92&\xed\xb4\xc7\xfe\xa4" +"\x90\xee\\\x83&\xb6\x34\xbb\x93\xf\xfc\x95Q\xba%\xcf<\x88\xa6\x8d\x8a\xa8JY\xf2S" +"$W\x84\x46/\xe4J\xe\xb3\"R\xbb\x38Q\xb9]A<\xb5\xbfX\x1a\xfd##y\x16\x32\xc7\x65\xc0" +"\xa3y\xd1\x84\x9c;\xedKf\xe1N\x9\x1b\x1fi\xd3\xf\xea\xd1\xc3\x95\xc1\x95Y\xb?<6\xe7" +"\xde]=\x1b\xe1\xc7\xa6MI:\x1b\xde\xe9*\xb3\xe3M8\x9d\x8f\xc3\xbf\xbcv\xe4\xab\x62" +"<\xa7\xb7\xfe\x1f\xc9\x5\xbc\x8dq\xeb\x1c\xe6\x63\x9a\x61L\xf\xcc\x35|\xcc\x1b\x61" +"M\xbc\xf5qr\xe8\xf5R\xd8\x43\x9\x7fZD\x90\xeTu<\x1a\x90\x5\x32':>\xc4=f+P\x11\xce" +"A\xe7\x30\x35N\xec\\,\xc2!\x9f}X\xac\xde\xa6\xab\xa7Hu--v\x85t\x95\xf5)b\xe5\xf8" +"\xc1\x65\xcd\r%M]\x84\x37\xb5\xd5\xbf\xe6\xc9[\xc8\x88*O\xd2\xeb\x86_\x9a\xb5L\xc3" +"\xf1J@u\xd0\x7f\xd4\xb3\xaf\x98\x17\x1f\xb7>\xc2\xd7\x64z$n\x16\x1b\x98t\rtCq\xf3" +"flz}\x12\xf6\xd7\xd1Vm\x11%\x42$U\x82\x44\xc8\xc\xf1\xfa\xc5\x1\x96L\x97\x62\x61" +"\xdb\x85\xf6\xf7St\x1b\x8bZ&\x8aV\xa5\xc5\x8e!B\x1b\xa9\x84\xda\xda\x83\x8c\xdd\xd8" +"l\nr\r\x1d\xe4\xb0\x8f\xb9\xf4\x9e\x7<\xc5\xc1\x92\xb9\x9o\xc4\x30\r\x3\x8c\x1f\x32" +"\n\x3\x95\xfc\x11\x37\xd5\x8c\x82\x62\xbc\x41\x12\x9b\x14-\x87\xf4\x35\xc5\x88\xee" +"\x1cx\x2\xe7\x42[9\x91\xf8Ox\x80/\xb1\xbfg\x94\xeb!\xe\x41\xcdMiQ\xe1\x45\x7f\xb3" +"\x1a\x85\xbc\xda\x84\xf7\xd6\xde\x8cWb\x87+\x9\xe\xcf\xech\x1d\xe4\xe7\xc1{\xa1\xd3" +"\xc0\xc7\xcf~\xac\x95\xe9\xc2,X\x7f\xf7\xab'\n\x8e\x85\xdd\xb4\x82\xef\xec\xd6\x85" +"\x9dn\xcVe\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" +"000000000000000000000000000000000000000000000000000\r000000000000000000000000000" +"0000000000000000000000000000000000000\r00000000000000000000000000000000000000000" +"00000000000000000000000\r0000000000000000000000000000000000000000000000000000000" +"000000000\r0000000000000000000000000000000000000000000000000000000000000000\r000" +"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" +"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" +"000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n019003l_afm_len = 31763; +char* n019003l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusSanL-Regu\n" +"FullName Nimbus Sans L Regular\nFamilyName Nimbus Sans L\nWeight Regular\nItalic" +"Angle 0.0\nIsFixedPitch false\nUnderlinePosition -151\nUnderlineThickness 50\nVe" +"rsion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncod" +"ingScheme AdobeStandardEncoding\nFontBBox -174 -285 1001 953\nCapHeight 729\nXHe" +"ight 524\nDescender -218\nAscender 729\nStartCharMetrics 316\nC 32 ; WX 278 ; N " +"space ; B 191 0 191 0 ;\nC 33 ; WX 278 ; N exclam ; B 124 0 208 729 ;\nC 34 ; WX" +" 355 ; N quotedbl ; B 52 464 305 709 ;\nC 35 ; WX 556 ; N numbersign ; B 14 -20 " +"542 697 ;\nC 36 ; WX 556 ; N dollar ; B 26 -126 518 770 ;\nC 37 ; WX 889 ; N per" +"cent ; B 29 -20 859 709 ;\nC 38 ; WX 667 ; N ampersand ; B 52 -23 637 709 ;\nC 3" +"9 ; WX 221 ; N quoteright ; B 64 497 157 729 ;\nC 40 ; WX 333 ; N parenleft ; B " +"73 -212 291 729 ;\nC 41 ; WX 333 ; N parenright ; B 38 -212 256 729 ;\nC 42 ; WX" +" 389 ; N asterisk ; B 40 441 343 729 ;\nC 43 ; WX 584 ; N plus ; B 50 -10 534 47" +"4 ;\nC 44 ; WX 278 ; N comma ; B 87 -147 192 104 ;\nC 45 ; WX 333 ; N hyphen ; B" +" 46 240 284 312 ;\nC 46 ; WX 278 ; N period ; B 87 0 191 104 ;\nC 47 ; WX 278 ; " +"N slash ; B -8 -20 284 729 ;\nC 48 ; WX 556 ; N zero ; B 43 -23 507 709 ;\nC 49 " +"; WX 556 ; N one ; B 102 0 347 709 ;\nC 50 ; WX 556 ; N two ; B 34 0 511 709 ;\n" +"C 51 ; WX 556 ; N three ; B 32 -23 506 709 ;\nC 52 ; WX 556 ; N four ; B 28 0 52" +"0 709 ;\nC 53 ; WX 556 ; N five ; B 35 -23 513 709 ;\nC 54 ; WX 556 ; N six ; B " +"43 -23 513 709 ;\nC 55 ; WX 556 ; N seven ; B 46 0 520 709 ;\nC 56 ; WX 556 ; N " +"eight ; B 37 -23 513 709 ;\nC 57 ; WX 556 ; N nine ; B 38 -23 509 709 ;\nC 58 ; " +"WX 278 ; N colon ; B 110 0 214 524 ;\nC 59 ; WX 278 ; N semicolon ; B 110 -147 2" +"15 524 ;\nC 60 ; WX 584 ; N less ; B 45 -9 534 474 ;\nC 61 ; WX 584 ; N equal ; " +"B 50 111 534 353 ;\nC 62 ; WX 584 ; N greater ; B 50 -9 539 474 ;\nC 63 ; WX 556" +" ; N question ; B 77 0 509 741 ;\nC 64 ; WX 1015 ; N at ; B 34 -142 951 741 ;\nC" +" 65 ; WX 667 ; N A ; B 17 0 653 729 ;\nC 66 ; WX 667 ; N B ; B 79 0 623 729 ;\nC" +" 67 ; WX 722 ; N C ; B 48 -23 677 741 ;\nC 68 ; WX 722 ; N D ; B 89 0 667 729 ;\n" +"C 69 ; WX 667 ; N E ; B 90 0 613 729 ;\nC 70 ; WX 611 ; N F ; B 90 0 579 729 ;\n" +"C 71 ; WX 778 ; N G ; B 44 -23 709 741 ;\nC 72 ; WX 722 ; N H ; B 83 0 644 729 ;" +"\nC 73 ; WX 278 ; N I ; B 100 0 194 729 ;\nC 74 ; WX 500 ; N J ; B 17 -23 426 72" +"9 ;\nC 75 ; WX 667 ; N K ; B 79 0 658 729 ;\nC 76 ; WX 556 ; N L ; B 80 0 533 72" +"9 ;\nC 77 ; WX 833 ; N M ; B 75 0 761 729 ;\nC 78 ; WX 722 ; N N ; B 76 0 646 72" +"9 ;\nC 79 ; WX 778 ; N O ; B 38 -23 742 741 ;\nC 80 ; WX 667 ; N P ; B 91 0 617 " +"729 ;\nC 81 ; WX 778 ; N Q ; B 38 -59 742 741 ;\nC 82 ; WX 722 ; N R ; B 93 0 67" +"9 729 ;\nC 83 ; WX 667 ; N S ; B 48 -23 621 741 ;\nC 84 ; WX 611 ; N T ; B 21 0 " +"593 729 ;\nC 85 ; WX 722 ; N U ; B 85 -23 645 729 ;\nC 86 ; WX 667 ; N V ; B 30 " +"0 645 729 ;\nC 87 ; WX 944 ; N W ; B 22 0 929 729 ;\nC 88 ; WX 667 ; N X ; B 22 " +"0 649 729 ;\nC 89 ; WX 667 ; N Y ; B 13 0 661 729 ;\nC 90 ; WX 611 ; N Z ; B 28 " +"0 583 729 ;\nC 91 ; WX 278 ; N bracketleft ; B 64 -212 250 729 ;\nC 92 ; WX 278 " +"; N backslash ; B -8 -20 284 729 ;\nC 93 ; WX 278 ; N bracketright ; B 23 -212 2" +"09 729 ;\nC 94 ; WX 469 ; N asciicircum ; B 44 329 425 709 ;\nC 95 ; WX 556 ; N " +"underscore ; B -22 -176 578 -126 ;\nC 96 ; WX 222 ; N quoteleft ; B 65 477 158 7" +"09 ;\nC 97 ; WX 556 ; N a ; B 42 -23 535 539 ;\nC 98 ; WX 556 ; N b ; B 54 -23 5" +"23 729 ;\nC 99 ; WX 500 ; N c ; B 31 -23 477 539 ;\nC 100 ; WX 556 ; N d ; B 26 " +"-23 495 729 ;\nC 101 ; WX 556 ; N e ; B 40 -23 513 539 ;\nC 102 ; WX 278 ; N f ;" +" B 18 0 258 732 ;\nC 103 ; WX 556 ; N g ; B 29 -218 489 539 ;\nC 104 ; WX 556 ; " +"N h ; B 70 0 486 729 ;\nC 105 ; WX 222 ; N i ; B 66 0 150 729 ;\nC 106 ; WX 222 " +"; N j ; B -18 -218 153 729 ;\nC 107 ; WX 500 ; N k ; B 58 0 502 729 ;\nC 108 ; W" +"X 222 ; N l ; B 68 0 152 729 ;\nC 109 ; WX 833 ; N m ; B 70 0 762 539 ;\nC 110 ;" +" WX 556 ; N n ; B 70 0 487 539 ;\nC 111 ; WX 556 ; N o ; B 36 -23 510 539 ;\nC 1" +"12 ; WX 556 ; N p ; B 54 -218 523 539 ;\nC 113 ; WX 556 ; N q ; B 26 -218 495 53" +"9 ;\nC 114 ; WX 333 ; N r ; B 69 0 321 539 ;\nC 115 ; WX 500 ; N s ; B 34 -23 45" +"9 539 ;\nC 116 ; WX 278 ; N t ; B 14 -23 254 668 ;\nC 117 ; WX 556 ; N u ; B 65 " +"-23 482 524 ;\nC 118 ; WX 500 ; N v ; B 10 0 486 524 ;\nC 119 ; WX 722 ; N w ; B" +" 6 0 708 524 ;\nC 120 ; WX 500 ; N x ; B 17 0 473 524 ;\nC 121 ; WX 500 ; N y ; " +"B 20 -218 478 524 ;\nC 122 ; WX 500 ; N z ; B 31 0 457 524 ;\nC 123 ; WX 334 ; N" +" braceleft ; B 43 -212 276 729 ;\nC 124 ; WX 260 ; N bar ; B 100 -212 160 729 ;\n" +"C 125 ; WX 334 ; N braceright ; B 29 -212 262 729 ;\nC 126 ; WX 584 ; N asciitil" +"de ; B 75 268 508 438 ;\nC 161 ; WX 333 ; N exclamdown ; B 121 -205 205 524 ;\nC" +" 162 ; WX 556 ; N cent ; B 52 -120 510 628 ;\nC 163 ; WX 556 ; N sterling ; B 26" +" -23 535 729 ;\nC 164 ; WX 167 ; N fraction ; B -174 -20 336 709 ;\nC 165 ; WX 5" +"56 ; N yen ; B 11 0 545 709 ;\nC 166 ; WX 556 ; N florin ; B 11 -212 542 738 ;\n" +"C 167 ; WX 556 ; N section ; B 43 -213 506 729 ;\nC 168 ; WX 556 ; N currency ; " +"B 67 133 489 551 ;\nC 169 ; WX 191 ; N quotesingle ; B 48 464 142 709 ;\nC 170 ;" +" WX 333 ; N quotedblleft ; B 48 477 299 709 ;\nC 171 ; WX 556 ; N guillemotleft " +"; B 98 106 455 438 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 91 106 243 438 ;\nC 1" +"73 ; WX 333 ; N guilsinglright ; B 85 106 239 438 ;\nC 174 ; WX 500 ; N fi ; B 1" +"2 0 436 732 ;\nC 175 ; WX 500 ; N fl ; B 17 0 430 732 ;\nC 177 ; WX 556 ; N enda" +"sh ; B -5 240 561 312 ;\nC 178 ; WX 556 ; N dagger ; B 38 -177 513 709 ;\nC 179 " +"; WX 556 ; N daggerdbl ; B 38 -177 513 709 ;\nC 180 ; WX 278 ; N periodcentered " +"; B 87 302 211 427 ;\nC 182 ; WX 537 ; N paragraph ; B 48 -177 522 729 ;\nC 183 " +"; WX 350 ; N bullet ; B 50 220 300 470 ;\nC 184 ; WX 222 ; N quotesinglbase ; B " +"64 -128 158 104 ;\nC 185 ; WX 333 ; N quotedblbase ; B 47 -128 300 104 ;\nC 186 " +"; WX 333 ; N quotedblright ; B 49 477 302 709 ;\nC 187 ; WX 556 ; N guillemotrig" +"ht ; B 98 106 451 438 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 885 104 ;\nC 189" +" ; WX 1000 ; N perthousand ; B 9 -22 993 738 ;\nC 191 ; WX 611 ; N questiondown " +"; B 95 -217 528 524 ;\nC 193 ; WX 333 ; N grave ; B 22 592 231 740 ;\nC 194 ; WX" +" 333 ; N acute ; B 92 592 301 740 ;\nC 195 ; WX 333 ; N circumflex ; B 20 591 30" +"7 741 ;\nC 196 ; WX 333 ; N tilde ; B 5 613 319 717 ;\nC 197 ; WX 333 ; N macron" +" ; B 28 631 302 701 ;\nC 198 ; WX 333 ; N breve ; B 15 597 316 732 ;\nC 199 ; WX" +" 333 ; N dotaccent ; B 115 612 219 716 ;\nC 200 ; WX 333 ; N dieresis ; B 30 612" +" 296 715 ;\nC 202 ; WX 333 ; N ring ; B 79 579 255 754 ;\nC 203 ; WX 333 ; N ced" +"illa ; B 39 -214 287 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -35 590 348 740 ;\n" +"C 206 ; WX 333 ; N ogonek ; B 57 -205 265 0 ;\nC 207 ; WX 333 ; N caron ; B 19 5" +"91 306 741 ;\nC 208 ; WX 1000 ; N emdash ; B -9 240 1001 312 ;\nC 225 ; WX 1000 " +"; N AE ; B 11 0 950 729 ;\nC 227 ; WX 370 ; N ordfeminine ; B 37 303 333 742 ;\n" +"C 232 ; WX 556 ; N Lslash ; B 0 0 552 729 ;\nC 233 ; WX 778 ; N Oslash ; B 30 -2" +"3 744 755 ;\nC 234 ; WX 1000 ; N OE ; B 43 -20 959 741 ;\nC 235 ; WX 365 ; N ord" +"masculine ; B 40 303 324 742 ;\nC 241 ; WX 889 ; N ae ; B 34 -23 845 539 ;\nC 24" +"5 ; WX 278 ; N dotlessi ; B 94 0 178 524 ;\nC 248 ; WX 222 ; N lslash ; B 0 0 21" +"2 729 ;\nC 249 ; WX 611 ; N oslash ; B 18 -30 529 539 ;\nC 250 ; WX 944 ; N oe ;" +" B 40 -23 899 539 ;\nC 251 ; WX 611 ; N germandbls ; B 126 -20 566 729 ;\nC -1 ;" +" WX 722 ; N Udieresis ; B 85 -23 645 914 ;\nC -1 ; WX 722 ; N Uacute ; B 85 -23 " +"645 939 ;\nC -1 ; WX 667 ; N Scedilla ; B 45 -214 621 741 ;\nC -1 ; WX 611 ; N T" +"caron ; B 21 0 593 940 ;\nC -1 ; WX 667 ; N Scaron ; B 48 -23 621 940 ;\nC -1 ; " +"WX 722 ; N Rcaron ; B 93 0 679 940 ;\nC -1 ; WX 722 ; N Racute ; B 93 0 679 939 " +";\nC -1 ; WX 667 ; N Sacute ; B 48 -23 621 939 ;\nC -1 ; WX 778 ; N Otilde ; B 3" +"8 -23 742 916 ;\nC -1 ; WX 556 ; N ucircumflex ; B 65 -23 482 741 ;\nC -1 ; WX 7" +"78 ; N Ohungarumlaut ; B 38 -23 742 939 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 8" +"5 -23 645 939 ;\nC -1 ; WX 666 ; N Yacute ; B 13 0 661 939 ;\nC -1 ; WX 722 ; N " +"Eth ; B 20 0 667 729 ;\nC -1 ; WX 722 ; N Dcroat ; B 20 0 667 729 ;\nC -1 ; WX 6" +"11 ; N Zacute ; B 28 0 583 939 ;\nC -1 ; WX 722 ; N Uring ; B 85 -23 645 953 ;\n" +"C -1 ; WX 556 ; N gbreve ; B 29 -218 489 732 ;\nC -1 ; WX 556 ; N eogonek ; B 40" +" -204 514 539 ;\nC -1 ; WX 556 ; N edotaccent ; B 40 -23 513 716 ;\nC -1 ; WX 55" +"6 ; N ecaron ; B 40 -23 513 741 ;\nC -1 ; WX 722 ; N Ugrave ; B 85 -23 645 939 ;" +"\nC -1 ; WX 666 ; N Thorn ; B 91 0 616 729 ;\nC -1 ; WX 556 ; N eacute ; B 40 -2" +"3 513 740 ;\nC -1 ; WX 556 ; N edieresis ; B 40 -23 513 715 ;\nC -1 ; WX 635 ; N" +" dcaron ; B 26 -23 648 729 ;\nC -1 ; WX 500 ; N ccedilla ; B 31 -214 477 539 ;\n" +"C -1 ; WX 500 ; N ccaron ; B 31 -23 477 741 ;\nC -1 ; WX 500 ; N cacute ; B 31 -" +"23 477 740 ;\nC -1 ; WX 556 ; N aogonek ; B 43 -205 596 539 ;\nC -1 ; WX 556 ; N" +" aring ; B 42 -23 535 754 ;\nC -1 ; WX 556 ; N atilde ; B 42 -23 535 717 ;\nC -1" +" ; WX 556 ; N abreve ; B 42 -23 535 732 ;\nC -1 ; WX 556 ; N egrave ; B 40 -23 5" +"13 740 ;\nC -1 ; WX 556 ; N agrave ; B 42 -23 535 740 ;\nC -1 ; WX 556 ; N aacut" +"e ; B 42 -23 535 740 ;\nC -1 ; WX 556 ; N adieresis ; B 42 -23 535 715 ;\nC -1 ;" +" WX 722 ; N Uogonek ; B 85 -205 645 729 ;\nC -1 ; WX 556 ; N ugrave ; B 65 -23 4" +"82 740 ;\nC -1 ; WX 556 ; N uacute ; B 65 -23 482 740 ;\nC -1 ; WX 556 ; N udier" +"esis ; B 65 -23 482 715 ;\nC -1 ; WX 308 ; N tcaron ; B 14 -23 321 800 ;\nC -1 ;" +" WX 500 ; N scommaaccent ; B 34 -285 459 539 ;\nC -1 ; WX 611 ; N Zcaron ; B 28 " +"0 583 940 ;\nC -1 ; WX 556 ; N ecircumflex ; B 40 -23 513 741 ;\nC -1 ; WX 722 ;" +" N Ucircumflex ; B 85 -23 645 940 ;\nC -1 ; WX 556 ; N acircumflex ; B 42 -23 53" +"5 741 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 28 0 583 915 ;\nC -1 ; WX 500 ; N scar" +"on ; B 34 -23 459 741 ;\nC -1 ; WX 667 ; N Amacron ; B 17 0 653 900 ;\nC -1 ; WX" +" 500 ; N sacute ; B 34 -23 459 740 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 21 -285" +" 593 729 ;\nC -1 ; WX 667 ; N Ydieresis ; B 13 0 661 914 ;\nC -1 ; WX 555 ; N th" +"orn ; B 54 -218 522 714 ;\nC -1 ; WX 667 ; N Emacron ; B 90 0 613 900 ;\nC -1 ; " +"WX 778 ; N Ograve ; B 38 -23 742 939 ;\nC -1 ; WX 778 ; N Oacute ; B 38 -23 742 " +"939 ;\nC -1 ; WX 778 ; N Odieresis ; B 38 -23 742 914 ;\nC -1 ; WX 722 ; N Ntild" +"e ; B 76 0 646 916 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 646 940 ;\nC -1 ; WX 722" +" ; N Nacute ; B 76 0 646 939 ;\nC -1 ; WX 556 ; N Lcaron ; B 80 0 533 729 ;\nC -" +"1 ; WX 556 ; N Lacute ; B 70 0 533 939 ;\nC -1 ; WX 278 ; N Idotaccent ; B 92 0 " +"196 915 ;\nC -1 ; WX 333 ; N racute ; B 69 0 331 740 ;\nC -1 ; WX 278 ; N Icircu" +"mflex ; B -1 0 286 940 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 36 -23 526 740 ;\n" +"C -1 ; WX 556 ; N otilde ; B 36 -23 510 717 ;\nC -1 ; WX 556 ; N Euro ; B 2 -23 " +"543 709 ;\nC -1 ; WX 556 ; N ocircumflex ; B 36 -23 510 741 ;\nC -1 ; WX 351 ; N" +" onesuperior ; B 61 284 222 709 ;\nC -1 ; WX 351 ; N twosuperior ; B 19 284 326 " +"709 ;\nC -1 ; WX 351 ; N threesuperior ; B 16 270 322 709 ;\nC -1 ; WX 278 ; N I" +"grave ; B 1 0 210 939 ;\nC -1 ; WX 278 ; N Iacute ; B 71 0 280 939 ;\nC -1 ; WX " +"278 ; N Imacron ; B 20 0 274 900 ;\nC -1 ; WX 278 ; N Iogonek ; B 66 -204 234 72" +"9 ;\nC -1 ; WX 278 ; N Idieresis ; B 9 0 275 907 ;\nC -1 ; WX 778 ; N Gbreve ; B" +" 44 -23 709 931 ;\nC -1 ; WX 722 ; N Umacron ; B 85 -23 645 900 ;\nC -1 ; WX 667" +" ; N Kcommaaccent ; B 79 -285 658 729 ;\nC -1 ; WX 556 ; N ograve ; B 36 -23 510" +" 740 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 48 -285 621 741 ;\nC -1 ; WX 667 ; N " +"Eogonek ; B 90 -205 652 729 ;\nC -1 ; WX 556 ; N oacute ; B 36 -23 510 740 ;\nC " +"-1 ; WX 667 ; N Edotaccent ; B 90 0 613 915 ;\nC -1 ; WX 222 ; N iogonek ; B 25 " +"-204 190 729 ;\nC -1 ; WX 556 ; N gcommaaccent ; B 29 -218 489 817 ;\nC -1 ; WX " +"556 ; N odieresis ; B 36 -23 510 715 ;\nC -1 ; WX 556 ; N ntilde ; B 70 0 487 71" +"7 ;\nC -1 ; WX 556 ; N ncaron ; B 70 0 487 741 ;\nC -1 ; WX 667 ; N Ecaron ; B 9" +"0 0 613 940 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 90 0 613 940 ;\nC -1 ; WX 500 ;" +" N scedilla ; B 34 -214 459 539 ;\nC -1 ; WX 333 ; N rcaron ; B 48 0 335 741 ;\n" +"C -1 ; WX 667 ; N Egrave ; B 90 0 613 939 ;\nC -1 ; WX 667 ; N Eacute ; B 90 0 6" +"13 939 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 44 -285 709 741 ;\nC -1 ; WX 722 ; " +"N Rcommaaccent ; B 93 -285 679 729 ;\nC -1 ; WX 667 ; N Edieresis ; B 90 0 613 9" +"14 ;\nC -1 ; WX 556 ; N nacute ; B 70 0 487 740 ;\nC -1 ; WX 556 ; N uogonek ; B" +" 65 -204 521 524 ;\nC -1 ; WX 556 ; N umacron ; B 65 -23 482 701 ;\nC -1 ; WX 72" +"2 ; N Dcaron ; B 89 0 667 940 ;\nC -1 ; WX 292 ; N lcaron ; B 68 0 305 729 ;\nC " +"-1 ; WX 722 ; N Ccaron ; B 48 -23 677 940 ;\nC -1 ; WX 722 ; N Cacute ; B 48 -23" +" 677 939 ;\nC -1 ; WX 722 ; N Ccedilla ; B 48 -214 677 741 ;\nC -1 ; WX 606 ; N " +"degree ; B 151 383 454 686 ;\nC -1 ; WX 667 ; N Aogonek ; B 17 -205 692 729 ;\nC" +" -1 ; WX 584 ; N minus ; B 40 197 544 267 ;\nC -1 ; WX 584 ; N multiply ; B 95 3" +"4 488 427 ;\nC -1 ; WX 584 ; N divide ; B 50 0 534 472 ;\nC -1 ; WX 667 ; N Arin" +"g ; B 17 0 653 953 ;\nC -1 ; WX 1000 ; N trademark ; B 63 292 938 729 ;\nC -1 ; " +"WX 333 ; N rcommaaccent ; B 65 -285 321 539 ;\nC -1 ; WX 222 ; N lacute ; B 63 0" +" 272 939 ;\nC -1 ; WX 556 ; N omacron ; B 36 -23 510 701 ;\nC -1 ; WX 667 ; N At" +"ilde ; B 17 0 653 916 ;\nC -1 ; WX 278 ; N icircumflex ; B -7 0 280 741 ;\nC -1 " +"; WX 278 ; N igrave ; B -5 0 204 740 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 70 -2" +"85 487 539 ;\nC -1 ; WX 222 ; N lcommaaccent ; B 63 -285 163 729 ;\nC -1 ; WX 58" +"4 ; N plusminus ; B 50 -11 534 623 ;\nC -1 ; WX 869 ; N onehalf ; B 61 -20 844 7" +"09 ;\nC -1 ; WX 869 ; N onequarter ; B 61 -20 849 709 ;\nC -1 ; WX 869 ; N three" +"quarters ; B 16 -20 849 709 ;\nC -1 ; WX 278 ; N iacute ; B 65 0 274 740 ;\nC -1" +" ; WX 667 ; N Abreve ; B 17 0 653 931 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 58 -" +"285 502 729 ;\nC -1 ; WX 778 ; N Omacron ; B 38 -23 742 900 ;\nC -1 ; WX 222 ; N" +" imacron ; B -16 0 231 701 ;\nC -1 ; WX 556 ; N emacron ; B 40 -23 513 701 ;\nC " +"-1 ; WX 556 ; N amacron ; B 42 -23 535 701 ;\nC -1 ; WX 278 ; N tcommaaccent ; B" +" 14 -285 254 668 ;\nC -1 ; WX 500 ; N ydieresis ; B 20 -218 478 715 ;\nC -1 ; WX" +" 500 ; N zdotaccent ; B 31 0 457 716 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 457 74" +"1 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 457 740 ;\nC -1 ; WX 500 ; N yacute ; B 2" +"0 -218 478 740 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 65 -23 530 740 ;\nC -1 ; W" +"X 556 ; N eth ; B 36 -23 510 743 ;\nC -1 ; WX 556 ; N uring ; B 65 -23 482 754 ;" +"\nC -1 ; WX 778 ; N Ocircumflex ; B 38 -23 742 940 ;\nC -1 ; WX 333 ; N commaacc" +"ent ; B 116 -285 216 -60 ;\nC -1 ; WX 737 ; N copyright ; B -13 -22 751 742 ;\nC" +" -1 ; WX 737 ; N registered ; B -13 -22 751 742 ;\nC -1 ; WX 667 ; N Acircumflex" +" ; B 17 0 653 940 ;\nC -1 ; WX 278 ; N idieresis ; B 3 0 269 708 ;\nC -1 ; WX 48" +"9 ; N lozenge ; B 16 0 462 744 ;\nC -1 ; WX 711 ; N Delta ; B 10 0 701 729 ;\nC " +"-1 ; WX 548 ; N notequal ; B 32 -25 516 486 ;\nC -1 ; WX 542 ; N radical ; B 7 -" +"36 512 913 ;\nC -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ;\nC -1 ; WX 667 ; N Aac" +"ute ; B 17 0 653 939 ;\nC -1 ; WX 584 ; N lessequal ; B 45 -11 534 639 ;\nC -1 ;" +" WX 584 ; N greaterequal ; B 45 -11 534 639 ;\nC -1 ; WX 584 ; N logicalnot ; B " +"40 86 544 375 ;\nC -1 ; WX 711 ; N summation ; B 17 -97 694 760 ;\nC -1 ; WX 490" +" ; N partialdiff ; B 22 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 76 -28" +"5 646 729 ;\nC -1 ; WX 556 ; N dcroat ; B 26 -23 557 729 ;\nC -1 ; WX 260 ; N br" +"okenbar ; B 100 -212 160 729 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B 80 -285 533 7" +"29 ;\nC -1 ; WX 667 ; N Adieresis ; B 17 0 653 914 ;\nC -1 ; WX 556 ; N mu ; B 6" +"5 -220 544 524 ;\nC -1 ; WX 278 ; N .notdef ; B 191 0 191 0 ;\nEndCharMetrics\nS" +"tartKernData\nStartKernPairs 998\nKPX A C -36\nKPX A Ccedilla -36\nKPX A G -35\n" +"KPX A O -33\nKPX A Odieresis -33\nKPX A Q -32\nKPX A T -93\nKPX A U -37\nKPX A U" +"acute -37\nKPX A Ucircumflex -37\nKPX A Udieresis -37\nKPX A Ugrave -37\nKPX A V" +" -75\nKPX A W -51\nKPX A Y -99\nKPX A a -4\nKPX A b 4\nKPX A c -11\nKPX A ccedil" +"la -10\nKPX A comma 5\nKPX A d -8\nKPX A e -16\nKPX A g -10\nKPX A guillemotleft" +" -44\nKPX A guilsinglleft -40\nKPX A hyphen -3\nKPX A o -13\nKPX A period 5\nKPX" +" A q -8\nKPX A quotedblright -56\nKPX A quoteright -65\nKPX A t -16\nKPX A u -12" +"\nKPX A v -31\nKPX A w -21\nKPX A y -34\nKPX Aacute C -36\nKPX Aacute G -35\nKPX" +" Aacute O -33\nKPX Aacute Q -32\nKPX Aacute T -93\nKPX Aacute U -37\nKPX Aacute " +"V -75\nKPX Aacute W -51\nKPX Aacute Y -99\nKPX Aacute a -4\nKPX Aacute b 4\nKPX " +"Aacute c -11\nKPX Aacute comma 5\nKPX Aacute d -8\nKPX Aacute e -16\nKPX Aacute " +"g -10\nKPX Aacute guillemotleft -44\nKPX Aacute guilsinglleft -40\nKPX Aacute hy" +"phen -3\nKPX Aacute o -13\nKPX Aacute period 5\nKPX Aacute q -8\nKPX Aacute quot" +"eright -65\nKPX Aacute t -16\nKPX Aacute u -12\nKPX Aacute v -31\nKPX Aacute w -" +"21\nKPX Aacute y -34\nKPX Acircumflex C -36\nKPX Acircumflex G -35\nKPX Acircumf" +"lex O -33\nKPX Acircumflex Q -32\nKPX Acircumflex T -93\nKPX Acircumflex U -37\n" +"KPX Acircumflex V -75\nKPX Acircumflex W -51\nKPX Acircumflex Y -99\nKPX Acircum" +"flex comma 5\nKPX Acircumflex period 5\nKPX Adieresis C -36\nKPX Adieresis G -35" +"\nKPX Adieresis O -33\nKPX Adieresis Q -32\nKPX Adieresis T -93\nKPX Adieresis U" +" -37\nKPX Adieresis V -75\nKPX Adieresis W -51\nKPX Adieresis Y -99\nKPX Adieres" +"is a -4\nKPX Adieresis b 4\nKPX Adieresis c -11\nKPX Adieresis comma 5\nKPX Adie" +"resis d -8\nKPX Adieresis g -10\nKPX Adieresis guillemotleft -44\nKPX Adieresis " +"guilsinglleft -40\nKPX Adieresis hyphen -3\nKPX Adieresis o -13\nKPX Adieresis p" +"eriod 5\nKPX Adieresis q -8\nKPX Adieresis quotedblright -56\nKPX Adieresis quot" +"eright -65\nKPX Adieresis t -16\nKPX Adieresis u -12\nKPX Adieresis v -31\nKPX A" +"dieresis w -21\nKPX Adieresis y -34\nKPX Agrave C -36\nKPX Agrave G -35\nKPX Agr" +"ave O -33\nKPX Agrave Q -32\nKPX Agrave T -93\nKPX Agrave U -37\nKPX Agrave V -7" +"5\nKPX Agrave W -51\nKPX Agrave Y -99\nKPX Agrave comma 5\nKPX Agrave period 5\n" +"KPX Aring C -36\nKPX Aring G -35\nKPX Aring O -33\nKPX Aring Q -32\nKPX Aring T " +"-93\nKPX Aring U -37\nKPX Aring V -75\nKPX Aring W -51\nKPX Aring Y -99\nKPX Ari" +"ng a -4\nKPX Aring b 4\nKPX Aring c -11\nKPX Aring comma 5\nKPX Aring d -8\nKPX " +"Aring e -16\nKPX Aring g -10\nKPX Aring guillemotleft -44\nKPX Aring guilsinglle" +"ft -40\nKPX Aring hyphen -3\nKPX Aring o -13\nKPX Aring period 5\nKPX Aring q -8" +"\nKPX Aring quotedblright -56\nKPX Aring quoteright -65\nKPX Aring t -16\nKPX Ar" +"ing u -12\nKPX Aring v -31\nKPX Aring w -21\nKPX Aring y -34\nKPX Atilde C -36\n" +"KPX Atilde G -35\nKPX Atilde O -33\nKPX Atilde Q -32\nKPX Atilde T -93\nKPX Atil" +"de U -37\nKPX Atilde V -75\nKPX Atilde W -51\nKPX Atilde Y -99\nKPX Atilde comma" +" 5\nKPX Atilde period 5\nKPX B A -21\nKPX B AE -21\nKPX B Aacute -21\nKPX B Acir" +"cumflex -21\nKPX B Adieresis -21\nKPX B Aring -21\nKPX B Atilde -21\nKPX B O -7\n" +"KPX B OE -5\nKPX B Oacute -7\nKPX B Ocircumflex -7\nKPX B Odieresis -7\nKPX B Og" +"rave -7\nKPX B Oslash -1\nKPX B V -41\nKPX B W -25\nKPX B Y -44\nKPX C A -32\nKP" +"X C AE -33\nKPX C Aacute -32\nKPX C Adieresis -32\nKPX C Aring -32\nKPX C H -12\n" +"KPX C K -10\nKPX C O -8\nKPX C Oacute -8\nKPX C Odieresis -8\nKPX Ccedilla A -31" +"\nKPX D A -42\nKPX D Aacute -42\nKPX D Acircumflex -42\nKPX D Adieresis -42\nKPX" +" D Agrave -42\nKPX D Aring -42\nKPX D Atilde -42\nKPX D J -5\nKPX D T -45\nKPX D" +" V -51\nKPX D W -29\nKPX D X -53\nKPX D Y -63\nKPX F A -69\nKPX F Aacute -69\nKP" +"X F Acircumflex -69\nKPX F Adieresis -69\nKPX F Agrave -69\nKPX F Aring -69\nKPX" +" F Atilde -69\nKPX F J -51\nKPX F O -22\nKPX F Odieresis -22\nKPX F a -33\nKPX F" +" aacute -33\nKPX F adieresis -33\nKPX F ae -29\nKPX F aring -33\nKPX F comma -10" +"8\nKPX F e -24\nKPX F eacute -24\nKPX F hyphen -14\nKPX F i -10\nKPX F j -12\nKP" +"X F o -21\nKPX F oacute -21\nKPX F odieresis -21\nKPX F oe -23\nKPX F oslash -21" +"\nKPX F period -108\nKPX F r -35\nKPX F u -33\nKPX G A -6\nKPX G AE -3\nKPX G Aa" +"cute -6\nKPX G Acircumflex -6\nKPX G Adieresis -6\nKPX G Agrave -6\nKPX G Aring " +"-6\nKPX G Atilde -6\nKPX G T -44\nKPX G V -50\nKPX G W -28\nKPX G Y -62\nKPX J A" +" -32\nKPX J AE -31\nKPX J Adieresis -32\nKPX J Aring -32\nKPX K C -51\nKPX K G -" +"51\nKPX K O -48\nKPX K OE -45\nKPX K Oacute -48\nKPX K Odieresis -48\nKPX K S -3" +"8\nKPX K T 20\nKPX K a -11\nKPX K adieresis -11\nKPX K ae -7\nKPX K aring -11\nK" +"PX K e -32\nKPX K hyphen -47\nKPX K o -29\nKPX K oacute -29\nKPX K odieresis -29" +"\nKPX K u -19\nKPX K udieresis -19\nKPX K y -62\nKPX L A 17\nKPX L AE 20\nKPX L " +"Aacute 17\nKPX L Adieresis 17\nKPX L Aring 17\nKPX L C -41\nKPX L Ccedilla -37\n" +"KPX L G -42\nKPX L O -41\nKPX L Oacute -41\nKPX L Ocircumflex -41\nKPX L Odieres" +"is -41\nKPX L Ograve -41\nKPX L Otilde -41\nKPX L S -19\nKPX L T -105\nKPX L U -" +"35\nKPX L Udieresis -35\nKPX L V -105\nKPX L W -68\nKPX L Y -121\nKPX L hyphen -" +"125\nKPX L quotedblright -141\nKPX L quoteright -149\nKPX L u -7\nKPX L udieresi" +"s -7\nKPX L y -56\nKPX N A -9\nKPX N AE -6\nKPX N Aacute -9\nKPX N Adieresis -9\n" +"KPX N Aring -9\nKPX N C -3\nKPX N Ccedilla -3\nKPX N G -2\nKPX N O 0\nKPX N Oacu" +"te 0\nKPX N Odieresis 0\nKPX N a -5\nKPX N aacute -5\nKPX N adieresis -5\nKPX N " +"ae -2\nKPX N aring -5\nKPX N comma -7\nKPX N e 0\nKPX N eacute 0\nKPX N o 2\nKPX" +" N oacute 2\nKPX N odieresis 2\nKPX N oslash 4\nKPX N period -7\nKPX N u 0\nKPX " +"N udieresis 0\nKPX O A -35\nKPX O AE -39\nKPX O Aacute -35\nKPX O Adieresis -35\n" +"KPX O Aring -35\nKPX O T -42\nKPX O V -45\nKPX O W -23\nKPX O X -46\nKPX O Y -59" +"\nKPX Oacute A -35\nKPX Oacute T -42\nKPX Oacute V -45\nKPX Oacute W -23\nKPX Oa" +"cute Y -59\nKPX Ocircumflex T -42\nKPX Ocircumflex V -45\nKPX Ocircumflex Y -59\n" +"KPX Odieresis A -35\nKPX Odieresis T -42\nKPX Odieresis V -45\nKPX Odieresis W -" +"23\nKPX Odieresis X -46\nKPX Odieresis Y -59\nKPX Ograve T -42\nKPX Ograve V -45" +"\nKPX Ograve Y -59\nKPX Oslash A -33\nKPX Otilde T -42\nKPX Otilde V -45\nKPX Ot" +"ilde Y -59\nKPX P A -78\nKPX P AE -86\nKPX P Aacute -78\nKPX P Adieresis -78\nKP" +"X P Aring -78\nKPX P J -78\nKPX P a -28\nKPX P aacute -28\nKPX P adieresis -28\n" +"KPX P ae -24\nKPX P aring -28\nKPX P comma -135\nKPX P e -31\nKPX P eacute -31\n" +"KPX P hyphen -40\nKPX P o -27\nKPX P oacute -27\nKPX P odieresis -27\nKPX P oe -" +"28\nKPX P oslash -27\nKPX P period -135\nKPX R C -16\nKPX R Ccedilla -16\nKPX R " +"G -15\nKPX R O -13\nKPX R OE -11\nKPX R Oacute -13\nKPX R Odieresis -13\nKPX R T" +" -23\nKPX R U -17\nKPX R Udieresis -17\nKPX R V -39\nKPX R W -27\nKPX R Y -43\nK" +"PX R a -15\nKPX R aacute -15\nKPX R adieresis -15\nKPX R ae -12\nKPX R aring -15" +"\nKPX R e -12\nKPX R eacute -12\nKPX R hyphen -2\nKPX R o -9\nKPX R oacute -9\nK" +"PX R odieresis -9\nKPX R oe -11\nKPX R u -9\nKPX R uacute -9\nKPX R udieresis -9" +"\nKPX R y -8\nKPX S A -22\nKPX S AE -22\nKPX S Aacute -22\nKPX S Adieresis -22\n" +"KPX S Aring -22\nKPX S T -28\nKPX S V -42\nKPX S W -28\nKPX S Y -48\nKPX S t -3\n" +"KPX T A -95\nKPX T AE -97\nKPX T Aacute -95\nKPX T Acircumflex -95\nKPX T Adiere" +"sis -95\nKPX T Agrave -95\nKPX T Aring -95\nKPX T Atilde -95\nKPX T C -44\nKPX T" +" G -45\nKPX T J -100\nKPX T O -42\nKPX T OE -35\nKPX T Oacute -42\nKPX T Ocircum" +"flex -42\nKPX T Odieresis -42\nKPX T Ograve -42\nKPX T Oslash -41\nKPX T Otilde " +"-42\nKPX T S -24\nKPX T V 12\nKPX T W 16\nKPX T Y 20\nKPX T a -100\nKPX T ae -97" +"\nKPX T c -90\nKPX T colon -133\nKPX T comma -100\nKPX T e -95\nKPX T g -89\nKPX" +" T guillemotleft -121\nKPX T guilsinglleft -117\nKPX T hyphen -77\nKPX T i -3\nK" +"PX T j -5\nKPX T o -92\nKPX T oslash -87\nKPX T period -100\nKPX T r -92\nKPX T " +"s -92\nKPX T semicolon -129\nKPX T u -91\nKPX T v -95\nKPX T w -93\nKPX T y -100" +"\nKPX U A -36\nKPX U AE -39\nKPX U Aacute -36\nKPX U Acircumflex -36\nKPX U Adie" +"resis -36\nKPX U Aring -36\nKPX U Atilde -36\nKPX U comma -27\nKPX U m -4\nKPX U" +" n -4\nKPX U p 3\nKPX U period -25\nKPX U r -4\nKPX Uacute A -36\nKPX Uacute com" +"ma -27\nKPX Uacute m -4\nKPX Uacute n -4\nKPX Uacute p 3\nKPX Uacute period -25\n" +"KPX Uacute r -4\nKPX Ucircumflex A -36\nKPX Udieresis A -36\nKPX Udieresis b 3\n" +"KPX Udieresis comma -27\nKPX Udieresis m -4\nKPX Udieresis n -4\nKPX Udieresis p" +" 3\nKPX Udieresis period -25\nKPX Udieresis r -4\nKPX Ugrave A -36\nKPX V A -71\n" +"KPX V AE -78\nKPX V Aacute -71\nKPX V Acircumflex -71\nKPX V Adieresis -71\nKPX " +"V Agrave -71\nKPX V Aring -71\nKPX V Atilde -71\nKPX V C -43\nKPX V G -42\nKPX V" +" O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ogra" +"ve -40\nKPX V Oslash -33\nKPX V Otilde -40\nKPX V S -35\nKPX V T 15\nKPX V a -59" +"\nKPX V ae -55\nKPX V colon -66\nKPX V comma -89\nKPX V e -57\nKPX V g -50\nKPX " +"V guillemotleft -83\nKPX V guilsinglleft -80\nKPX V hyphen -38\nKPX V i -5\nKPX " +"V o -54\nKPX V oslash -50\nKPX V period -89\nKPX V r -42\nKPX V semicolon -66\nK" +"PX V u -41\nKPX V y -20\nKPX W A -50\nKPX W AE -56\nKPX W Aacute -50\nKPX W Acir" +"cumflex -50\nKPX W Adieresis -50\nKPX W Agrave -50\nKPX W Aring -50\nKPX W Atild" +"e -50\nKPX W C -23\nKPX W G -22\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumfle" +"x -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Oslash -13\nKPX W Otilde -20" +"\nKPX W S -24\nKPX W T 19\nKPX W a -38\nKPX W ae -34\nKPX W colon -52\nKPX W com" +"ma -56\nKPX W e -32\nKPX W g -25\nKPX W guillemotleft -58\nKPX W guilsinglleft -" +"54\nKPX W hyphen -13\nKPX W i -1\nKPX W o -29\nKPX W oslash -25\nKPX W period -5" +"6\nKPX W r -28\nKPX W semicolon -53\nKPX W u -28\nKPX W y -6\nKPX X C -48\nKPX X" +" O -45\nKPX X Odieresis -45\nKPX X Q -44\nKPX X a -15\nKPX X e -36\nKPX X hyphen" +" -51\nKPX X o -33\nKPX X u -24\nKPX X y -61\nKPX Y A -96\nKPX Y AE -103\nKPX Y A" +"acute -96\nKPX Y Acircumflex -96\nKPX Y Adieresis -96\nKPX Y Agrave -96\nKPX Y A" +"ring -96\nKPX Y Atilde -96\nKPX Y C -58\nKPX Y G -58\nKPX Y O -56\nKPX Y Oacute " +"-56\nKPX Y Ocircumflex -56\nKPX Y Odieresis -56\nKPX Y Ograve -56\nKPX Y Oslash " +"-54\nKPX Y Otilde -56\nKPX Y S -41\nKPX Y T 23\nKPX Y a -88\nKPX Y ae -84\nKPX Y" +" colon -87\nKPX Y comma -111\nKPX Y e -89\nKPX Y g -83\nKPX Y guillemotleft -123" +"\nKPX Y guilsinglleft -119\nKPX Y hyphen -84\nKPX Y i 3\nKPX Y o -86\nKPX Y osla" +"sh -82\nKPX Y p -54\nKPX Y period -111\nKPX Y semicolon -88\nKPX Y u -63\nKPX Y " +"v -36\nKPX Z v -33\nKPX Z y -38\nKPX a j -4\nKPX a quoteright -23\nKPX a v -21\n" +"KPX a w -13\nKPX a y -26\nKPX aacute v -21\nKPX aacute w -13\nKPX aacute y -26\n" +"KPX adieresis v -21\nKPX adieresis w -13\nKPX adieresis y -26\nKPX ae v -16\nKPX" +" ae w -10\nKPX ae y -20\nKPX agrave v -21\nKPX agrave w -13\nKPX agrave y -26\nK" +"PX aring v -21\nKPX aring w -13\nKPX aring y -26\nKPX b v -11\nKPX b w -3\nKPX b" +" y -15\nKPX c h 1\nKPX c k 7\nKPX comma one -100\nKPX comma quotedblright -41\nK" +"PX comma quoteright -50\nKPX e quoteright -18\nKPX e t -10\nKPX e v -15\nKPX e w" +" -9\nKPX e x -27\nKPX e y -19\nKPX eacute v -15\nKPX eacute w -9\nKPX eacute y -" +"19\nKPX ecircumflex v -15\nKPX ecircumflex w -9\nKPX ecircumflex y -19\nKPX eigh" +"t four 1\nKPX eight one -48\nKPX eight seven -33\nKPX f a -9\nKPX f aacute -9\nK" +"PX f adieresis -9\nKPX f ae -5\nKPX f aring -9\nKPX f e -15\nKPX f eacute -15\nK" +"PX f f 22\nKPX f i -2\nKPX f j -4\nKPX f l -3\nKPX f o -10\nKPX f oacute -10\nKP" +"X f odieresis -10\nKPX f oe -12\nKPX f oslash -9\nKPX f quoteright 0\nKPX f s 0\n" +"KPX f t 24\nKPX five four 1\nKPX five one -76\nKPX five seven -26\nKPX four four" +" 5\nKPX four one -84\nKPX four seven -56\nKPX g a -5\nKPX g adieresis -5\nKPX g " +"ae -1\nKPX g aring -5\nKPX g e 0\nKPX g eacute 0\nKPX g l 0\nKPX g oacute 3\nKPX" +" g odieresis 3\nKPX g r 0\nKPX guillemotright A -50\nKPX guillemotright AE -54\n" +"KPX guillemotright Aacute -50\nKPX guillemotright Adieresis -50\nKPX guillemotri" +"ght Aring -50\nKPX guillemotright T -126\nKPX guillemotright V -93\nKPX guillemo" +"tright W -66\nKPX guillemotright Y -133\nKPX guilsinglright A -44\nKPX guilsingl" +"right AE -48\nKPX guilsinglright Aacute -44\nKPX guilsinglright Adieresis -44\nK" +"PX guilsinglright Aring -44\nKPX guilsinglright T -121\nKPX guilsinglright V -88" +"\nKPX guilsinglright W -60\nKPX guilsinglright Y -128\nKPX h quoteright -15\nKPX" +" h y -18\nKPX hyphen A -7\nKPX hyphen AE -11\nKPX hyphen Aacute -7\nKPX hyphen A" +"dieresis -7\nKPX hyphen Aring -7\nKPX hyphen T -80\nKPX hyphen V -46\nKPX hyphen" +" W -19\nKPX hyphen Y -92\nKPX i T -7\nKPX i j -3\nKPX k a -2\nKPX k aacute -2\nK" +"PX k adieresis -2\nKPX k ae 2\nKPX k aring -2\nKPX k comma 0\nKPX k e -21\nKPX k" +" eacute -21\nKPX k g -16\nKPX k hyphen -41\nKPX k o -19\nKPX k oacute -19\nKPX k" +" odieresis -19\nKPX k period 0\nKPX k s -3\nKPX k u -11\nKPX k udieresis -6\nKPX" +" l v 0\nKPX l y -5\nKPX m p 5\nKPX m v -13\nKPX m w -7\nKPX m y -18\nKPX n T -96" +"\nKPX n p 5\nKPX n quoteright -14\nKPX n v -13\nKPX n w -7\nKPX n y -18\nKPX nin" +"e four -3\nKPX nine one -43\nKPX nine seven -37\nKPX o T -99\nKPX o quoteright -" +"21\nKPX o t -10\nKPX o v -18\nKPX o w -10\nKPX o x -27\nKPX o y -22\nKPX oacute " +"v -18\nKPX oacute w -10\nKPX oacute y -22\nKPX ocircumflex t -10\nKPX odieresis " +"t -10\nKPX odieresis v -18\nKPX odieresis w -10\nKPX odieresis x -27\nKPX odiere" +"sis y -22\nKPX ograve v -18\nKPX ograve w -10\nKPX ograve y -22\nKPX one comma -" +"74\nKPX one eight -65\nKPX one five -67\nKPX one four -81\nKPX one nine -65\nKPX" +" one one -118\nKPX one period -74\nKPX one seven -90\nKPX one six -62\nKPX one t" +"hree -67\nKPX one two -69\nKPX one zero -62\nKPX p t -4\nKPX p y -16\nKPX period" +" one -101\nKPX period quotedblright -41\nKPX period quoteright -51\nKPX q c 8\nK" +"PX q u 4\nKPX quotedblbase A 30\nKPX quotedblbase AE 30\nKPX quotedblbase T -75\n" +"KPX quotedblbase V -69\nKPX quotedblbase W -34\nKPX quotedblbase Y -91\nKPX quot" +"edblleft A -52\nKPX quotedblleft AE -64\nKPX quotedblleft Aacute -52\nKPX quoted" +"blleft Adieresis -52\nKPX quotedblleft Aring -52\nKPX quotedblleft T 9\nKPX quot" +"edblleft V 15\nKPX quotedblleft W 27\nKPX quotedblleft Y 5\nKPX quotedblright A " +"-53\nKPX quotedblright AE -66\nKPX quotedblright Aacute -53\nKPX quotedblright A" +"dieresis -53\nKPX quotedblright Aring -53\nKPX quotedblright T 11\nKPX quotedblr" +"ight V 15\nKPX quotedblright W 26\nKPX quotedblright Y 7\nKPX quoteleft A -67\nK" +"PX quoteleft AE -79\nKPX quoteleft Aacute -67\nKPX quoteleft Adieresis -67\nKPX " +"quoteleft Aring -67\nKPX quoteleft T -5\nKPX quoteleft V 0\nKPX quoteleft W 12\n" +"KPX quoteleft Y -9\nKPX quoteright A -72\nKPX quoteright AE -85\nKPX quoteright " +"Aacute -72\nKPX quoteright Adieresis -72\nKPX quoteright Aring -72\nKPX quoterig" +"ht comma -60\nKPX quoteright d -20\nKPX quoteright o -26\nKPX quoteright period " +"-60\nKPX quoteright r -18\nKPX quoteright s -18\nKPX quoteright t -7\nKPX quoter" +"ight v -2\nKPX quoteright w 2\nKPX quoteright y -6\nKPX r a -5\nKPX r aacute -5\n" +"KPX r acircumflex -5\nKPX r adieresis -5\nKPX r ae -1\nKPX r agrave -5\nKPX r ar" +"ing -5\nKPX r c -6\nKPX r ccedilla -9\nKPX r colon -22\nKPX r comma -69\nKPX r d" +" -1\nKPX r e -11\nKPX r eacute -11\nKPX r ecircumflex -11\nKPX r egrave -11\nKPX" +" r f 26\nKPX r g -4\nKPX r h 0\nKPX r hyphen -47\nKPX r i 1\nKPX r j 0\nKPX r k " +"6\nKPX r l 1\nKPX r m 0\nKPX r n 0\nKPX r o -6\nKPX r oacute -6\nKPX r ocircumfl" +"ex -6\nKPX r odieresis -6\nKPX r oe -8\nKPX r ograve -6\nKPX r oslash -6\nKPX r " +"p 8\nKPX r period -69\nKPX r q -3\nKPX r quoteright 1\nKPX r r 0\nKPX r s 4\nKPX" +" r semicolon -22\nKPX r t 28\nKPX r u 2\nKPX r v 29\nKPX r w 31\nKPX r x 20\nKPX" +" r y 24\nKPX r z 9\nKPX s quoteright -22\nKPX s t -3\nKPX seven colon -77\nKPX s" +"even comma -119\nKPX seven eight -28\nKPX seven five -30\nKPX seven four -93\nKP" +"X seven one -53\nKPX seven period -119\nKPX seven seven -4\nKPX seven six -40\nK" +"PX seven three -23\nKPX seven two -28\nKPX six four 1\nKPX six one -43\nKPX six " +"seven -30\nKPX t S -8\nKPX t a -1\nKPX t aacute -1\nKPX t adieresis -1\nKPX t ae" +" 2\nKPX t aring -1\nKPX t colon -28\nKPX t e -14\nKPX t eacute -14\nKPX t h -3\n" +"KPX t o -12\nKPX t oacute -12\nKPX t odieresis -12\nKPX t quoteright -1\nKPX t s" +"emicolon -28\nKPX three four -2\nKPX three one -49\nKPX three seven -33\nKPX two" +" four -37\nKPX two one -36\nKPX two seven -25\nKPX u quoteright -8\nKPX v a -18\n" +"KPX v aacute -18\nKPX v acircumflex -18\nKPX v adieresis -18\nKPX v ae -14\nKPX " +"v agrave -18\nKPX v aring -18\nKPX v atilde -18\nKPX v c -16\nKPX v colon -23\nK" +"PX v comma -69\nKPX v e -21\nKPX v eacute -21\nKPX v ecircumflex -21\nKPX v egra" +"ve -21\nKPX v g -14\nKPX v hyphen -12\nKPX v l 0\nKPX v o -17\nKPX v oacute -17\n" +"KPX v odieresis -17\nKPX v ograve -17\nKPX v oslash -17\nKPX v period -69\nKPX v" +" s -9\nKPX v semicolon -23\nKPX w a -15\nKPX w aacute -15\nKPX w acircumflex -15" +"\nKPX w adieresis -15\nKPX w ae -11\nKPX w agrave -15\nKPX w aring -15\nKPX w at" +"ilde -15\nKPX w c -7\nKPX w colon -23\nKPX w comma -50\nKPX w e -12\nKPX w eacut" +"e -12\nKPX w ecircumflex -12\nKPX w egrave -12\nKPX w g -6\nKPX w hyphen -1\nKPX" +" w l 0\nKPX w o -9\nKPX w oacute -9\nKPX w odieresis -9\nKPX w ograve -9\nKPX w " +"oslash -6\nKPX w period -50\nKPX w s -5\nKPX w semicolon -23\nKPX x a -17\nKPX x" +" c -23\nKPX x e -28\nKPX x eacute -28\nKPX x o -25\nKPX x q -20\nKPX y a -22\nKP" +"X y aacute -22\nKPX y acircumflex -22\nKPX y adieresis -22\nKPX y ae -18\nKPX y " +"agrave -22\nKPX y aring -22\nKPX y atilde -22\nKPX y c -19\nKPX y colon -27\nKPX" +" y comma -70\nKPX y e -24\nKPX y eacute -24\nKPX y ecircumflex -24\nKPX y egrave" +" -24\nKPX y g -17\nKPX y hyphen -14\nKPX y l -4\nKPX y o -20\nKPX y oacute -20\n" +"KPX y odieresis -20\nKPX y ograve -20\nKPX y oslash -19\nKPX y period -70\nKPX y" +" s -12\nKPX y semicolon -27\nKPX zero four -2\nKPX zero one -46\nKPX zero seven " +"-39\nEndKernPairs\nEndKernData\nEndFontMetrics\n" +; +int n019003l_pfb_len = 36026; +char* n019003l_pfb = +"\x80\x1]\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-Regu 1.05\n%%CreationDate: Wed D" +"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" +"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" +" (GNU General Public License) for license conditions.\n% As a special exception," +" permission is granted to include this font\n% program in a Postscript or PDF fi" +"le that consists of a document that\n% contains text to be displayed or printed " +"using this font, regardless\n% of the conditions or license applying to the docu" +"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" +"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" +" file COPYING (GNU General Public License) for license conditions. As a special " +"exception, permission is granted to include this font program in a Postscript or" +" PDF file that consists of a document that contains text to be displayed or prin" +"ted using this font, regardless of the conditions or license applying to the doc" +"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" +"W)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Regular) reado" +"nly def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Regular) readonly de" +"f\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -151 def\n/" +"UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusSanL-Regu def\n/Pa" +"intType 0 def\n/WMode 0 def\n/FontBBox {-174 -285 1001 953} readonly def\n/FontT" +"ype 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding Sta" +"ndardEncoding def\n/UniqueID 5020902 def\ncurrentdict end\ncurrentfile eexec\r\x80" +"\x2\x35\x84\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2" +"5\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9" +"%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3" +"&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed" +"\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95" +"\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b" +"\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>nc5+\\3v,\x8eI\xd4\x35L\x99:v\xa0L$" +"l\xa4\xdb\xac\x98\xba:\xd1s\"\xce\xf1\xde a\x93\xe6\x94S\xd9\xfc\xc7\xe3\x98\xa7" +"\xc4\x9c;\x93@QcIzL\xa8\xfd\xe2\xea\x36kGy\xe5\xa7\xbd\xf2\xb1\xa0\xa7\xb\xe8\xa3" +"\xb3Z\x90\x66\x63\x85Y\xed\xba\xb5\xc0\xb\x30@\x1f\\\x64\x9b\xd8\xcf\xe0\"\x83\xd8" +"\xf2\x19\x5\xac\xfc\xed\xcc\x43\x81K\xe7\x17#\x80\xe6\n\xd9\x92\xbc:\xcb\xa3\xf3" +"n\x7\xfets\x89gA\xb4\x19h\xe0\xd0x\x1c/R\x1c\x9\xd2\xc8\xf5\x8\x5\x65\xbd\xe4\x81" +"'R>{q\x95\xc2\xb9\x7f\xc3\xb1'\xd3\xf1\x1\x8f\x89\x12\xf8X\xf9\xec\xe9\xe3\x92J<" +"2\xa6\x1e\x11u\x90\x97\xec_l1H\xda\x35G\x87\x82\x83\xado\xa5q\xb2\xad\x41\xf0j\xe8" +"\xe9L\xfc\xdd\xe0.\xa6=\xf9\xcd\x31@\xeb\x88\x92\xf0\x0u:l\x9bN\xbc:\x8f\xd8\xc7" +"\xdd\xb6\x8\xaf\xa7oW\x12\x88\xbb\x4o\xc5O\x84)\xc3\xc5z\x5\x8b\xfcX&\x93\x11wf\\" +"\xbcRsR\xec\xf3\xb8\xfe\xd5\x37N\x8c\xd2p\x8a\xc2\xa2_[\x87\xf\xe6\r\x64+\xa5\xee" +"\x18m)\xdf\x66\x8d\x9f\x7f\x8b\xae\x34\xa0\x64I\xc3m4b\x8b\xc3}\xe7\x8a)\xf2\xe5" +"\xc6y\xad\xf2\xecV\xa6\x9a\x45\x12\xf5\xea\x8d[\n\xf8\x82\x1\x43\x1f\x31\xb9\r+\x1a" +"\x91\x82\x7f\xedN\xe4\xe9y\xac\x99\x10<\xbb\x16:\x93Pa\xc\xe6\xa4\x34\x63\xdd\x66" +"\xcf\xa4\xa1l4\x10\x63\xbb\xc3\x84\x9c\x63\xa7h\xb7hU\xb8\xac\xe8\xb8\xc5\xe9\x88" +"n\xbb\x98\xf7\x85\x8d\xdf\x94\x44J,\xb3\xfb\x4\x96\x8dkM\xf5j\xc4\xc8\x8d\x1er6q" +"\xb1t\xb8L\xdc\xf9\xab\x41\x94\x1b\x63\x96$\xa2\xc2\x5\x33T\x19Q2\xce\xdb\xcb\x91" +"\xe9\x32x\xf8gt7\xf7Q\xdcl\xa2\x1b\xf7\x46\xf6x 3\x18\xf4\xf4\x8b\xf\x41\x34IF\xfc" +"\xdc\xdb;\xe6\x12\x80\xc1@4i]\x81\xc6=\x91\x83UW\xa3\x32}_S\xec\x95\x45\xb5\x9\xf8" +"\xcc\xfe\xd3\xefi\x1a\xff\x90\x8a\x99m\xaf\x16\xf7\x8ag\xe1\xb5@\xe4H\r\xdcK,\xaa" +"\xfe|z\xfa\xd2l\x98\x88m\x83r+\x90\x88\x45\xe4\xeiP\x7f\xfa\x1d\x13\xb7~\xeeW\x11" +"439\x98\x9\xe1>P\x9d*U\xfe\x8cz\x1b\xf1\xfbl\xc6\xd8\xccW?g\x88\xca\x66\xa5^\xeb" +"b\x11\xfc\xfc\xfe\x92U\x8a\xb7:8\xef\xff\xe1\xd6\xd3\xcb\x62n\xe8s\xe\x89\xcc\x42" +"\xa5\xfd\xce\xb3\xdd;L\xd6\xf0\x13\x15\xe0\x83\xa0\x1a\x8f\xf1\x17\x64\xe1\xc4\xc6" +"\x1f\x62\x89;\x17\xe0\x1\xecx\xc5\xf3\x9a+[D*@d\xc4?\x5\xd9\xf9\x1a\xea\xb9\x99\x8d" +"i\xc8~\x9e\xda\xd3\xbdZ\xe4\x96\x86\xc9\x63\xa8\xa0&\xe3\x43\x9a\x96\xd9\x9b\xe4" +"\x5p\xd6\xe0\xfa\x1c\x33\xda\x80\xa9\xa9\xb9\x44\x11\xdbO\xb4\xc9\xae\x85h\x5\x8f" +"\xb2r\x8f\x2\x61\xa3\x1d.\x89j\x9d\x33%\xb0*Q\x98\xce\xa9\x94\xb8=\xe6\xcd\xbdpx" +"\x8d\xa3\xc\xb7\x90\xe0P)x\xf1\xaa\xee\x7;\\:\xb\x93\xd8\x43\x65\xfe\xe2v\xbbT\x96" +"\r??G\xb8HBo*\xe9\xdf\xf9\xba\x4\x31\xe3\x38\x8e\xcd\x15\xf4\xd2\xee\xcb<\xa8\xe1" +"\x8d\xf7\x64\x2\xa8\xd7\xfc\x1\x85\xf9/w[\xfdJr\rb\xff\xed\xb3r`\xe8\xad\x89\x4\x1b" +"\xee.\xf\xc5+\xd9&H\x8a~\xf1Y\xf7l;\xe4\xfdI\x1dx\xd1\xf9\xa5\x36@\xbd\xbaU\xbb\x80" +"I?\xd6l\xa1T\xa6O\xfa\x1e\x87\xca\x93v\xbc\x18\xf9\x63\xebW\xae\x8cjK\xf7W\x9e\xac" +"\x8e\x10\xbfl\x80\x9c\xf5J\xe7w,\x11\x9b\x88\xb0nX\x86Q\xfb{\xd1\x82oFh\x8b\x1d\x87" +"\xbcG{\xc1?\xb3#_Q\"P|p%B\xdc\xc4\xf6-T\x4\x41J\x81`\xc0\x8dSM\xe9\xb4\x18\xe\xe8" +"\xc8\x35\xb0W\xd5\x95;\xa5\xc9\xaav\xb1\xb,^E\xe5\xd0\xcd\x32\xfa\x8flO?\xb2\x8a" +"\xf3-\xfc\xd7\x9b\xe5\xf\xd7\xae\xd0T\xee\xea\xc8\xf4\x90\x7\xcc\xe2\xc1\xb9\x9b" +"\x8f\xf8U5 e\x1aK\xf1\x63\xe4\x8dq\xac\x12\xf4\x18\xae\xc1\n\x9\xf7\xb7\xd4g.\xa0" +"p\x14`\xb5\x61\xc2\xa7<),\xdb\xe3\xa6u\x14\xa0\xe9\xfb?hN\x85\x1f,\xb4\x9a\xbd\xf" +"e6\x84\xf0J\xb4i\xbd\xa3m\x80t%\xda\xef\xbf\x9a\xfd\x80\xb7myG\xef\xf8\x35\xa0\xad" +"\xb7ve\xee\xd2t\x86\xc;\nu\xa3\xc7\x17\xaa\x5\x95\xd5\xefZ\xa5*\xccp\xc9\x1b\x87" +"jH\x7\x8\xb0\xb\xf4\xd8\xb3\xaf\xd0\xa0\x2\x9b\xf\xe5 \xdd\x3\x36S\x9d\x94\xfcV\xdd" +"\xf3\x41y\xd6\xe8\x89\x9a<\x1a\xa5W(\\\x85\x81uJ[U\x1b\x90\xe4\xc1\xc4\x9e\xd4=p" +"R\xf0\xa8$'\xfb\x83\x83\x1bp\x89S]P\xf3\xc7;X\xf4\xbc\x92=\xde\x9f;\x4\x1\x9c\xe0" +"'\xfc\xeeS\x8c\xee\x80\xb2\x80h\x80pC\xa6\x87\xf9\x1\xb1\xd0\x7\x42R$\xa8\x8a=\xf4" +"\xd1T\x17\x66s\x80\x37\x9\xc6P\xc3\x38\xf2^\x97\xbbJ@\x8c\x9c\x88\x30\x8f\x0\xa1" +"S\xbd(\xb7\xd7\x31R5\xcd\x9c\x81$0gHA\xe8\"\x61\xd1\x65\xeb\x46{\x0\xb0\x38s\xb\xea" +"9\x12\xf7\xef\xe2\x43\x16\x36\xe1\x9b\xc9\xce\xa7\x95(y,t\xf9U.Z\xe8\x8\xaaJ(\xdc" +"r=\x86\xf3/\x81[H\x12\x8d\x1b[\\\xf6\x83\x62^g4\x8a(\xcc\x8a\x65oL\xa5\x19\xc9\xe8" +"\xb2N\x10\x36#g\xdb\x7f\x6\xb8`\x95wK\x86\x85$q\x17v\x82\xa9\x1c\xcd\x93\xa6\xe8" +"V8s\x9\xe2\x41\x44\xce:H\xb8\xf0pt,\xd5\xe4N\x80\x10\xf5\xd4\xd8\x99&2x\x11(\x94" +"\x8a!\x8e\xda\x86\x1\xbf\x9fU\xd2\x13q\xe8\xf7\x88\x98\xe7\"\xb9\xae\xb3oc\xa6\xf7" +":\x85\xd5YQ\x3T>\x88)\xb\x8a\xb6\x38\x8d\x30\xfc.#\x9c`\xcc\xfc\xd6l\xef\xfeY\xe" +"!\xa8\xc2\xc6\x64\xab;0\xda\xc1uT\x6\xb7\x93\xaa\x65\x93\x41\xedr\x1e\x39Xh\x11:" +"\x90\xbb\xbfm@\xf3\x94O\x97\xb9\x8a\x94\x15\x9f\x18\x9\x17\xe8\x9c\xd5'\xb9\xc6\xcc" +"\x82\xcby\xb6tn\x85n\xdf\xe \xb2\x12h\xe\xfd\xb\xa3\xa1\x14\xdb\x98@\xfb\xea\x18" +"\xa1\xa6\xd6\xe8mb\xb3\xc3\x0\x19\x1\x85\xf8\x46-\xc\xda\x1dLRP\xd0\xd3\xcd\xa8\xb1" +"2\x98\x36\xcc\x61\x66\xf2!\xf3.\x8a\xfb;\x88\x42*\xa7\x2\xf0\xcf;\x9d\r\x97\xf7\xf1" +"\xffG\x8\x1\xb1\xd1P'\xfa\xb3\x94\xa1\xcbK\xc5(\xffw\xca\x9e\xf3?\xf4\x9b\xa3\x80" +"Y\rh\xc^\x99\xd1\x66(\xc2\x39\xc4\x96\x14^}\xd8O\xa5\xc3\xa7\xf8\x15z\x1e\xc7\x8f" +"\xa6\xee\xa9\xa9\xc2\x80_F\xdd\x32\xa4\x35\x88\x89\xf6\xec\x66\xfa\xbr\x7f\xc6\xae" +"v\xdem,G\xa1y%M\xcd\x90\xe4\xa0\x89\xa5\x16q\xbf\x1f>\xca\xca\x66\xa1\xef\x91\x8" +"\x1]\xc0\x37^\x15\x93\xf4pCQ\xe7z4\x1c\x2\xb8\xf6\xf7\xbe\x63#\xa0P\xf1\xa6\xb8\xb6" +"\xeeW\x1e\xc6MN\x18\x97\xab\xfd\x9b\xe6\xa7\xf0\xac\x61\x1e\xe0\xb7\x17\x9b\xcf\x8d" +"te\xff\xce\x87\xd8j\x9c\xab;\x8f\x86\xc9\xc9h\xec\x8c\x9e\x80\xaa\xd1]\xd2X\x1b\x13" +"Q\xfd_\xa4@\xf5\x81\xec\x92\x93\xdb\xb7\x44[\x93\xa8m9\x85\xc0\xf8\xcc).\xb\xd3)" +"C\xa5:\xbb<:\x5(\xc0\x13\xa3\xbf\x81\x1d*\xfe\x61\x8co\n\x94\x18\x85\xa6\xd4x3\x14" +"p\xd5\x31\xa4\xd0r\x1b\xd4P\xa2\xf2\x61\xca|\x1a\x30\x14\xcd\x89\x8e\x9aR\xe0T^\xf3" +"\x80\x95\x8d\xb0I\xbf\xf\xed\x1c\x92\x82\n\xe8\xe8(\rn\xa1+\xa4\x11\xa0\xe1\xae\xe0" +"\xa5!\xc2\xca\x12\x63\x80@\x10YSs\xabU\xd2\xdb#\xd2;\x84\x9f\x64w\r|\x95m\x8b\x1" +"7\xec&\x9et\xf4\x1b\x61\xff\xdf\xcb\xe\x66\xd1\x19V\xef/\x1d\x0\x8\xda\xbb\x61\xc5" +"\x97\xc6\x7f\x9b\xf\xf1\x82\xa0WE\xd0UqZ\xa9\xd1^\xb6\xa4Y\xa1\xb2+\x9eu\xad\n]." +"#i}\xc5,\xc}\xadQ$H\x90\x1f`D\xd5\xaf\\,.\xb\xaa\x8c\xfa\x9ci\xdf\xf4\xee\xf4\xbb" +"\xd9+*\xe0N;\x7S\xe0\x44\xc7\x84\x7;HvF\xce\xba\x92\xd6\x92\xfd\xb9\x46*-o\xa3\xe" +"|\xed\xf6\x89\x1f\xc8\x7\xdd\xc7\xf0\xa7\x8b\xc5\x41\xc7\xdd\xc6\x8a&\xe1\x1dz\x9e" +"\x1\xc9]\xf\x8e\xd6m\xd9\xff!\xb8M \xbf\x83\x11\x16\xb7\x9d\xa7\x99\x1a\x1e\x99\x9a" +"\xf4tG\x99\xa4o\x92\xaak\xff.5\x15\xee[N\xc9\x97\x19\x63\x9f\xdaw\xaa\xa0\x35`\x8b" +"\xb2\xf5\xdf\x7f\xac{\xf2|\xca\xea}I\xcf\xc0\xa6\xcd\xa9*\xe2\xa4\x9f\xce\xa4:\x89" +"\xd5\x9s\xa6\xab\xbd\xe5\xe9\xe5\xda\xc5\x98\x98\x32}\x89`\x9a\x9\xc3:\xf\xe5\xa1" +"\xe7&\x17\xc8{\x7fZ\xf3\x19;u\xf2\xdaUb\x17\x9\x10K\xdb\xf\xfbw+\xa2V\x15\x37S\x9a" +"\xb\xed\x90\xdb>\\\xcd\x88\x45\xb6\xba\r\xe\xa2\xec\xd7\x10^\x8O\xdf\x9ai\x81\x2" +"\xffG-x\x8f\x18\x14\r@f\xc9\x61\xbf\x46\x8f%\xaa\x88\xd5SU\x80\xe1\xd3\x46X,.q\x1a" +"\x1a\x32Sz\x8\xed\xb3\x62\xc\x87\x1\xe\xa3\xe5\x63o#\xed\xe4O\xacK\x2\x88\x33\x90" +"\x8aS{d}\xb2\x99\x85\xa7\xba\x95q@\x5o9\x10\xbd/\xb1\x10u\xd5k\xe3\x8fp#\x9f\xd5" +"\"\xed\xad\x8a\xe8\x82\xa5\x9f\xbc\x9d\x5g\x9d)\n5jh\xc1\xf9\xcf\x39\xf2\x95\x9c" +"\xa7\xc6\xfa\xb6\x16\xf9\x35\xe\xac\xaa\xaa\xbd\"\xf8Sv\xb3\xdc'\\\x95\xee_\x8a\x46" +"7\xef\x45\xb\xdcy\xd1\xfd[\xa0\xa7\x80;\x7\xd5N`=\x88!\x1c\x31\x85QK_9&\xcdG\xf8" +"\xcd\xcd\x18\xd1\x8ww\xb7\xe2\r\x38\x90\x37\x65SxZ\xdb\xed\x4Q\xc0\x1d\xcc\x92\xb8" +"\x88\xd5\x44\xfd\x87\xa7\xb8\xb4\x9f\x9c\"\xf3\xd9sq4\x19\xbc\x4'\xb9\xd9\xaf\xab" +"iAoQ\x8b\r\xc2Q\x5\xab\x8f\xa5\xa3\x8a" +"*{\xed|\x19\x7\xdd\xf5J;\xa9\xec\xc4v\xb5!h\xf4T\xd2\x98\x1\x12\xae?\xb7\x9b\x6\n" +"\rW\x3\x6\x63$\xcc\xe8\xb4\xd3\x44\x83\x38\x9\xcb\xec\xd4\x1d\xe5\xae\xc7\x45_}\xf" +"\xd0\xda\x63\xbaj\xc3\xdd\xf9\xaf\xa8\xd2\xd9\xa3\nu\xc\xba>\xa0\xcd\xce\x97s\xca" +"\xedkX\xb5q\xc9\x30\xf7m\xd4\\\x1f\x88\xbe\xc8'\\\x13\x9c\x39\xb\xc2@\xda\x6\x1c" +"\xbd#\x8[\xe7_\xe2\xfc@P(\xf9\x63q\xdf\xcU\xc9\x42\xac\xa5u\xdb\x86\xd6\x33)\xa0v\xaf\x0\x93V\xde" +"\xb6\xf2\n_TSZ\xb1\xe1\xfds\xaf\xb4\xd9\x35\xb0\x9f\x36\xa2Y=\xfe]\xd9\n\xac|\xec" +"\x8e\xed\xaa\xf2\xa3\xfb\x63\xb\x42\x8d(\xa7\n>s2\x8f\xe5\xb9:\x87|\xf5\x41\xbc\xb0" +"\xd3\xb4p\xa6\x88\x64\x83\xc5\x8f/'\xb7\x6\"\xc6\x1d\xedK7\xcc\x1f$\xc7\xfc\xcd\x88" +"\xd6\x91\xaf\xcbQD\xd5\x41\x2\x93\x87g`R\x8e'\x93\x3mc\xf3`aM1UmI\x9b\xf4\x9f\x8c" +"\xc2\x30\xe5\xc1\xd2\xee\x65g\xb1\x11\x9\xe0<\xaf\x96/\xa6\x90\xd6\x37\xc2\x13\xc7" +"\x95\xb4\xdbH\xc0k\xb9(@\xa2\xa0\xa0\xd6&*{$\xea\xb5\xaf\x9e\x96\xac\xf6x\xd6\xf5" +"\xeaoJ\x87)\xec|;N\xc9\xbb\x6\x37U:5\xa7.\xc7Kg\x88#*C!\xe\x9f\xd1\xb3\x8a\x30\xde" +"\xef^\x1a\x8a\xbd\xd4\x37\x11\xf1\xe5\xb7\xda\rH\xa6\xc4\x41V\x8ez\x87\xe9U\xcb\x14" +"\xbe\xf7\xcbn\x95\xfd\x9e\xd4O\x9b\xdf\xafi\xb4\xec\xf9&YS\xe2\"\xc1\xab\x7f\xd8" +"SG\xb7\x9a\x61U\x8b\xf7\x9c;\x10O\xed\xad\xa1\xe8\x93\xbej\x1)\x1fX\x11\xa8\x9f?" +"\x1dY?2\x8^\xc2\xa8\x43}\xf5\xf0*\x16\xa5n\x81\x1ek\xca\xf1\xcf\x41\x92*\x8c\xf8" +"F\x10\x81\xe6~]\xcfND\xb\xbe\x8f\x4\n\x96\xbd\x14\xa3t(\xf`Ge&\xb2o\xca'\xccm\x88" +"\xcc=\xa1\xaa\x92`\xce\xf5K\xdc\x18\xdd\xa1\xa6PX\xa7\xef\x9\xdf\xba\xe\xf6S\x8\xe7" +"\x5\xdb:\xfa\xe7\x12{\x1\x90y\xee\x85\xa8\xca\xba\xb1\xd3\x82\xce\xc2r\xb&\xe8\n" +"~\x2\x7\xbdH\xfe\x80g\x16\xc\x82YwR\xae\xde\x88\x95\x3\x95\x80\xce\xa9\xa3\xb\xd8" +"X\x17P\xd8\xa0\xa6\x12\xa8.\xf3\xca\x87\x62\x0\xd5\xfbK\xecO\xe2;\x94j\x85[_\xf4" +"\xec@\xef\x1\xe1H,\xc1\xb4,\x7f\xab'\xb8" +"\x6\x43\xca\x89\x8b\xaa,\xfa\xd8g`O8}\x86n0H\x84y%\xf2\x9e\xab\xb4\xe8\x61\x85\xb2" +"\x1\x8ex5\"P\n\xf2~\xc'\x93\xf2\x38\xd8\xcc\xad^\xbbi\xdb\x66j\x1bl\xfe\xd9\xbe\x86" +"\x19\x1d\xf3@\xea\xf1\xd6\r\xa4v\x9b\x34\xd1!w\x83\xc;[D\r%\xa9i>\xc3Ju\x98[\xca" +"(\x80\x85Q\xfe\xb3\xc6\x3\xfc*\x13\x7f\xc9\xc4\xb0\xc0\xb8\xa6\x18\x1d\xe0g\x9\x15" +"\xc2i4>\xc7\x94\xa2\x84\x8a\x42\xb4v\x95/\xd2\xf0QZb\xdb \xd0\x65\xca`\xd0\x35\xe6" +"\xacp\xe1\xb1\xb5\xc\x99qX'qX\xab\xben\x9fU4G\x17\x10\xb6\xc\x89Mx\xb5\xeb\x1c\xea" +"\xb4\xe6;{\xb4\xae\x81\xd8\x86\xc9M\xf8\x7f\x39\x63\x42\xba=\x13\xd2\xf6\x97GL\xbe" +"Q_\xde\xeb\xaa\x19\x39<\xe6io\xe4\xcf.ts\xd0$\xf\x30\x8e !\xfd\x8d|#\xa1\xa9\x39" +"\x1c\xad=K\xact^\\\"\xf0\xb6\x19\xc\x1f\xcM\xa4\xa6\x9d\xbcU\xa4\xd4\xa7\x11/\xb4" +"\xa4\x32n\r\x8dNd\x8e\x30\xb8g\xf5sC\xbd\xa8\x9\x62\x34_\xd4\xef\xf8TX\xc3.H5\xe6" +"\x12\x9b\xb6U\xce\x15\x81\x1\x61\xb3p\xd8\x8f\x94\xfeho\x10\xb1\x1aW\x1e\x46\x1f" +"\x8c_\x82\xc1&\x9cO+1\x16\x9\xff\xf4\xde\r\x61\xac\xc9(?x\xd9\x82\xda\xff\xca\x89" +"\x9e\xdd\x64\x93@\xe\xa4\x0\xe1\xe5\xa2ta\xdb\xf9\x1c\xd4l:8\xfdt\xcan\xbeT[\xec" +"\x2\xc1\x45\xecz\xce\x1b\x8a\x4K\xd7\xdd\xa3\xb3\x37\xc0\xe0\xf4~\xba(nOSp\x6\x63" +"\xa8R)<\x93\xc0\xa0\xb\xd1\x9bU3\xbb\xd3^\xafu\xf5\xcaW\xfe\x80~f&\xc1%\x30\x3W\xe3" +"^\x18\x5\x17K\xac\xca\xbc{\\3)\xfc\xbf\xd8\x94\xd1\xda\xa7\xa8\x13\xe3\xdaU\xb0\x9" +"\xeb\x4\xb7\xdb\x9fh\xc%\xeeQ\x85\xe6<\x14\xb5\xaf\x66[\x13\xadk\x15\x11\x84\xdb" +"_\xa0\xb2~\x8e^}\x95\xc5\x16\xbd\xea\xe3-\xd4g/{>\x0&\xde\xe4\xed\x90\xaf\x97 \n" +"0\x3^8\x8a\xfej\x12K\xbb\x18\xa4|}s\xbc\xaa\xfc~\xa1 :hk8\xbc\xb6\x1b\x3\xe6\xde" +"\x12\x91W\x92\xc4X\xc4'Kl\xf\x87\x89L4a{6\xb8\xea\xbf-p;\xe3\x82O\xdek5\xf1\x8\xfe" +"\x1c\x1e\x1i)\xd6\xcc\x83\x8\"\x1Q\xcd\xd7l1\xb2 >\xd9\xbf\x9f\x14\xdas\x95\x43G" +"\x83^\xa4^\x16\xda.\x1f\xdc\xd6\x3\xcev\xf7$\x16\x81\xd3\xea\xa0\xc8;!\x85\xb\x63" +"\xf7\xe9\xe9\xb5\x15\xe6\x39`\x87\xe2\x93\x8c,9p\x10\xa1\xc0\xe5\xbb@j\xc7\xf9\xfe" +"ht\\0\xb\xa2\xfb\x19\xa6\x3\x1f\x1g\xb0\xe5\xb6o\x9c\xb3\x15\x46\xf4G\xf\x8d\xc9" +"\xa0\x36\x38\xe2\xe4u\xc0\x97rR+\xde\xa3\xc\x9a\x31\x41\x9d\xe0h\xd3\x1e\xdd\x32" +"\xdd\xfe\x93\xc8l?mS\x1M14\xb2y7\xc3@\xa4zs\xc0\xc2\x35NFK\xd5\x8b\xff\x62\x9c\xfe" +"\x81\xd0\x98\xbe\x34\xf1\xff\x36\xb7\xde\x1c\x16h[\x3\xb\xbf\x8d\x97\x1b\xe9,\x14" +"\x2=j[\xd1\xcd\xbf-\x84\xfa\xc1g\x5Q\xcb^\xff\xe>\xc7\xcc\xfdw\x92\x1cy\xf5u\xfb" +"\xe4\xd2.\x0_!\xbf#\xb5\xa4~&\xdc\x9\xe8\xf7U\xc1\x9d\xbc\x80\xfd\xe4\xc8\x1aI \xad" +"\xdeh\xcc\xae\x80\xb0\xff\xf8\xf6\xfb\x83\xdf=\xf6\x1\x85\xc2?A\x99\x38\x8cI7-\xda" +"\xef\xf\x8b\xe\xff\x13p\xc7\x1a\xa1\x8e\xc6\x95\x8bz\x8d\x87\xaa\x41\xdd\xdc\xb9" +"\xb9Q\xdf@\x4\xa6\xed\xc2\x86Z\x7f\x42[\xb0\x1c\xbf\x93\xdd\xcfv\x5.&\\\x6\xce\xdd" +"\x98\x85\x62\xc3\xc4U\xbd\xe3\x31\xa7\x7\xde\x15\x19t\xed;\xcb:\x9c\x7f\x3>\x87\xdf" +"\xab=\xca\xaf\x9\xcc\xe2\xe3\xe1\xfc\xcb%\x92\xc\xb8\xd9\xd2\x87^\x9fl\x7\x98\xf5" +"\xc4\x81\xe2\xdf}\x8s\xa4\xee\x4P\xe4\xc4\x46\xab\x5>\x2\x64\x8c\x2\xbc_v\xdf\x83" +"D\xe0\x5\x2\xd2\xbe\xe6\x41\xabS\xa4\xf5\x3\xc0@\\E\x5\xb0 \x7\x97\x84\x17\xac\xfb" +"\x86\xdc\xa0\xd8\xf7`\xe8\x8e\x9f\x35\xb7\xa8\x3N\xdfy\xdd\xfd\xc6\xb7\xc2\xea\r" +"\xb3IH\xe\x8e\xfbw\xf8\x65\xa5Z\xb\xd0\x9d:F\xd8\xfc\xcd\x2,\xf\xcd\\\xed\xa5\xec" +"\xea\x12\xe\xe0>\xab\xfa\xeb)\x6\x99\x85\xf2\x62^\xa0\xb5\xb6+\r0\xae\x17\xa1\xf0" +"\xd3\xf7\xc4s/\xdd\x42'n]\x9\x64k\xb6\x2{^\x3^\xbcH/\xed\xe\x63\xf9\xb\x8d\xf6\xa0" +"\x9|\xa8\x97\x82sw\xec\xfc\x18\xac\xe8!a\xd3\x14\xb3,\x1\xa6L\x1b[\xddW\x92\x1e\xb" +"\x1c\xf8n\xd8?=9\xbb\x92\x8c\xb6\xa4\xb5-\x88\xcf\x16\xa5\x9b\x3zD\x7f\x8c\xc8\x8b" +"\xd9\x8a\xf4\xdd\x30\x62\xcd\x98\xa8p\xc1=\xbc\xe5 N\xed\x82Wx\xa2\x1b\x7\x31\x10" +"\x8e\xab(\xd1$\xa8\x89o\x91\xe7\xde\xb2\xf3\xa5\xa8y\xba\xc5S\xf3\xe1\x98(\xbd`Q" +"\xc8\x39\xb0\x94X}R+L\x1\xfc\x9axp\xdf\x64\xb0n\x1a\xa5P\xd6'\xea\xef\xa5-\x9a\x99" +"\xa4}\x10p\x8a\xc3-\xd4s\x9f>\xdc _\xaez\xd9\xf4Y\xc5@\x82/\xday%\xd2\xad\x1a\xae" +"\"]Q%\xa3\xce\xf2\xb6I9>S\x1\x39\xbe\x17\xdb\x8a<\xb @\x18\xa7\rqY\xc\x4\xd5\xf8" +"\x97\xd3s\x1e\xc2\xe0\n\xc1\xf0\xf5\xf4X\xf5\xf\x1e\r\x87\x10'\x83W\xd8\x65\x9b\xcc" +"\x81\n\xa0\x10\xaf&\xac|\xeb\x42\xbf\x31\x94i\x11\xae\xd6|\x12\x9b\xbc\x0/\xe5\x37" +"\x90\x99g\x19+\xdc\x1b\xb2\x8a\xe2\xbf\x8e\x9f&}Q\xfU%Pq\xf5N\x82\xbe\xa4\xfb\xe2" +"u\x7f)\xe5\xb9\x45\x44\xee;\x11\xf2iN/n\xe9\x0\x6\x64\x98!0\x7f\xfe\x1x\xf6\xe6\xca" +"4\xb9>\xc9\xef\x1U;\x8a\x4\xc9_\x12\xa5\xbd-\xbd^A|p\x8f-\x12\x8e\x2\x86\x17\xdc\xcc\xc3`\x8e" +"\x84i\x8d\xce\x1a\xe9\xf0y.\xd1\xc5T\xcd\xde\x8f\xaa\x8b\x86|\xf4\x9a\xd3q2\xbf+" +"\x11wY)\xb1$bdSO\xce\xc4\x34\x91\r\x8a\xea\xa2\x87{X\xcf\x1f\xf9>\x9d\x92\xd8\x15" +"\x1fl\xc3\x2)\x87\xf1\xd6\x1e\x8d\xc9\xd0\x91\xf6z\x9b\x83\x44'\x9e(&\"\xfalv\xf0" +"D\xd1X]o\xcd\x93\xdaV\xd7\x32\x90]\x9\xb1\xa8tx\x9a\xe6\xc7\xd9\x18\x80\x14\xc5\xb1" +"\x84\xb4.\xa5\x14n\x17\xc1\x91\x9\x82\x81\x3/%\xd2S\x82\xe0z\x3:\x9a\x3\x3\xff\x19" +"(:\x82\xe3\xb8oo%M*\xf6\xf7tg\xc2\"\xc0\xc2\x36\xad\x5\x85\x61\xb4\xe0\xc\x44\x8f" +"&;$\xf5\xbaU?V\x97\xefo\x2\x9e\x65\rH\r!\x1>\xd9\x9\xfa\xb7\xbc\x13U4\xb7\x39\xbb" +"U\xd8N\x2\xf4\xd6%\xa8\x9Hd\x99\x88\x11\xce!$\x97\x1a\xa1\x1b)c\x1f ,7\xb4_GR+\xd9" +":\xd9\x6\xc7\xac\x13\x9b~\x94\x41\x9cu+\x92\xe\xd9I\xe7\x0\x14\x9\x8b.\xbb\xd9|\xa8" +"4\x99\xd5\xb6P\xde\xa3\xa1\xa3\xf7\x1c\x17x\xce\x30\xce\x36\xc7\xab\xa3i\xf9|\x9" +"\xbb\x87\xef\x99\xdb\xe3l,i\x89M.l[\xf5\xc1\xfa\xf8\xd9N\xac\xe7\xc4\x1z\xdd\xc3" +"\xd3\xbc\x7f\x1e^\xcf\x66$\xba\xa6\x32\x82UC\xd0\xf6\xda\xd2\x80$F\x15\xb3\xe3\xe5" +"fV\x9c\"\xed\xf3\xc9\xb6\xe9[\xa1HP\xe2U\xfc\xek\xcf;\x98\x12\x8f\xce\"\x1a\xb5\x9b" +"\xbc\xef\xf\xff=(\xb3\xe5qV&\xd7\xaf`\xd9/\xe6\x9e\xba\xa3\xd2\x8b=T\xb4\xe8\xa0" +"Jr\xb0n\xc9\x37XU{\xb0\xf6\x7\xa1\xa8\x88K\x95\x94\x46\x83\xda\x89\xb7;d\x92\x16" +"L2/\"\xc4\xbb\xca\xe2\xf1L\x0\xea\xe1 f\\\xea\x6={\x15\x88\x9a\xea:W\xc9\xae\xb3" +"d8\xb9M\x2\xf5\x61\x94\xcb\xb7\xae\x97Hz}\x1f(\xce\x39\x1b\xef\xcd@v \xe2\xe1_\xa4" +"\x91\x8b\x8b\x96\xd0[Dl\x95\x46\x8a;\x82Z\xb8\x41\xda\xc4g\x94\xa3\xca\x9c\xf5\xce" +"s?\xd0\x8er\x14\xfc\xc5;\xe2|\xee\xe5i\xef\xd0\x96\xd1\x63\xfe\xb3\x81\x65\xbf\x13" +"\xed\xb~E\x5 ;\xa1\x1e\xe0\xb1t\x92\xa0)\xf7\xcf\xae\xc6\x11\x94\xca}\xb4\xc6\x90" +"\xe3[\xf3*CR\x9a\x89H\x1\xef\x34\x96O\x3\xa2t]`k\xbet-\xcd\x35\xe8\x1f*\xcf\xf1g" +"\x9f\x17\xd2\xf5i\x7\xc\x62\xef\\\xb3}\xc5_m\x1e\xd1\xe3\x81\x87.\xfd(\xad\x5\xef" +"\xd4\xf?\xe5T\xcf\xc\x9a\xa1\xe9\x35\xa6\x80p\xfc\xf5\x8a\x92\xe5\xeb#\xee\njh\xf2" +"\xc0`\xaa\xe7\x8d\x1c\xee\xc8}\x11\xe6\x17K\xfa\xc1\x8d\xec\xc5pSE;S\xe2N\xfc\x9c" +"&\xc8q\xd9Y*\xfe\x1d\x64\x88\xfb\x66<\x99@)\x9f\x92\x1d\x81\xe\x1\xb5\xc7o\x16h-" +"\x9f\x2~\xe6\x30\x10\xe6\xa4~\x9b\x89\x1c(\x93\x95\xd9\xd2\x83u\xe6\x9f\x94'\x81" +".1\xda\x8d\xd0\xdf\xdf\x35\x81;\xd9\x7\xd1\"\xf3\x2\xff\xb6\\\x16\x18\xc7\xbb\x46" +"\xf5\x65\xac\xe8>\x1X$\xa4KA9\xe8\x9b\xfe\xa5\xea\x41:?\xd8\xa4'\xcd\xb7\x15\x66" +"\xc\xc2\xdd\xacU\x9dN\xf2Zn%\x8e']`\xbc\x89\xe9^\xbd\x86\xb3\xb9\xf0\xa9\x1f\x62" +".V1j\xf9\\p\x1f\x92\xd6\x15J\x8a\x9bI\x91\x42\x92m\xbe\xc4(\xb7\x6\xa1\x17\x86Y4" +"]6\xddV\xee\xf7|\xe8\xceo\x4\xdd\xbb\x3,\xf0\xdd\xa9\x7f\xd7\x33\x81HI'\x89\x39j" +"D\x89\xd0\x46\xc4\xd4\xa7Y\xebH\x1c\x5\xba\xeb\xc8\xf(\xb6\x86\xbL;7C\xaa\x8a\xb5" +"\x95}\x0\xa6\x1f\xc6\xcb\xb1H\x1\xba!\xe3\x62\x1c\xe9`\xb8\xd9i\xb2h\x8\xda\x97j" +"]\x12\x9f\xe9\x82\xd4\xb2\x9d\xf4\xc2\x37\x8d\xf<\xfc\xaa\x17\x63\xe6\x43\x9d@\xd3" +"E\x98m\x96\xb7\xa5\"\xf8\x66UK\"<\x1c\xc6\xa8\x66\xaf\xb\xfd\xc5\x1e\xd5\xbbKj\xcd" +".\xd8[\xb0\xab\xe1`\xdc\xdd\x39\x66t\x1\x13\xc2_b\xb3\xbd\xfbY\xf5\xff\x1e\xdai\x17" +"\xfa\x9e\x2j^\xa7\xb1\x43u@F\x80\xf4@\xd9\x93\x85|pn\x11\x42Y\xf9\x94.;\x7f\x33&" +"-\x95\xe3@\xa0\x32\x9b\xc\x87\xeb\xfap\x97\x65\xb6SC\xf8x\xf2-\xa7\xb0\xa9\x39\xc3" +"\xa8+\xfd\xb4NU\x8a\x80\x18\x9?\xa3\xe8\xba\x66\xa3/xFG\xb0<\xa1X\x12\x94\xa0Y|\xc" +"\xeb \xe6\xcfRe\x80\xddK\xa7\xc4{hg\xac\x61,J{\xa3\x9f^\xcd\x9a\x12\xbbT_\x8d\x85" +"5\x96\\\x35\xc2\x38\x1eYC\xf4\r>9\x83)\xef\xdbR|\xe7\x62z?,\xc9/\x86\xbe\xdd\xd1" +"\xbc\x9e 1\xe\x7f\x9a\x81\x7f^\xb7$\x16\x8a\xda\xe8\xa1qk\xc8\xd9\n\xdb\xfasSs\xcc" +"\xf3\xc5\x1\xc3\xd5\x99\x0\x66sQ\xd9\xe7\xd3\xeb\xb4G\xfd\xca\xc6_\xd5\xeaW*\xb8" +"\x89\x43\x38\x0\x36\xec`S\x13\x95\xd3\xf4\x34\x38wq\x96mo\xe\xd7\xf6\xedl\xb3~T&" +"\xdb\xb7\x1e\xeb\x10\x9\x0W\xc0\x13\"-\xcc\xedJA\x96\xb5\xdds\x8e\x61 \xb4\x95\x15" +"\x1em`\xec\xed\x35\x9b\x93;\x9f\x46\xf8\xe7(\xa7\x98\xa1\xfe@\x1a\x9e\x37\x83:\xfd" +"\xb4\xbb\xaa\xb0|O\xf3\xf4\xae\x19\x1a\xdf\xf9\xf5\xdb\xfw\xd4\x61\x36\xcb\x46\xba" +"\xa9\x42\xd6\xfb\x17\xdc\xae\x0\x7f\x61\x36\xe6\xce]\x7}\xaa\xe4~k\x8f\xb0\xe3\xa7" +"n\xff\x9a\x96>\x9d\x1c\xe2\x0\xc5J`\xbd\x31O1\xda\xc2\x15\x10\xab\x1d\xd5\x81#\x94" +"\xb3\x15\x86\x2M?\x85\xed\x15\x99\xfd)\xb9\xe2_f\xe3\xe\xbc\x30\xc6\xbd\xf1j\x0\x34" +"\xbd\xf4l\xfb\xc3\x80\xc:\xb9\xe1\x65Z\xbb\x19\xa5\x84\x9c\xb4\x88\x8a\x35\x30p\xe6" +"\xbe\xe6\x1\xef\x9f\x95\xe9\xd8\xc6;\xd7L\xe9PE1\xa4\xc8\x14\x82xY\x90\x15p\xf6\x0" +"\xfa\xf4\xb4\x93\xc2\xe5\xd4\xb3,$\xdc\x19\x1ah/\xbd\x83\xf2\xd3\xdb\xf6\x37\x15" +"Oq\x99\xba\xe1\xf4\x36\xe1\xe7\xe8\x1c\xde\xc1\xdb\xa0\xb6\xb4\xf5\x93\x33y\xe6\x31" +"\xfa*\x9d\x8dO/\xef\xbb\xd3\x97\x15\xf3\x88wr$\xfa\x90\x90\x19/\x17-\x5\xba\x3\x9a" +"GGJ`s\x88\x8e\xee\xbd\xa7\xc8+\x19\xd1\x1az\xadN\xe2j%\x82\x9f+\xfeWJ\x12\xc1\xc0" +"t\xd5\xac\x15\x1bn3\x1d\x99\xee\xea\xc4\x30\x92\x45\x93\x97J<\xca\\\xcb\x89\xba<" +"s\xf2\x19\x9f\x43\x43\xe6\xdd\x62\xba\xa5\xde\xf2\x96\xce\x31w)~\xfa\xe9j\xfcv\xfd" +"\xe5K\xe1\x95k\xf9\xa8\xed\xbd\xa1\xa3\x97\xb8\xbfu\x7fJ\xb6\xe2\xb\x19\xa0\x3\x9d" +"\xef\x9f\xd7\r\x90\x16G\x9f\xe9\xd9\x84\x42-B\x82\x0r\xb6\xa9\nx\xd7\xfb\x8e\x83" +"\xcd\xc4\xad\xa7\x9f|\x85\x3_j\xc8>I%\x95\x32]-\xef\x98Q\xea\xd2\xd9\xa4\xc9\xc6" +"\xb4n\xb9\xbf\x9d \x81\x36V\xfb\xd8\xf2\x92\x8a\xb2u|3\x13gB_\x83)o\x85H?\xe3\x43" +"\xd5\xbe]b\xbbnw)\xc3\x80\xc8\x1d\xe5\x89[\xf5\x19\xfc\x93u31\xe3\x0\xc2x\x14SI\xca" +"\x83\xa6\x88\x37\x6\x88\x8c\x8b\x15Gh;\xb6w?%\xb8\x1e\x95\xe1\xb0\x42\x9a\xf\x9d" +"\xc8W\xb0\x8\x35\xd6\xd2p\xd5\x45m\xd5 C^\x19\xbaY\xad\x8a\xef\xc9T\xb2P\\\x13u\x1a" +"`p&\xd2\xb3\x18v \xfa\xb9\xa5\x9d.F[\xa8\xfc\xdc\x85\x46\x35\x94\xba\xe9\xa6\x89" +"\x9d\xfd\x15\xf6$'S\x1aP\x95\xf9\xf6\xf3o\xbb\xc\xfax\xa1\x19\x8c!\xe0\x44\xed\xb5" +"\xad\x85,\xbd\x82\xc7\x85-z\xdf\xbd\x10\x9bQK\x7~I\xce\x66\x45\x87\xd7HRc\xa2\xc9" +"T\xcd\xd8\x88\x90\xa6\x14\x42\xcf\xe2\xfb{\xc3\x65\x5Q&\x7\xe0\x85\x9a!\xaf\xad\xee" +"\xdb\xab\x15\x5l.\xae\x8c\xfb\n\xa1\xc0\x9f\xeb\x38\x84x\x84Z\x8f\x85\x15{\xb\xe0" +"Z\xa3:?\x84\xce\xee\xc3\x97\xf6)\xd2Y\xad\xe5\xc4\xf\xf0\xc0\xfa\x10\x96\x31+7l\xf7" +"iSZs\xf0\xa3:\x12\x1f\xd8\x98\x30Ln\xae\xf0\x43\xa5\x8a\xf3\xdb\x31\x91\xdf\xd0\xc1" +"\x5\xcboEr\xc5\xea\xbe\xf8U\xcd\x86\x9?\xc6\xac\x7f\x36p\xe6\xd9\xa4\xad\x9c\xb2" +"\x86\xc8\xb6\xc0u\xde\n\xdd\xcf\xc4\xdd\x17\x35%s\xc9\x1w\xc8KW&\xca\xa6[\xf5\xd2" +"\xc3Y\xc9Z\xe3K\xa8\x9b\x96\xd9\xdc\xe2\xb6\xf2\x2\x66\xf1\x10\x11\xc`\xac\xd2\x91" +"\xb5\x80>N2\xd2O^[\xff\x0\xff\x62\xa4U\xb7Q\xe5\x41\x81\x8\xa6\xab\x7f\x6^\xd7\xee" +"\x94\x5\xcb)\xe4\xc\xfb\xcfj\x1f\x5\x8d\xcd\xd3-P\x19m\xb5'\xfa\x62\xf2G\xbc\x65" +"\xd8\x99q\xbbU\x10\xad\x93\x34 \xd2\x64G\x97M]\xef\xd3xq\x91\x99\xf2!\xf2\x16\x5" +"9\xa2'\xa2;]d3u2\xedSO\xa5|P\x1e\xea\xb8*\xef\x37O\xb9\xbf\xab\x43\xb2\xe\xcf\xda" +"\xa1\x0\xber\x83\x39\xda: \xfb\xfb\xefG$\xc1\x8/\x9c\x7f\xea\xdd\x36\x16T\xad \xd7" +"\xcf\xb9VOf\x18\x3\xe8\xb9\x93\x61p\x95\xe8\x13\x16\xe0\xc3\r\x8d\xb\x39p\x86\x8b" +"\xea\x64\x12&!\xc2\xeene@\xd5\xa2`,\x82l\x97\x63\x16\x9dk\xa9(<&\x9d.;\xc9\xc\xc6" +"M\xb3z>\x1b\x1f\xee\x1c\x11\x9aX\xc9\x1e\x9e\x8b\x99L\xb6\xce\x8d\x1a\x64\xcd\xd9" +"\x1a\x97\x18\x63\x11\x33\x66\xed\x45\xfc\xc8\xef\x9bs+\x10L\xf2\x4\xb5\xdc\xd2\x32" +"\xeb\xe8\x2\x1ezI\xb6\xf\x41\xbf\x15\x63~\x8d\xa8\xcd\x1c\xbc\x87\xe8<\xf7!A8]\x80" +"\xd5\xb2\x1a\xd4\x8d\xe9\xa3\xf5\xb5\xdc\xae\xb2\xca\xb8\xcbw\x82\xfb\x6\x9a\xa6" +"\x9cs\x14\x63\x16\xe7\x97\x98\x8az\xbf=}-\xcc\x9f\x88\xd8\x85m\xa7h\x9f\xfa\x32\xf2" +"\xc8\xe3\x83\xd6\xe6\xaa\xd7\x19\xa8 \xf2&\xda\x64\x95\xf7\x82_\xaf+\xaa`\xee\xa7" +"h4\xc0h\xczi\x96<\x4x\xd7+b\x19{\xf5[\\\x87\xb\xe7\x9f^\x8$\xaf\xb0o\xee\x63\xb7" +"d8\x17\xf0\xcey\x8d\xc5\x46\xa5\x7\x91\xb8\x9f\xbc\xa8\xce\xc9\x3\xe9\xab\xcbj\xdf" +"\xdbQ\x8a\xb1\x86\x41\x1fI\x9b\x9\xcd\x8f\x12\x66\xa3\xf2OR\xf2\xcc\xeby\x84\xd2" +"\xacL\xcf\x96\x9:T\xda\xc7M\x80\x13\xa5\x4W\xc1\x6\xe9U\x82\xec#G\xa9\xd9\xd5\x34" +"gAdV:+\x85\x38\xfd\x37\xad\xf9\x36*\x12\xcd\x64\xb0}\xe1\x32\x2\x32\x9b\x0#X\x96" +"\xc0\xaa\x65\xdd\xc2R\x83\xd8\xe\xe\xeaJ^\xf1\xba\x94W\x1.S\xe3\xbd\x11\x44U\xac" +"\xfd\x98\x82\x83\x8\x83\x1e\xdf\x89y\xc2\xc7r\x91\xac$\x18\x6g\x95_pQ\xf0\x16\xb7" +"\xb2t\xaf\xf0\x1fzB\x8e\xe\xc8\x36,\xa4_\x5\xa9\xc4\x98wG[\xd1Q\xe\x15\xbdS\xa4\x19" +"1\xb1\x5\x86\xab\xeb\x98\x7fq\xf3'\xc7\xc7\\\xae\x19\xd2\x92\xbc\x1c\x0\xadX?li\xaa" +"\xc1\x89\x1f\xbe\xbb\x1e\xa9\xc8\x8\x9cK\xc9\xe3\x9fV4\xd5\xc5\xb8-x\xc9\x8c\xfd" +"\xf3\x8f\x61\x1c\xd6PC\xac\xd4\xc6 R\xcdG\x18\x1cR+\xf2\xfd\xa6\xb3 \xf7\x45\xe1" +"\xd1\x89}3O\xaa~\xb7\x16\x30'\x1d:!\x94*g\x9aJ\xe0\xb0\x1e\xfc\xec}\xde\xc7\x89\x19" +"]uf\n)\xec\xc9\x45\x82\x17\xbaQ!\xcc\x66\x84'\xca\x1\xeeg\x98-`,sQ\xac\xf9\x94\xa9" +"w\xeb\x9a\x8c\x85\xb0\x7\xd1\x13]\x87\x32\x33\xd3q\xb2+\x80\x1eJ\xf8\x93\x19\xf6" +"\xb0\xca\x89%\x89\xa6N\xc0\x2\x17\xea\xa5\x1fz\xc3:\x81\x94\x7f\xae\xb4\x4\xa7\x8b" +"\xd7\x65\xa8\xfc\x80i\xd4\xd1\xf6\r_\xe9+:\xf=\xe3\x8b\xb\xad\xe7kFh\x80|#\x8b\x11" +"\x16\xf2\x34\xa8\xde\x90\x1a(-\x95\xe3@\xa0\x32\x9b\xc\x4\xf4\xf7\xe9\x97\xe2/<\x11" +"O\xdc[\xb7 P\xcfP\x99" +"\x8\x1b\x3\x8b\xb1\x18\x11\x34\xcb\x88Gn2*\xbS\x6v\xb7Z\x9a\x81\x17\x97ZU\xaa\x95" +"\x94\x1f\x1b\x86\"\xa7\xa5\xd1\x9a-^\xc3\x42!\x90\x8f\xc6U\x0\xc9Z\xf2.\xd4m\xc\xbe" +"\xf0\xdc\xab{XZaR\xabQs1&p\x9f\xf0\x83\xb8k\xd3y\x1e\x18)\xafx\xde\x86\xa4\xe\xd5" +"\xdb.I;\xd3\x18\xb3z\xb9\x83\xd6\x87\xad\xc5\xee\xc6\xfc\xddKN\xa0=\xe7,;\xe2\x88" +"!\x90\x61oy=\xb3\x13\xe0\x81\x31\x1c<\xbc\xd1/KXv\xf2$VD\xa1v\x8\xf7w\x1a\xd5\xba" +"(\x1f,\xadQH\xcfT\xc8\xe0\xa9\x82\xc4W\xce\xbd'S\xed\xfc\xc3+!-\xd9\x94R+\x19'\xd0" +"\x8\\\\x~\xde\xc8\xde}\xed\x88\x66" +"\xc4`\xe3\xb1\x8a\x45\xd6\xf5\x16\x7\x8crW\xf7\xf3\xe4\xf5J;!\x86\xcaw?>\xdf\xae" +"\xcb \xd4\xb6\xeam\xa0Q\x1\xea\x98\xca\xfct\x91\x1\x9d\xab\x30\x8d\r\x61" +"\xf9\xe9\x9a\xb2Y\xd5y\xe4\x18k\x95\x1d\xf7J\x82 Rp\x1bH\xb8\x1f]\xf1\xa4u\x1a\x41" +"\xea\xbbz\x16\x44XdI7Z\xaa`\x87p^\xa9n\xa7\x98\xb8\xaa\x66\xb4\x93\xf5\xa9\xcb]\x15" +"\xa8\xf\xb6RF\xd9>6\xa7'g\x93\xd1\xa9O\n\x8c\x99\x85\x14\x9d\x4\xc^\x94\xc3 \x7f" +"h\x9e\xba\xc3Q\xd1K\"\x11\x80h\x83\x82?C\xd2\r\x1fL\"\x9c\x62\xe6\x8c\xa7\xcc*\xf1" +"$\xf2\xb7\xfd\xd2\x7f\x19\xe6\x35x\x11t\xa4\x16\x3I\xf8}Q\xacv\xaaT\x88%\xaeuv\xf9" +"\x3U\xdb\xde\xe\x80\xa6\x9c\xe9\x32k\xff\x63\xa7^\xe3\x35\x39u]\xa7\xaaQ\xcck!\x11" +"x\x9 \x2\x9e\x8c\x9e\xca\xbe\x45\x8e\x13\xae\xfb\xad\xce\x66\x36\x87lJ\xf1\xfc\xb5" +"\x1d\xfb\xf3?\x12.\xf9\xd7\xed\xe3\xa6\xf2,\xa7\xed\xb6\x65\xef\xee/X\x97\r\xf\x81" +"V\xbb*\x10\x44\xb6\x16\xc6\xa5\x39\x65\x30\x37\x98\xf6O\xf\xe4+n\xfa\x32\xee\x0\xb6" +"Fy\xe1_\xfe\xa9O\x1bV\xfc\xb6\x1e\x39\r\x7\xfc\xafl\xe0\xb9\xdeY\xb1W5=\xad\x9a\xe4" +"\x3`i\xb8++\x80\xfd\x4n\x86\xe8\xe6<\x83\xba\x87Z1\xda\xde\x2\x98\xfa\x44X.ypx\xf9" +"d\x9c\xf3\x86\x85\xadz\xfc\x36\x1d\xae/\xfe]\xad\x9d\xa0\xb4Y\xa2\xb4\xe6\x1a\xe3" +"d\x9e\xce\x9fyH\xcdy|\x93\xe5\xc3\xc3\xac\x32\x8c\"}\xf1\x98\xaa\xb9=\xf3\xf\xb2" +"\xc3\xc2H\xa2\xee\xf7Vg\x92\x98=v-\xf5\x97\xe1)\n\xb8J\xfa\x62Z\x99\xe9\xdb\x89\xc4" +"1Q\x9d\xfb/\xd0S\xb3W\x8d:lRu\x8b\xbap\x8a\xaa,-s\xed\xc1\xe2\xc2\x1\x81mC\xa0k\x82" +"\n:\xe3qwP\xcb]x\x9b\rL\xe1%\xe1\x43\xa3\x85\xd8N\x10\x32\xf6\xa2 p\xe\xa7\x8\x41" +"h4\x9f\xea$W\x83\x1a\x92\xa9#\xc7\x9dTi\xbbV\x91\x46\xd8\xb6\n\xf1g\xd5\xdf+\x84" +"\xde\xde\x37\x65%\n\xdal\xd0HQ\x8c\x6\xbe\xc3\x81\x94\xd7q;\xe1\x5K\xae\x98\x61\xf5" +"EB w\xa2#G\x8f\xce\x39\x13\x64\xee\x8e\x9c\x8@\x3\xe9\x8f\x63\x87\xd0\xc8\x64\xea" +"\x81V\x8[\x18\xb2\x44\x12\xac\xc8g\xec\xa2\x8\x32\xc2\xc0\xbd\xb2\xb6tB\xbdlw\xf2" +"\xed\xe3\x8fW\xe*O\xb0\x15!*J\x16\x9e\x42x\xfd`\x11\xd0\x0\x39\x97\xae\x80\xab\xf3" +"%\xa1W\xad\xc6X\xd4\"\xe3\x6\x83\xa7Z\x8c\xac\xbd^\x8a\x35\x7f\x1a:\x92\xf\xf1\x63" +"\xe2\x8a\xbb\xaa\xec\xac\xffum9G\x0\xa3\xfb\xbap\xb8\xf8+\xe3\xd3\x5\x0\x9dJPL.\xb8" +"\xd9\xe6\xf7\xeco\x9b\x1b\x31\xf1v\xeL\xdc\xf1\xcb\xd9L\x92W\xe1\xfbM\xa3o\xc3\\" +"dc\xa1T\x98\xa0\x12\x1dU\x8f\xa5\x39\x4\xa1\x93G\x16\xd3r\xfd\xc2)nq\xd5\x66\x65" +"\xf1\x90\xe7\xc0\xbd\xb7\\<\x98\xb1\xbb\x88`?\xa1_\x9\x65\x1\x10-O\xcf\xd4\xb6\x98" +":\xed\x12\xa6`,\xc2\x43\xa6Q\x8e\x66\xfcX\xa2 \x89:\xb4\xa3\xd4S\xb7\x81\xa7\xb9" +"\xd5\xc8\xe\xab\x66(\xfc\x1e\xdf\xa5\x36r\xf8\xb5\x14\xb\x82\x4\xb2)\xc8\x44\x9y" +"R\xaf\x18\xd3G\x89\x37\xc2\x31\r\xf2\xd0\xe6\xe8\xbcMZAU\x18\x9f_fI\x16\x13\x87N" +"<}\xf0`\xcP\x1b\xcd\x32}\xbc\xbf\x66[\x0\x89gv|N@\xf1\xef\xa4\xbf\xc6\xee&\xb2V\x94" +"b\x8a\xc4\x8e\xb4\xfe\xa0\x85\xb8\xf6\xe9\x7f\x1b\x97\xb\xdd\xa2&)\xd8*\xa5\x33\x46" +"\xa5\xa4\xf9\x14})\xe2\xa6\xb5\x96).\xb1#\xba\x88\xf4\xbcn\x8b\xe8\xb\x33\xb2 \xf" +".\x8f\xd5\xa7\x10\xe3\x61)\xc6\x33\xd1\xab\x42\xbc\xcb\xa1(\xfb\xe4\xae\xa4R\xaa" +"\xb5\x1a\x81\x87\xff\xf6\xc1\xfc#\xbb\x1a\xb5/o\x9a{\x88\xc2\xc1S\xf5Ne%\n\xd9\xf" +"\xf1\xbd\xe5\xc1\x42\x8d\x62\xa3-\x7f\x99y\xbe$\xa6\xa4\x44\xd0\xf7\x31%g\xc9\xfc" +"\xdb\xc6\xe5\x97\x43\xfb \x1b\xefV\x14p\xe5\x81v\xe8!\x1c\xecsL\xd0\xd2\xab*aom\xdb" +"\xaa\x11r\xa0NDZ(\xf5\xcc\x7f\xb3\xa5\xa8>\xf4:\xf4\xe2\x9aI\xd2\xce\x41\xfb\xdf" +"\xd6T\xed?\x85\x63{\x17\x12\xef\x12\x44\xbc\xa7\xaf\xfe\x83v~\x8a]\x9e\xb3\x31x\xa7" +"\xcc\xc6\xf5\x33WF\x1e\xaaO-\xda*M{\xed\x8a\xa1\xd0\x64\xaf\x91>\x1f\x8d\x6M\xf1" +"/7\x95\xa0\x89\xc5>I\xed\x8\x30\xc0\x1e\xe0\x1e\xf5\xea\x9a\x35\x95\x34\x1\xd6%\xeb" +"\xb2\xe1\xb2-\xcd\x30\x1b\x45\x1cY\xfc\xe2\xbcX\xd0\x9f\xef\x36%\x37U\xdc\x95\xba" +"!\xf6>!2m\xfc*EQW\xb1Q\x15\xa7\x95~\r\xd4\xb1\xf3gxg\xd4^X\x14\xb4\x93N\xc7\xe`V" +";\xc1\xab\xb7h\xa2\x16\x63\x30%\xd7\xfkF\xaas\x1d\xee\xdb\xe7\x88\x43\x30\xef\xb2" +"\xbb\x66Y\xa1u=41\x93\x9f\xfe\x93P\xe\x91{\x9a\x4L\xfc\x44\x8d\x85Y`\xc6\xe0\xe1" +"\xd8\xaf\xd0i[H\x15\x38N\xfe )\xd7\xcbK\x4\xf1\x98W\xbf\x36v\xd6;\xb6\x34\xa5\xad" +"\x86\xb6oLp\x85z\xc5\\w\xc7{\xd2s\xc4\x7f\xf9\xb0\xf0oG\xa1UVq\x2\xc6]0Qr\x19\x1d" +"\xcb\xc9\xa4U*\xf1y\x6\x93pA\xdc\xe5\xd2[\xe8\xf7\xb8\x9e\x34\x63m*\x96\x16\xc9\x0" +"F\xc3x\x8\x5\x8f\x86\x9a\xe9\xc3\x99\xb8\x12h\xf3\xa0\xb7\xf1RG\x17\x6\x35\x96\xdd" +"\xf8\x16]%5\xe1\xfe\xef\x13\x1\xdf)\x18\xb6\x8cXZ\x1e\x9b\x1d\xc7\x7<\x80\x87*\x9PQ\x8eL\xe7|\x8\x90\xa1\xc7\xc8" +"\xa0\xe4\xfe\xb3\x13\x89\x91\xe\xa6\xbc`M}\xd5\xc6\x10\xab%}\xb7\x64}\xfb\x88\xc7" +"\x8\xe1\x1b\"\x63\xbb_\x7f\xb3\xe9\xb\xd8\x8e\xa0 B1\xe9$\xf9\x35\xa7\x39\xf0\xf9" +"\xce\x5n\xc9m\xc1\xa2#Q\xa4\xdfNr\xb9\xa4o\xcb\x41\xbaz_\xca%\xdaN\xe3\x17\xa0\xa1" +"\xb5)\xcf\x94\x61\x14q\\\xc3\xbb\xe5\x61\nv\xa7\xb7\xafLA\xdd\x31WL\xa3\xe5\xab\xc3" +"U\xc6\xbcU\xec\x16sp\xdcn\xd5\x31\nT\xef\xbb\xe3\x36\x11\xde\xc1\xad$\xf4\x91#N\x8e" +"w\xa7\xca\xac\xb6\x8b\xc3\x64\"Y8y\xfc\xdc\xd1\xeb\x9d\xf7Gz\x18\xf\xf3QV\xa4u\x7" +"\x8a\xd3\xf5]7\x80\x98\xcf\xc0\xea\x10\xcb\xb4\x83/\xea\x38W\x1%\xb?\xc5\xf2\xb4" +"\xc6w.j\xb\xd0\xb\x81HR\xbb\xae\xc1\x82r\xc\xe4\xa8W\xd9\x1d\xf1\x64r\xd7\xab\x94" +"f\xdfI\xc0#\xe7\x33p[\x97\xd3\xefw\x15\xa2\x11\x45Rz^\xd3\xff\xb7\x33\xde\xe9\x11" +"\x1a\xb5i\n\xae\xc2\x35\xe2IYF\xbd\xe6\x45\x85\xa5]\xdf\x31~nC\x8R\x90Y.\xb6Z;l\xbe" +"KI\x89\xf0\xee\x44\xaf\x66\xad(\xe7\xd9\x9e$\xe5\x1c#\x8a\x97\xeaMdE7\n?\x1e\n\xe7" +"\x1bsq0\xc3@%\xaa\xa0y\x1b\x11@\xe4\x81?\xae\x17Z\x84^ZA\xd7\x9c\x6\xcdl\x81\xca" +"\x88S\x17 m6hD\xafP\xf9.\xc6O\xbe\x64\xb7,\xe1\xed\xb\x8a\x34%ox\xa7\xd4\x94r\xbc" +"Hg\x1a\x35\xff.\x1f\xb5\x1f\xbf\x1dR\x96%&T\xcb\xef\x34\x43\x4~Z\"\xc3\x42\x83\x16" +"\xf7\xfe^#\x4\xf4\x96\x8f\x93\xbb\x13\x84\x64\xfbU\xa9\xfI\xa6\xd4\x17\x42\xbb*\x2" +"\xd8\xc5O\x0\xc9\x37.\x9e\x95\xac]}#\xed\xf9\nl\xb7G3/\xe1\xe3\xfc\x91\x86LZ@\x95" +"\x86\xbb\x85,y\xc2\xde\r\xbc\x1f\x83k\x17\xb7\xfc|\xdb\x15\xac\x81\x81_\xecX\xfe" +"\xb6\xc6\xdd\xb6\x35\x3\xcf+\xe5\x46\r\xf2\x95\xc9\xcd\x39\xd9}\xf7\x8a\x45\xf3\x1b" +"\xdaM;\xcc\xc2\xe0,\xd7\xd6\x90\xd2s!\xdc\x5T`\x88T~A\x8\xb7\x1c\x84\xeam\xccU\xf5" +"\xd5\x12!7\xbd\x1bn\xe5\x30?Yy\x9d\x8a\xe0\x8f\xba<\xdb\x93\xc7\xf7\xbf\xf9)\xba" +"\x97\x12\x80\x9f\x85\x86^N\x81v\x98\xa4\x62\xc1\xe\xc8\xf9\xf7\xaf<\xda\xdc\xe2\xfe" +"m\x87U\x9d\xc0\xeb\x9eL\x86\xd2\x92\xb1T\n\x8e\x39\x8c\x37\x15\xa1\x63\x42\xd8\xf8" +"<\x8\x93G\x8b\xf7\xbe\x85\x94p$\x8a\xeT\x94g\x92_\x7f\x82\x45\x1fq\x1c\x7J\x9c\x5" +"\xa1|\xbb\x38\xe7{\r\xe7\xb4n\xb9{\x9d\xca..A\xafKY\xbey_p\"@m\xf0\xe3\xc3Up\x9d" +"\x9b\x89\x8a\xc6\xbf\xef\xe0\xc8\x62JS\x8e\xef\xbag\x88\xa8Z \xb3w\xd5-\x90\xe3\xe1" +"\xce\x94\xb2\xf1mp\xe4\x16\x89\xa9\xcc\x36;Y\x4|\x12\x8b\x83\xae\xbb\x9c\x64\xf " +"''\x8bK<\xd2%Q\xee\x8c'#\xde+n\xef\x14\xcaz7^3\xbd\"\xc8\x9f\xafl\x8\x30\xee\x37" +"\x1c\x30\x16\xf1\x9d\xbc\x35\xe4\xbc\x80\\\x8e\x80\x44q\xeb\xb8\x95L:\x90\xeex\xc5" +"\\\x97\\^t\xa9\x9b?@nE\xff^\xe4\xfb\xe\xb9\x13\x81\x13pk\xf4\xf\x13\xc1\x98Yy\x12" +"x\xfe-\xa4\xb5\xbe\\\xffW\xc7\xa4\x65^\xecp\x83/1\xd1\xcb\xcfr\xa7W\xee\x4\x6\x15" +"Lt\x14M\x88\x90\xc4j\xf6S\xd8\x7\x64O\xa8\xedi\xe3\xb4\x81\xb6\xd7\xc9\x45\xc0\xce" +"'\x86\x97\x1d\xd0\xed\xce\xe6\xce\x7fjj\x89\x41l\xcc\xc5\x42\x89K\xfa_\xab\x8f{\x9e" +"m\xbdi_\x9a\x1a\x94O\x17\xea\xb9\\\x82\x44Q\x82\x15\xb&\x93\xb6\x7\xa6~\n\xea\xb7" +"\x81\x7f\x18\"~\xb\xfd\x2\xce\x8d\xf3J\xdb\x2Z\xce\xe6\xaf\xc4\xe2\x82\xd2\xbaR\xe" +"\xed\x98~\xc8\xe7\x0\xb1\xeb,\xce-p\xa8*`b\xb5\x9d\xf6\xb3\xe2|\x9a\xfe\x46\xef\x1f" +"X\xa1\xf9M\xfc\xf5w\xc4n\xcaQD:\xed\x42'\xc2\x97\x2\xbf\x81\x4\x80\x11lB\xee`\xca" +"\xf8`3QA\xb8\x39\xf3\x35\xf8\x86\xdb\x61l\x8f\xbe\x4w\xc2\xa6\xb9%\xb9\xae\xe8\xfb" +"Y\xfb\xf0[\x8e\xa3\xe4\xfe\xb3\x13\x89\x91\xe\xa6\x93\xbfySl\xfe\xc3\x30L\x89{\x8a" +"P\x8e\xd3\x83\\|\x4h\xd1\x30KZ\x92\xe8\x9a+\x81rv\xab\xa0 a\x9\xc8\x89u\xb\xe5\xbd" +"eC\xbe\nt\xbd\x41\x35?\xac\x87\xb0\xcd\x86\xa9\xe3L\xc5\xec\x9c\xd4u\xab\x6z\x3\xea" +"[\xb5>1\x7f\x17M{\x18\xfa\xd3`\xcd\xca\xc5\xaf)KbNzR\xb6\x38\xdb\x1c\xb1#\xcc\xff" +"iW\xa5\xba)9U\x9f\x96\x9e\x9c\x38\xdb\xa8\xfc>\x81\xd5\x66\x3\xee\xd0,$\xc7}\xbf" +"\xcf\x3\x8aY\x16\xc3Q\x88\x1c\x62~\x7fg\xdf\x63\xb1X,\xe2\x1\xe7\xc1\xcb\x8c\x35" +"\xeb\x8b\xaa\nO\x8\xe1-q\xe9\x64\x95@\xc8\xd3\xc4\x41\xc6\x99\xdb\xad\x87z\xd5\xa5" +"\xe6\xd5K3\xa5\xe7>\xdbG\xa4\x96\x1cQ\x0\xb6\x6\xa2\x31\x9c\xe1\xf3\xfd#\xb0h\xac" +"\x13\xe8\xde^D\xd2>\xa6\x46\xe6i2*\x81\xd4_H\xcd@\x9a\xe9\xf4\x8f\x7f\xda\xf4\xb9" +"\x98Nj\x9fIl\x9fJ\x4\xa6\xa2\x63\x9e\xb0\xb1\x97:\xc9S\xe1\xf7\xab\x95\xdd\xf3p7" +"\xd4$\\\x0\x11\x9b\x9d\r\xe9>\x17[\xe8\xcd\xce\xbe\x33\x82\xe\xa5\xd7x\xe1\x0\r\xbc" +"`\xab\xb1^\x8b]l4\xdf\xb9\xe7\xf\x63\xc5\xd6:\xee\xe5I\xcb\xc8v\x1e&!\xcfJ\xa7.<" +"u\xd3+\xdf\xc\x1d\x1d\xb\xc8\x1a\x8e(\x9c\xbc\xfe\xd7\x2}\x94\"\x8d\xd8\xe1\xb5\xaf" +"f`\x98\xf7J/X\xa0\x33'\x7f`K\x87\x10\\\x0\x38\x10\xf1\xf8\xfb\xaf\xcb\xac\x13<`%" +"\xd1.\x13\xd9\xde]j\xaf\x9e\xfcO\x8b\x89\x6\xc6\xa7\xe3\xd7\x17}\xfb\xe2\x83\x11" +"\x7}\xa0\x30\x93\x8ehE\xd6\xaa\xb4:\x1d\x1c|%\x0-\xd1\x32\xb4\x12\xfaV\xf0\x8cm\xdf" +"\xbfL\xc6\xe0o\x7fN\xc9\x38\x65\xbf\x90\x90\xc7R\xb1\xfc\x34\x10\xdb\xc4\xc8\xc7" +"\xe9\x1e\x13\xf6\xa3\xe7#\x9\xa6\"Y\xf2\x1d\xe4\xdc\x84HFBp\xd9\x0\x9f\xaf\xff\x15" +"e\xde\x45[\xaa\xea\xe1\xa2\x11\xe9\xc1w\x1f\xdf\x46\xd3\x13\xb7\xcb\x4\n\xd1\x61" +"~\x1e\xc0`wB=x\x86\xb2P\x9c\x8a\xa0\xf9']\x1f\x36\x7\xdd\x9e\xd1x\x13\xf9\xd2\xe" +"\xa2\xdd!\x93^bc\"\\MKu\xd9\x7\x19\xf1\x14\xa6\xb7\xb7\xe3\xe6\xb4.\xa4\xdb\x97\xe7" +"\x12*\xd2\xbb+\xf6\xf2\x98\x0={\xe5pg\xe\x9f\xce\xa4|@!\xa7\x8bQ\x94\x18:M\x1c\xa1" +"V\xa3\xbav\x98\x42\x82r\x2\xfa\xab\x9b\xad\xa3\xa1\xc7\x64&\xcb\x9d\xe3\xe1\xbd\x16" +"\x15\x83\x80%u\x2t}oL\xa1\xba\xe3\x9\x17\x14:\xd3\xf9\xc8\x1a\xfc\x9e\x99+\xb9\xb2" +"G//\xb1\xda\xb\xd6?\xf4\xb8\xa2]\x1b_2\xcc\x9e\xc7\xa4\xaf\xbbQm\xab\xb8%\xafhS\x7f" +"i\xd2$\xa3\x5\xecj\x1f\x2\xdd\x9b\xa9V\xae\xb2\xe2u\x9d\x4\xaa\xf0\xa3 z\xc0\xb7" +"\x9du~kou\x9f\xdb\x45.\xfa\x0\x85\xe3Z\\\xed\x65\x12\xe4)?,\xfb\xc6\xa3\x82\xa2\xb6" +"\x96+\xf1\xe3\xc1\x9f\x13\x16\x8f\x37\xc1\x90h\xbz\xae\xc1\xde\x17\xe\xda'\x94\xd4" +"\xa9\xa3\x30\xc3\xe2IC9\x7\xc8?yNz\x8\xe1\xf3\xf0\x38\r\xfe\xf3\xb4HL\xe6t89\xed" +"r\xee\xe4-\xc4\xc9\xc\xa1}\xfew\xef\x90\x3\xaa\xa5\x8a\xe0\xc1X\x94\xc\xc8l>\x98\xb1\xa1\x7m&\xdb\x35\x13V\x95\xae" +"\x98\x83\xf6\xfe\x4\xd9\xf6\xbcZK\xb9\x35&y\x16\x18\xbf\xd2\xd2q\xe9\xe6)\x11\xf" +"\xe\xea\xb1\x84\r\xbe\"\xb4\xea\xca\xbf\x1b\xf5\x81\x12i\xdc@\x8e\x12\x16\x8pb\x19" +"Pv?\x9c\xf7o?\xb1-1\x15\x84\xf4p\xc5\x1d\xb5\xd7s6]\xf2n\x91#\xb\x19\xa8\xb1&\x89" +"\x85\x33o\x8c;\xfd,\xaa\x33_\xb4\xc1\xf2@\x1b\x8e\x19\xee\x30kO\xf4\xaf{\x8e\x4\x99" +"\x8c\xedgK\xaa\x9a\xcd\xe7\x9e@\xc5\xd8\xee\x9d\xd5tV\xca\x8d\xd6\x9f\x8d\xcdQ\xbb" +">\xd0\xce+A\xa5\xb4\xd8+fGo\xb9\x1e|$h\xfd\xa2\xd2\xad\xcf+X@(M\xe5\x97\xfdj8\x7" +"d\x89\xb6\x1f\x3\x6l\xde\x17\xed$\xc9\xccq\xb4\x1dJR#~\x1b\xbc:\r8PDhf\x1f\x39\x1b" +"\xa4\x45\xb2\xe\xbf\x3\xb0\xad\xea\x11\xafPL\xa9\xf8o\x9\xe9\x43\xde|{\xe9\x1c\x4" +"\xd7F\x81r+wE\xad\x16\x1a\xf3\x9e\xf2@z\x18\xc5\xfa\x93\x1a\xca\xe3\xc0" +"\x89\xe8\x1b\xdc\x35\x94\x17\xa8\x16\xd3\x18\xdc\x35\x42\x9cz\xab,\x83\x8f\x31)\x6" +"\xca\xa0\x5n[\x12pjuru\xee\x10\xb3H\xe8\xda\xb8\xfa}\x93ZO\xd7mz&\xf6\x18\x1e\xb8" +"U\x9e\xcf\xa8\xab\x64(\x8b\xeb\xfbo\xe9\xa0vn'\x98yA\xde\xc9W\x9aK\n\xe7K4\xdd \x91" +"\xdd\xf7\xc5\xf8\x19\xe4\x30\xb4\xc4+#\xd1\x33\x1e\x93_\x94\xf2\xa5\x8aJ\x11\x8d" +"D\xce\xb6\xe1\xfev\xa5WFw\xe4\xe9[\x1f\x84\x92+\n8\xf0~AU:\xa7\x46\xfc\xa8[\x9\x1e" +"\x8d\xc\xaf\xac\x81\xa3\xbdH\xbf\xe2\x5G\x8f\xb0\xaa\x8e\xb4\x82q#\xef\xc2\x8b\xd7" +"\xe4\xbe\xe5\x90\x97U\x0$@\xd2]\xb3\x3+\xd1\nG\xc7\xbb\xc0\x32\xdb\xc8`\xf4m\xdb" +"_Ot\xbf\x37\x87\xc6\xc5\x8d-\x93\xbe\xda\xbc|GS+Kk3\xc0)5\xb\x42\x46\x8\x43\x93J" +"\xad\x10\x84\xa9`\x92G~\xa4\x9e\xd8\xca\xa1.\x8\xa4!\xea\x86\xa8.a\x18\xd5UpOe\xc8" +"\xe7\xf9\x9d\"\x80\xbcU.\xcd\x4\xe2(\xc4\x8c\xb1\xbev\x85\x63n\xbb\x30 \x94\x93\xc3" +"e\x1a\xe9U\xa4\xdb\xfdz\x6O\xe6<\x5\x3\x9\x38\xc1\x8aK\xe5X\xd0\xbd,\x85\xcb\xd6" +"l\x96l@\x88;gL/9\xb9:\xaa\xc7\xe7y\xd6\xb5\x0\x80;m$\xe7$\xf2\x61J\x80+/l\xaf:\xb" +"\xc0\xcc\x1d<\xcf\x82<\xa5\xe9\x64\xc8\xf7'\xf0(\xb\x64r\x99\x99\xbex\xb4\xc2\xe6" +"~\x0X\xfb\x9b\xe3\xf4\xd7\x8e\xbbY\x13\xaaS\x18\x99\xd8\x62\xb\x97\x65\x87w\x16'" +"\"\x1b\xae\x17\n\xd5\xa2\x33\x80m\x9c\xd1\x36\xef\x65\x64\x84\x64!R\xea\x3{nq8\x83" +"{vN\\\x85\xd8\xc2}\xc1;\x8e\x42\xe4Pd\xb6\x9Uy8\rC+x\r\x10\xd8\xb9\x1c@\xa4\x35\xa1" +"\x5R\x9b\x0M`\x84\xe9L\xc9\xf4\xa6\xd9\xebk\xcf\xf\xf7@e\x89\xd4\xf6\xb5\x33@\x8f" +"=s2Yk {JdY:=y\xd8ZL\x9e\xc2\x10\xe5\x8\xbf\x1b\x9b\x61\xd9\xdd\xfe\xde\x31\xae\xc9" +"w\xf1\xa7\x19o\x19\xb2\xc6^?]\x80\x32\xfc\xe0\xb5\xc\xb7\r\xf1\xd8\xd5\x31\x16\x8a" +"\xc0\xc6\xd5uw\x8b\x0\x8ck\xa6\x16\xab\x12\xb6\xfa\xc2\x9b+5\x1\x87\x8d\xba\x0\xe1" +"\xdb\x9bK\xef\xa0\x8a\xc0\x91\xf4\x93\x7ov(\xde\xe0\xe6\xe7\x9f\x86\xdf\xba\x81H" +"F\x9e\x14\xbf\xd5\x84\x9<\xce)@\xf3\x37\x90\xdd|\r\x19=\x8a\xdd\xd2\xad\x66ub%PN" +"v\xc4\x30\x1b\x2\xcd[\x10\x89\x91_\xf3NBn\x86]\xc8\xba\x1e\x64\x7fJ\x8b\x8b\x4\x2" +"\x8f\xcc\x1\xcc\xfc\x8b\x19j\xeb\xf4n>!.*E<6s\x83;\x9bP\x16\xee\xc4\xcf\xf0\x89>" +"\x8d\x65\xa7\xcHN\xec\x8f\xef&na(9\xb8\xfaU1]\x6\x17u\xc5\xbe\x4\x87\x8a\xa5=\x6" +"X\xc1\x11\xd0\xcfV<\xe4_wI\xb4\x7f\x16\xa7\x36g\xe4\xfb+\x19\xdc\x9b\x35\xc2\x36" +"R\xc1\x33\x39\xe2\xb5\x41\x45\x5\x7\x9f|\x8c\xc-\x14\xc3\x88\xf2\xbd\x36\xf1\x7f" +"3\xe8m\x81pfZ\xbb\x36S\xa4Y6\r\x9kOn\x6\x94\xb7\xd8?y\xc1K\x2\xf0$\xebS\xb=J\xc1" +"\xb0W\xb7m\xb0\xc0\x61\xcb'\x96%\xfeNI\x9f \xc2\xce\xcd\x5\xc5\xb9\x4\xf4&\xe\xe1" +"Sg\xd7!):\x96\x9c\xe1\xea\xc3+\xba\xe0\x9c\xec\xa9\xd9\x93\x39\x8c\xb3\x41'\r\xb5" +"\xea\r\xfa\xd4nn\x1cj\xb4\x1d\xa9%\r\x62\xf5\xa9H\x9dv\xb8\xdc\xa7&\x9a\xdc\xdeQ" +"y\x7\xe3\xf7\xd4T/\xac\xf0\x1f\xccw\xa8\xa5\x12?\x7\xe7\xa1\xfa\xb7\xf1$\xdc@\xb" +"\xcc\"k\x85\x81\x1c\xd3\xa6\x30p\xee\xe2\x1e\xa7\xa4lBw\xb9\x61\x64O%\xb4z#\x87X" +"\xc3\xc8\xbd\xd1\x39\xd5\xc0\xf2\xa9\xc6\xb2\xcb\xda\x1e\x9bvH\x8a'\"$\xdb\xffY\xa2" +"h9\x14\n Tg&ZOYT*\xb1H\x88\xe7\x1a\xc7X\xd6)\x13\xff+\xb1}/'\xf1-\xba\x82:9\xf9%" +"(\x9c^\x9d\x1\xbdO4\x4\x19w\xdaI%\xcfI\xf7Q\x83>\x83\x30\xaaL\x98$\xcc\xac\xac%\xff" +"\xe6\xea\xef\x9a\x98\x92\x9e\xa4n\x1e\xff\xb1,p\xff\xed\x18\x6\xb0\xf6\x8c\xcb\x14" +"\x16\x62#Rio\xe4np;*\xe6\xe3\xaf\xdb\xe2\xf1xP\x3Oy\xaf\x30\x8f\xda\x1f\xcf\xbc\xd7" +"[\xf2\xc1j$\xe1\xf4\x5\x9bvL\xab\xe2\x82\x1d\xf0\xd3\x7f\xac\x84\x9\xff\x31h\xd4" +"S\x4\x44\x95\xd2k\x10\xa9\x9e!\xcy)\xe2/z\xa9\xa4\x17\x32\xf5\x1\xee\x1c\x9f\xec" +"j\xc0\x5o\xe6(\xc2\xde\r\x43\xf5$\x8c\xd7\xca\x86VV\xddsb)O\x95Q>T\xbb\x9b\xfdO\x19" +"\xd7\xf\xca\x64G\x90\xa9\x1e\x44\xee\xef\xad\xfc\xc3q\x7f\xba\x1d\x12G5\xf\xe9\x87" +"\x8c\x86\x0\xe8}~+f\xb9T\xa2\n\xbd\xad\xa4\xe5\x1b\x1d`\xc5\xbdX^\x9aH}\x8aR\x6\xa5" +"\xfe\xfb\xb5\x13\xd1P\xdcu\xde\xb\xd0\x9c.\xdc\xc2\x92\x11\xea\xf6\xa5L\xe\x9\xd5" +"\xa4j\xb7#S\xc4\x9a\xc8\x1a\x65\x1f\xf7\x1\xe4\xd5\xf3\xbc\x35K\xe0=\xfa\x8d'z\x3" +">\\.Q\xf2\xfo\xc2\x19K\x11\x92,\xc2-@,\x98\xe0\xbe\xe3\x4\xe3\x0\xde\xc3\xa0iC\x14" +"B\x19\x64\x2\xce\x82\xb9\xa3\x93\x18\x8d\xfc\x15\x89QW\xfb\xe6*\xaf\xb6\xceg\xf\x4" +"\xf1=\x16\xfb\x82\xbc\xb6\xbf\x1a\xb8&4\xac\x16\x89N\x94\x5\xea,\xb2\xc5 aD\xc2\xaf" +"\x1b\xb&\xd4R+\xf5\x89\x8c\xecK\xe1_\xb0\xd9\x83\xf4\x64\x8e\x35\x87|\xcf~\xcc\xa0" +"\x6\xc4\x9e\x10\x9\x1f\xaeqO\xdb\xb5V\xf0\x16\x1f\xc7p\xe5\x1f\xa4\xec\xfa\x97\xed" +"\xaaHC\xc7\xfc\x30\xdc\xb7kF\xd4\xf2\x1e>a\x8b\x8\x11\xf6\xc3\xd7\xa6T:\x98-x[\xa5" +"\x9d\x46\xa4H\xd6\xc\xfc\x65\x96\xf%W\xb4\xb8v\x2\xb7\x85R\xeb\x5?(\xd9\xfb\x9a\x1b" +"i\xf7mK~\x6\x30\xe8\xaa\x81\x31\x92\xd5\xdc\x9c\x9e\xc5\x10\x11\xe\xde\xe3T\x19Z" +"%cu\x9d\x46\x33\xc2\x8d\xd6\xe0\xb4lw\x8fZ\xa3\xc2\x8b\xf5\xeb\x9e\xbc\x88~\xee\xb5" +"]\x0>\xb6\xbc\xe8\xd1\xf4\x2n\x7\xe5\xc5\x13|\xea\x82$\x14\xd8\xf5\x61\x98\x31pj" +"\x1b\xb3\x32\x98\x84\r\r\xdf\x9f\xb8\x9cR\x9f-\xa5&\xc7\xe8\xe4\xe0\xec\x42\xd5\xb1" +"\xf4\x5\x86x\xb6\r\x13\xe4\xde\xc5\xe1\x1d^\x8c\xba\x8e\x6G\x89\x61\x30$\xfe\x1\xf2" +"tr\xf2{\xc0\xd1\x11H\x94\xab\xdaU\x91\xf3\xba\x82\x1f\xd9\xec\xe0%\x17\xf\xba\x66" +"I\xf1ZO5\xc4Sz#C}\x3\xde\x7\xb5\xf4\xf4\xf9\xcf\r\x41\xb5_\x8c\x18\x93\x97\xb9`\xe7" +"\xa2\xf5\xdc\x16\x9b\xf1\x84u\xe5\x92\xce!\xd1.>0\x2\x38/l5\xef\x97n\x9c\xb0\x8k" +"@\xc2o\x97_\xe9\x85\xadJG\xed\xe5\x0\xa9\x81\x80\xb7\x18X\xeb\xa0{K~l0oQ\xb9Nvg\xfb" +"(E*\x7f\x8\xb9\xf6Z\x16\xb3\x7\xd9\xb1\xa5\x90\x90\x4S\x18\xbe\x64\xa1\x13L\xd9\x62" +"U\x81\xaf\x37\xa2\xdd?\x8dh\xe6{4\x98\xa8i\xc4\x94\xb6(4Y8M,A\x98\x34#g\xa9\x15\x17" +"d\xc0m\xf1\xe5\xcf_\xce\xeb\xa9\x7f\xbe\xc3\x8cN\x18\xb6zN\x8\x13\x8aW\x80.\x7\xbd" +"B\xd3\xbb\xdf\x1ay\x9b\x42iA2\xea\\\xf9#\x14\x89\xfc\xf0J\x15\"\xbe\x1b\xd6\xb8\xea" +"\xda\xb4\x17,t.`d\x10\x11\xf3\x1b(\xf9\x1b\xe3\xd8\x19\xe4\xc3\x8\xb4\xf4\xaf\xde" +"\xfc~\xb5\xd1\x82\x81\x45\xeb\x1c)\x14Tx\xa0\xcc\x13\xe5V)`\x9c\xdb\xfb\xa2\xdf!" +"\xfc|\x8b\x32\xaa\\\xf9\x33\x9d\x44H\x8dX\xdb\xd6\x98\x7f\x9k\x6\xa9!u\x98~4\x17" +"\xf0\x1e\xd4\x66{\x4JC\x19VY\xab)\x9-~\xca\x93\xadjV\xa8\x39\x83\x1f\x1a\x8d\x11" +"\xe]\x98Z\xac\xd1\xc5\xd1\xe2\xbc\xe0\x2yGA\x8c\x41\x8\xa0\xa4\x88\xfe\x38\xa2\xbf" +"\xcf\\\xa0\r+\xf4\xad\xf3\xb1m\x99\x8c\xefO\xe5yz]\xda\xb0\xae\xbcv\xb9@{\x7\x46" +"\xe9\xb\xef\n\xc1\x85\xa4\x91\xf9\x94\x96\xda\xdeW\x88\n?\xca\xa2\xbdT\xc9Y7]\xe0" +"\xd2 \xa2\x37\xe7\xa2#k?\xd5\x9a\xf8\xe2y{\xb5,\xa0V\xc4\"\xd6'\x91\x1e\x85\xb3u" +"\x18:\xd9\xed\x1f\xdb\xeb\x5\xd7H\xe1\xe8q)?a4\xd3j:\x83`\x1\xcb\x63Y\xfc\xba\xf" +"\xf7\xe9\xf8\x95\xdf\x64\x9f\xe5\x99\x1b\xa0\xf2\x92\xd5\x13\xb3Y\xfe\x34I\xf3V\x86" +"\xddu\x83\xfeK\xc0\xa3\xa3\x8bw\xd3\x83k\xc2\xd6\xc4\xfc\xcdo\xed\x37\xb0\x7\xa5" +"\xb\xad\xb9\x1dg|\xd9\x45\xc3h\xbf\x89xL\xa0\xda\xdb]\xeh\xcOg\x9\xd6-\x2\xddW\x8e" +"^\x19\\\xaf\xb0\xee\xa9Oa\xae\xee\x5\x10\xd8$|\xff\x7\xac\x13%\xa5$\xd6v\x16\x1b" +"\x9b\xfd\xcd\xddVFCk\xcc]\xba\xc1\x84\xdc^\xb9\xae\xaa:\xb5\xa5\xf4\x6\x8b\x93\xdf" +"\x1aJ\xcf\xa1\xba\xc5\x82\x82\xb3\x8a\x92\x3\x46\x6##cS\x8f\xf4\x8e\x7\x93M\x1a\x9f" +"p \xf2\x95\x99\xff\xdd\x37\xd6|9\x8e\n\x86gg\x83\xa9\x1\x94\xb8\x18\xc8}\xdc\x44" +"\xbf\xf8\x19\x66\xe8\x45!\xfe-\x1a\x11\x98M\xed\x9eoH\xcb\xd6\xa3\xfc\x15K\xdf\xac" +"a\x16\x8d\xa2O1\xd5\xce\x10\xb1\xe>\xcey\x11v\x8b\xf9IA\x13|\xef[V\xa2&\xc0\x90K" +"\x9e\x99l\xbfY{\xfcPZ\x8f\x1c\x9b\xc\xac\xdd\xc0q\x12,\x99\x87\xef\x9b\xe5\xcb\xd1" +"2\xbf_{\xa9\xcf(&\x88T\xf3\xf8\xb3\x8e\x9(\xc7S\xdf\xb\x90\x2\x9b\x34\xe0\x9b\xaa" +"U\x9e\xfa\x99\xd5sED%\xbb\xc3q\x14\xdb\xe9&\xac\xd1\xc2\x8e\x98\xc2\xad\xb2\x99\x1f" +"\x86\xd5\xee\x1\nu\xc4\x85\x19\xce\xa7\x1f\xf1\x8b\xd3\xeN\x81\x85\xe9\x8e\x95w\xde" +"\x92\x9\x2 \xa9\xf5\xd8@#\x95^h\xc3t\xa1\x8\xe9_\xae\xc5\xe1\xcfs\xf2\xe2V\x1aT\xe4" +"\x87\xb0\x1cq\xec\x34\x1f\x8fP%\x94)\xa2\x8f\x66W\xc7ow\xb6\x97\xc4\xf4\xb9p\xe0" +";\x8b\xbaS^\xca\x15vz\xc0\xa0\x35\x9b\x8e\x93\x99\x39\xe7?i\xfd\xf+z\xa7h\xfb\xc0" +"\x8b\xdfo\x82\x0\xd6\xac\xfb\"\x32\x80\xc6\x18\xc1\x81O\x11.\xe0.\xf3\x32\xa5(\xb6" +"\x0\x9a\xa9~.2\xb7q\xf9\x9\x15\xe7\xe0\x94\x90qST(\x18~(,\"l\x19#v(\x9a\x94\xa3\xa6" +"\x16\x7\x95%\x1c\xeb\xe0\x1d\x7f%\xa3!n\xa2\xf6\xfcx+/\xc8\x8d\xdc\xa7\x35\xf5\xc2" +"@\xaar\\\xad\xa2W.nT^\xc3\xfb\xb6\xdc\x6\x33\x33\x98\xf1\xcf\x9a\x89R\xad\x42\xf3" +"I\x8e\xac\xf1\xbeT\x94\xdc\xf_=\x1a\x7f@\xa6\xf8Tf\xee\x12Z\xe9\x42\xe3\x99\xde\x39" +"\x9a\xbd:X\xe5\xeb\xba\xda\xea\x91\xd4\xbb\xe5\x16.\xa7\xbd\x1dw60e\\\xa2\xe2\x94" +"am\xf4\x35\xdf\x85\xb1\xa0z\xa2*\xac\x98'\x2+\xe2\x8d\x12\xb6\x8\xc1\x99\x8V~\x15" +"N \xc7\x39\xc2\xdf.\xeb`q`z\x87=\xba\x37\xc8\x1c \\\x13\x41\x19\xf7mY\x8\xb9\xf7" +"\x3\x9\xdb\xaa\x33\xd0\x6\nj\xeew\xcaN\xee$\xa9\x8f\xd6\x3\x44R\xb4\x33\xfc\x32\x8f" +"M\x83m \xfc\x9c\xbfM\x18rS\xecUs\xb7\xc9z?\x8\xa7\xd6T\x9bs\x3t\xf5%\x1c\xa0\xf5" +"a\x96-\xee)\xe1hy!w\xd1\xc3`\x14\x80:\xfe\x98\xf5\xb2\xee\x9b\xa6/\x3\x15k`_\xb0" +"\xb2\xe4\xb5x\x0\xdb\xb9T\x19\x16\x1a\xc6\x65\xcfU\x92\x32\xaf\xb\x33=1\xc6l\x9\xba" +"\xf1\xd2v\xf6\x61\x61\xd8\xaa\xb2\xa1\xae\x5\xab\x98L\xea\x2\xcf]`T\xc0\x16~~\xce" +"%\xaa\x17p\xaf\x8b\x35IX^\x94$]\x9e\xd8\x17~\xe5\xb0\xa8\xfdMC8%\x90w\x13\n\x31\x36" +"\x8ah\xf9L\xe1\xc2\xc8\x9b\xc5+\xfd\xa3\x30\xf8\xa2\xdf\xee\x31\x15\x37\xcd\x8b\x35" +"\x9eSm\x7\x86-0\x90\xac\x8a\x81~Nx\xde@Ab\x86R?\xa5S\xa1\xf1J?\x87&\xce\x87j\xfa" +"\x8e\xbc!`\xcf\x0t\nF.1e\xe7Vwn\x89\xbdn\xcd\x44\x19\xc8\x9c\xabS\xcb\xb3\xb0r0a" +"\xcdt\xec\xce+'\x8e\xc1\x80\xdf\x0oQ\xaan03m\xd2\xe0\x4h\xe2\xca\xa5\x2\xda\x1e\xf2" +"1Y\x96\xc8\x9a\xe6Hb\\I\xcd\xf7\x96\xb2K\x19\x8d\x64\x0i}\xc0\xc5\xd4\x96@&'i\xed" +"\xe6\x11\x9a\xa5\xdb\xc4\xfb\xbbyzUTH\x85.\xc2\x87x7\x1\xb3o\xcf\x90\xabl\xf9\xe7" +"\x1a\x93'\xc9\xb4\xb3\xa1\xf6U\x12\x42\xd7\x87\xb\x10\x1\x31\x88]\xb8\xd0\xb7*\x2" +" \x2k\xa6\x0(\x6\xe4\xf0\x45\xd5\x89\xc4\xe1y\xfai\x80X\x16\x98\xf7\x8dJ?\x8a\xf5" +"\x6l\xfbG\xcd\xef\xa4\xc9\xe5:\xce[\rI\xe5=\x7f\x3\xbc\xbc\xd5\x62u\x9c\xd5\xb4r" +"\x9c \xbf\x45\xa8\xf2/\xce^\x7\xf9)\xf5>V\x9c\x7z\xcb\xc2\xe0\xf5\x15\xa4o\x8c]\xb0" +"\x13\x86\x8b\xcz\xda\x83\x81\x8a\xa5(\xca\x62\xe7\xa0\xbe\xe1mzpbk2\xf7>\x96UC\x95" +"24\xcf\xc8\x9f\x1bZ\x8e\x83\xcf\xdf\xeawAP\x96!\xe0\xe5\xc1\x9d\x61\x11l\xae '\xe9" +"\x97\x8b\x37\x92\xaa\xd7\x88\x85 \xef\x14\xd1\x34\xd8\xbb\xef@g\xae\xccv\xa3\xbM" +"\xcf\xfb'\x12\xbdlU\x83\xf\xb3\x64\x45\xc7!X\xd8N\xa9\xb7)\xf9\xbsc\x95!{\xbc\x86" +"Xx\x98\xd2\x42\xea\x65\xd5\x43w=T\xe6\xa1;I+p\xb2\xda\xd0 I\xb1\xb4\xc3\x11\xb\x9a" +"\xea\x4\xb\xda\xf4\x17Y\xd8X\x12\x35\x93p`v\xd6/L@\xef\x30Wm\x1c\"\xef\xf\xa5\x15" +"\xa0\xf6\xaaz\x80\x91\x42.\x99;Wx\x95\x9a\xb5\x1eu)TT\x8c{G}\xea\x63\x5\x7f~\xb\xef" +"8\x9e\x94\x1b\xcb%\xfb\xf9)\xf4\x90\xc9\x93\xa8\xfe,\x1KY]\x99\xefk\x7\xe7\xe8\xf4" +"\x89\x4\xcc\xb4\x16\xe8q8\x1a\xd3\x6\x36}\xf7\x96\xa4i \xfe\xd2\xc7\x81\xb0S\xaa" +"S\xcb)\xc4%\\\x89?wI\xc4\x46\xafn\xd1\xfc\xbb\xc0\xac\x90\x19\xbe\xa7\xedu\x8cz\xf6" +"\xc5\xf\x63\xa3X\xae.\x88S\x1d\xd7\xae\x95\xc1\x98\x8b\x87\x17\xa8#9>I\xd2\xf\x5" +"\xe\x31\x1cp\x8e\x1c\xef$\x6wW\x1c\x65\xc5\x36\xcf\x1d\xf6[_e\xcc\xbc\xc5\xf4.\x14" +"\xa7\x11$23\x18M}\x99\xec\x3L\x9e\x8d\xf2\xc3$S\xfe\xd3\xae\xa9\xf0\"\xf9\xc9\xf4" +"6\xcb\x62\n>\x1d\xe8\xc9\xa6\xf3Yw\xb1\x37\xdcH\xe1\xa5\x8e|\x97\x17Qd\x7fNS\xe3" +".\xb4r\xa6\x8f\xb7`\xd8J\x94w\\\xd7\xc0\xda\x45i\x8\x8b\x6\x10x\xc9\xd5 !\xd2\xdb" +"\xb2\x82Zf\xd1\x41).L3\x81\x44\x61\x88\xac\x97Pc\xb1:\xad\xe4)\x15Q\rk\xdcm+\xae" +"\xc1\x1c\xbb\x9e\xab.\xca\xae\x98\xe9\x98\x89\x15&gZ\x97\x62\x90.\xd2~3=\xa7\x98" +"\x85^\x16\x44i\n\xb4Z\xff\xca\x84\x82\xa6\xd3\xdf\"\x30\xf0\x16\xact\xa8\x19\x3r" +"\x12\xafo\xf++S}\x84\xff\xc4\x1awc\xac\r\x63\xe\xa1W\xf7lv\xac\xa4\xdc\xbb\xa1\xcf" +"\xa4\xda\x15\x16\xc9\xebV/e\xc3\xdb\xc2\x89\xd2\x15\xb\x81\x41\xc9\xcc=Kn\xd2\x8" +"\xf2\x37\x8f+@\x9f!!R\x8d\x42\xbf'\x18\x80\xfb\x46\x89m:\xc7!C\xdf\x3\x42\xe3\xac" +"=\x94\xc8\xe6\x10\x0lZ\x8a\xae\xf3Z\x1a\xc2\x83t0:f\n\x89@c\x83,\xd5\xd9\xf7\x39" +"\xeb\xbd\x30-\x14\xf2\xab]\x83\xee;\x12~\xd2\xf4\xa2\xf\x91\x14\x84<\xdd\xf1\x93" +"*&\xb6\x99\xa3\x5\xcf\xc\xeeH\x90?\rU\xcf\xe7\x3\xa8\x1f\x0I\x4'\xb8O\xccS\xc9\xc9" +"\xd4\xe1v\xb5\r\xb9\x83\x41\xc8\x1a\x66\x8f\xea\x1b\xed\x8c\x66\x5\xef\xdf`2U\xb5" +"\xa8*j\xdf\xa8\xc0]\xee\x3\xa4\x5\x5\x46x(F\xc3#\xf7'\xd5\x46\xb3\xd5\x1b\x38\xa2" +"\x8\x19\x10\xae\x9d\x8e\xc1\xac\n\xb6\x93\x41;\x1a\xb7\xa3\x9a 0\xf9\xd9S3\xc8\xb1" +"\x6\xde@\xd7'\x1e\x9f\x37?s\x1c\x4\xcb|\x6&\x1aTN\xab\\\x4\xc0R\x7\x90\x66U\xcm\xc8" +"\xaf\xe0<\x88\xfe\x41\xc5\xc8\xd8\xb9\x8f\x18\x7f\xceQ\xab\x8fr\xb\xc9@\xfb[\r\xf8" +"\xd8\xc8\x14\xe6\xe6\x19\x8a\x8f\xf2\x9b\x1e\xfe\xca\xff\x31\x92\xf0\xf1#\xf\xcb" +"\x97\x6\xb\x82\xe4}\xc1\x80\xd7\xdaV\x10\x62\x98\x12\xbc}\xcf\xb9\xc6\x85\x42v\xff" +"t\xb1u\xd6\x9cQY \xfa\xcf\xa0\x2\x18\xca\xcb\x9f[\x9a&\xdc\x3\x42\xb2R\xc\xe2\xe0" +"\xb7T;-\xa2\xa6+\xea,,\x9c\xec\xa0U\xdaT\r[\xa6]\x13\x9a\x3\xa1\x61," +"\xdc\x4\xd4\x44\xa1v\x88\xe6\xa3\xba\xfe\xa5\xb2\x1a<\xc6\x88\xc2\x33\xe5M\xb6(\xba" +"U\xbe\x66\xb8\x82\x8b\x43\xdf\xb8\xd3\xc0J\x1e\x96l\x84\xcIk\xd1\xa8\xb2X\xeb\xe3" +"\x19\x87\x9b]\xbd\x7f\xf3\xfd\x8d\xb5\xf9Ra\x1bp\xef\xea\xed\xd5|\xb6\xf1\xd5\x8a" +"-\xed\xdb\xa0\x33\xf1y\xf9\x9c\xc0\x1d\xcb;rC\xb3\\:\xf6@\xab\xf4\xb5W\xb4\xcd\x94" +"\xfbl\x1d\xff\xb4\xff\x15pWN\xac\xb9\xafM\x10#M#[_\xf7\x1b\x18\xe2K#\xf8\xbf+F\x91" +"%\x15i\xc4{\xa8/\xc4&\x6\xd9\x83\x45\xfe\x9d\xe6\xc0UA\xc0\xdb\x42>\x7\xe5\x5\xc4" +"T\x1a^y\xf6\x14v\x16\x34\xe7\xa0\xc1\x82\xfb\x17\xf1\x84\x65y\xdb\x2\x42\x1c\xca" +"O~\xbc&M\x1\xder:E\xbcI\x84\x1f\xd8[\xf4\xfdQ\x8c-\xc8\x1d\xa5\x33Y\xde,\x2\xd8\xbe" +"\xd0\x1c\x9e\x96\x96o\xa7\x4\xb\x8e/\xf3\xfb\xc1p\xddN\xbc\xdd\n\xfcnh\xc5 \xf7\x15" +"\x14?\xc0\x98\xeb\x8a\xbaT\x9e?oj9}\x87!\xbe\xf6j\xe0,\xe1Q\xc9\x32\xb7\xda\x39\xc0" +"\x83\xd8\xf1k\xe6^'\x3\xe2\x12\x87v\x1as\x86\x84\x8eQ\xb2\x2\xe5\xe7^\xc3\x12\xca" +"\xde\x18[\xd3\x8b\xcf.d\xceJ\xc0z\xa3\x96o\x96\x7f\x94\x1bU\xc4\xb1\xe8>Z\xb\xd1" +"\xc7l\x15\x6\x8e\x0\x8f\x2\x5\x9a:\x7\x8c\xce\x80\x65\x83\xbc\x8bT\x8c=\xe8\x98\xf0\x9f\xe2~n\xfb\x85y." +"x\xe8\x1d\x9c\xe0L\\6\r\xd0(\x9e\xa0\x81.\xecy\xab\xae\xac?\xe7?\xbc=\x7'A\x14\x1a" +"\xec\x9a\xbe\xb2\xbd\xe1\xf6\x85\xa2\xe\x8e\x85\x8a\xab. \xc4\xc3\xa2\x86\xdf\xf5" +"\x6\x1f\x34\x8c\x94\x33\xf2\x13S]C\xe\xb9\xddx\x5\xdb\x99.{\xef\xa8{\x9e)\x90\xa8" +"ow\xbc<\xf6t\xa8\x38\x96\xe6)<\xfa\x0\x90'\xc4\xdd\xa0\xecV\xd3\xf2\xb7\x1c\x38\xba" +"\x12\xb8\xe\xb2+\x11\x82\xa3S\xc3\x98\xf7\x42\x87W|\xfb\xb1\x42\x19\x8a\xdd\x8a\x9a" +"\\\xdb}\xe8\x63\xa3\x94\x2\x80]8~\xec\xad\x3\x7o\xd2\x6^f\xec\x82=\xd3\x31\xdbY\xb8" +"\x8b\x8d\")#FX:\x8a\xbf\x35\xd5\xa1z\xff\xe4*`]r\xf8\x15\x8f\x80\x33\xfc\x13\x9f" +"*\xe\xd3\x99\x1b\xbbHjB\x5\x87v\xc0\x92\x9di\x1b\xd0\x82\x91\xde\x41\xfdH{\x96O0" +"sn\xf9\xfc\xbb\xdfj\xc4\r\xbdgM\x6w\xd9\x7\x5VP\xb8\x9f\xfdr\xcb\x64\xc9\xc5v\xc8" +"*\n?Y|ry\x95X#\xf2\xb8S\x19\xf0\xbb\xe5\x66\xb1\xf3\x41;\xf0i\x1c#c~\xe8\x1a\xb4" +"\xd1\xd0\x1f>*\x10\x1f}\xee\x65S\xbaG\x9b\xc4=vkd\x9b\xda/\x95\xc6\xae\x83\xbe\x1c" +"{\x95\xc8\xe\x86\xb1\xd3\x94\x82\x44}z\x0\xd4\xbf\x10(\xc2\x9a\xde\xf2W\x3\xdd{\xe6" +"\xd7[\xe9\\q*\xca?\xc5\x87\x92\x34\xad\x61\xf8\x86\x36\x9c\xbf\xf0\xda+B\xa1\xf8" +"\xaa\xf4>SLJi\x7fzp\xc6Q\xb2<\xc3\xbT9\xe4\xaf\x1a\xe\x13)v<\x8a\xa4\xbeg\xcf\xca" +"*X\x92\x36T\rNn\xfc\xb5\xb0/CG\xfbJ)<\x8e\x35O\xcaui\xed\xcctH\xc8]\x8a\xb3\rM\xd6" +"\xc5{\xff\xc3\x36\x62O\xba\xd2\x98\x15\x61\xa9\xb1\xbe\xc2\xc1\xdd/!& l\x97\xb3Q" +"\xct\xb9]\xda\xcb\xac\x16 \xbc\xe6\xd6\x81\xea|\x9b\x12\xad\xca\x34?A\x16\x1c\xe4" +"\x1x\x14\xd6\x93p\x8e^\rc\xdf\xedm\xab\xf4gal\xa0\xa5\xe3\x4\xc7\x9a\x8b\xc0\xad" +"\x86\x1c`\x15\xf2\xc1\xd4\xe2\xb4\xe4\xfbn \xee\x42\xc2\xd1\x82\xee\r,}\xf2\xc5\x8a" +"'B\xf0\xdf\x5\xc1<\x1a\xfcYa3${\xd8\x42\xdc\xb6S\xb3\"\xe3\xa9\x7\xe4X\x5SE\xf5*" +"A\xa4S\xe6$\xc6\xca\xed\xf8\x8e\xaa\xda\x98\x45\xf7\xd4\x4\xc8\x18}\x15\x8b,\xb4" +"4\xc4V/\xea\xf\x8b\x1d\x83\xba\xc8\x13\xe5\x8b\x12\x9fO\xb8\x1\xea>\xc1r-#\xe8\x92" +"\x3\x8f\xa9\xfb\xc\x1a\xa9$M\x91Z\xca\xe5H\xb4\xa3\xec\xf8\xc8%\x4\x95\x8;z\xda\x61" +"\x14\x94\x61\xf0%y\xf1\x98\xf0j?+]\x84\x1e\x34\xae\xf7(\xdd\xf4\xeb\xee.\xf0\xdf" +"&<\x5\xe5\xb2\xaf\xc(~D\x96\xcd\x0\x6q\x17>Hd\xbc\xc2u\x11\x81\x89\x95i\xacj\xf9" +"|%\xd7\xd3T\xf4\x1\xde\xf4\xcb\xdf+\xd4\xe0QG\xad\xdevL\xe4\xe6\x65\xf2w\xb8\xed" +"[\xb0m\xf6\x91\xc2Q\x6\xda:\xc2\xf5u\xf4\xa9y\xff\x4\xf1][]\xa7@a\xfe\xc5\xb0\x80" +"\xc5\xe\xdd\x9\x0n\x6\n\xe1\xc6i(\xfe%\x14\xc1\x9a\x90\xb.\x80\x33(\x9\x0\xd2-1Z" +"G\xe4m\x1b\xa2\x2.\x92\xc0\xfe\xcc+X\xb2\x8f\x85P3m\xa1K\x9e\xc1g?\xab\x4\xbbzR-" +"z\"\xe0\x1d\x85\xed\x8f\x1cV\x8\x87|_f\xa7\\v\x91\xb7*\xd4\x42\xbd\x66\xd3\x36\x39" +"\xc;\xa5\x88{\xb4\xcfk\xe8\xa6\x8a\x17\xd9\x31v+p\x1d',m4\xdf\xba\x9c\xda`\x11\xa5" +"\xd3\xfc\xa2M\x9\x9\xf6\x8b\xed\x66)\x8c\xa7o0\x12\xd7\xfe\x83\x3^<\xf5\x8eM,\x2" +"\xee\x80^\x8f$;\xd3\x2\xa0\xee\x32\xe9or\x10\xce$g\x13\xe3\xee\n\x9a\x87\x14K\xa2" +"3\x80\xd6\xd2\xc3\xc2\x1d\x9a@\x84\x12\x87\xae^\xcf>\xc3\x1c\x30\x91\xae\x41'\xb4" +" \xb2\xf7z\xc3U\x1\xb9\xb0-\xe5\xb2\x99\xe0\x2\xcb\xd3{\x91I\xd3\xae\x62\xfe\x94" +"(\xd4\x85\\\x15\xa3\xc0\xfa\x87\x9a\x16\xc7m\x86\x8b\xaf\x4R\x1e\x39\x0\xb8\xf9\xb2" +"Tz(\xef\xd0{\x9c\\\x65\xde\xaf>\xf5\xde\xe9W\xa1\xa7\x33\x86\xc1\x11\xfdX\xesV~\x15" +"\x8e\xb8\x11g\xd5\xf3*[\xcd\x45\x91\xa2\xff\xca\x88z\x84\xddP}\x99\xfc\xc5\xa9NH" +">\x9f*\x1c\xf1x4\xe\xcc\x9a\\\x32\xbat\x12u\xd3\xceRX\xfe\x9b:\xb9\\\xe0-\xa4\x9a" +"\x1\x19\x9c\x62\x35\xb9\xa0\x10\x9\x11%\xf8\xe8\xd7\xbc\xf7\x8e\xd3\x1f\"\xf8\xb0" +"\xc1\xd0\x9eze}q\xeb\x97\x36g\xcb\x33n\x98\x45\xa9\x44q\xb2\x92IM\x9\xa1{\xe0yPB" +"\xa5\xdc=\xba\x96l\x91\xbf\x83\xaf\x46\x32\xc6\x91_\x9c~G\x8eIC\x9aV\xa3\xcf\xf5" +"\x6n\x8e\x38\x3\x14Y\xe9\x1c\xea[\xb7\xc1;\xe8\x7\"\x93\x94zD\x5\xd2\xc2\xc4\xef" +"do\x14\x9b\x61\x41q\xda\x10\xb8\xf8\xa5\xcb\xad\x8a\xb3$\xc8\xda\x19\x18g\x3\x8b" +"\xf6\xa2\x97\x93\x8a<\x98n\xd1\x87\"\x1e\x2\x9e-\xc8.\x91\x19)\xd2\x3\xf2\xf8\x64" +"\x87\xd0\xad\xb8\xce\xc9\xba\xc1O3\xbf\x97\x87\xb1\x18\xfb\x8c\x42\x87,B$^#\xfcg" +"^h\x9d\xc\x1d\x1f\x97\xd9@\xb7\xab\x12\x94\xcc\x34\xa4\xe8\xe3$\xbe\x44\xc4q\xf9" +"]\xcd\xeb\x95\xb9^>\x94~\xe0\x94`\xe3=\xb0\x66\xb8\x9d\xe8\x84\x16\xba\x10\xa8\xa0" +"\xa1\xfcZ\x1b\xae\"H\xf8H;4\xf0\xe\x9ck\x85\xba\xfa\x1c\xb8\x34\x63L\x9\x97\xf1\xae" +"\xc9t8L\xfa\xf2\xe4\x66\x84\x19\xfb\x14\xb3\xf3Y\xa9\x63\x9c\xc0\x98\x81@\x17\x13" +"G\x7f\x1f\xdb\xe3/\x94t;w&\xd3\xca\xe5\xbcib).\xbagU\xe3X\xf0\xedJ\xfb\xb8\xb9\x1c" +"1\x87\xa1!~\x4\x9a\x9e\x32\x9c\xb5\x9aQ\x98`^y\xb\x45\x88Zd\xe3=\x85\xe0\x9c\x88" +"\xad\xeb\xad\xb5\x12\xe\xde\x63Qm\xa8j(\x9e\x93\xf2\x1b\xdb,W\xf\x99\x15\r\x33w\x96" +"\x4\x96}Qp\xb7\xf9\xd2T\xc3mL\xbcY\x14\x1a\xba\x5\xdb\x9f\x32\x65\xc2\x2-\xb5\xf9" +"05t\xf2\xf3,\x94\x62m\x11\xf6\xb6+{\x85\xf3\x91\xe8\x80S\x95\xc7\x0(RA9\xb6\x97\xc0" +"t^1\xce\x16&\xd8\xf3N\x8cg\x19\xf0\x8f\xb0\xb6.\x88`Gc\xce\xb7\x37\x1a\x18M\xb1\xd3" +"\xbd\xe4,\x12\xb2j\"\x95\xe9\x0g46}?\x81\xb6\xc9\xb8x\x90~\xb6_\xa7\x43P\xb1\xa4" +"tN\x92\xfd\xd5K\xdd\x8c\x7f\x84H\xeb\xb1\x84\xbeK\xcf\x1f]mX\x9e\xb9n\xbd\xbb\x3" +"7{\xbb\xc0\x99\x32Nn\x81\x91\xf1\xb5\xff\xfc\xe4i\xf4\x96\xc1\xde\xe5\xd0\xa3\xfd" +"\xa4\x10\x97H\xf2Uc%\xd3\x1a\x1e\xa5\x7f\x8a\xa0r\x8d\x1e\x8b\x86\xa2y\xec\x9c\x2" +"\xe4\x30\x5(\x7\x8?\xdc=\x98\xacX\xa1\xd8R\xd9\xe9\xdf\x35\xaa\xa9nN9\xdb\x16\xab" +"\xb_$L\xee\xa4\x18xqS\x7\xed\x9a\x92\xc1\x41\x80\xed\x8f\x1c\xda-I\xd7\xcd\x38\x34" +"\xa2\x0K6N\xda[r\xde\xfd\xcc\xdc\x1d\x15^X\xbb\x6\xb5!\xd5\x39\xf6\x2Q|\xe8\xb5\x9a" +"\xa5\xca\x83\xd1R\x8d\x8e\xf5\xb4\x33\xf3@\xe3\xb\xc8\x87\xee\xa6\xb0\x88T\xdf\xc3" +"\xd1\x32\xb3V\x98\x9c\x61\x94\x18'(+\xe3?\xdeL\xfe\xf2u\xf6.r\x4\x9d\x10\xab\x37" +"\xbb/(\xee\x17\xed\xff\x43P\x90\xd4\x8f=o_[\xba\xca]d\xc9OS3>o\rm\x93\x1a\xa4\xe5" +"\x1f\x41\xd8\xc\x85\xf9K\xd0R#9T\x80Pf7]\xb0-^\x82\xe\xf3\xf9T\x7fM\x9a\xa4\xdf\x99" +"\xbf\xc3\xee_*\x3\xe2v\xda;\xfbu\x99\xb0.Z\x81\x30\xf4\x33\x95\x45 \xadM\xb9\xc6" +"\xa7\x34\xfc\xdf\xde}\xda\xa7)\x92\xc1\x98\xac\xb4~>\xf8\xbb\x1a\xa7\x9d\xf9\xcb" +"\x13v\x90<\xd8\x97\xc7\xfc\x46\x33\xd0\xe4\x1e\xa4]A\xc5\xee\xf2Z\x7*m\\\xf9\xf2" +"\x91\xc9\x36\xcfL1\xe4]]\xe2\xae\xbe\x84\xe9\xe4t\x1d\xb6\x98T7a\xd5\"x\x15\x9d\x13" +"4\xe5\x8a\x8c\x82\x37\x8d\x0\x87\xdc\xc9\xf0\x33\xe8\xc4\x62\x84\xc5\xdb\xd5.d\xfa" +"\xa4\x37\xce\x8f\xaa\xe9U\x93/\xcd\xb5\xe0\x85\xc1\xcet\xd5\xd8\x98l\xc\xa5\x38\xc8" +"W'\xc6OVDg\x16\x64\xd0\xbd\x1d\xcd\xc2V\xcd\xdd\xf5\x39@\x11\x42^\x5\x43\xb4!\xd0" +"y\xf3t\x1b)\xd7\xd5\xd6:\xecV\x1b\xd8\x63-\xc2\xae\xd5\x17&~\xb0\x64\xff\xcb\xba" +"\xb2Iz\xb9P\\v\xee\xbc\xe\x6\xdf\x31\x34\xd9(\xaa\xb9\x5\xbb\xfd\xf6\x83\x4\x97\x83" +"D8\xb0`=\xbeu2\x92Y\xc7i\x93\xaa\x30\xd1\xab\x32\xb7\x15\xef\xa6\x1\x9djX#\xe1=\x83" +"\xcc\x84\x3\x9aq\xbd\xa6\x9\xb8\x41\xa6\x86q\xb3%\xb2\x1d\x93\xe7yE\x95\xeb\x39@" +"\x3\xf\\\xad\x84\x36\x92\xe9\xa4\x8b\xd9\xe7\x8a\x85\x17\xc2\xd2\xcc\xa0T\xc8\xab" +"{_\x9b\xac\x1a\xe8\x1e\xa6\x64\xb4\x99\xd0\x8c\xf5\xf5\xf0Pm\x98\xd7\xfb\x8f\xa7" +"\x9e\x90\x5\xc\xe7\xe1 bf\xd5t\xd9\xdf\x32-\x2M\x1f\xe0\x1\xad\xf7\x61\xf3!SKH7\xc5" +"\x1e\x36\xcI\xb9\xcc\x86\xd2\xff\xe4\xc4\x12\x9c-4,\xa7T\x1a\xd7K& \x0\x32Z\xe8\xea" +"_\x19\xa7\xda\xee\xff\xce\x8b\xc\xf0\xe7\x43\x44L?\xb0\xb0?\x82\xf9\x91M\xdb\xce" +"\xe8\xed\xba!7\xef;o\x9a\\o\x19\x8\x30L\x7\x64\xc7\x64\rN\xb4y\xee\xee f\x88\n\x1f" +")M\xbc\x38\xc8_\x99\x17\xd2\x32\x8a[\x8b\xc8\xbb\xa4\xec\xa7\x90\xab\xef\n\x95\x33" +"4\xb0\xb4\xac\xc0\xad\xbfL1o\x86!\xbc\rPg{GD4\xd0L2\xf4\x90>\xf6\xe8\xd8Ol\xea\xd3" +"\x1e\xe9\x19\x8a\x31\x1\xc3O\xd1\x80\xb3?dTi\xfcGk2%\xa3SL\xadX\xe8\x9c\x37P\x80" +"\x8f-\xf6\xa3\xb6h\x1c\x63\xbch\xa7\x42=F\x1c:\xa8\xc1\x62\xc6\x93\xb0\xf3\xa4\x43" +"eh\xe\xd2\x38|\xe0\x91\xd0\x63Pw\xf\xf4\xe1\xed\xeQ\xe7\x96\x44\x37 WC\xe9\xb1^\xde" +"\xbbx\xa1@`\x13\xa2TQ\x7ft\xac\xcd}\xd0\x84\x9cK\x1e\x13\xfa\xc4\x18\xe0Y\xdc!\xae" +"\xec;j\x87\xc1\xab\xa0\x88\xd6\xd5\x1a\xbe\xeer\x3Ko\x85\xd0\x64\x1f\x30\xfcR\xc2" +".\x1b\x4\xc0`\x1a\xec\x8d\x34|\x8e\xf6JK5\x88O\xf9\xa9\x65\xbcikm\xbf\xdc{\xfd,\xe0" +"\xb6\x5\x90;B\x8f\x95U\xc3,\r\x18\x94Yl\x80\xc\xf4j|i\xb6\xbc\xb0\r\xf2\xc0\xa1\xc7" +"h\xfc\xf2:\x8d\x8e\xff\xf3\x85\xd9xln8\xb4O3\xd3\x7f_\x16\xdb\xdf\xc9\xee\x13\x6" +"Q\xc\xf7U\xfd\x1e\x8\xfd\xb2\x11\x8e\xe4\xc9\xca\x8b\xf0\x7f\x12\xae\x9d\x82\xfe" +"v\x15\xe9\xe8\r\"\xe8^\xda>O\xd8\xc\xc5\x14\xef:\xee\xc6\x37]\xe2=]\xedS\xc6\\\xcb" +"\xed\x35\xe7\xb9\x8d\xc0\xd7\xa0\xd0\xfe\xf9p`\x81,;v\xdcy[TZbU\xed'\x89\xbd\xd3" +"\x90,+#\x84\x31\x9f\x8a&\x4\xa8\x36\xf2\xe5\xd9;\x8a\x4-\xb6 \x10V\xc6Tv^\x10\xa1" +"4H\x9a\xf\xbd\x61QB\xe5\x31jzF\xaf\xcb\xa9\x1br\xd7\x44\n{\xc\x1e\xca\x62\x94M+\x91" +"T\xa2\xa9O|?A\x86\x95\x1c\xd1\xdd\x97p\xad\xd3Z\x6L\xb1\xa6JE*\xc9\n\xdc\xd3G\xc2" +"\x0&\xe1\x36\x89t\xac\x34\xe2U\x2\xb8n\x8f\x9a\x5\x62\x66\xbcj\xb5\x96tYO\xefu\xbb" +"\x3\xe3\xe3\x89\xddQ6\xd9\xb9\x80p';\\2ik\x0\xa5m\x1e\xbc\xaa\xb5(C\xb9\xb3?\xcf" +"\xed\x37\x64\xd1\xfc`T\xe4\xca\xde&\xe8\r\x96\x10\r\xc\xe9Nf\xf7\x39\xba\xd1\xf7" +"\x1\x65\xa8\xdb{>\x80\xf8\xb1\xc1\xbaX4\xf6\xa2x\xd4px\xd6t\x18-V\xa8HH`\xa7\x4\xee" +"\xd5\x1d\x8c\xb0Il\x8f\xf6\xad\x38\r\xfb\x3\xe4\nQ\xc7J\xfa\x66'\x7fv\xe2\x8e\x63" +"\xb8\x39\xb8\x2Yd\x87pUE\xc9@\xd3\xf4Y\x18\xd8\xd6G\x7\x61\xe1/\xae,\xfa\xe2m\xb2" +"\xcb:\x80W\x8d\x7%\xa5\n\xda(\xc2\xdc\x35O|r\x2\xebkx\x8\xd9\x62\x36\x45\xf5\x31" +"Od\x8a\xaf\xd0\xac\x97\x91\xf9\x61(\x10\xdbL\xc7\xa3\xcc\x34\xf8R\xa6\xa6\x96\x81" +"\xca\x9b\xd6<\xdb\xcd\x9e\xd0\x5\xae\x85s\xab\xa5\x8a\x12\x31\x63;\xe4\xe0Z$3\xbd" +"i\x8e\xfb\xf2\xa6[A\x1e\xef\x14\xb6\xde\xa2\x1d\xa0\xf2\x98\x12\xb\x97\x14\x37*\xce" +"\x81\xbf\xecM\xc6\xda\xcf\x82?\xc5\xd1k\x1a\xd1\x15'\xa7\x1c\x30\xca\xc8:\x14\xd2" +"_\xc0m\x8d\"\x86\x1a\x12\x30\xeb@\xc0\x1c\xda\xa7\x7\x1eM]N(\x7f\xcc\xa3J\x94\xa1" +"\xaf\xab\xd1\x9f\x84\xc2\xd2\xdb\xcd[\xf0\x2\\\x1d\x14\x37\xee\xcb\xf\x96T|:\xb5" +"\xf0\x43\x5|\xf\xe7n\xa0\x88\xc0+\xdc\x8\x97uFgC\"\x1e\x36\x4sw\x95\x9b\xc1W0.\xcf" +"\xb9\xb5\xf1\xf9rR\xdc\xdd\x9\x1\nq\xf3\x7\x9w\xaf\x8f\xcf\x42\x64\xf\xbd;\xea\xb9" +"b\xc2\xad*\xf6~\x91\xec+\x91\x82\x44\xa0\xfc\x9b\x37\x4*\xc3\xdb\xe8Z\xdf\xcf/\xd2" +"C,\x8d\x84\xe3\x16'\xf1^\xf9'\x9+[\x16\x8ex\x6\xaf\xf1\xe7\xf1\x61\x7\xa7\x16Q\xca" +"n;\xac|*\x3\xcf\xf5\xa9\x8e\xb9S\xc8\x19\xfd(3\x9\xe9\x6\x64W\xa4VZ\xbd\x42+\x2\xc7" +"\nT\xe\xd6\x32\xbb\xc4M\xce=g\xbb\"u\xd8\xaa\x11\xb3\x90\xe5\x80\xe8\x9c\xdd\x31" +"NX\xe9\xe9\xc6\xe\x98\xc5\x13Vk\xc6\xa9\xa2N/\xc5\xba\x1e\\\x31H\xee\x12\xb0\x84" +"\xbb\xc5\x1aY\xd2\xa6\x42\x30\xacm\x14\x83\x41\x63T\xc1z\x9a\xfe\x88M\x9\x93\xe3" +"D|\x92n K\xec\xce\xf2\x85\xe2\xc6\xc9H\xaf!\x8a\xa8\x45\x83_\xa5\xe2\x91\xe0\x89" +"<_\xa3\"\x8d\x1c!\x82R\xdfTe\xd7\x33\xc3\xecx\x5\x62\xb3\xbb\x18t\x95\xdd\xb8\x93" +"\x9d\x15\xf6\xc9\r\x6V\xdb=\x8\x1c\xe9\xcdx\xaf.\xea\x94)\x95\xe\x41\x36\x98\x4O" +"w\xc9\xef\x13\xc7\x7f\x19\x8b\xdc\x2\xa8(\xde\x5\xc3\x9b\x7f\xe2?/<&\x99$\n\x90\x64" +"\x1b\xe7/\xc8\xae\x9d\x83[\xe3Y;\xd5\xf7\xc4\xc3\xcboqy`\x3K\xef\xd8\xe9\x9\x31\x1e" +"\xb2\xf7\xe&=`NS\x9\x1f{MC~\xef\x80\x31\xb4\xf9\xcbKF\xd0*\xb0^!\xaf\x93\xa4\\\xbb" +"P^\xee\xbd\x41k\xe6\x41\x7\n\xe1\x81\xb4,7\xaa{\xa9\xa0\xb4\xa8v\xc7\x11\x88RN*W" +"\xe9\xdd\xbe\x1eV\x1e\xa0\x8cVU\xdf\xf9\xc5\x93+\n}\xc7n\xb9\xfepj1ts\x1f>\x18\xad" +"\xba\x33\x8\xa7\x87|\xef\x16v_\xe5\x36\x46\x8d\x99\xbe\x7t\x8b\x8c\x87-\xb8\x39\x88" +"\x1d\xa2V\\{R#z7Rs\x1f\x35\x15?@\x80sT\xec\xa1UI\x80\xe1;7\xfe\x19&\xe\xb8W\x2P\xe4" +"s*\xfb\x80\xbf\x45$7s\x10y\xe8v\x88s\xd2\xe9\xc0\x85\xbb\xb0\x83\x1a\x14\x90\x18" +"\x90\x30\xf2o}<\x13\xad\xe4\xe2\xf6\xee\xaa\x7\xe4\xc4g\xac\x96\x4Hm\xcc\xfaI\xac" +"\xea\x33G\xb3%\xca\xbc\x42\xec\r\xf3\xe3\xa3t\x83\x35|\xb9;\xf\xfe\xe1\xd0#)*\xa1" +"!\xe1{\xc5\xef\xae\x9b\x9b\x95\x2\xf4\xa0\x1fS\xf8\xb7\xb6\xea\xb1n\xa4\xb6\xb1\xc1" +"SXz\xc\xd1<\x90\rK\xde\\\x2~_\xfa\xe7h\x13\x9c\xc9*2xd\xac\x85\x64\xa6\x0\x86\x9a" +"`\x86\x32\xd9.\xd9\x84\xc4*W\xa5\x89\x8a\xe0\x97G\xd3w\xec\x9\xec\xd5\x18:\"\x94" +"\xcd\n\xca\x19\xbe:\xa7\x80\x99\xc2\xcf\x8fJBb`?{\x3\xb0\xc2\x9a\xc8u\xf9\xccv\x99" +"\xf7ZqS\xf5&\x0\\`\xd3\xbb\xc0\xf9\xec\x5\x80\x9d\xddkf\xc3X\xc0\xb1\xfa\xb0\x12" +"bK\x83\x4\xf3,X\xd9r\xd7\x81-R\xa2\xa7Y~\x7f\x19\xeZ}\x3-\xd6\xd5hG\xeb\xf5\xfd\xdc" +"d\x5\x8e\x1c\x9f\xfa\xb5*\x13\x96S4^\x17\xeb\x87;7\xdd\xf0\x61\x8\x19p\xfb\xca\xcb" +"|\x1\xaa\x43\xdb\x93\x66\x8.\x9a\x64\x82\x13\xf4;\xea\x64\x1e\x4\x9akj\xf7\xd4k\x87" +"E}`\x9d\x61\xf9\xbd:\xe1\x81\xae\xe3\x11\x7\x14\xe6\xe3 I3P\x2\x84\x43\xc6\xea\x1c" +"\xb1me\xe7\xc0\xfbU\xd3*\x83O\xb0\xa6\xaav\xd9j\x8a\xdb_\xc~\xcb\xcd\x6\x8a\xba;" +"\xf\xeeu\xf\x30)cn\xf8\x17\x8fKr\xde\x7\x1d\xeb\x39w\xa5\x13\x8axW\xa8\xfaO\x81x" +"\xb0(\xca\x1b\xc3\xee<~}a\xff\r\xd6\x80\xcfR\xd4\xde\xec\x45\xe3\x93\xc9\xc7\xc1" +"\x94\xe8\xb4\x86\x13.{\xf1\x95\x90T\x4\n\x62\x31s\x14%\x84\xbd\xb1O\xd6R\xbe\xe4" +"\xa6\x1e#\x1e\x13J7~\x16\x30\xb7\xc0\xe7\xee{5m?\xee\xc8\x17\xfe\xc4\">\x98\xafO" +"#\xc3 \xdaU\xab\xd7|0\xfbR\xa5#\xa6\xa4\x38kr\x94\x87w+\x91\xbe\x94\x8bz\x9b\xf6" +"\xf4\xc\x9eqfP\xbc\x16R\xde\xf7\xff!i6\xee\xcb\xd4-\x82\x42!n\xc4\xde|\xd3)\xd7\xbb" +"z\xbb\x90\x19\x80\xe\xb8\xb8yG)\xd6\xe1k\xadm3\xb\x7f\x17{\xeb\xbc\x9e\x1\xaaqr\xa8" +"a\x9d\xe^8\xa9\x97h\xbe\xe2\xb9\xbf@\xc0nKWop\x18\xfeU\x0\x19\x95\xfa\x1c\x45U'\xbb" +"\xa9P\xe5j2\xf6\xd4:\xb0\x84\x96v\xfb\x42\x9\x3\x1\xd5\xdd{\x8\xd2\xea\xd9U{\xb5" +"\xab\xa3Xf\xffYq\xaa\xc3s&U\x11\x9a\xf\xc4\xa9\xcd\x66\xca{v(\xe4/\x87\x14\x87\x63" +"\x9f\x82M\x7\x82\x7\xdd\x92t\x9\xf0\x4w\xf\x8e\xeb*MQ\x8d\xf5\xfe\x96\xdb\xbb\x62" +"\xdc\xb6\xb9Y\xd8\xc4\x7\x43\x2\xd6\x34\x9c\xed\xfb\xcf\x94\x8b\xad\xba\x1d\x36@" +"\x10L\x87\x15\x1e\xec\x9c\xb0\xcd\xde\xf9\xb7\xee)\xf4\x44\x7f\xd8\xa6P\xcd\x1\xc3" +"\x94U\x0\x19Y\xfd\xff\x63\x93\xcd\x85mg~\xc8\xa7\xd1x\x2\x1a\x83\xfesy\xa2gB\xfc" +"\xf7\x85\xc8\x94\x0\x8.\x1a\x90\xee\x8b\xb\xd2\xf0Q\x84\xed\xcc\xb5<\x9e\x11n\xc9" +"0\xbf\x19\xd9\xe6\xfej\x1f\xf3{\xbfY\x95\xef\x30\xe9\xd1\xca\x1d\xd6\x61?:\x11\xf0" +"\xc6\x95'\x1c\xeb\xd2J9\x99\x8b\x88\xed\x8d\xce\r.\xbdK\xb3Txu\xbaO\xa0\x93q\x1c" +"[\x1f\x6t\x15\xd8\x90\xfeY\xd5\xa3\xad'G\xea\x32\xfe\xb4\x1c\x61\xf6\x8eH\xd8Kl\xff" +"\xe2\xb8\"\xd9$\xe6{\x10\xf1yzF\x86\xb2\x82_\xfe\xee\xb7\xdb\xb8]~Dd\x88s\xd6WO\x16" +"\xc9J\x8e\x88\xb3\x2\xd0n\x12+\xf8g\xaa\xb\x45\x8d\x8e\xf4\x82\x41\xa7\xcb\xc3\x11" +"7{y\xdfU\xe6#\x9a,\xe7\xa9\xe7\x87\xc>\xec\xc6\xc3\xec\xf5\xcf+\x9c\xa9'\xfc&\xad" +"\xc1\xce\xc5\xd5\x85\x84\xc5\x0\x9c\xab\xc2\x14\xa3\x89\x16\xee\xa2\x11p\x10\xdf" +"\xc2\xb9\xe1\xef}o\xf0\x0U\x85l\xc1\x1\xef\xe2Mh\x1ew\xb4U\xa2}\xaa\xe1\x43*\x12" +"\xd1sv\x92R8\xb0>\x88\xe5\xd1\xf0\xaa\x19\xff\xe6\xa2MY6\xaa\xa0\xce\xb6\xdf\xfe" +"po8\x1ag\x8e\x36qx\r6\xf4\x66\xc4\xfa\x80\x87\xa3\xf4\x8d\xde\xe3\x9a\x65\xd2\xbb" +"L\xf\xa7\x80m\xac\x99\x1\x99\x83\xf7z\xcb'\\_\xf1z1$\x8c\xc7X\xc4\x42\x1b\x13\x8d" +",<\x97`N\xd3\x1\xad?\xa9\xe2\xb8\xa3\x31\xf6:\xf2VO:\xcc\xd5\xcd\xfcM;\xc5\x89\xe6" +"\xc7\xbc~\xfc=\x8\xc9\x97\xfa\x9e\xf7[<\x1a\x36\xc9\x99o\xf5\x46%\xd0Sc>\xa3\xe5" +"\xc2\x80\xa8V\xdf\xe7\xa0\x84\x12g/\x6\x30\xa6\"\x15\x86l\xacw\x8fx>\xd6\xc2 {\x1a" +"B\x95wC\xe7\xa3k\xf7\x10\xd4\xa3\xe5\x6>S\xd9$\xe9\xb9V\x82h\xfc\x30)\x13\x10\xa5" +"\xf5[\xc7r\r6\xf2\xa2)I\xedo\xa9\xfc\xdc;'\x5\xa3w\x8e\xfbz6\xe4\x12%\x9e`\xbP\xad" +"\x95\x9a\xc1}V`\x8dm\xfb\xd6\xb9ZuM\x7f\xd5\xdb\xc8\xc6\xf6\xc7\xdb\xc7j\x1c\xf2" +"\x9a\xba\xba\xff/U%\x14\xc3\xb4\x46\x9c\xd9W\x9a\x46\x99=\x1b>\xca\xd5?e\xc8}P\xd5" +"\xcf\x33I\x95n\x83\x39\xe6\xdb\x3\x80\xa0\xd9\xc1\xf7\x1fZ\x15\x1aG\xb\x7\xae\x87" +"\x81s.\xa4\x88]1)\x18\xa7M\x84\\\xd1\x8f\xab\xec\xf6%>\xfe\xe2\xec\xc1\xa3+TE\xed" +"w\xfb/\x98\x8fgF\xfb\xeb%\xbb\xbe\xd1\x63\xea\x44\xe5\xcd\x4\xa3\xc7\xd1TL\xf4\x18" +"\r\xbf\x44\x8j>_S\xa3\xacq\xd6\x2\xc0W\xe9!\x1d%\xc7-\xf3thsN\xa3`\x1b|F\xc4\xbf" +"\x2\xf0r\xeb\xdc{\x91\xb\xbb\xab\xa8\xf0T\xc7g\x18\xd2|U!\x16\xda\xd8\xd2`\x6\x35" +"\xba=\x6\xd3mQ\xf9\x14\xd0\xce\x9a\xe6\xffk\x99o\xf3\xbe\xee;\x5^\xf0\x44\x33\xa2" +"\xeaV'^\xa8\x37\x30\x1e\x9f\xed<\xf0\xf6\xfb\xfb\xd7\xf9\x1bW\xf8^G\x8b\xcf\xe2\x66" +"F\x89\xbd\x1dVG\xa8\x0\xda\x91\x9ep\x7\xe5\x1e\x18\x35\xd9\xe\xd1\xd6\x12G\xb1\xcf" +"s$R:\xa3\x3\xc8\xf4\x31\xdd*\xb4t\xcf%\xa4\xca\x90\x8fV\xd9\xf7\xedu\x90\x91\x6." +"q\xfa\x43\xa7\x8e\xe8|%\x91+E|\xc4qL\xa5U\xb:\xf9\xf3\xb9\x64\xd4,\xc8\xfe\x83\xc4" +"O\x18\xad\x5[Kof\xcc\xa3\x95=C\x4\x13P\xed,!\xf9\x1f#FX\x11\xfcq\x1c\xe0x\xd4\x13" +"\x6\xec\xc7z\\<\x97\x33\xc6\xd4\x11\x42/\x2\xa1\xcd\x89\xf6\x8d\x91\x33\x1d\xadv" +"q\x1c\xdfR\xd9\xb6-D\x2\xf1\xa1\xe0\xf\x9c\xa3@w\x14\x30\xefT\xa5R\xed mi\xca\x42" +"\xb7\x9eR\xfaW0\xe4x6\x9e/\xc8\x8\xe5\x99#\xd8\xfd\xa9\xf6\x1aYX!\xb\xfe\xd7\xd6" +"%yr\xe7R\x9c\x8f\x15\xc4\x1/\xc2\x8f-\xd6\xb4\x1e\x82\xee\xc7\xd8\x5\x8a\x83\x91" +"h\x19`\xa4T-D\x1c\xb3\xaa\xd0\xf2\x42\xa8\",\xe\x1f\xd8G\xb1\xf2\x8b\x36V\xbb\xc2" +"~\x84\x4\xb4{\xe4\xc2\xad\xce\xc6\x30\x6\xdd\xba\xe4\xa2\xc5\xb5\xd4\x1d^\x3\xe\xfd" +"\x88\xcc%(,\x4\x7f\xc1}W\xa7\x8;\x95\xec\xa7~\x9b\xc8W*Gj\x1fY\xb\x80[4Q&M\xd2\xcd" +"S\x83\xa6\x92\xffH\xc1\x42\x14\xfa\x9\x64)m\x9c\xb1\x16\xee\xaa\xe9\xdf\xca\x13\xb8" +"\x5\xf2\xbb\xe2\xc5\x14\xd5\x34\x80_\x82\xc1\x91>\x85\xb9V\xa7g\x15\x9d\x85\x98s" +"`\x1d\x9)\xcd:\x4\xbaq\xe2\x6\xf|\x16x\xe8\xa9\xae\x44\x9e\x93[\x87\xbb\xb8\xceL" +"\x1\xd7~\r\x15\xc3\xaa\x7}\x98\x19\xac\x95\x41\xc4==\x9d\xe2|k\xb8\x65\xf2l\xd0\xa5" +"\xdf\x8e\x87\xc9/f\xd8\xbc\xbd\xa9;hm\xf8\x18\x14\xbe\xcb'\x1f\x44?R\xfc.h\xef\xab" +"P\xa6\x84\x88/Z\xfa\xe7J\x1-+\nC\x8\x31.\xbcj\x9c\x99\x61\x64/S\x95\xe\x90\xcd\xa1" +"\x2V)\xc5p\xebQ\x19\x80\xb3\\V&\xc1\xaf\xc3@\xb9\x9f\xed@c\x97\xed\xff\xee\xde\x32" +"\xf7\xab\xec\x18$\x97\x10\xc2\xd8\xe3\xe1\x9a\xa0\xd7Vc\xaf\\\x17\x37\xc8\xf3^\x85" +"\xd8\xba\x7f\xdf\x2\xa6Mj\x5\x1f\xf8\x64]\x91\xda\xb1\xa7\x2\xc9V\xb5(\xe0\xd6\xd9" +",\x89\xbcU\x81\xeek\xb3ug#\n\xe0\xd7X1\x7f\x66?\xb4w}F\x1e\x98\xa1\x97\x33\xa1\xd3" +"\xc8N\xc1\xc9\xc7\xfe\xd0<\xc0k\xef\xb\x8a\x6\x8d\xf4\x45\x16\xd0\xa6~\xd1\x97\xc8" +"$\x7f\x8f\xa1y\xd2\x1d\xd1\x41\x34\x9c\x64\x7\xed\x42\xff\x1f\x33\x31\xbbT\xa3\x11" +"\xb5\x9c\x93\x30\x63\x9\xdc)d\xa3Q*\xc0\x1e\xd1\x65\x98\x9aKt\x10%\xc3\xc2\x4\xe7" +"\xb1\x35\xa1\x88\x42\xe2\xeb\xb4\xf6L\xf6\x63\xc8\xe3\x17v*\xbe\x99\xb8\x90\xeb\xc3" +"\x1a\x1e\x86\x1c\xed\xef\xb4\x94\x1a\xcb\x64\x42\x36\xbf\x37;\x11=K7]\xdaV>)\xd3" +"7\x3J\xfd\x2\x32\xf0\xb4\xfc\x80Q0$\xc\xb6\x1fV\xf6V\xbe\xb2\x37\xde\xcd\x9d\xb5" +"\xaa\xc7\x43\x1\xf1\x31V'P\xb5@\xccKz\xa6\x1\x45\x45\xcb\x85\x38rU\xe\xa0\x42\xca" +"\x81\xf5\xc\xfa%\x1a\x8a\xbcw\x89\x81\x5\xc6\xef\x10\xc\x84\x9_\xaf\xd2\x1eQHw/Y" +"\xb5!\x7f\x9a\xdf<_\xdc\xa1\x8b\xda\x91\xf6/\xac/.\x1f)\xef\xd2Zx\x18X\xc3]\xe\x9f" +"\x18\x9b\x87}\x5\xd8\xa6\x37\x63\xce\xc\x80\x39\xca\x8\xb4\xc7?'\xa6hD/]\rlV\x7f" +"\x9d[\x15R\xa1\\\x45\xeQ\x88\xf7\xe\x33\xbd\xde\xf0\xd2\x0 \x8\x11\xc7\x81>\xaf\xb9" +"\xad\xfd\x82\xf5\xcf\x85\xf8<\xc2\xbe\xf6\xcb\x1\x97\xa1\xe7\xdd\xa4\xbc\xfa.\x92" +"a\xa3%\x9f,\x14\xf2nf\xb\x17K1\xe4\xae\x8f\x42u=u*\x8f\xdd\x0\xcd\xeb:>\x88\x88$" +"w8\xa6\xf7\x7f\x8a.\xd4,\xa1\x9b\xfeg\xf4\x88\xd8\x93\xc7\x32\xf2\x19\xac\x1c.\xed" +"D\xe5\xb4\xe3\xce^a?\xcb\x8ex\x96^\x9c\xd3\xc5\x38&G\x11\xbd\x8f\xc3\x9d[\xad\xb6" +"\xdf~\x1\x19\x9e\x9e\x38\x37\xdc\x31hHv@\"\xb8\\\x36\x41\x1b\xab=r|UI\x88\x83p/^" +"k)y8S-\xb\x0\xc8\x9co\x11{$\xde\x43\xee>\xa0]\xb5\x90l\xc}i3N\x0\x1a\xa2\xe7Y\xe3" +"J\xa7\xbb\xab\xde\x81\xfa\xd7|01\xb5\xb9\x62\xb2:\xc6\x9d\xf5=\xd7\xc2\xc3\x2?\x84" +"\x1c\x17\x2{\xb6\xed\xe6\x8d\xb4\xaf\x1d\xd1\xc2\x38\xe1\xc8_W\xfa\x15\xa7\x89\xbe" +">$\xea.\xbf\xdfl\x13\x65\x90Gq\x92\x8\x85l\x4\x45\xc4-\xb3\xc0]\xa7_\x83\x14\xd4" +"(\x7\x2+#\x94\xc4\x90\xa3\xa0\xb2\x46\x43\xcmp\xed\x9e\x61\x2\x90[\xd7Y~\x9c\x86" +"I2F;\xbf\xc3\x38)\xa7\x18t\x1dK\xf6\xde\x8c\xf9\x39\x3\x63\x9c 4:_\xca\xf8 Zf\xd9" +"Y\xbe\x1f\x39:\x1b\x90\xc2\xea\xef?\xf2\xfg\xeb\xe3\x13\x9b\xeb\\\"\xa8 ^\x9e\xb6" +"8\xfd\xe2<7\xd8Y\x1aJf\xeb*l\x85|Z\x1e\xf9\xf\x6\xfbyGa\x93S/d\xadZ\xee\x17U\x1d" +"_4\xbb\xf7^\x18\xd2G3?\xf6\xf0\xb5\xd0\xcc\r\x10G\x92\xd2\xa6I\xe6-\xf9\x13\xb1\xc2" +"\x1c\xd6\x90\x9c\xd9\x3:E\x11\x87\xa0\xdb~<\x97\x19,\xe6]\x6ZU\x8d\xe7nM\xbc\x98" +"}\x92\xccI*\xb7\x91\xf0\xab\x65\x32\xc7\xf1\x45\xf9\x30\x66\xc2g\x15\xa1[M\x6\xed" +"uo\x17\xf6sS40b\xea\x9(\xd0\x8d,\x11\xf7i\xc3\x88\x30-\x0\x6\x43\x1b\xbf\x8a&\xfe" +"\xd4\x9d\xe9\x6\x1b(\xbf\xb0@\xf7\xf2\xcq\x82`\n\xd8\x46\x0\x15\xe6\x96U\xc0\\\xfd" +"j\xf7\x5t\x8b\xef\x83NM\xfc\xe6\xf8\x8e\x9a\xc4\xa6r\xbd\x63\xc7\xeQ]\x0\x32 \xb0" +"z0\xe0\xeS\x3\x82:/\xdf\x86\xaa\x30\xb8\xc1\xf7\xe1U\x88\xf3\xac\xc1\xf5\x2X\x94" +"\x1d\xe4\xcfi\x8b\x42\xe8<7\xf8(\xd4\xd7\xc4\xf0Z\xeb\xf4\x1e\x8d\xb6\xf7=\x19\x5" +"v\x8c\xc4\x8e\xd0\xcaY\x4\x9b\xd1\xfb\xe4m\xa6\x87P\x9R(\x3\xde\x13\x96\xec\r\xf8" +"\xdeV\x1e\x1f=\xb2\xf3`\x1d\xa2\xf9\rG\x19Q\xb3\x92\x44v.Kf\xfe\xd7\xd4q=\xfe\x41" +"\xa0\x30\xba\xed?\xd7\x85\xb8V\xfe\xa6\xb1\xb5\xab\x85\xf5V\x94\xb8\x8bO\xd7\x31" +"\xce\xa4\x35\x45\x39\x8b\x9e\xae\x1du\x8c\x35.\x87\xf5\x32\xb1t\xfbu\xa1\xae\x1e" +"\\\xa5\xd5\xf9\x33L\xc4pM1c\xf3+\xcc\xff\xb0\xf5\xe\x4\xcb\xa9\xa2\x91\x12:'o4\x83" +"\xab\x90l\xab\xc9\xe4=\xe1\xf6.\xec\x4\xfa\xb3\xde@\x98\x83\x64\x9f\xa1\xba\x35`" +"\xc6]\xda\xf0\x84Z\x1dZ\xe9\x63\x37\xad\x96\xbd\x64m\x8c\xfa\xe4\xf9\xd4\xb7\xb8" +"7\x6nb\x16\xf9J\xf8\x14i\xca\xf8\xc2,\xac+\xdd{\xd9\xb5\xc9L\xc4q\xeb\xca+\xa9\x90" +"\xfa\xd7\xf2~\x3\xb0\x9f\xbe\x86\xfb\xe3\xcf\xab\xf4kZ\xcdY\xdf\xb4\x36\x16\x8fK" +"N-\xca\x9e\xf9W\xa6~\xc9\x86\x43\x8a\xcd~\n\xa1\xc\xe6j\xbd\x32\xc9\x88i)\x9d\xba" +"E!\xdf\xe9\n\x8aw\xd4\x8d\r\x8e\x43iV\xc3\xc8\xba?s\xb4r_uw\xb7\xbd$\xe7\x8bn3L\xb8" +";@V\xc1\x99\x17\xd5\x45\r`r~\xa7\x85\x9e\xfejIn|w\x17:\xc`\x96\xci\x9dK{\x99\xe5" +"%J\x83\xdb\x0\xc3\xb8\xc2\x8\x14\x9b\x80\x0\xcf\x30\xbd\x45\xeb}\xf7\xc8\x31\xfd" +":\xd2\x35^\xef\xdc\xdd{\xbb\x62\x0T\xa3Uv:C\xee\xfa\x17\xe0}\xc6\x6\x9dV\x7\xc0\xe5" +"\xa0RY\x86\xd5J\xe9\xbel\xb3y\xcd\x84\x11\x14sJQ\x9O\x9b\x45\xbaj\xa6z{Z\x97\xb7" +"\xbfx\"lj58\x1bPE\x97\x39\xf3\x4\xb7\x33v\x1\xc4Z\x10h\xb0i\x5:\xaal=\x98\x42\x2" +"\x17\xa5\x32\x63\x65\x7\xcd\xc7\x17\x1d\xbb\xf0O\x18\x32P0%\xa8M\x10\xcf^\xe6n\xc1" +"\x87\xec\xa1\xcc\xe4R\x98\x8d\x63\x1f\xf!&np\x7f\x8\x90\x10\x16\x16]h\\Evg\r\xc2" +"\x1a\xf\x8\x16u\xafw/\xdd\x46\xb1#\xf8#C\xae[e\xae\x45\x18\x9f\xb9\xc5$d\x90P\xb3" +"V\x84\x89RJ\xd8\x34\xd4UD\xb&K\xbf\xb9\x8f\xf1\x83Tt\xcd\xd9\x33\xb3\xcf\xff\x87" +"\xd8\xcb\xb2\xb0I\xb0R\x9f\xc0\x98\xabj\xd5\xd1\xed\xad\xff!\x87u\xdb\xcd\xe8\xb8" +"\xaf\xb=\xc2\xb\x64\xf9?\xf3i\x92\x8c@\xb8\x62\xad\x44\xef\x9a\x42'\xf3\xf1\x38?" +"\x9d*\xe6\xeaU\xcd\xb0\xa2NP\xaf\xf0\xf2\xd0\xcbv\xa6\xfcYX\x0\x38\x80\xd0j\xc7\xe5" +"\xe7\x97\xf9\xd1\xfd\x99M\xfe\x84\x62\x1a\xfb\x7\xa5\x9d\xc1\x1c\xc9\x1b\x95\xb5" +"\xd3\xf7\x9f.P\xba\xdc\x86&wJ\x1d\xdbL\xa3\xe8)\xe5, LK\xcf\x99\xdd\x85\xb8\xb5\xed" +"\xea\xd2P\x12\x14\xb9y\xba\x35y\xbe\xb0QEr\x9e\xf9\xd7\x86\x9f\xc4\xb3\xd8\xb1) " +"\xd5\x12\x9f\xa2\x8a\x43T)n\xd7\xb1\xe4\xcf\x1e\xf3\xae\x94zY\xfc\x1f\xdb\xb5\x37" +"54\x9f\x85\x66\xd0\x1f\x82\xe7\x9d\xfa\xf\x90\x98?l\xbf\xe2\x44\xb1\xa9\xc0\x83\xd0" +"\xde\xd2\x42\x1e\xcc\x1d\xe0\xec\xc3\xc5\x37\xb0z4\xa7\xf1\xa5)\x1d\xe9\xbe\xbb\xea" +"B\xe2\xf6\x82\x0\x8bp\x88\x12\x9e\x46<\xc5\xec\xb5\xbb\xea\x8d[\x1d\xe8r \x94\x46" +"\x90r\xb\xf9j\xd6#\r\xc7\x8\x43\xa1\xbf\x15\xe\x37\x35&\xcfU\x9\xda\xf3\xea|=z4\n" +"\xf5\xd4)\xdc\x18\xfd\xb3N\x8c\x12\xe4KCM/\xe6\x63<~Q\xd0\x38\xf8\xe5\x65ZS`\xb8" +"[\x9d\x38\xc\x9d\x8d\x42Wj\x9c\x16\x94\xa6`h\xce\x66K\xcc^\x9e\xc4\x8f\xb5\x7\xa3" +"\x11z\xf1\xc2\xa1\x61\x9b\r\xd8 D\xb3\xc4\xe8Lou\xe4\x7\x9\xdc\x14JP\x8a\x41\x1c" +"-\x9f\xd1\xc4UJ`\x89+\xb9\x0\x13\xab\xb1\x61\x89\xe4\x8c\xf1\xd3\xc9\x45\xc8\xb5" +"\xcaKln\xe7@3\xd6\xb8\x9d\xa0\xe2,\xf2k\xa9H\xa8\xc2`\x92\x9[\xd4\xa0\xf\x66\xe1" +"\xcc\xd0\"\x41\x92o\xe2\xae\xcd\x14\x65\x89\xdb\xc3\x17\xa5\xa7ytE\x9axxFz\xe9_<" +"\xaa\x46;\xac\x4\x33\xf6:W\x8b\x4\x62\xa1(\x18\xa1\x4\xc5zO\xb2\xc2\xcaN\x89\xf6" +"\xb4{\x87+\xfax\x5\xa5`\xae\xab\x17\x85\xf3\xe\x83\xa4\xabrQ9X\x10 \xc8\x10\x6\xc7" +"\n\xe4\xd0\xfa\x11}\x8M\xa7\xe7\xb6\x65\xac|\xd4\xbe\x94\x9b\x37\x1\xdd\x8b\x38s" +"\x10\xa8J*|a<\xb4M,\x84\x18i\x8bS\xcc_\xe9\x1b\xd6z\x19\x33\x37\x9c\x99\x9kS\x89" +"\xb9\x8d\xda$LN\xb\xb7v\xfe\x61'\x97\x8a\xba\x66R\xbb\xdb\xc6\xb4\xc8\xc4\x81\xeb" +"\x8f\xdf\xb9\xd8\x32\xa9pX\x6\x86\xbc\xb7\xe9z\x1f>\x9e\x98\xb0G\xea\xce\xc3{\xc8" +"\x10xQr\x1f\xf9\xa8?\x9e/\x9e\x62\x31\xe2l\x98loJ\xcdwf\xa6\xe3\xab \xfe\xe2ihkY" +"\xdaiCO\x1bG\xcc\xbe\xcb\xad\xab\x81p\x6\x92\xc5n\x8b\xcc\x5#6\xc0Q\x0!\xbZ/~j\xfa" +",\x8d\xc4\xb6\x85\x12\x90\x16\x42`\x2Ww\xa4\x93\xf5\xdez\xe5M>\xd7k\xcc\xb0\x8@\x3" +"\xeb\xb5\x45\x64p\xb9V\xca\xe5\xb4\x99\xaeXk\xcf*\x7\x80Z\xb9\xdew6\x1a\xf5\xfb\x44" +"\x8f\xb8\xbb\xd7\xd7\x1c\xf1\xb0H0\xbe\x43\x82w\rA\xa9\x9e^\x9\x8z\x89\x64$/\x91" +"\xbf\xae_\xf4\x39\xefS\x19L]9\x80\x1a\xf0!\x9bi\xe2\x66P\x10\xd9(/\xc6\x89\x8a\x8f" +"\\\xb1\x88\xee\x9f(\xf\xc6\xba\x62\x66\xe7@\xc5qO\x81\x36\x87\xdfT\xedz\xe\xd2VX" +"\xef\x9d\xaf\xec\xa9X:\xc9\xde\xff\x89\xf7\xc3\x8a\xb4P\xb5\xe\xcf\x17N\xaa\x4P\xf1" +"\xa4\xc6m\r\xd8\x1b\x8f\x1b}\xd7\xd5(\xed\xca\xa2\x8c\xdb\x10\xbeQ\xc5,a\x9f\xad" +"\xef\xf3\xf7\x9d\x9fI\xfbX^\xb5\x18\x2P\xda\x39\r\xce\xfa\x8f\x16\xe2\x84\xea\xe4" +"\xc9\xd9\xa2\x36\xb2\xc0\xbb\x33n$P\xbdwz\xe7\x11\x5\xad\x93\x92>\xb0#\xbd\x42\x2" +"$\xa3\xa1n\xfe\x6\x64\x33*\x9f]\x4|\xaf\xdd\x8\x82\x1rB64\x1b\x14\xd1\x8a(\x8b\xe5" +"\xb2\x41\xa8\xa4=i>\xf5\x16`\x6\x44\x8d\xbaz\xa5\xb8\x99\xdcvW\xa2\xf8\x63<,A\xcc" +"\xa9\xf5\x63\x99\x98\xc9\xb0\xb5\xc6\xd7\xb2w\xf9\x81Oi\xa0\xb8\xf7\xbfgK\xb2\xb3" +"\x12p\x93\x37\xe\x94\x9b\xe7\x1a\xfe\x30\xd1P\x1b\xf7}6%\x1c\x9\xb4\n ,\x8dk_\x19" +"\x91\xdb\xfb\xe7\x63\xe0`\xdd\xda\xbd\xf6\xa5w\xc2\xd6\x88\xab\xffx\xd8\x63\x34\xc0" +"\xec\xc0mm\xb6i\xc5H\xf3(\xfVP\x85\xaaL\xfa\x9^8g\xc6\xfd\xbcm\x4\xfa\x93\xbby]\xff" +"J\x16\x35t\xeer\xf2\xff\xd8\xfd\xc5\xe\xb\x10\xb3q\x8b\x17\xb1i$\xcf}\x8d\x32\xe1" +"u\x13\x1c\x8c\xc4\x87\xf7z\xe\x8c\x9c\x7f\x9dZ\xf3\x97\xb\x63s\xcf\xadZ^X\xd4\xa6" +"\x92\xa4;\xba\xd6T\xbc\x61t\x9d\x98\x19|\xfb\xba\x93\x44\x64\xbcx\xa7\xfe\xe6/\x8c" +"5c\x4\x87\x41#z\xdbw5\x9#\x87\xc9\xaest\x4\x94\xedy\xf5\x0\xc8tsvmLf5}|x\xe1\xcc" +"\xc5\xb1\xdd\x3\x19\xaa\x66\xc7\xb9\xe.\\\x1c$\x88 \x86\x1e\xd5\x37\xd7\x90\x95:" +"\x9c\xb\xb3)\x14\xb0\x19\"\xf1\xceuu\xc4g\xb3xp\xcb\x66\x62(\xe4\x2\xf\x98\xc8:k" +"\x94N\xa0\xd0/IX\x1fhL5Gf1-z\xf3\x39\xd4\xf8\xa7Y\xed\xc\xfc\x91Vs\x7f m\xacp\xab" +"CUOl\x11z\xae\x98\xe4\xc4\xc8g{\xe2\x87Q\x4\x8e\x86\x39\xc4SN\xab\x38;u\x94|Y\xf6" +"\xc6\x1a\xad\x10\x10/*\x9d\x7\xb7\xf8\xfa@\xcf\x8c\x6g\x8f\xb8\xc4J!3\x91\xcdv\xda" +"\xf8-\xb6\x1b#c\xd5\x16\n\xe3\x45\xb2\xf5\xdb\xd0\xca\x96i:\xd1\xd6\x65\xf2\x97\xef" +"\x96%\xe5\x1dX\xad\xea\x39\x1\xa0\xc2\x64m?%\x0\x14#(18\x10\xbcx\x1c\xf1\xd1\xdc" +"t\xc5\x1e\xf2\xeaWm&\xaa)\x89\x82\xda\xbfSq\xe1{\xe8Ue{\xa1Z\x19\x7\x46\xe5\x86\xb0" +"Lz\x1e`\xdf\x89m\xd8\xdcw\xb6\xcd\x1d\xc2\xbd\xa2\"[\xab\x8dT\xb5>\xa4\xb0\x1c\x13" +"{!\xb\x8a\xc0/\xfaMZ[\x1d\x1f\x95\xba.\xe0$\xee\x17r\x80\xc2\x5\x0oS\xbd\x35I\\\x9b" +"\xb5\x14\x64\x9e\x1bH\xed\xcb>'\xc3\xae\x4\xf4\xef\x8b\x81/\x13\x63{\xe6N\x13Ut\x13" +"?\xc2\xc4%\xdd\xeb\x38&\x10!\xdd\xbc\xde\x93r\x15\x9fMc\x19\xc3\x1a\xda\xd4\xdc\xbc" +"Y(\xaeh@:\xc7\xd2\xeb\xfd\xde|\xbf\xdf\x90's\xe9\x9f\x89Z\xe1T-\xf9\xba\xe5\x9a\xea" +"x\xeb\xe1\xaa\x43\xfc\xde\x9f\xf2)e\x9e\x9d\xbe\xaf\xabq\x14o\x12\xffz\x17\x92\x42" +"\xa3\x1bi\xb4\xd8.\xc7\x63\xa9yn\x96u:\xa8\xb9\xd4\xf\x63\x4\x31\x96\xba\xa2W\x4" +"n\x13_\xb2\xff\xaf\xfd\xb6\r\x1\r\xe4;\xb2 h\xf6\xaf\xe4\xc3\xbb\xef\x8bm\x13\x44" +",\x84T\xc0\xd6[\xe9:S\x11\xdc\xfe\xf6\x7$\x12\x15\x86;\xe2\x2\x8a\xf6\xec\xb3V\x17" +"K\xfd\xe7\x32J<\x9d\x80\xc9q\x17\xcd\xb1\x14\xd1\xed\xfb\x8a\x38[7\x89\xe7\xcf\xb7" +"AP\x95\xb6\xda$i\xfe\xedS\xbf\xc5T\x12\xa2\xef\x7\x0o\xe1\x1e\xff\xf0\xde\xbe\x15" +"f\x6\x82@\xfe\x1e\x66\xbc.\xa7\x38\xe7\xb7/\xfa\x8\xd9\x63}A\x94\xccK]\xef\x32\x8e" +"\x90\x65\xb5|3\xdbh\x87\xfc(\x16\"\x3\"\xc\xd4i\x1b\x8e\x8c\xdc&\x86\x9cI\xef\x34" +"\x1aq\xb4\x1d\xd8Q\xe0\xa7\xe7%V\xbb\xff\xcc\xab\xc4\x96\x1f`\xbc\xe2\x15\x9e\xcb" +"\xf1.\xc4\xe3\xa3QB\xbb\xb2\x9clmX\xb2\xc6\x44\xda\xb0&\x16*\xfe\xd9\xe2\xbc\x93" +",c\x9c\x9a\xdc|\xbf\xb3\xdd\x15\x1f*8\x97\x46\x7v\xa4\x64\x1c\xd4\xcaP5\xfc\x45\xa0" +"m\xf4WK\x90\x1f\xf5H=\x8r\xcb\xb7\xbb\xceM\x19\x46\x2\xa2}8{@\xb3\xbj\xbcr\xc7\x9d" +"'\xeb\x36\x9b\xae\xa9\x99\xf2 @QJ#\xb3\xfc\xfe\x86\x39\x92\xef\xbb\xf\x88(\x9d\x66" +"\xed\xd3\x9\x65\xd9',l\xf0\xd1}\x1b\x1b\x16\xc\xbb>\xcd\x1d\xab\x7f\xc8\xfb\x30\xae" +"1\x88\x82\xe1\xf3\xd8\x41\xa9\xad\x8d\x65\x84wt\x8c\xfe\x36|\x1e\xb8MA\xe0SH\x7f" +"\xae\xbc\x18\xb2\xa1\xa1\x97\xcfH\xe8\x11\xfn[\xc0\xbe\x80\x65L\x7f\x14\xcb\x2h\xb5" +"\xd4\xf0\xc5~\xc1\xbd;\xa6\x36Lp\xfd\x44O60%'\x84\xf5\xfe@\n<`G\x10/e\xc5I\x8a\xd6" +"g\xb9^%N\xbd\xb0\xbf\x64mF\x99\xc1=\xbc.\xb4H\x8e\xd4\xe0\x8bw,\xbf\x1d\xaeyQ\xa8" +"\x19\x38+q/\xb3;\xfc\x34\x13\x8d\x10\xb1P\x7\xfe)\xaf\x41\x42t\xbc\xc2\x84]\xda\xaa" +"\xaehh\x80\x15\xc1\x41\x80\xc3\x44\x98h][\x1e\xe3\x16`\xb7\x62\x19\x12\xb1-\x88\xfc" +"V\xf3\x9d\xcf\xb3\xeb^\xdd\x8fL\x1f\x64\xa0\x8\xd4\xb9\xcfH\xdc\xe4\xb6P\x16\x80" +"\xf7\x8\xd6\x9\x9\xcb\x18)P\x89\xb0\xb0\xc\xf5\x9b\xb6\x8c\xa7\xae\xec\xe2k\x1c\x16" +"^r{\xde\xe\xc2\x15_\xb7\xf3\xc1\xb6\xd6\x46\xc7Q\"\x86n\x9cyS\x95t\xc2\xc4\x9e_\x4" +"\xa4`\x17\xa2\x99\r\x88\x46h\xc1nWA\x86\xee\x44\xf4\xfc\x33\x9e\xa2\xf0\x10\x88\xf3" +"\xed\x31\xa4\xd4S \xbd\x10\xd9\xcfX\xc7\x1e\x8d\xa3\xd4GQw\xbd\x5n#]R5hqT\x96m\x8b" +"B\x87\x8f\xa1(\x91\xda\x91\xab\x87v\x1a|\x7\xe\xa7Q@\xe0\x39\xcd\x8b\xe4\x1d\xb3" +"D9\xd1\x7\\\x8d:y\x90\xf9\xfa\xc5V\xc0[\x6\x7\xa7-\x14,\x84K\xaa\r.\xf7\x32\xfa\xd3" +"\x81\xd2\xe4\x61\xc8\xb1\xd3\xe8U\x80\xba\xd0\xc2P\x81OU$\xdc\xf3\x38\xfa\xea\x1a" +"|a\xc3\xa6\x18\xf1\xae\x94\x89\x1a*/P:!\xb3\xf0\x14n\x17\x95\x17\x88\x98I0C\x91x" +"\xcc\xcaY3\x83\xba\xa4J!\x3\x95\xeb\xa8^m(\xc2\x37\x82\xf1\xc6Q\xa8\xe8\xb4\xd7\x80" +"\xb7\r\xcbN\xaa\xde&\xd6=\xe3\x17\xc1\n\xc1\x8b\x93#\xeeL\x86\xf\xe6\xf6X\"\x19%" +"\xb4qUi\x7 \x9e\x81\x94\xaf\xf8\x99Mc\x8t\xb8\xf8\x1iR\xe9{'\xfc\xaaNuQ&\xc3\x15" +"\xc2\x8ey\x2V\x1d)\xc2\xa7\xf5\x86\xda\xf4xg\x2\xc6\x17\x65/nn\xc6w\x8a\xb5\xd0M" +"\x8eI\x1e\x6`\x13`\xb8r\xfa+\xc1\"\xed\xf6l\x18\x9\x37n\xebK\xcd\x17\x85\xd1i\x85" +"\x14\x5J\xf5S\x5\x9e\xd6\x1\xff\xae\x5#Q\xe9\xfe:Ej,\xa1.}\xd1\xa7\xf2\x3*5HL\xbe" +"\n\xa4\xa8\x32\xaf{\x9bj\xfdM\xbb\x80\x96g\xfas\xf9\x1fir\xf8\xcfH\x97\xbb\xbbv\xa0" +"\xb0\x61\x5q\x16\x80\x11\x87[y!\x88\xb7n\xfenk\xf2slL\x8ftV6\x84\xa5\xa8\x34\x39" +"\xc1\x1e\x8\x94\x34\x9c\xcd\xfb\xa8Z\x97\xc4Z\xa1\xd9\x89\x46K\xa2\x1c\xe0R+\x8b" +"r\xfa\xc4\xa5\x66\xda.\x2\x93\x65\x11\xf2\xc5\xc1\x1a:\x9aR\xe0|\x89\x1d>\x94\xd3" +"\xedK\xbd\x1b^\xb3\xf1h\xe3\x2^\xeb\x8d\xe0>\xd1\xab=\x80\x39pv\xb2\x10\xd9\xf9\xf2" +"\x14\xf8\xba#\xd1\x35\xd4\x9fq=K\xe5\x8b\x1g\x18}%HWbb)\x2\x8a\xbc\x8\xfb'\xfe" +"*!\xf9r\x5\xb\xf2\x91\xc2\xc9\xe8W\x9d\xc3\xd7\xe7\x9c\x31\xe\xe7+J\x8c\x61\xf5]" +"\x8f\x95S\xe9\x1d\x61\x6\"\xac\xc8\xbc\xf8!\xf9\x43\xe7\xde\xb\xbf\x8e\xf4~\x81\xd0" +"\xe\xbd\xdc\xd9 7+\xe4\x61\r\xe3p\xb4\xd6;x\x0\x18\xdd\xb4\xc8\x0\x88\x18#\xba\x11" +"\xfe\xff/\xea\x80#]\xec\xb3\xf2\x12^\xc6\xe9\x41x\xcc\x13\xdd\x87\xbe\x8c\x93We\x89" +"\xd5*\xa1J!O\xb4\xe8G;B\x9b\r@s\xa5\x63\xc4\xa7\xd9s\xff\x36><|\nui\xd4g%\x18\x91" +"/\xa8\xad\x98\x64\xb8\xab\xdc\x8a\xc9\x15{1\xf3\xf3k\xdd\xa1\x9(\x9\x61#\xfd\xd8" +"\xc1\xe2\xbd\x1dK^\xd2\x9c\x1a\x46\x19%j\xeb\xbax(l\xdfG\x95\xb8\xc1\x1d\x95\xdf" +"+C\xc2H\x1c#\x88\x3\xc4\x3\xc3\xc9\x91\x6\xc0%\x37.\xce\xbd\xd1\xdcw&~w\xe3\x1a+" +"\r\xa0\x83)w\"\xa8Ww:'\xd0\x35\x63\xd0\x1c\x1f\xfe\x63\x19\r\x63'\xf1_G&5$E\x8b\xfc" +"\x6\n\x84\xdf\xe0\x1a#\n\xc6\x7f\x14$\x5\xedq;5=\xcf\x88\x5\x81\xbf\xd0?g\xe7;\xc1" +"r\x1e\xbb\xbd{\x9a\x81\x65\x98L\xc9\xb9v\xe3\x1_r\x0\x11\xcvD\x8d,\x8\xdbg\n\xc3" +"Kx\xad\x8eyq\xae[\xa8\xc7+\x2\x17T\xe2\xff\x6\xbd`~E\xb0\x5\x46\x98\x8e?8\xb3=\xe9" +"\xa4j\xc9q\x10\xd0\xe3.o\xa5\x66h\xa6\x7f@\xed\x84w\x96\xebKx\xb9\x3\x14\xaf\x95" +"\x88\xdf\xe8\r\xa2\x37\xa1\x15\x4\x9d\x4\x8eUI\x8c-\xf7\xfe\x31\x32-\x1e\x8d\x13" +"}\xc\x93!C\x8a\xc4\xc8\xeb\xe7\xcd\xffiS\xd1\x8a\xd1\xc2W3\xd4\x3Q\x16\x9e\xe2\"" +"_\xcd\"Z\xb1\xfc\x4\xd7\xee\xcc:\xe6\xee\xd0\x44\xc6#~\x9d\x88z\x19\x19\xdc\x94\x97" +"\x8e\xaa:\x1e\xac\xcb\x46\x7\x66O\xd1(\xd5\x8fH\xcfI\xd3>\xbf\xca\xc7\xbd\x30\xc4" +"\xad\x14md42\xf7\x9a\xadT\xaa\xb6)\x12\x13`\x85\x98\x88\n\xc\xd1Uv\x90,h\x9cSZF`" +"\x9d`]8\xa6M\x80\xbb\x0\xf4\x8cQ\xa6\x7\x17\xf5\xf5\xdd\xd2\x9f\xfd\xd5\xb\x10V," +"\xa6reo\xe3p\xb9l`}\xc4\x97Ys\xf9,5\x83\x82\xb9L*\x4\x8b\x63\x36\xa8!\xchuW\\\x8" +"\xe2\xc\x2?\xf3\xa5\xc1'\x10N\xab\x17\x6\xe3'\x7f\xcf\xcf\xe8\x6\xce\xf2?\x8eL\xf" +"V\xb1\x91\x99X\xa2\xdf\x6\x9a\x1R\xadW\xc\xe\xf8\xf0\xe3\x85tQ4\x15n8\xac\x65n\xcf" +"\xa1\x61\x98\x93\x66\xcd\xd3\x38\x41\x17\x82\x63P\xe\xff\x95\xe2\x9\xee\x41Y\xca" +"\xc1\x86\x35\x7f\x1b<0\x88ON\xd0\x3\x8\xa8\x36\x6\x63\xd2\xb\xf5\x85>]\x9aY\xf\x38" +"\xa0\r\x98\xd7\xe2\x8e \x8f\x34\x2\xd4\xa0\xc4\xea\x38\xb0\x14\x83\xaa\x42\xd9\r" +"\x10U\xf0m,\xe7\xf4\x30\x98\xde\x1a\xd9\xc9\x66\x95\xfeP1\x95\xda\xdf\xc\x97\xf4" +"a\x89\xbdY\xfci;\x2:\x14\xc3\xe0\x88\xa5\x41_2\x19\r\xd9\xae\x46\x9b\x88\xd3\x95" +"\x15\xe\xc2\xd0X\x12\x80\xbf\x1d\x9bmZ6i\x93\x1bR\xd8\x85\xa0p\xea\xb2?A\x80O\xad" +"_\xdd\xec\x32\xd6\xd7\xc5\x9cL\x1f\x7f\x8\x83\xe0\x90\x66l\xb0\x16\xda\x80\xc3\xab" +"\xfa\x62I\x2>AE\x7f\x98,S\x1\x95\x1f\xcc\x8f\x81\xe5\x30\x80\xa2\xa9\xf1)\xbc\xd1" +"\x8e\x80\xb2\x16\xc2s'\xdf\xf8Z\xc5\xd7\x44\xb5\xb0\x61z\xd7\xf\xe8\x82\xb9\xeb\xc9" +"yg\xcd\xbd\xae\x1e\xae\x9f\x1f\x1\xe!\xf3\xa0\x64\xd9r\x88\x9d*\xb9Z<\xb6\xdd\xa5" +"\xb9 \xfb!\x8\xc1\x99\xd5\x8b<\xefk\x95\xfeZ$\x9bY\xfaP\x1b\x63\xf7Z2l@\x90\xc4\xde" +"g\xa1\xc6;\xe\xb5\x44\x89\x36\x17\xd9\x39\x88!@\xffpnu.\xe3\xa9\xde\\v\x8\xa1x\xf2" +"\xc7\x5\xef\x34\x42\x11\x92\x9c\xc5J\x15\x94\x16\xe4\xb1O3\x8b\x45\xf4:\xec\xfa\xa2" +"\x0\xf1\xdf\x91\x1c\xe5\x7f\x89\x35\xde\xf6jd\x9b\xdc\xc5\xa4\x39\xcd\x98\x95?g\xc1" +"\xe4\x38K\x8d\x9b\x8e\xf8)\xc9t\xa7v\xaa\x3(\x1b\x90R\xc5\x90\xbb L\x96\xbeH%\x91" +"I\xc8\xf6wU\xeb\xa2\xf1\n\x97\xca\xd7\x10\xa0\x33o\xc6\xab`\x8a\\\xd3J\x9f\xef\xf4" +"\xdf\xdbM\xdf.\x4n|{5\x86;;\x93\x16\x61\x90\x1b\xf2l\x87\xf:hH\x9d\xed\xef\x1d\x34" +"\x1d\xd9\xba\xdcka%a\x83\x33\xf!\xb\x8b\xf\xedJ9@w\xaf\xcc\xcd\x82\xcf\xc2\x33\xc6" +"\xf\x97i9Qb\xd0\x39\x6\x39\xf3\x19Ql\xe2\xb8\xd1\xf2v\xcfO\x99\x92j\x87+\xf\x1bs" +"\xea\xbf\xf6\x19\xc9\xb3\xf7\x95\x9b\xe8\x9a\x43\xd3\xf0\xd6\xd9\xac\x1d\xa4\xfb" +"\xfI\xde\x66\xf0\x6\xa7\xc3I\xb0\n\xddv\x84\x36\xf7\x8e\x9b\xc1\xd2\"\x1e\xd4\x17" +"?\x7\xb9(\xf9nE\x13\x44\xbc\xec\x1f{\xba\xb4\x81\xd0\\i\x8\x8a\xe\xa1\xdb\xe8\xb6" +"\xa2}\x8/\x1b\x87\x87\x61\xc6\x8a\x1f\xab\xb2j!s\x14\xc7.\x16N\x89\x34\x13\xdb\x1b" +"\xa3\x62\x64\x63kp9\xbe\x13\xd7HfJ\xfc\x66t;A\x93\x10 \xe\x80\xbb?>`\xc2qW\xec\xa0" +"nZ\x80\xf\x9\x42\x35\xcf\x2\x15\xed\\\x1e\xf3\xdc\xf4\xec|\x3l5\xf8\x86\x17\xe$\x17" +"\xcd\x39\x17\x1e\x17)\xdc\x32\xcb\xdf\\\xf8\xee\n\x86\xfd\x9\x36\xe8\xdd\x64\x99" +"\xaf\x39J?\xf5\xf7\xea$i\x14^\xca\xd6\xe9(\xea\xe8:U\x1dnP\xc4\x91\x10;l-L\x14\x39" +"\x8f\x32\x92\xc2\xe3\xe\x9\x1b\xc=\xbe\xca\xed\xee\xa3&\xe2\xa4=\xbf\xc8\x61\x0\xfe" +"\x99O\x12\xcb\x65\xd0\x44\x94\xac\xa0\xa7\xb0\x61\\\x36\x9dR}\x87\xd3\xcN\x18\xa2" +"\x92\"\x9b\x62\xe1\xf6ut\xbc\x34\x9e\x97\xbc\xe\xf1\x3V\x7f\x98\xfb\xa5\x1c\xeeP" +"\xfa\xcbI\x8d\xd0\\w'\x5\"\xf1\x44V\x97\xad\xc6\x36\xd4\xbd\xc3\xf5O\x11\x61W\xa9" +"Y\x1e\x10*s\xb5\x62\xb3\"\xf9\xc3jVP\xb8\xc7}$\x19\x64\x8e\x84Q\xb3\xa9\x33$\x8c" +"\x90\xa7\xce\xd7Q\xc5\xeb\x61-\xef\x45\x9f\xd8\xf8\xc3\x86\xb1\x66\xa1#J\xdf\x39" +"\x11\x82\xff<\xb8}\x13T4\x86|e\x9?\xb7g\x89\x5\xea\xd5\xd4x\x1dkN.\xaf\x9r\x1q\xca" +"\xa9\x98\xeeK\xa3\xf4\xfb\x61\xb1\x19\xc2\x32\x15K?J\xeb\xd0\xafv*1\x1eh\xd2\xf3" +"S.\x85\xb7\xbb:\xe9\x0\xb3\x0\xfd\xbe^w\xec\x41\x14\xdc\x91\x8b\xd1\"\x9f[\xd8T\x94" +"\xc2\xa6\xbc\x91X\xaf\x99\xc6\x1f\x98\xcb\x90\xc7\x12#\x84\x64Uy\xc8\x8f\x88\x8e" +"n\xf5\x39^\x7sA\xb5\x19#lk,Q\xe1\xb5\xe4\xb7\xfb\\\xa6i\x8aRb7^\x86\xf9\x9e\xe/\x86" +"h\x91\xe0\x13\x33\x36\x3\x80\xc6\xb4\xe3X\x8b\xee}\x1b\x93\xb2\xe1\xfd\xfb\xad\x36" +"C\xc9\x63\xc7\x1ci{\xab\x8d(\xb1\x30\"\xbe\xac\xac\xc7\x18\xf5\x90^\x14\x9e\xc8\xc9" +"\x84\x81\x8b\x66\xc9\x8a`\xb5\xbe\xed\x90\xd7\xe\x96\x66\xc9\"\x34\x1d\xd5\x3\xf5" +"/!\xf6\x9f\x46\xcf\xd4\xb0\x44\x31#f\xd9O;-\xc0^y\xf6\x94\xfc\x46\x35\xde\xfek\x8b" +")\x8\xc5\xab\xeb\xe9\x66\x11\xe7\xde\xeb\xdb\xc3\xe6\xc3W\xcd;s\x96\r\xd4\x1b\x97" +"a\x99\x9c\xbc\xa7\xa5%\xe3\xf5\xf3+P\x1d\x9d\x86#\xb7\xe7\xdc@$y\xe1\xd5\xe5\xd1" +"\xff\xf0\xdd\xa4=Qs:j\x84\x8fU\xdd\xeb\x5\x97 `B\xc0\x38v\xb3\xdd\xad\xc4\n\x8U;" +"(\x15U\xf5\x30%\x31\x0\xa1\xc5\xc9\x80\xcd\x41\xab\xbd\xc0\xe8\x32\x44\x37\xd2\xe6" +"4Rx\x1b\rZA\"#\xaf\xad\x4\xe2'\xaf\xf0HA\xc\x12\xeekB\xd3\xeey\xa5\x65\x93\xe3\xf1" +"YV\n41-\xa0\xfb\xc0\x1a\xbd\xeb\xa1\x15TI\xaeG\x91\xfd\x9-\xa6s\xb7<\x8q\xfd\xe5" +"\x87'\xef\xa4\xaby\xc5gWj\x93\x1f\xb5\x41\x9d\xe3\xd0\x39\x0+\xf0\xfe\x11\xf1x\xa9" +"\xacZ\xc7 \x89\x83\x66\x13\x89\xab\xaaW2\x14k\xdf\xea\xdc\xc2\xf5\x3\x8aHJ\x2\xe7" +"\xa0\x99{\\\xbe\x1a\x42\x62\x81\\q\xe9\x6\x9f\xfd\x85H\xc2O\xce\xb4S\xb8\x1e\xcb" +"\x10\xc3\xcc%\xac\x61\xdd\x97[!\x95\xcf\xf8\x66\x0\xc6\x44\x8\x98\x1b\x94-\"\xf2" +"\x1c\xac\x10\x39\x80\x33=s\xf8\xb8(\xd9\xdcZy\n%\x6\x93\r\xff\"\xb4\x1d\x8d\xf0N" +"\xcen$\x9b\x44I}\x16\x46O\x0i\xa7\xdd\x4\xb4\x16'o\x98p\x90G\xc3\x66\xd0\xe3\x5\x1b" +"\xb1;\xa2\xfa\x8b\x9b\xab~M\x17\xadUD\xd3\xf9\xbate5\xf6&(p\xb2\xf3_\xcc+\x81\x9c" +"\xec\x1a\xae\x1\xed\xae\x61Y\x98\x82\xb0\x2]%v$\xb3\xeeZ0\xbd\xe\xd5y\x2\x81\xde" +"\x88\xf0%\xdc\x3>\xe7\x42R\xca\x15\x32\xb2Tp\x1c\xd1\xd3\x65\xe2S\x1c\x30j'g\x6\xe8" +"2\xbo\xf0\xfb\\\xb3\x34-\xe8\xfe\x95sX\xa3^\xb8M\xb7R\x83\xb8[\x1e\x44\xcc\xacy\xc3" +"\x93\xf3\x8fs\\\x17\xdf\x38\xadg\xcb\xc5\x18\x46\xbf\xdc\xd2\x94o\x8_\x86u\xd0=S" +"\x16\x90\xff\xf2\xc1}c\xf9\x9\x12\x46\xb2\x66I\xba\xd6\x12\x36w\xa7\xac\xea\xf4\xb8" +"\xb9\xa1\x89Z\xe9i\xc5\xf8X\xadL\xa3M\xd7z)>\xf8Y9\x96\x4K\xc1\xf6&{\x9fN\xa0\xdc" +"O\xaa\"s\xef\xac\xdd\xb9\xdb\xae\x1a\x18 \x1b\x9e\xe1\x4\xd1\x83J\x6\xc5\x30\xe1" +"\xec+\xc0\xd7`\xdap\xab/\xf8\xd6P\xce<\xe4\xdf\"\xcf@\xceu\xb7\xd6\x9d\x2\x1a\x37" +"\xc7\x9b\xb6\xaf\xb9\xf9\xea\xaf\x62\x1c[\xf1 \x99\x4\x8b\x92\x64\xdb\xa6-\xe5\x46" +"1\xd7\x97Mh\xa4\xf3\xbc/\xb0\x38\xfc\x2\xb9\x96\x90\xed\x8f\x35HWb\xd4P\xf5\xce\xf0" +"c#\xff\x63&M\xc2\xf6\xc6u\xc1\x8a\x9f\xfeM)\x83\x3\xa6\x11\xa3\x14\x36\x6 \xc\xae" +"L\xc5\xa9\x3\x43\x11\\iH\x11\x16\x3)\xb7Hq\xe5+\xb3\xa9\xd6\xa7Yc\x1aU\xe7T1M\x1c" +"\x0\x35\x85\xe8\xbe>\xc0\xe;\x9\x94vh/5i1\nb\x1f\xb6{\xb3K\x1e\x45\xd7\xd3\xde<\\" +"c{\xab\x17\x91\xc3>\x9azWcQ<} \x5\xa8\xcd\xfe\x96\x9\xb6\xa1\xdd\x64\xe3p\xaa\xbd" +"&\xa6\xe0\x39Pig\xd8\xd2\x1\xf9\x3\x9f=\x7\xeb\xdc\xad-\x1c\x45\x9f\xb8\x82N\xba" +"\xf0\xec=\xc3\xac\xa7JS\x1e:\xac|\x8a!\x80\x10X:p\xf\xbe\xf6\xe0\xc7\xa8\x8a\xaf" +"\xc7\xf1\x97\xeb\xbf\xc0\x9c^s\x91\x1f\x11\x12\x2u\xf4\x8\xda\x8f^\xe8\x62u\x1f}" +"\xf\xd1\xb8\x31\x6\x96\xcc\xab\xe\x36\xaa\x42\xaa\xdbv\x98-\xed!2I\xd1\xf\x7:F\x13" +"\x85z\x8d\xc5?\x4\xb5\xe2\xa4){@)\x1d\xba\x7\xa7\x89\xc6\x8b<\xe3\x62\x62\x18|\xf4" +"\x9a\x85\x45\xa7\x62\xcf\x1dx>\xc7\xb1[C\xf0\x37Ue\xc5s\x1b`\xcc\xa3\xac\x62[z\xa9" +" \xc7`\x1ds6\xf4\xbd\xfan\xaa\xa3\x66\xbar/y9\xb7R\xd9,&%\xc1\x33\xe2\xb9=\xa3p\xc5" +"hd\xa2\xdfy\xd9\x41\xf7\xd5%\xa2\xe8\x97\xfe\x7f<\xaf\xb1w\xbc\x18\xa9_\x9c\xa8\xfd" +":\x9dn\xa2n\xcc\x36\xf1\xc7\x8b\xd0\xfe\x32\xb2\x62x\xfd\xbe\\\xf7-K\xf0\xafx\xee" +"MY\xd0\xed\xc8\xb5\xb8\x66\xbf\x5G\xc5\xffV\xf8\xe2\x1X\x18}\xd4|\xde\xc4\x45\x97" +"d\xf8\xd6\xb0\xd3\xe1X\xc8/\x16p\xe3 \x81\xa9\xf4\x83\xe8\x92\x6'\xbbi&\xd1\x6\xa8" +"\x9a-\xed\x36\x91W\x14\x15\x1d)\xce\x9d\xedH9+{\xf2\xe1}!\x94\x36\xcb\xda\xd6\xae" +"\xe2\xcd\x99\x41\xe4U\x92\xaa\xb1M~\xc9V\xe5\x43\xb1\xe2\xc3\xe4\xbd\xcd\xf4\xfc" +"\x6Z\xed\xbe\x8c\x3uu\xd0\x10\xf5\x81\xb0\xe1\x97\x66\xaeOG<\x8e\xfb\xd7" +"\"\x8a\x8e[\xa2\xfa\x2\x7f\\?\xa6\xc3\x35\xe9\xc6\xe3/\xbcU\xc9\x13\xa1\xe9\xb\xe6" +"\x81\xeb?$\xb6\r=\xa7\x96\xc6]?\xb6\xe9z\xc4\x89Q\xf5\x1cH\xf6h:#\x99+\xae\x3\x95" +"Un\xf2\xbe\xae!\xc2\x8+\x96V\xe7\x63M\xaf\x1d\xf9\xb9\x2O|\xb9 \xe9\x97L)\x9b[\xb8" +"\xf4\xd9\x18\xd1*&i\xd6)\xe6{\x17\x43\xe4\x9\x13\x16\xf\x18\x43\x9a\xb0\xd8\x43\x8f" +"\x18\xc1\x8a\xd6\xf0y$\x8do\x1dYq\xe5\xeb\xa6\x7f\xecGQ\x1f\x30\xc1L2\\j\xe\xd5$" +"#\x1c\xf0\xca\xf\x98\xb0\"\xa9m1\xa3\x8e\xe4\xe8\x9c\xd1\x98\x39\xf3\x8f\xa9\x41" +"\x86\x5\x95\r\xea\x62w\"`p\xad\x65\x83!\x9fh=p\x81\x9c\xe0\x14\xb2\xd5\x61r\x99;" +"\xf2\x1d\xa9\x39\x35O\xbb\xee\x33\x45\x10\xde<\xca\x9f\xb5OrQ\xdd\xc3S\x12o \x89" +"\x96\x3\xa7\x1e\xb\xab\xef\xb6s\xa7\xc4H\x8c\xe3\x0\x7\xc9}f\x8f\x36\xecOg\x8c'\xb1" +"J\xfd\x6\x44\xf8L\xb9>%}DkG\xcc}\xbd\xdc\xcd\x66\xf9\xb4M\xf9?Sf\x84\xc8\x44\x18" +"\x9c.\xe1 /\xa5\"K\xa7\x89\xf8=\x8e\xfd\x62P,\x1c%.V\xba;+.\xc4\xe3\x38\xa7Zoz!\xae" +"\xda\xf1\x8b'\xdd\xed]\xf1\x9c=\xca\xd3K\x11\x9d\xee\x44\xd4\xa3R\x9d\xf1\xe9\x7f" +"\x1c(\xce'\x8d\n}\\|^~\xb1\xe5\xb9\xfb\x17Z9u\x80t*p\x2\xe8\\\x83\x7\x18\xd4\xc5" +"'=<\xec\x99\xde\x4\xfb,\xbb\xe0\x90\xd9\xee\x85\xde\xe7*{x\x3{\xaf I(\xde\xca#!Q" +"\x9f\xc8\x11\x5\x66Z\xc\r\x8d-\x1b=\x95q\xd0\xf3x\xe0\x9as\x7f\xcd\xa1\xd1\xa1G," +"\x87?\xb0\x9gk<\xfa\x42\xe8^w/L\xc4\x1a<(\x1\xdbI \xb8\xfa.K\x8bz\xe7\x1a?C\xe9`" +";\xb5\r\xcb\x1c;e\x10\x88:o\xbf\xd1\xf1R9\x1e\x98\x1c\xdd\xa2\xeb\xa6+\x1a\xa3\xde" +"\xf1g\xa1\x8b<\x7\xb3!\xcf\xa0\x8}(\xc8\x82\xe7\x37gF\xc9\xcf\x9fw\x9a\xef\x91\x1b" +"\x81\xf4\xff\x34\x1e\x45S\xa8S\x9d\x9f\xe]\x88o\x10\x63\x96\xc8\x8b<\x9[\x96\x17" +"\xb7\x84/{\xed\xealK?\x5\xc2\xb6\xf6\x38\xa9\x15\x80\xe7\xac\x33\xc5P\xbd\x7\x62" +"q\xed\x8\x44\xfbR\xb5\xd3\x2\x9\x0\xd8I\xa3\xe2\x8d\x65\xbe_\xe6\x45j\x8\xa3\x1d" +"\x7\x97\xc7\xd0\xdf\x8d-\xe7\xfb-\xf4\x17\x43\xc0Pd\x93\xc4\x64\xb2\x44V\xad\xa7" +"\"\x9c\xe3\x14\x61\xcf\x31\x32\xb3\x62S\xe2\xa5W\x7f\xbc\x45\x8b\x38\x9f\xce\x42" +"#Ewo\xeU=\x1b\xed\x9c\xe7\xdc\x5\x7f\x96\x19]\x4`gE.#\xe5\x66\x62\r\x7\x9b\xc4\x86\xc5\xb7" +"K\xea\x18\xf4RGAXo\xe6k\xa6.5\xaa\xd6|Q\x15\xadl\x9b\xb3\xc3V\xf3\x6.\xe8\xb5\xfd" +"\xa3\x7\xf8\xfa\xfe\x31\xdd\xbf\x41\x64\x1e\xbc\x87\xfa\xc\x95\xc7l\xdd\xce\xa9\xff" +"\xb2#\x9b;\xbcJa\x2\xa8\x8d \x2\xca\x45\x97\x3\x8&\xc7:\xe8\xc0\xcf@\xd8\xb4u\xf" +" \x98\xa4G0\xdc\xe4\xa7\x96\x7f\x65\xa9\xcc\xcd\xd6k\x12\xd9\xe4\xb6\xf7]\xec\xb1" +"\xb2\x92\x5;f\x8e\xa3\xfc&\xb1t#\xcb\xe4\x36\x42\x9\x9a\rT\xb7I\xf7\xfb\xf1\xd2\x41" +"i\xaeu\x9a\x9a)\x13\x9e\xe7`\xbc\x1b\xaf\x95\xc5\x96\x89\\\x9c\xaf]\xb8*\xc3\xcd" +"h\xfaVY\x11\xd1OB\\W\x93\xb3\x38\x95\xf5<\x9a\x84\xe0\xc3<\xdd\xc5\x46\x45\x9a\xa3" +"\x7f\x13\xa7\x9c\x44L7\xc2\x13\x2\x46\xa7\xb6\x91\x43s\xbd$\x7\xe4\x62\x17\x42u\x8b" +"Q\xb1\xdf\xbfnJ\xb9\x31\xb7\x17\x41\xdd>\xa1\xc2\xb7 \x14\x45\xc4\x84\xef\x38\xe8" +"&:\xee^b0\x7\xf8u\xfc\xfc\x1f\x38\xd3\x14\xd4\xd6\xb8\xbe\xf3\xc0\x5J\xc6\x80O8\xfc" +"0\xc0M\x9ft\xba\xe2\xa3yuMg}&\x89\xc\x12\x38#\xe9\xf4\xc7\xbe+X\x9e\xf9+ \x1eX\xb6" +"\xb9I\xfd\xd1\xbd\xf5\xfcHB\xd1\xc8\x80\xcdk\xfcx\x88\xbx!\xe8Y\xb8\xf0J\xadu\x9" +"\xb9\xd0\x8d\xde\x8d\xcb\x9a!\xff\x3\x82sFmp>L8\xb9\x38\xc0%n\xb1\x10W\x9\x1d\xf6" +"\x13\xac\x44\xbf\x8f\xbb\xac\xb1\xd7\x19\xea\xd2\x93\x5\xc0\xe3,@\x97\x98XU\xd3L" +"\xe2Qb\xcd\xaa\x34\xb7\x7\xf6->)\xaeOY\xa9\xfa\x9f\x83\x90\xb3\x31\xb0\x99gm\x19" +"\x0\xe1?\xe9\xe8\x34\xd4\x8e\xf4\x64\x87\xac\xc8\xff\xad]\x82\\[\xf3\xd9\x41\x8\xc0" +"{\x9a\xe2\xe3 \xa7\xba\x4\xa9+b\x86\x64\x30\xd5(\xe0m_\xc2~\x1\xae\x9f\x45gib\xb3" +"\x16\x84\xbcK\x86%\xac\xba\xcd\xfd\xb4\x10\x39\xd2\x1d\x41\xba\x1e\xaf\x8a\x89\xd3" +"g\xca\xe@i\xe6\xc9\xf0\xe0[RS1h\xa8\xa9\xbc\x9fTJYH\x8f\x18\xa9\x9b\xb6\xa7\x2\x18" +"\x14\xe5nx\x9e\x34\xaa\xa2\xadO]\xc5\xe4\x92\xdf\x9a\xee\xe1,m\xb4\xfbp\x86\xa1I" +"_D\x9f\xa1\x63=\xb8\xb5\x88\xf5M\xcb\x9f\xa5\x38Q\xf0/&#N5\x3H\x92\xdf\xbfQsT6\xb2" +"\xaa\x1c\x7U\xe9\x8cWYV<\xe7;\xe7Sb]\xd6U\x4\x45\xe2OL,g\xc0(\xc8\x8b\x89\x38\xb3" +"\xa6\xb\xaf~)\x8c\x85\xc6\xc6(\x83\xc4\xcfHm\xd5\xb6\xeap\x5\xe2&)e\xf8\xe3\xd5\x35" +"\x15\nj\xb2H\xec\xfb\xa9\x91\xde\xb9\x64V%\xe2$\xe2\x96s\xc1\xdf\xeb\xf4\xe\x63i" +"D\x3\xcb\xe7m\x90\xee@R2Vl\xee\xcb\xbe>\xdc\xa0\xcb\x99\"\xb4\xa3\xef\x9aGa\xf9\xc6" +"\x9e\x65\x18\xde\x2Z\xd0\x42m\x8I\xb4iP\xd4\x63\x37\x61\x9f\x86\xaf\xce\xa5\xa1\x37" +"b\x0?Vi\x9\x8f\x41\x81\xdbRb\xc4$\xf1\x8e\xa3\xfa\x63Qr\xd3\xff\x36\xd1\x9a\xb5i" +"\xad\xe4\xd1\xe4\xa5\x91\x1a\xbcq\xce \x91\xce\x98;\x8d\xe6\x30u\x80\x2\x89%\xbd" +"x\x82\xd1\xf6\xa4\xdb\x15\xbd\xc0&`[0\xf4\xaf\x31\xb9>\rp\n\xa6r[Y\x5y\xeb\x89\xe3" +"K?\x95\xa4\x9f\xdf\x15\x12Xj\x9a\xf1\x3\x31\x8b\x37\xbd\x96\xc9\x38\xdf\x91\xe6\xb3" +"\xa6\x15\xdd\x42\xb2\xef\xa3\x9d\xf5\xf\xa5\xdf\x96\xc1\xed\xd5\xccz\x98\x8b\xcc" +"L\x1d\x1a\x7wAL5\xf\xaaj\xc8\x10\x66\xb1\xb0\xf8\x35\"\xe6\x88\xeam\xcc\x43:\x14" +"\xec!\xcd\x5)\xf4>\xc\xe6\xff\x0\xf9\x36!\xf\xad\x46\xa7\xae\xeeJ'\xf2\xa9\x96\x1b" +"\xb6q@\xc1\xd8\xcbM\x8f\x7f\xf2\x16\xf9\xc2\xa6\xb0\xcf\x98o\xd9$\x81\xf7\x12Y\xa4" +"$)\n \xa3v4\x2\xf8#\x2%\xcf\x65q\xf1\x17\"\x18\xd5u\xbb\x30\x38\xce[H\xcd\xeb\\\xc1" +"\x17\xe2\x1a\xa4\xe3\xa4O\xacg\xbb\xe\x65\xc9\x90\xcaRe_\x9c\xfd\xc3}\xb4Ox\x97\x81" +"\xe3\x66\x35M\x2\xff\xa1\xa9\x7\x84\xab~\xda\x8\xf1L\xb6\xfalu\x93./)\x8c]\xff\x8a" +"\x7f\x45\xab\xeek\x82\x97\x1\xca\xe3\\\xee\x16\xffh\xf0\xe8\xaf\x7f\x3)Vo\xf4\xb" +"uOLO\xfd\xc9\x94\xc0\x42TVv\xb7\xf7\x1b\xd0\x12J\xd4\xed$'\xeb\xe\x5\xeHO\xc3\x95" +":\x85\xc4\x33Q\xe1m\x5\xbe\r\"\xecm\x19=\xf3\x37\xfd\xee\x17+\x1d\xf1\xc3\xf0\xf" +".\x1c\xb1\xca\xc4Q\xe1\xfb\xe5=S\x1c\x6\xa2\x87\x7f\x30\x17\x82\x1f\xb0\x7f\xe7\x1d" +"\xfd\x8a\x38\xc8\x93\x81\xb0\xfc{w\x86\xcb\x92\xe5\xb9\xa8\xd5q\x91\xba}\xb7.\xcc" +"\x1c\xd8\x9e,o;F\xcc\xbe\x34\x65\x4N&T\xe9\xcf\xeb\xd5\x96\xed!i\x83\xbc\x66v;\x80" +"\r_\x89pN\x89\x36\xa9\xee@\"d\x5\x82\xc9re\xf2\x9c\xf8\xad\xed\xe8\n\xb3\x85\x37" +"\x91-\x11>_+\x82\x8dhn\x8aZz\xb9\x80\x32\x32WJB\xa0\x30\x7f\xc1\x86\x8b_=\x16l\x13" +"\xad\x35\xbb)\x5\x11\x36\x91j\xb5&3]\xd2+\n\x80\x80\x1c\xc0\xab\xc3\x11m\xf7\xc9" +" \xb3\xa7so\xe\xd5\x13\xdf\x45H\x8c\x62\xd0\xf2-\xb0R\x9c\x39}\xb8\xd8\x32\x89l\xd1" +"L\x8\xb1t\xda\xf0~\xebs\xb2\x90s\xb4R~RYy\"<\x88P^\xadn\xefRp[\xfb\x83\x64:\xc1\x1" +"3z\xe5\xff\xc5\xf4\x62T\x17\xbe\x88m\xa8\x9{\x1e=\xec\x92\x65\x9a\x61]\xf7\xc5\xca" +"%\xe3\xca\xec$\xfe\x45\x44\x65\xd8>h\xce^\xfdio^\x17\xaeQ\xab\xd5\x1\x8d\x1f\x92" +"\xfc\x9eXLk\xc8\x82\x88\x1f\x6v\x94|\xf9n\xd7u\xe9\xbbN\x80v\x1f|\xecs%\xf4\x88\xd0" +"t\"i\x8jU\xa4\xe2\xae\xca=\xdc`3\xae:\x18<\xfe\n\xb8\x91\xd1\x7\x99Jh\xa1\x1e\xf7" +"\x12\x8en\x12<1Z\x15\x1b=8A\x1d\xbc\x64t!\x1dgb\xf\x41#_\x1dJp\x80\xe1\xdd\xb0\xe5" +"\xf4\xf5\x96\xbe\x2\xec\x17\xdd\xd9\x38\x8e\x45\xab\xbf\xa6\x62[\x81\xa1\x41\xc3" +"\xda\xe6\x11\xf8\xb7\x44W\x1e \xd8\x80Y7M\xcf\xaa\xa1\xfaY\x8a:.\xfb\x31\xb0\xac" +"dRn\xa0\xa7\x82\x8f\x81\x7\xe0m\xaa\x1c\xa6|YF\nI\xf6\x16L\xf4K|\x18\xd7\x8e\x10" +"\xc4V_Jen\xe\x6\xdb\xd9\x11J\xd8\xadI\xd4\x8f/Y\x91Pg\xf0\r\x9c&+&G\xaa\xdc\x8f\xe2" +"\x9f\xc1\x8f\xb0 ><\x1f\xdcW\xe\x5\xe3\xc3\xfe\xee\x8c\x30>\xac\xbb\x1a\xd8\xc5\x9b" +"l?\xb0\x32\x1d\x44\x1ak\xbc\x12\xc2l\x8a\xd6\xe1\xba\xc3\x31\xad\x1f:\xf7\x8f\x2" +"\xb\xe5\x19}\x11\xa2\x62\x62S\\5\x86\x42H5k\xb4\xb3H[\xc0\xab\xb8\xa7\xbb\xc5V\x5" +"C}7\xcd`A\x9d@\x97o\xfb\xe0\xf%\xc2\xd1\x97\x80\xc0\xa4,0 \xbb?\xbe\x18P\x8\x1a\xa8" +"\x15\x5\xa3\x65\x82\xa3\xa2\x33\x15\xd4?\\\xa1\x62\xba\xdfv\xe1\x7T\x8b\\TP\x6t0" +"\xa1\xa4\x19\x8c\xe0\x17\xb9\xf8\xb|\xe1\xe5K7\xb4\x8cm\xaf\xb9/\xc1\x44I\x19m\xf5" +"IVN\xc8\x63-o\"\x1c\x9d@\xcf[\x9e\x9e`\xc7\xe5~As\xd7\x1d\xf\x0\xaa\xaa\xd8\x44\xb4" +"\xa5\xc4\xee,\xaay\x94\xb5\x8a$#9\xf3\xfc\xd7q\x91I\xa3\x8b\xbaZn\x15\x1a,g\xefU" +"\xca<\xef\xf4\x96\x45\xf8\xee\x95=\xb0|\x84\x83\x9\xc2\x5\xf8\x14\xb7\xb2\xfa\xb2" +"\xd3\xda\xb8\x31\x30\x15\xd3\xf1\x98\xec\xee\xdaJ\xc2\x1b\x41~1\x88\x7f\x89\xa5v" +"-\x13\xea\xaa\x84\xd2\x35\x3\xcqfJ\xf4\x9f\x18\x17\x89\xfd\xfd\x66\x93\x3\xea\xe9" +"%\xb1\x81\xbe\x88\xc4\xd3\xb5kh\xfe\xd6\xbb\xd6*\xc9\x9dP3[&\x9c\xb2O-3\x1e \x18" +"W\r\"w\xee\x15\x8\xf7\xd6i\xc5\xa4\x9d\xd8\x0\x90\xce\xd7\x1a\xad,\xdewtd,\xbb\x1" +"\xa1\xcd\xe2\xb8\x1a\xb7\xd9\xf\xf3\xbf\xf2\x11L\x7\xd9\x35n\xc7@A\xd8/TZ\xf1\xc9" +"\xce\xe\xee\xc2Z\xd4I5\xb9k\x8d\x13\xd6\xec\x83\xd9\xc5\xff\xe2\x46\x63\x16\x97\x5" +"\x8c\x14\xce\xd0\x9f\x9c'\x4\xe9q1-\xdd\xe2\xb7\xe5\x85-L\xe7yw4\x95\x8a\x18\xb8" +"\xd0;\xffW\x89w\xa6l\xd2'{5\x8b\xba\x82m\x8\x81\xe6\xfb\x95\x4s\xf0\xeb\xe7\x6\x30" +"n\x1a\xd7\xfb\xc5\x2\xb1v\xa5\xed\xd0( -\xf2\x81&F\x82\xd7^\x1e\x8f\xde\x36\xb\x38" +"\x18\xc4\xc7\xf1\xc2\xf9\x46\xf\x92\xb2\xa1\x1f\x99>\x9bg\xb6nZf\xbc\xb6\xc2\x10" +"\xafh\xf0 \xa2|ju\xab!K3\x99\x44!*\xe2\x6\xab\xd7\xa4+\xf)\xca\xaf\x64$\xb6\xfa\xa5" +"\x16\x95IX\xf0\x1bN\xff\x82\x9f\xb3\x4\xaa\x7\xd3\xe7\xd2\xd6tS\xc1\xff\x85,\x85" +"\x99hs\xc9y\xfbr\xafQF\xce\x63\x65\xda\xbb\x87Q\xf0\xd4\xdcX\xa0ks-\xa7\xd7\x31\xab" +"\n\x8a$\xa7\x64v\xec\x8b\xfb\xa2\xa6?}\x8fZK\xbc\xe2LS'\x1f\x84\xd6\x14\x31s\xd1" +"\xca\xef\xc1]]{\xa5\x44N\n\xf7\x30\xe6\xa0\x9e\x8e@\xf9\x94\xa8Z1\xfa\x65\x9e\x5" +"\x94\x36\x9a\xa7\x13\xf9\n\x95\r\x89\x12\x41\x38H\x18\x42\x64\xfc\x0:\x15X@\xcd\x80" +"\xfa\x9aj\x16wS\x94\xa3\xcex\x9\x96\xc9\xeag97\xcc:\x95T\xce\x38\x34\xcf\x61\xec" +"\x1\x30\x92\xc7\xab\x9d\x34\xc6mL\xec\xa7\x39`\x9c\x1b:j\x9d\x33'\x1c|\xd7G\xae'" +",\x9a\xd4\xee\x81@-\xe6\x19\xe0\xc9\xe5\x85\xc3\xa7\xfe\x98\x9d\xf3\xaa\xee\x93\x18" +"Pm\x93\x4[\x19I\xc0La\xb6\x9b\xa9\nh`\xdc\x93\x9e\xc7" +"\x87\x5\x37\x62;\x93K\xc2\x10\x44\x87\xcf,O\xb6\xc7\xc2@\xef\xab\xd6|\xac^nQU\xe9" +"\x15~\xb4:\xba\x84\x94\xce\x85:\xc\x6k\x9d\x9\x39\x92\xe\x8f:RK\xb9\xf0\x33\xe3\x41" +"\xaa\x93/\xc3_\x9b\x4!\xd1\x8\\q\x96\xe3\x41W\x18x\xe4\x4\x66\xf3\xad[\x9f\x8d\xb" +"\xcc{\xe\x66\x35%yI\xd7\x8f\xe6\x31\x7f\x81\xdb\x31z\x18j\x8d\xfdR\xbdT\x9e\xde\xb4" +"\x97\x30z\xc6\x7Z<\xdc[\x2\x41\x1f\xf9\xb5\x43\xeb\x42*\x1\x89k\xfc\x35\rh\xd8\xe1" +"\xc1s|S\xfcq_q|\x3\xd8\x96\xf9XbG|\xdd\x8e\x46\x99\xc7\xbf\x30\x98I\x8dx\x98o\x97" +"@\xa6\x62\x95\x33\xabG\xd4\xbf\x85\xff\xa6#Z\xb5\x31\xb5Syj5a\xeb\x81\x93\xbd\xd2" +"\x7'g\x97\xa6P,\x14\xef\x1d_L\xf4(oI\xeajw\xf4\x95\\G\xc8\x64\x85\x90\xe9\x33\x2" +"\x8d\xd8\x2\xfa\xc4\x42W\x13\x97\x42\x9av\xbfv\xb8wB\n%'oC\xf5\x7\xb1[\xa8\xaa\xba" +"\x95\xdb\x92kA\x8c\xbb\x92\xbf\xe6\x89\x9c\x0\x97\xe\xca\x34z\xdd\x1b~\xbeT\x7f\x10" +"\xf4\xf1\xfd\xa8\xc6\x97\x8\xf8_\x99\x14LK\x1eT\xfc\x16\x80J<\x89\xabTc@\x9a\x81" +"S\xbf\xd9\xc6\x44\"#D\x88-I\x92\xfa\x32\xfb\xa5\x45'\xc5S\xfb\x9a\x80-\xbc~\xd7(" +"]\xc7\xe\x41\xe9Kf\xb5\xce\x1e\xae\xa1\x46\x36\x30\xfb\x19?\xcb\xeb\x7:\x82\x12\x15" +"\xa0)o\x96\x38\x15\xce\x97\xaa\x66.}\x89\x0\xdd_>0\xa8#d\xc9\xd7\x3\\\xe8\x7r\xfa" +"{\x81\x31\x41\xe7\xf4x^\x4W\x19\x9c\xbe\x95*\xb8\xaf{{j\xa8\xa0<\x90\x15\x99m\xf3" +"\x81\xf3\x88v\xc3\xc9g\x95\x1d\xfd\xcc\x3\xcf\xe5S\xecK\x5\xa8pn'\x15\x80\xef\xed" +"\x12\xc9\xf9S\xec\xd4\xe0\xe0\x63U\xd9\xb2\x4\x10\xf8\x8b\xd0U\xa7\x83\xaeN\x7f\x1f" +"\xe9\x7\xa5\xb7\xaf\xeb\x64\xf0\xea\xfd\xc6K\xad\x11Hr\n\xd6\xa5\xb3z\x8e(\xfe\xba" +")\xd2\xfb]\xbc\x11\x3\x12?k\xe7\xa0rI\xe1\x44-\xd0\x36Y\xbe\xd1_\x13\xc1~\x15\x83" +"\xce>i\xa2\xfb\x1a\x8b\xf8\r\x10\x6\x33U\xb\x8k\x93$0\x9e\xe0P\xac\x63z\xc9\x1eQ" +"\x8am\x99\xc8.\xdf\xa5\xd4\xad\x1e\x3%&\xb0z*#R\xb\x33\xf0\xa4n\"\xd4\x12+\xdb[\xcb" +"\xd1\xa6}\xc0\xd8\xe7\x2\xd5\xcf`(\x4\xc1(\xd1\xf5n\x80-C|3\xfc\x8f\xda\xdb\xc4;" +"=Q7\xa7\xc|G\xb8+G\xda|\xb4\xab\xd9\xb4\x10\x42-\xf6#\xb8\xd9\x16Q\xd4\xf6_Bc\x7" +"\x88\x2\x83-??Ugx\xba\xee\xb2\x84+\x85\xe3_\xf2=\x7G\xff\x35\xbd\x30\xd0\x4\x82\xac" +"\xa8\xdc\"}\x1b>\xcb\xd5\x98\x93\x18\xe4\x95\xc4\x4\x97\xc3\x8f(l=CH\x9b\x16\xe3" +"\x99\x0*\x86i<\xe\x61\xb4\\\x16\xcbP\xc6YU9\xd2\x65\xd6\xbbp4\xc7\xe3\x34ur\x87\x9a" +"\x99\xd6\xe9\xdf\xd3TYk`\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30" +"0000000000000000000000000000000000000000000000000000000\r00000000000000000000000" +"00000000000000000000000000000000000000000\r0000000000000000000000000000000000000" +"000000000000000000000000000\r000000000000000000000000000000000000000000000000000" +"0000000000000\r0000000000000000000000000000000000000000000000000000000000000000\r" +"0000000000000000000000000000000000000000000000000000000000000000\r00000000000000" +"00000000000000000000000000000000000000000000000000\r0000000000000000000000000000" +"000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n019004l_afm_len = 31595; +char* n019004l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusSanL-Bold\n" +"FullName Nimbus Sans L Bold\nFamilyName Nimbus Sans L\nWeight Bold\nItalicAngle " +"0.0\nIsFixedPitch false\nUnderlinePosition -155\nUnderlineThickness 69\nVersion " +"1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncodingSch" +"eme AdobeStandardEncoding\nFontBBox -173 -307 1003 949\nCapHeight 729\nXHeight 5" +"40\nDescender -217\nAscender 729\nStartCharMetrics 316\nC 32 ; WX 278 ; N space " +"; B 214 0 214 0 ;\nC 33 ; WX 333 ; N exclam ; B 112 0 262 726 ;\nC 34 ; WX 474 ;" +" N quotedbl ; B 50 470 424 729 ;\nC 35 ; WX 556 ; N numbersign ; B 3 -32 553 697" +" ;\nC 36 ; WX 556 ; N dollar ; B 22 -126 527 763 ;\nC 37 ; WX 889 ; N percent ; " +"B 22 -20 863 709 ;\nC 38 ; WX 722 ; N ampersand ; B 55 -23 694 723 ;\nC 39 ; WX " +"278 ; N quoteright ; B 66 469 201 729 ;\nC 40 ; WX 333 ; N parenleft ; B 40 -200" +" 303 729 ;\nC 41 ; WX 333 ; N parenright ; B 22 -200 285 729 ;\nC 42 ; WX 389 ; " +"N asterisk ; B 23 407 357 729 ;\nC 43 ; WX 584 ; N plus ; B 50 -10 533 473 ;\nC " +"44 ; WX 278 ; N comma ; B 64 -174 214 146 ;\nC 45 ; WX 333 ; N hyphen ; B 26 207" +" 298 342 ;\nC 46 ; WX 278 ; N period ; B 64 0 214 146 ;\nC 47 ; WX 278 ; N slash" +" ; B 2 -14 275 714 ;\nC 48 ; WX 556 ; N zero ; B 29 -23 517 724 ;\nC 49 ; WX 556" +" ; N one ; B 68 0 378 709 ;\nC 50 ; WX 556 ; N two ; B 30 0 515 724 ;\nC 51 ; WX" +" 556 ; N three ; B 29 -23 516 724 ;\nC 52 ; WX 556 ; N four ; B 24 0 522 709 ;\n" +"C 53 ; WX 556 ; N five ; B 27 -23 517 709 ;\nC 54 ; WX 556 ; N six ; B 32 -23 51" +"9 724 ;\nC 55 ; WX 556 ; N seven ; B 29 0 528 709 ;\nC 56 ; WX 556 ; N eight ; B" +" 22 -23 525 724 ;\nC 57 ; WX 556 ; N nine ; B 28 -24 516 724 ;\nC 58 ; WX 333 ; " +"N colon ; B 113 0 263 520 ;\nC 59 ; WX 333 ; N semicolon ; B 113 -174 263 520 ;\n" +"C 60 ; WX 584 ; N less ; B 40 -10 529 474 ;\nC 61 ; WX 584 ; N equal ; B 50 52 5" +"34 411 ;\nC 62 ; WX 584 ; N greater ; B 40 -10 529 474 ;\nC 63 ; WX 611 ; N ques" +"tion ; B 64 0 556 744 ;\nC 64 ; WX 975 ; N at ; B 27 -138 947 745 ;\nC 65 ; WX 7" +"22 ; N A ; B 26 0 703 729 ;\nC 66 ; WX 722 ; N B ; B 82 0 666 729 ;\nC 67 ; WX 7" +"22 ; N C ; B 44 -23 685 741 ;\nC 68 ; WX 722 ; N D ; B 77 0 681 729 ;\nC 69 ; WX" +" 667 ; N E ; B 79 0 624 729 ;\nC 70 ; WX 611 ; N F ; B 74 0 586 729 ;\nC 71 ; WX" +" 778 ; N G ; B 42 -23 711 741 ;\nC 72 ; WX 722 ; N H ; B 68 0 657 729 ;\nC 73 ; " +"WX 278 ; N I ; B 63 0 213 729 ;\nC 74 ; WX 556 ; N J ; B 24 -23 486 729 ;\nC 75 " +"; WX 722 ; N K ; B 74 0 717 729 ;\nC 76 ; WX 611 ; N L ; B 80 0 579 729 ;\nC 77 " +"; WX 833 ; N M ; B 66 0 776 729 ;\nC 78 ; WX 722 ; N N ; B 68 0 661 729 ;\nC 79 " +"; WX 778 ; N O ; B 40 -23 742 741 ;\nC 80 ; WX 667 ; N P ; B 76 0 633 729 ;\nC 8" +"1 ; WX 778 ; N Q ; B 43 -54 745 741 ;\nC 82 ; WX 722 ; N R ; B 80 0 677 729 ;\nC" +" 83 ; WX 667 ; N S ; B 32 -23 633 741 ;\nC 84 ; WX 611 ; N T ; B 14 0 598 729 ;\n" +"C 85 ; WX 722 ; N U ; B 76 -23 654 729 ;\nC 86 ; WX 667 ; N V ; B 24 0 647 729 ;" +"\nC 87 ; WX 944 ; N W ; B 13 0 932 729 ;\nC 88 ; WX 667 ; N X ; B 22 0 653 729 ;" +"\nC 89 ; WX 667 ; N Y ; B 27 0 650 729 ;\nC 90 ; WX 611 ; N Z ; B 30 0 578 729 ;" +"\nC 91 ; WX 333 ; N bracketleft ; B 66 -200 308 729 ;\nC 92 ; WX 278 ; N backsla" +"sh ; B -12 -14 289 714 ;\nC 93 ; WX 333 ; N bracketright ; B 18 -200 260 729 ;\n" +"C 94 ; WX 584 ; N asciicircum ; B 61 270 522 695 ;\nC 95 ; WX 556 ; N underscore" +" ; B -22 -189 578 -120 ;\nC 96 ; WX 278 ; N quoteleft ; B 67 469 202 729 ;\nC 97" +" ; WX 556 ; N a ; B 28 -23 524 549 ;\nC 98 ; WX 611 ; N b ; B 59 -23 575 729 ;\n" +"C 99 ; WX 556 ; N c ; B 34 -23 522 549 ;\nC 100 ; WX 611 ; N d ; B 29 -23 545 72" +"9 ;\nC 101 ; WX 556 ; N e ; B 22 -23 525 549 ;\nC 102 ; WX 333 ; N f ; B 14 0 31" +"3 729 ;\nC 103 ; WX 611 ; N g ; B 34 -218 541 549 ;\nC 104 ; WX 611 ; N h ; B 67" +" 0 541 729 ;\nC 105 ; WX 278 ; N i ; B 67 0 207 729 ;\nC 106 ; WX 278 ; N j ; B " +"4 -218 210 729 ;\nC 107 ; WX 556 ; N k ; B 59 0 548 729 ;\nC 108 ; WX 278 ; N l " +"; B 67 0 207 729 ;\nC 109 ; WX 889 ; N m ; B 60 0 824 549 ;\nC 110 ; WX 611 ; N " +"n ; B 63 0 546 549 ;\nC 111 ; WX 611 ; N o ; B 35 -23 569 549 ;\nC 112 ; WX 611 " +"; N p ; B 58 -218 574 549 ;\nC 113 ; WX 611 ; N q ; B 28 -218 544 549 ;\nC 114 ;" +" WX 389 ; N r ; B 63 0 370 549 ;\nC 115 ; WX 556 ; N s ; B 29 -23 520 549 ;\nC 1" +"16 ; WX 333 ; N t ; B 14 -23 301 674 ;\nC 117 ; WX 611 ; N u ; B 58 -23 541 540 " +";\nC 118 ; WX 556 ; N v ; B 14 0 536 540 ;\nC 119 ; WX 778 ; N w ; B 5 0 766 540" +" ;\nC 120 ; WX 556 ; N x ; B 16 0 535 540 ;\nC 121 ; WX 556 ; N y ; B 9 -219 538" +" 540 ;\nC 122 ; WX 500 ; N z ; B 21 0 468 540 ;\nC 123 ; WX 389 ; N braceleft ; " +"B 37 -200 317 729 ;\nC 124 ; WX 280 ; N bar ; B 100 -200 180 729 ;\nC 125 ; WX 3" +"89 ; N braceright ; B 72 -200 352 729 ;\nC 126 ; WX 584 ; N asciitilde ; B 60 14" +"2 519 314 ;\nC 161 ; WX 333 ; N exclamdown ; B 66 -186 216 540 ;\nC 162 ; WX 556" +" ; N cent ; B 36 -124 522 634 ;\nC 163 ; WX 556 ; N sterling ; B 31 -23 537 715 " +";\nC 164 ; WX 167 ; N fraction ; B -173 -20 337 715 ;\nC 165 ; WX 556 ; N yen ; " +"B 5 0 552 704 ;\nC 166 ; WX 556 ; N florin ; B 21 -220 535 744 ;\nC 167 ; WX 556" +" ; N section ; B 33 -201 518 723 ;\nC 168 ; WX 556 ; N currency ; B 26 100 530 6" +"04 ;\nC 169 ; WX 238 ; N quotesingle ; B 50 470 188 729 ;\nC 170 ; WX 500 ; N qu" +"otedblleft ; B 71 469 433 729 ;\nC 171 ; WX 556 ; N guillemotleft ; B 88 72 468 " +"481 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 83 72 250 481 ;\nC 173 ; WX 333 ; N " +"guilsinglright ; B 80 72 247 481 ;\nC 174 ; WX 611 ; N fi ; B 9 0 548 729 ;\nC 1" +"75 ; WX 611 ; N fl ; B 12 0 546 729 ;\nC 177 ; WX 556 ; N endash ; B -9 207 557 " +"311 ;\nC 178 ; WX 556 ; N dagger ; B 31 -194 523 709 ;\nC 179 ; WX 556 ; N dagge" +"rdbl ; B 28 -194 520 709 ;\nC 180 ; WX 278 ; N periodcentered ; B 64 169 188 292" +" ;\nC 182 ; WX 556 ; N paragraph ; B 19 -191 529 729 ;\nC 183 ; WX 350 ; N bulle" +"t ; B 50 175 300 425 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 66 -135 201 125 ;\n" +"C 185 ; WX 500 ; N quotedblbase ; B 72 -135 432 125 ;\nC 186 ; WX 500 ; N quoted" +"blright ; B 73 469 440 729 ;\nC 187 ; WX 556 ; N guillemotright ; B 88 72 462 48" +"1 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;\nC 189 ; WX 1000 ; N pertho" +"usand ; B 11 -22 990 739 ;\nC 191 ; WX 611 ; N questiondown ; B 51 -204 544 540 " +";\nC 193 ; WX 333 ; N grave ; B 17 607 213 757 ;\nC 194 ; WX 333 ; N acute ; B 1" +"21 607 317 757 ;\nC 195 ; WX 333 ; N circumflex ; B 8 607 326 757 ;\nC 196 ; WX " +"333 ; N tilde ; B -9 621 345 749 ;\nC 197 ; WX 333 ; N macron ; B 16 640 315 719" +" ;\nC 198 ; WX 333 ; N breve ; B 35 605 299 748 ;\nC 199 ; WX 333 ; N dotaccent " +"; B 112 621 222 743 ;\nC 200 ; WX 333 ; N dieresis ; B 18 621 314 743 ;\nC 202 ;" +" WX 333 ; N ring ; B 77 590 257 770 ;\nC 203 ; WX 333 ; N cedilla ; B 27 -220 29" +"4 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -44 610 340 757 ;\nC 206 ; WX 333 ; N" +" ogonek ; B 45 -234 268 0 ;\nC 207 ; WX 333 ; N caron ; B 9 607 327 757 ;\nC 208" +" ; WX 1000 ; N emdash ; B -7 207 1003 311 ;\nC 225 ; WX 1000 ; N AE ; B 1 0 966 " +"729 ;\nC 227 ; WX 370 ; N ordfeminine ; B 31 262 329 729 ;\nC 232 ; WX 611 ; N L" +"slash ; B 0 0 597 729 ;\nC 233 ; WX 778 ; N Oslash ; B 31 -39 755 749 ;\nC 234 ;" +" WX 1000 ; N OE ; B 28 -23 970 741 ;\nC 235 ; WX 365 ; N ordmasculine ; B 23 262" +" 343 729 ;\nC 241 ; WX 889 ; N ae ; B 27 -24 857 549 ;\nC 245 ; WX 278 ; N dotle" +"ssi ; B 67 0 207 540 ;\nC 248 ; WX 278 ; N lslash ; B 0 0 252 729 ;\nC 249 ; WX " +"611 ; N oslash ; B 11 -38 598 557 ;\nC 250 ; WX 944 ; N oe ; B 23 -23 920 549 ;\n" +"C 251 ; WX 611 ; N germandbls ; B 67 -17 575 729 ;\nC -1 ; WX 722 ; N Udieresis " +"; B 76 -23 654 922 ;\nC -1 ; WX 722 ; N Uacute ; B 76 -23 654 936 ;\nC -1 ; WX 6" +"67 ; N Scedilla ; B 32 -220 633 741 ;\nC -1 ; WX 611 ; N Tcaron ; B 14 0 598 936" +" ;\nC -1 ; WX 667 ; N Scaron ; B 32 -23 633 936 ;\nC -1 ; WX 722 ; N Rcaron ; B " +"80 0 677 936 ;\nC -1 ; WX 722 ; N Racute ; B 80 0 677 936 ;\nC -1 ; WX 667 ; N S" +"acute ; B 32 -23 633 936 ;\nC -1 ; WX 778 ; N Otilde ; B 40 -23 742 928 ;\nC -1 " +"; WX 611 ; N ucircumflex ; B 58 -23 541 757 ;\nC -1 ; WX 778 ; N Ohungarumlaut ;" +" B 40 -23 742 936 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 76 -23 654 936 ;\nC -1 " +"; WX 667 ; N Yacute ; B 27 0 650 936 ;\nC -1 ; WX 722 ; N Eth ; B 0 0 681 729 ;\n" +"C -1 ; WX 722 ; N Dcroat ; B 0 0 681 729 ;\nC -1 ; WX 611 ; N Zacute ; B 30 0 57" +"8 936 ;\nC -1 ; WX 722 ; N Uring ; B 76 -23 654 949 ;\nC -1 ; WX 611 ; N gbreve " +"; B 34 -218 541 748 ;\nC -1 ; WX 556 ; N eogonek ; B 21 -234 525 549 ;\nC -1 ; W" +"X 556 ; N edotaccent ; B 22 -23 525 743 ;\nC -1 ; WX 556 ; N ecaron ; B 22 -23 5" +"25 757 ;\nC -1 ; WX 722 ; N Ugrave ; B 76 -23 654 936 ;\nC -1 ; WX 667 ; N Thorn" +" ; B 76 0 633 729 ;\nC -1 ; WX 556 ; N eacute ; B 22 -23 525 757 ;\nC -1 ; WX 55" +"6 ; N edieresis ; B 22 -23 525 743 ;\nC -1 ; WX 707 ; N dcaron ; B 29 -23 720 72" +"9 ;\nC -1 ; WX 556 ; N ccedilla ; B 34 -220 522 549 ;\nC -1 ; WX 556 ; N ccaron " +"; B 34 -23 522 757 ;\nC -1 ; WX 556 ; N cacute ; B 34 -23 522 757 ;\nC -1 ; WX 5" +"56 ; N aogonek ; B 28 -233 548 549 ;\nC -1 ; WX 556 ; N aring ; B 28 -23 524 770" +" ;\nC -1 ; WX 556 ; N atilde ; B 28 -23 524 749 ;\nC -1 ; WX 556 ; N abreve ; B " +"28 -23 524 748 ;\nC -1 ; WX 556 ; N egrave ; B 22 -23 525 757 ;\nC -1 ; WX 556 ;" +" N agrave ; B 28 -23 524 757 ;\nC -1 ; WX 556 ; N aacute ; B 28 -23 524 757 ;\nC" +" -1 ; WX 556 ; N adieresis ; B 28 -23 524 743 ;\nC -1 ; WX 722 ; N Uogonek ; B 7" +"6 -234 654 729 ;\nC -1 ; WX 611 ; N ugrave ; B 58 -23 541 757 ;\nC -1 ; WX 611 ;" +" N uacute ; B 58 -23 541 757 ;\nC -1 ; WX 611 ; N udieresis ; B 58 -23 541 743 ;" +"\nC -1 ; WX 385 ; N tcaron ; B 14 -23 398 829 ;\nC -1 ; WX 556 ; N scommaaccent " +"; B 29 -307 520 549 ;\nC -1 ; WX 611 ; N Zcaron ; B 30 0 578 936 ;\nC -1 ; WX 55" +"6 ; N ecircumflex ; B 22 -23 525 757 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 76 -23" +" 654 936 ;\nC -1 ; WX 556 ; N acircumflex ; B 28 -23 524 757 ;\nC -1 ; WX 611 ; " +"N Zdotaccent ; B 30 0 578 922 ;\nC -1 ; WX 556 ; N scaron ; B 29 -23 520 757 ;\n" +"C -1 ; WX 722 ; N Amacron ; B 26 0 703 898 ;\nC -1 ; WX 556 ; N sacute ; B 29 -2" +"3 520 757 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 14 -307 598 729 ;\nC -1 ; WX 667" +" ; N Ydieresis ; B 27 0 650 922 ;\nC -1 ; WX 611 ; N thorn ; B 58 -218 574 729 ;" +"\nC -1 ; WX 667 ; N Emacron ; B 79 0 624 898 ;\nC -1 ; WX 778 ; N Ograve ; B 40 " +"-23 742 936 ;\nC -1 ; WX 778 ; N Oacute ; B 40 -23 742 936 ;\nC -1 ; WX 778 ; N " +"Odieresis ; B 40 -23 742 922 ;\nC -1 ; WX 722 ; N Ntilde ; B 68 0 661 928 ;\nC -" +"1 ; WX 722 ; N Ncaron ; B 68 0 661 936 ;\nC -1 ; WX 722 ; N Nacute ; B 68 0 661 " +"936 ;\nC -1 ; WX 611 ; N Lcaron ; B 80 0 579 729 ;\nC -1 ; WX 611 ; N Lacute ; B" +" 80 0 579 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 63 0 213 922 ;\nC -1 ; WX 389 " +"; N racute ; B 63 0 370 757 ;\nC -1 ; WX 278 ; N Icircumflex ; B -19 0 299 936 ;" +"\nC -1 ; WX 611 ; N ohungarumlaut ; B 35 -23 569 757 ;\nC -1 ; WX 611 ; N otilde" +" ; B 35 -23 569 749 ;\nC -1 ; WX 556 ; N Euro ; B 6 -23 546 724 ;\nC -1 ; WX 611" +" ; N ocircumflex ; B 35 -23 569 757 ;\nC -1 ; WX 351 ; N onesuperior ; B 40 284 " +"242 709 ;\nC -1 ; WX 351 ; N twosuperior ; B 16 284 328 718 ;\nC -1 ; WX 351 ; N" +" threesuperior ; B 15 271 329 718 ;\nC -1 ; WX 278 ; N Igrave ; B -10 0 213 936 " +";\nC -1 ; WX 278 ; N Iacute ; B 63 0 290 936 ;\nC -1 ; WX 278 ; N Imacron ; B 2 " +"0 274 898 ;\nC -1 ; WX 278 ; N Iogonek ; B 34 -233 237 729 ;\nC -1 ; WX 278 ; N " +"Idieresis ; B -9 0 287 922 ;\nC -1 ; WX 778 ; N Gbreve ; B 42 -23 711 927 ;\nC -" +"1 ; WX 722 ; N Umacron ; B 76 -23 654 898 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B " +"74 -307 717 729 ;\nC -1 ; WX 611 ; N ograve ; B 35 -23 569 757 ;\nC -1 ; WX 667 " +"; N Scommaaccent ; B 32 -307 633 741 ;\nC -1 ; WX 667 ; N Eogonek ; B 79 -233 64" +"8 729 ;\nC -1 ; WX 611 ; N oacute ; B 35 -23 569 757 ;\nC -1 ; WX 667 ; N Edotac" +"cent ; B 79 0 624 922 ;\nC -1 ; WX 278 ; N iogonek ; B 34 -233 231 729 ;\nC -1 ;" +" WX 611 ; N gcommaaccent ; B 34 -218 541 853 ;\nC -1 ; WX 611 ; N odieresis ; B " +"35 -23 569 743 ;\nC -1 ; WX 611 ; N ntilde ; B 63 0 546 749 ;\nC -1 ; WX 611 ; N" +" ncaron ; B 63 0 546 757 ;\nC -1 ; WX 667 ; N Ecaron ; B 79 0 624 936 ;\nC -1 ; " +"WX 667 ; N Ecircumflex ; B 79 0 624 936 ;\nC -1 ; WX 556 ; N scedilla ; B 29 -22" +"0 520 549 ;\nC -1 ; WX 389 ; N rcaron ; B 54 0 372 757 ;\nC -1 ; WX 667 ; N Egra" +"ve ; B 79 0 624 936 ;\nC -1 ; WX 667 ; N Eacute ; B 79 0 624 936 ;\nC -1 ; WX 77" +"8 ; N Gcommaaccent ; B 42 -307 711 741 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 80 " +"-307 677 729 ;\nC -1 ; WX 667 ; N Edieresis ; B 79 0 624 922 ;\nC -1 ; WX 611 ; " +"N nacute ; B 63 0 546 757 ;\nC -1 ; WX 611 ; N uogonek ; B 58 -233 564 540 ;\nC " +"-1 ; WX 611 ; N umacron ; B 58 -23 541 719 ;\nC -1 ; WX 722 ; N Dcaron ; B 77 0 " +"681 936 ;\nC -1 ; WX 369 ; N lcaron ; B 67 0 382 729 ;\nC -1 ; WX 722 ; N Ccaron" +" ; B 44 -23 685 936 ;\nC -1 ; WX 722 ; N Cacute ; B 44 -23 685 936 ;\nC -1 ; WX " +"722 ; N Ccedilla ; B 44 -220 685 741 ;\nC -1 ; WX 606 ; N degree ; B 151 383 454" +" 686 ;\nC -1 ; WX 722 ; N Aogonek ; B 26 -233 723 729 ;\nC -1 ; WX 584 ; N minus" +" ; B 40 172 544 291 ;\nC -1 ; WX 584 ; N multiply ; B 79 18 505 444 ;\nC -1 ; WX" +" 584 ; N divide ; B 50 -11 534 474 ;\nC -1 ; WX 722 ; N Aring ; B 26 0 703 949 ;" +"\nC -1 ; WX 1000 ; N trademark ; B 71 273 929 729 ;\nC -1 ; WX 389 ; N rcommaacc" +"ent ; B 63 -307 370 549 ;\nC -1 ; WX 278 ; N lacute ; B 67 0 278 936 ;\nC -1 ; W" +"X 611 ; N omacron ; B 35 -23 569 719 ;\nC -1 ; WX 722 ; N Atilde ; B 26 0 703 92" +"8 ;\nC -1 ; WX 278 ; N icircumflex ; B -19 0 299 757 ;\nC -1 ; WX 278 ; N igrave" +" ; B -10 0 207 757 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 63 -307 546 549 ;\nC -1" +" ; WX 278 ; N lcommaaccent ; B 67 -307 207 729 ;\nC -1 ; WX 584 ; N plusminus ; " +"B 56 -16 527 608 ;\nC -1 ; WX 869 ; N onehalf ; B 40 -20 846 715 ;\nC -1 ; WX 86" +"9 ; N onequarter ; B 40 -20 850 715 ;\nC -1 ; WX 869 ; N threequarters ; B 15 -2" +"0 850 718 ;\nC -1 ; WX 278 ; N iacute ; B 67 0 290 757 ;\nC -1 ; WX 722 ; N Abre" +"ve ; B 26 0 703 927 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 59 -307 548 729 ;\nC -" +"1 ; WX 778 ; N Omacron ; B 40 -23 742 898 ;\nC -1 ; WX 278 ; N imacron ; B 7 0 2" +"66 719 ;\nC -1 ; WX 556 ; N emacron ; B 22 -23 525 719 ;\nC -1 ; WX 556 ; N amac" +"ron ; B 28 -23 524 719 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 14 -307 301 674 ;\n" +"C -1 ; WX 556 ; N ydieresis ; B 9 -219 538 743 ;\nC -1 ; WX 500 ; N zdotaccent ;" +" B 21 0 468 743 ;\nC -1 ; WX 500 ; N zcaron ; B 21 0 468 757 ;\nC -1 ; WX 500 ; " +"N zacute ; B 21 0 468 757 ;\nC -1 ; WX 556 ; N yacute ; B 9 -219 538 757 ;\nC -1" +" ; WX 611 ; N uhungarumlaut ; B 58 -23 559 757 ;\nC -1 ; WX 611 ; N eth ; B 35 -" +"23 569 744 ;\nC -1 ; WX 611 ; N uring ; B 58 -23 541 770 ;\nC -1 ; WX 778 ; N Oc" +"ircumflex ; B 40 -23 742 936 ;\nC -1 ; WX 333 ; N commaaccent ; B 112 -307 234 -" +"60 ;\nC -1 ; WX 737 ; N copyright ; B -14 -22 751 743 ;\nC -1 ; WX 737 ; N regis" +"tered ; B -14 -22 751 743 ;\nC -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ;\nC" +" -1 ; WX 278 ; N idieresis ; B -9 0 287 743 ;\nC -1 ; WX 489 ; N lozenge ; B 16 " +"0 462 744 ;\nC -1 ; WX 729 ; N Delta ; B 8 0 721 729 ;\nC -1 ; WX 548 ; N notequ" +"al ; B 50 -69 534 528 ;\nC -1 ; WX 542 ; N radical ; B 7 -36 512 913 ;\nC -1 ; W" +"X 722 ; N Agrave ; B 26 0 703 936 ;\nC -1 ; WX 722 ; N Aacute ; B 26 0 703 936 ;" +"\nC -1 ; WX 584 ; N lessequal ; B 45 -10 534 639 ;\nC -1 ; WX 584 ; N greaterequ" +"al ; B 45 -10 534 639 ;\nC -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ;\nC -1 " +"; WX 711 ; N summation ; B 17 -96 694 760 ;\nC -1 ; WX 490 ; N partialdiff ; B 2" +"2 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 661 729 ;\nC -1 ; WX" +" 611 ; N dcroat ; B 29 -23 605 729 ;\nC -1 ; WX 280 ; N brokenbar ; B 100 -200 1" +"80 729 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 80 -307 579 729 ;\nC -1 ; WX 722 ; " +"N Adieresis ; B 26 0 703 922 ;\nC -1 ; WX 611 ; N mu ; B 58 -220 573 540 ;\nC -1" +" ; WX 278 ; N .notdef ; B 214 0 214 0 ;\nEndCharMetrics\nStartKernData\nStartKer" +"nPairs 998\nKPX A C -33\nKPX A Ccedilla -33\nKPX A G -35\nKPX A O -34\nKPX A Odi" +"eresis -34\nKPX A Q -35\nKPX A T -81\nKPX A U -32\nKPX A Uacute -32\nKPX A Ucirc" +"umflex -32\nKPX A Udieresis -32\nKPX A Ugrave -32\nKPX A V -66\nKPX A W -51\nKPX" +" A Y -90\nKPX A a -1\nKPX A b -1\nKPX A c -14\nKPX A ccedilla -14\nKPX A comma 1" +"9\nKPX A d -13\nKPX A e -9\nKPX A g -14\nKPX A guillemotleft -43\nKPX A guilsing" +"lleft -40\nKPX A hyphen 7\nKPX A o -16\nKPX A period 19\nKPX A q -12\nKPX A quot" +"edblright -65\nKPX A quoteright -61\nKPX A t -18\nKPX A u -12\nKPX A v -37\nKPX " +"A w -23\nKPX A y -35\nKPX Aacute C -33\nKPX Aacute G -35\nKPX Aacute O -34\nKPX " +"Aacute Q -35\nKPX Aacute T -81\nKPX Aacute U -32\nKPX Aacute V -66\nKPX Aacute W" +" -51\nKPX Aacute Y -90\nKPX Aacute a -1\nKPX Aacute b -1\nKPX Aacute c -14\nKPX " +"Aacute comma 19\nKPX Aacute d -13\nKPX Aacute e -9\nKPX Aacute g -14\nKPX Aacute" +" guillemotleft -43\nKPX Aacute guilsinglleft -40\nKPX Aacute hyphen 7\nKPX Aacut" +"e o -16\nKPX Aacute period 19\nKPX Aacute q -12\nKPX Aacute quoteright -61\nKPX " +"Aacute t -18\nKPX Aacute u -12\nKPX Aacute v -37\nKPX Aacute w -23\nKPX Aacute y" +" -35\nKPX Acircumflex C -33\nKPX Acircumflex G -35\nKPX Acircumflex O -34\nKPX A" +"circumflex Q -35\nKPX Acircumflex T -81\nKPX Acircumflex U -32\nKPX Acircumflex " +"V -66\nKPX Acircumflex W -51\nKPX Acircumflex Y -90\nKPX Acircumflex comma 19\nK" +"PX Acircumflex period 19\nKPX Adieresis C -33\nKPX Adieresis G -35\nKPX Adieresi" +"s O -34\nKPX Adieresis Q -35\nKPX Adieresis T -81\nKPX Adieresis U -32\nKPX Adie" +"resis V -66\nKPX Adieresis W -51\nKPX Adieresis Y -90\nKPX Adieresis a -1\nKPX A" +"dieresis b -1\nKPX Adieresis c -14\nKPX Adieresis comma 19\nKPX Adieresis d -13\n" +"KPX Adieresis g -14\nKPX Adieresis guillemotleft -43\nKPX Adieresis guilsingllef" +"t -40\nKPX Adieresis hyphen 7\nKPX Adieresis o -16\nKPX Adieresis period 19\nKPX" +" Adieresis q -12\nKPX Adieresis quotedblright -65\nKPX Adieresis quoteright -61\n" +"KPX Adieresis t -18\nKPX Adieresis u -12\nKPX Adieresis v -37\nKPX Adieresis w -" +"23\nKPX Adieresis y -35\nKPX Agrave C -33\nKPX Agrave G -35\nKPX Agrave O -34\nK" +"PX Agrave Q -35\nKPX Agrave T -81\nKPX Agrave U -32\nKPX Agrave V -66\nKPX Agrav" +"e W -51\nKPX Agrave Y -90\nKPX Agrave comma 19\nKPX Agrave period 19\nKPX Aring " +"C -33\nKPX Aring G -35\nKPX Aring O -34\nKPX Aring Q -35\nKPX Aring T -81\nKPX A" +"ring U -32\nKPX Aring V -66\nKPX Aring W -51\nKPX Aring Y -90\nKPX Aring a -1\nK" +"PX Aring b -1\nKPX Aring c -14\nKPX Aring comma 19\nKPX Aring d -13\nKPX Aring e" +" -9\nKPX Aring g -14\nKPX Aring guillemotleft -43\nKPX Aring guilsinglleft -40\n" +"KPX Aring hyphen 7\nKPX Aring o -16\nKPX Aring period 19\nKPX Aring q -12\nKPX A" +"ring quotedblright -65\nKPX Aring quoteright -61\nKPX Aring t -18\nKPX Aring u -" +"12\nKPX Aring v -37\nKPX Aring w -23\nKPX Aring y -35\nKPX Atilde C -33\nKPX Ati" +"lde G -35\nKPX Atilde O -34\nKPX Atilde Q -35\nKPX Atilde T -81\nKPX Atilde U -3" +"2\nKPX Atilde V -66\nKPX Atilde W -51\nKPX Atilde Y -90\nKPX Atilde comma 19\nKP" +"X Atilde period 19\nKPX B A -32\nKPX B AE -20\nKPX B Aacute -32\nKPX B Acircumfl" +"ex -32\nKPX B Adieresis -32\nKPX B Aring -32\nKPX B Atilde -32\nKPX B O -11\nKPX" +" B OE -2\nKPX B Oacute -11\nKPX B Ocircumflex -11\nKPX B Odieresis -11\nKPX B Og" +"rave -11\nKPX B Oslash -5\nKPX B V -39\nKPX B W -27\nKPX B Y -51\nKPX C A -29\nK" +"PX C AE -17\nKPX C Aacute -29\nKPX C Adieresis -29\nKPX C Aring -29\nKPX C H 5\n" +"KPX C K 2\nKPX C O -6\nKPX C Oacute -6\nKPX C Odieresis -6\nKPX Ccedilla A -28\n" +"KPX D A -37\nKPX D Aacute -37\nKPX D Acircumflex -37\nKPX D Adieresis -37\nKPX D" +" Agrave -37\nKPX D Aring -37\nKPX D Atilde -37\nKPX D J 2\nKPX D T -17\nKPX D V " +"-35\nKPX D W -20\nKPX D X -35\nKPX D Y -56\nKPX F A -63\nKPX F Aacute -63\nKPX F" +" Acircumflex -63\nKPX F Adieresis -63\nKPX F Agrave -63\nKPX F Aring -63\nKPX F " +"Atilde -63\nKPX F J -25\nKPX F O -16\nKPX F Odieresis -16\nKPX F a -15\nKPX F aa" +"cute -15\nKPX F adieresis -15\nKPX F ae -17\nKPX F aring -15\nKPX F comma -76\nK" +"PX F e -7\nKPX F eacute -7\nKPX F hyphen 11\nKPX F i -7\nKPX F j -9\nKPX F o -14" +"\nKPX F oacute -14\nKPX F odieresis -14\nKPX F oe -8\nKPX F oslash -15\nKPX F pe" +"riod -75\nKPX F r -27\nKPX F u -24\nKPX G A -8\nKPX G AE 4\nKPX G Aacute -8\nKPX" +" G Acircumflex -8\nKPX G Adieresis -8\nKPX G Agrave -8\nKPX G Aring -8\nKPX G At" +"ilde -8\nKPX G T -17\nKPX G V -36\nKPX G W -20\nKPX G Y -56\nKPX J A -32\nKPX J " +"AE -20\nKPX J Adieresis -32\nKPX J Aring -32\nKPX K C -53\nKPX K G -55\nKPX K O " +"-54\nKPX K OE -44\nKPX K Oacute -54\nKPX K Odieresis -54\nKPX K S -30\nKPX K T 1" +"3\nKPX K a -3\nKPX K adieresis -3\nKPX K ae 0\nKPX K aring -3\nKPX K e -25\nKPX " +"K hyphen -44\nKPX K o -33\nKPX K oacute -33\nKPX K odieresis -33\nKPX K u -23\nK" +"PX K udieresis -23\nKPX K y -65\nKPX L A 9\nKPX L AE 21\nKPX L Aacute 9\nKPX L A" +"dieresis 9\nKPX L Aring 9\nKPX L C -26\nKPX L Ccedilla -26\nKPX L G -30\nKPX L O" +" -29\nKPX L Oacute -29\nKPX L Ocircumflex -29\nKPX L Odieresis -29\nKPX L Ograve" +" -29\nKPX L Otilde -29\nKPX L S -2\nKPX L T -95\nKPX L U -24\nKPX L Udieresis -2" +"4\nKPX L V -90\nKPX L W -68\nKPX L Y -112\nKPX L hyphen -12\nKPX L quotedblright" +" -141\nKPX L quoteright -138\nKPX L u -7\nKPX L udieresis -7\nKPX L y -55\nKPX N" +" A -5\nKPX N AE 7\nKPX N Aacute -5\nKPX N Adieresis -5\nKPX N Aring -5\nKPX N C " +"9\nKPX N Ccedilla 9\nKPX N G 8\nKPX N O 8\nKPX N Oacute 8\nKPX N Odieresis 8\nKP" +"X N a 13\nKPX N aacute 13\nKPX N adieresis 13\nKPX N ae 13\nKPX N aring 13\nKPX " +"N comma 15\nKPX N e 18\nKPX N eacute 18\nKPX N o 11\nKPX N oacute 11\nKPX N odie" +"resis 11\nKPX N oslash 11\nKPX N period 16\nKPX N u 12\nKPX N udieresis 12\nKPX " +"O A -37\nKPX O AE -26\nKPX O Aacute -37\nKPX O Adieresis -37\nKPX O Aring -37\nK" +"PX O T -20\nKPX O V -36\nKPX O W -21\nKPX O X -36\nKPX O Y -59\nKPX Oacute A -37" +"\nKPX Oacute T -20\nKPX Oacute V -36\nKPX Oacute W -21\nKPX Oacute Y -59\nKPX Oc" +"ircumflex T -20\nKPX Ocircumflex V -36\nKPX Ocircumflex Y -59\nKPX Odieresis A -" +"37\nKPX Odieresis T -20\nKPX Odieresis V -36\nKPX Odieresis W -21\nKPX Odieresis" +" X -36\nKPX Odieresis Y -59\nKPX Ograve T -20\nKPX Ograve V -36\nKPX Ograve Y -5" +"9\nKPX Oslash A -32\nKPX Otilde T -20\nKPX Otilde V -36\nKPX Otilde Y -59\nKPX P" +" A -65\nKPX P AE -54\nKPX P Aacute -65\nKPX P Adieresis -65\nKPX P Aring -65\nKP" +"X P J -44\nKPX P a -7\nKPX P aacute -7\nKPX P adieresis -7\nKPX P ae -8\nKPX P a" +"ring -7\nKPX P comma -94\nKPX P e -8\nKPX P eacute -8\nKPX P hyphen 0\nKPX P o -" +"14\nKPX P oacute -14\nKPX P odieresis -14\nKPX P oe -8\nKPX P oslash -17\nKPX P " +"period -94\nKPX R C -5\nKPX R Ccedilla -5\nKPX R G -6\nKPX R O -6\nKPX R OE 3\nK" +"PX R Oacute -6\nKPX R Odieresis -6\nKPX R T 0\nKPX R U -4\nKPX R Udieresis -4\nK" +"PX R V -26\nKPX R W -17\nKPX R Y -37\nKPX R a 0\nKPX R aacute 0\nKPX R adieresis" +" 0\nKPX R ae 0\nKPX R aring 0\nKPX R e 2\nKPX R eacute 2\nKPX R hyphen 15\nKPX R" +" o -4\nKPX R oacute -4\nKPX R odieresis -4\nKPX R oe 1\nKPX R u 0\nKPX R uacute " +"0\nKPX R udieresis 0\nKPX R y 5\nKPX S A -20\nKPX S AE -8\nKPX S Aacute -20\nKPX" +" S Adieresis -20\nKPX S Aring -20\nKPX S T -5\nKPX S V -31\nKPX S W -17\nKPX S Y" +" -43\nKPX S t 1\nKPX T A -87\nKPX T AE -75\nKPX T Aacute -87\nKPX T Acircumflex " +"-87\nKPX T Adieresis -87\nKPX T Agrave -87\nKPX T Aring -87\nKPX T Atilde -87\nK" +"PX T C -20\nKPX T G -22\nKPX T J -87\nKPX T O -22\nKPX T OE -11\nKPX T Oacute -2" +"2\nKPX T Ocircumflex -22\nKPX T Odieresis -22\nKPX T Ograve -22\nKPX T Oslash -2" +"3\nKPX T Otilde -22\nKPX T S 3\nKPX T V 18\nKPX T W 24\nKPX T Y 16\nKPX T a -73\n" +"KPX T ae -73\nKPX T c -74\nKPX T colon -97\nKPX T comma -67\nKPX T e -69\nKPX T " +"g -75\nKPX T guillemotleft -101\nKPX T guilsinglleft -98\nKPX T hyphen -48\nKPX " +"T i -1\nKPX T j -3\nKPX T o -76\nKPX T oslash -73\nKPX T period -67\nKPX T r -71" +"\nKPX T s -74\nKPX T semicolon -98\nKPX T u -72\nKPX T v -82\nKPX T w -77\nKPX T" +" y -80\nKPX U A -34\nKPX U AE -22\nKPX U Aacute -34\nKPX U Acircumflex -34\nKPX " +"U Adieresis -34\nKPX U Aring -34\nKPX U Atilde -34\nKPX U comma -7\nKPX U m 6\nK" +"PX U n 5\nKPX U p 7\nKPX U period -4\nKPX U r 5\nKPX Uacute A -34\nKPX Uacute co" +"mma -7\nKPX Uacute m 6\nKPX Uacute n 5\nKPX Uacute p 7\nKPX Uacute period -4\nKP" +"X Uacute r 5\nKPX Ucircumflex A -34\nKPX Udieresis A -34\nKPX Udieresis b 6\nKPX" +" Udieresis comma -7\nKPX Udieresis m 6\nKPX Udieresis n 5\nKPX Udieresis p 7\nKP" +"X Udieresis period -4\nKPX Udieresis r 5\nKPX Ugrave A -34\nKPX V A -71\nKPX V A" +"E -59\nKPX V Aacute -71\nKPX V Acircumflex -71\nKPX V Adieresis -71\nKPX V Agrav" +"e -71\nKPX V Aring -71\nKPX V Atilde -71\nKPX V C -36\nKPX V G -38\nKPX V O -37\n" +"KPX V Oacute -37\nKPX V Ocircumflex -37\nKPX V Odieresis -37\nKPX V Ograve -37\n" +"KPX V Oslash -31\nKPX V Otilde -37\nKPX V S -21\nKPX V T 21\nKPX V a -47\nKPX V " +"ae -48\nKPX V colon -65\nKPX V comma -69\nKPX V e -43\nKPX V g -49\nKPX V guille" +"motleft -74\nKPX V guilsinglleft -72\nKPX V hyphen -21\nKPX V i -5\nKPX V o -50\n" +"KPX V oslash -48\nKPX V period -69\nKPX V r -34\nKPX V semicolon -67\nKPX V u -3" +"4\nKPX V y -10\nKPX W A -54\nKPX W AE -43\nKPX W Aacute -54\nKPX W Acircumflex -" +"54\nKPX W Adieresis -54\nKPX W Agrave -54\nKPX W Aring -54\nKPX W Atilde -54\nKP" +"X W C -20\nKPX W G -22\nKPX W O -21\nKPX W Oacute -21\nKPX W Ocircumflex -21\nKP" +"X W Odieresis -21\nKPX W Ograve -21\nKPX W Oslash -15\nKPX W Otilde -21\nKPX W S" +" -12\nKPX W T 25\nKPX W a -29\nKPX W ae -29\nKPX W colon -53\nKPX W comma -45\nK" +"PX W e -24\nKPX W g -30\nKPX W guillemotleft -55\nKPX W guilsinglleft -53\nKPX W" +" hyphen -3\nKPX W i -1\nKPX W o -31\nKPX W oslash -29\nKPX W period -45\nKPX W r" +" -24\nKPX W semicolon -54\nKPX W u -23\nKPX W y 0\nKPX X C -34\nKPX X O -35\nKPX" +" X Odieresis -35\nKPX X Q -37\nKPX X a -5\nKPX X e -25\nKPX X hyphen -27\nKPX X " +"o -32\nKPX X u -25\nKPX X y -40\nKPX Y A -86\nKPX Y AE -74\nKPX Y Aacute -86\nKP" +"X Y Acircumflex -86\nKPX Y Adieresis -86\nKPX Y Agrave -86\nKPX Y Aring -86\nKPX" +" Y Atilde -86\nKPX Y C -52\nKPX Y G -54\nKPX Y O -54\nKPX Y Oacute -54\nKPX Y Oc" +"ircumflex -54\nKPX Y Odieresis -54\nKPX Y Ograve -54\nKPX Y Oslash -47\nKPX Y Ot" +"ilde -54\nKPX Y S -29\nKPX Y T 22\nKPX Y a -66\nKPX Y ae -67\nKPX Y colon -81\nK" +"PX Y comma -78\nKPX Y e -63\nKPX Y g -68\nKPX Y guillemotleft -98\nKPX Y guilsin" +"glleft -96\nKPX Y hyphen -50\nKPX Y i -3\nKPX Y o -70\nKPX Y oslash -67\nKPX Y p" +" -45\nKPX Y period -78\nKPX Y semicolon -83\nKPX Y u -48\nKPX Y v -27\nKPX Z v -" +"11\nKPX Z y -9\nKPX a j -1\nKPX a quoteright -11\nKPX a v -19\nKPX a w -5\nKPX a" +" y -17\nKPX aacute v -19\nKPX aacute w -5\nKPX aacute y -17\nKPX adieresis v -19" +"\nKPX adieresis w -5\nKPX adieresis y -17\nKPX ae v -21\nKPX ae w -7\nKPX ae y -" +"19\nKPX agrave v -19\nKPX agrave w -5\nKPX agrave y -17\nKPX aring v -19\nKPX ar" +"ing w -5\nKPX aring y -17\nKPX b v -20\nKPX b w -7\nKPX b y -20\nKPX c h 0\nKPX " +"c k 3\nKPX comma one -73\nKPX comma quotedblright -33\nKPX comma quoteright -30\n" +"KPX e quoteright -12\nKPX e t -4\nKPX e v -19\nKPX e w -6\nKPX e x -21\nKPX e y " +"-17\nKPX eacute v -19\nKPX eacute w -6\nKPX eacute y -17\nKPX ecircumflex v -19\n" +"KPX ecircumflex w -6\nKPX ecircumflex y -17\nKPX eight four 10\nKPX eight one -2" +"3\nKPX eight seven -6\nKPX f a 1\nKPX f aacute 1\nKPX f adieresis 1\nKPX f ae 0\n" +"KPX f aring 1\nKPX f e -3\nKPX f eacute -3\nKPX f f 21\nKPX f i -3\nKPX f j -6\n" +"KPX f l -3\nKPX f o -9\nKPX f oacute -9\nKPX f odieresis -9\nKPX f oe -3\nKPX f " +"oslash -9\nKPX f quoteright 10\nKPX f s -1\nKPX f t 21\nKPX five four 6\nKPX fiv" +"e one -29\nKPX five seven -10\nKPX four four 9\nKPX four one -50\nKPX four seven" +" -28\nKPX g a 3\nKPX g adieresis 3\nKPX g ae 3\nKPX g aring 3\nKPX g e 8\nKPX g " +"eacute 8\nKPX g l 0\nKPX g oacute 1\nKPX g odieresis 1\nKPX g r 1\nKPX guillemot" +"right A -51\nKPX guillemotright AE -39\nKPX guillemotright Aacute -51\nKPX guill" +"emotright Adieresis -51\nKPX guillemotright Aring -51\nKPX guillemotright T -108" +"\nKPX guillemotright V -78\nKPX guillemotright W -60\nKPX guillemotright Y -111\n" +"KPX guilsinglright A -46\nKPX guilsinglright AE -35\nKPX guilsinglright Aacute -" +"46\nKPX guilsinglright Adieresis -46\nKPX guilsinglright Aring -46\nKPX guilsing" +"lright T -104\nKPX guilsinglright V -74\nKPX guilsinglright W -56\nKPX guilsingl" +"right Y -107\nKPX h quoteright -14\nKPX h y -21\nKPX hyphen A -1\nKPX hyphen AE " +"10\nKPX hyphen Aacute -1\nKPX hyphen Adieresis -1\nKPX hyphen Aring -1\nKPX hyph" +"en T -57\nKPX hyphen V -27\nKPX hyphen W -9\nKPX hyphen Y -64\nKPX i T -4\nKPX i" +" j -2\nKPX k a -2\nKPX k aacute -2\nKPX k adieresis -2\nKPX k ae 1\nKPX k aring " +"-2\nKPX k comma 7\nKPX k e -15\nKPX k eacute -15\nKPX k g -21\nKPX k hyphen -25\n" +"KPX k o -22\nKPX k oacute -22\nKPX k odieresis -22\nKPX k period 6\nKPX k s -10\n" +"KPX k u -1\nKPX k udieresis -1\nKPX l v -5\nKPX l y -2\nKPX m p 6\nKPX m v -19\n" +"KPX m w -6\nKPX m y -18\nKPX n T -80\nKPX n p 5\nKPX n quoteright -12\nKPX n v -" +"20\nKPX n w -7\nKPX n y -19\nKPX nine four 4\nKPX nine one -21\nKPX nine seven -" +"17\nKPX o T -84\nKPX o quoteright -17\nKPX o t -8\nKPX o v -23\nKPX o w -10\nKPX" +" o x -25\nKPX o y -22\nKPX oacute v -23\nKPX oacute w -10\nKPX oacute y -22\nKPX" +" ocircumflex t -8\nKPX odieresis t -8\nKPX odieresis v -23\nKPX odieresis w -10\n" +"KPX odieresis x -25\nKPX odieresis y -22\nKPX ograve v -23\nKPX ograve w -10\nKP" +"X ograve y -22\nKPX one comma -42\nKPX one eight -37\nKPX one five -43\nKPX one " +"four -56\nKPX one nine -39\nKPX one one -85\nKPX one period -42\nKPX one seven -" +"65\nKPX one six -37\nKPX one three -44\nKPX one two -47\nKPX one zero -34\nKPX p" +" t -5\nKPX p y -20\nKPX period one -73\nKPX period quotedblright -32\nKPX period" +" quoteright -29\nKPX q c 4\nKPX q u 4\nKPX quotedblbase A 12\nKPX quotedblbase A" +"E 24\nKPX quotedblbase T -75\nKPX quotedblbase V -73\nKPX quotedblbase W -51\nKP" +"X quotedblbase Y -92\nKPX quotedblleft A -68\nKPX quotedblleft AE -57\nKPX quote" +"dblleft Aacute -68\nKPX quotedblleft Adieresis -68\nKPX quotedblleft Aring -68\n" +"KPX quotedblleft T -2\nKPX quotedblleft V 6\nKPX quotedblleft W 16\nKPX quotedbl" +"left Y -9\nKPX quotedblright A -69\nKPX quotedblright AE -57\nKPX quotedblright " +"Aacute -69\nKPX quotedblright Adieresis -69\nKPX quotedblright Aring -69\nKPX qu" +"otedblright T 1\nKPX quotedblright V 7\nKPX quotedblright W 17\nKPX quotedblrigh" +"t Y -7\nKPX quoteleft A -73\nKPX quoteleft AE -62\nKPX quoteleft Aacute -73\nKPX" +" quoteleft Adieresis -73\nKPX quoteleft Aring -73\nKPX quoteleft T -7\nKPX quote" +"left V 2\nKPX quoteleft W 11\nKPX quoteleft Y -13\nKPX quoteright A -77\nKPX quo" +"teright AE -66\nKPX quoteright Aacute -77\nKPX quoteright Adieresis -77\nKPX quo" +"teright Aring -77\nKPX quoteright comma -46\nKPX quoteright d -27\nKPX quoterigh" +"t o -30\nKPX quoteright period -45\nKPX quoteright r -15\nKPX quoteright s -22\n" +"KPX quoteright t -4\nKPX quoteright v -5\nKPX quoteright w 1\nKPX quoteright y -" +"3\nKPX r a 6\nKPX r aacute 6\nKPX r acircumflex 6\nKPX r adieresis 6\nKPX r ae 4" +"\nKPX r agrave 6\nKPX r aring 6\nKPX r c 0\nKPX r ccedilla 0\nKPX r colon -27\nK" +"PX r comma -57\nKPX r d 0\nKPX r e 4\nKPX r eacute 4\nKPX r ecircumflex 4\nKPX r" +" egrave 4\nKPX r f 22\nKPX r g -2\nKPX r h -4\nKPX r hyphen -35\nKPX r i -4\nKPX" +" r j -6\nKPX r k 0\nKPX r l -4\nKPX r m -1\nKPX r n -2\nKPX r o -1\nKPX r oacute" +" -1\nKPX r ocircumflex -1\nKPX r odieresis -1\nKPX r oe 5\nKPX r ograve -1\nKPX " +"r oslash -4\nKPX r p 0\nKPX r period -57\nKPX r q 1\nKPX r quoteright 14\nKPX r " +"r -2\nKPX r s 3\nKPX r semicolon -27\nKPX r t 22\nKPX r u 0\nKPX r v 21\nKPX r w" +" 26\nKPX r x 17\nKPX r y 23\nKPX r z 9\nKPX s quoteright -12\nKPX s t -1\nKPX se" +"ven colon -63\nKPX seven comma -88\nKPX seven eight -3\nKPX seven five -21\nKPX " +"seven four -62\nKPX seven one -14\nKPX seven period -87\nKPX seven seven 9\nKPX " +"seven six -13\nKPX seven three 0\nKPX seven two -4\nKPX six four 7\nKPX six one " +"-21\nKPX six seven -3\nKPX t S 0\nKPX t a 6\nKPX t aacute 6\nKPX t adieresis 6\n" +"KPX t ae 7\nKPX t aring 6\nKPX t colon -25\nKPX t e -3\nKPX t eacute -3\nKPX t h" +" 2\nKPX t o -10\nKPX t oacute -10\nKPX t odieresis -10\nKPX t quoteright 4\nKPX " +"t semicolon -25\nKPX three four 6\nKPX three one -27\nKPX three seven -10\nKPX t" +"wo four -9\nKPX two one -16\nKPX two seven -3\nKPX u quoteright -2\nKPX v a -15\n" +"KPX v aacute -15\nKPX v acircumflex -15\nKPX v adieresis -15\nKPX v ae -16\nKPX " +"v agrave -15\nKPX v aring -15\nKPX v atilde -15\nKPX v c -20\nKPX v colon -32\nK" +"PX v comma -51\nKPX v e -15\nKPX v eacute -15\nKPX v ecircumflex -15\nKPX v egra" +"ve -15\nKPX v g -21\nKPX v hyphen 0\nKPX v l -5\nKPX v o -22\nKPX v oacute -22\n" +"KPX v odieresis -22\nKPX v ograve -22\nKPX v oslash -20\nKPX v period -50\nKPX v" +" s -17\nKPX v semicolon -34\nKPX w a -7\nKPX w aacute -7\nKPX w acircumflex -7\n" +"KPX w adieresis -7\nKPX w ae -8\nKPX w agrave -7\nKPX w aring -7\nKPX w atilde -" +"7\nKPX w c -8\nKPX w colon -27\nKPX w comma -33\nKPX w e -3\nKPX w eacute -3\nKP" +"X w ecircumflex -3\nKPX w egrave -3\nKPX w g -9\nKPX w hyphen 11\nKPX w l -1\nKP" +"X w o -10\nKPX w oacute -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w oslash" +" -8\nKPX w period -32\nKPX w s -9\nKPX w semicolon -29\nKPX x a -9\nKPX x c -22\n" +"KPX x e -17\nKPX x eacute -17\nKPX x o -24\nKPX x q -20\nKPX y a -14\nKPX y aacu" +"te -14\nKPX y acircumflex -14\nKPX y adieresis -14\nKPX y ae -15\nKPX y agrave -" +"14\nKPX y aring -14\nKPX y atilde -14\nKPX y c -21\nKPX y colon -31\nKPX y comma" +" -51\nKPX y e -16\nKPX y eacute -16\nKPX y ecircumflex -16\nKPX y egrave -16\nKP" +"X y g -21\nKPX y hyphen 0\nKPX y l -4\nKPX y o -22\nKPX y oacute -22\nKPX y odie" +"resis -22\nKPX y ograve -22\nKPX y oslash -20\nKPX y period -50\nKPX y s -16\nKP" +"X y semicolon -33\nKPX zero four 5\nKPX zero one -19\nKPX zero seven -10\nEndKer" +"nPairs\nEndKernData\nEndFontMetrics\n" +; +int n019004l_pfb_len = 35941; +char* n019004l_pfb = +"\x80\x1W\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05\n%%CreationDate: Wed D" +"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" +"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" +" (GNU General Public License) for license conditions.\n% As a special exception," +" permission is granted to include this font\n% program in a Postscript or PDF fi" +"le that consists of a document that\n% contains text to be displayed or printed " +"using this font, regardless\n% of the conditions or license applying to the docu" +"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" +"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" +" file COPYING (GNU General Public License) for license conditions. As a special " +"exception, permission is granted to include this font program in a Postscript or" +" PDF file that consists of a document that contains text to be displayed or prin" +"ted using this font, regardless of the conditions or license applying to the doc" +"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" +"W)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Bold) readonly" +" def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Bold) readonly def\n/It" +"alicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -155 def\n/Underl" +"ineThickness 69 def\nend readonly def\n/FontName /NimbusSanL-Bold def\n/PaintTyp" +"e 0 def\n/WMode 0 def\n/FontBBox {-173 -307 1003 949} readonly def\n/FontType 1 " +"def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding StandardE" +"ncoding def\n/UniqueID 5020904 def\ncurrentdict end\ncurrentfile eexec\r\x80\x2\xe6" +"\x83\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93" +"\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6" +"\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd" +"fA-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e" +"\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9d" +"n\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13" +"\x1d\xee\x0[AX\x5\xa1m\x8a\x12>ne\x92\xe5\xa3\xb7\x9fh\xc9m\x82\x10\xcd\x36\xcf\x35" +"tL=7By#m\xea\xae\x63wW\xf3\x15\xa4\x1{\xcd\xaa\x87\xb0\x15\xf5\xc6\xb4\xcb\x91\xd4" +"\xeeG\xf0\x38nq.!\x98^1&\xd9:K4!}\xd5U\xe\xb0\xb6qR\x96\x18\x85[\xd1\xbe\xfa'n\x4" +"\x19\x84\xa6\xcf\xd7_\x9a\xf3\xbd\xf3\x92\xa7\xf8\xcf\xa3\xe2\x9c\x8\x10\x2\xe7\x41" +"\x99{\xfb\x13\xcez\xee\xb8\x99\xc/\xa6\x7f\xc\xc1\x95\xbc\xe6\xdbQ\xce\xa8\xc5\x15" +"6y\xe2k\xc8wb\xe0\xff\xf5Q\\e@\x7\xacL\x90\xedo\x4\xf9\x7\xf7\xea\"\xc3\xc7\x80\xe5" +"*\xa2\xc6\x83W\x9c\x30K\xcb\x44\x86T\x99\xa7Z~\x86\x83\x43\x32\x35\xcf<\x12\xb0+" +"cv\xd0n\x16\xd2H%\x9b\xd7\x83\xa4\x91\x8f^\xd7\x8b\x17\xbe\xbd\x14\xf2 \x9(\x14\xb4" +"\xaf\xf6\xb7\x36S\xe0\x63|>T\x9\xd0+\xc6\x84\xac\xe7\xaaO\x12#^-\x15Q:\xb0\xe4\xa2" +"\xfN0\xbar&\xec\x15\xc5\x8\xcf\x10\xd9\xc8\x1b\x66\xf4\xd7\xa9\xb.4\x1fk\rw\xc8\xa2" +"2\xf3\xa2\xc9\x9a\x66SLj\xef-\x13\xf@?\xbe\n\xcbgO\xed b\xac\x98\x9b\xb6\xb8\x81" +"\x9c\xc8\x46\x1fP\xe6\x8\xea\x96\xf4\xcf\xd2'x\xba\x9d\x12\xad\x84\xc0\xdcx\xf7\x0" +"\x94\xba\xef\xe5\x8c\xd1\x85\xcf\x96\x98\xfbh\xe7\x83I\x4\xe6L\xbc\"V\xf8\xdd\x10" +"$\xbd\x80\xd5G\x17M\xda\xa1G|h\xac\xa8\xf2\x7fz\x2\xc5\x14g!6\xa0\x8\xe1\x90\x64" +"\xd5Tk-\xde\x6\x1c\xef\x1f\xc6\xe8\x96\nM\x83\x64\xcb\xf2^C\x93\x36\x36(\xfd\x15" +"\x92\xbf\xc5\xc5\xff\x8e@\xce\xee`\x10\x6\x97{9\xd8\xb\x45,\xed\xe5|Zs\xf9o\xa5\xe1" +"\xe0\x44\x88\x65\x9fp\xa9r\xcd\x7f\x99\xa3{\xc7\x1\x9e\xfd\x90\xaa\xfa\xc0\x37[\xc6" +"\xc9\x16'\x97\x64\x1c\x98H\xa7\xe\x8b\x0\x9d\xb4\x30=$\x89\x80\xfd>\x91zF\xf7\x0" +"\xfb}Hf\n)\x1b\x84,\xc\x9b\x12\xd1\xb9\xffy\xe\x17^z\xa6\xa2\x91\r\x1f\xbd\xb3x\xbe" +"\xf3\x80\x8b\x87\xd3\xc8\xeb\xc4X\xde\xc7,\xa5v5\x89\x13Z\x15\xba`\xb0\xaa\xf5\xce" +"z\xd3J\xce\xa4L[\xb4\xae^\xdb\x8c\xa0\xdc\x5\xb\xe1W\x9dt\xaa|\x2R\xbb\x83k\xf6\xfb" +"\xf\xdf\xe3\xf4\xe1\xbb\xe9\xe9\xbem^\xe2\x10,\xd2\\\xbd\x43\xcb\xfd\xfb\x9f\xa2" +"\xd1;\xd1\x95\x12\x1c\xd7\x3Q\xc\xb2\xd2u\xc1{O\xf9\x5\x1exg\xfb\x1\x6\xa1j\x1d\xc6" +"w\xa8\x9c \xb0\x9d\xeeN\x99S\r\x89\xa0\xee\x8e\x7\xa4w\x1d\x4\xa0zT\x7f\x14\x64k" +"\x90Slu\x9f\x1d&\xf0\x44\xf7\x90\x2J\xaaRW\x0\x4\"\x8\xa1\xa1\xcc\xaeHG\xe2\x41s" +"\xd2\x1O\xb\xab\x1b=h\x3\x64\x95\xa5\x8d \xbc\xe2;\xca;\x93\xf\xa7\x34\x66\xb8H\xbc" +"O\xffI\x9f$8\xb1i\xf9\xe6\xbc\x9c\x18X\xba\x9\xd6\x14\xc6ygf \xc4\xd2\xd4\xcfn\x18" +"\xd6<\xf4m\xac\xbb\xa6]\xff\x7\xc9\x66\xb6\x1b\x1\x18\x83\xf6\xe5\xa4\xb5<\x9a\xbc" +"=BR\xea\x42)\x19\xac\xda\xaf,\xf9Jm\xfe\x87\xd7\x11\xe2\x9a\x39\xc5r\xd0\xb9\xcb" +"`\xf5\xa5\x8d\x84g2.\xb6Z/\x8b\xc6k\xd8:3\xc2qe3\xc6\xc3\x8a\x1c=vkH\x12\x1b\xd2" +"\x84\xa5\x92\xe4Y\xc3\x9cw\x8b\x31\xf9I\xb0~\xf1\xbd\x46m\xc4\x9d\xb3m\xf1\x65\xea" +"\xdd\x8\x31\xca\r\xea\xbe!9\x8f\xda\xef=\xd2{x\xcxU\x9e\xc6\x8d\xfai\x8e\xb7\x0\xf7" +"\xfc\x9c\x10\x95\xf\x93M\xad\xbbg\xef\x97\xcd\xddM\x90\x62H\xfe\xaa\"h\xe3\x65\xb0" +"\xc0\xe5U\xca\xa4\x9cO\xa9\x2)\xfd\xda\xb1\x66\x5\x80\x80\xd4/b\x9b\xde\x82\xa5\xa2" +"7\xfclU\x11\x85\x9f=\xaf\xab\xa5\x7ii\xf9\x9a\x80\xca\xa4\xf\xe2\xe3\xbj\xe4\x12" +"8\xd7\x16S\xb2g\xad\xd9\xd3\x45\xe\x65\x2\xa0\xed\xff\x8\r\xf1\x1b\xe3\xb2u\x98k" +"\xb8\x31m&\xaf\xeb\x98>qWW\xc5\x94\xfc^\xec\xbe\x80\xf4\xf0\x30z6\x91\x94\x1b\xd8" +"^\xb2?d[\x18\x8e\x2\x93':\xc1H\xed\xb6.\x86\xe4\xe0k\xcf\xf7\x8\xb6\xdc\xd5\xc4\x7f" +"}uU\x18H\xf0\xc\x95\xc6\x84&Y-\x7\x63}\xc9\xe\x8a\x98\xa3p9\xff\x93\x82w\xae\x84" +"\x8f\xd4\xf\x8aX\x80=\x87H\xae\x41\x1f]\xff\xe2-2K =;\xc8t\x1c\x94U\xb4\x80\x94\xd2" +"\x92\x66\xc7\xcbI\xfd\x9f\xfd&\xfV?\x19\x83R\xfe\x14\xcd=\xe0\xe\x9b\xaf(\"N\xbX" +"\x8c\xc6\xfe&\x88@@\xb\x86\x85\x83\xfcPb\xe4r?\xc5\x1b\xb3G/\xc4\x8a\x1e\x95\xc3" +"\xee\x1c\xc8\x17\xa1\xb8It\xe4\xe1T\xa6\x12\xc9\\waW\xb2\x64L$\xc2\xa9\xc3\x85\\" +"\xec\xeb_*\x7f\xdb\xa1\x8xO|Q\xa8\xb\xc7\x33%\x32\x43 \x2\xb5\x87@\xdc\xc4\xba\x98" +"L\xc2v<# \n\x91\x1a\xe1G\xccZ\x94\xce\xeczl\x9cg\xc9ZQ\x8aN\xa3\x44\xa6`\xcb\x5\xde" +"\xdcI$\xf4\x83;6\xb\xf6{\x98\x96\x38\xa3x\x97\xaav\x1e~yYn\xca\xc3t\xa4\xf9T\x80" +"\x4\x64-\x4\n\x8c\x1c-\x9d\x92jqNZ\xe9n\xec\x38\xa4\xd7Lx\xf6U_\x88\xa9Z\x19\xe4" +"\x8c]\xb0\xad\xf7G\xde\x44V\r\xcb}c\xadGk\xee{\x15\x88^\xba\x61\x9e\xbf\xf8\x99\xa1" +"F/\x86\x86\x61\xc3V\xc6\xa9\x88x\x6\xa0l\xb\xb8y\xd4\\\xe5L\x92\xd6\x1b\xdck\xe3" +"\xfd\x98\xc5\xef\x8_\xff\xb1 \xd3k\r\xf9\x9f&\x15\x33$\x81\xe9\x81\x46\xa7\xf3\xaa" +"\x81\x12j\x7fP\x6!\xf5\xad\x8c\xf4P\\E\xa3\x8d[8\xcb\xc8]\xab\x92\xa3\xb1\xa8voP" +"\xb6\x8c\xd0\x8d\xd8\xca\xec]\xdc\x62\x83\x16\x31\x0;\xej\xdc\xcc\x42\xb1iL9\xfe" +"\xf\xba\xac`\xed\x88\xbb\xa4\xd0\xf1\xfb\xb0\xc7\xf6\xb6\x89\x45\x4\xd0\x8f\x43\xcc" +"X\x2\x13\xbe\xb5\xe2\x83\x66\xb\x83\xc0,\xd7Q`\xf3Rp9S\n<\x9b\x16\r\"\\\x15\xae\x84" +"\xa6@\xf4\xeeP\x8d\x19\xb0/\x8f\x6=?b\xd1\xd4\xc5'D4\xde,-N(6\xab{\x80\xdc\x80\x38" +"B\x11\x8\xc0w\xcf\x9\x89\xb1=\x83\xcb\x7\xc6jm\xfd\xc1\xa8\xbcPa\x15\xf3\x36\xf2" +"\xf\xf7\x15\x91\x39\x1c\xa1-9\xf1\x94\x13\xeb\xa1\x9c\x9c\xd6\xdd\xb1\r\x9dxl_\x97" +"\xa2\xe5\x85\x12P\x11G~\xdd\x99\xd8m\xc8\x8f\x11\xfd_\xa1\xd5\xcf\x7f<\xae\x82@w" +"\x19\xf1>}\xdfvc0\xb6XL\xcf\x45\x64\xd0\x4:\x15\xe2\x87\x3y\x92\xf6m.u\xe4\x38\x98" +"\xfc\xebq\x95\xf6\x7\x9\xb'\x86\xe5\x84\x8d}\xc\x7f\x84r\xfa:\xe7\"I\xcc\xb2l\x14" +"\xe6;\xce\x8a\x93\x63\xd2\xfa{\xf3\xe\x87\xd5)\xab\x63\x85\x99\x64'z\x9a\xfd#9\xbd" +"P\x6\xb9=\xae\xb9\x14\x9a;\xbf\x90\x37\xa1]\xb6,\xb7\"\xfe*\\\xdb\xbb\x43T\x2\x7f" +"y\xad\x30\x88\x37r\xack\x11\xa9\xae\xcf\x10\x94$\x9b\xad\x80\x43\x90\xe0\xf2\xd8" +")g\x15\x2\xb3\x83\x7f\x35^\xee\xf\xc6\x86\x7&\xe1\x89?Y\"\x14\x10\xc1s,\xc6y\xba" +"\xdf\xafm\x1b\x30\xc9I\x9e\x9d\x35\x41(\xed~\xe8\xf7\xffm\x8a\xe3\x9ej\x7f\xfdoG" +"\xbb\xca\x8d\x8e\x8c\x9a\xb3qL:\xbb\x80\x88\x65m>\xca\xcb\xb7\xe5p\xe7\x46\xad\xfb" +"\xb9o\xc8\x44\x15\xa7q\r\xbb'v\xfb\xb4\x18;\x9d\xe8\xca\x1b\x9a\xe5\x44\x9d\xbc\xf4" +"\xd2\xb4{\x97\xaf\x80Ni\xb1\xad\xa0L\xb\xb9#\xa9\r\xa0\xb8\xbb?ae3\\.\xdf$B\xfd\xfa" +"\xe5\xed\x8c\xc4\x8f\x1d\xbe\x46\x1J5-K?\xcf\xb2\xc9|\x6\xde(vx\x88\xd2;*\x5\xd4" +"&\x93\x38\xfc|\x98l\x84\xf1\x35\xa1\x8k\x85@l\xc4\xb1\xb1\xe5\xeeS\x15\xc3\x16:^" +"\x1ai\xbf\xe2R\x86\xd9\xa9T;z\x81\x1e\xf9H\xcft\xa7#\xdb\xd1\xaa./\x1d\x14\x1d\xda" +"`F\x17\x43\x12\xf4\xd3\x9bm_\xc5\xe1\xbb\x12\xd0\x81\x1e\xeb\xae+\x1f\xb3\xae)c\xee" +"\x86\xdb\x9f^\xf8\x93\xb7L\x19\x83\xf2/\xf7o\x91\xa4\x81_\xfe\xb7n\xea\xaf\xde\x90" +"XCF\xdb\x96\x8bSVV\xe3\x97'\x88\xf6\xfe\x0\x88\xdd\x2\xac\xc8\nZK\xe5J\xd4SV\xfb" +"Z\xfb\x5\xf1\xc\x88\x98\x83\xa0\x7\xb1\xba\xca\xee\xba\xb8\x32\xef/\x2\x44`\x1a\x18" +"Hwh?(_\x1\x99\x46\x61j5az\xa1\xd9\x35\xb\x12\xe3\x84;_\xc1\xb3\xf\x31\xac\xfa\xd7" +"U\x13\xaaV7\x4\x80\r\x63\x8bN\x1aRXXUJF\xa2\x37:\xb5M\xcb\x90\xb7I\x92\xb3O\xfb\x62" +"s\xefO\x1}x\xdb\x18\xb8\x80-\xb6\x1am\x1eO\x91\xac\xd9\xca:\x9e\x35\x9c\x64\x14%" +"\xa5\x83\xa9\x18\xd3\x39\xc1\xdfI\x17\x44\x97Hb\xcf\x10\x1d\xd3.k\xe\xe7\x8\x2\xc4" +"?_R1\nU\x99\x65\x8f\x95[\xf7?86\xe0\xeb\x1f\x46l\x9b=\x93\x9fo:*\xfa\xd1\\$\xe7\x9e" +"\xcb\xf3\x33\x30mM\x80\xef\xc4\x1b\x86\x36\x96\xfe\x1fP}\xa6\x41l\xe7\xd5\x89\xf8" +"\xe7\x1\xf1\xf8\xc1\x87?\xa2\xab\xf1\xad\x34\x32L\xf7\xa9\x44?5\x87\xbd\xd4\xcd\x96" +"\xee\xea\xa8\xfa\x39'\xe6\x31\xb1\xf3J\xd4\x44\xc5\xfan#\xa2\xeb\x89\x34\xe3\xde" +"\xcb\x2\xc6\xe0\xa1\x9b\x83\xb0\xfdt\xf9UKo\xaa+\xb6y\xa8<\xc5\xbb\x1b\xff_\xd4\x45" +"\xee\xe3\xb5\xce\xd6!v\xfc T\xf5\x81p)\xff\xc4\xcf\xc\xbb'~\xc1\xd8\x19u\x2\x99&" +"c\x9d\x38\xe8\x11n\x8b\x39\x1\xf8\x46G1\x9c?\xb8\x1emI\xd4\xf4\xd9/}\xa2;\xcf\xb4" +"\xfbZRy\x4>h\xff\xb9\xde\xdb\x7\x17q\xa5\x45\xb5\x9c'\xfd\xc2\xf8\x33\xc7\xd6\x2" +"\x5G/B\x8c\x85'\xd2\x9\x83\x4\x61\xa4\xea\xd1\x91\x97\x94\x9bi\xeetN\xb2\x98\xb9\xb9j>\x0\xaf\x9d*\xf2rj\xb1n'\xc2\xde\x95" +"\xfu\x9d\xf2\xe8{]\xa1s\x82\xc0;\xfd\x8d\x94?mx\x8fSj\xd8\x4\xe7\xda\x10\xabG1\x8c" +"7i\xd4\x8fW7u\x10,\x16\x14\xaf\xb9\xa8\x13:\x9c\xc9\xaa\xb2#0\x8\xc9\xd5g8\x1f\x19" +"MV\x2v\x1e\xf9;\xbe\xc6\x44&\x16\xa2\xde\xc8J\xaf\xbd\x92\x0\x7fr\xf7\xf!\x1e\x9" +"\xf6\xf4\xcf\x80\x31\xa9\xa4\xeb+\xdc\r[\x92\x43\xec\xb7\x39\x45\xe8)t\xd0\xbd\x3" +"\x6@'\x99\\\x89\xeb>D\xb7\x8cP1l\xe1\x62W\x91\x38\x37~\xfe\x39\xf1\xcc\xd6Y\xba\xa9" +"\xdc\x65\x1bO\x9a#E\xbc\xa1\xc7\"\x31\xf0\xc4\xe8Xu)\x8c\xfb\x8a\xd0\xdb\x63\x35" +"\xfcJk'\x1a\xc3\xd3X&T\xc2uI\xc0\x38\xb0\xcb\x65\x17\xfeT\xf2\x89" +"\x8dM\x82\x1\x46\xb7`F\xe2\x3V\x10\x18\xf0\xceq\x9e\xc4x\xed\xc\x87p\\\x19(\xcb\xc8" +"\xcb\x39\xe1\xe0\x41\xb2\x9f\x39\xbd\xb4#\xfd\xa4S\x9f\x1c\xc4\xd5\x17\x44\xa4]\x98" +"Y\xd2\x86)\xde\xc7]*\xe\x8b!J;\xe3\xe4\x17\x1d\x31\xa9\x8f\x0\xc\x85\\\xd3\x64\xab" +"!\xfa\x62\xcdT\x82\x65&\xa9\xab\xbbI\x1c\x41;\\\xc4\xec\xee\xc2\x81\x19J\x84\xa9" +"\xec\xef\x95\xbd\x83\x9c\x14&\xb2\xb\xb6\xccz_\x98KuN\xcb\x15\xb9\x9e\x42\x97\x88" +"|X\x3\x35\x64|F\xf8\x1fq\xe3~j\xcZ\xfe\x1\x63!q\x8f.\x98\x8b,Isq\x1e\x64tR\n\xcf" +"\xea\x1fL\xea\x82ZM\xdb\xb5h\xf4\x9d\x45\xac\x9eId(\xa0J\xcf\xca\x93m\x8b N\x9b\xda" +"\xdc\xb1R~p\x8d\x92\xe3\xdcx\xa5\x31\x61\xcb\x12\xd6\xae\x30OinU\xb0\x8bg*\x11\x98" +"\x9e\xc3\xb9\x7\x63\xbc\x34I\xab\xc9:u#\x0\x96\x80\xbd\xa2\x84\x8\xa3H.\x8f\x4\xb" +"\"\xf3~\x8f\xeb\xd4\x1a\x32r\xaar\xf4{\xc4\x34\xba\xeaLM\x14\xeb\xfc@2}\x8b.:\x8e" +"\xff\\x\xc\x63\x12\x9b\x5\x91,.!\xb2\x15\xc4\x18\xe4^\x85\xfe\x8e\r\xcd\xb4\x1f\x8f" +"\x9fW\x87\x37\x5\x1cr\x89\xa5?n\x85\x43\x8\xcc t\x85\x9e\xb4\x93\x13\xb8\xe8\xd7" +"\xaam\xa0@\x1cTV\x7\x1b>F\x3\xd5\x1d\xbf\xaf\xb2\x91\xd8~\xfb\x1e\x87~\xff\xf2\r" +"#\x12\x34\xe9\xccSU\x6\xf9`\xa3#7\xb1\x5_\xcd\xfb\xd8\x13Nz\x8f&96t[\xa7\x9f\xcb" +"wb\x11u\xda\x81\x34\xdb\x98\xf\x91\x19\xfa\xc6\xa3\x95s\xe6\xceh\x96\x8d\xecH=M\xcd" +"\xdd\x17\xc8\x8e\xe1\xdb\xc5=\xc4\x88\x32\x66\xb\xaa_\xed\xbe\x64\x32uO#\xebw\x1e" +")\r\x9e\x17t\xa0\x95\xaf|\x18\x44\x8f\xc6\x39\xe3!\x9f-y\x2\x9c\x1d\x33\xcc\x95@" +"S\x1c\r<\xa0\x99\xde\xb7\x1a\x9f\xfd\xa1S\xedr8\xf6\x82\xe\x18\x14w\x87\xbb\xc2\x1" +"\x95\xf1\x66 \xe6\xff\x65^u\xee\x88J\x82HU\xd2q\xfd\x3v\xfeY\xd7\x9e$\xef\x13\xd6" +"Y\x1fm\x81\xfe\x97UW\x8c\x34x\xdd_\x87)\xf3\xa8-H\xca\x82\x9a\xed\xde\xce\xc3\xdb" +"\xc\xdb\x39\x30\x7f\xbd\xbd\xfa\x62\x9f~T9\x17\xf7\xb1\xa5VsH~\xf9@i\xdd\x5\xf3\xf4" +"\xac\xa8vV~\xce\xc3\xd8\x1f\xddW\xdc%\xa0\x32\xb0P\x9a\x62\x96\x13\xa3\xa7\x66T\xdd" +"z\xd6\x92s\xb8\x39\xf8=\xa3\xc9=\xd3\xad\xb2\x0\xc6\xbd\x1e\x1bN&F\xa5\xc9\xb\xaa" +"\xb8\x89\xe9@\x8aU2\xc\\\xc6\x84\xe4r\xdfT]!\x1bR\x9fM7}M\xb7G4\xfa\xd1PO2\xdc)\xf" +"\xd5\"+w\xb5\x1b\x94\xd9\xb4\xa7\x6\x93xX\x90\xd0\xf2L\x19\x9d\xb2\xb5\x12\x45\x86" +":2M\x18\x8c\x8e\x1aH\xaa\xc3\x80_\xdf\xce\xc5\xa8\xbc\xd4)\xc7\x4!\xbf\x9b_:~~\xcf" +"X\xcf;H\x7f\xe5[\xb6W\x18<\xbfs\xf2\xfb\xca$\xca\x8bh\x8c\x6\x64\x38\xc6\xda,\x8c" +"\x8a\xd0\xd5\x1eo3$\xe9h\x1d\n\xd2=\xc7\x9\x66\x92\xf0*\xceQ\x9e\xdb\xb8\xac!)\xdf" +"\x13`ga\x80\xc2\x99'\xe2.3\xcc\xe6Q\xce$U}\xa3\x1a\x46\xfd_+\x91\x16\x45\x41\\!\xc8" +"\xc2\xad\xbe;\x2~\xb9\x15g\x5\xd5\xc3\x66LY\xf2\xe5\x15\xa8\x9fqE\xd6-\xd8\xb4 d" +"?-\x88\x95\x15\x4w\x8c\xc6\xca\xd1\x42!\x85\xf2^*\xe9\x88[!\xe0\xf4\xfe&\xe0\x8\x11" +"1\x11\x43\xa6\xbb\xbe\x37,T\xeez\xc4\xfbx\x9cu1\xff_p\xdf\xdf\x66K\xa6\xdb\x13uS" +"!\xd3\rM\x6LGpg\xbe\x33\xee\xef\xfc\xf9\x46\xc6\xda\xdb\xc1\xa6\x97 \xca\xdbY\xb7" +"|\xb7\xa8Y+\x80\xa6G5\xba\xc6Q\x89\xba\xb\xd3\x66\x95\xad\x99\x12\xa0\xdaUhm\x8f" +"Y\xbe\xb5\x31\xa0v\x3wUIl\xcd\x16\xde\xd2\xe2ox]\xfa~\x96\x88~\xf8\x17\x19\xe7\xf0" +"\xc6\x19\x16\xc2\x91 f\x8\xa7\x91\rj\xf9\x85G\x1d\"\xfd\x17\x89\x93\xc5\xd8%\x8f" +"\xc6\xef\x10\x98\xdf\x95X%\xa4\xcd\xa2\x19\n|J\xe\xbbV\xe9\xb7\xb4\xe5\xb7h\xeaK" +"\x1f\xce\x97\x86X\xf2)\xa8Y\xcc\x37\x15\x93\xbb\xf2\xbe\xe6\xadq\xa8\x14\xc5l\xc5" +"\"\x14M\xb6\xbc\xeW\x95\x11\xe0\xa4\x38GI\xa7\xd8\x8e\x5\x12\xd6\n\x45Z\xee\xb3\xc" +"\xddna\xfa\x8\xb8W\xff\xe5\xf1\xc7\xc3vi\xcd\x87@\x1\x9c\x3r}\xe0\xabV\x17`\xe6\x87" +"\xc3\xbf\x89\xcf\xb1\xf7\x38\x8#\x11\x2\xe2\x17\xdc\xc1\xc6\xcb]1\xc\xba\xd5\x87" +"3)\xb2J&FI_\x9c\x63,\x6\xbf\x8e%\xc0=7\rl\xbb\x86Y\xb7&\x2\xc4\xc4\xa9\x1b\xc7\x88" +"\xfc\x91L\xea\xfc\x91\xbe\xccVql nw\xf5\xcf\xb0\x10\x80\xa6\xd8/\xec\x93\x7)\xfa" +"3\x1f\x95\x86'qf\xe8\xde\xa1\x18\x62\xe2\x12\x30\x95\xe2]u\x8f~\xe3\x80\x8c~V!\x86" +"\x18\x1f\x8c*0\xd5PB\xca\xb5\x63\xbf\x88\xac\xd2n\xc1\x9by@\xb1\x86\xc2\xa1\x36\x81" +"\x7f\xc5\xc7U*\xf5\x41[\x7f\x30\xb1\xca\xbbn\x9\xe9\xa7\x84\x87\xcb\xc5`\xb3%w}R" +"\x1d\xa1@\xc4\x93\xe7,\x7\x16\xc6y\x1\xcf\x1a\xb4\xdd\xf4\x39-\xd8\xbd\xb7\x4\xd0" +"2\xc4\xe9iq\xe6\x35\x45{\xa0\x95\r\xcb\xd5\xa9\x45\x44~\xfb\xa1\xf6\x62\xd1$4U}#" +"\xee\x97\x90\xa3\x65M\x8\x96wj<\xd7\x14\xbexl\xa4m4\x16\xb1GM\xea\xb4\x9l\x1b\x91" +"\xb6\x65~.F-\xe0Gs\x9a\xc\x92\xefn\xc7\xbewyH\xe4G\xa8\xce>\x8dN\xf3\xf9\x37JwRq" +"#\x12\xb8s\"\xdc-}\xed\xb5\x83\xb2\x9MuH\xbd\nO\xeb=\xcd\xf8\x35\xd4\x9a\x1dn3~5" +"Pm\xbfoB\x9bk\x94:,q(B\xb9S`&(\xfa\x17\xea\x42\xc4\r\x8b>\xd3\xde.\xfa\xd9;\xbb/" +")\xbd&4J\x15\x61\xdb\xae\xa9\x8a\xf\xe6O\xad/Q\xd2!\x8f\x80\x18\x34\xe2_\xd7\xe5" +"\x8\x1a\x85\xa4\x1d\x83\x6\xd6\xe0\x4y\xf7=o\xb6\xe9\xe0+ \xc8\xe7\xfd\x9f\xab\xa2" +"\"\xad\xf\xd1\xee-t~Q\x90RA>\xf1\xfe\xa4\xce\xcfT\xca\r\xb9\x1f\x83\xe9\x2[\x84\x88" +"\x1=\xcc\xaf\x1c>\x18\xaf%v/\x91\x1aU\x3\xfd.\x86!\xa2\x5\x45\x16\x46Lo\xbd\x41I" +"\xc6Vg\xec\xabV\x17`\xe6\x87\xc3\xbf\x87X\x90\x8dQ>\xb9g\x0+\x94\xd9\xf4\xca\x39" +"\xb8\xde\xc4\xc5H\xca\xf7\xcf\x9b\xad\x7\x61kl\xb0\xdd+\x7f\x1b\x85\x9f\x13\xcf\x62" +"z\xdb\xc3\x0\xb7\x39\xbb/}{\x96I\xd4\x81\xdc\x91\"\xb7\xcbV\x1d\xb1\xe8\xa9\xff(" +"4\x13\xa4\x13\xa9\xff\xe8\xb4\\%\xfe\x36\xb2\x86~\xb\x88\x16\x9a\xaaR\xf\xcb\x8}" +"\xb\xab\x1bR\xc8\x37\xeb@N&J\x11\x0{\xcf\xda\x8\x30\x65\xbc\x1<\xc1\xfb\xfa\xd8\x35" +"4\x92\x8\xb6\xb4\x81\xd5I\xe8\xc1\xb3x\xa9\x89\xb7\xce^\xa7\xe4xs\xbe\xad\xa4\x91" +"\xde}\xf6\x38-\x15\xf8wP\xf8lt\xbaJr\xbc\x89\x16\xfeO_\x94rL\x1b\x42\x14K\xde\x88" +"\x1a\x65\xe0\xac\x1#^\x81\x0\x64\x2\xf1\x92{}\xe4&\xe7\xc2\xe7\xee\xe6\xd1N\xbf\xb9" +"\xc1l\x8b\xdd^\x97\x63\xa4\xafy\x9e\xb1\xa5\x66\x4\x9dX\x8f\x80t\xff\xdbq#h\x85\x65" +"ebQ~,y%\x95\xa5,\x9b?\xba\xbb\x90\x17\xe6\xe9\xd2\xb0\x9\xb0\x8e\x81\xdfk7`\x80\x43" +"\xb7\xa2#\x4wC\xfd\xf1\x12R]\x90\xcc\xcf\xd8\xa8~\xc7\xd1\xcb\x41\x0N\xd9\x66\x1" +"\xb1\x90/#76y\xac\x8e{\x3g)\xda\xb8>\x8c\x88O\xbe\xe5\x11\x1e\xe7\xd2\x42\xde~\xcd" +"\xd2.'{\xa6\xce\nW:\x81\x84\x8bR1}v\xfb\xeb\xa1\x6\xdd\xa0\xd1\xdf\xf6\xb9\xaf\xfa" +">\x99P\x91L\xb0Ks66\xb7\xdc\xe1s\x80\xf8\xaf/\xe5# \xbf\x9J,\x4\x32kD\xc4\xf0\xbb" +"\xc1\x64\x96\xf4\xd4\xc6\xb5\x36s\xe3\xf3\x8c\x35\x1e{\x18\xbf\x8=D\xafT\x90\xbe" +"jQ\xc3\xfdq\xcc\xfe \xb1\x87J\xf3'\xf\xccg\xc1\x30\xc2\xa2\xf\xc4J(\xec\x8b\x8c%" +"\xea\x80\xad\xa7\x8ex\xa6T\xdbz\xe\xe/\xc6~\xba\x7t\xb3 \x9\xc0\xf7\x95\x38ZV\xb2" +"\x1f\xa5{U\xbc\xa1\n\xa8\xd7\xdf\x14\x9e\x8e>\xce\x84\xbe\x0&S\xc9\x4\xc7i\xa6~\x81" +"\x84(\xcc\x15\x85\xe3\x34'\xb2%\xb8v\x90\xa7Y\xe2\xad\x19\x81\x1;\x1f\x93\xd4\x9b" +"G\xdb\xb0\xba\xady\xb1\xaa\x90\x88\xef\x87\xb5\x16\x5\xb0\x8c\x84\xb3\xa4g\x1aJ\xf5" +"}\x80\x80\xfbx\xbc\xd8\x0\xee\xf2\x62{\xaf\x10\xbeP\xae#\xcd\xd6\xbc\x65\x7f\xbf" +"kS\xc3\xc8\x1c\xd9\xe7\x61\xcc\xbbiha\xef\x18\x64N\x80\xe5}I\xe9\\\x3\xb9\x85\x15" +")\xf5o\xb5'\xa3S\xb7\x1e\x82\xd1\xa5<\xcf\x9e\xf\xb9\x9bL\xc\xf\xe2\x9em\xd2\xc9" +"\xcf\x8c\x46\xdb#z\xb9\x8a\xfa\x8gE\xd8##\xfd\xc6@B\x8cs8\x6\xf6\xe5\xc\xd5\xe0/" +"\x3\x93{\xb0\xe4\xad\x65>\x6\x9f\xa2\xf0\x84\xbcz\xbb\x8a\x19\xa4=\x89\xac\xd8\xed" +"\xea\xa3\x94]\xc3\xde\x30\x5\xad\xe5\x9d\xf6\xc9\x1a\x8\xdf\x9e\xe2\x16\x96?\x93" +"\x1cm\xda\xbb\xc2|;\xfcqY\x8f\xcc\xe6h\x88\x64\x2\xad;\x1f\xe6\xfbv\xf1\x19y\xc7" +"tNT\x16\x95\xb7=\xfu\x16t\x92\x5\xdc'\xa2\xec\xdf\x89y\xc2\xc7r\x91\xa4\xa5\x41)" +"\xdf*4\xca\x9c\xfb\xdb\xa9\xcf\xe2\xdeg\xfe\xbeL\xb0Q|\xce\x15\xd2\x62\xd3&\x8b\xff" +"\xea\xb8\xc8&\xd8\x11r\x8c\xb1H-V\xeu\xd1\xac\xae\x42\x43\xe8\xe6\xeb\xa7\xa5\x86" +"\xccH\r\xfc\xff\xccl\xcf\x45\xcf\x63\xd6\xbc[\xeb\x0)\xf1\xf4\xec\xd2\xc0Y\x98\xbd" +"\xab\x17\xa5\x9e{F\xca\xc8,`7b6\xc2\x12\x1e\xf0\xd3\x1b@e\xc4\x1c\x42\x81\xc6}i\xd0" +"\xe0\xc6\xd8\r\x89\xe0\xea\xe7\xbb&\x82L\xcd\xbd\xe6\xac\x17S\xe7\xd9\x85^\x1\x80" +":.\xba\x63)s\x0\xcd(\xe5\xbd\xb2\x9a\x9a\xa4\xd7\xa1\xd9t\xb4\xefgc\xb5\xc6$\x18" +"\xd8\xbd\xe3oE\x99\xbc\x8d\xa5\x86\x2\xca\xcd\xed\x84\x7fk\x8a\xed\x99@\xa8\x1a+" +"V\xe0q\xc1\xfd\x80\xc2/\x2\x1f\r\xefN\xf5\xfb\x31\x61Q\r\x10Q\xe4\x85\x5\x89\x10" +"\x86\x61\x80\x44\x44\x8c\\\x82\x87\xbe\xd2\x13\xe1\xa2\xf2\xd5}\xc0\xdc\x97n\xc1" +"e\xa8\xe4\xd3W\xe6\x90\xb8\xa5\xd8x\xa7\xbdl\xab^\xa6*.\xb3\xd1\x66\x35\"\xf\xb9" +"\x84\x95\xb2\x64\x19\xcf\xb6\xae\x39\xee\xca\x15\x37\xb5\xa3\xb7(#\xde\x1f|f\xff" +"xM\xc3\xfa\xdd\xd5#\xfeq\xf\xf6\x1dv\x9d ,\x4\x9\xbd\xc0_\xcf\xf\x8d\xc4~\xbb]?\x92" +"\xfe\xd2;\x1d\x61\xf0\x83*FY\xb6\xc\xe2\xf2N5&a\x94M\xe1\x3\xb9*>\x1d\xf0\xc1\xc9" +"\x92\xaewe{\x87\x30Z\x90\x14\x14g\xa7\x12\x7\xad\x66\x30\x14y!E\xdc\xb5^\x91=18\xec" +"/y\x96{\xed\xbf\xae\xbc\x88\xd0\x13\x8eo\xaf\xc8\xf0\x92\xc5;\x80\xc9m\xf5\x17\xb4" +"\xea\x9b+\xe0\x82\xc9\x84\xfc\xd8\xf5\x1a\x8c\xdc\xfc\x44\xaf\x18\x9a\x5\xd4-\xe9" +"\xc6\xb6\x14\x92k\xeb\xcd\xae.\xe6\xea\x1f\xbf\x97\x1c\xca\xe4\x87\x15NL!\xba;/\xd9" +"\xdd\xe\xb9\x38\x13\x1a\xfa\x1d\x8a\xfahL%*\xa2\xe7\xcd\x5\xc0\xfa\xfK8\x3Q\x12R" +"\x84J\x19UR\xa5\x30\x82\xd3\xf4\xb0\xb5\x45Tb\xfeR\xbd\xff\xc1\xd8\xcf*\xb8V\xa2" +"1.CS\xb1\"\xc8\xe1\xf5\x17\xa2.8\xc7\x89\x43\x8b\xa5\x7\x2\xa9\xc9\xef\xa8\xcb\xc4" +"\xd0#L2D\x97I\x98h\x80&\xc7\x1ei\xb5\x36\xfd\xfaO\xfa\x35\xbe\x10\x81\xa7\xc1\xe3" +"\xd8\xa0\x64$\x9b\xd9oZM\xbu{`;\xd0\xa3\",=\xd8\xba\x89\x85\xed\xbd\xf\x1\xb0w|1" +"e)\xb5\xc1OL\xfbv\x14\xc8Y\x9\x9b\xb3\xe6\xf3\x6\xec\x12\xf6 \x83\xaf\x31\xcd-\xc6" +"\xaf\x65\xe4!\x86\x1f\x92\xec\x34$>\xc8H-\xe8\xbd\xbd\xf5\xc9\x97}\x82\xep\xcb`\x5" +"5v\xfe\x31_\xf8\x62Z\xdc\xfh\x91\xa9\xba\x80i\xa4ksx\x13\x19\xd7QTd\x98\x8f\x2ZZ" +"8\xa9\xf9>JJ*\x6\x1f]@\x9e\xce\x66HH$\xc6\xcc\xdf\xa2Qe\"?\xb0\x33\xbe\xf8\xe5\x82" +"{\xb6\x8e\xa6\xe3\\P\xae<\xb1\xbc\xdd\x41 \xe3*\x83\x88w\xd7\xd9\x9c\x18\xbf\x96" +"7\xb1\xab\xd2\x31iA\xe3\xd3\xd7\xa1\xe4\xf9\x6\x34\x13&\x17\x9c\xad\x9by\x9do\xf2" +"\x8f\xfe\x98$-\xa2[U\xd0X\xd0Q\x93N\xb7\xa1\xb6\x83\x85\xb1\xc4\xbf\xdf\xe8\x8\x82" +"\x85\xf9\x65V&\x89\xab\x42\x37\x2\xdcUBK\x15\xa7m\xc4\xa4\xfc\xcc)8bT\xde&`aD\xb0" +"_\xf3\r\x9c)\xeb\xbb\xf3+\xe5\xf6p\xf6\x11H8\xb3\x33\xef\x11\xaf\xc1\x84\xc3\xbc" +"Mp\xa8S\x84I4\xd8\x43\xfa\xc0\x65@+f\x7\xef\xa1\x1e\xe0\x1d\xed\xe]F\x18uc\xa7{\xd2" +"\xa3\xfq-\xb3;\xe4\x19vw\xaer$\xb0\xca\x1\x88\xf\xb9\x8d\x8e@\x5i\x9b\xb=}P-q\x9c" +"\xf3\x7\n\xf3o;\xbfJ\x93o\x8Xt\x15\xae\x89\xbc\xda|\x12+{F\xe8 l\x4\xb7\xc5*:\xcd" +"\xc8\xfa\xc\xff\x16\x14z\x85\x9b\x82\xa4\xd8iWmD3%\xe4\xcaW\xac\x65I\x88\x39\xcf" +"\xd7\xb3\xaa\xf7)\xb\x33\xc5\x30\xf1LD\xe6\x64\x1f\x38\xdc\xe6\xc\xcai}\xdd(zK\x8e" +"\xbf\xf3h\x9d\xa8]\x9\xd6\x1c\xa0\xdeg\x1b \xbf\xfb\x17|Q\xb1\x45\x66\xdb\x84\x45\xba\xda@\n\xba" +"@\xad\xff\x97\x9c\x8c\xbb\xa4_\x83.4\x85\xa4\xc2\x1b\x38\x9f\x41\xbd\xe\x9\x64\x90" +"\xe1\xe7O\xe7\xd7\xc9\x32\x84\xd6\x12\xde\xcc\xb\x16vyK\xfe\x8\xdfH\x96G\xfa\xff" +"6M'\x10\x31\xbbH\"^\x11\x6@\xa8\x1c\x8f\xb4\xefN\xe\xa9\x13\x8dS\x97Wg}\x93\xad\xe1" +"E\xce`\x83\xc5\x65\xdc\xc9\xe0\x7f\"\x8a\xd4p\x80\xb2\xe0.u\xe5!T\x7f\x18p\\\x84" +"\xb3\x15\xa8,J\x88\xb7\x66#\xf0z5\x2\xda:\xa2\xb1\x1f\x35\xbb\xe7\xec\xdd\xdan\x7f" +"0\xe6\x1ep\xfd\xa6\x45\x6W\x92\xfb_:H\xdf^\xc{\xc7\xa0\x91\xfc\x92`9b\xd5>\xc8\x90" +"1v\xfa\xee\x9f\n\xbJ\xe9\x96\x8cO\x91\xa1\xb\xd5W\xd0\xa4]\x1d\xfd\xc6\x9f\xa7Y\x14" +"E\xe9\x35U%\nF/\x16\xc7@E\xbb\x87\xf7\x44\xd9\x65I\xb1\xa9\xabH\x96\x5\x91\x9e\xfb" +"`K\xdc=y$Jh16\x8e\x65\x39\x64\xe6^-\x9e\xc7\xb8\x61\x93\x99\x8c\x9a\xf6\x46\xe1\x9c" +"\xe3\xa9\xecL\x94?WDWC\xe7)\xb2{2\xcf\xc2r\xbd~\x89\x8b\xa3\xa2\x35\xe7\x95\xa2\xd3" +"!\x93\xdc\xae\xaf\x8fLe=.\x81\x42\xc5s\xb9\x15w\x9dz]a\xf9[\x95\xd8\xb3Q\xe4\xd7" +"\xe0'b\xa6V\xc0\xe1\xe6-\xc9\xda\xc4\xebj\xa2%\x36\x6P?\xa1\xe7\x4\xff\xce\x32\xdf" +"\xff\x62\xda\xd5`\xd1\x1f\xa0\x43\x9a\xe6L\x86\xb9\xc2\xfb\xcb_\x15\xd0\"\xa8G,(" +"\x1d\xae.\xf9\x8a\x63-\xa2\xe3\xbc'\xf9\xc7,\xee?\xe7\x84\x96\x92l\xcb\x19\x5\xb2" +"\xa9;=|R\xf6p-e\xc7\xa5\x90\xd6\xc8\x17\x42J\xab\x87wQ\xe1\xbf\xe1\xdc\xd5\xba'd" +"S\x18\xdf\x42Hm\x1d|\xc7,\xfc\xcb\xc7&\xbf\x39\x95\x86\x9a\xb1\x66\xc9\x61\xbf\x46" +"\x8f%\xa8(be\xf8\\\x46\xb6\xd7\xe\xb0\x17\xfb\xde\xb9\x41|\xbd\x10o\xb1\xa5\x91\xdf" +"\x8d\x64\x98\x8f\xaa\xd8[\xa7\xafn7[*\xaf\x8aK\xbf\xbe\xee\xba\xb8\xf6?+\x3\x35\xb3" +"Lu\x86J\xa8\x7\x1b\xbf\xd1\x9c\x1a\x39\xb1\x9fV-\xb5oC\xc1\xa3\xa7x\xc2\x66\xe7\xe1" +"\x19\xa2\xc2U\x16\xc0\x8a\xc9\xa3\x10)\xf8\xe4]Z \xea\xd3\xcd-\x85\x9bU\xb9#\xb1" +"o\x99\x9a\xcb\xe2+\x15\xdcw\xbb\xd7\x9\x95\xdf\x0;w\xecs%\x83\x33\xed^rSe\xf0\x7" +"\xe6\x8c\xb3S\xb1\x8b\\=/\x95-\xbfw\x1f\xf8\x94\xd0/W\x87\xb7l\x1e\xe1\x8\xde,yf" +"X)7%\xd3j\xe5Xw\xae\xc7hnr9\xae\x98+\xce\xa0\x64g\xff\x19\x9cs\xfc\x8f\x97\xcc\xfb" +"\xf0\x2K\xb9`\x87\xf2\x36\xb0I\xcc\x83l\x97X\x8\x96;\xd2\x96\xd8\x4!\xad\x8d^\xb0" +"\x91\x1a\xd6Z^\x18Ms\x83\xd4\xb4\x89\x9b\x2\x15LX\xe6G\x1f\xc0J AS\xb9J/\xe6\xc3" +"\x92\x34\xdf[\xd6#+\xbsK\xd7\xa5\\\xcc*\xed\xde\xf7\xfb\xa2Tj\xb2\xd7\x1b\xe9\xde" +"c\x3\xd0V\xcd\xc1\xfa\x9e\xbf`+>.\x13{\x1d\xb6\xff\x17\xb2\"\x94UF\xd0G*\x1\xfe\x93" +"\xea\x14\xc8\x92\x46\x6\x32\x86\xe2\x19\x3\xa3\x8b\xb\x39\xf\x41\xd5\xd9\xcc\xeb" +"\xbd}\xf3\x9d/a\xfc\x97\xe2\x9f\xa6\x98\xb4\x85]\xcb\xf3\x42\xa5;>\\\xe\xb0\xa0\x42" +"\xe4i\xd7x\xcdX\xce\xdd[m\xe6\x37\x9fN\xcbv%\x85\x90\xf5\xf3(O\x9a\x18\xf6W\xf4\x9d" +"\x2X\x82\xce\x1\xa6\xbd\x9\x63\xe9\xe\xfa;\xd3\xfbZS\x8\x33\xa1\x91\xbd\x45\x31\x8b" +"k\xc7\x4\x45\xf9*B\xf1\x32\x33\xc8u>}\xc\x16\xf8\xe*\xbb\x8bq\x3\xea\x90\x12\xad" +"=\x9e\xf3\xc4\x86\x99\x33\xbb=7:\xed\xc7\x8a\xc0\xce\x99g\xd9\xe7\x2&_\x84\xbch\xb3" +"\xd2;\xe\x1f\x41\x1c~h\xe6\xcd\xf6\xf1`[\xf2\x97\x87w\xef!\xf4{\xa8}U\xc5$1}\xeb" +"\xab,\x9e\x9b\xd6Pg\x2?\xe1\xab\xdc\x11 \xbfT\x86jL\x7f\xd3\xd4\xd3\xa6\x8bx\"\xd3" +"\xdd\xdb.\xd5\x82\x14\xb1\x61()\x82\xc9`\x3\xf3\xcc\xeb\xfa\x41\xa1>\xf3\xe4Tl\xa8" +"@i\xd6h\xe9\r\xb9\x98_\x1d\x7f\x3\xb1\x17\xd5g\xb0\x31\x18\xc2\xc8\x8a\x95Z`T\xdc" +"\x10S\x2\x84\x4\xca\x1d\x5MYj\x8d\xe8]\xde\xa6\x43U\xc8]\x90\x87\x80\x95@\xc4\x2" +" \xbd\xc\xbe\xdb\xc\xea:\xf8\xe\x18&30\n\xc7\xed\x96\x90\xb2\xd7\xe*<\xa5\xe2w\xb1" +"\xdcV\x8b\xaa\xe2l\xe7\x88\xbf\xae\xff\nXOk\xcc\r\x81\x9b\xb2\x7f\xf6n\xdb\x8gFy" +"\xa3\x9e\xbf\xe2'{\x91i\xd3\xf3lb\x96\x9ag\xcb\xe}\x99$z\xa8[\xbc\xe4\xc8\xdd\xf4" +"\"2P\x96&y\xc4\x94\xd4$\xd7\x64u[--\xd6n\xb2\x41\xd9&\xb7lWr\xd6\x8^\x8eQC\n\xbb" +"x\x15mX\x9\xa6\x8d\x46\xfa\x81\xad(\xa8\x9f\xb9\x9\x88\xb\x99\xd9\xb5+\xdb\x8c\xdf" +"\xfa\xe0\x15N\x86\x89\xe8\xcb\xcc\x4\xfb\xadq-g\xb2\xbe#s\xc8P{y\xb2\x1b\x30\x35" +"\x9a\x66i\xf9\xe9\xdd\x38U\x5\xf1\xa5\x89\xb2\x41\x85X\xc2\xc2)\xb7\x43\x19\x8e\x81" +"\x1b(\xfb|\xc7\x83 \xf5\xc2N+6^S\xe\x41\xb7Vy\xe2\x3\xc3Qd\xdc\xc9\xe0\x7f\"\x8a" +"\xd4p\xef\x8a\xa5\x85\x90%\xb6%`\xf8\x13\xc0\xb2_r\xb8\xf4\x32]G8i^\xed\x42\xe0," +"\xe9\xa2~\x8b\xber\x89\xe4\xf0\x9b\xcf\x30\xb0\xde@\xce)\xfb\xba\xb8\xd6Z\xd9/\xd6" +"b\r\x0\x41\x1e_5E)Lc\x97\x0\xb\x7\x38+\x4\x8a\xb9H\x87\x31\xb8\xcbG\xb7G9\xd9\x14" +"\xe5i\xf0LT\xd5\x90w\xb8\x82z\xf2\x65\xc8\xdbr\x18\x97\x18\x19\xc5\x86$\xf4\xf\x94" +"^\x7\x44\xa1\xedY)\x92\xca\xea\x1f{8T\xfe\x18M\xa3O'p\x19\xc0R\xb8\xb3\xce\xaf\\" +"\xea|E\xffP ^\x93\xa9\xed\xfe\x82\xee\x33\xf1\x36\xda\xbb\x12O\x8c\xbf\x10\xa5tX" +"\xa9\x33\x7\xc5\xbb\x0\x1f\xf3{)#~\xc6\xb1\xb3\x41\x86Uhvah\xc6W,U\xc7\xea\xb0>#" +"i\x82T;\xa9\xf6\xc\xea(T\xe5\x31\xda\xcd%\xaa\xad\x82y\xbb\x34\x2\xe1}QU{\x1f\x65" +"\xf8\xdf\xde\xb8K%\x1b:R'\x85\xf7;N\xec&Q\xc5$\xc\xa1\x15\xb1\x80\x39\xd2\xc3\x95" +"i#\xc9-\xdb\xf2,\xd7\x85r\x85\x63i\xee\x81\xae)\xb2n\x97\xd5\xca==\x0\x4\x5{\xf9" +"\xdc\x32\x8e\xa1\xaf\x80\x11\xf5\xf0\x8b\x83\xb\xc9I6~d\xa0Q\xe7'\xb\xec\xc6Wt:m" +"\x86\rTy\xa7\x1\xbb\xe4\xc8\x9\xa8\xb7\xf9\xfe\x4+\x95\x36,[yv\xb1\xaa\x9d\xf4\xb4" +"\xcd\xa1\x8e\x1c\xf7\xc4~q\xb8\xe8\x42\x44\xca\xcb\xce\x9a\xc1\xffi\xf8\xef\x94)" +"Y-\xc0\x1b\xd0\x37\xf6\xe7\xfc\xb6\xee\xdd\xdb\xd1\xa7^D\xea\x8\x8c\x1d)+\x1a\xc8" +"\x94/\xf0\x89\xeb\x92}\xda\xde/Z\xf3\xda\"\x5~\x16\xc7\x30\x92\x17\xd5\xbc\x45\xfc" +"\xd0\x5vV\x82\x62\xb2(\x9b\xa7\xe1)\xed\x87\xfa\x1a\x31\x96\xc0O{Z\xbf\x82\xb7-~" +"\x7\x36\xf7\x4\xe8\x17\xd2M\xe4\x91\x5\x84\x44\x44I\xdbv\xa3!\xed\xe5\x7f\x95l\xb" +"\x10\xb1x\x19<\xa5\xfb\x1d\x85t\xf3^)\xd4\xea\xf9\xa4^TT\x86I\x94\x91\x33T\xc7\x64" +"o\xf1\xd7X\xda\x80*^\x91!\x86\xa9#\xcb\xe9\xc6\x89T\xf\x83:7\\\x5\x8d\x61\x35J\xc5" +"\xf7L\xe7\x93\xe8\xba\xb9\xb5\x6\xa5\xa9p+\xe4%\xf8\x62$\xd0\x4\xe3Z\xb8\x6\xb,\n" +"\x8b{T\x92\x11\xc2]\xb3mF\xef\x1d\xd0\xce&=j\xe5\xa1\x84\xf4\x64\xd0\x8}no\x12w\xed" +"\x9f^\x7f\x93\xa9\xb7J\xef?]8 *P\xa8\x91-\xeau\xcd\x1a\xec\xb6\xbf\xa4\xc8py\xce" +"\x9a\x1e\x30\x84[Q\xc2]\xb\x66Jaj6P\x8e\xab\xe3}\xa4\xd6J\xbbY\xb8TS$-\x0o5{\x17" +"O\x86\x30lN^\x8c+\x1b\x80\xe1\xcb\xf5\x10\xacwg\xb2v\x9e\xa3\xb3\xc2\xc\xa9\xac\xde" +"\xdd\xa9[\xaa\x33\x7\xb8\x95hz?\r\xea\x8b\xd1\xb1\x82@\xa9\x9\x5\xa0!\x12\xfe<\xf3" +"\x6\xf8\xb9]\x8dh/\xb1\x34\x8bT!26\xf9x\xd3p\x8bt\x80\xfd\xee>F\xddXO\xaa\xb1\xbd" +"\xb6\x90\x8e\x45\xaf\xe3\x10\xa4\x9fs\xc4PsS\xb2\x19\xfb\x11\x64\x92\xd7\xb9\x66" +"\x99\xf4\x8b\x10mT \xe1\x0\x99\x7fY\xcaI\xc2\xf6\xd0\x66\x61\xec\xb6\xc6&\xf2\x36" +"\xb8\x19\xee\xf2\xa7\x1b\xa9\x37\x2*\x92\xcf\xbb\x31\xd9\x43).#1\xcf\x38\\\xb2\xe8" +"\x2\x66\xa0\xc5R\x3(\xd9=\xfaX7\xc9n~+\xa3\x10\xaf\xfaW5Z\xb2\xd5\x1d\xb2K\xbf\x35" +"\x18\x10\xa1\x9a\xcf\x31\xab{\x1c\xd5\xe5ZG|\x18]\xe3\x80\x1!b$W-?l'\xf9\xca\x82" +"s\xac\xff\xf2\xf3\x8\xb7\n\x82\xf3\x81,\xb7\x9\xac>[\x9b\xc2\xd5Zs*\xbc\xc6\x8b\xd8" +"\xd7_\x8d\x33hA\x19\x80\xdf\xb3\xa9N\x17\xadj\xe1\xdb\x65\x93\x35\xf6\"\xeg|X\xc8" +"\xc9\xcb\xd3\xd9\xc3\x94\xff\xda\x8b\xa0\xb0\x2\x41\x45$Y\xfa{o\x2\x8a\xde\x9c\x9d" +"\x4\x45J\x9\xfa\x1e\xe6\x5\x43\x3\x66\xe3\x32\xf5\xd5\xff}\xef\xd5\x19\x99\x9c{D" +"u\xa9\xcc\xb\xc8+\xd7QP\xcf\xa8\x6\x94\xca\x83Pj\x14Z\xc8\xf7\x7f\xea\x9d/B\xfdo" +"\xc8\x8a\x9\xf8\xda\xa7\x88=\xc7\xb3\xff\xdf\xebq\xb1z\xb6\x12l\xba\x13\x1c\xc5I" +"\r~\xab\x8c\x63\xe\x6\xa4p\xc2\x88\xaf\x65Z\x14\xa8\xa0\x89\xa6\x1f\x98\xae\xe3\x30" +"\xc3\x90\xea\xa1\x96s\xda\x8c\x65\xad\x17V\xdf\xf4M6\xb5\xe6\x17_\x11\xb(N\xd3qX" +"[}\x99\xfe\xbe\xba\xfe\xe6\x14\x4#\x8b\x95w\"\xb4g\nmv\x9\xd2\xe6\x1c\x46\xac~\xb7" +"\xc9\xbf\xb4G\xbd\x9bq`A\x90_ml\xf3!\xc2H\xb9\xcb\xe1\x1f:\xec\x45\xa3\x42\x16\xbf" +"\xe|c|\x81p\x15\xec\x0\xb6\x1cT \xf0\x11\x7f\xcc\xec]\xcc\xfa\x8e\xd1\xc4\xe0\xaa" +"\x2pk\xb2\xc2\xc7\xd0]\xebp:$\x0@\xc9\xe7\xef\x93\x8v@.T\xc9\xf2\xa3r$.\x9\xf0\xfd" +"w\x88^Fp\x9\xdeU\x87\"\xad\xf5K\xfd\xcc\x93mc]t\x96I\xb5\x82\xc0\x63\xedn\x9c\x8a" +"\xff\x9fjx\x16\xd6\x9\xf\x1a\xcd)<{l__\xf8\x18\x43\xbd\xfe_\x15\xb2K(\xf8\xbd?\xc1" +"\x98\xa1\x31\x2\x32(b\xe1\x1c\x9d\xce\x7fPQ5\xe7X\xaf'\xb6\x46\x83\x8c\xbf\x32\xd8" +"9\xce\x7\xa6\x6\xb7\xd0\xdc\xb\x9a^r_\x92\r\xa5\xb1\xb1\x9b\xfe\xbaR\xaa\x63\x2&" +"\xba\x30\x8d\x34\x9e\xb\xa3\x31\x36\x9e$\xf6\xf\xf1\xef\xaf%\xfc\x84\x1f\xccb" +"\xbb\xf5\xd9\x2\xf7\xb0\x90\x8]\x9f\x1\x14 \xef\n\x95.\x8e\xc1\xdc\xc5\x17\x42\xab" +"?\xb8OH\xf9\x15\xc1\xe2\x80\x1d\x38=\xaf\xc3\x3\xc4v\xf3X\x8cU(\x19M\xa5\x8d\x97" +"\x1fW\xa8\x7\xc\xa8\xf4V/2\x1d\x0\xdb\x9a\xd2\x2\xb7z\xf3\x5\x36\xe0\xc5\xf9\n\xa3" +"\xf\x7\x46x\x8f\xe5\x44x\xb7\xb4/+\xc3\x9bj9\xb2\x10p$NjM;8U\x8c\x62V|\xfe\x37S " +"\x82\xfc\x15\x66l\x17\xe8i\xa5\xb1k\xe4\x64:\xbe\xb8~\xd2\x98\xedH\x91\xda\xb2.2" +"a\xa6\xa2\xd9\xe0\x80\x9e\x87\xf1\x7\xeaS\x99\x18[\xe1\xa7\xfc\xe6(&e\x9cz\x87\xd2" +"6\xcav_\x82\xe5\x11q\xdb\x30\xf3\xd8Z\xffQNT\x1e\xa0/\xbb\xaa\x82\xc5\x90K\xd2\x17" +"\x9\xf0\xc7\xdc,\xc2\xa8\xf9}d\x8dz\xd4\x88|W\xb\xb2\x63\xd0u\xab\x92%L\xb4^\x84" +"\xc8\xd7L\xce\xce\xe3\x95k!\xd2\xe1\xe6\xbei\x9\xba\x17\x18\x9d(1\xb\\\xb3\x92\x99" +"F9\x81(\rFqM\xef\x37\x9c\x19\x42\xcd\xc2\xc9P\xe5\x9?w5M-(\xd2\x8c\xcb\xb7*\xc\xed" +"\xb0\xf3\xaa\xbe(e_\x8f%\xc8\x9e\x65\x7\x9b\xda\x87^KZ`\x95\xc3\xf1\x36,\xda>\xda" +"`(\xd0\xdc\xee\x89s\xa8\x1cgf\x12\xae-\x92\x5\x1?dX\xae=\xe5\xcd\x93HN\xdf\xe3\x62" +"\x14\xcb&\x1f\xd6\x1f\x1e\xe5\xe5\x39\xadh%\xdc\x61\x9cp\xf2R\xd1\x1dk\xc0\xde\xab" +"\xbe\x36\xa0v\xb0/\xb9>/\xe8\xdb>\x91\xcb\x85'\xd3\xf9\xf2O\x9b`\x9a\xcG\x7tK\xcd" +"e\xb3|\x15}\xd0\xd9]\x8e\xff\xba\x95%M\x98\x8f;\x86Y\xdd\\\xe8\xc6\xc2h\x19\x6\xbd" +"W\n\xbdZ" +"\x1f<\xc5\x9a\x98\x30\xaa\xd9\xfd\x94\x89\xd4\xc5H\x9e\x64S\xdf\xd0)\x92^\x14]\x88" +"\xcav.\xca\xce\xf5\xba\x41\x15\xd9/\xe7\x3\x32\x8\xf\x17\x1a\xe\"\xd8\x9f\xba\xd6" +"[bE\xb0\xba\x12\x35\x34\xce/\xf7\x95\xe5)0n\x6w\xf0\x81\x4;z\xb0\x85W\xadH\x9aZ9" +"~\xce\xcby\xe0%\xc3\xd5GC\xa3q\x12\x92\x9e,}\x2X\xe0V\xfc\xd1\xb7:\x83\x87\x83\xc0" +"\x7g\x88\x9\x14{~\xb3\x7f{\x4\xde\xf0\xa7\xe6s\xf\xc4\x38\x10\x8e\xbd\xe8\x83\x12" +"\xac\xa1Ir\\\xe3Q\xd7\xd0\xe6\xa8>\xbc\xc8Q\x8a$\x8\x9e\x15<\x89\xf0\xe4@\x94#\n" +"\xcc\xbf\xf0\x14.\xbe\xcf_w\xf6\x1\x8c\xcf\x43\xb9g\xcb\x18\x88\xc1\x41\x10\x30\x66" +"\x12\x8c\x4\x9\x41\xb6 \xd9\xc9|\n\xf8\xfb\xeb\x8b\xa8\xa8\xd7\xe0\x42\x46:3\x1d" +"\xd0\x12\x85\xdfj\x5\x34\xa3\x1b\x9\xc7\x16\xbf\x45\xa7$\x18tjs\x16\xaf\x38\x8e\xc5" +"\xd8?\x1c\xd4\x98\x45\x8#\x5\xef\x94\xe1~lQ\xcb\xbaq=\xe3\x33;\xaaw\n\xdb\xeb\x8b" +"\x91y\xd9\x85\\_\x11\xcI.q\xdd\xad\xf\x16\x91\xc4\x1e\x33\xa1\xf6o\x93\x1f\xebk\xbb" +"\xa6j\x1e\xd6\xb3\x18\xb2\xda\x99@\x3\xa7\x39\x41\xb1\xd0J\xf3\x1a_]\xa4\x62iZ\xc4" +"\xf8`[\x8Y\x92\x8a\xe5\xf2\x90W\x8cM\xb\x88\x32\x35V\xbc\x8c\xf1\x87\x61\xcdm\x8f" +"^\"\x95\x99QC\xc6$7\xfb\x46\x19\xcf\x9f\xd0\xdd\xb3\xc1\x9a\x6{\x9a\x5IH2\x82\x18" +"\x7\x46\x32\xf6\xbb\x6\x39\x32\xc9\xa7\x38\\\x9cJ/C.u8\x99\x39]j\x1f\xdb\x3\x82:" +"\xd3\xfbM\xdd\r\x9d\x6\xe0\x92\x8fz\x9a\xfd\xab\x46\xd2\xba={x\x9\xfc%\x13x\xde\xc6" +"\xca\x5\x98\x85\x98\x1Q\x91\xf6\x90\x8\xaa\xc0\xef=x,\xbbZ\x9a\xadid\x1\x9e\x88}" +"K\xa6\x87\xc1\x42\xd0\xc6\xe3Q\xf9\x92_\xb9\x63I\xef\xdc" +"\x15\xe6\xdav9E*d\x4\xa2\x87\xdc\xfd\xf1\xb3\x64\xcb\x42:\x7.\xea\xa2h^\x12\xa4\x83" +"}\xd1\x41\x8d\xe8\xa3\xf0PM\xc6\x9.S\xf9'\x83X\x14\x46\x35\x42\x1c\xe9\x1a\xe\x65" +"\xa4\x13\xf8\xbe_[S\xa7\x5\xaeW\xa2\xe6h\xf3\x8d\x65zM\x89\xc1\x13\x8aJ\x16\x92&" +"\x98\xbd\xae\xdd\xfb\x9a\xd5+\"\xbd\xf2\\\xfbV \x12\x19p\xa3\x1f\x97$ut\x90\x5\x65" +"\xee`\xf4\r\xd3\x90\xa1!\xbd\x9b\x63\xbdY\x84?\xe0\x88\xf8\xc4\xc1T\xf2\x16\x31\x8" +"\x6\x8e\x42R?}\x98,\x82\x35\x8e\xd5q\xba\xc\x66\x6\x9d\xf8\xbf\xdc\x99im\xbes\x96" +"\x83QU\x80\xe5v\x1e\xeb\x0\xb1\xaay\xc5\xf3\xf3\x81\xb0\x5W\xdfz\x1b\xd4\"\x13u~" +"\x16\xceG\xc3\xfc\xc6\xd0\xc0\x9d.\xe1\xc5x\xa9\x16s\x96\xa9\xd0vr\xf5\xd1\x85\x83" +"\xf\xf0\xe3\xae\x12\xc1\xc3\xcc\x46\x19\\\x9\x62\xba\xb1-$v\xa6\xc6\x34\x18\x42Z" +"c\xcd\x66\xe5\x9c\x1d\x19\xc5m.\xef\x8e}iE\xb5\xdd\x97)\x10\xb9\xa4p88\xacI\x0~\x9e" +"\xaf\xaf\xcd<\x82xb\x86mc\xf7#\x1c^\xe4P\xc5\x16*C\xc8+\xce\x91_\x94\xf3Q\xde\xaf" +"S\xf5(g\xd5_\xe0\xbd\x1f\xad\xd0\xb0\xaf\xce\xbe\xca\x31n\xb5~i\x3OpI4\x10\x6\x7f" +"'\xdd:\x19*\x7kc\x15\x14}\xbf\xe2\xaa\x34\x7f\xa3\x9e\xec\x1e>/\x14\x38\xff,\x98" +"\xcf\x1en\xe8\x9d\xafOo\x6\xec\xa4\xb3 \xbd\xa4[\xfcu\xba\x86\x36\x84<\xe0\xc7\x7" +"\xc3\x5\xb.y\x14\xa3\x83\xf4\xe7WJ\xa1T-{#\xd3l\xcbhB\x97(\xe3\x0V\xcd\xda\x9avK" +"+\xeb\xaa\xcf;C\x10q\x83\x30@\"Q-\xb6\"\xdd!\xbb\x1a\xed\x97\xd9w[v]\xeb\x44\x34" +")$\x81\x1dh\xfe\x8a<\x84\x18\xb3\x2\x13w6\x3\xfb\x45nn\xd6\xa7pg\x86zZ\xaa\xf1\xf3" +"\xb9\xe7V?\x9f\x3\x18\x8a\xa8\x41\xe8n\xef\xe8\x14\x34I\x10\x63\xbd\x94.\x88\xa9" +"\xc0\xed\x99\x33Ze\xdd\xb6M\xe\xf2\xcb\x1a~\xa8\xd3Gl\x81\xa0\xde\xec\xa7\xf2/\xbd" +"Z\x87\x9f\x2^\xdc\xf3\xa8\x90\x16\xdc\xcdn\xb5\xc2\xc1\x8e\x19\n\x95o\x94\x41%\x9b\x88\x7f\xe6r\x19\xcf\xcd\xad\x6tK\xae" +"u\x8bG\x8e\"\x9b\x1f\xb4\x8d\x44\x9dP\xe9\x62$\x19\x64\x8f\x35\xc2\xbc\x43\x1dH|" +"^V\x9d\xd1\x45\xc7]-\xde\x19^\x9a\x82\r\xbe\xbb\x45\xed\x45M\xf0l\xd9j&\x1e\x90\x88" +"\x99\x8e]\xad\xbe\x8c\x8d\x84\xc9\x38Q\x86\xea\xb4V\xb3\xb\xef\x82%<\x1b\x6\x38\x8f" +"W\x17\rK\xac\xa6\x3\xe6\x92.\xf3\xe\xed\xb8`\xce\x1e\xbf*j \x14$\xfd\x8a!C\x11\x13" +"\x1e\x45\x95\x64\x8f\xb0\xc6\xe\x0\xbc\xab\xb3\x8\xf5\x8c\xea\x45\xfe\xd0.!\xfb\"" +"\x9c\"&F\x81(\xf4\xc0\xcf\xec,Tt)*\x14\xb2w\xd4\x5\x85!\xd1T\xb0\xe2\x99\x96\xed" +"\x12\x91\x11\x34\x8b!\x8f\xf7x^r\xcb\xec>\xb2l\x9b\x35Q\xa4\x66\xe3\x88\xc7\xc1\x93" +"\xc8\x8a\x4L\xf3?\xb6\xec\xac\xd4\xe8K\xea\x61\xa9\xf0rJr\xb8\xbe\x10\x89yf=\xdf" +"*!\x1c\xe3P\xd6:\x8\xef\xb\x96p\xd1\xd2s\xebl^t\xc8\xb1,\x7\x1f\xd5J\x98\x90V|\xdc" +"\xacM\x2<\xcd\xa7\xea\x41\xd0:X\xc3\x92\xc7\xd7\xa3\x99\xbd\xaf\xdb\x97\x17p\xb9" +"nb\xc2\xfcZ\x8\xba\x9d\x12\x89\x87\x99\x97\x86Hl(\xf1\xbe\xaa\x87M\xb\x18_\xa6\xfd" +"s\xc3\x85v\xfe\x35\xc1\x5\x82\xb0\x1dS\x2\x10\xeb\xd8\xe7{\xd4\xb7\xfa\xed\xd9\n" +"\xe4\x1\x97k\x9\x9\x5t\xdf\x9c\xf\x63\x1f\xe1'\xbb\xb9\x39\xb8X\xf3\x12\x33\xf1\xc0" +"\x83\x91\x81M\xe6\x97\x5\x1a\x9d\xad\xe4\xb6N\xd3\x16\xd8\xe1\xafs\x9a\xe1U\xe8\xe3" +"\\\xbd\xda\x94^8\xb8\\\xb7&\xb2\x1b\x9c\xa6_\x6\xe4?\xaa\x4\xf \x13\x13\x93\xb1\x7" +"\xef\xc2\xee\xf1\xe2*\xe5\x38\xb9\xa4K`\x9\xf3\x14W\xb\xd0oc\xf3l5*\xa9\x45\xb6\xf2" +"h\xf8\xef\xcc\xe6\x65\xd2\xfd\xfa;\n\xcfk\n6\xf3\x86`q\xbb\n\x1b\x66\xef\xa7?\x18" +"{\xad\x96H\xd4G\xc9\xc4\xfb\x88\xbe\x1f,\x7\xaa\nH\xfa\x93\x99\xd6o t\x10\x63\xd1" +"\x5\xa7\xd3\xeaJb5y\xea\xf0\x14\x33\xcb\x95\x45\x0\x37\x9f+\x1f\xf\x82\xaeQ.\x95" +"\xaf\xddh\xf9\x9d)\xa6Yuj\"\x8\x84\"\xdb\xcb\xaa\x1d\x87\x8b\xe8\xf2\xb7\xd1,H\x18" +"\x8f\xdc\xe9\x34G\xc5v\xba\x66\xe3\xcd\xf1\x87\x61\xb0\r\x12p&\x96\x99ZB\xaa\x41" +"\xb4G\xe6\xbf\xf4`\x82\xc5\xfd\xbbwS\xb5X?\x8\x93\x17s\x8c\xfb\xf5I\x88\xd6\xa6\xaa" +"h\x4\xbf`\xf\xc0\x0\xc8\xf8\xcf\xfeV\xa9\x61\x9c!\xcc\x88Qr\xa3\xfb\xd5\xc4;\xd8" +"\xbfW\xc1\x93^\xfa\x89\x83\xca\xbb\xb0oH\x15\x9c\xf4ii\x85\x39\xd3\x9a*\x0\xb0O\xba" +"\xfb\xea`\xe8\xf4\x45\x42\xfc\xa9\xa8W\xb1\xd3ml<\xb1\x7f+*\x9\xd0\x80\xcd\xac({" +"\xb3\xee\xe5\x7\xde\xe6\xf4\nmr\xaf\x98\x82\x91\xb1\xe4\xd6\xa9i\xf2\xb6\xcd\xab" +"\x86\xccM1\xbb\xc3\xc5\xc6\x5\xe3\xbf\xa0\xb9}\x8_\xe6\x8d\x5\x16\xa0\xf7\xabU\xc5" +"\x9bz\xcfs\xee\\I[\x8e\xec\xd3\xff\xb\xdf\x91g^O\x80*\xde\xb7x\x11\x8c\xdd\xda\xfc" +"v{\xf3\xc6\xb8\xd7\x96\x4,\xc_\xf1\xc4U\xbfg+\xa3gCO\x3\xb2\x0\x64NQQ*\xc3\xe1=4" +"v\xecZ\x3\xf9H\xba\x9a\x91\xae\x31\xa5\xc2\xebk\xbe\x1a\xd8(\xdcv\x95\xcb/\xf1\r" +"\x91S~\xce&G\xef\xe6\xe6\xf2w\xe8\x3W=\x89q\xd7\xa9|y\x92\x8fK\xe3&i6:\xd2\x8d\xce" +"\xb8\x9b\xe0\x35\x39$\xa7L\r|q,\x13g\x8o\xde\n\xe6\xbd\xd6\x85j\\BI\x93\xe0=\xd3" +"k\xee\xc0Q X\xdd\xa6\n\xab\xd1U\xd7l\xc9P\xde*\xc2]\xc1\xb4\xba\x17\xb7\xfe\xf6\xc8" +"\xc8\x32\xe0\x1a\xa3\x30\xb1>VoD\x10K\x15P\xca\xf3=m<\xba\xbb\xf6\xf1\x95\x39.8\xb0" +"b\n\x95\x33\xb9\xda\x62v1?\xe\xd9\x4:\x12;\xe\xe5\x86\x91%\xed\x96~(\x1f\xd2\x19" +"\x84\xd2U\xda\xab\xadr\rT\xd6\x30\x18\x1c\x96\"\xc7\xeV\xcc\xb5\xbb\x86r\xaf\x44" +"\x91V\x87\xd2\x36\x97\xec\x63\xd4\x8d|[\x13\xc:8\xb8wL\xbb\x92\xb8s\x3T`\xd5\xfa" +"\x93\x44gp\xc3\xddt1)\xebG\xef\x5q\x9\x8a\xcf\xae(OJ\x9ar\xbc`/\xfb\xe0\xe0\xccj" +"\xadqjLo\xddVd\xdb\x96h\x99\r\x34ShRF0h\xc5\x1b\xc6\x12\xfc\xca\x90\xd7\x8e)\x9d" +"\xdd\xd8PNVI\x16m\x9r\xd7\xd0<\xad\x45\x93\xd3O\xa2\xff\xc5\xfa`\xffR\xf2\xdc]\xd1" +"\x90\xe8K\xe7w\xbe&\xa2\x5\xf9o\xd2\x1b\x10\xa4\x93^\xd9.)\r\x81\x62\xaa\xe5jM*\xd6" +"\xcb\x32]\x9c\x43\xbf\x19WAYq`\xf9\xeb{\xbf\x87\xbf\xadN\x19\x9f\x13\xddG\x93ke\xd9" +"B8\x11\xe6\x7f\x19\x61\xdc\xc1@>\xa9L\x9b\x96\xcc\x8d$O\xb5\xac\x45\x1dO\xb6\xaf" +"i\xd8\xc0\xa1\x33\x8f\x9f\xec\xa2\x9c\xf7\x8c\x65\xf\xe0\x66\x1b\xe0L\xf1\x31\x12" +"k,\x8c($\xe8[b\xc1\xca\x66\xa2\xf6\x98\x41kWO\x1c\x92.\xbf\x8d\x4\xdb\x7\x92)%H\x12" +"\xd3Y\x5*e\xea\xf8q7\\\xad\x35g\xc4\xbd\x18W\xc4xA\x17\xaa\x1b\x5\xd3\x92\xdf\xf3" +"\xab\xcf\xccl\xc8\xcd\xee\x8f\xa8\xab/n\xab\xe8%\x9b\x1\x8e\x8*\xa6O\x7f\x8f\x8c" +"\xd0rQ\x18s\xc6\xba\xae\x35i\xaa\xe9\x31\xef\xfa\xb6\xc1\x3\xf9\xca\xdbrZ\x96\x9d" +"\xe0\xe3#\xe\x45\x85 \x12\x8b\x9c\x7\xdaR\xf\xee\xeb\x35\x87\x9c\x38\xd8\x87\xca" +"\x82\xac\x3\x9fw\xfe\xa1\x13\xemn\xf4\x84\x18\xfc\xcf\xc9\xbe\xc4\xfe\xfd\xf4;\x8e" +"\xc8iQRe\x16\x65\x37m\xbb\r\xbf\x98\x31\xb3\x7f\x12\x1d\x1a\xa5\xd9*\xd1{c\xe5\x43" +"D\xf8\rX88\x85^X\xa1]\xc8\xa9\xe6\x91\xedQ[G\x19h\xbd\x82\xf4\xee\xc3\x18q\xbe%\xc8" +"\xc1\x9c\xcd\x91\x10\xda\x6o\x16X>1\xed\x16IS\xe7X\x8a\xb\x91\x64\x36ZC\x81 \x1f" +"g\xbf\xb3\xb\xb1\xb6\x93\xb0\xa4\xc9\x99\x1a}\x95\xa3\x38\x5\xe0\xf1\xc8\xfc(\x13" +"\xe7\x9c\x8\x90\x8a\x0\x30\xf9\xe6G\x15'\xb5\xc0\x8b\x99\xce\xff\xed\xca&\x4\n\xcb" +"KMC\x4\x9\xc\xeb\x39\x36yNT\xf2\x35\x42\x42\xb7\x31\xf3\xb2\x99y\xed\x65\xf8\x8M" +"\x96\r\x85\xdfL\x9\x93\xea\x11?6\xf2\xf3\x4\xb9\xa4\xf2\x11\x16\x19\xf5,\xae\xf\xd7" +"\x13S\x18h\x6\x46^>C\xed=\xe0\x84\x64\x81\x88\x1c\x7x\x95\x36\x1dG\xeb\xdc\x7f\xe2" +"\xdfK\x1c\x34\x9a]\x19\xc2\xd6\xf2-\\\x3\xf8\xc1];;\xe3\x89\x80\x92\xb2#\xcd\x1d" +"\x4{QC\xda\x35Z$\x1ej\x95\xaa@\x17\xdc\xa9#\xfd'\xd9 \xa8\x90\x17\x41?\xe2\x8fs\xc" +"\x82|&\xde\xac\xf1\xa5>\xb3%=\x93\xc8{:\x11\x92\xf9\xbb\xc6\xcdy\xca\xb2\x92\xa5" +"\xc5\xe4O\x82\x36\xf5Y8\xc3\x62\xb5\xfeJ\xe2\x1a\x16+\x85=\xb8\xa5\xc5\x9d\xecr\xec" +"\xb2\x3\xf7\xf2%\xfc\xdf\x3\x32\xb6U~Z\xe0&W\xd0\xde\x13[\x13\xb9\x1b\xeb\x87r\xdf" +"\xc5\x42\xe4q\x9\xe7x\x7\xc8U\x86;x{\xf9U>\xe6}7\x1e\x85`o\x12\x30'\xdf;\xfd\xd5" +"\x97G\x8f\x8a\x10Z\xfc\x9eGx \xc1\x18\xb9\"!\xff\x8cU\x11\xaf\xe2\xc7\x2\x35\xeb" +"\x3/\xb6\xfd\xb6\xb5\x94\xce\x9f\x1a\xd1\xaa\x8aMh{\xcb\x1b\xaa\xe6Jsx\xb4\xf4\xc0" +"\xe9\x9N|C\n\xe5\xd1\xaf\x95y\x17x\xb9\x32\xe7\x1a\x9\xfv\xf3\x98\xbb&\xecl\x96@" +"\xc9\xac\x8a:\xc2\xa7qb\xa6J0\xf4\xb'\x9\xce\xf4>S\x9e\xf3m\x9a[\xc6\xa3\xc0\xf6" +"U\x88\x35\x41\x9\xbaw\xb7\xab\x66\x1a\xceJ\xfaq\x9b\x82\xb3\x80\xaf\xa3y\xf3j\xb4\xea\x93~\xdd\n\xfc>l\x90\xf5" +"\xc9,ho\x12-\xf3\xb5\xfd\x61i\xb9\xc1\xb7:\xa3\xc2T\xc0\xeb\xba\xbe\xf4\x6\xa3\x1e" +"\x9aX{\xa5\x64\xfeW\x80q\xf^*\xb3\x8d\xa7I\xb4\x36\x1a\x42\xe3\xdb\x3\xae\x30\x38" +"\xb3N\xc8V\x98;\xc7\xad\x87i\xc3\xe3\x14\xd3\x1f\xe7@d\x3\x9\xbd[\x89\x1c\xfe\xf8" +"\xda\xa8\xfr\xa6\xbc\x44\xa2\xa8\x65H\x17xaM7+\x4\x37\xcb\x6\xf2\x0:\r/\xddWfae\x5" +"8h\xba\xb9r\xf3w\x2\xc0\x8a\x0\xe0\x42\xf7\xdd?,\xb3\x9b\xf5\x0'\x88!\xb0*L\xe)\xff" +"_\xd9\x87\xc\xff\xdf\x61-4\\\xfe\xc6\xe3.,\xdb)\xd8\xdfU\xe9\x96\xe5\xe5m7\x9c\x65" +"~\xe7#\xb9\xb4$\x92\x64\x9\x97\x31\xf4\xa5\x35\xc0\xed\x43\x36k\x7\xeb\xad\xca\xc4" +"Yg\xa1^\x1d\xce\x43\xb6=\x8e\xfd\x9e~\xbe \x4\xc7\xb\x30\xdd\xdf\xba\x15\x90\xda" +"G\xad\xfem7\xd4\x1d\xbe\xecu#NJ\xbd\x82\xf2\x7\x16\x61\xcaPP\xc1&\x3/\xca\xeeI\x9e" +"SVwz.\xae\xed\xa2-t:c\xd2\xa6\xd8\x18\x15.\x9f\xfe|v\xdbu\x1f\xac\x65(\xad\x90\xe8" +"3\xf3\x97$\xc5\xee\x10\xd2)\x8d\xc7#\xfb\x1\xc5\x43\xa7\xa0\xe1\xfc\x99\xc7\x15\xe9" +"\xd4\x66&\xd4\xcd\xaf\xef\xb3\xd1\xd6\xb7\xe\xa3\xb\xe6\xf4\x64XS\x10\x31\xd1\xd0" +"\xbei:P\xd6\xd9\xe8:l@\xd9\x1a\xa3\xd6\x8a`|\xf3\xcc\x62\xc4\xcb\x8Z(\x82\xa8\xdc" +"\x8f\xfe\xc7\"\xcc\x99}]b\xa3\x8c\xf6\xd8P'Y\x91\x9c\xef--\xc3i\xc\x1\x90\xd2\xcd" +"\xdd\xbb\x15\x7f\xd0>\xbf\x0rw\xe9\xd5rw\xa8\xdc\xd2\xf2\x61\xd5\xb4[jH\xee\x30\x65" +"\xe4\x13\x34\xc9hE!\xd3!4\xbeQ\xb7\xd9$l\x1c\x92\x36\xe5\xa3\xda\x97\xef\xe5n\x4" +"I{J0\xa9\x14\xb6\x64\xac\xee\xb8I\xad\x9d\x87\x32\xa0\x93\x86\x89\x6\x46m\xb5\xb2{[M\x1f\xb8Uf\x1d\x1f`et#=\xeb" +"C@c\xb\xe5\xda\x8c\x19\x9\xe8!q\x9a\x19X\xed\xb9\xcc%\x84\xdeJ2G*\x2" +"c\x91\xc\x91\xe6\xdf\x15@\xf\x35T\xf0\x43W\xff\xb5P\xe4K1\xb2'M\xcbX\xe6\x8b\x89" +"\xf2\xc7\x8d\xba\x92M\x19\xa3\xcd\xb6\xf1\x35uX\xd6W9\xa2\x9d\xda\xd5\x19p\xfd\xdf" +"w\xce\xe3\x33Y\x1f\x65\xd5&6\xd2'8\x7W\xc\xef\xcb+\xf7\x92\x66\xf4\xbej\xb9\xb9\x14" +"\xf]\xc9\xae\x8d}x\xc5\x90\xbd;\x9\x8c\xceS\xdf\x66\x10j'Ze\xd4I\xda\xez\x16u\xc2" +"&\xf4R\xa5\x1dQPk\xecj\xa9\xb\xb\x66\xfd\x41K\xfc\xdb\xee\x1c\x1a\xa8W`\xca$\xf1" +"]s\x9e=i\x1fW\xf4 \xe6\x43\xfd\xce@\xa8\xab\x97\x80\x9\x1d\x1\x87\xcaV\x5(\x1d\x82" +"\xc5`*\x95\x82\x9c\x91\xc4\x31N8\xec\xc0\xdf\x12\xa9`\xc=\x15\x19\x18\x9cW\xd8\xe1" +"\xc2_\xc7\x45\xcd\x39\x19q\xbe\xd4\x81\xb3\xc9\xcdN\xfd\x85L\x80\x82uL\xb1\x19\x90" +"\xc5\xc1\x87\xe1M^y\x9a\xcf\xddV)\x6{lAP\x19\x89\x42\x18\xe4s\xf9\x37\xbc\\\xd1\xfd" +"N\x82\x8d\x32\x38\x82\xfb\x90w\x5\xe1\xf5\xf3\x63\xe4\xf2\xef!u\xcd\xa6\x86\x9d\xf9" +"YBB+XS\xc0\xac`\\*\xa9\xdf\x86\xbfOt\xf\xb1\x35:\xb5\x9c\xa4\xc7\xa2\x33\x82\x61" +"m\xd1\xc7\xd9\x97\x89\x8c.\xcf\x1c\xea\xe0n\x82\xdd)y\x1\xabna\xcb\xfe\xad\xf9>\x17" +"\xcbGI@\x1c\xee\x43\xa3\x9c[\xd7\x9f\x8d\x41\x91I:5\xc9\xd6\x46\xdf,\xb4\xcb\xcf" +"\xc3\x3\x38Ix\x81h\xf9\x86\x38\xf1S6`\xfe\xc5\xf3{\xf1\x9b=\x19P\x4\xb3\x64\"\xee" +"\xc2(\x1eM\xa5\xf7V\x4{\xe7\xf6\xdc^\xa2n\xd9\xd5\"rb\x8f\x12\xf3\xe7\x43L\xb7\xf3" +">\xaaM\x8e\xbb&\xe2\xb/\xe" +"<\xb4\x3\xc8\xcd`\xb6\xacL]>\xf5\x96\xbb\xbc\x91\xad\xb7\x98\xe4\x9a\x11]d\x8c\x8f" +"\x84\xa7\xe7\xb0h\x13\xc2_H>i#en\x92J\xb1\x99\xa2\x8by\x7fk\xd4l9\xfa\x37.Z\xa2\xc8" +"\xf5\x86\x31\xfc\xe6\xf2\x8d\xe0\x1aPP(\xc2kM\xd3\x32No\x10:\xf5~\xd0\xf5\xb6\xae" +">\x1cuN\xeb\xc5JN_:\x8|\x9f\xaa\xc7\x46\xa8N\x94^\xc2$\x3\x9a\xba\xf9\xc6\xb7\x1e" +"=\xb0\xc0o\xb4\x4\x95\x18\x9b(9W\x9c\xc1\xd9J\xd5\x9b\x64\xe\xef\x83\xf1O\x9c`M\xb3" +"\xbd\x36]S\xd6\x88\xf1)\xe3\x8d\x42\x9b\x8e\x92\x8\x9f\x6KXHp\xf7\xfd\x66\xcc\x91" +"\xcau\xe0\x80{\xdc\xba\x38\xf7.|\xee\x33\xcf(\x10\x64v\"\xab\xfb\x1J\x9a\x1f\xd4" +"\xe3\xa4%H\x8a\x81\xeb\xc4o\xd1\r\xc5\x31\xf7\x16\x1c\xfd\xd9\x1b\x97\x81\x92\x32" +"p \x10\xa3q\xce\xb7M\x10*[\xc5\xa6]\x8\x94\xc5`\x1K\xf1*\xad\x96$z9Mu/\xceX\x88)" +"\xc0\x64\xd1\x97\xa6\x35\xc9,\x7f\x97\xe3\xef\x65(r\xf1\x1cm5\x8.L\xf4\x7L\xe8\xe4" +"\xde\x1eQ\xee\x88\xd9\xcf\xa6\xee\xea\xe3\x63?\xd2\xb9\x8e\x83\x14\xfd\x2t\r\x8f" +"\xe7\x95W\x9d\xfe\xf9;I/\xee\xf5i\xfe\xb5\xb3\x8c\xcb\xb7.\x10\xa4g?\xe1J9\x89\xc9" +"\xb8M\x8e\x37\x4\x80\xf5O\xda\x92\xed\xf7\xd7\xd2\x12\xcd\xe4\xb\xday\x1\x15z\xf5" +"\xc0\x85\xfa\x91\x13\x9a,\x9dM\x2\x4\xf6\xaa'g#\x1a\x8a\xc8\xc\x9\x8b_\xafi\xa9\x95" +"\xf9\xd3v\xe\x64\x9b\n\xdag2n\x93n\xd6\xd2j[\x0\xd0wO\xb\xdb?\x97\x8aix\x86\xb5}" +"Xq\x9a\x43\x8d\x7f\x12\xef{\x84\\\x85\xcf\x66I\xa4\r\xc2u\x98\xf}U\xda\x38\x19\x39" +"|~\x16\x9bw\xda\x86+\x1e.\xf2\x1a\rU\x1f\x94\xed)\nT\x8d\"\x8c\xd4 \ri\xe1\xa1\xf" +"Y\x18\xab\xb%\xb5\xc4=\xb7\x8b\xdc\xbb\xaf\xfa>\x99P\x91L\xb0\xb5\x18\x6\xfd\xda" +"~bLi\xc0\xdfv\xbf\xe4KW\xfd\xfe\xe6\xd1\x8c\xb6\x17\xd7!\x97\x32\"\xb5\x9f\x1b\x82" +"4k\xe7\x37V\x94\xdc\xe4\x9e\x61\x35\n\xfb\xb9G\x17P\x13\xcaO\xf0\x8a%\xb6\xb2\x42" +"\xe3mo\xc9\xd1\x45.\x9e<\\A \xa3\xf6\xfr\xe9\xa3\x9b\xa0\xc5i\x1e\xaaH\x17!\x95\xee" +"I\xe4\xe7X\x87\x31\x90\xc0\x80\xbaW\x2\xfe\xcdmP\xb7\xdes\xbd\xb9w\xe3\x98\xa4\x8e" +"Wa\xd9\n\x0\xd0\x12\xf3\xb3\xf\xc2Vu\n\x6\xed\x9c\xce\xaa\x32\x90Nz\xc5\x35\xfY\xc9" +"\x97\x5{\x92\xc9\xd4M\x83\x15p\xa9\x8d\xcf\x7.\xc9\xb4\xb4o\xe4\xbd\xd1\xbe\xcbO" +"\x8X\xe0\xd9\xb6@\xd6\xd1\\\xf2\xf0/\xee[\xbaz_\x9d\xd6\xf1\xff\x96\xa7-\x88\xe7" +"\x1bNh\xf5\x83po\xf4I\x82\xe0s[L\x9eQY\"F\xd3\x8as[\xf8\xb\x9\xc0\xec_C\xdc\x92\xb3" +"\x9b\x5\xb1H\xc0Z2\xe2\x1d\xec\xbb\xd1g\xfdR\xe1\xfb\x9\xac\x61\x18\x1f\x66\x33\x1e" +"\xfd\xa9\xfa\xa2v\xe1\x44\xacOnEv\r\xf1-iE\xaf\xb5\x19\x1aQr3\x0\xea\x98sZ\xed\x88" +"u2\xcc\xcc\x41\xcd,mr\xee\x34\x11\x9f\x15\x9e\x9c\xea" +"\xe9\x95\x33\x65\x5\xb0\xbb#U\x92z\xde\x33\x17\x39h}\x1c\xa9\xfb\x1c\x13\x1b\xf1" +"\xee\xf4\xa7#\n\xa1\xe7\x8bu2\xf8 \xdbLp\xda\x84\x18\xbcs\xbc\xd8\x16@\x1c`\x97^" +"a\xb7\xf8\x90\xbf\xe8\xb0p\x6l)\xb2!I*\x9?\xf5\x88g1\x0H\xf0L\xb\xea\xb2\r\x1bI\xce" +"{@\x14\x43\x9c\x8a\x9f\xf6\xba\x35\xcf\x1e\x1d@\x13\xbd\xac\xb5\x99\xab\xd6\xdc\x63" +"\xb3\xd1%\xc0\x10\x80\x17k\"{F\xa6H\xa1QJ\xbc\xc4\xa6\xcb\xd4\x8\xab\x8a&\xdd.\x9" +"!\x95L{\x7f\xf2\xb9X\\\xf8\x61>1\xaf\x65\x45[\xbf\xfcz\xe3:\xea\x83\\kC\xca\xd9j" +"T\xc4.\x8l\xbd\x36S\x3VI\xbd\xc\xc0M\x9\xfbm\x15\x30\x1d\x35Y\x96R\xe8\xc5qp\x95" +"8\xe3\xb2\xe1\xea\xfp\x83\xa6#8\xdf\xa6s\x8d}\x8d\xfe=\x91q\xbd.M\xa3\xa2\xb3\x36" +"\xac\xc1\x63\x41T\xfe\xb8\x61+E\x11\xb0*\x90\x95\x62u2\xf6\xa3\xc8\xcb\x8b\x63\xd2" +"\x81.\x11\xe8>\xc1\xf3\xee|\x1\xc0\xf2\x8bGd\x1a\x43\xbf\xec\xc2\xc3\x91\x88\xcd" +"K4\xea:\xe9\"\n\x45\x31\xab:\x9c\xe8\xc3\x64\x92\xe9:\xff'\xbb\xda\x86\x1f\x7\x7" +"\xa6\xb4!\x9ci\xe3>\xc3Xp\x9\xf2z\xd5\xb2\xac\xe3v\x98+\x1d\x32\x19\xa9\x17l\x16" +"zSM\xe\x46o\x1f\xb5\xef\xc9\x8b\x46\xe6\x1b\xdd\x3@\xa4\x9c\x41\xb7\xae\xc3\x6\x9e" +"\x9c\xf9\xc9\x16Z\"e\xc5\xf2\x82\x19\xd8\xb0\xbc\x11r\xccI\xdc\x1f$|\x8e\xbcK\xd8" +"4-\x85\xe5\xda\xd0\x8b%\xdf\xf\xad\xfe\xd3&T\x1c\xbd\n\xa5\xdf\xdd\xc2\xa5U\xe1\xe9" +"\x84\x91\xf0\x8b\x0\x7f\x98\x1\xc9W=\xc6$\xc8\x4\x9f\x10\xf9\xcb\x30m\x85~\xd1\n" +"\xf0\xae\xe3\xb3\\m$;\xeb)a\xbe\x7f\xd5\x0k\x8f\xdc\xa0\xdf<\\\xd7'\x9 \xab\x11\x1e" +"\x97_9f\n\x16\x13j\xc5\x8e\xe5\x98\xd1\x44\xedQ\xcc\x4\x2>9\x6>`\xd9\x5\xe1<\x8a" +"\x98\x82O\x5\xe5[x\x82\xd6\xa3\xb7$\xd9q\xacg'/\x92Sw\xcaQ\xa1\x42\xdc\xe6`\xab~" +"\x1f;+\x14\x17\x45\xa1\xfd\x84i\x82\x19\xfd\x99\xa6\x9d\xc2\xfcO2\x1a\xf2`\xea\xff" +"_L\xe3\xb>5J\x8f\x91\xdf\x44#\x9\x93|\x82\xf2Q\xa5\x7\x96=\x1fx\x8f\x62\xfc$\xeb" +"\xcb\x41\xbeq\xacmf\xba\x9qC\xd1G\xcc\xd3\xef}\xda\x46&[\xe9Ic\xdd\x1e\xda\x9c\x43" +"\xdf\x41GNW\xf2\x82\xa1\xde Io\xe2\xb9\x37K\xf\x2\xe0P=\xaf\xd5\xa3\xc6n\xf4\xf4" +"|\xee\xd6\xc3,\xb7\x90v}\xb7\xd4\xdf{\xe?Y\xeb\xb5y\x18\x8e\xba\x88\x8djI\x86Q\x98" +"\xcd\\\xe6(2\x9e%\xe2\xc0'\x94Z,,\x1c\x96\xfd\\\xd8\xca\x2\xae\x36:\x7\xdd\x87\xf4" +"\x14\xb1\xdd\x7f\x16\xda\xefx\xf4Oe\xdb\xa6\xdd!\xd2\xd2\x61\xf2\x4\xe6V\xf6Y\xc6" +"\x94\x8c\xdc\x4\x9b'\xba\x9b\xcb\x97\xb8\xc8\xde\xc3\xb8\xc6\x66!uJ\xc5\x17z\x11" +"\xc4\xb0\x66\x9f\xc9\x42t\xe3\xf8\x17n2t\xa9\xb9\xad\x8b\xddv\x98x\xff^n\xf5\x92" +"\xd5#\x7kx\xee.\xac\x10\x34(\x12\xcd\x31#\xa0\xae\xe6\xf3\x30&\x99\xeb\x42(\xa1\n" +"b\xe3\xbe\xf8\xa9\x42\xb8\xa4\xb8\xc0v\xe2\xce\x46T(]\"sD\x9f\xe7\xd2\xba\xd3\x41" +"\x99\xe$\xae\x8d\xebQ\xfdN\xf6\x43\xbe\x9e\xc0}g\x84\x5]\xc5\xed\x65\x43L\xdc\x8f" +"\xa9\xc0\xb8tk\xaf\x86>\xa4\x92\xf0\x9d\x85l\xdc\xef\x84\xccG\xe2\xc5\x8e}\x8d\x1d" +"\xf5\xbc\x96\xe9\x1\xc\xd6\xc3j\xc2,7\xc4\xc2_\xff\xf5\x90\\\xf6\x2\xe9|\xa8{\xba" +"\xc8\x14\xb7q\x8c\x34L\xbb\x1fW\x99\xcb_A\x92!IKM\xa2\xe3\xe3\xfaI\x16\xbc\x84\x1b" +"Xk@\x10-\xb1\xb6,u^\xe2\xec\n\xe2\x64\xf7i\xec\x97\x42\xd4\x8a\x8c\x84\x80\xd9\x13" +"\x7f\xe5\xff\x6\xf7\x33h\x8\xa6\x30\x8a\xaa\x9c\xa3\x9#*\\\xc7o7C\x11\x97\x17L\x8a" +"\xe0\xab\x34y\xec\xc4\x16\xf4T\x11'\xc3;\x10\x8c\x19Yh\xf0\x45Y\xb0\xadvJ\x7f\xbd" +"\x91\x9d\x80\xd7\xa0\xc5}\xd9\xc8.H])\xd9\xeap#H\xadG#A\xc6\x31\x9cP\xa0k\xff\xa5" +"\xd6IG\x3\xdb\x39\xc3\x6\x45\x9a\xfa\x39m6o\x5\xca\xae\xa1\xa9\xe5\x16\xf1\x13\xe8" +"\xaby\xc3\xe5\xf3\xcd\x8a\\\xea\x83?\xb4n8\xb2=\xb7_O\xcc\x8e\x37~\x2\x98\xc5\x93" +"\r\xaeJ\x96\xa1\x9e\xf1u!N\xb3\x92\xaa\xd2!\xd6\xa8 \xe5\r\x65\xa6\x96\xb1\x37\x1f" +"J\xdex\xca\xb9\x39V\xde)\x9f\xe1\x65\xda\xac\x89\xc4V\xf3\xd8IX\xd1M\x13qj\xe5\xc8" +"A\xea\x6\xb7n\xbc\x61\xcd\xd4\xcb\xdf\xd7\x33,\x95\x46S-\x84\xe2\xf0\x43y\x0Q\xb" +"c\xdb*YG\xffR\xb9\xe7\xfa\xd9\xe0\xf9@\xe3\x9c\xd3\xd4\xdb\xf\xb6\x37L\xa3\xf7\x0" +"\xf1\x45}\xe5wA\xe5\xf4\xb8R\xf3NHb+mS^q\x80{E\xa8\xf1\xf8\xa7j6{\xb2\xea\x83,\xac" +"\xa6/\xa2\xfe\xbd\xa8\xd8\xbe\x62\xc5\xba\xd7n\xa9x\xdbm]\x8ZQ\x1e\xean\x8d%\xb3" +"\x8e?f\xe3=\x90\xa0\xa0v\xf0\xbct\xc4\xb0\x42\xab\xa8*\x14\x6z\xe1\x46\x34\x0l\xf8" +"uN\xb3\xc6''\xb4}\xd0\xf0\xa8v\x85\x15\xe4\xf8\xf3\x34\x0\xeah\xa9\xa9\xf4\xca\x66" +"\xf8\x39\x46\xdb\xaf:\xe5o\xe5u\x1\x2\x46\xa7N84\xce\x96 `91T\xd7M\xa8\xee\xeb\x93" +"\xbc\xdf \xad\x1e\x95\xf4}\xd2q\xa5\xef\x5v\xc7\xdd\xd2\xeb\xba\xdelT\xea\x93m\x8b" +"1\xe6\x9f\x1aQ\xa7\x9as\xd6\xae$\xc1Q\x11\xae\xe8`\xe7\xed\xb9\x36.S\xb2\xa3\x87" +"fB\x82\x8e\xaaU\xc7\xea\x8e\x9f\x65nC\xdb\xe0%\x36\xe4v\xba{\x97\xcf\xaa\x96\xaf" +"u\xb0\x87\xb5}\xe3[\xc1\xcb\xfb\x4\xce\x17\xf0(D\xd5\xa0o4\xde#5b\xf2n\xa5\x85O-" +"\xa4\xb3Z\xbd'\x9aV\xb3[\x19\xdc\x32\xeb\x9c{N\xda\x9f>L\xc0w6\x6\xa5\xac\xd4\xb8" +"\xf3)\xf5_|\xc3\")\x1K\xe7\xd5\xe7S\xfa\x83Z.\xb7\xf7\xcc|\xc9\xbf\xa3\xdc-\x8a\x9b" +"\xd3!\x7f\xd4\x1e\x30\x1c\x3\x9a\xbb\x30TB*n8~\x92[\x87 $\xb8;\x80\xe6\xe3,\x99\xc5" +"8\xb\"\xcc'\x93\x92\x12\xdb\xd2\xc9k\x8dN.\x4\xe5\xb6N\xd3\x16\xd8\xe1\xafs\xaby" +"d[b\xf1]9\x1e\xf2\x45\x4\xb1w0\xf8\x1\xc3o,\x7i\xce^\x87\x6\x11\x33\xf9 \x17\xed" +"\xda\x1c#\xf7P&:\x92\xc8\xc2\x88\x8a\xe9\x37\x94\x43LcQ.\xb%t\xd9\xad\xe9\xea\xf6" +"\x0\x8dK\xaem\x1e\xe3\xa8'u\x8b\"\xf\xdbI\x14\xf2\x15H\xd1z\xc5\xe8t\xc9q#|\x7f\x0" +"\xf1\xf3\xc3.[n\x1\xa0\x13\x35H\x8a\xc3\xbbH\x10\xdc\xd0\x61\x41\x91\x42\x7f\xbf" +"\x6\xacp\xe3&>Be\x14\x1a\x14i\x5\xe/\xe5\x1d*\x96\x9\x96\x42\x1b\x85\x43\x12\xd0" +"d\xa5|>\xd3\x98L\xf9g\xed'\xa9\x4\x91!\xf7\x41/*\x91{\x97\xa9 *\x5\x5\xb7\xe9\x37" +"\x89\x8a.\xdc\x9a\x95\xf9\x36\x5\xbc\xe7\xb5\x80\xbX\xb\x82z\xb2\x61\x8ft\xf1\xc4" +"c\xcb{*\x7\x41\xae\xf4:\xce\xbf\xbc\xc8\xbR\xf8\x94\x80l\x9d\x6\xa2\xa0\xea\x8b\xab" +"\xec\xdf\x11\xfc\x1f\xfe\xe0Zc3]\xe1\xe1W\xab\xc8Q$f\xc2\xcb\xb9\xf7#f\xc0L\xaf\xb" +"5\xad\x8a|\xf8\xf5\xe4O\xfd\xdd\xb9\x62\x62\xc7\xef\xcb\x36\x9\x64\xdf\x89\x42jM" +"\xeb\x87\xee\x98\xee\xcM\x82\x31\xa0\xf0\xaf\x9ao\x91\x11\xda|+T\xa3\xd3\x9e\xc8" +"{\xaeM\xe6 J\xae\x11\xfd\xc4\x82\xb5N\xa5#\x95\xdex\x6\xb4\xa2Ic\x84\x17\x98\xa9" +"\xa4y|\xc6tz'\x85\xeb+[\xf7~7\x14;.X\"\xf1(A\x15SU\x8f`%\xf2\xd7\xeb\r\xd8hN\x12" +"\x15LX\x6\x1e\x18\xc9\xa8\x66\x9\xc7\\*!\xb8\x1e\xbegM\n\xaa\xffQ\xd4\x80\xcdT{\x16" +":!\xa7\xed\xe4g\xb2\xff\x2\x8a\x87\xd6K\x8b\xd0\x99\xb9'\x98\x1f/\xa7o\xdcsNS\xb3" +"\x9\x65>\xd6&<\xd1x.Xa\xb\xe7\x9b\xea\xb7\xcb\xbb~\xdb\x8a\xab\x8d\xe9\x8dsB\xaa" +"\xff@yZNBHBY\x13\x8d<6\x6\xae\xf6JS\xdc\x66\x45^F%>\x7f\x12\xb8\x10\xac\x37\xec\x63" +"\xde)]\x6\x12^\x82\xfa_\xf5!t~t\x96\xc5hj\x1a\xaa\x7\x90\xe6Z\xee\x5nB\x85sT\x1e" +"?}K}\xc3q\x83g\xc5\x8aSx7\xd7\x83\xce\x36(\xc\x8a\xb3\xd2\xce\xc3\xd9 \x95H\xcfR" +"\xcf\x30\x45\x89\xcc\x39\x6\xc8:\xc0tEG\x9f\x80\x84S\xbc\x1c\x81T\xd0\xc7\x9OE\xe" +"\xff \x1d\xb7Y>.\xfa\xaa:\xc8\xd9\xc6T\x12\x9f\xad<\xa2\xf9\xc4\x92\xc8\xa7nq\xea" +"F>\xb1.M<\xf\x33t6\xdbX\xf8\xb4\x94#\xcc\x9e\xfa\xe7\x16U\x8b\x90\xa5?\xdb< c\xfd" +"\xc4\xec\x95N\x99\xde$v\xa0\x64\x89\x9a-j\x16\xef@%\x85\xf3\x16\x7f\x93(Gw\x84\xf5" +"\xd7\x8b\xba\x42\x8d\" \xdc\x37[\xf0\xc5g\xbe\xae{\xf7\xd2|\xdd\xc9\xcasM_\xf5vF" +"\x6`\xc\xfa\x3\x91\\\xf7\xa9\x37\xbe\xb1H.\xab-\xa6_\x91\x37J+rwn\x9d#<#\xfd';\xfb" +"WMM\x19\xe5\x41\x8\xfeMg\x1f\xc5\x1a\xec\x63\xe4=\xfb;\xda\xa3\x38\xa3\xe0\xc1\x93" +"w\xb1\x1aUl\xa8n\xd0\xe1\x81\x46\x1d\xc9h\xc7\xe3\x8c\xc9\xa5U\x1c\xfb\xf0\x8e\x10" +"\x19\xdd\xc3\x89\x34\x95\xd0\xc7\x36\x37\x13\x1f~|\xcb\xf5\x9b\xe7\xcdZd\xf6\x7\xa1" +"\x8c\xd1\xd6>\\6\xe\xbN\xc2\x8d\x1a\xbc\x92\x7\xec$\xd6U\x99Gu\x4S\xb9g+\xde\x83" +"\xf0#*\xabs\xd9m\x3+\xd3Zk\x1d\xc3}8\xdd\xe2\xb1\xbd\x88M\xda\x95\x9=\x6K\xei\x1c" +"\x8a\x6\x13\xbf\x42\x46/RM\xcb\xa9\xaa\xdf\x99\xb0;x\xb8\xb9\xe8>7D=\xc9,\x95qt1" +"(\xd1\xa7\xdd\x9du\xb9\xa7\xc6s\x83\xca\xe3h\xa2\xce\xc2}\x9d\xcd\x35\x4\xe2\x37" +"X L\x7\x9a\x89\x44\xab\xb0U\x3\x89v`,x\xd4\xf6\xee\xa2:U\xb7\xa7\xc1\xafJ\xbb\x18" +"I\xd3\x1eyf-\xa7&\x91J\xbb\x98}#NP\xd3?\x1bwU{\xc8ra\xee\x98@\xa8\x14\xdf\xc5\xc4" +"\xc5\xe0\xe5\x89ZJ\x14.\x8c!\xde\xfb\x15\xf9\x9f\xbd\xa4\xad\xb6\x95g\x95\x80\x96" +"\x18\xa8J184\xe9\xe3I\xd3:Y>\xe7\xdatb(\x8e\xda`\x84\xcT\x9cj\xf6\x9a\xd2\xfeuA9" +"\x17\xd5\x35\xc1\x87z\x82\x90y\xb4\xc0W>\rt\x17\xb5\x43\xbf\nW$\xaf\xd9\x98R\x7f" +"\x6\x94g\xdc\xfb\xef\x1\x62l\xb8\xb4Y\xee{-\x9a\x43\x95O\xdc\xeb\xa4\x9f\xa0\xdb" +"\xed\xbc\xecU\x99\xc6\x91\x37\x3\xfeN\xb3\xd6z\x8%\x0\x9e\x1d\xef:Z\xde\xa6\x15\x1f" +"\x1b@\xd8\xdf\x82X\xf4\x32{w\xa3\x1f\x11\x7\x9c\xb\x8e\x92l\xaf\x33\x46\x8\x37\xe" +"\xe8\xa0\x8b\xfa\xae\x13wi\xec\xaa\x18!ox\xb6\x81\xa0\xdft\x1b\xb2\x80^3\x8\xf3\xe1" +"k\xb1\xd2\xffV\xd1\x86\x94\xa6K1\x2\x9dJm6F\x97)\xfb\xec[\xb\xbe\xb7\x0\x90\xe7\xf7" +"\n\xd2\xe7\x94~Oa\xe7\xecg\xcf\xd4\xbc\xe9\xb6\x9a\x17YVr1}\x87\x8c\x1d\xb,\x9e\x1d" +"\xba'\x89\x1\xe3>\x16\xd5\x9f`\xb0m\xb8\x42\xde\x61j\x92\xc0\x1b\xc7\x81\x65S\x87" +"\x2\xcd\xf4\x99\x7!\xbc\xdc\xce\xab\xed\x42w+3*\xab\xce\x8$\xfe\x1\x37k\xa6\x64*" +"\xff\x89\xe7\xa2\x35\x8\x18\xfa\x1d^a\xe1\x1eXs\"v\x9f\xed\xe4\x42\xd6\xf8\x18\xee" +"Ds\x82\x90\xa8\xfc\xdc,\xbb[M\xf3\xf\xdb\xf3\xb6\xb3\x98\xba\x13\xd4\xed\x8a\xc5" +"4e\xd2~@\x81\xce_\x85\x42:\xe5q\xc4\x1b\xd2\xea\x7\x8a}T\xb6\xb6p\xf3\xf5\xef\xda" +"|\xa0Gh\xd0\x9c\xc0\xd6$m\x15H\xcf\x37oG\xf3\xea\x9c\x8e\xc4(\x16\x81O\xa1\x61GX" +"\x9a-=\xad}M\xac\xb8\x89^\x2\\\xd6\xb+\x2\xfdhb\x81\x12\x8du\xdc\x16\xa8{N\x8\xca" +"\xe5\x9e\x83\xa9\xb4V\x1a\xb0\x90\xb4\xa7\xd0\xe2\xb5\x31\xd5\xfb\xe6(\xd1\x99\x1d" +"\xe7qzW\x89\x42\xc2&x\x99rne\xc6\x12\x11\x98\x62\x34\x96Q\x18N\xa0\x1aU\x18\x3\xd0" +"6\x80 \xf0{\x1\xcf\xbb\xc1&\xc1\x42\xe2s\x8ep\xc1\xf7\x88\xf7\xf2\x1b\xe\x8b\x1b" +"J\xaaj\xcf\\\x9f\n\x37\xc2\x8a\xea\xd2\xfb^\xfc\x19\xbc\xcd\x9a)tz\xc9\x8\x0\xd7" +"VsC\xff?\xd3\x11\x91^\x94\nq9\x8d\xb4\x63V \xb\xac\xd8\xc9\x9ex\xa8\xdbQ\xe6@rV\xa0" +"\x13\xd7\x8c\xb6\xd1\x3\xcd\x10\xca\xb4\xee\xcf}\xec\x0\xfdx#\x3\x81\xa7#\x1d\x90" +"\x94\xff\xb1\x93\x15\x1e?\xaa\xc1\xf1\x11\xa2\x39\xbc\xbb\xbc\x9\xc7\x81@\x18\x8a\x39^\xf\xf7h\x85\xf9\xdfJX\x89\x39" +"\xfb@6$P\xbe\x66)>]\x8dM!\x8d\xc\r\x10\x11\xe1\xf5i\xa4\xc0\xe\xe8\x1f\x19\x9eYU" +"\xf5\xaf\xf8\xc\x1d\xa8\x38\x8f\xd4\x7\xf0>M \x87\x36\xe9?+e\x1a?\xd7%\x91\x9e+`" +":\x3\xe9\x17\x0\xcf\x66\xbeK\xbd\x46\xe8\x8\x1a\\_\x14p\xfa\x13y\xe0\x98\x2\xbfK" +"\xe4\xa5{\xdb\x39\xf0/h\xc8\x13\xcf\x1d=i\xfby\x85\x42\xd3T\x8\\;\xb1\x36^\x18\x46" +"\x7\xdc\x1a`\xc1\xd3\x42\xc9\x43\"\xee\x8f\x96\xfc\xcf\x92\x85WoOG\xce\x11\xa1xj" +",\x9e\x81{\x90\xeb\x43\xdfXf8\xb5\xc4\x9fVA\xe9\xfe\xf2\x42\x32\x42}[\xf\x42=\xcb" +"\x97\xd7v\x11\xcd\xe8\x44\xb6\xe\x89\x46>\xe2\x13\\-4\xcf\xaf\x1d\xa8\xb\xc1\xa6" +"\xcb\xf4n[\x8a\xdf|Q.\xe3\xe9\x0\x94\xa9-VM\xad\xbf\x7\xa8\x33#\xac\xf2\x5\xb\xb1" +"\x99O9\x15\x4\xa1\rg\xb4\xb3-\xb4\xab\xd8\xce\xf7\n\xb9\xd1\xbc\x94\x91m^\xf2\xa9" +"\x97\xe3u_\xce%~\x85\n\xf0\x90\x1a\xd8\xfd\x89\xb7\xdb\x38\x15\xd1\x65R\xc2\x33;" +"\xc4\xa1\xa7\x32\x61\x95_<\x84,\xdf\x9f\x8d\xe9\xc8\xbfK\xab/\xe4\xf2\xb6\xeb\x65" +"\xb\xb8\x8c\x3\x92\xff\xfd\x9d\x33\xa7{\xe1\xbb\xa1\x1e\xdbk\xce\x33j\xfd\x61J\x98" +"oS\x9dJ\xb9\x9y\x17\xa5\x98\xac\xdc\x34\x1e\xcb\xdb/\xadtH\xee\xd3\xbf\xb4K\xf0?" +"\x18\xd4W\r]\xbb\x98\x99\xfb=\xf1\x8b\x37\\\x80%\x83\xdc\xea\x90\xac\x38>D\x87\x83" +"[\xdb}\xaa\x93p\xce\xd3\xfd\xe2\xa7\x2\xbagC\x97\x63\xf8\x1b\xd0\xf4\x9a\"\x81\x19" +"\x15\xc4\x0\x9f\x95\x87_4b+\xb1\xdb\xc2TA\x9e\x1e\x36\xc6\x36\xbc\x32\x1a<\x1fv]" +"\xdet)\xde\xa1P\xbrW\xf4\x90\xb5<\x1a\x65\xbfU\xd9X\xd0,\x6\xe6\xdf\x8b\xe7.\x9d" +"\xe0t{\xb8\x13\x85\x7f\x88\x84\xf5\x38\x18\x43\x12\xb7\xa0\xc4I\xbb\x95\xe,w\x90" +"\xffK\x18\xb6y\x1O\x3\x3\x37\xf0\xad\xc5\xea\xdd\x12\xf7h\x8b\x2\x90\x9c\xd1\x1\x31" +"\xb7\xf0K\x88\x8bk@\x91oAm\xf9%;C\x8\xed\xef\xd9\xb0/\x1a\xec\x8e\xa0 \xb2)\x12^" +"\xe0_!\x3\xa8O\x11\x89`\x7]\xf1\xb4\x1b\xda\x1\xd7w\x86\x1c\xc7\xfe\xb4P(U@\xe8\n" +"\xfc\xca\xf8\xe0\xbd\xfd\xda\xb3\x1e\xc4N]%\xc3\x83\xa2k\xe6.\x1d\x41)\xe1\x63\xd9" +"\x8d,\x96\x91\x85\xa1\xe2\x1f\xda@\xf6\x1d\xd5\x9c\xde\xbfV\xa1\xa5`\x1c\xe7(\x18" +"\x9a\xfa\x62\xcc\xf3\xef\xb2\x8e\x94\xa4Vj\x1f\xf6T\xa9\xc7\xc3K|4\xd7\xc6\x31\xd6" +"k\xaaH\xeb\xe5\x1a\x46\xfc\xc9\x63\x10\xd3\x19\xd3\xea\x1b\xb6\x9b\x14\xd0\x5\xaf" +"s\x8f\xb1\xe2\x7\xbe?\xf9\xb5m>\x8\x7\xe8\xc7\xbcNN)r0\x82\x38H\xfa\xab\xe5P\x16" +"cNWQ(Y\xb8LG`\xd9\xe0\x9d \x99\xf8\x62q\x18\xefM\xc5\xf1$\xfd\xf7\x41\xcd\xbf\x37" +",\xc6@\xcf\xa9\x1c\xf7\xbf\x6\x8f-~\x7f\x16\xd5|1dv;\xb0\xd9\x9d\xf5\x14p3\x9f\x2" +"\xb8\x93?'\xf0\xf6O\xf6\x82\xac\x8e\xde\xc3\xf3\xb0\x43Q\x4S`S\xac\xc5\xc0\xff\x62" +"\x6\x1f\x8c\x9e\xebq=\xbc\xb5\xb5\xdf\x4\xd9O\x99\xf3\x14P\x1d\xfelC\x14\x46\x8\x39" +"\xf8\x94\xcc\\\xbf\x87nN\xdfi5\xb3\xb2\xe2\xbbW\x10%\xf1Q#\xd5\x8a\xb+M]<&\xa1(\xe3" +"\xae[g\xcc\xdd\x88LPzZ7\xfdo\xd8\xf6u\x9f\x9d\x92z\xfd\x8a\x82\xb0\xaaxI\x8c\xe0" +"\x99\xf8\xe7\xb\xb1\xb0\x88\xbd\x8f\xe9\xb\xecpO\x8e\x84\xe8\xe1V\xe9`\xbe\xd5\xb3\x10\xa1\x90V\xca\xf9\x7f\x62\xd6 \xf0\x30i\xf6\x9" +"\x13&\x0\x86=d\xc7&\xc9\x83\xb3\x37\xff\x9G\x8f\x8f\xf6\x39\x89\x8e\xb=\xca\xf8M" +"\xco\xe2\x9b\xda\xab\xfc\xb1\xb6\x35\x64v\x9b\xec\xf6\xd5\xdd\x92\xa2\x88\x3L\x5" +"-\xb4\x63\x95-%\xe1S\x9c\xdb&dk\x8c\\\xaf\x44\\\x19\x90\xd3\x86\xc8W\x4\xf7\x61\xdd" +"\xee\xd3\x11|*\xa3p-B\xc3\xad\xcf\x9b\xc2\xaf\xb1K \xc5 \x1b\x34\xeaT\x9f{\x85\x8b" +"U\xadM`\x85\xed\xb3\x1e\x65.\xe6)\x1c\xf2\xfe\xeb\x32\x4\xd5\xe3\xa6n1y\x92\x64\xbc" +"\x9cV_\x5n\xe/&\xb2\x37\x64\x2\x1a\x33\xfa\x81\x34|:\xe7\x91\xae\x8d\x35\xae\xc4" +"\x1d\xcd\x89$Y65\xe2\x8d\xaaZ\x3z\xc4\x84k\x0\xceXx\xe3N\xec\xfe\xec\x89\xa5I\xaa" +"M\x3\xb3\xc0\x3LTd`\x1\"\x64%\xfb\x1bs\xbb!\xeb\x83**\xe2_\xd4\xf9\xf1\xa3g%\xf3" +"\x18\xf5.\x16\xe5\xb7\x81\x31\x9d\x8f\xafmW\xb0P\x9c\xa5\\@\xfa\xf8\xc5\x98RR8\x3" +"\xb9\x87!\xe5\xef\x32`\x85\x1\xf2\xd9\xa6O\x92\xb8\xa0\xcd/\x12\xf8\x85\xb6\x35\x1c" +"\xb7\x82\xdb\xc5\x99\xee\xd6\x16\xd4V\xed\x10\x10\x6\x98\x1c{\n\xfaL\x83\xb9g\xae" +"\xc9l\x93\xf8\xa5\xe4\xed>k\xbd\x90\x61\xa3\xc1\x2\x31\xc2\xd1\xe5g\x91\x7f\x62\x65" +"j^\xa3\x45xW|\xce\xd1\x8c\xd5\xee\x1f\xa0\xb3\xf7\xdd\x15\xb2\x9d\xc1\xe4\x14q\xc1" +"q9a\xd3\xc9\xb6\x64\xa9\x4\xb8\x8a\xa0\x87\x66\x2\x96$\xc\xfb\xed\x15w\xb0\xcd\xe9" +"\xa4\xeekzss\xaf\xa8,>\x6\xb2\xddo\xff\xef\xff\x92le2](\x97@\xf1\x99n:!BG\xcc(JT" +"Z\xc6\xc3\xd3\x8f\x62\x83\x33\xac\xf\xfd\x19\xadR\xd2\x34\x8c\xa8\x38\xb3\x64\x42" +"\xd6\x9b)k\x80\xe6\x0\xba\xe6\x32\xe3\xf0X\xdb\x43\xe4\x11\x7q\x94L\xac\xa9\x90\x66" +"\xdd\xcc}\xb8\xcb\x31\xbf\x1b\xacG0\x86\xea\xf\xebh\xeI\xdd\xeb\x96\r\n\xee\x5M\xb2" +"\xad\xc7\xba\xc8l\xaa\xaa\xc0\x8f\x8c\x90\x86-\xe1\xf8q\x5\xc1#\xf7W:\xfei3\xad\xf3" +"\x8f\x30\x1a\xf5\xf\xd2\x1f\xb5\xdcr')h\xe5\xcb\xe|\xba\xd4\\\xd8\x44\x9b\xd7\xad" +"\x1a\x9c\xb5\xee\x80\xa9LA\xad\x38\x9eg\x98\xd5S\xa7\x41\xa6)\xf3s\x15\xdb\x92\xe2" +"I\x9bG9_6B\x92'\xe2t\xd9z4\x85=,\xcf\x16\xd3|\xad\xa2\xb\xd1\x1e~\xfc\x18\x1c\xa0" +"\x4.\"\xbf\x4\x1c\xd5H\xa5\xeY|\x2 \x89\x14\xd5s\xaf\x85H-\xf6\xd9\xc1\x64\xbbH\xe5" +"]\xab\xfd\xb3\x8b\xd5\x45\x1e\xf3\x5\xe1\xca\xd3\"\xaf\xa8\x14\x44\x88kJ?\x94|\xb1" +"QA\x9a\xb9\x2\x30&\xc3\xbd\xef\x10To\x9a\xbeVp\xeJ\xc4g\xe8V\xff\x1f\xa1h!\rX\\W" +"{\xed':\xcb\x7kC\n\xe2K9\xe7;m\xab\x1a\x4\x9d\xfd\xa1\x92\xf6\xc6\x34\x61\x1Q\xb4" +"\x14\xacH\x1e\x83\x90Wo\xbd\xe?\x1b\xe2\xb2\xaf\x9a\xdfs\n\x18\x61\xd4l\xe0:)\x89" +"v\x17\xac\xf6U\xffILx7\xfb\x85\xb1\xb9\x34mt\xc7V\xa1\xab\xce\xcdGf1P\x12\x11\xeb" +"\xac\x65\x89\xc8\x15IA\x1b\xf3\x65W[\xec\x7f \x9eg\xf\xef\x1\xc0\x8\n\xbd+\x85,K" +"\xcf\xa4+\xcJ\xb9\xf\xdf\x99\xe3\xde\x19V#\x13\xe8\xaa\xd6\x97\xbe%\xbc\xa2\xba\x9e" +"\x86\r\x9c\x97\x2\x10\x8e\x80\xdd\x7\x1\xa4\x88\x66?\xaf\x8b!P\xd7h8\x1f\xac\xf3" +"\x98\x87<\xd9\xb4l\xd9<\x9b\xea-Wl\xab\xdd\x91\xbf\xe<\xf8\x6\x36\x9b\xd4\xc3\xe9" +"\xdf\xe0\x61p\x87\xeb\x3= d\x80\x61\x10\xa0V\xb1Q\xc1_\x89[l\x9a\xc6\x18?\x17\xda" +"\xc9\x41\xf1\x6\xem\x12v\xa0\xce\xd4\xd1~\x84K\xc6\xa2Xs\xc4\xff\x83\xf1\xb5\xa5" +"[\xd3\xeb\xf6\xe5\x65\x9a\xfa\x8#p\xb\x61\x31\xb9\x9b\x9a\x92\xaf\x31\xe6\x80N\xe" +"]\x88RJTedg\xf\xa2zk\xd3\xc0\xfd\xb6P\xbcw\xe1\xd6\x87\xd2\xe9\xb1\x1dw\xa5m\x4\x41" +"@\xa0\xe3\x8c\x9a\xb4i\xf6\xa9Y}/\xd9q\x85\xc8\x62k\xec\x11\x83\xf1\x64\x11\xc1\x1a" +"\x19\x36\xdd\xb9O\xe\xb8n\xa0\x34,H\xd9s\x8f\xd5\xd1\xdc\xfb\x9b$Q\xdb\x44\xbc\x63" +"\xc5\xe5\xc\x1d_g\xf0]_hi\xfP_\x1f\xd0\x9a&\x5\xb3%\xb8@\xc8\xfe\x97\xe1\xca\xf5" +"B\x86\x8f\x65\xbb\xec\xbe\xc7\x17\x1dh\x9a\xf\x8f\xad\x45|`_\xa5\xb1\x44)\x99g\x1" +"d\x8e\xa1o\xfY\xcb(\xbc\xd1\xa2\xc0w\xd3\xc5\xc7&{\xef\xe1\xf4\x63\x37\xfd#K\xc8" +"+\x83\x19\nkW\xcb\xf7\x41u\xae\xf0\xd3\x90\xad\x9c\x30\xa7\x9f\x32\x87\xf9\xffg\x13" +"\x11?C\xa5\xb6\r\x9f!\xeb\xec.=y\xbb\xc9J\xd0[Wb\x13\x34\x9d\xe2\x38\xdf\x93Q\xfd" +"H\xf6i\x15z\xa4S\xc1\x6,\x8fI\xa2m\xcf\xaa\xa0\\\xf7\x1ai\x81\xab\xb9\x39\x94\x2" +"\xc3\x32x\xfd\"J\xf\xa7o>\x9\x1cP\x86\x95\xccz\xfc\r\xf6\x94\x9a\x43\x64\x1e,\x91" +"\xac\xce\xc,f\xfc\xb5\x38\x17>\xd1\xc3\xb5\x17\xd0|1m\xd8\xce\x38\xa4\xee\xe4\x81" +")\xd5z\x1b\x98\xa9\x11\xf\x13\xed\x11p5{\xbe\xad\xfb\xd0\xf8\xe4\xd3\xe2\xcc\xfa\xcc :\xf7" +"\xb5K\xa5\xbf\xb9\xdb\x30T\xa3\x9f\xd6\x81\x91=\xd8\xd9\x4\xfa\x44\x33\xb6%i\xbc" +"\x8\x35\x63\xfd\x19\x9d\x8e)\xf3\xea\x16\xd9\n\xd8z\xf6\xe4KK\x18\x5\xd2\xdd\xc2" +"T'\xd7V\xf3\x8d*\xbfy\xcd\xcf\x33\x1f\x37\x61&\xc0\xb9'F\xe8&\x7f\xa7\x8bW\x96]\xb" +"#}\xe4V\xe8K\x8f\x32\x14N\xd8]\xf5\xeb\xb\x65\x9c#\xa5\x42\xd5?#\x8e\x32\xc0\x1e" +"\xca]\xfd\xdb\x5\x42\xef\x45\xfe\x64-\x8d\xfc\x11\x8d\xc6\x88y\xaaH\xa1\xd4\xc5\xb7" +"dX:\x99\xd6\xa1\xff\xdb\xe}\xf5i\xe7\xcb\x1d#\xf1\xf1\xe7\x93\xe5\x61\x88-\xe7\x34" +"\xdaw\x97\xb1-\x5\x7fW'km\xf8Y\xd1\xe9\"\xd7\xf2j8\x1c\x95\xe5\x4\xe7\x8b\xca\xad" +"Tn\xc6L\xea\x96\x89+\xef\x87\xf1\x1e\x4\xb3%#vn\xd6\xc0\xfb\x17\x9c\x88u\xb8 \x14" +"\x9c\xf8'\xb5\x88\xee\xda\xcbK\xba\xef\xe3`1\x89\xd6;\xa5O\xb0\x32\xcf\xa4.R4\xcd" +"\xd1\xda\r|\xc2j\xd0\x93\xe5\x9s\xc1\xd8<\x1a\x94s\xdd\xf6%\xefx^\x85\x9d\xae\xce" +"\xd5\x96\x10\xb2\xc1\xea\x91\x80\xba\xa5L\x8f\r\x17\x8c\xa3\xec\x39\x63^\xd8\x9d" +"\xcc\xc5\x41\xe1\xc7\xf7\x1e\x9d\xc3\x43\xcb\xfe\xa2\x8b\xa0\xa5\xe0n>x\xe3\xac\xa3" +"\xd3\xb9s\x1dub\xf3$\x1b\x35l\xe9\xb1\xa4\xfa\x9fOj\x2\x97\xde\xd2uu\xbb\xd7\r\xd3" +"S\xa9\x9b\xd4*\xcck\x9e\xf\xe2\x66\xfb\x1a\x45\x94\xc\x95\xf7\xbb^D\x10Y\xa4`+\xdd" +".\xbe\x32\xa3\x36@}\xb0n\x85\x3\xec:\xf9\x80\x92\x31Hf2\x0\x64\xbe\x36\x41N\xf2\xfc" +"n\xfe\xfd\xad\x1f\x37\x97\x95\xde\\n\xa1\x83\xa9\xb6\xd0\xf\xaf\x63,(\xc2\x13\xea" +"\xc7ZP\xb6\x1a\x10\x0\x13\xaa\x61\x43\xbc\xd6o\x81\xdb\xde\x19\x64\xcb\x16\xeb\r" +"P\xca\xaf|\xf5\x39\x95L\xe7>\x1bU\xb6\x30\xd9\xb6\xf1\"\xce\x97\x82\xa1]\xb0\x6\x18" +"{\xf2\x4\xc7\x92 \xf4Gt\x8b?\xe1JL^o\x93ye^\xb1\x43{\xf2\x86\xe4}\x8c\x89\x98\xca" +"A\xa5\x18\xb5\xf8\xd0\x65\xcf]\xf7\x84n\xdc\xee\x85\xe2.\x96\xe\x84S\x9c\xa2\x44" +"\xbe\xb3\xde\xf6G\xd4y\xa4\xd4\r\x84\xc8\xad\xbe\xa4\x31\xa4\xbbTk\xc0\xfe\xb\xfb" +"S\xcata[\xe0|,\x87\xadg\x16\xc\xa1\x9a\xb4\xa0l\xe\x3\xba\xc9\xbb\xf0\x62\x84\x9a" +"b\xe0\x39\x82\xb0\x1c\xe7)\xec\x85H}/\",\xdf\x85\x96\x8f\xcbO\x1f\x87\xf6\xb1&?\xa9" +"\xa0O\"\xa0\x65\x0\xfa\x85R\xda\x33.\xf7\x99\x18\x10\xa5\xb2\x9a\xe7\x8d\x1cKS`{" +"\xcT\x9\xe2\xcc\xad\xa7\x31\x37*\xd7\xf3n\xf0\x93l\xdb',\x8c\xc8\xf6\xe2\x99\x19" +"\x93__\xffW\xd9.x\xfa\x8e\xb2\xd0MCp\xf9\xed\x43\xc0\xcf\xee\xe1\xb8\x86\x45\xa6" +"\xf5j\xc4\xf8\xfa\xdd\xb3@\xe3\xa0;>P\xb9\x90WN\xebU\x8\xe7\x88L<'\xb4\x5\x8e&>l" +"\x98\x9e\xc6\xa3H\x94\x94\x87\xbeOJ\x88\xe8XY\x0\xef@\x94\xc0\xdbm'L\xc0U\xaa\x94" +"dx\xb7\x89s\xe0\x64\x8cu\xfa\xb\x46t\x9\x46\x14\xcf\xd8\x5\xaf\xbc\xfb\xb3\xcc\x18" +"\x6Q\xad\x15\xadI\x6;O\x1doP\xb1S\xfdHa\xb2\xc7\x42\xf5\xce\xc4\xee{\x17T\xcd\xdf" +"\x5\xd3\xfb\x30T\xdf\xf4o \xcb\xb5\xaf,]\x1e\x10\xee\x90}\xf6x\x7f\x64\x1c\xb7{\xc8" +"\xe8.\xb3\xfe\x66]\xdc\xc4\x8e\xc8+\xd0\x1b\xdeZ\xbd \x1e\xa9\x33\x63\xaa-\xf2\x44" +"M\x1f\x18\xae;\xe6T\x12\xa3\xaf\x64\xa2\x1eg\xb8\xd1\x46\xdf\xb1\x61|\xf9\xca\xc8" +"?\xefyaW\x12?\xeb\xe6\xd7\x1c\xcf\xe0\x96V\xb4\xc8z\xbb\xe2\x31\x15\x1x\x18\xfa\x6" +"_*kE\x99\xf1L\xef\"\x90\xe7\x1b\x9b\xe5\x1c\xb9\xeb\xd0\xc2\xf0^\xfcH\x81\xac\x13" +").jJ\xf7n\xd1L\xb4\xeao\xdc\xf0s?L%\x9e\xf5-r\xbc\x11\xc9\xa3\xe4\xc2\x90\xdf'\x10" +"\x98?j\xff\xac\xaf\x0W\xefV\xa5I\x8\x1b/t\xca\x7\xdf\x9a\x4\xd8\x85[\x1c\xaa\xeb" +"\x15\x95\xb1\x9Lc\xc9-\x18H+\x1a\xb3#\xdd)#fclj\xdb\x9c\x8\xc9\xcb \xa2\x99\xed\xf1" +"\xcf&\x9a\x61\xae\xc4R\xdb=\xd4\xa0W\xae\xbc\x7\x19\x14\xb2\x8c\xe4w\x1dH9\x17u|" +"S\xbe\xd2\x87\xea\xda\xb5\xa8\xb3$\xae\xe9\x81\xee\xf8\x8c\x18\xc1\x8a\x98\xe8\xd9" +"\x86H\xb0\x90zbP\x8b\x1e\x19\xea\xfaLg\xc9)\xde\xb2\xcc\x19\xee\xef=\xec?{\x91o\xc1" +"k0m\xb5\x39\x91\x1fv\xa6\xe8xq\xdf\xa4\x91\x84/x>(u\x85\x83\xfe$u\x92\x2.V\x15\x9d" +"\xd7n\xa0n\xaa\xad\xb9\x65\xbe\x83\x9d\x7f\x92\x63m\xf2\x98\x38\xcf\x32\xfd:\xfc" +"TY]\xcb*m\x4\xa7\x11X\xf4n\xcc\xda\xdb\xce\xf2\xdb\x8b\xa7\xc\x94\xa8\xd0\xfe\x9f" +"~\xab\xe0&*\xf4\x95\x89\x9e\xe\xef\x98i@\xa8\x41N^\xe3\x38+\xbe\xd1\x45M\xbh\x2\xb1" +"\xc7\xdb\xf2h\xeb\xd1\x82\x10\x82\xc5\xd8\xc7g\xc\x31\xba\x9c\x1d\x97%!V\x98\x44" +"\x1+\xab\x16\x9e\xbbu\xf5\x5\xed&S\xd7\xb2\xb9\xf5%\x8dNN2\xbe\xb9\xd5\xb7W\x92\xe0" +"\x91\xce\xcd\x8a\xc1\x11\x97\x32\x83\x42\xdb\x17\xaf>\xca\xa2\xffy\xb9\xf\x93\xf6" +"\xb5\xd2\xa9\xea\x18\x1b<{\x1\xbc\xe2\x8fh\xf6\xa6\xe9\"\x64NJ\x8c\x85\x39\xf6\xc0" +"\xbd}\xae\x91\xd5\x9b\xc9\xa9m\x93K*[m\xfb{\xd0\xc5\x91\x8\xec\xd2!\x10\xa3\xae\x0" +"\xa2K\x93\x16i80\xc0\xc7\xfa\xfe\xaeO\xe\xc0\x87\xb9x\x80\x64\xf0;\xf8\xc6;U\x8c" +"\x11\xbb\x18M\x90/\xd5\x43\x18k\xa0\xbc\x1f\xdf\xd6<7&gqz[\xde\xd4\x6o\xbc\x32\x91" +"2\xa2\xe1\x15\xe5\x30R=hv@\x8d\xfc\xc7\xe6|\x94\x65\x90\xf6\xc1+\xe5&xO\xed\x8ek" +"U\x6\x16\x17:_h\xba&\x18\x96[\x1a>\x6\xec\x99\xff`\x88\x8f\x5\x9dN_\xeaq\x8b\x80" +"\xb9\x93\xe3\xe7\xeb\xd7\x89#U\x7f\xd4\xb8\x1%\x9a\x0\x4\xf1t\xb8\xb\x14\x6o$3\xbc" +"\xe0y,\xa7>\xf4\\q5\xc3\xc,U\xa3\xaf\x9c:\x1c\xda\x8cs\x95_~\xe1\xd6!\xb5\xc4u\xa0" +"\xb6\xa6\x15\x9c\xb7\x96\x1d\xf7\x12\xd1\xed\x18\x35\xdf!\x89K\x9dPZW\xb3\xda\xff" +"\xf6\xcc\x9\x1dk\xc7\x33\xd7G\x2`E\x1c \xd3\xc6\xa5\x38J@`7\x9\x8f\xd4\xa0\x16\xb4" +"1\x4\xc5\n\x33@)\x10\x80\xc8\xef\x12\xc2/@\x8e\xc9x\x16\xc3\x80\xe2\r\x17\x9d\xea" +"\xbe\x32\xbe\x8pF6au\x17\x8e\xd2\xe2n\xaa\xc4\x2\xcb\x43lT_\xa1\x34\xd0\xbf\xf0\x11" +"M\x18\xad\x1dlT\x81\xc4\x34o+\x1d\x34\x15n@\xe5.\xd7\x30\xe9\xbb\x81\x9ai\xdd\xb3" +"\xbc\xdf\xec\xeb\xa9!h\x9c\xdd\xea\x1f\xc1\xdd\xd0\xcd|\xdd\x62S\x11\xe7\x91\x91" +"\x9\xf3\x42_z\xd4\x1f\xad]\x91\x45\xf6S\x98 \x91\xb8,\x16\xe0\xde\x8a\xb5\x0\x88" +"\xf6\x91sTM\x9e\x9\x8e\xa1\xc4\x97\xac\x46p\xc5u&\xaa\x83\xedJ`hf\xcf+\xad\xc\x97" +"\xd9\xbf\xb4\x30\xcf\xcb\x1f\xe3\x12\x96\xb7`\xc2T\xf4\xd5\x62\x14\xf1\xb9\xd3\x35" +"\xdb\xe8\x43\xdeu\xc6\x8c\x10Y\"\xcbGc\xf1\x9a\x5\xd8\x8agr\x6\xb4\xd9M\xdd\xb0\xf4" +"\x82\xe7\xe9\xcd\xc8\xf1\xfa\xc0[\xc6\xde=]\x6\xcf\x87'\x0\x8f\x43\xe3,Et\x3\x8a" +"\x9e \x85~\xd0\xaa\x39\x39\x95/'\xf0\x3\x44\xad\x36w\xb3j\x9c\x91\xcd\x42\xfe\xdd" +"\xea\xaa\x33]\x86\x66\xf3\xd7H\x6\xfaN\xd3\\\xc3\x9a\xce&\xa1-\x89\x18\xcc\xcc\x9" +"\xdc\xa0m^\x88+%\xc0\x89\xe3T\x9a\xe9)\x83\xbb\x1c\xa2\x8hI\x7\xf\x94\x84\x91\xe0" +"\xf4\x38?w\x96\x95\xc9\xa9iD\xc1\x45\x93\x82\xe5\x42\xa7\x1\xed\x9e\x43*\x85h\xf7" +"\xf3\xb8\x8f\xb5\xb5\xf0\x9b\x9e\xa2\xc6\xf4>:\x80%\x9e&\x89\xf9\xbc_Z\xa6#T\xb9" +"\xb7yL@!\xe6U\xe9\x8c\xb7\xb8\x93\xc3\r\x9f\xfa\x7f\xa6@\xadM\xde\xa0\x10\x65\xa4" +"\xc5\x1f\xd2\x84)\x90\xc2\xb0\xd7\xcc&\x8e\xd9\x98\x9dysS\x82(N\xab\xd0\xbeQ\xf0" +"\xb5_\x9f>\xce&\x83\x8e\xd6\xedNV\xd6\x64\x30\xa0\x34\xf3\x94\x87\xba\x90\xd0*\xaf" +"\x92\x8e\"\xaa\xf6\xf3\xd4-O\xadP\xa5\x62\xf5s\x84M\xd2!\xc8\xb0\xec\x15\x99\x10" +"\x8b\x10\x44\xde\xae<\xf5\x92\xe\xc9=\xf8\x37\xc8P!w\xee\xe7\xb9{\x11m\x94\xfb&\x93" +"\x14\x14G^\x9e\xe4\x97.\x95\xbf\xa4\xb4u\xf5\xcd\x99\xb2\x13\xbb\xddj\xf8\xf0\xd9" +"\xe8\x10\x81\xb3\xa6\x99\xa5\xc2,\x88\xa7\x9\x1dnQ\xcc\xef]\x14\x31\x9e\x11\xe1&" +"\xa0\x7f\xf0\x11g m\xe2\x90\xe1pn_1h\xf3\xf2%j\xd7K_Z\x8a\xf9v+\x89\x8c\xfc\xb\x12" +"(E5\x1f\x1e\x85+\x8c\xd9\xc5\x94\x9dly\x86\x95K\xf1\xd3\xd0\x8\xa3\xca\x90g\xdc\xae" +"Z%\x12\xfb\x9av\x9c\x39\x61\x66\x4\x9f\x9d\xfc\xb4\xf4o\x1a\xce\x9c+\x85h\xcb\x37" +"\x13\xff|\xd8gn\x82\x1a\xd6rH\xf8\x19\xd8\x1e\x87\x34\x90:vX\xd2\xe5)\x99\xcc\x35" +"s\xb7\x8a\xcd\x97O$\xf7\x1e\x35U\xd3J\xc5\x19Z\xad\xe9\xa9]\x9e\x98\x1d\xaf\xd5\x3" +"Pmws->\x17\xfd(\xa4\x9f)\x5\x98\x82\x38\xb\x66\xb7\xef\xc3V\\X\xdcl\xdfs\xad'%8\x9a" +"z\xe3\x83-<2\xb9\xd1\xa7\x9b\x90M\xe3\x9a\xe\xd4\x96\xc1\xe5\xe2\xab\xbfn\x86\xdb" +"l\x16\x1d\xad\xeb\xde\xdd\x5\x62\x90\x45\xb8:\x86\x88\x96\xe7\x31\x16~q\xf4\xcf\xeb" +"R\\l\xc0\xda\xd7ii\xb1\xef\x9e-\xa6\xa7\x88.\xe4\x99{\x91\xc4t\xdf\xe1\xa4\xe7\xef" +"\xc6\xb3\xcbMk\xf[\xfe\xe4T\xff\xc5\x41\xec\xf.+\x86\x9e\xce\xcd\xd1\x86" +"z\xe3I\xae\xaf\xe6\x35\x1d\xde\x9e\xa8\x17-\xbe_\xc9=H\xd6\x7f\x10q\xa2\xe5\xd6\xd0" +"\xc6/\n@\xb\n\xe5=zkf\xc8\x30\xf3XuL\x1bT\xf0\"\xf6\xff\x41\xdb\x95\x86X\xc9O\x16" +"|\xf4\x9\x66\xb1g\xdb\"\x89O\x93\xd5^\xc7\xfeU\xc1?\x1e\xda\\jv\x19\xa3\xbb\xa3\xd4" +"\xe6\xed\xc8\x96\x1e\x9d\xd7\xb9\xc\xa7\xf8\x16I8)\xa9\xef[%=\x1a\x9b]t\x1a\x9f\xd0" +"\xc1\xc7\x8e\xf0)\xd3H}\xf7\x8c)\xfd\xc5I$\xbd\x8c\xe3\xac\xb8'?b\x91'\xda\xdaXE" +"\xfc \x1bM\xa5'+\xb1\x39\x83L\x94\x88\xb2\x61\xaa\xf1\x8d\x9b\xebu\x96\x6G\x1X~\x9d" +"4\xba\xb6\xd9\xel\xa8\x9b\xe8M\x1\x8e\xf0\x84\xf5\xd4\xc1\xfd\xe6K\xe6\xce\xe0\xdb" +";\xbbY\xf6Z\x87\x1aG\xb3\xaaj\xb8\xa3\x4p\xd1\xb9\x32\xe2\x66\x38Pl\x90\xac\x37\x98" +"/uf\xd0K\x90\xc9\xcc \x98\xd1`]\xcc\xacv\xa7U#\x18O\x81\x8aZY=\xb4\x89t\xe2\x8cI" +"\x17\xf2V\x8e'\xa8HK\x3.hf\x7\x85zk\xdf.\x1e\xfc\x3k\xed\x8=\xe8\xfb\xfe\xe3\x5\x94" +"D\x96\xae\xfd\x9\r\xf1\xbf\xc9\xbc\xc7\x96\x89ln\xfb\xa6\x85\x15\x9|n \xf6+\xd1\x44" +"\xd5\x9a\xa2:&]\xdb\xe3\x95\xb0\x64\x18\x43\xbcg\nh1\xad\x33\xebvZ\xe0\x9c\x9c\xff" +"{\xbb\xb7\x9c\xeb\x91+\xd9\xb7\x42@D\xc0\xda\xe8\x36\x9f.NSPu\xc8nC\xf8\xe0\xa0Q" +"Hb\xfd\x35\x95\x38L5\xe8\xf0\x44\xea\xff\xceT\xae\x16.\xa6\xa4Y\x83j\x92NK\xc9\xd7" +",N$\xbf\xe8\x43\xcc!,i}\x91\xfa\x63\xd6 ,\xfd)\x8e\xb9PyC\x87)\xe7^\x81\x93+Qm\xf9" +"\r\xdb\x9c\x1a\xfd{eQm#\xf6\xd7\xfd\xef$?9w\xb6To7du\xcc\xd0\xd5\xf8T\xd8=e\xb8\xe3" +"\x5\nm\x8\x7f\xce\x65\x42i\xb3L\xba\x96\x95v\x84\x16\xf8m\x93\xe4\x39Ni+\x8e\xda" +"\xb1<\xf5s\x94\x1e\x95`\x3\xd1\xa1\xa0yV6'\x7`\xa3\xe3!?\x1d\x9b\xb7\xf0\x9b\xab" +"\x81<\x97\xdb\x8d\xab\x81\xc4\xd1h|_\n\xbc\xca\x8b\xa6_]D\xd7\x17\xe9\x8b\x7f\x88" +"\xc5\x61\x90L\x16UC\xb7\xfeL\x96\x9f\x17\xcf\xe9\xcd],\xd3L1L\xb6\xde\xb1\x93\x1f" +"\xd5w\x83\xb5\xd2\x9\xf8\x92\xae\xa0\x66\xe\x19\\sfN\xe4\x81\x88\x38\xe6N3\xa6\xcb" +"7k1a\xab\x9d\x44l\xf0\xd5L\xa7\xfeONx\xe2\xfa\xc0\xdd\x13^V\xd4%\xd7L0~\xbc\xdd\xbb" +"&[\xcc\xe5\xfa\xd5\xa2\xd4\xca\x97\xf5\xca,\xe9\xe5Y\xce\xff\xb4\xf7\xcdU\x12[\xe4" +"8\xe8\xb5\x15\xab\x2r5\x94\xfa\x33GI\x1\x36\xcbO\xdd[\xc2\xbd\xedpy\xb6\xbd\xcf|" +"\xf5K\x9d\xba\xf2\xcf*;\x99\x9f\xcb\x81YV\xe5y\xcdq\x3\xab&1\x9d\x30\x82\xb3\xed" +"i\x9e\x80H\xf0\xbb\xbe\xe1'\xf8\xc7\x4\xf2\x14\xa0\xa2\xb1\xb1Z\x10\x41X)\x9i(\x1b" +"\x89\x1\x82\x4n4\xf6\x44Z\x92\x84\xbe\x62\xfeL\xf4\x39\xc8\xb9\x63\x96\xe6\xa4\x8b" +"\xe6\x8f\x2\xbf\xe5X}\x10w\xd7\x94n\x91\x63\xe6\x86\x10\xa1\xe6\xa9\x1c\x37\x16`" +"5\x98\x45\xf1\x64\x92\xf4\x1;\xc4X\x9f\xd5v\xa3%\x0\xb0\x1\x99*\x99\xbe\xd7\x98Y" +"k\x9f\xea\xc5\xc6\xd0O\x1b#5'\xbd\x39\xc5\x61\xeby\xb5\x45T[\xaf\x16V\xde\x1uF\xb2" +"\xc6\xc5\x9b\xf5\x1\xb7P\xbc\x87\xb\x80\xd7uj\xdan\xd0\x98/O'\xa1\xda\xfa+\xb7?c" +"\x94@'\x9fZ^i\xbd\x10\xf3t\x88U\xc6\xe3\x1bh\x96\xb3\x14y\xd7\xfe\x92\"\x5\xb5\xc" +"C\xa5\x82\xe\x10$\xab\xfa\xc7\x9b\xf2 \x96\x86\xc\x1b\xee\x30o\x9b\xcf\xe5\x62\xc7" +"\xad{}\xc8!\x8dur\xf6\xe7\xeb\xf\x43\x16{/\x5U\xcbJ\xb6\xc7\x9b\x62\xf\xc9\xf0\x14" +"\xb7\x10y\xf8\xf0j\xde\x36U\xe8\xec\xa1\xf6|\xaf'\x86(S\xfb\xb7\xd0\xdc\xf9*\xae" +":\xb5\xa6\xe5\xf\xde\x64\x8:\xa7\r\x34\x8bx\x82'\xf6\x9e\x1c;\xd8\xb\xfc\xa9uMO\x8a" +"\xf\x1a\xf7\xe5q\x9e\x62\xfc\x36\xb\x30\x8d\xf9\xbc\xc\x91\x46\xc\x8am\xb7/{\xcb" +"\x89\x44\x14]\xcf\xc4,<\x1\x80\x19K\x3\x9b\xa5\xb7\x98\x92\xc5\x33\xa2\x9fi\xb4\x81" +"e\x8d\xbf\x64hG\x82\xe4\xd6\xd8\xf3\x37n\xb2\xf4\xc5\xb0\x14\xd3\x66\xcf\x1c\xb\xff" +"$\xbe\r\xc3\x6]W\x9c\x63\x19\x89\xc7\x94\xb5\x64j\xa2m\x9egV\x95\xa0\x98\xe0\xdf" +"u8M\x8\x6\xe7\x8b\xe8rl-\xa7\x15Q\xb7\x1f\x92kC\x93\xa0\x44\xa4\xf6\xe4\x6\x95\xc6" +"\x90\xfa\x14\x7f\x7f\x2\x42\xa1\x8f\x1a\xba_\x8f\x90_\xae\xe6\xeb`\xf3\xe7\x94;\xdf" +"\x8e\xad\x8c\xcb\xab\x99\xaa\xb3#\x8e\x89O\x96.#6\x86\xcb\xbb\x93n\x86i\xea\xa2!" +"=\x1c.7Z\x5\x37\x45K\x8b\x8e\xf5\xb0\x1f@[\x17\x90\x19\x9f\xb\xb9@\xe4R\x9f\x65\xea" +"\xc\x1foO?7\xaf\xbdoA\x8e\x30\x66\x14\xa3\xd0=\xd4\xd8w\x12\x7f\"\n\x33\x8f\x1as" +"?\x94U\x8a\xf\xbd.\xda\x91\xa9\xe2\x43\xba\x32~\xcd\xcbV97\xff\x30VZ\x9c\x32\xfd" +"\x88O\xdd}&N\x94\x92TG\x83\xae\xccm\x9f/\xd0W1\xb9\xe3\xc%#\xfdX({d\xd0{].\xd6\x32" +"\x9e\xb6^\xd0\xecVoA\xd7\xf4\x94\xa0\xf1\xee\x7f\x98!\xe1\x9b\xc0\xae\xa3\xfb\x1a" +"\x87\x8a\x16`\x8a\xf7y\xe4\xc8\xc4\x9f'F\x94\x87$w\xdey\xd8\xc1\x39\xb5\xd1\xd0\x32" +"+\x8\xc6\xf8\xce\x1b\x92\x35p`(\xf8\xea\xf3Rn\x80\xa2\xb0!\xc7\xe8\x8c\xb7\xf8\x11" +"J\xa0<\xf8\xb7\xa0\xa2\xa6\xf5u\xf6\xb3\x7fh\xc3\xdf\x43-!z\xa0\x86\xf7\xb9|O\xf9" +"\xdc\xbf\x98y\x6]\xb\xfe\x8a\x8b\xa2:\xe6!\xcaw\xc8Z\x1d\xb4\x0\xb0\x19Q\x85~\x8e" +"A\xec\x65\x4\xd4\x19s\xf4\x87\xd4\xc1\x65\xf1\xca\xd3\xe9\x36M-:U\x9e\x8\xa9\xe7" +"\xa8\xdd\x9a\x1f\x85\xf9\xa5{\xf0)B\x18\x97\x9\\\xf3\x61\xd1\xd8\xf4\x8]a\x85U\xe0" +"-C\x17\xf3%z\x88\x2\xb1\xcc\x17\xd4\xac\xbc\xf3\x8c\xc4\xa1s\xa9\xad\x86O\xdc\xb3" +"J \xd4P\xf0!d\xac\x84\xa6\xc8T\xa1;\x9f\x13\xf3\xf\xe7l6J\xdd\x8fX\x1f\x86i\xc0Y" +"~\xf\x94\x11\xe9\xc8\xf0\xb8\xe2\xf1\xe5 \xe0\xf0\xf5\xc(\xfc\x88:U\r]\xa4\x61\xf8" +"\xe5;K\xa4\x92\xa7\xc8T}\x14\x65\x97\x88\xd3\x46\xee\xe2\xf8=\xf0\xa6\xa2J\xaf\xaa" +"\x2L&[\x1\x8eXJL\xa5\xb0\xb0^\x9e\x8\x41\x13]\x4n(A\xe4M\xc9\x87=\x5\x1c\x66\xfb" +"\xba)g[\x80\xce\x1a\x85\xc0\xd5T\xe6\x1\x8e}\x86sc\xe4\xe1o\xf2\xd2\x83t\xcf\xad" +"V(oU\xef\xf0V^\x88\xdc\x66K\xfe\x9c\xdb\xfaV\xc3\xf1\xbf<\x9cYd\xc2\x63\xcc\x42@" +"\x83\xc2\xba\x9b\x15kB\xd5w'\xd3\x8b\x9e\xe2S\xf3\x94y\x9e\xb0\xb6\x13\x1c\x9b\x33" +"\xb6M\x3\x33^G\xf8@\xac\x8e\x1\r\xf1.\xe5Rxh\xa7\xc2\xef\xde\\\x0\x45\x10?g\x92\x83" +"6\x8a\x8e\x8}e4<\x1f\xf8\x13\xde\xee\x96\xca\xf6\x9f\xba\xeaW\xb9\x8e\xaf\x0\xb\xd6|X\xce]\x1e\xa6\x3\x1\x99\xa4>\x86" +"\xc4\x1`\xd2Oj0\xd4Z&\xff\xb3\x9\x6\xa9\xa8\xe/\xa2?\xe\xceL\xb6>;\x1a\xa9\x94\xcf" +"i\x89\x33[\xafl\xbd\xe3\x81\xbe\xbdY\xb2\xebjVE\xa2\xe5~\x88\x8b\xe\xa2_\x1c\x8e" +"\x92\x44\xbd\x2S\x0\xcaj_\x6\x1a\x92\xc0\xad\xc7\xd6\x0\xb4\xe9\xdd\xcf\x97~\x83" +"I!m~\xd3\xcf\x88)\x1fZ\xd1qxf\xb$\xbd\x15RK\x8c\x7\x32M9H\xc8mu\xeas\x1`Q\xba\xb5" +"\x6\x95Sw,\x14\xa1\xc9\xb2<\xd4\x34L\xdf\xfb\x8d\xce\x1e\xaax\xa9\x14\x64,\xe9/\x5" +"\x99\xd8Gf\xeb\x92\xf\x1eY\xe6I17C)\x82\x61\xc\x84\xd1&l\xc1k\xc\x89\x99/\xde\x8a" +"\xf2\xf8pLB\xd6\x8e\x19\x13?\xa9\xc5)\x9\xe9\x91j7\xff\xee\x33p\x98oC\xc9\xbb)\xdb" +"\xf5\x9d\xab \x7\x96\xf7\x61\xb2\xb9g\x99\xe4\x98\xbe\x1b\x86\x8fm\xd4\xdd.\xf3\xa2" +"\x94\xfe\xc7\x7\xdaU\xceY\xdc\xae]\xa7\x84\xad\xffU\xfd\xde~#\xd1\xfd\xc4\x1fsS\x2" +"F~t2\xc0\x32\x45\x89\xbd\xca\x1d\x9eT!(F w\xeaTZ\x9\xec-,\xc5T\xd0\rw\x8f\xa2\x9c" +"\xc2~\x8bv\xbeKtvJ\x1d\xb7=\x82\x9f\x39\xf0S\xe\xe0\x32u;y\x8d=lW\xe5\xe8\x90\xe4" +"y*L}CO\x84\xfa)\xd3\x9a\"\xch\x91\x36k\xf6\x14\x12\x7f@p\xd3@!+_\x15\xff\xa1\x14" +"\x9c\x1?\xb8\xce\x17\xc2ih\xcc+3J$\xc8\xff$\xc0\x39\xb3\x61\x98\x1b\x15\x9bL\xc8" +"\xeaJ:zt\x9b\xf1\x9a\xe3\x30=7?UlM\xf6\xbam\xaeP\xad\xee(\xa7\xc5\xfa\x16J\xb9\x39" +"\"\xf8u\x89\xc4\x18\x1\x8d\xe9T\xbc'\x1a\x43j\xe7\xa3\xd8\xf8\x80 P\x18\xf8L\xa0" +"\xe3G\x1d:\xd7\xc8\x1b\x19\x61\x15\x42\xe3\x44}\xc\x1\xa3\xf0\xb7\xfa\x89\x8e*5\n" +"\xa8:t.\xaam\xe2\x33\xcav\xd9\x8e]\xea*E\x9am\xb1\xea\xd8\xd2\xc\x93\x98\x46\x8b" +"P\xfd\xa3]%\xeb|\x10\xae\xfc\xce):\xfb\x8b\xe2\xda?\xeb\xc5\xf6\xfa\x8e\x0\xb3\x94" +"\xc4\xa7\x8di\xfe\x43\xbOw\xf6\xe1-\xab!\xa1\x91#\x9d\xe0\xd2\x66\x35\x43Y\x9ek\xdb" +"3\x94\xd5\x8b\xd0`\x1d\x88yOv\xa1>\x9c\xeaW\xcf\xfc\xce\x19\xc4\x14\x42\x99\xd7Q" +"*{|RC \x93Z'I\xf3\xe9\x9a\xa5\xed+\xab\xf6\xb1\xcf\xd9\x83\x36\x7f\x62\x32\xd6\xe7" +"\xe8i\xef\xf1+}\x83\xfb*\x6? hF\xd0^\xf\xbf\xf9\xc0\x89\x46\xb7\x43\xff\x90\xdbR" +"\x14\x5\x63\xdd\x92\x64\x33\xdc\xac\xc3\xf8\x9a\xa9\xab\x1f\x8c\x2\xd0u\xd1\\\x8e" +"\xe1\xc7\xc9\x37\xed\x82\x37\x85q\x7fP\xfd\xf7%\x19\xcb\x90\x87\xc5\x86\xef\xff\x8" +"\xeb\xb1\x61K\x17\x38\xd2\x93\x15\x96Xm\xa4\xc5\xc\xb7\x8dm\n\xc8\x1f~\x9\xd4\xb" +"Z\xdf_5\xc3\xe1\xdav\x15\xb8\xe4\xe8\xe5\xd7\x1al\x86\\\xc\x36\xc8\x35\xc6\x1b\x4" +"\x94\x8e\x96\x42`\xffxb3{\xb4\xa2u\x7\x33\r\x1e\xe9\xc6\x45\xc5_Hr\x97\x84/\xa2\x9e" +"\x8bnRj\xd0\xbd\x1\xc8G! \xc2\x9eL\xae\x19\xab\x5\x43Qi3\xbf\x15\x9\x15\xe2@\xfb" +"\xb9r\x83\xdd\x1cX\xbcQ\xe2_\xde\xde`F\xf5\x37\xd5R\xec\xf1z\xd2\x8b\xf4\x84\n`\xfc" +":\xee\x18\xc5\x8d\xee\xfb,\x1\xfc\xf6'\xa3{b\x96\x33G\xc5Ua\xa9\x9d\x9\x1a\"\x1e" +"P\x81k:z\xf\xba\xbd\xdc\xe0\x16\xa2v%v\xff\x8a(*X\"\x81\xae\x6iX\x1a\x8d\x9d\xd3" +"K%C\x8;\x82\xa8l\xb1\xb2\xc7\xc6\xb7(\xd6:\xdc\x82\xe7,\xab\x87\x87q\xc1\xd3\x88" +"GW\xba\xf6k\x80\x7\x30\xa6\xc3\x1c;\x10\x91\xc1\x19W\x99s\xc5\xbe\x7\xb4O\xc1\xf" +"C*\xc7\xb3\xda\x94\xff\xd1!\xe0\xf2\xd6\x94\xcd\xdb\xd1\x80g)\x10;\xe8\xca\xbc\xce" +"6\x10\xff\xcf\x9a\x11w=ci\xa8\x9\x94\x34\x95#\"9\xa4\x1b\x8a\xa6+\x2\xf0\xea\xd4" +"4\x86\xb0\x31P\x4\x91\xf3\xe\"\xfe\x2,o\xa0^\xf2\xc9\xb1.\x14\xd7\x8w\xf\xbe\x13" +"\x9b\x8d\x83:\x91\xaaHlQI\xc6\xfe\xb1\x64G\x9an<\xf9[\x8e\xa0\xdd\xcc\x17\x5\x37" +"\xf4\xa6\xcd\xaaky\x94\xff\x8b\x2\xdc\x92\x30\xea\xe1\x1a\x87?\xb8<\xb5\x15Y&\xa2" +"5\xff\x81[.e\xcc\xa3\xac\x1d\xc4*\xcd\xd2\xda~]\x9e\xde\x43\x93\xae\x1\xe2\xca~p" +"\xa2&Nrs\xb1\x9f\x90\xc1\x35\x65o\xee\xf5\x84\x1e{\xb2\xb9m\x8a\xc4N\xc9\xed\\<\x11" +"l\xe0\x0\x8c\xc1\xe4\x99l\x8d\xe2\xbc\xa3w?r\x1a\x5\x9e\xc9\xfbw\xc6S\xae\xb6\x64" +"\xfd\x9f\x4m\xc0\xfa!!\x9\xc8K;\x96\xa7\xf4\xcfY,\x1b\x42<\x1c\x65\xc1\xc\xa1" +"\x5o\xcak\x2K3;_\xb8\xd5+io\xcf\x87\xa2\x31O\xe\x8rT\x5\xcdWu\xc4L\xc3\x8d\xe9\x39" +"a@\xe\x81\xfdX\xb6%\xf7H\x81\xe8\xea\xdc\x33\x31\xf9\x16\x9c\x11\xdc+V\x1\xff\xf" +"\x91\n\xf5@\xcaP\xfb\xc9\x44\xa0\x9dW;\xb0w\x8P0\xd1\x1d\xf2\xac\xd5\xc1\xae&\xd4" +"53\xa0\xe1\xa0\xcb%O\xaf\xbc\xa0\x14\x1dt\x1\xa8-\x6\x14\x96\xd5\x32\x37\x35\x45" +"\xe9\x11L4\x13\x3\x43\xa3\xce~\xa3\xfc;\xe0\x2s\xfe.\xeb\xe0,5\x82\xa9\x7\xfa\xee" +"b7@\xc6\x0\x66\xf1 \xa1\x95\x1\xb5\n\xbc\xe1$\x8b\xf2\xdeY\xcc)k\xd8\xd6\x9a\xe3" +"R\x8a\xfe\xbb\xe\xf6\xacpGj\xf6i\x8a\xe\xbd\xa8\x81\xa8|Z(n}\xb1\xa4\xe3\xc4\x82" +".Tb|Q\x83z\xab\x65\x97\xec\xcco(G|fs\xe5\xcf\x36=\xa2\x80\x1dS\x3\x8f\x1\xfb\x10" +"\xb7\xe5\xb8\x83\xe4\xf7X\x1fJ\xceG0\x8a\x38\xa6\xaa%:\x1d\xae\xe5i\xe8\x3\x0\x87" +"\x17w\xb8L\xf3:\xba\xe7\xc4\x8d\x91\x92\xb3R\x93\xc0\x6\xe4\xc1\xc8]}\xe3~\xf8\x7" +"A\x98\xf6\x9b\xa4\xc4i\xafH\xe5\xdd^S\xef\xaeG\xc0>\x98U\xa1\xc2\x17T;\x10\xee^G" +"Q\xfc\x9d\xb0\xb#k\x15q\xfc\x0\xa0\xf7\x12\xcb!!b'\xc2\x91hB3\x98\xe4\x83\x8fu\x1" +"i\x1c\x4%\xa7[\xaf\xa3\xd9\x1d\x32\xd0\xf6\xb7\xbb\x98Q\xbd\xd3=\x81waa\xf6\xeb\xc3" +"b\xf2?\x7\x8c\x37M\x84\x16\x3\xee\xe9^\xfd\r W\x7\xe\xae,B\xdds\xfdx\xe9\xbei}+\x9" +"\xbb\xa8\x37\xd0#\xb8\xbb\x94\xf6\xbf\x8b\x89\xee\xc8\x91K\x82\">\xf7M\xe9I\xd5\xe3" +"\xe0RY\xa7\x90\xff#\xeetu\xce&\x96\x18\xc7'\x1b\xb6\x66X\x97\xa4\x6\x41\xd1\xe0\xdb" +"\x93\xbdj-\x87\xec\xddL\xe2\xfa\x17\xe5\xf+\xff{\x14\x62\x11\x81\xfb+\x86;\xd5\xdb" +":\x9b\x39:\xac\x1a~\xd6\x95\x99\xb1\xd6\x36\x1c\xd4G\x11\xe8\xa2\xba\xf1\xev\x9c" +"\xc1\xd8\x7f~\xd3\xbcT\xd3\x42/;\xc9\xae\x9aV\x9a\x91\xbcI\x99\x82\xb2\xce\xd2\xd6" +"\x84\xe7\xccy\x17\x63\xe4\xc8t\xfbo#n\xc_!LED\xb1%\xbaUC0MO\xf7\xb3\xfa/\xbc\x30" +"\x2\xc4\xe8\x30\xfc\xd9\xabV\xe4\xf3\xc7\xb8\x61r\xc6\xff.{\x9e\xa1\x8c\x63\xb9\x82" +"\xba\x8c\x11o\xe3\x91\x15\x9W\x10\x33\xf5\x98(\xd9\x38&\x13]\x88\xd8\xabst\xe4\x85" +"\xe9\x82q,\xe5\xdc\x88\x63\x35\n}\x9d\xf4g\xd2\x6\xbb(\xd5\xfa\xcf\xf2\x8d\x7\xa8" +"\xa7`\xf1|\xfb\x62LH\x90\xbb\xf7q;\xc4\x8aY\xb\xf0\x44\x1an\xe5(\xfb\x5\x82|\xc2" +"\x9c\x0g\xf5\x46\xf1\xe2\xfe!\xe1\xd9\x80\x8f\x2\x83\x89z\xae\xf7\xba\xeb\xae\x81" +"\xce\xa9\xf5\xc7X\xf0\x0\x10\x86\rK;m\x10\xc4\x44?\x98-\xd4Wc4\x97\xda\xcb\xd5\xb2" +"\xa3@\xaf%`\x97\xcd\x2\x44\xfb\x36\xdd\x8c\xdf\xa3\xac\x86\x86\x44K\x80\xdfv\x86" +"F\x9b\xf6\xb7\xbd\xacv\x16\xaa^\xa7\x7\x36\xe0\xb3\xc2\x9d\xbev&\xe9\xc1x\xfa\x9d" +"\xef\xa2S\xd2]\x95/\x8\x9c\x6-#l#N\\WN\xf1\x9b *\x8a\xb4\xa5@\x8cY\xadg|H\xd6\xc8" +"\xb4\x11\xd7 \xd4\x65\xf1O\xa6\xaf%\xbb,\xc2\x85\x9\x9f^\x4\xbb\xcf\xce\xff\x1\xb4" +"\x7f\xa3>K8\x1c\x31?\x80p\xa0N-W\xe2\xc1\xe\x93\xc3\xb2\n\xed{l\x0\xb8\x65#\x94\x94" +"2V\x92k\xe5 \x87\x1a\x1b\xc8\xe0(1\xa0\xf\xa1\x90gx\xabj\r\xf7{\xes\x18\n(\x98\\" +"C1a\x19\xd1\xe4\xbd\x65\x8e\x9em\x14\x85~\xb1\x83=\xd2\x97;>}DO\"\xec\x89\x32\x80" +"\x80T[\xb7\xe\xaf\xddJ\xe2\x9cO\x14\xc\x15\xde\x91\xc\"\xc\x98\x8d>y\xe9\x13\x1d" +"\x9\xe1\x14.=h\x96\x30\x88\xd2\xb9\xca\x5\xd6\xdc*\x19\"\xd8\x17\x35\x16\xd8\x80" +"Ar\x8d\xba_\xa4\xd3\x14\xad\xf8\xfc\x1a\x80\xe1\xb8\x80\x44=\xac\x8b\xac\xd5\x65" +"\xcf\xaa-\xc1\xcaNA\x80\x44\x65;q\x4\x34\x1\xf0~\xd2\x10\x93\xc7\xca!6\xc7Q\xf2\x63" +"\xfcyf\x18\xfd\x8e\x65\xc9O\xe0{;OM\x89\xc6\x4w\x2-=r\xfd\xd8\x8b\x9e+\xa9\xb5\xca" +"\xdbJ\xe5\xb5\x84\xc3\x11K\xbe\xb2\xd0\x2\x45\x33\xe5\xe5\xb3}\x81\xd7\xc0\x5\xe8" +"R\x18\xcf\xe4\x95\x16\x30\xf3\xd0\xa0\x81\x39K6\x92k\x93\x94\xba[y7E2NQN/i\xe8y\x94" +"7\xfb\x6\x94\x8d\xa3\xft\xd9\x8b\x89\xad\x93\x61\xf1\x1d\x80\xa0<).\xb7^3\x93\xa7" +"\xb9\x19X\xfb\xf\xf1\xfc\x32z\x8aX\xe2\xe\x3\xa8\xcd\x30\xa0i\x6\x83\xce\xa5\xce" +"\xf1h\xca\xef\x1bu\x1d\xd2\xe4\x4\x5\xa5\x18\xa0kWl\xc3\xe2\xc0\xf8\x16N\xc3\x1a" +"b~\xa7\xf1\xed\xe0*\xb5\xa4\xd5\xf9\x7\x8d\xeL\x98p\xae\x9a\x90\xe6R\xeIm\xa6\xe" +"\x8bG\xf8\xf3s-\xdf\xe8\xb\x8f\xe3|\xff\xdb\x98>@j\x99t\xf9\xd6\x66]\xf5\x16\x0\xb1" +"&T\xcc\xec\xe1\xdb\xa5N\xd0\x8a\xbd\xfb\xec-\x82#\xe0u`s\x9d\ri\xba(\x9c\xef\xc5" +"6\x89zB\x1eh\x7\x12\x1c\xef\x82\x88\xb0\x8c\xb6\xe2T\n\xa9\xab\x42\xf1\xbf\xee\xd8" +"\x81\x80\x7\xd0\xde\xf5\x89\xc6\x11\x80\x1a\xf7\x87\xc\xa5\x85\x9a\xbbP^\x6\xd4Y" +"Y|\xd2\xbbN\xfc\xa6\x85\x61\x9b\xab\xf3*D\xbel\x9c\xea\x1a\x1eY\x5\xdf\x12)N9\x8c" +"kX7\x98\x9f\xac\xb5\xb4\x34!\x87\xab\x66\x19\xc\x8a \xff\x12\xc7V\xbf\xa2\xbf@`8" +"\x8$\x85\x12\xb5\xe3#\xbb\x96\xfd\"\x9d\xc5\xa5\xa2G\x8c\x46\xf1\xd5\xab\xf8\xad" +"v\xb3\xea\xb4\x9cjc\xe\x8dJ(\xeb\x62\xe3\xa0\xbe)#b+\xbd\xc3\xde\xdd;\xbe\x6\x42" +"-\x1c\x7]\x84\xed\xa2\xd6\xef\xa4\x1b\xae\x1c\xcf\x96\x44\xc6\x8f\x85#L\x9a\xe0\x6" +"\x8e.\xe5\xc7\xe7\xbez\x86\xa3\xc4\xcdk\xd2\xdf\xae\x8eR\xad\x43R_\x16Y\x17\x86\xb4" +"\xa9\xa5\xc9\xdf\xc8\x9d\x86\xde\xb5\xd3\xe1\xbf\xf3\x12*\x9a\x9d\x95\x34\xc7\xbf" +"\xfe\x16\xad\xe9\x92\x9bVX\xff\xbe\x10\xeb\xf6oz=gZ\xf5Z\xab\x18n\xbe\x89\x11$#B" +"\xfb\xba\x8f'\x84\xc7\x80\xbc\xdb\xb2\xfa\xdb\xe8\x1b\x1b\\\xd9/\xf4'\xe9\x66\xef" +"\x13\xfc\x8a\xd1\x66\xdb\xef\x1f\x12\x8d?7\x7\x81#\x8f\x98\xcc\xa3\x42N\xf9\x7\xee" +"\xaa\x42\xa2\x9a\xf5\x35\xbdPB\x89\"\x95z\xe1\x83M\xb4\xb0\xb\xe5\xf7\xb8\x43\x8b" +"\x8d\xe9\xc6\\\xb9\xfb\r\x89?y\xf3\x9b\x16\xfb\xe7\xc6w\xb\xf6Li\x88l\x2\x2\xb9\xcd" +"\xa7\x12\x8c[C\x7f\x1b\x80L\x9f\xcc\xe7\xc0\xc8\xae\xb6\xc0\x1d\xd7\x93\xe8\x37=" +"\x2\x1e~\xb8\x10\xf8\xe9\xfX\xff\x1\x5\xb4$\xe2G\xe1|\xb3\xa9\x7f\x2\x66\x0\x19\x9d" +"w\xfd\xec\x94\x8f\x1\\\xe8\xe3\xf7\x93Y3\x14\x63\xf1\xc9\xcaV\xf5\xc7\x12 GP\xf6" +"\x85\xb0\xdc\xe\x41'\xd7R\xb3= =1\x90\xee\x92\xa3}\xab\xdb\x44L\xe9" +"8\xbd\xdex?b\x3\xf0\x32\xd3\xc1\x8e\x84\xde\xfa^$\x14G (\xcdZ\xd2\xa4rH\xba\xaa*" +"m\xdb\x81#\xdf\xea\x8c)4\xd5\xf7\x46\xf7,+\x19\xf7\xd2\xc5\xd1\xc9\x6\xd0\xf3\xa8" +"_*\xdf\xf8\x16\xd6V\x19\x44\xb8\xa8?ANC\xd2\xf9\xac\xb3\x0\xadu\xa1V\xa6\x87\x42" +"\x8c\x45\x8bS\xa2$\xc\x9n\xa1$\xfd\xa5\x1dX\xbd\xa5\x41\x5\x1c\x9d\xd4\xab\xb4;1" +"\xa7\xa2\xbd\x92J@\x95\xca\xcfi\x7f\x61\x12\xce\x82\xe6|\xf0\x96\xa3\x7f:\x9f\xfa" +"\xd9\x62\x90\x10_\xf2\xdd\xd0\x12\x0R\x94\xf6\xfd\xf5\x9d\x9b\xcf\xef\x84\x85\xaf" +"\xe9'\x9dV\xe0\xb\x31\xef\x12*\xc1\x15\xb0\xe9\x98s\x8d\x8e\x39\x98\x85[\xca\xa5" +"\xb\x92\x1b\x65Z(\xa0\xe1[vr7?\x99LT\xd4\xec\xd1\xf9\x46\xa8\xd7\xb6v!\x87\xad\x11" +"\x6\x37\xd4\x8c\x63^432\x98\x82\xc8\x9cu\xb3\xd9\xe?5yD\xb3\xb\x3\xee\x84\x88\xef" +"-f\xfe\xfe\xeb`\xd2\xa4\x0\x98rT\xa6\x83\xc1?\x81\xcdY\xec\xf0\x31\xa4\\n^\xb8\xef" +"Q\xa2\x46X\x9fg\xb5\xfc\xef )p\xd5\x84\x45\x1aR\xf6\x9\xb\xfa\x42\xce\xbf\xcc\xc0" +"\xbb\xb0(\r\"\xa2\xe5\x38\xfc\x8c\xf\x43G\xd3\x9a\x4\xfa\xb9\xe0:\xed\x94\x91\x11" +"\x1f\xa3\x99\x34\x15-Z\xad\xe2r\x91s\x11\x39x\xbfG\x8f\r\xb9|E?\xf5L\xaas\xf7\x9b" +"B3,HH.\xf4\x93\xca\x61\xd0\xbf\xb5\x1c>\xfc\x9c\xd5r\xd6oX\x1e\xefl\xc4\xca\x1>b" +"\xce\xa2\x8bn\xda\xa4\x1f\x10\xbc~\x95\x38X\x10\xf5\xe8\xe5\xb0\xb2+\x19t\x6M\x85" +"\x94\x1e%|\x87MP\xb3\xc4\x86<\xb{\xbb\x91\x65&\xa7\xcb\x9a\x82\xe7\x10Q(P8O+\xfG" +"\x1e\xfc\x83\xa4(\xbb\x2+I\xe5\x12\xce\xb3\x84lK\xdc\x15\xdb\x1a\xe\xe0wKy\xc\xb6" +"\".\x10\xfa|\xb7.\x17 \xf8\x3\xb3&\xf8\xb6\x4\xc9_zj\xcf\x2\x84\x32\xa9\x4\x89\xa9" +"\xd0\xb4\x93u\xd0\xac\x94\x12\x84;\x82\xc9\n\x94\x66\x81\x15\x16\x18\x88w\x9c\x31" +"\n\x7f\xb0\x17\xa5\xca\xa2\x8an\xe9\x90\x8Y7\xc5\xc4\x82I;\x1b\xd3\xbf#\xd4\x87q" +">\xc4Rjh\xd0<\x11\x88\xa1-&\xf7\xd1V\xf8Q\xc1\xc2\xa3\xd6$.\xa9vc=\x8d\xb8|\xa7\xe6" +"\xffX\x1a\xe9\xb9\xed\xf5\xe6\x98\x34t\x90\xe5\xe2\x87\xe9\xf2>\xeiG\xdc\x87\xa9" +"\xf7\xb\xeb\xa1\xdf\xaa\xa1\xd6\x98\xf9\x62\xa6\x32\xd1O5>\xcd\xe6>\xc2ZNE\xe5\x9c" +"\xb7\x1e\x62\x18\x1aMl<\xec\x7\xb1\xfdn7\xe9Q41\xe0\xa1\xd6\xb6\x33\xcf*\x7f\x8a" +"\xb1'\x8a\xcd\x87\xc5u\xa8\x18\xa5-\xd4\xf5\x8a\xbb\xa1l_\x1d\xeb\xe1\x9c\x1cQ|d" +"[\xbf\xe5\xb6\xc1\xc3\xd4!W}7v\xc0\xb7Z6\xb9|\x1e$\xc6$\x0\x64\x81\x81\x95j\x86Q" +"\x2\x0\xd8\x1dSV\xb4j8\xb4Kx\xb\xc5O2\xbe\x1eU\xe2\x84\xc7\x1f,|U\xd2\x8d\r\x66%" +"0C\xd7n\x8f\xb1 8\xac\xa0\x93\xd1\x39^.e\xdf\xa6\x65\xea\xd7U\x9\xd4m\x93\xd0<_\n" +"\x8d\xbd\xef \xf2t-s\xb0\x35\xd7\xdb{X\xe2\x98Xl\x1f\x13\xdb\x81oS\x1\x1eMY\xd1)" +"\x83\x96y%\xf?e\xd3\x64V\x91wJ\x1c\xc8\xe8\xfe\xae\x4\x66\x80\x9e\x34\xc6)fo\x6\xa0" +"\xcc\x99qW\xc5\xc8\x7f\x85\xe3\x61\x93\xcd\xda\x42\xf1}\x1a\xec\xe2\x9c\x42\xc3\xd1" +"\x9e\xd0\x63\xc4\x1eH\x5\xcdND\xc\x8a\x13P\xddI\x19\x33\x8e\xbdV\xddi?\x16\xee\xaf" +"\xb8\x12\xc8>\xaa\x98\x0\xadU\xa6\x93\x93\x89\xe7\xf2\xac\xa8\xda\x36%'\x1b\xf0\xb5" +"7\xe5\x17\xce\xc3\xae\x17\x66\xf2\x9e}\x1a\xd7\xfe#\xaf|\xe0\xb1&\xbf\x34\xc1L\xfe" +"b\xf8\xec\r\x9c\xcdJ\xc8hx\xc9\xd4\xa1\xc6\xcd]\x91\x19\xb3\xae\xb5\x33\x63\x98\xce" +"\x4\x89>a\xe8\xd4\xd9\xa3\x43\x93 X'!\x83wE\xd2\"\xdd\x7f\xb5\xc5\xbco\x1f\x1\x98" +"\xbf\xd5\xden\x10\xda\x63\xba\x8btO\x84\xc5K,\xf5K>\xb1\x97lc\xb3\xb4\xc\x66\xeb" +"\xb8\x8f\x92~\x19\x84 \x7\xe9Hp\xbaGOd\x89\x9d@.g\xcd_\xfd\x34%\x45w\xe1\xd5\xcb" +"P\xdc,\x4\x9a-*[\x10Wr\x83\xcf\xa9\x8\x32\xeb\x6\x61\xec;7\x1f\xe7\xce\xcf'\xd5z" +"\xb4-\xe5s\x11\x7lR\x81_B\xa4\xccV\xd9\xb4l}\xf8\xc1\xeb\x14\x84\xe0(\x4\x39r<\xd9" +"\xcd\xa4\x80\x9f<\xef\x1fjo\x6\x35y\xeb\x8f\x12\xfc\x32N\x8a\x39\x6s:\x92\x96l\x99" +"\x0\x7f\x45\x97\xad\xe1\xe7\x41\xb0,\xac\xef\xae\xfbtt\xd8\xa4PW\xa4m\xab\xb2\xe6" +"f?\xf0;\x3\x80\xaf\xec\x7f\x34_\x90T\x1d\xdc}\x89\xb8&m\x1dRvV\xf2\x66\xf0/;g\x3" +"\xa3\x6/e=Cq\xc0m\xa8\xf8]naA\xde\xb6\xc4\x8{Ne?\xa7+.|[\xfa\xediI~\xdb\x92Sm\x9e" +"\xc9\xf3\xbf\xf\x34\x92\x8\xe7s\x9c\xb1\xac\xa7\x8\xa3*Z\xc7\xa9\x9b\xa0?\xcb\x8" +"\xaa`Y+\xc8\xb2=\x17\xb\xb3\xa7L\xce\xc7\x1\x1e\x64\xc9\x9d\x11\x18\xe5<\x83I5\xad" +"'\x15=\x17\xff\x8c\x1f\x43N?\xf2M\x3\x18\xb8I\x18\x32\x61\x99\xaa\xcd\x62rK\x10W" +"\xd9\x1c\x66(\xad\x42\x63\xa8X\xa4o\n\x1e\x84.x\xa3\x16~\x13\x91\x43\xfb\xe\xda\xcc" +"d4\x84\x2\x7j\x80\x3\x63\xba\xed)\xbe_\n\xf6\xfe\x14\nj\xe5\xeH~#\xfe\xe8\xb5\xea" +"\x9f\xa9\x16\xb1\x8f\x89\xc\xca\xca\x45\xc9ho\xd4\xaf^f\x8c]\x10'4\xce\xd7\xc5\x8b" +"\xby\x6\x66\x15>;T\xfc\xd9\xab+\x1c+\x11#)>\xa2\xdfMu=}\x87\xbe\x81,uj\x9e\xeb\xfd" +"\xd9\xa5,.\xc0Yk\x4\xd4\x99=\xcb\x87wq\x1em\x9\xa3\xf7\xd1\xa6\xe7g\x97z\x8eX\xe4" +"\xbb\xc1\xac\xb0\x34Lu\xf7\x19\x1b\x8bh\x9b\xf1\x95\xce\xd6\xd4\xdf\x1b\x89\x44\x8" +"\xf5;6A\xde\x10\x8av\x3t\xa3u\xd0J*\xcbG\xb7\x8a\xd5&V\xc8\x9e\x85\x1f\xfd\xde\x61" +"D\x9c\xe7\xac\xa8\xe8\nQl\x95\x94\xb7\xc1\xc0\xeb}gk\xb0\x81\xf5\xf0!h\x1c\x1@/\x8a" +"R\x1fV\xe8\xc0\xf\xdf\xde\xc\x61\xbd\x19\x42 \x9c\xb9\xaau\xeg\xab\xa1\xf3m\xcb\xc2" +"\x95\x3k\xb8\x99 [\xdbs6\x18\xf0\x31}\xb8\xfe\x1f\x81\xab\x41\xfe\xab\x1\x8b\x19" +"\xdb\x35\xbf\xb6\x92\x88\xf1\x9fK\x9\xb1\xa2\xfe-s\xb2\x92\x8e\xc9\xc1\xc5\x30\xdc" +"\xed\xcb(\x80\xdf\x1f\x3.\xce\xcbu\xec\xcbI\xf0\x81\x12\x9d\xed\xb9\xa6U\xee\xa3" +"\xe9\x8a_\xa2\xb4\x37U\x88\x18\xfb\xf0^\x9a\x84\x8a:\xfd\x44r\x90\x1d\xb1{\xdd\xc4" +"\xc0\xb3\x39\x1e\x12\x9eQ0\xe3\x99\n\x17\xe4\x8c\x8a\xd5\xe1\xae\xa5\xbb$\xe4\xaf" +"\x97@Tw^\xaeR\xd8Y\xe4\xbb\x6\x98^;\xed\x4GU\xd0\x11\x31/\x9f\x14\x46\xe4\xa9\x91" +"x_N\x9f+\xc7\x14\x38L\x98\xfe\xe7\x8@X\xf9\xd5\xdaMy\xa0\xa5\xfd\xcf\x9\x98\x87\xad" +"\xa2\x2\r\x92I[\xcc\xefj\xc7\x37\xfi\xa9\xd4+\xaf\xda\x90(\xbd\x0+q\xc6\xd0\xe1J" +"\x14\x1aRsSoc\xafq2\x9d\x87|%\xc4\xe9T~\x12\xa1\x36\xc5\xa0]RD\xd1\x46\xae\xd3\x5" +"\xa5\x8c\x41/\x19=\x9aT\x3\xa0\xdb\xe9\x15\x41\x41\x46\x1f\xbdV\x16\xab\xa8\x1c\x18" +"j-\xed\x30~\xe1\x66@{\xc3:u\x8d\xb\x10\x7\xda\x8e\xc3\xa0\xa6\xb1\x7f\xa3u\xady\x97" +"CI\x9a\x61\xa4\x1f\x9d\x98\x90\xe2\xe6\xe5\x9a\x8b\xb7\xb3r\xe6\x13\x1\x43\x1f\xfc" +"\x11\xd2\x80\xf1\xd5sZYIDzs\xd7#\x8co\xbe\xb0\x42\x84\x34q\xeav\xb4\xa2\\\x16t\xe1" +"m\x1d\xdc\xd6\xf2\x92\x93M\xcct\xbb\x3\x0\xee\xca\xb1\xfb\x92\xfbt\x91\xcc\x64\x88" +"\xb9\x97u\xc8\x8d\x8f\xe6\x15I|v8w\x86\xbas\xbf-bm!\x0\xd5x\x8e\x8d\x30\xe5K\x9b" +"\x9f\x96?\xa9h\xe6\x93\x9a\xd4\xb(\xb2gA|S\xb0\xc3\xe2{\xb3,u@\x93]\xb1\xc3\x64tkU\xf9\xac\xf7\xca" +"k\x9e\xc3Z\xc3$\x8d\x42\xa8\xcfQ\xa1\xd8\xf9\x33\x19i\x8b\x92\xffq~\x11\x17\xf0\xe0" +"r`P\x92\xdbG\x0\xab\xab~\xf4\x89\xbf\xc3^\xc6\x8a\xd6=\x95\xfa\x16\xb6\xa2\xf0\x18" +">\\;[\x1b\xdd\xba\x31\xe6\x4\x82&z[\xf2\xde$DR\xfd\x8\xd7\xd9\x2\x9c\xf\x42\x9ev" +"\xd5\xc4\xd6\xc8R\xf8\xedw\x1d\x8a\xc6\xbf&\x7f\xf0\x98lf\xb9?\xd6\x1c\x81\xb\x9" +"\x1c\xa8PX\xad\x63\xa9\x8e\x86O\xc2J%\xaa\xff\x38\x93\x46\xbe\x38\x64\x42x\xf4\xbb" +"\xdb\xbN!!_Q\xad\xb\x1c@\x8\xd8\xf1[`\xeb/\xc1\x7\x88>$\xe4Q\x1f\x9e\xef\xba\x9c" +"\xd1m\xae~ExD\x3\xb7\xc6\x9c`\xc7IM\xc0#\xaaV'\xb1r\x8e\x81\x95\xcb\x1b\xde\x34\xf8" +"\xfd!\xa0\x91\x4\x64\x66]\xca\xa5|\x82vgq\x9e\xd0|#@\xee\xf\xbe!\xf5\x98\x13\x80" +"\xcb\x82\xd7q@\xf7\x2T\x92\xa7\xde\x8\x0\xcd\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30" +"000000000000000000000000000000000000000000000000000000000000\r000000000000000000" +"0000000000000000000000000000000000000000000000\r00000000000000000000000000000000" +"00000000000000000000000000000000\r0000000000000000000000000000000000000000000000" +"000000000000000000\r000000000000000000000000000000000000000000000000000000000000" +"0000\r0000000000000000000000000000000000000000000000000000000000000000\r00000000" +"00000000000000000000000000000000000000000000000000000000\r0000000000000000000000" +"000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n019023l_afm_len = 32114; +char* n019023l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusSanL-ReguIt" +"al\nFullName Nimbus Sans L Regular Italic\nFamilyName Nimbus Sans L\nWeight Regu" +"lar\nItalicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -151\nUnderlineThi" +"ckness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Devel" +"opment\nEncodingScheme AdobeStandardEncoding\nFontBBox -178 -284 1108 953\nCapHe" +"ight 729\nXHeight 524\nDescender -213\nAscender 729\nStartCharMetrics 316\nC 32 " +"; WX 278 ; N space ; B 213 0 213 0 ;\nC 33 ; WX 278 ; N exclam ; B 124 0 363 729" +" ;\nC 34 ; WX 355 ; N quotedbl ; B 177 464 455 709 ;\nC 35 ; WX 556 ; N numbersi" +"gn ; B 54 -20 649 697 ;\nC 36 ; WX 556 ; N dollar ; B 69 -126 613 770 ;\nC 37 ; " +"WX 889 ; N percent ; B 134 -20 895 709 ;\nC 38 ; WX 667 ; N ampersand ; B 83 -23" +" 644 709 ;\nC 39 ; WX 222 ; N quoteright ; B 166 477 309 708 ;\nC 40 ; WX 333 ; " +"N parenleft ; B 113 -213 446 729 ;\nC 41 ; WX 333 ; N parenright ; B -7 -213 325" +" 729 ;\nC 42 ; WX 389 ; N asterisk ; B 169 438 471 729 ;\nC 43 ; WX 584 ; N plus" +" ; B 92 -11 591 473 ;\nC 44 ; WX 278 ; N comma ; B 55 -150 214 103 ;\nC 45 ; WX " +"333 ; N hyphen ; B 97 240 351 312 ;\nC 46 ; WX 278 ; N period ; B 87 0 213 103 ;" +"\nC 47 ; WX 278 ; N slash ; B -12 -20 434 729 ;\nC 48 ; WX 556 ; N zero ; B 98 -" +"23 598 709 ;\nC 49 ; WX 556 ; N one ; B 208 0 498 709 ;\nC 50 ; WX 556 ; N two ;" +" B 34 0 620 709 ;\nC 51 ; WX 556 ; N three ; B 71 -23 599 709 ;\nC 52 ; WX 556 ;" +" N four ; B 63 0 573 709 ;\nC 53 ; WX 556 ; N five ; B 70 -23 629 709 ;\nC 54 ; " +"WX 556 ; N six ; B 93 -23 611 709 ;\nC 55 ; WX 556 ; N seven ; B 137 0 671 709 ;" +"\nC 56 ; WX 556 ; N eight ; B 74 -23 604 709 ;\nC 57 ; WX 556 ; N nine ; B 83 -2" +"3 599 709 ;\nC 58 ; WX 278 ; N colon ; B 110 0 326 524 ;\nC 59 ; WX 278 ; N semi" +"colon ; B 78 -150 325 524 ;\nC 60 ; WX 584 ; N less ; B 87 -9 635 474 ;\nC 61 ; " +"WX 584 ; N equal ; B 74 111 609 355 ;\nC 62 ; WX 584 ; N greater ; B 48 -9 596 4" +"74 ;\nC 63 ; WX 556 ; N question ; B 184 0 630 741 ;\nC 64 ; WX 1015 ; N at ; B " +"80 -142 1036 741 ;\nC 65 ; WX 667 ; N A ; B 17 0 653 729 ;\nC 66 ; WX 667 ; N B " +"; B 79 0 711 729 ;\nC 67 ; WX 722 ; N C ; B 112 -23 770 741 ;\nC 68 ; WX 722 ; N" +" D ; B 89 0 759 729 ;\nC 69 ; WX 667 ; N E ; B 90 0 751 729 ;\nC 70 ; WX 611 ; N" +" F ; B 90 0 734 729 ;\nC 71 ; WX 778 ; N G ; B 109 -23 809 741 ;\nC 72 ; WX 722 " +"; N H ; B 83 0 799 729 ;\nC 73 ; WX 278 ; N I ; B 100 0 349 729 ;\nC 74 ; WX 500" +" ; N J ; B 47 -23 581 729 ;\nC 75 ; WX 667 ; N K ; B 79 0 813 729 ;\nC 76 ; WX 5" +"56 ; N L ; B 80 0 551 729 ;\nC 77 ; WX 833 ; N M ; B 75 0 916 729 ;\nC 78 ; WX 7" +"22 ; N N ; B 76 0 801 729 ;\nC 79 ; WX 778 ; N O ; B 104 -23 828 741 ;\nC 80 ; W" +"X 667 ; N P ; B 91 0 733 729 ;\nC 81 ; WX 778 ; N Q ; B 104 -59 828 741 ;\nC 82 " +"; WX 722 ; N R ; B 93 0 770 729 ;\nC 83 ; WX 667 ; N S ; B 89 -23 714 741 ;\nC 8" +"4 ; WX 611 ; N T ; B 158 0 748 729 ;\nC 85 ; WX 722 ; N U ; B 124 -23 800 729 ;\n" +"C 86 ; WX 667 ; N V ; B 185 0 800 729 ;\nC 87 ; WX 944 ; N W ; B 177 0 1084 729 " +";\nC 88 ; WX 667 ; N X ; B 22 0 794 729 ;\nC 89 ; WX 667 ; N Y ; B 168 0 816 729" +" ;\nC 90 ; WX 611 ; N Z ; B 28 0 737 729 ;\nC 91 ; WX 278 ; N bracketleft ; B 19" +" -213 405 729 ;\nC 92 ; WX 278 ; N backslash ; B 147 -20 280 729 ;\nC 93 ; WX 27" +"8 ; N bracketright ; B -23 -213 364 729 ;\nC 94 ; WX 469 ; N asciicircum ; B 115" +" 329 496 709 ;\nC 95 ; WX 556 ; N underscore ; B -59 -176 551 -126 ;\nC 96 ; WX " +"222 ; N quoteleft ; B 163 477 308 709 ;\nC 97 ; WX 556 ; N a ; B 65 -23 568 539 " +";\nC 98 ; WX 556 ; N b ; B 54 -23 588 729 ;\nC 99 ; WX 500 ; N c ; B 76 -23 554 " +"539 ;\nC 100 ; WX 556 ; N d ; B 73 -23 650 729 ;\nC 101 ; WX 556 ; N e ; B 84 -2" +"3 580 539 ;\nC 102 ; WX 278 ; N f ; B 89 0 413 732 ;\nC 103 ; WX 556 ; N g ; B 3" +"2 -218 601 539 ;\nC 104 ; WX 556 ; N h ; B 70 0 574 729 ;\nC 105 ; WX 222 ; N i " +"; B 66 0 305 729 ;\nC 106 ; WX 222 ; N j ; B -65 -218 308 729 ;\nC 107 ; WX 500 " +"; N k ; B 58 0 584 729 ;\nC 108 ; WX 222 ; N l ; B 68 0 307 729 ;\nC 109 ; WX 83" +"3 ; N m ; B 71 0 852 539 ;\nC 110 ; WX 556 ; N n ; B 70 0 574 539 ;\nC 111 ; WX " +"556 ; N o ; B 80 -23 576 539 ;\nC 112 ; WX 556 ; N p ; B 7 -213 586 539 ;\nC 113" +" ; WX 556 ; N q ; B 71 -213 607 539 ;\nC 114 ; WX 333 ; N r ; B 69 0 436 539 ;\n" +"C 115 ; WX 500 ; N s ; B 61 -23 520 539 ;\nC 116 ; WX 278 ; N t ; B 97 -23 366 6" +"68 ;\nC 117 ; WX 556 ; N u ; B 88 -23 594 524 ;\nC 118 ; WX 500 ; N v ; B 122 0 " +"598 524 ;\nC 119 ; WX 722 ; N w ; B 118 0 820 524 ;\nC 120 ; WX 500 ; N x ; B 17" +" 0 583 524 ;\nC 121 ; WX 500 ; N y ; B 8 -218 590 524 ;\nC 122 ; WX 500 ; N z ; " +"B 31 0 557 524 ;\nC 123 ; WX 334 ; N braceleft ; B 91 -213 431 729 ;\nC 124 ; WX" +" 260 ; N bar ; B 54 -212 315 729 ;\nC 125 ; WX 334 ; N braceright ; B -16 -213 3" +"24 729 ;\nC 126 ; WX 584 ; N asciitilde ; B 137 268 594 438 ;\nC 161 ; WX 333 ; " +"N exclamdown ; B 76 -205 317 524 ;\nC 162 ; WX 556 ; N cent ; B 96 -120 585 628 " +";\nC 163 ; WX 556 ; N sterling ; B 44 -23 628 729 ;\nC 164 ; WX 167 ; N fraction" +" ; B -178 -20 486 709 ;\nC 165 ; WX 556 ; N yen ; B 100 0 696 709 ;\nC 166 ; WX " +"556 ; N florin ; B -32 -212 696 738 ;\nC 167 ; WX 556 ; N section ; B 63 -213 58" +"9 729 ;\nC 168 ; WX 556 ; N currency ; B 110 133 593 556 ;\nC 169 ; WX 191 ; N q" +"uotesingle ; B 173 464 292 709 ;\nC 170 ; WX 333 ; N quotedblleft ; B 146 477 44" +"9 709 ;\nC 171 ; WX 556 ; N guillemotleft ; B 147 106 548 438 ;\nC 172 ; WX 333 " +"; N guilsinglleft ; B 140 106 336 438 ;\nC 173 ; WX 333 ; N guilsinglright ; B 1" +"09 106 307 438 ;\nC 174 ; WX 500 ; N fi ; B 83 0 591 732 ;\nC 175 ; WX 500 ; N f" +"l ; B 88 0 585 732 ;\nC 177 ; WX 556 ; N endash ; B 46 240 628 312 ;\nC 178 ; WX" +" 556 ; N dagger ; B 127 -177 620 709 ;\nC 179 ; WX 556 ; N daggerdbl ; B 51 -177" +" 620 709 ;\nC 180 ; WX 278 ; N periodcentered ; B 166 192 293 295 ;\nC 182 ; WX " +"537 ; N paragraph ; B 145 -178 677 729 ;\nC 183 ; WX 350 ; N bullet ; B 120 220 " +"376 470 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 37 -128 180 103 ;\nC 185 ; WX 3" +"33 ; N quotedblbase ; B 20 -128 322 103 ;\nC 186 ; WX 333 ; N quotedblright ; B " +"150 477 452 708 ;\nC 187 ; WX 556 ; N guillemotright ; B 121 106 518 438 ;\nC 18" +"8 ; WX 1000 ; N ellipsis ; B 115 0 907 103 ;\nC 189 ; WX 1000 ; N perthousand ; " +"B 93 -20 1024 738 ;\nC 191 ; WX 611 ; N questiondown ; B 86 -217 531 524 ;\nC 19" +"3 ; WX 333 ; N grave ; B 179 592 357 740 ;\nC 194 ; WX 333 ; N acute ; B 218 592" +" 458 740 ;\nC 195 ; WX 333 ; N circumflex ; B 146 591 433 741 ;\nC 196 ; WX 333 " +"; N tilde ; B 130 611 471 719 ;\nC 197 ; WX 333 ; N macron ; B 160 627 450 696 ;" +"\nC 198 ; WX 333 ; N breve ; B 165 594 471 729 ;\nC 199 ; WX 333 ; N dotaccent ;" +" B 244 612 370 715 ;\nC 200 ; WX 333 ; N dieresis ; B 159 612 446 715 ;\nC 202 ;" +" WX 333 ; N ring ; B 216 579 396 754 ;\nC 203 ; WX 333 ; N cedilla ; B 1 -214 26" +"4 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 91 590 505 740 ;\nC 206 ; WX 333 ; N " +"ogonek ; B 35 -205 246 0 ;\nC 207 ; WX 333 ; N caron ; B 176 592 463 740 ;\nC 20" +"8 ; WX 1000 ; N emdash ; B 42 240 1068 312 ;\nC 225 ; WX 1000 ; N AE ; B 11 0 10" +"87 729 ;\nC 227 ; WX 370 ; N ordfeminine ; B 107 303 441 742 ;\nC 232 ; WX 556 ;" +" N Lslash ; B 75 0 570 729 ;\nC 233 ; WX 778 ; N Oslash ; B 32 -24 867 741 ;\nC " +"234 ; WX 1000 ; N OE ; B 101 -23 1108 741 ;\nC 235 ; WX 365 ; N ordmasculine ; B" +" 114 303 452 742 ;\nC 241 ; WX 889 ; N ae ; B 59 -23 915 539 ;\nC 245 ; WX 278 ;" +" N dotlessi ; B 94 0 290 527 ;\nC 248 ; WX 222 ; N lslash ; B 62 0 312 729 ;\nC " +"249 ; WX 611 ; N oslash ; B 19 -30 639 541 ;\nC 250 ; WX 944 ; N oe ; B 85 -23 9" +"66 539 ;\nC 251 ; WX 611 ; N germandbls ; B 126 -23 655 729 ;\nC -1 ; WX 722 ; N" +" Udieresis ; B 124 -23 800 914 ;\nC -1 ; WX 722 ; N Uacute ; B 124 -23 800 939 ;" +"\nC -1 ; WX 667 ; N Scedilla ; B 89 -214 714 741 ;\nC -1 ; WX 611 ; N Tcaron ; B" +" 158 0 748 939 ;\nC -1 ; WX 667 ; N Scaron ; B 89 -23 714 939 ;\nC -1 ; WX 722 ;" +" N Rcaron ; B 93 0 770 939 ;\nC -1 ; WX 722 ; N Racute ; B 93 0 770 939 ;\nC -1 " +"; WX 667 ; N Sacute ; B 89 -23 714 939 ;\nC -1 ; WX 778 ; N Otilde ; B 104 -23 8" +"28 918 ;\nC -1 ; WX 556 ; N ucircumflex ; B 88 -23 594 741 ;\nC -1 ; WX 778 ; N " +"Ohungarumlaut ; B 104 -23 841 939 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 124 -23" +" 806 939 ;\nC -1 ; WX 667 ; N Yacute ; B 168 0 816 939 ;\nC -1 ; WX 722 ; N Eth " +"; B 89 0 759 729 ;\nC -1 ; WX 722 ; N Dcroat ; B 89 0 759 729 ;\nC -1 ; WX 611 ;" +" N Zacute ; B 28 0 737 939 ;\nC -1 ; WX 722 ; N Uring ; B 124 -23 800 953 ;\nC -" +"1 ; WX 556 ; N gbreve ; B 32 -218 601 729 ;\nC -1 ; WX 556 ; N eogonek ; B 84 -2" +"05 580 539 ;\nC -1 ; WX 556 ; N edotaccent ; B 84 -23 580 715 ;\nC -1 ; WX 556 ;" +" N ecaron ; B 84 -23 580 740 ;\nC -1 ; WX 722 ; N Ugrave ; B 124 -23 800 939 ;\n" +"C -1 ; WX 667 ; N Thorn ; B 91 0 708 729 ;\nC -1 ; WX 556 ; N eacute ; B 84 -23 " +"580 740 ;\nC -1 ; WX 556 ; N edieresis ; B 84 -23 580 715 ;\nC -1 ; WX 650 ; N d" +"caron ; B 73 -23 810 729 ;\nC -1 ; WX 500 ; N ccedilla ; B 76 -214 554 539 ;\nC " +"-1 ; WX 500 ; N ccaron ; B 76 -23 563 740 ;\nC -1 ; WX 500 ; N cacute ; B 76 -23" +" 575 740 ;\nC -1 ; WX 556 ; N aogonek ; B 65 -205 571 539 ;\nC -1 ; WX 556 ; N a" +"ring ; B 65 -23 568 754 ;\nC -1 ; WX 556 ; N atilde ; B 65 -23 583 719 ;\nC -1 ;" +" WX 556 ; N abreve ; B 65 -23 582 729 ;\nC -1 ; WX 556 ; N egrave ; B 84 -23 580" +" 740 ;\nC -1 ; WX 556 ; N agrave ; B 65 -23 568 740 ;\nC -1 ; WX 556 ; N aacute " +"; B 65 -23 570 740 ;\nC -1 ; WX 556 ; N adieresis ; B 65 -23 568 715 ;\nC -1 ; W" +"X 722 ; N Uogonek ; B 124 -205 800 729 ;\nC -1 ; WX 556 ; N ugrave ; B 88 -23 59" +"4 740 ;\nC -1 ; WX 556 ; N uacute ; B 88 -23 594 740 ;\nC -1 ; WX 556 ; N udiere" +"sis ; B 88 -23 594 715 ;\nC -1 ; WX 319 ; N tcaron ; B 97 -23 492 801 ;\nC -1 ; " +"WX 500 ; N scommaaccent ; B 61 -284 520 539 ;\nC -1 ; WX 611 ; N Zcaron ; B 28 0" +" 737 939 ;\nC -1 ; WX 556 ; N ecircumflex ; B 84 -23 580 741 ;\nC -1 ; WX 722 ; " +"N Ucircumflex ; B 124 -23 800 940 ;\nC -1 ; WX 556 ; N acircumflex ; B 65 -23 56" +"8 741 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 28 0 737 914 ;\nC -1 ; WX 500 ; N scar" +"on ; B 61 -23 547 740 ;\nC -1 ; WX 667 ; N Amacron ; B 17 0 663 895 ;\nC -1 ; WX" +" 500 ; N sacute ; B 61 -23 545 740 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 158 -28" +"4 748 729 ;\nC -1 ; WX 667 ; N Ydieresis ; B 168 0 816 914 ;\nC -1 ; WX 556 ; N " +"thorn ; B 7 -213 586 729 ;\nC -1 ; WX 667 ; N Emacron ; B 90 0 751 895 ;\nC -1 ;" +" WX 778 ; N Ograve ; B 104 -23 828 939 ;\nC -1 ; WX 778 ; N Oacute ; B 104 -23 8" +"28 939 ;\nC -1 ; WX 778 ; N Odieresis ; B 104 -23 828 914 ;\nC -1 ; WX 722 ; N N" +"tilde ; B 76 0 801 918 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 801 939 ;\nC -1 ; WX" +" 722 ; N Nacute ; B 76 0 801 939 ;\nC -1 ; WX 556 ; N Lcaron ; B 80 0 551 729 ;\n" +"C -1 ; WX 556 ; N Lacute ; B 80 0 551 939 ;\nC -1 ; WX 278 ; N Idotaccent ; B 10" +"0 0 389 914 ;\nC -1 ; WX 333 ; N racute ; B 69 0 498 740 ;\nC -1 ; WX 278 ; N Ic" +"ircumflex ; B 100 0 454 940 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 80 -23 683 74" +"0 ;\nC -1 ; WX 556 ; N otilde ; B 80 -23 583 719 ;\nC -1 ; WX 556 ; N Euro ; B 1" +"2 -22 636 709 ;\nC -1 ; WX 556 ; N ocircumflex ; B 80 -23 576 741 ;\nC -1 ; WX 3" +"90 ; N onesuperior ; B 205 284 393 709 ;\nC -1 ; WX 390 ; N twosuperior ; B 100 " +"284 468 709 ;\nC -1 ; WX 390 ; N threesuperior ; B 123 270 455 709 ;\nC -1 ; WX " +"278 ; N Igrave ; B 100 0 378 939 ;\nC -1 ; WX 278 ; N Iacute ; B 100 0 479 939 ;" +"\nC -1 ; WX 278 ; N Imacron ; B 100 0 458 895 ;\nC -1 ; WX 278 ; N Iogonek ; B 2" +"8 -205 349 729 ;\nC -1 ; WX 278 ; N Idieresis ; B 100 0 467 907 ;\nC -1 ; WX 778" +" ; N Gbreve ; B 109 -23 809 928 ;\nC -1 ; WX 722 ; N Umacron ; B 124 -23 800 895" +" ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 79 -284 813 729 ;\nC -1 ; WX 556 ; N ogra" +"ve ; B 80 -23 576 740 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 89 -284 714 741 ;\nC" +" -1 ; WX 667 ; N Eogonek ; B 90 -205 751 729 ;\nC -1 ; WX 556 ; N oacute ; B 80 " +"-23 576 740 ;\nC -1 ; WX 667 ; N Edotaccent ; B 90 0 751 914 ;\nC -1 ; WX 222 ; " +"N iogonek ; B 0 -205 305 729 ;\nC -1 ; WX 527 ; N gcommaaccent ; B 3 -218 572 81" +"3 ;\nC -1 ; WX 556 ; N odieresis ; B 80 -23 576 715 ;\nC -1 ; WX 556 ; N ntilde " +"; B 70 0 589 719 ;\nC -1 ; WX 556 ; N ncaron ; B 70 0 578 740 ;\nC -1 ; WX 667 ;" +" N Ecaron ; B 90 0 751 939 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 90 0 751 940 ;\n" +"C -1 ; WX 500 ; N scedilla ; B 61 -214 521 539 ;\nC -1 ; WX 333 ; N rcaron ; B 6" +"9 0 486 740 ;\nC -1 ; WX 667 ; N Egrave ; B 90 0 751 939 ;\nC -1 ; WX 667 ; N Ea" +"cute ; B 90 0 751 939 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 109 -284 809 741 ;\n" +"C -1 ; WX 722 ; N Rcommaaccent ; B 93 -284 770 729 ;\nC -1 ; WX 667 ; N Edieresi" +"s ; B 90 0 751 914 ;\nC -1 ; WX 556 ; N nacute ; B 70 0 580 740 ;\nC -1 ; WX 556" +" ; N uogonek ; B 88 -205 594 524 ;\nC -1 ; WX 556 ; N umacron ; B 88 -23 594 696" +" ;\nC -1 ; WX 722 ; N Dcaron ; B 89 0 759 939 ;\nC -1 ; WX 307 ; N lcaron ; B 68" +" 0 467 729 ;\nC -1 ; WX 722 ; N Ccaron ; B 112 -23 770 939 ;\nC -1 ; WX 722 ; N " +"Cacute ; B 112 -23 770 939 ;\nC -1 ; WX 722 ; N Ccedilla ; B 112 -214 770 741 ;\n" +"C -1 ; WX 606 ; N degree ; B 291 383 594 686 ;\nC -1 ; WX 667 ; N Aogonek ; B 17" +" -205 663 729 ;\nC -1 ; WX 584 ; N minus ; B 81 197 601 269 ;\nC -1 ; WX 584 ; N" +" multiply ; B 113 34 568 427 ;\nC -1 ; WX 584 ; N divide ; B 92 0 591 462 ;\nC -" +"1 ; WX 667 ; N Aring ; B 17 0 653 953 ;\nC -1 ; WX 1000 ; N trademark ; B 208 29" +"2 1096 729 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 5 -284 436 539 ;\nC -1 ; WX 222" +" ; N lacute ; B 68 0 463 939 ;\nC -1 ; WX 556 ; N omacron ; B 80 -23 576 696 ;\n" +"C -1 ; WX 667 ; N Atilde ; B 17 0 680 918 ;\nC -1 ; WX 278 ; N icircumflex ; B 9" +"4 0 406 741 ;\nC -1 ; WX 278 ; N igrave ; B 94 0 330 740 ;\nC -1 ; WX 556 ; N nc" +"ommaaccent ; B 70 -284 574 539 ;\nC -1 ; WX 222 ; N lcommaaccent ; B -1 -284 307" +" 729 ;\nC -1 ; WX 584 ; N plusminus ; B 50 0 625 633 ;\nC -1 ; WX 947 ; N onehal" +"f ; B 202 -20 965 709 ;\nC -1 ; WX 947 ; N onequarter ; B 205 -20 938 709 ;\nC -" +"1 ; WX 947 ; N threequarters ; B 123 -20 938 709 ;\nC -1 ; WX 278 ; N iacute ; B" +" 94 0 431 740 ;\nC -1 ; WX 667 ; N Abreve ; B 17 0 683 928 ;\nC -1 ; WX 500 ; N " +"kcommaaccent ; B 58 -284 584 729 ;\nC -1 ; WX 778 ; N Omacron ; B 104 -23 828 89" +"5 ;\nC -1 ; WX 222 ; N imacron ; B 66 0 373 696 ;\nC -1 ; WX 556 ; N emacron ; B" +" 84 -23 580 696 ;\nC -1 ; WX 556 ; N amacron ; B 65 -23 568 696 ;\nC -1 ; WX 278" +" ; N tcommaaccent ; B 55 -284 366 668 ;\nC -1 ; WX 500 ; N ydieresis ; B 8 -218 " +"590 715 ;\nC -1 ; WX 500 ; N zdotaccent ; B 31 0 557 715 ;\nC -1 ; WX 500 ; N zc" +"aron ; B 31 0 557 740 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 557 740 ;\nC -1 ; WX " +"500 ; N yacute ; B 8 -218 590 740 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 88 -23 " +"683 740 ;\nC -1 ; WX 556 ; N eth ; B 80 -23 576 743 ;\nC -1 ; WX 556 ; N uring ;" +" B 88 -23 594 754 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 104 -23 828 940 ;\nC -1 ;" +" WX 333 ; N commaaccent ; B 57 -284 205 -60 ;\nC -1 ; WX 737 ; N copyright ; B 5" +"5 -22 836 742 ;\nC -1 ; WX 737 ; N registered ; B 55 -22 836 742 ;\nC -1 ; WX 66" +"7 ; N Acircumflex ; B 17 0 653 940 ;\nC -1 ; WX 278 ; N idieresis ; B 94 0 419 7" +"08 ;\nC -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ;\nC -1 ; WX 712 ; N Delta ; B " +"10 0 701 729 ;\nC -1 ; WX 584 ; N notequal ; B 74 2 609 480 ;\nC -1 ; WX 542 ; N" +" radical ; B 102 -36 705 913 ;\nC -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ;\nC -" +"1 ; WX 667 ; N Aacute ; B 17 0 667 939 ;\nC -1 ; WX 584 ; N lessequal ; B 45 0 6" +"59 584 ;\nC -1 ; WX 584 ; N greaterequal ; B 56 0 626 584 ;\nC -1 ; WX 584 ; N l" +"ogicalnot ; B 99 86 619 377 ;\nC -1 ; WX 711 ; N summation ; B -18 -97 760 762 ;" +"\nC -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaac" +"cent ; B 76 -284 801 729 ;\nC -1 ; WX 556 ; N dcroat ; B 73 -23 695 729 ;\nC -1 " +"; WX 260 ; N brokenbar ; B 54 -212 315 729 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B" +" 80 -284 551 729 ;\nC -1 ; WX 667 ; N Adieresis ; B 17 0 662 914 ;\nC -1 ; WX 55" +"6 ; N mu ; B 18 -220 593 524 ;\nC -1 ; WX 278 ; N .notdef ; B 213 0 213 0 ;\nEnd" +"CharMetrics\nStartKernData\nStartKernPairs 998\nKPX A C -41\nKPX A Ccedilla -41\n" +"KPX A G -41\nKPX A O -37\nKPX A Odieresis -37\nKPX A Q -38\nKPX A T -103\nKPX A " +"U -42\nKPX A Uacute -42\nKPX A Ucircumflex -42\nKPX A Udieresis -42\nKPX A Ugrav" +"e -42\nKPX A V -81\nKPX A W -57\nKPX A Y -104\nKPX A a -16\nKPX A b -5\nKPX A c " +"-16\nKPX A ccedilla -16\nKPX A comma -4\nKPX A d -14\nKPX A e -22\nKPX A g -17\n" +"KPX A guillemotleft -51\nKPX A guilsinglleft -47\nKPX A hyphen -8\nKPX A o -19\n" +"KPX A period -2\nKPX A q -15\nKPX A quotedblright -60\nKPX A quoteright -68\nKPX" +" A t -22\nKPX A u -18\nKPX A v -40\nKPX A w -29\nKPX A y -44\nKPX Aacute C -42\n" +"KPX Aacute G -42\nKPX Aacute O -38\nKPX Aacute Q -39\nKPX Aacute T -103\nKPX Aac" +"ute U -43\nKPX Aacute V -81\nKPX Aacute W -57\nKPX Aacute Y -104\nKPX Aacute a -" +"16\nKPX Aacute b -6\nKPX Aacute c -17\nKPX Aacute comma -4\nKPX Aacute d -15\nKP" +"X Aacute e -23\nKPX Aacute g -17\nKPX Aacute guillemotleft -51\nKPX Aacute guils" +"inglleft -48\nKPX Aacute hyphen -9\nKPX Aacute o -20\nKPX Aacute period -3\nKPX " +"Aacute q -16\nKPX Aacute quoteright -68\nKPX Aacute t -23\nKPX Aacute u -20\nKPX" +" Aacute v -40\nKPX Aacute w -29\nKPX Aacute y -44\nKPX Acircumflex C -41\nKPX Ac" +"ircumflex G -41\nKPX Acircumflex O -37\nKPX Acircumflex Q -38\nKPX Acircumflex T" +" -103\nKPX Acircumflex U -42\nKPX Acircumflex V -81\nKPX Acircumflex W -57\nKPX " +"Acircumflex Y -104\nKPX Acircumflex comma -4\nKPX Acircumflex period -2\nKPX Adi" +"eresis C -42\nKPX Adieresis G -41\nKPX Adieresis O -38\nKPX Adieresis Q -39\nKPX" +" Adieresis T -103\nKPX Adieresis U -43\nKPX Adieresis V -81\nKPX Adieresis W -57" +"\nKPX Adieresis Y -104\nKPX Adieresis a -16\nKPX Adieresis b -5\nKPX Adieresis c" +" -17\nKPX Adieresis comma -4\nKPX Adieresis d -14\nKPX Adieresis g -17\nKPX Adie" +"resis guillemotleft -51\nKPX Adieresis guilsinglleft -48\nKPX Adieresis hyphen -" +"8\nKPX Adieresis o -19\nKPX Adieresis period -3\nKPX Adieresis q -15\nKPX Adiere" +"sis quotedblright -60\nKPX Adieresis quoteright -68\nKPX Adieresis t -22\nKPX Ad" +"ieresis u -19\nKPX Adieresis v -40\nKPX Adieresis w -29\nKPX Adieresis y -44\nKP" +"X Agrave C -41\nKPX Agrave G -41\nKPX Agrave O -37\nKPX Agrave Q -38\nKPX Agrave" +" T -103\nKPX Agrave U -42\nKPX Agrave V -81\nKPX Agrave W -57\nKPX Agrave Y -104" +"\nKPX Agrave comma -4\nKPX Agrave period -2\nKPX Aring C -41\nKPX Aring G -41\nK" +"PX Aring O -37\nKPX Aring Q -38\nKPX Aring T -103\nKPX Aring U -42\nKPX Aring V " +"-81\nKPX Aring W -57\nKPX Aring Y -104\nKPX Aring a -16\nKPX Aring b -5\nKPX Ari" +"ng c -16\nKPX Aring comma -4\nKPX Aring d -14\nKPX Aring e -22\nKPX Aring g -17\n" +"KPX Aring guillemotleft -51\nKPX Aring guilsinglleft -47\nKPX Aring hyphen -8\nK" +"PX Aring o -19\nKPX Aring period -2\nKPX Aring q -15\nKPX Aring quotedblright -6" +"0\nKPX Aring quoteright -68\nKPX Aring t -22\nKPX Aring u -18\nKPX Aring v -40\n" +"KPX Aring w -29\nKPX Aring y -44\nKPX Atilde C -43\nKPX Atilde G -42\nKPX Atilde" +" O -39\nKPX Atilde Q -40\nKPX Atilde T -103\nKPX Atilde U -44\nKPX Atilde V -81\n" +"KPX Atilde W -57\nKPX Atilde Y -104\nKPX Atilde comma -4\nKPX Atilde period -4\n" +"KPX B A -28\nKPX B AE -29\nKPX B Aacute -28\nKPX B Acircumflex -28\nKPX B Adiere" +"sis -28\nKPX B Aring -28\nKPX B Atilde -28\nKPX B O -14\nKPX B OE -11\nKPX B Oac" +"ute -14\nKPX B Ocircumflex -14\nKPX B Odieresis -14\nKPX B Ograve -14\nKPX B Osl" +"ash -2\nKPX B V -49\nKPX B W -27\nKPX B Y -56\nKPX C A -43\nKPX C AE -44\nKPX C " +"Aacute -43\nKPX C Adieresis -43\nKPX C Aring -43\nKPX C H -22\nKPX C K -20\nKPX " +"C O -18\nKPX C Oacute -18\nKPX C Odieresis -18\nKPX Ccedilla A -44\nKPX D A -50\n" +"KPX D Aacute -50\nKPX D Acircumflex -50\nKPX D Adieresis -50\nKPX D Agrave -50\n" +"KPX D Aring -50\nKPX D Atilde -50\nKPX D J -13\nKPX D T -56\nKPX D V -54\nKPX D " +"W -31\nKPX D X -58\nKPX D Y -74\nKPX F A -78\nKPX F Aacute -78\nKPX F Acircumfle" +"x -78\nKPX F Adieresis -78\nKPX F Agrave -78\nKPX F Aring -78\nKPX F Atilde -78\n" +"KPX F J -59\nKPX F O -30\nKPX F Odieresis -30\nKPX F a -45\nKPX F aacute -45\nKP" +"X F adieresis -45\nKPX F ae -41\nKPX F aring -45\nKPX F comma -113\nKPX F e -33\n" +"KPX F eacute -33\nKPX F hyphen -20\nKPX F i -19\nKPX F j -19\nKPX F o -30\nKPX F" +" oacute -30\nKPX F odieresis -30\nKPX F oe -33\nKPX F oslash -30\nKPX F period -" +"113\nKPX F r -44\nKPX F u -42\nKPX G A -14\nKPX G AE -11\nKPX G Aacute -14\nKPX " +"G Acircumflex -14\nKPX G Adieresis -14\nKPX G Agrave -14\nKPX G Aring -14\nKPX G" +" Atilde -14\nKPX G T -53\nKPX G V -53\nKPX G W -31\nKPX G Y -72\nKPX J A -39\nKP" +"X J AE -39\nKPX J Adieresis -39\nKPX J Aring -39\nKPX K C -56\nKPX K G -57\nKPX " +"K O -53\nKPX K OE -49\nKPX K Oacute -53\nKPX K Odieresis -53\nKPX K S -48\nKPX K" +" T 14\nKPX K a -23\nKPX K adieresis -23\nKPX K ae -20\nKPX K aring -23\nKPX K e " +"-46\nKPX K hyphen -53\nKPX K o -42\nKPX K oacute -42\nKPX K odieresis -42\nKPX K" +" u -32\nKPX K udieresis -32\nKPX K y -76\nKPX L A 8\nKPX L AE 11\nKPX L Aacute 8" +"\nKPX L Adieresis 8\nKPX L Aring 8\nKPX L C -52\nKPX L Ccedilla -51\nKPX L G -53" +"\nKPX L O -51\nKPX L Oacute -51\nKPX L Ocircumflex -51\nKPX L Odieresis -51\nKPX" +" L Ograve -51\nKPX L Otilde -51\nKPX L S -28\nKPX L T -112\nKPX L U -46\nKPX L U" +"dieresis -46\nKPX L V -115\nKPX L W -77\nKPX L Y -128\nKPX L hyphen -140\nKPX L " +"quotedblright -145\nKPX L quoteright -153\nKPX L u -17\nKPX L udieresis -17\nKPX" +" L y -68\nKPX N A -19\nKPX N AE -16\nKPX N Aacute -19\nKPX N Adieresis -19\nKPX " +"N Aring -19\nKPX N C -15\nKPX N Ccedilla -14\nKPX N G -14\nKPX N O -11\nKPX N Oa" +"cute -11\nKPX N Odieresis -11\nKPX N a -17\nKPX N aacute -17\nKPX N adieresis -1" +"7\nKPX N ae -13\nKPX N aring -17\nKPX N comma -15\nKPX N e -11\nKPX N eacute -11" +"\nKPX N o -8\nKPX N oacute -8\nKPX N odieresis -8\nKPX N oslash -4\nKPX N period" +" -15\nKPX N u -8\nKPX N udieresis -9\nKPX O A -43\nKPX O AE -47\nKPX O Aacute -4" +"3\nKPX O Adieresis -43\nKPX O Aring -43\nKPX O T -54\nKPX O V -48\nKPX O W -25\n" +"KPX O X -52\nKPX O Y -71\nKPX Oacute A -43\nKPX Oacute T -54\nKPX Oacute V -48\n" +"KPX Oacute W -25\nKPX Oacute Y -71\nKPX Ocircumflex T -54\nKPX Ocircumflex V -48" +"\nKPX Ocircumflex Y -71\nKPX Odieresis A -43\nKPX Odieresis T -54\nKPX Odieresis" +" V -48\nKPX Odieresis W -25\nKPX Odieresis X -52\nKPX Odieresis Y -71\nKPX Ograv" +"e T -54\nKPX Ograve V -48\nKPX Ograve Y -71\nKPX Oslash A -47\nKPX Otilde T -54\n" +"KPX Otilde V -48\nKPX Otilde Y -71\nKPX P A -86\nKPX P AE -93\nKPX P Aacute -86\n" +"KPX P Adieresis -86\nKPX P Aring -86\nKPX P J -85\nKPX P a -39\nKPX P aacute -39" +"\nKPX P adieresis -39\nKPX P ae -35\nKPX P aring -39\nKPX P comma -138\nKPX P e " +"-38\nKPX P eacute -38\nKPX P hyphen -45\nKPX P o -34\nKPX P oacute -34\nKPX P od" +"ieresis -34\nKPX P oe -38\nKPX P oslash -35\nKPX P period -138\nKPX R C -21\nKPX" +" R Ccedilla -21\nKPX R G -21\nKPX R O -17\nKPX R OE -14\nKPX R Oacute -17\nKPX R" +" Odieresis -17\nKPX R T -33\nKPX R U -21\nKPX R Udieresis -21\nKPX R V -49\nKPX " +"R W -27\nKPX R Y -54\nKPX R a -21\nKPX R aacute -21\nKPX R adieresis -21\nKPX R " +"ae -17\nKPX R aring -21\nKPX R e -16\nKPX R eacute -16\nKPX R hyphen -4\nKPX R o" +" -13\nKPX R oacute -13\nKPX R odieresis -13\nKPX R oe -16\nKPX R u -13\nKPX R ua" +"cute -14\nKPX R udieresis -14\nKPX R y -16\nKPX S A -31\nKPX S AE -31\nKPX S Aac" +"ute -31\nKPX S Adieresis -31\nKPX S Aring -31\nKPX S T -38\nKPX S V -52\nKPX S W" +" -31\nKPX S Y -58\nKPX S t -11\nKPX T A -104\nKPX T AE -106\nKPX T Aacute -104\n" +"KPX T Acircumflex -104\nKPX T Adieresis -104\nKPX T Agrave -104\nKPX T Aring -10" +"4\nKPX T Atilde -104\nKPX T C -53\nKPX T G -55\nKPX T J -108\nKPX T O -50\nKPX T" +" OE -44\nKPX T Oacute -50\nKPX T Ocircumflex -50\nKPX T Odieresis -50\nKPX T Ogr" +"ave -50\nKPX T Oslash -42\nKPX T Otilde -50\nKPX T S -32\nKPX T V 2\nKPX T W 7\n" +"KPX T Y 10\nKPX T a -107\nKPX T ae -104\nKPX T c -96\nKPX T colon -152\nKPX T co" +"mma -105\nKPX T e -102\nKPX T g -94\nKPX T guillemotleft -126\nKPX T guilsinglle" +"ft -123\nKPX T hyphen -82\nKPX T i -12\nKPX T j -12\nKPX T o -99\nKPX T oslash -" +"94\nKPX T period -105\nKPX T r -98\nKPX T s -98\nKPX T semicolon -140\nKPX T u -" +"98\nKPX T v -106\nKPX T w -103\nKPX T y -110\nKPX U A -45\nKPX U AE -48\nKPX U A" +"acute -45\nKPX U Acircumflex -45\nKPX U Adieresis -45\nKPX U Aring -45\nKPX U At" +"ilde -45\nKPX U comma -35\nKPX U m -17\nKPX U n -16\nKPX U p -8\nKPX U period -3" +"2\nKPX U r -16\nKPX Uacute A -45\nKPX Uacute comma -35\nKPX Uacute m -17\nKPX Ua" +"cute n -16\nKPX Uacute p -8\nKPX Uacute period -32\nKPX Uacute r -16\nKPX Ucircu" +"mflex A -45\nKPX Udieresis A -44\nKPX Udieresis b -8\nKPX Udieresis comma -35\nK" +"PX Udieresis m -17\nKPX Udieresis n -16\nKPX Udieresis p -8\nKPX Udieresis perio" +"d -32\nKPX Udieresis r -16\nKPX Ugrave A -45\nKPX V A -77\nKPX V AE -84\nKPX V A" +"acute -77\nKPX V Acircumflex -77\nKPX V Adieresis -77\nKPX V Agrave -77\nKPX V A" +"ring -77\nKPX V Atilde -77\nKPX V C -50\nKPX V G -50\nKPX V O -46\nKPX V Oacute " +"-46\nKPX V Ocircumflex -46\nKPX V Odieresis -46\nKPX V Ograve -46\nKPX V Oslash " +"-34\nKPX V Otilde -46\nKPX V S -44\nKPX V T 7\nKPX V a -71\nKPX V ae -66\nKPX V " +"colon -76\nKPX V comma -94\nKPX V e -64\nKPX V g -57\nKPX V guillemotleft -88\nK" +"PX V guilsinglleft -84\nKPX V hyphen -44\nKPX V i -14\nKPX V o -61\nKPX V oslash" +" -57\nKPX V period -94\nKPX V r -51\nKPX V semicolon -75\nKPX V u -52\nKPX V y -" +"28\nKPX W A -56\nKPX W AE -62\nKPX W Aacute -56\nKPX W Acircumflex -56\nKPX W Ad" +"ieresis -56\nKPX W Agrave -56\nKPX W Aring -56\nKPX W Atilde -56\nKPX W C -30\nK" +"PX W G -30\nKPX W O -26\nKPX W Oacute -26\nKPX W Ocircumflex -26\nKPX W Odieresi" +"s -26\nKPX W Ograve -26\nKPX W Oslash -14\nKPX W Otilde -26\nKPX W S -31\nKPX W " +"T 11\nKPX W a -46\nKPX W ae -42\nKPX W colon -62\nKPX W comma -62\nKPX W e -39\n" +"KPX W g -32\nKPX W guillemotleft -63\nKPX W guilsinglleft -60\nKPX W hyphen -19\n" +"KPX W i -10\nKPX W o -36\nKPX W oslash -32\nKPX W period -62\nKPX W r -36\nKPX W" +" semicolon -62\nKPX W u -36\nKPX W y -15\nKPX X C -53\nKPX X O -50\nKPX X Odiere" +"sis -50\nKPX X Q -51\nKPX X a -27\nKPX X e -51\nKPX X hyphen -57\nKPX X o -46\nK" +"PX X u -36\nKPX X y -67\nKPX Y A -102\nKPX Y AE -108\nKPX Y Aacute -102\nKPX Y A" +"circumflex -102\nKPX Y Adieresis -102\nKPX Y Agrave -102\nKPX Y Aring -102\nKPX " +"Y Atilde -102\nKPX Y C -68\nKPX Y G -69\nKPX Y O -64\nKPX Y Oacute -64\nKPX Y Oc" +"ircumflex -64\nKPX Y Odieresis -64\nKPX Y Ograve -64\nKPX Y Oslash -55\nKPX Y Ot" +"ilde -64\nKPX Y S -49\nKPX Y T 15\nKPX Y a -100\nKPX Y ae -95\nKPX Y colon -97\n" +"KPX Y comma -117\nKPX Y e -97\nKPX Y g -89\nKPX Y guillemotleft -128\nKPX Y guil" +"singlleft -124\nKPX Y hyphen -89\nKPX Y i -6\nKPX Y o -93\nKPX Y oslash -89\nKPX" +" Y p -63\nKPX Y period -117\nKPX Y semicolon -97\nKPX Y u -73\nKPX Y v -48\nKPX " +"Z v -44\nKPX Z y -44\nKPX a j -10\nKPX a quoteright -23\nKPX a v -26\nKPX a w -1" +"6\nKPX a y -33\nKPX aacute v -26\nKPX aacute w -16\nKPX aacute y -33\nKPX adiere" +"sis v -26\nKPX adieresis w -16\nKPX adieresis y -33\nKPX ae v -26\nKPX ae w -15\n" +"KPX ae y -32\nKPX agrave v -26\nKPX agrave w -16\nKPX agrave y -33\nKPX aring v " +"-26\nKPX aring w -16\nKPX aring y -33\nKPX b v -21\nKPX b w -10\nKPX b y -28\nKP" +"X c h -7\nKPX c k -1\nKPX comma one -105\nKPX comma quotedblright -47\nKPX comma" +" quoteright -55\nKPX e quoteright -20\nKPX e t -16\nKPX e v -26\nKPX e w -16\nKP" +"X e x -35\nKPX e y -33\nKPX eacute v -26\nKPX eacute w -16\nKPX eacute y -33\nKP" +"X ecircumflex v -26\nKPX ecircumflex w -16\nKPX ecircumflex y -33\nKPX eight fou" +"r -6\nKPX eight one -55\nKPX eight seven -43\nKPX f a -20\nKPX f aacute -20\nKPX" +" f adieresis -20\nKPX f ae -15\nKPX f aring -20\nKPX f e -21\nKPX f eacute -21\n" +"KPX f f 12\nKPX f i -10\nKPX f j -11\nKPX f l -12\nKPX f o -18\nKPX f oacute -18" +"\nKPX f odieresis -18\nKPX f oe -20\nKPX f oslash -16\nKPX f quoteright -8\nKPX " +"f s -8\nKPX f t 16\nKPX five four -7\nKPX five one -83\nKPX five seven -32\nKPX " +"four four -3\nKPX four one -88\nKPX four seven -65\nKPX g a -17\nKPX g adieresis" +" -17\nKPX g ae -13\nKPX g aring -17\nKPX g e -11\nKPX g eacute -11\nKPX g l -8\n" +"KPX g oacute -8\nKPX g odieresis -8\nKPX g r -9\nKPX guillemotright A -58\nKPX g" +"uillemotright AE -62\nKPX guillemotright Aacute -58\nKPX guillemotright Adieresi" +"s -58\nKPX guillemotright Aring -58\nKPX guillemotright T -132\nKPX guillemotrig" +"ht V -96\nKPX guillemotright W -68\nKPX guillemotright Y -137\nKPX guilsinglrigh" +"t A -52\nKPX guilsinglright AE -56\nKPX guilsinglright Aacute -52\nKPX guilsingl" +"right Adieresis -52\nKPX guilsinglright Aring -52\nKPX guilsinglright T -126\nKP" +"X guilsinglright V -90\nKPX guilsinglright W -62\nKPX guilsinglright Y -131\nKPX" +" h quoteright -19\nKPX h y -31\nKPX hyphen A -12\nKPX hyphen AE -17\nKPX hyphen " +"Aacute -12\nKPX hyphen Adieresis -12\nKPX hyphen Aring -12\nKPX hyphen T -86\nKP" +"X hyphen V -51\nKPX hyphen W -24\nKPX hyphen Y -97\nKPX i T -16\nKPX i j -10\nKP" +"X k a -14\nKPX k aacute -14\nKPX k adieresis -14\nKPX k ae -12\nKPX k aring -14\n" +"KPX k comma -13\nKPX k e -33\nKPX k eacute -33\nKPX k g -26\nKPX k hyphen -49\nK" +"PX k o -30\nKPX k oacute -30\nKPX k odieresis -30\nKPX k period -13\nKPX k s -14" +"\nKPX k u -22\nKPX k udieresis -16\nKPX l v -11\nKPX l y -15\nKPX m p -3\nKPX m " +"v -24\nKPX m w -14\nKPX m y -30\nKPX n T -103\nKPX n p -3\nKPX n quoteright -19\n" +"KPX n v -24\nKPX n w -14\nKPX n y -31\nKPX nine four -12\nKPX nine one -55\nKPX " +"nine seven -50\nKPX o T -106\nKPX o quoteright -23\nKPX o t -17\nKPX o v -27\nKP" +"X o w -16\nKPX o x -35\nKPX o y -34\nKPX oacute v -27\nKPX oacute w -16\nKPX oac" +"ute y -34\nKPX ocircumflex t -17\nKPX odieresis t -17\nKPX odieresis v -27\nKPX " +"odieresis w -16\nKPX odieresis x -35\nKPX odieresis y -34\nKPX ograve v -27\nKPX" +" ograve w -16\nKPX ograve y -34\nKPX one comma -82\nKPX one eight -73\nKPX one f" +"ive -72\nKPX one four -88\nKPX one nine -71\nKPX one one -125\nKPX one period -8" +"2\nKPX one seven -98\nKPX one six -71\nKPX one three -75\nKPX one two -78\nKPX o" +"ne zero -71\nKPX p t -10\nKPX p y -28\nKPX period one -106\nKPX period quotedblr" +"ight -48\nKPX period quoteright -56\nKPX q c -2\nKPX q u -5\nKPX quotedblbase A " +"21\nKPX quotedblbase AE 21\nKPX quotedblbase T -80\nKPX quotedblbase V -74\nKPX " +"quotedblbase W -39\nKPX quotedblbase Y -96\nKPX quotedblleft A -58\nKPX quotedbl" +"left AE -70\nKPX quotedblleft Aacute -58\nKPX quotedblleft Adieresis -58\nKPX qu" +"otedblleft Aring -58\nKPX quotedblleft T 1\nKPX quotedblleft V 10\nKPX quotedbll" +"eft W 22\nKPX quotedblleft Y -1\nKPX quotedblright A -60\nKPX quotedblright AE -" +"72\nKPX quotedblright Aacute -60\nKPX quotedblright Adieresis -60\nKPX quotedblr" +"ight Aring -60\nKPX quotedblright T 2\nKPX quotedblright V 9\nKPX quotedblright " +"W 21\nKPX quotedblright Y -2\nKPX quoteleft A -74\nKPX quoteleft AE -86\nKPX quo" +"teleft Aacute -74\nKPX quoteleft Adieresis -74\nKPX quoteleft Aring -74\nKPX quo" +"teleft T -14\nKPX quoteleft V -5\nKPX quoteleft W 6\nKPX quoteleft Y -17\nKPX qu" +"oteright A -76\nKPX quoteright AE -88\nKPX quoteright Aacute -76\nKPX quoteright" +" Adieresis -76\nKPX quoteright Aring -76\nKPX quoteright comma -68\nKPX quoterig" +"ht d -25\nKPX quoteright o -31\nKPX quoteright period -68\nKPX quoteright r -24\n" +"KPX quoteright s -23\nKPX quoteright t -14\nKPX quoteright v -10\nKPX quoteright" +" w -5\nKPX quoteright y -14\nKPX r a -16\nKPX r aacute -16\nKPX r acircumflex -1" +"6\nKPX r adieresis -16\nKPX r ae -11\nKPX r agrave -16\nKPX r aring -16\nKPX r c" +" -11\nKPX r ccedilla -11\nKPX r colon -31\nKPX r comma -77\nKPX r d -8\nKPX r e " +"-17\nKPX r eacute -17\nKPX r ecircumflex -17\nKPX r egrave -17\nKPX r f 17\nKPX " +"r g -8\nKPX r h -8\nKPX r hyphen -54\nKPX r i -6\nKPX r j -6\nKPX r k -2\nKPX r " +"l -7\nKPX r m -9\nKPX r n -8\nKPX r o -14\nKPX r oacute -14\nKPX r ocircumflex -" +"14\nKPX r odieresis -14\nKPX r oe -16\nKPX r ograve -14\nKPX r oslash -14\nKPX r" +" p 0\nKPX r period -77\nKPX r q -10\nKPX r quoteright -6\nKPX r r -8\nKPX r s -4" +"\nKPX r semicolon -30\nKPX r t 21\nKPX r u -7\nKPX r v 18\nKPX r w 21\nKPX r x 9" +"\nKPX r y 15\nKPX r z 0\nKPX s quoteright -24\nKPX s t -15\nKPX seven colon -84\n" +"KPX seven comma -123\nKPX seven eight -34\nKPX seven five -37\nKPX seven four -9" +"5\nKPX seven one -58\nKPX seven period -123\nKPX seven seven -11\nKPX seven six " +"-44\nKPX seven three -29\nKPX seven two -31\nKPX six four -7\nKPX six one -52\nK" +"PX six seven -40\nKPX t S -17\nKPX t a -10\nKPX t aacute -10\nKPX t adieresis -1" +"0\nKPX t ae -7\nKPX t aring -10\nKPX t colon -37\nKPX t e -22\nKPX t eacute -22\n" +"KPX t h -14\nKPX t o -19\nKPX t oacute -19\nKPX t odieresis -19\nKPX t quoterigh" +"t -7\nKPX t semicolon -36\nKPX three four -9\nKPX three one -57\nKPX three seven" +" -45\nKPX two four -43\nKPX two one -45\nKPX two seven -38\nKPX u quoteright -14" +"\nKPX v a -30\nKPX v aacute -30\nKPX v acircumflex -30\nKPX v adieresis -30\nKPX" +" v ae -25\nKPX v agrave -30\nKPX v aring -30\nKPX v atilde -30\nKPX v c -22\nKPX" +" v colon -32\nKPX v comma -76\nKPX v e -29\nKPX v eacute -29\nKPX v ecircumflex " +"-29\nKPX v egrave -29\nKPX v g -20\nKPX v hyphen -19\nKPX v l -8\nKPX v o -25\nK" +"PX v oacute -25\nKPX v odieresis -25\nKPX v ograve -25\nKPX v oslash -25\nKPX v " +"period -76\nKPX v s -17\nKPX v semicolon -31\nKPX w a -26\nKPX w aacute -26\nKPX" +" w acircumflex -26\nKPX w adieresis -26\nKPX w ae -22\nKPX w agrave -26\nKPX w a" +"ring -26\nKPX w atilde -26\nKPX w c -14\nKPX w colon -32\nKPX w comma -57\nKPX w" +" e -20\nKPX w eacute -20\nKPX w ecircumflex -20\nKPX w egrave -20\nKPX w g -13\n" +"KPX w hyphen -8\nKPX w l -8\nKPX w o -17\nKPX w oacute -17\nKPX w odieresis -17\n" +"KPX w ograve -17\nKPX w oslash -14\nKPX w period -57\nKPX w s -14\nKPX w semicol" +"on -31\nKPX x a -30\nKPX x c -30\nKPX x e -36\nKPX x eacute -36\nKPX x o -33\nKP" +"X x q -28\nKPX y a -36\nKPX y aacute -36\nKPX y acircumflex -36\nKPX y adieresis" +" -36\nKPX y ae -31\nKPX y agrave -36\nKPX y aring -36\nKPX y atilde -36\nKPX y c" +" -28\nKPX y colon -40\nKPX y comma -80\nKPX y e -35\nKPX y eacute -35\nKPX y eci" +"rcumflex -35\nKPX y egrave -35\nKPX y g -26\nKPX y hyphen -24\nKPX y l -14\nKPX " +"y o -31\nKPX y oacute -31\nKPX y odieresis -31\nKPX y ograve -31\nKPX y oslash -" +"30\nKPX y period -80\nKPX y s -23\nKPX y semicolon -40\nKPX zero four -11\nKPX z" +"ero one -56\nKPX zero seven -50\nEndKernPairs\nEndKernData\nEndFontMetrics\n" +; +int n019023l_pfb_len = 38314; +char* n019023l_pfb = +"\x80\x1n\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-ReguItal 1.05\n%%CreationDate: W" +"ed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developme" +"nt\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COP" +"YING (GNU General Public License) for license conditions.\n% As a special except" +"ion, permission is granted to include this font\n% program in a Postscript or PD" +"F file that consists of a document that\n% contains text to be displayed or prin" +"ted using this font, regardless\n% of the conditions or license applying to the " +"document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) re" +"adonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See" +" the file COPYING (GNU General Public License) for license conditions. As a spec" +"ial exception, permission is granted to include this font program in a Postscrip" +"t or PDF file that consists of a document that contains text to be displayed or " +"printed using this font, regardless of the conditions or license applying to the" +" document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by" +" (URW)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Regular It" +"alic) readonly def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Regular) " +"readonly def\n/ItalicAngle -12.0 def\n/isFixedPitch false def\n/UnderlinePositio" +"n -151 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusSanL-" +"ReguItal def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-178 -284 1108 953} rea" +"donly def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly d" +"ef\n/Encoding StandardEncoding def\n/UniqueID 5020908 def\ncurrentdict end\ncurr" +"entfile eexec\r\x80\x2\x14\x8d\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a" +"\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9c" +"t\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4" +"\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5" +"Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d" +"\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7" +"\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>ni\xcb\x85\xd4" +"\x8bZ'p\xc8\x41\xe1\xcf\x6\x95\xf4\x9c^\x87\xb\x15\xf5\x17s\x15\xa8IN\x13\xc9\xcf" +"\x8c\x64wuNP\xa6\x98\x5t\x15\xa2\xbf\xf\xdd\xc8\xdd\x1\xd8t\xd4x\x1a\x1f\xdc\x9c" +"\xda\xe0\x9d\xea\xdav\x1d.\xb5M\x83\xcb<*\\\xcc\x92\xefz\xe\xa2Ux?\xd4yu\xb8\x98" +"\xc4\x36\x91\xc7\xd4\xea\xday\x85\xd1\x46\xff\x18\xa1\xc9\x9.\xe4;Z\x1b\xf\xfd\x11" +"\xea\"(\x1d\xd0\xd0\x8a;\xac\x19\x9S{\x98*\x8d\n\xef\x2\xe3R\x13-\x17\x41\xbf\x13" +"\\\xca\xee" +"\xe\x33-\x80\x88O8\x94\x34\x14s\xa9[\xeb=YM|\xe2\xd4\x7\x8c\xcbG\x89\x91\xc0\xcf" +"x\xf5\x83R\x96\xfa)3g\xa3\x1c\xc2w\x88O\x5<\x92p9\xdbSB\xd5\xa8\xfe\"\x41\xbf\xfb" +"i\x7f\x2\xcd\xa4\x35\xd5\x34\xe8\xcc\xc4I\xf4`2\xeaZ\xd9i#\x6\x1c\x38^\x94\n\"\xc5" +"\xd1\x37l\xf2\x7f\xa0Q\x12\xaa\x12\x7f\x5\xff\xbfI\xeb\xcd\x8c'\x9d.\xafg\xe6\xc4" +"\xad\x93Ju\x15\xba\"\x90\x12\x6\x5\x42\x66_\x8\xd5\xf2Y\xbe\xed\xbb^\x97\xd6\xe3" +"\xca\xe7n\xcb\xf3\xdb\x1\xac\x65>\x7\xa9\"\x3}\\\xe4\x81\x9e~\xb4\xe4\x38\xcd\x98" +"\x9e\xb1\x64W;\xa0\x63m\x16\xe8\x9b\x41\xce\xd7\xab-\xd7\xacL\xf7t\x92\x82\xddH+" +"\xe5\x99\x38`|c&\xd2\xd9\xb8R\xcao\x98\xe3\xfe\x43\xe2\xaf\xdf\xd6\x9\xe7]vt\xf5" +"\xa9\xf3\x66\x63Q\x9aJ\xba}\x4\x5X\xc8\x80\x1c\x2H=)\x86\x81@\xc6\x2\x5\x19\x43\x11" +"\xce\xbc\xee\xff\xa2_\x1f\x9b\x92vM\xa9rI\xcc\x8e\xec\xefu\x92\xd3\xf3\xff\x63\xf0" +"\xc8\x43t\xc\xa9I\xd5\x90N\x85\xc4\x2r\x90\x30\x80\x99-aJN\x89\x5U\xdc\xdc\x19n\xbd" +"\xbb\xcX8\xdb|\\\x86\xc3\xfa\x35\x63J\xfe\x3\xdd\xf7[I\xf4\x97\xce\\\xf8@\xc6\xdb" +"V\xf0\r\xba\xda\xb0\xa3\x3N\x9c\xae\xa6&\xe5t\x80\x1\xebP\x8aup\x18|\x89h\xc9\x1d" +"\xd8\xb2\x33\xf\x36\r\x42\x8d?\xcc\x93w\x18\xc\xd3z\x8bR\xfc\xdc\x43\xd7\xd7\x85" +"\xf9\xfR\xa8@\xf2|\xda\x99\xe0\x9f\x8e\xef\xbe\x8\x64|\xf2\x37\x98\x61\n\xd2\xe6" +"\xc\x9c\xa4%\xf3\xc0.W\x10mC\xce\xcX8\xed\xbe\x10\xeb\xd3\xfe\x9ay\x9d\x14 o\x4\x43" +"\x8b\xc4Z\xcd\x43\xd7\x7f.\x80\xe6\x8e\x1b\xe6\x98\xef\xde\xd5\x80\xea`\xa3^\x9f" +"7U'\x9d\x43\x89p\x87G\x81~\xf7\xf9h\x7f\x33\x31\xea\xcb\xe1\xd3\xf0&R|\xe\"\x3U\xd6" +"F\xf0\x0\xe3\x30\xd3\xb7\xdd\xe9\xc8=\xd4\xc8\xacLv\xd5\xef_Z\x4\x6\x9a^k\xce\x65" +"?\xbc*\xca\x8f\xeeI\xa6+\xc6xv\xe4@Bn\xa8\x99\xd3\x9a=\xa7^\xb0\x93Gk(\xf8\xb4\xb9" +"h\xeb\xca\xbb\x8a\xb1\x8c\x99Q+\xda\x16\x15na\xe6\x46\x6\xbd\x96\xd7\xa4\x85\xaf" +"\x91\xc5\x39x\xd0\x43\x1f\xe0n\xc8\xf2\xe0\x9en\xc4\x63\x1b\x1bu\xf0\x1a\xd0\x1d" +"\x91P\x3\xc8\x85\xe5w\xe9\xa4\xf9~\x97\xb7i\x91\xfbph|\xd6\x97\xf7\xe0q\xb8\xb9\x1f" +"\xbf\xd4w\xc5*\xf2\xc0UW\x95.Zx\x2\xfe\xff_:\x16T\xbay\xd8\x80\x92\xe0\x15Y\xf1\x84" +"\xa9U?\xe1H9\xa3\x64\x89\xcc\x65\x43\xaa\xcbs\x82X(!u\xc0\x85\xa8\xcd\xfd\x6\x65" +"\xdd\xc7/\xe8\x37\\\xb9?\xc5)\x14\xa6\xdfs\xa7X\xae\xc4\x31HA\xca\x88\x82\x8fi\xc2" +"`\xc6p\xd5\xeb[\xe\xe8\xbbw\x80\x9c\x1c\x1a\xddt[\x2\xa7\x91\x15\xf3\x9f\x8a\x92" +"\x87 ?\xce\x98\xe0|." +"\xacz\x80\x1f\xbe\xe4\xc7&\x8\x1d\xef\x32$SK\x17\x4\x17\xf3\xc2.o\xba\x8e\x9b\"r" +"\xdd)\x98\xf5\xdb:\xd1\xa2\x16\xf\xac\xd7\xaf\x4\xd3\x8\x91\x17O\x96\x15\xc3\x93" +"k\xd4\xf\xf1Gh*\xa7\x8d\x1Z\x4\x8e\xa8\xa5\xbd\x31\x10X_n\x91\xb4\x8@\xa0\xca\x36" +"\"P\x97~ :\x8f\x94^\x88\x3\x66\"\x99O\xda$\x0\xae\xea\xbb\xb2>\xc9x\xbdw\xae\x1d" +"m\xf8\x82\x61\x87\xa6\xacmA(\x12\xccn\xd7\x99\x8a\x1b:GkFyab\x0^~\xa6\xbd\x1f\xb8" +"$\x11\xec\x61\x35\x43G\xa0\xf6\xed\xa7|\xb1\x0\xb1\xd6\xf2\xce\xa9\xcb\xaeW66\xa8" +"\xaf\xb1<\xbes\x2\x8\xc\\?s<\x96\xa4\xea\xe2\x1e\x64\x39WD\xf0mg\xbb\x9d(\xcb>Z\xe8" +"1\xb3\xe7\x9f\xf3k\xb5\x66\xd3\x9f\xf1~\xe2\x1d$\\\x98\x35\xb9\xfe\x8fv\xf5\x5\x2" +"\xcc|\xe\x31\xd8\xfb+\xf\x91\xf6\xe4z\xcd#\x83V\xcc\x12\x89`\xdf\x38\x13\xfe\x12" +"\xa2\x42\x86\xb7\x8a<\xa5\xa9J\x88j\xbe\xa0\xedp\xbd_\xed\x0\x19\xdd\xaaRz-\xd1\x44" +"p<\x7fM\xd8[\xfaO\xe8ji\xe4\x87\xe3\xdc\xaa\x8e\x44XW<\xfd\x8e G%\xeb\xfb\xcf\xc7" +"6\x5\x9di\xf6\xb8\x65}\xbb\xb9\x34<]\x9b&\xa3\x8d\xe6\x32\xcb-\x8e\xa1\x93h\xf5\xbe" +"\xec\xc3\xdd*=U\xa9\xd8\x1f\xbf\x62\xcc;\xd7Y\x6\xe8\\\n\x1c\xaaPj\x10\xd1XuZ\xfa" +"U\x88\xbfI\xcc\xf9\x14yy+\r3\xed\x3]n1T\x95\xe2\xd6\x86\xe2\x42\xf8=\x93\x0g\xba" +"\xd2\x37\x9e(Q\xf1\x1b\xd0\x65\x15\x13\xe8l\xaa\xb7\x96\xd7?\xa1y5\xb1\x8fRT\x1c" +"\xda\x96\x3g7\xfdZH\xc7\xd9W\xbe\xaf+\xfd\xc1\x90)\xc7\x88mo+\x1c\xb3\x46/\xce\x34" +"\xb1\xe9\x1c\xb0\x33\xc2w/\xf6oF\xdb\x8fi\xd7l;\xbb\x42\x9a\xd5\x35\xe3\\T\xa2L\xc5" +"\x97\xb3\x95\xdf\xc\xac\xa6\x17\xc8\xe7\xe7\x9a\x99\xea\x44\xe8\xee\x46o\xc1\xa1" +"\x83\x94t\\\xc0&D0To\x99;un\xce\xe7Z\xf6\xdan\xe3\x38\xff\x1ck\x9a\xdc\xb\x8b\x8" +"\x2\x2\xce\xe9\x84\xedt\xb0S\xfb\xc6\xa8-\xd0\xea\n\xd9\xa9\xfd\xf5\xe2i\xb0h\xf9" +"uh*\xe3]F\x3#y\x89\x96\xdc\xd3\x36\xd8\x8\xc6L^f\x1b\x88?\xed\xcf\x10\x10\xb3v\x8" +"\x98\x18\x43\x39g\xba\x45\xaa\xde\xea\xc7\x41\xbdh\x1d\xfe\x98\xa3i\xab\xf2\x90\xae" +"v\x8b\x62\xba\xce\x11\xae\xccps\xec\xf3*S*\xf4:\x85S\xf\xf0\x93p\x95\x88\x84\xee" +"#\r\xc1[\xb0\xcaY\xa5\x9d\x93`\x8e\x66\xa6\x9b\\Vo\xc9\x8f\xae\xe2\x66|\xfe\xfb\xd6" +"\xaf\xaf.|\xd8\x1a\xec\x92\x8f\xc1\x18\xf2\x14\xb5\xb5\xac>Mx\xe1\xc7Tp\x87h\xa5" +"\x85\xf3\xf8\xac't6\xf2\x96q6\x7f'q\xbc\x16\xef\xfe\xaf\x9e\xe9!\xec\x33!}\xc3~\x8e" +"\\:\xd3\x1b%\xb0P\xf6\x95\r\x8b\xf9l\x95\xe6j\xab\xf6\xc8\x9\xf7\x89\xed\xafVv4\x97" +"\xac\xe2H'\x96\xf7\xfc\xf5\xdaO\x96\xe2\xa7\xfeW\xc0*\xbd\xa5\xf4\xda\xb6\x81\x1b" +"\x10'\xfd\xa8\xec\xe0\xeb\xb0\xdb\x80\xa3\x92\x11~)_\xa4\x87\xba\x99#V\x1d\x95\x9d" +"\xa5\x34\x85{\x9d\xa3\x66\n\xac\xd8wB\x1\xb6\x43\x9c\x6\xdc\x36\xe7\x1a\xdb\x99\x0" +"\xd2\x9c\x5\x37\xdd*\x0z\x18\xae=\xe9\xb5*\xca\x92\xfa\r\xf6\xc\xa4\xd9\xb0K\x97" +"o^\x9c\x82$l\x7f\x99/N\xdc\x12q^;\x92I;\xb6\xf3\xe1.\xd3\x91\xcd\xed!DN\xe3r\xba" +"W\xa5\xa8\xc7\x33\xf7\xf5\xedV\x93\x1f\xf5\xdbo\xa0/e\xfa\x1f.\xec<\x1cT\xa7\x5\xae" +"C\"\xbf\x90;d\xd1-\xa9\x4vqO&>\xaf\x11\x81\x3\xce\x8a\xfc\xec\xfa\xef\xc|\xb9\xe2" +"\xa7`\x14*\xbfVK\x90\x8{\xcb\xc8\x83\xd6)j\xe7k\xecK\x0\xb4\xf8\xe0m\x9fG]\xb8\x8a" +"\x90\\\xbaH\xd7,\x92\x8fT\x9f\xbd\xf1\\\x33\x0\x1c\xb6k\xbb\x9f\x83\xe4\xb0\x65\x1a" +"\xe5\x16\xae\x1d&\n%\xe7\xc6\x9e/\xf7|'=a@\x9c\x9b\x92/\xe6\x9c\xc9\x61\x17\x44\x65" +"\x9f\xb4\x30\xfcu\xa1\xc\xb5\xd8\x84\xb9\x36\xa0-\xc1\xed\xc5x\xf2=i\xd3s\xe2\x42" +"\x98\x82!:\xa7\xee\"\x19\x87\x14({\x87\xd0\x9ft\x9\x10#$\xa9\xc6\x9a \x9c\xc\xe9" +"\xf9N\x19\xa8\xd4\x96\x99\xb5v\xf7\x8cR!\xe4\xbf\xc0\xd9\xa8U\xf2\xfc\x65V\xc1\xcc" +"j\x1c\x88\xea\x84\x85\x90\x66\x0.\xa3\x13.\xb8\x46\x19\x4\x13\x19\x32h\xdc\xc4\x81" +"\x9a\xc6\xc\x8a\x32\x5\xf2R\xd2\xfdt_Z\xc0}|\xd3S\xd9\xa6\xbb\x1b\x9\xd5\x96\x1a" +"\xf8\x86K8\xb\x37\x88\xbm]\xc2?_\x9d\x11~\x8\xc4j\xee\x9a\xe9\x63qy\xc8$\xefw\xc0" +"\xcaR\xb7\x16k\xbe\x82WJs\xde\xf8\x9c\xe3/\xc2\x64\x95\"\xb0\xf5\x98\xbf% \xeb\xe2" +"\xeb\xfcV~o\xb4j\x8a\xdc\x37\xe6\x14\xd3\xcc\x30i\xbeh\x89\x9b\xaclY[3]0\nGZ\xa9" +"\xf5\xf7\xc6\xbd\x0j\xbc\x86*F\xa9\xac\x10\xb5\x5\xf8\x36\x44\x1d\xb7\x32G\x82\x14" +"\xa4\xaa\x87\xd2\xd2K\xb3Mt\x90\xf6\x34\xf0\xb7\x98\xb1nV\x17\x39\xa7\xce\x66\x9" +"\x80\x8e\xc\x31\xa5\x89\xd0p\x94'\x92\xdf\xe0\xa9\x13\xfc\x45\x10\xf9\x62\xc2\xe4" +"\xe8\xd1\x30\x82\xb4\xfcT\x9f\xaa\xc0O\xbf\xbe\x3\xb5'A\x88\xab\x1\x9\xe9\x10\xca" +"gpg\xd5\r\xedqP\xb3I\x16u\xf5z\x1c*\xc7u\xf5\xed\xbf\xa7h\xf6\xdf\x34\x9an\x9a\xd2" +"\x1a\xd8\xd8\xa3\x85\xa8\x98\x9b\x84\xdc\x89\x45t\x96\x89\xf4\xd0\x44t\xac\x97\x65" +"2\xe\xc7\x37\x7f~\xbd%\xe5\xd0\xf7\x32\x17\x90\xc4\xf1\x9a\x9\x99\xb9@\xeei\xd4$" +"LK-\x15\xf8\x8e\xeb\xf8\xdf\xc3 )\xfe\x35\xb9qr%5\x8\xa2U\xc6\x65\xfc\x10\xe1\xa8" +"P\x19T\xd2:\x10\x34\xb0\x9f\x44\xb2o\xb3`\x8e\x44\x95Y\xf4`&'\xcav\x86\x8f\x64\xc8" +"\xf0I\xce\x8a\x41\x86\x35\xe7\xb\xbc\xb4w\xb9O\xac\xfd\x9d\x61[\xbb\x16\x39\xb0\xc8" +"Sa*3\x7G\xa5ww\xa9)L\x97#\x92\x99\xff\x9foU\x93!n\x95o&\x85\x3 \xdf\x8a\x88\xa8\xa0" +"\xc8\xde\xd0\xc3\xfd\x90\x9f\x2\x39\xf1\xc5\xbf*\x82Mx\xe9x)\xcd\xba\x30_\x9b\xb6" +"\x8\x7~\xff\xca\x86\xd4\xfd\x42y\xb9\xc9\x35\x91\xb9\x82\x31\\\x19]\x11\x1dN9\x95" +"r\xcaQ\xea\\\x1\x94_3\xba\xbd\xd6\xfbJ\x93\ny\xa4\xa6\x66I*F\x18\x83Y\xf9~\xca\x32" +"6q\x87QL\xe2\xe2\xfe\xa2\xc4\x1a$xV#h{&\xe6\x1c\xf7\xca\x45\xe5\x91\x9a;6f\xad\xe0" +"f41`35X\x8f\x8e\xa3I\x2\xa8i\xc7\x63\xe8z\x7fJ\xb1\x64\"\x1f\xc6\xe5\xb\x15|\xf7" +"\xd7\xff\xd0\xaaK\x9c\x92h\xf7\xa2\xc3\x6\x19V3\x11\xcaN\xb2\xc1sW\xd4\xe1\x15OS" +"\x13c\xa7\xc4\xa5]\xb3\x86\xb6\x97\x5^+`\xfa\xb9" +"\xb4l\xf2\x44\x43\x9c\x87Q\xa1\xdc\xf1\xad\xb9\x63UA]\x8blB\x6\x65*\x97\xfH\x7f\xc4" +"\xe1\xd6I\x12\x9cs\xd0\x9c\xc8\x35y\x95(F\xb0\xad\x9e\xc\x62\xe\x4\x11^b\xa8`\xc7" +"|\xdf\xc3\xfb\xc3:\xd2@\"\x8c(\xda\xe2\x1c\xbf\x90 ?&$\xe6\xcd\xd6.\xb5\xbc\x84\xb" +"\x87\xf9\xfdPQ\xb3\xd7\x43\xaf\xef\xd9\x90\x13N\xabj\x8a\xf8\xdb\\\x1\xf9\xaf\xf0" +"\xf1\xd2\x96@\x14)\xf4Y\x8f\xda\xa4\xc~\xf\x99\xeb\xb0\x34\xa9|B\x8a\x39M)]-\x97" +"\n$}\xda\x61\xe5\xf0+\xe2\xb8\x8e\x1L\x9a${\xc3\x42\xef\x8\xa6\x92\x7f\xc8k\xe1\x99" +"\"\xb5~\xb3P\xde\xc0i\x8f\x8b\x9fH\x7fWY\x81\x5\x1c\x83\x30\xed\xc6\xdd\xe9\x39\x38" +"p\xbb\x37@!\xf9\x82h\xdcx\x81\xc1\xfb\xa6/\xe3\x46\x1b\x85\x92\xaa\x34\x1\x1c|\xd3" +"\xf2\xb9\xab\xdd(\x11\xdd\x91\xeb\xa0\x1b`\x1Z\x15\xeaLg\xc3\x64\x9b\xe9X-\xec\x41" +"\x1d\x12M\"#\x9\xf5\x1cw\xb5\xed\xc2\xc8\xfe\xee\x19\x90tCU\xfe\xb1\x9f\xd7\x0\x7" +"\xd0w\xb7\xc2\r\x85\xc6\x8bw\xd0\x42\xf7\x9czlC\x8\xdc\xab;+}#>\x1bY9z\xd3\x8\xc7" +"\x9a\x18\x89\x7f-\xbdJ\xac\x34_ \xb2\x1e\xcf\x83\xe0\x14L\xd6\x91\xb6m\x9\x64u\xb9" +"\xf1\x95\xa0\xf1\xc4\xe9\xbd\xc4\xa2\x1a\xef\xdb\n\xa2\x91\x86\xbc\xc0xV\xc9\x9e" +"t\xdd\x32\x7f\xf9\xe2\xdfn~-\xbd\xf1\x90?\xb4-\x9c\x18\x9e\x46\x95\x62W9\xfc\xe9" +"\x9b\x64\xd5o\xa5\xd8\xb6\xa7\xd6w\x9f\x8\xb8#\rB\xf7\xc4\x9e=\xea\xcc\x66\x1d\x6" +"\x82\x8d\xce\x13\xd4\xfbrz\xdaJ\xef\x42gt\x9f\xbd\xf5_JeFGx\xe5\x80\xf3\xc9\x1b\x81" +"\x87?P\x84t\xf\xcf\xcd\xef*\x8b\xe0*Jk\xfa[\n\xba\xfI>?\x0\"W\x99v\x9e\xed\x4\xe8" +"\x0T\xbe\xa0t\x96)\xf8]\"\x90S7\xa7\xf%\xf5\x9c\xd3\xff\xdf\x89L\xaaJ\xd7\xbb\xb0" +"\xf2t\xb8\x1e\x8c\xdf\xd1\xb9#+#\xd9_\x6\x82P\x16\x9\x1b-\xcaX\xa4\x5\xec\x61Z\x2" +"\xf7\rQL\x9\xd6\x8e\x80\xd1T\xe0\x95]\xf1\x1e\x36!\xb6\xf7\xcfJ\x14\xd8!E\xbd\xfb" +"\x16j5#cu\xc3\xb0S%7\x2\x39\x12-\x7\x90\xfc_\xc1\xe3R\xe7\xf6lt=\xeb\xb9`\xe4\x8d" +"\xf9\x6SW\xb8J\xebi\x81\x36\x9fs\xael\xd3kg\xe1\xe+U3ex\xb9\x86K@\"bj2\xb6\xe4\x18" +"I\xe0\x31\x8e\xc4qn\xfb\xd5\x1f\xbd\xaf\xe1\xe5\xc9\x65\xdf\xc8\xe8\x18\xbb\xf2l" +"\xe3\xbc\xc5\xe8\xf\x14\x33\xc3\x3\x8b\x97\xde\x96\x8\x96\x44 4\xd7\xd7\xbb\xa9t" +"\xf2\xbd\x1e\xf3yq(\xcd\xf1\x2%\x8eX\x18\x4'\xcck\xde\x16j\xce\x1c!\xd0r\xf4\xaf" +"~\r\\\x9b|=k\x91\x83\xf1\xdb\xd8\x43\xe6\xe8\x3\x30'}m6\xd1\x39X\x10\xd6\x9f\xc7" +"?l\xca\x39\x8?\xf2\xcb\x39P\x13\x9\xa7\xf3'n\x8\xa3s\x96\x33\xdb\\\xbb\xa6\xe6G\xd5" +"tA\xba\xea\xbe\x84\xb1N\xcb\\\xc4\xf7\xec\x18*\xca\x15\x43\x34\xef\xbf\xa8p!HR|\x15" +"\xd1\xcb\xee\x9a\x5}\xca\xa4\xf1\xc\xe)\xc]r>]\xa4\x7f\x36\x95\xa5\x9d\x4\x19\xeb" +" -$\xb6*\xe8ph\xc8\x97\\\xd8\xb8\xae\\G\x0\xa6\xea\xba\xda\x9c\xcaO\x9aPW$6\xec\x34" +"\xd7\xd3\x16\xf0\x1d\xb5\x4'\xec\x7fyO7;\x93\xed\xaf+\xd2\xd3/\xd9< \xcd\xbe\x95" +"\x96\x97\x66r_\x88\xbf$\xf9\x99\x16\x1cI*M\xb9\x31~\x11\xe7%\xd7\x33\xd1\x97\xd5" +"\x8f\xd4\x16YGH\xd7-1\xc8>\xbb\xfa\xcfO\x6TVF\xf8\x41\x98\xbd\x12\xd7Y\xa1\x17\r" +"\xa0\x7f,\x1f\x36\x37\xd4\x8c\xaf\x8a!\xf1\xc5\x11)' \xf5\xe1\xe5\xad\x63\x2i\xf3" +"-\x81zGv\x86\xba\xf4\xc5\xc8\xdf#\xad\xbe\xbbk\x9f\x7fW\xe3\xb5\x34\x42\xbe\x8T8" +"\xeeL\x8fK2I\xcf\xb0r\xf2\x13\xe5\x66\xafN\xcd\x34\x34\x61\r;\xb1\x33\x80\x33\xaf" +">\xca\xf0\xd4n\x7f\xc3\xe1\xe7#P\xdd\xcf\x4p\x1\xf0\x7\xf3,\x80\xb3\xe0\n`(`_\xfd" +"|\xbf'\xa7\x8e\xc0\xff\x9e\xa0\x31\xf8\x34@\x11\x4\x90\xcaXj\xbc\x9e\x1e\x36\xb2" +"\x88S\xde\xeb\xb0\xc4\x66\xe1\x43\xb0\x41\xbb\xbf\xcf\x9b\xf8\xc5\x18~\xd1\"\x7\x17" +"\x1dxc\x89\xe8\x9c\xae\x5\xea\x13\x14\x96\xe1\xbJ\xc4{zR\x6\xf\x2\xc0\xacw\xa0\xd5" +"\x89Q\x84\x33\x84x\x19\xee\x7fm\xc5\\\xfG\x5\xeb\xca\xd5\xc6\x1e\xa4\x93.<*\xeb\xe1" +"s\xf2\xbb\xc0\xce\xaa\xbc\x63\xcdX\xe7H@3\x4\xad\xd9\xe7\x8e\xd4xYA\x81\xbb\x8a\xd7" +"\xfd\xb6\x37\xf9\x1b\x92U$\xb\xbc\xe9\x43\x15v\x5\x14$\x1\xb3\xce\xa0\x39\xdf\xb0" +"\xf7\xe2\xc3\x7f\xb8J\x1f\x83\xb1s\x5\xbe\x3\xb0\x9f\x33\xf0_\x9e\x45q\xc4\x66\xaf" +"\x19\xfd\x1d\xda\xbd\x84\xa5\x7KX2\x2\xcc\x39\x95\x2|\xf6\xfc\xf6l(\xe1\xa2`Jr\xff" +"\xc6\x98\x2@\x6\xe4\x46\x61(\xf\xf8\x99+_\xee\x92\x30\xf5vYL\x8b\"\xdbi\x3\xcb\xa0" +"\x8c\x10\xb2M\xab\xa9\xbc\n\x35\xcc\x61\x89\x10K\xedP\xfa[\x7f\x11\xe4\x34J\xbc\xf" +"g{\x9b\xc0i\xa8\xbe\x8f\x82r'\x1f/>>\xc0\x97\x36No4A\xf3\xfd\xf7\xf7\xd1{\xdalun" +"0\x95\x80\xd5\x33JR>8\xc9\xc3\x34\xce;P\xf0\x17\x9b\x1\x31\xa3\xc3\x98\xc1\xd7\xf5" +"B N\xd5\xe5\xb6\xf0\x35\xc5[$U(n+u\xfd\x9b\xea\x16\xb3\xfd\"g\xe4Z\xbb\x9f\xfb\xec" +"+\x1c\xd8\x92\x18\xa7\x99\xd0\xa2wG\xdd\xb5\x14\xbe\xc2u\x8fN\xd4\x8d\xf8\xe2\xc3" +"\xae\x1dX\xe2\x7f\xf1\xd9\xc6\xa0\xecI\nu>p2\x18\x44@\x9f\xc9S{\xc0\xf9\xad\xd2\x8" +"\xc0\x42\x90\x66\xee\x18\x38\xc8\"\x90\x9d\xb7\xcd\xcdg\r\xb2)\xd1\xb8\x1e\xf\x8f" +"z\x17\xd4\x36\xbf\x9b\x87\xc\xcfJ\x8f\x3\xe0\x1d<0\xb3\xd6k\xbe\x34\x19\xf\xdf\xd7" +"\x83o\xe7\x42x[`\xa4?\x93\xa5\xcc\xca\xf1=\xd4\x61|\x94\x9c\x15=\x80\xee\x32\x8f" +"\xeb\x6\x92\xaasH\xb8\x93\x8a\x8c\xd1%\x9e\x1b\x6\xbd\x13\xc6\x1P\xd5\x35\xa7\xd7" +"T\xe6\xf2\xa1\x1d\xc7\x61<\xc4\x14Or\xc4L\x85\xca\xc7%\x10\xa3T\x14*\"\xa7\x8b\x88" +"X}\xf4\x7f\x95\xa6\xdaOT\xbe\xda\x8e\x30\xd2\xd3\xe0\xa8\x7fH\x84\xe7\xdd\r\xfe\x5" +"h\xe2\x12~y\xb\xeb\x1a\xc4'4\n\x1a\x37\xe0\x14\x8c&76w\xd1)\x83~n|=\xdbW\xe0\xc8" +"I\xf8\xbf\xb9\x6\xfby\x1c!A(t$\xe2\x5kf\xf2\x9f\xb4\x1fl_\xa5\xb1&M\xb8r\x98\x93" +"7w\x1fUf\x11\x89\xf7\xeb\x80\x82\xab\x8av(ER\xf6\xdcT\xfdw\xddz\x6&\xb9\xe8\xc2\x10" +"\x8fR\x1d\x84\x96\xce\x2\xaf\xff\x61\x3\x88\xccN\x0\xf\x66\x16X\xd0'T\\QS\xfdp\xa4" +"a\xd8\xd6uO\x1b\x66\x7\xe\x42YM\xdc\x1\x91\x89\x2\x3\x80\xf\xd6L\xe2\xf8\xbb\x1c" +"*\x1\x9c\x30\x8e\x83\xbf\x87,N\x2\xc\xb5\x10]\xd5\xe4\xe9\xfc\x1f\x41<\xaf\xd2\x36" +"\xfd\xd8$\xe7\xc7\x9d\x35\x12%\x81ppB\xe7\x36\xff\xe2hO}\x96\x1l\"\x96\xce@nM\x92" +"\x19\xedX\xbd\xa5\x93HE%o\x1a< t7\xa0&\xfdp#\x85\x37\xbc\x99\x9e\xa5\xddnzp\xae\x97" +"\xad\x14\x9aG\xfc\x9c\x93\xc3\x85\xa1/\x17\xf2\xd0o\xbc\xc9\xc0\xb1\x14\xec\xa1\xf6" +"\xff\\\x9a\x94)w~JMVhp\xd6^_\x17\xc8\x32-ld\xd0\xda\xb2\xd1\xee\xb1\xaa*\xe6\xae" +";\x89\xf8~\x11S\xf7\x95\xa6\xf2\x42\x64!\xf0\x9<`\xc9n\xee\xfb\xb8\xc9\xb0\xfa\xaf" +"o*s\xde!\x8d\xdf::\xe9~\xfaxT\xc7\x4\xa4\x2\x1d%\x35\xf5\xc1\x12\x93V\x89\xdc\xf5" +"Y\x16/\x19\x1a\x97\xb\xf4\xd8\x66\x92\x45\xa3\xc7\x10\xb3\x3\xc7*3\x98\xf5~\xef@" +"\xe6o\x95\x11\xce\x92'\xd3\xae\xc0\xe6\xc5X\xd6\xa8J{\x87w3\x97h@\xa4\xd7\xa6\xc9" +"\nny\x1c\xbd\x85\xbfI1\x82\xd4~\x6\x9f\x7f\xf3Ox \\\xeb\x63k\x82I\xa8\xa6\xa8\xd3" +"\x89\xb8>\xc3\xdal\x2\x66S\x98z\xf8\xeb\xed\xf2v\xda@\x8c\xf1#t\xf0\x86xI\xc4\xf1" +"\xc5l\xb0/(\x17S\x17YR%\xab\x85\x5SlB\xc4\x44K\xbe\xcb\x7f\xbd`\xe2\x17!R\xa7xA\xcb" +"\x10\x35\x33\xf0jbGs\xc3\xea\x99\xd7\xca\xc6s\x16W\x81\x2\xaf\xc\xb8\x97\x8f\x9c" +"\x10`e\xf2\xf9V\xe0{C\xb\x9c\xea\xabt\xa2\x38@G=\xfb\xa9\x4i\xe2)\xdc\x7f\x5]\xdf" +"jn\xab\xe3\xc3\xf7\xa0\xcahMb(f\xdf/\xad\x34\xa1\xc\xcf\x8u\xbc\xbb&\x98\xff\xe3" +"\xf7,}A\xc8\xccP\xe2\xcSE\x9c\xd0T\xd7M\x97\xf7\xba,\xbf\x80tu\xfe\x1c\xee\xee\x86" +"\x10\xec\x94\x1dUa\n\x8o\x18\xfck\xcd\xb7\x45\xab\xa1\x1c\x62\xba\xdb\x83\x1a\x44" +"\x7f\xc3\xe8\x1a]\xc5\x45)\x10\xbb\xc3\xf2\xb5\x87\x87\x33G\xcf\xbc=\xe6\xaa~\x14" +"\xe4G.\xe8\xae\r\x34*\xc2\xad\x9et\xaf\xacG\xf7\xe8\x85\x31\x64z\xa8O\x85Y\x80\xd4" +"\xf2 \xdc\xca\x12\xaf[\x90\x99\xe\xe5Ufi\xdf\xafV\x99\xeb&\xc2M\x98\xcb\x80\xeH\xfd" +"\xfb\xc2}\xc4\x64h\xfap\xe2G\xcf\xa0\xbb\x82\x91\x42\x17\x3\x97\x6\xf\xedL%\xbc\xee" +"\xfa\x1b\x4%\x89G>\xf2\xd6\"\x41l\xe3\x41\x12\xb5\x95i\xe3\xd0\xd5M\x8e\x9\xa8\x38\x44\x9cr\x9e\xd2\x66\xcb\xa3\x92\xc5:\xdd\xd8Z\xf5<1\x90\xc8\x17\x16\x37" +"R\xad\xc2\xa6y\xd3\xb8\xe6\x94\xdc\xb2\xc6\xb4z\x94|?\xf2s-\r\x17\x97\xb7\xfav?\xfe" +"F\x16\x11;\xf3-{\x18\xbb[\xdb\xee/\xc8\x10\xf9\x14\x90\x9a\xc0o91\x96K\x9a*\xe9\x30" +"\x14\\\x65\x81\xd7\xc1\x97\xa6\x15gw\xbaK\xfc\xc4\x17\xe1\xd4v\xea\xf8[\xa6\xa6\x45" +"\x90\xb1`>\xef\x89l~35\xa9\xe8>(\xba(\xdc\x8e\x96W\x98\xfa\xd0\xfd\x83;'\"\x7\xcc" +"\xd9\xbfu\x1\x13\x98\x9dhlQ\x96g\x9d\x17;\xa4v9.@k\xe9\x18\xbc\xbb\xb9\xfeQy\xaa" +"\xb1\x7f\x10\x32\xc8,\x84\xe2\xcegZq\xd1\xf1\x6\xa8\x7f\x1di\x89\x62\xe0~l\xc7h\xbc" +"\x98\xc8\xa5*r\xf2h\xc4\xfxe \xdc\x88xd\x88\xff\xfe\xd2yW7Z$J.\xab{\x1c\x33I\xb3" +">\x8M\x9\x8d\x8c\xdc \xc1\xd5\xf5Y\xd3\x91w\"\xa2\x63\x41\xaaZ\xc2\xdc\xe2\x66\x86" +"fq\x8d.\x99|\x11\x8au\x96\x9b\x80\x35\x15\xbd\xb7\x42\xd7\x85\xe1\xd0\xe5\x6\x8e" +"\xd5\xf4\x13\x13\xb2X\xae\xaa\xa2m\x9-\xd8\x92x\x1d\x1d:\x2\xff\xce<\xecy\xc7\x65" +"Z\xb0&F\xe5\xba\x32\x8e_\xejk\xb5\xf3\x8c\x11\x99\x34\xff\xae\x98\xfe\x16\xb5\x30" +"lA!o\xc6\xbcoQ\xc2v\n\x9eZ\xd4\xc3\xc\xa4\xb1\r\x9f\x18\xc3\xfcl\x8a\xa5\x9d\x62" +"6\xff\xa9\xb0$\xc7@\xb0\xae\xa2\x89i\x97\x90\xce\xa9T(\x84J\xd4\xe4\xd0\x36\xc4\xb" +"P\xab\x94\xb0:\xd4\x80!p\xcU$}\x8e\xf0r\xe3'\xe8\x81\xf9\x94\xb1\xc0\xc4\x8f\xe3" +"d+\xfc\xa5\xe8$\xf2~\x8e\xd7\x14\x92\x19\xc8\xd6\xcbi\x16gW\x7\xcc\x37\x42y\xec\xbe" +"O\x14\xe8\x66w\xa7\xf3&Kq\xdd\xdeL\xe6\xb5w\xb2T\x97!2\xe5~n^\x93\xc3\xcf\xea_\xe4" +"\xc0\xcfv\x1e\x92\x9d\x18\xfb\x61\xeb\x80m\x12\xb4\xa6%+ps\x8e" +"\xb1-\xa1\x90\xf7\xb7\xa0z\xdf\xe9s\xd6\xdd \x92\xc3\xc9\x37~\x85\x41H\x9c+\x4\x15" +"\xec\x11\x81\x37\xcb\xf8\xb8\xe4/\x5g\x1dX4\xae\n\x98\x92(\xf4t\xc4N\x0N\x16{-O\xb9" +";\x10\x87/\xf8\x8fi\x6\xce\xfc\x46\xa8\xd1\x95\xe4=p\xdc\xda\xc3\x14g\x97\x38\x8" +"s\xd4\x62\xda\xb\xd1\x61\xc7P\xb0\xd9\xa2\x10_\xc2\xd8\x98\xdf_\xa0\x35#:\xdd^v\xc3" +"\xd5@\x1X\xc2\xf2<\xa5i\n:a\xd0\xf6rz\xc3\xba\x11\xe8\x96\xc9\xfa\x1c/\x12\x30\x44" +"\xd2>[\xa7\xf0\x39\xaf\x14\xb3\xbc\x18\xb9*T\xfc\xf8g\x97-\xc0\xad\x37 Y\x1\xc3\xc8" +"Z@X\xe9v{v\xa5\xd2$#I\xd5\xdf\xc[\xff\x35\xf8\xa1\xf0m\xea\x17\x82y\x19\xff\xe4\x62" +"\x92\xe8\xf1tW\x13\xc2\xad\x98\xf7O\xd0\x37\x43\x1c\xbf\x6\xf0\x8d\xb\x81\x39\xc" +"g\xb6\x1c\x83_J\xfe\xe0=Fk\x17S\x9fS\xd6\r\x39\x80[\x15\x43J\x1\x9a\x9V\xf4\x18\x1f" +"\x8e\xd8\x81\x9e\x41t\x1e=\xe9Q]A\xac\xf2\x38\x8by#\x95z\x15\xd1\x1c\xf2\xcK\xcc" +"\n\xd5j\xd4t\x1f\x99\xed_\x9d\x0]b*\xe6\x33Z>_\x81\x66! \xfdv\x9a\x9c\xe6\xa9\xad" +"\x7f\xf8U\x12\xc1!J\xae\x2\x8f\x66\xdc\x1c\x37\x2\x36\x1f\xbf\xbf\xe8\x36<\x1f\x38" +"\xc1\xae\x39\x46\x45;\xa1\x8f\x0\xa3G0\xb3H\xff\xe4\x8\x87\x37\xb\x5\x66\xad&\x94" +"\x1d>\n:/\x8d\x83\x9b\xc" +"\x98\x4\"\xda\x61\xc\x84\xbb\xf5.{F\xb8\xb3\xcfz\xb0QH\xa0wlf\xc5\xa7\x98\xa8\xb8" +"b\xdf\x31K\xc;C=\xd2\xb3\x1\xf5~\x97\xf4\x41\xb7\x33W\xcaT\xf0=\xb2 \x94\x36\x13" +"\xda\"GY\x85\x65G\x96\xc1\xf5sW\xf4\xf5\xae\xcd?\xdb\xf3\x88\xaa\xfd\x39\xb1\xed" +"\x8c\xde\xb8\xf0P\xde\x7f(|)\xfd\x43\xf8.\xf7!\x1Jb\xa5\xbb\xb1\xfb\xc\xd9\xe3\x9d" +"4\xa9U\xd7MU\x16\x92#\xe1\xd2\xc9$*\xa4yaOrg\x96\x1aN\x16\x97\xaa\xfc\xcf\x12J\x8c" +"\xf0\x44\x88\xb1Z\x8d\x8f\"$\xfbX\xe6\xed\xacnB\xd8,F\xfU\"\xfd\xf8\rr\xca\x9eo\xe3" +"\xfb\x13\xabo\xb9v\xba]'\x98se\xe}\xa0*\x97\xd3\x84\xf3~\xf0\x87s#\xa1g{\xcc\xcd" +"\x88^\x94\n\xb1y\xc9\x35\xaf\x90\xcf\x2\x11\xc2\x1d\x32\xf0\x4pgE\xb7=|*\xb1\x1e" +"|Z\xa0\x8c\xab\xe3P\x8f\x62\xeeh\xa0Y\xc2\xcb%GO\xdc\x1b\x87\xcb\xa3\xd4\xeb'M\x1d" +"\xab\xef\xd3\x1b]+\xd1\xcrN\xcd\x89\\M\xcn\x7Hm9\xdd\x38\xfe\xbe\x5\xe5\xa8\xc7\x96" +"\xc1@<\xa3\x9b\xb9\xcb\x3\xff\x9e|\x1bm\x9\x82\xf4\x62\x11\x0\x93\x90\xca\xf3\xdf" +"X'\x8c,\xf1\x91\x95y\xc0\xea\xc1\x8b\x14\xb4\xb1^G\xb4\xf3\xafm\x11\x89\r]\xe9$\xac" +"\x90\x63\xff\x90\x34\xdc\xa7\x8b\xeaz\xd9\xce\xcw\x85\x99\x80>\x9b\x91\xe7\xac\xb2" +"M\xe2\xc7i\xe6\xee\xb!\xde\x36\xa1\xd3-\xc1>\xf7\xd3" +"^(\x81\x4\x8e\xb5\x8c\xf7\xfe\xf8=\xb4\xa1M\xb6k\xd4\x93I\xbe\x33\x44\x8d/b\xd8\x9f" +"\xaf#\xa1nd\x3\x98Y\xac\xbc%\x31\x7f \xbd!&iR\x96\xb7\x32\x66\x8d\xfc?;v^\xd1\x1d" +"\xb8\xa6\x17:\xcc\xfc\xcb\xab~\xee\x4\x17\xb\xe4N\x2\r<\xcb\xfc'^sq\xe6\xd0\xa1/" +"\x94\x14}d\xba\xdeRp\xe3\x10\xd0\xbb\xc3\xe5\x1b\xd2\x46\xf0\xf7<\xfd\x86\x8d\xc4" +"H\r\xbd\x86=;ua\x83\x95\x11\xdd\x65&V\xaa\xe9\x33\x41\xefW\x87:`M\xb0\x8b\xb4\xd7" +"\xa9\xb3\x16\x45;k\xb0\xc8\xcaM\x1c\xa4*On!\xa5\xf7izin\xc0\xcb\x11\xad\xe5;W\xc6" +"4-s\xf2\x9e\x1a\x66\xb8\x64\x5R\x8f\xeaLt\xd4\x88VhB\xc1\x2\xbd\x17g\xa0{k\xa4\x82" +"\xaa\x61\xe6\xdc+\xbf\xed\xb0\xf2\xc4\x90\x30\x46JG&\x9e\x88\x92$m\xe0%z\x9\x1f\x32" +"\xef\xcf\x7t\xc7\x1a\xc4\x32h\xa5g\xc4\xa1\xbc\xcd\x8f\x2:'\x8b\xc1\xe8\x30\x9c\x42" +"_\x0r\xd9\xd9\xcf\x8c_\x1f\x65\xf2\xc0\xfn\x19+\x98\xde\x91\x62\xc3\x1d\n\x41\xeb" +"\xd0\xccmq\xa2\x9b\xcc\x62@\xff\xe8Z\xd5\xd8\xbc\r\xeb\x85\x99\x8f;)\x84\xe7:\xb2" +"\xc4\x86\xb2\xd7\x93Q'\xee\xfa\xc7\xfb\x7f\xb1\x6_C[\xe8\xa3\xe8\x32{\xd2\x11\xd3" +"\x96\x7\xc3\xcb\x7\xf2\xe1w\xcc)R\xe3T\xf0\xbax\x8a\xc1#\x99\x38\x83\x9c\xdd.u\xfa" +"\xabqs)\x1d!,\xc4k\xe1U\x1f\xf2\xd7#\xbe\x91j*\xc4j\xcf\xe1\x8d\xd4\x92\x7f\xb0q" +"\xd2\xc1\x89\xcb\x1a\xc1\xce\x9a\xd1\xfb\xcf.\x8^P\x17I\xb1\xef\x64\xa9\x84W\xf4" +"\x1f\xa4\x8d+\xe9\xa8\x5M=kcY\xd5\x84\x97\xecq\x3\x37\xbb\xff\x63j=6\xd8\x18\x1d" +"g\x82\xec\x88\xeb\xc3\xcb\xb3,\xd8\x43q+GQw]\xfa\x16\x33h\xb9G\xf3\x90\xd8\xab\xde" +"J\xb1V\xfb\x42Q\x9bM\"!&\xb2\xf6\x95\xf1\xa7\x12\xdc)\xe1[\xca\xed\xa0\xb5\x90\x13" +"\xd1\x41\xad\xd7\xcc\xdeN\x1e;\xb3\xb0\x12\x37\xb2\x5\xa3\x87\x8P\x8e\x30M\xd7%\xd3" +"\xaf\x8^\xee\xb0\xd9RR\xf4\xf4+f\x2\x0\x96\xeaQ\x9f\"\xa4\xe8l\x5\x16Qk{\xdb\xb\xb1" +"Xa\x9e\xda\\\xb9\xde\xf8Z\xe0\x8eVWm!H$\x17\xf6\x41*\xb6*\x19!\x97\xc4\xb8\x31\xd7" +"\xb2\x8b!~\x93mH?\xb2Mt\xb6\xe\xa4\xe2w\xa9\xcc\xef\r%\xf9\xba\xfc\x8e\xd0[\xfa\x80" +"2\\<\x2\xa0\xa6\x33\xc4$\xd6s\xf7@\xdc\x1b\xbe\xeb\xd4\x9alMg\xea\x0P\xa3N\x97\x99" +"}\xd6w&j9\xb3OK?B\xca\x6\xbe:\x7f+a9\xcd\xb8\x8\xb8\x98\x13\xa9K\\(s-`c;Y\xc2\xdb" +"\x99\xe2\xa5P\xf9\x88\x19!{\x19^\xc6\xe4zy\r\x94\x15\x8c#G7\xa8\xce\x1f\xcd\xa8\xc" +"H\xcf\xba\xfa\x13J\xef\x15k\xf3\x39\x11\x8d\x98\xd1\x14\xec\xea\xe9\xe2\x1\x8f\xe" +"|`\xec\xa7\xba\x88\x1f\xbe\x7f{\xb5V\xfc\x15\x84-iM\xf8\xb2\x3m\xa1\x9\xd0\r\x19" +"\xcf\xeb\xf7\xc8\x99;\xb9/\xd2\x9dW\x8d\x1\x45N%\xfc\xf5\xfa\x7f\x36\x1asB\x99\xd5" +"%\x16\xc1\xae\xc6q\xb\xe7!\x89\x80\x86\x90\xed\xd5\xb3i\xd1\x9e\xf3\x7\x1e\x8b\xfd" +"\x83K\xdd[d\xdfjo\x8f\xaa+\xd4U\xf\xdb\x9a\xe6\x8e\xca]RV\x93\xa6\xad\xa5;\x93\xc7" +"\xa5sn\x93\xaf\xaf\xce\xed&\xa7*\xdcM\x9e\x37\xb3-\xd7;\xa3\xbe\x87\xf8z\xce&\xa4" +"w$I\xea\x89x\xee\x16w\x9f^\xe2\xd7\x83\xee\xfd\xb4\x90=\xedZ\xf5\x85\xc9\x38\xa8" +"\x1V\xb9w\x82\x98\xb4g\x8a\xb6`\x94#AY'\xbd\x61\x8c'\xbcn\xf7\xe1\xeeh\xf3\x8f_\xfe" +"\xeb*\x1b\xd6\xa1\x9f\xbc\x14K)f\xf7/\xda P*\xeb\xef\x92\x12\xe5\xc3\x7\xf7\xc8\xb4" +"w\xff\x89\x65O\x90\xf7\xbeZM!\xb2M\r\x86v\"\x97\xee\xe1\xa0\xcbX\xad\xaf\xc6\xba" +"'\xd3%\xdf\r\xf6\xbf\xba\xf0?\x82\x97\xc9\xe4\xef\x1e\x18N\xff\x9c\x82\xec\x7f\xdb" +"\x2/\xa1~\x83\x4\x9d\xbax\xe3y\xde\xab\xf3\xe4y\xe8u\xfO\x10zG\xf5\x1b~\xc5\x82\x62" +"\xe5*0\xcc\x93\x43\xcf\x9b\x92\xcf\xcbOn{[k;a\xabt\xea\"\x8d\x8e\x3\x14\xff\x46\xd8" +"\xby\x85\x12l\x2\x42\x6xk\xd6\xf3g\xfd!\x1fq\x98j\xe4\xddW\xab\xd8\xae\x83\xcdh6" +"\xa2\xd8\xe5\x9dP\xe1\xa6\xe7*\xd7\xbc\xea\xddr\x5\x8c\xa2\xa5\x61\x89@\xf\x12\x94" +"\xe1\xc0\xacg\xe9\x11h@\xd4\xcc\x15\x9eXH\xb3\x6*\xdb`?\xb3\xbau\xd0#\x8\xd1\x36" +" \xaf\xbbs\x6^Qq\x83\x39\x8e\x81Np\x1aS\xd9P\xce\x9c)\xc5\x99\xf0\xe1\x4G\x7\xa2" +"\xe1\x83:^\x9b@\xfd\xec\xd6h;j\xd2\xf4\xd8\xc3J\xf8\x92\xcdZ\xa1\x9e\xe8I\xd2\xba" +"\xb2\xd4\x91\xea\x1b\x1b\xd1\x82\xe7|\xab\x13\x14\n\x41o\x3\xe9\xd2:\x9f\x33\xd8" +"\xfa\x82Os\xe3|x.=Bal\x1c\xa5\x89K\x4\xb4\x97z\xb8O`e\n#\x96\x88\x7\xb6\x8f\xf0\xb7" +"J| \xe0\xa0\x43v\xe8\xd7SSZ\xe2\xe8\x8f\xe1\xb7\xc6\x88\x44\x18\xc2q\x16\xe2\x32" +"u\xe1\x81hO7[E\xf2\xb4\xf8IH\xcf\xac\xfe\xc\x35\x2=\x80,\xb2\xa0supKF6?\xc5\xaf\xed" +"\xe3Pit\x84\xac`^2(\xa3\xe5'\xa6G(\xec\xef\xea\x8c\x4\xc9\x46\x46\x35\x9d\r\xb\x9a" +"\xb8W\x8b\xda\xb5>L\xa7\x1f\xf2\x36\xd9\xdc/\xdf\xa7\xca\xc2_\xca\xdc\xe1\xa4\xd8" +"\x6\x39\xd5\x1d\x82\x85\xbe\x86t\x14\x8e\xe9\x9c\xe8\xbdOW6\x7\xc6\xc9\x39\xf7m\xc4" +"\xdc&\xaa\x85\x1c\xed\xef\xb4\x94\x1a\xcb\x64\x1f\x9f\x31\x2/\xdc\xc9\xf7g\xc6\x97" +"\xd4\x11}L\x1a\xae\xb\xe3\xc8\xfe\x93{f\xd6 \x19\xf5\xad\x8cZz\x87^\xd9\xae\xea\xca" +"\x10\xed\xf0\x6iL\xdd\xfe\x9cm\xd1\xca\x35\xa7\xc1\x99\x9bK\xd4SZ{\x80Yx}\x8f\xe5" +"\xd7\x42\xc8\x11\xaaJG\xb\x32\x86\xc6y\x8e\x44" +"\xec\x46\x6mU\x18=\x8e\x96\x18\xb6\x66-8o\xb0\x42\xa8\xadI\xbfS\xbd\x1f\x44\xc8X" +"\xc7\xf4\xc2(\xe8s\xf3<\xf6\xc5\xa3\xc3\xfa\xd6\xe9\xe8\xb3\x13\xb1k\xe5\xe0\xb1" +"\xacN\x6\x96\xf4\xf8\nX\x16\xd6\x9d\xffh\xccz\x8b\xb\xd9\xe6\x10\x2l\\\xb4\xbaR\xf0" +"\xb9h\xb1q\x8c\\\xa0_\xd9\x19\x1d\x2\xd3\xcf\xab\xdb\x96\xc7!BQQ\xbf=\xa0\xe7\x0" +"\xe\x14\xfb\x15^u\xd8\xe1\xb9\xa5\x9d\x6R@\x1aV\xd2\xc2s\xb0\xd2\x37\xd6+2\x7\x5" +"\xa7\xb0^\xcc\xda\xdeis.\x17W\x1\xe9\xed\x8br;/\x8b\xe3\xad +1\x16r\x81\\\xb\xea" +"\xff\x85mq\xe2-|2\xddj%\xed\x64R\xad\xf5\x38\xd2h\xef\xd0\xba\x1\xf7S\x4\x61\x92" +"j\xe9\x65'\xc8\xe4\x1\xf8\xc7L\xf1{\x9b\r\xfc\x31\xc2/\xb5r,\x12\x3g\xffn\x9y\xd6" +"\xca\x11\xf\x30\xd1\xef\x9f\x7\xa4\x90\x81/\x4\xf7\xa8\x2\xd3{\xb7\xb4\x62p\xc4O" +"\x11\xe8V\xd0\x82\xee=\x18\x81{<\xad\x46\x64\x8c\x8a\x38H\xb0\xdf\xdc\xe4G\xcf\xf2" +"\xee%\xe8'\x9b+\xc9\xa5\x9d\x90m\xebzy\xa7\x8aP\xa0\x85\xbf\x9alj\x82\xda\x85*R\x8" +"O\xc4\xc8\x15\x63\xae\x80\xfe\\v\xf5\x98\x12T\x7f\x37\xe3\xbdg\xc5\xf3/\xf5~\xbd" +"\"\xff\xe2M\xeb*R\x6X\x98\xa9\x38\x3\x66\x4\x61\xa8\xe3\x62,\xb0\x1a\x0\x43 \x12" +"\"\xa5J?\xedR\x6\x93\xca\x4K_\xcc\xda\x83~m\xa4\rm~'Qj\xd8\xb1\xc5z\xb7W\x88\xe7" +"N(\xa9\xb7\x85\x11z\x8a\xee\xc1\x90\x9f\xa7g\xa5\x6}\xfe\xccw\xa7\x1b?%4\x8b`\xe8" +"\xaa\xa9\x32\xdc\x9e\xfe;\xc0*\xa5\x8f&\xbfn\x1f\xbf\x85(\xe1\x8cT@v\xbf,O\x9b\xe9" +"\xbdw\xa7\xb3\x1.\xeb\xff\xde\xa9\xd0\xfe\xb1\xaa\xa2\x1c\xbd[b\xc6W\x1b\xb8y\xa8" +"\x95\x99\xf8N\xcd\x17\xb3Q\xacTS\xb8\xce\xa2;\xa5_M\xce\x15\x82\xb6\x9\x42\xfb\x89" +"\xd2G\x91+\xf7\xe8\xee\x1f\xf6\xb8\xce\x43\x84\xd8\xb9\x0\xb3\x5&\xd7#\x86\x83[=" +"\xbe\xc7i\x97\xf6\xda\xdbU\xb1\x9\xf6\x16\x8\xf[\x1c\xf1\xdb,4/He\xf1;.Ofd\xa8\x35" +"B\x90pXl\xf7\xbc\xc5\xec\xea\xe5\xecrQ\xb0W1Te:|\xf1\xd8)%c\xdf\xa9\xe8\x45\r\xcb" +"\xf6 \xe7\x17}\xc1\x16\xee&\xd5\x7f\xea'\xb0\xab\x86P:\xd3#\xdf\x92\xe4\x18JN5\x9b" +"\xe6\xa7o\x1\x34\xd0t\xe6\xe6\xa8\xda\xc6I\xb1\x9b\xd8\x8fT\xf3\xd1\xd7q\xa6\x87" +"\x2\xc1\xda\xcc\x34\xe5\xa4\xc5\x8e\x96\xac\xaf\xd7\xec~\xdf\xe3\xb1\xc4\x44\x3\xdb" +"\xa6i)w=\xd0'8\xd3\xb7\x80W{c\xa7\xfb\x36\xd6\x10\x39\xc9\xed\xe8N\x8u\xfciW'\xcb" +"\x92\x84\x64\x7f\x8a\xc4\xf4\x9a\xca\x94\x10\xa7\xc9\xfe\x9b\x1c\x35\xd2v\x9d\xc6" +"vY\xf7Z\x9f\x88\xe6?\xd9 d\xe8\x18;?H\xd6\x88P\x16\xd6\xaa\x91\x6\xa4\x1c\x8f\x1d" +"_\xc5\x3\\\xfcpQ\xf2\x11?UzV<\xd8\xc4\xf3\xbc\x43\xc1\xfc\x84\xc8\x42\x14\xc3\xe5" +"VP\x8a\x82\xd4:}\x11_:\x2vq\x8a\x1c\xd9\x96\rT\xac\xee\x38\x12Q\xb4\xf5\x2\xd1\xee" +"2\x90\x4\xc0\xbb\xf7o\x93\xad\x38.\x16\xf6\xfe\xf1\x89&\x16\xa7\x95V\x82\xe4Oc=k" +"\xa1\xaa\xad\xee.\xb8\xec\x45\xe5\xf3&\xa3\xfe\xa3\x8e@\xc1\xf1\xd0\x9\xcd\xe6\x15" +"\x11!9$\x1e\xf9\x16zR\r'\xd9\x42r\x1d|\xfc\xa2\xc8\x94\xc9\xd2Q\x86[Gq$\x9b\xc0\x92" +"\x3\xa2\xc8SY\x16]P\xda\xc<\x8d\xc\xe4u\xf4:\xf0\xb4\xae\xd4\xd8\x31o\x92Zj\xbcY" +"\xbeY*\xb5\xf7\x5\x1\x80\x66\xf0\xc2u\x1b\xe6\xf4U\xb4\x8b\xb4\xb6mFL$\x96\x63\xff" +"\x1c\xde\x8d\xbe;\xf1$\xe9\x8c\xbe<\x8c\xa7\x8d\x10\xee\xe5\xb4\xe7\xf0HY\xb2m\xa7" +"ab\x8c\x11\xc7\x41\xd5)\xc5\xc1\xfo\xbb\xb1(-\xcf@C+\x12\xef\x1\xd5\xfe \xbd<\x3" +"\xa2\xd4\x1cx\xc1\xfb\x82\xfd\xe7\xe8^$\xeb\x36N\x84=+\xbe?\n\xb9$\xfb\xe1xf\x7\x42" +"\x5J\x8f\x6Ow\xdf\xb7\x93\x6\x35xmJ\xdc\x89~\xdc\xc1\xaf\x91\xf2!\xdcQ\xe3\x32\x30" +"\xa3\x2k7\x80\xa1\xd9\x99\xcfs\xf1\xd6\xf\xcf\xb1\xb6\xd2jr\xf8\x82\xa7\x43\xab\xb8" +"8\xa2\xf5v\xff\xbb|z\x9b\xd1\xba>3\rD\xb7\xc8,`\x99]A@\xf0\xc0\xe9\x13W\xa1\xee\xc8" +"tH\xc5\xae\xc1\x1e=\xbW\x6\xc7\x14\xa5J\xa6z2\x90(8\xd7-\xd4^\xa6\xc8O\xc3\x85~\x91" +"\xec\x87&\\\x13\x15\x5\xe\xdc\xc0M\x1a\x64x\xa7\x97\xc3\xa4\xf2z\xa9\x92\x91\x96" +"\x1f\xb0\x10\x98\xe2\x9a~\x1e\xdf\xfd\xce\x97zI~xkS\xfa)\xa8\x13=\x12\x9dJE?\xd0" +"V\x91\xbd;\xde\x33!\xbe\xe5!r`\xec\xe8\xe9%\xf0\x1c\x1a\xd1\xf1V\x90q\xd3\xee\xb0" +"\x95k\xfcJ\xcbt\x92\xc4l\xac\x86\x10o\xe9t\xc3\xe7\xf1\xe0\x99\x34s\x1f\xdd\r\xc" +"\x9\x87\xff\x1e\xf8\x8a\x9c\xd5\xaa#\xe6\x91\x18\x99\x80\xb\x35\x17\xf4\x99\x9a\xa9" +"\x0\xdd\xc1#\x8b'\xd3h\xc8X0X<\xf8Y0\x83\xab\xe0\x45\x45\xb5\x9e\x1a\xf3]\xa1\xb1" +"u\x9e\x96\xd5xM6\xa9oSW\xae\xa2\xc9v\xf2H$N\xb3\xfdk\xc8^\xe4\x87\x19\x95\x62\x14" +"[j\x98\xebI9\xf0\x9a\x89\x15\xd2t\x80H\x8\xc9\x80\xcf\xc1UQ\x95\xe9\xe6\xb!\"(G\xcc" +"\xe5\x31!\x1c\xa4\x95\x6P\x19\xe1\x18\x90\xfe\x8dy\x88\x8d\x17\xea\xc3_a\x9c\xd2G \xe5\xcc{\x8e\x94QK8\xfe\xa8\x83*U" +" ^\xec\xa5i\xc1+\x8a\x8\x1b\xed\x10\x17\xde\x66\xc3\x46\x7f\x63\xe9\xffM\xd3\xcf" +"\x7fZe\r\x7\xce\xd1M\xd6\xc2\xdd?^%\x83\xfe\xafs\xce\x13\x33R7y\xb6(\xf7\xaayv\x86" +"F\xd5n$\x2]>\x19\x4\xcc\x9c\x1f\xc7\xd5\xaavcT\xcb\x62\xa1\x62\xe7\\\x84\xaas\xf6" +"\x82\xd6S\xb0\x16\xbXo~\xb4\x43<\x13J\xf8\xa2\x17\xf4\xb6\xe8\x6\x35qq\x3\x9d\xa5" +"\xf6\xde|\x6\xdb\xf7\xf4\x9e\xc0\xf0\x43\xeb\xaa\x33Y*\xb6\xe8\x8a\xa1n\x9d\x1d\xad" +"\xcbu\xc\xe5;\xaf\xa3r\xe6\xd1\xd7p`\xae$\xf9\xe6NH*\x1f\x39w\xfa\xc6\x8f\xa1\x35" +"\xf6\x18\xf9\xc5X\x9d\x80\xdb%\x10\xc6\xd1(\x83\xdc\x7fl\xad\x37,\xbf\xfb%\x87\xa3" +"gk\x15\x43\xd8\xa7_\xe5\xc0gk\xd3\x31\x66\x0K\xbb\x99\r\xe3\x4\xab\xd5\xf9\x11\xd2" +"b\xc8\xea\xed\x80KW\x99h\xab%I\x14\x97\xe0\xf\x8b\x8b\xdc\x90*\"\x18\xfd\xf1\x90" +"\x8b\xbdw*\x3+\xcz\xc1N\xca\xfcT\xf5H\x95\x9d\xbd\x87\x8\x42\x80\xd1\xde\xdc=\xd7" +"\x17\x18\x89\xa5vO\x8f\n\xd0\xbd\x64\xca\xce\xcb\x5\xce\xf\xf0\xf1\x9e\x16Yk\xc9" +"6\xc6\x45\xc8\x15o\x80\x8\xbaW\xa0\\/\xb3v\\N_A\xf1\xea\x83\xdfy\x5G\xff#\xc8`\xc2" +"3\x85\xa5>M\xa8W\xff\xeP\xfb\x33\xd1\x84\x80\x7f\xb1\x64\xd0\xeeU%\xca\xde\xf8\x62" +"&E\xf2\x66`\xba)\x1a\xd8 \xa5:\xce\xf2\x38\x65\x93\xf2\xa7\xae\x45mqp\xb4Q>\xf1\x89" +"\x10\xc8\x46\xcb\x32\xeaV\x89\x36\x7(\xfc\x81\xaa\xc8\x66\x1c\xbf\x16,m\xd6r\x8b" +"5\xc8L\xc3\xfd'5\xa6l\x9c\xd5<_\xab\x39\x80V\xbf&\xef<\x87|\xc2\xf1q\xb0R\xc7_(\xed" +"\xda\x8e\xe1\xaaK\xad\x4v\xec\x85\x66\xe\xfc\xb7\x1\xa4T$\x7f\x99\xa9\xee\x1fog\xa0" +"\xd6]\xc9\xad[F<\xd0;d\x16\xf3+hm/m\xfc\xf6kk\x5\x13;\xf4\xdd'\xd5\x7\xd7\xff\xc" +"\xbg\xa6U\xf9Q\x11\xecwd{l\xebNhO<\xc8\xf1IZ)\xc0\x83v\x1d`\x13\xd2\x2\xa4\x5\xa4" +"f-\x8\xd7\x7\x17\xfw\x9e\xc6\x99@\xb4\x9d.\xf-/0I&\xed\x7\x95\xefYR\xc6O\xd1\xb8" +"\x8d}\xb5R}\xa6\xff\xaf}>^\x3uEr\xcb\x4\xe9\x85\xed\x12^f\xec\xc0x\n\xf1\x89>\xe9" +"\xda\xaa\xe0\x1d\xa8\xc1\x8a\xf7\x38XK&\xc0\xcb\x34+\xde\xf1\x8d\xa5Z`\x80\xa9\xea" +"\x1c\xca\x34\x93\r\xe8\x30\xbb\xe8n P\x1d\xfb\x89\x93\xcc)D\xe4q/e\x81\x8d\x38\x9b" +"\x80\x80\xabZ\xfd\xc3X!\xbe\xe7\xd3r\xc5\x8a\x82\x38\xcd~;\xeb\x87\x92\xac\x82\xa5" +"\x16\xa7Q\xbb'vV\xe1\xec\xb5\x6\x7f\xc8\x4\xd3\x16\xa7T%6;,\xa1TpJX|\xa6\xc8x\xdb" +"\xb6\xccp\x9aOD\xb2j$\xbd\xc5\x36\xe3N\xb6p\xa5\xa5\x46\x16\x61T\x93\x39\xb5\x95" +"\xfe\x8c\xdd\x92\xabp\xbdR\\\xe7\xe4\xb7\xa7\xda\xf7\r\x38\x62\xb6\xee\xc4\x16\xf4" +"\x8\x93\xa7\x11\x81\xd7\x98\x92\x1f\x8a\xce\xc\xd2\x16\x37T\x87\x3-\x18\x63\xb4\xb6" +"\x15\\\x9f\x8b\xed\xf4\"\xcb\x13\n(\xc3\x39\x8e\xd5x\xc\xc4\"\xb0X\x9c\x9e\xa2\x8d" +"_\xab\x5\xd7*\xe2\xa3@\x8bJ\xd5?(\xac\x99\xbf\xd8\x31\x33\x5KK\xff\xbd\xef\x18\x14" +"_G8\xd7\x32\x12\x94\x94\x63\r\xae\xda~\x9b&uodVK\xac|\xd9\xd2L;\xed\xe6\x7(\x14\xf5" +"\x8ai\xa8\x64:\xea\xd0\x9c\x3\xdb~)\x1d\x1\x1a\xee\xb3\x14\xdc\x9uG\x1e\xcd$\x9c" +"\x1bJ\xe1\x85\xfcmF\xf3\xcb\xe5\x62(Tc \xd2\xac\xf4\x99-\x8b\xc4\xcfu\xc8\xcal\xe6" +"\xe4K\xdc\xa2\xa1\xd6\x44\xe0\xfe\xad\xe1\xce\xf1\xb4\x88\x9d\xe1U\"\xc4\x1e\x9e" +"jU)\x9b\xee\xca\x7f\xbfG\\H\x1d\x9\xdc\x5\xf2\x46\xf5\xb6s\xd0\x8f\x36\x8c\x84\xb0" +"D\x0\r\x6G\x94}\xf7=\x7f\xd0\x85\xa5qs\xc7\xec\xd7R\x87\x8cgt\x8a\x8d\x63\x13L\xe4" +"\xf8\x33\x93\x80\x82\xee\xc2:\x7f\xa2\xbcr\xf6\xa8\x42\\\xb2\xcf\x45\xcd\xd5\x1d" +"\x9j\xa3p\xeaw\x8d\x7f\x1d\xc\x34\x1a\x15\xacxt\xa9\xef\x10\xae\xbc\xcb\xd3\xdb?" +"&\xfd\x97\xe8\xa3i>\xccpq\xfe\xeb\xfe\x63\xccQx\xe5\xe4\xcd\xabG\xe8R\xf3+\xba\xf" +"-\xed\xe2\x95\xd5\x8e\xbe\x8f\xf7r4\xa1\xa2V\x8d\xaf\xa3\x2\x5\x44\xa5\xa8\xf5\xe8" +"\xfe\xeaq]\n\xcc\x33K\xaf+\xf4!a\x89-\xde\x39\xe2\xba\x2\xffg\xa6*VVC\xee\x84h\xbd" +"\xda\x9b\xfc\x33L\x92\x8b\xe6\x63\xb8+_:\xc3z\xcf\x8a\xba\x14\xed\x13\xdcN\xab\xf" +"Ae\xa4M\x90}\x8b]^I\x3\xdc\xec\x65r\xe1\x8dq\xd0\xd3\xbf %m:\xf9\x14\xe5\x8c\x9a" +"\xecz\xbd\xaajV\x9e`\xb2\xb8\x1f\xa9\x61-\xd3\x9cv{s\x8eY\xc2\xbd$\x19t\xc0\xf2\xe8" +"\xe7\xa6\xff\xb2\xef\xd7\xa0 \x83\xfb\x17i\x9bNW}\xd3\xebs\xebXE\x8a\xe5\x95\x1a" +"\xed\x11Z\xe9\xd4\xc6v(\xf7\xca\xb0/\x95M\x9c\x1c\xe1\xd6\x33W\xda;\xcd\x43\xc\xa4" +"\xce\x82\xf3\xf4\xd0:,AD\xdbQ\x92\x46\x89\xff\x45\xe4\x1f\x46u\x19Sh\xf2\xf\x36m" +"M\x9c\xb7\x9c\\\xb9I\xd0\xbh\x86\xd1\xd5u\x93\xfdSi0]o\xbd\x81\x85\xb\x9bk\xf4\x33" +"\x81_\x8\xa1\xec!\x17,\xaa|\x7\x61\xdb}\xf4\xbd\xe1\xdf\x64\xa0\xa2\xfb\x12T?\\\xf0" +"x\x1b#\x84\xcf\xc4q\xbfv\x2\x61\n\xb7\xf7 6\x8e\x35l\x98\xcd\xe6h#\xe3\xb0\xf0n\xb9" +"\x17\x14yi\xef\x83\x19U\xfa\xa5\x91\xdb\x99\xaa\x11<\xd1\xda\xd8\xc8\xfa\xbe\xa8\x86\xc2Yd{\xcck\xab\xe6\xe\xf6\xbc\xce?\x17\x17\xc8" +"\x1d\xb9\x19\x9c\xc5\x92\x96q\x1f\x82Je\xe\xf6\x1e\x89\x94\x87\x6\x1\xf4^\x8f\xce" +"\xb9O\xee\xbf\x8a\x61~\x92\xe\x19\x7fXY\xb7\x90\xb2\x44\x30X\x11\x46\x9f'\r~\xae" +"\x8d\x35\xf1n\xb0\xb2\x12)\xa5\x83hD\xf2-b\xd1\x63\xc7Z\x1e\xa3\xcf\x1b+\x81\x1c" +"t\xc3]}\xc7h\x13\x15\x1c\xc8\x14\xb1\\\x80\xa2vN\xbb\xd6\xf2\x46\x0\x37{GRS\xc9k" +"\xf7\x8f\x39/8\xfa\x8e\x7f\xf\x3\xfv\x96\x9e\x9e\xcb\x43P\xd8\x8f\xd2\xee\xbc\x9d" +"'R\xdeknnA\xd7|\xbd_\xe9\xfdW\xcR\x89!\x8dX^\xe5\xa5U\xea\xe8\xca{i\xf6\xd2&\x6%" +"hAZ\xe9\xc3\x86\x84L\xd4G\x5\x39\x9e\x31\x1a\xe\x15re\x0\xf6\xd2\xb3\x15q7\x11\xb0" +"\xf8\n\xf6\xdb\x14/\x9d\x94I{\x8aHw\xa8\xa7)\x6\xa7\"\r\x38sO\xf8h\x4\xc6\x94:\xd4" +"\xa2\xf8\x95\x95\xc5\xf\xf8\xd8\xa3\x9c\xe1\x9XYtC_2\x4\xc5\x10\\geG\xef\xb\xce~" +"\x8e\x80\xc3\xc8\x1c\xe7\xab\xaa\xcb\x90M`N\xfe\xac\xee\xfb\x2Xai\xdc\xd3~\xc5\x7f" +"l=O[kZ?5El\x97\xde\xb6\x14\x66zJ\x1c\xb9\xb6^\x99\x97\x88\xee\x2Z\x11Q\xb7I\xcaK" +"\x95\n\x1a/\xfe\x5\x13\xe7\x1a\xc4\xdd\xb2\x4\xe0n#\xf4\x43\x1e\x38\xac\x41\x91\xe1" +"(v\xd3\x32\xc8\r\x9c\xf9,\xe9>V\x1e\x31\xc2\x17_\x82V\xe2\x32:\xdc\x8f^:\x2s\x90" +"\x81\xc\xf8\x98\x7\x85\xc2\x91\x2yN\x8b\x8c\xdd \xc4\x43\xbe\xea\x34\xcd\xb6g\xc6" +"\xb7\xdb\xc8\x1c*\xb3\x16\x19\x1d\xab\x1c\xe@F<\xb5\x9e\x13\x9a\xdc\xfbm\x9e'\xbb" +"\x8d\xb8\x64\xc7\xf2tgB\x7f\xd7L\xeb\x82\x81\xc6\x6L[\x19\x1a=\xce\x10\xda\x43\xf0" +"\xc8\x83\x87\xad\xf9\xa9v\xaa$\x0\xdb\x9b\xfd\xb4Y\xe4,\xf6\xb0\x9b+\xdf[\xe0\x8" +"a\xca<\xe8\xa2\xf2=cC\xfK\xf2{7\x89\xfb\x1\x98k\xd3?\xa4\xad\xedx\x98v\xc9!\x2KU" +"\xfcm\xa1\xdd\x34\x9b\xabL\x8a\xdcKt\x97tz\xd3w\x2\xeb\xe0\xe6\x1f\xfb\xe2\x7\x64" +"\x83\x33\xa7\x5\xf3:>\xf1\x32\xc6\xb3\xa9\xe7\x18\xa9\xb3\xa9\xe4\xd7\x85\x39\xc3" +"\xde\x9b\x3\xcb\x13\x84\xc6\xbfl\xf7>a\xe4\xf>Z\"%\xe5\xdeHzT\xef\x99\xc4\xee\xad" +"H\xd8K[U\xfd\xfb\x86\x9f\xfd\xb1\xabO\x9b;\xd8\xff\xe5\x98\x83\xc8\x19;QN\x9b\x80" +"u\xc5\x82\xb5\x9f\x19i)e-\x87\x99\x86\xe7\xee\x8\xf9\xa7v\xcf\xe0\xe3\xa0\r\x7f\xc3" +"\x86\x94\xc1\xb2\x62\xab\xfd\x81X/2\x13\xf9\x99\x63\xa5\xe\x9c\xaf.\xf4\xee\xc3\x18" +"q\xbd\xe0\xbd\x14\xd5\x8bT\xd3\x1d\xe2_\x12\xa5\xfb\xab\xec/\xbb\xf4_\xf0\xe7q\xd6" +"k\xda^\xc4+\x5\x8b\xe8\xa2\xe4\xa4[B*_T\xb8{.\xf2\xfa\x64\xe\xc0Q\xcd\xedW\xb7\x8e" +"0dn\xa9\x61\xc7t\xe5$I\x12G\x6\xc1\xa4\x4w\x8e\xff\xe6_\xba\xa1{\\e\x13\x5\x1`\x92" +"\xa7\x35\x5\x1f\xe\x18\x0z\x86\x61\x1\xce\x8\x10\x1f\x61\xf5\xc9}\x7f\x9e\x38\x86" +"\xd3\xd3(y\xa5\xf5H+R]e4.\xcc\x8b\x64\xc7\x38\xed\xe5\xbf\x1d\x63.\xd6\xd8\"G$\xdd" +"\x95\xf9\xf9L\x93\xd3v\xe\xa5\xd1\xa3\x17G\x93\xe4\xdb: P\x86\xb\x1c\n\x41\xb9\x65" +"\x19hX\x1d\xe3\xb1R\xa8\xf7.c\x9eo\x8f$\xa5z\xd8\x16\xa0\x33\x14\xb1\x3K\xfb\xb4" +"7\x8b\xd7\x43s\x0\xfjm\xa5\xfcJ\xd6\x9b\x12\x18h\x8ci\x99\x38\x63\x1b\x10\xb5\xd8" +"\xde\x64R\x88\xbaH\xe9\x8f\xa2\xbe\x17\x33\xf7\x14\x97\x7f\x61\xc4\xa3\x8i^f\x0\xb0" +"\xb6\x1e\xca\xf9\xdd\x87\xb8\x16\xa3\xf1\xd8\x93S;6\xc3\x3\xc6\x85S\xc9\x1c\xe8\xf3" +"qq4\xda\xf1\xd0\xa0\x65\x46&\xfb\xd6\xa3\xc6S|~3\x96#\xb4\xc4\x62-\x1a\x91G@\xb7" +"\xe9\x61\x1f\x35\xb1h\xf5\xd1\xc1\xf4]\xex\xbf.\xc3\xe2\xf1\x6y\xb1i\xa2G|\x9d(l" +"\xa6\x9e\x39\xf\xb3\x14I\xc1\x93\x8ay\xa6\xcd\\\xdc\xc\xd2\xe\xd6yw\xbf\xe4&\xfd" +"\x96-\xef\xceH\x1aV8\\\xdet\\\x84\xef\x8e\x13\xc4\xe8\xa4\xe4M\xc0\xf4\xd8Ia \x8f" +"b\x99\xf5\xd5\x84\xfd\xae\xfcg{\x3wh\x84<\x11\xe1\x3\x13\x10\x15\xdb\xb7?\xf1\x62" +"\x9a\x93\xb7#&\x90\xcf\x10;\xafV#J\x96\x13\xfd\xc7X\xf0\xe\xfe@\xd0\x80\x63\xd8W" +"\xcaoA\x9c\xef\xc8\xf0\xa7]\xa1\xda\xc\x94Y-X\xd6n\xdf\xc4\xb1Z2\xdep3\x87\x0>|}" +"\xb0Q\x1:\xa6\x66\xa7\x45+#\xce\xe8&\x7\xf2\xc6\x92\xf7\x9\x17\xfa\xce\x96\xc3\xc7" +"\xa0{\xd6\xadN*5\x86\x6\x10~R\xf7\xd8|W\xf6\xca\xa3\x46\xa5\xbe\n\xd6i\r\xec\x1p" +"{h`\xd7\xf8\x6\xf5\xe9\x15\x8d`\xe1#\x6\xb8N#\x87\xc9o\xe6\xca\xac\x42\xedmk\x8c" +"\x15\xcf\xd6KI\x90t\xc1\xeb\x63H\x9f\xab|(\xdc\xa5)u\x9f\x84\xc2\xc4 \x0\xe1\xde" +"89\x96\"\x7\x8d\x9c\xab Q\x9\x1a\xfa\xc1\xbf\x1e\x44\\$A\xb4V\x9\xb5\x82\xe7\x93" +"\xe8\xb8S\x8a\x32\x63\x1d\x9c\xd1rW\xc9h\x93M6g[!\xa8\nh\xaeQ\x7\x4+\x6\x7f\xa8\x1" +":\xcc\xbe\xa4\x11\x1f\x9d\x8\xe8M\xdd\xa1Q\xf7\x97\xdf\x1f\xa3\xdc-~\xa1yy,\xc2\x9e" +"9\xf8\x9d\x98\xdf\xb1\xa7w \xed\xe4\xf\x92\xc3;~\xd5&\xd5\x81\xe0<\xa5(!\x86\xa9" +"*|\xa1s(\x94\xe_5\xadI @\xb5\x87\x39\xfb;\xfe\x8\xf2\x5\x9e\xea\xf8\x91\xbb\x42\x90" +"\x8eN\xb0\xdc\xc5\x1c\x7f\xb8\x10\xe5~\x99#_\x1dn\x1a\xd7;\x9\x84_\x3[Uj\xb2\xd9" +"\x81\x91\x1d>\xc1\x99\x97<\xe9%\xeb\x8fq\xc9\x18X\xd4\xe8\xbe\xfd\x98J\x85\x18\xda" +"|)\x87\x92Y\x19/\x81\xc5\xb7\xc2\xb\xdfX4\x11W\x8f[0\x8eh\xb3kt1\xea\x33\x39\x42" +"\xab\x1f\x9\x1d\x86K\xad\xf2\x46\xc3_\xd7\xe8\xe4\x9e\xd0\xdc\x94j\xcc\xc4\xff\xec" +"\x17\xe2;\x10J\x9b\x10\xc1\xfa\x8e\x63\xb4\x66\x1c\xf6\x1fi\xf3\x94\xfa\x1b\xc\x97" +"\x2\x31?\x9e\xae}x\x8e\xe\"\x44\x1d}9\x1d\xaeN=\xf4\x1dU\xaer\x91\xc2\xc4\xb2\xbb" +"/Ra_O\xe0\xbc\x1eJ\xfa\x45\xc6\xf6\x42\xf8\xf5\x66\xcf\xea\x41\xbe~\xd4\xb4\xea\x9e" +"\xac\x35\x84X\x7\xf3\x42\xea\xdb|\xf2\xe1\xb5\xe3\xe6\xca\xce\xa8vQ\xba\x4q\xb8\x9" +"a\x93\x13\x43)\xd9`Q\xc6\xbf\xed.\x96\x3\"\xe5m\xe4\xd1\x8c\xdc\x35#\xcb\xc0\xa5" +"t\xda\x3\xca`\xe0\x8diP\xe3\x32't\xb2\xe4'\x1b\xe9\xe\xc9\x61{w\x8d\xf5\x94\xcb\xac" +"d\xbdG;\xec\xbf\xd2(\xcb\x8d\x8e\xa6\xd3\x1b\x44\x16\x63\x8c;\xb4W\x9h\x8e\xd2\x1f" +"|\xd9\xac\x8d\xfd$\xb0\xbb\xb8\x65\x63\xb\xbbR+2\x99[2\x8b\x14\xb1\xcd\xba-\x89\x87" +"\x15\xb5\xbb\x1c[\xd9X/0\xb\xcd\x42\x9e\xf7H\x8e~\\\xac\xea\xed\x9\xc0\xa7+\xc3\xa5" +"\xe6JVm\xaf\xe6\x65zU\x1bX\xd0\xde\xa9\x98H\"\xa3\xac\x8c\xec\xf8x\xfa{\xfc\xc6\x84" +"\xab\x34h\xc2\xedSZ\x8e\x13\xb\x46\xd3\x1d\xbe\xa0rp\xe4\xfd\xa1/p\xabh\x8c\xf5\xc8" +"\x82\x64\xf2\xb2g\xe6~\x82\x64\x8f\xb0\xb7\xfc\xeb\x32\xd3\x37\xc2\xef\x7fv\x90N" +"_\x98\x96\xa9\x45SC'\x9c\x93\x9d\x85\x16\x18,\xa5$''\x5\xcd\x2VJh\xe1\x31\xb1\x64" +"\xe2\xb1\x89\xab\x6\x30Y~\xa3=m\xee\xf0\x43&\xacT\np\xe8\xc7\xb8\xc0\x3\xdc\x13O" +"\xe9L\xf7\x62\x92|\xfc\xcc\xd8\xa2#\x1d\x9c\x42O\x82t\xd7,b?\xa5K\xc4\xe3\xaf\x38" +"[\xd2\xa0\xf1;Q\x82\xe4\xd9l\xa0\n\x94\xcc\xa7\x9c$-\xe3\xd7~4\xad\xe8_\xf5\r\x17" +"=qX\x8a\xc\x19jZ\xf3\x31\xed\xeb%\xf8\xd6\xb1Z\"g\x19\xb1\xa9\xca\x39\xe0\xd7\xda" +"\xc8\x98y*\x12Zv9\x3\x90\xd5m\xb8\xaa\xfanN\xfe~drk-d\xa0\x5\x9f\xd2N\x9eT\x0.\xea" +"P\xb5\xef}\xfa\x3[\xac\x8c\xc2\xab\x41>N\xfe^\xb\x36\x32\xf2\x39!\xb0\xc7M\x95\xe3" +"\xb7\x98\xda}\r\x13\x42o\xae\x3\xf0\x18\xf5\x64\xd7\xcdN\xb9'\x13\xcb\xbf\xd9\x5\xeb\xc8i\x96\xbbv\xe3`\x80\x1e`.&>.\xe8,M\xed;" +"yk\xc6\xad&\x3_\xbd\xd4\x8a\xccL\x1f\xee\xc4\xdc\x99\x19\x64\x1f\xe6\x88\x95he\x97" +"\x7f\"$\x90\x86\x80\xdcIon^\x18-\x93\n-\xc3\x8b\x33l\xdc\xb\xd1\xd5\xce\xec=48\xa7" +"U\no\xf1\x46\xbe\xf1\n\xa0\x1a\x8I\xf7\x15\xdaRZ\xbf\xc0\xcc\x31\xbd\xb1\x87\xe9" +"w\x82z\x8f\xd2l\xd7tWMV\xb9\x44\xd0\x94\x88\\y\xc6(\xb\x98\xc4\xdf\x88\x1a(\xc2\xab" +"\xf8iY\x7\x31\x8d\xed[8\xc2\x99\x9e!\xe9H c\xc3\xfen'\n-\xfa\xe0R\xe2\x96\x11\x95" +"\xf6\xe6mP\xc0\xeftHUb\x3\\\xf5\x65\x90\x62\xc2\xd2\xfa\x4\xa5\x99}%9\xc6\xea\x7f" +"\x9d\x37\x1a\x7f/YL\xf5\xda\x34\x64\xc3\x0\"\xed\x9\xf\xf\x37\xd3\xbf\xek\xcY\x82" +"\xfd\x14\x6U\x88\x16\xc4\xed\xe0\x82\x12`\xce\x92\x1a\xa3\xd8\xd5\x87\xf9\x65\xfc" +"{g\xbe\x99m\xf9\xcc\xe6i6cV5it\x9fz\xf\xca\xfd\xb\xb1:\x90\xb8\xb3\xa8\x86\x42\xf9" +"\xf1\xe6\x65\xff\r\x84\xc5G\xcf\x38\x30H\x93\x8et>\x1aS\x9c\x12v\xde\x42\xc8\x95" +"\x5\xd1\xc5\xe5\x91\x66\xc2-g\x91\xa7*1\x9\x88l\xc9U\x99wh\x89\xfd\xc6&K\x14\xae" +"\xfc\xd9R9w\xd9\xc8\x91\x8fXi\xf3\x98\xe3\xaeP\xb3\x8a\xb1`}U\xe5\x97\xbe\x61_\xeb" +"-\x3\xa6\x1cW\x98\x99\xe5\xd5\xae\x9c\x15G\xa4\x1bvrY\x15T\xee\"+Z\xe0l\x9c\x89@" +"\xb7\xb8\x4\x39\xda\xd4\xc9\x85\xca\xd4\xb4\xe7 \xcf^\xc0\x88>T\x9b\xed\xd0\x39L" +"\x1c*\xb6\x90\xe4\xf9%ZH\x97\x7\xef|c\xbf\x86\x7\x90mf\x82\\Qeh\x16\x41@\xcc\xd9" +"\x0(\xfb\xcb\xe8sR\x0\x7\xa4\r\xcz!vAU\xbd\x9a\x2i\xee\xb4MR\"\xf5|\xfa\\\xcb\x84" +"\x85\x93\xf5\x34\xdb\xab\x0]\x8aO\xd5\xc8\x97\xa4R\x19\x46\xd0\x15%z\xbd\"\xd4r\xb5" +"1V!s\xaa:\xcc\x93,\xeb\xfd\x17\x8\x8b\x45\xdf\x2\xe9\xd1\xde\x9ev\xc9\\/\x8d<>\xf4" +"\x11\x18\xf4\xd6\x84\xac`a\x98;\x16\x44z\xa9Jz\xde\xbe\x8f\x95\\\x1c_\x8\xc5J~TC" +"\xb8\x91\xfal\xb1!\x3\xc5\xb6\xd6}y\x88\x44\xde\x88\xfb\xf2\xd6\xb9O\x12\x34\x89" +"\xae~P\x89\x63\xe\xd3\xff\x9c\xf3I\x1fo \xa7\xaa\xb8\xab\x39^FC=\x9d\x83og\x1d\x63" +"\xd9\x89\x9V|\x82\xa4i\xc1\x16@\x17\xd4G$\xc9\x16|\x7f\x90M:O\xe2\x93/\x9ev\xa8\x84" +"h\x96[\xd3_j\xc7s#aTf\xe\xb4\"\xc2U\xd4\x8e`\x99\x64I\xa0\x18\xbb\x19$\xdd\xbHl7" +"\xa5\x95\x9coXX\x8I9\xb1\xd3!\x15\xd9\x5\xd9\x17\xa0W)\xa3\xcd\xd2J\xa6\x9c\\\xff" +"\xd4\x1f/\x80\xab\x10\xe6\xc3\xaf\x88\xcc\xba\x66\x1f\x8b\x39\x7\x11(\x9c\xed\r\xda" +"\xf\xa7\xa0\xd0\xc2x\xbb\x85\x83i\xd6\xd3|X\xd6\x1d\x38o\xc7\x8f\x65\x33q\xe5\x6" +"\x82#S\xa8k\xc7\x34\x82]\xbeW\xe4\x1a\xe6\xcf=\xa4\xd1\xf8\xd6\xc\xad\x81\x61\xed" +"\x94\xc5\xbK\x99\xabL\x88s\xed\xbaK\x1fn\xba\xe3\xafO\xfdn-\x1b\xa6\xe7\xc3?'y\xcc" +"\xae\xa3i\x16\x34\x65\xa5\x31\x93\xbbhR\xf3\x90\xe5Z\xbd\xe1hG\x81\xa9\x63\x6Z\x5" +"\xb4|\x7f\x16\xbe\x88+7\xa2\xc3\xa5&\x98T\xbb?'\x1f-\xd8\xb1\x33\xca\x8b`.\xc8\xbf" +"1U\x5<{\x9a\xf6\xc6u\x92\x42\x8e\xf8\xd4+\xa0\xc4\xd4\x65\x14\xd7H\xdd?\x87\xa4\x62" +"\xaa\xc4\xb0\xa1\x1dLM\x16$\x97\xbe\x96\x8b[#\x1d\xbc\x9a\xe7:6\x93\xe\xde\xf0\x11" +".\x10\xea\xce\xd6\xe8}\x5\x11\x92u\xa6T\xfd\xff#\xb\xc6P(\xcfN\xb5sm\xcd]\xdf`\xfc" +"yVn\xfb\x92\xfaj\x7\x62[\xa1\x1f\x42\x0lhT:`v\xb9\xf1\xc5\xf\xc9\xd4G^(6\xbc\x83" +"\xbb\xc5\x14\xe\x99\xfa\x84\x3\x65\xbb\x7\x1f+^\x12\x45\x89\x15\x10\xa4\xc2 4\xf7" +"\xb0\xc0$V\x98\xe9\xd9\x84\x42-B\x82\x0\x41(\xd3\x8f\x1\x9b\xeb\xb7\x9dJk\x9b\x98" +"Z2<\xf4\xa7\x94zjV\xe9\xfe$\x9b\\\x8f\x87\xe2p\xe5\x96\x4(`\x82\xa7#\x8d\xa7\xfa" +"\xc8\xd0\x3\xfbr\x17\xacp\xd8\xd9\xd0%\xa3'\xcao\xd9(e\xac,MQW\xf1\x32\xd2K:\xa4" +"\xad\xf4\xa3\x95\x41\xbfL\r\xaf#\xf\xe2rj\x6\x9f\x33_\xc7\xd7\xe5\xf8!\x8dX\xc\x7f" +"\xfaM\xe6\x99\xb0\xc8L5\xa5\x10\xbf~dDi\xaf\x32\xa2\x61\x64\xc8\x9\"\x9f\x91\x92" +"\xd5:\xaa\x99\x82\x8c\x7:\x9c\x82\x8eYl\x12.;\xb0R6Li]\xe6\x8c\xca\x93u\xbf\xf9\x82" +"\xe1\xa0h\x1\x7f\xb9\x39][\xba:\xd8\xea\xcb\x66\x31\x8b?\xbc\xb1qQ\xed@\xc5\x3I)" +"\x93\x43\xb7\x97\xf9\x46\xec\xb7[\xd3l{\xb8\xc3\xd4\xd8\xd9\x9e\xb1\"y\x94W\x3y\xf6" +"\x8\xd2\xb1\x65\x44}\xaa\x63\xfa\xdc\xf8\xd6\x34\"\x16\x9d\x97\xb0\xacpe\xbd\xe0" +"\xec\xdco\xcb\xbf\xbcs\x8c\x88\xe6\xe8\xa2\r\xd9S\xc9\xc0\xb4\xb8\x8e\x1@+\x8\xd6" +"K\xdf\xc3$\x5\x7\xa1\xc9=X\xbc\xd8 \xc7\xf8\x86)L\xbd\x6\x13\xe8{\xf6\xd0\xf4\xc2" +"\x9u\xab\x63\xae>\x1b|\xe1\xae_\x1\xc2\xec\xc1\x8e\x89\x33\xc5\xbb\x9bs\xe6P\xff" +"\xb7\x1d\xea\x15>\xa0\x63\x37giC\xa9y\x8e\xd5\xca@\xf7\x4\x92\x30\xdd\x9e\x8\x33" +"C\x14\x83=/)\x8eK\xd3\xd5\xfb,QVl\xc1yo,>\x1b\xb5\x62#[\x91o\xea}8ro*\x18\x91\xdc" +"\xe\xe7\x4\x31\x36\x83=\x91|\x15\xcZ\x7f\xdf\x41\xdc\x18?\xec\xc1\xdd\x6\x13\x66" +"\xb\x0\x0\xfa\xc5\x11|\xe2\xcc\xba\x18\xd1l\xdaI\xc2\x1f\x85N\xb7\x97k\xdb\xb\xa9" +"T\x1c\xa5S\x1e.<\xef\xb5\xf8w{\x98\x9f\x9f\x82^\x82\x1a\xc5\x96\x16\x34<\x9f\"\x8d" +"\xfb\x4\x99\x96\x7f\x44$$\xa4\x3\x9b\xba\xc6\x1b=p\x14\x8a\x38\xa6n\x89\x8|\xce\xf8" +"F\xd5\x83\xdc\x8ej7\xb0\x31\xe5:\x94\x3\x8bV\xb\x5\xca\x16\xee\xc3g\xa3\xb2X\xa6" +"\x96\x1f\x9aH\xc3\x8b\xb6\xdd\x98\x86\x6\x1e\xec\x86\x3\x9f\xe5\xf8\xf7\xa8\xaf\xa9" +"7\xf2\x13w\xc\xc0\x62\x9d\x61\xc7\xb0#\xf0\xf9\xb1?\xf4%\xa0\xb2\xdc\xe1\xfen\xb7" +"rK\x0\x1a\xa4\xc1\x87\x93H\xdf\xca\xd1\xc5\xc9\x35SD\xa6\x9e\x98\xd6q\xed\x81\xc4" +"!MtT\xd5\x7f\x36p\xa1\x14\xf6\x97\x38\xc\xfdz\xedo8g\x92\"\x43Mt\xa5\x93\x10\xfc" +"\x99H\xf3\x15\xf\x80\x8\x96\x1a!\x9e\xfi\xe4\xa4\x10\xf0\x13\x64)\xac\x97\xe\xa1" +"\x94\xed\xac\xcf\xe5X0\xa7lk$\xac\x44\xb3+L\xcb\xa0\x1#\xf8@I\xb8Y9\x10\xc7\x14n" +"\xa1z\xac\xe0\x85\x9e\x8f\xff^\xe1s-6B\xcb\x35\x9d\x41\x91\x97\xf7\xdc\x1f\xf7I\xd4" +"i\xf8\xe8\x8a\xeb\xbe\xab\xb9_W9z1\xc9\xfa#N\xf8\xfa\xac_\xee\xa2w\xb7\x8a|\x6\x13" +"\xf1\x84\x45\x8b\xe7#_z\xfe\xd6\xd8\x82L\x1e\x84\xe3\xd1\xda\x9a\xed\xc6\x1d\xe2" +"'+\xf7\xa6\x33\xd6\xa3\x3\xe7w\x12\x34\xb6\x83r\xb4U\x3l\xb1W/ j\xad\xf9}N=\xb7\xc8" +"H\xf5(\xb5\x83\xbaY\xd9\xf7\xc3$b\x93\xeb\xfb\xef\x15\x9\xfe[\xe5\x41\xd9s\x81L\xac\x45\x86mk" +"\xc3&X?\xf4R\xb\xab\xa7\xd1\x7{\xd0\xd9\x1b\x95\xby\xf7\xab\xd9\x8a\xbd\\\xfat\x94" +"\x11\x65\x1d\xcf\x62p\xfb\x9dK%\xa9\xe3\x43\xf1\x33\xb4\xd7\x87\x95j!\xf4\x37**\x13" +"\xb6\xc1\xa6\x11\xb1\x8d\xc5\xb6\x19J}\x94\xf6\xc0G\xd4\xd5\x4peCR\x9cU\x19\x62\x8a" +"fF\xa2\x9a\x9f u\xea\xe8_8\xc2\xcb\xaf\x98\xf5\xd5\x96\xfd\x32p\xce>\xb0\xf\x61H" +"\xde\x89\xa8G\xdfYu\xda\xfe\xe9L\xfa\x33\x1c\xfb\x0`\x12\x8\xc\xc5\x32~\xd0\xb2\x17" +"\xd4\"\xdfv+\xbf\xdc\x66\xd1\xa3&\x7\xe0\x30\x1e\xcf\x7f\xc7q\xc7\x18\x44\x3\xed" +"\x1a\x6\xea$\xe9\x8c\x6\x45k\x82\x9d\xffxhs\xc8\xd9\xeb\xd1y\xb3K\xd0\xcf\xb9\x1b" +"r\x9b\x93\xb\x8b\x1v\x85\xf2Y^\xc9\x8dq=p\xf\x44\xf3\x88\x1f\x8a\xf8\x5\x8d\xf6\xe3" +"\xb0\xfb\xbe\xf0\xa0q9mfY\x84@\xaa\x83\xa1\x61\x8e'\x80\n\x99;vJ\x8r\x5\x89\xc9t" +"u\xcfP\x7f\xfb\x8e{\x9e\xc5\x92\xf0\x1f\x97i\xb9\x9fT|\xe6\xf1+fQ\xed\xc7\xc3\xe" +")^\xbb\x83\xdf\x9c\x9\xe2Nq\xf3\xe9\xd3\xc3h\xf9-{\x0\x81\x88\xac\xda\xc2\xba\x61" +"y\x8\xfL\x1f\x87}\xb2=\xa7\xe9>Sm\x83\x96\xc3\xfb\xfe\xf9\x43\x1c\x81\x45\xe7\xe8" +"\xb9\x80s\xb6\xbd\xdf\"\xa6\n\x1b\x95p\xb2\x1f\xfa\x32\x9c\x11\x17\xba\x80\x3\xf8" +"\x9ck\xdb\x3\xb7\x1c\"\xc9P\x94p\x1a\xf5\xa3\xca\x1\xe6\x9d?xe\xbc/\xe1\xae!0\x99" +"\x85jaC2\xfb[\x2\x43\xca:\xc8\x16\xce\xef\xb4\x2\x9a\x46\x3=\x9dG\xbe\x96\xc1@B\x19" +"\x7\xc1\xf0\x13\xb4\x89l\x92{\xe7}\xec\xb9\x8bW\xf1\x46\x1a\xa5\x92T6(\xc8<`I\xf6" +"\x1f\xaa)\xc4\xa5\xe\xee\xb8\xfc\x42,(f\xae\xc2\x32\xaf\x44\x14\x4\xf2\x36\xd4\xb5" +"\xc7\xf0^\xd1x\x1dY\xda:\xa3\x45pLI\xe3\x81p\x86\x8e\xa3\xf7\xc2\x9cK\x98\xd5\xc6" +"C\x96h\xcck[\xfb\x9]\x84\xad\xe1\xb4\xc4;\xff ^exR\x19}\x89\xd9\xcc\xf5&\x8e\xcc" +"\xe2\x8f\xf0\x96\x14\xb6W6>\xe7\xc3\xe7\x2\x43\x81\xc7\xc5\xa1\xc1\xbbZ\xc6l\xfd" +"\xa3\xd3\xdc\xdfVh\xa2\x82H\x3\xb3\xa3\x94\xb6\x1c\x9c<\x89o\x9Y:\xce\x45\xca\xb6" +"\x97\x64\x41\xd7'j gx\x1b\x18Q\x4\x8\xdf]\x9\x61^\"T\x7\x5\xe\xc9\n\x7l\x10\xd0\xae" +"6\xd3M\x16\xe1\xaa\x3\x1d\xf7\x31Pe\x1d\xcfN\xf7\xc4\x9a\x39\xc:\x6\x83\x97\xdf\x87" +"\x11\xea\x9b\x1c\xad\xbcIj)p\xb4g`4\xb6\x12\x39s`\x99\xcc.p\xdf\x8c\x64\x6\xcb\x1d" +"W3\xc\x39L\xcc\xf1\xc4\x85\xd2\x35\x13\xb3\xfb\xe4N\xb0\xe4\xa1\xbd\x9b\x13X=\x17" +"\xfc\xc5T\r\xc0I\xfcn#8\xf8\xfb\xc1%\xfe\xf3o\x1b\xe2=\x9a\xd3\x88^\xc3\x31\xd2\x41" +"(Sf\xb4\xa4.\xdd\x8\xb2\x97\xc1\x15\x8c\x9e\x65\xd7#^\xac\x13\x8f\x5\xba\x97\xd7" +"\xf9[\xba\x37\x5z\x9\x41,?\x91\x91,H\\];\xednP~;|fx8U\xed\xe3kU\xa0z\x16\xda\xe\x61" +",\xea\x93<\x6%\x14,3]\xfb;\x9d\x89\x42I\x8e\x8f\xab\x15\x94Q\xc4\xc1\"\x98\xab/Y" +"l\xaa\x5\xbf\x8e\xba\xf4'\xb5>5\xd6\xba>\xa6\x30\x80\x66>-\xb7[\x11g\xca\x92]zK\x5" +"\xd1\x9dqr,8\x8a\xaaNV\x90\xc1\x9c\x36T\x6\xe4\x35m{w\xef\xd9\xe6VD\x98\x44\xfd\x64" +"|\xd1\x96\xf9\xf1Y \x9d\xb5\xaf\xd8\x9f\x66Lj\x1f\xf6\x1f\xaf\xd6\xb7N\xb \xf6\x89" +"\x93R\x87\xac\x96\x1b\x83\x1b\x32\xfb\xe4\xc1\x9d\xbf\xe2\xb3\xdf\xdfN\xd4u\xc6\r" +"w\xc3@\xc6w\x87\x3\x61\x84|?U}-\x8f\x87\xd5\xe8L\xfc\x8e\x1e\xec\x98\xa8\x81P\xe5" +"\xb1\x62\x15\x3\x19\x1d\xf9\x89\xd4\x8d\xc3\x5\x2\xdc\xfe\xe2\xf1-V{\r;\x1f\xa4\x19" +"\x98\xd5\xfc\x9d\xc\x1d\x1f\x83\xf8V\x3\x38\xbb\x10\xe#2\xb0&\xa3\xcd\x1c%\x1fU\xac" +"\x8e\x42\x61\xbd\x9b\xba\xbfv\xa0p@\x2\x39gl\x1au\xb\x34J\x8ch\xff\x46\x8d\xa0\x3" +"\x15\xbc#\x1e\xad\xb2\xde\x89\x99\xcc\x66\xb\xa3\x3\xa8\x61G\x14\x66g\xe3,\x96J\xf6" +"J!m5\xb8\xaa\xe3s0\x8cu\x2HW\xc1\x1f\xba\xa5W\xd9x\x13\xf\x42r\xc9\x92\xbb\xe5\xff" +"[7\xbf\x18\x93\xba\x93lj]\xac\xb1\xfev\xb1\xae\x1\x11w\x16\x33\x80\xb\x9f\xdd\x8d" +"\xf2\x8b\x86\xef\x38\xf5\xbf\x6\xf7=\x9u\xaf\xcam\xae\xd4\xb4p\xd5\xd4NRx\xe\x2\xed" +"\xeb\xaa\x8e\xc0rL\x92\xb3O\xfb\x62s\xefOT_\x11WS\x7\xa5o\xf2\xa3\xb4\x88\x3@PQm" +"9k[\xd8k\x3KN\x81X\xc9\xc5\xed\x8d\xdfg\n\xf2\xce\x38\x8d.\x1eg\xb5\xbe\x11\xd8\x41" +"\xc0\xe6\x94\xe5\x34\x9e@\xe7\xa3\xb5\x34\xd9\xd6Y\x8dp\xef\x19\x1d;\xd9\x5\x85\xc0" +"\xab/Z\xcey\xcb\x6\xb4\x9b\x45\xf7\xc7m\xffu\xa8;(7O\xa4\x64\xb9\xf2\x9dPy\x8\xba" +"\xd0\xa7\xcf\xea\xa9\x13\x8\xeiE6\x15\x65\\\\\x8f-H\x9cv\xf7l\x80\x12i\xecG\xe5\x33" +";X\x8aJo\xa6\xd1>\x3\x9fR\xa0\x95!\xa7\x90\xd2g\xa9\xd2:\x16\xd6\xd8\x1b\xdcN\x6" +"\x6\xec\xfc\x66\x87\xf0\xbe\x8d\x9\xa2\x90\xad\xe3\xe7\xf0\xa7\xf2<\x9e\x36\xac\x1e" +"\xe1&\xe2\x18M\xa7\xf2\x92\x36\x8a\x8e\x87\xc3l\xb9\xbj5\xe3HQ\xf1^0.\xe3.\x8f\xb" +"M\x16\x33@\xa1z\x11~%\x14\x33\xff\x95p\xba\x8dq\x92\x35\x93yc\xbbM.4\xc5(b\xe4\x4" +"<\xf2\xc2\"\xdd\xcb\x85\xd1N\xe3\xab{\xb9\x66\x2S\xbf\x6!!\xdc\x65\x33J\xe2\xe2\x39" +"\xda*[\x6JU\xfc,\xe6\x34\x3\xc6\xaf\x32\x66\x1c\x33R~\x83\x97\xb3\xa3\xe9'\x97\xf0" +"TpWj\xe3\x15\xc5Q%\xbb\xb4\x37\x81(\x0\x1d\xcd\x64\x9c\xf8Y9c\"O\xc4R\xae\x8a\x84" +"\xac\xbe\xe6\xb0\x46+K\xa5\xe6\xba\xb2\xfd]\x9b\xbe\xc7Tqk\xfc\xc5t\xdf\x34\x0r0\xde" +"\xderL\xd0T\x90|$\xb7\x4\xda\x1d\xc5\x84\xbf\xd2\x88\xbd\xb4\x1aNe:\x0`b\xc1t\xbf" +"m\x4\xe4\xb5\x8c\x9fG{\x16\x35\x43\x65\x18\x97\xd2\xf\xe0\x90\xf7U\x99\xab\xc1\x83" +"\x98&\xaa\xec\x7f\xee'\x16%\xab\x8\x6-\x18&\xad\xbd\xfc\x89\x66\xd9^F\x19\x11\x84" +"G\xca\xb0\xfb%\xef\xff\xde\xb7\x30\xb6\xe\x1\xb3\xce\x33\xad#\x8cV\\+E~d\x88\xf3" +"\xea\x5\xc0H!\xd4\xc7qP-P\x7{\xe9\xaa\x16\x90KW\x97*4\x18\xcbV\xfa\x42 \xcdS\xbd" +"\xaa%\xbb\xb2\n\xe6kj\xd4\xfc\xfe\xd0\xf5\nV>w\xf9\xf4\\\xca\xbd\x87>\xd3P\r\xb6" +"\x9a\x15\x7\xd2\x1cZba\xe1s~\xbd\xe5\xdd\xd7\x2\x9aU%\x10\xdc\\\xf4\xa4>\x18\n\x61" +"&\xaf\x5\x8b\xac\xd0\xb7\x99{n\x89\xa1\xefN\x94\x9\xf6\xaa\xcbr\xe0O\r\x4\x94\x30" +"k\xb7\x31\x6\xb4\x9f\xc6\x8b\x89\xb4[,\x97Z\x84\x2\x7,r\x8c\x66]\xf4mE\xe1\xfe\x33" +"\xe5\xf1\xe9g\x88\xc9\x95\x8\xc9\x35m\x81\x31\x4g\x2\xfd\x80\\\xc9\xaf%]o-\xd0\xb2" +"\x19\x9a{@j\n\xeb,=\xda\xb2Y\xea$[t\xc8i\x1a\x87\xad\xe3\xa5\xafUzQ\x1\x63\x36\xfb" +"\xef\xe1\xbd\x9e\x91\x91U\x99y\x90'\x91\x16H\x87\rte\xe7=\xe1p\xd3\x6\xe0\x85\x7f" +"[\x15\x34\xa3PG5\xe2\xe8\xe\xb8\x9fG\x82$;|\xfe\xd7Y\x3\xce\x13I\x7fU\x16\xc9\x84" +"\xcc\xcb\x9a*w\xb0\xcc\x83\xb4\x8d\x83\xe3\xb1Js\xce\x8x\xffW\x19\x30\xe6\x44\xab" +"L\xfa\xbcT\x13\xf3M>\xb1\xcb@\xca\n\x34\x8b\x9b\xcd\xe3\x95 \xa5@\xf1\x39g\xfc\xdd" +"\x9aV{#l\xceQ2\xf6#\xddx7\x1\xea\xe1\xc8-\xce\xee\xa7)\x13\x38\xde\x32\xe9\xca\xe7" +"s\xed\xa4\x85\xdd\xb7\xc7N\xdb\x14\xcb-j\x17\xaf\xdf\xec\xb0Q\xb2\xb2\xa8\x66\x34" +"H\xba\xbb\xae\xddT\x84\xef\x65Jf\x1d\xe0@C\x84\xcbpp\x7fO\xf3\xeb\xbc\xcc\x85h\xba" +"4B|\xff\xc1va\x95\x88\x94\xa7\x10\xde\x89\x41\nm\x85\xf6\xdc\x83\x61V\xc1\xe5\xa2" +"\xa2\xe7\xea<\xc7\xaeg\xeb\xf3\x9b\xb0\x9bs\xdd\xa5?D\xb6\x90W\x4\xcf\xc9\xac\xd4" +"\xe0\xc3o\xff;*\x90\x34\x39\xd2\xc6W\xfav\xd2\xac\xf\xeJ6H\x8b\x90]o c\"\xf6L\x9a" +"\xc5\xe4\x3<\xd4\xb3\xc1\x62k\xaaqo\xba\x7\x7\x14:x\x88*3\xac[AZ\xcd,\xed\x7$\xb8" +"%KS[\xd2\x18'j]\xf\xa4\xeaq\xe8\x11@\x83\xe2\x15\xcf\x86\x0\x8c\x90\xa2\xc8\xd9?" +"\x17i\xb9\x16\x0\x62\xad\xd4\xd1\xa3\x10\xeb'\x1e(\xe2\xb9\x7\xf0\x15hq\xfc\x82;" +"\xc6\xe\x12)\xb\xe1\x88\xc4H\xb5\xe9\xc2\xb2\x7h \xdd\x32\x1c\xd9m\\q_\xf\x1b\xb6" +"\xff\xf3\xfb\x33~6Y\xbe\x98\xee\x64\x34;G\x9c\x7f\xdd\x97t\xf0\x81t\xe4y>\xa5$\x1" +"\x5\xec\xcc\xbc>\x1d$\xb6\xf4\xbf\xe1\xae\x85Ys\x12\x35gv\xb4Rj\xe6Ozq\xad\x7f\x87" +"\xbe\x80\xc0\xd4=P`\xb7;g\x9\xc\x44\x1a\xb1\xd0\xbdu\x88\xab{\x18\x10\x32\xdd\x33" +"\xce&\xce\xef\xb0\xd8\xb6\x30\x92@f\x9\x9b\xb2\x62\x7T{\xc6\x1b\xft\xfdsO\x96g,j" +"\x93\x6l] \xe0@\x97\x1d~\xd4\x61\x38\x9a\xff\xd9\xfc\x34\x32\x44\x91\xf1\xd3o\x14" +"\x84\x6\x8e\xb1\xec \xb2\x12\xfa\xcc\xd2U/\xd7\xdc\x45\x8e+$\xf8\x9c\x15\xdf\xb0" +"\xa1\xee\xc(\xad\xb4\xaeI\xe4\xa8 \xdf\xb1\xbb\x0\x9b\xa8P\xa0\x96\x7f+~=\xe2\xf7" +"\xda\x6\x88X\x6\n\x19\x87\xed\xe2\xf4\xea\xe7^\\W\x92U\xe2\"\x9d\xaa~&\xb2\x3(\xf6" +"P{\x1b@\xde\x30\xa8\xe1\xe6\x14\xa5\xd3zs\\e#\xfe\xc8\x64\xa6W\x14\x1b=?\x95\x9c" +"\xca\x62X?\xe9;}bxe?\xaerm\xb3\x17?*XH\x86\x12\xd2\xf1\x38\n\x95\x14*\x4]\x19\x95" +"\x9b\x80\xa6\x2\x61!\x96\x16\xee\x89\x0R\xe8\x13#)\x9b\xf7\xa4\x3\xfe*\xa0\xc1y\xed" +"\xac\xad\x1e\xb4\xc6\xa4\xb9\x12\xf8~\xfaW\xc6\xd4\r[\xfe*\xbeh&,\xbc\xd2\x96he\xb6" +"\xffV\x4\xb0\xb5;\xff\xb7Od\xc8\x62\xa3\xce\xfdk\x9c*\x7f\xb9)@\xc2\x9d\x37\xcd\xc4" +"{\xedy\x89\xdc\xeeG\x1a\x18* \xfd\x32\x2\xf3\xb1\x65#\xe9\x63X\x9a\xb\x45\x12[\xbc" +"\xebUm\\Y\x8f\x88\xd0\xe0\xce\x9c\xedV5\x16Z\x99}\r\xc8\x33\xf2\x97ZU\x81\x89\xc4" +"9\xb0\\L\xca\x64-Y\xf8\x1e*\x89\x34~qv4\xa9\xbd\x9fUnU\xb1\xb5\xde\xab\x9b\x2\x62" +"\x85\x89\x8c\x0\xb2\x1a\x7f\xa6-:\x86\x19`\x8b:\x18\xfb\x83\xd1\xd0k\xea;\x9c?\x9d" +"<\x1\x82\x37\x9d&4\xff\xcc\x11\xbb#@@\xd6\xcf\xc7\xe5\x88\xe9\xb0\xbe(V\xfb\xc1\xa6" +"\xa8\x91Q0a\xd3\xce\xf7\x8d\xb4*\x92\xb6\xb4\x12\x9c(\x5\x7f\xff=\x15O\xce\x8a\xb4" +"\xf4u\x1f\xd0\xf9\xc0R=\xbb_\xb1\x30K\xdf\xbe\xe7qY\xac\xd9IHcn\xb3\x91%M\xf6_\xd3" +"{\x11\xe5O\xfb\xb2:\x8e\x8b\xdb>\xad\x80\xed\xb7\xf2\xef[\xf5\x2@\x93\xd1\x98Y\x99" +"\xd7&\x0\xbc\xf7\xf3\xce\xe8\xd5&&\xf\x4\x8aJ\xdcpU\nW\x99\r\xbd\x13[\xee\xa9\xba" +"\xf6\xc6\xc6\x80\x43^\x8f\xc6\xa7jy\x1e\xec/\xc5\xee\xfd\x65\xf8\x63\xe7\x44\xa7" +"\x7\xda\xc1\xee\x8d\xe7\x85Q\xf4;%\xf2\x64\x65q\r\x19\xd4\x8eh\x11\xaf\xc7^\xd5\xe4" +"S\x16\xd4\x14\x7I4\xc8\x99\xbd\xae\x65\x88\xd9\xfa\xa2\xa4\xf4l\xbf\xb3]I\xfa%n\xe" +"\x3\xff\xd3\xa3z\x1dO\x89\xc3hj\xa1\xaa\x5\x96\x0\xde\n\x8e\x80\xb\xd2\x6\xad\x16" +"p\xe1\xf`\xe6\x1fO\xc7\xeb\xea\xa6;\x87\x1b\xc0\xb4,\x80\xc#1\xbc\n]\x11\x9d\x82" +"U_W\xde+M`\xcb\x34\xd5\xb4\x18\xc4\x9a\x32\xc2<-)\x90\x9b\xda\xb9W\x2\x1bi\xe7\xd1" +"\xe2\x83\xceZ\x9f\x38\x62 \xa1\xff\xe3\xe7\xfbg\x6s}b5W|\xdf\x9c}f}\xc\x5(7\xc8[" +"6x\x8b]_\xa3\xbd\xb9Rj\x19\xfb\xd5\x87\x0\x9ax\n\xee\x45N\x9e\xe9\xaeV`1\xdc\xaf" +"%\xba\xc4\xef\x11Z\xb6\x11i\x8a\x44\x81~\xe9\xba\x61\x46\x66\x30\xfcx\x9fn\xcG\xea" +"\r\x85\x43\x34\x98i\x3\xae(\xc9$\xe0.\xb0\xcf\xd9\x84\r\xec\x82\xdb\xaeu \xe4QS\xe5" +"wQ\xf9\xfb\xdcn\xf9T\x9ft2\x1d\xc8\xeb|\xa9\x93Q\x7\x96\x17g\xc5\x8c\xa5`P(\xc5\xc5" +"\x3\x15\xd8\x37\x85%O\x9f(Z\xa9<\x19 \xc6\xed\xe9\xc8l\x82 -\x94\xfby\xad\x99m\xe6" +"\xf4\xc8\xb6[t\x13\xcd\xa6\xb\xa4\x9\x7\x63\x9\x7r\xe9kA}\xfe\x33\x1d\x7f\xb4\x44" +"\x7f,\x9\x88\x97\xer\x9^\x14O\xf9\x2\x46\x10\xad\x80\x9b\xbcT\x1f%\x1b+\x98\x1c\xdb" +"\xcbo\xc6\xd5\xda\xd0\x89\xc8\xe8\x34AhFz\"\xae\xc3\x86\x44_P^\x2/\xc8\xf8$\x8f\x62\x82" +"[b%\xf3[\x1d\xdb\x3M\x1e\xac\x19\xe5\xae(\xbe\x81ko\xe8\xe9\x42\x84\x80m\x84\x1b" +"\xd7\x87\x45s\x9c\xd6\x32\xde\x8aT]\xccwT\xb2\x4+?\x1f\x39\xd1\xfdr\xb9\x2\x8a/s" +"\x85\xfa\xfb\xb3\x64\xc1}\xa1~\x8b\x8fj#\xcc\x1cY\xe7X\xa6\xfe\xe4\xe5\x86\x13{(" +"Z\x8cq\x4\x14K8\xe3I\xf0\xe&Il\xc8\xc3G\r\xde=}\xc7\xa4\x9b\xbc\xd0\xbf\xe2\x37\x83" +"\x0!\xab.l\xbd:\xacY\xd1\x8f%\xb6\xad\xb3)\x8bx\x83\xe0\xda%U\x93\x31\xb1\xc5\xa1" +"\x9b#\x2\x41\xaa\xd2\xde\xc0\xff\x45R\xe9~\xd4?_q#)\xcf\xc7\xf3\xbe\x8ck7\x12V9\xb3" +"\x87\xf4-\x85T\xe3\x33\x32\xcc\x41[,}\x82\xa1\x80\x37\xd2\xd6\xb\xc9\xbb\xe9\x36" +"\x89\x9d@\xe7\n\xca\x10@|f\xc8]\x96\x38 \xa4\xa4\x1d>\xf8\x37\xa4\x44\x66\xbc\x16" +"\xec\x17\x98\x9c\x10\xbd\x8bpo\xcd)H_W\x98\x1e\xa5%~\xc7\xe3\xcc\x95\xb7,.\xfa\xdb" +"\xf7\xe3\x8c\xea\x9\x66\x9b\xec\xbev\xd0\xd9\xa6\x9d\x44\xe\xea\xd1X5\xd2\x1d\x45" +"[\xd7G\x8@V\xc6\xbcg\x9\x2rb\x85\x17\x7f\x16)\xab\xf2\x8f\xfcw \x9bY\xb0\x39\xf2" +"\xb5\x34\x80\xe0\x9e\xf0\x30V\x6\xf9\xce{\xbf\x0\xd9\xc0R\x7f\x95v\xc9j\x9eo\x9b" +"\xdeX\x8e\x63,\xa3\x38\xfb\x91\x88\x9d#\x12\x8d\x97\x64\xd5\xa0\xf0\xb2\xe3;\x16" +"k\xdf~p\x9f\xc8\xe7\x9f\x62\xff\x33t\xb5\x83\xdaN\x8f\x45\x10(\x17=\x8c\x38v\xf5" +"Z\xe4\xfc\x8fg\xaf\xe0\xcaL\x17\x81\xdb\x13\xbeX\x89\x1cq\xed\xc9\n\xb1'q.\x80\xe9" +"||\x0\x2s\x7f,\xbdz|:\xd3R7\xc3\x91\xf3H(xc\x89\xd6\xcdYAY`\xf4\xc6\xffwQ\x90%u\xe2" +"\xc4\xf7\\\xe\xa5NX2\xa6\x31/\xea\x90 KM7,\xa1qo\xfb\xc8\x33!\xd6\x5v\x14\xe8\xfd" +"\xed\xe1\xae\xa5'\xce \x17\x9do\xab\"\xcd}[\x12\xbc\xae\xcd\x30\xcf\x34$\x85\x43" +"<4\xde+n\x7f\x3I\nP\x11\x87\x7\x8a\xb9\x0\x62lt\xc9\xfaLK\xa7\xb9\xa0\r\xe5\x15\xe5" +"Rn\xb\xaf\xb5v\xa4t~k\xa2\xa0\x96\xc3\xa5\x83\xe2\xf9\xba\xb0H\xf9V\xe3t<\x17\xc0" +"\xd2_\x1a\xa6\x13T\x16\x82\xed\xcfP\xdd\x10*\xaag\xd8\xbcV)?\xebI5NSJP\x83\xc7\xc3" +"z\x8b\n\x8q\x1f\xf7\xdbk\x0\x8f\x12\xec\xa7u.\x4w\xcc\xb1\x6\xa7\xeb>\"w\x9a/\xf2" +"\xda\xb3\xdd\xe3\x8d\xfc\xdf\xd3\xba\xbf\xfc*\xc0<[\x8e\x1d\xef\x18\xfe\xa3h20\xf" +"T\xd6M\x1a\xb9\xe4\xd9\xd2P\xfb\xc7\x35q\xdc\x96%\x18\xb4x\xb\xc9\xf7\n\xa4\x33\x90" +"r\x8a\xa9\xa0j\xd6^\xb0\xdd\x1eykyp\xf6y\x8c\xca\x98\x9\x99\xc6h\n\xb4%\xb1\xdc\xac" +"\xd4.s\x9f\x7f\x9ex\xaf\xbdNJ\xe4l\x13\xf8\xe4\x11\x17\x93r(R\x5z\xe1\xbdT}\xa5\xb6" +"\xa0=\xa2\xd4\x12\xe8\xa6\xa1\xb|\xfe \xd2\x33\x45WTz-[\xa1yI\xb8\x41\xd1\xbe\xf5" +"\xd6Y.\xe2!\x18N\x7f\xcdy\xaa\x8c\xa5\x17\x8dr\xe1\x2]\xe\x9\xf1\xaa&\x8c\xce\x62" +"\xadS\xe9~\xb8\xbc\xa0\x90tb)\xbe\xc\x66\n\xd3\xc5\xa4W\x8\xc3\xfa\xa2{1\xd5p\xf1" +"DTbW\xb5\x8f~r\xf6\x9as[\x94I\x81\x31\xd9\xfc\x41\xe7JR\x9f\x8a\x43m=n\xb8Ht\xe0" +"Y_\xf7\x99_\xd4\xea\x66j\xc4\xb\xdd\x6]o\x1f\xb2\xc2\xe0\x9a\x36~j\x91\xef\xf7\xc6" +"\x14\xe4\xbb\x4\xe\x89J(+V\xe0|t\xb5\xec\xdc\xb8\x38@\x81\xa7\xbc\x32\x14\x7f\x86" +"x/J\xc8\xc6\x8eGO11\x15\xf\x31" +"\xd8%}\xaeh\xda\xf7\x88\x80\xc9V\x93zb\xd0\xba\xec\x88\x37J\x96\x8b\xf0\xb4J\xd7" +"racn\x85\xe9p_}s\x8b/\x0@\\\x97\xafp\"\xb3\xcfY\xa9-\x92&\xfcY\xa9K\xaf\x14\x42\x9f" +"\xe7\x11\x8c`R\xdd\x12\xc8\x9e\xcaP\xc4\xfb\x34\xbf\x34HJT\xdf\xb\x66\x1\xf1h\xe8" +"\xc1\xf2\x9\x19\xed\x1d\xa0v\x98<\x18\xael\xc\xa1\x7\xee\x46\xd5\xc2\xf7qY*\xdf\xaf" +"\x9cN\xd4\xeb\x64L\xb2\r\x33j\xe6\xe8\xbc\xc7\xf1\xc\xbf\x9c\x1f\xca\x8f\x99\x8d" +"\x7\x83\x91\x1f\x46\xc4\xd5L\xfdP\xe9V\x1d\xe6s\x9f\x13\xad\xf0\xd9\xda\xea{3\xfd" +"\xc7\xec\xc\xc8\x11\xbcJi\xe9\xf8|\xba<\x8f\x97\xae\x8d\xc8\x14\x63\xb6\xc\xbd&r" +"\xdb \x95n\x8f\xb2\xc9\xd5\x0\xae\x62O\xb0\x19\xc6\xee\xe0vrf\xc7\xd0\xa1\x8a\x99" +"9\xb1Y\xe3\xedJ\x3\xe0TpH\xc8\xb3\xa5\xccq\x83\xec\xeeZ\x81\xa0\xa8\x62\xcb\xf1}" +"\xe0U*\xda>\x14\xbc\xf7\x46\xfb\xd2\xb4\xcc\xd0\x9f\xbd|\x4\xc2]1|\xe7\x1c\xab\x43" +"\x9f\x9c\x66\xcc\xa9J\xeb\x14.\xdaM\xe2\xdbV-\x87\x85\xc7\xf1\xb1\xd1\xb1X\x9c\\" +"t\n/\x1d\xae\x38\x62\xceo\xc4\xc5\x66K\xfbX\x9f\xaf\x16\x30\x8aVr\xc3|\xd8\x12\xec" +"\xa0\x34\x8f\xe\xff\x8a\xf0\xe3\xea\xac\x99`sp\x85\x90\x84&\xf9\x38\xe3\xcf\xc5J" +"F\xf4nC%C\xc2\xb5\x34\xff\x41\x90\xee\x11tk\x12\xc3\xd5\xeb\xbf\xd4\x9a\xaeW2\x10" +"\x89n\xc9Uo?\x88\xb8\x9\xc2\x15\n\x41o\\\xf0\xdc[\x6\x98I\xd4\xc6\x38\x83]\xcd\xa1" +"\xd8\x94\x84\x92\x9aG\x8b\x98\x1a\xd0\xa9\xdc\xfd^\xcdm\xd5H(\xc4LN\xac\"v\x2\xb4" +"\xaf\xa0O4\x95\xf4\x16G\x97\xa9O\xda\x64\x9eS\xcty\xdcv\xac\xdb\xb2>\xcb\xa6\x3\xce" +"eO\x93\x38k\x81h-\xea\x1f\x1cG\x98\x30\xc5I\xd5\xfaH\xa4\x17\x8b\x80\xba\xbf\x61" +"\xf7\x80\xd2\x94\x7f*\xff.\xaey\xa8\xcb\xf8:\xf3.?+A\xdbm\x9cPf\xc1\xb2U5\xa9\x17" +"\xd9\x30\xa2O\xe\xba\x6\\\xa3Z\xf9\x42+Q\x9d\xebz\xa3\x80\xfe\xc8\xf4\x17S8I\xb4" +"S\xa0\x84\x45\xe8\x9c\xef\xe1\xdf\xb5\x1d&\xbc.\xf7(S8Z\x99\x1f\x31\x8b\xc6\xc2\xf1" +"\xbbs\xa9/\x89-\xb7\x10\x19\xa8\x1f\x8d\x88\xc2\xf3!<\xd4/\xfd\xd4\xa2u3\xf0\x1z" +"\xaf\n\x9b\x3\x39\xab\x17&p\xa4\xe4\xb9\xb4\x1r\x0\xc7!\xea\x8d\xc0\xb{Y]\xa0\xab" +"=\xc0\x2\x46Ho\x80\x3\xaf\xd6\xcd\xb1\xc\x37\x12w&\x1d?\xe1$\x12\x3\x19sD\x19\xb7" +"U\xaf\xaf\x43q\xbd\x19\xba\xc5\xd9\x9d\n\xd5\xc7*t\xac\xed\x1d\xf8\x85\x62\x8e\x1b" +"\xfd\xb9g(\xfc\xc3\xe3\xc7\xa6~\xefz)\x85\xea]\xf8y\xa8~\x0\xe5X\xe\x35\xa4\xdf\x91" +"K\xe9\xf8\x1e\x8b~D\x8c\x83+}\x18\xbdQ `\xac\x89\x1d\xd1U\xb2\x2\x88N\xa8\xdbp\xa1" +"\x81\x84\xb7\xe8'/\xb7\x89\x90\x63\xc1_\xf7\xc;\xdc\x7f\xefi]\x96\xf8\xf9\xe\x37" +"o\xc0\xd1\x8f\xbe\x30\x7f\xca\xb0\x4\xbc\xae\xfdt\xd6\x12~\xa3\xcbq\xf1KU\x86\xf0" +"r%\xcd\x1^ZS\x2\x65\x34\x95W\xae\xa8g\xbf\xe5\x3\x37\"\xc4\x9b\xf0\x8e\xf6\\\xbc" +"p\xd5@\x1c\xaf\x8d\x1e\x6\xc9\x32-t\xaa\xd5\xe2\xf5\x91\x9d\x38\xac>\x99_\x1f=\xc1" +"[4\xea\xfbQ8\xb\xe1|DW,\xc6\xc6\xfa\x95\xa2\xcbTM\x7 i\rx\xdf\x38\xa2\x17u\xa8(\\" +"\x9bQR\xf8\xe0\n\x7\xc5\xc5\xfv<\x9aM\x5\xef\xb8y\xad\x38\xde\xbb\x8b\x83\r\x85\x99" +"\xacp^V\xf4\x82\x45\xc6\x13\xac\xc2\x63\x30\xdeJ\xd0g(\xde\xe8\xc0\xb4@\xcc\x32\xe1" +"\rt \x9~\x9a\xd9J\xa5\xe5\x92\x1\xeb\xbe\x30_\xd0}\xee\x33\x66\x39\xa7yR9\xa6\x88" +"\xb\x94SG\x97\xd1\xa0\xb7.\x2.2\x1e\x89K.:a[Q\x99\x17p\x9d\x18W" +"\xc3\x1d\x7f\x87\xa7\xa4\xdc\x46^m\xa2\xe(=`\xa9\x42\xf8\xca\x93\x99\xd9\n&\x8a," +"\x1b\xb9vX\xe1xek\xe0lq\xc0+\x82\xae\xbf\xce\xdbQ\n\x80\xa1\x85\xcc,\\\xb4S\x93\xb5" +"\x1e\x98\x6\xa8\x32 ,\xc4\xca\x81\x3\xb9H!_\x13:\x8e\xf7\xb5\x86__5!\xc1,<\xb3x\x86" +"\x94\x64\xcd\x1d\x8f\xb4\xe5\xb9\"\xf3-\x87\x81\xed\xc7)\rh\xe8+Y\x8a.\xb0\x9aU\x90" +"\xdb)8\x1e\x14\x88y\xb6]#\x1}\x82\x14\xf3\x42p\xbeG\x8atUo\x1\xf6\x9b\x80\xf\x43" +"I'mN~\xc9<,\x93\x37 \xeaj\x10\xfe\xd9\x9e\x6\x1d\xf9\xb2\x4H\x7\rU\xb1\x38H|\xcd" +"\xff>\x98^\xbf|\x8\xcc\xd2\x90[\xe7\xd2(LD\xaa)\x0\x93u\xdbH\x82L\x93\x8b\x14t:\x9" +"l$\x8eWg\xd6\x88\x1c\x64\xbe\x93ZJ\x88\xf9\xf5V&\xaa\x5\xa0\x85\xeco\x8c\xd3\xcb" +"\xb4\x91\xd2\x66\x37\xe0n\xaf\xc4\xbb\x81\xa0\x46\xd6\xb\x8d\x35 I\x8fG\x0\x5S\x1c" +"\xae\xe0vd\x8e:]\xe1\nu\xb2\x65\xf\xde\xe2\xe0\x30\xd9\x81\x34\x94\x36/)\x18]U\xb3" +"\x16\x92Z,IW\x91\xf0\xfa\xc8\xaf\x85\\\x64\x33\x0\xbc\xbd\x4\xdb\x15\x18\x17S\xbf" +"\xf8\xc8\xc0yB\x83\xbdP\x12\x16\x9b\xfb\x41\xfe\xb3\xba\x8c'\xe4\xc6t\xe7\x6\xff" +"^\xb9\xb8\x8bJX\xc5\x89\x38\xa4\xfa\xce]\x80hx\xfd\xc8Q\xcc]T\x96\xc8{U\xdd\x85@" +"\xd0\xe\x87Mjx\xccq\xe9,\xb3k\xce\x33\xc6\xf9\xa7\xf3\xb5\x6\x8fIRFd\x93\xad\x1d" +"\xc2\xd8\xcb\xcbV*'\xfe\x18\xcd\xdbz\x1eT\xbd\xeb.\xb3^\x87\xa6v\x9b\n/`!\x8a\xe6" +"\x15\xd6\xd5\xe4\x9b\xado\xa9\x85\xc2\x1e\\\xa0\x33\xfeQ\xc3(4\xf6\x9c\xc5\xfck\xa8" +"\xa9%i\xac*v]\xc6\x15\x9c\xe \x13,\xc9g\xb3qf\x1X\xb2\x8f\xc8X\x94\x39\xa1=x\xd9" +"rq\x9b\xbaG\x6\x36\x91\xcf\xea,\x8c\x82q\xa5/$HJ0w_\xc1}\xb2)F\x9bp|E\x8d\x1b\xfe" +"+\x11\xfcMS\xbc&,v\xb8\x84\xc5L3\xee,1\xfa\x9b'\xf4,\xa9\x1b\x8e\xf9L!m\xe6V\x99" +"\xe9\xfa\x3m\x0\xea\x9e\x9\xed\x36$yL\x95\x63}\x15\x96\x8a\xe3\x98Q\xb\xc7'3\xb4" +":\x3\x9a\x9e\xbe\x43\xee\x6\x95\xf2\x8d\xbe\x12\xe4\x10\xdb\x16w\xd1\xe2\x1b\x83" +"\xc\x3\x37\xaa;\x6\xa1\xe3\x0\xc\xd2\x82\x1c\xe0H\xff\xb0/\x12.q\x18\x38\r\x0}\xc5" +"X\x3\x16\xf0\x0\xfc=8\x9\xb0\x2\x5w/\x3\xda\xc6US\x9b`/\xc8k\xe1\xf1*\xe3\xf8,\xd9" +"N\xcem\xdb\x42}Z\xf7<\xc2\xac|\xab\x12\xd3O\x19\xab\x36\xf6\x99\xd2\x34\xcd\xf9\xb5" +"UD\xd4\x31\xc6~#%\xfbp~\xd9Rn\xd0T8\xad\xb9\xbc\xb3\rkw\x1\xa4\xa6\x30\xab\xb0\x91" +"_L\xfe-\x7f\xf7\xe0\xa1\x7\x99\xf5\xfb\xaf\xf0\x63\xf3\x36;2n\x1bX\x4(\x97\x14\xc8" +"\xfcx\xfa\x7f\x45\x9a\x65\x99\x1b\x96\xa3\x99\xcb\xd7\x92\xfe\x38UU\xe\x42\xac\xf" +"E\xba\x15@k\x8a\x13\x7\xd9\xadn\xadsl\xd8\xf\x2\x8\xdfH\x92\xdf\xc4\xdf\xe1i\xf8" +"Q\xb2\x8f-\xa7\xba\xccj\x1d;\x1ftI/\x8e\x7f\xd1\xc7\x99\x3\xf5Q\xa1\x89'\x8e\xe3" +"J@As\xd4\xc7\x45\x1f/\xd3\x16\xf2i\xc4\x8d\x36\xe4\x16\xf1mt{CXLAF\xb4\x16\x82\x41" +"\xf3;\x8f\x45r\x9ag\xe2\x98[\x18\xeb\xc8'\x7f\x42\xe7\xed\xfd\xe8\x8d\xa5\x38g \xd6" +"\xb3\x10\xc5\x64\r\xa8\x8b\xd8\xe4\x9cU\xbc\x1bh\x1f\x15[\xab\x9f\x9\x9e\x16\xd0" +"\x15\xb9|\x1b\xe9\x19Vc\xb3\xe4t\xe6\xd0[\x19\xfdsI \x82\xcf\"(\xb8o\xc8j-$\xef\x66" +"\x8d<\x8d\xe\xe4\xb6RI\xcc\x45\xc0Q\xd2\xc5\xde\xed\x96\x66\xe7\x1c\x3\xa5\xe7\x1e" +"\xfc\xc3\x35\x3\x80\xb2\xa2\xd6\x86P\xf9{\xee\x8f@\x1b\\\x63\x9c\x82\x64\xda\xd6" +"\xcf\xdb\xc5,\x3\x92G\xb7 \x9\x1f\xc4\xe7\xc\x62m\xcd/ \xfc\xaa\xc\x31\xf0\xa8\\" +"\x0\x1c\xe9t\x9b\xa3\xa6g\x1f\xa2g\xe3\xb5\x46\x93/\x6\x6**\x88\"\x7\x43\x1a\xb3" +"J\x7f\xde\xdc!\xcdQ\xb\xec\xe5\xcfu2\xb0\xb7\xc1\x1\xaf\xb2\x63 \xfa\xc6\x95$\x8c" +"\x80J`)p\x8c\x9a\x80\xce\x61\xc9\x9aT\x13\xco5y\xe2RO\x13\x46\xcb\xa9(\xe6\x11\x9b" +"H\x82]\xd9\xbe\xcb\x6\x9b\x9a\xcd\xd5\x88\xe1\x31\x16M\x1b\x8d\x86\x3\x83\xb6!\xe" +"\x14R'\xfe\xc0;\xc1\xfb\xe\xb2\xcd\x39\xeb\xe0\xdar\xa5\xee:\xd9!\xe7Q\xe9\x65\xc2" +"\xaau\xfdh\x9a%\x2\xb9\xfa\x31\xc6\xe5\xc2\xe4\xa5\x88m\x14\x39\xb9W\xa4I\xd7\xba" +"(\xb9\x8b.\x0\x66\x9e\xf6\xe8]\x12\xcc\xbb\x19\xb7,\x95\xd8\xdb\x86\x7\xde\x44\x89" +"\x8a\xe0\x83\xfaJ\x85\xf5\xad\x1c\xf.\xd0\xec\x9c^*TY\x17\x42.\xb3\x4\x44Wik\x12" +"\x98\xe2\x33\x8c\x96\xbb\x1bY\x15\xc\xd0;8c\xa8\xad\xef_F;\x8f\x4Xq\x91\xb8[\x5\x95" +"\x11V\x0?~}\xbb\x9b:\xca\xbe?s\xf4\xbb\xbs\x8c\x9d=P\x1\x36\x97@\xb3\xec\xeb%s\xcb" +"\xf8\xda\x93\x17\x42*\x90\x1\xbe(\x1f\x0\xb0\x99X\xe5\xf3\xdd\x87\xb4\xb8\x35\xc7" +"\xdeG.\x9b;\x2\x30\x5I\x99\x17\x9e\xe1YQ\"\x6\xda@\xa1\x18'[\x81\x88\x97J\xed\x43" +"\xde\xf9 a$\x9d>bB\x16\xecw\xe4~\xc6\x8\xb6v5T\xb8\x1\x45\x86) \x1b\xbe\xb3\xf9k" +"\x99(E\xc2\x7f\xa1\xf9\xdb\x1b\xe\xf9h\x80y\"\xe6\x95{\xe7\x81\xd4\x89\x37\xa4\x46" +"\xf7yp\nY\x9b\xfc\xcc\xd5\xf7\x4\xb7\x8\xa8\xda\x10\x0w\xcc\xe3\x83\"ge6\x8\xe0\xe4" +"\xe2\x8\xf2\x9f\xd0\xd1\x85K\xf8_\xaa\x65\x9f\x18\xe2\x9c\n\xa3;v_\n\xe5\xf8lc4\x8f" +"|p\x19m\x14;\x17}^\xd1`\xa6\x33}\x5\x1d\xd3\xe8\xae\x64\xd7\xd7\x35\x61\x10\x16\x11" +"&\xe8[\xe8)\x7\xba\xa2\x4\x35\x45\xf\xd4\xc\x18'\xcb\xdc\x3\xe1i!\xe5\xd6\xf2\xfe" +".N\xb5\x1e\xb6\xe5,h@\xcau\xbc|\x2\x11\xa5\xa6~\xf6\xbb,\x1e>\xe1\xf3\xc2\xed\x1b" +"F\x95\x8\xb7L\xff\xc9p8`9v\xc1\xbb\x8d\xb8\xdc\xd6\xe5N\xfd\xb\x10=OH\xfa&\xa1g\xb5" +"\xf6*\xc4\x12\x99\xc4H\xb9\x32\xd3\x8c\x8cJ\xf2\x93\x10KA\xeb\x13P\x9a\x8d\xef\x61" +"\xec\xe9\x1ez\xff{\xee\x44\x87\x8d'&\x98\x86(I\x9f\xee\xe\xce\x15\xc7\xa9\x2+U{6" +"}\x8d\x8\x19*\x6\xe1\xcel\xb4\x46\xdb\x9bJ\xde\x1e\r\xc4\xc4\xd2\xc7\xe7\x1a\xfe" +"\xf2\x9f\xb1\x8f\x98}\xbb\xa4\xcf 3)/\xe0\x39\xdc\xf5s\xb5\x9\x65]\x0^\x86\xe4\xa7" +"\xbd\xa3\xaa\xa8\xec\xc4Vmv%_\x8e\xa4\x66\x37\xd4}\xfb\x44@v\x9b\x32\x1e\x63\x86" +"\x2\x8f@WrJ\xd6\xd1\xac\x61QT\xa0\x87\xe\xbd\xe6\x32\x6\x63\xe8\x34I\xbb\xb5G\x7f" +"\xe8\xda\x41\xd4\xbaj\xfdY\xec\x63\xc3\xa5y\xaeW\xc\x65\xde\x1b\x8d\xad\x84\xd2\xc9" +"\x17\xe2&\xcc+qE\x90\xa5(\xa7\xb7\xf5m\xadP%\xc2\x8f\xa7\x95\xcfqt\xf4\x44\xf\xbc" +"\xd9,\xa2L\xb9\x9el\x7f\x82\xb3\x91\x7\xc6\xb1\x91;\xa5\x38\xf0\x9f\xf8\xe6\xef\xa5" +"\x9e_pQ\xf0\x16\xb7\xb2t\xfa\x38\xa1\xc8{\xe6p\xbf\xf0w\xb4Y\xe3\x91=\x15\xc\x5\x10" +"\xaa\x44\xe3JI5mv\xe3G\xb0\xf\x85\x83\xd2?\xef\x82\x1c\xcf\xb0\x37\xf8/\xaf\xf3?" +"t&:\xd3{\xcco\xd7\xb4]:(\xebL\x14\x18G\x19\xe\xc8Y\xcf\xa9\x1a].X+\xedG\xfe\xff\xb2" +"\xaf\xb7\x9d\xfd\xfd\xcc\n\xa5\xd1\x7f\xfa\xef\x9b\xc9y\xf5\xae\xe9'\x94\x1d\x30" +"\xbe\x8b\xb0\x5\xe3+\xb1h\xed\x16\x87\xd5\x30\x31-\xa1`\x8c\xc6\xa5\xcb\xb6W\xc5" +"k\xf4\xf9\x3%\xeb\x86J*\x9d\x8\xdev\xb8\x3\xdb\xbd" +"\xc3\xab\xcc\x80\xe4;\xd6Y-\xc\xd9\x1f#_b\xe2\x83qT\xf2Z1\xf2\xba\x9b\xa2\x89q\xbd" +"\x1d?+\xbc\xe1\xfb\x42L\x97R\x94z|\xd4y\xb\x1f\x39h\x8f\xf\xb7n\xc5\xb4\xf9r\xd3" +"h;\xca@(2\x16\xe5)\xde%\x0\xb7r\xe5\x12\xd6\xe5\x61\x1d\x8f@k*M\x11\xc\xc7U~\x1a" +"ECe\xda\x8e\x1d\x61\x42\x31q\x10)]Y\x8a\x85g4E\xf1\x97\x88\xb1H\xa1K\x11V\xe8\xd4" +"?\xeb\xf9\xc7=\xb5\xd7\xe6\xfc\x84\x14\xbc\xa8\x86\xb4\xa7\xafM\xf5\xe8\xba@Uo)\xad" +"\x83\xa2>\xed\xbd\xba\x6\x5x\x1\xe6\x86\x80\x93)\xb4xn\xd2\x11\x34\x8b\x82\x8a\xc7" +"Y5J\xf4z\xc\xdf}\xa7\x9dZ\xf0U]qV\x1fw\xcd\xb\xef\x82/M\xf4p\xe9/\xcc()S\xa9\xa3" +"F\x5\xd3'\xb1L~r\xe0Y\x95\xd0\xf2\x18O\x92l?\xf8Y^\xee\xc0\xe1t%\xa0\xc3\x8c\xb9" +"X\xbc\x42\xeN#\xb9\xe5\xe5\xdc\xc3\xf5r\xaeU\x95\xfe\xa6\xe3${\xc9_\x1dMo\xa1\x15" +"$\x5\xb0~\xd6L\x1d\xa1\xe9\x8\xa2\xda\xaa&\x1c{\xd4\xc0\xa0\xd7:\x8X\xd4\xe4.\x97" +"\x92Z:\xc9\xe6\xa7|\xd2@\x83\x8f\"\xbc!\xa4y\xc\xa4\x94\xad\xfb?\xf2\xb3\xe6\x46" +"K\xb9\x9b%uB\\\xe7%\xcb\xde\xca\xcf\xb6o\xb&\x1b.\xe1\xe8\xae\x17}a\x9b:s\xcc\xca" +"\xfe\xf2\x15\xdfnl\x83\rn\xc5>\xa9\x9\xa3\x9fM\xe8\xe7t\xfb\xcb\x9e\x8c\x46\x1\x8" +"\xcc\xc1\xd9(\xbdNY\xdd\xea)M:\xcd\x82\xc2\x37@4\x9fLp\xe8\x65\xf0\xa3\xc5\xc1\xe3" +"1\x99x1\x7\xe1t\xd9\xc4\x15\xf2rQ\x91\xa4\xbe\xb2\xf3\x33\x1\x41\xda\x1b\x63\xb4" +"\x2\xb2_\xc6R!\xb6YC\x17^\xfc\xd4\xf0%\xec\xa4%g\xde\x9a\x13\x9a\xc4\xf7U\xf3r#T" +"\xd2\x46\x82\xf6\x94\xb7\xca%[\xf5p\xd2\xa8<\xa9!\xef \xe8\xc7W\x15\xc3\xe7s(3\xac" +"\xd7t70\xe5\xf7Jq\x8et\x9b\xc1WgK\xef\xcc\xe4\xd5\x45:~\xd2\xc2\x2\xf2\xe6h\xbd\xae" +";}jA\x85\x13\xcd\xcc\xaa\x37\xf0\x9dz\xd8\xbf\x94\x1d\xe1M\xc5\x0&\xfd\xf\xa5\x9a" +"\r\xf\x9e\xe2\xbc{\x11U\xc5\xa5\xe\x89\xaa\x1bw\xbf\xae\xd7\x9\xde\x1d\xfe\x37q>" +"Q*\x10\xbb\x1a\x44\xb5\rof\x9w\xd3\xd9\x99,\xcc\x84\x99\x19\xcf\x17\xa4\xb5W\x11" +"\xc5\xc7\xae\xd6\x2\x41v\xd6\xe6q?\xec\x30\xa7~\xe9K\x1d\x31<\xf5\x45\xf2\x1e\xec" +"\x7\xa8\xe6\xebl\x14\x16s\x86\x80u\xc6o\x16\xed\xd7,\x84\xe3S9\xa7\xb5\xe7\x64O\xd1" +"\x94\x10\x42\x37i\xeb[FR\x83\xa5\xe4\xdc\xf2P\x13R\x19:\xe1\xc9\xd4\xa7\x98\xac\xfe" +"\xcev\x90\x94\x9a+\xa0\x33\x81g\xd8[\xf8\xabl4p\x1a\xc9\xb5\x8b\x94h\xf8@\xcc\x84" +"\x13>\xdb\xbd\xbf\xb1\x63%+\xeb\xf1\xbd?\xce\xb8\x33=H\x7K\xc1\xd2\xdd\xb4\x4P=\xce" +"m{\x19\x34\x8e\x7f\xd3\x91\xda\xfev$~\xe8\xcb\x9d\x7\x94X\xbc\x85\rHT\x19\xa9>\x3" +"X\x1c!T=\x1e\x82\xac\x8a\xaf\x41\xa1\x9bGqP\x15\"mv\x8f\xe6\x99\xf8=\x8a\x14\x42" +"\xdd-\xa1i\xc9\xff\x96\xd8\x9b\x33\xa6\xf9\xed\xd9\x42\xf5\x0\xb\x35h\xcbl,\xf4P" +"|}\xfc\x65\x81*v\x8a\xec\x13\xad\xb7L\r\x10\xfe\x14\xdc\xde\x61\xae\xacm\xbb\x9f" +"\xa3\x1d\xa4\xfb\xc2\x43Knl\x5\xa9\x9e\x33\x16\x37o\xbb\x39\xab\xce\xf3\xa8\x95\x96" +"\xb4\x95\x0\xd5\x66\xcc{\xf2\xb3\xee\x42/G\xf5\xe4\xe7\x66\xe4\xa4y\xc0\xb1\xa0\x9" +"\xdc\x38\x8cl\x1a\x9dZN@\x82\x1e\xc:\xc2\xbd\xc8\xb3\xdc\xb1\x87:\xbb\xe9\x62\x97" +"m\x10\x94m3\xe9V~\xa3\x5\xca\xc\x8a\x33\xcf\xc8\x92\xfd\"\x9c\x1b\xa0\xdf\xfa\x92" +"\x10\x84\x8\xa9\x9b\x1b\x9a=\xfTtg\xc6\xde\xde\xa1O\xa7G|!\x1e|\xc4\xdao\xf8\x12" +"\x10\x63\xd8\xbaU.\xb2\xb8'\x97\x7f\xdc\xc0\n\xcr\xfdY\xb9\x9bZP\xdf\xf1\xba\xe2" +"]U0Om\xfd{ i\xd9\x9c\xd8\xeaq=\x81\x16\xd5\xd3\xdf\xd0\x33\x92\xf7\xff\x36\xae\xa8" +"\xbc\x8\xe6x\x93X|\xd7L\xec\x9c.\x4*ljRX\xca\x8e/,I5\xa8\xd1\xf8\x1f" +"\xd2}\x12\x62\xe5\x84V\xa2\x90\xb7\xe4\xe2+2\xd7\xfct|\xd9\x62\x9t\x98\xf1\x14K\x9d" +"\xb3\xa6|\xe5%?\xe5\xb2\xe4 5\xb7K\xe4Y\xb3zh\x8d\x66\xc\x19\x65_\xccT\x84\xad#\xf" +"\xbcNM\xcd\xc3\xa4\xb1l`\x14\x61\x8a\xaey\xf6Q\xe6\xf5\x36\xd5\xe6x(\xa3\x37\xf6" +"eP\x8aP\xf0\x1cl\xd4\xbd\xe8\x99'\xf2\x65\x9b\x92\xfa\x8f\xeb\x64\x36\xf2V\x94\xc9" +"cV\xe5\x97\xb9\xbc?\x89g\xb9<\xbf\xa9:\xa9\x93\x98" +"<\xc7\xd5(\x19Rm\x8\x31\xa1\xb3\xb7r\x17u\xfbw\xfc\x3\x6)\xddMg\xd1\xe6\xe5\xea}" +"\x8bgCG,\xa4\x8f\xf\x38\xe9\x30\"\xa9\x9e\x84\x8d\x90\xd4\xfe\x8\xca\x90\xe1\xe1" +".m4\x9\xa0\xa5\xb5\xacV\xb6\xa6Y\xefQ#XMZ5\x8j;\x8c\x15i\x87\xd7\xa7X\x1)Z\x1c\xfd" +"\xa9}\x14\x13\xee`=\xa8\x9elP~8\x93\\ \x87\x85#5$\xc\xa8\xa2R\xcb;;\xbd\x1l\xbez" +"\x9a\xbf\xca\xe0\xc3\xc6\xd2}\x87\x44W\xe6\x37\xb3\xbb\xbd\x39\xae\xff\x34\xbd.[" +"\xf5\n\xd0\x15\xf4\xc2]\xe5\x2u>\xc1X\xb6_\x81]\x90\x43&\nM\xfb\x42\x85\x99\x0Q\xc5" +"\xf6\x8\x35.y\x80\xd3\xdf\xeb\x45\xfb\x16\xce%\xacp\xb7\xe1\xdd\xc5\x91\xa5\xf\x17" +"\xa7\xf7\xe6\xb9\x1c\xbd)\xb1\xee\xd7WE0>`\xach\xcb\x11\xbf\xf6V\x9e\xc9>\x91(\xbc" +"++=n\xd4\xec\x66\xd5\x80\xbb\x7\x1\x8c\xd0p~\xf9\x64\xb3\xba\xd2\xfc\xdb\xe1?\x82" +"\xd1m\xa3\xc2\xc2\xf(%s\xe7\x1flz\x10X1i'A\xcq\xb3\xc8\xee\xb0W%&E\x1e\xe5\rgH\xfc" +"\xa5MP\xa2\x17\x3%\x11LY\x85\x12`\xe8\xb3P\xe8\xe4\xf3\xe1\"\x65-\xc6\xdb?\xbcs\x88" +">\xf8@qY\x88\xab\xf6\xa5\xf\xa4\xf\xd9\x14\xc\x33\x7l\x11/\x7f\xd8\xf5sq\x8\x81\xd6" +"u\xeeOr\rS\xde\xf5\x15\x13\x32\x32\x81\n?b\x10\xc2\x8e\x37[\xff\x8a\xcb#\x15\x89" +"\x7f\x87R\x14;o\x8c\x43K\xfbpE\xc9\xd9\xbb=\xe3\xd9\xc7\"\xba\xc7\xe4XX\x11\x1a\xe" +"\xb0\xaf\x1e\xa1/m\xf0(\xe8\xeeN\x8\xfd\xfe\xe2\xfb`\xca\x65K\x5\xa7\xf8\xe\x32\x14" +"\r\x83\xca\xe2\xbaP&\xa1\x9e\xb4\x5\x94\xf5\xd2\x8d\x82\xe3\x1d~\x89\x92\x62\x94" +"3\x86\x95\x3\x9\xd3\x86\xf9\xa8]\xbf\x8\xacW\xaez\x14''_\r\x88\x1a\x33\xf4$\xfeG" +"~\x89\xc7\x88 \x94\x89\x62~\xaa\x80\x91\x9\xe7\x94\x94\xc\xb8\xd2\x17\x9\xa4s\x6" +"\x19\xaerB)\xea )O\x13\x10u\xd0\x8\xe\xb4\xc\xda\xdb\x1d\x6\xbbg\xb2\x18&\x4\x9f" +"U\xfe<\xb3\x1an\xbf\xd7\x1b\xcfN\x8\x44\xf\x11@\xc7w\xb6@\x11\x45\xb4^\xd2\x8e\x13" +"\x96\xd2R\xc7\x9f\x36\xb9\xb2\x83>Xj\xf1h\x9f\xe7||\x8b\x87\xb1SM\x91\xael\xcb\xde" +"\xaaJT\x8a\xa6\x18\xa9\x8e\xe2(@m\x84\x9c\xe5\xa5s[\xbe\xc0\xae&\xf3\xdf\xb9\xc1" +"$'KH~\xa5\xf0\x9f\xf4\x9f\x8c+\xacu}\x1b\xb2\xc6\x3\xef\x65\xcdqU\x9bO\x99K\x99\x0" +"\x4\xb1\x15\nS\xe4\x80\xd0\x84U\xbd\xf4\xfbzr6p\xc6\r\xf4\xb6\xa8{\x87\x9e\x9a\x64" +"\xbc\xe5\xa5\x37\x92\xa0\xae\xb0\xe8Uu\xc9OM\xa1\x8d\xfc\x33\xfd\xe8&\xd4\xe0\xf6" +"J\xb7\xc9\xeb\x42\x5\xb9\x1c\xa1\x35\x43\xeb\xa0GK\xe\xb3<\xc4\xde\x1a\x80\xb3\x11" +"U\xb7\xea\xcd\xd4Z\x99\xec\xca\x13\\\xcf\x8a\xa7\xe6\x8\xdeq5\x95\x8e\xe~f\xa8\x82" +"\xed!M\xae\xf4#4!\xff\x99\xbc\xac-T\xff\x8c;\xa9\xbcL\x5\xe5\x10\x17" +"{\xe1\xda\xdb\xc0\xcd\x8bR\n\xd8\"\xdc\x4\x98\x9f\x37U\x81w\xb2\x4M\xb0g\xa9\x94" +"Tp\xd2\xa1*(\xa6\xee\xce\xd3$i\x9d@\xf7\xc8K\xfbR\x19\xcN\r\x8a\xfc\x9b\x8fj\xc9" +"\xb8\x9\x7fG8\x10\xef\x18\xb6x\xa3x\xd0\xf6\xf6H\xceS\x1c\xbd\xdb\x34\xc5\xd2\xe6" +"OG\xaa\xc0 V\xe1\x1eycC\xef>%\x5\xf5\xb7\x42K.\x7\xe4\xdb\x88\xec\x3\xa7\x9c\xaf" +"\xee#=\x1f\x9fN8i\xfc\x35\x8e\x89\x93\x1\x9e\xe2\x89\x41\x87\x16\\\x33\xdd\x8e\xb7" +"\xf8@\xe3W|\x3\x1c\x1aRRl\xef,\xb\xce\xbe\xbb\xafS\x1c@S\x11tb\xe6\xbc\xe6\x46\xc1" +"py9\x1b\x1e\xb6\x91`\xe6\xbc\x66\xb6\xd8t5\xa3\xcf\x36[h\x1\xee+\xb4\x3\xfd\xa0&" +"\x19\x81\x86\xec\xd3\x87\xaa\xb3\x37p\xe4>\xca\xf9\x8f\xdbZ?6\xf9\x65\xf4%\x16G\xa3" +">\x9X\x1e~\xe2]\xf3uNp\n\xe9\xc8\x87\x43\xea\ns(\xd7\x6(\xcb\xb5\xf8kL\x94\x98\x61" +"\xc4\x9d\x63\x1cY\xa3\x38QtSa%\xb3u\x8\xf1\xf8\x9b[\xd4\x16\xf1\xd5\x1f\xb0i\x9b" +"b\xbe\xd1\xcb\xcdR\xce\x30\x88\x97\xee\xbc\xbd\xb1\xb0m\x15\xe1Xh\xb0\xd3\x30\xff" +"&\x82\xf7\x1e\xeb\x30\x88\x1e\x90\xd9\x65\x13\xa0j\xb8U\xd3\x93\x19\x95\xaei\x8\xe4" +"w\xc8\n\xe8\xb6\x4\x12\xd5\x9eQ\x89\x7\xa5j!\xc2\xec\x0\x95\xe1\x64\xf7\x98\xf8\xfa" +"G\xd7.\xc7\x2\x2\x89\x9cy\x96\xc6\x1c\x92\xd2\xf1\x9f\x5\xf7\xb0\xfc\x65I?bf\xf2" +"\xaf\x95\xb6\xc0V~Q@)4yV\xbcZ~\x89\xe3\xed\x19\xbb\xdc\xf9\x19\xd7\x81)\x11(x\xd8" +"\xfd\x97\x82\x33\x43\xc0\x32\x45%\xd1\xe9\x18\x44\xc2*<\xde\x8\x83\x6\xe3\x34\xb0" +"\xb5\xc1\x7f%p\xa5\xe8\x6\x42H\xda\x41\x1c\x44\xcc\x8e\x66$\xe0\xfe\x11y\x99 =\xe7" +"+pVRhwK\xcfx\x17w\xc0\x8\xdd\x87\x89/\xd5\xc\xa3\xec\xff\xb1\xf6\xcb\x81\xbb\xd8" +"{\xdf\x4qV\x6'\x4\xb\x30\x45\xc6\xc1\x12\x9b\x46\x37\x8a\"h\xf6{\xa8\xf1\xd1V\xec" +"\x8c\".!\xc\xc1\x32\xc8\xbd\x1e\xea\x1d\x3Z\xc3HG\xb\xefU?)\xa9\x9f\x34\xc2\xbe\x85" +"\x17\xdf\xf6~4\xa7\x80\xd2R\xb8;|\x9am\x19Ur\x15k\xca=\xdb\xbc\x88\x65\xcb!\xf5\xa2" +"\x3\x41\xf8\xefO\xcd\xfbNTc\xc2\xf1\xd0\xf6\xd8\x1a\x3\xc8-k\x97\xc1\x30\xf8\x83" +"1\xc7\xa5\xb\x90qN\x13r\x8f~*\xba\x12\xe6\x1d\xfa@\xe1\xe7\xeaI\xaa\xbau\xae\xee" +"\x4\x63\n\x16G\xed\xc\x83\xcbw\xab\x38\x82\xdbh\xdf\x12:\xaf\xe9\xf6.\xe \x8d\xc6" +"\x97\x8c\xac\xf2]\xf1t\xbbRp\xd4R\x1c\x98_%H\xad\x80\xb9\xffg4\x1fJ-\x3\xf8\x9c\xe" +"\x9b\xba?\xee\xb3\x62vi\x85\xfan\xcd\x12\xb0\xda%\x8f\r\xfbo0j)F\x5\xa5\x64\x8e\xa4" +"L\xa4\\m\x91\xf5\xe9'\xf3\x83\xd6\xe8\xfe\xe8\x39\xe2\xb3ud\xe2\xaa\x7\xf7H\x92\xf9" +"\x19Y\xf3\xb0m\xde\xa0\xdfp1-\xd5\xda\x9e\x1b\x44P\x7fJ\xa3\xa0\x19w&L\x1d\x86\x5" +"\x7f\x12\xf3\x9c\xe4&\x3z\x1b}\xf8\x33#\xba]\xb3\x7\n\xeb\xd2\xeb\xd7s&\xfc\x3\xde" +"9\x1a&\xde\xc4%\xf0Wv\xfb@-\xf2\xe9\x1't!v(\xa8W\x83\xa3\x1K\xf\x7f\xdbUl\xc8\xdd" +"P/Wn\xd0\xc9![\xb7\xdc\xa0o\xd8\x61\x66Ms\xf4o\x8e\x96\x32.\x19+\x91\x13\x65M\xf4" +"5\x92\xd3|\xa6\xbf\xd1\x13\xc7\xcf\xce \xe5\x89\xeekk]Cu\xf2\xf\xd7 @\xae&\xca\xfd" +"{\x89\x5\xc0\x82\xbf\x82[X\xb0\xe3\xe1\x41\x64\x0&\xd5\xe9\xd1\x9c\xd9\xe5\x14\xaa" +"\x9f\x90\xe9\x97\x8eQ\x95tu\xb5q\x86: \xc1\xa0\xa3\x14Z\xa8\xc5]\xa6V`\xce\x10\xe5" +"D'r\xf0\x61O\xd4\xa9k(d\xa1\xc8\xe9\xfd\xf6\xbd{\xaa\x9b\xac\x87\x1b\xcd\xe3\x90" +"dy*Ka\r$\xe5}Y\xe\xacY]\x94l\xe6o4\xcaw\xdf\xfLB\x4\xfa\x39\x42\x44\xcd\xd6\x32\x39" +"AUg\xe9n\xd4\xddwu\xcg\x7fH\xe5?\xb1\xd4\x34\xfd\xabY\x5\xfeY\x10\xf2\x9eJ6\xbdy" +"37\xbd\x35\x43\xd2\xd5\xc0\x10\xa2&\x11\xd4R\xf8\x66\xbd\x85\x37\xe5u^\xaa\xd3\xc2" +"\xd9\xec\xbb\xa5+\x1b\xa4\x8e%\x18\x80\x66\xe6\x90\xd2~\x92*\xadtMhS\xdfKV%\xbb\xf9" +"\xef\xae\xf5\xb8\xdb\x8d\xa9\x1d\xbb\x92\xdeH,\x8f\xb5S{y\xcf\xd1\xaa\xdf\x8a\xd4" +"&r\x17\x30\xad\xb7\xfd\xc2M\xbd\x9fX\xb7J\x1\x32:\xc6\x8d\xa4\xa1\x80\xf2\x13\x1" +"\x96H\xfb\x42~<,\xeb\xe0{*\xf9\x8e\x84\xe6\xcbw\xaf\xc2\x18\x84\xbb\x8d\x83\xa1t" +"\xf2:\x0\xc5\x96\xd5\x90\xa0W\xeb\x94}c\xb\x84\xc1\x18\xd4\x46\x0m/\xeb\x83\x85\xa8" +"\xccG\xbb\xe8'\x96\x38\xa0\xdf`\xadM+\xfc\x45{\xd9\xea\x89l\xbd%NPa\xc8\x37j\xe4" +"\xd8\xdf}\xe8\x10\r-[n9\x18\x36\x43\xc0y\xaa\xd1\xdd\xb1\xc2\xf9N\xca\x45\x19\xbf" +"`\x90\x9bj\x97\x18\xc3\x16\x87\xb4\x9\xb4\x9\xde\r\x18\x42\xe0h\xcb\xe7\x37V<\xd0" +"\x97U\x7f_+\xb2)\xd7\xb0}\x89O\xeb\xb0{3N\xf1\x10\xfe\xc9\xd3\xd7\xc1\x46/\x92\xf1" +"\x13\xb0\x82\xd8\xf2\x10\xd3\xaa\xb4t\xd4\xf4w\"\x84|\x88\xc9\xc0\xa2.\xfb}p\xb3" +"i\xb7\xee\x34J,\x1e{\x14\x3\x39\xbc\xe7\xbf\\\xc7rb\xd6\xf3\x86\x8b\xf3\xe0O7\xa8" +"\x1c\x9dPR.\x9a\xd6\xfb\xb4\xf6\x18:q\x92_\xcb\xf7\xb!\x89\x39\xc2tE=9XwZ\xa6\xc1" +"\x9c\xdewRk\xfbs\x95s\x19\x30g \\\x3\xcc\x8d\xe2\xc1\x8a\xfcyf\x9f\xe3\xad\x90\x35" +"\xe9\xc8\x35/\xce\xb9Z)Kf\xecT\x93\x65\xf6\xc2\"O)\xec\x31\xe2\x30\xfb\xf9)8S\xb6" +"\xdaiC\x9\x1\x12\xf3\xf8]vGT\xc3z\x9c$Nml\xce\xcf\xa3\x88\xb*\x93P~\x92\xcdp\xeb" +"v\xfd'\xc5\x64\xb\xb1q9J7\xc1\xea\xf7~m\x7f?\xd0\x8b\x95U\xde@mf\xb4\xcf\x6\xad\xdd" +"W\xed\x85\x33\xf9\xf0\x44\"\xa4\x15\x42\x7fu$[\xfd\x3!\xfe\xd3\xe4X/T-5;(m\x94/\xf" +"r\xd1\xb7\xa5\x88]\x85\xa8\xc6\x9e+\x88.\xd6\xfx\x89\x32" +"P\x2\x80\xf3\xfcqlF\xadli\x8d\xf1\xfbsY\xe6\xe2]\xa6\x1c\x85\xe1Q\x10\x81\x9d\xb3" +"\xd2\x65\x44\x1d\x96J\x11\x90\xc#\xb0\xdc\x1\xa4H\xe0\x41\xe6u\xf4o\xe2\xc\xc4k\xf1" +"<<\xc9\x62Ju\xc0\x1c\xa7\xca:\x5\x1cs\xaa\xbfK\xb1%\x85Q\x80m\xa6\xa6\xe2t\x8d\x85" +"\x3\x32\xf6\xad\x63MJ\xfc\x66\xd2u\x9e\xfd\x86\xc3\x8d\xfeRB\xe4\x41\x11\xbc\xe5" +"\xfc?%_\x11\xcf\xfb[\x12\xfd@Oh\"u\xa4\xba\x1a\xd7\x7f\x12\xa7s\x88(\xddhNk\xee\x8b" +"\x7\xbcN\x6YQ\x81)\xeb\xd3\xb2.\x90\xcd\xe1\\\x65'FVi\xe5*\x2j\xbe\xe0i\xc5\xd3\x7f" +"36\xa7')\x81\xa7\xe8m\xd5\x1d\xda\xac\xe\x16h)\xa0\xeah\x98:h\x7\xbf.\xc0\x2\x91" +")Kk#t3r\xd5i=*\x1a\x1cP9O\xbf\x30-|\xe4\xbl\xa0\x18\x9at\xee\xaf\xba\xe5\xa2\x11" +"\x1c\xe8\xd4\xfe^\xdc@?m\xa4\x63\xe8u\x11\xdb\x9e\xba\nn8\xbc\xff\xcc\xf9\x87\x8c" +"r\xf4\xf8\x65)\xdf:\x9e\x46\xf0\xe0\xfc'j\x96\xd4\x16\xdf\xbb\xd3\x82\xda\x92n\x84" +">\xcfZ\xbd\x1cO\xb4\x91\xdc.J\xabs\xec=\xde\xe1\x43\x32\"\x64\x90\x38\x30&7u\xec" +"\xdd\x2\xa6\x2p~\x4\xd9V\x1\xa0\x32\x46P\x3\xa5\x31\xe\xf8\x43u-\x18\xd0l\xf3\xe0" +"\xa9-i1\xa4\xa7\xed\x9a\x12\xff X\x97n\x12\x1av\x95j\xa2\x3\xf4Y\xae\x45@bP\x83\x3" +"\x17\xad\x85\xee\x1a\x1a\x91\x3/\xb3h),\xa8\xe\x38\xc3\xb4\x9\xd9w \xd9\x9\x1=\x16" +"-y\xc3\x85 \x8c\x9\xb0\xbb\x8c\x1e\xc9\x1a\xc0\xfa\x66\x83\x1f\x10o\x93q\x7f\x66" +"\x7f\xf7\x98z2\x5\xb4R[\xacL\xb2\xe6\x34\x9c\x8d\xc5\x89\xac\xa3\x89q\x8c\x97M\xa8" +"e\x8c\x90\xec\xe1\x62\xf2@\r\xd9\x64=\x14\x46\nv\xd1\x92\x43\x9d\x85z\x14\x84R\xa6" +"W\xdd\xb1\xa3Q\xc2\xe8\xaaj\xad\x66V.\x92\xa0\xb\xb4\xf9\xac\x33\xf7^\xc7\xc9\xc2" +"\xbf~x\x98\x1f^\xdc\xf4\xe5T\xfe\xd6\xfb\xcc\xba\xab\xb\xf3\xf1\x93\xbf\xe7\xf3\x99" +"\x17]\xe7\xd0\x89\xda\xce\x9b\xbb\xa3\x46\xacht\xa6-\xfc\x44\xb8\xcd\xf5\x81W\x80" +"f}\x19\x1fr\x8dJ_xMLdv\xbc\xd8\xb0q\xe7\xbc\x34\xd0;\\N\x14\xc6\x96\xc7\x95\x1e\x61" +"\xba\xb9\x87\x14\xe1h\xc7WF-]#\xeao\x98\xef\xbdRI\xb6\xde\x8a\xe0\x8c\x8d\x83\xc" +"7\xfckb\xfb\x9\xd4j!,\xf5\xe0\x0\x38\x37\xe7&\\3\x9cN\xd8\xca=z\xcb\x1a\x45I\n\x1" +"\xf1\x8b\xea\xc6u\x86o\x1c\xb0\x92\x10\x8e\x2\x13\xf9\xc9\x64R7.,\xd2\xc0\xb9\x91" +"V\xa6\xf\xaa\xdepV\xf\xf8]\xbf\xc1\x44\xc4\x9aN\x17H\xac\x9b]E\xb4N\xaa\xc5%i\x90" +"\xb4\xa7P\xc7\"\xafS\xd4.\xec)\xa9Q\x0h\xb3\x82W\xbe\xf5\x16\x9b\xd8\xbc\xe9\x64" +"9\x8c\x1c\xee\xd6|q?\xe8\x3\x9b\x15\x8c=\xaa\xb6\xae\\\xb9j7\xc5\xee\xe4\x9e\xf1" +"C)k\xc1\x86@+\x11;\xa0\xddm\xd9\xf1\xa6^\xe8\x1\xbfO?B\x19'\xa7\x8c\xc3\x33\xe\x17" +"],\xf4\x1euK\xc6O?pY\x1b\x8e\x91\xfb\x1f\x8b\x66\xf0\x1a\x14?y\xbem3!\xb7\x7\x18" +"\x86Y7V\xec\x0t\xaf\xa2Q\x9c{M!\xb6\x12\x38:\xd6n{\\\x8a\x88\xd1\xb0,V\x92\xfam\xc5" +"\xdb\xba\x85z\x9a$\x1bsa\x85-/\x7f{\xcc\"\xf3xPG\r\x6|\xa1\xdc\x87GLI\xa8+o\xec\x89" +"\x9bh\xcdS\xb0\xadY\xbf\xc8P\xeaI\x80\xed\xa9=\xff\xfd\x9e\xa8\x8f*\xf1\x16\x12\x7f" +"\xa8\xf6\x9e\xb9n3\xa3\xb4\x95\xf2\x9\x9f\xa8\x9b\x14\x7f\x9a\xd0\xe5\xa7\xf\x97" +"Orp$p\xd0\xfa\xe4\xf0\x1a\xa0\xbc\x32;\xb5<\xc2,\xb6\xea\xa2iv;\xd3\x82\x36\xb3\x4" +"}9\r\x80\xcf\x9d\xcb\x62\x19\xf9\xe0\xaa[\x94_\xd3\xad\xc0\xc1p\xfb\xe6\xf9m]Ps\xbd" +"\xca\x99\xdfY\x0\x38\x18\xe2\xfd\x36&\x9f\xf9\x62\xc\x84!y\x1e\x80\xc4\x18\xe1Px" +"\xfb\x1e\xdb\xf2\x17)\xc7\x1d\xc3\x8c\xe2%\x1f\xbe\x17\x16\xbav\xaf\x15#\x99\xb9" +"\x8K\xbc\xc\xb1\xe5\xdeii\x12u\x81\x32zd\xf3v\xd2kZv\xdc \xfc\x2\xa5\xf9\xedi4\x9c" +"\x89\xa9n\xa2\xfh1\xc0sD\xcf\xdbo\xdfwv\xcfJ\xefN`\x14r\x8c\xbePvr\x2\x84\xfb\xc8" +"\xa1V\xdb\xf4\x8c\xa2\x63]\xd7+\xf9\x8fh\\Vm\x93\xe7M\xf9\xdbH\x8c\xa4r8Y\x7{\xe5" +"Q\xd4\xb8\xeb\xbe\xe5O\x9a\x7X\x8e\xabw\xee\xf\xa7@\xcdL\xe\xa0\xb6\x1dz\xcd\\\x65" +"\xad\xda\xb2\xe9\x42(\x17\x35)2\xcd\x4\xce\x7f\xedG\xa6\x93\x83\xe3\xa9\xf0\xf7\xfb" +"\x84\xea\xb4\xbb\x80\x16W\xccO\x92\xcc\xf9\xca\xa2\x8c\x17\x8a\x43\x81\xf1\x41K\xd1" +"XX\xae\xa8\xb\xdaY\xad\xdf\x43p6'\xc9\xda\x45-M\x16\xf2!\x7fl\x82\xf8}\xfv\x18\xa8" +"E\x15R5O\xf1\x93\xca\x9a\x37\xf1\x8d\x46\xde\xd9>\xb\xc2Z\xab+\xa1\xbf'i\x15\xe9" +"\xc4'\x8\xc1k&\xba/\x95\xbe\xb5\x2\xfe\x7f\x93g\xc\xa4t\x9b|\x18x\xcf\xf0\x34{\xa4" +"'0T\xc8\xed\x7\xf2/}~[\xf9\xeb\x15\xf5\x93\x3\xb6U\xcf\x86\xa3\x0\xd1\xa0\xbdL\x0" +"]\x98\x9c\xb7\x32[\xd6\x9`x\xa7z\xce\xafp`\x1b!<\xb5\xa1\x89\x84\xd8\x1f)\xb\x84" +"u\x5P\xe8\xb5~\xf9J&\x18\x43\x13\xae\x18y\\PO\x0\xfc\x19\x15\xa4\xaf\xd6\xd8#\xe4" +"\xf1\x12\xa8\xa7i\xf0\x0r6\x87\xc7\r\xc\\\x36J\x2\xd5;\x89\xb5\xd0\x62\x1\x81\x19" +"\x9bW\x92=w\xc1o\xc3\xad\x61\x35`\xda\x30g\xb6o2\x16\x99\xdf,\x8e\x8l\xea\x9e\xb8" +"<\xecL>r*\x1b]\xd0\x10gZW\x8a\xedW\x3sH\x8bl\xde}VC\xe6]&\x3U\x4\x1d(\x84\xb3\x9d" +"\x1@O\xdb\x5\x87\xc3\xff\x1al\x11(\xcf\x99\x9fj\xd3T\xf9n\xae\x34m\xa9\xed\xb8tS" +"\xd9\xe3\xf9\xfeP\xdf\xf3nG\x11\xd6\x45/\xe3\xeN\x96,Y\x7\xc\x9e\x34\x84\xbfq\xd7" +"\xe3\x10\xf4$w\x12\xf\x84'h\x12\xf2\xb7\x9d^Q\xfc\x93\xb4k3\x10\xa0\x8a\xc6#!\xf1" +"\xafg\xef\x33v\xf8\xd5\x89\x94\x8\x42\xc9\x99\x8eL\x82\xb9\x14R\x17u\xe1\x9a\x2\x99" +"\xfew\xe8\x33\xe2\xb7\xc0\x43s[\x82\x83\xb3\n\xf8T\xf3\xae\x7O\x10\r\xa4 \xa1\xba" +"\xf1\xef'@*/\xa1[\xf6OL$\xedo::\xc5;\xf9\x81\xfe\x86\x8a\x1\xf9\xe4}\x9f}UPH\x88" +"\x95?Bn\x13-;\xc\xcd\x45\x31*\x80u\xf4\xa8}\x1f\xaa\xf7q[\x93\xbf\x43\x8\xf1\x32" +"@TS\x84\xe3mp!\xf3vmx\x1do*\xa9\x9bRx\xc5\x1\x82\xbf\xe7\x1b\xed\xea\xb8\x99\xe1" +"\xb2L\x10'\xc0\x39\xe3O\xfc|\xf3\x8a\xe7\x10!j\x97\xdb\xe\xfc\xe\xed\x8b\x9dIV\xb7" +"\x7f\xa3\xe2\xa8\x9fj\x94\x1e\\U@\x0X\xb7\xdf\x34KY+[\xb5\xbdS\xfd\xa7\xb2\x39g\xd4" +"\xd2u\x8d\x2\x8d\x63\r\x42\x1b\xbbOb1\x1a\xc9\xd6\xda'\xc3\xa2g\x81\xfag\x13G\xd9" +"\x9\xac\xf6\xa8\xacu8#\xba\r\x39p{_\xddM\xde]\x9a\x42%#6\nF)\xb1l\xd3\x45\x98\xdc" +"\xa1\xc5t\xb\xd5\xec\xe\xc0\xc0\x8f\x8a\x39\x42\xc6\xcc\x5\xaf\xd4y\xe\xdc\xf4\x46" +"\xc6\xfb\x8a\x8c\xd8\xdb\xdat\xbb\xa6>\xd5\xc0Y@\x92[\xc2\xc2\xa3\xdc`\xd6\x9b\x42" +"Zp2\xdau\xce,dhL\x88u\xf7\x35\xdc\x9f\x87\xf{f\xe9x\x98\xdf\xc9.\x9d\xa1\x35\x1d" +"~\x83\x66O5]\xf1\xa1\xc8\xd0\xbf\x8a\r=+\xb6\xfb\xc0\xe1\xb9,\xbe\xbe\x11\x88\x91" +"\x15\x32\xb5\xf4:\xc8&>\xbc\r\xaa\xfb\x90\xf0\xa7\xde\xc7\x1eV\xc3\r\x39\xdbYE_\\" +"\xb0Xr\xa6\x9d\x9c$\xd7\xfc\x9c\xf3\x9bO~\x16\x64\x2\x92\x34\x19y\xf9\xc\xbd\x3\x13" +"\x88\xac\xf1@\x1d\xff>\x9d^\x82\xb8]\xf6\xcb\x14M\xae\xdbt\xe4\xe6?\xe9\xdb/L\xdf" +"\x16\x6\xf7/\xdfu\xba\xf5s\xac\xb0z\xfe\xbc\x8cW\xa8H\x92\xe6\xfb\x17H\xe\xf3\xbd" +"\x9e\xcf\x8a.7\xbd\xc3\xf8\x90\xfd\x82\xfc\xd2\xdd\xbf\x8c\x11:\xe9o@\x13Y\xc7Y\xaa" +"\xf3\x92L\xde\x30n!\xe3\x8\xf0\xf8\xab\x0\xc0\xc7\xe5\xe4M/k\x8a\xaf\xc\xdeQ\x91" +"\x93LR<\xa6/\xe1\xa8\x16u\x90\xa5\x12\x35\xf4\x95\x15\x43\xe9\xf{Do\x8f\xc8\xcd\xbb\xfd\xc\xf0G\x8b\xab\x42\xad" +"\xa6\x10k!\xfe\x16\x9b\x16\x30\x41Hr\xb0\x8|C\x88\x6:\xb4L\x8f\xf3K\xa2\x8b\x38\x30" +"\xeb\x35=\xe7\x8e{\xe0\xfa\x83\xe3\x37\xbf\x8e\xcb\x99\n\x9a\xa2\x16\x9f\x3h\x9d" +"\xa7\x7h!\x1f\xd0\xc5\x19\xb2\n\x97\xe2\xb\xa3%,GE\xd9i\xa4\x94L\xfb\x9e\x6\xfc\xa9" +"\xff\x8}\xe3\xe8\x16\x17-\x7\xa5\xfeG\xeb)T\x9c\xe2\xeb;\x85\x86\x62j\xb2>@\xe2\xb9" +"')_\xd8\x64\xbc\xd6\xcam\x85\xd3\x65\xe\xec\x16\x91\xca\xf0\xad\xc3\x17\xb5\xd5O" +"\x87\xa4m\xb4\xce\x9f\xb8\xad\xcf\xd1\xb4\x15\"@\xf7.\xb2/>.{\x16\xffS\xbbLv\xe0" +"\xc6s \xe8\x32\xdc\x92\x94;\xac\x94\xb5N\x90\x7\x39h\xe8\xfe\xf6\xf6\xbag\x88\xd2" +"+\xda\x92\x91\x9b\xecs\xf1\xba\xa3\xcd\xdf\xff\x84\x12\x43$\xccI\x1a\xa9\x9Qp\"\x0" +"%\xd8x\xb3\xbct\xd8\xc2\x41\x43\x8bT\xb7):m\xd8\xea\xa3\x1bs\xe0\x0\x1a\x83\x45v" +"\xd8\x8b\x93M\"\x97\xc9\xdf\xbaq\xda\xc3\x3SJg\x80_\xdc\xbc\x86^rjg\xf1\x36\x3\xf0" +"\xe9\x30\x44\xd3)\nI\\H`\x9a\x85\x19\xb1\xd9k\xca\r\x0\x80\x0\xc7V\x1f\x0\xe7\x37" +"M\xe1;\xaa\x1f\xe0\x3%\x89p\xae\xcc\x15\xc9$\x11\x81q\xa7\xe0\xc\xf0\xd4kM\xe8\x42" +",\x14\x82x\xb6\x86\x19\xe9\x82`\xc6\x8e\xde\xf3\x9f\x7f\xb5\xc5\x1e\x33\x30\"\x0" +"\xabne\xa1\x39\xc6+\xb3q\xb\x43\xc2\x64\x16\xe1g\xf7\xef\r.\xe\xdc\xd7@*\x18\xd3" +"R`R\x85\xcb\xbe\xe8\x1K\xe1\x35\x65\xbd\xd6\x91\x45\xa7\x9a\xb9\xeb\x10\xf4 \xe3" +"\xe4\xa8\xe7\x0\x82\xf0\xc0\x66\xfc\xe6\xe0.\xdd\xeb\x45\x10\xc9\xb7\xcb )\x94\x8c" +"\x8a\x5\nh\x9a+XxX\xb3\xb6!\xca\xef+P\x11\x61\x9f\xa2\xfc\xd9\x99\xa9\xf8\x63\x7" +"\x4:,k}\"\x92=m\x1\x5\x1b(\x1\xf8\x36\xfd\xe2sU\xbe\xce\x38\x32\xe5 g\xa5\xdc\x18" +"\xad\x15\x88\x31\xeQbT\xf8\xa8\x17\xef&o\x1dK\xce\xfa>\x84\x8f\xc1\xc6\xdbq-\xf6" +"|\x8e\xfd\x7\x9c\xcd\xf4(\xff\x62\xd0\xf9\x1d\xb6\x91\xe0P\xba\x4\x1a\x64\xe2\\\\" +"3\xd4\x0\xb1n\xbb\x91\x36U\xa8(p\x8c\xdd.\x12\x13\xde\xbdT\xeb\xae\xeb\xe3j\xe9\x33" +"\xef\x45\xc7\\\x1e\xf\xd8'/\xb5\xa8\xd4\xbe\xcc\xd9\x1c\x98\xcbX\x5;\x0\x9c\xc6L" +"\x17\xc2\xd9\xfb\\\xf6\x87\x35\xc3\x87_TA\x95~\xdc\xa5z\x9cY\xe1\xb9\xf2\xaf\xd6" +"P\xcd\x7\x45\x41\x46\x7}C\xa8\xa3\x45\xf8\"\x0u'\x84\x90\x38\x91 ON\xbe\x91\xe9\x13" +"\x86\x91\x9dX\x1a\xaf\x0\xec\xa8\x9e\x33q\xea\x97\x82\x33P\np\x6+\xfd\xd3\xb7\xd2" +"\xdd\xfb`]\"q\\\xe7\x11\x89\xa2\x38\x39m\xcd[\xd2]Q(=\x15={l\x1b\xdf`=.[\x6j\x19" +"bS\xf4\x4\x80v\xb6\x92\xec\xef\xac\x65\xe1\xc3\x17\xfb \":\xc9\x8a\x66MJ\xde\xdf" +"{t\x1d=\xbb@%\x89\xdd\x62\xfa\x98<\x9aY}\"\xffr\xf5\xda\xa3\xef\x32IT\x1\x31\xfa" +"Yz\xcb\x98hsv\xeb\x0\x13\xb4\xe9\x15\x19\xb2\xd8\xd5\xaf\x45\x10\xf0\x66'D\xec\xb6" +"\xcc\xbd\x9c\xe3h\xf3\x9d\"\xfa\x36u\xf1\x38o?\xa0\x8cw\x88(Q\xf6\xa2uP\x95\x30G" +"@\x81\xf0\xd3\x7u?\xc5\x8\x1e\xde\xee\xd9\x38\x86`\x96\x14\x13\x1e\xea\x9aK\xa8\x85" +"\xe2;l\xc\xa0#\xf5\xb1*v\nk\xa3\xe7w\xc8\x36I\xd7\xee\x96\xe2\xeai\x97=J\xc\x65\x15" +"\xa2\xdf$M\xd5j \x15\x33P]\xee\xd1\x64\x96PH\x4\xb5\x1d\x87\xc6\x15M\xc5M\x14\xea" +"\xdd\xbe\x8d\x98\xc4\x95}\xfa.\xea\x9b~\xe8o\x83\xecS\x9f\x90\x82\xb3%\xfb_0xe\n" +"\x3\x89\xaeT\x8e\xfe\xf5\xdb\x87\x90\xe9\xc5\xbf\x89\xa9\xb0\x88\xbd\x9e\xc3\xb6" +"\xa4\xe6\xbe+&\xcez\xf2\xf8&T^o\x17\xe6O\x17(\xd0/\xc8$>S\x19\x66\xe\xc0\x66\x31" +"\x91\x91\xd8\xb1\x18\r\xcc\xc5\xe7\xde\xd5\xc9\x34\xc9[\xbd\x1f\x14\xcd\x9c\x19`" +"~\xed>\xba\xd9~\xea\xb5.5):\x15\xfc\x36\xaa%\x95\xe8\x18G:\xc0]lD\xa3\\\xb2|\xa3" +"\x10vP0\xed\xe3\xa8@\xe9\xa2TU\r\xe8+|z\xf5\xe2\xb9\xfc\x46\x44\xaf\xa2J\x92\x6\x99" +"\xbb\x18\x10\x7f\xfcLe\xbe\x2U\x97\xa2\xfayJ\x9a\xd4#\xe4\x2?'\xd6\xccmtx\x7fg\x93" +"uM\rE0\x1b\x85R{Y4\x1e`\xb4\x1dM\x6\x9dp4 \xe:\x16\xe3\x90\xdb\x8f\xba\x36'o\xcc" +"ZS\x8c\xb4Y\xce\xe0s.\xc7\xa4\x8a\xdbKR\xed\x41J\xd4\x8\x34\x8fp)%\x7f\xf9\xe0\x9d" +"i&\xac\x96\xf8\xaa\xe1\x3\xb9\xby\x90\xde\xa8\xe6 \x0\x9a\x38\xecUo\x82\xb4\xf6H" +"r\x8f_\xbb\xb4S3\x8a\xf7\x8\x81\xed\xe8=)\\V\x1b\xe9\xf3\x1c\x33 }\x95*7\x9b\x66" +"\xf\xe3`\xc0\x14\x10\xbc\xe1[\xd9`&\xce\xcf\xfe\xa6\xd7\r\xa2\xa4pY\x95\x1d%J\xa5" +"\xcb\xfe\x8bt\xf\x41\xc2_\xcaL\x7fqX\xfa(\x14\x89|\xa4\x16_\x94\x0\xe2\x3\xfe\x30" +"\xb1\xd9\xefN\xfe\x31\x8f\x9a\x36\x41H(\xb4}\x84\xa3Px-6-nd\xac\xee\x8a\x86#>\xb2" +"I\x9d\x32\xfb\x5\x97\xb\"$\x8a\xdd\r\x80\xab}\x97\x90\xf1!,\xb0\x91\xd6\xce\xc5\x37" +"\xb9\x15O(\xcc\x6\x66\x97HdQ\xec\x6(\xde\x63\xa3@\xb7\x11-\xf5\xb7\x33\xf7\xb4\xc3" +"\xe6\"\x6\x1f\x94\x12\x45_\xf2\xb5\xd0\"\x98MK\xef\x64Y,<\xe2\x19\xbeOhY\x19\x1Y" +"RA\xa1\xab\x81\x9d\x38p.\xdcp\x6\x8V\xe1\x41z\xa0q5y\xa4\x30\xaa\xa6|\xb3\x3,\"]" +"\xef|\xe8\x8c\x65\xc5\xccp*\xfb\xb6\xba\x81\x86\x2L\xd1\xaflcG?p\xca\x43\x9d\xbb" +"5\xe3>\xa5l\xc9U\xcf\xde\xb7\xder\xb6}\xc3\x39\x1fTz3\xb5\x1a\\\x8a-0[GF\xcd\x8c" +"8\x8n\x7f\x18$4\x8f\x5x\xf\xda*A\xbb.J\xb5\x87oT\x1f]\xe\x9d\xac+A\xc2T!l'~\x8eT" +"\xb1\x17K\xda\xddr\x4&\x0\x9b\x2rI\x87sD\xad\x44\x13\xfd\x97\x9d\xe9\x8c\x19Gg\x8" +"\xea>`\x8f\xfb\x87_\x85\xed\xa0\xdcj\x5\x35zg\xb9\x8f\xd6\xfdU\x1a\xddq\"\xd2\xf8" +"Q\xc\x46%\x3r\x99\x84\xf0\x6\xf1x\x9f\x9e\xce%\xda\x89\xb5LZ\xa3\x98\x9d\xd4ycj\x95\x39:!\xe6\x62x\xe2jn\xaa" +"\xe9\xa4\xd6\x13\xf0\x9\xd4\x82\xf5\x1e\x2`\xee\x19\x39\x34\xcft\xc4\x16\x13G\xb1" +"5\xe\x7\x10\xa8\x14\xaf\xde\x11\xe6*\x9d\x8eg)\xdb\x33M\xd7\x36\xc4n$\xf3\xd7\x10" +"\xce\x18\x9e\x64[\x99>=\x7f\xfd\x45\xe5\x88\xf7\xf0\xce\xa7\x8d\x46\x46\xb=\x14\x2" +"U2\x15\x85\x1aR\xd3{\xed|\x1c\xa6\xd2\xfbWt\xfa\xa3zD\x8bRKf\x11U\xdfl\xc6%\x8b\x9b" +"\xa4\x9aI3K7[\x1c\xfb\x94)R\xc5\xf2\xd2\xb7\x5\x32\x7I\xc4\x30i\"*T\xbd-\xfU3H9l" +"\x15`\xd7\x7f\x17\x1f\xcfX\xa7\xbc\xcc}f\xc\xa4:\x12\xdf\xd7\xcfZ\xae\xff\x1e\xf0" +"s\x90\xbd\xbd a)\x97\x81\xb3\x86\x8a\xaa\xa2\x7f\xb7\xcb\xee\xad\xf1N\xc1\xeb\xbe" +"I\x15;,p\x98\x19\xec\x81@\xf5\x88\x94\x8b\xe6n<\x90\xd8\xf3p\xdfn\x18`\xc7\xc9\xc0" +"\xee\xb4\x95\xbe\xc6\xd9 \x15\xa9\xcb\xd6$\xc2L\x84\xc5+\x85\xce\xc9R\xe9m/\xe3K" +"6*@\x3\xa3\x2\xd0\xce\x1e\xc3'\x11\x85M\x1euz%\xd4PY\x93\xf0sb\x8f\xf1\xc5=,\xe0" +"\xc0\xf0(\xee\xd0\xa0\xbd*\x0\xc6\xaa\xaa\xa2\x9f\xa9i\xd8.\xc3*\x3\xbch\x18\x61" +"p$\xdc\xe9\x44\xb9\xaa\xd5\x98\x31\r\x32t\xdb\x99M\xbc\xe0\x91\xd9\x8a\xfc\x89wJ" +"\xb0\xedn\xa5\x7\xa0V\x88\xf3w\x1d\xd7N\xf4\n.f<7\x97\x9b\xb0\xba\xc5w\x8e]\x85]" +"m\x18\x86\xb5\"u\x5(\x94\xc3g\xf0i-\x95`E\xc\x1f\xdb(\x7\x1e\xc6k\x15\xb5\xc6\xa9" +"\xfe\x66\xfa\x66_\xb2.t}k\xf1\x5\x15\xee\xd2\xc\x17,6\x90\xbe>\xd9\xfe\xey\x17\xa8" +"\x91\x87\xb1\xca]d8L/R\x96\x85\xf9\x8c\x38\x9a<\xe1\xd4Q]\x16\rt-\xcb\xdd\xed<#\x92" +"js\x97k0\x86\xd5\x96\xd3\xd5\xe6\r\x7f@|H\x9c\xecr\x1f'?b\x91%ke\xc~\"5v\x19\x43" +"Cm;m\xb6\xed!.+\x14\x95\xe5\x3\x87Qzv\x16\xf8\x0\xff\x66\x3\x46\xcb\x12\xf4\xba\xd4" +"GQ\xf3MC\xeb\xed\x1a\xb3\x92\x8c\xc9\xec\xdcL\xa7\xdc\xc1\x16\x5G\x8b\xd4\x83\xf5" +"\xa5\xa1\xe5\x90\xb4IFX\xdbY\xaey@St\xe0\xcd_\x11}V\xec`\x1ak[\xc8\x66\xbd\xea\xe1" +"{$i\xb9u\xbb%\x93\x0\x10\x1\xaf$\xc'\xbaK\xfcz\xc6\x89\xaa\x38\xf2Q\x9bHX\x84\xd6" +"|~\x8cYs\xf8i\xab}\x1c\x38-\xb9\x6\xb0\xc1\x85\x8\x45\xde\xd7\x94\xbf\x61\xf5\xe5" +"\xf1s\xab(\x1c\xc3\xd8\xa8\xe5\x89\xc4\xa4\ru\xcb\xa4)\xd1\x89\x9c\xd7\x11\x14\x80" +"A\xd1\xbb\xd2\xfc\xa4x\x97ri\xbc|\xa8\xdf\xbc\xf3\x9a\x8f\xb7'R\x13\xf7\xa9\xa3\xce" +"\xbc\xf\xcc\xcd\xdf(\xf0\xf9<^!\xdd\xbc\xf7\xe7\x84\x10;t\x8d\xe2\x87\x61\xd9\xe" +"\xcf\xd9,\x14\x17\xe7v\xe2\"h\xd7\xf0\xcd\xa4$\xa2\xccJ\xbc\xd4L\x6x\xf5\xe4\xfc" +"\xc2~\xde\xdc?$\x8b\x36Wr\x9b\xa4w\x0L\xf9\x45\xa9y\x84\x94OoSy\x19\xf4\xd9\x35\x91" +"\xd6\xda\x9\x64|{R\xc2\x5\xa0\xa2k\xcb\xfeX4\xaf\xe9\x81\xbf\xde\xb8\x13]\x99g\x15" +"\xe2\x43:\xa9x1h\xb5\xe7\x90\xdc\x82\xab!-\xff\x87\xc9VUP%\xc5\xd1\x36\x3\x2\xe9" +"\x98\xc'\xc4\xb2#-\x10v\xab\xc9\xbfG\xc1\x66\xfb'\x0\xedk\xb2\xfc\x8b\xeb\x8d\x8f" +"\xf9\x90\x1c\x14\x9a\" Ane\"\x9d\x19\x63\xa7\x92Q\x7 \x17\xc4|Z\xeaV\x14\x1d)X\xcf" +"Ax\x93\xaa\x5\xc1\xedp:\xdb\x82p\x17Y\x1d,\x9e\xa7,c\x83\xd0\xee\x81|\x2\x93\x86" +"\xc2\xcaR\xba\x7f\x32\x8b\x12\xcd\xc8=\xf1\xdb\x15J\x97\xc0\xcc\x92\x7f\xa4\xaf\xf4" +"\x7fh(K\x14\xdd\xc9X\xb4\x3\xf6\xe\x62!\xbc,0^IH\xe7\x62L8\xcaoz\xa4\xf1U/7S\xc7" +"\x1bN\xe2\x6Qq\xf7O\xc8\xf0\xd0\x0\xdd:\x18\x19\xad\xe6\xbe\xae\xf\x41@\x85\xf4\x63" +"0\xbf\x99\xd7\x7\x65%\xc3\x3i\x15\x4\x9b\x42\x1f\xf0\xc4J\xd1\x7\"\xf3\x14\xd4\xfa" +"\xcb\x10\xfaM\xc\x66:\x10\x64\x91mL\xa7\xefh\x98 \xb7\x7f\xca\x4\x88\x8e\x62\x98" +"\xc1\xe\x31z\x9\x16X|\xb9\xbf\xb0o\xe3\xe4\x8bY\x10\x9a\xcc\x87\xcf\xbaI\xd5.RA&" +"g^4\x5\x66.FX\xcf\xe8\"\x32\xe5\x42\xda\xc2\x1?^\x1f\x3m|\x3\xc1\x16g/\xc0\xa3\x80" +"!\x4]\xc0\x9c\x95\xc9R\x9c\x45q\xa4\xb\x80\xca\xc4\x9f\x9\x9\x91\xf2l\xf9\x8a\xdb" +"B\x17v\x18_E\xcc:a\xca\xb6w\"B\xcb\xf\xde\x44@/\"P:\x80\xc8w\x8\xc5\xe\xff\x8bR2" +"Q`\x9cK\x8\x14\x39$76X\xd2\xe4s\x10\xb4\xf3\xee\x45\x95\xe2P\x1c\xe6\xb8$\xf8\xc7" +"\x0\xce\x61P\xfc\xa2\xc8#$\xed\x34\xd1\xc2+$\x9b\x2&)\x16vd\xe7S\xf0\xc6\xdf\x33" +"\xbe\x44\xa0`{\xcb\x1f\xdd\xb5\x9f\x9e#k\x9cS$\xaa\x17Y\xda\\O\xfa:\x8oD\xd3\x89" +"\x88\xcd\xd3O\x90\x6\xfe~{\xd4_\x95\x9b\x8a\xc4\x7\x81\xe7\xdd\x84\x1cV9a\xce\x17" +"\x7G\xe\xf]\xfc\x1f\x96\xc6\xab\xed&\xc6\x9f\x1b\xf9\xc1\x7f\xb8\xccNmi\xf0w\xa3" +"C\x12_Y-\xb2\x0\x93\xb6\xf6\x39\xe8\x96v\xe4Z\xd6\xc7\xc5\xe5MX<1\xc\xb9+:\xdd\x4" +"\xf0\xb0\x80\xba=\xb\x43K\\0\xfc\xech\xe3'\xd4\x43\x35\xb9" +"n\xeb\xb2\x41X\xec\x84\xf9\x1\xf9\x34Hw\xe4\xf\x83\x10\xdcO\xe\xdc\x85\x1\xe0\x18" +"\xbb\x1b\x8dX\xf1\xe3\x83\x1f\xf2I\xc0\xc5\r\x65=\x86\xf5\xfa\xc3\xf7\xd0\x8c\xd4" +"\xa5\x61\xd5x;\xe3\xf2\x42\xd6\xda\xa2\x1es\xd5\xe1\xfa\xd5\x92\xbb\xbd\xb4\xa0\x0" +"\x1\xb6\xa8\xb9Y\x1b\x66\x14\x0\xe4\x61\x12\xaaly\x98K\xc1\xf4XY0\xab\xb1\xad\xd2" +"\x98\xf-\xcf\x98\xf1\xba\x19_\xe1pr\x87\xcb\x85\xd6\x86\xeal\xd5y)2\x84Z$\xdb\xe4" +"V\xf4\x64\x5\xc5\xb9\x30\x8c\x45\xac^\xc3\xb1\xc0\x30\xd2\xd9S\x9fm^\xf8#\x6\x8c" +"uhE\xbc\\\x19\xe2\x4o\\\x85n]@i\xd8\xeG\x80\xfc\x8a:\xab\x82\xe7\x45\xd1\x9b\x96" +"DT:\x82<\x3\xd5\xb4Yx\xf3\x42U\xcd[^\x18|\r\xd6 \xc5R?Vo\x88T\xc7\x9c\xc0VU\xee\xc2" +"\xb1T\xd8\x10W\xdb\xd0\xb1\xa0\x1c\x9dW\x85\x35\x80\x1a\x9cI\xac(\xae\x31\x14\x1d" +"\xb8\n\xcV\x1a\x4\xee\xf8 \xbf\xbf\x82\xd7\xd1S\x82\x45=\x9fh\r\xb1$0\x8a\xf3Xz\x12" +"(+\x17\x5\x3\x1f\x2`\xb1+\xe5\x85\xf5\x66L\x1c\x95[\xb2\xe7t\x8dipL\x82\x8\x66\xf7" +"{\x1b\x8a\xe6j\xc8\x3\xda\n\xd8\x33\x1\x93\xb1?\xadH\xc1zj\nx\xek\xbcp\xd4\x86\x8e" +"\x94\xf8\xa9\x81'\x97\xea\x98\x5u\x16\x86\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30" +"00000000000000000000000000000000000000000000000000000000000\r0000000000000000000" +"000000000000000000000000000000000000000000000\r000000000000000000000000000000000" +"0000000000000000000000000000000\r00000000000000000000000000000000000000000000000" +"00000000000000000\r0000000000000000000000000000000000000000000000000000000000000" +"000\r0000000000000000000000000000000000000000000000000000000000000000\r000000000" +"0000000000000000000000000000000000000000000000000000000\r00000000000000000000000" +"00000000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n019024l_afm_len = 31901; +char* n019024l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusSanL-BoldIt" +"al\nFullName Nimbus Sans L Bold Italic\nFamilyName Nimbus Sans L\nWeight Bold\nI" +"talicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -111\nUnderlineThickness" +" 69\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development" +"\nEncodingScheme AdobeStandardEncoding\nFontBBox -177 -309 1107 953\nCapHeight 7" +"29\nXHeight 540\nDescender -217\nAscender 729\nStartCharMetrics 316\nC 32 ; WX 2" +"78 ; N space ; B 245 0 245 0 ;\nC 33 ; WX 333 ; N exclam ; B 112 0 417 726 ;\nC " +"34 ; WX 474 ; N quotedbl ; B 177 470 579 729 ;\nC 35 ; WX 556 ; N numbersign ; B" +" 33 -32 660 697 ;\nC 36 ; WX 556 ; N dollar ; B 59 -126 628 763 ;\nC 37 ; WX 889" +" ; N percent ; B 129 -20 903 709 ;\nC 38 ; WX 722 ; N ampersand ; B 89 -23 720 7" +"23 ;\nC 39 ; WX 278 ; N quoteright ; B 165 469 356 729 ;\nC 40 ; WX 333 ; N pare" +"nleft ; B 84 -200 458 729 ;\nC 41 ; WX 333 ; N parenright ; B -21 -200 356 729 ;" +"\nC 42 ; WX 389 ; N asterisk ; B 145 407 478 729 ;\nC 43 ; WX 584 ; N plus ; B 8" +"7 -10 596 473 ;\nC 44 ; WX 278 ; N comma ; B 27 -174 245 146 ;\nC 45 ; WX 333 ; " +"N hyphen ; B 70 207 371 342 ;\nC 46 ; WX 278 ; N period ; B 64 0 245 146 ;\nC 47" +" ; WX 278 ; N slash ; B -1 -14 427 714 ;\nC 48 ; WX 556 ; N zero ; B 81 -23 614 " +"724 ;\nC 49 ; WX 556 ; N one ; B 172 0 529 709 ;\nC 50 ; WX 556 ; N two ; B 30 0" +" 628 724 ;\nC 51 ; WX 556 ; N three ; B 67 -23 613 724 ;\nC 52 ; WX 556 ; N four" +" ; B 57 0 599 709 ;\nC 53 ; WX 556 ; N five ; B 59 -23 641 709 ;\nC 54 ; WX 556 " +"; N six ; B 85 -23 625 724 ;\nC 55 ; WX 556 ; N seven ; B 131 0 679 709 ;\nC 56 " +"; WX 556 ; N eight ; B 60 -23 620 724 ;\nC 57 ; WX 556 ; N nine ; B 68 -23 611 7" +"24 ;\nC 58 ; WX 333 ; N colon ; B 113 0 374 520 ;\nC 59 ; WX 333 ; N semicolon ;" +" B 76 -174 374 520 ;\nC 60 ; WX 584 ; N less ; B 77 -10 630 474 ;\nC 61 ; WX 584" +" ; N equal ; B 61 52 622 412 ;\nC 62 ; WX 584 ; N greater ; B 38 -10 591 474 ;\n" +"C 63 ; WX 611 ; N question ; B 168 0 672 744 ;\nC 64 ; WX 975 ; N at ; B 73 -137" +" 1032 745 ;\nC 65 ; WX 722 ; N A ; B 26 0 703 729 ;\nC 66 ; WX 722 ; N B ; B 82 " +"0 762 729 ;\nC 67 ; WX 722 ; N C ; B 107 -23 793 741 ;\nC 68 ; WX 722 ; N D ; B " +"77 0 776 729 ;\nC 69 ; WX 667 ; N E ; B 79 0 762 729 ;\nC 70 ; WX 611 ; N F ; B " +"74 0 741 729 ;\nC 71 ; WX 778 ; N G ; B 107 -23 819 741 ;\nC 72 ; WX 722 ; N H ;" +" B 68 0 812 729 ;\nC 73 ; WX 278 ; N I ; B 63 0 368 729 ;\nC 74 ; WX 556 ; N J ;" +" B 59 -23 641 729 ;\nC 75 ; WX 722 ; N K ; B 74 0 843 729 ;\nC 76 ; WX 611 ; N L" +" ; B 80 0 606 729 ;\nC 77 ; WX 833 ; N M ; B 66 0 931 729 ;\nC 78 ; WX 722 ; N N" +" ; B 68 0 816 729 ;\nC 79 ; WX 778 ; N O ; B 106 -23 828 741 ;\nC 80 ; WX 667 ; " +"N P ; B 76 0 747 729 ;\nC 81 ; WX 778 ; N Q ; B 109 -54 831 741 ;\nC 82 ; WX 722" +" ; N R ; B 80 0 785 729 ;\nC 83 ; WX 667 ; N S ; B 76 -23 725 741 ;\nC 84 ; WX 6" +"11 ; N T ; B 142 0 753 729 ;\nC 85 ; WX 722 ; N U ; B 119 -23 809 729 ;\nC 86 ; " +"WX 667 ; N V ; B 179 0 802 729 ;\nC 87 ; WX 944 ; N W ; B 168 0 1087 729 ;\nC 88" +" ; WX 667 ; N X ; B 22 0 802 729 ;\nC 89 ; WX 667 ; N Y ; B 182 0 805 729 ;\nC 9" +"0 ; WX 611 ; N Z ; B 30 0 733 729 ;\nC 91 ; WX 333 ; N bracketleft ; B 23 -200 4" +"63 729 ;\nC 92 ; WX 278 ; N backslash ; B 138 -23 285 709 ;\nC 93 ; WX 333 ; N b" +"racketright ; B -25 -200 415 729 ;\nC 94 ; WX 584 ; N asciicircum ; B 119 270 58" +"0 695 ;\nC 95 ; WX 556 ; N underscore ; B -65 -145 550 -76 ;\nC 96 ; WX 278 ; N " +"quoteleft ; B 167 469 357 729 ;\nC 97 ; WX 556 ; N a ; B 50 -23 578 549 ;\nC 98 " +"; WX 611 ; N b ; B 59 -23 640 729 ;\nC 99 ; WX 556 ; N c ; B 77 -23 597 549 ;\nC" +" 100 ; WX 611 ; N d ; B 79 -23 700 729 ;\nC 101 ; WX 556 ; N e ; B 64 -23 591 54" +"9 ;\nC 102 ; WX 333 ; N f ; B 90 0 464 729 ;\nC 103 ; WX 611 ; N g ; B 26 -218 6" +"56 549 ;\nC 104 ; WX 611 ; N h ; B 67 0 629 729 ;\nC 105 ; WX 278 ; N i ; B 67 0" +" 362 729 ;\nC 106 ; WX 278 ; N j ; B -43 -218 365 729 ;\nC 107 ; WX 556 ; N k ; " +"B 59 0 651 729 ;\nC 108 ; WX 278 ; N l ; B 67 0 362 729 ;\nC 109 ; WX 889 ; N m " +"; B 60 0 911 549 ;\nC 110 ; WX 611 ; N n ; B 63 0 629 549 ;\nC 111 ; WX 611 ; N " +"o ; B 82 -23 634 549 ;\nC 112 ; WX 611 ; N p ; B 11 -218 637 549 ;\nC 113 ; WX 6" +"11 ; N q ; B 72 -218 659 549 ;\nC 114 ; WX 389 ; N r ; B 63 0 487 549 ;\nC 115 ;" +" WX 556 ; N s ; B 60 -23 589 549 ;\nC 116 ; WX 333 ; N t ; B 101 -23 414 674 ;\n" +"C 117 ; WX 611 ; N u ; B 88 -23 656 540 ;\nC 118 ; WX 556 ; N v ; B 129 0 651 54" +"0 ;\nC 119 ; WX 778 ; N w ; B 120 0 881 540 ;\nC 120 ; WX 556 ; N x ; B 16 0 648" +" 540 ;\nC 121 ; WX 556 ; N y ; B 37 -219 653 540 ;\nC 122 ; WX 500 ; N z ; B 21 " +"0 575 540 ;\nC 123 ; WX 389 ; N braceleft ; B 84 -200 472 729 ;\nC 124 ; WX 280 " +"; N bar ; B 57 -200 335 729 ;\nC 125 ; WX 389 ; N braceright ; B 29 -200 419 729" +" ;\nC 126 ; WX 584 ; N asciitilde ; B 97 142 581 314 ;\nC 161 ; WX 333 ; N excla" +"mdown ; B 26 -186 331 540 ;\nC 162 ; WX 556 ; N cent ; B 79 -124 598 634 ;\nC 16" +"3 ; WX 556 ; N sterling ; B 49 -23 629 715 ;\nC 164 ; WX 167 ; N fraction ; B -1" +"77 -20 489 715 ;\nC 165 ; WX 556 ; N yen ; B 107 0 702 704 ;\nC 166 ; WX 556 ; N" +" florin ; B -21 -220 690 744 ;\nC 167 ; WX 556 ; N section ; B 56 -201 596 723 ;" +"\nC 168 ; WX 556 ; N currency ; B 66 100 644 604 ;\nC 169 ; WX 238 ; N quotesing" +"le ; B 177 470 343 729 ;\nC 170 ; WX 500 ; N quotedblleft ; B 171 469 588 729 ;\n" +"C 171 ; WX 556 ; N guillemotleft ; B 135 72 571 481 ;\nC 172 ; WX 333 ; N guilsi" +"nglleft ; B 128 72 351 481 ;\nC 173 ; WX 333 ; N guilsinglright ; B 96 72 319 48" +"1 ;\nC 174 ; WX 611 ; N fi ; B 85 0 703 729 ;\nC 175 ; WX 611 ; N fl ; B 88 0 70" +"1 729 ;\nC 177 ; WX 556 ; N endash ; B 35 207 624 311 ;\nC 178 ; WX 556 ; N dagg" +"er ; B 109 -194 626 709 ;\nC 179 ; WX 556 ; N daggerdbl ; B 35 -194 623 709 ;\nC" +" 180 ; WX 278 ; N periodcentered ; B 143 182 270 282 ;\nC 182 ; WX 556 ; N parag" +"raph ; B 121 -191 684 729 ;\nC 183 ; WX 350 ; N bullet ; B 111 175 367 425 ;\nC " +"184 ; WX 278 ; N quotesinglbase ; B 37 -135 228 125 ;\nC 185 ; WX 500 ; N quoted" +"blbase ; B 37 -135 462 125 ;\nC 186 ; WX 500 ; N quotedblright ; B 173 469 595 7" +"29 ;\nC 187 ; WX 556 ; N guillemotright ; B 103 72 533 481 ;\nC 188 ; WX 1000 ; " +"N ellipsis ; B 92 0 939 146 ;\nC 189 ; WX 1000 ; N perthousand ; B 72 -21 1021 7" +"39 ;\nC 191 ; WX 611 ; N questiondown ; B 52 -204 556 540 ;\nC 193 ; WX 333 ; N " +"grave ; B 175 607 339 757 ;\nC 194 ; WX 333 ; N acute ; B 247 607 475 757 ;\nC 1" +"95 ; WX 333 ; N circumflex ; B 135 610 453 757 ;\nC 196 ; WX 333 ; N tilde ; B 1" +"17 622 500 744 ;\nC 197 ; WX 333 ; N macron ; B 150 642 467 722 ;\nC 198 ; WX 33" +"3 ; N breve ; B 188 611 455 754 ;\nC 199 ; WX 333 ; N dotaccent ; B 241 621 377 " +"741 ;\nC 200 ; WX 333 ; N dieresis ; B 147 621 469 741 ;\nC 202 ; WX 333 ; N rin" +"g ; B 214 593 398 773 ;\nC 203 ; WX 333 ; N cedilla ; B -13 -220 270 0 ;\nC 205 " +"; WX 333 ; N hungarumlaut ; B 82 610 498 757 ;\nC 206 ; WX 333 ; N ogonek ; B 23" +" -233 248 0 ;\nC 207 ; WX 333 ; N caron ; B 167 610 485 757 ;\nC 208 ; WX 1000 ;" +" N emdash ; B 37 207 1070 311 ;\nC 225 ; WX 1000 ; N AE ; B 1 0 1104 729 ;\nC 22" +"7 ; WX 370 ; N ordfeminine ; B 96 262 451 729 ;\nC 232 ; WX 611 ; N Lslash ; B 5" +"4 0 624 729 ;\nC 233 ; WX 778 ; N Oslash ; B 34 -39 906 749 ;\nC 234 ; WX 1000 ;" +" N OE ; B 90 -23 1107 741 ;\nC 235 ; WX 365 ; N ordmasculine ; B 92 262 471 729 " +";\nC 241 ; WX 889 ; N ae ; B 54 -23 927 549 ;\nC 245 ; WX 278 ; N dotlessi ; B 6" +"7 0 322 540 ;\nC 248 ; WX 278 ; N lslash ; B 50 0 372 729 ;\nC 249 ; WX 611 ; N " +"oslash ; B 12 -38 709 557 ;\nC 250 ; WX 944 ; N oe ; B 71 -23 986 549 ;\nC 251 ;" +" WX 611 ; N germandbls ; B 67 -23 654 729 ;\nC -1 ; WX 722 ; N Udieresis ; B 119" +" -23 809 920 ;\nC -1 ; WX 722 ; N Uacute ; B 119 -23 809 936 ;\nC -1 ; WX 667 ; " +"N Scedilla ; B 76 -220 725 741 ;\nC -1 ; WX 611 ; N Tcaron ; B 142 0 753 936 ;\n" +"C -1 ; WX 667 ; N Scaron ; B 76 -23 725 936 ;\nC -1 ; WX 722 ; N Rcaron ; B 80 0" +" 785 936 ;\nC -1 ; WX 722 ; N Racute ; B 80 0 785 936 ;\nC -1 ; WX 667 ; N Sacut" +"e ; B 76 -23 725 936 ;\nC -1 ; WX 778 ; N Otilde ; B 106 -23 828 923 ;\nC -1 ; W" +"X 611 ; N ucircumflex ; B 88 -23 656 757 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B " +"106 -23 841 936 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 119 -23 809 936 ;\nC -1 ;" +" WX 667 ; N Yacute ; B 182 0 805 936 ;\nC -1 ; WX 722 ; N Eth ; B 73 0 776 729 ;" +"\nC -1 ; WX 722 ; N Dcroat ; B 73 0 776 729 ;\nC -1 ; WX 611 ; N Zacute ; B 30 0" +" 733 936 ;\nC -1 ; WX 722 ; N Uring ; B 119 -23 809 953 ;\nC -1 ; WX 611 ; N gbr" +"eve ; B 26 -218 656 754 ;\nC -1 ; WX 556 ; N eogonek ; B 64 -233 591 549 ;\nC -1" +" ; WX 556 ; N edotaccent ; B 64 -23 591 741 ;\nC -1 ; WX 556 ; N ecaron ; B 64 -" +"23 593 757 ;\nC -1 ; WX 722 ; N Ugrave ; B 119 -23 809 936 ;\nC -1 ; WX 667 ; N " +"Thorn ; B 76 0 721 729 ;\nC -1 ; WX 556 ; N eacute ; B 64 -23 591 757 ;\nC -1 ; " +"WX 556 ; N edieresis ; B 64 -23 591 741 ;\nC -1 ; WX 722 ; N dcaron ; B 79 -23 8" +"82 729 ;\nC -1 ; WX 556 ; N ccedilla ; B 77 -220 597 549 ;\nC -1 ; WX 556 ; N cc" +"aron ; B 77 -23 607 757 ;\nC -1 ; WX 556 ; N cacute ; B 77 -23 597 757 ;\nC -1 ;" +" WX 556 ; N aogonek ; B 50 -233 578 549 ;\nC -1 ; WX 556 ; N aring ; B 50 -23 57" +"8 773 ;\nC -1 ; WX 556 ; N atilde ; B 50 -23 612 744 ;\nC -1 ; WX 556 ; N abreve" +" ; B 50 -23 578 754 ;\nC -1 ; WX 556 ; N egrave ; B 64 -23 591 757 ;\nC -1 ; WX " +"556 ; N agrave ; B 50 -23 578 757 ;\nC -1 ; WX 556 ; N aacute ; B 50 -23 587 757" +" ;\nC -1 ; WX 556 ; N adieresis ; B 50 -23 581 741 ;\nC -1 ; WX 722 ; N Uogonek " +"; B 119 -233 809 729 ;\nC -1 ; WX 611 ; N ugrave ; B 88 -23 656 757 ;\nC -1 ; WX" +" 611 ; N uacute ; B 88 -23 656 757 ;\nC -1 ; WX 611 ; N udieresis ; B 88 -23 656" +" 741 ;\nC -1 ; WX 404 ; N tcaron ; B 101 -23 578 829 ;\nC -1 ; WX 556 ; N scomma" +"accent ; B 60 -307 589 549 ;\nC -1 ; WX 611 ; N Zcaron ; B 30 0 733 936 ;\nC -1 " +"; WX 556 ; N ecircumflex ; B 64 -23 591 757 ;\nC -1 ; WX 722 ; N Ucircumflex ; B" +" 119 -23 809 936 ;\nC -1 ; WX 556 ; N acircumflex ; B 50 -23 578 757 ;\nC -1 ; W" +"X 611 ; N Zdotaccent ; B 30 0 733 918 ;\nC -1 ; WX 556 ; N scaron ; B 60 -23 597" +" 757 ;\nC -1 ; WX 722 ; N Amacron ; B 26 0 706 901 ;\nC -1 ; WX 556 ; N sacute ;" +" B 60 -23 589 757 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 142 -307 753 729 ;\nC -1" +" ; WX 667 ; N Ydieresis ; B 182 0 805 920 ;\nC -1 ; WX 611 ; N thorn ; B 11 -218" +" 637 729 ;\nC -1 ; WX 667 ; N Emacron ; B 79 0 762 901 ;\nC -1 ; WX 778 ; N Ogra" +"ve ; B 106 -23 828 936 ;\nC -1 ; WX 778 ; N Oacute ; B 106 -23 828 936 ;\nC -1 ;" +" WX 778 ; N Odieresis ; B 106 -23 828 920 ;\nC -1 ; WX 722 ; N Ntilde ; B 68 0 8" +"16 923 ;\nC -1 ; WX 722 ; N Ncaron ; B 68 0 816 936 ;\nC -1 ; WX 722 ; N Nacute " +"; B 68 0 816 936 ;\nC -1 ; WX 611 ; N Lcaron ; B 80 0 607 729 ;\nC -1 ; WX 611 ;" +" N Lacute ; B 80 0 606 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 63 0 388 918 ;\nC" +" -1 ; WX 389 ; N racute ; B 63 0 500 757 ;\nC -1 ; WX 278 ; N Icircumflex ; B 63" +" 0 467 936 ;\nC -1 ; WX 611 ; N ohungarumlaut ; B 82 -23 710 757 ;\nC -1 ; WX 61" +"1 ; N otilde ; B 82 -23 639 744 ;\nC -1 ; WX 556 ; N Euro ; B 21 -23 648 724 ;\n" +"C -1 ; WX 611 ; N ocircumflex ; B 82 -23 634 757 ;\nC -1 ; WX 444 ; N onesuperio" +"r ; B 210 284 438 709 ;\nC -1 ; WX 444 ; N twosuperior ; B 124 284 499 718 ;\nC " +"-1 ; WX 444 ; N threesuperior ; B 147 271 490 718 ;\nC -1 ; WX 278 ; N Igrave ; " +"B 63 0 368 936 ;\nC -1 ; WX 278 ; N Iacute ; B 63 0 489 936 ;\nC -1 ; WX 278 ; N" +" Imacron ; B 63 0 466 901 ;\nC -1 ; WX 278 ; N Iogonek ; B 7 -233 368 729 ;\nC -" +"1 ; WX 278 ; N Idieresis ; B 63 0 483 920 ;\nC -1 ; WX 778 ; N Gbreve ; B 107 -2" +"3 819 934 ;\nC -1 ; WX 722 ; N Umacron ; B 119 -23 809 901 ;\nC -1 ; WX 722 ; N " +"Kcommaaccent ; B 74 -307 843 729 ;\nC -1 ; WX 611 ; N ograve ; B 82 -23 634 757 " +";\nC -1 ; WX 667 ; N Scommaaccent ; B 76 -307 725 741 ;\nC -1 ; WX 667 ; N Eogon" +"ek ; B 79 -233 762 729 ;\nC -1 ; WX 611 ; N oacute ; B 82 -23 634 757 ;\nC -1 ; " +"WX 667 ; N Edotaccent ; B 79 0 762 918 ;\nC -1 ; WX 268 ; N iogonek ; B 0 -233 3" +"51 729 ;\nC -1 ; WX 611 ; N gcommaaccent ; B 26 -218 656 854 ;\nC -1 ; WX 611 ; " +"N odieresis ; B 82 -23 634 741 ;\nC -1 ; WX 611 ; N ntilde ; B 63 0 646 744 ;\nC" +" -1 ; WX 611 ; N ncaron ; B 63 0 629 757 ;\nC -1 ; WX 667 ; N Ecaron ; B 79 0 76" +"2 936 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 79 0 762 936 ;\nC -1 ; WX 556 ; N sce" +"dilla ; B 60 -220 589 549 ;\nC -1 ; WX 389 ; N rcaron ; B 63 0 533 757 ;\nC -1 ;" +" WX 667 ; N Egrave ; B 79 0 762 936 ;\nC -1 ; WX 667 ; N Eacute ; B 79 0 762 936" +" ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 107 -307 819 741 ;\nC -1 ; WX 722 ; N Rco" +"mmaaccent ; B 80 -307 785 729 ;\nC -1 ; WX 667 ; N Edieresis ; B 79 0 762 920 ;\n" +"C -1 ; WX 611 ; N nacute ; B 63 0 629 757 ;\nC -1 ; WX 611 ; N uogonek ; B 88 -2" +"33 656 540 ;\nC -1 ; WX 611 ; N umacron ; B 88 -23 656 722 ;\nC -1 ; WX 722 ; N " +"Dcaron ; B 77 0 776 936 ;\nC -1 ; WX 384 ; N lcaron ; B 67 0 544 729 ;\nC -1 ; W" +"X 722 ; N Ccaron ; B 107 -23 793 936 ;\nC -1 ; WX 722 ; N Cacute ; B 107 -23 793" +" 936 ;\nC -1 ; WX 722 ; N Ccedilla ; B 107 -220 793 741 ;\nC -1 ; WX 606 ; N deg" +"ree ; B 240 383 543 686 ;\nC -1 ; WX 722 ; N Aogonek ; B 26 -233 703 729 ;\nC -1" +" ; WX 584 ; N minus ; B 77 172 606 292 ;\nC -1 ; WX 584 ; N multiply ; B 102 18 " +"582 444 ;\nC -1 ; WX 584 ; N divide ; B 77 0 606 462 ;\nC -1 ; WX 722 ; N Aring " +"; B 26 0 703 953 ;\nC -1 ; WX 1000 ; N trademark ; B 213 273 1087 729 ;\nC -1 ; " +"WX 389 ; N rcommaaccent ; B 8 -307 487 549 ;\nC -1 ; WX 278 ; N lacute ; B 67 0 " +"474 936 ;\nC -1 ; WX 611 ; N omacron ; B 82 -23 634 722 ;\nC -1 ; WX 722 ; N Ati" +"lde ; B 26 0 739 923 ;\nC -1 ; WX 278 ; N icircumflex ; B 67 0 426 757 ;\nC -1 ;" +" WX 278 ; N igrave ; B 67 0 322 757 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 63 -30" +"7 629 549 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 11 -307 362 729 ;\nC -1 ; WX 584" +" ; N plusminus ; B 50 0 630 633 ;\nC -1 ; WX 1055 ; N onehalf ; B 210 -20 1050 7" +"15 ;\nC -1 ; WX 1055 ; N onequarter ; B 210 -20 1032 715 ;\nC -1 ; WX 1055 ; N t" +"hreequarters ; B 147 -20 1032 718 ;\nC -1 ; WX 278 ; N iacute ; B 67 0 448 757 ;" +"\nC -1 ; WX 722 ; N Abreve ; B 26 0 703 934 ;\nC -1 ; WX 556 ; N kcommaaccent ; " +"B 59 -307 651 729 ;\nC -1 ; WX 778 ; N Omacron ; B 106 -23 828 901 ;\nC -1 ; WX " +"278 ; N imacron ; B 67 0 424 722 ;\nC -1 ; WX 556 ; N emacron ; B 64 -23 591 722" +" ;\nC -1 ; WX 556 ; N amacron ; B 50 -23 579 722 ;\nC -1 ; WX 333 ; N tcommaacce" +"nt ; B 62 -307 414 674 ;\nC -1 ; WX 556 ; N ydieresis ; B 37 -219 653 741 ;\nC -" +"1 ; WX 500 ; N zdotaccent ; B 21 0 575 741 ;\nC -1 ; WX 500 ; N zcaron ; B 21 0 " +"575 757 ;\nC -1 ; WX 500 ; N zacute ; B 21 0 575 757 ;\nC -1 ; WX 556 ; N yacute" +" ; B 37 -219 653 757 ;\nC -1 ; WX 611 ; N uhungarumlaut ; B 88 -23 697 757 ;\nC " +"-1 ; WX 611 ; N eth ; B 83 -23 633 744 ;\nC -1 ; WX 611 ; N uring ; B 88 -23 656" +" 773 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 106 -23 828 936 ;\nC -1 ; WX 333 ; N c" +"ommaaccent ; B 43 -307 217 -60 ;\nC -1 ; WX 737 ; N copyright ; B 54 -22 837 743" +" ;\nC -1 ; WX 737 ; N registered ; B 55 -22 837 743 ;\nC -1 ; WX 722 ; N Acircum" +"flex ; B 26 0 703 936 ;\nC -1 ; WX 278 ; N idieresis ; B 67 0 442 741 ;\nC -1 ; " +"WX 489 ; N lozenge ; B 95 0 541 744 ;\nC -1 ; WX 729 ; N Delta ; B 8 0 721 729 ;" +"\nC -1 ; WX 584 ; N notequal ; B 61 -74 622 544 ;\nC -1 ; WX 542 ; N radical ; B" +" 102 -36 705 913 ;\nC -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ;\nC -1 ; WX 722 ;" +" N Aacute ; B 26 0 714 936 ;\nC -1 ; WX 584 ; N lessequal ; B 35 0 657 624 ;\nC " +"-1 ; WX 584 ; N greaterequal ; B 44 0 627 624 ;\nC -1 ; WX 584 ; N logicalnot ; " +"B 103 86 632 376 ;\nC -1 ; WX 711 ; N summation ; B -18 -97 760 760 ;\nC -1 ; WX" +" 490 ; N partialdiff ; B 22 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 68" +" -307 816 729 ;\nC -1 ; WX 611 ; N dcroat ; B 79 -23 746 729 ;\nC -1 ; WX 280 ; " +"N brokenbar ; B 57 -200 335 729 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 80 -309 60" +"6 729 ;\nC -1 ; WX 722 ; N Adieresis ; B 26 0 708 920 ;\nC -1 ; WX 611 ; N mu ; " +"B 11 -220 655 540 ;\nC -1 ; WX 278 ; N .notdef ; B 245 0 245 0 ;\nEndCharMetrics" +"\nStartKernData\nStartKernPairs 998\nKPX A C -36\nKPX A Ccedilla -36\nKPX A G -3" +"8\nKPX A O -37\nKPX A Odieresis -37\nKPX A Q -39\nKPX A T -91\nKPX A U -37\nKPX " +"A Uacute -37\nKPX A Ucircumflex -37\nKPX A Udieresis -37\nKPX A Ugrave -37\nKPX " +"A V -74\nKPX A W -57\nKPX A Y -96\nKPX A a -11\nKPX A b -10\nKPX A c -17\nKPX A " +"ccedilla -17\nKPX A comma 9\nKPX A d -17\nKPX A e -10\nKPX A g -20\nKPX A guille" +"motleft -48\nKPX A guilsinglleft -44\nKPX A hyphen 2\nKPX A o -19\nKPX A period " +"13\nKPX A q -13\nKPX A quotedblright -71\nKPX A quoteright -67\nKPX A t -21\nKPX" +" A u -17\nKPX A v -42\nKPX A w -28\nKPX A y -41\nKPX Aacute C -37\nKPX Aacute G " +"-38\nKPX Aacute O -38\nKPX Aacute Q -40\nKPX Aacute T -91\nKPX Aacute U -38\nKPX" +" Aacute V -74\nKPX Aacute W -57\nKPX Aacute Y -96\nKPX Aacute a -11\nKPX Aacute " +"b -10\nKPX Aacute c -17\nKPX Aacute comma 9\nKPX Aacute d -17\nKPX Aacute e -11\n" +"KPX Aacute g -20\nKPX Aacute guillemotleft -48\nKPX Aacute guilsinglleft -45\nKP" +"X Aacute hyphen 2\nKPX Aacute o -20\nKPX Aacute period 12\nKPX Aacute q -14\nKPX" +" Aacute quoteright -67\nKPX Aacute t -22\nKPX Aacute u -18\nKPX Aacute v -42\nKP" +"X Aacute w -29\nKPX Aacute y -41\nKPX Acircumflex C -36\nKPX Acircumflex G -38\n" +"KPX Acircumflex O -37\nKPX Acircumflex Q -39\nKPX Acircumflex T -91\nKPX Acircum" +"flex U -37\nKPX Acircumflex V -74\nKPX Acircumflex W -57\nKPX Acircumflex Y -96\n" +"KPX Acircumflex comma 9\nKPX Acircumflex period 13\nKPX Adieresis C -37\nKPX Adi" +"eresis G -38\nKPX Adieresis O -38\nKPX Adieresis Q -39\nKPX Adieresis T -91\nKPX" +" Adieresis U -38\nKPX Adieresis V -74\nKPX Adieresis W -57\nKPX Adieresis Y -96\n" +"KPX Adieresis a -11\nKPX Adieresis b -10\nKPX Adieresis c -17\nKPX Adieresis com" +"ma 9\nKPX Adieresis d -17\nKPX Adieresis g -20\nKPX Adieresis guillemotleft -48\n" +"KPX Adieresis guilsinglleft -44\nKPX Adieresis hyphen 2\nKPX Adieresis o -20\nKP" +"X Adieresis period 12\nKPX Adieresis q -13\nKPX Adieresis quotedblright -71\nKPX" +" Adieresis quoteright -67\nKPX Adieresis t -22\nKPX Adieresis u -17\nKPX Adieres" +"is v -42\nKPX Adieresis w -28\nKPX Adieresis y -41\nKPX Agrave C -36\nKPX Agrave" +" G -38\nKPX Agrave O -37\nKPX Agrave Q -39\nKPX Agrave T -91\nKPX Agrave U -37\n" +"KPX Agrave V -74\nKPX Agrave W -57\nKPX Agrave Y -96\nKPX Agrave comma 9\nKPX Ag" +"rave period 13\nKPX Aring C -36\nKPX Aring G -38\nKPX Aring O -37\nKPX Aring Q -" +"39\nKPX Aring T -91\nKPX Aring U -37\nKPX Aring V -74\nKPX Aring W -57\nKPX Arin" +"g Y -96\nKPX Aring a -11\nKPX Aring b -10\nKPX Aring c -17\nKPX Aring comma 9\nK" +"PX Aring d -17\nKPX Aring e -10\nKPX Aring g -20\nKPX Aring guillemotleft -48\nK" +"PX Aring guilsinglleft -44\nKPX Aring hyphen 2\nKPX Aring o -19\nKPX Aring perio" +"d 13\nKPX Aring q -13\nKPX Aring quotedblright -71\nKPX Aring quoteright -67\nKP" +"X Aring t -21\nKPX Aring u -17\nKPX Aring v -42\nKPX Aring w -28\nKPX Aring y -4" +"1\nKPX Atilde C -38\nKPX Atilde G -40\nKPX Atilde O -39\nKPX Atilde Q -41\nKPX A" +"tilde T -92\nKPX Atilde U -39\nKPX Atilde V -74\nKPX Atilde W -57\nKPX Atilde Y " +"-96\nKPX Atilde comma 9\nKPX Atilde period 11\nKPX B A -41\nKPX B AE -30\nKPX B " +"Aacute -41\nKPX B Acircumflex -41\nKPX B Adieresis -41\nKPX B Aring -41\nKPX B A" +"tilde -41\nKPX B O -18\nKPX B OE -9\nKPX B Oacute -18\nKPX B Ocircumflex -18\nKP" +"X B Odieresis -18\nKPX B Ograve -18\nKPX B Oslash -17\nKPX B V -46\nKPX B W -30\n" +"KPX B Y -63\nKPX C A -34\nKPX C AE -23\nKPX C Aacute -34\nKPX C Adieresis -34\nK" +"PX C Aring -34\nKPX C H -1\nKPX C K -4\nKPX C O -12\nKPX C Oacute -12\nKPX C Odi" +"eresis -12\nKPX Ccedilla A -34\nKPX D A -40\nKPX D Aacute -40\nKPX D Acircumflex" +" -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Aring -40\nKPX D Atilde -40\n" +"KPX D J -4\nKPX D T -24\nKPX D V -37\nKPX D W -20\nKPX D X -40\nKPX D Y -62\nKPX" +" F A -68\nKPX F Aacute -68\nKPX F Acircumflex -68\nKPX F Adieresis -68\nKPX F Ag" +"rave -68\nKPX F Aring -68\nKPX F Atilde -68\nKPX F J -33\nKPX F O -24\nKPX F Odi" +"eresis -24\nKPX F a -23\nKPX F aacute -23\nKPX F adieresis -23\nKPX F ae -26\nKP" +"X F aring -23\nKPX F comma -84\nKPX F e -12\nKPX F eacute -12\nKPX F hyphen 4\nK" +"PX F i -15\nKPX F j -17\nKPX F o -21\nKPX F oacute -21\nKPX F odieresis -21\nKPX" +" F oe -16\nKPX F oslash -24\nKPX F period -82\nKPX F r -35\nKPX F u -32\nKPX G A" +" -17\nKPX G AE -5\nKPX G Aacute -17\nKPX G Acircumflex -17\nKPX G Adieresis -17\n" +"KPX G Agrave -17\nKPX G Aring -17\nKPX G Atilde -17\nKPX G T -28\nKPX G V -41\nK" +"PX G W -25\nKPX G Y -65\nKPX J A -38\nKPX J AE -29\nKPX J Adieresis -38\nKPX J A" +"ring -38\nKPX K C -59\nKPX K G -61\nKPX K O -60\nKPX K OE -51\nKPX K Oacute -60\n" +"KPX K Odieresis -60\nKPX K S -45\nKPX K T 5\nKPX K a -17\nKPX K adieresis -17\nK" +"PX K ae -17\nKPX K aring -17\nKPX K e -38\nKPX K hyphen -52\nKPX K o -45\nKPX K " +"oacute -45\nKPX K odieresis -45\nKPX K u -35\nKPX K udieresis -35\nKPX K y -74\n" +"KPX L A 0\nKPX L AE 12\nKPX L Aacute 0\nKPX L Adieresis 0\nKPX L Aring 0\nKPX L " +"C -35\nKPX L Ccedilla -36\nKPX L G -40\nKPX L O -39\nKPX L Oacute -39\nKPX L Oci" +"rcumflex -39\nKPX L Odieresis -39\nKPX L Ograve -39\nKPX L Otilde -39\nKPX L S -" +"14\nKPX L T -104\nKPX L U -35\nKPX L Udieresis -35\nKPX L V -102\nKPX L W -79\nK" +"PX L Y -121\nKPX L hyphen -20\nKPX L quotedblright -147\nKPX L quoteright -143\n" +"KPX L u -17\nKPX L udieresis -17\nKPX L y -64\nKPX N A -15\nKPX N AE -2\nKPX N A" +"acute -15\nKPX N Adieresis -15\nKPX N Aring -15\nKPX N C -1\nKPX N Ccedilla -1\n" +"KPX N G -2\nKPX N O -2\nKPX N Oacute -2\nKPX N Odieresis -2\nKPX N a 5\nKPX N aa" +"cute 5\nKPX N adieresis 5\nKPX N ae 4\nKPX N aring 5\nKPX N comma 7\nKPX N e 10\n" +"KPX N eacute 10\nKPX N o 1\nKPX N oacute 1\nKPX N odieresis 1\nKPX N oslash 2\nK" +"PX N period 8\nKPX N u 4\nKPX N udieresis 4\nKPX O A -42\nKPX O AE -33\nKPX O Aa" +"cute -42\nKPX O Adieresis -42\nKPX O Aring -42\nKPX O T -32\nKPX O V -40\nKPX O " +"W -24\nKPX O X -43\nKPX O Y -65\nKPX Oacute A -42\nKPX Oacute T -32\nKPX Oacute " +"V -40\nKPX Oacute W -24\nKPX Oacute Y -65\nKPX Ocircumflex T -32\nKPX Ocircumfle" +"x V -40\nKPX Ocircumflex Y -65\nKPX Odieresis A -42\nKPX Odieresis T -32\nKPX Od" +"ieresis V -40\nKPX Odieresis W -24\nKPX Odieresis X -43\nKPX Odieresis Y -65\nKP" +"X Ograve T -32\nKPX Ograve V -40\nKPX Ograve Y -65\nKPX Oslash A -34\nKPX Otilde" +" T -32\nKPX Otilde V -40\nKPX Otilde Y -65\nKPX P A -71\nKPX P AE -62\nKPX P Aac" +"ute -71\nKPX P Adieresis -71\nKPX P Aring -71\nKPX P J -52\nKPX P a -14\nKPX P a" +"acute -14\nKPX P adieresis -14\nKPX P ae -15\nKPX P aring -14\nKPX P comma -103\n" +"KPX P e -13\nKPX P eacute -13\nKPX P hyphen -7\nKPX P o -22\nKPX P oacute -22\nK" +"PX P odieresis -22\nKPX P oe -17\nKPX P oslash -26\nKPX P period -101\nKPX R C -" +"12\nKPX R Ccedilla -12\nKPX R G -13\nKPX R O -13\nKPX R OE -3\nKPX R Oacute -13\n" +"KPX R Odieresis -13\nKPX R T -12\nKPX R U -12\nKPX R Udieresis -12\nKPX R V -38\n" +"KPX R W -22\nKPX R Y -50\nKPX R a -4\nKPX R aacute -4\nKPX R adieresis -4\nKPX R" +" ae -5\nKPX R aring -4\nKPX R e 0\nKPX R eacute 0\nKPX R hyphen 10\nKPX R o -9\n" +"KPX R oacute -9\nKPX R odieresis -9\nKPX R oe -4\nKPX R u -6\nKPX R uacute -6\nK" +"PX R udieresis -6\nKPX R y -4\nKPX S A -26\nKPX S AE -14\nKPX S Aacute -26\nKPX " +"S Adieresis -26\nKPX S Aring -26\nKPX S T -15\nKPX S V -36\nKPX S W -20\nKPX S Y" +" -54\nKPX S t -4\nKPX T A -93\nKPX T AE -85\nKPX T Aacute -93\nKPX T Acircumflex" +" -93\nKPX T Adieresis -93\nKPX T Agrave -93\nKPX T Aring -93\nKPX T Atilde -93\n" +"KPX T C -29\nKPX T G -30\nKPX T J -95\nKPX T O -30\nKPX T OE -20\nKPX T Oacute -" +"30\nKPX T Ocircumflex -30\nKPX T Odieresis -30\nKPX T Ograve -30\nKPX T Oslash -" +"36\nKPX T Otilde -30\nKPX T S -7\nKPX T V 9\nKPX T W 15\nKPX T Y 7\nKPX T a -77\n" +"KPX T ae -78\nKPX T c -79\nKPX T colon -104\nKPX T comma -75\nKPX T e -72\nKPX T" +" g -79\nKPX T guillemotleft -107\nKPX T guilsinglleft -103\nKPX T hyphen -53\nKP" +"X T i -9\nKPX T j -11\nKPX T o -81\nKPX T oslash -80\nKPX T period -73\nKPX T r " +"-76\nKPX T s -81\nKPX T semicolon -105\nKPX T u -78\nKPX T v -91\nKPX T w -85\nK" +"PX T y -89\nKPX U A -40\nKPX U AE -30\nKPX U Aacute -40\nKPX U Acircumflex -40\n" +"KPX U Adieresis -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -17\nKPX U m" +" -3\nKPX U n -5\nKPX U p -3\nKPX U period -12\nKPX U r -5\nKPX Uacute A -40\nKPX" +" Uacute comma -17\nKPX Uacute m -3\nKPX Uacute n -5\nKPX Uacute p -3\nKPX Uacute" +" period -12\nKPX Uacute r -5\nKPX Ucircumflex A -40\nKPX Udieresis A -40\nKPX Ud" +"ieresis b -4\nKPX Udieresis comma -17\nKPX Udieresis m -3\nKPX Udieresis n -5\nK" +"PX Udieresis p -3\nKPX Udieresis period -12\nKPX Udieresis r -5\nKPX Ugrave A -4" +"0\nKPX V A -75\nKPX V AE -65\nKPX V Aacute -75\nKPX V Acircumflex -75\nKPX V Adi" +"eresis -75\nKPX V Agrave -75\nKPX V Aring -75\nKPX V Atilde -75\nKPX V C -43\nKP" +"X V G -44\nKPX V O -44\nKPX V Oacute -44\nKPX V Ocircumflex -44\nKPX V Odieresis" +" -44\nKPX V Ograve -44\nKPX V Oslash -42\nKPX V Otilde -44\nKPX V S -31\nKPX V T" +" 12\nKPX V a -51\nKPX V ae -52\nKPX V colon -74\nKPX V comma -76\nKPX V e -46\nK" +"PX V g -54\nKPX V guillemotleft -81\nKPX V guilsinglleft -77\nKPX V hyphen -26\n" +"KPX V i -13\nKPX V o -56\nKPX V oslash -55\nKPX V period -74\nKPX V r -43\nKPX V" +" semicolon -77\nKPX V u -42\nKPX V y -19\nKPX W A -59\nKPX W AE -50\nKPX W Aacut" +"e -59\nKPX W Acircumflex -59\nKPX W Adieresis -59\nKPX W Agrave -59\nKPX W Aring" +" -59\nKPX W Atilde -59\nKPX W C -28\nKPX W G -29\nKPX W O -29\nKPX W Oacute -29\n" +"KPX W Ocircumflex -29\nKPX W Odieresis -29\nKPX W Ograve -29\nKPX W Oslash -27\n" +"KPX W Otilde -29\nKPX W S -22\nKPX W T 16\nKPX W a -34\nKPX W ae -34\nKPX W colo" +"n -61\nKPX W comma -53\nKPX W e -28\nKPX W g -36\nKPX W guillemotleft -63\nKPX W" +" guilsinglleft -59\nKPX W hyphen -9\nKPX W i -9\nKPX W o -38\nKPX W oslash -37\n" +"KPX W period -51\nKPX W r -33\nKPX W semicolon -63\nKPX W u -32\nKPX W y -9\nKPX" +" X C -39\nKPX X O -40\nKPX X Odieresis -40\nKPX X Q -43\nKPX X a -17\nKPX X e -3" +"3\nKPX X hyphen -33\nKPX X o -43\nKPX X u -35\nKPX X y -48\nKPX Y A -91\nKPX Y A" +"E -81\nKPX Y Aacute -91\nKPX Y Acircumflex -91\nKPX Y Adieresis -91\nKPX Y Agrav" +"e -91\nKPX Y Aring -91\nKPX Y Atilde -91\nKPX Y C -60\nKPX Y G -61\nKPX Y O -61\n" +"KPX Y Oacute -61\nKPX Y Ocircumflex -61\nKPX Y Odieresis -61\nKPX Y Ograve -61\n" +"KPX Y Oslash -58\nKPX Y Otilde -61\nKPX Y S -39\nKPX Y T 14\nKPX Y a -71\nKPX Y " +"ae -71\nKPX Y colon -90\nKPX Y comma -85\nKPX Y e -66\nKPX Y g -73\nKPX Y guille" +"motleft -105\nKPX Y guilsinglleft -101\nKPX Y hyphen -55\nKPX Y i -11\nKPX Y o -" +"76\nKPX Y oslash -74\nKPX Y p -53\nKPX Y period -84\nKPX Y semicolon -93\nKPX Y " +"u -57\nKPX Y v -36\nKPX Z v -21\nKPX Z y -19\nKPX a j -7\nKPX a quoteright -14\n" +"KPX a v -23\nKPX a w -10\nKPX a y -24\nKPX aacute v -23\nKPX aacute w -10\nKPX a" +"acute y -24\nKPX adieresis v -23\nKPX adieresis w -10\nKPX adieresis y -24\nKPX " +"ae v -21\nKPX ae w -7\nKPX ae y -23\nKPX agrave v -23\nKPX agrave w -10\nKPX agr" +"ave y -24\nKPX aring v -23\nKPX aring w -10\nKPX aring y -24\nKPX b v -23\nKPX b" +" w -9\nKPX b y -25\nKPX c h -9\nKPX c k -5\nKPX comma one -79\nKPX comma quotedb" +"lright -39\nKPX comma quoteright -35\nKPX e quoteright -13\nKPX e t -9\nKPX e v " +"-22\nKPX e w -9\nKPX e x -25\nKPX e y -25\nKPX eacute v -22\nKPX eacute w -9\nKP" +"X eacute y -25\nKPX ecircumflex v -22\nKPX ecircumflex w -9\nKPX ecircumflex y -" +"25\nKPX eight four 2\nKPX eight one -32\nKPX eight seven -15\nKPX f a -6\nKPX f " +"aacute -6\nKPX f adieresis -6\nKPX f ae -6\nKPX f aring -6\nKPX f e -6\nKPX f ea" +"cute -6\nKPX f f 14\nKPX f i -13\nKPX f j -15\nKPX f l -13\nKPX f o -16\nKPX f o" +"acute -16\nKPX f odieresis -16\nKPX f oe -11\nKPX f oslash -16\nKPX f quoteright" +" 0\nKPX f s -10\nKPX f t 14\nKPX five four -3\nKPX five one -37\nKPX five seven " +"-17\nKPX four four 0\nKPX four one -55\nKPX four seven -33\nKPX g a -3\nKPX g ad" +"ieresis -3\nKPX g ae -4\nKPX g aring -3\nKPX g e 1\nKPX g eacute 1\nKPX g l -5\n" +"KPX g oacute -8\nKPX g odieresis -8\nKPX g r -3\nKPX guillemotright A -56\nKPX g" +"uillemotright AE -46\nKPX guillemotright Aacute -56\nKPX guillemotright Adieresi" +"s -56\nKPX guillemotright Aring -56\nKPX guillemotright T -115\nKPX guillemotrig" +"ht V -84\nKPX guillemotright W -65\nKPX guillemotright Y -117\nKPX guilsinglrigh" +"t A -52\nKPX guilsinglright AE -42\nKPX guilsinglright Aacute -52\nKPX guilsingl" +"right Adieresis -52\nKPX guilsinglright Aring -52\nKPX guilsinglright T -110\nKP" +"X guilsinglright V -79\nKPX guilsinglright W -60\nKPX guilsinglright Y -113\nKPX" +" h quoteright -15\nKPX h y -25\nKPX hyphen A -7\nKPX hyphen AE 2\nKPX hyphen Aac" +"ute -7\nKPX hyphen Adieresis -7\nKPX hyphen Aring -7\nKPX hyphen T -64\nKPX hyph" +"en V -34\nKPX hyphen W -15\nKPX hyphen Y -71\nKPX i T -12\nKPX i j -7\nKPX k a -" +"13\nKPX k aacute -13\nKPX k adieresis -13\nKPX k ae -15\nKPX k aring -13\nKPX k " +"comma -3\nKPX k e -19\nKPX k eacute -19\nKPX k g -26\nKPX k hyphen -31\nKPX k o " +"-28\nKPX k oacute -28\nKPX k odieresis -28\nKPX k period -3\nKPX k s -23\nKPX k " +"u -8\nKPX k udieresis -8\nKPX l v -14\nKPX l y -11\nKPX m p -1\nKPX m v -23\nKPX" +" m w -9\nKPX m y -23\nKPX n T -87\nKPX n p -2\nKPX n quoteright -15\nKPX n v -24" +"\nKPX n w -11\nKPX n y -25\nKPX nine four -6\nKPX nine one -30\nKPX nine seven -" +"23\nKPX o T -90\nKPX o quoteright -19\nKPX o t -13\nKPX o v -27\nKPX o w -13\nKP" +"X o x -30\nKPX o y -29\nKPX oacute v -27\nKPX oacute w -13\nKPX oacute y -29\nKP" +"X ocircumflex t -13\nKPX odieresis t -13\nKPX odieresis v -27\nKPX odieresis w -" +"13\nKPX odieresis x -30\nKPX odieresis y -29\nKPX ograve v -27\nKPX ograve w -13" +"\nKPX ograve y -29\nKPX one comma -51\nKPX one eight -47\nKPX one five -50\nKPX " +"one four -70\nKPX one nine -47\nKPX one one -92\nKPX one period -49\nKPX one sev" +"en -72\nKPX one six -48\nKPX one three -53\nKPX one two -56\nKPX one zero -44\nK" +"PX p t -10\nKPX p y -25\nKPX period one -80\nKPX period quotedblright -39\nKPX p" +"eriod quoteright -35\nKPX q c -3\nKPX q u -3\nKPX quotedblbase A 7\nKPX quotedbl" +"base AE 19\nKPX quotedblbase T -79\nKPX quotedblbase V -77\nKPX quotedblbase W -" +"54\nKPX quotedblbase Y -96\nKPX quotedblleft A -72\nKPX quotedblleft AE -64\nKPX" +" quotedblleft Aacute -72\nKPX quotedblleft Adieresis -72\nKPX quotedblleft Aring" +" -72\nKPX quotedblleft T -11\nKPX quotedblleft V 0\nKPX quotedblleft W 9\nKPX qu" +"otedblleft Y -15\nKPX quotedblright A -72\nKPX quotedblright AE -64\nKPX quotedb" +"lright Aacute -72\nKPX quotedblright Adieresis -72\nKPX quotedblright Aring -72\n" +"KPX quotedblright T -7\nKPX quotedblright V 1\nKPX quotedblright W 11\nKPX quote" +"dblright Y -14\nKPX quoteleft A -76\nKPX quoteleft AE -69\nKPX quoteleft Aacute " +"-76\nKPX quoteleft Adieresis -76\nKPX quoteleft Aring -76\nKPX quoteleft T -15\n" +"KPX quoteleft V -4\nKPX quoteleft W 5\nKPX quoteleft Y -20\nKPX quoteright A -80" +"\nKPX quoteright AE -72\nKPX quoteright Aacute -80\nKPX quoteright Adieresis -80" +"\nKPX quoteright Aring -80\nKPX quoteright comma -53\nKPX quoteright d -30\nKPX " +"quoteright o -34\nKPX quoteright period -51\nKPX quoteright r -20\nKPX quoterigh" +"t s -27\nKPX quoteright t -11\nKPX quoteright v -11\nKPX quoteright w -4\nKPX qu" +"oteright y -9\nKPX r a -1\nKPX r aacute -1\nKPX r acircumflex -1\nKPX r adieresi" +"s -1\nKPX r ae -2\nKPX r agrave -1\nKPX r aring -1\nKPX r c -6\nKPX r ccedilla -" +"6\nKPX r colon -36\nKPX r comma -64\nKPX r d -5\nKPX r e 2\nKPX r eacute 2\nKPX " +"r ecircumflex 2\nKPX r egrave 2\nKPX r f 15\nKPX r g -7\nKPX r h -12\nKPX r hyph" +"en -40\nKPX r i -12\nKPX r j -13\nKPX r k -8\nKPX r l -12\nKPX r m -8\nKPX r n -" +"10\nKPX r o -7\nKPX r oacute -7\nKPX r ocircumflex -7\nKPX r odieresis -7\nKPX r" +" oe -2\nKPX r ograve -7\nKPX r oslash -12\nKPX r p -7\nKPX r period -63\nKPX r q" +" -2\nKPX r quoteright 4\nKPX r r -10\nKPX r s -4\nKPX r semicolon -37\nKPX r t 1" +"5\nKPX r u -8\nKPX r v 12\nKPX r w 17\nKPX r x 7\nKPX r y 14\nKPX r z 2\nKPX s q" +"uoteright -12\nKPX s t -9\nKPX seven colon -71\nKPX seven comma -95\nKPX seven e" +"ight -10\nKPX seven five -28\nKPX seven four -70\nKPX seven one -21\nKPX seven p" +"eriod -94\nKPX seven seven 2\nKPX seven six -21\nKPX seven three -7\nKPX seven t" +"wo -11\nKPX six four -1\nKPX six one -29\nKPX six seven -13\nKPX t S -9\nKPX t a" +" -3\nKPX t aacute -3\nKPX t adieresis -3\nKPX t ae -5\nKPX t aring -3\nKPX t col" +"on -41\nKPX t e -5\nKPX t eacute -5\nKPX t h -9\nKPX t o -15\nKPX t oacute -15\n" +"KPX t odieresis -15\nKPX t quoteright -3\nKPX t semicolon -42\nKPX three four -2" +"\nKPX three one -34\nKPX three seven -19\nKPX two four -16\nKPX two one -24\nKPX" +" two seven -12\nKPX u quoteright -8\nKPX v a -21\nKPX v aacute -21\nKPX v acircu" +"mflex -21\nKPX v adieresis -21\nKPX v ae -21\nKPX v agrave -21\nKPX v aring -21\n" +"KPX v atilde -21\nKPX v c -25\nKPX v colon -41\nKPX v comma -57\nKPX v e -18\nKP" +"X v eacute -18\nKPX v ecircumflex -18\nKPX v egrave -18\nKPX v g -26\nKPX v hyph" +"en -5\nKPX v l -12\nKPX v o -28\nKPX v oacute -28\nKPX v odieresis -28\nKPX v og" +"rave -28\nKPX v oslash -28\nKPX v period -55\nKPX v s -25\nKPX v semicolon -43\n" +"KPX w a -11\nKPX w aacute -11\nKPX w acircumflex -11\nKPX w adieresis -11\nKPX w" +" ae -12\nKPX w agrave -11\nKPX w aring -11\nKPX w atilde -11\nKPX w c -12\nKPX w" +" colon -36\nKPX w comma -38\nKPX w e -5\nKPX w eacute -5\nKPX w ecircumflex -5\n" +"KPX w egrave -5\nKPX w g -13\nKPX w hyphen 7\nKPX w l -8\nKPX w o -15\nKPX w oac" +"ute -15\nKPX w odieresis -15\nKPX w ograve -15\nKPX w oslash -14\nKPX w period -" +"36\nKPX w s -15\nKPX w semicolon -38\nKPX x a -22\nKPX x c -27\nKPX x e -20\nKPX" +" x eacute -20\nKPX x o -30\nKPX x q -23\nKPX y a -20\nKPX y aacute -20\nKPX y ac" +"ircumflex -20\nKPX y adieresis -20\nKPX y ae -20\nKPX y agrave -20\nKPX y aring " +"-20\nKPX y atilde -20\nKPX y c -26\nKPX y colon -40\nKPX y comma -58\nKPX y e -1" +"9\nKPX y eacute -19\nKPX y ecircumflex -19\nKPX y egrave -19\nKPX y g -27\nKPX y" +" hyphen -4\nKPX y l -11\nKPX y o -28\nKPX y oacute -28\nKPX y odieresis -28\nKPX" +" y ograve -28\nKPX y oslash -27\nKPX y period -55\nKPX y s -24\nKPX y semicolon " +"-43\nKPX zero four -3\nKPX zero one -29\nKPX zero seven -21\nEndKernPairs\nEndKe" +"rnData\nEndFontMetrics\n" +; +int n019024l_pfb_len = 39013; +char* n019024l_pfb = +"\x80\x1h\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-BoldItal 1.05\n%%CreationDate: W" +"ed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developme" +"nt\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COP" +"YING (GNU General Public License) for license conditions.\n% As a special except" +"ion, permission is granted to include this font\n% program in a Postscript or PD" +"F file that consists of a document that\n% contains text to be displayed or prin" +"ted using this font, regardless\n% of the conditions or license applying to the " +"document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) re" +"adonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See" +" the file COPYING (GNU General Public License) for license conditions. As a spec" +"ial exception, permission is granted to include this font program in a Postscrip" +"t or PDF file that consists of a document that contains text to be displayed or " +"printed using this font, regardless of the conditions or license applying to the" +" document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by" +" (URW)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Bold Itali" +"c) readonly def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Bold) readon" +"ly def\n/ItalicAngle -12.0 def\n/isFixedPitch false def\n/UnderlinePosition -111" +" def\n/UnderlineThickness 69 def\nend readonly def\n/FontName /NimbusSanL-BoldIt" +"al def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-177 -309 1107 953} readonly " +"def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/E" +"ncoding StandardEncoding def\n/UniqueID 5020910 def\ncurrentdict end\ncurrentfil" +"e eexec\r\x80\x2\xd5\x8f\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3" +"[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r" +"\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff" +"++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93" +"\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81" +"nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff" +"\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>o/\xe1\x84\x83_\xa9\xb8" +"\xbaw[\xe9\x42[{'\x83\xc5t\x9a\x80\xcbG\x86\x32\x98\xcc\x95\x11\xc3>\x13\xe1\xb6" +"Y\xacx\x95\xf1\xf2\xd6O\xa9\xb8\xbf\x65\xbd;i\xa7\xd2\x1d\x8c\xf7\xce\x10\xe6\xaf" +"\x8aTE\xaf{j\xb8vm\xd0\x7/\x11@\xc9\x87\xb\x61\x39\x9d:\xfbr\xa8\xb8\x11uK\xa9\xd9" +"\xb4\xb6\\\x66\x46\x1cJk\xaf\x8a\x93\xda\x10\xfb\x44@\xc0%\xf6Q{\xf0\xb4\xaa\xa3" +" \xea\xb6\xcb\xad\x8a:\x5\xaa\xb4\x11J4iN\xf8\x61\x93\xa6\xfa\xed$\x8e\x1c\xadS\xb1" +"nz3\x91=\x91\x44\xb2\xfc\xa9>\x9cu\xac\xcbp\xdcU\xda\xbb[\x1e\x84\xf0\xbay;\xe4T" +"\x17)S\x12\xea\xd0\xe8\xb7{\xae@\xe2He\x81Q\xb2\xe5,T\xe6i\x9fV\xf3#\x19k\x8d\x62" +"\x0\xc2\x9a\xb2V\xc6\xc2\xf0?\xdf\xf7\xe4\x81\xc5\x1e\x8c\xad%\xf0Y\xd7\x96\xf7\x8a" +"g\x16nqj\"\xf\x63\xdf\xe3\x94\xd8Y\xf9s=\x84\x8b\x1d\xf3iXnc\x83\xea\r\xe1\xe0\xaa" +"\x13\xa2s\x9fh\x94\x8a?\xf2\xe6\xf6:H\xb6O1\x90R\x96\xfb>\xe1\x82\x93\x95i\xe0\x33" +"\x8c\xab=\xbf\xf4\x36v\xb4V7\xbd\xd9\xa9T\xbdp\r\xfb\xcb\x61\x44\x90\xc5U\x88n5\x92" +"\xda\xc0\x80\xf8\x90\x82\x97%#\x9d\x32\x6\x8e\x1f\x81:3\x5\x30\xc9\x2\xeb\x8f<\xe8" +"\xa2\x93\x8a\xc2\x35\x92\x80\xdc\xc7RZ\xaa\x7f( \x0\x16\xf6\x8aT\x16\x94\xdb\x9c" +",\x14\x84S\xfe\x35\x3\x61\xad\xdc\xc6\xb7<6\xe0\xe4\xfaH\x8e-3\xe2\xcc\xf9\xc8i\r" +"\xd2\x7\x8e\x98\r\x1ch\x18\x41=\x8auf6\xda\xfaH \xd8\x98x\x9f\x62\xccL-6\xc5nH\xa9" +"\x82\xae\xc4o\rVYv\xb8i\x17\x89z>\xa6R\xdd\x1b\x3k\x18\x1b\x8e\xa3G\xcdK\xfa\x34" +"@FN\x97JK\xbcGsi0\x8a\xc6{\\\xcT\xb0%\x65h\xb7\xb4\xe5\xd4\x5 \xe\xa1\x37\xfe\x99" +"\xa7\xca\xd6\x4\xe8\xa8\x3t\x91\x99 \x10\xa6\x9b\xe0\xc3\xf4\xf2Q\xa2\x63\x42i\x2" +"\xd9\x9c\xfcQ,\xeeQj\xd3NZ\xa9\x9b\x31:\xacRd\xf0\x5\x8d\xe5\x83\x64nB\x89\xf4\x41" +"\xfa\r\xba\x0\x37\xf0J\x85\x7f.\xfd\n\xf8\xe7\xfe\x45RV\xd5so\x1a\xb1\xd9\xb5\x62" +"\xe9%\x12\x4\xa9vR\xe2\xf8\x16{}\xce\x38\xf3\xe1\xca\x8\x1d\x8\xdf\xa7\x89vNHP\x16" +"\xd6\xe9\xd6\x89\x63k`\xf9\xc\xee\xf1gm\x10\xc8\xad\xd4 \xce+\x9d\xecO\xe7'3\xbf" +"\x6\xfc\x65\xafJx0\xcc\xfc\xd6\x64t\xbd\x45\xdf\xe8\x11r\xbd\xe4\x37\x9f\x5\x8cv" +"\xfb@\xc3$\x9c\xa8\x0\x5\x61\xd2\xf1\x19\x9bR!\xe8\xa6@O\x90\xfa\x8f\xed\xc0\x84" +"\x8f\x1\xf\xd5\x1b\xe1\xcf>\xf6\xfe\xde\xd2\\\x10\xa7\x37@?\xb4\x80;\xd6\x35\xc0" +"\\\xa8\xd5\xcf\x9b\xcc\x9c\xf5\x32\x32\x45K\x91\xbd)9\x87n\xd5K\x18\x1d!*6\x95\x31" +"\xc4\xf3\x8aV\xf5\x9c\xb4\x84\xa2\xf9*i\xca\xd3\x7f\xee\xb9r\nIVn\xdf\x37\xee\x38" +"\x8a\x99\xc2X\xdc\xdeY\x98\xe5\xd8Q\xe1\xc1#\xd7\x4\xb3\x7f\"\xe0jv\x1a\x63\x41\x63" +"\xc2\xac\x41[\xcb\x83\x2=#Y\x94Z\xc0\xb3\x1d!\xccN\xd0`\xa0\x34\xff/;`P\x81\xd4h" +"\x92\x8e\xb7/\xb5^\xc\x1a\xbe\x9!\xaa\x4\xd2\x15@\xa9'*ST\x87\x63k\x8a\xd3\x98\xa1" +"\x9c\xba\x9a+g[{\xd5\xfbV\xfc\xfc\x4k\xae\xb0\xac\xc6\xe6\x83\xe@.)\xb3\x6w\xf5\xcc" +"l\xd6\x0\x8x:\xfb+\xdb#DY\x90\x43\x9a\xe1\xf3\x37\xdc\x41\x8a\xbd\xb4\x46$;v\xd4" +"(\x0\xe7\x7f\xc5\xf4\x80\xc8\xf3\x3}\x8aWYv\xb5k\x9f\xce\xc9\xf2\xdet$\xdd\x7f\x85" +"\x5\x90\xcf\"\xdak\xd5\x62\xea\xc3\xc0\xbfM\x1f\xfc\xbd\xf8\x1f\x1d_\x9fQ\xe3nMO" +"\x1\xa4\xb6q\xedy8\xd0K\x12\xc7\x84\xe4\xac\xbc:J\x2\x37L\x82\x38\\\x8=\x7\xaf\x13" +";A\xbfIuI\xfd$\x16\x9a\x87\x15\"nj\xda\xca\x39\x82\xb\x33P\x82\x63\xeb\xdb\xacqx" +"\x8d\xaf\x9e\xf8\x41\xb0\xd1\x92\x30\xd8\xafy\x98=Qv\x12\x1d\x9b\x82\xd7\xba\xc7" +"\xcf\xbd\x83\x11\x6\x39\xa9\x99\x9a\xaa\x35\x15z\x1d!\xea\xe6\x36\x8a\x8d\x35\x15" +"\xfe\x8e\xb0=\xa2\xb3 \x9e\x17\xf2.O%\xb\x1a\"\xd6\xcf\x37\xa7\x86@`\x89\x46\x93" +"\x93}\xd4\r\x83\xc3\x16]v\xc2\xf7\x7f\xb5\xbc-\xc8\x4i\xd7\xf3y\xc9\xbf\x31[\xcb" +"\xc1\xb4\xc0s\x8c\x33\xb5M\xf0\x8cx?\xeas\x8a\xf1\xea\x81;.\xbb?>\xa4.\xf8\xdb\xc3" +"#\x98?\xe3yb\xc8\xd1\xbc\xbf\xf4\xde\x8d\xdc\x95j\x8eK\xc2xW\xa5Q`x\x87\xeeW\x9f" +"h\xe4(\xf8\xf\x1f\xb7\x10\xb1\xd8\x8\\\x0\xd5\xfepWn\xa4#\x92\xae\xacx\x95\xfbY+" +"p\xd9n\xcdG\x17\xee[1'\x9c\xd2}\xdaR\xe4{\x94\x31\x43!\xc0J\xe8n\xf9\xaa\x17\xce" +"#\xb4\xac\xb0\x61\x9b\x98\xf6^\xe7J\x81k\xd9\x63Ku\x99\x36/\xdc\x9b\x7\xe\xe2\x62" +"0\x13-+B{\x85\x83\xb9nz{b\xad\xe6\xa5R\x84\xadv\x8e{nJ\xad\xf7y\x95\x96m\xf9\xc\x86" +"j\\'\x17* \x2\xc4\x8d\xa7\xb3\x81\x41\xdf?Yj\xbf\xebQ\xfe\x99\xba\xd3\xab=\x6\x9c" +"#\xad\xa0\xa8\xcb\xa1,\xb7\x11'@h\x9e\xb6\x1\x66\xb1q\x82\xa8y\x9f\xbb\xd8$\x2\x1b" +"\xbf\xcc\x14\x6P\xfe\x7\x64\xb9\xdb'Gd\xc5\xc1\x5\xf0\x18\xc0\xa9\xba\x8b<\xe5S\x91" +"\x1d\xe2ir9\xcf\xb5\xd9pG\x97\n\x8f~\x3'\xb7\x16y\xdaz!]\x91\x82|\xb1\x61\x88\x93" +"\xb7\x8a\xec\x87\x43\xdf\xfc\xc5\xb4\x0\x4\n[\x8b\x13\x8e{\xd4\n\xf3w\x9f\x9e\xc4" +"\xc5\xb2\x64\x10\\\x66\x98\xbf\x8o<=\xf8M\xbaqc\x98\x94\x97?\x86\xdd\xee\x99\xbf" +"\x8e\x33O\xb0\xdc\x8f#\x5\xad(R\xf1\xcft+\xbf*\x98i\xf4[mKv\xd2\xe5\x1a\x15\x1c\x14" +"\x9e\x1do\xa7\x1f\x8aO\x4\xf0\xeb\xd0ov_\xe\xf6\x80\xa1\xab\xf1t\x81VDQ\x0\n\xe\x4" +"\xa8]\x1b\xb2\xfc\x31XkEL\xcf\xde\x1c\x35\x9f\xfe\xd6\xae\xc6\x31\xe1\xf0k\x8eq\xfc" +"\x1a\xec\xd7\xd0x\xb3\x94\xa2\\:\xa5\x88\x84\x97\xf4\n\xa5\x7f\x64\x36juMo\xa9\x39" +"~1{D\xd9\xaa\x41\x94^\x6\x99K\xa2\xdd\x43}\xe4^D\x8d%\x9d\x12\xb3\x37\xda\xda\x82" +"\xa9*\xfb\xd4\xbe\xf#\xfc\xe5\xd0/\xc4\x89\xeb\xe0\xc1S\xc1\x7\xb0\xbcu\x6\x83\x9c" +"&\xd7\x8f\x19\xc7\x17\xfb-\xa7JS\xd2\x37^/7i/\xc6w \xbd 2&\xe9+z\xe4l\xfa\x91\xdf" +"*\x9al\x6H\xd5!\xeG\xbdS\xb3\xd9m\x9\xe\xa8\xf8\xa1\x9a\xa5P\xa1\xfa\x9f\x8d\xd1" +"o\x80\xedP\x8\x15\x96\xc\xa8,f\xf4\x9e\xa0\x17S\x88\xe8\x65\x80\x1aZ\\\xeb\n%\xb" +"\x1f^x4\x13\x8a\x16\xe9\xf8^5\xcd\xee\n\x8aS\xb\xfb\xce\xc9\xdd\x15\xe1\x95\xa3\xa9" +"l\xa3\xad\x5Z\xe2\xe6 >\x1vfA\x95\x1e\xe5WO]\xa6\x9f\xaa\xd5%|\xde\xed\xd1\x88\x9f" +"\xc5\x19\x6\xbb\xf6L\xa6\xbf@\xf0\xea\x37#\xa0\xea\xdb\xfa\xadx\xcf\xef\xf5\xdd\xab" +"\x90\xd2\xeb\xfe\xa4u\x87\xdc}@0\xe3 E9v**\x1a\x8f#.\xbd]\x99\x4\x83\xc9\x1b'9\x0" +"nx\xe1\xe4\x86/\xf8|%\xadg\xd9)\xce\x8b\xe7\xed\x64\x85\x9\xa4\xa1\x42~\xf7\xea\xd0" +"\x8d\xb8\x3\xd0\xc3\xd6\x87\x9\xa7\x9SH\x7fTd\x9f\xa4~q\x19/\x15\x90\xbc\x89\xf3" +"IM\xb6\"\x9a\x87S\xce\xac\xc4\x61\x6\xb3\x15\x65\xb4\x99\xbf\xdbnh\x84\xd0\x83\x0" +"M\xf3\x37;\x8e?\xf2\xef\xf7\xdb\x37\x31\xd5\x8e\xda\xb6 \x9a\xdb]>2K\xd8 L\x16\x82" +">\xc0l=B\x82\xea\xd2t\xc\xc6\xd8\x8\x5\x18\x94=\xfe#\x91\x1c\xb3\x12\x39\xe9l\x9e" +"\xd3\xd4\x9c\xaa,\xeb$F\x11~~a\xb3M\xe4\xfeu\xb8\xba'j\xb2\xd4\x1b\x81*\x11\xddP" +"r\x9c\x10\xfc\x19\x9b\xe2|\xd7\x1c\xdf\x37\xa9\xb5tf\xcd\x11\xb5\xa3\xcb\xbd\x98" +"\xad\xbe\x9c\x61\x0\x14\x15\xf?\x82\xbf\xee#~\xe9\x9d\xa6\x92\x5J@\x89\x90\xc\x8b" +"\xb9\x61\xf5\x7ph\x87\x6.\x84\xf8\xd0\x43\xa9>\x7f(\xda\x45:P\x14\x98\x92-\xf5s\x19" +"\xbbR\x10=\xb8\x62J8\xd6\xf9\xad\xe9\x9e=\x89\xae\"_\x95O\x83\x6\xeb_\xe5\xc7>\xdb" +"\x9UZ\x13\xe6\xdb\xfe \x1b\x1c\x9fOZ\xad\xc6\x1a\xed\x85\xf5\xed\xe0gY\x8e\x1b\x8d" +"\xc4\x88nH\x90\xff\x43\xca\xbc\xce\x4\xe2\xfe\xfb\x42\xf\xc4\x45\x18\x45\x9b\x12" +"\xda\x39O\xf3_B\rS\x13Z\x85k\xa0U\"32\x8e\xd1~\xadz\xde\x36=\xa2\x14\x86\xdc=|\xb" +"\x9b\xb4\x8d\xbd\xf1]\x8\xa7\x1d\x42\x8b\xc2O\x8f@t\xb9l\x17\x34\xf0\xba\xf1\xa9" +"-\xf3\x91\x31iZ\x11\xcck\xf6\xfa\xdc\xac\x39sP\x95\xa3\x1b\xbf<\xed\x4\x96\xf4\xe0" +"\xda@\xa1\xf3tx\xd9\xf8\x46\x13\xfIi5\xd1\xe3\xd2\x8d\xfb\x83\x1au\x94\x8ch;\xcf" +"\xe4t\x12\x1b\xa5\x33\xb5Zd\xee\xb6\n\x46\x7f}\xdb<\xf5V\xfa\xd6\x8c\x63Ig\x11\x33" +"E\"\x16\x95\x66Z\xe0!\xf5Q\xcb\xbf\xeb\x1d=\xc9\x12\x99\x9c\xf8\x61\xf0\x30\x98\x11" +",Ad\x88\xde\xff\x64QaR\x11\x91\xe0\x8f\xe5\x64\xe5.\x88-P\xa9\n\xa1\xe8S\x2\xac\x8e" +"\xe5V\x1fjy2-\xf0\x61\x9\x1\x93\xf9\x1d\x9d\x89\x8c*]\x8c\xd5\xa7\x33\x66\x9e\x1d" +"\x9f\x45\x9e\xa1\x1\xes\xe1Js\xc3\xf1\xfb\xfc\xf\xd8\xc6\xaa\x82\x36h\xf7\x31\x85" +"\xedGar\xf8\xad \xf0\xbc\x2\xa0\xa3\xf6P}\x17\xf\xd5\xb8\xac\xda,:\xbf+>\x92U\x92" +"&\xfa\x6{\xba\xe8\x38:\xe0\x8a}\x84\x8e^\xb4\xaa\xf_CG\x1f.\x85*\xaa\xac\x41\xa8" +"B$e\xc7\xdf\xf2\x93\x98\xca\xb9\xc9\xb1\xb9\xb1\x41\x1\xa8\xfb\x99\xc0\xf\x61\xe1" +"yT\"\xb\x99\xe8\x9e\xf5W\x17\xbf\xbe\x8d\n\xe4\xdeg\xb2\xd5,\xf5M~\xfc`\x12\xc7\xc8" +"\x9c\xbp\xf7\x65M\xb9\x92#T\x1\x82p\xfd\x8bx[:z\x1d\xcc\x45\xbd\xct\xce\x10\x2r-" +"\xaf:\xe4\xd6\xaf\xad\xfd\x1b\xc2\xd1\x30\x8e\x8e.\x8f\xf8\xba\xf3K\xcd}4\xad\xb8" +",\xfc?{\xfc\x44\xfb\x1e\x11\xe9\xa3\x8b\x8a\xf7gc\x9f]\x15\x9eG{ \x8d\xef\xee\x12" +"\xb1\x33\x8JC\xf8\xafH?\x9b\x13\x13\xbc\x42\x92^\xd4\x36\x44\x8\xff\xed}\xab\xc7" +"J\xa4T\x8\xf9\xd2xsJXVc\x98\x9\x8f\x8e\xe6\xf2\xce\x80\x38\x9#\x93\x94\xec\x18\x37" +"\xa0\xc5>X{\xc8\x7\x19p\xfc\x33\xfe|VYa\xc2\xa0\x10q\xdc\xfb\x43V\xab_/8\xd7\xfW" +"\x3\xe7\x64J0\xb0\xe6\x1f\xd1U\x99\x31\xaf\xb2\xd8j\xf6\x19\x64\x7\x8\xc0\xb9\xdf" +"\x10\x86\x84Q\x93\xeb\xe4\xae\xe\x43-\xb8\xc7\x97\x61U\xc3\xa0\xdb\xea\x41vI\xf9" +"\xf9\xd8\xf9\xa0>\x93ri\x1a\xaeY\xb2yIj\x13\xf0\x1f\xc2\xcdI\xdb\xca\xd8\xbe\x8f" +"\xde\x97\xb6_\xd6\x9\xda\x87\xec$\xda\x8f\x9f\x92\xbb\x32\x4\x61\xf6hM\x7\x99w/{" +"\xe0\x99%\x3\xa8u\xceJ\x11g\x9a%\x1f\xe0.\xa6\xc5\xff?\n\xde\x1e\xb4^\xd2_\xf4\x99" +"\x95\x15\xe1=\xfc\x4\x9cN$\xa0\xe7\x61\xaeM\xad\x97\xebY\xea^\xee\xbej\x81\x13Lk" +"s`\x84\x13\xb8\x36\x93\xe5\x65#\xei\x1\x17~4\xe3\xf1\x8f\x1b\xfb\x8c\xec\xf\x15\xb8" +"\x1f.\xd5\x1bzF\xd6\x91TxUoFhp\x11(\xedkpr1%DF\x9b\x36>g\x1\xa4\xcc\xfd#T\xaf>\xdc" +"7\x95\x46\xd7'\x1e-](\xb7\xc7|\x86\xf2\xbd\x95n\xb0\xa3]\xf6\xb8>H\xb7\xd8\xcf\x1d" +"\xb\x9b\xf1\x5\xe\xb\xd6y\xfd\xbd\xad\xc0\xe1\xce[\x15mj\x9d\r\x92\xfe,\xed^\xd2" +"\xa6*\x9d\xa9\x41O\xe2\xe6\x7Z\x16\x39\x15\x90\xc1\xa2Uj\xa0T\xe\xfbk\xeb\xda\xa5" +"\x1f\x3\xd5\xb6U\xef\xe6\xb\xfc\xe0^dY\x88G\x6\x86\xb3\x9f\xa5\x39\xf\xd9\x6-tn\xc9" +"\xc0Y/\x99\\\x63\xe1p\xfd\x12?s\xb4\xe7\x34\x1e\x10\xf7\x37si\x1d\xfa\xba#\xd7\x97" +"j\xc2W\xbaVo\xcf\x39\xf6u\xa1\xf8\xbb\xf6Z\x17S\xa2\xe2:\xdem\xb\x92\x5s_\x81J\xe5" +"]\xab\xfd\xb3\x8b\xd5\x45\xfe/\xfc\xd5\x1c\xca\x1b?\x18\xeb\xc1rXN\xe1i\xcf\x98}" +"N\xa0\x37\xf4\xa4\x45?p\xad\x32\xf4\x97\xc3}\xc0 \x88\xbc\xc1\xf9\xde\x0\xf3\x37" +"\xd7M\xdb\xe7\x9d\x61\x1e{r\x82\xb8\x39\x31t\x99\xcfQ\xbdQ\xb0\x99\x4\\\x8f\xd2\x8f" +"\xed\xd9\x9d\x81\x10%}\xd0\xb8M\xea\xda\xf9Z-\x1f\xc7\xf7m\xf5\x95?\xd4T\xef\xae" +"^\xb8\x88\xea\xfc{M\xad\xa7p\x88\x37\x91\xb4#d8!\x16\xa5\x93\xa4\x45\xbft\xa7\x31" +"\xc2\xb\xa3\xf8\x1c[1F\xa3\x10\x95\xcf\x61\x14`\xc5T\xb8\xbZ|\x81l\x1b\xd3hB\x9f" +"\xdc\xdc\x16\xa2.\xf6\x11\xadW\xdc\x42\xb6y\x4\xf2\x33,\x83Z\xc0\xadZYa\xdf/\xa6" +"\xf0^w|\xf2\x10\x38N\xfc\x65\xb8\x66\xc7|\xcc\xad_\xa2\xcd\x9e\x35\x98\x7f\x9e\xba" +"\xbbt\x10>\x13\x93?\x4\xf9\xa2\xdd\x4\x42\x93\x88\r\xb2\x16\xe9\xcaZ7M\xa7i\xc4\x9e" +"\xd9\x11\xd3\xf6I\xa7/\xf9{\x1a\xe9y'\x9b\xc1\xe6\r\x4g$\x82\x8f\xa3R!}\x8f}\xe2" +"\xe0\xc6\xbby\x96\xcd\xdf\xfb\xb8\xaar2\x96\xe0\x0\x46?~\xe2o.\x8a\xc4\xea\x9a\xd4" +"YI\xaf\x98\xfa\xc0\xe1\xc1\xf0\xaf\x10\x64~h\xad\xb4\xcb\x7f\x37-\xd0\xcc\xe\"\xde" +"\x16\x9di}\x5Y\xea\x0\xe\xc8mr\xf8\x85\xb6M\xa2\x37w\xdfv-\xcfoE\x94\xf0\x99\xb8" +"\xfa\x36g\xb\x10\xf6\xbe\xd0\x3OX\x10\xb7r\xfe\x37Ri\xbd_\x1f\x7\x90\x81\xb3Y&\x4" +"\xea\xad\xd9\xc2\xe5\xa8\xc4vAl\x7\xa9\xf3\xa4$\xd5\xe1\x41\xc7\xc\xf3\x43\x18@\xde" +"\x12\xfb\xf0|\xf9\x31i\xd4;\xdev\x11\x44\xe0\n\x1c\xa8\xe8\xab\x1fJ+\xac" +"q\x7f[\x97\xae\xb\xc5{\xb2\x46\x4\xe\x17\x30\x42\xcb\x34\xb1\x2U\x9N@\x84\x62\x92" +"\xa8\x44\x41\x11Z\xfXP\x96+Vp$\xb4+\xc9r\xb8\x1a\xe5'\xe8\x33i4\x83y.M'\xc2 a\x1a" +"`O~\x99\x44\xd3\x1b\x84RX\xff\xc\x91\x16\xbb\r\x0\x46\xd2\xb7>L\xee%\xa2IK#\xf4s" +"~\x1dL\x88\xfb\x9a#\xb8\xbbJFA=\x17L\xd8\x41\x84\x37n\xb0 &\x6\x35\xefK\xf7\xa1t" +"&63\x13qC>\xf9\xa1\x14\xf9\xc7\xa7\x15\xcfMe\xdb\"\xdc\xfb_\xed^\x9b\xd2'^\xdd^B" +"\xd3\xd2\x89v\xd7\xf5\x4\x88\x32)\x16\xe\xb3\xdf\xb\x30L+`V\xe4\xc9\xa1\x92\x10\xae" +"\xa6\x31\xd3\x3\xf1\xf5\x1\\\xe4\xb3\xfe\xafZm\x89\x88\xd1\xda\xc9\x9\xcf\n\x16o" +"\xa0/o\xc/\xcd \xf8\xb5;\x1c$\x1f\x4\xb9\xb0<\xf4\xb3\xb1\xc6X[\xefr!2\xf6,\xbe\x18" +"; \xe5\xdd\x14\xbfu\xe7\x1b[np\"\xc6m\xe7\xd7\x19`\xc9\x30!/re\x7\x89\xd0\x1d\x1f" +"\xf0\x42\xdc\xb7\x83\x42\x44\x44n\x1aQ\xb3\x15t\xb2\xfa\x8aq\xc5\xd3~\xb3\xc6\xce" +"7I\x92\xee\x37<~\xd9\x42\x6\x19\x62V\x88\xcaolX\n\x81\x10\x1\x1f\xb8\x61\x6\xec|" +"t\x8a@A\x8c\xa7\xa7\x80\xb7\x9cI\xdf\xad\x86\x91\x43Z$\xcf\xf5/\xe2~'Ai\x1c\xdc\xac" +"` +\x1c\x9e|\x12\xb3\xd1\xc0\xf6\xfd\xf6\xfd\x99[U\x83\x1b\x32\xeb\x18\xc6\xfcm>" +"\xf9\xaa=)\x18\xe5\x84\xd5|'\x2\xcerk\xf0(\x2p\xa7\x62S\xba\xa0_\x19\xe7\xbfk\xfd" +",\xcb\xef\x43\x9e~\xce\xbc\xf8l\x12\xdd\xe\x85\x85\x12\x89h\x15\xfb\xeb\x16`\x16" +"\xc9\xb1(K\xf2n@G\x9e\xbeN\xdd\xb2R*\xd4\x44g&\xe2\r~[r\x7f\x9c\xd1R`q\x12\x83 \xab" +";\x8O\xc0\xee\x46\x87\xc5|jfl&\xfe\x41\x81\x83\x33\x3\x9d\x1e\xf4q\x13\x45#\xfc\xe4" +"\x96\xac\xc5\xd3\x4k\xbaI\xf6\x65\x46\xb'\x92\xee\"{\xc6w\xb4\x2\xcfT\xcd\xbc\xc1" +"\x95\x9a\x9\xb5\x44\xbc\x1d\xd0\xd3Ye\x94\xf4\x81&J:\x81\xbb\xea\xf4\x87\xb2\xa1" +"\x5U\x8e;\xd9\xff\x64\xbe\xcb\x66\xd9\xd4\xe7%\x34\xbc\x62\xac?\x8d\xc5\xa5\x93\xb4" +"\xes-9\x86\xbe\xee\x9b\xaf\x32\x1a*\xf2%n\xa0\x95\xf5\xa9\x1e\x96\xfd\xa2M\x87\x65" +"\xf6\xaeN\x1f\xb2\xd0J\x1\x1a\xe3?\xa2\x10\r\xf8\xd2\x84\x8e\x2\x9a\xb1\x98\x98\x6" +"\x1\xab%\xa0|Ga\xcam\x1e\x14\xf]2\xb8\x86\x8\x87\x9f\xd9\xf5@'\xc1X)cr\xd8\xb9\xf6" +" \xfa\xe7W\x1f\x95\x42\xfc\x6\xcb\xc1).\xc3\x87\xba?K7\x13K\xfe\x41\x31O\xa5/\x5" +"\xf3\xc\xd6g\xa8\xbf\xfbyDE3#\xac" +"\xbe\xaezS\r^\x8\x9a\x1f\xf5\x1c\x1c\x30\x1d\xf5$\x6,\x1f\x8a\x9b\xee\xcdIh\x92\x94" +"d\xab\x12\xb0\x1f\xdd\xa3G6\xd7\x38=#Tj$\xc6\xfc\x9av\x8c\xec\xf5\x1c\xe3\xa6\x8d" +"\x16\x63\x1\x8aP\xe1+\x9e\x88U\xe3\x65?)\xa7~'\\\x7\xaf\x98VY\x12\x30\xb5l\x9e\xcc" +"g\xef+\xc\xa3N\x85\x83\xaa\x61\xb3\xc3\x9fKz\xd4\xa7\x81O\xaa\"\xd4\xa5\x12\xf6M\xdf\xd1\x9f" +"\x1c|T\\]nY\xd4}\xe5I\x9d\xf5z\xe4\xa3\xc2\xd0\x88u\x95\xa0\x5l.\xab\x80R\xf7\r\x34" +"C\x9\x17\x1c\xbfKZh\xf5\xdfq\xfc`\x9f\xe2\x44\x9e&X\xb7\x41\x43\x99&\xf0+\x1dQ\xad" +"\xfeu\xe1\xc6\xb0\xeaVP|=\x9d\xc9\xdd\x97\xd2\x8d\xc5\x93\x11I\x9d\xb2\xa6#\x1f\xf7" +"\x7fW\xa1/Xa\xf3W\xe3\x2\x8\xe2l\xa7\xde\xbe\x36\xa8J\x81\x83\xb6\xad\xf7\xdc\x31" +"\x92\xc6P\xfc\xd7\xd1\xf8\x12t\xb3\xa2\xe \xe7.\xba\x31\x87\xac\xb1P\xa0\xb4\x33" +"\xf1\xc7i\x89\xde\x8eT5`\x9a#U\x1\xeb|\xc5u\xabv;f\xc3p\xb6\xef#\x93-\xb9\xda\x87" +"\xcb\xaa\xcf\x85\xd1\xc8\x41&l\x1f+\xbf\x84\xd5\x7\x11\xb3o\xb0\xa2\x88\xc4\xf0O" +"\x11\x34\xfe\xd4\x1b\x8.\xcd{\xc5\x98\xe7\x81\x35Ub\x3\xc1\xdc\x97\xd6\x1e\x38\xef" +"j\xdc\x61\x32\xe6\xb9\x11/\xce\x17\xacO \xaf\x66\xa4V\xa2\xd1\x38\x2\xfY61\xe2M" +"\xf4\x80\x80\xde\xb0\x1bH\x84O\xb0\xe2\x18\xe9\x14\x37\x42\xbf\xf5\x1f\\\xe8\xd4" +"\x82L\x8d\x46\xc0?\xe1,I4\x3\\\xca\xc9\xa2\xca\xa2\x83\x44?n\x97\xday\x96\x38\x5" +"c\xbfz\xc9\xbb\xc3\xa5\x82\xd7\xa2\x62Y\xbc\xff\x3\x97j*\xdc\xf7\x83\x8\xa9\xbf\xc9" +"\x8\xa2\xba\xc4\xb3\xf6v]\x91\xc5\x64\xb0\xa0\xf8W\xab\xfa\xca\xe3$p[\xe0u\x1b\x1d" +"~\xf\x92\x1b\xd8-\xdf\xa7\x9d\x31\xf0\xb4Ph/\xf7&\xd8\"\xe0\xd1\x9f\x0\r\xf9\x1e" +"\xae\xd9W\xe9h\xeal\xc4\xfd_\xc0%\xad\x33\x1fK\xf9m\"P^\xc7\xc1\xde\xb8|\x10\x95" +"\xdc#\x99\xff\x83\x9d\x1d]c$\x3\x35\x45\xb0vg\xdf\x36\x36\xc4\xf5\xc2!\xa3\x66\x30" +"G\xcf\x4\x93\xb3\xab\xab\xb9\x11\x18\x96[\x87\xf7\x17>\x8b\xc4\x90\x82\x1c\xc3\xe5" +"E\xd8\x1\xd1\x46\xe\x11\x89\xd7\xba\xcf\x8cj^\x3\x8d\xc1\xf1\x3\xf6\xfd\xf3\xd9\r" +"#+V\n\xd1&\xc0\xd2\xf0Wd\xe6\r\xa1(/G\xab\xc9\x89\xd5+\x96\xcf\xd9\xf5*\xbe\n\x37" +"Z\xc4s\xc0\x45+r\xfb\xda\x64\xey\xa9\xf7\xb0?>\xe5()_=A\xbf\xd9\x36\xcf\x9\xc4\x31" +"\x12\x96\x11\xd2\x98\xec\xe4\xac\x98K7\x19 \xc1\",@\x18\x33\x46\xa8\xbc\x18\xfd\x46" +"\xce\xca\xf9\xb2\x82\xd3H\\\xa7X\"\xb8i6\xd3\xdd\xba\x3\x1e\x45\xbe\xda\x8a\x92\x36" +"\x18\xabi;\x8b\xb0\x32\xc3\x91\xa0\x18\x5\xc7v\xde\xdc\xc0\xc1Iv\n\x80\x1a/\xcf\x94" +".{\xb9\x8e\xbd)\x81UN\x9d\xd3\xbf\xc7\x61IQ\xc7\xbc\xf6\x44\xe1\x66]\x8c\x44\x32" +"\xaf\xfc\xbf\xb7\xa2(\xa5\x84\x8e\x3\x85\x88~\n\x0y\\7\x11\xf3\xcb !\xaf\xf1\xa8" +"\xab\xf2\xc8\xe1\xc8\x83\x1d\xf6\x31\xf\x83\xeb\x8b\xe0\xb6\xed\x9ap\xac\x8a\x88" +"\x10y\x1d\x86\x13\xa8K\x11\xdf\x1bX\xc6\x41\xd6\x5\x1eG\xeb\xe7\xe0\x97\"<\x19\xb2" +"5\x11\xf9\xc6\x37\xe6\x80\xf5=\xbf\x91@~C\x8f(\xbdM'\xfWY\x15\xb0v~28\xbe\xf4T!3" +"\xe1\x65\x62\x18 q\xdb\xab\xe9.\xf7q\xbb\xf8\xe1\x8d\xdfU\xc4-$M\x9d\xbc\xaa\xe0" +"\xd9\x11\x8f\x1e\xa0\xd6O;\xf0,b\xdb\x46\xfd\xad\x36i [g\xfd\x9f\x85\x98\xadOu\x11" +"\xe6\x9f\x97\xe7\xd9w]\xddX}\xdc\x8c\xf2W#\xd6h\x1\xbd\xd8>$\xcf\x85\\\x8e\x8a\xab" +"L\xaa,\xed\xb3J\x7f\xe6'\xfb\x43\xe4\x38\x7,\x9b\xeZ\xdb\x90ZRn\xfe\xef\xd4N\xaf" +"(p\x8e\xf6\x90)\xeaj\x15l\xb2\x10=\xb4\x94\x8dS\xce\x37 -\x96\x86\xfdq6S\xd8\x39" +"^\x92\xa1\xdc;X\xa4\xd8\xf0\x1c\xb9\x7f\xa4\xac\xce\x1d\xb8\x88\xd4RrQA\xffz\xe6" +"}\x7\xbf\xd4^\x99\x31k\x2X\xc2\xc\xe9\xc9\xd4\xa0\x17\x9b\xdd\xe6RM\x9d\x91\x80\x18" +"\xd6\xb7\x10\xe5\x6\x41\x38\x35\xf7\x32\xaeP87\x18\xc2\xe0!\xf9x\xbd\x64\x92\xf7\xba" +"a \xf8jBR\x14\xcc\x14\x64\x61Rf\xf8\x82`\x98\xe9P\xe0\x9\xd9\x18,\x2\x8a\xeb\x42" +"mR\"E\xab\x9\xe8<\xd1\x66\xf2\x44^\x2\xb\xa8\xb1\x0\x94\x7f\xd9\xc0\xaa\x9\xe\x95" +"P\xc7\x1\xc8\xac\xf7\x44\x11\x91k\x90\x917E\x80`Q\x81\xae.\xd9\x3\xe7\xb5Gi\xb3" +"\xc3\xde\xad\xdc\xa8l\x11?#\x9b?\xdd\xb4mcC\xfb\xea\xf4\x41\x35\xf7\xef^\xa2\x17" +"\x90-;\xe6\xe4;\xaa+\x8f\xfd\x8e\xa0\x65r\x9b\xa4\x62\xfd\x19\x65\xf8\xe5\xbcY\x9d" +"aF\x10\xc3\x43\xccJ=1\\\xa0\x2\x4\x1e\xf8\x9\xa3x\x9c\x35\xf7\xe\xd6\xbe\xf7\x1e" +"\xea\xed\xc8\xfa\x92\xed\xe9\x6\xc3\xdf\x1fO\x9e\x93g9\xd8\xf3\xbe\xcd\x44\x1a^\x7f" +"I\xb\xbdz\x6;d\xc1\xea\x82\xbd\x44\x45\xa7\xd2)\xc2\xdb\x61\xbdoP\xd6\xc3\xe3\xf0" +"(\\\x15\xd5\xa4\x80\xa1\xc9\xb2\x31v.s\xfe\xe5t\xa8\xb3\xc5\xbb\xec\x36\xb2\xbd\x38" +"\xc8:)\\E\x1a\xb1#\xbeW\x86\x32\x80\x82\x4\xe2\xc9\x8c\x9d\x87\xdclo\x91)c\xc9\xb2" +"XL\xe1I\xd2\x87'\x1a\x91\xf4\xb\xe4\xbb\x3(\x1b\x19X.\x92{\xc\xb8\x1a\x4w\xec\xa4" +"\x83\x8a\xa3\x10^\xee\x92W\xac\x7\x63\xce\x1c\xeb\x30\xfd\xae\x1cIk]\xe|\x9d\x6\xb3" +"\x7\x16\x13V\xc2\x43\xf8\xb2J\xc0\x16\xb8\xe6\x5+t\xa4\x18\x66\x86\x64\x65\xad\x9d" +"\xfd-\xd6\x31\xb0\xbw\xc0}\xcc\x63\xb8\xa8\xcfv\x94uP.\xa2\xab\xc4\xb\x64\xa4\x30" +"\xc0\xaau\xc1\x8bQ\x19\x85,\x8e\xa2t)\xf\xce\xe7\xeZH\xb7N7; \xf8\x91\x36\x38\xa8" +"mH\xea\xe5\x62\xcfYq\xe1\xaa\x1dsy_\xad\xea\x9\x84q\xfa\x36\x62\x63\x32\x8\x9d\x85" +"\xf3\xf3\x8aW\xfd\xe8\x6\x0\x41<\xb4\xb2\xc0\x39\x81\x36^~\xff>\x95Q\xec>`\x95]\x1f" +"\xd5\x61\x18\x33\xd4}\\\xc\xf5\xcaSl\xb3)'\xa3o\xf5\xbb\x92\xa9k\x14j\xdf\xbe\xa8" +"\xf5j+\xcaH\xa4\xc0\x8b\"\x99\x9e\xd5\xb3s\xe1g\x98r\x84\xff\xf7\x95\x65\x61*Q\xf5" +"P\xb6V\x9d\x6\xd3\x9a\x61\xb6y\xed'\x80t\xe\x94}]\x19\xc1\xef'V\xb0\x44\x65\x9b\xaf" +"My\x1e\xc7\xf9>\x85\x8dt\x9f\x9a-\x92\x1\x46\x36\x80\xc1\xce\x8e\x61y\x0#\x8bN\xdc" +"f\x9b\xe3\x98\x84\x95~Z\xe3\x34\x39\xc6\x84\x18\r\xea\xcb\xf5\"\xe4\x85J'Lt{k\xb6" +">\xc2\xa1\x7f\xc7z$\xd5\xfc\x81\xe9\xb9G)m\xa1[`d\xe0\x80W\xeb\xbc\x84\x18\xb5\xff" +"\xdc\x93\xcd\xe1y\xe6\x38\x16\x8f\xd9Z\xb9\xde;\xa8I\xb9\xab+\xdd.\x15\x82\xbbj'" +"\x12*\x8b\xa4\xd8\x1a\xe3\xd3\xf9mt\xb0\xfc\xd1\xf5\x41\x2\x13v\xb7\xf3&V\x1a\xb5" +"\xc3\xf5\xe3\x64\x85\xb5\x0\xdf>\xdc\x91\xf\xcf\x36Te\xc2s\x1e\x42\xbd\xcd\xbd\xbd" +"\xe2\xbc\xaek\xe6\x41\xb2\x1e\xeI\xa9~\xa1\n\x6~\x1d\xe1\xa9ia1\xea\xf5i\xbb\xab" +"\xf1\x36r\x84\x7f-\xc~\xd9X\xe1\xc8,r2\xec\x8\x9a\x82\xe9_\xf4\xe3\x36\xfb\xbd-S" +"\x3\xa6\xd3\x35[\xbd\x85\xd6ma`\xc3\xb2\x44\x82\xbe\xf8\xfb\xeb\xf2{a\x7f\x98\x87" +"-\x15\x88\x9/6\x91\xd9\xf9\xa8\"?{\xaa\xbf\xc9Y\x2\xb\xb2_\xeb\xce\x1c\x41\xa7\x87" +"\x8d\x8a\x38\r?\xcc\xe5\x90\xd3)\xacV+\x88\x99\x87\xc2\x8a\xf2\x18\xd0\x96\xfc.\xe4" +"\x1\x1f\xee\xeb\xa6\x30\x35\x39[w1J\xfb\xc0\x92\x1d\x9d\xa7\x90\xda\xb3>z\x1d\xaf" +"}\xd4\x94j,0\xd6\x34\xf0\x9d(\x5r,\x4\xf1\x9a;9\x4T\xe9\xc4V\xf8\x34\x9c$\x94\x64" +"\xd3\xe2.\x18\xcf\xcf\x90/\xa9\n\xd8\xb4\xb7\xb2\x92\xb8\xba \xbd\x15\xa1\xb5\xe6" +"e-j\xe1^MJ\xa2L\x0\xbe\x8c\x9e\xde\xcf*P^?P\x88\x32\x97\xd8M\x11\x1c\x88\xdb\xc2" +"Rs\x93\xe4\xd7\xf5\xafR\x1ck+\xf4i\x14O-\xd1\xf6\xe0]\xb4\x4\x0\xe2]p\xa1\x65\xc4" +"\x1c\x95l\x90\xd7=\x1a\x83\xc0S\x8d\xf2\xf8Z\x9c\xa5\xa7\x86\xa8\x12\x16\x2\xcd\x9e" +"\x1cT\x4\xb\xb8{\xbb~\xcak\x99/\x83\r\x83\xda\xdb\xc2\xd9\x1c\xe0\xb6\x46$\xc6\xc7" +"u$\xca:\xe6\x13;vW\xc5\x12\x8cT\x1b\xf0\xbb\x97\xb1\x3\x1b\xda\x0\x1y\x2x\x83vN\xc5" +"\xc6\x92\xf0\x44~^\xde\x18\xf8U:}\x7f\xc8\xdd\x95\xb8\xfau\x9c\xfc\x35\x90 \x9a\xac" +"F\xdfM\xe9\x82y\xed\x8d}\xec\x9e\x43\xf0\xc0\x18\x98\xbf\xe4\x7f\xa6\xe\xf3\xb8\x8c" +"\xd9K\x16\xbd\x5\xfd\r\x9b\x42\x42\x6s\xf3q\xc6\xf5\x85\xb6!\xfc\x39\xf6\xf\xab\x42" +"\xb1\x1b\xf7MYj\xf4\x34\x8amC\xc6v\xf\xae\xd5\xf\xc8\xc9\xb3\xb3\xf5\xe8\xa4\xf2" +"\x1b\x86\xa8\xb6j\xe5|\xd4J\x0\xa2\xf1\xb7z\xbb\x42\\T-\xfc\x8b\xd4\xebH\xb3\x35" +"5\xe0>N\\\xa5\xf0%\x41\x62_K\xcf\x80\xcf\xab\xdb{\x87\x9a\x5Y\xc8\xd8\xaa\x9c\xe2" +"\xea\x0\xd5\x19\xf2UJ\xc5\xa9\x87\xe2\x81+\x8c\xa4\x2\x82\xb2\xe6\xbex-\xc5\xee\xf9" +"F\x89v\x82\xb3\xc9\xec\x9d\x80M6\xd4k\x16n\x1f&\rd\xa8\x94\xaaiW\xa5\xd7\x1c\x85" +"u\xc0\x8d\xac\xe0\x38+(\x12\xba\x94\x1c\x14\xaa \x99\x88>R\xde\x8bv\xe7\xed\xaa\x16" +"\x8aSc\x1d\x89\x8\x82\x83\x65\x14\xf5\x97\x14!\xbb\x66\x89\xc5+\x1\x8e\x46\xeb\xe6" +"\xc4|\xda\xe3@\x9d$\x2tF\xb0H\x1e\xf3H\xa1\x9\xe8;A\x10\x64\xa1Pf\x1b\xf7sd\x8d;" +"\x97\r,\xb8\x8\x46\xfc\x93\x1e\x96U\x94\xe0\x36O\x1d\x43\x17\xff\x65\xa5\\\xa2\xce" +"5q\x1b\x8c\x15\xeb\xb9\xa3\xb5\xb6\xcand\x90\x44\xcf\xd4\x96\x33\xd6h\xd7\xf6\x8e" +"\xc1VSp8HS\xc2\x99+\xea\x36hX\xbb\xa9\xef\x7\x9c\xf6\xe4\x66\x45//\x82z8\xea\x31" +"%\x6\xe8N\xcc%\x84\xff\xf4g\xae\x15\x87K|BNL\xfb\x8a\xdb\xd1\xe3\xf9\xaeJ\x10\x1d" +"\x1c\xe2#U\x89\x19-\xb9>\xbc\xe5\xd8\xe8\xeb\x10\x8cRu\xc\xcf\x92\x94\xf8\xea\x90" +"\x91\xa1n\x9a\x7P\xaf\x38\x36\n\xcb\xdaK\x8f\xd3\xe\xbf\xd8\x19\xe_>\xe8\xcbk\x15" +"\xb2\xf5\x30\xd7\x83\x6\xbb\n\x10/ 7\xfb\x45\n\xba\xa9\xf;\xf0\x2.fUy\xca\x99\xd0" +"\x1a\x14\x1a\x84!<0\xfc\xe2\xd9\xb0\xf8\xfe\xc5UmwrX\xa7\xbc!C\x9e\n\xdc)oY\xfch" +"\x9c\xbasij\xd0\xecu\x1f\xda'\xf3zA\xbe\x3h\x90\x8f\n@\xcf\x39\xdb\x91\xdd\xc2\xf1" +"\x8dg\xbf\xed.Eb\xec\xe1&\xf\x66\x99\xd9\x45\xa6\xe2RCX\x95\x8e\xf8\xe3\x81\xa4\x45" +"\x85x\xdb\x1dW5\x98\x0\xc2\x18LyO\r\xdd\xa4\x8d\x9a\xf4K\xf4\xc0\xe1\xc0\xd2l\x11" +"@\x12\x96\x9bV\xe1mD\xb\x32\x61\x43\x95;\x7f\xe5v\x82\x16\xd5\xa4\xddYvD\xceVth7" +"\\\xf1Terw\xb\xba\xcc\xe%\xb7\x42r\x88\n\x91\xac\xc7\xc9\xb4\xb9\x85\xc1t>\xa5\xd8" +"\xf6\x8f\xe3\x0\x36>(\xc8\xab\x16\xdc\xc7/W\xf8\xc1\x64m\xa3H\xc\x85{~/\xe2j\x2>" +"\xcb\x5\x1\xdf\xbc]\x80\xe8/\xb7\xb0N_\xfb\xcc\xad\xa7\x9fn\x81;\xf2\xe9\xb0\xa8" +"a9\xac\x1aw\xa5\xa2-7F\xbd\xdc\x39\xf1\xae\x4RMy\xc6\xf9\x90\x63\xd8\x43\x2\xc5\xb8" +"E\x10\x8a\xc7^\xd6$)rI\xed\xd9^ \xdf\xe\xf1\x83\xc5\xf1\xc4\xa8?\xba\x2,\xca\x31" +"\x81\xf2\x8a\xae\xda\xa8Wx_t\x6\xa4\x65\x9d\xe5\xaf-]\x18RtQY\x7}\x3R\x18\xe3\xef" +"Y\x1\xdc^\xef\x33\xa1\x62\xbd\xbdM\x90\xf1\xbc%\x9e\xf6\xf\xbe\x11q\xdd\x9c\xa9\x91" +"\x82\xe5\x9\xccq\x9b\xf6R\x98\xa8\xeb\x41\x81\xf1\x64\x61HQ\x1e\x9\xf8\xe2\x1e\xf9" +"\x7\x89\xb\xc4\xbf\xaf\x9a}ea\x81\xea\xfc\xdb\xe9\x0\x15\x9\xc1\xffiy\xee\x90\x10" +"p\xa0$\xd6\x98\xd5\x19i\x12\xee\xc2v\xe3\xa5\x11sP\xe8\x8\x6r-\x98}\x19\xf7\xc5\xc7" +"\xf1\xcc\x13\xed\xc5w\xed\x3\xd6\x30(\xc2\x9\x1c\x86\xdb\xca\x8bS\xf3\xe0\xb6q\x9" +"\x84\x93=g\xa6\xe0\xd7p\xa1\xb8\xdaIM\xcc\xbf\xdf\xc1\xc9\x8e\xe6\x86\xb4\xac><\xbf" +"\xf1jV\x9c\xc2\x35M{r\\Q\x1fkO\xf5\xeep\\\xb8\xe8\xe5\x8d_\xbf\x8c\xb9J\xc\x80\x7f" +"K\xa9\x8e\x37\x11\xf3\x8ek\x8e\x3\x15\xf5#k\xe4\xf4\x45\xb2/<\xef\x9bV\x96\xf1\x9" +"\xcbw\xew\xed\xfa\x30\xce\xb4\x16\xfb\x30)\xad\xcf\xe5\xc2\xc5\xcb-K\xdaN\xfcu\xcb" +"i\xb8\x97I<5 \x87\x1c\x10\xa7\x34\xa3X\xeeqS3\x96\xac\xde\xe7h/\xac\xb6\x1b\x1b\x43" +"\x9\xbe\x34\x84\x8f\xea\x0\x15\xcc\xdb\xc3\x7\xca\xe\xb2,\x91\xab\xce*w\x88\xf4O" +"\xe2\x17\x5`SP\x7\xcd\x95\x9\xa0\xb\xd8\xc\n\x81\xce\xd0\xc6\xe2\x88\xe9\xc6mx\x3" +"z\xb1\xd6\x10\x12\xcf\x98\xd9v\x80\x33\xc4\xdf\x64\xbf\x19\x16\x1\x99\xee\x85.8`" +"\\\x1f\x91\x31'~\x83=\x19\x30>\xd8\xbd\xd9\x42\xd5#$\xe5|Aq\xc1\xcb\xcfV}\xe3\xbb" +"\xe4\xcf\x14\xafVd\xbc\xb5\xa7\x16\x63\xb8\x30\xa2\xb0\xa2#LG\x86\x44\xd8\xc4\x8a" +"\x8fZ\xbd\x86\xcb\xf\x8c\xde\xed\x11\x80x\x8e#\x15Y\xdb\xd1\xfbq>\xe6\x33\xa7\x34" +"\xe7\xb\x85\x8d\x35\x7f\x18VDL#\xf0{\x4\x8a=\xd3\xfb\x19\x15^,\x97\x19.\x8e\x1f\n" +"\xe8\xacno*\xdc\xf1\xd8g2E\xd3\xb7\x93\x87\xf2\x65+*\x8e\x1f\xf3\x34\xc3\"\x10/\x98" +"\xdd+\"\xcf\xfb\xd7\xdex\\\xe1u\xb9!i\x7f\x9d\xe0\x61'\x19\x0\xf3(_\\\xa3[Gn\xc5" +"Wyu\xe0\x45\x9f\xca\xfcH\x8\xfd\x36\xd3\xce\x81SN\xe4\x37\xe8\xccp\x14\x6\x38\xac" +"\xfa\x46+\xb[A\xc7\xa4\"\xb\x4\xd0\x2\xad\x66\x4\xae\xfb\xa2\x9\x66\x89l\x90\xbb" +"<\xe4\xe1\xdc>\")\xa7\xe0\x30\x92&\x9\xe0\x39z\xb0\xc3\xb9\x1\x84\x90\xab\xbaKi\x1" +"\x17-\xcemJ\xfe<\x8e\xe7\xeb\x63\xc1\r\xaa\x80\xc\xfah\x1d\x31y\x81Z\xcb``8pX7#\xd3" +"\x96&\xf1\x5\xde\x63Vi\xf2<1$\x5\xb0X\xac\x10l\xc4\xd0\xbe\xe9|\xe1]\xf7\xf0\xd9" +"\x7fq\xa7\x19\xf2\xaezS\xff\xf7\xe5\xb\xba\xe6\xe3\xff\x15\xa0\xcf'\x8a\x8dOshE\xe3" +"!\x91\x61S\xa4\xc9\xb1\x80\x94\x66\xbf\"@\xe2\xa7\x1c\xc5>\x96\xe0\xaf\xe8\x35z~" +"\xe7\xe7[;\xe4\x38\x9c\x31\xf2\xbd\x5M7\x1c\x9f\x9b}q\x11\xba|\xa0\xea\x1c\x34\xe7" +"\xe5\xd1#\xbf\x65?&kb\\ra\x2\x62\xb9\r\x8a\x90\x43\xa1\x19\xeb\xa1\x65,*\xc\xef\xe8" +"\xc3\xe8\xe6\x64,\x9f \x9b\xd6\x97\x9c\xf4|\x6\x89S\xcd\x5T\xe0\x42\xa5\xf7\xbb\xa8" +"\xabJQ\xcV\x7f\x65\x35\xbd\x37?\xbbk\xd8\xdc%,6\xf1\xe\xcc+\xcc\x35\x41\"}\xf8\xf6" +"\xf4\x8eM7\x1b\xd4\x1e\xc0\xe7\x61\x6\x8c-\xa4\xb4\x91Sl\xef\x9d\x61\x9e\x17\x39" +"\xcbt_\xb5\xc7\xe7\xb5\x8c\x9f\x90\xc9$\xce\x3\x80W\xec%|\xbe\x33\x66 f\x84\xd3\xdc" +"${\xce\x1a\xb4\x31\x1a\x9a_\x9c\xdbr]\xed.\xe6\x62\x1e\n\xf8R.|\x86\x9f\xf\xec\x14" +"\xaf\xaeL^>\xcd\x95^G\xfb-X\xd5mW\xe8ms.\x8c\xa6\xcd\x8b?\xb7|\xb2\x9c\xbd(g\x16" +"*\x1fUd\x11v\x16\xf9'\xab:L\xa5#\xe2\xc0\x9c\xe3OV\x1c\xf\x16\xf1\xb4\xe^\xbb\x1a" +"?\xcb\x1f\xc8\xfd\x43Z\xd5\xb1L\x80\x38(\xf5\xa8\xba\xc8'\xc6\x10\x87\"\xee\x85\xe5" +"K\xda\xd7\xa6\xdf\x94\xe#\xfd\xf8\x8cR\xec\x84\xc8\x8cN\xcbG\x8d\xd1(\x13]\xf7\x46" +"\x99\x43\x41\xa3~\xc5\xfb\x30\xc6\x8d\xfa\xa3\xd4\xcb^\x17\x32t\xf4\xc1wd\xac=U\xe5" +"\xcd\x43\x45\x1c\x0\xe0\xa6\x80\x9d{\x7\x14P=\xc1\xaf\x1f\xff\x30\x7.\xce\x43\xea" +"\x87l\xc5\xf\xa0\xc3q~a\x9fh\xfb\x3\xe6\xb8\x84\xc6\x8a\xfe\x30\xa6\x5\x19\x13\xc3" +"\xf2X\xc9\x94\xc4\xb9m@C\xe6NL\x8\x65:\xbcO&\xee\x89\xe4\xf3\x1c<\xb6\x62\x39\x33" +"i\x9e\x9cl\xc0\x82y)\xf4\xe5\xbe\"@\xa9\x13<\xa8;Z\xba\xe1l\xa7\xb8\xeeQ\xfb\x92" +"\x84~'\xb3\x11\xc9\xf0\xcb\x9a&\xa9:F\\\x10#=\x7|#q\x8e:\x89\x43\x91\x83\xc7\x11" +"\x96\xec\xbf\xe6\x7run?\x98\xcf\xe9\xa1w\x1e\x30\x98\x84y\x2\xcb\xc6G\xe\xd7\xba" +"\x91\x7f\xdd\x1e\x1``|\xc3Y\x86\xbe\xb8\x9cQ\x15\xca]\\$\xd3\xb2^<\x83Otb\x8b\xf6" +"\xaeZ\xc1sZ#\x8\xbfw\xa3\xfb\xad\xd4\x83\xcb\x82\x82%\xd6!fY\xa8\xaa=\x9c\xcdi,\x12" +"\xaf\xf1S\xc7\n\xaa\x39J\x0\xd2\xe2\xfc}~\x10\xba\x8fT%\xab\xc7\xa1\x46\x91\x92\xfc" +"-\xffl\xf\x10\x7\x41\x10\xbf\x19\xa2_\xb6\xd5zt\x94~\x1e%\xc9\x8e\x92\x97\x93\x41" +"X\x9fjNd\xe9\xa5\xb1\xcf\xe7\x81\xcf\xfeI\xb3`\xbd\xc5\xfd\x87\x42\x5 \xcf\xee\x45" +":\x8es]3\x8b:\xc3?b\xde\x8e\x12\x91\x88i\x7-\xe1\x35\xee\xc2Qh)\xbe\xd5\xcGh\x1e" +"9\x98pw\xc7\x1a\x38\\:w\xde\xe0\xe6X\x1c\xc4+a\xda\x64N\xda\x8e\xb6\xb5\x88>2\x85" +"\xe.\x11\x2\x9a\xc\x37\xfc\x46\x34\xc6\x9c\x9\xf6\xb2\xa5\xfd\xa8\x19\xb3\x10\x16" +"\xfa\r\x9c\x80-J{|\x92\xe1\xb0^}\xab\x44\x41\x61\x10\x34\xe7+\xe\xdd\xe3\xfbO\x9c" +"\xd6\r\xe0\xb4\x64\xec\xc5|T\xeJ\xa4\xeb\xaa\xc9v`\\MT\x98\xad\xb8\x83\xe2s\xb0x" +"\x5\x33\xfaph6W\xe3*^\xb6\x1f\xc#+\x3<\x6\xcd\x1c\x9c\xb9\xea\xed\x9a\x86\x8f\x41" +"\x87\x80\xaeM\x7K$5r\xb5\xa5y\xec\x88\xe8\xb8\xb3PY\xfb|Q\x17\xa9\x46\x1c\x92\xde" +"q\xd4OX\x8\xfg(*\xb2\xf5\x11\xcc\xf6\xd5\x8eU\xa9\x1a\x13t66\x8b\x5\x30\xda<@\x1a" +"W\xe1r\x1\xdb|\xb3\x8f.\xd4V\xf7:r\x4\x8f\xd3S\xb7\xae\xc9R\x9b\x98:\xd6\xcd\xe3" +"\xaax\xf7\x90\xc7K^\xd4\x63\xb7\xc8mh\x9c,\xb4\xea\xa7\x35\x95\xe5\xef\x14\x8cq\xbd" +"Y\x18\x37\xf4\nIH\xcf\x38\xa4^\xa2\x43\x46\xd0\xcd\xdaR\xc4m\xd0\nlR-:3Pu`\xfe\xc3" +"\xe9\x31#l_;/\xa2q\xbe\xa8\x0\x89\x6\xed\xa2\x87\x1f\x91\x9e\xeb+:\x8d\x9e\xd3\x93" +"\xcf\x30~@\"\xbf\xfb\xaa\x2G\xc5\xee#<\x98|+\xb7\x90qc\xbe\x12\x43\x99\xd3\x8b\x97" +"\xc6\x1d\xad\x97\xb9\xfa\xb8K\x93 \xab\xb9\x96\x9b\xfa\x65\x9d\x8a\xd9O\x1b\xf7\xe" +".\xf\xdf\x33\xb8o\xc4\xd0to\xf9\xe1\x12x\x1dS0\x9a{?\x95l#\x1dZ\xd7+\xd4\x89}\x90" +"7\xbc\x9c\x2\xb4\x13\xd1|ko\x88\xcawhB\xc2\x3\x7f\x65\xd9?\xa0\x92k>\xc\x84\xdf\xe8" +"\xa9>\x81\xde\x63\xb9\r\xd0'\x17\x44\x36\x83 y\x1\x8c\xa7M^\xee\xbe\x9en\xe4\xe2" +"|\x17O<^O]\xd2\xce \n\x1d\x43\x80`#\x95\x11\x9\xcf\x14\xed\x13\x92@+7\x88\x97\xa5" +"og\x14x\x10\xf4\xcb\xe6\x1d\x32\x5\xd2q\xfc\x6\r\x9aU\x8a\x46\x96\x5\xe5pa\\\xe5" +"\xa6\x62\x9a\x38\xf6\x36\xcc\x63\xeaYL\xdb\xb5\x9aN8\x10Rf\x91@\xe1\x19\x5\xf6v\x95" +"\xaf+<\xe0{\x84\x15W\x2\xa7\x84t|[\x93x\xf6\xe1\x1#\x14?\x5\xd9\x94\x8f\xe5(\xf0" +"\xb8\xfdX\xb2?\x8f\xae\x12P\xd5\xee\xf4@\xcf\x45u\x99\x99\x84\x41/\xfd\xec\xf1.\xa2" +"\xb8\xe4Q<\xf2,\x80\x87\xea\x64\xa9\x8b\xca\xb9\xadg\xbb\x65>\x13q\xbbW\x86\x15\x8" +"c\xd5\xe1L\\\x8b\x11'K\x92x&\xabOY\xec&\xe3h\x92!\xba\x9f\x37I\xdc\x64\xf\xcc\x80" +"\xd9\x94\x8dI\x1f\x9bN[\xbdx\xd8\xd3\x19\x83\xb6\xa9\xdb\x0\xdf\xd2\xe6\xdd\xb0\x8a" +"D\xfb\xb1\x7f\xa7Y\xd2ME\x8\x4\x39\xb3\xafsu\xb9\xf4GG\xb9\x1d\xe3Z\x93y\xda\xc\xef" +"4\x1c\xfc=\xc5|K\xf8\xcd\xbd\xa0\xe0\xe\x90\x8f\x86\xef\x5\x19\x8b\"=\xa3\xd0=%\xd8" +"\x98\xd9\nU\xbe\xe\x6\xe4\\\x9e\xa6W@\xd7\xce\xdd\x1\xfe\xf9\xe1\x43J\xd4~\xb6\x90" +"|krV\x93\x34\x33\xdeUy\"l\xeb-\x1a{\xf\xf8\x85\xa3\x43\xa3z\xe2|\xdd\xa6T\xb4\xce" +"w\xe8\xc5\x9d\x13\xbbO\x94\x81\x46\x13\x32\xf7V5S\xcd\xcf\x15{\x89\xb3'&\xe7!\xe0" +"\xdbX\xae\x80\x34v\xdd\x7f\xb6r\x81\xc0\xd6\xea\xac>\xc9\x88\x9a\x15\x34\xad\x7f" +"a\xb0_Kf6\x8d\xf8\xd5\x1a\x66\xf5\xde\x2<\xb5'p*\x18\xab\x9b{\xc8\xf7\x3\x7f\x43\xc7\xfd\xfe\x66\xfb\xbfL\xc9\xe5Oh\xec" +"=3\xeb\x10\x37\x3\x85\x44\x15\xa8\x38\x96\xff(\x14\x89:\xe8\xbc\x13\x84\x66\x8b\xb" +"\\1\xd5\"\xd3O\xca\x88\nl\xf3\x1d\xc0\xab\x12\x35\x66u\xe2-\xe0\xec\xe2\xc9\x87\xc9" +"-[\xdd\xdb\xd3\xf7\xfa\x81s\xb\xa2)\xa4~T\x93\xae\x14\xbb\xf9\x36\xe6\x6x\xf9\xc2" +"u\x9bl%u\xdb\"\xe3\x63\xcd$\x15\x39\x97\x95 \xa9\x3\xe9\xac\x8c\xf2\xc3\xc7^\" \x98" +"S\x8e?Xh\xf6Jj\x89\xdf|\x83\x32\x82\xdc\x83\xc9%\xe6\xdb\xc1\x30\x88\xc7\xa6\x92" +"\x9d\xd9\xa9\x9c\x91V\xc5\xf5.\xf0HS\xf8x\xc5S\xd7\xe0N\xce\x87\xc1\xa5p\xa4\x36" +"eIA;\xf6\xd1h\xeb^\x19\xb3\xd1\x98\xc3\xedG8\xe6\xcd\xde\x3\xdb\xb8\xb3\x19\xacL" +"\xda\xacM{\x0\x93\x65\xcfo\xa2z\xa8\x11|\xf1\x19\xb7J\xa0M\xfb\xab{\xa1[\xe\xd1\x8b" +"&R;\xc5\x8a\xffx\xef\x90o6\"\xa0\xfaZ\x18\x32\x10V\xa3\x9a\xb1\xe7\xccg\x1f\x13\x16" +"\"\xc0\x10\x36\x1aQ\xf0*a\xd5N\x80\x9e\xa3\xf2%\x43>.\xcctk1\xfb\x2\xc9\xf5\x8\xde" +"d\x8:\xa7\x1e\x8b\xa4m\x9a\xe8\xcK0\xf3\xebIZ\xdd\x95\x83\xe6\x1f\xb5\xb8l{\x90+" +"\x8fQlhA\xd9\xc3\xb1\xdd\xb6\x1e\xb1\xef`\xa4\xd0\x42\xbbt\xfaO\xc\xd0\x14\x8f\x2" +"\x9\x87\x19\xc8\x66/\xea\xc4zM\x89\x1f\xfc&\x9d.s\x18\xb7(\x9e&\x12\xee\xaf\xfeZ" +"\x88\x80\x30\xe6yf\x1b\x3\xd7\\\xd2Qp\x1b$/S\xc5\x32~\rOB\xe4vI\xaf\x18\xa8-~\xa4" +"\xbcQ\xf9\xd1{J\xb2\xd0\xf,=\x1f\x7f$M\xc6j\xa1\xa4\xdfQ\xbf\xe\xfbWG\xfd\x1fzr\x19" +"i\x7f,\xe0\x63\xb9]\x4\xe\xb8\xab\x39\xb1$oT\x11\x9c\x1e\xe\x96\x86\xf7#\xc7Ol\x9a" +"\xc4\xb9pEB<]\xb0\xe3\xd5#\xco\xb0\xe6\x84\xb3\xb6\xc3t\xb0\x61\x8eMt(\x10\x7f{<" +"\x91\x1\xf1W)?\xea\xbf\xfe\xca\xab\"]U.MK\xab\x37\x31\x65\x84\x8d\x9f\x62]\x80\xe3" +"\xde\r#2\xff\xc0\xe\xbb\xf4\xf6\xd8}\nC\x7+v#\x1l\x6\xe6\xf5\x36N\xe5\xc7{,\x1d\xc9" +"/0\xba\xcc\xe7\x83\xc4\xc}\xb8~IL\xe0\xb5\x64\xbe\xbe/\xf3^\x1dHl\x0^j\xacZ\xe1\x93" +"\x1e?\xf7\x35\x8f\x15-H6\xecz\xdc~'\xc5\x36\xe7\"\xcc\x9a\x1d+]h_\xdd&\xcf\xcb\x61" +"pL\xf1\xe6\xea\x9x[\xf8\xe7\xf0\xc6\x94\x30\x1f\xe7Q\x82\x8d\xe0q*\x8e\x83\x3\xeb" +"k7\xf8]9\x89\xdc\x5s\xf5\xda\x42Y\x81n\x89\x44\x5\xf2\x8a\x1e\x34\x8e\x7flYl\xe8" +"\xc5\xf2\xae{\xf6\xbd\xfe\x1d\x35\x92\xab\xa7\x4\x5\xd1\x88\x80\xbf\x45\xe6\x31\x9" +"G\x92S\x8a\x8a\xeb\x32\xa1[\xd5z\x7\xc6\x1\x8c\xb7\xac\xc3\x65\xe3\x8\xa2\xb0\xcf" +"\xbe\xcc\xf6\xc6\x63\xbc\x1c\xf0\x4\n\x19\xb0\xbb\x39\xa8Qgr\xcc\xca\x9b\xfb\x7:" +"c\xd3\x30R\x12\xfm\x90\x66\x35Gw\xd5\x11\xdd\xac-!y\xfc\xb1W\x15\xdd\x63\xa1O\xe7" +"\xb\x42\xb3\xe,\xa3\x38\x91\xe4[\xa4!\x86\x66\xac\x1c\x9f\x10\xd6\xcc\x82?\xb9\xe6" +"$\x7\xef\x9b\xff\xa0y\xc0\x62\xdb\x8f\x82\x80\xac$\x15&\x8b;\xfe\xf9\x31XkEL\xcf" +"\xde\x1cq5\x83\xd6z\x3\x31u\x90m\xb6\x95\x85g\xfd\x1f\xd0$\"w\x84\x1bZ\x98\xe6\x8b" +"\xc4\xe\x9a\x99L\xeb\xc0\x61\x9d\x87\xc4\xa2\x90\xf6\x2v\x80\xf9\xce\x11V\xebK4\x14" +"K\xd9\x9\x6\xb8_\xf8*\x4H\x2\xc7\xf8}\xff\x66\x42\xce\x94\xfe\x1e\xdc\x43\xfa\x98" +"m\xfd\xe2\x96\x66\xf5\x6y\x93\xfc\xc2\xfu*u\x1at\xcf\xd8\xe7\xd5\xfd\x7fN\xb0\x66" +"\x16\x11\x14\x85\xf1\xa8\xe2\\\x35\x12\x62\x9f\xbe\xa5\x82\x18ts\xc>v\x1f<\xb\xb3" +"Q\xfc\x42I\xc2.(\x8qJ\xe9)\x89\xc3\x82\xe8\xfa\xc2\x95\xe\xe4\x33P\xdc\x31\x9a\xa8" +"?\xa4\x3\x9c\x18\x96\xf6[\xf0\xd3\xf9\x9c\xb2\xc0\x1e\x35\x82%@\x94\r\xa4\x87\x86" +"IF\x12\xc7\xba\xc3I\x5(\x8~\xc5\xefN\x9b\x98\xb8\xb5\xfa\xd1\x19\x43k\xbe\x8\xba" +"\x8X\xd4\x36\x83I\xbd\x83\x7f\x9\xc0\x8d\x97p\xea\x45\xb8vn\xbc\\\x5\x1f\xe0\xf6" +"8hfJ\xb5\xee\xfc{\x82\x5u\x3\xeb\x97\xe0\xe1\x38l\x94\x90i\x8Y\x95\x1d\x8c_\xbdJ" +"\xb4\x37+$\x8dJ\x9d\x1e\xb2\xa5\xee:,\x81(6u\xf4\xba\xc0\x13{\xfe\x9f\xea\xfcM\xd1" +"\xf6\x39\x8e\xd3\x3M\xb0g\xa1\xd9\x65y\xc9x\xb2\xcb\x30\xa4\x66\xf4\xf1\xc1\xcc\xa8" +"\xd9\xeap\x17\x45\x9f\xa9;/\xbd\xff\xf2&\xf5\x82\xf\r&\xb}\xeb\xa7\xebW\xa3Z\r\x8e" +"}\x1cpC\xee\xb5\x1c\xe9\x1b\xda\xc4\x12\xd5\xda>+e\xad\xce\xed\xce\x18\xd4\xe\x97" +"0\x1dI;\xcf\xad\x62\x9p;\xc2\x1a\"\xc4i\xd0\x84\x43\xe9\xcc\xd1Z\xd1\x1\xfd!\xc6" +"\x8e\x39\x82\xc5X\xf6\xfb\x11\xe4\xf6\x82\x65\xc0\xdd\xff\xa6\x82\x18\xdfX{\xd5\x34" +"\xf0\xed]\xf9\x88\xbf\xca@\xc7\xbfs\x85\xc9\x93\x65\xea.@A\x9a\xcao\x18\x97\xd8\xff" +"\x11\xd5\xbc\xa1\xee\x80\xd7o\xee\xb0\x8f\xcb\x38\x12s\xb6\x98\xe\xf3H}I#\x1bOz\xc7" +"\xac\x97\xd0+\xaa\xf1\x41-RZ\xe6\xee\xec\xde\x89K\xbc\xa8\xb1zp\x1\xec\x95\xbb\xc9" +"b`\xc3&\x93\xb1\x12\x65:\xe0\xf2nG\x1f\x92\xfGY\xcb\xc2\x99]\xb0\xde\xb5\x39\xc\x88" +"\xd2\x83>n\x13SS\x7\xef~\x91\x41\xf1\xf8\xd0\x4\x7f\xd4R\x9j\xd6\x87\xac\x30\xb0" +"k\xd6\x95\x12\xe7\xcd\x0\x9a\xa2\xc7\xf4\x37Thz,\xdc\x5\x85\x35\xef\xack\xedN\x9" +"\x99\x44kU1\xb5;w\xb6\x7\x2\x91\xd0\x89\x2\xcb\xfb\xee\x1c\x6\x31\x9e\xab\x17\x32" +"\xa1\xee\xd5Vs~K\x4\xb0=D`\xf5\xb8\x14\xfew0\x1a\x9bX\x9d\x12\x10\x96\xe2y\xf6\xaf" +"\xee&1y\xeqH\xfc\xc9N\x1f\xa8m\xdc\xe4\x86\x9f\x96{$m\x94\xb1&\x17\xab\xae-\x95\xad" +"\xd1\x2\x89\x8d\x34\x33\xae}\xe4\xdd\x1a\xb x\xb6\xa6\x8dn\xe\xe1\x83.]6\xb8\x30" +"\x8d\x93@\x8eo\xcb\x8a\xe9\xf4\xc6\xb5%X1\x14y[\xbb\xea\x39\xdf\x3?\x8f\xa9\r\xba" +"\xc3\xa4\xeeU,~\xd7\x1\xe1\xf5\xa7\xdc\x41\x1a\xa9\xb5'\xa2IV2j\x86\xc3o\xda\xb2" +"\xdak=e^\xfe\xab\xb6\xc\x89\xfd+P\xef\xd6\x88\xb7\x61\x12\x92_\xd9Of(\x9f\xdc\xad" +"\xb\xad\xea\x45\xc3(\x9b\x7f\x14}E\xcby\xab\x8\xfdH\x90\xfb\xf5\xcb\xb8\xea\xbf-" +"p;\xe3\x82o_\xd5\x83\xc9*\x89L\x1e\xc9\xdd\x85\x34\xa0=c\xe1\x86\x9aq\x93\xe3`F:" +"\xdc\r}\xe4\xb9\x30\xce\x6\x31\xf2\xb7\x39t\x13\x80\x9f\x1e\x31\x43\xe6\xdb\xff\x12" +"q\xec\xea\xfaq\xdb\xf7\x17U\x9f\x65\xf6Oa\xad}\x99\x31\x31\xe2\xb5\xc4\xe3&\xec\x1" +"3\x89\xb5\xdb\x81\xe1t(\xef\x97\x16\xe8\x46yM\xbd\x83\nt\x0\x97\xedY\x8bZ\xf0O\xcf" +"O\x86\\\x89ru\xf8\xd8\xa1\xfe\xd7\x7f[\x16\xcc\xf1\xd2!\xe9\x19%i5\xfb\xab:\xb0\x2" +"i>\xf7\xf7\xd8\xcb\xe1\x9d\x94\x42\xe2\xf4\x82\x89q\x91\xf6w\x4\x41\xab\x62\x92P" +"9s[\xe0J\x9\x31\x94tF\x18~j\xa5u\xebM\xf1\xb8\xb3\x13\xb7\xdeWN\x81W~fHc\xe5\x42" +"\xc0\"\xa4\x45\xa3()>Nx\x8b\xad\x66P\xbf\xb9\xb6\xc8\xa7u?\x88`\xc7\xb3\x81:\xa3" +"fH\xbd\xef\xa3\x93$tDc\xf3\x87\x31oq\xf\\\x8\xdb\x31\x92\x9d\xdc_\xed.\xf5Z\x11\xee" +"\x1d\xb3\xbf\x32\xe7\xa7\x37\xba\xb9\x33\x30:}\x7\x62\x8f)>9\xf6\x33\xe0$\xc9\xdf" +"\x82u\x9b\xeb\x43~N\xde\xc5\x66\x80\x39\xeb\xa7#\x15\x8e\xf4\xf7\x99\x8bhj\x86\xa5" +"\x1\xdd\x2\xd9\x87.M\xbb\x84gD\x8c\xac>B\xdf\x84\xec\xb9*`0\xa1=2\x86g\xef\x97\xdf" +"\x7v^\xf3\xb9\xa3\xf2\xa6G\xed\r\xee\xf5\x9a\xee{\xc8\x83\x0\x9e\x32\xc3\xeeS\xda" +"B\x13WHn:\xcd\xc3\xa2\xfat\xa7\xce\x17\x83\xeb\xe5O\xfd\x38z\x93\xf9\xb3\xd2Xe\xec" +"\xc1\xc2\xa2P\xa2\xca\xae\x87\xe5JF[e\x1b\xb4`\x88J\xa7\xcb\x85|\xce\xb5\x90\x31" +"\xc9\x37\xed)\x1a\x93:\x3\x2\xaf\xc1}\xa7x \x12\r:\xfa\x7\xd5\x2\x11\x37R\xcb\x61" +"\x95\x6\xff\xeagD\x96\x81\x6\xc8\x9c\x84\xe9)\xf2\xef;\xa2\x17\x11g\xdd\xf1Y\n\xf4" +"\x1d}\xd0\xa0i\xb9k\xfc\x66\xb9\x14\xfc\x1b\xdb\xc\xef\x99\x31Mx\x99\x13\x0\xb3\xc0" +"P]\xd1u\xa8\x36\xc0\xb5\x99\x9d&ffL\xee\xc5 \xb4\xe9\x85w\xc9\x82\x97L\xac\xe0\x87" +"/\xc1\x1X\xce\xec\xe2\x32'\x1\x88\x8e\x64\x85t\xf5\x14vW\x4x\xbdk\xa8\xc3!\x8e\x96" +";Z\xd9\xfag\xa1\x88#\xaf\\}\xe7\x9b\xa1\xb\x2\xa1\xe6\x88\xe5\xc2\x9c:J\x9al^\xad" +"k\xb7\xbfZ\x1b\x0\xb2\x15\x15\xbe\xa7R\x8lQ\x85Sr\x9\x6P\x9d\x8fK\xeb\xbe)?\x8cz" +"\xa2\xc4T\x98Z\x12\xa6\x62\xfe\xff\x7fo\xaa\xee\xfe\xbe|m}E\x88\xe1\x46;\xab\xe8" +";\xd9\x3\x15\x10\x12\xcd\x34\xf9\\\x9c\x97v3\xca\xb6\xb3\x64\x99\xb2_@\x8d~b\xb1" +"\xf8\xa9\x2}Q\x1d\x89\x6\xa3\xa8*\xba,\xa2\x8b\x12\x8c\x97L\xf2\xc2\xde\xd1h\xce" +"\x8a\x1d:\x97\xc8U\xc1,Q\xf8r\xc8\xae\x33\xea\x97\xbc\x95\xcc\x13\x15\x9f\xe9<\x97" +"\x9a\x32\xb0^2n' D\x1b\xee\xc5\x65\xc3\x8\xf2\xe8\x88\x0\x16\xb9\x89\xc3%U\xa5\x62" +"\xba\x8\xf3\xc5\xb0\x42\x89\x9b\x1f\xaf\x93T\xf1\xf0\xda\xc4\xb0\x9c\x32\x1e\xcb" +",f&y\xd6\xb6\x92\\\x1d\x61[\x10\xf6\x34\xea\\\xeaIV\xa2\xc0\xdf 8\xf0\xa8]\xea\xb7" +"\xb6\xc1V\x19\x91\xf8q\x98\xd7\xbc\xed\x45\xcd\x15\"\xf6\x9f\xc8^gV\x1biJ@\xdbL\x9b\xf2\x9d\xdc\x39#D+\x9b\x16\x9c=\nSP\xd8\x10\xdf\x19\xe6" +"F\xf2\x30^N\xeb\xa5\x61\xbf\x85\xea\xea\xe5\x1eM{\x81\xd3\xad%n\x95\xebj\x1f\xa9" +"*\xa4)\xd7\xe2YZl\x87\xa9\x94RYP\x3&\xc3\xdb\x1fY\xd3\xeb\x8c\xc1\x1c\x7f\xeb\x8a" +"k\xf1\x82\x46\x86\x31\x66\xa0\x9ez\x8c\x8f/T;\xbd\xb5\xa5\x85\x92(X\xd8~\x87\x96" +"#\x13\xe7/\xf2\x82?\xb0&(e\xab+^\xba\x8a\x8f\x1c\x82@\xa3\xd3\x86N\xa1\xa7\xaat:" +"\x98\xe0\x9ej\x81m\xd7\xe1\x7\xd1PG\x12\x64\xa8\x5\r\x2>\x4\xfaH\x15xA\xf\x99j\xfc" +"!O\xa6\x46\x8d\x18JY\x10\x31\xd5rc\xff\xab\xf3\x32\xddp*\xc4\xff\xb0\xa2\x82u\xad" +"9\xa4h\x80Z@\x4)\xfa;\xf2\xee?\xfc\x18\x13g\xab\xeenW\xc6zM\x95\xd5\x1j\x81\x8f\x1d" +"\x8b&\xe0\x38\xe1\x1b-\x13\xe5K\xa4\xc2\xf9+\xff|P,Z\xce\xffXJ=\xa4\x2\xf6\xc7\xd4" +"=\x4\xe0\xf2\xf6\xc4\x16\xae\xb0\x97\xff\x42:\xf2K\x9e\x1d$\xe1\x30\xd9\x81\xc1\x37" +"\xb7v\xeaYQ\xae\x1\x3\x95\xca\x30\x80\xddSw\x1e\xe\xce\xb\xfd\xae\xf8\x31)'\xb5\xc7" +"7|I\x80\x93R\xe9\x11\x35y\xb9\x43-\xb7\x9a\xf8\x8a\xe\xf9-;\xae\xaf\x8c\x3R\x12*\xd4\n" +"8\xb4\x8c \x12\xe0\xea\x44\xe7T|\xb4I\xf5Q;\xadGK#8\xbd\x91\x95\xce\xe4*\x8f\x9e" +"U\\8\xfa\x1f{\x95\xfc\x2<\x1a\x30-R\xccO\xb2\x41\xd6\x2\xc4'1_\xdb.\x4G\xdc{\xfd" +"\xa8\x93\x9a\xa8\xda\xcd\x33\xd6\xc4\xe4\xf5\xf4\xc9\xeew\xa2\xfa\xbb.\x1n\xd1\x32" +"Jw\xf8\xc2\xc\x1f\xb6!>\\\xa5\xec_\xec?`\x97\xa9\x9ch:\xee'k\xf3\x19~\xbeT\x7f\x10" +"\xf4\xf1\xfd\xb0N#\xdd\x9d\x91\xcc\x1b\xb5-cl\xa6\x45\x9c\xfd\x61\x0M\xcaZ0eY\xc6" +"\xe4\xa7\x3\x91T\x8f\xba}(\x8\xfb\xa5\x4\x18s#UO\xbdT\xee\xc1\xb7 X\xde\xb6i\x9b" +";\xf7s(\x16\xbd\xfb\x65\x14\xbcM-\xed\xe8\x88\xf6\x3\x1\x6P\x9di\x1au\xe7\xd8\x8f" +"\x8f\x31\x43\x9d|PV6\x8d\x89{\xd4\xd6\x1di\x1a\x83\xb5\x45\x37xQ\x16\xe1\x64\x9a" +"\xa8\xdbO0\xc1\xda\x1f\x45?~\xd7\x85\xe9\xccW\x8\xd9\xb0\xca\n\xda\x30\xc9S\xe1\x96" +"\xde\xd7\xa4\x66$\x96\x90\xa0\x35\x35\xb2\xf9\xec\x9d\xf1\xcb^`H\xe3\xc5\xd6\xfa" +"\xff\x46\xc7\xec\x1f\xc7\xbb\xd5\x30\xf9\xfe/;\x93\x16\xfc\xd8\xe9m\xe3\xe/N\xfb" +"$4\xe9H#K.\xe7>\xf6\x87\xc6\xf2\xf6+\x5;\x4)\x9b)\x81~\xf3\xd2\x88\xf\xe5\x7fs\xe9" +"\xdc\x91!\xab\x99]?\xfd\xca\x8dsg\xc0\xf2\x1\xdd\xe1\x6\x9f\x65\xa2'\xabH&\xd9\x9c" +"\xee!\xa0P\xc9q\x82+zU\xadn=\xea\xe6\xbc\x81\xb7|g^\x1a\xbdt\xfe\xe7\xe6\xcf\x10" +"7\x94\xc2\x9a\xef$\xe5\xf5%\xcf\xcd\x85\xd9\x85\xd6{L\xedS\xfa\xe8\x61\xb3G&\xf9" +"\x13\xd9\xcc\x83W\xf0\xcd\xf0O\x1di\xed\xe6\xfa\x44l!nPE\x7\xf0R\\\xc3\x62Y\x18." +"\x8f\x3\xd6}\xa3S\xe\xd9\x8f(K\x97_\xd3\xc1\x0\xd5\xf4\xd8~\xa5\xa4\xc0\xe6\xc8\xc8" +"\x19\x99\xeepM\xf7\x85q\xe1\xb7\x90\xf6v\xc9\x96\xc4\xe9o\xe2\xaa\xa6\x9a\x9f\xcf" +"\xdd\x2\xb2*\xf2\xa3\x16\x93z\xf3\xe9\x8aO\xe7\xd2\x35\x64i\xa4'\x2\x12\x44\xb2\x46" +"\xd5\x93o\xa0m\xe8\xd2\xdd\xc\xd5\x9e\xbdM\x8e\x37\x4\xaa\x1b\xdbv\xa7\x97\xf3L\x4" +"Nx#\x9f\x35\xc4\xb1\x88\xcd\x19`1D>\xc7\x6\xde*\x2\xe3$\xdd\xf7\x34\xdf\xc0\x45\x89" +"\xa7\xfc'\x2%y\xc9:Qo+\";\x90Sl\xac\xc2\xa7\x8c\x46\xe5\xa0J\xf;\x17$J\xc5\x0&\xfd" +"\xf\xa5\x9a\r\x43\x0x4\xde\xeb\xf0\x87\x65o\xf3o\xae\xb0xj\x8=,\xfd\x97@3\xc8\xdb" +"f\xc3\xf0R\xb4\x9eu\xddi\x11.\x9b\xd0$S\x9e\xe0\x15\x36\xa9\x97\x19\x83\x97\x9b\x10" +"\xb\x84\x15,\xf6\x1d\xa5\xc3\xdd\x43\x81\xd2\x5\xf8\xe\xf1#v\x89I?|\xbd\xb6\x9f\x85" +"\x9\x8$I\xec\xb9\x46&\x8c,\xf3P\xb3\xfdKfN\xe1\xb\x63\x36\x43'\xb1\x1cj\xd9)^\xfc" +"|\x92\xa5}~\x92\xbfxk|4p\xfan\x18\xce\x64\x85\x9c$\"X\xb8]aF\xf0J[\xe1\xf8v\xc9\xde" +"\xf3o\xc8i\xdbz4G^Q\x1fSJ;\xed\xd6\x9f\x1c*x\xc0s\xaf\xcd~\xfeX\x80\xffM\x8c\x5\x90" +"\x8e\x45\xcd^-\xf8\x10\xa1\xea'\xb8rz\x7l\x2\x45n\x3k\x9f\x85\xcf\x9c\xb9n\x83\xf8" +"|\x8c\xbf\xbf\x65\xa4\xdenx\x85\x61\xae,\x5\xa5P\x12\x1\x99\x91\xbb\xf4\xef\xcb\x93" +"\xa1\xd5\xf7m,7:\xe4\xc7\xe2~7\xcdJ\x8b\x10?\xb4\x11\x8b\xc6(\xee\xd5I\xf\xdf\x9b" +"\x5 (\xeeO\xac\x83\xdeGm\xb0\xbdx\xe8\xb2\xd4\xdf\xc5\xbd`\xdas\xb0\x31\xcb\x8e\xf" +"\xed\x97\xd9\x97l\xf7\xb3\x92\x8b\xbd\xdb\xff\xf1\xb4q\xa9\xe7\xdf[2e\xa2\xe2Q8\x9a" +"\xfc\xe6\"\x66\xd8\xb2\xff\xcd{\xbb\xf4=\x80?z(uY\x80\x99R\xbc\xa7]\xa0\xb4\x35\x66" +"\x1b:\xd6\xd2ZL\x3\xc5Wq\xed\x42\x32\xf0k7\xc4\x19\x4WCq\xd2\x7fh\x3\x99\xab\x14" +"\xcd|u\xee\xda\x10N\xd5\x19XH9\xce\x3\x39\xbfk\xc5\xcc\x42\xa5\xc4\xdb\xccY\xb4\x38" +"d\xc7\xac\x85\x9d\xfb\xf3\x62\x1d\x19(F7\xc4\x39\x9f\xfe\xb7\xcf\xdc\x8d\x2\x1\x1b" +"X\xbc&\x9b\xac\x8c\\\xec\xbaH\x9a{\xdf\xca\x42\x8\x6%\xc5\x66\xfe\x16\xf1x\x9K\xce" +"z8-\xcf\x85\x90\x90\x99\x1c\x85\xca\xba\xd2\xb7J\xf1\xe8\x5rDF\xac\xab\x13\xd7^O" +"\x94$\xf3\xaf\x64\xa6\xf0\x1f\r\xb9\xb6z\xa0'$\xff\xf5\x1c\xc\x1cn\xb8>\xb3\xf9\xd3" +"T~A\x8\x98\x1dsF+\xd3\x38=\xa8\x35:\xef>\xb3\x1f\xdb\x34\x90\xc1L\xcf\xbbS\x1a\x83" +"\xbf\xa6\xbf\x96\x9f\xf\x65\x8c\x64!b\xfb\x93\x86\x66\x9b\xd1\x9b\xc8\xee\xeaw\x7f" +"\xf6\x30\x18Xq\x9aZ-\xf8\x82\n\xb9\xe8\xbe\"P\x1\xf0}\xe1\xd0U\x8e\xa2\x36`Y>\x1" +"-O\xe1;\xf0\x1a\xdd\x65\xce<~yB\xecR\xdc\x81KBO\xd6W&\xdfvji\x13\x41\x92\xd4\xd6" +"\x81?\xa5\x37\x0\xc1\x8cg\xffv\x9f\x7f\x1a\xf0mH\x6\x1a\xc7:>9 \xaam\x1a+C\xd7\xd5" +"\x82\xd3\x8c`9\xb1_\xca\xae\xf6-C\xf9JfWE\xe2\xec N\xa0\x88;B\xc4\xb\xba\x1a\x95" +"\x89\x1c#\xeb\xb9\x1a\xe1\x7\x11\xf1w\xc9\x65\xf2\x8cI[\xbc\xa2\xd5W96<\xc\xec\x61" +"\xa6\xeeH\xa7u\x96\xba\xc\xd6\x34i'jH\xc4\x89\xf1\xf2\x65tz/$\x18x\xa7\x6\x44#C:" +"\xa7zv\x8a=\xab\x5\xce-\xf1\xee\xe4:\xdfq\xa0\x18\xee\x44\x90\xf8\xe9>\x0\x16P^\xf" +"\xb6\x95\xa3\xcc\x9fk\x92\x88\x9dM\x92sQ^0\xca\x61\x8a\x64\xa1\x13'\xa6\x95\x42Z" +"\x85\n\xbd\xdb\xc0\xe1\xb2\xc2h\xc9\x98R\x9c\x41\xe\x37\x1aQ%\x1f\xd2\x7f\xeb\x64" +"tMd\xd8\x6\xeb\x9dv\x86tw\x9c\x1d\xdb\x15t\x0\xc8\xe6YQ\x18\xb7\x45\x18\x12\xb1\xe6" +"\\Y'GR\x96\xd0\xad\x9eT\xe8`\xfe\xea\x7\xff\xee\x65\xbe)\xce\x5\x89\xa5\xd3\x95\xb7" +"\xa9=\x9M\x8f\xfc\xbd%\x8d\x92\xa8'm\x2\x9d)a\xde\xd8\xe9\x39\x10\xb2T^\xaa\xc2x" +" \xd4\x98\xb7\x92\xaao&\xb6\x30\xdbI\x8c\xdc\xa1\xf8\x12/\xda\x99\xfe\x16\xb5\xf5" +"\xb3\xban@\xfbH\xc2\xce\xe2\xa1#\xbb\xa7p\x1f\xc6\xe3\xf\xb4*\x18\x13i\xfe\xb1\xb2" +"\xba){\xddZi\x2\xf6\xe3\xa3}_\xb6\xdd\x0\n\xb5\xa9\x17|\"\xc\x2u\xa8\x9a\x34L\xa6" +"\xff+\xb1\x87\xad\x19\x46*c\xfb\x93\xed\x31S\xa1#\x87\xb9#\xcc\xbds\x17\xac\"-e\xc5" +"\x92\r\xb5]~\xbe\xb9\x18\xb3\xee\xc5\x83SbE\xa0\x3n[\x4&:\xe9\x87\xac\xd5\x4\x4K" +"2\x7\xb7\xa1\xad\x1v(\xd7Z\x99(\xc1\xaf\x34)\xf5\x63T\xa2\xc9\xbf\x1\xe2\xb1x\xaf" +"\x18X\x8eR\xf\xb5Y\x8\x45\xc8\x45\x61\xd3\xda\xePL\xd7\x45N\x99\xcey\xb\x7f:\xae" +"\xf4\x99;\xafu\x12u\x9a\x98\xf0\xe7\x43\x82v\xf4\xf8\xec\x62H\xe3HL\x84'u\xad\xae" +"\xab\x6T\x11\x89\xf0\x98\xb0K\x1dHt\xf1\xf2\x32\xf9\x31\xad\xde\xc\xe1\x42\x65\xa8" +"\xb2\x98\x61\x44I\xb1\xa7T\x88\x83\xc0N\xfd\x89\xe0\xc8\xe8\x83,\x14\x43\xc8\xb9" +"\x14\x88\x9c\xaa\xbd\x87\xbe\x9a`\xb~\x97\xce\xad\x30\xa6\xf8\x5\xe7\xa5\xd6\x1\x17" +"\xab:\x17\xc\x1e\x38m\xce\x89\x16\xff\xbf\xd7\x31;\xda\x1\xa9\xb3KC2\xbd\xeb\x85" +"\xa1\xb2\x9\xa5\x1\x33\xe3\x96\xd8\xf1\x8bO3$}\x94\xe4\x99\x19\x42l\xa4\x9\xa6\x1e" +"H\xb7\xf0\x30={fW\xd5\xae\xfd\x18\x80\x8f\x9d\xcb!\x1a%\x38\x97\xa5\x98\xdf\x12\xf" +"\x12\xee\xbf_\x13z\xea \xea\xb4V\xf6\xd0\xe4\x5\x8f\xb3HG\xb6\xce\xc4\xdc\"\xeaU" +"\xf9\x44\xa9s\x82\x8d\xcfRA\xed\x8ah\x12\xe0\x13\x18\xd6\xd5\xd8\x9c\"\xb1\xfa\xdc" +"\xac\x39sP\x95\xa3\x1b\xbf<\xdd\x92\x36\xdf\xed\x16)_5\xb8\x0M7wZQ\xb?\x9a\xa8y\xb2" +"\xb2\x8eJ;\x17\xfd\x95]\xee\x8b\x8b\x92\xad\x16\x18\xe9\xa3G\xf3\xd6t\xb9\xbe\xe9" +"\xf6\xf7\xbe\x11+\xcc\x88\xbb\xb5!@L\x14\xe4\x10\x63\xfc\x9b\xde\xea" +"\xa0\xa2|\xea\xb&A\x80\x92J\xff\xda\xe5\xd2 ^\x9e\xbd\x45\xee\xa4h6\xe7\x87)\x95" +"\x1f\x10\x1d\x89\xe9\xa2\x86\xd7!OT\xc9\x82\xda\x32H\xa0S\xec\xbf\xbdN\xe8\xca\x18" +"\xf1\x82\xef\x86[\xe4\xf4\x88\xf6\xb1\x84K\xa3\x46=\xd3\xbf\xb9\x1a\x83\x2\xb7\x13" +"#\xc5\x9e\x4$\xfd;\x6\x8a\xd6\x98\xbe\xa3\xb9\xe2\xb5\xa8S3\xef\x93<\x6%\x14,3]\xea" +"\x0%\x9ds<\xd0q\xe6\xd7\xecp\x84\x7f@VH\xe9\xd5\x98\x16\xc6\x9b{\xeb@\x18\xfa\xd4" +"Ro\x1d\xbe\xc8\xc1\xca\xf4\xe8\nKRH\xf9\x46\xb\x95}K\x19R\x19K\xae\x1\x9a\xd3\x83" +"\xfa\x85=\x80(\xe8\xe1\xbf\r\x98,\xd1\x1\x82\xfd\x9e\x9fk\xf6\xb9\x43<\x14\x9f\xca" +"u\x9cS\x8d\xde\x62I\xe2\xb4\xe1\x37\xf3\xa6)zK\x18~o$M\x97.Io\x2\x17\xb4*n0\x94o\xc\x14k\x9dP~\"\x14Vi\x9fM\xca" +"\xb0\x35\xbb\xcc\xd1\x90\xb8\xbf\xcb\x0\x4m\x96O\xc3^\x1f\xe9\xa2\xeeLN\xd1\xf3p" +"\xb7)\xd6\xbb\xad;\x7\x82:\xcf\xd2\xfa\xd4\xed\xfa\xaa\xda\xfe\xe7\x8e\x1d\x8d\xee" +"\xc\xd6\x8c\x32i\xe1:\xe8\x9c\xd1\xc7\x2\xb0\x8f\xc1\x88\xddo\xb3\x86\x1e\xd5\x37" +"\xcf\xe4\xb3!\xaf&\xcc\x92" +"\xf9@,/8T\x7\x61\x99J}G\xcc\xad\xdb\x42g\x9dS\xe5$4\x1d\x86\x46\x8e\xe7\xb4\x12\x9c" +"U\xc0\xa3\xe6\x8\xe1\x90\xfc\xe9\x42\x13\x87\x90\xc7\x8f\xc7p#\x8b\xfc\xf7\xaf<\xda" +"\xdc\xe2\xfem\xe0\xb3\xd6Q\xfa\xfe\x9\xe6|\xe\x88\x7f)C\xaaX\xf9h\xc1y+\x1e\x8at" +"\x81\xc5T\xe8r|\xe8\xfe\x1d\x13i\xbdR\xb5Y[3:\x6\x63\x1e\xb\x11W\xa2\xaf\xa8(<\x15" +"\x14\x38\x30\x87\xf5nY \x8e\xa8\x3\x8f\xa5\x16\xa7zKU\xe\x1eW\"6\xc8\xc9\xc7\x9b" +"\xe3\xba\x37\x2\x15\n\xf3\xc1\xaf\xec\x8b\xc\xf8\xa5\xa7\xe1\x99M\xc6\x1d\xe0\xd9" +"\xa2W!\xcal\xff\xdc\x88\x89\x16\xdf\xd8\xcbQ\xd1\xfc\x18\xd0y_\xc0WHg\xe7\xd0W\xb2" +"F\xbb$\x8c\xb7Y\xe5\xf8\xbb\x98\xe5\xa2\x93\x42\xd4\xc8\x8v]=\xd9g\xb7\x11\x8s\xbd" +"0\xae\x9a]>\xe8RW\x1a\x63\x5\\r\x85\x4T\xe3\x19O\xe4\xb\xd0X\xd7\xb7\xa6$\xa2N\x9a" +"fA\x13'\xdcU\xac\xba(1p\x82\x14\xe5\xaf\x96,\xfd<\xb4\xf0\xd7\xae\xce&HFf\x19\xc8" +"\x9c\xf9\xe\x9f\xef\"\x8aP\x9f\xae'\x86s\xcd\x16\xd3\xad\xae\x95\xb4\x37)\x1v\xb3" +"\xe0\xb5\x46iI\xd4\x31\x1c\xdf)\x8a\x15v\xc1\xc8\x1\xec\r\x43[\x85\x14\xa8\xab\xbc" +"WN\x1d=??\x97\xdaS\xda@]\x98\x32\xe2Rn6\x16\xa5=\xd4\"\xd1~\xe6\xf4\x66\xf1\x1\x8b" +"4?\xfd\x8a\xa9\x61\xb0\x35\xf8\xd6\xb2\x99'Ux\x98\xab@\x1f\x0\xb9\xc6K:\x1a\x89\xcb" +"\xea\xa4O\xc2\x11Y\xef\xfc\xc2\x91\xb0T\x12\xc2\r\xbd\xcfW`H\xb_`\xab\xa3\x10\x1a" +"\x19\xbctE\xc3\x9e\x86\x4\x7f\xe4\xd4\x92\n\xad\x1f\xca\x8e\x8b\xfdtC\x1c\xd0\x17" +"\xb5\x2\xdau\xd2\x9W\x13\x80\xe7W+\xa4\xc1\xf8(I\x98\x31\xc8\x88 \xac}\xe1\xcbK\x9c\xe1\x13\xf6\"\xeeWj_M\xfe\xa7\x81\xe0" +"\xd1\xb0]\xc6\xad\x39\x89\xb3\xb8\x30\x8a\x38\xe9\xcc\x93\xb9\xae\x11\x63\x82\x10" +"\\0\x9\xd9\xf8\x36\x7f\xcd\xe3\xd8O\xb]\xa6p\xe1\x33\x1d>h\xbf\xe2\x18\xe\x4\xa1" +"l3\xa2X\xf0rD\xad\x9c\xf5jO\x9d\x46\xf0&D\xfd*\xfb\x91\"\x44;\x6\r\xb8\x99\x44\xf9" +"\x0\xd7\x7f\x37\xfd\xaf\x7f/m\xeaU~\xb6\xbe\xb\x10%\xe1\xe7\x42\xd0\xf5\x10\xdc\xa8" +"e\xa5q\xa6\x31\x32\x9f\xd1\xc8GPE\x89|\x85U\xa5\xa1H\x9b\x84Z\x1chY&\x8\x84\xf1\x93" +"\x96\xc5\xb6\xbe\xfc\x12\x16Wtg\x8bO\xc7LV\x95\xf7\xe7<\x84&\xe9\x88\xbc\xa8\xb9" +"\x8eQC=\xd7n\xb\x94\xbe\xd5\x5\xd7\xc8\x10\x8bU\xdf\x1a\x81\xdc\xa3\x8c\xff\x88Z" +"\xa0\x45\xda\xe\x9d\x92\x1e\xb0\x13\xe6\xaa\xfa\xb5\xac\x15(\xbf\xf1\x10\x9d\xa7" +"\x1d\x85>\xb8\x35\xcd\x90\xe9\xc2Y\x9ds\xc8\x12\xe8)Y\xd7\x41\x66l\xb6\x13\x31\x85" +"\xc8\x39Z\xc6\x97\x32\xa4\x9es\x87K={qS\x1O\xdd\xdb\x90q\x12\xbb-\xa5\xe4\x61\x62" +"\xa1\xd6\x7fR\x88\xa0\xf7@\xab\xb4\xe4\xbb\x33\xb7\xda\x8\xd8\xf3\xdd\x15\xdc\xab" +"\xe7\x30'\xf4\x18\xb8\xb6lytZAU/\x95\xf7\x84\xdd\xf4\x62\x33\xa5\xa6\xe7;\x9bo\xb2" +"\xe0\x9f\xe\x90\x9R_\xd4I\xae\xc9;\xc9\xe2\x14\x89\x90\x16Xn\x90\x80)\xa3\x98\xda" +"Y\xfG\xf3\xb5\x13\xec\x8\x17=qX\x8a\xc\x19jX:j\x2\xec\x34\x18\x3\x31R\xbc\x35\xe7" +"\x11\xf0\x33um\x80=\xdf\xa6z\x10>A\xbdT\xf8\xcc\xa2R\x83\x8~j\xee\xb5>\xfa@\xceo" +"\x11\xc0S\\\xf0scO\xe0\xb~\x17\xd7q|\x9e\xb7\x8cKB\xb3\xda\xc3\x98U\x93\x1e\x89\x36" +"\xd1V\xac\ry\xdb\x34\xc9Z\x84\xcd\xfa\xcc]~\x10J\xb8\xbfV\xd6<\x8d|\xbb\x66\xa8\xa2" +"N\x93\xb0-Y{\x16\xe6\x87\xbd\x30\xf1\xc3\x42\\\x41\\\x17s2v7\xff\xebL\x2\xcb\r]\xf5" +"\xd8\xf5\xb0\xfd\x85\x7f\xabG\x96\x44 \xb7\xa7\xd2\x66sv\x91,\x4\xd4\x8c\xc3;\x17" +"x\x16\xe8;\xff\xbcz\xda}\xcf\xfcL\x17\xee\xf1%\xc9\x8eS&\xc4\x94\x90\xde\xf7\xb1" +"\x88Og)2\xba;\xacU\x1j\xe0\x65\x95\xfb\xd6\x1a\xee\x42\x81\x17\x1dqm\xd7\xba/<\xde" +"\xc5\x92\x62\x84r\xfe\xc0K\xd0\x12\x43Ml\xe8\xd1\x1e\xf2WVN\xa7\x11\xfaNq\xf0\x64" +"\xaa\xef\xe9\xce\x41G\xa9\xcd\x1cO\x12\x14^G \xcb\x36\x96\xb1\xc1\xfb\x0\xfc\x87" +"T\x96 \xc9\x88\x8d\xe3\xbd\xb4\xeeR\xd9\xb8v\x96\x1P3i7?\x9a\x9b\x33\xba\xb4\xc9" +"t{V\xa0\xb3V\xe9; \x81\xb4\x32\xbe\\nG62\xcd\xdc\xd2\xc2\xc7\xc4O\x87\xebJ\x17\x46" +"\xbe \x9cSp_\x4\x87h\x9d\xa1\x35\xeb\xd2\x9cS\x9c;\x9c-\xcb\xb5\x33(\xb3\x11J\xf" +"\xc9r)\xef\x94~\xaap\x11\xe9\\H\xe9\x64}{\x10\x65\x13\xfeW\xfb\x0\x5-\x13\xf3Y\xe4" +"\x7\x9\xd4+\x9d\x7O\x17\xbb\x33\xb7\xda\x14\xb\xed~\xf8\xde\xb7\xe1\xce\xff\xd7U" +"\x89\x91\xe2\x86>\xf4\x43i\x1fi\xf1\xee\xfa\xac\x64vb\xac\xda\xe\xbc\x8a\xa7\xcf" +"\xeek!\xb3\xceq\"\xc8\xc6\x11\x98\xfd\xf9\xc\x1b\xb9\x43(\xfc\xc8\x96\xc4\xbb\xe6" +"\xe0\xa7\x1d\xa4\x41XB\xc0\xa0\xddo\xac\xbbK\r\x9cj\xb5H\x91\x8b=\x97\x90_Xu\xbd" +"51\xb2\xb5\xf0\xee\xf6!\xb8\x10\x64\xd2\xfaQ\x17\xb6\xfet\x8c\xbara\x1f\x64\x61\xc0" +"\x8a\x9d\xd5ni\x86\x9e\x96[@\xe4/Q\x5\x62\x9b\x1b\x89 \x99\xd4\x87\xd9\xf8\xe1\x16" +"Xz\"\xebNCs!\xd8\xe5\xc9\x9b\xa8\x93\x8dO\xc1\x1d\x89\x86\x10\x8f\xa0\x9a\xd1\xad" +"k\xde\x1a\xc5\xb3\xd6\x80^\x93\xdc\xa2\x83o\x98\xaf\xe8\xa1\x13\x37\x84\x95\xca\xb6" +"x\xa2\xdd=h\x89\xf2\xa9\x66\xd5\x80\xb9\x1e\x15$W\xba\xe\xa2\xed\x31\x95G\xd3\x36" +"\x84<\xf0Oz\xb8\xe7\x1a\xe7\xca\x1a\x9f\x9d\xb0\xd7\xf0\x87\xab\x0\xaa\xc5\x85\x19" +"\xed\xb2NK\x9b\x35\xc0\x62\xc2%&,,|-p\xe2\xb1\x1d\xb4\xc5\x16'm\xb5\x1c\x9b\x66\x64" +"\xc6|\xa3\x9\xc6\xdaw|\xc\x8\x88\x1c\xc\xf\xadl\x85G)/\x4\x42U\xa9\xd2\xddT\x6U\xe4" +"\xaa\x43v\xca\xb\x33O(\xda\xfaG\xaePn}\xfc\x9b\xdf\x91G\xf\x1fPF\xea\x97/em\xc7\xf5" +"q\xc6\xe\xd8\x12\x9e\xce\xeZ\xf5x\x5\xa1\xf9\x65\xda\xd8|\x8e\x1e\xbaO\xec\xad\x1f" +"o2Y\x16X\xf4\x66j\xfe\x30\xbc\xdf~dV|\x9d\x80\xd1\x82\x9d\xff;\xa3\x97;\xb3\xeb\x18" +"}`\xad\xbf\xb0?G5[\xe2\xb5L\xe4\x95\xe3\xbe\x43\x84T\x11\xa1\xa6\xbf\xc1\x7\xbf\x8b" +"+K\x9a\xf6\xfb\x33\x63\xc]\x15\xe9\x1b\xa1K\xa1\xe9)\x15-1\x9cV'zv\xb\x85]e\xa6z" +"\x84\xb8\xa5\xfd\x31l\xe7y\x8dt~\xb9K\x0\xfct\x9e\xea\x1d=\xee\x8\xc0\"\x8e\x84." +"\xcb\x99\x6\x0\x8\xf4\xe7HZfk6\xce\xc2/\xcf\x9b\xe9\xdeR\x9b\xb4XXe|\xaa\x2RV\xb6" +"\x7\x9e\xffT\x7\xda\xc2\x19\xc4P>\"\xce[\x0\xeat'I\x90\x97\xd8\x6\xb4(m!\x14\x94" +"\xf3\xff\x13xG}\xe\x8e\xb0\x80\x33\x8cq\xab\x89\xd5\xfb\x9c\x92p\xda\x3j\xfe\x82" +"{\xed\x8d)\xa0)\x88\xe7\x86\x94\xf4\xd0\xcb>\xad\x82\x43]2\xc7t5\xc9\xdfS\xde\x5" +"\xe1_^D\x1b\xcf\xb2& \x80\xe6\xceS\x0\x32\xe7\xa7\x84Z\xf2\xdb)\x8a\xa8\xf8\x17\xd1" +"\x1a\x19\x37\x39G\r$\x88\xca\xb2\x83\x81qKJ\xb0\xb3\xf3\xcf\x38N\x3<\xdeV\xe9x\xaf" +"O>\xf7G\xbj\xa8\xf3\xe6x\x4\xde\x83i\xf1\xaa\xc0k\x13\xd7}\xce\xe4\xa3%\xb6\xec\xba" +"\"\xf1?iZ\xcc\x1a\xbc\x34\xf5~\xed\x15\xa6\x95\xb5\xcb^_2\xa7\xd1\x1\xcd\xb5\xe1" +"\x13\xff\xf7\x8f\xca\x36In\xe3\xe\xb7\x43\x98\xd1\x43\xa4\x32\x9bJg\xff\x94V}\xd3" +"\xf9\xb3\xd4\xf4-\x86\x64\xf5\x66\x32\x0L\xd3\xf8\x8a\x8f\x8e\xc5\x87W'\xc3\xe3\x63" +"\x87\x62\xe6X\xfc\x99QQ*\xc3\xe8#\xac\xee\xc4\x42\xachG\xf2\xb3)\x1d\xe6\xc8Wh\xf2" +"\x1f,\xcc\x15\x1eJ\xfe\x9e|M>V[\x8\xf0\xa3\xa0\x92\x94~\xd3\xce\x9e\x94\x5\xaf\xee" +"\x95\x11\xe1\xdb\xd7\xb7\xa8\x30,d\x8f\x98\xec\xad\x8c\x87\x9c\xb7\x45\xa4;\xffW" +"\xfe\xea&\x19\x90\x41z\xec@\xcf\x8a\xe9\x19\x1e\xe4\xa5O\xbaPe\x13\xbbI\x18&l\x94" +"\xf7\xa2\x1dM\xa6\x88\xdcLKi\xb2\xf0\x12\xf0\xe2S\xba\xae\x61\x91T\xb0\x9f\xa9;\x7" +"CY\xd9R~\xfc\xd3\x8bzc\xfa\xfc\x34\xc6\xe5\x0\xb8\xa3\x90>Z\xfa`yC\xa9\xbc-E(\xc5" +"n\xed%<\x8cy\x95sj\x1fH\x95\xcf\xd3" +"\x2\xebU\"\xce\xf9\xa3\xd1iy\xd5\xcd\x38\x46z\xa9\xc9\xb7\x94\x82n~\xf5\xb\xce\xc5" +"\xa2\x86h;O^Z\xfb\xe0\x97[E\xc4\x8fP=\xe0K\x15\xf8\x6\xf4\x7\xdc\xee\x8b)\\\xa5\xf6" +"\xfl\x90|\x0\xb1yW\xe2#>o\xe3\xc1\x61\x31\xff*\xf:\xdb|\x6x|s\xb4^\xda<\xf7\xe8\xd8" +"S\xcd\xa7\xce\xa4\xd5\xe7Zb\xfgj\xbfQ~0\xfcR\xf9}\xaeM\xf5\xad\xf6\x93\xd6\xd4\xc3" +"\xe9\xbe\x9\xfxM|\xacr\xc6\xde\x17_\xe4]\xeb\xdb\x7\x1\x81\x89\x0\xf2Q\x90]\xe1\xd2" +"\xf9\x91\xd6\xfe\x87$\x8d\xf0\xf7\xff\x46\xfbXMo\xe1\x8d\xbe]@#\x1dI\xfe\xc6\x85" +"\x1f\x35mh\xf0?.\x1\xe5\xe\xe6\x15^\x9bZ\x1f\x80\xd0%\xb7\xa7\x65i\xb5\x18\xb4\xa3" +"\xc4g2\xd9\xae<8\xda?6C\xdd\xc6\x35%T\xf0v\xe5\xc1~e\xa9-#O\xa8\xa5\x9f\xc0\n~GV" +"uQ\xec\xab\xd7\x38\x2\x80\x96\x16\xbe\xdaZ\xeb\xbf\x35\xda\x9f\xd2\xce\x9cH;f\x1" +")\xfcv\x17\xbd\xc7\x89\x6\n\xb6%\xef\x38\x9\xf4\x34\xac\xc1\xc5\xf5\xb7\x6\xfej\xd8" +"\xad;\xab\x38\xc7M\xees$C9:=b\x96\xd6\x8c\xf8\x1\x0\x9\x9\xa0\xc\xda\xed(\xca\x38" +"CV#_\x85mh\xa1\x19\xdd\xf1\xcb\x41o\xa9\x8\xc2}\xf5\xda\xe0\x93\xab\x5k(\xc6\xc0" +"A\xb2\x9e\xe5!\x87\x9eO08[\x9f\x8dj\xe7?\xf0j\x9\xae\xd4\xf3\x8d\xa9\x84\xfd\x1b" +"\x10<\xbf\x89\xdf\xfc\xba\xad\xfe\x1a\xf8\x35\xb7\xbb\x63\x7fj,\xe1\x1e\x14\xe5\x98" +"\x13\xfb\xc\xdf\xc9\xa3@\xea\xc6\x82\xd0~\x9b\x80wF\xc1\xe8k\xb5\xa6\x39 \xc8\xa4" +"Lni\xc8\x1d\xc3\xb5\x86:T;)|\xfd\x14WM4 \xf2]\xef\xe6\xe3\x86`\xd4\x15\xa8/\x1d\x1b" +"\xa2\xdd\x85\x9d\x0\xdc\x19\xc1\xf8;\x6\xfd\xa0\x44\xc9\xa3\xc4#\xd4\x37oD\r\n\xc2" +"6ON\xaf\x61$\xf2M*\xd6\x35\x2\x87\xee\xbe\x31\xc0)\x89Je\xbe\xc8\x9c\x36&7~\x13\x16" +"%\x1f\xd3\x19?\xcc$\xaaq\xf8\xc1\x94$c\x13\xd5\x65\x43\x0\x8e.\xe3\xe1\xecZ=\x87" +"\xbb\xa7p\xfa\xe7\x7fq\xb4Y\xffKo\xf2;\xd7\xaa\xe5\xe2r\x1f\xdd\xc4\x34\xa7\x14!" +"n\xfb\xeb\xe6\xefk\xb2\xde\xe8\x85=\x17\xf\xff\xc4\x64\xb9\x17\x14yi\xef\x83\x19" +">C\x1fTY\x1bN\xeb\x1a\xb0\xae\x42\x95\xaa\x9f,>\x94k;\xd5y\x88W\x8\x1f\xe\xf2\xf1" +"\xb5\xa8~\x1f&.\x2\x16\x4\x18\xd7\x18\xed!Zg{A\xef\xa3\x89-\x80\x89\xbb\x39\x94\xad" +"c\xd6(ki\xdfI\xc2\xd5\xc5\x43\xc8\x33\xbf\xc8\xf7\xbf\xb7\xb4\xdb\xc1\x38" +"\x9N\xc4T\xae?>\xac\xb0v6\x99\xd8\xfc\xb0\x1c\xe0\x0o\xfd\x3\xeb\x81N\xbb\xc2\x9c" +"\xb0\\\xf8\x9c\\l\xbc\x9d\xa1\x13\xb9Hc\x84\\\x36\x63yG\x9a\xbb\xe6\x97\x98>O\x14" +"F>\xe4+ j\xe7\xb7\xae\xb0\xf7\x9c\xfc\x91\xbdv\x2\x37m\x8ap\xe2\xa3\x9b\xccWd\xdc" +"\xeb\xa3\xd0H\xb7\xea\x6 \x80\xf3\x17\x6\xee\xf2\xf2\x18\xdf\x97\xf\x12<\x8e\x13" +"\xb1\xfe'b\xe8\x34\xbc\x96\x15V\xbf\x99\n\x44\xed\x98IO\x80,NK\x8b@\xf\xd1\x35\x7f" +"q\xad\xab\xe9/\x9\x11\x6\x9e\xfc\xbc\x13\x6\x9b\xe5\x17\x18\xb0\xbdH\x88V>>=}\xc9" +"\xf3\x41_\xf7\x16\x41\xb\xc0n%\xeb\x8fkX]\xf2\x10\x9a\xe2\xd8\xd9\xa9\x9ci\xc9q\xdd" +"\n\xc0\xaa\x31\xf2\x7f\xd0\x12\x8d\xec\x42\xd9\xc7\x64\x9a\xe9JIq\xc4\xcc\x0\x66" +"\x6\xa6\x93\xc1\xcb\xc8\xca\x61\\\x31+p\xd5\xdf\xdcx\x8a\x91\xb9\xae\x96_a\xf\xea" +"\xce\x99\x82\xb1\xaa+\xf7,B?\x6\x1e\xfb\x61\xffG\xebXH\x0i\xa1\xbc\x1\x42\x8a)\xf7" +"+?/\xd5\x8b\xba\n\xe2Wg_\x14\x63\xab\xff\x37\xae\xcdi\x18 \x2\xd4\x36\x34\x61VzG" +"o2\x9d\x10\x38\xb4\x11-1KuM\x95g\x15`\xff[\xaa\x66\xfe\x44\x4\xab\xbb\xb5\xfd\x97" +"\x6\xb1#jDG\xd0\xe2 \xe\x45hLc\x93u\xa1\xe\xcc\x37\x0\x8d^\x2w=\x8b?\x5\xcf\x86\xec" +"\x8aw\x9d&J4\x19\xee\xa6\x3\x13\n\x45\x85\x39%^E\xc4'p^$.\x1\xc0\x44[VuZ(Y\x8f\x8c" +"\xd5\x15\xcf\xda%\xdeH\xf4vx\xed\x32\xef\xa2\xe3\xbe#\xe8\x87y\xdd\x5\x33s\xe2\r" +"\x1c\xffV.x\x8\x5\xa8z\x12\xc3\x1b\xb1\xd9qK\x92\xe1\x80\xae K\x99\xa9y\x8f\x9\xc" +"\x81\xd9\x91\xd5\x65\x3\x99\xa1\x43\xb2\xb\xc4\x38l{\x9a\xef\xe2\x33\xec{\xd4\x8b" +"\r\xdc=&\xc9\x5gh&\xfb\x35*\x88\xe9\x81X ~p-2rj F*\x10t\xd0\x9b\x37\x82\x9c\xe\xdc" +"\xa1\xe4\x99U\xdd\x13\xab\x30\x45M\xea\xb2\xf6\\~<\xb4\xb5ni`\xbeS\xd6\x93\x7f~c" +"\xa0\x80\xdf\xde\xfe\xde\xce\xa0\xd8\x8e\xd6\xca\x8a\xb8\x4\x66\xe3\xf4\x65U\xbd" +"b\x8f\xfch\xc5^a\xe9\xd6\xd7\x89\x66\x30\xb4\xea@\x8a\xaa\x63\xf1\xca\x8\x41Iy\xdc" +"2\xa1\x99\xb3\x43\xae\x99g\xb2\xb3\x97\xdc\xc4}\xe3\xbe\xfc\xc\xb8\x85\xc1\xf8J\xac" +"\xfa^g\xf9$\xedr\xee\x17\xaa\x62\xa4\x83\x7fm+\x4y\x83\xc\x1f\xa4n\xac\xfe\xfdI\x5" +" \xa1\xc8\x89\x36\xfc|\xb9\xf2\x38g\x3\xf7\x12\xe4WY\xbf\x6\xb4\x3!\xe2\xd0#\xae" +"@\xe1.\xeI\x6\xc3\x87\xd8\xee\x95O\xe3\xc6\x35q\xdd\x9et\x11\xc\x6\xb3\xa5N\x19\x38" +"\xb5p5\xd7\xc6V\x8a?\xbd\xc5\xc9gb\xec\\\xa3x9K\xe9\x87\xbbkP)lJR\x89\x7f\x87-\xfe" +"\x8a\xb4\xd3\x84`h\xac\xc7W\xb6\x11\x9f\xdf\xb8\xd6\x8d\xaa#\x91rU\xfb\xcc\xc4mj" +"\xd6\xf\xc5\xcehj\xa1O\xa3\x8d\rk\x9c\xc6\x11\xe3\xe3\xf7\xe8q\xf2\xc4\x62\x46\x31" +"\xe6Pn\xcc\x8by\x4\xef\xbe\xb2\xdc\xf1\x81\x1c\x87\xf5\x12\xfbhS\x8d^\xc0\xdf\xea" +"J\xf4{(\xcb\xc4>+\xc4\xbc\xcc\x85\xe\xe9\xc0\xcb\x1b\x80\xc4\x99i\xf2w\x9bL\xf6\x64" +"\xef\xc7\xf8\x61\xbfs\xc2s\n\xc2\xeb d\xac$\xf/;\x86m\x14\xe3ml\xbd\xcb\x97\x3\xd3" +"3\x9d\xe0@D\xb5O\xd8UD\xa5\x8a\r)\x8e\xf\xbb}\xf\xa3\x5\x39\xd4^Fl9N(\xa4\xb3\xf1" +"\xadn\x16^\x16\xfe\x91\xf2J\xb6|\x9f\xed+p1\xa4\xf0\xd0/\xa8\xd8\xb4\xe3-\xa0\xc3" +"w<\x92;G\xe8\xd1oN\xc5v'\x8f\xee\x14\xf4\x0vXj\xa4\xab\x91\x81\x8d$E\xfdZ]\xf1\x84" +"\xfc\x30@%c\x83-|\xa7Ih\xe0\xf5}s\x98\x83\x1c\xc1\x9d\x91\x90\xc8\xe8\x65\x63n\\" +"\xfauz\x13\xac\x63?\xd8\xb7\xddo\x1a\x7f\x66>q\x12\x90\x31\x36\xf7\x85\xad\xd7\x12" +"!\xc2T\x19\x84\xb9\x8d\"\x15\x9c\xa2\x45| \xe0\xa0s\xeb\xe7\xf9\xb9yj\xf5 \xe8\xef\xba\xe6" +"\x98\xbb\x8b}\xb2\xe9\xc6U5GN\xeb\xa2W*\xf5\xadU\xf2J\x99\x65\x1a\xfa\rw]Z\"\x97" +"\xeb\x93\x83^\xc0l\xa9\xf7\xa8\x42\xf4\x15\x9c\x0?\xdf\xed\x37mv\x90\xf2\x5\x8c\x9" +"pm\nc\xa8u\xa4\x96\x94pg\xec\x4\xca)\xce\xb8\xb5\x62\xdfO(\x9fg\xb6\x1a\xa1\x16\x46" +"\xb2\x81\x14\x11\x19\xcf\x2X\x98Z\x9f\xcb-#pO\xbq!\xb9\x18\xc7\xe6\x92\x83\x4\xdd" +"\x8f`;\xa6o\xac\x82\xd2S\xd8%Rg\xc8\xf0\x1h\xea]\xc9\n\xe4\xc9t\xf9\xc0I\x8fj\xe9" +"u\xcc\x33\xd6}\x8c\x8c#\xe5\xa6 \xf4\xfd\x87\xfd%<|&@\x13\x9b\xad\xad\xd6\xd4\xde" +"\xe7\xfb\xf4\xc0\x8f\xa0\x96\x61\xa6.FO\xe6SR\xf5nx.\xce\xf0\x0\xf6k\xee\xc2\xd4" +"D5\x9\xc6\x92\x83\xbd(r>cEY7\xd8\x86\x9d\x44\x97\xcf\xd9\x9S\xf4\xd8\x96\xc7}A:\xe7" +"\xbn.\x8\x1f\xe1\x8eZ\x9b\xe1\xfbrmH\xc5\x1c/LIvUI\x19xK\xd5Y\xd6\xf1;\xa9\xff\xf3" +"BP\xda\xa5\xcb\x35\xfev\\\x88\x0[\xad'HTt?\xc7\x9c\x10#<\xf1M\xeb\xb\xe4\xe1.\x8b" +"\xe\xf6\x1c\xcd\x18\xc7\xebIu!lm\xf3\x9e\x82\xa6S\xdd\x13G5\xb4\x62.\x1e\xe3\x1d" +"\xeem\x80\x44\xc2<\x18\x80K\xa0\x94\xccl7\xea\x1c\xce\xb9%\x65,\x9\x13\x85)\x98\x10" +"\x8aJ\x1ck6\x15w\xe2\\\xc\xea\xa5s_\xc2\x61Ho\xb0\xeb\xa5-\x95\xcw\n\x4\xa2\r\x31" +"\xe3p\xc9\xb5\x8\x1r\xfb\x96\xfb\xb2\x3`\xc6+\xf8\x14(|'\xd6+\x15L\xcf\xd9\xae\xcf" +"\xc9\xfb\xbJ\xdbj\xca\xd0R\xc\xd4\xb6/\x10\x66Y\xc7/>\xac\x43\xb7\x11\xfc\xa5w^Y" +"\xea\x3\xd0/$!\xf9\x1b\x90\xaa+\xca\xcc\xee\x12\xa9\xe5\xfe\x32p\xb0\x1e,\x85\x8e" +"|-\xf\x10\xec\x39\xdd\xc2\xf5)1\x90\xb6\xd7\xb\xe3}\xad\xaeoK\xabl$8#\"\n\xcc\xfd" +".(\xcc\xb6Y/2V\x91\xf2\xd2\xf4\x84\x9c\x16\xd6s\x6\xda\x8d \x18\xb4\xa7;\xeaM7;\xca" +"\x12\x96\xd5%\xa5\xd1\x41%\x14\xe9\x5 =\xb8X\xbc=\xc6t\xb7\xf0W\xf1*\xf2\x99\n\xfe" +"M5\xd0\xce\xbf\x82};c\x14kA%\x7f_H\xc6\x33XZi\x12\\\xe5\xaf\xb2\x36\xd3T\x94\xf3" +"\xff\xef\xb0\xc2Q+H\x6\x37\xdf\x3\xce\x1fU\xec\x65\x39\x8f\xfb\x16\x30m\x16\"U\x88" +"\x98\x1f\x41\x6\xfe\xfbM5i\xf8[\x92\xdc\x90\x88x\xc8\xcd\xc\x87K=3\x9c\xb2\xa7{D" +"HA\x18\x9c|\x94`Zw\x19\xc7\xc1h\x9d\x17\xa8\x8a\x65\xdd~\xb4L#\xfb\xb2t\xfe\xd9Z" +"nDg\xd1~\x8ftK\x92\x96\x1b-\xbd{\xc7\x8a\x7T\xb5\xde=\n\x9bR\x13\xac\x90\xa1\xb\xf9\x1cV\x16\x94\xdd" +"\xfb\x80\xcd\x99\xb7\xff\xbf%\xd9\x9e\xde!\x82]\xdf:-\x8d \xc8\xa1\xe6\xbc\xc9\x93" +"\x14\x61>\x1b\xfd\xa2|\xc2\xfc\xa6\x96\x0\x9\xf8!\xd2\xe0\xa9\x86\x9b\xca,s\x93\xb1" +"\x91\x46\x9\xdanZ\xde\xd7\x1a\x8b\xf0\x87\xd8\x9d\xb8\xd6\xe0\x8{\x8T%\xf6W\xb9\x85" +"\xad\xcdt\x93]\xff-\xa1__\xf9\xdf\xa6\xaa\x8V\x1c\xe5\xdbw\x89\xa8\x87\x9a\xbe^}" +"\x4\xe9;z?+\xce\xe4\xd6Qx\x9b \xc1\xde\n\xb8\xa9\xd8\xb2_\xd5\x38\xf1KI\xe4]\xb8" +"g\x9\xc5\xfb]\x94?\xe2\xb3\xe6M\x9an\xfe\x42U\xe7\xf5=\xf4\xd7\x82:|\xa6\xf6\xb5" +"\xce\xac\xb5\x92\xe0]\xe7\x18\x8d\x8a\xc4\xd2&1\xdd\x9dKU\xd3\x30\x8cWsK9\xe0\xd3" +"\xbb\r\xe6\x39)\\\x87;MG\xf0\xcc\xf2\xecKi\x2/\x89\xa4\x87kp\x5\x8d\xb\xb\xf9\xfe" +"|\xcf\xc1\x11\xf6\xfe\x9b]\x9c\xaf\xe8\xec\x35\x8bw\xcb\xc8'\xc6\xf6\xb`\x15\x96" +",\x80\xb9\xc9\xbf( \xfak\xdb\xd6Z\xf5\xde;;\xab\xfal^\xc8\x1e\xcd\x84o\xae\x6s\xb0" +"\xenT*\xf4\x4\x96\x81\xd7\xb1\x85\xac;|\xc9U?\xfc\xfc\xa8\x37\xe5\xb1~\xf3\xe2&\x8f" +"\xe2\xd3\xc3\x8c@\x8c\x99tg\x91\x1e\xc5xR\x1V\x16\x1d\xb8\xa3Z+e\xa7%\x19\xdd\x94" +"\xb7\xab\xb8\xe7^L\x84\xdd\x63\xc7\x9c\xc0V\x1f\x9a+\xe6z\xef\x39R\x10R\xd7J\x94" +"\xf4G\xa9qu\xe1\x46\xd4=km4\xe1\xa4\xed\x94\x45\xa9\x99i\x9b:\x1f\xdd\x39\xbf\x99" +"\x82\x37\x65\xf7\x83\xf0.q 1$J\x9e\xd8\xf2#\x1ch\x91\x94q\xe0\xcb\x8!5\xe7X\xbd<" +"\xc1W\xbf\xf2\xc0Z\x7f\x66\x9d\xfa\xeaK\xeb\xcb\x0\xa0\x9e'\xae\x95x\xbe(\x91%\xe4" +"\xf9\x1\x61\xffq@\xff\xbc^\xab\x39\n\x9c\x44\xd1\xae%\xedHt\xcb\xc6\xd8}\xf7\x32" +" o\x15\xaeM\xc7\xc2M\x18]\xe7\x8e\x1c\xaa\xab\xfd\xf3j\x1a\xa9\xa6\xc6\x9\x38\x39" +"{\xef\xd3\xa1\xe #rV\x89\x81\x2\xdb\x46\xe1\xcax\xbb{j\xa0)8\x8a\xd0t\xe6\xaf\xe" +"\xf2V\xe8\x95\xc5\x1a\x1c\xb1G\xfa\x8d\x8e.\xc2\xbe\x15\xdbo\xba\xef\xcb\xef\x9f" +"}\xf0\x1e\xac\xa8\x96.-NZ\xfa\xc0\x36+[\x8b+\xa2\x99o\xcdoD\x1e%\xa6\xed\xb7\xb9" +"Xe'\x88\xf5\xab\xf\x32|\x91\xe2\x65\xcd\x1c\x9dQ\xc1\x1c\xdc\xcfz\xb5\x82\x8bN\x98" +"vn\x16\xaa\xeb\x41\xe8-2j\xed\xe2\x42{\xde\xcb\xfe\xfcu\xa4\r\x18\x35\x43\x93\xf1" +"\xe4\xb0\xe7[\xf5\xd7|e\x9%\xaf\x93\xffs}\x9d\xc3\xc\xf7OW\x0\xc3\x37\x66\xbas\x1c" +"\x8b\xc4\x8f(=\xe9\xad\"~\xb8\x8e'\x99\xc3H\x90\x14\xf8Qw\xc6\x99\x8b\xa7\xd6\x90" +"\x87\xd7\xa7\x19\xe5\xe1\xb8\x7'0\x1t\x10\x94\xb3\x34\xd1\xb\x1c\xe5\xd9\x1a\xb1" +"\xc7\x39\\\xc0\xd0\xa7\xe7Yr\xb\x1a\x8eU:\x9b~\xbaN:,\x9eO\xd3\x35\x66q\xbV\x9f\xdf" +"\xfbs\xf3\xbcV.\xe9\x83\xd1=\xa0\xb3\xea\xdb\xe1\x35\x16\xdb\xdd\xce\x18Y\xd1y\xb0" +"^c\x9f\xdd\xdb\x8\x0\xb]\xc3[\xb6\x8c<\x7\x9b\x16]m\xf2\xa2\xa1\xb7\x83\xf3\x6;\xa5" +"\x9a\x93\xfaQp\xee\xfa\xfa)\x17\x44Y\xb3@45\x1e\x3m\xf4\xaf'\x94\x32\x97\x33/\xdb" +"\x94\xa0\xd9n\x8[\xcd\x1a\x8f\x5\x88\x10\xe4\xe4\xf3\xc3S(\x14\x12\x3\xe7\x88\xd7" +"\x1eh%\xc0\x80\x9b$m\xa9H%\xd2\xc8\xfe\xf1\xa9\x95\x37\x13\xa1\x62\xd8!S\x9a}Zt\xb1" +"G!\x8c\x98}fN\xd4\xb6\xe1Xh{\xc4\xf\x1a\xbb\xe4\x88\xcc\xadl<\x93^V\xc0q/\xef\x63" +"\xc\xfe\x46\xe9\xb2\x39\xe8\xf1{\xa9\xe2\xe8\x80\xcf\x39\xb6\x11\x81\xc3\xb6\xc9" +"=f0\xcf\xe5xv\xc7\xed\x9f\x30\xcdL\xb1n\xfb\x8e\x90\xc5_\xe0\xf8Q[\xf7\x44*\xadu" +"T\x81\\K\xe0\xf6{V{\x1c*.\xed\xd2\xd3(\xae\x14R\x8e!\xe2S\xc1\x99{\xa9\x17\xea\x9b" +"b\x93\xf1\xbb\xdf\xfe\x99" +"A[\xc4#\xadh\xee,\xdc:\xda\xd8\x1e-*\x9\x18\xf7\x87\xeb}F\x9\x9f\x86h\xc0$\xee\x85" +"11\xd3rB\xce\x81}-I\xd7\xb1\x65\xb6\xfa\x1d$@C\x98\xb8\x84\x7\x64'\xaa\x42\x32]\x94" +"\xb2\x63\xd5N\x93\xc2\xf2\xc\xf0\xe1Q\xc8\x62\xb0\xc1\xad\x15\x8b\xb7\x7f\xde`P}" +"\xem\"\x14\xd8>\x91j\xb3\x84\xa4\xa0\xa9\xe7\x99\xc3\x39\x1Pr\x9d\x39P\x82\x2\x45" +"\xce\x9\x45\x63\xce\xa5\x8exl\xdcx \xea\xb1\x41pR\xdb\xe3\xbbh\x86\xef\xea\x84\x39" +"\x9f\xe7I\xab\x3\x9f\xa2\x91\xa0\xd0\xf0n~}\x1d\xacoU\x96+>s\xda\xed\x7\x63\xac\x30" +"\xe3\xdb\x80\xd6\x34\xa5{\xd5\xb3\xa4\x44\xb9\x4\x9b\xf6\x39\x33\x31\x41(v\\\xca" +"f\x94\x10h\x80\xce\xa6\x1fL\xb0\xb2\xc0\xed\x1d\x62\x80\x1e?ef\\\x11S]\xc6S\x1f\"" +"l#E\x5\x8b\x9a\xda'GL \x80}\xc2gK\xb0\x84|\xb\xe9!\"0\xd7\xad.\xe5\xe2o\xe9\xf7\x9a" +"\"R\xf2\x1b,7\x95\x17\xf3\xc4\xb7\xe7\x81\x35\xac#t\x7\xfb\xd4\x16\x41V\xc:\xd7`" +"D0\r\xda\x61\x84\x31'\xaf#1L\xec\x80\xe3\xc1\xaf\xaa@\xa2\xd0r!\xf7\x9f#\xce\xfe" +"\x83^]\x11>/W\r]\xbd\xf6&\x10\x0\x94\xb9|\xed}\x1d-\xa2\xcd\xef\xba\x16\x83\x9\xc9" +"\x1b\x0\x1\x4\xaaw\xfd\x1bM\xed\\`\x82?P\x84\xfa\xc7\x39\x2\x1e\xa1+H\xd6\x33\xc0" +"-\xea\xba\x42\x81~\x9a@\r\x1c\xc4_\x16[\x80\xb\xc3\x63\xfcHM\x87\xc5\xf4SW\xd0V\xec" +"F\x10\x7\x19X-\x1f\xb0\x95s&\xe2W-\x8e\x9d\x8c\x5\xb1\x17xYiw\x83\x80\xae\xb6i\xa7" +"\xfb\xf1\x81\xea\xc9\x39\xd1\x16wD\xa3\x8a\x1c(\xd7\x82\x86\xe7\xe7\x94\x95\xab\xba" +"\x8dS\xa3/V\x12\xbb{z1\n\x9d\xcf\x2\x13\x9\xcd\xc8\x92\xeg\xc6\x89\xf8I\x8d\x1c\xc" +"\xb3x\xec#q\xe9\xf1\xef\xc9\xe5v\x7f\xc7V\xc2\xbd\x95\xa3*\xd8U{?l\xb6\x85p\xed\x38" +"\xcer.x=0\xc1\xb8s3\xda\xc9\x83\x12#sJ\xbaS \x7\xb0\xca\xeb&\xca\xa5\xf8\xb5\x1d" +"\xb5\x39R\x10n\xbe\xb1-x\"\xdd\x34\x4\xe4\xc3g_\xce\xd9\x62\x8b\x1\xecoG\xc8\xc3" +"\xee\xc\xa1\xb9wA<\xb4\xc4$\xa1w\x7q\xf4\x9e\x30\x44>\xdb\xd9-2\xf2\x7f\xe5\x8c\xd1" +"\xe7%+\xa8\x9e.\x9f/\xa0\x1d\xe4\xfbT\xa0\x61<\x18\x87l\x8d\x9\xd5\xdb\x9d\x86\x92" +"\x81\x9f\xb2\xf9\xccZU\xbc\xf3\x32\xb7[\xdd\x6\xf7p\x1b\xb0 \xa8\xf9\x38\xa4\x64" +"g1v\x0\x90\xf0\xfe\xf9\x35\x8b\xeb\xf7\xa5\x8\xae\x8c!C.\x99\xb7\xf9\x9bX\xf9_\xc6" +"\xe3\xcf\xb7\x35p\x17\x99\x9e\xc2\xc8\xef\x81\xf6\xdc\xff\xbf\x30\xab\xbe\x42\xe1" +"\x9d|\xb4>\xb6@6\xbb\xd7R\xc8'M\xce=\xb6;\xef\xf0\x11\x14T\xbd&+\xc5\x90\x1a\xb2" +"3Eg\x96\xf2\xab\x8d-\xeb)/\x7\xb6\x7\xb4I\xf3!D\xa7\x86\xe5\xcf\x90\xf\xd4\x3ib\xba" +".^\xb\x39^)+\x8a\x9m^\xd4\xb7\xa4\x1dgz\x93\xbbw\xe0\x8b\x39\xbaw\xa4mFSh\xdeN\xbe" +"\xf8\x9e\x97\\\x81\xfc\xbe\xff\xd8\n\xc1\xe7\x1\xa4\x16\xe5\x66V*\xdc\x89\xcfi\x8c" +"a\xb8\xad\xbaz\x8d:\xb0|\x92\xe5x\x9eK'\xcd\xc7\xd2\xe8\xa5\xf0\xbe\xf7\x98i\xf\xf" +"\x9a\x45\x31&\x1d_\xdc%\xe7\x92\xa5[\xa2\xb7.\xc0\x9\x96\xb4\x0o;vlk\x89\x96\xf\xc4" +"\xc3\xd9\xe7\xf7\xf3\xa7}\xdb\xea\x36\xe5\x13\xdf\x8dWo\xec\x8bG\x3\x1c/\x90\x14" +"\xbf\xbbJ\xbd\x91\xd4\x66\xaa\x89\xfcR\x1eNa\xcd\xaep:\x19\xa0\x2\x1f\x33\xcc\x31" +"\x9b\xb7\x36\x34$;\x1c\xa4\x8d\x38\x3\xd0\xa3\xb0Z\x82\xbU\xfay\x80\x17\xbf\xf\xdd" +"\x13\x45\xb\xfc\xb2\xd6\x8b\x99\x9b\x92SJ\xaf\xc\x14(\xe\x1aT\xf4k]\xd0y\xdd\xae" +"\xc9w\x81\xf2\x86\xabx\x99\xa1\x2JF\x3\x3U\x5s\xd7\xa4\xb4}\xfc\x82(\xbb\x1e\x12" +"\xa8\x86\xe3\x31\xdb\xc6\x34\x7\xc1K\xab\x9a\xff\x81\xcb%\xcc\xc8'M8\xd7\x39!\xf3" +"\xa8\xd5\xa7\xf3\xaf\x38\x93\x65zg\xa5:*<0\x18_\x89\xba\x99*:?\xa8\x13Z\xb0u\xeb" +"\xc8\xb8\xcf\x34%\xceH\xf5\x42g\xfe[\x9d\x1a\x81T\x15w\x9a\x92\x8c\x8a\x7f\x7f\xc6" +"s=\xb4Z\xf1;\xa4Wb\xb1\xc\xe8\xd1\xb3\x36\x8f\xaf\xd4\xbb\x30\x1f\x95)iRLfo\x11\xb0" +"\x0\x90\xd1\xb8\xfd\xa5\xaa\xbc'\x8c\x38\xd9\xf4\x1c\x61\x62&\xac\x46t\x90y\xefV" +"g\xfa\xbf\x1f`D\x99j\x9X\xf4\x14\xea\xbd\xdc\x8b\xa9Pw\xb\xdc\x9c\xb6%\x9\xd9\xb" +"\r!n\x14>Q\xf8\xbf\x7\xc5\xca\x19\xb0\xb\x8e\\\x46\x31Vs\xf0\xd1\x11\xc0g\x5\x9c" +"\x87\x61\xad\xdb\x85\x36\xdd//e\x81\xae_\xc3\xda\xf2>\xd3h`qC\xb2\x9eX\xc9\xb8\x66" +"V\x12\x35=Y\xbb\x15R\xef\x1d\xdf\x11\xa5P\x8b\xc2\x1bm\xec\x1b\xcb\xd5\xae\xf8g\xa6" +"E\xf9\x80\xb5\x9a\x98\xfa\xbc\xc9`H\x8e[$\x3\xf9\x84+\x9!\x1c\xe1i\x19|\xe\x81\xc4" +">\xdbS\x91\x81W\xa1\xf7p\xb5\xf3\xe5?;\x8f\xb9\x8a\xdf\x63{\x94\x1b\xee\xb4\xc5\x96" +"\x0M\xf1\xba\x32\xa5\x11\xb7\x9a\xfd\xa8 \x8cS\xc0H\x5\x1d{\x81\x38\x91\xfcjv\x90" +"H\x2\xcb\x8e`\xe8\x87q-\xa9\xe0\xb9\xfV\xea\"\xd2\xf5\x99\x34IL\xe0T4C\x88T\x5\x18" +"\r\x86\x97\xe2/\xd4P\x86\xf5\x15\xfdm/\xfe\x87\x36.\xf7\xa7\xe5\xc\xc1z\xc4\x38\xc9" +"\x83J\x85\xc9\xf4\x82\xe2\x17_\xc0\x16H\xeai\xd3qv\xa0h\x2\x9c\xcfR\xa1\xb3\x94~" +"J\x96\xdb\x43\xd6\xaa\xf0r\x8b\xeb\xc2\x3\xb3\xb9he'Y\x5r\xc2\xe4^\xb\xea\x33\"Q" +"GW\xf8s\xa1\xb1\x8a\xf5\xb1\xf\xcb\x9c\xaf\x17\xa7\x45\x10\xdd\x62\xde(V!\x14\xc" +"\xcc\x9b\xa0\xe2\xd9%\xcc\x35&\x19\xef\xa5_\x1c\xc8~G\x98h&\x90\xd6\xee`\x86\x1\x31" +"\xd5&\x99\xaeHU[\xa8V\xb8NSp=\x0\x9c\xd2\x10G:\xfe\xcd?\x1a\x8fwe\xda\xf8\x8a=\x12" +"\xd6\xb8\xa2\x7f\xdb\xb8\xd1\xc6\xdbu\xd8kX\x8b\x1bg\xc2L\x89k*#\x9d\x65\x61\x39" +"\xbf\xc2\x9aO\xff\x8a\x1d\x8#twwU\xa7{G\xb1\x1c\x9a\xb1M\xad%\x33G\x7f\xd4\xe6\x9a" +"\xfb#\xc6\xfcg~><\xa3\xa9\xf4\xa0}Q\x89^:L\xcaWg\x9bG\x8c\xe7\x16\x8e\x8n\xa2\xf8" +"$\xd9+\x8b\x98~LW\xf8\xc4\"\x61{\xe2\x9c\x1d\xcd\xd0\xed\x8d\xc2\x1d\x9c\xc6\xf3" +"O\xd6\xd4\xcc\xfa\xde>;\xbf\xb4\xc\xe7-\xae\xb0\xb4K\x4\xa2\xee\x1fu\xa1J\xa0\x46" +"%\xb4\xf1\xdb\xe8\x61\xbd\x45}\x17O\xcb\x0s\xfa\x32'F\xa1\x9c\xbf\x1bH\x10\xccrB" +"\x6~D\xd5\xd1PCo\x91:d\xaf\xedG\x5\x36#\x99\x8cn\xb0U\xc2X\xab\x16I\x95\xfa\xa5\x17" +"\x80\x8a\x13\xf1t\xd5\x9e\xbf\x92;}\xb2\x0z:L\xed\x9dm\xcfNX\x85\x93\x8m\xfk&\x15" +"a\xe6\xdf\xfa\xcf\x61r\x91<\x8e\x13\x96\x92\xb\x62\xf1\xe0\x80\xc0U\x3\x87#\x84\xc1" +"\xf3\x64V3\x8d\x63\xf8M%\xed\xbcM\xb9\x88\x9f\xbf<\xb5Y\xef\xe2\xc4\xdb\xcdk4\xe5" +"\xd1\n\xb5\x91\xaa\x98\xbfU\x9b\xf3\x87\xb8\xaa\x39\xab\xd8:\r\xd0\xad\xac\x17\xe5" +"\xeX\xa7J\xbb\xf7\xfch\xb1qD\xc1\xa5g\x1e\x96\xf9\xc6;$\xc8w\xa8|\xa1\x94;\xd9\xf9" +"p-\x87\xea<\xfa\x64\x18\xceQ\xf0]\x9d\xc\xc6_\xb9\n\x1c\xbbL\x16\x83\x86\xac\xe8" +"c\xae\xc9\x46Q\xa9\xa7\xc5V\xf3\x62\xbu\nl\x92\x46S\xae\xb9u{\x94\x32\xb9\x9bN\x9f" +"^x\x97\xf1\x85riv\xd5\xce\x34\xff\xb5\xfa\xb6\x13\xc1~,\xd3\x30l\x1d\xda\xd4S1\xa8" +"y\xf3R\x14\x17W\x13\xab\xce\xa9\xf8uN\xe0$0u1\x5\x3j\x1b\xcf\xea\xecp\xb6\x18\x9c" +"\xd5\x46\xd3<\xc\x8dn\x94Y\x96z\xeWG\xe\x46\xc1\"t\xe8\x15\x9e\xad\x30\x83\xf4?b" +"\x88>\xe9\xb1\x97\xddY\xc5\xc\xa8\x83(\x1b\xb4\xfx\x83\x9fH\xbe\x35\x32\x66\r\xf4" +"\xa9\xd7\xf2]'\x2\xe4{\xe4\xe0\xde\x1b\x9a\xfet_\xdd\x97\xd5\"\xd9\x42z\xe0**r\xf1" +"\x7fx%>>9\xb4\xca\x39k%R\xbd\xc1\x88\x9a\xe4\xb2\xfajS\xb8\x33+\x99Ro\x8d\xc\xaa" +"\x88\xae\xd3(\x8a\xbd\x39\xf3Q\xb4\"\xfd(i\xe6\x66\xecSo#9\xa5\xd5 \xdf\x82\x85\xcb" +"\xb9w\x90[oe\xefYj|W\xd9j\xec;wP\xfb[\xe6W\x88\x1b,\xd0\xc7\xb1\x14\xc5\x9d`\xfe" +"rJ\xbe\x9b\xf2\x81\xf2n\xab\xf1\x3P\x10\xa3\xbb\x1\x8c\xf1\xe9\xc6\x33\x4\x82\x97" +"\xfbV\xb7\x1j\xd3\xeeQ\xf\xd0\x39\xedHE\xe2\xc5\x16\xba\xb4to\xf9\xe2\xc5\xfc\xdc" +"\xfa\xb3\x37g\x1b\xeer\xbf{\xd1\x95i\x1a\x65y\x5[\x19g\x12_\xc8\xc4\xceV_\xdc\x11" +"o\x80G\xff\x83*\x11-\xdc\x42P\xf5\xc8\xc3\x46\x4\x66\xc9\xf9\xe6\x15\x19\"\x33\xc1" +"\x9b!%\xa7\x30wtE\xc9\x9epXt\"Fz\xb1\xf4\xba\xea\xa2=\xdf\xf4\n\x94\x10\x94\\o\xcb" +"g\xa8\x62\xdf\x95\xe6\x66\x3\xf9\x45kW\x9dO\xc2\x8c\xab\xfd\xdf\xcemKy\x16.\x7\xb" +"{\xe6Rn5P\xfeL\xd2 F\\\x15\x34ZY\x9b\x93\xb6J=\xef\xf6\x8bn\xff\x9c\xac\xe8|\xd0" +"\x8c-\xb\x8b=\x95\x8c\x63\xb2\x13\x14>4\x9a\xef\x61\xc4\x9d\xe7N\xabI\xaf\xa0\xe2" +"\xd4\xdaZ\xe8\xa9\xe4\x36\xbf\x9b\x1f\x8c\xeaZ\xa3qc\x8fL\xb9\xdd\xd7\x32\xfd\x8e" +"\xa7\xf5\x8d\x45\xd8\xf8\xf8+\xf6\xca\x37L\xe9\xea\xa3\x93\xc1\x8e\x1c\xf4\xad]8" +"r1\x18\xf0\x89\xfe\xd4\x13\xc3GG{\xe2\x4\x31/D\x8d\x82\x1a[\x5\xa1\xb6\xef\xb6J\x9a" +"N\xb2\x34\xf0\xb3\xb4w\x85{`0\xdf\x0\x8a\x9b\xea\xc3Lq\xa1\x5\x89\x46\x17\x1a\xe9" +"\xaa\xdf\x2\xafJ\xb3W\x86\x8cI\xce\x83x\xc8X\x1d\xe7\xb7~Q\xab,H\xf0\x31\xb5q|\x8d" +"E\x9c\xf\xc3\xa4\xdb\xc6\xe3_~\x91`x\xbeLH\xda\xbe,\xb0\x0\x10|;\x84\x63\xb5k<\xe6" +"f\xef\x89K\x6\x15 \xd1\x88=\xe4v\xab\x15\x32\x41I\x4\xc2v QF\xe0;\xfG{\x9dmr#\x8a" +"\x16\xa6\x1b\x43\x43\xce\xd7S\x7f\xea\xfb\xed.eSx\x9t\xdb\xa8*\x10\x45\xa6\xcc\xf7" +"\r\xee\xdb\x94\xad\xc6\x44u\xe3\xe2\xd5\xe7\xe3\x97\x2>,\x91v\x1a*\x92\xff\x1\x9e" +"\xad\x83\xf4\x63\xd5\xec\x8d\xc9\xdb\xd5\xe6\x6\xe1\xf9\x93\x1fvA\x18\xc2#cK\xd4" +"\xe0O\x9c\x1c:|\x1a\x65\x43{\xf\xb9\xef\x1e~\xeb\xf3@\xca\xb5\x13\xe3N\xbb\xaa\r" +"\x90\x1a\xe3\xef\x7f\xa4\xef\xcc\xa3\xc\x35\n[G]!wu\x80\xfc\xa9$\xb4H\xb2h\xc8z/" +"l.\xca\x1\x9e\xc3\xfe\xf8\x5\xdb/\x5\xb0\xbb\xc6k\xae}\x9f\x46\x8c\x19\x32\x9e\xbb" +"P\x5?t\xf6t\x4\x15\xaf\xe4\x83w\xc8\x34U\x90 \x97\x1d\n\xdcl\xdfT\xf4\x34\xbc\xa3" +"\x11_\x2\xe\x91|\x15`\x95\xf3\x90\xf1\x90V\xba\x37\xa0\x1\x99X\xbb\xb7\xbb\x87t\x81" +"&\x94\xe5\x45W\xf0\xb4\xaa\x45\x9a\xfb\xbb\xa9\xf7\x42{\xb5{\xfdP\xeb\x85\xddTJ\xf0" +".WM6)\x5gX\xa3-\xcb\xc6\xd0n\xdfZ\xbc\x6\xef\x85\x87\xc9\xef\x90\x44\x38\xfa\xcb" +"\xbe\x18\x96\xe3&\xef\xbbvS\xaf\x2yS\xbcgD\xe4\xdc\x15\xad>@\xcc\x85\x1fP\x12`\x1e" +"w)r\x7f\x0\xe8T\xfb" +"\xc2\x5\xe5\xdd\xd1\xf5\x65\x2^\x87\xc8\x61\xeb\xedy\x86\xc7\xdc\xad\x30\x62\x1d" +"\x7u\n\x8ev\x96\x8a\xd3\xc8\xd4\n\xac\x4\x82\xac\x9e\xb2\xe6\x15\xf6\xb8\x8a\x13" +"\xd5\x8\x7f\xe3\x83\xb9\x94\xaf<\xab\x98\xef\x89\x98\xf0\x33\xa1\xe0\x8f\x5\"\xf4" +"\x83|%\xd4\xa3\xc3\xfa\xe-.\x7\x38\x9di\x7f\xe9\x65\xac\xc5\x91\xf\x80\xb2\x87H[*\x8c\x91" +"\xe1\xf9jJ\x8e\x80\x41\x63\x5\x46\x87\x80\x82\xc3\x92\xda\xa1\x1e\x6\x63\x83\xec" +"2u}\xcb\xc7\x9b\xe2\x82P\xac\xcd\x1a\x38\x1f?\xce\xa9\x5\xc8\x62\x9f\x1e\x81\x39r+\x8cs:\x94\xa4\x3\xd6" +"\xa1\xdb>\x1c\x85\xe9\xc7+Ev\xb7<\xc8\x85\x36h\x8f\x8e,u\xd7\x46\xc\xe1\xc9\x87>" +"c\xe7\x32\x87\xc2\x9c\xd1\xe4\xbdv\xaays\x9cM\xbc\xdc\xa3\xa9\xcezK\xefm\x9e\xc6" +"\xe\x61p\xcc!\xdb\xc4\xd9\xe3\xc1\x32\xad,\xfbS}\xf6`\xe1j\x0y\xbeT\x16\xc4,\"0\x4" +")\x83\xbe\xa5\x39\xe5\xe0\xd5#S\x3\rpF\x8cU\x9d\xd7\xe\x66\x9d\x8a\x36\x87\x35V\xf5" +"F\x93\x2\x11Vs\x9b\xd3\xe1O\xc9\xd9'\xc3\x80\xb8]\x12\xc2x[\x1c\x42)t\xf4\x8d\x91W" +"\x1e\r\xe0\x0\xc9\"\x93\xff\xecX+\xcf\x93>~S1M\xdf!\x19ye%\x88\xd1\xa2\xb3\x39\x2" +"\xf7\xe3\x80\n\xe5=\xcco\xf1\rx\x6\xa3\x95u\xf8\xec{{\xf5\x30'S\x0\x95\xbe\\\xdd" +"\x6\x9a\xcc\x8c\xf0\x16\xb1\xfe\xab\xc1\x7\x85\x7f\xf2UU\x8f\xba\x65\x1e\xb3\x0R" +"\x84G \xa4\x9?\xe1\xf7\xc4\xb6\x3\xbz\xa9\xd4\xe5\xb1\xf6_F\x1b:$\xb\xcf\x42\xb!" +"\x84\xf8\x94\x9b,\xe9\xb8}FU\xba\x8b.\x17\xe2\xc9\x95\x13\xd4UF\xe8\xc3v|]nw{X>H" +"\xc4\x92\xd1Z\x86\xca\x3\x36T\\S\x8\x94P\xe4\x89\x92 M\x85\x8e\x8f\x96\x89\x80\xf9" +"\xc7\x9b\xdd\x37=7\xf9\xd4\xff\x6\xab\n\xd0\xf3/\xe6IJO\xc0\xa2\x96\x17\xd4`\x8d" +"\xc2\x1a\x83\xe6\x8b~\xe3\xc9\xa7\x3K\xd0]\x83\xcf\xc2\xff\xed\x1fV\x1c\x95,M2\x8d" +"|\xd4\xc9\"t\x8fl\xea\x15\\\xc3\x1cnF\xdaw\x10\xbf\xdd\x87\x10\x34\x42\xe5\x91J\xfe" +"J\x91\xb2h-\xf4l\x8a \x8f\xc3\x33m}\x15]=p\x1M\xef\x6\xaa\xbaN\xda\xac\x1f\xe8\xeb" +"5\x8d\xfb!\xd3\xe8\xccR\x92\xf3\xd4K\x19\xb0\xda\x15\xb8n5\x80\x45\x88\xf5\xf3\xa0" +"\x1f\xed\x8em7\"\xde\xef\x91\x1a\xb2\xd5N\xe8\xb6\xc5,a\xf9\xf9\x8b\x34!\x16\xf9" +"\x80\xd4k\xc6\x8a\xa3$\x8a\x44`a\x90\xba\x94\xa5W\x84\xad\x90\x84pQ\x8a\xe9\x98V" +"#d\x83x-p\xc5\x7f\x8aO\x82\x8W\x1b\xa5\xdbZ\xab\x17=\x7k\xe7\xca\x13\xc4\x9\xcc\x45" +"dc\xd4\x4\xf3^<\xe6\xa9\x9a\xbb\x7\"\xa6v:\xbf\x34\xaf[\xa8\xea\x62\x86\xb4\xa0\x96" +"\xf2\x15\x15\xec\x1d\x9f\xc6\xe4\xab\x1fk:\xd2\x9a\x9c\xfb\x33\x3*s\xb0\x9fQ\xb2" +"E_\x1e\x8b\x9b\x2\x9bg\x1a\x19\x93\x42\x63\xd1\x11\x65\x83\xab\xd3'R\xca\x9d'6\x84" +"\xcblF\xf4\xb2\x10z\xcf\x9a\x8cvd\xb8\xd3\xdb\x8cx\xb\x0 Kf\xd2\x1f_\xc6\xcdG\xfa" +"\x84/M\x81\xf9\x4\xae$P1\x96\xa2\xe\xce[\xfa\xa7\x17\x19\x93m\ntH\x1b\xb;X\x85\x96" +"\x8f\x32\x97\x93s\xc4\x30\xf2\xb7\xf9\x99<\xebr\xaa\xfe\x6Q\x2W\x91%\x1a(\x82\xf4" +"\xb1\x43<\xe0\xa6\xd1tz\xa3\x14\xc8\xb3[y.\xe4(\xd0\x62Z9\xc7\xb\xe6oy\xd6\xb9v\xe0" +"\x1f\xc5\xd3\x86x\x8a:\xca\x7f\xd9\xa9\x34J\xa5\x66\xe7\x96\xcb\x64\x41NV\xb1\x85" +"\xe4\xb9o\xd7\x97\x45\x8b\xb1\xd5Z\xf4'r\xa9\xd8\xf7\x9a\xc8\x37\xb3\x38j\xbf\x10" +"H\xb6\xbYT\xcaz\xadP\xb9)\x9f\x38XXJ\xf3\x91U\xbb\xb0\x1b\xf0\x8c\x10\xbbVg\xe4\xe1" +"E\x7f\x14V4g\xac\xbh\xf1\x8\x8e\x8d\xf8\x66\xdd\x12\xa3\xd4\x97\xfd\xd1\x33=8U~{" +"\xa3\x93\x93\xb\xf3^\xc9'\xd4L\x8e_\x12$O\xb1R\r\xbbT\xd4Mr~\x94\x97\x2\xeb\xe5\x39\xf0}\x85\xd0=\x18\x85\xd0" +"\x1f\x9fh\xf4x\xbb\xbf\x65%v\x1c\x91\x35Ua5\x81.\x4\xf8Q\x88Na<,\xc6\\\x41\x63z\xa0" +"\xfd\xed\xeen\x9c,\x14\x15\xba\xd4+z\xc6\xc4(\xf8\xa4\x81\xf6\x9a\xd1\x82\x8\xc9" +"\xb6G\xb1\x61\xee\x39r\xd6_\xbc[l\x12\xb6tw{85\xb1\x46\xc3O\xba?\x12]\xbf$\x91\x1" +"\xc7;\x1d\xf4\xa1\xef\x86\xec\x9f\x9d\xe1\xc2\x9ey0\xb2\x1b\x17\x9bi\x1d\xfc\xbd" +"\x81\n\x97\xf1\xde\x18\xc0\xa6\xd8\x9f\x7f\xad\x8c\x12\xfa\x9b\xf0\xe3\xc7\x37\x39" +"#bGY\xefR\x97\x9U\xc8<\xb1Y\r|X\xa5\x41\xed\x61\x7f\xbf\x41\x96\xe7\xfd\x32\x6\x39" +"\xfd\x9c{mB\xd0\xc5qvm\x18,\xd8#B7\x7f\xclR\xeev\x0\xc8\xb1\x8b\x92S\x96\xc2!\x1a" +"C'\xb6\"\x38\xfa\xb5)\xe0\xce\xd2\x2\x8f\xbc\x41\xa4\xb2p,\\)i\x13<),\xf1\xda\xf9" +"YL\xf1\x91\x36\x12\xb6\xfb\xef\x7f\x9b)R]\x9c>\xcaS\x82{\xbf\xda\xb6Q\xf3\xebN\x1d" +"\x1c^\xcf\xa2\xd9\xd9\x7\x61\xdf\xf9YP\xfbJ\xf6\xfd.\xf6\xe1\x92\x3\x45J\x7\xb1\x37" +"8\xec\x8a\x61m%\xe4\x42w\x11\xc,\x80\x7fhH\x15\x8b:\xb1H\xc5\x33\xd8v\xa4oB4\xbc" +"\xfc\x5\x45\xd7\x64\x8ep\xcd\xad\x35\x83\x0|\xfc\xdfj\xc\xfX\xc9\x8b&I%\x86\x96^" +"\x7f\x46\xbf\xd9\x30\x42q\x1\x15\xd2\x92\xf1ZW\xde\x91\x9\xc\x9cn\x16\xb8\x46Xi\xe8" +"\x96\x4Q\xaah\xb5\x8\x33+\xa2!wT\x8c]\x15\xbc\xa2g\xdf\x9\xe9\x18|\x83\x8a\xa3\x96" +"\xacoy\xee\xcb\xb0\xf0G:k@\xc\x98\x84\xda\xaejq\xa8\xb2\xf5Wz\xbfX\x8a\x9d\x31\x38" +"\x9c\xb6w\x4\xd6\xf\xff)Op\xea(x\x91\x30\xbc\xab\xc3\x89\xe6\xcd\xb7R\x0\xfc\xc1" +"\x9c\x81\xcb\x8c-\xe0;\x99M\x8b\x1bU0\x83\xca\x45\xed\xb7\xb6\xd4\x63\x66\x1eO\xb8" +"\x9d(\xb5\x12\x1f\x81H\xe8\x33\xb4\xad;\xe4\x87\x12\xbe\xfd\xee]\xbap\xf7\xa4\xf6" +"C0a\x8c\xbf\x89P\xe5~\xd0g\xe9@\x16J \x10Q\xf5!1\x4=h\xb\xe4\x7f~\\\x13\x12\xa6&" +"Y\x4\xbcQ\xee\xa1\x9d\xdb\x96@\xe8 J\xf0\xd2\xb9\x8f\x15\x2\x1duP\x1d\xe9\xe5\x90" +"\xf0\x64\xf9,\x15]\xc2\xa0\xf6\xaa\xf3\xae\xe9\x1e \xbc\x5\xb9\x41\x34\x44\x36\xd0" +"\x1f\xaa\xf5\xc4~\xa3\xa4\x84\xbf\xb6xS\xe2\xc0_+e&/\xa3\x6\xa8\xb1\x12\x8b\x1e\xb9" +"YQ\xb3v^\x8a\x9f\xd3\x6\x1cJ2\xcn6\xe9\xb5=0\xf9n\xa4k\xbau\xab\x86x\xd4\xc;X\xd8" +"\x0\xbf\xec |\xd0)\xfb\xc\x30\xca\x9c\x91r\xf3\x30\xf7\x63\x1b\x94\xc5\xd3\x41\x9" +"\x7fuY#\x9c\x9\xa5\x96-9EPeF\xc`,u#\xcd\xaei|\xfb\x1a~`l\x98ut]\x83\x7{>\x1d\xd7" +"\xcc\x3\x9yun\xc1;V\x11\xa6,\x16\xd3\xee\x32s\xfc/;\x1bG'\xfcs-vo\x82\xf3\xa4\x8a" +"~\xf9\x16\xc\xa8\"\x93\xb9\xb5\x10\x8f\xed\x88\xe2>\xfer0\xd8\xf7\xbe\xa9\x6\xdd" +"+\x1f\xdew\xa0\xbb\xad\x95\x90\r\xb4\xa1Ov8\xdd\x17\x7f\x91\xe7\x85k\x90jW\xdf\x88" +"\"\x19\xae\x12\xc7\xa1\x99P\xed\xdb\xa7\xcf\xce\x11\xd4\xa1\xd5\xc\x89Wd\xf0\x0\x1a" +"n\xc5T \xbb\xbf\xfd\x97\xd4\xfb\x86\x43\xa5T\xff\xb5taA\xe4\x36\x99\x1c\xe5\x7+k" +"\xa6 '\xf2\xd1\x89\x11\xb\xee\xf7\x83W$)\xe3\xfd\xa6\x86\x44\xbc\xa3'\xef\xe9\xcb" +"\xbb\xe8\xf9^\xfb\x36\x88\x94\xf4\x19\x97\x41\xda\x9\xb3\xaf\x8d\xffsQI\xb2\xa2\xa5" +"\xff \xcbP\x96\x96M\xe5\x86\xf7\x46x\x8a\x39\xe0Vt0\x17\xfb\xf4\xa4NB\x11U\xf0\x0" +"\xb5=\x9a\xe3t\r\xa4\x5\x95;'\xb\x15Pe)\xb0\x93T\xd5\xff)\x93\xb2q\xca\x82\xeb\xdf" +"=\xcb\xa1\x98\xd7/Q\x9c\x5\xe2\xe2 \xae\x63\xc2\"k\x1c(\xe0\xa2\x37V/\xcf\\\x36U" +"k\xd9\x39G3\x96r\xa4\x18R\x8d\xfd\xf9`\x19\xfb(\"\xaeM\x85\x43\xb\x62W\xab`\xdf\x45" +"\xd1\r\x62+\xd6\x37\xa0\xbc\x8a\x93\n\x9aQ/.\x14\xb7\x1cn\xba\xee\xe6\x9bM\xa4?\x8e" +"\xea\x32t\xb0\x9` \x9f&y\x9fz\xedVw\x83\xbfl\xb4\x7\xce\x80\xf5W\xda\x13\x12n\x1a" +"=\xfe\xe4\xe1\xea\x9x[\xf8\xe7\xf0\xc6\x96\x42\xa7\x90\xc\xd9\xcd#P\xb0\xff$\x17" +"\xfd\x8c#\xac\x90iK\xbe\xeb\x87\xab\xbf\xe1\x41%gK\x8\xfc\"\xb1Z{eP\xe9\xce\x91\xfb" +"\x5G\xde\x31&D2O\x84\xbf\x4`\x8d\xfb\x1e\x9b\xfc\xdb\x65\x45\xb9G\x8a\x84%\x91s2" +"C\xcd\xa4iVpK\x86\xe6N6\xbd/\xa5\\\x39\xc5\xbdI\x92h\xa4s\xa7W{\xa1\x8f\xfc\xd2\x95" +"\xb2\x19u\x89\x81\xac\x91\xa6\x38\xa3\xf6\xe4\xf6\xbf))?-\x6\x1a\xd4\xb4G\xca\xf5" +"\x12[\x11\x1d\x13\x8c\xac\xc7x\xb0\x91\x64`B?8\xb3\x30\xd3\xa1\xbbZ_wxi\x1cO\x1c" +"\xdd\x43\xda<\x11Mw\xd1~\xaa\x35\xbd}\x13\xdb\x10\xc\xb5\x63w}\xd4J\x9e\x5\xbe\x9" +"\xe9\x32\x34\x8b\xd9[p\xc\x1a\x5\x96|\x8e\xf2Z\"\xcd\x8b`Vt\x7f\xc9'SYX\x1bH\"\x80" +"\xed\xa3\x14\x1d-\x98\x43\xba\xc3\xcc\x61pfn\x97\xadj\x12\x42\x1f\xaa\xbN'\xe2\x61" +"\xd4V&\xbb)6m7\x19T-\xdd%\x43\xe7\x3,\x99\xe4\xf6\xe8\xe2\x8cV\xe7\xdf\x19`\xcc!" +"\xbb\xe1\xac\xee~?\x2\xc7P\xad&\xecuY\x1\x82\xe7\xebh\x80\x61\xef\xa1\xbd\x41{\x97" +">\x9b\xd9\x9d\x90mB\xd3\"\xb5V\xea\xba&\x8a\x46!\xbe\x8b\xe4\x1b\x17\x8b\x31|\xd2" +"z\xfe\x64\xaa\xa7\x98\x36$z\xb9\x3\x61\xad\xe3\xad\x80\x37\xa3.d\x94\xc8\x39vMx\x7" +"\x1q\xb0\x94O\xca?\x1a\x8c\xee\xa7\xa0\x83z\r\xd1\xea\xd1\xb\xccZ\x88\xef)\xf6\xda" +"\xb2\x8f\x9bzr\x10\xa2O5\x15\xc8\x9d\xa4\x41\x64{\xf4\x19\xc7\x90\x87\xe9\xb6\x16" +"S\xa8\x83\x89\xd3\xbd\xd0\x42\xd3\x46\x42\xda{\x9b$\xf5K\xdd\xf5Q\xd5\xf5\xb8\xc0" +"\xb6\x63\xc3\x9f\xe\xf1\xdb\xca\x91]5h\x89\xf4\x38\xfc\xeW\xdd~\x9aK\x85\xd9q\x8b" +"2\xe8| jr\x15!\x15\x86\xf9\x12\x62\xc1\xe0\x31\x8\xae\x9f\x9as\x19\x2\xcf\xa4{\xc6" +"3\xd4w\xe\xd9\xff\xde\x8a\xff'\xb6\x39\x7\x84V\xfb\x84\xc7\xc2\xdc\xb2r\xc0\\\xf4" +"\xe0]\x83\x87`7\xf2\xb1\x42{\xcW\x1d\x9e\xf0J\r\xb6\xa6\x97\x89w\xad\x0`\xd9\xd2" +"\x8a\x45\xeah=\xf1S6\xd0zx:\xb5z\xf4_\xbf\x93\xfe\xed\xa3\x9c)M\x12\x7f\x31\xd8M" +"\x13&\xe9\x3\x42\xfc\xb4-\xa2\xe8\xf5\xc9Y\xcf>\x94\xc9\xab\xa2\xfd\x9e\x7f\x83\x8f" +"\x92}\x15\xb4os\x0&|\xea@\xad\x8b\xcd$\x1c`\x88@sUK\xd0\x8b\xc1\x45\x10g\x97\x9b" +"\xca\xa9.&\xd0\r\"\xedu\r\x12\xa6\xe2\x9R\x85\xfd\x5\x9d\xacR\xc1\x80<\xa3\xfa+\xdf" +"\xc9\x9a\x9e\xca\xe6\x85\x9fJ\x8f\x62\xb3]mb<\x80\x1b" +"qiP\xf9\x31NR\xbe\x4U\xd5*\xe9m*\x11\xae;\xb\x1a}\xc\xf8?\xa8R\x18X\xa5\xd3\xc3\x38" +"I\x8en\x9d\xd8\xea\x17\xa7!\xf3\x36\xd0zI\xd9\x9b\xa1\xfc\xe8\x61\xb8\xaf\xe2Y\x9f" +"\xee\x93r/\xb5\x65\xe7\xab-\xe1\xc8\x87\xd9X9``9B\xdf\x37w5\xc4\"\xd7 \x1bm\xba\xe3" +"\xd5\x30\xd2#R\xf8Yq\xacH\xa2\r\xb2\xcf\x37Qh\xbe\\^\x98\xa4O)\x97\xa5\x92\xc5\xbb" +"\x81\xbf\xf3\x9?\xa1\x15\xbdR\x9fo\xd0\x8f*\xc1Y\x8d\x2\xfc\xb0\n\xed>T\xd0\x34l" +"\x8b\x10\x8cUK\xe8\xa8\xac\xb5\xfd\x84/\xc9\x9b|\x8e\x38\xa3;zI\x2T\xc5P*\xb9y{p" +"\x9cjn\xcq\x99\xc6\x13\xa8i-&\xa8^\xd2=\x90\x45\xb4\x97!\xbe\xba\x11\xf5\xeb\xbc" +"\x8f\xd7\xe0&\xec\x1c\x90\xee\x15\xb1>\xf2W\xbb\xc5@ \xa5\xe9\x7f<\xfb\x12\xfe\xd9" +"`\x90\x8d\xa6\xcf\xed\xf5pAC\xce\x7\x83\x97\x39\xbc T\xd6\x82\\\x31\xc7P;P\xb1\xfc" +"\x16\xbc\x83\xd9\x99l\xd0\x95\x88\x6\xb5\xfe\xa4U\xbe\x64\x6\x66\xc6\xf5 PppE\xd2@\xe7\xf6\x63\xd8\x3J\xf0\xe5\xf0\x33" +"\xc3\x1\xe\xde\x82'\xb1\x3\x90\xf5Z\n\xc7\x16\xe0\x41\xaf=\xfa\xe0W\x93\x9c\x2\xf6" +"\x8cw\xc0\xe6\xb2\x9fQ\x85y\xfd\x2\x1f~dbo%~\xae\xe7\nn.3;\xda\xd8\xf8\x17\xb9J9Q\x1f\xf" +"\x11\x0U[+x;\xc4\x1c\xc1V\xf0\x31\xc2\x17\xf0\xec\x65\xdf\xa9\xca\x1f\xb3\\\x66%" +"5\xa6\x7\xcb\xe3t\xa6\x81&\xb0w\xa6\x11\x38\x13;\x9cx\xaeU\x89\x8fK\xa5\x37\x81Y" +"\xaa]\xd6\x9Wqt\x8e\xe\xcb\xc7\x90:\x1et\xd5\x30\xd5\x1aS\xfe\x38\x66m\x1f\x9\x99" +"\xc0\xa2\x84Q\xdb\xa7z\x1c-<4q\xa6'\x4\xcb\r\x9a\xc5\x1a\xfd\xa3\xcg\x9\xab\x41y" +"'\x96Ys\xcc\x80lC\x93\x1b.m\xc3}w\r\xae\x94 ;\xf8\x8a\xfa\x8e\xea\xcb\x13 t\xcd\x11" +"[U\x9a\xf3\xb\xc2\x8fr\xc1\xcdL\xbc\xd0\x4\x0x`\xff\xd5\x87\xe5\xdd\n<7\x96\x87\xce" +"\x1a\xed\x32\xc3,\xb8\xe0\xf\xac\xcd\x9f\x93\xe2\x8d\xca\x95t^\xe7\xb1\x4\x2\x14" +"\xc8\x41M\xf2\xe8M-\xc4\xd8\"\xd5\xdc\x45\x91\x85\xf0\\\x9b`\x9a\xa7qM\xe4\x8\xee" +"n\xea\xf7=;I\xb6\x9d\xb8=\x8e`\xd8\xc9\x90\x44\x84\x6\xdf\xea(\xc5p'}\xe4\x8b\x1d" +"\xb3\x15.;V\x13M\x12\x66\xa9\xd3\xfb\x95\xccm7\x7f\x9\xa1\x7fN\xb6\x8c\x42\x93\x82" +"\xc\x1e\xb6/\x8bV'\x91;t\xf6\x10\x97\x92\x84\x0`\xc9\xd4\xd6\xf2T\x93\xfb\xea_\xb1" +"\xd2g\xbf\xf0\x43\xbb\xd3\x91\xfb%VH$Z!\xda\x38\xb4\xaa\xbc\"p\xd8\xb\xd8~\xe5\x1f" +"\xc8-\x8b%\xef-\xc\xde`tR\xca\xab\x95o\xa3\x11\xf2\xe3HK\x95\x36\x9d?\xf7\xf8{\x8b" +"V&\x15U\xdc\xd5\xddK\x91\x33\xcdt\"\xc2\xbe\xa9\xc\xe8\x8e;q\xcc[\xa3\x80\xe3qS9" +"\x1d\x9fx4\x16\xfe\xfbo\x3K\xccz\xe2\xa2\xc6+$#P+pY\xd0\xd0\xf1L0\x5\xc\x7\x0\xe7" +"~\xaf\x14\xba\xd6Z\xb8|!\xac\xcb\xc9\xca\xe3\xf0\xc1:\xa3$\xe3\x83\x36|ZE\xe3}P\x85" +";\x97\xb6l\x89\xe5+g\x13|f-3/\x8\xe1Tb\x15J\x8a\x7\xd0\x1f\xed\x1c\x41\x86\x66\x95" +"\x8e\xccR\xd6?)\xfd\xb4\xd1~c0\x98gTG\xfa\x96\xf7\x35.\xf4\x9bj\x1c\x88\xd0\xb2\x13" +"\xca+\xb2\xe\x1aj\x87\xc9\xda\x43\xca\x66\x9a,|\x9a\x3\xee\xe8\xc3\xfb\x66\x8d\xed" +"\x19\xcc\x92\xdc\xf6x\x93\x88/\x1\n\xc1\x15\x9f\x43\xf6\xfb\x17\xc1\x9a\x17\xee\xa0" +"%F\xb3v\x93\xca\xdf\xa3\xad\xf5\xae\xec\xd2\xe0\xf7J\xa7q\xbe\xba\x83\xd4\x18\xc1" +"\x8c$\xe1\xa6\x8\xc8\x31w\x5\xe9\xa4\x38\xcf\xc8,\xc0\xf0\x8f]\x6P\xf9\xc4\x96\x33" +"n\x15\xe8\xee<\x0@\xfc*z\x80I\xdbI[\x9b\xe1\xd1\xb6\xfc\x1d\xc4wdrl\x85\x1al\x8c" +".\xf0\xc5N\xe9oZ\xf3G@\x14\xdc\xfd\xb7\x1f\xa1\x9b\xc\xf6\x18\xf7@\xe\x87)\x1cZ\x1" +"\x8e\x6;\xce\xee]\xbckZ\n<\x9c\x98\xa6l`\xfe[\x86Z\x1cR\xbb\xc2\xdcL\xbb\x33(\x86" +"Q^\x10{M\x9e\x31\x10|\xd3n\xe1\xc9=\xe8\x1\xf9\x96\x42\xbS\xe\xff\xe1\xe1/\xa6\x90" +"U\xe4\xce\x8b\x39\xd9\xc3~\x97x9&z\x17\xb2\xeb\x18\xd0\xb2\xb3\x94$\xe9\xf7^\x82m\x18\xaa\xbf\x90\xfc\xde%\x18jhO\xc1\x91\xe0\xbf\xfc\xe7" +"\xd8<\xdb\xcd\x9e\xd0\x5\xae\x85\xe\xa0\x1Z1\xc3\x8f\xdd\xc5Y8N\xe8\x8e\xb6\xd8\x35" +"i=\xa9\xa5\x46\x6\xf6\xb4\x61\x4J2\x8e\xa7\x1b\x4\x98\xc6H<\x90\xf5v\x8bv\xaf\x8" +"\x3\xe7q\x5>R\xf2\x8cH\x8f\x11@6M\x9c\x8e\x8a~\x4*\x19Wj,wI\xf8$\x11\x13N\xaf\x1" +"Z\x93M\x3\x46\xb7\x6<\x97\x8a\xd6~\xab\x45\xfc\xd5\x1d\x41p\xd1\x5\x10Jo\xb8\xd3" +"\xf1\x64\x30:!\xeb#N\xe8\x9e\xfc\xa5\xee\x41P\xa8\xd0\x81\x43p\xdd\x82\x64\x8di\xbe" +"'\x98\xb=\xe1\x43%G\xf\x84-\xfb\x43\x1a&l\x17k~\xb\xdc_>\xb9\xe\x90\x94O\xed?\x8" +"\x8e\xfb\xe3\xc7R\xb1\x1c\x9a#\xed\x9b\xd8:\xb8N\xdf\x9a\x84\x33\x0\x45Qp>\xcNg$" +"o\xde\x38\xaaz\x13Hy\x9f\xd3u\xfb\xf8\xe4S\x1\x45\xd8\xb\xa7\x81\x3X\xfb\xa3\x12" +"7!9\x98\x8b\xda\xd9lv\xf5\r\x32\xa6V\xbf\xb9\x36\xc2\x0\xc0\xce\x33\xff\xde\x8d\x97" +"x\xf1vP\x89\xca\x14y\xe1\xa9\xf4\xdaws\x14\xaa\xc9\xbd\xd8\xfe\x38l\x80 E|l\x1\x13" +"&\x9d\xa3\xdd@\xe4\xef\x95\\H\xf8_-\xba\x0\xd5\x8c\xfc\x32\x37\x9d \xd7\x63It\x8d" +"\xc9\xaf\xdc\xcf\x83\x9c&\xc7\x9e\x85:\xc\x15\x12\xd0\xa4\n\xa1]\x6\x46\xbb\x99\xa5" +"\xbd\xcd\xc9\x39\xc6\x62\xf0\xed\x7\x88_/\xc4\xd7\x15\xfb\xdd\x92\xc1\xf3\xa9m\xf" +"\xc0\x41\x7\xc5P\xa0\x17\x18\xd7\x10M\x14\xfeX\x84\x30\xf3\x83\xbb\x9a\xf5\xa2\xb1" +"\x80\x35]S\xf5\xfb`!_\x8a\xa2?\x9fp0\xfe\xd7\x2\x18\x34\x44\xfb\x38\x30\x4\xc9\xfa" +"\xcdp~\xc1\x17\x36\xfb\xda\xc2\x95\xe4\x8d\xd8|\xf7\xd6TK\xd2*\x81\x97\n_A\xf6\x1b" +"4M\xe0\xf0\x1e\\\x1at-\x5\x62\x12\x10\xefMPL\xb3Iw_M\xcY\xba\xcb$\x1b\xdb)\xacKC" +"\r\xe0\xcd\x61s\xfe\x17\x1bJi{\x6$\xe1h\xd0))(\xaa\xdcx\x97\xc4\xd4\ni\x84;\xf\x30" +"\x1b)b\xf1~\x12\x80 \rm\x8\x66\xd2J[\x7\x93\x41\xf7\x62\xaf\xa4\x2}?\xc7\xee.\x1c" +"9\x5\xbe\x93Q\xab\xc4\x8a|\x1\x14\xa3\x41\xa4\xed]\x97\xcb\xcb\xbe\x62\x9\xa0\xe4" +"\xb2\x8c\xdd\x45\xa1\x18\x8d\x7\xfj]\x83mq\x1e\x5\xcdrH\x99\x6\xf9\xc3\xb8\xd6\xcf" +"\xb6\xb3\x31\x18\xe8\x16\x17\xef^;X\x87\xbSNX\xd6\x35\x1e\x31\xd3\x96(\xb1\xe8\x9c" +"\xf2n\xf3z_\xc9\x65[!a>\x92\xd2\x1d\xd1\xcb\x33\xfa\xb2\xbb:\x98\x89\xc0\xd3\x13" +"\xbbt\xc2\x2\x1b\xa4^YU\x14\xcdn\xe2=K@\xf5\xccU[\x1b\x4\xb4\x88\xf7\xb5\x1o\x8\x63" +"nc=\x82\xe1\x91\x98\xd3\xa8\xdc\xf9\xe0\xd0g\xc\xa2\xf1`'\x5\xb8\x34\xe9\xb0\x39" +"\xe2\x92u\xf0\x61\x35\xb5u\xb3_\xdc\x63\xccp\xd9H\xf8\xc6>R\x5Y\x7\x8f[\xf6\x8b," +"C\n\xe1R\x11\x42\xea\x99\x8a\x42\xd3\x63\xde\x64:\x1f\xa1/\xeb\xb3\x81\xab\xbbZ\xfc" +"\x1d\xcb\xe2\x87\x63$e\xcb\xcf\x32l\xa2\xf:it\x16\x41\xa7\xc4\xfe\x89Pu\xa2\x9b}" +"sr\xd8\xd0\xfb|\x84\x99('\xce\x3\xd8\xa7\x89\x4\xeb-Y\x86\xb5\xbdHo\xb\xbd\x31Y\xa0" +"\xdb\xc3\xb3H\x86\x14\"\x1a\x85\x3\\\xcd\n\xfe\xe3\x9V\xc2\x64\x18\xe3\xe4\x9aqo" +"\xaa\x46\xd6\x8e\x32\x39\x8f\xce\x1a\xeb\x2\x3\xc\xc\xb6\x8e\xeek\x1b(\xae\xdcT_" +"^\x95\x8)\x86\xd3?\xecl\x8d\xa8t\xc4hN\x97\xc3\xd7\xd2+Gd\x92\xae\x14\xbd\xaa\xf2" +"W\x92\r\xec\xfc\x9f\xa8\x11T\xb3\x80\x95\xc2_\xa3\xc4\x96\xcd\x7f\xa1\x13.\xeb\xc" +"t\xa5lc\xd1\x83\xa9@\xd6k5g\xa9tw{jf\xc9\x10\x4\nR\xe5\x36P\xa4\x11\x32\xe1\xe7\xec" +"\x5\xa8+f\xd8\xab\xba\xb8N-\xd4N\xa2\xe3\xc0\xd7\xb3}\x86\xe1s\xd6^I\xf4\xa1\xf6" +"\x9f\xf1u\xa0mc\x3\x8e\xb0\xb3\x84z\xe\xec\x63vy\x5\xc3\x8b\xf0L\x10!\x8fQ\x9\x99" +"/4{$\x17\x9bn\xb1I\x1K\xb6\xe8\xe6\xbb\xdb\x10:*%\xff\x95\xb5\xf2\xb4O\x8b\xb6U\xf1" +"L\x80\x33\x1b\xcd\xb1W\xfw\xd0\xf4\xf8n\xeO/\xb\xfa\xefl6\xec\x19;\x18l\xf8\x9f\x66" +"VTi}\x9b\xcb\xd4\xe6\xa6\xc2z\xcc>\xe7\xb9\xb2u\xba\x9c\xbd\xa5\xe8\xe5\x90\x17@" +"\x96%\xb8\xc7\xbah\xaf.\xab\x63\xcc)\xc4\xce\x12\x10\xaa\x93\x9\xa3\x64_I\x1b\x45" +"\\%\xc1,\xdakb\xafG.\x8f\xc4\x9f\x45\xf\xcf\xe0\xcd\xf3&\x1d\xc7\x93\x61\xb7\x83" +"\xc0\x30sz?\xd3\x64\x44@Q\xd3\x89WU\xea\x9\x92\x1f\x5V\x8d\x9bpH\xf8\xc5\xb8\r\xed" +"ye2\xe3\x66\x30\xc6\x1b\x98\xdf\xaa`r\xd7\xa0\xf6\x83\x18\xb6@g\x14q\xd3K\x8\xff" +"\xdd\xac\xed\xd5_\xbd\x31\n\r\xaf\xc\x1b.\xda\xa0\xe$\xc9)\x86\xaf\xb\x14\xba'h)" +"\xb5$\xd1\x41\xf6\xfc\xcf\xff|\xac\xaa-\xfc\xcf,\x1a\xbb\x94\x66+\xcfW!\xfa\xff\xca" +"\xa3\xafxn\xc2<\xe1\x36\xe5\xc9\xf3R\xfd\x1d\x1d\x30\x93\xc1\x8a\x80\x1\x14\x2\x0" +"\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" +"00000000000000000000000000000000000000000000\r0000000000000000000000000000000000" +"000000000000000000000000000000\r000000000000000000000000000000000000000000000000" +"0000000000000000\r00000000000000000000000000000000000000000000000000000000000000" +"00\r0000000000000000000000000000000000000000000000000000000000000000\r0000000000" +"000000000000000000000000000000000000000000000000000000\r000000000000000000000000" +"0000000000000000000000000000000000000000\r00000000000000000000000000000000000000" +"00000000000000000000000000\rcleartomark\n\x80\x3" +; +int n021003l_afm_len = 31943; +char* n021003l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusRomNo9L-Reg" +"u\nFullName Nimbus Roman No9 L Regular\nFamilyName Nimbus Roman No9 L\nWeight Re" +"gular\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThi" +"ckness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Devel" +"opment\nEncodingScheme AdobeStandardEncoding\nFontBBox -168 -281 1000 924\nCapHe" +"ight 662\nXHeight 450\nDescender -217\nAscender 683\nStartCharMetrics 316\nC 32 " +"; WX 250 ; N space ; B 125 0 125 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 -9 237 67" +"6 ;\nC 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;\nC 35 ; WX 500 ; N numbersi" +"gn ; B 5 0 496 662 ;\nC 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;\nC 37 ; WX 8" +"33 ; N percent ; B 61 -13 772 676 ;\nC 38 ; WX 778 ; N ampersand ; B 42 -13 750 " +"676 ;\nC 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;\nC 40 ; WX 333 ; N pare" +"nleft ; B 48 -177 304 676 ;\nC 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;\n" +"C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;\nC 43 ; WX 564 ; N plus ; B 30 0" +" 534 506 ;\nC 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;\nC 45 ; WX 333 ; N hyp" +"hen ; B 39 194 285 257 ;\nC 46 ; WX 250 ; N period ; B 70 -11 181 100 ;\nC 47 ; " +"WX 278 ; N slash ; B -9 -14 287 676 ;\nC 48 ; WX 500 ; N zero ; B 24 -14 476 676" +" ;\nC 49 ; WX 500 ; N one ; B 111 0 394 676 ;\nC 50 ; WX 500 ; N two ; B 30 0 47" +"5 676 ;\nC 51 ; WX 500 ; N three ; B 43 -14 432 676 ;\nC 52 ; WX 500 ; N four ; " +"B 12 0 472 676 ;\nC 53 ; WX 500 ; N five ; B 32 -14 438 688 ;\nC 54 ; WX 500 ; N" +" six ; B 34 -14 468 684 ;\nC 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;\nC 56 ; W" +"X 500 ; N eight ; B 56 -14 445 676 ;\nC 57 ; WX 500 ; N nine ; B 30 -22 459 676 " +";\nC 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;\nC 59 ; WX 278 ; N semicolon ; B" +" 80 -141 219 459 ;\nC 60 ; WX 564 ; N less ; B 28 -10 536 516 ;\nC 61 ; WX 564 ;" +" N equal ; B 30 120 534 386 ;\nC 62 ; WX 564 ; N greater ; B 28 -10 536 516 ;\nC" +" 63 ; WX 444 ; N question ; B 68 -8 414 676 ;\nC 64 ; WX 921 ; N at ; B 116 -14 " +"809 676 ;\nC 65 ; WX 722 ; N A ; B 15 0 706 674 ;\nC 66 ; WX 667 ; N B ; B 17 0 " +"593 662 ;\nC 67 ; WX 667 ; N C ; B 28 -14 633 676 ;\nC 68 ; WX 722 ; N D ; B 16 " +"0 685 662 ;\nC 69 ; WX 611 ; N E ; B 12 0 597 662 ;\nC 70 ; WX 556 ; N F ; B 12 " +"0 546 662 ;\nC 71 ; WX 722 ; N G ; B 32 -14 709 676 ;\nC 72 ; WX 722 ; N H ; B 1" +"9 0 702 662 ;\nC 73 ; WX 333 ; N I ; B 18 0 315 662 ;\nC 74 ; WX 389 ; N J ; B 1" +"0 -14 370 662 ;\nC 75 ; WX 722 ; N K ; B 34 0 723 662 ;\nC 76 ; WX 611 ; N L ; B" +" 12 0 598 662 ;\nC 77 ; WX 889 ; N M ; B 12 0 863 662 ;\nC 78 ; WX 722 ; N N ; B" +" 12 -11 707 662 ;\nC 79 ; WX 722 ; N O ; B 34 -14 688 676 ;\nC 80 ; WX 556 ; N P" +" ; B 16 0 542 662 ;\nC 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;\nC 82 ; WX 667 ; " +"N R ; B 17 0 659 662 ;\nC 83 ; WX 556 ; N S ; B 42 -14 491 676 ;\nC 84 ; WX 611 " +"; N T ; B 17 0 593 662 ;\nC 85 ; WX 722 ; N U ; B 14 -14 705 662 ;\nC 86 ; WX 72" +"2 ; N V ; B 16 -11 697 662 ;\nC 87 ; WX 944 ; N W ; B 5 -11 932 662 ;\nC 88 ; WX" +" 722 ; N X ; B 10 0 704 662 ;\nC 89 ; WX 722 ; N Y ; B 22 0 703 662 ;\nC 90 ; WX" +" 611 ; N Z ; B 9 0 597 662 ;\nC 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 " +";\nC 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;\nC 93 ; WX 333 ; N bracketri" +"ght ; B 34 -156 245 662 ;\nC 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;\nC" +" 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; " +"B 115 433 254 676 ;\nC 97 ; WX 444 ; N a ; B 37 -10 442 460 ;\nC 98 ; WX 500 ; N" +" b ; B 3 -10 468 683 ;\nC 99 ; WX 444 ; N c ; B 25 -10 412 460 ;\nC 100 ; WX 500" +" ; N d ; B 27 -10 491 683 ;\nC 101 ; WX 444 ; N e ; B 25 -10 424 460 ;\nC 102 ; " +"WX 333 ; N f ; B 20 0 383 683 ;\nC 103 ; WX 500 ; N g ; B 28 -218 470 460 ;\nC 1" +"04 ; WX 500 ; N h ; B 9 0 487 683 ;\nC 105 ; WX 278 ; N i ; B 16 0 253 683 ;\nC " +"106 ; WX 278 ; N j ; B -70 -218 194 683 ;\nC 107 ; WX 500 ; N k ; B 7 0 505 683 " +";\nC 108 ; WX 278 ; N l ; B 19 0 257 683 ;\nC 109 ; WX 778 ; N m ; B 16 0 775 46" +"0 ;\nC 110 ; WX 500 ; N n ; B 16 0 485 460 ;\nC 111 ; WX 500 ; N o ; B 29 -10 47" +"0 460 ;\nC 112 ; WX 500 ; N p ; B 5 -217 470 460 ;\nC 113 ; WX 500 ; N q ; B 24 " +"-217 488 461 ;\nC 114 ; WX 333 ; N r ; B 5 0 335 460 ;\nC 115 ; WX 389 ; N s ; B" +" 51 -10 348 459 ;\nC 116 ; WX 278 ; N t ; B 13 -10 279 579 ;\nC 117 ; WX 500 ; N" +" u ; B 9 -10 479 450 ;\nC 118 ; WX 500 ; N v ; B 19 -14 477 450 ;\nC 119 ; WX 72" +"2 ; N w ; B 21 -14 694 450 ;\nC 120 ; WX 500 ; N x ; B 17 0 479 450 ;\nC 121 ; W" +"X 500 ; N y ; B 14 -218 475 450 ;\nC 122 ; WX 444 ; N z ; B 27 0 418 450 ;\nC 12" +"3 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;\nC 124 ; WX 200 ; N bar ; B 67 -" +"14 133 676 ;\nC 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;\nC 126 ; WX 5" +"41 ; N asciitilde ; B 40 186 502 320 ;\nC 161 ; WX 333 ; N exclamdown ; B 97 -21" +"8 204 469 ;\nC 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;\nC 163 ; WX 500 ; N s" +"terling ; B 12 -8 490 676 ;\nC 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;\n" +"C 165 ; WX 500 ; N yen ; B -53 0 512 662 ;\nC 166 ; WX 500 ; N florin ; B 7 -189" +" 490 676 ;\nC 167 ; WX 500 ; N section ; B 70 -148 426 676 ;\nC 168 ; WX 500 ; N" +" currency ; B -22 58 522 602 ;\nC 169 ; WX 180 ; N quotesingle ; B 48 431 133 67" +"6 ;\nC 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;\nC 171 ; WX 500 ; N gu" +"illemotleft ; B 42 33 456 416 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 " +"416 ;\nC 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;\nC 174 ; WX 556 ; N" +" fi ; B 31 0 521 683 ;\nC 175 ; WX 556 ; N fl ; B 32 0 521 683 ;\nC 177 ; WX 500" +" ; N endash ; B 0 201 500 250 ;\nC 178 ; WX 500 ; N dagger ; B 59 -149 443 676 ;" +"\nC 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;\nC 180 ; WX 250 ; N periodc" +"entered ; B 70 199 181 310 ;\nC 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 " +";\nC 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;\nC 184 ; WX 333 ; N quotesingl" +"base ; B 79 -141 218 102 ;\nC 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 " +";\nC 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;\nC 187 ; WX 500 ; N gui" +"llemotright ; B 44 33 458 416 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 10" +"0 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;\nC 191 ; WX 444 ; N que" +"stiondown ; B 30 -218 376 468 ;\nC 193 ; WX 333 ; N grave ; B 19 507 242 678 ;\n" +"C 194 ; WX 333 ; N acute ; B 93 507 317 678 ;\nC 195 ; WX 333 ; N circumflex ; B" +" 11 507 322 674 ;\nC 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;\nC 197 ; WX 333 " +"; N macron ; B 11 547 322 601 ;\nC 198 ; WX 333 ; N breve ; B 26 507 307 664 ;\n" +"C 199 ; WX 333 ; N dotaccent ; B 118 523 217 622 ;\nC 200 ; WX 333 ; N dieresis " +"; B 18 523 316 622 ;\nC 202 ; WX 333 ; N ring ; B 67 512 266 711 ;\nC 203 ; WX 3" +"33 ; N cedilla ; B 52 -215 261 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -3 507 3" +"77 678 ;\nC 206 ; WX 333 ; N ogonek ; B 64 -165 249 0 ;\nC 207 ; WX 333 ; N caro" +"n ; B 11 507 322 674 ;\nC 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;\nC 225 ;" +" WX 889 ; N AE ; B 0 0 863 662 ;\nC 227 ; WX 276 ; N ordfeminine ; B 4 394 270 6" +"76 ;\nC 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;\nC 233 ; WX 722 ; N Oslash ; " +"B 34 -80 688 734 ;\nC 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;\nC 235 ; WX 310 ; " +"N ordmasculine ; B 6 394 304 676 ;\nC 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;\n" +"C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;\nC 248 ; WX 278 ; N lslash ; B 19" +" 0 259 683 ;\nC 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;\nC 250 ; WX 722 ; " +"N oe ; B 30 -10 690 460 ;\nC 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;\nC " +"-1 ; WX 722 ; N Udieresis ; B 14 -14 705 834 ;\nC -1 ; WX 722 ; N Uacute ; B 14 " +"-14 705 890 ;\nC -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;\nC -1 ; WX 611 ;" +" N Tcaron ; B 17 0 593 886 ;\nC -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;\nC -" +"1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;\nC -1 ; WX 667 ; N Racute ; B 17 0 659 " +"890 ;\nC -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;\nC -1 ; WX 722 ; N Otilde ;" +" B 34 -14 688 850 ;\nC -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;\nC -1 ; W" +"X 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; " +"B 14 -14 705 890 ;\nC -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;\nC -1 ; WX 722 ;" +" N Eth ; B 16 0 685 662 ;\nC -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;\nC -1 ; W" +"X 611 ; N Zacute ; B 9 0 597 890 ;\nC -1 ; WX 722 ; N Uring ; B 14 -14 705 923 ;" +"\nC -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;\nC -1 ; WX 444 ; N eogonek ; B " +"25 -165 424 460 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -10 424 622 ;\nC -1 ; WX " +"444 ; N ecaron ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890" +" ;\nC -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;\nC -1 ; WX 444 ; N eacute ; B 25 " +"-10 424 678 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -10 424 622 ;\nC -1 ; WX 600 ;" +" N dcaron ; B 27 -10 599 683 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;" +"\nC -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;\nC -1 ; WX 444 ; N cacute ; B 25" +" -10 412 678 ;\nC -1 ; WX 444 ; N aogonek ; B 37 -165 444 460 ;\nC -1 ; WX 444 ;" +" N aring ; B 37 -10 442 721 ;\nC -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;\nC " +"-1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;\nC -1 ; WX 444 ; N egrave ; B 25 -10" +" 424 678 ;\nC -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;\nC -1 ; WX 444 ; N aac" +"ute ; B 37 -10 442 678 ;\nC -1 ; WX 444 ; N adieresis ; B 37 -10 442 622 ;\nC -1" +" ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;\nC -1 ; WX 500 ; N ugrave ; B 9 -10 " +"479 678 ;\nC -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;\nC -1 ; WX 500 ; N udier" +"esis ; B 9 -10 479 622 ;\nC -1 ; WX 278 ; N tcaron ; B 13 -10 300 676 ;\nC -1 ; " +"WX 389 ; N scommaaccent ; B 51 -281 348 459 ;\nC -1 ; WX 611 ; N Zcaron ; B 9 0 " +"597 886 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N" +" Ucircumflex ; B 14 -14 705 886 ;\nC -1 ; WX 444 ; N acircumflex ; B 37 -10 442 " +"674 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 834 ;\nC -1 ; WX 389 ; N scaron " +"; B 39 -10 350 674 ;\nC -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;\nC -1 ; WX 38" +"9 ; N sacute ; B 51 -10 365 678 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 17 -281 59" +"3 662 ;\nC -1 ; WX 722 ; N Ydieresis ; B 22 0 703 834 ;\nC -1 ; WX 500 ; N thorn" +" ; B 5 -217 470 683 ;\nC -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;\nC -1 ; WX 7" +"22 ; N Ograve ; B 34 -14 688 890 ;\nC -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 " +";\nC -1 ; WX 722 ; N Odieresis ; B 34 -14 688 834 ;\nC -1 ; WX 722 ; N Ntilde ; " +"B 12 -11 707 850 ;\nC -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;\nC -1 ; WX 722" +" ; N Nacute ; B 12 -11 707 890 ;\nC -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;\nC" +" -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;\nC -1 ; WX 333 ; N Idotaccent ; B 18 " +"0 315 834 ;\nC -1 ; WX 333 ; N racute ; B 5 0 335 678 ;\nC -1 ; WX 333 ; N Icirc" +"umflex ; B 11 0 322 886 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 470 678 ;\n" +"C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;\nC -1 ; WX 500 ; N Euro ; B -16 -1" +"4 477 674 ;\nC -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;\nC -1 ; WX 300 ;" +" N onesuperior ; B 57 270 248 676 ;\nC -1 ; WX 300 ; N twosuperior ; B 1 270 296" +" 676 ;\nC -1 ; WX 300 ; N threesuperior ; B 14 262 291 676 ;\nC -1 ; WX 333 ; N " +"Igrave ; B 18 0 315 890 ;\nC -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;\nC -1 ; W" +"X 333 ; N Imacron ; B 11 0 322 813 ;\nC -1 ; WX 333 ; N Iogonek ; B 18 -165 397 " +"662 ;\nC -1 ; WX 333 ; N Idieresis ; B 18 0 316 834 ;\nC -1 ; WX 722 ; N Gbreve " +"; B 32 -14 709 876 ;\nC -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;\nC -1 ; WX " +"722 ; N Kcommaaccent ; B 34 -281 723 662 ;\nC -1 ; WX 500 ; N ograve ; B 29 -10 " +"470 678 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 42 -281 491 676 ;\nC -1 ; WX 611 ;" +" N Eogonek ; B 12 -165 611 662 ;\nC -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;\n" +"C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 834 ;\nC -1 ; WX 278 ; N iogonek ; B 1" +"6 -165 278 683 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 736 ;\nC -1 ; W" +"X 500 ; N odieresis ; B 29 -10 470 622 ;\nC -1 ; WX 500 ; N ntilde ; B 16 0 485 " +"638 ;\nC -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;\nC -1 ; WX 611 ; N Ecaron ; B" +" 12 0 597 886 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;\nC -1 ; WX 389" +" ; N scedilla ; B 51 -215 348 459 ;\nC -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;\n" +"C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;\nC -1 ; WX 611 ; N Eacute ; B 12 0 5" +"97 890 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 32 -281 709 676 ;\nC -1 ; WX 667 ; " +"N Rcommaaccent ; B 17 -281 659 662 ;\nC -1 ; WX 611 ; N Edieresis ; B 12 0 597 8" +"34 ;\nC -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;\nC -1 ; WX 500 ; N uogonek ; B" +" 9 -165 500 450 ;\nC -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;\nC -1 ; WX 722 " +"; N Dcaron ; B 16 0 685 886 ;\nC -1 ; WX 348 ; N lcaron ; B 19 0 348 683 ;\nC -1" +" ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;\nC -1 ; WX 667 ; N Cacute ; B 28 -14 6" +"33 890 ;\nC -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;\nC -1 ; WX 400 ; N de" +"gree ; B 57 390 343 676 ;\nC -1 ; WX 722 ; N Aogonek ; B 15 -165 786 674 ;\nC -1" +" ; WX 564 ; N minus ; B 30 220 534 286 ;\nC -1 ; WX 564 ; N multiply ; B 38 8 52" +"7 497 ;\nC -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;\nC -1 ; WX 722 ; N Aring " +"; B 15 0 706 915 ;\nC -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;\nC -1 ; WX " +"333 ; N rcommaaccent ; B 5 -281 335 460 ;\nC -1 ; WX 278 ; N lacute ; B 19 0 290" +" 890 ;\nC -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;\nC -1 ; WX 722 ; N Atilde" +" ; B 15 0 706 850 ;\nC -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;\nC -1 ; W" +"X 278 ; N igrave ; B -8 0 253 678 ;\nC -1 ; WX 500 ; N ncommaaccent ; B 16 -281 " +"485 460 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 19 -281 257 683 ;\nC -1 ; WX 564 ;" +" N plusminus ; B 30 0 534 568 ;\nC -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;\n" +"C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;\nC -1 ; WX 750 ; N threequarte" +"rs ; B 15 -14 718 676 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;\nC -1 ; WX " +"722 ; N Abreve ; B 15 0 706 876 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 7 -281 505" +" 683 ;\nC -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;\nC -1 ; WX 278 ; N imacro" +"n ; B -16 0 292 601 ;\nC -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;\nC -1 ; WX" +" 444 ; N amacron ; B 37 -10 442 601 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 13 -28" +"1 279 579 ;\nC -1 ; WX 500 ; N ydieresis ; B 14 -218 475 622 ;\nC -1 ; WX 444 ; " +"N zdotaccent ; B 27 0 418 622 ;\nC -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;\nC " +"-1 ; WX 444 ; N zacute ; B 27 0 418 678 ;\nC -1 ; WX 500 ; N yacute ; B 14 -218 " +"475 678 ;\nC -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 479 678 ;\nC -1 ; WX 500 ; " +"N eth ; B 29 -10 471 686 ;\nC -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;\nC -1 ; " +"WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;\nC -1 ; WX 333 ; N commaaccent ; B 9" +"7 -281 236 -38 ;\nC -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;\nC -1 ; WX 76" +"0 ; N registered ; B 38 -14 722 676 ;\nC -1 ; WX 722 ; N Acircumflex ; B 15 0 70" +"6 886 ;\nC -1 ; WX 278 ; N idieresis ; B 11 0 269 622 ;\nC -1 ; WX 494 ; N lozen" +"ge ; B 18 0 466 740 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 564 " +"; N notequal ; B 30 -3 534 509 ;\nC -1 ; WX 549 ; N radical ; B -2 -65 526 924 ;" +"\nC -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;\nC -1 ; WX 722 ; N Aacute ; B 15 0" +" 706 890 ;\nC -1 ; WX 564 ; N lessequal ; B 28 0 536 628 ;\nC -1 ; WX 564 ; N gr" +"eaterequal ; B 28 0 536 628 ;\nC -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;" +"\nC -1 ; WX 713 ; N summation ; B 14 -123 695 752 ;\nC -1 ; WX 494 ; N partialdi" +"ff ; B 26 -10 462 753 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 12 -281 707 662 ;\nC" +" -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;\nC -1 ; WX 200 ; N brokenbar ; B 67" +" -14 133 676 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 12 -281 598 662 ;\nC -1 ; WX " +"722 ; N Adieresis ; B 15 0 706 834 ;\nC -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;" +"\nC -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ;\nEndCharMetrics\nStartKernData\nSt" +"artKernPairs 998\nKPX A C -51\nKPX A Ccedilla -57\nKPX A G -57\nKPX A O -60\nKPX" +" A Odieresis -60\nKPX A Q -60\nKPX A T -54\nKPX A U -62\nKPX A Uacute -62\nKPX A" +" Ucircumflex -62\nKPX A Udieresis -62\nKPX A Ugrave -62\nKPX A V -131\nKPX A W -" +"113\nKPX A Y -81\nKPX A a -6\nKPX A b -20\nKPX A c -29\nKPX A ccedilla -29\nKPX " +"A comma -3\nKPX A d -28\nKPX A e -27\nKPX A g -20\nKPX A guillemotleft -64\nKPX " +"A guilsinglleft -74\nKPX A hyphen -23\nKPX A o -40\nKPX A period -10\nKPX A q -2" +"1\nKPX A quotedblright -91\nKPX A quoteright -116\nKPX A t -20\nKPX A u -28\nKPX" +" A v -81\nKPX A w -73\nKPX A y -83\nKPX Aacute C -51\nKPX Aacute G -57\nKPX Aacu" +"te O -60\nKPX Aacute Q -60\nKPX Aacute T -54\nKPX Aacute U -62\nKPX Aacute V -13" +"1\nKPX Aacute W -113\nKPX Aacute Y -81\nKPX Aacute a -6\nKPX Aacute b -20\nKPX A" +"acute c -29\nKPX Aacute comma -3\nKPX Aacute d -28\nKPX Aacute e -27\nKPX Aacute" +" g -20\nKPX Aacute guillemotleft -64\nKPX Aacute guilsinglleft -74\nKPX Aacute h" +"yphen -23\nKPX Aacute o -40\nKPX Aacute period -10\nKPX Aacute q -21\nKPX Aacute" +" quoteright -116\nKPX Aacute t -20\nKPX Aacute u -28\nKPX Aacute v -81\nKPX Aacu" +"te w -73\nKPX Aacute y -83\nKPX Acircumflex C -51\nKPX Acircumflex G -57\nKPX Ac" +"ircumflex O -60\nKPX Acircumflex Q -60\nKPX Acircumflex T -54\nKPX Acircumflex U" +" -62\nKPX Acircumflex V -131\nKPX Acircumflex W -113\nKPX Acircumflex Y -81\nKPX" +" Acircumflex comma -3\nKPX Acircumflex period -10\nKPX Adieresis C -51\nKPX Adie" +"resis G -57\nKPX Adieresis O -60\nKPX Adieresis Q -60\nKPX Adieresis T -54\nKPX " +"Adieresis U -62\nKPX Adieresis V -131\nKPX Adieresis W -113\nKPX Adieresis Y -81" +"\nKPX Adieresis a -6\nKPX Adieresis b -20\nKPX Adieresis c -29\nKPX Adieresis co" +"mma -3\nKPX Adieresis d -28\nKPX Adieresis g -20\nKPX Adieresis guillemotleft -6" +"4\nKPX Adieresis guilsinglleft -74\nKPX Adieresis hyphen -23\nKPX Adieresis o -4" +"0\nKPX Adieresis period -10\nKPX Adieresis q -21\nKPX Adieresis quotedblright -9" +"1\nKPX Adieresis quoteright -116\nKPX Adieresis t -20\nKPX Adieresis u -28\nKPX " +"Adieresis v -81\nKPX Adieresis w -73\nKPX Adieresis y -83\nKPX Agrave C -51\nKPX" +" Agrave G -57\nKPX Agrave O -60\nKPX Agrave Q -60\nKPX Agrave T -54\nKPX Agrave " +"U -62\nKPX Agrave V -131\nKPX Agrave W -113\nKPX Agrave Y -81\nKPX Agrave comma " +"-3\nKPX Agrave period -10\nKPX Aring C -51\nKPX Aring G -57\nKPX Aring O -60\nKP" +"X Aring Q -60\nKPX Aring T -54\nKPX Aring U -62\nKPX Aring V -131\nKPX Aring W -" +"113\nKPX Aring Y -81\nKPX Aring a -6\nKPX Aring b -20\nKPX Aring c -29\nKPX Arin" +"g comma -3\nKPX Aring d -28\nKPX Aring e -27\nKPX Aring g -20\nKPX Aring guillem" +"otleft -64\nKPX Aring guilsinglleft -74\nKPX Aring hyphen -23\nKPX Aring o -40\n" +"KPX Aring period -10\nKPX Aring q -21\nKPX Aring quotedblright -91\nKPX Aring qu" +"oteright -116\nKPX Aring t -20\nKPX Aring u -28\nKPX Aring v -81\nKPX Aring w -7" +"3\nKPX Aring y -83\nKPX Atilde C -51\nKPX Atilde G -57\nKPX Atilde O -60\nKPX At" +"ilde Q -60\nKPX Atilde T -54\nKPX Atilde U -62\nKPX Atilde V -131\nKPX Atilde W " +"-113\nKPX Atilde Y -81\nKPX Atilde comma -3\nKPX Atilde period -10\nKPX B A -51\n" +"KPX B AE -44\nKPX B Aacute -51\nKPX B Acircumflex -51\nKPX B Adieresis -51\nKPX " +"B Aring -51\nKPX B Atilde -51\nKPX B O -24\nKPX B OE -18\nKPX B Oacute -24\nKPX " +"B Ocircumflex -24\nKPX B Odieresis -24\nKPX B Ograve -24\nKPX B Oslash -23\nKPX " +"B V -65\nKPX B W -59\nKPX B Y -68\nKPX C A -23\nKPX C AE -15\nKPX C Aacute -23\n" +"KPX C Adieresis -23\nKPX C Aring -23\nKPX C H -2\nKPX C K -10\nKPX C O -12\nKPX " +"C Oacute -12\nKPX C Odieresis -12\nKPX Ccedilla A -27\nKPX D A -67\nKPX D Aacute" +" -67\nKPX D Acircumflex -67\nKPX D Adieresis -67\nKPX D Agrave -67\nKPX D Aring " +"-67\nKPX D Atilde -67\nKPX D J -41\nKPX D T -10\nKPX D V -71\nKPX D W -57\nKPX D" +" X -64\nKPX D Y -74\nKPX F A -71\nKPX F Aacute -71\nKPX F Acircumflex -71\nKPX F" +" Adieresis -71\nKPX F Agrave -71\nKPX F Aring -71\nKPX F Atilde -71\nKPX F J -13" +"\nKPX F O -10\nKPX F Odieresis -10\nKPX F a -34\nKPX F aacute -34\nKPX F adieres" +"is -10\nKPX F ae -36\nKPX F aring -34\nKPX F comma -51\nKPX F e -19\nKPX F eacut" +"e -19\nKPX F hyphen 3\nKPX F i -13\nKPX F j -20\nKPX F o -21\nKPX F oacute -21\n" +"KPX F odieresis -21\nKPX F oe -21\nKPX F oslash -21\nKPX F period -58\nKPX F r -" +"10\nKPX F u -11\nKPX G A -26\nKPX G AE -19\nKPX G Aacute -26\nKPX G Acircumflex " +"-26\nKPX G Adieresis -26\nKPX G Agrave -26\nKPX G Aring -26\nKPX G Atilde -26\nK" +"PX G T -21\nKPX G V -23\nKPX G W -18\nKPX G Y -26\nKPX J A -53\nKPX J AE -46\nKP" +"X J Adieresis -53\nKPX J Aring -53\nKPX K C -43\nKPX K G -49\nKPX K O -51\nKPX K" +" OE -44\nKPX K Oacute -51\nKPX K Odieresis -51\nKPX K S 1\nKPX K T 0\nKPX K a 2\n" +"KPX K adieresis 2\nKPX K ae 0\nKPX K aring 2\nKPX K e -19\nKPX K hyphen -63\nKPX" +" K o -31\nKPX K oacute -31\nKPX K odieresis -31\nKPX K u -19\nKPX K udieresis -1" +"9\nKPX K y -86\nKPX L A 0\nKPX L AE 6\nKPX L Aacute 0\nKPX L Adieresis 0\nKPX L " +"Aring 0\nKPX L C 2\nKPX L Ccedilla 0\nKPX L G 0\nKPX L O -3\nKPX L Oacute -3\nKP" +"X L Ocircumflex -3\nKPX L Odieresis -3\nKPX L Ograve -3\nKPX L Otilde -3\nKPX L " +"S 5\nKPX L T -73\nKPX L U -26\nKPX L Udieresis -26\nKPX L V -115\nKPX L W -89\nK" +"PX L Y -100\nKPX L hyphen 25\nKPX L quotedblright -100\nKPX L quoteright -125\nK" +"PX L u -10\nKPX L udieresis -10\nKPX L y -56\nKPX N A -28\nKPX N AE -21\nKPX N A" +"acute -28\nKPX N Adieresis -28\nKPX N Aring -28\nKPX N C -16\nKPX N Ccedilla -16" +"\nKPX N G -19\nKPX N O -20\nKPX N Oacute -20\nKPX N Odieresis -20\nKPX N a -27\n" +"KPX N aacute -27\nKPX N adieresis -27\nKPX N ae -27\nKPX N aring -27\nKPX N comm" +"a -14\nKPX N e -17\nKPX N eacute -17\nKPX N o -21\nKPX N oacute -21\nKPX N odier" +"esis -21\nKPX N oslash -20\nKPX N period -21\nKPX N u -25\nKPX N udieresis -25\n" +"KPX O A -58\nKPX O AE -50\nKPX O Aacute -58\nKPX O Adieresis -58\nKPX O Aring -5" +"8\nKPX O T -9\nKPX O V -69\nKPX O W -54\nKPX O X -55\nKPX O Y -72\nKPX Oacute A " +"-58\nKPX Oacute T -9\nKPX Oacute V -69\nKPX Oacute W -54\nKPX Oacute Y -72\nKPX " +"Ocircumflex T -9\nKPX Ocircumflex V -69\nKPX Ocircumflex Y -72\nKPX Odieresis A " +"-58\nKPX Odieresis T -9\nKPX Odieresis V -69\nKPX Odieresis W -54\nKPX Odieresis" +" X -55\nKPX Odieresis Y -72\nKPX Ograve T -9\nKPX Ograve V -69\nKPX Ograve Y -72" +"\nKPX Oslash A -58\nKPX Otilde T -9\nKPX Otilde V -69\nKPX Otilde Y -72\nKPX P A" +" -90\nKPX P AE -91\nKPX P Aacute -90\nKPX P Adieresis -90\nKPX P Aring -90\nKPX " +"P J -52\nKPX P a -17\nKPX P aacute -17\nKPX P adieresis -17\nKPX P ae -18\nKPX P" +" aring -17\nKPX P comma -94\nKPX P e -23\nKPX P eacute -23\nKPX P hyphen -37\nKP" +"X P o -25\nKPX P oacute -25\nKPX P odieresis -25\nKPX P oe -25\nKPX P oslash -25" +"\nKPX P period -101\nKPX R C -41\nKPX R Ccedilla -41\nKPX R G -44\nKPX R O -45\n" +"KPX R OE -39\nKPX R Oacute -45\nKPX R Odieresis -45\nKPX R T -34\nKPX R U -56\nK" +"PX R Udieresis -55\nKPX R V -73\nKPX R W -67\nKPX R Y -76\nKPX R a -2\nKPX R aac" +"ute -2\nKPX R adieresis -2\nKPX R ae -5\nKPX R aring -2\nKPX R e -23\nKPX R eacu" +"te -23\nKPX R hyphen -52\nKPX R o -36\nKPX R oacute -36\nKPX R odieresis -36\nKP" +"X R oe -31\nKPX R u -24\nKPX R uacute -24\nKPX R udieresis -24\nKPX R y -37\nKPX" +" S A -37\nKPX S AE -30\nKPX S Aacute -37\nKPX S Adieresis -37\nKPX S Aring -37\n" +"KPX S T -19\nKPX S V -27\nKPX S W -21\nKPX S Y -30\nKPX S t -20\nKPX T A -53\nKP" +"X T AE -45\nKPX T Aacute -53\nKPX T Acircumflex -53\nKPX T Adieresis -53\nKPX T " +"Agrave -53\nKPX T Aring -53\nKPX T Atilde -53\nKPX T C -8\nKPX T G -11\nKPX T J " +"-18\nKPX T O -10\nKPX T OE -4\nKPX T Oacute -10\nKPX T Ocircumflex -10\nKPX T Od" +"ieresis -10\nKPX T Ograve -10\nKPX T Oslash -10\nKPX T Otilde -10\nKPX T S -10\n" +"KPX T V 14\nKPX T W 20\nKPX T Y 11\nKPX T a -77\nKPX T ae -80\nKPX T c -87\nKPX " +"T colon -87\nKPX T comma -74\nKPX T e -86\nKPX T g -91\nKPX T guillemotleft -114" +"\nKPX T guilsinglleft -125\nKPX T hyphen -73\nKPX T i -18\nKPX T j -25\nKPX T o " +"-90\nKPX T oslash -89\nKPX T period -82\nKPX T r -50\nKPX T s -73\nKPX T semicol" +"on -87\nKPX T u -93\nKPX T v -105\nKPX T w -106\nKPX T y -102\nKPX U A -65\nKPX " +"U AE -58\nKPX U Aacute -65\nKPX U Acircumflex -65\nKPX U Adieresis -65\nKPX U Ar" +"ing -65\nKPX U Atilde -65\nKPX U comma -31\nKPX U m -33\nKPX U n -31\nKPX U p -2" +"8\nKPX U period -37\nKPX U r -27\nKPX Uacute A -65\nKPX Uacute comma -31\nKPX Ua" +"cute m -33\nKPX Uacute n -31\nKPX Uacute p -28\nKPX Uacute period -37\nKPX Uacut" +"e r -27\nKPX Ucircumflex A -65\nKPX Udieresis A -65\nKPX Udieresis b 21\nKPX Udi" +"eresis comma -31\nKPX Udieresis m -33\nKPX Udieresis n -31\nKPX Udieresis p -28\n" +"KPX Udieresis period -37\nKPX Udieresis r -27\nKPX Ugrave A -65\nKPX V A -124\nK" +"PX V AE -104\nKPX V Aacute -124\nKPX V Acircumflex -124\nKPX V Adieresis -124\nK" +"PX V Agrave -124\nKPX V Aring -124\nKPX V Atilde -124\nKPX V C -63\nKPX V G -66\n" +"KPX V O -67\nKPX V Oacute -67\nKPX V Ocircumflex -67\nKPX V Odieresis -67\nKPX V" +" Ograve -67\nKPX V Oslash -65\nKPX V Otilde -67\nKPX V S -47\nKPX V T 10\nKPX V " +"a -88\nKPX V ae -89\nKPX V colon -90\nKPX V comma -105\nKPX V e -85\nKPX V g -10" +"1\nKPX V guillemotleft -109\nKPX V guilsinglleft -119\nKPX V hyphen -69\nKPX V i" +" -20\nKPX V o -89\nKPX V oslash -88\nKPX V period -112\nKPX V r -56\nKPX V semic" +"olon -89\nKPX V u -51\nKPX V y -54\nKPX W A -113\nKPX W AE -98\nKPX W Aacute -11" +"3\nKPX W Acircumflex -113\nKPX W Adieresis -113\nKPX W Agrave -113\nKPX W Aring " +"-113\nKPX W Atilde -113\nKPX W C -53\nKPX W G -56\nKPX W O -56\nKPX W Oacute -56" +"\nKPX W Ocircumflex -56\nKPX W Odieresis -56\nKPX W Ograve -56\nKPX W Oslash -55" +"\nKPX W Otilde -56\nKPX W S -41\nKPX W T 17\nKPX W a -80\nKPX W ae -81\nKPX W co" +"lon -81\nKPX W comma -89\nKPX W e -72\nKPX W g -91\nKPX W guillemotleft -97\nKPX" +" W guilsinglleft -107\nKPX W hyphen -56\nKPX W i -13\nKPX W o -76\nKPX W oslash " +"-75\nKPX W period -96\nKPX W r -47\nKPX W semicolon -81\nKPX W u -43\nKPX W y -4" +"5\nKPX X C -52\nKPX X O -61\nKPX X Odieresis -61\nKPX X Q -61\nKPX X a -7\nKPX X" +" e -28\nKPX X hyphen -54\nKPX X o -41\nKPX X u -29\nKPX X y -96\nKPX Y A -74\nKP" +"X Y AE -67\nKPX Y Aacute -74\nKPX Y Acircumflex -74\nKPX Y Adieresis -74\nKPX Y " +"Agrave -74\nKPX Y Aring -74\nKPX Y Atilde -74\nKPX Y C -68\nKPX Y G -71\nKPX Y O" +" -69\nKPX Y Oacute -69\nKPX Y Ocircumflex -69\nKPX Y Odieresis -69\nKPX Y Ograve" +" -69\nKPX Y Oslash -69\nKPX Y Otilde -69\nKPX Y S -44\nKPX Y T 13\nKPX Y a -99\n" +"KPX Y ae -102\nKPX Y colon -109\nKPX Y comma -96\nKPX Y e -103\nKPX Y g -113\nKP" +"X Y guillemotleft -135\nKPX Y guilsinglleft -145\nKPX Y hyphen -98\nKPX Y i -17\n" +"KPX Y o -107\nKPX Y oslash -106\nKPX Y p -88\nKPX Y period -103\nKPX Y semicolon" +" -108\nKPX Y u -78\nKPX Y v -86\nKPX Z v -48\nKPX Z y -50\nKPX a j -26\nKPX a qu" +"oteright -40\nKPX a v -30\nKPX a w -31\nKPX a y -32\nKPX aacute v -30\nKPX aacut" +"e w -31\nKPX aacute y -32\nKPX adieresis v -30\nKPX adieresis w -31\nKPX adieres" +"is y -32\nKPX ae v -27\nKPX ae w -28\nKPX ae y -30\nKPX agrave v -30\nKPX agrave" +" w -31\nKPX agrave y -32\nKPX aring v -30\nKPX aring w -31\nKPX aring y -32\nKPX" +" b v -29\nKPX b w -30\nKPX b y -32\nKPX c h -15\nKPX c k -19\nKPX comma one -52\n" +"KPX comma quotedblright -29\nKPX comma quoteright -53\nKPX e quoteright -30\nKPX" +" e t -10\nKPX e v -27\nKPX e w -28\nKPX e x -35\nKPX e y -30\nKPX eacute v -27\n" +"KPX eacute w -28\nKPX eacute y -30\nKPX ecircumflex v -27\nKPX ecircumflex w -28" +"\nKPX ecircumflex y -30\nKPX eight four 0\nKPX eight one -64\nKPX eight seven -1" +"5\nKPX f a -25\nKPX f aacute -25\nKPX f adieresis 12\nKPX f ae -25\nKPX f aring " +"-6\nKPX f e -34\nKPX f eacute -34\nKPX f f 6\nKPX f i 15\nKPX f j 8\nKPX f l 44\n" +"KPX f o -38\nKPX f oacute -38\nKPX f odieresis -1\nKPX f oe -36\nKPX f oslash -3" +"7\nKPX f quoteright 17\nKPX f s -21\nKPX f t 10\nKPX five four -8\nKPX five one " +"-70\nKPX five seven -36\nKPX four four 14\nKPX four one -75\nKPX four seven -42\n" +"KPX g a -17\nKPX g adieresis -17\nKPX g ae -18\nKPX g aring -17\nKPX g e -25\nKP" +"X g eacute -25\nKPX g l -7\nKPX g oacute -26\nKPX g odieresis -26\nKPX g r 11\nK" +"PX guillemotright A -62\nKPX guillemotright AE -61\nKPX guillemotright Aacute -6" +"2\nKPX guillemotright Adieresis -62\nKPX guillemotright Aring -62\nKPX guillemot" +"right T -114\nKPX guillemotright V -117\nKPX guillemotright W -95\nKPX guillemot" +"right Y -138\nKPX guilsinglright A -72\nKPX guilsinglright AE -71\nKPX guilsingl" +"right Aacute -72\nKPX guilsinglright Adieresis -72\nKPX guilsinglright Aring -72" +"\nKPX guilsinglright T -124\nKPX guilsinglright V -128\nKPX guilsinglright W -10" +"5\nKPX guilsinglright Y -149\nKPX h quoteright -38\nKPX h y -30\nKPX hyphen A -2" +"6\nKPX hyphen AE -25\nKPX hyphen Aacute -26\nKPX hyphen Adieresis -26\nKPX hyphe" +"n Aring -26\nKPX hyphen T -77\nKPX hyphen V -82\nKPX hyphen W -59\nKPX hyphen Y " +"-108\nKPX i T -28\nKPX i j -36\nKPX k a 1\nKPX k aacute 1\nKPX k adieresis 1\nKP" +"X k ae -1\nKPX k aring 1\nKPX k comma 4\nKPX k e -19\nKPX k eacute -19\nKPX k g " +"-12\nKPX k hyphen -65\nKPX k o -32\nKPX k oacute -32\nKPX k odieresis -32\nKPX k" +" period -2\nKPX k s 5\nKPX k u 14\nKPX k udieresis 14\nKPX l v -28\nKPX l y -25\n" +"KPX m p -9\nKPX m v -30\nKPX m w -31\nKPX m y -31\nKPX n T -55\nKPX n p -13\nKPX" +" n quoteright -39\nKPX n v -30\nKPX n w -31\nKPX n y -31\nKPX nine four -7\nKPX " +"nine one -63\nKPX nine seven -6\nKPX o T -91\nKPX o quoteright -34\nKPX o t -9\n" +"KPX o v -36\nKPX o w -36\nKPX o x -36\nKPX o y -41\nKPX oacute v -36\nKPX oacute" +" w -36\nKPX oacute y -41\nKPX ocircumflex t -9\nKPX odieresis t -9\nKPX odieresi" +"s v -36\nKPX odieresis w -36\nKPX odieresis x -36\nKPX odieresis y -41\nKPX ogra" +"ve v -36\nKPX ograve w -36\nKPX ograve y -41\nKPX one comma -48\nKPX one eight -" +"68\nKPX one five -37\nKPX one four -72\nKPX one nine -61\nKPX one one -78\nKPX o" +"ne period -55\nKPX one seven -78\nKPX one six -66\nKPX one three -41\nKPX one tw" +"o -34\nKPX one zero -54\nKPX p t -6\nKPX p y -28\nKPX period one -61\nKPX period" +" quotedblright -33\nKPX period quoteright -58\nKPX q c -7\nKPX q u -12\nKPX quot" +"edblbase A 12\nKPX quotedblbase AE 19\nKPX quotedblbase T -60\nKPX quotedblbase " +"V -104\nKPX quotedblbase W -76\nKPX quotedblbase Y -87\nKPX quotedblleft A -86\n" +"KPX quotedblleft AE -91\nKPX quotedblleft Aacute -86\nKPX quotedblleft Adieresis" +" -86\nKPX quotedblleft Aring -86\nKPX quotedblleft T 14\nKPX quotedblleft V 1\nK" +"PX quotedblleft W 7\nKPX quotedblleft Y -1\nKPX quotedblright A -94\nKPX quotedb" +"lright AE -99\nKPX quotedblright Aacute -94\nKPX quotedblright Adieresis -94\nKP" +"X quotedblright Aring -94\nKPX quotedblright T 11\nKPX quotedblright V 0\nKPX qu" +"otedblright W 6\nKPX quotedblright Y -2\nKPX quoteleft A -110\nKPX quoteleft AE " +"-115\nKPX quoteleft Aacute -110\nKPX quoteleft Adieresis -110\nKPX quoteleft Ari" +"ng -110\nKPX quoteleft T -9\nKPX quoteleft V -23\nKPX quoteleft W -17\nKPX quote" +"left Y -26\nKPX quoteright A -130\nKPX quoteright AE -135\nKPX quoteright Aacute" +" -130\nKPX quoteright Adieresis -130\nKPX quoteright Aring -130\nKPX quoteright " +"comma -71\nKPX quoteright d -56\nKPX quoteright o -54\nKPX quoteright period -78" +"\nKPX quoteright r -44\nKPX quoteright s -47\nKPX quoteright t -43\nKPX quoterig" +"ht v -47\nKPX quoteright w -47\nKPX quoteright y -45\nKPX r a -1\nKPX r aacute -" +"1\nKPX r acircumflex -1\nKPX r adieresis -1\nKPX r ae -3\nKPX r agrave -1\nKPX r" +" aring -1\nKPX r c -8\nKPX r ccedilla -8\nKPX r colon -7\nKPX r comma -41\nKPX r" +" d -10\nKPX r e -6\nKPX r eacute -6\nKPX r ecircumflex -6\nKPX r egrave -6\nKPX " +"r f 19\nKPX r g -15\nKPX r h -6\nKPX r hyphen -46\nKPX r i 20\nKPX r j 14\nKPX r" +" k -10\nKPX r l -18\nKPX r m 20\nKPX r n 22\nKPX r o -8\nKPX r oacute -8\nKPX r " +"ocircumflex -8\nKPX r odieresis -8\nKPX r oe -7\nKPX r ograve -8\nKPX r oslash -" +"7\nKPX r p 25\nKPX r period -48\nKPX r q -10\nKPX r quoteright -19\nKPX r r 26\n" +"KPX r s 0\nKPX r semicolon -7\nKPX r t 23\nKPX r u 19\nKPX r v 20\nKPX r w 19\nK" +"PX r x 17\nKPX r y 22\nKPX r z 2\nKPX s quoteright -38\nKPX s t -15\nKPX seven c" +"olon -68\nKPX seven comma -72\nKPX seven eight -40\nKPX seven five -59\nKPX seve" +"n four -63\nKPX seven one -56\nKPX seven period -79\nKPX seven seven -20\nKPX se" +"ven six -46\nKPX seven three -35\nKPX seven two -31\nKPX six four 12\nKPX six on" +"e -74\nKPX six seven -29\nKPX t S 2\nKPX t a 10\nKPX t aacute 10\nKPX t adieresi" +"s 10\nKPX t ae 9\nKPX t aring 10\nKPX t colon -8\nKPX t e 0\nKPX t eacute 0\nKPX" +" t h 10\nKPX t o -8\nKPX t oacute -8\nKPX t odieresis -8\nKPX t quoteright -29\n" +"KPX t semicolon -8\nKPX three four -6\nKPX three one -75\nKPX three seven -28\nK" +"PX two four 0\nKPX two one -60\nKPX two seven -16\nKPX u quoteright -36\nKPX v a" +" -24\nKPX v aacute -24\nKPX v acircumflex -24\nKPX v adieresis -24\nKPX v ae -24" +"\nKPX v agrave -24\nKPX v aring -24\nKPX v atilde -24\nKPX v c -37\nKPX v colon " +"-20\nKPX v comma -69\nKPX v e -36\nKPX v eacute -36\nKPX v ecircumflex -36\nKPX " +"v egrave -36\nKPX v g -41\nKPX v hyphen -28\nKPX v l -31\nKPX v o -38\nKPX v oac" +"ute -38\nKPX v odieresis -38\nKPX v ograve -38\nKPX v oslash -38\nKPX v period -" +"76\nKPX v s -21\nKPX v semicolon -20\nKPX w a -27\nKPX w aacute -27\nKPX w acirc" +"umflex -27\nKPX w adieresis -27\nKPX w ae -27\nKPX w agrave -27\nKPX w aring -27" +"\nKPX w atilde -27\nKPX w c -33\nKPX w colon -23\nKPX w comma -64\nKPX w e -31\n" +"KPX w eacute -31\nKPX w ecircumflex -31\nKPX w egrave -31\nKPX w g -43\nKPX w hy" +"phen -24\nKPX w l -33\nKPX w o -35\nKPX w oacute -35\nKPX w odieresis -35\nKPX w" +" ograve -35\nKPX w oslash -34\nKPX w period -71\nKPX w s -23\nKPX w semicolon -2" +"3\nKPX x a -11\nKPX x c -34\nKPX x e -32\nKPX x eacute -32\nKPX x o -45\nKPX x q" +" -26\nKPX y a -32\nKPX y aacute -32\nKPX y acircumflex -32\nKPX y adieresis -32\n" +"KPX y ae -31\nKPX y agrave -32\nKPX y aring -32\nKPX y atilde -32\nKPX y c -37\n" +"KPX y colon -23\nKPX y comma -66\nKPX y e -35\nKPX y eacute -35\nKPX y ecircumfl" +"ex -35\nKPX y egrave -35\nKPX y g -48\nKPX y hyphen -27\nKPX y l -32\nKPX y o -3" +"9\nKPX y oacute -39\nKPX y odieresis -39\nKPX y ograve -39\nKPX y oslash -38\nKP" +"X y period -73\nKPX y s -26\nKPX y semicolon -23\nKPX zero four 12\nKPX zero one" +" -55\nKPX zero seven -5\nEndKernPairs\nEndKernData\nEndFontMetrics\n" +; +int n021003l_pfb_len = 46026; +char* n021003l_pfb = +"\x80\x1m\x6\x0\x0%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05\n%%CreationDate: We" +"d Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developmen" +"t\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPY" +"ING (GNU General Public License) for license conditions.\n% As a special excepti" +"on, permission is granted to include this font\n% program in a Postscript or PDF" +" file that consists of a document that\n% contains text to be displayed or print" +"ed using this font, regardless\n% of the conditions or license applying to the d" +"ocument itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) rea" +"donly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See " +"the file COPYING (GNU General Public License) for license conditions. As a speci" +"al exception, permission is granted to include this font program in a Postscript" +" or PDF file that consists of a document that contains text to be displayed or p" +"rinted using this font, regardless of the conditions or license applying to the " +"document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by " +"(URW)++ Design & Development) readonly def\n/FullName (Nimbus Roman No9 L Regula" +"r) readonly def\n/FamilyName (Nimbus Roman No9 L) readonly def\n/Weight (Regular" +") readonly def\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePositio" +"n -100 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusRomNo" +"9L-Regu def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-168 -281 1000 924} read" +"only def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly de" +"f\n/Encoding StandardEncoding def\n/UniqueID 5020931 def\ncurrentdict end\ncurre" +"ntfile eexec\r\x80\x2\x35\xab\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a" +"\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9c" +"t\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4" +"\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5" +"Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d" +"\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7" +"\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>m\xb3\xdc\x98" +"4<\x9c\xd2\xd0\x9b\xa4\x31\"%\xf6}\xc6\x9b\x9e\xbfg\x88\xf6\xeb)n\x97+f\x10]\xf\x9b" +"r\xa7iZ\xb1O \xcauD\xf6\xdfnH1I\xad\x93\rQ\x9e\x44\xc6\x32\x33\xf6n\x8b\x13\xd5\x18" +"\x14\x61\xceV\xc0h\xc0\x15\xdf\x16\xd7R\xf5\xae\xcc=D\x1b\x5\x93\xbb\xd5R\xf4\xc4" +"\x10G\x1a\xae\x82\x31\xbf\xe2\xfe\xdf\x61\x9e]L\xc6\x15\xbd$6\xac\xa5\x7\xfa\xa7" +"\xec\xbd\x97\xaa\xc2T|D\x7f\x8\xa4\xff\xb2\x8e\x12\xc5\xb6\xe3\xd5\xf1\x10'{9\xb6" +"\xc5?\x3\x1a; 44Y;UF\x9d\x1a\x9f\xf\x82\x37\x38\xca\x84\x91\xc3\xf0\x35\xcbtQqw," +"F\x0\xbe\xce\x86\x45\xc5y|\"\x98\xc7\x8ex7\xd6\xf9\xb1\x8b\xa8m\x3p(\xa8\x19p\x9a" +"\x3\xa1\xad\xe4o\xd4\xc9\x12\xd8j\xcf\xc4\x31\xb5\x9c'\x7\xf6\x63\xed\xcc\x19K\x90" +"K\xf0\xac\xdf\x91\xb6\xf7h\xfa\xf9\xf3g\xb3\x88\x42\xaf\x9f\xcd\x35l\xc5\xb6\xf7" +"\xdd\xb7@]\x6/'E;\x98\x9e\xe9\xba\x16h\x5\xec\xe7\x7\x32\n\xa5\x4)\x14L\x1d\x97w" +"\x9a\xb4\x62q U\xa7\x43*=I\xbe\x61\xaf\x9bm\xe8\xa9\xc8 \xc0\xe7\r\x43\xe5\x1d\x9" +"\xb8\x37 \xc9\xd2\x6\xde\xe1\x37\x84\xcd\xc\xb2\x15\x12\xf7\xe0\x41\x8a\x90q\x97" +"^[i\xa5Z\x97UVv\xe8#\xe9@\xf5\xa5\xe6\xe6{@\x5\x41\x99\xa5\xf8\xae\x97\x41\xd2\xd5" +"RqS\xf9\xcd\xc0\x8e\xb9\xd9\\M\xdd\xfb\x9H\x5\x19S\xf3\x9cm-\x81\x1d?\xfd\xc2_xn" +"\x7+*\x8a\x1fH0\xf9\xe5V\xd7\x8a.\\\xcq8\xe0|\xd5\xa9\xc2\xc8\xa7\xa6\x1e!\xd9(\x1f" +"\xa6\xe6\xd5\xd4\xd1\x9d\xeb\x81:\xe4MJIp\x9e\xf\xc5\x63&$a\x5\x33'ZQ\xe9;Pw~\x12" +"\xd9\x35\x9d\xbb>\xc<\x8f>3\xd4\xe1M\x3\xad\x88RA\xc8\x94\xd3\x64\x7\xf9$\xff\xc1" +"\x1\x12\xb8\xe1\xfJ_\x1cG\x87\xd6kDA\xed\x83\x62\x18\xc0\x44m J\x89\xbc\x15|Jl8E" +"\x18\xe5\x30\xab\xda\xae\x8c)\xd3\x97\x38\xdeK\xaeZ\xc6\x8d\x62\x34\x3\x16#\xa5s" +"z\xd7V\x7fQl\xf3\x61\xbc\x42\xdb\x14\x10\xc2\x81*\xf\x7f\x11\xed\x81y\x7f\xf5\x9f" +"%\xd0\xac\x1b\xb7\x13\x89\x84\x90\x61\x12\xf7G\x95k\xb8\x65\xee\xb5]\xd4\xf4\x8b" +"\xaeu\xffw\x88Q\xdf\xbf\xf7\x1e\x9b;\xe5\x91~\xdbt\xe7\xael3BR\xe8\xdd^\x1f\x2\x87" +"\xbe\xd3\xfb\xdc \xf9[x\x91\x1e%(\r\xf0\xb8\xc8g\xb3W\x9b\x9c\xdb\x19\xeH\x2\xd7" +"\x14\x83\x18|i\xd3\x61&\xb8\xbc\x8e\x30\xeci\x6+\xcb\x62\xea" +"\xc1\x82\xb1\xff\xc5qx\xdd;\x16\x89\xdf\xd5~\xf6\x45^L\xbdL\xee\xd0\x62\x99\x9e?" +"\xef\xe3\x94l\xa8\x37\xb0\x87\xb8@\xc3\xe6RE\xea\xc4z\x87\r\x12\xc\x44\xb0\xe8N\x17" +"\xe8\x85\xd0\xfd\xa7H=\xa2\xfb\xd0\xcd\xb9\x19,\xbb\xa4i1Zo2^m\xcb\x13\x65\x9c\xdf" +"\x9c\xf8\xd9\xa3\xe6\xf2.=:;\xcf\xb6]\xb1\xa1\x6\x46\xd0\x8a\xa2\x1c`\x8f\xab\xce" +"gV\xca\x1e\xd8\xec\xeb\x61;=^v\x7\r\x39H6\xbb\xa9\x7\x9S\xb1\x7@\xbb\xb3\x18$\xf9" +">d\xa9\x90\xfd\x8a\xfa\x98\x9e\xb8\xba\xc\x43R\x16V3\xe7\x9b\xc9\x9b\x7uy\xf8\x7f" +"}T~\xac\xc4\xf4\xb6\x9c\x8a\xfc$\xc#\xb3\x1\x82%\xc\xdb\xe4\x61\xfe\xc4\xc2\xe6}" +"9\x7f\xb2\x8d\x8dN\xc0x\xb9|C\xe7\x1d\xa9\x3\xea\xe\x80\xc8{e\xe3PN\xef\x84\x95\x14" +"\x8a\x0(/\xa2\x46\xf7\xd6 !\xe0]&$\xb0\xb\x9f\x7f\x62q+\x8aY\xe\xcc\xd3\xf8\x1f\x99" +"\xda^n1\x8c\xa3\xdb\xeb#<\xf0?\xdb\n\xf8\x1c\x83\xb9\x9|\xe\x8e\xd1\xa7\xa2\xadx" +"\xd7\xe1\xba\xf3\xfd\xf2\x11\xd5\xfe\x83\xf1\xe\x42n\x13\xe2\xec\xf3\xfd\xdc\x14" +"\x9cUa\xcfy=\n\xd4X\x8f\xeb\x34\xd1T\x5\x3}\x92\x12\x43\xa3\xae\xb3\x31\xcc\xd8\xc5" +"\xa9I\xfb\xb5)\xf1WS6\xef\x66\xfc\xf2@)\x1e\xe3\xbd\xd2\x96\x42\xb0\x61%\\\x93\xec" +"\xd9J\x9eOo\xa0\x9a\xe6\x9c\x14\x96\xa8\xbe\xa5\xf4\x8c`\xe3puFf\xb2\xf8\x65w\x16" +"\x8d\x86\xb9\x8d\xe5g\xfb\x37\xe8\xf7\xb\xee\xf4>\xcc%\xbb\xcN\xe7\xc\xab|,(X\xa0" +"\xd6\x39\x16\x1d\n\xcb\xf9|l\xc5\xe1\xc9g\x90\xe1\xe1\x80\xca\xfa]\x9\xb1\xc6R\x7" +"\x3\xf3\xfd\xb3\xd1\xa8\xc7\xb8)\xe7\xb7&<\xe0tk\x96\xef\x1a\xe6\xfd\x46\xcc FI\x9b" +"cW\x94\x9fU\nG\x95\xe8\xb4\xe9\xa4\x18\x46\x38\x1d\xc9\xd1\xe0\x93Y\x9a\xb0\x35\xa3" +"\xd9\xe3U\xde\x38n*r\xfb\x0\x95(\xf3ny\xd3\xb2\xb7hv\x83!\xf4\xf5\x97\x1d\x63p\xe6" +"R3\xb7h\xd6xC.\xa9\x61\x31\xe8\xd6\xd5\xe8\xf2\x81\xdfi0;)\xd0'^\x10\xf9U9\x9\n\xb2" +"\xea\xbf'n\xcc\xe0y\x80\x93\x3\x16Su\x14\xf9\x63\xb0\xf2\xd8 GH\xe7\x15(F\xba\x13" +"$\xc8\x97$\x9f\xc6\x95v\xcd+\x14\x38\x91\xebi\xee\xde%\xa0\xc5\x8c\x9f\x2\xed+\xde" +"\xad\xc4\n\x8U;(\x15Y8\xcd\x65/\xdb\x1fY\xf4~\xa3\xaf\x8f\xbf\xc\xe\xd8\xf3\x91\x8d" +"\x1d\xcb\x92\x0\xdd\x61\x1a\rJ\xa2\xa1\xb2\xce\xa3\x64\x1f\x12\xfc*EQW\xb1\xc9\xd0" +"5\xdc\xf9\x11\xb9\x41\xa5\x0\xcf\xba\x9f\x65\xe7mh(\xec\x84\xd2u\xc0\xfeg^\xc6\xe3" +"p\xb9O\x19\xa5\xc5\xb5\xd5\x39K\xc7\xd9^\xf9&\xe4\x63\xf`\xdd\xc5\xb0\x62vhL-eIP" +"\x6z\xbd\xe1\xc3z\xa4\xec\x91s\xa9\xcbQ\x87\xee\x10\xd7\xe1:T\x84/\x14z\xe6\xeeJ" +"\xfbP\xb8O\xfc\x83mZ[\x89>\xaa\x18\xb9\x8a\xe9\xfatQ%\xf5\x1bZ\xcb~\xea\xaa\x83\x8e" +"\x11\xaei\xe8U\x1a\xb6\xea\xaa\r\x4\x9d\x98\xdcS\xdds\xb3\xa0\x30~\x1e\x8b\xfa\x33" +"\x82)\xc9\xf3\xbbV\xd0<\xdatk\xa5\xae\xa5\xf2Tb\xb4r\xd2\xc3\xc6~q\xd8\xbe+r~\xe" +"v\xb8\xb5~L(\xa4\xa1w\xdc\xd7\xd3u\xcdt\x9e\xca\xe8)\xf9\x9f\x87\x7iU\xc6\xa2\xc5" +"j\x1a\xd5\x8f\xdb\xd3\x31\xc9\xf4Y%\xef\x8e\xb5\xbfRpj\xd2`S&!\xf1\xc1\xb1\x9a\xc7" +"\xcb\x81s\x2\x64ti\x7f\x1d\xb6\xe5_.\xbb\xa3\xf5\x13\xebo\xf4\x1e\x41\x66\x80\xac" +"\x7f\xab\xb5\xb\xd0\xbc\x8\x96\xf6\xc\xb3\x4\x31j\x94Sp\xcf\xa2;\x17\x39\xb4\x85" +"\xa1v\x13\x42\xa3\x9f_d4\xc9\xc7\x9d\n\x10\xa4\xea\xa3\x66\"\xd2\x31h\x93\x9\x11" +"a(R\x84\xfe\xbcygKO\xcc\x14\xb6\x62\x92o4\xff\x61l\x9eH\xb5@\x80\x84\x4wD\xc1N\xda" +"<\xf0\x9a\x42\xa4@\x8f\xc0\x3<\xee\xf6\x44\xed\xc7\xa8\xf\x97\xe2\x81**2\x94\xff" +"0T\xe\x9at\xcbym\xa3\x95\x18\n\xbb\x6n\xcbz\xfc\xd5\xaa\xe3O\x89\x84nZ\xdfwFZ_\x9b" +"\xd2\xe4\xfb-H(\xf0\x65jK\x2\xe5\x62\xf1^c\r\xcb\x0\xfb\x8bT\xff\x10\xda\x11\xca" +"\xc0\xfb\xb4\xb4\x8b\x2\xdc\xeb)\xd1\x84\xaa\x9a_\xb\x0\xcb\xe1! \x85i\xc4\xaf\x9c" +"\xf7\x15\x13\xd8U\xcd\xc3\xba\xa7\x9b\x7\x65\xdb\x44$\xa7\x35=\x9a\x36j\xfav\xcc" +"\x17\xe\xa6=\xdc\xf9\x8c\x86\xee]!\xdb\xd3M\x81\xc3\xb\xba\xa8\xbf\xca\x63\x43\x97" +"r<`M\xf9\xa2\x9d\xc8+\x98\x1a\xc2\x95\x10~xx\x94\xdb\x41\xfe\x1e\x37\x81\x89\x9b\x1\x90\xcd\x9ciD\xcb\r\x34!\x90\xa4\xf9" +"\xa5\xa9Y\xa1O^\xc9\xe3%\xd9\x34\x98\x8\xaf\xb0\x95\xdf\xac\xbd\xf1\xd2\xf9}\xbc" +"\xdd\x1dK\x13\x84\x15U@3\x82\xf6\x18G\xa3\xcdL\xdc\xcdut\xaa\x8d\xe3\xb0\x33\xe1" +"k\x9d\xce\x0\xcc\x9c\xb9\xf6vP\xcezq}\x7f\xb1_|p\xfe\x86\xdc\x15\xe6\xb0RX\xda\xee" +"\xb7I\xet{?@\x82(\x1fW\xadO\xb0:\x92\xc4\xb0\xb8\xf6\x17\x3\x31G\xa0\x19\x43\x91" +"\xb5\rU\xf4\x7f\x9amhm\xedQ\xa3\xc7<\xdb[\xbc\xa8\xc8H\x96\x30 \xa5\xb1)E\x16sM\xb9" +"\xb9\x1drp\x1a\x4\xcd\xe8\x88\xf8\x89g\xcf\x82\xc5G\xce\x1f\x1a\xea\xff+5\xa4X\x1a" +"\xb3\x42k\x88\x8f\xd3K^\xd9\x9d\xf0\x1\xd2\xe4\x84\xad\xf6HD\xf8\n\xe2W}!\x1c\x80" +"k\xf6\x15\x66\x0\xf0\x9a\x16\xda\xc7>\x1c\xfe\xd7\x41x\xe6\xaa\x94\xaa;\xfc{\x13" +"\xees\xd2.\xaf\xd4\xd3'\xc7\x8fW\xdb\xec\x80\xd7\xba-\x9b\xe8`\x3Y\xc3\xc3q\xd0)" +"\x11\xf1\xd5\xe3\xfc\x32\x42\x7-s\xd6{e\x84\x6v\xb6\x93wS\x94\xd5\x9e\xef\x80k\xd5" +"?B\xbb\xea\xac\xb4o\xaaov\x8d\x14\x38j\xc\xb7\x37\x81\x14\xbd\x37&\xf3sK\xd3[\x9b" +"M\x96\x32\xb9{\xacq\xb2\x9a\xaeO\xfc\x83\xa9\x33\xdf\xa5\xab\xaa\x12>\x9eV\rO\xee" +"Gr;]8\x7f\xa0\xee\x6Q\xf8\xf1\x4\xb6\xd7\xb\x90\xff\n\xe6\x18\xbb\xdf\xc9\xb4\xfe" +"\xbd\xb&\xda;\x90\x9ci>\x8d\x32\xcaTC\xd9\x86T\xf7\xc\x8a\xdb\x4\xfd\xd1\xf\xa5\x12" +"\x9b\xf4\xa7\xe1\xd5\xba\xd8\x99\xf5L6\xb2\x35)\xf8\x8\xec\xa5\x9d\xfb\x1c\x98\xc7" +"W\x87\xa7\xd9\x39\x32\xe5\xd1\x15\xdd\xf5\x8c\x9a\x99\x95\xd8\xa8\xec\xe2\xb7\x37" +"H'\xae\x96\x3k\xd5\x87/\xed\xdaxE$\xe0\xbb^\xc0&\x80\xd8\x34\xb1\x80\xebU\x97)\xba" +"\xfbP\xf8\xe7\xb9\xf2\x61\xb3\x94\xad\x16mx\xe5\xd9\x17\xa2\xc0\xb5\xcb\x16\x7f\x45" +"p\x1\xb8\xcf\x63\x39\x92\xdd\xbb\x45\xea\x13\xc9\x9c\x65\x9c\xf\xca\xdb\x36l\xd0" +"(:k\xbb\x9b\xfd\xf1l\xe4\x98\x18L\xe2\\+\xb6j(}+\xa9*l\xe6\xbd\x44\x0\x86\x32~\x13" +"{\x8d\xe6\xa2;A\x8f\xf1i\xeeK\x87\xa4p\xb\xd5\xd4\xe\xa4\x63\xce\xf5\x8b\x5\xdfh" +"\xf3-g\x9e\xefp\xe8\x85q\xac}\x8d\xe9\xfa\xc6\xd4\x65R8`I\xd5\x9a\xe3\xa9#\xe6,\xdb" +";\x98\xeL=\xc8\x9dx\x92SV\xf0\xf6\xef\x1?io\x6\xbb\xa6\xe6\xed\x89\xbdP\xc0\x9e\x1c" +"|\r\xb5}\xb6\xcd>\x1f\x1d\xae\x42\x94\xef\x8b\x42\x8b\xc4\xad\xcb\xb0\x30\x15j\xfa" +"\xc0\x6K\xcd,\x8f\xed\xf4`xgY\x89t\x94\xcc\xa0\x33(`M\xe6\x87\xfo,+\x7\xd8\x92n\x83" +"\xe)\xbb^\xd5\x42\xb\x38\x9c\x97\xe5\xbb\\\xcf\xc4\x44S{\xe3\"\xec\xb3\xc7\xd5\x89" +"\xb1\xcfv\xf8\xa0\xbd\xcfX>\xfb\xe1\xff\x38V,\x7f+\xadSz[V=6\xf1\xfc\xa9SR4j\x96" +"\xd2\xe2\xe6\xcf\x10\x37\x94\xc2\x9a\xef?\x7f\x86\x31@\xbb\xa6\xca\x95\x92\x9d\xf2" +"\xd2?\xeb\x97Mo#\xc2\x14\xb9\x36\xc3\x97\xe8\xfa\x3\x7r\xc0\xdc\xf7Ng\xc5\x13\x9c" +"Sc\xc4\x87{f\x98\xf0!\x2\xdc\xb'\xcd\x99\xac}t\x8c\xf0\x86\x95\xa3\xaa?:\x13\x88" +"\xdfV\xf8\xdf\xa9\xf4v\x9f\x9chlUd?\xe4\xba\x9e\xa1\x35O>\xa2\xab=\x9a\x37\x81tM" +"\xeex\x87T\xe0\r\xf0u\x9cJ\xe9Z0\xe2\xaa\x4\x9a\x98\xb\xd1g\"\x10v\xcf\xdc\xec\x91" +"IB\xb1\xe5\xb3\x8b\xd3\x2\x86\xe0\xa8\xb3\xe4\xa4\xa0\xc2\xca\xbc\xee\x19\xe2z\x6" +"mk\x8f\x92:\xe3K\x82\xbc\xfc\xd7s\x8d;Mh\x7`\xc1t!n\xa7>\xf0\x36&\xcc\x1c" +"\xfa\x36\x9bV@\xc2=v\xa6\x9d\xce\xe8\x38\x1c\x65\x93,\xab\xf3&,\x8bp\x12k\x9a\x1b" +"\xb7\xe5\x85\x96\xcat\xc9\xb7\xe9\x1c\xa3\r\xa0\xf&\x9f\xb3\x85\x86\xb0\x46\xe8\x94" +"__\xe3\xf4\x96\xa7\xb\x14\x12\x31\xd5Vk\x1ch\x8d\xf5*R\xa9\xf\xe6)z\xb4s\xa2\x83" +"\xa4K\xc7\xc9\x8d\xe1jM\xc5\xf1\xb0<\xda>\xe1M\xbd\x8br\xb0\x18\x85y!\x9\xb2_\xd8" +"\xec\xfdk\x13\xd2s\x1d\xe7\x6}\xfc\xeeR\xe2\xc0\xab\xb]\xdc\xa7\x96\x13\"\xf9\x19" +"&6\x17\x63\xb8\x93\x1_H\xeegG\xf0\x1\x1fiQ\x18\x65s$\xab\xa0N\x86\xf4\x1d\x9b\xcb" +"A`\xac\xea\x9a\xa6\x36Z\x1c+z\x18.\x7\xf2\xc5\xd4\x81\x90t}rwv9\xba$l\xaa(\x4\xaa" +"<(\xa7\x18k\x1b\xf9\x8d\x99\xe6\xa8;\xfeJ\xc6\xf8H\xeb*Xp\x1d\x13\x89\xaen\xd4tf" +"p\xac\x62\xea,\x9\x9e!;\xa4{m\x81(\xea\xd9\x8a\xf1gi/\xad[?\x8e\x44$\x92\xe7\xa8" +"\x9d-\xf0\xa0\n:\x11z\xf0\x86\xf5\x1^C\xb5\xa5jP/)2\x9e\xca\xe4r\xdb\x8f\x96=\xbc" +"\x89\xa2\x38\x31!H+w'\x1f\x8b\xf2JQ\xeb,\x8f\xae\xf5\xba\x41\xd1t\xb8Z<\x89\xdc\xb8" +"\n][\xcb\x85q\x97\xaf\x86\x37\x41\x30\xe0\xe7\xa9\xba\x42^\x8\x1b\xb1\xcfm\xbf\x87" +"0\xf2\xa4\xab \xae\xf9\x64.\xed\xbc\x8W\xdcO\x81\x85\x4\xd8i1%sA\xee\x80\x43!\x8e" +"w\xdb\x94&\xb4\x83\xd9?\xf1\xc2\x1\xc8\xb1\xa7\xad\xe2\x1f\x92\xf1\x9e\xfd[\xb6t" +"A6\xcb\xad\x10#un\x10\xc1\x7\x18\xe9tY\xbd\x1b\x5\xc5kt\x1c\x99'\x80p\xba\xcbt\xb7" +"\x7\xab\x92\xa7\xa8g\x99\xc7\xe5\xb3.p\xe3\x8d \xea\x38\xf6\x8g\xa9\xc1z\xb3\xe3\xdc\xac\x7f\xbe\x5\x42\x9e" +"\xbf!i\xa8\x9.{\xc\xc9\xb8$\x0zz\x11>\xe1\xa2=\x8d\n\x62nna\x84}\x2\xd9g\x9f\x94" +"V\xcd~\xcb\x1cqX\x9e\xaa*\xecR\xe3\xa4\xf8\x18\xc7\x8d\xd4r\n>\xa1\x36\xf8%k}\xcc" +"\xa0\xaa.$5\xf0\x33.\xe6\xe2\xb7\x19S\x82\xc6@\xfd\x9a\x1f\x15\xa2\x64\x86\x2|\x4" +"3\xed\xb6\xea\x13\x46\xce%\x86)\xad\xaf" +"\x93\x16\x1$\xb5&\x10\xab\xb7W\x8c)\xc0\xf3\xff\x83\xb3\xe5%t\xf2\xbc\x94\x96\x4" +"\xd6\x35\xc0Z\xd2\xad\xa4\xd0\x17\xa8K\xc\x83\x32\xc0\xab\x91\xc3 C\xdc\x42\x11\xfa" +"\xff\x9\x9\xe7${\xe7\xce~r\x6\xc1kv\xb4\x63&\xbb\xe3\xd9z\xbcP\x99\x16\xe7:\xba\x81" +"\x84s\x90\xe0:\xcaz+\xae!#f\x8a\x64x\xd2\xb5O\x12\x7U\x9d>\xdc$\xf1<\x9b\x92\xa8" +"\x8b\xf6w\xe3`%\xb8\x41\x43^\xc1\xfd\"\xe3\x1\xdd/\x7\x8\x92\xf3\xd6z4\xf7\xa7\x9c" +"+}S\x8,\xc6;\xc6\x64\x16\x9b\x32\xef\x7f\x10\x30s\x8dw\xab\xc2\xdb\x30\xb1\xb2\x41" +"\xdeP0^j\x9c\x19\xb9\xd2O\xdd\x85\x9f\xb8H\xbdzQ2)y\x85v\xfb\x9d\x9ds\xea\x96\xfe" +"\xf2\x82\xc5\\\xad\xb6\x9d\xfa\xc9\x9e\x61\x14\x5\xa2\n\xf6\x44\x87\x15\x9b\x66\x37" +"8\xe9\x18\xb1~\x14\xf8p.\x94rZQ\x1e\xbf\x1f\xd9\x99\x8evB\xe8\xc6\xfc\xf6\x18 \xca" +"\x87\x11-\x1b_I\xfa\xa0\xcb\xfe\x85\x34\x1d\xf9\xa6\xd2\x9a\xb6\x31\x38\xe3:\xa0" +"\xbc\x84\x6\xeb\xa6\xe9\x84]\x1\xd4\x41T]\xd1\xec\x9a\xa6)x\xaf\xd3LM\x8d\x8\xd3" +"\x99\xcaQv+Q\xfa\xb6\x98\x42\xf6\x8b\xec\xb6\x9a\xad\xd4\xbd< \x1z\x94\x11\xbf\x92" +"M\xe0\x16\xf8\xb4\xc7\x7_\xeb}\xce\xe4t\xa0y\xab)\x0\x35\xb/\xeav[h\xe5\x9e\x3\xbf" +"\xea\x93xG\xa2\x10\x88\xee%\x19\xb0\x9bI\xb3\xa8\x8f\x10\xbb&\x87\x1a\x9\xd6\xec" +"\xae\xd6\xf3\xb1\x38'2\xfa\xae\xd0\x42u\xb4\x9e\xe1|gM\xfd\xedN\x1c\x82\x98\xb3\xfd" +"!\xd1\xfeG\xd7\xd0\x1V\xc3(sdU\xbc\xd1\x32IpI;\xdb_POi\x1a|\xac\xc6\xf0\xf7\xc1*" +"8\x86\xe6%\xfdX\x82>\xb9\x1cI\xf3\x8m?\x93U{\xdd\xfb{\xb0\x8d'\xf5\xca\xd8\xe5s\x95" +"\x7\x1f\xbb\x8a%|\x95\xdb\xb9\x94\xe1\x88\x8e\xfd\x2\xe0\xc7\xa1,\x5\xc0\x30\x44" +"\xc5HFF2z\xfc\xa6\xd3\xd6\x88+\xf5\xe8r\xf3\xf4\x94\x39\x8b\x88\x1fP\xf8\xf9\x9e" +"\xa4u\xe8\xcd &\xee\x2\x81\x98\xdf\xd7H\x8d\x96\x1f\x8e\x80\x16\xa5k(\xce_}\xef\x36" +"\x8d\x9$\x85\xe5\x97\xcb\x6\xa9\xc2\x35\x0\x3\x95\xdd\xe1\xc3\xcb\x95\x1a\xf9l\xa4" +"G\xa3I\xcf\xe6\xaa\xd3\x99@W\xf3\x39\xa9\xffI\xcc\xd1m\x91<+\x1\x16\x65\x15?F\xeb" +"j\xd4:\xed\x8eHGdj\x88\x42{\xc6\xaf\x61\x8\xea\x80\x37\x89\x11x\x9b\xae#\x1c\x89" +"\x8bvH\x9d$\x9ere|\x1b\x88P\x6n\x97\xe6\x63\xfd\x86\xeape\xc\x84\x97\x98u|\xab\x43" +"\xfdl\x97\x33\xc2\xad}\x9\xde\x36\xb9\xc6\x8\xa4w\x1pEU^B\x4\x99~\x85\xdf\xa6\xee" +"\x8d\x1b&\xcf\xc\x80$\xe2\x95\x97I\xe6\x10\xd0,\xad!\x8di0*\x8bJ\xd3\xf6\x88\nUH" +"\xe4\x11.\xb5P^\xba\x2\x1b\xb0\xb\xec\xa2#\x14=t0\xd6R\x1c\xa7<\xf7\x89x~\xdd\x1c" +"\xaajd\xaf\x4Q1\x19L\xe5\xcc\xd4\xfa\xe5\x4\x1d\x1azoY\xdc\x8a\xf2YYGR\xfa.9\xa5" +"\x8e\xa6\x34v@\xa3\x3O\xed\x9\xbd\x85\xbcR\x13\xfcv%\x9e%\x86\n>\x8c\x45\xef\x15" +"\x1d\xaa\x84\xc3\xf9\xfb\x95\x1e\xc6\x36\xe1\x42\xf7\x84XW\x13X\x90l\xe3P\xbcL\x84" +"\xc9\xf\xb0\xe7\xc3\x66\xcaoQ\xca\xba\xafo\xf\x96tu:j\x97\x31\xd4\xa4\x93\xfa\xb5" +"\xbfTJ\xc6\xf0\xe9\xfd\x1e=c\xce\x12\xcd\x37Y\x91J\x19\xcf\x9cY\xb=A\xfa\xa2G\xca" +"\xc5\xc3\xb7\\\x64\xbxc.)\x93\x63x\xfa\xd6\x9fS\xc5G{\xbez>\xc0\x1\x94\xcf\x1\xb6" +"\xb4\xd1\x8b\xe7\x13/\x2\x46'\xc5\x93'>\xa9\xac\x13GD\x7\xfa\xf0\xf3#\"r\xd7\xa9" +"\xc1\x31#j\"\x9b\x1e\xc2\xa8/\xc1\xa7\xc2U\xa8\x1'\xb\x11\x39\\\x99\x42]Z>Y\xa6\x97" +">\x88\xbfz\xd7\x43:S\xa9;P\x8c\x99\xf\xd5\xdd\x14\xd8\xab\xfb`\x7\xf5t\xd7\x18\xda" +":\xaf\x86\x30\x19\x91\x86\xea\xb5\xba\xc3\x97Xzm\xa9\xed.\xa6\x63J\xaf\xca\x34vg" +"Q\xbe\x83\xd8\x61\x39\xcb*-\xbd\xbc\xe5~\xff\xc5$\x13\x38\x9e\x88\xf6\xb7\x9e\xba" +"\xb3\xd1\xd4\xf4K+\x9d\xa8\x64u#/\xe\xf8/D\x85Y\x81Wb$\x5\xd2\x44,\xd5\xdah\xf9\x92" +"\xb4t\xa4\x84\x45\xc4nT}\xff\xaf\xa5\xf9\x8c\xdd\xb5~q\xf1\xea\x9b\x96\x31\"\xa1\xab\x39(\xbf" +"pk-\x85\xd5\xb8,\xffn\xbc\xd4\x36Kv\x19\x87\x19\xc2r\x8d\x18S\xd0\x19]^t\xd4\x88" +"\xce\x61\x9f\xc1\xb\xbf\xbd\xcf\x13N\x1d\xed\xa3\x12?V\xf9\x96~C\x95\x84\xbf\xb2" +"t\xc4\xd2)\x9at\xf2\x41\x5\n\rwW\xa4\xbc|gK\x84\xca\x45\xea\x4N\xdf\x64K\xf8\x89" +"\xcb\xc2\xcf\\\x8d\x1e\x82\xb2[y\xez\x8\x0\xde\xe0\x6\x9f\xf4\x4\x18\x1a\x87J\x9c" +"\x8c,n\xb\xbe=\xe5\x13N\xc4\x9e\xa8\xdbn\xc\xc7i9\xe9\x93\x80n\xb1\x8e\x1bM\xa5\x18" +"\xf5\xad\xaf\xbc\x84\xbeHI\xad\x39y\xd2\xf4\xaa\x17\xc6\xd7\x39\xca\xe~\x14.4'\xa9" +"/\x9c\xe0\xcb\x9d\xed{\xd5\xc1\xfe\xff\x38/\xa7J\x8_\xdd+\xe7\x1e\xa8\xe2\xf4\r\x99" +"\x6\xd0{\xd8\xe6\xc8I\xf8\xbf\xb9\x6\xfby\x9e\x1\xab\x83\x39\xf6\x85\x45\x44p\xfc" +"\xb1\x39\x14\xc9\x15\xd8\x13\x63\xaf\x82\x8d\x46\x83\x8bh\xb0i\x0\x6\x9I\xca\xf6" +"k\xf1\x43?FD\x9e\xe4\xb3\x9d%\x9e'\x89\xedt\xcb\xf1\x63\x64\x61;I;t_\x97\x33\x16" +"\x93kKV\x8e\x61V\xb3k\x1cO\xef\x9&Q\x8b\xe0\xf5\xac\x86\x5\xed\x1e,\xb6\xe0v\xd7" +"W$\xa9\x64\x9f\xd0\xa0\xc0\x9f\x19\xe9\x33\x65\xb3H\xc0\x1f\x66\xe4\x92\xc7\xf1\xa0" +"\"_^\x96\x93\x8eh\xfc\x8e\xa3=\xaf\xa8\x9f\x10\xeb\x16\x8\xb3|)\x3\xf6\xff\x36\xf9" +"\xc5)\xef\x32\x94;\xf1\xc3\xcc\x6\xd2\x18.\x9d$H\x82\x89\xe6\xb8k\xae\xfdw\xaa\x61" +"\xca\xe2\xc5\x5t\x87\xbf\xc\xfa\x62\xfc\xe0\x9e\xb8Z\xf8\xb0\x30_\xbe\xb2\xfd\x88" +"\xc6\x9a\xc5\xe1\xbf\xcb\x9d\xe7/\xcdZ:\x4\xf8*\xc8q\xb9K\xac\x8eO1\xb8\xf8\x9f\xdf" +"\x17rU\xb1\xd6\x93T\xf7M\xb6\x98\x44*N\xa1\xd8\xeV\xf5\xbeh!\x93\xe6\xb+_\x1d+\xd5" +"\xc3?\xd1\x84\x9c\xfd\x19\x7\xc7\xc8\xae\x10\x1c\xfc\xd2\xca\x43r\x8c#\x80\xd7\x1c" +"\xdd\x63\xb9\x33\x86UR\xb6\xb9\xf9\x98u\xd5\xa7\x37\xd6\x82\xc7\xe3/R\xa7\x95\xb1" +"\x8e\xfd\nO(\x97\x7\x92\x61\xef\x35\xa1\xea\xb5~=\x94\x96\x1a\x3%\x61\xf5\x86\x84" +"\x90\xa9\xe3\xb9\xc9\xe6\x3\xae\x97Z\xc3j\xb9\x84\xbc*(\x8c\xb6'\x1f\xc8\xce\x7\xd0" +"A\xfc\x95\x8ezn\xebL)\x18.\x83\x9f\xcf\x97\x91\x63\x1b\xcb\x0\x8fm\xb5\x9\xb0n\xd8" +"6ZW\xb5\x30\xc1q\xf0p,\xcd\x8a\x94|\xa7\x90g\x8c\x9\x1f\xe4\x9f\xae\x7\xfc\x45\xae" +"\xe1\x11\xe7Qn\x8a\x8e\x96\x35=\xf8\xbf\x43\x6\xaf\x12\xba\xb7\x32\xad!\x1b\xe8\xac" +"\xa4o\x92p\x1b\x8c\xe9\xb+\xa7L}\xcb\x8dr\x86-\x87\xae\xe5\x39\x1f\x5\xc1\xf5P\x5" +")\xb9\xc5\xf7\xb\x99\\\x61\xd1\x63\x83\xa6\xe7\xc7K?\x6|\xc1\xdf\x9f\x31\xca\x80" +"\xd1N\xd8\x17\x30\x12\xb6\xf4z\x7u\x7'i?\xb\x6\xcc\n\xed\x11\x84$\xe2\xd8\xcb\xfd" +"\x1\x97\xfd\xc7\x95\xeek|:TKA;\xa7J-\xda\x80\x8d\x36ZthCr7gy\xb2\xed\x46\x81]MK7" +"\xe6\xe5\"\x1e\x36up\xcc\xb7\x9eM:\xbb\xa7\n\x32\xf1\x6\x8b)\xb8\x1a\x98\xc\x9fX" +"\xb5\x91\xb3\xd1\xff\xd9\xec\x1a\xbd\x9c;`\x95\x18\xeb\x34\x15\xd1\x11Y\xd5\xdb\xb" +"a\x84&g\xed^\xc1.8\xce?b\\W\xbc/\xc8\xe5\x15!2W\x8bj\xc7&o\xef\x82\x39\x12\xcc\xdd" +"MF\xaa\xa7\xae\x96\x1d\x4\x14\xa7\x9dh\xd0\xf3\xd9\xb0\x65\x11\xce\xc9\x5\xa4\x66" +"T\xf\x38\xe1\x7\xa2\xedp\x93\r\xc4=\x0+\x98i\xcb\xc1wN\xa3\xad\xca}\xc9\xb6\"J\xd9" +"\x9ckR\x98\n\x9bk\xe\xcaY\xfd\xae\x1a\x1_\x14\x2\xe2_\x97\xc7\x85\xf7\x80\xd6\xa3" +"\x98 \xf9\xe9-\xef\xa6\x61\xde\xffrh\x11\x12X\xd1\x37\xe8\xed!\rL\x1a\x4\x34\x6\xd1" +"\x8e\x93\xff\x65\xe3\xa3\xbf\x37\x37u|\x1a\xb0\xf5-\x91\x45\xf1\xa1\x93\xc6\xe5!" +"j\x2\x35\x62T\xb6\\r^<\xfb\x38\x10\xcf\xb2\x0\xc\x93\xc1\x81\xa5;\xc4\xb1i\x1#=Q" +"\xbd!K\x17\x8f\xd3\xb1\xa3/\xe6\xe5\xd0t\x0\x6\x1aJs\xa4\xd8<\xd3\xe5\x9a\x98\xd1" +"\xda\x1eN\xc8\x98k\n\xd3\xf9\x95RRR\xd4\x44\x1a\xf9\xd0\xd4}\x82\xe6RY\xcaX\x7f\x1d" +"q\x8b\xd3\x81X\x99\xf7\xa6\xe4\xd5r\xc9\x96\xf8\xf6&\xdf*\x9c\x9b\xb8\xfb" +"\x1b+\x96\x85W;\xda\x32\x9d\x9dMk\xb7\x2\"\x41O\x1\x2\x61\xd1\x31\xb4\xd2\xa5\xe6" +"\xa0\x5\x98\xc\xc2\x8f\xff\xf0@P\xcc\xf1\x66\x19\xaf\x7\x85\xe9\xc)@\xb7\xfd\xe6" +"\x8c\x18PXV\x1d\x1b\x33\xf8\x9ew?P\xba\xce\xea:e\x1cg\xb0\xc9\r\x0\xbd\xcb\x65\xe3" +"\xbc\x14\xf4_rE\x8b\x0Q\xf\xa6t\xc4\xd3r>\xed\x99\xe3g\xbb\xf3!-\x83\x90\xed\xb5" +"\x8e\xa4\\\xec*\xfb\xb2\xdd\xb5\x9cx/\xbd\xb6\xcb\xd8\x45J\xfc\xaa\x1d\x5\xd9\x1b" +"\xd4\xb3\x95\xc5\xdb\x8\x66\xa7\x4+SH4\x1e\x98\xab\xd6Ps\xfd\x82,\xb2\xe\x36M\xc5" +"R,|\xaa\x10\xd0\xdb\x38Y\x9b~\xab\x8fx\xfa\x87\x8e\xdd\x87I2\xdc\xbfr\xb5\x8f\x17<\x14):\xf9\xd1\\\xb2\x31z\x10<\xa0\xeb\xd0\xbc\xa4\xf7\xaf.\xf9\xed" +"Z\xc3\n\x7\xbb\x85\x93'mR\xa8\xba\xf3\x98\x83\xae&\x13\x61)\x90\xee\x63\x1a\xee)" +"\xa9\xfd\x87\x8dl\x98\xaax\x1f\x9b_gB\xe6\r_\xb0$\xca\xa4\xbf\xee\xd2\xbe\xe\xc6" +"\xd1\x98\x93\x17\x1d)\x96\x1f%O\x7uZC\xbe\x1e\xb3i\x3\xd8\x2\xc\xd2\x63\xd0\xc4\x33" +"c\xa6\x8d@\xfc\xd6\xd9\xb3!\x85\xdb\x9a\xbf\xe1T\xf3W\xba<\x19\x43\xb8t\xcf\xb7\xde" +"q\x7K\xe8\xf1\x46\x99\x93~\xc5\xe6\xf\x61\x99\xf6\xab\xc\xb8\x12\xc7J'\xa3sK\x8\xb2" +"\xabZ.\xc0\x93\x46\x4\xdf\x87\x91H\x6\x45\x4`Z\x4\x81\x63\xf4,\x1b\x86}-\x10\xc9" +"\xd2\xe6\xa3\xe2\x93\x8f\x9a\x1a\xb0P}$ %wBw\x7f\x62\x1f\xad\x9bH\xec\x9c\x1,\xef" +"t;\xe1\x1d\xd7\x3$\xb2\xae&bJ\xf8\x19\xeb\x30\xcf\x39\x95\x32\xedw\x8b\xa9\xea\x1c" +"7A\xed[\x19k^\x13\x37\x86\x15\x1f\xd0kD\xe9\xd4G7\x85\xcau\xaa\x15\xdfy\xcd\x15\xc7" +"G\x9b\xd6\xab\xc6\xd1\xa0\x31\x86<;5\x4o+\xd4Y\xbfw\xa2.\x97\x81\xd0\xe7\xb3(\xdc" +"-\x1e\xfb&\x9\x39\x14Z#\x1\x96\xe8+\xd5\xa4\xa3\x38\x9e\xf\x1e<\x1c\xa2\xa2\xf0S" +"=\xd7\x93G\x8a\x9b\x16w\x90\xd0@G&b\x6\xd5-t\x84\xcf\x42I\xed\xca\xb4\xb9#\xd2\xd9" +"R\x85\x84o\xa9\x8e\xfb\x9b\xbf\x86\xb6 )\x87T\x92\x4\xac\xa0\x41\x13\xed\xb9\xec" +"Q\x1d\"Y\x1U\x8\xad*1)\x1\x42\xc1\x92\xf8-\xd9HL\xda\n\xb2o\xc8\x96j)^i\xa4\xad\xf7" +"n\xd0l\x85\xc5\xb8\x4\xdd\xad\xd8\x11\xdbTA\x90Z\xc8\xb3jP\xa2\xffu\xd5\xe1\x64\xb4" +"Qz\x93\xe9ws\xf7\xa4V\x7\n,Z\xd3K\x7fz6\x16CK$\xb5\x98-e7e1\x3\x44M\xad\xa7t\xc6" +"F4w\x7:\"@\xfc\xcf\xa6\x43K\xe5\xee\xa1\x7f$\xfc/\x80&\x8b\x83]<\x97nd\xc2N\x8b+" +"\xb1\xc6\xf5\x16\xf1\xb]\x85u\x99}k\x8a\xe1\x4\x62\"\x1e\x1a\x87-\xde\xe2\xfa\x9e" +"E\xcb\x87#\xd4\xd6pl\xcc\x5@\x1d\x35\xb2\xf3\x19\xd7\x33\xd3r\x96\xce\xe1\x11\x3" +"\xa3k\xd1,\x18\x1a\x8e\xeb\xc6w\xd6\xc3\xfc\xdf\x0\x35\xee\xa5\xe0\x1dS\xf6\x89?" +"m\xa4J\xf7\xe4?C\xaf\xbd" +"\xc3\xc6\xdar.\xcf}\xb1L\xd4M\xdc*\xfa\x37\xbbT\xc4\xaf\xb0\x86+\xe1\xbd\x9c\xbe" +"\xa9`\\\xb9\xb5v\xf4\xa0|\x96\x37\xd3\xa4\x9a\x16^6\xb8O\x4\xb7\xcc\x18\xfbyc\xe0" +"L\xbbu\xe1\"GNt_\x16p\xec\x9f\xd4\x42\xbd`,\xf8+OW)S\x9fJa\x96\xb0\x9c\xb7\xfeJ\xd1" +"\x14\x7ny\xfd\x9b\xa3t\x85\xb0\x9c\xa6\x9e\xa7\xdf\xafO\x2\x45\xfd,1\x6\xf\x13\xc9" +")\xcf\xad\xeb\x19\x37\x9\x37\rsAd\x91\x6\x82\x3\xcb\x8\x39\xd8\xf8\x84\xc9x\x18\xe4" +",\xbd\xcf\x31\x96\xb9\x88\x33\xdf\xc2\x1cRTQ\xbc\r\xde\xa5nP\xe5\xeb\x87I\x1a\xfc" +"\x80\xb6\x1c\x63\xd1\x63t\x2uY\xa8\xb3\x84?Er\xe9\xd7\xb1T\xd2\x85\x11=\x1a\x12." +"U\xf7\x6\x4t\x85\x6T}W\xb9\xee\xb3\xab\xcb\x38\xc0pD\xc8:2\xa7\x12\x34:\xa5w\xdb" +"\\D\x1h\"N\xc4\x35\x97\xc8'\xd1\xce\x64\x1c\x83\x0\xc5\x94\xfd~\x6?\xaah\x8b\xb2" +"X\xcf\x46wZ#\xf7\x39\xc0\xef\x93h{RJ9h)\xf1\xfd\x1[\\\xa2\x9a~s*\xec\xb4-\x6\x90" +"\xf9\x99\x17\xa1\x90/S\xe4\xa1\x88\x9bT\xdc\xc9\xab\x1d*J$'j,\x9a+\xc1i\xf9*\x89" +"\x6xu\xb3YL\xec\xcfq\xb8\xa4L\xcb\x6\xb7\x4\xfeG\xd4\xa2!u\xf1\xa0\xa3\x8f\x34_~" +"n\xb5}\x5\x9\x8c:\x4,\xcc\xa2\x64?\xd0}\x8fn7'\xdc\x13G \xe0\xbc\x62\xd9\xa2\xb0" +"\xd4\xf3\xf5\x94\xe3\x63,w\xbd\xc7\x92XG3H\x18\xbc\r\x8e\x16\xff\x9d\xa8\x44=\x96" +"\x15\x83!\xa8\xc2\xa0\xdb{\xd3|\xaa\xae\xdbU+\\\xe\xfc\xa9\x44\xa2-BGQ\xe1Q[gPL\xd9" +"]\xd5\xc6\x8fM!\xbf\x43j\x86@\xe8\xed$\xe\x8e\xcf\xcb\x43v\x9d\xb2\x1\xc}\xe7\x95" +"rw\xaf\xc6\x37[\x14\xc1S\xae\xa9\xec\xd1\xf\x30x\xd0*\xa9\x8d\x1e\xaf\x8e\xeb\x63" +"^\xbb\x7\x18\x92\xe9\xc3LF\xbeo+\x1e\x98w\xd7\x15H\xb\xdc\x9\xbar\x7f\x96\xbc\x84" +"\xb3\xe9\xf\xea`]\xc6\xae\xc1:\xf3\x87\xd0\xf2\x10\xb9\xd7\xb1\xb7\xe0\x4\x1e\xf6" +"zU\xedM\x1f\"\x36\x66\xfb\xbb\xab\xe9\x41\xc4\xf2\xc4m\x17\x88\x63\xfa/\x2mgx\\\xb1" +"\xd2\xdf\xf8\xc2\x32\xd1S\x95\xc8]\xc6\x8c\xfa'\xfdT%\x89\x39\xd0\xc3J\x9d\xcc\x46" +"\x16\x15'C\xf4\xcx\xbc\xf0_\x2\xba\xf1G\xbf\x9b\x87!k\xcf\xd6\x44V\x8cP\x18!\xaf" +"\x80WxiL\xd2\xef\x0\xfaL\xcd}/\xb1_\xa3y\xc2\xc3\x42\x65\x62\xcf\x11\xa6\xacq\xb0\xdb\x7f\x99\x8f\xe5@\x81\xc6\x37\xa7" +"\xe8/\xfb\xae\x30\xe8\xc0\xadL\xb0_\xc5\xb9!\x0\xe5_\xae\x9c%%#\xa7\xb2\xa7\x9a\xbe" +"\x9a(\x8e\xcco\xf0\xaf=O\xea\xeaz\x9\x93\xf\xb8\x81\x10<\x83\xcc\xad\xbdr\xa3\x8c" +"tp\x85\x44\x95YX\xc4\xf0\x1f\xf9)\x92\xa2\x93\xcf\xac\xfc<\x87\x65\xc3\x44.\xb8\xca" +"\xb0\xf8r\xdd\xefr\x2\x62\x7f\x33(\xd1V\x1e\xef\x39o6\xaf\x15\x0\x0.tcH\xd9\xdb\"" +"D\"\n\x9?'\xad'l~\xbe\x9b\xce\xe6~hg\xe3\x9c\xe\x1aV\xb6\xcc\x81\x88\xc0\x8f}\xae" +"\xaa\x39\xa2\\`\x1e\xaf\x81\xef\x65\x81\xc6\xa8Vu|_\x8eJ\xe8\xa2\xf2;\xd0n\xcb\x1" +"8\x3\xafy\xa9\xde;_\xb0\x3\xce\xfd\xb1*\xb9Y\xe9\xc9\x46Q\xe2\xcf\x14\xac+\xe8\x86" +"\xd9\xd9\x2'P\xe3\x85G`Iv\xb4*D&\xf4\x1e\xb3\x8e\xf3\xa1\xdd#\xaa\x94\xd4l\x9a\xed" +"\x97y#\xfc\xa3\xe9\x84\x19\x98-r\x90\x7\x1\xb8\xfb\xf9\x9c\x2SI\xa8h\xc4\xff\xc4" +"XE\xd6\x46k\xf4$#/\xf2\x98\xcaP\x1f\xffS\xca\x2\xfe,\x91$l\"6\xb4\xf2\xf\xb4\xbf\xbc\x61\x88v$\xdc#x\xd8M" +"\x1f\xc5\xd3ys\xe2\xfc\x84L\x87\xc5\x8b\xe5Y\xd0`\xb6\xf0M\xcd<\xd7\x11\x95\xf1i" +";\xb5\xcd\xc9_?\x1a\xb8k\x8c\x18\x65\x61\x92Y/\xd0\x45\xbb\xfd \xb7\xaa\xd6\x91\x39" +"\xe1\xad\xa0\x37\xa5u\x3.Z\xd0\x19Rz\x95\\X@\xe7\xcf H\xc6P\x90\x1\xf9\xe7\xa0\x14" +"\x90!4\xaf\xf7V\xff&Eu\x94\xc6o.\xb9\xe4\x1e\xb0\x18,g\xee\x5\xb6\xca\x1u\xb6\xa9" +"7\xdc\x86\x43o\xa1$Nc\xd6\xa6(\xbc\xd9\xd5\xc2\x83>-\xf6\xdd\xea\x7\xa6\xf0m^&,P" +"\xef\xd3LN\xf0[A\xb1HF\x94\x92\x15\x12\xf7\xde\x93\x33\x7f\xc1\xb7v#\x6\x1e\x16\xd0" +"G/7\x80\xdc\x9a\xf3\xf8\x39H\x82\x1e@\xd1`\x8f\xb9\xfd\xd5\x38\xf6X\x83\xd5q~\xe6" +"'\x8fG6\xa0\xc0\xc6\x62`E\x82w\xf2\xb2\x85S_\x8d\x8cg\xe5\xdfR+\xc9|\xb4\x89\xf8" +";<\xad\x0Y\x96,H$$\x6P\xe1\x9\xeb\xf1\xc4P6\xdb\x87\x86pM/t\x93\x80\xedo\xd8\xd2" +"\xff\xe9\xd9w]\xddX}\xdc\x8c\xf2\x1c\xb7\xa1\x19\x9z\xc2\x66+\x9b\xf8\xb3\xffr\x1c" +"\x8a+\xfc\x37\x9aH\xa2\xca\xb1\xe0\xa4\xc7\x90\x85M\xd8\x6\xff\x8c\xf8'\xfe,\xcf" +"\x4\xfd\xb3\x9b\x9e\xb3W\xa0l\xd6~%\xf3\x1N\xae\x9d\x7\xce\xed\x88\x85Re\x19s\xba" +"\xe2\x7-\x95\x1e\xd1\x1a\x1c\xc5\xdc=\x10\x17P\x1cI1\xe1\xbdr\xfe?\xf9=\xb5\xf7\xa9H\x6\xd7\x63" +"\x97\x8a)0\xa6\xe3\xcd*\xce_\xea\x4V)X\x3\x39\x95-\xf7!Y\xd8k\xee\x84\x9b\xe3\xd5" +"\x96\x43*\xe\x31\xed~\x8a\xb6\x36\x44\x84'H\x9d\x1\xe4\x46w\x1a\x33t\xfdNQ\x90\x62" +"\xc2\xcf\xb2|\xdb\xb2\x43\x9\xf\xb7\xf\x94\x2\\\xaa\xdb\x4\x8e\x62\xa3l\x87\x9f\xe0" +"\xb5-\xf\x1b;a~\x6\x11\r\xe5\x10\x61\xcc\xce\x9f\xfb\xe3{d\x95r;\xc9<8\x80\x8d\xc" +"\x1d\xa6\xcbQo\x82\xcf#\xc2\xa9\x1a\xab\x97\xcb\xa9t\x18\x10=\x84~C\xc5\x4ZS|6u\x4" +"\xce\x1a\xc6\x13\x8f\xea\xe1\x9a\x61Y\x89\xe3\xae+t%]\x9d\xec\xeeo\x9e\x9f\xcd\x65" +"\x13\x9b\x82\xfe\xc3\xc3\x62\x87\x44\xe\xf3\x94K\xbbN\r$T\x9b\xce\xdc\xe5\xb0\x88" +"C\xf\xae\xdf\x97\x6\x35w\x1e\xffrmL\xfd*\x9b\x64\xe5k\xb1s\xb\x9e;\x3\x98\xaf\xd9" +"\r\xd9\xc1\xea([\xc3\xee\xf9\x18`-\xd6\x66\xf3??\xd1X\x16\xe0\xe9\xdb\xe6q1\x16\xc8" +"\xb9xL\xfb\xb3\x9f+;\xbd\x8e\x9e:?\x84\xce\xee\xc3\x97\xf6\"tT\xb^ \x8ch\x91\xef" +"*~=\xebSVa\xeb\xdf\x9az\x98\xf3]k\x99\xf2=(\xaa\x38y\xca[\x9aN\nP\xa5\x97M-\xe\x14" +"/\xf0\xe\xe3Y\xea\x64\x16\xd9\x1c\xec\x8a\xb2\xcaR\x3\x1e\xb3)\x82\xce\x16X.|jkL" +"\xb7\xb4)\xadW\xaf\x9d\xcf\x94\xe3;o\x1a'\xcb\r\x7\xe0\x63Mi\x9el\xa7\xf4\xeath\x9b" +".\x13\xc3\xdf\x41\x91\x62wd\x8cN\x88\xdc\xf0\x8f(8\xac\x8$B4\xe4\xc6\xb0\xeaVP|=" +"\x9d\x43\x9z\xed\xbf\xcdj\x3\xd5\xe0\xb9P\xa2\r\xe5M\x18\xf8\xe1\xb3P\xe1<\xaf\xe3" +"2:\xf\x86\xa7/X{\xa9\xa1\x1aMLWe\xc4\xad\x10\xbc\xb4\xc3\x8b\x97\x1b\xfb\xf3+\x6" +"\x1ex\xc5Lq\x8b+7\xf7@*hw\x86\x86\xe7\xca\xc\xcd\x80[\xad%\x42\xd0\xed\x94\xdb\xee" +"\x1a\xa6N\xf9zwCio\x82\x35\xc\x12\x62\"\xf2\x17\xc1\xfaZ\xe0S\xa9+\x95\xb4\x80<\x1c" +"@\x15\xbeu+Y\x1d_T:\xb9\xc3\x88\xb5!\xa3\x1Q\xe\xc7\xfa\xd6\x46\xec\x17\xd0\xce\x83" +"\xd9.\xae\xea\xc8<\xf8\x8f\x45i\xf1\x86\xb+\x90}\n\x6\x31\xe3\x85\xf2\x93\x97\xaa" +"\x88\n\x14l\xc5\x16\xac\xd8\x9\xe5\x8f_\xe6\xfe\x89\xf2K\"F\x95\xde\x81\xfd_\xe3" +"\xa2\xcc\x64\xb\xf2\xb2\xfa\xaeP\xe9\x8\xa4\x36 }\xa9\x16\x92\x18\xd7\xe\xf8\x7f" +"\xd2\xb9S\x9\x82\x32N7\x7\x9ekD\xa5\x6\x41\xd5\xb3\xdf\x5\x8\xc4\xd3]\x87\x9dt\x89" +"\x10\x61J\xfeK\x81\xf\xbe\xf8\x17\xdc\xe1\xba\x41\xe5\x10\xf1\xb1\xc1\x14Q\xcc\xee" +"\xee\x8dh}~#\xeb\xd2\x42\x7f\x97\xf5\x84\xa2\x10\x9d\xc1%\x1f\xa8\xed\xfc\xf1\x37" +"3\x9d\xe3Q\x8f\xda\xe4\x9dqglwk&\xa6\xd8<\x99\xf7,F\x96\xde:WIL\xab\xa0\x63#4\xbb" +"T7\xf7Vq\x91)\xdc\xd5\x8d\x17`\xc7\x11\xa4\xf\xe7\xfeP|\x9a\xdf*Ze\x9c\x91\x8e\x13" +"\xaa\\\x1dtT\xf7|\x98\xd7\xf4\x8a\xed\x17\xdb\xeb\xac\x45G\xce\xd6-\xb\x18\x4\"{" +"\x1f\x17\xe9n\x13\xcdY(\x8f\xb2\xf3\x17\"\x0\xdf?\x14\xed{\xa8Z\xa0\x30\"\xa8\x61" +"\x1b\xb4\xac\xb\xc7\x9b\x34\xb4\x89\x30h\xe0w\x16\xd1\x63Zx\xa3\xf5\xe5\x83\xc6\xe8" +"Y\xb2\xa6\x46Y\xb8\x39xi\x9b\x88\x1f\xfa\x93\xf5?\xf5Y\rp\xb\xe8]g`Q`w\x83\x30\xef" +"\x14\xcf\x15\x89\x93\x90\x32\xad\xcd\xb7\xc3\x93" +"\x10\x96\xd4\x16\xe0\xb7\x8\x85\xb7\x80m\xfa\xd1\x30~!\x8b'\xdd\xfc\n\x8c\x32\x10" +"Z\xaa[b\xef\x81\\l\xa4\xdeN\xfb\x93l~\xcf*\xe7q\xf_\x10\xbe\xf2\x7\x38\x61\\Y{\x8" +"\xde\xc7&h\xfc\xf2m\xbb\x9a\xcdVY\x18\xf9\xed\"#\x1a\x80\x38s\x8d{UV\r\xb1\xd2\x61" +"#jd\xcd\xe;`\xcf\xb4\x15x\xdb\xa1\xaa$\x1c\xe7JT\xde\xcf\x38\xb5\xf6\x87\x45H\xe8" +"\"\xd4\xeO4\xeal\x8ci-\x18\xe4\xd1\x92.H\xad\x34\xab\xa0Hy\xfcH\xeb;\n\x80\x8c\x88" +"O\xe\x7\x38\x66\xab\xab\xbf\xc2[3L\xfa\xf4\xef\x43\xf7\xc7\xdc\xce\xc4\xd9\x87NF" +"0\x19Z\xa6_N\xcf\xca\xf1\xc3![67EV5\x94\x1byD&\x0\x36\xdd:cj\x1c\xbf\xa0\x2\xd9\x8f" +"\x15\xb8\x85\x12\x46\xce\x0*\xebx\xb1&/\x7f\xf6J\xa7\xbc\xb>\xeb\xc2\xd4\x63\xa4" +"a\x9e=r\x91%\xde\xbf\xc)t S\xcf\x94\xfep|7rD\xae\xchp\xceq\xfd\x95\xc0\xec\xa7;\xd1" +"9\x19\xbaq\x9c\x14\xd8\x8a^\x8a+\xca\xce\x8c\x96\x17\x16\xaev\x16:'e\xc3^iw3,\xcc" +"ik\x1c\x30%\x96\x37\x17o\xfb\xcb\xe1\xc6\xcb.\xef\x93\x31\x99Z\xf7\x2\x80\xcc\xe0" +"\x18W\xb0\xd9 x@\xd6\xdd\xf\x83<`\xd7\xd0\xdd\xb6\x9d\x1#`\x11\xfL\x96\xe6\xdd\\" +"\xbew\xce\xd6\x38\x83Q4\x16\xdd\xdf\xb9y\xac%\xf3zNM\x1d\x90\x11\xdf\xee\xaa'\xad" +"\x91\xc4L(\xf1\xd5\xf6\x98`cd\xfd\xf8\x19;\n\x4\xb3g\xd8\xa2\xc\x9f\xe8Z\x83]F\xa6" +"\x9d\x1cM\x10%\x2\xa4]\xa8\xbb\x96\xda\x9d\xb5\x38i\xd4=\xad\x46G\xe6\x31&\xf2\xc8" +"8\xc7\x5p\x97Y\xae\xbe\xa3?\xbf\xee\x44\xf7\xa1\x98-\xa6\xc8\x1f\xc7\xc1\xe5\x33" +"\x1e^\xa9w\x1a\x61\xe4\xe2\xd0\x13\x42\xa3\x8f\xe6\x80\x32\xb7,4\xed;Vj\x9bkS\x8b" +"O\\\xb6\xda\x9f\xa3v\x18L\xfb]\xa5\x42\xed#\x5\xdc\xed/\xcb!\xb0\x34Z\x1f\x33\xf1" +"/\xe8\x4\x90\x11\xadL_\"\x98nR\xa8\xb3\xac\x44\x65\x0w\xb6h\xfb\xce\xce\x86\xd8\x8e" +"\x8c\xcew\x1c\x1d\xc7#T\x15\x35!\xf5,\x9cg\x8d\xd8=\x9f\xa4\xf6\x9a\x1dW\xec\x1b" +"\xc\x91\xf2\xf\x30\xa6\xa1t\xbe\xb4@h\xbd\xd7\xe\xba)\x19\xe9\xae\x6\x19\xb1\xde" +"{<\xc9\"\x80\xf5\xa7K\xd6\x43\xa5\x61\xdc~\xac\xb2\x9\x1d\x12*\xbb\x1e\x38\x95qk" +"\x18\xd1\x46\x97Y\x93\xe6\x8d\xa3\xe1\xec\x61#n\xcb\xbbm\x9a\x1b[\xf\xe3~\xea\xbc" +"a)\x88\xbcg\xe9\xf2\xd3\xbc\x8d%!\x11\xe8Y\xafU.\xb2\x4\x7\xbc\xfb[\xdc\xe3\xdf\xec" +"\x19\x64\xc5\xa9\xe7m\xf6\x33\xa5\x8c\x0\x89\xcd\xbc\xf9\x7fi\x17\x37\x16I>\x1cU" +"\xbb\xa4\x8eZ#\xcb\xa3\xc5:\xdc\xc0\xaa\x9\xe\x95P\xc7\x1\x35Q\xca\xd0\xa2q\x6\x45" +"\x9e'\xb3\x12U\xa1U\xf\x8a\xccK\xe0L\xdf\xc0\xc8/\x17X\xd1xj\xd3\x9a\xe1\xe3\xdb" +"\xed\xb9z\xceG\xc4\x1e\xea|\xd0\x1e\xff\xc8\xdf\x9c-R\x13\xc9z\x16\xdc\x6\xa9\xc1" +"\xac\x42\xb7[\xfcv~bvu|\x4K\xc7\x31\xd3*\xf7\xcbj\xf3]*\xa9\x11n+U\x82\xd7\xb3%<" +"M\x8\x38+\xd6\xd9\xdb@\xbe\xa9\xbdW\xfa\xd3\xc4\xbe\xe0-\x87\xd6\xbe\xe0.\x18\xbd" +"\x1d\x8c\xc2,qM\x8c\xbewn\x96\x12P\x9a\xe4oQ\x16\x4,\x8e\x64\xd6q\x9e\x86Jt\x87z" +"\xb5#\x80\xef\x17}\xed\x7f\x12\xff\x89\x1a\xacp\xcd\x89\xde\x42\x45\x83\x16~u\xb3" +"Y\x80\xca\r\xff\xaf\x62\xd9\xdf\x33S\xf6O\x9>\xeb\x86\xedH6v{\xa4\x8d\x8f\xbf_\x1b" +"\xfa\xf8\x43\x13\xa8\x9e\xc4\xa4\x62,\x1a\x1a\xf1\xc6\x42\x9e{\x9b\xb5\xb2\x64\x39" +"\x9d\x90\x1f\x1d\xf3(\x88\"\xee\xa3\xe7\x19-\xaa\ro\x9e\x1e\x9f\xe\x9f\x9d{\x9a." +"Mc\x10\xd4\x38\xd7Ka{H\x15Yw\xc0\x95\x92\x32\x19\x8d\x1fI%,\xa5M\xd5\xbf\xe8\xb0" +"\x1ck=\xbe\x65\xb7\xa6\xa0\xdc\xb6\xecN\xf9}x\x80\xd9\x3>\x8a{^\xe7\xac\xad\x96\x8f" +"\xb4\xfdnB\xd8,F\xfU!\xc9q\x98%\x19\xa3\xa6(\xd3\x2i{A\xd5HL\xe8\x36\"\xf8\xb\xbf" +"nD&\xcbp\xaa\xe0\xc1\x64\xb5\xc3\x9\xa8\xfc\xa6\xee\xca\n\x80\x9f\x8e\xf0\x9d\xac" +"\xcc\xc6t\x82\x1c\x90\xa6\x17YV\xc5Nb6+\x85i\x85vI\xc0\xd8\x1c\xc3\x86R\xeai\xd8" +"\x8a\x34\xc\x83\x65\xafNL\x89\x5]\xc1Tv\x9f\xde\xb9\x63=3\xf6\xf4\xc1\x97iu\xadz" +"\xc9\x4\xe7~\r@\xb7\xde\xd2\xec\xb0\x95Y!\xf6\xdd\xe7\x99\xab\x85\x16u'1Q\xb\xac" +"\xe6\xc6\xc0\x43\xc4|\xeb\x61\xe\x17\xc9i X=\xc5\x93\x39W\xfa\x1b\x35\xca_\xf\xd0" +"\xe8P\xb1P\x83U\xbc\xfd\xfc@U\xb\xd5j\x99G\xdc\x94\x6\xde\x86\xd9\x4\xd2\x92!\xff" +"\x9$\xdb\x8d$\xa2\xb1\x98\x65K\xc\xb8\xb5\xea\xdd\x62\x93\xab\xb2\xba&2\xa5&\xca" +"8\xba\xf2\xc8\xe9\xd2\x97{\x1fs\xb2!?G\xb1Z\xb4_\xff\x99\x44\x7fTH\x9-\xec\xcb\x9e" +"\xc7\xe3P0\xf1\xe1\xe9\x80\x9c\xe9\xbe\xf6\x43L\\\xb5\x82\x39\xd1\xe4\xe4\x4\xcc" +"\xaa\x91\xfe\xa4\xef\xbe\x8bq.\xa4\x46\xc4\xad\x12\xc3\x14gE\x8d\xf6\xb6\xf6\x9d" +"\xa1\x31\x8c\xbe\x12M\x0\xb4\xaf\x87q\xaf\x41\\\xca\x1p\xe0\x14\xfe\x8f\x31\xa5\xe" +"\xef\xcav\x17\xb8\xce\xb9\xaaM\x9\x9a\n\xa9\xe7\xfe\xc2\x1bN\x9e\xfe#\xfd\x65\x34" +"Z?\xe6\x1b[\xa1\x36\x9d\x32\x4\xd6n\xb0\xfe\x9a< \x1b/\x1b\xfcTc\nE\xd2\xbe\xe2\x93" +"\xf0\xc4z\xdd\x11\x37I*\xba\xcb\x90\xa8sv\xe5\xbbIq\x9dJ\x2~@g\xbf\x30\\\r\x44\x3" +"\xe1;\x82\xe6\xb0\x93\xd5\x8c\x17\x84m\xe1\xd6p[t\x4\x8e]\xa2j\xc7\xd0\xab\xd2\xf7" +"\x99\x9e\x8b\xe6\xf2\x94\xb3\xf2o\x9e}Q\x2\xee\x96\xe1\x61\xb7\xc6\xcd\xa4\xb8\xd5" +"v\x9\x85\x1b\x62.\xae^\xc4\x81\xd8\xe9\xef\x87\xb2T[\xc1\xde\x8d\xae\xa2\x19\x2\xbe" +"\xd7\x14\xb4\x7f;Qu\xcL\xc5\x13\x80\x36\x90\xb0\x9o\xdd\x1c\x1d\xfe\xbd\xd9;\xec" +"\x88\xd1\x11\x8e\x30\xce\xa0\xf5\xb5\x8{\x19\x62X\xe2\xbd+*!\xbaI\x8aH\xbeY=9\xde" +"v\xb1i\xfb\x7\xffj}\xda\x84gR\xfe\x31]:\xf8\xdd\x34/k\xd1\xf4\xda\x62\x93\xa5\x81" +"\xf0\xc5\x90\xd7\xfb\x9eQ\xe0\xef\xd1K\x89\x1\xd5q:Y\x92\x9b.\xda\xff\xf6\xf3\x3" +"\x13\xc1\xb0q\xeH\xe1\xef;>\xbf\xda\x65\x38\xee\xa2[\xb7\xc0\xd5\x2\xf5.p>\xb6\xf3" +"\xf2w#\r47o5\xb7u\xd2\x17\x97\x94\x31\r\x61tWc\xfc\xef\xb5\x93\xe2\xde\xad\xc7J{" +" AJ\xf2-=\xc0\x43#\xf9\xba\xe2x@L^\xdeO\xd5\xccG\xcd\rV\xa1T\xf2\xf5\xd7\xbc\x62" +"$A1\xcc\x94h\xaeN)\xe7\\[\xfa\xeb\x19\xb\xd6\xe1\xeb\x8b\xbe\xec\x39\xdcmOL\xa3U" +"\xec \xfa\xd5\xf8\x1a\x91\"\x16\xad\xe6\x8a\x98@\xa6\xac\x9!\xb5(\xfcI\xab\x61\x9f" +"f\xf0\xee\x35\xfd|\xffJ\xe7\xbf\xbb\x34\xea\xbaOq\xad\xb1\xd8\xa2S\xbd\xac-\xa7*" +"^t\xe2W\x12\xe4\x36\xf2\\K\xc7\x32\x1f\xcf!#\xc4\x63\x7f\x46'\xd5\xeaw8\x0\xfcP\xe4" +"\x6\xfd\xa3\x93\x5\x33\xff\xbf\xa7\xd3\x87\xae\xa9\xe5\xc0$\xdb\x8e\x32\x9f@v ,\xee" +"\x11\xd0\x1c\x37+?\xd5\xf% \x8b\x39\xf8\x19#\x8e\x80\xa5h\xf5\x92\xe6\xbdwb" +"\xa8k:\x9cP5\xac\x1m\xacx\xf\x33\xae]kJ\x4(\xd7\xf3\xa6v\xb7@\x9\xd1\xe4\xd6\">/" +"\xc3*\x97/\x92\xb7\x61\x1e\x13\xeR\xa1\x38\x36\xc4s\x8bjR\xff\xeSnH\xfd\xf9\xde\x9e" +"U\xeb\x84\x7\xc7\xf. i\x9d\xf9\xc5\x8a\xd6\x1c\x36Q\xe2\xae\xe0\xcb\x61\x80\xd5\xd4" +"\xe2\xc2\xaa\xeb\x9f\xa0\xf1v\xcd\x4#\x8\x96\x84~\xed\xd1\nsLR\xfe\xc0X\x9dr|\xa2" +"\xbdn\xda\x12\xf\x1e\xab\x3!\xd2\x44\x82\x41]\x94\x8c\xff`$\x11\x1a\x1f\xe6\x10\\" +"#\x90\xb5\xb2\xfa\x66\xcc\xf1\xff\x2I\x99\x1f_W\x93\x9d]\x5\xe5@\x12M\x19/\xe4\xf" +"\x94\xb0\xab\x86\xb0\n\xa7\x12\xcf\xa5\x84\x7f\x44\x81\x93\xa3\x7(\n\x1d\xf1\xb0" +"\x93w\xc3(\xc6R\xe7\x32l@\r\xce\x97\xd3\x38Jj\xef\x32*\x8a\x94\x87\x97S\x11!\xdd" +"E\x9d\x8c\xdb\xc5\xa5\xcc\x97\xbd\xda\xeb\xf5\xdb\xc3\x46\xb\x9aJg\xf7\x8a\x8fX\xc2" +"\xe3VV\xcc\x9f\x8d\xbc\x66\xbeW\x94Z]\xf1?R2\x9du\xb4\xf6\xdf'\x16\xd1\x65v\xa4\x8c" +"\xa6kQ\xc\xe6\x35\x37\x64\x87\x8\xb\x18\x95o\xe7\xc8 \xd6\xcf\x43\xbe\xa6\x44\x87" +"\x1b\x11\xbe\x44\x46\xad\x45nE[\x3,\xc4 \xcf@\xfb\x9dP\xeb\x18:\x9eO\x15s+ \xf3\xb3" +"\xc6nn\x80\xcc\xae\xab\x95\x8b\x6\xd9wM\x94K\x8f\x7\xe7\x4\xb8Q_\xa0\xc6uF\x6\xac" +"Hq\xc4\x1c\xd9\xe7\xef\xffM\xb\x91\x17\xd0j\xef~\xcd@\xadk>\xdc\x43\x39%\xcb\r\xa9" +"\x9$]\xe5\xfc\x93\x88\xb2\x42\xcf\x9b[\x93\xcc\xf2\x1d\x96\xa2\xf0\xd5\xb2\x32\x39" +"jE\xc9l\x85\xcf\xdd\n\x1dL\xfe\x92\xcb\xd2H\xe4\x1c\xcfO\xa9s\x13\x43r\x97\n\xa9" +"\x93X,\x7f&\xe1\xcc\x99\xc4\x30\xef\xf1I\xae>f\xaem\xe4\x84\x84\xda\xab\xa8\x36\xf4" +"a\x83\xa6q!Q\x93\xfe#\xf8h\xc5\x9+\xe0\x89t]\x94\x7\x8G\xf7l+\x8d\xa3L\x1b\x10\xb6" +"\x1e\xb3\xb9\x0\x91\xda\x43\x81\x9e\x9f\x8c\xc8\xf0\xdc\xfd\x44\x9c\x9a\x1c\xfd\x46" +"?n\xbb\x9c}\xeb\x86\x2\x37<8\x15\xa6j\xci\xef\xf5\x18\x98NO+\xfe\xe0\xe9\x2t\x81" +"o\x1fx\xdd\x93Ml\x1e\xf6\\\xa1\xb0\x39\xa3\x84\xec\x95\x84pc\xfb\x99+\x97\xae\xe0" +"Q\x17\x89\xd1\x88\\i\x3\xfa\xef\xadxj.|O-wk\xc0k]\xb6\x4\xc7\xbd\x1d<\xfc/}S\x96" +"\xffPgs(\xb0\x86\xf5\xfa\"\x41\xd0\x9a\x41~T\xd6\x11mQ\x11-\xcc\x34\x35\x9a[\xd0" +"\x8\x1d\"Hh\x7f\xbdV\xa8\x89\xca\xffR6\x17\xc7\x18\xed\x82\x8e\xf9\xde\xb5\x61Lm" +"q\x8eL\x87I2\xf0\xf0\xbd\xc0)\xec\xfa\xc5\xe1\xca\x37\xcf\xd6\xc8\x82 %U\x95\x9e" +"[\xaa\xe6\xf3\x17 \xb6\xacR\x82\x93\x97\x8a\x1a\x14w\x5\xf\xda\x8c\xcf\x8b\xc2\xf3" +"\xb2@h\x14\x35u\xa3\xfc\x9e\x80\x10O\xce\xe0]?\xcb\xbc\xc1]\xdf\xe9\x1e\xa7\xf\xaf" +"\xb3\x12\x98\x61\x43r\x9b\xda\xdb\x42\xd2\xaa\x12\x39\x44\x10\x1cg\x0 zpNR\x6\x19" +"\xa8\xcb\x31\x31@\xd5~ \x82\xe1\x4\x37\x33\xd6\x9e\xfc@\xb7qV9\x2\n\xe2\x8e\xcc\x0" +"W\xaa\x35>\x91\x12\xbf\xfc{\x12!dZ\xec \xd3\xb3\xcf\x63\x7}\x9e\x9d\xa9\x63.\xb\x1c" +"+\x80\x1c\xf@k%3=0b\xcd\xf0?\xc6\xa4\xc2\xfe\x8c\x87\xd6\xad\xf8\xcu[\xb8\xf0\x0" +"9\xfe\x1c\xf8\xfb\xce\x11\x9cY\xe8W\xf1=\x1\x89\x1e:\xfa\xc3#9;p\r\xb3\x36ZY']\x11" +"\x8c\xcf\x9b\xc2\xaa\xfdp[u\x9+0H\x80i\x1f\xf5\x88\xf3\xf2\xc2\xdb\xc6<\x89\x93\xd1" +"\xae\x86T\x12\xce\xb8\xfd\x0\xc8-:\xa6\xd2\xb\x12\xe6\xf6M\x16\x42\x6\xb3\\\x10\xf8" +"\x81\xaeH\xc2\x33!\x5>\xb9$[\x1c\x38\xdb\x9a\xa7K\xc7\x19\x86\x90\xf4\x32\xde\x85" +"\xd9\x0ze\xf\x8c\x42\x43\xe0N\x9t\xc5\xc\xf4T.N4\xafS\xc2\x38\xc0\xb0=\xe\xc2\xc9" +"\x1c\xaf\xa1\x8a\xf5nz\xf7\x97\xd8\x61\x18_\xdfK\x90\x9a\xaaK\x85\xf6\xc0\x8f\"\xb0" +"\x1c\x7\x42\x85U\xcc~Y\xf7\xb1\xd4\x90\x9f\x15\x4\xe\xc1}\xb2\x63\x31\xeb\x66\xcd" +"\xe8\xb0\xa8\x39\x18\r\x13\x84\xd5\xfd*\xe1\xb8\xed?\x84\xe8n\xa7\xe1<}V\xb7p+\x4" +"\xcfu\xeb\x63\xc6/W%\x86\x6s%\xac\xef\xdf\x87\x30\xc4\x0\xa1&'$\xf5\x9b\x94\xb5m" +"\xe9\x9e\x9aQu\xa1\x1c\xf9\x32/\x86\xa2\xf3\x11\x87\x90\xf9\x88l\x1d\x94\xcb\x61" +",b\x9e{\xb8\x1e\xb8\xfd^+\xd9\x46\xe9\x9c\xf(A\x8b,)\x8d\xabh\x10\x99\xb9<\xb7\xc3" +"\xcf\x98\x34\x96\x91\xcf\xe0\x1el@\xb1}@\xdd\x96\x6z\xe7\x15\xb1\x10\r\xfm\xc\xa6" +"~\xdf\xa6\x43\x34\xe3\xed\xa2#\xb4\xfb{\x82\xb0\xfe\x6\xee\xc2\x30\xceL\x82+A\xf1" +"\x88\xe0\xcfs\x82\x83\xce,bjJnY\xf2\xabMUY\xad\x87\xcfM\x8f\x35O\x9fo@\x8c\xae\x1e" +"\xdd\x9d<\xf8\x90\x2's\xed$~\x7\x9f\xbe\x9f E\x1fg\xce\x9c\xda\xa2\xb3\xec\x9c\xd8" +"\xc\x46[\xd3O\x8f\xdd\x30kf\xb9\x35^\xc5\x61\xe8\x9f\xf4SI\xf0\x30\x9e\xa8\xa5\xf0" +"\xa7\xae\x83\xcb|\x89H\xf8#\xc3$cSyc\r\xfe\x8b\xd9\"\x17\xc2\xd9\xab\xdf\xcd\x14" +"\xce\xb8\xe5+';{\x0\xd0h\xb@\xef\x2\x12\xa3\xeb\xfb\xe8\x82\xac\xa2_\xb6\xf6g$\x1c" +"\x1fG75&;\r\x1b\xfb\xeaY\xd9QA[\xc2\x39\x9c\x41\xdfL\xf9\x97\xb9\xd2\xfc\x10Q\xe5" +"\x92\xd4#\xb7K\x14w\xe7m8`\x17\xce\xdf\xdc\x9c\xcb\xd3\xf3\xa9'6\x82\xb[\xbc\xa6" +"\xe8\x63\xfeM\xfb\xc5\x85g\xd8\xb3\x62ON\xeb\xc5|F\xdc\x13|j\xbb\xb5\xf9\xc_\xb3" +"\x17\xfa\x34\xaf\x30\xeaj\xc3\x5\xd9\x82\x7f\xf1\xc1\x10\xd7\x61\xebR\x10<;3d6_-" +"~\xc4'\xe6\xc5o\xeb!\xee\xd5\xc4\xc9\x14\x99\x46\xd1\xc1\x42;\xc\xb3\xe5\xe9\xa6" +"\xc1;;i\xd5\x1f\xd1\xa4\xdc\xd5\x85\x32V0\x8cl\xc6\x34\x9em\x9\x19\x9b\xa1\x8e$\xb9" +"\xdd\x87\x7f'\x9f\xf3\xc9\x33'2\xe\xb7L\xe8\xbe\xde\x97\xa1\xc1\x84\xe1\x4\x10\xf6" +"aM\x90\xe7+\xa4\x35\x1a\xe9W\x3T\xcay\x9c\xc2\xf1\x45\x97\x19\xb2\xd3[uy\xa8\x95" +"\xa9\x5\xd0z\x2\xbb\xde\xb7\x65\x9dq\n\xd6\xb8\xe2\x8e\x8b\x5\xdc\xc7\x13&\xcbM;" +"\xb6\x94\xa3\xda\x64\xa4\xa4\xba\xb3_\xa3\xedW\xbe\x14\xcb\xf3\x4\xb1\xb0-zkA\x1e" +"u!'\x6\x1c\xc3\x0\xf5\x8e\x2\xf3\x33\xcag\x17 fJn\xb6\x62~\xd3\xad\x6z\x8c\xe5\xbd" +"{oI\x12O\x8fj\xcdiUv\xc\xbd\x96\x93\xe1\x0\xb0\xe0\x91MW\xde\x84\x32<+\x6\xb1\x89" +"\xcb|\xb8\xd7n\xe3\xa3<\x94\xa3\xb9\xdbm\xd7\xe8#SN\xb6\xb8jq*Q\x98\xd8\xad\x45\xa2" +"\xa1\xe4\xe4\x62\xbeMB\x93\xcd\x8e\xc<8\xcf[\xce\x19 \x9\xe\x44\xbeH\xf%|Q\x1c\x80" +"\xfb\x39\xa9\x9e\xecL~A\xd2\xc0\x30\xde\xad(\xef\xd5\x18)h\xc1\x38\xc8YWt\x89\\\x8f" +"\xc4\x9\x44\xe8\xd8\r[\xd9\x6=\xf8\x8e`\xec\xe3\xa7+\x3\x12\x16j\xe8\x90\xc5\xd1" +"ul\x9c\x1b\x64\xe6\xaf\xac\xaf\x9b\xe9\x9at\x4z\xbcu\xb0GW&\xac\r\xb9.\xca\xa2\xce" +"\x81\x18Z\xf8\x6\x7f\xclS\xf6\x89\xa9Y\x17\x9e\x3\xeb\xa0\xeagI\xedMU\xaf \xb7\xe2" +"\x1c(j\xb0\xf7\x8e\x66\xe\x84\x85\xaf]\xd4\x84\xb2\xf7\xaa\x32)\xfco1\x8d:\xce\xa4" +"?kk\xa2\"\xc1\x96_W\xf4\x9Th\xd5\x33W\\\xcb\xb8\xe2\x42\x42\xc5\x9f\x32(\x8f#k\x7f" +"\xbd\xcb\xa4m>\xe\x41\xfd\xca\xca\x62\x82\xe1\x80O\xdb\x4\xdbk}$f\xe7\xfc\x38\xd9" +"J\xc8\x3L\x1d\xd9\xc8\xdfg\x9a\xe5\xba\xa5i&-U7\xfd\x96Y\xc4=\x2\x0X&s\xca\xe\x9a" +"hozX\xd7'\xbb\xec\xca\x32(\r\xb5'\xf\xd9\x17\xc7\xe9/\xe7\x92\x84\xf2Z~\\\xda!\xe7" +"\xd7\x85\x85\xc2VN\x4\xa5\x14\xd5\xd8\xdb\xbe\xea\x1d\x3\x82\x63\x9csj\x12\xf1|\xe9" +"8\xf0\n\xaa\x35\xe1\xe2\"\xfa\xa4\xd2(\x7f#\x16\x7\xc7\xdc\xd9\xa9\n\xbc\xe9j\x9d" +"\x9c\xe9\xcd\xb\x0QB9\x9d]4\x13O\xcX\xbcj6\x90\xeb\x86\x88\x0\x7f\xd7\xe8NC\x91\xfb" +"\xb9 \xa3\xb0\x82\x39]\xe5\xeb\x16\xefx\xd4_B\xf\x37\xb8\x82)\xa7V\x19\x1d\xf8\xc0" +"\xbdW\xf4\xf7q3m\x98\\\x9e\xcf=\xe9\xb6\xf4?\xa6\x1e\x90\xa2\xb7\xdey(\xdekzx4\x7" +"YGO\x85\x32\xd3k2\x9a\x39M\x92X\xfe^N\xed\x1b\x87\xf8\xa4?\xe5?\x10\r\xe3)\xf2\xb" +"\x91@\x8c\x9a^n)a\x85\xd6q\x5(\xb8\x33\xe4\x11\xff\xb5L1\x9c\x14\xf7\x8\x3\x98\xe1" +"\x88\xb9\xfdxA\xb7J\xca\x86\x1a\xaa\xbd\xe1\x8aZ\xf8\x13\xfb\xed\xebJ~\xe2\xaa\x17" +"C\xb2\xdb\xcf\xdc&\"\\r\x3\"\x7f\xc7s\xb1G )IVk\xa7\xc8\x1fZ\xd3-\xfe<\xe7\x83\xd1" +"p\x8c{\x9b\x8c\x9b\x43s\x4,|\x8f\xd0\xde\x2\xf9\xcf\x42\xf2\x38\xe4\xb5\x1a\x91~" +"Kc\xd8\xc3\x1a\xc6\xe1\x8f\xdc\xe\xa1$\x9f\x31u\xe6Yd\x9a\xa0\xf2\xd3\x7\xdf\x86" +"\xfd\xa4-\x80\xa3\xbd\x46\x97\xda[\x1b\x5\xd3\x46\xb3\xfa\xee\xd2\xc8\xd2\x1f\xc7" +"\xaaG\xba>*\xed\xde\x0U\x9c\x94\x86H\xe9\xd1\xb7\xbb\x16\xe6\x1b\xa8{N\x8\xca\xe5" +"\x9e\x83\x91y\x0\xef\x41\x80\xe4\xd7\x33\xd0\xe0\x1cT\xea\xaf\xdf\xb5QO3\x84\x8a" +"\xeb\xd0\x97 \xf6\xf7GlC\xf\xe\xda\xf6\xc6-\x83\x14\x9b\x3\xb5\x13.$\x1crs\xa2\xf3" +"\"3\xc2\x12\xc6\xfa\xe8\x97>\xc9\x8f\x87\xb7\xe3)\xa9\xebg6\xad\x5\xe6\xe3\x5\xf7" +"\xd3\x84\x13U\xbf\xf6\x9f\xbd\xf2\xcd\xfc\x41\xc9\x42\xbc)z\xbd?7\xba\xcbS\x10\x9d" +"c\x89G\xd2\x8d\xb9ws\xb6\xfd\r\x1b\xd3\xb1\x12\x46\xa3\x8a!\xdb\x4@n\xf\x95\x87t" +"[\x9a+\xe9\xeb\xcc\xf1\x5JP\\\xab'\x5\x88 \x90\xd5\x38/o\x99\x64\x8f;\x1\x9e\x62" +"G\x14\xb5\xfb\xb1\xf9\xe0\xc8\xd1]G\xe5\x85L\xab\x9\x35\xcd\x1a\xf2\x13\xb2\x8\xb6" +"\xac%\x11z!Lj\x91\xf6@\x1a&\xed\xb3\xd7<\x93u\x11\xeex_DK\x8f\xfe\xce\xeb\x8b\x8a" +"\x3W\xb3\x9\xdf\xc0\xe9\xbc\x18\x63\x14\xce|\xfb\x9b\xef&9\xa2\xd3\xc2\x12\xd7\xd6" +"fh\x6\xd7\xaf\x8b\xa5\x2#\xe3\xe0\xb2Q\xbc\x96\xca\xddHx\xa2\x9dU\xd1\x41\xb7\x65" +"x\xed\x37Z\xa5\x17Z\xba\xe6u\xd9o\x3\xc4\xde\x61\xcc\xb1\x98\xce\xe3z\xc4\xd1\xf9" +"\xdep\xd5;\rI1=\xce\xef\x64\xa9\xb5-n|t\xe7Zo(\xf8/\xa2Y\x2\xae\xb4\x9f\x81\xb8N" +"M09R\xc3\xab}\xbdX7\xee\xca!\x1f\x1b\x82\x34y\xe7k\xe3t\x13\x8c\xe6\xce\xe4K\xa9" +"\x94\x1c\xca\x39\xdd\xa6\xd6\xc9\xb4\x1\x9a[=\xaf\xe5\x45\x46I\x1e\x12\xd9\xd4\x39" +"\xd4U\xad!\xfd\xd5\x4\xa3\xe5?u;\xb3_>\xcd\n+<\xeaO\xa6\xcO\x8ct\xfb^U\xb1\x7\xb7" +"\x19\xdb~\"\xcc\x0\x7f\x7\xc6\x86;W\xdc\xdb\xca\xa2qjrx\xda\xe\x93?yx\xeP\x86\x98" +".\xb0'V\xdbG%\xb\x89\x7f\x43o\xd2\x7\xe9\x88\x88&(\xec\x7f)\xe6r\x17<\xe7\xbe\x7" +"/k\n\xe5\x9d\xe0\xdd\x1b\x8\xd0\x84\xac\xad\x1a\xb7w\xb8{\xf3\x0\x83\x1\x95[\xa7" +"\x19\x18\xd6\xdcg\xd6\xe8\r\xd1\x38\xa0v\xe7\xc5\x32J\x1d\x1b\x2\xa7s!\xbb\xb3 \xe7" +"\xd4|xQ\x83\xc5\xe1\xee\xb1\x9cl\x9c\x92\x46\xf8\xdf\xfa\x1a\x9P\r\x9bX\xaf\x8d\x1b" +"\xa8\x91\xd9\xdd\x3ux\x8f\x39Iu\xc9(\x6\xf8\xb4\xf4\xb2\xc2\xb0\xb1]\xf8\xcb\xb2" +"\x14\xcc\r\x7f\xb1}\x8c?.\xf5\x37\xed\xe0\xc8\xed^\x84 )RF\x18\xc5\x6\xaa!\xc1\xbb" +"\x97\xea\xb0\x19\xe8\xfa\xde\x46\x88\x81S\xa0s-\xc8\xc3\\\xb0\x86qC \x94\x1b\xa5" +"\xab\x1c\x82\xc6_\x8c\xa7\xc0\xe4\xf0\x41U-\xff\xb3\xcf\x61\xdb\xfb\xa6\xbc\x7\xdc" +"m\xff\x4!\xbb\xb0\x2\xa4\x32\xc1\x66{e\xe\\\x96\xf7|mj\x88\xcb\x11\xb2\x0\xc8\x99" +"7\x8!5(\xaa\x7\x8d\xc8\xaa\xb0\x1\x46\xf3U\xd5%\xed\xc4\x38q\xb7nw\xb5\xbe;\xeb\xa7" +"dgm\xbf\xfd\xc6\x1\xd6\xfa![\xe5\x33\xd6\xfe\x91\x8a\x6\xd0\xc6\xbf/\xdb\xd2\x8f" +"\x8a\xb4\xe5\xc5>?\x83\x8dgc\x94\x61\x66\xb3\nn\xac\xb9|\xf3\xebl\x9fL*\x1d\x9^#" +"\xaa(\xe0{DM\x7\x90x\xa2';\x8d\xf6\xb3\xa4z\x13[\x8a\xbc\x81\x37\xda\xba\x91:^W\x80" +"\x90\xe4\xc2\x63&gU\xb0|\x1e\x96\xc4X\x87\xf1\xab\x88\x34\x82\xa8\x92\xac\\^~\xb6" +"\x12\xaf\x8dq\xdd\xb6\xa2V#\x4\x89y\xc5\xf8\xd1\xd5\xfa\x97\xe1K\xc3\x8f\x85\x33" +"J\xa7|\x91\x34]I\x1d\xf9gd\xbb\x14\xf2g\x1a\\!\x19\"/\x83\x88\xa6\xdb\xa2gR\xf4!" +"\xae\xeb\xfb\xd6\xc4s\x14\x9bo!Y\x9d\x16\xa2G\xed\x41\xaei\x5s\x11_8T\xf8\xab\xde" +"\xbaU\"70\xe3" +"m\x9c\xd4\x12\xca@\x9e*}\xbbx\xbf\xd8\\W$\xc\x30\r\x86\x10\x90\x13!\xba\xfe+\x0P" +"\x8d%\xe2\x12\x39Iy\xfd\x4\xcc\x1a\xf1\x64\x7+\x92\x8f\xa2\x43\x81\x63\xeL\x93\x42" +"k\x16-\xed\xfdj\xc8^\x9b\x9\xa0w{\xef\xab$\xfd\x95\x19T\xf0\x1a\xc8\n\x44\x85\xa4" +"}M\xe6=U\x93\xa9\xa8\x37X\x9\xc5\xb8\xd9#\xb1@\x13\xf5UO\xcb\xbdN.8\xac\xc7\xa1\xb3" +"\xd7\x9dT}v\xfe\xde\xef\xb1\x0t\xd3\x30\xf4\xfd.\x9f\xec#\xd1\xae\xc2\xdd\xcc\xc2" +"M\xec\xd4\x95IO\xc1\xf8\xc\xcf\x8d\xbd\xdft\xf5\x0'\x99i\x1a\x91\xac\xb2ok%hI\x13" +"\xc4.\x1f\xee\xa2\x9d\xb8\x33\x1c\x61<\xbf\x9e\x9dJ\x13\x1_F{D\xdb(\xa9\x41\xf8\xda" +"\xf0\xc8\xd1,C\xe8\xc6\xf9\x66]~i\xfe\xd9r\x9\xd5\xa6v\xde\x3\x46!`\xee\x42\xa3\xbe" +"\x1a!Ag\xb0\xb1\x9a\x8f\xa3j\x9a\x8c\xb4;\r\xe9\xdeom\x83pkaz\x8aZ(\xce\x8d\xfe\xae" +"\xcf(/\xf4#@\xae\x16\"\xbel\x99\xfb+\x82\x18\x80Z\xfd\x7f\xf\x37\x83x\xe7y\xc8Ju" +"\xbf\xe9SpWh\xc8(:\xc9\xc7\x62\xf8\x43\x92\xee\xb6\xd5{\x99X\x82n\x10\xa3\xe3}q\x10" +"B\x2\xfb?g}\xc4\\\xf9\xc7\x9\x1eLN6hJ\xc7\x85\x4\x98I\xedY\xaa@\x13r\x9\x7\xe8\xd6" +"L\x99\xe9\xcaN\xb8\xcd\xd1\xda\rm\xf0@r?\x1e\xe7uI~\xe0U\x9c\x1\x12>\x97S\xfa@W\xee" +"X|\xc6\xba\xbf\xf8\x81\xcf;\r\xd4\xbb\xff@\xa3\xb8\n\xc\x46\xa1V\x8\xb9\x13\xf6\xe1" +"\xeb\xa3\xe9\xde\xe6\xfb\x65\x62\x41\xb8G\xffP_\xe9\x1e\x14\x33\xa5jK\xb3\x1c\xb3" +"h\x98\xf6\xa4\xff\x43\x0\x1c\xd3\x8a\xcaW\x81\xae%L\xef\x32\xa4q\xeb\x15!0SY\x1a" +"(\x12\x84\xc0\x96\xdaK\x8f\xa1_\xec\xf1U\xaf\x9f/\xbfKks`\x84\x13\xb8\x36\x93\xca" +"\n\xbc\x15t\xd7\xa9\xbdY\x8f\x36\xf3{\x19\x94\x43\xc8\x62\x46o\x86\x32\xfe\x99\x86" +"\xbe\xeb\x83\xf6\x46\xadt\x85\x8a\x90\xd2\xc8XN\xf7\xa7\xe8}\x10\xed\x9O\x0\xc5\x82" +"\xe7\xd0\x91\x8at\xf0\x9e\xac\x9\x31I\xf8,\xc7\xa2\xde\xe0\xbc|\xfb\x62\xc7KP\x95" +"\x14]\xb2g\xd3\xaa\x1f^q\x8c\xc5\xa1\xf0\xad\xb6\x8c|i\xb2\xe0\x30\xd0\xe8\xd1\x5" +"\xa1i\xac\x9\x97\x0K\x1at\x92\xf6,\x1c\xcdV\xb5\xcb\xd9h\x90y%\xe4+\x7\xcf\xab\x65" +"\x16\xbf\xf1'\x1e\xf8\xefWc1\xe[\x1c\xdb\x15\xe8\xd0\xc0\xf7\xd8\x41g0\xaf\xe4,\x93" +"\xe5\x1f\xd6\x99\x89\x61\xc%\x14H%\xfa\x36\xbc\x37\x34\x62\xd1\x85\x86\xecM\x87/" +"\x82\x8fY(\xed\n)\x19(\xee\xf5\x9ap@\xcb\x91\xaa~\xecVn\x9c\x41r\xd0\xe1\xdf}4.\x81" +"\xa4\x16\xba\xef\"\xa1\x97Tt\xa1\x11\x7f\xb2\x97\x66\"\xd1\xb8\xcc\xb1\xbe\x17\xa8" +"\xdf.\x1d\x81+@\xb7[\xc2l\xe8\xbb\xcbm)\"\x92\"mX\x10/jvL\x4\xd0\xda\xcf\xa9\xa9" +"\xfc\x98\x89\x92\xb9\x8e\xdb\x14\xa4\xda\x1ai\xf1V\\\x7fPS\x8d\x39\xef\x62\xa8\xa0" +"\xf0\xc1\xa3\x14}\xe4\xde\xb6\x44\xa1" +"_\x2[\xde\xc3\x83Mi\xfd\xc5\xb7 OW\xf3\xc9\xae\xa8\xf7#\xc2\x45\xbf\x18\xde\xbc}" +"\xe1\x33T\xb8j\xfd*\xeb>|\x7f\x8d\x42\xc0t\xe8\x86\x0\x35\xb6\xc0\xcc\xd7\xbc\xc8" +"\xab\x93=(\xf7\xbb\xba\xf7\xfzw\xd7(\xf6\x10\x8c\x10\x45\x44]\xab\x80j\x81" +"\x1b\x9b\xb9\x38\xb3q*\xb6[>\xa6\xb1qF\x97\xd3\xb9m\xcbg\xc2,\x89yV8\xb9\xd3\xee" +"\xb5\xaf\xab\xe6\x9f\xf4\xb9\xb2uSUf\x8a\xe3\x2)0B\xfb\xc1\x92\xb7\xd4\x9f\\\xe5" +"*r\xa9\x62\x89J\xba+\xbb\xb9\xb5g\xea\xd4[\xac.$\xc6\x96\xb\xf7\xee\xb4\x85\x11z" +"\x8a\xee\xc1\x90\x9f\xdc\x33\x88\xf5\xaf\x85\x46[g\xd8\x34\xa0/\x96\xe1S\xef[\xed" +"\xe8Z\xec\x13}\xafvi\xab\xf\x35\x14\xb4\xac\xea|\xcb\xb3\xf9\xda\xdb\x8d\x10\xb9" +"\xa8\x7\xe5\xa6\xce\xd7\x95]\xae)d\x9a:\x8cw\xf\xcc\xd4\xca\xb2\x1\xe9(\x97W@k\xb2" +"E\x15\x9c\xf3\xa3\x35\x37\x83[{|7\x1f\x38m8\x1c\x39\xd6\x8b;\xb\xa0\xc4W\x95\x33" +"}\x8a\x45j\xf5\x2\x84\xe7\x9d\x10\x86a\xe4\x64@R\xf6\x66\xb6R\xb7<\x8e\x3\xdf\x6" +"\xc3\x9e\xcai\xf9\x87\xfd(7A\xe7\x10#\x81po\xcT\xe3\xa6p\xb9\xc2\xb0\xce\x8d\x90" +"\x16\xa8\xc0\x9e\x64\x33\x84u\xe8\xe1l\x81\xb8Y\xc7\x90\xa2\xc7\x1co='E\x97\xfb\x36" +"eM\xb8\x4%u\x15\xd5z\xf8'_\x19\x8\xb0\x45;\x7\x17iT\xef-\xeK\x7f\x9a\x45\xb7\x30" +"\x8b\x94\x18_\xebg\xa8\x8e\xa9\x9e\x66\xbe\xd9\x42\xcLs\xeb\xe3\xa3\x9a\xe8\x4I\xe2" +"\x12\xdf/\xf\x90\xf7\xe1?\xf8\x92\x8cJ\xa2\xf\xc2&:z\x8e\x91W!\x9fz\xd0\x10\xd0Z" +"\x89m\x1d~\x82\x93\r\x1f\xde\x19\x7f\x80\xff-*~\xe4\xf7\xae\x8\xd8\xa2\\\xd8\x5\x62" +"\xf6\x14\x83{\x8bg\x16_\x8b>x'fj\x8d\xe5U\x9c\x81\x9f\x0IF`\xed!J\xc4\x8c\xb8\x93" +"X\x91\xe4\x19\xec\x17\x9\x9dm\x0\x8a}q\xd6k\n\x19<\xc8\x92\xfe*V\x80\xe3\x81\x80" +"M\xad\x90\x45\xb9\xc0\xda'%\x17Y\x8e\xeaU\xb2TG\x92q\xb9\xf1=\xd0\xa8\x6\x9e\xf9" +"e\xa8\xff\xa6\xccKw\xea\xd9\xfc\xfa\xc2\xa6[\xeu\xa7t\xab\xa9\x85\\\xd6\xfb\x9f\xaf" +"F`\xa2\xc8\x1a\xe7\x9d\xf8\xcaQ\xe9\xdb\xe2\x96I\x8fS\x89\xb0\xd9\xe4\\\xed\xb6\x1" +"^\xe3L\x9e\xc0\x9f\xf5\xdc%\x8e!Dt\xc7\xec\xe7\x33O\x3s\x3\x13\xd1\x18g\xbbO\xa4" +"\xf8\xaa\xc2\x35\xbc\x86\x36\x88\xb4>\xfc*\xde\x7f\x8e\x98\xf0\x8\x95\xfcK3\x84$" +"mcr9F\x8cQ\x8bKu*\xd3(\x18\xac\x17\xe1\x9b\x96\xc1\xba\x0\xb9\x16\xf7\xdc\x99\x81" +"a\xc5*\x14\xd6\x9aj\xd2\xe4\xe7\x46\x19\x96@\xfe\xb1\xb3\x33s\x8f\xa0\x66\n\xa2\x44" +"\xe4\xc4s\x8c\x11\xfd\x38\x64\x9aqw\x5\xa6\xc5\x66\xca\xed\xdb\x35\xe6\xb9\x41\x14" +"\xeez\xb7\x36\x10\x13\xf1\xab.*H`\xb7`\xfe\xea^\xfa\xe6\x39\xc3\xce\xa7\xd8\x83\xf7" +"!\xc5-jc\x1c(R\x82\xb\x80| \xea\xb7\xe6\xd6\xcb\x99q\xed\xc7\xb9\x85\x33Q\xb3VvH" +"H\x9c\xad\xfd\xdd\xec~\xcc\x63[\x9c@\xc0\xd2#\xff\x10\xfe\xe\"\\\x88\x19\xa6\xd9" +"\xec{\xfa\x1b\x11\x2\xbf\xb2\xb7_\x9bQ\x17\xbdm~\x8l\xa7~6k+\xd6yF\xca\xcb\xe9P\x88" +"\xb0\x19\xc8!\x87\x93\xc\xc9\xff+C\xef\x65\xe2\x90\x44/\xfa\x30Z\xec\x95\xfr\x1f" +"\xb0\x34\xe8\x12 \xed\xd7\xf1\x7\x1dTm\xaf\x91\xa7\x18N\x10\xf5\xfa\x8\xa9\x34\xa2" +"=\xa0\xbf\x6\x64j\xacN\xb2\xf8\xa9\xf5\xfc\xa3\x9b\xed\xd4\x31\x18\x44\x86\xcc\x8c" +"R\xa6>\xe0\xe4\\\xeaj(\xce\xec\xd5Q\xd5iT\x1f\x2\xed\xb4{\xec\x18\x33\xd9-\xd7t\xe1" +"\x1d\xba\xf9\x0\xee\x17*d\x1\xcU\xe1" +"HC\xea\x66\x2\x90\x10\xcb\x9d\x64\x43\x8\x34\x86\x80\xc3\x8w\x9\xff\xf6L\xa5\\\x84" +"n\xb3\xea\x15\xd6\xa0\xd4\xe3\xfc\xc\xf8\x81\x14\xdf*^\xa6\xee\xbb\xa0\x36\x1fYA" +"X\x99\xaa\xef~S\xaf\xd5\xce\x30\xc2\xbe\x93\xf2\xdc\xf2\x35V\xa6\x9d\xea\xf2\x9f" +"\xb0\xd2\x97O N5'\x7f%[\xf2\x0\xed\xb1\xdd\xe1V\xef*oO~=\xf9\"\xb9\x46k\xed\xca\x9a" +"5y*!\x1a\xb1!\xf7\xb7\xf5\xc\x9c\x1f\x5m*\xff\x16Z\x11(=\x9c`\xd8\xb3\x8f\x9a\x61" +"\x8b\xf4M\xc8@\xec\xb8\x17I\xbf\xcc\xb9\xa7\x83vG\xa5\xb7\xb6\xecJ\xd8\x30\x80X#" +"\xb7\xa7\x83xb\xc2\xd8\x86P\xa3\xd3\x8b\xf9\xc1.77o>\x4@`\xf2\xd0\x95\xe1\xf2\x1b" +"\x94\x92\xef\x80r\xe\xe2X\xdc\xd1ibA\xda\x35_,\x91\xa8RPy\xb9}\x0v\rK\xb2\x34\xf9" +"^Qu Q\x82Tl\x12\xa5\xf6ke\xb3\xfd\x95\xdf\x30u\x88\xd0\xa5\x0\x8\x61,a\xa4\xad^)" +"Jo=\x98\xeb\xbd\x8b*\x4/\xab\xffH\xa7\x5\x9e\x97\xfc~z\xab \xf1\xfa\x9f\x9c\x7fr" +"Jw\xdf\x7f\xc5>RQ<\xf1\xd9\xdc\x95\xca{\xc2X\xf1P\xa7\xf0\x94\xe7\xdb\x91\xe9\x91" +"\x8\x45\x2\xf1q^\xb5\xb7\x85\xd2\xabhc\xaa\x89\x97\x2+\xf8\x16RO\x0\x81\x6\x16\x80" +"\xc2=\x83\x7\x9au\xbc\xc6\xad\x9b\xacW\x8f&\xea\x9aK\xd4N\x9f\xcd\xd0\xff\x82\n\x42" +"D\xb\xf2\xf2)i\x80MZ\x88\xd3\x8c\xc#\xd1\x45\x38]\x89\x63\x83\xb4\x95\x6\xfaW\xb5" +"\xea\xa5\x80\x64\xae#\xe5g\xfck<\xfdv\x97>\xc0'\xdf\x12Hv\x85s\xeb\xbe\xd1\x8t\x0" +"\xcd_LY\x10#3\xc6\x7f\x1a\xde\xbg\xe0\x30\xbb\xd2\x10\x36\x37\x9\x96\xae\xa3\x0\xba" +"\xb9\xe$\xd1\x96\x65\x8av:\x8e\xc4(\xce\xe0\xb9G\xd2\xe5\x6\x9a\xd4\xfc\xa2\xc0u" +"99\xcd\xe6\xe*\x96)0\xd3\xd0\xc3\xaa\xbcu\xac\x1c\x62\xc0]\xc0Y\"M\x9eU\x97{\xdc" +"\x88\x12\xf6v\x7f\x32?\xcc\xc0\x18\xfe\xcdv\x1d!\r,~P\x84\xc5\xd8\x7f\xaal\xd3\xc2" +"\x7fQ\xc4\x3\x39\xbb\xd7\x17\xba\x38\xd5:\xa0\x32\x17\x14)\x9b\xbe\x1e;\x9f\x14\xf8" +"fg\x7}\x17_\xeds\xef\xfa\xfd&\x17\x66\xe7\x85\xe1n\x87\x84\xf0\x99\xddQp\x3\xed\xef" +"b\xaa\x43\x91\x1e\xeb\xe1Q<\x86Jb*R\xc6\x44\x8\xf4\xdc\x33\x5\x1c\xd5^PP\x8f\xa2" +"\xcfV\x8d=f1\xa7r\xd0\x11\xe1\x1T\xc7=yp\x11\xb5\xe8'!\r\x1b\x31\xb4W\xc7\x1d\xa7" +"d\xdb\x62=\x1e\n\xf4\x37\xb8@Yv\xf6\x44\xd6<#\xdd\xda\x83\xfaM\x14\xd6\xe1\x83\x92" +"Y\x7f\xe5\xa1\x45\xdc\xd8\x12\xfd\xad\x35\xbdoq\xcf\x11\x92\x1a\x0\x1fh\xb0\x43w" +"\xe9\xda\xd8\xe9\xbe\xc3\xdf\x1b\x92\xc2\xf1\xe7\xef\xd1\xac\xea%\xc2\xac\xb9!\x99" +"\xd9\xb1 \x91Q\x83\x63h\xd1\xa2!Zr\xeb\xc\xd9\x8bl\xaa\xc0(pciX\xfc\x8a\xae|\xac" +"\x3\xa9\x12Z;\x90\xce\x13\x1d\xa8\xa2$=\x9d\xcbg\xd3\xbb\x43\xdf\x16\x92\x1d\xc8" +"\xb2\x0S\xd6\x45!\x1a\xe8.\xfdx Q\xc6)\xa8\x85\"\x19T$\xa8\xba\\\xb4N(`\xe5\xf6@" +"\xcb\xf3\x1d\xc7.@xS\xd1\x11g\xd4]\xf6?dB\xa1\xd0\xa4\xf6\x89\xddn\xa7\xd1\xde\x97" +"\x8d\x8\xf8\\W\xdev\\\xd6\xb2\xf3@0/\x1a]\xa2Z\x1a\xe5\x43\x1d\x1d\x8d\xc3\x1f\x9c" +"\x82m\xd1\xb4\xd5\xa1\xd9\xff\x2;\xb1R\x1e\x39\xd8\xd2\xdb\xc8m$Vo*\xb\xa6\xeb\xa6" +"<\x99\x1f\xfd>\x82\xa6l\xf9\xe0\xe8\xc4\x33\xc6\xf/\xbf\xf8i\xb0\x84\xb\xe2\x10\x13" +"3\xc0\xe3\x43\xbb\x16\x44\x99\x61\x83;\xa2\x92=\xe\x2\xaa\xe2X\x10\xe4k\"\xcf\x80" +"yui\xaa\xf4#\xc3\xe3\xa9\xfe\x18R\xeej\xc2\x44\xcbh\xf6\x94U\x96o\x8bX\xaf~J\xc4" +"s\xd6SX\xf2\xe0<\xe\x3\xde\x15\xb8\xc0\x36\xf6R\xa6\xab\xb\xc2\x98\x30\x4\x18\xfd" +".(\xe2\xf3n\xe8\xc8\xf6\xec\x31\x1c\x10\x1p\x80\xe0\x7f`\xc4\xc9O[\x1bT\xcd\x17" +"\xe2N4M\xdf\xf7/\xbb\x88\x8e\x9d\xed\\]I*\x84\x38\xef\xc0\xa0\x1\x1\x37\xd4\x6z&" +"\xc2\x33\xa3]\xc\x5\x30`x\x92\x12\xed\x92\\U\xe4\xb0\xdf\xe\xce\xca`\x91\xc0/\xdc" +"\x0ij\x85\xa9\x30H\xc1\r\xac\xd7\xf2T\x85\xc0w\x9b\x19>a\xfd\x8fyM\xa2\x99\x45_," +"\xc4\xe4\x87\x42\xc1n]\xe6\xff\xdb\xd8\xd7\x9\x9Y0\x15\r\n\xb4h+\xb5\xa4_\x98\xa8" +"\xffp\x9f\x41=\xf1\x30\xcdMS\xb4\x7f\x91\x35\x8\xff\xa7\xa3\xfc~\xf9\x1c\xc3WN\xb5" +"\xc9\xa4\x83\x64\xf4\x81\xcf\xb4\x9b\xfb\xcc\xf9\x42\xbfq\xa5\x8dZ\xd9,\xae\x65\xbf" +"\xfeW<\xd6\x66\x9e&i\xd2\x10\x36\x8d\xaa\xff\xf5\x66j\xd0\xb6\xf7\x10\x5\x30\x9a" +"\xfc\xc0\x32\xf5\x96-Ip\x13\xb1\x84\x9b\x1dO5\xb\xc2\x37\x61\xfe\x83\xcc\x85\xc9" +"\x5R%\x8d\x5\x93\xed|\x9e*\xb4\xb0\x83\xe0\xa4\x4\xa0\xe1\xfe\x35\xbe\xc0\x97M\"" +"\xddy\xae\xdbS{\x13j\xc4\xd3\x7f\x8d\x98.\xc0\x1d^\xaah\xcc\x88\x9d\xcbrY^\x19\x35" +"\x97\xe1\x1e{\x9\xfcP\x19\x81\xcJ\x10\xfd\x95\xb8\xe1~\x83i\xf9\x31\x1\x84\x10-\x16" +"M^\xae\xaf\xa8\"\xad\x0\x44\x30@2vV\xb0\xd2\xdcjM$\x85\x98\x97\x1c\xc4u\x11oQ\x87" +"\x9c\xb1\x93z[#\x6\x5:\xb7l\xb\x64\xc9\x7\xaf\xb3\xdc]\x91:\xdd\xb1\xbc\x34\x90\x98" +"\x6\x80\x39\x91\xe1y\x1d\xf0\x9bJ\x17\xae\xff\xdb\x9\x41\x66\x2\xbb\xc3\xa8wQy\xa4" +"\xa7\x7\xb\x9a|\xcb\xf1\xdf\xaf\x95$K\xc}\xbe\xe1\x1f*\x90>\xbc\x38 \xf6\x8e\x89" +"Dl\xfd?\xa8\xefs\xa5\x35\xc7\xb9\x82Q\xe4\xb7\xbe\xfa\x10_j\x85\xf7N\xc\x19G\xcc" +"\x89G\xec\x41K\x9f(\x17p\x10\xb2\xf5\xcd\xf7\x33\x7\xba\x15\xd5 \x1\xc5\x65\xf2T" +"\xf4\x88/0\xb3W>a=]\xe4\xcf\x8fH;\xcfy\x95u\xb\x80\xdd\xcf\x81\x97\xe6\x90\x82\xb8" +"q\xcb\xee\xb\x9f/\x97\x35l\xf3\xfc\xe8\x39:\x9\x18\x3\x99\x80\xe6\x1\xe6Y\xd5\xf3" +"\xa3\x43\xca\xe0_\xea\xc3Q\x80\xb7\xa7\x33\"\x8b\x4\xfe*\xfa\xb5\xe9\xf0=\xcf\n\x61" +">\xdc\x10\x81\xf7;\x9b\xfaN\xe4\xf8\xa6\x3\xf4\x16\xb6\x9e\xaf\x9f\x46\x18z\x82\xf2" +"\xc5\xd2\x18Z\x0-1daP\xaa\x9b\xf8\x86\x63\x18\xb9~\xfd\xeJ\xdd\x1d\x97\x44\x0\xa8" +"\xc2\xd1\xf9\xd7_e\x9\x5X\xcd\xd4\xb5\x37\x35:\x98o\xe3\xbeZw\xe5zyd\x86\x32\xc0" +"+H.6P\xd9 o\xb5L\x11\xed[\x5\xd8\"\xd2'\x0\xba_\xfcY\xf7i\xd0g1\xc1\x1\x1d\x1f\xbe" +"g\x93\xb0{~\x1ex\x9f\xe7\xc3[X\x85\x8a\xf0\x9c\xb6\xc5\x84;\x87I\x15X7O.:~\x87*\xe8\x1e\x16\x8a\x7v<\x9a\xb9\xce\x66\xfa" +"\xbfQTEr\x99\x41mt\xed\xd6*\x7fw\x19\x7f\xd3\xcp\xea\x80\x9e\xb3\xb7\x97\xb2\\\xf8" +"\xf3\xe3z\x15\xc7G\x99\x7\xf2\xda\xe8\xd9%\x98^\xb7\xcd\xb7\xa7\x8e\xd3\xee\xee\xaa" +"\xf2\x1d\x9a\xaeu\x90|9p\x12\xd6\x13\xf7]G\xbe\xeeP]M\xa0\x87 yj>\x9\xf5\xd2\x7\x8\xd3\x91" +"p\xce~S<\xfa\xa7\xf8Hn\x4\xf3\x92\x16~\xa0\xa0\x93\xfe\x99\xb8)|+\x13\x98\xc6!]K" +"P\x92S8\xbaYW\x8c\x99\x1\x65^\x92.\x18\xb4\xef\xc4\xb4&\xdb(\xc5\x7\x33<\xe4\xf6" +"\x9\xc3\xb8\x89\xfgv\xcd\x86\x86\xb9T\xf0<\x8\xe1\xff\x99h\x0\xef\xe\x8f:m\x96\x9b" +"(3\xff\x15oH\x1d\xbe\x41_\xb3\x45\xb6?\xfc\xec\xd8l\x86\xbc\xb3\xa4\xdf\x3\x5\xd3" +"\x17\x64OI\xff\x1fUg\xb^\xfb\xde\x62\xc0\xd3\xf\xc3\xa9\x8e\x12\x1f\x9dYM\xba\x13" +"z\xb4\xd6\xfe\xafz\xc8\xee\n\xdf\xb2\xb7 n\xf2\x86\xd4\xd7\x9tareC\xff \xd3\xad\xca" +"F\"\x17\x99\xd9\xca\xceh\x8fJZ\xe\xc2`\x3\x1a\x34\x11N\xad\xa8\x7f\x99\xcf\x41L\xa8" +"\x84\x6\xe7X\xb4v\x0\x83\x9a\xeb\xe4\x41-\xdf\xef\x9f\xf0\x1b\xb0\xa1\xb8\xc2M)<" +"n(?\xaa\xa1>)\x1b\x8b\"\xcb(\xc7\xcK\xbc\x38J\x85\x36\xbe>\xe2\x8\xf5\x16\x17\x65" +"{\x85M\x7\x8\x96\xa2\xa6\x86l\xcZ\xf6\xee\"l\x9c\xb\xcd]\x85\xbbn\xc3\xa1\xa3\x0" +"\xb\x32\xe0\xea\xe0\xb5o\xa3V(\xb6\xd4\xb6\x84\x90\xb6\xc7\x18k4\xfa\xad\xa4\x82" +"rS=\xe4\x5\xa7\x33\xad\xac\xd4\x90\xc5\xea\xad\xc7\x32\x90\xa2WB\x8c\\z\xe1n\x19" +"\xf8\x15[U\x10\x9f\xb0\xa0\xe9p\xe8\xf1i\x91 .^\x18\x42\xfc\xae\xddq\x1d\xca\x36" +"\x1e\xbf=\x14I\xc0\xdc\x1d\xf0\xc2\xa8\xc0\xca[\x2i\xae\x31O\xb0\xb4\x2\xc2\x91\xa2" +"\x18\xb2)I;5\xf6\x19:\xe2]\xbb\x66Y'\xf9{\x19(RMfn\xc3>\x7f\x3K\xa8\xbf\xac\xdap" +"P\xd2=\x94T\xda\xd8Z\xd7\x11\xb1j\xc\xc1L/5\x1b\xed\xae\x8e\x94s?\xe7\xeb$\x1e\"" +"BO>k\xd8\x83\x8b\x95hp\\a\xde\xc5\xde\x37H\xd9\x18\xe8\x82\x1f\xf0\x33\x45\xca\x86" +"\xaa\xc4R\xc8W\x6W%\xaa%\x10\xdf\x8a\x6\x0\xca\xa6\xc0\xc9\x8c\xdam\xd5\xf5#\xb2" +"o\x17\xdb\x8d\xa8*\x0\xe4\x9d\x37jPM\x86\xf7\x8\x8f\xf2\x90\x12\x99\xcb\x63\x90\xe8" +"\xed\x62\xc9\xa4\x9d\x2\x1f%\xd8\xdb\x8e\xc0\xc8\x94@\x4\x64!\x95\xee\x1d\x11\x0" +"\xee\xcd\xffsx\xe6\xe9\x89o9\x1aj[\xaf\xb8\x88\x9\x86\x10\x90\x13!\xba\xfe+1\xb6" +"\n`\x87`\x9J\x91\x81\x95\xa5\x30\xe9|\xec\xa1\x14\xa6Z~=\xa5\x35\x95\x7.\xf8\x1a" +"\x95%\x92\x13g\x0\x7\x8a\xce\x18i\x3\xfdg*g\xcbz\x88\x33_\xb5W\xd2)\xff\xd0\x38\xc6" +"\x97\xa1\xae\xe6\xf6\x0\x62\x66\xe6\xbf\xd3\xe4\x9a\x33\xbf\xb\xe5\x8\x15\x2\xe8" +"'[t\xfbZ\x9cn\xb3\x92=\xd8'4\xd4G\xa5\xdfs\xfc\xe0\x36\x97\x15\x9d\x8e\x8e\xd1\x43" +"\xe2\\\x62\xfc\xce\xf\xc3\xf0\x1d@\x5\xb7\xc1\xdf\x9a\xdb\xc8\x1a?%]\x85'n^G\xf7" +"\x84\x17x\xed\x94\x39\x64s\xc2T6\x4\xab\xb2\x8c}\xd6O\x12R\xd1\x7\x11\xbbLv3\xee" +"\xfe}\xe3\xdb\x9a\x83'\xe8\xfct\x19\xc9ml\x9n\xe5\x42\xddl\x89\xeb\xa3\x94\x1e\x8a" +"\x86\xa4*\x8a\xca\xec\x9b\x11\xe8$\xd1\x15\"y\x82\xc3\xe1'\x8M\x19\xcbV\xeq>\xde" +"M\xed|\x90\x99\xe1\n\xf2w0\xca\x63\xac\x1d\x8duX\x87\x10\xb7\xe6\xa2%\x39\xabph\x80" +"\xcf\x38\xf3j,R\x98\x39\xf5\xa5\xda\xc4\x86\xb5\xe7\xfc\xa8t\x8e\x85\xcdO\xe7+\x92" +"\x6x+\xda\xf7\xb7\xe1\xd9\x1fQ\x99n\xa6\xa3IC\xcd\x9f\x90J\xfe\xc7\x13\r\xe5*I\x91" +"\x93LQ\x1f\xa6\x89\x36M-\xff\x6n[\xee\x37[~\x1\x1\xa8\xb\x2\xc5\xaa\x36\x8e\xe\xa4" +"\xfc\xa4\x34\xd1\x81\xee\xa3\x43\x9e\xa6\x39\x8ar` '\xf4\x15\xca\xc1\xcf\xb8G1\xa1" +"\x9_\xa1\x13\\\xb7\\O\xae\xe7\x14\x84?a\x17\xab\x1e>h\x84w\xd8\xcf\x9d#\x18\x44\xa3" +"\xb0\x0^b\xf\x9f\xba=\xbc\x93\x8cn\xb5\xe1\xf0k\xed\xae\xec\x97\x8d\xe8\x1\xfc\x94" +"\xb0%|j\xc5\xcdS\xe0\x64\xc1\x91<\x14\xdd\x1c\xdf\x90\xebx\xc2\x16\xb0\xe3\xc0$\xcf" +"5 n\x9b_{q\xe1t\x10(\xefjY/\x83>\r\xf3\xaf\xe0NGJ\x2\x36v\x6\xac\xad\xde\x30\xda" +"\xe4\xe6G\r\x5\xeb\x33X\xfe\xa0#\xb0\xab\xf8\x64\xca\xc7^K\xdc\x38\xdb\xf7\x64X\xa4" +"Y\xbf\x38\xae\xfb\xc3\xc4\xc7\xc2\xc8\xb8$I\xbb\x15v\xaf\xca\xce\x81\x19@\x89\xb9" +"\xa6\x83\xbe\xc4\x62\x62\x31&\x7\x1b\x1c\x44\xc3\x36\x44\xf5\xb0]\xf5\x9b\xb0Y\xdc" +"1\xbeo\xd5!u\x84\xed\x9b\x17\x65\x7f\xa3)\xc0\x8f\x34\r\xf9\xb6\xc[\xe4\xea_%R\xa8" +"\xec\x2\x9c\xfb\x98\x63I\x8fN\x9\x87\xa7%\x9d\xf5\r\x87'\xa5]\xc5\x38K\xe1hEGJ_\xc4" +"\xe0\x98\xd5\x6\xa7\xa8\x4u\xda\x85\x83o\xe4\xd6:\xf6\x86\x8e\xfe\xda\x1d\xdf\x88" +"\xad,\xc3\x83\xbbY\x99\x63\x18\x81\x30|q\x10\x86\x6\xc8\xcd\xc9\xf8\xb6&\x96\x15" +"p\xc2\x32\xd5v\x8\x42\x65_\xed\x46\xd4\x95*O\x1c\xd6\x8a \x2\xc3/\xe6\x39\xc5\x66" +"4\xc8=\x9d\xe7\xe4\x64\x3\xeb\xa4\x1X\x9dt\x14U\xdfl\xc6\x1b\xf4\xb5\x99\x93\xe\xcc" +"cG[\xbb\x8c\x46\xd4v\xdd\x8]\xbd\x14\x2\xd3\xd9\x63\x38\x35\xb1\xe1\x4M\xb5-\xc4" +"\xa3\x13y\xfd\xa9\xf7\xbf\xa8`U\x4\xdb\x1j\rHQ\xa6\xd5Z\x86\x13\x42\xf5\xe6\x39W" +"y\x81\xe7\x32-\xe7\x91\x97g\xc9%\x9cSS~\x97\xa1\x43\xdf" +"\x84W\xaa\xa0\x84\xa7\xf1\xef\xb3r\xd9\xce\xe2\x1d\xcf\xdeY\x80ge/@\x11\x45W\xdb" +"\x89P\xf9\x99\xb6\xdc\x83\x14\x12\xcb\xdf\xff\xa0\x8f\xfa`\x86\xa1\n\xf5K\xeb\xe1" +"\r\xcdH\x1f\xc9\x41N@B\xdf\xb5\xa0\x93\xefT:\xe1N*\xb4\xfd\xfd@\xc3\xe\xd1\xb4\n" +"4h\xec\xc8\xe1\x94\xf2(N\x1d\xf4\x9asQ\xd4\xd8\xa7\xfc\xb0vM\xc7\xd3\xe7\x80\xe5" +"\x5\x44\xb0\xd2\xc1\x36%\xc2\xb9\x38\x3\xf6:\xa2\x8d\xa8\x1c~\xa9\"\x12\xfa\x96\xca" +"\xc2\xf6Gc\xe4\x66\x66\xec\x0o\x8b\xf\xdb\xcco\x19\xc1#\xcb|\x91;u@b\xfd\x84\x12" +"*\"\x13\x38\x89\x19\x8\xe4W\xa1\xf7\n\xd7\x92\x3\x92\xb6\xb\xc2\x8b\x92\x97\xf8\xb6\xb[\xe4\xac\xf\x42xtc\xb5S\xf2\xeb\x3" +"Y\xdb\xbe\xe5\xe3\x17s^;\xbf\xa5[s\xc6\xc5\xe1\x65\x86o\xdc\x13\x84+\xd2U5\xd1\x86" +"\x1d\xf4\xf7\x13\xeW\x1d\xfa\x35\x86\x1\xe6\xa6\xf8p\xb3#\xf4\xdf\x9f\xab\x19[\xa9" +"\xdf~\xf\x8c\xed\xeb\xbc\x34P\xeb\x97-\xdf)=\xcb\xb8\xdf\xde\x33\x7\x81\xe\xf0\x9c" +"0S\xa6\x1\x14\xd0\xfatxS\xfamB.\r\xc2u\x8f\x34I.9\xb8\xf1\x45\xbi\x8e\x61\x33\xcc" +"\xe3\xd2\x63\xbb\xc2\xa8{X\xe4/@\x87\xd5\x88\xba\xfa\x35\xff\xf5m\xb4\xadG\xef }" +"\x94\x62p\x19od\x9an\x9b\x65z\xca\xc1\xe9\x2\x9a\xb5\x1d\x96\xed\xba\x15m\x16\xf8" +"G\x84^\xffM\xeb\x66\x8f\x9c\xdbz\xb7$i\x8cQ\xa9\xef\xf4\xbd\xc3\xc4#H\xe9mV\x89\xdc" +"]\xea\xf6\x38\xc0\xb2@\x18Mfj\x82\xf\x9\xec.\xb0\xd5\xa8\xa5l0QN\x16yVh2\x9f+\x14" +"8\x1b?\xb7\xe4.\x84\x9b\xa3\xda\x19h\x8eG[\xe\xe6\xce\xfa\x43\xa9\xbc\xd2\xff\xb5" +"\xf3\xe3\xaa\xddlGz\xc3\x9e\xfe\xf1\xd2\x11\xdb\xc3\x39I\xf7\xfb\xc9\xf2\x8b\xbe" +"\xee\xb7\x64\x85R\xf4\x38\xc7\xcc\x63\xe4\x1=T\xa9\xc\x81\x39\xeb[\x15xe\xbbr\xc0" +"\xb9\xe9\x1a\xcf\xe2\xe1\xc2\xcc\x96t\xa5\xc3\x39\xf8\x8c\x1a\xec\xee\xaax\xdc\x83" +"\xc2\x82\x2*\x91p\x15\x83,\x9a\xce\x7f |\x0\x1d\x80\x37\x9b\xf9\x92\x5\x3\xdeX\x88" +"\x90\xb6\xa0\x17\xe5\xda\x8a\xf3\xe9\xe7\x9a\x7f\xb0\xac\x43x\xf4\xfd\xa4m\xe}3\x9b" +"|e!\xb3\xbcN\xbe\x41\xef_\x93g?\x87\x14\xee\x43\xbc[]\xe9\x1bn=`\x9a\xd3\x34rz\x80" +"\x5\xbf\x7QI\x6\x1a\x18T\xd1\xf1\x93\xf1\xbb\x95#\xe3\xa6\x1d\x14z\xf4\xf8\x86\x9c" +"\xad\x2\x8b\x93X\xf1\x9b\xfe\x36\xe6\xe7\x1f\xf4L\x1a\xbd\x63\xcb\x46`q\xbfy\x9d" +"a4\x9b$\xa7<\xd2I)\xa9u\xa3\x1\x32\x8c\xeb%J\xd5\x19\x63\xa8\x1f\x30\x99\x7\x43\xe0" +"\x5\x80\x12l\\\x91\x4>^\xcd\xb7jK\x8e\xa6(A\x84\xdc\x8d{>R\x8\xcd{iW\x87-\x15*\xa6" +"|U\x5Mc\xca\x80\x89I\x8c\x83O\xc`U\xa1\x83\x38|\xfc\xacSM\xaa\xdf\xd0Xn\x93\x12\xb0" +"\xb3\x93~\xd1\xc9\xa6\x1c\x96\xcfWj\xa4\x1b,\x1f\x32\x89\x65\x1f\xb8\xce<\xa3\xf5" +"\xd0\x17vj\xc\xd3\xd9\xde\xaf\x8d\xf6u\xa6\x9e\xc7qe\xd6 \x87Uo`\xfb\x17\x91)'7|" +"L\x7fi\xad\r\x13\xb7\xc2\xd2*>1\x87\xbf\x19H\xfb}\x6\xbaT\x11&\x96m\xea\x84\x1)(" +"a\xd2\xe4\\p<=8\xd2\xa0o\x88\x90\xe6L\xbb\xe1v\x2J\xa6\x8d\x9f\xc4\x31\x16Y\x11\xec" +"\xd2\xde\x10\x8c\xec\xe4\x98\x18\xec\xf8\x9f\xfd\x32\xc7o\xe7\x11\xea?\xd8\x34\x35" +"\rV\x8fL\xcbn\xa3\x96\xfb\xd7\xb\x61z\x88/%\xc1\xb5\xf4\x13xI\xa3t\x89U\xe0\xe8%" +"\xae\xda`\x11\x15_;\x8b@6\x9l&\x94\xdb\xba\xf8\x82\xf8\xde\xb0@\x94O\x3\x34\xed\xd6" +"\xef\xf\xde\x98\x95\x38\xa7\xd7\xa0\x62\x9\xd2\x9\xf7\x9c\xeb\x9\xbeQBL\xd0\xb3\x8b" +"\x9e\xea\xff,Ib\xddj\xf3\xfb\xe8\x90\xc7\xf4o\x97}zz\x8\x1\xd2\x12|\xd0=\x4v\xe5" +"j#\x1d\x9d@rq!\xdd_\xaco\xad+q\xad\x34\xf0\xee\x44\xc0\x88\xf5\xe1\xd7\xec?b\xf/" +"RQz\x8b\">\x8?\x97\xa6\xc8\xbo\xf7\x42\x44s\xbb\xfe\xa5T\x8e\x17\x6/&B^\xdf\xdb^" +"\xb3'\xa1n`H\xfc\xa4?\xa6\xa3\xb5\x7f\x62\x81\xb2\xa1.\xfe\xdf\xbeN\x94\xf4\xc8\xd8" +"\xb1{\xf0\xc3zk\xfb\xe1\x32P&\r\xc8\xab\xfa\x80\xb0t\x9a\x9\xf2\xee\x7f\x66\x7\x17" +"\xe0]z\xcfii\x0}\x8c\x9fS\xb0ta\x1a\x94\x10\x92I\xef\xc9\x86\xd5V\xc5\xe3\x1eH\xe7" +"\x1\x1e\xa3JR\x87-\xfc\x66\xd5\x85\xae\x31\x80\x35\xa9^j \xb&.\xca\x94\xcc\x61\xa5&O\xa5\xbd\xa9Q\xa8\xaaZ\xb7\x44\x8e" +"6<7\xa0\xfe\x1a\x14\x81\xdc\x98?3\x92\xb8\x36P\xbb\xf5\xb\xd8\xe9o~\x1f\xc6\xe3\x9b" +"\x91\xe4\xe3\\\x17\xc2:\xf\xfa\xa5\xf9\xb8\xd2+\\w\x99M\x92\x2\xf9J\x84\xa9+j\xa1" +"\xd6:\xbf@\xfb\x62\xdck\xc2%\x42S\x86\x0u\x16\xb9]\x8c\xf2\xb6\xc9\x9c\xb8\x0\x86" +"8\rI\x1bI9;\xf0n\x80\x9bk\x8aW\xec\x8b\"mL\x7\xee\xb\xf3L\xba\xa3\\\xe3\x94\x6\xe" +"\x83=\xbd>{\x89\x32\xdc\xcb(\xdaHjY\xeb\x9by\x15\xe6V\x1d\x42V\xe0\xb0\x88{\x3u\x97" +"\x14\"\xa7\xb4\x80\x8e/\xb8Y\xben\xdb|\xbb\xd3\\\xad]\x98\xff\xe5\x17\xd0_j%\xb9" +"&a\x81o\xcfl\xdc\x98\x8eQH\x3\xa4\x36\x34\xd3\xb2\xb1\x83_\x12\x46_\x18\xbe.8\xb2" +"l(\xd3\xd8\xc5\xf8(I\xea\x19m\xe3\xb6\x1a\xe4\x8d\x1a\x32\x32\xb1\x63\xb0\x46V\x11\x30z~\xdd" +"\xb3U\xa4n?\xc2\xd2\\\x98\x31\x4\x46\x94Jj~\xe4\xd3X\xf3\xe3\x86\x46\xfe\x8b:d\r" +"\xb7\x37\xd0$\x8cVL\xc7\\\xeM~\xc1\xc7#\xb3\x30\x64>\xe9\xcb)r\x9a\x8\xa9\xb3\x36" +"\x94\x95IA\xc9\xfe\xafK\xef\x97\xf8\x82\x6\xbck}\xd8\x8\xc5\x38\x96\xf\xe6\xb9\x8a" +"\xe9\xcfZ\xb3,\x9b\xda\x1a\x12\xda\xbep^\xc1\xd4Q_\xa0H\x4|\xb&Dy\x10\x9a\xbaQY\x93" +"\xc7>\xd3\xe\x0\x15JM\x15\x3\xebr7\xf7\x8c\xcd>>W\x5$D9N\xd9\xae\x98\xf4\xb1\xe3" +"\x91\xdf\x36\x94\x1eV=]I$\x95\xf8\xc7$\x9a$\xc2\x42\x9f}\xb1\xc4\xa4\x31\xb4\xa2" +"\xb1\xe8\xdc\xbe(E|\xe7\xb4\x14$^:\x17z\x17\xc\x87\xae\x12\xad\xcf\x96\xf4u}\x11" +"[\x16\xcb\xf\xd7\x88\xc7z\x1f\x9f\xb3hk\xdb\xc9'\x5\x1c\x46x\xf8>\x8d\xc3\xb9\x64" +"h\xc5\xa8\xca\x83\xa4l{\xe6&c\xbb\xad\x17\x9d\xbd\xc5[\xa0\xbem\xc1\xdeW5\xa0\xd0" +"&\x10\x30\x94\xbaW\xc1U\x1\x9e;\x86\xa2`\xfc{?\xc2\xa0\xad\xad\xa5\xb9\xfbV\x2\x9a" +"(#W\xf5\xcf\xd4\xce\xe0+1\xac`\x1bW7d\xdd\x5\xfe\xb4\x2\x34\xc7\xf2\xb9^\xc8\x1\xcf\xb6:\xa3[eQB\x1d\xe7" +"q;\x1a\xefG\x6\xd2\x46R\x10\x7\xee\x35\x81\x99\xe7\x7f?\xd3\x92\x38\xf8\x1f\xe6\x88" +"\xf\x35\x44\xd1\xc8\xa7\x97;C\xdc\"\r\x19R\xa2\x90\xae\xd7\xf\xf3\x30\x0x\x89\xa2" +"\"\xa8\x30\x85u\xc5\x2\xa2\xa2)\xb0i+i\xb2\xf6\xb1x\\\xbc\xa2\x8f\x1b\xab\x88\xf8" +"\x96`\xc1\xc4\x66\xab\xa3\xecv\x1f\xf6\x1d\xe2\x5\xe0\x95\xc6\x44N\xe9]\x2\xf4\x45" +"\xe0\x96W\x99\x1a\xd1\x81\xd1\x32[$\x8e\xc,\xf4\xb\xf2Y\xee\x36$\x9f:2\xb8\x64" +"\x96\x44y\xa2\xaa'\x92\xb5[\x81\xb7\x5\x6\x42.\x84~Pcf\xf\xf5\xb1[\xc1\x9e\x64'I" +"gP\x8a\xb5\x35;d(\xab\x17\xba\xc7\xfe\xe2\x12\xd3!\xc9\xc6\xde?\xe8\xa3GI\x1\x8e" +"_W\xf1\x95\x3\xcd\xd1\xe0\xe5N}\n\xa3\xc8\xf8\xfe#_G>48(\xed\x33QO\xf1\x1bmn_\xd8" +"L\xae\x88\xe1h\xd0\xc1\x12m\xad\x64\x9\xc0\x98\xadK\x10\x62\x89\xcb^9h\xf5\xd3\xda" +"K\x13([t\x9b\x81*\x1bW$\xa4\x33\x37\xb9\xf6\xcd\xfc}\x1a\x98\x81\xfep\xdc\xdb\xcb" +"\xb1\xcd\xed\x41\xaa\x15$\x8a\x9c\x37>,\"\xbfW\x0n\xd5X\xbf\xe9\x85\xd5\x33\xf4^" +"X\xed\x18\x84\xf3G\xf4\xc3\xb2M\x15\x9cI\xcf\x8aI\x13S\xaa\xe8\x1d\x0\xf9N\xc8\x99" +"\xf2\xc6\x39\x3R\x83\x1f\x84\xb5&\x6\xff\xdf\x14\xa2\x30\x18\x32\xfd\xb1\x17\xcc" +"\xdd\xa2*\xf5(\x8e\xf1\xcf\x92\x95\xbbw\xffT\xf0\x14\xcc\x81\x7\xca\xc2x\xba\xcd" +"\x1e\xd4\xa9\x84\xec\xb9o\x2\x30\xc5\x33\xfcHt\x15\xbd;\x8aP\xb6)\x9a\xfe\xcf$*t" +"z\x92\x8\x1b\x7f\xae\xdc\xec>\xb3\x84x\x9c\xa1\r\xff\x4\xba\x99\x34\xb6\xf8~O\x6" +"\x90[\x13\x41\xa6\xae\x2\x81\xa3\xa6\x45\x98\x44\x8fz\x1d\xc7\xdd\xf6\x30\x86S\xf6" +"Iz\xb1\x33\xe3\xaa\x85\x10\x0U\x13\xcd\x9b\xb5\xad\\\\\x17\x8\xd4\xa2\xf4\x84\x37" +"[`0:\x9f(JC7\xc2\xef\xaa\x3v`\xb5\xf2\xbd\x61\xa5\xab \xc8+\xb5\x82\xce\x90*\xfc" +"4W~\xb8\x82\xbb\x91\xdb\xfa\xd6\xfd\xbc\xe5\x12u\xaa\x63V\x95&\xb5;\xd2\xff\x81\xbb" +"\xfe\xd3\x38\xe7HH\xf6\x14JjG\x14\x91T*i\xf4\x8dp\xfb\x98\xc3\xed\x83\x42\xf0\xea" +"\x7f\xeeW\xfc\xealdl\xad\x11\x88\x11\xe3\xe2rE\xca\x83\xaa\x92\xad\xa5\x6\xb9\xde" +"M\x5O;\x7\x87\x93\x99}[\x80\x41\xa9\x99]\r\x8a*c`\x18\x61\x8b\x9f\x6\xf5~\x80\x95" +"m\x1?\xb0@.\xf2i\x17Y\xac\xcb\xfd\xb1~\xa5\x84\xbaW\xc5P\xf7\x8b\x9c\x30\x81\x37" +"\x87mF\x1b\x36V\x9c\xd5\x7\x13\xe\x8f\xf\x94\xfe\x32\xb0\xe4\xe1\"\x92\xc\x1e\xaf" +"yd\xbc\x31\x6\xa3\x16\xe2N\xf\x11\x8T7s\xee\x33s\xb4svzJ\x90\xec\x31\x35\x2\xc5;" +"L\x19\x90\x19\xb1\x35\x7\xbf\xe4\xba\x32\xb4\xa8T\xae\xbf\x84\xc8z\xeb\xa8\xc8\x1d" +"!\xa3o\xa3\xe3\x11\xf9i\xf9\xad\x9\x43\x1dz\xb8OSZ\xedgJ\x1c\xf0\\Gtu\xaa\xcd\x43" +"\xac\x1a\xb7\xea\x13\xc4\x8a;${\x18\xe2\xf8\xd8,\xa2\x97\xe1?\x1b\x63\x41\xa8\xb9" +"\xfa\xab\xfb\xdch\xc6\xeb]\xa2-r8|\xeb\xe0\x61\x65\xc6:\xbe\xf\xd9\xcc\x92\xb7j\xcb" +"\xb7x\x7f\xa3\xec\xfvA\xb8x\xbdv\xeb\xd2x,\x93\xeb\xabRQH\xd8>\xe9;\x1csK\xc2\xb9" +"KQ7\xeb\x1fY^jN\xa5\x12\x9eQ\x9aIT1&\rB\xac\xbc\x62Q\xf\xe0[\xdd\xfa\x9a\xd5\xdf" +"\xb3`c\x1\xaem\x7f\xcb+W+\x8eV~$o\xff\x65\x8a\xbc\xe1\xc2\x85\x9c\x1a\xe5lB$\xfb" +"S_\xb1ulq\xc9\xb5\xefw\xe9\x82_\xcc~\x83\x15\xf5\xcf!\xf1\x1e\x38\xa5 \xa0\"@\xf9" +"\xba,5I\x2~V\xf5S\xa8vr\x17\xbe\xf2\x4\x91\x7\x42\xc7\xc7\xc4\xc7_\x95\xef\xa3x\xf" +"\xba\xca\xfb\x41\xc0\x9b\x2\x11\x5\x41\x3\xee\xda\xcb\xdc@\xeb\xb9\x42\xb3\xae+\xd3" +"\xd9&\xf\x1d\xdb\xab\x91nc\x8f\xd1\x8\xe2\x86\xa0S\xb3\xc4\x63\xa4\xe4YU$GE\x8d\x92" +"\x19\xe0\x98y7\xa9@ \x3\x15\xdd\x90\xdd\x1f\xd3\xa9\x88\xf2\xe0\x8c\xc1\x41(5\xd3" +"\xd4\x62\xa7\x1f\xde\xf5JO\xda\x8 zYh\x97\x85\x36\x96(L\xf9\r\x1e\xa7\x94\xb6V\x18" +"\xc3\xa4\xc5\x10\xfe\x95\x45\x90\xa0n\xd5\x15\xbb~p\xaelM\x1a\xed\x39<\xf1tN+\xc1" +"I\xcd\xae\xbd\x9cK:\x13\xd6zf\xaf\r\xd0Sde\xf0gupLs\xad\xc9\xfb-;\x88\xde\xbf\x44" +"\xe4\x2\x8b\x86\x7f\xf5]S*\xdf\x33\xddWg\xb4\xee\xb6\x89\x1\xc4\xaaG\x12i\xa2\x18" +"\xa1\xcb\x3\xfc\xb9\x45n\x9aP~W`\x98(\x92\xe4R\xd4\xa6#\xae|\x8b\xdc\x8\x1e\x46\xe8" +"\xc6\x66\xed\x80s\xf0\xac\x82yh\xa2]\x1aZ\x8f\xb6\xae\x6K\xe1\xe2\xb8\xfd\x88\xbe" +"%@e\x15!\xd4\xe6\xc<\xe2@\xee\xf1\x92\xfa\xea\x9e\x38R)fi\xf9w\xd0\x92\xd7Nn\xbf" +"!\x93!\xc9\xb\xc4\xb4\x97\xbe\x45\x8d/\x9a\xba\x3\x95s\xf3ra\xdfL\x9e\xe8\xfc\xd9" +"\xbaG\x13\x5\xa2\xa9\xce\xda\xe6st\xbe\xf9\x1f]\x94\x8e+\xd1\xbfgXv\xf7\x8ak\x99" +"\x8f\x32\xe9\x6$\xe\xc3\xae#o\xb\x62\x1a\xd6\"\x11\x9d\xda\x90\n\xb4\xe7\xdb\xd9" +"jm\xc\xba\xa1\xe5\x65?\xc6\x95\xac\x33VW?<\xc7\xd4J\xfe+\xb6\xc3\xc8\xa4\x83Ky\xe4" +"C\x91\x41?B\xff\xf\x39\xbf\x1e\xc\xf3\x92\x99\xb5\xdd\x80 >O\x85\x13\x93K\xeao\xfc" +"\x81\x6\xf6^{x(0=>\xd9\x35\x13Sd7wR\xcj \xfe\xf5\x8e\x18\xbf\xe5\x44\xd0\x61\x31" +"\xd3K\xb1\xd0\xb8^\xb7Ye\xce\xb7\x1e\xfb\x8b\xf1\x3O\xcdG\xd9\xf#\x8a\xe1\xdd\x88" +"\x9b\xe8\x42\x33\xccS\xffH\xb8'\xd5\x7f\xa0\xd2\xad\x33\x83\xc1\xcdR\xa0\xd9q\xc4" +"~\x80&tG\xed$\x1c\xcb\x34n\x8aHFm`\xae\xb8\x62\x30\x33S\xd3\xb\xd6<\xe9\x65u=]\xcd" +"\x2\x7\xf1j\"Oe\x80U\x80\xf4\xeb\xff\x87\xb9\x88\xfc\xec\xe2\r\x41\x1b#\x18\xce\x87" +"\xbaz\xe7J\xe7\x46\x62p\xbbTO\x86\xf1\x7\x6\x37\xcd\x45\xfd\x30\xa2p1\xce\x42WZ\x8e" +"X\xff{\xe9]oD\xd7\xb\xb7oI\x15o\x1c\xda\x9\x12:\x15Y\xcf\xc4\xc5\xce\r\xc6\x97\x4" +"\x18^\xd7VYm\x8b&\xde\xd8:>\x18\xa4\x14\xa1\x32\xa7Z%\x1aX\xc6/0\"jzd\xc9\xbf\x30" +"\xad~r\x1X}\x17\xe4=\\nf@\xc5\xc7\x96\x8d<\xab\x1\x30\x35\xf0\xf3U\x1e\x80g\xba\xb5" +"af|\xe8\xcd(\xb\x84\xb7\xd6\x7\xff\xeP\x4j\xfb\xfe\x98\x46\xeb\xa6\xc1\x18\x97,\xc3" +"\xc1\xb9-P\x11\xf6\xb1\x1e\xf0\xd1\xe8[\xae\xb6\x37\x1e\x62=\xd8\xdd\x85\xe6\\jE" +"m\xeeoH\xf0\x85\xef)'\xa8\xb3\xc4\x30N:\xe8\xbe-2\xc2\x32\x9f\x9aP\xd8\xb5\x89\xe9" +"WYg_\xbb\xa8\x84\x18G\x82\xa0\xf7;\xa0\xcf\x85\xd4\xe0\xf9 L\x1e\x9d\x9b\xb3\x37" +"\xab\xec\x34M\xee\xac\xc8\xedQ\xd9:\x85[c\x1b\r\xf3\xd0\xf0w\x89\xac\xb\r\xc4\x39" +"A\x8b\x8e\xf3\xcX6J\x99\xf7\x64\x42\xc~1~\x8c\x8'\xcb\x30\x1bKM\x92%\xd0pN\xd1?\xf4" +"\xaa\x81iI\xf8\x45R0\x9e\xb2\x19#\xf7&\xf6\xea-(\xc1v`\xc\xd6\xef$\xc4)\x96\xe3\xb" +"m\x9e\xb3=\x1ewKg>\xd8\xc5\x96\x99\x8e\x97\x92\xfalS\x1eZ\x9c\xb2\xcb\xf8\xa5\xfc" +";\x9\xb4\xdf'\x1d\x62\xfe\x8c\x1e\xce\x1a\xc0\xa1\xd5\xb1\xc\xb1\x9d =!\xb5\xc9\x93" +"Y/((\xad\x8aK\x19\x9e\xc6\xd8\x91k\xfbk\xb5\x17\xb5\x93\xae\x2\xc2\xf7_\xd4\xf3\xd7" +"l\r\x9b\x86\xa7\x0\x95\xf2\x90{\x2\xc\xd8(\x7^\xf8\x86\x90\x33\xfc\x9d\xcf\x14:\xf0" +"\xf5\xfd!7sw\xd9\xe3\xe3\x61\x4>oK-j\xcf\xdd@\\A\xd9\xbd\xc2kE\x3\x3\xf4\xa4\xfe" +"y\x0\xea\xc6\x33\x92S\x8kGL\xd8I(\x82\x36\xb1\xfe\xb6\xefM\x97\x5s\xadi\xc9\xc8-" +"\x97\x15\x7h\xb0\x8\xec\x39@\xf6\x96\xac\x65\x7\xcf\xf8\xa8\xa5\x9f\xdb\xce\x82\xf4" +"\xd4i{\x5\xe7+\x81{\xd5\x66\x9f\xa8\xbf\x1\xec\x9fu\x6&Ti\xe5{\xd0\xa4T\xa5N{7t\xe2" +"\x8b\xabY]\x81\xc3,\x4\x8e\x66\xetJ[\xdb\xf4\x0\xfm\xdb\n\xebvx\\\xc3_6\x18\x94\x66" +"\xde\xc0\xcf\x1\xc6\x8e\x1dX5\xd0\xb7\xb7\xfb^\x2\xe4\xdf\xe5\xd6-=J\x93\x91\xe9" +"\x19\xa6\xb7S\xc3\xd9\n\xe7\x1dJ~\xfe\x66\xca\xb6\xff\xfd\xca\x92\xf7\xc4\"\xae\x38" +"\xda\xe2\xc9\x31/\xe2\xfct\x12:\xa9\xe4/\xd7\x2\x1e\x94\xfJ\xab\xa9\xd1_\xfa\xa3" +"\x86$?;\x9a\x2\"\xff\x14\x86\xf9\x8c\x9c\xe3\x5\xb4\xa8\x39\x94<\x92\xa6\x31\xcb" +"\xc5\xf4\x7f\x93\x9e\x32\x9h\xe7\x11\xf2\xe8\xb6+h*\x3\xe6\xf0\x88)\x80\n;\x17\"" +"\xa1\xf9\\$%\xdf\x81\x42\xa8\x9cv\xaf\xd7Y-~uG\xbc[mw\xb2\xb3\xca\x9c\xd1\x7fg\x15" +"u\xfb\x33\x90gu@\xddv{\xcd\x34;0.E-\xf5V\x90#d\xe7\xcc\xc7\xc8\x3\x9bpy\x1b\xa2\xb0" +"\xda\xaf>f\xed\xcd-[+\x10he\x99\xb0\xb2\xaa\xfa\x9e[\x8a\xb7\x6\xa3\x12<+\xc\xd4" +"\x1b\xd2\x0r\xbd\x8d~\xcf\x9d_\xf0\xc9\xf8\xc8\x87\xa7\x9c\x2\xdc\xdd\xda\xb\xb1" +"\xa2_S\xd5\x88\x1K\xcf\xf4\xa7\x93\xa6\xa2\xf8\x39\x18\xb2,WT\x8e\xaa\x96}<)\x84" +"\xa3z\xdfR\xbf\xdbIk*\x98\xbd\x38\x6h$\x9\xe6(H\n\xd3\x1e\x45\xba\x88\x10\xac\xc6" +"\x97w\x0w\x1d\xd0r\x9aV\xa9\xa7\xf9\xa8)\x97Gr\xc3K$lb\xe2\xd3\x61\xb2()\xdc\xab" +"\x4\x84uj\x11W%\xa0Wy?\xb3k\x5\xbc\x15#V8\xe0n\xea\xc9%\x8c\x35Y\xf4\x4\xc3\x9,0" +"dCt\xbc.\xe\xf1\x9\xb6\xa8\x96)\xc7\xafm[\xb4\xd5\xf7;/W\x8a\x62\x9c[\x95\x85M{\x94" +"-w\x9c\x1c%\x1bg(s\x9b\x8a\x82\x42K\xbN\xce#S\x93\x8e\x8e\xea\x1e\x45\x9e\xe8\xcc" +"T\x9e^2D\xa3\x45\x30\xa9\x88 %\x9a\r\x35mH5|5\x8e\xda\xc1\xa3l\x5\xd0W\xa5\x96\xa6" +"q,\xd4[ \x7\x15\x13YU\xfd\x37\xaeR\xa6\xf8\xbc\x86\xaa\x95\xd9\x30\x88\xb8\xa3\xd3" +"M\"=\xf6\xe8\x82\xf4/\x9e+c\x1bY\xb1\x1cM\xde\x8am\xf5\xac\x6\xe6\x80-\xdf\x90M\x84" +"j\x1f[\xcb\x96\x63\xf7\xd7\xd6\xc1\xf3x\x14\xd1\x90=\\P\x9u\xb7\xe4\xb4i\xca\x81" +"\x96\xb0\x34\xba\xe2-\xfa\xc4z\xfd(\xad\x8a\xf\xf3\xfe\x1di$\xe6\xa4H\x84\xda\xc8" +"\x99\xe0\x30\x32M\xbX\x8.\x93\x8b\xb7\xea\x1f[\xc2\x86\x9b\x8f\x12W\x93\xe7\xa2g\x7z\xb0\x9d\x41\xe0\x12" +"\xb0\xf0\xf6\xb0\xd8\x8b\xf7\xa9\x98\xee<\xe3X\xaf?\xba\xf3On&\x8c\xe4\xe1\"\x1d" +"\xa7V#MK\xc7\xfe\xac(\x1f~G\xb8R6\x9d\x84\x10\x9aXh\xb2\x1e*\x86\x93\xb9\xcf'\x15" +"\x1a\x19\x16\x11`S\xe1(\x7\xe5\xb7*{\xdd\x12\x37\x35\xfdR\xca\xa4\x82\x61\n`E\xd8" +"\xf8$r\x89\x1f&53\xc6V\xa0[\xbd&\xd4\x1c\xcf[\xb9\x64\x80\x85\"/\x85i\xf5\xaa\xe0" +"S\xfbG8\xdf\xc0<&\xe4n<\x9a\x8b\xa7\x8e\xd0\xe3\x9\xf8\x8fKU\xceP\xce\x87^\x13\xc9" +"}b\xaa,\xefmF\xb8\xc8\xc5n\x2\xb1J\xc3\x8bN\xab\x34\xbc\x8b\xac_\x1f|\x96<\xfc\x17" +"\x16\x7fN\xb7\xc6\x80\xcfQ\xd3\xa5\xfb\xf0\xa0\xe1\xb0\xbf\\r0\x16'-~\xa3\xbf\x9f" +"\x91\xa2\xefk\xe6\"vR\xb2\xf7\xc9\xe9\x32\xbc\xd6mY\xd4\x31\x83\x90\x63\xd9\x9d\xd0" +"\x87\r\x93\xcb}h[oG\r&\xbe\xe9\xce\xce/\xe4\x98iF!7^\x95\xf3H\x8e\xa7$\xab/=\x89" +"]!#\x8c\\\x6\xe6\xe8\xd3\x8\xb9\xfb\xf\x14\\\x1a\x66\xaf\xef{\xcc\x0\xbf\x38\xd3" +"=N\xa3\x2\xef%\xae\x8cJ\xb\xe2\xcd\x99\xda\x8a\x88\xba\xdcU\xfb\x9bJ\x1\x15\xa3\x6" +"\x9d\xdf\x1er\xc1\x8\x93\x63\xd9\x16\x10*\xd2\xc0\x9e\xd3\x1d\x13\xec\x9d\xc5K\xbd" +"%\xee\xf8\x84\xff\x8\xb5Yn\xab\xf1\xb9KP^*\xcf\xe3\xbeJJG<\xd3\x1e\xbeM\xf8\x9c\x30" +":\xc7\x9d\x83\xe6\xd3\xea\x4\\\xb3\x82{\xc0\xdc\xe0\xb3\xb8N!\xb6\xca\x63'\xb1\x3" +"8\xd8\xbf\xac}-C<%\\\xe6\xd1-m\xf1_n\xf5\xef\x8b\xa1\xad\xf4=Ml\xa7\xdc\x98\x92\x4" +"\xbwp\xd9;g*\xe7\x0/2\x91\xa4\xf8:V\xd3\x8b\xba\xc6\xaei\xe4:?@\xa3\x62\x90\xd5\x85" +"\xe3\xd5\xe3v\x92\x42\xc1q\xc6\x86HMP\xe3\x89\xca\xbb\xd8\x8c\xbeM\xff\xd7\x87\xd1" +"'\xb1gM\xd4\xb\x46\xccrQ\xbazv4K\xbe\xfe\xe8\xb\xb9\xa0\xd2\x8a\xe8\x36\x9f\x9d\xbf" +"\xb3\xa7\x80$#\x8d\xf6yQ\x18\xefM\x10\xb5\xb2\x8c\x8N\xbe\x41\xe6\x97\xd6\xd6\xb1" +"\x83\xf1u,\x92\x31\x14\xb8\x45\xcb\x9a\xd5\x62\x33\x46\xa2\x44\xef\xbe\xd3\x8eK\x89" +"g\xa0\xb2Z\x9d)\xc9^P{\xd2{\xfbZ\xe6-\x9a\x44\x6\x81o\xcc\xe\x94\xf9&7\x89\xa4\xa9" +"\x81\x95\xbe\x81\x7\x65\xc3X\xe2l\"w\x1n\xe6\xc3,\x9d|\xba\n\xf0\x8e\xb5\xbc\x84" +"\xaf\x15\x10i \xf\x1en\xc2\x9aZo:Q_\xe7$'g\xd1\xed\x83U\xdf\xb4\x66\xf0\xff\x44\xf" +"\x89/\xd2\xd1 \xd8\xda\xbf\xf4o\xc3\x95\x97\x9e\x34\xeb\xc1\x10\x81lc&\xed|\x14\xe1" +"\xcd\x8e\x80(\nO\x1f\x93^U\xb9x\xe2\x66\xd0\xe\xa5\x7y~\xe5\xf3<\x86\x36!\xcb\x66" +"\xa2\xde\xdfvH\xc1\xa5\x92`\xe8.\xe7v\xc3\xf8U\x94\xfa\xb5\xc3\xe2\x80\x93\x88r " +"?5\xf1.'\xb9Nf\xbd \xe2V\x3\x92\x9b\xc!\xac|/\xab+\x3\x82\xf4)a;\xd0\xcc\xc4\x80" +"\x15\xf1o\xfe\x8a\xf8\xca\x10\xefT\xa2G\xe7\xdc\x86\xa6Ws\x11\xae\xfa\n\x1f\xe3P" +"\xe7\xad\xae~!\x94\xfa\x13\x5\x35\x8b\xbe\xdd\x35\x1f.d\x6\xe8\xde\xc9\xc\xdb\x41" +"\xf0\x84\xa5K\x1@\xb4\x13^=\x12\x8f\xe5\xa9\xc4\xb3\xf0\x66o\xb5\xf0.\xf0\x14\xa5" +"9\x12\xc2\x9dM\xc!We\xea'\xf3\xb4\x6?\xcb\x10\x94\xcc\xab\x9f\x99\xb2\r\x9e\xa0\xdc" +"\xec}\xfa\xaa\xd7\x81\xc6Z\xa6\x6j.N'\x5\x36*`\xd8<\xef\xf0_\xee\xfa\xbc\xb\xfd\xf7" +"\xb7\x84*u+\x87\x61\xbf\xf3\xce\x91MTL\xb8&\xda\xde\x7f\xfb\xfd\x90\xaa&5\x17\xbc" +"\xe0\xd2G$\x8d\x3\x9a\x35\xfe\x30\xfa\xce\xc\x7\xe5_\xe0\x95\x6M\xe9-VT~mE\xc8?)" +"\xf5\\\x89@\xe5\xd4\x80\x1b\x1b]3\xcb\xe5\x91Y\xc3~i\xd4\x33\x6h\xf6\x8b\x87\xb8" +"\n\xeb\x9b\xcf\r\xb3\xca\xcd\x8f\x96\xbeS\xecm\x0\x42`}\xa9$\xff\xba\x12\x30y\xfc" +"|\r\xee\xba\xc5m8\xae\x8c\x1e^{\x9f\x93\xeayU\xd5\x81\xf6\xe\x93\x1e~\x1\x83t\x1e" +"VI\x8c\xa3\xb3\xef\x98\x8c\xeZ\xba\xd7\x34w9\x80@\x8an\xe7\xa9\xe8(wdr\xd1s\x95\xd4" +"\x17\xfdu\xa6(\x7f\x36\xf7\xfb\xfcG\x8\xa9\x92\xc8\x7f\x5\xc\xa2\xc7\x84/\xca\xed" +".7\xe3U?\xed\xbb\xb\xbe\x86\x7fn\xa2z\xcb\x63\x10<\x9aP!\x8a\xd8\xa1" +"&x\x96\xa4\x83\x1ei\xb3\x4\x1c\xfe\xcc\xc7hX\x17\x9e\xf8\xd2\x43\x86\xf6\xfd\xf3" +"U\x85\x34\x86\xc9\x9c\xe0k\"\x1a\xcf|\xe8Pwg\xe2\xf9\xac]\xfP\x88\x65\x41:\xb4\x6" +"\x9c;\xb1\x11#3sOk\xef\xeb}Ph\x90p\xb5\xd0TH\xee\xc2z<\xdf\xcb;\x98\x97\xd2\x6\xfa" +"\x88\xa5\x35_0W!\xe1\xc3\xf3\xa7rEot_\xe6\xe5W\x19\x87.\x87\x0\xbc\xb3\x99Q\xe6\x83" +"\\w5.\x8\xf5\x31\xc7\x13_Y\x83\x9d\xbe{|\xec\xa6Z\x86\x80\xbb\xa2\x43\xa9\xa0\xb7" +"-\x12\x91K\x9b\x44<\xa1\xc0\x65\x0\x98\xcd+\x8f\x13\xfa\xea\xf3\x37'\xbf\xd8m=\x1" +"E\xe1\xe2\xf5\xe2x\xc1\xb8\xcd\xc1\x2\xa9HV\xe6\n\x19\x66\xdf\x38\x8e!\x9f\x5K]\x11" +"\xb1\x11\x63\xd9\xf2\xbbq^n^r\xc8\xcd\xe6\xd5q\xb4=\x15\xdc\x45\xab\xee\x9aN\xe0" +"\xe5\xa5,\xc0p\xd2j\x84\xeaY\xad\x45\xb2\xa7=\xbf?>\xed\xcb\xab\xc0\xe1 q\xff\x8" +"\x1c\xff\xea\x66\xc6^\x1a\xb7\xa2r\x9d\xf3+v\xdf\x44\x45\x9a\xe0\x98\x9e\x9c\x36" +"\xfco\xfsK\xc8ZC\x83\xf3\x80\xc7p\xad\xa2n\xddu\x17T\x1e\xd0\x46\x97\xd3\x7fM\x85" +"\x91\xe5\xf7\x85\x10\xc5\xe0\xe2\x98\xa4\x19\xe4L\xfe\xd0\xc1\xf0\xd6\x35\xd9%\xed" +".\xdcN\x12\x81o\xae\xab\x87\x99\x8f\xfc\xa0O\x85\xb8\\\x8\xd0m'\xc3l\xb9\x39\xa1" +"DU\x87\x13\x93\xd9\x5}g\xa3@\x1g\x1ctyj\xf2\x89\xdb\x1al\xd9\xb\x12\x9aZ\xa3\xcd" +"hp\xed=\x88\x92+\xc4\x63\xb3\x8f\xc9X\n\xb5o3\xe6\xb5\x89\xbu\xc9\x83\xba\xae\xf6" +"\xe8\x92<%\x86g\x8d\xfd\x41\xc9\xd8\x66\x41\x1\xb8\"#o\x93\xa0K\xd5\xcc;2\xe\xe3" +"`ezX\x84\xe1_\x7\xcb\x9b&\x8c\x96tw\x80\x38#\xf9gf\x89<,*[\xb8{\xf1\x1c\xb4v\x9d" +"fX\xd4\\\xdb\xa2\x99\xd4\xa6\x3\x9b\xbf\x2~l\xb0\xa3H\x9a\xd3GER\xe5\xa2\xfd \xda" +"-\xda\xfd\xe5Y'\xdd\xb0\x87\xab\xd1\xd7'\xe5\x11x\x1L\x98\x36\x96*\xe2-\n\xb2\x34" +"0Q\x96\xf2\x10+~\x1e\x1cJ^\x8e\x38'w\xd5\xbc\x42\xe9w\xe\xc2O\xca\x8e_\xcdK\xc7G" +"R_\x7f\xa3\x91\xdeS\xb2\x94\x37n\xd3\xd2m\xc7\xd4\x1aJ\xbb\x12\xddp\xe0I\xf9\x95" +"\xf6\x12\xc2@\xc8\xf0\x17\xe6q\xb4z\x85\x9d\x39_@)2\x89\x8e\xcf\x8b\xe3\x8c\xd2\x14\xb0" +"\x8\x9a N#\x13\xe1\x31\x35\xbfl\xb\xc2\xa2V\xff\x89\xc8\xc2p\x90V]\xe6_\xe7\x9;\xe7" +"\x98\x9eS\x11,\x3(\xb\xc2uPvfR|8z[\xedP\x1f\x1f\xa7i\xcd\x44\x44>5PU\x81\xc9\xa3" +"\xc0\x8d/\x8d\xafO\xa3\xf4\xcf\xba\x13W\xd8\xe4\x9f\xf8#\x14\xef:\xba\xd4\xd9wu\xd9" +"\x1e\xb4\x8c\xefQ\xc1L\xa3\x1e\xd9\x46\xd9lJ>\xaa\x39\xc5\xc7\xa3\xfc\xd0\x91M\x9b" +";\\\x12u\xbdrO\xa3,\x17\x8\xc2\x1f]\xb2\xba{1-o\xa2\xf3=p\x90\xd3\x31\x96\xbd\x94" +"u\xc5\x8bJs\xdb\x13\xdf\xe2\x46T\xa1\xf1\xc7\xb3^\xb5\xe1\xe3\xa3pF\x1a\x97\x9c\n" +"\xd5\x62v\xab.Tp\xf0\x65\x88\x39\xfe\xc\xec\x33\x66\x95n\xe9\xe0\xb5rl\xb6\x8d\xb2" +"9\x9c\xe1n-W\xf8\xdf\xdbJo^I\xeb\xe2\x8b\xd3\x63\xb9z\x8\x63\x9\xb4\x96JP3\xb6\xd7" +"\x82\x35p\xb\x1a\xc4\xfb\x8b!\xe\x64szl\xeaMX\xd4\xcb\xa2\x87\xeb\x65\xdb\x38\xf7" +"\x8cZ\xda\x0\xeb\xaa\x35\xb4\xe\x92\xfc\xa8%\xee\xd5\x63R\x16\xcdr\xe9\x3$`hs\xd0" +"\xaeH\xec\xc2 hF\x8a\xec\x18\xd6G\xa6\xda\x9d\xe1\x8f\xd0|\x9 \x98,\xd3\x1O\xa4\x46" +"\x87\xa5\xae\x36\x5\x86N+\xfe#\xe3V\x1e\xca=\x97VC\x81\xb8\x45\x46\xb0\xad\xd8@\xdb" +"O\x92\xc6\x8f\x66\xf5\x33)\xfdU\xbd\x9a\xa7j\xb\xbd\xb2\x90\xf4\xd6\xd2p@n\xdbVI" +"NF2\xbaMp\x18\xb!\xe\xdfY6\xc9\x87 \n\xfd|}\xcb\xc0\x36S\x9b\x8e\xa2\x46\x13\x36" +"\xc0\x31'd\xb0U}\xcdKV\x15\x91\x31\xa2\xdd\x35-6d\xa4\xed\x34\x3n\xb\xc4\xcf\xc0" +"\xff\xdb\xf2\x8c\xb\xd8\xc2\x46\x8f;\xecZJ!y\xb8\x9c\xe0\x11\xc6\x9c\x45\x1f\x80" +"\xc3\xbf\xb7\xf\x63\x1d~$\xde|\xab\xd7\x82Kf\x8cv\x86\x37\x94\xc4J\xb7\xcc\x9d\"" +"M+'xz4Q\xd0L\xd1\xd7\x61\xa2\x2\x5\xe7%X\x8f\xf3\xf1\x33\x61n\xfd?\x85\x43\xc7\x31" +"\xcdg\x18\x31\xd8\x8d\x8c?s\n/\xee:)\xdd\x4wM\x80\xbcK\xa8\x85\xd3`\xf7\x9d\xa2 " +"\xf9q\x3\xda\xc#\x2\xf7\xe2\xf3\x8c\xa2\xdb\x9f\xae\xa4\x88Z9t\xb3\xc6]\xd9\x18\xfc" +"\x1eh\x12\xe5k\x83\xfe\x8b\xdb\x1c\xbb\xc8\x8b\xfdv\xca\x38/\x10\x41\x16\x82S\xbd" +"\xb7\xf0\x62\x35%@\xe1\xd8\x38\x8a,\xd7'E\xe\x8dX8%\xfd=\x18p\xf1\xda\x4\x30/\xd0" +"\xc2O\xf0$\x14-(\x9f\\\x88\x83\x8m\xd4\x13M_\"\x87\x94}\x80\xde SObYr\xf3\x18@\xb5" +"\xa5:\xf4\xe0\xf7\xe7\xd4\x66\r\xf8\xd0P\xd5\xa7\xd0v\x99^dt\xb9\x84\x9c\xb3\xaa" +"\xc2@\xd0\xb5J%h\xbbX\xcb\xc8\xe0xC\xd3U@\xf3\x87\xf8\x8bH6\xea\xf8(\x8f\xb0\x34" +"t\xde\xacJ\xdb\x7f\xf6\xb7\xc3\xf1\xa7\x14\xa5\x5:\x84\x35HT\xe5\xc0\xb\x9a\xfe\x9" +"_\xdf\\\xcd\xf9\x14\x31\x64[:\x9c\xf0\x13\x93r:w\xc0+\x7\xe\xcc\xd2\x8d\x89{\x9d" +"u\xd0\xc3\"\xa9\x92K\x1bo\x8a!\xfe\xc3\x87t\xb5\xf1\x94\xaa\xd0}\x81\xc6\xf3h\xa8" +"\xab\xc1,\xce\x9a\xb0`\xc6V\xb5'\xaa\x97\x99\xb3\x63\xf0\x32R\x1d\x10\xbb\xe3\xda" +"\x1d\x81\x1e\x30\xfR2\xa7\xef\"\x8d\xd0\x9d\x95n0@\x96\xb6\x3\xb6x\xdc$\x1a\x12\xdd" +"hh\"o\xe4\xad\x97qh\x9a\xb9xQ\xe7\xac\xc5\xa2\xcf=A#'\xd8\xf5+i\x8dS\x9c\x11\x1d" +"\xe0\xe2VX\xd2\xfb\x86\xa4[\xe9\xeb+\xad\x85\xe0h\x92\x94\xa6\x15\x85n\"\x5\xfa/" +"\x94\x96r\xdd\xc3\x87\x13.\xb8T\x13\x61{Ri1L\xe3\xc0\xf3\xa1\x8eT\x81\x7f{\n\xb4" +"\xb6%;\xfb\xaaJ\x16qi<\"\no\xf2\xec\xbf\xfc\x9d\\K\x4\x8c\xcd\xf4\x95uAd24\xa8mV" +"d\x8c\x2\xb9\xbf+d8#\x85\xbf\x43\xd0\x89\xab\xf1\xae\xaa\\\xfd\x9b\xd9\x46\xc3\xe1" +"a\x9c\x7fW\xde\x41\x65\x9f\x88!/\xb3\x9[\x94\xf2\xd6\xd6\xc5\xba\x13\xc5`Q\x9d\xf6" +"\x95U\xc9\xb7\x12lo\xf4\\\x61\xba\x46|)\xcd\xf3\xce\xa6\xe9\x10\xaa^\x16\x1aJ\xfa" +"\xf6\r\x39%\xd0\x1d\xe9j\xf0\x96\x94\xfdYp7X\x91\xd3Z\xbf\x64)\x8\x9b\x9d\x81i;p" +"\xe9\x8c\x18\x1Z\xe9\xcd\x3\xfd\x46{\xde\xa6\xbc\x9\xdc\xe2!a\xed\x97k=\xa2\xa8\xc" +"\xf0J\x83\xc5\x3`\xd6\xa2 \x0\"\xc0m\x99\x98\x9a\xda.'\x5\xbe\x9d\xc5\xa6\xce\x32" +"\x1\xe2\xd2&\xa0\xed\xaeP.\xf2r\xed\xdb\x88\xcf\x7f\xb3\xf2\x91\x16\xc5Y\xee\xf8" +"@^w\x5\x64UE\x2\x85'E\xd3\xd4\x8b\x1a\xd7\xc3M\xeb\xf5\xf1\x90\xfd\x2\xbc\xacyl+" +"\xe3\x80\x17ri `K\x19\x84\xec\xb3 D(\x18y\x7f\xa1@\x3\x11\x8d\xf2\x1f\x99\xab\xc9" +"\xdeO\xfd\xfd?\xa6\xba\xcc\x45X\xce\x63\xe1\x89\xcd\xb8\x5w[\xf2L\x8fo\xe5\xb6,\x13" +"\xde\xbc\x8d\x8\xec\xc6N\x4Y\xd8T\xda}\xe0\xfb\xe7O\xe7&s\xbc\x92\x12T\xf9\xe1\xd8\xb1\x39n\x82\x98\x89\x1a#\xe3\xd4u\xcf" +"J\xab\x97\xedyEXx\x9cTN\x84\x9b\x1\xa3\xa1t\xe7\x8f!\xf3~\xcc\x1d\xe2\x41\xad\x32" +"{[\xcd\xca\xc1\xea\x99[\x9f\x8\xdex\xa2\x82\xcc\xcb,\xbf\xca|\x0\x98&^\xdd\x8d\xcf" +"V\x3Z\xc0\x64nw\x11\x38\xb9S\x18\xa5\xef\xdc ,\x90h:\x93\x61\xbc\xab\xac\x2\x87\x1f" +"\x1eg`\x88\x8e\x14`\xbf\xec\x1a\x8e\x9c\x9d\x63\xbavRt\xd4\xf5\x2j\x8b\xb=\xadh\xbd" +"\xf9\x11[\xa8\xbb\"\xd0H\xfe\x8b\xaa`\xe9\x86\xf7|&,\x92)\r\xe8\xe4\x66\xf8\xb1\x9a" +"P\x1dKZ\xee\x1a\xb3{(\xe4\xd2w\xe1()\xbc\x46\x46Iu\x82\x62\x88PE\xb2\x9\xb1\xfe\xe7" +"J\xaf\xe1\x43\xf0,\xe5\xf3\x7fO\xbao\xe6\xb1\x34#'\xe8\x8f\xbc\x1b\xc0\xb4\x93\xb4" +"\xe1\xa3&T\x9c\x94\x8bo\xb8\xc4>\x80\xbd\x8c\x10`P\x9b\xf5py\x9c\xd6\x3 \x9aL\xb3" +"B\xe\x80\x7f{'b\xe2\x1d\x98\xaa\xb1\xbd\x63\xe8\x81R\x18\xf\r\xb9\xe4\xfd\xe5\xc3" +"e\x96\x14\xa1<\x9\xb5\xe1<\xdbx,\xdd^2\xa0\xdd\xf3\x9H,x'\x1c\x62\x97\xeey|n\x19" +"\xa5\x8e>P\xe0\x1c\x9fJ\x18I\xbf\xc\xee\xea\xe9\x1f\x64\x8b\xb0`|K}\x10\xa1)7\xea" +"\xe4\x9c\"\x99\xdf\x39\xbb\x10\x92\xc6\xdd\xdc\xde\xa4\xa5\x85%k\xa5s\x9b\xc1w\xb4" +"\x11\xeb#j\xf3\xebl0\x12\x83}\xc9\xef-\x83\xed'\xf6\xbe\xd0\x66\x97P\x8f\xc3\xad" +"\xd6\xa4n\x97\x46\x1a\xffu\x92\x66m\x91\x30JJR_ \x94\xa7\x83$\x0\xa8{!\xb1)b\xf0" +"c\xa9*l\x8c\xfe]z\"\xabh\r\xfc\xaf:nL\"\x11\xcf\xe2q\xfdS,P\xd2\xf$y\xc5\xf0\xe4" +"qs\xec\x8cr\xda\x8e\xaa\x96>kY\xb0\xeb\xb4\x9cM\x1fW,oC\x19\x65\xb9\xe2!z\xc1\xc2" +"L\xd2\xbf\xd8\x14\n\xe1}\xe9\x62\x63\xa6y\x90\xbm\x8b\",n\xbb\x93\xd1\x2\xab\x35" +"C\xc5\xc5\x3\xd1\x36w#\xc1\xe0>\x81\x8f\x61[Pf\xb5\x82v[\x6\x3\x86\xbf\xc3\"\xe1" +"\xd7\xce\x39z@[P\x13\xe3G\xcb\x13\x42\xd1\x38\xe6\\\xd5\xa9\x3\x39t\xd0>\xc3u_z\xc0" +"\x92\xc5\x9f\x32\xca>k\xcfM,\xa9\xda!\x0\x9c\x90[o\xd2\xd2\xd1\xe8\x9b\xc8@\xab\x2" +"]\x3PQ.\x3\xcf\xb0\xe9\x38\"\xa4\x9b\x38\xc0\x82\xaf\xc5\x34\x10\xbp\xba \x97\xff" +"\x12\x8e\xf\xa5\xb2]gi\xf1\x62\xed\xa8\xae\x80\xa4(\"\xaa\x2[j\xd3m\x1a\x63\xb9R" +"\xee\xda\xd0\x8d\xfaSm\xba\xb1v\xb8\xb7\xd4\xdc\xd0\xce\xb8}\xa4i\x16\x64\xe3s\xb5" +"\xc2K\xc2\xb2\"\xe7\xe9\xca\xe2\xbb\xc4\xd2\x31\xeb^}\xd8z\x12\x63,[o\x8e\xd0\x31" +"7,R\xd2/\xfa\xf2\xc5\xfe\x17\xca\xed\xe0\x1b\x65,\x86\x9$\xec\x85\x61\x44\xef\xa8" +"\xd1\x94\xed\x13\xd2.\xd0/!\xe3\x62\x13\xdf\xda\xf0P\x9f\xbc\x96g\x12\x1b\xe4S\xc" +"\x9fh\x1a\x1c\xa5\xe7K\xe0\xb6\xc4\xc0\xc8\x63\x96o\x9f-u4tKk\x95X\x7\x8d\xbevr\x9d" +"iCqK\xf8m\x8b\x9dL\x11\xf9J\xa6\xf8\xf1\xa3\x66\x5(mb\x95\x7f\xf1\xeb~\xc5\x32\xf3" +"\x81\xaa\xe1l\x9a\x1b/\x8e\xaa\xc3(\xb2\xc5\xe4\xf8\xa9R\x8a\x8f$\xc7w&\xb8\xc2\xc" +"{.M\xaaM\xc0\xa6\xcd\x90\x1bU\x8b\x7\nWa\x84\x90\xed\xea\xad\x36t\x83\x37;\xf8\x97" +"\xc3\x46\rK\xdaM\x88@\x3\xc5\x62s\x87\x36\xab\x1b\xf9\x14\xf2\xcb\xb5\x89\"\xf0P" +"\xf6Z\r\xed\x96\xd3\x42\x81\x9c\xac\xe6\x19_L\x93%\x1v\xb5\x14Q\xbe\x3\xde\xf3\xfa" +"S\x18\xdb\xde\xbf]\xb5\xe1\x10\x16\xf0\xb2q\xa0\x6\x46u&\xdch\x8e\xcd\xda\x88!\x11" +"4H\x8b%\x17#\xa6\x42\xeds\xd6\xa9\x10jwP\xbe\xeb\x3\x8\xe1\rJ\xbc!\x8b\xe2\x30\x8e" +"`\x89\xb0Z\x11'\xf8\x1c\xc3\x4\x96#6\xf3\x8b\xa1s\xf8\x5\xe8H\xc9@sn\x16\xfa\x82" +"\xac\ni\xac\x37\xfc\xb\xe2M9\xae\xd4\xdb\xf9\xc7\xb0\x8f\xb9\x42\xd9k\x8c\xcb\x39" +"a\xf4&v\x1f\x41\xde,\xa4\xe8\xeb\xe0\x39\xec\x64\x1c\x9d,\x19\xc7s\x9a\xf1\xa3O\x1f" +"*\xc1X\x80\x88j\xe6Z\x10\xf4\x82\xde\x12\x1aX\r\xc8\x30[;\x8d\xdb\xb8\x34\xf1\xba" +"m\x1\x36\x44\\\xf7g\xe\xe0\x1bi\x1\xe3\xda\x11\xdd\xa6u\xb3\x1c\x9\x96/\x17\x83\x45" +"\xd2%\xd0\x1c\x91\x6\x99\xd6\xfd\xf0|0\xb7n~:~\xec\x65\x83\x32(>\x5\x8c\xca\x83\xcc" +"t\xe2\xafl\xd1\xb5[\xb3\xeb\x88\x9c;\xec\x30\xed\xb\x98\x9a)\x92JR\"\xb9\xb1\x9\x9e" +"\xab\x1fu\xda\x7f\xf5\xc6\xa9\xbcT\xcd\x62\\\xe0\xa4\xb1n\x96(\x97I}\xe$\xc0\xbX" +"\x2O&:~\x97H\xed\x1eM?'\x3\x5\x95\xa4\xea:\xf3\xb7\xd3\xa7\x6\xd5\x81|\xa8\xfb\xbd" +" \xb\x90\xa3\xf0\x35\x6\xeI\xad\xb8\xc\x35Y-A\x9fK\xa3;\x1\xa2/\x87=\x19\xea\"t." +"\x8d\x1c\x7fsY*\xc1\x42\xc7\x8e\xde\x65z\xa5\x8c\x1f\x8ev\xce\xeaZ\x3\x8a\xe3\x83" +"\xb8\xea\xf9\x90\\\xf5\x7f\xe3!\xda\x19\x5*\xf9\x65\xf2\xf2\x9\x34\xca\x6\x99\xc4" +"\xfc\xdf\x1f\x65\ru\xb2\x15\xf5\xa4L\x1e\x5\xf2i\x8bU\xe5\xd0\xc7\x92\x38i\xce\x9b" +"h\xc8\xa2\x64\xb5\xad\xc1\x38\xde\xaf\x45\xc2\xa2|s\xeaL\x6\xc3-\xb3\x9f\x39\xe4" +"N\xb4\xb7\xef\xb7k\x90\xc4\x19\x19I\xcc\x11\xe1\x95\x9a\xbb\xf2\x17V\xc2\x17\x65" +"G\rXa\x8a\xed\xf3\x43\x39=q2\x4\xde\x92pSo\x10\x9\x44h\x1f\xc0:\x84K.\xd8O\x16\x85" +"\xf6\x7f\x81\x39J5\xa2\xc6]v\x81K\xf\x35,\xae\xe1&\x80\xe3/\xb\x86\xde\x65$P\x1f" +"\xc5\xbbJ\x11\xe\xaaI\xad\xd6\x92\xcb\xa0\xa1\xd4\xf6Kha\xf8\xe8\x8a\xe1N\x13\x9a{\xce" +"\xddL\x88>2\xd3[\x5mDv\xdbY\x90\xbc\xd8\xe6s\xfes}\xa6\xe1\xce\xfe+\x9eog\xc1QA!" +":\xa3\xd8\x1c\x13\x3\xfcLC\x15w\xc\x14\xe9\xa1,\x5 \xb5*\xb2L\xd3\x15\xbc\x35\x1e" +"\x5\xf1p\xf5,\x8f\x34\x7f\xf9\xcb}.\xddw\xf0\xf4\xcfP\xcf\xfb\x84\x63*sbz\xfb\x4" +"\xcf\xdd\xc1\x1btI/)\xca\x61\x41\x86o\x9c\x8t\x1bX\x9e\xa0,U\x4\x7~\xe2\xc6\xef\xd0" +"\xb5\xa0\x81J\x85?\xa9V\xdf\x10\xd1\xbe\x66w'C\xe1\xed\x8d`\"\rH\x82k,\xfb\x65\xbf" +"5\xfe\xba\xd3\x95O0x\xef\x6\xf3i\x1d\x7\xc5\x61\x84\xbe\x7\xfa\x19)R\xf3\"\xcc\x45" +"W\x11\xc0\x9d\xcd\\?\xab~.\xe2\x1a!pOs\x9c\xa1\xa4J\xb7\xfa\x83`oC\xcc\xb6\x18\xca" +"r\xa1\x85\x10\x8b\x91kNi\xb9I\x90\n\x65J\x8c\x31\x1d;<\x8f\xe0\x30\xff\xbf\x11\xab" +"\xce\x1b\x8a\x86\xbc\x37\x98\x32\xca\x18\xa3j\r\xc9\x61\x36\x1d\xcf\x61\xa5\x96\x37" +"\\&J\x8b\x37\xf0i\xc0\x8aP\xfa\x87\x9a\xd2\xfeG*\xbf\xc9\xcc\xe5~\x9b\x14\xe3\x15" +"p:\xf3\x9I\x14\xf0\xbdv\xba*\xb4\x46\x94\xe4t\xa9'\xd3\xfd\x9b\xbf[.\xa2\x8f\x34" +"\xeb\xb3\x66\xa5\xe\x5\x31\xe9(Z\xc3\xda\xc9{\n{@\xbd;Q\x1aU\x89\xf8\xe2\xf2\xb3" +"\x84Q\xf6Z-&\xaaN\xa2K\xe6\x33\xbb\x96\xd8\xfa\xe\x19\x8f\xa2|\xecw\x8b\xa6\x8e\xf2" +"\xb3\x9d\x80h\x9c%\xbd\x44\xcd=\xa6\xfd\xd5\x8cz\x8b\"\x5\x37\x9b\xa5\x84\xab\x11" +"j~\x18\xd7\x9\xb5^\xec\xcf\xa5\xdd\x0Jr]\x9e\xec\xb5z\xf1!\xe4i^\x8e\xf6\xb5\xc6" +"\xf1\x15\xd7\x87\xad\xda\xfd\x64<\x9a\xfe\xd6t{\xef\xbcK\xf6\xeb\x97Tr\xe9\n\x88" +"\xda\xd9\x9c\x61\xf\xf4\xa2\x9e\x9f\x10\xbb>1\xfeQr*\xac\x41\xb5\xab\xf2\xdc\x32" +"\"\xb1\xb4t\x2\"\x32;\n\x17Z[K\xa0\xa5\x4\x64\xfb\x97\x0\x30}m\xdc_\x89\x8f[\xf3" +"\r\xbc\xee\xc0\xef\x18\xa1\x1c\xa7\x95\x99\x3\x7(\xb3/\xfc\xcb\x3\xddr\x96\xc2|\x18" +"\xcc\x4\x7r%\xc5\xe7\xaa\xf\x15\xdf\xb8; 4\x4\x96\x14\xf4$\xf3\xfbH5\x99\xd8\xa8" +"\n\x1\x7v{\xe7\xa0\xea\x37\xfe\x84\xab\x38\xf5\x86K\x17j\xe2\x97\x11m{\xff\x35\xe" +"\xf0\x87\xbb\x19\xea\x66\xb3\x1d*\x82x\x18\x18\xabh\xb3\x46zP\xc0Q\xa3\xfd\x14\x38" +"\x1\xe4hD1\xf3%\xf0\xe2\xae@\xc3\x96\x12\xf7\xad\x91\x1a\x35\xad\xec\xce\x6T8\x9d" +";\xcd)\x97\xff\x95\xa3GbA\x1ar\x16\\\x9\x44\x15\x35\x8c\xa9\xba\xfb/3\x84\x7\xbe" +"\x1dy\x1ekquuV\xa4MtK\xb5:&_\x18}QV\xda\x61\xd5\x42\x8aS\x99\x64S\xb8\xcd\xf3\x39" +"*~\x89\xa3\x1\xd1\xc0\x37\x38\x97U\xe7\xd8\x9a\x80\xe2\x9a\xd7\xa0\xc\x83\xd4\xa2" +"K\xfd\"\x86[\x6\x95\xeb\xf7S\x87\x38\x9\x95GD\x98\xcb\xaa\xehC\x8f\x41\xee\xa9]w" +"\xf6\x61N(\xc6L\xb0@\x9k\xca\xab\xad\xfd\x9a\x9b\x64" +"\xa1p\x0\xf2\xe\x1a\xad\x16\xcf\r\xfb\xcb\xf5\x4\x83\xc2\x8e\x13\x13\xc\xe2\xf4\xe8" +"yww\x0\x1f\x2\xa3\xdfT\xbe\n\xfc\x94v.\x8e\x31\x93\xb8\x84\xa3\xed\x95\xce\xda\xa2" +"-\x80\x32\xb9\x8a\x80\xe2u\x96\x86\x83\\\xef(\xe5%\x10M\x1a\xa7\xe7\xd0\x85\x4\x1" +"\x17l\xb6\x93\x42n@6\x9d\x39*q@\xc0\xa4t\xf\\X\xd7\xe5\x9\x8f\xb2\x1e\xc5\x61%\x36" +"2\x1e\xf0WQ\xa5\x13\xeb\x7\xde|\x8b\x9a\x66\x8eJ\xd2\xb3@9\xb8G\xcb%\x93\xc5\xc8" +"f\xc7\x19\xa1\x18K\xf3\xf\x97\x9e\x31~b\xfbK\xd6\xe6\xf3\x35\xf2\xf2|K\x8d\xfd\xe9" +"\x9fL\x90\xef\x8bu\xe2\x9e@R\xdb\xf\xcd\\\xc7\xb6L\x98T\xc9$c@\xb5\xdeo\xd9\xb6\xd7" +"\xcd\x1c\x8b\x8.\x81\xee\x8\xe8\x9<\x14\xdf\xd4\\G\xb\xf7\x87ZtR\xb2_m\x86\xa8\x6" +"\xef\x45=`l\xb4o\xa6=\x94V\xf9\x9a\x17\xabm\x98\xa4\xc3+\x7\xb3\xb9o\x10\xfe\xaf" +"\xc9\x97\xa1'\x1bT\xabIC\xb\xda\xb5\x87\x1b\xacsOE\xd3\xcc\xa5\x1fRB\x9eS\x93Jv\xf3" +"\xc4\x16\x9\xda\x9c\x46m\x89\x35\x1b\xa8\xf8\xb6xmcu\xe3 \xda)\x97\xd6\xc9Q\x8ap" +"!\x5\xdbm\x91\xe2\xbc\x9^W,\x9dg\xc\xf1\x9f\x8\x88\xcf\x1c$.\xd2%\xe3\x65;*N\x7\x82" +"\xb\x81\x5\x12{\xf0N!\x97\xa5\x7f\xec\xb4\x62\x81\r\xe\xf4\x15\x38\x93\xc6\xff\x92" +"\xec\xda\xb4|\xd9\x1b\xdb\x6N\x1a\xa0m\xb6\xd2\x3\xf2\xc8\x9a\x9\x15>\r\x8f\x81)" +"J\x89\xbb\x83U\xe0\x15N\xb6\xd8\xc8s\xb0I\xd2\xec\x99\x8c# \xdb\xa6*Gj\xa4#\x5\xa8" +"7\xeeGuq\xf\xaa\x43`\x9\xcd\xe4\x89T\xfc\x8\x8f\xb8\x97\xe5\x65\xa5\xdf(\xb5s0\xdd" +"\xeb\x14\x97\x13\x8d\xa7S\xa2\x8\x8a\xfa\x90\xf1li\xe\xaa\xb2\xb7\x1e\xe5\xf9T\x90" +"\xe5\xc4]./\xf3L\xc0\xec\xcd\x94\xed\x9\x19\x0\x95\xc0\xf2&'%a\xd3I\xad\xf2\xa1\xf5" +"\xeb\xe3\xec#\xfbmCC.\n\xcb\x38\xc3\x94\x85\x96\xb4\xbc\xfe\x66\\\x34\x1c\xe0\x6" +"\xa1\x97\x9e\x89'4d\x5\xbcy\x1f\x8?\xa4\xa4\xa0\x14\xa7\x8)\xaf\x99\xf5J\xdbt-$\xa1" +"\xbf\x81\xa6\xd6)\x86\xdch\xf1\xf2)\xf6\xf6\xd1\xbf\x18\xb4R\x9aT[ \xa8\xe6T\xbf" +"A\x17\xb4\x8\xb6\xb8o\xf\x8a^\xe9?!!^\xe6\x9e\xbb\x98\xcbx:\x87\x84\xee;\xefK3\x9d" +"\x84\x39\xa3^\xdc\xfe\x98\x9a\xfG'kw#\x13@\x87\xc4LDM\xd0\xd4\xa4\x1c\x62\xc1\x8" +"\xe0\xd9^\xad\x8f\xa3\r\x90\xa8\xd8\x7f\x9a\x10\x86\xf3\x11\x83\xe4zTJ\xa9\xc6\xb7" +"\xc6\x31\xbc#\xb3\xe4\xdek\xd0R1H\x92o\x18\xfc\xe8\xa7\x84\x1cs\xb4v\xfa\xc1\xf6" +"}#\x94\xf4\x65\xe1\xdf%\xa2\xec\x14]\xff\x15\xb8\x31\x95\x30%\x1a\xf1\x81S\xaf\xfc" +"\x15Q\xd7\xb3\x81\xcdM\x19\xab\xa0\xb4\x97w\x9b\x42\x2\xb8+\xf4\xac\xbfL\xd2L\x9e" +"\x12\xf6\x5\r\xc8\x45\xae\xd8\xb\xed\xf0\xb0\xb2(\x2\xce\x89\x35w\x6@o\xd5\xf2j1" +"\xb5l6\x88\x16R\xaa\x34\xd0\xa3\x1f`\xe8\x44P\xd4\x92\x99&\rp\xc9xh\x9c\xec\xab\x19" +"o3\xd2 '\x91\x42\xff\x39=0\xac\x8f\x8f\x95\xa2(\x13\x17\xf6L\xfd@*h\xafW1r\xcc\\" +"k\xac\xc5M\xfe%\xf4&\x6\xcco\xf7\x7f\x15\xe2\xdd\x42\xe7\xca\x9f\xef\xe4\nY\xe9\xfe" +"\x99\xb-\xdePt<\xc2\n\x16\xa0V\xf8\x0\"\xbcm2\xc6\xc9\xf3\x95\x99\xb6iyo\xf4\xef" +"\x8c\n),\x15\x8d\xff\x87'D\xea\x1e.\xd2K\xc5\xf8\xeO*9\xe4]/\xca\xd1\xd9\xf3\xaa" +"\xed*:\";\x99LU\xdb\xd8|\xe8\xc7\x8n\x88\xa1\xf1\x12tG4\xb3:p}\xf7\xac\xf0_t\xd7" +"EEZ\xc8\xd8\x33\x93\x87\n.\xfc!\x19?\xf4\xe3\x10K\x89\xb6\x7furY\xa5\xd3*\x90v0R" +"s\x1bT\x9f\xc9\x17\x97J\xf2^\xc3\x33\x66\xad\xea\x18\x9\xb6\xa2ui\xeb\xd0g8\xfb\x89" +"\x1e\xe7\x17\x8c\x45\xaa\x46\xc3\x97\x14\xbz\xe4r\x85]\x83p\xfbilH\xe3\xd8\xd1\xf7" +"\xc3\xbd\xadN\x0\xbd\xd0\x97\x2\xbc<\x9a-ul4K(ak\xa3I\xfb\x9ey\xd8\xb1\xa1(\x16\x4" +"\x81\xc5\x3\xe9\xf8\x88_\xbbo\xfay\x8f\xbf]\xd1\x80\x9b\x4\xc8VF\xe6o\xc\x34o\xd7" +"\xd4\x66\xb8>e\xa4\x87\xdc>K\x15\xbf\xd2\x4\xb5s\xa9\xf1\xc6\xc9I\xd3sH:\x15 \xeb" +"\xc7\r\xfe\xe0\xa1\xe3\x83\xf0\x61\xd9GQ\xaa\x14\x8f\xdby\xf1\xae\xf2\x12\xf7\xde" +"\xfd\xc6\xf4\x1f\x33Hp5X\xf1lE\xfd\xb\x43\x92\xb4\x17\xcf\xc1\xb2\x1d\\N\xd1|Gp\x96" +"\xce\xcf\x8e\xe7\x86\x88\xd7\x7N0\x9b\xe9\xb5\xcah\x1a\x10\x98\x15\x8e\\\xdc\x16" +"Tu\x9b\xaa\x5\x82\xc7\xc3\x62\xec\xaa\x0\xe5\x1\x91\x13l\xfb\xac\xfc\x10G,\xe3L2" +"]u\x9b+\xf2m~\x6\x97\xaf\nu$w\xb2\x9b\r\x9\xec\x31\x95\x8\xff\xe6\x90\xf8\x46\xfc" +"\xa2\x9d\x7f\x7f&Vf\xd7W\x9b~\x8f\x1a\xce\x9\x86\x8c\xfd\xc7\xad\x92\xe7\x1a\x9b" +"'>\x2\x9b|'\x81\x64\xf4+\x6\x7fI\xc7\xc8\xba:\xc4\xd7\x5\xde\x83\xe8\\\xa2\x11w\xf3" +"\x8f_\x1e\x9a\xcao\x90\xbf\x38\xd8_\xae\x32N\x1a.\xb3u\x8d\xe4>\n\x91\r\xb6\xcd:" +"yF\xc4\xfe_\xab\xa6\xf2\xf2\x11\xf4/\x10\xa8\xd3\xe1\xf7\xa6\xbcl\xb9){\xa3;\x4v" +"7a\x82\xb7\x8b\\\xf5\x88\xfd\xc3ut\xcbo\xe6`\xa6\xd0\xc5O\xb4\x90\x86\xfbT\x86J\xc0" +"\x8\xa4\x7fg&3)]`\xce\xd2\xff\x9av\xf8\xaa\xbc\xc4\xc4\x5}\x11\\\xe\xe9GN|\xe6\xaf" +"\x8e\\\x9a\xcf\x30\xca\xf8\xd2l\xfd\xa1j^\x9a\xb7\xeb\xb4\n\x9e\xa9\x34\xaa\xeb\xcc" +"\x1d\x2\xd1^_\xea\x5\xb\xf3\xdb\xe0\xa3\x9\xa6\xbb\x38s\x96%\x1e\x36'\x15V\xc5\x3" +"\xf9\xd1\x99\x8e\xcd\x9c\x9a\xb8\xb6\xe8\x8c~\x1f\x32Yl\xe1\x83\xc3\xe6\xc8q\x9b" +"\xcc\x4\x94\xa5r0\xe7\xfa^\xf9\xb7\x85\"\x90\x13\x8f`\"\xf6\xd3\x0N(\xaeQ\xea\xb1" +"\x13\xc0\x99\xed\xe4\xabms\xaa\x1f\x8d\xd5\xa4\xff\xbb\x88\xd6\x92\xb0\x17\xe3\x13" +"KU\xcb\x41lq\x1>:\x7f\x4\x92\xa7y\xcf,\xd0\x30\x82\xee\x64=%8\xe0\x93\xec\x92\xad" +"q\xcc\x99\xa0\xc6\xb2z\xe5\x2=\x97\r\xc1\xa9\x99%\xe5\xebL\xa8\xd5\xd8>\xb1=.\xf8" +"}f\x13\xc4M`\xd2\x9f\x8c.\xa6\xb0\xc0\xb2Nxn\n\xea\xd6\xb6\x45\xcb\xb6\xe1\x1c\x96" +"\xe2\xd4ls\xde\x38xb5\xd5m\xb6\xbc+xm\x9d\xd8\xe1\xdc<\x8b,.\x82\x8e\xe0\x11\xa1" +"\xf8\x16\xda\xe7\x8c\xe7\xfc\xcd\xee!\x2W\xf\xa9\x86\xe8^U\x81\xb1\xa8\xb8\xed\x8d" +"k\xd9\x8a\xf\xe4\x8c\x98\xb0\xef\x14\xf1\xd2ML\x82\xbf\x8aG\xb2L|\xab\xc1\xd3}&\xec" +"Sz\xabk7Q\xdd\x8f\x1\x81\xac\x8\x1b\xa0\xb1\xfe':\xc1\xe1\x9bP\x8c\x65\xd4\x7\xb9" +"\xc6\x61\xd4nd\x1\xa5s\xc7\xad\xe9\xa6\xf6H]U\xda'\x87\xe7\x9f\xe0\x8c\x14?\xd9\xd2" +"\xa7\x46\x2O\xa4'<\xea\xff@\xe9\xb6\xc8\xa0\x10Q\xf4\x82\x88[\xb8\xce\x46\xe4\xd2" +":\xeb\x88\xb1\x66/\xa3m\xbf\x41\xfep\x96\x82r9\xf4'\xbe\xef\xc4\xc4N\x14\xe5\x46" +"\xefR\xbdMhZ\xb4\xe6\x4\x0\x14\xf1\xa5*^q\xa2U\x6\xf5\xa2\x16\x33\x1\xfa_f\x19\xd2" +"eM\xb0:\x90\xc6\x84\xff\xa9{\xbc\xad\x46w^\r\xeb\xea\xf\xb9\x8\xf0\x88\x46\xc5\x9b" +"\x95\x14\xe1[\x8cI\xb9S\xe6\x43\xf4Q\xd2K\xf\x15\xbb\x93\x10\xd6r\xe3\xd8\\]~\xcb" +"\x4\x39\x8c\xf1w\x8al%\xc6L\x13G\x9\x32\xc8Q\x1dwBw\x1f\xa4\xe^\xbd\xb4\x38T8\x6" +"L\x9d\xfb\xb7\x95\xa8\xe0U\x84\x39\xd9p\x94\x86N\xf0\x8c\x82\x9a\x94\xc4\x97\x83" +"\x97\xa9\x1\x1b\xc\xcc\xa9\xd4*)\xe4;w\x11\x8a\xec\x94\x84\x91\xbc\xb9\xd4v2\x8f" +"\xad\xfe\x5\x82:\xf4\x89Jw\xea\xebXC#\xbf%\x30\xfb\xb5\xa0\r\x30w/\xbf\x97\x8\x19" +"\x82\xc1Z1(Rw\r\xab}\x9b\xc1\x9a\xb7JMkvSz\xefj\xc8h&\xce\xbc\xc3\xa7\x7f\xaa\xf4" +"#\x8d\xfb\x4\xa0/(\x8a\x63\xc4\xf3\x90\\\x8NL\xd0\xff\x35\r\x1c\xef\xac\xe9+\xe1" +"\x95\x91\x8e\xc3\x32\xc8i\xa9\xcd\xa0\x8d;s\xa2!\xce\x99\xaa\xd7Z\xdb\xf1\x95\x9f" +"|\x10o\xdd\x98\x14%\xdf\x9c\xc0\xaa<\x15<-\xa6y\xef\x34\x8f\x13P\xc4j\xb7O\x10U7" +"\x99\x1f\x0\xe6\x8e\x4\x64\x91^OSp\x7R\xc0\xbrA\x10\xb2\x61mGr\x6\xef\xc4\x17\xec" +"#\xf{_\x15\x8f[pn'1\x8c\xdb\x1W\x8\x96\xdc\xdf\xfe\xf0s\xfb\x9b\xca\xcb#\xd4\xba" +"\xee\x95\x39\x7f\xe\x98\xe3\x98\x61\xdfG\xa5\xcb\x1!\xac\xc2'\xd5\xd2\xab\x8c\xfe" +"\x4\xa5\xde \xa1r\xe1\x14\xec\xa6\x9a=\xfd\xf3\x86\xf0\xa6?~j\x89$\x87M\xe6\x8f\xd4" +"\xd2\xe0T\x17\xa5H\xc7T\xec\xd5\x95\x42\xd3]E\xad\xfc\xd2\x96\xf8\x8d\xccR\xa0\x9e" +"\xb9\xe7t?\x88\xebs\x18\x66\xac\xddO\xd2\xf2\xee\x4\x13\x61\x42\xe5~\xc2\x93L_o\xcd" +"\xa6}'\x1a\x3?\xa1\xd8\x8e\xb7\x94I!o\xcd=-\xe7\x1a\x31.\xdc\xff\xff\x9c\x5`E\xa0" +"6\x9f\xf7\x33\x87\x14?\xf5~0m\x99\xac\xdd\xb6\xdc\x30\x8f\xf9\xa5\xb3\x8a\x90\xbd" +"\x8bm\x9cz\x80+n\x11\n\xc3\x92\xae\xd8\xd8\xbc\xaf\xa6\x31\\\xfd\xe8\xca\x7\x36\xde" +"\xa3\x37\xabV\x91\x1\xb7\x9\x85\xc1?\xd5\x98\x15\xb3\xd2'\xd8\x4\x1$\x17\xcdK\xda" +"\x9b\x34\xf8\xf1\n\xc9\xde\xdfM\x8a\xdb\x30\xee\xaf\x3\x9V\xd7G\xf5\x8b\x36%\x1d" +"\xf2w\xac\xbb\x19\xe5\xd4\x36\x34\x98:Z\x16^S\x82q\xae\x35#\xc2K_u\x8a\xdd\xa5\x63" +"\x5\xff\xfbz\xb0\x62\x15\xe1\xce\x4\x1b\x8{\xb3\xf6x\xf8#\xac\xe8\xe2\xb1\xd0\xbb" +"\x90o_@@\x80\x1egk\xe1\xda\xc3j\xc6{\xb9\xf0\xa4\\\x66\x38!m0\x83L\x1o\xbf\x63s\x1a" +"\xf9<`\xa1\x46\x92\xbf\xc3\xef\x8e\xf7^\xed<\xac\xdc\x86?a\x9a{\xbd\xce\x44\x1\xcb" +"\x1e_L\xc8\x30\x1e\xaf&\x19\x9f\xd3\x17\x1d\x97|7\xda\xde'&\xb7\xf1\x8cv\x8d\xed" +"\x89R\xf\xdf)4\x9\xd2\x9\x10q\xb9\xcc\xcb@\nlvT\"5\xcd@\xf9\xe9\x35\xbb\xaa\xda\xc0" +"BC\xbb\x42\x34\x30\xe3\xcc\x4%\x97\x94\xd6P\x7f\xdcx\xd2\x34\x92\x80)xji\x82(\xad" +",yql\xb2\xb0\xa2\x9t\xb3ijx\xe9\x96Vo\xf8\xe8\xbc\xd4|\xd7\xc\xac\x9b\x80\xb6\xf5" +"\xad\xca\xfe\x8<\xf2\x9a\x41\xa7\xb7\x61\x64\xac\x41\x7f\xdb\x66\xc\xf2\xe6\x4&}" +"3!\xabS\x1f\x9c\xb4\x34\\\xc5\x45\xbc\x36\xdc\x34\xe4v\xa9\x84S\xdb\xce\xca\x98\xf7" +"ukX\x16\x8f\x9f\xfbWS~\xd8\x37\x1e\x1b\xef\xa7\xb5\x37\xe9\x1c\x1d\x11\x45\xaf\x41" +"`\xe5i\x1a\x32\xa2\x1f\xa0\x11Z\x9e\xf7Q\xb1\x63X\xb6Hg`\x1*\xdf$\xed\x30\xf6\x61" +"\x3\xb1\x8a/pQ\xc0\x1c\xd1\xa2\xe0NZ\xbcy\xc0\x99X\xb0\x8b\x31Lj\x97\x8a\xcb\x1b" +"\x88\x5\x7W}\x2\xd9OwS\xb7\xa1\xf2!\xc7\xe3\xf3\xb2\xa5\xaa\x96\xd5\xf1\x8e\xbf\xf2" +"w\x1aU\xed:)-\x8\x9d\x85\x61l5\xf0\xb8\n/{I\x9d\x88\xf2\x0\xdf\x44\xb2\xdar\xe7\x99" +"]1\xfe\x38\xac\"@\xee\xda\xd4\x5\x94\x14\x37.e\x9b\xcau\x17\xc4\xcc\xff}\x8a\xf9" +"/\x89\x3\x42\xf1\x3\x19\x15o\xf9\xb3<\x8f\xdc\xf6\xf7T\xde\xfb\xc5\x8bt5\xd7\x19" +"\"l{\xf9\xbd\xe4\xc6G\xbd\xd3\xb1\xf1\x42\x61\x37\x9b\x43(\xfd\x1b\xfa\xaf/z\x80" +"4\xbf\xbf\x45\xf\\_uE\xb\xc1\xa3\x99$N\x8f\xe\xff\xb1Tq\xb\x85\x4o\x19{4z]G\xea\x97" +"\xd0\x1ck\x80\xb8\xe1G\x15\x9c\xc2\xb9oc\x17\xd8\xc3\xf4\x65NY(2\x8f\xb8\x44\xc6" +"\xae\xbb\xc4\x87%\x7f\xab\xc2\xcfv\xd3_|w\xb7\xee{\xa0\x35\x88\x8d\xc8\xa1\x15q!" +"\xb\xa2\xb4l\xc2\x3\x65\x64.?t#\xbd\xfc\xe2\x97\xd0\x83\xaa?2}\x97\x1\xf1O\xa6I\xf8" +"v\x93\x1f\x16\x34L\xe8\xc8@\xd4\xe3\x81\xed\xf3\xb8\x15\x34\x88\x87\xfd`|Cs\xd1\x87" +"\xeb\x86,\xd4\xbd\x15\xb\x64\x89\xa3q\x8c\n\xcb\xdb<]\xcc\xe9)\xa3\xc8\xd0s\xb7L" +"\x82\xdc\xfd\xd7\xac\x31<]\xc3\xa0\xf8\x4?\x8e\xbc\xeb\xa4\x34\xe3yU\x8e\xe8\x8c" +"\xf9\xce\x1d\x91\xcaY\x8fL\xda\xa2\x94?\xe7m\x9a\xae\x39\x8\x7f\x86v\x97\x32\xb0" +"\x15\x1c*\xec\xcf\x1dZr\x89\x62I\xad\xd5-<\x94\xd3\x16\xea\xc1!\xd1#]\xd6`\xf6\x42" +"v|\x14\x8b@\x11\xbc-\x8bW\xd3\xa3\xbb\x65M#\xc7\x64`\xc9\xa7\x82>g\xcc\x6X\xd9\xa5" +"\x1eO\xd4\xfe\x31\xf0\x37\xd3u\x3\x90\x11\xadL_\"\x98n\\\xb6=\x2\x36\x31\xb8=\xf8" +"\x0\x92\x46\xa5\x88\x19>\xe2\xb5\x62\xff\xe2\xea,'\x13\x94m/G\x9f\xbe\xdc\xea\x97" +"\xe1\xa9\x80g\x1b:+\xfc\x8e(uU+>\xb7q\xea\xfv\xdfO\xca\x15\xf!\xe2\xd9\x82\xbb\x1f" +">\x85\xc7z\xe3\x7lsoN \xdd\xf9 \xb7\xd0\xd0\x91\x96\xd5\xf7&\x8b\x83\xb4\xf6Wm\x8" +"%\x90\xc6)\xa3t\xe6\xe9\x35\x88p\x90tw\xda-\xb8\x1f\xad\x82\xa4Hz\\\xcfZ\xc1\x86" +"*\xbb\xc9\x85\x19\x11\x35t\xa5\xb0h\xbd\xbc\x13\x87\x82\x33\x37\x8a\xd4\xed\xc0!" +"\xc1\x9e\xe3\xa1;\xbb\x9$\x8e\xb4\x31\x4^\xed\xd0\x8b\x95\xee\x5\xd5\x11\x6\xb0\xff" +"\xc5\x8b\xff\x9c\xa7|\xd2\x63\x8\xc4\xd0?@\x18\x80\x9e\x86\x80\xbc\xd9\r\xf5\x82" +"3!\xd6\xadw=\xc1\xf0\x63\xf3{\x82\xfc'\xbeP]\x12Ku\xe5\x92\x41\xed\xc\xff^\xa1\xd8" +"\x1d\x45\xe9\xe0\x34\\.m\x99\x15\xb6\x33\x5\xb1\x33\xacz7\xf\x8bm\xd3q\xd5\x7\x1e" +"\xb7\"\xcc\x32\xcc-\xa3\xe0\x8b\xb2\x17\xb1Ga\xca\xe8\x1k\xbb\xf5\x65\xf0&\x95^\xeb" +"=4$9\xc7\xf4\x7,\x4\xe8kq\x15\xc5$\xcf\x80\"\xed\x1\xe6H\x96\x3\xff\r\x93L\xbbY\xfb" +"\xf3,\x89\xcc\xb2\xdf\xf3+RZ\xb2\xb1\xd3\xc8\x1e\x84\xbc\xc3~2N\xfe^\xf5\x80\xdf" +"\xe9\xfbMb\x91w\xc7\x82\x5\xe3\xfa\xf0@\xd6\xa3\xc\xb5\xc-\x88\xa0y\xb\xb6-U_5d\x18" +"\xf4\xc7]\xfej\xf6N\xc5\x8b\xc9\x5\x42S\xf0\xcb\xc1{\xe6l=-[PYu1\x11\xbdh\xb2\x82\x8ev\x18\x61\x8L\r\xbb\n\xfb\x1d)\x92\x8b\x91\xc\x10" +"1\x17\x91tr1\xc4\xa8\x87\xec\xd3\xb9\x92\r\x45=\xee&P4nQ\x0~\xe9\xc2h\xfep\xdfn\xe\xb8\xf4\x12\xa1\xe0txw\xf6#[Qmz\xb6" +"\x8b\x2\x9f\x8f\x43i\xec\xe8jw\x1b\x89\xe9\x8b\xbe\xf2\xb4<\xf6\x99\x45\xc0\x1e\xf6" +"\xe.4\x9/\xc5\xfb+\x14m\x8c\x1d\xba\x83\xb8r\xbb\xda\x95\x84-\x11\xac\xc7\nU\x1d" +"\x8e\x95Q\xce\xa0\x18\xda\xf8\xbf\x32\x92xZ\x9b\xff`l\x1fs\\\xf4:\xbd\xf\x64\x19" +"\xcfu\x92\x9e\xfe\x45\xab\x66R\xa6\x31\x45w\x9 \xf7\x39\x81L\x6\xb9k\x15\x91\xfa" +"d~\x92\xc5\x63\x3\xaeZ\x82\xa1r\xfc\x9dN\xb9\x36\xeb\xa6$\xd0\x16X\xc\xc9\x8c@\xa9" +"\xa7\xba\xa9\xde\xe4\x94g\x15\xab\xfd\xd7\x99\x93V\xb8\xcc\x39\xea\xdc\x0\xf4*\xad" +"\xc0\xb1n\x17\x8c.f=\xa2\xf4\x64\xc1\x80\x96\x44\xab\x17\x96\xeb\x82\x90\xf7\x6\x84" +"\xa6\x17k\x8\x14\xe6\x89\r\xa6\x94g\xa6?t\xdch~\r\xd0\xf9\xa7\xa1\x84\x85\xd1\xa6" +"\x85\x9|2\x84\x81\"\xc7\xa2\x11\xc2\xdar\x84R\x0\xc1\xbe\x63\xfd\n\xf2\xdc\x8a\x10" +"\xb5\xc8\x80pM3\x97]\xcc\xfc\xa0P\xf0\xd4Z\xad\x98\x7f\xb7\xfa\x62\x9c\xc2}\xfe\x90" +"\xec\xe1\xf5R\xea\xe5\x46\xca\x8b.\xe4}\x9e\x34\x9d\xa3.\xe\xb\x14S\xe6<\xef\xe7" +"\x2\"\x34\x99?\x82\xe3\x5n\x4_\xae\xd9W\x12&\x1d\x33){\xcf\xa9\xcf\x11v\x8d\x81\x16" +"\xd1\x43\xe6S\xc6O\xe8\x98'\x90\x86G\xc7\xb1\x94@.\xcbH\xa7\x32\xe7@$\xf7J\xac\x33" +"\xcf\xf6\xec\x9c\x97\xdf\xab\xaa\xf7\x35\xadVE\xb5\"\x30(h\x8c[\xf8\xba\xdf\x9c\xf6" +"Q\x9bo\x8\x7\x63\xfc\xc4\xaa\xab\x8dJb\x95\xe1\xe7\xf7:\x6\xa6\xdb?\xd2\x86\xec\x63" +"9(\xa2\xbd\xd3\x31x9\xda\xb9\x8a\x85\x1d\xdf-\x8c^s\\\x8d\xe\xff\x4\x62:\x9c\xb2" +"g\x9b\\\xf8\x46.\xed\xfb\xa9\xc3r\xf6J\xf9\xa4\xc8\x0;f\xa8\x15\xf1O\xd7\xcc\xff" +"\x14\xad\x1a\x9c\xdd\xd1\xaf\x80\x5\xc5 \xdd\xe0\xa8\xed\xa0\x7\xa4J\xaa\xdb\x82" +"\xecR\xb4\xdb\x31\xc3\xd7\xb1%-.\x7f\x80\x46\x1a\xa9G\x9e\x9d\xf2\xdd\x37\x1f\xf1" +"\xca\x90\xb0#\x94T\xbc\xd1\xd5\xcbK`\xb2v!\xe7t!\x9b^T\xe\x6\xd8\x63\x13U\xb7\xdd" +"& \xbb\x1c\xb6\x43\xd3\x87\xd8\x80MT\xf8\xf7\xaf<\xda\xdc\xe2\xfem\xab<\xed\xa6t" +"\xd3\xaf\x4\x35\xd2\x97\x96\xd0\xa4_\r\x9c\x18\xcb\xe6\x41K\x9c\xd5\xe3l\xae>\xbc" +"7\xce\x15\xad\\\xaa\x9ch\xcak\x1e&\xe5\xcd*\x92\xc3\xf4/A\x1\xacKi\r\xfe\xc2\x90" +"\xb0\xc8i\x9b\x3\xae\x91\x9f\x8eSZ\xd0~\xb6\x9\xc8\xa7\xac\x12\xc6@\xe7,rs\xcf+\xff" +"jYs];\x11\xae\x90n\x83\xdb\xea'\xck\x11\xea\x83\x7\x8f\x81\xf\xa0\x46\x3\xa6\xb0" +"\xd9rv\xe7\xadw(\xfdN\x99\xeb\x39\x12\x7;\x6vI\x11`\x1\x8b\x0\x8a\xfc\x80m\xbdl\x98" +"\x92\x15\xf4n}\x4\xa9\x61V\xf2Y\xa0JMD\xb1\xe9)_G\x1e\x9!\xdf\xc6\x1a\x63\x1e-p\x8c" +"1\x87\x17X\x3\xf8\x4\xf6\xfb\x11\x97\x33\xa8Z\xc3Pi>4\xfa\xea\xccK\xbc]\x9\x1c\x38" +"\xfa\xb4\x46\xe9\x13\x9f\x62|8R-\xab\x91\x64S?\xaf\xce\x83\xf8\x11\x18_&\x8e\x30" +"\xec\x43\xff\x46\xe5k\x0\x43\x95\x8fR\xf1\x44\x3V\xb4I\xc7\x80\xdbyl&\x95\xbe\xfd" +"\xfe\xbe\x92\x86\x90\xcc\xe1\xb6\xa5\x30\xb0\x42{N3\x89\x10\r\xc8\x61\xa5\xe\x1d" +"\x9e\x4\xbfq\xb4\x9d\x90\x1b\xb\x9d;\xec\xbe\xcc\x33\xef<\x83\xeeyf8|d\x0\x82\x99" +"\xac\xde\xb2\xf1\r\x81\x9f\x0\x37\xc5\x6\xbe\xf9\xee\x35\x33\xaf\x88\x6\x14\x33" +"\x9d\xe2,\x88\xd4\x16W]T\x5\xe3\xfe\x1f\x39,\xa3\xa1\x88\xcfo!\x18\x45\x15\x12M\xed" +"\xc6\xf2/\xb5\x3\x3\x80\x9f\x11\x8b}\xf3\x38HZK\xc8\x7sq?L1k\"\xbe\x1b\x8c\x1c\xb4" +"\xa2\x81\x19\x39\x8e\xf2\xdd)\xe8\x9z\xf9\xf8\x34\x15\xa8\xc9K(\x1d_\x81%\xec\xb6" +"V\xfa\x9d\xc4\xaf?\xbf\xba\xf6\xf2$\xe7$\x1b\x1d\x62\xe8\x42\xd9\xcf\x1b`\xd2w\xba" +"yEA0\x9c&\xa4G\xe9_\xe9\xc4\xa9\xe5Jl\x81\xf8\xdd \x19HF3\xdd\x98\xcb\xa0(\xbblj" +"\xe3V\x1d\x3\xeb\xad\xc6\xfbxs.\x1c\xa8\x17\xe1+j\xcf\x46\xe2\x14*\xae/\x88\xc9\xc9" +"\xc3\\\xf6\x64\x1e\xba\xffp\x94MX{:\x84\xa8\x9f\xc8\xd6\xafk`\xdc\x96'\xd1\xaf$\xe5" +"mS\x19\x8fq\xbc\xe3S\xd3\xdb\xd2nTs\xd6\xc\xa5%K2u`\x0\xaf\x3,\x4\x96\x81\r\x9b\xb7" +"\xef\x8e\x83]\xe8\xf1\xa2\xd6y\xa4\xec]\xd8\x63\xa5\xa3\xb5\xd0\x9\xdd\xdb\x9\x64" +"\xa5\x13\x88Up\x2\x31\x33\xa9\x94\xb0\x4q\x1\x91|\xba\xde\x92n\x91\xdf\x34\xb0\\" +"\xee\x4<\xc5\x85S\xcf\xcf\xcd \xe3\x83\x83\x17J|\xe2{\xe3\x37\x16\x15\x41\xf1\x1b" +"\xffk\xa9\xc5\xe7`\xf6\x45\xef\x33\x96=\x94\xdc\xc9\x13\xdf\x0\xae\x32p\\\xfb\xf7" +"\xa1\xb3\x95\x35L\xeb\xb0u\xe7v|\xf3O\x88R\xe7\xc1\x99\x90@z\x8e\x96\xee\xf5\x9d" +"\"\x1f\xd3=\xccqUM\xa8\xaaG.\xd3i\xd8h\\\xf5x\x0u\xdf@\xf4TDJy\xebNu\x87\x84\xa9" +"\x14\xadS\xbbO\xe9U\x9a\x1cz\x89w:\x9c\xa1\x82W\xfeh\xce\x91\xcf\xcb\xb8+N\xd5vl" +"\xb4\x65+\xb3\xc6\x45|\x7f\xf6\x9d\xabvMR\x99\x61K\xc0@D\x9\xd5\x6\x8\x8e\x12\xa5" +"\xce>\x9c\x7fJ\xa5jN\xc7\xeb\xe6\xa7\x86z\xc\x14\x66\x65S\x1eX\xcd\xcd\x36\x66\xfa" +"\x96T\xfa\x9e\x45\x35\xb5\xcf`\x1n\x16\x1fU\xe8\xb1J\xb9\xb2\xa8:W\xac\xdd\xe9\x8e" +"\xf2\xb2\xcf \xc2u\xac\xbf\xcf\x44u\xa0\xbc\xcc\xa3\x14\x43\xfe\x32w\xa2@\xd3=\x14" +"\xa4S\xb2\x14\x32\xc7\x97<\xa2\x41\x91\x9\xd3\x86\xbar4\x9fJd\x18\x44\xe1\x8f!\x7" +"\xec\xbd\xd2\xbe\x63q\xcfTy\xb0!Xe\x7f\x91\x0k\xae\xab\\\xe4\x2\x98\xf0p1\x16\x90" +"n\xda\xbd\x18\xd1\xadg\xdd\x82\xc\xcf\x32+'\xd1\x1H\xf5\xae\x31n\xd6\xce!\xaaP\xca" +"\x6\xa8\xf0\x9f\xe0\xd3\xe9\xab\xd9\x15\xad\x1L{#\x7f\xa2 \xbc\x17\x97\x8\xc7\xb" +"\xad\xcb\x7f\xec\x85\xfQ\xf7\xe9pR\n\xdcL=\xe7\x91K\xd5\xbe\xbc\xa7\xc2\x84\x9%\xb9" +"}6Y\ny3\xa4\x43%\xb1h\x99\x9e\x31\xeb\xdf\xe1\x98\x39L\x86Rs\x9d\x9f\x9anT\x14\xc4" +"\xe2\r\x63\xb9g#v7U_)3\xe6\xb2\x4\xa3\x41,\xc1\x96\x18\xc\xe5\x81K\x1G\xc2\x88\x5" +"i\xc8_\xee\x35\xd7]X\xbb(\xdb\xf2\xd3\xd9\x3\x93\xe1\x36\xaa\x8e\x39\xfd\xe1\x19" +"i\"\x92\x2\xba\x61X#\xe2\xdb\xb7\xb4\x89\x12\x97G\xab\xcb\xb1\x1a\x1d\xf0\xc4m\x1b" +"b\xc6\xce\x82\x9\xc6\x42r\n\x7f\x45\xe9\xb3n\xd8\xc6/\xc2\x35~\xe3\xf4|\xc2\x95=" +"\xbd\xad\xb5\xa3\x1cH\xfd\xb1\x1\xc8\x44\x45\x94\x17\x89\x61\x93\x2\xeX\x96N\x11" +"wnX\xe0yu\x1\xa5\xcam\x82+h\xd4\x13\x34\x17\r\xa1\xf5r\xfay\x4\xe2y\xad\xcf\xb8\xec" +"\x9b\xcf\xaa\xa5`*\x9b\xfb\xde\xdd\xbd\xad\xdd\xed]%\xdb\xbb(\x98\x8f\xb1N\xc3\xaa" +"\xa1\xca\xec\xbb\r\xfc GC\x6w\xcb\x35\x19\xd9\xb\x62\x32\x0\xba?Cq\xfb\x63\xe1\xd4" +"H\xe8\x61\xc5\x35\xab\xb5\x86\x82\x1f\x2\x43\xfa\xe9w;\x1c_\xc0\xc3\xe6k\x7nw|\xe2" +"L\xc;\xb6\x46\xb1*\xdc\x15\xbf\xc6)S\x16I\x9e\x38\xfd\x94\xdf,\xc1l@\xb2\xd9\xe7" +"\xf6\x31\x98\xd5g^\xb0\xca\xb6\x9d~\xe9+\x1b\xfb\x9fj\x87\x33\x97\x8c\xf6\x8ck\xc3" +"\xe9\xd4\xf9h\x91\x81\x8b\x8d\x8\xe4,\xad\xa1\xda\xe7\xaeX\xed\x10\xacR\xa1\xf7\x42" +"\xbc\xbe\x66\xac!\xa2{\xcc\xd7\xd2KEG\xcb\xa2'\xcd\r\x99\x9d\x88\x38\xd1\x62\xed" +"\x5\x2\x8\xb9\xb1%\x18\xcc*\xaa\xb3\xf1sG2\xae\x14Mg\x13\xac\x10 \xfcg\"k\xd0\xec" +"#\xb0\xc2{\xab\x90\x8f\x32u\xd8\xea'\xfa\xa4\xe6\xd9Y\xa6\x8b\x15>\x6\x88\xb5\xc7" +"\xa8\xd1U\x88nmF\x8e\xf2\xba\xcb\x81\x9\xa6\x9a\xd2\xd6\xd1N\x95Z\xe4\xb5\xd4\xc3" +"/\xdfnJ9\xb5<\xcW&\xe9\x86\xd4\x61\x10\x1a\xb1\xc8\xfb\x92\xbcPV\x89tN\xd3^\xc2\xba" +"g\xe8\xd9\xe8\x16l\xea}\xc0\xdd\xf6\x10\x66\xfc\xbb\xf0l\xdf\x1f\xc9\x81\x31\x92" +"I\xf9\xa5\xec\xc3\x85L\xbc\xa3\x12@\x1\x32L\\CFM\x99L\x1d;-\x1\x1e\x81vE\xbeLAH\x13" +"\x19\x16\xbcM\x18P\xf1\x9d\x85K1\x8bu\xa6\xa6\xea.\xf8L/\xf1xI\x1\x5\xcf\x80\xc6" +"\x18\xc1\x81O\x11.\xb8\xbf\x6\xae\xcf\x92\x6\x99\x7fMa\xf4\xc9\x9\x11\x9d\xb6\x44" +"8\xc3\x7z$(\xbe\xb3\xfa\xe6\xf0w2\xf7\x35\x82y\xfe\xc\xf7\x1e\xe4\x80\xcf\xe4 \x84" +"%\xc9#g&EY\xa5\x84\x87`\xbc\xb8\xcc\xf6\xcaq/j\xcaMw$\xba\xe4=k\xe2\xcb\x94\xc0#" +"\xe6\x18jB\x4`\x19w\x1c\x88\xa5\xaf\x8e\xb1Yl\x13\xe0(\x4\xc4\xfe\x1b\x1fVUxk\xb6" +"\xef\xdbpZ\x2\xff/\x1\x8a\x1e\xe\x35V1\xeb\x84g\xf5`\x1b\xf6(\x17\xdf\xd6W\xb6\x8c" +"Z9\x82\x34{\xf6\xe5\x88P\xcf\x96Z!\xef\x86\x83\xe7\xe4\x46\x1f\x10\xb8Zh\xca\x15" +"si\x95Y\xf2\xd8\xa8\x9e\r\x8f<\x99\xf6\x19\x99x\xd8Y\xfc\xed\x9e\x61\x42\x98\xc9" +"\x7f\xf6n\x17\x41Vn\xc5\xd6[\x9f\xc\x38\xf6\x30[\xbd\x8c\x44\xa3\x9a{\x2\x6\x99\x0" +"_l\r\x10u\x98&\xdd\x8f\xef\xd7\xa9\xc7*oEg_\x80\xc\xd6lQ\x85\xfdw\xb4\xcf\x9f\x92" +"e\x8cp\x13\x34k\x3\x64\x15$\x9a\x62\x1\x35\x8e\xec\xea\x44\xf0\xfcN\xfcQ\x1\x15\x83" +"b\xc9\xd2\xd2\x93}\xea\x8~\xe0\xe\xb1\x15^\x84\xf8\xfc\x16!\xf7$;Z\x7\xaf\x2\xd6" +"\xfbm\x96\xe\x9b\x99\x6~T#\\$\x1e\x36Vb\xf6\x44|&\xebm\xe9\r\x7{\xbR\xfe\x18OE\xb1" +"#\xf0\x1dQ\xb1\xca\xa7J\xe2\x95\x8d\x9a\xe4\x97\xa8\x9d?\xfb\xb5\xc8\xc7^D+o\xa7" +"\xc0\xf9\x89\xf3\x1b?\xc7\xa1\xea\x9b\xa4\x83\x41l\n\x7\xd2;\x82\x6\xe0\x8b\xff\xbe" +"=\xd3\xfe\x30\x99_\xa3\xc\xdc\x8a\x4i\xab\x14\xbc\x83[\xc5\xfaky\xb9m\xcb\x80W7\xfe" +";\xeeM2\xee\x4\xf9\n\xbb)\x9a\x34?\xac\x41\xfd$\nRrd\x17\x89=\xc1\x97\xd6\xb6\xc9" +"{F\xb9sO\xee[\x8e*!@n\xc5\x86\x89\x92N*e\x1a\x2\xc6\xd7U\x8d\x9c\x87/\xaa\xb7\x42" +"\x90\"\x33\x62\xa7q\xfd+\x89?`t\r5\xd1Y\x3h\xd3,\xa7\xeatjz\xa2\x97\xd6\x96\x19\x41\x15\xfa\xe9*Z\xf3o&\xa3\xa7;\xc4\x13H" +"\xfcz\xb3\x9\xd3S\x88\xd6u\xec\x61\x18\xf8\xb8\x9f-\x93_OfU\xb4'\x85\xfc\xec#J)\xee" +"/\xc0\x1c%\x91\x97\xc2\x1e\x42x\x9b)-H\x0\xf6\xec\x96\xf5\x8+\x8d\x46\x33\xb4(\xa7" +"nr\x83\x96N\xd4\x93\xb8v\xfb\xd9\xc8;7\xab\xc5\xf8\xc4\x34\x14\xca*\x6\x93`]\x13" +"\xee=a7\xed\xa0+\xd6\xa9\x7\xad\xd1\x65\xa0\xc1\xe2\xc5n\xa5\xc8\xf8\"\xc5\x33\x92" +"\xda\xa6_\xc\x85\xddp\x0kF\xfpn\xc5g\x8b\x43\x96(\xb4\xae\\\xb5\xa0\xa3\xf2\x95\xb9" +"\xe8\xf6\xe2\x8e\xccgi\xd9\x88\x89\x45W\xaf\x34\x85\xef\x3g\x15\x11\x84\xdb_\xa0" +"\xb2~\xee\xb0k\x98\xa1\xb9\x95\xba\xb5\xc4\xc1\x43\x9e\xfe\xc6\xe3\xa7\x14qw\xec" +"4V\x84\x33\xf5OW\x9a\x6\xd8\x31I\x9a\x84\"\xcb\x91v\x86\xbdX\xc7\x43\xd6U\xd6\xf1" +"`\x7f(\x1d\xfa\x15z\x97\x16_\xba\x9f\x66\xe5\xf\xbd\xe8!\x9b\x41\xc\xa2s4\x19\x8a" +"\xe5\xaf \x11\xe3\xe8\xbK\xf\xc2\x84\x37s\xcb\xb5,\xc2\x6\xbd\x94\xd7tw\xb6\xbc<" +"4J\xf2\xdb\xb2o\x9\x83\x98\xff\x14{0\xba\xa6*\xef\x99\xfc\xf7\x8f\xfd\x93\xda\xb2" +"\xfc\xa2#V\xe6\x1d\x3/\x1c(\xe0\xa6\x9e=\xe0\x84(\xcb\xf9\x15\x8f\xb0 `s\xa8\xf6" +"\x8f\x92\xff\x19\xfb[z\x88\x98\xf7\xb6\x9\xe0\x1a\x8c\xb5\x82\xc\x1e\x16l\xe3\x18" +"f\x8b\x4g\x14\xc0\x95\xe5\xd2\xde\xb3q}\x13\xcc\xbb\xb8\xf:N\xa7\xe5I\x1d\xe9\xe1" +"\x8a\xf6\xa4\xf2o9r\xf5\xf5\xb7x\xa5\x66\xf7\xd0wO\xb4\x8d\xb6<\xe6\xfe\x81\x9f\xd9" +"lX\x98\xe7\xb1\xea\xd3*RKp\xd5\x3\xa3\x41\x18\x35,w\xe2`Y}\xc5\x9f\xdb\xb1\xbf\xfc" +"\\y\xd5\xe8\xf8G\xad\xa5\xe1\x86\x97\xf\x6\x80\xe7>\x7f\x91\x1c\x7f<\xc4\xcf\xbb" +"\xb\x9bt4\x86\xe0\xa3\xeby\x84\xda\x91I\x98>\x1\xce\xe0\x19\xc2\xbc\xa3\xea\xd0i" +"\x1e\xe6\x43 >\xae\xcd\xa9\x9c\xb\x90\xda%\xe2\xdaL\xca^kJ\xb2\x9\xd5\x41\xce\x1f" +"H\xb4\x88\xd9\xe2\xdc!X\xbc\x18\x98\xbb\x63\xa7\x2\"\xe3\x66\xad\x37\x9fr[\x96\xed" +"\xdb+\x90\xe0\xf0\x12\x3\xf6\xd3\xb4\x42\xdcVz\x9f:\xa3G\xe\x44\xd3k\x93\xdf\x89" +"\x11&{\xa8|\xec\xe1v\xe0\xca\x7\xcd\xf7]0]\xb4\xc\x1e\xc9\xe5\x65\x1ah\xfc\xa8\x45" +"\xa5G\xcbPekP\x88,\xf3\xfbW\x2\x31~\x92\xee\x9p\x8ei\xf5\xaf\xaf\x36\xe[\x9b\xb1" +"cw\xa1\x1eT\xb6\xa3\xb9\x95\x8eR\xf0\x16\x4\xb6\xd9\x4\xe0\xff,~\x86X?x\xdeLf\xc8" +"`\xa5]\xd3\x93\x1e\xf2L\x15\xc8i]\xb8\x81\x16\xce\x5;\xbfJ\xba\x90\x10\xca\x14\x61" +"o\x9b\xc7\x19\x0\x4\xd7\xff\xde\xb7{\xa4\x63\x62\xd2\x5\xfakG\x80\xafnS\xaeZ\xb6" +"W\xfd\x33\x61q\xad\x9e\x1a\xb3\xaf\xc4\x97\xac?\x14\xc2\xd4\xf\x64\xf6\xc1\x9d\xf7" +"\xff\xe\xe3\xc8TYy\x10\xad^EUL,^F\x8a\x33'\xdbU7>W\xab\x39-\x7\xf*M\xf5\xa6\x66\xe3" +"Qy\xc1\x1f\x36l\xa3\x1d\xc0\xe2\xd7U\xd6T(m\\,-\x8e\xce\xc3-\xd8\x8e\x32\x1c\xb2" +"E\x92\xd3L\xbd\xb8}5\x97Y\x91\x96\xb3\xd4\x38\x14\xf9\xa3\x3O\xbd\xd3\x1f)\xbb[\"" +"\xe5\xdf\x1btE7#\xe2}+\xe\x10\x87\x80%\x91/\xd4\xfcZz.?\x10\x9c\xca\x1b\xf9\xf3y" +"\x9d\xaa\x42<\xecn\x2\x95#\xd7M\x15\xec]\xbd\x95\x86Y\xb5\x4\xaa\x92\xb8\x32\x14" +"\xca\xf2\xf8\xb8\x99O\xf9\xfd\x1c\xb1]:\xa5\xc1\xb4Z\xc9\x80\x1z\x1c\xbc\x8\xcd\xfc" +"0\x8c$*\x92\xda\x45\xdeh\xfc\xe0;\x9b\xa3\xf6\x31Vl\xf3Rk`N\xf5\xf3#\x5\x1\xccGJ" +"^6g3\xa1Y$\xb1%\x4\xf5\xac\x46\x37Y3;'\xdf\xf6\x3\x99$R\xc8\xbb\x31\x8fVL\x92\xce" +":*\xfc\xfc\xc5,\x18\x33\xbe\x0\xf4\x9f\x92\xc2\xd0oH\x18\xae\xe2\x33\xa5;\xb6P\x90" +"G\x9by\xf5\xf6\xef[^\xcf\x5o\x8e\xc5\x98l\x17\x2(0\x8d(\xad\x5mC}m\xed{\xb6\x86\xf7" +"\xa1\xc5\xc0\x19\xdeX\xb7\x8f\xb0\xa8o\x8a\x10k\x8a\xec\xa8\x87]\xa6\xe1s\xfcK*\x13" +"J-!#\xeeL\x1a\x1b\x4\xf7\x32\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30" +"00000000000000000000000000000000000000000000000000000000\r0000000000000000000000" +"000000000000000000000000000000000000000000\r000000000000000000000000000000000000" +"0000000000000000000000000000\r00000000000000000000000000000000000000000000000000" +"00000000000000\r0000000000000000000000000000000000000000000000000000000000000000" +"\r0000000000000000000000000000000000000000000000000000000000000000\r000000000000" +"0000000000000000000000000000000000000000000000000000\r00000000000000000000000000" +"00000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n021004l_afm_len = 31889; +char* n021004l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusRomNo9L-Med" +"i\nFullName Nimbus Roman No9 L Medium\nFamilyName Nimbus Roman No9 L\nWeight Bol" +"d\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThickne" +"ss 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Developme" +"nt\nEncodingScheme AdobeStandardEncoding\nFontBBox -168 -341 1000 960\nCapHeight" +" 676\nXHeight 461\nDescender -205\nAscender 676\nStartCharMetrics 316\nC 32 ; WX" +" 250 ; N space ; B 125 0 125 0 ;\nC 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;\n" +"C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;\nC 35 ; WX 500 ; N numbersign ; " +"B 4 0 496 700 ;\nC 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;\nC 37 ; WX 1000 ;" +" N percent ; B 124 -14 877 692 ;\nC 38 ; WX 833 ; N ampersand ; B 62 -16 787 691" +" ;\nC 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;\nC 40 ; WX 333 ; N parenle" +"ft ; B 46 -168 306 694 ;\nC 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;\nC " +"42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;\nC 43 ; WX 570 ; N plus ; B 33 0 5" +"37 506 ;\nC 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;\nC 45 ; WX 333 ; N hyphe" +"n ; B 44 171 287 287 ;\nC 46 ; WX 250 ; N period ; B 41 -13 210 156 ;\nC 47 ; WX" +" 278 ; N slash ; B -24 -19 302 691 ;\nC 48 ; WX 500 ; N zero ; B 24 -13 476 688 " +";\nC 49 ; WX 500 ; N one ; B 65 0 442 688 ;\nC 50 ; WX 500 ; N two ; B 17 0 478 " +"688 ;\nC 51 ; WX 500 ; N three ; B 16 -14 468 688 ;\nC 52 ; WX 500 ; N four ; B " +"19 0 475 688 ;\nC 53 ; WX 500 ; N five ; B 22 -8 470 676 ;\nC 54 ; WX 500 ; N si" +"x ; B 28 -13 475 688 ;\nC 55 ; WX 500 ; N seven ; B 17 0 477 676 ;\nC 56 ; WX 50" +"0 ; N eight ; B 28 -13 472 688 ;\nC 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;\nC" +" 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;\nC 59 ; WX 333 ; N semicolon ; B 82 " +"-180 266 472 ;\nC 60 ; WX 570 ; N less ; B 31 -12 539 518 ;\nC 61 ; WX 570 ; N e" +"qual ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -12 539 518 ;\nC 63 " +"; WX 500 ; N question ; B 57 -13 445 689 ;\nC 64 ; WX 930 ; N at ; B 108 -19 822" +" 691 ;\nC 65 ; WX 722 ; N A ; B 9 0 689 690 ;\nC 66 ; WX 667 ; N B ; B 16 0 619 " +"676 ;\nC 67 ; WX 722 ; N C ; B 49 -19 687 691 ;\nC 68 ; WX 722 ; N D ; B 14 0 69" +"0 676 ;\nC 69 ; WX 667 ; N E ; B 16 0 641 676 ;\nC 70 ; WX 611 ; N F ; B 16 0 58" +"3 676 ;\nC 71 ; WX 778 ; N G ; B 37 -19 755 691 ;\nC 72 ; WX 778 ; N H ; B 21 0 " +"759 676 ;\nC 73 ; WX 389 ; N I ; B 20 0 370 676 ;\nC 74 ; WX 500 ; N J ; B 3 -96" +" 479 676 ;\nC 75 ; WX 778 ; N K ; B 30 0 769 676 ;\nC 76 ; WX 667 ; N L ; B 19 0" +" 638 676 ;\nC 77 ; WX 944 ; N M ; B 14 0 921 676 ;\nC 78 ; WX 722 ; N N ; B 16 -" +"18 701 676 ;\nC 79 ; WX 778 ; N O ; B 35 -19 743 691 ;\nC 80 ; WX 611 ; N P ; B " +"16 0 600 676 ;\nC 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;\nC 82 ; WX 722 ; N R ;" +" B 26 0 715 676 ;\nC 83 ; WX 556 ; N S ; B 35 -19 513 692 ;\nC 84 ; WX 667 ; N T" +" ; B 31 0 636 676 ;\nC 85 ; WX 722 ; N U ; B 16 -19 701 676 ;\nC 86 ; WX 722 ; N" +" V ; B 16 -18 701 676 ;\nC 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;\nC 88 ; WX 72" +"2 ; N X ; B 16 0 699 676 ;\nC 89 ; WX 722 ; N Y ; B 15 0 699 676 ;\nC 90 ; WX 66" +"7 ; N Z ; B 28 0 634 676 ;\nC 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;\n" +"C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;\nC 93 ; WX 333 ; N bracketrigh" +"t ; B 32 -149 266 678 ;\nC 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;\nC 9" +"5 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B " +"70 356 254 691 ;\nC 97 ; WX 500 ; N a ; B 25 -14 488 473 ;\nC 98 ; WX 556 ; N b " +"; B 17 -14 521 676 ;\nC 99 ; WX 444 ; N c ; B 25 -14 430 473 ;\nC 100 ; WX 556 ;" +" N d ; B 25 -14 534 676 ;\nC 101 ; WX 444 ; N e ; B 25 -14 426 473 ;\nC 102 ; WX" +" 333 ; N f ; B 14 0 389 691 ;\nC 103 ; WX 500 ; N g ; B 28 -206 483 473 ;\nC 104" +" ; WX 556 ; N h ; B 16 0 534 676 ;\nC 105 ; WX 278 ; N i ; B 16 0 255 691 ;\nC 1" +"06 ; WX 333 ; N j ; B -57 -203 263 691 ;\nC 107 ; WX 556 ; N k ; B 22 0 543 676 " +";\nC 108 ; WX 278 ; N l ; B 16 0 255 676 ;\nC 109 ; WX 833 ; N m ; B 16 0 814 47" +"3 ;\nC 110 ; WX 556 ; N n ; B 21 0 539 473 ;\nC 111 ; WX 500 ; N o ; B 25 -14 47" +"6 473 ;\nC 112 ; WX 556 ; N p ; B 19 -205 524 473 ;\nC 113 ; WX 556 ; N q ; B 34" +" -205 536 473 ;\nC 114 ; WX 444 ; N r ; B 29 0 434 473 ;\nC 115 ; WX 389 ; N s ;" +" B 25 -14 361 473 ;\nC 116 ; WX 333 ; N t ; B 20 -12 332 630 ;\nC 117 ; WX 556 ;" +" N u ; B 16 -14 537 461 ;\nC 118 ; WX 500 ; N v ; B 21 -14 485 461 ;\nC 119 ; WX" +" 722 ; N w ; B 23 -14 707 461 ;\nC 120 ; WX 500 ; N x ; B 12 0 484 461 ;\nC 121 " +"; WX 500 ; N y ; B 16 -205 480 461 ;\nC 122 ; WX 444 ; N z ; B 21 0 420 461 ;\nC" +" 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;\nC 124 ; WX 220 ; N bar ; B 66" +" -19 154 691 ;\nC 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;\nC 126 ; WX " +"520 ; N asciitilde ; B 29 175 491 331 ;\nC 161 ; WX 333 ; N exclamdown ; B 82 -2" +"03 252 501 ;\nC 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;\nC 163 ; WX 500 ; N " +"sterling ; B 21 -14 477 684 ;\nC 164 ; WX 167 ; N fraction ; B -168 -12 329 688 " +";\nC 165 ; WX 500 ; N yen ; B -64 0 547 676 ;\nC 166 ; WX 500 ; N florin ; B 0 -" +"155 498 706 ;\nC 167 ; WX 500 ; N section ; B 57 -132 443 691 ;\nC 168 ; WX 500 " +"; N currency ; B -26 61 526 613 ;\nC 169 ; WX 278 ; N quotesingle ; B 75 404 204" +" 691 ;\nC 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;\nC 171 ; WX 500 ; N" +" guillemotleft ; B 23 36 473 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 36 3" +"05 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;\nC 174 ; WX 556 " +"; N fi ; B 14 0 536 691 ;\nC 175 ; WX 556 ; N fl ; B 14 0 536 691 ;\nC 177 ; WX " +"500 ; N endash ; B 0 181 500 271 ;\nC 178 ; WX 500 ; N dagger ; B 47 -134 453 69" +"1 ;\nC 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;\nC 180 ; WX 250 ; N peri" +"odcentered ; B 41 248 210 417 ;\nC 182 ; WX 540 ; N paragraph ; B 0 -186 519 676" +" ;\nC 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;\nC 184 ; WX 333 ; N quotesing" +"lbase ; B 79 -180 263 155 ;\nC 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155" +" ;\nC 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;\nC 187 ; WX 500 ; N gu" +"illemotright ; B 27 36 477 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 15" +"6 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;\nC 191 ; WX 500 ; N que" +"stiondown ; B 55 -201 443 501 ;\nC 193 ; WX 333 ; N grave ; B 8 528 246 713 ;\nC" +" 194 ; WX 333 ; N acute ; B 86 528 324 713 ;\nC 195 ; WX 333 ; N circumflex ; B " +"-2 528 335 704 ;\nC 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;\nC 197 ; WX 333" +" ; N macron ; B 1 565 331 637 ;\nC 198 ; WX 333 ; N breve ; B 15 528 318 691 ;\n" +"C 199 ; WX 333 ; N dotaccent ; B 103 537 232 666 ;\nC 200 ; WX 333 ; N dieresis " +"; B -2 537 337 666 ;\nC 202 ; WX 333 ; N ring ; B 60 537 273 750 ;\nC 203 ; WX 3" +"33 ; N cedilla ; B 68 -218 294 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -13 528 " +"425 713 ;\nC 206 ; WX 333 ; N ogonek ; B 90 -173 319 44 ;\nC 207 ; WX 333 ; N ca" +"ron ; B -2 528 335 704 ;\nC 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;\nC 225" +" ; WX 1000 ; N AE ; B 4 0 951 676 ;\nC 227 ; WX 300 ; N ordfeminine ; B -1 397 3" +"01 688 ;\nC 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;\nC 233 ; WX 778 ; N Oslas" +"h ; B 35 -74 743 737 ;\nC 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;\nC 235 ; WX 3" +"30 ; N ordmasculine ; B 18 397 312 688 ;\nC 241 ; WX 722 ; N ae ; B 33 -14 693 4" +"73 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;\nC 248 ; WX 278 ; N lslash " +"; B -22 0 303 676 ;\nC 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;\nC 250 ; WX " +"722 ; N oe ; B 22 -14 696 473 ;\nC 251 ; WX 556 ; N germandbls ; B 19 -12 517 69" +"1 ;\nC -1 ; WX 722 ; N Udieresis ; B 16 -19 701 876 ;\nC -1 ; WX 722 ; N Uacute " +"; B 16 -19 701 923 ;\nC -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;\nC -1 ; W" +"X 667 ; N Tcaron ; B 31 0 636 914 ;\nC -1 ; WX 556 ; N Scaron ; B 35 -19 513 914" +" ;\nC -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;\nC -1 ; WX 722 ; N Racute ; B 26" +" 0 715 923 ;\nC -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;\nC -1 ; WX 778 ; N O" +"tilde ; B 35 -19 743 884 ;\nC -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;\n" +"C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;\nC -1 ; WX 722 ; N Uhungaru" +"mlaut ; B 16 -19 701 923 ;\nC -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;\nC -1 ; " +"WX 722 ; N Eth ; B 6 0 690 676 ;\nC -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;\nC " +"-1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;\nC -1 ; WX 722 ; N Uring ; B 16 -19 70" +"1 960 ;\nC -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;\nC -1 ; WX 444 ; N eogon" +"ek ; B 25 -173 444 473 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -14 426 666 ;\nC -" +"1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;\nC -1 ; WX 722 ; N Ugrave ; B 16 -19 " +"701 923 ;\nC -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;\nC -1 ; WX 444 ; N eacute " +"; B 25 -14 426 713 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -14 426 666 ;\nC -1 ; W" +"X 665 ; N dcaron ; B 25 -14 665 691 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -218 43" +"0 473 ;\nC -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;\nC -1 ; WX 444 ; N cacute" +" ; B 25 -14 430 713 ;\nC -1 ; WX 500 ; N aogonek ; B 25 -173 500 473 ;\nC -1 ; W" +"X 500 ; N aring ; B 25 -14 488 750 ;\nC -1 ; WX 500 ; N atilde ; B 25 -14 488 67" +"4 ;\nC -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;\nC -1 ; WX 444 ; N egrave ; B" +" 25 -14 426 713 ;\nC -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;\nC -1 ; WX 500 " +"; N aacute ; B 25 -14 488 713 ;\nC -1 ; WX 500 ; N adieresis ; B 25 -14 488 666 " +";\nC -1 ; WX 722 ; N Uogonek ; B 16 -173 701 676 ;\nC -1 ; WX 556 ; N ugrave ; B" +" 16 -14 537 713 ;\nC -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;\nC -1 ; WX 556 " +"; N udieresis ; B 16 -14 537 666 ;\nC -1 ; WX 400 ; N tcaron ; B 20 -12 400 691 " +";\nC -1 ; WX 389 ; N scommaaccent ; B 25 -341 361 473 ;\nC -1 ; WX 667 ; N Zcaro" +"n ; B 28 0 634 914 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;\nC -1 ;" +" WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;\nC -1 ; WX 500 ; N acircumflex ; B " +"25 -14 488 704 ;\nC -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 876 ;\nC -1 ; WX 389" +" ; N scaron ; B 25 -14 363 704 ;\nC -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;\nC" +" -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;\nC -1 ; WX 667 ; N Tcommaaccent ; B" +" 31 -341 636 676 ;\nC -1 ; WX 722 ; N Ydieresis ; B 15 0 699 876 ;\nC -1 ; WX 55" +"6 ; N thorn ; B 19 -205 524 676 ;\nC -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;\n" +"C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;\nC -1 ; WX 778 ; N Oacute ; B 35 -" +"19 743 923 ;\nC -1 ; WX 778 ; N Odieresis ; B 35 -19 743 876 ;\nC -1 ; WX 722 ; " +"N Ntilde ; B 16 -18 701 884 ;\nC -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;\nC " +"-1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;\nC -1 ; WX 667 ; N Lcaron ; B 19 0 6" +"38 691 ;\nC -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;\nC -1 ; WX 389 ; N Idotacc" +"ent ; B 20 0 370 876 ;\nC -1 ; WX 444 ; N racute ; B 29 0 434 713 ;\nC -1 ; WX 3" +"89 ; N Icircumflex ; B 20 0 370 914 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 25 -1" +"4 509 713 ;\nC -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;\nC -1 ; WX 500 ; N Eu" +"ro ; B -36 -24 478 671 ;\nC -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;\nC " +"-1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;\nC -1 ; WX 300 ; N twosuperior " +"; B 0 275 300 688 ;\nC -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;\nC -1 ;" +" WX 389 ; N Igrave ; B 20 0 370 923 ;\nC -1 ; WX 389 ; N Iacute ; B 20 0 370 923" +" ;\nC -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;\nC -1 ; WX 389 ; N Iogonek ; B " +"20 -173 505 676 ;\nC -1 ; WX 389 ; N Idieresis ; B 20 0 370 876 ;\nC -1 ; WX 778" +" ; N Gbreve ; B 37 -19 755 901 ;\nC -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;" +"\nC -1 ; WX 778 ; N Kcommaaccent ; B 30 -341 769 676 ;\nC -1 ; WX 500 ; N ograve" +" ; B 25 -14 476 713 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 35 -341 513 692 ;\nC -" +"1 ; WX 667 ; N Eogonek ; B 16 -173 737 676 ;\nC -1 ; WX 500 ; N oacute ; B 25 -1" +"4 476 713 ;\nC -1 ; WX 667 ; N Edotaccent ; B 16 0 641 876 ;\nC -1 ; WX 278 ; N " +"iogonek ; B 16 -173 388 691 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 81" +"1 ;\nC -1 ; WX 500 ; N odieresis ; B 25 -14 476 666 ;\nC -1 ; WX 556 ; N ntilde " +"; B 21 0 539 674 ;\nC -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;\nC -1 ; WX 667 ;" +" N Ecaron ; B 16 0 641 914 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;\n" +"C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;\nC -1 ; WX 444 ; N rcaron ; B 2" +"9 0 434 704 ;\nC -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;\nC -1 ; WX 667 ; N Ea" +"cute ; B 16 0 641 923 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 37 -341 755 691 ;\nC" +" -1 ; WX 722 ; N Rcommaaccent ; B 26 -341 715 676 ;\nC -1 ; WX 667 ; N Edieresis" +" ; B 16 0 641 876 ;\nC -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;\nC -1 ; WX 556 " +"; N uogonek ; B 16 -173 556 461 ;\nC -1 ; WX 556 ; N umacron ; B 16 -14 537 637 " +";\nC -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;\nC -1 ; WX 396 ; N lcaron ; B 16 " +"0 396 691 ;\nC -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;\nC -1 ; WX 722 ; N Ca" +"cute ; B 49 -19 687 923 ;\nC -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;\nC -" +"1 ; WX 400 ; N degree ; B 57 402 343 688 ;\nC -1 ; WX 722 ; N Aogonek ; B 9 -173" +" 822 690 ;\nC -1 ; WX 570 ; N minus ; B 33 209 537 297 ;\nC -1 ; WX 570 ; N mult" +"iply ; B 48 16 522 490 ;\nC -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;\nC -1 ; " +"WX 722 ; N Aring ; B 9 0 689 948 ;\nC -1 ; WX 1000 ; N trademark ; B 24 271 977 " +"676 ;\nC -1 ; WX 444 ; N rcommaaccent ; B 29 -341 434 473 ;\nC -1 ; WX 278 ; N l" +"acute ; B 16 0 297 923 ;\nC -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;\nC -1 ;" +" WX 722 ; N Atilde ; B 9 0 689 884 ;\nC -1 ; WX 278 ; N icircumflex ; B -36 0 30" +"1 704 ;\nC -1 ; WX 278 ; N igrave ; B -26 0 255 713 ;\nC -1 ; WX 556 ; N ncommaa" +"ccent ; B 21 -341 539 473 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 16 -341 255 676 " +";\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ;\nC -1 ; WX 750 ; N onehalf ; B" +" -7 -12 775 688 ;\nC -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;\nC -1 ; WX " +"750 ; N threequarters ; B 23 -12 733 688 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 29" +"0 713 ;\nC -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;\nC -1 ; WX 556 ; N kcommaacc" +"ent ; B 22 -341 543 676 ;\nC -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;\nC -1 " +"; WX 278 ; N imacron ; B -27 0 303 637 ;\nC -1 ; WX 444 ; N emacron ; B 25 -14 4" +"26 637 ;\nC -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;\nC -1 ; WX 333 ; N tcom" +"maaccent ; B 20 -341 332 630 ;\nC -1 ; WX 500 ; N ydieresis ; B 16 -205 480 666 " +";\nC -1 ; WX 444 ; N zdotaccent ; B 21 0 420 666 ;\nC -1 ; WX 444 ; N zcaron ; B" +" 21 0 420 704 ;\nC -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;\nC -1 ; WX 500 ; N " +"yacute ; B 16 -205 480 713 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 537 713" +" ;\nC -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;\nC -1 ; WX 556 ; N uring ; B 16 -" +"14 537 750 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;\nC -1 ; WX 333 " +"; N commaaccent ; B 84 -341 249 -40 ;\nC -1 ; WX 747 ; N copyright ; B 26 -19 72" +"1 691 ;\nC -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;\nC -1 ; WX 722 ; N Ac" +"ircumflex ; B 9 0 689 914 ;\nC -1 ; WX 278 ; N idieresis ; B -36 0 303 666 ;\nC " +"-1 ; WX 494 ; N lozenge ; B 18 0 466 740 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 " +"688 ;\nC -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ;\nC -1 ; WX 549 ; N radica" +"l ; B -17 -35 535 916 ;\nC -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;\nC -1 ; WX 7" +"22 ; N Aacute ; B 9 0 689 923 ;\nC -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ;\n" +"C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ;\nC -1 ; WX 570 ; N logicalnot " +"; B 33 108 537 399 ;\nC -1 ; WX 713 ; N summation ; B 14 -123 695 752 ;\nC -1 ; " +"WX 494 ; N partialdiff ; B 16 -20 472 743 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B " +"16 -341 701 676 ;\nC -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;\nC -1 ; WX 220 " +"; N brokenbar ; B 66 -19 154 691 ;\nC -1 ; WX 667 ; N Lcommaaccent ; B 19 -341 6" +"38 676 ;\nC -1 ; WX 722 ; N Adieresis ; B 9 0 689 876 ;\nC -1 ; WX 556 ; N mu ; " +"B 33 -206 536 461 ;\nC -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ;\nEndCharMetrics" +"\nStartKernData\nStartKernPairs 998\nKPX A C -73\nKPX A Ccedilla -77\nKPX A G -6" +"8\nKPX A O -68\nKPX A Odieresis -68\nKPX A Q -68\nKPX A T -59\nKPX A U -66\nKPX " +"A Uacute -66\nKPX A Ucircumflex -66\nKPX A Udieresis -66\nKPX A Ugrave -66\nKPX " +"A V -130\nKPX A W -116\nKPX A Y -74\nKPX A a -5\nKPX A b -22\nKPX A c -35\nKPX A" +" ccedilla -43\nKPX A comma 1\nKPX A d -28\nKPX A e -32\nKPX A g -7\nKPX A guille" +"motleft -53\nKPX A guilsinglleft -67\nKPX A hyphen -30\nKPX A o -37\nKPX A perio" +"d 0\nKPX A q -38\nKPX A quotedblright -76\nKPX A quoteright -108\nKPX A t -27\nK" +"PX A u -30\nKPX A v -84\nKPX A w -79\nKPX A y -83\nKPX Aacute C -73\nKPX Aacute " +"G -68\nKPX Aacute O -68\nKPX Aacute Q -68\nKPX Aacute T -59\nKPX Aacute U -66\nK" +"PX Aacute V -130\nKPX Aacute W -116\nKPX Aacute Y -74\nKPX Aacute a -5\nKPX Aacu" +"te b -22\nKPX Aacute c -35\nKPX Aacute comma 1\nKPX Aacute d -28\nKPX Aacute e -" +"32\nKPX Aacute g -7\nKPX Aacute guillemotleft -53\nKPX Aacute guilsinglleft -67\n" +"KPX Aacute hyphen -30\nKPX Aacute o -37\nKPX Aacute period 0\nKPX Aacute q -38\n" +"KPX Aacute quoteright -108\nKPX Aacute t -27\nKPX Aacute u -30\nKPX Aacute v -84" +"\nKPX Aacute w -79\nKPX Aacute y -83\nKPX Acircumflex C -73\nKPX Acircumflex G -" +"68\nKPX Acircumflex O -68\nKPX Acircumflex Q -68\nKPX Acircumflex T -59\nKPX Aci" +"rcumflex U -66\nKPX Acircumflex V -130\nKPX Acircumflex W -116\nKPX Acircumflex " +"Y -74\nKPX Acircumflex comma 1\nKPX Acircumflex period 0\nKPX Adieresis C -73\nK" +"PX Adieresis G -68\nKPX Adieresis O -68\nKPX Adieresis Q -68\nKPX Adieresis T -5" +"9\nKPX Adieresis U -66\nKPX Adieresis V -130\nKPX Adieresis W -116\nKPX Adieresi" +"s Y -74\nKPX Adieresis a -5\nKPX Adieresis b -22\nKPX Adieresis c -35\nKPX Adier" +"esis comma 1\nKPX Adieresis d -28\nKPX Adieresis g -7\nKPX Adieresis guillemotle" +"ft -53\nKPX Adieresis guilsinglleft -67\nKPX Adieresis hyphen -30\nKPX Adieresis" +" o -37\nKPX Adieresis period 0\nKPX Adieresis q -38\nKPX Adieresis quotedblright" +" -76\nKPX Adieresis quoteright -108\nKPX Adieresis t -27\nKPX Adieresis u -30\nK" +"PX Adieresis v -84\nKPX Adieresis w -79\nKPX Adieresis y -83\nKPX Agrave C -73\n" +"KPX Agrave G -68\nKPX Agrave O -68\nKPX Agrave Q -68\nKPX Agrave T -59\nKPX Agra" +"ve U -66\nKPX Agrave V -130\nKPX Agrave W -116\nKPX Agrave Y -74\nKPX Agrave com" +"ma 1\nKPX Agrave period 0\nKPX Aring C -73\nKPX Aring G -68\nKPX Aring O -68\nKP" +"X Aring Q -68\nKPX Aring T -59\nKPX Aring U -66\nKPX Aring V -130\nKPX Aring W -" +"116\nKPX Aring Y -74\nKPX Aring a -5\nKPX Aring b -22\nKPX Aring c -35\nKPX Arin" +"g comma 1\nKPX Aring d -28\nKPX Aring e -32\nKPX Aring g -7\nKPX Aring guillemot" +"left -53\nKPX Aring guilsinglleft -67\nKPX Aring hyphen -30\nKPX Aring o -37\nKP" +"X Aring period 0\nKPX Aring q -38\nKPX Aring quotedblright -76\nKPX Aring quoter" +"ight -108\nKPX Aring t -27\nKPX Aring u -30\nKPX Aring v -84\nKPX Aring w -79\nK" +"PX Aring y -83\nKPX Atilde C -73\nKPX Atilde G -68\nKPX Atilde O -68\nKPX Atilde" +" Q -68\nKPX Atilde T -59\nKPX Atilde U -66\nKPX Atilde V -130\nKPX Atilde W -116" +"\nKPX Atilde Y -74\nKPX Atilde comma 1\nKPX Atilde period 0\nKPX B A -34\nKPX B " +"AE -32\nKPX B Aacute -34\nKPX B Acircumflex -34\nKPX B Adieresis -34\nKPX B Arin" +"g -34\nKPX B Atilde -34\nKPX B O -12\nKPX B OE -4\nKPX B Oacute -12\nKPX B Ocirc" +"umflex -12\nKPX B Odieresis -12\nKPX B Ograve -12\nKPX B Oslash -11\nKPX B V -45" +"\nKPX B W -46\nKPX B Y -44\nKPX C A -25\nKPX C AE -22\nKPX C Aacute -25\nKPX C A" +"dieresis -25\nKPX C Aring -25\nKPX C H -2\nKPX C K -6\nKPX C O -14\nKPX C Oacute" +" -14\nKPX C Odieresis -14\nKPX Ccedilla A -33\nKPX D A -55\nKPX D Aacute -55\nKP" +"X D Acircumflex -55\nKPX D Adieresis -55\nKPX D Agrave -55\nKPX D Aring -55\nKPX" +" D Atilde -55\nKPX D J -40\nKPX D T -7\nKPX D V -60\nKPX D W -50\nKPX D X -51\nK" +"PX D Y -59\nKPX F A -79\nKPX F Aacute -79\nKPX F Acircumflex -79\nKPX F Adieresi" +"s -79\nKPX F Agrave -79\nKPX F Aring -79\nKPX F Atilde -79\nKPX F J -42\nKPX F O" +" -7\nKPX F Odieresis -7\nKPX F a -50\nKPX F aacute -50\nKPX F adieresis -22\nKPX" +" F ae -53\nKPX F aring -50\nKPX F comma -59\nKPX F e -51\nKPX F eacute -51\nKPX " +"F hyphen -34\nKPX F i -1\nKPX F j -26\nKPX F o -54\nKPX F oacute -54\nKPX F odie" +"resis -24\nKPX F oe -51\nKPX F oslash -53\nKPX F period -60\nKPX F r -7\nKPX F u" +" -10\nKPX G A -27\nKPX G AE -24\nKPX G Aacute -27\nKPX G Acircumflex -27\nKPX G " +"Adieresis -27\nKPX G Agrave -27\nKPX G Aring -27\nKPX G Atilde -27\nKPX G T -41\n" +"KPX G V -33\nKPX G W -35\nKPX G Y -33\nKPX J A -30\nKPX J AE -27\nKPX J Adieresi" +"s -30\nKPX J Aring -30\nKPX K C -61\nKPX K G -56\nKPX K O -56\nKPX K OE -46\nKPX" +" K Oacute -56\nKPX K Odieresis -56\nKPX K S 13\nKPX K T -2\nKPX K a 6\nKPX K adi" +"eresis 6\nKPX K ae 3\nKPX K aring 6\nKPX K e -20\nKPX K hyphen -47\nKPX K o -25\n" +"KPX K oacute -25\nKPX K odieresis -25\nKPX K u -18\nKPX K udieresis -18\nKPX K y" +" -83\nKPX L A -1\nKPX L AE 1\nKPX L Aacute -1\nKPX L Adieresis -1\nKPX L Aring -" +"1\nKPX L C -11\nKPX L Ccedilla -14\nKPX L G -5\nKPX L O -5\nKPX L Oacute -5\nKPX" +" L Ocircumflex -5\nKPX L Odieresis -5\nKPX L Ograve -5\nKPX L Otilde -5\nKPX L S" +" 2\nKPX L T -74\nKPX L U -29\nKPX L Udieresis -29\nKPX L V -106\nKPX L W -87\nKP" +"X L Y -89\nKPX L hyphen 24\nKPX L quotedblright -37\nKPX L quoteright -69\nKPX L" +" u -11\nKPX L udieresis -12\nKPX L y -49\nKPX N A -19\nKPX N AE -16\nKPX N Aacut" +"e -19\nKPX N Adieresis -19\nKPX N Aring -19\nKPX N C -22\nKPX N Ccedilla -22\nKP" +"X N G -16\nKPX N O -15\nKPX N Oacute -15\nKPX N Odieresis -15\nKPX N a -16\nKPX " +"N aacute -16\nKPX N adieresis -16\nKPX N ae -18\nKPX N aring -16\nKPX N comma 1\n" +"KPX N e -13\nKPX N eacute -13\nKPX N o -16\nKPX N oacute -16\nKPX N odieresis -1" +"6\nKPX N oslash -15\nKPX N period 0\nKPX N u -17\nKPX N udieresis -17\nKPX O A -" +"55\nKPX O AE -54\nKPX O Aacute -55\nKPX O Adieresis -55\nKPX O Aring -55\nKPX O " +"T -9\nKPX O V -60\nKPX O W -54\nKPX O X -51\nKPX O Y -59\nKPX Oacute A -55\nKPX " +"Oacute T -9\nKPX Oacute V -60\nKPX Oacute W -54\nKPX Oacute Y -59\nKPX Ocircumfl" +"ex T -9\nKPX Ocircumflex V -60\nKPX Ocircumflex Y -59\nKPX Odieresis A -55\nKPX " +"Odieresis T -9\nKPX Odieresis V -60\nKPX Odieresis W -54\nKPX Odieresis X -51\nK" +"PX Odieresis Y -59\nKPX Ograve T -9\nKPX Ograve V -60\nKPX Ograve Y -59\nKPX Osl" +"ash A -52\nKPX Otilde T -9\nKPX Otilde V -60\nKPX Otilde Y -59\nKPX P A -81\nKPX" +" P AE -94\nKPX P Aacute -81\nKPX P Adieresis -81\nKPX P Aring -81\nKPX P J -68\n" +"KPX P a -19\nKPX P aacute -19\nKPX P adieresis -19\nKPX P ae -22\nKPX P aring -1" +"9\nKPX P comma -85\nKPX P e -29\nKPX P eacute -29\nKPX P hyphen -39\nKPX P o -33" +"\nKPX P oacute -33\nKPX P odieresis -22\nKPX P oe -30\nKPX P oslash -33\nKPX P p" +"eriod -86\nKPX R C -36\nKPX R Ccedilla -37\nKPX R G -30\nKPX R O -29\nKPX R OE -" +"22\nKPX R Oacute -29\nKPX R Odieresis -29\nKPX R T -26\nKPX R U -37\nKPX R Udier" +"esis -37\nKPX R V -53\nKPX R W -55\nKPX R Y -53\nKPX R a 7\nKPX R aacute 7\nKPX " +"R adieresis 7\nKPX R ae 4\nKPX R aring 7\nKPX R e -19\nKPX R eacute -19\nKPX R h" +"yphen -30\nKPX R o -24\nKPX R oacute -24\nKPX R odieresis -24\nKPX R oe -21\nKPX" +" R u -17\nKPX R uacute -17\nKPX R udieresis -17\nKPX R y -27\nKPX S A -24\nKPX S" +" AE -21\nKPX S Aacute -24\nKPX S Adieresis -24\nKPX S Aring -24\nKPX S T -16\nKP" +"X S V -9\nKPX S W -10\nKPX S Y -8\nKPX S t -10\nKPX T A -46\nKPX T AE -44\nKPX T" +" Aacute -46\nKPX T Acircumflex -46\nKPX T Adieresis -46\nKPX T Agrave -46\nKPX T" +" Aring -46\nKPX T Atilde -46\nKPX T C -17\nKPX T G -11\nKPX T J -43\nKPX T O -9\n" +"KPX T OE -3\nKPX T Oacute -9\nKPX T Ocircumflex -9\nKPX T Odieresis -9\nKPX T Og" +"rave -9\nKPX T Oslash -11\nKPX T Otilde -9\nKPX T S -2\nKPX T V 11\nKPX T W 9\nK" +"PX T Y 11\nKPX T a -65\nKPX T ae -69\nKPX T c -88\nKPX T colon -85\nKPX T comma " +"-63\nKPX T e -85\nKPX T g -68\nKPX T guillemotleft -99\nKPX T guilsinglleft -113" +"\nKPX T hyphen -73\nKPX T i -16\nKPX T j -40\nKPX T o -88\nKPX T oslash -87\nKPX" +" T period -64\nKPX T r -61\nKPX T s -59\nKPX T semicolon -85\nKPX T u -89\nKPX T" +" v -106\nKPX T w -107\nKPX T y -104\nKPX U A -54\nKPX U AE -52\nKPX U Aacute -54" +"\nKPX U Acircumflex -54\nKPX U Adieresis -54\nKPX U Aring -54\nKPX U Atilde -54\n" +"KPX U comma -17\nKPX U m -23\nKPX U n -25\nKPX U p -28\nKPX U period -18\nKPX U " +"r -29\nKPX Uacute A -54\nKPX Uacute comma -17\nKPX Uacute m -23\nKPX Uacute n -2" +"5\nKPX Uacute p -28\nKPX Uacute period -18\nKPX Uacute r -29\nKPX Ucircumflex A " +"-54\nKPX Udieresis A -54\nKPX Udieresis b 10\nKPX Udieresis comma -17\nKPX Udier" +"esis m -23\nKPX Udieresis n -25\nKPX Udieresis p -28\nKPX Udieresis period -18\n" +"KPX Udieresis r -29\nKPX Ugrave A -54\nKPX V A -113\nKPX V AE -113\nKPX V Aacute" +" -113\nKPX V Acircumflex -113\nKPX V Adieresis -113\nKPX V Agrave -113\nKPX V Ar" +"ing -113\nKPX V Atilde -113\nKPX V C -70\nKPX V G -64\nKPX V O -63\nKPX V Oacute" +" -63\nKPX V Ocircumflex -63\nKPX V Odieresis -63\nKPX V Ograve -63\nKPX V Oslash" +" -65\nKPX V Otilde -63\nKPX V S -25\nKPX V T 8\nKPX V a -87\nKPX V ae -90\nKPX V" +" colon -94\nKPX V comma -94\nKPX V e -86\nKPX V g -86\nKPX V guillemotleft -98\n" +"KPX V guilsinglleft -112\nKPX V hyphen -68\nKPX V i -13\nKPX V o -89\nKPX V osla" +"sh -87\nKPX V period -95\nKPX V r -60\nKPX V semicolon -94\nKPX V u -58\nKPX V y" +" -56\nKPX W A -98\nKPX W AE -102\nKPX W Aacute -98\nKPX W Acircumflex -98\nKPX W" +" Adieresis -98\nKPX W Agrave -98\nKPX W Aring -98\nKPX W Atilde -98\nKPX W C -58" +"\nKPX W G -52\nKPX W O -51\nKPX W Oacute -51\nKPX W Ocircumflex -51\nKPX W Odier" +"esis -51\nKPX W Ograve -51\nKPX W Oslash -50\nKPX W Otilde -51\nKPX W S -24\nKPX" +" W T 9\nKPX W a -70\nKPX W ae -73\nKPX W colon -81\nKPX W comma -72\nKPX W e -67" +"\nKPX W g -70\nKPX W guillemotleft -79\nKPX W guilsinglleft -93\nKPX W hyphen -4" +"9\nKPX W i -12\nKPX W o -70\nKPX W oslash -69\nKPX W period -73\nKPX W r -49\nKP" +"X W semicolon -80\nKPX W u -45\nKPX W y -44\nKPX X C -63\nKPX X O -56\nKPX X Odi" +"eresis -56\nKPX X Q -57\nKPX X a 0\nKPX X e -27\nKPX X hyphen -43\nKPX X o -32\n" +"KPX X u -25\nKPX X y -90\nKPX Y A -64\nKPX Y AE -62\nKPX Y Aacute -64\nKPX Y Aci" +"rcumflex -64\nKPX Y Adieresis -64\nKPX Y Agrave -64\nKPX Y Aring -64\nKPX Y Atil" +"de -64\nKPX Y C -71\nKPX Y G -65\nKPX Y O -64\nKPX Y Oacute -64\nKPX Y Ocircumfl" +"ex -64\nKPX Y Odieresis -64\nKPX Y Ograve -64\nKPX Y Oslash -68\nKPX Y Otilde -6" +"4\nKPX Y S -26\nKPX Y T 7\nKPX Y a -83\nKPX Y ae -87\nKPX Y colon -103\nKPX Y co" +"mma -80\nKPX Y e -93\nKPX Y g -86\nKPX Y guillemotleft -111\nKPX Y guilsinglleft" +" -125\nKPX Y hyphen -87\nKPX Y i -14\nKPX Y o -96\nKPX Y oslash -95\nKPX Y p -72" +"\nKPX Y period -81\nKPX Y semicolon -103\nKPX Y u -76\nKPX Y v -78\nKPX Z v -45\n" +"KPX Z y -44\nKPX a j -39\nKPX a quoteright -34\nKPX a v -39\nKPX a w -40\nKPX a " +"y -44\nKPX aacute v -39\nKPX aacute w -40\nKPX aacute y -44\nKPX adieresis v -39" +"\nKPX adieresis w -40\nKPX adieresis y -44\nKPX ae v -34\nKPX ae w -35\nKPX ae y" +" -37\nKPX agrave v -39\nKPX agrave w -40\nKPX agrave y -44\nKPX aring v -39\nKPX" +" aring w -40\nKPX aring y -44\nKPX b v -39\nKPX b w -40\nKPX b y -42\nKPX c h -1" +"7\nKPX c k -18\nKPX comma one -12\nKPX comma quotedblright 9\nKPX comma quoterig" +"ht -23\nKPX e quoteright -19\nKPX e t -10\nKPX e v -29\nKPX e w -30\nKPX e x -19" +"\nKPX e y -31\nKPX eacute v -29\nKPX eacute w -30\nKPX eacute y -31\nKPX ecircum" +"flex v -29\nKPX ecircumflex w -30\nKPX ecircumflex y -31\nKPX eight four 11\nKPX" +" eight one -19\nKPX eight seven 0\nKPX f a -17\nKPX f aacute -17\nKPX f adieresi" +"s 14\nKPX f ae -21\nKPX f aring -15\nKPX f e -29\nKPX f eacute -29\nKPX f f 12\n" +"KPX f i 22\nKPX f j -1\nKPX f l 33\nKPX f o -32\nKPX f oacute -32\nKPX f odieres" +"is 11\nKPX f oe -29\nKPX f oslash -31\nKPX f quoteright 18\nKPX f s -8\nKPX f t " +"-3\nKPX five four 1\nKPX five one -28\nKPX five seven -9\nKPX four four 13\nKPX " +"four one -35\nKPX four seven -16\nKPX g a -15\nKPX g adieresis -15\nKPX g ae -18" +"\nKPX g aring -15\nKPX g e -20\nKPX g eacute -20\nKPX g l 0\nKPX g oacute -20\nK" +"PX g odieresis -20\nKPX g r 1\nKPX guillemotright A -40\nKPX guillemotright AE -" +"46\nKPX guillemotright Aacute -40\nKPX guillemotright Adieresis -40\nKPX guillem" +"otright Aring -40\nKPX guillemotright T -100\nKPX guillemotright V -102\nKPX gui" +"llemotright W -84\nKPX guillemotright Y -106\nKPX guilsinglright A -54\nKPX guil" +"singlright AE -60\nKPX guilsinglright Aacute -54\nKPX guilsinglright Adieresis -" +"54\nKPX guilsinglright Aring -54\nKPX guilsinglright T -114\nKPX guilsinglright " +"V -116\nKPX guilsinglright W -98\nKPX guilsinglright Y -120\nKPX h quoteright -3" +"0\nKPX h y -34\nKPX hyphen A -18\nKPX hyphen AE -24\nKPX hyphen Aacute -18\nKPX " +"hyphen Adieresis -18\nKPX hyphen Aring -18\nKPX hyphen T -74\nKPX hyphen V -72\n" +"KPX hyphen W -54\nKPX hyphen Y -83\nKPX i T -18\nKPX i j -36\nKPX k a -3\nKPX k " +"aacute -3\nKPX k adieresis -3\nKPX k ae -7\nKPX k aring -3\nKPX k comma 0\nKPX k" +" e -33\nKPX k eacute -33\nKPX k g -4\nKPX k hyphen -47\nKPX k o -38\nKPX k oacut" +"e -38\nKPX k odieresis -38\nKPX k period 0\nKPX k s 5\nKPX k u -5\nKPX k udieres" +"is -5\nKPX l v -22\nKPX l y -19\nKPX m p -16\nKPX m v -32\nKPX m w -33\nKPX m y " +"-33\nKPX n T -56\nKPX n p -14\nKPX n quoteright -28\nKPX n v -31\nKPX n w -32\nK" +"PX n y -32\nKPX nine four 2\nKPX nine one -26\nKPX nine seven 10\nKPX o T -88\nK" +"PX o quoteright -27\nKPX o t -10\nKPX o v -42\nKPX o w -38\nKPX o x -29\nKPX o y" +" -42\nKPX oacute v -42\nKPX oacute w -38\nKPX oacute y -42\nKPX ocircumflex t -1" +"0\nKPX odieresis t -10\nKPX odieresis v -42\nKPX odieresis w -38\nKPX odieresis " +"x -29\nKPX odieresis y -42\nKPX ograve v -42\nKPX ograve w -38\nKPX ograve y -42" +"\nKPX one comma -16\nKPX one eight -34\nKPX one five -16\nKPX one four -56\nKPX " +"one nine -9\nKPX one one -27\nKPX one period -17\nKPX one seven -56\nKPX one six" +" -47\nKPX one three -10\nKPX one two -2\nKPX one zero -35\nKPX p t -11\nKPX p y " +"-34\nKPX period one -21\nKPX period quotedblright 5\nKPX period quoteright -27\n" +"KPX q c -13\nKPX q u -15\nKPX quotedblbase A 19\nKPX quotedblbase AE 20\nKPX quo" +"tedblbase T -59\nKPX quotedblbase V -98\nKPX quotedblbase W -75\nKPX quotedblbas" +"e Y -73\nKPX quotedblleft A -59\nKPX quotedblleft AE -78\nKPX quotedblleft Aacut" +"e -59\nKPX quotedblleft Adieresis -59\nKPX quotedblleft Aring -59\nKPX quotedbll" +"eft T 9\nKPX quotedblleft V 15\nKPX quotedblleft W 13\nKPX quotedblleft Y 15\nKP" +"X quotedblright A -72\nKPX quotedblright AE -91\nKPX quotedblright Aacute -72\nK" +"PX quotedblright Adieresis -72\nKPX quotedblright Aring -72\nKPX quotedblright T" +" 4\nKPX quotedblright V 5\nKPX quotedblright W 4\nKPX quotedblright Y 6\nKPX quo" +"teleft A -92\nKPX quoteleft AE -111\nKPX quoteleft Aacute -92\nKPX quoteleft Adi" +"eresis -92\nKPX quoteleft Aring -92\nKPX quoteleft T -22\nKPX quoteleft V -17\nK" +"PX quoteleft W -19\nKPX quoteleft Y -17\nKPX quoteright A -91\nKPX quoteright AE" +" -110\nKPX quoteright Aacute -91\nKPX quoteright Adieresis -91\nKPX quoteright A" +"ring -91\nKPX quoteright comma -34\nKPX quoteright d -31\nKPX quoteright o -34\n" +"KPX quoteright period -35\nKPX quoteright r -26\nKPX quoteright s -17\nKPX quote" +"right t -19\nKPX quoteright v -25\nKPX quoteright w -23\nKPX quoteright y -22\nK" +"PX r a -6\nKPX r aacute -6\nKPX r acircumflex -6\nKPX r adieresis -6\nKPX r ae -" +"8\nKPX r agrave -6\nKPX r aring -6\nKPX r c -15\nKPX r ccedilla -10\nKPX r colon" +" -16\nKPX r comma -67\nKPX r d -13\nKPX r e -11\nKPX r eacute -11\nKPX r ecircum" +"flex -11\nKPX r egrave -11\nKPX r f 11\nKPX r g -5\nKPX r h -15\nKPX r hyphen -1" +"8\nKPX r i 6\nKPX r j -12\nKPX r k -15\nKPX r l -14\nKPX r m 6\nKPX r n 4\nKPX r" +" o -14\nKPX r oacute -14\nKPX r ocircumflex -14\nKPX r odieresis -14\nKPX r oe -" +"12\nKPX r ograve -14\nKPX r oslash -14\nKPX r p 4\nKPX r period -68\nKPX r q -15" +"\nKPX r quoteright -8\nKPX r r 0\nKPX r s 0\nKPX r semicolon -16\nKPX r t 9\nKPX" +" r u 9\nKPX r v 8\nKPX r w 7\nKPX r x 11\nKPX r y 9\nKPX r z -1\nKPX s quoterigh" +"t -17\nKPX s t -7\nKPX seven colon -64\nKPX seven comma -57\nKPX seven eight -18" +"\nKPX seven five -34\nKPX seven four -54\nKPX seven one -25\nKPX seven period -5" +"8\nKPX seven seven -6\nKPX seven six -37\nKPX seven three -20\nKPX seven two -21" +"\nKPX six four 13\nKPX six one -43\nKPX six seven -7\nKPX t S 11\nKPX t a 11\nKP" +"X t aacute 11\nKPX t adieresis 11\nKPX t ae 7\nKPX t aring 11\nKPX t colon -12\n" +"KPX t e -1\nKPX t eacute -1\nKPX t h -4\nKPX t o -4\nKPX t oacute -4\nKPX t odie" +"resis -4\nKPX t quoteright -31\nKPX t semicolon -12\nKPX three four 9\nKPX three" +" one -33\nKPX three seven -15\nKPX two four 14\nKPX two one -29\nKPX two seven -" +"7\nKPX u quoteright -25\nKPX v a -23\nKPX v aacute -23\nKPX v acircumflex -23\nK" +"PX v adieresis -23\nKPX v ae -25\nKPX v agrave -23\nKPX v aring -23\nKPX v atild" +"e -23\nKPX v c -40\nKPX v colon -23\nKPX v comma -56\nKPX v e -35\nKPX v eacute " +"-35\nKPX v ecircumflex -35\nKPX v egrave -35\nKPX v g -22\nKPX v hyphen -27\nKPX" +" v l -16\nKPX v o -40\nKPX v oacute -40\nKPX v odieresis -40\nKPX v ograve -40\n" +"KPX v oslash -39\nKPX v period -57\nKPX v s -16\nKPX v semicolon -23\nKPX w a -2" +"3\nKPX w aacute -23\nKPX w acircumflex -23\nKPX w adieresis -23\nKPX w ae -25\nK" +"PX w agrave -23\nKPX w aring -23\nKPX w atilde -23\nKPX w c -36\nKPX w colon -23" +"\nKPX w comma -50\nKPX w e -33\nKPX w eacute -33\nKPX w ecircumflex -33\nKPX w e" +"grave -33\nKPX w g -22\nKPX w hyphen -23\nKPX w l -16\nKPX w o -36\nKPX w oacute" +" -36\nKPX w odieresis -36\nKPX w ograve -36\nKPX w oslash -35\nKPX w period -51\n" +"KPX w s -16\nKPX w semicolon -23\nKPX x a -2\nKPX x c -30\nKPX x e -27\nKPX x ea" +"cute -27\nKPX x o -30\nKPX x q -32\nKPX y a -32\nKPX y aacute -32\nKPX y acircum" +"flex -32\nKPX y adieresis -32\nKPX y ae -34\nKPX y agrave -32\nKPX y aring -32\n" +"KPX y atilde -32\nKPX y c -42\nKPX y colon -28\nKPX y comma -56\nKPX y e -40\nKP" +"X y eacute -40\nKPX y ecircumflex -40\nKPX y egrave -40\nKPX y g -31\nKPX y hyph" +"en -29\nKPX y l -19\nKPX y o -42\nKPX y oacute -42\nKPX y odieresis -42\nKPX y o" +"grave -42\nKPX y oslash -41\nKPX y period -57\nKPX y s -24\nKPX y semicolon -28\n" +"KPX zero four 11\nKPX zero one -31\nKPX zero seven 7\nEndKernPairs\nEndKernData\n" +"EndFontMetrics\n" +; +int n021004l_pfb_len = 44729; +char* n021004l_pfb = +"\x80\x1i\x6\x0\x0%!PS-AdobeFont-1.0: NimbusRomNo9L-Medi 1.05\n%%CreationDate: We" +"d Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developmen" +"t\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPY" +"ING (GNU General Public License) for license conditions.\n% As a special excepti" +"on, permission is granted to include this font\n% program in a Postscript or PDF" +" file that consists of a document that\n% contains text to be displayed or print" +"ed using this font, regardless\n% of the conditions or license applying to the d" +"ocument itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) rea" +"donly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See " +"the file COPYING (GNU General Public License) for license conditions. As a speci" +"al exception, permission is granted to include this font program in a Postscript" +" or PDF file that consists of a document that contains text to be displayed or p" +"rinted using this font, regardless of the conditions or license applying to the " +"document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by " +"(URW)++ Design & Development) readonly def\n/FullName (Nimbus Roman No9 L Medium" +") readonly def\n/FamilyName (Nimbus Roman No9 L) readonly def\n/Weight (Bold) re" +"adonly def\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -1" +"00 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusRomNo9L-M" +"edi def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-168 -341 1000 960} readonly" +" def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/" +"Encoding StandardEncoding def\n/UniqueID 5020933 def\ncurrentdict end\ncurrentfi" +"le eexec\r\x80\x2(\xa6\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3" +"[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r" +"\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff" +"++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93" +"\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81" +"nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff" +"\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>m\xb1\x7f\xae\x18\x99$" +"\x3Jin\xf2`\x15\xa8\xe3h\xa7\x91\x66$:Y\xba<\x9c \xd7\x5\xb1\x8c\xb8\xef\x7kx\\M" +"\xa7 y\x92~\x1c\xfe\xb1r0\xd5\xe8g\x1eZb \x8d\xf9\xcc%\x66%;\xdbk\xd6\x81\xc6\xb9" +"\xbGTN}fR\x1c\xf1\xb4\xdc\xda\xe1z\x9a\x87\xbd\xeb\x82\x87\x97\x9bO\x1e\x9l\xd3\xbc" +"\xb8\x32\xed_\xb6\xc9\xf1\x91\x86\xba\xcd\x9f\x9c\xf2\x1f\xdb\x16\x0\xbd\xac\x1\xfb" +"\xba\x1bQ)@dS\x12X%P\x13\x64\xa9@\xae\xcb\x65\x8bY\xdb\x81\x12~\xcd\xd5\x39\xcc+" +"\x1\xbf\x32\xe3\x98\x18\xc6\xd6\x81wA-\x9b\"\x88\xa4\xcd\xa1\x99\xce\x15\x15\xfa" +"\xbdnL\xb3Z\xf8\xc\xc5\x92\xd1h\xed\x81\xa1\x41\x81\xab\x2\xbaI\x18\xed\xf2\x66W" +"\x94#\x14^\xcbg\x12\xb7\x30w\xc3\x34\x89\x81\x94\xf6\xb7\xf8=\xf4\x1dl\xd3]I\x10" +"\xfd\xc6\"\xd3m\xa6\x8b\xc1\x14^8\xda&\x9b\x88\x93\x9c\x31y\xec\xb4)\"\xfc\x81\x8" +"\x18ns\xe3m\x10u\xc3\x34/\x88\xa9\xb3\xbd\xb6\x8\x84\xb8\x32\x97\xef\xff\x61\x98" +"\xc5\xb\xd6\x1a\xb4\xb8%\x8b\x1arO\x7f\xc8l\xdc\xb1G\xc6\xea\xc2@\xcd\xf6\xb3\xdc" +"a\xfd\xd2\xe4o\xa7\x0 <]\xbb\x30\x64\xc4Q\xb4\x12\xbc\xea\xca\xd0\xbe\xde(zOhY\xb" +"y\x93\xb7\xfa\xdc\xf3\xfd\xcbx]\x98?C\xe5\x0~\xe6~N\x97=9\xc4\x8f\xf8/w\x2\x63\xd3" +"\xf1\xf0\x19\xe7g\"\x9I\xc5\x0\xb9\x10W\x83g\xb5\xc3\x92\xc4\x99\x41\x65v\x5\xe3" +"sj1\xb5\xb2\xe9\x13\x38-\xec\x85\x92\xdekv\xfap\xb8\x8d\x89U\x1c\xb9Xgt\xcb\x97\x64" +"\x18W\x84\xce\xcd\xbe\x33\xff\x19%\x1a\x4_\xc2\xe5Q\xccqC\x10\x1f\x36\x43W1\x91\x91" +"\xf2\x1e\x31\xc5\x13\xb\xf9\xef\x34/hVv\xb4\x2\xf8;\x5\x88\x11\xdbr\xc\x80,\xe3\x84" +"\x1b\xac\x9fI\x82K\x8\xf7\xa6Sg\x1b\xcK\x80\xa7\xf8\xd2!\x14\xdb\xa2J\xccV;q#\xd8" +"\xb1z\x14l\xd6\xbc\xbf\xd2\xdd\x10\xad\x37\xd8\xa9'N5^\x17\xbc\xf\xbf\xce\x8d\xe1" +"\xfc\xc5\xaf\x63\x8e\x4\x39\xc4\xfa\xad\x6\xe0\x98\x37S\xbbW\xb0\x4.\xb3\xa9\xe4" +"\xf8\x1d:d\xd7\x61\xe4\x9b\x16\xa8S\xb3\xe1\xd2s\x1d\x3\xa7\x96_)\xd3}`Y\xeeY[\x83" +"\xc6\x1e\xec\xa5\x85\x3\xf\xfe\xce\xaf\xb1\xec>jf7\xfd\xd2\x8e\x97y\xf\xf0\x1\xbb" +"\x16\x30\x38)\xe5\xaf!HT\xf3$\x1\xc8\x90\xb5\xccP}\xe5\x64o\xcf\xfb\x1d\x1e\x5\xe7" +"4\xa5\xbf\x0\xc3\x62\x8c\xae\xa5\x8aO:)\xe9u\xac\x19\x42\x8c\x33\xfb.\xc0u\x5v\xf3" +"b\xe5\xff\x66\x33\x17\xc7$K5T\x1\x88\x1d/\x85\xaa\x8e#\x5\xcb\xff\xb9\xab\xb0\xa3" +"\xd1\x89\xb6\xe1\x1cRn\xc2\xd6\xf4m\xf3\x62\xcaw\x1c\xc6\x92\xc9\x37V\x81\x16\xb4" +"\x7f\x82\x95\x4?-\xb2\x86\xfa-\xe5\xa0\x14\x1e\xbd\x34O\x16\xb0\xc8\xf4\x9c\x12\x44" +"N\xa6^\xe5\x65\xd1\x15\x2t\x8a\x30.\xc4\xd7\xbatm\x94\x87\x9b\x1c\xdd\x89\xd4O\x9b" +"\xb9\x46\x44\xc3\xe1\xa7T\x4\xd8\xf2\x8d\xa3)\xd4G;,\x95G`\xe6\x9ej\xa1\xa9\x8c:" +"\xb8\xb6z\x9d\xa4:\xb3\x65\xc8\x9d\xfb\xa9`\xcd\xb5\xed\x61+1\xd6S\x96\x2:H\xed\xbf" +"\x10\x81\xb1\x17\x9b\xcb\x8e\xf8\xef\xf1\x85\xf7l\x92\xc3\xc8IN\x8b\x61\xa0\xe6L" +"0\x96\xc7\x7fT\xe7V*\x9e\xa6\xfe\x9d\x8d\xca\xf1\xcc\xa1\x94\xcd\x43m\xde\x81-\x7" +"\xf5\x81\x90L\x7fO\xc3V\x8eIGLw\xbd\x85?qv'\x8a\x87g\xf2\xa0;kS\x19\xd5\x7g\xa2\n" +"\xf4$\xd1iy\x18\xb3\xce\x87\xc0\xa0:\xc2\x8f\n\xb4\xd8\xcb)H\xd5\xabV\xf2JH\x5\xea" +"\x9\x16\xb2\x33$)\xc9\x66\x1a\x9a\xa2(BWH\x18\xd8\xe2\xe3\x30\x62\x1b\x16,\xd2\xac" +"W\xc6.\xce\xf6\x8a*:Q\xc6\x41\xd6\x5\x1eG\xeb\xe7\x92\xbb\xb\xf7\x9f\x15\xad\n\x61" +"=\xda\xc@V\xe4\xe9\x12\xcf\xfd\x92\x38`}\xa3t\xf8\x12j\xe3V\x89\xed>\x87%\xa8s\xd7" +"\xbd\x1e\xcf\x17Z\xe3:\xc8\xc1\xb2\xd7\x41\xdc\x9d\xc3\xf7oEz\xe5\x37\xf\xdc\xf8" +"5Z\xbb\xa2!\xd1WAZ\xcb\xb8\x66\xf3\x14\x8a\xe2*M\xbe\xc6\xe1\xe8\xa7\x15\x92\xb4" +"!g\xb3\xe3\xe3\xa2\"\x18\xa7r\x8\xa3jGX\x6\x88\x35K\xbm\xe1\xb9\xfe\x91\xfb\xa8\xec" +"\xd0^\xd2\"\xb~Y\x1c\x61u\xca\x94\xb2[\x88\xb6\xa8Yl\xf1\x1\xf5@\xfd\x13\xf0\x35" +"\xf\x9a\x97\x8e\xecP\xad\xc2\xc7j\x9c\x89\xef\xd8\xab<\xf6<\x95q\xad\x12oJ{\xd8\xca" +"\x1d\x92\x62\x1b)\x9f\xc6R\xc7\x83\x14LT CH)\xd4\xc\x61\xc9\x63\x44\xfc\xc4@\x85" +"\x5\xdfN\xf7o\xfdG\x1d\xc4}\xf0\xf9\xa1\x11!\xf9>\xfe&/\x89\x8c\xf3+\xaf$\x18\xe0" +"\xc3\xb2\xf1\xb5m\xa0\xf7\xcf\xe1\xc6\x9%\xc5~K\x82U\xb9 <\xd2Q\xcd\x81\xcb\x8a\xfc" +"\xe3\xf5&\xd8\xf3(\xa8\xf\x33\xbc\x43\xfbQ{.\xcd\xc1o\xb8\x64\xa1\xb1\xca\x36\xb0" +"V\xa2|\x1\xd6\xa7\xf6U@\x90\x64\xec\x92,\xb5x\x1dp\xd9\x8e\x81\x92\xbe\xc6|\x9f\xbb" +"\xa6]\xe2\xbc\x84K!sf\x13\xe0\xdf\xa6\xf9\x1\xda\x62q3\xecg\xce\xed\x63w\xa3/m]\x10" +"\xf8\xd4\x1b\x15__\xb}\xaf\xfc\x1\xfa;\xe0T\xa7\xd9\x98\xc0\xf6\x91\xff\xc0\xee\x45" +"\x17\x61(\x7f-z|\x8\x44\xb6\xdc\x10U]'\x83\x66k\xb5\x17\x8a\xc4\x61\x61o\x16i\x9c" +"\xe1\x1d\xd5\x44l\\\x18\x2{q\xbd\xff\xd0\x39\x92\x64t3\xe5\x85\xce\x31vd\x9b\x1a" +"Ly_6\x95\x30\xc1\x99\x45\x3\x46\xad\xeb\xef\x1e\xd2\x17Q\x10\x91:\x8e\x8/R\x11\xf5" +"s@\xa4\x61\xa7\x90\xe8\xa8@N\x2\x45\xc9\x32#\x11xe\x10\x63K]\xa2\xe1\xbc`\xa9\xa7" +"#\x1\xf1\x39\x46\xbb\xd6\x9@5?\xb3\x9d\x84\xc6ueGU\x8b\xd1\xa6}\xf\xee\xc9\xc6\xf6" +"\x2>C\xb4>\xe2w(\xe6G\x2\x3\x8c\xed\xa4\xc7\xb9\xe7\xaa\x3l\xa3\x10Z`\xb9\xe8\xd0" +"\xd4\x5\x2x\x15\x1b\x42\xb6\xc3\x64n&\xa5\x88\x66\xd9\xba\xf5-\x1\x32\x12\xb9q\xc8" +"g\xe\xb6Vxc\xf9?Xi\x8a\xb2\xa4\xe7\x31\x9bmG\xf5\xa0\xb1\xd5\x18\xf'k\xbf\xb6^w\xf5" +"\xca\x65\xeb\xcf\x15\xcah\xd7U\xc3\x8a\xd2\x96's\xac\xac\x8f\x8\x8c\xeT\x1\xc6'\xf5" +"\xe7v\xcf\x1Z\x90\xa6\xad=\xde\x8\xf4.\x9Po\xac\xa1:\xad\x66\xefmk\xdcQ\x10\xca\xab" +"J\xddx\x96,\xfc<\xa0Y\xa7\x8c\x34\xc9j\x10\xc8X':?\x94\xa9%\x1a\xfb\x81P\xfe\xac" +"\r]F\xb0\x14*\x11}\xa3\x96.\x84r\x91\x38\x12\xf2\x34\x9c\x91\xef='\xddq\xfb\xe1p" +":\x1c\xdc\xdcV\x8@\xab\xe1h0\x10\x88\x99l\xad\x88\x87\xf7\xe2\x37\xe0@\x96\x13\xed" +"D\x94!\xe5\x32\xc6`L\x5\x9c\xe0\x17\x8c\x1b\xdb\xed\xf\x31\xfc\n\xd7\x35\x88\xdd" +"\xc6\x63\xe2\xad.k\xb7\xb2\x94\x19\x37j\x9e\xac{\x88q\x9a\xb3\x8e>\x3LRD\x82\xdf\x1b\xe1\x81" +"\n\xe5\xad\x86\x46\x91\x9f+\x1d\xf3\xaf\x66\x63\xd8(3\x82\xb\xdd\xa7\x82y\x96\xc7" +"\x80\xb5\xb9\xf2\xbc\x94(\xad\xb1\x85\x8e\xcd\xdbz\xec\x66\xa6\x63\xed~\xfc\xb6V" +"-\xaf\x80\xc8\x18`{\x1b\xac\xbfO\xd5S\x11\xe4\xb7\xc\xael\x8cv\r<_\xdb\xe7\x83\xdb" +"\xb5\xd3\xc9\xf7\xe8\xf6\x19\xac\x65\x8f\x7&\x1a\x66\xc3\x11q\xf6H8\xe5\xf2\x87P" +"\x11\xfb\xae\x39\xe0{Pb\xa7\xa4\xfe\x96\xfc\xcd\x5M\xa4\x17\xa7#\xa3\xff\x1c\xec" +"e\xd4\x98\x17\xb9\x8a\xcc.\x93\xb1U\x1eu\r\xeb\xfc\x63=\x13\"\xf7KM\xc5\x81\xd1\xc0" +"]{\x91\x38^\xf5\x82v\xbb\x1dZ\x1dxs`\x1c\x17R\xce\x8\xce\x88 T\xe0\xeb\x17\x1\x19" +"\xe9\xf\xf7\xc8\x46\x15\xe3j\xb2\xebj*\xa2\xdeo9\xcdY\x91\x30I-\x9\xa6\x84-g\x0\xa8" +"(\x3\x32\xba\"R\x1al\x16G0\x4\x66#`%Y\xc5\x5\x96\xb9\xff\x0\xaer\xf9\x42\x2I\x82" +"\xc2S%\xe7l%Yf\xe3\xc6\x1c\x82\xa5\x7\x37[\xb5\xf6\xcbV'\xbfqI9BB9\xc6\x18\xf1\xda" +"\xde\x35O\x15p\x81n\xd4\x0\xef\xd3sR\x92^\x4\xde]\x18\x7\x0\x8d?,\x1>\x2l\xfKl\x0" +"\xf8\xf4\xf6\x19?\x96\x8e\xea{\x18jm3\xf6\xb\xf\xb5\x37\xd4\xe4\x9y\x96\xc6<7\x91" +"&fBz\x9d\x9b\x10}\xaf\xba\x38m\xe6\x44\x1fkX_\x13\x32\xee\xe8\xc3.\x93\xb2\x3\x6" +"\xb0\xa9\xf5\xc3\x37\x1e\xbb\xc5\xb2S\x83Y[(I\x83\xc5\xf4\xbc\x85\x42\x4jL$\x87\xca" +"Y\xc0\xae\xab\x9b\xf7~J\xbb\xec\x83\xe7\x1f\x1c\x84\x84\xc1\xae\x9c*\xed\x42\x15" +"\x89\xd9\x98\r\x93\xdb\xd0\xb\x32\xb9\x8a\xef?_f\x91\x8a\x43\xd2\xf9\x30\x8_\x9d" +"\xdc\xa4!Ic=\xf4\xb0\x89\xf6\xb2\xc7\x9b\xbd\xac\xabp\xe1\xff \x87\xaf\xbe\x8c\xca" +"C\xf2m\xbf\xafN@a\x15\x5\xfa\xeaOkE\xe6:\x1f\xe5I\x84\xdb\x13`c]|\x0\xee\xf\xbf\x7f" +"D\xa7\x37\x66\x62@\xf2\xdf\x1\x9\x81\x1a\xb7\x8f\xac$\xe9\xa8\x5M=kcY\xa6\xbb\xeb" +"\x93\x92\xee@\xbex\xe1\xba\xd8\xef\xc4\xb5\x9c;\xbdQ\x13\xe4\x1aq\x91\xdb\x61\x13" +"\x96P\x11~ewj\xbd/\x8e\x9b\xab\x18\xefW\xf7~\xf4\x1fl\xf8\xc0\xfe\xbc\x85\x9c\xe" +"\xb1\xba\x1f\xb2\x42\xde\xe5\xaajZ\x8f\xd0\x9d\x38\x97\xec\xbf\xeaJgzC(C\xf2\xeb" +"*^\xd8\x7\x99\xbb\xdf\x1{8o\xf5\xf\xda\x9b\xdbOj\x98\x11Yt\x95\x85\x1f&7/\x1c\"\xf7" +"/s7qu4\x96\x4\xfb\xb\x90\x7f\xf9\x98(\xe\xd3\xcf\x37R\xad\xe5\xcf\xfc[\xb9\x95\x39" +"|\xc2Q\x9!WYz(\xdb\xcc:Mhb\xf0\xee\xa2\x80\x98\x8\x8a\"\xee\xd1\xbc\x8c\x9v\xdc\xd9" +"\x4\xdc(\x6\xda\x95<\x2jzb[\xbe\xcc\xbc\xa9\xbd\xfa\xeeY\xe4&\xe5\xbe\xcbuF\xb0;" +"=y\xce\xb7\xab\xe9\x62@P\xd4\xdf\xda%\x15Io|\x98\x8b\x92n_\xc0\x80\xb9\xfd\x9e\x85" +".\xcaO\x5\x13y\xa7R!\xd2\xa3w*\xdd\xad\xa1\xd1\xca\xa8\x0\xbaIas\xc4\xd4\x83S\x91" +"UX\x84\xef\xaax\xa1\xa2\xad\xff\xa6\x13\x84W\x84(\xaf^\xdd\xe7\x66+\xfaS\x9e[\xd9" +"Wx\x98z\xd1\x7flh\xb1U\xaa\xd4r\xa4\xe3t\x4\\\xbb\xcb\xde\x30\xfd\xcf\x80s\xdd\x9a" +"\x9e@\x81\x30\x62\x90\xc1\x8e\xdf\xab\xc7\xa9\x9e\xe3\xfd\xe7\x1f\x86\xd1m8s\xe8" +"\xd9\xa6,Y\xcaS9O?\x15\xb2\x14\x0\x8\xf\xc3X\x12K\x88\x39\xeb\xc9l\xaf\x62\x64\xf0" +"[\x94\xcd\x1a\x1c\x82S\x16\xd8\xe9\xc8?\x17\x84Xm\xba\x45{\xed\xf2\xe8V7s\x98\xbb" +"y\xfb\xe4W\x91\x92\x98\xbd\xf1\x31\xe6\\\x91\x80\x6\x66Q\xae\x99\xa8\x8b\xccP\xc1" +"\xba\x46\xd0\xc2\x3\xebge%\x9fU\xa3@\x12\xe9\x7\xf5z[\x10\xb0\xf9O\xbdS\xec\x98\x41" +"\xc2Iz\xf9k\xef\x44i}E\xb7\xe3v\x14\xab\xf1{\xb7\xb0\x34Rvy\x8f\x1a\x88\x85\x99\x4nJm\x84U\xfd\xc1?/-\xdbR\x9d" +"\xfe\xa2m\xbd\x11r\xc1\xb5;\xe4'\xbd\xf9\xd4+k.\xe3h\x9eHN\xaa\xda\xaf\xf4\x1b\n" +"\x84\x65\xd2\xe6`\xa6\x98\x45\xc1\x1d\xfc\xc4k\x15\x13\xf9*0m\x1a}\xd5\x8e\xf0*|" +"\x16O]\xabyZ%\xa2\xbb\x46-!N\xb\xec\xa3\xa5$\x94\x94\x44\xee{I\x18\x8f\xf8\xf\xaf" +"\xb9\xd9\xd1`\xb9\xdb\xdb\xf2\xb2\xe7\xb6\xf4w\xec\xb\xa5\xcd\x9b\x92l<\x9a\xf8\x9d" +"\x84S\x93ysa\xba@\xff\xeaq\x9d\xe7\xcf\x8d!\xb7G\x1\x99/\xbc\x4\x32m\x91+\xed\xab" +"'$\x93\x88\x9\x32\xab\x1\x30'Apf\x9e\xe\x87\x66\x89\xae\xe1\x6\x85\x12\x45g\x1fY" +"\xcd\x36\xc4\xaa\x62\xf\x3\xcd\x86~qe\xeap\xb4\x81\x89\x62\xda\x9f\x33J\x1\xfb\xbc" +"\xaa\x99\x94\xe9\xeei\xc2T3\xccJB\xf6G\"_m\x95\x19I\x8f\x65 \xc*{\xc\x10\x46\xcf" +"\xac\xef\xc0\x9d\xe1\x85\xe8\x64V\xb9\x93\xffI\n\x93\xa2\x1d\x1\x66r\x4\x90\xa1$" +"\xa7\x19\x6\n\xcd)R\"\x0\xca\xc8\xeeq\x82\xec*\xe\xb7\x8b\x15\xc2\x99*m\xf7%[F\x3" +"\x4`F\x8e\n\xb1\x62\xc\xf5\x17\x15v&\xdb_\x7f+\xc4\xa8\x12=\xfa\xd2t\x97\x35\xdd" +"\xa8\xfa\x5,\xc9qB\x19\x97\xb3$h\xf9\xdc\xb3n\\\xee\xf7\xac\xbb\xa9\x9a\xda X\x8f" +"\xe7I\x87x\xddX\xe6G\x91I\xf0K\xb3\xc\xba`\xc4\x33\x9b']\xe3GN\xb\x89'\x9a\x8b\xe5" +"^\"C\x11\xea\nl\xb5\xbe\x32\xe4\xd9.\xd2\x42\xf2\xa1\x36\x42\xbfGu\xa1\x1\xab\xed" +"3\xb5\x97\xf1\xd5+\xe4)\x99\xef\x66\x19\xd5;8\x19\xa8\x13[\xa0\xab\xa2\x89\xe5\xaf" +"\x15?\x9dL\xbay\x0Jbm2\x99\xfe\x88\xfct\x9a\xe!\x8bK\xa7\x7\xb7\xca\x1c\x93\x9e\x99" +"\xb5\x62\x82T\xb5\xfem\xb0\x33\xdb\x42\xf7>\x9b\xd5+\xf7\x97\xe2\x13\x8fH\xc6o\xb5" +";J!\xb9U}A\x9a\x17\x30<\xa5H\xab<\xcaL\xae\xb6\x16\xf9\x35\xe\xac\xaa\xac\x12t\xc" +"3qjG\x8<\xef\xaa\x1a\x34\xcc\xa4\xea\xb6N\xdf-2y\x9a\xac\xee\xa4\xfb\xfb\x41\x95" +"y\x0Q*\xf\xd5\xb\xc9\x6ZT\x97\x30\xa0Y4\x9d\x19\x46\xe2\n\xad\xbfnyE\x1a\x90\xc9" +"\x14\x8b\x84pJ\x18\\\x19x\xe4!1-\xef\x6^\xb2\x17j\x8d\xa1\xcc\xd9\xa7\x63\xd5u\xaa" +".\xbb\x91\x9f\xa5\x80\\\xe1\xd7\xa3\x8\x98O\x1a\x6\x9f\xbf,\xcaON\x84)\xa6\x62\xef" +"3\xa8!3\xfPR\xb4>B\xa8\xaa\xed\xde\xd4\xfcPp\xc8\x89TuT\x97T\xa5\x3\x8d\x9c\x8[\xac" +"\x95\xe0\x30\x66T\xa2\x96\xd8\x9b\x13\xb8\xaa_\x1d\x41\xfa\xe2\xb9\xa8[/f\x1f\xfe" +"&\xb4\x88'[\xab\x96\x8d rx\xf1\x44[\xf7=d\x8d\x63\"\xea\xf5\xf\x19\xdc\xd9\x18\xbc" +"b~}\x1fX\xa5\xfd\x89\xf1\xb\x88=\xaa\xef\xa1\xb2v\xaa\xb7*\xba.\xe7\xd4\x43v/\xc8" +"\xe2\xad\x12^\xa6\xc6|\x4\xb4\x45Z\x1d\xf4\xe0\r\x64=\xe9\xa0Z\xb3\x81\xcf\xd7Y\xae" +"\x11\xec\x92\xab\xd3\xf5g\xd8\xa2\xcd[\xee\xc6\xfc\xddKN\xa0:W\xb\xdf\xb3\x38\xac" +"Wy\xae\xf6\x38\xa3\x0\x44\x90\xcb`4\xa3\xe;4\xe6(\x2\xf2g\x13;\xadmo\x8d*\xe1\x0" +"\xaf\xc5\xd0\xc7\xc8\xb6\x14y(\xa0\xe0\xf4\x83\xa6{\x1P\xe3l\xb6\x18\xcd\x9f /\xb2\x31\xba\xd3\xe\xc1" +"\x89\x99\x39\xe3\xe0\xee\x36/6\xe\x8e\x9chh\\\x10\xd9\xfc\x1dZ\xc8)\x80<'u\xa5\xb9" +"\x1e\x36\"\x9a\x13\x41\xf2Q\xd6@\xb1\x62&\xb9\xa1\x39\xcd\x9f\x95S\xa0\x10\xae\xde" +"\xac\xe0\x1e\xb0\xb7\xed\xbd\x9b,\x8\xb0\x64\xbd\xc7:\xd1\xa8\x11k\xce\x92<\x1c\xc3" +"\xeaP\xb8\x0\x94\x93\x92\xe2\x1d \x80\x5Z\xc6=m\xa1\x1f\xe5\xe3\xdczhn$\xda)\xc4" +"0X]\xf7\xc7\x88q\x9a\x1d\x61\xd0\x36$\x15X'\xca[\xd4\xf3\xbb\x39\xee\xf4\x1f\xbd" +"xx\xe\x12\xca\xb0\x0\xdf\x9f\xa8\x44\x7\x1aZ\x15\x4|Y\xb8\xa6\xf4[4\xc5\xd9\xe3\x3" +"\xa3\xee\xa9}Ct\x1f\xa6\x31\x30\xf4\xecL\xd6Ng\xd5l\x7/\xaf^\x9f\xefr\xbd\\\xf4\x63" +"\x86\xd6\x97\xab\xec?\xd9\x37\xb\x41\xc3j\xe1\xe4\x97\xdfnE~-Zu\xe0\xe6\xac\xfc\x90" +"5\xe\xfc\x42\xda\x44\x2\n\x4Y9\r28{\xb8&x1\x1a\x9d\x95\x41o\xbe\xea\x9d\x18\xc7\xf2" +"\xc6\x9du\xec\x32\x62\x33\x8c\xd1\xc7v?q\x15\xb8\xa7\xac\xec\x1\r~6\xcf\xa4\x1c\x9e" +"\xa6N\x4j0&\xe1\xb3\xe9O/\x9eqZ\xe2\x14\xc0\x98\x9\xc1\x66\xb7\xdbH\x85\xff ]56\x1e" +"\xa8\x42\xd4\xdcl\xe9\x1b\x83\xaf\xf0\xef\xfc\x1a\xb6PidD\x87\xb7\x86\xa6*\xa5\x94" +"{\xa6\x2\x87\xe9T\x96\xb9\x1b\xcfI\x8\x33\"\x17\x63\x95\xb9ze\x2\xbfj6\xf4\x66J=" +"\xe9\x43\x15)\xc\xb5h,|5*H\xc8L|\xb9V\x85?D\xfd\xf5Y#e\xa4Q0\x2\\\x9f\x8\x42\xd3" +"'^W\x5\xf7\x93I\xa1\xe7\x96\x93s\xae\xc4\x35\x1aSJ\xdc\x0r\x96#\xe5\xaa\x6\x65=\xef" +"\x1a\xa0\x38 o\xdf\xff\xb9n<\x88\xa0\x93\xd0\x44\x11\xb5G\x97'\x4\x94\xfd\x43\xb1" +"\x1b\x1fkeU\x3Qe\x3\xb5\xf8\x45L\x9:\x86\xd1H\xe0\xbe\xfc\xb1\xdf\x14V\xd2\xe9v\xcc" +"\xe2\x7\xd7\xfc\xd7\xa6\x89\xf3\xcd\xe8\x32\x1\xf5\xc1\x43\x84\x8fO2PkA\xf5\xf6\\" +"\\\xc8\xec\xca\x81\xed\x1d\xcf\x61\xfa_\xea\xdc<\xd9\xc3\xe6\x97\xea\x13\xc4'\xce" +"\xd7I\xb8\xfd\xfd\xde$\x8d\x35\x8c\x81r\xbd-9\x8b\xe3\xc3\xe3\xcfg\xbc_\xe8VK\xf9" +"\x8e.\xd4\x3\xa4\xd8\x18\xf\xf0\xd0\xcf\x33\xb5UV\xfb\xd6\xd1:!\x91\x8;\xb5\xf1x" +"\xcb\x8cjbC\xbb\xe7|\xbd\x33.\xb5v@\xca>:\xe8k\x82p>*\xddl\xd2 \xb8.C\x96\x12\xf5" +"\xf\xe1\x9f:9\x4\xee\"Kw\xc1\x45\xd4\x88W\x85\xd4\xd1\xf0}W\xd2q\xdf#4\x85\xc\xc7" +"Cv\x1a(\xf1\xf0\x91\xfb\x37\x6\xep\xf7]h\xb7|\xb\x34\xc3\x42\xd1\xd9\x85g\xf9\xa6" +"\xb1\x18\xb\x45\xf2Qr\x1c.l\xeb\xa6\xe8\xf4\xb3\x8b\xc4u\x11*\xba\xe8\x31o\xe0zD" +"?\xd1r\xbc\xdb\xb3\xe9(\x8wq\xd3P\xbe\xf7\r\xec\xb6\x19z\xa9\xfe\xb\xe4x\x9a\x14" +"\x1a!3C\xbd\xf5\x87\x15\x13\xe1\xc3rc\xc0t[\xa6\xda\xd4\xe0-\xaa\x7\x15\xf2\x90\x1" +"k\x9c\"(e\x8ci$T\xde\xf3}\xc2\x1d\x9\xbbGZ\xcd\xda\xc2\x87\x88PK\x9,&\xe1 \xe4S\x94" +"i_\x93\x9a\x1ci\xa6\xd2\x1c\xe3\xec\x38\x96\xdb\xcb\xbaS\xd1/\x15\xb7<\x11\xc2\x1" +"l\x1d\xdc\xa3\xc0\xdd.E.\xf8,LF\xe8\x37\x18\x34\x82\x10\x6\xac\xbd\xe6$<\xcc`I\xeb" +"\xf5\x93\x41\xbb\x6\xcf\x7f\xc8;\x13\x30\xa3i\x2\x2\xbe\xda\x8f\xb2\x9\xe8\xc0\x62" +"B\x0\xb2@\x1a[\x98\xa6\xf9\x98\xfa\xb8\xb7\x4pj\xba\x97@2\x15\xa3>\x82\x9f\x9bK[" +"\x9b\xb6p\xf4\xb\xbf\xcc\xb4\xac\xf5\xe7\x8b\x5\x82\xd5L\xd7\x45\xebK=\x89\x85\"" +"\xf0\xb8\x89\x84\xe2\x30V5\xca\xee\xcbYd\xa9\x7f\xdb\x8\x4\x97\x8\x11\x3[\xd9\xc7" +"\xad\x10]\x96n\xf3WB\xb9^h\x99\xfbi\xa5\x7\xce\x98\x1\x84\x44vz\xa6\x89\x10!\xed" +"\xa4\x82\x42\x9d\xce\xf3\xdb\xf0\x80\x31\x91\xacg\xdf\x9a\xdf\xaey\x18\xee\xe9\x4" +"\xc\x1a\x92G\xe:\xd7\xf1\x2,\x97\x0Xq\xd2\xd4G>+\xd1\x66}\xe6x\xa1\x41\x17\x17\x82\xfd[2Q\x97\xf0\x8b.\xd6\xda\x3;\xe0}o\xd6\xf5\xddq2\x1d S\xe2" +"\xb3\x80msQ\xa4\xa7\x8f\xc2\xbfw\xde\x11\xc\x86\x11y\xae\xd5\x8c+&4\xeaL\xe3jI#\xd1" +"\xef\xe2\xed\xc9w\xbaVT\xb3\x1b+\xc4\xf9\x32\x61\x1c\xcb\xe9K\x87\r#]\xc4\x90\xef" +"'+\xfe\xb8\x9d\x43\xbb\xb2\x85~c\x7\xcfL\xa9\xf5yO\xab\x1b\xba\x11\xd4\x65\x18`\x8a" +"\xc5\xd9\r\x8a\xbf|\xec\x15.)b+\xedTd\xft\xb0{\xcd\x90ZQ\xd0\xb6T\xe5\xea\xe4j\xf5" +"\xf5\xf1\x99\x9a&\xf\x97\x65\xc0<\n<\xbe\xe6$\xfc\x12\x5o4;\xe7\xac\x85^\x9c~\xd6" +"+\xc8.q'#\xdf\xf3O\x95,\x1cVZ\xae\x8d\x91?\xfc\x1c\xe6pU\xc0W\xcb\xeb\n\x18\xeb\xa9" +"\xfb;5\xb4\n\x89\x1a}\xd9`7\x88\xce\xac\x9b\x97M>d\x19\xa8\x14T\xb2\xb3\xb7 n\xf2" +"\x86\xd4\xd7\x9\x92!\xce\x31\xbdu\xf5\xcb\xa4\xb4.\xc3{\x13\x4\x62\xca\xc1\xc6\x15" +"BY\x12\xb4-\xba\xc9X\x1f\x66S\x8a\xab\x39\x92\xe5\xef\xe6x\xa7Q\xea\xda\xd0_\xda" +"\xe\x8azk\x8d\xb0\xcb\xa5\xd6\x43\x13\x46\xc8\x84\x31\x8d\x43\xca\xb5\x5:\x17\x89" +"\xd4\r+\xf7\x62\x6L%\xe0\xf5m\x8a\xea\xa8\x39\x30\xbeMBa\x91I\x12\xe\x63\xe3\xb9" +"|\x8b\xb0\x8c\xdc\xfag}\x89\x80\xaa\x4\xd5\xfeG:?\xd7\x99}\xf1`\xeb\x87\xcb\xef\xe5" +"j\x12.\xda \x8d\xf8\xf7\x9\x98\xfb\x18\xd9\xa7\x66\xe2Z8\xf6/\xdeI\xb0\xc\x9\xb9" +"R\xa8)\xc9\xcc\x8d\x6\x64\xeelv\x1a\xa2\xe1\xa5$\xe7\x63\xc8\x34\xa1\xf4\x97\xab" +"\x10\x6\xe8P\xb0\xaf\x63\xa5*\x8b\xb5\r\xfa\xe0\xd4\xf0Pf\xfQn\x80[ \xea=\xcb\x18" +"\xb1\xdf_\x8b\x13'\xdb\x94\x1aG@\xdbR.N\xf8\xa5\xf0\"\x83}r\xf\x7\x9d\xc\x1e\xb4" +"\xc3\xdc\x9awVl\xbc\xd6\x38\xb5h[\xc4\x90O\xf7\x4\x95\x9f&\x8c\xf1\xfc\xda\x92\xc1" +"J\x93@\xb7\x9e\xc1\xe4\xf7Z\xe2\xf7\x90\x99\xdf\xff*\x3\x41\xf9\xa4\x85\xbc\xdc\x7" +"`]vGq\x87\xdf\x8e\xb9\"o,\xb7\xc9`*\xc1\xf\xeaG`\xe3\x11\x92L\xfe\xd5\x9ck\xa8\xc0" +"}\x1f\xf5\x1a\x34\xf2xL\x8e\xe9\xc5P\x9cNB3\x0i(\x3r,z>v[7\xc6\n\xf2\xe3\xb9q\"\x9" +"A\xb7RI\xcc\x8aR-o\xe6\x9a\xdc.E\xdd;\xf0\xfe\xad\x12jw\x91Z\x85\x87%P\x1e\x38\xf" +"Tj\x8a\xabu\xa1\xc1\xe5\xfe\x93\x1f?\xaa\x1b\xf2;7L76E\xa9\xce\x85\xe0\xda\xf7\xa5" +"D\xfd\r\x7f\x1e\xb\x66r\x1e\x19\xdc{2S\xfdq\xd8\x8fM\xeej\x93/o\xba\xae\x9b\xaaQ" +"{\r\xfe\x66\x4]\xa0\xac\xfd\x14\xa4(\x7f?Y\x11\x9d\x9a\x13Ki\xa9\xbcLD\x81\x6\x7" +"\xbcZ\xbbL\xec ^\x84\x99\xd8\xa4\xc8G\x18\xec\xe2\xa8\x94\xdfr\xe2\x97\xf4\x9d\x37" +"\xa4\xc2i\x86\x8fIg\x10\x9e\xa1\xca\x1a\x9c\x80\xd8Q\x8f\x86\xd5\x36\x88\x97\xd3" +"\xad\xa8\xb5\x13\xb5\x92U\xa5\xdd\xe8\xc9l\x18Q\xd8i\x9f\x96\x11\xda\xe5\x65[\xcf" +"\xdf\xf2\xd9\x8\x61\n\x95l\xa7v\xa0\x0\x88\x1\xbb\x45\x7\xae\xeb\xce\x8a\xd1\x10" +"\xa9\x63\x17\x90p\xd3\xb8\x0\\\x41\xa6\x12[\xe\xd9\x46\x92\xa2(7\x7\xc9\xfb~\xdd" +"\xad\x1d\xd5\xb7\xc6+\xc7\x14%/\x7f \x84\x1f|m\xa0\x1X\x93\xe2\xd1\xc6\xad\x44K\xfb" +"\xdb+\xb0\xfa\x35*\x88\xe9\x81X ~\xce!?GM\x8:h\x9\x32\xbx\xd6\xc0\x80\x1a^]\x87\xbc" +"*7\xcfz\xd0K\xf3\xca\x9b\x0\xdf\xfe\x96Tz\xb8\x83\x3\xaax\x9b\x63\x81[\xac)Y\xdf" +"m\x92\xa2\xae\xecl\xe3-\"z\x95\x37\xae\xf4\x9e\xb2\x83j\x97\\Q\x96\x97\x62PE%\xb8" +"\xdam\x9b\xacR\x98\xa1t\xb7Nd\xb8\x83\x8a\xe8o\xff\x37\xc6hys\x9f~\x84\x9d\x39\xf6" +"\x7f\xdb\x5\xb1J\x9b\xc8\xd4\x34\x34\x46\x43\xf8O\xd1\xa7\xaf\x80\xb9\xaf\xcf\x88" +"\xd7.#?-\x15\xee\xd7\xd6\xa7\xde\x18\xdbt\xe2\xf0#\xcf&Tw\x91\xc9i\xf1#\xe5m\xe4" +"\xd1\x8c\xdc\x35#\xe4!\xd8\xb9\xd5\x1\x84\xe7h\xe5L\xb2\xca\xfe\x81\xfa\xd1\xcd\xe7" +"\xd7\xe1:\xdc\xf5\xa1\xbeR%\xfb\xe1,::\x1e\x9c:Bk\xc7\xeX\xb4\xd0\xe1\xac\x9d\xea" +"\x9\x5O%\x15_\x97\x45\x82\x8a\xc6 \xa5\x1\x99\xd5\xd3\xa5\xaf!\xfc\xbaM\xab\x64\x9d" +"\x1a\x13\xd2\xfc\xff<\xe5s`xV\xc2\xd2jj\xa1~9L\xe\xad\x30y\xa8\xf3[\xb\xfb:-0\x1e" +"\xfb\xef\xb4\xfcW)I\xdd;\xf9\xf1Oa\xc0\xd2\xc\x90Xe\xe2\x14\xeb\x91O)`\xb1\x7\x12" +"\xbdl\xfb[\xfH\x91\x7\xda\xd1/P\xbb\x7!\x9f\xb4\xc3\x61\xcj\xc\x8b\xd0g\xc8n\x17" +"\xe2\xceK\x8(\x9jLIm\xb8,;a\x85\x85\x9b!/~*\xe7\x1a\xbf>E\xd9LD\xcd\x97`6\xc1r\x2" +"\x8b\xc6[\xcd\xbb\xa3}\x3\x44\x90+\xcfp\x17\xcb\x92\xf6h\xa5\xea\x4\xa2\x43\xaf'" +"\x84!\x5\x15\x1e>a>\x6\x1er\xf6\xcc\xa5\xeb\x65\x86.v\x16\xdbZ/y\ne\xae\xcb\xc8\xe5" +"iJ]\xfb\x98\x97\x17\x94\xc1\xcc\xecntY>\x7lx*}G!\xa3+\xf0yboN\xb7\xcb\xca\r\x1e\x8f" +"\xd8\xfa?\xc5\xb5)\xcf\xac\xcf\xed\xcf\xe8\x37\x15\x16\xcaH\xf6\x92\xca\xa0\xc4\xcd" +"\x96(\xef\xb1\x16:\x90\x8dpK[T\x80{\x1e\xda\xc1ht\xd1N\xea\x9f\xa0\x89\xf7\x32\r" +"\x1b\x9b\xa2\x94hL\xf9\x8d\x1b\xa7\x30\xea\xec\x1b\xdc\x13\x3\x30:\xec\n\xfa\x41" +"7\xa4\x97\xe3\xf9\xb5~\xc4q\x12\x7\xb3\xb8\xed\xce\x84\xf3\x32\xfbP]\xb3\xa3\xdd" +"\x93\xe2\xd5[w\xd0\x62\x34\x94\x1\x1d\x8b\x63\x0\x8b\x15n`\xd6\xd2\x80]\xad\xa9\"" +"w\x82\x30\xe2\xd5\xeb\x64g\xa5\xddzf\x1\x17\x10\xef[\xd0\xccg\xfa\xd7\xf0=\x13\xab" +"\xb3\xc9\x45\x12\xf\xb8/\xbcMg\x91\xff\xaa#V?\x94\xbf\x91}d\xf9\x93\xb8\x82\xb6\x15" +"i\xd6$\xf2\x43\xd9\xe0\xb5\x42^j\xb6\xc0r\xc2\x2\xb3\xac\x97\xd2\x9f_\x82\x8b\xdd" +"6\xe0;\xb3\x32n\x18\xe5n\xba\xfa\xd4\x8f\xf1\r\xe2\x7\x8e\x17\xfa\nv,M8c\x96\xc9" +"o\xed\x9c\xb0\x12\xd6|\x8\x10\xa6\xff\x84\xe2/P\xc2\xa4\xc3\x10\xdc\x82:\xaa\xca" +"\xb9<\xb8\x1c\x8c\xb1\xdf\n\x8b\xeb,\xfa\xc9\xdfm\xb\x9b\xa5\x9d\xbU\xf8\x34)0\xa7" +"Q\x93h\xfe\x63\xa6\x8c\x1bu\xaa\xa8\xf3S]\x83S\x82|\xcd\xdb\x33\x5\xbcUZ\xcb\x1e" +"\xa6pB \xe3T\xee\x14\xa5.r\xad;\xb\xe2s\x8b\xb7\xbd-a\x8e\xeb\x95[\xa8\xc3\xe8\\" +"\x89\x38\xe3\xd8\x41\xa9\xd8\xf9\xfdr\xee\xee\xf4\xdd\x1f]\x96\xfb[\xaf\xd9\xb0\x81" +"jo}!\xe6>`\xa2\x19\xc7\x9d\xf6\r\x9cj#}-\x11\xec\xa8\x15x`\xb5\x88\xe7\x43S\x5O^" +"@\x95\xen\xc2\xf7Vy\x1d\x30\xec\xfd\x1c\xed\xe8\x98<\xcb\xfbvT\xcc\x8~\xf8\xd6\xaa" +"\xc7\xac\x31\x9b\x84O/\x93\x89\xeb[T\xbf\xd6q\x9e\xbc\x35\x87RO\x18\x1f\x30Guk\xfc" +"- _\xab\x64\xbaR{J2p\xe3@n\xff\x42\xa4\xdf\xd3wB\xfd\xa0/:o\xfdW\x97\x87\xd1\xd0" +"\xa8l\xb9\x17\x14yi\xef\x83\x19\xb4\xab\xb0\x37\xc7P\xabG\xfc\xcb\xac\xcd(\x92\xf0" +"\xcf\xb1\x63\x88=%\x82\x92\xf8_\x1f\x9a\xf3\xeax\xe1\x13\xbc\x61\x8d+S\xe1vTGD@K" +"\xa9\xf4\x34)\x8a\xee\xed\x9c\x84\x44GQWXk\xde\x6\x6.\x1\xe8\xc5\xe5\xc6!\xf\x9a" +"\xb6\xcb:\xec\xba\x1f\x15\xa3\x32\x7f\xc2\x43\xb1\xa4\x8Q\xc5\x9\x4Hs\xb6\xafs\xf1" +"G\xfe\xf1\xd6\xaa\x91\x94\xb@\xb6\xd5\xa8\xbf\xbc\xa4\x36x\x3\xae\xc1\x43\xaf\xc8" +"Q\x86\x80\xdc\\\xd6\xff\xb3\xb0m#\xd4" +"\xac\xbd\x8c\xc9\xf4$?l\xbeL\x91\xb2\x19-\xa3\x1d\x8a\xc5\x7f\xee!4\xb1R\xcb\xa5" +"\xdb:\xc8\xb2]\x80\x34\xcf,\x9b`\xc\xaf>,\x1e\x1\xefT\xdch\x9d>)\xda\xe1J\xd3\xa4" +"\xb7\xd1%\xe6\x92TN'\xf9R@\x8\x16\x37\xf0'U\xaf\xac\x86\xdc\x1\xcf\xc6V\xcd\xc1\xe9" +"\x97\xa9\xb7\x45\xf6&\xb2\x9\x1a \x82(\x14\xf9\xf4\xf1\xdb\x94\xcb\x90\xa6\xec\xb2" +"\x1f\x1d\xf0 \x88\xbbKz\xac\xa1\x1f\xe0\x84&Iohe\xc3\xadJ\xc8|\x83\x84)\xc7\x9\xef" +"zdRx\xfc\xdd*\x17\xb7\xa9\x42\xb7@\x0\x0'_\x11\xcf\xfb[\x12\xfd@CJ[[\xbdR\xf5\xaa" +"\x9e@8\x8e\x87\x81\xcc\x43\x9a\xd5\x1c\xa0]\x6\xd2\x44\x12%\xf1w,\x9c\x96\x32\xa5" +"\x17\xff\xbd\x97\xea\x11\x9c\xa6{\xeb\xb4/d-\xd9\x8a\x7f\xc3\x87\x93\x9c`\xef:\xc3" +"\xaf\xc3\xc0>cq\xa3\x44X\xd9\x1\x94\xd3Rk/T\xe7\x34YO\x1 \xe8\x19p\x14\x11\xd9\xcf" +"h\xc7r!\x16HD\xc3s\x10g\xd3R&4\x87N\xdd\x36\x6\x9d\xfb\xed\x3\xfb\xbb!\xe7\xc9s\xb2" +"\x8al\xd4\x31\x84\xd0+{\xc8\xae\x1a\xa5j\xd3Q\x2]\xe1\x9e\xe7\xc8\xbb\xab\xa2\xb8" +"\x96\x39\x96\xac\x8a\xdbp'n\xa7\xf2\x17\x34H\xd1#\x8d\xdd\xa1\xa2$\xb2\x93J\x9b\x97" +"\x16o,\x9d\xe9\x1\x7@\x1b\xed\"\xa9\xe8;|\x85\x1a\\\x1c\x9c\xb5\x35!\xc7\xcb\\\x62" +"'\x9d\xf\xa0t\xbf\x8f\xea\xc4\xf0\xa7\x65\xbf\xc7\xd3\xd2\xddh\xce\x1a\xe6\x34\x9" +"F\xd2\xceJVc]\x12\xe1/\x81\xe5#\xd0\x42\xbe\x8f\xceV\x93\xbf\x41\x9d\xb4M\x6\x89" +"C0#yY\x9ay;\x15\x14.\x11`zK\xf7v/U .\xcb\x46\xdb\xb9\xe2qqx\xb4\xf4\xfc\xd7*\xa0" +"n\x86\xba\xd3\xc2\\&){\x82\xe7\xfd\x44\xf8GM\x81\x8a\xfb\xa0n?G\xad\xf7\x9b\x93\x37" +"\xa9\x9a\xd0\xd8\x41\x1c\x84\xb7^\xd7\x1byw\xdb\xco,\xc2\xa2MW[\xae\xe\x42\x34\x7" +"<\x90\xb5\xae\xff\n\xb6\xd2\xe2s\x89'P\x1c\xbfs&\xb7\xae\x91\xa5\xddh\xe1HC\xb5u" +"\xc4\xaa\xc7\x93\x13)\xf2\x16\xe7\x82\x87\xb\xf5\xc0\xe8\x9\xc1y8\xdf\x30\x9e\xce" +"\xd9\xe6/\xe9\x18\n\xea\x17[\xe6\x1d\x1fw\xa1L1px\xd3\xac\x1bqN#\xb7V\xd3\x8f\x83" +"\xb\ry\xae\x61@\xd0\xbaP\x5\x65xD\x88Z\x96kx\x80\xac\xfc\xf5\xdd\x46\xa5\x9b\x8f" +"D\xf7r\x6\x10\x6\xb1\xed\x98\xbc\n\x88R\xff\xaf\xe\xd8\xce(\xa4\xfb\x96\xb4\xcc\x98" +"Z\x5q\xe6zR\xc6&\xf7\x1e\x93\n\xc3\r\xbb\xc1\xe\x10\x86\x65\xaf\x90\xa0^\xdd@\xb2" +"\xb2Y\xe4\x32\xc3$\xea\xda\xb1\xea-\xe9\xf4\xdc\xa2=\x4r\xdd\n\xa1h\xb0\xf<\x11\xe8" +"\xc2\xa1\xb9\x43Z\xafG\xc7\x65\x9a\xcaX\xb\xb5\x88\xd3\xe8\xdc\xc9\xc4<\xa5\x11\xc" +"\xec\x64t\xd1iV\x4<&\xd4\xe7\xd4g\xb2\x87\xef\x62\x19\xf1\x61\xcb`\x8\x8e=D\x9a\xac" +"\xa4\xc9\x16\\\x61\xc1\xeet\xff\x3o\xae\x95\x2\\WW'fVe\xc8yX,\x86\xfe\x31\x99\xf2" +"7\x17\xb3:\xc1\xa0\xb%\x99\x89\x1b\x0\x63(\xfb\x91\x34`heO\xba\x12\xe8\xe4\xd3\xf4" +"LE\xa5y\xc9\xb5\xea\xa3.k\xeb#\x7f{\xff\x19\x36=lX\x88)\xbe]&\xd2\xa1\xce\xf5\x99" +"\x12Kr\x17\x33\x8f\x4\xfc\x42\xff\x94\x42\xd3\xb8\x87\x46\xcbQ\xc3&\xf7\xd4\x86\x9f" +"[\xfc*\xc7\xdb\xc\xd9G\xc7qN\x93r\xb6\x6\xac\xc7yD\xc7y\x13\xa7J\xf3\xb5\xcc\xaf" +"\x8\x7f\x42\xd0\x38\xd0\xb6\x16\xa3\x9f^\x9f\x7\xabt\x2\xcc\x62t\x82!@\x98\x83\x12" +"0\xc2\xb3\x1\xf3\xd9\x9c\x63\x61 \xb\xf8\x8e\x1d\xcb\x36u\xc7\x9d\xf3\x82z\xf3\xb4" +"hy.\xcd\"\xd0\x86\xf7\xe8pa0\xea\x17\xa1w\xa3\xa0\x8f\x5\x43\x91\xc0\xfaZ\xfc\xbc" +"\x93\xce\x36-\xa9\x9b|t\x8e\x8c\"\xc6\x34\xael^\x86\r\xae\xfe\x94\xc7\x17\xeeR/\xa7" +"/\xe3\x93=\xbc\x38\xf7\xe4\xb3\xff\xc5\xa4!\xee\xe\\\rW\xb9\xf3\x62\xf8N\xb6J\x8d" +"{\x8cs\xc7X|\x3\x91\x88*\x1a\x15\xd1\x82\x96\xa2\xd9g\x2\xca\xe\x92~\xf7\xd8S\xd4" +"\xe9\xc4G\xc7\x9a\x32\xd8\xa9\xfb-\xd2\xb\xcc\x18\xc1\xc1\x1b\x96\xf1/\x8a|e\x87" +"\xe5\x46\xc6\xe4\x33\xa5\xc5\x91\xef\xf5T\x8f\xb2~\xf4\xdb`gj\xd2\x11i\xfa\x1+Gc" +"\x8d\x66\xfb\xe9\xa3]\xae>\xd1i\xfe\xe\xf2\xba\xeb\x8\xfc;d\xb0\x91\x65\xfe\xa8z" +"\x84=b-2\x1f\xb4\x95K\xbc\x19\x64\x8d\x8eS24j\xdb,9\xa4%\x37\x88\x98T\xf4\xa7\x91" +";\x13\x8S\xa2[H\xf8\x84P\xae[\xda\xd3\x16\xb8\x3\xc3\x8b\x89#\x82*\x5\xec\x36\r\x85" +"trZ\xc0\xcdY\xbf\xa6\x43}\xa2\xb7$mN\x9d\xee\xff\xd7\xb1\xfd\"\x33\x1b\x90\x9e{\x6" +"\xd6O7\xb5NW;[\xbb\xees\xee\n\xad\x14\xa6\x14\x8b\x94\xca\xc0\x6\x0\xa3\xbc\xb5Y" +"\x9c\xd3+2s\x4\x35\xb9\x99\xd0\xe5\x8]\xa4l3\xf1\xa7\xae\xf\x1f\xb2w\xbe\x9fI.M\x13" +"CI\xf4\x94\xf8sL\xe4\x1b\x8f\xfc\xdd\xdfR\x8d\xa2\xa0\xc2\xec\xb6&\x9dI\xc4L\x93" +"\xfd\xe9\xd0\xf2\xe0\x2\xbb\x18\xe\x99\x6\x8f\xcc/\xea\xaf\xe8\xb5j861F7\xb8\x0\xe0" +"JC\xa9\x9f\x3\xfbW\xd2o\xa0\x88\xf0\xfb\x8b)\xd4\xe4\xeb]\x8bsp\xd2\x7f\xc8\xa7<" +"\xbc\xda=\x93\xc\xbe\xb5\x34>\x88\x3 \xc5\x9b\x1e\x9\xe4\x4O\x8b(\xfc\xca\xd9\xba" +"\xaf\x46\x16\x9c\x41:6\xe8\x10unFqH\xe6\x9a\x33\xb8:\x84t\x8e=&\x91\xff\xe6\x3\xa6" +"\xe0\x83\xbd\xdb\x9dJ\x2\x98\x8c\x83L\x12]\x97\xf7\x14\x9fL\xbf\xde\x12G\xea\x64" +"\xa9|\xd5`u\x9c\xca\xb2#\xb2\x8\x6\x8eH\x1e\xab\xcb\xca\xc8\x99\x34=\x13\x61\x99" +"{6\x8c:\x95\x30^\xee_\xd1\xf7\xec\x84\xfc\x43\xb2\x61\xe1\xb2\xa9\xcb\xedR\xd7; " +"\n\xe2\x1d\x4\x4\xdcsA\xb5z\xff\xfd\xe\xfb_\xdd\xca\xc5\x62\xd9|P\xd1\xf5\xa8\x41" +"\nT\xfc*\xc5\xc1\x84\n\xdap\xe3(G\xb3\xce[o\x1b\xa6\xb2\x9d\xdb\xb9\xbe\x9f\x9\x1a" +"\xbd\x36\xfe\x99\xd9\x11\xf8\xc6\xbd\xa4?\xcf\xaf\xb1\x86^V\xf5GA/\"\x4\x9-\xc2\r" +"[\x9c\x35iN\xab\xf8\xd6|\x85u\x1e\xd2>\xdf\xf1\x11\x82\xe7\x8e\xa0\x8a\x44Gn\xa2" +"\x1a\xde~zE{\x95G\xf2=\xb5\xc4\x66\x95k\xf6\xc2\xfbu\x84\xe\x61\xd8Gt/rn\x85\x11" +"\xa7\x86IZ\xaa\xc9+\xc0\x61ts\xcaH\x1d\xa6\xbds\x94\xbf\x1f\xc7\xd0m?\xcd\xdf\x9d" +"\xf8z\x1a\x39\x33\x17km/\x9f\xa0\xb7\xaf\xe7\x39\x38x\xe3\xa8\r\x33L\xf5\x45\xbc" +"\xf1\x44\xa9\xdbY\x1e/\xe6\x41\xb8\x36\x9b\xa9\nh`\xdc\x93\x9e\xe0\x9f\xe8\x45\x8" +"N\xba{\xa9\xb4\x9a\xc5\x99,\x1a%(\x99\xfd\xc5\x8b\xd7\x38\xa1\xe5N)\xf6\x9b\xa2o" +"\xb5\xe7\xee\x15\x1e\xe9\x9a\xe1#\x9b\xb\x93/\xd7\x8a\x35\x83:\xbb=\xa6\x95\x6\xf7" +"\x15\x88*\xf3\x90\x19\x9c(@\xa2\xf3\x30w\xe6\x31\xa0Z\x1d#\xb5\xb5\x83\xab\xa3\xf3" +"\xbf\xdcI\x88)\"\xdd\xa5\x1a{652\xdf\xe1\xb9\x65\x95O\x86\xcf\x5\xb8\x94T\xd9\xcf" +"\xa0\x86\x90M?N\x94\x83u\xfd\\L\xde\x14\xa1lU\xf4\x7f\xc1\xca\xfd\x3\x8e\x88/\x5" +"\xce@yQ\xa4HPm\x98\xda\xfcQx\xf2t\xf3\xa5\xaf&f\xcc\xf1S1K\x7\xa8\x96\xaa\x9c&\xb3" +"\xf3\x3\xbd\x98\x9c?\xd8\x0\x9dt\xab\x11\x10O\xc-\xb6@$l\xe9\x83\xc4\x2\xff\xfd\n" +"K\x8e\xc4\n\x8b\x9d\x35\xe8\xae\xfc\x8bo<\xf5u\x98\x18\xc9\xe7\"\xb7\n\xc5\x9c]5" +"jf\x1b\x61\xac\xd5\xaf.|h\x8a\xf1\xf4<\x7 G:NAJ\x7f\xc8\x65\x65\xb0[\xea>\x89\xa3" +"k\xd5\xd2\x85\xffs\xb1\xf7\xaeLjN\xa4\xa9lim,\xf5\x1c\xf6\xde\x86\x8bGC\x97\xfd\x43" +"\xe8\x44\x4\x5p\xca\xac)1\xc2\xd3Y\x85\xff\x8f\xc2.\xff\x9W\xb2\xa1<\xcc\x8b\x93" +"\xff\xfb\x85\x83\xb9\x9d\x9b\x86\xeft\x87\xc6\x15x\x87\xa7NA\xbe\xb0rbG\xcdz\xb4" +"m\xa2\x99\x32'\x82\x12\xf0\x63\xa2\xb8\x41\x2(\x6}\x8e\xdd\x81\xe5\x92\xf6#\xc2-" +"\xdf\xf0\x1d\xc1\xa3\xfe\x8\x80{9!\xeczV=\xe6\x1a \xf5\x62\xa5\xb3\x9a\xee\xc6<\xd3" +"S\xe1\xd1\x91\x8e\x86\xda\xac\xb8`P\xbar\x1a\xf4@\xe7\xd8\xcfxIa*j\x8d\xcc\xa5\xf8" +"S(\x1a\x19\x85\x15\\\xfd\xc5[\xd9\x46~])\xc1\xf4\x44\xceM\xe2lv\xb6g\x16\xc\x19\x1d" +"vi?\xbc\x92\x86\x37?\x91\x9c\x6\xbc!\xa0Ua\xea\xe4\x0\r\xde^^\x93\xf9\x5\x97J\xb" +"7\x7\xe0\r\xb2\x0\xec\x4_Q\xe6\x1a\xa7\x64\x39\xaa\x18'\xbf\x33\xe4\x65\xca\xddm" +"\xcfg\x9\x38\xf8t\xd7\x93{\xf0\xa4\x35\x11\xcc\xc1\xbcv\x9a\xda\xa7\\\x10\x81UK4" +"\xbb\x13\xa1m\xd0\x17Z\xee\xb2]=\x1a\x6\x86:\x9d\x6\x6n\xba\x80\xcd\xd7\x44>\xfc" +"\xee\xd6\x16\x15\x1j\x9;\xe\xcf\x14\xed\x13\x92@+7\xd6\xc\x1c$\xe\xb2\x96>\xdc" +"\xf9\xd0\x46h\xab\xb0\xf2\xf5\x31\\\xaf\xc2>\xd4\xf9\xcb\xcd\xb5\x80\x6\x90\xba\xd4" +"\x8d\xf4y8b\xfd\x8f\xb7W_o\\\xec\x17\xf4\xde\x3*\xe2yc\x85r\xde\xad\xa5|\\$j\xe4" +"\xe7\xd8\xe7\xd9#M\xcl\x82\x1fi\xa1Wc\xda\x65\xd5m\xb0t\x99\x42\xae\xb7I\xebR\x15" +"+\xb0K\xf5\xa3\x9f\xef-|\x83\xa7T\xa6i0`\xeI\xda\x17\x66\xc1\xa9o\xa4\x9c\x31\xde" +"\xeez\xb6\xbe'<\xef\xc6\xdf+\xc8\xf7\xe\xaa\xf9\xf8\xc3}1!\x97$\xb5!\x14,\xc9\xe3" +"\x8%\xe3\xc8N\xfd&\xfe\x64\xa1\xb1\xca\x36\xb0V\xab\xa6M\x87)z#*6\x10`\xb3\xaa='" +"zC\x9d\x85\xb3\xf1\x9b\x65\xdd\x95\xa6\xaa\x85\xd1\xa7\x9b\xa9\x85\xb3\x5\xf1\xe1" +"\x85\x64+*\x97\x1a\x9\x19n\xe7\x7\x6)7j[\xb7n_\xe1t0\xdd@f~\xa8\x9c\x14K)f\xf7/\xda" +" _\x3\x45\x38\x12\xbd\x13\x1\xf1$\x89R\xee\xb7=\x0\x1\x10\xf\x10}~\x7f\x18r\xa7u" +"\x9a\xd8\x43=]\xfc$\xa0\x41R)j\x8a\xf5\xe6\xcb[A<\xd0\x42\xf0\xa9\xf8\xdd|\xbe\xbe" +"\x95$\xdd/\xe4\x4\x8a\x11H`\xf\x97\xc0\x1f\xb2\xf5\x5\xcc\x82\xe8\xb8\xda\x19x3\xa0" +"\xcf\x88\xae\xa3\xec\xaeg\x1eG\xc1\r\xe6\nS\x9dS\xee[Z\x97\x9a\x93\xf2@\xc1\x91/" +"\xb4\x64\x0\x9aV\xde;\x8f\xa7G\xc6\xd9\xff\x8f'H\x85\x7\x63\"\xe8Q\xdf\xdf\x13\x15" +"\xc0\x97\xf1\xeb\x83^q\xb8%\x2\x91\xf0\xc6\xf6\xaa\xfc\xe7\xa1\x9f\x9a\xcd\xc8g\x15" +"\xa8\xb8Z\xdbzr\x92\xaa\xd8\x1e[A\x86\xe8\x65\x15\x13\n\x62\xdd\xdc\xb1\xbb%\x1a" +"\xc6\xd9#\xf8\x3\xaa\x95\x33\xde\xea\x8d\xe7@\xa4\xc1\x32\xf1\xf0P|\x8a\x32$\x11" +"+o/Xu0\xd1\"\x14\xa3\xbc{\x5\x84\xd9\x43\xf3&\x9\x84\x9\xe5N\xcc`G\x88_A\x5\xddh" +"\x91\x30\xbcV\x93\x17\x1c\xa3\xa4\x43\x9c;\xf0\xbc\x0j\xc9q\xc3@FX\x80\xd2&\x0\x13" +"o!'6\x15\xd7\x80\xd7\x62\x9f\xe3'X\xc7\x85R\xe5\xb1\xb7\xf4\xc1\x64\xd8\xb1t\xb0" +" \x1i\xb5 \xb4\xbd\xf5\x96|\x8bH\xdf\xdf.\x1dy\xd4k0\x88\x88\x90\x92\x86\x36g:\x3" +"\x1cN\xb0K\x1c\x41\xf1\xbf\x34GK\\2\xeb\xee\xd8&\xc0\xba\xd2\xed\xe0y\xd8\xfb\x17" +"\xfd\xb1\x1d\x19u\x3\xf1n\x13\xe5\xc2+\xbe\xe1\xa7\xa9|\xaan\xe4\x1e\xda\xb\xf6\x8c" +"\xc9\xdf\xb1'\xe8l\xc8s\xed\xce\x66I\xf7\xb0\x10\x9]\xfc\xe6\xc1\x32\xef\xc3_\"\\" +"\xc4\x90\x82\xbaS\xcdxz:\xa4\x64\xe1\x44y\xde\x9e\xbf\xb9\x8c<\xe0\x6\xf1Y\xd3)\x9b" +">z\x8e'1l\x14q\\\xc3\xbb\xe5\x61\n\xd9\n\\\xff\xec\x8eG\x2M4H\x18\x1e\x8f\xd0\xd6" +"\xa1!H\x4\xe\x31\xc0\x44Z\xfd~\xa2\x3\xd3\x34,\xc0\x64\xe7\x63\x65\xf3\x14=SGT\x83" +"\x1aU\x8b\xcc\xdd\x1d\x39\x93W\xea\x9e\x95\xf1\x45},\xfd\xdd\xef\x9a\xc2\xb6g\xe1" +"Jd)\xe8\xb6_\xf4\xb4\xdf\x34#=\x7\x13\xa6T\xad\xf3\xc1\x11\x9dhp\xf1\xd8`\\L\xf2" +"m\xd7\xbcOM\x1f\xc8\xe7\x11h;<\x12\x15XC\x89V)\xc1jF\"\xeR\x92\x38\x65]/9:\xceP\xa9" +"\x8e\xe5<&\x18],\xf3`\x13[\xf1\x16\xdd\x8a#\xad\xd0N;\x4\xbe!lJ\xd7\x85\xf9i\xb6" +"$H\xd4 \x14\xdf+#\x1d\xa5\x64,\x83\x61\xd3\x33\x61\xd5\xd6\xcb'\xf9\xfa\x4W\xee\xc0" +"\xe0\xe4iuD\xf5M\xd2 5\xd1\\\x1c'\xd9\"\xc7\xf9\xa7\x84\x3l\xee\x80\r\x65\xf\xe2" +"C\xcbM>o\xb0\xfc\xffxlb4\xfb\x98\xdb\x81\x92\xdbz\xf5\xc1\x96K\xea\x15\x13\x36\x16" +"\x8f/U\xa4oIZ\xd5\x44\xfe\xbc\xd1\x1bPh\xca\xcb\x83\xcc\x1c\xbem\xf8X\x99\xa0\x88" +"B\x93\xbd\xeb\xe7\xca\x36\xf9\x1f\xbf\x93\xd6.\xde\xea\x7\xd8\xe\x16<\xb3\xb7\xbc" +"z\x7\x17=qX\x8a\xc\x19j\x2\xec>Z\xcdjU\xed(\xfa{\x10\xb4\x86^\x9eZ5\xd5\x43\xa9s" +"\x92]o\xb4o\xb0Q\xbe*\xd0l\x88p]\x4Y\x1b\x7f\xe7\xc1Q\x0\x89I\xe2\x0\xb5\xa6\xd9" +"\xd7\xbb\x8dI\x1f\nq\xc5\x39\xd6\x7\xd6\xa7@\x92\xa7\x10\xa9\xa8\xa4;s\xf5<\xcd\x98" +"l\xb8\x8\x30\x9b\xeGUy\xa4\xc9K\xe7;e\x9fJ\x8a\x8a\x8a\xeb\x12r\xd1\x91\x65ll=\x85" +"\x8d \x11\x9e\xccZ\xb\xac\xcc,?9\xd2\x92KJ\xa3\x1f\x9d\xf8\x82\x8a;\xf\x85K\xdf\xc4" +"I\xed\xcbv\xe2\xed\x80Z\x9b\x39>\x14\x82Q\xf5\x9a\xc5\x91\xe0\x15\xe6\x12M\xd6%\xef" +"\xca\x18>\x89\xa7\xfa\x85\xa0\xc1\xa6nb{\xfb}Q\x90\x30\xfc\x9a\x8bQ\xbb\x8d\x45\x14" +"\xbd&\xf0\x41\xe0\xeeM\x8c\x6\xc1\x8c\x31\\\xd2\x39\xe<\x90\xc2N\xd4\x8b\x19 \x18" +"\x17\xdayx0\xb5\xdcu\xf0\xc6\x34\xc4\xde\x83\xfe\xff\x85\x94[5\x95\x65s\xb6~\x1e" +"\xde@\x0*U\xe9\xcd\x80\xc0\x96O\xc3\xca\x35+\x2\x1c\xb9x\x9c\xb1.\xfd)6\xc1\xb5\xe" +"\xab\xd6!\x16\xed@*\xf\x46\x2}\xde\x11\xc0\xcc\xc0\xfv \x84\xf5\xa7Y\xa2\xff\xbe" +"P\x8f\xfd\xc4}u^\xa3\xa4\x9f\xc\x9d\xa7\xcdS{\xf2\xa6{Z\x1e\x5\xbc\xd9\xe8s\x5\x1c" +"sy\xfa\xc3Vo\xdd'aGw\x1f\xd9\x89\xabn\xd0\x17<\x6O7\x97\x8\xba\xa7\xf2!(\\\xf0TN" +"\xe7\xe4\x9d,\"|\xd7\xac\x9e\xd6\x9d\x15\xf8\x16\xe3\xf0\xbb\xa5\x97\x5\xb2\x8eR" +"\xd5:\xe4qGM\xd9\xb2\xda\x65\x16tV7\xa9\xcd\xa2\xcc'\x80\x3\xcd\xa2\x14)\xe2\x1f" +"\x9a\xae\x44\xe3\xe9\xf0\xb5O\x9o\xf7/\xfc\xe6X\x2O\x80\xf2\x9\xa1\x92\xdd`Pe\x6" +"\xed\xe0\xac\x36$\xc6}\xc9\x39\xc7\xb4\xae\xbd\xa5\xd1\xcf\x8c\x89\xcd\x8f\xc7\x5" +"\x14I\x7-\x8a\x98\xde\x1b\xdeS\xcc\xb9\x1dn\xcd\xa3\xb5\x44u\xfe\x45\x4J\xa6\xa1" +"?\x5\xa3_\xfe\x41\x1c\x36\x8d\xc8]\x12\xeb\x8c\xfl\x81\xaaR{\xd7j{K\xea\xa5#_}\xe5" +"b\xe2\xa0\xd9\xf\x8f\xb8\x96\xd5\x15;\xd6\xef\x62\x36]+\xf5\x45O\xe8q\xcf\x43\xf0" +"\xe6P=g;g'\n)\xc\xc7uh\xc9]\x9a\xfe\xcb|\xbcJ\x4\x9b$1\x85QV\x1e\xe3 \xcf\x1a\x36" +"\xd6,i\xf6,\xfe\xc5\xbb\xa3\xfaP\xc9\x97=\x3ZVl\x6\xcd\xb6;\xa2\xb5\x86k\xf2\xdf" +"Gy\xf8r~\xa8\x8c\x44@b\x1d\x15s\x9c\x88\x1e\xf3\xa3O=kOj\x11\x2\xf2\x2\xe0\x94\xed" +"=\xed\xda\xe2\x94\xda-\xab\x1\xc2\x97\x7U\xac\xf1/\x16\xa5\xbe\x9a\x5\x85\x81\x12" +"P]\xef\xe6\x89\xe4\xf6U6\x10$\xb\xa6&gJ\xd7\xf4\xaf\x34SR\xb2\xf6\x61ou\x3\xb3l\x12" +"\x1b\xb8\x65|iY\xb1\xd3\xa3\x97\x66U\x1\xd4\x12\x42\x39\x1)\xd4\x9e~\x9a\xfc\xa9" +"\xf6\xe6nu\xfa\xf\x63|\xe0\xdb\xb4\xc3\xab\xe6\x34\xd0{\x8\x46\xa3LI\xf0\xe9\xca" +"\xcf\x8a\\\xeb\xf0\x17\x7(\xdfnTc.#\xab\xc6l\x93\xa0\xe5\xcb\x64\xb3x\xa9\x8b\xa5" +"\xf4\x12JZ\x8\xc2q\xd9\x3N\xe8pL\xed\x15\x35\x35\xea&\xcb.\x96\\\x63\xbd\xf\x7\xfd" +"K\xcc\x84\xf8\xdd\x35\x18\x82\xdb\x95\x7\xce\xfdw\xedw\xfc\";>yE\x14\x1b\x63\x1a" +"&\xda\xc4,\xf2p\x92\x64\xfe\xa6z\xaf\x94Heh\xdb\xc6\x2\x93\xaa\xc0\x4l4\xc2Y\xe7" +"1\xaa\xa4\xca\x9a\xb9\xf0\xcc\x99\x3o\xe6\xc3\xff\x66k8\xd0\xa0\x1d\x1\xd3\xc1_t" +"\xfc\xc0\x98\x8d\xe8&V\xd6\x82\xbf.\xaf\xc1+\xbf\xc5rc\xaf\xdat5\xc8lwq<\xe2\x15" +"\x86\xf0\x4_O\x8f\xfd\x44\x1\x99\xed\x91\x9eU%~\xa5\xd3L\x92\xd2\x12q^;\x92I;\xb6" +"uG\xf1\xe8\x9b\xd2\xd6\x44\xec^P\xaf\x4\xac\x98\xc7\xf3\x95\xc7\x8d\xfb\x65\x34\x8e" +"e\x98\xb8\x35\xa0\xb9=\x8cQN2!\x12\xd6\xf8Nc\xa5\x41s\xef\x14\xd9\xb2\x30ub\x90g" +"\x92\xce\x1aX?\xf0\x19\x1e\xe8YN\xc8\x95|\xf8\x0\x35\x61u3\xe9\xad\xfc\xcc\x85\x81" +"\xfe\xb9\x99\x8ds\xf4o+)Q\xdb\x85\x87\xf2\x96\x8b\x84\xc6\xd8\\\xd8\xfb%\x15\xa5" +"\xf4\x9e|[\xfe\xbe\x1f\x86\x66\xe5\x9b\xdb\xf8\x9f\x81\x12}\x86\xda\xd3\xael\x9z" +"\xe4\xfa>*X\x90\xf2r\xdc-\xa8\xf0\x10\xbf\xf4\xabH2\x1a\xbd:N\xec\xd3\xb7\x1bx\xed" +"\x8dL\x7{\xaa\x33\x9b\xd7t\x15\x16`\xfc\xa5\xc2\x38\x1f\xc4\xed\xc9\xb7\x35/\xb\x32" +"7q,WV7\xa9\xcd\xa2\xcc'\x80\x1kh\xf8\x8f\xb1\x12:\x12\x15}\xe1X\x15\x5q\x86\xcc\x36" +"{\x85[\xa7\x38\x32\xa6\x8b\xd8UR\xceSd\xd8Jt\xad\x30\x4U\x88y\xe9\xaeh%\xe3\x63\x0" +"\x7f\xb2\x12\x88\x87R\xbb\xe8\xe\xd6\x1f\xbcV$\xb9\xf3\xa7\xdb\x87>\x86\x1!\xc4\xbf" +"\x9cSn\x4\x15\xba\xc8\x8b\x1d[\xc0\xa9\xf9\xa1\xe0s\xf\xfS\x9c\x8d\xb4\x11\xaa\xc5" +"\xb1\x2\x1f\xe3\x90\x98\x66\xc0\xcc\xe1\xe0I\xdao\xb5\x32_\xe7}UN\xa8\xb6\x83NE\x12" +";\x14\x44-\xb\xf5\x85?\xba\xbaJ\xa4\xfc@\xaf\x96vWAQ\x87\x96\x1b\x9f\xda\xeb'\xd0" +"\xfcx\xf5\x84)E\x8\xa5\xa5\xd8]y\x14\\\xf5\xde\xb3\xe7\x84\x31\xe2\xf5\xd2',\xcc" +"x\x18V\xff\xa9\x8d\x87\xd8\x43-\xc4^3\x18\xcf\xd3\xc5\xff\x17\xb5\x1d\xd1o\xa3\xe0" +"2\x16pX1\x1eO\xaf'\x10\ru\x0\xf0SkW\xe7\x9a\xc9\xf9$&\xd9\x18=6\x85/c\xc6\xa3\x94" +"T4;\xce\xec\xbb\x92\xdcN\xda\\r\xc6\xf8\x8c\xa1\x46\x34\x16\x43\xf0\\\xdf\x14\x81" +"\xa7\\I\xe2\x30\x61\x99\x94\xa5\xae\x18\xc9\xfa\x83\x0W\xa9p?\x80&*\x1Z\xe\x8a\x9a" +"D\x95\xd2\x6-\xa1\xd8i\xb1\xed\x85\x62J\xeb\xd0\x91\x11\xd5\xc7\xdd\x37\x82\x9b\xd6" +"X\xc\xd2\xae\xf6\xeb\x31:d\x18\x61\xa0j]?\x8d\xde\x18\x13\xa8N2n\xab\xfc\xbc=\xbd" +"\xcbz#l\xf5\x35\xd8X*\xbd\x94}N&\x7f\xeb\x98\xc1\x81\x1e\x13\x45\xdd\xea\xa7=\xc" +"\xd5\xeb\xe3\x8e\xb7h\xa7\xd5\xfa\x7\xd5\x8\xbf?c\x14&\xac\xc8#\xfW#95GF\xff\xf4" +"\x5\x37\x82?\xd1)\x12x\xdesl\xc2\xde\xc5\x8\x4\x65\xd1\xb1\x88\x88\x1d\xa6\x1cr\xfe" +"\xe6\x65\xf1\x14];\x14(\xb9\x92@Gb&\xb0x\x1f\xae\xee>\x1f\x1b]\xd4\xa5\x5ug\x8b\xba" +"\xb5*\xbe\x30\x39\x9e\xb4j\xe4\xa5\xab\xea\xa6\x4\xe1!\xcxVkX3\x82\x11\x62<\xb5\xd6" +"\xa5/\xbb\x86\xb3/\xdd\x9byV\xbc\x8\x44\x38\x34q>\xb5\xd4\x11\xcd\xeb\x19\x17\xa4" +"%&\xbdS.\x1b,\x9d:\xd9TC;\xe9'\xd3\x32s\xe2\x1e)\xd2\x95\x93\xee\xb8\x96\x8\x16\xf3" +"\xc3\r\xeb\xa2\xac\x17?\xe4\xb6\xdf\xd1\x93@\xad\x18\x44[i\xf7'\x7f\xd2\xd5\r\x45" +"c\xf4\xfa\xa9\x97\x62\x66%\xdf~S\x90v\xa7\x34\xbd>\xa3\x2\xa8\xc6^}L`t\xdf?\xee\xd3" +"\xdc\x1e\xfc\xe8=\xd4\x1e\x7f\xa1\xc6\x88\xdb\x10\x8e\x6'n \x8f(\x12" +"\xf6\x7f\xd3\x38j\xa4\xaf\xd2\xaa\x6\x98\x9d\xc8\xf0M@\xbbh/\xe7\x93$\xb1\xae\xc1" +"\xb9j^LKG\x93Xe\x16\xdex\xc8\xfd\xf1\xfc\x8a\xc3\xb5\x8c)\x13If\xe3x\xe0\x83\"\xfb" +"\x9f\x89\x8b\x5q\x8a\x3[`\xe\xcb\x9a\x8e\x85\xc5\xf3j?e\x8\xf1R\xf7\xa8\x8f#\xb8" +"D\xaa\x86\x34\xfbk\xac\xd6\xadv+J\xd1z\x86.\xcd\x8f\\\x9cY:h\x9a\xbc\x2\xb5v\x99" +".\xd4\x81\x45\x2\xdc\x62\xb4\xdd\x36.S$\xf1\xbc\xc2\xfa&\xe4\xcc\xfa\xaf\xfa\x80" +"t\xf7\xcb(-\xaa\xa0\x91\x66\x32\xa8\xd2\x15R\x82\x33\xbb\xe1\xb0\x9\xaf\x11\x64\x99" +"7\x7\xdc\xe5\xb4]\xc7\xb3\xd8\x99\x65[\x95\x46o\xce\x4\xcf\xca\x17\xd4\xa3=\xb2\xf9" +"\xbcq\x16KOK\xc1\xbc\x63W\x11#6\x16/\xfc`\x6\x46\x4-:9C\x8d\xbe\xa6\x3+c\xba\xcb" +"\x9a\xe1I\xb7\xd5\x8\xad\xf6\xab\xcf\xc5\xb0\xaa\xf2\x90\xcl\xe\xc7\x80\x64\x1e\x8c" +"+`\x8d\x98\x32\xb3{\xaa\x11\x4\x32\x11\x65\xcd\x64\xb8\x31\x8e\x45\xe0\xf7\x8l\xeb" +"\x13\xca\x18\xb7\x82\x63\xf7\x4)GN.e\xcf]\xab\xb1\xe8\x1a\xf6\xfb\xf4MT\xa2\xca\xb9" +"n\x83\xff\xb4\x12\x9d\xf0\x44,~\xef\xf0\xe3\x95-\xd6\x97\xb8\x33!\x8\x14\x8b\x92" +"x\xc8,0\x95\x35\x66\xe5\xb9\xba\xa0\xdb\xc7`\x81\x8b\xb0?\x7f\xd9\x5\x8vZg\x1c\x9" +"\x83\x13N\xc9%\x11\x8M\xd7\x46~u\xa3\xef\x38\\z\x93\xc5\x92\xec\x98\x39\xf9T\x80" +"\x96\xbf``8\x2\x87\xcdi\rqDR\xd9\xa6\x7f\xdb\xed\xa0\x63\x13YS\xf5\x44\xd9\xf3\"" +"\xf5\x9b\x65s\xb9\xd9\x30\xf0w\x0\r\xbf\x11YU\xfb}[h\x84\x38\xa9\xddT\xcc\x81$'\xc8" +"\xd1\x66\xe0\x30\x65\x92\xfa\xb9+lYK&\x14O?nl\xd5\xe4\x45\xb\xb5\xf3q\xcf-G\xfe\x93" +"2w\xf1\xca\x65\xa9\x8\x12\xb4\xc6\xf5\xbb\x42NDT\xed\xa5\xee\xd3\x34\xd5w&{k\xdb" +"E\xd4$X\x2\xd8\xae\x38\xca#|\x87'\xab\x8d\x44\x66W\x81\x1dx\xf2\x3\x94\xfb\x0\xf2" +"L/\x91L~\xbf\x42!\xf4\xe5\xf6\xf5\xb1\xe7\xfbM\xd2\x1a\xa3\x42\xf\x9e\x8dU\\\xb1" +")T2\x86\xf5\x9c\xaf\x43\xb1\x32\x1e\xc6\x63\x95\x5\xb7\x1e\x35\xc6I,\xf3\x14\xfa" +"\xf2\xb0\x89q\x6|\x13\xe8\x82j2\xe5\x96\xe7\x9b\xef\x30\xfd\x1c\x62Vl\x81Z\x97\xe" +"-IB\xca\x7f\x81\xcb\x1d\xc7>H$\xe1\xb<\xa4\xb3iy\xd7h\x91\x93\x95|/\xb0\xf7\xc=~" +"\xbd\xe5#w.\x3\x1a\x91\xb0\x97\x7:'\x8c\x84\xd6\xa4\xb1YG\x91\xb7\xc4\x44\xdbj>\xc4" +"H\xb7\xf7\x33\x9bW&\xb3\x84\xc6TW\r\xbW\xef>:6!\xb7\x30\xc7\x9fp@\n\xd2&\x8f\r\n" +"=\xd6\x61\xe4\xc5\xfe\xd6\xe8\xad\x12\x38\x33RjHd\xe9{9xK\x8\x35o\r\x96\x1e\x80\xc" +"0L\x84\xb6\xd6\xf5\x4^\xf3*Y\xac\x88&\xb\xa4\x1b\xa6\"\xad-\xbb\xe1\xbf\xaf\xd2x" +"r\x96*\x1d\x9e\xa3\xf5\xa2\x1d\x1e\xb8\xa1,\xbb\x1aID\xa5\xff\xfaZ\xad\xa1\x6\xa6" +"\x7f\xd4)\xc8w\xe9r!\xb1\x42\xda\x8e$\xd9\xe5IC\xd6%%\xe5\xe\xfaw\\a\xf6\xcc\xe5" +"\xfe!%\xf8\x1b\x9f\xf1\xe4\xce\x15Y\"\xd5~\x9f\xde\xf4\xe5\x10)/\xb8\x1eR\xfc\x1b" +" \xa3\xee\xed\x82Q\x3(U\xea\xa4\xf5\x7H\x2\xf0\xc3\x8d(N\xe2\xeb}\xccm\xa8\x88\xd0" +"\x11/5\xda'\x9d\x1f\r\xe1\\SF\xaa\x2o\x1f\xfb\xe9\x8c\x5K,7\xe9\xbd\x33\x39\xce)" +"\xb4\xe\x36\x98\x33~\x96\x9\r\x3ZT\x8b\xa2)\xc8\xab\xf6\xec&[\xf5\x9e-c\xaa\xe9\x1" +"\x1ax\xbf>\x99O6\xdf\xf\xca\xadm\xa5\x64$\r\xbbI\xd2O\xc2\x45\xba%I\x2K@O\xc6\xa9" +"\xff\x16\x9\x45\x2P\x8r\xb4\x97^U\xd7\xe7\x7f\xa3\xca\xc5\xa1_\xc3\xcb\xb1\xe6\x14" +"\x18\xf6r[\xddx\x83\x65\x92\x43Q\x1f\x94\x86\nm\xc\xa1\x3Z\xe4\x39\x9d\xe1\x97+\xab" +"w*\x86*\xd7\x14\x8b\xea\xb3!\xcc^\x9eq\xca\xafZ\x17\xd5\xcdL\x7\xc6\xb3\x39\xdbY" +"\x1a\xa3R/\xcc\x19\xae\xd6s\x12\xed\x35i\xa6\xfe\x87m\x9\x96\xbf\xf7\xf9_K\x7f\xda" +"~\xd8\x33\xab=EeMT\xc8\xa3\x98\xd2|>\xe7\x9a\xb7|\xaf>:2L\xc\xd6s\x9c\x38\x96t\x6" +"J\r\xeb\xe8{\xde\xdc\x88\xc8\xc8)\x95\x32\xc5\x94\x3V\xe6YI`\x8a\xe0\x1d'\xc8\x15" +"\xb5\xda\xb3\x9aU\x9b\x99\x95!N\xb3I.6\xb0\xf4\xda\x4\x5\x1e\xe4\xaf\xc4\x3]'\xb9" +"G\x93\x96\x11l\"\x15\x5<\xf8\xd9\xf5\x1f\x85\xf9\x35\xedr\xa7\xdc\x43\x11\xe\x80" +">\x1e\x8d\xac\x83\xe\x30<\x1\xaaM\x1a\x9d\x38\xf3U\x3qp\xa7\x8e\xa2\x1a\xca\x42m" +"\xb4\xbc\x12\xde\xab\x80\xe2\\n1\x8b\xcf\x19\x1a\xdfR\xf\xe6\xb0\xbb\xf\x2\x1dwz" +"\xd1\x8c\x87\xc9\x82\x6\xbf\xad\xcd\x31h~\nqSL\xa5\x62\xa0j\x98\xadl\xc1\xbc\x92" +"\x83\xe4\x9c\xde\x80\x9f\x17\x10\xbd\xec\x90\xe9\x6\xa6\xb8mL\x1d\x88|\x97v9\x1b" +"\xb3\x7\x93v\x96\xaa\x8b&D\x13$\xa2(/<]G7\xefy\x92\x5\xcc\xeb\xe2\x80p <\xf1#(sO" +"\xa3\",\xdan#\xaa\xc2m\xb5'\xc2\x9c\xaa+\x98z\xc3\xc2\xc5\x87\xf0\x63\xa2x\x98V\xe" +"\xd8\xf\x8f}z\x1cK#\xfa\xb3\xa7\xf4%\xeb\x85\xde\x8e\xf7(7\xed\xef\x96\x18\xad\x41" +"\xda\xaet X\xa6r\xc3\xfd\x31p\x6\x1\x11'\xd2\x86\x90\xf8\xe;d\x96\xe4x^V\x92\xff" +"N\xf5\x97\x30\xe9[\x92\xd4\xc\x38Ujf\x1e\xd4\xf0w\xf9\x1f\xff\xe\x8ci>\xf6\x8f\x0" +"\xc7\xc9\x16\xdf\x1c-\x17I\xdc\x63\x45t'\xd9\xd6\xd6\xec\xec@<\xa6\xe\xf3\xae\x43" +"Ms\xeb\xf8q\xaf\xfeRe\xef\xeb\x93'\x8c\x30\xcc\x96\x9bgY\xcc\x3\xc\xbd\xfc\x36tH" +"\xeb\x7f\xe9\xd1\x91\x8c\xd1\xa5\x16u\xfe>\xcc\xc9\x86I)\xb1\xe2\xacY-\xa5\xa7Hu" +"-\x3\x1d\xca(s\xbd\xbc<\xdd[\x83\x5*9G\xa2\xesb\x15\x7\xe4OR|\xed~\xf1\x88\x13r;" +"\xecv\x8c\x97S\x9c\xc3\x1cq\xe7\x1\x37/\xde\xb0\xd0\xez\x99\xd3,\xfs\x1dt\xfbO\xae" +"\xabn\xc5\xd3\xae\xf8T\xf1\x18\x14\x1c\xe7\x15\xb9zP\x8b\xecNg\xf7\x35\xde\xb8\xd4" +"\xd5`\xb8\xbe\x62j\xa8\xd1\x86\xfc\xd7\x11\x7f\xccs\x85\xa6\xea\x84\xe3i%\x8\xd4" +")\xc6%\x85w\xd0\x87\x7\x1f}\xe\xc2\x17\xa3\x85,\x82\xe3\xcf\xda\xfb\x62\xbag\x9a" +"MMn}\xca\xc2ON\xcb\xb3_\x1e\x81@J9\xfd\xb2s\xb6\xe0\x8fQ\xe7\xd3\x85\xf1\xea\x0\x13" +"h\xa8\xcepJ\xe1\xc3\x14\xd7\x9e\x11\xbe:\xfa\xf3\x8c\x14\x65\x93\x1bP\xeo\x8bMM2" +"\xf2\xf7\xc0\x2\x31\x9d\x0\x8\x66i\x19P\x8b\x1b\xc5\x86\x8b_\x93#\xd9\x93\xee\x8f" +"~+\xfc\xb7Os\x81\xe7\x31;o\xf5\xb7\xa3q8 \xd6\x15\xba\x8a\xe4\xc8xs\xdc\x9aW\x3\x44" +"\xfek\xb2\x0\xf2#\xf2\xf5:\xd5\xfe\xdc\xb1\x96\xe\x83\xd0\x16\x93=\xcd\xcd\xbe\xb2" +"\xf2\xe0z\xb4\x2\x41\x14\xdb\xc1\xd9\xbf\xad\xa2s0q=\xf7\x5Hg\xcX\x91\x99W\xcb\xdf" +"\xc0\xc4M\x83\x96\xd6\x1fk2\xd2\xee\x14\x1c\xe5\x45\xcc\xf3*\xba]\xf5z\x15\x13\xc9" +"=\x1d]\xe4\xf6\xeb\xc4\x8fg\xfd\x1\xb5\xfe\xc1\xbf\x8dr\x9b\x1\xaf\xf0\xf5\xce\x83" +"\xf4\xf6\\H\xecT\x9f\xe9\x42r\x2\x39\xa1\xb5\"\xe3\x9c\xa1\xb2-z\x8e\x19\xc1\xe6" +"\xa8\xea\xa1\xb8O\xa8\xe9}:\x4\x8c\xb\x9f\xb4\x33\xaf\xcb\xfb\x10\xf0\x15\x9cg\xd4" +"\xab~\xca\x6JHC\xc8\\\x38\x81\x12\xde;\xdc\x8a\x94\x1cWO\x84~\xe3/r\x5g.\xf5\x93" +"b\x3\xba\xeb\xdc\xcb\xf\xe3K\xc9\xcf\xed\x62\x11)w\xb0\xed\xac\x8M!'{\xc7\xc1\x44" +"\xcd?\xcN\xe7jd\xbb\x89\xeb\xa1\xf7\xc8,C\x9y\xdf\xedp\x9dsv\x96\xd0\xf3\xf1H\xeb" +"\x92\xe3\x13-cA\x96\x12\xf8\x9e\x63\x10&\xc\x95^1[r}*\xe2\x38\x90\xad\xfb\xf1\xac" +"f|\x11\xe7\x99g\xa7\x9f\x65\xec\xa6\xe7-\x8a\x0\x36T\x6u\x1c\x31\x8bv\x96JQ\x9a\x81" +"RwlSY\xd6\x96\x12^cLq\xf8J\x9b\xe9HTW\xe0\x80&\xd1z\x80mH\x87\x96\xc1\xd5h!\xb\xcc" +"\x96\xe7}\xc1\x13Z\xa9Wt\r}/\x87\xc6\x66\x63\xe9S1n\x16\xc3y\xb\xa7 \xa4\xf6\xbd" +"\x8b\x37\xdf\x4\xc8\xe\xae\x2nSk\xa2\xf\x98\xe0H\xef\xa3\xd6/\r\xf1l\xd6\xc0\xb3" +"\x88\xed\x6\xa2\x38h\x8cZ\xdd'}\xeb_~\xbg\x9c\r_\xe0.\x9cG\xf7K\xbd\xb2<\xb1-\x80" +"\x1c\xed\xdc'\xf7\x16\x1c%\x1H\x17\x41\xf2\xb)9eh\x14\xff`\xdf\x15h\xc4\xb1]e\x1f" +"\xa8\xb7 LT\x14\xadK\xa5\xd4j\x88o\xc7\x62\xff\x41\xa9\x3\xfdV3W\xdb\xf8\xce\x31" +"/\xc2\x18\x61+\x19n\x7f\x63\x9d\xabm\xbf,A\xa3?E\xdf\x66\x84\xd3\xdc-}\xe9\x98(\xe" +"\x9c\x19\x9e\x8c\xb6\xe2\x19\xf4\xb9Yd\xcfIk\x95\x66\x41\x9a\xaf\xbe\n'\xbd\xbd\x39" +"\xed_\xd5\xc5~\x7\xc0\x13\x12\x87[\xea\xed\xd9H\xaa\xef\x9\x32\xe2\xcf\x94|\xc6\xf4" +"\xf0,g\x17\xde\xbf\x90\x30\xee\xa1\x8e\x61\xe7\x97o\x1a\x96n\xf3L, \x10\x98\x35\xf9" +"n3;\x4\xae\xc0}\xa2UN\xd1\x92\xfb\x7\x87\x33k=\\1T\xca\x1ft\xad\xa0K\x94\xa5\x9d" +"n\xf\x63\xaa\xa3\x41\x3&^\x8e\x8b\x92\xc1_\xc9\x1a\xe1w1[v\x8c\xb4\x88\xa0\x18h\xf8" +"dr\x11N\xba\x84\x93!\xe2\x10Te\xe7\xb0\xab\xb3\x87\xaf\x96\x6y]\x0\xc7P8\xc4\xe0" +";\x9c=c\x9c`\xe8\xc7\xfd\xc5\xa2?\x96\xbe\x99&\xff\xe3N+\xcd\xe9\x1d\xf7\x94\xe4" +"\xd8\xd0}\xba\xec\xf3y\x7f\xae\xe5\x91y\x7\xddL\x14\x1a\x19\xcdO9\xc5\xd6\xe0u\x93" +"p3\x9a\xae\xb8w\xb3\xfc\xf2\xb7\x33\"\xcf\xf3\xe0S\xbe\x86\xe5Y\xb3}\"\xe5\x87\x66" +"\xbb\x35W\x88'\xf\xb5\x66\xfa\xcd\xc8\x9e\xb1\xe5\x87\x8c\xf3yZ\x5\x14\xfb\xcb(E" +"\xb3\x8f\x8ei\x16\xd6\x16L\x16\xe1\x38V'[\xf1\x9c}\xc\xba\xc9\xdc\x1\xd1Qv+\xf3\x9c" +"~\x18K\xfdvR\x92l\x10M\xdbz\x8e\x33\xac]\x3\xc8\x4\x9eo!\xd3\xefL\xe7\xde\xef\x0" +"\xa8\x86\x14\xab\x39\x42\xd0W\x94\xea\xae\x38\xbc\x8\x8e~\xa8\\\xc\x8c\xe5\xa1\xaa" +"\x4\x8\x9eTD\xd7\x2\x82x\xb0\x9b\xff\x9f\xeft\x11\xa6=\xba\xdf\x64\x89\xc1\xfa\xc8" +"\xbd|4\xb6\x98HO\xee\xedi9\x8a\xbb\"K\xe0\x42\x1c\xb0,\x0\x9f\x11\xf\x9f?\xfc\x7" +"\xea\xac\xbc\x96V\xaa\xfb\xfa\x0\xf3\xa9$K\xa8\xa6\x87\x1cl%+\xa5\xfd\x99\x91\x39" +"\xa2\xceN\xf9\x18\xcd\x92\xe\x32\x84\x8d\x37\xb8\xf2\x62\xe5\xaa\x90\\\x16\x8b\xec" +"\x82V\xf0P\xdb:\x83=\x95\x97Z\xce*\x94\x1b\x65\xd5\xb1\x7R>CJg\xad[\x16=\xc2\xcd" +"\x9\xe5\\U7\xb0\xc3\x1f[,\x19\x37\x61\xeb\xc6:9\xac\x19,\xb4\x8c\xd1Vl/\xdc\xf2." +"\xb7lj\x17olH\xeb\x95\xd2\x15\x30\x38\xed\x62\x8a\x8d\xa6/\x98\xe5\xde:\x99\xc3\xdb" +"*\x90\x80\x43@QF\xc8\xe0\x15 S\x15\x80O\x93\x91\xff\xfa\x8a}\xf6\xc9\xdf\x13\x46" +"\x98\xf8\xf7\xb0[\xc1\xa2\x38\xc8\x1c?.2\xd0<\xe0\x9c\xf7\xe2\x88\x64\xc1\x9d\xe9" +"r\x19\x66\x17\xa8\xcbM\xff \xfb-\x96\xc8\xf9\x96\xfa\xb6\xf0\x1c\x13\xff\x45\x0}" +"\xbT}.\xa1n\xa9\x81\r\"\xf6\xdb\\\x9e\x9f\xc\xdf\x32\x3\xb\xaf\xa1\x95\xe1\x34\xce" +"b>k\\\xe0L#\x89\xd1\xaa\x32\x13\xa3\x8cy\xd7\xe0\xca?\x81\x34\x4\x87\xc4\xe4\xf4" +"\x7f\xcf\x7f\xe\x4_\n\xeQJUNB\x96\x8b\x99\x89\x30\xd7\x64{\xe4\xd2\xecx\xb0\xdb\xb4" +"\xd4\x92\xba\x4\xfc\x36\xe5\xd7TO\xfa\xfe\x42\xea\x45\xa6\x91\x34\xf9l\xd4#\x86\xc2" +"4\xa9\xe6\xfaT\xeev5\xd0\x1c\xf1~\x92\xb2\x8e\x8p\xd6\xdaQp\x96uX()7\x1dK\x15\xef" +"\x4\x85.\x96\x64\x88R\xfdp{@\xed\xef\x1d\xda\x30\xda\x95\xb5\xa2NIt\xc+\r\x84\x80" +"\xe0\xea{`\x9eo\xc3\x90\x14\x1c\x18\x33\x38\xe5\x39\xe6\x9e\x19\x95\xb6\xb2\xbc\x93" +"E\xc0\x9d\x94QX$\x1dU\xac\xfc\xc1\xdb\x35\xc6\xe1N\xf1\xe2\xfa\xf5:\x94\x38\xe0\xb1" +"\x8a\xf4\x11K\x94]5\xf5M\xc1\xd1\x9c\xa9\x1\xe8;\x99I\xd0U\x8dY\xd0j\xe2\xc9\x99" +"\xc1\xb5\xc8\xbd\xb\x1e\xd7\x45\xc4\xe\xc9\x11\xf0\x41/\x9b\xfa\x90\x87\xc2\x1\x39" +"\x1\x9e\x61\xf6\xa9g!s\xc3\xa9Hh\x17\xcd#\xfd\xdd\xff\xb2,\xe\xad)\x15\x80\x39\xb4" +"\xc7'n\xcb\"\x80\xaf\xe8\x11>\xc2\xfb\\\x1fu\xe8\x3\x87\x19\x6\xf2\x87\xa7\xc5\xc1" +"0\xab\xa6\x36\x81(\x1e\xce\x9f\xb5\xb5Q\xcf\x19\xbeO2{a\x86\xba\xb9\xacx\x12\xb5" +"\x6\r\xfa\x1c\\\xba\xfc\xe\xc9\xfd\xfd\xf7\xfc\x65\xa1\x31`\xb8K!\xf0\xa7s\xf0\x9" +"\x8f\x83\xe8\xb4\x1b\xcc\xa9`\xd1)\x95\x83\x8c\xfb\x8f:\xe1;\x86\xe7v\xd1q\xc5\xc" +"?A\x81\x84\x7pUR\xb6\xf6\xc0\x8b\xb1\xe2\xaeK\xc1s\xed\xc2\n\xf6\x82l\x95\xf1\x46" +"\x8a\x38,\x8aik?\xd4\x34\xfd\xe1\x32\x9b\x7f\xc5Ri9\xe2?*b\x2 !\x13\x66t~7\xa4\xcb" +"L\xbf\xe7\x1d\xbf\x31Ws\x11\x9coW\x4\xce\x63I0??j[\x1a(\xa8\xc3\x61\x61:\x2\x85r" +"\xd6\x1a\xfa\xb8\xb2\xb2\x1\x8a:/\x86\xd5\xbd\xad\x8c-g5\x9f\x8f\xf6\xe0X\x7\xbe" +"T\xa5\x86w\xaaU\x96\x8e\xba\xe8\xae\x92\xbd\xc1\xe8\xda{-\x17\x13~\xff\xb5\x1d\xa2" +"\xd2\x1bY\xc6'\x12\n*\xe4\x61\x41\xe9k3\xd6\x31\xc5`\xd1\x9d\xef\x8co\xcb\xdd\xf3" +"2a_*\x97\xd3\xf6`\xee#0\xc7\x9eK\xfaMw u\xe1\xa0\xb3sA\x18\xe4}4\xe1\x96_\x92\xa5" +"\xaf\x37;\xb0\xe5\xf9\xc\xbc\xf7\xb0.\x1b\xd6,\xbeW\\i\x9a\"\xaf\x3\x5\xa3\xb]#q" +"~\xcc^E\xb1u_\xb7x\xf\xc5@\xcd\xac\x33\xc\xab\xe4|\x15-t\xa9\xa6\ni\xc4\xac\xb5\x85" +"\xe4SxC\xde}\xbb\x5\xd1\xa4mE\xf0\xb8\xea\x62\xa8J\xc5\xb5\xb1q\x9c|\x7f(\xd3iE\x9b" +"e\xcd\"G\x8e\n\x63\xf7\x8f\x34`B\x1e\x4{-\xcf\xf\xb6\xacI\xe1\xc4;\x15\xdf\xa9\xed" +"\xe+\x85\xba\x80\x1e\xd6,\x87\xff,uJw\x98\xe9\x7|\xf3+\xdb\xae\xaf\xfc\x16t\xf3S" +"]\xabI\xe \xab\xeb\x42\xcav\xc7\xbf\xcb\x8e{\xcb\x1f#X/#\x2\xd4\xa4\x1f_\x9c\xbf" +"\xe8TGJ\xdf\x84W\x8b\xcb\xa5\x9al1m\x1b\xfcq\xca\xb3\xf7\xcdO\x81\xd3\xd3:\x6\x35" +"t>\xa0\x9c&\xb9\x1fz\xed\x88\xd7\xb7U\x99,\x10\x16\x34\x13\x17\xff\x96\xeb\x8a\xf0" +"\xf9\x39g\xb5\xa7\x41\xb2R\xf7\xcb\xa2\x66\x0\x18\x6\xa7\xf4\xfeJ\xf5\x9d\x4;\xe0" +"\"\xb0\x8ai\xe8\x64\x38\xabnZ\xc3\xca\x92\xc0\x65\xa0\xc6\xea\\\xc6\xa7\x94\xf7\xfd" +"\x7fQX\n]\x1a@&^\x80.\x97\xf3\xa1\x83\"\xe9\xb\x9c\xa1 F,\xa3\xe1\xf7J\xa6\xec.\x11" +"\x96\xd0$\xa9\x10!9H#7\xe5\xc6\x86g\xc0\xdd\xa5u\x1b\x0\x10\x13^n_&;@\x2\xf0\xfc" +"\x8a\x92\xe4{\xb3\x8c\xe4{\xaf\x8d#\xbf\x18^\xf5\x10-\x9cv\x16\x9Pg9\xb2\x5R\xcb" +"i\xeM\x9dkDRn$`\x92\xed\x1c\xbb\xef\x64\xfd\xb0K<`\xb1\xd0\x9e_w\xad]\xbr\xfa\x36" +"\xeb\xb5\x31\x17\x63\xec\x10\x38L\x94\xb3\xc7ln\xa4\xf6\xf9\x36\xb0I\xcc\x83l\x97" +"X\xdf/\xa6\xfc\x14\x62\xb7Gb$\xf\xe3\xd5\xfZ\xe2\xd4\xcao\xed\x66q\x82\x81\xb3\x9c" +"l\":\x85\x9b\x62(\x91]?Q\x92>\xeeW\xf6\x1at\x8e\x1\xe3w\xd9NT@\x83MQD\x9f\xd2\xbc" +"\xad\xeb\x11\x9bq\x1e\xb6\xfd`\xbz\x95z\x8c_\x97\x8d\xb6\x9d\xe9\x8a\x9c\xda\xfe" +"?\xa9\xf2\x63\xac\xb3\x14\x80\xc/\x16\xdfm\xe1\xa8\x19t\xcd\x32O\xd1\x81\xc8o\xfd" +"\x91\xde\x43\x93\xa9\xe0\x8V}\x5\xd2\x92\xc5\xf3\xaf\x80H\x88\xd5%\x9HM\xba\xa0\x18" +"\x14\xda\xb0\x82\x1b\xbc\x82\xd4*u\x9f\xb7\xf3\xc5v\x8e\xa5\x18\xf8\x34;\xcc$\xb3" +"\xb4-\x84\x95\xb1\xe\x93\x98\x38\x33o[_\xf5q]\x4\x9b\x90\\\x89|\xebX\xe2\xd0\xe0" +"F\xf4Q\xb7Rf\xdf\x15-\x96\xb8\xf4L\xad\xf6\xb3*\xcci/~}\x18\xd1#\xd5\x8a\x2\xe4M" +"\xf5\xb6\xaa\\\xcf\xe8\xef\xf\x83K\xe4\xd5\xec^\xf6\x18M'\xe6\xec\xf3\xbf\x30\x95" +"[\xe3\x9f?\xed\xb6\x8\xc1x\xb9\xcf\xc7\xf5\x97\x39\xf2ns\x18\xc8\xaf\x7f\xe1\x1b" +"\x9d\xa1\xb\x34,\xa9\xa5\xf8\x41\x1\x4\x98i@R\xb5\xb5\x95\xc4<\x88\xd2\xec\x32\xb4" +"f\xd2\x1c\x9b/\xb1\xb6\xf2\x1b\x1a\x80\xbbh\xb9N\xd8\x17\x7\x38Vb\nx\x95\x9\xbf\x9a" +"\xfc\xa6\xd4\x61\xf7\xdbz\xc2\"\xbfOuC\x1cP^E\x14\x9\xf0X\x14<\xce\x19P\xfc\xaf\x45" +"\xa1\xcb\x99\xde\x9b\x34\x9\x64\xf1*b\xfd\x11\xa7T\xf\x82\x32\xbc\x7fvY\xf1\xb8\xd6" +"s\xc9\xebX\x5\xd5\x30(^h\xc7Ia\xfevu]\xa7\x1b\xa1\x31\xdf\x30_\xc5\xfb\xf5\\\xb$" +"\x99\xe\x12\x1\x91\xb1\x33~\xf7\x3\xe6\xfc[f\x99\x80\xf7\xb3\xe1\x82*\xf9\xa3l'\xc3" +"\x8b\x43\xd9TN\xa8tj\n\x90S)l\x8d\"o5\xa9\xfHc\xad[$\xd1=\x80\xaa\xda\xe\xc3K{\x9c" +"\x98\xd6\xc9\xbe\xbd\x1.z\xaa\x63\xa6\xff>\x93H\xd6\xea\xa6\x81x\xfe\xcf\xa0:55 " +"c}E\xbb\xc8\xe7!\xc1^\xf9^\xb7\x90O\xbbQe!\x18\xac\xd7\xbc\x62\xd2\xbe\xbe\xb1\xf7" +"\xb1\xff\x17\x87J\xa7\xcc\xcd\x7f\x9a\x64\x90q\xb4\x65\xe\x99\x46\x32\xf1\xa9Q#$" +"\xbb\xd1\xe3\x1\xb9\xb3\xb6\x10x\xae\x5\xa7-\xd1 \x1\xf8l\xa9\x31S\xde\xfb\xbct\xd5" +"V\xad\xe5r\"h\xfd\x35\x15[\x12J\x98\x99\x93\x14\x17<\xda\xd8\xa6gz\x90\xe5\xdc\xa3" +"\x9bIali\x9a\x30V\xf1\x9b\xac\xa4\x63i\xce\xacN\xd9JwfNS*\xdd\xacH\x83\xf5\x17\xb5" +"\xc3\xfe\x89\xa0\xa9\xc1\x94\x18\xafr\xd9V\xb2\xa2\x66\x0-\x6`\x95\xb7\xd5\xde)\x6" +"\xf6-\\\r\x9d\xb5\x30\xac\xfb>[\xef\x8d{\x94$D8\xee:\xce\x34\n\x1\x17~\x8dR!dL\x14" +"$\xfb\x87\x2\x17\r\xe9w\xbb\xac\xc1\xb1\x6\xe4,Ors\x18\xeO\x17\x1f\x82\x7f\x8a\xc8" +"z\xc0\xdf\x39\xe2\x32\x16\xf9\x92\\\xa1\xa2\xed\x43/\xfc \xb7\xc7n:>y\x80\x9b\x0" +"\xed\x30\x6/5W\xd0Pb\x10\xc4\xd9{\xc3\xd1\xf1\xc9:n-\xc3\x3\xf0\xe5\xea\xdb\xbc\xb3" +"1\xe5zT\xcc\x87Q\xe2\xde\xcV\x4p\xa0 \xdd\x9e\xb8\x36\xe8\x9^\x1e\x4\xad\x36\xc\xd0" +"\xf9\xdb\x94sp\x1f\xb1\x94\xb5]\xa0\x15\xbf\xb8\xed\xae\xf2!Y\xda\xc7\xb2w\x16}\xe5" +"\\\n\xc8\x8fw\xb6\xf5}\x84\x8d\xab\x7f\xf9,\x16\xe1W=M\xc2\xfc\xa7\xaeLx\xb5\x9\x97" +"\xe5\x1d\xf5\x96\xdc\xff\xf1\xe9\xc9\x91\xb9\xc8\xda\xa7+6h\xca\r\x34\xc2\x39\xc4" +"\xfe\xe9\xc0\x80\xfe/\xb1\x8aQ\x80\x44\x80\x18I\x92\xa1\x17\x83\xf\xaa\x89\xc4J\xfd" +"r\xb2\x39\xea\xb5\xb1\x1b\xc7\x88\x32\x0\xe9\xa3\x46\x66 \xb\x11\xa8\x8e\xa8v\x9d" +"N\x95\xedG\x3\x82\xb4\x17\xaf\x88\x41\x9e)x=\x89\xd5n\x9d\x81N\x1a\x13\x95\xd3\xdc" +"\xc3\x98\x41\xec&\x0\x9f\xe9\x2\x86\xc8\xd4\x82\x34\xf5\x8a{\x8f\xa8\xdf\xe9\x39" +"\xd3`\xb3\x93\xdc\x88\x92j\xb1\x16\xc6\xa9\x2\x8\xe7If\x3]\x81\xdc\xc2&Ups\xf2\x84" +"h\x7f\xce\x8U\xf2Xw\xe1\xe\x44wq\xe2\xcb\x8drk2[\x1a\xfbr\x82'=\xabOd\x82\xf8\xd5" +"]\xf9\xc3\\\xdfi\xef\x9b\xe5\x65*`\xcd\xe\xbf\xe0\xc8\xf5\x1e\x9c\xc9>\xdb \xd0\xf" +"\xa7\xa4\"\x7f\xb0\x64\xed\xc2\xb6\xbf\xa6\x8\xb8\xea\xc4\xfdhn-Z[F}\xfa\xb9K\x1e" +"Cs<\xadhF\xd6\x87\xd1\x7\x7f\x82\xb3\x81N\n\xa4\xfy4\xeb\x65n\x87\xe0\x36\xb7\x66" +"i@$\xab\xf1\x19lu\x8c\xeeI\xa7T\x83\x85\xe8\x30\x65v$\xf2\xc5\x35\x44\xc7Gh\xca\xbc" +"w\xcc\xf0\xa3g\x9e\xf7\x1dK|\xb3\x1f\x82H\x84\xa1U\xb0\x10\xa9\xee\xd4I$\xf1\x43" +"Qu\xc9(\xce\x3\xe9G\xad/\xe3\xd8\xb7&;\xc3\xb9\xda' `G\x98\xc9'\xd2\xc4\x89\r\xae" +"\xfb<\x4\xdf\xc6\x64\xf7\x87\x8d\x3(\xd6%\xf0\x9a\xca\xc5m\x1b\x35\xb3)a\xba\xeM" +"\xcf:\xf5\xda\xe6\x46\x1c\xf1\xe7\x44~\ry6\xbf\xf\x32\xfe\x9c'\xaf\x9b\x14-\x15n" +"\xc0\xb8\xf4\x81\xb7\x80l\xca\xf3\xd8p\xbc\x37\xce\x15\xb4\xb9|\xc8&\xd5\xce\x9c" +"\xa8\xc\x44\no\xdc\x9d\x19\xe8\x9e\xd2\xe4[\x8b\x93<\xb8$\xff\xf2T\x18\xd6r\xf3\xa0" +"\x5\x8a\xf5\xcf\x98\xa3$C\x5\x5\xfc\xbb\x36\x84\xe6\xc0\xe1\x12?\x1awf0C\x8f\xb9" +"P\xc6\xbf`\x1e/O \x89{\xd6\xb9\xc\x36\x61l\x93\xbfv:\x8b\x4[\xd0_:)\xe1\xef\x1f\x82" +"\x88\r\x93>\x87\x36L\xf0N\xd3,\x19\x31J\xc6sk\xb2\x89\xb1g\x6U[\xbaS\x98\xcbx\x7" +"z\x9eK\r\x12\x45\xfd~\xfXl\xbf-\xfa\x33\x10\x13\xe7\x7\xcf$\xf4\xddUw\xfa\x44\x16" +"\x7f\xb3Q\xcf\x9b_nS\x8\x8eS\xc7\x2\x4=P\xd4\x83{'\x7K\x9b\xac\xd4\x5\xc9\x31\x91" +"\x4\xc7}\xba\xc6\xaa\xcf\x8\xe\xc4\x91\xbe\xff\xc0\x65\x99\xde\\p\xc7l\x15\xef\xe3" +"\xd3.[|@5p\xba\x41\xd2m\xbf\x9a\x1e\xd0\xa4\x85\xa8-\xdf|\xd6\x9\x36s\x1f\xb1\xc1" +"\xec\xc6\x34\x92\x96+h_\xe8\xb2}\n\x15\x8\x99]\xf%\x66\x14\xa9+\xb0\xac'+\x19\x17" +"\x80\xe6\xe6\x1c\xf3\xde\xbc\xac\x32\x61M\xff\xc0\xf1\x30\xfe\xfa\xce\xd5\xaf\xb5" +"\x1e\x84\x44\x97l5\xd7\"\xe4\xfd\x1ap\xb7;q/\xc4ur~\xb1[\x1a\x1bk\xa9$\x80\xfa\x11" +"\x12r\xa1\xd1\xd6\xa3\xb1\xd6\xb6ZJ\x90X\xef\x33\xab*\xce\xe7\x96\x13\xdd\x66\xea" +"5\x9b\xdb\x6\x86\xb\xb1\xd3\xa2]\xb1\xe7\xd8\x8aR\x8g\xef\x1ap\x88\xf7j!\xa3\x11" +"pD&\xf4\xb0\x38~2\x80&\xc9\x15\xcb\xf1x\xd2\xdf\xb1\x12\xbcl,\x1f\x38G\xc7$\x3\x94" +"\xf3\xcf_\xde\x89\n\xc6\x2\x4\x8a\xe9\xa3t\xe4\xa6\x2Gk^\x15\xbb\xfeWJ_\x90\x9\x0" +"\xbu,\xfa\xd5\xd2\x89k\x19\xaa\xddo\xc7<|^\x1e=\xe4\x95\x11N_~\x9b\xd6\x36\xe\xf8" +"\xffq\xd3;r\xc8>\xe\x18\xa2\xc5\xab\x1c{\x89\xfd\xd8\x12\xb2\xd4\x39\x95\xe5\xef" +"\x14\x8cq\xbdY\xcb\x86\x1\xeb\xae\xbci\xe4\xc7PMP\x9b\xc1\x87\x8fq\xfav\x5\xb5\x39" +"NZ\xf\xbf\x93\xda\xf6T\x1ao<\xc3\xdbG*.M\x82Y\xad\x8e\x8f\xaf%\xdb;mg\x96S\xa7\xd1" +"d\x1c\x11\xc0\x34w_`\xda\xcf`\xe0\xce\xf0\xb2\xb6\xe1*\xaa\xc5\xb1\x1f\xce\x42\xe8" +"\xdb\n\xda\x33\xa4\x63\xd0:\xb3\x36SL\xe2L/\x89\x8c\xf8)\xc\x32[\xbc\xbduC\xbf\xf4" +"~\x95\x9a\xfXh\x90\xd6\x6m\xbe\x99\x8b\xf7\xea\x84L\xf0\xdc$\xc\x88\x93HC\xff\xaf" +"a,\xb8\xa2\xca\xce\xa4\xaa\x32O\xa2}\xb2\x7\x8d\xfc\xc4\x37\xdd\xee\x39\xa7\x0\x39" +"J\xe0H\xfb-\xcf\x9b_\xc2\x1e\x89\x14\x64j\x7\x88\x99\x6\x63\xd7\xd8\x8bJ\xa2\xbc" +"\xe8\x86[\x8b\x18\x37\xac\x30T\x93*'\xcdT?\xe3/\xfds\x92\xf3\xd9<\x14\xf5\xb5\x9e" +" \x6Z\xeaq\x8c\x87}\x84\x46\x34\xc\x85\xb2\x9a\x32_\x9eh\xd8\xe8@?\xaf\x80\x38\xc0" +"}\xfa\xc5\x4\xb6\xc0\x99\xe4\xd8k5\x80\xe5\x18\"\x19\xcfsp\x88\x18" +"{\x15<;e.\xda\xdf\x37k<\xb8V\xd8\x9b\x45W\xc7\x19,n\xaf\x8c\x8f\xc>;\xe8\x43\n\xc9" +"~\xf2\xd1\x8a\x15Z\xe8>H)\x15\x61(i\x17\x3\xdc~\x8bS9\x90\xc7\x81\x8G+i\x9f\xe8\xff" +"\xd2\xdc#\xf\xcb\xe2\xe0\xaf'\x84|B\x94\x89\xb1\xd7\x1j[\xa0\x87\xbe\xef^M\xa1\xda" +"\x18\xcd\xf0\xc4\x18\x33*\xbak\x7f\xd5\xb0\x13\xf3\xd5\"\xe4\x8d\r\x8a\x63m3P&\x87" +"Y\xc6\xbe\xfa\xfd\xe5\x8ci[\xb2>\xcfN\xf8\x96\xd2\xba\xbe|\xbc\xb8\xe5\xf8\x93\xec" +"sY\xac@\xc6(\\\x16\xfa\x32\x31tE\xb8\xb1r\xf7\xdbY\xf0\xbd\xf0\x16\xd8\x4\xac+\x7" +"\x93M\xb8\xf9$\x8a\xdc\xc0\xb\xcb\xbdo\xcbh\xb2\x94\xc2\x94\xcb\xad_,@8\xe3\xb5\xfc" +"\xe8\xfc\xae\xe5\x9f\xea\x64LM\xbd\x96\x89\x4Kq\xf7\x84\x2\x0\xa9\x89\xc6\xe8\\\xee" +"\xa5\x61]\x6\x11Q\xf8\xc0s\xbeN\xb8\xb1\xc3\xee\xdbK`\xaf\x66\xa1)\xeb)\x19\xd9\x45" +"\xa2KS\xe5:E\n{\xf3i\x0\xfc\x90\x1a\x64$\x86\xa4\xfe\x41\xb7\xd7I\xe2\x0\xdb\x17" +"2\x1\x14M\x1d\xc3\x6\xb9v\x9\x33Y\xd7\xa8Z\xb3=\xc7\x98\xe1\x8d'k&\xad\x95\x84.\xb5" +"V\x12?hV\".\x6\xe\xafL\rV\x90\x41\x41&<\xfe\x37K\xbc\x15\xb4\xaf\xf8$\x9d\x35\x83" +"\x1b \xb3\xb0\x32\x86%\xc\xa1VB\x17\x1cK\xe9\xcb\x8ap\x88yP\x19\x9f\xa8\x43\x86X" +"\xd3\xb4(\r\"\xa2\xe5\x38\xfc\x8c,\xd0L\x97\xc1\x65m\xa4.\x9e\x86\xf1\x8d\x1c\xc0" +"0N\xef\xca\x7f?I\xcaP8\xb6\x1e\x38\x94\xd3\xb9\xfb\x81\x31\x4\x7f\x61\xbfz\xd6\xa6" +"H#\xe\x95KJm\xa6\x61~\xaawv\xdd\xf0\xc1P\xe7\r\x1e\xd9{ZZ\xbb\x87\xfa\xf3Wx\xbc\x95" +"\xa8\xec\xac\x9a\x9bSS,\xbc\xde\xb3\x44\x36\xeM\xa5\x61\x84\xbe\x96wC\xe6\xa4)\xc1" +" \x4<\xf2&\xe2\x13r\xfe\x9a\xf0\xe6}\x96\x41\x85\xb8T\x1y\\\x98q\x1c\xf7\xba\x65" +"1\xdak:\xf0(\xfc\xda\xc0\x1b\xa2V\xdes\xfc\x1b\xc7\x45jm\xe5}9P\xfam\xce\xe4\xcc" +"\xc9\xa7\xdb\xc3\x9a\x65\x7\x1bu\"\xac\x91\x7$r\xe2\x8b\xb2\x99\xa1\xa4(\x85)F\x8b" +"\x1bv\x1dI\xb4\x8\xd8`JN7\xaf\xdf\xb3\xf2\xabY\xe3m\xe3\xd9\xed\xe4\x30X\xc2\x98" +"\x17K\xb0\x1\xb1\x80\xec\x0\xcd\x80\xa5\xddK\xc1\xe8\x1c>\x87\x9a\x66[\xb.\x3\xfe" +",c\xb1p\x8bx\xf6\xab\xefO\xbf\xa2\xd8\xc1\x6-3K\xe5\x65\xc1\xf3\x42<,\xea\xe0\x19" +"\x82\xbaQze\xd8]}\xd1jG\xc3\x65\xc7SY)8\xe5\x7S5\x1dQ\x0y\x9f\x7\xfbgN\xe3}\x1b~" +"\xc\xe3\x38\xde\xf6\x91\xde\x8\xa0\xeX\xee\x8d\x8aoY\xbe\x38\x3Wp\x1c\xcf\xb9\xaa" +"{\x9f\xeNl\xed\xb1\x95\xeU\xbd\xf8\xd5>X\xdar\xe0\xf1g\x9c\x9\x8e\x99\x9cX\xa2\xb" +"\xee\x86\xae\x90\xb0\xe9\x38\xbf\xd6X\x95Z>\xe7\x9b\xb8\x30\xa2\xf6\x9a\xad\xe4\xb1" +"\"\x11o)\x12\xbb\xc\x7f\x87\xcd?\xb4\x8b\xe5\x16s&\xe1\xad\xda\x90gN\xcc{\xd3\x9d" +"&\xd0Q\x82\x4\xc9>\xcf\x93\x11\x44\xc6\xe4Hi\x13Q\x13\x66\xe7\x64\xf4\x36>\xfa\xb9" +"R\xbd\x6\x97\xbay/m`\xdd;\xa0\x90yf!~\xc9\x9\x8a}\xd2\xcb`]i88\xcf\x92?\x1b\x38I" +"\xe1\x95\x9e\xbf\x3\xdc\xa7\xbL:\x11\xb0\xb7\xd7\x19\x35\xef#\xb9\xe5\xc8\x94\xce" +"U\xeb\xc7\xa9\x10\xf2\xe1\xf2\xe4\x1e\xb2\xbf\xa6O\xb0\xaf\xc4\xc0\x2\xc6\xaa\x45" +"\xc1\x3\xf\xfb\xe9\x8d\xef\xad\xfep\x9eZ[XS\xaa{\x9b\x13\x8d+Qq\xf2u\xdb\xcfV\x9c" +"@&\xe\xf2\xbe\xdd\x64\xea]]d\xcaN\xf9[l\xf1\x8a\xb\x63\x95\x91\xc8\x83\x44\xd1\xc8" +"/\xb0\xaf\xc3\x8f\xd9\x33\xda\x90\xd3\x83\xfe\xe2\xcb\xe9V``\xe2\xd6\xa9\x97\x65" +"\xb1-\xb3\x82\\\xb0\x9i\x2\x9d\xdb=s\x96\x84\xdc\x1e\xa9\x9b:\xc7i(\xe3)\xe8\x1f" +"+\x1f@\xfc\xdf\xe9k\x84\x1c\xfdx\xdf\xddx\xaa\x19\xff#\xf8\xa4\x98N\\l\x85\x88\xf2" +"\xe0\xcb\x38\x63\x9d\xa2L\x19\x96\xd9M#\xca\xcc\xd6\x12s\xb1\xeX\xa4\xe2\xb\xab\xe1" +"\x0\xe\xf0\xac\xb2\x9fH\x1e\x7\xe9\xe5\x80\x7f\x8b$|\xb5\x91\x85T'\xf1\x90\xd1W\xae" +"Q\xcb\xe2n,\xe0\xed\x85\x36[7k\xb/\x93\xfa\xb2\xddI\xa3\xa7\x1\xd5VWw=H\xae\xbe\xd5" +"\xf3\x96t\x92\x18\x9e\x16'\xdc&\xc1GaN\xb0JK\xe2\x85\x82\x2%\xdb&\xbe\xe5\xefm\x1e" +"\xdd\xe9\x1a\x11\x85\x11r\xd9ke\x7fP\x96\xb9,\xa9>'}\n\x91\xea\x35\x8d\x8f\x8b\x80" +"\xcb\xe1\xf4.s\x9b\x64\x85\xed\x81\x61\xc4;>^\x10\x64\"\x89\xeO\xb5M\x91\xf9\xfc" +"\x4\x34\xc7\xf5\xce\x87\xf6%\xb7\xfc\x33\x9f\x8a\x10\xde\xd6\xee\x1e\xc5nU\xde\xaf" +"6\xb6u\x11Y\x8e\xc6\xc5\x37\xc5\xf\\T\x6\x14\xdd\x88!'=I\x1f\x1\xa2\x3\xc3\xb0\xe" +"2&\"\x92\xa9\x1c\r)\x9\x35\x9b\xec\x38\xd1\x33\x95\x92\x90\xa9\x38\xd9G\x81\x33Y" +"\xee\x36$\x9fy\xbf^\xc3\xabI\xb4\xbl\x17h\xa9\xb\x11\xfnN\x14\x1e\xeb\x1d\x14\xdc" +"\x4o\x8b\xc\xa3\xe\xd5\xec\xccSz\x85\xbb?\x6\x37\xa7\x43\xc3\x34\xf9V\xf7\x35H\xc3" +"\xa3yS\xfd\x88\xf9x\xe4\xc9<0}\xdcLg\xaeIx\xa4\xc0g\xa1\xc1\x7\xeck\nT\xce\x3*vN" +"\xc5\x1c\xb2\x93\x8c\xc8\x37\xab\xc\xcc\xe2\xe\xab\xa3\x1e/\xcb\xafjw?\xf6\x1a\x34" +"\x80\x1d\x4\xf1$/\xf3!\x88\xb6]:=\x9a\xa6y\xd9\xce{L2\x9a}\xf5P\xaa\xb5MG\xe2\xa9" +"/FL\xe4\xc6\xb7p\xe4 \x16\x30\x3\xb6\x80\x85W>C:L\xb8\xc6\x6\x11\xf3\xac\xfeGu\x9b" +"A<\xd6\x8c=\xc9\x18\x90\xc8 w\x1f.\x8a\xcf\xd0\x9a*O,\xb0Lt\xb2\x90]\xch\xe0)u\xf" +"\xbe\"\xd4\xed\x7\x97\x33`Mj\x7fY\x4\xd2\x30\x14\xf8\x18H\x8b\xfd\xb\xd5\x8c<6fa" +"\xa0\x8c\x80\xa4\x8aO\xff\xd9L\x16\xf4M((\x17[\xf3\x83=g\xd0\x9f\xc4P\xa1\xc7^-\x8f" +"\x9\xd9\xc0\xc1{\xab>\xb1\x8\x94^7\xbdW\x14\xc7\x9a\xd2\xa5\xc2+\x98\x45\xf2\x93" +"\\H\xd8\xbf\x88\xb1\xb8X\xf7x)\x16\x5\xdc/RR\r1;\x9d*\xea\x1!\xbf%)\x88\x1e\x86\x94" +"bnB\xb1\x37Q0\xe9\xe4\xa5\x6\x9f)I\xee\x8e\x9f\x65&G\xae\xd0I\x82~\x16\xdf\xf7\xcd" +"\xba\xac\xe4\xa2>\xc4\xda\xd3L\xce=\n_8@\xb0\xe9\xad\xee\x8a\xd6oa\xa9\xc\xef\xb3" +"\ry\x17wzd\x89\x62\x19\x93\xa5h\x99.\xe5\x9fI\x12\xf0\xc1\xc1\x18_\xdf\x9b?}\xc8" +"\"\x86\x1f\x85\x38\x33\xc6\xad\x7f\xdb\n\xb9\xdd/\xfe\xf8\xc6\xb3s\xe1t\xcb\xfa\x42" +"\xbe\x0sB\x2\x9cK\x3\xf5\xbd\xfa}\xcc\xdb\x1\xb0\xb6`}db\xb8\xfb\x86\x84\x83\xec" +"\xc2\xae\xee\xa3\x41;6\xc3\x3\xc6\x85S\xc9\x1c\xe8\x9b\x10\x7\xff\x65_9\x7J=\x8j" +"%m\xde\x8b\x98\xfd\x1c\xaf\xc0\x98\xc5\r\xbf\x92\xc\xcf\x3\x95\xcc>\x1f\x34\xbe\x9b" +"\xd4|\x14\x94\xfc\r'\xb1,6A\x9\x6:\xde\xe0\xfa\x61v;\xce!\xc9}\xaf\xfd\x32\xa0 \x9a" +"a\x87\xdaIg7\xf0\xee\x10\xd1W\xb1WO_|\xe7\xf5\xe4\xd9+\x1b\x8a\x14\xbf\x1a\xeb\xd0" +"\xce\x99\xf1^\xfe\\\\_\x7\x37\xe6\xd6\xc8\x45\xb5\x1f\x9b(2p\x7fn" +"\xb9\x11\xb9\xcf\xc5\xfe\x2\xd6\x8d\x8e\xcb\xe3!\x95\xbd\xf2\x83\x6\xc8\xfb\xf0{" +"\x83\x33r\xaa\xec#\xf9\x82\xc0\xc6\xc1\x8f\x64\xcPN\x7g\xe\x99\xb9\xba\x41\xbf`x" +"\x2\x85\xb2i\r\x1$\xfd\xe6\x65\xd9\xe7\xdf\xb8\xf4\xc2S'\x8f\x8\xf8p\xa3\xe6\x9f" +"\xc9\xbb\xd2\xbd:}\xc8<\x10\xc8\x64\x93:\xe7\xaf,\xc8\xb3Vg\xf1\xc3\xab\xd6\x8c\x39" +"qT}k\xd7u\xc7k\x86\x10\x82\"\x17\xe3R\xafy\xe2OsZ^]\xf6\xf7U/\x82\xa6\xc3\xcf*\xe1" +"B\xcf\xe7\x96o\xce\x9f\x7f\xf3\x9b\x66\x3I |\xc8\xb\xab\xb9@\xfbLrF\xe6\xad[\x91" +"\x13\x0\xe6\x89\x1d\xce\xaf\x93V\xdd\x99\xf6\x33QR8\x1\xc1\xc6\xcb\xd8\x15\xb9VU" +"\xfc\x1d\x44r\x11\x95\x64\x61?\x8ak\x14\xc0\xd2^\x11\x13\xb0\x7f\xeb\x9cy\xbe$\xcb" +"\x2\x18\x2\x64\xc6\xf2\xf1\x93\x30\x0\xd2\xb2@\xea\xae\xee\x32\x1f\xe1\xf7\xaak\xbe" +"\xc6\xef\xb4\xd9\xd4\xa0N\x8e\xc4\x99\xf4\x36\xc2\x99\x9c\xc5\x8f\xb8\x8f\x9d\n\x97" +"lN\x9\x38\xd7\x84g\xcf\x97\xad\xfb\x9d\x97\xc6\x1&\xec\xf8\xe5\xe7%\x84\xcd\x91\xd7" +"S\x9c\xabKFO\xd8\x90\xb8\xf6\xe4\xa8\xe4\xf7\\,O#:\xb7\xdd.\xca\x8d\xf6g\xe2\xf4" +"\xe1\n\x95\xce\x38\x63\xa4>\xd0\xb7!|\xd0\x35\x0\xeb\xbc\x11\x8e\x8\xc4\x93\xe6\x63" +"\xd8\x80\xab\x19\xea\x8x\xe3\xf4%\x34\xa7\x33X\xae\xe5\xc2\x19\x1b\\Z%\x15\x63\xc2" +"t%\xab\no\x90\xa9\xfc\x98\xc4l\x92\xab\xfbW\x8\x1f\x87\xaa\x9c\xb0\x36\xbb\x89\xdd" +"\xe\xe2H\x17\x88\xe6\xf\x3}t6\xb1'\xc6\xd0;uSW\xfd\xc5\xb5\n\xe\x37\x99\x86'r\xb2" +"A\xd6\xb2\x99\xba,\xde\x64\r\xb5[\x11\xdb\x99\x1b\xbf\xea\xd8\x7\xf\x37\xe7\xd7\x1d" +"\xbb\xe8\xb2\xe1l\xcc^\xfd\x87\x0\x82mBj_\x8b\xbb\x1b\x37\x1b\xe6\xde\xdf\x61s\xbe" +"\xf6\xd3|D\xe6\xa9\x65\xb9\n\x65\xa8S1.\x8f\x4r\xb1\xb1\xd8\xa4\xcv\x9a\x35\xed#" +"\xe5\xbfq\x15\x9e\xa0\x1f\x6&Xh1\xf3's=r\xbby\xe\xca\x15\x8c\x97\x37\xd9\x9\xda\xe6" +"\xad\xc7\x8f\"\xf0\xd2\xfe\xcbv\xe\x11\x8b\xb8S\xe5Y\xe7\xea&\x1f\x1b\xe3\x8e\x4" +"\x83{\xf7\xb6=\xc2\xeaQ\xb1j\xe6\x91\xe9\xdb\x45\x81pc\x8\xb1l'\xb4X\xbe]\xee\xaf" +"}\xdd\xd1\x9a\xe0\xc2(\xd7\x7f\x1d\xc3\xb7\x84\xa0\xf6\x96\x96\xa6hN\x9ew\x9]\x8e" +"m\xa7-\xa8\x66\x88)\x10n[T\xa6\xbd\x12\xc0k\xc\xd2\x4Y\xb1\x10\xd7So\xfeV\xad\xed" +"\x1f\x44\xec\x98'q]\x8d\xc2\xed\x1a\x96\x6\xe9\x39\x17\xa9\xb7N\xe4V{_N\xd8\xb4\xe4" +"6\xb1h\x85\x8f\x93\x93\xaf\x9a\xa5\xe6\r\x80\xefjz\xad\x11X\x9cW\x83\x16\xe1\xef" +"\x8d\xdeU\n?|\x82\xd0\x8c\rV\"\xcd\xee\xc6\xe1J\x92l\xe2u\xc9U\\\x9c{\x90`\x3\x8a" +"\xe6\x33\xe;\xd3\xc4lR\xed/\x1d\xd3\x8aW\xab\n\xd8\xaa\xaf\xa7\xdf\x11^\xa0\\\xc3" +"\xad\xe5\xb3\xa1\xf3#\xda\x0\xac\x18\x43\x99\xbb\xad\xa9\xa3\x42\xee\x3 \x7f\xc3" +"\x95K\xf0\xb3\xb7\xaa\x65\xf\xd7\xef\x8a\xcc\xfa\x8b\x64\x18s\x9d\x88\x31w.\xa2x" +"\x1\x14\x61\xef=\xb7\x18]\xe3\xbc\xee\x86\x43\xf4\x32S\xaf\xac#\n\xeci\xad\x8c\xe6" +"\xd0\x30\x8a-\x7L\xfc\x8c\x8bI\xc4\xf4\x43\xca\xbc\x85t\xd7\xfbY\xb1\x8d\x8c+\xb3" +"\x2;\x3\x9f\x9c\x32Y\xb8\xfc\xef\x31^\xc0W\xcct\x1d\xc5\x8d\xf4\xb1{\xc\x8b>\x3{" +"P\x91 \x87K\x1a\xa9\xdfIw\x18\xf3\x7fJ\x8e\xd3\x80\x10\xba\xd6?p\x85\xfa?]&8Z\"0" +"\xb4g6\x92\xa3\x8\x89\x2Gn\xbb*\x14\xb8\x66\xcd\xe\xfb\xcd\xfa\x62\xcf\x93\x89-\xfc" +"\xad-%\xbe\xe5>\xde\xff\x65]\xc5\x3\xeb\x8f\xbb\x12\x84\xb0`r\xda\xec(p\x3\x8c\xcd" +"\xcf\\\x90\x8c\xcaQk\x85\x19&\xf7\x36\xd1jd\xc3\x2\x0\x94\xdc\x1dw\x8e\xf8\xa2\xb0" +"\xdb\x44\xd3\x8eK\xb\x64\x96\xd7\x97S\xa8\xe0\x62\xda\x37\x11\xa8\xd3\xbc\x8eZ A" +"R\xd5\x64\xbe\xdb\x1'1\x97\x8f\xf9\xf1\x9b\xdb\x6\xc7>bM\x95O\x8b\xf0\x83\xf9\x11" +"\xbc\x10\x8c\xd5\x44P\xdb\xd1\xa9\xd8\x86\x9fq\x15\xcc\xff@\xee\x15R\xff\x7\xc9\x66" +"\xb6\x1b\x1\x18\x97\x11\x36\xf8\"\xd1\xf5k\x19_\xc4*\\\xa7\x62\xf4\xb8^\x13)\xf4" +"\x98o\xbd\x7f\xe6\x83\xb\x88\xd9\x1a\xea\xb3\x93\r|FF\xac\x8b@\\\xf:1#\x13\xc9.>" +"RAJ\x9b\xe1\x9\x94\x8a\xe5\\Yk\x13\xb7\xafG\xbf\x4\xce.u^\x9a\xd7-\x91\xfd\xe2R\xd1" +"@\x86*\x8d\x30\nw\x3\xde\x8c\x41\x64\xbc\x63VT\xab%\xcfW\xf3\x35\xa4\xe6\"\xd1\x7f" +"e\x1eI)\xcbN7#\x7\r\xac\x39\x94;\xef\\\x9c~4z1\xd4.\x17\xcc\xac\x9\x81\xad\xb5y\xd3" +"\x14\x7f'\xcc\xda\xa2\x99 \x1d\x95\x14&\x18\xcb\xb1l\x95>W\xc6u\xbd\xd0\x84q%\x3" +"\xb2#\xd4\xd6\"\xd6\x19~\xd1-Q\xb0\x34*\x97\x16\x46:\xc5Me\xc3\xd5\x1d\xf6-f\xad" +"\xfa\xc2\x7n<\xda,\xa9\xb9\r\x85un\xbb\x96\xb5\x2\x86\x92\xdc\xf7\xab\xa1\x9e\xa2" +"\xab\xb1<\xe2\xf9\xb4\xde\xb4\x1a!\xbe\xe5Q-ps$\xcb\xb\x38ZA\xb3\x37\x62\x98\x16" +"X\x8b\xf6\xac\xc8;\xa2\xbe{@\xbdSa\xb1)h\x81\x46\x61\x15^\xa9\x94\r\xb6\xb4\xc5\x88" +"x\x9c\xca\xb3T\xe3\xe4\xe4t\x6\x42\xf7\xa5.0<\x9d)0\xe2\xc6w H\xbc\\\x8gAq9\xc1" +"!\xa0H\x8b)\x8e\xc1*\xe2T\xdf\xcb+\xc1\xbf\xac\xee\x43h\xb6\x1bi,\xd6\xd6\x65]\x97" +"\xaf\r\xb4X\xff\xbd\xa7\x7\x3Y\"R\xc3\xbf\xc\x6\xc\x85\xcf}\xbd\x41\x10\x7f\xf0\xef" +"r5\x90v\x94n\x8\xf6\x6\x42TQ\xef\xe8\x2\xb6\xd1\xf7GL\xc8\x3<\x8f\xeb\xec\x80M\x15" +"\xc0\xfe\xf5\xbb\xe<\x2\xfb\xa9\xf3\xcS\xeb\xfe\xb5\x95\x4\xb9\x9bH\x2\x8eK~\xe8" +"\xec+\xad#&\xf2\x83\xc0t\xe9_\xfc`\xfd{\x8fLB\xf8\x8b,\xb0\xd4{xpK[\x87\x44\n\x97" +"\x8c\xffx\x19\xf6?\x97t\x2\x63zV\xee\x85\xe1\xfe\xeb\x62\xedmj\x9cK\xd4\xab\x34\x94" +"h\xd1\xc8:Su\xd9-d\x1c]%j~\xb1\x11TdD\xc0Q\xa4q\xf2\xb8\xc7:\xe9\xd2Yl\x99\x45\x90" +"\x7f\x6q\xb0\x95\xe6$\xcb\\\xc6\xc6\x1c*\x97\x19\x92\xf3+o\xcc\x6]\x9c\x37\x41\xfc" +"\x17\x91\x86<\x1e\xce\x9f\x14\x35\x2w\xd1w\x85Q\x7\xeb\x99\xdb\xcb\xe0\xef}o\xf0" +"\x0U\x85l\xd7\x8e\xc7\x6\xb\xc4\x1f\xfdv\xb6U\x6\xea\xacRu\x80z\x81\"\x12_\x18\xa3" +"\x3_;I:\xff|@\xfc\xe0TC\xc3\x18\xef)L\xcf\xbf\x1b\xb7\x7f\x43\xc5\xb7,\x14\x43u\xa2" +"\x80\x9c\xc5\xed\x83\x3\xa5\x81xH\xbc\xb8\xf7h\xfe\xc3pe)Q\xf2\xa3+\xf9{@\xd6~}\xea" +"\xac\x1a\xe5\xf0\xc5:\x0\xeb\x19M\xdd\xd5\x9b\xcb\xbf\xe6\xad\x9d\xb8?\xae\xe2\x36" +"\x99\x62\x92\x87\xb0\x1a%\x98\x99rIeft\xd2\r/\x8e\x66\x10-\x9e\xea\xd5\x37q\xf7\x80" +"\x15P\xa2\xc0\x31\xb0\xc8\xc3H/]\xff\x99\xbc\x5\x85{\xb4\xd7*\x98\xc7-j\x85\xdf;" +"g%\xe3+\xc6\x89\x64\xd7\x9\xc2\x6\xfe\xa7\x7f\x45\x11\"gP\xc8Q\x8b\xff\x9e\xf\xb0" +"9\x18\x80\xb3\x86\x97\xcf\xb1\xa6\x80-\x2\xec\x85u\xf7\xec\xf0u\xae\xf5\xe9\xc2>" +"Rf\xd5\xd4\xd9\xb3U\xa8\xb1\x84&\x2\x98Y\x9e\xa6M\xf6V\xc5$\xe1\\~]\xd0\x88\xa2^" +"\xf7\x85\x1b\xd4\x34M\x19\x1fX\xb9\x19x\xd8V[\x16\\),\n\xfc\x7f\x9e\xae\xe2~\xa7" +"\xcd\xa3\x9f\x9a:f\xaf?\xfb\x82\x30;\xd9=-\xbc\xb0n\x1d\x46U;\xd1\xd0i\xe7!\x4\xc7" +"\x9e|\x2\xb4\x33!B\xed\xd8[\x7fN\x93\xc\xa3\xe7\x6G\xaf/\xcaPt\xb1\xee\xec\xfd^F" +"\xc4\x96\xf3\xc0\r\xdd\x38\xed\xe9\x19\x8a/M\x8+q\x1eq&8p\x1b\x96{U\xfb\xe7o\xca" +"\xe3olk\xca\x44\xc3\xf7\xa7&D\x87\xc0-\xd2w\xb7\x99H\x9c\xbe'\xa4z\xb0\x35\x63\x42" +"\xe4Ht&\x99\x1br5=&]\xbfo[\x4RpZ\xb1\x99\xcdt\xe1\xc0\x17\xe3\x36P\xe2O\xa5\xdd\xf" +"\x7f\xc0\x32\xa8q\x19\xfb\xc8\xd0\xd3g+\xb6\xedM.V\x94\xb7Hn\x1\xf0\xf2-\x8b\xd8" +"\xbc\xaa\x84\x83\xe7\xfar+\xe\x42\xb0\xc3\r\xed\x8e\x9\xb0\x91\xa3\xdc;dt\x1fJ\xc7" +"\x7f\xbe\x34\xea\x38t\xc4\x87\xfa\x1c\x4\r\xc2\xe\x84\x66\xac%\xd3\x86,|\xdb\xcd" +"qW\x1c&\xe\xbe\xea\xcc\xde\x2\x92\xc0\x1a\xea\xedu\xe4x\x16\xe5\x9b\xe6\x31\x9b\xf3" +"\xd8^$%v!`6\xc\xd7\xd3\x89\x81\xe3+Q\xb7\xa3NK\x86\x9erv\xa5\xcb\xc3\xc9\xe6\\zN" +"\xfd'f(\xf3\xe2\xc6\x7\x0O\xcd\xa7\x98\x61y\xa9\x35\x38\x9b\x46\xc\x87\xb\xec\x64" +"\x84\xeb\xe1]\x17\xefqJ(U\x92\x97(\x94\x9c\xf4\xa3\xe3\x94\xcf\x8a\x1c\x44\x80H\xcc" +"\x98\x1dNJ\xde\x84\x9d\xda~c\x83\x88\x61\x9e\xba(x\x95\xb3\x83)\x8b\xd7x8J\xce\x34" +"\x17\x16\xbdlt9\x8\xad\x34g\xbb\xf0\x36\xc8v\x2\xa1\r?e\xdflo\x2\x1bU5;JI\x3\x4\xbd" +"\x0\xcc\xd0\xe7\x9dR\r\xf2\x18\\\x14l;%H\xa3\x85\x8b\xda~\xfc\xcc\xdd\x1\xb7\xf8" +"o\xa1\x88\xd5\xb2\x84\xd2\x8b)\x95\xd0\xdf\x35\xaa%\x9b\xea}\xa1\x92\xd2\x3!D\xd6" +"#t\xcb\x44/%\xa3\xf9\xf4\x10&\xe3\x8\xf9\xb0'\xae\xdd:\xd3\xcc\xf3MJT|,\xee~\xba" +"A\xc2,\xf7\xb9\x18\x89\xc4\xb0\x92\x19\xfa\x30\x12L.\x98\xef`\xb6\x10\xd6\x37Q\xb8" +"\xcd\x89)Y\x13\xa5\xb4\x9>C\xca\x97T?E\xae\xae\xb\x62\x31\x98\x14\x87\x37\xc8\xa6" +"\xae<\x7w\xe5w\xa0\xb6\x3Z<\xe0\x32\x61\x1f\xab\xb2XC\xfc\x1c\x82\xf2]1\xcc\x87\x94" +"\xb7w\xc7\xe4\xf8t2\x87\xa1\x33\x10\x14\xbf\x3&\xfb\xd9\x9d\x8d\xb7^\x2\xc7\x90)" +"\x85\x80\xea\xbd\xe4\n\xda\"\xf8\xb\xe5\xc3t&\xa3k\x14\xe7\x86\xc1\xef\x8f\x37\xde" +"\xa2<\xcb\xf7\x41-\x1ell\x11\x1\x1\x38\x2\xd7'\xa3x\x9e\xda-\x9c\xbd\xf8\x45\xc8" +"P\x93\xf\x82><\xa2\xd4\x87;1\x1\xd1\xb6\xc9@bq\x7U*\xea\xbaG\xb6@\x80\x43h\xe1,\xed" +"pZ\xf2\x46\xec\x33_\x91\x2O\xca\x8-\xbf\x1b\xc7M\xdd]\x93\x65s\xb7rV\xeb\xd9\xea" +"\xb5\x9b\x80v\x8b\x45\x62U\x5\xe8\xcd\x19<\xe9%\xdfNNa\xfd\xcf+\xbe\r\x83)C\xf2\xac" +"\x95\xf5\xbeH\x91\xcdXK\x19\xef\xf=\xf6\x91\x9b\xaf\xa4\xd7\x19\xfa\x13Y\xe2\xce" +"\xb5.&|>\xf3\xe9<\x6\x1bZ\x1e\xb9\xfe\x81#axO\xd7\xf\x33)\xbeyg\xccG\xd2\x34p\x6" +"\xb3\x96\x9f\x80\x9e\x91\xd9\xa7\xb5|\xdd\xe7/\xc9X\xc2\xa5%\xe1@]n\x8f\x0\x7\xf4" +"\x6\x87v\x81\x91\xd2\x1c\xac\xf3 \xffi]\xdc\xe1\xa5`\x4\n\x8f\xd3\x98\x2\"g-\xb0L" +"\x8d\x30\xb6.\x13W6S\xdb\xaa\xc2\x84\xe8\xf6>9\xfe>\xad\x86%\xa8)F\xcd\xfd\x91\x92" +"\xe\xcc+\"F}\xca\x84[\xae\xd9Iu1w\xfe\x98\xa0M_Y\xf3s\xb9\nz\xe7&\xdc\xcdT\xf2\xe6" +"\xb0<\xf1&A\xb5\x80X<\x84k*;%\x8\xf7\x8\x9b\x45\x8f\x64\xd8\x12\xbc\xf1\xc1`a7\xab" +"\x88\xe3Q\xb4\xcfl \x99\x8d\xcal\x1d'\x84\xcd\xc9\xc0\xf7(((\xe9\x31xa8\xd9\xec\xd5" +"Z\xe5\xff\x88\r)#\xbb\xc3\x84\xc1\x39\xcbP\xe7\x90\x9b\x61\x8eK9\xb\x42\xae\x9b\xe" +".f\xa5\xe4\x45?\xe9\x9d.^g\xcfz=\x8f\xc7\x86J}|\xa1;\x18\x65\x11\x1cm\xec`\xca\x36" +"\xc5\x3<\xf0\xad\xc\xa0\xd5\xec\xcd\xb8\xb5_\xec\xd6\x63P\n\x9b\x17\xf6\xd9\x1b\x9b" +"Hw3\x91\xbb\x44\x93L\x15^\xd4\x43ON\x9a\xc7\xb1NRu\xe9\xe5l9hN#\xd7\x8c\xab\x80\xbb" +"/\x10\xcbl\x17\xdd\x62\x9c\x83\xfaT\xd6\xc5\x32\xbcU\x8\x16?\xd6I.3iy\xac\x8a)y\x9c" +"\xde\xfa\xaa\x1e(bo\x1d\xbc\xec\x1b\xc9-77\x80\x8e\xa9\xc0\xa7T\xa6\x10%#V\xfa\x96" +"\xe8?7\xe7\xb7\xbf\x1b\xcf\xb9x\x8f\x34\xe0\xa1\xe8\x8e\x39\x35\x33\xaaKk\x99z\xc9" +"\xd8ofS\xc3\xc7\xfb% \r\x96\xea@-\x9c\x43\xd4haj$\xa2t\xe5\xf0\x1b$\x6\x9b\x88x~" +"I\x99\x93\x38_i\xef\x2\xce\xf1*\xc1\xbc\x36\xf8{\xb0\x1bX\xd0\xec\xbe\xd6\xf0\xce" +"n\xad\xc2\x64.iB\x96\x16\xf2\x1d\"\xe0\x30X\xfc-\xe9u}\xb6\x84\x96\xf3\x8c!*\x84" +"\xe8 \xa8\xf9z\x9c\xbf\xfa\x84\x9e\xcb\x35\\m~_{\x19\xee\x82\xf0\xfytb,\xa1:e\x82" +"\x2\x17\xd7\x4<3\x0\x6#O\x1c\x87\xbaPi\x8aZ\xa7\x19\xdb\x8f\x7f\x97\x8e\x93\x1d~" +"0Oz\xf\xbet\xbQn\xe6\x83\x32,RWu\x89|\xc7i\x7\x0\xed\xcf\x32t~\xa1Jw\xa5\x36**\x8a" +"\xa3\xca\n\xd7\x30vc\xfc\xe9R}\xb0\x8e\x1c\xf1w\xbe\x1f\x6\xae;\x9f\xfc\xb\xaa\xc6" +"\xff\x16\x65\\\xc2\xecQ-!\xd3\xc1\x8b\x43\x93\x1e;\xbb\xd8\x30\xabt\xe3\x61\xbdW" +"B\x86\xb9\xf0o\xf2\x36\xe8\x39\x10\xe8\xba\xae\xft\xa1\x9`V\x14\xfbv-x\xcf\xb5\x12" +"\xf7+)\xb\x16\x34\xd8\x1e\x6\x80{o3\x16\xd1\x86\xe1$\xe8(\x9b\x64\xae_\x1b\x41t\xed" +"\xa1\x96R\xe2lG\xfb\xbd\x1b\xda\xa2\x80LT\xa5\x1ak\xf8\xcb\xf1\x45\x93\x19\xda~\xf8" +"\xde\x45m\xed<-\xc6>\xef\xec\x63\x1d+\x1f&\xcaZ\xb\xfc\x38\x8yRQx\x13\x41\xa9\xff" +"\xaa\xfb\xae\xea<\x10\x62\xec\xf4\xbf\x94\x9e\xe3\xb2\xd6\x89\xce\xf0\xbbr\x18\x11" +"\x1b(u\xfdO_:b\x1\x84\x66\x87)\xf4\x9f\xa8\xd6\x61\xfd\xd4\x1bl\xcc\xaa\x16\xe\xd6" +"Q\xe6\xf6W\x1d\x85?'\xa0)\xa5^\x8f\x7fI\x1d\xf3\r\xc6\xa5\x97\xd7\xafi\x9`\xb2<{" +"a\x88\xcd\xae;\x81\x18\xe2\xd0\x8f\x31ot\xcf\xb9q \xd5l+\x97{W\x16\xbe\xaayDH\xd9" +"N>\xcb\xffN\x6\x34\xf7R\x86h\xdaqe\xc1p\x9dm\xd3.\x95\xb2V\xfb\n\xf1\xe\x1d\x1e\xbe" +"\x11\x1bi\xfc\xd8=r!\xbaR\xff\x65\xd2}\x96\x9f\xb5l\x82\x41\xaf\xe8>\xcb\x11@\x6" +"\xff\xfd\xf0\x9f\xb9\xb9\xe5T\xc9q\xd8\xd4*\xb1\x17\x43\xa6\x9e\xed\xaf\xbw\x12\x5" +"\xa2QP\xadh\\\xb0|\xb5\xc9\x3\x15\xa1\xa7\x8e\xd3\xcc\x95\x63\xb4\xee%\xe3\xdf\x8c" +"\x96\xa9x\x92\x16\x31\x0\x43w\xe8\x1d`>\xc6kD{\xa6\x37n\x18J\xa7Y\xf9\x15\xf7u\x18" +"9DU@\x7fR\x1d\x1d\x46\xc6x\xfd_)KY\x9c\x1a\xc7\x8f\xab\xa7o#\"\x82%\xc1}\x8d\x8f" +"*\xda\xd5_\xa5\xf1\xb5\xf0}\x81\xf3\x61SB\xa3\x94M\xe0=(sRy\xb0)\x6\xd0\x39\x94\x9d" +";\x93\xbb^\r\x2\x46Q\xd4G\xeb\xf1\x9c\xa4\xe6\x1eM\xce\x9d\x89\xf0\xa1Sjj\x9e\xe9" +"\x8d\xd8\n\xb5\xeb\x1ayRd,\xc5\xcaw\x82\xfb\x6\x9a\xa6\x9csKHJ\xdd\xd5\xc3<\xb4w" +"\xf3N\xd5\x8d\xf9\xf6+\xdd\xbd&\xbeT\xc1\xd2\x9\xc1\xca\xef\x6\x62h8\x3\x5\x13\xae" +"I\x18\x17\x10\xe5,\x16\xb4\xf7N6\xec\xac\xc2\x9e\xaa)\x96&\xc0\x87)Cl\xa1\x45\xb0" +"\xa9\x62\xd4)U[\xfd\xaf\x34\x43\xc8\xa3\xfa\x9a\xbb\xd7\xb1\x19.\xa8\x9e],\xe8\xa5" +"=\xde\x16=M\xf1y\xc6\x1e\n-rUT\xa1V\xad\xb\xc7\x5\x4\xbcr\x3^\xbd\x3[1\xc1\xe7t(" +"\x1\x91W8\xa4\x1d\x1d 0Z\x1dP`@\x3=\x1d\xa3\x7\x97\xf8\x33y\xee!\x7\x19\xa4+\xf6" +"\xa3\xe5\x12o\x15\x1bO23\xda\x8e\xcc\xd8\x88\x42#\x94\xdd\xd6\x42\xd7\x62 p\xe1." +"\x15\x16\x35\x9\xfb\x9\xc9\xaf\x92\x98\xcf\xefZL$\x95\x35\x65\x95s\xbc\xc0\xf\x9d" +"\x8b\xdc:\xff\xb\xce\x66K\xabN\xd2w\xdf\x93\xa9\x19\xed\xebZ\x11\x9c<\xb0U{\xeaK" +"G\x83\x1\x83\x15\x92\xc7\x99\x4k\xa5#\x88\x33\n\x99\xb0oI\xd7\x12\xb1\x89z\xb2\x8e" +"\xc9*\xc1\xef@\x80n\x18\x91\x7f_\"\x1z\xad\xb3\xc7\x7fS\x9cu\xe9Uii\xde\x9dM\x7f" +"|\xcd\n\x84\xff\xcd\x8d\x42\xd3\xab\xaa\xb0V\xb\x92\x9fY\xd8\xda\x45\xdd\x7\x11\x9a" +"\xa8\xf6G\xa8\x9a\x44\x62/@_\xea\xa7\xf8y\xfd\xedj\xcc\xef\xddk\xe1\xc6v\xa6y\x2" +"l\xe9\x97\xb6\xf7\xbe\xf0\xc5-)\xf7\xea\xc7`\x1bXe\x1e'\xcc\x30\x31\x8f\xa6K\xbd" +"S\xa3\x37\x41\xeb\xef#_\x97\x1b\x9d\x33\xf2\xb3#\xef\x86\xab\x45\xf3\xbd\xdf\xe1" +"\xb0\xc4\x9\x92\xd2\x63*\xe4\x35q\x95\xda\x8d\xd4\xef\x83\x10\xa6\x18KR\xa4!=\xe8" +"\xf2\xd1\xa2~\x1f\xa6\xb0\x34\xe7\xed\xb6i\xa4>b}\xe2\x4\xad\xbeJ\xa3\xad\xed\x18" +"EH\xefG}\x1e\xca=c\xb4 {\xf3\x98\x18\xe6\x15;9\xc\x3\xf\xe6\xfd\xab\xc6\xd5\x8a\xab" +"\x92\x38y\xd9\xe9\xfe\xb3\xd6\xd6\xf8=\x8a\xc6\x85J\x12\x1c\xb8\xe4\xdcP\x9e\x90" +"\xac\x87\xe0'\x80y\xfd=&~v\xdc\xfa\x83*\x99Q\xa8\x96n< \x7f\x8c`y\xa7\x11%{R\x9f" +"\x7fp\xb4\x9a\xd8}\xd1\xc6L\x8f\xc6\x84\xc6\x9c\xf6w+\xd8l\xfa\xbb\xa9Q#b\xfc\x16" +"0\x87\x46\xb4&\x85(\x86\xe2?&\x6\x9d\xa9\xb3=E\x9\xceL\x10M\n\x5Q\xc7\x0~\x14X\xa8" +"b u2p\xd0\x6\x8b\xad\xa2\x8e\xf8\xf5\x92\xef\x90\xb6\xfd\x82\xc9$\xa8s\xa4\x4\xac" +"\xbb\xe4\xbe\x33\x92\xb7\x96\xb1\x12\x98*\xab\xee\xcb\xe1\x9\xc9\xe3\xf0\xdc\xfa" +"\x97P\rZ\x1\xdc\xc\x8c\xca\xc8\xbf\xac\xfc\xf0y\r*O6\xa2t\xe4m\xf6\xfc\xae\xd9\x84" +"\x80(\xe0Y\xc6{\x1d\x99\xd3\xb6\xf0\xe9\xb7\x94Xj\x9c\xd1\x1c\x84\xf2\xbv\x5v$)?" +"36\xd5v\xd4\x8\xe\x1f\xb5\x44k\x84\xcc:\xf7\x94\x81\r\xc4\xfeP\xde\xfe\xafs\xf4\x3" +"VH\x8c\xde\xcfi\xd4\xb3\xd6\x43\xcc\xb1!\x87\xad\xeb\x44\xf5\xb3\xafY\xb6\xafg+k" +"\xb3k\xb6\x43\x89\xa9\x65u\x95\xee/\xab\r\xc2x\x7\x9c\xd0*{PI^\xb4\xe2\x15\x95m*" +"\xba\x90\xcc\x61$I3\xabX\xb0S\xf3^\xa3\xeb\xc1\xe5p\x90\x8a\xdb\xe6\xa9=ALl\x5\xc6" +"\xd5\x30\x8a\x8c\x91Wh\xa6\x64\xbe(\xdfq\x85#%\xc4\xe1\xcb\x93\xec\xf3\x8c\x43rK" +"\x98\xc2\xa0\xa4\x82\xba\"\xb0\x19\x89T\xb5\x92\xe4\xc5\x16\x6\xb8\xceRyNP\x7f\xe5" +"8\x8\x9cG.`\x8d\x14\x45{B\xbd\xa7\x15\x4\xd1\x43p\xc9\xff|\xda'\xf5\x36\xc9\x1cg" +"\xca\x98\x9d\xbf\x84\xff\x41}\xe9\x3\xce\xa6\x43\xf8G\xd7\x1aLz\xa0\xac\xcf\x8f\xe8" +"\xb9\xe3\xca\x62\x19\xe2\x1a\xb3\xb4\xd2\x99\x96\xfb;\x92\x34\x8f\xe7J\xe5\xb8\xce" +"~\xe6\x8a\x9a\xc5\xb5\xce\rr\x0\x36l\x94\xaa\xfa\x7f\xb4\n\x42\x35\x1\x95\x14\xed" +"\xd1\xcc\x62\xfd\xea\x43\x42\x8co\xec\xd2\xe2:\x1b:`=\r_\xdd\xed\"\xc9}7U\x99P\xab" +"C\xaf\xbc\x41\xb2;3V\xb5:\xf4\x35\xc1\xc\x84oe\"\xda\xe\x9M\x8d\xc8\x9d\x2\xedLE" +"\xb8r\xf5\xe6,\xad\x39N\x8a\x80\xf6W\xde\x6;\x18\x9b,(\xd6\x1f\x97\xcd$\x80\xe)p" +"x\xb3Q\xe1.\x9e\x1c\xc4\xba\x34\xe5h\xbbM\xe2\xec\xc5\x1b\xe1\xed;0\x1c\xcd\xe6\x33" +"\x99\x81U\xe\xe9\xd4V\xb2N\xce\xac\xf6#u\xcf\xa8N\x95\xb3\xbf[|.J\xcf\x1e#\xd4\xbd" +"\x9ct\xd3\x1f^\xa4\xb3\xbc\x13\xa9\x87$\x17\xa6\x15m\x9cWj\xce\xd2\x32&\x1c\x11x" +"\xf4\xec@\x95\xc9O\xf8\xd0\xe0\x9b\x12\x37T\xf7u%\x7\xde\xd1\xbao[\"\xeb\x5\xdb\x81" +"\x1c\xb3\xbc\xb6\xc2\x43\x9a?M\x91(O\xa9\x11\xc8\x15\x64\x85\x8}\x17\x1b\x42\x9\xec" +"\xd7i\xdb\x18\xd4\xfc\xc2\xea\xa8\x9d\xc3>#(\x1c=\xbbH\x81^B1g\x19\x8a\xd5\x33\xa1" +"\xe3^J\x92ri\x87]\x18\xbf.}\xaai\xdb\x8d\xa6\x8d\xc1#\x7f\x66\x35\xe7R[\x1d=\xb2" +"\xec\xdf:\xce\xf1nN8\xc1\xd5n\xb\x90 \x13\\\x13\xf3S\x91\xb3%\n\x4\xbd\xb5Qa}q-<" +"\x10g\x10\xf4\xb1\x83\x12\xd7\x42\x8cO\x94\x34\x61\x32P\xf8=\x9f\xa3RX\xb5\xe8\x0" +"\xad\xd8\x45\x98\x5\xbd\x38\xa9\xb9P{z+\xa7WS\xae\xfd`\xf7\x43\x3I\xe3\xecZ\xe2r" +"\xeeS\xa9_>\x15\x80\x18\"\x36U\x12`\xb7\xb8\x36\xe2\xd9\xa0\xb5\x9\xe4\xd3\xdb\x62" +")\x11\x38\x39\x13\x8f\xdb\xb5\x81*\x8a\xb4\r\xef\xfe\xf9\xa8\xab\x93\x92\x11\xde" +"\x8e\xcc(F\xd2\x42\xdb\x9d\xb5Q\xdc~E\x3K\xb9\x10|JRN[\x89\xac\x87\x39\xa8\xb6" +"\xd4(]\xa7\x2\n\x1e)\xe9\x95\xbf\x3\xa0\xee:\x14\x1c\"\nZ\xc3\x61\xfa\xa7\xa5h\x6" +"c\xee\xf9\xf5X\xae\xad%\x14l\xd6\xf8\xfe\xcf\x37Y\xf.\rO\x9e\x88s\xc6\x8a\x64Q\xb9" +"\x17>V\x14I\x9c\xf1\xfd\xf0\x5\xdf\x80\xcb\xb5\xc6\xe4:\xc1\xce\xb1\xa0*!\xb9\xfc" +"k\x18\xaf\xb7\x87\xd4\xb6\x86h\r\xe6\x98\xcf&\xb2\xa7T\xb\xf0\x1a\xed\x42\x17/O)" +"\x10\x38H\xb7\xf7^\xf;\xd9\xben|\x8b\xdc\xaf\x8d#\xdb\x46\xe3\xe9I\xa7k\xb0o\x15" +"X\x1a\xf1\xfc\xb6;\xb0h!y$\xd4qN^'Xh\xccnf\xe3`\x8d\xa6\xd7W!\xf7\x8bu\x14i\x98y" +"Zu\x83\xd4\x43\x1e\xd9[\xf3N\x94\xba\xa6\x8dz\x9b\x9c\x15\x12::9\xd2\x87\x8a\xce" +"\x82\xd1\x11\xbc\xc3\x93\x18Q\x2\x45=\xb6\r\xa0\xb0\xb7\x83\x90\x85\xe7\xb2&'Y\xc2" +"\xa4\x93@\x12'\xc1\x18Ze\x8c\xd6\xd7s0\xd2\xc4Xm\xa8I|\x1`\x13Ub0\nW\xf8\xb0\x9a" +"\xb4\x1b\xb0M\x8f)\xbe\x8bTYS\xa3\r\x7&q\x9f\xc6\xaf\x81#\xf3:]\xf9^Z\xec\xfe\x8" +"\x12\xe7\xe5\xa6\x7fZwk\x95\x39\xd2*\xd9\x1f\xe0\xcdwq\xa5\xef\xebs\xb9\xce\xab\x98" +"\xa5\xe5\"\xff\x62\xae\x84\x98\x44'\x3gZ\xf2\x1c\x45.\x0\x8f\x66z\x88\x46\x62\x11" +"i_\xe=\xa6\x1a\xe1;\xe6\xb3\x41\x7\x98\x45Q\x6\xc1&\x1foH\xf1\xf1\x9\x1f\xe7\x37" +"V\x5|J\xf5\xd4\xee\xed\x8f\xe0\x9c\xc0\x8e\x32~\xd0\x80\xcfM\xf2\x11#\xa6$\x8e\xa5" +":\xd9\x9d\x14\xfa\x1e\x7f\xc0\x1d\xcb\x45\x43\x3\xe5\xb0\xe3j\"th\x1d\x8a\x38\x86" +"wTA-\xc5r8\xcb\xc0\xac.\xca\x8f\x8f\xbe/\xfe\x8a\xb\x3\x83\xf3\xee\xaf\xd3{\x3\xa7" +"0G\xd7q\xc9\x8a;\x3\xab\xc4\xa4O\x89^]C\xc2X\xe5m,\xa7\xa6\x98\xd3k&\xc9\xf6\xfd" +"\x80L+\x14\xd9u\xa7\xc6\x84\xab\xdc\xb3\x91g\xf1\x5\xb9-5\xa9\x93PV>i\x13\xea\xce" +"\\lA\xd3\xeb?N\xce&\x6,U\xc1\x34w-v\xef\xca$\xd9\xfa\xaa\xe1\x33\xea\x84&\xe8hZ\xea" +"\x84\x32\x96-\x9e\xbc{\xa3\xe6L\xf9\x19\x85\xc5\x6\xed\xb7\x94l\x93\xbd\x39k?\xf0" +"\x1fw\x95\x9d@+E\x9d\xe2\xf!\xc0M\x14\x66.\xc\x31\x18\xa6)2\xfc\x2x\xd2.j\x1e\xc6" +"\xf6y\xa8\xf6h\x97\xf1\xbd\xb2gr\xb4\xb\x45m\x1a\x15\xcb\x17\x63hp\xce~N\xf\xde\xfb" +"\x80TT\xd0\xac\xa6^\x0%\xd6\xc8\xfbzH7x;\x13\x66\xc6`\xa7\x43uCl\x1d\xf9t'qg\x82" +"(\xd8\xcc\x1e/CP\x85q\x81=\x9\x34#\xe9\x31\x11\x90\x9aS\x1c\x31<\x15\xfe`\xc1\x85" +"5W\x9c\x4\x95\x12\xcf\xd3\x7n\xe8\xfa\xbf\xf2\xa9\xee\x61\xed\x8d!\x8b\xb5\xbc(\xd8" +"\xe3\x4z\xec\xe3I\xbcg]\xc7\xcd?l\xb4J\xa2\x42\x81>\xc4\xfJ\xb1`\x1c\x91\x85\xd6" +"\x1a\x31T6\x14^o\xba!\x1e{N\x86x\xcb;i\xd7\xb3\x9fG\x88\x8f\xe1\xff\ry\xb7\xb0\x16" +"u\x9au\x13\xce'\xf\x41$\xe8Zlsr\xbf\x86@$\x7\x9^\xc2\x93\x37\xcd\x10\xb2\xecX\xad" +"\x10\x44,\xfe\x10n\xb5\xa8\x36\xe4\xce\xa4\xa5\xb2\x9a\x82\xe7\xfa\xe0\xcd\xb4Tw" +"\xad\xacR\x8\x43t\xev\xe8M\x82\x8\xbb\xbb\xb7\x9d\xeam@R\xacs\xdd\xc7u\xc8\xe\xfd" +"\x6\x38\xb2\xae\xed\xb<\xf1\x17:\xd9\xa2,\x9oVk{\xa8\xc6\x94\xb6\xa0U0\xf1\xbc\xee" +"\xe8\x31U4\x92\x18\xc5\xd1\x8a\x1a}\xbb\x9d&\xe2;\xed\x7f\x84\xc7>\xbb\xf7\xe2\xde" +"\x0.\xb4i%mk\ne\xa5\xd1y\xej\xb3\xde\xdaM\xcgo\x94\x94q\xa3\xc4p\xe2v\x80\xd2\xbe" +"\x8\x8aM\x82\xd2o\x1\x7$\n=k<\xd0>p \xb\xbb\xf5+\xf9\n\xba\x31\xce%\">JV.\xbf\xb6" +"\xd4\xf7\x9a\xa3,\x13\x98R,WAR\x14\x1d/\xe6\xbf\x6\xf6\xa4^6\xfaq\x8\x91\xb4\x2/" +"\x5\xe\xfe@\x99\x7\xc\x96\x61V\xde\xa6\xe2\xf7\xaaq\xc4q\x8c\xc6\x6O\xe2\xf9\x12" +"\xccs\xb5\xc\xff\n/\x99\x99z\xb9\x9c\xf8\xb5\x1b\xbd-\xf7s\x1d:\xe8z1>\xeI\x9f,\x89" +"O\xf5:\x98\xfO\x94\x8b\x9d\x84\x12W\xab\x31\x1c\xa3\xfa\x8cg?\xe2\x2\xa6xr\x80\xea" +"\r\xeeH\xfe\xe6N(\xd0\x9e\x17R+\x9d+4]^m\x92\xffU\x13j\x9d\xab\xfc\x33J\xbb\xd4\x1" +"\x8d\x96\xc5\xd4\x82\x9f\n+\x9a\xd2]M'\x99\x81X\xcfX+\x12o\xdfRD\xe8\x92\x36.\xa6" +"\xb3\xc0@\xd1\xda\xed\x8f\x10\xddz\xcc\x6\x1fuC\x16\xf3>J3o\xb4\xda\xff\x93\xd4\xb1" +"\xce\xac\xf8\x66;\xa1\x35\xf6\xb4X\xca\xad\xe6\xa4\xf1)\xfc\x9f\xfd~\x8a)\xae\xe6" +"\xc7\xa9&9u\xb9\x98K\xc7\xc\xbc\xf5\xc7\x84\x89\xba\xa7\xaez\xa7\x16\xb\xbd\x98k" +"m\x95\xb6#\x97\x18/7\x8f\xeb\x39\xee!uA\xa4\xc1\xef\xa0\x81\xca\xa2\x39\xb1\xd1\xce" +"\xcb\x9b\x5\xca` \xb\xfc\xadu\xc5\xc8j#\xcfw\xac\xee.v\x1d\xac\x8b\xc6\xb7\xc8\xf1" +"\xb1L`\x8b\xf8|r *@\n\x83\xda\x8e=y\xae\x94\x95\xa7&V\x4 C]']\xf9\x98?\xfe\x41<\x9e" +"\xc9S(\x5\xe5\x34\xd8\x15;\xf7\x99!\xc2\n\xbd\xe6\xa5\xd9\xae\x88{ &Zb\xdb&\xf8\xa0" +"KZ\x86\x3\xaa\x87n_\x81\x13\x46\xc8\x7\x9dW\xb3\xe\x9\x66\xc5\x32\xa8\"\x92\xaa\xa5" +"1\xd6\xe0\x92;\x18\x9f\xfe\xab\x43;\x5\x9e\x8\xf\xe9\xd1\xa7\xec\x8b\x65\x2SB\x1b" +"\x8c\xe3;T\xf3|\x8d.\xc6\xba@\xcb\xb4\xe}\x85S\xb5\xb7\x15\xe7\xc5\xa5\x8a\xb8\xef" +"j&nN5a\xf1\x18)\x98\x7\x9f|\x8e\x9\x90\x8cZ\xf0\x9\xa6\x12\x65\xa6\x18#\xd4\x33\xca" +"\xe2\x8f\x14\xab\nT\x97\xc7\x7\xdd\xfe\x81'\xe3\xc1\xf0\xd1\xf3'\xf1K\xc6^\xf3\x34" +"\x96\xd3\x1d\xe2\xa3\xe4OF\xc\xec\xe5l;\xceM@)\x9a[\xf7\x46%lQ\xf9\xa9\xac\xd6\xa3" +"\x8ci\xbdK\xd3&\xdc \x8b\xdc\xb5\x80.\x7\x9e\x9e\xc0\x1b\xef\rZ\x87\xd9&I\xed\xb5" +"\x8d\x18\xc2\x14\xa2\x30\x99~\xe6\xb\x9\x9=}c\xa7LTNe/[\x9e\x8e\xd0M\xc8\xbd\x1\xf3" +"\xdb}\x89+[\x93\x1bl\x7f\xcc\x38\x80\x9b\xce\x30\x62\x8bYN\xc9\x41\xca\xcf\xde\x64" +"S\xe8\xe4\xb5<\xe1\x30\xb0j#\xa0\xf6*\xa5\\^A\xd9\xc6\x2\x1\xebN\x91\xd5\xdd\x38" +"U\xa8\x99\xbeg>\x1d|vW~\x9b\x96\x46\xd8~\xa1\xdb\x1e#\x9f\x94\ru\xa0y\x8b\xf9\x84" +"u\xbb\x8e\x32\x1a\xfe](q\xc5\"\x1f]O\xec\xdd.\xb[\xdd\xcf\x86\xc9\xbb\x65\xb7\x39" +"q~\xae\x8\xa4Z\xef\xff\x82|\xef\xcfi\x1d\xb4\xb6\xf\x7\xf7\xd8'v\x16G\x8" +"\xc1\x1f\x33\x43\x9c\xac;\xa8\xcc\xa0wR\xbc\xb4\xd9&\xf7TeZ<\x86(\xb0\x11l8\xed\x15" +"!\xcb\xa0\xb6L\xb7\x2\xaa\xd8\xa0\xcd~\xe%}\xb1\x83\xa2\n\x7\x32<\x9d/B\xd2z\xdb" +"=\x2\xa3=\x8\xd0\x88\x8f\x61\x1a\xf3\x4\xec\xb2\x8fo\xeb\xf\xf0W1\xa8Tk\xf1\xa0\x86" +"l\xe1+:\x5\xc7\xd3\xfe\xa5\x9d\x0\xdf\xfdZ\xda\xf0\x99\x1e\xdf\xc5\x1e\x8e\xdcHN" +"#\xc7\xc7Q\x85_\xdf:s>\x84\xf4\x12\x41\x5$\xecq\xf8\x1a\x8e\xc\x92Q\xddLh\"\xa8\x98" +"50W\xa6\xda\xeb.\x8e\xcbL\xe3*3K\xca\x95;6w\x88>\xb5\xf0\xb1PV=\x2\x1b\xd5\xe3\x8e" +"\xb5\x14\xce\x34\xc8\x9a\x9c\x43\n\x98g\xa4y\x0\x9cg}\xe2\x41\xe0\x64hl\xcal7^\xcc" +"\xf2O\xa1]`\x98~|\x4\xb6\xd3\xe3\x88\xc7\x8e\x16-}\x13\x9a\xe3\xf8\xbb\x36\xe1\xb5" +"\xab\x64\x16\xf3V\xfe\xf1\xbe\x1f\xa7\x88\xa4\x35Z\xd5\xfa\x90\x45%\x9eQY\x8cp\xae" +"\x1cG\xe9\x13\xda\x83\xa6\xbd\xc9\x80K\xa5\xed\x31q\x92\xe5\x18\x16\xcb\x93g\xfa" +"\x80\xfb\xe5\xb1\xd0\x42=\xfi7'd\xf\xed\xb6\xf8H\xa1\x8\xcb=\x9eK\x8cY\x93\xb4\x80" +"\x87\xc1\xf4\"M\xcbjq\xbfhr\xcc\xbf\x80\xbd\xef\x33\xf5.\xcaI\xe4?gU\x12\xaf\x9f" +"\xaa\x38\x17\xde\xaa$\xb9\xb5\x17\x8\xdb\\\x9e\xa7\x65\x33\x97\xf0I\x7f\x62\x1f\x11" +"r\xe2H\x84\x19\xf1\x82x\x82\x8cH\xd2\x84\x97\x34\xe5\xf9\xdd\xccT\xb5\xc6\x13)\x0" +"\xd4\xe8JY\xa0'\x7f\x91\x8e\xcdLS\xfe\xdc\x8d\xc1\x9e\xfj\xfaS\x81mvs\x83\xa5\xf9" +"\xf0~c\xbd\x8f\xcb\xfe\xf5<\x90Y\xc0\x63\x9c\x9b\xc1#z[\x15V\xd6\xc1)\x7\nU\xc7\xeb" +"X\xc3 p\xa3*\xe2\x93\xff\x7Q#9G\xbe\x19\xf9\x1\x10L-=\xadg\xfc\x1e\xd7n\x9f.]H\xa5" +"\xbb\"\x89\xbewLlV\xf7\x13\xc3\xd3\xfdGJ\xc9\x97P~\xfd+^\xc3\x16\xd0\xce\x9f\x1b" +"}\rQ\xdc\x83R\xc1\xd4R\xc0q6\xa8\x3\xdc%]\xec\x37\x43\xcb\x91X\xc8)\xd7\x63\xf0?" +"\x1d\x32\x3T\xdc\xd8\xaa<\xcem\xc7\xd4\xe\xcb\x15\x34U\xa4<\x11\x8\xadP\xe1<6\x6" +"fb\xad\xe\xe9\xfbz0\x93m0b\x8b\xe3\x8fqM\xbd\x97\xc4\x93\x90S\xdc\xfaK\xc5J\xd1h" +"\xc7j[\x16\xd4\xf7\x18/\xb9\x8dm\x8)\x94\x62\x9d\xb6\xf2I\xe2\x89W\x1X\x8e\xc2}\x8" +"(<\x94\xc3\xcd\xa3j\xcf&\xbf\xdd\xe#?\xd7\x1\xa3M\x83\xa5\x17_\xbc\xe8\x1f`\xb1\xe3" +"\xae\xf8T\x80\x8b\xcb\xe2\r\xec\x1d\xa5`\xfcH\xe\n_\x2\x95\x14\x1b\x98\xab\x36\xeb" +"\x17+F\xb3\x93\xd0\xa2\x7f\xd3.m\xbe\xe6\x33W\xd6\x62\x98\xfd\x15N\xce/u\xb5\x16" +"jQZ\xf4\x83G\xa4y\xa4=/4\xf5\\\xd8\xbc\x8c\xfd\x36\xd3\x1e\x63\x1cI\x11\xb9\x1c\xcf" +"\x90\xd0\x2\xe8\xbfK\xf4g\x86\x9b\x13K\xf5#i/\xc5oi\x84\x66Z\x81;\xb3\x7f\x94\xcdm\xa3\xd5Y\xa0\xd0\xed\xe6w\x19o\x9a\xfb\xf6s\xb4\x83m\xe2+\x98" +"\x8d\x92\xb7\xb4\x9a\xc1\xc(\xed\x8e\x37\x91\xfd\xbfV\xcf?-\xae\xb\xb4\x91S\xc2\xc8" +"N[\xe3g\xb0\xe\x43>S\xb2\xf2%\x15\xd0\x39\xa5\xb7\xc9\x9a\xa3\x63\x13\x97RP\"\xb9" +"\x8a\xec\x93\xc5\x13\xdc?\x88\x42w5\x91\x31\x9f\xff~'\x7\xb7\xad\xc0\xcd\xd5k\r\xbf" +"\x97sOD86%\x94\xa3\x81iC\xa5:3\xfb\x99\x8c\x17s$\xc2\xbe\xee\xdd`@k\x15\xe3\xdc\x99" +" ?\xa6\x12\x64\x33\x16\xcb\x42\n[}\xa8\xcd\xdcJ\xbbr\x85\xfdSs\x8f \xd2K\x8d\x63" +"$\xdf\xf5~\xc5\x34\xf9\x0\x9a\xf\xd9\xdb\xd4\xf4\x1dj\xdd\x9dZ\x90\xf5\x90r1\xd6" +"@\x95'n\x96\xfd\xb8\xc5\x9f\xadu9\xd4[\x97\xcf\xdes<\xbb\xa5\xdbO\x8\xab+@\xe4]\xb1" +"\x1\x42H\x11Q\xccY\x84\xe8\x96\xc\x93\xbc\xaa\x8d\x86\xb8\xe6j\xdf\x9a\xfd\xfd|O" +"\xf4\x36\xb5\xe7\x9d\x41\x31\x64hv|\xae\x64\x8f\xb\xd4\xee\xbd,:E\xc0\x8c\xcf?Xd" +"\xe1\xe2\xb3\x8c(\x84\xa2\xd2L\x81\xbc\x8a!d~\x6\xac\xfc\xfc\x63^\xc9\x8a\xa2\xf8" +"\x99\x90*HVu\xf5\x4s\xf3Zv\xe8w\xda{Iev\x91\x16\xc6\xa4\xa5\x7f\n%\xf0k\xe\xe6s\x4" +"\x93oax\xcb\xb2L~\xd0\xe0\x33\xc4\xe2\xd9\x17\xa9\xb4\xd5\xe\x66\xd2\x82ya\x89\xce" +"D\x7'\xedh\xde\x10\x96X\xce\x33sy\x8eY\xa6\xe\x46 N\x88\xe7\x97\xcd\xa8\x82\x15n" +"c\xa8\xf1\x36P\x8b\xaf\x14\xc2\x42\x92@\xa5\xaeq\xef>*\x88j\xd8\xc3\x19ic\xbb\x7" +"\xe1.\xf8\x1b\x97\x16\xfa\xea\x85\xca\xa2'3\x82\xbd\xe\x4s\xc7\x38\x6\x18\xc8\xe7" +"\x16\xf7zn\xdbs?\x82\xb9\x2I\xedy\xb0\xa0\xea\x10\xf5\x1\x9\x39\x85\x95\xb5\x8d\x90" +"\xfa\x39\xdc\x81\xca;\xd4j~\xfd\x42\xbb\x30\x1b|N\xb9\xd3\xe5\xbd\x0\xb0\xd6\x9b\n\x34" +"\x8d\xf5\xc2\x62\x45\xb0\x32\xc9\xe7\x36\r\xa5\xd6lvV\xc4\xb\xd5\x41\x44I\x96.P\x83" +"\xa4\xc8\xae\x0m\xac\xdb\xa0\xd1X! \xe1\xd3l\x5\x34\xcd\xac\x81O\xc6\x8\x12|}\x4" +"<\x13Sw[\x8cr\xfc\xd5\x96\xb2\x34\xc5{,_\x1b\xf4\x97\xfa\xc1\xfd\xe6\xfa$\x7f\x85" +"\xac\x8fS\x85~\xb9\x82:\xa4\xf4\xbe\x36*\x1c\x46\xdb\xc2\xdf\x9ai\xaf\x9eo\xcd\xa3" +"\xd7\x63\xfd\x3\xcb\xc7\xf9\xd6& \x1c\xd6\xfeR\xfK\x96`\xa5zG.Y\xf6\x39\xae\xb5\xcc" +"\x88\xa3\xcf\x94\xaf\x18:\xb6\x94\x64\x62R/`\xd7\x95\x93\xe3\xe2\xcd\xcdP\x88vb!" +"\xb]\x19=\xbf\x45q`\xfo:\x13\xb1}\xca |Q\xf6M\xc2\x1a\xd7\x93\n&&\x1a\x66\x42\x16" +"\xf3\xc4I\x6$\n\x94\xe7T\x1f\xb8\xf4\xc0n\xa3H\x15\xf0\xe5\xd1\xb1N\xe1\xc7\xf5\x82" +"yJ\xff\xaa\xf8\xe8\x1b\x43|\xba%\x8a\xa1\x42\xec\xd9\x35\x37\x93/ F\x9c\xbc\x33\\" +"S9x0\x86\xcc\xc6\xd1\\\x37I\xbS\xa4K\x1e\xb3/F[\xe1\xf5\x3=\x9e\xee\x96\x31%\x4\xdb" +"\xd0ZX\x1d\xc7\xdc?N\x90\x1d\xc1\x1e\x9c{\xe3g\xc1\x9b<\x10\xbb\xa1\xa7\x8b\xe8N" +"\xa5uH\xbczK\xa7\r\xbf~Od\xd1Y\xc\x65\xb5\xa9<\x87\x17\x1f%\x94M\xd0\xe1\xeb\xed" +"\xd4\xdb\x99(\x91\xaa\xd7\xb5\x7f%\x97 \xc6H\x93\xfd@\xc\x1a\x43\xda\xb7\xa7\x96" +"t\x7N\x86<\x8f\xe9-j@\xb2\xaf\x1dS?\xee\xc9\xae\x3~-\x92\xab\x43\xd0~\x85V\xfc\x0" +"K\xde\x9e\xfa}\xdb\xe2\\t\\\xd5@\xd5\xf4V\xb8\xec\x15\x38\xe1\xb7\xf4\xc5\x89\x12" +"WE\xea\xff\x96*\xd5\xad\xdc\xfc\x3\x42\xb2h\xe0\x30\xbc\x31\x1a\xfe&\xf7\x16\xbe" +",\x96\x35\x0#\xd3\xebL\xa2\xdc\xcd\xb9 \xc2\xccZ\x88'\xacOQ\x97\x93\xc1G\x9ej\x9" +"\xb4\x32\x4\x9c\r\x14\x9\xa9\x42\x39\x5X\xab<\xd9\n\x8cSR\xb1\x1cU\xc0\x9e\x97%\x4" +"B\x9f\xdd\x11\xf5\x2\xcfW\xcd\x84]'\x93\xa9Z\xa5\xc4\xda!\xfe \x16p\xaa\x34+C\xca" +"\xf8,D\xa5&\xc7\xb6x\x96\xf0\xc9vW\x8a\xd7\x66\xda\x10\xb8?\xe5>\x16\xfc\xa6\xa5" +"\xc\"\xcd\xe6\xa2\xb9=\xd0\x99\xbbz\"!\xf9\x0\x10\xe4\x82\x9a\xc6\x64`Y6\x19;\x98" +"\xb7\xd2\x99\x37|6[\xce\x1c\xd6\xd8R\x10sz\x1f\x15\x33\xc6\x84\xce\x33#T\x7f\x82" +"\xfe\x9e\x1a?\xfe\x9c\x97\x7\xd4\xc\x1bL+\xaew<\xdc\xb1r(\xcd\xa6\xe0\xbd\x8urX\x1c" +"\xca\xd3\x17z\xca\x5\xd6\x97\x19h\xa2\xec\"p9\xe2}s\xc8\xc5\x90\x16\xaat\x8f\x93" +"\x81\x9f\x39\x61\xee\xd0\xdb_\xd0\xe6T!\xa3\x87\x11m_\x8f\x92\x37\x94J\xe1\xb5%\x95" +"a\x1b\xdfq\xa5\xbe\xf8\xd7\xdc\x62j\x17\x8d\xc5\x39\n\xaf\x1c\xf3gK\xb2t^\xa1\x8" +"\xc7\x32rJfyfa.:b\x9d\x9a\x89U'\xb\xa4\xaa\x1b\x32l\xf0\xee\x9a\x14\x96Lm\"\xb8S" +"\xe3\x96q\xb8\x82\x5\x45X\xe3\xebr\xf0\x1b@\xe8\x83\xb7\xe5\x87\x15\xba\xcbWo\x9d" +"<\x9fuK\xb2\x11\xa6\x81\x87\x99\x34z\xc8mu\x1a&\x15 \x8a\x42&\x7f\xc\x8a\x63\x9c" +"\x8cW0\x90\x62\x1c\xbc\xc8\xb1\x87\xc9h\xef\x30\x9f;@\x8b\n\xe2U9\xd6\x84,V%\xe6" +"\xf8\xbe\xa0~\xe0\x3\xea\xf0\x7{\x82S\x1cYE-~_}\xb1\xe1\xfd\x1b\x1b\xf1/\xb5\x34" +"w\xb4Q.\x1f\xec\xe3\x9bp[\xaah\xbc\xb\x84\xb3\xee\xa4\xdc\xc\n\xeb\x9d@Nq\xcc\xad" +"\xf0'Z\xbdK\xd2\xb3+_I=O\x93\x96\x8\x81\x2H\xf5\xb1{]\xcc\x38[\xe7g|B\x2\xb1\xa7" +"\x1e\xf2\xe7\xd6\xdcL\xd8\xef\xe1\xb2\xfb\xear\x1\xbc\x32\xd5&\x3\xd9\x39\xa7.Z\x7f" +"x\x12o%7,\xeb\xce\x94\xf\x31\xa7o\x8b\x8a\xfd\"\xf9\xd8\xbc\xb\xf0\xa4\xdd,\xb0\x38" +"\xb8\x1\x18\x10Z+C?\xd5\xcd\xe9\x18\x93\xd2\xf0\x13\xc3T!\x8c\x1b\x64\x64\r\xac\x35" +"\x9a\xe1G\xd7\xfe\x4`$\x95\xd3\n%\x8d\xe1\xfa\x1a\x32\x0\xe3O+\r\xc4\x34s\xf\x65" +"\xed\xaf\xf0s\xae\x36\xfa\xde\xed\xe7q\xcdxm\xf9H\x6\xe8\xd5\xeb\xe5^\x9\x2\ng\x9d" +"\xd0\xf5\xe1Ua\xbfoa\xa9k\x1a\x11\xf6M\xbc\xe5\x88\xa7\xba\xad\xcc,\x7`\xbd\xf4\x92" +"N\xcf\x5|\xb3\x34y\xe5nW\x89\x62{\xe0\x9c\xd5mgN\x12\xd1\x39\x94\x82Q\x82\xbaO\xb7" +"\"f\\;`\xba\xcd\xaf\xa9\xc8\n\xc9\xd7\x93\x15>\x99{P`\xbf\xd5\xf7=6\xc0;\xc2M\xd3" +"\x8d-\xce\x1b\xfdy\xb6*\xd6\x13\xbaT\x8e\xbc\xf3\xab\x6\xc3?B\xd7g\"\xf6\xeb\x5h" +"\x0\x9b\xa3\xa5ZO\x94$\xf3\xaf\x64\xa6\xf0\x7f\x63\x2\xde\x9cK\xed\x18>m\xf6\x8a" +"\x1d\xfa\x8cYU\xee\x38\x1b\xe5[#c\xfc\xdc\xe5\xcb\x99\xda\xe6O\xa5}@1\\*\x7f\xc3" +"\xcd#2U\x15\xcd\xc2(Yvr\xcf\xfU\xc6w\xd6\x2w9d\xd2\x6\xb8&c1\xccG\x6\xc9\x82\x3\x30" +"\xef\xd8\xf4%\xb1\x1e$\xd8\xe5\n\xfaKP(\x81\x1d\xea\xef$\xee=\x5\x1.\x94\x1a=K\xc4" +"\x96\\\x9b\xa7\xbbT\xfd\x93>\xae\xb6Ptp/yJy\x18\x1b\x8\x32\x3\xd1\xbc\xc4\x32\xe6" +"\xdb@^'\x9\xc4\xfc\xb6\x84\xf7\x8e-Ug\xbc\x7\x9fs\xe8\xb9\xc7l:<'\xef\xb2O\xa1\xe2" +"\x8f\x10\xfc\x0\x97\xe1\xa7\x9d\x7L0\xfb\x88\xd4\xe0rm\x10\xd0\xe4\x88Jep\x14\xf5" +"\xe8\xf2\xe7u\x80\xac\xb4\x41\xbd\xf5\xcd\x89\xd3\xc3\xb8\x8f\x9dw/nP\x98\n~ob\x81" +"\x94\xad\xf6\x91\xaa\x31T\x99\xe0\xc7\x19\x15\n\xee\x3\xe8:\x8a\x39\xa6\xd6\x86\x1d" +"\xd0\x34W'3\xb1Y#.F\xad\xa8?\xc7^\x9f\x15\xdb\xc0\xf5\xd3w\xa7\xf3\xd5%W\x8fv\xc5i\xbe\x80\xceR\x15" +"\xa9J\xbc\x7\xce\xc7$\xb0m'\xca\n \xe9xe\xdb\x44\xd2\xf2\x38N\xad\xaa\x19\xfd\"\x1a" +"\x7f\xf0U\x89$\x8\x15OX\xf9\x1e`\xbb\x65\nH\xbf\xcf\x1b\xe6\x81XaYL[\x9b\xc3\x8b" +"B\xd4h\xe8\xbb\x38n\x85q\xc5\xd6t\xe3\x16\x45\x96\x91_\xf/\xfd\x9\rQ\xdd\xfb\x0\x88" +"\xf6$x_\xba`H\x9a\n\xb0\xaf\x19\xed\x91|I\xc7\xd4\xb5\xb4\xb2\x95\xdbx\x3\xb8\x46" +"\xf0\xf3P\x84\xfa\xd8'T\xfe|\x94\x8e\xba\x35\xf9$\xef\x10\x93\xfb\xc2\xb8\xb1+\x4" +"\xf1\xf6\xca t\xaayi\x17 \xac\xb1\xcb\x99\x8dvC@\xce\x95yR\x83\x99\xe8k\xd0\xfb\x94" +"m'\xd0\xeb,\xe3\x96\x9b\x86}5\xa4\x66\xf7\xa9\xf3\x4x\xb1\x9c\x13\x9d\x33\xe7\x9d" +"!\xc3,\xb\x84u$\xfc\x18\\h\xf5r\x86?\xff\x97\xcc\x45\x8\xcb\xdc\x45\x8\xe5\"\x36" +"\xe\xba\xf8\x7f\xe8\x98\x84\xfb\xb2\xaf\x33>\xda:|-\x6\xf3\xdf\x6~.\xeb\xa5\x13\x1f" +"\xa3\x86=\xd4\xf7)d-\xbdk\xc4\xa4\xaf\x63\xf7N\x96\xbe\xc5T\xb7\xeb\xe2s\xdf\x30" +"u\xb4:v\xeeG\xd2h\xbd(\xd6\xa2\xfe*AS%d\r\x85\xa1o\xfd\x84l\x3l\xf4[\xb6\x66\xf0" +"\xd7[\x86\x8f\x91\x35\x83\xb4\x9fJ'\xdc\x8e-[3\x90q\x7\xde\xc0\xa2u\xff\xe3\xcf\x9b" +"&M\xe1\xad\xf7\xd8\x8e\x61\xa2\x9d\x9d]roK\x9en?\xe6\x18\x98p\x11'" +"\x10\x94\xc5\xd5\x64\x66\x9dT\xc5\xe8\xe8\xa6\x37\x8f\xcd\x66S\xe7SH\xfaX\nr\xda" +"\xb\xb5\xe2\\\x0\xa8_G\xbd\xbc\x64\xe8\xeaoV\r3O\xfb\x8e\xdd&\xd1\xa5\x8f\x2\xb6" +"2;\xb5\"\xf3\xf\xf7\\\x82\x92\xe7\x91\x9b\x0\x89\xed\x83\xae\xbe\xba\xafM\xb2\xce" +"\xec\x84\x10z\x9eWl\xe1\" Y\x82l\xed\xc3\xa1%\xbb\x4\xda\x8b`J%)\\\xa2\xb7\xb4\xf1" +"\xca\x13!\x87\x90\xe1\xc3}/T\x82\x99\xb0\x62-F\x8e\x82\x13\xd2\xe>\r\nZ\x8f\x9a\x15" +"@\xad\xfe\x38~eO\x80/\x83\x90\xf4[QC\xeb\x19m\xf5\xf\x4\x4W\xf8\x8e,\xbe\xae\xaa" +"\xfaRS\x2\xd0,$\xaf\x12ZX\xca\x99\xc\xbe\xed%\xe7\x2@h\x1b\x18\x95:H\xaf\xf4\xf4" +"A\x96\x61j\xe5Q\xd8\x35\xceG^\xa4\x63,\x1\x90,\x9b\xef\x99\xc1\x3~\xbf\xeb\x8c\x88" +"\xefQ\x19R\xd4+\xdb\x1e\xe2\x1;\x15`5\xcb\xd9L\"\xe2)\x19\x98\x1b\xa2\x7\x1b\xf\xaa" +"\xa6l\xf4\x36\x9fU\xcd\xb6_C\x8c\xe2\xb1~\xf5\xf7\xe3\"\xa8\xb0\x65Hj\xcc\xe>c\x88" +"\xae\xde\x9f\xcd\x85\x9y\xb.is\xc6\x65KWg#\xd6\xd0\xb5\xd7\x86\xa8\xd5\x9b\xed\x30" +"FI+\xe9\x89\xef\xc8]\xc2\xdb\x98\x37(d<%\x1\xab\x8a\x80Rv\xba\x1>-\x19\xbav\xde\x16" +".\xa5_\xa3\xa1\xcdWI\\n\xd0\xbb\xa4\xe9\xf8I'\xd9@)\x8e\xa6\xdd\xa4\xce\xba\\\x96" +"\x12\x8e\\\x9d\xbak\xf1\xa7\x30\xd6\xbd\xa2M\x8a\xeb\x8f\xf7\x46\x85\xe4W\xdd\xe" +"\xef=}<\xa1:\"\xd5\xe9\x9c\xf1^i\x8\xc3\xa6\xf6g7\xba~}\xcb \xc7\xa3uO\x1e\xed\xe4" +"\xf4\xc5\x91\xcb\x80LN\xc3\x93,\x8\xdc\xa5\x83\xbfy^O\x91\x99Kk\xcd\xb3\xc6gP\x1e" +"\xb3+)\xdeJ\xe9\xdb\x85\xe4Z\xb9\xcas\xf3\x8a\x15v\x98\xca\xed\x62\xc4\x81\xad<_" +"Z\x8M>=\xec\xcc\x8c\xe1 \xa1\xd0\xef\xfa\xa1\xd2\xfb\xfa\x14\x64\xafz6\x93\xcf\xe6" +"\xf7\x8b\x38<\x9f\x8c\x15\xf7\x92\x80L\x8c\x32\xaf\x13\xbf\x1a\xdb\x1f+o\x98\xb7" +".m\xbc\xf4\xe1Z.CE>\xbe\x65\xd3\x9\xaf\xe8\x65\xf\xb2\x30\xcf\x43\xde\x61#\x88#\x99" +"oD\x1e\xbf\roE\xc6(\x90)&]\x18\xcc\xd8\x9d\xcaK\x18\xc6\x45\x45k|J\xfy\"\xc3\x8c" +"\xa2\xa8\x30\x97\xa1\x64\x30\x62\x35@y\x19/\xc5\x8e+t\xbd\xd2\x6\x1G4K9`<\x94\xa9" +"\x2\x34M\xd5\x9a\x35;\x83`Nz\x16KjQ\xfb\x11\x86\xb1%\xder95c\x81\x1c?\xa9^\xa0\xd5" +"F[\x85w\xb8w\xa9*\xad\xfe\xb9\xfd\xfc\x11\x96U\x8c\xefR\xa1\xe6\x90\x1by\xcfz\xed" +"|\xc1\xa9\xd8\xa1\xe7\xa5\x1e\x85\xf4\xa6\x3\xec\xc5\xeb\xf7\x90\xcd\x39\xec\xa9" +"\xc2.\xe1\xa5\xf3\x87\x63/\x9a\x10\x0\xe2^\xda\xef\x9\xaf\x62\xfa\x1\x7\x63&\xea" +"\x1aM\x1e\xa7z\x9f\xb8|\xc2\xda\x1d\x98\xba]\xb9\x9b| \xc\x13\x11GH\xabu\x8b\x31" +"\x83W\xaaX\xec\x1f\x13@]\x1c\x63\xa7\xfbH\xbf\x0\xb7\x9d\x66\x39\xc8\xc7uf\x14\xa9" +"2\xc5\x93\xf0S\x88\xb0\xee{\xec\xff\x99\x82\x13\xf4\xeei\xe8Qie\x1d\x86\xa5\x3Tw" +"\x9a-\xc0\x44\x6\x17\x9bV\xd1\xce\x36\xceUa-5\x16-\x9d\xed\xf3(~\xec\xf1p-]w\x1a" +"\x97\xc0\x8a \xd4J\xc9\xd3\xbc\xcf\xbe\xc1Z\x9f\xbc\x94\x9f\x82\xb4\xdfP\xd9um\xe7" +"\x11\x9b\xdd\xb5\x90\x16\xb\xb2\xb3\x30U\xdc\xb5\xfd]\xedN\n\xf4 \xf0\x8e\x91\xb4" +"\x10\x0\x87\x83\x8f&\xa3\xca(\xf3l\x7/\xbf\xc5\x15\x9a\x4\xae\x11\xe2\xb5\xbe\\\xad" +"\xfe\x36\x37p\x9a\x9\xb2\x35\xc\xb1\xc5k\xb4J\xa5\xaf\x8bP\x80-\xa9\xfe\x9cxC\xf8" +"3G\xce\x1b$\x88\x1c\xa2\xee\xfb\x11\xbc\xc2\x19\xb4-\x8fj:\xcc\x9e\xcf}\x10\x42p" +">\xe1\x5\xf0\xef\xd5\x65\x98\xf4v\x1f\x1a\xb5\x41\x61\xccR\x19\xfa\xad\xfd\x41\xba" +"\xd4\xd4\xda\x0\x91S\xb3\x89\x8esz\xd9\x1e\x85\x19\xf2g\xc8\xff\xcf\x92P\x9c\xc8" +"\x1fI\n``\xb?\xa3\xe8\xba\x66\xa3/x\xb9\x32\x93~\xbf\x8\xa5\xa3{\xd2\x36!\xb9\xa3" +"\x0\x31\xc6\xc5\xf3\xe7\xc0o\xfe\x8f\x64\xad\x89\xa3m\xfb\x86\x34\xe3\xb9\"\x9a\x62" +"\xefv\xd4\x42\xae\xf4\x4\x63Q\xd8\xab\xc3\xa4\xd7\x9a\x44\xf\x88(\xf7\xc5\x1f\x91" +"#\xa6Ndh\xa9IA\xa4\x66\xa5\x1d^|\x93\xe8\x44\x82\xc4\x1c\xb7N\xbb\x80\xe9\xf4.\xdc" +",\xeb_\xfe\x94G\xab\xf3\x38kf5\x9f\xb\xb3\xe8j \xd3\x90\x8b\xe3\xae\x9f\xca?\xbc" +"V\xb3\x3\xa3\x35%\xd4\x4\x3\xb0\x18\x9cO\x17\xca\x94`\xa1RA!(\xab\xee\xab\xe1L\xceX\x15" +"\xd1M\xc5\xff\x9c\x8c\xfd\xd9\x33l\xc8\xd4X/\x8f[0pV\x4\xa2\x9c\x5\xc3\x3\x9fu\x1" +"\xdd\xff\xf5\xe5\xd0?\xa5\x8c\xbf=x\xf5\xe9\xce\rm{\x15\x1f\xe1\x64\x83\xb\x0t\x90" +"E\x13k\x6\x41\x96Q\xd9\xef\x9e\xe0/@t\xb9&\xe1p\x92\x43\x9c\x82\x35\xde\xd6\xee\xa3" +"\xfc\"\xff\xf9\x8e\xb1\xf4/\xde\x8f\x37<\xf2;\xb2p\xae\x1c.<\x9f\x33\xd8\xfa\x82" +"Os\xe3|'\xef\x8d\xe2\xf5\x8f\xa6M\xa7\x32y\xed\xb7\xf8<'\x98\x0i}\xe7\xbb\xc0\xf0" +"\xf1\xe7\xc9\xec\xe2\xd7\xfc'\x8fM\x4\\\xe4/\xdb\x61\x85ZS^\nJJZ\xfa\xec\xc1I\xd1" +"\xe0\xc7\x95\xbg@d\xbdVx%j\xdb\x31\xcb\xab\xf2\x33]-\xa3\x37\xae\xb7\xb8\x1a\xad" +"\x82\xcdM\xbb\x15\xf0q\x1e\xa9\xc\xaa?\x9c\x65\xcd-;\n\x85\xaa\xa8\x63\xfb\x81t\xad" +"\n\xe\x42\x38\xb3\x30\xc9T/\x6\xf2\xdb\x87nz[\xb3\x19\x95\x8\x66\xdd\x32Z)\x80v\xb2" +"I\xa1_\xb9#\x8f\xce\x14\xa5g/dQT\xac\\R\x89\xde\x85\x42moB\xf2\xbe\xd5\xa9y\\\xab" +"\x1e\xd7\x9c\r\xb5\xd9\x85y\xf3\x30\xe0X\x8b\x1\x63\xf8\x31\x1c\xc9Y\x86\x81\xe8" +"\xdfg\xa4\xd1\xef\x45-`Ur\x97\xa7\xdd\xe4\xcb\x63\xbc\x65\x35T\x9b\xdf\xfft^ !<\x84" +"\xe7\xde\xe5\xcd\x18\xe4\xd7\xe2$D\xf9\xd5\x81\x1f\xfJ^\xff\x99\xa9\x1c\x1e\x8b%" +"\x14N\x1dg\x7f\xa4\xa4>\xca\x11\xf\xa7\x87#\xa8[\xaa \xef\xde\xfe\xc1 {&\xf3\xb\xda" +"!\xab\x8c\x8a\xd7,\xac\xaf\xae\x81@\xbf\x96[^\xc6\xf4oI\r\xe3\xff\xe3\x1e\x8d\xd5" +"\xdeK*\xf6-\xfc\x66\x6\xfe\xde\xf1\xf2\x8d\xe9\xcd\x18\x1c\xc3\xa8;\x86UN\xd3\x5" +"\xee<\x8d\x0\x37\xe9J*V\xda<\x89\xca\x92\x9am\xeb\x8xq\x7\x0\x82\x94\xf6I \x88\xd7" +"\xa3\x92\xbfiE*\xfd\x42\xc2X\xe0\xfaL8\xab\xc8\xfa\xc2\xb4\rh\x99\xc2T=Y\xe1\xbf" +"h\x1\xc5\xa6,\xd3\x9\xea\xd2\x8a\x38\x62\xbf\xecT\x87i\xf0\x1f\x93\xa1\xa4\xd5\x93" +"p\x92\x10y\x1d\x93#\x1\x14K\xb\xa2\xc7\x8a\xf7k\x86\xf8zag\xa1\xc0\x92\xd7\x86\xfc" +"5\x96\xe9\x8a\x13\xec\xde\xb9K\xec\x96\x10~d\xf6\xdd\x91\x8am\xf9=Ry\xea\xea)\xfd" +"[\xb8\xca$|\xb1\xa1\xd8\x85\x8b\xa9\x84\x7f\x34\x90\x8\x9b@\x17\xb7\x66\x45\xe4L" +"\xdb\xc6\x9f\x42\xe8\xeb|\x6\xcf\xca\xe9\xe8*\x81I\xaa\xc5_\xf7\xb8u\xa0\xc0\x45" +"\xf8\xcct7\xb4r\xe5%\x12\x94\xdbH\xfat\xd8\x92w\xb7@\x9b\x1d\x86\x9e\xb2\xe6{-\x6" +"\xa1Y\xe1\xce\xec\xe2\xdb\xfe\x18\xfc\x88\xb1~X\xb7tQ\x15$\xdd\xb4\x2;8\x7f\xe\xb3" +"\xc2\n\xe6`\x91.\xac<&b\x8b\xa0\x65'\x97\x19#\xae\xd2\xf9\xe6\x8c?~xC:s}e0\xf2(\xad" +"M\xc6Hl\xf0\xa9I<\xdd\xc1\xef\x36\x45\xef\xc4o\xc9P\x87\xdf\xba\x9d[5\xc6\x99\x9e" +"\xfa\x9b\xbb\xcfQ\xc9\xcd\xeX\x3\x14 \\\xe5Q\xe9\x1f}\x10\x99\xde\xb3\x2\xad\x80" +"+;\xd1\x8f\x11\x37\xb2\xec\xb~[$/P\xdb\xa4O\xff\x19\x45\x17\x93\x3\x9a\x82t\xe0/" +"\xf9=\x18\x5\xc3\x34\x32}\xa1h\xc9\xc3\x32?p\xec\x32\x8e\x18\xdf\xc3!\x2\xd0\x33" +"\xad\x4y\x9e\xb9\xf1\xbe\xf1V\"m\xd1\xec\xa8\xb2\xc1? \x8aq\xc0\x8e.8\xbf\x16\xf6" +"$\xaf%>\xf0.\x80-b\xc1\x37K\xfb\xd2\xb0\xe5\x9d\xe5\xb7\x45H\x19\x15\x87\xe2h\x1c" +"\xac]\xa1\xaa\x66\x99oUX]\xff\x10>\x8b\x7f\xab\x85y\x1d\xb1\xe3*\xbcn\xfe\x10\n\x83" +"\x89\xbf\x9e\xd3\x41\x8f\xaa\xb9\xfc{\xd2\xfd\x38\xa5\xa0\x8c;K\x80PA\xd8\xdb\xe7" +"\xe8)\xb5\x84\xc7\xa9\x46\x41\x43R\xb3\xd2*\xe4\x7\xb5\x43\xbe\xe4~\x17j\xcf\xe5" +"\xb2`\xfb\xf6\xaa\xddK}\xda\x45\\\xaeR\x12\xa2r\xfe\xa8)\xfb\x31\xed\xb8\xb9\xb0" +"k\xbe\x95\x64\x1d\xd8\x37\x95\xa2\x65\x14\xfc\x17\xd4yx\xce\xfe\xa5\xf3\x1a&\x17" +"\x8d\x8c\x17\x5\xaf\x43\xc8UY\\\xc8\"\x61\xb8\x7\x8e\x62\xf1y\xb9M\x86\x39\xd5#\xbf" +"\x9\x1d\x83\xa9\xec\x66\x8b\xb\x8 \xa7-\x1f\x9e>\xad\x31I\x86\xe2j\xa8\x39min\x1a" +"\xd7\x43\x91\x36\xc4\x89\"\xa6\x41\x62Q3s\xf3s\x5\x18y\xb2\x8f\x92\xf3(\xfe@M\xc8" +"\xa3\x9b\xc0\xb8\x41\x8b\xce\x7\x32\xee~vF/\xb\x41Z\xa7K\xc3\x41\x41\xe3\xa3\xea" +"+\x19j\x8d}\x80\xeb\xb\xcfn\xa7=\r@/<\xaf\xc7z\xed\xd2\x89\xf9\x11* \xc1\x45U\"\xbd" +"\xc6:\xcc\"$8\x96\xf7}]\xb3X\x9d\x32\xb0'\xc1\x84+7\xfe\xb5\xdd\xfd\xa4\x1b\xf0\xa7" +"\xf2}*'\xfb\xac\xb2\x9b\x94\x87\x30r\x18\xae!LW\xb1\xc4&\xa5\xdc\x7f\x6\xcf\xe1\xa0" +"\x92\x30I\xd6I\xf4\xf6\x1d\xd0\x14\x32u\xbd\xf4\x18\xbc\xc7\x30\\\xa5\x66\xa1\xbc" +"EE\xe9\xb2\x1f\x85=\x9\xb6\xf4\xee\xe4\xb1M\xa3\xe4\xb|\xe2\x2\xf5(/g\x9e\xbf\xcc" +"[\x88\xd2W\x91\x30\x6\x84V\xe1\xdd\xc3\xe\xf6\xf3\xa0\x92mH\xb6=\xaaK\x2\x95\x16" +"\xb3\xc4\xe2\x15\x18.@\xa6\xcb\xde\x98(.\x10!f\xf0\xf7\x15\xfe\xe6q\x84\x17\xa9." +"Q8\xab\x80?#y\xa2W3$\xc7\xf5hX\xf4@\xcd@\x1\xf8\xfakL\x94\xe\xe7\xc3\x32\xd8-\n\x15" +"K\xe5\xdd\xdb\xdd\xd7\xcf\xf6\x88:\x2GO~\xad\xd1\xab\xa4\xfa\xdc*+\xb6X*{JG\x8dq" +"\xcc\xe1\x63\xca\xd5r\x89\xdd\xe7\xa0\x10\xc8\x9b\x90w\xea\x94\x84L\xce\x98\xa9\x91" +"63N\xbd\xf2\x63\xb2\xd0W\xfb\xf1\x9d\x98!\n\x8c\xf5\x85\xa2\x41_\xc6\xbf\xe9&\xeb" +"\xc5\xd3\xb1\xf6\x34-\xcc\x35\xbe\xb2\x43;]Q\x9fR\x82{\r\x88XP\xc0\xca\x39\xf2\x83" +"\xfc\x33\xa1\xf\x18\xc4l[\xbcm5T\xde_I3P\xde\x87:3i \x99]\x91\xe2jT\xfc\x8d\x9c\x9e" +"\x1ay>8\x9a\xb9>\"X\x7f\xc8\x39\x61\x81O\x8f\x37\xb2w\xd5[\xc3N\xa6\x30i*B\xfd\xc4" +"\x95\r\x1b\x41 \x10\\\xc6\xb8lf-i\x7\x31\x0g\x1c\xaao\xe0\x33<\xfc\x11`&\xda\x37" +"\x5\xcd\xad\nJ=\xe7\x7f(\x5\x1aw~\xbd\xd7xf9C?\xbd\x16\xa2\xfcI\x5\";\xfa|\xcf\xe6" +"\xbd\x93\x43\x98\x8fi\xd1\xc7\x9d+\x18\xb7$\x81m\xb0\xe\x86~\x8c\xc7\xf3\xc2|\xea" +"\xb8\x81\xea\x46\xb1\x4\xf6\x33\x98\xcc\x35qBd\x8c\xe1\xae(\x9bh\xeb\xfd\xdd\xff" +"I6\x1e\xd3k\x8a\x96\x8c\x3\xa1\xc1\xed\x1ev\x95\xc0\xd6\ru\x16\x7f\x80V\x1\x34n\xce" +"\xd5M\xb6\xe6za\x96\x43\xf3Ns\xe\x93\xfb\xa2\xda\x33\xc5Ql\x95\xe6\x2\xd9\x46\x89" +"+\xb5\n|\x1\xc9\x9c\xba\x63\xc2\xe0\x8d\xb1\xc2\x9e\x35\xeeZQ\xb0:\x1v\xae,\xbf\xe0" +"\xd3\xe4\xb0\x2\x43\xb3W\xa5\xaa\xda\x86\x9a\xdaK\xa3LA\x1c\"\xb1\x35\xf4\x2\x88" +"\x86\xdak`\xcb\x10\x9\x89\x1b\xf1<%\xf2w\xa4Y\xabv\x14\xe4<\xaf\xcdL\x1a\xc3\x14" +")\\S\xf4t\xc0\x9d\x38\x10\xc6\x65\x39\xe1\xedyN\x80\x9aV\xfe*9\xbc\x9b#VSu\xf7\xc4" +"\x99\xc1\x3\xce[\x8d\x94!\xc8jJ}\x9;\xb0\xa7\x61P\xcf\xeatR\x1\x37]Y\xb6u\x7\xc3" +">\xb1\x11\x46wv\x81\xb4[q!\"\x9a\x87>\xeeG\x80\x8e\x8f\xf1\xff\xf8?\xdbJ\x95\xd6" +"`\xb4\xa6\xa6\xb9\x7uct\xfa\xb\x97M\xa1x\x6\xcQ.\xe1\xad\x97\x86\x16\xe2V5\x9b\xaa" +"\x1c\x41\x17G\x98\x84z\xed\\\xdf\xe6\x8a\xad\xf2\xa7%JO\xa6,\xb0\xe7\x12xz%uv\xc5" +"'&$ \x82\xc4\xa1t\x96\x17\x63\xb\rirD+\xc2\xeaOUF\xd8\x31\xd4\xbe\x5\xc7\xb1\x43" +"\xc9l\xe9\x66[9$\x86\xe1\x99\xf7\xc*n\xe4[\xab\x9a\x17~\x90R#\x8a\xce\xa1\xbe\x45" +"a\x8a\xe3\x1e\x81\x32u\xcVf\xbc\x9f\x33\xfe\xa6\x31\x62\x1f\x3\xf9\x37?\x19\xa7\xdf" +"_7o\xd3\xcdjF\x11\xb2\x65\x8d\x41\x8b\x99\x36\x16\xce\xd1\x96\x95\xc1Us\xdcm\xd4" +"\xaf\xd0(\xff\xc1\x9b)}/\x9doG[\xe1\x83\x34\x44TRmb\xb4r\xdb\x43\x13Rs\x9b\xb0\xf9" +"Ye\xc7\x1f\x8f.P\xc0oV\xcL\xf8\x42_\xd0\xa0\xd9\x41\x2\x9b\xe6\x36\x10\x38\x19Y\xc9" +"\xfa|\xf0\x98\x44l\xc/\xde\xa8\xc4\x39n\xc$q\"h\x8e\x3zc\x7\r\xb0xD\xc5\xdcN?B\xf2" +"X\x86\x88#\x92\x94\xaf\xe2\x1c>2\xd2{\x9e\xb2\x2\xc\x90\x8e@o\x1b\x34\xb8\x94}U~" +"v\xc7\xb7\x15'\xep\x7\xb8\xcb\x39\xb4\xf6\x11Z\xdc\x1d\xaf\x46\x10\xbcL\x85\xe2\xea" +"\xdc\x0i@\xda~\xb0\xef\xed\xba\xaa\x14(A\xb0(jkws\xfdg\x0SI\x1#l\xec[\xe4\xbd\x18" +"\xe3\x11\x12\xea\x8b_u\x10\x17\xe\xe4#\x96<\xf1\x3\x82\xd3\xe0U>\xb\xe9?\x88J\xbd" +"\x1=2\xd3\xf9\xa4\x62\xceq\x3^M\x89\xdcl\x1Z\xa2~\xbd\xf7\xeb\x2~\xfe\r-#\xc6\xb7" +"\x12\x8a\x86\xf2\x18Sa\xe8l\xbb\x16\xcc?\x1a*\xbe\xf5\xd0\xcc\xe1y*\xb4\xca\xf8%" +"\xc4\x97\xc6\x87\x30\xbe\xec\x85\x1c\xec\x65\x9a\xe6g\xd3\xd2\x85\xee\x7w+\xc5p\x95" +"\x7f\xfe;\xabH\x0\x83\x88\x81\x9f\xb9\x98\x88\xf\xe3\xb2\x14\xb4\x12\x1bv\x82\r\xe9" +"w\xbb\xab\xa1\x11\x85\x32\xbdl\xa0\xb0,\xca\x17\x92S\xf5\xf4`Zf\xd9*\x94\"\xeb\x8c" +"\xc3\xe3\xe5\xb5\x8b\xfa\x8\xb1\x82\x41\x42\x2\x1b\x18\x13\x85q1g\x9f\x46\xa4_\\" +"\xbc\xd3\xc4\xf8#O\xe6#y\xfb=*:{9\xef\x62\x36?N%#\xc1sr7\xcf\xf1\x17\xa6\xedp\x9" +"\xee\xfo\xd8j\xb9\xa8\x66\xcf\xda\x33\r\xf1<\xf7=&g\xe7J\xf6\x18\xce\x46\x99=\x87" +"\xd6P\x7f\xb4%L\xa2\x37w\xf\x63\x39%\xba\xf\xc1\xb8\xc8\xb3\xbe\xd3\x31p^\x82\x17" +"\xdd(3\xc7\xff<\xf5\x1\xb1\xea\xc2G\xbd\x9dZ$iz\xd6\xa4\xf1\xba\xc5\xcd\xe7\x87\x36" +"'\xdb(\xe4\xfa\x42<8\xb8\x32\xae\xb6\x34\xd6\x83I14\xee\xd9\xd5@\x9e\xdc\x39\xb4" +"+\x97\x8a_\xe\xa7\xb\n\x8e\x9dl\xea\x46\x16\xf5\x9e\xd4n\x95,\x14\xc3Tl\xbeL\xbe" +"\x11v\xda\xddQ\xe7\x31\x11l\xb5\xf4G\xa7y\x17\xbe\x1e\x92\x18\xf9#\xd7JPh\x90%\xdc" +"Zs\xa8?\x13T;c\x1a\x64S\xe6\x88\x99\xd7T\xb4\x32\x91\xe3H\xefQ%r\xd7\xc5_\xe2\x2" +"e\xb9\x30G\xdf\x1a\x16\xa8q{ \xda\x96i\xcb\xbf\x9b\x95\x12\x45\xbe\x83\x92\x89\xab" +"3\xccKV@\xed\xd7\x92=\x13\xd4\x63\xda\xfc\x16\xfe\x39\xda\xc\xb4\r\xbf\x2\xed\xb5" +"\xb0H\xfal\xe5\x14\x46\xa8J\xd6\x97\x85@\x8d\xf0O\x4\xc9\xb7v\x5\x84\x9a\xa6\x43" +"\x80\x1d\xafQV\x92\x9b\xb9\x34I\xfcU\x1a\x85\x1f\xa5&\x92ST\xedp\xd9\x15\x19\xd0" +"\x9\x82\x6\xa0,\x1a\xef!\xce\xef\x83\xa2\x1b\xe8<|\x99-\x81J9\xef\xbd\xb5\"\x83\xe6" +"\x2Z$g\xe8S\xa8\x9e\xfNk\xb3\x30s\xf6\xe9\xee\x9c\x46\xe9\x31\xd3\xcb\x9f\xe0\x83" +"\xd0?P.}\xbf \x8c.\xbe\xde\xf0t\x6\xb2\x2\x86\x8c_'o\x9f\x44W\x99\x2\x41\xb2'\xb9" +"\x16\x32\x9c\x90\xb8R52\xc4\xb7\xb9\xdfm(\x89\xd9\xc4\xca\xe6\x18?\xc4\x99\x63\xfb" +"\xc0\x1b\x14V\xbe\x30\xb1\x44`\xc6\x14\x14\x17R\xf6x\xa1\x91\xc4\xfa\x87\x8e\xe7" +"N\xc0\xf4\x2\xa3Y\xdb\xa6\xf5\xfO\xd1\x91\xdf\\\xb2!\xf9\xd8\x16\xa7\x12<\xa7=\xbc" +"\x8a\xde\xdc\xdb\xe9SIn\xdc\xb0\x7f\x18\x9d\xb\xbb\x15\x9a\x7fL\xa7\xeaJ\xae\xf6" +"\x83R\xa5\x41\xad\x43!\xf2\x33\xc0\x92\xca[\xb0\x41\x9c\xa1U\x83\xae\xd9\xfd\xf4" +"b\n\x1f\x1f\x81\xe9\x4\\\x18#\x18\xbb\xd8\x1f\x89\xdd\xb8\x1e\xec\x65\xad\xe3\xbc" +".:\xee\x38G\xb7\xbb\x8\xda\x38w\xef\x80\x9mlP\x94k\x1\x4\x82,PsL\x92\xe0\x5\xfc}" +"\xbf\xccw\x96\x9a\xad\x7ux9Z\x99\x33\xc1\x7f\x64\xa9\xbf\xae\x10\xd6\xf4[\\AF\xbe" +"O\x88S\x8b\x8b\xbe\x96\x7\x84\x8d\xef\xe0\xbdP\xc7\x98kKf\xc5@\xd8\x45\x37~E\xfe" +"\xeb\x1fQL\xdf\xbc\xabq\x90?ht\xb7u\x9e\x15\r\xdc\x8b\x91\xd5\x9\x13\x62\x8c\\\x89" +"G\x95Hvk\x85\xef\x8d\r\xe2\x88R,[\xa7\xa5\xa7\xd8\xd6X:L\xab>\x15\xe9\x41\xd1\\\x9a" +"0z\xd7\xe1\xa8\x8aJv\xdf\x36t<\xe5g\xfaO\xc4\x99\x33\x3\xaf\xdf=\x86+\x89\x46=\xc7" +"\xa5\xbc=a\xc3\xe7\xba\x30O\xf3WS\xc2\xa2r\xc1G\xdb\x42\x9d;\x12\x45\xe0\x3\xe3\xa9" +"\xb7@\x2\\\x32\xd2\x91\xd9\x93\x44P\xcbK\x9f\xeb\x7f\xde\x46\xb4\xa2\x81\xaa\xbf" +"\x4\xealDTCOn\x3\x14\xb2\x30\x1\xc5x\xc0\xb4m}r]o!o\x8d\xe1\xe0\xf1\ri\x14\xf\xb3" +"\xbe\xd2\xb9\x43V\xfe\xbe\xcbX\xa9\x61\xce\x82\xd9g\x13\xdc\xcc\x64\xa7h^\x88\x43" +"\xf6\r _\x8e\x42\x8a!\xfb})\xfa;\xfe\x6\xb9\x95~\xfc\xe1\xf7\n\xc4;\xb1\xd4u\x1f" +"\xfe\xc2\x13\xd5\\KLC\xea\x46\xc6xB\xfci\xb6\xc7\x97\x7P\xdfZH\xdejn\xb5\x34\xb|" +"\xa9]1\x90|\xae$\x11\x16\xaf\xd0\x83:Y1n\x8f\xe1\xcfV,\x9dTu\xaf\xdd\x46\x1a\xba" +"\x19p\xf8\xcc\xec\xb1\xe1\xba\xe2\xa8\x64\xe1\xb4\xdf\x8b\x61\xfd\xed\x89\x87X\x4" +"\xedN[\xb3\xf1\x9\x9cI\x3^\xf3Z6\x2\"\xb9\x97\x33\x86\xcf\x98\x16\x9e\x7f\xed\xa4" +"\xc9h5\x8d\x1\x97K^+\x99\xf2\x8e\r\xbc\x14\x88:Zu\xa1\xbd\xb6\x66\xb2\"\xf4\x65\x61" +" \xf8\xe2\xf4\x9b>\x96\x61|I\x98+\xb6Q\xf8\xdeS'\x81\xfa\x7fU\xa0\xe6\x3\x91!\x14" +"\x12\x95\x42\x7f]\xe8\x4\x8f\x17\x61\xc3\x80\x1bS\x87\x33\xd4)\xe2\xdc\x9\x14\x34" +"\xeb\xd3t)\x14\x45\"ZQ \xe\xdbZ;$\xbb`(z\x1Ufz\xf2uPj\x1b\xef\xa0\xe3\x46XF\\\xf3" +"\xbb\xb1\xbd" +"\xf9\x95\x64w\xfa.\xfc.\xbf\x17\xc3vKW\x1f\xd8\xc1\x8c\x81\xde\xe5\x45\xe6\x41\x9e" +"\xd4\xd7X\x82\xeez2N\xb2\x16{\xae\x32V\xed\x45\xb2%\xebU\xd8\xefT\xac\\&D\xa6\x37" +"\xe9+\x91HM\x8d\x85\x7f\x66h\x15\x86\x35\xb7)U\xd4\xfa\xc3\xa9Y7yB)\xdb\xb5\\$\xf2" +"+\xf7Z\xbc\x61\xbb\xf\xcf\x1e\xef\x13L\x86\x1e\xa1;\xf\x33\xbc\x11\xf3P\xd0\x9c\x84" +"\x7L\xf3\xab\x83\xc\x62\xa3\xc5Z\x1\x9f\xa3Q\xef|\xb8\xe4\x1f\x31\xf4\x33\x1fZ\x97" +"\xd5?\xcaI\x82\xe2Z\xb3\xbc\xac\xa4\x9d\xab\x9c*3\x4RJ(\xe2\xb9\x10\xe0\xb8\x92." +"4_Z\xe9\x96\xa7\xed\xf7\xf9\x80\xbb\x39s3#\xe2\x44\xfe\x98\xc6\x8a\x8b\xf2j\x9dz" +"\xa9\xe8\x15\xa5\xc3<>%\xabG\x7f=\x15\x91\xba\xd5\xf5`,\x97~\xf5\x33\xc7\x6I4\xfb" +"S\xb\xac\x7f\xbd\xbb\xa2\xf0\x30k86\xfd~\x14\xe\xf5W\xeb\xde\xef\x1eQ\x15u\x9K\x86" +"K3^\xbe\xfeSZ\x1c\x35\x3\xd6\x1a\xbb\x85)\xee\xfa\x13_\xe7\x33+]0]r\xf8\x1d\xb4\xa2" +"V\n\xe1va:\xbd=v\xcey\x11\x31\\\x7f\xfc\xd0r\xf2\x36s\x8b\x39\xfa\njj\xd8Q0d+\xf9" +"[\xe1\xdf/\xeck\x92\x42\x36N\x87\xb6&\xd4\xf2VwU\xe1\x5\xa7\xf0N\xd5\xe4.\xe4\xbb" +"\xe2\x81k\xbd\xb3\xb9iu\xf2\xbe\xbb^\xde\xb1\xc4K\xa9\xab\x42\x32\xa8\x8d\xab\xca" +"\x92n\xbaq\x12\x9d\x66\xb0\xba\xa0)\xe3O%\x1b\x8c.\xa8J\xd8+\xd3\x66j\xaa\x5\x9e" +"\xd7L\xc2\xbc\xedK\xcf\x1\xee\xbd\xb5\xbb\x97\xa4\x9\x97\xe8\x42\xa1\x36\x63;\xf4" +"]\x83\xec\xa6 \x7\x9e\xeb\x65\x14\xda\xa3X\x99\x8a\xe2\x88,\xab\x98\xcf\xf\x9e\xbc" +"[\xc4\xa9\x7\xc6\xb8v\xfc\xa2\x8c\x98\x38\xbe\xc6\xc\xe1\x93u\xf8\x36\xa1,\x1aq\x82" +"b\xa2RC\xc3\xd8I\x8\x32\x41\xf2\xef\xc1\x1f}\xfd\xf4\xc\x80\xe4QJ\xc\x8bR+N\x3n\x95" +"n+\xffv[q\xe\xfb\x8fw\xce\x7\xee,\xa3{%\xf3\xd3H\xb4\x4\xef\xac\x94I\x15\xe5(\x6" +"\xc2\xf5\x32\xc5G\xef\x65\xe9k\x9).\x0\xe5\x8c\x83\xc6\xd1\xd6\xa5SDQ8\xe7\x41\xf5" +"\xfa\x17\x63\x8c\xe7\x11X'\xe3\xca\x3\xf0J\xc2\x15\x18,@\xf0P\xf5\x64\x11\xd4L\x9d" +"\xa2lNE\x86\x3\xc3%\xf6\xb2\xbe\xb7T\x15\xa1\x33;?f(\x8e\x1b\x65\x66\xa9|Y\xa1\xeb" +"1\x9c\xb0\xa5\x34\x89\xd4\x86\x96\x9cI\x9a\xa4p\x3\xb\x8T\xd6\xe5\x1f\x99\xcc\xa6" +"I\x84\xac\xba\x94\x90\xbf\x9d\x0\xb5\x1b\x64\x14\xdc\xef\x8fpnr\xbc\xedm\x94\xa5" +"\x8e\x1c]\x94N\x99\xd2\xfd\xc5\x8f\x97\xa7\x97RU5U\xd8\xcb\x4\xf9\xc7\x9cw\xd9\n" +"\x93\xe2\x7 \x0n\xc4\x61`\xde\x1f\x11\xeds\x1a\xcb\xed\x64x\xed\xfb]\xbf\x92'\n\xd1" +"\xf6\xb3\xd4\xa1\xb9\xbf;\xb2M@\xe7\xcc\x86\x8a\xbb,\xe5\xb2\xc1\x45\x30\xa8\xf8" +"3\x80\x8e\xe0\x5K\x16\xb0ZL\x93\xf3\xa8\xec\x9f\x1b\x41P\xf9\x8e\xfd\xb1.\xa7\xda" +"\xe3\x63\xc0\x9fXB85\xd0v\x8bT\xb4\x46Q\xf8\xaf\x15\x61\xb5&\x4\x9d\x18\xd5\x9eP" +"|~\xdf\x17\x9a\xe4\xe4\xdaSU\"\xcd\x9b\x1c\xf0\xd9\x0\x2\xa3x\\E\xdc\xc1te\x1bn\x1f" +"\xbdo_\xa1\x1a\xdb\x6\xaa\xdcV\x94]A\x11v\xad\x98{0\xa0\xf5\x37\x35\xab\xf6\x46\xc3" +"\n\xe9\x97\xa0\xc3M\xf\xf5z>De\xdbTE\x95\xd1\xea\x95)\x1l\x85\x65\xce\x32U\xef\r" +"\xca$\x93=\x5\xff^6j\xaf\xaeR\xdd\xc0\xfe\xcb\xcb\x18=C\x11\x8e\xd3\r=\x90p6k\xc6" +"^\xcd{\xfb\x82s\x9d\xde\xe9\xd9\x91\x19\xd8@\xdc\x16\xba\x11\xe0\xdd\xa5\xd7\x8e" +"w\x1\xe\xd8\x38\x12\xd5\x91\x98\x88V\x8d\xe4\x1f\xcf\xbf\x81\xca\x19\x1J\xcc\r\x10" +"\xf\xdc>\xa5`\xb5+U\xc4!\x1c\\\xad\x64\x18\xd2i\x2\x1dN\xfc\x90\x42P\x4PV\x81\xe2" +"\xa5\x13\xe7\xfd\x63\xb9,,\xaa\x2\xdeO\x2znl\xdd\xccy\x85\x83\xca\xe\x9c\x7\xc7z" +"\x4\x93 \xff\xcc\x42\x98\xd6\xf6\xd7\xddY\x85?\xe5\xe7\xe\x7\xbb\x5\x35\xd4\xf3\x94" +"\x1e\xd4\xe7M\x90\xa0\xc0x\xfc\xa5\x5\xdes\xb3\xa9\x95\xda\xcc\xa2:\xde\x2\x15\xdf" +")M\xc4\\n\xe4\xac\xe0\x88\x1c\x1b\xa3\x85}\xb5\x7f\x34\xc1\x8c\xb7V7\xbf\x10\xff" +"j09\xd9\xc8\x11\x80\x91\x8c|P\xac\x5\x93\x16\xcf\xfb\x61\x4\xe0\xbc\x84\x93Z\xb3" +"\xc5\xbcGj\x19\"\xa3\x98\x99\xb\x64(\xa7!\x1c\xc2\x90~\x9d\xfd\xeck\xf8\xb3U\xf6" +">\x0\xae\x81\x9d\x17\x1c\xfau\x1b-\x84+\xde\x61\xc2\x90\xc2X\xb9\xbb\xd7\x1\xde|" +"VF7\x1c\x1d\x9b\x10\xc5+^\xda\x15\x99.\x8c\x11_\x92k\xb8:\x81\xe7\xcR\xe6\x63\x1c" +"O\x8e\xba\x8f\xa6\x88\x41\xcb\x8ev3_a\x6" +"\xa9\xab\x18\xfe\x4pf\x97\x18\xd4\xfb\xfa\x99=\xffmK\xd8s\xfd\xa4MVHv\xf0\x81z\x9d" +"\\\xf4!E\x7f\xb4G\xf\xcd\xa3Q\xfd\x81\xa5KI\xa4U%`?[\xa2\xb6\x87]\xa5:\xf6\x9d\xd1" +"\xd0{_\xd8g?\xcd\x35\xe0\xb1\x38\x42\x8a\x95\xd2\x45\xa5\x93\xbc?\x99\x19\xf0\xf9" +"\x83\x80\xe6\xa0\xf4:\xc6\xd0\xb4%\xea\xbe}m\x7f\x9d\xbf\xd8\xdb\x8b\x19\xe1R\xf3" +"QC?\xe3\xb1\x4&\xccy\xdf\x8e\xab\x18#6M\xae?\x11\xc7\x97\x89'\xe9'4\xe0:\xbd\xac" +"S\xf1\xc3\xe8\x9a\xd8\xf9\xe8\xe1\xaa\x0\xc5\xbd\xb\xde\xa2\x12\xe7vQZ\xb6\xdb\x81" +"\x9d*\xe2\xbb\x9aK'\xa5\xfa\xd8\x85\xce\xa4\xc4\x87\x35\x98\x11p\x89\x13\xc1\x80" +"\xe4\xd3L\x9aI\x3\xfd\x96P\x94\xb6\x44:\x7f\x36\x99&\xd6|\x87\xcd\xa6?\xe0\xcbJ\xe2" +"3\x88Q\xb3\xa5X\x10.\xfc\xfb\xf2\x62\xf7&YBp\xca\x96\x34Q.\xc8\xa6\xf3\x87\x39\xec" +"nB\xbb\xee\x46\x13\xeaK5\xc5\x5\x19T\x11\xb#e\xf7\xd9\xe2\xc0'\xfd\xb9\x82v\xfe'" +"\x97\xcd\xc0\x6\x1QI\x85S\xfcY\xc7V\x92\xe1U\xe8\xf3\xbf\xac\xc8\xf1\x98\xd9\x8b" +"\xf8\x31\xc3\xe7\xefou!\xb7\xa6\xa6M\xa8\x42\xd5w\x9c\xd5,v\xa7\xfd\xa2'\xad\xdc" +"\xf1\xa1-\xb8\x7f\x82\xeb:Ea0%#e\xf4\x42\x17\\v\r1\xa3\xc\x44!\x86\xb6\x39?\xce\x1a" +"fl\x0\xde|\xc1\xe4\x41\x7f\x31\x11\x9\x93\x66\xf2\x93\x19\x1c\xe2W\xea\xe4\x91\x46" +"\x84\xb3tq\xca\x96\x1c\xb3\xdeH\xa6S<\xda\x42N\xd7\x35\xfd[\x83\xa3*\xc0\x61\xcf" +"=lhE<\xe6\x38\xff\xaci\x8e\x9a\xb7o\xb6x`\xe2\xb7\x30\x9a\x92H\xf7\xfe\x10\xc1O\x17" +"\xe8\xeag\xe\x44\xcc~\xf2\xa8\x81\x17\x62\xe9\xa6?!'\xc2\xffS)8\xcf\xecR\x98\xe7" +"x\xa3R\xf9\xc7\xdf/\x17\x94\xf6`\\\xbe\x63\x8d\x9a\xfb)l\x7fR\xc\xaf\xd3U\xe3\x94" +"\xe3\x91\x9a`\x7f::\xad\xa4\xc8\x93\xbk\xf6\xeb\xaa\xb\x91\xe8\x38\xdfSJ\x87\x7\x32" +"\x3^\x95:O\x15N\xc2\xe0\xddq7\xe5\xb\x7\x38\xcf\x97\xc0,\x88\xcb\xf7.\xccT\xb1\xad" +"\xee\xfa\xbf\x97\xd0\x32\x44\xb4\xb6Vv\xcb\x9$\xc6\x41\xc\x11~t|\xf9\xce\xeb.\xb3" +"\x1b'\x80\xbf\xf1\xe&\xf\xbb\x8a}[;D\xca\xf9\xe7[d\x82\xc5k\xee,h\xf9\xf8g^\x9e\x15" +"k\xdc\xd9\x93Y\xa7@\xa6h\xfd;\xd1\x1e\xa9\xd4\xef\xeb\x1b\x9c%\xe7 +3\xf5%=\xe8y" +"\xa4\x82\xffw\x99,\xc8w\xf0x\xd1\xf0p\xb5\x41G?\x82R\xe3O\xa9\xce%RQCM\xce\xc0\x46" +"\xb3N/\xd3\xbdP@\xd0\x8e\xf1\x89\xad\xcc\x31\x44\x1a\x18\x95\x10\xe1\x8d\xce\x97" +"\xbb<\xee\xba\x7f\x5\xae\xa7\x1\xda\x1f\xd9\xff\x84\xe1\x61\x89\xbb\x91\xf9=\xea" +"S\xa6\xb0\xc\xc4\xe3\x93\xcc}\xc7\xfe\xb8\x5\xe5\xd3Q-e\x8d/1\x9b\x39\x18\xdf}\xed" +"~\x88\xa5:\xaa\xe3\x81\xe1(\xf\x65_\x7\xe1\x97\xd6\x97\xdb-\xd7\r\"\xa8\x8d\x9f\x9" +"\x2\x83V\x94\xfc*\x10\x31\x8f\x34\xdc%\xa7>dR\xc8M\xa1\x61\x39\xd7)\x1d\x8d\xb\x9d" +"\xb8\x63\xed\x8c\xaa\x8e\xc2\x94\xea\xc2\xe3\x87\xf1l\x8e\x38\xf0\x42\xf\xd7\x9f" +"\xb9\x16\x13\xacj\x84\xbd\x32qP\xe6.I\x14\xf7\x1a=\xa1\x9a\x38\x98\xe6$\xd2\xea\xb0" +"\xd2\xe1\xd2~Xa\xae\xbe\xc4@\x8\x9bK\xed\xfc\xb3\xef\x89\xe4\xa5(N\x9e\xcd\xdd\x11" +"\xf7\xc3\x9bv[\xb9\xe1\x36\x97\xe5&\x19\xf0\xf7\xeb\x92@d8\xae\xcc\xe\xbf\xda\xc9" +"S\xfd\xfa\xb6h9\xe7\x97\x9e\x98\xce\x16\x1bS\xe2}\xda*m\x93\x1c\xa9@'\xc6\xc9_\xca" +"\xb8\x9c@f\xb0\x9\xd3\xb0\xfa\xb4\xedVzafh\xf0\x1e[y\n(\x86\xec\x37,\xf7\x8d\xa1" +"\xfc\x34\x19\xce\x33\x30\xff^\xaf\x8cx\xc2\xdf\x9a\x2.s\x1f|0\xf5\x99\xd7\xc5\xd3" +"R\x80V\xef\xde\x87W\xbd@r\xa8\x97<\xcc\xf8\x17\x45U\x9d\xf\x91\x9a^\x9b\xe3r\xe5" +"yx\x89\xb4\xcaj\xed`\n\x84[\x5\x1\x81@ft\x1e\xf7\x83\xdb\xb1P/j\xbc\xab*A2\xf9}\xe8" +"\xda\x83&\xbeIP\xf1h\xc1\xd5\x9aYL\x87i\x11@2\\\xcb\xecNN\x8d*\xce\xe6.;\xd6\xd1" +"Q\xb7\xbao\xbd\x98\x39`hc\x99TLS\x8b\x31\r\xc} \xb6\xfbn\x86\x9eQ1y9\xc6l\xf7o4\x8f" +"`R\xb0N\xa1\xf1\xa2\\?p\xb1\x1d\xa8\xa9)\x88\x1en\x4P\xab\x17\xc1" +"\x12YS]\xd6\x90\xbe\x86\x15*?\r?\xbd\x31\xfa\xc9\xa2\xeb\x34\x63\xceL\xea!@N\x90" +"\xb3\x94\xeV\xa4\xc9uI\x84\x11\x12\x93H\x6\xbf+c\x82\x34 \xea<\xb5\x9c\xfbi\x8f\xac" +"P\xf4\xe\x7f\x14\xc4\x45ww\xa6\xee\x8e\xe4\xf1$(e\x18\x87\xd9\xd4\xf3\x37\x95\x65" +"\xe0\xdd\xb5Y\xe5O\x10\x13L%#h1sz\x88\x5L\n\x17;\xcdp5\x18\x93\x9f-\x2r\x16+\xce" +"A6\x15&\xc1\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" +"000000000000000000000000000000000000000000000000000\r000000000000000000000000000" +"0000000000000000000000000000000000000\r00000000000000000000000000000000000000000" +"00000000000000000000000\r0000000000000000000000000000000000000000000000000000000" +"000000000\r0000000000000000000000000000000000000000000000000000000000000000\r000" +"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" +"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" +"000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n021023l_afm_len = 31920; +char* n021023l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusRomNo9L-Reg" +"uItal\nFullName Nimbus Roman No9 L Regular Italic\nFamilyName Nimbus Roman No9 L" +"\nWeight Regular\nItalicAngle -15.0\nIsFixedPitch false\nUnderlinePosition -100\n" +"UnderlineThickness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ De" +"sign & Development\nEncodingScheme AdobeStandardEncoding\nFontBBox -169 -270 101" +"0 924\nCapHeight 653\nXHeight 432\nDescender -205\nAscender 683\nStartCharMetric" +"s 316\nC 32 ; WX 250 ; N space ; B 125 0 125 0 ;\nC 33 ; WX 333 ; N exclam ; B 3" +"9 -11 302 667 ;\nC 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;\nC 35 ; WX 500" +" ; N numbersign ; B 2 0 540 676 ;\nC 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;" +"\nC 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;\nC 38 ; WX 778 ; N ampersand ; " +"B 76 -18 723 666 ;\nC 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;\nC 40 ; W" +"X 333 ; N parenleft ; B 42 -181 315 669 ;\nC 41 ; WX 333 ; N parenright ; B 16 -" +"180 289 669 ;\nC 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;\nC 43 ; WX 675 ;" +" N plus ; B 86 0 590 506 ;\nC 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;\nC 45 " +"; WX 333 ; N hyphen ; B 49 192 282 255 ;\nC 46 ; WX 250 ; N period ; B 27 -11 13" +"8 100 ;\nC 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;\nC 48 ; WX 500 ; N zero ;" +" B 32 -7 497 676 ;\nC 49 ; WX 500 ; N one ; B 49 0 409 676 ;\nC 50 ; WX 500 ; N " +"two ; B 12 0 452 676 ;\nC 51 ; WX 500 ; N three ; B 15 -7 466 676 ;\nC 52 ; WX 5" +"00 ; N four ; B 1 0 479 676 ;\nC 53 ; WX 500 ; N five ; B 15 -7 491 666 ;\nC 54 " +"; WX 500 ; N six ; B 30 -7 521 686 ;\nC 55 ; WX 500 ; N seven ; B 75 -8 537 666 " +";\nC 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;\nC 57 ; WX 500 ; N nine ; B 23 -1" +"7 492 676 ;\nC 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;\nC 59 ; WX 333 ; N sem" +"icolon ; B 27 -129 261 441 ;\nC 60 ; WX 675 ; N less ; B 84 -10 592 516 ;\nC 61 " +"; WX 675 ; N equal ; B 86 120 590 386 ;\nC 62 ; WX 675 ; N greater ; B 84 -10 59" +"2 516 ;\nC 63 ; WX 500 ; N question ; B 132 -12 472 664 ;\nC 64 ; WX 920 ; N at " +"; B 118 -18 806 666 ;\nC 65 ; WX 611 ; N A ; B -51 0 564 668 ;\nC 66 ; WX 611 ; " +"N B ; B -8 0 588 653 ;\nC 67 ; WX 667 ; N C ; B 66 -18 689 666 ;\nC 68 ; WX 722 " +"; N D ; B -8 0 700 653 ;\nC 69 ; WX 611 ; N E ; B -1 0 634 653 ;\nC 70 ; WX 611 " +"; N F ; B 8 0 645 653 ;\nC 71 ; WX 722 ; N G ; B 52 -18 722 666 ;\nC 72 ; WX 722" +" ; N H ; B -8 0 767 653 ;\nC 73 ; WX 333 ; N I ; B -8 0 384 653 ;\nC 74 ; WX 444" +" ; N J ; B -6 -18 491 653 ;\nC 75 ; WX 667 ; N K ; B 7 0 722 653 ;\nC 76 ; WX 55" +"6 ; N L ; B -8 0 559 653 ;\nC 77 ; WX 833 ; N M ; B -18 0 873 653 ;\nC 78 ; WX 6" +"67 ; N N ; B -20 -15 727 653 ;\nC 79 ; WX 722 ; N O ; B 60 -18 706 666 ;\nC 80 ;" +" WX 611 ; N P ; B 0 0 605 653 ;\nC 81 ; WX 722 ; N Q ; B 59 -183 699 666 ;\nC 82" +" ; WX 611 ; N R ; B -13 0 588 653 ;\nC 83 ; WX 500 ; N S ; B 17 -18 508 667 ;\nC" +" 84 ; WX 556 ; N T ; B 59 0 633 653 ;\nC 85 ; WX 722 ; N U ; B 102 -18 765 653 ;" +"\nC 86 ; WX 611 ; N V ; B 76 -18 688 653 ;\nC 87 ; WX 833 ; N W ; B 71 -18 906 6" +"53 ;\nC 88 ; WX 611 ; N X ; B -29 0 655 653 ;\nC 89 ; WX 556 ; N Y ; B 78 0 633 " +"653 ;\nC 90 ; WX 556 ; N Z ; B -6 0 606 653 ;\nC 91 ; WX 389 ; N bracketleft ; B" +" 21 -153 391 663 ;\nC 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;\nC 93 ; WX" +" 389 ; N bracketright ; B 12 -153 382 663 ;\nC 94 ; WX 422 ; N asciicircum ; B 0" +" 301 422 666 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333" +" ; N quoteleft ; B 171 436 310 666 ;\nC 97 ; WX 500 ; N a ; B 17 -11 476 441 ;\n" +"C 98 ; WX 500 ; N b ; B 23 -11 473 683 ;\nC 99 ; WX 444 ; N c ; B 30 -11 425 441" +" ;\nC 100 ; WX 500 ; N d ; B 15 -13 527 683 ;\nC 101 ; WX 444 ; N e ; B 31 -11 4" +"12 441 ;\nC 102 ; WX 278 ; N f ; B -147 -207 424 678 ;\nC 103 ; WX 500 ; N g ; B" +" 8 -206 472 441 ;\nC 104 ; WX 500 ; N h ; B 19 -9 478 683 ;\nC 105 ; WX 278 ; N " +"i ; B 49 -11 264 654 ;\nC 106 ; WX 278 ; N j ; B -124 -207 276 654 ;\nC 107 ; WX" +" 444 ; N k ; B 14 -11 461 683 ;\nC 108 ; WX 278 ; N l ; B 40 -11 279 683 ;\nC 10" +"9 ; WX 722 ; N m ; B 12 -9 704 441 ;\nC 110 ; WX 500 ; N n ; B 14 -9 474 441 ;\n" +"C 111 ; WX 500 ; N o ; B 27 -11 468 441 ;\nC 112 ; WX 500 ; N p ; B -75 -205 469" +" 442 ;\nC 113 ; WX 500 ; N q ; B 25 -209 483 441 ;\nC 114 ; WX 389 ; N r ; B 45 " +"0 412 441 ;\nC 115 ; WX 389 ; N s ; B 16 -13 366 442 ;\nC 116 ; WX 278 ; N t ; B" +" 37 -11 296 546 ;\nC 117 ; WX 500 ; N u ; B 42 -11 475 441 ;\nC 118 ; WX 444 ; N" +" v ; B 21 -18 426 441 ;\nC 119 ; WX 667 ; N w ; B 16 -18 648 441 ;\nC 120 ; WX 4" +"44 ; N x ; B -27 -11 447 441 ;\nC 121 ; WX 444 ; N y ; B -24 -206 426 441 ;\nC 1" +"22 ; WX 389 ; N z ; B -2 -81 380 428 ;\nC 123 ; WX 400 ; N braceleft ; B 51 -177" +" 407 687 ;\nC 124 ; WX 275 ; N bar ; B 105 -18 171 666 ;\nC 125 ; WX 400 ; N bra" +"ceright ; B -7 -177 349 687 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 " +";\nC 161 ; WX 389 ; N exclamdown ; B 59 -205 321 474 ;\nC 162 ; WX 500 ; N cent " +"; B 77 -143 472 560 ;\nC 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;\nC 164 ; " +"WX 167 ; N fraction ; B -169 -10 337 676 ;\nC 165 ; WX 500 ; N yen ; B 27 0 603 " +"653 ;\nC 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;\nC 167 ; WX 500 ; N secti" +"on ; B 53 -162 461 666 ;\nC 168 ; WX 500 ; N currency ; B -22 53 522 597 ;\nC 16" +"9 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;\nC 170 ; WX 556 ; N quotedbllef" +"t ; B 166 436 514 666 ;\nC 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;\nC" +" 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;\nC 173 ; WX 333 ; N guilsing" +"lright ; B 52 37 282 403 ;\nC 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;\nC 175" +" ; WX 500 ; N fl ; B -141 -204 518 682 ;\nC 177 ; WX 500 ; N endash ; B -6 197 5" +"05 243 ;\nC 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;\nC 179 ; WX 500 ; N d" +"aggerdbl ; B 22 -143 491 666 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181" +" 310 ;\nC 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;\nC 183 ; WX 350 ; N b" +"ullet ; B 40 191 310 461 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 10" +"1 ;\nC 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;\nC 186 ; WX 556 ; N q" +"uotedblright ; B 151 436 499 666 ;\nC 187 ; WX 500 ; N guillemotright ; B 55 37 " +"447 403 ;\nC 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;\nC 189 ; WX 1000 ; N" +" perthousand ; B 25 -19 1010 706 ;\nC 191 ; WX 500 ; N questiondown ; B 28 -205 " +"367 473 ;\nC 193 ; WX 333 ; N grave ; B 121 492 311 664 ;\nC 194 ; WX 333 ; N ac" +"ute ; B 180 494 403 664 ;\nC 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;\nC" +" 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;\nC 197 ; WX 333 ; N macron ; B 99 " +"532 411 583 ;\nC 198 ; WX 333 ; N breve ; B 117 492 418 650 ;\nC 199 ; WX 333 ; " +"N dotaccent ; B 207 508 305 606 ;\nC 200 ; WX 333 ; N dieresis ; B 107 508 405 6" +"06 ;\nC 202 ; WX 333 ; N ring ; B 155 508 355 707 ;\nC 203 ; WX 333 ; N cedilla " +"; B -30 -217 182 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;\nC 20" +"6 ; WX 333 ; N ogonek ; B -20 -169 200 40 ;\nC 207 ; WX 333 ; N caron ; B 121 49" +"2 426 661 ;\nC 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;\nC 225 ; WX 889 ; N " +"AE ; B -27 0 911 653 ;\nC 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;\nC 2" +"32 ; WX 556 ; N Lslash ; B -8 0 559 653 ;\nC 233 ; WX 722 ; N Oslash ; B 60 -105" +" 699 722 ;\nC 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;\nC 235 ; WX 310 ; N ordmas" +"culine ; B 67 406 362 676 ;\nC 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;\nC 245 ;" +" WX 278 ; N dotlessi ; B 49 -11 235 441 ;\nC 248 ; WX 278 ; N lslash ; B 37 -11 " +"307 683 ;\nC 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;\nC 250 ; WX 667 ; N o" +"e ; B 20 -12 646 441 ;\nC 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;\nC" +" -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;\nC -1 ; WX 722 ; N Uacute ; B 1" +"02 -18 765 876 ;\nC -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;\nC -1 ; WX 55" +"6 ; N Tcaron ; B 59 0 633 873 ;\nC -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;\n" +"C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;\nC -1 ; WX 611 ; N Racute ; B -13 0" +" 588 876 ;\nC -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;\nC -1 ; WX 722 ; N Oti" +"lde ; B 60 -18 706 836 ;\nC -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;\nC " +"-1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 706 876 ;\nC -1 ; WX 722 ; N Uhungaruml" +"aut ; B 102 -18 765 876 ;\nC -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;\nC -1 ; W" +"X 722 ; N Eth ; B -8 0 700 653 ;\nC -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;\nC" +" -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;\nC -1 ; WX 722 ; N Uring ; B 102 -18 " +"765 919 ;\nC -1 ; WX 500 ; N gbreve ; B 8 -206 502 650 ;\nC -1 ; WX 444 ; N eogo" +"nek ; B 31 -169 444 441 ;\nC -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;\nC " +"-1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;\nC -1 ; WX 722 ; N Ugrave ; B 102 -1" +"8 765 876 ;\nC -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;\nC -1 ; WX 444 ; N eacute" +" ; B 31 -11 459 664 ;\nC -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;\nC -1 ; " +"WX 521 ; N dcaron ; B 15 -13 641 683 ;\nC -1 ; WX 444 ; N ccedilla ; B 26 -217 4" +"25 441 ;\nC -1 ; WX 444 ; N ccaron ; B 30 -11 484 661 ;\nC -1 ; WX 444 ; N cacut" +"e ; B 30 -11 458 664 ;\nC -1 ; WX 500 ; N aogonek ; B 17 -169 500 441 ;\nC -1 ; " +"WX 500 ; N aring ; B 17 -11 476 707 ;\nC -1 ; WX 500 ; N atilde ; B 17 -11 511 6" +"24 ;\nC -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;\nC -1 ; WX 444 ; N egrave ; " +"B 31 -11 412 664 ;\nC -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;\nC -1 ; WX 500" +" ; N aacute ; B 17 -11 487 664 ;\nC -1 ; WX 500 ; N adieresis ; B 17 -11 489 606" +" ;\nC -1 ; WX 722 ; N Uogonek ; B 102 -169 765 653 ;\nC -1 ; WX 500 ; N ugrave ;" +" B 42 -11 475 664 ;\nC -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;\nC -1 ; WX 50" +"0 ; N udieresis ; B 42 -11 479 606 ;\nC -1 ; WX 278 ; N tcaron ; B 37 -11 378 66" +"6 ;\nC -1 ; WX 389 ; N scommaaccent ; B 16 -270 366 442 ;\nC -1 ; WX 556 ; N Zca" +"ron ; B -6 0 606 873 ;\nC -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;\nC -1" +" ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;\nC -1 ; WX 500 ; N acircumflex ;" +" B 17 -11 476 661 ;\nC -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;\nC -1 ; WX " +"389 ; N scaron ; B 16 -13 454 661 ;\nC -1 ; WX 611 ; N Amacron ; B -51 0 564 795" +" ;\nC -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;\nC -1 ; WX 556 ; N Tcommaaccen" +"t ; B 59 -270 633 653 ;\nC -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;\nC -1 ; " +"WX 500 ; N thorn ; B -75 -205 469 683 ;\nC -1 ; WX 611 ; N Emacron ; B -1 0 634 " +"795 ;\nC -1 ; WX 722 ; N Ograve ; B 60 -18 706 876 ;\nC -1 ; WX 722 ; N Oacute ;" +" B 60 -18 706 876 ;\nC -1 ; WX 722 ; N Odieresis ; B 60 -18 706 818 ;\nC -1 ; WX" +" 667 ; N Ntilde ; B -20 -15 727 836 ;\nC -1 ; WX 667 ; N Ncaron ; B -20 -15 727 " +"873 ;\nC -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;\nC -1 ; WX 556 ; N Lcaron " +"; B -8 0 596 666 ;\nC -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;\nC -1 ; WX 333 ;" +" N Idotaccent ; B -8 0 384 818 ;\nC -1 ; WX 389 ; N racute ; B 45 0 431 664 ;\nC" +" -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;\nC -1 ; WX 500 ; N ohungarumlaut" +" ; B 27 -11 570 664 ;\nC -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;\nC -1 ; WX " +"500 ; N Euro ; B 57 0 668 693 ;\nC -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 66" +"1 ;\nC -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;\nC -1 ; WX 300 ; N twosu" +"perior ; B 33 271 324 676 ;\nC -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 " +";\nC -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;\nC -1 ; WX 333 ; N Iacute ; B -8 " +"0 403 876 ;\nC -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;\nC -1 ; WX 333 ; N Iog" +"onek ; B -8 -169 384 653 ;\nC -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;\nC -1" +" ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;\nC -1 ; WX 722 ; N Umacron ; B 102 -18" +" 765 795 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 7 -270 722 653 ;\nC -1 ; WX 500 ;" +" N ograve ; B 27 -11 468 664 ;\nC -1 ; WX 500 ; N Scommaaccent ; B 17 -270 508 6" +"67 ;\nC -1 ; WX 611 ; N Eogonek ; B -1 -169 651 653 ;\nC -1 ; WX 500 ; N oacute " +"; B 27 -11 487 664 ;\nC -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;\nC -1 ; WX" +" 278 ; N iogonek ; B 49 -169 278 654 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 8 -20" +"6 472 706 ;\nC -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;\nC -1 ; WX 500 ; N" +" ntilde ; B 14 -9 476 624 ;\nC -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;\nC -1 " +"; WX 611 ; N Ecaron ; B -1 0 634 873 ;\nC -1 ; WX 611 ; N Ecircumflex ; B -1 0 6" +"34 873 ;\nC -1 ; WX 389 ; N scedilla ; B -2 -217 366 442 ;\nC -1 ; WX 389 ; N rc" +"aron ; B 45 0 454 661 ;\nC -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;\nC -1 ; WX " +"611 ; N Eacute ; B -1 0 634 876 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 52 -270 72" +"2 666 ;\nC -1 ; WX 611 ; N Rcommaaccent ; B -13 -270 588 653 ;\nC -1 ; WX 611 ; " +"N Edieresis ; B -1 0 634 818 ;\nC -1 ; WX 500 ; N nacute ; B 14 -9 487 664 ;\nC " +"-1 ; WX 500 ; N uogonek ; B 42 -169 500 441 ;\nC -1 ; WX 500 ; N umacron ; B 42 " +"-11 495 583 ;\nC -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;\nC -1 ; WX 278 ; N lc" +"aron ; B 40 -11 395 683 ;\nC -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;\nC -1 ;" +" WX 667 ; N Cacute ; B 66 -18 689 876 ;\nC -1 ; WX 667 ; N Ccedilla ; B 66 -217 " +"689 666 ;\nC -1 ; WX 400 ; N degree ; B 101 390 387 676 ;\nC -1 ; WX 611 ; N Aog" +"onek ; B -51 -169 707 668 ;\nC -1 ; WX 675 ; N minus ; B 86 220 590 286 ;\nC -1 " +"; WX 675 ; N multiply ; B 93 8 582 497 ;\nC -1 ; WX 675 ; N divide ; B 86 -11 59" +"0 517 ;\nC -1 ; WX 611 ; N Aring ; B -51 0 564 904 ;\nC -1 ; WX 980 ; N trademar" +"k ; B 30 247 957 653 ;\nC -1 ; WX 389 ; N rcommaaccent ; B 35 -270 412 441 ;\nC " +"-1 ; WX 278 ; N lacute ; B 40 -11 376 876 ;\nC -1 ; WX 500 ; N omacron ; B 27 -1" +"1 495 583 ;\nC -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;\nC -1 ; WX 278 ; N ici" +"rcumflex ; B 34 -11 328 661 ;\nC -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;\nC " +"-1 ; WX 500 ; N ncommaaccent ; B 14 -270 474 441 ;\nC -1 ; WX 278 ; N lcommaacce" +"nt ; B -21 -270 279 683 ;\nC -1 ; WX 675 ; N plusminus ; B 86 0 590 568 ;\nC -1 " +"; WX 750 ; N onehalf ; B 34 -10 749 676 ;\nC -1 ; WX 750 ; N onequarter ; B 33 -" +"10 736 676 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;\nC -1 ; WX 27" +"8 ; N iacute ; B 49 -11 356 664 ;\nC -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;\n" +"C -1 ; WX 444 ; N kcommaaccent ; B 14 -270 461 683 ;\nC -1 ; WX 722 ; N Omacron " +"; B 60 -18 706 795 ;\nC -1 ; WX 278 ; N imacron ; B 49 -11 384 583 ;\nC -1 ; WX " +"444 ; N emacron ; B 31 -11 467 583 ;\nC -1 ; WX 500 ; N amacron ; B 17 -11 495 5" +"83 ;\nC -1 ; WX 278 ; N tcommaaccent ; B -21 -270 296 546 ;\nC -1 ; WX 444 ; N y" +"dieresis ; B -24 -206 441 606 ;\nC -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606" +" ;\nC -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;\nC -1 ; WX 389 ; N zacute ; B " +"-2 -81 431 664 ;\nC -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;\nC -1 ; WX 500" +" ; N uhungarumlaut ; B 42 -11 570 664 ;\nC -1 ; WX 500 ; N eth ; B 27 -11 482 68" +"3 ;\nC -1 ; WX 500 ; N uring ; B 42 -11 475 707 ;\nC -1 ; WX 722 ; N Ocircumflex" +" ; B 60 -18 706 873 ;\nC -1 ; WX 333 ; N commaaccent ; B 7 -270 146 -40 ;\nC -1 " +"; WX 760 ; N copyright ; B 41 -18 719 666 ;\nC -1 ; WX 760 ; N registered ; B 41" +" -18 719 666 ;\nC -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;\nC -1 ; WX 278" +" ; N idieresis ; B 49 -11 353 606 ;\nC -1 ; WX 494 ; N lozenge ; B 18 0 466 740 " +";\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 564 ; N notequal ; B 30 " +"-3 534 509 ;\nC -1 ; WX 549 ; N radical ; B -2 -65 526 924 ;\nC -1 ; WX 611 ; N " +"Agrave ; B -51 0 564 876 ;\nC -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;\nC -1 ;" +" WX 675 ; N lessequal ; B 84 0 592 628 ;\nC -1 ; WX 675 ; N greaterequal ; B 84 " +"0 592 628 ;\nC -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;\nC -1 ; WX 713 ; " +"N summation ; B 14 -123 695 752 ;\nC -1 ; WX 494 ; N partialdiff ; B 26 -10 462 " +"753 ;\nC -1 ; WX 667 ; N Ncommaaccent ; B -20 -270 727 653 ;\nC -1 ; WX 500 ; N " +"dcroat ; B 15 -13 558 683 ;\nC -1 ; WX 275 ; N brokenbar ; B 105 -18 171 666 ;\n" +"C -1 ; WX 556 ; N Lcommaaccent ; B -8 -270 559 653 ;\nC -1 ; WX 611 ; N Adieresi" +"s ; B -51 0 564 818 ;\nC -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;\nC -1 ; WX 25" +"0 ; N .notdef ; B 125 0 125 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 9" +"98\nKPX A C -50\nKPX A Ccedilla -50\nKPX A G -44\nKPX A O -45\nKPX A Odieresis -" +"45\nKPX A Q -44\nKPX A T -14\nKPX A U -57\nKPX A Uacute -57\nKPX A Ucircumflex -" +"57\nKPX A Udieresis -57\nKPX A Ugrave -57\nKPX A V -81\nKPX A W -75\nKPX A Y -21" +"\nKPX A a -4\nKPX A b 0\nKPX A c -18\nKPX A ccedilla -28\nKPX A comma 8\nKPX A d" +" -4\nKPX A e -17\nKPX A g -25\nKPX A guillemotleft -44\nKPX A guilsinglleft -43\n" +"KPX A hyphen -13\nKPX A o -17\nKPX A period 8\nKPX A q -12\nKPX A quotedblright " +"-92\nKPX A quoteright -92\nKPX A t -6\nKPX A u -9\nKPX A v -50\nKPX A w -44\nKPX" +" A y -57\nKPX Aacute C -50\nKPX Aacute G -44\nKPX Aacute O -45\nKPX Aacute Q -44" +"\nKPX Aacute T -14\nKPX Aacute U -57\nKPX Aacute V -81\nKPX Aacute W -75\nKPX Aa" +"cute Y -21\nKPX Aacute a -4\nKPX Aacute b 0\nKPX Aacute c -18\nKPX Aacute comma " +"8\nKPX Aacute d -4\nKPX Aacute e -17\nKPX Aacute g -25\nKPX Aacute guillemotleft" +" -44\nKPX Aacute guilsinglleft -43\nKPX Aacute hyphen -13\nKPX Aacute o -17\nKPX" +" Aacute period 8\nKPX Aacute q -12\nKPX Aacute quoteright -92\nKPX Aacute t -6\n" +"KPX Aacute u -9\nKPX Aacute v -50\nKPX Aacute w -44\nKPX Aacute y -57\nKPX Acirc" +"umflex C -50\nKPX Acircumflex G -44\nKPX Acircumflex O -45\nKPX Acircumflex Q -4" +"4\nKPX Acircumflex T -14\nKPX Acircumflex U -57\nKPX Acircumflex V -81\nKPX Acir" +"cumflex W -75\nKPX Acircumflex Y -21\nKPX Acircumflex comma 8\nKPX Acircumflex p" +"eriod 8\nKPX Adieresis C -50\nKPX Adieresis G -44\nKPX Adieresis O -45\nKPX Adie" +"resis Q -44\nKPX Adieresis T -14\nKPX Adieresis U -57\nKPX Adieresis V -81\nKPX " +"Adieresis W -75\nKPX Adieresis Y -21\nKPX Adieresis a -4\nKPX Adieresis b 0\nKPX" +" Adieresis c -18\nKPX Adieresis comma 8\nKPX Adieresis d -4\nKPX Adieresis g -25" +"\nKPX Adieresis guillemotleft -44\nKPX Adieresis guilsinglleft -43\nKPX Adieresi" +"s hyphen -13\nKPX Adieresis o -17\nKPX Adieresis period 8\nKPX Adieresis q -12\n" +"KPX Adieresis quotedblright -92\nKPX Adieresis quoteright -92\nKPX Adieresis t -" +"6\nKPX Adieresis u -9\nKPX Adieresis v -50\nKPX Adieresis w -44\nKPX Adieresis y" +" -57\nKPX Agrave C -50\nKPX Agrave G -44\nKPX Agrave O -45\nKPX Agrave Q -44\nKP" +"X Agrave T -14\nKPX Agrave U -57\nKPX Agrave V -81\nKPX Agrave W -75\nKPX Agrave" +" Y -21\nKPX Agrave comma 8\nKPX Agrave period 8\nKPX Aring C -50\nKPX Aring G -4" +"4\nKPX Aring O -45\nKPX Aring Q -44\nKPX Aring T -14\nKPX Aring U -57\nKPX Aring" +" V -81\nKPX Aring W -75\nKPX Aring Y -21\nKPX Aring a -4\nKPX Aring b 0\nKPX Ari" +"ng c -18\nKPX Aring comma 8\nKPX Aring d -4\nKPX Aring e -17\nKPX Aring g -25\nK" +"PX Aring guillemotleft -44\nKPX Aring guilsinglleft -43\nKPX Aring hyphen -13\nK" +"PX Aring o -17\nKPX Aring period 8\nKPX Aring q -12\nKPX Aring quotedblright -92" +"\nKPX Aring quoteright -92\nKPX Aring t -6\nKPX Aring u -9\nKPX Aring v -50\nKPX" +" Aring w -44\nKPX Aring y -57\nKPX Atilde C -50\nKPX Atilde G -44\nKPX Atilde O " +"-45\nKPX Atilde Q -44\nKPX Atilde T -14\nKPX Atilde U -57\nKPX Atilde V -81\nKPX" +" Atilde W -75\nKPX Atilde Y -21\nKPX Atilde comma 7\nKPX Atilde period 7\nKPX B " +"A -23\nKPX B AE -35\nKPX B Aacute -23\nKPX B Acircumflex -23\nKPX B Adieresis -2" +"3\nKPX B Aring -23\nKPX B Atilde -23\nKPX B O -14\nKPX B OE -6\nKPX B Oacute -14" +"\nKPX B Ocircumflex -14\nKPX B Odieresis -14\nKPX B Ograve -14\nKPX B Oslash -14" +"\nKPX B V -32\nKPX B W -29\nKPX B Y -39\nKPX C A -14\nKPX C AE -30\nKPX C Aacute" +" -14\nKPX C Adieresis -14\nKPX C Aring -14\nKPX C H -13\nKPX C K -21\nKPX C O -1" +"9\nKPX C Oacute -19\nKPX C Odieresis -19\nKPX Ccedilla A -18\nKPX D A -36\nKPX D" +" Aacute -36\nKPX D Acircumflex -36\nKPX D Adieresis -36\nKPX D Agrave -36\nKPX D" +" Aring -36\nKPX D Atilde -36\nKPX D J -32\nKPX D T -9\nKPX D V -42\nKPX D W -36\n" +"KPX D X -40\nKPX D Y -50\nKPX F A -72\nKPX F Aacute -72\nKPX F Acircumflex -72\n" +"KPX F Adieresis -72\nKPX F Agrave -72\nKPX F Aring -72\nKPX F Atilde -72\nKPX F " +"J -60\nKPX F O -40\nKPX F Odieresis -40\nKPX F a -77\nKPX F aacute -78\nKPX F ad" +"ieresis -52\nKPX F ae -82\nKPX F aring -70\nKPX F comma -95\nKPX F e -83\nKPX F " +"eacute -83\nKPX F hyphen -45\nKPX F i -36\nKPX F j -41\nKPX F o -79\nKPX F oacut" +"e -79\nKPX F odieresis -52\nKPX F oe -75\nKPX F oslash -80\nKPX F period -99\nKP" +"X F r -52\nKPX F u -50\nKPX G A -17\nKPX G AE -29\nKPX G Aacute -17\nKPX G Acirc" +"umflex -17\nKPX G Adieresis -17\nKPX G Agrave -17\nKPX G Aring -17\nKPX G Atilde" +" -17\nKPX G T -13\nKPX G V -5\nKPX G W -2\nKPX G Y -12\nKPX J A -40\nKPX J AE -5" +"2\nKPX J Adieresis -40\nKPX J Aring -40\nKPX K C -55\nKPX K G -53\nKPX K O -46\n" +"KPX K OE -45\nKPX K Oacute -46\nKPX K Odieresis -46\nKPX K S 6\nKPX K T 21\nKPX " +"K a -5\nKPX K adieresis -5\nKPX K ae -5\nKPX K aring -5\nKPX K e -18\nKPX K hyph" +"en -57\nKPX K o -18\nKPX K oacute -18\nKPX K odieresis -18\nKPX K u -10\nKPX K u" +"dieresis -10\nKPX K y -89\nKPX L A 44\nKPX L AE 32\nKPX L Aacute 44\nKPX L Adier" +"esis 44\nKPX L Aring 44\nKPX L C 6\nKPX L Ccedilla 4\nKPX L G 11\nKPX L O 10\nKP" +"X L Oacute 10\nKPX L Ocircumflex 10\nKPX L Odieresis 10\nKPX L Ograve 10\nKPX L " +"Otilde 10\nKPX L S 20\nKPX L T -13\nKPX L U -8\nKPX L Udieresis -8\nKPX L V -55\n" +"KPX L W -48\nKPX L Y -20\nKPX L hyphen 47\nKPX L quotedblright -92\nKPX L quoter" +"ight -92\nKPX L u 12\nKPX L udieresis 10\nKPX L y -26\nKPX N A -20\nKPX N AE -32" +"\nKPX N Aacute -20\nKPX N Adieresis -20\nKPX N Aring -20\nKPX N C -21\nKPX N Cce" +"dilla -20\nKPX N G -14\nKPX N O -20\nKPX N Oacute -20\nKPX N Odieresis -20\nKPX " +"N a -22\nKPX N aacute -23\nKPX N adieresis -23\nKPX N ae -27\nKPX N aring -23\nK" +"PX N comma -13\nKPX N e -28\nKPX N eacute -30\nKPX N o -25\nKPX N oacute -27\nKP" +"X N odieresis -27\nKPX N oslash -27\nKPX N period -16\nKPX N u -24\nKPX N udiere" +"sis -25\nKPX O A -38\nKPX O AE -70\nKPX O Aacute -38\nKPX O Adieresis -38\nKPX O" +" Aring -38\nKPX O T -3\nKPX O V -45\nKPX O W -39\nKPX O X -41\nKPX O Y -51\nKPX " +"Oacute A -38\nKPX Oacute T -3\nKPX Oacute V -45\nKPX Oacute W -39\nKPX Oacute Y " +"-51\nKPX Ocircumflex T -3\nKPX Ocircumflex V -45\nKPX Ocircumflex Y -51\nKPX Odi" +"eresis A -38\nKPX Odieresis T -3\nKPX Odieresis V -45\nKPX Odieresis W -39\nKPX " +"Odieresis X -41\nKPX Odieresis Y -51\nKPX Ograve T -3\nKPX Ograve V -45\nKPX Ogr" +"ave Y -51\nKPX Oslash A -38\nKPX Otilde T -3\nKPX Otilde V -45\nKPX Otilde Y -51" +"\nKPX P A -79\nKPX P AE -116\nKPX P Aacute -79\nKPX P Adieresis -79\nKPX P Aring" +" -79\nKPX P J -89\nKPX P a -74\nKPX P aacute -74\nKPX P adieresis -64\nKPX P ae " +"-80\nKPX P aring -74\nKPX P comma -118\nKPX P e -79\nKPX P eacute -79\nKPX P hyp" +"hen -64\nKPX P o -73\nKPX P oacute -73\nKPX P odieresis -64\nKPX P oe -67\nKPX P" +" oslash -74\nKPX P period -121\nKPX R C -26\nKPX R Ccedilla -25\nKPX R G -20\nKP" +"X R O -26\nKPX R OE -18\nKPX R Oacute -26\nKPX R Odieresis -26\nKPX R T 0\nKPX R" +" U -36\nKPX R Udieresis -36\nKPX R V -31\nKPX R W -28\nKPX R Y -19\nKPX R a -3\n" +"KPX R aacute -3\nKPX R adieresis -3\nKPX R ae -3\nKPX R aring -3\nKPX R e -15\nK" +"PX R eacute -15\nKPX R hyphen -29\nKPX R o -15\nKPX R oacute -15\nKPX R odieresi" +"s -15\nKPX R oe -15\nKPX R u -7\nKPX R uacute -7\nKPX R udieresis -7\nKPX R y 0\n" +"KPX S A -2\nKPX S AE -14\nKPX S Aacute -2\nKPX S Adieresis -2\nKPX S Aring -2\nK" +"PX S T 1\nKPX S V 5\nKPX S W 8\nKPX S Y -1\nKPX S t -13\nKPX T A -33\nKPX T AE -" +"45\nKPX T Aacute -33\nKPX T Acircumflex -33\nKPX T Adieresis -33\nKPX T Agrave -" +"33\nKPX T Aring -33\nKPX T Atilde -33\nKPX T C -15\nKPX T G -7\nKPX T J -39\nKPX" +" T O -20\nKPX T OE -8\nKPX T Oacute -20\nKPX T Ocircumflex -20\nKPX T Odieresis " +"-20\nKPX T Ograve -20\nKPX T Oslash -20\nKPX T Otilde -20\nKPX T S -2\nKPX T V 4" +"1\nKPX T W 43\nKPX T Y 33\nKPX T a -81\nKPX T ae -81\nKPX T c -86\nKPX T colon -" +"84\nKPX T comma -70\nKPX T e -90\nKPX T g -102\nKPX T guillemotleft -102\nKPX T " +"guilsinglleft -101\nKPX T hyphen -68\nKPX T i -16\nKPX T j -20\nKPX T o -87\nKPX" +" T oslash -89\nKPX T period -71\nKPX T r -87\nKPX T s -74\nKPX T semicolon -92\n" +"KPX T u -86\nKPX T v -72\nKPX T w -69\nKPX T y -70\nKPX U A -50\nKPX U AE -69\nK" +"PX U Aacute -50\nKPX U Acircumflex -50\nKPX U Adieresis -50\nKPX U Aring -50\nKP" +"X U Atilde -50\nKPX U comma -35\nKPX U m -28\nKPX U n -29\nKPX U p -32\nKPX U pe" +"riod -39\nKPX U r -41\nKPX Uacute A -50\nKPX Uacute comma -35\nKPX Uacute m -28\n" +"KPX Uacute n -29\nKPX Uacute p -32\nKPX Uacute period -39\nKPX Uacute r -41\nKPX" +" Ucircumflex A -50\nKPX Udieresis A -50\nKPX Udieresis b 1\nKPX Udieresis comma " +"-35\nKPX Udieresis m -28\nKPX Udieresis n -29\nKPX Udieresis p -32\nKPX Udieresi" +"s period -39\nKPX Udieresis r -41\nKPX Ugrave A -50\nKPX V A -66\nKPX V AE -102\n" +"KPX V Aacute -66\nKPX V Acircumflex -66\nKPX V Adieresis -66\nKPX V Agrave -66\n" +"KPX V Aring -66\nKPX V Atilde -66\nKPX V C -48\nKPX V G -42\nKPX V O -48\nKPX V " +"Oacute -48\nKPX V Ocircumflex -48\nKPX V Odieresis -48\nKPX V Ograve -48\nKPX V " +"Oslash -48\nKPX V Otilde -48\nKPX V S -15\nKPX V T 32\nKPX V a -67\nKPX V ae -72" +"\nKPX V colon -82\nKPX V comma -76\nKPX V e -74\nKPX V g -84\nKPX V guillemotlef" +"t -82\nKPX V guilsinglleft -81\nKPX V hyphen -45\nKPX V i -16\nKPX V o -70\nKPX " +"V oslash -72\nKPX V period -80\nKPX V r -45\nKPX V semicolon -79\nKPX V u -40\nK" +"PX V y -16\nKPX W A -57\nKPX W AE -85\nKPX W Aacute -57\nKPX W Acircumflex -57\n" +"KPX W Adieresis -57\nKPX W Agrave -57\nKPX W Aring -57\nKPX W Atilde -57\nKPX W " +"C -39\nKPX W G -33\nKPX W O -39\nKPX W Oacute -39\nKPX W Ocircumflex -39\nKPX W " +"Odieresis -39\nKPX W Ograve -39\nKPX W Oslash -39\nKPX W Otilde -39\nKPX W S -17" +"\nKPX W T 30\nKPX W a -53\nKPX W ae -58\nKPX W colon -77\nKPX W comma -58\nKPX W" +" e -60\nKPX W g -75\nKPX W guillemotleft -68\nKPX W guilsinglleft -67\nKPX W hyp" +"hen -32\nKPX W i -18\nKPX W o -56\nKPX W oslash -58\nKPX W period -62\nKPX W r -" +"40\nKPX W semicolon -74\nKPX W u -35\nKPX W y -11\nKPX X C -50\nKPX X O -44\nKPX" +" X Odieresis -44\nKPX X Q -42\nKPX X a -3\nKPX X e -15\nKPX X hyphen -41\nKPX X " +"o -15\nKPX X u -7\nKPX X y -67\nKPX Y A -27\nKPX Y AE -39\nKPX Y Aacute -27\nKPX" +" Y Acircumflex -27\nKPX Y Adieresis -27\nKPX Y Agrave -27\nKPX Y Aring -27\nKPX " +"Y Atilde -27\nKPX Y C -52\nKPX Y G -45\nKPX Y O -52\nKPX Y Oacute -52\nKPX Y Oci" +"rcumflex -52\nKPX Y Odieresis -52\nKPX Y Ograve -52\nKPX Y Oslash -52\nKPX Y Oti" +"lde -52\nKPX Y S -15\nKPX Y T 32\nKPX Y a -72\nKPX Y ae -75\nKPX Y colon -78\nKP" +"X Y comma -64\nKPX Y e -78\nKPX Y g -94\nKPX Y guillemotleft -93\nKPX Y guilsing" +"lleft -92\nKPX Y hyphen -60\nKPX Y i -16\nKPX Y o -75\nKPX Y oslash -77\nKPX Y p" +" -52\nKPX Y period -65\nKPX Y semicolon -86\nKPX Y u -58\nKPX Y v -32\nKPX Z v -" +"12\nKPX Z y -28\nKPX a j -22\nKPX a quoteright -28\nKPX a v 1\nKPX a w 4\nKPX a " +"y 2\nKPX aacute v 1\nKPX aacute w 4\nKPX aacute y 2\nKPX adieresis v 1\nKPX adie" +"resis w 4\nKPX adieresis y 2\nKPX ae v 2\nKPX ae w 5\nKPX ae y 6\nKPX agrave v 1" +"\nKPX agrave w 4\nKPX agrave y 2\nKPX aring v 1\nKPX aring w 4\nKPX aring y 2\nK" +"PX b v -10\nKPX b w -7\nKPX b y -3\nKPX c h -30\nKPX c k -29\nKPX comma one -40\n" +"KPX comma quotedblright -39\nKPX comma quoteright -39\nKPX e quoteright -21\nKPX" +" e t -16\nKPX e v 0\nKPX e w 2\nKPX e x -10\nKPX e y 4\nKPX eacute v 0\nKPX eacu" +"te w 2\nKPX eacute y 4\nKPX ecircumflex v 0\nKPX ecircumflex w 2\nKPX ecircumfle" +"x y 4\nKPX eight four 13\nKPX eight one -50\nKPX eight seven -1\nKPX f a -26\nKP" +"X f aacute -27\nKPX f adieresis -2\nKPX f ae -30\nKPX f aring -17\nKPX f e -32\n" +"KPX f eacute -34\nKPX f f 30\nKPX f i 17\nKPX f j 13\nKPX f l 42\nKPX f o -29\nK" +"PX f oacute -30\nKPX f odieresis -2\nKPX f oe -24\nKPX f oslash -31\nKPX f quote" +"right 18\nKPX f s -20\nKPX f t 18\nKPX five four -5\nKPX five one -71\nKPX five " +"seven -28\nKPX four four 12\nKPX four one -69\nKPX four seven -27\nKPX g a -41\n" +"KPX g adieresis -42\nKPX g ae -46\nKPX g aring -42\nKPX g e -45\nKPX g eacute -4" +"5\nKPX g l -46\nKPX g oacute -41\nKPX g odieresis -41\nKPX g r -21\nKPX guillemo" +"tright A -25\nKPX guillemotright AE -51\nKPX guillemotright Aacute -25\nKPX guil" +"lemotright Adieresis -25\nKPX guillemotright Aring -25\nKPX guillemotright T -77" +"\nKPX guillemotright V -76\nKPX guillemotright W -67\nKPX guillemotright Y -81\n" +"KPX guilsinglright A -24\nKPX guilsinglright AE -50\nKPX guilsinglright Aacute -" +"24\nKPX guilsinglright Adieresis -24\nKPX guilsinglright Aring -24\nKPX guilsing" +"lright T -76\nKPX guilsinglright V -75\nKPX guilsinglright W -66\nKPX guilsinglr" +"ight Y -80\nKPX h quoteright -31\nKPX h y -4\nKPX hyphen A 3\nKPX hyphen AE -23\n" +"KPX hyphen Aacute 3\nKPX hyphen Adieresis 3\nKPX hyphen Aring 3\nKPX hyphen T -4" +"6\nKPX hyphen V -43\nKPX hyphen W -34\nKPX hyphen Y -53\nKPX i T -10\nKPX i j -3" +"1\nKPX k a 12\nKPX k aacute 12\nKPX k adieresis 12\nKPX k ae 9\nKPX k aring 12\n" +"KPX k comma 27\nKPX k e 5\nKPX k eacute 5\nKPX k g -27\nKPX k hyphen -27\nKPX k " +"o 6\nKPX k oacute 6\nKPX k odieresis 6\nKPX k period 26\nKPX k s 7\nKPX k u 8\nK" +"PX k udieresis 8\nKPX l v -12\nKPX l y -11\nKPX m p -4\nKPX m v -6\nKPX m w -4\n" +"KPX m y -3\nKPX n T -41\nKPX n p -7\nKPX n quoteright -34\nKPX n v -10\nKPX n w " +"-7\nKPX n y -6\nKPX nine four 2\nKPX nine one -64\nKPX nine seven -5\nKPX o T -6" +"3\nKPX o quoteright -24\nKPX o t -15\nKPX o v -18\nKPX o w -15\nKPX o x -33\nKPX" +" o y -10\nKPX oacute v -18\nKPX oacute w -15\nKPX oacute y -10\nKPX ocircumflex " +"t -16\nKPX odieresis t -16\nKPX odieresis v -18\nKPX odieresis w -15\nKPX odiere" +"sis x -33\nKPX odieresis y -10\nKPX ograve v -18\nKPX ograve w -15\nKPX ograve y" +" -10\nKPX one comma -52\nKPX one eight -57\nKPX one five -55\nKPX one four -69\n" +"KPX one nine -61\nKPX one one -69\nKPX one period -56\nKPX one seven -60\nKPX on" +"e six -50\nKPX one three -55\nKPX one two -50\nKPX one zero -41\nKPX p t -14\nKP" +"X p y -4\nKPX period one -39\nKPX period quotedblright -38\nKPX period quoterigh" +"t -38\nKPX q c -13\nKPX q u -11\nKPX quotedblbase A 1\nKPX quotedblbase AE -13\n" +"KPX quotedblbase T -64\nKPX quotedblbase V -96\nKPX quotedblbase W -84\nKPX quot" +"edblbase Y -69\nKPX quotedblleft A -88\nKPX quotedblleft AE -141\nKPX quotedblle" +"ft Aacute -88\nKPX quotedblleft Adieresis -88\nKPX quotedblleft Aring -88\nKPX q" +"uotedblleft T -19\nKPX quotedblleft V -17\nKPX quotedblleft W -15\nKPX quotedbll" +"eft Y -25\nKPX quotedblright A -94\nKPX quotedblright AE -147\nKPX quotedblright" +" Aacute -94\nKPX quotedblright Adieresis -94\nKPX quotedblright Aring -94\nKPX q" +"uotedblright T -21\nKPX quotedblright V -22\nKPX quotedblright W -19\nKPX quoted" +"blright Y -30\nKPX quoteleft A -78\nKPX quoteleft AE -131\nKPX quoteleft Aacute " +"-78\nKPX quoteleft Adieresis -78\nKPX quoteleft Aring -78\nKPX quoteleft T -9\nK" +"PX quoteleft V -8\nKPX quoteleft W -5\nKPX quoteleft Y -15\nKPX quoteright A -87" +"\nKPX quoteright AE -140\nKPX quoteright Aacute -87\nKPX quoteright Adieresis -8" +"7\nKPX quoteright Aring -87\nKPX quoteright comma -73\nKPX quoteright d -79\nKPX" +" quoteright o -78\nKPX quoteright period -78\nKPX quoteright r -57\nKPX quoterig" +"ht s -63\nKPX quoteright t -49\nKPX quoteright v -28\nKPX quoteright w -26\nKPX " +"quoteright y -28\nKPX r a -29\nKPX r aacute -29\nKPX r acircumflex -29\nKPX r ad" +"ieresis -29\nKPX r ae -36\nKPX r agrave -29\nKPX r aring -29\nKPX r c -26\nKPX r" +" ccedilla -17\nKPX r colon -28\nKPX r comma -68\nKPX r d -31\nKPX r e -35\nKPX r" +" eacute -35\nKPX r ecircumflex -35\nKPX r egrave -35\nKPX r f 23\nKPX r g -21\nK" +"PX r h -17\nKPX r hyphen -52\nKPX r i 8\nKPX r j 4\nKPX r k -15\nKPX r l -21\nKP" +"X r m 17\nKPX r n 16\nKPX r o -28\nKPX r oacute -28\nKPX r ocircumflex -28\nKPX " +"r odieresis -28\nKPX r oe -23\nKPX r ograve -28\nKPX r oslash -29\nKPX r p 13\nK" +"PX r period -72\nKPX r q -31\nKPX r quoteright -4\nKPX r r 4\nKPX r s -17\nKPX r" +" semicolon -28\nKPX r t 12\nKPX r u 11\nKPX r v 30\nKPX r w 32\nKPX r x 7\nKPX r" +" y 33\nKPX r z 0\nKPX s quoteright -20\nKPX s t -12\nKPX seven colon -88\nKPX se" +"ven comma -79\nKPX seven eight -32\nKPX seven five -53\nKPX seven four -65\nKPX " +"seven one -47\nKPX seven period -83\nKPX seven seven -11\nKPX seven six -37\nKPX" +" seven three -42\nKPX seven two -13\nKPX six four 17\nKPX six one -64\nKPX six s" +"even -37\nKPX t S -9\nKPX t a -6\nKPX t aacute -6\nKPX t adieresis -6\nKPX t ae " +"-10\nKPX t aring -6\nKPX t colon -29\nKPX t e -13\nKPX t eacute -13\nKPX t h -11" +"\nKPX t o -11\nKPX t oacute -11\nKPX t odieresis -11\nKPX t quoteright -19\nKPX " +"t semicolon -26\nKPX three four -9\nKPX three one -76\nKPX three seven -15\nKPX " +"two four -12\nKPX two one -45\nKPX two seven -22\nKPX u quoteright -31\nKPX v a " +"-24\nKPX v aacute -26\nKPX v acircumflex -26\nKPX v adieresis -26\nKPX v ae -29\n" +"KPX v agrave -26\nKPX v aring -26\nKPX v atilde -26\nKPX v c -26\nKPX v colon -4" +"8\nKPX v comma -46\nKPX v e -30\nKPX v eacute -32\nKPX v ecircumflex -32\nKPX v " +"egrave -32\nKPX v g -36\nKPX v hyphen 0\nKPX v l -29\nKPX v o -26\nKPX v oacute " +"-28\nKPX v odieresis -28\nKPX v ograve -28\nKPX v oslash -29\nKPX v period -51\n" +"KPX v s -30\nKPX v semicolon -48\nKPX w a -26\nKPX w aacute -28\nKPX w acircumfl" +"ex -28\nKPX w adieresis -28\nKPX w ae -31\nKPX w agrave -28\nKPX w aring -28\nKP" +"X w atilde -28\nKPX w c -28\nKPX w colon -49\nKPX w comma -47\nKPX w e -32\nKPX " +"w eacute -34\nKPX w ecircumflex -34\nKPX w egrave -34\nKPX w g -38\nKPX w hyphen" +" -4\nKPX w l -30\nKPX w o -28\nKPX w oacute -30\nKPX w odieresis -30\nKPX w ogra" +"ve -30\nKPX w oslash -31\nKPX w period -51\nKPX w s -32\nKPX w semicolon -49\nKP" +"X x a 6\nKPX x c 0\nKPX x e 0\nKPX x eacute 0\nKPX x o 1\nKPX x q 2\nKPX y a -12" +"\nKPX y aacute -12\nKPX y acircumflex -12\nKPX y adieresis -12\nKPX y ae -17\nKP" +"X y agrave -12\nKPX y aring -12\nKPX y atilde -12\nKPX y c -15\nKPX y colon -48\n" +"KPX y comma -21\nKPX y e -19\nKPX y eacute -19\nKPX y ecircumflex -19\nKPX y egr" +"ave -19\nKPX y g -34\nKPX y hyphen 7\nKPX y l -18\nKPX y o -15\nKPX y oacute -15" +"\nKPX y odieresis -15\nKPX y ograve -15\nKPX y oslash -16\nKPX y period -25\nKPX" +" y s -19\nKPX y semicolon -45\nKPX zero four 14\nKPX zero one -50\nKPX zero seve" +"n -3\nEndKernPairs\nEndKernData\nEndFontMetrics\n" +; +int n021023l_pfb_len = 45458; +char* n021023l_pfb = +"\x80\x1~\x6\x0\x0%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05\n%%CreationDate" +": Wed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Develo" +"pment\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file " +"COPYING (GNU General Public License) for license conditions.\n% As a special exc" +"eption, permission is granted to include this font\n% program in a Postscript or" +" PDF file that consists of a document that\n% contains text to be displayed or p" +"rinted using this font, regardless\n% of the conditions or license applying to t" +"he document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05)" +" readonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. " +"See the file COPYING (GNU General Public License) for license conditions. As a s" +"pecial exception, permission is granted to include this font program in a Postsc" +"ript or PDF file that consists of a document that contains text to be displayed " +"or printed using this font, regardless of the conditions or license applying to " +"the document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999" +" by (URW)++ Design & Development) readonly def\n/FullName (Nimbus Roman No9 L Re" +"gular Italic) readonly def\n/FamilyName (Nimbus Roman No9 L) readonly def\n/Weig" +"ht (Regular) readonly def\n/ItalicAngle -15.5 def\n/isFixedPitch false def\n/Und" +"erlinePosition -100 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName" +" /NimbusRomNo9L-ReguItal def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-169 -2" +"70 1010 924} readonly def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0" +" 0.0] readonly def\n/Encoding StandardEncoding def\n/UniqueID 5020937 def\ncurre" +"ntdict end\ncurrentfile eexec\r\x80\x2\xec\xa8\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1" +"\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1" +"fK\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88" +"\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3" +"\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2" +"P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81" +"\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>m\xb5" +"\xb9\x9c\x8d_\xab\xb6\x6m\xe5\x99\x4\x92\xcd\xee\x63\x62k\xf\xaf$u\xd8\xb5\x8f\xc4" +"\x3\xfd\xcf\x43\xc0\x34\x80u\xd6l\xbai\"\x95\xaa\x62\x63\x8f\xaa\xbb\x42\x8f|\x9c" +"\xc2*/?\xb8\x1f;\xc2\x66\x9d\x2\xdb\xf7\xd2-\xb2\xa9\xdf\xa3I4\xde\x3\x8e\x82\xdf" +"BkG3\xd3\xff\xd3\xef\xb0\x8\xc3\xf6\n+_\xa2v=\xad\xd8`d\xc3\xde\xb8\x81\xfa\x33\xe0" +"\x82\xf2x\xfe\xe6\x8b\x46\xf6\x10\xb2VT\xae\x96 }\x81H\xe0\xf5N\xf9\xbbx)c\xfe\xeb" +"l\xbd\x36\x64\x18\x42\x19[K\x1e\x42\x17\x39rra\xe5\x7fJP\xf6)i\x87\xde\x8f\x66_X" +"#8\x88\xaf\x1f\xfb=\xbdW|\x97pS;\xac\x6\xa0\xe3\xcb\x91\xdf\xb6\xe0\x31\xe\x8d\xf1" +"\xda\x1f\xdb\\\x32[\xba\x61$\x4\xb3\x98\xe3\x92\xcd\xec\x45\xa4W\xd1\xe2\xb7/M\xad" +"\xceMH\xc4\x39U\xd4\xc1\x94\xde\xf0\xc1\xd5\xf3\xb4\xb\xc5<\xcf\x66\x8w\xac\xca\xec" +"%\xcd\xe6;3\xc3\x8c\xf4\xe7'\xd8LT\x18\xbb\xedr\xafQ\x11\xea\xa1S{\xcbi\x83\x10\x45" +"\x1d\xb0\xecQ(a\xae\xde\xce~H\xf2\xe4\x8bR\x81#\xe0T]\xba\xc9\x61\xf6\x8f\x46\x2" +"\xcd\r\x94\xd4ux\x87\x8eQ\xc0j+C\xc9\xed\xef)\x19\xa6\x8fx\x9d!\xcd\x7\xe9\xa3\xdd" +"\xe4;v\x1d\x33\x88/\xfds\xcb\xd2\xa6\x44\xeb\xe9\xc1\xea\xf6\xfd\\\xeeH\xb2+A}}\xb7" +"\xf3\r\x8f\xf9\xe7\xd7\xb1\x8a!\xad\x85\x9a\x1f\x4\xee\xa0\xfb;P\x87)\xa5\xfe-c\x82" +"\xf2\xb0\xf8\xe0x\x80:\x9d$SU\xda\x2\xd3\x1j\xb2\xc8\xb2X;Mw\xd3\xac\xfb\xc3JU\x9d" +"5\xbb\xd0\x37\xe9\xc5p\\\xe7'\xc2\x64\x94 w{ C\xdc\x95\xe3&\x84\xe5\x9e\x30\x0\x95" +"E\xce\x0\x8eX\x91\x89\xf\x30\xe5\x9b\x9\x85\xc1j\xb2\x18\xd4\x37K\x99\xe8\x14G\x4" +"\n\xc6x\xbb\n\xa5\x84? h\x85G\x9c\xce|\xdbS?\xaa\x80\xd6%\xf1Y\xc2\x7f\x86\x41\xbd" +"\xc7\x65\xf7\x8\r\x35\xbd\xbc\x9c-\x15\xa3\x1c\x66\x87\x8)\xa7\xe\x7f\xcf\x61H\x89" +"5\xe5\x35\xb6r\xecW(\xc6}\xe8\xce\xa9!\xb4\x93\xd0\x8d\xd3;\x90$\xa6\xa2W\xac\xbc" +"\xff=\x9a\r\x62'\xdf\x1e\x8c\x8c\xf1\xb2\x14\x9a\x9e\xaf\xa1\x62\xf1\x8bZ\xe8I\xc7" +"\xa9imLq\xaf\x9b\x46,|\r\xa5G\x1b\x18\xbb\x99\xf2\xaevU\x16\xfa\x3\xb9\x87V\xb7\xdf" +"v\n\xc4\xd0\xb9\xf8\x85+\xbcg\x86\x96\xff\x9c\x95|d\xb2\x93\x9e\xcdm\xdc\x18\x85" +"]\xe0gG\xb2\xf5\xf5\xc4\xfc\x4Q\xf6\x9f\xa6\x10\xech\xbf\xe\x92=\xcf\x36\xb5}2\x92" +"\xf2\x91\xf4M3\xc5\xa6\xb5\xbe\x7fPe\xe4\x1cl\xaf\xb0\x65|,\xf8\xec\xf8\xc6\x42\xa3" +"\xb1\xe1\x1e\x9a\x7f\r\x44\xb6Zg\x8b\x1d\xe0\xeb\x5\x19\xa2\x31\xae^\x96m\x8e\x84" +"\xc6n \xf2\xdf\x99\x0\xf7\xdc\x83\x85\x98 \xe8\xf6\xd0\xd7\xfa\x8a$.\xbd\xff\ni\xd7" +"p\xc6\xca\xe\x35\x8e\x7n5\xe0\x63\xbK\x9e\x93\xb6I\xab\xd9\x8f\xe2\x9e\x46\xa3\x63" +"]*c^(l\xb7\x32\xe4\xe0\x32G\xda\x2\x45u\x16N\x16\x97\xaa\xfc\xcf\x12J\xf3\xc0h(\xfa" +"z\xef\x4\x64\xf8\n\x95U+O+\x95R\xc8\x6\xaf\x86\x80\xce\x1e\xac\x41\xa1\xa5Y\xe5\xd0" +"\xe2{R0\xe\xfd\xb9\x91\x8cmHF\xb6\x2\xe7\x94\xb\xad\xe0\x81\xb9\x96\x5\xa1\xf4\xad" +"Nof\xf0\x32~\x8dZF\x87\xee_\xdc\x6W\x1f\xbcso\xd8\xcaP\xcf\xfbn.\x8b\x87\x1b\x96" +"\xfdN\xf<\xdfY\xac\x88\x8&\xa8\x98\x8e\x1f#z9\xef>\xcd-+V\xbd\xf/\xc2\xd4\xf9\x11" +"g]\xeb\x9t\x19<\x7f\xd6*\x83\x96G\x9d\xad\xf9\xddP\x6\xaf(g\xael(}\x16\xf9`\x7\xaf" +"\xa6Z\xf4\xfb\x64\xeaI\xd4\x85\x36\x81i\xd5P\x5\xa0$J\xe3[E#x]\xa7\xaf\xf8\x14TD" +"\xa2\xc6\x12\xda\xdd\xbb\x9\xf2Z[\x1d\x96?HX(\x96\x37t\xd2&\xc9\xb3\xfb\xbf\xe9\xdf" +"=\xd3}Y\xfdM\xba\x19@\xac\x1fS\xa8\xefH\xb8M\x0\x1f\\\x97\xb6X\x1d\xbb\xe3\x19_\x6" +"\xc3Xw\x17\xc2\x9f\xee\nN?d\xa9\x95\xc6\xd0w\xe0\xdf\x80\xae\xbb\\\xa9\xb4\xc4\x97" +"\xad\xee\x9a\xde\xc8\xcb\x81|J\xd5&`:\xe5\x1f\xf4\x42\x66\x32\xf2\xf6\xfb\xb6\x80" +"\xbb\xf\xb0\x87\xe0Y\xc1rx\xb4\x30\x13\xda\x6\xff\x41\x18\xec\x96Q\xc4p`\xc7\xf\xa5" +"\x8a\xc\xe1,\xf2/\x8d\x2\xbe\x7\xad\xcc\x9cV#\xe7\xdaSE>\xe1\xe6r\x8c\x7\x1f\xc3" +"\xfa\x65t\xe2\xca\x1c\x35\x92\x95\xc7\xd2\x96 t3J\x84@\x88_,\x85(\xc8\x83v\xc6\xf9" +"=W\x8bG\xfa\xbb\x11\xf5\xf0S\x8f\xffTqc)\x9a\x8!\xe4,\x97\xcc\xa2\xcc\xd7\xb1)\xe4" +"'\xfdz\xba\xfeZt\xa5\xa1\xdfH\xbb\xd1r\xcc\xe6\xcd+`\xec!&_\xafP\xec\xa1\x86\xab" +"\xa6\xceo\xb6=p\x7\x43#\x1d\x30\x33\xbe\x61\x1c\x8a\xd1o\xa9\xa2\xf5$\xf1\x1d?\xc3" +"g\xe4\x61\xab\xf5\x65\xbd\xde\xab\xaf\x38[\xb0\xff\xb6\x34[x6\x95\x30\xeIa\xe4?>" +"t5\xb7\x95W\x9e\xe3Q\xd9\x97\xdaX\x11\xcd\x45j\xc4\x16U\x19\x12\xa8\x9d\x32s\x9d" +"\x3\xe8\xe2\x43\xcw\xce\x97\xacw\xb3\x8a\xe5\xbb\x3\xe3\xa6~\xef\x8f\xb2\x7\xac\xb0" +"\xe1\xdd\x11GGbb\x4:d-f\xa4\xfd\xac\xfb\xe\x9a\xbf\xda\x12\x18\xdd\x62[d\xfc\xe5" +"\xd4\xb2L%\x4\x5\n\x88\x1c\xa0~\xce\xa1;g\xc3\x82'r\xb6x\xe7\xfdR#\xb9V\xd9\x45\x80" +"\x8f\x9b\x97\xc7\x35\xa3\xab\x88\xdb\x31\xa8\xb1L*\xc6}\xa0\xc5\x17O\xc4\x9f\xe4" +"\x1b\x61/\xcc\x5-\x8\xc1v\x4\xab\x43\xdb\xe2\x6>9\xe2y\x9d\xb1\xe7k`;\x8\xf3J!\xfe" +"C\x0\xaa\rz\x91\x1c\xfa\xe6\xce\x35)\x16\x45\xaf\xbe\xd9\xcd\x0 N~\xb0\x34;eG\xfc" +"\xce\x9c>s\xdc\xe4\x18\xdc\xba\x81\xd1\xa0?\xce\x87\x32\xdeT@\xff\x98\x35l\x6\x34" +"\xa1%\xc6H\x81\xdc\x5I\xe2\x9a\x82\xc8.\xb4\xaf\x99\x98\x7fo\xfdQ_\xbeW\xd3\x90\x86" +"w'S#\x9f\x92\x36\xa2\xb6\xaa\xbb\xdb\xc4\x19\xef\xe2\xbd\xaa\xc+\xde\x84\xc4\x33" +"\xf4\xd7S\xf6\xcc\xf\x3\xe7\x9fZY!\x0\x82\xcb\xbdm\x84\xacL\xaa\"\xea\x30\xf3\xdf" +"Mk\xb4 |\xbc\x1bg\xe4\x9\x86\xcdO!5\x4\xb0\xcc\x32\xfe\x84-\x89\x65\xa9\xe3\xb5\xf2" +"8\xbf\xe2\xfaOXr\x83\xeeu\xb0\xc6\xf1\x8f\xec\xc1\xce\x37\x34\x87,\xdb\xa5\x30\xe9" +"y\\\xbe\xd2\xc7\xca\xa8\xe2\x92!\x17\xab\x1W\xa1\xd9z\x8a\xd9\xedL\x84[GzR\xf0\xbe" +"}\"\x14\xe9\x1d\xdf\x98\x1\x0l\xf6\xfd~N\xf8\xbaJ\xc3\x11\xb5u\xf<\xea\x17\xe6\xf6" +"\xeb\x6\x8e\x9a\xd2\xcb\x30\xd4\xa4\xe0\xaf\xdc:\xa7\xaa\xb2I\xf7\x6\xde!h\x10\x88" +"\x4\xa4\xdc\x1b\xf5\"\xb8`\x92\xe5\xc9\x90\x98\x34^\xb2\x12\x37h\x9c\x91L\xda\xcd" +"\x8eR\xa8\x7\x41}CA_\xc0k\xe\xc1i(\x1fo\xcayA\xd7\xcc\x38\xb0\x9d\xfe^<\xd9\xee\x84" +"\x12\x90,\xb8\x8d\x44\x31\x9f\xba\x90G\xe9\x3\xc3\x46~Q\xd9\x1\xeeGO\xc8\xae\\\xc9" +"\xfc{J)\xff\xb9\xe5\x3&D,\x14\x94\x8fy\x80\x66Z5\x82\x33\xc6[\xda]o\x6T\xd9\xb8u" +"\xe9\\\xa8\x16\xa9\x15q\x80h\xfe\xb3[\xa1\x18\xbe\xb4V\x3\xa3\x98\xe0X\x5\x7\x63" +"u\x2G\xaaI\xa1\x8f\x12\x30Xy\xe2\x30\xe5\xaaZ\xc1t#\xa7\xc1{\xbe\x83\xafV\x90(#\xcd" +"8\xfd\xf5<\x81V\xdd\xd1\x96Ym\rR\x81\xc2\x98\x42\x18\xbcNR\x1\xe5\x88\xd5s)\x7f\xe1" +"\xe3K'~\xb4\x11\x46\xcc\xbd\xa3p\x82\x80\x86\xff\xb6\x83\x7\x83\x93\x89N\x9e)7&y" +"88\x85(\xc5+g\xe7\x8d\xcd\r`\xaf\x90\xc8\xf1\x95\x34\xcai\x17 C\xe\r\xe1'\x8c\xd5" +"h\xa9\xaaq\x1e\x31\xc5vxy\xaam\xda\xbc\xfb)\x84\xbe~\xf3\xd8\x9a \x10\x62\x38M\xb" +"k\xca\\wc\xb2\x83Y\x18\x65\x18\xd1\x1}\xe\xf0\xf4\x97\xd6\x9c(\xe0\x43\xc0\xbd\xb3" +"\x88\x34\xa8\xfc\xe1r\x9bX/\xf5'sE\x14T/\x1\xe4\x85\x7fY\xdb\xa8``\xe9\xf0\x99\xfa" +"q]\xec\xe2k\xe\xfa\xc4T\xc5@\xe1\xae\xb8S\x1d\xa9\xe8|/\rz\x3o\xe4H\xd2\x61\xaf\x1a" +"\xde\xbb\xc6\xe7zt\xaa\xd6\x46\xfaS;\xee\x10\x91K=;+q\xff\xdf\xf6\x64u\xe9\xfa\xea" +"\xc8\x9a\x64\x43\x95\x9f\xae\xf4\x33\x37\xee\x16\x87\xe2\x17\x13\x33\x8\x1b\x92\x0" +"\x96\xa0`\x93)o\xd3\xc4\x66\xe2p\xb0\x15orZh\xf4\xcG$\x16\xb3\x13\x5\x84\xc9\x63" +"#\x19\xb2S\xdb\xb3)@\xbe\x16\x17\xb0\x11\xa1\x1d+\xad\x11\x62\x2\x44\x34\n\xea\xc1" +"\x87\x1\x45PJb*e\x8f\xcf\x9f%x\xa3\x30`\x1b\xed\x12|p\x18\xc5\x98\xeb\x37\x99\xce" +"\xdd\x13,U\x1a\xbb\xdd\xeb\x38\xa6~\xccW\xc5\x84#\x1a\x82(\x4\x97\\Ic%\xe5IoT\xef" +"z\x0Q\xffj\x11\xe7\x38\xd4^\xde\xce\x8a\x92\x43\xe3\xd1\x66\x97\xc5\xff\xbc\xeb\xc4" +"\xc4\xbd\xaa\xed\xfd.\xbf}H\xdb\xbe\xd9Q\xbe\x96\xec\x19\xe8\x62\xa1\xc3\x80\x33" +"\x99\x9c\x98\x9d\xc0\xcd\xaa\x30\xa0\x87\xc5\x8ev@\xea\x8b\x32\x44\xaa\xe1\x37v\xa9" +"\xb8\x64\x38\x34^\xd1\xc4\xebp\x9d\x5\xaa^\xc0\xd3j\xa6\xdcl \xb3Z?+\xa9[\xc2S\xcc" +"#\xc\xdct\x18\xe8\xd6\x38\x36Q[\x8d\xe\x14\xa2\x6\xf4\xac\xd6x\x7f\x9dLM\xc9\x43" +"\x15\x32\xd7[\xc\xb4X\x96,\xae??\xceJ.D\x85m\xda\xd0\x84~\xfe\x44\xc7\x2\xb0\xde" +"=\x93r\x18\xb8zg\x81\xdd\x38\xb1\xa4\xac\xe4\xb1$\x11\xb\xea\xd6\xfew,\xf2i\x4{?" +"\xe1\x14<\xc1\x84\xc9v\n\xba\x9c\xbe\xab\xde\x34qm\xd5\xba\xc4\x83\x30\r\x65\xb\xbd" +"\x1e\x19\xb5\xc7\x38\xf9\xb1\xb0K\xed\xa4P*\xbd\x12\xe6\xb3\x2\x97\x62LQ\x13\x1M" +"\xcc\xe4z\x8a\xba\xe0\xf4\x66\x1f\xd2\xcf\xdf\x35\xad\x44\"\xb2\x8c\xf2\x87\xa1R" +"" +"\xc7\x64\x13\x94\x19\x37\x39#\xd5j\xd2]\xd4\xa8\x5\x8e\x91\xe4Pi\xbc\xb0\xa3\x37" +"\xe5L\x3\xd5l\xed\x11\x11Z\xf7}\xb5?\x80Z\x87?\xfd`\xf5\xa3\x83\xd3\xde\xc5\x8b\xc" +"O\xd9:\xac\x8\xfb\xdb\xfc\xb9%/\xcc\xda<\xd2\xa9\xc1\x93\xcb\xe,\xba,n\xb2\n\xe\x0" +"6\xfc<\xd9\xe2\xfd\xe3\x84\n\xa4-\x11\x97T\xda\xebL\x88\xc6\x6\xd7Q\xe9T\xc8\x18" +"\x8d\x1d\xe4\xe9\x61\x39Q\xaa\xcf\x66\xc8\x9;\n\x91j\x4\x1d\xb5\x44\xf6\xd2\x2\xe9" +"\x81o\x86\xd9\xe1#t%C\x8\xf6Y\xd2pDp\xf2?\x1c\xc4^\xe5\xb7)\xeeP*\x86$\xfcl\xc\x94" +" +\xa4`2\xa8\x16\x89\x1\xec~+\xb1\x39\x15t\\\x7f!\xf1+\xf8;\xeT\xad\xa5s\xff=@\x9c" +"\x86\xfc\xaf_\xab\xaa\xea\xe9\x98\x8\x6\xe4\x3y\xf4\x18\x6\xb7\xc3\xd7\x32\nnk\x2" +"SuC\xc6\xe3\x9e\x82T\xed\xfb\xac\xc5\xe3\xe9Ir\x7\x31\xdc\xe4\xf7\n\"\x1e\xec\xd4" +"%\xff\x9c\xd9\x95\xde\xaf\xe9\xe0\xb\x1\xfa\xd7p]\x8d\xfa\xe1\xa4lU\xb\xae\x9\x97" +"\x9c\xb4\xc1?\xddw\x15\xed\xde\x1a\xd0\xb2`\xd2W0\xf8y\xcfg\xa7\xf4\xab\x46\xdc\xad" +"\n\x6\x88\xe0X\xab\x32\xe2\x1bq\x8f\xcb\x38\xc8I\xb8'\x8a\x81\xf0T\xbc\x8c?i\x93" +"\xb\x65\xcf\xb7\xbb\x93[\x1a\x11{\xffPXCc\xed\xb2\xet[&\xcd/\xa9\xd7\xc4N\xa4\xbe" +"\x12\xbd\x86\xfeL\xd0\x39\xbb\x45\x80\x39M\xdb\xb0\x64\xbb^o\x16\xa2\xc5\x1d\x96" +"\x8e\xc\xd8\xdc\xa0\x43\xdb@\x19\xbc\x81\"\x65O\x3\xf9\xbf\xf9\xc5\x1b\xa3\x66\xd4" +"*\x86\x18\x94\xbb\x91y\x7fh\n\xfb\x3{\xb6'\xe0\xfb=\xe8\xca\x37\x4\x8o\xa4\x17\x81" +"E\xdc\x1a\xc8\xc0\xd9H\xfb\x90Z)b\x1d\x12\xf2\xd9\xf8_\xdb\xee\x98&\xda\x1\xdd\xf" +"\xe1\xb0\\\x8e\xad\x9f\x9e\xa9\xdc\x1f/'\x94\x1cX\xe4\xf5\xb\x90m\x8e^~\xf9\x1a\xc1" +"\xac\x38\xf\x35\xcb}N8.*H\x15\x9d\xddOM\xfc\xbcr\xb8+\xc4\xe4\xed\xdd\xd3\\\xc4\xdd" +"8w\x86\x80\x9a\xbc\xa2\x12\x9f^\xc2H\x94\xff\xec\xda\xb2\xd4\"\xaa\xdaPa\x1f\xc0" +"\xf2[\x4q=_\x1c\x87yOBV\x2\xb\xf2\x19+\x95\x94\x62sg\x4\x85,\x8c\x9a" +"\x13K[C\xdf\\\xe8\xd3\x9d\x61\x8fOvas\x92!\x85=\xfd\xfa\x7\xfe\x94\x1\x1a\xb\x87" +"e)\xa1u\xe\x1d\xf3\xfc\x94T\x8d\x37\x39\xb2`\xcc\xea\xd2\x2\xaa\xbaqN\xea\xf6\xb" +"\x11\xb3\xc1\x18\xc2\xbc{:E\xd6\xff\nj 2q\xb9Xb\x11\x31\xd0\xf1\x19\xdf\x86\xb6/" +"F\xe3\x84\x8bsg\xdfh\xc3\xde e\xa7rs\xb3\x62\x2mM\xea\xdd\xbai#\xfd\x8cn&\xcf\x9f" +"\xb0\x3\x9d\xa5\xf6\"\xf9\x31J\xfe\x42\x85\xc7\x31\x35\x13:\x1c\x84\x36\xd7\x11y" +"\x1U\xe1\x7\xa4>\xf4y\x5\x8e\xc3 \xec\xbd|\x97\x93\xc9\xa5h\xc4\x2\xe5\xb6N\xd3\x16" +"\xd8\xe1\xafs\xb8\xb8)\x85\x96\x39\xfe\xf4\xeb\xff\xff\xbbtd\x0:\x1b\xe4\xe6x\xaf" +"h\xff\xdb\x41i5\xbf\xd2\xb3\xb7L\xf6\xfa\x8d\xf\x19\xa6\xc8\x91\xc4\xd8\x97\x33y" +"\xd1\x44\x8d\x9a\xdd\x63\xff\xcc\xe9\xad\xf1\x16\x9c\x1f(\xcf\xc4\x89\x32\x99\x9c" +"f\xcf\xc0{YO\x1a\x91\x1f\x39\x15\x38\xe0h\xab\xa6\x84\xac^\x85\x31\x7fH\xf2p8hN\x1b" +"F\x9/\xbe\xefx\x14O7\x1f\x16\xa4~\x87\x1f:\x89\xb4\x13\xfc\x97\xcc\x45\xea\x81\xbc" +"m,\x1a\xf8\xf7!\x3\xf1\xa7\x41-!E\xefM\xb3\xf9\xb3~\x13\x98\x0\x83\x1f\xd2Z\x9a|" +"\xcf\x7\x16\xc4\xe0\xac\x33\xb3i\xeb\xfa\x1b\xab\xc1:K\xed\x15\xf2[\xea\xe9\xaf\x30" +":\xdf\xa5U\xf1\xa0\xe6\xc5\xe3\x17\x1b\x41\x93jf\xaf\x8d\x1f)\x8fk\x8b\xe4\xc4\xdb" +"\\\x98l\xad\xd0\xd0o\xe7Jp>>\x8f>\xfd\xbb\x95m-tx\xb*\xc2\x93-\x11\xa2\x17t\xe8\x2" +"F\xd6&\x9d\xd5\xb9\xfe\x30\xb4\xfe\xb6\xd7\xa4\xaa\x90\xb2r:@qX\xc7h\xf7\x95\xc6" +"\x89\x19\xfb\xc1\x66/e\xc9Nc#\x1d\"\xb8~a\x85\"w@\x89\x31\xdct\x85\xe7\xe\x8c\x80G\xe8P~\xf8\xd6\x8d" +"W$pE1%;\xfa\xd3\x18\rO$-\xf7Q\xe7\x5\xe9\xda\xe3-<=\x17~\xad\xf9\xbb\x1a\xe6\xf5" +"q_\xdc\xc3w\xb1\x41\x96G\x17\xa1\xfw\x92\xdd\xbfO\xcb\x46\xd7'\xa6\x63\xca^\xfb\\" +"\x8c\xca\x32\xf\x14I\xd3\xe0\x11)\x84 \xd1Q\xc7\xb1\x1e\xd3\xd5\x84\x84\xe5^3\xe1" +"\x86\xc1\x1f\xbf'\xd2\x6X\xd5\xa2?xM/\xe1\xc>:\x9\xff\"\x96\xa4\x10\x5\x12,;\x92" +"\xbb\x96\x0\xc9\x96\x83\xc0\xbeq\x80\xb2\xe3\xdf\xe4\xda#\x98/\xba\xc3r\x17u\x85" +"\xf9\xb7\xfa\xfaq\x89R\x1cx\xae\xf4}\xe1iK@\x86\x3\xa0\x34\xfd=\xe5]\x97\r\xf7\x9b" +"\xc4\xd1\xaf\x63\xaa \r\xd6\x85\xdep\x16\xc0\x87\x61+4\x88\n\x96t!\xa5\x8\xd1}\n" +"Gc\xf1\xd4\x91\xd8\x88i\x1e\x45R\xa6\xa7\xc4?U-\xae\x34\xfK\xca\x14`2\x12\x42\x87" +"\xaf^;\x96z\xc5\x63r\xf1yt\xa6\xbT*\xdb\xd6\x31\xae\x13\x43KM\xce\x44\x82\xe9\xba" +"\xd1\xceL\xb6\xad(\x19\x19\xff\xb8\xe\xe1\x66\xccLM\x11\xa9\x8c\xbb\x63Y\x17\r.+" +">;g\x19\xb\xf6\xfd\xa3\x9f\xefS\xecI\\\xb9\xb9\x8d\xe\x31(\x98s\x82\r\x46LC:\xad" +"\x8d\xbd\x44\xf6\xf2\xe0/\x8b\xf0%\xec\x90\xaah\xb9\xa5m\x1d\x11J\x9\x63\xe5\x91" +"\n\x6-\x99Qz5\xbc\x45\x18\x16\xd0\x43:\xf5\xde\x89\x9a\xa4>\x91\x98\xc\x46k>\xc2" +" \xc7\x19\xb6:\x97@\xac\x31\xce`\xd2\x18\xa8\x99n\xcd\xdc\xeb\x98\xc2If\xa8\xe2\xd0" +"\xb7\xcb\x98\x95\x18\xb5I=~5\x7<\x97\xbd*9\xa8\x13\xfcH\x91\xb4\x9e\xfc\xa3J\xbe" +"~\x91:\xcf\xc7\x97\xeb\x1\xa8w\xc8$.\xee\xdft\xc1\xb8\xa5(\xd5\x9d\x8c\xd7Q\x8\xcd" +"\xd5\xb3\x17\x38\xfa]\x97\x37\x1fQO\xfe\x0\xc1\xaa\x1b\xe3\x41\x89\x8dx\xfb\xfb\x9" +"\x1f\x44\xabV\xf5\x34\x98-\xef\x61\x18\x9ar\x12o[#+\x0\x5\xa5\\g\x17P%E\x3\xbb\xc" +"\xafM\xf4\x41R\xe6\x10\xaf~\xa1\\\xa3$P\x81\x7\x6r\x9a\xb4\xc9\xba\xfe\xea\xbb\xa1" +"2\x1e\xde\xb\xfe]T\xa6\x1f\x1fk~`\x8e\x6\x4\x63\xd2\x34*\x0\xe6\x2\\\x1cGqM\xb0\x91" +"\x9b\x66\xc5\xf9&\x95\xfa\xa3\x35\xdd\xce\xdf\xaa'\xaek\xbc\x62\x8dm\xd9\xed,m&\xda" +":\xc2u\xee\x39\xf4'\xbf\xf7\xba]\x86\x1c\xd4+\xed\xb3\xb9\xb1!2>#\x88\xe2\x62+\x81" +"f\xea\xce_\x18\x91\xe5\x41\xcxV\xd5@\xb6\x14s\xd5!&\x1e\x5\xb1\xd7h\x8e\x9\xf5)\xe3" +"\xb6\x9b\x89*\xa4?V\xfe_\x85\xbc\x4\x2X\xdb.`\xdb\xa9\x7\xb5\xb\x15\xe5m\x1f\x8f" +"\x2\xd7\x89.\x18\xe9\x18\xb6\xe5\r\xeb\xcf=@\xb0\x3\x9d\xe5\x82\x9P\xae\xb0\xd8\x9e" +"{\x1d\n\x1d\x88\xee!\x12_yO\xbc\x44\xd4\x1b\xd7\x1f\x80Jy\x17\x5\xbc\xd9\xe8s\x5" +"\x1cs\xfc\xb1SZ\x6\xc5?\x9c\x31$\x98\xac\xfe\xf6\xfa\xacm\xe9\x41\xc9\xad\x61%\xa5" +"b\x91Oy\x3%[9t,\xea\x99\xed\x4G$\xc2\xc8ml\xecW\xff\xe8L\x98\x36>\xa4\xb8\x31\x16" +"\xd2\x97\xc7\x61+*\xfc\xef\x84\xe0<`\xbep\x13v\xc8{*\x99\x19\xb9x\x82\xe8\xf1:\xb3" +"H5\xccO9>S\x1\x39\xbe\x17\xdb\xcb\xe7\xeb\x1f\x9eO\xa5\x12\x1\x4\xd5\xf4\x82pi\x91" +",X\xd5\x9c\x1b\x37\x9fyt\x1eM\xf1\xd6\xd5\x6\x42q\x89\x93\x10\xb9\x37\xa8P\xc7\"" +"\xafS\xd4.\xec'\xe6\xe8[\xb8\x93\xf\xaa\x87\xa5\xc\x93{P\x86\x95\xf1Fj\xe8" +"\x3\xb1\x10\x62\"\x9d\x8b`\x1d\xb8\xc3\xa3\xa5\x8e\x15\xe2\xc9\x8\xb9V\x2\xf4\x65" +"\xd1\xadK /\xaa\xb0\x43\xcc'/\xa6\x7\xc4\x89\xd6UTy_8\xfe/\xd8\xb5\xc7\xd4\x8\x17" +"\x9b\xc9\x89\x36\xdb\x13\xa9:\x84\x16\xde\xf7G\x9e\x6p\x8b.\xf4\xfd\x61W\x16wH\x8b" +"^D\x87>\xfd\xa2\x93\x38\xbZ\x4\xa4\x93\xf6\x37\xff\xbbh-\xf4l\x8a \x8f\xc3\x14@S" +"\xd4\xcaj-h\x12\xd4go;\x1a`\xdc\xf2~\x87\xb2\x18m\x93\x1d\x91 \x91\xe!U\xadO\xfd" +"djN\xa0\xe4$,c\x88m\xa7\x0n\xb5\xc0\x4\xb5O6n\x18\xb4\x96\xacw`C\x18O\x97\x80\xb6" +"}\x11\x92J\xaf\x0V^\xb0\xe7\xf\x93\xaa\xd9y\xd9Sgt\xd6\x82\xc6\xcd\x11#\xcb\xa5>" +"\x92\xcb\xdft\x86\xac\x8a\xd3\x84\xb4{\xcc\xe8\xa5\xbf\x31+\xa4\x34Y\xbbOe\x88\xfc" +"3\xa4ht\x7fVyj\x8f\x43\x42Q\x7f\xd7U\xa0\x8d\xceg\x13\xf6RH\xab\xaf\x7\x92\x1v\xa6" +"v\x19\\\x66\x9ey,\r\xfe\\\xb9Zz\x1a\x13\xb7\rn\x82\x2\xb9\xd1\x46Z#\xe0" +"\xb\x10\x13\xd4\xaa\xbc|V\xc2x\xac\x81\xf8\x38\x33G%\xf3\x85\xe6\x36\xf8,kI~n0\x82" +"\xd3\x9eq-\x8c\xafT\x0\xd4\xd5@_\xe\xf0\xee\xc7\xb1%\xc0lWjt\xd4\xd6\xdd\xee\xf3" +"mk,\xba\xcbLlb\x8d\x63!\x92_{\x99\x13\xd1\x95\xa1^\xadl\xdfI\xdc\x86\x4\x36\ny'\x1e" +"\x13j\x82\xf7\xe2%\x11\x42\x16\xdd\xb4j\xbe\x92\x7\xb0\xb8\xd5K?\x83\xa2\x30\xc4" +"\xc\xdb\x98%\x39\xbd\xf4\x35\xa4\xd0\xd8 4\x8f\xb4\xe5\x83\xb8\xe\xc6\xa6\xc9\xe1" +"m\xc5\xab!b\xce\x97\"\x91\x15\xbdn\x9b\xdf\xce$d\xd6\x43h(\x82\x11t\x9eZ[XS\xaa{" +"\x9bt\xaa\xbd~Y\xecg0\xa1\xd2\xe5\xb1[\x5%\xd2\xd4\xaa\x8e\x19\xd8\xd6\x8b\xa6\x61" +"\x84\xcHX\x5%,D\x8-\xb8\x18\xc1t\xa7\x3p\xd8\xd3\xc3\x66\x66\xef\x61g\xdb\x36ShT" +"\xc1\xd3\x44 [VA3\xd4\xf0\xf5!\x85\x7f\xa3\xfc\xb7g\xbe\xfc\x65\xb2\x43\xf4\xd5(" +"\xf1w,\x9c\x96\x32\xa5\x17\x8ch\xad\xa7M \xf3\x17 O\x82\x1eJ[r\x97\x1c%;Z\x5[\x9e" +"\x90\xf5+\x19z\xb3\xc\xe1S\x91J\xf9l\xed\x96\xbf\xcc\x64{\nz\xe1\x3qK\x11\x31=\xe1" +"\x99R\xf4'\x80\xa6\x6\x87Q9\xdb\xbd\x8d \x91\x31\xef\xd3\xae\x97\x9by\x9c\xd9\x18" +"6y%\xb1\x12\xfd/\x8c\x34\xf7QSs\xffk@\xdb\xe6j\xf0gY\xdf\xaa\xe4N\xae\x1eJ\xeaR\x8" +"\x18\xbY\xb8(\x9a\x84\x91\xec\xa6~X\xed\x91\x92^\xd7z;ee\x1c\xdf\x7fz\xe9YLh\x80" +"%\xbaOn\xab\xb4he\xa4\xae\x41h\xac\x9f\xc7\xeaU\xe4\x9|\x82\x8:\xf9\xfd\xf9\xa0\x1b" +";\x94\xc8\xf4\xd2\xee\xca\xb6\x88\xdf\x38\x64\xbf\x8a\x14\xabnU\xb0\xb8\xa1\xf6\xfd" +"\x94/\xb2_\x19\x9c\x7\xb3\x65\xaf\xb8:Zx\xe6\x8c\xb0\xde\xa6Vh\x8]~\xd7\xe5\xb7\xd4" +"\x98\xf,%\x8d\xcd\n\xf2\x99\x5\x62\xbc\x36\x35\x99\x36\xf0\xae\xda\xecl+>\xc9xk\xe1" +"\xf6\xcc\xa1\xec\xc8\x6\x32\xbeS\x7\xe9yx6\xca\xb\x1dR\xa4\xa2\x86\xf4\xbc\x36\x32" +"N\x1a\xe9H\xc6\\\x36\x31\xd4N\x81\xa0nI\xd7\x81<\x85\x15\xe0\x85\xdf\x14=5\x96\x63" +"\xef\xe2\x8c#O\xa2\xe0u\xb9\xfe\xeaU^\xac\xa4\xd7\x8d\xac\x10\x8c\xa1\xff\x94\xf0" +"\x88\x8b\x1a\x92\xef\x94\xae\xa9\xda\xda\xf2\xffp\x8a\xffh\xa8<\xfc\xf7H\xbeG\xa6" +"\xc4\xd0\xd5{\x9\xef\x8f\xf4\xc6\xaen\xc\xcb\x32g\xb2\xbe[\x81x\xe6\xf2\n\x17\xa9" +"}5is\x1f\xe4\xab\x89\x33\xf9\xba\x88\x9b\xbf~)\xdfW\x82\xde\"Y\xc1O\x16\xa0\xe2\xeb" +"\x6\xfc\xef\xac\x8a\xb5\x8d\xcb$H\xeb\x99z\xeeo\x82\x9c\xce\x98{*\xb4N\x94\"\x61" +"\x8c\x8c\xb6M\xcf\x39ms\xf5\xc\xfc\xf9\xc\xbd)\xe6!\x93X\x1e\x39X|\xef\xec\xb6\xef" +"\xccQ\xb5<\x0\xde\x8f\x82?BIsf;nn\xf6\xfb\x64\xc2\xbf\xbe\x15\xe5\x14\x33\xcd\xf1" +"\xa3\xed\x82\x61=\xad&\xc6\x85+\x99\x93\xf2\xd9\x92\x44\xa5\xef\\\xbe\x62\xf5\x4" +"\x1en\x17S!#\xa3\xa7\xa8\xd0\x35z[\xd5\x43\x99T\x1aLp\x9b\x9a\xd3\xb7v\xfb\x0\x86" +"\xe2\xce\x1c\xb7KFj\xfd\xc4 }I!\xc4\r\n\x9e\xaf\xb6\n\x90\xfa\xafQ\xbe<\x1f\xee\xda" +"\xe7\xce\x14\x62~\xfb\xe3\xbe\xfd<\xeb\xc6o\xcd\x0s\xaf\xfa\x32\x64\x8d\x81j\x10" +"\xb0\xa3Q$\x96Gx)m\x6\xcd\x41\xaa\x18}\xee\xc0\xcc\xcfn\xf'\xe1\xb5lE\x11\xc\xaa" +"\xf1\x43\xca\xc6\xd1o\x84\x9\x1fq\xbb\x36\xd9NR\x9f\xa6\x7\x93\xe8\"\xa3\x9e\x10" +"|w\xdb\xdb\xfe\xe4\xfa\x1e\"\xc4Pv\x1b\xca\x92\x87\xca\x88\xd8\x19{\x11\xe1\xb0\xaa" +"\xd1\r\x63\xe9/\x9X\x15\xdc\x7Q\xa9&\x10\x46q\xe8H\x14NL\x96\xeep+c\x83\x1cO\xcb" +"\x8f\xff\xa5\x66\xcb\xd1\xfO{ \x93\xd8\x36\x87\x9dg\xf9M\xfc\x9b\xe|\x81'\xbeL\xd6" +"l\xa3\x1c\xc7\x66\xf2\xae\x36\xeb\xb6\x9b\x5\xa2\x44\xdb\x7f\xe\xd1&\xc8T\xbd\x8" +"o\xa4i\x8e\x1c\xa3\x16\xca\xe9\xb6\x82S0\x9a\x9\xbe\x1b\x8a\x61\x32\x88IX\xf2\x2" +"owv\x88\x9f'\xeaZ2{\xdeX\xd9\x34\x32\x9\xc7\xfi\xcb\x94\xd1i3(\xb9R\\\xa4\xf5WvD" +"\xb\x98\x64\xe7\x45\xc8\xcb.C\xd3\xecn\xac\x82\x1f\x83r(B:\x3\x41\xae\xfd*#\x88\xfa" +"\xfe\xfa\x1d\x42$\x1e\x8b\xbe\xc3\x35\xda\x34\xe1\x9i\x9e\xbb\xcf\xda\xdd\xf3\x81" +"\xf3\x37 \x17\x3:`\xe\xd4\xcam\xa7%r\x84(\xba\x45\xfe\xb5\xe7\xc4\xa1&N\xe6I\xe0" +"\xf0\xe\xf3\xbcp\x85\\\r\xfd\xd0#\xe9!kaj\x1\xe3z\xdf\xe6\x65\xbd\x13\xd5\x1a\x13" +"\xa0W\x10\xbc\xe3\x80\x63y\x8fzmK\x80\x8e\xf4\x2N\xad\\\xbf?^=\x89:\xde\xa0\\\xc2" +"\xa9\x64(q\xfb\xd4\x1d\xd7\x15l^\xd8J\xf8\xad\xc4\xde\xd1\x33\x1a\x8a\xcf\xd5\x1d" +"\xd8\xf9\xd9($\x9f\xe1\x81P1N\xca\xa4\xe2\x91\xeb\x13\xe7\xbb_\xdb*%\x91x\xe5\xf1" +"7\x1f\xe7\x80\x7f\x83\x82\xad\x14\x91\xf8iX\xdb*\xf\xc1\xd7\x2\x81%\xf9O\xb7#`\x8" +"\xe7\xb\x16\xbb;g\x15\xces\xf6\x32\xe\x7f\xbc\xe9\x8f#\xa1\xd7\x1bVV\x13\x11\xd1" +"\x9\x33\x96\x1c\xe1\"M\x2\x1\xb9[\xc7\xf8\x62\xa2;(\xdc\xb7G\xbe_\xe3}kBfv\xae\x9a" +"\xf4\x87G(>\x1d\xf0\x9a\xfd\xe4\xa2i\xd6\x32\x95\xc7\xc1_:E\xf5k'\xe7\xd2\xcd\x63" +"\xaf\xb0\xac\x8a%\x63\xa4\xb6\xcc\xe4\xff\x33\x6\xa2\x8b\x30z\rK\xd5\x7\x1f\xb1\xc6" +"[\x94\xf5\xde\x32\xa5\x85\x9c\xcb\x82o\x8c\x89G7\xbf\xe6\xa3\x32\xc3\x84\xc2\x1f" +"n\xd7\xa3\xaf\xcb\xf\xce\xe2\x37\x86\x8c\x95)cOj\xa9\x15+\x16\x8b;\x5\xeezv\x8d\xb3" +"\x8b\xc4\xef\xcd\x36\xe4\xf3\x81\xc2r^33\xfam\x5R%\xe1\xde\xaf\xfb\x9f\xcf\x46\xd1" +"$\xbe\xf\x86\x64u&\xb3\xb0\x11\x36o\x1a\x19\xde\xba\x97&\xf7^x\xb3v]B\x1c\x91]t\xdf" +"\x1e;FK\xe5\x1kt\x11\x62\x33\xe8\x31\xbdh\xa9\xd0L\xb4\xba\x46\x8a\x19\xc2\xf1\xc7" +"\xed\xb3_]\xefT\xe7\xc1\xe7\x8b\x8d\x83'9\x81\x88\xf5\n\x85\xb4\xc0\xd4,i\x7fR\xcf" +"\x1e\xab\x42\xc6\xf2\x44\xf6\xb0\x9b-\xf3lz\xd4\x18\xdc\x11?S\xecP\xc6\xb1\xc9,\x97" +"\xe9\xd3(\xa6\x80!'a\xa2{\xd3\xbe\x97mIc\xbf\x18\xd6\xd3\x4O5\x8e~l\xec\x1c\x94\x16" +"\xb6\xc1\xc4\x9c\x96\x9\xf4\xea\x1e\x6\x81\x1b\xc6\x9a\xde\xa3\xd3\x0\xad\x99{\x92" +"\xddO\xf8/\xfc/UW\xd8W_p\xcc\x34\xa7\xf9\x91g\xc0\x34\x91\x99\x9a\xa9r\x84]\xb3w" +"=\x98\xd2T,\x9e\x8c\x1d\x35M\x1clY\x86\xe6\xfa\xb3\x8f\xe9HU},\xb6\xc5\xc0\xb8\x18" +"=d\x9d\x92\x66\xbe\xb9\x64G1\xbd\xa5\x80\xbdG)Qe \xc7!R\x5\x80H\xa2\x7\x64\x32\xd6" +"]\xe1\x13uZ\xa3)(\xa7^\xd4\x88\x8!\xcc};\xc0Q\xbb\xbf\x44\x3\x65\x0\xe7\xa6\x62\xa7" +"i\x14\xab(\x92\xce\xc2\x7f\x19Pr\xb7\x89X_\x11\xf2J\xb0\x98g!D@\xf3\xca\x15\xdb\"" +"\x80\x10\x8b\x1b%H)\x16\xaf\x8d\x39Yi\x9e\xd4\x43\xd8g\xd3\x93\x7\x96\xce^\xd4\xb7" +"1\x7f\x9f\x80\xc3 ZBP\xbdz2\xb4\x39\xa8\xfbV\x0\xca\xeb\xe2\xed?\"|\xfb\x61\xb5\xfc" +"\xf0\xd1^\xf#:y\x10\xe3\x61w\xfq\x12\xd3WA,\rk\xfd\xc8?e\xb0\xe6\xbfzb\x8eu\xde-" +"\xed\xa6\x64 \xc2\xcb\x7f\xeb\xf7\xc1\xe0\xd8\x43\x14@\xbb\xb8^\x94\x92\xfdj\x91" +"\x82\xa6\x87\xb4=\xd2\xe1\xdd\xfc!Y\xb8\xb0sK\xb\xdc\x36\xee\x8f\xec\xe6\xd9Z+zD" +"\xbc\x17\x16\xc1L\xc0o\x4\x7f\xf6\xbc\xa7\xd2\xb3\xf8\xcb\xfe\xa4\xa5\xd4\xf4\xf" +"\xacg\x1b\xc4\xe3\x8e\x9\xd1\xcf\xa5\xc8&|\xddn\xbf\xbe\x9co\xb2\xb8H|$f\xc2\xf5" +"\xdb\xd4\x98=\x88\x9b]\xb9h?\xaf)\xc8m\x87\x65\x36\xb5W\x7\xf5\xd0%n\xc2\x90\xdd" +"WE\xc6\x14)\x90\x7f\x12:\x9c\x13:\xe2\x13\xa9\xab+\xca\n\x39\x11\xb8\xd9\x93\x62" +"\x1c\xa0\x9;\x88R+\x83\x17\x95\xe9\x8R\xa4\x98\x5\xa2-\xc4\x1b\x66\xffiSxL\x8e\x97" +"\xbc\xb5I\xef\xa7\xc4*Gz\xa5Y\xa6\xb8\x8d\x8b\xdc\xdb`j\xb8\xb3\x5\xe5\xaaiU\xa3" +"=\xa7\x9au*<\xc5\xfa\x5\xb2\x18\xe1\xf4\x43\x44\xc3\x84\x1a\xfa\xdf\x7fx5)\xbb\x13" +"\xc1<\x8eup\xda\x98\x3\xcc\x11\x36\xc8\xc9\xbf\xc5\xad\x9d\xaa\xf1\x82\x9a\x13>T" +"\x80<\xab\xb6\x43Q\xb4k\xec`\xc2}\"\xfc\x1a\xa2\xeeX0\xde\x10\xaf\xb7~[\x81\xfd+" +"SlS\xc1\xe3Q\xce\x8ez\xb5\x84z\xb1\x5?M\xcd\x13>\x2\xd6\x12;6tv\x9f\x46u\x3\x83_" +"\xfd\x4z\x92\x1f\xd5gx-WU(\x88\xe0\x94*\xe7Y\x0_\x7\x94\x34k\xa9\x37\xcdO\xfe&\xd2" +"\xa5\xaf\xf3Nq\x89\xa3\x4\xb5w\xbdvs\x81\x34\x1c\xd3\xab\x19\x18\xa4\xb0\xdeOa\xa3" +"\xe5\x8c\xc8\x5\xde\xe6\x64\x1e\xb7\xcf\x42\x31\xd3\x16\xed\x13\xdf\x3\xc9\x97ge" +"@\xc5.P\x14\xe5\x4\xed\xbd\x39\x84\xb4u\xc0\x44+Me\xdd>\xaa\xa8z\xd3|O{\xfc\x9\r" +"\xa7\xbb\x42\xc8\xaatN\x98x\xcdZ\xb9\x32\x1cxG\xa3`Y,nc\x2T{\xe4\xaa\x12\xeew\x17" +"\xfb\xb8M\x8e\xbc\x66\xf4\xc4\x9\xc\xc4\x14\x13\xdb\xd2\x8f\x31\xef\x37\xaf|\xc1" +"T\nw?W\x1at\xfd>jDN_\x19\xb5\x8\x43$\xe2\x15\xa4\x11Lp\xf\xbb)\xdf/\xb1\x82'a\x94" +"\x8\xb1\x37w(X\xd1\xa8\x9a[\x12x\xd0\xbbW\xf\x85\xc8\xf\x63\xac\xbf\xe0p\x3\x3@\x93" +"\xc3g\xee\xf\rW-\x86\x1cz-d\x4`\x83\x82\x8b\x8e\xdfkm\x15\xcf\x8\x87\x83\xb8\xd7" +"\x9d\xc3\xb9\x9d~h\x1a\x9b\x31\xd0q\x3\xec\xf7\n\xc4;\xb1\xd4u\x1f\xde\x18Q\xd7\x98" +"\x91/\xdd]\x1f\x88j\xc8X\xea\x44\x14\x1e\x0\xfa\xf4\x87\xd1v)\xb7\x6N\xaa\xe9O\xf" +"\xec\x46W\xd6\x9f\x1d\x88kq\xd5\xc8\x42o\x88\xf\x8c\x9!\xd7\xd1\x15\xc2L\xa0T\xd4" +"^w\xce$\xb5T\xa6u\xd3\xf7\x95\\\x92\xden!b&\x9d\xd8N\x8f\xd2 \x8e\x93\xf9\xeb\x32" +"C\xec\xffS\x94\x1d\xc0K\xf3\x84\xf5\x35\xf5\x8e\xda\x33\x62\x5\x7sG\xf7\x3\xb3\xa6" +"0\xf4\xaf\x8b\x84\xec\xe7\xf1\xdc\x84\xe9\xaaq\xe2\x11\x34SQN\xe\xbe\x4\x18]S\x1f" +"\xa5\x96q\x8c\xe3\xea\x7fg\xe6_\x93\xf2\x86\xf9\x30\xda\n\xca\xf8\x31\xc9\x1f?`v" +":\x5\xd1\x82\xa9\x38\xdd\xfbR\x90x\xe2\xa3\xb6\xc8\xa3z\xd0v\xe9\xa4\x19\xf0\x8a" +"\x83H8\x9d\x30R4InC\n\x1a)W\xd3\xff\xa2U\xa1m?\xf6\x8\x33K\xb3\xb1\xa5\xc6\xbcz\xac" +"\xe9\xae\x95\x9f~Q\xbbQ3NJur\xf1\x1fp+\xc2~:f\x98\xeaZ\xe5@]aw\"\xf9\x99\xaa\x46" +"_\x81hm\xf1k(\xd4\x97\x31^\x10\xb8\xda!\xb4:\xefL\xf3;?>\x8\xe0}:t\x6\x86o\xa3\x8b" +"\xc8\xb3<\xc1;\x88\x9e\xfe\xd6\xa6\xcd.\xbc\xab\x42\xd1\xb7\x94M\xc1\x5J\xe\x65H" +"\xc6\x13\xec\xf1\xa4\x81\xcd\xf9\xb0\xc4\x1e\xcd\x30\x36H=\xec;D7J\xc2\xf7%\x94\xf6" +"\xa5S,\xda:>5\x16\xb9I\xb4\x61\xa7\x11\xf4g\xbf\x82\x32\x1f\x35\xf9\xb2\x42\xcc+" +"W_@\xfb\x93\x9b\x42\x8b\x11/\x1a\x12\xbb\xdc\xb6\r\xca\x81\xc0m\x1a\xa4\x0\xae[\x98" +"7\xa5\xef\xb1\xf1\x89\xde\xf4\xf8\xa0X\xbb\x8a\xf6\x1\xf0\xf0\xdb\xd5\x91\xa6\x17" +"\xect\x3s<\x89\xd2p\x8\x16\xed\xcah\xff\xfb\xbd\xd6\x83\xda\x66\xe8\xea\xa1-/\xb8" +"\x18\xa2\xc6\xb7\xc0\x3\x9a\xbd\xad\x87\x89\x15(g\x0?W\x6\x1a\xd3V\x84_\x81\x9c\x1d" +"s\xdc\xe4\xc7,\x13\xac^\x8c\x97\xd0/\x83-y\x8b\x5\xc0@?\x85\x85\x82\xa7Tw.\xabl\xc8" +"Hd\x85\xec\xb6.\xad\x89s\xaew\xb3+.\x81\xb3\xf4 \x13\xcd\xbc(\x8f\xb1W\x9a\x85j\x14" +".\xba\xc0P@\x99~\xd2Y\xf9-\xbfIPO\xce\xdd\xee\x84\xe1\xcd\xdc\xaa\"+K\xc6w\xfb\x91" +"\x81\xa0\x9e\x90\xc4\x8\x3)\x93\xefV\x9b\x96\xa7O\x96o\xd3S\\LM\xfeh\xb6\x12s\x17" +"r\xdb\x99j\xd7\x10\x90\xd7\xff\xfdj\xca\xb9\xbf\xd4\xcf\xd2~h=\xb1S\x1c\xce\x1a\x8" +"\xa9o\xc4+\x96\x15@\xd4]?\x9b\x39\x0_\x17jqr\x9f\x9\xba\x38\xa0\xc3 \x16\x9f\xf2" +"\"B\x82\xba\x19\xe9\xb5/)\xc4\xa4\xa9\xf8\xef\xeb\x14\xcb\x82\x66\xb~\x86\"\xadS" +"\x1a\x95s\xcc\x39\xe8\xa6\xac\x3\xbcI\xddH+&\xc7+\xcf\xb7'\xf0\xd2\x99\xcf\x9c\x2" +"\xb4\xc1\xc5 <\\nX\xd3\xe8L\xf7\x62\x92|\xfc\xcc\xd8\x1\xf\xc8I\xcf\x95\xc4\x1e\x8d" +"e\xcan\x99 Qm\xeb;r\xb5\x32G\x8e\nl\xdd(\xbaWD\xd5[kK\x8d\x46\x8fi\x10\xfc\xcf\x2" +",F\xbbp\xfd\xbeq\xa2\xad;\nh\xa1\xf8\x8d\x15\xe4NK7\xc7\x1d\x8a\xb7\x18\xdd\xc7\x1f" +"\xf1OX\xf2!\x1f\x8fP\x17{<\xdaW\xd4.\xbcV!\xdc\xf6\xe \xb2\xd3\xb8_\xe5\xeb\xe1&" +"\xd8\xc0\xcb\x4\xa4\xe]\xd4\xc2\x1e\xbf\x66\x8d\x15\x83{\xdd\x9V\x5\xa3z09\xeb\x16" +"}\xf9\xf5\xeb\xfd|\xb5\x85\x1\x8\x12Z\xfe\x10\xb6\x8a\xbdr\x95\xf4R\xfaN\xf3\xfb" +"\xf2K\xd3\x9et8\x17``%\xb3\xa0\xec\x8f\nnM&\x95<\x11\xac\x10\x9d\x19\x65\x8b\xd2" +"x\xe6v\x96\x15o\x4\x1f\xda[;\x1b\xa1\xcc?Z\xc3y\x8zs\xd2\xf7\xab\xea\xad\x43y\xcc" +"\x9a\xca\xd2\x1\x92'\x1d\x10\xfc\xe1\x4_R1W8\xc8\xef\x16\x66\xca\x8b>\xe1\x41\x1d" +"\x81\xcd\xae\xd3\xf\xf6\x32\x1a\xe3\x0\x43\x35/ml\x5\x17\xdb\xaf\xcbU\xbf\x98\x31" +"g0\xf6\xcf\xb9\xea\xaey\x81\xdc\x88\x46\xd9\x32\x8d\x92\xf2/e\x86\xa9\xf3\x38\xba" +"\xfa\x81*\xf5q\xfcI|5+z(&\xce\xa8\xa8U^P\xe3\xb3\xfc\xc7RN\xe5S\x93\x1\x9e\x1e\x4" +"\x7\xdd\x13\x43\\\x5\xf8\x14 \xf3\xccztd?\xed\xa3X\x17\x1e\xae\x13H\xd1\xfdx2\x8a" +"v%\xaa\xfa\x39\xc6\xe\xe1S\xa0\x8b\xce\x1c\xdb\x2I\xc1&\xbe\x8\x1et\xedtd\xce\xcf" +"\x4\x95\\%\xcb\xc^\xc1uC\x1c\xb1\xb6r\x98\xa8\x96O\xde\x98\xe1?\xa1\x19'8\x9f\x1e" +"\x87m\xe3\xd0l\xc2\xce\xe5\xcft\xb\xe6\xd8_\x8fov\xf7\x37\xd8\x97\x8a\xabm@\xb6\xa5" +"\x2{\x1fY\x92\xfb\xc1},\x7I\x97\xac\xf4\x8a\x8d\x44;\xcc\xb3\x8cpO\xba\x1e\"\x9f" +"\xe\x8e\xff\x1b\x44\xd7\xa5\x92\xe8\xa5\"\xb6\xe0~\x1e\xa8\x89\xe0nOz\xdd\xaeT\x15" +"k\x9e|\xc8\xc0\x41\x8d\x82\xf5\x45\xa0\xd1N\xc1\xac\x1c[a\x7f^\xf8w\x96\x17\x8c\x43" +"v.\x81\xfb\xad\x43\x82\x17\x9\x7f\x85\x82SNW\xdf\x99_\x87\x33\xbc\x44\x30\xd1\xa1" +"\xbb\xdb\x91\x91.\xc5\xcdw\x8c(ctv>\x17\x18\x32\xda\x9\x43\xd2T\xfe\x64\xbe\xe\x5" +"U\x9d\x9f\xcaw\x18\x46@\xf6\x1c\xc\xa8\xc2\xa3\x1e`B\xdb\xcd\xbd\x19\xbd\xb6\x66" +"\x9e\xac\\QX\x86\xfal\xa4\"X!D\xd7\xcc\xe8\x7fI\x90\x87(\xba\x9a\x84\xe\x37\xa7\xd4" +"\xcdT\xd2\xb0\xb9\xc9\xae[l\xeb+*<*\xd8Y\xcf\x34\xf8\\Z\xae\x81q\xe2\xca\xd9OG\xf5" +"\xe0\x34H63\x1a\xc3\x86\x13Q\xb6\xb6\xae\xbc\x41\xcc\xfc_(\xfa\\\xe2X\xbc\x8e\\J" +"\xed\xa6\x14\x62\x45\xc5i\x15SiF\xe1\xa0\xff\x87j\xee\xb9\xc1\xde!IrL\x8a\xe6\xf0" +"\xb\x91\xab\xa3<*\xde'p\xc7\x41i\xf7\xd1\xe0\xe8qDI\xde+\xa0\x3{y\xe3m?\x5\xca\r" +"\xffZ\xb1I\x89Qn\x88\xc\x61\x3\xc3\xbe\xf7\xee\xbdRWf\xe5\x8f\n\xf3;\"@\xd2W\x11" +"\n\xb6?\xfe\xe2\x30\x8f\xf9\xeai\xba*R\xf2\xa7$\x1a\x7fRI\x8b\x3\x1f\x8f\xfbj\xe0" +"\xd2q\xf3\x0$\xc0H\x7%\x81\x8\x3\xc0\x16k\x98\xf3^on\xe2J?7^|T\xbd\xe1\x1\x8a\xad" +"\x84\x62\x16\x19\x10&\xa9\xbe\xd7K\x9a\xd1\x1e\\\x7fR=@~\x98\xad/$b\x3\x66\xf2\xc" +"\x19\x16P\xf8\xb4\x13N3\x1\x89\x9d)\xb4o\xa5)\x85\xda\xd3\"\xf9K\x9d>R\x89\n\xbc" +"\xd1\x88\xd0\x9f\xe4\xd1\xfc\xc0\xb7\xa5\xf\xe2\x63\xbb\xe5\xeeS\x15\xc3\x16:^\xee" +"0R\x83k\xe6\xa1\xae\x1\xe\xcc\x80H\x12\x18\xde\xd4H\xf0\xbdz\x12\xe7\xd2\xb5+l.\xcf" +"\x8d~\xae\xd6#g\xa9\x9H\x83\x11l\xc9\xef\x4\xaa\xf5&\xa9\x92\xa2\x8\x8c\xf9\x2z_" +"\x84\xael\r\xd5^F\xdazG;\xcb\xe4\x83\n\xb5\xd2\xe2j\x82\xaeL^S\xbd\x1\x1\x81\xda" +"\xc9\xb9VE}{d\x80\\\xdd\"\xbe\xb6\x84\xe3\x17\xcdYP\x9\xe5,\xceP\x1f^3\x91\x35\x90" +"\x7\x98p\xc0+3\xae\xda\x96\xc0\xda\x8c\x32\x82\x8b\x94\xe7\x86]\xa5\x93\x9b\xfa\x43" +"_\xe5\xe9\xc8\xce\xdf\x17\xc9\xb0\x91N&\x87\x11\xc3\x1f\xe5_|\x9e\xc4\xef\xa5\x11" +"\x9d\xbb\x41:\xed\xe8\x1_S\xddY\x94QL\x8c\x87\x14\x8d\xd1\xf3\x45n\xe3\xaa\xee\x9a" +"\xa6w\x86;\x3\x97\xd5'c\xeb\x1\xfaz\xa5\xbe\xea]\xfc\x9eG\xc\xbf\xcc\xfb\xe5`\xa0" +"\x14\xa2\xb7X\xc\x82\xf7[\xbe\xc\x32@\x86\x9Q\xc7\x14?\xcb\x3\xb9\xa0\xe4\xbb\xb8" +"\x1c\x89\xe7\x83\xa6\xa4os\xcc\xe5\xe9_x\x8d+\x13\xeb\x1f\xe8\x66\xabq\x6\x5\xb4" +"c\xfe\xd1\xa0\x1b\x10x\xcd\xb3l\xfaRN\xaaI\xa5\x2\x88\x9e\xdc\xdd\x32N\x11-\xa8n" +"\x1a\x97\xc3\xbdO\xca\x34\x37\xe8\xd5\x61\\@B\xcd\xce\x88\xf6\xe4\x64\x66:\xf7\xa1" +"MPBY\x17\xfc\xb5\xea\xc6\xfbJx\x9e\xb8\x8f\xc1\x92?\xbf\xc0\x1\xda\xf3|\xf3\x9b\x84" +"\\\xf6s==\xa5\xcaZ.\xf7h\xbdwn\xee\x1e\xa4\xb5\xb4N]\x11\xb0\x83\xe1z\xa5\xf2\xf" +"%\xb1\xe2\xd0\x38.\x90\xdc\x91\x9\x93\x9b\xee\xb4Q\xe1\xd0\x81\xd5\x8d\xa9\x32\xb2" +"R;\xaf\x12\xc4\x66\x94\xe\xd1\x36\xf0\\\xd2hb\xaah\x85\xe8R\xfa~b\x87\xd0\xfb\xd3" +"\xbc\x15\x65\x7f\xcc\x99\x1c*\xe3LF\xc2\xa7\x63\xda\xff\x66\x42\"\xb8\xd7\x84\x65" +"\"R\xdat8IU%'\x80\x8d\xcc\\p\xb1,\xb9\xf2\x88{\x8d\xab\xe3\x3\xf2\x1c\x10\xb6w\xb1" +"\xb5I\xb\x43\x90\xed\xed\x64\xc8P\xee\xa3\x66\x96\xe0\x17\xde\x1c[\xe0\x10\xa1]\x8" +"\xa9\x8a\x5\xda\x37\xd8\xf2\x38\x83gI\xb8\x42\xec\x17\xednv\xfb\xad\\W\xb1\xf7\xc5" +"'/vc\x6mv\xac\xb1\xef\x8eu\xbap\x98\x44\x97\n\x42\xba\xb4N\xedsz\xa4\x14\x9e\xdf" +"\x80\\\xd0=\xd4\x14T\xacL\xa9(@\xd9\x65\xe5\x11\x9f'b\x93\xeb\xfb\xef\x15\x9\xfe" +"=X\xc7\xae\xeb(\x1\xb8\x85\xb3#\x9b\xa4\x9d\x9d&\xdc/\xfe\x30{\xe4\xa3\xdb\x96I\xef" +"u!\xd2\xf5\x8ej{3\xf1\xd9\xa3\xe7\x92|\x14T\x1c\xe2\xec\x94\xd8\xf6\x1d\xb\xb3\\" +",B\x97\x9\xa6Gl\xbf\x11\xc9\xf3TE\xaaO\xc8\x36n\x98\xb2V\xe2)2\x9b\x66\xd2<\xed\xe3" +"_\xdb\x19q\xbd\xe1\xa6(\xfc\x91\xfe\xde\x30\xfa\x4va\xc3\x8\xc0\x37:|\xac\x1e\x11" +"\r\x9c\x45\xb1H&\x92\xe8\xc4H~\x1fu\x3v\xe3\xa1\x35\xd6\x82i1\x7\xd1.r\x1bn'\x88" +"{h\x9c)]\xb7&\x1\xd2G \xc6\xcc\xb4\xd5\xf2\x90\x84+\x8e{\xd5\x3R\xc9\xaf*\xed\xef" +"\xbb\x0In@\x16+\xa9\xa8j\x1d\xea\xe1\x38\xc7\xfa\x83\x17\r\xac\x10^\xf2\xfdL>s:;" +"7\x15\xec^\x97\xe0\xf0\xb4M\x87\xd1\x84\x65\x35\x93\x93X\xd6y\x88\x18\xc7\xf0\x0" +"u\xe7z\x6\xa2\xec\xbq\x18\xb3$M\xebZs\x18\x0\x4\x84\x8c\x84\x39Gv\xf9\xff\xf7\x30" +"s\x1d]\x8a\xf0\xa5\xe4\xee\x45\x1\x9b\xa6\xff}\xf4yp\x95\x44\x36\xf\xd9\xb1$\x1d" +"F\x84\xde\xf7\x8\xa7\xf7<[\xe5\x41\xf\x36\x7f\xc1\xd7K\xde\xa7y0\xf4\xd2\xc\x1f\x43" +"\x12\x85u\xe9\xf1]:IC\xd4\xc2\x86\x4\xe0\x44g|\xc7\x0\x61i\xe2S\x6\xe0\x64hc\xca" +"\xef\x93\x13\x46\x1\xfbrk\x87msh\xd4\xc9\x1d\x1b|\xbc\x96\x83\xe0\xed\x86\xa6\x12" +"y\xd5\x44\xef'\x85\xf7\xc4(\x88/c\x8e\x11 |\xbc\x62\xf3ik\n\xf9\xf2P8\x91\xf!\xcc" +"*\xd3G\x8e\xc2y\xe6\xff\x83\xd3\x41zu}k3Kk\xb3\xbf\xe3\xbd\xcc\xe6\x89w\xc4$\x2\xbd" +"|\x97\xe6\xcd\x9dx\xaa(\x99\xde\x5\x95Z\xc4\x31\xc8\x93`}\xf8\xe5\xd4\x83\x1f\x87" +"\xce\xf6\xa6\x12\x62\x30\xb7\xb9\xf8\n\xd0\x98\x82W\xb0\xc7\xb\xee;\x17\xf8\x38\x96" +"\x89.\xb6\x9fz\x9e\x7f\x4\xe8\xee\xb7\x64\xe9?\xad\xd0\xa3\x8\x35\xady\xfb\x7f\xcc" +"l\x9e\x1c-\xd8\xbe\x12\x38\x99\xc4j\xa2\xd5\xc4@\xa6/u\x80tS\xcax\xe4\x65\xc6\xb2" +",\x87\xd3\x95\x91\xa6&\xc9$\x13\x99\x9f\xb7g\x1f=\xcb\x14\x1f\xa3\xee+\xe4MzJ\x2" +"E\xd0;\xee\xb3\xdd\xea\x95\xe8\xccIU\x88H\x9a\x80\xa3\xb6\x8#\x1d) \xb2n\xf2\xce" +"\xccI\xb1\xd6\x9b\x96\xd0\x7f-a\x8e\x9nj\xbb\xb8\xb9\xc0z\x8e\xb7\xb0\x92\xa1\x64" +"^M\x10\xdf\xe0\x7\xe8\x17\x8f?\xae\x9d\xda\x42\x37\xfe\x8c\x36=\x9e\xac\x41M\xb4" +"4\x0\xeb\x1b]aa{U\x7f\xc3\xfbWE9\xa0\x41mj\x10\xe3Z\x10\x96\x38\x45|Vr\x2|\xb9\x9" +"<\xd0)1\x93+\xe2|M\xa0JX\xdc\xa7\xf7:W\x12\xfe\x96\x35\xcc\xd9Y1]\xe7\xceV\xf\x44" +"h\x5\xbcl~kL:\xee\x41@I&\x1e\x9b\xe2\xf7k\xbb \xf0\xdf%\x34\xaf\xd6\x17\x91+\x83" +"g~\x9\x1d\xceR\x1c\xd1\xfb\x17\xc8\x1e\xe7\xa3\x1e\x45\x10\xf5\x19\xabjD|\x85qjb" +"\xf3'\xa1\x1\x8a\xc6\x91x.\xb7\xa8\x7\x17$u\xf1\xa3\xc2\x64\xdf\x12\x64\x84w\"\x3" +"\xf3\xceu~\x2\x66\xb\x81\x92\xf3tc\xdf\x15\xe7\x1~\xf3\xd7s(\xcbT\xef\xda\x16\xbc" +"\xa2\x33\x6\xfc\xc2\xed\xf2\xd2\xcb\xff\xa7}\x88\x82\x81\xba\xfe\x6\xe6MxQJ<@\xa1" +"\xc1uj\xd2\x32\xc5V\n\xbb\x83\x38\x8f\xe8\xd0n\xd8\xe4K\xc7\xb0\x8e\xb8([>\xea\xac" +"X+;\xfd\x1a\xb0N\xb\x93\x94\x4\xce?)\xff\x8.\xbbiM\xb7\x19\xe4\xfe\xdb\xa7\xf8\x2" +"\x1f!\xb6\x1d\xd8\x11 \x12\xd9\xd0\x4$\xd6\x1f\xfb\xb8_\xdc\x5\xb0u4\xe7\xa7K:\xed.R\xa9\x89W" +"\xc4\x10\xfc\xbb\xe2\xf6J\xa3\x38\x31\x93\x8e\x93\x92\xde}\xf3\xe9\xa8Rio\xfe\xbb" +"\xb6\xba\x17\xd3\xafK\xca\xb5\xf9\x9\xab\x46\xaeX7\x8f\xd3i\x9a\xd2}l\xef\xfbk\x7" +"(\xea\xfd\x88\x99\xc1\x32\xde\x33\xe8J\xd9\x43-\xfa\x8\xff\xb2G\xc7\xa6\xf7\xe4\x33" +"\x3\xa1*\x8c:\xf\xd7\x1a\xae\xe1T\x1a\xb6\xb5\xef\"\x12\xe4\x64\xb7\xb1\xa7=\xba" +"r\xed\xc0\xaai\xa7\xd8\xbf\xfb\x64\xf9\x7f\x66\x3\xbf\xc4\xeb\x17h\xc6\xcb\xd4\x17" +"\xf3\xe4\xff\x8e\x17\xd0\xdf\x42s\xc2\x41\xb7\xf6\x83\rgq\xf1\x3\xb9\x17\x9do\xd2" +"\xc8\x92\x9f\x92\x1\x39T\xfa\xa8pl\x10\x82$\xf\xed\x34\x8c\xb9\xc1\xe4]\xa6\xb2:" +"\xe\xa9\xbc+\xb7x>\x87\xf3\r-U;\xd7H\xbc\xb5\x17\xee\x83 \xa9\xd3p\xbb\x1a\x17\x92" +"\xd2\xf9\xeaZ|i\x90t[j\x82N\xff\xe9L--n,5\x1f\xf9\xa5\x63[S\x2\xf8L\x1\xe8[x\x95" +"e6\x8a\xa9\xf3r\x8d\xf4O\xda\xc4\xba\xc4\xf0\xab\x43\xda\x43\x9d\xef\x9b\x16\xd4" +"\xa8\x90\x31>pYN\xb5\xc3\x7@\x9f\x9a\xb3PW\xb5\xb0\xd5\x94\xfd\x61\x42\xbf\xc4<\xd4" +"\x96\x65\xa7\"\xcb\x35\xa0##\xdd\x10\xd9\x9f\x16\xbe\xee\x42\x64\x98\x98\xbf&\x7f" +"-u4\xc5HdH\xfc\xd5\xf\x15\x2\xd1Z\x10\xbe\xc9\xb6\x1b\xc3>#b\xd5\xa8\xe0\x1c\x8a" +"\xa8\x7\x85\xf0\xf0\x12\xd7Rqj\x1!\x1d\x66Y\xb5\x1/Th\xee\xbe\x9f\x1e\xba\r\x35\x19" +"\xab\n\xbe/\xa3\xb0\x2\x33\xac\xa4\xbc\xe5\xd5\xfbO\xf1\xa9\xbbk\xda\x13\x62l\xa9" +"\xd7\x43>\xf2\xbb\xf\x6\x9a\x9d\x61\x85\x64Oi\xc8I\\\xe1\x93\x91\x33\x8cQ {\x1\xbe" +"{\xdby{`\x11\x85\x2(u\x90\x30^\xb0\xcf\rT\x93\x62\xf1\x7T\x1e\x13\xc0y\xdf\xe3\xc0" +"]\xce\xf9\xc8\x6>\xfe#\xc7\x1f\xe1&vI\r\xa4\xf8\xa9R8\xac\xe\x5\x65N\xaew\xff\x62" +"\x92G\x80\x2\xa7\x8c~\xb8R\x9c\xef;\xbb{\xec\r\xe2\xaf\xc5\xf7'B\x0\xdbq\xa6)7\x89" +"L\xa4\x91xX\xb3;\xea\x8d|\xfc\x88\xee\xde\xea\xb7\xcf\x1b\r\x1a\xdb\x99\x86\xe8&" +"\xb6\xd9\x8dY\xc\xe2\x16\xac\xd6N\xdc\x87\x33\xea\x8c\x1a\x14\xbe&\x1f\xb5\xff\x94" +"\x80\x1e\x91_\xf1\xfc\xc9\xb1\x8b\xdf\xcbZ\x9dK\xbd\xe0.\xa5.\xd2\x2\xf9\x8d\x0\xfd" +"\xfd\x17Qi\xe8;\x9e\xd1\xb0I\x91J9\xee\xcb\xbb\xc9\x5\x96\xefl8\xe6g\xde\xa6\xa5" +"\xd0\xd0\x9d#\xfc\xd6\x99~\xea\x17Q\xb3\xfdu\x8bS\x96\xb0\xcd\x5\xed\x99\x86\xf4" +"\xddM\x1d\xad\x62\xc7\x7\x97Ze\xb\xd4\xf0\xf1J\xd6\x8f\x62\xb4\xa6v\xc0\xd6\xa9\x95" +"{\xfd\xbf\x39P\x82\x42\x96\xc8\xb7\xd1\x19\x19P\x8b\x32\xc>\xd5y\x1\xc7\xac\xf2\x7" +"\x12_\xc9\x91\x15\xf7(#1\x8e\x10\x45\x36\xd8\x1a\xc4}\xec\xc4\xd5\x80\x1d\x19\x7" +"b\xc8\xc8\x14\xfd\x8e\x6:I\xedX\xd0ON\xea\x87\xe7\xb8\xd0o\xa7\xc3\xf6\xcf!\xe4\x42" +"\x12\x1b\x17\xcf\xf0\x89y.\xb5\xaa~z\r\xa9\x9\x31\xd7\x9e\xe0x\xe9\x34j\xc2\x18T" +"\x90\x84\xe6,\xbbVT\x7f\xb4\x62\x8b\x9b\xdb\xd9\x6\xabZ\xae\x63t5\xbd\x1b\xcb\xbc" +"\x83\"\x3\xcc\xd6.\x17\x44\x81\xa4\n\xcct]{$W\xee$\xc9\xa2\xc7\xbd\xa3Wu\xe8\xe9" +"\xc7\xbd\xcc\x8f#\x8alL\xc9\x8b\x81\xc8l4\xe1=\xb0\xa0\xaeR\xae\x9cJ!)\x81\xfe[)" +"8\\9xN\xa7t\xca\xd2\xec\xa4X\xdd\xf1S\xf0\xc6\\\xfa\xe3\xfbT.i4\x4&\x9\x33\x19{q" +"\xed\x10\xcf\xc3r\xdf\x1c\xfd]H\x1f\xec\x65\xaa\x30\xefP_$o![\x8e\xed\xcb]\x84/\xa3" +"V\x8c\xa2\xd2\x96\xaf\x85R\xdb|Q\xd1\xf0\xfb\xd7\xc5\xc8^\x9c\xa9\x63\x5\x65\xad" +"\x7f\xb8\xe2\x5\x46\xc1\xcb\xdb\xf6n\xefP\x1e\x33\x5\x33\xc3J\xe8\x39\x98\xfb\x88" +"?\xca/3E\x1b/\xa7-#i\xcd\xca_\xf\xe2\x11\xf6\xf5\xc5\xec\x38w\x9d[\xc4\xa8\x8a\x8e" +"\xcb\xf0\x3\xf8\x66X\x19/\xa1\x98\x34\xb\x8a\xbd_\xf9\xd0&xh-\x93\xc2\x9d\x85\xa3" +"\x19Z\xdb\xd4ZKC\xa3\xbe;\xbcJ\xa6\x87\xb1\xecYH\x82:\x17m\x83\x87\xca\x42\n\xc5" +"\xa7\x1f@&*\xd7xXO\xb0\xb2\x5x0;H\xbf\x97\x66\x10\xbf\xf5\xef\x8e\x34\xca\x32\xe7" +"JD\xfcU\x92\x46&h+&\xfd\x5\xc8\xfcv\xd9\xf1\xe4;Zh/\x1fM\x14\xff\xb1\x19G\xb0\xd0" +"\xd7\xc8\xe7k\xe5 \n\x99U[\xdb>p[S!\xc\\\xd7\"\x8d\xe4\x32(T\x8e\x0\x80\r`\xb\xd5" +"\x1e\xd2\xea\xa3 J\xda\xfb*\"U\x7\xbd\x92M\xeb\x84\x9f\xf6@\x18\xac\x97\xb6\xaa\x99" +"\x84?\x7f\x1bZ\x12\xf\x8e\xae\xcd\xa4k\x81\x0\x65&-\xc4\xc2\xca\xc3xQ\xda\x16@\xff" +"9\x1b\xab\x38k5\x7f%\x87-W{\xba\xe1\xa2\x44\xdb\x8a\xb2J\xdd\x35\\\x1\xc4\xf7\r\x11" +"W%b!\x93\x31x\xf7\xe4\xa7\xfc\xe\x38\xb9Pw\xfb\x44\xeb\x9c\x7\xaeLt\xe9G\xfb\x94" +"z\x84\x9a\xb\x14P\x12;\x81\x9a\xdb\xc5\x19\xdbI\x1f=\x8a\x12\x90\xee\xa1\xc2\x45" +"r\x1a<\x8fu\x80Q\xcc\x1a\\\xaf\x6\xce\x36\x61\x7f\x8c\xf7_d\xffp\xa4-J\xdb,\xe9g" +"\x81|#\x1a\xd6\xc4\xa5I/al\x96X\xe3 2\x91\x7fY\xf8;\x99\xa7\x8a\x61\x12\x86x\xb0" +"\xee\xab]\xbc\xee\xe\xa0\xeb\x98g\xcc+Gf\x2\xe\xf3\xf7\xb3\x85\xcc<^\xee\x13>\xa0" +"\x83\xe0Jo\xfez$\x6w\xd7\xf1\xca\xb4\xfe\xf7m}\x13\x13\x84,8kRP\x9a\x43\xdawsW\xbe" +"\xa7@\x84\x15\xc4\xaa\xe7\x45\xeeJ\xf3\x84\xfc\xec\xf1\xa9\xc7T0\xb9I\x89G\xae\x10" +"\xb8\x6\xc9\xb\x7f\x96\xfd\xa4\xff\x65\xfd\xfe-\x19\xca\xb6=\xbe\x96\x33Mz\xces\x94" +"+\xce\x46\xc2]\xc8J\x9c+\xc4\xef\xd7\xa3\x44\xb6\x82\xdeR~@\xba\x30\x63\xa6[\x9a" +"\x1c\x1b\x39w\x81\x32\x98;\xcaU\x13&\xf4\xf4\x18~)6T!I\x9c\x10Z\x9b\x12\xf4\xe2\xde" +"\xb8\xaeu\x1en_^V\x9d\xd1Y\xa4n\xc6\x9bn\xa5\x95\xf2z\x94qvw\xc8\xb8\xdeNiP4(\x86" +"\xf3\x31\xec\xae\xa8*\x16\xf0\x41\x37\xaf\x39Z\xb5\xc3\x12X\x82\xbd\xed\xf1\xfd\n" +"\xc2\xbe\x66%\xd8(\xc\xf5\x8cOk\x93\\\x86\x8\x7f\xa5\x6G\xf9(\xdc\xb7\xfc\xd9\xe4" +"\x9a\xf9\xae\x32\xfc\xa4Q\xa3\x11\x6\x37\x91\x9d\xb7\xa0l\x97`J\xe2v\xfau\xc3\xea" +"M\xcc\xd1t\x8c_\xb1\x37\\\\\xa4\xc3\x4\x3\x98m\xe2\x42\x8c\xaa\xbb\x96\xe6\x62\xf5" +"\xd4\xb6\xb7\xc9\x46q\xf0\xb2{\x7\xe2\x63\xe0\xab\xb5\xd2\x0\x95\xf0\xc8W\xc0\xc3" +"\xee\xd5J\xd9\xe2+==\x9c\x46\xdd$j\x4\xd0%@R\x8bg6\xab\xf5\x62\xa7?\x1\xf3\xb\xcc" +"\x9\xcd]\x16\xf0\x65\x7f\x61\xe9\xedn\xc3y\xe0|,\xf9\xad\xa1\x46\xc4\xba\xad\xb\xa1" +"OE\xcd@lp\x1e\xfd\x9d*\xd4\xeb\xeb\x38o\x1e\r\x34\x7R\x14\xac\xa3u\xea\xa7V\xb7\xbd" +"\xd8\xdb\xa5\x9eV\x19\x0\xc7\x0G\xcb$J\x9a\x9b\xfb\xdc\x11\x36%\x89`+\xa4v\x9d\xa8" +"\xf\xa9\xf8![h*\xca\x36\x36\n\xc9\x9b\x1a(Y\xc0]?\xba\xfc\x80\xc0\x45\xb3\xb\xa3" +"\x6\x37\xca\x84?\x12\xe4\xa3\xd5h\x1a\x30m\xc3\xe9\xcb\xf2\xd7\x30\xb5\xb0\x62\xda" +"5\n6\xaa\x9d-B\x94-XL\x13\xd2\xecJ\xcd<\xdb\xbe\xf0\x16\xa7\xff\x13\x63\xa9\xf0\x10" +"u2\x4\xdc\xda\x61\xeeP\x1e,f\x8e\x96Y\xf6\xb7\xfe^\xc\xe0\xfdm\xdf\xfx\xf4\x1b,\xac" +"`u\x8b>@\x1dGf`e\xb5\xd6\x16]|\xe5\xe\x16\xfaGY8\xb2\xa1\xc1\x14\x2\x13\x8f=\xcb" +"\xdci\x9d\xa3\x1\"\x88Ju\xda\xad\x41\xb7\x15\x1a\x36\xc2\xfIh\x9f\xec\x15`\xa4\x1" +" \x82\xa1\x0\xe4\xbb\xda\xb0\x83\x7\x1c\x89\xdf^\xe8\xaf\xef\x36\xb9\x8d\xb6\xd4" +"\xef\x44\x4\n\x10\xcc\xb7\xc3\xb5\xca\x80?\x3- N\xc4|\xfe\x62SOW\x0\xc3\x1dm\xdf" +"s\xff\x9d\x1b Z\xc4o\x1ezQ\x99\xda\xe7\xc0\xb3\x42G\\\xdb\x62l\\\xcf\xdb\xc4\x43" +"}\x12^\xb1\xf7\xf4\x16\x1a\xda[tE7h\xe4Nk,b\xb3\x98\x81\xc\x37\x37om\xaa\x1e}E8]" +"\xeb}g\x96m\x9eu\xd5u\x9c\x83\xb1'\x1e\xcfp\x4#\xfd\xbf^\xc8\xa2@\xd9l\n\x9a-\xc6" +"f\x19\xefo\x81\xed\xa9\x10s\xa1\x36p\x1\x39\xbd )\xd0*\x86\xd3IT\xf8\x80\xfc\xd4" +"\x9a\x19\xf3\xeb\x91`\xd2\xcd\xf4{\xc8of\xe4\x8en\x15\xe5.e\x90 !/x\xe3\xd8\x41\x1a" +"%\xf2s5\xa6\xe4\xf8\x12\x45H3r*\xe^Bl)LM\xc0,\x99GCb\xack\x9c\xd9.\x9cm\xee:\xdf" +"\xc7\xf1\xa8'?\x90*&[\xe6:*/\xc8td\xcd\xc3]\x1b\x31\x7\x3\xbf'Q+\xd0\x12\xba\xf8" +"d\x1\xa3\x4\x63Q_\xef\x83\xc6\xce#\xe0\x13P\xe9\xc4\x1dY\x89\xd0\xfc\xac\xd4\x43$\r\xae\x82\x35\x64\xf2\xc\x1f\x30\xd9\xa8QI" +"\xa6, B\xf8\x6\x87\x18T\x9d\xe1\xd4\x98pf\xf6\xab!\xc6R\xf2\x44\x86\x9b\xca\x4\xed" +"\x4\xa7\xa5\x1f!\x4[\xf!r\xeb&c\xbb\x8d\xe8Z\xf0*\xdcP\xc7`C\xe1\xc7$\x3\x82;|<\xf6" +"\xd4\x35\x83\x33\xc1\xb2\xb9\x8\x41{\xb8\xa8/\x9c~\x9b\xc2\xc9\x11t{\xf5\x1c\xd2" +"5,Z\xff\x35\x94\xaf\xe8<`Q\x2\xb5\xb7@\x1b\xb4Kk8N\xe9I%IW\xf9\xc7r\xaev\xd2 \xac" +"o0n(v~\xa5K\x1f\xbe\xf6\x16xb\xa9\x87\xd1S\xaeh-\x99\x30\x1a\xe7\x8e\xf3\xbf\x3\xf8" +"\x1d\xc1\x62*\x8a\xbeW4\x84\xbb'\xdc\xd6\x43\xfcz\x84\n\xf0\x61\xe3\x89o\xf2\xf5" +"\x6\xe3\xdb=g\xa2\x46\xb3\xd9\xd7\x64\xf1\x8J\"V\xc0\x45?\xe9\x96\x62['\n\x81s\xf0" +"\xd6\x9\xfdQU=\xb\xa9\xc9\xe2j1\xf3\xa3\xcf[\xfX\xb4\xc2P\xf2\x14\xdfz\xf8\x12>\xc6" +"j&\xf8\x8\xb\xf8k\x9e\xe5rT[\xe8\xf4\xc6\x19\xd9\x37\x8f\x87\xa1\xe9nf\xd9J\xd2&" +"l\x1*z\x9e}\xb8,q#\xd1=\x13\"\xec\x11.(-\x85\xc1\x1\x18\x94\x9e\xa6\xe7n\xbf\xf3" +"5:\xaa'\xd4\x7\x87\xcc\xc0t\xf5\xfc\x8c\xbd\xe3#\x91\xd0R\x8c\xb7i \x92\xc9\x80|" +"w\xa4\x82\x97rj\xc2\x7f*JR\xf5\xdc\xdb\xaa\xac\xc6\x61\xd9u\\\"\x85\xf0\x11^c\x8f" +"!y\xe7\x2\xcd\x35\x84/:tG'O\xc5\x8czt,\x10\x93\x4\xc6J{\x4\xea*\x85\xdbz\xb1\xba" +"\"\x9\xd9\x65>k\xa6\x14\xbf\xa0\x85\x19\x9e\xaf\x1\x3\xb8w\xdb\x8e\xa8\xef\x10\xf7" +"sq 8\x12\x1f\x33\xdc\x35\xa3\x89\xcd\x8b\xc0\xbb\xe7\xacH\xf1\xbeN9\x97\x9a^\xcc" +"\x93\x8f^\x88\xfe\x35q2\xc4sJ\xf0\x9d\x7K\xf1\x33\xae\x8f\xb1:z\xe0O\x4\x15mhOJ#" +"\x81*H\x84\xf3\x1\xd7\xb6!\xad\x63?\x9b\x0\x95\xc9M2X\xa9\xa4O\xb\xcb\x1e\x82\x9b" +"\xf5\x63\x17izKz\x90\xb2-x\xf9\xdf\xc8\xfb\xb5\xe3\xe5ZW\x97\xe1\xe5\xa8\xb4g\xf6" +"\xa0Z^S\xb0\xf8\xedYij1\xf9\xa2\xd0\x5\xcu*\xfb\x9c\x97\x9f\x94gvA8\xe1\x1a\xb8\xf7" +")\xd9\xa7\xabg\xd0\xc3\xcezK\xe8nJg\xe9\xf4S\xf1\xa5&I\x9c\x82\xfd\xb7\xae\x34\xeb" +"\xe7\x90\x1\xae-\x9d\xc1\xc2\xad\xe1\x8f\xa0\x90\xb8\x36\x1d\x44\x85h\xdaX\xe4\x9c" +"\xa7\x98\x1c\xe9\x86\x87\x8b^!!Kt\xb1\xde\x63\x83PV\xd1\x5\xe9\x13\x42\x95\xfc\x34" +"!\xc6\xdcQ\xc\xac\xb6\x1c\xcf=\x4\xbc\x1b\xa6\xcf\"\xc2h\x0\xf4\x1e\xf1\x11\xc1\xf3" +"\xed\xfd\x1e\x1a\xe2\xcc\xc9\xcc)\xf\xc9\xdc;\xb8\x61\x1e\xdb\x66\xeb\xbb\xcd\xc3" +"/\xf1K\xb6&*\xe8\xa9Jb&7\xeb\xc\xdf=\x8a\x9e\xb2\xe6\x87Q\x99~\x96\xf9\xed\x80\x17" +"T@?i\x1f}c\xc9\x17\xc8&&_\xba&P\xab\x8d-\xda\xd4s\xf\x12\xca\xf\x9f\xbcp_A\x92\x65" +"\x94\xad\x9e\x19\x14\xf0\x85\xef\x83\xec[\xc6U\x84\xd6\xa4\xd3\xc9\xa0j\xca\x80y" +"\x1f\xfc\x1f\xf8X;>\xb6Q^p\xb7\xd3\x34TX7-tZ\xb5sL\xf4\xe\x8d\x30o\x97\xc2\xb3\xb2" +"7\xc6\x92^\xc\xb5\xbd\x96\xc6-\x94\x14\xf4\x3I\x92\xbf\x16\x30\xc7y=\xe\xa2\x85z" +"\xac\x64(\xc3j\xf7\"\xe5\x8d\xacjUn\x9e'\xbuc\xd3\xe6\x9f\xbc\xcc\x8b\xe6\x9d\x8a" +"M\xaf,k\xb\xff\x18\x8bz\xd3n\x0H\rD\xdc\xa7K\xfa\x1d\x1c\x2\x9fS4O\xf2;\xf5\xb0\x10" +"\x13\x1b\xbd\x91\x38\xf5@\xd7\xbb\x41\xd3\xdf\x8e|\xc5\xb8\x4\xec[,\xa5!b\xa7\xe6" +"\xc8Isf\xd8\xab\xbe~1\xbe\xef\xb3\x18\x9d\xb4\x43\x89\x32\xc6p\xff\x64\x63\x90\x14" +"L/E\xb5\xfb\xbc\xe\xf9\x81\xc7o2'a\x9a\xd8\xc6\x87\xe~\xaf\xa8\x65.%/\xe8\x46\x13N>\x7\x15\xec\xe3xx\xb\x6\x66ns\x8cN\xb1" +"\x80><\x1e\xf4-\x93\xdf\x45\x10\r\x7w \x9bK\x6G\xba\xd5\xbb_\x8d\n\xe3\xa6\xf4\x62" +"\xf5i\x17\xb0\xbb\xe2\xf4\x9b\xb3\x9c\xf3\x99Mh\xb4\xc3\xe3{]\x88\x12st4\xc5\xb5" +"\xda\xcaV\r\xb3\xd1\xb0\xc1\xfd\x86\xcv\xb:\x11\x83\xd5YA\xce\xc0\xf9\x97\xb8\xd6" +"\x96\x94\x11]\xae\xd6\\\x1b\x38|\x8eke\xc0\x99\x61\x39\xc1\xa7\x14\x6\xf\x64\x39" +"\xe9\xcc\xa6\x12T\xfatV\xfa\xe3)\xa7\xb1gK\xa5\x85\x30\x87\x62\xd6\x9e\xde\xa1I/" +"--\xe8G2\xd6\xf1\xec\x1\xdf)\xf4\x42\x0`\xae\x80\xa4\xeb\xb\xde\x61\xc5\x37\x2@\xa0" +"u*-\xdaid\xcc\xa9\x0\xee\xf8t\x81\xc2\\\x61\x10\x44\xf2\xe3\x12\xc7so8@:\"\x14\xdb" +"\xbbw\xc6\x9e\x88\x2\x88JR\xad\x12\xa5\x1cuz\xb0\xe0\xd2\x9aI\xaa\x82\x38\x86\xca" +"\xee\xe4=\xa9\x8b\xb4\x83\xfe\xc2Z\xfc&F\xd4\x39\x61,\xd0\x2\xbazU3\xab\x35\xe8\x87" +"\xce\xa1\xde\x97\xe9`\xac\x92S5\xf3[\x91\x82\x45Mmo\xb Q1\x19\x31\x91\xc9\x8fY0_" +"-\xb1\xa6\xbdw\xac\xe7\x9d\xb\xb3\x31\xfd\xab\x15\xbc\x1eK`\x1a\x9b\xc0Q\xa3\xc\x9b" +"\xc2\x9#W\xd4.:S\xaez\xd9\xf4Y\xc5@\x82U#\x12\x81l\x97\xac\x37\xf4\xb1\xe6^\xc6\xea" +"\xa9\xff\xc2(\x10\xd1\x9f\x38`\x16\x89\xb7;\xd7Q\x16\x96o\x8b\xc5\xfd\x88R\x17\x86" +"\x81\xf5<\xb3\xe5'\x94\x37i#,wzb\xc4\xdf\x10\xeb\xd7msl\x7fI\xc0\x1c\x8\xb5j)\xe4" +",\x98\xb1\xe0\xfbn&\xe4m\xcc\xe3\xdd\xfa\xdb\xa9\xfe\x4\x46\xaej\xfe\xcb.\xa0\xec" +"m\xf7 ,\x2\x88<^I\xb6\xa3z\xd6\xca\x37\xa3\xbd~\xcc\x1a\xcf\x63\x15\xc5\xea\xb0\xac" +"\xed\x83/\xe5\xe8\x81.\xda\xe4\xba(\xea\xbe\xab\x94\xba\xb2\x63\xfa&\x80\xa5\xa1" +"\xe7\xfe\xa4\x1\x32\xf\r?\xfZ.s\xbd\xb\xff\xbf\x98M\x8b\xca-y\xc4o.?\x0\x84\xc3\xdd" +"\xb2\xaeu<\xcdNR\xd6xI.\xf0\x63=s\xc0q\xce\x11\x1d\xb4\xefR^\xd3\x82\xf\x46\x64\x82" +"#\x92\xb8\x4\x33*\x80H\x8b\xdf\xcc[+\xbcua\xe2Q\xeM\x4G;&\xfd\x8d|U,_\xb5\xac\xff" +"\x10\xee\x83\xf5\r\xb1!\xb0\xe4S\xbd{\xea\xceZ\xb6\xbc\x43\xf2\xb7\xcf\xad\xb1\xab" +"c\xffr\x8a\xb6\xd2\n*\xfe\xfd\x19k\xe0\xd3\x43\x98\xcav\xf8\xc3\x8c\xa8\x46\x8e\x61" +"g\x8bN\xe4\x15\x46\xab\x9e\xf5\x14\xb1\xc4\x91\xaahy0QK\x9b\x83\x61\xa0G\xe2\x91" +"\xe6\x88\x1c\xe1\xbh\x8a\x17\xd0\x9Ss,h\x14\xe5\x35\xc9\x18\x9e\x41gn^\x19\xab/\xb3" +"\n\xe6W\x99HC\xbb\x19}\x8dP}e\x8a\xe2\x89\x35h\xd8?\xc4\xe5\x82n\xbe\xea\x1bP\xd1" +"g\xf0\x7f~\x9d\xa5VZ\xe\x15\xbbq\xee\x8b_\xe5\xfdg\x5\xcc\x33i\xf5\xa5\x96~Az5\"" +"\x10\xd0\xa2\xb1\x17\xf2lSi\xa9I\xf5\x83\xbd\x9b_\x9d\x17\xec\xf\x7f[\x9a\x42\xf6" +"\x8e\x13h]\xfb\x1\xd7\xda\xfa\\\xb0\x1a\xc4l\x81\xc7\x0\xb3\xd8y\xc7$Lm\xdd?\x92" +"u\x8d,ZC.\r\x9dR\x16\xb8\x9e\\OC;\x9br`N\xc9\xcf\xe7\xa6+]\xb\xf9%\xec\xde\xfb\xf6" +"\x9b\xc4\xf9\xb\x44\xf2{\xf7\xacgh*\x8b\x9a\x63'\x81\x82\x16X\xa9\x8f)-8\x1bH\x89" +"\xa8o\xb6xob\xf7\x42i\x1a\xba*\xcf\xe9\xed\xb8\x80\xa6W~\xb4<\x1c\x81\x64\xba\x99" +"\xf2\xadRZ\xc6\xcd\x39o\x19\xfd\xde\x9W\xcf\xec\xd7\x0\xd0 8\xb0\x81\xb7]j \xc6\x6" +"X\xd6\x1eN\xc1\xbf\xfe\xd0u19\xb\x61nm\xab#\xdfm1\x0\x94(\xef\xc4\x45\x7f\x1c/\n" +"\x8b `\x9d\x9`\x96\x34\xf0gQ\x1c\xb2I\x8f^\xdfn\xc\x13\xaa\xffu\xb7\x3\xec\xf5[\xbf" +"\x89\xe2\xc9v\xa7t1\xbai]\x5\xab\x80\x43%\xcc$3\x9d\x8f\x95$\xe3p\xb5\xb6\x30\x3" +"\x14\x5`\xfb\x45\xf2\x32\x89\xe4\"\xb1\x94\xe7\x1au!\xa7\x8d\x1d\xc9\xc1\x61\xa7" +"L<\x8c\xed\xa5\xb2IKt\xd4_p-\xf1\x98\xf4\xed+\xda\xcb\xfb\xcd\xad\xf6\xae\x39\x88" +"T\xfc\xca\x46\xc\xc7\x1dM\x9\xed\x15\xbf\xcb\x1d\xc5S\x15\x88\xa8\x84\xd6\xad\x9a" +"q\xf4\xce_Z\x4\xa7t\xb8P5~\x13s\x0\x7\x34x9DXS\x94\xd4\xe8p\xb5z6\x1d\xd6?\x3+S\xed" +",.\x95\x39\x8c\xb\xe9+\xd8\xf8\\\x17\xe3r\xdd\xa5\xf1\x18=\xc0\x1d\x31\x85\xd9y`" +"\xfd\xe\x19q\xa6\x4\xf\xe1\xcf\x98\xc1\xdb#D\x9aS+\xaa\x45\xf2\xdbY^\x1f\x85\x30" +"R\x97\x4\x8v\xfbZ\xbc\x36`\xc7\x38q\xe2\xfd\xe1[\xca\xf4\x34\xe4\xa9\xba_8\x18\xa1" +"\xbaId\xbe\x12\xf5wuH\x16\xb8\xdf\xe6)v\x19\x8e\xfb=)\xf4=W\xf7\x7\x18I\x8fO\xac" +"\xfa\n\xb4\xf5\xeh\xa3\xb3\xc8\xbbs\x1d\xb0R\xdb\x93@\x93\xd2\x94\xeb\x13V\xa4\xd8" +"\xfb\xce\r\xafr\x4\x2?\xd8\xf6g\\Od\xce\xfe\x8a\x84\x8c\x90'\xb0\xc5\x12N0;\xe7\xd0" +"\xb2\xdc~\xddW\xdf\x17V\xe8\xc4?\xe1\xaf\x15\x9d\xab\x14\xbc\x3\xb3\x11\x99\x97-" +"x\xbeq\xd1n\x8c\xd7\xa1\x83\x42\x9f\xa5(\xcb\xcc\xb1\xdf\x12TZ\"%\xd7\x87\xe0\x92" +"\x94\xb8\x46I\xac\xc8\xb6]UzA\x7f\xb3\x8\x8e\x1\x1e\xfa\xb3\x1fwx\x83\x32\xf4\xb7" +"Y\xb7?\xaf\xde\xb9\x98O\xca\r\xee\xc8yt\xc9P\x9cK\r\xd2!\xf8\x89\xcdU\x91\xf1\x1b" +"\xcc#k\xef\x81\x39\x94\xc4+e}\x8c\xac\x66\x31\x1b\x87\xb7\x8cR\xee\xf2\x85!l\xfa" +"c\xd7\x1f\xf7.\xa4Y/;\xc4+\xccO\xa1z|\x3\xc4q\xe3\x65\x1d\x17\xfb\xd3\xa1\x8b\xfc" +"\x5\xb7\xd7\xf8\xda.\xbb\xa0\xc0\x35\x14'A\xd7\xf6\x1dV\xady\xc0Tr'\xde\x9f\xf9\x61" +"G\xf7\xf2\xa1i\xd4\x83\xe8pX2\xb2\xa3\x41+\x9b\xd9\xa6\xff\x7f\x83\x98\x41\x41T\xe2" +"\xf\x16~\xf2\\`B\x99+=[B\xda\x61\xed\x84N\xc3\x99\xbb\x8e[&\x81<\xc2}\x95]\xeb{E" +"\x1c\xd0\xe0\x89$\xad\x99!\xe5\x1b\x2\x80\xec\xe0s\xe3\x16+\xe1\xb9\xb9\xeb\xf4\xbb" +"\x9b\xae\x14<\x98\x1e\x10\x15\x9a\xea=\xa3\x9d\x7\xce\xed\x88\x85Re\x19\x9e\xc8T" +"w\xa7\xfe\xf0\xd6L\x99\xd3\x9a\xf7\x9f\x97\xed\x1e\x89\xa8\xd1\x63\xed\xd7\xa8Wg" +"j\xe2\xfc\xb2(\xb\x0\xa3/\xa4;\xe\x37\xa6\xc2|\xee\xc\x19\xe8\x81\xa8~:f\xe9\xab" +"T\xb8\xe4~\x7\xc4\xaf\x9c\n\xea\xae=\x9a\xca\xeb\x93\xa2$\xa7!\xf2rq\\\x90\xf2Nj" +"T\xc!\x1a\x7\xc9\x18\xd3~\xa7\xdf\x85\x41H\r\x8aR#s\xb9\x30\xcc\xd5\x8c\n\xdb\xfa" +"\"<\xf6\xe1pvTg\xd5\x64\xf3hG\x82\x9f\x1btX\x87\x35\xb8\x33\xc3\xc5\xe3\xe4\x90\x93" +"C^\xecw\xbd\x39\x82\xb3\x44\xe1\x46\x81Zt\xdb\x34\xb2\x91\x1b\xce\xfd\x87\xf1\xc" +"\x93\xbdn\xf0\xbc{\x83S\x4G6/\x3\x65t\xd4\xc5\x6\xb8\xe7\x8f=\xac\x8c\x65\xef\xb6" +"V\x14<\xd5\xbcsq\xf4\n\xa3\x18\x96\xc6\xde\xbb\xe3\xdf\x9d\x86\x99\x66\xc2\x85l\xde" +"%\x82\xea\x92\xf5\xff#`\r{\xaf\xa0\xd9\xfaY?\xe7\xc6\xf5\xcdsaD\xe0$\x9d\xc6\x93" +".\xe1\xe6\x0\x7\xb0\x1c\xb9\"W\x1b\x8e^\xdc\xf8\x34q\xb0\xad\xc0W\x99\x8eo\x8c\xce" +"\xa3Ur\n\x85=A\xa6\xab\xac\xe3I\x8a\xc4\x97\xb5\xe4\x8cX\xa3\x12\xef!\x5\xc8\xd4" +"\xa9\xeeY\xa1/k\x6\xb8\"\x39\x30\x30\x1a\xd5\x39\x16@P\x6\xfc%O|6ip@\xa2\xc6\xe7" +"\x9\xe\xe0\x39\x44\xca\x6\xe7\xdb)\x94\xb5w\xdf\xe6S\xb3\xc6]\xc3\xad\xc7\xbd\xb8" +"\xe2\x83\x2\x39\xf3\x36\x35i\xb0kr\xcbn\\\x8\x10\x66V\xb4\x95\xd7\xe8;\x1e\xa6m\x9a" +"\xcf \xe9*r\xec\xf0\x9c\xdc\xa6\x8f\x82)\xd3\x32\x9f\x14*\x18\x19\xd7\xa0G.\x8b\x17" +"\xb5\xde\x1b\x8dZA2&\xae\xbe\xd2W\rs\xc5+\x1eG6N$P\x8dr\xcf,K\x8\r\xa7\xb2\xc1\x65" +"3\xdd\xc7!\xfb\xe|\xd4\x8\x41O\x93\xd8\xdd\x14\xbcr\x8a~\xb3\x8e\xc9\x91\xb3\xd0" +"\xf7\x80v\xeb\\\x91\xe7x\xd2\xf\x38\xf9\xbdwiI\x81\x17Un\xfc\xfa\x9\xf0\xd7\xe9\xd6" +"\xb6Zj\xfc\xb4\x63u\xf2\xd2\xcf\x97\n\xebg\xa2\xb3L\x18z\xb3\xc\xe1S\x91J\xf9\x85" +"aW;/L_\x6\x31\x9b\x37-D}\xaa\x1c\x93\\j\xaa\xb6\x95\x1a\x39s\xb7|\xaa\xe\x31\x87" +"s\x96N\xfb\x0\xc4\x9c\x16\x36\xa7p u\x9bl[E\x7~M\xbd\xb8\xcf\xb4\xb4\xcb\xb8v\xe3" +"\x2-\x83Je\xd3\xc\x14\x6\xcd\xca\x14\xb0\xf6\xa8o\xd2\x61\x9b\x9fKNO\xc2/\x9\x93" +"\x10\xfc\xb7\xb6\x15\x9f\x87\x63\xc0k\x1a\xe4\x98\xccZq\xa2\x87\"\x62\xc4\x1f\xe6" +"\x8c\n\x97\x90\xa1\xe2\xba\xab\"\x18\x83Sy\x95\xdd;^\x17\x61q \xb2W\x9c\x33\xf7:" +">/\xdcoC[\xe9\xb6\x87\xbdHn\xfe\xd6\xde[\x9dT\xd9\xcb_\xf4\xc5\xfZ(4\xba\x9d\x8c" +"\xb6\xf2m\x99\xd6n\xb1\x36L\xcb\xf9)BwQ\xe4\xdc\xfb 4\xc5\x1a@Z5[\\8\xa7\xf0\xc5" +"\xdf\x89\x8d\xf7\xd9=\n\xd1\x8a\x13\xd7\xf\xbe\x66\xa3\x4\xefmO;i8\\.\xcc\xd0\x1e" +"\x9fZ\xaf\x17\xb1\x7f_\xa6@\xeb\xe6\xe5sqn\x95\xadz\xe2\x1d\xf8\x12\xee$\xc6U\xb3" +"\xe6\xc5\xd6\x43=\x8d\x46i\x1d\xecz\x11(\xc8\x34\xe\xf6\x2\xf6\xc4\xa5`D\xcb\xe\x36" +"q\xd5\xfa\xf6\xcd\xe6\x96SH\x96\xf7\xa9v\xc3-\x93%J\xab\x9f\xaf\x11$\xb6\xb\xa9$" +"\xdc\xa7Z/\xdb\xe7\xd9tHu\x16\xfc\xcb\n\x8d\x1d\xfe\xa3\x82{gU\xdc\xb9%L\x7f`m\xea" +"%\x80@\xc7\xd9I\xed\xee\xcc:\xc6\x62\x88\xcf\xbc\xfd\x1bS\x8c\xdd\x8azy\x3\x9a!k" +"\xf4\x15?\x84\xe2\x9e\x19i\xdc\xef\x35\xfdP\x99\xb6\x80\xdc\x1f\xe9Z\x14\x95\xe5" +"\xf7Q\x8a\x94\xbf\x91\xde\x85\xd0\xed\xdbI\xe8w/\xf0\xe6~\xe1\x94;\x0\xf9T\x80(\x99" +"\xef<\xa2S\x1d\xae\x11R*\x9\xf9\xd0\x30\xc2\xd3\xb0\xc9\xd5\xca\x18\x17\x62p\xb6" +"\x99*\xb7\x61V\xb\x93\xe2\x42?#8\x87\xf7\"\x83u\r\xeb\xd9\xbc\xcc\xe9\xd0\xddY\x6" +"\x0\x89\x98\x8b\x66Y\x8b\x96\x87v\xc0\xddL\xa5\x1f\xfb\xc5\xde$)\xec\x9>z\xf7\xee" +"\x93\xe\xa2\xe6p&v\x9aO\x3\rK1;I:\x8d\xa1\x8e\xae\xbc\x86\x9e.\xb4\x34\xdb\xf7,\xcb" +"\x8f\xf4\x45\xad\x94\x1o\x14\x81\x35\xa8\x83\xbf\x18\xdf\x2Q\x81\x93\xa4K\xb3\x43" +"V\xe5\x9f\x9b\xb8\x8e\x11\x1\x84GC\xbX\x18\x99\x37\xc7p\xd6G\x9c{B_\xfd\xc7\xee\xb5" +"\xfds\xc4\xf\x11]\x91\r\xcd\x14\x14\x65><\xe6<_\x1c\x17q\xda?BcMr\xde\xf5T\x95{i" +"\xab}\xc6\x1f\xe9\x84\xaa\xde\x36Qw\xc4\xbei~\xdbZ\x83\\q\x14\xb1\x13\xd8\x0\x1e" +"\xc7i\x1a\x8c\xc0\xf2\x9c`.\xd7G\xcaY0(\xba\xfaR!\x9d\xc5\xeo\xa0yS\xf\xef\x9f\xde" +"H\xd9R\xb4\x3\xb2\xf3\x39Y.n\xa8\xe5\x9bj\xe6\x11\xec\xa5\x1e\x9cw\x90\x0\xe5\xc8" +"\xb4|c+\xc6\xb1\xa1\x7\x17\xb4\x92\x10&1*\xbf\xf2\xbb\x9e\xc9\xc7!\x7f\xed]\xd5\xc1" +"\xa4\x94v\xc6\x9c\xaeP\xdd\xbe\xa0^\xc2\xb9(\xf8\xd4\xd9R\xe8\xa5p\xa9\xc7\xe3\x45" +"\xfc\x86\xd9L\xa8\xb3\x93\x32\xb2/,C\xc3\x15\xd6\xcc\x12\xd6\xc1\x8\x8f\xac\xf6\xd9" +"p`a\x96\x4\x1f[6\x1a\x45\xae\x0\x32\x42[\xef,\xb5\xaegN\xe6\xb2\xb1\xbd_&\xa1\xe7" +"'\xfc\xbf\x17\x16\xbc\x83\x10\x84\xa0){\xcd\x90)\xe2\x95\xc9\xbe\xeb\xa9 IU'K\xf3" +"\xeI\xabp\xca\xc0\x85\xc0v\xc1\x9e\xd0tARP)\xa6%\xf4W\x90\x1d\x65\x38\x43\xa0]\xce" +"#\xe9\x44\x39j\x1d\x15I\x1a\xf9\xd9p\xa7\xb6\xac\xf7\x9a\xb\x98M\x11\x94\x10\x9b" +"\xb5R\x17N\xf0\xfa)\xde\xc2\xa9\xc4oV\xeb\xbd\xe9\x66\n\xe9\xf2\xe3\xe5\x80\xcd\xf8" +"\xe9\xb9\xea\xcf<0\xe6\x96\xbd\xd3\x14\xe4\x62\xfc\\\x9fy\x9e\x35\xc2\xff\xe4Z\x7" +"\x13i\xe\x42\x7\xcf\xdfp\x8c\xb0\xa4\x65\xd0\x45\xe7Yn\xfb\x16\x41\x39\xcbl\xe7\xd4" +"\\k\x83!$\xd8\x95H\x8c#\xd6\x34\xc3\x5\xc3\xa3\xe1\xeeP\\\xa8\xa4\xb4:\x8e\xa7l\xcc" +"\xae\xb8\x97\xd1`\xf1&\xd7\xb2\xb\x92I\xdf\xd6\x62\x8f\n\x83\xef\xa9\"\r\x14r\xf6" +"@K\x1a\xa6\x3\x36\xdb\xa6\x1b\x88\x87\xd6i\x92\x9Xn%Y\x90\x8\xb3k\xcf\x15\x1f+\xd2" +"\xfd\xaa\xf6u\xdb]z\xc6\xf5\x1f\x9b\x80\xdc'%{\xc0zi\xbf\xb8i\x96S\xb1\x92\x11\xbc" +"\x16\xfe\xab\xc2\xd3H\xed\x88\x88'\xdc/\xe7\xe0\x31\xe9\x14MN`\xe7.\x91\xd8\x6-\x12" +"\xbes\x90\xfam\x96\xa6V\xd7\xfa\xc7l\xb2\x42\xa4\x34\xc9\xbe\xcc)\xab.\xa9\x90\xf9" +"\xfc\x4\xc6\xf0\xb\xdd\x11\xdb\xc0\x10\xe3\xd6\xea\x99/\xf8\xabs^e\xda\xf9\xd9\x89\x1a_\\L\xca?X\xaf\x1f\x66\xd6\x9\x38\x84" +"\x4g\xdf\xcczM0\xc8\xf0\xfc^\x90)\x4\xbc\x41K\xf0kQ!\x92\x84\xed\x45\x18\\\x9aSW" +"*\xd9\xd9\xd1\xa6\xe2\xf9S\xbc\x12\xf5Y\xc1)\x82\x87\x3Vm\x7K\xd0v\x3\xeb\x3\xac" +"\xb6\x34Z\x1a\xc*\xde\xef\x96\xe5S\x5(d*\x1d\x93\x9e\\\xba\x62\xcd\"!\xd6\xee(\xd1" +"P\x83\xe4\xad\xf9I+\x8f\xc7\xc5\xeb\xee\xb6\xed*^(\xf0\xfd\x2\x8a;T5\xf5`\xe1\xdb" +"\xef\xaf\x44\xf3\xda\x19\xf7sa!\xde\xdd^\x9cJ\x15\xeb\xe7\x37\x5\x1cUbZ\xd1i\xcb" +"B\x1a\x11\xfe\x8a\xb0\x80\xe0\xa0\xd4J\x9e\x65\x8c\x8f\xd6\x37\xd1\x61\x66\xd8qi" +"KV\xafY(\xb7\xd2l\xc3`#8\xc7O\xf1;k\xe0-\xfc\x18\xbb\xdbo\xd9m\xc3\x8f\xdb\xbd\x82" +"\x9f\xdare\xe8\xac\xf0\x6\xae \xc7\x3\xb\x8eR\xfa\xa3Qg\xa4\xc7\xc0\xc7\x90\x8f\xe1" +"\x91\x16\xf2V\x14\xa0\x34\x90\xff\x2Zr\x91\xdaq6\x92\x17\x9a\xb5\x36\x8f\xf4\x14" +"\x81\xd6(P\x0\xc5\xd7\"\x11\xe1<\xf5\xba(n$\xec\xbdP\x84\x37\xda\xda\xa0s\xed\x8f" +"moB\xf1-h\x96\xb1\xc8\xd9\x39k$pR*\x8a\xb9\xc0\x66\xe1R|\xbd\x93\x85\x1a_\x15\xc6" +"\x9c\xf2k\xa8\xe2\x7\xe\x13\xa6\xaf\xd3\x64\xcc\xcc\x10V\x81\x1b\xe4\xf1z;[\xcd\xff" +"\x1e\xb\xd7`\xfb\x42M\xdega\xd7\xd7\"\xdb\x82\xfe\x34\x1f\x1a\xdb\xa2NJ\xae\x90\x9f" +"\xaf\xc0$\x96i\xdb\xejD\x99\xa4;\x10\xb4\x9e\x9\x1a\x2\xc7\xf8\xd1\xc7=\x93\x87k" +"\x8f\xc6\xfWX\x1c\xa6\x89ho?&;\xc0\x2\xc8\x36we\xa2\x87\xb3\x16\xf0iI\xd0\x8d%\x11" +"Z\x2\x83\xc2s\x12\xe5\x14\x8b\xc7\x19S\xba\xa9M\x1b\xda\x84\x1f\xf3\xc0\xb4\xe2\x99" +"0\xb0Yk\x84mq\xe2-|2\xddj%\xaf\xeev\xe8\xcb=PM-%Q.\xf2\xcf\xa1}\x2;\xe4\xea\x8e\xa7" +"\xe5\xba\xc5\x9f\xa7;H\r\xa6\x8}N\xc3+ \x87\xea\xcc\xc\xa4N\x8c\x1d:\xbfL\x10\xc1" +"\x83$_\x1bs<\x17m\x7f\xba\xby\x17\xc8\x44\x45M\x94=\xca\xbb\xa5n\xf2\x86\x3\xc3\x7f" +"b\xed-l4\xf5\xc8im\x7f\x10\xc7`\x99\xc5T}\xc0\xcf\xa5\x80o\xf8\xc8\x66\x9e\xb2\xde" +"\x84\xb7\x8\xce\x90\x95\x45\xa0\x7/\xd5\xda\x35\x96>\x9f!\x94\xc1\xb4\x86\x42\xf2" +"\xf3\x95\x9\x12\x45!\xc1\xc\x13\xdd\xb\xfc\r\x91UKi\xfa\x13\xf9\xefz\x80\xfa\x9d" +"N\xab\xa3\xbb\x8Tl5w\xe8z\xde\x93\xd4\xe3\xfb\xb4\x8b\xeb\xe7\xa8\xe6h\xc0\xb5Lj" +"\xe7qw>\x86\x87\\\xa4\xfc\xc6G]7x0\xb8#J\x8aU\xd4\x44\x11\xd2;_!(9Q\x90\x1e\xb6\xc6" +"\xf4wu\xcb\xd5\x9e~\xbdr4\xd8\xe4Ym\xda\xc5\xb8\x36\x37\xe7\x36./\x83\xe4\xa0z\xdf" +"\xeb\x8c\xdf\xa7\x7l\xea\xc0j*\xdbr\xe7\xcb\x92\xaa\xc7&\xbc\xa8\xf5\x37\xda~w\x18" +"\xe?\xc7\x1e\xfc\xba\xc0\x35'\x1e\x33}\xc8\xd6$\x80\xd5\x61\xea\xabW\x90p\xbe\x8f" +"\xd7\x63\xb3\x81\x44\xc6\rQ\xf2Vh\xb7\x88\x62QU\xf2\x9c\xa6\xd6\xab\xe3\x6Ot\xde" +"v\xb6\x1d\xad\xb2\xb\xac\xe6\xe1\xbe\x31[`\xaa\xc9\x33\"k\xcc\xe5\x32$\xbcP\xe@\xbb" +"w\xd2\x7f\x88\xd5k\xd1T\xf3kM\xa9G\x17)\x8c\x8d\xe2r\xee\x14\x6h\xeb\xb\xd8!\xf8" +"\xb9\x95\x82\x63[\xc3\x16!\xc2\xc5\xdc\x14\x90/:\xf2\x89\x1\x66K\xcd.\x11\x9f\xdf" +"\xe7\x0\x42;\xa6'\x89\x8aNT\xe2\x7\x1e\xbf\xa6\xbc\xf4\"\xc9\xa4\xa4k\xcb\x42x\x86" +"pH\x9d\xa5\xc4\x89\xb6\x11\xb2(\x93\xee\x11\x42\x9c\xdfH\xaa\x8b\x63\x9bO\xf5h}\xd4" +"5\xe0\xee\x14\xe9W70\xdb\xe7\x5\xf8mD\xfa\x65\xf\x61\xf2\xd3+\xad\xa6]\xbf\xc\x0" +"\xeb\xa9\xde\xf3\xc6?\xa1\xd7\x87i\x9\xcaZ^\xfc%\x2\xe8\x8d\x9f\x94)d\x15\xafr\x14" +"\x87\x85\xaa:\xbfZ \xa8\x13\xdf/p\xf3[\xdc\xee\xda\xebQMD\x10P\xda\xbx7\xff\x37h" +"uc\x15\x87\xc5\xd5\xdf\x9d\xe5\xa2\x36\x33\x89\xaa\xb4\xe2\xd9\xbfO'\xe1j\xfeJ\xc3" +"\x1fX5\xeb\x46\x9bHWQ\x97.\n\x94p\x3'\xbc\xaa\x43\x41\x1dJ\xc6\x5\xd4\x42\xc9\xef" +"r\xb3\xa8\xea\x8IV\xc\x81Z\x17\xc3\xf0\xf\xcf\x8cjc\xbf\x38\x17\xa7\x63\xf2\xc\x61" +"Y\xd1U\xf3&{V1\x11\xe4\xcbp8KZ\xbb\x65\x85(\n\xae~\xef\xc6\\}(\xbd\xca-2O^\x5\x9e" +"M\xcd\xe0\xec;\xba\x9bv\x7\xf5\x90x\xcb\xb6XQ&\xf5\x30+\x8r\xadUw<|\xaf\x63i\x1a" +" \x9d\x97NqG_\xd7\x0\xc7i\r\xb\xc\xa4Hd \xa4\xc0\xa2\xe4 c\xe1\x39\x7f*\x89\xd9\xa3" +"j\xfc\x1d,\xb\x19`\xb2\x86\xc9~\x15\x89O\xa9\x61\x5\x9dT\xf4\xb6\xdc\x4O\"phfg\x98" +"\x97(&\xf4\x87\x8f\x62\xb9[\x87`F)\x81\x19\xb3\xe2\xcc\x9aML\xe7?P\xef\xd0$\x91z" +"\xf0z\xc9\xee\x89\x2H\x99\xbc.=\x10\x45\xf2\xb5[\n\x10Z\xb2\xa9\x1ao\xe8l\x99\xd1" +"s59\xc1\xf0:\xad\x15\xd3\x87\xdau\x19@\xfa\xf0\x1ap\xf9G\xec\x64\xe7I\x4\x10\x43" +"}\xff\xcc\xc8\xd6xM\x8b\xcdv\x94\xe4\xb5\xe\xa4\xd6\xe5\xf2\xd6\xef\xdb&D\xb9\x9e" +"~T,\xbbnP\x94I\x10{\x10\xc1\x95\x36\x14\xe^\x80\xa5\x94\xe9\x9J\x8bO\xc8{V\x90\x6" +"W\xf0\x18\xff\"w|\x1fm\x90\xce\x16\x17\xa3\x18\xf{8\x90\xeeS\xe4\x1d)\xf0L\xefhY" +"\x9d\x9d\x16\x16\xce\xf0\xcd\x1e\x1cXv7\xaa\xbe\x97\x81\x38i\x96\x88\x12\xa1\xe1" +"\xb2\xbb\xbc\x9e\xf1\xca\xb0#\xf2\xf6\xfa\xb0\xeei?8T\x96\x43\xa7\x61J\xbd\x33\x82" +"\xba\xab\xce \xa4\xe4\xb7\x93X_\xf4\xcfg\n\xed\x8e\xf6\x32\xf5\x8c\x9f\xc9\x17\x13" +"\xa9\x8e\xe4\xa2t?z5\xc7L\x85\x1K<7`c\"\xfb\xff\xf1Jr\xf3\xb6\xd8\xc1\n\x9\xe4\xeb" +"\x94\xa1/R\r\xc7\x2\x0$\xcb\x80\x19\\\x9e(1\xd3M\x1c&\xc5\xfcN\xa4Gfk\x82\xe8N\xc6" +"E\x4M?#3\x95G\xbe\xbc\xab\x8\x32\xef\x7>5\x97\x83\xb3RT\xad\xd0\xa0\r\xe1Kw\x0\xca" +"DJ}qS\xef\xa5\x65\x8)p\xa5\xc9\xf6$a\xf1\xe3\x42-x2c\x4\xd7ix\xb9!\xaa\xf1H\xcb\xa8" +"\xb1H\xd1\xe7\x3\xd3J\xf5\xba\xa5\xdd.\x17\x63L\x88%\x8c\x83\xe\xd0\xd8{\x84\x8c" +"b\xddw8\x19\xcIW\x9\xa6[\xad*\xcdr\xcd\xe9\x37U`\xa8\xa2^\xdcR)!T\x14\xac\x13\xfa" +"[\x1e\xc2\xe3\x87\xa5\xdf\n%\x3\xdd\x93\xd2n\x18\xe2\x19\xa0\x12\xb5U\xe2\x45 \xda" +"|\x88\xba\xb4\xc{#S\xfL\xe2\xfc\xd1\xeb\x1;\x1f\xfd\x97\x8f\xe4\x34\x9b\xe7}\x98" +"u\xa6\xe1-\x96$\x94\xbc\xabX\xaa\xa5m\xf\xf8*\xa8'\xad\xb6L\\\xff\xe8i^4\xd7/\x88" +"\xa2\xbfn\x8b\x83\xb1\x36\xb4\xff\xf0%k\xa1\xe\x8e\x41\x66\x37[\xd0\xe1\x8b\xb7'" +"n\x91\x9e\x9c\xc0r\x1c\x33\xb4\x1a\x9f\xfcq\x18\xdc\x66\xf2\x6\xfa\x91\xed\x30\x9f" +"\xad\xf5\xcd\x95n\xe9\x18\x1a\xee\x35\xb8\xae\x92\x17\x8dy\xf9\x8f\xc7\x1c\xc5.p" +"\xe3\x11\x87!Fb\xa2\xfc\xf5\x0w.\x0\xa8\xdd\x83\"l%\xc3&CC\xab\x97\xd9\xa8\x88\xcc" +"\x80\xb4/\xcc\x14\xc3\x4V\xc0\xaa\xf3'}\xde\xf0\x33\xe6\xb5\x61\x14\xf9\xf1 \x80" +"xAS\xf6\xf7/\x80\xf1\xd7\x99\x82\xabh\x8\x9\xfbYj\xf0\xc\xf\\}c\x88\xf8[\x93<\xdd" +"\x10\xeb\x8c\x92\xd9s\x84\xf5\x9f\x37\xbc\xec\x8c\x86\x9e\xd6>\x2\xc0\x2O\xa2\xab" +"\xe0\x46\xa3\xae\x97U~\x80T\xb1\xc9;L,\xe3K\xfb\xe3\xc2.\x0+\x9b\xe\x32\xa3\xfc\xe4" +"BQ\x9bOC\xca\xc2L#\xaf\xa3\x90!\xca\xee\xd2\xa2<\xb6l\xd3\xe\xc9\xcbM\x98\xc8\x91" +"\xb9\xa7\xf2\x8a\x1e\xdcRG\xf6y&\xc3\x5>\xb0\x35J}[1]\x9f\xaf\xdbO Gl\xa0\xa6\xf3" +"#\x91\xb0z\xe8Z\xa3\xed\xa2\xaf\xbe\x39\x88`%W\xaa\x8a\xb6I\xc8\x93Q\x91r\xda\x17" +"j\xcc\xc0\xa6\xf0\xf0\x34qa\xa7\x82u\x81u\xc\xb9\x97\x9b\xe6\x80\xb4\xb3\x10\xd5" +"\xd6\x36\x1\xe0\xe0]J\xb0\xbf\xf5\xa7\x88\xb1\xbe\x8a\x42\x46\xa9\x8e\xd8*\x1a\xb" +"\x15\x1b\x1d\xa7#\xcf\xdd\xf8v\xd0\xcd\x1d/\xba\xa0\xc2\x13\xd6!j\xfb-\x17\xa8\x9f" +"+\x98\x62\xa1$E6\xe7\x91\x46UcUS\xed\xe9\xcc\xd2}\xe8\xce\xa8\x61MQ\x85\xd0-\xea" +"\x3\xd8\x90\xff\x37\x97\x41GjX\x83\x7\xc4\xf\x86\x19\x8d\x84:\x14\xdb\xc8\x43\x8c" +"\xfcu\x97\xfbq\x97\x83\xf1\xbc\xc6q\x19\xc5\xdd\xc6\x7fl 7\xe4\xd7G\xbe\xc1p\x94" +"!\xf0\xc9\xda\x14\x4\xea\x8b\x8d!\xc7\xa1\xdd\xe8\xbc\xed\xfa\x65\xfc\xae\xf1\xba" +"p\xba\x17\x17\xfb,\x95\xc4\x64\x19Ot\x8e\xf7\xaaSI\x8b\xec\x31\x7f\x39*\x87\x1a\xa5" +"\x97!\x9bv\x85\xfe$`\xa5\xdf\xaf\xb8\xe8Ltd\xddZ\xef\x9j\x83\xd6i\xc9\x43\x5\x9d" +"\xc7\x38\xf7\xf7\x85\x43~\xd4\xf9.\x10\xf\xae\xaf>\xa4\xea\xbc\x19\x9c\xe,e\x13\x9c" +"8\xae\x9c\x64\x35\xc7\xd3\xe0\xedQ\xc0\xa0?\xc9:\x1a:\xf6\xc7\xce\xbf\x14\x1bO\xa9" +"\xe7\xd8\x41\xc3\xdan)r\xd1\x94s\xd8\x38\x83-(W\xfe/\x8\xf2\x8b\x8dG\x12\xbeHB\xf9" +"g\xbbq\xa2\xa5\xa9\x65\xe8x\x11r`\\\xb6\n\xd1)\x1d\xc0\xab\x91\xdbI\xde\xe2\x97\xd1" +"\xd9\xd0\x5\xad\x9d\xf7l~\x9cK\xc3P\xb5\xaa-\xae\r\xe9\x7f\xbcI\x94\xac\xa2l\xe2" +"\xd1\xb1\xd9\xa7\x97\xab\x14\xe9\xc5\x8es\xc1K\x9c\x1e=k\xf3\x9=\x9d\x43Z?\xf7JZ" +"\xe9\xd2\x9e\xc0\xa9\x83w\xbat;\xfa\xf4\x9b\x8dhC7W\xf1\xc9<\xb5{JvW\x88\xba\xfd" +"\xf9-Y\xfWS\xa4\x83\x3\xb4\x85L[\xbe\x1d\x36\x8b\x87?\xf8\x15\xf9p6\x9bv\xdc\xc1" +"J\xe3\x8\xa9\xde\x8e\x6W\x9c\xf6\x65\xfe@t\xe2\xf2\x10|\r\x1a\xa1\xb4n\xb8\x9f\xf1" +"\xe4\x13\x81\xed\xba\x93\x9e\x42\xf9=\xb9u\x8\xed\x9b\xf0\x1bN\xf\x88\xee\xb9\xc9" +"T\xa6\xb6\x30-\x1e,\xaf\xe3p\x9b\x33|\x1'\x8\xf1\x93R\\ c]\xba})iV\x14\x43\xaa\x35" +"W*\xbb]z$\xda\xb1o\x13\xd9\xd0\x94T\xc5\x36\xac\x30)\x9e\xd2\xab\x97\x92N4\xbb[\x94" +"_\xd2X\xf3&\xa6\xbd?p\xb2\x80\xe7[8\xd7IO\x11\xf6>\xfdO|=\xa9\x8b%\xb8\xd9\xd3U\xbe" +",e{\x93\xec\xc1\\\xcc\x82\x84\x9c\\\xea\x96\xf4\x1b$q\xac\x8[\x14\x43\x45\xb8\x8f" +"K\xe0\xef\xb6\x17\xf3N\x89\xbc\x92'\x1b\xc9\x66\xc:\x18%?\xc0n\xeb\xd1\xe3\xad\x1f" +"\x17m\xec\x30=\xbb]\xe4i\xb7\x6\x93:\x17\xfb\xf0\xbf\x19jT\xbbqk\x95#\\\x92\x85\x43" +"nXh\xe7Vx'\xbapwF\xe3\x17[\xb6\"\xb9>:\xbf\xb8\x61\xe9tD\x3V\xc6\xec^\xb0\xce \x8b" +"{\x9e\xc5\x92\xf0\x1f\x97i)\xadlap\x9e\xf6\xa8\x89\x99\x8f\xfe\xb1Tl\xd2\xc9\xbe" +"\xcc\nJ\xd0\x45\xa1W\x8d,F\x89\x43\xae\x4]\xd8\xd4\x8cZ\xdf\xb0\x92\x97\xafX\xd2" +"%Y\xbf\xa6\xec\x1aJ\xdd\xd4[\xe0\xea,\xb3U\xa5\x1f\x9\x1c\xf3\xa0\x1c\xed\x7f\x4" +"4\x99\xbd\x80\x15\x10p\xb2\x14\x83\xcepn\xfcZ\xb2)UT\xfa\xec\xff\x38\x35\x65\xdc" +"\xb2\xa5\x96\xb6`\xf1\xc5\"\xcfm7\xe7\x14LRL\xf7\xc8I\xfc\x1c#\xdaj]\xb5\x1c\x92" +"\xd9\xc8\x41\xc7\x85\x1a\x94\xef|\x8ch\x8d\xfc\xbb\x3\x6r-b\x8Q\xf\xc3\x1d\xd8\x10" +"\xb0\xd5\x33L\xf5\x8b%I\x0\xcdu51}Z3\xd1\x96\xf7\xc4\x1b\x9al+\xd8W\xb1\xf6\x87\x86" +"M\xa6W\x7f\x7,\xa0\x99\x98\xb+\x1c\xb4\xeeRj.\xae$f\xc6@\xcbI\xc'\xb0\xbd\xb4\x45" +"\x3\xa5\xd9\xb5\xe9\xef\xf6\x93\x17\xd2>\xecG\xbd\x2%{`\xa8\x43\xaaj\x1d\x30\x35" +"\xd3\xba`I\xa3\xb9\xa8(Z,D\xdc\x36\xc2\x36'/\x12\xedsK\x3\x44\xed>Y\xe7i\xc\xf9\xed" +"\xaf\xd0\xd3\xe0R\x6\x30\x90^[\x89\x46\x45\xde\xafr)\xa5NHkY\x86\xd0\xa9n\xf6\xd6" +"\x9c\x14;\x1bw\xe4\x1f\x8b.1\xec\xf2\x35Y5\x4\xf\xac\xb6\x6\xa3\x8d\x14nkkL\x9a\xdb" +"`XA\xb3\xf2\xacp^\xcf\xef\xc6+\x12\xd1\"\x15\x8cr\\\xa6\x0\xc1\x37I\xf6:\xf0\x96\xa9\xd3\xf\xf2\x8f\xba\xcb\xd0" +"f\x9\x8a\xf0\x16N\x8c\xe0\x31YZQi\xd7\xb7\xfd\xc8\xb\xf8\xc4\x10\xafU\x9c\x1a\xc6" +"\x86,\x86%\xfa\x8c\xa9\x83\xf1*\xfb\x11\x30\xb\x92\x46\x32\xa1W\x3\x45\xd9&\xa1\xcd" +"\xb3\xb6\x66\xa3\x82\xa0)\xd5\xc3Z\xa8\xa5\x83\x83\r\x99m\xdct\xa9\x17{\x97\xbd\x8c" +"\xce;Rc\xa7\x14\x8cy\x9d\xc2\x19\xb8\xa1\x95\x8c\xae\xe1Y\x8e J\xe5\r\x85\x87*\xae" +"\x9\x30\xb9\x65\x13uPD\xddX\xcd\x9a\x8d\x85\x38\xcc\xe4\xa4\xcf\xaaL\xca\xd5\x43" +"\x5\x16\xdb\x8f\xe7\xf0i\x16g\xac\x12\x2W\xd2^M\x11" +"-\x84\xb2p\x94\x9e\x0O\x18U\x1c\x95\xc\x88t\xa9\xce\xeb\x61\xd4nJ\x7f.\xc8u\xc9\x5" +"\xf5\xdd\xc6\xf4Yj\x17H_\xab\xdd\xb5\x61\xd1\x44\x19\x41\xc7]w\xa4\xb4\xcfK\xe4\xc4" +"x\xd9\x62\xe5o\xa5\xe0\xb3\xe\x87\x36\x1d\xae\xd0\xca\xb2`\x83\xcb\xae\xb9\x38\xf2" +"\x3\x10\x86\xea\x91N\xed\x1c\x38\xd2\xe8\x65\x18\x6\xf6\x15\xd5z\x9cYc\x1d\x46\x36" +"\xb2h{@\xb1r\x99\x17&z\x9\x63\x89\xb0\xa8\x1\xce\x30\xe5\xee\x3\x36\x8c\x16\xf5\x41" +"\x86\x9e:\xe9\xcc{`\x9;\x18\x66\xb6\xcbq\xa4\x1f\x8\xa5\x1b$\xf\xfd\x98\xb3\xd9\xa5" +"~\x81\xb9-\xa1j\xcb{\xeq\xfc\x84\x6\x1a-h\xb\x7\xbc\x34\x87\xc8\x8c\x66\xef\x10\x2" +"\x4\x31\xd7-\xbd\x36h\xc2\x85\xb1l\xdcm\x85\x35\xc8\x9f\xde\xdd\xffx\x2\xff\xbb\x30" +"\x82Tr\xcbp\x9cxk\r\xef?\xbfx\xfb(wcnE\xd2$\xb3\x85\x3\xaa_\x17\xe9\xee\xc7YO9\xca" +"\xc1\x32\xe\xe2\xda\x89\xe6\xd3\xb0\x31\xc8\xec\xfbZ\xd6T(m\\,-\x8e\xf3\x83\xb$:" +"\xb5\xb7\x13\xb4\x92jU\x96\x5\xd6\xe0\xa4g^\xe9\xcb\x42\x9a\xer\xa8\xc6~\xc0\x9a" +"\xd1\x9f+\x93R\xaev\xa0\xe8\x81\xda\xc1I\x8c\xba\xa6\x42\xd1\xb6\xc7P\xa8m7,\xc0" +"\xe8K\xca\x86'\x19\x91O\xbd\x8bO\x8cg[\xb2\xb4\xfb\x86\xd7\xb7\xc8\x8d\x10\xae\x46" +"\xb8\x9\x1aY\xe~\rF\xfb\x15\xe\xb1\xed)\x95\xef\xbd\xc0\xb3T<\xd8\xb1\xd9\x46\xfd" +"\xe7,hh\xa4V\xd6\xf8i\x88\xaa$\xd1\xd3\xaa\xa8\x86\xa8\x7J\xd6\x92\xc\x91.\xaf\x1b" +"\x1e\x34\xb9/<4\xbW\xc1\x9d\x92\x9e\x9a\xb9k!\xfe\x42\x96\x89\xec\x30\xa1\xff\xe7" +"\xa6\xdb\xae\x13&\xedGm\x3\xfH\xad\xca\xb3\xe3\xe2\xdb\xc8\x1f{\xb6\x64\x1b\x63\x14" +"x\xa8 \xe0\x96\xe9\x87\xf5\x1e{\x92\xc9\xf4\xa8\xcd>\xf;a\x80\xa7\xe7\xe9\xa5\x1b" +"\x7z6\xd4^\xea\xc8\xb9\xb6\xeb\xe2\x86\xfc\x9d\x8a\x15}\xd3\x39\xa1\xf2\xabj\xfc" +"B\xb7\xd2\x16\x34x Qn\x7\x0%T\x1fh\x92\xb8\xd4\x2\xa7\xf5=\xa3\xbc\x84\xa4\xb0\xa0" +"{\xe8\xb0\x94\xcf\xe2\xae\x9a\xfe\x13xQ\xf0*-UI\xdd\xdc\xf6#\xbb\xe5\x7\xd2\x15!" +"`K\xe0\x19\xa5\x1f\xf[5?a5\x15h\x96\x63\xcc@@\xbd\xa5\x16\xb6`0\xcm\xb6\xf0\xbdr" +"\xf6'\xfe\xb1^h\xf1\xb0K\xdc@\xb5LL&\xc4\x6\x1a\x89\xfb\x93G\x13\x84y\xb3\x8aY\x91" +"\x8a\xe5\x62\xee\x32\xd9\x31\x90*\xc2\xa0\xb5\xae\xafk\xf4\xb2\xb0\xaf\xe1\xb5\x13" +"\xa3Zn\x9f\xa2\x44\x89]\xb3\xdax\x98\xf1\x1e>\x95\x31\xfe\x9c\xbb\xb4\xb0\xe6\x65" +"\xed\xc4\xc6\xb5g\xfc\xea(\xa5\xef\x14\x9\xa2H\x99\x4S/P\xc9\x1b\xcdo\xe7\x4,G\xfa" +" 2\xf2S\xf6t\x98\xf7\xd7nd\x12]\xc1\xaf\x7\xd1\"\xaek\x82x\xe1\x46\x8b?\x86\x6s%" +"\xb1\xb6\xfb\x64\xd1\xb9K\xec\x96\x10~d\xf6\xec:c\xafsO9\xd6M~\xb2\xc4\x15\xc9\xfe" +"1dsnk\xb3\xd5\xb2\xd2\x46_KyL\xa0\x85\xc7\x62\x7f\x88-\x87\x11\xa4\x1e\xd1H\xfd\xd5" +"7!\xb8\x10Q&\xfeX\x4#W\xbbI\x91\xfd\xf3\x33&\xdf;\x1b$\x80\xe0\x8eS!]\xebQ6\xce\n" +"\xab\xc6@\xaa*gi\xac\x37\x89\x8c\x0\x87V\xae!{Y\xc6\xe8\xfb\n\xdcl\xdc\xf9\r\xb8" +"\x4\xe5\x1e\x84\xfe\xac\x91\xeb\xa7K>\xe1\xbe\xec\n?\xa4O\x18\xa3\x3@\xbb\xc6\x17" +"i\xf6\x62\xec\xf0\xb1k\x1c\xbc\xf4\x5\x9f\x38\xfe\x93>\xea\xbd\xd9'p\xf4\xde\xfd" +"\xfc\xd8\x44\x1f\x7fYm\x1d\xc0\x95\xf9'Y]p\xb8\x9d\xa3\xe9u\x94\xb3:3h\x9fH\x8d|" +"\xfbzls\xbe\xc4\x62\x35h\xdd\x17\xcf\xa3\x98\x45\x61\xeb(UQ\xaf\xde\x35\x38\x1a\xeb" +"\xe\x82V\xbd;\xa5\x8d\xfl\xd3\xa4\xa9\xc8\x7=AK\xda[y&(\xfeZ\xc\x89M3\xebyv\x8\x17" +"\xc2\xaf\xea\x3j\xba\x15\x5\x9b\xcb\x81L\xf2\xee\x9d\xa9\xea\x14\x33\x90vO\x95\xce" +"#]\xecI(\xe5`\xf5)\xb5\xa0\"\x61\xe9Z\x4\x8\xc4\xf4(\xc5\xf1\xc8\x63zj\x87\x8f\xe2" +"M*l\xbb\"\xaa\x7\x8d\xc8\xaa\xb0\x1\x46\xaf\x33\x89\xbe?\xfb]l\xd9\x6\x98\x43\x8f" +"[Z\xf7\xda\x8\x99\xbf;{\rO\xa0O\xe2\x63\xe9\xd7(\x1et\xae!\r\x8aJ\xe7\xb2\x90\xde" +"\x17\xea\xee\x36\xcf\x35\x89\x9b\x15u\xdd\x62s\xdcP\x9d\x8c\x15\x6w\x96\x82<\xac" +"\x82\xd7o3Y\xf8\x2\xcf\x1ci\xdc$\xffv\x5\x45\x39\x38\xa6\xac\x8b\xbc*\xdd\xf2\x8f" +"'\xc9\xba\xfa*\xfa\x1\xab\x43\x99z\x81\x93\x33\xf6\xa4\x96\x62\x86\xe7\x98\x41\x7f" +"/\xbf\xbc\x14\xc4\x38\xe\xe9\x65\xed!:\xa5\xca\x64\xdc\x9e\x61\xd4Q\xd1\x7\x43\xb0" +"R\xc3\x9f\x3>\xcd\xee\xfd&\x8f\x42\xbd\xd3~\xe3\xc2\x9f\x8a#\xd5\xf4\xb8\xf7\xdf" +"\x19m5\xa2\xfa\xfb\xd2\x88\xe5U$r\x16IC\x3Lt\x10\xf3JB&g\xea\xf4R\xb6+\xda`\xe9\xc0" +"\x8e\x9ar9\x1b\x12]|Ji\xfd*\xd5\xb8\xb\x66\xb0H\x9b\ny\x8d\x62\xb1\x31\xfe\xbevA" +"\x87t\xd4\xaa=\xbcG\xb4\xbe\x9a\xa1\xd8\xf4\xc6#\xb4L\xfe\xd8\x66\x30\x5qM\xb6_\x1f" +"^\xe3\x83\xfbX\x90\xdf\" B<\x88>\xf7n\xdd`\xc5\x9O\xca\xc6\x12\xc0\xb0\x1cNMt\xc" +"f\x8d\x12z\xf2t\xcd\xcd\x1aV\xcfO\xea\xa7\xa8r\xd7\xc9w\xa1\x44\x0,}-\xad\xf1\x6" +"Mx\xeb\x35\xe7s\x8d\x99|\x5S\xfft\xdb\x30\xf1\x94>!\xe6\xe4x\x17r\x1\x34K\xd5\xd9" +"\xb5\rr\xbc\xdf\x1\x62\x8fw\xf8\x9e\xe5\xf7T\x99u\xear9\xb2V\xa2\xf3\xec\x8e\xae" +"\x2\xa8\xb4\xd2\x8\xddY\xed\x45\x8\x63\x43\xeb\xa7\xfe\xee\x15\x13\xd0\xd6G\r\x84" +"O\xc3\xf4\x62Z\xcf\xdb\x2\xado\x1c\xbd:7{\xc3\xb4\xc\xaf\x1a\xf0\x88q\xab;\\\xa4" +"\xe8\x38_\xfb\x31v\xa9\xc~\xce\xd2\x83\x91\x2:\xd4\xc5\x15p\xe5p\x11\xa2\xcd\x8e" +"\x9^M\xb0\xb0\x89\x99v\xea$\x11\x5\xcc\\\xe7?\x96\xa8\xcd\xd3\xc5\x10\xbd\x9a\xb9" +"t\xdf\xee\x1c\xf8\x8d\x84(\x9a\xb1\xe9\x5\xf7,\xd1\x41z\xb8\x63\xc2\x61_\xff\xe8" +"\xd5\xf5Sv@\x4\xf6\x41[Y\xe4\r\xb7\x11\x10=\xb\xddu\xb9\xb8\x18x\xac\xad\xc8\xab" +"\xe1\x12\"\x65:\xf4\xdc\x64\xc5\xd1\x5\xb5\x3\xcd\x85\x45)\xd5\r\\\xb4\x36\x3\x39" +"\x95\xe4\x6L\xd4\xdcY\x3\x81\"\x10\x46\x44\xbbV5\x11\xe1[)\xd3\x91\x93-yt\x10\x8c" +"\xa9\xb~\xec*\xe3\xe4q\xa3&L\xf3\xd0\xe9&\x9e\xa5~Z\xe\x38z\xae\x85\xad\xc\\\xba" +"\xfd\x83\x84\x43\x86\x95=\x8dy\x1f\xb0\xac\xf3\x87\x98\x1b\xa0\xa8\x91\xb\x17\x64" +"\x8\xf7\x64\x17\xc8\x9f\xbc\x45\xb2q*\xc5\xde\xf8\x63\xf3\xc8k\xd0N?\xd5\x86\x38" +"\xbc\xef\x83-\x81\x16\x18\x4\x8c\x30\xc9\xdf\xc8\x30s\xc2\x38\x9bm()\xa5.\x92y\xbe" +"\x98\x66\xa8\xd6#x\xd0\x0\xb3\x8|\xe0\x9c\xe9,\xbf\xd0\xa4`\x92\xbf\x4\xcb\xab\xfe" +"\xd2\xd7H\xaa\xa9\xfa MD\x8e\xb6\xce\x63\xab\x7f\x46k\xd8\x9d\xffP\xcew\x9dv\xe$" +"\x7f\x7f\x18\x31+\xe4\x1b\x33n~\xc1T\xf3\xf4\xfc\xd6\xbe\xe1\x41\xba\xb0]\xb7q!\xa0" +"\x3\xa1`\x7f\xe6\xb3*\x0\x80\xbc\x95\xb8hkS%\xb8\xe1\xaa\x41\xf8\x16\xa7\x7f\x16" +"\xe2&n\xac\xd9\xb5\x91\xe$\xaa\x6\xdd{\x96\x90;\x97\xdf)\xe0\x97\xdc+\xdcG@e\x8d" +"`\xf2\xb8\xda\xcdN9\x8 \xb1O\xb9\x61&\xeb\x97\x91\xe4\x66K$\x4\xce\xe4\xea\x14\r" +"\xeb\xc5\xff\xaa_8\xb7o5NI\x97\xaa\x42\n\x80\x35\x31\x45\x46\xc\xc9J*\\\xb\xc7r\x15" +"T\xf2:\xc7\xda\xcf\x0\x8b\x12H\xc1J\x85'\xad\xd8\x36i-<\x2\xf0\x88\x92\xc7\x9e\x63" +"\xcc \xec\xa2\x9b\x98\xc3W7L\xff\xca v\xfb\x5\x33\x97m|\x3\xb\x8e\x7\xecK\x18\xe" +"$,`\xb3\xd6\x12\xc0\x8d\x66\x44\xdc\x30\x7f\xef\x9a\xaa(\xc0\x81I\x9a<\xbf\x41\x9b" +"J\xd5\xa0\xa6\xfh\xa9\xd6\x13\x11w\x19\xda\nG\xd0\x42\x44]\xc3I\xe\x9a\x1dx\x15\x90" +"\xed\xda\xd4=\xd4\x61,\xa4\xf\xd4q\xe5\xa4N\xc\xbe\xc@\xae\xe2\xb5\xc6u\xdb" +"u<\xb9\"&86\x1d\xfb\x18VyO\xc\x38;LR\x8a\x80\xe8\x18\x9c\xb1\x89\xbcIg\xfek\x1e\x84" +"5\x19\x14\xea\xcfx\xb2$\xe5\x8d\x8\xbe\xe7PnlP\xb1#\xc1\x82QWQ\x1f\x83\x11\x8bp\x85" +"\xfe\xf3=1\x1c\x93\xe1\xa5\x1ev2Y\xfc\xb6:\xe4%\x8fI\xed\xa1\xed\x9s640\x5\r.ER\xb6" +"U\xe3\x8e\xe6\x15\x15\x44\x97\x44\x44\xda\x9a\x4\x42?\xe9\xb6\x44\xa0't||\x15\x2" +"\x9e\x4\x15X\\;\xc8\xbb\x91\xcb\xac\x33P%\x1eKfB\x1a\x12v+7\xc7\xc4\xe8\xca\x94\x39" +"\x90\x33Zf\n^\xbb\xca\\{+F:&\x3\xb0\x87;}\xcayO\xa2\x9a\x1*}FJ\x89\xbc\x88\x8b\x96" +"\x9bq\x1c\xda\xab\x92\xacI\xb7\x1bi\xf6\xae\xbe\xe7\xb8\x80\xe8\xf2\x1cG0z\xe5Y\xc6" +"\x95\xdc\xaf\x11_\xbb\x1b\\\xa3j{\xa9+\x9f\x30\xfe\xd6k\xd9)\x91\x32\xeb\xe8$zS\xd7" +"\xc0q\xd3\xe5\x31\x63@\x10\x83\xe1\xe4Jw\xedG\xaf{\x95\x34\xe2\xd2P\x83\x37\xa4\xe2" +"7>k\x84\xea\x34\x99X \xbd\x31\xcf\x99\xdeG\xcc\x34>\xe7\xac]yV\x86\xffm9F\xf6\xa7" +"\x18\xa2\xb4\xe1\x38\x8ej6a;\xd0\xb\xe9\x8c\x1\x7\xafV\x90\x43O\xb0\xf8\xd6\x41\xdc" +"X\xf4u\xa3\x82\xb2O\xe1\x84\xb9\x6\xb0\x1\x14\x62\xd8\xdaXu\xd2\x92\x84y\x99\x9c" +"\xc0\x1b\xca\xfb\xc\x15\xeb\xd5\xaf\xc4\x12\xcb\xf4\x11\xd1\x1c\xd2\xf3xy\xa1w\xd1" +"\xeb\x1e\x19Qk\xc\x87N\xaa\xa5\xa5?\xb4\xc\xe3\x37S\xe2\xe9\x93\x61\x87\xe4\xdeQ" +"HhrG\xb\x15\xbfT\xc6t[C\x86\xd5h[\x81\xf\xa7\x1f\xa6\x8f%\x8\xfb[\xa2\xce\x9b)u\x8b" +"m\xa5#\xb8\x95\xd6|\x1\xd3\x1c\x98\xdfM\xeei)d8\xe7 \xbe\x38t&\xc7\xd6V\xd2v.Z\xcb" +"\xc2\xa9\x84m.\xfa\x8eI@t\xa1\x81Gs\xbc\xca\xaf\xfc\xb2\xc\x82\xd7\xf7(\xa9\xcd\xee" +"\xb9\xc4\xc7\x31\xe7tO\x94W\xf5\xb5u\xeb\x8b\x19 \xd2Y\xc0\x9[6\\\xaa\x35I\x8\nQ" +"[\xb4\xa2\xe1\xed\xb5\xda\x8\xe\x12\xb2\xd6\x5\x41\xa7\x12_6B7V\xe\xca\xf4\xa3\xb6" +"\xd4\xb5R^\xa1\x14L|\x1d\x66\x9b\xdb\x14\x62U?\x9a\x1\xb5\xd1\xe0\x37\xd6\x12\xda" +"\xd9\x5\x9a=\x7fpm\x8d\xe4\x9b#N\xb\xac\x63\xdb\xf6\xed\xd7\x8a}\xe2\x0\xdch\xfe" +"\xd3\xde\xb9\x1c\xb2u\x86\xe0\x46\xb7\xeb\x1c);\xc0Kf\x8c\x13\\\x17\x64\xbc\xbe\xfe" +"\x4\x9c\xfd\xfdHi\xd6$\xbb\x88\x45\xaa\xb8\xaa\xda\xd9\xb1\x82^\x83\x19\x15\xc6\xbf" +"'\x96\xd5\x9b}\x9\x3 \xa7\xd5@\x7f|:\\\xde\xe2\xabt\x8dT\xe1\x18W\xf6\x41\x9b{\x1" +"i\xfb\xd1Uk\xfep\x1fR\xb5J+\x82\xea\x1\xf0\xc8\xa1\xa1\x61\xb4\x9a\xe4\xcbq\x11\xab" +">\xfc\x90\xf7\xbe\x35\x99YM\xdak\xc7\r\x36\x45\x39\xfao\xfa\x4-st\xdc$\xbd\x86\xba" +"\xf9\xbe\xae[\x11\x10\xa5\xa4\xaeM\xee\x32\xfc\x66\x7HRos&,\xe7)7\xd8\xdb\n\x34\xaa\x91" +"\xb2\x30t_Jg\x91\x1eN\x80\xb0Hd\x8e\xcd\x8a\x8e@\xb9\xb\xea\xebr\xaf CB/f\xe3\xa5" +"\x91\x96*t\x9b\x95G\xe0\x95\x16\x1fwB1\x85\xeeTNs\xd1T\x94\x18\xd1\x90\xb1\xc5\x81" +"\x95\x1f\xf3\x62\x1\xeb\x81t%\xa7s#\xd8\x4\x16\x2I\xdb\xce\x89\x8d\xe3\x95\xf5\xce" +"\xff\x17?$\x89\x64\n`\xe5)\x2\xab\x80[\x93\x61H\xa4\xee\xcbg\xeb\xf3\x9b\x93x\xbc" +"\xf8\x81\xa2-\xe9`\x84\xd7\x18\xa2\xd0\x44{~U\xc1\xb\x8em\x9d\xaa\x65M\x96\xce\x11" +"\x13\xf6\xbd\xd0\x45\xe4\r\xd8\x85\x34=m\xefSW\xf1\xaf\x85\x85\xcf\xcd\x1em#\xd9" +"\xfd X\x82T\x9a\x61\xby\xe\x61\x80\xac\x84.:6\xda\x8c\xb5\xe5\x90\xf9\x10^C\xd8\x95" +"@q\xdf\x6\x8f\r\xba\xac\x1f\xa3\x96#,Y\xe0\x8\xd8\xc8\x86\x9b\xd8\x11rA\xb1\x7$T" +"V\xc9\xf6\xf7\x44g(\xa1\xac!\xd4\xa8\x38\xdf\x85\x96\xe0\n\x98\x14\xad\xc8\x88\x2" +"z\x90T\xcf\xc8\x61~\xaf\x1d/\xeb\x66\xbc\x31\xd0*\x93\xad\xa4\xccX(\xcc\xd6\xea\x5" +"U\x1a<1W\xf\xf8\xc7$\xccoc\x97\x32\x8f\xb7\x8c\xf6\x10\xb6?\xd1\xee\x82;\x9cu\xf0" +"2\xe0\x18Y<\xcaw\x19u\xff\xf\xe7\xc1\x61\x65\x36\xf4[\x9a^)\x85\x39\xe3\x43\x36\xfc" +"\x9d\xa7\xb2\x4\x2\xb1\xd3\xf6(]\xec\xf5\x4U\x0*y\xb8\x82N+{\xa0\x6\x9f\xf3\x9b=" +"A\xf0S>\xa9\xd7\xea\xd7 \x14\x65n\nbPa\xe8(#_\x11-cc*\x19\xdd\x80\x8c&\x91\x18\x4" +"\xdb\xa1\xc7Q\xb3x\xf9\xd3(\xe8\x41\xd3\x94(\x9\xe4\xd9!\x5\xf2,\xf4\x15Uk\x9b\r" +"]j\xf4>,b\x1d\xe6\xba\x34\xf5\xb0@&\x89\x61\xbeV\xed\x89\x13\x10\xd8\xbc\xe7x\x9b" +"\xe4\r<\x9f!F\xfb\xd9\x8cmj\x87\xce\x61\xf6P|\x8d\xb4o\x1f\xf4PGm\x16\xa8\x14\xae" +"dS\x88N\x1b\x6\x15\xeeG\x2\xcd\x85\x66\xb3\xeaU\xcb\x13\xadr%\r\xa1\x9e\x96k\xbf" +"\xc2=\x9f\xa7=\xd4\x35~=S\xf9'c#\xa9\x39\x8\xc9g\xb2\xb0\xcc\xb3\xc4\x81Z\xe8\x12" +"=\xc8\xe0(\x7\xbc\x6\xc2\xfd\x43)\x8d*\xbfqZ\xaaPp\xd3J\x94X\xb7\xc5\xfa\x31\x37" +"\xef\x11\xe4\x81\x9c\xc5\xbe\x17\xcd*\x17\x61]d\xc6\xfd\xbe\xc6\xdc\x61\xf5\xd6\xe3" +"\x81\xa9\x66\xf0\xfe\x99\xec\x62\x13Ua#\x5\x83\xf4\x5|\xfc\xca\xba:e\xd2\xfb\x30" +"\x92\x13\xc2\x8d\xd1\xd1o\xe9\x8etY4\xc\x86\xdaV\xec\x83\xf6oY\xa3~\xad\xd5#%\xb5" +"A\xe1\xb9]\x91\xa5\x91\x17\xe0\x38\xd2\r\xb8/\x3j\xad\x19\xf6\xcc\xca\x3#f\x9e\x65" +"\x11P\xb4<\x91`s\xf5<\xe\xfe\xe9\xdc]\xc8\x86&$\xb7=[\xc3\x31\x35\xcbr\x8f\x15Vj" +"~d\xf8\xde\xc3\xed\xb6\x16\xf1.#\xf2Z\x8d\xafl;\x9x\xd7\xa5\x1a\x33\xbc\xf1\xfd\x9e" +"O\xed\xb\x5\xb8\xee\x95<7\xa8#\x8c\xe6\xff\x43\xd9\xb7\xe0\xf0\xa4\xa4\x1e\x10\x64" +"\x1b\xa5\xf2\xfe\x8d\xe\xbd\x43\xfbo\xd6\xfc\xca\x41\x95\xd6\xf9\xb3V\xf6\xb7]\xcb" +"\xb8\xeaj \xffP\xe5v\xdf\xa6\xdb\x1c\xcd\xd7\x64t\xc9\xb2;\xea\xa5\xd0\xfeqc\x5\xad" +"ma\x1b-\x81\x17T&\xa6]\x1e\xf3^\xbf\xb6\x16\x0\xdb\x18Q\x16\xaf\xd3\x16\xa7\xaf'" +"\xca<\x1f\xaa\xdc\x5\x1c\x46\xbe\x46\x1\x18u~\xa1Y\xd8@eSx\xa6(\x91>\x8f\x8b\x9e" +" \x6Kv\xd7/v>\x8c\xf3\x1d\xe\x84\xf5\x81\xcf\x65\xd8\xa9\x17\xef\xadt\xef\x3\xca" +"\xe\xfc\xc2`R\x15\x34$WE\x1e\xfd\xcb\xfc\x1d\xa6\x1f\n\x81\xd5\x8b\xc9<\x7f\x12\x39" +"\x97\x2\x16\x1f\x32Y\xfa\xd6\x8e\x98V\xa2\xeb\x64\x92[^\xff\xcc\xba\x1\xc9\xdc\x11" +"5\xb\x41\xcagt\x0\x1ft\x87l\n\x5Na`T\xbf\xf2=s\xfe\x4\xeb\x86y\xb3\xb2\xd2\xfb\xd1" +"\xaa\xd1\xab\xb0\xe0Z\x84\x63\n\xad\x1c\x64\xbf\xffL\xb9\xb3\x1d\x8a'\x15'u\xeb\xd2" +"\xd3Hb\xc8O,\x8e>\x11\xa4\x15\x61\x1f\x92\x91\x8u\xb9\xcd\x86\x15\x83\xb2\x83\xcc" +"\xfc\x9e\x80qF\xb3\x9b\n\x42\x9a\x80\xc2\xc6O\xdfpQ\x2n~w:\xe1\xf\xf5OH\xc6}i\xb7" +"\x5\xea`\x98\xae\xd8\x8f\xfb\x83\x97z\xc6\xa2 \xea!)}\xb2\x2\xce\x91I\xd0\x7\x9a" +"\xee)\n\xe0\x8c\x63\xfa\x1a\xbb\xe9\xc1\xee\x0\xc6\xf1${\xf7\xc4\xbb\xe0\xc5.\x2" +"0\xeasc\xa4v\x96\xa3\x31\x8ao\xd8\xe3/\x1b#\xdas\x1a,\xc\xc1y\x4\xc8-\xf9\xe7\x10" +"b\x19\xd8`\xe\xbeLK\xac\x34\xfdX\x9\x65\x96\x9c!\xfe\x63\xefmbss\xbd\x95'\x93\n\xde" +"\xe2\x66\xdf\x36K\x9a\x8b\x3\xf3\xf4\xc6\x1e\x85\xf9K?\x17\xc2\x12\xc3\xa1\xe6{\\" +".\xea\xda\xbb\xf7 \xe9\xdd\xb9\xb1\xaf\xa4\xa1=\x9f\xc0\x41,\x15\x17+\x15\xe5\x9a" +"\xbbgQM-\x18 0\xabG}\x1c(=\xe1\xd0g}\xc6\x93<<\xf5*\x11\x88\x19\x96z\xe5\xec\x16" +"\xd2\x90.\xb4\x9f Y*3\x97\xb0\xb6\xadg\xd2l.\xb6\x8e\xf4G\x12\xe4L\x16\xc8\xbf<\xec" +"\xfa\x36S\xa4\x3\xb5\xff\xc7}k\xcd\x80\xea\xa5\xc4\x80lg\xee\x6\xcfib5\x82\xcd~\xb4" +">I@T\x9at\x7f&\xbe\xdd\xd6\nm\x1a\xdbW@%)\xa9\xba\x64p\x87\xa5o\x96Z\x93Qk\xcf.'" +"\xab#~+\x9f\x61\xcc\x89\xd5\xc6\xcb\x0o\x6g\xd1\x42\xbe\xe8\x9a\xf8\x0\x9aV\xffM" +"\xc2ie{\x11\xf0\xbfW\xf1\xfd{\xea\xc2z\xf3\xfb\xe8[\xf3\xff\xf1Uf\xac)N\x18#\xf5" +"`BW\x8K\xb7\xad\x38\x38\xee\xe6\xcc\n\xa0\xc1\xdd\xcfqz\x92\x14\x61\xa4\xedV\xa5" +"\xbay\xaf(6\xd3\xc2*Gq\xb3\xf0\x85\x14\x83,\xdd\xb0\x96T\r\xa6>\xb9P3\xd0\x7f\xf6" +"\xa0\x46\xe2\\\x98y\xdf\x7f\xf7\x62\x7\xd2\x1c\xff\x63\x97\x1f\xf8u\x2\xf9\x13\xa6" +")\x83\x84T;\x13u\x12[J\xdc=\xdd\xb9\x31\xdd\x88\x1a\xa2\x81\xc8\xb7K\x99\x94!c\xc8" +"\xd9<\x1a\x16\x61\x42\xc4\x31V\xf6\xa4\xe8\x15\xe2\xad;\xd2\x91\x34\x9b\xabS\x9a" +"\xa8\xfc<\xf0+\x2\x18\x9d\x15\xb8\xf7+\x1e\xc7\xcb\x95:\xbf'\xce\x1q\xca\x63hCN\xd5" +"\xc3\x9fZM\xfb'\xb2\xa8Pb\x6\xb9 1\xbf\xb2\xdc\xbb%\xeajP\x92$\x14\xcf#\xa2\x8d\x8c" +"\\\x13\xef\x1\x8b\xba\xf4\xac\x95H\xe0\x43\x42\x61\r\x9e\x9f\x37\xd2\x85\x85\xb6" +"\xd5\x91\x63\xed^?j\xbf\x3)\xe2 \x8b\x95/-*\x1a\x8c\x11u+\x5x\xac\x88(Fb%z^!\x83" +"\x80\xd3]5fl\x1d\xe9,7\xca\x37\xc1\xdagv\x80\xbe\x63\x4\xf6\xfy\xf\x1e\xeeM\x4\xf1" +"U\x0\xce\xbel\xdd\xc9\xb3\xe7\xb6sH\x8b\xcb\x4\x92*\xd7\x19\xf1$-\xd9O\x97\x91\x42" +"mf\xa2\xba\x8\x41\xc5\x63\xc9\x9eWeG\xcd%\xe2\x8d\xb\x90\xc5\xab\xec\"\x18\x9b\x43" +"6\x85\xdbt\x1a\x96j\xb3\xe\x15\xb8-\xcfI\xa8\xd9\x15\x85\xc8\x8e\xc\x31\xc0'o\x7f" +"\xb9\x18\x9e_\xb3I\x1f\x15\xbe%\x9c\xd5\x2\xe9\xb4[G\xde\x10\xbc\x87\x8c\xe|[L\x88" +"\xeb\xe0\x90q\xed\xff.$\x10\xe9\x14\x1b\xdd\x5Z\xb4I\xe0\r\xe8\x1\x45\x92O\x17\x16" +"\xd4\x1T\xf6g\x93\x13k2P\x81\xe7\x31[\x87\x94Or\xf2Vf\xe0'\x10\xcb\x96Y\x99\x8a\xb5" +"\x8d\x90\x84\x88\xb6%+\xd5\xef]\xc3\x8\x61\x97\xcb\x9\xbf\x88\xfeS>\xfa\x8\xd0\xa8" +"=t#\xb9\x8\x8a%\x9d\x35\xaa\x8G\xb7\xe9\x13\xa5\x43\xc2\xad]\x2\x11\xc7\xa1\xc0\xe0" +";q\xdd\xca\xc5\x17[\x96v \x11\xff/\xd4\x16\xdc\x8e\xf9\xbbn\\D\x8f\x84\xa6^\xf2R" +"\x8f\x8c\xd3L\xab\xbf\xdfh\x8f\x14\xb0\xdd\xe9O\xef:I\x4O\xf2\xe2\xcc\xb1\xc8-9i" +"\xa7\xca\xf2\x8f\xee_e\x10\x0\x35*E\x1d\x3[h))*\xc0\xaa\x64V\x91\xb0\xa5\xa6]\x19" +"\xf0|\x9d\x88\x42&\x8a\x10\xf1\x1e\xcd\xe1&X\xd7\xa1\xd9\x97V\xeb\xf5x\x8f\x3U\xff" +"\x1f\xe4\"]\xad>\x19wZ\xfc\xf7\xea\x92\xbf\xcd\x37\x4\x83\xc2\xf_e\x85\x1d\x14\x41" +"\xae\x94\xd2_^x\xbf\x17S\xb6\xd3\xb\xc1\xd5@\xe5\x45\xa9\xa5\xe4\x98I\xfa\x18^\xae" +"\xa3 \x1f\x12\xf1\xf9ZLM\x98\x44\x39\x95\xb6\xff\x84\xd7t\x86\x65@\xc3\x1\x64r\xf8" +"\xde\x1c\x62\xaeJX\xa3\x9a:\xcb\x42\xc5\x6\x86\x39'\xebX(\xe7_\xeV\xb4\xa2\x87\xf6" +":\x99\x88Jamw\xe0_K\xd0\x17\xea\x5\x7f\xd5\xf6\x91\xa6'w\xe3\xbaK(@\x86\x1a\xbb\xce" +"\xea\xde\x83\x39\x16\x33\xe4\x9\xa1\x34#\xc3`\x9e\x86\x2\x11\xc6\x82\xca\xed\xfc" +"n\xe7\x81*M\x97\xf1,\x13l\xe\xfd\x89\xa9\x38l\xf1\xa6}\x8\xc0m_\x94\x83\xdc\x44\xb" +"wr\x8dv\x6\x9d\xae\xde\x8e\x14\xf0\x89^\x90\x97\xb6\xb9 &`\x99\xa2\x10\xa7\x15\x92" +"7\x1a\x8f\x30\xb1\xb3\x9d\xa9\x41\x43/\x99\x12\xf9\x9a\xc4Q\xa7\x65s\x10\x38\x91" +"&\xe0/\x1a\x45\x64U&\xe7\x18\xad\x38u\xfc\xfu]\xbd\xe9\xdc\xb9\x8b\xe7\xc6\x3Ngu" +"\xc2\xf1\x33\xeag=\x8cO\x0zb!\xef\xf0\xd8\x91\xcf\x93\x94\x4\x8b\xf9_\x88\x5\xdf" +"1Q\xb0\xe0IL\xf4!d\xae^\xf3\xe6\x81\x35\xb3'\xe0\xe2\xa7\xfc\x8e\xf5~\xba\x31\x15" +"\xb5t>\xeb\xe8\xa9\xe0\xdfRUN\xe2-I\xe4\x9\xb9kS[\xfa\xe\xb1\xd2wD\xbe\xe8\xc9w/" +"\x18\xb9\x98\x91\xd0\xc6\x92\x9d\"\xfe\x1fY\xb7\x92\xc6\x95\xe0\x82\xdf\x16W\x8d" +"\xf8h\x8b\xd4\xf5\x90\x64xX\xad\x43\x44\xef\xd0\xba\x62\xf4\x38\xe0#P\x16\x46\xd4" +"\xf0\"\xb1\xdb\xabgG\x8f\xf2\xfb\x65'`\xa5\xe0\x8b\xf4\x2\x1e[,w.\xa9\xa1^vtq\x19" +"\x18\xee\xc2\xd5\x1b\xfb\x32;\xd0yY\xbb\xa5\xdb\xa6\x1b\xbb\"\xf0z;\xd1r.0\xf6\x86" +"'\x80\xf6\xeaic\xed\x42K\xf5\x10P\x1f\xc3\xb3\xca\xb6\x10\x34\xec\xa4U\x5\x9cG%\x91" +"\xc3\xc9\xd5N\xc4\x46.\x1cn\x8f\xb9\x2$`J]\x1a%\x12\xe6\xfc\xcc^h\x9e\x6\xf9\xcf" +"x\xea\xb2\x9d\x61\x65\xba+\xdb\xe9\xb9\xc2!O\x3\x17w\xe3Qu7\x9c#s\xaf\x98.\x15\x8" +"AY\xff\x8d/\xe6Uo\xc3\x65\xc5\x7f`\xca\xe1\xe\xf1\x8d\xa3K[\xbe\n\x81Hz\r\x1c\x9a" +"kkF\x8f\xd8~\x10\xe4\x7f\xcd\xfeq\x10H\xef\x15\x0u\xc\xfdZG|\xc4\x1c\xe3\x9\x1ek" +"\x9\xd2i\xdd\xed\x66jE[\xd3(\xa9m\x8b>\xa4\x38\x14P>\xe9\x1c|m\xb0#\xb6\xf5\xb6\xd6" +"\xa3\xbb\x10\x66\x88\x36\xd9\xf3_o]4\x9s!\xa4\xcdZ/\x6\xf9\x42\x18\xbdR\x87\xd3\xb7" +"\x5\x65q\xbd\xd9\xc0O\xff\xbe\xe3\xeak\x2\xef'\xe1\x17\xb6\xebVa\xe2\xfa\x45\"\xd4" +"I\r\xd2\x4\x1d\x9di\xee\xe5\xdb\x1a}q\x85\xca\x32\xf2\x8Q\x84\xdd\xae\xc6\x8c\x11" +"\xa9\xe9\xe8\xc1\xf1\x36\xd9\x38\xdb.\xf\x8f\xe8\xe5\xffr\xe1\xfe\xb6l\xb5\xaeqC" +"\x10\x15\xeb\xa6\x0\x41\x92\xbc&\xdb\x9e\x45\x65\xec\x1a\x1fv\xa1\x86\xa8\xac\xef" +"sw\xadm\x92y\xfc\x91\x94\xe2\x84\x66\xce\x66\xe|8g\x1\xecWd\xf7\xed\xdcU\xec\xa6" +"\x8a\xc1\x8c\xc5\x31Zp\xb9\x17\x8eq\xcf'Q\x1c\x1c\x98\xf4\xe\xdb\x1a\x1d\x62\x17" +"v\xeb\xbd\x1b.7\xd8k\n\xc6j\xc5\xa5~\xe\xc6\x9\xf7\x12\x80]\xae\xa5\x84,-\x80\xc7" +"2\xc1\x12\xee\x8e\x38\xd9Y\xf2\xc7w\xa1\x89$\x14\xae\x82:\xf0\xe4\xba\x8a\x4\x63" +"\xddG\xaf\xd5{6\xf\x2\xdd\x42\x86\"\xef$\xf2\x1ay\xcdi\xb4\xf4\xe1\xcc\x4\x1f\x88" +"\xe7=\x8a\xfd\x13\x12\xe7\x64\xfe\xc8\x41\x18\x46\xce\x92S\xdfO\x89\xe9\xa2}\xe6" +"H\xaf`5C\x1a\x46\xa8TZ\x88\x33|\x89\x8d\xda\x8d*,\xbf\xd8\x32\x93\x7\x98\r\xe1\xa0" +"\x88\x35+\xe6\x18\x63\xce\xd7\xc5*\x9a/\xcc\xd5\xe7\xc4\xfd:?\xf8\x19\x1e\xbf\xdc" +"\xdd\x96g\xbc\x89s\xa0.\xf6\xcb\xe9x\xac\x9b\x1c\xd4\xcb\x94\xb2\x33\x36\x38\xe0" +"bY\xfd\xbfyQ\xe9\xed\xb9\x33\x0>PQ\xc9\xb2\x65\xa7\x9cx0\xb\xef\x42\xee\x42\xf3\xbe" +"_\xb4\xad\x88\xb3\xa2\xb6r\xfb+\xd3\xe1\xdf\xb8\xeb\xc7\x17\xe\x1a\xa3\xd2\xb4Y\xa3" +"\xbbT\xadLU\xb4\xa3\xc2\xfd\xb2\x98tc`\xeb~\x9d\xf2\xad\\\x99{y\x6\x14\xb8\x9b\x18" +"\xd9\x44\xa1\xe9\x10\xc9\x1\x43\xe7\x36_\x88wBM\xc0(\xdf\xa8\x91\x82\xf8\x9b/\x1e" +"\xe6:AX[\xe6\xe0\x99\x44\x88Q\x81\xb9\x1\xbdN\x3\x1cn%#\xe7$\xbb\x8Mp;\xc6\xcc\xdc" +"\x9\x43\xcf\xc9L\xb2\x11U\x81Sv\xa9Qd_\x8a\xd8\x16\x96-\x1eQZ\x8f\xcf\x9dg\xd0\x11" +"6\xcd\x85\xd4\xff*\xdd\x96\xbcR\xfcYJ\xabo[\x10\x32\x8c\x13\n\xe3\x61\x86\xadq\xa2" +"\r\xc2\x45`\xf6v\xa4\xd9W\x10\x17=\x88\x82\xbc\x10[\xc6\xcb\xf6\xda\x46\x87 \xb5" +"\x5)l/\xb9S)r\xd2\x92-\x1c\x96G\xce\xd4}\xa3#\x9\xc1\x15\x46\x1c\x18\xcfTL\xa4\x8a" +"9\"#\xf7_\xa9\xe\x90?\x85\xc6VcRw\xb8?\xfb\x30\xc4\x9c\x9\x8b\xf3\x64\xef\\t\xe7" +"\xed\xdc\x43\x9d\xe6\x85\xde\x9en\x96\xa7\xa7\x43\xe8\xa9" +"\x8f\x30_\x84u\x97\xa5\xb0\xc5\x43x\x95\xd9s\xa9\xc0\x8c+\xe7R\xbb\x11\r\x5'\xee" +"\x9e\x94^\xeb\x5\"\xae\x34\x44\xa6\xf0\x6\x30\xb4\xeaGdLSl\xa7\x66N\xbe\x3\xf0h\xe" +"\n\xa6\xf7\x8fw^s \x7\x17\xc0\x96\xda\xbb+\xd5\xbe\xca\x18\xa3]k\x80\xd5\xf2(\xed" +"\xac\x1e\xf1\x36\x17p\xc5\x44\xfa\x8aJ{\x83 !\x6\x9e\xd3\xe0\xa9\xee\xbe/\x0\xb2" +">\xb3\xbra\xfe\xej\x1a@-\x9f/\x7f\x1f\xb7\x1d\x9b\xed#\x3q\xef\x1f~/d\xf0Q4or\x86" +"\x5k\xc9\x8f\xc9\xe5\x7f\xcaP\x84\x9b\x41}b&\x82\xe\xaf\xf\xa9z\xc2\xe7\xb9N2\xf7" +"\xe5\x1\xfe\xe3S#\xef\xcd\x9d!\x3\r)\xfe\xf6\xfdj\xefSAe\xd3\xfb\xe6\x4\xab*\xdc" +"\x8d\x9b\x1f\x1fP\xad\x86\xfb\x80\xf\x9;\xc6\xd1\x32P\xa4\x65o\xbc\x8f|H\x81\x1c" +"\xf4R\xd9\x64\xf1\xd7nk \x90\x9'x\xd6\xdeV\xa8\xe3\x89\xef\xbb\x4\xc7\xab\x90\xa2" +"BZ\xce+n\xc0\x42\x15\xbf\xfeVY\xc8\x2Q\x8\x4\x1d\x6o\x9a\x30\xdc\xa5\xdf \xe5\xc5" +"\xc4\xe2\x31\xc1\xaa\x1a\xa1g\x96\xf4\x89\xba\xbd\x45\xb7\x88\xd3x0\x9b\x8e'\x87" +"\"\x15Z\xf3M(u\xd4\xe6\xe8>\xda~\xc4h\x85^\xaf\x1d\x63;\xac=\xcap\xe8kG\xe2&%\xfe" +"\xc8\xf3*;\xa5\xb9\xdc\xe3\xb9\x2\xe1%\xd4\x95\x66w\x93\x97Nh\xc7\x86\x887m\xf\x94R\x9aW92\xecshU\xc7x\xeb\xbev\xc5U\xed" +"{ \xdes\xe1\xd3\x7f\xd4\x1b\x61\xaf\x1b\x42\xdb\xb7!\xe4\xff)SO}&\xb8\xf1\x94\x34" +"\xcd\x99~\xcd\xbe\xe3Y\x4\x5\x4\x9c\x9\x84\xc\x91\xf1\x7f\xb7\xbe\xb2\xde\x1fX}e" +"L\x93\xb8\xb8S4\xb3z\x1b\xb6\x66\xf4\x46`n\xb2N8g/\x8d\xe1/\xa0\xd2\xe9\x38>\x2\xa3" +"\xde@\xf7^\xbb\x18Wl\xd8)\xdc\xfe\xc5\xbe\x1e\xb9\x36q\xd8\xee\x16i\n\xd4\x45#\xaa" +"M\x95\x10r\xe2\x83\x12\x7f\xf0u\xa1\x8fU\x95\xd5\xbc\x96!\xfa\x18K\x81\x8f&\x9fX" +",j\xe\xd0\x9d\x86\xf3\x87\x11\xc4S\xb9\x12=\xa0\xda\x11\x43\xca\x33\xaf\xc5\xbbU" +"\xe6G\xa6\x12~\x19\xcd\xb2\xf0O\xc9gF\xa3?\xc3R\xfb\xed\x41\xaf\xca\x8d \xae\xb4" +"\xe7\x1e\xcd\xed\xd7\x96%\x43\x3\xa2\x41\x9a\x37\xa4!\xb8\xc2\x8bl#ub\xb8ksZ\xa7" +"\xa2\xa8\xe1^\xb5\x80\xb8\xc8\x39Q\xb5P\xb4\x19O\x95!\xc5\x66\x1ew\xfdg[\x9b\xfc" +"P\x19\x16\x94\xdb\xea\x42\xcc\x38\xf7\x87=)\xcc\xdd\xe3\xfa}\xb7\x61~F\x97\xe4\xbc" +"6\xde\xaf\x7\xd7,\xec\x1c\x82\x64\x9c\xea\x10\x7O\xd2\xfd\xf3R\xb1\x15(,\xe3Z\xcf" +"\xc2J?\xe6\x13!\x86\xac\x82\xce\x8b\xfe\xab\x9bP`\x88\xdb\x9c\xd8\xd7(\xb8\xce*z" +")<\xb0\x19\x2,\x3\xc9\xe6\xa6k\xee\x1f\xeem\xe\x80\x64\xec`\x18\x45\x66\x39\xd4\x1d" +"\x9c[7eA\xed\xa7\x7\xac\xc9 ?y\x9f\x42\x12\x33\nS\x93H\xaf\xa4\xd6)~\x1\xdb\xb4\xe2" +"\x7f,\x84\x2\\\x1dg\x8b\xe&\x7\xa2\xa7\xda)\x9cY\xa0\x94\x9f\x38O$z+[\x19\xf2i\x16" +"\x88\xb7g\xc0\xc1\xff\x8e\x7\xe2/\x95\xaf\x66\xbb\x3\x37{\x9d\xdb\x30\xf9~kA\xbd" +"\xad\x8\x90\xe1z?\xday\x9f@\xf5\x41\x61\xf1\xb7G\xb9\x45\x1a\x80u%\xff^K\xdf\x1d" +"\xf9\xa3H|\xca:KQ\xb2\x85\xb4\xcf\x14\x7f\xdd\x88t}\xbcQ\xa1\xd4\x1b\xb7\xa4\xd9" +"\xf1v\x1\x81\xc1\x91\x46jd\r\xc7\nt\xbd\x33\xe9\x10\xb9&\xe4\xc8@\xbd\xfc\xcd\xb" +"\xb2\xab\x1\xd9\xa4\x8c\xf7\x85\xc1\xdb:\xfcIVZ\xad\x18\x91_\x9d\xac\"\x8b\x9bsV" +"(\xce\x61OP\"\xb7\xbc\x1d\x8e\x9b\x90\xfd\x7f\xf4\xa5Vg\x3\xda\x9e\x44\x6\x91\x9d" +"\xcb\xbe\x31{N1\x5\x2\xd0\xde[\xec\x87\x95p\xaa\xf5\x94!-\xd4\x9{\xeb\xc1\x95Yh," +"\xa7\xd5\xba\x66'yU\xaf=\xd2^X.#r\x98{m\xbf\xc9\x16\x8d\xf8j\x12\x35\x2\xa2\xff\xa7" +"\xa8\x8e\xe9\x87\xfbL]\xd1\xc0\xf2\xb5\xd3\xb7\x35|m\xe3\x1f\xbd\xf0\xa1\xb5\x9e" +"aMfL\x1a)\xdd\xb7\xcf\xc5\x90\x18\xd5\\\x36\x64o\xe2\x1b\xc0-\x8e\xd5\x33\xdc\xe" +"\x8d\x85\xf9\xda]%\xf3\x4\xba\x1f\xad\"t\x1\x1d\xc9qs\x96h\xd5\x9a\x16\x1eh\x80\xb2" +"\xc7Ww\xb1\xee\n\x86\x34u@\xa9s\xc4\xbd\xa4\x30jlth\xbe\x82\x41\x5\x1b\x80\xd5\x1d" +"8\xb6\x6s\x19\x0\xeb\xac\x8b@b\xc5o>wK\xec\xe6}\xdf\xad)~\xc3\x14\xfe\x5\xf\xaf\x8" +"\xe5\x80\xba\x1a)\xbf\xd4\x7\xb5\xc8\xed^};\x87!\xc4\xd3\x8e\x86\xb\x45W\x10\xe4" +"q\xe3\xcd\x82\xbf\xbb\xd1\x7\x90=\x92\x65\xd5\xfd\x1d\x45>\xd8\xf7]M\xe0\x43\x32" +"\x12oq\x9|\xf8T\xc2\xd6\xfesb\x7!`-\x84\x95|K\xd6\xbe\xee}\xdb\x6\x97T\x81\x85\x12" +"\xf7\xad\x93 \x97\xaf\x96;>\xc0%\x36qA\xb7@\x13\xd5\xee\x33\x63=|6\xa0\xaamrh7\xf4" +">\xac\x3g\x15\xec\x18\xfdo\xac\xae\x33\x61\xf5L\xd0\x37\xbf\x82\xff\x9\xd5\xf4\xe0" +"\x3\x92\xccL\xcb\x90pz`Pw\xcc(\xae\xa0\x62[4\xe8\xea]*\xc\x1e\xe0\xf1_\xa1q\xcc\xcd" +"\xea:T\x85\x87\xc2\xa9|;\xefz=\xf2\xef\x90<\xa4u\xbd\xc0\xc9\x44\xb8M\xba\xc6\x9a" +"`\x88\xc7\xd1\xda\xc5\xf1\xf7\x15N\xef\xf\x1f\x85/{\xa8\xadU\xb8h\xe0\x80G\xea=\xdd" +"\xa0\xd0\xb0\xec\xba\x7\x38\xf\x93.a\x1f\xc7\x36\xd8\xa7\x35\xd5\xc0\xf3\xa0\x64" +"\xc8r\xe\xfi\x8e\x1a\xe6\x8c\x7f\x3\x62\x44\x3\xbco\x84/\xfd\x94@\xa4\xa0`\x17\x81" +"ZL1\xc8\xa0\xa1u\xd0\xef[\xbf\xef#y\xf6I\xc9-\x9c\xaf\x94\xa3\xa7j\xdf\x80\x94\x63" +".\x1d\x81\xee\x63\x14\xc1\x90t\xb2\xfeU=\x83\xcb\"\xb1\xe8^\xc2\xf0\x94\xab\x6\xd4" +"\x88\xc2{\x90'\xc8\xe7\xb4\x8\x63\xe3\xce\x9f\x66\x8a\xd3~\x8c\xa2\x4\x15}\x9c\xe6" +"\xf2\x92\x9\x0\x89\xee\xc1\xb6\x31tb[\xaa\xd7\xdas\xec\xebn\x80}be{\xb3t\xed\xc2" +"\xfe\x15Tl7\xfd\x35\x9bh\xde\x46%\xa9j\xc2\xb7\xb\x94:B\xa1\x9f\xba\xdd\xa9j \x82" +"\x9e\x80\xc3\xfd\x7s\xb0\xf5!?K\xf\xc1\xfdN\xa1\xd3\xa6#cC\xbay\x18\xe5\xd8\xf3\x15" +"\x8\x15\xe9\x9fr\x9f\xe0\xdd\x96\xbd\x10\xd2\xa1\xa0\xd7(\xd1QO!\x8apGT\x1fp\x90" +"y+\xde\xf3\xfd\x46\xf7\x39\xa7hv\x86\x1f\n\x99\xdd\xe9\x33w\xf9\x85+C\xc8\xafGDG" +"E\x92q\xec\xa4*\x12\xa3r\xe2\xc9)Kt\xb8\xa8\xb0Q\xe2\x83\xb?\x1\x9f\x9b\xf0\xe9\xb3" +"\x10\x93`MA\x1d\x91\xda\r\x9e\xf2\xa7\x86\xd3\x66\x64\x97\x9b{\x90\x83\x89\x9c\x8" +"\x1a\x33\x8d[\xff\x3\x61g\xa5L0\xc3\xb1\"K%o\xdciK-\xd9\x9f\x14t\x99`\xf0V\xff)D" +"\x2\x38m\x98\x16\xa7\x8c\xec\xe1\xf7(pO\xf5\xd2\x8g\xd4\xc6\x13\xddh\xeeW\xf2\xc9" +"\xe3\xdb\x81\x1e\xce\xef\x95\x8e\x6;jx\xa5v\x1e\xec\x62tf\xa4\xa5<\xect\xe9\rK\xe6" +"\x89\x9c\x61\x1a\x8a;\xbao\xcb\x3\x9d\x10\xca\xe4\x89\x8b\x93:\xa4\xc1\x41\n\xfe" +"M\xbe~D\xd5\n\xc\x84\x8d\x33v\xce!$\xaaH\x13J\xe6\xd2\xe5\x46\x8c\x31H\xcdZ\x9a\xeb" +"\xa7\x88Z\xaf\x32\xe6\\\xa7\xc1\x62\xc2[\xb8\xe6\xc3\x81\xa3\x97\x0,\x1e\x14m\xb4" +"\x18\xba\x3\xa8\x8d'VP\x1e\xfe(M\xf3\xeb\x31\xbc\xf8O\xccGG\xa8Gm\xe7\xb0\xa0\"\xc" +"\xc6>\x8e\xb\x93\x19\xa6\xb1\x8f\x87\x0\x37\xdc\x17\x45\xb0\xfb\x34G\x8c@x\xfd\xe5" +"@\xba\xa6r\xc4\x87\x33p\x5\xc3\xc\xb6\xcb\xa1\x13\xfa\x94\x9f!.q\xec\xc3\x9eqy\x8" +"\x1f\x64\n\x18\xf0\xd8\xd4\xbbt\x91\x90\x2S\xbb\x13X\xc\xad\xa0\xa6\x37\x95\xc4\xc6" +"\xae\x17\x1d\x80\xbe\x8\xef\x0Pv\xd9\xb1-\xed\xee\x18S$ry\x11\xeamu[\x1\x14\xb6G" +"\x4j+\x0m{\xce\xd2\xb1$0K\xec\x42\xcdoba\xe8\x5\x98\x8f\x19\xfb\xe1\xe8\xaa\xe1\x7f" +"\xc8\xfc\xcb\x64\xfc\xc7\xf5|\xe0\"\xcb\xdc\xe6\x8e'\x18?|\xae\x61\x61\xa5\x11\x1f" +"@[S\xb2\xad\x82\x37!\xed\xd0\xba\x94\xb5\xd3\x0)\xd5K\x8f\xc7\xb0\\\xf7\xfb\xefh" +"\xa5X\xa0!vAU\xbcN\xed\x3\xf1\x80\x9d\x9x\xeb\xd5\x8b\x7\x38\x1e\x95\xe9]\xe\x66" +"\xf1\x87\x3]C\xfcH\x1dG\xfe\x86\xd6\x85\xbf\x92\xa0k1\xdbn\xb8\xc0\x93\xdfx\x88@" +"\x17\xa0\xe3\xa6\xcbm\xde\xa0Q\xdeW\x8l^X{\xb2'7\xf3\r\xb3\xa6\x15\xb0\xa2i!\xa4" +"\x9er\xc3\xfb\x80q:\x2\x9e\x96n<\xa9\x31`\x93\x64\xb4\x91\xf0\xc2\xfa\xd5\xd6\xd3" +"\xd6\x93\xc\xednb\xdd\x11\xb7I\x89\x16%\r\xa9\x39\x46\xcf\xa8Y\x85\x8cp(\xc1\xd2" +"\xb5\xe9Z\xc9\x12\xee\xe3\x16Q%\xea\x3\x34\x42j\x8\xbe\xa0\xff\xdc\xf8\xa9\xa1\x89" +"\x84\xa8Y\xf0S\xe3|NO\n/\xc2\x39\x31\xd8\xad\xa6\xda\xc6\x4n\xe2\x98)\x8a\x0 \x88" +"\x17\\\x13\xb8\xc0{\xa1<\xe4gr\xeeJ\xb4\x89\x98\xb4\x37\x34`\xc2\xb6:\x8c!\x90?\x1" +"6\xe5\xb3=\xdb\x8d'uf\x97\x88\x14\xc1k\xbf>\x8exJ'1\xe0\xfc\x0i[\x98\xa8\x30\xd6" +"1\xe9\xa8\xd3z\xad\x38Z'B;q\x12\x7\xcaIp\x4 \\D\xda\xcf\n\x8tM\xbd\xcf<\xd6\x14\n" +"\"\xbd\xfe\xcf\x19\x8a\xa5\xc2\x8d\x9\xff\xec\xa4\x1e\x8e#\x15x\x9c\r\xe0\xfe\xe9" +"\xddS>\xa6\xb7\x2{\xe6\x11\x30\xa7\xf0\x94`\x94\xedq\xbb\xabz\xfa\xae|\xa2\xc6\xca" +"\xdfiX4\xd4\x9d\xcc\xd3\xafu\x1c\x94\xd8O\x1\xdfuN\xd5\x8\xbe[\xf7\xd2\x90\xe0\x41" +"\xf9\xc7z\x94X\x9c\x93\xc5\xc4w\xab\xa0m\x89\x98\xb6/`\x92\x8b\xbaUw\x91\xb1\xef" +"\xb\xcX\xb0\x8f\x65\xf9\xda&~\x83\x44G\xa7\xce\x45\xaf\xc9[\xc6\xbc\xe2N.\xa2Py\xde" +"\xf5\xcc\xf1\xc0\xf1\xce\x36,\xc9\xa7\x1\xf5\x88\\P!<\xdf\xf\xa6\xdf\xce\x80\xbd" +"^\x12[]\xa8\xeb\x8c\xfd\xd9\x1b\x15\x8eZ\x8a\x1e\xf0\x32\x8d\xb4,N\x19\xf7\xb4\x84" +"\x10\xe1\xbe\xd5\x92T\x9d\x99\x1f\xf\xa2\x7fS2qu\xed\x8e\x1,\x13\xd6\xd0\xd9\x8a" +"\xbf\x81\xa8\xc0\xcc\xa8\x84\xdc\x12\x63\xecwo\x15\x9a\x63\x43\x61\x9a\xfa}\x12;" +"P\xeP\xb1\x16g\xba\xcf^\x7\xd3q\x90M\xbc@I2\xdf~5]\x1az\xc2>#zj\x85\xcd\xfz`\x15" +"\xc8\xe3\xb3\xb5\x62\x7\x31\xe3l@uJ\x93\x9c\xa9\x12*\xfc\xc6\xf2\x16\xc9\x97/N\xe6" +"1{\xa9h\xcf\x1f%\x12\xa9 \xf5\x93\x1e<\xdb`\xd0\\\xc2u\x2>\"\xc3\x31/F\xa9\x62\xcc" +"\x6\xbb\xaf\x6\x85\xfeQ9\xff\x8d\x9b\x9\xf1\x89\xad\x19\xc0'\xba\x61\x63)\x0)\xe5" +"M\xb0\xb1\x32\xaf\x3$\xcd\xd4k>\xf4K,\xe9\x16\x91_d\xad\x96=\x1\xebI\xa9`\xbf\x65" +"\xf9,T\xcc.\x86\xbd\x13\x99\x8cgoV3\xd4\xe7\x94\x64\xfb\xcc\x89\x95\xe1N\xecmZ\x16" +"\x80\x92\xe2\x2\x13\x33\xdb\x8ey\x8a\x7\x42\x44\x61\xab\xad\xa6\xf5\xc8O2'\x95\x12\x9er7J\x9c\x9f\x9a\x97\xf9\x91" +"\n\x1f\xc5\xec\x6\xc\x88\x32\x92\x9c\xb8\x61\xa9mx\xb6TA~\xdcV\xd9\xb2\x88\xe\xa4" +"?z\x13\x9\x97\x81\x15\xd0\x83\xd3[\xc6Y\xb1\xb0\xd4\xae\x5\x19\x1d\xc1\xa3\xb3\xef" +"\x1e\xb3p\x9e\xd6\x46ql\x17\xf2\xf6X\xedJ\x14;\xc2\x38M\xbe\xf8J\x8f\xfc\xe1\xd3" +"-Zqy\xd0%\x98\x1d\x7f\x9f\x88WT\xb2\xc5s\x80\\\x62\x14\xfO,P[\xb0}\xe9\x80R\xb\x92" +"mnB\x7\x30\x3\x63+\xfb\x11\x16\x97/V\x1_y\x7f\x89pf\x95t;\x91\xf8\x33j\x85[\xd2\xf0" +"\xa2\xf8\x4\x15\x46-\r\x12\xe4\xc5\x7\x83$\xfeY\xd9W=\xd1\xa1\xf9\xb2\x46\xa5\x7" +"}\xf0\xc5\x2\x8fM\xaa '\xb5;i\xba[\xc8\x89[\xab\xa7\x19_.cD\xf6\x18\x1c\\S^\xc9\x9" +"\xf2\x19\xaaoq\x83IX\xb9\xfb\xe0\xccr\xb9\xaa\xbf>\xc7 \x1b\xdf\xben\x13\xe9\xaf" +"1O\x9f\x36\xfa.5\xd7>\xeb\xfc\x30tO\x10\xa4]HT\x90|c\x15\x61\x34\xaaI\xa5\xce\xa9" +"\xe4\x30\xea\xad\x63\x38\xec\xcc,\xd7\x86S.\x86qz\xa0\xb4\xb3\xaf\xad\x46jC\x12\xc6" +"<\xe6)`5\xef\x85\xcd\x9c\x3LBgXVp,\x9e\xae\xd6\xce\xe2M\xf\xc3z\xf3\x46ne\xf8\xb4" +"\xff\x37<\xb8\x9b\x45%\xcbMRE\x1e#\x17\xa0\x8f\x96q4\xfb\x66\xef\x81\xe8\xe8JD\x98" +"}.\xeai&W6\x8fH\x8d\"%\x7\x87@\xec\xd8\xb1\xb\x99\x7\xc4\xc8\xef\xedk\x9c\x10\x8f" +"\xc3Lv\xe1\xc0\xd2\xe0\xf1\x82z\xd6\x8d\x65\xe4\xc6l\xce\xc9\xb3\x1dHF\xbf\x37\xa4" +"\x9fy\xc3\xa8Q\xe3\xcc'\xb4\rg\x93`\xb5\x33Yt\xd3\x84\xcc\x98o\xcd\x62US\xae\xdb" +"\xbe\\\x13\xa3\xdd\xe7\xefUSl\x81\x46\xad \x90Kk\xb1\xc1`\x9\nU\x12?\x9b\xfd\xa5" +"\x9d\x92rw\x5\xceU\xc0m\xe3\x30\xa6\xf1y\x9e\xa2\xa4G(\xf9\xbe*o\xf7\x33\x45\x1c" +"0\x97qE\xcfZ5\xeb\x88\\\xe0~\xb1\x17@\x5\xed\x46}\x8f\x96Q.\x84\x36\xed\x9f\xb2V" +"\xd9\xb4\xbb\xdc\x62;\xdd\xa6\x34\x1c\x37\x41!C\xed\xe7$\xfbj\x1\xe1H\x8d\xbe\xe9" +"^\xf5$YM*\xc8\xc4\x9e\x1a\xa3\xc5\x82\x82[\xbe\xda\x65*[b\xeaz\xda?\x3/\x83\x46&" +".\x9a\xcd\x8c\xda~\x9e\xd4Qy\x5\xddN\x7fZ\x0\xa1\x42M\xc8;\xa1\xd8\xcb\xc4\x11h\x9b" +"\xb8$}\xd9\x33\x65\xcaM\xde\xf0>\xe5\xf1iZ\xf.cb\x89T\xbfvW\xf8\xcai\xf9X\x84\xaf" +"\xcc\xc0\xe3\x46\x91{@\xe5\x14\xa2\xe9\x32\xbd\x2\xd9\x66\xcd\x12\xde\x85}\xe9=U" +"\xc7\xe9\xa7\xc0:r^\xf0\x16\x87\xa1\xed\xb4\x6x\x5\x45\xc\xfbu*\xc4h\xf1\x38\xc1" +"5#\x8;\x9cZ\x3\xea\x90oj\xc4\x2S\x18\xb8\xb1\xd2\xcd\x33\x9b#\xcc\x41-\xf`\xa7\xfb" +"\xde\x8\xe\x66/MC\xa5\xfd-\xee\xf9&\xe7\x86\x9ax\xbc\x61\x32\x2\xdf\xb4\xbP<\xf0" +"\x85\xf9\xae\x85p\xc[\xcf\xea\xa1J\xb8\xa0\xd0\xbe\xb4(\xa8\x9d\x0\xc1\n]F\x93\xb5" +".P\xbeT\xfe\xcdG\x93[1y\xbc\x2\xf8\x35HmXb\x1d\xd9\x86jICD~\x1cq\xdd\xc4\x33\x46" +"\xb7\x45\xf8h\xde\xdaz\x86\xe5\xf5\x46]\x83\xeb\xd1\x65\x82W|.\xb0\xbe\x1a\x62 l" +")\xc8\x94@\n\xffU6\xd8\xbd\x2s\x80\x64\x1f\xd5$- \xd3\xbb/Y\xc9\xca,\xf2+\xb0h\x81" +"\xd7\xa2W\xb2\x1L\x12\xf5\x88?\xa3}ijX\xc3\xda\x34\xf1\xb2\x5\x96\x0\xc9\\,\x9f\x98" +"\x80\xb8\x6\x9e+\xe\x88\xf4s\x1b\xe4\x95\xb3\xa0\x86\x46\xfd>:m\xbf\xb4\xfdW\x9a" +"o\x93H\x8b\xac\x8blo\x7\\z\x0\xfb\x81\xe4\x30-\xb3\xed\xe6\xa9\x64\x30\xe0X6\xa6" +"\xd1\x9e\xec/(J\x95\x80\xc\xb1\xaf\xf0\xaevv\xf7\xacwT\xd8\xe4G\xb4\x1d\xe6j\x1a" +"\xfd{\x18\x8f@\xbuB\xdcM\xf8\x90\x93\x90\x14\x16\x16~\xa1\x35\xe9\x86\x82J{\xa6\xf8" +"\xf7w\xb3\x81u\xb0\x13\xe7\x82\xf7\xa4G\xba\xaf\xfr \x81\xb6\xfe\xe\xe9\xcc\xb6\xe0" +"\x4\x19\xc8\xc6\x31\xeb\x61\xae\xe5PHz\xe1Qv\x1e\x7yu\xa3\x18\x15'\x92%\xd5\\\xa4" +"\x1\xd7\xb8\x93\x12" +"\x3\x39\x6\x39/\r\xc\xd8\xe8s\xe3\xf3\x92\xf7UP\x12\x84^H\x3\x91#\xc0o\x1f\xea\x9b" +"\xb0\x32;`\x88+\r\xf4=7\xa3$\xe3\xc6t\xb7\xe4M:\xb1\xf6\xdd\x32\xcf\x9e\x8fqWf\xb6" +"\nHZ\x9c\x65\xa9\xc9\x9f\xddZ.\xb3l\x80]\xd5\xb6\xceH\xbc\x0w\x8a\xbe\xb\x46\x8f" +"q\x8d\xf9\xbb\xa2\xfc\xce\xa3\x13\xcf\xfcw>5(\x88\x1f\x34\x85?\x82x\xfeu=0\x8/\xfc" +"\xc0\xb9\xad\xf7\xb0\x63\xa8p`\xa5\xf8\x9b\xfb\x88|\xeb\xcf\x85\x83\xe7\xa2Pd\x18" +"\xcb\xd1\xdf\xd0\x83s\x9dL\xaa\xc0\xf1|A\xae\xa7\xa7/\x8e\x8\n&p\xc7\xe3\x1a\xe8" +"H\xcc\xd1\xa5+QE\x14\xdb\x81\xa5\x9d\xc6t\x1aHw\xf4\x95ujD\xb\x81t\x16>p7\xcdP@0" +"p=\xe5\x7\x34\x31's\xdd\xc4\x6u\x97\x15\x4N\xcc\xf6Gh\x9cj\xfa\x45\x45\xdc\x62:\xda" +"\xba\\\xf8U\x1dt\xb0\x1c\x61\x1e\x8c\x16m\xa2\x46Ns\xa4\xa5\x7]/\x8c\xd7\xfa\xb0" +"\x4\x41\xe5-<\xe3\x97`\x12Q\x89|C0\x7f(4\xb9qK\xb6V4\xcf\xa0\xeb\x36'B=\xfd\xf\x82" +"N\x89\xeb\xb9\x8fm\xd3\xbd\xafqq\xa4\xd5\xcf\xaa\xbf\xbe^\x8fY\xa2\x33\xd7\xee\x41" +"\x9e\xfc\xc5!\xac\x64\xd0}66H\xa3^P\xd8'\x19\xcc=\xb1\\\"\x35^N\xfd\xde\xf{\xbb?" +"\xae\x36\x83\x8HjZ=\xa6\x38\x11~\xb5X\xe3\xba\x17HaJ\xd4\x1c\x33\x93\xce\x89\xd5" +"\xf8/\r\x80\xaf\x4\xc7\xf9\x13W\x8f\xa4j\xcb\xd5>&\xc4\xf0\xf\xf6\x1c\xa2G\xe5\xef" +"\xd4ZU\xa2\xe2\x11\xdd\x10\x8c\xa4\x1c\xc8\x9a\x11\x8a\xd9~c\xca\xbf\xa1\x85\xd2" +"\xe5\x33w\xa8\xee\xd6\xf3\xb6\xf9\xd4.M=J\xa4m\xc7_\x8a\x30\x1b\xc7\x35\x9e\xee\xa1" +"wB\xce]\x3]\xbd\x46k\x9d\x1q\xdc?\x3w\x2'\xbb=F&>\x96\x88\xe3\xf9\xc5\xfe\x18-\x1c" +"\xc0*jj\xb4\x36\xc4\x37_\xfc\xda(\xea<\x9d\x93\xb8\x1c\x3\xc2\\ic\xce'\xa3|\xa2\x81" +"\xcaIj(\xa7\xd7(\xda\xa7h\xdf>\xc6\xb2\xe3\x8b\xf6\x11\xc1Q\xbaLVPx<]\xa9)\x12\xd2" +"!\x7\x18\xd5p\xbd\xcem6Pb\x97\x89\xc7\x83\xd8\xfa\xc3\x6\x9a\xb6\xaf\xf1J\xc7\x34" +"\x4q6S\x1e\x8b\xb2\xcf\x62\x30\x2\xa4]\x2\x9f\x1c~*F\xc2\xa1\x10\x17\x35\xf9?\x8" +"\x95\xe0\x7\x8e\x1e\xe3\xc4\xc1m\x91\xc3\xd7\xb0\x89\x41\rX\x4\xcb\x13\xd7\xf4L=" +"\xfd\xfSb\xeeXL\xf1\xfa\xcf\xft(G\x15\xfe\x1\x65\xe0\xcf\xfd\x94\xa2\xe1G\x86\xfe" +"\xd7\x34O\xce\xad\xac\x96'\xe\"\x92{\x86\xe9o\xe4\xe6\x93y.G\xb7\xcb\xc9\xa0\x9b" +"u\xb7\xd6w\x91\xaa\x12\xf0\x33\xa1\xd5\xd2\xe\xbf\x85\xac\x33\x66\x30\xc2\x91\x12" +"\x83v\xa1\x87\xccR\xe1\x86\xe9n\x0\x86\x1e/\x17 9Zqur\xe8\xf8\xfe\x93\x9b\x99o\xbd" +"~\x3\xb8\xfa\xc7\xfa\xf3\xa9P\xa5)\x99\xa5\xdd\x1e\x7f=\x7\xd8Z\x19\x8cW\xa2\x94" +"\xd6\x34\xa5\x8dN_#eY\xc7\x12]\n\xea\xbb\x91\xb0\r\x89\xa9\xc4tc\x92\xe8\x62\xe8" +"#\xc1\x7\xfey6\x4\xfe\xd7\xfd\xe\x44$\xd2W\x81=\xdb\x31\x66\xe7\xf7MCot\xe5\xac\x96" +"\x14\n\xa7\xd7`\xd5\xff\x43\x98\xf7\xca\x9\x12kw\x97\x99o\n\r4&\x7f\x8dLY\x93>\\" +"\xeb\xddSe\x87&G%\x18\x9b\"\xa8\xc8\xacu\x3O\xe3\xf5\x81\x9\x46\x65\x66=\xe8Im\xa0" +"\x9bXV\xb7S\x90\x8a\xab\x1a\x32\xa1q&\xfat\x15\x3\x37\xc6R|\xe8\x83\xaf\xe0\x9ai" +"\x9eK)\xfc\xd4\xfb\xb3\xc9?J\x8/\xf2\xd0\x19\x61\xa9\x1e\x64\xb6<\xbf\x15\x9a\x16" +"\xb9}\x9bs\xb7;\xb9Y!\xc2\xb7\xa5\x18\xe5\xfa\xeb\xca\xee/\xa2\x86<\\q\xa1\xd7\x14" +"\xdc\xc1\x30\xc\xa0\xa8\xd8\x17\xd4\x2\x46\xd6$L\x81\x85\xe9\x8e\x95w\xde\x92(\xef\x7Y\xd2" +"D\xa4\xf7\xcd\x17\x15\x16\x64\x37\x3\x8dx\x93\xfI-v\xbl\x14;\xa0\x33\xc\xffK8hzR" +":\xd0'U\x11i\xe7\xad\x97\xf6\x91\xafX\xf2\x9d\x9\x87\x88h\x1c\xc2\x82\xa7\xa7\xcf" +"\xf8\xc9\x1\x9f\x1\\\xa8\xac\x2\xc4\xcb\x87\xf2\xfa\xf0n?)\x9e\xbd\xff\xc1\x9f\xbd" +"/I\xa3\x80\x9c\xcf\x63<\x82\x1f\xdf\x0\x9d\x39\x84v\xc8\x97*\xff\xff\x14\x1b@\xc9" +":\x2\xb9\x8a\x88\xa9lJ4\xfa\x32\x44\x86\x43M\xd4R\xaa\xb4:\xc5\xbd\xb\x11\xce\\#" +"\x96\xebg q\xeb\x5\x88{\x9e\xb2\x95\x7m'P\x89\xb4\xdf\x99\xe0\xf8\x37P\xb3\x19\xfa" +"\xefV\xe5\xe4\xe4#\xe4\xdf\xd8\xf6p\xe6;\x82\xaam\xc4\x87\x7f\x95\xa5\x7\xb0\xe9" +"\xed\xa9S\xb6.}\xf7\x8f\xbcZ\x98@Z>\x8d\x1\x1e\xa3\xc5\x4\xb1\xf7W\x92n\x12\x1b\xef" +"W\xeb\xa5\xa9\xbcw\xabNM\x83\xf2@\xba\x1c\x12\xb5\xe0\x95=\xe9\xe0~ \xfa\xc7\x17" +"`\x8dG\xc4\xcf!\xd5\xa9\"=Vt?#7b\xacQ\xbd\x8v?8\r\xb3%W\x8c\xbe\x14\xfaY\xe2\xf\xce" +"\xe5\xd7P\xect\xa0\xe0{\xb3\r\xa4\x83\xb3\xb\xb9\xd9\xc8?\xfcV\xc8\x46\xe3\xd6\x88" +"\xf7\x65\x15K\"M\xfd\x99\x12r\x14\xdc\x32WG\x6\xd6K\xfe!h(\xdd\xb7\xcb\x8c\x5\xc5" +"\x1G\x94\x1c\xc9\x0_0?oM\x84\xe7W\xd2 \xf1\xfd\x1e\xa3\xb3\xc2\xce\x8f\x9fo\xbb," +"\xe1\x18\x9e\x1e\xd9v\xdc\xab\xeb\xc9y\x1a\xdd.\xb7\x66\x1f$8\x97\xd1@6V\xe8\xd0" +"\xc8T\xbf$\xc!\xc3W\xa9\xdf\xd3t\x9f?&\x1a\xaa\xe8}\x97\xb8\x92\xd8:\xcf\x9e\x8c" +"x\xe2\x9a\xb2\x3\x36WF\xec\xd2sv\x94]fYN\xc1\xc8\x43\xef\x86~\xec\xef\xd1^\xd6\xb8" +"\xcf\xe0;\r\xdc\xdc\x88\x62\xc9\xfa\x4\x87\"\x8fr>K=\x87\x81\xb3\xdf\xb2zd\xec\xc7" +"\xc0\x87pH\x85V.\xd0\x41\xcf\xc7\xd2{\x9d\x16j\x8\x8c\xae\xf9\xbbv\xe\xf0\xad\x83" +"\xa4iP\xca\x34\xb5\x64%\xc0\x11\x81\x41\x38\xf8\xd8QC\xf2Q\x16]\xec\x6\xdf\x98\x35" +"\x9e\xeb\xc8\x90\n\x30\xc2\xa5\x8\x13\x14s\x90\x85\x36^#\xdf\xc8\xab\x95\xc6\xc5" +"\x1cr\xd2lo\x83_\xcf\xb1\xfeq\xc6\x14\x31\n\xfb\xad\xd5\xc8\x8d\x17\x8f\x64*\x89" +"\x8d\x99\xfd\xd8z[=\xba\x7\xccj5\xee\xa7\x62\x11\x8a\x8e~\x3\xbd\x38\x16\xd7\x34" +"\xf3\x66\xaa\x98\x16\x8b\x15s%9\xa3\x8c\x63H\x9b\xb5\xfd%\x12\xa9*\x1\x9a\xabX\xfb" +"x\xa9\x1f\x9\xe7\xec\xc7\xff[\x92\x45\xdb,\x12\xb8\xbc%\xb4\x1f]n\xd3\xb7\xd6\xa8" +"\x87\x8\xbe<\x8b\xc6\xc0>mJx1[W\xd4\xd2|\x91\xc2\xb7\xad\x8H\xbd-&\xbd_x\xa2\xf1" +":3\xd6\xbz%\xb3^\xc5`.\x81\x14\xd7\xb6V\x9d{D\x15L\xe2\x99\xc\xe9\x9b\x99\xdf\x14" +"\x8eJ\n\xfd\x46\xba:g\xcf\x31I\xb0$\xd7W\xeb\xe4i^\xe5g*!Q\xbf&\x1e\xef\xf9\x16Q*\xb5/e`\x1dXr&" +"7\xd4\xffg\xa0\x42w\xee~\xf2\xd0\xc9\x9e\xce\xa4\x1e\x63Ui\x95\xa7\xb4\x90\x90\xac" +"$4\x8\x5w\xf3\xec\x42Uli\xcd]\xf5M^\x7fJ\xfd\xc3\x92\xc2\xb1\x13\xe5\xf0|\x8b\xb" +"!\x8c\x39*\xf8S\xfe\xb3\x96K\xb9\x8e\xa5\xf\x7\x33\xab\x32\x64\xb5\xa2{]\x3\xdf\xf7" +"|)&\x99\xa7\x17S\x8dgo\xb9/\xdc\xae\xe1\x66O\xcc\x37\x16\x7f$\xe1\x16i\xb0\xb4?\x4" +"\xee\x8f\x8f\x89:\xa7;^\xf8\x45\x9c\x8c\xdb\xff\xcd\xb5\xc7\xd5\x88OGr\xd8\xa4\xb4" +"k\x85\x32\x62\xfd\r<\xcb\xb3\xe4\xda@\xd0\x1d\x2\x8f\xcan;\x19\xda\\\x1e\x91\x8c" +"\x5\x38\x97\xab\xa5\xbby\xac\xa1\xc6\xf5g\xe8\x99]Fk\xf2\x1d\x61\x61\x81\xdb\xfa" +"\xfb\xfe\xb\x97\xa7\xc2\xb3\x66\xcaQC\x8b\xf0\xffw\xa5\xbc\x31(\x14=\xdf\xe7\xd2" +"\xecJ<\x1f\xb0\xdfOO[\xf1\xc8'D\xd3u\x84\xb\xc8*\x6\x64\xbe\x0\x80}\xf6[\xe5\x97" +"\x8e'\xe9!\x8f\xe4\xcaV\x9c\x13\xd8I0Rv\xcd\x9a\x1\xe9\x12\xf5K\x9\xddJ\xd5\xed\xb0" +"\xff\x9f\x84\xe4\xbd\x7f*\x85\xec\x8\x86\x9Qt\xbb\x12S\x9c\x35l\xea\xb0\xfe\xff}" +"\xc9\x63\xf4K\xcc\xe\x16\x12\xf7\xde\x9b\xd8\xc0\x97|\xb3]\x87\xb9\xa7_3\xfa\xf6" +"\xe\xf8*t\x93\xc0\x92GP\xef\x9a[k\x98\xf9\xbd\xce\x8c@\xd0\xe5\xa6\x10\x62\x9c\x39" +"7\xad\x0{\xb3\xb2v\x14K\xb3\xe7~d\x84SQ\x14q12\xc5V}\xd6.\xdc$\x10.Q\xe9\xa0&E\x83" +"l_\x94\xb0\xff\x9d\xd9\x66\xa3h\x19\x13\xa8\x12\x9fk\x15\x16HSK\xf5\x36\xee)\x93" +"]i\xf2\x8e\r-\xff\x17(b\xbb\x88\x89\xe2\x46p{#]>w\xa3\x8\xfc\x31\xa1_\x84\x9f\xc4" +"\xb0\x14V\xa8\xeb&a*\x99tO\x82\xc1\x44\x86$o\x8f\xe4\xe2\x10\xec\xbd\xc1.$\xc8U&" +"\xfc=!\xa3\xf3\x5^7\xc0\x97\x86Zt\xc7\x35\xe2\xef\xb2_,\x88\xe6Ti\xbf\x66\xa8L\x80" +"\x3\\\n\xcc?\x81\xd2\xcc}\xe1\x85\xe5T\x88\xc0\x14N\xd6\x8d\xf3\xee\xfa\x17\x1a\x34" +"\x81\x7f\xf8r\x93\xca-\xe4\xf8>\\\x80\x1a\xfb\xdc\x43\x9a\xce\x43\xc4`\xe9\xa0vj" +"\xc6_p\xbe\xf\x19(v\xd7\x88tU\x86\x35\xe1H$\xbc\xeb\x45=.\x87\x39\xd9\xbdW\xa4\xd6" +"\x85\rm\xd5\xcf\x38\xde\xce\xc1\x9\x81\x39\x82\xa1+\xe3\"\x7\xfe\x1\xb4&\x8b\x80" +"\xc5\xc4t\xb6\x4\xc0\x12\x1ep\xc6\x34\x43\xb5Q<\xe1\xa1\x1c\xd0\xcf\x9\x37I\xcd\xca" +"\x15\xfx\xcf\x1a\x85\xf7\x5\xd8\xe8\r\xaf=\xfa\xb\xc3*\xc3\x89\xd5\xf5\xc7\xd6:\xac" +"\x7\xc1$\x8\xc7\x9b=j\x5\x8\xf7\xc9\x36\x12\xb7\x99\xa4\xc7\x97\x9\x81_\xe9\xc1\x7" +"\xa4\xdbm\x8c\xd9\x11\xcbvt\xf3Nv\xc\n\x89\x17\x1\x19I\xaa\xf0\xc7@\xf1\x39)\xce" +"\x1b-6C\x83w{\xe3\xb7\xb8\x34}\xd9\x37\x45V\x82\x1b\x92\x37\x8=`t\x10P+\x1f\x12\x8d" +"\x87L\x1d\xfbo\xc1\xcf\xa6\xd5\xbc\x1\xccv~4\x11\xe1\xa8}\xa4\xe9!\xe0\x64\xeaX\xfc" +"\xad\x3^Tp\xf3\x92\xc3\xb6\xc7\xb7\x6\xf7ZW&\xe5\x16\xe2\xbc\x7k\xcf\xb3\x6w\x85" +"6\xe2|\x93\xa9\xdc\xd0o\xde\x1f\x88\x3\xc5\xf\xf7\xcft\xee\x89\xe9\xd3\x4\xe6\x9c" +"r\xc3\xe3\r\xdeq\x4\xb2#\xd8\x12\x4\xf3\xf6\xaf\x64\x66\xbd=\xec\xfb\x7\xfc\xa0\x65" +"\x6\xc9\xd1\xc8!\xc0\xd1\xb6\xba\x8e\x35\x0\x1a\x38:\x90\xeb\x46\xa5\xc3\x8e\x81" +"\xf3\xc5@1\xdeo\x5\x30O\xb5\xd1\x36\xb9\xf8\x64\xd9,\x14\x46#\xea\xc6\x7\x30\x14" +"\xd8\x6\xe1\xee\xb5H0\xa5\xe0\xce\xe3\xd3\x1c\xcd\xa9\x33\xe9\xb8\xa3t\x1a\x80<7" +"\xe\xf9\xe1\x38\x16<\x8a\x8e\xedX\x15\x97\x86\xe5\x1d\n\x9f^\xb2_U\xdcJA\xf3X\x18" +"\x9dR[/0L\x12\xe2\xb9\xa6U\x89\xa7\x9Jf\xf9\x62^#\x8p\xce\x65[K\xf5?c\xa4\x8c\x95" +"$a\x1\xf\x94\xe3\xe6\x96\x1\x83\x14\x98\x64\x15\x3\xa8\xbf'\x8a\xf\xa5\xec\x9\xba\x9dg\xfb\x63 \x8d\xae)\xbe\r\x3\\o+\x82\xd0go\x11\xd1" +"\xfc\x1bZ1\xf6\xe3\xbd<\xc3\xf4\xe0+|\xfb\x32\xafg21\x16*LU\xc7\xef~\x6\xb3\x80\x91" +"d3\xb\xc4\xa2\xba\xaa\xb3\xec\x8\x45\xe5O\xd9=\xc6\x0\xae\xae\xe5\x8f\xf3\xe\xbf" +"\xa0o\xf0\nz\xbbU\x94\x63\x91\xd3\xf4\x7\x96!\xe0\x14\xb6\xb\xe6\x9d;d\x12\xdc\x8b" +"\x8c\"\xd3\x64\x35\x33\x63ve\xf1\x17\x37\x81\x95k\x15k\xb6\xbc\x1e\x7[\xbf\x5g\x1f\xfd\xbe\xeb\x2\x0\xa3\x8b\xd2G`\xcf\x83q\x80" +"\xa8X\xe9-\xb8\xb5\x1f,\x84vRu\xb1`\x18\x8b\xf3\xdc\xb5\xe3\x84\xdf\x82\x8c\xcd\x9a" +"V\x1\xda\xec\xc6j\xc1\xb2\x92\x38\x15\x7f\xf0\xf3K\xed\xd7\x18\xec\x8a,%\xb6/B\xef" +"\x7f\x44\x44\xccv\x8d#\xb4\x10\x87\xc9\xc9\x1bYC%0\x1\x42&K\xd5\xc4\x38i\xb4\xe3" +"\x1e\xb7&\xc6\x15\xa5\x9foVM\x95\x19\x4\x66\x10*}fJ\x9d\x1cw\rl\xf\xa2\xdd\xc5\xb9" +"\xaa,\x87\xf1\xd0\xb0N\x8a\x39\x8c[\xda\xab\x96\x90\xed\xb2PidD\x87\xb7\x86\xa6\x16" +"\xa4T>M\x90\xfc\xcc:\x87\xc1(&\xf7:\xdc\x34.\xbe^\\H\x19_ok\xa5\x10h!\xc8\xc4\x8e" +"\xda\xd0\xa4\xcd\xf4\xb9\xcc\xbb\xdf\xb6\xcah\xc0VlF7\xc4\x39\x8f\xc7\xaaN\xb7,c" +"\xbf\xb4\x1bv\xe8.9\xa8\x13\xfcH\x91\xb4\x9e\x8b\xfaq\xc2V\xcfKO.\xa5O\x93\x32N^" +"WV\x9\xd4%h+\x14y\xf1\xdbM\x90\x9f[\x9c\r(\xc9\x62@0\xe3\xfdO\x11\x35g\xf9\x64\xdc" +"\xaa\xb8\xb\x89\x19\x8co\x7f\x61\x95\xe5><\xc9\xceH\x8b\x63\xd7\x92)\x9c\x17\xc9" +"\xea`D\xd7\xf7QQ9\x8b\x14\xa6R\xa1\x94\xc8\x81\x9f\xd1\xd4\xc3}\xf6\x44q\xdb\x13" +"\xf2L3\xe3\x8f\xd4\x1a\x96]\xea|V\xf5l|\x91T\xc2?\x90\x38\x16\xd2\x19\x12\x6\xa2" +"\x7f\x4\xc2\x18!\x9fQ\x85\xa3\x83\x32\x96\xc2T\xd4\xe3\xc3,\x1e\xec\x1e\xbd\x1c\x9f" +"\xb5\x81\xd1\xce\x1e\x8\xdd{pn\xb7\xb7\x1\xed\x9e\xb3\x1a\xeb\\\x45\x1d,BQ\xe3\xb4" +"I\xd3\xc1\"\xac\x16\xb8#L>\xeb\x1d\x13\xb6\xa7\xdbTVg\xb8\xba=\x16\x46\x14k}\xc4" +"T\x99*\xe2^\xc3\xc4\x99\xbf\r\xf1\xfe]\xae\x3\xe8\x1f\xf8\xebj\xe4\x31\xe\x1d.\xe" +"\xd3\x30\xab\x8cy\xe3 \xb1\x41\xea\xa1j\x16\xc4\xab\x94\xc1\x1b(yp$q\x99\x86\xa2" +"\x9d<+\x12\x95\xf2\x38\xc3\xb9y?\x96\xf5\xca* \xc9\x14\x8dy$Q_\x11\x96~\xe1\xa5\x98" +"e\x91\x43\xd4\"\xf9\x39\x65\xfcv\xac\xf1\xc4\x4\xbd\x87R\x2_\x13`/\xfa\xbd\xe7S\x1c" +"\xdd\xba\xd9\xa5\xaf^\x92\x1a\x11\xe9N\x94\xa4P\xe0!\x1b-,\xf:7\xc2\xdd\x43\x41P" +"TIEt\x4\x91!(n\x13\xfe\xaaV\x8.\xd4\x8d\xc2-E\x80y\x1a\xfe\x92i\x85\x2\xbdW\xa5\x98" +"9\xe0\xc3\x16Gk2\x83\x8c\xcd\x1b\xd6\x85\x62\xae\xe7\xa5G\xa5\xc2\x92\x88\xc6(^\xf4" +"\xa4\x96\xb7\xa8&~\xc8\xf6]Mz7\x1\xcd\xb7$\x98\xe9\xe0\x6\xbO\x17\xe3kq\xa4\xc8\xcf" +"\xba\xf4\x92\x14\x8a\x9f\x62\x8q\xb9:d\x0\x64#\xb9io\x17\x8e-,Q\xf8\xf0\xd3\xa7`" +"\xa9M\x18\x83\xa4\x38;)\xc0\x41\xfb\xc0\x90\xcdgS\x11u&Ij,\xc9\xfd/r\xb4\xfd\x2\xe8" +"?]\xa8,T\\Sn\xef\x8\xef\x88\xf3`\x7f]2\x85\x35\xbb\x11\x83)\x1f\"\x5\xde\xd2\x88" +"oS\x92\xe5J\xf3\xeb$\xb2\x36m\x96\xb\x1bTm\x7f\n{}iU\x84\xe\xaf\xc8\xc2H\x1d\xc6" +"\xf@E\xe6\xfav(\xeb\x8f;\x97\xd4)\xf5\xaf\xa5I,\xb0\x9c\xca\xef\xf0\x13\xe6\x8c\x98" +"\xa6T x\xfa\xdf\x43\x9f\xfe\xf7\xc3\xce%\xa1S\xf7;\x9a\xe3\xd1KV\x92\xf2.wd\x5\n" +"\xfZxR\xea\x0\x37P\x93\xd4\x97\xfe\xf4\x9d\x30\xe2mmG\xf7\x39\xae.u\xed\xc2\xc2w" +"a\x17\x32\xc8\x14\x44\xf9\x43N\xd8\x97\x43\xa3\xb4\x11kCm\xd8\xd2\x42\"\x45" +"/\xed.\x81\x8e>W\r\xa2\xc7{\xf0\xf5\xdf/\x18\xcdk{h\xb3O\xd5\xc1\xf7\xe4\xab\xc9j\xc6\x81\x1b}Y\xc\x3\xa1\xaf" +"\xbc\x32\x8e{m\xad\x7f=\xeeg\x1a\xb1\xcf!1SUz\"\xf5\xe4{{\x1\xb1\x90\x9f%\x19\x89" +"\x9fO\xbf(6\x14\x13\x1\xfd\xd8\x9c\x93\xec\x35\xaeQ{]\x16\xc8\x90\xfe\xbg\x3Y]z\x9d" +"\xc1\xa3\x62\xf0\xa9\x14\xe4\xbe+\x9i\xdb.t%\x17\xcrTd?\x98\xee\xc9Q\xd8\x1cvS\xcb" +"\x1f\x7fM\xea\xea\xb1}\x9d\x61Z\xea\xf0\xa8\xf\x83/)\xf6\xfc\xea\xf9W#\x6\x93\xf4" +"m\xd6\x36\x2\xab\xd0\xb0\xd2\xcf\xf4\xb1Ri7\xe3\xa3\xc8T\x92\xfa\x65\xee\x11\xa8" +"\xa1n\x94\x1c\xd7N\x9dP\xc9\xeaG\x8d\x17\xb7\x95\n\x30\xb3\x46\x7f/\x5\x6\x1d\xed" +"\xbbq\xc8S\xd9\xc3=\x8\nk\x1a\x85mB\x91\xb5\xd1<\xe0\x15\xd8L%]\x1f\x43)\xfe\x92" +"\xc8\x14R\xf4\\\x9d\xbf\x66^\xbcg\xd3\xc9\xd2\xbcnO\xe4'cUO7\x19\x98x~\x5Gz\xac\x65" +"*5'_\x9e\xaa#\xf0\xf9_\xb3q\xe7X\xacs\xd2\xd6\x7\xc1\xac\x8c\x46\xc6\xce`ZfW\xfe" +"\x91\x2\x44\xa8\xdc\x8a=\xfc\xba\xfc'[\xa9\x8\x84\x84T\xd5\xd2\x1a:d'\xd6\xa7\xe3" +"\x90\x16\xebY\xbc\xd7\x16\xca\xae\x8a\x64\x2\xbc\xd7\xb0K\xafV\xfe\xff\x7\x1b\xd8" +"\xce\xe8\x2\xad\x8a\xf\x6~\xd0\x1c\xa9\x45\x38:\xc8\x97\x80\x16\xf0.\x2w\x17\x87" +"\x12\xe9P\x13\xb0\xc0\xf4\x94\x98\x8bM)\x18\x87Z\xd6*V\x86\xb4K<\xdf\x32\x92Jm\xea" +"[E53\x18=\xd5\x98\xec\x37\xfa\x8b\x63\x38]\x88\x98gJ\xe5l,R\x8a>c\rF\xfc\x94R\x84" +"\xe3/7\xb1\x9b\x8d\x92\xac\xc7\xbb\x83_\x9d\xcbo)\xe6\xb7\x94\x3\xeUj\x80\x42\x15" +"\xfd_)d\x8\xf6\x80w#L\x13\x1e\x5\x98h\x98&\xabU&'\xaa\x7f\xdf\x15~T\xeb\x91 \xa9" +"\x13\xef\x18\\\xcc\xdf\x94\xd3\xd2\x88V\xa8\xfdl\xea\xc3Q\x95oV\x80\x9b\x3\x35\xb6" +"\xd8\x8b_w\x99\x6\xca\xe6\xbe{<\x89\x18KKj\xa6\xb6\x82\x98\xe0\x36\x4\xad+=\x19-" +"\x95\x1d\xd7w!m\x9c=Y]\xf8%\xf5\x1a\x0\x18#og\xbc\x10\x36\xbeW.\x8\x83\xd7/\xd4~" +"@:Y\xcd\x15\xf1sZ\x91\x41\xbf$\x94\xcd{.\xa8>X\xf7\x7(\x92\n\x9c\xc2o\xc3Z'\x16P" +"$\x89\x9a\x4\xce\xfd\xb0\xf0\x89p\xb8\x97\x87\xf9\xdc\xda\xcc\xa8\x4\xf6\xdf\xd7" +"\\\xcc\xe5\xc6\x34\x16\xaa\x37r\xf8.\xaa\x8c\xf8\x15\x33\xe\x46+\xe4\xa7?\xe4\x9" +"@\x8 A\xb6\xaa\xdc\xcdx\xb7\xa7z\xd7\xe3v\x9f\xf5\x0\x64\x14\x8\x9\xa8\x99O\x97\xe" +"\x83JvBN_L\xf4\x65\xb8\r\x15J\x80\r\x7f#\x8d\x3V\xd2<\xe1\xcc\x19\xddH[~\xccS\x8e" +"T\x15\xddW\x8f\x8d\xe8\x15\x42\x65:\x1e\xeaJ\xc0\x9^\x1f\xbd\x35r~F\xaeg\xf0\xa3" +"+Fm\xb8g {+\xa3\x93\x9cl~\x92\x87_\xf\x80\xcd\xed\xe6G\xbb\n\x9e\x14|\xe7\x1\x36" +"F\x8b\x2\xbc\xf3\xce}\x9c\x9-\xfaH;\x80\xabO\xc3z\x13(O\x3\xf6\xf0\x9\xd9\x8a\xbc" +"?x\xd3\x93\xb1\xf3\xa4W\xac\xd3\xacL\xed;\xbc\xe0\xe7\xfe\x85Y\xda\xcb\x9d\xdc\xb0" +"\x99\xc3\xe6\xbe\xd9\xa3R\xae\x92:\xba`C\x1an\x2\x9I\x9fH.!\xe5\xe5\xd5\xee\x94\xc0" +"\xa4j6\x87W\xdblS\x9a\x64\x93\xdd\x14r\xd1j\xa8\x9e\x36&\xc5\x42\xf4@\xe8Y\x9aJ\xfa" +"\xeb\x97{D\xea\xea@\xa4\x8d\xef\x1f\xd1\x1a\n\x87U\xcdR\xbd\x84" +"ts\xb6P\xc6t\xe7\xbc\xd4\x1\x35\xab\xbcS2\xab\xea\xa1\xd8\x61\xa0\x36\x7fsK\xb4}" +"|\r\xb0\x5T\xfe\x84\xe2O\xde*+\xc4\x98\xd2t\xad\xc1\xd9z\xfdx\x1c\x96\x2\x81x\x98" +"2\xdfZ\xe5\xe1\x81\xfd\xd8\x37\xe5\x13\xb7\xd3\x4\xb7\xf8\xf0\xe5\xc8\x97\xb2?\xc7" +"\xb2\xda\xff\x9e\xdd\xd5[~\xffk1\x1e:\x4\xc0\xac\x8a\xcd\xba\xddw\x14#xj\xf0\x83" +"\xe4\x45\xc2/\xca\xd3\x7f\xc4\x98\xad}t\xbd[~A\xb3\xb7<\xc1\xa7!\x9\x9\xe7\x66\x18" +"\x1b\xccU\x88\xfa\x1c<\xd6\xbf\xcd\xa4I\xc5G\xb8\xa5\xcfR\xd9\xd7P\x9b\x65\xb5\xaf" +"+\xdcsd\xc2\xfe\x10\xf1w\xe\xb1\xc\x14\x98\xd0\x82\x9\xbb,\xb6\xfbj\xfd\x8b\x62\x84" +")\xd3\xcd\x44\x86\x97\xedh\xb3:l>\xc0\x1a\xfb\xcc\xb5<\xe7\x35N\xad\xb6:&\xbbK\xa0" +"\x1b\xbb\xef\xbc\rQ3e\xf6\x34\xa8\x96.\xf0\xdb\x61\x8e\xee\xdfV\x14\xdf\xe5\x85\x19" +"\xdft\xcck\xbe\xf\xde\xadu\xde;\xccQ\x12?\x9\x39\x92\xc9\xc3\xda\xd9M\x94'\xfd\x13" +"\xdc\x16\x1e\xfbH\x14\x7f$\xbe\xb9\xcc*8{\xd2#\x9e\xdb\xf1\xaf\x9b\xb0n\xb7\x84\xe" +"\x14>\xb8\xf0\xaap\xb7$\xc2n\xe6\xb3\x62\xf9\xf9\xa1jF\x9b\xbfKu.\x10T\xb9\xa0Jg" +"\xc7\x8dy\xd3\xc{:\xdc\xab`\xad\n\x9a\x89\r\xb0=\x94\x6t\xebx\xbb\x45&\xb5zJj\xd6" +"\xbd'W\x96\xdc\x82\xa1\x97Ls\x1\xcd\x33\xf1\xe2+\x9\nr\xa8\x11\x46\xc8\x38\x46\xd3" +"\xd4\x13\x13\xe2\x6\xf9\x32\xb7@\x94\xc5z_\x86z\x18#O\xc2\xb\xf1-\xf6?\x1\xa5\xd5" +"\xde\x38\x18\xe4s\xe0|\xcdp\x1e\xbe\n\xfeX\x80@\xeb\x9d\x8b\xcc\xcf\x8\xac\x5nW\xbe" +"\xc6\x82\x96\xdc\x8e\xd0\x9b\x44\x16}\xa9\xef\xe2\x11\xff\xa4\x88\x45\xc0\xa7\xff" +"\xb7T\r\xd3\xdau\xea\x81\xf7W\xdb\x43\xe3\xc9\xb1\xa1G\x93\xde\xa9\xd5\xaa\x93\xef" +"*u)\x8c\xbd\xc8RM\x89\xc3\x9b\x10\xee$\xbe\x83\xc2\xci\xc5\xd2\xbb\xf5\xd6\xf6\xb2" +"\x9dKMF~\x1\xb4\xeb\xb3\xc6+&\x7o\xe4\xb0\xc4\xc6\x64\x96@\xba>A\x8f\x7f\"{\x88;" +"\xec!$\x99vhD^\xb4\x35w9\xb5\x91\xf1!D\xfc\x38\xdck\x8a\xb0\x7f\x7f\x85rh\x87&\xbf" +"u\xe\x91\xedU\x93\xd1W\x9d\x12\xb4h\xa7\xeeRc\xe2\xbe\xb4\x66\xf7\x64\xa1\xa6\xae" +"P_\xbb\x44_\x18\x7f\x39,\xf0U\x9c\x36\x9a\x6\xbe\xe2\xb0\x88o\x93\xfb\xcM\x9f\x84" +"\x8b\x7f\x11\xc1\xda\xc3h.\xa0\x37\xb9 \xca\xc2\x97{`\xe5\x96\xfb\xca\xdf[\x8c\xcd" +"\x90\xc0\x89\xd5\x86\xcd\xc8;\x0\xc4\n\xec\xf3/\xf1&\xbdO\xd8\x81\x42\xed\xf4-\xd2" +"N\xfa+\x95j+I%U!`\xd8\xb2\x35\x15\xde\xe4\xae\x44\x33\xe7(u\xd0\x38h\xbf\x87\x63" +"\xd7\xc4\xe8\x9f~\xc0sz\xca>\x85\xed\xb9\xcf\xe\"\x19i%uC\x2\xd5\xfc<\xd7Gw\x9f\xd1" +"\xc9\xc5LX\xcf\x7f\xca\xdd\xfd\x93\x89\xf8\xf9tu-of\xb5>j\xc3\x8c\xaaS\x89\x19\x1e" +"v\xa5\x5_ox\r*\xa7\xf5\xfdp\xb8\xfa\xf5\x64\xe6\xaf\x38& I\x4\xd9\xb7\x1b\xec\x11" +"W\xfb\xe\x1d\x18\xe3\xdah(\x12\xba\xb3\x37\xa8\xc1\x45\xd6\x94\xa2\xc9:\x9exn\xe8" +"\xfa\xf8\xc5}*\xc8\xf9\x9c\x7f\xe1\x8\x35\x46R\xa6\xd0\xa6\x9b\xc3\x44\xd6`\xce\xfd" +"pg\x17\xab\x8a\xa5\x1\x81\xe0\x8b\xc5\x85/s\x9\x9dO[\xcc\xc\x46\xa8\xe1\xdd\xd0\x13" +"\xec\x62\xa2\xa7\xb0\x83\x9dM\xe6\\U\x83\xe4\xe3\xee\xc1\xdd\x42n8\x8f\xad\x89!\x98" +"\x8f\x9cZ\xdb\xde^=0R\x80\x35\xc7G'g\x9a&\nl\x3\x90\xach\xa8\xf0\xa6\x8a\xbb\xa1" +"\x95\xb6?\xbem=\xdb\xf8\xfc'S\xa7\x13\x9\xbb\x7f\x18&L\xf3\xdcG\xe7\xfe\xaf \xd6" +"\x83\xa2k\xbd\x62\xed+\x9e\xd3\xa5\xb6\x8aJ\xa3@\r\xd1\x6i\xb2\x1a\x1b\xbfi\xb2\x89" +"\x90\x3\xb3\xbc{\xe1Tg\xdc\xe6\xe+\xa5\x7fQ\\Bt\x98\xe\xc7\xaa@\xf2\xd2U\x6\xa0\x2" +"\x1\x99\xf1N@\xc\xed\xb9X5\x18\xe0\xcf\xf7\xf2\xb3\xac\xbw\xcaP\xa7L \xd2\x8d\xff" +"\xd9\x86\x0\xc7\"\xefzf\\K^P\x8b\xa6ZH\x9b\xfe\xbf\xc1\x5\xc3\xc0qUT2\xcf\xbd\x66" +"Zh\xad^\xda\xb1>I\xb6\xeb.'\xb9\x89\x89\x64\xb0\\\xc2\x90\x64\x97\xaa\xd7\x89\xca" +"\x8e\xe0\xb8\xb4w6\xd2\x98>~2l\xeb\xef*n\xa3'\xd3\xab\xd5\xcd-~\x9a\x62\xa2\x1)\xae" +">K\xa0\xc7\xcf\n\x92\x42\xb0.\x95W\xb6~\xa9G\xedwQ-f\xd8\x8b\x82\xec\xe6'(r \xdb" +"2\x82\xe6\x11\x38m\x8e\x94\xfd_\xb2\x84\xf1\xcfQ\xd6\xfe{\xa5\x34$x\x8\xabu\xe\x41" +"\xb7y\x97\xbb\xf5L\x13\xb4y\xefR\xfe\xd7\x1e\xe1\xce\xe4\xa8\x89\x12y\xb4\x5\xe\x8f" +"\x81/K \x7 |g|\xbd\xcd\x1c\xc1\xd0\x37\xe8@8}\xee\xd9\x7f!\x4\x1f\xc7\x8aR\xcfp\"" +"o\x90\xec\xc2\x8fH\xee\xa5I\x97w\x86\xa0\x2\xe1L\xeb;r^\xa9\x38\xd6>u\xaa\xf7\x7" +"2P\xfct\xb3)\x10{\xfe\x34\xab\xcc\x96$\xae\xb7\x82M[\nk[^\x9a\x19\x37\x44\x63\xc7" +"}\x9c\xbb\xaf\xb9\xcK\xd8\x11\x1d\x66\x1e\xb3\xad\xac\xcc\xeb\xf9\x95\xa4\n\x96\xa6" +"\x1f\xe\xbd\xfe\xd4W\x87\xfe\x1ej\x4T\x95\xf0nB\x16\x7fW\x1e\xbb\xdcS\xa4'\xf1\xd6" +"\xc5\xa5\x97`\xfd\x14J\x14oxO\xbd\x87\xee\x93\"\xb8\x96\xa3\xec.}AW\x9c,\xeaP}UH" +";/\"\x8a/gs,\xf3<:\x1b\x31\xda\x9c\xcd\x8fz\xf8\x84\\\xf7\x8d\x9f\x94\xdd\xb8JAQ" +"\xee\xa1\xad\x17;q7\x15\x17;\xf1k\x8cl\xe7\x1e\xc6\xef\x33\xec\xb9TDT'-br\xbf\x41" +"\xda\xc1\xb3\xba[\xc1\x34\x82}\x4\xe1\xdb\n\xbcSj\xfc|\xfag\x1Y\x6\x38\xa8\x0g\xbb" +"U\xeag\x9b\x87\x19\xe3\x30\x84\x94Sm\x9dK\x9\x44~t\xfGF\xe7\xc6\xe6\xb2\x0\x9b:&" +"\xdd\x94\x94\xd1\xc9\xbK\xa2p\x8eV\xc\xd6/\x81u-\x2-\xf2\xbc\x8aT\xe4\x2I\xffr\xc6" +"\xcf\x88\x91\xd1\x4\xf8\x83wz\xd1\x64\x86\x45\xc4\xfb\xac\x33\x45\xb2\n\xb9\xc4L" +":\xfe\xde\xe6\xa7\xb6\xc5\x9a\x8d\xf8\xca\xa9\xa3\x9c\xbb\xe6\xca\xe0\x32\xe5\xaf" +"\x88\x9a\xd1`\xce\xbd|\x8c\xc0\x7\x1\xd9\xf3\x32\x45Q%E8v[\x2\xb0\xbc\xc0Q\x1d\xd9" +"g\x86\x17k \xc5\xea?Z_\xc8\xb1\xc5M\xd9\x38V\xc5\x91?\xfb\xd2\xa8\x9c\x9c\xc7XL\xbb" +"\x93\x19\xd4\x38+\x9b\xe2\xc5\xb0\xd2\x1\x2\x84'\xect\xe9\xe0\x1eK\x4\xa6\xbb\x8f" +"\xe4\x39!\x97&\xca\xe7*\x9d\x41\xa4\xb\x32\xd5\xad\xa6#\xe4zDXz\x6Re\xaa\x87\xd5" +"D\x83\xfb\xe\x96\xd4\xa5\xd2\xbd\x7|Lr\xffs\xe8\xd6`XHQ\x7JN*d\x1e\xe4O\xcdN\xfb" +"X\xebj\xd6\xe0\x7\xe\xc1\x63\xcd\xb2\xf0\xafZ\xf0\xbeK\xdai\xbcx|;?\x1a!\xf1l\x13" +"\xb3\x61\x62\x1fo\x10\xc1\x9e\x90\x9a\x43\xae\xb1\xbc\xdbg|\xefk\xc7\x45\x35\x97" +"\xa1\xf2\rsT\xc4\x31\x38\xec\x2\xca\xfb\xc3\xdd\xd8%\x85\xc1H.\xc7.^\x5%/\xa1\xa8" +"#\xaf\x81\x1e'X\x15:\x11'\xf6kL]7\xd5\x8cS\xf5\x15)\x14\xec\x95\x81\x31\x3\x45\xa9" +"cC\xe5\xc7k\xe3\xcbJ\x4\x13=\x10\x12\x82\xd4\x31\x9e\xf3\xb6\x8b\x2\x96}\xf9\xfd" +"q\x1f\x61\x97\xa6\xae'\x82\x39\xca*\xf8@L\xd0&\xca\x85\xcd\xce\xd7\xa0\xd5\xc1\x8f" +"\xf1i\xda\xcc\x89\xe1\xd1\xbc\x9\xf0\xbc\x30\xe4\xc;\xb9\xa2\x65\xf3\x36\xcd\x65" +"\xa8ol3\x5\xa1i\"\x81\xf8\x38p\xf9.\xed.\xef\x32\xcb\x15\xbf\xc2\xd2\xbd\x9d\x7\xa6" +"/\xaaoDg\\\xdd\xe0\x10]\xc9\x17\x43\xc6\xdf\x86h\xa0@\x1cTV\x7\x1b>1\xac\xb9`\xb2" +"\x97N\x98\xf8(\xabz\xf9|\x93\x86\x3\x8fv\x86\xea\xd0\xe\xf\x9dl\xc6<\\\xcc@@v=\xd6" +"\xaa\xd3\xcb}\\4\xc\x36\"^S$\xa2\xa7\xdf\x82\xc1p\x9d\x96\xcd\xc2$m\x4o\x83\x34{" +"C\xff\xcezI\x8d_\x4\xb4\xc\x62\x87\xc8Gv&\xfa\x35\xf5\x61\xcbPP^\xe6\x91\x44\xae" +"6p\x81\x9a\xb8\xc9N\x1a\xbf\x95\xd3;\x83i\xc7\xa6\xbfId\xa7\xfa\x1a\x9d\xb6\xf2$" +"\x9f\xbb\xa5\xf0\xf2!\xc0\xc1\xc8\x80\x98\xf\xa1\xb4\xb0\xe0t\xf2\xa8P\xe3\xc2\xdf" +"m\x18\x1d\x14W\xed\x36\xa9\xc1Xxc'\xb\xbb\x16\x15\xae\xef\x37\x95\xc6\x9d\xe5wD\xaa" +"ma\x91\xdf\xc5\x3&\xd7\xae\xe4\x10Q-\xd0<\xe|&h\x2\x4\x80\x35V\x96\xb2\xf5\xfb\xbb" +"xCj]lF*\xa1\x96\xa7\xdc\x33\"\xd5w\x84\x7\xda\x44\xf7\xc5\x94\xa3\xf5\x86S\xad\x83" +"a?\xbfq\x6\x1b\x33\xe8/\xaa-\x99+\xca\x1d?.&\xbb\xe4\xdb\x3\xea\x92Ut:\x82]\xea\x36" +"{z\xa6u\xf5\x36\xba\xc2\xcb\xe0\x31RcV\x0}\xc9\xb9\xedO\x96w\x9b;\xcaqs\xc0s\xff" +"]\x14\xa1\x35\xaaT\xfb\x35\xe5L\xfey\x7u\xf7N\x83\xa0\x84\x86\xe7y\xa1/\xc0\x34\xc" +"l[\xcd\x80\xfd\x14\xa5\xb5$\xad\xfbp\xb7;\x5i\xb5\xe8!OX\x87pm\xd9.\xd4\x0\x8em\x5" +"*\x81\x30\x19L\x1a\xe8\x1\xdd\x11-/C\xef\xc9\x11\xbd\x9cse\xf\x37\x5\x31u\xee\x62" +"*\x85\x9b\xbcL\xad\xf4\xee\xa3\x41j\xf0`o\xfe\xc9R\x1c\xa8\x8f\x82\x2g\xa6Q\x8f\x84" +"\x4\x36\"G\x13.a\x99Y[d\x90<\x5\xa9n\xa7=b)\x14n\xf8\xf2\x8f\x9a[\x1dxV\xf7\xaf+" +"\xdb\x13X2.\xf3\xaa\x8b\xcf\x39\xd9\x98\x38\xc8\x80\x0\xbe\x98\x30\x85!\x9\x84\xcd" +"r\xa0q\xbe\xd3\x7/\xb2\xd9\x3O\xf9\x41\x39\xd5\xee\x87\xb5\xe2N\xc\x7\x6\x94}\xb" +"$\xaeJx\x94\xf\x1cM\xfdt\xb1\x7w$V\nZ\xf1-h\xcfP\xec%\x82\xf1n\xbc\xcf\x10\xb6\r" +"\xf8\x98g\xbe\xad\xe6:\xf0^9\xd8\xe3rp\x12\xa9\x98>\xc6\"\x7R\xcb\xbf\xa6R!Z\xa6" +"\x83\x8e\x8e\"m\xbb" +"P\x88\xba\xe0\xaah\xab\xa1\xc9\x8a\x9eP\xa3)c\xd6J\xf5\xf6\xc5&/\xaf\xa9\xf6\xdf" +"FF\xb9Z\x1f\xce\xe4\xb9\x18\r>o^\x8d\xd9\x41\xeb\x8a\x39\xbev\x84\x13X\xf4 f9&7G" +"\xbc~2\x91z\x5\xa0\x15\x9f\r<\xaa\xc9n\xfe\xa0\x31\xfe\xd7\xd2\xa1\x7\xcb\xa1\x8e" +"\x10XZ\xff\xdc(\xaf\xbf \xe0\x61\x19\x93\xd5\x12\xdf$\xaa:\x3\xc\x15\xf3;:3D\xe9\x0\xdd\xd8\xbc\xd4\xaf\x91\xd2\x6\xee\xc3\xafI\xc0/\xd0\xdc\x43" +"j\xaf\xdb\xde\x33\xb9n\xf2Oz\xaa\xe7\xd9-\x1b\x8aG9k\xb0\xe1\x30\x45\xfdS`\xdb\xd9" +"\xbc\x95\"m*\x9&%\xbe\x1{\xb4\x8\xc8\x7f\xb1\x63\x32n4\x18\x14\xa2zy\x81h\xa7\xbe" +">\x4\x38u)\x17\x45\"+\x15\xad\x19\xfb-\xc1\xcb\xeev\x9e\xa8\xd2/\xe8\x6\xcc\x6\x17" +"O\xa4\x82\x35:\xe4S\xe7\x9a\x61\xd2\xde\x96\xa2\xe6\xf3i\x1es&\x1b\x46\xd3\x30\xd0" +"\xbaxH\x12\x9e\x8e\xa2\xf8\xc2\xc9\xe2\xd2\xfd\xa6\x3\xd8 D\x92\xb\xe6\xf5'i\xf8" +"\xc5\xf3@c\xccw\xdd\x8aS\x98\xe2\x80\x7z\xc3\x9a\xb6\x35\x18\x90\x41k8\xfe\xb9P{" +"\x8e&}5@\xf1\xce\xe9\xb4\x95\xfb\xfb\xd9G\xba\xaf\x8f\x93\x0\x5\xdd\xd2T?\x96T\x18" +"[\x9fN;\xf3\xc5}\x81xc\x8b\xc4=\xf7\x7W\xd7\x1b\xc3\xe\x82\x9e\xcel\xf\x95\x42r\xe8" +"\x2g\xfb\x9\xdc\x85+L\x19\xc0\x36\xe3\xb3\xe0\x99y(\x91\xa3\xd6\x85\xdfKGg(\xe2\xa4" +"\x9dW\xd3\xc7\x36)\xda\x99\x3\x1e\xe0\xd5\x13y\xea\x63\x92$0`\x12\x90\xc6\x94\xb8" +"d\x6\x31\xb9\xe8}`}\x7\xc7x\xbe%\x81\xf\xe1%\xb5Gk\x96\xb0\x1d\xdb\x30\xde\x8d\xb7" +"N\x90=\xd2\x34y\xa3X\x1b\xc1\xb9\x30\xdb\x9aj9\xdb\x65\xe5\xe8\x8f\x35te\xde\xc<" +"\x99^{O\x96\xbf\x99\xba\x99\xa2\xc?\x1f^\xd1\x87~\xf9uF\x97\x1e\xbe\x82|J#,\xc2\xb" +"&\"\xe8U6\x99\x3\x6\x1a\xc7\xfao\x7\xf6=\x81\xf2\xa9\x42\xb3\x1c\xfd\xcdQ\x13G\x1f" +"\x6\x9c\xea@\xbf%\xf7\x31\x9d-I\x80G\x6n\xf0\xaf\xb2 \xfe\x1b\x14\xf8\xf4\x87\x61" +"\xf2\x94\x35\xc7\x42[v\x84\xd4P\xd5\xa5\x8c_b\xcc)DW\xe8\x80T\x9b\x5~\xa2\x95\x42" +"\xefQM\xfa\xf3mmR\xc\x1&ia\xe\x99\x61\x85\xbc\x11\xf2\x37\x81`\xc9\xc3\xfd\xa5Or" +"p\xb7\xb\x7fiD\x82\xbc\nU\x11v\x8bJ.\xf7\xc9/\x84\x3\x98\xbk\xa3m\x13\xdd\xaa\xc0" +"!0\x92\xb9\xfb\xf1\xd9@>\xcc\x7,\x18\x12\xf2\x84\xdd\x1b$\x5\x96$kQK\xe*\xdb\x99" +"\xf2\xa0\xcd\xc3\x11\x11\x9f\xd6P\xaa\xfd\x81\x19I\xd8r2\xc0\xba\xce\x9b\xa5\x85" +"J4\xc4g\x9[{\xd8\x81\x1b\xf3\x61\x16\xe8G\xa1\xcf\x8b\xf9\xcf\xf9\x66\xd2\x7f\x7f" +"\x80\xb0\x9e\x9ej\x19\xfd\xf7\x19\xb2\xec?\xb7\x64\xef\x41\x42\xe5\xcb\xb9!oO:\xf" +"\xb\x9eI\xd3\xd7\xc\xd8\xf3\x8f\r?\x11\xab\x1f\xecL\xb2\x1?m\xd6\x9a\xb3\xee\xf8\xe7\xed" +"\xc3v\xce\xb1Wv[\xaf\x32N\xc!\xa1\xb\xaf\xcfQ\x12\x63\xb3\xa7j\xee\xbc\xd5Ij\x11" +"w\xa2&\x9a\xe2\xb\xf9\xe7\x32\x9f\xe6\xb5\x41\xf5\xe\xc4;\xec(oc\x9c\x97\x9c\x6%" +"\xe0\r\x32!\xc7\x85\x37g\xba\xf\xe2MA\xd9\x41\x66\xadgO\xdf\x61\xee\x8b\xf5#\xd5" +"\x91\x1b\xa9\x98\xefOH\x94\xf6\xbf\xed\x8\xa0\xaa\xd2\x8b\xce?\x83\x61\x1e\x6\xf" +"\x3\x1aRI\xe5RD\x9f)R\xe8~\xd8U\x1d\xa9\xbb\x94rl\x90:AI\xa9\x87\x1\xf9\x1a\xbc\x98" +"\xa3Pj\x10\xac*X/\n\xe9\xa8\x81\xff\xe\xc6n\x12\xe6Y\xf1\x9e\xbfpW?I\x2[4\xd0h\x9c" +"\xbc\xedhH.R8\xdb\x89)\xf2\xe3\x89\x12J\xb0\x38\xce\xd3\xab\xe2\x62~\xfe,\x9b\x8" +"N\n(\xf5\x16\xf4\xf\xa8}-$%\xbf\x18z\x92\x0\xc9\xda\x44\xf\x8fM\xf0\x36\x11^\x90" +"i\xf2\xde\xf3?\x94i\x90`\\CA\xff\xde\x61\x84\xf2\xa7G\xcb\xbeMZ\x8c\x16\x33w\x14" +"\xb4\xf3\xe1\xb1\x15\x8f\xd2X\x8b\xbe\x14\xb4\xe9\x31\x9c\xf8\xbc\xa7U\x8b\xc3\x95" +"\xc3\xbd\x9c\xe\xcd>\xc7S&\x18\x8e-=\x8c\x44h\x9^\xedTI\xc6\x31\x9f\xdd\n+\xe7\xa0" +"\xef]\xb3\x16\x84\x83o\xb6\xc6\xfa\x45\xf9\xc1\x85\xe3s\xb3&\xb2[\x14\xa6\x96\x31" +"I\x9f\xb0[\xb3p\x1\x66\x6\xb0\xb4pd.?W_L\xd1\xc5\xc6\x43\xcd\x44\xca\xc8\x86\x1f" +"`\x87\x45\xeb\xc1\x39\xc2\x95\xecM\x11TBot\xb2\xd0[\xe6u\xb1\xd2/hpf\x17\xf^\xff" +"2j\x16\x63\x61\x31=\xc4\x46\xfb\xe3\n\x1e\x10\xa0\xc2-J\xae\xb3\xb1\xff\x93\xb1\xb4" +"\xcd\n\x6 P\xd1\x94y\xb8+(x9\xb5\xba\xe1\x13\x66\x2\"\xb4\x37\xda/Iw\x95\xa3\x8d" +"\xb9!*S\xbf\x45i\xab.\xad\xf1\xd4\x92\x7f\xdb\x45U\xd1M\xf6~CT\xe3\xf1\xd7-n\x86" +" \x94\xcf Pq\xa4\x38,=\xceL\xa5\x15{\xa1\"\xc9\x8a\xd3\x33\xc\xf3\x97\x8eS\xa3x\xf4" +"\xdd\xaa\xb4\x9c=\n\xea\xc8GFxX\x89\x8a\xd5p&\"LE\n\xce\x9f\xd1\x10\x5\xef\xb2\xcf" +"J\xb0\xbc\xc4<\xa6\x87\xb8\x9f\x31\xbfi\x80\x63\xad\x87\xa5\xeb[\xa0\x43\x1c\x91" +"\x8a\x87\x18L\xd4\x82\xa3\xc5}/H\xc6W\xb8{F-\x0y&G\xc9\xdb\x8eH\x2\xc8\xe6\xa9/\xe4" +"\xe3\xcd\xbc\x99 J\xa6\xad\x13\x9b\x39os\xa4H\xffK\x8f\x7f*\xf0Le\x1e\xccn\x12\x13" +"\x9f\xe3\n\x90\x45g\xff@\x8b\x7f;\x15\x5&\xa0\x8a\xe5\xc6\x66\xf6\xe0\xc4\xe2\xab" +"\xc8\xb9\x93z\xac\xfb\xd4p\x5Q\xf4\x94\x89\x8=\x11\x14\x11\x86\x15pB\x87\x46\xa8" +"r4\x89\x33\x1a\xd6\x86$O3\x18\xe0\x15\xaahY\xc\x32\x98\x64\xcf\xd4\x9ct\xfcQE\xf6" +"\xaf\xe4\x8d\x10\xd1\x90\xd4\x1e\xee\xd2\x98\x18\x99\xdd=\x83\xee\x44\xe8S+,\xd4" +"\x12\xe9\x66\x8d\x8f\xbbo\xb7L\xeb\xcf\xfd\x3Za\x9c\x12\xb3Sn\xce_\xdf\x1du\xb\x1c" +"AP\xae\xce\x1b\x63\x98\xf6\xea\x9b$Q\xdb\x44\xbc\x63\xc5\xe5\xc\xe4K\xc0\xa9\x1c" +"?\xe6\xd0" +"\xba$\x18\xf5\xdb\x9a\xaeT\x19\xe0\xb4?\xc3\x9XI\r;Q\"IMxX\xe1\x33\xa6\xf5\"\x6\xf1" +"\xf1 \xe6\xaf\x97\xba\x99\x92P|\x3q\xd1\xd6r\xeb;\x4\xb9PhKN\x87N\xe1\x81+?\x15>" +"\x0\xa8\xbf\xfc\xd8\xb5\x93\x34\x9bO\xb4\xbb \x95TF\xb4\xb4\x11(\xa6}Q\x3,\x5\xe7" +"\xd4%\x14\xc9\xdf)t\xf9\xfe\x45LH\xdc\xab\x35\xb8\xb9\x9eHzw\xde\xaas\xc1\x34\n\xbf" +"\x1bye\x1fM\xa7\xbb\x92\xee\x84\x1fZ\x92\xea\xce\xb4\xb5\xba%\x84\x62\xb2\xfa\xea" +"\xe8\xed.'g\"\xd8\xa5\x8d\xdd\xab\x8d\xe9\x63\xdev\x18nv\\\x9d\x82\xa6 \x1eV\xc\x81" +"\x82L\x8b\xca\x1c\xc9\xd9\x6-\xb9X9<;\xdc{\x14\xa0\x65\x93Y$\xae\xe2\\\x85\x43\xed" +"\x82\x91\x85\xd0\x1f\xad\x61q\nE\x91vh\xb2\xfd\x8a\x7f\x8e\x3\x30\xe1\xee\xfa\x8d" +"N\xe7\xb2w3\x99\xc0\xf1\x65n\x87'\xf\xe7\xf7\x10\xf\x88\xc9Oj\x89\xb8\x94\x97\x8b" +"\xe0\xe1\x85\xeb\xe9\xc1\n\x99\xb9\x87\x34\x87\xf\xbak.8\x1b$\xbbq\xa3\xf8\xc1\xf1" +"5\xb2\xed\x7\x17\x9bv\xc3\xd9\xbc\xda\xc1\xb8XNB8\x9\xad|\x11\x19\x6\x8c\xbb}\xfc" +"\x8d\xf2m\xa8\xfd&\xd9\xbf=A\xb8\x14\xb8\xdd\xe8\r\x46.\xf1\xc5\xcf_\xaf\xb1\xf1" +"(\x8e\xe3\xb3Y\xed\x85y\xb2P\xdcz\xcf\xcd\x46\n\xa1Ww\xbf\xe7\x9c\xda\x66\x81\x0" +"n\x9f\x8fh\xa4>\x89\x13\x1f\x8e\xa0\x1e\x61\xe6}pN\xd3\xf1&=\x81\xac\x1d\x88\x46" +"\xb3\xeam\xe8q\xa0*\xa8\xb9@W:\x1\xd7\xbfN\xcc\x9eZ1+\xb5\x97v\x8\xb8\xb8\x87\xb5" +"\xfenb\x8c\x44\xc5\r\x0\xed\x88\x81\xca&W\xa8\xf\x1c\xfb(\x8eU@u\xf6I\x1b\xe9Y\xf1" +"A\x8fT\xf0\x43Y\xdf\xa0\xd7<\x19\xb6x\xda\x31z\xa3\x8)h\xbeR\xf2\x32)\xa3\xa1\xa1" +"\x14\x91\xa2\xc1g\x9b\xdd\xe7\xf8\xec,|.t\xaf\x2)\x8f\xd6\xfa\xab\x98Zn\xb0\xd2\x1e" +".\xc8\x87\xba\xc7\xa2\x83\x37\"\xf\xe2w\x3`/\x84LM\xc8\xe\x99\x93\x7\xea\xd9\x13" +"\xcf\xb5G\x9c\x16\xee>\xcaw\xea\x41\x91\xbd\x34\xce\xf7r\xc4v\xa7\x8e\xc1\xa8\x12" +"\x84\xe8z\x18\x95\xd2]\x1d\xd3'Qg\xce\xd1\xe3\x80\x93y\xfa\xd3\x18\x99S\x97\x96\xd2" +"3\xde\x46V\xe4\xcc\xc1^\x4\x44\xd2\xe8g\xa3\xf9\xef\x95\xaaR\xd5\xbe\x93\x9c \xf6" +"\xa8\xa8\x12\xc1\xcc\x2|\x87\xe8t~\xcc\x95\xbfs\xea\xbf\x9d@)I\xef\xcbP\xd3\x18\xe" +"ulmB\xc6\xef\x8d\x65\xe8_\x17\x99\xbc\xef\xfc\xb8\xb8\xcc\xf9PL.\xc3\xb3]\xd2\xde" +"\xd9\xfc\x15\x8dm\x97P\x7\xbfn\xfc;\xe0/\x92ow\xb9\x1a\x87\xb\xab\x62\xaf=\xa8\x98" +"1\xf0\x1\x1bO\x14\xb0\xa6\xe5\xf\xde\x64\x8:\xa7=\xba\xb3_\xdar\xeeT\xeeyS\xb7\xf6" +"\xff\x8b\x65,\xb8k3\xd0\x62\x12j)\xf1n1*\x4\xbb\xd5\x97:P\xe3lc @\x6\x95\x13n\x5" +"\xa3\x66k\x92\x1b\x42\xcd\xeb\xba\x1b\xa4>\n!:\x91\x15\x86\xd4\r\x19PI\xbc\xdap\x96" +"Yr<\xfe\xc3\xb1\xfeZ1LY'\xbf\\\xa1\xc2\x1b\xb3\xec\x84\xcdZ\xd7\x9fj\xc2\xe3#\x12" +"\x96\xf6{\x8d\x93\x93l\xdf\xb4\xf3_}d\x97wKPJ\x9a\xa1}\xa9:\n\x9e\xfdi\xbc\\\xd8" +"*\x3t\xd8\xd9\x1c\x1bi$1\xa2\xd2\xd2$@\xa4\xd7\xda\x34Z\xef\x91`\xf2\xdd\xe9\xe0" +"]\x99\xcah\xea\x46\xe5\x9fk\xa4\xbcL\xfa>\xf9-\x8d#\xf\x9-\xf6\xf4W\xc4-\x7\xa5\xf9" +"\xfe\"\x9b\xect\xfb*;\x5\xa9\x7f\xe2\xc4\x94\x34@#w41\x5!q\xf9\x87\xfaz\xbf|\xec" +"\x83k\xeb\xa6Y\xebGP/O\xc0\xee\x38\xd2\xa8\xbb\x8\x46\xe\x1c\xb4\x33\xf4\xd9>\xf7" +"\xae\x65vl\xdc\xc3\xe2\x34?\x18\x41\xa4\xd7\xdf\xbd[\x99\x97\x85\x15\xbd+:\xac\xc6" +"\xd4!$\xe4\x12\x64\x30}\x9b\x34\x14\x94\xbd\xec\xb\xe6\xde\x1f\xf8h\xb9\xbewb\xde" +"\x9c\xde\xd1^\x9f/\x8a:\rYoN\x1d\x93\xe0p\xe9\xab,<\xf6\x1\xb9\x45/\xd3\x64\x11\xcf" +"(c\xb1K\xee\xf6\x9an\x99\x10o\x15w\xa9>\x12\xc0\x61{\xcf\x81\xf5?\x8c\xf6\xf2g\xb3" +"W\x15\x1e\xce\x86\x4\x9f\x80p?\x86\xd9Z\xc0\xc8\xd2U\x88\xf1h\x92$\xde\x35\x1fH\x9" +"\xe8\x11\xe0\xca.R\xa0\xeb+<;\xe6\x87\x63_ \xd1\xbb\xba\xff\x41\xce\x8d\x6\x62#\xb0" +"U\x91\x8f\xe8v\xec\x97\xca\x6$\xca\xd9\x1d^\xb8\x8b\xacp\xd7\x5\xc4\xd3\xf5\x31\xd0" +"tgsm\xf6\x1e+~\xd6\xb\xc1[PQJ*\xaf\x36\x6g~\x9d;\xf5sC\x1d\x2\x9\xb9&8\x94\xd4y\xaf" +"\xc\x7\xa5\xe\\\xe5!M\xcf\xa8t\xdd\x88\x7(@rC\x1e\x32\xd3$y\x8c\x85\xe6\xc7\x46\x4" +"\xc4P\xb3\xddj\xe2\x8d\xeb\x33?o7\x9b: \xe1\xc'\xff\xc5N\x11\xaa%H\xc6!\x1c\xd7\x7f" +"\xfa\xf2u\xcf\xb1\xfb\x7f\xd7\xff\x5\x98\x14\xc1#\xca\x62G\xf7\x1a/\xbc\x94\xbc\xaf" +"\x8eQ\xb6\xbf\x90\xb4*n\xda\x9co\xe7\x1c\xf6\xd1\xe9\x42\xbf\x9fqD~\xf4\x8f\xfat" +"\xf2TN\xe4\x5\\\xac{\x82\xf4\xa1\xbc&\xc3Z\xf9\x3\xd2\xc3\xca\x99\\\xb7\x36\xcc\x32" +"Gj4\xdc*e\x97\xb\x2\xbe\x39xY\xd7\xe9\xe0'\x87\xdd\xe3\x14\x9a\x18\xf9\x9d\x9bg\xc6" +"`%~F\x8f\xcd\xe6(\xd0\x1c[\xe\x8f\xf5\xf6\xc8\xba\xb4\xe5\xa2\xe2\xe6\xb3\xa1\xe3" +"&\x9e\xd8\x4\x83\x34!\xb5\xd3\xe7\x97I?e\xe7nDuY\x9e\x32\x8d\x4\xdbTJ\xebY\xb3\x38" +"d\xc3N\x6\xdau\xaf\xf5rF\x1e\x99_g\xcdY\xc5\x96\xbd\xde\xf0\xd1\xb0\x41lf\xb2\"\xad" +"\xa4\x2\xbc\xbQYh;\xb8\x39\xa1^l}_X\x86\x30u\xac\x88\xd9\xd8\x91_\xbc\xa2\xed\xb4" +"\xb5\xfb\x10)\xc1o\xe8\xd4\x93\x43j\xb1\xa0/QL\"&\x3\xc8\xf0\xfeQ\xf9y\xdd\xf2\x14" +"\x0\xfaX\xefl\xe3-\"z\x95\x32\xa0RNI\xa4\xd6\xc6\x93\xeb\x34\xf5s/\x8a\x8f\x7f\xa2" +"\xd3\x1\xb1\xad\x95\xc6:\xecN\x9a;\xa9\x42\xc5\x81\xb6\xf7KO\x0p\xa9\xb4\xf2; 0X" +"t\xd4\xae\xc9g\x4\xbd\x46}wRhU\xfat\x97]\x1c\xd5\xe7\r\x1\x85\xa6\x11\x9f\x11\x18" +"\x95\x94\xe9\xf5\x96\xc6" +"\x6Sp\x1f\x5\xf0\x8d\x12\xda\xc4\xc7\xdaL\x85\x0\xc9\xa9\x5q\xad\x5\xfe\xe.\xa6\xe2" +"\xfdr\xec\xeb\xc0~W\xb5\xd6\x98\x35\x31\x61\xb2\xd1/\xcfG\xf3+U\xf3\xcc?\x1a\"ZV" +"\x8f\x8avlP\xb7\xf7\xc2\xca\x7}\x80\x42\xc1W2l\xbah\xf0i\x1a\xd0\xbc\xb6\xb0\x0\\" +"E\x9e\x9a\xc7j\x8e\xa1$\x11\x65\x8b\x88\xa4;\\\xf4\xaa<\xf4(\xa3<\xf9\x66\xf0R\xf1" +"O\xaa\xe7\x31\x82[k^\x82\x9a`q(\x98\xde\x92L\xa3\xd6R\x14\xb7\xc2\xeb\xd1\xef\x94" +"\x2,l\xe0\xb1\x81\xe6|\r\xdc\xaf\x6\x3ZML^\x1a\x92\xcax\x18\xa6\x7\xf5\x81U\x19\x65" +"\x80\xedx\x14^\xf8\xd6\xbcK\x4\x8b\x87\x43\x17\xba\xb8\xe9\x43\x89\xba\x38\xf6u\x94" +"\xc7\x17\xeeR/\xa7+\xae[;\xae\xf5\xe0\xce\x1d\xd7O\x1c`\x1^\xae\x64J\x99+\x8b\xe9" +"\xaf\x44\xd9\x89\xbc\xae\xcc\xb8\xa3\x43\xbe\xf0`\xb9i\xd4\x43\x8a\x98\xde\xe0\xa9" +"\xf6\x42\x66\x10k\xcbv<\xf2r1\n\xca\x9d\x9c}{\xa1\x41\"\xf\x16\xfa\xcf+5x\xcbg\x0" +"\xc6\xee\x32%\x35T4\xf3'\xbc\x31\x1dh/\x9a\x1e\x18]\xeez\xffi\xa0\xc1\xd0$i\xdal" +"\xeb\xd0\x17y\xb6\x30\xbbm5\x1f\xe0\xb6\x1d\xe5\x43\x84\xa3\xd7\x46\x12\xa0\xbf," +"=\xab\xb\xf0i\xa9\rs\x1e]\xcb\xb8\x66\xf3\x14\x8a\xe2*1\x83\xa9*\xb1\xad\"\x39u\xbd" +"[\x5\x61Q\rb\xf8\x81\xb6(\xef~\xda\x13\xbe\xea\x2\x64\xd3\x9e=\x3\x89%\x3\x89i&\xfc" +"\x81\xcd\x88\x87\x8a\x18\xad\xe0i\xce\xd5i:x\x83\x66z.\x1bH\x16\xac\x86\xcdj\xc6" +"O`\xff\xeb;\xeb\x93\xb7\xc9\x4 \xffK\x8a\xd0\xa1\x80\xf0XO\xbf\r\x45\x1c\xac\xc5" +"\x94\xed\xf\x95\xe0\xb1\xd0O1\x16\xc2\x98\x36\xf9>\xdb\x99\x42\xb6\xd1\xc2\x9b\xbc" +";\xa6\xa8\x9\x98V\x6\xaf\xcb\xdb\xacz\xc3\xfa=I\xb1h\xcf\xcd\n\xf0\xc\xff\xc9l\x99" +"\x95Vv1\x10\xcf\xcbM\xce\xb3\x9\x3\x46\xf\xb8\x33tk\xe3\xf9*~b\x5\xfc\xe0\xce\xd1" +"s\xc9\x30\x8f\x1d\xf5\xe5\xa0\xef\x5\xca\xfd}\xa9g\xde\x31\x95z\x1f\\N\xbfK\x84\xfc" +"\xf6\x1b\x1d\x81u\xba\xe4\x9d\x66OR\n~+qN:\xcb\xbe\x3\xa6\x2\xa0\"\xad\x96\xefp(" +"ky\xe5\xd3\x63\xee{\xc6\xe9\xdcRW\xcc\x7LL\xad\x8a\x1a!\xc'-&\xc2mL\x11\xfe-\xa7" +"M|p9Y\xd8\xbb\x82\xcbo>\xe0\xe3(@\xe9\x95\xcb\x1d\xc5\xa1Q\xef\x8f\x92\x81Zk\xaf" +"\xed\xc3\x99\xc8\xb3\x6\xfc\x16:C\x13\xc5\x8d\x9f)\xb5\xb5\x16\x4\xbe\xc0\x8b\x85" +"\xc5j'K\nE\xc\x89Ij~\x8d\x7\xd3\xeb\xaa\x99\x86\x66\x90\xc8\x8d(\x82\xee\xf4\xb6" +"\x98\xbb\x17\xdd\xce_\xc2\x82%\xb3i\n\xbf\xa1\x1a\xceh]}\x15=\x9`mk\xfb\n\x63\xc3" +"H\xb4\x45\xb1;\xfl\x8a\r\x96w \x94\xf2:\x1e\x80\x97l\xe3\xd3\xc3\xaf\xad\x8i\x0:" +"\xc6.\xfc\xe5;hVr\xe5\xb5\xdd\x3\x43\x9a\xf4\xc5\xb7\xdcY\xd7\xa5u\xff\xafTo\x13" +"\xf0\x14\xeai\x1\x35k\xa3\xac\xb5QL\\\x1c\x4\xd7hf\xf6\x30\x99,@o\xa0\x17\x8\xd1" +"\x1f)1\x99\x97u\xffgU\xa8xK\x81\x1a\xc6\xc5ol\x96\xb9P\xda\x83\xc8\xca\x33\x33\x62" +"\xae\xb0\xd0@\x16\x34]z\x17\x38\xfbi\x99\x96\x39\xf3\xf3\x93\xe4\x33\x12\x8\x65\xac" +"\xc3\x84\x46\x8b,\xae\xf1\xb2\x10\x9\x97O\xfc\x61\x46\x5\x31\x8d\xbb\x42|\\\x96\xe7" +"\xad\"\x34\xeaZ\x9b\xb4\x10R\x0\xbb\xaa\x36\x95\xae\xdc\xb\x64\xe6G9\xe7M\x1e\xe5" +"]\xf5\xbb\xd8\xd6\xb0\xfd\xe9\xee\xf2S\x9fu\x1d\xc7\xc3-\x14W1up/N\xaa~\x9\x0\x95" +"\xb3\x8e\x12\xaa\xde\xf8\xf3\xe3\xda%\xb\x8b\x2\x83^t\x85\x97\xcdR\x97\x9c\xd3mv" +"$\x18\x91+\xb9\xf8M\xdc\xb3\x8a\x7wY\x8c}\xd6$\x13\x94\x9f\xa3\x1f\x84\x65\x7\xcf" +"\xf5\xd5\xfd\xeb&\xac\xe3\x1d\xc7\x8\x62\x8d\xfc\"\xf7\xcc'\x99\x7\xe3\x9bh\xaa\x61" +"oJ\x90U*\xab\xdaU\xceU\x11\xa8@M\xa1\xcd\xe9\xc4\x8d\xfc<\xa9\xb9S\xca\x37\x66\x9b" +">\xb6tY\xc1\x99\xb0\xce\xf0\xd9y,Y}\xfdH\xce\xf6\x18\x9f\x11\x81\x19,\xc4\xdb\x32" +"o\xc1\x90\xc\x10QQo?\x3\x1c\x9b\xba[\xd6\x61\x83\x6\x84\xdeZ\xd2\xd0r\xa9@\xaa\xf9" +"&\xe4\x43I\xd2_F\xb1R.\xda}sP\x14Sm\x83\x99\xb6\xec\x98\xca\xaf\xb7\x99;\xa7y]4\xcf" +"\xc5(\xa6\xe3\xa1O\x8bZt@\xe\x17\\~\xc3\xec=\xe7\xc0\xba\x86\x65\x18\x64\x8a\xa5" +"\xea\xaa\xa7\x8e\x62\xba\x46v\x86\r\xf\xdf\xc7V\xb5x^\x1c\x8eN\xae\x0\x13\x3\xc0" +"\xa8\xac\x17$\x1b%\x9d\x19\x93\x46\xb2\xd3\x46\xe\x65h\xc6\xe7\x31\x9cG\xf2\x45\xd1" +"\x9dr\x15\x44\x8a}/\"\x2\xach`\\\xbd\x99\x98$\r\xf6\xcf\x18I\xe6\xb9\x96\xdb+\xba" +"\xef\x97Y\x93m4\xec\xcf\x14\xee/\xf0\x44;\x4\x65\xc3\x8b\x88\x34\x99\x42'\xfd{\xc1" +"\xfd;7\x80\xd6\x9bJ\xdf\x31k\x99/\xa7<\xfb\x8fX\xd5\xb3\x91\xa5\xd2\xdf\x7|R{a]w" +"\xb4\xe3\x14\x98\xca\xc8\xbb\x61\x91\x4@F\xfc\xce\"\xe4\x95y\x9c\xe1\xce\x32\xe5" +"\xc6\xc0\x43\xc4|\xeb\x61\xe\x9c\xfb\xe4\x8a\xd1\x84\x2-K\x8\x1/\xaf\xe9`\xd2\xf8" +"\x89\x1\x8a\xa4\xc9\x13SWe\x1Y\x16\xbf\xed/\xb8,<52\xbd\\\xac\xe1\xe\x8f\xae\x8a" +")gI\r\x8e\xdas\xfa\x30\xe2\xf1\x9d\xdc\x1g\xff\xe4\xe0\x12\xc7\xb1\x9f\x1b\x1b\xe5" +"T\xd3Q\x9\xae\xe9m=\xc3-\xe5\xf7z\xbe\x35\xb2\xd6uH;\xc6\x8a\xb1\x1e\xc6y\r\xa9\xa6" +"Ej%,Jh8\x0j<\x11j\x18M?\xbd\x5\xaf\xd1\x8d\xf5o1\xb4\x37\x9f=\x8b\x41v\x8a\xa8\x15" +"9l1\xaaG\xf8M\xae~J\xc9\xc4\x1\x15P\xa8n\n\xfa\x1\xaf\xb0!\x90\x41\x19\xb2\xbdL\xa9" +"\xdeY\xf0\x83>\x91\xd0\xf8\xcf\x89\xf4R\xcf\x17\xd3\x31$1wW\xca!\x8\x93\xd4\xea~" +"\x93\xa2Q\xd3\r\xafxw\xf9\xb2t\xc&\x9e\x84O\xff\x85\xf2\x13\x1a\x87\xc5\x9b\xa4~" +"\\x_\x1\x1e\x8d \x1ckS\xf3\x18\x9e\x89\xab!n7VP\x93\x46\x12\x8e\xba\xaf\x8\x93\x92" +"\xbc\xbe\xb9\x82\x9b\x34\x18\x8bY\xcc*\xb2\x1f Gx\"mplT\xab\x61G\x98\xbc\xfc\xd4" +"\xee\xbb\xf0r\xc0\xb\xa2\xfa}:!&&A)@86;\xc0\x1a\x8fh\x96\x95\x9e\xdb\x9a\xad\xd8" +"F\xe1:\xfb\xf5+\x8d\x31\xb1\xce\x37\xf5\nt\x1aX\xc2\xe3x\x1c\x6\xc0\x14\xf2\xd2\xd9" +"\xa3\x9eY\xbf*e\xa3T\xc0\xdc\x14$'\xef\x4\x35\xfe\xbb\xe\xb3\x80\xb1v`\xc\x94\xfe" +"\xcf@P\x14\x97%\xee\xe8;\r\xa1\xdf\xe8|\xcf_\xa0\xc9H\xb9\x2;\xea\xd0L\xf2\n\xf4" +"\x91\xce\x10\xc5\x65?W\x12\x66<\xecg\x17\x9a\x97(\xa5\xc7\xae\x19\xc3\xd1\x9\x9\xc2" +"\x1e\x85`\r\xcb{\xe3\x18\x38\xf1\xab\xf8\x83\"*\x85\x96\xb5\xb2\x95\x11\xcf\xdbH" +"\x4\xde\x8b\xc8\xdb\x1\x85\x93\x9f\xc0\xd4\xd4\x65[\xbb!\xca\xea\x44\xea\x88(\xfb" +"}\xca\x15 \x14r\x93\xdd\x61\x1f<\xe6\x9b\xca(\xf8K\x7\xe1\xbd\x82\xfc\n\x12\x36\xde" +"}`7\xea\xdc\xdf}\xb5Og\xb\x84\x5.\x9f\x94\x89\x83\x1f\x5o\x82\x39\x95(\x12\xefv\xf5" +"+(\xa2\x4\x10\x91H\xf6\xd2\xfe'\xe7R\x13\xe3\xb9l\xe2\x88\xc5\xb2Hma\xbe\xd3\\*\x95" +"\xb6M\xc \xbaYC.\x0\xa1\xf7\x45\x63\xfa\xf8\x31\xb1P\xe9n\xeb\xab\x82\xc0\xfbN\xf0" +"\x7\xeb\xb8h\xda\xf4\xeb\xb2\x81\x8e,\xc\x89\x82\xcf\x88\xa5\x17\xfeo\x9cT\x99\xd8" +"e'\x95\xe1\xe6\x84\xcd\x9c\x7fsv\xffG\x15*q" +"\x5\xf9\x42\xdc\x1c\xd1\xaa\xa3-\xf5s`/\xb6\xae\x19\xaf\xbd\xea\xfe" +"\xbe\xd8'\x8d\xa2\xc\x8b\xc5\xdf\rL\xb2\xb5JN\xc5\xec\xfe\xbd_\xfc\x8d\x9d\x95\xfb" +"\xb4j\x1bK\xb5s\x80\x1dxe\x4\x65\x39\x19\xc9'\xc3\x12\xb2\x66\xff\xe0\xacj3p\xec" +"\xf3\x90:\xd1\xd4\x10\xf6\xb4W\xc9\x65\x32\xcf\xac\xae\xbb\x94p\xf1\xb0\xafy:\xf5" +"\xa6\xbe\x91\x17}\xa6 \xa3\xb1\x45\x8e\xa9\rhB\xa2\x14}\xa3\xd5\x7f\xbb\x15?e8\x4" +"'\x84\xa0\x35\xcb\xc1z\xe\x7m\xaf\x98\xe3\xd4\xfc\x14\x43\xa8\xfb\x1TZ\xc0\xb5M\xa6" +" 2I\x9boq\xc6/\x10\xc9\xda\x9f\x38o\xcf\xce\xad\xe6i\xd0\xb8\xd1\xaf\x2\xe0\xddV" +"\xb7rM\xca{\xb1\xa0\\\x63\xd8{=\x3\x19\xc4\xcd\xa6x\xd6$\xe4\x4\xd1]\xc6\x9e`P\xcb" +"\x19\xda\x8f\xdf\xea\xbb=\x96\x42\xb2\x16\x87\x8aS\x93v\xc5\x46\xf6)`\x8a\x38\xb9" +"\x80\x66\xd4\x82\xf9\x15:\x1c\xf9\xf0\x9f\xd9!\xc4]\xbe\x46\x7w\x8\xce\xb1\xcb\xd2" +"\xc8]\x8\x34\x8fj:,\x87h\xcc:\xf9\xa0\xc1\xd6\xbdk&}\xbf\x19\xb0&u\xc\xfb\x8a\xd1" +"\x96\xab\xd3\x9f\xf2\x95\xban\x8G\xb0&\x92\x1c\x86\x9\x8b\x1d\xbaq\xe1\xcdl\xf2[" +"\xde\x9e\x44\xe5\x9e\xa0:\xb6\x93N\x9aNa\x10.\xff\xc0\x1cs\xc2\x8dpN2krT\xba\xf;" +"6\x1d\x8\x15\x12\xeb\xbf\x89m\x8d\x14\x9b\xc0\xab\x88\xd4\x0\xa9\xa7\xcd\x1e{y\x9e" +"\xc6;\x8f\xd9O\xf5P\x7f\x93\\\xef\xe1\xde\x64\xb5\x87\x1\xf3\xdc\x34S&\xb3\x66\xc1" +"'/\xbd\xea\xf2|F\xf8z\xbe\xa0n\x17R\xd0\x9d\xe\xba\x43\x43\xf1\x8c\xe2\xe4\x84*!" +":\xbf?\xd1\x44\xc3\x85_\x3\xfb\x90\"\x94_+\x9\x90*\xfe\x13Q\xd4\xbf_\x7f\x13\xe4" +"\x90\x6 \xfe\xd6,\xfe\x37\xa2\xdf\x1c^\xed\x6\x6\x7f\x1\xa2 r0\x80Yw1\x94\xce |\r" +"^PcJK\xf7\x1d\xe\xb3\xd9\x1c\xd2\xe9\xcb\x17\x61M\n\x1a\xe9\x19\xba\xbd[X5\xc0\xa8" +"\xe0\xa5\x1a\xbf}l\xed\xb8\xb5\xd3@P\xc0\xc9\x94\xd2\xfa\x8fN\xc8\xe\xba`\xb5<\xae" +"\xce\x14\xa5\xcb\"\xc8\x66[\xa4\x65l\x87\xba\xc1-\x1d\x9c\x92\xa2u\x8e=\x83j\xf4" +"\x15\xcd\x15\x16}\"n\xc0\xc1\xe3\x92i\xec\x7\x16\x8aHF\x9c\x15\xc9n\xe4\x80\xb\xc0" +"\xd4\xc6\x34\xd6\xb8\xf9\x7\x9\x44\xc\xe0\x35z\xde\xe5\x98\x8c\xefW\xc9\xb9\x8d\x45\x6\xc9\x83" +"5\xab=.\xe3\xb1\xd9\x16\xe9\xeb\xf6\xf6h\x0>1\x96\xa1\xb0\x1fh\xfb\xf-\xa6\x17\x64" +"\xcf^\x13\x1c\xe6\x93\x8f\x44W*\xdc\xe9iX[y\xb\xd3x\xff!\xe5sY\xadr\xa5\xb7\x83]" +"ZX)8_\xe5\xb1\xdf\xfe\x7fT\xaf\xa3\xf8h8\x14\x82<\xb3[L\xa3(b5\xc\xbcQ[br}\x0\x99" +"\xc1\x66\xd1\xf2;\xe1\xc2\xa8\x8f\x61}\xb4\x61\xc1\xa2\x46\x98$\xdf\xf9\x7f\x45v" +"\xd8\xd1\xdc\x16\xe3\x12\x9e\xc1\xbd\x13~:\x87'S\xcc\xdb<.\xfe'\xe9@\x92\xf~\xb2" +"N\xc8\x3\xc9\x9c\xc\xb1\xda\x7f\x18\x43\x18k\xde\x80\x32=\xe5\xe4VT\xc8',\x94\xf" +"D01w\x1c\xab\x84\x13\xd1&a\xbak\x9f\xcf\xc9\x96\xca\xa0\xbe\xd0\x17\xd9m\xaa\x87" +"\x80\x65\x81\"\x9a\x37\x46\x8a\xf3i\x0\x85\xd9\x86\x0\x88\xe2\xcf\xa1\xf7\x63M~\xd6" +"\xf1\x1a\xe6\x85\xf1\x93\x91qh\xc2\x63\xe4\x97\xaaX\xec\xf0\xd7\xa4V\xc2\x38>z\x18" +"\x15\xabOC\x97/\xf9WFf\xb3\x1\xfe\xec\x1c.]K,\xba\xfd\x43\xed\xbbu\xadv?\x3\xf9x" +"I\xe0\xbR\xfb\xd4\xf1\\\xa3\x38\x2O\xf8\x1e\x95\xcf\x9a\xe8/ce\x10\xaa\x13\xf7S\xd1" +"\xe\x1d]\x11\xbdZ1\xdf\x11\xd9\xb\xb9h\x13\xe9\x6;#\x8c\xd6Iy?\x15\xaamu\xb7Z\xd0" +"-\xc3\xb5\x6\xc4\xf3\x9a'\xcc\x83RZ\xdf\x39\x38Z\"N\x1esc3u\x9cJ9i\xd0\xfc\x9e\x41" +"=\xff\xed>\xe1\xe7!m\x98\xdf\x1cng\xc0\x42 \x99@\xf8\xb7\x86\xfe\x9\xa9\"v\xd9\xce" +"\x14\xd2\xc6\\>9\xa7\xfd\xb7\x18\x31\x9b\x11\x1f\x5\x13\xa8`\xee\x8e\x34\x3\xf7Q" +"\x16\x35\x93\xc0_?\x8b\r\xc4\xee\x7f\xa4\xfek'\xf1\x85\xed\x65VD\xff\xa2\xaa\x91" +"\xb4\x36\xa7\x46|2\xd1\x63+\xb+\n\xb1Z\x87/h\x19\xa3\xf8\x9dy-\xa8\xaaT,\xf7Y\x90" +"a\xc8\xb3\xd6\x9am\xda \xe1\x4\xb0\x80\xc\x18\xb1\xd2r$\x9eX\x84\x15\x41o\x3\xd7" +"\x8bR[%b\x91\xc9\xb\xee(\xe0m\x6;e\xb2j\x95\xc3\x3\xf8\x64\xe7)\x9c\x1fQ\xba\x84" +"\xebJ\xaf\xd1(\xe4\x87zTJ\x14j\xde\xa4\xa2\x30\x43G\xce\x9c\x90\xefl\x92{ee\x7f\xac" +"\xca\xdfx\xb1H\xd3'\r\xd6\x64\x8f\xe0\x10\"\xa6\x8a\xb1q\x81Z\x8d\xf0\xcf\xd5\x43" +"A;vq\x7Ox\xe5\x9a\x64\xd7\x99Qr\x9\xb3L\x9c\x14\x1d\xd8Q1\xf1\x64\xa9O\x84kMF\x13" +"\xc6\x1f\r\xe3\x1f(\xbd\xdbv\x84\xf9*Kt&-w)\xd1\x66\xc9\x99\xf2\xa0\xc7lM\xfc\x43" +"4c+i)\xd0o\x8Y[\xfb\x45\xfe`u\x1f\x8f\xc5\xde\xe3\xf3\x31xSaG;.\x0P\x97\xe6\x1dy" +"&\x3\xd9^|\xb7\xd5\x66\xed\x89$\x9e\xfd\xcb\xcb\xb7!\x1c\x9a\x36\xb9\x87\x99\xc9" +"*\x11\x9d\xe1\x96\x8bg\xb9\xbe\xb8m\x82\x1bN\x16*\xd6\xb7\x81\xd2\xc1\xe]J>\xe0\xcb" +"\xfcZ\xc3~\xa6\x14\xc9\xb7\x9c\xe\x9f\xe9\x82\x46\xeeO\x87\x99\xd3]SY\x12\xbf\x92" +"V\xb\xfb\xc4x3\xd6\x8_@|\x13\xa3\x8\xc0\xc5\xbcVt\xaby\x19\xc2z\xbd\xf4\\\x9b\x46" +"K\x9d\xa1\xd9\x91\x93\x1c\xd9\x95\xea\x94\x8f\xb4\x95\xb\x66\xbe\\G\xe1\x9bS_~\xc4" +"\x19\xf1J%P\x12\x18\x94\xb9\xd2\x80\xc4\xf1\xff\xb2\xfb\x1a\xcal\xc3\x91\x39\xb2" +"\x3\xe\x8fH\xc2.(\xf5>\x4\xab\xb3\x1c\n:rt\x8dy\x8cZ\x8e\xc6\xac\xf1\x6\x11z\xb\xee" +"\x9aL\xe1\x85\xcd\x30\xb\x44\xe1\x9b\xc2\\\x37\x96\xeb\xcc\x83VNf\xe5W\xa3\xbf\xac" +"M\xd9\xaa\xd7%\xdf\xeb\x63%W\x8b;\x1a\x85|p\x98o\xd4\xe2p,\xc3\x43Ni\x81\xd3\xcc" +"\x15\xcf\x18\x89\x11N\xfb\xce+\xba\x6!\xc7\xactx\x99\x1e\x86\x88\x1e\xe\x83O\xe0" +"\xa9QU\x1c{Y\xden\xcf\x14\x1nIhD\x18I<>\x2z\n\x2\xc9\x34p\x9c\x64\xb6&B5\xf1\xf6" +"\xb3\x8d\xc3\xf2/[\xa2\xb9\xca\x7f\x93\xd0\xf5\xa4\xd3!\xf5\x9f{\x19\xcf-\r&\xa7" +"\xde\xdao\xe0\x33\xe9\x5\xfay\x99\xb5\xd7V\xa6\xe\x62sp\x85%\x36\xe\xc9\x12\xb9\xdf" +"\x1d\xcc\xfa,E\xb2\x10\x9cG\xa1\xbb\xa8/\n%\xf4*\xb9\xeb\x8a\x6\xf5\x85\xe3\xfd\x12" +"o\x8e\xe2\xa5_6\x1b\xff^m\xa4\xdd\x83`0\xf6\xf\xe2\x43\xce\x63x\xa2\xc\xe9\xda\xe2" +"\xde-cf\xec}\xbd\x41'\x2\xee\xe1\x1d\x94\x5<\x8a\x19vE\xf\xda\xe1\x31\xaf\xb8\x18" +"\xcfn\xb6q\x9f\xc2\xd7\xc8\xd2U\x88\xf1h\x92!\xb3\xaa\xc1\xce=}\x9e\xc4\xb7\x65\xbd" +"\x8c\xbdM\xe8\x66\xec}\x92]<\\\xe1:\xff\x9e\x14Rk\x19\xe4\xec\x15T\"\x82\x13\xfb" +"\xe0\xac\x14\xd1\xc5\xca\x1f\xee\xcf\xea\xc2\x32W\xbe\xab\x9b\"+\xf9k\xa3\x98g+\xd9" +"\x9c\x91@_\x87\xe8\xd6\x9t\xbe\xf5\xc8t3Q\xdc\x66\x98\xbb\xec\xd9\xceQ\xb2\xc7\x9a" +")\xf5y\xc8\x0Y\x84\xe5\x98\xc9\xc3Nt\xdd\xf7\xa6\xa7(\xf\x66\x88\xda\x93\xe5v\xa1" +"Wy\xd5\xe0 y\x5\x34\xd6\xb0 x\x91\x8c\x66Vs\xc1\xce\x11O\xd0O\x0\x11\xcb\x92Xk\x18N\x12\x93\xf5" +"\xe2\xb6\xe\xd7\x97r\x17\xf3l!5W^X-\xb2~l\x1aU\x8a \xa1pb\xaa%*`;>\x95\xeb\x85\x9a" +"\xd7Pg\xdc\xd9q)b|\xdc\xbb\x1b>*\xbf\x1e\x45\xf1\x97\xd3\xed\xab\x16\xedz\x1\xea" +"L\xb7'\xf3\xa7\xdd\x94\x30i\xb9\xd6\xf6\x42\r\x7f\xda\xf\xc\x7Mp\x83S2\x1f\x15\x46" +"\xdf^\xf9\xc8\x43\x85\xecpN\xb7\xe4}\x99\xae\xcev\x8bJ\x82\x46\xa5\xa1\x8d\xe6P4" +"\xd0\xcc\xb7\x61\xdd\xac_F}6\xa0\x1\x43\xd8\xb6\x33\xb5\xd9\xa8\x5\xbb\x87z\xc\xdc" +"|\xad\x1e\x1d\x37\xaf\x98t\x8a\x6\x62\xb4\x9a\xbe\xe?|\x9fJ9\x95\xce\x61\x37+c\x9c" +"\x8\x84\x91\x44\xee\xec\x64\x39\xd7\xad\x8\xe0\xec\xaa#\xf8\xf3\x8b`\x9e\xb\x30h" +"z\"\x9d\xaa\xc0\xa9\x95\x10\x42\x14\xb8n\x9f?G\xc6]V\xbc\x6(`9\xe7PB\xd5\x10\x7\xf" +"\xa5\xe1\x39\x93\xd5\x14\x1e\x65v\xa6\xd1\xev8\xee\x1p\xf1\x85\xd8\x12V\x99@(Us\x5" +"\xaa\xf3@\x1b\xaa\xba\xa9=\x8fh?7\xe8&C\x13t\xcb\x90l|G\xbc@\xceQ\x18\xe2m\x94\x8b" +"\x9\xba\x8\xe0G\xbf\x1K\xbe\xafL\xbaQx\x1f\x64!j\xc0\x98]#I\x85\x82\xdf\xd2\x0\x38" +"N\xc6#\xfnda\x14w\xcd\xcc\xab\x97Q\xfb+\xa9\xe\xaa\x9\x30\x7x\xea\x35J\xf4\xc3J\xc3" +"g\x3h)\x9a\x17\x32\xd9\xb5W\xf4\x88\x18\xddv\xa3\xf2\xe\xf4\xce\x62>\xd6\xb1\x1e" +"\xcd&\xa0\x61\x3\xb4\xaa\xe5\xf3\xd6t\xad\xac\x9fn\xb1\xffV?\xf4z\xebU\xe0t\xe0." +"y\xd6\xf0\n>4\xb0\xac\x1a\xb5\x92\xc6; ZWC\x8f\x46\x92\x9a\x17\x9\xc8\xad\xa3=\x97" +"\x1a\xd0\x9b\xb3@\xda\xda\xb0wrO \xb3\xa9\x42\xa4\\\x17\x94\x1e\xbd\xdb\xa2\xaf\x88" +"\x98L\x14/%\x11hi\xfc\xba~@RY\xe6\x81\xaf`\xd6\x7\xe\xd5KwR1\x9b\x9c\x8d\xaa\x85" +"\xe8\xa9\xb1\x66\x4\xe5o&vj\xbc+\xaf\xe7{\xe2mN:]\x9b\x15\x8c(\xd9\x1aPo\xd7\xa7" +"\x95\x86\x9b\xb9\x9\x1e\xf2p\x9f\xc6Y\xe1q\xb0\xbc\xe\x1c\x62\xf8\x13\xea\"\xaa\x11" +"\xa4\x89\xb8z\xb5\xad\x63\xdc\x39\xf4\xe5\xc4\x94\xf7\x80\xeeK\x8b\x11\x6\xd9\xe4" +".\x1b\xd3\x98\x84\xb6'\x8c\xac:\x93\x19\xc5\x61/=\xbf\x84t=\x86q\xa2\n\x0\xc2\x3\xe3T\xfc" +"+\x14\x37\x5\xec\x32&\x8b\x13L\xd3\xed\x66\x83\xb9Z/w\xec>\x4\x9d'\xe7\x7f\xb5\x96" +"\xa8\rn\xaa\xd8\x61k\xc5\x97\x14\x1a\xda\xccv\x96\xf9\xca}C\x93_!\xce\xf0\x91~\x1c" +"\xc0\x15\x0\xd4$\xc3\x38\x19vBP+\xd8\x61\xfe\xa7v6\x90\x98r\xfb$\xd3\xae\x32O\xaa" +"\x94\xf2\xc4\x1c\xf5|\xb3V\xa8l\xec\xd2tr\xceSN\r\xb9QQu\x9a\xbdu\x85\x17\xdbG{\x11" +"\x97\x46\xfb\x14`\x94\x98.\xe7Q\xda\x35\xc8\x88(\xf1\x8d\xde=\xdbL\x8ar\x16\xc3\x7f" +"\xa2}<\xae\xfv\xe2\x19?\xc8yq\xe6-\xe8}\xa1O\x96\x80\xb0z\xb8!Y\xc3\xf2\xbd\xfa\x43" +"\xd3\xb3\xbc\xd9\x36\x32\x8f\xed\xb5\xc7\xc8\x93\x97,M\xa1\xb0\x98\x1a\xfe`\xc3*" +"c\xcc\x8,C\xaa']\xbe\xb3\xbb\x87j\xe\x90\x1\x0\x7f\xfa\x85\x14\x30\xcb\xb7\xe/(\xa1" +"\xe2\x96\x41\xc5:\x94\xc4Qt\x4\xcb\xa8\x8b\xf5zL\x96\xd2\x12\xb7\n\xd8\xa9\x7\xdf" +"\xe8\xa4G\x84>\xf&\xeb\xed\x8do\xc8\n\x5\xe2\xca\xd6\xd4\x45\xc5\xf\x35o\xf1\xd4" +"1\xab\x8c%H\x8f\xb7\x7%o\xb5\xcfp\x83\x80\xdfv\x85\xe6?qJT<\xd8\xff\x8d\xa4\x1\x87" +"\x85\xccM\xb0\x14\xc7\x14kJ\x81\xcf\xdd?U\xae\x45\x36xi\xc2\xfa\xef\xf9\xb4\xfe\xeb" +"Y\xca\xfd\xb4]k\xc4\x44\x17\xe8\xcb\x8e\xd7,MF\x8fh\xcb\xfd\x7f\xb3\xf7{\x81+\x5" +">\xe8\xc5\x8b\xf1w]a\x11X\xd7\xcb\x16\xdb\x43\x30~v\xc1>\xd3vU\xf4X\x9a\x30\xcd\x36" +"E3^\xa6\xee\xe\x87\x2`J\xe0]\xac\xe3\xc8%\x39\xf\x7\xd7o\xadx(\xe5\xe2\x3\xf3\xa3" +"\xa8O#\xa2G\x82\x12\xa4\x32\xae\x10\xe4\x9d\x19'\x7\xb1\xbaj/-\x2_\x99\xdb)\x19\x92" +"7\xb9\x8d\xa4\x2\xc4\x2\x92\xc9^!LGuX\xecH7\xe\xabN\x18J\x12: )\xa6\xc4\xdb\xf7\xf7" +"\x10\x98\x8\x1f\x33w\x16\xa9\xda{k\x91\x35\xe\x36\xd5\x10 \xdb\xbc\xc7\x62\xf2\xbc" +"\x93\xf\x95+\xd5g\xd5i)\xa5Q\xb8\x80y\x15\xeaz\xf1^\x92\xaa@BX\x12\xc5\xc5u\xd0\x9c" +"\xe2\xd3\xa9pk\xa7\xf3\x42\xad\xa8P\x1b\x88\xfe\x9cpM\x8f\\Z\x9\x6\xa7p\xf8%\xe0" +"i\xbdu\x3={\xbe\xcd\xbe\xd4\x8-\x1d\x82\x9e+N\xa7KUY\xf4\xf1Uf\xac)N\x18#-\xce\x1b" +"S4\xde>zQ\x90\xbe\xa3\x93L\xa5T\xa3\x9d,]P\xcaV\xb9j\x92\xb1\x4\xd2\xb6S\xb9:\xf7" +"hfh\xa2\xd6\x11\x9f'\x18V\xbb\x2\xf9H\x1d\xaf\xc1P*\x19\xe0\xbd\x11:\xff\x3\xab\xa0" +"O\xbe]\xb5\xf2\xbd\x66rjT\xbf\x5\xad\x37\xcfs\xb3\xa7\xc8\\]\x14\x83\x34\x8a\xaa" +"\xafRg96\x9\xef\x1d\xc1\x0\x9c\x1e\x9d(D\xaa\xf2|\xd5rl\x96\x8c\x33w)\xbb\x91\xa8" +"e\xa7\x34\xb1\x12\x30U\x12\xe2\xa4`b\xb\x8e\xd0\x37\xa7\xbf\xb7\xcd$\x0\x64\\\xd0" +"\xad\xf8\x9a\x99\x42\x7f\xba\x1b\xaa\xa1\x9a\x8d\xc2\xe5\xa2\xa5\x7\xaf\xae\xa4\x96" +"\x80\x11~HV\xdbx6\xd1\xd5\x82\xe8\x80\x63w\xb0\x17\xd1\xbb#Luw\x8\xcO\x83 \x9f\x1f" +"\xcd\xe1\xbd\xb9\x0\xbxhFN\xf0K\x9c\x18\x14\x1c\x7f\x64\x97\xc5_V\x12L\xb6\x9e\xd9" +"\xef\xf9\x32IY\xb4\x66\x61\xfa\x89\x18\x84\xa2?^\x19\x6\xa2\x93\xb\x43NE\xd2Y_\xaa" +"\x9e\xc7\x7f\xc8\xc4\x98\xc1\xcd\xdc\x41\xae\xfd\x44\x9a\x94x\xc7\xc1\xa1\xd1[R7" +"\x1c\xc5\x33\x1\x61j\x89wAT17\x9d\xad`\xce\xf7H\xe7\xc0\xf0Y[\x7 9B\x86\x11\x9c\xe3" +"\xac\xc1\xc0\xa3\xfb\x8b;\xb4%\xb2}&(\xe6}\xee\x3^\xf7R+J\xd6\x81\xe4\xb4\x36\xbd" +"$B\xe2\x43\x7f{O\xe8\xc5(\xad\xec\x8\xde\x14$\xd2\x42\x9\x10,~\xa7\n\x9bZdt\x81\xd3" +"\x84\x2th\x9a\x9cnE\xb1\x36y\xa3:\x3&\xd7\xaf\xab\x31\xd8\x1\xe9\x16\x8dI\xb6\xc" +"\xa4\xa2q\x16\x8h\x93\xd9\x83\xb7\x81\x0\x16\x13\x84W\xa7,&\xa7|\x4\x9a\x82\xa9\xb5" +",\xab=[\xcaOZhKow\x86\x84\x35\xf8\xad\x9\xdd$\xf6\xf9\x10%QI\x8a\x8dMD8\xeaP\xfc" +"8Y\xc0\xcc\xd7\x4\x43\xe2-\xbe\xec\xc]\xdc\xbf\x32\x12\x30\x12\xc2\x12<`\x1dW\xf7" +"R|\xfb\x15\xf9\x6\xb1X`\x82\x8d`\xcc\x8c\xc\x17\x92\x12\xe6\xe7\x86i\xce\x32\xa8\xc\xf0\xb4" +"\xeb\x92\x43?:\xc8#Q:\xda\xafhH\xee\xac\xd2\xb6\xea\x9b\xf9\x13r\x1d\x19\x9f/\xb6" +"\xfd\x85\xc2\r\xd3\xa2\xf5\xedx6==\x0\x4\x5{\xf9\xdc<\xfd+\xf8\x82\xe5\x9c\xdfn\xd7" +"\xf4\x82\xf6sp\xbf\x2\x33\x2N\x18\x16\xaa\x39\xd6\x3]\x86\x18\xe3\x43\x9a\x17xJ\xb2" +"\xf2\xb4\xbc\x86\x84\xc2-W\xeb\xc7\xfbO<\x9f\xfc\x80#\xac\xf6O.\xce\x90\xe8V1!\xef" +"F\x92\xc9.7\x4IB\xe4\x8dwj\x1fV\x9d\xbf\x5\xa4>]F\x8cJ\xda|\xa6\xec\xec\xbe\xehQ" +"\xd9\x7\xd1PUS\xf1\x1a\xb7\x8d\x17\x8b?\xe8\xaa}|\\\xfd\xf2\x87r\x0\x9o\xf0!@\xae" +"\xa9?\xcf\x1ah\xb2\xe0\xa0/b\xcc\xb1S\x8c]\x6\x66\x13\x88\x9\x1\xc6`\x86`\xad\xb1" +"X]u\xba\xce\x2wY\xdcri/\x8\xf0n\x9\x9a\xb8;\xad\xb2\xddUG\xf6\xe5nr\x86P:\x18\x5" +"\xb8\xd4T\x86\xfc\xf8\x2\x87\xa9\x84\xaf\xe3\xcc\xd5~\xe1\xa5\x1e\xc8--F0\x13\xe8" +"\x99U\xbe:G\xcdn\x8\x8aH\x92.\x12\x1a\x92\x94\xb4o\xd8\xdf\xd5\xc6\x66\x8c`\xe4~" +"\xd8\x84\x0\x14|\xd1\xb\xc6Sl\x8e\x7fIp\xb1\x62\xed\x19!@}3\\D\x1c$]\xcf\xc3\xaf" +"\xb7j\x9a\x63J\x87\x42\x97\"`\xd9\xa9\xef*\x95\xb7\xd9\xc4+\x16\x35V\x8`\xca\xff" +"\xe7\x65\xcc\xc3\x9ezC*\xbd\xb2\x19\x1\"\xa0\x31\xf0,-~\xcc\xfb\x31\xccM\x94\xea" +"\x9c\xffm\xab\xb3\x63\xbc\x8d\xcf\xc8jV\xc5l\x0\x90{\xb5\xc3\x8d\xf\xf5!\x95\x46" +"\x93\x90\x19\xd7\xe7>E \xfb\xa7\xf6\xed\xed\xe2\x1e\x8b\xf9h\x3\x9b+\x11\x9d\xa8" +"\x9f\xcc\x1e\xc6\xebV\x9c=\xf4@f\x16\x94\xc4\x81\xf0\x8f:\xb5\x83o\xc4\xa8\x8cG4" +"\xad_S\xc8Zl\x9cP\xe4\xac<\x99\x7\xbb{h0J2Vw\xc4\xc9l\\\x7YRd\xee\xb6\x63]\x7f\x14" +"<\x82\xf4\xe2^\xdaUm\xc2\x16\x8c\x19\x5\x6\xc6)PiH-U`\xa8^\xfe\x9f\xf1t<5zJ *41\xe8" +"Ma\xad=\xfa\xa9uwtLS\xb8\xda`\x7f\xb2\xdf\x10\xde\xe\x41\x85M\xcc\xc4\xfM5\xf1xm" +"\xee\xe5\x18l\x94\xbc\x37\x1\x9e\" L\x6\x95\xcf\x9a\xd5M6~_&\xd9\xff\xf8J\xbe\x45" +"\x85\xde\xa9\x41\xeT\xab\x64\x9`.\xfb\xa2\xb9hz\xe9\x9b\x82\xba\xed4\xedK\xa3\xf4\xb5J\x8b\xc1\x84\x1f~\xa0\xc2\xf5\xd3Q#d\xd2L\x9\xc8" +"\xb5\xb1\xd0*\x8d\xbf\xea\xb7{apvGP\x98\xfd\x89\x9d\xf4\x34!\xee\x9eqv\xe6wVuZ\xa9" +"s\"\x1d(\xc8\xacR+;\xd5\xdf\x1d~\xbfoENJ\xe9\x12\x13\xe8\x99\x64`\x4\xcf\xe\x14\x93" +"\x88t.\xa9\xf2\x8eL}R\xfc\xa4\xc1\xf5%\xf0\x4\xbP!u\xda\xfe|\xbf\xb\xd3\xf3\x36\x8b" +"\xf8\x39\xc4\xf6O\xd5hW\xfe\x5\xc}\r\x88=A\xdd\xbd\xa6\x8c\x91\x0\xfa_\xf0\x93\xae" +"\xec\xa4\xf7\x1c\x93I}\xc2\xe2\xfb-sN\xa2R|\x9f\x5\xd8I42\xaa\x9a\xe0\x45i\xd3\xfe" +"\xc8\x46\x35t\x19\xff\x1d\x1f\x1e\x34\x33\xcb\x32v\xfc\xb7\xcf`\xde\xc6\xbe\x62\xbd" +"\xcb\xa8N\xf1\xe7\x1c\xa7\x42M\x97.\x95\xb2\x1c\xf9\xea\x37\xd5\xe5\xb1\x81\rp!\x88" +"\xf3\x14\xe\x95R\x88r\x8c\xc7@\xbb\x8f\x43r\xed\x81\x87\xdd\x13\x8b\xe4\xa7\x1d\x9a" +"\xdd/h\xa7_\xf2\xaa\x16\xf2\x8b\xf4\xa6@Q\x0\xdc\xb9h\xc\xfc\x34\x30\xad#\x8=&_)" +"0L\xe2\xaaH\xc6\xad#\x8f\x97`9\xcb\x8c}S\x88\x17\x94hg\x12\xc3\x1fw\xc0r\x93\x9c" +"\xf0\xf5\"O\xc7\xa2\xcc\x16\xb5\xaa\xa1\xaf\xf3\xbf\x37\x8\x90\xeb*\x1d\xb1\x66\xa7" +"\x9c\xa9\x1b\xcd>\xd8\xea\x0\x8a\xaa\x91\x3v\x92\x19\xcd\xaa\x19\xb5\xa2\x34\xea" +"B\x97|\xdd\"\xe\xe8\x10\xe8\xd8Y\xe9\x92\xe6\xe1\xceI\x1fG_\xe0\x15\x38\x9c\x9d\x16" +"\x7f\x19\xd1\x43 \xc4#\xe3\xfdr\x8e\x33M\xd5J\x1a\x9cLF\x85\x63.\xea\xcc\xba\x1f" +"\x1b\x99\xf9'\x83%\xd7\xce\x35\x9bo\xb8m\\d\xf3\x81\x15Z\xca\xb8\x86\x62zP\x5o\xd5" +"\xcd\r\xaa\x1b\xca\xda\xe2}\xa9\xd5\\!FqI\x97s\xb0xc\xd8\n\x18\xfc\x41\x0\x9f\x86" +"m\x81\xd9\xb5\x8b\xd2$\xf3\x1f\xdb\x7f\x10\xa6j\xf4R\xd8\xb8h\x9b\r\xb4\x8b\xf7\xe9" +"Y\xe9\xc9\xdf>0je\xeu\xb\xfa\xef\x43\xb4\xd4\x66\x66\xcc\xfa\xe5\x8c\xe0\x85\x16" +"\x13\x13H\xd3\xd7\x8e\xde\xad\xbf\xe2_\x91<\x7N\xea\xeb\xe3\x90i\xe\x63\x96\x0g\x97\xae\xf3" +"\xc5\xc8U\x1b\xe8\xb0\x8bV\xc9\x11W\xa2\xae\x33o{\xd3\x9a(|\r\xcc~\xe9\xb3\x34\x96" +"\x8c\x5\x1c+\x9\x1d\xbe\x2\x9c\xec\xb9\x34\x39\x65\xf0\x10\xf6\x88#\xed\xff\x39u" +"\x81?\x81\x36\x10\xf6I\x19gOt\xb4\x11n\x80S\x86\xcd\xccg\x9b\xe1\x90\x7\xd7\x42\xd8" +"\x1bX\x96\x11\xdc\n\x84GP\x89\xa6\x39*\xd0\x8d\xa6\xe7\xf0\x9c\x14\rQE\xa4\xd8?\xf3" +"_{\xea\xc5iB\xf0#Lq0\xe9\x93\xb6\xea:\x6\x8a,\xde\xc5\x65=\x9c&\xce\xffj\x95Vd\xbb" +"\xe1\xc4&\x8\xf6\x9e\x63\x1d\xba\x42_\x82\xc9\xd2\x11&kL\xd5JJ\xc6\xbd\xb2v\xc5\xea" +"\x89\x7fXIN\xe5\x19\xf6\x99\x2@\xaa\x9d.\x1b\xd0V7\xf1W\xfa\xa4\xbb\xc8\x18\xc3\xa8" +"z\xecl\xe1\xd6@t\x8f\x1c;\xcd\x9fq\xb7\x8dW\x93i\xc7\xa0\xb\xe7\x36i\x12\xed\xee" +"y\xa5\xfc\xe0\x88\xb8j.\x87\xc1\x7zq\xe5\xc9R(\xba\xe2z\xb4\x9c\xe1\x9\x33\xf3\x92" +"\xd5\x8\xf2\xfe\x66\xdaY\x8a\xc9\xe8mR\x1`g\xfd\x10\xb7(\xe2\x98\xda#zE\x98&\xd9" +"\xcc\xd7\x63\xf5\xbav2\xfa\x15\x88\x9dI0O\x88O\x8aZ\x18\x31\xc8\x31\xd6\xc6\x45\x97" +"\xe5\x13\x45\xed\r\x90w\x17\xc5z\x1b\xe6\xda\x7f\x81\xc2\xf6\x95+8\xa6:\xdc\x44\x86" +"\x9c\xb5\x11\x98\xcf\xd8\xb2\x34]y\xc2J\xfa\xd2h\xbbv2%\x86\xae\x97\x1\x9a\x18\xe3" +"\xf4\xbe\xe6`\xb1\xf\xbe\x12\xf0\xd5\x9f\x99\xdd:g\xc4\x1b\xbf\xcbqX\xeb\xb0x[\xcd" +"\xb9\xaf\x44\x9l6\xef\x93\x96\xfa\x30 o\xd2k\xef\\\xa2\xf>2\xe2\x8a\xad\xefHv\x89" +"\x5>\xe2\x39|Zr\x9b\xf2}\xa4\xcc \xf7\xde\x34\xbd^\xcaS\xa3\xb4Z\xeb}\x12\x97\xa4" +"1\xe3\x9f\x8eI\x8a\xa8|\xd5?\xe3\x9cU~\x89\x9\x5\xdd\xc7h\xcf\x14\xec\x44\xbem\xea" +"\xc6\x84\xd7\x66\xac\x8\xcc\xd8\xd7\x8b\x16oT\x81\x65\xd7W){\xf8\xf2\x45-\xf8ke\xe9" +"\x1cy\x9e\x1b\x45 hx\x17\xc6\xd1\xce\xe3`tWj\x5\xd8K\x6\xf3\x94\xa5\xa2\x12x\x97" +"A\x8f\xc4u\xb5k\x92\xeb\x1eKI\xb7\xa9\xd9\x81x\x91u#*\xf0\xffj~\xc6z\x88\xbc\xa1" +"%\xec&\xa1\xfb\x85w\xd0\xa0\xc6\x95_\x2\xec\x84\xbf\x9aL8\xa6g\xfd\x90\x34\x32\xa3" +"\xa9\xa5J\xcKUP\x16n\x5\xdc?B\x93oc\xb3\"\x19\x66\xb9\xed\xecw[.)\xecs\xce\xbe\x32" +"\xd8:\x9f\xcd\x8\xea\x19\xcb\x37w\xc6\xea\xeb |\xaa\x1c,\x81\xed\xff\xbfO\xc9&\x1b" +"\x8f\xb\xcc\xd7X)\xc1s\x95\xc0\xd5\x2\x41\xf1rQ6*\x81\x18\xa9\xf1\xfc\x8e\x1f\xf6" +"\xe6\x16\xc\xc2\xb1\x13\xf5\xc9\x89\xd3\xbf`,\xaa\x1\xf0\xd5\x13\x9aH\xc8\xb1\xf5" +"\x1an\xfc\xc8\xac\nwY\xa5jH\xc3\xe9\xc8\xce\x98I\xcf\xea=h#\xa8\x8e\x8c\"\x89Vy\x6" +"\xfe\x1c\x98\xbd\x81\x5\x1al\x8\x8d\xac\xad\xec\x9f\x1e\xb6\xb2\xcf\x8f'\xaf\xb3" +"D\x1d:\xf8\x9a\x39-ZSW\x3\x97\x93\xe2\xce\xacGB\x8b\x18H$\xed\xd2*\xa1GP\x87\x61" +"\xf9m\"s\xfd\x1c\xab\xc\\\x9b\x91\x95\x16\xb9\xce\xe0\x37\xe6\xccP\xf4\xd7\xbe\x11" +"\xf\xb\x16\x39\xa6\x82oV\x4\xb2[43\xdbi!\xaa\xf7\xc7\x2\xca\x84JD\x14l\xb\xc8\xff" +"w\xc4}\xfe\xdb\x80\x14\x15\xeb?\xea\rY\xf1P\xcb\x9c\x13r\xd6$\x9d\xc8\xfb\x2T\xc3" +"\x96XK\xb7\x99{i:\xfe\xb2\xc4\x7\xfc\xa0\x8aO\x17N&\xd1)\xb5=\xaa\x0\x13\xc7\xec" +"\x19m~\x85\xcd\xaei\x1\xbf>\xecs\x7\xb9\xd2M!\x88h\x82\x92\x83\xf\x18\xa7^^1\xc3" +"Jc\xaf\x42\xfb\x99z\xaf\x30`g\x1d\xbd;\xdbz4\xd4\x7\xab\x19\x83\x6\x13\x86G1\xc1" +"a\xe3N\x9c\x99\x16\x31\x9e\xf2i\x9a+(\xa0\x8f\x44\xb5^KA\x84\x30\x91\xbcJ\xdb*Dt" +"\xe4\xad\xe7\xdcg\x10xv\xa0\xe7\xd9\xf0{\r2\x8f\xbf\xf3\xcd\x9e\xf9\xd7\x8f\xf1\xe1" +"\x17\x5\x9b\x39\x94\xa6\xec\x98\x9f\x9e\x1c\xe9\xc2W\xb0\x37\xf9\x16\xa4\xe3\xbb" +"\x82\xbbI\x9c\x85>\x7\x1c\xd7\xfc\x19\xc0@\x85\x63\xf3\x8c\xc7\x9f^=\xde\x64\x14" +"\xa6\x99\x1c\xd6\xad\x32\x31\xeb\x61\x8aZO\xf3M\x86\x98\x82\xb3q\xc0\x91\xb8\xde" +"J\xf0\x7~,W\x8f\xcf\xc6Ll\xa8Q>>P~\xd2\x1\x31*E\xd5\xbc!H\x91\x41\x87\x91\x8f\xaf" +"\xe6\x88\x94\xae/\xf9\x93\xfb\x8a\x42\x81Nx^\xae\xb9@o-\x1a\xf0 E\x90\xdb)\x9d\xba" +"\x94\xec:\x97\x14|\xd6\x63{]\x96\x18\xf1\xc8\xc5\x44}\x11'*E\xf1\xb3\xd8<\x15<\x16" +"\x96\x0z\x9c\x36 1\xdc\xd0*\xa4\x8e@\x11\x8d\x81\xf1\xfd\xde/\x2\xfa\xc4\xaf\xdb" +"\x90\xfa\xb7\xfe\xe1o\\]a\x10\xdav\xa2\xbe\x32\x41\xb3\x62i\xcexe\xee\x97\xc0R0\x84" +"\x9e\x8f\xedu\xc4\xb0\xc4\xe6\xd0\x82\x31\x93Rmla\xce\xb3\xa9\x1e\xe1\x32\x86\xe7" +"Nu\xd6\x10\x36\x2\n\xed\xcf\xebjl\xefV\x17\xa2\xfb\xb7\xff\xd7]V\x89H\xf7\x18\r\x11" +"\xfd\xb6\x93\x93\x10\xb\xfbq^o\xfe\xae\xaf\xfb\x31U+\x84PM;j\\\xd2\xa0\xa3\xec\xf4" +"\x8e\xcc\x9d\xbc\x8bZ\xa3\xaa\xf5\xc2\x32\xad\x38\x99\x9di\x1b\x42\xb*\xf7\x1b\xea" +"f\xb1G;%\xc9#Z\xd4\xf2k7\xc6\xfc\xda\x9f\xc4\xe2\x96\x86\x45l\xff\xdd\x16|\x87\xf" +"\xaf\xd0\xb7\x42\xd8\x31\xbb\xc2\x8/\x8e\xa7\xd4=\xd9\x46->\x88\x15\x8\xd9\xa2\"" +"\x99\xbMt\xbb\xe9\x9a\xa8,\x7\xcbu\xe8\x8e\xe1$%k4\x9\xe?\x9a:k\xbfRzX$\x95<#B\xf2" +"\x1f\xa3<\x4\x33u\xbb&t\x8f\x19\xbc)-\xefZJ\xf3\xc4(\xd4\xca\xc\x84hG\x81\xca\x96" +"$\xc8\x7f\xe8\x18s\xb5\xef\x85\x82\x98P\xca\xfe\x18\x30`\xce\xfa\xc9X\xdc\xdeY\x98" +"\xe5\xd8Q\x1cT\xecks&\xfa\xa5q\x89\xc4\x91\xf\xbeH\xd1\xbbs\xb3\x97\x66r\x81\x34" +"\xb7\xd5\x3\x43\x91 .^:\xa8\xe6\n\xf8\x9a*\x96|\x8c\x10?irN[\x9b\x13\x8b\xd1w\xc7" +"\xbe\xae\xb8\x8e\xc\x39\xe7\x92\xcbu\xb4\x4\x6\xb5I\xba\xbf\xd2\xb7\x8\xc4h\xe9\xe7" +"\xfd\x94mNse*J\xd2\x1f+\xdc`'\x9e\x9b\x84\xdc\x89\x45t\x96\x89\xef+\xc9\xb9\xa5\x83" +"\xbf\x3 \xad%\xa7t\x9c\x4\xd5\xab\xf8$>\xfd;\xc3\xf9(\x1f\xde>\x3[\x9b:\x95\x10\xd0" +"\x8\xb8\xdf\x64\xc3\xda\x5\x8e\x80\x8c\x81\xb4\xb4\x1f\xff\xf4q\xd8s\x87\x37+\xf7" +"\x4\xf2\xa3\\\x80s*\x8eJ\xcf\x89\x91\xf8\xf7-\x8eN\x1e\x1c\xea\xee\xe2GO\xe5w\x19" +"\x8e\x8\x92!\xbc\xd1\x0\xe0\xc2=d\x7\xc7\x1f\xaf_/\xa8\x94i\xf7\x99\r\xf9\x9f\xa8" +"\x16\xc9\x2\xb5\x36\x13\x82\x94\xf5\xe5\x11\xf7\xec*J\xb0\xda\xcf\x13p[\x87\xf4\xcf" +"\x9f\x1a\xab\x8bG}\x1a\x36G\x81U\x3:\x1e\xa6\xd5\x12z\xb8\x36k\xd5\xa0\x63I\x8c\x85" +"T`\xfa\x8e\xb3\x42y~\xf\xc@\xc1Y\x9!\x9f\x14~\xa3\xfbLjt\xad\x12\xc8=\xcais\xb \xef" +"0qpz\xf0\x37\xcf\x81\xb8\x88\xb5)\xc2\x15\x36\xcf\xf\x43\xd1n\rx\r\xa8%\x37\xe1\xfc" +"!\x1c^\xdc!\xf0s\xa4\x15\x9e\xd3\xe6\xf7\xabH\x9dr-\xdd\xaa\x0t\x9bmB\x85\x37\xf7" +"=\x93\xde\x83\x62\xe1\x33>4\xd8l7\xefK\xf4\x94\x42\xbfL\x18\xbb\x83\xa1\xe7\xf9\xa0" +"2\n\xff\xfb\xd9\xc3\x1f\x18K\x9\x1d\x14\x37\x1e\xbaWy\xa5&\x1fH\x9d\x94\x42\x11\xe2" +"\x85\xe9\x99\xa3;=\xee\xe3\xcb\xbf(Rg\xc6\xe6\xca.n\xfP\x85^sfk\xaf\xb7\xc8\x30n" +"\xe7|\x10\xc1\xae\xe\xb0\x37\xfdi\x86\x30\x8IA\xf0\x90{\xbe\x87\xbb\x10\xbbm4\x9d" +"\x6\xe6t\xa5K\\\\(\xc4\x39\xf5\xd9`\x18\x4\x31\x5\xc9\xd2\xd7\x88\x35t\xfa[.$\x90" +"\xe3'\xeb\x82\x96\xf\x9bQ\xcf\x6\xb0wj\xb1)g\x16\xfc\xe2\xc4\xd6\x66\x46&[\xd8\x46" +"_\xc5>P\xf1\x99\xa7`\x11\xf7\x3o\xaf)\xb0\xbe\x19\xe8\xf\x36-\xd1\x97&B\x85\xcbG" +"\xbe\x9f\x9cR\x91P\x4\xe\x42Y\xfb\x8cs\x87\x92\x43\x5\xd3S\xe2\nX5\x9e\x9f\xcf\x90" +"\x8f\xcdS/\x97\xceRz\xd4\xf4K8\xf1\xad+l!!\xf7\xfb\xaar\xf3\xdb\x94\xd3(\xa8\xbe" +"re-\xa8UM>M\xe3H\xc8\x9eV\xbcOA\x85\x8c\xe4q\xcd\xe8Y\xb3\xb9\x31\xf7i\x3\xce\xba" +"\xeb)\xado:\xbe\x84\x0\x2\x45(\xc2\x18\xc3\xe3\x1a\xden\x80\xff\x80\xbc\xe0 \xe8" +"\xdf\x34_w\xbb\x65\xe8\x9d\x35M\xa9*\xfa\xf3\xbbN\xab\xdd\x62.\xc\r\x94]\x1e\x9\x15" +"AY\x7\x8f\x8b\x1c\xc4\xc6\x8f\xd4\xf0\x61\xeb\xdc\x16\x13\xa6\xa3\xfc\x43#\xea\x1b" +"1L@<\xd4\xe_\x86\xb8+,M+\xc5\x8\xf5\xc1[\x8cq\xfd/\xb1\x8b\xdf\xfc\xa2)+&\xf9\xe4" +"`L\x95\x80\x91\xfgB*}\x9dtMK\x7f\xce\x9qa6C0\xa7\xa8\x9a]U\xe4\x94\x38\x87]\x92<" +"\x1f\xb1\xd9\x64;\xf5Xg^\xea\xf8O3Uk/\x9fn\xdb\x62\xd0_\xac?\x93#j\xef\x1\x90\xbc" +"]\xa9\xb6}\x16\x41\xe5mQ\x1dH\xf5\xf6 \xf0\x15\xf8\xffi\xf4\xf4\xaa\xd3$$\xf0\xbb" +"P\x96\x87\xb0\x44\xdb>b\xb9\xa5\xc7\xaf\xd7\x13\xee\x90\x39\x66\x42\xeaR)\x81\xcb" +"\xbfi\xe3\x1c\x97\xaa}8\x8c\xeb\xc6\xb2}#!;\xc6\xf6\xb6\x12$\xcf\x63P(P\xd7\xd0\x66" +"\xfc\x95\xa9\xeb\x92\xed^iME\x17W\xd2\xc8\x3\xbm,\x88\xb3]\xd8\xdd\x30\xf\x45m\x1a" +"\xf3\xfc\x44\x99*o\xeb\xce\xa3\xe4\x39M\xa4\x12W\x1c:\xebpYN\xb5\xc3\xd7\xc2\x11\x19jrf\x3\\\xa7\xf5\x89\x30\x15\xe3\x95" +"\xe0\xce\x1c\x18[\x14QO]\x18\xc3\x11\xd0\xb5\x9&\xd7\xc0\x87\xc7\x7\xd1G5\xd5T\xc5" +"&+p\x17\x83V\x94\x32U\xd6/\xc\x84\xfe\x9\x38\x8a\xc5\xa2\x85\xd1tX&\xac\xf9h\xa9" +"\x95X\xc6\x13\xa0\xd5\xd3\x8b\xc5\x8b\x91\xbf\xf7\x38\x80\xde\xd6H\xd5<\x8d\xd8q" +"\n\xcd\xb3x\x17\x34\xea\xb1lm\x8a\xe1\xb7\x37!\xde\xea\xeeJ\xc9\xfe\x96\xd7>t\x88" +"2\x85\xee\xaa@YQ\xe0O\xa8\x19\xda\xc1@>\xa9L\x9b\x96\xcc\"\x7f\xb#hB\x92\xe3K\x89" +"\xa9\xac\x95Rd\x9d\x1c\x65\xbf!Cn\x99|VB{\x97\xbc\x44&\x13\xf1r\x97\xf9L\xbbU\xfc" +"\xa7\x61\x7fT\xb3\x3\x9e\x35\x30\x85\xaa\xd5\x92UU\x95\xd9\xb1\xee\xfp\xe3\x36\n" +"\xc3\xc2\x39\xf8\x1b\xde\x90\xba\xd2\xb1\x90\x14\xb0\xb8\xce\x83\x46\x6\x94\x89\xcf" +"\x13\xe0 \xc9\xde\xcfq\xc7\xcb!\xcf\x13\xee\xbc\x1d\xc5\xeb\x61\x61,\xf\x11\x8b\x32" +"\xe7\n\x66\xef\x84\xb8\x97\xa8\xc9\x1f\xea\xf8\x63\x7Z\x84\x19{#\x84\xca\x84\xca" +"\xb5T\x13\xb1\x8e\xc1\xb\x7f\x16\x84\xe4MW;\xf4 \x84\"\xac\xc2%\xfc\x1c\xa8\xe9\xa3" +"\xca\x9d\xe6\xfa\xfb\xb7\xc3\xbf\x43\x7f\x9\xac\x1\xbc\x36\x0\x8e@a\xb6\x91u\x1a" +"a!J\xfd\x9d\xd1\x11tg=\x1e\xc6\xbb\x1a)\xc6\x1\x9b\xeb\x19i\x14\x43\x35\xd8\xdb\xa5" +"{[\x0\xbe\x33[\\\x8f\xde&\xa0\x45\xd5\xbd\x65\xe1Mo\n\xf5\xf\x1f\xbf\xe6\x17o\x84" +"\x93\x41\x13{\x5.{\xceHx\x17^:\xdb\x34&\x13-m\x3\xfe\x15j\xb5\xb1\xf2\xc4\xbd.U\xf5" +"\xba\x92\x7\xf0\xaa\xbf`\xb7_\x91\xcc\x38J\x93\xf2{,}\xee\xe8\x1c~\x1c\xe5@\xc9g" +"\xdd\x64?\xf0\xa8\xb8\xba\xd2O\x13\xb7\x13\xd0pL\\#\x5\xc7\xdas\x91\xf7y\xee\x1a" +"\xb7\x7\xd3\xc3s\x9\x46s\xf0\xa0l:\xb5\xab\x90;#\x3\x63\x30\x8T_\xe7\xebh\x13\xb9" +"n\xc4\xa2:\xb4z\x5\xbLA\xc\xf6\xfa\x31\xfd\x1bN\x5\x89\x36\xd1\xd7ZE\xae|)i\x4\xcf" +"\xbe\x35\x35\x5p\xa2\x8d]T1\x4\x96\x64\x99\xac\xf4\x31\xc0\xc2\xdc\xe0\x1bw\xbe\x9c" +"\xb1\x93\x92\x31\xd1\x9b\xbf\x8b=\x1a\x96P\xc0\x8e\xe0\xb7(\x8e\xf7\\\x95\x31:\xf5" +"\x99\x91^}j\xc3\xd8Ms\xc8\xb0\x9#\x1f\xea\xbf;\x14P\x6Z\x7%$bu\x8a\xcfL>\xa6 5V+" +"\xf0\x11?\x15\x88\xb4\x11r\x16\xde\xdf\xd5zf%\xf6\xef|(\x94\xde\xeaP\xb3\xa2[!\xca" +"X9(qO?\xa3\x41\xdd\x84\x2#\x17\xe3\x36\xe9\x3\x85v\xa2\x41\xeeu}\\(\xf2\x43\xe1\xed" +"_\x94\xf0\x46\xac\x1b\xa1\x62\xd8\xa7\x35\x1f\xc\xc3\xce]\x86!\xa8\xb2\x9f\x9d\xe" +"\xa3]K\xe2\x63\xdf\xd8\xff\xec\xf4\xc4\x9ex5\x84\x97\xde\xee\xf6\x1d\xb8GX\xa8y\xef" +"\xda\xa3n{+\xb8\x5\x94P3\x92\xe2\xd3\xf7\xc3i\xab\x8b%h\xdaPQ\xf0,\x1e\xc7\x1f-\xa1" +"\x8bY;\xaf\x10\xeb\x1f\xd9\xf9\x2\x61#\xf5\x61V\r\xe0.\xcc\xf7\xef$\xfUt\xd4\xcb" +"`>s\x9f\x7\x38Zo\xd6\x30\xbf\x9f\xa4\x96\x7f<\x8c\x9\x9am\xce(_\x9e\xb7\x64\x14\xe2" +"\xe0HhlV\xd1\xb1L\x9d\x85\x1bK\xd0\xbe\xfc\x44\x8fJ\xeb\xb\xa6\x4\xa0\xcf\x33\xc5" +"\x94\xd5\xa5\"\x38\x91X\x1b\x39\x99\x6S\xe1T/\x1e\xc7\x87KN\x87$|\xea~o9\x5\xac\xee" +"\xe\xc5\xcd\xc7\x92\xdd~\xa0\xfd\xbdG\xea\xbb/\x15\x8cR\x86\xf7\xaa\\\x14\xf7O\x1f" +"\xf7W\xb6\xca\x66\x65`B\xb6\xfc\x0\xb5\x9a\x90\xf1\x65,}\xb8\x43\x8a?\x18\xff\rS" +"r#9\xe4\x33k\xf6\x1a\xf3\x82\xf0\x1a{\xcf\x80\xec\xb\x1a\x1f\x88o++\xbd\xce\xb0\x86" +"\xe4\xef\xac\x8d\x6\xbc\xff{N\xdf\xb4\xe9\x35\xc9\xcf\x85H\xf2l{&py\xd5='\xe\xd7" +"\xb1\xe5\xbfk\xa7\xd3\x82\x43\x9a\xf1r\xf4\xd0>\xbcr\xc\xa0\xfd\x65\xc8\xac\xcc\x33" +"\x14\x97\xdePhC\x96x\xabM\xc8\xc1\xd4\xc0=|\x4K\x9c\x11\x35\xbf\xb5\xe2\x9bj[\xf6" +"\xb6g\xf7!h\xda\xc8\xca\xa4\xea\"\xfa\xcfI\xdb~\x9bl\xdf:\xea\x13<\xa6N\xb1\xdb\xb9" +"`\xcf\x90R\x9f[\x16{\xcb\x7f\xe2\x10VG*\xad\xa6\x8fj\r\xdc\x1b\xf8i\xf4\xff/d\xbb" +"\xb6\xf\x12\xba\xb2\x83 T\xc5\xdc\xf6;_\xd3$\x99\x81\xca\x86L\xf5\xe7#\xa6;\x8a?" +"\xd6\x9&\x1f\r\x80\x1&\xfc\x14]\xf7\x8d\xdfQ w'i\\\xb\xf8)\xe0\xf2mu\xaf\xe|\x82" +"v\xcc\x1f\x91\xcb\x36\xfe\xbe\xda\r\xd2\x8b\xf1\xda\x63y\x92\x1b\xfc`\x99\x18<\x1e" +"\xc0]\xdd\x65\xf7x\\y\xa5\x8c\xab\xe3P\x8f\x62\xeeh\xee\x1\xe7\x32\xa4g\x93\x44Q" +"9\xc9+I\xac\xc2\x1d\xd8\xdet\xfc\xaa\xa2X\xf1\x80\xc6\x65\x1b\x16\xb3\xc6\x93kOS" +"\xef\x1f\xa4\xb3\xb6*\xb3\xfa\xf1\x4\xa9\xc0\xe4\x32\x38\xed\x85#\x88\xc7\x98\x8a" +"\xexx\xee\xc1\xfb\x30i\x8c\xdaI\x83\xb0\xc8[m\x9b\xe3\x62]$\x6i\xa8I\x85K\r\xbe\x8a" +"X\xac\x61uV\xdbs\xf8\xbc\x6\x14%Y\xef\x98\x45sC\x14\xfc\x81\x39\n\x98 [Ip(\xfd\n" +"0ob\xde\xe5\x9a\xb4\x34h\xc0R\x96\x0\xbf\xa1\x82\x34\n\xcf\xd9\x41~\xa8\xd6\x95\xc2" +"R\x94\x85\xcb\xcc\x17\x91\x94\xa7\xd8\x81\xfb\xaf\xf0\x80\xaa\x9b\x19\x97\x12\x1" +"]\xb7\xf2\xb1\xdcU\xe4\x7f\x15\x16\x64R2\x1c\xaa\x0>p\xfa\xbfw\xf4\x92\xa6n\xc8\x7f" +"\xe2!\xdd\xd2HeL/\x0\x87\x32v\xd9\x1c\xd6v\x8c\"\n\x84\x89\x33\xf1\x2\xbd\xb1s\xc3" +"\x1a\x1fOj\xb5~\xc2\xd1\xafx%\xd0)\xc3\xf8'\x82\x9c%\xea\x16*h\x9d\xc8\xe4S}\xcf" +"\xce\xe0t\xc6\xbd\x44\xb8\x36j\\-\xf8\x33N\xff\x63r8\xab\xed\x39\xe3\x9a\x31P\xb6" +"l\x13\xbd\xf7\x9e(?E\xa4\xf6\xdd\x39\xf2\x10q\x1d#\x95\xd8\x8d\xe2h2\x12q\xdf\\\xd4" +"\xaf\n\x8d\x44\x9c\xdb\x45<\x95@Js\xc6,\xd1HU\xdf\x43\x38\x97N\x83\x9a\xe\xad\x62" +"&\x1c\x2\x89\xfY}=\x9e\x34qk[\xa9\xf9o\x91G\x15l$\xe5\x61\xd0\xad\xc9\xa2_\xc5o\x1" +"_7X!\xa1\n\x81\x9a\x95\xa1{{cE\x85\xf3R_\x90\x8d\n\x19\x16\xf3\x45\xb7g\xfe'\xa0" +"m\xe0\xf2\xfb\xbd\\\xfe\xd6\x30#\xba\xf6\xe2\x42\xe6\x84\xc\x93\x1f\x43\xa6\x62~" +"BA\xb9\xe8\xcZ\xe3\x80\xb0x\x11U^:!KVe2\xbf\xb2\x64\xee\x86\xad\x8fl\xab\xbf[x\xf5" +"MM2\xc4\x83\x66\xd8\x8a\xa5\x94Nr0.\x7fx\xdd\xd8\xd4\xecR\x81\x83\\\xb0\xaa\x61<" +"\x9btQ\x2\xa2\xd3W\x97\xa8U\xc6\x98\x82\xc9,\x7:u\xaa\x9a|\xd7v\xec\xb4\xfa\xd8\x16" +"\x87\xb6\x1f\x10\x13\xcc\x61+\x99\x14\xdd!\xa6\x42\x15\\\x8a\x19\x88\xc5\x1d$\xa2" +" \xbe?\xfc>\x1e@A\xdempz\xcd\x42\xa6\x8f\x30\xdb(\xd2\xf3\xa3\xc9\xc2\xc7$x\x8d\x97\x8ZC^?\x15\xe2}}" +"\xc1\\\xa0\xacmSX\xfaX0\xb3\x8f\x39\x87\x8\x41\xfd\xd9\x9d\xba\x85\xd8^\xc1\xd1\xe5" +"\xe9?\xa4\xccYQ:\xb8\xb4H\x88|\x96\x33\xa7\x1\xe3\x82Y\xc\x42\x44!\xbe\xbf\xc6\xb0" +"\x9e\xcd\xaf\x1bj\xffn\\g[SO:-\xe7o\xfbh\x97\xfd\xfa\xf\x42G\xfb\x81\x39\x97\x31" +"\xc9\xfe\x1a\x95\x42\\\xe7\x89\x30=\xcf\x33;\\\xac\x1\xa4\xe2XbA4\xe6\xf6\xf4#\x3" +"\xaa\x88\xc9\xc2\x9d\x43\x16\xdb\xef\x89v\xe0\x33T4\xce\xdc\x1b=\xddm\x83 !h'\xa5" +"|\xd3l\x8c\x92\x83\r\x30\xd8\xa4\xb7\x42=\xd4z\x1c\x9c\xfc\xads\xbd'U\x94_\x9d\"" +"\x85\x99'\xde\x1f:Py\xb0\x64\xb1\x89\x13p2\xe8[)\xa9\xe7\xf7\x94\x33?\x1c{$C\xa9=\xb3" +"\xd9\xe1\xd3h\x4\x2\xe4\x96\xbe\xa6M\xb1\xa8\x66\xef\xeb\x11YJ`\x9b\x92\xeb\x97\xba" +"\xcd\x44\xef\x8d\x5\xf2\x13\x35\xc\x81\xd5\xbf!\xd2P\xcd\x2\\\xbe\xe4\xcd\x0\xee" +"\xa6X/\xe0\x46=\x84\x4T7\xf4Z{\x83+\x5\xa5\x9f\x17\x41\x43\x93@&f\xeli!&\x98\x83" +"s3@\x88\xe6\x65\xbb\x1d\xab\x92i}u\x94\xed\xe1\x9f\xf6\x99\xdeq\x9c\xdd\x63$eUW\xff" +"\x0\xbf\x88\x8c\x98\x17\x5\xa3\xd9w^\xc9\xdc=\xbe\xd6\x65\xebW\x90\x86\x1a\x97\xa2" +"O\x17Wf\xe1\xe7\xccrg\xf4\xea\xab;`\x1\x62Z\x98\xcI\x3\x31\"\xb4gy\x11\x17)\x11\x95" +"t\x18{m\xa9\xbc\xe4\x42q;z\xff\x62\xd1\xa6\x7n\x7\x1j\xd3\x34\x1b\xbdX\xb4R\x89\xea" +"\xaa\xbH\\pW\xf9\xc4}Z$\x8fH/q\x16/\x92\x88q\xb0!{0\x89\x13\x9cN\xb9\xd2:\xb5\x4" +"\x3\xc5\x9dS\x1d\xe7\xf0,\nR\x7f\xb4\x35\x97\xb8\xe5\xad\xa7:J\xdf{\x6%\xdaP\xe2" +"\x82*\xff\x9dj\x9f\x38\xafP1B\x1\x81_y\xee\xf6&\xa1&\x80\x31\x8+\x1f\xb1\x98\xc\xb5" +"\xb\xf7]9N!\xa8\xba\xe1\x63\x6pE\xbf\xd0\xa5\xce\xe5\xbdm\xb0J\xcc\xd1[\xe2\xd2\xcd" +"\xc8,\x92v\xb8\xc6~\x3\x42\xd1\xb0\xd5\xfc\xec\x98\xa0VS~e\x88\xe7MW!N\xba\xd1\xc9" +"\x92\x16q\x9b\x35\"'8\x84\x6\x11g\x90\xc4;V\xbdj[\xe5\xf4\xb8\xf\xa6\x92H-\xb8\xc0" +"\x1c\xc3\xd1t\x81\x37\xd7\xa3\n\xac`\x9a\n\xea\x9c{\x16\xf6\xfd\x46\xb5\x8b\xa8\xc0" +"\x86!\xb5,(O\xd5\xaa\xb3&\xa4\x85\xc7$\x14\xdf\x63_\x1\x8cP\xa5\x9\xac\xfcQ?}$\xd0" +"AJ\xb7\x9a\r\xb7\r\x7f\x85\x2{(b\x16\x17\xf9\xd0\\\x6\x5.MBm\xa0\xca\xb9>i'\xe9\xae" +"\xe9\x1b\xdc\xcaY{\xb3'|,\xd5\x94\x66\xd2\x92\xeb\x9ck\xe\x80\x9d\x92P\xe1\x46\xfc" +"\xed-\xba\xce\x65\"\xa7\x36\xea\x1d\\O\xe5\xf2\xda\x63\x8e]@\x88(0O\xb2\x8fw\x1b" +"\x91\xe\xe9\xc7\x9e!\x90_\xbc\xcdH\x12\x63\x36]\xb5`\xfb\xb1G\xb6\x1f\x42\x18z\xa3" +"\x1d\xc4\x9f\xf6sg\x8\xf\xc6S7?\x10.9R\xce\xc7M\x94\x9f\x65\x6@H9\xbe\xacY\xdf\x82" +")\xc3\xab\x81:\xe0,!\x3\x62\xd3\xda\n\xf8\x46\xca\x41\x17xC\xce\xd7\"\xbe\xd9\x37" +"\xfa\x3\xce(jI\xc1\x18\r\x85g0\xe9\xab\x9a\x44\x9d^\xa5L\x13t*\x8dT\xcer\xa3g9\x4" +"\x12\x99\xbas\x93*\xda\x46\x3\xeb}(\x96\xe1\xd5\xad\xe7\\\xe7\xba\xc5\xd7\xe5\x15" +"\xea\xd8\x31\xefu!J\xdb\x37\xc9\x17\x41\xc~T\xf2\xb2\xb8\xdd}\x85,@\x84\x44\xfbO" +"G#\xa5\xceo\xe3\xe8\x5\x4\x66\xb\xe7\x8a\x9c]1\x3\x82\xe6,\x8c\x12\xc9\xe4{\xcb\x34" +"\xf3\xb3\x41\xe6\x1cV\x1a\x1ek\xcf\x12_S\xc\xf9\xc6\\\x8d\x1f\x1e\xec\x65\xf2?]\xb4" +"\x84\x7fL=\xac\xac\x8a\xbc\x62\x64\x1eU\xa2\x61\xc8\x99\x80<\xfcK\x8a\x9e\x37\xb9" +"\x86\xe\\\xb1s\xb4\xa0><*\n\xcM\x83q\xbavi\xd7_N\xef\xd4\xc9\xd0\x94\x7\xa1\xe2\xe7" +"E\x85R\x17\x97\x12\x9c\xd8n\xa3\x14p\x98k\xc2\xda\xee\x82\x1a\xcaGE\x1c\xc8\x91\x9d" +"\xff\x9e\x98\x45\x8Y(\x3\x88\x97\xd8r\xae\xe2\x88I'\xa3\x44H\xf4\xde\xca\xc1\x13" +"]*[\xb6\xda\xa5\x44\x10\x46\x84\xed\x95\xb4\xc5\x82\xda\x3&\xac\xef~\x99k\xfe\x8" +"\xa1\x1b\x0Q\xa9\xae\xcJ\xdd\x1d\x97\x44\x0\xa8\xc2\x1c\xa9\xadq\xf\\S\xb8\x16\x83" +"\x16\r\x19\x1f\x9f\x19\xd8\x1b\xb9\xdfGd\xa8]\x84\x8dr\xed\xdc\xbd\x99\x8c\xf7-6" +"\x6\xac$\xd9\x65\xed\xdf\x44YPD\x15\xe0\x61\x1c)\x9c\x37\xa5\x93\x6\x36)JF\x98r]" +"\xb9\x87\xd5^\xfc*\xe0\xfe+\xea\xca\x90\x34/\x1f\xf5\xfe\x33\xa2\x8a\xd9x\x83\xf3" +"\xcd_\x8d\x64\x95\x66\xe9\x37-\xbf\xe3\xcc\\\x95\xfdH\xcc\x83\xbf\xae\x7\xa3\x63" +"zJK\xa8\x41\x7j\x82\xc9\xa5J\xfe\x98&\x1d\ny\\y2\xf5m!\xea\x6\xf8\xfb\x7\x64Vi\x91" +"1\xd5\x1ek2\xf\x0\xe7\x99\xd3\x35Og\x0\xcah\x7f\x11\xc0\xd5N\x1c\xf3\xcb\xb4\xd6" +"\xb9\xff\x95l\xf3Hz\r\xd2\xf9\x8d&\x16\x44M\xc1\x7fUt\x1\xe5\x9\xa1/=\xd3\xef\xf9" +"\n\x9c\x32\x61?\xa4o\xbb\x14\x3\xablC\xb1\x14\xf1\xe1\xdd\xff\x16\xf1x\x17\x85!=" +"D,\xa4&\xe0\xaf\x87\xba\xcb\xb2\"]\xf2/{d\xf4\x4\xef\xb\x19_=\xe9\"\xb4\x35\xb4\xd7" +"\xd9\x1e\xb1)\x1b$\xb5\xde@o\xd5\xd5\xd9M\xe8=\x9e\x8b\xca\xd5\x8n'N\xd8\xa4\x4\xb8" +"\xb4[-\xaf\x63\x17\xdc\x5\xf4\x87\x8\xcd\x45\xd7\xfa\xbfx\xd6\xcbJe\xca\x97\x34 " +"\xbd\xc\xbd\r\xda??pa\xc1T\x15\x32\xb1\x31J\xe9\x18s\xfa\x9fO\xe2\x99\xe4\x1e\x97" +"\x1e\xccY\xb1\x41\xaa\x41\xf9\xa0\r\xb2\xfd\xa8V,\xec\xf7*|\xe7\x90\xe2\xab\x46\x30" +"\x1a-\xbbg\x1e\xfb&\xf6\xad\x63\xb4\x1\xbb\xa2\xea}\x83\xefG\x6.\xa5M\xa3\xc3PH\xf3" +">\x95\xe8\x89\x1e\xe2\xd4\x80\xa6\x34\xe6>\x85K\xf6\xb2\xf2\x92\xc2\x1gA\xf5\xdd" +"`S\xdc\xa3\xf5\x45\xd8\x41\xdbIGi\xf5u2\x86\xa0\xd2#\xee\xf6;<\xd6\x46\xb9\x96\x66" +"jnJ\xe1\x15~\x13`\xce\x82\xa3\x1b}\xac\xd9\x7f\x9\x9a\x33h\x1cgGJ\x91\x45@\xa4\xad" +"\xfd\xb5\xc1\xa4\x1e\x41\x7fO\xb7\x95\xecM\x8W\x1s \x98\xdf\x95\xe5\xa3\xa8JM'\xe1" +"b\xa5\xf1;\xfbh^\xb3\x8b\xbR\x5\xf9\xe4MC\xdb\xc6\xa1*\x7f/\x9\xc1\x45\xca\x37\xf2" +"\xaa\xfa\xf1\x1bZ\xd9\xd7\xf6\xd4\x14m\xf\x61Z\x83\x83\xa6`\xd8\xfe\xaa\xb7g\x9\x86" +"vim\x2\xc8\xc5\x95\x85\x8a\x16\x44\xbe\x9f\xa6_\xee\xe4;\x99\xc2\xde\x3\xe1\x15\xc4" +"\x1f\xe\xd9\xee\x9d>\x9fw\x97\xb4M\xb0\xb6\xb9\x9b&N'\x1a\x0\xa7\xc8,\xe\xd3\xa9" +"\x96H\xd6\xff\xb4\xd8\x84\x9d\xbfH\xae\xa2\xe0;\xb8\x14\x64\xfb\xfe\xc8\x61T\xf\xd2" +"s\xec\xc6K8\x94\x81\xe7|VS\xeb\xe1\x10$ \x2G\xc3w\xac\xc2\x4p\xf3\x62\x99\xb2=\x90" +"\xdc\x66\n\xc7R\x9o\xfa\x1b\x11\x8e\xac)\xfa#\rO\xf6\x92j\xccI\xef:$\x9f\x1c\x61" +"\x97R3?\x84\xf8\xd3\x93Y\x18\xbdmY\x89\r\x1d$\x94\x34\x93\x66}S{\xde]9\x6\x1|\xa6" +"@\xff\x1c\xa7ph\xe2\x8dJ\xa1\xeo\x93\xd0\xbf\x12\xa2X\xe1\xfbX\xdfO\x1b\xd6\xb5+" +"\xf]\x9d\xc9\xd0\xa9\x1b\xc5\\\x1bpH\xa0\x62OT\x85\xe4\x66\xc6\xa8_Vqa\x11R\x83\x94" +"\xf4\x36\r\xc8\xc3\x14\xab-\xa4w\x99o\xb6\xfe\x1b\xc9\x18\xab_\x81\x66\xea\x10\xbb" +"vA\xff.d\x97\xab\x33\xfb\xf1\r\x90\x31\xe4\x11\x7f\xcc\xb3\xd7\x6\xec\xdcI\xa8\xde" +"S\xbf\x11\xa6{\x9dhY\x9e\xf1\xc7\x43\x15\xa8\xb1\x94,u\xbaG\xe8\x30GGU\x1f\x37\xd0" +"\xb7\x44\x7f\xb0\xc5\xd9\xb3\xe9\xf1\x1d\xb8\x8\x82\x80\xe1\xfap\xed\x8f\xdb\x63" +"\x10\x66\xb1H\"\x89\x18\x1d\x89\xcft\x84\x97\xa8\\\x8\xaf\n\x9a\xa8\xd1'M/\xa1\xa8" +"\xceGO\x19\xcaG\xdc\xb3\x8bKV\xa0[\xcfMp,\x1b\x33\r\xe7%\x87\x13L\xca\xfc\x8c\xdb" +"R\x1a\xe7\x43G\xcd\xcc\x4\xa7\xfe\xca\xc1\x19\x1e\xeeSV\x7\xblj<\x9e\xd4-i\"\xe9" +"ni`Cc\xd5\x8e\xf8\xc0\x35\xe4\xec\xb7\xb3\xac\xd9\x95\xf7\xfb!V\x15\x3\xafy\\<\xc0" +"\x95wC\xf8\x94\x96\x8d\xc5&g\xf4?\x1c\x89\x16\x8a\x93_i\x17\x83\x63H\xbe^\xcdN\xd3" +"'\xb4m\xdf\xe5\x87\x90\x9c\xac+\xb9X!Ku\xe3\xf5\x62\x1c\xd6lI\xf2\xae\x33U&\xee\xc4" +"\xc2\xab\xbb\x84\xab\x65\xb6\"\x34\x66\xff\x65\x9e\xbfM\xab\xfb\x82\xc0\xc6\x1d\xbf" +"y\x85\x3\xd2\x98\xad!\xc5\x36\xd0\x36\xc7\xed\xa2U\xb4\xe0\xb1\xf8u\xbd\xef\n\xb9" +"\x95\xb8;/\xbf\x91\xee\xa7\xe\xaf\x80\x95R\xd7\x1f\x92>\xbcvt\xe6\x86 \x1\xee\xe4" +"*\x16\x1fjl\x8c\xd3]\xb3)\xf9\x37G\xeb\xd5\xdc\x61O\xea\xc8K\xfa\x4\x44\x33\x34\xf2" +"\x0\x8a\xf2\x8d\\\x94\x1b\xa3\x1e\x11\xed\xcf\x9c\xf0\xa5*w\x8Y\x9b\xcb+.I_:\x1W" +"\xe5LQHZ\x1b\xd6;\xc3\xe0\xe5\x91\xb9\x8dw\x7fyaoc\xa8w\x1d\x9c \xd2\xa5\xcd\xed" +"h\x81\x43\x6\x12\x61;\xd0\x2w}\x9a><6\xbb\x95\x46\x36\x8b\xea\xc\xd1lg\x1f\x61\xb8" +"\x8c(\xf3\x9a<\xaf\np\xcP%K\xb1\xfc?r_+\xcf\x39X\x1e\x8d\x9f\x62\x81\xdfO\"\xbd\xfb" +"\xacz\xd7\xca\xab\x43J'%\x19{\xef\xca\x7f\x1d+\x16\xf7\xa3x\xd9\xe0X\xbfx\xe2\xe3" +"\x9_V\xb0\xb0\x84\xf\xa8\x6\x10\x65\xec\xcb\x10\x9a\x33\xd3\xc6\xae\xdf\x39\x19%" +"I<(\xad\xd1\x1b\xe1\x85:\xb\x9c\x14\x33\x39I\xcbm+\x1b\x89:\xee\xe4\x80I\n\xce\xc7" +"2\x97\x63\x7f\xa7\x16\xf1\xf4\xe0\xcc\x5\xabVB_\xa7\xe6\xc8q\xc9\x86\x3\x81Z$\xea" +"\xb6\xb1\xf2&\xdc\x9d^\xb5\xcf\xd4\x86\xac\x8fw\x11\x5\xf0\x84\xde>\xe0\x41\x32\xbd" +"\x14\xca\x8Z\xb6\xe2\xb9\xce\x13\xc1\x4\xce\xc6\x92S\xb5\x33\x8f\xd2u\x1dHB9\x94\x9b\xd8\xc6\xda\xc6" +"\xe3\xf8\xe8\xc3\x9aV#\xe1\x18\xf3W\xcd\xea.\xa5\x81\x82\x46\xd0\x42\x13\xad-\xb3" +"\xb2\x85\xcb#P'\xdf\x3\xbb\x98&\x6\x9f\xca\xba\xf5\x36\x36\x13\xe2=\xbe\x65\xd8\xf" +"\x15\x8b\xact\xfe\xc3\xe4\xafn\xd3\xb9\x30\x0\x1_\x89\x11\xc2\x99\x1a\x6q\xdf\xc2" +"\xff\x17\xa8\xf9\xd2\xcd\xde\xd9%s\x9b`g\xee\x81\xa9\xe7\xba\xcd\x84\x9e\xcfj\x8c" +"\r\xcc\xa4\xc3\xc1\xe2\xe7\\?S\x1\x1e\xee\x94\x9f\x37\xf6\\\x82\xc9\xa1\xfd\x1<\xee" +"\xa5O%\xd5\xc7\x16\x35l\x9\xb7\xa3S\xbc\xdd\x97\xce@A\xe3\xe3\x8e\xf[\x87\xda\xe1" +"\xba#\xc4\x97O\xa0\x94\x92\x62\xa2\x1)\xae>K\xa0\xeb\xe1,\xc1\xffr\x6\xb0\x1a\xd3" +"\xb7\x1e\x10\x18\xca)I\x89\xff\x6\x2\xce\xa1_\xc3\xcb\xb1\xe6\x14\x18\xa7\xac\x16" +"\xcdg\x92T\x97YTHl'\xd0\xad[\x1b<\xc9]q=\x85n\x80Tw\xc6\xf*\x8d\xfb\xc7\n\xd0\x94" +" \xa9\xea\x92\xe8\xf9>\x88W\xf2\x9aUu8\xe5\xb7\xd2\n\xa6\xe7\"Z\xeb\x8d@\x12\xc8" +"_^!<\xe1\xd0\x43&\x7~\x90\xd0\xa7\xe4\x8cU\xe5\x46\xb7,H9\\\xd9&#{\xb8\xca\xe1\n" +"\x2x3\xf1\x66\x12g\xcai\xc2:\xc4\xfb\x10\xf2\x96\nH\xf4\xb6\x90O\xf7\xee\xb\xab|" +"q\xc6\xcf\x35\xa6Ol\xdd\xa9\xa4W\x9a\xc6\xb6\xf1\xddO\x81U\xb6\xf0\xbf#t+\x95G}\xe0" +"\xd9\xed\xa8\xbc\x96\xf2\x7f\x16\xcd\xbe\xa5\x62\x84 \xf\x14\xf3\x1d\xb1\xdc\\@\xfb" +"\x8a\xb7h*\xa3|j\x9b\x61\x91\x36?\x88\xb0<;\x9d\x96\xdc\x64\x12\x3\\:WuB\xfbZOZ\xf9" +"\xa4\xb3\n\xe5\x4\xc8\xeW\x87\x34\xc4>X\x17\x44\x7f\x91\x4/_v\xc4&\xb1\x2\x36\xeb" +"\x12Y\xd0\x7G\xeb\x8d]R\xbdh*\x0\x42H\x84\x61s'lO\xc0\x30\xba \xb4|\xb6\x38\xbfM" +"\xc\x80S\x9\x8e;\xeb\x9e\xd9\x6\xc7\xe5\xee\x33|\xf1\xc4l\x6\x91\xd1\x9\xcc\x97\x90" +"a=y\xac\xa4\xf4]\xc0\x1bL\xee\x12%M\xd6\xech\xa6\xc4\xda\x85\x16WcjGu\xcf\x92\xf8" +"\xbcQ\xe\xe6\xa0slJ\xf6\xe5\xf9\xf3\xe7q\xecKt[[x\xf7\x44\x0>\xd8\x8a\x33\xfc\xa0" +"\x9e\xcd\xca\xdd\x61K\xe6\x15\x99\xd6\x18\xf5yD\xec\x17\xb8\x9f#\x85\xbc\xf8\xe4" +"\xf!\xcc\x30\xfd=\x1c\xc4\x63%h\r\x15\xd2\xe3\xbb\xcc\xc4\xe5\x44\xf8\xb0\xa1|\xcb" +"\xc4\x1e\r\x81\xec\x4\x46\xb\x93\x84\x14\xbe#}\xb0\xa8T\xad(m\xee\xbe\x4\xc0z\x15" +"\xd9rd\x0IxU0j\xb8\x11\x89LEf\x15\x9fV\xff%\x19\xa1,-e\xfc\xa0~\xc8\xc1g\xd9\xd3" +">\x98.\xc1\x84\x18{T*\x18\xad=[c\xa4\xdfH\xb8\x1x\x9f\xc4\x9b\x86\x61I\xe\xfe\xcf" +"\xc1\xe3\x9f!\xbb\xc0\xc\xdb\xe8\xc3\x9a\xfa\xb1\xb0\xc8\x32Y\x94+F\nq\x14\xe1?\"" +"X\xd5\xcK\xdc\xc\xe8\xc5r\xe3\xe9\x87\x8b\xcc\x41\xbd\x46?\xba\xa7\xc7\x99}\xaf\x9" +"\xb\xf5O\xd4\xe7;\xa8\xe1\\(!\xa2\x63V\x8e\xcdo2\xc2\n\x8f\x18\x0\x8a\xba\xc0\x30" +"\xeb\xce,\x1a\x64\xe1\xcf\xad\x9c$+\x9f\xfMS\x86h\xca\x8c\xf8\xa1\x8e\xcc\xc8W\xe6" +"\xc9q?\xbbx3*\x8\x8e\x66\xea\x89:Jjl\xc3\xf5\xb9>\xee\x45\x30\xfb\xec]\xad\xd1\x46" +"\xa4G\n,D\x9a\x46\xaa\xe1g\xaf \x87\xda\xcd\xcd\x6\xfd\x81\xce\x33\xf7*C%I\xbdl\x9a" +"j\xc\xe6V\xe8\xf1\x37\x85\x7f\xa3/\x9b\x7fv\xbd\xda\xfe\xf9z[\nq\xdfr\xd4-|Y\x84" +"\xc7y~O\x5\x8e\xf6Z\xe7\xbe\xea-\"$\xdf\xd7/B]\x8b\xfd\x6\x8e\x44@\\d\x87.>\xef\x0" +"\x1a\xd8\xab\xb8\x87\xd3\xffR\xf\xddR\x0G\xeaW\x9a\xe4]3\xcch~\xd3\xc3\x3\xb1Oh_" +"}\x18\xe3\x35\x0t\xfc\x86\x8\xdf\xd8\x17\xde\xeb\xa3u\xf\xbaJ\xbf\xb\x8bQd\xea\x9" +"\xe9\xe8\xc9\xb1i\x8c\x8a\x61\x86\xe9\xd0\xfc \x8c\xb6\xa7\xfd\xe6\x90\xeb\xad\xe9" +"\x2\xac(\xbb,\xd8\x6\x13l\x10z\x92#&\xe9GZ>\xf4\xa6\xaa\x88\x7\xfa\xeeO$\xab^\x19" +"\x80\xf4Z\xe7uX\x95\xe3Q\xae,L\x7\x98\x9e\x65\xfb[i\xc9\xe5\xf9v\xc1<{A\xf4Zl\rY" +" \"\\2\xeb\xad\xf0\xd3w\xfc\x0\xa8[\xaf\xa4\x97\xc9\x11p\x1\x87\xc9u\x10\xeR(f/\x0" +"e/\xf8\xa3\x90H\\\xd2\x94\x36\xf\xc5\nv`t\xea\xf0,\x83M\xbe%\x8\x39\x63o\x16\x9b" +"\xf5\xaa\n\x1f\x10\xf9\x95 \xe2,TG\x8d\xa9W\xfb\x62]H\xf6\x87[\xf2\x87\xc1\x1b\x39" +"\x98 \xd3\xf4\x88\xac\x96\xb6\x7mH\xe0tye\x9a\xf2\xe7\x33h+V\xdc\x7\x45\xbdR\xf3" +"!X\xe5\x0%\"\x9d\xecg\xb1[\xe2\x42\xd4\xea\x9@N\xc5\xda\xc3Gsf$\x9c\x65%\xc3U\x8b" +"d7\x15\xfc\xa6(!\xc3\xa3\xc3\x16\xc2~\x93\x19JoO\x15+\xff\x9PUc}\x9ashLw\x9\xa9\xf3" +"}\xe5\x8f\xc0\x9\x1c\x8\xed\xd0[\x9a\x9e\x14\xbf\x42;\x82\xb0!P\xe#\xbd\xa4;A\x9c" +"b\xcf\xa5\xa1%Y\xb\x18\x15s\xd6\xdf\x81\xd5\xbd\x9b<\xaf\x94\xbd\x1a\x87<1\xd1&m" +"\x87+,\x1e\x89\x9bg\x9dv9\x15\x31\x96z\x90\x9a\xb5\x9f\xebGr\x86\xeby\x14\xb7\xbf" +"\xe7n:\xea\x9c\x1a\xd1h\xc0<\x0<\xe5\xd8\x8a\x61I\xb8\xf0\x61\x0\xf1\xd7\x8j\x8d" +"3\x97J4~\xd2s\x97?K\xb2\x13'\x88\x1c\x80\xd3\x32\x89P\x10\x96\x88\xd5\xf2\xc9\xd2" +"\x90\xe3\xf2+`\xd6\xa9\x9e\xc7&=\x95v\xce\xac]\xc7\x89\xa4\xa7\x83\xf9\x1b\x89\xce" +"\xfd#X\xa9\xef}\x0\x32V\xc6\x3z\xaf\xe7\xd7\x0\x8f\xe4\xfb\xdc\x1e\\}\xc7\xe5|\xfd" +"\x85\x1eZ\x13jo\x82\xee\xb2\xf5\x90\x1e\x18\xd7\x8\x9!A\xc2\x96\x81\xbd:-\neY\x8f" +"\xbd}\xab\x16kg~{9\xd8\xe1\xb5\x45\xc8\x81W\x8d\xa7K\xe5\x7f\x87+\xc3\x1e\x13\x87" +"8T\xc9\\\xc3\xb7t\xc6\x32;\x81\x96\x46\x8c\xc2\xc0\xf1\x42\xfKH\xd5\xc1\x18\x17?" +"\xe7\xaa#\x9b\x16\xf7\xad\x42\x46\x1f\x62'~K\xd9:\xa7Y\xe\x6\xe7h 3\xb4\x37\x65u" +"3\x8f\xd5\x65\x93\x31\x88\x34S\x2\x38\xb7\x3_\xce~Y'\x9d\xe3\x65\x8a\xed\r\x90h\xa2" +"\x9f\x92w\xa7\xd9\"\xe5\xe3\xad\xf5\xc,$\x14\x6\xb6\xcz[\x90\x46\xb7\xef\x87\x65" +"\x80\xcb\xdd\xb\xecx\xb1\\\xca\xf/\xde\xdcmf\xbb\x43\x85\xc7\x9\xbdu \x85\xf8\xd2" +"\xa1z \xf1\xef\xdb:\x8u\x88z\xbdV\x8c\x96\xc0\x34\x32\x93+\xdd\xd8\x1bW5\xddG\x1b" +"\xff\x14\xba\x88\xe9\x43\xeiX8\x3\xac\x95\xf6\x1c\x96\xa5\xfd(\xa9M\x7\xf2\xae\x65" +"H\xcf\x95\x86'\xafu\x1c]&t\x7\xee\xbd&]\xffTe\xf1\x9d\x83H\xfb\xf8M\xbe\xb1kh\x9a" +"\x88\x41\x65I\x14\xa1\xd1\x31\x61\xe9*~M\x9d,b4\xb2S\xa3m\x82\x87\x33\xfa\x1d\xe2" +"\x90\xb9\xff\xf5\xe3\x11+.l\xaf\x81\x98\xee\xea\xf0\xccQ\xf6\x30<\n`\xb7I\xf9\x66" +"Tc\xc1MA*\xd5\xa2k\x81H^)q\xe8\xfe\xfd\x82\xd0+\xe1l\xb1\xad*\x96\xa0\x16\xc2j\xf3" +"\xe0\x1e\xc5M\n\xdb\xc6\x1c\xbb\x7\xb3\xdb\x5p\xd8\xcaH$\xe1\x6\xa7Sb\xeb\xac\x1d" +"M\xc3nK\x92\xb5\x83\x61\xf9\r\xc8\xdb\xd7#\x1a=~\xe3\xab\x1th\x8d\x85\xa1\xc2\x1a" +"\xe7\xbb\x96\xe2\x16m\xfe\xb6\x64\x82\xe3\x96\xf2\xbf\xc\x9eK\xe1\xde\xec\x38\xc2" +"\xa5\x9b_f\x86\x9d\x95\x3\x11\xf\x61\xda\xca@\x19(z'nKl\xc\xfb*\xcb\x16\x8f\xf6\xe5" +"S\xe6\x9b\x0\x66\xcb\xa0.]\x8b\xcb\x1d\xa7\x64\xdb\x62=\x1e\n'\xcal\xe\xfd\xcet'" +"5\xf5^\xbcN\x1f\n\xe8L\x81\x36\xd3S\xb7\xd0\xd0\xa2\x62(\xe3%t\x85~$\xf2\x15^;C\xcc" +"\x81\xf0\xa9\x86\xd7n\x97\xa5\xef\xd1\xc0xj\x93\x8b\x64\xc2\xd8\xcbm\xe1\x64\x38" +"9+K\x88VY\xcd\x11\r\xe2\x17)z\xfR\xd5_\xa2\x8f\xd8S\x94\x9e\x90\x1e\xd8\xad\r\xdc" +"Wh\xda\xcf\xac\xe8\x8f,@\xe6m\xa9\xad\x64Q\rK\xd0z\xd8SM\x96\xde\x36\xfdo\x1d\xc0" +"\xcajJhak\xf6\xbe\xe7\xb9\x85\x87z\x19\x9b\x8d\xcf\xfc\x13\x1a\xfb\x18\x8b\x8e\xc1" +" ,\x5\xc1\x9a\xeej\xb4\xa8\xa0wQ3c+\xb3ru7\xe3V\x85\x8f\xd9\x88\x9a_\x4H\xf7\x45" +"\x16\xb3\xcb\xfc\x95U\x93ws\x97\xb1,;LN[}#gv\"P\xd0\xf9\x8eY,\x85[\xe\x10\x92\xf2" +"\xf7\xdb\x95/\x9n\x99\xf8\x2\x3|B%xd\xbnE\xbd\x11\x33\xa3\xf8\xcf\xfc\xc9\xab\xba" +"G\x9e\xcbX?8\xc\xa1\x1f\xca\xf2\xf8y\x97\xae\xbb\xe7@\xb2\xbf\x35\xc0vT\xc8\x19!" +"\x96\x66K\xb0\xd4\xa3j\xc5O\xf0\x84\xe0\x1b\xaf\xba\xbf\xc5$^\xd1\x95\xd1\xc3\xe6" +"\xd6mC?\xf4#k\xd9\xfd\xab\xcc,\xfc\x9f\x1a)\xf7\xb7\xc3\xf5\xeav\xc9\xf6\xa0\x18" +"f\xc8\x15\x7]\xc7\x6hAN*\xa1\"\xc9\x31U\xc7~\x8a\xc9\x95:5x<\x8fs4\x1e\xe0\x1e\x6" +"\x18S)\xee\x44k@\x5s$=9V\x96;!\xdb\xc6\x90J\xeeK\x1\xa9\xf1r\xd8gxB`Z\xac\xee@\xe2" +"]8{\x1b\x3Y/\xba\x12\xfa\xde\xb0*q\xe5\x14\xe9\x99\xc1\x43\x90\xb8^\\B\x19\x88w\xac" +"Au\xb\x81J\x86\x9a\xd9\x95\x90\x66\xa6\xb8\xd6P\xbb\xf0\xd8\x89\x9\xban\xc2\xc0\x46" +"I\x90\xb\xa1Z\xd3\xa0:\xe0t8\xfd\xc4\x44\xe9V\x6\x14\x41!\x19\x4\xe4\xc5\x33\xfc" +"F\x97\x9d\xe7\x95\xfckc\x91\x46=*>\x91\xca\x5\xf0\xe7\xc9\xcf;\xee\xb3\x1c<\xd7\xf5" +"\x13\x1b$\x88\xe\xff\x16p\xfeig\xf9\x80\xf5u\x18H\x8at\x81\xc5M\xc4\xe0\x64\xb8x" +"\xd1.M\xa9\xe1\x9d\xff\x1b\xe2;a@\xa7v#\x85\xec\x61YpQ\xdbT\xa6\x8e\x3}\xf5\xb9\x42" +"&QB\xa0\xb3\x31\x38\x88\x35p\xe9\xd2\x86\xe4%\x0\x31\xf2\xf4\x91\xae\x10\x8b\xed" +"\x9e=~\xec\x9f\xa7\xb3\xba\x9f\xa1@\xf\x81\x18\x9\xc\x96-\x87(*\x84\xf5\xc7kX\x18" +"\xc9\xf2\xb9X%eE\xa2\xb0#\xde\xe1\x19\xbf\x95u\xa1\x39\x19\x83Q\x9d\r\xa2\x39*)O" +"y=\xeqM\x86\xb3\xbb\xb5Z\xc8iw\xdd\x66\xd5\r\x8\xf3\xee`\xec\xdd>A\xfa\x9\x96\xc1" +"0\xfe\xb4\xdc^y\x16\x39\xea\xc\xf1p\xa3\x84\xc9\x94+\xaf\x16\xf1-\xf5\x8\xb3\xa5" +"H\x4\xfa\xb8\x38\xd0\x42\xa2\x39Q\xc2i\xc1\xd8\xbc\xe9\x39\xdb\xd9\x1d\xe2\x8\x43" +"\xf9~\xe0O\x90M\x9a\x62\xce\x1PvG\x9di\x2\xe3\x10\xa6!\x4v\x95\x84\x1d\x8\xb7\x9b" +"\x9bXg9\xb0\x92u\x11\xabsBb\xe8\x92\x17\xaf\xa5\xf0\xc5\xf7\xd3\x1c\xfa\x31%\xbd" +"\x92\x1az\x94\x98<\xc\x94,\xd1/\xd9y\x4\x64+\xd4 \x10\xf5\x8d$S \x5\xd2q-\x8f\x45" +"x\xd0\x97\x46\x1e\xc4\xdbXU\xe\x89\xff\x62vS\"SZ)\xc\x66n\xe6\xf\xc5&\x1\x1f\xe9" +",\x1c\xbe\xd8\xa2\xc6\x8aMR>\xda\xac\x1f(\xbc\x96\xb2\xca\x31)\xa4\x95\xd2\xbbW\x1e" +"4\\\xb3k, CTj\xd5w\xd7.\xca\x81\xfcX\xe0\x80%\x8cM\xc5\xfa\x9f\xa0w\xc9\xdf.\x85" +"\x8e\xaeR\xe3\x12T\x8b@C\xa6|\xf9\xb6\x13\x41X\x6\xcc\xcb\xbdJ\xb4\x34\xa8\xe3]\xb0" +"`\x18\xfa\xd3\x64\xfa\xde\xd7t\xf2\x12\xc0\xe9\xa6\x8aP\xe8\xe7L\xb6\xb6\x83g\xfe" +".\x9c\xce\xb7\x82|_o\xfd\xa8\xab{\xd8k&\x15\xef\x35\x1a@\xbb\x45T\xce\x13\xb5]\xd9" +"\x88\xb5\xe9\xe7G\xfe\xb4T\x8e'\xa7\x63\xd4\x66K?\xe0\xf8l2\xb\x65\x1a\x64]l\x11" +"^\xf\x9\x45\x34\xb0\xe9\xe7|\x1\xb0+\x84\xfeK\xfa\x10\x9f\x1\xcfV\xcb\xc5\xd7\x37" +"\x87`\x87\xe4\xd7\x4\xa6Uk\xae\xe2\x30\xf3S<6W,\xe2`\xf9\x2-6\xc2\x46\xaan\xf0\xcc" +"IT\xad\x90iyw\x17J\xa8!}(4\xfJ\x1bj\xf5\xd5?\xf4\x19\xa3\xf5\x8a#\xb7\x5\x61\x30" +"\xc2\xd7\xa8\x91\xd0\nmw\x8f\xe4o,m\x8bm\xb8\xa7\x32\xbd\x46,\xbap\xc1\x39\xc3\xcf" +"Ge\xf2\xd7\xc5\xa4\xc2\xcd\xa1\x33j\x10\x30\xddx*V=\xc1\x88^\xe5\xcb\x84\x39\x10" +"\xa4\xe7\x1d\x8e\x11\x1c\xcb+\xfb\x15\x4\xa9\xf\xea\xea-\xa2\x1f\x39\xce\xd3\xa6" +"\xb\xc6\xfc\xa6\xb0\x97\xe8@\xfe\x0rb0@\xd2\x37q1@\xf1;)P\xdbI\x1b\xe4w[`\x9f\x9e" +"\xe5\xb0\xc\xdc\x1aw\x8\x1e\x32\xe8\x89\xae\xe*\xdf\x2\x34\xb3\xe4!\xf2\xa8\xa4x" +"\xd4\xe5\"\x1fr\xccMh8B\x7\xe5\x1b\x37\x86\xcbW\xb2V\xda>\xf9\xb6\x83\x64\xfc\x10" +"\xce\xd9\xdai\xa0\xfbv\xaa\xcf\x7f\xa4\xcb\xfc\x96\xa8I\xb5\xf6\x10&\xc5m\xdd\xd1" +"\xc4\x33\xe7\xbc!P\xb8\x95yDM\xc3\xa4\x7\\\x86\xa1%\xf1\xb7\\z!\xe1\x8e\xccs1>\xeb" +"N9\x11^S\xa1\xe0y\xbf\x14\xdc\xc4\x12O|\xc3\xdfH\xe6#\xa9\x9f\x84\xddV\xad\xf3\xb8" +"\xc1r\xae(\xec\xde\xc0\x15\x84\xdd\xe1jVN\x98p\x97\xf4G\xa8\x90\xa1\xa3\xb7&\xa5" +"\x91\x86\xdc\xa8\x90\xeb#\x9$\xba\x36\x95\xb7\xbo\xdf\x45\xbd\xc3\xd7\xbf\xea\xb2" +"\xe2\x87\xc6\x8a`\x84\x0\x11i\xce \x8p\xb3l\x9b\xd5\xdf\xe3\x1a\xd5\x7f\x65<\xb7" +"Q\xb@\x19\xe3\x38\n\xcc/\xe5\xa4\x9\xf0W\x0\xf\x14[\xa7j\x87\xcb\xb5\x9c\x45\x30" +"9\xce*os\xec\xc6\xc4t9l\xc4Q6.\xbb\x9dg\xc\xeb\\\xdf\xca\xef\x2<\x1a\xe5\n\xefY\xce" +"\x99v|+\x3\xca\xf\x5\xb8\x9fg\xa8GZ\x83\x6S\xfd\x8c]\xbb\xb2\xad\xdc\xe7{\xdc\x93" +"\x17\xd2\x16\xab\x17\xd5&k\n\xed\xac\xa3\xd1\xc3T\x1a\xaf\x18%\x80k\x8e\xe0\xc1\xe3" +"\x8b\xb9\xcc\xc\xf5K\x1e\xe\xbc\xa3\x16\x87j\xb8|P\xc1\x18\xcb)\x8e\x9e;\x87SCJ\x8" +"\x82\xc4\xc2k\xc2\x8e\xc0\xb6.A \x16\xd4T\x94\x61\xac\x98\x34\x8b{Z\xc2\x1e\xe5I" +"H}\xc_\xbfg\xe7\xdf~l\xde\xc4\x95\xe3LV\xf1\x8fK\x87\xdf+\x97\xab\xe\xb8\xa6\x43" +"\x2\xbd\xef\x9b:b\xf2+\xfd\x17!\xa3\x88\xf6\x5\x37\xd6\x83\x13P``\xef\x1dJ\xe5\x92" +"\xe7\x84\x83\xd4\x2\xe\xfb\xf3\xbbM\xb2\x2\xbc\xfdN\x2\x9d\x84\x86\xaf\xdb\x18W\xb6" +"\x89\xc4\x65\x61i\xd1\x66W\xadj!=I\xd7\x9c\x93\x39\x32\x9a\xe8\xe4;\xbb` \xf9;\xfd" +"k\x94\xb1\xa5LD\x17HoY\x8*\xa3ht$\x96\x10/:(\xad\xd9\xe7\x8eT\xd2\x66z\xde\xe3\xec" +"\x11\xa2\x4\x85\xeb\xbeO\xf5T\x7f\xca\xcc\x12\xf6\xc5\xc3\xe5\xe0\xf\xbdm\x4\x61" +"\x9b\x81W\x8c\xe\xa3\x33\x85\xfdU\xff\xd1{CW\x82\xcc\x90\xe9\x46\xdf\x81\x1a\xba" +"A\xe9\xc*t\xea\xc2V\xa0\x90\x1d\xafN6\xa4\x1bi\xe8\xbaq&x\xa8_\x8f\x8\xb\x8d%\xc0" +"\x0\x1e\xe9\xb4\xe6\xf3z\x9c\n\x81\x44\xae\xb\xff\x97\xbf)3\x95\x1f\x88;4\xd3\x3" +"<^\xeb:^\x8\xeckw\xb8\x82\xfa__\x1ex\x8b,w\xa5\xf8\xb4\x9f\xc9\x83U\xd9(M\x16\xa7" +"hh\xae\x89\x12\x84-\x99\xca\xff\xb4(\xfb\xae!\xfc\xc1\x19\xaf\xf7\x9cm\xf\xb6\x91" +"gms\nOW#>\x1d\xee\x94\xe9*\xd5\x1\xae\xd9\xd9\xd3\xa6\x92!vC\xc4=9\xb3\xee\xc1\xc8" +"\xa6\xfd\xe1\x9\x95\xc3\x66\xaf\xd3*Z\xe3\x18^ X\xd0\xfc\x8f\x16\x64\x64\xe2\xfa" +"t~\xe9\xa8\x91\xe6\xd8\xbe\x33I~\xe2\x2\xdc\x38\xe5\xee\x19R\xdeq\xfd\x98\x65r\x9f" +"\x1c\xd1\xad\xa9\xf7\xae\x38\xc8\xfb\x17\xdakfx^\x91\xf9l\xb6?\x9f$@\x7\x85X\x14" +"R\x91\x36\xba\x9e\xd1\x1a\xb2 \x16\xdd\x95\xc7\xa2\xbb\xce\x9dh\xa1\xbb\xe2L\x8d" +"\xa0\x9\xa0;\xaeG\xb0;\xda@H\xb3\x1bT\xa4\x18\x81\xf6\xe8OrLG\x9bp\xe4\x8f\xdegt" +"\xbd\xbd\x1\xc8\xf8\xc2>'\x19\x85\xde\xbe\xe1\x39\xc7z9MJ\xb1\xe4\xfc\xbb\xb9\xe0" +"\xde_~\x7\xc8\x9f\x87\xd2\x8e\xb5\x8d@\xd4)H\x96\x8f\xf9\xb6\xbe\x9a\xcfY\xcc\xf4" +"e\xd5\x93\x8d!\xedm\xa0/E\x88\xf5=\xe2\xa6\xa9]v\x8\x9b\x8cm\x8cLK\x8f\x8c\xd5\x84" +"i\xa3\xb9\\~.1\xcaW\x82x\xf3\xc4\n\xc9\xf3\x65\x82\xdd\\\x44\xfa\x39\x93\xd3\xce" +"\xef\xe9\xaf_\xa7zi\x85\xf8\xa6\x7f\x93\x43\x98r>\xc6\xa3\xd9\xf8N\"Y\x93\xcf\x43" +"\xb0 s\xc5\x1a.\x1bn\xeay,\x16+\xe3s\x91\xc5\xdf\x63\x84{\x91>&@\xc2-b\x99\x15\x9b" +"\xf1\xec\x11\xe7\x86K\x12\x96\xdf\x8e\xea\xaa\xe8\x92\xcc#\x94\xc8Yng'\x8f\xce\xaf" +"\xd4\x41\xe3'75\xc7\xe3oZ\x95\x88\x30~\x87\x6\xa2>3\xc5S\xb3\x84||\x1c\x96\xb6\x1b" +"MC?ff?/H\xa0\x9c[\x8c\xc6L$L!\x8f\xf7\xa1\xb1{\xd9+\xd7\xe3\xe5\xab\x66Kx\xa2m\xe8" +"eD\xba\n}@\xd0\x81\xc7\"\xcb\x12p\xf3\xa1\x7\xf5\xd0{\x0\x9c\x14\x33\xa3\x9e\x61" +"\xe6\x89,\xd7\xbe\"\x82\x0V\xc\x38\xfcU\x8f~\x84\xbe\xb1\xf4\x0\xffK\xbc+\x82\xd2" +"/\xc4h{J-\xfa\x41\xad\x99\x84\xe5G\xea\x85\xe9\xb1\xba^@\x14\xfc\x91\x8b\x1\xc0Q" +"\xa4\x4\xfdV\xf3\xcc\xe2\x61\x1b\xe6W\xc\x32\xc\xde\xb9\x94T\xa3\x46\x39\xc7\xcs" +"\xbd\xd2{\x8e\xf3\"\xf0R\xf3\xe5#\x5\x43\x14\xc1\xcd\x13wq\x18u$rW\x16+\x8d\xeb\x44" +"\xfd\x99\x6V!\x14\x1\x1e\x93\xca\x1d\x98\x8eR\xbam\xd4w\xa4\x10\xcO\xab\x8a\xac\x1d" +"\xc8\x31\xba{\xf7\x8b\x34V\x8e\xf9\xae\x46\x16\x61T\x93\x39\xb5\x95\x92\x95r\x91" +"I\x91V4\x95\x37-JQe\xec\x81\xea\xe7\x9f\x8d\x19x\xafs\x8c\xf1\x1a\xa5+\xa4\xc3w$" +"D/\x12]\x19gz\x9c\x0\xe6\x1b!\x85\xea\x39\xc\xd1\xac\x31\x31\xeb\x8b\xa3\x8b\xaa" +"\xfe\x97\x63\xd7R\xad\xab/\x88\x8d=\xc4\xf5\xe3\xf9\xe8\x37h\xb6$$oB\x85$b\xabp\xf3" +"\x5R\x93\xd9\xec|\x92\x98k\xb\x33\x83u\xfcRj\xa8\xab?\n\xe6\x1\xbcy\xbb\x9f\xb6\x4" +"k\xa5\xf4W\x10\xce\x94\xf8\x12\xdfL\xac$^\xba\x8d\x1e\xec\x85\xca\x14\x30\xd1[\x96" +"w\x8e\x83#[\xae\xb0+\xed\x36\xc3\x42!\xa8\n\x61\x91\x65\x8c\x46W\x8f\x2\x61\x46\xe5" +"\xa7\x61-S'#\xff\x2\xc3\xff\x62\x2\x63\xa2\x31\x9G\xcax\xdb\xb4,H\x98\x95\n\x46<" +"\xe0\x7f\xb1!\xee\xce\xde\xf3\xf1\xa5\x41\xe3\x31]U+\xf2\x39t\xff\x14\xa2\xe3I\xe4" +"\\\xea\xb0\xf3\xff\xfaq\xe4\xbd,\xb5\xcf\x9f\xa0\xf1\xbb>g\xe8\x62\xf6\xdf\x9c\xec" +"z*\x89\x8cl4\xeu\x9fP$ \x9b\x32\x62\x90\x8\xfd\x4\xe0\x2\xc1k\xab\xa3PHH\x19#\x17" +"\x13\x9dl\xea\xb9\xbbMJ\xdd\x9e\xbe{\x8a#`\xb2\x1\x33V\xa3\x18\x92u\xa6\xb9\xf6\xc4" +"[\xdf\x1e\xcdX\x99\x8$PNC\xa2\xd1\xe3\xb2\x63\xc2\xf5\x1d$\xf0\xf5I,i\x0k\x6\x2\xd1" +"\x12g\x7\xbd\x6\xd0\x17\x90~\xb2v\x10\\\xe6\x37\x8a.\xd9\x13\xd7\xe1\xed\xa9\xc9" +"\xa7\xb5\x13\x5.\x8\xd0\xdd\xdc\x37\x65\x39\x65\x36\xaa@;\xb4\xac\x8b\x8f\xc2Q\x15" +"\xc2\xb5\x9b}\xfe\xe2\xaf\xa4\x10\xad\xa4\xbb\x16j>n\xe0\x63\xa8\x8e\x8f\x85?\x9d" +"\xda\xc0\xc6\x63\xc\xfd\x38\xb\xe8\xda\x45\xa7p\xb3\xfb\x15\xeb\x65\x8b\xdcO\xec" +"\xf2\xc\xf3\x82X\xbf\xc_\xc2\xbb\x7w\xcf\xb9\xc9\xa5O,6/!\x17\x1elF\xcH\xec\x7f\xb5" +"<,\xba\x8fI\x15\xb5\x13;U\xd1O\xe3\xb7\xf\x95\x13\x8f\x1>z\x14\xca\x92\x90\x8e#\xb0" +"\xd6\xdbW\xfb\xed>\x97\x38\x8\x9c\x7\x1d\x99\x9e\x90\xcf\xdd\xb3\xf4\xeeM\xe5\xf0" +".S\xfd*\xe4\xa1\x31\xf5\xca\x91\xad\x88\xa4\x95q\xb3\xc3\x84\x6\xd0]\xeb\x2\x38\x8" +"\x4\x44\x91\x83\r\x8d[\x80\xc3?\x1fn\x8aL\xa4 w\xf7\xc1\xb2(Y\x8a\xbc\xe8#\xe3j\xe6" +",\x9c\xe7\x38\xe5\xb2&[\x99/hd-\xb9\xe9\xe7\xa0\x81vQd\xc'\xe5S\xc7\x1aL2\x85\xe0" +"\xd7\x80\xfa\x3Q\xdc\xbfh\xb7\x34NA\xcc\x13<'\x98\xaf=\xb2\x65\x9f{\xb7\xbb@\x9e" +"\xaf\xd7'\xd7\x92w\xf4\xd2\xd1.\x8f\xfc#a#\x81u`\x9a\xa1\xa5%\x14\x7\xeb\xba\xb6" +"\xf0\xa0\xf0\r\xa2\xfc\x85\x9\xcd\x8dy\x18\xf\xa0\x8b\x61I\xadJ~;\xd2\xca\x30\xbb" +"\xb1\xb5?5x\xfe\x6\xee\x99\xf6N\x2Vb\xd2\xf0V\xdc+\xc4\xf2\xe4\xd5\xcaP*\xc9?z\xbc" +"+0`3\x4\x95\xf4\x84\xd4\x8e\xf7\x43\n{\xe2\x1\x9\xfd\x8\xa3&\x90n\xce\xf3\nL\xa4" +"\xde\xa9\xe3\xb9\xb4\xf\x8e\xf4\x90\xb9U\xcf\x85\x38\xa8\n\x8d\xaf\xab\xaa-\xc7\xc3" +"\x87X\xef\x1e\xadp\x9do\xe7\xc4\x8c\x80\xf \xbf\\\xa5\xae\xe5GV2Z\x89/\xf5\xf2\xac" +"W\xd1\x98I\x92z\xa0\xb7\xa8\x1f\xd3\xa4\xd0Jz$\xba{A \x8dp\x98j\x6]\xd7}\x89>6\xc5" +"!\x8qB3;4\xf7\x41\xfe\xe8\xb2\xdd\xba\x8d\xbb%\x9b\x62G\x1\x14\xb2\x6\x95\xc1\xcc" +"\xfdy\xbd\xc9R\xd9@HQd\x8c\x94w\xda\x9f\xb3\x44_\x92\x32\x9a\x92)~\xe2\xb4\x30\x5" +"M)\xa1\xc4+l(\x93\x83\x8c\x9a\x95J\xab\x65\x8a\xe0H\xbc\xdc[S\x13\xbe\x91Z\xd5\x9f" +"\xea\xb3\xeao\xf7\xb6\xd9\xd8\x37\xfc\xbc:=\xf7[{\xb6\x18\xb4W\xd7\x10\xc2\xb8_\xa8" +"\xf3>\xe3\xca\x1d\x5\x1fm\xf3~ <\xecV\xb6\x37\xc5\x9e\x8\xc0\xcc\xdc_\xc8\x7\x12" +"\x1d#\x8a]\xc7\xda\xabS\x87\xe5\x95~\xa6@\xaf\xfd\xe5\xc4.@aS~(6\xd4\xd8\x18j\xa1" +"7\xbf\x16o\xa3 \xa2\xbb\x8f\x6\xeaG^\n.I\x5\x43M\xcc*2\x91\xbd\x90\xa3\xfc\xbd\xe8" +"\xac\xd2\x46J\x1fn\xa0\xef\x95\xe\x17\x12\xd5\x9fu\xe6\xeP\xd6*\xda\xfa\x8o\xbf\xc3" +"\xad\x0\xff\x8d\xce|\x7\x43\xa3+\x7\xe9\x38\xd3\xb2\xce\xc0`uV\x86\x4\xae\x12Tfw" +"\x15\x6\x45\xb2\xda\x80\x10\xdd\x9f\xc9\xd2?\xca\x92KL\xe5\xa0\x33`\xe1\x34\xc9\xa7" +"\x9c\xab\x85K\xeb\xe8<\xb4:`\x5\x91\xf4\x80\x11\x4\xa1$\x9f\x31u\xe6Yd\xf8\x37\x17" +"\xd8\x62 0\x9eWQ\x82\xa1\xbc\x33\x97\x87\x91\x9c\x46va[\xd5T\xe9\xe5\xaf\xd7\x1\xd2" +"y\xdc\x92x\x8a\x0\x8eI\xf6\x8c\xf5\x6\xbb\x95\xb6\xa8I\x96&1\xf4\xde\xe2Na\r\r\xb8" +"P\x97\xbe\xb7`\xd8\xa4\x8py\xbb\xb5<\xecUs\x83/H!r\r1R\xa9h\xb7\xc9}\x86\x10\x98" +"\xc0$\xbdv\xca\x13&\xdc\x63N\xdd\nN\x7f\xe2\xac \xc0%\xf9O\xa9 \xb4\xb7ww\xe4vfY" +"\xdc\x35\xf0\x8fw\xa2\xce\x4\xff`~VN`\x8e%\xc8g-HE\x1b\xd4\xbc\xaa\xd2\xe2\xb0@\xcc" +"\xbb\x7f\xa3\x32\x46X\x11\x43\x9_p\x10\xa6\x66'G\xd4\xb0U\xdb\xe7\x9fj\xed(\xde\xe8" +"\xb7\xc0\xa2my\x7\x8fLr*\x2\x10\x9fO\xe9?\xcd\x63\x9c\xb3\x6\x1_\xe1z\\ oc\xf3\x3" +"p\xadIV\xbb\xe7[qK\x16\xcaV\x9f;n\xb9\x92\xd8Zg\xd5}b\xd5\x9(\xe1\x84\xc3m\xe2\x31" +"<=\x2\xd6\xa9\x8f\x16\xef\x36\x17\xc\x19\xd0\x7\x10\x38\xd6\xc9\xd1\x92\xb4\xdc\x1e" +"\xf0\xcc\xea\xde\x31\x13H\xferjP-\xff-S-\x1b\xdc\x36\xc4\x90\xd8\x17\x37\x97`\xf9" +"\xec\xbex~zh0\xe3 =n\x92\xea\x8e&\x8bJ\x82\xcby\x12\x80\x30&\xa6O\xda\xe2\xa0\xa2" +"\xb4\\\xf7\xc3T\x93\x11\xb3T\xce\xdeGs\xa8z@oW\xa4n\x11\x41\x36h[c\x17\xc9\xf3\xc1" +"&\xbe\xa7\x38\xd4s\xbb\x33mp\xed\x30\xde\x16]\xc4\x1a\x99\xab\x9c\xfc\xe1\xb\x62" +"\xa9},\x13)F\xffM\xf8\xf4[vP\xe7\x11\xcd\xbe\x9aJ\xc3\x46\xd6\xbblD\xa5\xe8!Kv\xc8" +"\xbf\xa9\x97]k\x8t\x88\"\xa5\x86\xa8|\xb0\xa8\xb4\x37\x9dw\x85\x87\x94\xc9)\x1\xf9" +"\xdc\x14\x61\xd7\xf0\"\xb4\x64\x1b\xa8\xd5\x46\xc0OQ3\xf3Z\xbe\xd3\xf1l\xd5\x37@" +"'B\x3P\x3\x38\x8b\xe9\x1e\xf5\xc8\xd7=\xcf\xd7\x1b\x42O\xb2\xc7\xc1\x9e&\xf5\x45" +"\x11\xb3\x8a\x13\nt\x89\xe1\x9et7*\x1d\xb5\x3|\xa1\\=\xc3l\xfa\x66\x1b\xcc\xb4?\xd8" +"\xd9V\x9d\xbf\xb9mA\xd3\xb7\xffW\xb9n|\xbc\xe6\x10\xb1\xb7\xb1\x19\x82;\x3\x2\x35" +"/.\x16\xa2\xde\xc8J\xaf\xbd\x92\x0#\x8ex\xe7\x19\xae\xb8\x9\xbb\xe5\xf0`\xf2n2\xd4" +"y\x9eH\xf2\x65@[Gc=\xbdTr6\x4\xa6S\xbf\xe5h\x17\xc8\xfa\xbd\xb8\x34G\xc6\xc\x96\xc3" +"\x8c\x91\xb4\xc0\x82t\xc\xb6\xac\x66(\xf2\x84wRa\x80\x31\xce\xd1\x9e\x30\x62Z\xd9" +"\x1e\x88#\\\x9c\x8\x83%\xbe\xa7\x66\xa2\xac\xdf\xd7\xc5\x13\xac\x97'=WT\x4\xb2h<" +"\xe0\xa6:\xe3\x6\x85m\x82\x80\x9a@`\xb0\x62\x93\x18\x1n\xb2\xd2\xcc\x9f\x83^)\x9d" +"c\xc6g\xd2:\xb0{T\xfc\xc9\x44\xe0\xd8x>\xd5\xc7\x35\x36G\xba+8Y\x13^\xa2\x84\x45" +"\xb5wS\x90Z\xb5\xb1NP}\x90N\xd1\x1a\xc\xef\xa5\xaf\xc9\xe5\x12\xf3\xed]\xb\x44\xe5" +"\xe3\xf4\x90\x87Sa8\x8fz\xf1\xa7\xf8\xddD\xf0!'\x80\x64|\x96\xb3" +"\x88\x85\x9a\xd8\xb5\x97\xdd{\xc\x33 \x12\x82*j<\xbc\xea\xeb\xf1\x1d\x37@\xac\xbd" +"\x1\x87\x9\xf4\x8f\xc1t\xc5\xb0,;\\\x14\xfa\xec=\xa3\xe0\xce\x8f\xc0\xfc\xee\xb5" +"\xc7\x35\xf4\xc5\xa3\xe2\x9\x6\x7f\x9r\xa0'\x1\xb8\"\x85\x10\x1d\xec\xdf\x16\xf7" +"\r\xf0\xac\x98\xbf\xd7r\xc8\xb6\x13\x65@\xc8`\xe\xa4\xee%\x80T\x8d\x98#\xb7}\xfd" +"B\xc0}m\xe9\x8b\xc6\x99Tz\xe4\xec\xc6\xe3\x43+\xbb\x8dyq]6[PI\xc5O:\xc9%x?\xca@\x92" +">\xba\xdf\xc8\xb8\xb2\xfb\xdf\xd1:\xd4[\x5\x61\xc8M\x8f\xa1\xfd\x5\x88\xae\x15K\x80" +"\xb6T\x84\x44j4\xe6\xde 0_\xa4\xee\x97!\xa4\x10'\xb3\xd6\xc5;\xfbg\xb\xa9\x13Y\xbd" +"\xef\x4N\xd4\xc8\x1bu\x8dM\xef\x9c\x44\xb2\x1b\x9>\x87\x9c\xb5\xa3\x84\x61\xb3L\x8c" +"\x9bGmp\xf8\xde\x2\xe6\xde\xef]\x1f" +"\xec\xb0|\xfc\x1]^\x3$\xd7\x1bn\xd7=&\xf7u\xfd\x9c\x98_p\"\xa6\xa6\xbc\xb2\x8a\x1b" +"H\xd3\xf1\xa5\x95\xefo\xce}\xa6%\xf1=\x9cP\xc5\xb6\xe1\x1b\x61\xe7/\xa4\xcd;J\xf1" +"\x15\xfe\x10|\x8b!W j\xc2\xdd[\x8f\x46\xac\x90*\xd0\xa2\x16\xbf{(\x9bi\xf8n2\xb9" +"\xb1\xe3\x63\xea\x35[v\x81RR3m\xab\x44\x31\xbc\xe7G\xc6\x66\xdb\xf8R\xb6\x46\xcf" +"\x1:#\xa7\xef\xd7k(\xd7`\x87\x32\r\xae\xb5:\xf0\xd8\xae\xf8Y\xc8l\x9dO\xe2i\xac\x8" +"\x95\n\x46_0\xef\xf0\x7\x31\x9e\x61\xd7mQ\x83'\xf9P\xcc?\x2h\xf2L\xb5[v\x8e\xa0]" +"\xa4\xcbs\xdci\xe3\xd9\xbf!\x9b>Y\xbe\x45IZ\x10\xa4\x31Q\x98\xa7\x46\x84?\x2\xdf" +"\x13\x6\xe9\x63\x13H\xd4p\xd7\x34\x34'\x81Z\"+\xe8\x11\xb4\xb8PzL\xa1\x37\xb7\x13" +"S@\x1c\xa0g\"\xa6\x95\xda\xe0\x46\xcd&%\x8d\xbbm4\xc9\x18\xa6\x1I\xa7\x33" +"\x81\x61V\x14\xa8/\xeb\x1a\x0@\rU\xb8\x6\xfc\xbb\x1a\xa8\x30\x37\xf1\xd9=TI\x5\xd7" +"\x99aO(\xf9\xd9\xc2w^\n\x1c\x46\xd2\x46\xec<\xe\\p\xef\x98$\x1bH\x80\x82\xa5Sf\xc2" +"\x2\x81\xcaoZ\xd5\xbb\x88\xde\xcd\xed\xa4\x92mN\x17\x9w\xdf\x91Q\x1a\x8f\x61\xcb" +":\x9e\x63\xdf\xfd\xa5\x39z\xado\xd3\xb5\x91\xcG\x13JL3|\x4\xd4t\x13\x41/\xfe\x82" +"\xca\x84\xed\xc8S\x1b\xa1\x1f\xeao\xf7\xb6\xd0\x0\xb4\x98\xc1\\\xe5U\xa5\x11\xc3" +"\x8c^\x84OSs\xc3\xce\xbo\x88#tRr\xbd\x46\x30QsU\xf6)\xfd\x42Gi\xb2\x88\x41\xf2\x99" +"\xfa\x65\x1b\x39\xe4x\n\xc5\xc\x9e\xee\xf6\xab\x14!\x0~\xa1\xf7\xc5{\x8e\xfe\xa7" +"\xa9\xae\xd8Yx\xd3uJx6$\xf2\xa9'\xc1\x0\x8e\xd3!\xd6s\xbe\x1d\x5\"\xa0=\xe2\xaf\x3" +"~23\x90\x14\x32WT\xfa\xaa\xb\x61\xb5\x14q\xde'\x81\xcb\x3\x1`\x85\xa2MZ!\xb6\x32" +"7\">l\x9aJ_u.\x9a|\xe9\" \xff\xa3\xeal\x9aZ7\x7fk \xf4]\x13(\xe0oTiE\xdc\x1f\xc4" +"\xf3\xc8ZbU\xe2\x16\xe1\x93\xd7\x39!\x90\xc0\xcew_\x86\x8\x4\x13\x13\xab\xf\xe0\x5" +"\xecJ\xd0x%C<\x84_\xbbja}b\xcd;%_r\x82\xb2hp\xc1\xa5I\xbd\xb2\xe5\xcf-\x13\x9a\xbb" +"\xcb\xf0\xea\xa0\r\x62\x1b=\xb0\xd7\xbfYU\xf9K(4\x13\xbb\x89\x30r'D=\x96\xed\xbe" +"-\x9a\x98\xd7VDP|\xa9\xbf\xac\xcd\xab\x84g_%\xed\xf4\xda\xe\xba\xcb\x43\xda \x9b" +"\xc\x12L\xb7\xa2#\xc6:\x89_\xe6n\x14\xd0\x2\xd7\x15\xadL\xfc\xec\x9f\x3~hdI\x84\xd7" +"\xc]\xe3\xe1\xafNG\xa4\x94\xdb\xc6\xbb\xde\xb7\xc1\x1d\xf0\x90\xbc\xe6\x1c\x39\x37" +"v\xf4\xa1^[J\x1a\x89\xd5\xe7\xbc\xdb]\xbh\xc5\x12\x91\x8c\x64\x2z\xd9\xb0\xb\x33" +"\xd1\xd7\x7\x9a\x97\xf8R7\xdei\xedO\x0\xd0\xa4\xe\x9d\x42\xccG\xa1\xa6\x8e\x1b\xec" +"\x9dM\xa6\x8d!\xc2\x99\xa9\xd9\x8ay\x9b\x91.\x4T\xa0\x18\xc5\xeb\xe\xc7\x9fKO3\x9e" +"\xbc\x88\x9c\xb9\x1a\xeb\xbf\x12t\xcc\x18\xa8(\xb7\x8f\xb\xb9\xb9\x88\xab\x95\x3" +"o\xe0N\xac\xfe\x3\xa2\xb3 \xdc\xb2\xce\x8a\x88\xb1\x87\x65\r,\x9dS~\xd4?\x3\x85\xb0" +"\xd9\xe9<\x1a\x7w\xf8>\x14\xa6\x8O'w\xe3\"\x9c\xfe{ns\x94\x10\xd5\x12\xf5w\x96\x1c" +"R\xbaS\xac_m\xc4\xc2\x1c\x15\xdao\xb4\xb5\xa7\xc0Po\xd4\x94\x37\xabM\xbc-\x93\xa6" +"\xf2\\\x41i\xed\xbc\xbb\xf3sG\xb0P\r\xa0p\xedO\xe8%/\xadj\x16\xd0\xbc\xd2\x1a=\xd5" +"\xcc\x11T~\x2\x6\x99\x0_l\r\x10\xa3\x1eP\x1a\x42\xdeiW\xf7\xff\x0x\xd7&\x93\xe8\x8f" +"\xd8Q\xd6o\xb4\xb1M9{\xa4\xd8\xd4|\xfd|R\xe7\xf1\xcb\x42_\xa0\xfd\xc9\xe0\x16\xb9" +"\xd5\x17\xe6\x32\x10\xdaL\xed\x81\x42q\xbd?\xdb\x90\x82mC]T(f`\xbc/h\x1d$3\x92\x45" +"rJ\xfdr\x1coB=\xee\xc3\x37l\xdb\x12\x1eu\x80\x88\xa5\xbf\x38x@\x92\x45\x1c\x80\x36" +"\xb8\x95|}\x90\xed\x1f\x5\xf3\xc6Rh\x4w\xca\xcay\x5\x1dY3\xfe\xc1\x61-\xca\x62\x95" +"P\xbe\xad\x99\x9f\xcf\x6\x8b\x15\xc2\x0\xe3\xc6(/\xa8T\xd0r\xa7\xeeZwhF\x88\xd4\xc2" +"\xab\xc3\xda+2d\x84w\xb4\xf3\xfa\xe1\xc1\x1d\"\x89\x84\xef:\xa3\xffm\xf7T\"\xa5\xdd" +"\xed%\x8d\xd6\x8c\x83\x6*\xf9\x39\x63{&|l\x11\xdc\xb8\x44\x85\xadrE\x88<\xa6\x84" +"b\xa6\xfb\xb8-.\xa2;\x3\xf9 zX\xa4\x18\xcc\x80\xf0\x97`\xaa\x10\xdeG\xcc\xc8\xd8" +"\xe2>Lq\xd3\x8\xe3 \xf9\x93\xf1\\[\xe9p\xd9\xa8\x8er\xf9\xf1_\xe\xa2\xca\x5L\xdb" +"\x8cw\xeeo\xec\xcb.\xb2l\xd6\x11\xaaJb\xdcr_=\xcc\xe6\xba\xd6\x91\x41\xaa\x32\xf9" +"\xe3\xd4\x19\x39T\xe8t\x5\xf8\xc3\x37)\x81m\xde\x1b\xc6\x1b\x94?\xb4S\xcf\xda\x98" +")\rl\xc0\x96\xe5L\x2\xc8\x1c\xeer\xb8\x9enK\xb7\xb0s\xeeJ N\xa9\x35\xfd\x9a?\xaf" +"~\xa0k\xf8\x0\x92\x83\xe5r\xad\x3\xb4\x88\x2)\x19\x11iro&\xa6\xe6\x15\xd7\xdfh0&" +"\xc2\xa6\x88\x34\xf9\xcf\x1a\xd1\xbe\xb9q\xfaVf\x7\x66\x38\x81ZV\x90\xbc\x1e{\x8a" +"\x7'\x8b\x83\xc4\x87#\xca\xfc\x93\x64\\\xf\xbe\xc0\xe8G\xe6\xbb\xfao;\xe5\x9d$\xf1" +"\xd2\xce\x9a\xea\xac\xf2\x9c\n\x35\xa9\x98\x8d\x92)rM,\xf3\x9c]Z.\x1N\xd2\x14\xad" +"\xca\x33\xcb\xc1t\xf3?I\xf1\xd0G8B\\\xfe\xb3\x99\x46\x14\x8d\xba\xe9\xfe~ \xb\x64" +"E\xad\xbasD\xa9\xcas\xd2\xd4\xe7\xff\x38\x10\xb5\xa2\x5\x10\x96\xd5\x12w\x91JI\xa0" +"`\x9b\xab\x8d\x3\xf9\xfbp\x9b\xfd\x87N\x98#\xcd\"\x16\xf3\x9a\xd3\\\xc7J\xdd\xc8" +"\xf1\xb0\x4\x32\xa1\xf1\x90$\r6v\xe3\x34\xd6|\xd3=\x98\xb\xa1g\x95\x15\xf0\r\xf6" +"i\x8e\xfd\xa5\x2.\x81\xd2\xfa\xa8\xc6\xdf\x1b\xbd\x1c\xb2;gyh\xb0V9c5\x1N\xf0Rt\xe0" +"\xd3(\xe\x9bU\x2\x94)\xfd\x64\xa0\x9\xc7\xf6\x1f\xefR7(\n9,>@?\x9fY\xcaR\xa4\xf6" +"\xce\x81\xa0\x7\xb5\xad\xecvX\xe1:\xe9\x8d\xc9\x46\xbbze\xb0\x12\xb1!u\xb1\xca\x88" +"\xbc\xba~g2\xda\xe1O=>\xd5\xdeXm\xc9\xcel\x99X\xb1K\x8dY\x87\xe7\xe2\x2\xef\x36\xb9" +"\xfd\x1a\xc7\xb6\x8b\x41\x9c\xe3:N[\xd0\x14\x41\x63\xe4\x65\x31\xa9k{\x8\xf5\xc6" +"V\x1\xf9\x9\xdb\xba\x19L\xec\x9a\xcb-l\x5\xc4'\xe5\x7\xff\xf0\x45\x3\xb9\xae\x8d" +"\x15\x97Gs\xba*\xb8\xc5}S\xa3\x10>\x1e\x6\xf0\xd4l\xc7\xd2\xa7\xda\xd3L\xf7\x63/" +"\x3\xe3=u\xab\xe*\xd9\xbbI\xb\xaa\"\x90\xb2\x8/\x99\xde\xb8\xb9\nS\xb2\x0\x1?\xfc" +"\xd9\xe^\xf2\x82R'VTM\xaa\xe4\xae\xf0[\xbe\xa5\x94\xc6S0\x17\xa3\xb1=*\x8\x32\xce" +"-\xbb\xc8Ts\xc2\xd8#)y\x80\xc8\x44\xf1\x13\xab\xf5V!h\xa8\x16\x9d\x15\xb5\xf4\x31" +"\xb1\xe5R\xbd\x64\x45\x17\x33\x98q\xb7\x9f\xc9\xc1\x9\x2\x1c\x3\x4\x91n\xec\x88u" +"\xcd>\x5\x2\xc1\x9b\x89\x43\xfa\xff\x42\xf4'\x81U\x94x&eV\xbc\xcbT\xe1\x64\x44\"" +"\xdf\x8f\xe6\xb7\x46\xf4\x11\xe9r\x8c\xe1\x9d\xd8*T\xe0\x13\x9e\xa3n\x85\x12\x34" +"hz\x8a\x30+7\xf5\xe2\xb9\x14H\xaa\x8f\xcb\x1v\x0\xb6+ET\xc6>\xe9s\xe7\xcb\xec\xac" +"\xef\x61\x64\xd0\xc3\xf7\xd4X\xe0\xc6\x8\x99>Y\x8\xb7=\x80\xeb\xfb\xf6@\xd9>\x94" +"3!\xda\x36\x83\xca_Ccb\xf0\xfa\xb7\x42\x65\x41]F*\x13\x63\xc7\xf0=\xe1{ \xb3\xcb" +"\xcd\xe7\x5\xe3Z\x8\xd5Ko-[\xa4\x9e\xd5:\x89H\xa6[I\x93\x1e<\xd4r\xae\xe5\x35\xb9" +"\x1b\xea\x1aK\x3\x7n9D1\xb7\x1a\xa6\xe\x33\xa7=\x82\x88\x87\x17\xf5\x63t\xa0\xc5" +"`\xea\xe6\xff\xb5MH2!\xfc\xf6\xce\xdc?\xe9&z\xdf\xdc\x62\xa8\xa1\xa1l\x9cP/\xe\xdd" +"\xb6\x1cyn\x94\xec\x94\x95\xca\xc7|\x18\x30\xf6\x6\xbe\xev\xe5\xb3\xcf%\xbey\x90" +"\xfc\x8a&\xe5\xd6\xcd\x10{\xc2\x42\xf0\xa7\x85\x9d\x31\x34Ws\xc2\xfb^\xf2\xe2\xc0" +"\xe4^\xdf,\xc3\xbc\x65(\xe0\x19zTL\xd1\x8f\xc5\x80_30\xb.']\x8a \xa6\xdfT\xa9\xe2" +"\xa5\xfbt\xf5*\xacu[\xaaV]\xc7\x33\xe3\xc1\xe3\xe1\xec\xf9;r\x9e\xe0\xd8\x64nO\xc8" +"/\x99k\xa6\x97\xfb(\xe5(\xf9TS#\xc2\x1b\xa2\xa4uI{\xcb\xd3\x66\x8f}_`n\x88\xbc\x86" +"\x90S\xe5x@\xe8\xc4R2\xdeM\xe5\xfd\xaf\xff\x6U48\xbf\xe8\xb4\xc1\x41\xe8\xe2\xfa" +"\x96\x42\xfd\xdd\xba\x65`\x97 y\xdb\xebN\xa5\xb4\x1a\xed\x16^E,v\xcf\x83\x8d\xc0" +"N\xddI\xc7\xd6\x6i\xd2\xba\xc5S\xbd\x42\x44\x38\xe2=S$J\"OX\xffW\xe4\xc8\xcc,\x1b" +"\x9eS\xaaL\xb4J\x8e\xc3\x10\x42\x61\x62hS\x9d\x85\x8d\xe9p^/6\x4\x1\x9c\x1en\xbc" +"\xf1\xcf\x9eH\xb.P\xd4&\xbe\xac\x87\xa2\xc8\x86^\xc9q\xd8\x84\xb2K0B\xa8\x1c\xe3" +"a.}H!\x18\xa5\xdf\x38x\x6\x85\xed\xc\xe6\x61\x84\x4\x89/A\xda\xcb\x38\xd0\xb1\x81" +"\x91G\xfa(t\xd6:2\x85l\xc2\x63\xa2\x94\x66$\xe7=\xd5\x38\xe\x10\x42&XB\xb9Z\x1e\xef" +"\xac\xd6\x1b\xed\x8d\xe4\x80\x45\xdd\xeeK\x0G\xa1\xef\x64\x15\xd0h\x98\xbf\xbe\x2" +"\x81\xdd\xa5\xb5\xee\xaf\x81\x16\x9*B%\xe5i\x94\xc7\xae\xaa\x32\x7f\xee\xc9\xd2\x82" +"\x93\x37r\xde\xf7\xf7\x9d\xc9j\x1c\xa2iz\x9e\xa5:\xa6\xe2\xa9\x39Jb!\xb6m\x9d`1\xf4" +"O\xbe\x86\x9b\x34\xe\xd9\x8f\xd9o\r B*;\xbhc\xd8=\x99\xd6g+\xef\x9e\x87\x11Kg\xfd" +":\x1d\xa8\xd6\xc9_W\x14\x10\xf\xa6\xe2\x97g'\xb9\x1\xb\xa0\x65{\x1e\xd9NI\xc7\xcf" +"2\xbb\xf1\x65'\x8\x17\xcb#\xda\xae\xe7\x4\xaf\x64\x88q\xce\xd8\xc9\x16\x87t\x91\xc8" +"\x3y\xb6\xc5\xb3M\xe8u\x8f\xdc\x35\x5\x12\xa8\xc8\x43L\xb2j\xaa\xe5!\xc1v6\x90};" +"%\xc2}\x10K\xf1\xf7\xf3H\x6\xb6\x2\x33\xb3\x10\x7\x1d\x96\xbep\x8e\xd4\xe6\xb\xb2" +"\xdd\x90\xa7]\xe6}\xa6h/\xe8\x37\x97K\xa4\xa8U@\x8b\x9\xac\xcf\xa8/\x1c \xf2#K\xe7" +"-F\xca\x3\x2\xf3\xcc\xca\xf6Y\xf7\xc9\x62\xe8\xe4\xec\xe4\x39\x1b\xca\xe4\xc1\x6" +"B9Bf\xf8\xd4\x61\x13\xefHx4sO\xe6\xb1\x7f\xb8\xc\x0jK\x6$9\x7G}\xca\x88*\xf2'`\x9e" +"\x16\xd3;\xae\xbb\x66\xc9\x1fw\xf7\x94\xb8H\x92[\x9b\xcb\xff\xec\x7f\xda\x11\x8f" +"R.\xc6\xe8\xe8\x4\xe7\xf9\xbd\xbb\"\xed\x90\xe8t\x8ao\x8d\x8@\xa7;\xd2\xdb\x4\x98" +"\xe9z\xb9I~\xf7\xa6\xe2s0s\x97\x9e\xcey\xcd\xd5|~\x80\xd3\xdc\xd6\x1\x65\xcc\x36" +"\xab\x88:\x99\xc7W\x8c\xbb\x1\x85l\x93\xad\xa1\x90\x8c\xec\x18z/$\xf\x98\x44Lp\x7" +"\xc1\x7\x36\xf4q\x15?G?\xb5j\xa2H0\x14\xf7\x8b\x96\x33S/;\xb1\xf3\x9cx\x8e#\xf4\x9" +"\x6s5\x83\xae\xa4\xc\xdd\xd2\x91>AuTv\xea\x8R$I\xa4\xab\x8c\xdew\xd4v*1\xae.\xc8" +"\xa1\x97zi\x7f\x98\xeep{\x1cH)+'Nx\xber\xc3\xb\xe8\xa6\xcd\xae\x9f~\xb8\xadq\xe1" +"\xcf\x62\x1a\xd3\x9f|X\xc2.}\xc7\xa5t\x93\x43h\xedVU\xbf+\xca)\x17\xed#i\xf3)\xa0" +"5\xc5\xf6\xeb\x1d\x32\x11\x43\xcf\xc9\x97$^7\xd9\xce\xf9\x4\xed\xec~\x16\x9cN\x95" +"\xc2\xa0\x64J%x\xa9Y\xc8\xb9\x8)\xb9\xc8\xd8\xeb\x43\xbs\xd9^\xd9\xfe+\xda\xd7\xb3" +"9\xec\x10\xba|!\xe1:\xa8\xcb\xa2\xa2 ]T\xbb\xee\x39x'\xdd\x1c=\x1\xda\xfd\x0J\xed" +"\xfa;\xc3\xc\xfd\xeb;(7u\xef\xc9\xed\x1b\xb9\x37\xb8g>\xd5\xe1\x36;\xec\xe8\xb7\xf1" +"vGX\xa7\xa3\x94\x83\x83\xa2\xfe\xdd\x86/\x93\xb0:$\xc9\x41\x84\xb6\xd6\xac>oG\xe8" +"\xe6'=\xcf\xca\xa5|\xc0\x12\xf0\x44\xa6\x19\x4\xefn=\xa7\xfc\xc3,-n\xff\xac!\xec" +"\xf8\xc8?5d\x18\xe3\n\r'\xcb\x83HV\xa2\xa4m\x83tH\xe3\\\xd3\xd9\xfd\x18\x1fl\xb4" +"\xfd\x61\xf8{Q\xb3\xa0\x6\xa3\xf2\xe4S\xcb\x99\x99\xdf;B\xc4\xf6\x80\x1f\x46>\x16" +"k\x1eP\x12R\xbc\x7f\xd0\xe3\"\xcf\xb|\xa1\x39\xdeHR\x13\xfe\xf8\xb3\x34\xad$\xe6" +"[\xc5\xcb\x66O\xa6\xea\x81\x98g\xf5W\xc8\xa3\xdd\xe6\xa6\xb0\xfc\x8d\xd7\x5\x18*" +"yW\xa2\xe2\xc\xe\xfe\xa5\x8e\r-\xff\x1a\xa7+\xbd\x99\x1dr\xea\xb2@\xf6\x96\xbc\xdd" +"\xd1\xa9\xb4\xf7\x9c\x45\x87V\xde\xce\x8a;d,}<\x8cr~\xad\xcc\nq\x3\xcbMG\xa5\xb1" +"\xfb\x90=\x11\n\xea\x5\xcf\xb2z\xa4\xe3\xf\xbd|wc\xec\xdd e\xceN\xf7\xcf \xcc\xcb" +"\xaf\x37\xee\xa6\xa3\xe4 \x1aSW\xcdLO\xb8s\x16\xbc\x32\x3\x87\xc8\xd1\x12\x7h!\xe4" +"2\x1dL:\xbd\xf0\\\x8d\xc4\x62/\xf2Y\xa3\x32~\x90\xf6\xdf\xaf\x43\x9bo@E=\xb1\x8t" +"\xcb\xe0\x8a\xf2\xec\x84\xa9+\xa7$0k\xfb\xf7\x17\xdc\xcb\x9a\xbc\r\x66\xe8\xc2ly" +"+(\x83\xf5\x89'\x5\xcf\x96\xc2\xecT6Mh]\x4<\x4\x14x'\xe0\xc3pzX\xb7\x94y\xcd\x35" +"\x7f\x11rV6\x17\x41\xf3H7z`*-\xa0\x10\x33\xdb\x13\x14\x38'y\xde\xe0\x89\xc8\x8a\x36" +"\x85\xa3\x1d\xe3\xe0\xda \x8f\xa7\xa6\xfc\xdeO\xf1\x9c.O\xf0\x8a\x15\xaf/\x1c\xf4" +"\x12\x9fh\xdc\\\xc0\x44\xeb'\xd1\xf\x1fk\xc6\x93P\xc5\x8d\xff\xc9p\xa3\xdc\xe9Z\x8e" +"h\x8^@5\xe1Tf\xe8\xc5OM\xcf\xa4m\xd8\xd8\x9ci\x3\xc4\x9a\xd0\xef\xd7\xdb\x9b\xb7" +"\r\xa3\x8d\x12\x19\x86\xd4\xf0\xdf\x97>\x88\x15\x83\x87\xba\xc2\x6M~\xd5\xd8\x35" +"\x1c\xad[\xf7\xbc\xec\xd4\xf4\xa9'|\xe9\x34w\x9d\xdf\x8e\x32I\x7fX\xb9~\\\xf4\x41" +"`b\xd0\xb7V\xb8\xcd.\x9a\xea\xb2\x43\xed\x37\x66\xc9\x41\xc2,\x99\xcd\x35)\x9d\x18" +"^W;\xda\xeS\x0;W\x89\xaaoj7:t\xafN\xf9\x6\xc8\xc5\xcc\x41\xec\x33|\xd3\xfa\\\x1d" +"i\xa2u\x13\x9f^\x9d\x9d}\x2\x92\x91v\xb0\xfb\xe0\xfe\xec\x2\x44;H\xec\x33\x35\x9a" +"h\x10z\xb9\xe2M\xf7\xe1\x30`\xe1\xc3\xb3\x93\xc8\x15\xb2\xa8\x1a\xdcW\xcf\xce\xab" +"\x98\x2\x42\xbbq\x8\xf9\xf9\x13\x92&0\x92\xdf\xb8\x9d\x35\xf0\x36\xbe\x14\xb5\x9f" +"\xa6\xbc\x36\xcavF\xd1\xcf\x8\xab\x87\"\xbeg\xd1\xb5r\xba\xbc\xe2\x66\x32\x8f\"\x9c" +"\xe3\x2g\xafK\xb\x36\xb5\xc5\xef\xff\xb9Q\xe9\x1c\xcaH\x11\xa2\xc1\xa0L\xf1.\x9a" +"\xb7T\xa2\xfd\x6\xa3\x98\x88\x12*$JD\xa8\xbfR\xda\x16Uz\xebJ\xed\x91\xa6\x86\xfd" +"st\x1c\xea\xbf\xef\xf6\xdb_\x9b'\"\xd4\x61\xef.\xe4<\x19\x8\xb5\x30\x90\xe7\x46\x16" +"k\xce/\xab\xf0\xfb=`\x8\xeftY\x90\x9b\xd8\x88\xf0T$T\x1f\x92t\xda\x33\xd9l\x83Y\xf3" +"\x96\xbf\x34~a\xec\xb1\n\xc0\xbe\x33\xd2'\x16\x2%\x82\x16z\xc9\x9c\x8c\xcenj+\xf1" +"\xa3*O+\xa6\xb2r\x5\xcf\x9f\x97\x65\xb1\x7fz\x9bI\x86\r\xfb\x9d\xba\x18\x12\xd8L" +"|\xae\x90\xcc\xc0\xac;\xd9\xd9\x17\x1f`yL\xf9\x5\x61:_\xa1M\xc7/R\xa0l\xdb\x33\x1d" +"\x14\xfa\xe1\xe\x3\x93\x63\xe5\x11w \x86\x46\xc2\x18\"\xf2l{\xb9\xd5\x87\x86\x97" +"\xbf%\x9e\xd4\xf4\xc6\xf4\xea-\xcc\xa4o R\xaa\xc2\xd3\xe2\xad\x1x\xc1\xd5\x15\xd1" +"\xa5\x92&\x8c\xe2\xa4\xcb\xc8\xe4\x81\x13\x42s\x19\x84\x86\xbv\x85t\xe7\x1a\x1c\xa1" +"C\xe1\xc3\x38\x86\n\xa0.\xdb\xf3~y)\xc\x89\x32\xb4)2\x3\xf7\x96" +"\xe3\xa7U\x90H\x19\xcf\x1f\xc1\xf8\xcc^\x87\xd1\x9e\x65\xb3\xb9\x16\x8b\xdd:|\x7" +"\xc8O9\x0t$\xfc\xc6:^\xe2y\x82/\xb2\x3\xa7`\xec\x89\xaa\x8fG\xc2Y\xb9\x1ey)~MV>x" +"\xb8\x1!\xa5\x34\xa6[\x2{\xe6\xc4,\x82\xcd\x66(t=\x81\xb\xa4\xff`>\xdasn%\x83\xf8" +"SjjZI\xde^$\xdc\xa8\xb7\xfc\xf2\xd8\xe2\xb2u\x9d\x42$\xbe\x65\xcbz2-\xf\xce\xe0\xaa" +"+Zq\x87\xa0J\xaf\x44\x91\x9f\x93\xe\xd4\xddP\x9d/<\x3\xd8\x17\x42\x34t'\xa3\xcc\x46" +",\xea\xd3\x43\\\x62\x19\x8c\xb9\x7\xfeXiF\xa1\xc6\xce\x44\x46\xd9\x9\x8f\xf8\x37" +"\xab\x61\xa8\x12V\x10\x96\x9\xd3n\x86\xe9\xf\x10\x63\xf2\xa6\xab\xe8!\x83`\x5\xb1" +"\xa1\x8d#~\x98\x9f\xcf\xdd\xd7K\x1d\xd8q{\xf4T\\}\x18\xa4\xb3\xe7\x8\xd5" +")\xbe\x18=\x7\xe2\xb\x30\x0T]\x92\xc9\x82U\xb8\xe6\x46l\xc9\x9y\xf7\x8f\x8e\x66)" +"\r\x96\x9f\x99Q\x8I\xf\x8a\xb2\xaf\xe5\xf8\x9f\xa9\n\xb0\\WhS\xfe\xd0\x63}\xefk5" +"h\xc6\xb3\xceT\xac??vt0\xc4\x9c\x95gf\xc7\xbd;\xfcl\xa3\x16\x88P\xe3/O\x8e\x65=\xe3" +"\xa3%\xa5\x15S;0\xc5\x8a`\xc7\x99\x89\xd8\xdb\x33:%\xe8\xc1I\xa6\x16\x30z\xa3\xb1\x84" +"w\x11\x99\xcb\x16\x37\x83\x7\xf1\xde\x39\xc9\xc0\xb0\xbd\x8e\xd6\x1f\xd3\xf7\xf7" +"<\x87\xc1\xdb\xfa\x7\xc1\xa1\xc7\x1dv\x95\x89\xb8[l!R\xe\xe5\xc\x80\xe4j\xe3\xae" +"cP\x9b\x93\xc\xc1[\x11\xd2\x83\x1fQ\x4\x61x\xf4\xce\xb3\xc4]MP\xbbp\xae{Y \x18\xd2" +"\xed\xf3\xe1\xc2\xc0z\"\xa9\x16\x15\x30G\x8d\x1blw|X\xa4N\xe4\xa4\x92\x80!:\xe\xea" +"\xcf\xc8\xfa\xe1@\xdc\xc7\xf1\x43p&\x93^\x97\x82\x94\xa1_\x8b\x31S\xaf\xf7/\x86\xfc" +"\xd7\x11H9?,\xfa$\xfa\xf0\x10\x13\xf8\x41\x95G\xdf/\x2_\xd5}\x1d\x5\x45!\x9a\xf7" +"\xb7\x9d\xedh\xa8\xd4T\xe5\xce\x99\x1e\x81<0\xe0\xff\xd4t\x92k\xa5\xc4\xb4\xef\xe1" +"\xd6\xcb\xbd\x7f\xd2L\x5U\xdf--:\xdbL\xd6\x13%\xa5\x64q\x9f\x44\x62\xb0\x96\x38i" +"\xf4\xb\xf1\x9d\xcbW\x8e_\xee\xb\x39\x9\x9\xde\xb9\xa3\xf8\x90~,c\xac\xc2\r\xa7\x30" +"m\xd1\x37\x15o\x10\r\xb4Z\x1b\xc8\xc0I\xe9\xd9\xbf\x1f`:\x86.:q\x81\x4\xb8';Y\"\xec" +"\x9\x8d\x34\xce\xa5\xf8|\xd2\xe\xf2i\x18'l16;\\\xc6\x44\xa1\n\xbb|\xbc:\x3\xeb\xd2" +"\x18\xf2\x64\xc5KK;\x7\x17h\x99\xb3\xfq\x1e\xfb\x80\x65T\xa7\xb5\x83?>\x3]\xf5\x45" +"tW\xe1_D\xf1K\x99@=T\xbat\xe6\x18?\xee\xed\x19\x14[\xff\xbf]/\xf4\x80\xe1\x9c\x61" +"\x9f\x61\xab\x92G8\x9f\xed,\xfa\x63\x85\xf6T#\x8b\x34\x99\xf8\xe3q\xe7\x17Hr\xa0" +"\x9e\x93U\xd5\x99q\x9b\xc6=\xc7\xb1\x86\xf5J\xc8\x35\xbf\xa4VN\xe9\xd1\xa7\x0`Y\xbe" +"\xe0\x4\x8c\xf8\xee\xc5\xff\x1d\xe9\x86x\x8b\xc3\x66\xdf\xf7\x11\x93\xe\x1c\xc5H" +"\x90\xe6\xc8 4\xed\xd8L\xc1\x5\x66\xdfW\x95\xf3{\xe6\x9a.e\xeb\x10\xbanL8\xe0\xad" +"\xcf\xd4g\xc3\xa3\xa3\x16\x97\xc2\xdaQ\xc5\x35\xcd\x61q\xae\x8e]`\xaf\xd1\xda\xc1" +"\xd9\xed\xeb\xf9\xfd,\x8d@\xa4\x81\x4\xe9\xbe\xfe\x9\x65\xcb\xdc\x8e\xb0-b\x99\x13" +"a\xb4\xa1\xacv\xf6O\x83.\xd6\xff\xdc\xa5\xbc}W\x3{\xb8\r\xae\xc5\xd8\x91Y\x1b\x80" +"\xdf\xf0p\xdd\x1b\x99\xb4\xfb\x8G\x8e\xb4\xe8\xb3\x2\x4\xa9\xb9\xe4\xec\x33\x10[" +"\xae\x9d|\xde\xd1\\h$?~5\xc2\xeb\x43\x8e\xf2\xe1\xd1\x10\xb3\x18\xb2\xc8\xf0\x8a" +"\xe8\xed.[k\xdar\xd8r?~WH\x12\x80\x95Ou\xa8\x15\xe1o\x1c\x61\x43\xef\xeek\x87\x9f" +"\xf1MV%\x1b\xd9~\xd8\xe6\xd9\xb6@\x82\xc\x91\xd7\x65s\xc8\xe5)\n\xda\x9d\x31&\xe7" +"k6\xcc\xd6q\xdb\xdc\xc9\x1f_\xa5\x18\xeagv\xf6\xe7\x42\x82\x11<\x0\xa5\xb4z\xcc\x30" +"\x17\xb6\x9b\xcc\xb8(\xbb\xa8\xe1x\x1a\xa7$^\x11hh\xa5S\x5\x30X\xb\xfd=Q\xe3\xd4" +"\xbfr\xef\x94\x10\x46\x91\xe4\x8eNV\x8d\x43\xb3\xa1_\xcb\x9f\x91x\xd8\x88g\x7\x34" +"\xec\x99\x5\"\x66\xd6\x62\x37\x9a\xc4Z\xe0I\xf8\xea\xfe\x1f\xbc*\xdb\xb6\x14J\xba" +"\xf4\x62\xb1\xb6\x97\xc9\xde\xbz\xba\xe4Q\xa1%N\xf\x1a\x2\xd6\xcf\xc8U\xb3\xb\x1a" +"\xcd\xf6p\xe7\xfe\x6\x1a%\xfe\xb1\x94\x45\x45\x8a\x8d\xfe|\xab\x9f\x86\x62[:\x9f" +"`\xc2*\x13\xc1G\x92\x92O\xd0\x3\xd4Q\xcd\x1d\xc1\x41\xfb\x91\x91J\xa6IjF\xfd\xaf" +"\xdd\x8a\xdaT\xe8\xbdk\xd5\x46\x2\x5\xbf)A\x1e\n\x90\x8d\x10\xe7wn\xd2\x1f=p\xa2" +"*\xa6\x39\x9bX\x9e\x3\xee\x1e\xc9\xe1\xa3\xcf\x8a\x30\xff\xd5Wf7\xa8$g3\xb9\x1c\x1e" +"\xe8\x15\x36\xa2\x9c\x89;L\xcaq\xc5\xe1\xf5\x90\xb\xe1\xec!\xdc \x1b|\x3\x32\x2\x45" +"rY\x9f\x3\x8a\x84$\x18,\x9a\xb6\x0\xb2ik\xeb?\x10/\x9\x90\xe7O\x90\x63\xe1I\xbd\x63" +"\xd3\x18u\xfdo\xb6\xc7\xe0^\xc9Z\xf4,\x11\xa2\xe8z\x96\x36\x1\x35\xed\xe4\x86\xb5" +"<\x82\xf4^\xb\xc5\x14\xc2\x85k\xf1\xd7\xcd\xc6Nz\x84\xefHbM\xceV\xa0\x37\x8e\x12" +"\xaa\x0}\x93\xb0\x43k9`\xae\xaf\xf\x87\xeN\xc0;\x8e.2\x83\x41\x9ap;\xfeI\x9e\x63" +"Mw\xe3\xc7\x8\xdbT\xe8\x96j,Y\xafr\xd2mf6\x17I\";\xa0\xaa\xe5\xea\xca`\xbJ\xe\x13" +"ei\xfeZA\"\x1b\xe~\x83\xe5\xea'\xde\x7f\x86\xee\xf2\xfc`\xdd\xc8\\\xe2Y\xc5xQ\x10" +"P\x12\xd5\xbaq\xa8&Wnl\x9f\x44\x62\x35\x43\x65\x1bn\x1f\xba\xc2,o\xf4/\x9c\xe9\xe8" +"\xe9\xd6-\xad\x9P\x12\x10\x2\xd8\xdb\x8f\xae=\xad\xb8]!\x8b\xe8\xe8\x85k!\xd0Q\\" +"\x8c\x7\xd5\x1e\x1c\xb5\xb\x87?\xc5G%\xe2\xe0\x31\xd9\xad\n\x18\x8\xdc\xe8\x9b\xe2" +"\x94\xf4\x10\xa0\xb0\xfc\xe\xa8'\xee\xd4W\rs\x1a\x66\xae\xb4\x7f\x9f\xf4\x0\x97r" +"\x92\ns1\x19sk\x9b\x93\x11~(\x6\x1fOxe\xf3\x90\x34\x18H\xcd\xbf~\x98\x6\x86\x7f\xec" +"\xab:`o\x9f`\xdd\xcb\x1fq\xe6o\x86\x87gE\x92*9\xd0%\xaa\xc5\xe5\x84?\x99\xbcwd\xb8\x1c\xde\xa5\xf2\xfb\x1f\xc3" +"\xff\x34\x87\x8c\x62P\x86n1\xd3\xf7\x97.\x85\x18\x4\xaa\x64\x1a\xa3\xa4\xc9h\xc3" +"\xdf\x0\xc3\xe3\xa6\xa8?*\xcb\x90\x95\x97;n\xef\xe7\x92\xb\x7\xe6\x82mm;P\xa4\xb7" +"v\xb5\xf\x9f\xfa}G\x1c\x35\xc\xaa\x1c)\xeb\x9d\x93gD\xf5\xe5v2TO\xc5\xa4\x36\x63" +"\x0\xee}\xb1\xa1\x96\x8a(\xc2\x64\xad#\xed\x30\x5u\x90_i\x98\xf1\xd4\xa5\x1e\xfc" +">\xee\xca\x46\x82\x13\x82M\x3^\xa7\x83H\x8d\x94\x39\xb3\xc9\xb1\x92\x37\xb1\xe2:" +"\xc0\xff-\x8c\x37\x97qk\xb6\x61\xb4\xde}J\x10\x80\xf0\x92\xa4\xb8m\xdd\xaa\x65\x35" +"\xe4\x96\xe9P\xc4\xdd\x13\xe3\x8c#\x81+>\xd6hR:\x1a\x82\"\xe8\x44]\x82Yw\xf9\xe4" +"\xb1\xa2\xeb:\xb9\x33\xd3\x88\xd6\x97`'\xf6\x94~\xc3\x37\xfe\xc7\xc2\x66}\x95\x17" +"\xfc\xe6\x8dU\xf7\x91\x96\xc6\xf5\x1f\x9b\x8et\xad\x90\x1\x83\x9e\n\xfb\xdb^P]a\x10" +"\xdav\xa2\xbe\x32\xb\xbd\x17v\xe7\x89\x84\x66O!\n?N\x86\x37]P\xdb\x12\xd8\x9d\xfe" +"\x5\x8f\xe9\xceS\x3\xf1\x44\x9a\xcd\xb4\x85\xbb\x16\x45\x81\xa1#\xd9\x35\xe5t\xe5" +"\xc4\x92\x36\xcc\xf9\x6\xc8\x18\xb2\xee\xe7v\xc0\xdb\x45g0\xb7U\x7\xdcR\xf6\x8c\xb9" +"\xc6>\x9a\xf0\xdc\x36\x1\x1e\x1b)\xd9\xb4\xcb\xbb\xff\xc3\x9e\xa4\x82\xa0\x1d\x80" +"\x83\xe4\xe3\x19\x91\xc5\xb7\x92\x85R\x14\xb5\xff\x1a\x86\x82W\xa7n|f\x6\x8d\x32" +"\x15\xaap\x9bXf?p\\\x8a\x9d\x37i\xe2)`\xda\xdb\xa3pO\x7f\xe5\x36\xf0\x86\xd7\x8f" +"\x9f\x14\x9d\x12\x62JS\xc\xbb\x30<\x8a>\x13\xa3^g\xe3\x97\x46\xe9\x66iwH\x92\x42" +"Y]IL>\xcc\x61\xf9;K\x94J#\xc3\x62\xe9Q\xd2\xde\x86\x6\x16\x39@\xd1\x96\xb8W\x9b\xaa" +"#\xf7\x62\xeaG\x14\xe2H3\xe4\xaf\xa1\xb6\xd2.z\xbb\x8c\xd1\x1f\xa4\xaa\x83[\x9a\xf6" +"\xdf\xa6\xc1o\x99\xd9\xff\x9=\xb8\x94\xe1\xd0\x8X*\xec\x4\x8c\x43>\xe5\xaf\xb\xf6" +"\xe2\x12/\xf4\xca+\x15zE\xe1\x8fJ\x91\xff\x8e\x66\xc6\xc3\x19\xa0\xf7\x7f\xa3\x82" +"\x12\xb\xda*!{\x83\x5{\xf1\x9d\xac\xe9\x86\x84&\x14t1\xe5\x88\x1c;&6:\x9\x8a\xf3" +"a\xb9\x96\x66\xbf)\xb7\xe1\xf6\xbfO\xf2\xeg\xab\xf3\x19\xea\xf4\xb3\x41]P\x94\xba" +"\xd3\xbb\xeb\x35\x1c\xb5\xe0\xfa-\x8\xf1`\xc4MQ\xect\x83\x10z\x19\x19L\xb1\x44\xe6" +"\x9d\xdf\xf4\xd6kF\x2~\x9c\x65\x61\x33z\x6\x44\xac\xac\xcb\x99\x88W\xf\x9f\x95\x9b" +"\xf8\xca\x43\x87\xeb\xd2\xb6\x66\xe9\xda\x96\x42\xc3p\x5\x5\x97\xff\xf6\xd0p\x18\xee\xc\x9a\xa0<\xb4\xab'n\xe" +"\x15\xb7\xa6\x8\xd9py\x16=\x8f\xb2Q\xe3}\xc9\xed\x82/\xe\xe3\xe5\x82\xdcSG.\xe9\x97" +"\x91\xef\x96tH\\\xe9\xaa\x81\x92R,\xb7\x15\xd4\xa3hc\xee\xa6\x92\x97\x13\x91\x3\xfb" +"\xdf\x1bM\xa7\xce\x9e\x13\xa4\xd5\xe4|JQ\xb2\x42\xfe\x94\xbaI7\xaf~\xba\xfc;#'\xe9" +"9\xed\xf1\xf8\xc3\x9c\xe9\xc6\"\x61\xbc\x12[\xfc\xaf\x46\x61\x36\x46\n\x8a\xbdt\xdd" +"\xd3\x45:\xdbhla\x7\xe4\xd9!\x99\xa3\x8\xa0\xf\x94\x5\x97\x41\xaa\xfd\xb\xa8\x92" +" \xae,\x97/<7DR\x8aU\xd9\xb7H{\xbc\xae\xb1\xc5uv\x8e\xda\x14\xe7\x64\xd5\xe6\x86" +",G\xfd\xcc\xc\xbe\xb0\xa0\x14\xec\xbc\xff[4\xaa\x8f\xc8\xfb\x38\xab\x35\xba$\x83" +"\xf1\x42\x15\xf6\xabs\xfd\x12\x34U\xb8\xe6\xdc\xcd\xa8\xe5y`\xdf\xd4\x9c\xca\xd4" +"\x91\x8ei\xb1\xd7W:\x7\xff\x80n<}*1\xc6\xb8\x18=4U\x87\xf\xf0\x1b\xf4\xa2:,,\x10" +"n\x81\xcd\x9e\xa3\x84\xc8G'\xa1\xa1<`j\ra\x81\xdd\xbf\xf4\x1b\x1P;\xf9R\xad\xd2\xc6" +"\xb\xf1\xf9\xe0x\xf0S\x87\xb7\xc9\x1b\x1f\xc9\xfbN!\x99\xf5\xf6<\xae\xc3\xe3\xa8" +"\xd7\x30\xca\x33\xba:\x89\x65\x38\xc0L\xd5\xedt\x9c\x87\x9f\x33\xdeXoi\xd8\xc6\xe6" +"\xeb\x1e\x93\xac\x80\xb4\xb1\xb1Lp\x9f\xfZ\x84VW\xd2\x80py8\xfd\xfa\xbf\x33\xfb\xcc" +"\x85\x81\xfe\xb9\x99\x8ds 7D\xae!\xb3!*>\xbe\x87\xc1\xff\xff\x18{\xa4\xbdt\x8e\x94" +"\xb0\xec;\x9bhV\xb2\xd9\xc8\xb2\x8d\xd3\"\x10\\\xf5\xe\xaa.t\xa0_\xa1\x98\x87\xd2" +"\xf7\x9TK\xe4\xf7\x13N\x8\x85\x36\x1e\xd5\xb4\x13\xdes\x4\xceK3#z\xf4&\x98\xd4;}" +"\xa5(\xb6\xa1\x15\xf5\xb9\x9a\xfa\xad\xf8\xb5\x85\x84\xf7(\x2\x9\xc7q\"9,\xb4g\xa3" +"\xa5\x31\x1d\x64\xb2RP\xac\x42\xf7z\x15\xb5\x83\xadq\xb2\xf2T\xdd\x16\xb6\xc4\x33" +"\xb8]\x88\xb0\x81\x12\xc7\x97\xe1\x9bt\xd2\x35\\\x12\xa6\xb\xe1\x4\xcb\x8a\xb6\xda\"\x90\x33g\"\xf5\x87\x38\xd6n\xbb\xa6zJX\xfb\xa9" +"/\xba\x96\xec\x15\x5\x94\x38\xf8\xef`\x81\xc6\x7fl.\x1d\x8bQ|\xc5\xf\x3\xfe\x15\x1c" +"\x8f\xb\xfd\xefr\xab+\xe0\x14\xa2\xbe\xf\x62v:ly\xdc^8\xa1\x90\xe\xa9\x8e\xfc\x31" +"\xa0@A#\rW#X\xefm\xda\xc5y\xe\xd7\xb\x34\xc8\x1eK:\x93\x84\x9e\x38g\\c\x8e\xb9xZ" +"ZNonb\xf5\x99\xbc#S\xe2l\xb1G\xceZ:t\xa9oB\x9b.\x94l\xf8\x1d\xa1\x90&\xc9\x95\x1f" +"\x8a\xdbZ\x5\x8f!&\xf6\x8b\x33\\\xd3Jg\x12n(\xae\xaa\xa9\xe4\xabW\x8c`E\xa4v\xeb" +"1'3\xb3}\xe4\x1e\x13\xa0:d\xa3\x2\x9b\xe5\x30\x33\x19\x83\xa8\xf6\x9d\xb3%\xca\xd9" +"C\xbd\x44\xdb\xf6g\x18L\x1b\\\xbeq\xa0\x1a\xfa\xef\xcav\xf0}\xbc\xcc\xb9\xfb\xd6" +"\xb9\xd5\xe2U\x7f\x8a\xe5J\xfd\x82l\xa6\xbb\xc6L\x5\xad\xac\xca\xbe=Z\xc2\xf8\xe4" +"D\xbb\xc8\xe6\x65\x65\x31\x33\x1d\x36/\xab\xdf\x91x]/\xe7]5NS\xfc.\xb1\xefv\x10\xac" +"\xafm\x1c\xa1{\x9b\xcb\xdf\x8d\xdb.\xbb\xde#\rk%m,k\xcc?AZ\x87+(\xdf\xb1xT\xd3RG" +"KIc\xd8\xe5\x14>\xd5n\xd7\xae\xdb\x94_Q\xf8\x97\xa5\xe9;\xd2t1\xbd\x61\x44*\x88\xba" +"\x4\x2\xec\x9d\x1aS>H\xbc\xc\x8c\xf9\x8ej\xb2\xb1\x9\x38&}\xbd\x15I\x6\xe1\xba\x12" +"\xe\xde\xfdH\xe2X$6[\xab\x1b\xcdH\xbd\xa4\x64\xdc\x88#\x7\x80\x35\x81ymD\x98vA&c" +"\xa2\x9a\xe2\xd7\xc1\x64\x9|\x99|\xfd\xeb\xac\x31\xe2m;\xbcT\x1fS\xe7\xa5\x18\xec" +"\xa9(\xd3\x9b/\x81\xbe*\xc1\x7\xa4\xfc\x80\x8fg\x84\xec\xf9\xed\xb7\x10\xbb\x6\x5" +"a\xa3\xec\xe4\x82\x42\xc6\xc4\xcx\x94\x30|\x1\x9dT\x11+\xa3\x46\xf4\x13\xdb\xc2\xee" +"\xbb\xaa\x8e\xab\xfe#NFH\x81\xacR\x3\x36\xa3x\xb0Q~\xb2}\x80\xe\xdb\x7\x1a\x32zz" +"C\xb1t\xb\x9e\x45z,\x1e\x8\xc4\x8N\xdfk\xc5=w\x1\xab\x63\xf\x38y\xb8\xd7\x90\x15" +"\xc3_\xd2\x94\xe9\xd4Y#\xc2\x88\xad\x9\x45\x90\x95\x80\xe0\xa4\x32\x3\x4\x8rw2\x9a" +"\x9\xf1\x95\xc5\x1e\xd3\xf7\xae\x39\xf4\xd7\xd3\x12\xb\\\x13\x31&\x1d\xfe\xc4\x17" +"\xe4\xd6\x85\xe1\xd0\xe5\x6\x8e\xd5\xf4\xe7\xb6\xaa?\xe8\xb9/\xa4\x64\x45 \xcb\xb" +"0wp\xcfI\xcd\"u5aK\xacy\x9f\xd7G8~\xb2\"\xdb(\xb4;HW\x8cK\xd6\xcf\xa5\xea\x8c\x91" +"1!4c\x93-\xf2\xe8\x9\xc4-\xf4V\x83\xf4Gt\x14\xf4i\xf3\xadg\xe5\xf\x36\x45\xe9\x42" +"6\xaa\xd3I\xa2\x43\xd9\x1d\xcf\xb9\xcG\xd7\xc6\xa2\xb\x2rMw\xed\x8M,\xa9\xf2\x1b" +"\x8z(\x82t|RG\xfc\x94\x9e\x1b\x90\x8\xbe\xdd\xb3wN\xe9_\xb7\xf1)]\xc9=\x9dzi\xcd" +"\xfb\xbd\x38]\x4\x19\xbe\xc4\xa0\xd0\xd8\x82\xff=\xd2\xe7G\xb2\xee\xaeil\xa1^4U\x81" +"\xec\xd1\xf4\x34\xe\x2\n,=\xa3\xda\xd8m.{\x9eO\xbR\x9aw\x8a\xf3\x37<\x9f,\x4\xb9" +"\xc1Y\xa2\x35\xb0\xdc\x10\x9b\x2\xa8\x6& \x3\xb3\xb2\x45\x32\xc2\xbc'\\\x80\xb5\xd6" +"\x8c\x10 %\xd9\x43\x3\xc5X\xc0\xe8\xbe\x9bt\rcX\x90\xe5\xdaX\x19/\xe1\xf8\xa2\xe7" +"/%\x1b\x9b`|\x5\x61\xbe\x33'\x8bL`\x15\x33\xd8\xdd|9\xc4\xd4\xf5\\P\xf2^Jk\xa6{\x17" +"\xb4}\xe7\x8b\xfb\xcb o\xaf\xf3\x9c)\xfeu\r\xd8\xaa\\\xea\xc8\x80\xc5`c\xc9\x91\x64" +"\xd0\x8a\x82\x65\xb3\xa5P\xf6@\xff(\x8c\xe3TH\xc3\xf7\xe2\xf1\xcbz\x1b'\x92w\xcd" +"m\xb0\x91\x43\xa7\x42\x16O\x9f\x88\xca\xf9\xbe\x8\x9am}+G\xa0\xf1|L\x12\x99y\xca" +"\xa8\xdf\x95\xf6\x62\x1d\x44\xa2z\rN\xa0L\xc0\xe8\x17\x89\x4\x98i\xb2\xa6\x35[3!" +"{\xdf\"^}:$\xe9\x80.(\xe5*\xfa\xbc\xb6\xd0\x9b\xd9\xe\x82\xb7Z\xbc\x97r\xeb[\xa0\xcc\x92\xa6\x7\x91\xfe\xafSL\xa5(\xe5(\x1e\xc3\"\xd5" +"\xddH5\x5:\x99\xee\xfd\xb3\xcc\xc4\xa3\x84R\x13\x11\xf7\x8b\xda\xf2\xbe\x0O\xf6\xa8" +"\xcd\xe3\x83\xd6\r\xd2J:\\\x8f\xf9o\xd0}\xe5\xac\xec\xfa\xe9\xf3\xcd\x8a+8k\xad\xb3" +"O\xfc+\xb9m\xb6\xf6\xd6\x81T\x91}3c\xd8U \x8dI\xef\x64\xa1\x8b\x89\xc5\xc6\x9f\xf6" +"\x98\xc9\xd7\xfdQ\xf9\x46\xcd\xd1K\x6\xe7\xb5\x9e&\xa1}QM\x4\xb1\x17\xe7\xde\x65" +"\xe6M\xe6\x9f=\xe0\xc0\xf\x16\xfc\xfe}\x96{d\x9c\x8dY\xbe\xc9\xac\x1d\xc\xcf\xc1" +"\x7\x9d\xb4J\xdd\xe9\x2\x11\x63\x64\xb6\x1a\x90\x45\x87\x5\xb1\xf0v%e'R\x94\x98\x97" +">\xbe\x9b\x8c\xc7G\xceu-*\xa3&6&\xccj\x0\x36\xc3\xf5\xe0\xf\xc7X\xae\x19\xb7\xc3" +"\xfbT\xd6\xeb\x8d\x1c\xd1\xbdU\xf5!\xfnu\xff\x9b\xcd\xda\xd5\xf5\x8d\xce\x90\x1b" +"NP\x1f+\x85\x64\xbf-\x8b\x85\xcb\x34G\x10M,\xfd|\xdb\x86)\xa5>\xa3\xdb:\xb1\xd4\x8e" +"d\xab\xe7\x35\xee\xa6\xf8\xf1\x62x\xffN\xff\x64\xe5h\xd4+_\xca$\xcd\xbc\xdd\x81\x5" +"\xaa\xc4^I\x10\xb4\n\xbd\xb3$u\xb4\x13\xc5n\x1aK\x9\x33Y\x19\x19\x30\xfa\xfa\xb3" +"*\x98jh\xd3\x9f\xa5\x6=B\xceY\xdb\xfa\xa0\x82\xb6\x8c\x94\x6\xa9q\xea\x84\xb0\x63" +"4`\x82\x1b\x11LK\nr\xc6Y\x89\xc9\xaf\xc0\x85\x44\x33G\xfdOo\\\xf1\x7f?\xf5\xb2\x91" +"\xb5Xp}\x8\x31\xb8\xac\xcc\x8e\x38\x80I\xb9\xbfm`\xb4\x3\xca\xd3\xaf\x1d\x15\xd9" +"\x99W\xa1\xd8\xb\x93KC\xd0\xf8\x12\xceTN\xa3\x6\x65S?n\xd8\xc3Z\xa5\xc1\x9e\xf1\xfe" +"\xa2\x93\xda\xfa\xc0\xe7\xd4\x82~{\xa7\xf0gg\xdb\x1R\x11\x31\x43s\x18\x7\xde\x15" +"\ri\xce\x33\x2}\x12\xc3\x46uK\x1eo\xea\xcc\xe9\xb1\xdb\x31\xd9\x1bqO\x90\xf1\x17" +"\x94u\xbd\x95\x33\xf3\x2\xb0\x9d\xb2p\x80\x38\xe6'1\x19\x66\x92\xed\xaa\x98Tz\xcb" +"\x8\xa9\x99\xd3\xbe^\x85\xb2\x9a\xd3\x1e\x1a\x90\xc8\x98\x31\xaa\xb6\xde\x15\x30" +"1J\x2\x62'\xee\xc8N\xff\x32\xe5\x1b\xee\x8\xd8\x19p\xbf\x96\xbfLC\x19\xeb\xe6x\xd0" +"g&T\xe2j:\xfc\xc6\r\x32\x90\x81\x31\x19\xed;\xe6\x34\x2W\x98oV\xad\x32\x1b{\xe2\x65" +"\xd4\x81q\x96g`\xd6\"r\xe0\x46\x66" +"s\nQ\x88\xcc\x7\xc\xba\x1b\x17\xf~\xb6\x46y\xc1\x61\xe2s^E\xe4\xe\x9\x7f\xa0\x94" +"\x9e]\xf7o\r\xf6Z\xc8\x5\xd0>\xe3\x10\x35:\xcf\xf3\x6\xf2S\xe8\x4 I\xcc\xa3\x16\xc7" +"Q\"8\xd6Re\xf9\"\xe4\x38\xf9\x64\x44g\xeb\x14\xa7\xd2\x8d\xac\x9a\xa3R\x5\x93\xaa" +"\xbO\xaa\x1f\xe5|2\xf1^\xf1q\x16]\xb7}4\xb7\x93.\x81\x86\x96/(\x8c-\xd8\xe4\xaf\x1a" +"\xf4\xfb\xdc\x35\x8e\x92\x38\x94\xb6\\\x30\x5G\x93\xb8.\xbd\xe2\xda\xcb\n\xfd/\x9" +"\xd5\x37\x8fZ\xcf\xbb\xb9\x87\x64\xbd\x96\xb8\x37\xe0\x86\x81\xdf\x9\xffl4\x1b\xee" +"\x1\xda\x1a\x65\xd5~\xf1\xfc\xe7\xce*\xcd\x88\xf7(\xce\xf8k\x18\xd1\x65\xc8\xd9\xe1" +")st\xd7H\xb9\xcd{\x18\xc8\x8e\x19\x31M\xfa\xe0\xb8\x1c\x99\x82\xc8\x1b@Bn\xcd\xeb" +"\x16\x14o\xdf\xbd\xd9?b\xe1\xb4\xe3{H\xe6j\xa5\xc6|\xde\x42\x86Tw\x1b<\xab\xde\xbe" +"\xcfW=Xi\x15z\x96\x11:k7\x7fN\xd5v\xc6\xfdV\x7|\x0\x90,M\x13\xae\xbd\xd6\xb\xc9\x88" +"\xf6\x89\xc3\x38\xb1,\x3\xe1\xca\xe9\xca\x46\xa8J\x2\x37P\xfc\x31\x93\x1e\xe7-\x93" +"\xaf\xd1\xc8\xe2\x63\xe2\xd8\xaf\x39\x6\x82Z\"\x8b\x8a\xbb\x94-\xf1\xa0\x1b\xec\x2" +"\xactgynR\xbc\xc6\x1b\x14\xc2\x31\xec\xbc\xa2\xdc\xb6[S^\xfb\xbb\x1e\xed\xf8\x6\x8" +"\xb0\xc8\x8d^\xed\x8d\x0\x96\xae\x9a~%SoPf\x6\x36j/\xd5\x1f\xf7\xa1\xa2\x1\x1b-n" +"J\xbb\xd8\x39\xee\xe7l\xb8\xfdt\xb2\xb2\x0\xd6\x34<\xf4:\xb5j\x93\x9c\xea\x8\x1f" +"\xef\xea\xd2\xdd\xee.\x16GZ\xb4\xfe\x1fR\xc7\x80\xa6.\x88\xaf\x43L\xf8pyg'\xb0\xb3" +"\xb9\x8f\x66\x87$\xe7m\x1\x93\x7f\x9c\xfe\xe7I\xb6\x91t\xbaR\x1d~\xe4V_\xde!}\xc8" +":\xb8\xab\x63\x39-C1\xb9\\l}\x10j\xb4\xa2\xcc\x33\xd4iJ\r\xe7\xde\xf4\x9f\x1cL\xc2" +"uy\xbf\xf5\xa5\xbd<1\xa0\x1\xc]\xf6 B=!\xec\x65\x88\xa4\xeb\x1b\xe0[\xa3}L]O\xc0" +"\x7\xe3\xe7\x3\xc1P\xe6\xbd\xfc\x42gr\xc7&\xe\x8\x9bv9\x97%\xd7\x82\xd4\x37v\x86" +"\xf5\xb4\xb5\xcc\x36\x8d*\xce\xe8I\x11H\xf0\x94\x96s\xe5V\x8bN~\x4\xc2\x37\x31\xdd" +"\xdb\xfa\n\xb\x1\xfd\xedx\"+\xafgM\xc0\xb2N\xc1\x15\x65\xe5\xa6\x1b\x8f\xaa\x2\xba" +"\x9e\x81+\x14Z=3\x9e\xb9(Fk\xe0\x9c\xcd\xc1x'\x8b\xd1\x1f*\x99nxh\xc3\\\x33\x8b\xd2" +"6\x98\xc5\x63\x37\x9a%\xba\x4\x8c\x0\x18\x39\xbak\xdd\x8blK\x87\xb1\xa0\xd7\x30." +"\xebT\xb5\x8a\xaa:\xb2\xca]\x96\xfeW\x96}\xd2mE\xbe\xe7{@\xceS(\xcdQ@w\xdc\xa3\xfd" +"8\x96\xda\xb8r\x5'\xbb\x31\x8f\x1c>\xdf\xc5\x1eU\xf4\x90\xc-\xfd\x87[\xb0\xcaY\xa5" +"\x9d\x93`\x8e\x66\xa6\x45\xe6TW\x11\xda\x37/C0dM\x1e\xc8'\xe1l\xdb\xaai3\xe6\x8d" +"k\x12\x8\x7f\x8dTC\xb5\xeaR\xc1_Z\xef\xcd\xef\x35I\xf7 \x98\x37\x1e\xb9\x1c\xf0\x5" +"\x1f<\x98\x83\xea\xe3)WYNb\x87\xe8\x1d\x87\"\xe8x\xa3`\xa1\xc4\x82\x8d\x3,\xf6\x8a" +"[\xb0Oz\xaf\x65+\xdf)\xa0\xdc\xe\x37\xc6\x8a\x9\xbb\xca\xbd\xcf;\nu\xbb\x1d\x99\x45" +"\xe\xd5w|\xf5\xfaU]`A\xef{\xd4\x8cnd[\x11\x97W\xe7[s\\\x99\xdbnO\x16\x41\x84\x1\x95" +"\x9a\x9d\x35\xae\x4\xebl\xfe\x65\xa4\x81YY\x87\xe4\x1b\x15T\x8c\x93.\xbe\xc1O\xcd" +"w\x9dl\xe2\x9a\xfaW\x8e\n\x82\xb8\x13k\x10\xe4\xd6oLe\x9b\xe4$\x9c\x13\x14\xc4\x37" +"l\xf9\x41y\x9a\xad:j\xefr'\xf5\xec\x93n\x16\xe0m\xe6\x9\xd5\x44R\xd5\\\x81\xb8\x1b" +"\xc9\x36\xf0\x9b\x32\xa6\r\xc6\x1\xaa\xef\xde\x44\xb7W0\xe2\xf3\x83\xec\xdc o\xab" +"l\x92\x9c;\x89\x44G\xa9\xcd\x1cO\x12\x14^\r\xc1\x64I\x2\xa2\xc5\x62\xf4\x92\xby\xc4" +"\x1d\x4\x8f ,\xf3\xe3\xc6$Xy\xf2\x9c\x8c\xd6\xa1\xb7;+\xfe\xaa\x9d\x8f`\x95\x30\xbb" +"|,P\x97\x36^\x8.6\xf2\xacyd\xbXk\x90\xc7nP\xb8\x39\x17=\xe2!@\xba'/!3\xb9\xd9\x14" +"\xe4\x9dh\xbc;lN\xcd\xbe\xb7\x9fznM\xcf\xe5\xc0p\x15TJ\xce\x62q\x8d\x88\x7f\x39\x8a" +"\xabi|\xc3\xeb\xbe\x7fy\xa5\xcd\xc9\xf0\xd6\x9a\x83\xbe\\T3r\xb7U\xe\x45\xcb\xed" +"V\xfR\xafy\x83\x8d\xfa\x32\x92'\x1c\xbd\x12\xc1\x38hA\xb2\n\x95\xbb\xbd\x9\xdc\x6" +"\xbf\x9e\xfa\xabZ\xaf\x16\xdc\xa6\xd7\x93\xfe\xcb\xba<\x6T\xfbR\x89R\x99\x33\xed" +"\n\x8eU\xe3\xef\x14W[Q\xe1.\x17\xf9JU\x13\x9m\x8c\x91\x81?\x80U<\xf2\x1f\xaa;\xbb" +"\x99\x11\xb2\x82\x8f\xd9\xf3n\xfe%\xef\xf5\xe8K0\xed\xf8\x85{\x10$am\xdc+\x19\x9c" +"\xf7lpq\x8dk\x8fur\xd8\xd3\xe0V\x5\xfb\xeb\x1c\x84^6\xa0\xceYRA\xbc\xb9\xc\x35\xf4" +"\xe0\x32\x1b\xb4\x4\n\xd4j\xed\xc4%r\x9d\xa5\x3\xb3R\x16\xf8M\xf^>kZ\x91.\xb8\xaf" +"1\xdd\x8\x1f\xd1\xbe\xf7\\\xad\xf4\xbe\xe8\xe4\xb9\x2\xef\xe2k\x96|\x16\xcc\xa0\xad" +"\xd4>U\x83j\x1a!K{B>\xd5\xc2PE\xc1\xf6O\x5\x8a\xd9\xf8\x13+3\x95\xdd\xe2\x86m\x81" +"\x9\xcQ\xbeW\xbf\xd6m\xb5\xd7\x84#S\xc4Q3\xcf\x4\x8d\xc7\xa3\xd7~E\x9cj\\\x87\xac" +"\xfeT\xa5\xcbiC6s%4\xf3;\xb0[B\x96\xda\x61`6\xe8\x1m\xe\x99\xe8n@=\x4\xe5\xaa\x85" +"\x1c\xc5\x1d\xebn\xf8\xf0\xa0\x42<[\x2\x80\xcb:r\x17\xab@\x0\xbfk\xe3\xae\x83\xf8" +"\xa8'\x82\xad\xab\xc1+/\xb3\x1\x62\x8a\xaeo\x96\x8e^\x3G\x92\xdf\xe5\x39\x83\xb9" +"\xfa\x3\xd5\xc8\xda\xf7m97!\xa1\x8a{\xe7\xbc\x87Y\x9d\x9f!\x90\x9a\xc5\xee\x93k^" +"\xf0\xb5\xaa\x10\xd4'\x4U\xab\x89\xd7\xf1\xba=\x9e\xca\xb8Q\x96\xf2\xd3L\x82\xbb" +"|\xa0\xdc\xfa\xa1Z\xe2\x84\x6\xf2\xfbG\xba\x9d\x84\x8c\xa5\xc4\xcc\xf4\xdfH\xb6\x65" +"y,j\xad\xb\x1a].\xc9u\x18\xbf\x39\x19\x82N\xa7s\xa6\xf7N\x9d\xf8\x94#\xf1Lq\x9d\xd0" +"\xe6\xab\x16&\x83 \xb9\x30\xad\x32IO\xa4\xd5\x64\x8f\x16K\xc0\x9e\x8b\xca\x7f\x19" +"#\xfa\x8e\xa3\x42\xe7\xbe\x87\xec\x83\x1c\xef$\x6wW\x1c\x65\xc5\x36\x89\x61['\xef" +"\x85\x61\xde^e\x95n\x5\x8\x14o\n\xe6.\x14\x9d\x65Zr\x9e'J\x87\x19\xca\xbc\x1a\xef" +"T\x9e\xb6\x80\x8d\x35\xedw\xc4\xc6>cb\xa8\xd8\xaf,\x8c\xd5'*\xe\xc6\x36\xf\xf<1H" +"\x86;4\xbd\xc1\x31v,\x9e\x9f\xce\x81\x96\x14\xabJ\xec\xd0\xec\x14\x8c\x81\xca\xbb" +"h\xf6-#\\\xf6\xb\n\xdd\x1c\xcd\xfaJFB_c\xa7\x63\x3\x39)\xa8\xf3\x62xW\xf6\xe0\xa6" +"6\xbe\xb6\xf9\xc7\xb8\xc6\x8a\xbex\x9d\xe6\x0\xe2k=\xbdm\xba\"\x95U\xbe\xbb\x15&" +"\xa5\x45\x64\xfa\xf4\x85\x12\x63\x7\xb2\xf3J&\x99-\x8a\x9e\xb7\xehS\xf\x1d\xdf\x39" +"\xeb\x30'[t0s{ \xe7\xa3\xf6\xbb\xd9Xb\xf2\x88O\xff\xa1\xddR\x8a\x0\x1a\x63\xcfJ\xad" +"\x88\xf\x89p\x92\x8s\xac\x8e\xf2\xf3\xe8i\xa2\x8d\xbd\xaa\xb4\xc4\r\x88\xbc\x43(" +"=\x89\xd9\xdf\x44\x4\x9\xf9\xcb\x96o}\xba\x90\xb7\x8d=\xae\x89\x13\xb1Mm\xde\x8a" +")\xf4\x5*\xbd\x32G?Sv\xec\x13\xd4\x82L:/\xd0\xf8\x1_\xc9\x66\x15\x39\xfdU\xb2Lm:" +"\xec\x1f\xc7\x9b\xd8\x42\xbbm\x1e'RH\x86\xef\x91\xc3h\xf9l\xb0\xbese\x8\x1b\x62\xff" +"\x8\x8a\x38\x16.\xa0\xfa\x95\x5\xd9\xa0\x9c\x8f\x44X4\xa1\xde\x18]\xe7R\"\x8e\x3" +"\x8d\xcf\x32!a+\xd1\x85\xc3~\xd3\x19\\.E\xb4Y\x8\xb0\xbb\xbb\xb3\xee\xa0I\xdb\xd3" +";\x1b\xa8\x9cm\x3\xe0\xd0\x65]\x8c\xe9\xf8M^\xa5.!;H\xd4*\xf5\xf4:\xc8\x81\xaf-\xcf" +"\x0\r\xa3:k\xf6\x18 \x97w\xd6\xaa\x8b\xe5\xf2S\x1f\xb2\xff\x9c\xb4\x18;\x4\x6\x41" +"\xa9\x9e^\x9\x8z\x89r\x94\xc6\xccpD\xb4\x2\xf5\xb5\xaa\xb3\xad\x43\xc7V\xe<\x8b\xcb" +"G\x85\xb1*\x8e[\x15\x96k\x9cv\"\x86'>\x2M3\x83\xc6\xbe\xd4\x0\x8c\xed\xad'\x9[0R" +"9\xfb{x8cv\xe2m\x98\x85\xf3t9\xee\xa4#Y\xe5\xc8\xf6q\xe2`*\x86\xa0\x97\x9e\xe2\xb4" +"\xf2/\x1f\x8\xb5\x31\xcd\xb8\x10\x9e\xe3\x96\x45\xdf\xcS\x96\x84\xc0\xeb\x15Rh\x95" +"h`'\xd9\xcc\r\xc\xa7\xddl\x84\xa9\x2\x95\x15I\xfd\x10H\xc2\x17}o\xf5\xf1}(c\x87y" +"u\xc7jIa%\xcb<\x5Y\xd3\x17\xc9\x38\xca\x34\xe1\xf1r\x14\x1aQR\x99\x4\xb6ZM<;\x1f" +"\x13\xc4\xe7G3\xae\xf8T,\x98\xdbi\x1f\xb1\xbb\x98\xb1\xabU;\xc5\xe0\xba\xaf\xbah" +"\xb4\x0\x14\xf7G\x86\xcz\xd2\x16Q\xef\x12\xa2\xd2\x34\xc4\xeb\xce\xcbL{h\xc7\xc8" +"\x1c\xe3\x8a\x4\xa5\x8d\xb4}7Z\x13\xe5\x15\xeb\x91\xc7\xff\x33\x17\xf4\xa4\xb3\xa1" +"\xe5\xbd\x7\xba \xe\xfeuyA" +"f\xa4\xb0\x93\x19\x8|\xaa;\xfe\xe5\x65k\xa0x\xf\xc3\xee\xde\xf5\xf5\xf6\x8a\xb2\xee" +">s\xf6\xf4V\xb0\x8c\x6\xfe\x61\x32\xa7\xe7\xcf\x37z\x2\x65\x44\x12\xe6\xd4i\xb1\x81" +"\x1d\xda\xe2\x8f^\xed\x46\x8a\xca;\x8e\xa9\x93|6f\x85<\xd0\xdf\x8c~\x9c\x98\xd5\xdf" +"5\x16\xbf\xbbO\x0\x13\x93>\x8\x65\xec\x98\x8cR\xde\x63\xa0k\x1bv\xd5Oks6\xd6\xcc" +"]Wz]@\xaa\x98\x1f\x13\xce\x82|\xd2\xd3\xbd\x9f)U\xdb\xd4QR\x16\xf4\xb6]\x8\x42\x18" +"\x9d\xc2\x2\xa2Q2\x8a\xbd\xeb\x92\xa1n\xb6]R_\xb9~\xb0\xf3\x10\xce\xab.\xcd\xd6N" +"\xb4\\\xf9\x83M\x95\x84\xe2z\xee\xa5?\xd8>\"f\x1a|\x4\x43\x1d\x14\x11-\xc9\xca^\xe6" +":s\n\xbe\xc9$m\xdeU\xdc\x9kTu@&O\x9c\xd0\xed\x84\xd4 `V\xf3\x17\xfb\x31J\x92-)*\xe4" +"T\xd9\xc6]G\x99\xdb\x19\xeeql\x9dW6j~\x8f\xc2Vui\xac\x92\xd1\x1dR\x99&@\x1av\x4\xb2" +"B}\xb9M!I\xad\x18\x1e\x91\x6\xb4\xcf\x83\x38\x1d\xa0\x63\x87\x90<\x8f\xdc\x17\xff" +"a\xf7\x18$\xf5\x13\xa1\xa3\x18N\x81\x8#\xef\xbd\xe3@_\xb6h\xbe\x9\xb0\xb3\xb8\x0" +"Wv\xe3\xa0\xa0\x8c\n\xae\xa4\x64ROzy\x8f\x1b\x82\x94\xbf\x9f\x3v\x84\xd2\xd8\x83" +"\x1u\xdc\xaa\xbf=L\x1d\x8cW\xc2\x9a-\xc5r\xdb\x8c\x61\xdd\x33\x33\xe0\xbb`kAV\xc" +"\xba>\xd7\xf6\x41O\xbe\x43\x83\x37\x93\xa6\x46&\x1b\x86\xdb\xfd\xa2)\xa9\x84\x61" +"\xfb\xfd\x95\x35\x1aQ\xb6\x81\xccQz\x83\xb'\xb6\xd8\xd1^\xbf\xfcVs\x7\x87=\nB\xc2" +",yOc \x0)y\x15\x17w\xa4\x9d\x13z\x96XN\xe8\x97\x62\xf7\xce\xfd\xe6\x8Z?\xf1\x61^" +" \xc5\xd0z\xea\xc4\x13\xff!\x1d&\xe3\x8b:{\xec\x8c\x18\xcaUC\xdf\xfd\xa4\x85>H\xf" +"\x9b\x8\x7f\xb7\x64\x39\xbc\xb3\x86\x43\xf3v\x96jD\x19v\x6l:\xb8\xaf\x87\xed\xbc" +"f9Yw\xf7$\xd5`\xb\xb5\xe4\x89\xb1\xd3\x9e\x9d\x17V\x80\x1\x14\x2\x0\x0\x30\x30\x30" +"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" +"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" +"000000000000000000000000000000000\r000000000000000000000000000000000000000000000" +"0000000000000000000\r00000000000000000000000000000000000000000000000000000000000" +"00000\r0000000000000000000000000000000000000000000000000000000000000000\r0000000" +"000000000000000000000000000000000000000000000000000000000\r000000000000000000000" +"0000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n022003l_afm_len = 31926; +char* n022003l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusMonL-Regu\n" +"FullName Nimbus Mono L Regular\nFamilyName Nimbus Mono L\nWeight Regular\nItalic" +"Angle 0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThickness 50\nVe" +"rsion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncod" +"ingScheme AdobeStandardEncoding\nFontBBox -12 -237 650 811\nCapHeight 563\nXHeig" +"ht 417\nDescender -186\nAscender 604\nStartCharMetrics 316\nC 32 ; WX 600 ; N sp" +"ace ; B 295 0 295 0 ;\nC 33 ; WX 600 ; N exclam ; B 240 -15 360 618 ;\nC 34 ; WX" +" 600 ; N quotedbl ; B 146 315 454 604 ;\nC 35 ; WX 600 ; N numbersign ; B 92 -62" +" 508 647 ;\nC 36 ; WX 600 ; N dollar ; B 113 -92 487 655 ;\nC 37 ; WX 600 ; N pe" +"rcent ; B 87 -12 513 611 ;\nC 38 ; WX 600 ; N ampersand ; B 105 -16 478 519 ;\nC" +" 39 ; WX 600 ; N quoteright ; B 135 314 340 604 ;\nC 40 ; WX 600 ; N parenleft ;" +" B 294 -124 458 604 ;\nC 41 ; WX 600 ; N parenright ; B 147 -124 311 604 ;\nC 42" +" ; WX 600 ; N asterisk ; B 113 250 487 604 ;\nC 43 ; WX 600 ; N plus ; B 72 32 5" +"28 530 ;\nC 44 ; WX 600 ; N comma ; B 135 -145 340 145 ;\nC 45 ; WX 600 ; N hyph" +"en ; B 72 258 528 299 ;\nC 46 ; WX 600 ; N period ; B 226 -15 374 116 ;\nC 47 ; " +"WX 600 ; N slash ; B 113 -81 487 668 ;\nC 48 ; WX 600 ; N zero ; B 113 -15 487 6" +"18 ;\nC 49 ; WX 600 ; N one ; B 113 0 487 612 ;\nC 50 ; WX 600 ; N two ; B 84 0 " +"478 618 ;\nC 51 ; WX 600 ; N three ; B 96 -15 499 618 ;\nC 52 ; WX 600 ; N four " +"; B 105 0 478 604 ;\nC 53 ; WX 600 ; N five ; B 96 -15 499 604 ;\nC 54 ; WX 600 " +"; N six ; B 136 -15 510 618 ;\nC 55 ; WX 600 ; N seven ; B 105 -1 478 604 ;\nC 5" +"6 ; WX 600 ; N eight ; B 113 -15 487 618 ;\nC 57 ; WX 600 ; N nine ; B 136 -15 5" +"10 618 ;\nC 58 ; WX 600 ; N colon ; B 226 -15 374 417 ;\nC 59 ; WX 600 ; N semic" +"olon ; B 139 -145 350 417 ;\nC 60 ; WX 600 ; N less ; B 72 44 522 518 ;\nC 61 ; " +"WX 600 ; N equal ; B 51 190 549 375 ;\nC 62 ; WX 600 ; N greater ; B 78 44 528 5" +"18 ;\nC 63 ; WX 600 ; N question ; B 134 -15 487 577 ;\nC 64 ; WX 600 ; N at ; B" +" 105 -62 478 624 ;\nC 65 ; WX 600 ; N A ; B 9 0 591 563 ;\nC 66 ; WX 600 ; N B ;" +" B 43 0 541 563 ;\nC 67 ; WX 600 ; N C ; B 63 -16 534 576 ;\nC 68 ; WX 600 ; N D" +" ; B 43 0 520 563 ;\nC 69 ; WX 600 ; N E ; B 43 0 520 563 ;\nC 70 ; WX 600 ; N F" +" ; B 43 0 520 563 ;\nC 71 ; WX 600 ; N G ; B 63 -16 562 576 ;\nC 72 ; WX 600 ; N" +" H ; B 53 0 551 563 ;\nC 73 ; WX 600 ; N I ; B 113 0 487 563 ;\nC 74 ; WX 600 ; " +"N J ; B 84 -16 583 563 ;\nC 75 ; WX 600 ; N K ; B 43 0 572 563 ;\nC 76 ; WX 600 " +"; N L ; B 63 0 541 563 ;\nC 77 ; WX 600 ; N M ; B 11 0 593 563 ;\nC 78 ; WX 600 " +"; N N ; B 22 0 562 563 ;\nC 79 ; WX 600 ; N O ; B 51 -16 549 576 ;\nC 80 ; WX 60" +"0 ; N P ; B 43 0 499 563 ;\nC 81 ; WX 600 ; N Q ; B 51 -115 549 576 ;\nC 82 ; WX" +" 600 ; N R ; B 43 0 589 563 ;\nC 83 ; WX 600 ; N S ; B 92 -16 508 576 ;\nC 84 ; " +"WX 600 ; N T ; B 72 0 528 563 ;\nC 85 ; WX 600 ; N U ; B 40 -16 560 563 ;\nC 86 " +"; WX 600 ; N V ; B 9 0 591 563 ;\nC 87 ; WX 600 ; N W ; B 20 0 580 563 ;\nC 88 ;" +" WX 600 ; N X ; B 40 0 560 563 ;\nC 89 ; WX 600 ; N Y ; B 51 0 549 563 ;\nC 90 ;" +" WX 600 ; N Z ; B 103 0 497 563 ;\nC 91 ; WX 600 ; N bracketleft ; B 280 -124 44" +"5 604 ;\nC 92 ; WX 600 ; N backslash ; B 113 -81 487 668 ;\nC 93 ; WX 600 ; N br" +"acketright ; B 155 -124 320 604 ;\nC 94 ; WX 600 ; N asciicircum ; B 113 354 487" +" 615 ;\nC 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ;\nC 96 ; WX 600 ; N q" +"uoteleft ; B 260 343 465 604 ;\nC 97 ; WX 600 ; N a ; B 72 -16 541 431 ;\nC 98 ;" +" WX 600 ; N b ; B 22 -16 541 604 ;\nC 99 ; WX 600 ; N c ; B 84 -16 535 431 ;\nC " +"100 ; WX 600 ; N d ; B 63 -16 583 604 ;\nC 101 ; WX 600 ; N e ; B 63 -16 520 431" +" ;\nC 102 ; WX 600 ; N f ; B 105 0 541 604 ;\nC 103 ; WX 600 ; N g ; B 63 -186 5" +"62 431 ;\nC 104 ; WX 600 ; N h ; B 43 0 551 604 ;\nC 105 ; WX 600 ; N i ; B 92 0" +" 508 624 ;\nC 106 ; WX 600 ; N j ; B 147 -186 458 624 ;\nC 107 ; WX 600 ; N k ; " +"B 63 0 541 604 ;\nC 108 ; WX 600 ; N l ; B 92 0 508 604 ;\nC 109 ; WX 600 ; N m " +"; B 11 0 593 431 ;\nC 110 ; WX 600 ; N n ; B 53 0 541 431 ;\nC 111 ; WX 600 ; N " +"o ; B 72 -16 528 431 ;\nC 112 ; WX 600 ; N p ; B 22 -186 541 431 ;\nC 113 ; WX 6" +"00 ; N q ; B 63 -186 583 431 ;\nC 114 ; WX 600 ; N r ; B 84 0 541 427 ;\nC 115 ;" +" WX 600 ; N s ; B 103 -16 497 431 ;\nC 116 ; WX 600 ; N t ; B 43 -16 499 563 ;\n" +"C 117 ; WX 600 ; N u ; B 43 -16 541 417 ;\nC 118 ; WX 600 ; N v ; B 30 0 570 417" +" ;\nC 119 ; WX 600 ; N w ; B 30 0 570 417 ;\nC 120 ; WX 600 ; N x ; B 51 0 549 4" +"17 ;\nC 121 ; WX 600 ; N y ; B 51 -186 549 417 ;\nC 122 ; WX 600 ; N z ; B 115 0" +" 489 417 ;\nC 123 ; WX 600 ; N braceleft ; B 197 -124 403 604 ;\nC 124 ; WX 600 " +"; N bar ; B 280 -124 320 604 ;\nC 125 ; WX 600 ; N braceright ; B 197 -124 403 6" +"04 ;\nC 126 ; WX 600 ; N asciitilde ; B 92 212 508 348 ;\nC 161 ; WX 600 ; N exc" +"lamdown ; B 240 -216 360 417 ;\nC 162 ; WX 600 ; N cent ; B 113 -13 469 630 ;\nC" +" 163 ; WX 600 ; N sterling ; B 63 0 520 578 ;\nC 164 ; WX 600 ; N fraction ; B 5" +"0 138 549 470 ;\nC 165 ; WX 600 ; N yen ; B 51 0 549 563 ;\nC 166 ; WX 600 ; N f" +"lorin ; B 87 -93 518 618 ;\nC 167 ; WX 600 ; N section ; B 66 -62 534 603 ;\nC 1" +"68 ; WX 600 ; N currency ; B 103 95 497 489 ;\nC 169 ; WX 600 ; N quotesingle ; " +"B 236 315 364 604 ;\nC 170 ; WX 600 ; N quotedblleft ; B 93 343 507 604 ;\nC 171" +" ; WX 600 ; N guillemotleft ; B 63 0 541 417 ;\nC 172 ; WX 600 ; N guilsinglleft" +" ; B 63 0 312 417 ;\nC 173 ; WX 600 ; N guilsinglright ; B 293 0 541 417 ;\nC 17" +"4 ; WX 600 ; N fi ; B 10 0 585 624 ;\nC 175 ; WX 600 ; N fl ; B 10 0 587 604 ;\n" +"C 177 ; WX 600 ; N endash ; B 72 261 528 302 ;\nC 178 ; WX 600 ; N dagger ; B 12" +"4 -63 476 604 ;\nC 179 ; WX 600 ; N daggerdbl ; B 124 -62 476 604 ;\nC 180 ; WX " +"600 ; N periodcentered ; B 226 217 374 348 ;\nC 182 ; WX 600 ; N paragraph ; B 7" +"9 -62 525 604 ;\nC 183 ; WX 600 ; N bullet ; B 202 141 398 337 ;\nC 184 ; WX 600" +" ; N quotesinglbase ; B 135 -145 340 145 ;\nC 185 ; WX 600 ; N quotedblbase ; B " +"93 -116 507 145 ;\nC 186 ; WX 600 ; N quotedblright ; B 93 343 507 604 ;\nC 187 " +"; WX 600 ; N guillemotright ; B 63 0 541 417 ;\nC 188 ; WX 600 ; N ellipsis ; B " +"51 -15 549 84 ;\nC 189 ; WX 600 ; N perthousand ; B 34 -9 564 614 ;\nC 191 ; WX " +"600 ; N questiondown ; B 113 -175 466 417 ;\nC 193 ; WX 600 ; N grave ; B 155 49" +"0 320 639 ;\nC 194 ; WX 600 ; N acute ; B 280 490 445 639 ;\nC 195 ; WX 600 ; N " +"circumflex ; B 155 490 445 639 ;\nC 196 ; WX 600 ; N tilde ; B 145 516 455 605 ;" +"\nC 197 ; WX 600 ; N macron ; B 155 536 445 576 ;\nC 198 ; WX 600 ; N breve ; B " +"155 490 445 620 ;\nC 199 ; WX 600 ; N dotaccent ; B 250 511 350 611 ;\nC 200 ; W" +"X 600 ; N dieresis ; B 140 511 461 611 ;\nC 202 ; WX 600 ; N ring ; B 207 480 39" +"3 661 ;\nC 203 ; WX 600 ; N cedilla ; B 210 -173 377 0 ;\nC 205 ; WX 600 ; N hun" +"garumlaut ; B 155 490 445 633 ;\nC 206 ; WX 600 ; N ogonek ; B 280 -155 433 0 ;\n" +"C 207 ; WX 600 ; N caron ; B 155 490 445 639 ;\nC 208 ; WX 600 ; N emdash ; B 1 " +"261 599 302 ;\nC 225 ; WX 600 ; N AE ; B 10 0 590 563 ;\nC 227 ; WX 600 ; N ordf" +"eminine ; B 155 279 447 574 ;\nC 232 ; WX 600 ; N Lslash ; B 43 0 541 563 ;\nC 2" +"33 ; WX 600 ; N Oslash ; B 40 -43 560 605 ;\nC 234 ; WX 600 ; N OE ; B 10 0 590 " +"563 ;\nC 235 ; WX 600 ; N ordmasculine ; B 154 284 448 577 ;\nC 241 ; WX 600 ; N" +" ae ; B 12 -16 578 431 ;\nC 245 ; WX 600 ; N dotlessi ; B 92 0 508 417 ;\nC 248 " +"; WX 600 ; N lslash ; B 92 0 508 604 ;\nC 249 ; WX 600 ; N oslash ; B 53 -43 543" +" 458 ;\nC 250 ; WX 600 ; N oe ; B 12 -16 578 431 ;\nC 251 ; WX 600 ; N germandbl" +"s ; B 43 -16 499 604 ;\nC -1 ; WX 600 ; N Udieresis ; B 40 -16 560 761 ;\nC -1 ;" +" WX 600 ; N Uacute ; B 40 -16 560 789 ;\nC -1 ; WX 600 ; N Scedilla ; B 92 -173 " +"508 576 ;\nC -1 ; WX 600 ; N Tcaron ; B 72 0 528 789 ;\nC -1 ; WX 600 ; N Scaron" +" ; B 92 -16 508 789 ;\nC -1 ; WX 600 ; N Rcaron ; B 43 0 589 789 ;\nC -1 ; WX 60" +"0 ; N Racute ; B 43 0 589 789 ;\nC -1 ; WX 600 ; N Sacute ; B 92 -16 508 789 ;\n" +"C -1 ; WX 600 ; N Otilde ; B 51 -16 549 755 ;\nC -1 ; WX 600 ; N ucircumflex ; B" +" 43 -16 541 639 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 51 -16 549 783 ;\nC -1 ; " +"WX 600 ; N Uhungarumlaut ; B 40 -16 560 783 ;\nC -1 ; WX 600 ; N Yacute ; B 51 0" +" 549 789 ;\nC -1 ; WX 600 ; N Eth ; B 0 0 520 563 ;\nC -1 ; WX 600 ; N Dcroat ; " +"B 0 0 520 563 ;\nC -1 ; WX 600 ; N Zacute ; B 103 0 497 789 ;\nC -1 ; WX 600 ; N" +" Uring ; B 40 -16 560 811 ;\nC -1 ; WX 600 ; N gbreve ; B 63 -186 562 620 ;\nC -" +"1 ; WX 600 ; N eogonek ; B 63 -155 520 431 ;\nC -1 ; WX 600 ; N edotaccent ; B 6" +"3 -16 520 611 ;\nC -1 ; WX 600 ; N ecaron ; B 63 -16 520 639 ;\nC -1 ; WX 600 ; " +"N Ugrave ; B 40 -16 560 789 ;\nC -1 ; WX 600 ; N Thorn ; B 43 0 499 563 ;\nC -1 " +"; WX 600 ; N eacute ; B 63 -16 520 639 ;\nC -1 ; WX 600 ; N edieresis ; B 63 -16" +" 520 611 ;\nC -1 ; WX 600 ; N dcaron ; B 63 -16 650 616 ;\nC -1 ; WX 600 ; N cce" +"dilla ; B 84 -173 535 431 ;\nC -1 ; WX 600 ; N ccaron ; B 84 -16 535 639 ;\nC -1" +" ; WX 600 ; N cacute ; B 84 -16 535 639 ;\nC -1 ; WX 600 ; N aogonek ; B 72 -155" +" 556 431 ;\nC -1 ; WX 600 ; N aring ; B 72 -16 541 661 ;\nC -1 ; WX 600 ; N atil" +"de ; B 72 -16 541 605 ;\nC -1 ; WX 600 ; N abreve ; B 72 -16 541 620 ;\nC -1 ; W" +"X 600 ; N egrave ; B 63 -16 520 639 ;\nC -1 ; WX 600 ; N agrave ; B 72 -16 541 6" +"39 ;\nC -1 ; WX 600 ; N aacute ; B 72 -16 541 639 ;\nC -1 ; WX 600 ; N adieresis" +" ; B 72 -16 541 611 ;\nC -1 ; WX 600 ; N Uogonek ; B 40 -155 560 563 ;\nC -1 ; W" +"X 600 ; N ugrave ; B 43 -16 541 639 ;\nC -1 ; WX 600 ; N uacute ; B 43 -16 541 6" +"39 ;\nC -1 ; WX 600 ; N udieresis ; B 43 -16 541 611 ;\nC -1 ; WX 600 ; N tcaron" +" ; B 43 -16 508 616 ;\nC -1 ; WX 600 ; N scommaaccent ; B 103 -237 497 431 ;\nC " +"-1 ; WX 600 ; N Zcaron ; B 103 0 497 789 ;\nC -1 ; WX 600 ; N ecircumflex ; B 63" +" -16 520 639 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 40 -16 560 789 ;\nC -1 ; WX 60" +"0 ; N acircumflex ; B 72 -16 541 639 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 103 0 4" +"97 761 ;\nC -1 ; WX 600 ; N scaron ; B 103 -16 497 639 ;\nC -1 ; WX 600 ; N Amac" +"ron ; B 9 0 591 726 ;\nC -1 ; WX 600 ; N sacute ; B 103 -16 497 639 ;\nC -1 ; WX" +" 600 ; N Tcommaaccent ; B 72 -237 528 563 ;\nC -1 ; WX 600 ; N Ydieresis ; B 51 " +"0 549 761 ;\nC -1 ; WX 600 ; N thorn ; B 22 -186 541 590 ;\nC -1 ; WX 600 ; N Em" +"acron ; B 43 0 520 726 ;\nC -1 ; WX 600 ; N Ograve ; B 51 -16 549 789 ;\nC -1 ; " +"WX 600 ; N Oacute ; B 51 -16 549 789 ;\nC -1 ; WX 600 ; N Odieresis ; B 51 -16 5" +"49 761 ;\nC -1 ; WX 600 ; N Ntilde ; B 22 0 562 755 ;\nC -1 ; WX 600 ; N Ncaron " +"; B 22 0 562 789 ;\nC -1 ; WX 600 ; N Nacute ; B 22 0 562 789 ;\nC -1 ; WX 600 ;" +" N Lcaron ; B 63 0 541 566 ;\nC -1 ; WX 600 ; N Lacute ; B 63 0 541 789 ;\nC -1 " +"; WX 600 ; N Idotaccent ; B 113 0 487 761 ;\nC -1 ; WX 600 ; N racute ; B 84 0 5" +"41 639 ;\nC -1 ; WX 600 ; N Icircumflex ; B 113 0 487 789 ;\nC -1 ; WX 600 ; N o" +"hungarumlaut ; B 72 -16 528 633 ;\nC -1 ; WX 600 ; N otilde ; B 72 -16 528 605 ;" +"\nC -1 ; WX 600 ; N Euro ; B 11 -16 534 576 ;\nC -1 ; WX 600 ; N ocircumflex ; B" +" 72 -16 528 639 ;\nC -1 ; WX 600 ; N onesuperior ; B 191 259 410 612 ;\nC -1 ; W" +"X 600 ; N twosuperior ; B 175 259 405 612 ;\nC -1 ; WX 600 ; N threesuperior ; B" +" 181 251 416 612 ;\nC -1 ; WX 600 ; N Igrave ; B 113 0 487 789 ;\nC -1 ; WX 600 " +"; N Iacute ; B 113 0 487 789 ;\nC -1 ; WX 600 ; N Imacron ; B 113 0 487 726 ;\nC" +" -1 ; WX 600 ; N Iogonek ; B 113 -155 500 563 ;\nC -1 ; WX 600 ; N Idieresis ; B" +" 113 0 487 761 ;\nC -1 ; WX 600 ; N Gbreve ; B 63 -16 562 770 ;\nC -1 ; WX 600 ;" +" N Umacron ; B 40 -16 560 726 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 43 -237 572 " +"563 ;\nC -1 ; WX 600 ; N ograve ; B 72 -16 528 639 ;\nC -1 ; WX 600 ; N Scommaac" +"cent ; B 92 -237 508 576 ;\nC -1 ; WX 600 ; N Eogonek ; B 43 -155 549 563 ;\nC -" +"1 ; WX 600 ; N oacute ; B 72 -16 528 639 ;\nC -1 ; WX 600 ; N Edotaccent ; B 43 " +"0 520 761 ;\nC -1 ; WX 600 ; N iogonek ; B 92 -155 520 624 ;\nC -1 ; WX 600 ; N " +"gcommaaccent ; B 63 -186 562 666 ;\nC -1 ; WX 600 ; N odieresis ; B 72 -16 528 6" +"11 ;\nC -1 ; WX 600 ; N ntilde ; B 53 0 541 605 ;\nC -1 ; WX 600 ; N ncaron ; B " +"53 0 541 639 ;\nC -1 ; WX 600 ; N Ecaron ; B 43 0 520 789 ;\nC -1 ; WX 600 ; N E" +"circumflex ; B 43 0 520 789 ;\nC -1 ; WX 600 ; N scedilla ; B 103 -173 497 431 ;" +"\nC -1 ; WX 600 ; N rcaron ; B 84 0 541 639 ;\nC -1 ; WX 600 ; N Egrave ; B 43 0" +" 520 789 ;\nC -1 ; WX 600 ; N Eacute ; B 43 0 520 789 ;\nC -1 ; WX 600 ; N Gcomm" +"aaccent ; B 63 -237 562 576 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 43 -237 589 56" +"3 ;\nC -1 ; WX 600 ; N Edieresis ; B 43 0 520 761 ;\nC -1 ; WX 600 ; N nacute ; " +"B 53 0 541 639 ;\nC -1 ; WX 600 ; N uogonek ; B 43 -155 556 417 ;\nC -1 ; WX 600" +" ; N umacron ; B 43 -16 541 576 ;\nC -1 ; WX 600 ; N Dcaron ; B 43 0 520 789 ;\n" +"C -1 ; WX 600 ; N lcaron ; B 92 0 508 616 ;\nC -1 ; WX 600 ; N Ccaron ; B 63 -16" +" 534 789 ;\nC -1 ; WX 600 ; N Cacute ; B 63 -16 534 789 ;\nC -1 ; WX 600 ; N Cce" +"dilla ; B 63 -173 534 576 ;\nC -1 ; WX 600 ; N degree ; B 155 346 445 636 ;\nC -" +"1 ; WX 600 ; N Aogonek ; B 9 -155 600 563 ;\nC -1 ; WX 600 ; N minus ; B 72 261 " +"528 302 ;\nC -1 ; WX 600 ; N multiply ; B 118 100 482 464 ;\nC -1 ; WX 600 ; N d" +"ivide ; B 72 25 528 540 ;\nC -1 ; WX 600 ; N Aring ; B 9 0 591 811 ;\nC -1 ; WX " +"600 ; N trademark ; B 4 243 598 563 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 84 -23" +"7 541 427 ;\nC -1 ; WX 600 ; N lacute ; B 92 0 508 789 ;\nC -1 ; WX 600 ; N omac" +"ron ; B 72 -16 528 576 ;\nC -1 ; WX 600 ; N Atilde ; B 9 0 591 755 ;\nC -1 ; WX " +"600 ; N icircumflex ; B 92 0 508 639 ;\nC -1 ; WX 600 ; N igrave ; B 92 0 508 63" +"9 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 53 -237 541 431 ;\nC -1 ; WX 600 ; N lco" +"mmaaccent ; B 92 -237 508 604 ;\nC -1 ; WX 600 ; N plusminus ; B 72 0 528 529 ;\n" +"C -1 ; WX 600 ; N onehalf ; B 23 0 573 612 ;\nC -1 ; WX 600 ; N onequarter ; B 1" +"6 0 580 612 ;\nC -1 ; WX 600 ; N threequarters ; B 6 0 580 612 ;\nC -1 ; WX 600 " +"; N iacute ; B 92 0 508 639 ;\nC -1 ; WX 600 ; N Abreve ; B 9 0 591 770 ;\nC -1 " +"; WX 600 ; N kcommaaccent ; B 63 -237 541 604 ;\nC -1 ; WX 600 ; N Omacron ; B 5" +"1 -16 549 726 ;\nC -1 ; WX 600 ; N imacron ; B 92 0 508 576 ;\nC -1 ; WX 600 ; N" +" emacron ; B 63 -16 520 576 ;\nC -1 ; WX 600 ; N amacron ; B 72 -16 541 576 ;\nC" +" -1 ; WX 600 ; N tcommaaccent ; B 43 -237 499 563 ;\nC -1 ; WX 600 ; N ydieresis" +" ; B 51 -186 549 611 ;\nC -1 ; WX 600 ; N zdotaccent ; B 115 0 489 611 ;\nC -1 ;" +" WX 600 ; N zcaron ; B 115 0 489 639 ;\nC -1 ; WX 600 ; N zacute ; B 115 0 489 6" +"39 ;\nC -1 ; WX 600 ; N yacute ; B 51 -186 549 639 ;\nC -1 ; WX 600 ; N uhungaru" +"mlaut ; B 43 -16 541 633 ;\nC -1 ; WX 600 ; N eth ; B 72 -17 528 620 ;\nC -1 ; W" +"X 600 ; N uring ; B 43 -16 541 661 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 51 -16 5" +"49 789 ;\nC -1 ; WX 600 ; N commaaccent ; B 234 -237 367 -60 ;\nC -1 ; WX 600 ; " +"N copyright ; B 3 -15 596 578 ;\nC -1 ; WX 600 ; N registered ; B 3 -15 596 578 " +";\nC -1 ; WX 600 ; N Acircumflex ; B 9 0 591 789 ;\nC -1 ; WX 600 ; N idieresis " +"; B 92 0 508 611 ;\nC -1 ; WX 600 ; N lozenge ; B 89 -11 511 575 ;\nC -1 ; WX 60" +"0 ; N Delta ; B 43 0 557 563 ;\nC -1 ; WX 600 ; N notequal ; B 51 94 549 464 ;\n" +"C -1 ; WX 600 ; N radical ; B 27 0 628 699 ;\nC -1 ; WX 600 ; N Agrave ; B 9 0 5" +"91 789 ;\nC -1 ; WX 600 ; N Aacute ; B 9 0 591 789 ;\nC -1 ; WX 600 ; N lessequa" +"l ; B 53 0 525 535 ;\nC -1 ; WX 600 ; N greaterequal ; B 59 0 531 535 ;\nC -1 ; " +"WX 600 ; N logicalnot ; B 72 168 528 438 ;\nC -1 ; WX 600 ; N summation ; B 113 " +"-127 507 563 ;\nC -1 ; WX 600 ; N partialdiff ; B 71 -17 529 582 ;\nC -1 ; WX 60" +"0 ; N Ncommaaccent ; B 22 -237 562 563 ;\nC -1 ; WX 600 ; N dcroat ; B 63 -16 58" +"3 604 ;\nC -1 ; WX 600 ; N brokenbar ; B 280 -124 320 604 ;\nC -1 ; WX 600 ; N L" +"commaaccent ; B 63 -237 541 563 ;\nC -1 ; WX 600 ; N Adieresis ; B 9 0 591 761 ;" +"\nC -1 ; WX 600 ; N mu ; B 43 -200 541 417 ;\nC -1 ; WX 600 ; N .notdef ; B 295 " +"0 295 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 998\nKPX A C -33\nKPX A" +" Ccedilla -30\nKPX A G -27\nKPX A O -27\nKPX A Odieresis -27\nKPX A Q -28\nKPX A" +" T -27\nKPX A U -32\nKPX A Uacute -32\nKPX A Ucircumflex -32\nKPX A Udieresis -3" +"2\nKPX A Ugrave -32\nKPX A V -74\nKPX A W -12\nKPX A Y -28\nKPX A a 8\nKPX A b 4" +"6\nKPX A c -19\nKPX A ccedilla -15\nKPX A comma -39\nKPX A d -10\nKPX A e -14\nK" +"PX A g -23\nKPX A guillemotleft -49\nKPX A guilsinglleft -49\nKPX A hyphen -30\n" +"KPX A o -16\nKPX A period -67\nKPX A q -24\nKPX A quotedblright -78\nKPX A quote" +"right -98\nKPX A t -26\nKPX A u -15\nKPX A v -55\nKPX A w -19\nKPX A y -60\nKPX " +"Aacute C -33\nKPX Aacute G -27\nKPX Aacute O -27\nKPX Aacute Q -28\nKPX Aacute T" +" -27\nKPX Aacute U -32\nKPX Aacute V -74\nKPX Aacute W -12\nKPX Aacute Y -28\nKP" +"X Aacute a 8\nKPX Aacute b 46\nKPX Aacute c -19\nKPX Aacute comma -39\nKPX Aacut" +"e d -10\nKPX Aacute e -14\nKPX Aacute g -23\nKPX Aacute guillemotleft -49\nKPX A" +"acute guilsinglleft -49\nKPX Aacute hyphen -30\nKPX Aacute o -16\nKPX Aacute per" +"iod -67\nKPX Aacute q -24\nKPX Aacute quoteright -98\nKPX Aacute t -26\nKPX Aacu" +"te u -15\nKPX Aacute v -55\nKPX Aacute w -19\nKPX Aacute y -60\nKPX Acircumflex " +"C -33\nKPX Acircumflex G -27\nKPX Acircumflex O -27\nKPX Acircumflex Q -28\nKPX " +"Acircumflex T -27\nKPX Acircumflex U -32\nKPX Acircumflex V -74\nKPX Acircumflex" +" W -12\nKPX Acircumflex Y -28\nKPX Acircumflex comma -39\nKPX Acircumflex period" +" -67\nKPX Adieresis C -33\nKPX Adieresis G -27\nKPX Adieresis O -27\nKPX Adieres" +"is Q -28\nKPX Adieresis T -27\nKPX Adieresis U -32\nKPX Adieresis V -74\nKPX Adi" +"eresis W -12\nKPX Adieresis Y -28\nKPX Adieresis a 8\nKPX Adieresis b 46\nKPX Ad" +"ieresis c -19\nKPX Adieresis comma -39\nKPX Adieresis d -10\nKPX Adieresis g -23" +"\nKPX Adieresis guillemotleft -49\nKPX Adieresis guilsinglleft -49\nKPX Adieresi" +"s hyphen -30\nKPX Adieresis o -16\nKPX Adieresis period -67\nKPX Adieresis q -24" +"\nKPX Adieresis quotedblright -78\nKPX Adieresis quoteright -98\nKPX Adieresis t" +" -26\nKPX Adieresis u -15\nKPX Adieresis v -55\nKPX Adieresis w -19\nKPX Adieres" +"is y -60\nKPX Agrave C -33\nKPX Agrave G -27\nKPX Agrave O -27\nKPX Agrave Q -28" +"\nKPX Agrave T -27\nKPX Agrave U -32\nKPX Agrave V -74\nKPX Agrave W -12\nKPX Ag" +"rave Y -28\nKPX Agrave comma -39\nKPX Agrave period -67\nKPX Aring C -33\nKPX Ar" +"ing G -27\nKPX Aring O -27\nKPX Aring Q -28\nKPX Aring T -27\nKPX Aring U -32\nK" +"PX Aring V -74\nKPX Aring W -12\nKPX Aring Y -28\nKPX Aring a 8\nKPX Aring b 46\n" +"KPX Aring c -19\nKPX Aring comma -39\nKPX Aring d -10\nKPX Aring e -14\nKPX Arin" +"g g -23\nKPX Aring guillemotleft -49\nKPX Aring guilsinglleft -49\nKPX Aring hyp" +"hen -30\nKPX Aring o -16\nKPX Aring period -67\nKPX Aring q -24\nKPX Aring quote" +"dblright -78\nKPX Aring quoteright -98\nKPX Aring t -26\nKPX Aring u -15\nKPX Ar" +"ing v -55\nKPX Aring w -19\nKPX Aring y -60\nKPX Atilde C -33\nKPX Atilde G -27\n" +"KPX Atilde O -27\nKPX Atilde Q -28\nKPX Atilde T -27\nKPX Atilde U -32\nKPX Atil" +"de V -74\nKPX Atilde W -12\nKPX Atilde Y -28\nKPX Atilde comma -39\nKPX Atilde p" +"eriod -67\nKPX B A -9\nKPX B AE -9\nKPX B Aacute -9\nKPX B Acircumflex -9\nKPX B" +" Adieresis -9\nKPX B Aring -9\nKPX B Atilde -9\nKPX B O -10\nKPX B OE 10\nKPX B " +"Oacute -10\nKPX B Ocircumflex -10\nKPX B Odieresis -10\nKPX B Ograve -10\nKPX B " +"Oslash -8\nKPX B V -29\nKPX B W -12\nKPX B Y -50\nKPX C A -9\nKPX C AE -9\nKPX C" +" Aacute -9\nKPX C Adieresis -9\nKPX C Aring -9\nKPX C H -26\nKPX C K -11\nKPX C " +"O -21\nKPX C Oacute -21\nKPX C Odieresis -21\nKPX Ccedilla A -5\nKPX D A -42\nKP" +"X D Aacute -42\nKPX D Acircumflex -42\nKPX D Adieresis -42\nKPX D Agrave -42\nKP" +"X D Aring -42\nKPX D Atilde -42\nKPX D J -31\nKPX D T -40\nKPX D V -42\nKPX D W " +"-17\nKPX D X -55\nKPX D Y -63\nKPX F A -38\nKPX F Aacute -38\nKPX F Acircumflex " +"-38\nKPX F Adieresis -38\nKPX F Agrave -38\nKPX F Aring -38\nKPX F Atilde -38\nK" +"PX F J -95\nKPX F O -27\nKPX F Odieresis -27\nKPX F a -47\nKPX F aacute -47\nKPX" +" F adieresis -43\nKPX F ae -20\nKPX F aring -47\nKPX F comma -168\nKPX F e -56\n" +"KPX F eacute -56\nKPX F hyphen -67\nKPX F i -47\nKPX F j -54\nKPX F o -63\nKPX F" +" oacute -63\nKPX F odieresis -48\nKPX F oe -21\nKPX F oslash -63\nKPX F period -" +"193\nKPX F r -32\nKPX F u -1\nKPX G A 6\nKPX G AE 5\nKPX G Aacute 6\nKPX G Acirc" +"umflex 6\nKPX G Adieresis 6\nKPX G Agrave 6\nKPX G Aring 6\nKPX G Atilde 6\nKPX " +"G T -25\nKPX G V 6\nKPX G W 1\nKPX G Y -14\nKPX J A -7\nKPX J AE -16\nKPX J Adie" +"resis -7\nKPX J Aring -7\nKPX K C -42\nKPX K G -36\nKPX K O -37\nKPX K OE -19\nK" +"PX K Oacute -37\nKPX K Odieresis -37\nKPX K S -9\nKPX K T -12\nKPX K a -1\nKPX K" +" adieresis -1\nKPX K ae 26\nKPX K aring -1\nKPX K e -24\nKPX K hyphen -61\nKPX K" +" o -25\nKPX K oacute -25\nKPX K odieresis -25\nKPX K u -25\nKPX K udieresis -25\n" +"KPX K y -67\nKPX L A 17\nKPX L AE 16\nKPX L Aacute 17\nKPX L Adieresis 17\nKPX L" +" Aring 17\nKPX L C -11\nKPX L Ccedilla -10\nKPX L G -10\nKPX L O -6\nKPX L Oacut" +"e -6\nKPX L Ocircumflex -6\nKPX L Odieresis -6\nKPX L Ograve -6\nKPX L Otilde -6" +"\nKPX L S -24\nKPX L T -52\nKPX L U -29\nKPX L Udieresis -29\nKPX L V -66\nKPX L" +" W -27\nKPX L Y -53\nKPX L hyphen 3\nKPX L quotedblright -66\nKPX L quoteright -" +"73\nKPX L u -16\nKPX L udieresis -16\nKPX L y -45\nKPX N A -3\nKPX N AE -3\nKPX " +"N Aacute -3\nKPX N Adieresis -3\nKPX N Aring -3\nKPX N C -12\nKPX N Ccedilla -12" +"\nKPX N G -11\nKPX N O -9\nKPX N Oacute -9\nKPX N Odieresis -9\nKPX N a -19\nKPX" +" N aacute -19\nKPX N adieresis -19\nKPX N ae 11\nKPX N aring -19\nKPX N comma -5" +"8\nKPX N e -6\nKPX N eacute -6\nKPX N o -10\nKPX N oacute -10\nKPX N odieresis -" +"10\nKPX N oslash -7\nKPX N period -83\nKPX N u -9\nKPX N udieresis -9\nKPX O A -" +"27\nKPX O AE -26\nKPX O Aacute -27\nKPX O Adieresis -27\nKPX O Aring -27\nKPX O " +"T -30\nKPX O V -31\nKPX O W -5\nKPX O X -43\nKPX O Y -52\nKPX Oacute A -27\nKPX " +"Oacute T -30\nKPX Oacute V -31\nKPX Oacute W -5\nKPX Oacute Y -52\nKPX Ocircumfl" +"ex T -30\nKPX Ocircumflex V -31\nKPX Ocircumflex Y -52\nKPX Odieresis A -27\nKPX" +" Odieresis T -30\nKPX Odieresis V -31\nKPX Odieresis W -5\nKPX Odieresis X -43\n" +"KPX Odieresis Y -52\nKPX Ograve T -30\nKPX Ograve V -31\nKPX Ograve Y -52\nKPX O" +"slash A -26\nKPX Otilde T -30\nKPX Otilde V -31\nKPX Otilde Y -52\nKPX P A -79\n" +"KPX P AE -76\nKPX P Aacute -79\nKPX P Adieresis -79\nKPX P Aring -79\nKPX P J -8" +"2\nKPX P a -52\nKPX P aacute -52\nKPX P adieresis -52\nKPX P ae -25\nKPX P aring" +" -52\nKPX P comma -156\nKPX P e -42\nKPX P eacute -42\nKPX P hyphen -46\nKPX P o" +" -48\nKPX P oacute -48\nKPX P odieresis -48\nKPX P oe -13\nKPX P oslash -48\nKPX" +" P period -181\nKPX R C -27\nKPX R Ccedilla -28\nKPX R G -26\nKPX R O -25\nKPX R" +" OE -4\nKPX R Oacute -25\nKPX R Odieresis -25\nKPX R T -28\nKPX R U -32\nKPX R U" +"dieresis -32\nKPX R V -33\nKPX R W -13\nKPX R Y -29\nKPX R a 7\nKPX R aacute 7\n" +"KPX R adieresis 7\nKPX R ae 35\nKPX R aring 7\nKPX R e -15\nKPX R eacute -15\nKP" +"X R hyphen -48\nKPX R o -17\nKPX R oacute -17\nKPX R odieresis -17\nKPX R oe 22\n" +"KPX R u -11\nKPX R uacute -11\nKPX R udieresis -11\nKPX R y -15\nKPX S A -22\nKP" +"X S AE -22\nKPX S Aacute -22\nKPX S Adieresis -22\nKPX S Aring -22\nKPX S T -42\n" +"KPX S V -10\nKPX S W -16\nKPX S Y -31\nKPX S t -18\nKPX T A -27\nKPX T AE -27\nK" +"PX T Aacute -27\nKPX T Acircumflex -27\nKPX T Adieresis -27\nKPX T Agrave -27\nK" +"PX T Aring -27\nKPX T Atilde -27\nKPX T C -29\nKPX T G -30\nKPX T J -79\nKPX T O" +" -29\nKPX T OE -7\nKPX T Oacute -29\nKPX T Ocircumflex -29\nKPX T Odieresis -29\n" +"KPX T Ograve -29\nKPX T Oslash -29\nKPX T Otilde -29\nKPX T S -43\nKPX T V 10\nK" +"PX T W 5\nKPX T Y -10\nKPX T a -60\nKPX T ae -33\nKPX T c -88\nKPX T colon -136\n" +"KPX T comma -108\nKPX T e -83\nKPX T g -92\nKPX T guillemotleft -122\nKPX T guil" +"singlleft -122\nKPX T hyphen -94\nKPX T i -58\nKPX T j -80\nKPX T o -85\nKPX T o" +"slash -54\nKPX T period -136\nKPX T r -54\nKPX T s -63\nKPX T semicolon -111\nKP" +"X T u -84\nKPX T v -93\nKPX T w -88\nKPX T y -103\nKPX U A -18\nKPX U AE -27\nKP" +"X U Aacute -18\nKPX U Acircumflex -18\nKPX U Adieresis -18\nKPX U Aring -18\nKPX" +" U Atilde -18\nKPX U comma -76\nKPX U m 6\nKPX U n -19\nKPX U p 0\nKPX U period " +"-101\nKPX U r -41\nKPX Uacute A -18\nKPX Uacute comma -76\nKPX Uacute m 6\nKPX U" +"acute n -19\nKPX Uacute p 0\nKPX Uacute period -101\nKPX Uacute r -41\nKPX Ucirc" +"umflex A -18\nKPX Udieresis A -18\nKPX Udieresis b 25\nKPX Udieresis comma -76\n" +"KPX Udieresis m 6\nKPX Udieresis n -19\nKPX Udieresis p 0\nKPX Udieresis period " +"-101\nKPX Udieresis r -41\nKPX Ugrave A -18\nKPX V A -3\nKPX V AE -12\nKPX V Aac" +"ute -3\nKPX V Acircumflex -3\nKPX V Adieresis -3\nKPX V Agrave -3\nKPX V Aring -" +"3\nKPX V Atilde -3\nKPX V C -29\nKPX V G -31\nKPX V O -31\nKPX V Oacute -31\nKPX" +" V Ocircumflex -31\nKPX V Odieresis -31\nKPX V Ograve -31\nKPX V Oslash -31\nKPX" +" V Otilde -31\nKPX V S -34\nKPX V T 10\nKPX V a -60\nKPX V ae -33\nKPX V colon -" +"124\nKPX V comma -129\nKPX V e -52\nKPX V g -53\nKPX V guillemotleft -75\nKPX V " +"guilsinglleft -75\nKPX V hyphen -43\nKPX V i -60\nKPX V o -56\nKPX V oslash -53\n" +"KPX V period -154\nKPX V r -46\nKPX V semicolon -114\nKPX V u -15\nKPX V y -19\n" +"KPX W A -8\nKPX W AE -14\nKPX W Aacute -8\nKPX W Acircumflex -8\nKPX W Adieresis" +" -8\nKPX W Agrave -8\nKPX W Aring -8\nKPX W Atilde -8\nKPX W C -8\nKPX W G -7\nK" +"PX W O -5\nKPX W Oacute -5\nKPX W Ocircumflex -5\nKPX W Odieresis -5\nKPX W Ogra" +"ve -5\nKPX W Oslash -2\nKPX W Otilde -5\nKPX W S -24\nKPX W T 5\nKPX W a -20\nKP" +"X W ae 10\nKPX W colon -88\nKPX W comma -66\nKPX W e -6\nKPX W g -7\nKPX W guill" +"emotleft -31\nKPX W guilsinglleft -31\nKPX W hyphen -2\nKPX W i -43\nKPX W o -10" +"\nKPX W oslash -7\nKPX W period -90\nKPX W r -29\nKPX W semicolon -69\nKPX W u 2" +"\nKPX W y -2\nKPX X C -46\nKPX X O -43\nKPX X Odieresis -43\nKPX X Q -44\nKPX X " +"a -7\nKPX X e -30\nKPX X hyphen -75\nKPX X o -31\nKPX X u -31\nKPX X y -53\nKPX " +"Y A -24\nKPX Y AE -27\nKPX Y Aacute -24\nKPX Y Acircumflex -24\nKPX Y Adieresis " +"-24\nKPX Y Agrave -24\nKPX Y Aring -24\nKPX Y Atilde -24\nKPX Y C -51\nKPX Y G -" +"52\nKPX Y O -53\nKPX Y Oacute -53\nKPX Y Ocircumflex -53\nKPX Y Odieresis -53\nK" +"PX Y Ograve -53\nKPX Y Oslash -53\nKPX Y Otilde -53\nKPX Y S -55\nKPX Y T -10\nK" +"PX Y a -60\nKPX Y ae -32\nKPX Y colon -135\nKPX Y comma -107\nKPX Y e -78\nKPX Y" +" g -81\nKPX Y guillemotleft -115\nKPX Y guilsinglleft -115\nKPX Y hyphen -91\nKP" +"X Y i -57\nKPX Y o -83\nKPX Y oslash -54\nKPX Y p -35\nKPX Y period -135\nKPX Y " +"semicolon -110\nKPX Y u -46\nKPX Y v -39\nKPX Z v -50\nKPX Z y -61\nKPX a j -87\n" +"KPX a quoteright -56\nKPX a v -28\nKPX a w -21\nKPX a y -38\nKPX aacute v -28\nK" +"PX aacute w -21\nKPX aacute y -38\nKPX adieresis v -28\nKPX adieresis w -21\nKPX" +" adieresis y -38\nKPX ae v 21\nKPX ae w 21\nKPX ae y 10\nKPX agrave v -28\nKPX a" +"grave w -21\nKPX agrave y -38\nKPX aring v -28\nKPX aring w -21\nKPX aring y -38" +"\nKPX b v -12\nKPX b w 1\nKPX b y -22\nKPX c h -3\nKPX c k -9\nKPX comma one -14" +"4\nKPX comma quotedblright -119\nKPX comma quoteright -136\nKPX e quoteright -41" +"\nKPX e t -29\nKPX e v -22\nKPX e w -19\nKPX e x -2\nKPX e y -33\nKPX eacute v -" +"22\nKPX eacute w -19\nKPX eacute y -33\nKPX ecircumflex v -22\nKPX ecircumflex w" +" -19\nKPX ecircumflex y -33\nKPX eight four -58\nKPX eight one -75\nKPX eight se" +"ven -68\nKPX f a -38\nKPX f aacute -38\nKPX f adieresis -22\nKPX f ae -11\nKPX f" +" aring -38\nKPX f e -55\nKPX f eacute -55\nKPX f f -42\nKPX f i -36\nKPX f j -59" +"\nKPX f l -25\nKPX f o -62\nKPX f oacute -62\nKPX f odieresis -27\nKPX f oe -20\n" +"KPX f oslash -32\nKPX f quoteright -56\nKPX f s -41\nKPX f t -6\nKPX five four -" +"52\nKPX five one -86\nKPX five seven -72\nKPX four four -62\nKPX four one -66\nK" +"PX four seven -93\nKPX g a -10\nKPX g adieresis -10\nKPX g ae 16\nKPX g aring -1" +"0\nKPX g e -4\nKPX g eacute -4\nKPX g l -33\nKPX g oacute -8\nKPX g odieresis -8" +"\nKPX g r 0\nKPX guillemotright A -43\nKPX guillemotright AE -39\nKPX guillemotr" +"ight Aacute -43\nKPX guillemotright Adieresis -43\nKPX guillemotright Aring -43\n" +"KPX guillemotright T -121\nKPX guillemotright V -71\nKPX guillemotright W -29\nK" +"PX guillemotright Y -114\nKPX guilsinglright A -43\nKPX guilsinglright AE -39\nK" +"PX guilsinglright Aacute -43\nKPX guilsinglright Adieresis -43\nKPX guilsinglrig" +"ht Aring -43\nKPX guilsinglright T -121\nKPX guilsinglright V -71\nKPX guilsingl" +"right W -29\nKPX guilsinglright Y -114\nKPX h quoteright -49\nKPX h y -32\nKPX h" +"yphen A -26\nKPX hyphen AE -20\nKPX hyphen Aacute -26\nKPX hyphen Adieresis -26\n" +"KPX hyphen Aring -26\nKPX hyphen T -95\nKPX hyphen V -41\nKPX hyphen W -1\nKPX h" +"yphen Y -92\nKPX i T -58\nKPX i j -142\nKPX k a -6\nKPX k aacute -6\nKPX k adier" +"esis -6\nKPX k ae 21\nKPX k aring -6\nKPX k comma -53\nKPX k e -29\nKPX k eacute" +" -29\nKPX k g -38\nKPX k hyphen -99\nKPX k o -30\nKPX k oacute -30\nKPX k odiere" +"sis -30\nKPX k period -81\nKPX k s -9\nKPX k u -3\nKPX k udieresis -3\nKPX l v -" +"83\nKPX l y -93\nKPX m p 22\nKPX m v 14\nKPX m w 15\nKPX m y 3\nKPX n T -42\nKPX" +" n p -5\nKPX n quoteright -47\nKPX n v -21\nKPX n w -12\nKPX n y -31\nKPX nine f" +"our -51\nKPX nine one -75\nKPX nine seven -66\nKPX o T -85\nKPX o quoteright -39" +"\nKPX o t -22\nKPX o v -21\nKPX o w -6\nKPX o x -26\nKPX o y -31\nKPX oacute v -" +"21\nKPX oacute w -6\nKPX oacute y -31\nKPX ocircumflex t -22\nKPX odieresis t -2" +"2\nKPX odieresis v -21\nKPX odieresis w -6\nKPX odieresis x -26\nKPX odieresis y" +" -31\nKPX ograve v -21\nKPX ograve w -6\nKPX ograve y -31\nKPX one comma -91\nKP" +"X one eight -86\nKPX one five -67\nKPX one four -119\nKPX one nine -75\nKPX one " +"one -62\nKPX one period -119\nKPX one seven -141\nKPX one six -111\nKPX one thre" +"e -61\nKPX one two -47\nKPX one zero -94\nKPX p t -15\nKPX p y -19\nKPX period o" +"ne -119\nKPX period quotedblright -108\nKPX period quoteright -125\nKPX q c -2\n" +"KPX q u 42\nKPX quotedblbase A -3\nKPX quotedblbase AE -3\nKPX quotedblbase T -7" +"8\nKPX quotedblbase V -83\nKPX quotedblbase W -23\nKPX quotedblbase Y -79\nKPX q" +"uotedblleft A -59\nKPX quotedblleft AE -52\nKPX quotedblleft Aacute -59\nKPX quo" +"tedblleft Adieresis -59\nKPX quotedblleft Aring -59\nKPX quotedblleft T -37\nKPX" +" quotedblleft V -14\nKPX quotedblleft W -3\nKPX quotedblleft Y -35\nKPX quotedbl" +"right A -59\nKPX quotedblright AE -68\nKPX quotedblright Aacute -59\nKPX quotedb" +"lright Adieresis -59\nKPX quotedblright Aring -59\nKPX quotedblright T -45\nKPX " +"quotedblright V -14\nKPX quotedblright W -20\nKPX quotedblright Y -35\nKPX quote" +"left A -80\nKPX quoteleft AE -73\nKPX quoteleft Aacute -80\nKPX quoteleft Adiere" +"sis -80\nKPX quoteleft Aring -80\nKPX quoteleft T -59\nKPX quoteleft V -36\nKPX " +"quoteleft W -24\nKPX quoteleft Y -56\nKPX quoteright A -140\nKPX quoteright AE -" +"149\nKPX quoteright Aacute -140\nKPX quoteright Adieresis -140\nKPX quoteright A" +"ring -140\nKPX quoteright comma -196\nKPX quoteright d -126\nKPX quoteright o -1" +"31\nKPX quoteright period -220\nKPX quoteright r -145\nKPX quoteright s -140\nKP" +"X quoteright t -114\nKPX quoteright v -108\nKPX quoteright w -105\nKPX quoterigh" +"t y -118\nKPX r a -20\nKPX r aacute -20\nKPX r acircumflex -20\nKPX r adieresis " +"-20\nKPX r ae 7\nKPX r agrave -20\nKPX r aring -20\nKPX r c -24\nKPX r ccedilla " +"-28\nKPX r colon -81\nKPX r comma -97\nKPX r d -14\nKPX r e -12\nKPX r eacute -1" +"2\nKPX r ecircumflex -12\nKPX r egrave -12\nKPX r f -18\nKPX r g -11\nKPX r h -1" +"9\nKPX r hyphen -120\nKPX r i -28\nKPX r j -35\nKPX r k -29\nKPX r l -47\nKPX r " +"m 33\nKPX r n 6\nKPX r o -19\nKPX r oacute -19\nKPX r ocircumflex -19\nKPX r odi" +"eresis -19\nKPX r oe 18\nKPX r ograve -19\nKPX r oslash -19\nKPX r p 28\nKPX r p" +"eriod -125\nKPX r q -11\nKPX r quoteright -37\nKPX r r -13\nKPX r s -24\nKPX r s" +"emicolon -69\nKPX r t 17\nKPX r u 17\nKPX r v 24\nKPX r w 24\nKPX r x 2\nKPX r y" +" 13\nKPX r z -19\nKPX s quoteright -48\nKPX s t -13\nKPX seven colon -148\nKPX s" +"even comma -140\nKPX seven eight -79\nKPX seven five -84\nKPX seven four -111\nK" +"PX seven one -67\nKPX seven period -165\nKPX seven seven -62\nKPX seven six -99\n" +"KPX seven three -72\nKPX seven two -69\nKPX six four -46\nKPX six one -61\nKPX s" +"ix seven -48\nKPX t S -35\nKPX t a -20\nKPX t aacute -20\nKPX t adieresis -20\nK" +"PX t ae 8\nKPX t aring -20\nKPX t colon -102\nKPX t e -37\nKPX t eacute -37\nKPX" +" t h -7\nKPX t o -39\nKPX t oacute -39\nKPX t odieresis -39\nKPX t quoteright -9" +"4\nKPX t semicolon -80\nKPX three four -52\nKPX three one -74\nKPX three seven -" +"67\nKPX two four -92\nKPX two one -66\nKPX two seven -71\nKPX u quoteright -38\n" +"KPX v a -6\nKPX v aacute -6\nKPX v acircumflex -6\nKPX v adieresis -6\nKPX v ae " +"20\nKPX v agrave -6\nKPX v aring -6\nKPX v atilde -6\nKPX v c -25\nKPX v colon -" +"71\nKPX v comma -113\nKPX v e -13\nKPX v eacute -13\nKPX v ecircumflex -13\nKPX " +"v egrave -13\nKPX v g -11\nKPX v hyphen -24\nKPX v l -82\nKPX v o -21\nKPX v oac" +"ute -21\nKPX v odieresis -21\nKPX v ograve -21\nKPX v oslash -21\nKPX v period -" +"139\nKPX v s -19\nKPX v semicolon -62\nKPX w a -6\nKPX w aacute -6\nKPX w acircu" +"mflex -6\nKPX w adieresis -6\nKPX w ae 20\nKPX w agrave -6\nKPX w aring -6\nKPX " +"w atilde -6\nKPX w c -10\nKPX w colon -71\nKPX w comma -70\nKPX w e -1\nKPX w ea" +"cute -1\nKPX w ecircumflex -1\nKPX w egrave -1\nKPX w g -3\nKPX w hyphen 1\nKPX " +"w l -50\nKPX w o -6\nKPX w oacute -6\nKPX w odieresis -6\nKPX w ograve -6\nKPX w" +" oslash -3\nKPX w period -95\nKPX w s -18\nKPX w semicolon -62\nKPX x a -2\nKPX " +"x c -29\nKPX x e -25\nKPX x eacute -25\nKPX x o -26\nKPX x q -30\nKPX y a -17\nK" +"PX y aacute -17\nKPX y acircumflex -17\nKPX y adieresis -17\nKPX y ae 10\nKPX y " +"agrave -17\nKPX y aring -17\nKPX y atilde -17\nKPX y c -35\nKPX y colon -81\nKPX" +" y comma -117\nKPX y e -24\nKPX y eacute -24\nKPX y ecircumflex -24\nKPX y egrav" +"e -24\nKPX y g -21\nKPX y hyphen -24\nKPX y l -93\nKPX y o -31\nKPX y oacute -31" +"\nKPX y odieresis -31\nKPX y ograve -31\nKPX y oslash -31\nKPX y period -144\nKP" +"X y s -30\nKPX y semicolon -72\nKPX zero four -58\nKPX zero one -81\nKPX zero se" +"ven -73\nEndKernPairs\nEndKernData\nEndFontMetrics\n" +; +int n022003l_pfb_len = 45758; +char* n022003l_pfb = +"\x80\x1[\x6\x0\x0%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05\n%%CreationDate: Wed D" +"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" +"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" +" (GNU General Public License) for license conditions.\n% As a special exception," +" permission is granted to include this font\n% program in a Postscript or PDF fi" +"le that consists of a document that\n% contains text to be displayed or printed " +"using this font, regardless\n% of the conditions or license applying to the docu" +"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" +"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" +" file COPYING (GNU General Public License) for license conditions. As a special " +"exception, permission is granted to include this font program in a Postscript or" +" PDF file that consists of a document that contains text to be displayed or prin" +"ted using this font, regardless of the conditions or license applying to the doc" +"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" +"W)++ Design & Development) readonly def\n/FullName (Nimbus Mono L Regular) reado" +"nly def\n/FamilyName (Nimbus Mono L) readonly def\n/Weight (Regular) readonly de" +"f\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -100 def\n/" +"UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusMonL-Regu def\n/Pa" +"intType 0 def\n/WMode 0 def\n/FontBBox {-12 -237 650 811} readonly def\n/FontTyp" +"e 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding Stand" +"ardEncoding def\n/UniqueID 5020945 def\ncurrentdict end\ncurrentfile eexec\r\x80" +"\x2;\xaa\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35" +"\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9" +"%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3" +"&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed" +"\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95" +"\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b" +"\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>j\"a\xc6\xf4\xe6\xcb\x13\x85\\\x81u\xe3\x14\x17\xd1" +"\x90\xd0\x36\xb3\x87\xd3\x95#D\xa9P\xf4\xd8\xc7x\x1b\x30z\x9M\xf1\xec\xae\xe4\xd2" +"\xc2\xfdt{\xc6\xf7\xf9\xc6\xbd\xe\x90\xc1\x92\x94\xf9l\x8c\\\xfe\x88\xfb\x34\xc4" +"wWJ\x1b\x16\x30\xb8\xccY\x15)\xe5\x9b yM\xa3.a\xde\xcd\xa8\xab\xbd\x1a\xe9V\xcft" +"\x1*\xa0\x1d\x42\xee\x1\xe8\x61\xb0\xaah\x97\xc8\x64x\x8a\xe5\x9d\xef\x43\xc4\x93" +"$o\xdb\x1a\xcaUL\x12YK\xc7\xb3\x36W\xa9\xec\xc9\xe3\xd1G.\xf8&\x7?c+\xe5@\xc3_\xf6" +"\xfb@Vgs\xf3\xbb\"\x4\xd3\xa5y\xa0\x8c\xcb\xc8\x44\xc1K\x18\xc3P\xf0\x3\xb9\xda#" +"\xa5p\xc3\x62\xd6\x0\x38\x93\xca\x32\xf8oY\xb8)\xc7\x8e\xe3\x18\x8bn?\x7f\xa8\x1d" +"\x7f\x62(%\xc6\x39\x63\x8d\xfbx\xb7\xaf\x1fP\xf[E\xf\xa5M\xbf\xa5\xcb\xa2w\xc7\x94" +"\xec\xe9\x32u\xa3\xde\xb\x45/\xdc\x8d\xdc)\x93\xba\xa4/(\xa6\x36\x0\x8c\xdc\xb0>" +"\xbfq\xbd\xca\xf3P\x19w\x89\x93\x44?\x88\x41*\xd2\xad\rqU\xa3\x94\x46\x6\x46\x32" +"f2-\xbc\x2\x44\xb0}\xa1\xe9\xc2z'\xb5\x96\x64\xe8VmzT\xcc\x3\xe9\x95\xaa\xd0\x8\xb0" +"\xa1~,>\xf6\x1fr\xc\xe7\xf7x\x85\x99\xc4\xe4Lp\x9c\xd5\xc3\x1b\x11\x10\x7f\x16\xad" +"p\xb1{\x9a\xfe.\x8c\xd9\"\xa7\x42\x8d\xac\x17\x14'\xff\xafQ\x6s\x7\xfa\xb0\xad\xb5" +"0\xe7\x1\xfd\"\xda\"\xc4\xcd\x30\x64\x6{\xd4\xf6\x8\x9cK,\x87\x93}\xd4&\xe4\xe9\xd2" +"\xf6\xe`\x82\x88\xba\xc9\x5\x65T\xd0IG\xe6\x92\x0\x61\xe3y\xcf^\x81\xbf\xd3/\xd3" +"~\xfa\xc1\xf6\x1c\xeb\xeeU\x1b\x8QQdq\xa7G,`\xdf\x89\xda\xa9\xeb\x1d\xc5\xa6~G\x97" +"E>i\xb9\xe2+\xafN<\xca\x41\x92\xd6\x3)[\x1\x8cJ\xb6\x9d\x18\xdeR\xdf\xdf\x15\xe9" +"kU\x7f)\nK\x8c[\x1ezl\xac\xa8\x1f#Q\xb9z\xdf\xc3i\x95\xab\xa4\x38\x3\xa6\xe5\xac" +"\x4\xa3\xc9\x34\x95\xf6\xd3\x81\x6\xb8\xb1\x44\x44\x9c\x7\xd1\x35\x82\x10\xf9\x17" +"n\x15\x65r6<\xfb\xdeWk\xfd\xf9\x9f\xa3)\xdd\x13\x46\xe8?y\xe0l\xf6\x82P\xcaW\xa6" +"\x89\x31\xbc\x7f\x34*\xd2\x95\xd0\xcb\xa1z\xa9[\xb8\xee\xb5>\xa6\xe8\xe6`\xb8\x14" +"\xe9\xf8W\xce\xcb\x14\xf4JC(\x8bi\xa9\xe7\x90\x8dU\xbf\x19\xe8\x44\x35\x98y\xd2\x8c" +"\xae\xf1\xc3\x8a\x36\x42\x1\x85\xd2\r\xfb\x32\xc2\xe0\x2 (\x0\xe8\xef=g\xc5\xd5\xe" +"\x91\x96W\xca\x95\x8bS\x8dS}P4D\x86S1\xd7\x9b\xfc@1 h\xd7#dP;\xd0\xcc\x84\xb5\xf3" +"\nt\xd8\xb5\xb6\xa2j\xf2\xdbvEd\xfb\x65\xa6\xba\x8f\x90Q\xae+N\xa4X\xd4jEi\xf3\xc" +"nw\xdc\x9sVw\x3\x62\xe6\xcf?\x16\x61\x7Gx\xeb\xb4O\xf7\xd1\xe3\xb6O\xf7^w\xe1\x1f" +"\xe5%\xbb\x12\x1c\x65\x46\xcf\xd1\x33\x0\xca\x1f\x2\xd5q\xb8*X%\xe6\"m\x14\xfd\xcf" +"'\xf0m\x87\x45*\x8bl]\xca\x65\x85\x35\xce\xe2\xa7\x95\xe5\x81\x37\xd4\x8eVki\xd5" +":\xc;vn\x84\xc5\x1e\xaa\"\x1c\x46\x99\x9c\xc8\x6Z\xdb/\x12\x9d[c\xf\xab\x18\x14\xc0" +"\xc3;Z\xea\xe\xfb\xb6\xe9\x94\xd8\x9\x41\xb5\x30y\xaf\x96\xd9\n\xb\x92O\x9b\xe\x31" +"\x9b\xed\x98\x36\xb8\xf9\x5?\x86\x83\x63\xd3\xcaUL\xbb\x18\x18\x63\x30\x1f\x8c\xb9" +"@\x87.\xd5\xfa{\xd1\x8c\xe3\x92\x18\xb5\xad\x8a\xc5}\xfu-\x94\x10v\xb1\xc6M\x99\xbe" +"\r\xb8mzm\x96Q\rw.\xb2LX\x7f\x11w\x9b\xd2\x1c\xfe[\xde\x1f)\xc1\xef\x90\"\xb2\xb8" +"\xbc\xd7\xf9\x11S\xc8\x45\x90g\"Gx)\xc4\x1\x11\xd8\x10H\xf<\xf6-\xe8\xdb\xa7\xfd" +"\x86\xcd#nef\x18\xca\xf6\xfc\x46\x82\x7f\xbcH\x98\xeavr\xf8\xc9\x97\x1a\xfe\x43\xe0" +"\xe0\x1e\xc8\xb7}J\xf4\x8c\xbf\x12\x10\xe9\x8c\x1d\xb1\\\x16\xd1I\xbf\xf5\x8a\xb0" +"'\xc\xf0\x15\xb1\x7\xa3\xa5\xf]\xc8\xf3\x7f\xfb\x92\xee\xc8\xcbgx\xdd\xb7\xceJ\xab" +"\xc4\x64\xc4\xaf\xf6T\"0\x6\xa5P\xebRHZ#\xd2\xb4\xaaq\x98\xd3\xcdTA\x81\x2\xf1\xe9" +"\xa4\xfb\xde\x37\xb8\x41\xe5o\\,S\x96m\xb9\xb6k\x0\xe\x45\x88(.?\xb8\xc,Q\x93\x39" +"\xf0\x0-/\x83\xc9y\xed\xc5\x82z;<\x8e\xf8\x81\n\xf\x9d\xac\xb6\xb9\x99\x8e\x9a\xf6" +"U\x1fV1=\xc4\x1\x19\x4\xcb\x97\x9a\xa2\xd3+\x11\xa8\x11\xbc$\x81\x41\xe4\xb9sM\x9f" +"\xb7\x98*Vq\x0-\x82y\xca\xb9:\xbe\x5ttb\x8d\xef\xc9]C\x89\r\xb1\xed\x34\xcf\xa8\xa2" +"\xb\xdc=\x87Nvy\xa3\x96\x15\x8eR.\xd0\xab\x96\x9aN>\xc7\xe4GN\x19%\x90PMT\xde\xb7" +"\xb2`\xb7\x93\\NVT\x8a}\x12\x1a\xc1\xf7\x41\xf8\xcd\xf2Y\xea\x1bX\x13\x17Zw\xa1\xd2" +"\xd3\xb\xa2oe\xebvZ\x4\xc0\x9e\xd5\x1fi\xf4\x15Q\xad\xf3\x99\xe6\xaa/\xc0\x97\x88" +"\x13{\xeaI\x13\xf1{\x8e\xb8\x38\xc3\x8f\xb2r\x1f\xdc\xb5_\xd6V\x97\xff\xb\x85\xe" +"}=\x1c\xe2\x66\xbf\x90\xf7\xec\x6\xa9\xa0\x87k\xdf\xe7g\xd3\xa9\x18\xb0\x92\xfcx" +"\xc7u\xf9\x45\xcf\x1f\x96\xe8Y\xc0=\xbf\x63\r\x9a\x94\x9\x39\x65L5I\xd8\xf7\x92\x1c" +"\xb9N\xe2=Z\x5\x35\xde\x9d\xf3\x1e\xa0\xf9\x37\xf8`\xb4\xf2 \xa9\x9a\xdd\xfc\x34" +"=|\xf7\xbf\xa0\xb8\x3\xc1,&@?\r\xcf\xfc\x8e\xa7\x86\xd0\xd8\xa8\xd9\xc3gA\x9c\xa8" +"\xae\x41\x19\xc\xe9:\x80\x86X:\x1el\x9dp\xb6\x12\xc8M\x87\xd2\xee\xaaq\xec-\xc1/" +"L\xdej\x82\x13\x3\xd5\xf6\xa9\xbb\xdb~\xed\xcd(\x9e\x80\xfa;u\xf4\x7fH\x1bPq\x9d" +"\xcfJ\x14 i95\x93\xb9\xaf\x9c\xce\xea\xecV\xa3[\x87\x87\x19=|\x88\x11>\x9e\x1e\"" +"\x1d\x15\x1e\x9;\x1\x9e\xf8\x9f\x61\x18\xbe\xc4sQ\x3\xcc\x80\x3\xccZ\xd1\xb6r{2&" +"\xcd\x44\xc4\x97\xdapR\xddh\x16\x95\xdb\xec\x33\x97\xf9Y\x8c\x91wp\x1cs\xbf\x5\x94" +"\xce\x93\xf2=P\xec[\xee/\xb9\xda\x1f\xc9\x66\xdf\x14\x8b'\xb2\x8e\xe3\xc8\x95&\xdd" +"f%\xe2\x88\x7f\x9f\xa0v|\x12|`\x9e\xe3\x15\x62k\xc1M'O\xbe\xa5\x65(\xdc\x6\xa2{-" +"GmF\xe9\xe7\x91\x65\x90\xb1V\xa5\xdf\x4\xa6\xcb\x15\xe3\x62\x45\xd7p!v{n[\xdf\xcc" +"g\x96p&?\xd8\x91\x44l3q\xb1\x1b\xb6\xe1\xdf`\xf9`\xaa\xb4\x14\x9dwS\xe6\xa5\xc3\x38" +"\x10\xc4,\x8b\xffN\x93P\x3\x38\x85\x6\xf8'\x8b\xd7\xcbg/\x13.\x6Z\xe6\x84\xdc\xa0" +"\xb9\x6M\x1\xdd\x62\xe\x7f\xfd\xfe\x4\xf1\x42w\xef\xe8\xe6\x1Y\xba\xf\xca?\xe2\xf2" +"\x8b\x90-J\xc2u\xd1\x9f\n\xc6\x97\x1e\xbe\x82|J#-\x87\x65\r&\x88\x34[\xcax\xf8y\x7" +"q\x14\xf0\x46<_\x5\x81\x7\xb6iVo\x81q\xe4\xe2\x84\xd2x@U\x80\xf0K\xff\xc9\x90'\x84" +"!n\xc\x9a\x17\xaa\x9b)5\xe6n\x18\xa7\x83\xf7#\xbe\x4\x43\x89\xb7\xe9\xd6*\xa3h\x18" +"\xff.\xa4\x6\xc3\xc1\xa9\xd2\xf3\x43o>\xe7\xdb\x8b\xe8j\xfa\x8d\xaajK\x1b\x84\x61" +"\x13P\xd8\xd2v\x5P\x96\x12\xb5\x15\xe1j\xa8\x43\x16M]\x8\x5\xe3j+\x9e\xf7L_j\xb\x9d" +"Y\xa0KUiq#'\xf4\xb1\xb3\xe\x95\x87\xcd\x10\x33\x37\x63\x99g\xcb\xdc\x65Z\xa4n\x80" +"\xd2\xcf\xd2K\xebP\x81[S8\xe5\"\xb3\xa7\xaf\xe8\x36*\xb4\xf0]\x8b\xc5+\xba\x9cP\x89" +"\xad\xa8\xc8\x95)\xb0'Z\xf4\"\xebT\r1\xa9\x38\xb8t\x8`uc%\xb9\x66\xb3h\x17\x11R\x13" +"\xfa\xaf\x92\xde\x63\xf6\xba\xe1\xe0\x6K\xfb\xc5X\x80\x98\xb6\x1e\xb8\x1e\x44\x90\xad\x1a\xc7\x93\xbd(\xfc\xd5\xef\xel\xc3\xe" +"\xf3\x9a\x8\xc5/q\x93\x9b\xc\xef\x62\r\xc6\x9e\x31\xe3\x9dm\xb9i\x4\x90\x31\xb0\xc9" +".\xf2\xdb\x65=\x97\xf3p\x14\x14V\xa5)\x85\x7k&\x86R\xfa&H\xc7\x92x\xb\xad\x63|Mu" +"\x81\xfb-b\x1\x1dW\xe2\x93q\x94\x87\xcf-\x1f\x1<\xfa\xa5\x32\xe1\xc2\xd3\x91x\xd5" +"\x12r\xa6\xaf\x4\x14@\xbc\xa1t\xb5\xcc\x90+\xd7\x39\xc}6\x95\x5l\xb4\xbdw\x91\xf9" +"\xfbm\x88\xe7\xa7\r\xef,\x97\x86\x9f]\xbc[\xd8#\xc5\x17\xc7\xb7\xc3\x9d\x62M\xf6" +"'\xdc\x96S\xeaSG\xbf\xda\x80\xb7#\xf0_m\xbbL\x9e\xa5\x1\xd8\x62\xac\xe0[\x9d\xbd" +"\xf2\x1bpV\xfb\xcd\x8cmK\x85\x87=\xce\xe6\x16l\x8bZ\xdc\x3\x16\xca\x12\xd9\x63\x9f" +"6\x1b\x15\xa4/\x0\xe1\xd6.\xdb\xca\x11\x11\x97/\xa0\xf4WX\xbe\xcb\x31\xdb\x38\x31" +"o<\xdf\xe1\xb4\x17H\xc9>\xd5\x8bg\xe9\xb5z\xbb\xedY$\xa6\xd5>\x99\xfb\xc9\xa9\x94" +"\xa6H\x9a\x8b\xdf\x13\xebhUH\xb4\xdcmb\xdat&\xc2\"'\xd4\xd4;o\xfc{^\xa9\x1c\x89g" +"0%>\x89\x41\xaf\xeeX\x83Y\xc2\xbe\xcfo\xfc\x41[\x9e\xb6\xd3\x1c\xcb\xfl\x7f\x85\x85" +">dI\xfambz\x97\xa3\xce\x83\x3\xf1H9:\xdc\xcc\xdf\xa2\xfe\x8\\i\x8\xbe\\<\x5\xaf\x0" +"\xa6\xf0(@ l2S\xa5Y\xac\\\x4\x9b\xdd\xfd\x11\xad\x9b\x11\x84\x3\xb8M\xa1\n\xe3\xc4" +"p\xcb\x9a\x9a-\x1d{s/Y\xf5\xfe\x14m\xed\xa6\n\xe7P\xf5Q\xaa\xc9\x34\x62\x1b\x44p" +"\xe1\xbc\x32LCc\x3\xe2_\x81\xd0\xdc\x31\x88\xbe\ro\xecT\x14\xc2\xeL\xb1\x89R\xe1" +",\xb6\x42=\xf7\x12\x46'\xac\xde\x14U\x0\xd7z\x97\xa8\xbf\xd9\xcbP\xd1\xfa\xa0\x8" +"\xe2\xce+%\x5\xa4t\x9f\x1e\xbb\xb0\x92\xc3G\x2\x37\x14\x5Z\x9b\x63\x35:\xf9\xe7\xfe" +"\xe0[\xb5L\x98\x43i\x81\x1\xf7\x98\x88\xa9\x15\x31w80\xc2\xc9g\xb5\x88\xd3\xac\xd2" +"\x19(\x83\xd5\xce\x39\x62\xd5\x10\x84\xfc\x65>\xae,_\xb2\xda\x41\xda\xce\xfb\\v\x81" +"-.\xdb[\x10\x96w(\x9c\xd1\x99\x8d\x45\x7f\xb1\x2:\x19\xacg)[\xbc\x1a\x9a \xa4&\xb0" +"j6\x8d\xf3\xc5\xdd\x8<\xb1\x18\r(\x7fU\x0\xf2\xc6\x35\xed\xe1W\xee\xfc\xee\xc5P4" +"G8-\x15\xc7H\xc1\xe3_hu9\x92\xe5\xc9\xf\x90\r\xe5M\x18\xf8\xe1\xb3U\xd1\x7j\xdf\xb1" +"\xf3Y\x1\x35\xfa\xd1\xa3o\x2\x8e\x44\xf4\x8a\xbb\x14\x9b\x80\xca\x9aTaMF\x7f\x8d" +"q\xcb\x31\xb\xbcz\xc7\x10\x2\x61\x9-\xb8\xc5\xbf\xd3\x9e\n\xc6\xbc,\x9dl\xbc:\x8c" +"\x5\xff\x8at\xcb!`\x8e\xc4\xa4\xcf\xe4\xcb\xaa-\x5m\xba\x14 a\x6\x4M\xec\xf5\x9f" +"\x95~\xf8\xa9\xca\xdeL\x9b\x19\xd8\xd3\r\xd4\xfd\xe6\xa9T\x8eP\xdbQ\xac\xa7\x33\x30" +"\x14!S\xfc\x36\xb6\x9c\x1c\x8d[&\xd0\xc6\x89\xb7\x4\xe\x81\xac,\x86O\xd7\xc0\x97" +"\xc9\x9b\xe5\x95\x38\x43\xe1r\xc9z\xb5hO5\xfb\x3\xa7%\xa8\x9d\xbf\x37\x1f\x8\xdd" +"\xf4\n\x15\x31\xfc\x1bgm\xb0\xe1T:\xecn\x97\xd3\xd2\xe4\xaa=X1\xd8\xb3\xc9R\xab\xbf" +"\xa1\x12\x35(\x14\xfbo\xab\x61\xa0\xd6\x80\xe6\x64\xfj\xec\x84& \xc\xf6\x12\x86\xf7" +"B,\xb2\xf7\x8c\x61\xeb\xaa\x36\xd4~\xc1m\x7f\xaf\x8bJ\xf3\x1d\x9\xc\xdf\xa2U\xd9" +"\xd7\xc6\x1d\x46\xcf\xb2*}n\x17X\xe7\x1e\xd5g\xe0\xc\xbd\x8e\x8f\x46\x8d\xdf\xb4" +"w\xf0\x91\xa2\xf9\x15\x62\x7f\"\xffG\xb8vTK\xc1\xf0;k\xbb\x98\x38_\x0\x9c \xbb\x1a" +"\xa2\xa7\xa7\x86ti+\x8e\xac.<\x80i\xb7\x9eg\x93\x38\xdaW\xf7)v\x81\xf\x84[\xebk\x9a" +"\xdd\x32\xb9]x\xe5\xe6\xf\x16\xdd\x16h\x9c\x5\xfd\x82\xd3j1\x15\xbe\x8e\xd4\x94\xa7" +"M\xd2\x11\xd5\x8a,\xdf\x98?\xcb\x9c\xdc)\xbf\x7f\xe)\x98\x8f\xa2\x35`\xed\xf5\x14" +"\xbc\x1d\x18?;*\"\xc0\x9f\xb1y\xb4~\x5\xad\xefH\xdf\x2\xf3\x1c)\x87]\x19\x15\x3{" +"\x19@wd\xa4)/\xe4Nt\x16Q\xa8\xe3\xbe\xb5\xf0\xd9r\xb6\x32p\x90\xf6\x64\x41|\x84\xf8" +"O\xfb\xf0\xaf\xff\x8b\x1d\x85\xc8\"\xd9\x7\x30\xab\x41@\xc4*Q\xaa\x8b\x1d\xbe\x43" +"\x98N\xa8V`@\xeb\x8b\x34\x1c\xce#\xfd?i\xdd#Z\x8\xb\xa5\xc6\x9a\xec\xb9\xbcs+\xc2" +"\xd7\xd4\x6\x17\xdd\xa6\xb7\x9f\xb6\xee@\xc3Ul}\xf9\xb2=\xad\x89\xe9@T\xb1\x34]\xb8" +"@*\xe6y\xfc\x46U\xa4\xa7v\xc0\x15\x4\x63\xf8\xdb+\xfc\x6\x8\xea\x1f\x12N\"\x1d\xda" +"\xe6\x2k^]\x0z~J\rk;\xc\xf3\xa2\x66\x9eg\xc5\xe4\xf0\x15Q\x96j{\xc4\x8f/Kj\x87\xe7" +"@\xd8\x9^c\xf7|z\x2\x7f&\xb5/\"\x99\xde[\x8a/b\x9\xbc\xf3\xd3\x1c\xb0#_\x99\x8fx" +"\x1e\\\xc8\x1e\x31\xdc\x42N\x0\x8d\x46\xec\x9 )Q\xe5hH\x4\xa0Y.\xa4}lx\x8a H{\xea" +".\xc8\xf2\xe6\xc1\xd7\xf3x\xb6-\xb4<\xa4\xe4\x8e%\xffI\xd5\x87\x1b\xd3" +"\xe6\x6R)\x8f\xe3\xe8\xd4\x0`\x9e#.\r\xdcyL\x5y\xac\xef\x89\xe8\x41\xb2\xed\xcaP" +"\xd5\x11Q\xf6^\x8c\x1c\xc3\xb0\x1e\xf1\x87\x5X\xf0\xbfWCq\x8c>\x6\x86\x17\xe8\x1b" +"\xfe\x12\xcl\xa1n\x9$\xbf\xc2T\x11w\xd5\x36q\xca\xa3\xab\x64\x1c\x41U}\xcd\xae\x1a" +"4aG\xb5\xe9\x99\xc4T\x1b\x8\xb4\xaf\xcb\xc1\x87\xaf\xd6S\xd5\xb5\xf8\x38m\xf6\xad" +"\x8f\xe6\x9e!\xbd\x5g\xdfIOslj\x18O\xa4\xdeH\xdc\x9f\x34w\x87\xca\x96\xe2\xe0\n)" +"l-\xa0\\*\xd9\xbc\x42>\x9c\xa4(\xd7\xf1\xfa\x12\xdc\x93S\xa3\x2\xfb\x8cR\x9a\xf8" +"h\x8c\xbbT;E\xb2q~\xbf\x8flIy5\xf4\xf3\xbf\xfd(^\x4\x2\xabuD\xb3\xca\x46\x43\xae" +"Z\x8bRP\xed\x98z\x95\xfc\x1f'[\x97\x7\xac\xd0\x64\x1b\xd0\xee*\xe9u\x84\x94\xf8\xd8" +"\xa5\x1d\xce@\x8a\x38\xac \xea\xf0\x85-r\xd8M\xck\xe9s2g\x93\xae\xb9U\xea\xc6\xfe" +"\n(\x13\xa3U\xdc\xd2/o,\xe5\x65\x88\xd1\xc0U\xcd\xdf\xa9\x88x\xbc\xebj\x1\x8d\xb2" +")\"\xd2\xb6\x0\xa2\xf\x81\x84.f]\xf4\x10\x13\xca\x9G\xc4#|+\xd6\nu\xe2\xfd\x1a?\xb8" +"\xc8\xfa\x19HW0\xb8ta\xad\x46j\xcb\x2\xdf\x8c\xa2@\x91O\xb0\x90\xb3\xd2\xb4\x1e\xb6" +"\xb8\xff\x5\xe1\xa5\x9d\x9f\xd6h\xafp\xba[\xb7'x\x95;\xa5_\xc5\xf9\xf6&\x4\x34P\xe1" +"\xd0\x9b\xc8=\x86\x5\x9\x8a\xbe\xf8\x84\x63\x9a\x37\x80\x9a\x32V\\\xbe\xfb?\xf3\x9e" +"\xe5=l\x18\xc5\x8c'+\xb9(\xe4\x41\xe\x36\x1eY\xa5\xf$-itz\x3&\x17\xc5-\xeb\xbf\x62" +"6J\xb5\xa9n\xfa\xf6\x42\xd9\xd8+\xa6y\xb1\xd7\xf\xac\x10\xa4\xeb\x62\xfa\\\xfc\x30" +"\x8e\x86\x36\x8a\xaa\xd7\xe7YH\xf4\x35\x98\xcd\x1cTJ\r@\x91\x37M~\x88\xd4R,\xbe\x90" +"#\x91\x64\x13'\xe8\x88\xe7t\x8f\xa8\x89\xdc\xe6z\xde\x61i\x9e}wv6\x81\xca\xee\x9b" +"\x1c\xa8\x83{/~\xf9\xc1\x8c\xbc\xc5\x38\xc4\x65\xc8\xe2\xdd\x34\x61iS\xcc\xb6\x3" +"\n\",r\x8b\x83I\x11\xc1\xa1y\xe2\xc7p(\x94\x7\xab(\xb3\x3\xe7$\xd9\x7ft}a4\xb4%!" +"jd\xc6\xe0\xb6\xf\x63>+\x85\x30\x0G\xe4\xc9\x3\x39\xce\x3\n\xf\xae\x31\xe8\x30\xc8" +"\xab\xa5\xab\x33\x86\xa3\xb6\x92g5\x1a{\xfd\xd6\x63V\xae^W\xfb)\x94\x45)\x93\xe9" +"\r\xe7\xc4\xe2`\xab\xab\x93\xc3x1\x85je\rV\xe4\x41r\xfe\xca\x1\xd6\xc7\xc3\x80\xf2" +"P\xb8$s\x96\r**_\xb6\xb4\xda\x66\x8f\x46\xe6$\xac\xf7\xfa\xf\xd4I\xfH]d\n:\xdf\xc9" +"\xf8\x65.z8\xceW\x99\xf7p\xc3`m\xb4\xb8\xb9G\xf9\x39g\xf7y\xe3\xa3\xc0W/\x13\xa5" +"\xa1\x87\xd3\x1d{\xd1*\\{\xe2<\xb6\xed\x61\x92\x8\x62\x41\xb7l[\xa6\x98=\xb9\xc9" +">K \x8dp}7`\xf0<\xd6'.\xf3\xa4\xce\x89\xb8\xe5.j\xc5\x87\x1a=\x3\xeb\x97WY\xabK\xe2" +"9\xe5\xecxB\xcb\xb3\x33\xe6\x92\xcc`|r.\x18]<9\x16M\xd3 \xc6\x94V)\xc7\xf\xf6jR7" +"\xc0\xa9R\n\x1f\xadn\xb9\x81`i5\x1a\xb0\xf1\x35\xd9\xc\xc0\x98+\x14}\"\x94\xaeJ8" +"\xa5'\xee@\xbe\x9c\xde%\x12\xaa\xeb\xb5\x90\xe1\x34\x38\x8b\xb1q\xd0\x95j|Ef\xd6" +"Z\x9a\x4\x1b\xe6\xc4\xf8\x83k>\xc3\xd2\xed\x1bH\xb5\x66\xa7\x83)+\x15\xb6\x12y \xd2" +"G\xd4\x94\xf0p\xbb \xbe\xff`d\xb\x11\xb2v\xdd\xee\xe4\x97\x6\xe8\xb2\xb2\x1b\xb4" +"\xb\x7f\x0\xaa\xfcYLI,%\xdc\xa7t\xe0\xb8\r\x82\xe9'D\x8d\xe2\xe7J\x9d\r\xc7\xac\x92" +"`\x9n\xaf\x18{l\xd6\xae\xaam\x1d\xc4 [D\x11\x12'Q\xa5\xb2&\x88@N\xa7\xc5\x86\x17" +"07\x1f\xfa\xc1\xfZ\xfdG'\xa0\xe4\x2\xab^\xa7W`ku\xeb\x86\xa0^\x8fwMnC\n\x1a?\xe2" +"\xa3~\xbb\x6p\x4t#\x9f\xb1\xcf\xa0^\xe4K\x91\xb8\"\x44\xc5u\xb5.\x7f\xaf\x93K\x4" +"\xee\xb0\xd9\x33\xfe\xb5~\xbe\x32mu\x82\x1c\x8b#\xea\xa8[X:\xed\x43 \xb7\xf0K\x9f" +"-\xc5\x91\x9\x12\x16\xfd\xe5.\x6K\xaa\xa9\xc2\xc9\xd9qK\x95\xa4U\x8c!\xf3\xce\xbe" +"bKT\x3\xb3\x15\x8\xf1xX\x1a\xf6\x86\x30\x83\xedv/\x1e.4\xa4\\\xfd\xd7\x16`\xd6&\xff" +"\x86H\xf5\xd6\xc5\xe5\x80\xd4vZg\xfb\x61Y\xec\x80w\xa9\xf0\xa8\x80\x38\xc8\xd3\xd7" +"\xc7\x7f\xf0\x92n!#\xbe\x87O{\xca\xf1)\xd5Z[Y`\xf8$\xbd\x17(\xab\xcf\xccQ\xd2\x39" +"6\xde\x9a%\xc4\x8\xd7\x86\xe4L:+\xaf\xa4\x42\x31w\xad\x6\r!\xd3\x8e\x15\xe2>\xb6" +"\xff\xc0\xb4\x12\xe\x81\x46\x95\xd4#\xee\xfc'D\xa1\xfc\x81\xb4\xdf\x89\xd7o\nh\x3" +"\xd8\xb1NuS\x8c\xaa\xd0:rQ{\x86QOiR\xf6\xfd\x61\x9d\x9e\x91\r\x98\xf\x0\x96M\xb3" +"%1\x8c\x4[\xdfyd\x7f\x45=J\\\xf4\xe6\x1d\xd5\x35\x97\x82\x82r)1\x4\x5\xfb\xcf\x61" +"\x7\xc3\xad\x9d\xde\xf9\xa9\xa3\x39\xd5\xd5\xa6\xeb.x8\xa0\xa4\x32!\xbd\x62\xcb\xdf" +"s-\xb0\xa6\x38\xa5 \x16\xfb\x35\xbawa\xae\xc8\x46\xa0#\xd3\xbf-\x1b\xb1\x83T>\x81" +"\xeb|\xac\x1eYp\xcd\xc6\xf0h\xc5\xea\x11\x8cz\xaeR\x8d\x13\x96\xe6\xdc\x93\x91\x12" +"\xda\x44`\xc8\x90\xea\xd5\xc0\x1b\xdc\x43\x8f[\xb7\x34!\x8b\xa6'\n\xdd\r\xc1w\x8f" +"\xd8\xab\x16\x83\x1dj0+\x81J\x1a\x44\xb0~\xdc\x65\x95l\x9el\xf4\x87]\xf5!\xf3\xce" +"[B/q\x8\x1bmi\xbd'\xfs\x90\x95\xc9\xe8\x1c\x3w\x93J\x8b\xc6\x39\xc\x42\xcNL\xdd\x9c" +"\xf7\xe3%\x44\xc6\x8d\x88N\x15\xac\xa3\xbc\xc0\x7f\xc8\xc1\x32\xd8\xfb\x9du,\x15" +"\xd7\\R\xc2\x88W\xe2\xea\x46\x1ao\xca\xd9\xcV\x84\x35\x13\xf7\x44\x61\xf1\x8dqd\xbc" +"Yz(\xaeK\xa7\xc8n\xe1p55\xa9\xb9\xedP\x12&'q\xfc\x12\xf1\x2\xe8\x0\xe0\xe1\xaf{\xb4" +"f\x81\xbd+\x14\xb6\x14\xce\xa9\x1b{*\xaa\x35#]\xe7l\xe\x11<\x92h\x8f\x8e\xc8\x12" +"w\xd5\x8c\x34\x6w\x8e\x1e\xc1\xcc\x15\xf1\xcd\x9a\x13|\x8f\xfd\xaa\xb9\x9a\xce;\xfc" +"x)\x16\xf1\xa8w\x17\x5\x89\xa9-\xc9!\xe6t\n\"\xb8M\xc6\xba\xcd\xab\xccv\xe6Ly\xe3" +"\xa5\x88\xd8\xf\x8fM7n\x1b\x42o\x15u\x1c\xf7\x39\x11\x2\x10/\n\xfa\xfd\x8b\"\xdf" +"\xde\xb5H\xae\xb5\xf3\xb\x16s\x2=\"\x5J\x13\x39\x1a\xe\xc0\x8d\xe6\xe7\xb6\x85\xa0" +"\xd0\x31\xaa\xbf \xb7\xc6!\x87\xc0(H\x92\xd5\xea\xad\xf1!\xba(&>\xb8\x63\xd5\xe3" +"n\xa9\xc0jw\xcc\xfc\xe\x17\xf5\x93\x96\x15\x91\xf8M\x82\xaf\x82>\xfe\x41\x4L\x8d" +"`o\xef\x83\xcc\xc7\xb0\xe9\x61\xe7\x99M\xf8\xa3\xcc\x36\xb2\x9\xd9S\xe2P\xad\xab" +"\x8d\"\xd7\xf2\xb4\xe2\xc9\xca\x39\xef\xa2\xd9>V\x19\\\x15`\xe3\nQ\x90\xcc[\x17\xfa" +"\xef\xcf%\r\xf7\x9fkbJK\x91~\x11\xc3\x32\"/\xcc\xfe\xc4\xf6\xa4{\xd9\xe7]\xa9\x85" +"O\xc3\xf7\xaeUN\x91\xed\xde\x14Mz\xef\x38\xa0\xe3\xed\xb5\xe5\xa5\x62\x63t\xdb\x94" +"\xf0\"\xc8\xcfT\x90\x93\x4\x1d\xe0\rri\xb7\xceTNt\x84\x39\xba(pq\x8c\x8\xe5\x8f\xb4" +"\xa7}\x93\xeb\xc0KyW\xd2r\xae\x16\x1\xd4\x1b\xf8Z+\xad\xaa\r\xf7;\r8A\xd4\x83\x9c" +"\x85g\x7f\xb2\xe1_\x1dl\xe5\x92\x66\x9f\xf4\xbb\xc9\xc6\x9d\xba\x33M\xc3w\x6\xf2" +"\xf6\xbe\x83\xd5\x86>\x8c\xd6\xa3\xc\x8\x64\n\xacL#6\x84\xe6kO\xe6\xb6-J\x8b\xe9" +"\xd5\x31\xe4{\xefV@\xd9\xb5\xc2}\x99\x0\x92\xbe\x15\x97\xf6\x99\\\x8aw\xbe\x9c\x18" +"\xaa\xe6\xc1\xcf\x13\x7u\xdd\xac\x41\xd3\x44\x38\xfcz\xd8\xe0\x42\xcbV\xcb\xf2\x94" +"I2\xeb\xa7\xd0S\xe9\x37o\xf3\x98\x36tP\xe3Z\x19\x45\xfe#\xe0\\\x92\x10\x96\xa1TT" +"r\x1f\xfd\xf\x42\x9a>\x6\xdc>\xd3o\x1c\x17\xb\xe7\x9c\x66\x99n\xf8\x33z\xff\x85\xb9" +"\xc]:J\x94\x45Z\xe9\xfa\x32\xe2\x11zc\xe5\x90\x1\xf0R\xd5\xf6\"\x31%\xbf\xaf\xa4" +"\x9\x1\xe9\x89`\xad\xf7\xbb\x88g)\xdc\xa8/\xc3\xb8\xccR\xb3\x7f\xf2Qr\x99\xe1\xd7" +"i\x5\x7f\x81T\xfb\x95X/\x2\xcb\xb\xec\xc8s\xa9\xc7\x17\x96\xad\xbd>\x91\x32O\xaa" +"\x94\xf2\xc4\x1c\xf5|0\xb5\x89}\x3\x1c\x2\xd2V\xc9\x9\xe0\x80\xe7\xb\xfd\x1f\x32" +"\xe6\x9e\xf6p1\x13\x8c-\xdc\xd1\xa8\xe4\xb6^H\\#\xc3\xe4P\xab\xdd\x98\x15Q-o4\xa8" +"K\x9d\xb7\x15\xdb,z\x93\xbf\xb4$1n\x1a\xa4\x43\x97t\x9c\xb0\x10\x88\x42\x8f\x14\x9a" +";C$s~\xd9\x95\x7f\xd3\x88$\x84\x62\xac\x1b&\x10\xd7+\xf5\xc0s\xec\xa5g\xe7\x38\\" +"\xc9Y\xe3|\xac~\x5G\x1`\xff\xa5\xa9\xf6;\x8e\x9b\x8)7\xe9\x11Xn\xa1\x65\x37I8\xf4" +"\x92\xed\xf2\x8c\xe6\x2\x9S\xa5\xb5\xcc\xecw7\xf9\xd9\xcc\x85\x38\xc4\x33\x95g\xaa" +"\xed\x37\x94\xab\xa3\xb9\xf4\xea\xe6Tf\xe8\xe3&\xf6\xc3\x99\xb3\x63U\x93_\xbd\xcb" +"\x99r\xf1\xb\x13IM\xc2P\x97\xfc\xecZc\x98\xf2u\xc8\xc1QU\x8et\xc5\x17_{\xaf\x41U" +"\xe3ks?u\xcf\x9d\\Yy\xb0vO\x14\xd8\x30n\x6\xba$\xbfy\x11\x41\xe4\x4\xc6\x9f?\x8f" +"\xcc\xd9\x1b\x9cX\xc2\xc6q\xaa\xe7\xd4\xf9\xe5\xd6\x41NF\xed\x63:_x\xaa[\xf0Ne\"" +"F\xa0\x66\xea\xd9\xe5\x82\xb1\x81\xcc\x19n\xa2\xd3\xcf\xaa\x38;]\xeL\xac\x93\x36" +"\xe1\x19\xc0\x8c\xc6\xacU\xcb\xfb\xae\x14|b;@\x4S\xbb\xf4G\xe9m\xe0\x36\xfc\x2V$" +"8CY\xee\xd7\xc7\xd5\xf7\x85\x8d\xc0R\x13w\xcf\x64z\x15\x7f\xc3\xf1\x88\xde^\xef\x9" +"M\xba\x12U\x10\xfd\xe3LW\r{\xe7j\xb5\xdf\n(\xbf\x45\xdd\xaa\xdb\xea~\xee\xdb\x93" +"c2\xdf\xe9\x30\x81\xe0\xaf\xd3\xfd\xd4k\xed\x8\xd6\x91K.\xfc\xfd\xc4\x16\x62\xa3" +";\x90\xb0=v\xd3OH\xd3\xf\xc6\xbb\xbb`\xe\x90\xe6\xacrC\xfd\xf0&v*D\xb4\xd6\xe4\xec" +"\xbe\xf4\x8c\x9d{ij\xf2\x9e\xee\x6>U}\x8f\xcf\xf\x9\xe0\x13oE\xd1~`\x8d\xa3nY\xf2" +"\xae\xcf\x84\x93\xf8\xd6%\x36\x11\x9b_~\x15T\xdf\xe3\xf6\xe8\xd7\xc9\xa2\xc6\xf5" +"W\xd1\x8bJ\xf9,\x9fn\x5\x9u\xc3\xb5\xc5O\x9b_N9\xd6\x0\xb6\xfa,\xd6\xde :\x17@(\xcb" +"\xb2\xa2\x1\xaf\x12m\x10\x13\xc2)\xbb\x82\xcf\xd0\x13\xed\x19\x9d\x1\xe5\x1e\xe2" +"x\xf\xe8\x96\xe0\x1c\x63\xc6U\x8z>a\xa7\xf1\x2\x9f\xa5\xe9~\xa1\x87/\x1b\x45\xf2" +"\"\x82\xdd\xc3\x17\xe1y&sh\xcbR\xda\x94\x44\xf6\x5Z\xd3\x95\x46\xa6\xaf\x1cR\xbf" +"\xcf\x81\xa2\x9b\xe8,G\xc9\x9e\x80P\xe4\x88\x9e\x45u\xb7_9\xe6\x62\xf2\xdbt g7\x97" +"\xe2\xed=g\xcd\xa7\xae,\x15\xd0\xa0\xa7\x94\xd5}\x16\x8e\xbe\x13!N\x89\xe0 \x9a\xb2" +"\xc0\xebw\x84\xe9I\x1a\xef\xa3\xc0-\r\xf3\xaeSe\xa0\xfcJ\xe0#\xca\xb5(\x16,z\x1b" +"\x17\x36\x64\x9d\xfa\xdd\xac\xa8\xda_\xa1\x8b}d\x89\xe4\"\x9e\x9e$\xd3\x8a\x62\x4" +"d\xa7\x44\xa5\xc6\xfo\x9d\x33K\x90\x87\x6\xb7\x38\xae\xd1\x86i\x8a\x8b'\x83\x41\xfa" +"Me\xa0\xa8\x86\x80\xbaHF\x94\x92\x15\x12\xf7\xde\x93\x33\x7f\xc1\xc0+\xbend\xaf-" +"\xad\x7`2y\xd8s)\x1d\x1fM9\xc1\xddm\x89\xc9\xf\x65$\xfH\x8\xf6\xf1\x11\\\xa5[\x88" +"\xe2\x42V^Y\xf3\xbb\xf1\xf1\xe\xc7\xb8\x88r\xe9\xae\x61\xd4L\xae\x18Tc\xed\xfa\xf7" +"\xdf\x63\xdeM\"\x7\xd3\x7\xaf\xb6\x15\x1\x89)e\x17\r)E\x84o\xcfYs\xa1\xd4X`\x7fP" +"\xc1^\x6\xe5\xbe\xc7\x15\xe0\xc1V%\x9a\xaalsU\x93\xe5VOe\xf4\x43\xb7\x8c\xc7Q.\xc3" +"ZV\xf1&\xdf\x9d\x30\x97J@\x87.Be\xe1\xae_\xd4\x83\xcf\xcb\xbb\xa2m\xee\x42l\xdcG" +"!\xf1\x9c?\xda\x86\xedz\xd4\xfa\x11 \xf6\x36i\xbe\xfep\x2\xb1(\xce\xaf\xd8\xc6>\x8a" +"\xc0\x99\x43\xb6\xcb\xdf\xb3\xd2Gj\x2l\x0\xa8\xff\x81\xb1\xf6Q\xb9\x7f\x31\xc\x82" +"\xab\xa5\xf3\x88\xcc\x1d\xb5\xaf\xcf\xf5\x99mRR\xa6\xa4/\xa4\xd9r\xe4\x1e\xe5`\x88" +"\xf7\x8c\xb9\x66\xf9\x5\x11q\xc4r\xc7t\x87\x9a\xec\xff\xf0\x8b\xfd\x9c\xea@\xd7\xc2" +"\x98\x92*\xce\x64\xf2\x8c\x14\xe0\xb8\x1fM\xca\xde\x81\xd7\x1d\xe3\x98=\x87\xd9\x5" +"\x19.\xf1<\xeeq\xb2\xd3\xff\x1a\x88\xae\xc6q\xec\x31\x89\x17\xdf\x98\xa3\xc9\x5N" +"7-\"\xa3\xce\xc8/\xcc!\x7fG1\x9a@\x90\x3\x12\xf6\xe3+Sk\x9ez\x7f\xa0\x83~\xc6\\\xcd" +"\xb5\xfb\r\x41\x43q\x17Yl\xb3\x9d\x93\x82&-\xe6\xe6Sy\xd3\xa9p\x9b,\xfb\xab\xf5\xfc" +"][5$%\xf0o\x88\xcd\x31\x1**AG\xb1\x12\xf0\xc1\xc0\xac\xcc\x80\x8c\xd6%\xe0\"\x8e" +"\xef\x66\x66\x1fp\xaf\x96\xd3\xdc\xfe\xcd@'\x0\xe4\xf6R*\xc9\xa8V\xda\x46mU\xc8O" +"e\xbe(\x10\xa1VQc\x87-b\xeb\x81\x33:i\x8e\xd7\xb6\x83R\xca\xcc\xa2\xd7\xad\x38\xab" +"U\xc1\x9eOU\x82\xf7X\x18\x30/_\xda\xdf\x1d\xce\xd0\x9d\x94\x87/-H\xfb\x63l\x8e\x38" +"\xc7V\xec\xeb \xf1\x94]U\xf4" +"\x9b\xc\xca\xc8IgY\xfc\xc7).F\x93\x89\x43\xc2\x62\xd7\x8f\x32\x12\xd3\xf9\xd0\xf7" +"\xb1\x3\x15\x7f\x42=q\xb1\xedT\xb2\xa6\x3\xf4\xc2i\x2\x99\x18\xf2\x38\xech(\xff\xce" +"\xc6`\x9\xdb\x9c\x9eYSN\xab\xb1\x83\xf3\x1dz\xd4\xc5{\x1b\xdf\xb\xd2\xceZB\x18\x82" +"\xbc\x10\xcc\x1b\xcej\x97\xe+Xk\xb2!V|\xcaH9\x89\xdd\xb\x8d\xec\x42L\x1d\x1f\xf0" +"B\xdc\xb7\x83\x44#\xcf$N\xda(\xd2\xd9i\xb1t@\xca\xea\xf0$\xa6\x11\x9d\xb0\x10\xce" +"6h!\xaf\xa4$\xd1\xb8)\x96\x9\xc0\x41H'Z\xe6\xe5%zz\xcb\x9c\xf\x7f\xc9\x80\xb3X>z\x8b" +"\x1\xc4\x65\x90\xe3\xbc\x4\xeb\xa5\x65\xc2\xea\x94\xf0W\xd9\x64\xa7\x8a\x90\xea\x9f" +"R\xab\xfdp\xf8ND\xe4\x34\xbd\x10\xa4.\x98\xc7\x94\x6W$4\x1f\x90~5\xd3\xcb%qa\xe0" +"\x1cp\x84\xe3\xa0\x16m\x15\xce\xd6]\xa7\xba\x87\xdb\xb2\xea\x33\xd3\x9b\xd9\x9a\xfb" +"\x93\xd3T\x83X\xd0\x83\x30\xe8\x7\xf8U,\xec\xf6<\x84\xf8\x5 T\x91\xba:\x1a\x62.p" +"\xc2\x32\xfa\xdf;\xf2\xdc\xfdo\x5\x39\x15\x8d\x33\x6Po\x15\xb\x5\x18\x37\x19\x12" +"\xa2^\xb9\x61\x63\xd7>\x9e\xee\xd4.\xdc\x84\xd6\x88\xbc\x7fw\x8\xd9\xdc\xa3H\xfa" +"\xb4\xdf\x62\xe5\x80\x9b\xd0\x94\x84-\n1\xdb\xb7\xc4\xb4\x1f\x94\xd9\x46\x81\xc^" +"\xc1\xbi\xaa\xbc,\x91\xa5\x95\x0\xb2\xe5\xd3\x7fGU\xdd\xfbz\xe4\xab\xf7W\xf4\xc5" +"\xbc\xf7|\x7f\x95\xe6\xa6\x16\x64\x64V\xfe\x8f\x18@p\x80\xbc\xab\xbf\xa5w\x4(z\xd2" +"b\"\xdf\x91\xab&\x13\x95\x1e-g\x94r\xf8\xad\xf0n\xa2\xa2\x2\x5\xec\x19\x97\"\x99" +"\xa7\x8b\xacR\x11\x43\x34G\xc_X\x90\xc2\xf8\x46\xb4\xc6\x4-s\x94Q'\xf2\xe3\x91\xe" +"\xca\x1cL\xd7\xa1n\xfeKK\xe3\x8a\x15\xaa\xa7\x10h,86\xa8\xca\x83\xfd\x38Ip\x13\x9d" +"\x8b\x46\xfb\n\xeb\xb0\x2\xdd\"\x41\x99g/\xfa\x2%\xf\xbc\xfaNd\x9e\x33T(\xfcq\xf5" +"\xf\x45\xe4\x98\x41\x9e\xdb\xe\x97\xf\x46\x89JH\xf6U\x80\x88\x1c\x9c\x42P\xfc\xef" +"e\xc9\xb2\x86\x99@\x8e\x18\xb2o\xe6\xdb\x7f\x1c\xbd\xb7gVNs\xcbYT\xc6\xd6\x39\xce" +"3\"\xc\x89O6\xe7\xfq\xc9\xf9\xaa?\xe2\xae\n\xa0\xe3\xf2\xe3\x4\xecZ\xbc\x66\x16u" +"\xcd\xe2\xe7\x5\x19\xe4\"\n\xe2o\xba\xcb\xd0\x1dQi\xeb\x84GPu>l\xedS\xe3g\x8f\xdc" +"\xd0\x8a\xb9>\x10\x6~\x9c\x64\xf3\x8b@\xb7m\x99\xb6\xcd\x92\xbd\xf4\x15Z\x1e\xa5" +"\xcc\x82I\x98\xb5\x9a\xad\x6\xe0\x9e_\x15\xeb\xb2(\x8d\x66\xeaq\xb2\x96\x61g4\xfe" +"\xf2yo\x7\xff\r\x8b\x4pt\xa1\x11\x1dh\xb9\x9c+p\xfcV\xe7JQ\xb0\x62\xf4\x99\x8a\xcc" +"\x85\xb1\x94<\x94w\xe4\x36\xe5\xcdz\xb1\x8d\xbc\x89\x8d!\xbb\x93GZb;\xdd\xa7\x1d" +"{\x89[\xa2\xd4\xc1\xfK\x90\xbf\x33Q&\xf4\xfdW\xd7:\xfaP\x17\xfk<6I\"\xe5Q\xd4\xe" +"5\xdau\xfa\x89\x17\x62\xfa#@\x1d\x39&\xf.\x92\xc7\x80|to\x13\xbb\x35\xce\xf9\xdb" +"\xf2\xe7nf\xa7/\xef\xf0\x95\xdaH*M\xe8\xa4 \x91pesl\xf4\xde\x90O\xb5.d\x9a\x32%^" +" 0\xa7\xb3\x1bhcSI/1\xc0\x64\xa3\xc4\xb0\x44\x8cK\xfd\x44\xb8\xe1S\x84\xfd\x80\x9b" +"\x87\x61\xee&\xa7\xdf\xa1u\x8dW\xceO\xb\xc3v\xeb+83SK\x15\xa8\x34\x36\xbaU9U\xac" +"\xb5\xa7\xa6g\x96\xac[\x92\xdbS\x88\xbcS\xef\xa2u\x8\xb0\x8e\x82\x82\x1e\\\xf6i\xbc" +"\xe5+\xb8`x\xft\x9bO8\xac\xdf_\xf1'&\xbf>\xc2t?\x1\x1L\xde\x96\xfekL@\xa0\x34\xe9" +"\xea\xfc\xa2\xa3\\\xccwl&i\xe6\xad\x13\x80p\xa4\xfH\xedy\x13m\x7f\xf5~\x99>\x9\xb8" +"\x1cT?\xba\xdd\x35\xf\xf5\xb5\xf7\xa4o\x6\xf\x88\xe3\xf\xe2\xd8#82\xd1\x8bl2>\xe0" +"\x17\xeb\xc1\xdf\\\x83\x83!\xcd\xc8\xa8L\xab\xca\xb2\xb`\xa1\xa3\xaa\x2\x8f\x36\xea" +"n\x87\xc8P\xaf\x8a\xf7\xcdP\xaa\x63Y\x3\x8b\xfa\x88\x18\x82\x1d\x2\xce\xe8\xf5\x1d" +"\xab\x8c\x5\xf7\xae\x97\x97\x81M\x97\xf3\xdb\x8c\xcd\xde\x45\xb2\x1d\xbb\x15\xce" +"\xe2\x92\xfa\xa5\x34\xa5\xf3\x17\xb3W\xf4\x9\x1f=\xa3W2[\x8b\x9f^\xdb\x45\x86T\x15" +"\x97<\x14>^[\xaaH?\xbf-\x6\xcd\xd4$fu\xecX\xb8Lj\xe6\\\xa7\x43\x11\x7f\xf0\xf\"\x92" +"Cw%a1\xa7\xf2\xba&\xa9\x11Z\xfd\x96\xc1\x82\x16\xcf\xdf\x41\xb7\"\xe\xd0\xcb?\xcc" +"&\xc3\x63\x80\x0{8*\x2\xae\xae\x42\x88\x87\xdc\x8b\xe5\xfd\xd6\x30\xacW\xee=\xc1" +"V\xc7\xb8\xb2\x9eh\x7f$D.5\xce\x10\xba@\x87)Zd\x1fq9\xc8\x31\xf7\xcc\xdal\xce\xb5" +"\xda\xfeS|\xc1\xa9|Z3}\xe>\x95\xf8^j\xc0\xf9T8\xacL\x12n\x1f\x1e\xcf\x33n\xd3\x1c\xca" +"~\xb2\x16\xd2y\x87q#\xfd\x9f\xcd\x8f\xb5\xe5+X|\xff\xc4\x42\x84V\xdd\xca\x81h\x19" +"\xa8\xa4\xa2\x11\xd8\xf1\x62\x9e]B\xbaL\\5nX\xc\x8a\"\xc6\x1d\x98uR\xfa\xa9x\x93" +"\x81m\xa7=B6\x86\xe4\xeb\xd4\x43u\xc2W\xf0\x31\x31\x88\x65\xa2\xf\"\x11^r\xbf\x1e" +"\xb9\xf9:\xaa\x16\x9c\x14\n\x33\xa0l5\xbd\x45&\xa3\x8b\xe7\x9c\xf4\n\xd1\xef\xa1" +"\x4\x11\xe8\xf3\x30\n\x8a\x8b\x97\xab\x14\xe\xe6sN\x1b\xeel\x8e\xe4\x43\xd6\x98\xd3" +"AY\x97\x64\x9co\x10\xf2\n\xcd\x80#d\"\xe2\x15\xe1\x46\xd7\x44\xa2\x62\xda?\xc8\x8d" +"\xc0\xd8o\xf6\x65\x12\xf4\x9d?\x95}<\\\xff\xeb\x42H#P\x9f\x33\xf1U\x5zLo7\xb5/Fg" +"v{\xa9Ok\x8b\x62\x85kU?0~]#\xc\x44\xcb\xfd\xc9\xa9zE\xb1\x39\xff\xb2\xf2V^\xb0\xe2" +" &\x97/\xad\xf\xb7\xb9Wo\xb6\xf3h\xb6\x19y\x94:9\x87s`\xe~\xe1\xdf\xef\xbf&\xd4]" +"@\xbd\xa6n\xbb\x96\xa5n\xe9\xca\xe0\xb2\x42\xc]\xd8>$\xdb\xa9\xff\x88[\xb8\x44\xbf" +"=+\xf9;\x7\x32]\xff`\xc0\xcb_\xdc\xca\n\xc8\xfbZ.\x11\x9dZ\xf2nS\xab\x8e;B\x84\x81" +"\xc2\x87\x1d\xda&\xef\xb\x62\x1c\xd8W+\x91/\x9aO/\xc0\x42" +"~\xd0pY/q\x10\x18;\xfd\xb2\xc4\x0\x39;\xa7V\x90X\"y&5\x1f\x7\xfe\xd4\xf3\x36\x33" +"\xba\x3\xa7*\xa2\xdckY\x8eI\xb9`!\xdd\x86\x8d\xad\xf\x35.W\"\xfbqOf|\x15\xc6\x8d" +"I\xc0=\x82-\x82g~\xdf\xe8o\xe9\x66\x8eS}\xa2\x84\x6\x8c\x9b\n\xed\x83\x7L\x92\xa5" +"\xb9\x39)mP[\x83~j\x9d\xda\xb1\xae\xabtU\xa0\x8a\x11L\"\"\xb3\x39(Ft\xb7K\xf4\xca" +"\x9e\xe0\xc0 \xbf*\x14\x8b\x43\x9cq\xc6\xbeQ\xa9L\xb6O\xbeJ~\xb2\x95ZEPG\xcf\\\xb3" +"H\xb0\x62\xedOdq\xcb\xc3\xe9\xad\xd9\xbe\x9b\x96\x87\x9a\xc7\xbcq\xbc\xe0/\xd0/\x17" +"\xc6\x6\x39\x85\xa5\xe8\x98= Z\xa1H\x9d\xa1<@\x89\x90\xab\xa1\xc5O/P\x1a\xa1r\xf5" +"0H\rx\x9c\x84\x81\x18\xc0\xa7N\xf9\x8d_`z\x6{\xaf\xf6\x3\r\x88z\xc6\xa6I\x7f\x9a" +"\xb\x38\xf9p_2\x8a\xadK\xfb\xb6\x34\xf7\x39\x38\x61w\xb0\x7f\"\xd5w\x12\x82\x44N" +"^\xe1s5\xb4\xd0\xec\x86\x11|i~y\xa5\xf4\xf6_\xdc\x8\xe4\x90M\xae\xda\xb2\x0g\xea" +"\xe2\x44\x8f\xd4\x30\x18I\xe4V\xd0\x85\xf3\x92\xdd\x13\x16z\xdfu\xcc\xfd\xb7#\xe2" +"\x90J\x9c\xc\x97mk\x84\xdd\xef\x9d\x92\xb0\xe1_\xb2\x46\xc3\xec\xc2\xd0\xbf\x31L" +"\xfb\x95wW\xb3\xa3\xe8\xe5\x80\x1fR\x6\x44\xe4`\x1d)\x1d\xa0\xf7P|\x6\xf3\xb9\xbb" +"6\xfc\x1cp\xea\xa4\x44\xe1NV\xc0\xcf\xf0l\x7f\x85=\xf3m\xa9\xd8\xb6\xaf%\x44\xb8" +"S\xdf\xffSZ~\\o\xc1\x45%\xc\xdd\xa2)\x95`\x19\x65\x9d\r%:\x19\xa7\xb5\x1aNS\x8b\xdc" +"\x1\xf7Mw\x4\x99I\xc2\xc9|~\xc6\x39,.a\xcc\xc0\x99+f\xda\xf1\xab\x8U\x10\x63\xe5" +"1\x80\xd2\xa6}\xe4\x96ql\xcb\xaa\x45\x46-\x9f\x91\xb6j\"TYb\xdd\xab\x12\x5\x11\xff" +"\x8\x62q1\xb9^]\xee\xb8\xb4\xdd\x96\x43\xe7\xb2\xaf\x65\xc0\xfd\xce\x11\xf5\xf1\xe8" +"\xdd\x46\x8d\xa1\x8d\x41\xc8\xc4\xf0\xe\xa7\x38\x36\xf4\xf7\xe\xc5\xf\xc3\xecm5\x8c" +"\x6X\xa4&\x1cm\x15\xa5\x82\xa2\xc7\xc9\x94\xe7\x88.f\x18U\xb3R\x1\x45v\x85\x8a&_" +"\xfb\xc4%\x16\x6i\xce\x15\x9d\x7\xed\xac\x4\xd0`\xb4NX\x0\xa7\xaa\xe8\xe3\x39\xc2" +"\x9b\x92\x9a\xa8\x1d/Q\\F\"\x9d \x80\xd5\x91z\xb2\n\xb6\xb3O\xdc\xa8\xe4\xaf\x64" +"\xed\x66\n\x31sxo\xb1\xa1\xd0\x5\xd5u\xc2\xa5\x18}?|\xfd\xc9L\xcc\x44\xa3\x8c\\\xd5" +"#\xe9\xdarm\x8e\xfam\xa7\xb6\x13\x1d\xff\x34\x35\xfe\xe8\x38\xb2\xc7\xd6\xb9y4)_" +"\x6 -0\x7f\xf7\x8d\x90\x66\x99\xcb\x9c[\xbb\x10\xd1\xd4\xde\xa5\xfd\xa5\xbf\xb0\x94" +"\xe7\x4`p\x83\xb6\x46\xd3\x7f]\xa1\xfcz\xd2\x1b\x81?D\xd8\xc1\xaf\xea\xb6\x66U\xaa" +"\xa1\x97\x3\xbe\xa2\xe7}\xf3\xbf\x35\xe\x17\xc7K4G\xa4R#Y\x19\x45+QuW\n\x0lv\x80" +"\xac\x5\xe8\x95\n\x62\xe1\x1d~:\xca\x35\xa3\x97\xd1\xe1\x96\x30\xd0\x94\xa8h\x7Y" +"<\x97\xf4\xc4\x84\xe4\xe0k\xcf\xf7\x8\xb6\xdc\xa9r\xe3\xa0\x0\x9e\x1c\xac\xe\xa4" +"\x14\x15\x30\xf5\xc1\xb8\xae\xf5\xe1\xb9\x33\xf3\x7f\xdd\xbcK\xe2+t\xfe\x34m\x1a" +"?_\xec\x8\x18\xf8\xe6\x17\x65V\x8a*\xc0G\x13\xe8(\xf9\x8c\x44\x9d\x9a\x1c\xceR\xd1" +"\ra\xdd\x8b\xfd\x8L\x8d\x9\x9au\xd8\x9d\xea\x64\xd5\xa7\xcch\xbd[\x5\x93\xd9yS\xda" +"\xda\x97\x63\x83\xf5\x1Y\x15\x61\x8a\xecV\xd7\x1d\x1d\xcdU\xb8\x97\x36\x39\\`\x9b" +"1Z?\x1e\x12UC/\xdb\xd3\x7f\x38\xcc\x43\xc3T\xfbK|D\xf1\xa7\x31\x8b\xb~\x99\xc3\xc0" +"\x8c\x33\xb9Sr{jc(\x5\x17\x83\xa0\xa3><\xd9\xe4\x98\x34j<\xa6\xa7{Qp\x96\xed\xd5" +"*\xe4\x43\xb8vC\xa6\x46\xc3\xa7\xbb\x97\xf7\x42\x88\x8d\x33\xf9\xb3\x12~a\x94/A\x3" +"\xc1\xdb\xdc\xd8\xea\xc8\xf9\xe2Yw0fsl\xa6S\xceW\xe8\x82&Q&\x1d\x84|\x13\x13!\xbb" +"\x9d\x66&\xa1\xacP\xd0G\xc0\xbaG\xb4\x11\xdf*\x99UE\xbdh\xec\x2\x87\xcc\x9b\x31\xd5" +"\xdd\xca\x87U\xeb\xeb\x10\xac\xcb\x39\x3\xab\xf\xd5x\x8e\x98\x42 D;\x84Y\xe7\xc0" +"x\xda\x42\x89\xf1\x35\x9\x5\x88\x1a\xd6\xdf\xde\xc4s\x2\xb0\xac\xb0\xd4\xaf\x8c\xae" +"\xd0+Kp\xdf<\xf8\xfe\xc1\x18\xf0\xfc-=\xde>IL\xd1`\xe6v\xe3\x0\xbc\x46K\xd4@\r\xb5" +"\xe\xe4;1N\x5\x17\x3{\xf9q\xac\xd7\xcd\x32|\xb2\x13H\x93\xb8\xa0\x41\xeh\xdd\xc5" +"\x18\xf5\xde\xc9\x66\xc7\x88L\xf5\xfd\xfetr1w\xf2\r\xed\xc0\x39\xd8y\x5l\xaa\xb4" +"\xbf\x4Pb\xd3\x90Oa\\\\\xfe\x10\x9a\xc7\xa3U\x99\xc9@$\xb4\x10\x19\xb9\xaf\xd4\x4" +"\xa8\n\xca\xa4\x83y)\xf5\xc9\x31v\x80\xa1=\x15z\x3\xb5\x9aU\x88\xdfy\xd2\xe1\x13" +"\xf5\xf5\x10!\xd6\xf6\xf9\xe\x8b\xbb\xa2\xc2R\xfd\x10\x65\x1b\xe8\xb\xaf\xd5\x9c" +"S\xa3\x36{\xa3\xc2\x8d\xb6\xeb\x9d\xab\xf1\xea\x99\xf4{P?b~\x15\xdc\xf3\xfd\x64_" +"\xc5,]]\xf/\x7\xdbL%\xc0\xd1\xe1\xc0\x1\x46\xe1\xc4\xd9s\xe6\x13\xcc\xdb\xd3\xf9" +"E\xc\xc0\xf5\x34=y\xf0^\x94\x92\xe8j\x1b\xb8\x89\xad\xf4\x5\x3\xbd\x7f>uCChY\x18" +"J[ \xbd\x8a\x17/5\r\x84kup\x80\x39\x90\xad\xaaH\xd4\xb9\x15Z+LK\xfb\xef\x1e\x1a\x6" +"\\\x8\xe0\x39(U\x97\x35\xbd\xd4\x42\xff\x1e\x83\xe1\xfa \xa5\xdaW\xd8\xbd\xb2\xff" +"T'\xc0\x34\xcf\x1(\xaf\x11\x1ens\x9\x9e\x4n\xc$\xe\x80\xa7={\xe7+\x87\x83NE\x89\x8d" +"GU!\xca\x33\x6pv1\xf5\xc6\x13\x61\x99\xf3Tc-\x1a\x8_\x12\xa1\xc7\xc4s\x86\x8b\x62" +"\xe5\x34\xd1_T\x84\x32>c\xd0WA\x96\xa1\x9e\xf1u!N\xb3Z\x90\x87>\xfc\xfb\x92\xd6\xcf" +"hv\x1d\x45\xe3~\xaa\x61\xe1\xa1\x97\x9a\x82\x0\x95\x7\xca\x19>D\xb3j\x80\x64\x86" +"f\\\xed\xbc\xf3\x87\x5:\xce\xab\x97\x9b\xd3]0\x97\x8f\xc7\x65\x9a\xbb\xe8\x44\xf4" +"\xec\xab\x33\x3\x31\x8e\xce\x80wz_\xa5\xa9\xdd\x91\xb3\xd0h\x4\xc4\xb4\xe9\xb4\xef" +"\xcf\x7\xeb\x89\x86m\r\xd8\xca\x39\xc\xfd\x15\x98\x65\x14\x17\x11Mxwk\x1a\x1d\x36" +"\xb4\xba\x17tmk\xe7\xfc\x12=G>\xf1\xef\xed\x1c;\xc1\xd5U\xf9\x14Shi\xfd[\xc\x35\xf9" +"\xc8?e\xb0\xe6\xbfzb{\x92\x2\xd7\x87\xd7,`\r\xdbk\xcc\xe6\x13\xd8\x84\x92\xe1<\xa0" +"\xaa\xab\x19n\x8aI\x92\x8c\x62\xce\xa4\xff\xe2\xd0 \x8e\xda\x33J\xcfG\xf2\xb\xd7" +"\x93\x12M,UF\xc0?J6Ci\xa7j\x4%&/\x9d\x91\x18\xafT\xe3}2\xe3:\xb2]\xd5\x33\xa4\x9d" +"\xf5\xfb\xf1\xba\xf4\xce\xac-\x9d\x37\x8c\xdc\xd1;\x0\xfd\xa4\x32\xd9\x4/b=\xa4\x1a" +"\xfb\x80i\x9bU8\xa2T\x3\xb0\xb3\xea\xbe\xc9\xe8\xef\xcf\x42\xfe\xf3\xea\x9f\x91v" +"i\x2\xcd k\x7\x87\xc1\x87\xd5\x37\xb`\xadm\xcd\x0-\xe2\xde\x8d\xcd\xc0\xb4q\x9ay" +"|^&\xba\xa6ve\x1m\xa0\xd9g\xfa\x13\x46\xf9X\x8a\xed\xa1t\xca\x0\x1b\x31!6\x17\xfe" +"\x19\xea!\x8e\xc2\x35\x97y\xd9y\xe2\x66\x31\x66H\x9c\x6\x99\x32\x30\xb0\xd0ys\xa1" +"\x17\xc4\xe3\xf4\xa4\xc9<\xf8\x42\x82H\xddS\x89\x41Mg\x9cidABg\xc7\xfe\xa1~5\xb0" +"\xce\xe4Vfz\x9b\x18u\xc8\x1b#\x2\xbd\xde\xa2\x81\x8d`\x19\xfc\x16\"\xa8 Q\xf6\x5" +"\x84\xab\xc9\x4\xcd\x91\x86v0]\xc0?\xfb\xcc\x64\xfd\xda\xc8\xd8\xaa\x9c\xe2\xea\x0" +"\xd6\xc9{\xc6<\x8a\x61}\xed\xfc\xe@wVIC\x8e\x9f\x61\xaf\xd1y^; V\xb\x1\xbe^\x9\x83" +"\xf1\x36\xcfH\xab iT\xe4\x1d\xee\r\x9d\xdd\x95=\xfd\x1\xca\xebV\x91Q\xd6\xbc\r\xfe" +"\xf2\x9dp\xfa\xe3\xe1\x98\xe7\xed\xd8\x92,\xe\xb\xcb\x8b\xcc\xf1\xc0\x16\x14,\x1a" +"\x8b\x33z\xfaz\x5\xa9\xd7SK\x18K\xf3\xbf\x82\x7f\x37\x1e\x9b\xd1\x9aq$N\xca\x1b\xa7" +"=HL\xd2\xfa\xd5M\xb2\xf0\xee\xfb\xd5KSn\xbc\xb5\x9Nk\xc2\xf5\xb2\xaa\xe4\x1f\x5\xb4" +"\xb3\x11\x11Xv\xed\x42\xc3O\x8e\x64;S7.?cP\xdb\x8a\x38\x44X\"\xea\x9a\x33\xe2\x7f" +"\xb0\xcc\x42\xce\xdc\xd1\xfe/\xdfr?\xc4|\x99n\xe3V\xc4\x2\x11/$\xd0\xaf\x89\x9b-" +"\x0\xbe\xa1\xcf\xd4'\x99\x8b\xd2+*\x9\x4mg7\x81\x44H\xac\xfb\x10\xd3\x87T}p\x9\xfb" +"8J\xf0V,\x85iL\x7\x15\x84#m\xf\x1f=?\xcd\xc\xfb\x38\xb7|\x81\x88\x90\x61\xe6h\xba" +"z\xb3z\xa6\xfX\xa3\x96}\xe2o\x93\x9by\xcb\xf1\n\x9d\xcc\x42\x85%\x61\xd8\xd6uO\x1b" +"f\r!j\xab\x1e\x13?\xba\xa3!\xc5n%\x84\xbe\\\x9b\xae \xcc\xf0\xe\x8d\xbem\x9c/\xce" +"\xbe\xba\xd9\x45\xc3\xc0\x41\x1\xd2\x38sQ\xf1\x32\x62\x87\x86\xf6\xd9\xd4\xca\xb8" +"4\x19(\x8d\x31\xf9\xbc`\r\x96\x64\x12\xe6\xaa\x45|\xe6\xca\xd2jL\x6q\x9{\x98\xc2" +"8L\x81\xdd\x8b\x9a\x32\"\xd4\xf4\xbb\xdap\x17\x89\\>\xdc&f'y\xae\xe7@\xd9\xd7\xe2" +"A\x85\xfb\x82\x19p\xb0\xa3\xa9@A\xa6\x9eH\x5\xec\x88\xee\x1e\xe5!\x98\x15\x36\xf2" +"\x84O\xb8\xf5\xef\x64_g\xd4,\xe5\x14\x8e-\xde\x43\xadZ\xef \xe\xdb:,xf\xc9\x84X\xa9" +"&f\xe5\xf9\xe0p\x17\x8b\xcc\x39\xf6Z\x89\x31\x2\xa1\x5\x64\xafN\x8c\xaa\xa5\x7]/" +"\x8c\xd7\xfa\xb0@\x1c\x3\xaf)\x9e\xa3Q\\\xc9\x30\x66tN\xb5\xaf|\xf0\xed\x6g[\xf0" +"I\xa6\xe3\xc2\x11\xa8\x9e\x16\xde[\xf0\x44Z|\xcan\xe8\xeb\x3GEIPH]\x88\x46\x6\x65" +"\x1eX\x87\xfe\x8b$2>*\xa1m\xe2/\xc1\xfc\x8cO\x6\xa8*\x1f\xdeWX\x97`$\x6\x81\x97\xe1" +"\xf4PnM=\x8a\x16\xd4\x4\x61\xa4Xc8\xb3t\xa5\x92\xdc`3D\x2\xf7\x63\x88\xadjE}\xc3" +"\xf5Nai\xcfz\xe3\x95\x96v\xe9\x66\xa4V\x9\x62\x10U\xec:\xf8\xe\x18&30\nD\x18\xe3" +"Jf\xdd\xfakV\x9eZ\x13\xc9\x11[_\xd3\xec\x1c\xeb\xe5\xf\xba$\x7f`\x80:\xa8\x39v\xf0" +"\x1\x17ScB\xdc=\x98\x90\xc4\x9b*\xc7\x1\xd3p\xe4:\x95Q\x18\x96x'v\xfp\x91\x46\x9c" +"T\x6\xf0\x8f\x18\xd7\xe3T\x81H\xcf\xe\x31+\x1d\xc7\x1d\xf6z^z\x16V\xcf/G\xf3\xaf" +"\xf3\xddP\xff\xc2\xfc\xda\xb7\x17r\x85\xb2\x9c\x17\xca\x43\x1\x9f\x62\xaco\xbaR\xd1" +"I>\xd7\xc4'Rdp\xac\xc8\x38\x9b\xae\x82wYIX\x90\x8fQ{(c\xb8\x32\x92\xebZ\xb3\xf5\x7f" +"\xff\xb0\x83\x93\xca\x61\xf\xb1\xfe\x90]\x88\xa0\xa1j\xc3\x95\xe2\xa2\xa6\xdd\x3" +"=j\rh\x99/\x83\xb.\x1b\x95\xfe\x35{\xf6rqn\x88\xff\xb9/\xfc=b\x94]\x1e\xad\"\xbc" +"h\xc5\x1e\xe0\xe1\n\x43\x1\x1d\xb9LDhZ\\Ev\xf6\xef\x44\xcb\xfb\x45\xf2\xa4\xbf\x11" +"\n\x1\x65}\xb5\x1f\xd4\x99v~x\x5\x81\x99\xb3\x1d\xfd`\x81?\x1a\x34O\x86(\x9f\x93" +"x#\x1d[\x15\x1c\x92\x38^6P\xb4\xfe\xb1\xdc\x91\x1\x8e\xab\x84t\xcb\xf6\x9f\xdc\x14" +"\x96\xa4\xd0x\xd2\xc3Q\xc8\x19\x64Q$z\x9d\xcf\x81\x17\xe5\xb6\x37\x37\x1d\x8e\"\xe2" +"H\xc6M\x99\x90\x15\xc3\xfd#\x11\xe9\x95\xb\x8e\xe0\x92/\xbd\xd3\xd7\xbf\xf7\x66\xbf" +"\xe9\xe7\xce\xb\xe1/1\x8f\xf2\xa7\xb5\xa9\xc6\xd0\nT@\x16\x9\x30N\xd2\xc5_\\\x1e" +"\xac=K85[\xbd\x85\xd6maco\xa6\xe3\xc.\x82\x82\x93v\xbe\xc9y\xa6\xfe\xee\x4\xe\x45" +"#Yv\x8e\xcf\x90\xccS\x9aTo\x17\xae\x90lv\xf1O\x86\xffiw\x97\x32+\x5\x1e\xb3\x11\xa7" +"Y\xfe&\xc\x1e\xee]\xac\xf3\x83\x81j\xaf\x12\x94\xcf\xfa{\xf8zM\x9b\xc5\x95\xee\x8f" +",/\x86\xfe\xee\x11\xad\x95\x9d\x86\xf2/\xda\xf4\xce\xc0\x98\x94*W\xe5x\x13\xa0\xfa" +"\x99#\x9e\x99O\xff\x35<\x1ex\x1d\x66k\x89(\xcf\xc6H\xfc\xf0\x86\x9f\xc6\x84h\xbd" +"\xbd\xa7\xd2\x80\xdf\xab\x8b\xb:L\xa3[\x7Khm\xe8\xd3r\xc6\x1f\xb3#\x5\x16\x9a\x1a" +"\x99\x12\xf6T\x1d\xa1l\xd6\x31jn\xa4QRGW\xbe\\\xf6\xe8 \x1\x1b\xe3\x85\x9f\xb8\xb8" +"W\x8c\x10\xf\xf0)h\xe\x5\xf0\xe0\xbf\x11\xd3?\xe1\x94`\xc8^\xa5\xe4\xc0\xef(\xe2" +"\x94\x7\xc8\xaek\xe0\x1c\xfa\rP\"\xbf\x9f\xb0\x14\x16\xff\xf7\"\xa7\x84\xdf\xc8\xfc" +"\xe3\x30\xec\x95sz\x85\x44q\xd3\x34\xfd\xc5\x8f\xab\x42\x86z{b\x83j\x8bVFn\x9al\x12" +"G\xd4n\xba\xff\xb9\x5\xcd\x43!\x97\xfY\xfb\x8do\xf6_\xdd\xd3K\xf9\x13\xad\x32.hE" +"\\_\xf2\xd2<\x1a^\xaeh\x7f%\x9b\xc9\x82\xb6\xa3\x84\xd3T@\xf7\xc6\x93\xcfP\xb9\xec" +"\xac\xbUx\xca\xee\x87X\x8bV.\xb6\xb7\xf4 4\xc9\xf2\xe5\x45\xec\x86\x63\x16U#T\xeb" +"7(\xc7\xd2\x65'\xedu\x17N\xaf\x63^\x4\x8b\x8\xdc]#\xe8\x89\x81\x7\n\xd5\x64\x1a\x65" +"/#D\x95n\x9c\xf4\xc1ne*\x99\xf4\xa6\x44\xd1x}m6St\x89\xdaMt\xe6\x1b/\xc4\xdf\xdf" +"\x1d\x1d\x9dX\xf9\xc2l^\xb6\x32\x0Rj\xfd\x16\x8a\xc5}V\x11\xad\xe4\xd4\xa3\x82\xfc" +"(\xbb`\xf9\xe7\xd6&\xa6\xc6z\xfb\xcc\xd1\x18<^<\xf2\xef!\r\xb\xf5\xcf\xa7\xbb\x10" +"\xfa\x38\x87\xbd\xd4\xcd\x96\xee\xea\xa8\xf9!\x9a\xa2\xf1\n\xbc\n\x96\xc;W\xc0\xec" +"\x3\x13\xae\x10\xcc\xff\x1fR!$\xcf\xc8\xd2\xd4\x9b\xfb\xb0\xc1\x93\xea\xff\xc5\xb4" +"\x8f\xb3\xff\x30\xb2\x1c\xb7o\nL\xf\x13w\xc9\"\x31\x45\xbb\x4h\xa5\xd7\x1b\x9b\xc2" +"Xs\xea\x12\xe1\xc6\x3\x34W\x1cg8\\\x0\xd0\xb5p\xd3\xff\xc6\xc7\xff\r\xe6,\x18\xc3\xad\x39T\xea\x9c\x84\x61X`1\xd3i\xe8\xb9\x9eS@\x8ay\xd6L4\xebZV\xde\x8ag\xde" +"\x91\x83y`\xe9\x8a\x66\xfc\x4\xdf\xa0\xeb\xde!\xdb\x0\x32\x34\xbbxf[\x3\x9d\n\x46" +"\x9a\x2!\xbdT\x1a\xf7\x14\x9a*e\x9c\x30\x1\x32\xc1\x45\x81\xefvo\xff\xbe\xcb\xa8" +"\xb5\x8a^\xb3\xf9TF\xde\xf4\x9a\xf8\x63\xa8\x11=\x17\xb2\xe7\xe6\xec\xde\xaf\xc3" +"\x83MM\xf9\x0\xe3GU\x96\xe8o\xbbN)t\xc0\x90\xdbJ\xd6\x1as}a\x1d\x92\xb4SZ\xc2\x91" +"\xc5j\xd8\xb1\xc0\x31\xd2\xf9\xb5\x5\xbbwQ{s}p\xab\x37#\xdbR\xae*\xcc\xd5\xdd/at" +"#\xed<\xc3\x9c\xa8\x82\xef\x41u{\xf7\x15\x18\x6\xa9\xb8\xb0\xf3\x12\x80\x88\x63\xe3" +"g?\xb5M\xe9\x39\xb3\\\xde\xca\x7f\xbcM\xc3\xbd\xf5\xa5\xf4}5\xe3\x45\x91l96l\x8b" +"OC\x9c\xe1\xc6\xf1\x83\\\x32\xb\xd1\xe6su\xb0;]\xe1\x8c\x93%o%\x17\x61\xa4\xc8\xce" +"\xc0\x10\x19\xc0h\xe3\x44G\xbc\xc5\x3\xb9W\x1f\xe8\x0\x6'\xa6\xb3\xda\xd5\x85L\xbc" +"\n-i\xe5\xa8\xf4k\xc7\x8fj{\x14\"\x33N\xc7\xa9\x8a\xbe\xfe\x9b\x83\xe0\x1d\xcf\xb7V\xa1\x37o.\xdc\xb7\x18\x9dx\xcd=l\xa5\x86U7\xee\xc3\x1c\x17\xd8" +"\x1`^\xfd\x86\xb\xb\x62\x94ri\x5\x88\xd0%u\x2\xc6\xf7\xa7[\x9a\x1c\x1b\x39w\x81\x32" +"\x98\x32\xcf>\xc4<\x9\xf1U\x9c\xd5\x62\xc4\x8f\xa9P\x2\x95\xcd;\ny\r\xd3\xfc\xd4" +"hJ|z\xc4\x9a\xc9\xbf\xff\x36\xb3\x9a\x9f\xb1H\xbc(\xd3y\x7\x43\x39\x43\xcb\xbf\xc" +"\xbd\xab\x46\xd3\xea\x86\xdc\x8f\x81\xc8Y\xc5-\x15\x30+\x94\xa9\xb5\x1c\x19\x9bq" +"\x4\xde\xec\x9dv\x9c&4\xce\xcf\x8bp\xc\xe9\xc0\x41R\xccY\xc9\x32k\xda\xcb\xec\x43" +"\x12\xde\xed\x92\xdd\x8z\x1cH@\x86\x8d\x9f\x97\xca\xc0\x46X\x1fv/u\xe8\xd2MdE7\n" +"?\x1e\n\xe7Jdx\xd9\xda\xc3~\x7f\xa5\xbe\xbe\xc0\xa1\xe0\x81\xaf\x89\xc1\xbb\xf7\xf5" +"\x1e>.\"\xc8\xc4\x5\xe8g\x1b\xa8_\x1b\xf0\xdfy\xa4\x65\xda\xc7\xec\x7\xf7\x31\xe0" +"\x6\x32\xe0\x17\xd1\x90\xa9\x9d\x83\xe2~\\.c\xd7\xda\xbb\xa2;.\x88\x33Lcr\x1a\xc5" +"\xa4\xcb\xc5\xd4_L\x17rY\xf3L.\xad\xe0\x1f\xa0\x8\xaf\x65\xeb\xc6\x1\xd8\xdd\x16" +"Cm\x86\xaa\x94\xc9\x9f<\xc0\xa2\xf8q4\xe7;\xf2/\x10\x8b\x82Z\x89\x63\xb4\x9clhTt" +"\xaf\xe4\xa5\x42\xc8\x64\x1d\xc0\x37]~\xfe\x9a\xc1\x16\x8d\x97\x0\x45\x9b\xe5-\r" +"\xa3\x99\x2>\x14\x19i\xf2\\\r\xac\x46hSKfG\xec\x85\x45K\xe9\x45\xe8&\xb2m\xe6\xe3" +"\xc4XK\x97\xa3\x8e+@\xa0\xd2\x34\x81\xbc\xa7\x80\x84\xfe\x80\xe0\nq\xa7\x90\xbf\x31" +"\xdf\x46\x8a\x43^\xcc\x88\xe6\nW\x86\xb\xbc\xa3\xd6Y0\x18n\x99\x17\xcb\xd2\x9\xc2" +"0\xe8\xf8%Zz\xbc}?\x4:\xe4\xd7\xad\x63\xd9\x98\xb\xed\xf0\x62\xb7\xd5\xc2\x98\xc4" +"\x2%\xb6\xd0?)\xa0\x33\x9e\xf\xca\x2\x13\x8eRo\x6\xb9\xefG\xf5\xe7\xa8\x6\x8a\x84" +"l\xfd\xe2\xbf\xde\xbd$\xf5\xa7:f\xc0y\x18\x66*\xec\x80\xb4\x32\x46(O\xa4\xe2\xee" +"\r\x9a\xab\x17+\x1eY\xa6\xcc\x46\xb8\x1\x14\x9d\x8c\r\xf6\xde\xc9\xa5]\x8e\x1b\xe" +"\xfd\x9d\x30/\xf6\x18\x7YD\xcc\xcbh1\xd3\x36\xb1\x16\x17\x10{\x5\x30\xd0\x98\x85" +"\xe5\xca\x11\xa5\xf1\xfc\xc8\xd6\x9d`=\xa1k\xeaQ\x11mB\xca\xb1\xaa\x1eM{\x9bMy\x99" +"?+\xfeS\xea\xc9\x4\xfe\xb7\xb-3\n\x89x\xe\xac\x10\xd1,\xc0\xc3[\x83\x99\xf2\x18\xac" +")v\xe5z&\xba\xd2\xc\xe2\xfa*\xe2\x36=?\xd2\xa8\xa9qtuV\xf2\x95\x9d\xa7J\x89\x63\xc2" +"\xbPG\x11\xae\x1c\xb0\xd0\xc0$W\xff.\x9b\xf6\x96\xb1Y\xaf\x3\x1d\xd5\x15_!\xc0\xf5" +"T\x9b\x4q\xa3\xc5\xdc\x89\x18\xb6u\xce\xbc\xb2>)2+\x95\x9a\xbc\x5(:p.\x87\x8d\xe8" +"\xef%\xeav\xf<\\{{I\xd3\x98(=\xe2\xed\x83\x7f\xd5\x9f|\"\xd6,X\xfe\x44H\xb1\x4\x9f" +"\xde\xbf\xc8x~g\xd7\xda\xfe\x97t\x97\x9b\xb3\x80\"T\xdaY\xbc\xc0!\x9f\x98\xc2\x19" +"\xf8M\x99\\\xa7h\xb8\xb5\xd9\xd4\xa3%%\xdf\xec\xe0\x3g^\xe4\xbd]\x8d\xff\xc1\x10" +"%\xaf+F\x8f\x92\x7\xb5\xb2\xb4#I\xb9\x82\x32\xba\xc0u\x97X\xc1\xf4\xa2\x83@X\x15" +"\xbdqE\xc9?\xa0\x8f>\xd2\x82\x66U\x5:<%Y\x7=\x8a\xcd\x19\x9d\xea,[\xa5\xf6\x16\xa2" +"\xe4\x85H\xb4\x37\xe\xc7\x34\x93\xba\x7\xe1\x97\x16]\xcawD8\xb0vhg\x81\x9c\x11T\xd1" +"\x95\x9f\xe6\xe0\x1e\x63\x12\xe0\xab\x91\xfc.+\xd2@\xfc\x86R\xa2\xd4V\xa1\xde\x7f" +"4\xef\x37*SyMLN\x5\xb\xf3\xca[{\xd2\xf1\xb8\xde\x93\xb4\xc8\x0$\x85\xcb!\x9a\xd2" +"\xd0)s\x9f\xd3\xc8\x1c\xc6\xe7\x8e\xdf\x38r5v\x1aW\x14>\xed\xe5\xcc\x88\x7f(/\xec" +"\xd2\x61\xf6\xa2]\n~\x15N\xcd\xf5\xdc\x38\xe4&\x81\x1b\xe8j\xaa\x45\x85w\xe5\xe0" +"\xc5\xf0\xf7Z\xaf\xa9\xc4\x1e]\x1d\xc9\xd9\x1e\xcdy\xb5\x14\xf8\xcd\xf7\xa5\xf1\xa1" +"\x89G\r5\xfd\xf4\xf9\xb8x\x88y\xcc\xbd\x91\xb4'\x82.\xd6X8\x9e\x98\x1e\xe\xe5\xf7" +"\xfb\x87i*>>\x93\x1d\xf8\xa1\xd1W>;\x1\x66 B@\xb7\x8\x0\x89\xa0\x9e\xf7H|\x9a\xee" +"-f_Z\x82\xf9L\x87\x7f\xb5\xb0\xdcS\x1c\xeb\xf1\xe7\x1c\x65\x92\xce\xa2@\x1eKQ\"\xe5" +"\x9\x1d\xf0= =\xf9y\xb9\xa6\xef\xba\x12\xe2\xf6\xb4\"\xfd\xf1]I\xac\x9\x14\xd3r\xd2" +"\x1e\x87\x1d\xe6\\\xbe\xcd\x10_\xd4\xa3\xe4qK\x9c\xca\\h\x3\xfa\x39\xdb\xb0\x15\xea" +"\x8a\x88\xbey\x13P.V.[\x17\xb\x87\xbf\xc8W-\xc9\xdfI\xad\x63iC\x11\xef\x13\x34\x44" +"K\xdf\xbL\xa3$Rq\xc1\xf7\xa4\xd7\xfa\xf1p>:\xa0\xe1\xea\x8d\\n\x82\x1b(p~\xe0\xc9" +"\xb4\xf2/#yo\xe8sV\xc5\x8a\xe2\xca\xdc\x19\x1fLX\xe1\xfbX\xda\x3\xb4Z%\xac\x95\xdb" +"\xae\x13\xa2\x93GB\x17\xbd\xb2\x14t+\x9d\x9dj\xf3_p\xfe\xd2\x89\x19\x42\xea\xce>" +"b^U\xff\xb8 T?\xbb%\n\x6-=9[\xc0\xf2\x19\xec\xfe\rvhj\xc1H\xbc\x41Gj\x88{\xc4\x94" +"\xdd\xbd\x39k\xe2\x0\xfd>\x3\xcf\xa1.\xc9\xafk\x93J(\xb4\xd7)\xf\xf5\xfa\xfa\x8\x8b\x1c\xec\xcbl\xf5\x1aX\xda\xad\x99\x8f" +"\x8\x39l\xdf\xd6\x8fZ\xbc\x9c\x1c\xcb\x8f\x65\x14\x10ws\xc6\x9c&\x87>\x88\x9d\x1f" +"y\xd1\xe\x86i\x10\xe4hA\x86\xfc\xd7\x1c\x96Z\xdf\x62\x39\xba\x34\x18\xb3\x13\xa2" +"z\xd6\x32\x30\x9i\xb6\xf2\x84Q\x93\x66\xed\x85\xe7\xcd\x96\x8d\x64\x82?\x8cY\xb5" +"\x91\x1ar\xd0\xa2\xe\xb7+`:a\xe3oR\xf2V\xff\xcd\xf7\x6\xb4V\xbM\xfa]\x91\x8f\xbc" +"S\r\x83\xa4\xb3\xc0\x1b\xdd<\xb4W.$$-\x14\x1b\xf9\xe7u6i:\x4\x7\xd0\x2\xe0\x9c\xda" +"[\x19[\xf1\xcc\xf4\x30\xae\x98$\xc0y(\xa0P\xd0\xb4`\xf2pK\xe8\xf9\xe6G\xa4\x88LE" +"g\n\x81\xea\xcf|\xc0\x38\x64>\xb0\xff\x18\xa3v\xffo2\xb6\xfeO\x19rs2\x7f\xbb\xde" +"\xc6\x44:)\x9c\xadK&\xf7w\x8a\x99\xf6Z\x11\xbd\xe0G\x15>v@9\xed\xb2Q\x93j\xa4=\xee" +"P\xdd\xfd\xf8\x85\x65\x19\x5j\xaf\xc4\xc5\xaeo Q\xaf\x5y\xa9\xac\xd4\x1d\x0w]}\xbe" +"p\x2,\xc2\x63\xdc\xa5\xe0\xa2[\x9c|O\\A\x85\x87\x66k/\xe2H\x16\xb1\xe0\xec\x92\xf9" +"\x7O\x14\x3\xbb\x83\xaf\xc3\xf1\xd5,\xa7\x9c\x38{\xde\xf8\x64\x36n4\xc9\xb\xe5/z" +"\xa0\x99\x35\x37:\x7\xe4\xe0&\"Nv\xf9\xec<\xb9\xe7\xed\xe5\r\xef\xdaH$\x8d\x61\xf3" +"\xce\xc8\x80\xa3\xb8\x84\x33\x6\x37]\x97\x11\xe5\x86\x45\xf3\x62[\xdb\x8e\x87\x5" +"-\xa6\x7f\x97\x94\xefJ\xf8\xdb\xb\xcf\xe0\x6w\xc3\xa2i\x7\xdc\x65\x1b\xc8\x38\xc4" +"\xe\xc3\x9e+Z]\xc0\xdb\xd3\x45\x94Jl2\"`\x89\xd6\xb5\x9a" +"\xad\x42\xa8:\xb4\x1b\x43-\xb4\x62\x65.)\x81\x37@\xf4h\n]K\xd4{\x18\x32\x8f\xaek" +"\xdf\x42\x0\xcf\xa4\xce\x37s\x80\x9b\x45\xe8\x88|\x9b.B6\x98\x9flH\xd6OY\x86\xf5" +"c\xd9\xa7S\x8a\x87\x16\x8/\x81\x93j\xeb\xd0\x46\x1eoK\xd4pCm\x8bvV\xf0\xfd\xf8\x91" +"\x8\xe6\xdd\x2\xab\xde\xf9\x7s\x1d\x45\x8di\xb\xc6\x8\xea\x9c\xed\x9\xeb\x1end\xc0" +"y\xcz#x \x1c\xe9\x97\xff\xe0\x31vy\xee\x1dN\xe9\xf9\x11WD\x93#\xe5;J\xda\x80\x96" +"\xcd\x62\x8bXa\xbfyEC\xa9\x8f/\xa2\xabT\xff\xf%\xa1=\xad\x43\xda\xf9\x39\x43)\xb9" +"Z\xa5<\xa3'I\xfe\xcb\xb+\xc0\x35\xdd\x1e\xbdS\xff\x9f\xb5\xad\x8b\xce\x6\xcd\x89" +"\xe5V\x80\x91\xc1\xcc\x31L\xfb\x1d\x98!\xd7\xf9\xac|U\xf5^\n\x16\xe3\x9a\x87\xd4" +"1H \x1b\x92\x8fP\xbf\x80\x99\x98" +"\x95y6\xd3\xbfj\xbc$\xb0\xa3\x97%\x8f\x9e\xb4\xdc\x8f\x65i,\xb0#\xd9\x9\x1f\xb1\x80" +"\xc6\x94\x98\xcd\xc\x8\xbb\xeb\xad\xc8J~\x0\x16\xe8\xf8\xbe\xa3%\xd9$\xeb\r\xf8." +"u\xd2\xcc,\xcb\xf0\x39\xb1\x19\x34\x36=C2\xc5\xfb\xc5\xecUk\xe8^\xe4\xe7\x7\xcc'" +"S\xcc\xc4=.\xd5\x5X\xe5\x1a\x10\x42!\xc9\x32<\xdc\xb0\x19\x9b{\x83\x45M\xe3\xfd\xc8" +"\x10\xd0\xf3\x62\xc0)\x9f]\xd9\x81\xb3\x1d\x8e=\xda(O\xef\x9d\xc8\xf9\xc8\xde\x13" +"\x8d\x30\x65\x43z\x7f\xe8\xc3\x5r\xad\x6\xd6.\x85'\xad\x37\xae\x39\xaa\xb0\xb2%\xf7" +"j%\xf6\xc6PRA\xeds\xbaIL\xf9#\xe9\x19\xf6\x88\xdd\xeb\xf1\x93\xe1\x88\xf8\xc4\xc1" +"T\xf2\x16\x31\x8\x7\x63\xb4\xd0\x91\xe8\xad\x1d/\xd6\x64\x9e\xc\xd9\x36\xe\x8d\x1a" +"g\xa5\xb5\xfa\xfcgT|\xa3\x1c\x95\xa5\xea\x8dN\xb5\xd6\x8b\x9fme2\xdb\x9bTXG5\x95" +"XT**\xe5\x8c\x9\xf3\xbd)\x18\xef\xbe\x16\x99\xe9\xc8\xf2\xc2\xa1\x1e\xa4\xd2$\xc7" +"&\xd2\xac\xd4\xa8\xd8\xab\xae\xdc\x65\x88\xcf*\xe5\x66R\x8b\x94\xf5[\x82:*\x1f{\xe1" +"\x90\x0\xf3\xe7W\x9d\x9N\x4pu\xdf\x18\xc8\xc8hv\x2\x95S;&\xeb>\xd9\x6\x35\xb1)\xc1" +"z\xcag\x9c>\x88\xb0i\x98\xceZz%D\xb7\x0\"\x9fZjPK\xd3\xe4['dq\x95\x9c\x8a?\x81\x91" +"zSB\x87\x39\xb5\xef\x9e=F;;\xa7\x31\x84H\xe2\xa3\xe7\x95 \xd2\xd2\x45\xa2\xa7/1\xff" +"pp\xb6\xe4\x62N:^!k\xd1\x3\x64\xc\x8d\xf3\x87\xe4\x9ds%)\xc6\x11\xf8\xb9q\x7?\x17" +"\xeb\xd2\xf6\xeb\x18\xf9\xb7Jg\xe1\x99y&\xdf\x17\x8dL\x9e\xde\xd4\x35\xb9h/\x1a'" +"\x9c\x81\xbb\x9f`\xda\xfe\x12XE\xa2\xff;\x2\x97\x9eT\x81\xc7\x8a\x45\xc4y\xbe\xfb" +"\x9f\xef<\xe2\xba\x9b\xc4lw\xb5\xb\x3\xe4\x8d\xa6\xd1{v\xf0o:\xd1\x18\x37\x1a\xdc" +"i\xe1x\xc5+_\xb4\xb2\x61\xc9\x31\x18t\xed\x7\xddm[2&\xa0\x5\xfd\xd7\xa6\xd5\x38H" +"\x9\xe7\x6?\x3l\xde\xa4\x16\x19\x12&5\xe8\x35\xd2\xd7L\xbbj\xa9\xb3\x8c\xaaM\x81" +"\x9c&\xe9Q\x15\xfe\r\xba\xb4\x19\x8f\xc5\x83\x8f,\x91\xb7\xa8{\x7\xd7\x34\xc6\xd4" +"\xf4\xf8\x34\x44\xc1\xe9\n\xa9\xbf\xc9\x8\xa2\xba\xc4\xb3\xde\xf9\x15z\xfc\xa5$\x8f" +"-\xa3\x1c\xa8{\xd3\x63\xac%\xe9\xe7\x7ft\x1dK,n\x2\xf0I\x87\xa6\xf4\x9d\x30\xe9\x3" +"\x8c\xef\xc4\x1b\xa1r\xddgZ\xed\x8b\x39!dA\x11\x44\xe5\xb7\x38\xf3!\xb\xe\x66\xb1" +"z\x13\xcb\x96\x31\xc3=DHNy*|\x8-\xd0\xa5\x38/4\xc5\x63vS&\x1b\x1e\xb6\xd2\x3[\x8" +"\xb4\xd9\x1f\xa9\xabw\xc\xaf@\xa1\x3\x62\x95\x11\xf7\xb4?'C\xd7\xe5\x83\x43=\xec" +"\xfb\x19\xc2\x1f\xd4\xfd\n\xfc\xc2*A\x19\xe7|\x87\xbf\xe6\xfeP\x6\x8b\"G\x90\x15" +"\xbeZ\x9f\x6\xbe\xabM7A.\x6*E\xe0\xcb\xcd{\xb3\x9f\xeet~\x96\x30oy\xfcO.\x89\x42" +"\xdf]\x9d\xa0\xe5Z\xac\xcd\xa5G\xda\x19\xd3\xb\x84\x4\xfa\x12\x12\x98\xb4L\x9c\xce" +"\x19\x8cp\x8ci\xa8\xd6\xbf\x17Y\x1c\\P\xd3\xfc[\xe6\x96\x1fz\xba\x8f\x36m\xae\x95" +"z\x1c\x37\x30\xdaJ[O\x3Z\x92tg^\xe3\xbb\xf0\xca\x8c\xe9\xd8\x34\x9fP\xca\xbb\x1c" +">\xa4\x94\x8a\xbeo\x9f\x14\x35\x92\xf1\xea\x95@Ni\x9\xa9\x9\x16\x8e\x32y\xa9W\xae" +"\x19$$\\5c1\xa7^p\x8\xbe\xe9+\xea\xa3\x4\xba@\xb7\xc3\xf4\x8ft\xd9\x1\x8b\x32G\xdf" +"P\xeb\xd7\xceT\x1d\xa4\x8e\xcc\xb1\xb0\xbeQ\xa4U\xc3\xc1<'\x9dM\x86v\x7\x8c>\xbe" +"C\x8t\x8dR\xc9\xb0\x41\xd3\xe7$Lt[\x1f/t-\x1\n\x9e`i_>\xc4\xfd\xc1\x5\n\xc0\x82\xb9" +"\x5\xd6\xa5~\x8f@z;G/s\x10\x11\xa5y\x89\x65\xb7\xb1\xa3\x7\xe2R\xfe\x2\xc8\xf7\x9c" +"\xee\xdd\xebn\x16_\x1a\x94\xd7\xff\xf1\x8d\xdb\xdfyG\x7f\x14\xe9\xe9\x39\x81\xab" +"\xd2\x0\xfewq\xb2\x9d\x1d-\x12\xe\xe7\x9d(\xb9T8\x18Rp9\xact\x8^\xaf\xf2\x41\xb5" +"m\x8\"\xc\x95\x8b]\x9c\x87\xc0\xc0J\x14\xd5*\xfdG[T-9\x1b\xc5O\xf3=\xef\x8d\x94\x84" +"\xaf\xf6\x87;\xee\xd3-\xdaK7\x11\x12\xb5#\xb6\xce\"\xb4\r\x1b\x41kd\xc9\x37\xf\x1c" +"\xdf,T\x8fL\xcb\xe9\xe1.!\xc3l\xc3\xeaR\xda#-\xcf\xb6_f\xb2+^.\xc0HRQ\r^&N\xe9\x39" +"\xbbg\xae\xc4vK\x87\x6*\xeb\x7fh\xb@\xbc\xee\x4\xad\x45\xc7Q\x9e\xb3\xb6\x19\x9c" +"\x9e\xe\x33&aF6G\xf2\xfb~\xdf\x30>\xfe\xf8H\x91\xce\xbc\xf0\xfa\xc5\xf7#\xa9\xd0" +"Gl?\x8c\x9&\x4\xc8\x7f\xc6\x9cz\x90\xf4\xd6J\xe4ZG\x8e\xe8\xba-\xf5\xf\xb9?U\xa3" +"Ta#\xf0\xb0\xe2\xc1\xc4\xc\x98\xea\xae\x9f\xf&\xb8\xf8\xf\xfenk\x94\xb7\xe2}(\x84" +"\xd5\x8b\x8a\x11\x96\x62-\xf6\xbe`\x8cUi\xd7\x86K\xb7V\xdf.\xdd\x18K\x90\x81+D\xed" +"J2\xd0\x1\xc3\x13\x83\xa4\n\xee\xe9t6Q\xf7\x95\x8\x46\x15\xc4\x8e@-\xbc\x1\xc8\x18" +"\xd4w\xea\xc0\x34w\x95\xcb'\x92\xe9\xc1\x1e\x8f\xd4\xa0.\x19N\xed\x1c\x91\x9d\x45" +"\x98\xfe\xc0\x3\xb6\xd9\xa8\xa0\xbc}E`G\xa1\xc0W\x94S\xfc\x1d|\xb2\xd1X\xd4\x66\x93" +"\x9a#\xd7\xa7\xb8\xab\xed~'w\xect\x87\x97>s\xf2&m\x9c%\xc\xe3\x7)\xe3\xc5\":\xd9" +";\x9a\xe8\x44;5q\x1e\x44j=\xc6`\x12>\xd4\\\xe1\x94*\x1a*\xd0\x61\x4g\xe0\x81\xce" +",\x8b\x92\xa6\xc8/\xb\x17\xb5\xd2\x42\x9e\x99\xf1\xa6&\x80r\xc6\xb5\xaa\xaan\xb6" +"(:\x87,T\xd3iL\xd8%\xeb)&\xe5}\xbb\xc7\xc1\x66\x30u\xe6\x87\xa1\x44\xe4\xd6\x1c\"" +"W\x81\xd8\xf\xca\xe1I{D#B\xb4\xa3\xf1\xcdk\xdbP\xe3\x17\x91\xcc\x39(\xc3\x8\x35\xfe" +"\xf8\x45\xb6\xbe^-~?/_\x8Z\xa3\xfa\xeb\x45\xca\xd0\xd7k\xcb\xb1\xed\x85\x9a\x9c\xeb" +"\xb9\xf7\x45p6\xf0\xbc?\x19\\\xb1\xa9\x8c\x9c\x86H\xf6X<\xdb\xb2\x38\x94\xbcq\x9d" +"h\xc2\xdb\xd8\x0;\x10\xd0\x8c\x8c\xaa@\xbc\xe7\x84\xd7\xbf\xb4\xee\xc9\xeaSY\xac" +"\x5nW\xb8\xb0\xf2\xeb\xcb\x1fL\xe4\xc\x87\xfcxa\x18\x1\x33\xe0\xcbl\xe2\xfcO\xe6" +"\x90um2z+Z\xe0\x63\xe3\x2\x1c\xc\xb\xd4 \xd0V\xf0\xb9\x41\xe6\xb3`\x88\xa5[\xa1\x1d" +"\xc\x35\xfd\x1\x32\xd5\xf4\x8e]\x96sW#G\x17\x1b\x43(\xd4\x80{\x97(1\xc0\xd7L\xff" +"\xa5\x63\x8c\x14[\x89\xc9\x89\xe6\xec\x94!H }m\xb8\"WXYX\x3M\x9f\x9d\x42!\xc7\xc9" +"\xf7\x1\x37\x90\xdb\xd1\x30\xf2w\xe0\xbc\x88\xbb\x17\x9d\xd0\x9e'\x6#y\xed\x6\xf2" +"^\xea\x8b\x7f\xb3<5\x86\x1a\x0\x34wn8\x13\xd2\xe9\xe5\xc1\xe\"|\xc5i\xab\x36\xcb" +"-\x9d\xf2\xe7\xb7\xb4GX\xf9\xdcO\xfa\xd7\xa2J\xc7\xe9\xf4z\xa8P\xc2!\x4\x8c<\xb3" +"Z7\xce\x8e\xa7V2\xae\x65\xfe\x32\x12\x17QF\xfe\xcd\x63\x34\xae=<_I/\x6\x7fy^\x1e" +"\x8f\xf3\x86\xba\x19\x8c\xb7O\xb\xb4\xdc\x0\x0\xda\x38;\xc4\xcc?\x7\r\xe1w!C\x19" +"\x88\xd6\x9c\x8b\x1aZ\xfd\xcc\xc8<\"\xe1j\x87\xe0\x1cm>y\xdcz\xfa=\xb0\x37\x1b\x8" +"f\xef\xb8\xb6\xf8\x89\x0G*\xfe\xf1\xc4\xa8x$\xb9\xb9\xc6Y\xa5T\xe1\xfc\xe4*^\xc6" +"Z\xc3\x91\x90\xefKf\xde\xafo\xc0V\x9a\x0\n\x9e\x14\x95\xf4/po\xbe\xa4\xd3.\xb7\xef" +"\x11\xa6H\x91\x2Yje\xcf\x89\x9c/2/Vy\xc6\xd1#F\x91\x92\xa9\xbf\x1a\x7f\x1f,\x81\xc5" +"T\xad\xb9{\xd1\x9a\xdbtjO\x81\xa4\xd5U\x9e`\xab\x94\xc4\x83\xdb\xab\xf6\xce/(\xcd" +"\xb4\x12\xd5\xf\xf3\xfc\xfa;=\xaa\xac\xc6\xa8<\xfe\xd9\x10\xcc\xb3\xb8\xd2\xc1\x95" +"\x90\xaf\xf4\xd7S\x3Jl\xe7\xf4\x15h\x96\xa1\x38\x8\xe0\xdf\xea\xc5G\xe6\x9d<\x88" +"f\x91r\x8eJ5\xac\xd5u\xb4\rr\x1e\x8f\xccS\x85\xa2\xeb(\xd7\x8\x10\x1d\xc5\x8\x11" +"R\x95(\xf5\xcb\xc\x0\x9b\xa7\xe3\xc8\x84h\xe3wh\xfb\r\x83\x89Z\xb5M\xb2\xddT&V*\xf9" +"\xd8\xaf\x30K\xf6\xed\xa5N\x9c\x92\x64=\xf9&\xf5\xc3W\x82iu\x1 0*7\xcb\x14\n\x18" +"\xbaV\xba\x1\x10\x8dJ\xca\xce\x8f\xea\xe6@\xa6\xc6\x95\x8e\xf1V\xb5\x88\xad\xb0\xea" +"_;\xf\x37\xbb\xa1+{\xcb\"\x1c\x81\x14\x15\x38{\x2Kpv\xfa\x44\x3\xa3\xadn\xbb]\x9c" +"&\xef\xeb\xdbz\xde|`\xb4\x44\xab\x9f\x90\xeaI;e\x8bwg\xae+\xe6I\xbd\xbb?\xe8_F\xf" +"\x1e\xd1\x37\xc6\x1b\xd9_|\xd3\xd8\xb0\x15\xce\x45\x13\x85\x38\x93\n\xb6*\xa0\xe5" +"KL\xe1\xa5\xec_\xec\n+(\xb3\x45\xb6p\x89\xa4\xe4\xae\x14\xd2\xe1\xf5\xa9\xc8\x84" +"\x8d\xa6\x88\xca)\x8f\x93\x86\x6I\xec:\xaf\xef>\x82\r\x86\x98\x8c\x8e>ZMK\xb9\x37" +"y\x18'\x99J\xa3\xe8\x1d\xb\xb3\xee\x11^\xc3m_\xb9\xa3\x92\xd0\x9ey\xafQM\x11\xc7" +"\xb3\xa0<\x9f\x9c\x13\x35\\\xe7\x9e\x11\x9a\x19\x17\x7f\xfd\xca\x34pM8\x11\x8a\x89" +"v\xd1\xeeZ\xa0-\x14\xfe\xb1\x41\x44\x19\xf5\xe8RD\xad\xc5\xc0\xa7\x65\xa5\"\xee\xf3" +"ap\x6K\xb1\x9f\xee;_{D\x1eM\xb9g\xda\xe0\xba\xc2\xc4\x8f\xc6\xa8\x36\xe0\xefZi\xf0" +"s\xbe\xe1i\x9fU\xe9\xc7W\xeb\xd6\xfd\x8bQN+I\xd6\x33\x38\x15\xb7\xdb\xd1\xe0iF\x95" +"\xfc\xa3\xd2\x13 \xa0\xc4\xb8R\xd9pm\xad\xd8\x36\x9a\x95\xfd\xd9\x17\x32\x8b\xe9" +"=\xd3\x38\x18\x95M\xbd,!-,\xa8\x15`\xed[\xc2\x84\xeb\x4z_8\x9e$\xe4?O\xa8\xc9\x7f" +"\xec\xf4\x65\x89\xfasA\x7\x65U\xcfU\xb1\xc2\x1b(\xe0\xc1\xcb\xb0\n\xb8\xb6\xf6tr" +"\xf2{\xc0\xd1\x11H\xf4\x7\x82K\x1Y\xb5\x18\x8dK\xb7\x38o\xbd\xbf\x1c\xf\xaf\x34r" +"\x1b{\xcb\\\xf\xcb|@\x10\xdc\xb6\xa1(N\x9dx\x83\x9e/\xea\xbd\xb7\xf3'" +"y\xaf\x8e+P\x94\xa6\xe9\xb7\xa7\"_$\xc4:\x8e]+\x97~\x1e\x19\xe6\x33\xc2gq\xe2\x30" +"\x17\xed#=\xbb\x2\xc6O\x8c\xf0\x39\x92\xc6HE(\xd0\xc8\x46KF\xf2O\x9e\x83\x80\xf3" +"\x85\xd5\xd0\x1b\x88\x93\xc6\x7f\xc1\x3I\x89\x83\xcf\x93\x94\x32\xaa\x38\xc\xa5v" +"\xd0\x90\x30\xcdR\xfd\x99\xbd\xc3\xbe\x16\xc7 L\xdc\x33\x65\xbfv)J\x83\xa1\xfc\x14" +"\xa2\x36\xf5\xfeS!\x90Nw\x9b\x13#*v\xf8\xfeR\x1f\x42Ubg\x84\x36\x35\x9c$a\xbe\xa5" +"\xab' \x95\x41\xf5W\xae*\xa6\x0\x9\xc9\xca\n\x9f\xc7\x89\x8c\x14\x30l\xe3ZP\x1{\xad" +"\xef\xde\xcb\xbf\x94\xee)\x5\"\x7\x6\xdc\x80\x64\x9\xef\x87\xdb\x1ds\xea\xb0i\x8a" +"\xd2\xdbr\xcd\xcd\xb2\x93\xe7\xfb\x13\xc9M\x9f\xc8~tP.i'\xa2\x12\xf0\xd7\xd2\xf2" +"\xd1\x94\x64\xf7\xa6j\xc0xr\xe1\x8c\xb1\xdd\xe8\xf1\x18\x35\xdc\xbc\\N\xf0\x39\x33" +"?\xff\xc0\xfc\x14V\xda\xad\xe7\xda\xe3\xec.\xe0\xd3\x41[\xc\xab\xb6\x9f\xc5\x0oM" +"\x14\xa4\xee\x1a\\\xa9\x9a\xd4\xd5\xe6)\xc0\xdd\x1e\xf\x9{[\x93\xde-\xd0\x1\xa8\xc4" +"\x18#L\x9c\x45\xe8\xc1=\x1a\xe0N\x94\x66\xda\xb8\xcf\x1e\xcb\x88\xa4\xe0Y\xc1\x11" +"\xa6\x46\x8d-\xab\xb9\r\xa7\x9c|y\xe9M\xb2\x8fih\xb1\xa6\x32\xf8\xc5}\x9eV_\xf9\x1c" +"i\x16\x2o\xfa\xc0\x66\x18V\xb9\xfb\x8d\xe9\xc8\x16\x61\x81\x62!\xb1\xfc\x15\x9c\xfe" +"\xf1u\x1e~@?_,\xe3%)\xddT\x7\x92\xfc\x17\xa1*=\xcd|P\xd3\x8e\xea\xad\xbd\x10\xad" +"\xbf]\x8a\x82\x44*\xa9\x0\xce\x61P\xebzF9\xdd\x9f\xb6\xe3\x85\xb2\xfd\x9\x34\x93" +"\xdc\xcd\x90\x14\xb2>\xb1r\xe2\x1a\xa8\x96\x43\xa6\xca\xd1\x9\x33\x43\xd8]\x81&\x19" +"r\xde\n\xcb\x16\xa4\xc6\xb5\xf0\xbeL\x97\x8b\xfa\x12\xd3\xca\xf0\x13O\x9e\xa4\x9f" +"n\x96\x87\xc8\xf9\x9a\x45gE\xea%/\xb\xa9\x96\x8c\x7f\x95\x86\xe3\xdd\x84\x1a\xa9" +"-\xc7p[\xddh-\xae\x41Q\x8a\x9\xdf\xe \x9f\x32\x1d\x7f\xa3\x41r\x2\xf4\xbav\xa9\x84" +"\xda:\xdd\xbcX\x13h\x85\x36/\x2\xf0\xa2N\xbc\x43\x9b=\xbb\xda\xcf\xfd\x84\x98\xeb" +"\xd2\x9f\x88\xf0\x16\xb1\xfe\xab\xc1\x7\x85\x43\x8e\xac\x86\xbUE%\xf3&`\x97\xa6u" +")\x9a\xa0\x96{\xd3\xb7\xa0\xee\xee?\xc5x\xd1\xbe\x99\xd3S;\xd9\x15q\xae\xd9\x4\xbf" +"\xc9\xda\x1a\x14Q\xfd\xc5@n\x1c\xd6\x14\xe0\xc7\xfb\xc7\x33V<\xd6\xcel\xc3\x1e\x92" +"7\xca\x15?\x1f\x4\x11\x11\x43\x61\xd7\x31\x63k\xcf\x98UZ\xbf\x12\x84\x8a\xd1\x9\x37" +"\x1a\x42\xb6\x36u\xa4\x13\xb\x81\xe9|*.\xe2\xbb]\x8f\xae&@\x15`\x1\xaf\xfU\xd9\xd5" +"\xdf\x8f\xf2<\x8a\xef\xe1O\x12\x0\x0\xf1\x41I\xa3n\\\x94\xcd\x90\x81\xde\xc2w\xc2" +"\xc3Hp\xd0P\x11\xf9\x9dH\xb0\x87Z_\xf5\x42\xf0g\xf7\xe9\x88\x1\x9\xf5\x86\xbc\xf2" +"\xb5\x5\"\xa1\xf2>\xce\x44\x34\x9eS\x9ep\xf8N }\xc9\xbe\xc7\xcd\xf8V\xa0\x46\xf1" +"\xa0\x32&\xaa\x41\xf5\x41q\x9a\xd1\xaf\x88\xff!\x1eW\xdd\xc\x12u\xdd\xb{GD\r\xa0" +"\x89\xb9\x8cn\xe9*}\x94p\xb\x83\xce\xbe\x19\xea\xed\xd8\xa6\x15\xf6Xu\x87\xba\x8b" +"\xba<\xe3\xaa^\x8e\xaf\xb1\xfb\xfHk\xe3`\x9b\x16\x9e\xfb\x17\x8a\x42\x92\xf4\xc0" +"7\x8a\xfe]$\xee\xd1\xca\xabQM\xdc\x66\xc6\x96\xd8\xe3\x7f)Jey\x13\x1d\xdfT\x88\xe9" +"Cf\x9\xac\xd7P\xc3\xdb\n\x94\xc\x84\xfe\x2+\"\xad\xc2gob\xe9\x1e\x8f\x89\x12%\xf8" +"\x91\xfb\xa5\x37g\x9b$T{\xbb\xf3_\x4\x91] \xb1\x17\x39\xf6 \xd1\x8b[!i!\xd2\"\xf1" +"PD6\x85i\xaa\x30)\x80\xb9\"[\xb8\x39\xf4\x94X\x84\x81\xb9K\xcrCR\xb2\xdf`\n\"\xb0" +"bV\x1d\x86\xcb\x8f\x81QO\xbd\xaaO\x8a\x4:\x2\x65\xf9\x92\xfa\xb7\x1f\xc9\x12JE\xb8" +"G^\x1e\xf3\xdfkm\xe3\\\xf3)w}E\xf0\x83%\xe8P^\xc0\xd9y\xf5\x42\x80z\xe7~W\xe4SR_" +"#\xbcY\xa5\x7@7\x1e\xfa\x98g\x8a\xeelBSt\xae\xb7\x45\xb9\x9d\xdb]\x8d\x90\x8f\xdb" +"U\x1f\xbc\r\xb1X2\x10{\xbe\xccN\x11\xa1\xa8\xde\xc6\x93X\xa5t\xa2\xed\x46\xcc\x31" +"\xd5\x64T\x9e\xff#\x10-\x92\xbf\xdc\xbb+\xb9\x85\xf7\x8f\x36\x3>4\xf5\x9c\xe\xba" +"\xfa;\xddq3\x87\x36\x46L\xef\xdb\xa9\x13\x98\x33\x99^\xda\x42\x7\xbf\xd4\xa9\x86" +"}2\xe8g\xfb\xeb}\xe6\r\x13(\x3\xef\x93G\xcb\x17\xbd\x91\x31T\x84\xef\x65p\x89\"\x97" +"\xdd\x8b}\x96\x61\x3\x33\x95\x35\xe2\x8a\x0\xcb\x1e\xec\xa4\xa9w_`\xa9\xf5\xfc\x9b" +"\xd8\xb0mx\xfe\x8e\x63\x18\xc3\x1d\xa2\xe8G\xe3\xf9\xcaX|\xb0\x1a\xe2\xba\n.\xbd" +"\xe3\x8\x31\x44\x13\xf4\xf2\x30\xa7X\x18N\xd6\rOq\xf6\xce\xc2*\x93\xa0\x1blT\xe0" +"D\x9a\x38`\xfc\xa8\x95J4{u\x88\x32\x9a\x80\x97N\xcb\xec\xda\x10p\xfb\xc0Ufcu\"\x9f" +"\x13\xdd\x99^\x99&]\xf8p\xbc\x8b\x8c\xc6\x34\x7f\xad\xbc\x1aj\xf6\x45\x99'\x1aG[" +"\x91#I=F\xbe\xc4\x12\x89\xbe\xebg\xeb\x97\xa8\xde\xd7\xa9\xc9s\r7\xc6Qd\xcf\xbd\xc2" +".\\\xa5\x89\xd2\xe7\x95Lq6\xefN\x8LC\xa6\xc7\xf3\x61\xa3\xe9i\x89#\x9b\xdd\xb9\xa5" +"\x93\xcc*\x80\xba\x16\xde\x9e\xe9\xe\x95\xcd\x39\x39\x9n\x0\x9c]<\xb7$\xb4\xca\xbb\x32\x83\x8d\xbeR\x7f" +"\x83\xb1\x8c\xb4W\xe5{\x9,0.\xe5W\xfdO\x0\xdb\x9cV\xe6l\x9f\xdfN\xc9\xff\xaa\xb8" +"_`\xd0+\xa7\x96\x94\xfa\xbaGj\x19\x9a\x3\x31\xc3\nx\xa9.\x10\x41{\xa2\x36\xe2\x33" +"d\x81t\xc8&3\x1d\xc1\xba\xb8|_\x95\x2xF\x13\xcj+@'\x93\xe\xbf\x9a\x97\xba\x1b\x3" +"\x9d\x38o\xc5\x1c\x30&H\xe2Y\x80!/jX,\xde'x\xc6w\xa0\x1f\xbf\xb3\xc5\xd1\xb8\xa3" +"t\xad\xafj\xdb\xf7\xdc\x94\x7_%\xed\x66\xd4@\xb3\x92,_%_\xb2?\xd8\xf6\xe2\x1e\xa6" +"[\x1d\x93\xbb\"V\x84\xb5\xf\x11\x31\xe$+\x8uu\x97\x33\x45\xb2)\xba\x62\xc1\xe2\xc3" +"[\xda\xec\x4\xd1\x1H\xf5\xb2\xf3\xbc\xf7\x39\x9b\xdf\xdf\x1f?y\x11\x97\x14\xae\xa6" +"\x97$[\xc6G1n\xa1WHN\xcb\x95\x1b\xe3g#O\xd0.\x8b\x1f\x9\x1a\xac=)\xbf(-\xff@\x11" +"\xbc\xc\xba\x8eU#M\x94=\xb3\x1|\xc7\xa7\x66r\xb\xbc)\xb2\xd0\x97\xa9V\xc0\xf1\x6" +"qw\xf0\x12\xd4*\xdc\xb4s\xcd\xe8\xd1\xba\x35\xb4\x3\x7W\xfa\x1d\x82\x11\x98\x9d\xf3" +"\xbd\"\xce]P\x1c!\xef\x87\x8\xfb\x34I\xdfG\xd8\x86P\x9f\xf7\xb5\x9bv\xc0\xdb\xae" +"D?3o\xee-a]~\xed\x1c(O\x14\x33[\xc8\xa2k\xf4\x62\x1e\x10\xde\x96\x11\xfb/\x1d\xbd" +"R\xe4\xb7V]\x8c\x65\xb5N\xa3mP\x8b\xcf\xcW\x8aI\xa2\x66R'\xcd\xe1\xf9v\x8e\xfe\x84" +"\x7f\x9d\x94\xf1\xbb\xb7\xdb\x83p\x1c#!\x98\\r\x83\xd4{.@\xb2z&\x84(\xaa\xef\xe7" +"_k/\x87\x64\xa8INX'W7X\xcb\x9c\xa4o\xa9\x32\x8\x83k\xcc\xc8\xb5VJi\xf5\xad\x88 R" +"\xaf\x1c\x14\x17\xc3\xfa\x7fX\x5iR\x86\x82\xc7p\x80\xf3h\x8b\x65\xe7\xfc$\xd2\xa3" +"\xae\xb6\x15t\xb4\xa3!Y'(\x15\x44\xdd\xd7\xa6\xee\n>\x93\x88\xf8\xf6\x31\xcerQrM" +"\xf7\x7&\xe5\x91-\xdc\xcc\x8c\x65-\xd6\xc9`\x8f\x84\x62\x30=\x86\x7fX\x9d\xe0\xf2" +"\xf7\x17\x11\xb3QB\xeen\xf9;d\xd6\x32lM\xd7\xdc\x83'\x8e\x5q\x0\xeew \x82\xe6\xba" +"6\x8e\xd9\x1aUS\xec\xfe\"\x93\xa4\x81\xe4/\x83\xbc\x8f\x91H\xc7\xe\xac\xe9\x1f{}" +"\x9c\xb8\xa7$\x15\xbd\xb3\xaf\x66\xf6\x8e\xa7\x33\xa1z\xbe\x9d\xb0\x5;\xf1Hb\x91" +"2\x96\x95\x89\xf3\x8d\x30\xea\xbf\xa9j\x1\xfa\xc7&P\xb5\xa6\xff\x39\x35g\x1\x98\xa1" +"\xea\x33\x81\n\x9b\x11\xe3\x30\xeb\x8b\x45\x1f$\xf9\x35\x44&46\xf6i\xabZ\x90\xa5" +";\x16\xcc\xee\xac\x36\xb1\x44Ut\xef\xa7\xe8\x2\xdesR+\xe7%\xe6\x87\x4\x82,\xb7\xd3" +"\x91'\x17\x33\x33g\x89[\xbf\xbe\x6\x96j\\\xc6S\xaa\xb5\xe9\xb3Yg\x2\x8k\xf0\x1\x0" +"\x85\xb9\x0q\x19\x32\xa9Z\xcf\x15\xcaM\xc4ZuN\xa3\x34\xe9\xeb\x84\xd6\xfc\x8e?\xc4" +"\xf8\x97\x45k\xed\x64\xbb\x93\xb5\x93T\x9f\xf0\xd5\x35\"u\xd8\xe4\x17\x17*fd\xc5" +"\xe0\xec\xed\x10\x19IJ~\xd4\x9a\xb0\xb9\x65\xbe\xc1\xa8.Xsvk\xb3\x8d}\x85`I\xcc\xe2" +"\xfc\xa6Z\xaf\x61\xe9\x61\xb6\x6\x34\xe2\xa6\x9e\xf0YuL\x9d\x81\x63\xd8\x7f\x92\x8c" +"\"'r\xd0p\xd8?\xeco\xa5\xacsJ\xf6^@\xbf\xdeR\x1f}\x9c\xb1\x65\xf\xdf\x64uK\xff!\xea" +"?\xf0\xafv\x11\xa9=R^\xc9\xb2\x8cQ\xaf\xec\xb0N\x7f\xc8\x32=\xd6\xc9\xb0\xd8S\x9a" +"4\xfc<\xd8\xce\xb7\x95\x8e\x8e\xbb\xfe\xd4\x31\xb8\xf9\x6OR\x92\xf7\x15\xf8 \xb4\xbb\xfd\xd5ov\xd4.z\x1a\x6\x8c\x1c\xbd" +"\xce\x46@\x8/n}X-\x19\x39\x99\xc\xe6\xee\x8d'\x0\x15\xa2\xc4\x61y\x8b\x37\xdc\xb5" +"y\x8e\xe9\xf7Q!h\xb7m&\xc2\x8b\xe4\xa4\x9a\x1b\xf9l\x89\xd2\x35\xf2\x1a\x1d\xb6\xa9" +"n]\xa4t\xd0\xb1\x9b\x80\x8d\x13\xd7\xa1\x1b\xf3\x9e\xa8\x64t\x99\xc4\x10\xed\x98" +"\x94\xa1\xad\xf3=A\xb6\xfc.aM\x80\x87\xf4\xc8NC{\x13o<\xb3-\xb8\x39\x9\xe3\xc7\x46=\x2\xa2-pV\xbev\xb8wc&" +"\xe\x46\xe4\x8b\xb8\x32\xb7\xee\x13\xf8\xdc\x5\x37\xec\x8e\x81\xe9\xbd\xfe\xad\x8c" +"'\xeb\xdf\x1a\xd7\x6\x93>\xfd\x11\x13\x1e\x12\x81O#n\xbb\x1\xbe\x85\xb7\xf1\xb2\xd6" +"'A;2I\x18\xd2G`OV\xec\x12\x89\x9\x87?\xec\x38W\x2\x8b\xefv\xa3ICd\xc2\xa7\x0-\x10" +"MHb6\xc3\xbH\xe2\xb7]\x85\x1c\x34\xeaP\xba\x7f\xfe\xb4\xe1\x91\x90\x89\x8a\xe2\x17" +"h\xc1W\xc0\xca\xc6(\xa2\x18\x1a\x32yo\xbc\x1arq\xd2G<\xd8\x8eS\x95\xdd\xbd\xb1\xfc" +":\xa8\xdf\xf=X\x86\x37\xf1\x9a\x8b\x83:\xfd\xeb_eZ\x88\x38\xee\xcdhN#\x15\xb7,u\xce" +"\xef\xbc\xef\x94\x34J\xce\x8dj\xdb\xe3U\x0\x8e\xc7/\xe7\xce\xea\xb0\x13\x63\xa8\x95" +"\xf4\xe7?\x86v9\xbe\n\xb\xe6s3\x84\x88\x16\xb0[A\x92!\xbe\x8f\x90\x66\xc3\x62\xc2" +"?\xe8[\x7f\x39)0\xbf\xe4\xc1+\x95&\xff/\xde\xc3\x8f#\xa1Y\xed\x61\xa0q\x8eq\x15\xc2" +"E\x97\xd8I\xfav6\x91ST\xa4\xc\x96]Mr\xec\x94\xda\x61\xa0\x37\x66\xab\x39\xaa\xb6" +"\x84\xe1\x34\xfd\x14\x7\xa5\xb1\xb1\x9b\xfe\xbaR\xaa\r\xa5\xd9\x9c\xbe\\\x82\xdb" +"\xaa\x66\x37\x11\xe6\xde\xba\x18\xe\x1dJ9\xc3 QjCP\xd2\x96\xbc\x19\xbf\x1b\xe0T\x85" +"\x9a\x8\x89\xc7\xe9rz\x2\x1f\x31v\xfe\x62\xf\xb0\xc8\x37\xe4\x14\x1f\xec\xe5\x31" +"\xa9P\xc0=1\x9e\x32Up2 \xb7\x18[\xd2\xf\xe5\xdb\xa6s\xf8\x12\x9a\xb2\x11\xef\xcf" +"6\xee\x39L~\x0\xeb\x8vbK\xc8@\xfa\x86\xe5\x8b/XGT\xcbk\xfd\xfdv\x81\xe\x30\x7\x41" +"\xeb\xe4TNZ\xc1t\x13\xad\xeb!\xc6/f\xcaO\x7\\\x32\x38\x17\x96\xbap\x97\x82\xde\x34" +"\xa6u\xb7\x17\xa2\xc7\xf6\xd8\x81\x4\xcb\x92O\xde]\xf7u\xb4\xf0\xb6\x8e\xe.\\/x\x8b" +"\xbd\xea\xf0m\x8e\x1f\xc2\x10\\\xcb\xbdX'\xc0\xb0?\xd6\xcd\x64\xf0\xd0s\xf3\x19-" +"_\x94\x83\x96\x44\xe5\xeclQ\x85\xba\xdc\xf0\x41\x12\xa6_I\xa8\xc8\x31t\xa9\xae\x95" +"\x8ev\xa2\xf5\xaf\x46\x9e\x8bv\xc8\x33x,_\xfb\x8b\xd7\xb1\xbb\xbb>\xa0\xcb|\x97\x86" +"\xc3\xbe*\xde^z\xfa\x8c\x8f \x89&Y\xa5\x9b\xc4!\xe2\x88\x45\xa1\x8\xe3N\xe1xd\x4" +".\xf5\x87\xa6\xd6}\xec\xdf\xb3\xf5\x10\xeb@\xd2\"\x95\x85\x34z\x0\x35g\xf\xccv\xc2" +"\x83zNMh0O\xe1\x13\xc5\x39\xb3\\\x1f\x2\x34\xb5\x7\x9b\x8e\x32\x93\x45\x46\x98)x" +"\xc5\xe4\xdf\x95ZEN\xa2\x63\xc3\xca]q\x1\xf3\x1a\x31\x8d\x82\xa3\xf9\xfc\xb5\xa8" +"\xaf\xd7\xa6R\x9\x66;\xf\xc9\xda@\xb&\xf2\x85\xef\x46\xd0\xe1\xea\xf8\xac\xb1\xf1" +"\xcb\x80^9\x86\xd0K\xc5\x85\x7?\xc6H\x95\xe4\xda\xe1\xcc\xb7I\xbb\x43\x9c\xb3.\xa9" +"\x11v\xd5\xc3\x9c\x36P\xd1\n\xfb\x9c\x98\x84\xd5\xfb\x90\x18\x34$\xce\xe6~\xf2\x17" +"]\x1\xd2G\x8dgQ\x1e\xc9\xf5O\x88v<\x15&\x97\xb0m\x94\x8b\xedI$\x0\x96\xee\xe3\xd0" +"j\xb4W^\x8e\x8b,\xb8&;[\xcfO\xa1`\x87 \xf5+gS\x9\x83\x30q\x87\x9d\xf5,>\xc2\x87\x1d" +" \xf3\x98\xb5\xca\xc8\xf8\xa4\xd4\x1d\xf\x1dGXM\xd9\r\xcd\xae\xa4\xa1\xcf\x16\xc" +"K;\xf1\xaa\xb8\x90\xb5\xce\xb6\xcb\x34\x88g*\xa6\x8f\xbd\x93\x82\x81\xdb\xc1\xd8" +"\xbc\xfe\x92\xfb\xf5\x14\xdaSXD<\xb6\xe0\x14rT\xe9\x1b\x38\xceg\x87\xb2\xbb\r\xed" +"\xd2\xd3\x8fY8sz\x97{^\xa4(\x92R\xcX\xf8\xfb\xb5<\x99KW8#y\xe9I\xf\rip\xb9\x80\xe1" +"\xbd\xf8\xcf\x9fL<^\n\x18\xf6n\x86\xee\x93\xff\xe7\xfeTm\xe5\xf\x41\x36K\xcb\x37" +"!\xb6\x37\x7%q\xfa\x17y\xf1\xd6r\xfa\xd2`\xc1m\x7f\x13\xcb\xdf>Cv\xe7\xffV\xd2\xa7" +"\x10\xacZ\xc3_\xcb\xdb\xce,\x9c\x17\xe5#\xbb\xe6!\x86\x17\xb1<\x1f\xa6g\x9b\x30\x89" +"y\xae|a\xdanh6\x93$\xc6\xcb\xc7\xdd\xec\x36NZ\x86prf\xc0\xb4Y\xee{,\x3\xfeXNR\x9b" +"\xff\xdc\xe9\x8c\x90\xa2\xf3\xd9\x30Z\xa7M>\xd8\x43\r\xbf:I\xfe.\xcf\xd9\xc4\xbc" +"\x9f\xef\xd2&\x18\xfe\x9c\x8a\x97:\xd0r\xaboq>M\xf0-\xcd\xa7\xacSY\xb2\xd6R\x1>\x13" +"\x1bv\xb3\xedlu\xfdS\xbaX\xd8\x62\x84\x62\x64\x62\x7fk\x9ep\xd8\x80\xfm\x9b\x32$" +"+tzg\xbb+EgX@\xd3O\x85*\xa8\x6/\xa6\xb0\x1e\x31\xed$\xda\xe0/l\xf7\x88\xa1\x7f{\x93" +"h\x17Q\x95\xdb\x0r%\x9c\xce\xf\xfb,\x10\x35\xc1\xd2n\x17w\xcc\xa3\xd5j\x82|2B\x6" +"\x9ev\xd6\xddi\xb6Sv\x86\x14\xb9\xac\xff\x16V\x7f\xea\x61P\x8dQEK\xc0/l`\xf7U\xae" +"\xf6\xaf\xae\x35\x36\xbb\xfa\x18#\xf8\xe1\xa5Q\xf8\xad\x14\xd1\x1d{d(\xe2tCq^\xbaN\x9c" +"\x5\xd6\xf2\x38\x37\x8f\x94\x98\xae\xf0\xe7\xeeO\xe6\x85\x66\"\xcc\x8en\xd1\x41\xee" +"_\x10\x9e\x34<\xb6i\\K\xe1\xe0\xf6\x66\x1\xc2yu\x98;\xf5W\xc0J\xcf\xc1\x92'\xa1\xad" +"~lD\xc0\x5)\xfc~\xdd\x7f\x88m$\xb7\xe0)\xb9\xc3\x95&\x0\x88\xbb\xfb\x96\x97!\x99" +"\xa7\xb3'\x96\xd2rW\xde\x83\xa7@\"\x91\xc1O\xec\xdfy\x98\xc5\xc9k\x1e\xda\xde\x2" +"\x80\xf8V\x8a\x8fP\x7\x85.\xed\x30\x39i\x18\xb\x33)\x91ys\xc2\xd3,\x8\xc\x97\x65" +"\xb6\xba\xb0g;\xc7\xec\xfd\xbb\xfb\xea\x98\xc&8C9\xb7\xf1\x5%\x91\xd9\x16g\xd4\xfe" +"\xe4\x13\xaf\xc2=\xe2\xd4\xb9\xdat/Bi\xc6\xc9\x39\xf5\xfc\x32\xa3\x80@s\n\x1\x81" +"U\xads?#\x1eM[\x9d\x1\xc0:X\xea\xe7\xb5\xf5\x90\xcc\xfa\xf2^\xdc\x85R\xcf\xc8\xd9" +"\\`\xeb\xae\x18\x37\xd7\xa9|\xa1\x37\xe9\xd4\xa4\xbd,\xd3J\xef\xd6\x8d\x64\xb3\xf4" +"\xf6#&\xac\x42\x99!\xd7\xfb<#Q\x84\xfe\x8\x99i\n\xbw_\x1aVn\xc2\x9dX0\xd3#re&\xf7" +"\xe7\xf5\xaf\xddq\xb7~\x7\x61=\xdcO\xc6>\xdfI\x5\x1a\xebY\xe6\x33z\xc0\xa4\xb6\xdd" +"\x87.wl\x9c\xd0\xcc\xb8\x61\x30S\"\xd8\x16s!$\xf5\x97\x8a\x86\xc1\x86\xbf\n\xf\x88" +"\xe7\x33\xce\x38\xe4\xd7\xc1\xbaSx\xc5\x62\x9b\x1e\xfc\x97\x80`Y\x99\xe\xd4,\\\xd1" +"\x83\xba\xd7\xe9@p\xe4\x5\x85i\xda.Q\x83\x1f\xfe\r\x8\x3\x1\xae\xab\x43P\xba)\x3" +"\x18\xae\xc5\x82\xc7\x8d\x5\xdd\x92\xe5\xaf\xb4\x42N\xa8\x8\x62\x9b\xc9r\xe6\x8f" +"O\xf2H\x9c$U\x93\xf0uU\xcaj+%\x96G\x94\xcf\x31\xcb\xd3\xae\\\"\x9a\xb9\xb8\xc2\x98" +"\x6\xc0\x1d\x11n\xbd\xf\xf0\xf1Y\xed-=}\xfcs\xea\xb4\x91\xb\xff[\xb\xbX|\xd9\xea" +"no\xc4]c\xc0\x97\x66\"M\x83\x46\x1f\x5\x88\x14\xb%\x8b\x17)\xf7\xb\xaeyb\x18\x9b" +"\x15TH3\x92\x98\x8c\xf2\x30\xaf@w\x19>S3\x5\x19\x39M\xd9\x9b\xa1\x35mG0\xab\"\x1d" +"\xc6\xa6`\x19\xbf\xaeVH\x93\xdd\xad{\x17}\xad\xd1j\xdd!\xd3\x96\xcf\xa6\xc3\xdc\x81" +"\x80R\xe2\xf7\x11I\xfdYJ\x16\xde\xc/\xfd\xd3\x66\xc9\x9bHlU\xa6\xe9\x91\xe4\xd2," +"\xcb\x15\x84?\xc\x33\x63gj\xf2\xf5\xb2\xd1\xb7\xef\x66\xcc\xf2\xf1-\xc5\r\x63wk\xff" +"\xb0X\xd7\n\x9cv\xdc\xe9luHr\xd7,\x82\xa0\xc3?\x90\xd4\x9c\x93T\x2\xcd\xd2kmt;\x1f" +"C\xbe\xd5\xd8\xb5\x39\x42HI\xc1I]\xaes\x4N\x88Z}\xf\x30\x7f\x18\x16\xdf\x62\x44\xa6" +"\xf2\xd9{\xfdN \xe\x93\xf6\x9b\x8\xaf\x39\xea!\xe6\xe3G\xa4|\xee\xbf\x80?s\xb9x\xad" +"\xbf\xcf\x5g\x89\xbb\x8en%c\xde\x87\xdd\x9a\x8c\x87qW\xb9\x34\x10-\xce\xda\xc5MH" +"z\x1b\xb2iO\x0\x34\x9<\x6\xc.\x1a>\x80\x5\x4\x9f&\xd7\x16\xe1\xf3" +"\x81\xb9\xf8\x31%\xe4h2d\xa0~-\x89\x38\xf6\x5\x97\x8e%\x13\xdd P\xb3\xd8\xa1\x1'" +"\x97\xcb\xa8\x96\x16\x32\xbe\xd2`\x91\x63\x38\xa8\x12\xaeu\x1c{e~\x8j\xc}\xdc\xd3" +"\xbf\xdd\xff>H\xb8GQ\x92W6\xd1\x31\xcI\x10\xfc\x11\x43\x87\xf3\xed\x7f\xe1\x63\xf9" +"\x18\x95\xeb\xf5_\xcb\x42\\\xefW)\xd9\x9b\xd8\xf2\xc0r\xe3l1\x5#\xe7\\\xd8\xe5\xde" +"I\xc0\x31\xc4&4\x10\x9dV\xe9\x1a\x46\xc8\xc8\xe8\x9f\xd9 \x12\xa0\xc\x33\xd0\xde" +"\xc5%\x97\xb5\xc6\x93\x32\x91\xa7\xbd\xc5\xce\xda\x95\xdc\xdaV\x0\xf9\xae\x1c\x82" +"PT\xe7\xee\x10gE\x8c\xcb\x66\x61\x7\x4\xc5\x8eJO\xc0\xcb_\xc9\x33\xd0\x32*qk,\xd4" +"0\xa3\xadH\xda\xb3\xd4\xcb\xe9\xd2?-\x9#h\xcf\xc4\xe1\xf5I\\\x13:\x92\x94.\xc6!\x18" +"\xd4\\\x17r6F\xe6\x94\x7\xb4\xa8\x9d\xcd\xfd*\xb3\xff\xc0\x99\xa2\x1d\x9d)t\x1dh" +"'\x6)\xaa:AO\xe5\x86X\xdc\x91p\xc2G\xb6\xe2?5\xc4\xbc_\xf8\x30\x9\xf4\x62\xf2\xee" +"\xf4\xdb\xac_\xd1X\xa6XW\xf9\xb6\xdc\x1fQ\x92\xdf\xb1i\xdc\xb6V!\xca\xb2\xf1\xb0" +"{\xd2/AU\xa8\xe9\xe2\xb6\x38\x8d\x43\xf\xde^\xc1\xc8\x34\xd2.\xa0\x35\xc5.\x1e\x34" +"H.\xad\xc3kL\xae\x90*\xae\x89\xa7(Nb\xb3\xc8K`\x8dk\xd0_u\xbc\x31\x31\xb-\xd3\xb2" +"\xc0\x8a\x0\xe0s\x7f\x10O\x3\xa4\x19\x89\xd5\xf6\xb9\xa2\xc3\x8b\"\xf1\xd1\x80>\xe5" +"\xd7\xa4\xd8\xde\x44\xe4\xab\xd4\x96\xa1\xde\xc\xe\x12\xc4\xbc\x96\xd0\x12(F?\xe" +"\xa9\xce\x95\x9\xfe\xe9\x87\x13\x9f=\xd3\xf9\xd0\xdf\x43\x13\xf5U\xbe\x85\x43\x37" +"\x18\xf6\xd0_\x19|A\xa9\xd9\xc7\xa8\xb0\xd2t\x1\x96\x82\xd4\x9fX\xdd_f\xb1*e \xd9" +"\xf2&\xd1\xdf\x1f\x1b\x65\xcd\xfa&\x1f\x98\xc\xa2Z\x92\x64[\x86\xb6\x46\x6)?\x8b" +"\xfd\xe3\x64\xc4}*\xf2\xc7\x9\xbb\xe7zp\xa5q/,\xc2o=f\xf5\xbe,0zH\xe6\xf8\x87\xf6" +"\x81\xd3\x1!\xe3+\xbd\x87'\x1b]\xc4\x61](\xc3\x9\xf1Z\xd2\x63\xfb\x37\x42NV\xdd\xa6" +"\xe1{\x99\x8b\x45\xbel\x7f\xc6\xc2\x8e\x33\x94\xa8vL\x9e\xb2\xdf\\\x6\x62\x65\x93" +"\xb5\xc6\x65\xd5P\xd4`\x1ry\x1c\xd2\x8\xae\x9f\x37\xbc\x8+\xb$+\nPKu\x1b\x18\xf4" +"\xd7IQr\xb6\x97\xee!x4\xa8\xa4\xfb|\xc1mo\x9e\x8b\xb4\x0\xbe\x8a\xeb\x8P\x96\x2\x83" +"\xdc\xe7%$\x9f\xccM\xe9}\x98\x86tZ\xb6\x6l>/d\xdd\x8a\xb7\x9a\xa1\x16g\xf1\x11\x88" +"\xd7\x96]\xc1\x1e\xb7`\xb7r\xe2\x82\xdb\xf1\x32I\xf3\x19\x86\xach\x98\xfe\xbf\xe2" +">>\x8b\x8d,3\xe0\xe\xa6\xfcI8P\xec\xb2\xe6\xd8\x31\xd1\xef\xca<.\xc8\xee.9E\x99\x9" +"\x1e\xd5\x8b\xed\xe9}zC\xb6\xf7\x39\xeb\xf\x84^\xac\x1d\xf6\xb1\xeb\xfe\x87`\x9\xcc" +"]\x80K\x15\xedKVv\x1b<\xe1\xafY\xc0{I\xdcy\x8a\x44S\"\x97\xads\xd5\x10\x1e\xd4\x7f" +"6\xa3g\x8f\x81\x82\x97\xcc'\xf6\xaa\xa2\xaa\xcc\xc9\xaa\x9boTY\x91\x1d\x8cV\xcfI" +"\x9e\x39\n\xe6\x7\xf3y\x4P\xb2\xb9\xc9\xbe\xf\x0n\xda\xcq[\\\xa0H\x17\x34\xcf\xb0" +"Ytx\xe7`+\r,\x1eOx\xf0n\x11\x10\xde.p\x9c\x1c\x1b\xed\x13p{p\xa4!\xb3\x84\xf2" +"\xc\xa7\xa9\xa9\xd2\x3$\xdd\x38?(\xb2\xd3\xc7\xa9\xc5?]Lk|7\x8d&\xdf\x11\xcfU#\x8b" +"\xe1\xb2O\xa7\r\xcc\x17\x8d\xad=5g\xf\xe4\x91\x90\x85\xeb\x1c\xd9\x5\x97\x1dv\xa3" +"h\xfd\xfc\xf9\xd2\xf0\xa2\x37\x39\x85\x1a:m.\x2\xd6]T\xde\xe6\x9e\xd5\xd8\x13\x15" +"\xd3\xea^5o\x94\xef%m\xd2g\xfd\x1e\x1a\x9e\xdc\x9c\xd6>t?)\x9b\xccJE\x6#;\x8d\xd7" +"e,\xa0g\xf7\x41`?\x93%\xc\x8}6\x8f\x9e\x9c\xc4\xcc\x1am\xedVt\x87\xc0[\xaa\x99+\x0" +"V\xa7\x7f\x63\nr\x0\x8e\x39\x46\x15\xa9\xdb$\xfeV\xa9Ve\xe\xc9\xde\x90\xa6\xc2%\x91" +"\x89\x44\x2G\x97\x5\x41\xca\x19\x87H\x92\x82\x15\xc0\xe1\x32\xa8\x1a\xa1\x32\x8\xd8" +"c\xc1\xfe\x81\x7fp\xcaW;TW}\x10\xb7\x31\x0\xaf\x8e\xa0\x88 \x8a\x44\xfb\x92\xac\xa3" +"\x14\xaeXypa\x80x\x8c\x17\xbb\x1d\xb\x81\xb6\xb9Z\x1cN\xf\x9e\xa6o\x9b\x39\xbf\xe1" +"$D\xa6\x44\x66\x91\xa7\xbd\xb0>\xf\x3\xd9\xf0z\x10\xa7Y\x8f!f\xf1\x8R\x9f\x34\xcd" +"\x90\xe6\x1\xff\xed\x34y\xab\xcf\xcb\xde\x8f\x5\x1c\x34\x8eH\xc6\x1d\x95\xb0\xcY" +"\xea\x12\x87\x42?\x5\x66l=6(\x88\x44\x6~\x83\xe1OkR\x10\x84,t+\x89\xf1:\xcd\x12k" +"\x9f\xc5\n\xbe,\xa7\xd7\xedQ=C\xb6\xac\x7f\x41\xee\xda\x41k\xff\xfc\xc5\xc8\x44\xab" +"-#\xd4\xdc\x9\xb2\xd5\x10PL\xe9\x8d\x2\xe7 \xd9\xe6i\xdd\xaa\x34Lc\xa1\xb7V2\xf9" +"\x12\xa1\xc0\xda\x38\x85\xdaJ\xf7\xe2\x43\xe4\xa4\xc6I=e\x95\xbbmV\xb0\x35\x91\x6" +"\x95rY\xe5\x9e\x33k\xaa\xf3[\xd1\xce\xc5\xcd\xe7\x35'.\xbc\xca\xe8\xd4\x90J\xeb\xd2" +"\xb3&\x10\xc6\xfe\xa2\xb6\x99\x41\xd6T.\xcb\x44\xd7\x10\x92\xa3\xcf\x6w\x8\xa3\xd0" +"\x87\xae\x99\xff)g\x1a\xb7\xdd\x87Xu\x9b\x97\x1a\x8\xae\x1b\xadx'\r/\xbe\xe3z\xa2" +"\xdc\xb1\x19\xd7/l{\xc\x85\x9\x1\x8ap\xd0\xb0\xbe,h0\xef\x8e\xb$\xb1\xce\x11\x41" +"\xef\x87:M}\xccP\x1f\x80\x8b\xfd\x94\xe4\xdc\xf)\x15\xaa\x2\x30v\xbc\xc8\x0\x64\x90" +"\xa4\x36\x85\xea%\xaa\xfc\x18s\x2\xeb\xde\x7f\xe1\x96Z\x4\xa5\xa3\x98\x98])\xf0\x8e" +"\x8Q'\xb5k\x5s4\xd8\x8e\xb6\x38\xa4\xdd\xe6J\xfd It\xc3\x93\x95\x36\xb1\xb6jT\xb4" +"\xdb\x81\x15\x18S\x91W\x18\xf7\x8\x13\xf0\x96\xcc\x1b\xe\xa2^6;I&L*\xd1qX\xa4H\x9f" +"\x91\x45?\xbe\xdb\xde\x15\xd7\xb7M\x7f\x98\xe8\x1d\xf2\x32Qx]X)[\xa2\x97\xf2\x95" +"\xaa\x62H\xa9\x12\xcd\xd4\xf1\x11\x1ekb\x8e\xec\xbbQ9p\x9ev\xeaJ\xb7\x43\xce\xc8" +"&b\x1d\x8\xe6\xbc\x64i\x1c\xc9\xb<<\x17x\x93\x1a(\xd3\xd5\xb1\xe2\xe\x96\xc6\x43" +"1f\x13\xfcH|\x9b`LCF?\xa4S;\xca\x12\x36(noZn\xeb/\x1d\x9c\x34\xbd\xde\x45\x95IZ6" +"_\x88\x5]\x92hT\x1c\xf1\x65J\xcfG\x8d\x38JT\x96\xa8w.\xa1@'Q\xa0\x93X*f%\xa0\xa4" +"H\x16\xb5\xfd\xbe\x16h5\xd5\x98\x64\x42\x96$\x9b\x92\xcc\x90\xaa?\xd6\x44\\\x9a\x19" +"\xbf'\xf5\x9c\xb0\x61ls\x6\x7\xf\x33\xc7\xdfN\x1d\xe6J\xc8\xc5\xbb/\xfa\xc1\xef+" +"\x1b\x30\xe5\xa0'^`\x4\xcf\x64\xbb\xe2\xc6q\xe\xdc\xfc:\xa4\xad\xd6\x1\x6\x33G\x8" +"\x86/\xfa\x66R\x82[\xc8HBsnG\xaei\x17\x18\x3\x65\xc7['P^\xed\x1f\xcc\xa7\xc4>\xe5`\xf0g\xf1\xaa" +"*\xfd\x64/v\x9d\x1a\xce\x8e*\xaa\xf3\x88P\xf0\xd7W\xcd\x80\x8c\x92\x1dqn\x96\xfb" +"\xc0}\xa7\x86\r\xfap\xce\xae(\x88\xc0\xed<\xbf\x95\x86\x44\x35\x32\xb6\x8d\xae\xd9" +"\xa9&e\\\x15zAl8:S\xd8\xf2\x83*NgF\x81\x12\xa0\x9a\xdc\x83~\xd8\xec\x95\xf7\x8R\x92" +"\x1fP\xd4\x41r9\xfc\x42\xee\x36$\xca\x97\xf6\x82t\\\xc5\xe7l\xc7\xc6{\xd9\x9f!\x80" +"\xf8\xc0\xb7\xfbIS\x9c\x8c\xc4t\xc2\\\r\xdeI\x16q\xff\x32\x9eQ\xbc\xfaw\x93\x46\xd4" +"hh5\xa3\xad\x66\x33\xfc\xb5\xe0\xf6~\xc\xa9\xce\xd8\xf2\x15\xbe\xf4\xd2@E>\xb2\xed" +"\xd6\xad\xb2\"x\xaa[\x98_\xa1@\xc9\x83M8u=\xf2\x1O\x8c\xe\xe6\xda\xd1\x9e\x8f\xc5" +"L\x3\xc1\xf6\xcb\xf\x85\x89\x86i\x1d\x99Y%b\xca\xd9_\xa0\xa5\xb2\xab\xe4\xa8\xb5" +"KE}B\xe8\xc3:-\x19Q\xc0\x41\x9ar\xfb\x94\xfd\xa7\x8e\xcd\x92\xbd*\x14\x16\x45\x9e" +"\x9d\xec\xa9\x46\x9f\x35\xe4\xc4}\xb5\x31rm\xee\x8f =pB\xed\xb3/\x2]\xf3\xd5\x82" +"T{\xb1\xd4_z[p\xd3\x17\xdfN\xbb\x16\xe3k\ry\x8e\x9\x32\xfd*\x85\xb0O\xd6qC\xe4\xb2" +"\x87\xa5\x4\x16,\x1fZ\x3|\xcdx\x0\x88\xc5Gc\x85\xaf\x81h\xe1-\x97\xd4K\x6\x30\x62" +"\x17Y\x17<\x8f\x1e\x30\x6\xb5\xb1\xc6\xd7\x13\x8b~\xef\xc3\xcc_T\xe2K,<\xa7\xb4\x1a" +"\xac\xfd%\xe5T\x88\n\xaf@n\xa4\xc3\xc6\xe2\x1d;U\xb\x4\xf\xb1\x95%\x98\xa7\xe8\xe6" +"H\x8f\xe3\x82\x88\xb2\xae\xb6\xc4q\x83\x38Y\x8a+\xfeM+\x9d\x14\xc6W2\xda\x30L\x16" +"\xff>\x1f\x8f\x3\x4n\xf0\x95\xb6_\xd6\x9\xda\x87\xec$\xa6\x92x\xbf\xe6\\\x90\\\xd0" +"2\x9fjHk\x85%\xb7\xee\xa4\xf7\xaeV\xc2\x63<\xd8\x35\x43&\x9e\x8a\xcdmq\xf5\x0\xd8" +"/\xdf\xbd\xe7\xf7\xf7\xb1\xae\xe6s(T\x92\x32\xe2l\xa5P\x85\xb6\xe8M\x9e.\x7ft\x6" +"\x8f\x93\xa9\xc\x46T\xf2\xf3\x96\xe5|_v\xf7\xe6\x1c\xbb\xe5#\xdb\xfb\xa6\xe7\x66" +"8\xbb\xa3\x6M\xa0%\xa7\x9e:)O\xe7\xf1\xcc(\xa3\xb4\xc5}\xd6\xfd\xc4\x8eT\x1a\x85" +"SK%\xe1\xbc\x11\xb4\xf7\x80\x19\x45r9\xea\xef\xd4\xbe\x90\x7\xd2\x5\xf1\xd9\x85\xf3" +"\x89\xdb\"@\xb'\x9c\x10\x94\x85Q\xa6\xb4\xa1\x7f\xbd\xa0\xff\xc9\x42\x8b\x18\xb4" +"=\xc7n\xfb\x15\xfc!\x82!o\x1b`\xb4\xe3\x44\xa0:\xd6\xc0\xf\x14\x1e\xf9\x9f\x89\xf2" +"L\x81\x9c>2\x87z\x92}\x84\xc2\xd0\x6\x94\xf\x39\xca\x8bq\xe5\x95\x16s\xea\x9b\xfd" +"\x17I\x92\x32\x19\xde\x38\x92\x9e\xca\xa9\xce\x43\xb0l\xfa}\xa1\xbb\xed\xfd\xa5l" +"a\xffl$\xf4\xeY\xb1\x38p\xd5\xfd\xeb\x82\xd9\x81\x15O\xae]mQR\xdei3\x93YF\x1a\x41" +"\xa9q;k\xbeG\xe8h\xc9\x33\xcdt\xc7]\xb7\x1d\x13\xba\xe4\xde\xc8^\x2\xfa\xa1N\xad" +"l\n%;\x16\xc7\x95\x14\x65{\x15\xe6\x8c\xcf\xf9\xeej\xa3\x85\xcf\xf9\xe2\xc5=\x9a" +"\xe4\xf\x85\xc7\x93\xe4\xe8\xffP\xb2\xb7\x42\xfO\xe6\x98\x7\xbc_7\xc3\xe3\x0\xe6" +"\xb3\xc3T\x9d\x1d\x32\x46\xa2\xe7\xf\x9\x10T\x11\x35\xbd\xf8\x5\xe0\xa6\x98\xe2\x36" +"\xb6Ig\x2\xd0\x61$\x16\x87\xb7\xb8\xd1\xa0\xe5\x17\xdf\x4v\xda\x9\xd8\x96g\xa7\xab" +"7_\xd2g-\xcb\xab\x81$\xe5\x11P-\xdb\xd0\x8b\xa0M\x94\x1d\xf1\xce\xbd\xcc\xf7\xed" +"H@\\\xbc\xc3\x37t\xa6\x8cR\x12\xfco\x13&A\xff\x41<\x98O\x8b\x43\xbd\xfd{\x1a*45\xf1" +"Z\xf0~\xf4\x97\r>J\xb\xb9G\xc1\x81\xe9\xca'\xcc\x14\xa3[\xd1\xbd\x9hu\xb4Xs\x8c\xa2" +"D\xf8\x8c(r\x8bt\xe2\\\xb8\xc4\xfc\x10\x95\xa5l\xa7^Ei\xad\x30\x82\xef\x19J\xdd\x11" +"5\r\xb3\xb7K\x96v\x1d\x45\x38Yo\xf7$;\x1e\x1brG\x16\xa1\x44\x10n\x8\r\x42\x3\x64" +"D\xfdG)\x98\x46\xc\xe9\xab\xbd\x5\xb4*\xf9\x38\x9a\xc4R\xbd\xbb\xa3\xa1:\x96\x89" +"\x0%x\x9f\x16\xb9\xd9\"Q\xfd;;\xeb,a\xed\xdb\x37\n En;\xfe_@9\xe2U|E\x1cRO\x80\x87" +"\x1[\xaf?\xf0_Q\x86\x9f\xb9u\x12\x96\x8b\xdb+IX\x9c\x1cz\xf1\xe0\x85%\nGete\xf4\x80" +"\xb7\x2>$\xc7g1\xac\xe\xabg\x4\x12=w\x97}:,LV\xb6\x91\x34n\xbeX\x9c\x61\x9c\x4Q]" +"4\xf8\x1f\xc6\xa1u'\xd5\xd8\x31\x90\x13\xc5\xd4\xff'\xcc\x39%\xe2L\x99#\x1a\xc7\xfb" +"\x9e\xaf\xb\xbaH-;u\x80z\xc8]\x3\xcd\x9\xde]\x9a\xe0\xb0{z\x81?\x4Ixe\x0\n\xe8\xa7" +"\xe0\x0\x80\x30\xf\n\xb8\xc3\x99\x5~\xdd\xba'=\xd2\xe1\xb2\xa0\xdc\xef\xad;3.mJ\xc1" +"\xff\xad\x84\x61g\xdf\xd7\xe\x3\x46\xda\xf8J\xf2\x92\xd4\xf4$%n\xd5\xacN\x10O\x80" +"ipP\xd5\x8\x44\xa7\x8\xea\xc9\xe7\xf7xO\xd0\x16\x46\xf3\xbd\xcY\\\xa5\x1e\xe6\xbd" +"`}%Nx\xad\xdc^\x15\xc3\xb6\xacI@\xec\x86Z\\#\x10[k\xe0\x9e\xa0\x9f,\x5\xd6\xd7i`" +"\xa8\x43\xb8\x1e\xe4\x33\x97\x7f\xaa\xc3\xcb\xda\x85\xcd\xd2\xf4\xdb|():w\x82V5\x99" +"*\xf8\xf3\xb3\x8b\x44\x80\xd9\xa1\x39\xb1\x66#E\xa8\xab\xe1\x63JwIl?WY})\x85\xe9" +"\xe5G\x17\xab.\x99\xca\x35x\x94\x41\xbc\xdd\xed\xe9\xa9\xe2\x10k@\x1d\x96\x84\xad" +"\xbe\xfe@\xd6\x7\xf0u\xc1y\xe9\xcc\x3\xe5\x9e\x65\x43\r\xb7\xb\x44\x1d\x43\xdf\x3" +"\xf2\xaao\xf0o\"KnE[\x1\xc6O\xb8\x9e\xec\x91\x3\xe4\x84S\xa9t\x9bM`(\x8\xc7\xe4\x8" +"\xa8\x90\x30\x91\xd8^\x6\xaa\xf6\x35\xd0\xd5)\xc3\xcd\xd1\xb8G\x9a\xc0\xf4 \x8c(" +"K\xb6x\xa5G\xf2\xbdw\xbb\x17\xc8mE`COz\xd1\x93w`\xa6\xaaU\xb6\x14\xcf\xa9\xff\x8c" +"\x9c\x96V\x1a\xe6\xc8\xf2\x12\x1cN #t(\xbcQ\xdf \x99\xb6\xc4\x9e>\xfa\x18\xe6\xd4" +"9\xe6\xe6\x98\x1etn\xbb\x1d\xc4\x61%\x9d\x8e\xa0\xf8\x9\x9cG\xcc\xa2{-\x98+r\xc9" +"\xa0|\xf2\x1b<\x5\xd6\xe2nn(n4\x8b\x89\x44\x7\x8e$\x80\x9f\x9c_=\x1KL\xba\x2S?V!" +"\xbf\xba\x1f\xe\xdbwlcGFp<\x9fs\xba\x89\xb1\x96\nId \xc6\x8fT\xe5\xb9\x1\xa6\xd7" +"3\xd7\xac\xc7\x9f'_\xff\xb2S\xf3\x89\xaaH\x0\x84\x46\x8b\xb3M\xa1\xe7\x97\xe4;\x7f" +"n\x8c\xaf^\x8c\x93\x6\x9a:'0\xe5~\xc3\x9bg{\xb7>?\x7\xc2\x5U\x99\xf7\x6.S\xb3z_\x0" +"\x99\x90}.\xd8\x7f\xf7\xa8,\x95\xfb\xae\xb8\x88\x3;\xdf\xd6{\xa3\xa6\x3\x1aL\xdc" +"V\xcb\x1eL\xf5\xb0kF\xe1m\x98\x8b\xec\xce\xfa\xcb\x9e\x1c\x3p#\xd7\xbf\\\xcf]e\xaa" +"f\xa1z\xb3\x61\xbey\x81\xf1\x32\xa5x\xf3\xab\xfb\x97\x96\n`4\xf0R\xd9\xd5\xaf\xdc" +"\x6yx.\xc9\xf$\xf\x94:_\x9a=\x96\x9e\xd7\x39\x92T\xffg\xd8\x9d\xf6h\xf7\xc5o\xce" +"\xa1\xff\xdc\xf2\x4\x81GJ\xc8I]:\xf4\xb6\xd7\xee\x9>6\x9c\x5\x7f\xbp\x85\x82 i;9" +"\x8a\xcf\x8e\x81\x43U\x81\x32\xe4\x39\x14\x5\xe3\ns\x93|S@.E\x9fJ\xa3S\x9c\xf7\xa9" +"\x9a?Q\xc0\x30}\x4]\xf8\xb7wW\xe9.\xa2\xf5\x1b\xf0\xbbOw\xd3\x90M\xd3UfXp\xc2\xb5" +"\x9f\x1e\xd7\xf8O\xc7\x1f\xdd\x7f\xbl]1\x82\xdbw\x82|\xa6\xa2\x6\r+\x8c\x83\xc4\xea" +"JC.\xf4:M\n\x95,\xc6\xcb\xbeR\xa9\xf0\xcd\x66\x1aS\x89s\xde\x41\xff\xe9\xc5\xcfU" +"\xf2Pk\x9e\xfe\xe5\x1f\xba\xe5\xe6;\xdc\xf5R\x84\x99\xa4|\x3\x11\x63\xc8\x8d\x30" +"\"`g\x84\xde/F\xa9\xc9#Z\xee=Oq\xd4\x95\x9b\xc\xfd\xc5\xb7\xe7\x8c\x8c\n\x8f\x9d" +"\xc9\x94@\xc2&=\xba\xcb\x34<\\d\x85w\xf5\x61\xbP\xea\xb1\xcf\x7f\xd0$\x19\xef\x39" +"A\xc7\xca\xb\xe\x64\xeb\xadK,\xb0Z\x7\x93\xdb\xc3\x8f\x19\x46\xd4Gg\xbd(\x7f^\x97" +"y\xc6\x11\xca\r\xaa\xa1\xe7\x39=\xbe\x6\x83\xc8\xd3\x45\\\xdf\xeb\xc0\xe6KT\xb7\x37" +"\xe2\x98\xdd\xa6\x5\"|\xcK\xba\x87\xaa>\xc7\xfan\xba\xec\x39\xe6\xef%\x37\xd5\x97" +"C\x91\xd3\x17\x39\xd9\xfc\x42\x98=\x81\xae\xe4G\x11\xc8#\xf3_\x8e#!\xact\x94\x38" +"qs\x9d-\xbe\x97H\xfehY\"c\xe7q?'\xe0\xd4\x9b\x9b\\\xb7\xa4\xe5]\xe5Nk\x80\r\x15\x85" +"dP\xff\xd3\xae_({\x12\xaeOC\x8b \xae\x9e'\xe6\xca\xa0\xf>\xae\xad\xbe\x8\x43&\x84" +"\xfd\xf9\x93\x1e\x92UD\xa6\x80\x18&\x2\xa3\xc1\x99}\xe5\xd0\x63\xb\xd5\xa0\x10S^" +"f\xe1\xc1#\x1=#\x96k5E\xc7\x43\x1c\x39\xb9r\x95\xbf\xa4\x9\x9d\x14\x46\x10\x4\xc4" +",\x85\x9^\xea\xcb\x9bG\xc5\x93\xbcm\xb8\x63S:\x86\x19\xba\xe0\x90\x95\xde\x8e\xca" +"C-M\xddI\xaa`\r'~u\xdc?\\f1\xe2\xa0S\x82\xcb\x0x%\xfa\xdbwC\x8d\xcf\xa7\x8e%-y\xb6" +"\xa1\x96\xd5\x16L/\xeb\x85\xd7^\xca%\xff\x80\xb1\xd9\x7f\xe1\xe\x87\x96\xc\xa0\xfc" +"G\xc4\x1d:!;\xf1\x41\xb4\x8b\xc3\xaa\xa9?\xa8\x62\x45\x6\x46h9Fe\xbf\xd5-\x12\xc3" +"\xbeL\xe3\x9e\xfd\x81\x11uC\x98\xa9\x44\xc3\xfd\x1a\xfa\x98\xec\x33{\xaa\xaf\x89" +"\x9d\x35\xe8\x4\xcf\x41j\xd7\xfe\x45\xff\xf1?\xc6\x35@\x7P\x10\x43\xf9\x8f\xe8\x42" +"\x8d\xe8\x1\x39\x1\xbaj(q\x1a,\xa8Z'\xb\xb1\x35\xb7/\x1dP&\xe8!u\x81\x86\x7)\xe9" +"O/\x18x\xa0\xe9lY\xe9\xf6'\x14\xfb_\x8f%\x0=\xfcsG\xe9\x90\x7\x8a\x9a\x33\x1c\xb3" +"\xa6\xa5\x35\xbc\x61\x86o\x2Q=\xeb\x98,J\x13\xad\xbf\xba\xc3\xffp\xa7\x33_@\xd5H" +"\x9eH\xe5\xed\xed\xef\x16\x19\x19s\xd9\x32G\x9c\x62\x18;\xe%\xee\x8cOv\xd4\xf1\xae" +"E\xda\xeaJ\x12\xae\xdd\x9e\xf8\x1d$\x8e\x8d\x19\xf8\xc8\xa5\xbe\xcd\xd1\xea\x1e\x98" +"x>\xb7\xa3\x81I\x17\x8Q\xb1\x94,\x96\xc5=\xe0m\xef\x80\x91;\xfc\x4\xe5\x39\xecg\xc1" +"\x10I\x8d\x15\xb7\x82h\x85>\\r\xf4\x85\xf8\xa2{v\x85i\xe5\x42\x41\xf6\x11Xu\xe2\x97" +"2\x92\xcfH\xff\x91\xd4^\xbe\xd6'\xae\x9f\x7\x66\xd2\"\x1\xb2\n\xfd\xd4\xe[\x17\xcf" +"3\x7f)\x99\xe0\xbd\x15\xb8nF\xeb<\x18\xfc\x12\xb7\xdc\xad\xcf\x9d\xd5\xcl~?7\xe6" +"\x15\xa8\x92\xdb?W\xe2P\xa0r\xa4\x9frw\xddj,\x80\x42i\x82\x33\xd3Zi\x9b\x17\xec\xa5" +"\xdb\xdam%\xe\xd4\xa1o\xcc\x89;\xf0\xdc.3\xfb\x1e\xbd}\xed\xea<\x1c\x39`<\x8b~\x1a" +"Z\x83:\x8f\xcd\xd5W\xb\xd0\x88t\x9b\xb2\x32\x61Sfhyb\xc7\xe5n\xd0\x89\xcd{\x9%\x5" +"\xca\xfaZ\x80\xf5\x3\xc4\xcf\x33\x7f\x7\xad\xf0\xd1\x6\x93~%g\x8\x39\xd4\x91\xf7" +"\xbf\xf7\xa5#\xdb`\x9d\x12\x63(\xc1\x61\x13\xec\xbc\xbf\x9c@\x4\x90\x44'\xa1\x8\x61" +"\x8a\xe5\xd4\xed\x80\x9f\x8c\xca\xf7\"Q\x10L\x94\xec[\xee!\xf9\x1b\x17\x9d\x31\xdb" +"\xa7\x9c\xee\xe5\xec\x7f\xf6\x98\xeb\x84\xab\x1d-\x1a\x62OX\xb3\x62*x\x84L\xe5\x14" +"\x98\xb2\xce\xf3\x8e\xaf\xe2Y\xd2,{\xa6\x11\x4\x65\x1a\x86 \x8\xbc\x1d\xdd\xa5\x8c" +"\xc4_f>\xb2\x64(\xda\xa8^w\x85\x36:i\xd2y\x9\x96\xef]\x96!\xd5\x30\x42\xf4/yIb\xfe" +"\xa4nF\xf3{\x8a\xd1\xfbv\xfc\x8d\\\xf2\x14hC\xf8\xcc\x62Q9\xc7_\xb4-\xdaq\xa7R\xba" +"\xc4\x8f)NL\xc\x82\x89\xfc\x46\xda^\xfd\x9c\x91\xbd\xa6\xd0'Q\x8b~\x81\xe8\xb2\x1f" +"uZ\x96\x15\x62}X\x12\xac\xa6t\xd1Rz\x11\x85\xee\xd4\xe3\xc6(\x19n}\x7Y\xb1\xca\xe6" +"\xb9\xb7\xe9\x1\xe9Y\x9a\x65#\xf\x1e\xe4i\xcd\x33\xb9\xbd\x9c\x10LD\xe3\xc1\xab\x96" +"l\x96x\xbd\n\xd7\x81\x11\xa4\xe0\xf2\xd0z\x1\xa0\x38\xce\xdep6\xd0SMhJ\x15\x62\xa1" +"z\xd6J\x0\xf2y \xc\x3q\xb1\xcb\xa6\x17Gg\x1d*!\xd3\xf9\x64l\xa2\x90\xf6\xb8$\x18" +"\xa9o\xa1w\xc6'\x82wPK\x7f\xba\x93\x63%\xf5\xfa\x12J\xb0\x18\xa1]\xc1\x8d,^\x8f\x93" +"\xcd\xee\xa5+\xee\xdbx\xa5x(\xd8\x1a>l8\xb9\xfa\xf3\xdcN\xb7'>\xce>\xa4H*\x1c\x62" +"B\xa3\x35\x86,,7\x17\xf9\xc9\xed\x95\xf7{\x14\xcN\x15i\xb2\x19/\xc7\xdc\xf7\x2\xd0" +"\xbc\x9aPB\x8e\xc4\x6\xf8\xbd\xc\xaf\x88kM\x97\x93 \xd3\xe4)\x81m\x88\xf7\xc7\x14" +"m\x96\n\xc1.p\xf2\xcbz\x9fN>6fe\xab?\x1bKd@\xf5^\xea&\xdc\x9e\xe0\x9k\xb7v71t\nS" +"wfI\xc\x8c\x17G#\xbf\xe\xb4\xcSp\x1a\xad\x12\xb2\x1d\x43j\xdc\xe2\"\x3\xc1\x5:\x9d" +"\xc4\xe9\xf1z\xe6\x17\x88\x8cKNo:r\xeNcf\xba\x62\x82!\xa3\x87\xd8\xab\x15\xe0J\xd6" +"\x93\x87\xc3\x10\xd3R\x8b\xd2\xfa\xa5\xb2+\xff?\xa4\x94\xf5\xfb\xfa\xc4\xf7q\xc9" +"\xc7@+\x95X\xcZ\xc4\xbb:\xf6\x92\xa7\xc\xb2\xc8Q\xfa\\\xf1\x17>\xec>\xc2\x9bZ\x5" +"\xa0\xb7(\xbb\xbbQ\xd3\xb7\xad\x8b\n\xf1z\x15\x63\xe8/\xaf\xd9?\x8bq\x18\x1f\xb7" +"\xaf\xe3R\x87ON\xc6\xd3\x34\xabgGQ\x9a\xb8\xe8G\xb7\xbc\xed\x33\xebTX\xa8(\xe0t\xe7" +"K\xa6!\xbd\xcd\x3\xfe\xa6\x4\x7f{j\xbd\xa0\x1f\xc7QK\xa1\xaf\xf0\xd4\xd0\xc0\xcb" +"\x8fNB\xd5\xa8~9]\x9a\xcd\xd0,\xcc\"\xc\x15qSB \x18rXF\x0\x9a:\xcd\x8c\x8c\xdd\xb6" +"k\xc6\x83k@&\xfd\x9fRj\xa2u\xd0l\x81\x31y\xe5\x92O&\xa2P\x94\xe7\xbd\xa8\xbd&\xaf" +"\xc4\xce\xb4\x1d\x89\x64\xd4\xfcJ\xf1\xdf\xb0Y[\xc5\xd6qL2\xf1]\xc7\x19N\x9a:s\x1" +"\xe0\xfc\x95" +"\xe7\x8d\xad\xd2\x5\xb5\xf4,\xc6\x30$bK\xaa\n\xb4\xdd\x44x2\xb4\xe1\xdb\xa7{\xdf" +"\xad\xd2#\x98\x9f\x8e\x95\x8c\x8du\x9a\xaa\x37\x93\x6\x64\xc6\xef\xecp\x81\x16$\x8a" +"*z\xf3\xd6V\xdd\xea\xfd\x0\x9b\x7fS3\x85\x46\x8\xe6~^X\x8a\x85qg\xad\xf9\"\\\xf6" +"\xc6\x41\xf5\xe1\x9c>\x8g\x8a(\x11\x99\xed\xda\xc8\x31\xb5r#\xb1\xbe\xea\xdf\xdc" +"\xbc\x8fo%\xd3/\xca#6\xc8\x8\x16.\x8f\x38\x16V\xe8G\xfbl\xb1\x39iW$%\xaa\x5\xac\x83" +"\xc\x33\xden\x3\xf\x86\xa3\xa8]*f\xa7\x7f\x10\xd6\x45\xab\x45#\x97\xbf\x0\xdb\x8b&\xe1\x15\x2n%gF\xcd\xcx\xa9Y6O\xde" +"m\xed\xdc\xd0\xf4\x41\xa6\x1a\x1e\xba\x32\xc7\xbc\x17+\xb0\x95\x12\x14\x8d\x1e\xba" +"\xc9\xe7\x91\xb7\xd5\x1bq\xca\xd2\xdc\x9b\x83\xb2\xf9\x9b\x37&`}\x9c\xbeX\xb4\x99" +"\xa1\x37S\xce\x87\xfc\xdc\xe2\x1c\n\xd0R\x8e\xd0\xef\xb9\xb2\xc9'\xf5|x\xc6&$\x8a" +"\xa2\xb8\x35\xa0y\x12\x44\xc5\x89\x66\x86\xa6\x61s\xec\x9f\x80,Lc:B\xb0\x86\x33M" +"*Hx\xeS\xd0\x8\x9${\xe6NR\x9f\x96\xad/\x8b\x39\"\xa6\x9}AM\xde\x1e\xc7o\x95R\xf9" +"\xb8\xd5\x8b\x8e\x34\xf3Y\xady++\xe5\xc&\xdb\x5\x3^t\x97\x16.|I\xc3\x8d<\xd9\xb9" +"\x8d\x62\n\xa6t\x92\xbeZ\xfc\xa3\xa8\x1ap\x80\x18\\\x7f\xbQ\x5\"?\x1f\xa7x\x5P*." +"\x8c_\xee\xa2v\x99\x85\x8d\x84\xa9XB\xc5\xf2\xfbhhmY\xfe$\x9\x1f\xcd\xde\x13\x9b" +"dc\xbcl{\x1e\xe\x90\xd2\n\x83\x65\x1a\xf0\xc\x85y{\xb9\xf5>\xce\xc1g\\~\xe6\x36\xd0" +"\xd9\xe7}\xbd\x8f\x89g\xf\x85^\xe4\xd4\x80\xf\xf3\xf6\x95\xe\xff\x9\xbb\xf8\xa0\xda" +"\xf6\xb8$(@\xcf\xa5\xbas\xbe\xb9Q\x15\xf4\xa7\x8b\xcc\x2\xd8^\xcc\xe0\xc0\xf2\xef" +"o2\x8a\xd1\xddl\xc0IZ3\x15\xb4\x14\xa4\xd6\x1d\xa5\r\xa4mz\xcc\xef\xf6\xeeVE\x18" +"\x5\xd2k\x3Y\xaf\x19\x35\x31\xf9_e\x89\xce\xado\xa0\x41\xaf\x15\x30g\xf8\x8a\n/\xec" +"\xd1\x35\xc5\x66\x82\xdb+E\xa7\x1d\x1f\xa7\x37\xc0\x64\xee\x9aO@K\xb7*p\xb3\xaf\x3" +"05\x93\x93$~\xc7\x81Q$\x82W\x98\x65$\n#\xcd\x84y\xf2\x1c,D\xa1\x19\xeb\xc4\xe8\x1b" +"0\x8d\xd8\xaa\x86\xe6\xc=\xd8\xad\xa5\xe\r\xfe\x83\x8\xeb\x1a\x7f \x1e\xde\x8d\xcf" +"\xda@Z\xef\xb4~\xel\xa7\xdd\xb3v\xdc\xb2\x1d\x37\xf7\xac\xc4\xd3\xe9\xf2k\x3\xa8" +"\xde\xe\x89@\xca:\x9eu\x96:8\x9d\xf8\x3\x8d,H`r\xf6\x1c\xc\xea\xf5\x0uZ\xa6~f8\x82m\xb1\x34VM\xb9\x93\xce\xebnzfY\xc7\xc5\xc0\\\x31\x2g\xd5\xf8\xa2" +"N\xec-\\\xc3\xe3\xf3\xc8\x8\xe6\xd6\x6\x8d\x1aWdk7\xfa\xbd\x98\xec\xb7\xba\xf9\x9e" +"}\x9a\xc4\x41JI\x1as\xca\x34\xc5/9CR\xf6\xb5\xa1_\xf\xc4\xd8\x86\"\xda\xc6\x94i\x9c" +"$d\x84\xad\xac;\x1d\x36j\xfe\xde*,\xd2\x4,\x90Qjfj\x19\xa9\x1c\x80$\x8b\x11\"K\xed" +"\xdf\x1a\x32\xe#\x7\x39\xe7U\xd0\x98\xb6\xa6s\x15S_L\x18|\xfag\xed\x81z\x3PV5?\xc8" +"Y\xbf(c\x17\x99o\xff\xb4x\xa2$\x8b\x90\x8f\xf1*\xbd\xe7\x5@\"$\xa3\xee_F=\xd3\xd2" +"C\x87\\\x84\xe0-\xb9h\xec\xa1\xccR\xc7Qq\xeaP\xd6\xa8\x8c\xa9\x13'\xa7\xaaW\x95\x1" +"\x9f\x36\xc0\xa1\x9c\x9:\x1c\x9d\x37#\xc7V\x8f\x9d\x41\xf2\xe4\xff\xb7\x12\xfdG\xf8" +"\x97p=zb\xbXk\x81\x93l\x84\xaa\xed\x61\xd8\x43\x32\xb3\xbe\xbcO\x95\xb7\x96\xb9>" +"\xf7\xa1\xf5\x65\xc4\x94\xf8\xa6^\xdb!\xe2\xee\x18\xdc\x2U\"\xef\x8eY\x98\x87\xca" +"(6\x6\x9c\xdd\xd8\x89\x88\xe5\x86)w\xb7G%\x84\x30\x31\x98\xcc\xe9~\xf9\xf9\xe1\x44" +"m\x1f\x1f^\xd1\xcf\xc6\x66\xa8\xa0\xc3\xa0>\x17\x92\xef\xb6\n\x9b@eI\xe0\xde\xdf" +"j\xcc\xdb\xd9\x87\x42V\x8bG5\xa7G\xd8\xe5\xde!\xe6\x30\x12Z\xe0\xc6\x91\xd0T\xe4" +"!\x99\xc1[\x1f\x80\xca\xfan{\xb2\x0_7J\x9a_\x99\x0\xab\xb7@\x9c\xcdP\xc3\xaf\xcc" +"\xab\x12\x14\xe6\xa8V\xf7\xc7\xeb\xa8\x9b\xc3)\x18\x1\xe1\x34=\xa9\xda\xd2\xc6\xed" +"\x7\\\x8e\xca\x14#\xb4>Xz\xecg\xe6\x14Rr\x81K?\x19\x1b<(V9\xf9\xe2\xd6\xe1H\xa0-" +"\xc2\xcb\xc0\xe0T\xd6)\\\xd0]\xba\xc1\x95\x4\x0\xa9\x18\x93\x16\xf0&[\x86\xa7\x32" +"\xd3\x2\xc5\xbe\xe8\xed#7h\xf2\x37\xc6&\x0\xcb\xaa\xff:\x11\r^\xfbl\xc7\xca;\x92" +"\xd9\x65\xca|^\x8d>d\xec\xf2\x39\xfe%\x7\xfcy\x7f\xdb\xe5L\x11\x12\xb2\x8dM\xa4L" +"`\xab\x9\xd9\x94\xc5\xbax\xd6\x63\xa2Y\x19\x34\xcc\x5+\xc7\xc\xd1\xdc\xa3\x32\\\x66" +"\xc9\xcb\x98. 9\xf5\xdbp\xc8H\xd3\xdc\xef\x65[\x1c,\xd0\xce\xc8\x86_\xe8\xe1\xc0" +"\xa2g\xbeOp~\xceoZ=\xfc\xa3\xcc\x1e\xdf\x92\xc7`C\x9fQ\xaai\xa4\xc1\x80\x1e\x96\xca" +"Mn\xa4\xad\x98\x2X\xf3\xd1\\\x89\x39\x13\xab\xce\x9\x10\x19\x84\xc6\x1b\x91\xd6\x3" +"\x5>I\xa9|\xb8/\xbap}\xae\x8a\xf1\xd5y\xfdi\xc8H\x1c\xb7\xb7\x12\xcb\xcd\xdbM({\xe9" +"\x95\xe3,\x2\xb3\x99`*\x8\xb9\xdd\x84\x90\x39\xb5g?\x19\x30\xbe\xc7\xbf\x36n\xb0" +"\x82\xd2\xca]\xb2\x38\\\x8c\xc4[\xe3\xfc\xe\x31\x82\x1\x91\xa8\x14\xeb\xa7\xc4\xf2" +";\x19\x38\xe6\xc4\xd8\x0s'\x87\xcd,\xb9\x7fv-\xfc\x85\xd4\xb7\x98\x80\x9b_\"T\xd8" +"&\xca\x42\xb3&\x95\x42\x8d\x12\x2\x98\xb4L\xf3\x84\x94\xe5\x62@\xb7]\xf1\xe4\x1e" +"F\xe5\x83\x95\xca\xad\xd0mm\xa0\x33\xe8\x1a\xde]\xc3\xb8=\xaf\xf7\x43" +"\xc6\xe9\xe4\x87\x16\x0=5\x8d\xf6<\xd7\xfd>/r}\x1f-\xc)\x96/v\xd5\xc9^\xd4Ko\x8\xd0" +"R\x2ZfW\x85\xf2\x64\xa3\xd5\xf5Y6w\xb6\x30\xe6(\xb5\xea\x81\xfb\x37\xcf\xfdz0\xb7" +"\xfa\xd2&\xb6\xfd\xc8+\x8x\xafL\xe\xc4\xf4$:\x80{\x98\x39\xea\x62\xbc\xbd\xf7\xc2" +"\xe9\xb3\n\x62\x38v\xe6\x32\xe0\x84\xeb\xf4\xa2\x1e\xda\x4\xfc\x88\xa1\xc0p!\xd0" +"\xc7.\xc3\xe9i\xd4I\xfe\xb0\x8eX&\xec \xe5[!\xeaq\xeaY\xf6\xe3\xb0q\xb\r\xda\xb3" +"&\x1bJ )\xec\xabh\xc1\x9a\xddQt\xe5]^\x98JN_8\xf5\x92\xa3\x2\xfe\xe6\xec\xe7\x32" +"\xdd\xe8\x41\xa2\x86r\xc6 \xcc]htU\xa5\xc0o\xa9\xfeh\x83\x94\xa0O\x96\x31.\xd0%\xb7" +"\xaao\xbc\xe2\x92_:\xe5Y\xcc\x18\x86\xbe\xec\xdbp\x82..\\\xa3\xf7\x32\xa8t\x4\xb1" +"Sj\xac\x46\x99\x89\xe9\x61\xc\xfa\x44\n\xce\x43\x87Zp\xcaQ\xf3l\xb6\xf6)\xd9\x42" +"L\x1e\x35\xa8\x8f\x92\xd5\xda<\xd8\xcb\xaen\x84%\xa3ih\xe2\x1fO04\x97I\xe0 [\xff" +"\x8dU(7\xd6\xfc\x39S%%7\xb\xba\xc8\x33\xf7_\x18T\xc9?\xc5\x33\xa4\xaaS\xad\xf7\x0" +"\x81s\xa7\r\x94\xa4\xeb\xf5\x38\xea\x9e\x62\xbc\xda| \xe0\xa0s\xbe\xe2\xef\xac\x34" +"\xd2\xef\x1d\x3\xba\xbdQGe\x9eP\xb5W\x4[.\xb8\x9d\xb3\x3t\x9b\x4\xd3\xf5KC\xfe\xd6" +"\x12\xfc\xc6\x82\x6\xe0\x1\xa7\xaf\xe9\x2\x30\xd9\xc1/t\xa3,~\xdb]\x2\x41\xdc:]Q" +"H\x1f\xd7\xc8\xfa\xe0\x8f\xee&?\xbc\xed|}\x91\x1b:0<\x83Z\xf5\xfa\xdf\xd2\x18\xf6" +"\x1a\x9dm\xe8\x4\x85\xab\xca\x88 \x0G\xb0\x94\x44\x1fwg\xb9z$\xe8\xc6\x12Y\xf\xa2" +"@{\xab\x1e\x8bV\xc7\x19\x14\xee\xf2\x35]\xd9|\xfa\xfc\xc1\x92\xbc\x6\xfc\xe0\x63" +"\xd3\xd9\xd1\xa6)\xaa\xdcu\xe3\xbf r4\xc2\x8\xe7\xe3\x6\x63\xed\xd6\x91\x4\x30\x65" +"\xc9\xcb\xc4s\xd9|mM\xd3\xdf\xf5\x9dj\x9a\xbc\xdd\x44\x12\xc3\x12\x8f`1`\xaa\xd8" +"\xf8\x1cnzM\xca\xf3_:\x99\xb4\xea\x10\xa3\x43u\xb4w\xc2\xbf\x84\x65!\xa7\xea\xbd" +"M(\x7\x8e\x93@E*\x19\x8f?Z\xcc=\xb7\xe3\x90\x89\x39\xffn7\x9\xc6\xa3\xfd\x98\x89" +"C\x9aJ\xe3\xe1\xb\x61\x8c\xc9.\x14\xb6\x84)\xa3\xad,\x80\x94\n\x10yE.\xc2\x66\xf2" +"Te{\xe7\xd7\x9a*$\x8J\xf7?m\xf7\x1f\xbc\xd3+\xf6\x91:?\xab%\xf9wx\x7f{\xb0\xc3\xa3" +"\xe8\xba\xb3\x8dz-\xb0\xb4\x82iPd=\xd1\xe0;\xd7\xdd\x1f\xb1I\xa3\x38\x62\xa8\x92" +"&\xb7\xcb\x45M\xaf\x61\x31(\xc2\x7Tp\xe4.p\xa9\x44J\x8en\xcaRcE\xabH\xe6\xf5\x16" +"\xb\xa2;[\xdd\xfd\xa6\x4\x9e\xc4N\xd1\x46\x1c~\r\xd5\x14\xb1n/\xb2\x85\xf7 9\xde" +"\x80\xd2&\xe1|\x8c\xf0\xd2k\x9f\xa3\xa6\xe9H7\xeb\x9e\x93\x3\x36\x88\x97g\xa8\xd7" +"\xea<\xe9\x80\xa8\xea\x95R\x8b\x0IW\xbe`g\xcd\x9b\xd8\xe0*\xf#\xcc\x17\x62\xcc\xa6" +"V\xd3\x34\x12\xff\x45\xe9\x17\xfdJ\x3\xebn\x8c\x1f\x43\xfd\xb0\xa8\x96Z3\xb4\xfd" +"&\xbc$\xa2\xb\x30L\xa8\x17\xe8\x84\x95\xba\x9b\x36\x1a>\x93\x37\x17\xff\xb0'\x1f" +"\x7fp\xc5\xd3\xcb\xa1\xe8m\xfQ\xbf:\xba\x19M\xaf\x32\xc3\\yf'\xd0\xc{\"q\xac\xe2" +"F>7\xe9{<\x82l\xf3\xdb`\x2\x8f$\xf\x94R\xcb\xe0\x8f~\xbc\xc5\xfd\xb1\xbc\xbb<2z\x9f" +"E\xb\x9eVq\x91\x61\x1\xd6\xe3\xe5\xe4X\xca\x31\xf0M\x12\xf5\x92\xf8;\xad\xa2\xc3" +"h=8\x86\xaa;@9c\xab]\xbe\"\xf\xec\x0\x3ztX9\xf6z65\xdf\xd3\xbf\xf0\x8f\x36t\x82\x96" +"-\xed\x88\xec\xf6\x32(R\xd6\x43\xa5M]0>\xb0K\xfd\xde\xe9\xbb\xa1\xeb\xcc\xba|e;:" +"a:\x8eq\x9a\xde\xbe<\xe1\xbd~uN_Iw\xe8\x63\xe3\xc2\xd3\x88\xa6R'\xb4Q\xd4\xf3\xa4" +"\xf9N\x6Q<\xbaJ\xc1\xf2\xf5\x11\x61?\xf0\x35\x61\x16\x84\xcc\xc4\x61Y\x90\x0\xe5" +"F\xe4\xd9r\xcai`\xe0\x95\xa5&\xe4sZ#B\x1aL\x9bY~\xce\x8\xaf\xa2u5\x92\xbd\x16\xde" +"\xd9\x32U\xa1\xe3=\xee\xce<^\xb7{\x94g\xe\x81\x37\xf2\xa4\xa4\xb9\x8a\xc1\x93%\x8e" +"}\xea]\xb8@\x8a\x80\x61\x88\xf2\xd1\xdd\xc4@\xcc\xf0\xe9\xa6\xe2\xf0\xc7\x8f\xdb" +"\xd7\xb6\x8d\xd4\x93\x9d$X\xc1\x96[\xf8\xbe\xd4VK2F/\xff>\xc8\x92\xc0;\x11\xd3\xea" +"\x81?\xabL\xfb\xe8\xd3\x1\x63)\xc5\xb7\xe3\xdf\xed\xf\x8(MD\xaa\xbz/k\xc9n\xa4P>" +"\x8e\xf5*d\xc2+\xedkE%\x81\xae\x8f\xf8\x91}S\x97\x64q\x94\x1a\x91\x16\xa2\xd8x\xfb" +"%A\xb5\x61vz\xbdN1\xcc\xd8\xa5\x90\xca\x3ILb\xaf\xfd\x64\xea\n\x1b\xc7y\x17=\xad" +"\x84\x99\x9cz\x8d\x84N\xb1%\x9d\xe7\xbb[%\xcd\x2\x35\x37\xa4t\xa5$\xeb\xe4\x66\xb" +"\"V\x89I\xe6$\xd8\xfe\xa0\xad\x37\xf4\xce\x1e\xc7YU\xee\xfaI\xc6\xbf\x18\x3\xbe\x87" +"\xe9\xc9\x86_\xf3\xf6\xb8R[\x8c\x15\xfe\x88\x35\xca\x15='\xe6\xc0\xff\xc\xa5\x10" +")\xa7\xa9\x18]%\xf0\xf1M\x86\xfcy}\xcc\x1f\x99\xee\x97\xe2\x5K\x9c*.\x6\xfd\xbe\xb8" +"\xde\xf6\xcd\xd3h\xbf#\xa8X\xd9\xf8\xc1\xde\xfd\xce\xaf\x1bJ\x8d\xe5\xea\xfc`L\xec" +"\xcf\r([\xe0\n\xa9\x12\xea\xb6n\xffM7\xad.\xfe\x34\x85;\xbf\xd8|\xe0\x9b\x18t\x9b" +"H\x99\x43\xee\xca\xe7\x88{\x0o\xb8'\xd1\x1\x91\xda\xd1\x84\x66\xcd\x1f\x86PXy1\n" +"\x8b\x17\x1f\x90.\xa0\xc2j8\x8e\x13\xb5\x9e\x8f" +"A{5\xd1\xc8Q\xf9 :\x89\x97R\x15)\xf2\x1a\xd8I\x8f\x96\x93\n\xa7~\xba\xf8.\xe0*W\xbc" +"w\xc7\x92\xd9\xf2 )KE\xf4\x8e\xa8\xfd\x94\xe0\x1c\xd2VE\xd3m\x16\x89#V/?\xdc\x93" +"\xcby\xddG`\xda\xc\x10<&ur-z\x1by\xfc\xb4$^\xd1/\xa0\xdbRI,\x9c\xceX\xb3\x33\xcf" +"\xee\x82(\x12\xf7\xdc\xa6\x8e\x80,E\x1b\\\xfa\xeb\xac`\x8b\x95\x3\x86\xb6\xc5\x82" +"9\xd1\xc6-bM\xd5\xd1W\x82\xfcU\"\"\xcc\xa0m\xdf\x38{7>2\xc3\xc2\x86Lc\xc7h5\xc\x37" +"(7`\xf3QZ[\n\xfd\x66\xc4\x8a\xb5\"\xeb>\x80\x8c\x6\x1f\\\xd6\xbd\x96\xcd\x18\xc9" +"\x83\x9d\x30P\x8e}N\xdb\x88\xe8\xf1\x1e\x31\xe1\x9\x19\xb1kyq\xf0mxw\xa0X\xd8\xa4" +"\x94L\x84\xfcl\xae\xdf\x33\x41\xb4\x8bn\r<{\x85\xd7\x10\xe0\xc3_[PS\xcfKG\x98\xb3" +"w\x8c\xc2\x8b-\xc7\xae\r\xf3\xa4\x9f\x9f;\xcd\x8e\x95\xd7\x46\xc3\\?G\xd6\x8b\x8a" +"\xa3]\x97\xaa\x8\xe7\x11\xb5\xfb\xe7\r\x1a\x62<\x82T\x1e\xbd\xc5\x1a\x82}\ni\xe6" +"\xc0I\x8z\xd2o%n\xb7W\x7fX\xcc\xff\xbc\xcb\xa5\xa9]\x9=\xc2\x94\x64\xc9\xa3\x8d\xe9" +"[\xc6\xb1\x85\x39\x63\xb2\xde\xb0\xb5z\xd1$\x8do\x16%\xe1\x15\xee\xb9Q\xbWr\xaa\xe4" +"\xe3\xc8\x66\x65}\xb0\xb3\xbf\xe\n\xc3\x45\xe1\x16\xf8\xd4\x97kw\x8v\xff\xe3t\x8c" +"6\x16U\"\x99\x1f\x46\xa3o\x19=\xd1\xa1\xc9G\x13g<~L\x81X#\x91\xb6\x36\xc7-\xe9L\xe6" +"%Ct\xf9\x9b\x62>V\x86\xc1=\x8a\x83\"\xe8>\x11\xbb\xb\n\x89lj\x8c,OulS\x85\xcdp\x17" +"\xf2m#\xf7\xc3\xee\x97\x37,\x86\x8c\x8c\x91U\x81r;\xb6\xb7kL<\xe8\x99\x8eO\xa6\xca" +"@\xb6\x33\xdf\xda\xa5\x9b\xa9\x2\xa4\x95-\xa9\xe\xc4\xfc<\xf0\xf2gj\xcf\xa7\xf7o" +"x#o\xa2\xde\x10\xfd\x35\x45\x35r\x15$k\xb7\xe5'\xf2w\xc2\x8b\x35<\xc6\xd7\x9d\xce" +"\xf2\x1b\xcc\x8fw`<\xddX\xa2\xcc\xdd\xbe:\x98\x2\xf9\x41\xce\xd8\xe0\x35\x31\x38" +"u1\x95H\xc4\x19\x92\xa2\xbe\x93\x9a\x17\xcc\x10\x94&\xe3\x38%\xaeY\xbc\xd1|\xb1\x9f" +"P\xd9r\xff\xcb\xe7\xd9\xb4\xb0\xbb\x9S\x3\xd9\xdc\x9d@f\x96\xc2P\x8dl\xe9\x9e\x11" +"\xcf\x0\xf6\x46\x11G\xe9tI\xed_HmH\n\x86\xd3\xa7\xac\xec\xb7\xe9\xa9\x45\x98G$\xef" +"\xc2\x1cPy\xb1\xfd\x3\xed\x80<-\xea\xfc\xe3\x32}-x'q_\xd6]\x95\x6!l\x88\xb0\xfa&" +"\x93^\x95\xc6\x41\x14\xa5\x19\x19\xd4\x19\x3\x8b\x1a~\x9c\x1e\x82\x9f\xbf\xb5\x32" +"u\x9\x37R\xdf\x19\x89\x1a\x97\xf3\xcb\xf7q\x9c\x1f\xd6\xcb\x17\x1\x9am-%6\xe\xca" +"\x80LK5\x17&b\xccGi\xd2\xb7\x85\xc6\xc8~ZN\xcc\xe3\x17\x4\xe5\x9fq&;|<\xae\xc8\xac" +"\xb4\xc7\x42n\xc2_\x11\xa0\x4##\xeel>\xeb\x4(M\xba\xe2\xc7p\xbc\x41\x9d\xcey\xbd" +"E`\xae\xa4\x15q\xc3\xb5\x95\xf5%`\x19\x1d\xc7\xa8\xfb\xf6=A:w\xa0\x90^QtA\xb1l+P" +"\x1e\xa2\xf9\xe9\x9c\xc3\x8d\x5&y\xf2\x88\xfd\xf1\x89\x45\x42\xe3\xa6i\x89\xa0\x9" +"\x1\x85\xeb.u\x13K\xfa=\x91G\xc3\xdb\x8a\x62\x1d\x9d\x35\xe3w\x86\x85\x37y\xe1W\xb4" +"\x7fqbmk>c0\x5\x91Y\xc1u\x96\xc1\xb8\x7f\xe2\xb4\xffG\xed\x9dx\xfaL!`\x7rv\xc8\xb5" +"\x8c\xef]\xc0\x30\xb4\xa5\xd8<\xf2W\x9l\x4\x7f\xe6M\xe3\x7\xc5\x98\xb8\x15\x5\x8e" +"r\xd5\xf5}\xf5\xc3i\xe6\x64\xe1\x37\xde)4\x9e/\x9d\xcd\x8c\x9fN\xbanv[c'\xd7\xa2" +"\r\xfc\xb2\x7\x11'?\xd8\x9\x1c\xba`\\LIBH\x7o~\x3\xdf\x65\xa6\xa5\x1\x64\x98\xb\xbb" +"\xb7\x8t\x1e[\xf6\x5no\x99m\xc0\x7f\xff@\x8c[\x8e\xab\x8d\xce\xc3\x15\xe9(s\"\x8c" +"\x80]D@\xa6G\xe>\xe3\x98\x37X\xdd!\x1c\x9c\xec\xdb\xfa\xa4\xc9\x30\xc\xba\x0`\x8a" +"K$\x4\xa3\xc7\xaf\x1z;~g\xf3\x9f\xbQ\xac\xf9P\xd3\xe7\\\xc7\xbc+\x8d\x34\x80 /\xa9" +"X\xe8\xee\xb$\x5\x1R2\xee\r&L|\xa0,\x18\xca\x45\xcb<-\xe3\"\xd3\xeb\x7f\x0\xf9\x45" +"]\xb6\xc5\xb1\xf4\xe5\x9c>\x95R\xe\xc3m}\x90<\xbb\x62]p\xb5K\xf6\xf8%^A&\x4\xbb\xb2" +"\x9f\xee\x2l\xc6`W\x7f\x91\xdb\x1d\xb4\xa6\x13\xee\xef\xb2\xc\xf7\xae<\xd8\x9dVZ" +"\xc8\x38\x41k\x1\xb5\xdeO\xfaUP\xd1\x7f\xb5\x1f\xbb\xeb\xe2\x1c\xf1\xd5`8\x86>\xe9" +"1\xb9\r\xec.!\x1e\xd4+\xa9.\xc2\x44\xd4\xce,N\xc5\xca\x87\xa0&\x99'r\xdc*\xf7T\xfc" +"\x98+\x94\xf3n\xa7\xb7\xbfu\xe0\xec\xe9\xc\xbb*j\xa1\xa0\x12\xe8\x89\x8b\xd6y\xc2" +"<\xb3\x82|5\xd5\xd0/\x5i\xc7\xaa\x82\x61]J\xa6u\x18\xec\xf6h\xd3\xb5}n\xf1\xa8\x1" +"4$\xac\"h\xba\r\x9at\xd5\x88y\xed\xcf\x63\x82\xa8\x9d\x39xd\x94\x3\x3\xea\xec\x45" +"\xa3\x83\x4\xba\x8b\x1c\xb1\x98\x96z\xe2>\xb8\x10T\xbet\xb1i\x9\xa4\x5\xe8\xa7y\x9c" +"\xee<'\xf\xe2\xa6\xdcP\xbdsp\xb6\xb2\xc8\xfd\xb9\xa8}\x88\xd5\xd4\x3H\xd3\x98N9\xc6" +"\x93\xb6\xf4Hm\x99Gx`z\x80\xa3\x12(r\xdd\x65\xe4\x4\x92\x10|q\xc3\xcfp\x8a\x97\x17" +"\xe9\xee\xfa\xfb\xdd\xc2\x39\xc5:\xa9\x64[q\x10\x38\xe5\x9c\x8b\x86\x1b\x37\x41\x1a" +"\xb2\x3\x9b\xed\xf9\xcf\xd0\xf\x8\xd9\xc5\xd7\x61TB\x7f\xf5\xdd\x39\x87\x8c\xec\xc5" +"\xd7\xbf\xb3\xf1\xf0\x35\x8q\x85\xc0\x98\x1f\xc7y\xe8\x85\rP\x99-\xfd\xcf\x91\x32\xbcU\x1e\x98YC\xb0v\x18" +"\xac\x10\xd1\x15\x4Q\xf0\x84L\r\xc4\x1dn\x17\xebP\x8d\xc8h\x9e\xc7&@\rZ\x7fo\xeb" +"<\xc7\xbc\xe0_\x9\"\x8b|\xb2\xc5\x39\x36\x64\xd8\xdd\x9aK\x96\xb1\x2\xe\xf2]p\xaa" +"-\x91\xca\xe9:\xfb_+\xf0\xaa\x18\xca\\Y\x9f\xa1\xa7\x8\xef\x35\xbf\x8f\x7f\xfe\xc9" +"\xaf\xc1\xf2\x42\x87\r\x2\x8b+\x14Y\x6;I9C\xef\x12\x83\x82\x97\x83\xe1\x1\x2\x42" +"\xe5\xcfM\xa3\x9d\x93\xd5\x6\xf3\x89)6\xe7\xd6\xcf\x11$p\xa5!\xd3\x97\x43\x87\x33" +"\xd0S\x94L\xff\x12\xd6\xff\xae\x82\x46\xf2\x6\x18hO&7\x15\xaa\x98\xe1]r\xa5&8>\x5" +"\xc2\x32\x14\xb7\x83\x38\xe5\xb4v\xf0\x98\x1d\x90\x5nn]\r\xb6k\x1d\xf2)\x8eY{*\xbe" +"\x1d\x81~\x18\xbe\xb0V\xe6^\xdb\x42\x34\x34-\x96\x0G\xb\x14 \xc9!\x4\x19\xd8\x34" +"\xe4\x31\xb8/X`\x8c\x87\xac\x36\x1a\x2\xd0\xf1\xfeKG\n=q\xe0\xd2\x1b\xb8~\x10#\xd4" +"(\xe2=Yl\xb9\xe1\xa2\x18\x44\x3\xa1n6\xe6\x44\xbc\xcf\x9b\xbd\xe2r\x90HPW\xe6('(" +">s\x80\xafxk\xf3\x95\xb3\x96\x1b\xa5\xea\x46\x9c\x31Wc\xfaY\xe0\xf1v\xef\x81\x98" +"_8\xb8\x82\xdeV\xa7M\x12\x8e%m\x1b\x89\x93\x97(\xe5Z\x92\xab\xa2\x1akxD\xfa\xc1\xba" +"{\xbd\xd8\xb3J\x18\x19J)\x84\xb0\x0\x38\xf\xe9\xf6r\xe8>\xfd\xbf'o\xe7\x97\xa3%\x81" +"[\xf%\xcc\x95\xc9z\x9d\xac\xf5mX4\x86\x30]|\x9eQ\xa7\xe3\x37\xd1N;\x90\x3\x33\xeb" +"8\xfd\x93\xa9\x95\x87\xda#A\xb1\xc\x5\x9cq\xce\x8\xf\xe7S<\xf\x5\x9f\xa4\xeV\n\xf9" +"\xc4\xa4\x1aK\xe6\xfb\x45\x84o\xf8\xf7\x81\x65\xe1\xbJ\xd4\xf&K\xcfU\x96\xa1\xe8" +"\xef\x8c\xb6\xeaK\x1a:\\i\x5\x9a\xb1V8Cg\x9e\xcb%\x11\xa9\xe\x88\x98\xf5\x42\x95" +"d\x9c\xb7='w`\xd8\xd0J\xba\xcc{\xccnwz\x5\x30\xe2\x6|\xcb\xc0\x86s\xf9\xc8\xc1x\xf9" +"\xd6r\xac\x8a\x15\xe5\x36\x7f\xcVQ\xb5>u\xe0\xcf\xa5|\x93\x17\x46\xae\x1ag\x9c$m" +"|\x94\x17\xf1\xcd\x89\xdd\xdb\xd1\x17Q\x83\x36~{\x9R\xdcK" +"\xc2v|LbG\xb1\xd6\x10>R\xbc{~\xa6)\x8f\x45L]\x97\xacW_\x19\xc1\n\xcd\xffN\x10\xc7" +"\xd3u\\\xfa\xb4 \xc\xacTRi\xff\x1d\x8d\xb0\xd6\x7\xc7\xadG\xf4\r\xdf%z\xb4\xe7\xd0" +"u\x5w\x0<\x13\xe4\x94\x19`\xc3\xdd{\x7t\xdd\xac\x18\xe8\xab\xaf\x8fS\xe0<\xbe\xf6" +"\xd5{D\xf2L\xf8!\x1L\x6\x42x\xfdQ\xb3\x42u\x93\xd1v\x94\xb4\xab\xce\x81\xf4\x9c\xbb" +"\x98LXx\xcd\xf0\xc3\x8d\x1e\xd7\xfd\x99\xb0\xb9\xa3\xbd\x8d\x8f\xf6!\x95\x88\xb3" +"\xb8\xfaY\xd0\xcd\xd1\xd9\xb2\xf6Q\"\xab\x45\xe4\x8f\x17WF{\x92\x4\x92\x61@\xe3\xc3" +"P\xc5\xa9'\xa2\xe7\x0\x17\x30S\xec\x35\xd3\xf1\xda-rXqL\x97\xfa\xa8W\xf0\x89\x89" +"\x17\xbd\x94\x62\\m\x1e-w\x13\x8e\xfc\xaa\xafQ{\x17\xfe\x18z\"\x12\xc2J\x88\x1a," +"jd}\xef\x63v\xed\x80\xae\x41u\xc5\xee\x80\x92\x1f\x0\x19\x95\xb4NI\xf0\xd3=\xd9\x7" +"Z\xcf\x33\xbb\x3g\x1c\xb\xcc\x34\xadW\x84\xad\x1c\xdf\xed:m\x9b\xa1\x3\xb3\xdd\xc1" +"\xcc-\xe7M\xbbWj\x2wqRu!\x8c\xd1\x9c\xa8\x89\x92\x9\x12Rf\xd8\xbf\x12\x86\xf8\x81" +"\xdc\xc2\xc3\x83t\x9d\x1ev\x8dg\xf@\x99\xf7\xde\x95\x9e\xdf\xe8RX1\x83\xc9\x11\x16" +"\x1(\x81\xa5j$\xaa\xf0 \xea\x45\xcd_9f\r\xeb\xce\x30\xac\x1c{\x8c\xfc`8{\x1b\xc>" +"6\x1b\xe6\x12\xfd\xfa\x9f\x1\xb7\xe4\xb4\xa1\x88\x39\xa2\xc7\xe0\xe3\x93\xeb\xc5" +"\xad\x9a\x8aN\xbc\x31jt\xc\x1c)]\x9e\xf5\xf4\xdf\xfa\x6g\xf9X,\xb\xb8\x37\xb1\x42" +"\xc4\xcf\xc6\xb1y\x8e\x94v\xd0\x63\x11\x11\x3;\x8b\xa7Z\x10\xfd\xc8\x0\xe2\xab\x1e" +"\xe\x82\x96\x32\xf8i\xcf\xe4s{\xe9\xe2\x80\x7Y\xee\x8\x31\xdc}\x11\x95\xea\xf8\x5" +"Uw\x19\x81\xddm\xc6`h\x12\xd9,\xb8\xef\x86\x44\x7f_lobm\xe&\\g\xe5*c\x19\x18\x9e" +"\xe3I\xd4\x8eI\xdf\xe6\xa9\xe9\x8fv\xc4\x14\xa1\xe3!z\xe0\xa2\x15\xa1~T\xaaI\x8f" +"N\xcd\xc5\x2\x42\xac\xc7\xe2\x32/c\xbb/\xf2\x18\x9d\x5~sT\xe3*>\xd1\x80\x31\x16\x17" +"k\x9b\x9d\x1)\x93\xf\x91\x9e/\xec(\xb,\x89$\xe4\x9e{\xb7Wh\xa2\xee\x1d\xa8\xad\xbe" +"\xd4\xe3X\x99\x6\xdf\x1b\x92:\xef\x84\xc1\xbd\x32t8\xb7\x31\x1.i\xbb\r\x43\xa1\x84" +",\xb8\x8b\xb5N\xa4Qdw\xf7\x4\xcf\xeb(n>\xa4\x83\x44Z\xd4\xd7\x45\x86\xfc\xf3.\x96" +"\xd3\x66\x90\x10\x84\x36_i:S\xc5\xfbS/\xbf\xe7\xbc\xc\xad\xc4\x4\xc4\x98PB\xd6\x8d" +"\xbb\x90\xa6\xdc\xda\x35\x31\xee\x32MU\x8a!O\x93\\\xd9\xfc\xc9\xa0\xce\xbe\x9b_\xb0" +"2?K8 R\x95\x99\xefH\xee\x6\x8bZ\xce\x85\x0O\xea)\x84\xf0\xa8oZ\xc9\xd5\x61\x63\xbb" +"\xfe\x11\x42\xb7t\x14\x8f\x1e\xb0\xa4\xdc\x89\xc3\x34\x90RS:}\xe6g)\xdb$A\xb8/\x8f" +"s`\x11\x1d\xac\xf6\x92\x93\xc9\xb2\x81\xa0SO>\x9e\x92$\xa7\\I\xa8\x32\xf2\x8b.Ir" +"bGU\x7\xb6\xdd\xfa\x9f\x1\xca\n\x66\x96\xe3\xf5\xac~\xa6\x85\x95\xeb\xa0\xc2\xeb" +"\x8aG\x81?\xf9\x36\xd8J\xc1\xb2>\xcaz\xa2\x86+y<\xcb\xb0\xdf\x9f\xddI1\xbe\xf3T\xce" +"\xc1/\xbfG\x85Y\xfe\xc2\x9f\x81\xad\xf4\x45.\x83\x96>VT\x1d\x31\xf3i\x1c\x93\xa5" +"\xf\xb\xba^\x95R\xc4\xf2\xa2:nS\x6\x7)\x85J=\xd7\x1c\xc4\x30\x8b\x91\x95}\xb1\x9e" +"f\xaa\xa1\x8f\xa6pU\xa9P\xf1\xc2\xcf\xf7\x8a\x3\xbc\x1aX\x8c\xf6$i`h\x6\x87\x19\xaf" +"\xb1\x0\x1c\x45\x81\xee\x7!\x13\x88-\x90R\xb2\x1e\x35]@\x1e\xd8\xcd$\xd0g\xb9\x9e" +"ak\xdaZ\nZ\x93\x36\xfcI\x96\x32\xb7\x9f\xf2\xfd\r\xef\xb0\x96\xef\x46\xb7^-N\xfH" +"\xda\xea#\x97\x19\xfe\xc4\xd9\xa2\x98\x18\xf5\x87_\xc5\x4\x1a\x9e\xdb\xd2l\xaf\n" +"\xce\x14\xcc\x80\xbaI\xbb\xa5\x9e\x91\x8e\xb3\xd8\xf1\xe5\x41\xaa\x16\x2\x65\x85" +"\xa2\xf7-\xf7\xd8\x35\x41\x81m\xe4i\x81\xfb>\xfd\xc\x30\xe4X\xcf\xad\x4\xc7\x94!" +"\xab|I%\xe2:\xea\x7\xf9\xf0\x18\x43\x1cy\x0\x2Ym&\xbd\x96\x63\xb5\x1bi\x9d\xf5>H" +"\x82\xcb\xc3N\xde\x88\xebU\x4[\x88\x9b`b\xe3_\xd1\xe0\x18\xbc\xe7\x85\x15{\x85\xec" +";\x9c\xa6\xc8]K\x16#\x82u8[\x82\x85\xdb\x1-\x8f\xb7\xc9\xf5\xb9\x46\xa4\x1dz\xf\xb8" +"x\xffr\xc3\x96\x83\x14M\x8a\x0|\xff\x63\x1b\x43t\x8f-_\xc6\x90\x30\xf\x9b\xc0\xc8" +"7\x0k\x92\xec\xeb\xe0`^\x8c:J@\xe\x18\xae\x89\x97\xd1\xb4_\xee\x10\x6\x8e$|d|\xf8" +",m\xfb\xe5\xe8\x81\xd5\x11\xff\xa6\x87\xb7\xae\xb7\x85\x46\xbf\xd0}_~\xc2\x42\xdc" +"\xefI0\xd8\xaa\xad\x8c\x61R\xb6\x64*\xac\x32Yc\xfd\x14\x7f#k\xb8P\xa9\x96\x65s\x9d" +"\x6\xcd\xbd|\xa7\x9aR}\xcf\x46\x1e\x33\xf2+\xc9\xc5\xdb\x0\xda+\xd3\xdd\xdd\x8c\x99" +"\xd9\x97\x93\xbc\x98(*\xa8\x87/\xf9l9B\x85\xd8-\x94\x19\xebx\xb6\xae\x37\xa5\xf5" +"\x19\x39w\x0\xf7]bJ\x9\xbd%[Wn\x95Z2>xN\x8f\xc3\x11\x31\xf0\x3\xb0\xe3\x2JOX\xfe" +"\xf2\xa6\xc0\x43yb\x1\xfc\x42T\x82\xe1\x15^\"\x9d\x1b-C\xef{\r\"2+\"\xef\\\x9a\x1b" +"\xe0&\xa1\xc3\xd3u\xed\xaf\xf9\x95\x97\xe1\xe5GyR\xa4\xe8\xd2\xac\xf5\xd0\x14\xbc" +"\x0\xdc*'/\xa6+i\x83\xe2}\"\x88\x81\xe2\xef+\x8b\x95\xa6\x81\xcb\xe9\xc_\xde\x16" +"3\x1c\x85\"/\xe2\xa1o\n<0\x0\xa6>.!fl\xc\x11\x9f\x8a\xf8\x9aT=7\x97pi\xa5\xac\xf1" +"Uc$\xf0R\x4\xce\x8c\xadP\xffO\xb6\x30\xd9\xcb\xbf\xc3$\xde\xdaXJ\xa5j\x99\xd3\xa7" +"o\xf5[\xdc,.\xa3\xa0!6\x1c\xcdJ\x83\xc7\xa5\xe2v\x8d!\xf\xa6\xde\x88\x9f\xd4\x8a" +"9\xd6y\xc9N\xc3\xc9\x9a\x8d\x33\xff\x11\x37}\xa7\xf6\xf1\xb7\x1a*\x5\xb3\x2\xec\xde" +"\x95O&w?9\xac\x88\x15\x42\xf0\xd0\x96\x9c\x39\x95\xc3Q\x9a\x8e\xf7\xb\x42 \xd8k\xf0" +"\x1b\xee\xcc\x64\x62\x85^{hn\x1a\xff\x1c\xa9\x1f\xb8\xfd\x8bJi\xe1\xe\xe0\xc2\xad" +"\x94\xad\xd4\x44IPo\x9bn\xf4\x36\x41\xf2\x2n\xffn`\\g\x5`\xc2\xb7G\x6\xfb\x94\x9a" +"\xa7\xe8\xccj-\rb\x7\xe4W\xe7\xfd\x87\xec\x1b\x90\x92\xdch\xb9\x14\x39G\xcc\x8e\xd1" +"J\xfd\xdc\xbf\x8f\xdd\xa2(\xa7hG\xf9h\x2\xe5\x61\xf6|\xee\xfd\xe4Z\xe5\x87g9\x83" +"\xfc\x4\xc9gD\xdb\xaa\x83\xf2\xdc\x83\x8d\x63\x39\x43\xc7]\xcb\x9e\x64\x10GN\xb2" +"{4\x8f&\xe5\x5\xf0\xab\x90\x87\x89@\xe8\x46\xc5\xe9\xf3\xc5\xfe\x8c\x35X\xc3#k\x1b" +"\x88\xc4\x5qiI\xb8PhA\xca\xbe\x17\x17GK\xb7\xc3\r\xb9\x1c\xde\xe3;\xf\x84H\x11v/" +"\xae\xc5\x35\xbd\xcf\x84\xc1\xc7G\xce\xf9\xb1\xfa\x61\xd2\xaf\xb5\xa8\x13\x35\xbc" +"B\xc0j\x94\xd7\xd5\x9b~\xdeU\xbc\xf6\xf9\x86z\xee\x10uU\xcd\xd0\x84\xb7hL,\x87\x8" +"tu\xa3\x9a\x9d\xa6\x34{\xe2\x81\xceV5\xa4\xd0xe\xba\x98\xce&\xc1\x46[\x1a\xb0\x34" +"?I\xff\x37\xb4\xd0\xca\x9f;\xb6\x93\xd7\x8d\xc3\xb2\x19%\xcb\x99j\x3\x8d\xcc\x17" +"%'\xfeW\xc0t`\xef\x39\xc0}C\x96\xe7\xfa\x97\r\x9f\"\xab\xd2\x1a\x9cyKd\xad\x96v," +"t(\xf5\x9a\x87W\xc3mlO\xfb#!a\x95\xa0L*,.{\x10\xefq\x93\x93\x15\x44\xd7\x82\xfe\xe4" +"\xb9\x1e\x1\x11\x9cUS\xbb\xc6%\"p\xa8\xd8\xc5m\xd6-D\x8fZ\xd8\xdci\xcc\xb4^\x1f\x17" +"\xf0\xaa\x1e\x44Q)\xdd\x0\xf0\x0\x0[#\xd3\x8d\xe9:;\xe5ZL\x4\x19G\xf3kNE6\xe3\x7" +"\xd0\x18\x5S\xf9.F\xb7\x43\x88\x1c\xb5\xd5\x38lH\xc7\xd5\xf8L+\xcd\x6\xb9\xc5\x1" +"\xf7\x8c~\xe6\x1f\xa2\x35\x16y\x1f\xcfM\xb2x\xafh\x8a.`\x10\xa5\x66\x92\xad\x92\x0" +"\x84\x97H~\xdf\xe4\xbd_\xa0\x83\xfaTA8\xb2\ri@\x2\x8\x87\xe3]F\xe0\x93\xb7\x1fz\x4" +"\xa6t`\xdc\x81\x16\xb4\xd4\x83\x96%\xd7\xcaiY\xd6\x83\x1c\xd9?\x81\xacN\xa2p\x90" +"6\xdds\x83\x64\xfd\xe7\x11\x13\xbf\"\xeb\xf1=\xfe\x16\x42\xe5\x64p\x1eo\xf\xfeu\x11" +"\xed\xf0?\xe4H\xc2\xb2\x8c\x64\xfb}T\xb9L\xa5v\xe4\x81\xfaV\xb2\xb1\x8a\xf1\xcq\xf6" +"\x99\xb6\xbf\xd4tY\xcd\xe1\x86\x9d\xf\xd3\x6\xbfH\x9aoB\xe5\xb2\xf0\\\xcfU\xbbk\x95" +"&\x97=\x19\xcb\x13L\xa7\xf1?\x1d\xb3qo\x8c\xc2\x17s\xa8\x32V\x8c\x16%\xb\\\xdb\x16" +"\xdf$\xbf\x81\xd4\x9f[7\x1\x8b\xd3\x10&.\xa7\x7\x81\x7\x86\x8a\xb0!l\xec\x83\xce" +"\xfc\xab\x1e\x9f,fZ1X\\\xa0M\xc0\x18y\xca\xa7\x9a\xaaZ\xb2\x1\xb5\x16\xf7\x5+\x1" +"\xb1k\xeeV\x6\x9\x83\x93\xb0\xe5\xd9\xf9\xe5\xe3\xf4\xeb \xf6<\x95\x8eym\xf4\x1c" +"\xf2\x88\x39\xf5\xc6*\x4\x31\x64\x87\x45\xd7\x83{Q\x9f:\xa3k\xc6\xc0\x8e\xf0@\xcc" +"\xf5=\x9bm\x8c\xc}\x1a\x84\xd7\x7\xecW\xa3\xc6\xac\x9a\x62\xab\x37%\x1a\x1\xa5\xed" +"@\xfd\xeco[\xe6\xe3Lj\x91\xd0X1\x94\x39w\x8a.\xe5\xd0\x36>.\x1f\x33\x46<32}\x5\xff" +"\xc0\xcb\xf0\x8d[\xc4W\xc7#\x4H\x97/\xb9\xb4\xd0\xd7\x82\xba}\xbf\x10\xd3\xff\xef" +"\x8b\xf5#n\xc1mM\xd6\xd0\xd8p\xd9\xd5\xeb\\\x64\xc9\xa4jOX=O\x83\x1f\xeet\xb0\xe5" +"\xb3:\x9\xab\xfd\x44\x44\x92\x9b\xd8\xf6\x38\xcdr\xea\xb9\x9c\xf2\xe9U\x1d\xf4'h" +"9d\xa5\x92\xe4\x9d\x18o(RX\xc5\xd5\xf6!\x96\xa9\x85\x32\x42\x1ds\xe3I_\x82i_\xee" +"\xc6\xe1\x95,V-Tk(a\x8f\xfa\xee\xbe\xff\x3\xa5\x7fM\x85P!\xf8[\xc{\xc3\x7f\xccm\xa9" +"\xae\xca\x9\x9b\x64k\x99\xd4\x18\x96\x9\xd3\xff-VB/\x8c\x37\xe9v@)>\xc7\xc9\xe\x33" +"\x80\x88x6\xf4\x93\x8f\xbfI\\\xac\x14\xfb\xa5\x64\x8d\x89(-\x8dI\xd9\x1a\xf7>\xd3" +"e\x81\x13\x9d\x8b\xd4%Q\xe2\x63\xe8\x30\xea\xf6\xb3>\xa0\x98\xc2\xc3*\xde\xa2\x19\xab*\xac\x8b\x9?@\x0\x9\x95S\x9d" +"\x12v\xd5\xf2\xef\x84\xcc\xd0\x99\xb7\x1f\xe4&\x9b\xdb\xdbj\x8dY\xc8o}.?\xbc\xcf" +"\x87s\xd0\xfa\xe9v@\xbc\x1a\xd4<\xb4\xb9\x92\xbf\xad\xfb\x9\xdb\xd0\xca\xae\xb8\xcd" +"\x9d\xa2\x64\x18|O\x97\x30\xe\x9al\x9d\xee\xd5RTy\xe6\x5\xc6Z\xe3\x36\xcb\xbd\xf4" +"\xe5\xd7\xf7\x9a\xd0\x98\xf9w(^\x6Uy\xb7H\xfe\xaa\x97\xf2\xa7S\xe1\xf9\x62\xfc\xab" +"h\xd7+\xaa\x8e\xe4\xff\x66\x91\xc2>1\xbc\xf>\x98\x1a\x96\xfb\x44\x4\x4\x85j\xe1\xab" +"2\xa7 [\x17\xd4\x11\xd8\xf2\x1c\x8c\x93\xb7\x4\xd0~\xc5\x94\x42*\xbc\x36\x8c\xda" +"+\x16\x10\xcej\x97?Dt\xe1+x\xb5\x32\x66g\x97\xf5u]&\x97r\xc9\xf5@\xb;\xfclX9]8R~" +",\xcc\xf2\x9bV\x12?}\xce\xf3\xbd\xe5\xdc\x1d\xfc[\x2\x93\xbb\x12P\x85\xb1\xd2\xd9" +")\xbc>\xe8OO\xadW\x1aI\x91\xc3\xde\xe0?-\xb3\xa3\x9~R\xb1\xa7\xd5\xc7<\xcb\x61H\xea" +"\xc6.\x8e\x36\xde\x9aq\xc5v8\xc6\xe4\xd5\xd9\xde\xd1\x81t\xe8\xc3\x90\xe5\xbJ[\x91" +"<\x7N\xea\xeb\xe3\x90\xb2\x14\xb3\xa6\x8f\x2\x86+\x9a)m\xb4\xb4\x9v\x96I\xe5\x1d" +"s\x8c\xbb\xdf\xb7p.\x15\xc7<*\xfck\xc3|\xe1Qq\xf4\xe8\"\xcf \xef\xe5]\x9f\x6\x1a" +"\xa4>d\x89\x89\x62\x8f\xf7\x9e\x65\x93#\x90\xcb\xb1]\x8e\x62\x13\x33\xb1\x8b\x11" +"\xc3\xbd\xf9o\x84\x1dt4\xe0\x1a\xd5\x1\xfe\xa9\x64\xa7[$\x8a\x35\xcd\x9d\xf9\xa3" +"~H\xa1\xe5\xa0\x9c\x62K\x93\xce\x44\xf0\x4/\xa0\r\x7f\x9e\xe8\x9b\x9fz\xb7\x85\xe9" +"\xc7\x18\xcfnr(\xf7\x43'\x1c,\x9b\xba\x17\xe5 \x8b\x92\xe\x44\xe7\x65\xd9\x9d\x86" +"e\xe\xb4T\xb0\xfa\xaa\x11'S\xaa\x1b\xd3\xa2\x42\x39\xe9\xc5\xfcG\xee\xb1Tz\xc9\xd2" +"71\xb8\xdcH\xb9px0\xda\xec`\xc8\xd3y\xb\xba\x11 \xf7vN\xfa\xc5\x42\xcf\xfb\xcd\\" +"\x5\xf9Q\xb'\xb2SKpN\xcd\x36\xc8\xb0\x41\xfdI\xa9h\x81\x30/\xff[\x1\x63\xa2\xdd\x9" +"\xc7Q\xd6\xd6\xaf\xea\x91p\xa4\xf4\xc4\xab\x8d\x46\xe6/v?\xe1\xbd\xa5\x1d\xd1\xce" +"J'\xe7r\xf3\xa2\x86\x91U\xf7\x62\xff&\xb7\xaao\xcf\xa4\xf1).V\xf0:\xab\x63\"\xbf" +"\x86~w\x10\xc3MC\xb5\xd8[E\xaah\x1J\xd7\x87\x9e\xed\x5\x1b\x19\x33\xe4\x91In>&\xd9" +"\xaa\x8b\x80\xa0{\xf2\xb9O\x10w\xe8J\x97&\xf0\x81\x99\x88}f\xdez0{\xf3<0\xdd\x9c" +"\xf3\xda\x18\x80\x88\xc0;+\xad\x9\xa2\x17k\x11\r\xb2\xc8h\xb5=\xa9\xa6l\x85s{\xa6" +"l\x93\xc5\x8a%\x98`\xe2\x94\xad\x1\x91\xe3\xa7,s\xf4\xb\xb\xd9\x86\x99\xaa\x8\xda" +"\xf0\x35\x87\xb7\x8f\x39\x1f:C\x13\xc5\x8d\x9f)\xb5t\x9b\xdd\xcb\xf8\xa3\x17\xfd\xa0" +"\xae\xfd\x95+\xb1\x85\x45\x61\xf\xfa\xd3\xac\x14=5\x1b\x8d\xb3\xf6\x62\x93\x37^\xe" +"P#_\r\x4\x66\x93!\x81\xd3w\xed\xd3*_\xf\xfaN\"\xb5\xa0\xcbO4=\x9a~J4.\x9d\x9\xdf" +"\xf6\xc6\x97\x63\xc\xd3\x97\x18\x2\xc2w\xa5Y\xb\x8c\xa9K\xdek8DlyM\x7+\xbc\xcbrM" +"[\xc2\x8\xee\xf1\xb0\x18\xd7\x39\x37;\xb9\x10\xd6h\x88,\xaaw\x9c-h`\x81\xdej&\x6" +"A{T\xd7\xc2\xe\xe\x7fr&H\xd8\x93\xe4\xed\xba\xe8\xf0\rjm\xa3q/\x91\xae\x86\xcum\x11" +"'\xd1\x33\xab\x82\x8e\x9d\x80\x2;P\xb1\x62\xc5\xa1\xc5\xcd\xf7\xc\xcb?\xdd~\xa0`" +"\xed \x83\x8b\xe1\xe5\xc@\x94\xc9\xe7\x9e\x1a\x1\x87\xcd\xf7\x80\xca\xf4ZrYd\xf0" +"\x4%>\x3L[\xe4k\xbf\x89\xd9\x46\x31\xf1\xa3;\xaa\x35\xb8O\xa2\xa9\xd0\x84\x81\xc6" +"gA&\xcd\x96\xed\x5\xdc\xe4\x8b\xda\x6\x9d\x90-h6\xd5\xdf\xbap\x1d\xc0\xf9\x8a\x86" +">d\xf0\xe3\x12\x14]\x8d\xc0\xb7\x7f%\xb4:\xecr\x9a\x12\x43\xb4[\x8\xca\"\x8d\xd6" +"\x10\x1c\xaa*\xc5\xad\xcc\x8e\xff\x84\xa4\xca?%Av\xc2\xccq\x1e\xe6\xc2s\x83]\xf\xd3" +"R\x8e\xca*\x97k\x88\xe5\x1f\xe3G\xfd\xb6\xf\x32\x37\xb\x66\xd3\x38\x93\x1d\x65\x81" +"c\xe\xd5\x86\xf3I\xc6\x38\x96\xc\x31\xae\x42\x4\xe8\x95!\xa9n\x12\x19\xe6\x96\xb9" +"\x13\xde\xb2\xaa\xb7\xa3\xb0\"\xd0o4\xfd\xfc\xb8\x10\xa0N`\xa4\xfe\xbe(L/\x6>\n\xe9" +"\xed\xf8w\x4\x92\x1c\xcf\xa1\x93\xbd\xc9\x12\xb7G\xe1\x35p\x6\x62#\xa4\x9f\x1fn*" +"\xf0\xd4\xd6]\xa0L\xa8v\xffzF/\xfc\x9c\xb\xa2\xccT\\;\xd3m\xbev/2\xb2\xd6\xbeXg\xc5" +"\x9fG\x91\x95\xc9$@\xdc\x16P\x98\xb7N\xa5\xc3\xad\x93\xcd\xf2\xd4\x10\xb0L\x16\xbc" +"x\x1\xe7\x95oNQ\x7\x45\x7\x87\xaaY$\x93\x17\x1c\x36(\xe6\xb8\xf4\x9dO\x84)\xeb\x98" +"\xdcR\xef\x2_\x0\x13\x87\xbc\x1ap\x93\xf7\xa9\x9f\x10\xb5\xd2\xd7\xdd\x8b\xbb\x39" +";\xf6\xe5o\x8\xf4\xf7\xfa\x1a\x34?\"\rZ\x1e\xaeqh\xc7MA\xbe\x1d\xc1\xa8;\xd6[r\xb9" +"\x82\xf4\xf7\xb3O$\xf9\x7f\x9e\xc9\xa9\x10\x11\x6@1\xfa\xcf\xf2\xa1I!\xa3 $8_N\x6" +"\x1c\xd0}\x15.t\x1b\xf9qV\xd9Q\xa3\x42H\x8f\xa7\xf5\xef\x93L\xca\xd1>'S\xa0\xabz" +"\x1fV\\/\x7fk4\x9d\xf0;\xbc%\xbb\xd9r\xa9\xad\xf8\x9\xbb\\PH\xa8\xcc\xef\x92\x97" +"\xb2\xed\x33$\xd1\x88g\xf2\x93\xcc\x66\xe8\x8b:9\xd1\x7\xb6\x10\xdf\xe7\x9a;N\x83" +"\xa9m=R\xa1\x7f\xe8\xa6,\x9f\xdd'\x11\x30\x14\x83\x66\x94,\x9c\xe5uX\xd0#\xda_u\x1" +"1\x9e\xbf\xa3=\xe9\xe6\xd1\xe7m| \xdb\x8a\x9\xb6W\x83\x9d\xa9\x9f=\x81\x43\xf1\xee" +"bS\xa3)\\\x96Q\xfa\x43\x66Tx\x93\xc2\xdcz\xbc\xbfK\xb7`\x9d\xe5\xd0\x1\xe0\xa3m\x9f" +"\xfb\xe0\x1f}\x9\x3\xb3 \x8a\xe8T~._\x14\xec\x1a\xf4\xc2S\\\xa8\xf4\xea\x37\xe3\xf3" +"\xce\x17,z\x1e\x83\x8\x99[\x1c\xc2>n\x81\x19\x2\x46\xbc\xabnu[\xf8h\xd4I\xbb\x2\xa2" +"\xaa\x87\xc4L\x9c\xc0\xf5q\xad\xc7%G\xce\xec\xbe\x10K\xb2t\xb8\xac\x16\xdc\xb7]_" +"E\x8d\x35\x64\x66\xb9!\xac\xde\xea\xe3\x84\xe2\xeb\x1d\xf6\xef\x39;A\xb9t\x7f\nO" +"\xae\xb4\xaf\x19(\xd9\xado\xb7\xe0o\xdc\x62\x1eLo\xc9\x8c\xfb\x43\xf8\x85\x84\xbd" +"U\xd9\xb9|\xc9T\x90\x93\xed\xe5\x86\x91!a\x93\x11\x62\xb1\xb1\xd5-\x4\x43&\r\xab" +"\xa0*\xf2\xb4\x43!\x0\xd5PeF\x1=\xa7\x3W?\xa8\x1\x36\x85\xccy\x8c\xe5\x1\x96\x0\x93" +"\xde\xd7\x13\xff\xcc\xf8\x9c\xa2\xb9\x10\x63\x90\x19\x8c)\xa0\x8\x64\x10\x8c\xdc" +"\xc1\x98J\x8b\xabS\x91\x90(\xc0\x1b&\xec\xc7\x92^8\xcb\xe6\xcc\xa8\x97\x8e\xe2\x1c" +"+\x6\xe7\xb3\xe4\x8f\xba\x97\x8e*}\x18nV<\x8\x8f\x84\xaa#\x17\x8b`\xe4r\x9e\xe8}" +"g\xb1\x9\x1f;isgl\x1c\xbf\xe6S\xe\xb7s\xc6.,$\x97\x1J\xb0\xe8\xb7\x1a\x1fN\x86\xa3" +"x\xaa&Y\x15\x11\xbe\xe3\xcf=d\xc9HHX.\x13T\xe1`[dW\x82?,^d\n\xd3\x80)F\xbb.~\x8e" +"YN\x8c\x4\xb4\x30\xc2\x38]\xd4\x7\x46\xce\x85\x34\xf5\x8\x42\xe7Mq\x15\xf3\xdb\xc" +"r\xd1\xc9\xc6\x7\xc6W;\x9J\xebs\xb7\xa7\x98v\xcf\xfc>/\x8c\x9f\xea\xaa\x7\xd3\xbf" +"\xce\x5\xb6\x1fwI\xa8y;\xe9\xc\xcc\xec\xa2\xd7\x7\x7f%\xe8\x99\xd3\x33\x1f\xe1\x61" +"\xa7\xe8l\x84$\x95\xd5\x84\xc6\xe4\xa0\x88\xb)Q\xd8\xa1;\x88\xc4g \x80\xa0\xb1\xbe" +"6\xbfG\xc3\xac\xe7(\x8c\xfe\x41\xa8\xc1\xba\xa6\xf0\x81J\x94\x7f\xbdk:\xa7+ls\xa8" +"\xc5x\xcaQ\xcc\xc9o#R1lF{\xb9`\xe9\x81\xf2\xb6H[\xfb\x44\xb5w\xe7\x1e\xfd\xa1nt\x5" +"\x95K\xc7\xc9\xf0u\x9fZ\x9f\x1e\xbc\xd2\xfa\x9c\xc9\x64\x8dX1\xa6\x88\x87\xf4\x1b" +"\x15\x8\x1a L$\xb4\xb9\x92\xa2\x31\xde\xf9\xe6\x98\xd4\xc3\xa2[oTt\xf5\xbej`\x1f" +"-3zX\xa0\xd2\x1f\xf3\x7f\xd9\x1e\xb8m\x1ds\x88\x93\xa0:i\xf0\xcdt?a\x1c\xdf\xfei" +"\xdb,n\xd0\xe4\x61\x1dV\xf8\x3\xbb\r\xc0n\x7f\xe8Z089a'\x7\x64{\x1b\xe9\xfa\xf8\xd6" +"\x84\x12,\xa9\xe5\xcb\x8b\xde)6\xd3\xf4\xff%M1R\x9du8\xbb\xd4\xd3U9H\x9f\x9es\x16" +"\xf2\x42\x14\xb9\x96\xbc\xdc\xf1\x81\x8et\x9aq\xcf\xe\x88\x45\xaa\x1e*X\xaa\x62\xa4" +"\x8e\x2\xba\x45\x64\x62] \xaa\"\xe\xe7\x19`\x85!\xd7\xd7\xa7\xfc\xa0\xbd\x89\x4\xa4" +"\x1\x98\x19\xd3q\xf3\xf5\x9d\x46\xc1\x35N_\xc1\xa6\xe5\xf7\x9b \xcfJ\xca+\xf0\xf2" +"\xdes\xda\x19:o\x9a\xcb\xfe\xbG1\xc4\xbc\xeb\xe6\xd9o\xe8\"\x96]\xe9\x65#\"\x82\xa3" +"\xa1\x30\x36\x1f\x18\x8b:\xab\xda\x95\xa8\xa2y\r\x92@\xbe\x0\x8bjm\xe4\xbb\xfc\xad" +"\xa0[g\x86\xb9\xbb\x8e\r\xfa\xc\x30\x4:;\x7\xed\x46'~\x7\xb9\x80\x84\"\xc8\xed\x16" +"u\x8b\x9c\x39oN\xa9)\xd7ix[,\x95h\xe5p\xa8;\x98\x9b%\xce \xf\x17'\xd4\x1e+p.\x7f" +"\x88\xf1xOL\x83\xfa`\xa7N\xb2k-\xa9Q&\xe5\x8\xedQ\x9a\x61\xcc\x15\x1d\xb6\x80Oa\x82" +"l_\x86\xd8\xfa\x89\xd0nRo\xed\x97\xa0\xdb\x88\xed\xb4\x32\xff\x32\xc1\xac\xc9\xb6" +"\"\xee\xdf`\x10\x81\xaf{\x96<\x9c\xfc\x1d\x13\xe4\xa9\xc7O\xea\n\x1c\x8e=\x86S\xcd" +"\x92\xa9\x44\xd4\xcak\r0f\x19\xaf\xd5\x3Pmws-e\x14\xf6\x4\xbe\x46\x10\xc2V\x9\x31" +"\xbd\xe0\xb4\x9\x39\xbc\x1d\x12k\xe\x97\xf7*\xe1\xb4\xa9%!#\xb5Oz'\xe0\xcf\xa4\x42" +"[EFRo\xd7\x41\xcaw\x95+\x10\xd1>\n\xc2\xe3 \x6\xa9\x3\x80\x8f\xf0\xcd\x1?\x93\x62" +"8\xc7L\xc7_\xd9\x15$LV\xa8\x41/7\xf0\x13H@4v\x99P\x8do=\x7f\x32\x3\xa2[|p\x10\x7" +"\x19X,\xd5\x88Y\xe\xe3K:\xb1>%[a:m\x0\x38j\x1\x4\xcc^\xd2\xc6\x46\xf0\x9a\x88\x88" +"\x8d\x37Qe\x1dVF\xc5\"z<\x80\xe8\xda\x1b\n\x33\x11!\xdd$)\xf1\xf4w]0VM\xffG\xd0\x1b" +"\xbe,lr\xceM\x1f\xd9\xa2\x7|\x4\xd2\xb0'K\x89\x16\xf6\xa9\xd1\xa4\xa6\x96JSOG\xcf" +"$\x1dZ\x8e\x34\xb2?\x85\xbe\x9a\xcf\xfc/\xea\x96\x1f'u9\xf2\x15\xf8r\x8dg\x88\xf6" +"{\xea\xf4U\x2\x83\x9b\xcf#\xd8v<9I5/\x0\xc5y\xa9\xa4\xfc@\x8e\xc6%\xe3\x10\xda\xe6" +"\x15\x12\xdf\xe6\x84N\x82\xd3j/\x81p\x9e\x1f\x5\xb3\x8a\xe9\xc2\"\xed\x62\xc9\x61" +"\xee\x63Y<\xedz\xafs\xce.\xd3\x66w@\xc7{0\x9b\x93\xee\xfe\x1bK\xa6]HWZf\xbe\x86t" +"=\xc9\xe5\xd3\xc2\xff\x41\x8d\x11\xf7\xf2\x11\xb8n\x82~\xe1\xdf\xc3\x61>t\x98\x3" +"\xf\x7\x5\x5$Sm\x1f\x8a\x94\xdd\xb6i\x8b\xe7\xb9\x63\xc5\\\xb3\xf7Kgl\xd8\x15\xa7" +"\xb3\xdfK\x1a\xe\xa2\xbe\x1b\xb\x9a\x11\xff\xbf\xd5\xb1\xfaIf\x8a\xee\x14\x62\x93" +"\x16\xaf\x43j\x8!\xc2\xb\xee\xf7\xb3H\x8G\x93J\x99\xf6\xd8[h\xf4\xdd\xf8\x85\x9a" +"uN\x0\x94(\xaf\x89\xa9\r\x18R\xc2 \xa6\x7\xff\x8\x6\xe8\x8\x7&\xed\xc9Mi\x1d!KE!" +"\xc1G\xc4':\xeb\xdd\xbbJi~\xf1\x64H\xcd\x9b/\xc9R\x93\x30XX\xde\xcf\xd4\x6\xb8\x9b" +"\x9f?\xda\xe2\xacW\x9e\x80\xcf\x32\x1e\xba\xe5p\x1f\xb2\xf7\xca\xd8\xed\x4\xb4\xa6" +"1\x15\x88mE\xd6\x12\xfi\xae\xf1\xa2\x1d\x80\xad<-5\xd2\x89\x9f\x19\x2$+\x96\xcd\x34" +"\x9e\n\xaa\xda@\xf7\xa1\x12\x82\xb6\xb5+\xdd\x97p\x8eX\xdc^-\"\xd1\x15>_\xa3\xf3" +"\xb3\x0\xbc\xdf\xaf\x98\xde\xc2\xf4\xe3\xc8*\x1c\x85\xf9\x85s_9\x87OUuy\xf4\"\x66" +"N\x7\xcb\xe1\x9d\xa6\x80\xef\xb0\xfc\x82\xc3#\xec\\\x46\x44\xc5\x17\x9\xac\x8dgF" +"\x8\xa8\x4<\x91\xe6\xc7\x98\x8d\x43\xf\x10\xbal\xe1\xfc\x7f\xc0`O\xcd\x8fr8\x95%" +"\n\xec\x36\xcc\x35\xb3\xfa\x14\xfe*\r$\x9]\xcc\x30\xb2\x9?\"\x98\xf5\xf0\xa9vv\xa0" +"\xbe\x66\xc3\xdc\x9a\xda\xcf\xe2\xfc\xfr\x1a \xe9\x45\xaf\xc1\x9ja\x90u\xd5\xe9\xa2" +"d\xc7\x96\xecl\x90\xef\x1a\xee\xa8\xdc\x8\x9b\x44\xff\xc1='\xcb#p\x7\nR\xd4\x41l" +"S\xf3\x64\x39>F\xed\xd7\xed\xe0\x7\x99\x96\xc\xe6\xe0\xd5~I\x9\xe8\x8a\xdd\x64\xbd" +"\xd2\xb0\xeb\xe2\xd7?\xa6\xac\xf8\xb4\x2\x80\xda\xa0\x63~p\\e\xaa\xbdR;\x88\x15\xf2" +"/#\xe9\xff\x81\xe7\x82\x9c~K\xc9\x80\xc9\x14:\xeb\xe1\xa0M\xc0\xd2S9k\xbbrh\xbdZ" +"\xee\xa3V\xb6\x10\xd5\xdc\xee\x3\x13^\x0\xae\x34\x38\x82Q\xf3\x17\x14\xa1\xc4\xe" +"\x18&R\xc4\x8c\xda\"\x11\xa2,\xb6\xf0$\x90\xe6\x9a\x44\xce\xcb\x16\x97T\xc5;\x16" +"\x2\x8d\x35.\x1\x19\xf5\xd5\xfa\xe0\xbd~\xa1\xcd\xa6G\x12\xa6\x14st\xb6\x42\x44\xe2" +"\x1e\x9e\xc9\xf0\xd1\x38\x1a\xd2-[b\x12\xb2l?\x9a\xa5\xf6\x4_%\xdd\x9f^\xb4H\x9e" +"\xa3\x9b\x19\x45\x33\x1a\xc7\x5\x10\xc5u%W\xde!\xd0\xa6\xcf\xc1\xeb\x10\xa9\x8f\xa8" +"g\xb7m\xa6\xe4$\x94i\xf5\x91\xfd\x15M9\xe8\x93\x64\xa4=\xb0\x7\xaa\rz\x91\x1c\xfa" +"\xe6\xce+Uy\x97\xfb\xc4OU\xa2\x7f\x62+\xd7\xb8\xb1\xe\xc9\xf5\xd1\xf&I\xa6\x46\xfd" +"\x96J\xe1\xb1\x11\xb3[F\xa2R\xc4\xde\xe4Nt&\xebW9\xf2N\x8a\x39\x6\x94Y}\xb3\xa1\xfe" +"x\x0\xc9~YU\x83\"\xf0\xe4\x9a\xc\xce*\xd9K\x1e-\x10&\xaf\xa7qr>?R9\x16\xf5^\xd8\x66" +"\xc9\xfbJ/u\x96Q\xc6\x13\xa2\xcf\xf3\x62\x2\x8c\xdf\x9d\x38\xf0]L|`$\xc5\x33\xe9" +"0\xb6K\x9\x9f\xb1\xaf\x4\xb0\x1f_\xb9\xcahg\xe6\xef\xf5Zw,S\x91\x83\x10Y\x98~\x10" +"\xcb\xf9\x87\xe3\xf3x\xe0\x13)\xf7=T\xdc\x4\x84\x17}<<\x6\xf6s\x97\x95_\xf1\xcaN" +"\xf8\xad\x16\x6\xb7\x4U%]c\x1a}n\xb9+\xfd\xba\x14\xa0\xff(\xb2\xac\xe7\xe8\x1a\xd6" +"f\xea\x9b:\xfZk\xa3\xb5\xdf\xe3PD\xfaK=\x8e\xd9V\x0\x9c`\xe9\x8c\xc1\x32\xf2\xe8" +"Ig\xf4\xa9\x8ag\xb3\x36\xd5\xee|\xaf}\xd1\xf7M\x1f\xa0\x86\x19\x94\x13\x61\xfas\x12" +"\xcf\"]\x89\xce\xf9~\x86L\x83i\xea\xfa\xb9M\x97\xf0VU\x5\xd8%\x97+uOg)Yn\xea\x91" +"!\xbu\xdd\x8f\x64S\x82\xac\xe3m\xe6\x8\x19\xa0+;H\xdd\x0\xf5H_\x92\x64\xf9\xfa\x92" +"ms.,&{\xb\xe8\xca\x98Ro\x12O\x97\xef\xdb\x86\x13,^\xf1k\x10\x39\x8\x17/\xc5\x1f(" +"o\xfe\x45\xff%\x35\x12\xe0\x3?\x3\x7f\xf1\x82\xbaSj\x9e\xb2\xdf-\x1d\xb2W\xd9\xc8" +"lF\xe1\xb0\x2\xfb\x32\xacp\xca\x94\x62\xe6\xebH\x99GR\xce\xbc\xe3\x9f\x8\xab\xd4" +"\xf4\xb0\x88\x92\x83\xe5U\x0p!\x85\xa8\x41\xe3(\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30" +"000000000000000000000000000000000000000000000000000000000000\r000000000000000000" +"0000000000000000000000000000000000000000000000\r00000000000000000000000000000000" +"00000000000000000000000000000000\r0000000000000000000000000000000000000000000000" +"000000000000000000\r000000000000000000000000000000000000000000000000000000000000" +"0000\r0000000000000000000000000000000000000000000000000000000000000000\r00000000" +"00000000000000000000000000000000000000000000000000000000\r0000000000000000000000" +"000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n022004l_afm_len = 31779; +char* n022004l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusMonL-Bold\n" +"FullName Nimbus Mono L Bold\nFamilyName Nimbus Mono L\nWeight Bold\nItalicAngle " +"0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThickness 50\nVersion " +"1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncodingSch" +"eme AdobeStandardEncoding\nFontBBox -43 -278 681 871\nCapHeight 583\nXHeight 437" +"\nDescender -205\nAscender 624\nStartCharMetrics 316\nC 32 ; WX 600 ; N space ; " +"B 375 0 375 0 ;\nC 33 ; WX 600 ; N exclam ; B 220 -15 381 638 ;\nC 34 ; WX 600 ;" +" N quotedbl ; B 136 312 464 602 ;\nC 35 ; WX 600 ; N numbersign ; B 62 -92 538 6" +"75 ;\nC 36 ; WX 600 ; N dollar ; B 83 -123 517 684 ;\nC 37 ; WX 600 ; N percent " +"; B 80 -15 521 617 ;\nC 38 ; WX 600 ; N ampersand ; B 75 -14 508 550 ;\nC 39 ; W" +"X 600 ; N quoteright ; B 147 331 351 623 ;\nC 40 ; WX 600 ; N parenleft ; B 264 " +"-153 488 632 ;\nC 41 ; WX 600 ; N parenright ; B 117 -153 341 632 ;\nC 42 ; WX 6" +"00 ; N asterisk ; B 83 208 517 622 ;\nC 43 ; WX 600 ; N plus ; B 42 0 558 560 ;\n" +"C 44 ; WX 600 ; N comma ; B 147 -158 351 134 ;\nC 45 ; WX 600 ; N hyphen ; B 42 " +"229 558 329 ;\nC 46 ; WX 600 ; N period ; B 225 -15 375 117 ;\nC 47 ; WX 600 ; N" +" slash ; B 83 -113 517 695 ;\nC 48 ; WX 600 ; N zero ; B 83 -15 517 638 ;\nC 49 " +"; WX 600 ; N one ; B 83 0 517 638 ;\nC 50 ; WX 600 ; N two ; B 54 0 508 638 ;\nC" +" 51 ; WX 600 ; N three ; B 66 -15 529 638 ;\nC 52 ; WX 600 ; N four ; B 75 0 508" +" 622 ;\nC 53 ; WX 600 ; N five ; B 66 -15 529 622 ;\nC 54 ; WX 600 ; N six ; B 1" +"05 -15 540 638 ;\nC 55 ; WX 600 ; N seven ; B 75 -1 508 622 ;\nC 56 ; WX 600 ; N" +" eight ; B 83 -15 517 638 ;\nC 57 ; WX 600 ; N nine ; B 106 -15 541 638 ;\nC 58 " +"; WX 600 ; N colon ; B 225 -15 375 437 ;\nC 59 ; WX 600 ; N semicolon ; B 147 -1" +"58 351 437 ;\nC 60 ; WX 600 ; N less ; B 42 54 544 501 ;\nC 61 ; WX 600 ; N equa" +"l ; B 42 138 558 422 ;\nC 62 ; WX 600 ; N greater ; B 56 53 558 500 ;\nC 63 ; WX" +" 600 ; N question ; B 104 -15 517 598 ;\nC 64 ; WX 600 ; N at ; B 76 -152 509 62" +"0 ;\nC 65 ; WX 600 ; N A ; B -21 0 621 583 ;\nC 66 ; WX 600 ; N B ; B 13 0 571 5" +"83 ;\nC 67 ; WX 600 ; N C ; B 33 -14 564 597 ;\nC 68 ; WX 600 ; N D ; B 13 0 550" +" 583 ;\nC 69 ; WX 600 ; N E ; B 13 0 550 583 ;\nC 70 ; WX 600 ; N F ; B 13 0 550" +" 583 ;\nC 71 ; WX 600 ; N G ; B 33 -14 592 597 ;\nC 72 ; WX 600 ; N H ; B 23 0 5" +"81 583 ;\nC 73 ; WX 600 ; N I ; B 83 0 517 583 ;\nC 74 ; WX 600 ; N J ; B 54 -14" +" 613 583 ;\nC 75 ; WX 600 ; N K ; B 13 0 602 583 ;\nC 76 ; WX 600 ; N L ; B 33 0" +" 571 583 ;\nC 77 ; WX 600 ; N M ; B -19 0 623 584 ;\nC 78 ; WX 600 ; N N ; B -8 " +"0 592 583 ;\nC 79 ; WX 600 ; N O ; B 21 -14 579 597 ;\nC 80 ; WX 600 ; N P ; B 1" +"3 0 529 583 ;\nC 81 ; WX 600 ; N Q ; B 21 -145 579 597 ;\nC 82 ; WX 600 ; N R ; " +"B 13 0 619 583 ;\nC 83 ; WX 600 ; N S ; B 62 -14 538 597 ;\nC 84 ; WX 600 ; N T " +"; B 42 0 558 583 ;\nC 85 ; WX 600 ; N U ; B 10 -14 590 583 ;\nC 86 ; WX 600 ; N " +"V ; B -21 0 621 583 ;\nC 87 ; WX 600 ; N W ; B -10 0 610 583 ;\nC 88 ; WX 600 ; " +"N X ; B 10 0 590 583 ;\nC 89 ; WX 600 ; N Y ; B 21 0 579 583 ;\nC 90 ; WX 600 ; " +"N Z ; B 73 0 527 583 ;\nC 91 ; WX 600 ; N bracketleft ; B 250 -148 475 627 ;\nC " +"92 ; WX 600 ; N backslash ; B 83 -113 517 695 ;\nC 93 ; WX 600 ; N bracketright " +"; B 125 -148 350 627 ;\nC 94 ; WX 600 ; N asciicircum ; B 83 325 517 652 ;\nC 95" +" ; WX 600 ; N underscore ; B -12 -125 612 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B" +" 249 348 453 602 ;\nC 97 ; WX 600 ; N a ; B 42 -16 571 450 ;\nC 98 ; WX 600 ; N " +"b ; B -8 -14 571 624 ;\nC 99 ; WX 600 ; N c ; B 54 -16 565 450 ;\nC 100 ; WX 600" +" ; N d ; B 33 -14 613 624 ;\nC 101 ; WX 600 ; N e ; B 33 -16 550 450 ;\nC 102 ; " +"WX 600 ; N f ; B 75 0 571 623 ;\nC 103 ; WX 600 ; N g ; B 33 -205 592 451 ;\nC 1" +"04 ; WX 600 ; N h ; B 13 0 581 624 ;\nC 105 ; WX 600 ; N i ; B 62 0 538 623 ;\nC" +" 106 ; WX 600 ; N j ; B 117 -205 488 623 ;\nC 107 ; WX 600 ; N k ; B 33 0 571 62" +"4 ;\nC 108 ; WX 600 ; N l ; B 62 0 538 624 ;\nC 109 ; WX 600 ; N m ; B -19 0 623" +" 450 ;\nC 110 ; WX 600 ; N n ; B 23 0 571 450 ;\nC 111 ; WX 600 ; N o ; B 42 -16" +" 558 450 ;\nC 112 ; WX 600 ; N p ; B -8 -205 571 450 ;\nC 113 ; WX 600 ; N q ; B" +" 33 -205 613 450 ;\nC 114 ; WX 600 ; N r ; B 54 0 571 449 ;\nC 115 ; WX 600 ; N " +"s ; B 73 -16 527 450 ;\nC 116 ; WX 600 ; N t ; B 13 -16 529 591 ;\nC 117 ; WX 60" +"0 ; N u ; B 13 -13 571 437 ;\nC 118 ; WX 600 ; N v ; B 0 0 600 437 ;\nC 119 ; WX" +" 600 ; N w ; B 0 0 600 437 ;\nC 120 ; WX 600 ; N x ; B 21 0 579 437 ;\nC 121 ; W" +"X 600 ; N y ; B 21 -205 579 437 ;\nC 122 ; WX 600 ; N z ; B 85 0 519 437 ;\nC 12" +"3 ; WX 600 ; N braceleft ; B 167 -153 433 623 ;\nC 124 ; WX 600 ; N bar ; B 250 " +"-153 350 622 ;\nC 125 ; WX 600 ; N braceright ; B 167 -153 433 623 ;\nC 126 ; WX" +" 600 ; N asciitilde ; B 62 179 538 385 ;\nC 161 ; WX 600 ; N exclamdown ; B 220 " +"-227 381 426 ;\nC 162 ; WX 600 ; N cent ; B 83 -44 499 661 ;\nC 163 ; WX 600 ; N" +" sterling ; B 33 0 550 598 ;\nC 164 ; WX 600 ; N fraction ; B 21 102 580 500 ;\n" +"C 165 ; WX 600 ; N yen ; B 21 0 579 580 ;\nC 166 ; WX 600 ; N florin ; B 57 -123" +" 548 638 ;\nC 167 ; WX 600 ; N section ; B 36 -170 564 583 ;\nC 168 ; WX 600 ; N" +" currency ; B 73 64 527 519 ;\nC 169 ; WX 600 ; N quotesingle ; B 236 312 364 60" +"2 ;\nC 170 ; WX 600 ; N quotedblleft ; B 98 348 502 602 ;\nC 171 ; WX 600 ; N gu" +"illemotleft ; B 33 20 571 415 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 33 20 342 " +"415 ;\nC 173 ; WX 600 ; N guilsinglright ; B 263 20 571 415 ;\nC 174 ; WX 600 ; " +"N fi ; B -14 0 619 624 ;\nC 175 ; WX 600 ; N fl ; B -17 0 617 623 ;\nC 177 ; WX " +"600 ; N endash ; B 42 229 558 329 ;\nC 178 ; WX 600 ; N dagger ; B 94 -92 506 62" +"2 ;\nC 179 ; WX 600 ; N daggerdbl ; B 94 -92 506 622 ;\nC 180 ; WX 600 ; N perio" +"dcentered ; B 225 214 375 346 ;\nC 182 ; WX 600 ; N paragraph ; B 49 -174 558 58" +"3 ;\nC 183 ; WX 600 ; N bullet ; B 150 154 449 453 ;\nC 184 ; WX 600 ; N quotesi" +"nglbase ; B 147 -158 351 134 ;\nC 185 ; WX 600 ; N quotedblbase ; B 87 -120 491 " +"134 ;\nC 186 ; WX 600 ; N quotedblright ; B 87 348 491 602 ;\nC 187 ; WX 600 ; N" +" guillemotright ; B 33 20 571 415 ;\nC 188 ; WX 600 ; N ellipsis ; B 25 -15 575 " +"117 ;\nC 189 ; WX 600 ; N perthousand ; B 0 0 600 618 ;\nC 191 ; WX 600 ; N ques" +"tiondown ; B 83 -227 496 386 ;\nC 193 ; WX 600 ; N grave ; B 125 496 350 696 ;\n" +"C 194 ; WX 600 ; N acute ; B 250 496 475 696 ;\nC 195 ; WX 600 ; N circumflex ; " +"B 125 497 476 696 ;\nC 196 ; WX 600 ; N tilde ; B 115 523 485 656 ;\nC 197 ; WX " +"600 ; N macron ; B 125 546 475 626 ;\nC 198 ; WX 600 ; N breve ; B 125 503 475 6" +"87 ;\nC 199 ; WX 600 ; N dotaccent ; B 240 534 360 654 ;\nC 200 ; WX 600 ; N die" +"resis ; B 136 534 464 654 ;\nC 202 ; WX 600 ; N ring ; B 177 486 423 727 ;\nC 20" +"3 ; WX 600 ; N cedilla ; B 180 -229 407 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B" +" 125 496 475 694 ;\nC 206 ; WX 600 ; N ogonek ; B 250 -208 463 0 ;\nC 207 ; WX 6" +"00 ; N caron ; B 125 497 476 696 ;\nC 208 ; WX 600 ; N emdash ; B -29 229 629 32" +"9 ;\nC 225 ; WX 600 ; N AE ; B -20 0 614 583 ;\nC 227 ; WX 600 ; N ordfeminine ;" +" B 118 182 489 595 ;\nC 232 ; WX 600 ; N Lslash ; B 12 0 571 583 ;\nC 233 ; WX 6" +"00 ; N Oslash ; B 9 -70 590 638 ;\nC 234 ; WX 600 ; N OE ; B -20 0 612 583 ;\nC " +"235 ; WX 600 ; N ordmasculine ; B 122 182 480 595 ;\nC 241 ; WX 600 ; N ae ; B -" +"13 -16 612 450 ;\nC 245 ; WX 600 ; N dotlessi ; B 62 0 538 437 ;\nC 248 ; WX 600" +" ; N lslash ; B 62 0 538 624 ;\nC 249 ; WX 600 ; N oslash ; B 23 -70 573 494 ;\n" +"C 250 ; WX 600 ; N oe ; B -11 -16 613 450 ;\nC 251 ; WX 600 ; N germandbls ; B 1" +"3 -16 529 623 ;\nC -1 ; WX 600 ; N Udieresis ; B 10 -14 590 798 ;\nC -1 ; WX 600" +" ; N Uacute ; B 10 -14 590 839 ;\nC -1 ; WX 600 ; N Scedilla ; B 62 -229 538 597" +" ;\nC -1 ; WX 600 ; N Tcaron ; B 42 0 558 839 ;\nC -1 ; WX 600 ; N Scaron ; B 62" +" -14 538 839 ;\nC -1 ; WX 600 ; N Rcaron ; B 13 0 619 839 ;\nC -1 ; WX 600 ; N R" +"acute ; B 13 0 619 839 ;\nC -1 ; WX 600 ; N Sacute ; B 62 -14 538 839 ;\nC -1 ; " +"WX 600 ; N Otilde ; B 21 -14 579 799 ;\nC -1 ; WX 600 ; N ucircumflex ; B 13 -13" +" 571 696 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 21 -14 579 838 ;\nC -1 ; WX 600 " +"; N Uhungarumlaut ; B 10 -14 590 838 ;\nC -1 ; WX 600 ; N Yacute ; B 21 0 579 83" +"9 ;\nC -1 ; WX 600 ; N Eth ; B 0 0 550 583 ;\nC -1 ; WX 600 ; N Dcroat ; B 0 0 5" +"50 583 ;\nC -1 ; WX 600 ; N Zacute ; B 73 0 527 839 ;\nC -1 ; WX 600 ; N Uring ;" +" B 10 -14 590 871 ;\nC -1 ; WX 600 ; N gbreve ; B 33 -205 592 687 ;\nC -1 ; WX 6" +"00 ; N eogonek ; B 33 -208 550 450 ;\nC -1 ; WX 600 ; N edotaccent ; B 33 -16 55" +"0 654 ;\nC -1 ; WX 600 ; N ecaron ; B 33 -16 550 696 ;\nC -1 ; WX 600 ; N Ugrave" +" ; B 10 -14 590 839 ;\nC -1 ; WX 600 ; N Thorn ; B 14 0 523 583 ;\nC -1 ; WX 600" +" ; N eacute ; B 33 -16 550 696 ;\nC -1 ; WX 600 ; N edieresis ; B 33 -16 550 654" +" ;\nC -1 ; WX 600 ; N dcaron ; B 33 -14 681 637 ;\nC -1 ; WX 600 ; N ccedilla ; " +"B 54 -229 565 450 ;\nC -1 ; WX 600 ; N ccaron ; B 54 -16 565 696 ;\nC -1 ; WX 60" +"0 ; N cacute ; B 54 -16 565 696 ;\nC -1 ; WX 600 ; N aogonek ; B 42 -208 580 450" +" ;\nC -1 ; WX 600 ; N aring ; B 42 -16 571 727 ;\nC -1 ; WX 600 ; N atilde ; B 4" +"2 -16 571 656 ;\nC -1 ; WX 600 ; N abreve ; B 42 -16 571 687 ;\nC -1 ; WX 600 ; " +"N egrave ; B 33 -16 550 696 ;\nC -1 ; WX 600 ; N agrave ; B 42 -16 571 696 ;\nC " +"-1 ; WX 600 ; N aacute ; B 42 -16 571 696 ;\nC -1 ; WX 600 ; N adieresis ; B 42 " +"-16 571 654 ;\nC -1 ; WX 600 ; N Uogonek ; B 10 -208 590 583 ;\nC -1 ; WX 600 ; " +"N ugrave ; B 13 -13 571 696 ;\nC -1 ; WX 600 ; N uacute ; B 13 -13 571 696 ;\nC " +"-1 ; WX 600 ; N udieresis ; B 13 -13 571 654 ;\nC -1 ; WX 600 ; N tcaron ; B 13 " +"-16 530 637 ;\nC -1 ; WX 600 ; N scommaaccent ; B 73 -278 527 450 ;\nC -1 ; WX 6" +"00 ; N Zcaron ; B 73 0 527 839 ;\nC -1 ; WX 600 ; N ecircumflex ; B 33 -16 550 6" +"96 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 10 -14 590 839 ;\nC -1 ; WX 600 ; N acir" +"cumflex ; B 42 -16 571 696 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 73 0 527 798 ;\nC" +" -1 ; WX 600 ; N scaron ; B 73 -16 527 696 ;\nC -1 ; WX 600 ; N Amacron ; B -21 " +"0 621 769 ;\nC -1 ; WX 600 ; N sacute ; B 73 -16 527 696 ;\nC -1 ; WX 600 ; N Tc" +"ommaaccent ; B 42 -278 558 583 ;\nC -1 ; WX 600 ; N Ydieresis ; B 21 0 579 798 ;" +"\nC -1 ; WX 600 ; N thorn ; B -8 -205 571 624 ;\nC -1 ; WX 600 ; N Emacron ; B 1" +"3 0 550 769 ;\nC -1 ; WX 600 ; N Ograve ; B 21 -14 579 839 ;\nC -1 ; WX 600 ; N " +"Oacute ; B 21 -14 579 839 ;\nC -1 ; WX 600 ; N Odieresis ; B 21 -14 579 798 ;\nC" +" -1 ; WX 600 ; N Ntilde ; B -8 0 592 799 ;\nC -1 ; WX 600 ; N Ncaron ; B -8 0 59" +"2 839 ;\nC -1 ; WX 600 ; N Nacute ; B -8 0 592 839 ;\nC -1 ; WX 600 ; N Lcaron ;" +" B 33 0 571 598 ;\nC -1 ; WX 600 ; N Lacute ; B 33 0 571 839 ;\nC -1 ; WX 600 ; " +"N Idotaccent ; B 83 0 517 798 ;\nC -1 ; WX 600 ; N racute ; B 54 0 571 696 ;\nC " +"-1 ; WX 600 ; N Icircumflex ; B 83 0 517 839 ;\nC -1 ; WX 600 ; N ohungarumlaut " +"; B 42 -16 558 694 ;\nC -1 ; WX 600 ; N otilde ; B 42 -16 558 656 ;\nC -1 ; WX 6" +"00 ; N Euro ; B 4 -14 538 597 ;\nC -1 ; WX 600 ; N ocircumflex ; B 42 -16 558 69" +"6 ;\nC -1 ; WX 600 ; N onesuperior ; B 166 247 434 638 ;\nC -1 ; WX 600 ; N twos" +"uperior ; B 149 247 429 637 ;\nC -1 ; WX 600 ; N threesuperior ; B 157 238 442 6" +"37 ;\nC -1 ; WX 600 ; N Igrave ; B 83 0 517 839 ;\nC -1 ; WX 600 ; N Iacute ; B " +"83 0 517 839 ;\nC -1 ; WX 600 ; N Imacron ; B 83 0 517 769 ;\nC -1 ; WX 600 ; N " +"Iogonek ; B 83 -208 517 583 ;\nC -1 ; WX 600 ; N Idieresis ; B 83 0 517 798 ;\nC" +" -1 ; WX 600 ; N Gbreve ; B 33 -14 592 831 ;\nC -1 ; WX 600 ; N Umacron ; B 10 -" +"14 590 769 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 13 -278 602 583 ;\nC -1 ; WX 60" +"0 ; N ograve ; B 42 -16 558 696 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 62 -278 53" +"8 597 ;\nC -1 ; WX 600 ; N Eogonek ; B 13 -208 587 583 ;\nC -1 ; WX 600 ; N oacu" +"te ; B 42 -16 558 696 ;\nC -1 ; WX 600 ; N Edotaccent ; B 13 0 550 798 ;\nC -1 ;" +" WX 600 ; N iogonek ; B 62 -208 540 623 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 33" +" -205 592 721 ;\nC -1 ; WX 600 ; N odieresis ; B 42 -16 558 654 ;\nC -1 ; WX 600" +" ; N ntilde ; B 23 0 571 656 ;\nC -1 ; WX 600 ; N ncaron ; B 23 0 571 696 ;\nC -" +"1 ; WX 600 ; N Ecaron ; B 13 0 550 839 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 13 0" +" 550 839 ;\nC -1 ; WX 600 ; N scedilla ; B 73 -229 527 450 ;\nC -1 ; WX 600 ; N " +"rcaron ; B 54 0 571 696 ;\nC -1 ; WX 600 ; N Egrave ; B 13 0 550 839 ;\nC -1 ; W" +"X 600 ; N Eacute ; B 13 0 550 839 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 33 -278 " +"592 597 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 13 -278 619 583 ;\nC -1 ; WX 600 ;" +" N Edieresis ; B 13 0 550 798 ;\nC -1 ; WX 600 ; N nacute ; B 23 0 571 696 ;\nC " +"-1 ; WX 600 ; N uogonek ; B 13 -208 571 437 ;\nC -1 ; WX 600 ; N umacron ; B 13 " +"-13 571 626 ;\nC -1 ; WX 600 ; N Dcaron ; B 13 0 550 839 ;\nC -1 ; WX 600 ; N lc" +"aron ; B 62 0 538 637 ;\nC -1 ; WX 600 ; N Ccaron ; B 33 -14 564 839 ;\nC -1 ; W" +"X 600 ; N Cacute ; B 33 -14 564 839 ;\nC -1 ; WX 600 ; N Ccedilla ; B 33 -229 56" +"4 597 ;\nC -1 ; WX 600 ; N degree ; B 125 243 475 596 ;\nC -1 ; WX 600 ; N Aogon" +"ek ; B -21 -208 621 583 ;\nC -1 ; WX 600 ; N minus ; B 42 230 558 330 ;\nC -1 ; " +"WX 600 ; N multiply ; B 100 80 500 480 ;\nC -1 ; WX 600 ; N divide ; B 42 28 558" +" 532 ;\nC -1 ; WX 600 ; N Aring ; B -21 0 621 871 ;\nC -1 ; WX 600 ; N trademark" +" ; B -33 220 620 583 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 54 -278 571 449 ;\nC " +"-1 ; WX 600 ; N lacute ; B 62 0 538 840 ;\nC -1 ; WX 600 ; N omacron ; B 42 -16 " +"558 626 ;\nC -1 ; WX 600 ; N Atilde ; B -21 0 621 799 ;\nC -1 ; WX 600 ; N icirc" +"umflex ; B 62 0 538 696 ;\nC -1 ; WX 600 ; N igrave ; B 62 0 538 696 ;\nC -1 ; W" +"X 600 ; N ncommaaccent ; B 23 -278 571 450 ;\nC -1 ; WX 600 ; N lcommaaccent ; B" +" 62 -278 538 624 ;\nC -1 ; WX 600 ; N plusminus ; B 42 0 558 624 ;\nC -1 ; WX 60" +"0 ; N onehalf ; B -34 0 629 638 ;\nC -1 ; WX 600 ; N onequarter ; B -34 0 629 63" +"8 ;\nC -1 ; WX 600 ; N threequarters ; B -43 0 630 637 ;\nC -1 ; WX 600 ; N iacu" +"te ; B 62 0 538 696 ;\nC -1 ; WX 600 ; N Abreve ; B -21 0 621 831 ;\nC -1 ; WX 6" +"00 ; N kcommaaccent ; B 33 -278 571 624 ;\nC -1 ; WX 600 ; N Omacron ; B 21 -14 " +"579 769 ;\nC -1 ; WX 600 ; N imacron ; B 62 0 538 626 ;\nC -1 ; WX 600 ; N emacr" +"on ; B 33 -16 550 626 ;\nC -1 ; WX 600 ; N amacron ; B 42 -16 571 626 ;\nC -1 ; " +"WX 600 ; N tcommaaccent ; B 13 -278 529 591 ;\nC -1 ; WX 600 ; N ydieresis ; B 2" +"1 -205 579 654 ;\nC -1 ; WX 600 ; N zdotaccent ; B 85 0 519 654 ;\nC -1 ; WX 600" +" ; N zcaron ; B 85 0 519 696 ;\nC -1 ; WX 600 ; N zacute ; B 85 0 519 696 ;\nC -" +"1 ; WX 600 ; N yacute ; B 21 -205 579 696 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B" +" 13 -13 571 694 ;\nC -1 ; WX 600 ; N eth ; B 42 -16 558 646 ;\nC -1 ; WX 600 ; N" +" uring ; B 13 -13 571 727 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 21 -14 579 839 ;\n" +"C -1 ; WX 600 ; N commaaccent ; B 183 -278 351 -59 ;\nC -1 ; WX 600 ; N copyrigh" +"t ; B -7 -15 606 598 ;\nC -1 ; WX 600 ; N registered ; B -7 -15 606 598 ;\nC -1 " +"; WX 600 ; N Acircumflex ; B -21 0 621 839 ;\nC -1 ; WX 600 ; N idieresis ; B 62" +" 0 538 654 ;\nC -1 ; WX 600 ; N lozenge ; B 72 -19 529 593 ;\nC -1 ; WX 600 ; N " +"Delta ; B 15 0 585 583 ;\nC -1 ; WX 600 ; N notequal ; B 42 22 558 525 ;\nC -1 ;" +" WX 600 ; N radical ; B 12 -60 642 697 ;\nC -1 ; WX 600 ; N Agrave ; B -21 0 621" +" 839 ;\nC -1 ; WX 600 ; N Aacute ; B -21 0 621 839 ;\nC -1 ; WX 600 ; N lessequa" +"l ; B 3 0 549 591 ;\nC -1 ; WX 600 ; N greaterequal ; B 35 0 582 591 ;\nC -1 ; W" +"X 600 ; N logicalnot ; B 42 115 465 445 ;\nC -1 ; WX 600 ; N summation ; B 45 -9" +"7 538 671 ;\nC -1 ; WX 600 ; N partialdiff ; B 102 -16 524 590 ;\nC -1 ; WX 600 " +"; N Ncommaaccent ; B -8 -278 592 583 ;\nC -1 ; WX 600 ; N dcroat ; B 33 -16 613 " +"624 ;\nC -1 ; WX 600 ; N brokenbar ; B 250 -153 350 622 ;\nC -1 ; WX 600 ; N Lco" +"mmaaccent ; B 33 -278 571 583 ;\nC -1 ; WX 600 ; N Adieresis ; B -21 0 621 798 ;" +"\nC -1 ; WX 600 ; N mu ; B 13 -153 571 437 ;\nC -1 ; WX 600 ; N .notdef ; B 375 " +"0 375 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 998\nKPX A C -14\nKPX A" +" Ccedilla -22\nKPX A G -10\nKPX A O -15\nKPX A Odieresis -15\nKPX A Q -16\nKPX A" +" T -27\nKPX A U -23\nKPX A Uacute -23\nKPX A Ucircumflex -23\nKPX A Udieresis -2" +"3\nKPX A Ugrave -23\nKPX A V -59\nKPX A W -13\nKPX A Y -27\nKPX A a 15\nKPX A b " +"45\nKPX A c -4\nKPX A ccedilla -8\nKPX A comma -47\nKPX A d 4\nKPX A e 2\nKPX A " +"g 0\nKPX A guillemotleft -40\nKPX A guilsinglleft -40\nKPX A hyphen -19\nKPX A o" +" -3\nKPX A period -62\nKPX A q -4\nKPX A quotedblright -84\nKPX A quoteright -11" +"3\nKPX A t -20\nKPX A u -12\nKPX A v -39\nKPX A w -13\nKPX A y -39\nKPX Aacute C" +" -14\nKPX Aacute G -10\nKPX Aacute O -15\nKPX Aacute Q -16\nKPX Aacute T -27\nKP" +"X Aacute U -23\nKPX Aacute V -59\nKPX Aacute W -13\nKPX Aacute Y -27\nKPX Aacute" +" a 15\nKPX Aacute b 45\nKPX Aacute c -4\nKPX Aacute comma -47\nKPX Aacute d 4\nK" +"PX Aacute e 2\nKPX Aacute g 0\nKPX Aacute guillemotleft -40\nKPX Aacute guilsing" +"lleft -40\nKPX Aacute hyphen -19\nKPX Aacute o -3\nKPX Aacute period -62\nKPX Aa" +"cute q -4\nKPX Aacute quoteright -113\nKPX Aacute t -20\nKPX Aacute u -12\nKPX A" +"acute v -39\nKPX Aacute w -13\nKPX Aacute y -39\nKPX Acircumflex C -14\nKPX Acir" +"cumflex G -10\nKPX Acircumflex O -15\nKPX Acircumflex Q -16\nKPX Acircumflex T -" +"27\nKPX Acircumflex U -23\nKPX Acircumflex V -59\nKPX Acircumflex W -13\nKPX Aci" +"rcumflex Y -27\nKPX Acircumflex comma -47\nKPX Acircumflex period -62\nKPX Adier" +"esis C -14\nKPX Adieresis G -10\nKPX Adieresis O -15\nKPX Adieresis Q -16\nKPX A" +"dieresis T -27\nKPX Adieresis U -23\nKPX Adieresis V -59\nKPX Adieresis W -13\nK" +"PX Adieresis Y -27\nKPX Adieresis a 15\nKPX Adieresis b 45\nKPX Adieresis c -4\n" +"KPX Adieresis comma -47\nKPX Adieresis d 4\nKPX Adieresis g 0\nKPX Adieresis gui" +"llemotleft -40\nKPX Adieresis guilsinglleft -40\nKPX Adieresis hyphen -19\nKPX A" +"dieresis o -3\nKPX Adieresis period -62\nKPX Adieresis q -4\nKPX Adieresis quote" +"dblright -84\nKPX Adieresis quoteright -113\nKPX Adieresis t -20\nKPX Adieresis " +"u -12\nKPX Adieresis v -39\nKPX Adieresis w -13\nKPX Adieresis y -39\nKPX Agrave" +" C -14\nKPX Agrave G -10\nKPX Agrave O -15\nKPX Agrave Q -16\nKPX Agrave T -27\n" +"KPX Agrave U -23\nKPX Agrave V -59\nKPX Agrave W -13\nKPX Agrave Y -27\nKPX Agra" +"ve comma -47\nKPX Agrave period -62\nKPX Aring C -14\nKPX Aring G -10\nKPX Aring" +" O -15\nKPX Aring Q -16\nKPX Aring T -27\nKPX Aring U -23\nKPX Aring V -59\nKPX " +"Aring W -13\nKPX Aring Y -27\nKPX Aring a 15\nKPX Aring b 45\nKPX Aring c -4\nKP" +"X Aring comma -47\nKPX Aring d 4\nKPX Aring e 2\nKPX Aring g 0\nKPX Aring guille" +"motleft -40\nKPX Aring guilsinglleft -40\nKPX Aring hyphen -19\nKPX Aring o -3\n" +"KPX Aring period -62\nKPX Aring q -4\nKPX Aring quotedblright -84\nKPX Aring quo" +"teright -113\nKPX Aring t -20\nKPX Aring u -12\nKPX Aring v -39\nKPX Aring w -13" +"\nKPX Aring y -39\nKPX Atilde C -14\nKPX Atilde G -10\nKPX Atilde O -15\nKPX Ati" +"lde Q -16\nKPX Atilde T -27\nKPX Atilde U -23\nKPX Atilde V -59\nKPX Atilde W -1" +"3\nKPX Atilde Y -27\nKPX Atilde comma -47\nKPX Atilde period -62\nKPX B A 4\nKPX" +" B AE 3\nKPX B Aacute 4\nKPX B Acircumflex 4\nKPX B Adieresis 4\nKPX B Aring 4\n" +"KPX B Atilde 4\nKPX B O -9\nKPX B OE 11\nKPX B Oacute -9\nKPX B Ocircumflex -9\n" +"KPX B Odieresis -9\nKPX B Ograve -9\nKPX B Oslash -5\nKPX B V -18\nKPX B W -6\nK" +"PX B Y -39\nKPX C A 8\nKPX C AE 7\nKPX C Aacute 8\nKPX C Adieresis 8\nKPX C Arin" +"g 8\nKPX C H -13\nKPX C K -8\nKPX C O -14\nKPX C Oacute -14\nKPX C Odieresis -14" +"\nKPX Ccedilla A 3\nKPX D A -25\nKPX D Aacute -25\nKPX D Acircumflex -25\nKPX D " +"Adieresis -25\nKPX D Agrave -25\nKPX D Aring -25\nKPX D Atilde -25\nKPX D J -32\n" +"KPX D T -27\nKPX D V -30\nKPX D W -13\nKPX D X -37\nKPX D Y -51\nKPX F A -39\nKP" +"X F Aacute -39\nKPX F Acircumflex -39\nKPX F Adieresis -39\nKPX F Agrave -39\nKP" +"X F Aring -39\nKPX F Atilde -39\nKPX F J -78\nKPX F O -24\nKPX F Odieresis -24\n" +"KPX F a -40\nKPX F aacute -40\nKPX F adieresis -40\nKPX F ae -18\nKPX F aring -4" +"0\nKPX F comma -168\nKPX F e -47\nKPX F eacute -47\nKPX F hyphen -55\nKPX F i -4" +"6\nKPX F j -54\nKPX F o -51\nKPX F oacute -51\nKPX F odieresis -51\nKPX F oe -16" +"\nKPX F oslash -51\nKPX F period -187\nKPX F r -32\nKPX F u -1\nKPX G A 6\nKPX G" +" AE 5\nKPX G Aacute 6\nKPX G Acircumflex 6\nKPX G Adieresis 6\nKPX G Agrave 6\nK" +"PX G Aring 6\nKPX G Atilde 6\nKPX G T -25\nKPX G V 6\nKPX G W 6\nKPX G Y -14\nKP" +"X J A -8\nKPX J AE -16\nKPX J Adieresis -8\nKPX J Aring -8\nKPX K C -24\nKPX K G" +" -19\nKPX K O -25\nKPX K OE -4\nKPX K Oacute -25\nKPX K Odieresis -25\nKPX K S -" +"9\nKPX K T -13\nKPX K a 6\nKPX K adieresis 6\nKPX K ae 31\nKPX K aring 6\nKPX K " +"e -6\nKPX K hyphen -44\nKPX K o -12\nKPX K oacute -12\nKPX K odieresis -12\nKPX " +"K u -22\nKPX K udieresis -22\nKPX K y -50\nKPX L A 16\nKPX L AE 16\nKPX L Aacute" +" 16\nKPX L Adieresis 16\nKPX L Aring 16\nKPX L C -10\nKPX L Ccedilla -11\nKPX L " +"G -10\nKPX L O -7\nKPX L Oacute -7\nKPX L Ocircumflex -7\nKPX L Odieresis -7\nKP" +"X L Ograve -7\nKPX L Otilde -7\nKPX L S -24\nKPX L T -52\nKPX L U -29\nKPX L Udi" +"eresis -29\nKPX L V -57\nKPX L W -22\nKPX L Y -52\nKPX L hyphen 9\nKPX L quotedb" +"lright -72\nKPX L quoteright -99\nKPX L u -10\nKPX L udieresis -11\nKPX L y -33\n" +"KPX N A -3\nKPX N AE -3\nKPX N Aacute -3\nKPX N Adieresis -3\nKPX N Aring -3\nKP" +"X N C -7\nKPX N Ccedilla -6\nKPX N G -6\nKPX N O -5\nKPX N Oacute -5\nKPX N Odie" +"resis -5\nKPX N a -11\nKPX N aacute -11\nKPX N adieresis -11\nKPX N ae 18\nKPX N" +" aring -11\nKPX N comma -75\nKPX N e -3\nKPX N eacute -3\nKPX N o -8\nKPX N oacu" +"te -8\nKPX N odieresis -8\nKPX N oslash -3\nKPX N period -93\nKPX N u -8\nKPX N " +"udieresis -8\nKPX O A -14\nKPX O AE -14\nKPX O Aacute -14\nKPX O Adieresis -14\n" +"KPX O Aring -14\nKPX O T -15\nKPX O V -23\nKPX O W -2\nKPX O X -26\nKPX O Y -43\n" +"KPX Oacute A -14\nKPX Oacute T -15\nKPX Oacute V -23\nKPX Oacute W -2\nKPX Oacut" +"e Y -43\nKPX Ocircumflex T -15\nKPX Ocircumflex V -23\nKPX Ocircumflex Y -43\nKP" +"X Odieresis A -14\nKPX Odieresis T -15\nKPX Odieresis V -23\nKPX Odieresis W -2\n" +"KPX Odieresis X -26\nKPX Odieresis Y -43\nKPX Ograve T -15\nKPX Ograve V -23\nKP" +"X Ograve Y -43\nKPX Oslash A -10\nKPX Otilde T -15\nKPX Otilde V -23\nKPX Otilde" +" Y -43\nKPX P A -61\nKPX P AE -59\nKPX P Aacute -61\nKPX P Adieresis -61\nKPX P " +"Aring -61\nKPX P J -73\nKPX P a -49\nKPX P aacute -49\nKPX P adieresis -49\nKPX " +"P ae -27\nKPX P aring -49\nKPX P comma -160\nKPX P e -38\nKPX P eacute -38\nKPX " +"P hyphen -33\nKPX P o -42\nKPX P oacute -42\nKPX P odieresis -42\nKPX P oe -13\n" +"KPX P oslash -42\nKPX P period -178\nKPX R C -14\nKPX R Ccedilla -17\nKPX R G -1" +"0\nKPX R O -14\nKPX R OE 5\nKPX R Oacute -14\nKPX R Odieresis -14\nKPX R T -28\n" +"KPX R U -16\nKPX R Udieresis -17\nKPX R V -24\nKPX R W -8\nKPX R Y -28\nKPX R a " +"14\nKPX R aacute 14\nKPX R adieresis 14\nKPX R ae 40\nKPX R aring 14\nKPX R e 2\n" +"KPX R eacute 2\nKPX R hyphen -25\nKPX R o -3\nKPX R oacute -3\nKPX R odieresis -" +"3\nKPX R oe 29\nKPX R u -7\nKPX R uacute -8\nKPX R udieresis -8\nKPX R y -18\nKP" +"X S A -10\nKPX S AE -10\nKPX S Aacute -10\nKPX S Adieresis -10\nKPX S Aring -10\n" +"KPX S T -41\nKPX S V -10\nKPX S W -12\nKPX S Y -31\nKPX S t -17\nKPX T A -28\nKP" +"X T AE -28\nKPX T Aacute -28\nKPX T Acircumflex -28\nKPX T Adieresis -28\nKPX T " +"Agrave -28\nKPX T Aring -28\nKPX T Atilde -28\nKPX T C -19\nKPX T G -19\nKPX T J" +" -65\nKPX T O -14\nKPX T OE 6\nKPX T Oacute -14\nKPX T Ocircumflex -14\nKPX T Od" +"ieresis -14\nKPX T Ograve -14\nKPX T Oslash -14\nKPX T Otilde -14\nKPX T S -41\n" +"KPX T V 10\nKPX T W 4\nKPX T Y -10\nKPX T a -34\nKPX T ae -12\nKPX T c -37\nKPX " +"T colon -112\nKPX T comma -130\nKPX T e -26\nKPX T g -24\nKPX T guillemotleft -7" +"3\nKPX T guilsinglleft -73\nKPX T hyphen -91\nKPX T i -42\nKPX T j -49\nKPX T o " +"-31\nKPX T oslash -31\nKPX T period -148\nKPX T r -28\nKPX T s -39\nKPX T semico" +"lon -100\nKPX T u 4\nKPX T v 10\nKPX T w 10\nKPX T y 0\nKPX U A -19\nKPX U AE -1" +"8\nKPX U Aacute -19\nKPX U Acircumflex -19\nKPX U Adieresis -19\nKPX U Aring -19" +"\nKPX U Atilde -19\nKPX U comma -95\nKPX U m 16\nKPX U n -8\nKPX U p 0\nKPX U pe" +"riod -114\nKPX U r -34\nKPX Uacute A -19\nKPX Uacute comma -95\nKPX Uacute m 16\n" +"KPX Uacute n -8\nKPX Uacute p 0\nKPX Uacute period -114\nKPX Uacute r -34\nKPX U" +"circumflex A -19\nKPX Udieresis A -19\nKPX Udieresis b 27\nKPX Udieresis comma -" +"95\nKPX Udieresis m 16\nKPX Udieresis n -8\nKPX Udieresis p 0\nKPX Udieresis per" +"iod -114\nKPX Udieresis r -34\nKPX Ugrave A -19\nKPX V A -4\nKPX V AE -12\nKPX V" +" Aacute -4\nKPX V Acircumflex -4\nKPX V Adieresis -4\nKPX V Agrave -4\nKPX V Ari" +"ng -4\nKPX V Atilde -4\nKPX V C -24\nKPX V G -24\nKPX V O -23\nKPX V Oacute -23\n" +"KPX V Ocircumflex -23\nKPX V Odieresis -23\nKPX V Ograve -23\nKPX V Oslash -23\n" +"KPX V Otilde -23\nKPX V S -27\nKPX V T 10\nKPX V a -54\nKPX V ae -27\nKPX V colo" +"n -132\nKPX V comma -146\nKPX V e -47\nKPX V g -46\nKPX V guillemotleft -75\nKPX" +" V guilsinglleft -75\nKPX V hyphen -39\nKPX V i -59\nKPX V o -52\nKPX V oslash -" +"48\nKPX V period -164\nKPX V r -45\nKPX V semicolon -120\nKPX V u -15\nKPX V y -" +"17\nKPX W A -9\nKPX W AE -9\nKPX W Aacute -9\nKPX W Acircumflex -9\nKPX W Adiere" +"sis -9\nKPX W Agrave -9\nKPX W Aring -9\nKPX W Atilde -9\nKPX W C -4\nKPX W G -3" +"\nKPX W O -2\nKPX W Oacute -2\nKPX W Ocircumflex -2\nKPX W Odieresis -2\nKPX W O" +"grave -2\nKPX W Oslash 2\nKPX W Otilde -2\nKPX W S -17\nKPX W T 4\nKPX W a -11\n" +"KPX W ae 17\nKPX W colon -99\nKPX W comma -83\nKPX W e -3\nKPX W g -3\nKPX W gui" +"llemotleft -31\nKPX W guilsinglleft -31\nKPX W hyphen 1\nKPX W i -38\nKPX W o -8" +"\nKPX W oslash -4\nKPX W period -101\nKPX W r -25\nKPX W semicolon -82\nKPX W u " +"1\nKPX W y -2\nKPX X C -28\nKPX X O -26\nKPX X Odieresis -26\nKPX X Q -26\nKPX X" +" a 0\nKPX X e -12\nKPX X hyphen -50\nKPX X o -18\nKPX X u -28\nKPX X y -43\nKPX " +"Y A -25\nKPX Y AE -28\nKPX Y Aacute -25\nKPX Y Acircumflex -25\nKPX Y Adieresis " +"-25\nKPX Y Agrave -25\nKPX Y Aring -25\nKPX Y Atilde -25\nKPX Y C -45\nKPX Y G -" +"45\nKPX Y O -44\nKPX Y Oacute -44\nKPX Y Ocircumflex -44\nKPX Y Odieresis -44\nK" +"PX Y Ograve -44\nKPX Y Oslash -43\nKPX Y Otilde -44\nKPX Y S -48\nKPX Y T -10\nK" +"PX Y a -53\nKPX Y ae -28\nKPX Y colon -150\nKPX Y comma -118\nKPX Y e -59\nKPX Y" +" g -59\nKPX Y guillemotleft -94\nKPX Y guilsinglleft -94\nKPX Y hyphen -81\nKPX " +"Y i -58\nKPX Y o -64\nKPX Y oslash -51\nKPX Y p -30\nKPX Y period -136\nKPX Y se" +"micolon -133\nKPX Y u -43\nKPX Y v -33\nKPX Z v -41\nKPX Z y -52\nKPX a j -81\nK" +"PX a quoteright -78\nKPX a v -21\nKPX a w -12\nKPX a y -31\nKPX aacute v -21\nKP" +"X aacute w -12\nKPX aacute y -31\nKPX adieresis v -21\nKPX adieresis w -12\nKPX " +"adieresis y -31\nKPX ae v 28\nKPX ae w 32\nKPX ae y 18\nKPX agrave v -21\nKPX ag" +"rave w -12\nKPX agrave y -31\nKPX aring v -21\nKPX aring w -12\nKPX aring y -31\n" +"KPX b v 0\nKPX b w 4\nKPX b y -10\nKPX c h 11\nKPX c k 6\nKPX comma one -128\nKP" +"X comma quotedblright -137\nKPX comma quoteright -166\nKPX e quoteright -65\nKPX" +" e t -16\nKPX e v -9\nKPX e w -3\nKPX e x 6\nKPX e y -20\nKPX eacute v -9\nKPX e" +"acute w -3\nKPX eacute y -20\nKPX ecircumflex v -9\nKPX ecircumflex w -3\nKPX ec" +"ircumflex y -20\nKPX eight four -58\nKPX eight one -72\nKPX eight seven -65\nKPX" +" f a -32\nKPX f aacute -32\nKPX f adieresis -32\nKPX f ae -7\nKPX f aring -32\nK" +"PX f e -43\nKPX f eacute -43\nKPX f f -43\nKPX f i -37\nKPX f j -60\nKPX f l -25" +"\nKPX f o -47\nKPX f oacute -47\nKPX f odieresis -42\nKPX f oe -15\nKPX f oslash" +" -29\nKPX f quoteright -73\nKPX f s -42\nKPX f t -6\nKPX five four -52\nKPX five" +" one -73\nKPX five seven -73\nKPX four four -62\nKPX four one -66\nKPX four seve" +"n -93\nKPX g a -4\nKPX g adieresis -4\nKPX g ae 23\nKPX g aring -4\nKPX g e 1\nK" +"PX g eacute 1\nKPX g l -34\nKPX g oacute -3\nKPX g odieresis -3\nKPX g r 0\nKPX " +"guillemotright A -37\nKPX guillemotright AE -34\nKPX guillemotright Aacute -37\n" +"KPX guillemotright Adieresis -37\nKPX guillemotright Aring -37\nKPX guillemotrig" +"ht T -71\nKPX guillemotright V -72\nKPX guillemotright W -29\nKPX guillemotright" +" Y -92\nKPX guilsinglright A -37\nKPX guilsinglright AE -34\nKPX guilsinglright " +"Aacute -37\nKPX guilsinglright Adieresis -37\nKPX guilsinglright Aring -37\nKPX " +"guilsinglright T -71\nKPX guilsinglright V -72\nKPX guilsinglright W -29\nKPX gu" +"ilsinglright Y -92\nKPX h quoteright -69\nKPX h y -23\nKPX hyphen A -18\nKPX hyp" +"hen AE -14\nKPX hyphen Aacute -18\nKPX hyphen Adieresis -18\nKPX hyphen Aring -1" +"8\nKPX hyphen T -90\nKPX hyphen V -38\nKPX hyphen W 1\nKPX hyphen Y -81\nKPX i T" +" -58\nKPX i j -143\nKPX k a 1\nKPX k aacute 1\nKPX k adieresis 1\nKPX k ae 26\nK" +"PX k aring 1\nKPX k comma -63\nKPX k e -11\nKPX k eacute -11\nKPX k g -14\nKPX k" +" hyphen -50\nKPX k o -17\nKPX k oacute -17\nKPX k odieresis -17\nKPX k period -7" +"5\nKPX k s -9\nKPX k u -3\nKPX k udieresis -3\nKPX l v -77\nKPX l y -77\nKPX m p" +" 32\nKPX m v 18\nKPX m w 22\nKPX m y 8\nKPX n T -40\nKPX n p 4\nKPX n quoteright" +" -68\nKPX n v -12\nKPX n w -5\nKPX n y -22\nKPX nine four -53\nKPX nine one -66\n" +"KPX nine seven -57\nKPX o T -31\nKPX o quoteright -62\nKPX o t -13\nKPX o v -6\n" +"KPX o w -3\nKPX o x -10\nKPX o y -17\nKPX oacute v -6\nKPX oacute w -3\nKPX oacu" +"te y -17\nKPX ocircumflex t -13\nKPX odieresis t -13\nKPX odieresis v -6\nKPX od" +"ieresis w -3\nKPX odieresis x -10\nKPX odieresis y -17\nKPX ograve v -6\nKPX ogr" +"ave w -3\nKPX ograve y -17\nKPX one comma -99\nKPX one eight -74\nKPX one five -" +"55\nKPX one four -87\nKPX one nine -73\nKPX one one -62\nKPX one period -114\nKP" +"X one seven -141\nKPX one six -98\nKPX one three -53\nKPX one two -47\nKPX one z" +"ero -86\nKPX p t -3\nKPX p y -6\nKPX period one -113\nKPX period quotedblright -" +"131\nKPX period quoteright -161\nKPX q c 2\nKPX q u 41\nKPX quotedblbase A -6\nK" +"PX quotedblbase AE -7\nKPX quotedblbase T -90\nKPX quotedblbase V -104\nKPX quot" +"edblbase W -43\nKPX quotedblbase Y -78\nKPX quotedblleft A -62\nKPX quotedblleft" +" AE -60\nKPX quotedblleft Aacute -62\nKPX quotedblleft Adieresis -62\nKPX quoted" +"blleft Aring -62\nKPX quotedblleft T -24\nKPX quotedblleft V -22\nKPX quotedblle" +"ft W -13\nKPX quotedblleft Y -49\nKPX quotedblright A -76\nKPX quotedblright AE " +"-75\nKPX quotedblright Aacute -76\nKPX quotedblright Adieresis -76\nKPX quotedbl" +"right Aring -76\nKPX quotedblright T -39\nKPX quotedblright V -30\nKPX quotedblr" +"ight W -26\nKPX quotedblright Y -51\nKPX quoteleft A -87\nKPX quoteleft AE -85\n" +"KPX quoteleft Aacute -87\nKPX quoteleft Adieresis -87\nKPX quoteleft Aring -87\n" +"KPX quoteleft T -49\nKPX quoteleft V -46\nKPX quoteleft W -38\nKPX quoteleft Y -" +"73\nKPX quoteright A -154\nKPX quoteright AE -153\nKPX quoteright Aacute -154\nK" +"PX quoteright Adieresis -154\nKPX quoteright Aring -154\nKPX quoteright comma -2" +"27\nKPX quoteright d -140\nKPX quoteright o -143\nKPX quoteright period -244\nKP" +"X quoteright r -149\nKPX quoteright s -150\nKPX quoteright t -117\nKPX quoterigh" +"t v -110\nKPX quoteright w -105\nKPX quoteright y -116\nKPX r a -17\nKPX r aacut" +"e -17\nKPX r acircumflex -17\nKPX r adieresis -17\nKPX r ae 4\nKPX r agrave -17\n" +"KPX r aring -17\nKPX r c -18\nKPX r ccedilla -15\nKPX r colon -95\nKPX r comma -" +"108\nKPX r d -8\nKPX r e -7\nKPX r eacute -7\nKPX r ecircumflex -7\nKPX r egrave" +" -7\nKPX r f -16\nKPX r g -5\nKPX r h -20\nKPX r hyphen -41\nKPX r i -25\nKPX r " +"j -33\nKPX r k -30\nKPX r l -47\nKPX r m 36\nKPX r n 10\nKPX r o -12\nKPX r oacu" +"te -12\nKPX r ocircumflex -12\nKPX r odieresis -12\nKPX r oe 18\nKPX r ograve -1" +"2\nKPX r oslash -12\nKPX r p 30\nKPX r period -122\nKPX r q -4\nKPX r quoteright" +" -41\nKPX r r -11\nKPX r s -21\nKPX r semicolon -83\nKPX r t 20\nKPX r u 20\nKPX" +" r v 26\nKPX r w 26\nKPX r x 7\nKPX r y 16\nKPX r z -21\nKPX s quoteright -60\nK" +"PX s t -11\nKPX seven colon -156\nKPX seven comma -157\nKPX seven eight -74\nKPX" +" seven five -82\nKPX seven four -101\nKPX seven one -67\nKPX seven period -176\n" +"KPX seven seven -62\nKPX seven six -93\nKPX seven three -72\nKPX seven two -64\n" +"KPX six four -49\nKPX six one -54\nKPX six seven -46\nKPX t S -35\nKPX t a -16\n" +"KPX t aacute -16\nKPX t adieresis -16\nKPX t ae 9\nKPX t aring -16\nKPX t colon " +"-117\nKPX t e -24\nKPX t eacute -24\nKPX t h -5\nKPX t o -30\nKPX t oacute -30\n" +"KPX t odieresis -30\nKPX t quoteright -102\nKPX t semicolon -103\nKPX three four" +" -52\nKPX three one -71\nKPX three seven -64\nKPX two four -67\nKPX two one -66\n" +"KPX two seven -68\nKPX u quoteright -56\nKPX v a -3\nKPX v aacute -3\nKPX v acir" +"cumflex -3\nKPX v adieresis -3\nKPX v ae 18\nKPX v agrave -3\nKPX v aring -3\nKP" +"X v atilde -3\nKPX v c -11\nKPX v colon -81\nKPX v comma -136\nKPX v e 0\nKPX v " +"eacute 0\nKPX v ecircumflex 0\nKPX v egrave 0\nKPX v g 1\nKPX v hyphen -23\nKPX " +"v l -77\nKPX v o -5\nKPX v oacute -5\nKPX v odieresis -5\nKPX v ograve -5\nKPX v" +" oslash -5\nKPX v period -156\nKPX v s -11\nKPX v semicolon -69\nKPX w a -3\nKPX" +" w aacute -3\nKPX w acircumflex -3\nKPX w adieresis -3\nKPX w ae 23\nKPX w agrav" +"e -3\nKPX w aring -3\nKPX w atilde -3\nKPX w c -6\nKPX w colon -81\nKPX w comma " +"-90\nKPX w e 2\nKPX w eacute 2\nKPX w ecircumflex 2\nKPX w egrave 2\nKPX w g 3\n" +"KPX w hyphen 3\nKPX w l -48\nKPX w o -2\nKPX w oacute -2\nKPX w odieresis -2\nKP" +"X w ograve -2\nKPX w oslash 2\nKPX w period -109\nKPX w s -11\nKPX w semicolon -" +"69\nKPX x a 5\nKPX x c -14\nKPX x e -5\nKPX x eacute -5\nKPX x o -10\nKPX x q -8" +"\nKPX y a -13\nKPX y aacute -13\nKPX y acircumflex -13\nKPX y adieresis -13\nKPX" +" y ae 8\nKPX y agrave -13\nKPX y aring -13\nKPX y atilde -13\nKPX y c -21\nKPX y" +" colon -91\nKPX y comma -134\nKPX y e -11\nKPX y eacute -11\nKPX y ecircumflex -" +"11\nKPX y egrave -11\nKPX y g -9\nKPX y hyphen -19\nKPX y l -78\nKPX y o -15\nKP" +"X y oacute -15\nKPX y odieresis -15\nKPX y ograve -15\nKPX y oslash -15\nKPX y p" +"eriod -155\nKPX y s -21\nKPX y semicolon -79\nKPX zero four -59\nKPX zero one -7" +"6\nKPX zero seven -68\nEndKernPairs\nEndKernData\nEndFontMetrics\n" +; +int n022004l_pfb_len = 50493; +char* n022004l_pfb = +"\x80\x1U\x6\x0\x0%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05\n%%CreationDate: Wed D" +"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" +"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" +" (GNU General Public License) for license conditions.\n% As a special exception," +" permission is granted to include this font\n% program in a Postscript or PDF fi" +"le that consists of a document that\n% contains text to be displayed or printed " +"using this font, regardless\n% of the conditions or license applying to the docu" +"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" +"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" +" file COPYING (GNU General Public License) for license conditions. As a special " +"exception, permission is granted to include this font program in a Postscript or" +" PDF file that consists of a document that contains text to be displayed or prin" +"ted using this font, regardless of the conditions or license applying to the doc" +"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" +"W)++ Design & Development) readonly def\n/FullName (Nimbus Mono L Bold) readonly" +" def\n/FamilyName (Nimbus Mono L) readonly def\n/Weight (Bold) readonly def\n/It" +"alicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -100 def\n/Underl" +"ineThickness 50 def\nend readonly def\n/FontName /NimbusMonL-Bold def\n/PaintTyp" +"e 0 def\n/WMode 0 def\n/FontBBox {-43 -278 681 871} readonly def\n/FontType 1 de" +"f\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding StandardEnc" +"oding def\n/UniqueID 5020946 def\ncurrentdict end\ncurrentfile eexec\r\x80\x2\xc0" +"\xbc\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93" +"\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6" +"\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd" +"fA-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e" +"\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9d" +"n\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13" +"\x1d\xee\x0[AX\x5\xa1m\x8a\x12>j!S\xda\xaeZ\xc3\x44\x9a\x45\x32V1\xb2h\x84\xc3\xdb" +"\xa4\xccO:\xee\r\xad)\x7u|8tl\x94~\"y\xcf\x35\xbfw\xcb(\xbd\xa8\xe*\x1a\xd4\xb7\xa8" +"v\x2\x62\xb6\x92-D]p\x15.+\xc1t|sJ\x8c\x63U}\xd0\x42\xf7\xdf\xdf\x15qE\x0i\x1c\x84" +":l\xab}A\x9e\x81\xfe\xba\xadzo\xc0\xa5\xd7\x8b\xf6\xcc\xa5-\xe8;k\x9f)|\xaa\xad\xf2" +"1\x83\x11\xea\xbb\x9dO\xb4\x90N 7\x86+\xe8\xee\xf5\x10\x1f\x87#\xcb\x1f\xeZ\x1d\x82" +"-2!\xclt#\x11\xd9\xc4\\Z\xb9\xc6\x9d\xd6\x41\xbf;\x15\xec<\xd3\xf7\xbb\xd3\x31\xca" +"\xa9\x32\x42y\x94&\xe\xac\x31\xc9\xe8X\x9f\xa4\xc0:J\x98" +"\xe4\x1c-S\xf2\xa0\x13\x9f)\xf8\xb7/Y\xfd\x64\x17\xf\x2q\xc2\xcf\xe0;a\x82R\xda\xec" +"\\\xb2r\xe0\xdb\x98Vl4\xa6\xe9s\x8e\xcag\xbf\xbfK\xff\x93\x86NX\x9fs\xbc$s|\x4K\xbaU\x1a\x41\xc9N\xd3" +"\x9c\xef?\x92\x92\xdd\x8b\x9e_\xab\x3\x1e{9/\x80&\x11\xb7*\xaaj\xc\xf1\xdb\xb3T\x82" +"e\xb\xde\xfaz\xe9;K\xd6!\xb\x8b\x42\x9e\x9a^S\xd1\xc1\xc1\xe4\x30o\x83\xca\x36`\xab" +"\xfbq\x1\x8b\x1d\xd3\x9a\xd4\xf\x82\x1f\x88o\xb4In1\xda\xc1\x1c\xde\xe1Z\xda\x9f" +"\xa8th\xc4\xa4\xe9\x84\r\x9dO^\xe6\xce\xf4\xca\x7\"\x38\x45%\x46\xdb \x8e\xfc<\xe2" +"sV\xdf\x2\xf4{\"\xc9.\xab[mi\x87\x5\x2\xc2!M\x1Ml=nE\x95y[/\xef\xec\x32\x34\x8d\xab" +"\xf6\xdal\xe5\x1a\x95\xc7;@\x8\xf0Hz\xbc%\xb2\xd9\xc6\xf8*\x90\x42\xd0|\xf5#f0\x83" +"\xdej\xa2*\x99\xe1\x1f!\x12{\x9c\x61\x82@\xf2\xaf\x8eOR\x97\xef\xfb\x39\x18/\xaa" +"f\xe1\xe3W\x89\x1b\xfc\x37\xdf\x3'\x92\xd3\xc7\xdeZ\x16\xf4\x39@q\xbbLT\xaf\xa1\x90" +"\xc5\xb3\xfb\x36\xe7\xa8\x9\xc6\xb6^\x3\xf1\xf1\xd6\xdb\x9eH^\r\xc5\xa9\r`\x94%\xa9" +"\x85\xfb\xa0\x37\x31\xa0\xfa\x92\x97\xb4\xddSY\xf8\xe7\xcaqF\xa6\xee\xad\xe7\"\xb0" +"%\xd1\xb\x9f\xcc\x4[.\x8a\xfa\xc2\x99\r\xa3\xa1\x12!\x7f\x9f\x10\x86hV\xd9\xce\x9" +"?e\x9c\xe5\xeb\x10\x66\x36\xdeZ`\x83\x1a\x61\x3\xa5\x1\x5\xc5\x62\xbd\x66\x12\xc7" +"A\xd5)\xc5\xc1\xfo>#\x2S\x16Loe\xde\x8bxJ\x9dj\x84\x89\x39\xadu\x80\xff\xe\x7~\xba" +"\xe7\xe9$P\xa2T\x90\xe0\xa1\x0\xad\xea\xc5\"^\xf4_\x9ai\xdaSM\xd6I\xca\xbf\x39 \x10" +"\xcf\xd8\xb1\xdf\xacO\xc1\xdao\xd8\xecp\x82\xc9{0\xac\xdcv\xcbU5 W\xd6\x89\x30\x81" +"\xe9\xbeX\xc3=\xab\x65\xc6\x9e\x1a\xaf\xf\r\xa2\xc?@\x13\x5h2\xa6\xb0\xa9o\x88\x87" +"\x19\xe9\xc6\xf8\x99\xb4\x91\xdc\x19\xft\x89jD\x17\xb9\xf6g\x3\xde\x1f\xa0\xcc\xc7" +"\x8\x82\xbf\x61;\xd9\xe3\x62\xde\x9f\x90\x85\xc5\xbf]\x8e\xdf\x64\xb9\xf7}\xce%\x33" +"\xf6N\xc5\xdf\xfe\xe6\xb2" +"~QqG\xc9\x84\x9dt\xc8\x9f]\xca\xe2\xcc+\x93\x30\x89\x10x99\x6!|*\xe7\x4\x84^\xe7" +"\xe5\x19\x5-\xa0W\x98\xd7\x39\x88\xd2\xc7~\xe4q\xd7/\xb1\r\xef\x97\xe1\x35<\xef&" +"3\xe1\x85Z.\xf2\x9c\x38H\xd1pY\x4\x43y2H\xb8\xb8N\xe3j3\xc3\x7\xfe\xe7\xe8\xe4\xc0" +"(\x97Upb\xe3-\xa7\x9c\x0\x10P\xf2.\x9c\x9e\x8a\xca\xfb\x45\xd7\xaf\xffPl\xf4\x33" +"W\xaa\x85\xa6\x89\xd6)B\xb7\xcd\x39\x10\xf4S\x8f\x9a\\R\xb9\x61\x46\x39\xeeMr8\x96" +"0\x9\x1f\x30\xf8^']O\x8\xf3\x95\x88|\xe6l\xcd\xb6\xe3\x80\xa9;\x5\x19\xe2q3\x9b\x1c" +"\x99;t\xe7`B\xfdi{\x81\x8b\xaf\x83\xae\x98\xe\xaf:\xe0\xb8\x6UW\xae\xffQx\xd7>%\xe8" +"\xb7(\xe9N\xda\xc7\x5\x39\x4\x8f\xb1\xels\x4\x97\x8e\xad\xc4\xa5\xd3\x9\n\x38\x37" +"\xfc\x31\xb0?\xbb\x96\xd7\xedJ\xe3\xc0\x94\x8b'\xc0\x12,\x7f\xa4\xd6\xc8\x9R\x96" +"\xc3\x16.\xdd\xea'\xa9\x99~u#v\x91UZ\x8aW^T.-@\xdc\x1e \xf6k\xf2\x8c;\x9\xbc\x1d" +"F\x12\xb9s\x10\x63\r\x1\xc3&\xd8\xc7.\xfe\xeb\xec\x8d\xc2O\xde\xb0\xb8\xd5\xc9\x94" +"S\x85\xa4uC\xe6\xc4\x96\n\x2\xaa\xcf\xc\xf5\xb0\x1f\x8a\x66\xc7\xca\xfe\xf4\xb8\x81" +"\x11\xee\\y\xa7k\xc\x94\x9c\x3\x91\xe2\xc8p\xb3\xf:Y\xce\x6\xc5/\x95\xf6\xeb~Z\xee" +"\xc2\x43\xc0\x1bP\xd1Y\xa1\xb8\x17\xdd\xa7\xf6\xdeU\x9e\x13\xd6\x31\x96\xe8\x1eu" +"2d.\x8\x34\xf9\xb1=\xd1\xc\xa0j\x91\x94;6\xaf\xdb\xd7\xa4\xa2\x61\x81\xdf\xed\x9c" +"\xc7\x37R\x98.\xcf\xc5\xbc\xa1Q<\xee\x97\x10\x99\xb\xe0(\x15\x14\x45\xf2\xe2\x5t" +"W\xa2\xba\xf7\xe7\xb3!\x88_\xd5\x91\xcf\x42\x81\x99%\x33\xae\xeMO\xdc\xbb\xce\x65" +"9\xa4\xf2oN\xf0\xe\x6\xd5x\x84\xc7z\x90\x3\xc2\x16\xc0\xb6\\\x4\xda\x36\xd6\x8c\xc5" +"i\xed\xc0u\xea\xdf\x9dpy\xe0\xf7H_2\xe0\xe5\x46'\xdb\x15\x39\xd4I:_\xbb\xbe\xc8\xee" +"i\xec\x7f\x85(\"\xc5\x15\x84\xa2\xf5,w\xbb\xbagR\xce\xefh\xf7I\x7f\x61\xe4\xa2\xaa" +"\xe3>Zc\xc\x6t\xbbm\xc4\xc3\x1dX\xe1-?\x95\xcd\x33\x83\xd4\x9b{\xac\xe7\xa1\x36\x94" +"\xf8\xffj\xb5\xa7\xa6\x83\xa9N\x98\x4\xc2\xb\xfept\xf`\xe,Z\xf0\xab\x83\\s\xa5_\x7f" +"h\x1d\x42\x92\xe5|\xf6\x61\x98\xf1\xf3\xaf\x82\xcf\x33l3\x1f\x9\x1a\x85yjr\x94:\x13" +"\xc\x34\x66\xb4\"\x9dH\x0\xd7\xf6\xf\x43\x9a\x32\x7f\x32\xaf\xd0\xfc\xbe\x14\x1f" +"e=\xca\x1c;\xff\xdb\x5P\x9e\xcf\x1e\x41\x9d\x4\\V\xac:\x90\xf5'\x0v;\x93\x9\xd2\xe8" +"n\n\xd2\x1a\x36\x8d\x84\xefL\x7x\x99\xee\\\xf2\x1\x36]=\x90\xdep\x91\xff\xab\"R\x86" +"\x9e\xde\x93\xfc\xce\x32\xcG\xfd\xfa\xb2\x31\x12\x85\xd5\xb2\x63\x14\x0\x89\xa9\xb3" +"\x82\xf3<\xa6\x1b\xc5\x87\xa5}\x90l]\xb9\x1ezgX\x98\xee$\xe\xae\xdeS\xb2\x8b\xba" +"\xc1\x3\xe0\xc7m\xf8\xb1,b\xa3\x93\x7f\xc1\xae\xa8\x1f\xfc\x30\xd6\x97\x93\xb4k\xbf" +"2\xe1\xf0_T\xe*\xf2\xd7\xd5Jw\xef\x2\xba\x9eQ3\xc2\xea\x31\xd7\x8b\x4\x1a\x1b\xa7" +"\\-jz\xe1\xa2\x35+a\x1\x34xQ\x16\x43`\xf1\x45\x1d\xb5\xe3\xe9\x1f\xeaS\x0\x2\x10" +"P\\\xc0\"\x1c|Q\x90\xa4\x36\xac\x8b\x81\xe9\xa4\xe\xe8\x34\xcd\xf\xde\x4[\rF\xaa" +"\xa4i=\xf0\x37\n\x98\x4\xaevC\xd1\xde\x81<\xfdu\xcbxX\x84\xd6\x86\x87\xe8\x84\x94" +"\"PNJO\x1L\xe4\x0\xdale\xee\xbc\x9d\x98\x86\xdb\xe5\x2\xcc\xef\x99\xa7\x8\x8f\xe3" +"c\xa1\x85\xbbu\xf7\xb\x2#\x11\x91|*c\xe2\xe4\x1f>\x95\x42\xcf.K5\xa7\xb4.%\x3\xd6" +"r^q9\xc1\xcf\xa3\x1c\xcf\xa4k\x99\x86\x36\x1b\xbd\xd5\xbc\xd3\xa8\xe9H\x80U" +"^\xfcH\x19\x85\xd6\xdc\x64\xc7}\x5\xed\n\xa8&I\n\x7\x9a\xe4\xd1\xee\x1\x1e\xf8k\xd8" +"?\x7f\x9e\x65\x43:H\xdb\xf1$\xf1Z\xc3\xda\r_\xaalm\xaa\xc1\xc4\xfe\xb7\xdb\x8b\x84" +"C\x7\x16\xe\"\x81\xffz-+\xc6\xad\xd4;5DT\xd3I\xa3\x34\x14\x1bK\x1e)Sn\x88\xf2\x89" +"\xe5\x44\x8e[&\x81<\xe0t2c+RS9?fyh3#\x87\xa1\xbc\xcb\x98P?C\xabL\xc9\xb\x12\xe1\xf" +"\x8d|d5\xaa\xcd\x62\xfc\x8e\xf3/\xb3}\x13\xfa\xb\xf\xf1\x8a\xe2\no//\xd6\x39MU\xa8" +"\xfa\xff\x9\xff\x91\xab\xc2&A+\x0Q\xc2\x82\xb4\xb4\x9cU\x8a\xb0\x1\xd2Im\xba\xb6" +"\x8e\x66S\xdb\xb7M!\x3\x2\xa7\x84W\xeb&\xec\xaf\xcb\xec\x89o\xa5\x8f\x4H8}\x17`\x8d" +"z#\x13\xc2\"\xb4\x13\xd3\xf3.\xd2\x9bh=\x9d\xecy'\xfd\x93\xa8\xcb\r\xa0k.\x17\x94" +"\r\x19_|\xaf\xc6\xe5\xed\xcb\x31\xa8\xe0\x1\x87\x90\x3\x12\xee\x9b\xb1\x2\x5l\x15" +"\xea#>-C\xb7\xc6\xab\xbd\xe4M\xda\xd3\xa1\xf2\xcb\xcds\xe\xb5\xbe\x1f\x36\x91\xaa" +"\xaf.\xfe\x94\xa4snlLu:\xfb\xe1\xc0\x5\x14\x99\x18\xa4\xe5\x44k1\xce\x0Z\x99\xd6" +"A%\xc9`\x1c\xb0\x16\xa5M2A\xab!\xee\xb5\x5\xc4\xf1\xcf\xf6\x17\x83\x66\xb3\xcb\xc0" +"\xcb\xca'r\xdb}[:v]\xc6\xdb\x8bq\x16\x10\x9f]\xf2\x10\xa8 \xae\xae\x41\x63gE4M\x7" +"\xcf\x9a\xe1\xab\x5\xa5\x64\xa6\xa9\xc5\xee\xd8\x13\x7\x80\xe9>\xf\xcb-\xf9\xee\x1b" +"\x85\x87\xd8\xfa\xcb\xdcN\x19'1]\xf3\xa8\x81l\x95_\x19\x41{\xf5\x8\xae\x5$\xcd\x4" +"\xacS\xaf\x19\x61\x9c\xd9\x38I^L\x7f\x2\xc2ki\xa0\x91\xf2\xf9\x81^O\x8e;\x95\xa6" +"\x10\xc3\xba\x14\xa6\xd7rK\x88\x39.k^\xdb\x8e\x9c\x33>&.\xd6\x82\xf2I\xe9\xdf\x39" +"[\x94\xe7\xdb\x99\x43i\xeb\xf5Y\x10?\x9b\xdeQ\xea\xab\xde\x38T\xad^g\x5\x1f\xbb\xa7" +"\xea\xe4\xd5\x96\x8d\x82S\x87\x32\xd6@s\x9e\x1f\x9\xd5\xc0\xd3\xd6\x19k\x7f\x39\x99" +"\n\xee\x1a\x43\xcf\xe9\x87.\xf0\xe9\x8b\xcb\x8d\xe9\x37t\x16%_\xf0W\x18\x8d\x9f\x15" +"s\x13\xcd\x65\x4Q\xfa\xac\x8a\x1f\xae=\x0\x81Jj\xa4\xad\xc5H\x17y\x98\xcb\xa4\xd0" +"\xf1\xfb\xb0\xc7\xf6\xb3w2`\xe6\x0\x1cv\xb6\x81g_^\xc4\x88J\x16m\xb4\x39\xeb%\xf5" +"\xd5\xf5\x9aq$\xf0\xb2\xed\x99\x16\xe>w\x9c\xb6:\xe2\xa7\xf1\x18\xe9\xb\x18\xb\x45" +"\xd0\x97\xbf\xdc\xb\xc9[\xc7\x90\xfc\x8d{2&k/\xe2/v\x87P-m\xa4\xe3Q\xa7w\x8c\xbc" +"\xcd\x31\xb3\xc8\x32P\xc3\xd2\x1b\x1Q\xb7z\x5y*\xb5\n_c[-\x93,1.\xabK\x1c\x6\xbd" +"\xff\x13\xcc`h\xe1\x41\xb0>\xe8\xd8\x63\x8eW\xd5\x9c\xa1\xd8\xb8\xcc\xad\xea\xc0" +"W\xce\xff\x7\xf\xf7\xfd'e\xb0\x85vwL?\xf5\x1d\x88Z\xa8iN\x14\xdc[\xffy$0\xd9)\x8b" +"GN\xe\x1c\xdb\xbdK\x9#A\xfb\xdaH\xd1-\xbf\xd9\x8b\xc2\x37\xe1\xaf\xf1\x8d\xfay5&" +"\x1b@\x90n s\x8b\xfd\xca\x16\xb5\x84.*\x14\x5\xb2.I\x90\x2\x4H\xbcK\x93\x9\x12\xe4" +"\xbe\xc5\x80(\xd9\xd8n~\x15\xa6L\xfe\x18:\x94\xf8\x1e \x88\xff\xdc\xdfS&\xbd\x86" +"\x83\xb3\x3\xee\x8\x45\x9\x41\xba@de\x85\x4=\x86=\xd7\xd4\xcf\xbt\xe6\xfc\xf9iv\xdf" +"\xef]&\x16Wv6\xa4h\xea\xa1\xf4\x1b\xae=\x82\xf7\x1`\xd0+(\xb3\x18\xaa\xa9\xbbtVt" +"`\xa8\xcd\x43\x6\x66w\x86\xf6\x96\x7f\x39\xbd\xb9\xf2\x10\xb5\xa8\x6\x8e\x16{n\xe1" +"\x94\xb0\xff\xc9I.\xc4\xef\xe9\x66%\xfdG\x0\x39\xa5\x95Q\xb2\x82\x84LV\x1b&\x85\x1b" +"\x9a\xf6\xb3\xf3\xa6\xfe\x9a\xefR\xd4*\x81&P\x4\xbb\x64\xda\xd8\x94\xa7\xd6\xd0\x43" +"g)3\x7\x62XVd\xe8\xe7\x8eL\xfb\xf8\x9\x91\x9b\xae>N\xc7\xb\x61\x44O\x8eh\xaf\x0\xa4" +"\x19\xeb\xb7\xb5\xaa\xf6hf\xa7\xdb\xe0jQ\x6\xe9\xe6?o\x19\xb0\x41z\xbf\x32\xab\"" +"\xb0+\xcf\xc'\xaf\xe\x89\x85\x33\x11_\xaehn\xaf\xca\x96(\xba\xd2\x63\x18\xf2T\xdd" +"T\xe8vsl\xeb\xce\x82}\xe1o\xd3O-\xf6\xaf\xc7\xa9\xf3\x9fZ\xc5\x1\x64\xb5\x0\x13\xf2" +"m\xda\x83-\x9\x1e\xe0\xf7r\xd9\x19\x9d\x31^\xbfX\x95\x7\x65\x8c\xd7\xfc\xf2)\x89" +"q\x8f,1\xec\xc1\x82\x9\xd3+\xea+)\xbd\x1a\x88 *\x7f\xbb\xcd\xca #\xc7\x9d\x7\xb8" +"\x86\xb6u\xb0\xcf\x82\x4P\xd6Y\x9a\xf7\x1\xc1\xf2:\xc1\xab&M\x9c\x62\x35*,\xf2\xdb" +"h\x85\xab\x1bw\x1a\xa2\xf2\xd0\x37\x83\x34T\xd0\xc6\xe6\xab\x9ex\x84\xba\xd1)Y\xf9" +"\xd6\x93X42Q^\x9cN\x8e\x17\x85\x1f)+XYv-\xc0\x93\xfa\xc6\xd1\xc4\xd7_\x83\xe6\xc4" +"|\xf7;_\xe3\x90\xa1\x61\xef\n)Bd\xe\x86\x83\xc3<\xbe\xe2\x92\xaa\xe8\xcb\xce\x89" +"\xe2\xc1\xe8\xdc\x99\xddK\xcc\x9aQ\x1a\x7f\x0\x45S\x81\x9d\x85\xc3\x90\xea\xcc\x95" +"\x96\xe6q\x3\xcc\xe2\xc2\xe8jM\xb0tb9f \xc1\x1bn9\x16R\xbb\x35\x8f\x82@\x1a{G\xfc" +"V\x93\xb8\x98\xdf~\xb1\xf7\xa7\xdf\x6\xbe\x16hd\xb8$\x98\xe7\xa4\xa5.]x\xe2\xb4\xe3" +"y\xcc\xe4\xef\x1a\xed\xdf\x80\x93g\x13x\xed\xb4j\xb0\xf1\xaa{y\xfa\x1c\xe\n\x12G" +"\x11\xca\xe6\xfb\xe2\xb5jt\x1\xe\xe3im\x11)i\xb8\x1f:\xec\xf9\x9b\xab\x36\xfa\x93" +"\x17\xfd\x9a.Y\n\x8d\x1c\xc4G\xcd$\xc4)\x95\xd7\xb0\x44T\xa8\xfd\xe2\xe5\x89% '9" +"#C\xa1\x17\x85x\n\xde\xb>\xeb\x8b\xb2\xb\x63\xd1\xbd\x61\xbe\"\x99\xf2\x64\xa8\xda\xa9>\xd1\x45" +"\xf1\xb6Q*u\xa3\xeeI\xd0\xeb\xf7?\x90\xebk\xc7^\xcc\x5te\xaf\x93\x1b\x30\x3\x89\x7" +"?T\xe5\xe0\xa5\xe1\x34\x6p9;\x83\x33T\x8f\xb4\xc9\x44\x4\xb1m\x8\x13\xa8H\x14%\xe9" +"\xad\x9\xbe]\x8aO>\xec\x62\x39\xf7\xb1\x41\xa0;B\x8d\x45\xb6\xe3\xc9\x81\xc3\xee" +"2\xa0\x65\xf2\xd1\x62\xe2[k\xb7\x9e\x9d\x46\xe1\x83\x8a\xa5\x10\xdf\x9d\x8cq\xf3" +"\xde\xe6\x37\xa9|E<\xc&\xea\x8a\xf6\x8e<\x0L\x8d\xe9\x97\xa6\xf5\xa0\xe2q:\xf2}\x8f" +"\x98\x3\x12\x33\xc6\xbf^\xf5\xc1\x3\xe5\xaf\x8\x62\xcen\xa9\xd5\x98\xab\xbd\x8\x35" +"\xb\x18\xd9\xea\x84s\x8due\xcf\xcf\xec\x7f\x97\x43\xb5\xde~\x9d\xe5IUU9\xb\n\xd8" +"\x9c\xe0\x1aZ\x5\xd6\xc5:#Z\xa3\xd8\x9c\xf3)\xb2\xf4\x35\xb\r\x98\xdaMIs\xcbYT\xc6" +"\xd6\x39\xce\x36~hwm[\xa8\xdf\x9ey[\xd9Q\xa2^\xb1?\xf3\xbd$F\xc8\xed\x32g\n" +"\x19\xf7\xd1pi\x94\xfa\xd9\xbb\x9f\xf4Hf\x89Q\xca\x2\xed\xbd\x95\xb\x82\x33\x0[\xaf" +"\xf1v\x8a\x1c\xc2\xa4M\xa8\xe0\x12^czk\xcbQ\xbb\x64\xaf\"\x7fj?|~\xbeN\xfa\x39Ye" +"\xd4\x9b\x13\xb8\xaa_\x1d\x41\xfa\xe2\x90M\x82\x9,l%\x88\xb3\x81\x82\x89\x1a\x39" +"\xd7/\x1e\xb2P\x82yc\xd6\xce]\xc8\x4\x93\xb3\xab\xab\xb9\x11\x18\x9aks\xec\nt\xd9" +"\xde\x15\xf0\xdd\x99/\xe1\x1a\xde\x38\x36w\xd0'\x92\xa7 \xb8>\xa2\x1a\xb3\xc6\x31" +"\xc9\xf7\x5\x8eit\x93\x6\xa4\x9^\xaf\xbd\x82\xb8\xdf!\x9eS$?|\xf2\xef\xb3\xc6~\x16" +"\x9fvc\x2\xa2\x8Mj\xb6\xda\xcb\xdd\x12\xa6|\xa3i\xaa\xa0-\"b\x14\x81\xc0:\x8d\x43" +"v=b\xd2\xbe\x32\x62\xd1\xaf\xba\x82<\xfd\xa9\x19\x92\xec\xf8\xc\xdd\x36VP\\S\x99" +"\x11\x8c\xa1\x35\x2\xd0;\x12, \xa2\xbb\xbf\x80\xaa\x66\x42w:bU_\xb7\xce\xe5\xde\xbb" +"\xae\x61\x1e\xb2\xd4\x43\xf2\xed\xc2K\xb1S\xdc\x63L\xb6\xd6\xb3rIrD[\xa3\xad\xf9" +"z\xb0u\xaf*\x95\xd2\xf1\xbbt\xcf\xb2\xdb\x1e\x43Q0)l\xee\x19\xbb\x8c\x15~\xb8\xdb" +"p\xbf\\\xfc\x1ey\x1f\x35\x31\xd3\xae\x33UJN\xdf\x16\x7\ns\x1b\xc8\xb7\xc7J\x84\xbb" +";\xe0\xf2\xbf\x45V\xc\xdat\xb4\xc1-\xd7\x18\xc6(\x3\xfbOJ\xba_\xe8\x9do|\xba\xaf" +"\xcf\xe4\xbbQ\x80\x31\xda\xcd\xea*\xe6\xc8\xd0\xc0;\xf6\n\x9b\x6\xc\xce\xbbHX\xe4" +"\xcf\xe1'\x1e\x31k\xf7\xaf\xb0W\x14\xc2l\xfa\x91\xbd\x96\xd0\x62-\xa3\x1e\xd6%S;" +"%\x2\x6N\xec#%{G\x85\xf4\xf0\x13/?D\xb0\xc2\xb8;\xb6\x42\xdd\x88R\xee\x7f\x37w\x95" +"n\x98G5\xf5\xd1\x61u\xc4\xa2~\x92\x82\xa4\xe4\xff\xc\xaby8\xd9!\xd3=\xc7\xe8\xb6" +"*\xe2J\x90\xb1&F\xb3\xa5\xfe\x88\xfd\x94M\x83\x9\x41\x1fn\xb3\x3\x1a\xbbg\xfc\x9b" +"\xb2\x88\x9a\xec\x45\x82\x10 V\x1c\x15\x19$7s\xb4H\xd6[\xbd\xad\xc1Z^\x15[\x8d\x1b" +"6\x8c\xbd\x97\xb7V\xa8\x95+B\x8a\x35\x8c\x39\x86\x30\xb4n\x8a\xfd\xae#\x85\x93\xc3" +"\xfdX\x9e\xc4kw\xb8\xd8.\xc7\xe1\xecZP\xcb\xc7~\xd5K\xc1\xe2\x42la\xd2:\x8X\x1e\xc1" +"\xd7\x1c\x9\x8\xf7u\x9d\x1d\xa9$\x1b\x8v\x18\xe9\xf7V\xbf\xb8`#\xda\xf9\xa7\xca\xc" +"N\xff\r\x45\xaa\x95\xcf\xdeZ\xac\x19w\x91\x1e\xc6\xb2\x2\xbbGT~;[\xf3\x32~\x95\xf7" +"\xe1\xa4\x86>[\x90J\xf4\xb3zR~4(,\xb6Y\xa2/\x85\xba@k\xcc\xbe\x30p\xeaS\xf6Z\x87" +"k\x9d\x1b\x9a\x10\x96\x41/\xef\x87\x6\xbet1S\xd4\xdc\xac\x16\x81\xa4\n,&Zr\x91!\xf2" +"\xd3\xfc\x9e\xfe\xb\\\x18\xe0\x2\x62o0#\xa5\xeap[G\xce\x1a\\Sq\"\xe7\xc3Z\xf7\xbf" +"1\xf6m\x5\xe1\xaa\x33\x62\xe6\x8c\x1d%\x9f\xca\xcd\x0y\xfc\xa7\xefP\x16TtN)Nh\x18" +"\xca;\xad\xcb\xae\xb8\x8d\x44\x31\x9f\xba\x90\x42\xe2Z\x82PY\x9a\x8e\xed^\x1c\xc" +"\xbd\x9fs\x9b}\xb3\x1c;\x18\x12\x81vP\xe7,\x97\r\x30\x90\xf8\x32^\\\xa0\x1f\xc8^" +"S\x10x}\xb8\xdb\xa0\xca&\xd7\x7f@<\x6*d\x7f\x9f\x99\x82\x46\xf2\x64\"\x37HY\xde\x43" +"T v\xb4Y\xb7\xfa\x82\x9d'\x18#$&%2\x99\xfd\x38\x86\xac\x4H\xba\x12rl\xca\xb4z\xf3" +"\xcd\xc6\xf\xb6\x9d\xda\x65\x13\xc8>\r\x12w\xab\x88ME\xff\x39vSj\x13\xad\xf8\x9\x39" +"\xcf\x1a\x1d\xb0\xa6\x34\x7f\x9aOv\xac&t\xadI\xa4n\xf1\xd4~\xe4\xfaq|I11\xe0\xa5" +"!,=K\xa1\x34\xa7\xa6\xcc\xaf\xf9\x98*\xbe\x9fy*\x91y\x87\xe5\x9d\xcd\x19\x84\xb5" +"\x99L\x8c\x89\xb3\xf9\xf0\x87\x8c\xc3\x17t\x89\xa3\xb9\xb4\x1e\x44g;\xb2S\xec\xde" +"\xb2\x8?B\x93\xed\x9d$\"<\xbf\xef&\xcc\xe5\x64I\x91XH)\x12\x87\x90\x82\x80m\x4\x8f" +"\x1e\xa9\x99\xab<\xb2\x16\xa5\xc2}`'F\x8b\x8a\xffKU\xfb\x31\x9f\xde\xd4\xee-0\x8c" +"\xf\x8c\x96\xfb\x7f\xec\xa0+q\x88\xba\xc0\xdd\xd4\xbe\xe0:W~\x91\xd2X\xea\xba\xd8" +"\x87\xbe%\xe7L)oc\xbf\xda\r\xa6p\x9a\xa6k\x81\x41\x89\x44<\x8b\x94+\xe5W\xf2``n\xe" +",\\\x8\"\xadJ[3\xfa\xcd+\x90\xac\x82jv\x8c\xcc\x37\xd2Y\x1d\xd2\x8f\x1e\x1`2\xba" +"\xe5\x87\xb1(I\xd2\xf9\xe5`\xe3\xf8\xc0|\xc5\xf%o\xf2\x9\xc9\xcf\xb3l\xf9!q>y\xcf" +"\x2(>\x14\xe5,\xdc:\xda\xd8\x1e-*\xdb\xfao\x1a,,\xa8\x1c\xf9\x7f\xb6\x8d\x61\xf8" +"\xc5\x1f\x8c-p\xc5\x9a\x94\r\xbc\x31\xa1\xc0@\x1d\x41\xb9\xc1\xe5\x90no\x9d-DF\xda" +"\x96\xd3j\rL\xc8\x97~fZ\xae\\\x43\x16W9\xb2\"k\xa5\x98\x7\xa4\xe5O\xe9\x90\x1d\x9e" +"=\xfa\xf5\x31\xef+)9\x8d-\x10\xc2O\xd2R\x9cGDi\xca\xf\xc1|,\x6\xf6p4\x85\x45\x82" +"a\x12\xe8\x34\x65K\xec\x7f\x3\x9d\x11\x99\r\xc8#\xc4y\xca\xf0\xb9\xffq\xf9\x83\x45" +"{\xe4\x88\xa3jT\xd9\xdc\xe4\xb\x83(\x82\xee\xf4\xb6\x98\xbb\x17XZ\xb2\xc9\x81\xb5" +"\xb4-\x99\xa5\x46\xa9\xc5\xbV\"~vxm\xbc\xc6\xa5r\x80\x9\xa7\x7\xa5\xc8\xc3\x9f\x65" +"\xbcm\x10GB\x96\xa9\x38\x33\xfe\xe3\x89\x92\xde\xdaL\xee\x62:\xb3\xe6rs{\xe8\x3\xe9" +"\x84 \x3\xe7)\xa9|\xff\xa1\xa1\"\xd9\xab\xb\xfaX}\xa6{\xa7\x0_Q'\x8e:\x6\xa7R\xf8" +"mZ\x8b/\rz\x87\x1e\xa2\x9a,;r`\xfb\x62\x1z\xa4JimY\xc6\xee\x91\xa1\x30" +"\x0\x35[\x92\x34\xcc`03\xddtWr\x97\x10\x8\x92\xfb\x8cwE\xdf\x45\xd1%\x3O\xb2hK\xd4" +"\xd4\x64v\xe4\x37\x65\x63p\xe1\x35\x37\x11K#W]\xa9\xab\x9cW\xcd\xe|C\x86PI\xc3\xfb" +"\xea\x9b*\xd3X}\xa4\xb5\xb0!8A\x15\x86t\x8\x66l\x11\xc1\xbc~4Z\xf1\xddJ%\x93\xb7" +"c5E\x1fW\xfc\x6!\xe2q/\xa2\x31\x12\xc4\xec\xfc\xaf<\xdcXq\xd3\x92\xfc+?\x9\xed\xb5" +"\xb8q\x5\xb6\xdeK\xf2\x65H\x92\\\xbf\x45\x95\xbb\x7$)\xb3GXk\xfa\x43l\x10\xd2T\xe4" +"\xcd\x15\x42\xad\xc1\xf7,\n\x15\xee\xe\xb3\xe2\x1d\xe3>\xd4\x19/\xbc\xe9\x5\xd1o" +"\xba\x12\x2\xe4\\\x0{\xd1\xbaZ[\xf4\xf4V\xa4\r\"\xd0\x32o?\xa5\xf5\x7f\xe5\x33_{" +"\xd2\xd7LF\xc2\x32M\x9" +"@\xa6\xdf\xd0\x66}\xc4\xc4\x83\xbe\x82\xab\xf8\xe5\xed\xdb\xde\x2\xf5\xb1\xa1\x1b" +"\x1e\xc4\xf2 \x1c\xa9\xfd\xa9\x7z\xa5\xbe*c{\xaa\xe8:\x18\xe0\xd0z\xca\x46/\xe5?" +"\xab\x32HLMy)\xf8\x30\xb6\xef\xd7\x89\xb2#\x11\xb6\x14\x1a\xa2\x7\x92\xc2\x96\x98" +"\xc0\xc0\xc9h8'\x87L\x80\xb9~l\x8f\xaf\xc6#\xf8\xe2wo45j2\xc0\xe7\x61>\xbfI\x1b\xcf" +"\xaa\xad\xc4v\xec.\xb9\x4\xc5.:e\xd6\x1f\xcfM;\xaa\xf6\x8d\xd8\xa2\xdf;k\x99X\xad" +"`m\xbc\x16\x65;\x13\x4\xf0;\xac\x8e\xe4\x99\x34\x92\x87\x93\x93\xde\xc1\xc3\xb9\x93" +"\xf\xe\xdc\xbaUB\xc2*\xf1\xaaMuOe=\xc8\xe4\xf7j\x92\x98\xe0\xae\x85\x9cl\x13\xf8" +"\xab$\xb3\x34\x9c\n\xbe\xce\xc2\x9e\x89U\x16\x85\x9d^'ls\xfc\x38\x4\xd1\x94\xec\x15" +"L\xaa\x7f\xb3\x80\x38\x9\xc6\xd6i\xd8l\xb7Z\x1\x9\xa2_\xd4\x81$\xbe\xf\x89\xcc\xd2" +"G\x99\x61\xfa\x11\x14M\xb0\xd6&\xe3/\xee\x84\xaa\xfe\x9f\xf7\x93%L,(\xcc\x32\x8\xe4" +"\xc1;\xf3\xfe\xef\x16]\xe8\x43<\xd6\x30\xf\xc9~\xd2\xe\xbH.\xfa\x38&~\xc\x19\xa8" +"\x2\xa7\x95\xc6\x2\xa0\xf3M2t\xde\xdf\xc3\x92\x89I\xf1m\xd1[\x81\x1f\x61\xd6\x82" +"\xff\x30<\xb\xe3\xc9\xb1\x42\xe4\x34\x89~,%\xc9k\x9b\x31;FB\xe6)X\x81\xa5\xa2\x66" +"\r\xae&r@\xe8\xfd\xe3\xa4\xb5\x8d\xfa\xa1\xc\xaa]\xe3\xa7\x30Hg'\xa4\x3\x7\xb4G\xb" +"\x94\x62\x45\x12H\\\xee\xcd\xa1\x9c\x9d\x9e\xbbh\x82R\x97\xac\xa3z\xa3\xe5\xbe\xc4" +"\xc4\x97\xb3]\xc1\xe\x86\xbb\xb9\x32\xd5\xe6\xa0?\x95\xb\xf4\\\xb1\x9a\x9f\\\xf7" +"#O\x89~\x16\x34\x91\xd7\x33\xb5Q\x7\x90\xeb\x10\x18U\xb4-\x82\xd2\x33\xde\x46V\xe4" +"\xcc\xc1\\p\xd3\xc1\x9a\x36|~\x8c\xd9w\x12R\x8\x31\xff\x30.Y\xc6k\xd6`\x81\x92\xc2" +"\x9b\x17\xf1%\x87jM\x0\xf8@Lt_6\xb8z\xba\xaf\xb4\x1b \x85K\x8aqAzE\xbe\x9am\x9d\xff" +"q\xacI5\xe7\x9d\x30\xe6\x65~w{\xff\x19\x36=lX\x88)\xafVK\x1b'xK\xf9\xc5\x16\x98\x17" +"\xed!\x83\xb0\xcb\xd4\xberW]\xd4\x84\xbfm\xc8\xa9#OT\xbf\x7\x9dY\xd5\xb8'\x96\xce" +"\xe3\x8e\xfd\xbc\x30\xd9\xf3\x9d\xfP\x5\x82\xf2Zr\x9a\x1f\x86\x2\x1d\xdc\x17\xe0" +"\x1t\xd8\x42\xd0_!\xc4\xd6\xf5\xd0w|\x99\xfd\x99\xf5\xbdz\xebJ\x8f\x89\x97\xb6\xae" +"\xa5J<3l\x8ehXZ\xb5\xf6Td\x8e\xf3\x5`\x12\xf3[\xd4\xb3\"\x89ww\x80`&\xa0\xd4\x5\xf0" +"\xea\xab\x93\x61\xd8\xd6uO\x1b\x66\xe\xee\x9\x16\x95\xf3\x9b\x8f\xa5\xf6\xfb\xa1" +"\xd5[38\x1aVtG\x90k\xde\xe9\x89++\xf7U5?\x89<\xd9\xd9\x12\xbb\x8c\xcf\x1e\r\x30\xcc" +"\xa1\xc6\xf2\xd3\xffU/V\xacu\xc3\xc6\xe8\x92()\x10\xda-\xf6Pr?7Zh\xdc\x9e\xb6L\xa7" +"JQ'A\xc4\xa6R\xb2#\xdb-%\xca)\xd2r\xed$\x19\x94L/3v\x99&\xd6\x9f)\x1d*F-\x10\\S\xde" +"\xe4\x39\x91r\xc1\x1a\xa0v=H@\x15R\xec\xbd\x9c\x8b\xab\xe6\xb4\xda&\xe7\xf9\x62\x33" +"U\xe4\x30v\x82\x84\xfa\x9bSfz\xb6{\x6!l\x5\xeeT\x16X\x92\xd5\xcc\x44\x35\xa0\xe5" +"\xfe=\xb1i\xb\x8cpC&\xde\xf9\xe9\xe3\x1a\x65\x9a\xe2\x6\xf8\xc6\xc\xfd\x66?\x91h" +"\x85\x81\xa0\x17\x9c\x9b{\x9d\xab\x97\xe1\xbf_$\xfd\xa6\xed\x33\x94\x33\xaf\xb2\x8" +"9E\x8d\x18\xbe\xd5I\x1b\xe9\xfb\x11\x8b\xcd\x33\x61\xcd\xcf\x3\xdd\xf6}\x11v\x7f" +"\x7fzB\x13\x46\xda\xcfq\x1d\x37[\xf5\x19\xfc\x93u31\xe1\xa0\x91\xfd\xf6\x3\xca\xb4" +"\x1f\xelH\xe1\x0\xe7\x81W\xe0~\xb1\xb\x30\xc6\xf3P\xa1\x46\xce\xc0\xd3\xd1\xd0\xe9" +"D\xa6\x9e\x85 \x92\x90\x9f\xa5O\x1b\x43w\xadGh\xfb\xeb\xdfS4\xc8\xf1\xe3&\xec\xb1" +"T\xee\x6\x85\x83\x42\xa2o;X\xa9\xe0\x14\x1dW\xc2\r\xf8\xc4vk\xe3 <\xed\x1ek$\xfa" +"*\x98\xbc\xa3\x91\xb8[\x7fW-I\xac\x38\xe4H'3roV\xd5\xef\x42\xd3\xc9R\xdb\x9d\xb8" +"-\x91)\xdc\xc3\xbK/\xcd\xd2\xf\xcap6I\x7p\x1b\xd1\x90(b*:\xedrV\x9c\xd8\x30~#\xe4" +"\x8ej\x9d\xf0M\xa2K\xc0\x46\xc\xf8\x8bu\xde\xe4\x37\x9a|\x0:l\xba\x11$\x15\x38\\" +"C\x5\x8a\x46\x89\x9d\x63\x2\xabV\x5\x36\xe5\x9cg\xf4\x62R\x8a\x81!=\x9c\x90\x9\xfd" +"9u\xa3\xb6\x1\x41\xe\x98\x9e\xfe:h\xe1\x65\xfa\n\xe6\xdd\x9c\x3\x61\xe0\x62o\x18" +"Q\x7~\x8e\xd9\xfcL\xd7\x66)\x1c\x7f=\xf8\xe5\x1e.\xb3\xb8\xe9'G\x98\xf3.-\xfa=Z\x8" +"\xab\xb6\x10\x61\xd4\xca\xf4\\\xc8\x37\x30\x97G\xdf\x9b\rV[4\xd0\xc0J/\x9e\xcd\x64" +"\xf0\xdf\x42,s\x8\xed'\xa7\xb5\xfb\x8a^]q\xc3\x0\x39\x14\x64=%\x88\x95\xa0\xe2\xf1" +"6\xc0._\xc6\x65\x9d\xeelx\"\xda\xc9?\x8e\n\xa4\xb5\xa5/\x9\xc2\xf4\x9d{\x9aq\x92" +"\xa2/\xe8\xef\xc8\xf5\x14-7\x91\xd3\xe1\x1b\x88\xfa\x8c\x9a\xfc/\xc5h\xdf\x2\xc4" +"\n\x10\x9a\xb9NY\xcd\x46{\x9b\xb\xd9\xf9@\x3\xb2\x1fR,\xb5\xc8\xb1\x91\xa3r\xefU" +"\x83\xe6oR\x17\xa6]<{\xaa\x13u\xd5\x9b\xbdT\xdd\x9a\xf7\x13\x95\x1\xb7J+\xa7K\x87" +"\xdb)\xacx\xf1\xaf\xa2\x1b\x81\x7+X\xca\xc2\xdf\x32\x9fZ\x7f>\xddlB\x83\x9d\xb1p" +"\xcb\xfb\xfcW^\xf1r\xb3\x9c\x18Y\x87\x14\x1f%}\rm\x90\x9c\x1a\x95\xfe\x10\xd3\x13" +"\xb8\xc0\x84k\x80\xc0~\xd5\x12J\xdf\x1d\x36\xadz\xf7)\xde\xc0R\xb2\xe6\xc6\x16\x9" +"!\x1e\xe5vEJ\x86\xa0\xc2\xe6\xca\xcl\xf\xf1\xda\xba\xb4\x91\x43\x8b\x32`\x88\xd1" +"n\xa1\xff\x32\xe6\x98q\xcd?Z\\\xef\x38H\xb7\x34\xee \xe2Q\xc\x97\xc5u;&)\xb9\xeb" +"0,H\x83\x19\xe3\x84\x16lY%~\xb0\x45J\xf6\x96\x1b\x87\xa7V\x9a\\\x82\xe1\xd9\xf1\xbc" +"\xd8\x43y\xa5\x90\xb4\xb4\x11\x66\xa6~\xcf\xf4H\x90\xc1\x5\xd1o;\xc8\x99\xb6R\xfe" +"\x11PE\x98:\xc7\xf6\xb7\xd6;S9\xfa\x99\xce\xf5\x88\xf8\"Qn\x13Z\xb4\xf\xcf\xae\xe9" +"\x5w\xbd\x87\x8f\x92\xec\x14;\xdb_\xe5\xff\xaex9\r\xdc?}\x83\x61u\x9d\xfb\x39\x96" +"\xaa]\xfd\x33\x1d\x9b\xa3o)\x1\xc6_^Jl\x95\xa9@\rc\x16\xadt^h\xc\xf8r\x9f#\xbf\xe0" +"\xb1\x1b\x14\x8ct\xb6\xc\x36\xc2\xfe\xd2\xebq\xec_\xafM\x5\xae\x96!3\xc1\xb8wm\x1d" +"W\xbb\xf4o\xba\x30\xa1_34O&\xdd\x85\x41\x1b\x16Tn\x1c\x9d\xd9\x63\xf1\xb3\x34\x2" +"l\xdb\x9\xab\x97=\x1f\xa6\x15\x38\x18G\x1c\xd3\x10\xd7\x35u\xd3\xe0\x39\x2\xf0\xbd" +"\xf0\x4\x8f\xf5\xef\xd1\xbe\xb2\xe8W\xf8 \x84\xb7\x43\xe1\x0\x91\xd3\x37\x45\x93" +"\xba\x94M\x5\xee\x97\xbf\n\xd7V\x8b\x45\xa9Z$\xf4\x9f\xb\xa2\xd9\x37\x14\x85ve\xea" +"\x9a\xc4W\xa9\n\x63W\x7fr\x93\xfc\xc0\xd5\xbd\xcc\xdf\x61\n\xa8#\xf7\xdb\x43\x11" +"\x92\x63\xfdY\x1a \xf3\xf6\xd2\x61$\x12\xbf\xb5x=\xb3\xc0\x86^\xec\xd1\xe7\xc2\xca" +"P\xd9\xde\xa0\xba\x8aP\xa4\xa6\x9e\xe6x\x99\xbf\xa6\xb1\x1b\xc5\x8b\x31\xc9\x8ak" +"\x8c\xd6\x36\x33\xddk\xa6\xe4\x1a\xff}\xe6\x44IiB\xb7\xe8\xc3\x33 \xc2?\n\xaa\x8" +"\x10\x98\xd5U\xdf\x9b\xf6kJ\xf6\xcb\xa3\xa7\x1f\xc9\xfd\xb0\xa1\x94\x97\xea\x0\x17" +"\xdf\xa4s\xbf\xf4\xadk\xad\xbcm\x97\x11W\xce\x98\xfe\x12<\xa2\xa5q\x1e\xf9\x36\xf" +"\xea\xa0\xf4\xc`i\xd1[[\"O2\xf7Ie\xd9\x7f\xd4\x81\x5\xf4:\xd7M\x8\xb0\xb2\xbe\xef" +"\xbc\xb3\xd3\x1\xda\xbep}\xa2(\xe8\x2\xc2'4%N\xce\x98\xads\xc0\x80\xda\xfa\x9\xdf" +"\x15\xb9\x34\xb\x84\x15J-\x1b\xa6\x99/\xed\x36t\xaa\x9a\x9e\x0,M@5;\xdf\x87\xed\xb7" +">a1\x8a\xa0\x3\xae{8\x8f\xe9\xf8\x65o\xdfW^\x19\x5\x9r}\x83\x85\xe5\xb\x87\x1c\xcd" +"\xfc\xd4\xfd\x18\x13\x80\x1b\xfd\xfds\x87H\x4!3\x8~\x98\xa8\xc6@\x83\xa4\xb9\x8Y" +"M\xec\x38\xac\x9cn\xfd\xd2o\x1e\x13\xccY\xa2\x3\xab\xd3\x88\x7f\xff\x6\x38\xc5\x10" +"\x82\xd3*2\x8c:\xac\xcaY\xe1s\xd5m;;\xf2yv\xc6\xbc\x95\x45r\x89\r\x80\x92\xe9>5\xf1" +"\x88\xe2%]L\"=]\x9f\xca\x45\xbd\xf4\x33\x12\x1f_\x8b\xdb\xc3\x84\xf1\xc0\xeb\xef" +"\x83\xa8\xce\x7f\xa1\x86\xd4\x13\xd7\xfb\xdez\x9d(\x18\xee\xe5\xa3\x5\xa5z\xfb\x63" +"[\x8f\xf6\x63_\x17\xcb\x3\xb\r)\xeb\xd1\x9c\xe2\x9c\xd9\x32\x3J<\xc\x9\"\xc7 \"\x88" +"\xf2\xa3\xa1=\x1b\xbe\x38Pjt\x4m\xcb\xac\xf7\xd8\x9a \x1x_\x12\xf3\xd8\x85\x87\x1f" +"\x99P\xae\x34\xed\x2\x8a\x98\xb5\x37\x34\x3\xbc\x13\"\xd1\xf2\xc5\x83\xa8\xdc\x11" +"\x82KB\x83\xc2\x33\xc8tO\xd5l\xb2\xf\xd6\xbf\r\xdfv\xfe\xf1\xd0\xec\xa5\xa8uZ/\x15" +"\xdf\x3)\xd0\x98\x3\x32\x83\x66J\xef\xe0\xc5\x9e\xda\x92\xbb%\xe4h\x11\x82\xe2\xc" +"\x0\x8cs\xf9\xc7\x36q\x1f\xdf<\\\xa4\x1a\xccp\xf3 \x94\x9d\n\x32\xe5\xbd\xb\xf4\x82" +"\x9d\xe9HH6\xc8\x18\x35\x42\xf1+\xec\x32\xfc\xebZ;\xfd\xbb\x1a\x19\x38\x31\xcbu9" +"\xfc\x12\xf1\x81\xfa\xb9[\xa6\x10\x37\x98!\xa9\xa0'\x91\xdb\xa3\xb2\xf1T\xd1\x37" +"\x88\xbd$\x8d;\x94i\xdf\x1\xbb\x9f\xfd\x8di\xc1\xe\x34ws\xc7\x81U\x9b\xa7\x7fP\xc1" +"r\xe3-\xd7z\xde\x64 .\xa8\x8f\x9b\"\xcc\xff\x86\xf1\xf2!t\x1cL\x9d\xe7\xeeq\x9c\"" +"8`De9H\x8en\xcf~\xec\x8cq\xf8+*;T\xda\xd1\x91\xdcyr\xee\xc0\xa5q\xe8\x39\xc7\x33" +"\xae\xbe,U{\xee\xb5\xa6\x9b\xff\xa2\x64\xd6\xf?m\x1a\xf9\xfa\xe5\xe6\xdaU\xf9\xb5" +"\xe5N)\xc9x\xa6\x86\x8c\x2\xf9\x36\xb8\x9c\x8b\x11\xca\x87me\x95\x86\x1d)?\xe9\xa2" +"P\xe7#\xa0\x97\x16\x16\x7f \xc0\xf@\xa3\xff\xab\x37\xb2\x36\xcd\xb3i\x1e\xda\xfe" +"\x96~r\xa6\x9b\x87\xf6\x9d\xb6\xe9\x8d\x32\xc9v\xf9\x44\x85uFL\x16\xf4\x36\x66\xce" +"Dv\x84\xb\x89\xc8\x80\xac\xc1Y\xe7\xea\x96#\xc9\xc4\x9cL\xae\x91\x1b\xad\xda\xf1" +"(\xe4\xe3\x36\xe4\x1b\\v\xd4\xdf\x94\x64\xf7\xa6j\xc0xr\x80\xf2{.\xa2\xcc\x3\x63" +"}j\x9e*\xc6\xd2\x8b\xca\xda,]\xcb\x42_\x99\xa0\xb7\xb7g{+y\xc4\xf5\x94x\xc1\xe0\xbf" +"\xd2J\xef\x19\x96!\xb2!\x17\x83\xcc\xc1\xb4\xdcV\xda$\x12\x3\xb3\x99\xcf\xbc\x46" +"\xa8\xc\xd1\xd1r\xc2Zv\xb5]\n\x7\xc\x0\xa1}\x9e\"\x0\x19\x12\x1c\xf0l\xee(m5\x82" +"\xfa\x2\xf1Kl\xe\xd7\x8a\xe5+\x96\xfg\xd6\xd5\x33\x1cNo)\xc5\x1a\x14\xb4\x1qHt\xd0" +"\xdf\xe0\xfb$\xd2\x64\xe9\xf7\x5\x81+\xc6{cJ\xd5X\xec#G5Vb\x3\x19\x9d\xd5X\xfeR\x97" +"\xcf\x1c\xf5\xcdT\x92\xc9\x30V\xc5\xe0\xa7\x12&H\x1f\xe1>[\xba(\xb1\x13\x94\xfc\xed" +"!1\xee\x45\xef\xb3~\x12\xf0\x63\x83R\xeah\x8c\xc6\x88\x1b\xd1\x82\xd9\x9L\x88U!\x11" +"\xbf\x87\xf8\x8e\xbb\xa5\xae\x96y5L\xdal\x88\x88\xb1r\xd4\x66\x35\"\xf\xb9\x84\x95" +"\xb2\x64i\x0,\xb0WZc`\xc4\xb6\x90\x96r\xac\x6\xf7\xe\xc5\x88\xdf\x11{\xea\x7^\xc8" +"\x9e\x86^Wz\r\xef\x15\x80K\xad\xb8\xd4.\xf5\xc6\xd6\xfbp\xeb\xfd?I\xa5\xb2\x18\xbe" +"\x90\xda\xcbz\xb6%\x35;\xd5Nh|F\x17\xfc\x10\xa5\xd5\x1\x7X\xc6N\xa0\xd6X\x1fO=O\xcc" +"\xb7\xb9\xc\xa9\xc8\x85\xb0(\xd2\x9f\x83\x8aR\xad\x11R3\x10\xa8=a\xa7>r\xa9\xb1." +"\xe9\x41\xc3y\x6\xe3{^?Z*\xab\x32\xf4\x10V\x1f\x36\x82\xa8\x1c\xcf\x95\x9e\xc6=\x96" +"\xb8\x9f\xdf\x96\xa7\x8a\xb0K#nP\x5\xba\xccyt\xf7\xc6.\xea\xa2\x45\xac\x41\x95\x8c" +"\xa8\xfe\xa6\xad?\xceS9\xe1s\x9aS\x12yd,\xeb\xa4&\xeeM\xda\xf9\"'\x11R\x8LL\xd0\x8e" +"\xde\xf5\xe\xdb\xfa\x39\x9d\xe4\x97(D\xfb\xa6\x82\x87\xdf\x1a\x1d\x98x7t\xf7\xb\xa7" +"eZ\x9f\x89\xd6K\xab\x11\xad;UE\x9d\xb4\xabvc\xe2\xad]\xfcx\xbe\xe4.\x88z.v\xb5\x11" +"\xa1Y\x81.H\x91Y\xac\xca/\n$\x9a\x41+\x1e\xe4\xa9\n\x46\xdc\x9f\xf8\x32RZ\x9b\x9" +"\x13$J\xc3\xceY\x93\xe1vt\xd1\x66\x5\x63\xc6\xd5Mf\xb5\xdd\xe6\xb6J\xa7o\x0?\xf3" +"S:F\xeeV\xbb\x91;n\xfe\xe\x9d\xa6\xfaNS\x19\xb6\x7\xd5>\x9d}\x96\x36\x80\\\xf8\xc3" +"\xb3\x94{\xf1\x95\xea%\xcd\xe5G\xb4\x45\n\x9e\xb8\xac\x84\x14n\xf5Mv\x93!0a\x89{" +"\xc9n\xd8!\xfaW\xc0\xbd\xa3$O\xe4\xa1\xee\xa3\xde\xf6y\xf4^\xf9\xf6~\x10\xb5\xde" +"\xcd\xd3\xe4\xbe\xc8\x97\x1\xf5S\xbbK\xccmM\x1e\xf\xb8\xc9\x9\xb\x96\x61\x19`Y\xb1" +"\xbf\x1a\xbf\x1b\xe0Mkt\xa5\xccW\xe4\x9q\x88I\x11\xf4R\xc3;X\xcb\x4\xf2\xc6\xfe>" +"\x1dq\xbf\\\xb1>u7\xd9\xfame\xea\x93^\xd5\xe9n\xf7#c\xbfx2*\x8f\x87\xbfz\x11\x8a" +"\x9d\xebq\xb7\xf2\x46\xaagl\xdaR$\x9t\xe6\xe9\xda\x44\xd6\"\xe4\xf2\xa4=u\x11\xb8" +":\x1&\xb2\xb9-\xb\xf1\xb0(v\xe5#\xd9\xd0\xa4\x92\xb5\xa6=\x96\xb1\xf4~\x96.\xe7\xac" +"\xa6\xfb\x9d?\x9a\xecG\xad\xc5\"\xda\xe8\xaaq\x8b\xc5@\xcf]p1\xa7\xd3\xd1o\xfo\xf3" +":\x97h)\n\x90\xa5\xfc^h\x95\xcf\xf9\xdb\xab\x42\xa7p\xbd\x11\xb7\x87\xb5\x7\x8d\xb3" +"\xde\x91\x7f\x92<.\xb6\xea\x11\xe7\x61\x36\xa8\xbe\xe3n\xb7\x84x\x8e\xa3\xe2\xb9" +"\xd7\xbe\x95\xe6\xd4$;\x16lILKuLm\xd1` m\xba\xf3\x99\xaeI\x2\xd3\xdc\xa7\x42Om\x1e" +"|E]V #F]\n\xa9\xde\x46\xb\x18\x66\xd7\xa5+Z\xf7N\x92=/\xbbI\xc4G\n\x9e\x18I{\xd3" +"2\xf3\x65\x88\x6\xed\x19\xc6\x7\x7f\x4l]\xc0\xd0\xbc\xcc\x1d@\xdd\xd2\r\x1d\xd3\x66" +"'\xd5\x39O\x9d\x38\x15\x9c\x84u\x1b\x35Z\x8eHuLm\xd1` m\xba\xf3\x99\xae\x46\x9b\x9c" +"\xc7\xbd\x8e=\x14\x14y\xa7\x1*\x4_\xf7-Q\xa4H\xfd\xff\x39\xd7\x8b\xe6\xff\xc0\x46" +"\xe5\xcf\x7\x64L~\xd0\xa1\xb8\\\xc2\x39\x8d\xf:\xd5\x42\xd1\x10=-\xe1\xf3\xb3\x41" +"\xbe\xc7\xd2\x86t\x96\x1fk}1;\x85\xf9\x8\xf2OM\x18\x8\n\xb2\xc4la\xf2\x15U|\r\x81" +"\xfd\xa6vuR\xc2\xb\x3~\xb4\xc9~9\xddQ0\nT\xcf\x30\x1a\xf3\xae\x93\xdd\xf\x95\x8d" +"B*X\xe6h\xe9\x1e\xb1O\xb2\x95\xd6\x92?\xfd\x65\xa2\xda\x9a\x88\xfa?\xe7\xf9\xad\xe3" +"\xd7\x33\xf9\xee\xb5J\x12z\x12\xf0\xc7\x91\xd0\x9f\xb1/\xd0&\xe0\x9a\x82\x32\xca" +"\xbe\xc8\x9a\x8f\xf3\x90\x84\xfe\x11\x17\x95Q\x8e\xc8\xbe\xab\xcb\x9e)I\xd3\xc5\x84" +"V\xff\x16\xdd\x18{\xc9\x6\xed\x19\xde\x8fmj*c\x9e\x1f\xd6k\x2\xc\\\xa8\xe6\x9a\xde" +"\xb7\x7f\xc5\\\x84\xadX&\xb2\x91\x9e\x9\xbd\xd9\x9aS\x7f\\\x92\x43z\xa9\xad\x18~" +"\xce-$])\xa9\xa0\xd5O\xf6\xecxA\xbb\xe6\xd3\x9d\x1e\x6\xb6\xce;\x19\xea\x98\x82>" +"\xc\x31\xa1\x8b\xc5\x64\xdd\xe2\x18\xb9$\xe3\x8b\xafu)\x92 \xb2\x81\xca\xbe\xc\x94" +"\xb@M\xbc\xf5M\x19\xec\xd6\xf2.\x99\xe9\xec\xbf\xcd\x8a^\"])\xd4S[ \xe4\xfbi\xb6" +"f*:\xf1>\xc3L\x1bX\xb8hJ\xa0\xc7\xce\x8d\x84\xf6\xe7\x11SHa2\x8a^Fs\xd4\xbdl\xd0" +"Y\xa1j\xbf\xd8\xe1W;\x9j:\xaa\xea\x32tGO\xb3\xa9}\x7f\xfb\x16x7\xa3}\xf2\xbbi\xf4" +"\xd5\xc3\x1a\x1b\xc9\xf\x7\xb0\x45\x8e\xf6\xc8^Q\xcf\x61\x63\xa4\x9\xd0\x1fgQ\xa9\xb5\x1b\x1f*q\xa1\xb9\xa4\xfd\xd1\x91R\x7f" +"\xed~%\x16\xc9^\xbf\xf0\xe7\xc2\xce\x92\xc5\x3\x99\xe1\x83\x86\xed>\xe3\x9aH\xb2" +"\xda\x92P\x13\x89\xcb\xc1\xf6P\x18\x41\xe8g\xf8\xb9\x15\xa3\x34\xa0\xab\xb7\xa9+" +"+\xe3\xaf\x10\xde\x37\xcb\xa4\x82?\x93,'y\xc3\xb0\x8\xaf\xb6^\xc0>\xdc\xec\x84~A" +"*\xf7x\x7fp\xc7\x9a\xc8LX\x1N\x8d\xe\x41\x64\x46\xb3jP\xc9\xe6\x17W&F\x8d\x9f\x39" +"\x9a\x18\x61\x43\x1a\x8b\xd3\x11\xff\x5gr:\xa3_\xbb\x65\xb\x17\x36\x63\xba\x31\xbf" +"\xf5X7_t\x3\x46!k\xff\xd4r\x98o\xf3{\xeeJ\xa3gVE\xa8>\xab\xe1\x85:\xa0\x61\xfb\x36" +"\x14\xb7\x8c\xc7\x80\xa4q\xc3\xc0\xf5\xda\x37\x8c\xa9\xc\xe6\x7f!${\xc1\x5\xa3\xbd" +"NJ\xff\xf4\x39\xfc\x15\x8b\x9a\xa9\xf\xd0\xe8P\xb1P\x83U\xbf\x1R\"Z,\"\xaf\x9e]\xed" +"\xf0\x38\xf2\x8a\x11\xa2\xa5S\x12\x8c\x94P\x86\xe8KJ\x14\x66\x17\xe9\x5\xa3\xa1o" +"\xaaH]jWI\xa7\x6z\xec=-\xef\n\xad\xa7\x43o\xb1\xe1\x85\xbc\x66\xd0\xe3\n{\xb3:\xf4" +"X\xe6\x5\xec\x97\x8d\x14\xb6\x18\x1d\x8d~\x9d\xeb\xe2wQ\xa6\xf5\xfa\xc1\x15\x94\xf6" +"`\\\xbe\x63\x8d\x9a\x98\xabl\x1c?l1%\xa5}\xc5QX\xdb\xa2\xbdM6\xfe\xbe\n\x85\x90\xe8" +"\n\xfc\xbb\x13@\xc5U:f\x8e\xf2\xd6\xf5\xb4\x30Z\x9d\x8d\x38\xaf\xbdWY \x9f\x9e\xb9" +"\xcd\x1c\xee\xf\xbe\xcem\xe7\xad*\xaf\x9m\xbeG/\x83\x38\x9dt?\rz\xad\xc6t?vF\xf7" +"\xbf:\x9fs\xa2:C\xf3}G\x1a=m\x12\xde\x84\xe8=,\xf5\xb4\x1e\x84\xf1\xac\xc0\xcb\xc4" +"\xcdR\xd0\xce\xc7\x38\x8f\x34\xea\xd4{Ei*I\x18\xb3\x65\xeb\x9fn\x81=\x92#\xa9_\xec" +"\x8d\xe3\xd3\xed~\xc8R'\xf8!r\x12\xbe\xc2\x18\x93\x5?t\xe6R\xba\xe9)\x9ep\x9f\xd2" +"[\x9b\xcb\x82\xe8`\xc0\xc5k\xce\x1fxq)b\x8e$\x99\x13\xf\xe6\xefvA\x8e\xda|\xc6H\xd7" +"i\xc6\xf5I\x84\xde\xa9*\xf4wn\xba\xdb\xe1\x61\xd1\x80\xda\x9e_=e\xca\xc4\xa7\xa4" +"\xe\xc3\xa3\xa7\xc2SX\x15\x97\xb6\x9eu&\xf3\xe1\r\x61\x9e\x61O\xc-\xc4\xf6\xfe\xba" +"7\xc1\x95%\x18\xfe\xc1\x1b\x39\xfb\xd1=\xdc!\xfd\xec\xca\xaf\x95\xca\x8f\xb8\xd7" +"\xd6\x8\x9e\x1b\xcf\x9bWM\x9d\x8f\xe5\xc2Z\x82\xa0\xb6\x8b\x90\xf1@\xb9\x34\xebX" +"Z\xf7\xbc\xf8\xc8\x8f\x9c\x1c\x1a\xddt[\x2\xa7\xe1\x9d\xb4@w8\xa4\xed\x92\x8c\x83" +"q\x80\x5\xa4\x1\xb7zVb+l\x8d\xcb;&\xcb_\x5\xec_\xba\x7f\x85\xb0\xa6\xa8\x1a\r\x8e" +"u\x88\xe\xf3W\xd7\xadU\x12\x92\xd3|~\xea\xbdr \xafq\xed\xf2gv\x5q\xcd>9\xaf\x32\xb" +"\xbf\x13\xc9\xdd\xd8\x5>\xf4\x1c\xc8\x1e\x42[2\xdb\x2\\\xc6\x66I\x5Z\xe1\xc6\xbc" +"F\x8b\xdc\xd6\xd6\x9d<\xe3\x34\xd0\xb7\x8c\x45x]\xfbp\x9f\xf9\xa7zF\xa8\xc6`\xf6" +"\x84\xd6\x1b\x36\x43\xb2\xbc\x83\x8bn\x98=IP\xae Cas\xe9=\xb3r\x17!To\xce\xa7\xa2" +"C\x90$\x5\x13\x0\x6q71;$$\xe1\x62~\x5\x35\x32\xbd\xb9\xca\xeeQ\x9e\x9d#\xedg\r-^" +"\xf3gO\"]Q\xe1\xed\x8e\x8,_\xc9\xf5\xf9\xb9\x34\xc0#\x8c\xf6[=\xd3\x64\xb4\x66\xb2" +"\xae\xae\xa3\xd3$\x1cY\xc9\xcb\xd3\xeb\xf9\xea\x9a}\xfa.\xea\x9b~\xe8o\xf~%l\xed" +"\x10\x99\x37Q(aP\xe6\x63X\n\xbbT\x11G\x83[\x9f\x14\xb2\x1fR\x89\x99\x16\rI-\x9et" +"\xb0\x1bU\xda\xb2\xc2\xe2\x64?_ \xb0\xf4\xecN\x8a:-\xf4z8\xfa\x1d\x36\xd7U/\xfb\x34" +"\xc1\xd4\xc8\x15.)\xb7#U\x8\xe0\x1fy\xd4\x1e\x1f-\xba\x80~L\xf4\xa5\xfc\x87\xae\xf5" +"\x98\xec\x7\xf4\x32\x1a,\x17\xdb\xcb#t\x8b\xba\x86\xa2\xac\xda\xe6\xb9\x30\x86\xa2" +"\xe2mR\xb0\xa1\xf\x83\xff\x41\xcd)\x1a\xd0G\x1f\x9\xe6*y\xbbu\xe1\x8eh\xb\xe6m\xa6" +"\xf3\xb2\xa5j\x8f\x61\xcd\xc1\xdf\x9c\x7f\xad\xd0\x81\x43p\xdd\x82\x64\x8d\xb1\x61" +"\xd8_\x8b*\x9a\xeQ\xde\xba)z\x12P\xde\xca\x1a\xf6\x94M\x89\xb7\xfb\xa2\xf3\x13\xef" +"=au}\xfb|(\x1w\x8f\x39;#\x83\x98\x9f\x16\x17n\xee\x1ai_\x96~\xfe~\x4\xeey\xed\x93" +"j\xa1!\xabG\xaf\xc0\xf0\x80\x99\x11\xa2\x90\xa0\xfc\xaf\xd2\xb0\xfbl\xfc\x5\x9e\xd1" +"\xb7\xf7\x5\x13\xa4\x94\x10#$\x13\xc1\xdc\xb6\x7\xa6h\xcc\x18\x4\x37\x62\xef\"M\xcd" +"\xd7\xb5\xd6!\x1a\xc2(e\xe\x46\x7\x36}O\xb1YY\xb8\x12m\xec\x17Pa\xa3\xca\x7f{\x1" +"\xdb-\xd7-\xfbVun\xcey\xfa\x61\xa7\xc8\x45\x33j\xc4\x12\xbd\xa4\x34|X*o^%\xc9\xce" +"\xcb\x66\xb6\xd0(R\x8f\x61\xf0\xb7\x7f\x1b\xc6\x3\xd2\r\xc1\x4\xc9\x46/\xcd\xeb)" +"\n[\xf9\x63?\xe6\xa2\x92\xb5 \x98\xf8P;\xed\x17T\x8c\x5\xd8\x36T?s)\xdc\xdd\xb5\xca" +"\xd7\xf8\x9b\xf2m\xde\xfe\xb4\x91-,\x1b;\xd4\xf\x92\xaa\xb2\x1a\xe6\xf\xe8\xc3u\xb9" +"`\xf9\x9eI\x9a\xe1L\xb9*]\xda\xb8\x8~\xf4\xd4\x1f\x44P\xa6\x80\xc4T\x9f\x33\xf2\xb6" +"P\xda\xbb\xe\x6\xf4\x18\xfb\x62\xbb#L(w\xea|Vn0\x17\xb0\x8c\xb4\xc3\x81\xca\xf9\x84" +"\x19\x1b\xa7\xdf\xa4\xe9xJ\xb4T< \xa1\x83.c\xd0\xf3\x62\x44\x8c\xd2\xeer\xf9\xa4" +"Z\xc\xd7H\x1\xdf\xb3,m\xf2\x8b\x83\xc2\x18=\x13\xd3z!\xfe\x8fU5NB\n\xd3\x34\xe5\xe3" +"l\xa1\x13\xa1\xff\x16\xbd=\x14'Q\xb5\xc\x12\"T\xe3\xbb\xdc\xe4\xff(\x85\xd2\xc5\xe4" +"\xd6\xa5z7\xb3J%\x93\xf5\x1dj\xd8\x9c\xc2%\xdfk\x84\x65\xf5{l\xd0\x34\xce\x66\xe5" +"\xe8o\xfe\x88\rP}r\x93<\xe7\xc9\x39\x64\xbe\xcf\x15H\x1d\xef~d\x9eJ\x1c\xf9m\xex" +"\x17\x35}\xfa\x81\xba\xc3\xb3\x35\xe5\xeb\x95\xbe_\xe'\xaaQ\xbe\xd0\xbbG\xd5VA\x7f" +"\xd0\x7\x9d\x64\xba\x14T\xff\x95\x31\xc9\xb0\x90\xeb\x64V\xa8\xe5%\x44\xc1\xbf\x84" +"\xa8\x41\x87g\x1fl\x18\xf7&\x91\x62\xbd\x0#\x85\xdd`\xdc\xbd\xe7\xc5\xfei\xc3M\x0" +"K*(Ed\xa9\xcd\xe4\xe3\x88~\xa7\x8dV\x98\xbay\x1aq\xf\xbe\x92\xc7\x98\x8b\x36\x1a" +"3Re\xc7\x7\xc2\xf0\xeK\xaa\x38Uy?\xe2y\x8e\xe5\xf3\xc1\xafqry\xed\x9d\x86\x6\x64" +"\x99k&\x9U\x6\xbd\x99\xc8\xa7*\xe7\xeb\xb4Z\xd7J\xf4Mk\xa4Z$\x1\xc1\x95\xe4O\x1a" +"\xeevt4\x7\xa1.\xd6\xbb\x80p\x1eh\xa2\xea\x2\xf0\xdd\x1a\xf6\x32\xbY\xec\xa2\xc5" +"\x1a\x38\xf1\xcek\x8d\x1c\xda\xdem\x9at\\!\x9a\x31\x1d\x64j;\x6\x9c\x44\xdc\xd2&" +"\xf4\xec\x7\xcc\x1b$\x9f\x65\x1f\x1a:\xad\xed(M\xdf\xc8\xb8\xf8\xeb\x33\x37\x1aR" +"(#\xfe+\x92u\xe2\xec\xfG!R*\x7\x4v\x2\x5\xe8\xb9$\xef\x1c-\xf0\x9e\x43\xe3\x98Z\xc4" +"\xd3\xd4\x96\xe\xf1\x9c\xbcv\xa7zv\xabG\xe4\x1b\xe9\xcc\xd0\x32\xedp\x81<-J\xf6\xf" +"\x91lQ\xf\x9d\xf1|[\xb5w\xff\xd1\xcd\x9c?X>\x8b\xc0R\x8b\x87\x87\x46\x38\x62\x12" +"\x85\xdfUM\x1f\x8b\x16\xc4\xd1\x18>q\xa2,w,6-\xbd\x14'\x98\xc\x0,<\x1\x12\x6\x1e" +"\x8e\xe4\x85\xd1\x9a\x2\xco\xc\xaeu\x19M8GX^\xfa\xcd\x14\xe2\xa1\xf5\xcd\x1c\x8d" +"\xe\x9f\x43^\xdb\xc0m\xb6?\x1d\xcc\x42\xb6\xb8\xf3\x81\xd2!\x91\xfb\xft\xe3Os\xb1" +"\xbe\x39\xb6\x1d#\x1f\xe7#1]\xe7\x7\x41\x33\xb1\xe4R\x9\x3\x31\xec\xa0Ol8>\xab\x13" +"\x7\xcd\x90\"\xab!\xe9vC\xc5\xff\x32\x96\x61;\xc3\xcc\xd8`\x1f@ex\xb6yz\"\x8a\xcf" +"fcy{zu\x92\xb6\x65\xfd\xb2\x83(\x98\xc9[[\x81O\xb3\xe4_g\x8e\x37\xb7\x9\xa2:]\x88" +"\xc9\x99\xb8\xeeG4\x8d`\xe3X\xf7\xcf\x8e\xe7 i\xa5#\xd6\xc7N|\x16\x92\xdd\x17\xed" +"\x1c\xc4SZBcoSO+\xe5\xc3\xb2\xb1YB\x99z\x9b\x12\xdd\xfc(\xd4O!]\xb9\x14.1\xf1\x98" +"\xc5\xe6\xb0\xd2_\xb2\xeaw\xbc\xf\x9c\x8c\xa4-o\xf6|\xb4\x2\x33\xe8\x39n\xd1h\xb9" +"\n:\xe5\x80'\x94\x46\x65\x4\x9eT\xf2\x91\x64gn\x9e\xfe^Q\xe9\xeb\xb\xe4\x93\xde>\xe9\x1c\x45\x61\xb9*" +"\x5\x7f\xb0>\xd4\xf0\xdf\x61\xe\xe4\x7f\x89\xef\xd4\xb1\xb0\xe1\x86\x9d\xff\xe2\xcd" +"U\xf0\xe0Q\x4\x1c\x9" +"\xaf\xc8G\x15o\x96\xd9\x45+\xb8\xe1\x87\x85\xd8\xc7\x83\x13\xe8\xab\xa3\x85,\xa8" +"\xdc\xcf\xc8\xc8\xa6\x9d\x42\xfc\x9e\xb3\x66)n\xf9\xf3;BX+\xeb\x9c\x7f\x2\x1b\xc6" +"\xc9\xd2|\xd1\x9a\xd3\xd8\x8e\x19\xe8\xb8\x30xi\xb8'/\xcb'\xb1\xca\xfd\xce\xb9@\xd8%\xf9\xb7\xbe" +"\xb7\xea\xa5\x16p\xdb\xcc\x38\xde\x9e\xe3\xb2\x87\x92\xe3\r!1\xc8\xf2\xf4\x7fy\xdb" +"l\xa4\xb1\xb5\xe2\xf3\x6>hjma&p~\xff\n`\xa8\xb7\xca\x85\xb\x9f\x8f\x91\x41@i5O\xf0" +"\xca(WC\xb3\xfb>p\xaa?>X\xce\xc9\xd0\x1c\xba\xb8\x62\xd1\x85m,\xc6Y\xd1\xb8P*d\xb3" +"\xf9\x89-\x1\x8dp\xc=\x92\x3\xb\x11KR\xe\xe2\x85\xff\x17\x66\xdb\x12\xc1\xfd\xc5" +"`\x1c\x15\x34\\m3\xa3\xc4\xa9\x94\xe3kBz\xccs2f%\x96\xf2\xd3o$\xae\x18\xc1X \xd0" +"\xfcS\xe1\x65\x92op\x15\x99\xa3\x91&3\x12x\xe3\x1f]\xd3\xdd\xdf\x8b\xbPJnM\xbd\xd4" +"Sc\xb\xea\xcc\xe7%\xde\x85\xee\xc-\xd7YDJ\x15\x7f^u\xc6Q\x88\xad\r\xecq\xd7\xcaS" +"\xfa]\x8fm\x1a?\xf6Hc@\xd8\x1e\x37\xd8\xcd\xd0@\xfT\xfa\xaa\x35\xc\xbc#.b\xc7\x95" +":5IW0\xdb\xa6(i\xa2|\xa0>\x85\xecZ\x1\xb9\x8H\xa5\xad\xcc\x95u\xfb\xe`\xc3\xd2j\xde" +"-r\x88l\xeb\x35\x61\xaf+;\xb1/.\xff\x93X\xd3\x13\xcd\xce\"\x8a\x46\x8d\xa5\x66\xf9" +"Za\x98p\x0r\xc\x62\xab\xd6\x7f\xb7\xb9\xcd,\xb5\xd5\xf7K\xe8\xe0\x91\x9d\xcb`\xa5" +"6K\x17\x35\xd3\x1f\xb3\xfd\xb5\x9f\x9c\"\xf0\x62/\x8d\xf3\x91)L\xc/\xed;\xcd\x18" +"\\\x9d\x93/\x9{\xcb,\x6ko+Ta?0\xee\x99\xcf\xe0\xb3\xb7\x8\xcf\xdd\x5\x65\xba\xdf" +"n\x1e{ A\xcf\x1n;:\xd1\xa5\xc0;\xe3\x31`3\xda\x9\x1c\r\xa1ts\x92^y\xe7\x8f\x8a?H" +"\xee#H\xb2\xa5\x1c\xeek\xdb\xe2\xa2\"\x44\xb3\xff\xd8\xe2\xf1\xf6\xeb!\xa3\xaf\x0" +"\x1d\x14\xe8\x95N\x80Y\x89\x37\xec\xaa\xd0\xfe\x81\xa0\x30&\x9f\x9a\xeb\x13\x43P" +"\x83m\xa4-\xf8\x1f\"\xbf\x35TM\xaf=b\xff\x87\x1M=b\xeaXhn^\x18-\x93\n-\xc3\xfa\xc2" +"X\x8bI\xb6`\xa2,:U\xbf\x8c\x99\xde\xc4\x36\x9d\x1dg\x82\x10\xdb\x13S\\\xf\xb3\x46" +"\xf0\xcb\x9a\x8c\x35\xb2\x96R\xe7\x63\x30\x8v(~\xd1\xbd\x8e\xe4@\x8dXo,'\xf3\xc1" +"\x1c|\xae\x9e\xb1\x11;\x1\xd5!\xa9\x1b$\xc5.\xd8\xf9\xe5\xe1\"\xb1Y\xfarG\xaf\x41" +"\x9a#x\xea\x9\xa5\x9dr\x14s\x96\x37*}\x1em}S=\n\x9\x39\xce\xc9\xa2|k\xac\xc9K\xf8" +"\xeb\xa6 \xa1\x4\x83\xb0\x9c\xa3\x10\xca\x41\xa6\xc2`n )\xf3\xec\x1e\x61*\xfc\xd9" +"\xe5\x30&\x80\xd1\xfc\x8\x8e\xa2m\x83U1\xf1W\xe9\xd4S\xc\xc9|\xac)\xd0\xde;\xb8y" +"\x97\xe\xb3\xd7\x81\xa2\"\xb0\x6\xb0\xfa\xe9~b3\xfcG\xd7\x1f\x1a\xb1\x94\xe6r\xcc" +"Qc\xc4\x5.\xeb\x88\xa3\x1a\xb3\xa3\xf9\xa5\x9f\x82\x15\xccr\x9e'\x1e]\xb5\x0\x36" +"\xb8\x10\xcd\x95\xcf\xd9\x82h\x84\xaek\x1d\x9e\x97ttz\n\x9d\xf0\x39\xa7|z\xc8\x34" +"\x6\xb9\xd2:\xf7\x96\x41%PRM\xf4\x8b\x18\xac\x8a$\xe3\xc7\x9c\x46J%?\xe3\x32\xa3" +"\xc1\x83\x99\xfb\xac\xf4\xe2\xa0\xc6o\x15,\x9f\x89\x95zb\x8b\x35\x90p\xc7s\xeb|{" +"\x8tP(\x82Z\xfa\xb0[\x9 \x89\xa5\x98\xce\xeb\x34\xa1\xf4\xb\xcc\x61\xe0Rp\xbe'\x9e" +"P\xed\x91\x3\xf3\x13\xa0\xea\xb8 \xf0S\xb5\x36i3\xe\x8fn\xef\x45\x4\xa0]\x8\x17\x83" +"U\xf2\xc5\x16,\x1\x6\xa4\x66\x17\xcd\xb\x42O\xc0N=\xadn\xa6k\xf3\xf3\xaa\xbc\xc6" +"<\xd5\x4\xa4yzv\x98\xa4\x86\xea\xf5\"\x4\x45\x7f\r\x14\x96\xd6-'\xa0W\x17\xb2;\xab" +"\x14\xf3z\x80\x82\xbf\x9b\x90\xb8\xbc\x82\xb1\x9f\xd9\x84\x4\xd9\xac#\xacs\x8a\xf0" +"\xe6$\x80\x86\x13S\x8d\x34\xf0\x1\x1a\xe7u\xad\xb3\x61\xe3\x30\xdb\x97W\x13\xb6r" +"\xe1\x6\"\x8d\xaa\x1cg.\xee\x18\x83\xb3\xa4\x89\xe9\xf3u\x14>\x95\x63\xd6\x8d\x17" +"u\xba\x15\x13\xe7y\n|\xa7\x46\x80\x11\x42\r\xbe\x3\xf3r3\x9a^5J\xee\x1\x8d\xfe\xa0" +"v\xdc\x89\x62\xdf\xfb\xb4\x43\x35\x6\xa5\xbf\xc4K\x5\x12\xe8\xa8\xeb}\xb\xa0\xf8" +"\x1f[\x12\x31q\xa6\x9b-B\xff\\\xf8\xa8\x1e\x89\xa8\x31\xe0\x6\xffR\x18\xda\xf4O%" +"\xf7\xe0\x46\xc6\xb0k\xb1\xb0ww\x86R\xdc\xf6\x85RS\x12\x9a\x41\x88O\x86\xdb\x91." +"W\xd7\xc4\xe0m}\xc8\xa1\x16\xce\x65\xb6(9\x9c\xb2\x1b\xf5\xdd\x8f\x94\x2\xa5\xa1" +"\x16T\x8cVS\xa3\x8>A+S\x7f\xd8\x32Nm\xb3\xf1]\xf8>\x1\x85\xcb\x8dL_\x13-\xdf\x1f" +"\x88\x11\xe5t\x2\x9f>\xfa\x8(\xf9\">1\x8c\n\x83\x8b/\x92\x3\xf7\x7\xf2%Nd\x9b{xu" +"~\x94\x5m\x90\xf6]\xf0LG\xe7;\xd7\xf5\xccWr\xc1%?\x1f\x14\x15g\xefT5\x87\xad\xd9" +"\x7\xf2\x6\x18{a\x12\x35\xc6\x34\xc9wa\xe4\x83@w\xe6Y\xb6\xe\xe0\xf9\xd3z\xf8U`\x18" +"\xcf\x5N\xaa@\n\x82\r\x87\xb7/3\x13~\xb2\xfa;\x8c?\x8f\xeo!\xc2\x81\xcb\x94\xc\xf" +"\xa9\xfa\x0X\x92\x43\xd3'\x95\x12Z\xae\xda\xd9\xd7\xce\xba\x39\x9b\xa1Q\xf8\xaf\x63" +"\xbb\x38 \xbc\xf5\xe5\x9c+\xac^\xb8\xa4S\xc8\xeb\xa8\x10j\x5\xe6\xc8\x46\x3\xd2\xf9" +"\x16(\x87\x8a\x94\x81\xe\xbc\x9cu\xd9Q\xcbI\x16\xb4\xa4\xc8\xd4q\xbbs\x9d&\x98L~" +"\n\r\xad\xcf\x44\xaa\xcb\xf5\x98:T\xd9y\x9b )\x8c$!f\xc4G\xb8.uR\x1Ja]!\x9\x1f\x33" +"\x96\x1b[\x8L\xf7g\n`\xce\xe6\xaf\x19\x19\xe4\xd1(\xa4\xe1U\x9`|\xaa\x80 \x93\xc5" +"f\x8b\xe1\xd5\xfdT\x3\xb9\xcc\x13].\xa6\xc2\xd9\x18(5\xe4\xbe>\xd5\xc4\x84\xb9\x14" +"H\xaa\xb3\xca\x39oL\xba\xb5\xb6\xd2\x94=z\x4\x7fQ\xad\xdf}\xc9\xbe\xc7\xeeO\x95+" +"\xcb\x9\x5\x9b-\xa0\xb1\xadV\xba\x99\x99K\xad&\xeb\xda\x9a\xa2\x62kl\xd8\x81\xc6" +"\xb7\xca}\xc9ny\x85\xd7\xa4\x9c~\xe9\xd0\x35\xbb\xdd\x1?\xf8\x9b\xdb\x18\x1c\x1c" +"-\x7\x81Y\xd9\x5\x9f\xd4\x45\x9d\xc9g\xaf\x31\x31\x1\x95\xa3\xcf\x9b\xbd\xe2\x42" +"#8w?\\\xb4\xbb\xf7\xfb\x37#\x13;\xd3\x98\xa3\x9f\xcd\xfb\xcb\x88\xac\xb0\x0\x80\xcd" +"\xe1\xea\xdb\x80\x19\xf1Q\xe3\xb1\xfa\xe7h\x14G\xc9\x98z\xfbM\xf4\x65\x34\x45\x90" +"\xf4} \xe4~\xc4(\\[\xf8(\xfa;\xa2\xe3\xa3>\xbe\xb4\x84\xf4\x13\xfe\x1a\xf\xa6\xaa" +"\xd9\x7f\x90\xe'Ac\x2\xa6\xaf\xf1y&\n i\x99\xdbr\x3R\"\xb1\xbc\xd1\xee\x30\xf6\xd2" +"\x2\xe2U\x99\xb5\x36\xdc\xb1\xc\xe7\xb0\xc2\x83\xf2T<\xb7iW&t\x1d\x1aG~\xc\r\xb1" +"\xd1\xec\x8_X\xe6\xa8\xea\x91\xe0^\xda\x30\xf0\xf6n\xd6\xf3\xa7\xbeq\x17\x6\x43\xcd" +"\x5\x8e\xa6\x1f\x64\x9b\xcf\xd9\xdb\"\xa0^\x8c\xe&L\xcd\xb0\xde\x19\x8a\xb6\xe6)" +"\xacL@C(\x2i\xf0\xbe\x43\rj\xdfp\xb8\x81\xf5n\xd5\x11(W\xfa\xe\xa0\x8c\xa2\xbf\x9e" +" \x98\x9c\x12JT\xc7I\x8b\xef[\x8d\x62{\xf0\xb4-]\x3\xcc\x6?\x8e\xae\xcd\x39\x32\x95" +"gi6|r\r@C\xd6Kh\xaa\x99\x62\x82\xee\xe2\x96\xc7\xf4\x41\xa2&\xed\x81Y\xb1\x66\xe1" +"\xaa\x99m$\xac\xa6^\xce\x80\xb6t\xe9}o~9*\xd6\xbfY:\xb4\xf3\x8a; l\xa0\xcc\x31(\xd8" +"G\x84Xs\xbd\x11\xb4)0C\xa2)R\xda\xb7\x98\x35-r\xce\xfe\xf8\xff\xe0\x15\x19,\xa8\xf6" +"\xc\x90\xd3\x14\xa8\xab#\x8a\x13\x61\x3\x82\xf9\xf8\xec\x1d\x8c\x1f\xca\xfa\xd7\xc2" +"\x16\r|\xe4~\xf3s\xc0\xc5]{\xae\x9b!\x14\x87\x1\xf7\xa8\xc0\xe7\xcc\x82\xde_&\xd7" +"6=\x95\x16=\xe1\x87\xa5p\x98 \xe3{\xbe\xadn\x14\x80$aR\xf5\xcc\x86[\x81\x9d)Q+\x96" +"z\x90\x44}\x98\xf9q\xf4\xc4\xc2\x8c)y\xd0|\xb0\xe6\xec\x8d@)\xdc\x64\xaa\xe3\xdb" +"\xef\x8e\xbaW\x12\x36!&\x0\xce\n\xce\xa3\xea\x44NA\xcS\xe9\xe5\xf1\xd9\xd5\"\x15" +"\xaa\x5\xe6\x90\xfa\x34\x83\xcb\xd5\x45\x1f\x43\x11\xcd\xf\xd2?9\xd4\xe1\x6\xe6\x9d" +"h\x15\x65\xac\x1\xa6\x8$$9\x90\xcd\x9b\x3M>\xd1\xfd\xb5\xc0u+^d\xe2\xe4\x17\xc6\xb6" +"M#\xc8\xe4Z\xf1\xb4X\x96\xec\x87|-\x87\xf8\x8fOJ\x85\xd0\xa4\x7\xb1\xd1\x13\x7fS" +"e\xc\x13\x46id\x98\x6\x88l.\xb0I\xed\xd7\xf3\xb6v\xf5#E\xfan\xf9\xabJA\x80\x66\xe0" +"\x8a\x81S\x2\xf3\xaa\x8f\xfb_\xbbu\xd1,\xc3\xba\xc7\xd9\xdd\xab\xba\xc6\x44\xc2\x94" +"JDioi\xd1\x30\xe3'\x8d\x9a\xe4W\xc3\x9c\x99\x65\xe2}\xce\x8aG\x96m\xab\x12]\xe8\xe1" +"\x10\xd2\x66\xb7\xfc\xd6\xee\xf2\xd8 \xc0)\xfa`\xdd\x32\x80\x84\xfa\xf8\xae;k\xd0" +"\xf5p\x85[\xfcU~\x15L}I1\xbam.J\xab\xa5'\xe0\xd0\x98\x33L\xa3\x8c\x9ax\xed\xdd\xc0" +"\x86\xcd\x1f\x3\xbb\xb8\xe5\xact\ra@\xf6}t\x96\x5T\xaf\xe9M\xda\x9e\x1b\xd3\xa5\\" +"MY\x1c\x34\xec\xc2rw\xfb\xd6!\xab\x9d\xab|\x96\x99\xc1\x1c\x88\x1\xe\xc9{\xc4m\xd1" +"\xaa\xd6O\r\xf4,%`{U\xb8\x85\x44\x45Z\xa8r\x81\x92\x32\x37%\x8Qoq\xcf\xcb\\r\xb4" +"\xef\xdf(\xf\xbe\xe2\x81\x98\"\xcd\xbb\xeaL\xaf\x86':\x82\xd3\xf0P\xe1\x42\xe1\xe0" +"\xb8\xb6(\xe3O(\xf4=W\xf7\x7\x18I\x8f\x46\x90\xdb\xb3\xe2\xcf\xfe\xd1;\x81u\x84W" +"T\x18h\xa1M\xcs\xb9\xda\x8f\x43:\xd8\xa7\xff\x1d\x1e\xe3\x83H\xce\x1am\x95\xf6%\xc8" +"\xc8r\x87\x8c\x46\xd8| \xe9\xcd=,B\"\xd4[\xb5M>\xbf\xeb\x30\xe5<\xfag\x17\xb5*\x90" +"%\x92\\\xef\xd1\x7fy_x\xdf;\xab\xda+\xea\xe6\xb2\xc1\x99WQ\xc3\x34\xfa\xde\xcb\xa5" +"\x98\x17U\xbe\xbd\xd7`4\x87\x1e\x14\x45\x17\x1aq\xf6\x2\x82\xe6xPY\xcb@F\xad\xb\xac" +"\x98\xd5\xa1\xe5\x66\x8a/\xc7\xfc\xca;\x91Xu\xfc\xd0\xd5)\xa6\x35\xd6L\xb3\x43\x87" +"\xcd\x90\x94}<\x90\x9f=2\xc4\xeb@\xa6\xf\x30\xc3\xe1\xf8\x19\xbd\x8a\xa2\xa0\x35" +"\xdb\xc3\xdd\xb2i\xc2\x62p$L\"L:\x93\xba\x43P1lfK,\xe7\x15;\x9\xea\xd7\xd3\x9b\xc4" +"\x9dn\xf0L\x83p>\x8bt\xe6\xa0#,A\xa0*}\xe0Z\xfe\xe\x94\xda\xda\x8b\x1f\xe6 \x8f\x12" +"\xb8~\x0\xef\x8c\x65\xd5\x8b\x2\x46o\xf6\x97\xd6\x46\x7f\x66\xa0?4(NcB\xb2\x11\xa0" +"\x2%\xa6\x7\xa5V\xab\x1dL\x8c\x42\xa1\x1\xffg]\x95\x1d\xfZu/$y\xce>\xd7\xa4\xf8\x44" +"\x88\xd3\x9f\x62.\xe5:T\xc3 -N`\x17\x83'\x8\xd4\x1eS8\x13\xa8\xd6pvB\x1f\xc7n\xb2" +"\\kcs\xf4\x13\xf6{\x1\xd6\xfb\xc1\xa8m8\x1e\xfb\xd1\x44\x85\xc7\x15\x98J\x13\x18" +"\x9dw\xf7\n\xf8\x3\\\x8d\xf5\xd1\xd2;\xf2SREay\x11\xa4\xbdX\x6\x89\x41\xe0\x6\xe7" +"\xd3\x66P\xfc\xe0i\x4\x8b\xb0\xbc\xf8\x31\xd3`o>s\r\xed\xb\x87\xa8\xd3(,\xcc_\xf5" +"\xf8\xf0\xdcq\xc4\xe0\xf7\x2\xdc[\x8a\x8e\xb7\x18%\xe0\x9bi*\xda\xe6y?\xb\xd6\xdc" +"\xd9/^\xc3q\x15\x9f\r\x61\xb7\xe1t\x97wf\x91\n] \x13\xaf@&NU5\x1d\xe8\xf7\xb7\x7" +"{\x5\x89\x18\xbb\xdd\xec^M\xc7\xfdT\xb8;\n\xf4_\x11\xa7\x1a\xe5\x96\x46\x93SA\xbd" +"8\x1br\xb1\xc6K\x82G,\xc9V\x1f\x1e\xd5\xadk]\xf9@\x88Oet\xd0\x30N[\x9d\xcc(\x87Z" +"\x8a\xe9~\xf3\xfe\x34\x6\x8e.6\xfa\x46\xaa\\\xbd=\xd8\x7f\x92\xee\x8bV9\x94\x13\x0" +"\xa1\x3OP\xfa\xd4`\x2NF\xc2q\r\xbc\xff%\xe3\xd1z\x9c\xcv\x97\xe3\x18\xb1\x44\xa7" +"\x7f\n\x39\xb1\xfb\xe9\x10\xcc\xa9\xa8\xd8\x63,\xe\xf2\xc2\x85\xd5\xab\x8d\x1M\xb" +"-\xce\x8d{\x6\x89\xaf\x4I\xd1\xa2(u\xcbz\xa6\xd8\xc0;TN\x87+\xa8\x4\xad\xe4\x61\xc9" +"\xeb\xff\x87\x46\x16\x41\xbb{\x9e\x1eh\xd1:\xdc\x8f\x41\x13\xe2\xe0\x8ey\xb0\xdc" +"0\xd5\x97\x65\x81JG\xa6Kj3\x14;\x99\x94\xd4+v~\x0\xe\x44\xa1\xa7~RA\xdcZ\x94\x64" +"\x87+\x11\x93\xdf\x31\x87\xc6\x90'E \xb4lM,\x4\xd0\x42\x84\xb5\x8d\x5\xe7\x37\x8d" +"G\x1e\x34\x44N\xed\x39\x87G\xda\xe9\x17(\xb8\xb1\xf3\x9\x9a\xb3h\x8dL\xe7\xd8'\x5" +"\xa6\xa3\xdfI\xe7\x61\xf4\xc5\x9e\x7\x1e>\x1dw\x1c\xa1\xb8\xa6\xc\x35\x9b\xf0v\xe8" +"\x6\x1d\x14\x8am\xd8\x4\x81:YlT\x14\x9f\xaf\x1b\xd2\xe2]\xc4N\xc4X\xaf^&\x19\xa4" +"\x18\xc5;~\xaf\x9c\xc7_\xc2\x13\x87\xad\x8b\x7f\x8e^\x98H<\xae~\x86\x85\x38\x90\xd7" +"E\x88\xc8px\xc5\x82\x37\xec\x97\xdb\xfe\x8a\xab\x84\x88\x13\x84\x2\xcb\xda\\\x87" +"kC\xc2\x80\xef\xb3W4!x!xy\x90\x9d\xfe\xf6Z!\x97\x9c\xaf\xf8\x30gY\xd8\xb4u\xc3\xdf" +"\xd7\x18Pt\xc1\x85\xe4\"-\xebx\x1f\xca\x1c.{e\xe3\xd7\xbcx\x8e\xab\xd2\xa7\x45Q\xc5" +"\xbc\xd2\xd0v\x95\x10vs\xc8\xb3\x8cS\xcb\x42^\x3\xe4&\xe1\xd9\x88\xc4rno\xbb\x98" +"\x8e\xa2\x8b\xda\xcaQV92\x13\xa9\xcb\x1c&\xea\xae{\x95\x34\xe2\xd2P\x83\x37\xf2\xbf" +"\xa5tPJOzyF~\x97Q\x1e\xe0RXb\x88\xb2\xe0\x95\xc4\x19 \xcew\x3MR\xea\x9d\x7\xdf\xdb" +"\xf3\xf0\x94\xd7\xd1_\xf=\xbd\xaf?\xdd\xf1\xd4J\x1fQ\xd4p\xec\xfg#\xf8+\xc0\xe8t" +"\xbd\\\x8d\x1e_\x5\x30\xf6^kg_\xfa\xb3\xcd\x19\xf1\xe3\xbfj\"n>\xcf\xd2\xb5\x1\x85" +"\x90\x39_\xbf\xbb\xe5\x88\x62\x1c\xdf.R\xe1H7\x94\xc4LeH `y\xf1\xb9\x98\xbf\x31\x11" +"w-\xb5\xcb\xb8\xca\xf6\x93\xf\"Ss\xd8\x91\xe1\x9aO\xe6,\xf8\xa4\x30\x95\x61'J2\x9a" +";\xeb\xa8\xf5\x89\xbf\xf6\xcb\xc5\xa5\xd6-,\xe0\x38\xd3\xb6K\xef\x96\xb\x41\x85y" +"oPl\x9a\xdb\x7\x14\xf4w8\xc7l0\xec\xca\x61\xa0\x19\x42Mj\xd5\xed\x46\xbe\xd1\x32" +"\xb\x66\\H@\xb5\x14i/\x9ak\xd0\xf9\xa3\x65\xaf%\xa5\xc1\xeb&\xb1;\x13\xc\xae\x81\xbe\x16#\xa0\xc8\xdbu\xec" +"\xd6\x88\x6!\x9b}\xb3\xac\xf4\xe5]PB\x12\xe4s\x4\x44\x65\xa6\xf8\xbb\x66\xf7\x30" +"\xf2\x82\x41\xf3\x15\x99S\xea<\xa4\xaf\x93\x39[\xbe\x9f\x1bZ\x1c\x32!\x10~\xd4\xcc" +"\xe1\xc5\x9\xf5\"\xbb\x17'\x90I\x4\x1du\xee\xd8\x31\xa0\xf6\xa6v(m\xb0s\x9f]\x9e" +"\xfa\x13\xa8\x1c=8\xcd\xecm\xf6\x1e\xec\x1\x14Q3\x8d\xb2\xbcn\\\x16\x88`_\xab\x1c" +"\xcf\xeb\x84-\xe1\x10\xd2\x4|\xc8\x91\x38wJE\xb3\xc2\xb1t\xa4$\x1b\x99Y\xab\x39\xd6" +"7\x8d*\x1b\xdd\x2\xd2\x0)\xc\xffp\xa5\xfc<\xca\xbf\xa1\x66\x38\x1cG\xf7>>\xf8\x1c" +"5\x9d\x35\x61\xf\xe0\x0\x37\x1el\xd4\xf3\x8eRZ\xee\x9c\x2\xfc\xa8\x62\xc8\xcc\xc" +"\xc5H\xa8\x46\x92\x8bP\xe4\xa1\xa5\xaf\x19\xa7\xca\xb7\xddT\rY\xea\xa9\x30\xbf\xff" +"i\xcdg)MG\xb\xdb\xe\x1\x9\xf}\x7\x11\xff(z\xecL\x95\xf5N\xce\xbb\xef\x45\xaeh\xe0" +"{ \xe6\xc9\x66o\xb2\x35Z\x97\x1d\xea\xaf]\xew\x11G\x87\xd5ysN9\xc2\"\xa0\x14Vuo}" +"\x5\xa0y\xe7\xc7(\xd8\xae\xd3N(\xb4\xfa\xed\xb5\xe4K(\xd3\xde\xf6\xf3Q\xd4\xab\xe4" +"\n+\x2\x87\x8aGG\xb1\xad\x6K\xb4:\xc2\x94\x8c\x9d\x62\xe3\xbdm<\xa3,\x8e\x6%R\xab" +"Ah\x8e\x10\x8f\xd8\x38\xc9i\xdb\x1c\xe8\x43_\x17\x33I\xa9n/\xb\x15k\x9c}\xc2\xb1" +"\xd9\xa3\xd5yjfN\xbf\xb\x61U\xe5 \x8d\x97j\x95\xc6\xdaJ\x80\xca|\xae\x1nFo\xb4\xce" +"N\xcb\xc9\xcf\xcc\x9f\x46\xf3\x89\x46K\xa2\x1eQH\x2\x86\xfe\xf0U1\x8dt\xday\xa0\x61" +"/\xf3\x16\xdb\x41\x85W\x94U\x9e\xa7\x33\xcc\xf0\xf9\x64\x62m\xa3)\xb2\x1Ie$\x8\xad" +"7Y_\xd2\xa7\x86\x9a\xd3\x7RB\x11\x10\xd0\xf3\x1b\x39V \xb8+2\xe4\xdby(\x4U\xad\xf0" +"(\xa5|`\xcc\xe7\x32>p$\x2?\xe9\xcb\x11\xc4V9%\xc1\xe6\x93\x92\x92\x9f\xaf\x4l\x16" +"\x81;\x0Qn\xc1\xf5_\xd6TE\x95\xd1\xea\x95)\x1Z\x17\xcc\x81\x6p\x92\x41\xe3[iXl\x1f" +"\x0U_\xf\xdd\xfatj&vO\xd1\xfe\xcf\x10\x1f\x63\xc4\xf2Zu\xb2\x64\x92\x0\xfc\\w\x0" +"=\x85%\x1\x15:\xfb\xa3\xd2\xa5\xb9\r\x44\x85.\x14\xe6\xb6\x82~oqD\x81\xbd\xef\xec" +"zh\xb2\x32\xbdH5e\xd3\xa3\x1d\xe8\x61v\xb2\xdd\xf0\xa4/\xc9p\xc\x64<\xa6i8\x90\x12" +"{\x84+\xa5\x9\x99\x8\xbe\xd8w\xd2\xa2\xbf!\xb6\x9e\x1f\x9a\xca\xfei\x1f\xa6\x84\xf4" +"\xe\xfa\x7f)\x7f\xfI\xb9\xb2\x8e\x64\xfd\xb3x\xe0\xe6n\xe7VqB\x96\x9c\\\xb9/\xe9" +"\xf\xa1\x90[\n\\5J\x14\xed\xf7\x5\xb6.\xa0i$\x8bm>~\xef\x1b{&\xd2\x65ua\xa4\xda\\" +"\xb3\xd2|\xa9\xbe\x8c(>#\xa0S\x1c\xbc\x99\x92\xeaX\x9d:9\xa6)\xa9M\xcf\xda{\xfa\x3" +"G\xc8R\xa3\xad\xa2\xd6\x31\xa2\xf7M\xd1\x9a\x7f\x96\xa2=a\xa7>r\xa9\xb1.\xbe\x45" +"\xf3\xc0Q\xf7\xa1\x0Q}_\x1e\xd4<\n\n\xc5\x96\x1f\xcb\xc0\x98\x7f\x91\x91\xfa\x17" +"\x8a\xcb\x9d\x15\xfd\x97\x17@\x95.h\xea\xcc\xbd\xd7\x8\x39kkk9\x95\x97o\xd8\xa5q" +"\xe5%>\xe8\xcf\x1c\xc3\x1a\xf5#\xdd\"=\x13\xd4\xae\x62\xe9\x32&\xd8\x34y\xd6\x43" +"R\xd7\xa5\x17s\xbc\x12:X\xa2O\xc1\x19\xb:\x2\xcc^\xbd-4\xa4\x2@\xb1\xddwZ\xb4\xdd" +"\x90\x41Y&\x4\xec\x1\xd5\xa9m\xe6\x12\xb\x37\xcfg*\xa9\x12\x42 \x3\xffO\x93\x8e\xe5" +"q\xb9\x8d\x19\xc\x9a\x43\x61;\x11'\x9dXo\x9d@\xa0\xbf\x94\x2Qa6:\xf5%\xa2\x43\x2" +">\xed\x30\x84#\xd2{\xd6$`w\xae\x64\xd3\x86%\x44?\xd1>x\x91_\x88\xe2\x84\x2\x10\x9" +"V\x8b\x9e*\x9\xd9\xf7P\xb9.\xb5\xb4\x8a`\xd1\xd9\xae\"{\xa4|\xb6\xfeI\xb1\xc5\x1b" +"\xffZy}\x8\x7f\xe6\xc8\x45\x84\x65\xcd\x33X\xbb\xdb\xb5O\xd6&<\x1a\xba\xc6\x97\xac" +"8\xft\x17\xdf\xe2Sf\x2\xf0\xa7o\xact\xc2I.RO\xb7\x43\xfb\x61L\xc4\x9f\x82\xbfY\xfe" +"\xe5\x42\xa6\xde\x34\xc3>\xbd\x13S\x18h\xe\xc1Kw\xbdr\xb0\xa5y/\rPQ\x98\x13\x38\x84" +"\xe3\x46\xd3\xd3\xa8\xda\x17G\xa5\xe3\x41\x35\x63\xacu\rm-c:\\\x90\xab\x13k\xf0\xf4" +"\xc4\x1e\x19\x0\xe1\xdaUUpym\xd7\xc6oO\xbc\xf\xde\xef\x0\xe7uD\x90\xd5\x89\xccL\xc2" +"W\xfc\x43w\x6\xcc\x10N\x0\x90\x34(\x1d\xa8\x1et\xfb\xcd\x8c-\xde\x35Y\xa5\xebY\xa6" +"q\x92\xbc\xa9\xedI\xff\xc4\x9b`Z\x9d\xac\xa1\x94\xea\x2\\Q\xc5\xec\xbc\xb3\xa7\x90" +"\n?\xbfM\x1c+\x97@\xfavw\x4\xedu\xc3\xb5\x8c{\x93\xa5\x35\xbf\x43\xfa{\xe\x1e\xe" +"ikl;\xf8\xfc\x89\x5\xf4\xe5\xee\xd8\xc#\x9b\xd1\x9c\x95\x34\x92,'\x86\xc2\xf9\xff" +"\x18\x1\xd2\xe1\xe0\x89\xe\x1ana\x91\x8aL\x90J\xd8\xf8\xb7\x9e)|\xf2\xbe\xae\xc8" +"z\xfb\xac\xa9Q]\xc9\x87\xe2\xdd\xdc@\xf2\x1cZp\xd2\xa9=\x8d\n\x62nna\x84\xa2\xcf" +"\xe8_\x86\x63\xb\x3\xd2\x37\xd1R\x95\xc3\xc5\x4o{\xd5\xa2OY\xa8\xbc\xae\x80\x90\x9b" +"\x96\xeb\xef\xdfl\xe2\xc5\x82;\x13R\xf5\xa7j\xdf\xb8jf\x93\xcc,\xb6T\xad\x9\xcf\xab" +"\xa6\x8e#8\xf5\xce\x11v\x4\xfc\\\x3u\x12\x85~C\xac\x9\x7f\xb0$\xccQF)N\xa0\xc7S\x14" +"^\xa5\xc2\xf1j\x18\xfcu\xf6\x8d\x3\x62\xd4GZ\x1e\x90/\xc3\x41\xa3\xc8.\xe3\x7\x44" +"\x17\x9d\x39\xc3\xe5)\xb9k\x11-\xe5\x7\x11\x95JB\xff\x30\xecw\x7f\xea\xa3\xd7\xc2" +">\xfM\xa5\xd0\xa5;\xed\xab\xd6\xe4\x64W\xaa\x62\x92X]:\x14\x8a\x31\xf0U\x9e\x85U" +"d\x14\xbf.\x9e\xb\x62\xc2\n\xb2J\xe5\x38*m%\xc2J]T\xb2g,V\x89\xc3\xfft5\x8am!\x1f" +"MD\xe1\x85\xc6K\x9e\x95*\xc2\xd6\xem\x9c\x81m^\x19\xd6\x62\xd6\xef\x1d\x18\xb3\x80" +"\x93[,\xcc\xa3\x10\x66\xfdx\x90\xf9\xb4\xd3\xc3\x9d}J\x11l\x16\xd8\x95\x37\x37\xed" +"\xfc\xf5\x11\xe9I\x10\xf1\xbc\xc3\xa5\x31\x9\xc6\xa2\x1e\x17z\xd2\x41\xba\x16\xf5" +"\xd0\x9cq\x1e\xdeYC\x0\x9c{\x8bj\x2\x97l3\xc3\x8d\x43\xb8s\x2\x90\x97\xdcZ\x93\x84" +"\x18\x98\x12&\x8\xfcL\xf3\xac\xdc\xca:,\xb0\x82\xd8\xaa\x45\x39\xd8$=\xbf\x36<\xfb" +"\xde\xe3\x38\x87\x9d\xa2\x64).\xdf~\xdfwv\xa8\xd1+\xf4\x95?\x1f\xe3\x19v\n\xckbu" +"\xdbN\xd1\xb2q5\x13 b\xebKz\xcf\xb2\xbd\xa8\xb2\xdd+\xa9\x7fRM\x91\x3\xc4>\x81\xfc" +"\xe\xf9\xe0\x8a\xf1\xac\xbc\xf0\xee\xe0X\xec[\xec\xb0J\x1c\xad\xe9\xc2=^P\xdf\xf7" +"\xa8\xfb,\x81?O\x92\x1f\xe2\x2\xa9\x64\x82\x7\xe9\\\xb9\x5\x8dv\xc6\xe3K\x13\xea" +"\xc2r\xea\x1f\x36)\xd0\x13\r\x31\xebHT7_\x17\x12h\x86m\xa5\xec" +".\xc7\xfe\x61+\xb9\xf8\x30\x8c.\r\xf3H\x1c\xdbO\x97\xf8\xd5&\xeb\x4\xdcW\xd9\xa8" +"D\x3\x90)gQk}k\xa8\x94X>t\xc5\xc9\xa2\x46#\xce\xa4M\xf1w.*\xca\xbb\\\xe\x1f\xde\xc5" +"\x82\xb1\x43\nsX\x7f\xd5\xf1kxF\x82\xc0\xd0*\x80\x11. D\xff\xae\xab\x35\x80\xf3\xe4" +"\x0\n%t\x1d\x8\x99\x81H2Er\x90\xbevQ\xb8\xef\xd7+H_\x95\xd4\x5\xc6Q^\xcc\xed\xc4" +"[\x9b\xbcv\xb2\x6v\xa5\xf6\xa9\x1aXP\x1eh\xf9l\xb0\xbe\x65\xde\xf6\x62\xcd\x1d\xb1" +"\x9e\xa8\x3\x1f\xee\xfb\xcf@5;pYGj\xaf\xa3;\xa2j\xf9;`\x95j\xeamx\x9f\xf3\xd8\xe" +"\xd3\x0\xf&j-\x87s\xee\xac\x7f\xef\xd3wm\xa6^\xd0\x1a\xcf\x9b\x43\x17V\x2\xc2jS\x8b" +"\x1d\xf0\x61\xbb;RO*j\xe4\xdd\x5.\x9b\xa2\x88\xb2\xd3_\xee\xd1\xa2\xf3%\xc2\x3\x7" +"\"W\xdbh@M\xd5\xb9\xae\xb6=D\x1e\x41\xad\x38_\x17\r\xddJ\xa5Y)j\xcf\x42\x66\xc7\xe3" +"\xbb\xca[\x93n`(\xab\x1b\xbaJD\xc7\x9bG\x0\xb2\x9f\xa2\xed\x65\xd8'K\x8fT\xc1}\xe9" +"\xf4\xf1Q\xed\x8\xc5wL\x1a\xc5\x36\x44w\x7f\xe6u5]\xab^T\xb1\x31\xd6K\xbb\xaa\x81" +"\x1d\xacy%\xe0\x2\xf6+\xbd\xa9x\xc6\xec\xe9\xb7\xc5\x1c\"W7\x2\xbb\x8\xbd!\x86\x6" +"\xf2\xa7\xc9\xc8\xab\xab\x1b&+\x92M\x7\x36\xad\xbf\xcf\x36\x65" +"\x96\xf5\xe3OY\xf9\xea\x15\xd3\x8eL\xc2N\xf8\x8\x6\x64W\x98\x63\x99\xd3\x9\xce,\xb7" +"\xfe,\x1d\x1b\xa9!\xf1\x19\x8a\x91vn\x1d\xe4S\x19\x80\xf5Gwpx=\xac\xe9\xde\xc5\x99" +"\"aK\x1f\xd8\x89\x88\x0|j\xdf\x10\xcc\xee\xe1\x38\xef\xc2\x34\x63\x90\xfc\x88\xd1" +"\xad\xf8\x61~NV\xff\xa7 \x92\x91<\x1b&5\x84\x8\x9bN\x1e!B\x13\xf5j\xf4Gg\x8a\x45" +"s\x9\x1e>\xdc;d8\xc0\x5\x39\xd0\x3\x0k\xb1z\xba\x98\xf5\xe7\xb9\xcb\xcc\xad\xffh" +"\x3\xb3\x1ej\xd9\x41\x99\x4\x62\xfe\x1b\x93\\g\xff\x9eJ\xa4\xb6\x15\xb2\x85Z\xd2" +"\x88\x41\xb2\x96\x84\x1a\x9f\x1a;\xf8o\x9e;\x16Y\xd7\xe7{Kn\x7\xda\x31\xaf\x84\xc1" +"\xf5~P \xcf\x8c[5/\xd4\x12N\x13\x11\x7f\x34V\xd1\xea?\xff\xbe$\xa8iq\xb7\x12RU\x5" +"\x10OD\xe2`U=\x10\xd6Yx\xa5\xeb\xf7\xee\x66\xc7\xac\x66\x3\xe7\xbe\x95\xd2\xb9\xe8" +"\x12i1\xba\x13\x89i\x87\xf9|\xae\xa5\xb7\xeb\xe1\xc5@i\xde\xa7KaW\xf1\x9b\xfc\xbe" +"\xa2\xe5\x9a\xd5u\x10\x32\x91\xeb\x36\x92?14\x1b\x9d\x12\xc4\xce\xdc>\xd0\x38?\x19" +"\xe6\xdd\xf3k\xa5&R\xde\xe8\x1e\"V\x91\xa0\xbI\xaa?\xa2\x1b]\x1a;pf3E&?\xb5\x9b\xf0" +"\xd7\x16g\xa2x9Mqac\x12\xe1\xf8\xb2\x33\x15r\xb7\x90/\xa2\x96\x8di\xad=B\xa9\x38" +"\xd7\xe6\xf9\xe9\xf2\x63\x9\x44:m\x97|da5\x1\x83\x9d\x9\x87\xf\x2\xd2\x82\xd9\x10" +"'s\x8c\x17\xd1\x64\x38K\xf4\x9e\xdf\xbeXY\x1pRH:8_=l#\xc8\xec\x31\xee\x9e\x7\xc5" +"v\x1d\x85\xd6p+\xe4#\x1b\x95\xfe\x35{\xf6rqEM\x8b\xa5\x41\x4)\x1d\xf5\x1c \x92\x82" +"=X\xd7\xd4P\xc9\x92\xee\xdc+Y\xa7 \xc7\x19W\x90\x44\xda\xe1G\xb7`\xba\x9c\x83\xf6" +"n't\xc3\x63R\xca$-K\xc6\xdf\xb0}\x15\x89n\xdf]\x7\x62\xa1\xb9I\x1b\xc4\xf4\xa2\xec" +"\xe2\xa0\xc4N\xb8\xf3\xa4\xe2\x6\xbe\x87\xc8W\xf3\xc3\xba\x1\xe7\xc1\xb3)\xd7U:/" +"[\x8c\x17\xeen3\x9e\\\x32\xc7Z\x91N\xd9\x33\xc6\x1gm\xceu\xf1\x9fv\x97\x37VP\xfc" +"q\xa0\x1f\xeb|\x88\xcf\x93\xb0\x87\x8\x89\xdf\x96-\x94\x9a\xc0\xc6r\xcaZc\xfb\x9b" +"n\x9fs\x1b\x7\\\x2\xba\xb9)~\xd2\x31\x80\x99\xbd\xc3\xd2\xeb&\x82\x1c\xf9\n/8\x8a" +"ib\xc1!\x8\x9b\xf3M\x8\xe3\xceQ\x9\x99/0\xb9\xf8\xe8\xb5 *\xd0=\x3\xd0\xe0\x0\x12" +"\x85\xcc\x46G\xd9\x19\xb3(F\xec#\xfb\xc8\xc9\x10k\xbazI<\x81\xb3\xa5\x8b\xb1=\xd5" +"\xd7\xa4;\xb6\x62*\xd6\x8c\x84\x1d\x7f\x11\x36\xf8\x95\xb1\xd4\x94\x96\x88z\xc7\xad" +"\xc4\x94\x44\x80:\x16J\n\x1f\xae\xc2\x99\xda\x1c\x1a\xb9\x64\xfbu1K\xb9\xd7\xd4\xaa" +"\x4\xff\xb3WVA\xf7{\xdd\xf~x\xe\xb7\xcd\xc1z\x88!\x8c\x18\xe7\x10\xe0\xf8)j\xde!" +"\xfb\xdf\x35\xba\x6\xe8\n\xa6\xbe\xc8\x9f\x1b*\x3\x7lm\xaf?\xf\xba\x84Z[\x88\x14" +"\x2\xd2\xc0\x33[h{@0@\x96\x88\x96?m\xacTE\x9Mf\xd3=x\xa7\x63\xb6\xf5\x0\xfdL\x9b" +"\xc8\x80M@\xf5,\xf4\xba\xeb\xc6\xd3]\xa9\xcd\xeez0\xb7\xf\xde\xd0\xf1\x85\x87\xa1" +"~\x8\x15@p\xb0\xa3\x8d\xe0\x0\x35\x1a\x89\xf4Kl\xd6\x66\x8\xd8\xa8hD\xf9\r\x88\xcb" +"%zJ\xf9\xc6\x7f\x15P6\xe8\x33\xd5\xf5\xd0\xfcx\x1d\xc9\x8b\x1f\xc1\xb7LB\x82.tvS" +"\xd0\x66\x0g\xda\xa7\xaavTq\x92\x9e\xd4\xe3\x8d\x9c\xd6\x9b\xdd\xb4p\x7f\xb1\xd1" +"\x1d\x12\x37\xb3\xa5\x6L\xf8\xc1\xc6(\xe2=\xe9\xee\x9d\xfe\xccK\xde\x42\x97\x8d\xb5" +")u*:\x84\xb9\x12\x46ui\xea?\x9do@\x97\x88\x96\xb8\x64\x17\xc1\x14$\xcd\xa3\x8\x34" +"G\xf5\xc2\xdf\x66\xc2\\U\x2\xea\x42N:m\xdc\xd2\x30\xe6I\xff\xc8+;\xc0\x16\x8b\xb9" +"\x99\xbcQ\x8\x1b\x36\xbf\xe6\x11w\xae\xabl\xc7\x44\xd9\x94{\xc5\xa8\x93\x81\x62\xc7" +"\x9a&\x8eiE\xc3\x84-\xfd\x87\xb7}\x14\x8f\x9cyA\xcc\x62\x9dST}\xa9\x30\x86\x30\xeb" +"{\xd3\xe1\xc0\xf2\x7f\x8a\xc2\x8c\xcc\xe8\xb\xa0\xaa\x0`\xf2k\xba\xb7\x1d\x17W\x7" +"\xab`\x90/\xfb\xd9\xc9\x9c\x38\xd8R\xf1\x14\xf0\x12x\x96s\x18\x9b$n\xb6N\x9\x8c^" +"\x9d\xd1\x97\xab\xf6&\x9e\xe1\xb4\xad\xfc\xf6\x8c\x1c{>R1x\xfM\xab=C\x5\xa1\x8a\x89" +"\x8a\xe3\xd3\xfe@S\x90RH\xc4\xcer\xa1\x1Sp)\x87\xe2\xcb\xfb\x1\xcf\xee\xf8j\x19\xed" +"_\xd0\x6\x66\xff\x93\xf1\xf4xF\xcc\xbf!mBC\x92\x18\xab\xbc\x95\xe4V\xc0t\x91\xa7" +"\xc1\xe4o\x1d \x1c-\x80\x66I\xfc\xd2\x34\xdf\x12/\x89\xb3\xb6\xc0\xd8\x64\x5:\xc7" +"\x12ha\xa7\x1f@\xcb'\x1c\x14\x99\xe4\x65\x1eR\xa4\x94\x11\xbeQ\xc6\x46\xd5\x9d\xdd" +"\x91\xdd\xe8sj\x2\x97\x88Z\xe\x2\x81\x43/%D\x8\xac\xaa\xec\x81\xa3t\xc5\x6\r\xf\x7" +"vw\xaa\x42\xa0kM\xbcG{F\xf\x8d\x66\x17\x89\xff\xc\xfe\xb8)\xab\xec\xd6\xc0o\xa1\xad" +"\xb7o'\xfeS\x81\xbb\x0\x9b\xd0[\xab\x34j-e-$x\xb0\xa8\xc7j\xa6\xc9\x98\xc9rn\x87" +"\xcb\xda\x66\xf9\xbc\x62\xfc\x44\xe\xba\x14\xc7\x34p\x14\xb2n\x84\xf3\x5V\xb8rK\xea" +"\x81\xbfv\xd3\x42\x63\xf8\xe4Z\xeaV\x84\x1e\xbb`\x18R\xc0\x82\x1mW\x5\xa7\x30\xe" +"\x8b\xe1'k\x93\xc1\x1ek\xff\x84o\x1c\xb5\xf3w4\xc4g\xbf\xa6N\x93X\x97\xb7\x89\xd5" +"\x98\\\xe3\xda\x9a\x8e\xb8\xb\x97\x36]\xf2^^\x87^\xd1\x65\x84Vj\xfa\x39)\xd8i\xa3" +"\xfa\x9c\xd7\xaa\xf4{x\x93\x98\x12\xfb\xe1\x8f)!\xb3\x93\xd7\x88\xf7[\xf0\xf0\xc6" +"*[\xd2Q$\xcc\x98\x84N\xeN\xde\xcc%\xd9\x37\xdfVp\x9\x65x\x7f\xc4\xd1\x91\xa3=\xb8" +"\xc2O\xfb/\xf5PJNa\x8\xe5\xfb_f\x12\xdbV\xbb\xd7\xd2\xf4\x33\xfe\xe1\xb8\xf0\xd7" +"\x80\xecOv@\xb4\xff\xc0\x1f\x35.\xb3\x98\xb7\xc4\x11o\xf4?\x93\xa1\x18\xe0V\xd6\xd8" +" \xbf;A\xa7\xc0\x9e\xad\x1c\xc4\xff\x90RB\x17i\xc5kE\x99\x38~\xb0\x8fu\rji7\xb0l" +"\xca\x43R\xa3\xf4\x96\x16\x16\xeb\x12\x39\xefY-r\xf7\xa7\x80\x12\x95\xa1\xee>\x97" +"\x82\xbc\x95\xeah2\xf1\xb2q^\xf1\xae\xa0\xf4r.\x85\x16\xfd\xad\x1b\xf4\x14\\\xd2" +"a\x3!\x8\xe7\x89*\x8d\x4\x7q\xf8l\xe9\x89\x94\xe1\xb4\xb5h\x8dY\xd6\x4zQ23\xd8m6" +"\x8\xacM\xa4\xcc\xe4\xca\xd7x\xe3\x66'\x1c\x16\x9\xdd\xc5\x6\x30Le\xb7P\xb8\xbd\xb9" +"5\xce\x9f\xe\r\xb5\x33}.PqZ!\xd1\xdd\x4\x92\n\xfd\xba\xdbjAi2\xbd\xc6\x97\xaa\xe5" +"\xcc\xf3.\x99p\xff\x5\xa1\x8e\xc7\x66\x84\xd1%`~&\xd3q\xefni\x17+\xf0\x66\xf7\xeb" +"oRqx\xa0\x9b@w\xae\xfe\x5\x90\xa8\xbf\x0\n\x9f-H6\x89\xb7\\\xfd\x2W\x14SCR\x9\xec" +"\x99^l\x7,x\x8c\xb3h}c\x6\xd7\x9fw\x1c\xcf\xf4!M\xf3\xe6\x8d<\x81\xba\x19Y\xc1g\x82\x33ubn\xdal\xa3" +"\xf9\xd6L#\xdez\x9f.#\xbd\x32\x15\xbf>e\x83\xc\xd8\xa3\x64\xfcS<\xec\xa8\xb6{Far" +"\xd7\n\x89\x1eK?\xe3Z\xdc\xf6\x1e>\x1fwq\x7f\xa3\x92K{\xbe\x80\x43\xb9\x81_\x97w" +"\xa4\xf0\x7y-mo\x99\x42\xd0$E\xc2\xb0\xdc\x7\xb4Q\xc\xa3\x35#Y\xaa\x31\x62\x32\r" +"4p\xd0\x14{\x15h\xb8\xa9\x14\xe0\xdf\x10\x8c.Zv\xd2\xbd}X\xc8\xc2\xd7@>u_\xe8\x96" +"\xaau\"\x5;L\xb8\x46\xbd\xa0\xa4\xe9\xb5k\x97\xa9\xd0\x89\xe3\xe7\x41nk\x1d\xd0\x14" +"\"\x9b\x90\xfd\x31\x9a\x45\xfe\x16\x1a\xe\x30\x92\xe6\x4\xbe$\x12[Q\xf3\xe7\x16\x1c" +"d\xff\xfb\xd2\xed\x9e\xb4\x8b\xd1\x43\x42\xca\xc1\xe3\x3\xc\x63?\xbdk\x87\xd2\x85" +")\xfa)\xa5\x45g\x99\xbe\xc8\x1dX\x1c<\xe8'\xfc\xda!\x1\x41\x9b\x11\x9aJ\xf6\x80\x1c" +"\x94\\\x31O\x80\xf4\xd7\xab\xf3os\xe3\xe7RyS\x6\x36\xfe\x9\x34N\x98\xc3h$\xb\x9e" +"Cf\xd9\xe6ja\x5t\xeb\xeeo1\xcc\x11\x1e\x83\xe0TJ\xd3!\xcf/b\xf8\xc5\x30\xbe\xcc\xfa" +"\x91\xc5\xf3\xc5\x64]b\xe\xcb\x35\xdeo\xa3\xda\xd7id\xdb:\x83\x7\xe8\x92\x8c\x9a" +"\x18\xbc\xb7-\x91\x9f\xeep\xf1\xb9u\x88\xdb\\\x18\xe1k\xc7\x45\x35\x97\xa1\xf2\r" +"z\x9d\x91\x31\xb0\x2\xa5mL6\x8dk\xf6\x9e\x8b\xadN\nD\\v\xfb\xe0\xaf*\xf7\xc7M\xb7" +"\x9a\xb8\xf7g\xfd\xec\xef\xfa\xb0\xc\x62\r\x3\x8f\xde\x83\x41\xad\x14h\x87\x4T\x89" +"H\x9dh\xe\x10\x41)):?'\xe5\xfc\xceu)\xbbJ'r\xe5\x4\x5\x41W,\"S+\xf5\n\xa2\xfc}KM" +"\xb9\xa6\xb3\x8e&h\xce\xd8\xfd_\xb3K&\xf7\xed_)\xdf\x43\xa5\xb1\x7f\x9f\x1f\xe1\xf9" +"3\x4\xe3\x1a.\x17\xcc\xd8\xf2U`\xf1`t\xb1\xdc\xa2\\\x11\xe0\x86\x36=>\xbd\x61\x39" +"\xd3%\x94\xcdY\xa2\xd8\xb6\x0\xac\x9e\xe7\xc0 \xd2+J\xcevb\xb3I\x82L\x92m)\xaa_\xdc" +"\x9c\x1d\xc4\xfc\x17\x18\xb0\x1dz\x4\xffq\xfb\x10\x18\x1b\x5\xcd\x61?\xfb\xa4\x39" +"(Xb\x97:\x2\x8\x95Xj\x5\x43(\x1c\xb6\xe9J\xb1\x85\xd3\xfe\xe9\xc8\xca\xef\xdf\xfc" +"\x95\x9e\xe7\xedQ\x1\x8dR{!\xdc\xa5\xba\x42\xba.:\x8aw\xdb\xa8nd\xce\n\xb2~\x9b]" +"\xb0\x14\x0\x1b\xdd\xc8\x90\xdb\x7f\x61\xe0\x90\x4Y\x82\x1a|pc\xdb\x65\x13n\x8a\xf0" +"Zh\xd2od!\xfa\x86\xe4\xae\x62\x65'\x97\xb3\x85\xc8X\\\x16r\x93.\x15G\xd2\x18=\x84" +"\xad\xf7\xe6\xf8\xcf\x42\r\x3\xa4\xe7\x8a\xd1q\xac\x8dR\xf4\x43\xc7i\x89\xefQ\xa0" +"wL\x13q\x11\x43\xeb\x0\xecTJ+t!r\x8byP.\x8b\xfa*9L\xd0\xcc\x15\xafq;\\\xe0\xbbx\xe7" +"\x16\x89\x18\x2\xa2\x81\xbb\x8f\xe6\xc5\xf2\x14[f\xe6M\xff\x65\x9\x31?5\x3($`\xe4" +"\xc9L\xcf\x85V\x9b\x1c\xe5\x84\xf\xd6\x38\xefQO\xda\x9d\xe8\xb1\xb1\xe8wW\x9c\xd4" +"{\x87\x85\xb9\x91\x64\x1aH\x1b\xa0\xef\x46\x3X\xc\x8e\xdb\x94N'\xf4\xe9)5\xee\x2" +"~*U\xfb\xaf\xf9\x92\xf7\x9e\x3\xf7\xb2\x42h\xbf\x93\xb2K\xa6\xc6\x4\x35-\x14~\xa9" +"\xb3\x37\xd0\x8e\x2\xdb\xc7_\xec\x7fP\xadHA\xae\x65Q\x6vAS\xe6\xe0\x8c\x84\xa2&O" +"*\x18\xc\"%\xfa\x1e\x39\xac\x8\x1f3\x83\xbb\x9dQ\x7\xec\xd0v\xed\xc6\x1az\x80" +"\xd9\xae\x7fU\x97[`v\xe2\x45\xf0\x8e\xc3\x64\x45\xd8\xf0]\xd1\x37H\x99Z\xf6_\xff" +"\xe7U\x97\xe9\x86\x83\xe6\x88\xa2@S\x1\x1b\xc7\x1bi\x9a\xe1\x61\xdc\xda\x83Z*\xad" +"\xcd\xf4\xd9\xa8'P\x95\x8a\x39\xaehPX\xcet\xf8\x91\x62n\x99I{\xc8-b\xd2\x35IM\xd8" +"?\x87\xe4j7V\x82>#CMG\xaeO5\xa2\xde\xe8\x31\x46\x80_\xb5\xe2\x8a\xf9\xe2\xdfx\x12" +"I~\xf6\xa4[\xad\x66\xdf{)\xe4\x95\x12\x80\x31\xcd\x96VC#\xc7Z\x88\xb9\x8es3\xf6\xf8" +"\xde\x1c\x8eu&\xfb_\x8c\x11\x10\xff\xaeK\xcc\xfe\x32\xe5\x32\xf1\"\x8fz\x9Og\xb3" +"Q\x8e\x0\xa0q\x89\x7fN\xdbh\x8b\xf9\x97Q#\xcb\xe1\xde\x8\x95\xea\n\x88'zi\xa5\xd7" +"iLD\xb1Z\xe4\xb5\x92\xcf:\x17j\xb6\xe9i=\x80\xd9\xb1\xb8\x9b\xd3\\\xd8\x88\xb7\x64" +"\x92\xe\x86^~\x9a\xd0\xe8&o\x17\x4N\xd6RQ\x8d\x87\xff\xee\x1d\xc3\x64\x42/Wb\x1a" +"\xfe\xa9\x16\n\x8cy]D\xa6\xce\xc\"\x62:\xa8\xafZ\x8\xcb#\x19\xf3\x35\xe7\x36N\x10" +"pml5}\xfd\xf0\x82\xd3\xeb\xe3\xb0P?\x6H\xb7J\xad\xddS\x8fX\x5\xb1\x1e\xedX\xd6\xe5" +"\xf}~n\x1a\x63\x1e\x89\xc8\x1e\x32\x1fk\xa3.\x13\xa2\xb7.$\x9a\xb2\xdc\x31\xe7:#" +"\xba\xe5\x96\x15\x36\xf1\x63}\x1a\x1e\xc1\xf9\xf7w\xc7U\xe7%\x10\xdfN\x86\xc0\xac" +"\xb8\xfb\xda?\xa8p\x84\xfdqSl\xed%\n\x8f\x31\x85\x1f\xc\x9b\x41I\xa4\xff\x19Pn\xe0" +"\xd6\xb5peW\xb8\x31\xe0\x9ch{\xab\xcexM\xca\xb0\x17\xc4\xa6,\xf3\x9d\xf2\xbf\x8b" +"%\xe8\x1b)\xf8\xe1\x1c\xb5\xa1\xf4\xf3\xeb\x0\x14V\xf\xbf\x1b\x8eG1\x96w\xe8\x30" +"de}\xc2\"\xf4\xb8\x9f^\xcd\x6o\xe\xf9,\x19\x93\xd1\x62G\xceq\xae\xe7\xc8\xb4\x64" +"w\"\x13\xff\xa7\xb8\xec\xc9\xb4\xfc\xb\xc3\x7\x83-\xeb`^h_n\xe7\xd5J\xd0\x64\x42" +"N\x12y\xe2\xa1\xec-B\xb1\xd2\x93\xe3\x96\xee\r\x84\x32\xa5\xa0\xdc\x32\xe5)\x9a\xa7" +"\x91\x13 \x1a\xa5\xd2 z\xf4+K.a}\x80\xa5\xaaK(\xba\x84\xd0\xe5r\xec\xff\x34\xfd\xc2" +"\x2\xb6rc\xb2\x90\xe[\x8a J\xf2'/\xb3\x88\xc0\xc1\xc1\xc2:\x8a\x82\x1bo\xb3\x35;" +"\xf6l\\\x1\xa9\x6\x8a\xfe\x1e\x8dp\x10}\xc1\xb8\x84\x61\xaft\x12@\xe\xa8\x9b\xe6" +"\xd9\xeeH\xb3\x6\x62\x96\x83\x62\x1f\xafZ\xd5\xf9\xf8{\x8d\xb3\x1dy!\x8\x41.N1{\n" +"O\xa1\xf8\xf\xa1\x97\x31R2\xdc]M\xd2\xa3\xa3\xb1l\x87g\xfa\x33\xe2\xf2'\xcc\xb7\xe7" +"_\xbe\x98\x9d\x1dQ\xe2\x32$&\xba\xe3Z\xe9L\xa8sV\xc5\xcf!}\xde\x81\xad\xf0\x62S\x86" +"\xe8\x10O\xca!x!xy\x90\x9d\xfe\xafu3\x14\xb4\xa5\xdbX#\x0\x1dz\xe5Nio\xf\xceP\x6I\x1f\x9d\x9f\xbb" +"OA_2\xc6\xcb\xac\xa1\xe0\xec\xe0\x8eo56\x1b\xa4\xcb\xd3j\xb7\x0\xe7\xd6\\\x9e~h(" +"\xc7\xa0^\xf3G\xec*C?M\x14\xee\xd7\xe0\x6iV8\xf8\xc3\xeb\x83\x43m]G\xdd\x65X\x3\xc2" +"_\xa1\xac\xaeu\x6pq\xcc\x96\x89idrP\xcb\x8*\xeb\xfe\x19\x9dv?SHP\xad{\xec\xc6\x11" +"\x9c\x88\xc3j\xe5\xdeM\xc0\x16\x31\xc7K#\xbf\xc0\xbe b\xdc\xa0\xf4\xc\x36\xb9\x86" +"\xd0ouj\x8fj\xd3\xeeQ\x1bs\xb9J!e2\x1\xa8#\xc\x66\xde\x11\xaf\xc5\xdd\x11\xf0\xc7" +"\xbb\xcan\xdaN #\x96\x10\xd1\xb7\xc3\x97X9Uw\xa5\xd8\x34\xce\x80\x8c\x81u\xd7\x41" +"\xd8\x34\xb1\x84\xc8\x65\xc3\xd8\xa6\\xs\x13\xa9\xfb`\x7f\x97wQRjs\x84\xc1S\xd9K" +"j\x92\x9d\xb2\x65\x12\x8e\xe0\xeb}\xa9\xce\xb1_y3\x84y\x3\x17\xc8zJ+\x18\xe7\x65" +"Q\x8e\x92\x8d\xc5\xcd%}\x17\x34\xef\xd5\xf1V\x13\x45\x30\xafy\xe7 \x4\xc7\xb3\xef" +"\x5\xd0\xe1\xfb\xcf\x9!6\x99H\x9eg\xaa\xeb\x39Y\x8bq\x8b\xaa\xd8\x66\x30;V\x1\xea" +"V\xc1x\x4,%\xb5\xcbX^\xc1*3k\xf7K\xb3\xe6U\x95\x9eo\x85\x9e\x63\x12\xec\x18r\xea" +"\xc5\x8f\xe9If\xfb,h\xe1`\xb4\x90\x1ao\xe7\x1\xda`~\xb6\xe3q\xe2\xa2=.\xa4\x37T\x17" +"\x8f;\xddm\xa3\xe0\xda\xb5\x13\xf2\xcc\x3\xdd\xe8]\xe5\xf6g\xa7\x46'\xdb\xc8\xc9" +"2J2\\\xccR\xc2\xce\xd3\xc\x66\x15\xbdp\xbf\x7fY\x86\x9c\xc9\xa2\xd5u{j\x14\xbc\x8d" +"%\x96\xb9I\xbeu\xc3\xe6\xa3\x38\xed\xf1\xb1<\xef?\xe2\xa0-\xe7)\xdfV\xcc\x7\xb5\xcf" +"%v\xe9qXJ\x97'\xb8N\xaen\xd9\xd3S\xf5\x42\x9L;\x11\xfc\x9a\x7Q\xc9\x86\xf3\xb\x10" +"\xd3ZZ\xdd\x9e\x31\x2\xd0\x8c\x0\xdd\xa4\x8f\x94$G\xa2\x1]\x96\xc7\x8b\x1\x1e\xf7" +"c\xd5\xd4M\xe2\xab\x8c\x95\xbb\x38\xet\x13\x8a\x93n\x3\xe1\xb8\xc5\xb6\xba\xb7\x11" +"\xc9\x95\xfe\xdf\xb9\x10\xb6\x37\x14_\xea\x17g\xc9(=\xc7\x89%\x14/>\x87\xe\r\x13" +"\x99T\xb8\xdf\x66\x64#\xe5&\x1c\xb2\xc\xaf\xc2\x89\x8e\xce\xb2r\xc\xee\x92\xaa\x62" +"w\xf1\x12\x82r\x90g\xef=\xfe\xe0\xaa\x9dJ\xbb\x32\x19\x2\xc4WDva\xbaxRat\x12O|\x9d" +"Uf\xfd\xab]\xdfO\xb6\xc0\x8a\xc\xb7\x80\x8cY\xbb\x42\xdeI\xc8\x7f\xad\xd4\xf7Y5\xa0" +"\xce\xd7\x14\xb8\xf3\xb5\xf6\x84\x8a\xe7\xa6\x5\x96\r\xb4\xb2\xbc\xb4w\x97\x62\x64" +"\xe2\xa8JC\xcfhT\xb8(D\xd5\x9nB*9\x2\x11\xaf\xf3\xa6\xf6'\x1c\x3\xc4\xbd\xbd\xb5" +"c\x17g\xf3\x45\xd0\x9c\xceKO\xa0\xe9\xc2\xf9\xcf\x36\xa7\xff\xb1/,\x8e\xa3\x13iE" +"\xc0\x87\xf9\xc2\xbd\xe9~Z\xa7\xe0x\x1e\x14L\xe7\xbf^\xfa\xfaqP\xd7\x3P[\xf7\x41" +"+\xb9\x32\x9\x1f\x92\xb3qS\x9c\xe4\x44r>\xac\x99\xaaP\x83\x99\xd3\xed\xde\xbfOL\xa9" +"\x5\x64\xbb\xa4J\xbes\xa5\xe\x62\xec&\x8b*\xee\x66ro\xfc\xe2\x32\xddHh\xcd\x19\x81" +"\x85\x81`d\xb6\x31n\xae\xd2\xf4\xfd\xbb\xd4\xcbu\x14_\xda\x87\x39k\xaanXx\x15L\xda" +"\xbm\x8b\xc7\x99\xae\x7\xd2*\x85\xf4\xb3\xea\xdd\x5\x1\x5\x1c\xf\x46\xc6\x9c\xc2" +"jhs\x8b\xb2\n\xcb&\x98\x15\xf9|\xabI9i\xfc\x16\xf0qN7b\x9c\x83Q2h;O^M\x7f\xcf+x\xb6" +"\xc8\xf2\xf2\x9\xc4\xef\x7_\x83\xeew\xd5\x32\xd6\xaap\x98\xc8\x93\xe6\xf1K\nwz\xbf" +"|\x1\xe9\x88L\xeeU\x6i7\x17\x83V\xbd\xf9\x7f\x9c\x1bX\x9d\xe1\x61\x94\xfc;\x15+\"" +"\xbc\x6\xe4\x84.\xcf\xdehG\xdb\xe6\x95\xdf%\xbap\r\xd7\\\xe.\xc2\xcc\x97\x16\xdf" +"\xe2\xa4\xe7\\U\x8e\xe^R\x1ep\xd7\x30^Sy\xbd\xb0\xf5\xac\x30\xf0\x91\xa7|d\xb7\xbb" +"\xd9O\xcd\x4H\x86]\x86oM$\x1e\x19!\xefR\x91\xc4\x14\xaes\x82\x46\x7\xd9\x96\\\xa1" +"\x85\xc3\x0[%\x83\x84\x62\xb9\x37\xc9\x1e\xd9\xc3\xa6I\xd5,\xdb\xcd \xcfj\x1d\x8a" +"02\\\x97\xa0\xf8\x33\x1a\xf0\xc4\x1a#e\xf0\xe3t\x83\x3\x46\xef\x9d\x89_\xe9$S\x10" +"\x98\x87nD\x7\x91@\xbcMv' \x8b\x1d\x9\xe4\x66*\xa4[\x97\x96\xac\xa2^?\xf8\x62O\x14" +"\xee\x12|j\x86\x37y\x96\xa4\xfa\x8e\xbdK\xe5\x32/\xec\xd2\xf1\xff\x85\x64Z\x9a\x11" +"D]\xc7\x32\x8azi\xbf\xf5&:\xc3\xb7\x7f\x96\x8fi^J\xa3\x81\xb8X\x1d\xf3\xf8\xfa\xa2" +"\xce\x46Y\x87\xb1\xf2V\x89\xd8\xb4\xffoy\xd3v\xa3\xea\xe3\xaa\xc7\xc8\xcc\x64\x36" +"\xe5q:a\xad\xc6\xd5\x8e\x8a\x9e\x9e\x97\x89\x93\x8b\xf3\x9d\xde\x35\xf3\xad]/a\x9d" +"\x7\xb6\xbb]5'}'\xd0\r\x15\xbc\x34\xab\x44\xee\x8f\xeb\xc2\x99\x35\xf4\xd7\x8fq\x83" +"G\x1b\x32\xfc\x32zc\x1c\xb8v\x97\xdb\x1b\xf9\xea\x35\xba\x9\x97\x61#[\xd0\xfb\x8" +"\xc9\xec\xed\xc0*V\xf2\x1\x32\x80\xbe\xf6\xc5|\x9d\xac\xcf\x1c\xfe.dymA\x85\xed\xc4" +"i\xa7\x1d\x96\x88\x9e\x64\x46\xc4\xcp\x5\x39\x9b\x89_\xf1\xe5\xbc\xf4j\xc2\x30\x10" +"\x1y\x1f\xbf~\x89_\xbf\x64\x87\x9\x37\xee\x66r_,Vq-\xa4\xd4\x80\xb8\xa6\x38,1~\xef" +"\xa0&\x82\x11\x66H7\xc0\xaeH\xe6h\x86\xe0I\xc\xf8\x65\xc\x13m\xea\xe1\x36(\xfa;\x1" +"4\xe~\xd1z\xeeH\xe3\xf8\x32@\x96\x90\xbb\xe4\xee\x1eN0\xf9\xd7\x93\xf\xb5N\xf7.\xf0" +"o\xbd\xe9\xd7\xaeh\xfd\xae_\x14nz\xdc\x44\xb8\x99\x64<\xc2\x7\xc5>\x14\xc7\x66\x7" +"\\\xea\x41\x32\x14\x6\xab\xc8\x91j\xd2\xf7\x63\xf2h\x88\x61\x36\xab&Q\x12]\xa2\x93" +"H\xb6\xbbM\x17! >`\xf8PI5\xce\x98\xb7x\x1c\xec\xe0\x0\x65\xb6\xa2\x46\x99\x2\x2n" +" \xfc\x30\xef(\xad\xa4R\xf8 \x97\xed]\xa4\x87O\xd5@\x9fpV\xa0.P\x18\x95\xc0\xf5\x61" +"v\x82\xad\x95\xa7@\x13\xd9_\xcf\xc7\xbf ;_\xef\xe8\xad\xed\x7f'\x13u\xb\xd2$\xb8" +"6\x1d;\xe7\xb4\xef\xf6\xecr\xc4\xe4\x84Uj]}b\xde\xc6\x1e\x7fO\x90,\xb7\xd1Z\xdd-" +"|\xf5\xb9\x65Sq8L\xec\xa7\x36\xae\x87\x84\x8d\x97T\x1e\xc6\x45\xfc\r\xe7\xde\xd4" +"\xe3\xc8\xbaK\x8a\x99qnvz/BB\x2\x8b\x61\xfa*\xc2\xe8\x10\xfd\xca!\xad\x7\xa2\x8e" +"\xa5\xab\xa5\x32\xcd\x61]\x8G\x92lD\xe7\xd4\xfdk\xf4`c\xaerTw\xbb\xe9\xff\xd0\x1c" +"\xca\x11l].5\xcb\x91\x43k\xa0\xd7\x13\xe9n\x81\xe1\x88!|\xbc`<:\x1e\xc4S\xf8>\x95" +"\x80\x63\x5\xae\xc6\xd5&\xd1\x9f\x9" +"eG\x6\x1e\xe7\xc4\xcbZ\xcq\xbc]\xdf\x9\xc\x36:\x8d\xe6H\xd4L\xb7qfRY\xe5\x5s\xff" +"\x94[R)\x1e\x82%\"\xc0\xdd%Z\xd3\xad\x42Ge\x8a\xc1\xbd\xf7\x1e,\x8b\xb6/C\xc2\xf3" +"\x99\x44\x11\xb8\x98\x84\x82\x1f\xbf\x96<\xaf\xa4X\x9a\x41\xf\x8e\x61\x31\x7f\x4" +"\xcb\xf9\xb8~\xf2\x36rL\x85\n\x42\xf9\xaf/6\xa8Pr\xbb\x16\x91\x1dx\x10\xce\x35\xb5" +"\x8ak:\x97\x8cn\xee\xb3y\xbe\x44Q\xf6&\x1#\xa5ks\xfeT\xdb\xbcO\x19\x34\xfd\x18_\xb3" +"t\xa2\xf4\xb2\x5\xedx8\xc2$w\xf8\xebL\xd1\x2\xc5;L\xa5\xadtx\x9a\x44h\xcf\xa7\xcf" +"\xdd\xdd\xd2=\xb2+\xa4\x31\\p7c\xd6\xb3\xdaW\x8e\xdcN\xc0@\xd4\xf0HBx\xef\xf6\xb2" +"\xf4\xb1\xe3\x18\xa5u\xdcS\xbd\xad\xb2K\xe8\xc5\xa8\x1fH\xfc\x97\x4\xc9\x63ZW\xf2" +"\xbc\x8b\x87\x92\x1f+?\\\xab\xe5\x17\xb7\x90\x9fo\xac;\xb8ZO\xf6\rQ'\xe4]\x9b\x38" +"\xd7\x66 \xe6\xed\x90\x1a\xd2\xf\xeeU\xa9\x9a\xec\x87\x99_T\x80\x9f\"\x61{(\x9f\x30" +":\xc7h\x97\x19\xce\x10\xf9\xd5\x45ozH\x4\x11Z\xbeL\xdb\\\xfe,\xc7\x15\x94\x1a\x95" +"\xb8\xb1\x87\xb5?t\xc2\xb8.\xaa\xdc\xa9k\xd8\xb9\x2\xc5\x8e\x17\xd1\xbb^\x8e\x87" +"\xbb\n\xa3T\xcb\xed\x83u:\xef\xde\x1d\x1b\xf5N2F\xaa\x14\x85\xf7\x96\xfe;\xe9\xcd" +"]\xb6\x99,&G\xe4\xd3+\xa1K\xfd^\xf0\xcb_\xb1\xf7\x7f\xe]\x13\xd7\x1T\xbe\x1e+\xe0" +"\xeall\xa7\x1aP$\xddL\x80\x92\xc4\x65\x91\x30\x19\xcc\xb8\xd9I\xe2\xdd\\\xd8z\x19" +"f@\xbd\xf6@$\xcc\xf3\x8d\xca\xb7\xf0\"\xa6\x88\xb9\xc6p\xe6\xb4\xfb\xfb\rz\xa5O5-\xf6[\x81\x30\xa4]_\xef\xe6r)\x1e\x15\xf3O" +"\x8f\xb8\x65`\x9\x31\xd1\xc7Q\xab\xd8\xdc\xa8\xccn\xc3\xc7\xe7\x35\xa3\xac\xcbk@" +"~(\xba\x94\x12v\xbc\xd2\xe2!\xf0j\xa2\xe1\x80 \xc8\x8au\xe0,\x87QPX\x0\xa1\xd8\xe8" +"\xdd\xa4\xc4\x17\xc4\x8f\xaf\xd7\xb2\x85\xf8w\x19\x89\xd0\xe8O\x89\xad\xca\x1d\x96" +"_\xfb\x37\xc7Oc\xe0\x8f\x9eZ\xcb\x8Zf\xc8[\x84\xad\x8c>\x85\x35M\x17\xe0T\x94\xbf" +"\xaf\x92\xddN\x91\xef\xa6\xfcS\xfe\x92\xb7\xc2\xcb\xd9<\xe6\x9b\x35\xcf\x44\xba\xca" +"\xa3:Y\xde\x80\xd5\x0\x46\xa1$\x3\x9\xe2\x61\xf1\xfb\x35^I\xf9\xb1[V\xcaP2z,b\xc0" +"\xb9\x44\xef}D\x8b\x62\xfbu\x80Ve\xa5\r\xdb\x30\x9c\xdf\xc7\xcbsh\x17*uB\xfa\xb7" +"\xeb\x9d\x38`\x19\x88t\x93\r\x42\x8f\x37Q\xd8\\\"\x8a\xc6l\xa1\x9f?{_+\xb9\x33\x3" +"\xb2\xdd\x15\x32\xbf'\xe6\x86\x39v+\x9c\xb5%\xf9\x16\xd0G\x8e\xa7\xedn\xe9s^v\x81" +")\x1e\x17\xb2\xd3,\xae\x41Y\xcc\xfew=\x9a\xcc\x97&\xer\x1a\xf0\x94>+\xcc\xb8\xcc" +"\xbf\x17\x7\x7f\xf7\xff\xd3\x89\xdc\xf0\x6\x6O\x8d\x89\xe4!\xa2\xe8\xd8\x9\x8fr\xbe" +"\x9e(l>\x82N\xa0`O\x89W\x89\x86l\xdb&\xea\x1\xda\xd4\xb4o\xaf\x38\x4\xf4\xac\x97" +"\xff*bk\xc0\xf0Y\xd2\x14:\xb0Z\xad\x94\x45\x89\xac\xb5\xe1T\x13,\x93\x92\xd8#\xc0" +"r\xaa\x87\x99\x94\r\\\x98\x38j\xf\xd6\xb4\xd0\xb5\x36R^0V\x99\xf4\x17s$!\xbbX\xa7" +"Uh\xadN\xdbS&\x8c\x81h\xf9\x14\xbe\x85,\x86\xea\x2\xd3i1]\xd5\x92\x36\x39\x15\xdc" +"F\x97)\xf0\x1e\xf1\xbf\xfa\xf4\xa5\xd2\x9e\xe7\r\xa6\x32\xb9\xe6=\xd3\x83\xee\xcd" +"N\xa3!\x14\x64,\xb6\x16\xc8\x97\xb7\x95\xd2" +"\x93\x61\xf8%<&}\xcb\x65/`Z\x96\xd6I-\xdc\xac+\x13\xbf\x90N\x88\xc9\xf\xd7^\xc7\x7f" +"sd\xbbu\xae \xb\x61\x36\x15&\x4J\x94\xc7\xe0\x33\xbb\x86\xd4\x45\x97\xed\x39\xb1" +"\xad;{\xce\x8e\x10\x65\x9c\xad\xbf\x9e\x7\xb3\xfb\x4\x1c\xf1\xa8\xad\xc4\xb7L90j" +"\x85\x90\xd5\x8d\x36\x36\xed\x87)\x9cG\xcc\x12\xa8G\x12\xc\xa9\xf7q\x82`o\x86\xb7" +"$y)\x8\x36rUg}VI_\"\xaa\x12u\xb2\xff\xaf\x1c\xef\xda\x12:\x89\x84\xc6\x7\xd4\x38" +"\xcd|\x0\xb7iI{\x9a\xf6!\x94\x89\\ly\x81\x93W&L}\xbL\xe7\xa2Y\xdd\x16\x96\xe7s\xcd" +"\x7\"\xe2\x8a[\xea\xfe&\xc7\xd0J\xd8g\x88j\xc5\xd9\xd1\xf8=\xfe\x97\xf6p\x1c \x0" +"\x7\xce\x81\x85\x9e\x8d\xa0\x65\x5\x46\x8f%\xe7|\xbd\xb\xe5\x91\x94p\xe\xc5\xb3\x9c" +"0\x0\x18\x13\x98$\x8b\x39\xe6P7k/\xbd\x97P\xbb'E\x7f\xb4\xca\xe1\x61]\x16{j\xde\x44" +"\xd5\xd4\xb9\xb0\x84\x92\xe7\xd2\x12*\xf1i\xba\x8d\x1f \x1e\xe\x83\x33v\x9b\xf9\x1" +"\x86*\xd4n\xcc\x9dX\xb8\xf7+X\xfe\xc6\x1b\xddi\x1c\xc1J\xef\x8f]z4\x11?\x9b\r\x8" +"\xea\xa4\xfb\xbf\xd5\x30\xb7<\x15\xf0\xfe\xefLE\xa7\xc8\xc7\xb6\x8eS\x10\xe0\x93" +"fr\x82G]\xa5\xdbge\xffV`i![\xc0\x9d\xd0\xa8\xe5\x18l\xc2\xc1\x1e\x35w\xb5n\xb1:\xea" +"`5\xd2\xdc:\xdd\x1d\x13z\xe1_\x8f\x9a\xa9\xb5\xb\x64\xc7\xb7\xc1\xdf\xd5\x81[\xdb" +"\xff\xac\xc7[\x84%H\x4\xb8\xbe\x14I\xb3/E\xae;wL\xb6\xf:\x9b\xa3\x45\xe\x8\xa4\x43" +"/\xf2Rv\x86\xe3\xcd\x4\xa7\xf0\x35G\x1b\xb4\xbd\xdfNN\xd9\x30\x9ep\x8b\xe0\x43S\x9d" +")\x81\x6\xcbLnx&{V\x82!\xcf\x64X\xf5\xa2\xee\x17\xce\x8\xcb\xa8!\xd9\xb8r\xb5\xb9" +"\x85\xee\x93\x9c\x10\xa4]\xb0\xcb\xb3\xa0\x94\x32\xbd\xac-\x10\xb7<)\x99\xf\xda\xde" +"J\xc1\x61\xa5\xdf\x44\xc1\xbc\x8d`\xdf\xcc\xe1u\xb9\xfc\xa5\xfe\xdc\x34\x7f\xcfz" +"\x9c\x89{7\x85\x7f}\x8c\xb1\xe7\xaf\x13\xf4Xj#\xbf\xc9\x86\xb\x88\xa2\x8b\\\xdd\xa2" +"[t\xb4\xbb%S\xe8\xedyk\x3#\x13\xe5\xc6\x1f\xf4\x14\xbbn\xeeM\x9e_>\x8bKx\x11\xd5" +"\x80\x9a+\xe4\xa6\x9\xe3\x9a\xc\x8f\xac\xbb\xab\x96\x61\x9a\x34\xdf\x96\xaa\xf4." +"\xc5\xbb\xf\x16\xc9.\x10K\x95%\xc\xe2\x3\xaa\x9c\x6*@\x9a\x4\x8\x9d\x2\x96oEK\x8f" +"\xc5\xf0',\xa0\xf4r\xaa;\xff-UsO\x9e>\x93\xc9\xef\x83\xd7\xc3\xfS\xb3\x34\xcc\n\xe1" +"\xe8\xb0\xca\x1c\xd4\xc7OY\x93\xca\xb7'O\xdc\xdf\xe8k\xdb\xbb\xf3\xeav.V\x8d\x93" +"y\xdd\xf4\x1f\x9ZT$3rw\xf8\xe4\xf1\x10\xbf\xdb\x65\x44\xbc`\x8e\xfd\xa4Qw\xbe\xb4\xb1\xa0\x9e;a!\xdb_\n%\xde\xc3\xb8\xa1" +"h\x89\xb0\xd2\xda\xc7\xce\x9e\xe7\x33\x90\x31\xb5\xddH\xb2\xe2\x17\"L\xce\x66j[!" +"\x8d\xfa\xed\xabk\xb9\xdb\xa3kkX\x8e\xd0\xed\x38\x4\x4\x7\x85\xf8g.\xa1zk& \xf6S" +"\xd9\x8e\x65\x87\x64R\xca\xac\xeb\xd4\xf8\xd3\x99\xe8X\x1e\xea\x89\x9cY\xe5\xf5\x8" +"2\xdc\xba\xc\x17\x14\x1c\x8\xa6\x9\xf4pG\xf3:\xa2\xb\x81U1\xd7\xdc\x90r*&\"\xb0;" +"~\x82\xcfL\xfc\x87\x1f\x45\xf7\xb7\xf0@\xbf \xf2\xa0\xdb\x10\xb\xf9\xf3R#:\xcb\x10" +"P\xd1\x42\xba[\xe8\xa9W\xf1\xb2\xafO>e\x1b\x1a\xb3\x8?\xc\x7f\xba\xcc\x93Hc\xd2\x84" +"^Pq\xfa\xe1\xe3\x98\x9e\xf2(\xcV\xa8/y\xee\xe0Z\xa4\xeb\xdfka\xc2Y\x18\xd7\x4\xd7" +"\xf7m\xc\r}\xbc\x1b\x88?aO5D\xe0%I\x9c\x16\x96{\xc6m\xd5\x9f\xc7\x1e\xfe\xfd\x9b" +"\xad>\xc2IE\xbco\xe1\xb5\x88I\xa8\x19\xbcTL`\xd4\xdf\x10 \x1b+\xe4\xb7\x65\x9dLD" +"\xbb\xc2\xbc\x31\x1\x5\xb8g\xc6\xe8#z\xf1&(Sl}B\x87\xe7\xcb;\xfc`\xfd\xc8\x44o1\xc" +"j\xad\x45\x7f\x1b\x42\n\xa6\x1e\xdat\x92m\xc9i\xd7R\xd0\xb7\xcfo6\xad\xd8\x8a\xc6" +"g\xbfI\x12\xa2\x37\x18K\xc2\r\x38\xfc\xa2\xe5\xc\xf9i\x8f\x97\x13\xfb\x15\x42u\x9b" +"!\x2\x41\x9\xd0m]\xf5\x12\x66\x34\x44\xec@\xb5\x8d\x82\x87\"\xf0\xfau(T\xa4\xfa'" +"\xf2\xe1z=\x9d[fv\x96\xa8\x87\x1c\xf2\xfc\xee%\x85R3\xb6p\xe7\x8e@\x1e\xa8\x4\x65" +"\x10\xa6\xcd\xb7\xf3I.\x8a\xbcM#\xf5\xf1\x18\x9a\xe5\xb1[\xb1\x43\x7\xc2\xaa\xbc" +"\xde\xb\x39\x8b\xcd\xc8\xcb\x33\x9e\xe3\xfaH\xbb/\xc5\xb1\xa6\x36\xb3\x8\x84\xb3" +"B\xc4\xd1\x65\xba\x9)\xea\xa8\xd4\x11\xf8z\xb8\xb3kP\xa5\x1b\xa2\x30^hh\xfz[K\xc8" +"UPR5J\x1d\xa9\xa6\xfd\xa6\xa2\xb3{\xb2H#~t\x18!l8\x8a*j\x18\xf2x\x88\xbd-W\x15\xb2" +"dc\xb3\xbd)$\xa3\x19\x98\x1eh|\x15\xddG\xe4\xeaq\xeb\xc8\x7f\xd7\\rE;r\x88\xc8\xc5" +"x\x0\x62\xb3\x18+\xb\xab\xb9\xcek\xd6\xed\xe5\x63'\xd3\x37\xba\x1c<\x7f\x6\x99\x32" +")-w\xea\xa0\xb5\x15\xd3\xeb\xe1;[\xb7\xe\x17\xc6\x66Xc\xac\x3O\xeb\x83LU\xd8\xcd" +"\x1c\x7\x83\x4\x87\x1b\xf7\xd1\xa7\x82\xa4#\xb9\x15\xf6p\xa5\x9c\xdb\x30\xec\xc9" +"M*\x0OO\xb3\x94\x63\xa2\x81[\xcb\x1a\x96\x81{]\x10Z\x8d\x1c\xa1\xa8\x11\x97\xa3\xa8" +"<\xd6K\xb1\\\xc9\xbf\x31\xcd}\x17M\x1e\xa7\x8c\x95uz`zm<\xe4\xde\x0N\x84\xf\xfey" +"\xc\xb9\x8f@\x0R\r\xa3\xaau\xe0\xc5\x11V}\x8d\x9'\xe7\xb0\xc2\xca\xc2\xde\x17 \x94" +"\x81\xed\xae\x91\x8d]Zv\xcaj\xbf_\xf3R\xf1\x1a=\xec&\xdbJ\xc6\xb7(k\xa4]M\xe5\xed" +"\xdd\x38\x62\xad\xe7\xf6\xbc\x13t\xffV#\xfc'I\xecK_\xd8\xe8\xde\xc4\x82\x10Q\x1b" +"I\xff\x88\xaag\xa7izA\xb7Ux\xa6`\x3T\xab?\xf8\xdf`\xef\x83J\x6\xe0\xa8\x8fj\x9bP" +"P\xe3\xdd\x32$\xb5\x11y~\xf8+\xb0\xccr\xa3w)\x8aqM\x3\x80\xec$\xa6\x64\x63\xe8\xd1" +" \xca\x66\xbd\xc4\xbf\xf4\x1q\x8b\x89\x89\nL\x3\xe2\xa3J\xad\x99I\xdb\x66\x94\xae" +"\xe7\xd6;2y\x81$\xe5L\xdc\x35\xaaN\xf8\xfd\xb7H\xd2\xc6\x81\x85\xe4\"-\xfc\xf0\xb0" +"=<\x12\x15XC\x89V)$P\xe7\xbc`\xe0\xc\x36\xf3\xbaZ%X\xc1S\xb3\xa7\xb3\xe5\xb6x\x99" +"A\xf8\xc8?e\xb0\xe6\xbfzbh$\xb0\xe9\x30\x8\xc9\x90\x9bmlr\x10\xf3H\xc7%\x84\xa6~" +"\x86-\x84\x34\x84\x1\x5\xb2\x81\x13\xb5\xb5\x1e\x86H\xe2\x83\xaa\x62\xe6\xc\xe2\x15" +"\x4g\x3;\xde$\xac\xb1v\x6\xe1\xed\x9c\x15\xf9\xd4\x64\x39\xdd\x0\xcf[ \xe8\x38M\xa2" +"\xba\xee\xc4\x8d<\xfb\x7\x63\xff\x37\x83\xa0\x5\xb9\xa4\xe7\xec\xb\xf3j\xf1u_\xfb" +"\x8,i\xf0\xe8\xf4\x80z)\x87\xd7\xa3\x8c\xe5\xe\x1b\x7f\xff=i\x14\xdf\xe2\xb1\x9a" +"\xd4\xb8\xa4\xc3X/\xf4\xa4\xa3\x83\xb1^\xb1_\xe5\xf3\x61\x34\xb9\x6\xb1\x8fk#\x1e" +"\xac\xf4z\xbd\x1bR\xabW\n\xc9\x64\x14\x19\x97\xd8N\x87T\xac\xb5\x9d\xe5\xbc'sp\xef" +". \xe1\x44h\xd2\xc5\xe6\xc2\x32]%\xc3\xa1" +"y\xe\xb0\xdd\xa0\xd8\x88\x61\xa7\x7f\xd0\x43\x91 e\xf0nr\x92\x90M\x96K\xcaT\x83\x95" +"\x9fo\xd4\x37\x2\xd7\xef\x13\xe0\x46\xfcgM\x8f\xdb\xf3\xb9\xf4\xad\x11\xd2\xb1L\x1f" +"\x12\n\xe5\"\xae\xbi\xb0\x1e\xb1\xde\x89\xb3\xa7\x94\xb5\xfe\xb4\xd6\x46K\xd1\x38" +"\x2\xdd\x61z\xb5:\xa8\xf1\xbb\x96$RY4V1l\xf6\xa9\xadj\x4\xc8\x93\x30\xbd\xa5\x8c" +"\xe2\xad[0\xcb\x36\x8f\xdc\x8e+b\x84^\x11|\x96[\xf0R\xee\xd2\x9c\x2\xc4:\x88\xb0" +"D`D_;-I5\xceMF\xf9,\x99I\x89\x46\x61\xa9,$\x1d\x8\x8d&\xa7\x44\x14@\xb\xef\xf5\\" +"\x1b\xa2\xc0\xech\r\x5\xc5\x41.u:\x10Vn|\x8d\xb2\xd2\x30=\xb5\x16\x1d_3\x17q\x5\xd6" +"\xba|\xf4\x8f\xac\xcb:N\xac\xa9#\xd5\xa1#\xf2\x95\x1f\xc3}\xf9J\x86\x1ap0TdVti\xd5" +"G\"\xfb\x82\xa3\x1f\xe1\x8a\x65\x5l\xad\x43\xa8r\x96=\xe7\xb4\x8P\x5\xdb\xb\xe6\x97" +"\x8b\x2\x84\xe5\x13\xa8\x98\x87\xba\xd0\xd8\xf3\x8b\xba\xa5r\xf6\x66\xc|\xc5&T\xc7" +"\x6\xf0\xb8\xe1\x98)l\xc2\xc6\xee\x65\x61{8:?I\x1dV'F\xfc\xbd\x1M\xb7&\xa5\rOD\x10" +"\xe6N\xd6\xf\x10\xd5\xe4\xf5\x88\x9dt\x1e\xde\xda\xd2\x90\xc0;\x9d\x9c\xa9\x95\xf4" +"\x9e&\x4\x42\xe7\x30}|\xcd\x36\xea\xcb\xd5\x7`\x1d\x66\xaa\xeb#&\x5`\x1a\xa2\xb9" +"\x90_n|YE?\xe]l\xe8\x45\xb\x8a\xdb:7+@\xb7\x65\xb~\x81\xb0\x98\xf\x9R\x9\xe8\xda" +"\xb1\x94\x1L)\x9d\x65\x91\x44\xaf\xef,\xdf_\x12\xc0_1\x1\xc7\x39\x44\xd7n\x9e\xe2" +"\xfd\x92\x90k%\xb6(W\xb4\x92\xb2:f\xcc\xff\x19\x8\xcU\x95_\xa1g\xb7\xaa~\x13\xbf" +"_\xa8s\x11\x66\x95Q\x83\x41\xa7\n\xa4\x18\x44\xef\x3\xc4\x81\xc2\xa3od\x16\x1dr\\" +"\x15\xe\x86\x9e(\x4%\x99`8G\x7f\xc5\xa6\xdb\x6K\x8d/\xd9\xbe\xd3\x11\x9b\x8d\x93" +"\xd1\x9c\xfb\xe4\x18\xb9]d\x83\xbb\xf8\xd3\x4|\xb7\x88\xe3\xb5\xd3\xeb.\"\xe\xec" +"{H6z\x91m\xf7rdY\xbb\x90\x46L`\x96\x2\x9d/x\x1d\x30P(\x89\xac,\x93\x44\xb8\xfa\x45" +"\xec\xfb\x1fP\x99U\x1fX\x0K'\xc0\xe4\x89\xfe~\xc5\xeam\r\xfc\xe3\x1c\x1b" +"P\x6\x80`sr\xbe\xd6j\xe3=\xb1\xae\x66\xa2\x15\xefW;R\xdd\x7)\x9d\xb4\x1\xee\xd5\x36" +"\xeeK\xbX{\x91\xc\xcc=Qr\xb4\xac\x15H\x90\x98\xa6\xec\xbd\xcb\xef\xf2\xc9h\xd2n\xdc" +"3\x9a\xcd\xfb|0\xe4\xb1>\x9bSb@&K\xcc*4\xa2\xea\xbd\x64\x1c\x9e\x9a\xedpo&lI\x1b" +"j\xc6\x18\xc0\"\xb2?\xdf \xe5\x80\x9f\\\xaf\x1\x98\x87k\xa9+W{\x12\x8f\x81\xd8\n" +"\xff\xc4\xb6\xaa\x9b\x8c\xa7G\xb7\x83.Q\xf@L\xbe\xb6\x39\x39\xb5\xd8\xa7\x7f=}\xa7" +"\xf2?\xb2v\xd5P\x9Y\xa3\x94\xa2\xa8T\xda\x1a\x36\x1b\x8e@\xd1\xa0\xf4\x1f\xc6}Q4" +"\rh|+\xeb\xcd\xa5\xbb\xa4\x18iL\xc3\x92\x30\x1e(\xe3\xc2\xc2>\x7\xae\xaa\xf4Ip\xe0" +"\xdb\x8f.D\xe6\x7f\x9f\x37*\xffg\xf7\x35\xb1\xdf\x1a\"\x8b\xe4\xdf\xd3\xeb\xc0\x92" +"-\xf5\xbe\xce,\xb1\xbc\x8exC1\xaa-@_G+\xb9\xed\xb4\x1b\x80\xc7\x84\xf5\xa7\xa7\xf3" +"\xbb\xda\x85h\xb7\xb2\xea\xcb\xa1\xc\xfaW(\xf5\xa6`\x9a\xc2\xa5\x90\xb7H\x83\x16" +"\xc\xb1\xf1-\x1d\xd3n\xbT\xce\x38\x8c\\\x8f\x30\x34\xf8\x85\xa2\x99yY\x9f\xe6\xd5" +"\x9e\x93s\x9f\xf9\x8b.\xacyx_\xf9VB$\xd6\xb4T\xfc\xc2\x8\x43 \xd2\x8c\x90\x3\x2\x37" +"\x94u\xb9\x11\xdf\xd9\x95\x1b\x7^O\x14&\x86\xa3zCz\xef>\x15\x81@\xdfq5>\xf\x93%\x46" +"\xff\x92\xb9\xfb\xb7\xc4M\xb1Sp`\xe9JB\x11\x64\xe8\x14\xde\x32\xd1\xf3\xd4\x8\xd4" +"4V&\xb8\xbe\xe3\x88\x96\xff\x33PF\xaa)1\x85I\xcc\xc7\x8b~\xcb-\x17\xd6\xfc%[i\xc9" +"'\x81\xf9\xa5\x61\xdd\xd8\xbd\xe0\x9f\x4\xc4\x37L\x2%|\x98\xe2N.\xe4\x7t\x1a\x8f" +"\x2\xb8`\"\xd9\xdc\xc4I\xb7\x30\x96\xf\xcf\x1b\x9b\x8d\x65\xaf\x9e\xf\x10\xaf\x8e" +"\xdf{\xd3\xf1\xcd\xaa\x9d^\x15\x4\x16\xb6\x33@\x89\xdc\x86.?\xde\x66\x33\xfa\xd9" +"@\xbf\x88\\\x97\x61\x85\xadVg\x99\x1eu\xa2Y08\xfc\x8c^\xda\xc8/\x6\xc2\x13\xb0\xda" +"\x99\xcp\"D\x9bvza\x9b\xbe\xe9\xc2\x9e\x65\xd9\xcaS\xce\x96\x1m\xc\xd4\n\xaa\x18" +"\x8a\xa7\xc6\xb\xce\x10\x14&^\xfd\x92\x6\xdd\xab\xb6\xc0\xab\xbeT\xf1\x89\xc@EH]" +"\x1dO\xa0\x3\x87K\x10R\x14|\xd2iU+f4`\x93\x1b^\xf7\x82L\xec\xb7\xd7\xb8_fd\xa7\xbf" +"\xec\x44\x8a~Y\x1d\xafh\x91\xf8\xf8\xb0\xc5\xf8\xc8$\xd5\x6\x7,\x9e\xf6\x83\xbc\x85" +"\xbe\x1e\x7fN$\xe\xe4\xb\xb1\xe2=N\x8fo\x8a\x31\xf4\x64\xf1\xa5\xd1\x39\x89\x45\x64" +"\x4\xff:P\xcd\xe1IV\xdb;$\xe0j\xf7\xbd\xb5Rz\x0\xf*\x85>\x95\x35\x91MF$\xcd\x39\xea" +"\x90\xa4\xef\xdc\xac\xaex\x11\x37\xc\x81\x30\x9e\xf3`\x2\x1d\xcy\xf6V\xbf\xd4,\xee" +"\xf8\xf2\xa7\xacofGH$D\xf5\x87\x87pk\xe9\xc7\xab\x84\x44(\xaa\xbb\x66y\xe4\xb8\x98" +"'\xaf\x8c\xf9U\x0\x93\xb0\xf7\xeax\xa5<\xa2K\x8c\x89g\x9\xae\"\x13\x30\x85 ,[\\>" +"I3\x9+lZ-N\xf8\x8c\xd2\x46\x97)L\xd7Jz0W\x1e\x14\x32wp\x8fT\xfL\xee}\xd8T\n\xc1n" +"\xc5\xf4\xde\xd4\xd4=\xce_#\x8d+`}w(\xa3zL\xd1\x10\x87\x93%\xf5\x83\xc1\xb3p\xd1" +"n\xbf\xba\x95\x80j\xb6+\xf0\xfe\x93\x1c\xa5\x8eh\xfc\x10\x10W\xcc\xe1\xbe\x64\x8b" +"\xa9\x9dj\xf6\xf4\xf2\x88\xa8\x1a>u\xc2&=\xc3*\xab\x93\xd4\xed\x5,\xd9\xf9\x7f-\xd9" +"\x12}\xd3/\x89Z~v\xbl\x4\xbc\xa8\x4\xec(l1\xd5\x88P\xac\xb7\x83\xe4\"~\x8f\xe6\xa5" +"^\xb5\xfk\xb9\xaa\xa2_\xe4\x64!\x16\x9a\x10\x88\xc3\xa6\xc?\x83\x91\xac\x82,W\xa4" +"\xd8?\x1\x8e\xd3\x39\xd5\xa7\xf9\x1b*G\xc9Q\xee\xa9\nsh\x3\x93&A\x83q\x0\xc5\xcd" +"L\xb6\xce\xff\xdf\x15z\x98\x35\x85_S\xd8\xbf\xe1\xe5J\x98T\xd8\xf7XN\xd4\xe9w0cT" +"\x97`J\x9d\xf1VB\xbb{\xbe\x85L\x87\x15uUo\xb\xfb<\xcf<\x8a~\xf1\xae\xaf\xf3q\x87" +"Z\xd2\x30\x14\xe0\xe5\xcf\xa1\xd1\xec\xceZ\xc4+\xb7/\xf4\x63\x33<\xef\xb2\x37{\xe4" +"\xcdq\xcc\x6T}\xcet\x82z`\xbb=,\x92\r\x91\x8f\x65\xb0\xf4\xed\x43l:9\x98ye 4\x99" +"r\x8d\x7f\xb\xa4\xa3\xde\x62\xb3\x8a!h\x91K'\x9c\x94U\x95\x9cQ\xf2\xdcI\x5\x81\x31" +"-&\xf3\x91\x13\xe4,\xfc\x81x|\xd3\x9e\xd8\x84\x19\x86u)\x8c\x99p\xcek\x7\xa4\x39" +"\xae\x17\xd3\x46\xf1\xa1\xc4\xc5\x41\x7f\x0\xd3\xa2\x85\xf5\x9b\x8\xbe#\x1\x80r`" +"\x8e\x8d!\x3\xddn\xb5(%5$lx\xc0j\xbe\xe2\x8e\x89\x81h#\x19om\xa9\xf6\xd1U.\xba\xd2" +"\xa2\x86\x33\xac\xf3\xf2k\x86\xde\x65\x1fZ54\x92;\xf5GX\xf3\x94\x46\xfd\x8c\x96\xb" +"\xc1\x8\xff\x90 \xc8\x8a\xd0\xbf\x94\xf2O\x8c\x44Ia\xbf\x17\x42\xde\xdf\x34\x83\x9a" +"N\x86\x96Q)L\x8c\x9a\x83\x83)\x1a[F\x4\x16\xa6\xc3\xf\xc8\xb2mttM;\x6\x99\xbc}}\xf9" +"\xaf\x19\xe6\xc2\x97\x3.\xd6\x1c\xd9\xbe\x4\x1d\x42\xe1\xa8Rr\xd9\x81\x17j\x8d=\x2" +"\x83\x46\xd2\xb3\xfdl\xf3\xbf\xebu\x9av\x14\x9f<\x83\xa3r\xb1j\xa1}\x8d\x13'SQ\x90" +"\x1eU\xbe\xf3G}\xd1\x44\xe\xd8P\x9aV\\\xfe\xbK]\x83%:s\x82\xb9\xea[\xae\xd8\x30;" +"z\xb5!ZL\xd3\xac\xbb\xd2\x8a?\xc2O\xd8\xe6\xebY\x0>\x8\x80\x83G\xea\xc9I\xce" +"\x18\x7f\xa8\x16\xf6\x9en\xden\xb7\x95\xf9\x10\xdb\xfc]\x85\xc9\xf5\x81\x62\x1b[" +"~\xa9\x82\xab\xbfY\xe7\xe0\x1e\xb6\x65iSUHmF\xa3\"-\xcc\xf7\x9e\xfa\x5%\x42\x9\x3" +"N\xab\xb0\x14{\xc5\xe2\x1d\xbb\x36\x12\x96\xae\xb0\x14\xe2\xa6$qf\xd2~VC\xbf\xc0" +"j\xc4\xb1\x38\xc0\xbb\xdd\n\xed\xd1\\\x46\x8e\xae\xf7\x43$e\x1a\xcag\xc0\xf7\xbe" +"B\x12&\xdb\x7f\xbf\x4\xb2\xba\xed\xaf/\xe6u/\x13\xd9\xdf\x1f^0nS\x94Q\xdemp\x8eX" +"2\x8d\x19\xb8$\xe8\xef\x30\x8d\x30\x44\xf8U+[\xa5\xb3\x1e\xb1\xfa\xed\x15\xdc\x9a" +"\x99\xf0\xd4nQ0\xb5\xe6=w\xc6=@}'t\x91\xfb\x9d\xa2g\x1d$\xe5\xcd\xc1Z8\xb2g#\x19" +"\x14\"?\xfb\x45_}\xf8\xbb!\xf9\x65\x43\x8c\x37G\xb7\xc1\xf0O\x8cZ\x9f}\xab\xe1\xea" +"C\x5\x14s38#%g\xc4\xa1#J\xa8\xaf\x98\xe4\x45\xe2g\xd3\x9a\xf7\xe\x9e\xb8\xc2\xa6" +"`\xa2\x15<\xce\x33\xab\xe4u\xb3\xa8\x94\xe2<1\xfb\x10\xc0\xf0\xab\x99Lh\x9b_\xdc" +"+m\x7\xa7\xf\x9a\xf7\xfbO\xf8\xb3\xe3L_\x1d\xe2\x96\x89i\xf1\xbd\x83K\xabZ&&\xf1" +"\xf2[\x19i'\xc6\x80\xb9\x43\x8fy^O\x1f\x31\xc4\x1e\xab\xf1\xed\xe6.\xbc\x46\xbaR" +"F\xd0\x86\xac\xd1\r\x32I*\x12\x9e\xed\x91\x1a\x18\xa4\xb3\xdfy*M\xbf\xc8\xe4O\xbc" +"kq\xd7\xdc\xd6\xde\x91V\xf2\x3\x9(\xc7\xd7\xc1XO\xf4\xf5\x34\xf2!7}\x8b.t\xdf\x80" +"\xcb*\xbd\xcchW4\xab\x84\x66\xef\xb9\x81\xa3\x61\xdf\xdd\x85\x9c\xa6s\x1\x84\xfv" +"I\x1f!\xc6=\xd5V\xd4{Q:\xa6\xbfV\xdc\x42|\xa6\xca\xc2(\x9g\x1a\xf9\x9\xf8|'H\xbe" +"\xe4\xc7\xacM\xba@#\x90\x94\x30o+@\xe2\x8d\xcd\xbf\x90\xcf\xb2.\x12|\xd5\xf2|\x1d" +"T<\xa0\xc5I\x96>\x94\xd9\\\xa0\x7f\xf0\xfam\x1fJ\xfd\xfe\xeaR\x89\xe7\xa3:\xb1\xa3" +"\xee\xae\xd3+\xbcWm\xf1\xd5\x87\xaa\x9c$\xaf\x35\xe\xe5\x34\x9f\x1e\x1e\xf9\x6\xad" +"\xfc\xdd\xeb\x97\xa8\xafUV\x19\xb4Z\x8b|qB\n\xce\x89\xfa\xde\x1f\x98\x7\x97\x90\x92" +"W\x8>&#,\xc\xfe\r\x38~\x18\xd4\xd4\xd1\x0\"\xa0\x1\xbfz&P\x12q[\r\x9c\xacS\rmn\xdf" +"%\x91\xfe\xcd\x9e\xbb\x19\xea\x15\xa9\x31\xf5\x81Ln\x83\xd6>6\xcc\x36R\x19`\xfb\xfe" +"iv\x85Ucvf\x1e\x35M\xfe\xcf\xd1S\xfc\x87\xb6\x1\xba\xcd\x3\xb1\xca\x85\x37\xccx\x8c" +"F'\xa4s\x1\x17Z\xba\x9d$\xa6\x6\xfaY\x15\x96~\xcG\xb1#\xa5\xa6U.\x8f\xb\xfdt\x8e" +"\xa7?\"\xfe[]\xe2\xef\xc0%\x1d\xa7\xd2\x91|`\xcd\xed\xca\xec\x63\xe3M-\x16\xbc\x17" +"z\x9e;.\x9b\xe7\xf2Vc\xdep\x8bt\x92\xeb\x9d\xaa\xe\x9czz\x8cQ\x17\x46\x14q\xa3\xf8" +"\xa9\xd7\x4\xfd\xfchH\x95o`3\xe9\x80\x6\xd0\xfbS1E>\xdc\x8d\x38T\x14<\xa5I@\xdd&" +"\xdbV\xc9\x4\x83\x9a\xf1\xce\x8f\x7f\xb2\x97\x3\x8\xa4\xd1it\x16<\x8c\x86\xe0\xa2" +"\xb3\xb5\xee\xaa\x1fN\xabYEw\xb7l\xf3Z\x1d\xda\x94i\xeb\x31\x9c&h\xba|W\xb4\xec{" +"\x80\xc4\x13\xa3\x84\x12{\xa4\xb9)\x18&\xd4\x81Zc\xd9\x87\x65\x7f\x9e\xa8p\xc7\x63" +"\xcc#\xcbt\x1\x3\xff\x30\nP\xbb\xbb\x30\xc2\x9a\x8d\xf5\xb0\x81\xd3\xef\xd3\xd8\xcf" +"d\x12k\xa3`\x84\xfa|\xef?M]O-\x8b&\x1\x1f\x85L7wGp\xa6\xc3O\xfd\x0\x86\xa5\rka\xce" +"\xc6\xe2^\xd8\\\x36wj\xd1\xd5\"\xf0\x6\x9coo\xb1 \xf3\x19\x1b\xfJ\x6\xc0\xbaP\xc2" +"\x9a\x42\x83\xc7\xd8v#>#\xc1\xef\xa5W`\xca\x46I\x1bi\xa3\xc\x8e\x63\x82y\xa4\x38" +"[3Y\xce\xb5\xbcJaj>\x1e\xce\xbe\xe2\xab\x42y\xc5\xcc\xb2\xaa[uv\xd0wr\x15!|\xac?" +"\x16\xdbs\xfb\x15&\xc4\xc9[\xdb\x66$H\xcf\xf2KH\xb\"H4\xf8\xb2\xb3\xe4\x9e\x42\xe7" +"\xb6h\xd9T(b\x14\x11\x65;@k\xff\xbd|\xd5\xfe\xae\xbe\x10\xda\xde L\x86\xbf\xd3\xa3" +"\xc0\xc\x12\xaby\nY\xd9\xe4~w\x98\xe5\x80q\xdd\xbb\xb5\x83\xe2\xc9l'\x87m\xfd@\xf6" +"\xad\x8e\x8!&~O\nWM\x8e^hL\x9a\x45\xa7\xf\x99\x9e>\xde\x8b\x0\xc1Pk^\xf0\x0\x1c(" +"3J\xef\xd1\xf6\x30\x9c\xf2\x90\xefX\xfb\x7Sy\xda\x9f\xc6\x9\xc3\x1b\x1f\xd0\xbd\x33" +"\xdf\xae]\xe4\xa7\x4\xe0(\x86\xa3\xfd\xa2,\x5T\xbd\xe2\xc7\x1f\x65\x88\x3\x62\xba" +"\xdf\xea\x14q\xb5L\x6K-\xde\x3\x61\xb5\x86\xb9\x7\x15T\xd7~\\E\xd7\x4\xae\x13\xf6" +"T\xa3J\x9d\x34\xc1\x98\xce\x8fV\xbe?\x99\xd3\xc6\xa3\xcd\xa1*oH\x8b\xaa\xc8\xff\x82" +"\xb7\xce+*4\x1a\x1e\xb6\xd3!\xfc\xe0\xa1\xfe\xef\xb4\xc1\xa1$\xa9\x12?b\x80\xdb~" +"\xfe\xf0\x43O\xdd\x9c\x1fW\xc=\x1fp\x85\\\x16kv\xfc\xdf\x37#~\xc0m\xf0\xba(\x97\x10" +"\xb1\xa1\x46qB\xa3\"\xca\x14\x12\xc9kA\xbe\xb0\x0;\x12\xf6\x42?\xa9*D`%\x9b\xad\xa3" +"p,!\xe2\xbby\x9ep>\xac>xu\xf6s\xaf\xc8\xa7R\x93\xea\x9d\xa1o\x1f\x87\x46Z\x8f\x9" +"\x84\xe4\x45~\x96{\xa7\xc5\xd2\x65\xf2\xd9\x97\xee\xfcQ~'f8!Dg1b\xd6\xf9\x37\xbc" +"m\x7Zy\xe8\xf5G#\x9b\xd8\xa4.\x80\xa4\x65|\xc\x92}>zq\xcd\xb8\xd4\x95\x34\xce%L\x1f" +"\xb\x16\x1coI\x87\x66\xd1\x1b~@\xbbG\x0\xec\x8e\xc6\xf6(%5\xc7\x8a\xce?\xdeS\x9f" +"\xf7m\x85\x44\xc\xac\xfe\x7\x2&Qc\xde\xf\xed\x12\xf3\xcc\xd1\xd5\xfd]T\x4),Q7\xf3" +"\x89\xdaN\x5\xb7Q\xc3!\x97\xdcm\xfe\\\xcbM\x80\x16\xdd\xa6\xc9$\x81]m\x80\xfd\xbf" +"\xd0N\x13W\x92*\xe9\x31):\x92U\x9e\x61\"\xe0\xf9\xa1\xabI:O\x82\xac\x62\x90\xf4 " +"\xc1\x8d$(\x7f\xecL\xd4\x1c\"l\xc0o\x5\x12\x12\xfe\x8eN3\xf3\xe9\xd5=7\xe0\xfcx\x19" +"\xce\x85\x9f)c\xe2\xbe\xbc\xc4z\xef;\x87}\xf8:\xd2\xe7\xa1\xe3\xbe\xc7T\x7\x9e\xd7" +"\xf3\x30\xf6\x84\xdcS\xcd#\x89\xfe\xa7%\xd1\x0%\x30\xf5\\Mr\xae\x38[n\x83j8\xd3\x6" +"\xe7\x64\xea\x1c\xc4l\xa0\xb\x6\xc4\xa9\x1\xbd\xd4\\\xd7nE\xdco|\xcc\x2\xce\xe1X" +"\xea\xe3\x19p\xbb\xed\xc3\x1d\xab\xd5\xfb\r\xc2\xe5\x1f\xf8U\xe5\x31\x43\xc7&\x10" +"o8\x8J\xff\xef\x8c\xec~\xad=\xe1\x94\xdc\xff\xafwX9\n!\xae\x63\xbb\xfc\xb1\x8cM\xb3" +"\x91\x38\x43T\x92x\x12G\xe2\x9f\xe2\x8\x9a\xf2\xc6\xcc\x99\xfa\xd2\xaf \x0\xf0\xc1" +"\xf4\xb5\x94N\x15\xcc@/\x99\xd7\xe9\xea\xee\x3\xf5\xa9mA\x98\xbd\xd3\xdcQ@\xb3\xab" +"\xd0\xb5\x30\r\xb7\xb4\r\x1a\x39\x86\xd7\xab\xdf\xb5\x99\x34\xd7\xdd\x0\xeaT\xc9" +"\x86x\x5\xbaj)\xf6\xe\xfd\x98s\xd7\xad\x8f\xf5#\x99\xda\xf4S\x11\xc6\xdd\xbd)c\xb3" +"\xdb\xe5\xad\xe0&\x2\x9\xf9\xfc\x81\xea:\x88\xb4\x2L\xb1\x7f\xb8\xbc\xf0^i\x6\xfd" +"\x95\xfb\xc5\x4\x39\xda\xac\xb2\x86gY\xe8\xc8!-\xeg\xa7\xebJ\xad\xd6\xbc]\x94\xf8" +"\xe9\x7fg\x5s\xc<\xd2\xbb\xd3\x3\xd6\xc1qL{\xa6\x41\xea\xda\x96\xdd\x89\xcbo\xe1" +"\xd6U\xf4\xb6sT\xa1p\x8f\xf1[\xc6\xa4RE\xd5v\x95\xcdR7~\x7f\xd3\xe3\x8f\x94\xa9\xc4" +"\xda\nz\x92\x1b:h|^\xe8\xd0\xbd+r\\\x95\xe8\xdc\xb5\x82\xf7\x9e\xa5\xd5\xa7(\xc6" +"i\x1e\xa4yPaLx\xc4\xc3w\x19\xde\xfb\xc6\xe5\xb\xad\x81\x65\xf1\xed\r\xcc\x2\x8\xaf" +"\xd1#e\xe7\x9H\xd4K\x14\xf9\x1b\xf9\xc\xfd\xe8\"\x96\xc0!\xaa\x11#d6\x94WV{\xf5\x84" +"\x97\xec\xe9\xa3o@X\xc8\xeb\x17\x13\x96\x92t\xd2\x98\x16h\x6#pM\x3N\xaf\x90\xcR\xe0" +"IuUkX\xc3\xea\x63\xe5\x44|\x19t$\x8dq9\x88\xc5\x8d\x1b\x66\x63!\xd5\x35\xbe\xc_\x90" +"\xe0\x61\xa2\xa2\xf7\xc3l\x1e\x5\x8f\xb2\xc0\x1fMvu8\xa6\xe4\x1e\xca\xe2(T\xb8:w" +"\x10\x1b\xf8\x65\xd6\xdd\x44/\x89\xcf\xca\xce\x8c\xbd\xa3\x93!\xef\xbc+y\xda\x45" +"\xfb\xb3\x9f-D\x8b\x3us\x10(;\xfbs\xb9~\xeb]\x16\r\xc0\x2\xd1x\xeb\x38h\xa2\x93\xbe" +"w\xf\xe4\xb6<\x1L\x1b\xb\xbf\xdf\x1a\xf1\x91<\xd5H\r\x96\xd0\x90\x80\"Q\x83\x38\xf1" +"\x8a\xe7\xc3\x96\x1e\x1d\x87\xcb\xa5\xb6\xa4%M\"Z,\x9c\xaf]\x97o\x17\x64\xa1\x42" +"v\xea\xb0\xffGh\x8aY@\xc3\x0\x85\x14$\xea\x93L\xd5\"\x7iG2Xz\xe[\x1kj\xde\x30" +"\xbe(\x87\xb8\xed\x2m-\xf4\xc5\x39\xd1\xa0\x30\x8b\xb\x9w\xb\xe6\x1d\xdb\xa0\xfb" +" \x92o\x7\x39\x9a\xe6\xc9\xc9\x37@\x1e\x1e\x16\r\x3u\xa8\x9e\x87\x9\x17\xde<\xf4" +"\x96Y}\"\xa8\xacg\x13\x8d\x43\x13PxA\xae$\xba,\xc\xf8\xfc\x1e\xfc\x1a\xc5\xb8\xbb" +"Q\xefkP\xb3@\x86 \x17u\x9e\xe1t\xb4\xbc\xca\x90\x87\xf5\xc4\x63\x19\x84\x7\xf4\x1d" +"\xf4\xe\xad\xbf\xbd\xd7\xd7\x37Y\xcc\x41\xa9\xa4P;\xea" +"&\xd1\xed\xbe\xd3\xff\x45\xc\x9a\xd2\x1f\xc0OOi\xf6q~\xd8\x9e\xe\xf9gb\xe\xdb\x85" +"\x9b\xb0\xd7\xef\xa3\xb0\xed+\xa5\xe4\xd5\xba \xeQ\xd9\x87\xb0P,\xa4\xb2\x1fn\xfe" +"\xc5\xd2\xf4qhO\xaeq0\xea\xe3\xe4\xed\x90\x6\xee\\\xb1Nk\x98\x83\x62(r\xb1\xbeU\xe0" +"\x9b\xe1\xe4\x9f;\xb6\xbf\x7\x63\xcX\xc5\x98V\xf2=\x1f`\xd4\x45\x89\xe7\xc9Y!\x7" +"\x19\xf7\xe9 \xfa\x6z\xd3\x43?\xddI\xf(\xc9\x4\x8c\xd9\xfaJ\xa4=\x13N0X\x13z\x9\x18" +"N\xe4\xff\x44\x12\xcf\xc2\x4\xffJ\x99u\xb9j\xf8\xbe\x17\x3\x1f\xfe\x14\x83\x4\xaf" +"\x1cN\x1-r\xfa\x65\xba\xaa\x96\xeeW\x9a\xb5H\xec\"\xd8\xa4\xe\x8f\xcb,.\xfa\xb5)" +"\x84\xc7\x7s\x9S\xf8\x66\xbf\xfc\x31\xa8\x1e@B}\xce\xc5)\xa3\xbe\"\xf7w.&\xec\xf" +"\xbc&\xeb\xc4\xa3\xb5\x61\xefu\xe9,wv\x84\xea{8\xd3=\x99\xd8\xf7\xceN\xbb\xe1\xef" +"6\xce\xc7\x12`Y!\xe0\xcc\x42!\xfs\x8br\xb8\xb0n,i\x9djxcy\xa2\xfe\xce\xa0y\x91uV" +"\x9f\xe7v\x0\xfd?\xa6\x61\xf5\xe9\xd8\xe6&\x4\xf5\x9c\x33\x18\xcfS\xe2\xfa\xfdh\xfc" +"\xe5\x44\x8f/\x4\xc3\xa5[\x84\xae\xe7\xf2\xbb\x12\x95\x30\x4\xaa;h\xf8\x12\xce\x7f" +"%\xcf/\x8a\x9\x2\xd3\x8dsZ\xb\x9e\xfcGR\xaa?\xe8\"\":r''c\xd6IjN\x82\x63K\x8d]fl" +"\"\xc8\xf3m?\xa2\\\xb4\x9c\xd8\xcbW\xa6\xac{H\xd6\x97\x90W\x80\x1e]\xe9\x1bP\xdd" +"_\xad\x99\x99\x99{c\x86;s\xbb\x96\x94Y\x8d\xbf\xe2W\x5\xb1\xdd\x46h\x91\x9U\xa5\xe6" +"\x12\x87iD\x8d\x35\xdc\xe\xd2\x1f\xb4\xc0\x17\xd1\xc\xdc\xd5\xd2K8lA\xe2\xd0o><\x10" +"^\xda\xde\xfd\xa6\xa5\xffn\x10\x16\x13\xbe\x39\xba^\xf5\x11y>\x96\xa5\xaa\xec\xd4" +"\x1e\xe1\xbfK\x85\xa1\x44\xe1G\xed\xec\xc3m\xfd\xec\x82\xcT\xbcZ\xe1{\x13\x8b\xff" +"\xf4\xa3\xb]\x10\xb3\x7\x63\xcd\x94I5\xbf}>\xc0\xae\x83\x96\xf1\xbd\xf0h\xb5\x19" +"Q\xd2\xa7\xde\xac\xaa\xde\x5=\n\xae\xc5\x9\xd2}2mUb\xc6\x86*\x3\x82\x96`\xae\x96~\xca\x18" +"\xebK\xfe\x4\x19\x1d\xdb\xa3\xe0?\xb6\xdb\xab\x9\xec\xc0\x1c\x66\xa4K\xfa\x7t3\xa0" +"H\xb7\x41\xd9\x8a\x4\xf7\xea^}1\x4\xe4\xd6\xb1\xb4,\xf3\x8f_H!\xebg2\xc6\xde\xf7" +"\xe2\xb0g\xc9\xee,\xb4\xac\x2<\xa4\xc3)\xd3\x81\xa1\xa7Q\x1e\xcc\x33\xb4\xbbK\xd3" +"&s\x91\xba^J\x88\xd8H)\xc5\x41\x38-N\xc4\xee\xe3\xa4h?|\xb\xad?!\x9a:\xb5\xd0\xf5" +"\xa7\xdc;\xe3\x13\xdd\xd4\x34%]\x12\x99\nv)\xc7\x12\xa5[s.\xc7\x65\x1b_\xa6\x1f\xbc" +"l5\xe3\xf2\xb7\xe2\xc3\xb6+r\xc8}\xf0\xa6:\xac\xe3\xa2\xc7?\x9@\x9d\x0-\x83\x11Z\xf1\x34{\x99\x9" +"\xd0\x8c\rT{fCFm\x11\x9f\x42\x96\x9OL\xef\n\x10\xe\xb2<\xbd\x1c\xdc|\xf6\xe8\xbf" +"#c\xa0\x42\xc6M\x82\x34\xbe\xb4\xbb\xdd\x32\x9d\x62\xc\x99\xa6\\V\x4'w\x80\xc3\x43" +"\xb5\x1f\x84)\x8\xef\x1e\x66\xb1%\xb6S\x87\x88[\xc1R\xb5\x5\x66\xda\x9c\x8bq\xce" +"6\xf}rH!\xc5\xa0o\x98\xb3\xd5@\x8c\x1!~H=-@\x6;\xd2\xbe|D\x7f\xbe\xb3\x98\xe0P\xe6" +"\x8\xd2\xdb\xfc\x8a\xe8\xb7QmV\xa8W\x85\xa6\xa6;\xa1\xd5Y\x97n\x8ci\x99\x38\x63\x1b" +"\x10\xb5\xe3\x14I:F\xed\xd7\xdf\x42\x9a\x7fu)\x10\x1e\x32\xc5\x7f\x8\xbb\xa5\xbb" +"n\x98\x6Q\xc\xc3\x9e\x14\xce\x46\xdd\xb6&\xfdJ[\xe\x89\x44\x44\x9\xb4#4\xe7\xd6\xa5" +"\x87\x83m\x1c\xb0\xc0\x96);\r\xcf\xec\x87\xd7=\xc4\xe9\xf9\r\xdc,1*\x2\x1a\xf0[\x95" +"\xf3+\xdcK\x96\x16\xfbm\xb1\x44\xd7j*)\xe8\xcd\xe2w\xa7\x3\x36 \x88\xa7m\xb6\x41" +"<\x84\x6\x61\xb3\xaa\xe4^\xe5\x62\x31Xl!\xf8\xff\xe8|0\xc2\xf0\xbk\x95Sp\x94\x97" +"?T\xa5\xc1Su\xe6T\x9f\xe4^.\x2\xbo\xc5\xf6$\xe8\xc3\xa9\xb3\rs\xd0\xa3\x97\xe5\xa3" +"-\xe1\x92\n\x15\x99{\"\x2v\xba;\x9dp\x19%Z\x88\x45U\xb7{\xc2|\x12\x41\xaf\n\xf4\xd6" +"\x1dl\x8aN\xcd\xbb\x15\x8d\x86\xe2\x1e\xed\xe3\xcck(\x90\xbq\xac\\\x94^Yl\x9a\x85" +"F\xab\x1\x12_\x8a\xb5\xfb\x17\xc9\xcc\xf7Z\x8a\x33J\xab\xd7pZ-\xf1\x16\\\x97\xc1" +"~\xd6x\xa1\xaa@\xfd\xe4\xf4\xa6+P0\x99r\x7f\xefZ\xfc\x32\x80|\x5\x18\x66\xcao'\xac" +"G)\xac\x1\x91\xed\xf0\x2\x81\xa9\x14\x84n\xa0\x85&\xec\ris\x1(Q\xe8u0Y\x1b\x16\x8b" +"l\xd6\x9b\xf\x44\xa4P\x88\xee,\xed]S\xe0^\x1b\xa5\x63\x35\x1c\x99\"\"\xf2:X\xa2k" +"\xe2\xdc\xec\x43\xce\x16\xe2\x81\xf7\x91\x84\xfd\xa1\xc9\xe4\x6\x4\x41'\x9\x1dW(" +"\xd7\xd4\ri\x6\xe0\xf5(\xe1-\x8f\x82\xa6\xb1u\xe3\x9b\xba\xb4Z\x96S\xb2\xb4\xbb\xe4" +"h\x1d\xa4\x93\xb3\xc1j \xe5\x64v\x86\xbe[\x7\xe7\xf4\x10I\xa2\x64K\xef\xe2\x8a\x10" +"\xeO\xf5\xee\x34\x10_sn!o\xe3\xe8\x1a\x1e}*\xb8\xad\x82;\xd5\x37\xc4\xb6\xc2\xbd" +"\x9e\xe4\x6\x16q\x17\xc8\xb3\xaf\xd2\xca\xaa\x36Y_\xe3S\xaf\x33\xd3\x6\x6\xdb\x99" +"/M\xcc\x8ct\xe1\xc1\xb5\xea\xe\xb4r/l\x9d\n\xb7\xaaND\xe6\x1d\x64\xea\x9c\xc3\xef" +"cz\xaeT\r-\n\xc7\xd9\xcb-\xab\xb1\xa3\xbe\x34\x63\x36\x1\xa5- m\xb3_t\xf1H\x1aT\xcd" +"\xee\xf2\xff\x63\xbb\x31\x2\x83\x61\x9d\xcd{-R\x8|\xfe\x95{\x93\x1ey&\xef\xb5\xc4" +"{\xed\x86O]\xd8\xe7\xe5X:\xd6k4\xeeQ3\xdf\xd7\xb8\x8c\x96U\xf1\x96\xd4\xd5\xc2\xd0" +"oG\x8c\x89\\\x46\xa2\x7f\x1e\xf8\x2\xf5\x12\x64w\xfa@\x7f\x80\xd4\xd2\xcbU\x11\x9b" +"\x8c\xd8r'/\n\xe8\x8e\xc5\xc3\x15\xaa\x46\x9e\x37\xcbz\xf9i\xd8\x88hQBj\xe3\xe6\xed" +"[\xc4H\x13_\xccX(/\xb2\x38g%c\xa9o \xc2\xd3\x8dknC\x1a\xf7\x6\xef\xe5\x94Og\\\xd1" +"i\x9e\xcc\x46\x44\x45\x89\xb0\xb4\xab\x41\xc5\x38{\x1a\xe8\x44\x39\x9c\xcb\xaf\xe4" +"\xcdwr\xd9tH\xea\xa4\x2\xcb\xdf\x9f}\xf5P\xaa\xb5MG\xe2\xf6}u\xf2\xc3\x64\x31\x8f" +"\xad\x9d\x8\xe4}\x15\x38\xc7\xaf\x6\xd6\x1\xf0\xc3\x1c\xa9)XI\xf8\x9\xe6\xea\x17" +"\xa1\x13\x88;^\x19+\xa7\xeb?\x9a\xckU\x15\x9eg\xc0\xc0\x85\xfe|\xe9\xcd\xeeH\x9f" +"\xbc\xa0\x66-/\xf1\xa6\xd5_\x8a\x1e\xe8}\xc\xac;F\xbbO\x8f\xb5\x8d\xfb,\xf0\x46\xf5" +"0s*\xf1\xcb \xeb\xbd\xa8\n\xdb\xb9]\xff~\xc2\x8bW5_\xfd\xd4+\xaa{\xb3k'~lv\xf1\xb1" +"\xda\x39\xc\x37\x88\xe4/\xdd\xd3\x93\x17\x85\x62m\xb5.\x94\x6\xd8\x87\xad\xcc\xee" +"\xc2\xacn\xe7\x36\xbc\xf3\x45J\x8bQ\x7\x18\xfd\xf\x42\x9a>\x6\xdc>\xc9\xde\x4{\xd9" +"\xe6\x1\x86\x65{\x12Rd|\xbf\x37%v{\x14?\xf9\xbd\xc0\xa7\xb5\x8a\xda\x9d\x94t^u\xb0" +"L\xbc\xddu^,\x1e&\xb0\xd6\xf8\xa7#\xa0N\x4\xba\xc4\x94\xb3\x65\x91\xae\xa5\xc8\xc7" +"\xa8\x38\x8f\xb8>$o\x98?P\x9a\xe\x91\x17\xda\xb\xd2\x10x\xc3\xbf\xf2\x45\xb5\xe4" +"x\xa2\xb7\x33\x1eO<\xbd\xde\xf0\xd2\x0 \x8\x11\x87\xc2\xc9\xdd\nY\x1a\x38\xb\xf3" +"\xf6\x95m{\x8d\x65\xdc\x13\xa2\xd5\x86\xda\x84q:\xe5[tXS\xaa\x9\xb3\xf3\xb5=\xe3" +"\x93\xc0=L\x8f\xdd\xd8)\xd8@\x9c\x41\xe9g\xb6Z\x0i\xf\x95(\xcb\x18\xb3\xfb\x94\xb5" +"Y\xc8j\x82\xf\x17\x92\xe5\x8b\xbc\x45\xae\xdc\x2\xeb\xbf\xa0\x84\xc\x8er\x98\x1e" +"\xcc\xa6\x98\x8b{\xeb\x93\x12\xe8\x63\x6KXa\x8e\xb1\xcf\xf2kM\xdbR\xa5j\xc4\xc3\x64" +"\xe3\xe\xfc !\x1do\x10&\"\xa5\x37\x8c\xff\x95\xb\x1b\x38\xb8\x85$#\xeb\xaeQ\xa6\x5" +"HuQ\xe4\xce\x99HM\xf7\x62w\x91{\xee\x19\x33\xa1\"o\xa1\x2kmtW\xbd\x36\x92\x80y\xc5" +"\xfc+\xcc(\xae\xc9\x96g\xd1\x1\x8d\xa5<\x90o\"\xb7\x1cR\xc9\xee=\xc4\xe7$9\x15W\x17" +"\xa6\xd4\x45\x10\xca+\xa6\x14\x46\x1\xbf\xa6u\xc5%:DC\xe1\x83P\xc6\xb7\xa9\xbc\x7" +"N\x8a\xc9s\xe4\xb6\x19V*C\xa1;\xe8\xd3\x1e\x34\xaf\x31\xdap\xcf\x8b\xc3\x99\x9\xab" +"\x80\xc0>\r\xc7\xe8\x42[\x1f\xdf\xba\x89\x8e\x35*\xaa\n\x1cL8\xc7\x11\xb3\xc3\xac" +"`\xa7r^\x95\x8c\x9t\x90\x8f\xa3\r\x6 \xb\xfb\x84\xb\x90\x89\xe9\xca\xba\xf=\x9b\x0" +"#%\x16\xad\xcf%.\xa6\xb7<\x17\x8e\x62X\xebjE\r)\xbe\x8c\xf6\xf6n!\xd5\x30\x9f\xb" +"u\xb4\x9f\xe6\xab\xabJ\xb0~H\xdd\xf7x\xe4\xfb\xe1\x97H\x12\x46\xd6\x80\xe9\x66|}" +"\xd1\xe4 %}\xb7\x62\xdf\xfexv\xf6\xf8\xe3\x5\xd6h\xcf\x44V\xb9\xa0\xb8\xec\xc6\xe0" +"\x1f\xf9s\x14OU'\xa1\xe6\x6]/g\x97\xfc:\xcc\xb8\x8e^R\xdd\xe2!FO\xd7x#\xce\xf7\xa0" +"Y*@\x8c\xc0\xeb\x37r[\xb3\x39\xee\xa0\xf7\x92\x10W\x88\xb2\xff\x98\x14\x84\xd6\x94" +"\x8d\x15\xbaQ\xef\xe3\xea\xc6\x0\xc4\x2\xb6\xac\xe1m\x14_\x96\xeeu2Ji\xa7|\xf8\xdc" +"C&zV\xcb\xdf\xa1V\x90=#\x92\x39:\x8f\x12\xf3>\xf3?\x9b\x9a\xa7\xa9\xd9Z\xdf\x7f#" +"h\xa3M,G\xba\xcc\x93\xb2\xa3\xa9\n\x12`\xfc:3B\x18\xbf\xec\xcd\xed\x1d\x7f\x41\x82" +"\xcc\xaa\x98y\xf6\xe0\x6\xf2\xfbp \xe1\xd1\x91]O\xb1,\xf2\x6\x95\x7Rv\xd2~\xce\x0" +"(e\xfa\xf6\x6\x1e\xdb\x14\xd1[\xb4\x34\xe0q\x97\xa4\xa1\x42\xea\x65\x9c$\x9\x80\x88" +"\xbew~\xaf\xbb\xe5\xf)\x2\xc1/o\xa8\xfd\xb5|\xe4\x85$B\xbf\xe1j%\xa3\xae\x9a\x1b" +"\xf3$\x86\xcc\x4HS/S\xf8!y\xeb\xcf\xf\xdc\xd7\xeb\x36\xea\x8bz\xbc\xbd\x95\xa6\xe6" +"z\xee\x38\x82=\xc6\x32\x38\x62)Ds\x98.\xee\xf3\xfb>\xb5\x10\x18:~\x17\xe3\xf8{\x1" +",H^\xb8\xeb\x87`\x0{\xbd\x1d\xea\xec\x8\x10l\xda\xb5\x90\x32\xce\x18\xaa\xe\x81\xef" +"\xbe\x9\xc8z\x9d\xfa\x3\xe6vO\xbb\xae\x8\xe7 !\xaa\x9a\xea\x46\xa4\x80@\xeaH\xe6" +"j\x2\x86t}\xc4\x63oh\x6\x6\xaa\xf2\x9b\xccQ\x94?\xb0\x9b\x80\\\xaf\x15\x34\xa6[\xe2" +"g\xb9O\x14\x89\xadn\x81\x1\xb9\x10\x1b\xed\xba\xca\x87\xf\xc9Y\xce(\xa2\xf8N\x2\xa8" +"\x84q\xee\xb5\x3\xd3\x6\xb1\x1f\xfc\xd9\x98\xca>C\x91\xc1\x88\xf6\xd2\xc7\xccn\x82" +"GZ\xa5\xc3u\xd2\xd1X/\x98\xfb\xa2\x16\x8cK\xf2]\xc8\xe2\xabi\xa5/\xa5\x11KQ\x9d\x15" +"\x99\xfc\xdfR\x1b\xb4\x0\x8a\xcd\xc9\x1c\x61\x64\xcf?\xe4\xcbw\xb7\x9e\xc7Kb\x5>" +"]Tl\xe1\xfc\xfc\x38\xe<\xc\xad\xcf\xd0\x12\xb^l5\x9f\xdc*A\x89\xd6\x95N\xc7\xd3U" +"\x10\xeb\x9\xd5\xd3\x5\xc9nH$1P\\\x91sK\x96]w>\x9e\x37yyQ\xce\x86\xd4\xe2\xdbv\x7" +"Wt\xbc\x94\xda\x13\x35@\xd5\x66G\xeg\x8d\x8e\x92\xcb\xc9\x7fV|\x8e=\xa2\x8f\x9er" +"\xc\x80}\x92G^\xa4\xb5\xa8\xb0\x8a{N\xa4.w\xa9y\xb0\x38\xe\xb9\xd1hsT\x6y\\\xe1G" +"\n\xe\xb3\x15\xe9\x94Z\xfc\x15\xe8\x0Z'0G\x99\x43Ku\xb6\x6m\x5\x1eq+\x9b\x92\xd8" +"*\xb3\xfb\x89\x7\xc5\xca\xdbu\xebYs0\xfa~\xed\xd1\x64Rp\xa8\xc`**\xee\xa0\x63\xa0" +"\xaf\x30T\xd2\x8c\xab\x34^%\xc6\x17\x1d\xa1\xf0`\nK{\xb1\xfd@\xe4\xae\xea\xac\x89" +"A`\x9\xe9\x91\xb9\xc5I\xce=\x9e(\xfaX3\x2\xf2\x2\x35\xab|\x4\xd9M\x6\x46" +"\xb1\xeeK(X\xcf\x97\x97\xa2\x83\xa9\xf0\xb2\xc9\xb3i_\xaf\x0\x84]}\xa4\x8\xf5\xcd" +"UsJ\xd7M\x16\xe\x97\x43-=\x5\x98\x14x\xedsauD\x88\xa5\xccN?z\xe1\xa3s\xfc+\xb3\x3" +" \xae\xb8\xba\xf4(d\xed\x7f\xcb@\"\xaf\xa9\x8*\x7f\r@{\x17\xa7\xd3^O~w\xb\x7f\xfc" +"\x3\xff@\x91\xee\x9a\x9dO\xef.\x8ct_25\x8d\x89\xf0'\x82\xb2\xe5\xb&\\hE\\q(+\x98" +"\xcQ\xfe\xc4\xfa~\x85\xad\x61\x90\x98\x62)\\\xd9\xf\xc\xa7\xef\xc0\x83=\x9ep6\x1f" +"i\xa8:S%\xca\xe0\x13,\x90\x7n\xfb\x41o\xda&E\xf3G\xf9\xe2\x9f~; \x9\x80\xdc\x32\x13" +"\xbe\xbco\xfd\\\x45\x9b\x8c\xad\xd0\xeeS\x3@\xf8\x34}\xb6'\xc7\xa0nh G\xa8L6M\x7" +"J3\xf\xa9\x1a\xa3 ;\x1e\xc8\xf8\xa9l\xc9\xc5\xb\x36\xbfu\x16\xb8\xb3\xdf\xb6\xfc" +"\xfePO\xfb\x37\x42*]+\xaf\x1\xceR\x97\xc3\x8b\xb\xc1\xa7\xec>5p\xc1\xde\xc0\x8a\xec" +"y\x91\xba,\x89\x7\xd2\x9r'\x8d.\xdb\x5.@\xef\xff\x95\x38\xcf\xaa\x17\xfc\xa6\xa5" +"\xc\"\xcd\xe6\xa2\x9c:\xddt:r\x0\xa4\xd8\x99v$\xe1\xf7s,\x81\x35\x46\xf4\xbf\xf9" +"\xf0\x1cZ\x94\x4\xe8j+\x18\xf7\xb6u\x9b(x\xaaO\x8a\x8f\xf5[6\xa4q\xbe\x7f\x5\xd5" +"\x88J\xa0\xbf\x8\x8b\x87\x66Y\x1\xcc\xf3^\x8c\xcd\xce\x86\x81\x1c\\NOU\xca&\xce/" +"\x10\xb6g\xdf\xd5\xe`c\xe9\x91M\x83@\xd9S;\xc0\xcc\xc8\xeb\xce\x39\xf4]>D.\xeaJ\x99" +"\xa7>[T\xe8\x89i\xd9\xd7\xef\x2)\x8c@\xf6\x0\xbb\xa2t\xa9\x11\xcf\x19S,\xd0\x14G" +"\xf0]\x1e\x42L\xe6TE\x86\x61\xd9\x8dL\xdc\x1atr$\xe9\xe`\x9c?\xaf\x44\xbb)\xcb\xdd" +"\x1e\x9a\x97[G^%\xef\x46\x44\x7f\x43\x80\x9b\xa7\"\x92T\xc\xf8\x1d\xe6\xccu\x1a\xa9" +"e\x14'\x5\x8%$b\x91\x84\xeO\x1a\x9cjE+\xda|\xe2\x9d\x9e\xf6\x8d\x0\x7\xe7!}\xfd\xa8" +"\xcc\xcb@\x5\x30\x81\xc4\xe9\x12\xabJ{\xc5\x64/\x89\x85g\xfc\x16\x4\xc9_5\xd8\x85" +"+\x7f\xe5\xf8|\xaa\xf2Gb>\xb6\xaaS4-#\x1aPG\xd8-\xcd\x33\xc9k\x91\x97\xb5\xa4\x1d" +"\x82\xac\xf5S\xf3\x18o\xab\x1^\x9f\xb2\x1ch\x1a\xc8t\xd2\x36\xc9\x38/\x13\xfeg-\xde" +"\xe5\x33\x9\xb5\xa4j\x9e\xff\x19kBn!\xdd\xd3\x97\x84\xac\xa3\xf8\xb9\x5\x88\xac\x9b" +"\x4\xb9\x93S4\x83\xac\xb6\xe3\x12Z]\x8e\x95\x65\xb\x85\x8dM\xd0\x17\x4\x38\x88\x90" +"\xb2o\x1ep|\xc1\x17\x8fT]\xc4\xa3\xcd\xf2\x1a\x97\x30\xd3\xe6\xd2\x9b`\x0\x66\x31" +"\xeI\xbeP\x18\x13o\xba\xbc\xb0(y\x9bt\xf7\xf1\\G\xaf\xbe\x30\xe1K\xc4\x13\x35$P\xb3" +"\xfc\x87\x41\x84\xc5\xe1(\x3)\x18\x84[\x3\x9b\xf2\xdf\xe2\x9b\xa8z/%\xa6\x1ek\xef" +"d\xf2\xd0\x64\xb1\xcd\x13\xdc\xa3\xd3\x85\x44=\xf6\xd6m\xdb\xcb\xf9\xad\x97t\xab" +"\xfd\xff\xc0_\x12'\x15\x9b\x8a\xcc\x8d\xaf|\xc7q>\x7fv:\xc8\x99\xb0\x66h:?\xd1N\xd9" +"\xc7\x8e\x18\x15\xfe\x88\xa7\x92j\x8d;\xe3\x44\x81\xb9\x1f\xeb\xb4\xc2\xafV\x9e\x87" +"\r\xa8\xf9\x64\xa7\x8b\x46*R\xc9\xa9q\xcf\xf4V\n\x9a\x46/\x95\xd4\x9fu\x97r\xefu" +"\xcc\x14i\xfc\xc6\x1c\x9d\xddl\x90\xe6\x82s\xe1\xb0$\x93\xbf\x38\xff\x9c\x11Mu\xe7" +"\xb8I%$\x98\x61'^%\x8\x85j\x86\xdf\x8e#\xf5\x90\xf2\xe5\xa1\xd2\xfb\x10\xdbs\xff" +"\xa3]\xdd\xbf\x1a\xbb\x0,\x93{\xa9n\xff\xcb\x82\x8c{\xadn\xba\x66\xae\x93\x37\xac" +"R\x10\x37\x8c\x34G\xd9\xb3X\xa6\xc4I\xca\x1c\xa8'\x12\xc4\"\x17\x38\x93\xb9`Z?\x1f" +"\xaa\x92\x94n\xda\x7f\xb2\xb8\xdd\x8e\xd5\xf4\xe5\xc6\xe\xfc\xdf\x38\xa9'9\xe1l\xe1" +"\x82\xffww)QK52e\xce!\xfb\xb4\x87\x10\x33\x83\x4\x31\xeerB \x84\xa6}\xea\x90.\xe" +"\xef\x97\xdd\xf9U\x92Q\x13\xef\xf9T\x8c\x9f\x95\x63%\xa1\xef\x9d\xc7]\x5p\xf4*\xd1" +"O}\xbd\x9\xb2W\x83\x32\xbcp\xb0\xee\x8ag]\x8c\x0\xe2\x45uv\xaa*(\xd8&\x86w<\xcc|" +"\x89\x42<\xaa\x64\x11\xfaY\xff\xe0\x1e\x4\xf0K\x97\xb3\"\x8\x11\x5\xbd\xaa~\x9\xff" +"\x85\xf9\xe7\xcf\x33umJ~%B\x95\xc\xe2\xae:\xca\xa6,[O\x10rF#pgl%\xc4\x13\xb1\x38" +"\x88\x90\xcb\xf6L\xc9\xe2\x1aXD\xe3\x7\x91\xe9\xcf\x85M\xbfm\xc8\x95/jb\x9e\xc0\x8c" +"\xec\x95\xdc\x9f\xa1\xeb\x16jP\xd1\x35\x3\xcc\x94\xb4\xd9\xbe\xf\xa1\xf9\r\x8c\x91" +"O\x83\xferh\x6\xbeT\x92\x83z\xbd!\x1c\x18\xf8.\xe4\xed\xf9\x85\xe1-\xf8s\xd9\xbP" +"\xd4o\x1b\xde.\xba\x9d\x18#\xb4\x8e\x8cg\xf8\xe3\x45&\x0\x46k\xe3\x9c\x9b\n\xb5\xea" +"U\xa9\xb6\xd5\x13\xb0%\xe1\x99\xce\xb3\xd3\xee\xd9\xf7\xb1-H\x16\xc1\x37\x61\x80" +"\xf5\xe3R{2l\xf1\x12\xd1\x38\xbc\x92\\g\xb4\x7\x98\x32\xdc\x8n,S\x9d\xe0?r\xfa\xb6" +"\xf0\x9c\x92\xb8\xe8\xac\xcf.\xd7j_\x5RA\xc2\x5\xf1\x12hdIIM\xe6\x9dm\xd0\x13\x0" +"&\x9b\x1b\x5\x44Vp<.\x82\xd8\x39\xb\xc7\xd4k\x87\xc2\xf0.e\xaeJ\x1dGH\xbf\xf\x1\xcd" +"\xe3(\xbd\xb\xef\xbd\x31\xc3\xbf\x30\xca\x9\xfb<\x18RK\xc7\xf6\x1c\xf2\xe9|\xec\x85" +"\x4[\xf8\xea\x96\x9\xf3\x64N\xe7~\xf0\x1b\xf5\xf3\xd8\xdc\x1e\x7f\xf0\x13p\xc4\xd0" +"\x7\xfc\xd0n{\xb\r\x1f\xa1\x90xN\x9c^L\x93\x32L\xf4\xfe^\xedx\x11\x96*\xd0\x8a\x13" +"\xef\xf\xd2\x99\x7\x37\xfe\x1\xcd\xa0 \x10QS`\x91\x16\xce`Vt\xd0G\xb\x43\x8ds\xf3" +"\xdd\x61\xf3\xb0\x5\x9fq\xa2\x91\xf3,\xf4\x63\xc3\n\xe3\x8c \xd2\xf4\xcdR\xbf/\xde" +"\xd7LY\xf1\x9d|\xdb\x97\xa0\xdb\xfc\xd1\x38w\xae@#\xcf\x7f\xf1\xdb\x8dvU\xfd\xe4" +"o:\xab\xf9_\\J0P\xc3\xf9\xc3V5\x92_\x6\xe8 \xe3X\x99\x83\x90\x43\xfa\x41kO\xc2\x84" +"\xec>m\xcf\xd8\xb3\x5\x66k\x93\xa0r\xe2\x63\xd0\xd2\xb1\xdd\x85Y:gB\x1\x9b\x9a\xaa" +"\x98\x9bs\x7\xaf\xbd\xfe\xee\xb6\xe1\xc2\x42\x96h\xc1w\xaa\xa0\xaa/N'I[\x18\x18\x8e" +"\xb7{\x93\xf3sH\xe5\xe9\xf1\xc3\xde\x96\x1b[g\xb1\x9\x30]\x84\xb1\x17\x8d\x35v\x9a" +"\xf4\xab\x92\x8c/\xf5w?\xa7\xbd\x0\xect5\x87\xda\\L\xbc\x19\xbd<\xbcO|\x15\x46\x2" +"\x13\xc9\x10;\xf7\xe1\xbc\xfd\x8f\x38\x99\x42/\x83\x46\x1fz\x8c\xb\x9d\x11\x1f\x64" +"f\x19U\xf4\xbd\xba(x4\x9\xf6\xcf]T\xf8\xc6!\x8e\x7\x97\xa0\x34p hB:K\xfc\x1b\x19" +"\xd0\xbe\x33m\x99\x0\x44\xf0\x84\x46j+-A\x98Gn\xec\xd1\x30\x9e,0\xe3>\x8d\xb6 /\xd3" +"\x1c\x14\x84\xf5\x31\x5h\x16\xcd%\xb8\xcKn\xd9\xb1\xff\xde`\x8d\xdd\x16\x84\x45\xe" +"\xaa\xf4]\x81<\xaa\xf9\x38\xe4\xdd\xf3\xed\xe9$\xa2,\x80\x14\xa2\x63\x31U\xd9\xe" +"\xe2:\xcd\x2\xcc\xd3\x7f\xe\x99\x10\x80\x18\x1\x91\x7\x9e\xb3\x30>\xc6\xc6\x85h]" +"\xeb\xe2\xedg\xef\xd2\x46\x1a\xbdp$\x2\xa4'\x7f\xd0\x63\x81\xf9\x16[\x87/\xd8w;\xe6\xd2\x63+#\x97\x63\xe4\x63#\x7\xb3 xY\xb2" +"\xbb\x1c\xa3\x9d\x13\xbc'c\xd1'3\x9e\xf4\xae\"\xe9\x1a\xdb\x9c\xb0\xb6\xc6\x14|\xee" +"\xa0y\x96\xaf\xaa\xfa\x19\xe0\xbf\xdf\xdf\x9e\xb0\xac\x43\xf7=\x80\xafrE\xd8\xc[" +"\x3\x4~N\x5`\xfc\xb8\x32\xee\x1f\x8e\xf0-@T\xe7(y\xa3\xfd\x64\xfe\xeb\xfc\xadu\n" +"\xbc\x65uXZ\xd5\x9dz!h\x1e\xe4'\x5*\xb9\\\xcb\x12\x83\xd2\xf7P\xbd\xcf\xca\xf1\xe6" +"ni\xc9\x90\x5\x14\x12k\x90\xab\xc6\x9e\xfe\\\x97\x61\x66\xb8\xc4\xc0\xe1\x8f\x94" +"\xcc\xb0\x14\xa3\x3\xc6\x1b\x80)\x8c\x66\x1a\x66\x42\xf3\xaf\x81vn}\xc6\xd6\x99\xa7" +"x\xf\x93\xa5\x38\x86\x33I\xdf\xf7(\xa0U\x7f\x30\xf9\\\xc2\xb3\x13\xdf\xc4\xc8\xf1" +".*\x94\xc9\xe3\xf3$\xbe\x1b\x98\x14+\x10o\x19\xe\x30x;\x8X\xaaQ\xe9\xca#\r\xd6I\x88" +";o|*\x8d\xba\xe3\x99\x8\xb3K`\xa6{\x14sP\xbf\x8a\xe7pa\x9f\x34\xf9\xc6\x4\xc7\x0" +"\x86\xc8\xae\xe4&\xceZ\x92\xfa\x92'\xfbR\xba\x82\xfb\x17\xcf\xad'\xee\xb2\xb5\xef" +"\xd0\xc7\x6\xf1\x46-\x1$G\xae?h71\x12\x83\xd7\xab\xc3\xe8\x66\xfch\x95}<\xb4\xf8" +"au\xc9$!\x8a\xa9_u\x93\xc4'z}\x9\x38\x86\x9c.\x7\xf1\x4\x46\xf2\xd4^\xa9\xa2\x84" +"\x97!\xdeT\x10V\x11\xb0\x86\x98\x8d\xbdV\xffr\xe8\\M\x1\xad\xdb\xaa\xc1\xb0S\xf9" +"\xa4}\xda\"\xdd\xc6\xf0\x1e\xc9\x8d\xf4\xctt?Y\xd1I\xeb\x35\xb7\x1eU\xe7K[\xab\xd3" +"l\xeJ$\xefZ\xfd\xb7\xdd\x38#\xd7%\xe2\x94\x98jf\xbdT\\\xce\xccP\x10\xf8\xa6\xef." +"\xb6\x4zt\xe6\x8c\xf2\x62;l\xe8Nj\xb\x37\x93?\xd2I\x99\x1b\x1\x8b\xb\x62\x17\x97" +"P2p\xc\x81\xaa\xe0r/]\x91VT\xcb\x99\x91\xc8\n\x61\x62[7B\xe7li*\x4*\xe4/\xb7\xf4" +"\xed\x35_l?\xcf\xfd*\xccyM\xe9\xe0\x8e\x9d\xbb\xd3\x95Yb\r(\x19\xa2>\x85\xf7I\x8f" +"\x0v\xb6#\xb\x7f\x93\xde\x99&D(\xad\xe3\xff\x32r\xba\xcf\xd3\xb5/\xfd\x92(\xe\x1d" +"\x19\x37\x97\x1erC\xef\xf8\x3\x84\x83\xde\x1a\xc2\xcc\x0\xf\xb3\x94\x31\\\x35\xda" +"Do\x9\x8c\xe7.\x8a?\x89*qQD&\xab\xbek\xae\xf9\xec\xedv\xff\x16\xbf\xb3\xe\x86G\xf0" +"\xe6\xcag\xa9\x87\x35<_\x88H\xe0\x36\xb5I\x99\xb1\rlx\x99\x80\x9f\xfc\x66\x11v\x89" +"-\x7f\xfd\x14=\xc1\xb0\x97\x8a\xd2\xe6\x81o\xcc^\xde\xfeQ\xb6\x9\xf1\x36Ji\x1c\xd8" +"\x80{N\x96\x34\x8e\x98\x42\xee\\$W\xe2\x66\x31\x8dSb\xd7\x8c\x17\xb3\x3\xd4\xcd\xa2" +"\xf8\xdc\x91q_\r\xde[v\xc3\x86\x36`Z\x1a\x15\xd1\xbe\x95\xd9\xf2?\x12\xfa\xb5\xe4" +"\x80\xde\xd3\xfe\xd2YJS\xf8R\x1b\x2*\xffL\x1a\xb2\xb4K\x1f\xbbl\x0(li7^\x9e\xb\xe7" +"0gf\x87\xff`\xd6\xf2\xf5o\x8au9^\x15\xceTZ\n\x1e_\xb6\x8d\xcc-\xdb\x64\x7f\xe9\xdb" +"ai\xaf\x98H)\x85\x9b\xc4\"s\xa3Jh\x6\xb8\x1d|\xa4\xde\xd3\x92,\xb3\xe9\r\x9ci\x9d" +"Wi\x4\x13-\x84\xc6\x9e\xf7\x93\x9{\xc9\xcY\xa1\x3$\x9a\xc4\x9f\xeai0\x4\x2\xe5\xdb" +"u\xb1\xd6\xe3n\xdes\x9d\x91\xbcm\x83\x4-\xb4\xec\xaf^h\xe7\x8b\xfe\x0\x9ajeI\xbf" +"\xb7\xd5\x38\xfaZ\xc8\xe'\x16\x36\x80\xd9Q\xa4\x8a\xa5\x42\x9\x35\xd7\x1b\x66$K\xbd" +"\xf4\xb2\x65\x86\x97\x61\xc7\xae\xd0(B\x98#\xf5\x30\x13\x8c\xf1~\x85\x1f\xd3>\xef" +"\xcf\x1c\xb7\xe3\xa5W\x98\xf1IY_\x94m\xae\x33?7\xab\x8c\xea\x88\x46\xab\x80\xb0\xfd" +"5D\x4\xb5\xe5\xea\xc4\xcf\xe7\xe6\xc3\xe7\xa6\x63\x11\xaa\x8d\x8b\x94\xe8\xc5\x9a" +"\x1e\xc\xe7\xe3I[\x17o\x8e\xe8\xed\x14\xc1\xe0\x33\xfe\xde\x44\xf8k\x1a\x30\x17\xb8" +" \xd6\rv\xde@\x8bk\x1\x4\x1cI\xb6\x9cq\\HJ\xa6\xad\xd4\xdc\x31G\xec\x63\xe3\x17+" +"\xfc#\x80S^&9\xd4\x15\x37\xb0S\xa8\x80\xe9\x9d\xe5\xc5\xbd\xd8\xc9g*,8N\xa8`DT\xb6" +"\x5\x64\x92\xcc\x86l/\xe2\xf1\xf9Ui0\xed\xff\x9cm\xb7\xf0\x8dp\xad\xdfP\xb7\x36\xc9" +"'\xfc\xbe\x43\x97\xa5r\xd9\xae\xa5z\x7\xc4\xddj~\xa0$\x2\xfb\xf2\x1dr\x81\xfd\xec" +"\xd1\xf\xaal\xc5\x19\x65\xfap\xcb\xd6\x82\x83\x42'\xe4\\\xff\xd1T\x99\xaaywL\x99" +"\xc0\xaa\x9a\x31\x41\xa2\"\xe4\xdb\x99\xfcJ\x91\xe5I\x80\xec\x9c+\x10\xba=\xdeG<" +"@-\xd7\x1d\xc8yx*)\xc0\xf7\\\x1b\x95L\x8f\xec\xd5\xc1\x81\xcf\xcc[\xac\xb3\xed\xc3" +"\x8bq\xact\xf0\x98\xfa\n\x1f\x0\x3)z\xc9 \x9eO\xfd\xde\x94\x8f\n#P\xcc\x84n\xac\x61" +"p{\x7\x87\x15\x90\x85^U]9^\xfb\x16\x8a@\x11\xc9i\xae\x12\xf9\r\xc8z8\xe5\x44\x9f" +"\xd3\x0\xf6\x11\x1aP\xaf /\x1dZ\xd3\xa6,q\xcb\xf6\x36\xd8,'\xc3\\\xb4\xf7\x3\xe7" +"w<\xa3\x34\xb5\xc7\xbcj\x95\xca\xda\xdc\xb5^\x9c\xe6\x8dqk\xd7p\x83\x85]\xb*g*)$" +"\x97@\x97{}\x84\x8a\x34\xad\x83:\x1d\x9d\xddK\xd8\x1e{\x11\x8a\x62\xe3\r\xa7p\xbd" +"\x8b.\xec\x33\xad\x19\x94\xa5\x81\xc8\x36\xec\x81\xf9\x92\x43\xa9\xab#;\x9e*\xf\x1b" +"\x10\x62\x37\x97`\xb\x82\xcd\x5i\xa2\xda\x41J\xb6Q\xc8\xd6\xf4|\n\x81\x95\x98\x86" +"UZF Mt\xcb\xe4\xf2}\xe0\x8a\x42\x11\xadvK\x9a\x33\xe[o\xec\xc9H,9\x1a\xe0\x86\xe7" +"TN\xbfVk\xa4\xe\xf6zj\xb4Rm\xdf\xa4\xcb\x98s<\xca\nX\x99\x3\xe2\xb5\xd7\xb8#d\xb5" +"qM{p\xe3\xd9N\xeek\xc2xfS\xcf\x65\x91\xf9\xfe\xb6\xa6\xd2\x9b\x38\x92\xf3\x30\x14" +"\xf2\xb0\"w\x6\x13k1\xech\xacl\xd6\x8dU`#\xc8\x5M\x8f\x8\x63\x32\xdf\x1f\xf3\x8c" +"\x2\x81\x1\xed-\xb0\xb4\x1b\x61\x6@\xcbY\x92\x1b\xa2\xe2Q\xbf\x8dk\xdb<\x8e\xac\x81" +"\x89,\x19\xe3T\xf7N\xae\x8c\xe1\x1d\x62\xae\x12\xdc*>\xa9uQFy\x7\xd1\x3\x81\xe4\xdf" +"XG\xff\xd1\x4n\xe9\x94\x90*LB[\xa9\x17\xf8pL\xa6T\xcb\xe9;\xd0Lh\xb4\xc\xf7\x91\x9" +"\xdd+\xb3r\x4\x4#\x9fZv\x11\x9b\x63\xb3\x97%/\xc6\xac`o\xdc\xb4\x8\xbf\xba\x0\x31" +"\xcc\xd2\n\xd3\xe6\x46z\x9\xfe\x11x\x8d\x91\xe0\x80Y\x12\x38\x9f\xe2h\x9c\xbc\xa1" +"\x3\xe7\xd1\xb\xd3xE@ye\xf2P\xaf\xder29!\xfc\xcb{\xdb\x11\x96\xd8\x1f\xd4\x9f>\x99" +"\xa8u\xe3\x1\xe6\x83\xa3z\x9a\x9d\x95v&\x13V\x1f\x41\xba\x1c[|d6*P\x8a\x17rG\xeb" +"\xcd\x63\xb6\x18W}%,\xb4\x42\x80\x1c\x37\x9f\xf3\x46#oMA\xa8:\x1a\xdc\x16'O\xfa\xa4" +"\xb2\xf9SD\x11nq\xb\x11\x9f\xf\n\x1d\x66\xf8M\xf\xc9|``\xf9J\xd6\xe7,K\x82\x1dmx" +"\x10\xa2J\xb2\xeb\x94\xdb%\xe4\xcd\xe3\xb5\x81<\xf9\r\xa1\x62\x65\x9e\xff\xcd\xd3" +"Ho\x8e\x45\x1d\xbd\xc4\x33\xe4\x8b\xea\x1cUA\xb5\xcb\x35\xd5\xdbP{i9{\xbb\xfb\xe" +"\x12\xcdH\x1f!\xd1\x0\xb9] \xbf\x30\x42\xa9G\\\x9c\x9d\xd9\r\x8cN\xb7\x83P\xc9m\xd2" +"\x91\x1d\x15\xed\xfa\xb3\xb4\x65\xc7\xa7ic\xae\xdc\x86+\xa6(Uj\x99;3W9\xce\x7\x43" +"\x5\xe6\xde\xa4\x5\xfd\xf5\xd8gX{u\xe@\x1a\xd1p\xfc\xba\xdf\x94\x8a\xb9/Y$\xfb\xca" +"\x8d\xd8\x65\x9f\xb8\xd8\x8f\xcf\x10\x44\x9[=>\xcb\xb8\x8fKw\x7\x2\x36\xc5\x14\x38" +"ld\x92\x33\x45(\xdb\xf9\x86\xef\xc8_\x9f\x8e\x97\x17\x90\xd2u\xe0\xc7\xaa\xf0\xba" +"\xfc\xe2\xf4p\xad\x3\x94\x13\xec\xf2\xb3\x9d\x84iI\xc9\x32\x34j\x1b\x4\x45,\xa1\x1f" +"l\xe3n\xf3(f\xec\xb6P\x12U\xc1\xda\xca\x1[\xf1\x42\xbf\x33\x95m0\x9\x83\x88\xc8\x17" +"Q}\xf9]\x8d^Q\x6+\xf2\xaf?\xaa:\x8f\n\xc4\x63rPX\xf1\xebiC\xd6\xd0\xa1x\xd6\x90\xeb" +"\x13\xa9\xef\x87\xfb\x1f\x85\xb0\xfa\xdb\x8bk'\x9\xae\xdc\xbb\xcbX\xffz\xe6\xc5\x83" +"p \x9a\xa6\xb\x15/\xee\xe0\xa7G\xb6\xf\xb\x42R%&\xc7\x82\x31\xd7\x92\xf8;\xce\x10" +"~\xccN\x83\"Yu\x11\xc7\xfa\xfdZ\xba\x8b:\xb0\xf5\x19\x2*\xde\xed\x89\xc0\xe6\x1c" +"\x89\x9e\xaf~P\x9a=\xab\xb3\x99\xa6\xf4\xc5\xd7\xff\x9ah\xb5\n\xfb\xdbg\xb8\x9eL" +"\x7f\x39\xd6WO\xca\r\x64\xc4\xfc\xb0\xe5L\x15\x89\xce\xf9'\xf9\x83\x94\x3r\xf6\xe2" +"\x1b\x8;{\xf5\xa8_\xe0\x99\x92g~\xb3,\x9f\xd4\x62w\xc5\xf\xd9\x92\xc4x\xc2\x92\xaf" +"~\x5\xa3T\x9fq,f\xbd(\x18\xb8'\xbb\xfd\xe2\xc4\x81\xbfH\x97\x37\xa7\x1e\x88o7\x8" +"*\xfcZ\x8c\xb\x2\xb7\xbf\xa7\xfc\x89M\x88I\x98wX\xa4\xfb\xac\x8G\x8\xa6)i\xd7\x19" +"$cS\x8c\xc4\xcd\x31\xee\xc7\xde\x6\x1b\x0\xdaZ\x9\xcb\x1e\xb9~<\x9a, A\x2Jb\rz\xe2" +"\xba\xa9\x9c\xb0p\xfc\x1\xbc\xbf\xb1$?\xfd\x6\xa4\xc9\xeajMM\xf4/\x87\x38\xfeR\xa7" +"%,\xdeW\nr\x96\xae\xb5\xed\x35\x1c\xd4\xb2\xf6\x43\x88\x12\xcd\x61\x91\nMU\xd7r\xa8" +"\x81\xcb\x18m:7C\xcc\x13+'0k\xdf`\xc3\xabMu^>\xff\x8e\x10\xc2\xca$1\xa5\xfOK;\xcf" +"`\xa5\x11*\x8f\xf9\x1b\xd5\x1e\xb0\xc2\xc1\x44\xae\xe9\xe9'\x85\x88&\xe2\x3\"i\x87" +"\xb2\x92\xc1\xd7\xf8\xfe\xe5\x33\xb5z\x9b\x5P\x84\xca\xc6\x15\x91Z\xc3\xa5\xa8'\xee" +"\x4\xd9\x1f\xa9\xe9\xe2g\xe3\xae\x44\xef\x11\x1I\x1a'\xa0q)!\x9e\x9bN y/\x1e\xed" +"B\xd5\xca\x89\xc4\xc4\x97S\xafpx\xb6\xebnzV\xff\xf7\xce\xca\xb3\x96\xb8\x39\x8a\xfd" +"\xd7\x33\xad(\x84\xf7\xbc\xff[B\xf6KK\x5jp\x9d\x65k\r^\xb4\nv\xa5\xf6\x65\xa6\x9b" +"\xdb%\xe0#\x8a\xac\x35\xc5\xc0\xca\xff\x83+\x98\xe6H)1\x9a\xef\xb0\x7f\xb9t\x3n\r" +"\xa9\x82\x61)\xdbz\xc5\"\x92w\xf\xac\xaf\x2\xbdj\xfb\xa8\x86!R\xbfGbB^\xbb\xb2-{" +"o\x8\xd2\x99(\xa5;\x11\xaa\x35Qn\xae\xa9\xd2IP\x90\x63\xc5\x39\xac\xfe\x39T\xe1\xf9" +"e\xd2qK\x86%~\x9f\xce\x32\xcc\xeb\nPf\x1f\x87Y&\xad~W\xeaU\xaa /b\xf8\x8dQ\xa1>k" +"\x91\x19\x39\x1b\x7S\x98zW\x13\xd7\xcd\x96Pl\xd2\xbc\x9d\x9aT\x9ekn\xc7\xda\r$\xde" +"\x97\x84\xffu8\xdc\xf3,\xa7\x36uL\xce\x16- \x8\xa4\x1f\xa1\xc7\x99\x9c*\x8fr\xda" +",Q~\x6\xf0\xf0w\xbd\x88\xa2\xff\x89\r\xb0Xb(\x84*\x1\x14 \xef\xe3\xe9\x10\x2\x44" +"\x92\x16\x1e\xb4w\xfb\xda\xff\xaf\x1es\xd2Ku\xbar\xbe\\\x14\x35\x8c\x45]S\x85\x85" +"uN\x9fh\x16\xa2&\xf6\xem\x17\xc6l\x94\x1fQl\x1f\x5\xa6\x18\xc0\"\xc1\xa7\xa8\x87" +"L\xb0\xd3\xf7\xac\xfbo\xd7\x9dv\x1\xadm\xda\x61\x1d\x31\x3\x7f\x37\x39\xbd\x12\x86" +"\x16'\x8ep%\xca\x83g\x8\xc8U\xde\xe5\xe3\xb4I\xc6\xc5\x90K\x95\xca\xf4\xc2\xeb\x9" +"Q\x95\x64\xc4\x8a\xf7\x81\xfb\xccI\xf0\xde\xdel\xb2\xbe\x87\x18\xc5\x15\xc0V\x8T" +"\x9f\xd5\xe5H17 v%\xb\xe2*\xf\xbc\xde\xe1\x7f\xb5\x84\x9d\x30 ^4~c\xb8\x84\x1d\x1a" +"\xe5q\xb2\xc3r\xfd\x96\x34\xe9\xf1kH#\xf9M\xfb\x80{|\x9\x84\xf\x92@\x9e\xd8\x4\x1b" +"\x15\x15\xdb\x9d\xf2!\x87\x45\x1f>;Bsz\x11\x61\x1aJ\x94-\xec\x95<\xfb\xf9\x87]6\xa3" +"c\xe3\xa2\xd5\x5\xd9ko\x8f\x3\xb7\xea\x1c%\x1b\xab/\xf7\x9d\xd8\xcd\xb2\x87\x96\xd1" +"\xfd\x36K\x11\x3\xda\x11\x9b\xea\x64\xac\x34\x65\x90#h_\xb8\xd5\xb2u\\\xe5#\xb3/" +"\x85\x32\x84^L0X\x3o\x8\x62\xcb\xd7\xb7\xd4\xdc \xf7\xd2\x96@\xb5\x0zx\xafm\x93" +"\x15\x12\xaa\x1U\x85\xbf\x80\xda\x89\xfd\xdc\xe1\x37\x2\xef\xaa\xeaQ\xc5\x1c\x85" +"m|\x8a\x7f(Z\x99}t\x9e\xf5\xfd\xdb>\xb1\x45\xf5\x1b\x10q\x84:\xffHlz\xde\x39\x43" +"\xca,\xe5\x38r\x15\xfa\xad\xda-\xb4\x14\x33\x11\x61\x7f\x62\x81\xfb\xc3\xf8\xd2\x61" +"\x2r\xcf#Udp?\x83.\x85\x16|\xb4\x44\xed\x14\x7f\xaegVT\xfe\x8\x94V\x94\xf9\xe6>?" +"\x1f\xc2\xf6\xa6On6\xc0\xbawJ\x8b \xba\xd6\x11Z\xc5\x44P\xe3-5\x3\x1euUH\x1d\xcc" +"\x2)\xdfY\x99Q\xe7X\xa6T(-\xc7^bB\xe1\x41\xa3\x15j\\\x98\xc5\x33\"\x8e\x8bQ\x18\x1" +"\xc7\x16\x66]\xfa#\xfe\xc5\xaa \xf3\xfb\xa6\xba\x37\xfc\x88%\x8d\xec\x64|;L\x85\xb6" +"c\xc8\x30\xd7\x63\xaa\xf5h\xbd\xa3\x85X\xe4\x31KkQ\r\x97M\x9f!\xc7\x83\xc4I\x8e\xed" +"b\xc8\xdb)\xbc\xa2\"\xf2y\x10\xb3\xd1\x96\xc0\xe8P+#Js\x9d\xa3*\xf\x64\x14\xbf\xc5" +"\xe4\xc9\xcc\x16y\x89H\xf9\x96\xf1\xb3\r\x17\x65\xfc\x99u\x1b\xeb\x12\x16\x88\x32" +"\xb5\xf7\xf9\x1a}\xf5\x94\xe\xb7\x63s\x1fi\x93\x9d\xb4%\xed\x38\xc?\xfe+AZ~\x96\x0" +"U\xbb\xb7\xab\x43nk\x8c\xd6j\x12\xa6\x66,\xf8\x8d\xf2l8\x90\xbe\xacK+k\xc3\xc0uq" +"f\x14\xd2\x4Z\x18\x9\x5\xeb\x92p\xdb\xf\x8e\x42\xc6\xc4\x11O(Y'\xbb\x3\xe9,=\x93" +"\x1q\r\xcc\x17\x19\n\x1fx\x15\x13\x88\xd7\n\xec\x38T\xf\x3\x1e\x37m\x8f\x31\xda\x95" +"Y8\xb2!\x96\xaeVwh&\xc7\xa6X\x82%\x82\xa5\x38\xaaGR\xb9iJ^\x81N\xf3\x9c\x1d\xf4\x10" +"\xb7]\x0\xcb\x90i\xcdG\xb8\xbf\x18\x38\xf9.\xf5\xa1\xb9\x1d\xac\xa0-\x87\x98\xc1" +"\xdf\x83\x9c$0\xe8\xd0(N\x1d\x16\xefr\xb3\x63g\xe\xf5\x19\xd0\xd0j\xfe\x32o7\xea" +"\x4\x8f\xd2\xe0\x9c\x15\x11\x3\x11xy\xc2\xef\xa2hdU\x84\xffJ\x1c\xd4xSd\x93\xad\xbc" +"\xb3\xe4\x9e\x42\xe7\xb6h\xd9\xf0\xe7z\xc5\xa3!\xfd\x7f\x33\x9c\xaa\xfd\xc9\x32g" +"\x14O\x94g\xb6\x5\xc8i\x4\xc3\xd1\xb8k\xc0\xe1p{G\xc3\xa4\xc1\xbf\x99\x1c\xa3V\xfb" +"\xc3.cV#\xf4\x42v\xccsX\xdaTAC\x8b_\xcbJg[\xd6\xb\xd1\x12\xcd\xdbL\x83WY_z\xf0\x82" +"\xaf\x9$\x12>g:\x1et!N~A\x98\xfd\xe4\xae\xf1\xe8^\x12\x9bjx\xa1\xe9u\x97\x8e\xf2" +"E\xc\x63#%\x88m\xa4\x65!\xb9\x37HA>\x2\x18^\xe0\x61\x64\x8c\xdf\xff\x10\xcaRI\xd1" +"\x9f\xaa\xd7\x86\x19x?\xc1\xc\xb7uT\xbbP*d\xe[$<\x9e\x90\xff\x16\x9a\x85[e\xd2\x9d" +"%\xb4\xd3\r\xe4\xe5:\x13\x9e\x8a \x5\x9c\xdbyci\xec@\x5\x7ft\xb7\xdcKZM=\xd4\x63" +"\xc6k\xe4\xe8\xa0\x2m\xedo\x1\x10\xc4[\xaf!\xf1\x97\xb6I\x2j\xeeV_G\xc2zJ\xbc\x15" +"Sy\x3\x3\xbc+4\xad\xb7\xc6\xe5G#yN\xef\xaa\xc4\xdcqE\xa7\xc3\xae\x16\xc6\xbb\x63" +"ZpN\xfc\xb2\xb9\xbb\x65\x16vT$Z\xe5\xd4\x66\xb4\x36#*G\xd9\xa2$|:ZN\xe9\xa7\xe6\xf2" +"\x9b\x83\xfc\xb9\xd7\x8/\xae\xc5\xca\xf6\xb4\x89v\xb0\x0\xad\x92\x19\x9d\xf6WB\xcd" +"\x8d\xe4\xaf\x5\x41\x46\x1f\xdf\x7\xf4N\x91\x17\x8e\x8f\xf2\x42>\x1\x7G\x4\xda\xe7" +"7\r\xf7\x8\r\x17\x45\x19\xc\xc2\x94\x35\xf1\x87\xaf\xea\x37\xe3\n\xa2\xc5\xdf\xd9" +"\xc4\x7n\x15\xc1\xd8\xbh\x8a\xca\xee\x8a\xc7\xf4\xf6\xf5\xb5\xa2\xea\xb3\x97\x8d" +"\xa7\xc7yXq\x9cim\x9aT[\xe2\xd4K\x88N\xb9N\x87\x39\x42\xce\xf0\xffItP\xfb\n\xb2\x1c" +"9.\xa6L\xbe\xc0\xab(2\x83\xeaKs\x9e\x36\xf2\xfc\x14_\xa5~\xff\x43>6\xfb\xdf!}\xb3" +"O\x8e\xfd\x2\xf7\xa1[w1\x1aPgIG\x85Q\xf1\x1e\x1c\xf0\xc9\x84\xeb\xd2~\xec!\x97\xba" +"\xbc\x95\x6$/|B[\xc0\xbb\x35\xa1\xd3\x32\xc3\xd7\x44$3\xba\x80\x9a\x15\xa5\n\x64" +"\x87\xa1\xce\xe9\x0\xa9\xb6\x4t|h!Q+\x93\x45x\xbe\xbb\xed}5\xd9,5\xbe<\xa1(\xde\xce" +"\r\xd8\xe6\xd6\x15r\xb5l`\xa7Z#\x9\x32\xf6\xc8\xf1:\xc\x82G]\x81\x9d\x41\x98I\xc0" +"F\xbe\xb6\x18\xff\xd2\xba\x9bN5Y>\xce\x10\xeb\xba*\x92\x36H\xae\x9d\x92\x12U'{n\x81" +"R\x83}tx+3\xffZ\xd6\xa0}\x8cl\x1eY\x13->^\x1f\x1c\xce\x86O\xad\x1fyc\xb5\x1|~\xbb" +"=)\xf2\xaf\x65\xb0\xdds\"\xddn\x94\xe8\x12\xf0\xed'pFjA\xcc@\xa6\xcbWE>\xe0\xde\x32" +"\xa6\x33\xa8g\xd5\xfa[\xa2\xb8g6\xa2\xd2\xc7\xcd\x94\xaf=\xbc\x92]\xfc-\xdf\xeb\x4" +"\xf4\x4\x81Pz(~\x1c\xed\xbf\x35\xeb\xfb\xa9\x44)\xceT\xe6\xb6\x36\xc3=\x88!p\x8c" +"\xfe\xc3\xa4P\xe1\\\x39;][\xf7\xcc\x84\x8c\x9cW\x80\xdd\x96m\x1\xb3M\xb5\xf9\xc3" +"\x13\x7f\xa0\x9\x63h\xf2\xae\x88\x83\xe6,\xdb\xfc\x61\x32\xf7h\x7f\xd1\xe9\x61Gy" +"'Ok\x92\xa1*mJ\x8c\x41_YQ\x9\x13\xcd\xde\xf6v\x85\xcbO\x97\xfe\xf{\x8c\xe9\x90\xca" +"\xe9\xd8\xb1R\xb1\xfc\"\x33`\xfaT\x80\xe2=b\xbf\xa6\x9d\xf1\x1d\x97\xef\x8b\x9dO" +"\x8f\x4s\x1\xf5\xdb~\xe3KO9\x96\xa6\xe2&\xb8\xb9\x32\xa1\x95\xcc\x8e\xcd\xfb\xeb" +"4\xcf+\xc2\x4v\x9a\x1a\x1a\xb2\xe6\xbe\x18\xd1V\xd3\xc1\xb0\xb8g\xceJ\xc4\xe5r\x3" +"X_\x98\xad\x8a\xd4\xa1\xc2\xcd\x98#\xf6\x9\xaf\x8b\xe9\x66\xf7\xcc\x89\xe7\x87\x43" +"_1+|g\xc2\xf9\xef\xa2/\x16\x9a^\x81\xc8\xf3\xdet\xaf\xd4Vu\xb4w\xae\x9d\xf1\x98=" +"\xe2GG)\xec\x80\xfdVF\x5\x80Q\xd8\xf0\x9b%>W\xbeU@\xba\xb~\x9c*X\x88y\xd4]\xac.\x94" +"\x94\x1bG\x5\"\x95\xba)\x9\xb9\x1d\xb7\x31;\xa5\xd3\xc7\x80\x11>\xe7\x36\xefW\xd7" +"\xa9\xaa\x88\x3\x1a\xe6\x14\x11\xf3.\xd3\xab,\xb9z\x97\x8a\xbb'\xb8\"\xc4\x42\x82" +"\xefQh\x14\x8f\xc3.\xc9\x91\xf7\x5(\x8c\x8c\xfdl\x83\x8a\x37\xdaN*]\xba]!W9\x0_\xec" +"\x9a\xc0\xcTh\x84\xf8`\xdb\x13\xc\xfc\xc1\xf1\x81\xcc_\x91?x\x9b\xfe\x61\x0\x99\xcd" +"\xe5\x84\xd5\xdb\xb1V\x4\x66V\x17\xd1\x35\x9d\x61\x10I\xef\xf6y\xae\xd9\x36\xaa\xe7" +"\xc2\x7f\xcd\xe3\x5U\xf0\xee\x39\xed\xb8Q+\xdeP\x7\xaa\x9b\x1b\xffjKkV\xe8\x83\xbd" +"(N!6\x2\xdf\xb4\x46]1\x11h-N+>3\x9f\xbb\xe\x4UUr\x81x\x8akU\xea\xa5\x88\x1e\x62\xad" +"\x1c\xbc\x65\xd0\xeb\xaa\xd4\xa5`\x8\x99\xb9\x32\n\xf\xc9\x8e\x8c\xa2\xe7\x96|l," +"\xe4\x89\x10\xd1\x80\xbd\xcf/anu6\xf7'\x97\xe3\xb1\xbf}O\xdd\xd0\x81y\xf5\xf3\x42" +"\x9b\xc3\x88S\x7\x8\x9b\x9fM\xaf\xb2\xfe\xaa\xdc\x8av\x1fkA\xf9\xd7\xe6\xceu\r]\x8f" +"\xfe\x99\x9d\xa5]\xc2\x39\x93;\xca\x15$\xaa\x0x\xee$\x88\x1e\x12\rwK)?\x15\x93\x62" +"\x12\x30\xfdR\x94\x42\x86S\xeb\x45?\xbf\x97\xb2u\xbf\xea\x38\x9b\xac^\x8e\xca\xe1" +"#\x89\xb1_d3\x8aY\x13\x1fj\xba\xfe?c,!^8\xf9z\xbe\x80\xd3\xfc\x93\x35-\xe'p+\xf8" +"3\x6\xa0?\xae\xd8\xf8\x91`Ao\x1c>\xf5\xf5\x38\x8f(17\xb\x64\xbf|\xb7\x37\xaf\\\xa9" +"Z\x80#\x81Z\"+\xe8\x11\xb4\xb8\\\xf5+\xeb\x4o\xc\x45\x87\x64?\xc0\xdaw\x81\ni\xbf" +"\xacL\nJq\xdf\xd0\xc0\xab-V5\x2\r&IX\x8a\x8a\xd4\xe8%G\x86Q\x95\n\x83\xd5\xf0\xf2" +"\xbd\x8c\xc3\x1e\x82Pt@M\x16\xc0ST\xd1\x87\x30\xfc\xd4,\xcc\xd5\x14\x37\xa2\xf2\xa9" +"\nj\x9e)M0\xa5\xf5\xe5?\x18\xe5>\xd4\xb6\xf\xe\xf\x61YO\xea\x13o.\xd0\xc8\xaf^\xf7" +"\xca\xe9\x46\xb3:\x18\xd9\xe2\xd0\xc8\xb8\xad?\xf0\xe1\x90\x8d\x30\xff\xcd\xabX\xa2" +"\x8eY\xfb\x12\xd1\xf2\x8ex>\xd5\x8e\x34N\x91\x5\xd9\xbd\xba\x8e\xcf\xb7\xb0\xdf\x61" +"\xcb\x7f\x43y$\xffq`V;\xe7\x9Lv\x9f\x36\xfa\xb8\xdct {\xc7\x89\xee\xc0\x11\xe3N\xf8" +"\x1e\x37G\x8c\xc4\xc9\xd5\xa1\x11\x8a\xc0\xa6\x85\xd2Q6\xf7\xe2\x95\xb8L\x6\xfO\xb6" +":\xe4\xcc\x8a\xf1\xb9j\xdaK\x18;\x5M\xf7\xef\x8c\xa3\n\xef\xc9\xb0\xcd#E\xb7(\xa6" +"\"\xe2\x42J\xe0\xaaW\x8c\x6^X\xe8\xc3N\xbd+m\xf6H\xa9x\r\xea)9w\x94j\x9a<\xd8\xec" +"Gy\xf3\xf\x8aKQ\x0\nU\xdb\xef\xb3(\xe2\xd5\x9\x8d\xbc?\x98Y\xd4\x9a\x46?\xd2L\xd8" +"\xc2\x8e\xc4&\x8\x82\x45\xb0\x90\x80\xc7\x9b\xa4?\xc4m\xd5_+\xa2\xc1\x90\xf8\xc1" +";\r\x88?\xb6s{\xc0\xf9\xac\xb5\xf0\xac;\xfaN\x8c\x34n\xf5\xd0\xa9\xa6\x17\xbf\xb9" +"\xe2\xfd\x9f\xbch\xe3\x94\x1\xd5\x97\x83\x19\xfeRy\x10\x86u\xe8\xe7h\xf4.\x1\xa0" +"\xb8\xc1\x33\xdb\x1c\x8b\xe7\xe0\xa5S\xed\x1c\x16v\xedH\x8b\x5\x83\xa3\x31\x7f#?" +"zC5\xb7\xb4\xee ]\x1d\x32IW JQ\xa0\xb3rA\x93\x8f\xe2\xa5M\x8a\xecJ\x81I3\x84Y\x4" +"2\xd5\xaf\xad\xc3\xa8KN\x8w\x1b\xe8\xf&H\xac\xf9\xfb\xc7w\xa5\x1bS\xf\xc\xa3O\xa7" +"\xa8\xa8\xa1\xcb\x39\x1d\r\xb8\xf0\x9f\x10\xbd\xfc\x19\x35 B1q\x84\x94\xdb\xa1+\xdd" +"\xc6\xff\xfe \xd4\xf3\xb7\x6/\xee\xc9x\xa0yx\x4\x89\x8d\xb2\xf1\x42y6;rp\x8dn\x7f" +"\xda\xefq\xaa\xa4\x95\xed\x16\xdb\x39\xe5\xcc\xea\x30\x90\xcf \xc2\xc0\xd6n\xb9\x8" +"\xec\x81M\xaf?T\xb4\x46YV\xef\xcd\xfa\x46\x7\x1a\xe\xaez\xb7\x9a.\"\x7f\x8b(\x19" +"\xc1\xc5\xca\x1\x86\x46\x10k50>\xcb\xe7=I#\x8c\xc1\xf;\xbb\xc9\x43\xbf\xb7\xd5G\x13" +",M\xeb\xc1\x92=\xf4\xe8\x12\n\x32&\xcb\x99\xeb\x8e\xf1\x62Th\xabr\x0\x65\xd6\xba" +"\xcc\xca;\xf4\xcd\xfb/\x92\xb6\x14(\xb0\x33\xf2k\x98^\x84\x11\x82\xc\xa0\xcdKS\x4" +"Qde\xf2\x9c\x89Jl\x1b\xad\x89\x42\xde\xe1\x38$!\xa6\xc0`v\xdd\x6\x45\x1a\xe5\x83" +"\xb9\xe7\xab\xe0\xe2s6RG\xfa$\xcdh\xe9\xb2 \xf2\xbf\xa3Z\xdb\xd6\x2Y\xf5\xa0\xde" +"Kf\xb\x2\x41\x84\x1e/\xf4X\\e\x86\x83\xdd\x9em\xc8G\x0\xb#\x82%\x99\x8 \xc1\xfa\xee" +"\xf4\xe7\x39x\x9b\x9e\x44\xab\x3w0\xdcOl`\xdb\x5\xe7\x84s`\xe4K\xc\x14\xe5\x9a\xf4" +"x\xcfT\xa9g\xc\xa3]N\xe3\xe3\xf8\x1e\xbf\xc5\x80\x43G\x81\x99\xaa\xe\x35\xdat\xb4" +"\xee\x11\xc0\x11x\xe4\x42\x35.\xee/W\xa6Q\xfb\x1b\xe5\x12:\xcc\x97\x38H\xddy\xb1" +"\xbf[i\xdf\xc2\x18\x66\x62\xc9\xa5H\x17\xc3<\xb1\xa6\xb5\x89\xeb\x64\xa5\x88Z\xe8" +"\xed^\x8f\xfc\xe9\xcb\xc9\xf1\xd0O\xaa\xfd\x2t\xd5p,\"\x9\xef\x9eR\xb3W\xe2/E\x8b" +"\xd3\xbe\xb2\x44\xfe\x88\xc3m\x8\x8d\xda\"\x9eP\x12'\xca\xaar\xc5\x8a}Z\x95\xfb\x1d" +"~8\x8\x19\xda\xab\xa5\x9d.\xeb\xdc_|\xc2\xbc\xc0\x42\xe7?\x13\xf2\xdf\xb1\x9e\xf5" +"\xbap\xd0\xet\xbe\xd0\xadsrm\xcc\xcd{>\xcd\x1m\xc0\x10\x18[\xc3J\xacg\"\x92~\xc4" +"\xcf\xc8\xd4\r[\x88\xcd_\x1\xf2\r\x1b\xeer\xb7\x15\xb9\xd4\x93\x1d\x81\xdc\x97,Y" +"\xb3\x12L\xa3^w6\x12g>C\x93\xde\x8b\x93\xb9\xb3\xc6\xb3x`3\x7\x0QL\xd3\x19\x19\xf4" +"*(\xf9\xb7\xc8\x14\x31\xac\x89\x12\xad\xca\xe9\x82i\xd6\xa6O\x82\"\x8f\xe\xdb\xc5" +"\x9d\xe4\xf6\x90\x66\xc4v\xfe\x35\x1f\x98i\xa4\xbb\xdb\xec\xf6I\xa2\xe3]\x1\x9e\x90" +"\xa1\xd2\x80\xa1\xfeU\xbc\xf5(\x15\x8f\xfb\x1\xfa\xcf\x46\xd9\xf6\xeb\x2\x66\x14" +"\x9e\xd4\x3\x7\xd9\xb0p\xca\x8c^CL\xb7\xa5U\xb7M\x18\xa6\x6\x97\x84\x89n/%\x3i\xfc" +"ko\xc4&wK\xe9\x80\x64\xe0\xfeW\xb8\xc9\xd5\xca\xab\x1a\xa9\x97" +"\xaf\xe6\xfb\x62S\n\xc8\x83\x32\x36\xd5\xac\x7f\xcd\x65\xdc\x18\xe1\xe0-\x5\x91y" +"\xee\x2\xc3<\xfco]\xbd\x6\x9\x1d\x8\x94/B\r5\x97S\xff,\x9e\xdb\xe1l\xc2:\x97\xcc" +"kf\xd3+\xe0\xb4\x1e\r\xcb\x98:\xa1\xcb\xb6SJ\x16\xe8\xf6\xe8\xb2\x42*\x95\xb8\x80" +"\xc6\x13Q\xa7n\x1dS\xe5\xbf\xa9\xaa\xc6y\xb6\n\x7f\x9b-\xfd\xec\x87\x8e\xbb\n\xd3" +"\xe\x9bo\xeb\xd3?\x98\x65&\xf0>C\xdd\xce\x13\xadRdR\x1a\x89qu,\x1\xca\xe7\x38\xec" +";\xd4\xe5V\xdck\xeev\xa8\x85\xf\xe\xf7\x38\x98\x2tD\x8a\x0\xd8h\x17\x87\xa3\x14\xdc" +"k\x1c\xfb\x81\xe8\x38%\xf3\xb0J\xe2R\xeci\x81\x87\xd0\xa2\x42\x38\x9e\xef\xe1\xea" +"\xfc\x5L\x9b\xc0\xc3\x3\xa8\xec#\xc0\x63\x30{!\xb2\xa9\x80\x34\xf6\xe7\xc4u\x8b\xe5" +"\xc\xd3Tt\xea\xbf+|K\xaen\xa1\xcdP\x88=b\xa3\x8a\"\x81\x9c\xd6\x66\xacm/9\xb1\xfa" +"\xd6\xfa@4Al\x3\xd9y^L\xafY!Vr\xf2\xae\x88\x61\x9f\x17,1\x1a+{0\x1f\x30\xcc\x31%" +"0v*\xa4#a\xdb\xdbv@4)(\x98\x95[\xff\x38\xfc,\xf6\xc7\x16\xabRQ\x18\xbf\xbrW1|\x81" +"\x18\xe9%:\x1a\xeal\x87\x8b\xc6\x37}d(\xe8\xce_\xb7\x85\x44\x93\n\x46\xd0+K\x8\x8" +"\x1b\xef\xc7\x84\x2\xca\x44Lt, =\xd1\xfa=\xbc\x35\x1d\xf1\x12\xdd\xa7x\xb1\xe5\xc3" +"\x98K\x3\xce\x9e~\xab\x15\xdcH\xdd\xc4i\xc7\xef\x35\x43\xf8\xe1\x95\x33\xac\x32\xa3" +"\xf6\xb8\xb1!\x3X#\x3\xcb\x46\x8m~\xb6\x99\x17\xb9\xe2/\x92\xb0\x7fyK\x80\xf5\xb3" +"\xa3.D\xd8\x8d.f\xc9\xe4\x1d\xc9\xd6\xe\x34n\xc\x99\xab\x66\x4\xbb\xeaU\xf\xbeJ\x1d" +"\x96V\xd3\xd8\\\xd9\xb8\xd6\x32\xa1\x35Kv\xde\xa1\xd8v\x14\x8d\x9b\xfcmq\x8\xaa\x1b" +"\x12l\x17\xdd\x16\xa3\x91?\xa2\x63\xfb\x94'J*\xa4\xce\x87\xa1\"\xd7'p\xf3\xd0\xaf" +"\xed\xac\xca\xa1!\xbf\xc2\xf4/z\n\xd1x{\xc8X\xc3\xf6\xab\x8c\xda\xe7m\x86\x8a\xa3" +"\xbb\xab\xd1\xe1\x66\xa7\xea\x5`\x8e^\xb1\x6\x8dL\xf2\xd7rd!\x8d\xa1\xba\x33\xe4" +"\xf1\xcc=$\x86\x87ht\x7f\xc0\x8c\xdc\xafW\xc6{$\x98$m\x7f\xf6\xf3:\xcb/\x83\xa9p" +"\xb6\xb6z\xee\xb/\xc0\xb7l+K\xdd\xbb\x9b\x98lZ\r##Am\xd9T\xf7\x3\x62\x37\xb1\x8c" +"\xac\x8a\x1c\xea\xfeNo\xa1\xd2\x39kHz\x3\xb9\xb3\x30\x1c\xa9\xb7\x95\x62o\xed\xb3" +");6O\xcb\xe2\x9b\x8e`o5\x86\x32\x84\x32-\x82\xbb us~\x80\x62\x45H\x91\xe2\x45\xe0" +"\xf1\xecwC\xf1\x99{;6\xd2M\x94\xf6\x9b\xe4\xba!\x8a\x94\x36\x46ky\xd8\x16\xe6\xa7" +",s\x6\xe3\xc2q\x18I\xe9\xa9\x41\x98<\xc5\x89\xe2\xf1\x9e\xd1\x8d\xdf\xf7Q6\xe2S\xed" +"\xae\xbfW\xb6t\x13\x46\x84\xd1\xfa\xa2\x1e\x1K\x9dTu\xae\x81_V\xb6\x6\xab\x62\xf9" +"\xae\x1c\x32\x31Z\x14H\xdd\xd4\x15\x1d\x6\xf4\xaa\x13GDM2@\xdfO\x82\xf9\xfc]\xc8" +"p\x91\x12\x93\x8a\xcf\x9b\xb2^zK\xf\xef\r\xd2Q[\x15\xdf\xb4\r\x17@H\xed*=\x84\x1b" +"\xd0\xe6\xc8!\xe0|^\x95\x9c\x17\xd6\xf2\xba\x65\x9dy,\x97g\xb9\x17$S\xae\x9c\x41" +"Zj\xa8\x18\xf3\x99\x91gy\x3!\xdfv\x95\xfb\xeav\xec \xfb`\xb5\x16\xf8MY\xbf\xdd\x9" +"\xa2\xfc\xa1\xbd^\xb3\xec\xe3>Q\xed\"Z0\xc3I\xfd\xe4\x33\x61\x63\xd7\x9b\xa2\x5\x33" +"C\xed\x4\xec\xcd\xf8\x45;3\xf9\xbf\x3>\xad[\xf5\x92%\x85mzi\x16W\xcd\xfe)\xee\xaf" +"\xb1\x46\xf4\x1dL\xc9\xc8\xd4\xae\r-(z\x93\xc1m\xc8_s\x8\x39\x9)\xbe\xf5\x32\xae" +"\xef\x87p\xb9\xafn\xa7\xfa^n\x96\x8d!\x1d\x1f\xc\xee\x98\xa0\x9a\x45G\xad`\x9f\x62" +"\xdck[\xa7\xb\x9a)\xdd\xb3\xfa\xa1Q\x2\xa5j\x1{\x9f\xda\xcb\xa8\x95_h~-N\xba\xc5" +"q\x93w@\xf1\xc6\xa3\xe5\xd9XN\xc9\xd7u\x8f\xd2zF{'>\\]+I\xa1\xfL\x93_v\xa0q\x83G" +"\xaeY\xf9\xf5\xe2\x9e\x8f&\x95\x66L\xef\n\x10\x11&6H\xd4\x86\xe5\xee\x9c\x31;\x8b" +"/\xe\xd6\xe9\xc9\xa6\xa5\xae\x15N\x1f\x1d\xb9Qd\xfd\xa1!\xfe\xac\x7xa\xc8ZvY)\xa6" +"\x9e\x15~\x13\xd2^^\x5;\xd5}\x16\x7\x91\x19\x32\x93\x96\xe4\xb3\xacH\xfd\xe8\xe\x9" +"T\xb6\x65\xd6\x1b};\xeb\xe{8\x0\xb4\xfe~\xcc\xc7\x41X\x1b\xd4\xeb\xe4_\x1d\x9\xf" +"\xf8\xa1?\xf6\xec\xff\x9bv\xef\x31.\xbfHw^f\x0\xe8&\x1dW\xdc\x89\x8e\xdb\xec\x1c" +"\xe7/\x98\x6\xacZ\x9a\xb5\x85\x33!3\xaf`\xff*\xc3\x1bn\x97\xd2\x8b\xd2\x32\xa5\r" +"(#\x15\x95\xd2\xb2\xc2\x1b%:'\xa7\xd4\x30\xa7x\xff\r\xd4\x46\xbb\xf9<7\xc1\xa4\xfb" +"\x1a\xb7\n\xd1\xc6\x61[Q]rF-\x81SQE\xff'c\r\xeb\xb4\xf\x84\x39\xe0\x93\xc9\xf\xec" +"~\xbd\x4\xad\x81\x86\x63\x90\xef\x8d\xf9\xd4\xd4\xaaG\xb8\xda\x9f\xf7\xf5\xba::l" +"\xc6\x19\x18\x63\x99\x1\xf4\xc5\x8c\x86\xfd\x18\x44\xc0_\xe7\x95\xec\xf8\x82N_\xf5" +"y\xb3\x39\xe1\x8c\xf2\x98xh\x6\xe9\x15\x9b\xc9\x86\x94\xcb\x45\xa3\xc3\x8d" +"\x11\x35o&\xc4\xd6\xdf\xc4\xcc$\xd1M\xb7\xd1\xf5i\xddPDX\xd6\x42\x12\x41\xa9\x46" +"\xbv\xc\xc8\x91\x82\xa3\xbeM^'O\xba\x17\xb0\xc6js\xa3\x12\x44\xf9N\xe%\xa8\x9a\x43" +"I\xfe\x3\xbb{+v\xd5\x8\x7f\xcf\x1\xe2:\xb8\xa9\x46T\x12\x95\xfe;\x81X\xc1\x9f\xd5" +"(\x19\x82yK\xab\xd4\xd8\x81K'\x82\x18\xe8\x9e\x93\x38\xc7\x3\x14s\xcb\x6p\xc0\x1" +"\xc\x62\xec\xb8\xd0\xc3z\xbbt\xa6\x8fU2\xbaI\xf4y\xdf\xa2v\xb9\x1d\xfd\x95\xd4h\x9f" +"uS\xdet2'\xaa\x96\xb6t\xdc\xec\x81\x86Uk\xa8\xaf\x62\x9ay\xc6$\xde)|\x19\xea\xa8" +"n'KL\xcb:l\xef\x80ti\xa7\x97\xea\xe6\x37\x90\x9c\x19#/(\x1\xb5\xbf\xad\x8ak\xdc\x65" +"e\xbf\xc0\xc2\x17\x0HT\xdc\x65L}\x98ix1\xa6%\xb3\xee|\xe2O_\x5\xb0\xaaj\xe0\x18|" +"\x98\xc2!\x82\xcZ#\xa2u3\xde\xd3\x3T\xc4\xca\xad:\xad&\x1e\xbb\\\x0Sr\x14\x7\xd9" +"\xebk\xd5S\x80\x93\x8@}\xe0\x38\xd2\xc6\xa6\xac\xd7\x7f\xeft\xcf\xb5\xd9\x61\xdc" +"\xbe\xaa-\xa6\xb8\xde\xec\xa6NJ\xdd\xa7\x36rV\xc1\x36\x1c~\xa9\x9ak\x95P?\xe9\x1" +"\xd0V&\x7fn6\xdbx\xd1\x65\xb7\x44\x83Wn6\xab\xa1\x9eh\x1\xa3>\x9e\xb\xc2\x1e\xae" +"*\xe\x8eV\x94?L/\xbf\x94g\xaf\xed\x7\x98IcUy\xea\x81\xfd\xe7\xe0z\x1c\x9b\xd1,r\xeb" +"/\xfc\"P\x3\xb\xed\xf8\xd8T/\xfcK\x8e\xd5&\x89%\xc5k\xff\x45\xb3>\xb\xb0\xf9N\x12" +"\xeeiM\xcf\xd3JWrL\xf3\xb9\xd3G\xd7\xa8\x45\xa0\xc5\x8d\xa8\x3\xb9\x99\xdaS\xcb\xc1" +"\xe3\x95^\xad\x7l\xe8ob\x8Y\x85\xc9\xd9\xfc\xfd\xab\x90\xb2\xd2ls\xd7g\x8N\xbap:" +"\x13\xae\x41\xff\xdb*\x98\xf>\xa0\xf0\xb6~\xd5\xa0\xaf\xf4\xb4\x18k\xdc\xf2\x17\xff" +"W[\x15\x8\x43M\xfc\xe6z \xe4\x9h%sY\xd0\xc2\x10\xb2\x8d\xffV\x1b\x8e\xa8Z\xa7O\xb4" +"C\xda\xa5oL\xc3z\xc6\xf5\xcd\x39QY\x1a\xcb\xb8M\x3\x61p\x15jf@\x0\x9\x82\xe7\xaa" +"\xae\xa6\x36\xf7&`\x99\x82\xcc\x39\xcf\x9f\xc\x42\x86\x8ai\xa3\xa5M\x18\x4\x0\xb2" +"\x90\x94\xc4>bO\xbc\xb7\xa0\x87\xb5L\xc2\xea\x93\xf\x87@\x82\x8bkmr\x19\xac\"\x37" +"\x83\x8f\x63\xdfs\xfb\x99\xf4\xc5\x1d\xe0>W\x8c\xf7\x4{\xcb\xa4\xf0\x8a|V\xe0\x8" +"(N\x95\xcc\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" +"000000000000000000000000000000000000000000000000000\r000000000000000000000000000" +"0000000000000000000000000000000000000\r00000000000000000000000000000000000000000" +"00000000000000000000000\r0000000000000000000000000000000000000000000000000000000" +"000000000\r0000000000000000000000000000000000000000000000000000000000000000\r000" +"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" +"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" +"000000000000000000000000000000000\rcleartomark\n\x80\x3" +; +int n022023l_afm_len = 32136; +char* n022023l_afm = +"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" +" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " +"(GNU General Public License) for license conditions.\nFontName NimbusMonL-ReguOb" +"li\nFullName Nimbus Mono L Regular Oblique\nFamilyName Nimbus Mono L\nWeight Reg" +"ular\nItalicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineTh" +"ickness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Deve" +"lopment\nEncodingScheme AdobeStandardEncoding\nFontBBox -61 -237 774 811\nCapHei" +"ght 563\nXHeight 417\nDescender -186\nAscender 604\nStartCharMetrics 316\nC 32 ;" +" WX 600 ; N space ; B 319 0 319 0 ;\nC 33 ; WX 600 ; N exclam ; B 246 -15 463 61" +"8 ;\nC 34 ; WX 600 ; N quotedbl ; B 254 315 582 604 ;\nC 35 ; WX 600 ; N numbers" +"ign ; B 137 -62 589 647 ;\nC 36 ; WX 600 ; N dollar ; B 131 -92 582 655 ;\nC 37 " +"; WX 600 ; N percent ; B 137 -12 591 611 ;\nC 38 ; WX 600 ; N ampersand ; B 132 " +"-16 527 519 ;\nC 39 ; WX 600 ; N quoteright ; B 207 314 468 604 ;\nC 40 ; WX 600" +" ; N parenleft ; B 335 -124 583 604 ;\nC 41 ; WX 600 ; N parenright ; B 124 -124" +" 372 604 ;\nC 42 ; WX 600 ; N asterisk ; B 211 250 586 604 ;\nC 43 ; WX 600 ; N " +"plus ; B 131 32 588 530 ;\nC 44 ; WX 600 ; N comma ; B 110 -145 371 145 ;\nC 45 " +"; WX 600 ; N hyphen ; B 131 258 588 299 ;\nC 46 ; WX 600 ; N period ; B 235 -15 " +"386 116 ;\nC 47 ; WX 600 ; N slash ; B 99 -81 625 668 ;\nC 48 ; WX 600 ; N zero " +"; B 156 -15 571 618 ;\nC 49 ; WX 600 ; N one ; B 117 0 492 612 ;\nC 50 ; WX 600 " +"; N two ; B 84 0 572 618 ;\nC 51 ; WX 600 ; N three ; B 110 -15 579 618 ;\nC 52 " +"; WX 600 ; N four ; B 141 0 545 604 ;\nC 53 ; WX 600 ; N five ; B 113 -15 584 60" +"4 ;\nC 54 ; WX 600 ; N six ; B 184 -15 631 618 ;\nC 55 ; WX 600 ; N seven ; B 21" +"5 -1 606 604 ;\nC 56 ; WX 600 ; N eight ; B 143 -15 576 618 ;\nC 57 ; WX 600 ; N" +" nine ; B 142 -15 589 618 ;\nC 58 ; WX 600 ; N colon ; B 235 -15 450 417 ;\nC 59" +" ; WX 600 ; N semicolon ; B 114 -145 426 417 ;\nC 60 ; WX 600 ; N less ; B 131 4" +"4 627 518 ;\nC 61 ; WX 600 ; N equal ; B 95 190 625 375 ;\nC 62 ; WX 600 ; N gre" +"ater ; B 92 44 588 518 ;\nC 63 ; WX 600 ; N question ; B 231 -15 581 577 ;\nC 64" +" ; WX 600 ; N at ; B 139 -62 561 624 ;\nC 65 ; WX 600 ; N A ; B 13 0 596 563 ;\n" +"C 66 ; WX 600 ; N B ; B 47 0 591 563 ;\nC 67 ; WX 600 ; N C ; B 110 -16 635 576 " +";\nC 68 ; WX 600 ; N D ; B 47 0 592 563 ;\nC 69 ; WX 600 ; N E ; B 47 0 619 563 " +";\nC 70 ; WX 600 ; N F ; B 47 0 640 563 ;\nC 71 ; WX 600 ; N G ; B 108 -16 636 5" +"76 ;\nC 72 ; WX 600 ; N H ; B 57 0 646 563 ;\nC 73 ; WX 600 ; N I ; B 117 0 603 " +"563 ;\nC 74 ; WX 600 ; N J ; B 100 -16 699 563 ;\nC 75 ; WX 600 ; N K ; B 47 0 6" +"62 563 ;\nC 76 ; WX 600 ; N L ; B 67 0 585 563 ;\nC 77 ; WX 600 ; N M ; B 15 0 7" +"00 563 ;\nC 78 ; WX 600 ; N N ; B 46 0 678 563 ;\nC 79 ; WX 600 ; N O ; B 102 -1" +"6 616 576 ;\nC 80 ; WX 600 ; N P ; B 47 0 587 563 ;\nC 81 ; WX 600 ; N Q ; B 102" +" -115 616 576 ;\nC 82 ; WX 600 ; N R ; B 47 0 594 563 ;\nC 83 ; WX 600 ; N S ; B" +" 96 -17 602 577 ;\nC 84 ; WX 600 ; N T ; B 152 0 648 563 ;\nC 85 ; WX 600 ; N U " +"; B 136 -16 676 563 ;\nC 86 ; WX 600 ; N V ; B 124 0 707 563 ;\nC 87 ; WX 600 ; " +"N W ; B 122 0 696 563 ;\nC 88 ; WX 600 ; N X ; B 44 0 662 563 ;\nC 89 ; WX 600 ;" +" N Y ; B 153 0 665 563 ;\nC 90 ; WX 600 ; N Z ; B 103 0 590 563 ;\nC 91 ; WX 600" +" ; N bracketleft ; B 254 -124 570 604 ;\nC 92 ; WX 600 ; N backslash ; B 250 -81" +" 474 668 ;\nC 93 ; WX 600 ; N bracketright ; B 132 -124 448 604 ;\nC 94 ; WX 600" +" ; N asciicircum ; B 192 354 567 615 ;\nC 95 ; WX 600 ; N underscore ; B -61 -12" +"5 564 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 388 343 544 604 ;\nC 97 ; WX 600 ; " +"N a ; B 93 -16 546 431 ;\nC 98 ; WX 600 ; N b ; B 26 -16 591 604 ;\nC 99 ; WX 60" +"0 ; N c ; B 121 -17 596 432 ;\nC 100 ; WX 600 ; N d ; B 102 -16 630 604 ;\nC 101" +" ; WX 600 ; N e ; B 104 -16 570 431 ;\nC 102 ; WX 600 ; N f ; B 109 0 663 604 ;\n" +"C 103 ; WX 600 ; N g ; B 105 -186 647 431 ;\nC 104 ; WX 600 ; N h ; B 55 0 556 6" +"04 ;\nC 105 ; WX 600 ; N i ; B 96 0 513 624 ;\nC 106 ; WX 600 ; N j ; B 112 -186" +" 547 624 ;\nC 107 ; WX 600 ; N k ; B 67 0 578 604 ;\nC 108 ; WX 600 ; N l ; B 96" +" 0 513 604 ;\nC 109 ; WX 600 ; N m ; B 15 0 603 431 ;\nC 110 ; WX 600 ; N n ; B " +"57 0 546 431 ;\nC 111 ; WX 600 ; N o ; B 111 -16 577 431 ;\nC 112 ; WX 600 ; N p" +" ; B -13 -186 593 431 ;\nC 113 ; WX 600 ; N q ; B 105 -186 668 431 ;\nC 114 ; WX" +" 600 ; N r ; B 88 0 619 427 ;\nC 115 ; WX 600 ; N s ; B 108 -17 558 431 ;\nC 116" +" ; WX 600 ; N t ; B 127 -16 518 563 ;\nC 117 ; WX 600 ; N u ; B 127 -16 569 417 " +";\nC 118 ; WX 600 ; N v ; B 114 0 655 417 ;\nC 119 ; WX 600 ; N w ; B 114 0 655 " +"417 ;\nC 120 ; WX 600 ; N x ; B 55 0 611 417 ;\nC 121 ; WX 600 ; N y ; B 22 -186" +" 634 417 ;\nC 122 ; WX 600 ; N z ; B 115 0 563 417 ;\nC 123 ; WX 600 ; N bracele" +"ft ; B 248 -124 528 604 ;\nC 124 ; WX 600 ; N bar ; B 257 -124 444 604 ;\nC 125 " +"; WX 600 ; N braceright ; B 175 -124 455 604 ;\nC 126 ; WX 600 ; N asciitilde ; " +"B 145 212 575 348 ;\nC 161 ; WX 600 ; N exclamdown ; B 222 -216 439 417 ;\nC 162" +" ; WX 600 ; N cent ; B 175 -13 563 630 ;\nC 163 ; WX 600 ; N sterling ; B 90 0 5" +"41 578 ;\nC 164 ; WX 600 ; N fraction ; B 84 138 645 470 ;\nC 165 ; WX 600 ; N y" +"en ; B 161 0 665 563 ;\nC 166 ; WX 600 ; N florin ; B 74 -93 643 618 ;\nC 167 ; " +"WX 600 ; N section ; B 91 -62 624 603 ;\nC 168 ; WX 600 ; N currency ; B 127 95 " +"597 489 ;\nC 169 ; WX 600 ; N quotesingle ; B 344 315 492 604 ;\nC 170 ; WX 600 " +"; N quotedblleft ; B 221 343 586 604 ;\nC 171 ; WX 600 ; N guillemotleft ; B 108" +" 0 626 417 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 108 0 397 417 ;\nC 173 ; WX 6" +"00 ; N guilsinglright ; B 297 0 585 417 ;\nC 174 ; WX 600 ; N fi ; B 14 0 615 62" +"4 ;\nC 175 ; WX 600 ; N fl ; B 14 0 611 604 ;\nC 177 ; WX 600 ; N endash ; B 131" +" 261 588 302 ;\nC 178 ; WX 600 ; N dagger ; B 208 -63 561 604 ;\nC 179 ; WX 600 " +"; N daggerdbl ; B 154 -62 561 604 ;\nC 180 ; WX 600 ; N periodcentered ; B 285 2" +"17 436 348 ;\nC 182 ; WX 600 ; N paragraph ; B 152 -62 648 604 ;\nC 183 ; WX 600" +" ; N bullet ; B 253 141 449 337 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 110 -14" +"5 371 145 ;\nC 185 ; WX 600 ; N quotedblbase ; B 73 -116 538 145 ;\nC 186 ; WX 6" +"00 ; N quotedblright ; B 170 343 635 604 ;\nC 187 ; WX 600 ; N guillemotright ; " +"B 67 0 585 417 ;\nC 188 ; WX 600 ; N ellipsis ; B 57 -15 557 84 ;\nC 189 ; WX 60" +"0 ; N perthousand ; B 91 -9 598 614 ;\nC 191 ; WX 600 ; N questiondown ; B 105 -" +"175 455 417 ;\nC 193 ; WX 600 ; N grave ; B 286 490 429 639 ;\nC 194 ; WX 600 ; " +"N acute ; B 388 490 577 639 ;\nC 195 ; WX 600 ; N circumflex ; B 263 490 554 639" +" ;\nC 196 ; WX 600 ; N tilde ; B 258 516 579 605 ;\nC 197 ; WX 600 ; N macron ; " +"B 273 536 564 576 ;\nC 198 ; WX 600 ; N breve ; B 280 489 574 621 ;\nC 199 ; WX " +"600 ; N dotaccent ; B 368 511 470 611 ;\nC 200 ; WX 600 ; N dieresis ; B 258 511" +" 581 611 ;\nC 202 ; WX 600 ; N ring ; B 326 480 516 661 ;\nC 203 ; WX 600 ; N ce" +"dilla ; B 181 -173 356 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 263 490 576 633 " +";\nC 206 ; WX 600 ; N ogonek ; B 258 -155 408 0 ;\nC 207 ; WX 600 ; N caron ; B " +"286 490 577 639 ;\nC 208 ; WX 600 ; N emdash ; B 60 261 659 302 ;\nC 225 ; WX 60" +"0 ; N AE ; B 14 0 690 563 ;\nC 227 ; WX 600 ; N ordfeminine ; B 229 279 511 574 " +";\nC 232 ; WX 600 ; N Lslash ; B 66 0 586 563 ;\nC 233 ; WX 600 ; N Oslash ; B 3" +"4 -43 685 605 ;\nC 234 ; WX 600 ; N OE ; B 62 0 690 563 ;\nC 235 ; WX 600 ; N or" +"dmasculine ; B 243 284 543 577 ;\nC 241 ; WX 600 ; N ae ; B 36 -16 630 431 ;\nC " +"245 ; WX 600 ; N dotlessi ; B 96 0 513 417 ;\nC 248 ; WX 600 ; N lslash ; B 96 0" +" 524 604 ;\nC 249 ; WX 600 ; N oslash ; B 47 -43 637 458 ;\nC 250 ; WX 600 ; N o" +"e ; B 50 -16 630 431 ;\nC 251 ; WX 600 ; N germandbls ; B 47 -16 539 604 ;\nC -1" +" ; WX 600 ; N Udieresis ; B 136 -16 676 762 ;\nC -1 ; WX 600 ; N Uacute ; B 136 " +"-16 676 789 ;\nC -1 ; WX 600 ; N Scedilla ; B 96 -179 602 577 ;\nC -1 ; WX 600 ;" +" N Tcaron ; B 152 0 648 789 ;\nC -1 ; WX 600 ; N Scaron ; B 96 -17 618 789 ;\nC " +"-1 ; WX 600 ; N Rcaron ; B 47 0 594 789 ;\nC -1 ; WX 600 ; N Racute ; B 47 0 594" +" 789 ;\nC -1 ; WX 600 ; N Sacute ; B 96 -17 602 789 ;\nC -1 ; WX 600 ; N Otilde " +"; B 103 -16 618 755 ;\nC -1 ; WX 600 ; N ucircumflex ; B 127 -16 569 639 ;\nC -1" +" ; WX 600 ; N Ohungarumlaut ; B 102 -16 672 787 ;\nC -1 ; WX 600 ; N Uhungarumla" +"ut ; B 136 -16 676 787 ;\nC -1 ; WX 600 ; N Yacute ; B 153 0 665 789 ;\nC -1 ; W" +"X 600 ; N Eth ; B 47 0 592 563 ;\nC -1 ; WX 600 ; N Dcroat ; B 47 0 592 563 ;\nC" +" -1 ; WX 600 ; N Zacute ; B 103 0 590 789 ;\nC -1 ; WX 600 ; N Uring ; B 136 -16" +" 676 807 ;\nC -1 ; WX 600 ; N gbreve ; B 105 -186 647 621 ;\nC -1 ; WX 600 ; N e" +"ogonek ; B 104 -155 570 431 ;\nC -1 ; WX 600 ; N edotaccent ; B 104 -16 570 611 " +";\nC -1 ; WX 600 ; N ecaron ; B 104 -16 577 639 ;\nC -1 ; WX 600 ; N Ugrave ; B " +"136 -16 676 789 ;\nC -1 ; WX 600 ; N Thorn ; B 47 0 566 563 ;\nC -1 ; WX 600 ; N" +" eacute ; B 104 -16 570 639 ;\nC -1 ; WX 600 ; N edieresis ; B 104 -16 586 611 ;" +"\nC -1 ; WX 600 ; N dcaron ; B 102 -16 774 618 ;\nC -1 ; WX 600 ; N ccedilla ; B" +" 122 -173 596 431 ;\nC -1 ; WX 600 ; N ccaron ; B 121 -17 596 639 ;\nC -1 ; WX 6" +"00 ; N cacute ; B 121 -17 596 639 ;\nC -1 ; WX 600 ; N aogonek ; B 93 -155 546 4" +"31 ;\nC -1 ; WX 600 ; N aring ; B 93 -16 546 661 ;\nC -1 ; WX 600 ; N atilde ; B" +" 93 -16 570 605 ;\nC -1 ; WX 600 ; N abreve ; B 93 -16 574 621 ;\nC -1 ; WX 600 " +"; N egrave ; B 104 -16 570 639 ;\nC -1 ; WX 600 ; N agrave ; B 93 -16 546 639 ;\n" +"C -1 ; WX 600 ; N aacute ; B 93 -16 546 639 ;\nC -1 ; WX 600 ; N adieresis ; B 9" +"3 -16 571 611 ;\nC -1 ; WX 600 ; N Uogonek ; B 136 -155 676 563 ;\nC -1 ; WX 600" +" ; N ugrave ; B 127 -16 569 639 ;\nC -1 ; WX 600 ; N uacute ; B 127 -16 569 639 " +";\nC -1 ; WX 600 ; N udieresis ; B 127 -16 573 611 ;\nC -1 ; WX 600 ; N tcaron ;" +" B 127 -16 593 618 ;\nC -1 ; WX 600 ; N scommaaccent ; B 108 -237 558 431 ;\nC -" +"1 ; WX 600 ; N Zcaron ; B 103 0 604 789 ;\nC -1 ; WX 600 ; N ecircumflex ; B 104" +" -16 570 639 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 136 -16 676 789 ;\nC -1 ; WX 6" +"00 ; N acircumflex ; B 93 -16 546 639 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 103 0 " +"590 762 ;\nC -1 ; WX 600 ; N scaron ; B 107 -17 584 639 ;\nC -1 ; WX 600 ; N Ama" +"cron ; B 13 0 596 723 ;\nC -1 ; WX 600 ; N sacute ; B 108 -17 577 639 ;\nC -1 ; " +"WX 600 ; N Tcommaaccent ; B 152 -237 648 563 ;\nC -1 ; WX 600 ; N Ydieresis ; B " +"153 0 665 762 ;\nC -1 ; WX 600 ; N thorn ; B -13 -186 593 590 ;\nC -1 ; WX 600 ;" +" N Emacron ; B 47 0 619 723 ;\nC -1 ; WX 600 ; N Ograve ; B 102 -16 616 789 ;\nC" +" -1 ; WX 600 ; N Oacute ; B 102 -16 616 789 ;\nC -1 ; WX 600 ; N Odieresis ; B 1" +"02 -16 616 762 ;\nC -1 ; WX 600 ; N Ntilde ; B 46 0 678 755 ;\nC -1 ; WX 600 ; N" +" Ncaron ; B 46 0 678 789 ;\nC -1 ; WX 600 ; N Nacute ; B 46 0 678 789 ;\nC -1 ; " +"WX 600 ; N Lcaron ; B 67 0 638 576 ;\nC -1 ; WX 600 ; N Lacute ; B 67 0 585 789 " +";\nC -1 ; WX 600 ; N Idotaccent ; B 117 0 603 762 ;\nC -1 ; WX 600 ; N racute ; " +"B 88 0 619 639 ;\nC -1 ; WX 600 ; N Icircumflex ; B 117 0 603 789 ;\nC -1 ; WX 6" +"00 ; N ohungarumlaut ; B 111 -16 616 633 ;\nC -1 ; WX 600 ; N otilde ; B 111 -16" +" 586 605 ;\nC -1 ; WX 600 ; N Euro ; B 60 -16 634 576 ;\nC -1 ; WX 600 ; N ocirc" +"umflex ; B 111 -16 577 639 ;\nC -1 ; WX 600 ; N onesuperior ; B 249 259 469 612 " +";\nC -1 ; WX 600 ; N twosuperior ; B 230 259 514 612 ;\nC -1 ; WX 600 ; N threes" +"uperior ; B 245 251 516 612 ;\nC -1 ; WX 600 ; N Igrave ; B 117 0 603 789 ;\nC -" +"1 ; WX 600 ; N Iacute ; B 117 0 603 789 ;\nC -1 ; WX 600 ; N Imacron ; B 117 0 6" +"03 723 ;\nC -1 ; WX 600 ; N Iogonek ; B 117 -155 603 563 ;\nC -1 ; WX 600 ; N Id" +"ieresis ; B 117 0 611 762 ;\nC -1 ; WX 600 ; N Gbreve ; B 108 -16 656 777 ;\nC -" +"1 ; WX 600 ; N Umacron ; B 136 -16 676 723 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B" +" 47 -237 662 563 ;\nC -1 ; WX 600 ; N ograve ; B 111 -16 577 639 ;\nC -1 ; WX 60" +"0 ; N Scommaaccent ; B 96 -237 602 577 ;\nC -1 ; WX 600 ; N Eogonek ; B 47 -155 " +"619 563 ;\nC -1 ; WX 600 ; N oacute ; B 111 -16 577 639 ;\nC -1 ; WX 600 ; N Edo" +"taccent ; B 47 0 619 762 ;\nC -1 ; WX 600 ; N iogonek ; B 96 -155 513 624 ;\nC -" +"1 ; WX 600 ; N gcommaaccent ; B 105 -186 647 668 ;\nC -1 ; WX 600 ; N odieresis " +"; B 111 -16 581 611 ;\nC -1 ; WX 600 ; N ntilde ; B 57 0 570 605 ;\nC -1 ; WX 60" +"0 ; N ncaron ; B 57 0 577 639 ;\nC -1 ; WX 600 ; N Ecaron ; B 47 0 619 789 ;\nC " +"-1 ; WX 600 ; N Ecircumflex ; B 47 0 619 789 ;\nC -1 ; WX 600 ; N scedilla ; B 1" +"08 -173 558 431 ;\nC -1 ; WX 600 ; N rcaron ; B 88 0 619 639 ;\nC -1 ; WX 600 ; " +"N Egrave ; B 47 0 619 789 ;\nC -1 ; WX 600 ; N Eacute ; B 47 0 619 789 ;\nC -1 ;" +" WX 600 ; N Gcommaaccent ; B 108 -237 636 576 ;\nC -1 ; WX 600 ; N Rcommaaccent " +"; B 47 -237 594 563 ;\nC -1 ; WX 600 ; N Edieresis ; B 47 0 619 762 ;\nC -1 ; WX" +" 600 ; N nacute ; B 57 0 577 639 ;\nC -1 ; WX 600 ; N uogonek ; B 127 -155 569 4" +"17 ;\nC -1 ; WX 600 ; N umacron ; B 127 -16 569 576 ;\nC -1 ; WX 600 ; N Dcaron " +"; B 47 0 592 789 ;\nC -1 ; WX 600 ; N lcaron ; B 96 0 593 618 ;\nC -1 ; WX 600 ;" +" N Ccaron ; B 110 -16 635 789 ;\nC -1 ; WX 600 ; N Cacute ; B 110 -16 635 789 ;\n" +"C -1 ; WX 600 ; N Ccedilla ; B 110 -173 635 576 ;\nC -1 ; WX 600 ; N degree ; B " +"257 346 553 636 ;\nC -1 ; WX 600 ; N Aogonek ; B 13 -155 596 563 ;\nC -1 ; WX 60" +"0 ; N minus ; B 131 261 588 302 ;\nC -1 ; WX 600 ; N multiply ; B 143 100 577 46" +"4 ;\nC -1 ; WX 600 ; N divide ; B 131 25 588 540 ;\nC -1 ; WX 600 ; N Aring ; B " +"13 0 596 811 ;\nC -1 ; WX 600 ; N trademark ; B 90 243 710 563 ;\nC -1 ; WX 600 " +"; N rcommaaccent ; B 88 -237 619 427 ;\nC -1 ; WX 600 ; N lacute ; B 96 0 572 78" +"9 ;\nC -1 ; WX 600 ; N omacron ; B 111 -16 577 576 ;\nC -1 ; WX 600 ; N Atilde ;" +" B 13 0 596 755 ;\nC -1 ; WX 600 ; N icircumflex ; B 95 0 536 639 ;\nC -1 ; WX 6" +"00 ; N igrave ; B 96 0 513 639 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 57 -237 546" +" 431 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 96 -237 513 604 ;\nC -1 ; WX 600 ; N " +"plusminus ; B 76 0 597 529 ;\nC -1 ; WX 600 ; N onehalf ; B 82 0 627 612 ;\nC -1" +" ; WX 600 ; N onequarter ; B 74 0 619 612 ;\nC -1 ; WX 600 ; N threequarters ; B" +" 70 0 619 612 ;\nC -1 ; WX 600 ; N iacute ; B 96 0 535 639 ;\nC -1 ; WX 600 ; N " +"Abreve ; B 13 0 596 777 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 67 -237 578 604 ;\n" +"C -1 ; WX 600 ; N Omacron ; B 102 -16 616 723 ;\nC -1 ; WX 600 ; N imacron ; B 9" +"6 0 564 576 ;\nC -1 ; WX 600 ; N emacron ; B 104 -16 570 576 ;\nC -1 ; WX 600 ; " +"N amacron ; B 93 -16 564 576 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 127 -237 518 " +"563 ;\nC -1 ; WX 600 ; N ydieresis ; B 22 -186 634 611 ;\nC -1 ; WX 600 ; N zdot" +"accent ; B 115 0 563 611 ;\nC -1 ; WX 600 ; N zcaron ; B 115 0 576 639 ;\nC -1 ;" +" WX 600 ; N zacute ; B 115 0 577 639 ;\nC -1 ; WX 600 ; N yacute ; B 22 -186 634" +" 639 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 127 -16 576 633 ;\nC -1 ; WX 600 ; N" +" eth ; B 111 -17 582 620 ;\nC -1 ; WX 600 ; N uring ; B 127 -16 569 661 ;\nC -1 " +"; WX 600 ; N Ocircumflex ; B 102 -16 616 789 ;\nC -1 ; WX 600 ; N commaaccent ; " +"B 159 -237 322 -60 ;\nC -1 ; WX 600 ; N copyright ; B 57 -15 663 578 ;\nC -1 ; W" +"X 600 ; N registered ; B 57 -15 663 578 ;\nC -1 ; WX 600 ; N Acircumflex ; B 13 " +"0 596 789 ;\nC -1 ; WX 600 ; N idieresis ; B 96 0 568 611 ;\nC -1 ; WX 600 ; N l" +"ozenge ; B 149 -11 571 575 ;\nC -1 ; WX 600 ; N Delta ; B 43 0 557 563 ;\nC -1 ;" +" WX 600 ; N notequal ; B 96 94 625 464 ;\nC -1 ; WX 600 ; N radical ; B 88 0 773" +" 699 ;\nC -1 ; WX 600 ; N Agrave ; B 13 0 596 789 ;\nC -1 ; WX 600 ; N Aacute ; " +"B 13 0 596 789 ;\nC -1 ; WX 600 ; N lessequal ; B 56 0 635 535 ;\nC -1 ; WX 600 " +"; N greaterequal ; B 71 0 600 535 ;\nC -1 ; WX 600 ; N logicalnot ; B 160 168 62" +"1 438 ;\nC -1 ; WX 600 ; N summation ; B 90 -127 616 563 ;\nC -1 ; WX 600 ; N pa" +"rtialdiff ; B 111 -16 580 581 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 46 -237 678 " +"563 ;\nC -1 ; WX 600 ; N dcroat ; B 102 -16 690 604 ;\nC -1 ; WX 600 ; N brokenb" +"ar ; B 257 -124 444 604 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 67 -237 585 563 ;\n" +"C -1 ; WX 600 ; N Adieresis ; B 13 0 596 762 ;\nC -1 ; WX 600 ; N mu ; B 86 -200" +" 569 417 ;\nC -1 ; WX 600 ; N .notdef ; B 319 0 319 0 ;\nEndCharMetrics\nStartKe" +"rnData\nStartKernPairs 998\nKPX A C -41\nKPX A Ccedilla -39\nKPX A G -36\nKPX A " +"O -35\nKPX A Odieresis -35\nKPX A Q -37\nKPX A T -34\nKPX A U -41\nKPX A Uacute " +"-41\nKPX A Ucircumflex -41\nKPX A Udieresis -41\nKPX A Ugrave -41\nKPX A V -78\n" +"KPX A W -20\nKPX A Y -35\nKPX A a 1\nKPX A b 40\nKPX A c -26\nKPX A ccedilla -23" +"\nKPX A comma -47\nKPX A d -17\nKPX A e -21\nKPX A g -27\nKPX A guillemotleft -5" +"7\nKPX A guilsinglleft -57\nKPX A hyphen -35\nKPX A o -22\nKPX A period -70\nKPX" +" A q -27\nKPX A quotedblright -82\nKPX A quoteright -102\nKPX A t -33\nKPX A u -" +"23\nKPX A v -59\nKPX A w -27\nKPX A y -63\nKPX Aacute C -41\nKPX Aacute G -36\nK" +"PX Aacute O -35\nKPX Aacute Q -37\nKPX Aacute T -34\nKPX Aacute U -41\nKPX Aacut" +"e V -78\nKPX Aacute W -20\nKPX Aacute Y -35\nKPX Aacute a 1\nKPX Aacute b 40\nKP" +"X Aacute c -26\nKPX Aacute comma -47\nKPX Aacute d -17\nKPX Aacute e -21\nKPX Aa" +"cute g -27\nKPX Aacute guillemotleft -57\nKPX Aacute guilsinglleft -57\nKPX Aacu" +"te hyphen -35\nKPX Aacute o -22\nKPX Aacute period -70\nKPX Aacute q -27\nKPX Aa" +"cute quoteright -102\nKPX Aacute t -33\nKPX Aacute u -23\nKPX Aacute v -59\nKPX " +"Aacute w -27\nKPX Aacute y -63\nKPX Acircumflex C -41\nKPX Acircumflex G -36\nKP" +"X Acircumflex O -35\nKPX Acircumflex Q -37\nKPX Acircumflex T -34\nKPX Acircumfl" +"ex U -41\nKPX Acircumflex V -78\nKPX Acircumflex W -20\nKPX Acircumflex Y -35\nK" +"PX Acircumflex comma -47\nKPX Acircumflex period -70\nKPX Adieresis C -41\nKPX A" +"dieresis G -36\nKPX Adieresis O -35\nKPX Adieresis Q -37\nKPX Adieresis T -34\nK" +"PX Adieresis U -41\nKPX Adieresis V -78\nKPX Adieresis W -20\nKPX Adieresis Y -3" +"5\nKPX Adieresis a 1\nKPX Adieresis b 40\nKPX Adieresis c -26\nKPX Adieresis com" +"ma -47\nKPX Adieresis d -17\nKPX Adieresis g -27\nKPX Adieresis guillemotleft -5" +"7\nKPX Adieresis guilsinglleft -57\nKPX Adieresis hyphen -35\nKPX Adieresis o -2" +"2\nKPX Adieresis period -70\nKPX Adieresis q -27\nKPX Adieresis quotedblright -8" +"2\nKPX Adieresis quoteright -102\nKPX Adieresis t -33\nKPX Adieresis u -23\nKPX " +"Adieresis v -59\nKPX Adieresis w -27\nKPX Adieresis y -63\nKPX Agrave C -41\nKPX" +" Agrave G -36\nKPX Agrave O -35\nKPX Agrave Q -37\nKPX Agrave T -34\nKPX Agrave " +"U -41\nKPX Agrave V -78\nKPX Agrave W -20\nKPX Agrave Y -35\nKPX Agrave comma -4" +"7\nKPX Agrave period -70\nKPX Aring C -41\nKPX Aring G -36\nKPX Aring O -35\nKPX" +" Aring Q -37\nKPX Aring T -34\nKPX Aring U -41\nKPX Aring V -78\nKPX Aring W -20" +"\nKPX Aring Y -35\nKPX Aring a 1\nKPX Aring b 40\nKPX Aring c -26\nKPX Aring com" +"ma -47\nKPX Aring d -17\nKPX Aring e -21\nKPX Aring g -27\nKPX Aring guillemotle" +"ft -57\nKPX Aring guilsinglleft -57\nKPX Aring hyphen -35\nKPX Aring o -22\nKPX " +"Aring period -70\nKPX Aring q -27\nKPX Aring quotedblright -82\nKPX Aring quoter" +"ight -102\nKPX Aring t -33\nKPX Aring u -23\nKPX Aring v -59\nKPX Aring w -27\nK" +"PX Aring y -63\nKPX Atilde C -41\nKPX Atilde G -36\nKPX Atilde O -35\nKPX Atilde" +" Q -37\nKPX Atilde T -34\nKPX Atilde U -41\nKPX Atilde V -78\nKPX Atilde W -20\n" +"KPX Atilde Y -35\nKPX Atilde comma -47\nKPX Atilde period -70\nKPX B A -15\nKPX " +"B AE -16\nKPX B Aacute -15\nKPX B Acircumflex -15\nKPX B Adieresis -15\nKPX B Ar" +"ing -15\nKPX B Atilde -15\nKPX B O -15\nKPX B OE 5\nKPX B Oacute -15\nKPX B Ocir" +"cumflex -15\nKPX B Odieresis -15\nKPX B Ograve -15\nKPX B Oslash -14\nKPX B V -3" +"7\nKPX B W -15\nKPX B Y -58\nKPX C A -14\nKPX C AE -14\nKPX C Aacute -14\nKPX C " +"Adieresis -14\nKPX C Aring -14\nKPX C H -34\nKPX C K -19\nKPX C O -24\nKPX C Oac" +"ute -24\nKPX C Odieresis -24\nKPX Ccedilla A -8\nKPX D A -47\nKPX D Aacute -47\n" +"KPX D Acircumflex -47\nKPX D Adieresis -47\nKPX D Agrave -47\nKPX D Aring -47\nK" +"PX D Atilde -47\nKPX D J -38\nKPX D T -47\nKPX D V -50\nKPX D W -20\nKPX D X -60" +"\nKPX D Y -71\nKPX F A -45\nKPX F Aacute -45\nKPX F Acircumflex -45\nKPX F Adier" +"esis -45\nKPX F Agrave -45\nKPX F Aring -45\nKPX F Atilde -45\nKPX F J -100\nKPX" +" F O -34\nKPX F Odieresis -34\nKPX F a -52\nKPX F aacute -52\nKPX F adieresis -4" +"9\nKPX F ae -25\nKPX F aring -52\nKPX F comma -172\nKPX F e -61\nKPX F eacute -6" +"1\nKPX F hyphen -72\nKPX F i -51\nKPX F j -59\nKPX F o -68\nKPX F oacute -68\nKP" +"X F odieresis -54\nKPX F oe -26\nKPX F oslash -68\nKPX F period -196\nKPX F r -3" +"7\nKPX F u -6\nKPX G A 0\nKPX G AE 0\nKPX G Aacute 0\nKPX G Acircumflex 0\nKPX G" +" Adieresis 0\nKPX G Agrave 0\nKPX G Aring 0\nKPX G Atilde 0\nKPX G T -31\nKPX G " +"V -1\nKPX G W -4\nKPX G Y -22\nKPX J A -14\nKPX J AE -23\nKPX J Adieresis -14\nK" +"PX J Aring -14\nKPX K C -50\nKPX K G -46\nKPX K O -45\nKPX K OE -28\nKPX K Oacut" +"e -45\nKPX K Odieresis -45\nKPX K S -16\nKPX K T -18\nKPX K a -8\nKPX K adieresi" +"s -8\nKPX K ae 19\nKPX K aring -8\nKPX K e -30\nKPX K hyphen -66\nKPX K o -32\nK" +"PX K oacute -32\nKPX K odieresis -32\nKPX K u -33\nKPX K udieresis -33\nKPX K y " +"-72\nKPX L A 9\nKPX L AE 9\nKPX L Aacute 9\nKPX L Adieresis 9\nKPX L Aring 9\nKP" +"X L C -19\nKPX L Ccedilla -19\nKPX L G -18\nKPX L O -15\nKPX L Oacute -15\nKPX L" +" Ocircumflex -15\nKPX L Odieresis -15\nKPX L Ograve -15\nKPX L Otilde -15\nKPX L" +" S -31\nKPX L T -59\nKPX L U -36\nKPX L Udieresis -36\nKPX L V -71\nKPX L W -31\n" +"KPX L Y -60\nKPX L hyphen -1\nKPX L quotedblright -76\nKPX L quoteright -84\nKPX" +" L u -20\nKPX L udieresis -20\nKPX L y -50\nKPX N A -10\nKPX N AE -10\nKPX N Aac" +"ute -10\nKPX N Adieresis -10\nKPX N Aring -10\nKPX N C -18\nKPX N Ccedilla -18\n" +"KPX N G -16\nKPX N O -14\nKPX N Oacute -14\nKPX N Odieresis -14\nKPX N a -23\nKP" +"X N aacute -23\nKPX N adieresis -23\nKPX N ae 7\nKPX N aring -23\nKPX N comma -6" +"4\nKPX N e -10\nKPX N eacute -10\nKPX N o -14\nKPX N oacute -14\nKPX N odieresis" +" -14\nKPX N oslash -11\nKPX N period -87\nKPX N u -14\nKPX N udieresis -14\nKPX " +"O A -33\nKPX O AE -30\nKPX O Aacute -33\nKPX O Adieresis -33\nKPX O Aring -33\nK" +"PX O T -37\nKPX O V -40\nKPX O W -8\nKPX O X -47\nKPX O Y -61\nKPX Oacute A -33\n" +"KPX Oacute T -37\nKPX Oacute V -40\nKPX Oacute W -8\nKPX Oacute Y -61\nKPX Ocirc" +"umflex T -37\nKPX Ocircumflex V -40\nKPX Ocircumflex Y -61\nKPX Odieresis A -33\n" +"KPX Odieresis T -37\nKPX Odieresis V -40\nKPX Odieresis W -8\nKPX Odieresis X -4" +"7\nKPX Odieresis Y -61\nKPX Ograve T -37\nKPX Ograve V -40\nKPX Ograve Y -61\nKP" +"X Oslash A -31\nKPX Otilde T -36\nKPX Otilde V -39\nKPX Otilde Y -60\nKPX P A -8" +"7\nKPX P AE -81\nKPX P Aacute -87\nKPX P Adieresis -87\nKPX P Aring -87\nKPX P J" +" -90\nKPX P a -57\nKPX P aacute -57\nKPX P adieresis -57\nKPX P ae -29\nKPX P ar" +"ing -57\nKPX P comma -161\nKPX P e -47\nKPX P eacute -47\nKPX P hyphen -52\nKPX " +"P o -53\nKPX P oacute -53\nKPX P odieresis -53\nKPX P oe -18\nKPX P oslash -53\n" +"KPX P period -185\nKPX R C -32\nKPX R Ccedilla -33\nKPX R G -31\nKPX R O -29\nKP" +"X R OE -8\nKPX R Oacute -29\nKPX R Odieresis -29\nKPX R T -35\nKPX R U -36\nKPX " +"R Udieresis -36\nKPX R V -42\nKPX R W -21\nKPX R Y -36\nKPX R a 0\nKPX R aacute " +"0\nKPX R adieresis 0\nKPX R ae 27\nKPX R aring 0\nKPX R e -22\nKPX R eacute -22\n" +"KPX R hyphen -53\nKPX R o -23\nKPX R oacute -23\nKPX R odieresis -23\nKPX R oe 1" +"5\nKPX R u -16\nKPX R uacute -16\nKPX R udieresis -16\nKPX R y -20\nKPX S A -28\n" +"KPX S AE -28\nKPX S Aacute -28\nKPX S Adieresis -28\nKPX S Aring -28\nKPX S T -4" +"8\nKPX S V -18\nKPX S W -23\nKPX S Y -39\nKPX S t -25\nKPX T A -34\nKPX T AE -35" +"\nKPX T Aacute -34\nKPX T Acircumflex -34\nKPX T Adieresis -34\nKPX T Agrave -34" +"\nKPX T Aring -34\nKPX T Atilde -34\nKPX T C -36\nKPX T G -35\nKPX T J -88\nKPX " +"T O -34\nKPX T OE -12\nKPX T Oacute -34\nKPX T Ocircumflex -34\nKPX T Odieresis " +"-34\nKPX T Ograve -34\nKPX T Oslash -34\nKPX T Otilde -34\nKPX T S -50\nKPX T V " +"4\nKPX T W -1\nKPX T Y -17\nKPX T a -68\nKPX T ae -38\nKPX T c -83\nKPX T colon " +"-145\nKPX T comma -116\nKPX T e -83\nKPX T g -76\nKPX T guillemotleft -129\nKPX " +"T guilsinglleft -129\nKPX T hyphen -99\nKPX T i -51\nKPX T j -59\nKPX T o -87\nK" +"PX T oslash -60\nKPX T period -145\nKPX T r -37\nKPX T s -70\nKPX T semicolon -1" +"19\nKPX T u -92\nKPX T v -98\nKPX T w -96\nKPX T y -108\nKPX U A -26\nKPX U AE -" +"35\nKPX U Aacute -26\nKPX U Acircumflex -26\nKPX U Adieresis -26\nKPX U Aring -2" +"6\nKPX U Atilde -26\nKPX U comma -80\nKPX U m 3\nKPX U n -22\nKPX U p -5\nKPX U " +"period -105\nKPX U r -47\nKPX Uacute A -26\nKPX Uacute comma -80\nKPX Uacute m 3" +"\nKPX Uacute n -22\nKPX Uacute p -5\nKPX Uacute period -105\nKPX Uacute r -47\nK" +"PX Ucircumflex A -26\nKPX Udieresis A -26\nKPX Udieresis b 17\nKPX Udieresis com" +"ma -80\nKPX Udieresis m 3\nKPX Udieresis n -22\nKPX Udieresis p -5\nKPX Udieresi" +"s period -105\nKPX Udieresis r -47\nKPX Ugrave A -26\nKPX V A -10\nKPX V AE -19\n" +"KPX V Aacute -10\nKPX V Acircumflex -10\nKPX V Adieresis -10\nKPX V Agrave -10\n" +"KPX V Aring -10\nKPX V Atilde -10\nKPX V C -39\nKPX V G -38\nKPX V O -37\nKPX V " +"Oacute -37\nKPX V Ocircumflex -37\nKPX V Odieresis -37\nKPX V Ograve -37\nKPX V " +"Oslash -38\nKPX V Otilde -38\nKPX V S -41\nKPX V T 4\nKPX V a -65\nKPX V ae -37\n" +"KPX V colon -130\nKPX V comma -134\nKPX V e -56\nKPX V g -57\nKPX V guillemotlef" +"t -83\nKPX V guilsinglleft -83\nKPX V hyphen -49\nKPX V i -65\nKPX V o -60\nKPX " +"V oslash -57\nKPX V period -158\nKPX V r -51\nKPX V semicolon -121\nKPX V u -20\n" +"KPX V y -24\nKPX W A -16\nKPX W AE -21\nKPX W Aacute -16\nKPX W Acircumflex -16\n" +"KPX W Adieresis -16\nKPX W Agrave -16\nKPX W Aring -16\nKPX W Atilde -16\nKPX W " +"C -14\nKPX W G -12\nKPX W O -10\nKPX W Oacute -10\nKPX W Ocircumflex -10\nKPX W " +"Odieresis -10\nKPX W Ograve -10\nKPX W Oslash -7\nKPX W Otilde -10\nKPX W S -29\n" +"KPX W T -2\nKPX W a -24\nKPX W ae 6\nKPX W colon -93\nKPX W comma -71\nKPX W e -" +"10\nKPX W g -11\nKPX W guillemotleft -38\nKPX W guilsinglleft -38\nKPX W hyphen " +"-7\nKPX W i -48\nKPX W o -14\nKPX W oslash -11\nKPX W period -95\nKPX W r -34\nK" +"PX W semicolon -74\nKPX W u -2\nKPX W y -6\nKPX X C -52\nKPX X O -48\nKPX X Odie" +"resis -48\nKPX X Q -48\nKPX X a -14\nKPX X e -36\nKPX X hyphen -81\nKPX X o -38\n" +"KPX X u -39\nKPX X y -57\nKPX Y A -31\nKPX Y AE -34\nKPX Y Aacute -31\nKPX Y Aci" +"rcumflex -31\nKPX Y Adieresis -31\nKPX Y Agrave -31\nKPX Y Aring -31\nKPX Y Atil" +"de -31\nKPX Y C -60\nKPX Y G -60\nKPX Y O -59\nKPX Y Oacute -59\nKPX Y Ocircumfl" +"ex -59\nKPX Y Odieresis -59\nKPX Y Ograve -59\nKPX Y Oslash -59\nKPX Y Otilde -5" +"9\nKPX Y S -62\nKPX Y T -17\nKPX Y a -67\nKPX Y ae -40\nKPX Y colon -145\nKPX Y " +"comma -116\nKPX Y e -81\nKPX Y g -84\nKPX Y guillemotleft -119\nKPX Y guilsingll" +"eft -119\nKPX Y hyphen -96\nKPX Y i -63\nKPX Y o -86\nKPX Y oslash -59\nKPX Y p " +"-39\nKPX Y period -144\nKPX Y semicolon -119\nKPX Y u -50\nKPX Y v -44\nKPX Z v " +"-54\nKPX Z y -64\nKPX a j -93\nKPX a quoteright -60\nKPX a v -33\nKPX a w -23\nK" +"PX a y -44\nKPX aacute v -33\nKPX aacute w -23\nKPX aacute y -44\nKPX adieresis " +"v -33\nKPX adieresis w -23\nKPX adieresis y -44\nKPX ae v 16\nKPX ae w 16\nKPX a" +"e y 5\nKPX agrave v -33\nKPX agrave w -23\nKPX agrave y -44\nKPX aring v -33\nKP" +"X aring w -23\nKPX aring y -44\nKPX b v -17\nKPX b w 0\nKPX b y -28\nKPX c h -6\n" +"KPX c k -12\nKPX comma one -148\nKPX comma quotedblright -123\nKPX comma quoteri" +"ght -142\nKPX e quoteright -43\nKPX e t -34\nKPX e v -28\nKPX e w -20\nKPX e x -" +"5\nKPX e y -39\nKPX eacute v -28\nKPX eacute w -20\nKPX eacute y -39\nKPX ecircu" +"mflex v -28\nKPX ecircumflex w -20\nKPX ecircumflex y -39\nKPX eight four -65\nK" +"PX eight one -85\nKPX eight seven -77\nKPX f a -44\nKPX f aacute -44\nKPX f adie" +"resis -26\nKPX f ae -17\nKPX f aring -44\nKPX f e -58\nKPX f eacute -58\nKPX f f" +" -46\nKPX f i -40\nKPX f j -63\nKPX f l -31\nKPX f o -65\nKPX f oacute -65\nKPX " +"f odieresis -31\nKPX f oe -23\nKPX f oslash -36\nKPX f quoteright -62\nKPX f s -" +"46\nKPX f t -10\nKPX five four -56\nKPX five one -90\nKPX five seven -78\nKPX fo" +"ur four -68\nKPX four one -73\nKPX four seven -99\nKPX g a -14\nKPX g adieresis " +"-14\nKPX g ae 13\nKPX g aring -14\nKPX g e -7\nKPX g eacute -7\nKPX g l -37\nKPX" +" g oacute -12\nKPX g odieresis -12\nKPX g r -4\nKPX guillemotright A -50\nKPX gu" +"illemotright AE -46\nKPX guillemotright Aacute -50\nKPX guillemotright Adieresis" +" -50\nKPX guillemotright Aring -50\nKPX guillemotright T -128\nKPX guillemotrigh" +"t V -80\nKPX guillemotright W -37\nKPX guillemotright Y -119\nKPX guilsinglright" +" A -50\nKPX guilsinglright AE -46\nKPX guilsinglright Aacute -50\nKPX guilsinglr" +"ight Adieresis -50\nKPX guilsinglright Aring -50\nKPX guilsinglright T -128\nKPX" +" guilsinglright V -80\nKPX guilsinglright W -37\nKPX guilsinglright Y -119\nKPX " +"h quoteright -52\nKPX h y -37\nKPX hyphen A -29\nKPX hyphen AE -23\nKPX hyphen A" +"acute -29\nKPX hyphen Adieresis -29\nKPX hyphen Aring -29\nKPX hyphen T -98\nKPX" +" hyphen V -44\nKPX hyphen W -4\nKPX hyphen Y -95\nKPX i T -64\nKPX i j -146\nKPX" +" k a -12\nKPX k aacute -12\nKPX k adieresis -12\nKPX k ae 15\nKPX k aring -12\nK" +"PX k comma -60\nKPX k e -34\nKPX k eacute -34\nKPX k g -43\nKPX k hyphen -104\nK" +"PX k o -35\nKPX k oacute -35\nKPX k odieresis -35\nKPX k period -89\nKPX k s -14" +"\nKPX k u -7\nKPX k udieresis -7\nKPX l v -86\nKPX l y -96\nKPX m p 19\nKPX m v " +"7\nKPX m w 13\nKPX m y -3\nKPX n T -48\nKPX n p -8\nKPX n quoteright -50\nKPX n " +"v -25\nKPX n w -14\nKPX n y -36\nKPX nine four -58\nKPX nine one -84\nKPX nine s" +"even -75\nKPX o T -89\nKPX o quoteright -41\nKPX o t -24\nKPX o v -25\nKPX o w -" +"7\nKPX o x -28\nKPX o y -36\nKPX oacute v -25\nKPX oacute w -7\nKPX oacute y -36" +"\nKPX ocircumflex t -24\nKPX odieresis t -24\nKPX odieresis v -25\nKPX odieresis" +" w -7\nKPX odieresis x -28\nKPX odieresis y -36\nKPX ograve v -25\nKPX ograve w " +"-7\nKPX ograve y -36\nKPX one comma -99\nKPX one eight -94\nKPX one five -76\nKP" +"X one four -127\nKPX one nine -81\nKPX one one -69\nKPX one period -128\nKPX one" +" seven -147\nKPX one six -119\nKPX one three -69\nKPX one two -54\nKPX one zero " +"-102\nKPX p t -20\nKPX p y -25\nKPX period one -125\nKPX period quotedblright -1" +"14\nKPX period quoteright -133\nKPX q c -4\nKPX q u 37\nKPX quotedblbase A -6\nK" +"PX quotedblbase AE -6\nKPX quotedblbase T -82\nKPX quotedblbase V -85\nKPX quote" +"dblbase W -24\nKPX quotedblbase Y -83\nKPX quotedblleft A -66\nKPX quotedblleft " +"AE -57\nKPX quotedblleft Aacute -66\nKPX quotedblleft Adieresis -66\nKPX quotedb" +"lleft Aring -66\nKPX quotedblleft T -46\nKPX quotedblleft V -18\nKPX quotedbllef" +"t W -8\nKPX quotedblleft Y -46\nKPX quotedblright A -67\nKPX quotedblright AE -7" +"6\nKPX quotedblright Aacute -66\nKPX quotedblright Adieresis -66\nKPX quotedblri" +"ght Aring -66\nKPX quotedblright T -53\nKPX quotedblright V -22\nKPX quotedblrig" +"ht W -26\nKPX quotedblright Y -43\nKPX quoteleft A -87\nKPX quoteleft AE -78\nKP" +"X quoteleft Aacute -87\nKPX quoteleft Adieresis -87\nKPX quoteleft Aring -87\nKP" +"X quoteleft T -67\nKPX quoteleft V -39\nKPX quoteleft W -29\nKPX quoteleft Y -67" +"\nKPX quoteright A -145\nKPX quoteright AE -154\nKPX quoteright Aacute -145\nKPX" +" quoteright Adieresis -145\nKPX quoteright Aring -145\nKPX quoteright comma -201" +"\nKPX quoteright d -129\nKPX quoteright o -135\nKPX quoteright period -224\nKPX " +"quoteright r -150\nKPX quoteright s -144\nKPX quoteright t -118\nKPX quoteright " +"v -112\nKPX quoteright w -108\nKPX quoteright y -122\nKPX r a -26\nKPX r aacute " +"-26\nKPX r acircumflex -26\nKPX r adieresis -26\nKPX r ae 1\nKPX r agrave -26\nK" +"PX r aring -26\nKPX r c -26\nKPX r ccedilla -34\nKPX r colon -86\nKPX r comma -1" +"04\nKPX r d -18\nKPX r e -17\nKPX r eacute -17\nKPX r ecircumflex -17\nKPX r egr" +"ave -17\nKPX r f -24\nKPX r g -15\nKPX r h -24\nKPX r hyphen -125\nKPX r i -34\n" +"KPX r j -42\nKPX r k -34\nKPX r l -51\nKPX r m 27\nKPX r n 0\nKPX r o -24\nKPX r" +" oacute -24\nKPX r ocircumflex -24\nKPX r odieresis -24\nKPX r oe 13\nKPX r ogra" +"ve -24\nKPX r oslash -24\nKPX r p 21\nKPX r period -133\nKPX r q -16\nKPX r quot" +"eright -44\nKPX r r -20\nKPX r s -29\nKPX r semicolon -75\nKPX r t 11\nKPX r u 1" +"1\nKPX r v 17\nKPX r w 17\nKPX r x -4\nKPX r y 6\nKPX r z -23\nKPX s quoteright " +"-51\nKPX s t -17\nKPX seven colon -154\nKPX seven comma -146\nKPX seven eight -8" +"6\nKPX seven five -91\nKPX seven four -116\nKPX seven one -74\nKPX seven period " +"-169\nKPX seven seven -69\nKPX seven six -104\nKPX seven three -79\nKPX seven tw" +"o -76\nKPX six four -52\nKPX six one -68\nKPX six seven -55\nKPX t S -40\nKPX t " +"a -25\nKPX t aacute -25\nKPX t adieresis -25\nKPX t ae 2\nKPX t aring -25\nKPX t" +" colon -107\nKPX t e -43\nKPX t eacute -43\nKPX t h -8\nKPX t o -45\nKPX t oacut" +"e -45\nKPX t odieresis -45\nKPX t quoteright -100\nKPX t semicolon -86\nKPX thre" +"e four -58\nKPX three one -82\nKPX three seven -75\nKPX two four -97\nKPX two on" +"e -73\nKPX two seven -79\nKPX u quoteright -43\nKPX v a -9\nKPX v aacute -9\nKPX" +" v acircumflex -9\nKPX v adieresis -9\nKPX v ae 17\nKPX v agrave -9\nKPX v aring" +" -9\nKPX v atilde -9\nKPX v c -22\nKPX v colon -75\nKPX v comma -118\nKPX v e -1" +"7\nKPX v eacute -17\nKPX v ecircumflex -17\nKPX v egrave -17\nKPX v g -14\nKPX v" +" hyphen -30\nKPX v l -87\nKPX v o -23\nKPX v oacute -23\nKPX v odieresis -23\nKP" +"X v ograve -23\nKPX v oslash -23\nKPX v period -143\nKPX v s -22\nKPX v semicolo" +"n -66\nKPX w a -9\nKPX w aacute -9\nKPX w acircumflex -9\nKPX w adieresis -9\nKP" +"X w ae 17\nKPX w agrave -9\nKPX w aring -9\nKPX w atilde -9\nKPX w c -12\nKPX w " +"colon -75\nKPX w comma -75\nKPX w e -4\nKPX w eacute -4\nKPX w ecircumflex -4\nK" +"PX w egrave -4\nKPX w g -6\nKPX w hyphen -4\nKPX w l -53\nKPX w o -9\nKPX w oacu" +"te -9\nKPX w odieresis -9\nKPX w ograve -9\nKPX w oslash -6\nKPX w period -99\nK" +"PX w s -22\nKPX w semicolon -66\nKPX x a -8\nKPX x c -35\nKPX x e -30\nKPX x eac" +"ute -30\nKPX x o -31\nKPX x q -33\nKPX y a -20\nKPX y aacute -20\nKPX y acircumf" +"lex -20\nKPX y adieresis -20\nKPX y ae 6\nKPX y agrave -20\nKPX y aring -20\nKPX" +" y atilde -20\nKPX y c -33\nKPX y colon -86\nKPX y comma -122\nKPX y e -28\nKPX " +"y eacute -28\nKPX y ecircumflex -28\nKPX y egrave -28\nKPX y g -25\nKPX y hyphen" +" -29\nKPX y l -98\nKPX y o -34\nKPX y oacute -34\nKPX y odieresis -34\nKPX y ogr" +"ave -34\nKPX y oslash -34\nKPX y period -148\nKPX y s -33\nKPX y semicolon -77\n" +"KPX zero four -64\nKPX zero one -91\nKPX zero seven -82\nEndKernPairs\nEndKernDa" +"ta\nEndFontMetrics\n" +; +int n022023l_pfb_len = 44404; +char* n022023l_pfb = +"\x80\x1m\x6\x0\x0%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05\n%%CreationDate: W" +"ed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developme" +"nt\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COP" +"YING (GNU General Public License) for license conditions.\n% As a special except" +"ion, permission is granted to include this font\n% program in a Postscript or PD" +"F file that consists of a document that\n% contains text to be displayed or prin" +"ted using this font, regardless\n% of the conditions or license applying to the " +"document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) re" +"adonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See" +" the file COPYING (GNU General Public License) for license conditions. As a spec" +"ial exception, permission is granted to include this font program in a Postscrip" +"t or PDF file that consists of a document that contains text to be displayed or " +"printed using this font, regardless of the conditions or license applying to the" +" document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by" +" (URW)++ Design & Development) readonly def\n/FullName (Nimbus Mono L Regular Ob" +"lique) readonly def\n/FamilyName (Nimbus Mono L) readonly def\n/Weight (Regular)" +" readonly def\n/ItalicAngle -12.0 def\n/isFixedPitch false def\n/UnderlinePositi" +"on -100 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusMonL" +"-ReguObli def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-61 -237 774 811} read" +"only def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly de" +"f\n/Encoding StandardEncoding def\n/UniqueID 5020947 def\ncurrentdict end\ncurre" +"ntfile eexec\r\x80\x2\xdf\xa4\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a" +"\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9c" +"t\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4" +"\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5" +"Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d" +"\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7" +"\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>j \x85\x11\xc6" +"\xd0\xc2U\xb9\xa5\xbb/\xde\xdbM9\x9cl\xf1\x94\xff\xac#h\x83v|\xfh\xf4\xef\x84\xee" +"ikg}\xe7\x4\xec;\x9s\x84\xf2\xe6s\xa1\xf5\x16\x92\xb7\xb2`i78\xc2\x11\x9f}\x90\xff" +"\xdb!\xebq_\xd5\xb8\x13O\xc8}\xba\x32\xe\xe5L,\xecjMk\xb3PU^\xaf\xf2\xecO\x84\x36" +"\\\xcc\x8\x2\xdb\xb3\xbd\xe?\r\x9f\x85\x86G\xdd\x63w%\xc2\xca\xf9U\x7f\xdf\x84*\r" +"\xa6\xa0\xca\xf\x1b\x44.\xf8\xeel\xbf+\x3\x85\x84h\xa4\x66\xacX\x83\xcb\xbd\x38\x15" +"\xb2\x83\x34;9 X\x3\xc0,\x91}\x6\x82\\\x9\xe2\xbb\x14`\x9f\xa3,(\xd7 \xc0\xe1JK\x12" +"\xd4\xf1%\xff\x62\x81\xff\x32M\xa3:V\xfcI\x98z\xc7\xd3\xaa e@\xf8\x12rs\xff\xe9\xa3" +"\xda\xcf\xfe+\x1c&\x9d=\xb9\xa8\x11W\x8a\xc7\xd5\x32\xc2\xef\xc1\x83v\xf4s\xfb\xb2" +"\xb3.\xf6\x42\xb1\x9c\xde\xc1\xd6\xde\x83\x64\x37#\xe3\xc6\xdf\xc8\x7f\x97\xa7\x0" +"{`\x81\x89K\xbc\x45\xc9U\xb7\x0\x1e\xb3\x62\x11\xb2j\xd7\xa3\xd0tY\xcf\xb3?\x9cT" +"\xa4\n\x36\xc\xb8\x2\xfd ,\x8e\x93\xd4\xdb\x88\x8b\x32\\\xe2\x46\xd0-\x12 \xab\xf5" +"\\\xe6\x46\xdf\xb4_\x7\xcb\x84\x84\x6\xe4p6/\x80\xceL\x2\xd9\x8d\xd8\x45\x18\x98" +"ws'D\xcc\x16\xc7\xf5\x66\x9fw\xef\x9n\xa5Z\xff\x98\xaa\x10>\xea\xef\xb9qs\x1e\xbf" +"7\x82\xe6\xabr]N\x9e\x35\xb2\x96\x86\x89\xe8\x0|\x3\x8c\xf2[j\xe6\x94Q\xa4s\x1ey" +"\xac\"\xbd&\x8fV\x94*#>R\xd7\x18s\xe8>\x0\xa1\x87N\x4\xd3\xb2.r\xfb-\x6q\xaf\x81" +"\xc6\x98S\xc3\x89\xb5\x1fJ%ss\xae\xbfM\xe2\xda\x1eM\xa5\xe2\xca\x88\x94\x1f\x81\xea" +"\xe0\xe3-\x98 d\xc8\xaf\xddz\x9a`\rV\xd7\x36\x5\xb9\x46\xbb\xf7\xabV\x87\xc3\xe1\xe6" +"y.@\xf9*zFm\xe3R)@dSu\x5\xee\xf3\xf9\xc3\x8\xc9\xeb\x94Pm\xb0,\xfa\xe2\x89\xf1\x0" +"\x5\xa6\xe4--\xce\x43s\x1az\xe3hVK)\x83\x3\x8d\xadi\x87\xf6pb\x19\x90\x18\x39[\xc0" +"\xfc\xaf(z+\x4\xcq\xf7\x32_\xa1\xe9\xa9\x80\x89y\xb2\xfe\xf1\x90\x96\xb9\x8b\x8a" +"\nr\x8e\xb9\x8f+\xa3\xd3;I\xe3\xc2\xb\xe9\x92\x82,z\x1b\xcc\xa5\xb4\xe4\xd1\x9\x9d" +"Em\x8d}\x83\xc5~\xcb\xa0\xff!B\x80$\xf7W*\x14p1|\xb8\xcb\xc8g\x9a\x97N\x13\xd8\x8c" +"h\x13\x38\xc6\x8c\x9a\xc9U\x7f\x97xON\x1c\x8c.a\xf2`#\xac\xf4\x62\x32\xcb\xbd\xf3" +"\xc0\xbc\xc5X;\x93_\xe9\xfa\x9\xa5\x62\x12\x9a\x89'\xaes\x98\x8d\xb0\xf7\xe7\x33" +"\xc6V\x1c\xa7\xc9qm\xca\x9b\x88 \x8aqQf\xf2\xfa\xe6\xd5\xef\xf2\x89\xa9\xb2\xed\xce" +"\x81\x34\x3\xa4\x16\xf2\x43\xf1\xb5~\xed\xe7\xd8\x1e\x10\xc2\xda@e\xa3\x8+\xc9*8" +"\xb2\x45sh\xee\xc9\xc3\xc1r\x96\xcb\x9\x81\x9e\x9e\x64-se\xf9\xa6\xef\x43\xf\xc7" +"\xdd\x61\x1e\xa5\xfd\xbd\xed\xfarcJ\xb5\x99\xeb\x66j]\xc1x\xb0\xa0\xbd\x1f\xab\x4" +"'\x92\x11^\xf3\xb6\",\x12\x41\xdc\xe3l\xb3\x8bs\x8fh\xb1\xb3\xcbH\x9f\xed\x9eS1U" +"S\xf3\xc5\xc3\xbb\xce@E\x1eG\xb7\xeaS\xfd=:\xbal\xe0\xad\"]\xae\xe7\x34\xbd\xfa;" +"\xf1\xd8\x1c\x1b\x42\xc6\xd8V\xa0]\x9$\xe0?v'\xc5\xeb$\xd7\xfb\xea;\xd8W\x16 \x7f" +"\x96\x1bV\x80=\xbe\x4n\x81\xed_\xdc\x37\x8f\x9c\xa5,\x14\xfd\x85\x44\xca|S\x92\x1" +"\xbe\xe0\x64\x87\xeb\xdc\x30\xff;(\xe8&N\xc7\xfd]\xa7\xe0\x80\x65\xb0\xa9\x14sD\xce" +"(\xdaQ\x82\x33Xu\xe9\xf8\xb2\x34zD\xe3=\xfa\xa1g#*\\>i\xe8\xc5\xb5\x8b|r\x16Sx'\xc9" +"6\xf5t\x1b\x87\xfchu>\xb0\xd4\xa4\x66\x96\x1d\x0P\xdbY\xdf\x31\x95\xbd\x33y\xf5\x64" +"\x7f\x8c\xfe\xd3]\xa9R\xd7\xcf-\xed\x45\xeb\x44-\xbf\xe9\x92q\x1d\"\xeb\"\x8b\xdd" +"\xf3k\x8d}\xba'\x6-`\xd2'\x1e\xa8\xe8\x41/B\x90\xb5\x8f[\xe2o\xf0o\x5Y\x87/\x9d\xe4" +"\xde\xaa\xba\x1^\xabI\x4\xba\x1fP\x9fmQ|n\x89s\x12\xdd\xd5q\xd7i\xbcGO\xd3x\xaf\x43" +"`\xe8\xb1\xf1\x3\xaau\xf4\x87!\xb9\xe0\xbaX\x93\x19\xe1]t\xac\xb\x3\xd7\x30\xc3\xef" +"p\x8c|PG\x87H?\x13N\xa6)p\x97\xb4m&\x80\xff\x8a\xa5\xbz%Uc\xc8\x8dYK\x91/UtVJ\x13" +"qF6ty>H4\xaf\x11\xd1Ly\x91\xe7\xfd\xb3\xa6\xab\xf8R\x9e\x1aO\x10\xca\xe7\x9c`\xd3" +"t)W\x90\x93\xdb\xd0\x41\xec\xaf\x3\x82M\xf9\xc0\x7\xe9oEYZRK'\xef\x87t\xa8:\xee\xbd" +":q4\xab\x44\x35\xc8\x9\x44\xde\xff\\\x1c\xba\x92\x1b\n\x41\xb9\x65\x19hX\x1d\xa4" +"\x83K<\xemM\xe1<\x1ey/\xce\xed&\xa7*\xdcM\x9e\x39\x3\x66\x1d\x88\x3\xdd\xb5\x8e\xb2" +"\xb9)\xce\x31\xfc\x9fP\xa6\x94\x11k\x0\xac\x9f>\xefS\xff\xdb\x1a\xca\x33\x94\xbf" +"\x11\x16\x10\x38\xf3\x99\x17\xb0\"\x39Lu\xa0\xd4g\xd6K\x89\xa4NU\x5\xde\xd7\xd9\xc6" +"\xb8\xbak\xa0\x98\xf1@\xc9\xc0\xe\x9 \xe\xb4\x82\x83V\xa2\xd6\xbe\x9e\xc1\xd5RK\x9" +"\xc0m\x9co\xcb^(\x8\x5\n\x33\x9b^_\xd4\xddl 5\xa4\x8f\xe9gE \x90\x1e\xdc\xad\x10" +"\x7fg\xac\x8c\x8eP\x8e`\x3\x1\x19x\xd7~\xd2%\xf3\x61\xbc\xf\x86\xa9\x8b\x61 \xee" +"\xaf\xb7?sw\xdb\x1er\x13\xe0-\x12\xc3\x30\xf5I%\x11\xb4\xdd\xe0\x85X\xd7][\x8a\xa2" +"\xd5j1\x11\xdc\xcd%~\xe9n4F\xef\x1cv\xf0\x0\xc8\x91lL\xe2\x61\x42^\xd9\xd1[X\xce" +"\xd1(\xda\xa6\xc1\x30\x4\x66\xe7\xb1R\xbc\xfb^o\xaa\xb2Q\x9b\x8a\x98\xf2k)\xf9\x81" +"3\xaf\x88j\n\xa7\xe5\x86\xa0\x90\xbd\xa1\xdc\x61 \xdb\xb5\x64\x8\x85\xc6\x9\xa8\xbd" +"\xad\xee\xfe]\xe0\xda[u\xa8\xa2\x9e\x92Q^\x86\xe7\xe6k\xb2\x95\x81\xe5\xaf\xf8\xcb" +"eQ\xd8\xd1\x10=\xf6\rU\x8ey\x87\xe6\xf5\x61&\xa1=\xb2\xc9\xa0H\x86\xc6U\x6Nh\xa0" +"\xa2\r\x1b}\xe2M\xad\"\xbb\xfe\xe1\xb7\xc3\xc2\x8\xd4\xfdjX\xdex\xd6\xa0\xa6\x12" +"n\xfd\xee;\x1a\x97\x13\xde\xe9@i\xa9\xf0\xa2\xb3\x92\xa2\xf3\x91\xc4\xc7S'\x80;S" +"\xf2R\xcc\x9e\xf0\x32?\x84\x92\x9b\xa4qlP8V\x81\xff[N\xd5I)\x82\x15\x94\xf9\x2k|" +"\x12\x97\x94\x1b\x17\x8c?\x8apL\xe0\x97`S=\xbcl\xf4\xb1\x8a\xfb\xcb\xad\x3\x9e\xcb" +".\xbd\xc7\x83\x8a\x94\x10\xe7\xb2'\x92K\xedq#\x94\x46u\xa5\xdb\xca\x38\x8bq\xf\x8a" +"\xf6\x4\x8b\x3\xdf\xb7\x13\xf8\x81\xea\xf;\x19\x1a\\\xd9\x89\xea\x15\xb\x97\x90Y" +"\xc8\xaa\xde@8U\x81]\x8fy\x80\xce\x62\x88\xf4~\xaa\x37\xc1\x9}3\xf1\x37v\xf0\x87" +"y\x6\xd8-\xd7\xc0\xf2\x9d\x35\xbd\xae[\xb2Q\xb8\xa2\xd4\xb1\xdc\x97\xe2&" +"M\xce\x3^5\x9d\xfb\xad\xde\x84\xf7\x37\xeajY\xc2=\x1a\x64\xd9\x63\xe6\x35v\x92\x33" +"bOv\x82\xea\x34\x63kY\\\xcd\x6J\xaf\xf3\x88}\x91hgGW1\xbf\xcb\xf7\xf9m^^\x1f\xbe" +"j\xab\xf4T\xc2\xf5\x4\xeaN\x8e\xb3\x82\x91\x15`\x19R\x95\xc8w\x93\xd5\xf7s\x9a\xd7" +"\xecqv\xe1&A<\xd4\xd1\x5\x8e\xbd}n\xbe\xe1K\xb9J\x1e\xcf(\xb6\x86\x41\x1d\x91\xe0" +"ss\xe8\x91\xf7\x8cL\n\x5\xd2\xe8\xd9\n\x8a\xe2\x61O\x7f\xc2\x63\xa7\x62\xd0\xf4\x34" +"\x85G:T\xc3\x17&\xf8Tw\x1\xd4\xa3\x8d V^\xd1pxG\xae\xd9\xc8\x5x\xf\x6+\x84~f\x8e" +"\x15V\\\xba\x7\xa7+\xb\xa9\x9f\x3\xfbW\xd2o\xa2o\xf5y\xc3\xe\xed\n\xabo\xec\x1b]" +"\xbe\xa8\x1a\xa8\x8f\x16\xf0\xc9\xbe\x86\x95\x5\xbe\x18\xc1\xcbye}\x91\xd6pn*?\xb" +"\xe9\x92\x6U\xb9>\xbb\xae+M\xb]\xf6\xbe\x62,\x95\x1f,\xfa\x42\xae\xdb\xf7\xae\x64" +"\x9e!P\xfe\x87\xcd\xbf\\&\x85\xef\x36\x5\x10\x80\xbf\x39\xd8\x64W:E\xae&H\xad\x97" +"f+\x1fixp1\xb9\xbc\x43Q\x1f\xb8\x41U\xec\xdc=\x91\xe2G]\x7+\xdejR\x7\xac\xea\x1e" +"\r.\xcb\x1d\xa8\xa1\xbcK\xee\xc3\x35\xa5\xc7\x10)c\xe8K\x97\xbet\x1c\x44X\xac\xc3" +"\xd7*~S\xb1\xf0\x8c\x95_3\xed\xc3\xa0\xdc>s\x8'\xc\xf\x7f\xf8\x14\xb1\x11\x45\x99" +"\x85s\xcc" +"D\x7u1\x6T\xda\xf7\xf4\x1eV\xff\x45\xf8\x97\x1) \x19\xa9K\xf3\xe\xb2\xd6^\x14\xb1" +"\xa1\xd6\xbf\x89\xd4\xcc\x43\x18z\xda\xdf?n\x3\xa9\xe\xd0\x1e]\x87k\xd3\xaaV\xe5" +"\xee\x84\xdb\xaaM\xad\x98$\xde\x99\x84\xbd\x45\xaf\x96\xfb\x8aV\xc0\x10\xb3\xc3\xa3" +"\xc6\x13\x9dX\xe9\xd6\x9d\x91\x9\xdb\x18V\x1bU\xea\xd6\x45$\x97\x84\xb\x9a\xe9\xc" +"t\x9c\x15[c)qo\x1R\xa7\xadR\xdb\xd0\xb8\xa2[\x99\x95\xe1\x41\x66\x81\xf3\x8f\xdb" +"\xdf\xa4\x43\x87\x9b\\L%\xaa)\xe0\xdc\xc0}\xe8\xbb\x16\x1c\x36\xd7n\xf2\x86\xec\x88" +"\xd5|t\xbf\x44\xdb\xcbO\xef\xf7q\xd3\xbd\x82\xc8\xf4\xe2\x33\x35|H\xe5\x16\xef\xe3" +"\xdb\x9e`\xef\x16\x8e,E\xb5\x46Q\xdf\x9aZ\xcb_\x17\x90\xf7\x92\x9b\xcb\x16\xce^\x9f" +"jC\x91\x9a\xd2\x87\xdb\xc8\xe1-\x9f\x9e\x97\xe5\xdb\xaaY(y\x1aZ\x2\xd3\x9d%\x9f<" +"\xe2s\xa8p\x90jd<\xc1\x8d\x86\xe2?\x11]*5\xdei&\x5=\x8c\x84\xb9@\xb3\x62\xe7\xdb" +"\x18B\xb9P\xd9\xbb\x1c\xa2\x2\xf1[^Y\xe" +"\xe7U\x98\xfa\xe4=\\\xf1Terw\xb\xba\x9a\x63s\xf1\x0\xcd\xc6\x1d\xb4\xe5\xeb\xbe\n" +"\x93\xe0\xe5\x1c\x86\x0^3?i\x11\xb\x1c\x8eI/+\xf2R\xca\xdd[s\xe7\xd3\xeb\xb5>u\x93" +"S\xf1\xef<\x9b\x8b\x39\xc2\x30\xd1:\xb7\x15\x8a]\x92\xeeLE/\x81\xf6\xdf\xc1\x88\x3" +"(\n\xa0#\x83/\xd0\xdc\xb4\x82\xceZ\xf6\x15\xc9R\xbc?~X\xf6\x41}iw_\xc7\xc0\xd5\xb4" +"\x5\xaa\xc6\x32\x85w6\xac\xf3+.\xe0\xf2\xa2\xc0\xf3\xb3\xca\xd4\x83\xc6\x14P[\xe9" +"G\x6\x32/*(0\xfcZ\xb5\x92\x90}\x2\x91\xed\x18s7~zaX\x14\xc,\xdb\x1b\xe'\xee\xc9\xca" +"P\x17\x61\x2 \x9\x92\x30\x80\x45\xcc\xb5\xa1i\xb6\x1e\xa0Tgx\xb8\xd2\x80ss\x19\x4" +"g\x16`IE\xa2\x1f*\x1c\xb9\xe1^:]\xb3\x1e\xf\xb5\xa3\xb0\xaf\xdf\xdfo4$\xb7SmG?\x97" +"V\xca\x36\x94\xde\xe4\x30\x1f\xb1\xab\x1a\xe4q(\xf8\xd2\xb4\x61\xc0Q\xc1\xb9\x99" +"\xdb\xb0\x10\xe7\x8d\xd1:\xfc\xbb\xa6\xf7\xd5\"mT\x5'\xf1x\x81\xa1\x8fU\x1b>\xef" +"v\xa7\xe2\x8bO\xdd\x87\x93\x81\xa2!~\xf2\xff\x9f\x99\x82\xe9\xeap\xad \x3\xb8\x62" +"\xd7\xc3mW\xc5\xff\x9f\xbe\xaa\xb5`@\xfe\xe9s\xef\xc3\xb3M\x83\x19\x19`\x1\x1\x10" +"\xba\x10iL\x17\xb7\x63Z\xe0<\xc1\xcd\x8|\xb\x5R*zy\x1f\xc\xa3@\"\xa3\xf5\x86\xbS" +"m\x95Q\xbd\xfd\xbfV\n\x7\xf6:\xa4\xe6\x87@~^HXNh\x95\x91\xf1\xb5&q!>C\np\x8c\x6\xa3" +"M.\x1dQ\xcf\xa6\xb3(\xa1\"\x0|\x81\xb5\xeb&;\x96wF\x96\x1b\xcf\xc8w/\x85\x2\xdd\x95" +"\x89\x87$\xab\xf3i\xb0\x87\x7f\x33\x13\xa1g\xf3\xf7\x14\x2<\"\x9cWW\xd4\xd4o\xcd" +"\x9bJ\xfe\xcd\x9=\xca\xbeR\xb7\x81\x32\xce\x9a\xb6\"\\\x9a\x34LK\xf8\xd9o,P\xc4'" +",\xb9\xaa\r`o\x1;&B\xf8\xc8\x80\xe0\x8e\xa2\x82,\x8c\xf5\x9},\xdb\x64\x93/\xe1\x95" +"\xab\xd5\xfd\xf3m;\xe1#\xae\xdd\x8b\xa2\xf8*\x8a\x62\x8d\xbe>\xd6\x12\x9d\xc0\xfd" +"\xc4\xbeP\xd5WJ\xe4\xfe\xcc\x65\x6.p\xf4p;\xfe\xcb\x35\xea\xde\x19\x62\x94\xfe\x17" +">\xa5y8g\x9d\xbam\x15\x44\x8f\xf4L\r\x1a\x90; $9\xda\x93\xc0\xb0\xe6\x12\x11\x0h" +"\xf8\x7\x92\x19\xaa\x89\xf4\x35\xe4M\x4\x64\xf5H3\xbe\xb3\x38g\xb\xd8 \xd9\x41\xdf" +"K1\xf5\x1b\x89[\xed\xf8\x33\xf9\xc4<\xb7\x61m\xb8\xf\x98\x8c\xe7/\xd3\xc1,}I\xf7" +"@\xcf\x85\xb4vl\xe\xd3\x98\xeb\x83v\x95\xd1\x2\xde\xc1n$\xb7GZ\xf]\xde\x88\xfb\xf2" +"\xd6\xb9O\x12\x64\x17\xc8\x11\xe8\x36+\x9c\xccR\xd8\x89\x1c\x13\xc1\x9\x37\xaa\xcc" +"\"\x8d\x62\x1dG\x12\xcb\x9d\xe0\xba\xb6\xe\xde*\x97\xe9)+\xe0NB\xe6\xd3\x42U\x94" +"\xdfV\x93\x1a\x61\xe1\xf9\x61rj\xf6\xe6\x89\x1d\x63\xb2@\xe6\xe7\x9e[\xf3\xc\x5 " +"\x91\xd6\x81\xba\x11\x2@\x98t\xcf\xd8\xed\xc3\xee+\xe3\x31gn1\xac\x0\xf8\x7\x91\xd1" +"\x1\x9b\xb7\x89\xcaOY\x7\xf4\x82;\x0*\xf3X\x14H\xc3R\xbbg\xd8\xf\xdf\xfc\xd1\xc5" +"\xbe\xef`R30\xaa,\x4V\x0\x8f\x62\xde\xb5^i\xac/\x86\x36\x9f\xab\x1e\xcc\x90\xd2H" +"yT\xe6\x11\x17\xa9\r\x92i\xa6]\xfb\xdf)~\xbd)\xc3\xdd\x1f\x62u_\x8f(\x9c\x42\xa5" +"4\xf5\x96Ph_\x85v\xea/\xc5\xd2k\x99\xb8\xe3\xdc\xd3\xf1\xfe\xecs\x13\x10\x0\xf9\x9a" +"\xa9\x86\x8e\xa9\xba\xc0\xb5m\xae,\xf4m\xa6\xcc\x1d\x18\xc0\xab\x8dw\xbe\xcf\xf7" +"\xb8\x99\x92\x17\\\xba.\"w\x9c\x13\xdb\x9d\xf5?\xf5\xb1\xc8\xfe\x95\xe1\x64\x99}" +"\x94 ,7\x17^V,\x86\"\x98\x9b\x7\\\xdc\xde\x17\x34R\xc0\x64'CT\xd5\xdb\x8f}Zx\xd4" +"\x8a\xd4\xa1\x3\xb9\xe4u\x0\xd0\x8e\xdc|Q\xc1\xf3\xcf\xa7\xf4<6\x86\xa3\xc2J~\xb5" +"\x1\x8b\xf\x41\x99\x61VO\x87\xe2\x12\xce\n\x7\x41\xach\xd6\x82,z\xb9\xfdh\x85\xf5" +"\xd0\xb2\xac$\x9c\xb7\xf5\xe#S\xccK\nj$V/VO\xbb\xc7\x9\xc?\xdf\x12\x84\xab\xe\xc6" +"\x15\xe0\xb3\xfb\xe1\x32\xf3\x15p\xc8\xa6\\\x81O\x93\x91\n\xa4\xbb\x80\xd5\x16\xcb" +"p\xd2\xe1\xd1\x19i#\x8eo\x2-b\x8f\xa2\xf3:\n\x15\xc4\xef\xc\xe7\xf7S\xdf\x80\xa8" +"\xad\x94\x94\x88Z\x1b\x9a\xda\xe6\xc3\x8a\xc9\xdao\xb0\xa6\x16\x96\xad:P&0%*\xd7" +"\xb5t\xc8\x41\x11}4\xbd \xbd\x65\x81!}\x97{5\xf5\xd0N\x2\xb9\x33\xe1\xe8O\\\x9\xf" +"f\x15\xafHMc&](Q{\xa7K\xea\x88v\xfd\xa3\x32\xa8J\xea\x12\xe6\xcd\x82\xb9J\xe1\nw" +"\x8c\xd3\xa2\x16\xab\xc0\x84\x95\xef\x31\x9f\x6\xado\xf8\xad\xd2\x37\xd9\x11\xf8" +"F\xa5\x14\xfd\xbf\xaa\x8a\x1e\xc8\xe0\xaa\x9f\x80\xf1\x1f\x1c\xe6\x15Q\x9aK\x4O=" +"\x1c\xf1\xa1}\x7f=!t\"*_\xfa\x8b\x39\xf2\x1\x97\xffl\xaf%\xbj\xdb\xdb\xf5\x19\x1c" +"RPp\xc8\xd3\x82 \xfbP\x1c\"?I=\x80\xf4\x98\x62\x1a\x2\xeb\xcc\xd6\xef\xe9\x14\xf1" +"k*C]`\xc0\xa1\xa4S\xe2\x88\xa5=\x81\x8f\xe1\xed\xca}U\xa2j\x1\x7f.\xe4z\x81n\x90" +"\xd6\xc3\xfc\xdf\x0\x35\xee\xa3\x7\xdf\xb0m+\xcc\xe4\x34X\xa6sT\xa4\xed\xb6\xe5\xc5" +"r3\xdeO\xbe\x41\xed\x7\xee^\xc7z]\xfa\xdc@2\x13\x8d\xa9\xe1\xb7\x44(\xca\xd0*\x91" +">@\x15/\x80\x63\xa7t\xd4\xfd\xd4\x7\xeK\x8al\x8\x9f\x19\x9a\xf7\xc5)\xc2w\xe9\x2" +"\x19]\xb7`\xd8\x1e\xc6U\xdf\xfd\x1b\xb2\x83\xf3\xc5\xaa\x8b\xb5\x8f$v\xbcy{(\x92" +"\xe9\x44\x14\xab\xbe\x96\xd4\xdb\x93\xe2\x80\xcf}\xe2>\xb8R\xe7\xca\x95Mf\x82\xa6" +"\xf1\xa4\xbe\x5\x7\x88L*\x5\xac\x86=+\xa7?;Tf\x83\x97\xb6\xc5M\xc2\xf4\x18\x31\x30" +"\xab\x41Hu\xf3\xc3\xd8y+\xf7\xe5\xfcM\"\x8d\xf8wH\xbf\xb\x14\x17\x8d\xb7\xe3\xff" +"\xb7\x89\x1dp\n\x1e\x95 \xd7x\xb0\x95\xda\x80\xe4\x80\x1fSD-\\\x7>\xde\xb7\x6\xa5" +"\xdb\x84\x66\xff\xe7\xe7\x1\xab\xa9\xc3\x64\xa3qi\xf5\x85\xc8\x83\xa8\x37\x13\xa6" +"\x1c\x9c;\xd9\x33jf~\xa4\xe3\xdb_M\xf6\xbcjU+\xe8\xd3\xef\x9\x36\x39\xecg\xe5\xff" +"q\x89Y\xf9\x90$w\xf5\xaa\x89N\xd2\xd1\xcd\x31.\xd8.\xe4\x17\xd9\\I\xc9\x66q\xb2?" +"\xb0\xe1s\x8e\x89*\xdf\xfe\x62\xec\x1c=L\xbe\xb6\xcd\x8\x9c\x98\xde\x8d$}\xf7\xed" +"\x17\xdf\xa2\x95\x9d\x36\x62\xf1\x5\xe8\x38mu\xad\x30\x84\x80SiY\xf8\xe6\xcf\x8f" +",i7\xb0\x9f.\x81\x37\xc8\x11\x32}k\x16Z\xbe\x46\xc5\x18\x34\xa9U\xfe\x83\x6\xd1\x0" +"3\xf8\xc2\xa3\x46g\xf1:\x8b\xa8\x31\xcc\xf5,z!\xc1=\xb9/>w\xb5\\\xe2\x91\xf6\x19" +"\xb\xb1\xd1\x94\xa3?\xd7\x31Q\xc3\xf6\x1a\xbd-\x8a\xc\x9b\xde\x90\xe7\x96\xbd\x99" +"m-\x0\x94\xdb+\xe9\x86W\xe7Q\xbd\xee\xfe\x8a\x43\xee\x45\x1\xb9\x8f\xc\xc6\xd8\x8" +"\x5\x18\x94\x38\x87*`\x4z\x8c\xaa\x90\x39\x89\x35\x30\xa3\xe5\xf6\xbdu\xbb\x46k%" +"\x16W7\xc9\x39\xaf\xf3\xeaY\xbf\xf4\xa7\xdb\x9\xc2\xa5\xb3k\x8a\x1f\xcl^Xp\xc7\xc9" +"A%\x89\x87~\xf4O\x84(K\x8aS\xb5\xb7\x43\x15\xcer\xd2\xea\xfc\x63\x1b\xc4\xcc.[q\xdc" +"\x95\x8bZcP\xcb_a\\:E\x2\xe9sb.>\x18\x19;iW-\xef\x1d\x2\x30:7^\xd6\n\xba\x1b\xc8" +"\xa1y\xfa\xa0\xf2!\xa4\x90x\xfe\x15\xae\x13\x38\x35\x85\xfb\x45\xffM_;\xb3\xd0\xf6" +"\xd8\xbf\x62\xe9\xbdk\xab<\x9a}8\xc8\xa5\xab\xb\xe5z\xcd\xad\xcb\xd0+\x1d\xc7\x95" +"-s\xae\xf7\x2\xd4\x6\xf6'\x19\x92+\xea\x96\xb8\xfd\xc9\xb8yp\x8eyH\x91\xc7\xa0\xa4" +"/,\xcdh\x12\xc3\xf4\xdb\x3\xbQx\xe3\xa6'\xc3\xe7v!\xd3\x12\xceN\xbe\x81\\\xd3\x87" +"r\x8\xfa\xd9'a\xa5\x39kg\xe8\x35\"&\x9\xf8#r\x8b\x1c\x98xW\xcf\xea\xae!\xf2\xad^" +"\xa9\xd8\x41!)\x93P\x80\x91\xa4\xa2\xc2h\xbf\x1d\x8d\xa1\xc6P\xf6\xab\x93\x99^|\x13" +"\xa3\xf8M\xb5WH\xc6&\xfd\x9\xc0\xda\x1e\x33%\xcc\xb0\xbf\x9\x1e\x99\x62\x45\xbfQ" +"\xebHf\x80\x16+\xae\x63\xb6Qk\x9fx\x9d\xaf\x37\xefSo\xcf\x96\\\x39z\xf1\xb7\xf9" +"\x8a\xf8\x64\xb3\x1\xf3\xf4@\xb7\xac\xf7\x4\xb5\x95@E6x\xfdl\x15\x4Q\x94\x81\x89" +"8\x12>/G\xb2\x65\xecO\\\xf2\x17-9EC\xd8L\xd4(\x11\x65\xcb\xeb\x11\x34\x9b\x31Z\x85" +"\xde\xb2\xd1i\x95\x7\xb0\xc8\xc1\x10\xc7&b\xea)Y\xc4\x96/\xf0\x93\xaa^\xe6\xf2\x1f" +"\x89\xb3\xcc\xb0\x14\x9c\xef\xef\x18U\xb9\xa4\x8d(\xbb\x36\x34\x16\xc0\x15\xa1\xf4" +"\xea\x19u\xc3\xd8\x80\x7f\x61lX\x17\xc8\x16%\x36\x17oFJ\x19\x8e\xbe\xe6\xc9p)\xf1" +"_ABu\xa3\x9b\x82\x19\x12\x8b\x8c\x85\x42\xe9H5P\x7f\xc2\xd3\x90\x8b\xb0\xec\x37W" +"q(\xb\x9e\xbe\x87\xe8'\x81\x14\x18\xef\x93\xe5.\xf7\x5\x46\x89\x1b\xfc\xf\xb3Ii\xfd" +"}\xeaL\xe7RM\x9e\xef\xf2\xb4k\xed\x90\x8c\xf\xb2\xe0.\xfc\x1d\x16$d.\xae\xa1\xca" +"\xc1\xebHA\xe0 S.\x88\xe5\x9a\xc8\x90\xe6\xc3\xf4G4\xb9\x97\"\xe9\x81\x64\x2\xd1" +"\xd0\xfd\xf8\x4\\T\x81\xec\x5Q\x0\x83n\xbf\xb4\x8e\x9f\xbc\x39!C\x3,\x90\x98S\xc9" +"\xba\x38\xa1\x93\x63\x14\x1b\xed\x9\xda\xf0/\xdfN|\xc9\x80\x83!\xcd\x7\x8\xa1\xb4" +"Rp\xbf\xfc\xc3\xa0\xd7\xc2\x7f~x\x17\x13\xd5\xde\xce\x82\xc7.\xd3\x3\x86\xb0-\x14" +"WZ\x1a\x64GT~\xcc\x7f\xaa\xc1\xbd\xff\x33,\x92\x98GX\xe2\x42%l\x5\x46V\xcd\xd2\xc4" +"]F\xe6z\xeco\x83\x9f\x95\xd7N\"*n\xae\x12\xef\xaa\xb7#\xa7\xc8\x16\xd4\xe4-N\xd2" +"rZyGC\xf6u\x97\xf3\xdb\x8c\xcd\xde\x45\xba\xab\xc2W&\xb8Q\xe0.V4\x1e\xbei\xe4\xd9" +"\x1f*#5\x83\xec\x81o\x18\xa1\xde\xcb\xdaJ\xb6\x93 \xf5^s\x6\x17\x36\xf\xcf\xb8\xac" +"-+svu\xb4\x6)\x7f\x7f\x8cK\xc3p\xcb\x8L\"\xbf\xec_\xef\x2\xe9\xab)\x2\x82\xf7\xb1" +"S\xf0\xa4\xb1\xaeV\x9f\x1eR7\x1a\x43\x46\xa7H\xdd\xe0\x93\x36\xca\xd1\xf5\x33\x7f" +"\xc3\xd7\xcf\x6w\x9\x1eYH\n\xb1P!\xe0#\xe3V\xb0\xe1\xba\xc6\xc6G\x1a\xd5\x36%\xc7" +"\x2\x6\xc3\x38SoM\r@s:\xb2\x17\xe2)\x7f\x86\xb5\x93q|aE\x8bl\x93\xa1`'\xcc\x88j\x8c" +"\xfd\xc0\x1e\xf1\x9c\x34\xc9\xa6\x8\xb9Z\x84\xb6\xa2\xe3\x14T\xbc\x3\xc1\xf\xa5\\" +"\xdc\xb7\xb1\xeb}\xc1j\xc1\xe9\x39\x81\xa4m\xec\xd7\xe7\xf0\x6\x38\xdc\xacV\x87\x44" +"i\xa2\xd9\xb4\\\xbc\x81\x39\x87'\xe4\xed=\xb5\xdb\x31\x96_5\x8d\x81y\xcb\xf9\x34" +"\xee,Me,\x9c\xc2\x11\x80\x7f\x7\xc\x80\xe3\xa8\"+L1\xff\xec\x8d\xfb\x9e\xe0z\x94" +"\xc9sF\"T\xbc\x1b\x15\x81\x90>\xe6\xf9\xad\x91RJxq)\xa6?\xce\x4\x8b\x45\xbb\xe6\x85" +"X&u\xcXkk#\xb8\x5\xfe\xc3\xe7\xaa\xac\x7\x95v\x94\x9a\x6\xf4\"\xfc,\x82k\xdbx\xae" +"\x96\x13^\x9e, \xc2\xb2\xef\xf6\x17\x1d\x61\xb.\xb8\x63Z\xca\xb7\xc5\xc5\xed\x9c" +"\x9f\xfc&\xcdT\xd2\xfdL\xb9\xe4)N\x17\x8c\xec\xa1\xe1l\xc8\xe3\xfc\x6Q\x8b\xd1oM" +"c\xae+CWSS\x88\x34\xcd\xd9\xd8\xae}\xe6$\x0l\xe6\x88\x93\x80\x31\x33\x63Q\xa6W\x8c" +"0L.T\x80\xa3\xfc\xb4:\x8b\xeeIS\xda\xbc\x30U\x8bw\x90\xc6\xe7\xa6\xf0\xf9\xff\xa5" +"W\xc5\x4\x17@z\xc6\xa0\xdd\xa1\xe7\x36\xf7\x7\xb\xc8\x94U\xfc)4S=\xb0\x4\xaa\x90" +"psL\x8c&\x8\xa0s0\xe4!\xa0\"\r\xab\x99\xf8\xa7t\x89\x13/d\x13\xad\xb9\xea\x63\x7f" +";u\x94\x80P\xe6g'jU\xbe\xb0\x9d\x41S\xdc\x12k\xbd\xbe\r\xb9)\x8a\xc7\x99\xa9\x43" +"\xd7*\xfbv\x9b\xfa\x14\x88\xd3\x11\xbe\xb8j\x90~\xc9\x38Z\xaeOw\x83]\xff\xe4\x38" +"\x9e=\x9a\xde\xd1\xb0\x8b\xbc+\x1e\xd6\x8K=\x10t\xa3&\xcc\xbf\x38\xe0k\xd0&\x91\x91" +"\x7\xbd\x3\xbd\x9c\x30G\r\xb7yP\x8d\xfe\r\xc8-\xff\xd2\xde\xd7I\xe8r\xeb~\xb9\xdd" +"\xf5\x9\xd5\x31\x98\x65\x7\r\xd7hF\xc3NNCi\x1a\xf4)\xaa@\xdbK\xf2\xcd\xd5\xb'U\x89" +"\x98}\x80\x81\xf7\xc5\xa0\x46\x1a\xa5\xd1\x45Zf\x1x\xa9J\xb\xa0\xdc\xb6\x9c<\xeb" +"\xf5\xee\x4&\xd6SOo\x91\x9d\x97\x95\xadj\xe\x1a\x1f\x45*\xf3\xb4\xcb.\xa5M`\x11\xfa" +"\x80\x91\x32\x42\x1d\x11\x1e\xfcQ\x17N\":\xb6\xa1\x35\x96\x41\x1a\x97#\x7\x92\x31" +"\xb0P\xce\xda\xe7\x65\x9c\xf1h\xc3\x9a\xea\x9ci\x2\xc2\xcd\x37\xd2T\x92\xce\xe0\x0" +"\x96\xed\xd6=\xc7\x64;f\x7f\xdf\xde[Y]\xc5O\nr\xc2\x65\xe\x1e\x46\x99\x5\x84\xc7" +"\x8a\\\xef\x9b\xfc<_\x88\xcf\xb0\xc4\x9c\xd6\xca\xdd\x9d\xbagQw\xd6\x1\x92}u\xc6" +"\x90+U\xaa\xed\xe\x9e<\xb5*W|\x88}X\x1b<\xe6 \x1a\x1cw\xc9Tl\xeeZ\x13\xb9)c3\x7f" +"\x17\x7\xe+\xf9\xf5\xc5\xe8k\x84\"Xc\x87\x46\x18\xaaP\xf4\xde\x85]\xe5g\xbf*\xb7" +"\x16\x39\x44\xed\x43\xdb\xd7\xf4\xbb\xc0\xe1\x62\x31\x80|C\xdc\xb4{.\xb6\x94\xe6" +"\xfe\xdc\xfb\xe2\x61\x94\xd2\xd9\x94:\x1b\xfe\x32\xaa\x1eS\x5\xf5\xe3\x41\xea\x2" +"\x1f\x91S!b\x97\x8d\xd1\xb8\xc5)Z^uQ\xe2\xde\xe4m\xc2\x34|k2\x19z\xf4\x30\xaf;\xb6" +"v\xa5;\xca\x9b\xd1\xea\x88g\x83w\xdc\n\x9a\x86\xe2\xabm\xe2\x9e>&\x1b\xfdUs\xc6o" +"\xb5h{\xa9\xc0TM\x89Ju\x98\x66\xb0\x66\xe1\xdb\\\x66\xe6\n\xe0q\xcc:\x1cJ\xe4\x1" +"\x97\xcd\xe4\xecr?{\x80\x13v\x19\xde\xdc\x99\xafW\xa5I}n\x3\xc1\xc9\xe6r\xe7OH\xf6" +"\xc2\x13\xa3\xcf\xac\xf2i\x9c\xaer4ZQ\xc7\x1c\x1di4\x8d\xe5\xbc_D>\xc0\xea\xde\x1e" +"v\xa8\xa3\x30\x66\x92,\xf3\x86\x9e<\x1d&\xa3\xb3NT\r\xc0\x8e\xa4\xda-\xde>\xeb\x17" +"\xc1g\x90\xdaN\xf1\xa3\xa7mq\xd3Kx\x8a\x87\x83\x8b\xf2\xa5\xa3\xdb\x81v\xf9\xc0\x97" +"\xd2\x32\x0P\xa7\x9e\xa6\xc4\xa9I&\xda\x11\xab\xcd\xcd&\xdb\xa0\x9f\xd3?0\xae\xed" +"\x97~\x8bZ\xd9(\xf3\x96\x7f`v(\x85\x94)\xdc\xb4\xec\xec}\xa3\x41\x1b\xe3Z\x3\x85" +"\x10\x17\xb5\x35\x98V2c\x9d\x37\x8c\xdc\xd1;\x0\xfeSzI\xfd\x9e\xb6\xdf\x1e:\xaf\\" +"A\xeb\xe3W!\xfah3\xc2\xfe\x8\xaa<\xff\xc3G~\x7f\xce\xbf\x9e\xf9\xf4\xda\xe6/\xf7" +"\x8f\x31\x94\x81\xc3\xf1\xe7)\x99\xc8\xa4\x93\xecn\xe2\x95\x31kX\xa5\xcd\x62\xff" +"\xab\x62\xc8\x96\xe5!\xb6x4/\x4\xbc\xe1\x61<\xf7\xf6w\x8c\xbfR'\xba PE\x0\xd7\x43" +"'\x7q\x95:\xcb\xd5\xc6Xd2\xf3\xfal\x9\x87\xba\xd3;\x88\xbcl\x15\xd2\x9cK<\xc5J\x9d" +"\xd7*#W\xaa[\xae\xb2\xcb\x5|\xdc\xe7-\xc8\xc\xc9\x8c\x62\xb1j\xc5\xbLjvA7\x9bvl\xdd" +"\xf9\x90\xdb\xb2\xfc\x7f\x9c\xdb\xbau[n=\xea\x43\x8f\xd6i\x9c\x30\xa9\x9a\x8b\x31" +"x\xe6\xd6\x13\xaa\x93\x81 \x83^Qt1\xd2\x81\x14\xbc\xa1\xabt\\\x11\xfenR\xad\xb8+" +"\x9d=S\xa3;\xccIt\xc\x93\x1}\x95\x31\xec\xf4\x38\x31\x35\x9c\\\x93\xcb\xe\x92m\xb4" +"@\xb1\x39\xe3\x12\\\xc2\xe0i\xb1\xcfm\x96\xefh@\x7f\x32\xdbQrB\xc3\xae\xb\xc6r>V" +"\xb\xf\x45\xfc\x7f\x87\xa5\xe4N\x17Q\xc8\xb7\xf9\xf6i\xc2J\xd5\xcf\x16\xf8O\xb0;" +"\xa1!\xb8k\x6\x94#M\x8f,\x9c\x94ri\xaf\x96\xfc\xa0\x8ax\xf7\x36\xe4\xe0J\xce\xa4" +"L[\xaa\xfd\xe3`\xfc\xd8\xbajYrL\xa8\x61`\xa5R\x7f\xd5\x64\x46\x81#\xd3\x2\xdb\x45" +"\x17<\x1b!k\x1\xdc[m4\x15\xb1?\xbd\xbb\xd3\x12\x1aT\x93\x37K3W\xef\xb1\x31\xca\xbf" +"\xe5\x8z\xa1\xd2\xc7G+\x3w\x6k62\xc8 s\xc6\xa8\x46(\\\xc9S\xa8\xf2\x8e\x13\x1c\xf5" +"\x87\xb3R\x17\xeeI\x8d\x9a\x1d\xb5{\x6<\xe0h\xda\xf5]\x8c\xc1w\x1c\xc\x30\x99\x9c" +"\xa4\xfd\xc5\xd6{\xe4\xe7\xe6\x94\x18\xf6\x33K\xc6\x14\x90\x0\x82\x1b\x89\xa7\x43" +"|\xcd\xf9\xa6\xa0\xedp-Yh\xf1\xe0O~O\xe9\xfe\xc9\xd1\xe9\x94\x88\\\xb6$\x3[\xbcT" +"&\xcb\x8e\xdf\x4V\x82\x8f\x8e\xeeu\xbeI\x1b\x45\xfa\xc1\x92\xa4\x5\xeb\xa2\\\xaa" +"OLf\xc0\xdc#M{Av(\xdaRv\xc0\x82`\xbeQ+$2%l@\x1a\x66\xe3\xb5\x83\xe6\x9d#\xe9\xfd" +"'\x8c\xd5\xf2\x17\x85\x44\xd0T\x16\xb9\xb4\xf6\x1a\x88\xa4r\x8a\xf2\xce\xed\x7\xc0" +"\x8e \x7f\x31\xd6\x44\xe8\xe3\xba\x1eN/\x9d\x8e\x30\x93k\xcb\x9cj\xebT\xe3}\xb4k" +"\xd6O.\xcc\x10!3m\x5\x64\xdf\xf\x18\xe5\xa6\xb6\xbaG\x2\x33\xd8\xd4\x1f\xdd\x9d\x10" +"ypn\xa6\x85\xb6\xd8\xa7@W\xb\xfbx\xe3\x98K\xb1U\xc3\x15\\i\xbc\xcc\xb4\x1c\xb5\x19" +"u\xee\xa1\xc1\xb4)L\xb5\x46\xcf\xb0=\xc3\x1b\xf8n\xc3\xbc\xb1\x97~\x8f\x94\xa7q\xca" +"\xb0\x9d\xe1*\x82\xf1\xd6\xc7\x91\xfax\x0\xe5\xa2\x1d\xf8\x1c\x9c\x8f\xcd\xa7\x86" +"\"\xab\xe7[T\xae\xeatz\xa4\xf2mV2\x0\x99.3r1\xa4\x30\x13|r\n\x17\xd4O:\xd6\xcf\xfe" +"c\xb2\xde\x12\xd3\x18K\xd3\xe1Q\xf9Uxk\x8d\xdc\xcc\xb2\x90\xc4'\x18\xf3\xa2\x19\x17" +"Y\xdfv7\x1c/\xc1wTJlB\\\xab\x14\xaa\xab\x31\x62\x8a\x9c\xf9\xd7\x1bRW\xaf\xf0\xd5" +"\x98\x43\x98\x9c\xf0\xd7G7Z&\xdc\x9e\xd2\x9b\x66\xac!G\xda\x1h0lH\xc2HLp\xca\x92" +"\xf3<\xc\x13\x8f\x92\xf2v\xf5\xea\xf5\xea\x30\x82\xa8\xa1\xcb\x12\xdb\x66\x16\x33" +"\xc2\xf7\x1e;i\x91\x8fP\x90`\xac\x94\x9f\xcdR\xc3\x64\x98\xa2\xab\xb7}\x13\x9d\xf1" +"\xeb\x33\xe3\xb8\x46\xa7\xc1\xbb\xdc\xef]\xee\xcaN\xf0\xad%\xc\xea\x9c'Q\xe1>\xf7" +"h\x1e\x8f\xae\x4\x91\xcf\xa6\xc1\x44\xdb\xac\x1f\xc3\x9d\x39\xe7n\xb1->\xe9\xca\x15" +"\x9a\xa7}'\x94\xf0\xc4\x33\x34[\x13[\xa6\x32\xf5\x44\x8+\xbd\xc9G\x1e\x9f\xa3\xae" +"\xd3\xa7\xd4\x65\xabqX\xe8\xac\x97\xf6\x8b\x1f\xbc\x8d\x36\x8e#PE\xc1\x8e\xfc\xca" +"\xde\xe9\x87x\xd8\x94\xd9\x63\x1\xf9\x3(\xbb\xf2\xb9R5w\x8ar\x91N\xb3p~\xa7\x82\x94\xb3" +"\xa3\xbcJ\xcb\x19\xfe\x87\xc7*\xa1\xd9\x82\xe4\xb8\"\xf0{\x11\\\xad\xf4\xd3\xe7\xee" +"=\x1b\xa7\x8\x65;\xeco\n5*\xc\x33%.\xd0\x63\xert\x96\x18\x96\xd4\x61\xee\x8b\xf5" +"#\xd5\x91\x1b\xac\x1c\x8a\xc7\x63\xe5\xfb\x11\xfd\xd2\x17N\x1f\x12\x96u\x96\x9c\x19" +"Tv\xc7\xa5\xe1\x8a\x81\xbf\x9a\x11\xed\x9f#6\xd5\x30\x1e;\xd3!t\xed\\\x93>\x8c\x85" +"\xd6'.\xa2\x18R\xa6\xf7\xe2\xaa\xb1t\xe0\x96_s\xe0\xef\x89\xe9\x6\xba\xfb\x18\x1d" +"\xbc\xf8\xb1\xf5\xaa\xc\x12\xd1,bru<\x1j\xfe\xc2\xec\x9f\x95\x41\xb8uxt\xd6\xf2\xe0" +"a\xab\xbe\x8b)(\x16w$c\x5\xb3\xc4\x1e\x90\x41\x84&\xc5u\xba\xa2\x16\xce\xe3\xc5\xec" +")\xb2\xfd\xee\x1cw\xc1O\xdf\x94\x7\x92\xf4\x8aV\xae\x80\xaa\x33\xe3p\xb0\x37\xcb" +"(\xa7\x37?\x88 \"\xaf\x37\x8f&\xb6\x0j\x4\x9f\xd3\xb3Pt\xa8\x65\xc9}\x15\x33R\xac" +"\xc1V\x99,\x0\xde&\xad!\xc9\x82\xc7\x1f\xe\xdc\xfe\xb6\x15\x93\xbb@\xfa_,\xeb\xf2" +"\xe5\x62\xec\x9f\x65o\x12\xf3\xe8\xf2}\xaa\x9cu\xdb\xf" +"\xa9\x46\xfd\xe\x1a\x98+\xb5\x8e\x4\xb\xfc\nI\xa4\xad\x8c\xd6hI?\xcbW<\x84\x9e\xc5" +"G@I\xa6\x93\xcb\xeb\xd4\xd7\x9a\xc7QPG\xcc\x34z\x9aup\xc9\x8\x61\xf3\xec\xfbW\xb9" +"\xf5:\xb9\xc0\xd6\xb0\\\x8cW\n\x8f<\x4\xd5\x85U\xa4U$\xc9\x8f\xf0\x91\xb8\xf8\xa4" +"\"\xf2\xe0\xe9\xe5\xa7\xb7\xffi\xf1\xce\xfc\x13\xe4/\x1c\xa2v\xbc\xd5\x84Qm&k\xa6" +"\x83\x8d^\x9c\xa9\xe9\x85OP\xc7\xd9,\xae\xd6\x1a\xac\xafu\x8a|{\xe5\x9c;\xaa\x82" +"\xbf\x32\xb6\x91\xac\xa3\xe8\xeb\x17\x1e\x8\xad\"\xc3\x9f\xbeXjT\xe6\xe4\xde,\xd8" +"k1\x13\x85\x46\xbb\x8d\xa5\x83K,nH8Tz\x1bg\xe6Q\x96NC\x98\x8c\x80\x36\x93\x10\x88" +"\x90K\xbbX\x9c\xa9\x1\xe7\xeb\xbc\x9L\r\xa8\x1e\x9\x19\x15\xd9\xe4h(\xad\x85\x96" +"\xfd\xf\xca\x39\xff\x12\xa6\xc2z5\x93\x37\xf9s\x80\x9e\x81\xb2\xe9\xe3\xd4;1F\xf2" +"Qfg\xe6\x7\xff\xeb\x9a\xc8\xf\xc9Z{}M\xedU\x1f\xee\xf\x35\x61\xc7\r\xb2\xd6\x9a\xba" +"\x96g>9\xe3\x39\x7f\x1c?\x8f\xe5\xf4\x8b\xab\x8a\xd6\xe0\xed\x89\x1\xf9\xfl\xff$" +"\xe8\xc\xb5\xdc\xacI\x85\x6\xc4\xd0\x10\x33\xe4\x97\xc1$\x1e\x41;\x2\"'\xa3&M\xa6" +"\x8b\xc3\xf9\x1b\x35x\x1f\xa2\xd0\x18G\\\x19\x9f\x43\xcb\xa7\xd3\xa0\xd5i{E2\x1b" +"\xad,9K q6\xe1\xe1kAyIu\xe8\x90>\xf2\xb2\xe1\xc3?\x87\xcfr\xc3%\xc1\x1e\xc0\xb9/" +"\xd3\x89\n\xcd\xf6\xbR\x1d\xa3%\x96v;\xdf\xcd\xca\x83z\xdco&\xf1)\xb2<\xa3/\x9c\xd3" +"\x9b\x33\xe6\x45v\x97\r\xf3\xc0[\x8d\xcaK\xfe/\x17\xe6\xc5g\x8b\x84\xd6\x94\x94\xf1" +"\xdb\xa9\xfe\x4\x46\xaej\xfe\xaa\x1f\xf2\x45\xc0y\x16\xc7\xb7V\x9e\x62g\xc4+E\x94" +"5\xa1\xd1\x16\xce\xc6\x65\xb3\x11\xe4\x4\x17\x17t\xc0\xac\xc8\xdd\xe9k\r\x91g\xc8" +"\xcc}\x99\xc4$\x5Y-t\\D(uU\x0\xebG\x19\x34\r/\xc6\xbc![g\x82?i\xfa\x94\x9c\x8\xb5" +"\xec\x98]z\xa8|\x9a\xc1\xf9\xbc\xc8\x99Ll\xbc\xe6\x2{}\x1e\xc\"\xa8:]\xe6\x1d\xba" +"\x5\xd4\xafh\x84\xc9_F\xba\x7f%>\xb#7\xe3\x12\x91n\x16<\xaf\x9d\xb2\xecV\xc5\x42" +"Y\x90\xfes\xeeS\xe4+;\xcc\xa1\xcf\x64/\x2\xb0\xc5\xab\xd5)\xb5h\xe9\xad\xff\x86[" +"\x9d\xc1\x90$\n\xd7\x8a\xd2&\xed\x88K\xed<([L\xb0\xe3\x92\x9e\x80\\g\xf1\x31\x8d" +"\x18\x65\x4\xd9 \x85vKp\xdej\xb5\xabi\x90\xf1\x81\xbd\xa5\xf\xc3\x12\x62\x34\x8d" +"\x98\xe\xc7\x66\x8\xcf\x8\x17l%\x2\xe0\x65\xac-\x8e\xa5\xcf\x9e-D\xe2\xb7\n}\xdc" +"{\x92 G\xc4q\xdf\x8a\xb \x87\xd1\x10k[\xd8\xa8\x30\xec\xeS\"<\xe3\xc9n\xf5nUA\x19" +"\x11g\x86\xe\xeaX\xd6\x96\xec\x35~\xc5W\x99\x43\x8c\x90\x15k\xbf+\x13\xa0\xd5\xc9" +"\xee\x93\"wFeN\xd7>\xa5\xb9\xca\xb6\x1d\xac[\xc6\x90\xf8\x9c\x87\xfe\xca\xf9\xad" +"\x3\xbd\x39\xe4\x38\xf4;\x81\xd3\x9e\x7\xe0\x42/\x94\xe8\xb0\x96\xab\x38\xc8\x8b" +"\xc2\xe1\xa0\x43\x81\x1d\x81\x41\xc1\xa3]\xd3\xa6\xdb\xe4\x16 \xe8<\x8e\xd3\xa3y" +"\xcd\x80\xd4\xf9\xbc\x30\x41\xbb\x44\xb9\x33\xda\xca|]D'\xae\x94\xa1v\x82\x9f$\xb5" +"\x96\x8bq41\xcb\x8b\xd9\xf5\x30\x80\x83,kxL\xea\x9bQV\x87\xf1!\x98>\xb9\xd9\xc9\xce" +"\x8b\xd4\xfa;\xecH\xaf\xe6Nd;{\xd8m\x83\x83\xd0u!\xfe]\x9\x13\x92\xbe\x12L\xcc\x91" +"\x11\x36\x4\x38$\xb6\x86\x98\x8e|\x83\xae\xbf@m-\xa8\x8f\xd9R\xd0\xfa\x93'\xf4\xad" +"\x4\xc5_\xed\xbf\xbf\xa7n\xca\xe8\xa1v\xc5\x16G\x9a\xe1\x46q%\xb7\xeb<\x9e|[\x10" +";\xc0\xc4p\x94\x63\x46\xdf'\x1f\x8e\xe1\x9d\xf7\xe3\xfftx\xc3^\xe0Y)\x7fK\xf2\x1a" +"\\{\x95\x99;\xe6 .\x89wv\x95*~\xd0\x61:\\\xac\xaf\xa7\x31\xff\xc6\x33\xca\xb6)c\x15" +"\xe\x86\xed\xacy`&\xce\x2\xeb#[\x9fzT\xe0\xb0\xc5(\x15g\x13\x8a\x61+\xaf\xe4\x9\xa8" +"\x18\xc2\x16\xda\x8e\xac^\xdf\x9d\x1e:\x1e\x35\x14\xaePsZ\x11\x1bM*\xa0\x83N\xc6" +"\xc1\x1e)\rX\xff\x34\xf\x82\xf0\xe0y\xf1\xc7\xb3Vo#6\xea\xa4[\xf7+\xcf\x88V\x99\x88" +"\xdb_e\xd4\xc1\xe5\x9bP\xf3\x41\xe4Z\x89\x96V\xa0\xb5\"\x84~\xd5g\xb4\x9c\xd5(O\xe5" +"\xe_\x86R\xcd\xac\x1c\x7h\x4\xf2\xb2\x18_jQ\xed\x19\xddIA.e\xa0\xd2\xdb\xc8\x44\xb7" +"^-\xf7\x1b\x0\x97v\xd9\xf9zLoxn\xff\xeb\x87\xa3\x7\xfbk\x91+\xb6Y\xdc+\xccmP\x9a" +"\x9f\xbd\xe8}\xe8\xd7\x16\x4\n\x85Q\xb6\xcc\xfbwC\x97\x8a\xd9\x92\xd1M+\x85\xca\x5" +".\x87\x32\x61\x38\xdb\x19l$Y?\x8f~\xcdoHo\x85\xd1\x66k\x9d\xe2\xac\xa6\xc7\x90\x0" +"D\xee\x36\x9d\"\x35$fJ'\x90\xb7s\xf9\xea&\xe0\xa4\xcd\xfdp\x99\x42\xa4\x42\x98\xb8" +"$\x95\x6\xeb\x9bw\xbc\x88}\xc0\xef\x94}\xdd\xc7\xcb<\xfckH\xf0`\xdb\xf0\x32\xa1\x18" +"\x84\xe6\xc2&\xd9\xd4G\xa5\xa4X\xcb\xa3%\xd5~\x14Lm\xc2\x95&'c\xe7\xbb\x8f\xf6\xa0" +"\xcaG>\xb7\x66\x1c\x12\xe0\xe8\xe2>\xa3~\x8a\xb3\x38{\x9eTho>Wv]@g\xe5!\xbc\x1a\xfa" +"\xe5#\x94\"w\x93\xc7\x37\xc1\x92\x8\x80?/-\xa9 \xb5S\xe2\xaa\xf9N\xb9\x92\xab\x17" +"\xe3\x1bX\xc1\\\xc4\xaa\x8a\x1b\x44M\xf5\xb3\xe7\xcd\x93|\xf0>\x1f\x7f\xac\x63\x34" +"'1\xb4X\x9f\x16\x93\x9d\x16\xe8\xe4\x97\xa7L\xdeV\x86\xf5)\xe9I^\x16\x3\xd7Hu(\x8c" +"\xf5\x32q\xdb\x93\x13\xa4Q\x1b\x10O\x80\xb1y\xfc\xf2\x13U\x89p\xa0\x2\xe9\x45(\x1b" +"\xf3\xaeQ\xe6h\xddm\x13\xd9\xe8QRt\x7fV,\xa0\xb7]\xde\xc8\xfe\x9f\xe3\x1f\x8d\x5" +"\xb0\xf5\x9e\x80(\x88\xa7\xa4\xf1\x9b)\x95J1\x10\x8d/\x4\x13g\xde\xbdj\xa1\xca\xd8" +"V\xbd\xd1\x42~\x9e\xfe\x89\x95o\xe2\x8dP\xc\xdcj\xc\xb8\nv\x90*\x8\xd0\xbcg\x5X2" +"C\xf1\xdd\x80 t\x9b%~\xdfH\x3\xbc\xaa\x65?\x7f\xd6\xd8\xb9\x16\x90\x99[\xa5\xea>" +"\xe9/\xcd\x36|\x11`\x1ck\x8a\xdc\xed\xceg\xb1lYl] \x6\x93\xac_\xa1]L\xc6\xce\x9d" +"\xf7\xa7\x1c\x8a\x92^\x99\xf5\x8S\x13\xd6\xf\xad%\xc1\xbb\xaa\xd2\x8dJ\xc2\xb6\x90" +"b\xd6\x8f\x39\x5\x30\xa9v1\x9a\x39\x4\xce\xe4M\xc9\x45\x1e\x44\x1a\xabG\x80\x42T" +"@\xf8\xc4\x99\xb8\x14`\xb5\xd3\xe2h\x97\x41\x45\x11~\xd8\x43\xb1q\xbb\x14\xaa\x84" +"\xc3\xa0\x84\xa7\xd8\xe0{\x99y&\x6u\xd5\xce\x65\x34\xdc\x17m\xdb`\xdd\xe9\xfj6t\xf6" +"tb\xefx\x19_\x8d\xfft\xfbX\x82\xb0y\xde\xe3\x1f\xe9(\x16\xf1l\xe1\xa7\r\x7u.\xa2" +"_\xafP\x0\xad\xf7\x9b\xbe}\x17\xeb\x1b\xd2\xf9\xbfl\xdb\xb6\xf0x\xca\xf9y\x86\x44" +"&\x80\xa8\xfc\x41!\x86o\x9c\xe8l8]\xe3N0\xd8\xb9v\x8a\x1\x36\xd9\xee\xf7\x9aK8\xee" +"\x99\xcb\xb9\xa4\xd3#\x16VL\x9dV\x99n%\x95u>\xa7\x1b\xefhH4\xfd\x3\r\x38\xbb\x10" +"\xe#2\xb0&\xb0\x46\x31jS'\n\x96\xda\xb2\x18.\x99N\x91&/\xb0=\x1a\xff\xba\xd6#\xf1" +"h\x92(@\x98\x84\xf9\x1d\xba\x15\x30\x30\x87\n{\xeb,~\xe2\xde\xc5\x18u\xb1\x37\x33" +"\xb7\x92\x90\x41\xf8\xd2:\x94\x90K\xd5M\xd4\xbc\x9b\x43-\xd0\xc7\x8d\xd8\x16\x39" +"\xf4mho\xfa\xd3\x9a\xaf\xbd\x1bl\x1a\x37\xe2H\xceH\xf2>\x12\x46MSy\xb4\xae\xd0\xd5" +"\xbZAW~n\xcbu'\xe\x9a\xd3\xea}\xf\xc0\x9d\xab'\x1f\xb1\x8bQ\xdc\xfc\x0i\xf1]rTnl" +"Q\x4\x9f\x34%\xad\x0_\x88\xfd\x7f\x2\x4-\xab\xe9\xf0\x97\xf9\xd6\xa0v\xb3\r\x8c\xd7" +"w\xb1\xec\x12\xbd\x16?\xda\xbaYr\xea\xa6\x1e<\x87\xe9\xac\x0z\x5+\x1a?\xfe\x14\xd7" +"\xd41\x2\xce\xc5{\x8aX\x91\x82\xfc" +"e\xa4pFa\xa9\xe3Q\xfc\xcb\xc7\x31Z\x87\xe6/e\xd2N\xeb\x9c\xee\x97\x9cn\x10\xdb\xcf" +"\\\x16*\xdb\x92n\xc8\xcc\x9b\xff\xe3\x81\xf6\xb8\xa3\xac\n\x19\xd1\x63\x1b\xea)8" +"s\x1a\xfc\x99\xe8\xea\xa3\x9b\xc7]\xdb:9\xd0\x1a\xd8\xf0\xbc\x18\x38\xf4\xd6t\xb9" +"\xbe\xe9\xf6\xf7\xbeM\x9c\x8b\xd9~\x8d\x17\x1e\xff\x33\xc\x15\xb7\x66\x14\xa1\xff" +"\xd2[;\xe1\x9eJ \x1b\xcc\x85\xf\x92n\xd5\x16\x16\x31\x8c\x96Z\xd2\xf0\xe5o\x94\x33" +"\xb1$|m[r\xed\xf3\xd4\x8\xa3\xe0gJP\x9b\xf3\xb\xe8\x13\xa5\xe6i\xd7+\x97\x87\x94" +"h<\xa8\xb8^4i\xea\xcb\x16|0\xf7\x66m\xb5\xe0\x81\xb8\x1e\xe9\x9e\xcf\xbc\x17\x4\xb9" +"dk\x1a)\xe4\xa4\xceVT\xca\x84\x9\xad\xd6\x1\x45\xdf\xc5\x42%\xbd\xb8H^9\xcc\x98\xcb" +"\xc3\xf3\x8f\xd0\xa7\x97\xe5\xdf\xc2\x9\x94R\xa2\x41\x8c\x66\x36\xbd-_k$4Z\xcf\xa6" +"_N}\xbd-\n\xa0\xc1wjI \xb4\x46lP\x9b\xb5\xbc}f'\x94lM\xcb\x38\xa2p\x98\xb7\xb5\xbe" +"\xed\xc2\xb3\xba\x18\xf9'\x7\x7fq\xe3\x86\x44Yw\x19\x65 7b\x1b\xb3P\xbbSi\xdc\xcc" +"\x7\x39T\x2nd8\xfd\x83\x93\xdd\xb3\x63\xc\x44s\xf0m\x9f\xb9\xe4\"\xe4\x35Vl9k\x12" +"\xfd\xcdV\x5\xdf\xea#!q\xcd\x8e\xf2\x98xh\x6\xe9\x15\x9b\x84Y\x9c&\xd4\xc7\xd8\xc3" +"\xbb\x6\x46\x65\xcd\xd0r\xe2\x8\x31\x90\x37*\xa8\x8\xb2&\x8b?\xec\x88x\xb6\x42\xc" +"\xa8)\xbc\xf9\x95\xdc \xe0g\xeek\x8e\x44\xd2\x86\x9dQ\xba:\xed\xd1v?\x7f\x8d,\xfb" +"\x8e\xc4\x1en\x9e\x1)\xdeSC\x14W\x96\xc\xc5\x1dTk\x10\xb8\xb6\xce\x8\xa1\xc2\xb7" +"\x9f\xba\x44\x8d\xf9x=\x81V\x8\xa1lU\xe5\x89\xdc\xd8\xefk\x4\xc6\x62\x32\xf4zG9s" +"\xa3V\x18\x0\ry\xb8\x17\x32X\xb7\x36\\\x96\x91\xdd\xfeG\xb1n\xeb\x8\xb2\x8f\x88\x18" +"(\xb9\x46\xfb]o\xe1\xe\xccj\xfcN\xa1\xf7\x62\xe9\xb\x33 @3\x82\xe4*\xf4\x88[\x18" +":\xa4\x8d\xb5\xe4\xdf\xc9\xa5N\xbO\xfb\xf7\xc2n\xb1zO\x13\xb4\xbb\x93\x12#D4\xff" +"\xf0UI\xe7X{\xa0\x37:\xcb>1A\x8b\xfa\xf4\x0\xd8\x93\x8f\xc6\x46k\x94'=\x17\x35\x30" +"j\xb9\x12\xaa\xb1>1\xda\x35\x41\xc1s>*~M\xa5\xb8'g\xd3\x7f\x30\x84\xaaz|H\x8c\xdc" +"\xa7\xab\xefw\xd1\x9e\x42\xb4\x44\x8a\xbb\xd3\x46\xe9\xbc(\x8a\xbc\x45@\xc0\xa1\xcf" +"\xd0\xbf\x46\xc5\xbctT\xb2^'\xe9\x90j>l\xbfg\x8b\xfe\xca\xd1\xb1\x9bNB9\x8a!\xc\xd5" +"g\xec\x35\xfb\x11]\\\r\xf0\xee\xec\xe5\x93\x98 V\xb0\xe1\xd1L)/p\xb3\xe0I\x98O\x88" +"\x81\xc8\xb4w\x95j\xd3\x14\xbJ\xa2\"V\xda\xac\r\x11\xc4\x12h\x8\xb5\xb9\xf9\"\xbc" +"\xc5\xf2Jw\xff\x35.,b\x1a\x39\x41\xac\x7\xa2\xeU\ni\xc4\x9b\x1b\x87\xd1\x16\xeeo" +"/\x97\x9\x18\xf0\xf1\xa5\x1\x16j\xc4\x42?\xc2\x12\xe4\xec\x80\x39\xac\x7f\x9c!-\x86" +"OA\x8c\xbb\x92\x94\x8f\xbdX\x82(\x10\x8f\xac\x1a\xd1\x83ppQ#\x5\xc1\x10\xf0\xfc?" +"\xaf\xe6\xe1R\x9c+\xd0\xdd\xe8h\xa9\xeb\xe5\x13}\xfd\xfc\\\x12\xa3\xd0\x80\x14\xbf" +"\xe\xe2{\x10\x80\x2\xaa\xd6\xb6\x7\xf5\xc5\xc0\xf1\xb1\xee\xd3\xc5R\x91\x9c\x9a." +"\x97 J\x81'\xf9{\x10\x66`~\xcf\xb4{\xa9^\xf2\xb5\x1f\x0|);/jc\x4\x1a\x9c\x11 \xd9" +"\xcf\xcdSW\".[\x2\xdf\xc7<\xf9L\xf9\xb5\xcb\x0\xea\xf0s\xe9\xbf%>0\xe0\x9bP4\x1e" +"W\xbf$Ztn\xa3\x1b\xff\xd0\xb0\x2\x1\xc3L\xf0\x88\x1b\xbd\x10\x6\xbc\x9b\xa7\xd4 " +"\xa4\x8eShkY\x8b\xed\xb3\x44\x99$\xeb\xa5\x8d]\xb1\xb1\xb0\x1a\xe2\xba(\x1dWX\xc9" +"\x9e\xfe\x38\xad\xce\x18\xf7\xb1\x82\xfb\xd0\xd0\x62*n\xa4\x97\xa4\xe7\xc0\xc}\x17" +")\x9a'e\xef\xd8\xde\x37l!M\x1\xa2\x18\x19\x45\x1f\xc0J\x2w\xec\x84\xa1Q\xff\x93\x90" +"=a\xc7\x8a\xb7\x88i\x11\xe3n\x12Rn\xd8U\xab\x43\xf6(\x9c\x18\x90\"&\x2\xb8\xef\xbf" +"\x15x+7J\xc1\xe5\x80\xb6\xe9\x63@=m\x15\xa0Q\xdb\x85X\xf2\xe6\x1c\xb\x94v\xc6\xde" +"]HaX\\\xf5\x15\xce\x95\x17\x32\xf2\r\x32\x96\x9f\x39\x19/\xbf\x16\x90\xd2\x42\xac" +"\x4\xd4~\xcS\xd4g\xd0\xfe\x46V\xb9Rl\xf\x7f\x85#H\xb0\x43w7\xcb\xf)\xec\xf9\xb5J" +"^\x17\x18R6\xdd\xc\x16\x34\x9c\x34\x96\xf3\xab\xa5i\xea \xe3\x43\xf6\xd7q!\xc\x39" +"\xdc\x93-\xc6^\xce\xf9\x45u\xc6\xe7i\x2\xcd\xf6\xc8\xc8\x36\x1f\x9cuz%w\xdaSQ\x87" +"\xfdRf\x99\x91|\xfe\n\xd4\x38\xc2\xa7Xr{0k\xc7\x97\x95G\xe6\x8b\x94\xe8~\xd8 aK\xdb" +"\xc6I\xd4i\xefkNN=\xd2\xea\xeb_\x80\xb2/\xe5v\xce\xd2VITg\xc7ju\xf5\x89\x46\x0\x61" +"\xe0?:\x1b\x6Q!\xa5\xab\xe3\xe2\xc5\x11H\xb3\xdd\xc9\xf6$\xc9x\x89\xaa\xf7\xfb\x84" +"\xb1X\xc0\x15\xed\xa5g\x7\x46\xc6\x35\x9d'\xb0\xc2\xbd\x65\x14O+\x88\xa6\x43\x31" +"\x81m\xa9\x4W+\xe3\x98\xe0\x15\xa9\x92\x42\x18\xb3\xee\xf9Q#\xaa\xbf\xc3\xac\x82" +"\x17\xb7\xb4\xf6\x91!\x9a\x1c\x9d\xd0\xa3\xed\xd5\xc0Nc\xac\xbd\xe7\x1b\x42\x35\"" +"S%a\xf4\xb7\x1bp(A\\47\xe3\x46\xber\x8a\x41U\x96\xabt\x90\x15\xc1\xd5\x9b\xd8\x32" +"\x8e\x39\xa8P\xcb\x98\x8[4\xb5\x7f\xb5-\xd1\xd1T\xf9\x8f\xecI\xb3\xae\xbf\xcb\x16" +"rv.M*\x1e\xcf\x2x\x7fY\xdf\x1e\xbf&%\xc3\x63\x1b\xed\x84\x9b)\x8cm\"k\xe4\xe6\xea" +"*\xb6j(}+\xa9*l\x9c\x61*_\x84\x9b<\xb3\xc2_\x17\x16K\xe2\x86\xf6\xe4\xf5\xe7\xe4" +"\xc9\xeb\x17\xbch\xaa^\xf0\x19\xb\x64ijW\x4\x42\xe1\xd9\xbd\xd1\xa3\xev\x92RN0\xe4" +"\xb4\xc3\xdf\x84H\x1d\xce\xc6\xe1\xes\x8\xe6]\xe9\xd9\x0\x99\xf3\xfa\xbb?Ovk\xb8" +"l\xc9\x85\x94m \x3\xe2\x12\x87v\x1as\x86\xcd\x84\x61\x61[W\xb\xda\x1_^\xfa#\xd1\x8e" +"\x83\xc3%\xee\x44N\xc1\x66\xa1\xa3-\x98\x18\xc2\xa6Z\x9-D\x15l\x6\xd3\xfd\x7\x9b" +"\x92\x45\xb\x8aI\x1c\xbb\x35)\xdd\xac}\x95\xaf\xe8\xea\xf3\x37w\xfb\xb2\x65\xfe\xb8" +"\xa4\xb9\xaf\xf2\xce\xce\xff\xf4\x9a\xfb\xdc\xf6\xc4\x19t\x97\xd3\xb4H\x86mp\xef" +"(\xd8\xe4\xb1~|\xe9_C\xf6K\xb4\x8cJs\xeb\x84\xb2\x66P\xf6->Q\x99\xd6M\xb0\xb5\xb8" +"w\x2\x65\xe\xd0\xb8P\xfd]\x16\xc8H\xd0\x96\xe4\xc7\xe6\x1b\xc6;*>\xcf\xc0\x99\xcd" +"q>\x12\xc9\x1a\x65w\xa8\x8doU\xd3Ha|zI\x89\n\x86\xea\x8f\xe2\x4W\x4\xb5\xedR\x9d" +"\xb1(\xc9\xb1\x9e\xe1)\xe5\xfe\x64\x98\xcc\x97\x8\x7fk\xde\x96\x0|\x9d\x1\xce\x9c" +"\xafudnZ[2\xbf\xea\xd9\x36*R\"=tiC\xa2\xd0\x9cSl\xfa\xf7\x8e`\x1b\xc2\xd2\xf0\xb7" +"c\xadr.:z\xe7\x6\x9d\x65\xf9\xf2\xbd\xedrxQ\x1d\x1 \xf5\xea\x7\x1d\x41\xa6\x9f\x8c" +"*-r\r;$\xb4\xbe\x61\xc8?\xfb\xef\xfa\xe2\x1b\x5`\xa6\xfd\x1a\x44\xe5>B\xe0\xd1\xe" +"\xe\x93\xf4!\xa8\xa7\xe1g\xbb\x65\xf0\xd7\xf1\xdd\xe2\x80\x9f\xa3\xcd\xfd\x93\x1c" +"\xcci\xb1\x19\xc8\x32\x38\xc1\xc0\xe\xc1\x0\xd8\xe7\xab\x1c\x7f\xb0.\xde\x97\x7<" +"\x8aX`7\x1a\x81\x32\xbe\x39\x1e\xb1\xc3\x97\xb6\x1f\x93\x87o\xeb\x43\x8c(\x8e\xf2" +"\xe3\x8d\xdc\xd1\x82\xa5\xcf\xbb\xa9\x94\xa9J\x1b\xf8\x18\x31,\xd8#B\x15\xfc\xcd" +"|$\n\x15\xac\x1\xa8\x85\xe1\x17\x9e]}c\x5\xdc/SK\xaa\x14\x1f%\xeaj_5d\x86\xe5\xfa" +"\n\xe3\xc6\x98\n\x9f^\x8e\x99\xe7\xae[\x95\xac\x42\x97u\x10\x97\x2\x45O\xc9Q\xe4" +"1\x9a\xe4\xb1\xdd\xc9\xb0}\x9\x98\x37,\n\x95\xab\xa6\x98ZM\xbem\xc6\x33\x15O\xaa" +"0\xac\xe6\x89\xd3j\x7f\x17\x1\x1b\xf2\x9c\xed\xc5\x8a\x66\x92\xa8\xb3\xb0\xa5t.l" +"\xec/i\xb2U\xbc\xed\xa7\x62\xde\xe7/\x12^\xba\x98\x89\x1c\xffM\x88\xaa\xc1\x41\x88" +"\xa1\x8d\x81\x42Iy\xc9\x7\x9e\x44\x89\r\x94\xee\x9ML\xad\xdc\x1cz\xc5\xf6y\x1f\xab" +"\x88I\xcc\x2@\xa5y\xab\xd8\x0\xef\xe3\xaaN\xe2\xf7\x81\x19\xa3\xc2\x80l\x5\xc2\xb1" +"\xf1y@\xbes\x98I\x82\xd1\xc0\x6T3\xa9\xbd\x65\x8e\xa3\x1a\xc8\x19\xda\x9a\x11\xb8" +"tu\xbbV\\\xc2\x94\xb6\xf3\x2\xfe?wR\xed\x9b\x96\xcc*{\xb8\xcf" +"\xbf$\x87\n\xba\x38\xd2\xcc\xf7\x86\x9e\x93\x63\xdc\n\xd9O\xac\xae\xd5\x92+2M\xc3" +"\xb6\xfe\x83\xe7\xb3O\xe2\x9a\xbc\x1e\xad\x62\xb4\x9f\xfb\xcb\x81\x1a\xdb\xb5\x14" +"\x8dZ\xc2t>:\x5\x83\x86\x3o\xad\xabo\xf0q\xbc\x1c;\x80#\xf9\x8\xb6\xffH\xdb\n\xb1" +"\xc9\xc6t\x87\xc3R\x11\xd4\x9\x95\xe1\x89,\x8b\x66\xadl\x9c\x62\x3\xf6\xf8\xb5\x13" +"\xb1\x11\x17\xb1\r\xa8rZ\xb4[D7\xb5\xa8\x8a\x96\xaf\x31x\xd8V\xd6\x1\x19n\x81\x62" +"\x86\x8a\x83\xda\x64\xe4\x8\xfd\xde\xbd\x14\xd6Y\x18\x81\xea\x65 2\xcf/\x88\xb3\xfd" +"l\x4y\xc8\xf8\x9a\xc6\x8d\x14\xd0\x1a\xf0\xce\xaf\xd9Z\xd1\x46\xe6\x8f\xae\x1\xa0" +"\x7f\x39\xe7\xa0\xc5\xe4\xff\xa6\xd6\xa9\x1dq\x8'\xcaZ\xcf\xe7\xd1\xf9\x46\xa8\xd7" +"\xb6v!\xd6\xfSA\xf3,\x12\xa6\xef\xb0:\xe5\xacSs\xa3\x82\xc0\x44\xa2v\xf6\xb4\x1c" +"\x17=\n\xaa\xae\xc\x1d\xe4\xc3\xccq\xec&7\"\\\xcb\xfb\xd4^\xab\x92\xbf\x39\x35|W" +"\x19[A\xft(5\x85\xb1+\x92\x64\x38\xacr\xaf\xad\xaa\xd2\xd0\xfa,\xcar\x8c\x8e\x86" +"\xbd?\xe7]G\xb8\xbe\xb9j\xb1;T\x80\xf7\xa3\xd5t\x1e\xb5\x1e>@\xc2\x1f\xf2\xed}\x92" +"!\xd9\x87|}\x1a\x8c\xec\xf3\x94\xe4\x2?\xcf\x8cN\xfd\xb3\x8b\x83\x94\x99\xff\\\xd9" +"jF\xabO\xdb\x46\xf3];H\xb9\x17W\xc0\x15\x93(\x12\xe\x93\xcf\x1f'9\xe9\x36\xe2\x89" +"\x8\xfb\x19G\x1d:\xd7\xf6\xf1\xad+\xd1\xec\x36I\x86\xa4\x11\xcc\x1bT}\xc\xa1\x4\xfb" +"\xc1\xb\x1c\xa7\xb6\x38\xa6\xeuHUt\x3\x45\x61\xdb\x34]\xdahAQF\xaa\xc6\x32\xdf\xa3" +"Gi\xb6\xed}}F\x94\xe9,\xbf\xf4\xef\xb1kUIY\x8\x10.\x85\xe8'\xfc\x62<\xf1\xbb\xe6" +"\xa1<\xbf\x64\xe8x\xe1\xa2\xa1Y\x94\x8bU)\xb7^\x7\x17\x44\xa5\xf0\xe5\r\xf1\x8c\x11" +"\xb\n\xf1\x17\xce\x7f\x33\xf8\xc9Y\xd4\xc9\x8c\xedZ\x9dI*\xe6\xf5m\xa5{\xf\x17I]" +"\xac\xb1\x30\x66\xb\xce\xfb\x6O\xd8\x30\x9d\x96Z\xbe\x8d+\xe9\x8fh\x98\xc1\xb7\xa3" +"\x9c\xbb\xe3\xe7]\xa0\xff\xefl\xc3\x94\\\xe7m\xa3\xbe\x91UF\xfe\x8aS\x10\x13\n\xe0" +"\xac\xaa\x9a\xb7<~\x4\x1c\x0S;K\xc7rFW\xaa\x64\x9b\x93\x88\xb7\x91\xaa\xc5\xea\xbf" +"\xcd\xdd\xea,\xc6z\xf\xd0\xae\x9b\xe3}\xf9\xad@ce8\xeeU\xa8?`\xe9\xe0&\xc6O\xbd\x8b" +"\"\xc\xeb\x46\xe6t\x10\x14JR\xf\xce\xac\xa2R\xe8\x16TH\xf8M\x8e\xa0\x83\xc7\x93\xad" +"\x9\xb9\xb>\xe8;s\xfe\xfc\x33\x65\xc7)\xe3\xc7\x38\x89K\x8c\x1\xc2\xf8\xae\xe0\xcc" +"\x8b\x11N\x11u\xef\xb4L\xc4\xc6\xce\xf5\xc8uK\x1c\xc7\xce\xc2\x0\xad\x8b\xf1\x18" +"\x9dt\x1c\xb7[\xcaN\x88\xbe\x95\x9e\x32!j\xd3?gOI\xab \xa3T\xcf\x39i\xf1\x61\x1a" +"\x95\xd3\x93N\x14\x88\x31\xae|\x81\xa7\xeb\xe3\xc5$Ot>f\xa8.\x10\xd1l\xc0\x9f\x81" +"\x94\xeazYk\xc5\x98\x1d\x83\x33\x18\xabO}\xbf*\xbc\xe5\x43\xe4\x10\xb6I\xd1\x8d\x14" +"o\x1HaYh=\xf6\x1a?\x88\xf\x9b!\xeb\xfa\xb7~\x90\x8cl\xfcy\xf8\x9b\xa5\xf5\x11\x14" +"\xf0\xbf|<\xce\xc7\xbf\xf;\x5|1\x95\xcf\xbai\x8\xe3\x1e\r\xf1\r\xf6\x91\x63\xc9\xda" +"{\xab\xc0\xe\x9aX\xf\xa7\xfa\xc2\x2\x91\x6\x15\xbdG\x9b\xbfv\xfb\x80hc\r\x1e\xc2" +"\x1c\xd2\x92m5\x1e\x86\x9e\x16\xc2\xcf\x1e\x2<\xf0MO\xc6\x16\x7\xda\xef\xee\xed\xff" +"U\x93\xe6\x2\x34\x92\xf0\x0)\xe2\xaeKJ,\x14P\x95N\xfa'\x92\xf3+I4\xa7h\xf8\x92\x17" +"\x12\x45\xa1\xe2\xf0\x34\xe2\xb9\xf3\x98\x33\xf1\xb3\x31\xa1\x9a\x38k\xaa\xcf\xec" +"\x8c\x92\x9b\xa6\xb6|\xd8\x92+\xbc\x9d\xc0\x5\xec\x39vW][\x5\x8\xd0q|k\xf1\x11#\xea" +"6\xd8\xfd\x37\xfaw\xa6\xf1\xf5\xaa\x84\xd4\xad\x8d%\xb2\xc1\x1d\x18w\xa6\xe2\xf9" +"\xb7O;X)\xfa\xef\xd4\xf7 \x9c\xe9xZ\xa6\xfd\xe6\x86rUJo)\xd8\xbf\x3\xfe\x10\x8e\xd9" +"\n\x7fXi\xf\xac\x39\x9a\x8a\xd3\xa2h\x99\x7+\x83(t\xdd\xb6)X\x1aQ\xb3\x32\\\xd9\xed" +"\xfdI\xe8\x90\xea\x89Y\xdb\x93}\xab\x83\xc7w\xf2\xa4&\xb9g\xafX\x88\xc3:65\xb7\x8d" +"dz\xd6\xba\x44\x1e\",\x95\x8e\xa5\x8d\x61\x94_x\x1d~\xf4\x9w\x1b\x89\xb2\x2\x42\xad" +"}\x7\xc2\xefY,\xbf\x41<_\xc8\x9e\xc3\xf\xc9\xeb\xeeK\xc6\x37\x9\xae\x33\xb6^\xe3" +"\x9\x1c\xec\xbe\x61\xb\x84~\x12\xc5V\xa2y\xc8\xb1\x14\xc3\xe4`\x82-30\xad\xfdr\xbd" +"i\xf5L\x8\xa8\x18H\xc2\x0*\x8\x32l\xf3\xb0\x9b\x13\x5I\r5\xae\xe5\x91y\x8\xe1`N\xce" +"u\xbb\xe8\x11\xa7\x15\xae\x8a\xf7\xea\x9c\x37\x1b\x32-\x4(\xed\xf4\xc8\x93\xfd\xea" +"`~p\xe1\xb6\xf6\x61IG2a\x1\xea\xef\x18\xe2\x9b\xe0U}*\x92\xcf\x1f\xc1P^\x8b\x43K" +"\xc3h\xce\x7\xcc\xaa\xbc\x7t\xf8\xa6>\x10s\xfb\xbc\xeb?@RF*\xa9\x0\x8a\x1eS\xf1\x88" +"\xc9\xea\xe3\x39\xfa\xbat\xaf\xd6\xd6\xfG(,\xd9\xffr\x1f\x64\xbdQx\x7f<\x13\xb5\xa6" +"\xc5\xa5\xf7\x86\x11q\x1\x11\xf5\xe0G\x1e mrR\xf\x1d\xfa\x46_J#\xc7\x1d\xcf\x99\xa0" +"L\xee\xf1\x1b\xe;\xdf\xc3[ta\xa6\x7S\xd3\xac&\xdcP\xa5\x95l\x91\x95\xa4\xf5\"\x63" +"\x88\xe0\x95=\xdd\x3\xaf\x12\x8a\x98\xf0;\xdf\xa0`,\xbb\xaa \xab\x9e\xcc\xdfrU\x96" +"*3.\x16\xd4\x38\x7\x62\xe4\x98\xfd\xa4\x88\\\x64\xff_\x9bH\r\xa4\x87\xc5\x8ex\x94" +"=\xf6&\x16\xe6\xe2\xc6\x9e\xec\x88\x36\xdf\xcf\xa9\xeb\xf5\x89\x38\xa8x\xf3\xe7\x92" +"\xe8\xbd\x8c]m\xf5W\xa5\xd8 \x18\xdb\xae\x1c\xa9\xc6K\xa5\xaf\x8e!\xbe\x1b\x66\x80" +"\xfc]\xb2$\"\"\xbwn\x9b\xa0\xbf\x1e\xd2\xb7!/\x8b\xf1\x11\xec\x8c\x8cw\xb2#\xc0^" +"\xb5\xe5\xf1\xcf\xab\xd2\xd0\x37\xf4\xba\xf\x95\x3\xe2\xcd\x83\xf4Q\x9d\x18\x4vc" +"\xf0\x9e\x30\x88\x83\xf5\xdaR(\xf8\x30\x45\xff\x41!M\"s\xb2\xfe\n\x90\x17\xd5\xe0" +"U{\xc2\xa1\x98\xc3]\x1e~\x81\xf7\x96TDW`\xcb\xa1\xd3\xf0^\xa4\xb9\x6X\xe5?\xdf\x8" +"#\xbd\xb1P\x1e\xd5\x1d\xa7\\G9Ps\xd8\x98\r\x1e\x35\x4\xe3\xf6}\xb3%\x9eN\xe7:\x87" +"\xcf\xd9o\x84\xe2!yes\x95\x8d\x36JQ\xe6\x35\xfcUG\x8c\x9c\xbf\x9a\xea\x16\xb7\xd8" +"\xc2_!\x15\xcf\xe4\xb7\xf5\x98T\xe2Ih\x83;\xa0\xd6M\x1d\x33*fm\xfa*?\xd7\x1b\x5\xa2" +"k\xab}\xa3\x82\x90{\x13\xde\xb\x80\x87\x1d\xf1\x84\xd3\x62+b=~\x9\xbc\x32\xa4\xf6" +"\xea.m\xa4P\xa9\x6\xea\xd3mS\xfd\xec\x7f\x83\xe1\x1\xfe\xf3/O\xae\xc5\x81\xb0\x0" +"hm\x86\xa0\xd3\x86\x1c\x1eg\xf1\x8aLFG\xf5\x1f\x97\x84\x84\xd9\xe3\x10\xb\x37\xbe" +"\x9d \xae\x84\xc0\x85\x46\x1c\x1f\xbf\x92\x9c\x66\x9e\x93\x66Y\x5\xc&'\xac\x1b\x1" +"\x98\x37\xba\xa7WW\xf5\xb0\xa8.\x8a\xe9\xcf!\x11\x93\x1a\x38\xbf\xc9GD\xe2\xfd\xe3" +"\xf8q\x3\x42\xac\x61R\x86\xe4\xac\xe7\xf2it:\xa0Tc\xafS}\x94\x16#\xe\xcc\xa8Y\xd8" +"\xc9\x9b|np\xbe\x7f\xe1\x1d\xb6\x98X\x9b\xe9\xe1\x19\x0\xc8\xe9X*N\xf5\xea\x94\xb5" +"\xf6( \xc9\r\xbc\x2*b\xe\xc5\x36\xe0l\xb8\xbeu&\xa7\x89\x99m\xet\x1a\xad\x98\x8\x80" +"\xa3\x38\x0\xa6\xfe\x92(l\xcd\x2\xc9\xcb@~\xb3\x1f\xb9]\x9c\x9fJ\xff\x38\xb3p\x87" +"\xacX,\x1f{d\xa7\xc3\xd2 +\xdd\x62\xe9\xae\xb3\x1b\xca\x85\xc4\xcf\x32?\x3\xda\x9d" +"1\x8b\x91\xf7\x8f\xdc\r&f0\xf7\x44N\xd0h\xb5\\\x5\x46\x1c\x97U#f\xa8,.t<\xec\x35" +"=Q\x2\x8f\xdc\xf5@;;t\xd3y\xb8.\xb6\x9c\x43\x80\xed@#\x9e\x15\xa8k.\\\x86\x8\x91" +"\xe2g\x81\xcc\x11\x1f\xb5p^;|z\xf1\x94`\x6T\xb5\xfa\x1b_\xc5O\xd0\xba\x43\x66n{\xab" +"\xd2\xc9\x1c\x85\x9f\x39>\xd4\x9fq#\xed\xfb\x64\x8a=aR\xf2\xc1\x7f~C\x8c\n\x63\x89" +"h\xac\x6\xb4\xfb?w\xf6O5\x8a\xe0\x63\x82\xb\xd3?\x2\x13\xc8\\@\xe4\xd9~\xd1\x0\xec" +"-\xa1\xc2\xe1\xea%\x8b\xf1\x7\xafgZ\x9d\x99_`\xbf\xa3r\"\xb9\xc2\xb3%\xc0\x5+\xb8" +"S}+'\xdd\x43\xa1)\xc7\xe8\xff\x42u{:\xc9\xb4Gp=8!\x8\xdaR\xb\x8b;\xb3\xe8\xc7)[w" +"kD\xed(\xf8\x63\xb8\xe1\xf8\x1b\xb\xd1\xda\xee\x8a\x17\x15%\xd0\x9d& \xc0M\xd3!\x9d" +"\x88\xc.\xccy(-\xd7\xb1w*\x9c\xbb\xcapi\x9\xae\x8b\xc7y\x8en\xc7\x37Q\x89\xb6\xcf" +"\xce\x8a\x87XI\x17nY\x13\xb8Z\x18\xfb\x19z3\xcaK[@X`<\xf1\xfay\xa5hV\xb4=S\x8e\x9e" +"\xce\x11}\x99\xaf\xa7;W\xe3\x7\x36OU6D\xde\x1\xed\xb4\x62\x34\xef\xac\x13\x4kn\x4" +"~\xcc\x8f\x63\x94/ \x9z\xd7\xac\xf0\xa4\\\x5\x1\xa9Rc\xde\x94\x39\xa8\x80\xd6\xb5" +"\xc5!M)\x18\nT\xd7\xfe\x9b.b~\xf4\x9e\x18\x9bY\xfc\xc7\x87\x45\xe8x\xe4[F\xc0\xa6" +"H\x95]>\xa8\xc9\x35\x11=\x94\xf9.\xc9\x63\xf6l\xf3\xcf:Rk\xa7\x1c\xdf<\xd4\xcai\xef" +"\xab\x8\xb7\x38\x9e\x33\x90qh\x92\xa4\x87+\xd2\x9d\xc1\xe0\x88\x9a\x42\xd7\xff\xb4" +"\x19\xe\x9a\x8d\x5\xd8N\xb9\xc5t\x1b\xe6\xb0'\x16\xbcu\xe0\x10o_\x94\xbd\x37x\xbe" +"\x98^\x3\x86\r'\xe4@\x88\xc3\xcb*\x5\x9d\xeb\xc4 \xdc\xe3\xa8\xf4\x8z\x95HH^al@\x9a" +"\xc4\x0\xdd\x1c\x41\x1c\xe4\xb6\xa2)\xd0\x91\xb2S\xebh\xf0nCQ\x1e\xc5\xaan\xcaMn" +"H\x18\xd6\xaa h\xda\x1a\xef\xca\x37v\x11\xbf\xa8\x16\xb5!Q\x82\x43-V\x83)Mg\xa7\xc1" +"\xfdv\xc5\"\x33\x8|\xa4IC\xecr\x80\x0^\x93\x14_^z\xe5\x1\x0\xc1\x83\x64\xe1\xb3g" +"A\xe9\x64|M\xc1\xf6\x8aX\xec\x44\x9Y \xfd\xcf\x5S/`7\x17\x80\xf7\x84 \x7~\xf5\xc2" +"Mc\xe2`@\xcd\xdf\xf8\xdf\xd6]\x87\x1d\xb9\x43\xf5\xc\xde\x84\x90\xc\x13r\xef\x33" +"\xfd\x8a\xb9\x88\x9c\x82\xf9Oa\xa0\xe6\x84\"\x19\xa0\xf3\x9e\xc7\xb2\x32\xcb\xf8" +"\x2\xc4\xa7\x44\xf3\x31YC.\x82p\x6\xc7\xcaw\xe4\x80\xa4\x8a\x9b\xej\x87\x61X\x8a" +"1\x2\xe3\xf9\x8aw\xbb\xd6*:#\x15\xf\xd1@\xd3\x94\x17s\xbf|\xbb\xa2\x33\x8f\xf3{\x9e" +"\xb6@U\x8a#\x13\xe8\x82N\x8e\x62\x3\x31V\x8a\x9bv\xf4\x89q\x98\xa7\x9\xf9\x31?J\xc4" +"\x8'\xd8\xc3\xa7\x1f*\xbf\xf0+\xfdW\xd3\r\xb\x14\x1/\xb5\xc3\x9b\x85\xafT\r\xda\n" +"\xdc'\xa8[1iN\x8d{a\xf9\xd9\xb4vW\x10\"\xd9\x8f-v\x82\x46U\n\x87r\x93\xf3\xffn\xd9" +"\x18\xa4\x98\xd6\xa6\x0\">\x1a\x61\x89\xcI\xac\xfb`&Xg\xce\x94\x64\xf9\xc3,Y\xe9" +"OvA\xc3\x87?\xb4\xfan\xb2\x37\xf8\xed\x94W\x99W'\ro\xd6@\xbd\x95\x43\xe6\x83\xf2" +"7,\xcd{`\xaa\xd2i\xe0:r\xc5\xcd\xb7\x32\xb1(\x81\x8d\x41\xa6\xdd\xd2\xbc\x13\x9f" +"}9\x11\xf4\x8e\x1b\x1d&=\xd4\xae\x8eL\xe1\xa6\x86\xf3\xa0\n,\xbfH\x97\x86\x31\xcd" +"$5f\xe2.h\xf8\xd7\x39q4\xa3S\xe\xa3t^O\x1e\xac\xb4\xd6\xa5\xfd\x84\xc3\x1\x10\x94" +"\xf3us\xf7\xf9\x90#\x5\x2\xcS\x92g\x16\xd4x\xck\n%{\xf7\x11\xad\x94\xc8?\x1d\x41" +"\xa0,\x1c}\xd2\x3\xa3\xe6\xe4\xb1N\xda/\xdb\xb3k\x6:>\x7\x44\x95\xf6&\xb0\xee\xa1" +"F\xd2*\xc3\x34W\xf4OAgYgm*\x5\x66\xec+rm/\x5@\xab\xf2%\x33\x9f\x2\xf4\x6\xd4\xe7" +"\xa6.R3\xdd\xf2\n\xe7\xc8l\xa0\xcd\xd5\x61\xf3\xde\xd0\x2\x35/\xc6lowA\xa5\x42\x15_J\x15\x9c\xd7x" +"\xbeV\xb9I,\xd9Q\x15\xc1\xa0\x61\x89\xa2\x16\xcf\xd2\xe6rYe\xa1=\xe9svZ\x5\x11M\x9a" +"ZK\xe0\x61Z\xf8\xbfj^\xaf\xf8\x44h\xb8I\x95M\x15\xbe\xae\x1c\xddW\xc4\x35x\x8b\x33" +"\x19\x5\xc0\x14!\xb5\xf \xb1\x84Pj\xb\xeftc0\xbc\x98\xe9\xc8\x9a\xaa\x8f\x9d\x10" +"/\x15\x80\x43\xbe\xb6\xa6\x82\x5\x9a\x1c\x8b\x8c\xf6{/=z\xf4\xd8\xbb\xe0\x86%L\xde" +"Sv^2&\xba/\x95\xae\x80\x63\x64\x9f\x9f\x94\xbd\x95\x19\x41\x1d\xaf\x8a\x2\x87\x30" +"s5f\x81\x90\x63\x88\x6\xe2\x94\x84\xa4\xff\xbc\x1e\x46\xb1\x80\xe\x3\xb1\x62\xc2" +";\x1d\xc0\xb4\xc0\xddL\xc5\xaf\xe3@$1\xb2" +"\xc8\x16\xda\x14\x86\xc3K\xc9\xdc\xa4\xe2\xd5\x1c\x86\x86\x88\xa7x|\xd1\n\xbb\x9a" +"\xca\x14\xb7\x18\x13i\xde\x89\x91<\xd8\xfa\xb5\x8f\xc8\x45\x19\xea*\xa1NT\xb7\xa8" +"\xceGO!>\x7\xcf-\xe2\xe8\x88\x9=\xee\xc9\x37Rh\x16\xb7\x1c\x96\xedu\xfa\x9e.\xdc" +"\xf\x9en\x84V\x9c\x12\xbb\x8e\x39\xaa\xed\xbfTf0tUS\xd6\x8O\xf9RO\xecjrd\xf8\x8c" +"\xeb~\xc3\x35\x8e\x92;9$t\xe3\xa4\x88\x65VD1f)\x88\xfe\xa7h\xceUZ\xb0\xdaH\xbdRj" +"\x84\xb0\xcb\x17\xb4X@f\xc1\x64\xc\x10#\xd9\x1fxi\xef\xcMp\x1b\xe1!\xa6\xe3\xc8\x32" +"\x1\x4'I\x7X\xae\xd7\xa2\xb3\r`(\xf2!Z\xa4N\x86\xd8R\xfd\xc6}\xa5\xcc\xbay\xee\xa8" +"c\xba\xc9\xed\xc2S[f\xab\xeT\xecMD\x11\x39\xf\xde\xb8\xd1\xfb\xc1t?\x15\xc3\xb6\x8d" +"\xc9*\x86Y\xe7\xa8\x92\xd5\xe5\x38r\xeaQ\xee\x8c\xa7\xefQ\x10>\x87\xc2\x9a'\x14\xe9" +"\x7\xc7\x9d\xb9\xcf\x37\x44\x17\x85\xd2\xf7:\x1e\xe5\x85P\x11\x1aM\x9b\xcc\xbe\xbf" +".9\xcd;\x93\xdc\xa3\x0\xfa\xc3\xed\x1a\xdd\x82\x15\x30\x1eWf\xc3\xc\x8c\xf2\x96u" +"tlZw\xbf\x1f\xe3\xcdu\xd2\\\xf1\x93\xde\x8d\x9a\xf0*\xf8\xf7\xa6\xe8\xf8KT\x80X\xcd" +"\xd3\xc6\x99\x8e\xd1\x34\x63\xfa\xdes\x91&\xd8=<\xe2\xc7 \x1f\x95S\x82\x83.2\xc1" +"\r\xcb\xcc\xa3X5\x98[\x9a\x93\xf8\xe3\xb0 \x8b\xe6\xe9$(x|G\xd3\x80\x8a\xfw\xb8\xf1" +"\xd7nk\xf6\xa1\x7f\xf8\x1c\xdb\x6Q\x80\xe0\x38\x9\xd0\x36\x38\x30{\xd7\xbf\\\xed" +"\xbf\x64\x90N\x91\x8f\xc8\x5\xac\x90Sy\x92\x8b\x81\x64\x80\xf6\xe3\xbd\xeeG\x4,\xba" +"\x98S\x9d\xa0\xe1\x13\xb1\xa5\xf2>\xaf\x1a\x32\x10\xbd\x18V\x19\x85\xe6\x43n\xab" +"\x90\x39]\xa4w\xc7\xa6\xd7\x88\x8d#w\xb3\xfc\x41i6\x83W\xd8\x80\xce\x4\x1e\x1f|\x87" +"^\x95\x66\x0\xdb}\x9b\x35\xd1\xee\x66\xbeGn\x9d\xd8\x6L\xc0\"\x30'h)\xc2\xc0\xa0" +"\x98\xf0QP.\x82\x8a\xc\xc5\x5\xaf\xd8\xc3\xdf)=\xa1P\x8a\xc4\xd2Xf\xbe\xeek\xbdZ" +"#\xe\x9c-\xcd\xd4\xf0h\x83\x93\x63\x81\xf4v\xdd\xcd\x86\xcc\xfe\x15\xc2\xce<2C\xe1" +"H\xcb\xe6\x3\xb8Q:|\xe7\xa6\x91\n\x66\xa9\xbp\x89\xe5\xcc\xd4\x36\x8b\xef\xff+\xcf" +"\x8e\x91\x8b\xfe\n\x1b\x6\x9a\xb2\xa9\x14\xca{\xb9\x1a\n\xc3\xb3\xc0\xb0`\xfa\x1a" +"\x3\x16\xf6\x13^\x89\xe\xe5I1X\x97\xc8\x46\x44\x96\xccm\xea\xf~:\xf4?\xfaL2\x81\x15" +"`gX,\xa2U\xb1\xd2\xe8\xf\x99\x9a:\xc0@+\xbd\x17\x1\x82L;\xb5$\x13\xf[\x82\xa4Ru\x80" +"{\xc2\xf3\xa0\x65^\xa2\x8\xf9h\xb2\x97\xf9\x8c\x36\x91\x92\xc8\xac\xa2k\xeb\xa7\xdc" +"E\x6\xfb\xd1\x30^.\xfaM\xbeSu(\x1a\x88\xee-o\xc8\x8f\xc0\xa7U\xe7)4\xb4\xb5\x8fm" +"\xd3\xbd\xafqq\xa4\xa3\xc7vWg5$\x92\xbf\xa9\xa7u\x85\x4u\n\xb7\xf3\x87Th;p\xe9\xe2" +"\x93\xcb\x1c\xd7\xb2;\xa6+\xd7\x39z\xbb\x84\xd7\xed\xb2.\xf6\xc3\xf5\x8b>\xea\xf6" +"V\xe3\x61t~\xd0@ \x16\x32S\xd1\xcf?\x90[^\x85\xf8?\xff\x30\xab'x\xca\xe4\x37\x81" +"f|\xf\x65\xc8\xfd@Mk\x92\x2\xa9\x9e\xa7j\xf9\xae\x12\x36\x63\x15P\xb6k\x6\x38G\x18" +"\xbm\xca\x83.\xa8\xdcJn\xfd\xb6t\xb5\xa2\x65R\xa7\xc7\xd5L'\x99\xc7\xd4\xe0<$\xf6" +"a\xa9\x11\x3\x8m\xe3\xa9\nwJi\x88\x34vV4L\xfb\xa0`e\xab\"Gk\xb0\x9f\xb6\x8f\x99(" +"\xc0\x4_'d\xaf\x64<\xfe\xf0Qm\x87\xfd\xe6\xdb\xf9;\xae()\xb1v\xcbP{\xb9\x98\x35\xe0" +"\x1b\xad^U\xc2\xf8y\x8c\x93\xfa\x35\xeb?\xef\x2\xcf\xa3\x1d=!\xb0\x30T\x7f\x86\xd2" +"{\x94H\xd6\x8e+\x15Ze\xc7\x42\xbd)\x99\xda\xa0\xc3\xae\xd6\x44G\xb9\xccg\xf7\xaf" +"3\xb6:\xfa\xf2_<\xf7\xef\x86\x65\x7f\xe8\xf9R(\x8c\xa4\xb6\x91\xd3i\xe8\xf1\x93\\" +"\xda\x44\xa1\x80\xa6vu`\xc2\xed?/\xcc\x38\xb6\xbdy\x91\xd4\x17\xc|Vmi\n\x8a%\xbe" +"\x3!*\x80\x87\x11\x8\xd1\x8c\xce\xff$f#\xe6S\x10v1\xf2\x92'\xd6GT\xb2 \x8d\x19\xf8" +"NTw\x99\xe6\x91\xcaG7\x80\xdd\xd5j\xe6 \xcd\x95=Q3\xd1\x35\xe3\xd5\x1f#px\xfe\xeb" +"\xb7\x37\x14T\xee\x63<\xfe#\x8a\xea\x63\xf9\x99\x9e\x32\x85\xel\x19v\x87\xa0\xec" +"NY\x8\xd2\xa1\x8cSIb~3j\xb5\xe3\x18[!\x82(`:K\x18R\x6\x9f^\xe8I\xd5q\xb8\x38}\xce" +"\x1f\x8f\x8e\x9f\xe9O\xad\xef\x12\x8b\xa8;\xdd$_\x8c\x1c'\xc1\x1f.\xd1\xa8\xab-m" +"`\x17&\x84,\xeetN\xe7\xaa\xc6\xb6\xfa\x16\xcc\xaa\x39\xdb\xf5\xb3\xb1\xd4s9\xf3\x1d" +"\xfaV&q\xa9\xcf}\xdei\x15\xfe\xf9\xf1\x9b>\x6\x8a\x46M\xd3P\xa3\xad\x14m\x1a$\x16" +"s\xb5\x11*J\x87h\xf9vr>n\x18G\x90\xc0`E\x6\xc4\x65\x91\xbe\xf2\x10l@x\x9bs31\xa8" +"\x7@\xd5\x9a\xbe\xd3\x98h\xf8\xb\xec\xc2\xaa!\xc4\x0\xa0\xbd\xc\xc3&\xd1\x86\xff" +"\xf9\xeb\x37h\xf\x1e\xdc\x32\xacx\xf9\x5\x92\x80\xd0{_\xf2\xe3T\xfe\xd5\x45\x12\x9f" +"\xa5\xfa\x8f=C\x17\xff!\xe0'`/\xdb%\"\xf0I\xbbT_\xf4\xda`$\x81\x30\xf8\x1fN4\x83" +"s\x14/1H\xde\xd0\x38\xaf\xba\x81\x8f&\xd5\xb4\x9f\xc0-\xe9\x80\r\x89N\x92\x39\xc8" +"\x8e\xe0\xed\xe4\x31\xf8\x8\x36\x97\xcb\xb\xe3\xb4\x97G4s\xe5qG\x17\xc9\x14\xa1\xa9" +"&s\xc$\x94\x13\xfe\xa2\x61^\xf7+\xdb\x9\x6\x93\x33\x87\xa8\x92\x37\xfw\xee\xbf\x62" +"\xd2l\xd5\x83\xee\x64;\x2\xe3#\x82\x13y\xc0\xdc\x96\x64\x7\xd3j\xe3\xcd\xf6\x46\xb9" +"]\xed\xc7\xd7\xfd\xf(\xe9Px\xf1-\xfc\r\x64\x0\xb3'\xb7\x43\xc5H\xa0\xa3Qz\x17Z~\xd9" +"c\xeduk\x1e\x10z\xe7\x8~$F\xbap,\xd4\xe2n-\xcd\xc1\xa8\xb6\x97\x10\x8b[^\x81\xe9" +"\xf0\x31\x5\xf2 \xc7-J\xeb\xc5ve\x88|\x8cyd\x8\x9f\xbe\x94$\x12\xe\xfd\xb1Mv\xee" +"\xf8\xc6\xf7\xa3\xb\x13\xe1\xae\x90\xcb\x9d\x93\xd2\xe1K\xdeG\xf4\xa1\xd0^\xd5\xb1" +"\x8d\x32\xaa\x39\x91\x1b\x92\xd2L\x93\x97j\xce\xb7\xefYzu\x16\x19#\xa7;,\xc7\x61" +"xT\x93\xd0\xee\xdc\x8\xb5\xaf\xe9_<\x0kAC\x8a\x7\x85\xc9\x62\xb0p\xde+\xd0\x96\xcb" +"c\xb8G\xc8u9\x88\n\xa3\xd3\xfc\\\x34^\x9\x92\xd7\xbew\xc6\xcf\xf4\x94\x86\x17\xfd" +"\xdaxL\xc5VR\x19+\xe\xd7u\x12\x9cN\xa4$ZA\xbc\xf3\x87[\xe3\x19\xda\xe\xe2\xda\xfe" +"\xfa\xe9 \xcd+ll \x1v/\x88\xc0\xc5\xc0PS\x2\\\x3I\xdb\x17\x10\x43`\xfc\xe1]\x7f:" +"\x8e\x30\xed\x13\x15Zt\xfa\xf9\x1d\xc7{\x8a\xab\xddo\xbdZ\x1e\xaf%]\xb2\x9\xd7\xf2" +"\xb9\x8\")kV\x3\xfb^,\xc9\\\xbc_z`D\x5\x8b\x80\x44\xad\xces\xac\xfd\x89\x61w\xf1" +"\xf7\xe\xad/e4\xdc:\xd7U\xab+\xa8q&\xd6<\xa2\xe9\xc4\x41\xdf\x9\x65\xbd\xddk\xe4" +"\x94\xe5\x8dkPW\xa5\x61\xd1\xe3\x1b\xd3\x8e\x92\xcbs\xc1\x46Z\xf6\xb9\xc0\x1\xf7" +"\"\x90Y\xbc\xa4\x10HG\xd1\x63\x9e\x12N\x8/sd\xb5\x65H\xbf\x81\x12\xd0\xeb\x46\x1b" +"1k$I\x4\x9fjGm6\xd6\xb7\xc0\xc1\x12l\x8\xf2\xe9\xa1$j;[!\xe7\xc8\xfa\xc6\xe2;\x82" +"\xe3:w\x83\xe4\xf3\x1f\x2@\xe9ni\xc9\x44N}z\x92\x86\x36\xcf\xd0\x86G]\xf1\xe0\xa2" +"\x84\x64\x81\x38{\xb2\x1\x6U\xb9\xf8\x1a\x7\x44\x12\x16\x99\xb4\x90Z\xae\xdc\xc8" +"K\xc5\xd5\xab\x36t`\x1d\xbb\xb6Q\xed\xe7\xb5\xdf\x5\xc8\xa4\x63\xda\xb4\x1fypm(\\" +"O\x90\x63\x99\x7fz\xc8\xce\xf3\\\xadQ\xfb\xe5\xf5\xbb\x1b?\xa6\xda,:\xbf+>\x92U\x81" +"4\x97(\xd6\xda\rY\xc1\xef\x64\x44S\x97\x42\xee\x9a#\xa5r\x7f \xcf\x93w\xf4\xf8M\xea" +"B\x6\x7\x1Z0\xfb\x14\x63-\x8J-\xd1\x81\xbb\x2\xfc:\x84\xfcI\x9b\x31\x81V\xb6u\xb9" +"\xca<\xca\xbd\x87\xfd\xb2I|g\x5\xfap\xeb\xa4:\xdd\xb6\xcf\x96\x1b\x30\xe8\xf6\xab" +"\x9f\x84\xe1\xdd\x8dm\xb3\x31K4\xb7\xf7\xaa;\xbe\x19\xd5\xbd\xc7^\xca\xdf\xd8\xea" +"\xe1\x9e\x7\xb3\x87\xa1\xfcXo\xf\x30\xdbiY&vKT\r\x89\xf1\xd8T\xb0\xff\x86R\x8a\xd9" +"R<\xafV7\x1e)I\x8c\x11\xaf\xb2\xf4\xd5 &p\xc8\x34\xe9\x30\x10?\x3\x9d\x13\x34\x88" +"$\x16\xa4\x9b\xf9;\x84\xfd<\xf1 \x9e\xef}I\x94\xc8\x30$6\xc0yD\x97\x46\x1c\x11\xf5" +"\xb8\xba\x15+\xac\xbc\xc0\x8a\xf8\xa1_JM\xf3\xef\xfbr'\xca\x97\xfc!\xd2\xd0\x35l" +"\x93\x39\xct\x9c\xbe\x97P\xb8!\xf1\xa7\xbc\xfa\xe2\xc8\xbcm\x9a'\xf8\x44\xd8\xad" +"\x8\x83 y\xab\xf0\xea\xd8\xec\xd4\xear\x84m\xfe\xed\x2\x18W\xf3<\x1a\xceL\x7\xbe" +"\xc9\x3\x98\xb6)\x81LI\x8d\x33\xbe\xb3u\xb9\xa5=\xa0\xf9&\xfen\x89\xe7\x3\"\xc7," +"\xb2\xdd\xbf\xb1k\x13\xefzOP\xdfx3\x16XLj\xc2\xbd}\x90)\x12I3\x13;\")\xbft\xa2(\x86" +"\x8a\xb3\xe\xa5\xc3\xe8|x\xc3\xf0\x96!\x99H\r\xbc\xad\xbe\xf5;\xdd\xe4XI\xda\x85" +"zO\xd8[\x96h/\x1e\xde\xb8S\x84\x92\x9d\xeeJ\xfa\xf8LQ\xa0\x9f]W'\x5g=\x88Pp0?\xdb" +"G\xdc\x89\x8f\x87N\x10:\x9e|\x1e\x89\x41\x15\xdf\xdd\xad\x81T\x9csu\xd4\xae\xdc\xce" +".R\xc1>Q0\xb4\x7f o|Z\xfa\xf1\xf9\xee\x83\xda\x81\x88\xd7\xbG2i\xca(\nj\x2\xde\x85" +"0\xb\x93\xd8\xa4\xf6\xb4\x2\xfb]\xf5\x8f\x13'G\xc\xe1\x1c\xc6>\xce\xf2\xef\xaa\x39" +"jf\x80\xa6tj 8-\x95)\xb5\x8e|\xe6\x84\xb3\x9a\xc0\xfp\x86\xbc\xb4|\"0\xdf\x3\x43" +"\xbe\xd9\xb9\x15*a\xc9\x82j\xef\x9e\x0\xa1\x45-\x91\x30\\\xf0T\x90\xd4\xbc\xb\xad" +"\xc9\xc6\xfc\xbf\xa9?\xadR\xc3\xa8\x7\x5\xa1\x95h\x90IuW\xc0\x87>\xbd\xcf\x61\xcc" +"\xdd\"\x19\x35JOV!\xab\x33\xb1\x19\x32\x6\\\x1d\x99\n\x9bh\x85\x83\x31\xeexu\xca" +"\xc8U\xf9\x85\x63\xb1N\xf9\xe1\x6\xb\xea\x90\xf1\x95\xaf\xff\x94r\x8a\xe9\x35\x45" +"48\xda\xb3Q#\xd0\xe2i\x94u\x88M\xda\xfcs\x7\xa5\xcc\x6\x92\xf\x35\x34\x17(\xd8Ye" +"\xf5\xba\x86\xf2\x61\xcf\xfc\xb1\xe2\x9b\x42\x9f\x97ip\xd4-\x10\xe6\xaflKy+C\x84" +"\x12*\xef$H\xe2*X\xd3\xaa\x0wC\xc7\x13$\xea\x8\xd0h\x19\xfe\xd1J\xc1\xf2*O\xb\xe4" +"x{\xc8s\x8e\x1c\xef$\x6wW\x1c\x65\x80N\xd3\xe7H\xd7.\x89\xc9Ko1\xb\xe7H\xfa\xea\x31" +"\xee$hY\xca\xf7\xa1\xea\x17\xcc\xb5\xb2\x46\xc8~\xabw\x1e*\xc5\xd3xe\x1\x91\x8\x15" +"\x14\xdd\xc2\xc6hx\xe3vl\xb2\r\xc4\x9f\x63\xf'C\xa7\xfa\xec\xbe\x9d\xbe\x9e\x81Z" +"<\xb5}\xad\xf2\xbf\xf5\xef/\xce#\xa5\x62\x98\xa3\n.\x5/\xea\xef\xbdi\x81\x1\xf9\xdb" +"\x99&\x13pf\x93\xcb\xe\xfa\xf6\xf6\xc\x8b\xb5\xe7\xd0\xa5\xb\x33\x92\xb9\x83\x1e" +"\xf3\xa3\x4\xa8\x46\xcdJ\xf4\x31\xe9\xf0\x18\xfc\xd3\xa5\xb1\x63\x87U-U\xda\xeah" +"=6%t\x18\xaa\xa0\xe7\xbf\x8a\x3\xed{\xab\x11M|\x15\x11\x9elq\xc1\x94k\xd7\x90<\x1c" +"B\xe1\x15\xe9Ta\x90Q\xb8S\xbf\x5\xae\x31n\x15\xe6\x19\xa7\xde\xe4\x98\xf7q\xe8\x9" +"\xd9\x43Yi\xc1\x5\x64\x2r^\xf4\xc\x2\x0\xe0\x83\xf3\xecn\xe\xc2{\x8e\xd3\x8d\xfe" +"2\xea\xe^\x15j\xc3lK\xb9\xac^\xd1\x11\xa1\x16x3\x97\x3\xf1\xb9)\x93\x45\xae\xb1\xf2" +"Q\xfc\xef\xa1\x1f\xb3\x10\x1c\xc4\x99\x90}\xc8\x62\xb4\x46=U#\xb9\xb2\\[i\xf7\n\xb6" +"\xb2\x9c\xfc\x1d\xf1\xec\xab\x82'\xeb>\xd1\xf8\x82\xe9\xb\x12\x8\xe\xe0\x3qM@>\xc4" +";{TI\x14\x46\xb6\xa3\xddn\xb6\x41\xef\xbf\xef\x6\xc\x45\xe8s\xe7\x39\x80%\xb1\xcb" +"peD\x1f\x17S\x2\x8fo\x8cI\xa9h\x1\xc0\xd5\x98\xe0\x98\xea\xdc\x96\xa2\x11\x17\xf8" +"\x17\xb6\xfdniGd/\x93\xe2$%\xa0\xe\x8fkY*\xd5\xb\x31{i\xc0\xf9@G8jE\xe5\xeb\xc9P" +"O\xe5TQ\xa0\x1e\xb2\x9d\xdf\x9a\x41\xd4\xba\xd8_\xc8L\xe2\x80\x97\x1e\x83O\x6\xce" +"\xf4\x9c\x8c \xed,\xea\xc8\x89\xf1X\xcb\x14\xa8\xc0p\x90\x4x\x80L\xff\x1d\x16\x37" +"\xcc\x88\xc\x81\xaa(}\x83\x82\x83\x7f\xfa\x8f\x41\xff<\x9d\xf2\xf2,\xb2\x0\x44\xc1" +"q\xe4\x81]\r\xfl\"\xd1\x9aR\x11Nx\xc\xec\xd7\x1d\xaf\x63\x42w\x82\xe8^F=\xcb\x33" +"7\x89\xf4\x96\x34\xe\x8c\xff\x88Z\x9d\x9a\x42P\x11\x8b\x43\x9cq\xc6\xbeQ\xa9\x33" +"\x8b\xe2\x92Q\xaayN\xdcg\xde\xec\x63\x37\xfa\x63\xca\x9b\x3\xc1\xc9\xf7^s:J\x91\x86" +"F\xe7\xbc\x97\x92Hl\xb5\xa4\xbc\xc5\xf8O\xba\xbd\xfe\x33\x8c\x37\x92%J>\xea=\x88" +"\x90<,G\xb9\x1e\x7\x62Y\xdc\xcc\x8b\xd3\xdc\xa9\xe\xcc\xc8\x32\xc0\x9c\x45\x14\x1c" +"bB\x2k\xfe\x30\x90)\xa5\x62\xc3\xee\xf\xcc\xdc\xd4\xe\\\xf2\x65\xed\x9c=\xe5\x82" +"\x88N\xe\x14\x81\x9d\xb9\x8b:\xf7\x34\xb1\xb3'j\xc4\x1d\x43\x38N\xbes\x0=\x15\xce" +"9\xff\xcc\x4\x10\x95\x83\x39\xeG\xf\x43\x1b\x44\x7\xf9\x85P\xe1\x38\xf9lEd\xb4\x94" +"\xe5H\xfG\xc8S\xbd\xd2\x37\xe2s\x1\xf5^B\xa3\xbe\xd1\x8f\xad\xa1RW+{FZX\x1d\xbf\xe7" +"\xdb&\x19\x36\\\xf1mq\xbf\x8f\x9\x18\x62\xb9\xfc\xf0K\xf8\xd0\x85\x9av\xf4n{W\x12" +"\xf2u~\xdc\xe3\x32\xd3!;\x8a\x30\xac,\xe7\xd7y~\xefo0\x90I\x6\xb0\x80]\xfa|\xa3m" +"2\xa2\r\x98\x98XIzf\xcerI\x13\x93\xddy3 \x3\xd5\\\x9ZZ\xb5\xdfv\x1cK\xe5\xc0\x41" +"\xfa\x84\x7&=`NS\x9\x1f{k\x15IbE\xdb\xbe\xe9jc\xf1\xf\xc2\x97\x8d\x99\xe6W1(h\x93" +"f\xfe\x8b\xb\xad\xa4\x8bP\x18[\x86\x1b\xad\x3\xe3`\xf\"\xba\xd4'O%B\xb6\x35\xf6\xc7" +"\x94K\xef\xc3\xbct\x1b\xde\xf1\x1a\x8d\xd6Y\x3\x8c\xb4\xf\xef.\x16\xad\x1a\xe7\xeb" +"\xed\xb7\xd9\xba\x15\xfd\xcf&5S1PZ8m\xd7\x39\x9f\xb9\x99S]`a\xea\xbc\x61\xddv\xef" +">\xb4WDo)\xd0\xbbn\xc2\xfc\n\xab\xac \xb2z<\x12<'\xbc'\xa7\x63\x36\xd0\xa0\xa6\xd4" +"V\xda\x7\x3gM\x95\x9aJ\xfe\x42\x8e\"\x6\xa5\x11\xbf\xc8\x0\x39\xec\xd5nu\xf6\x97" +"\x86\xda\n\x80\x84\xd8\x1a\x66\x64M\xd9\x8b`\x18h\x1f\x1dp\xad\xe0\x9b\xd9\xbf=\x16" +"\xd6\x8d\xd5\xd0\xa0:\xe2m\xcf\x15RT\x9e\x45\x9f\xe1\x90\xb3\x10\xa8wk,\x84h\xc1" +"L\xa8\xb1\xb9\xa7\xaf)VPz;pZ\xd7Z\x17\xa0\xee\xa7\xfe\x8\x92s5<\xec\xd0{\xb8V4e\xec" +"\x8d\xec\xa0\xeb\x42\xf4?\xe3\x66N\xb5\xf3\x1e\x1d\x13$\x18U9\xb2\x8dP\x8b\xcd\x6" +"^\xd5v\xd8\x81N\xd3\xfd\x63}Wo\x2y'\x16#D\xaf\xb0%Z\x91\xff\xc6\x16\x94\x8eN5\x88" +"g\xe9\xfcv\xa9\xaf\xfa\xca\xeb\xff\xe1\x10\x80\x8c\x15\x32\xa2\xbb\xb0\xdb\xef?\x1" +"\xe\x45\xff\xc7?\"\x8d(\xf1.\x98G\x8b'9}\x8f\x45g\x81\xed\x9e\x19q\x1d\xf2\xe9\xee" +"\xcb\xc3\xfe\x61\xf7I?\xdf\x1aY\x12\x46h\xa9\x1b\xe5\x1f\x12/\x93\xdc\xa4\xbb\xd2" +"-\xee\xa3\x39\xe6\xed\xa3\xd6\xeb\xee\x3\xdf\x95\x81\x13\xe1\xcaI\xc8\x39\x8d,Y\xda" +"gd\x88.\xe3\x66?b\xa5Z\xe5\n~\x91\xb4\xfe\xad\x1b\x11\xfe\rP\xac\xcc]u\xf1\xa5\x15" +"\xf0\xc5\x36\x16\xa5\x0\xf1I\x13\x81\xdf\xd0\xe2G~@*\xb0\xcf\x9fg\xd5\x1\xa4\x42" +"b\x9c\x85\x93\xed]%\xa7.\xdb\x97\x46\xb0/+\xf\x7Y\xcc\x9c\xdc\xb4\xc9\xd8\xb4Q\x9c" +"\x8c\x61~V\x9b\x43/\xc\xf6\x89\x3r\xaa\x87\x9c\xa7\xde\x46\xe1\x10\xd9^#\nO\xeR\xcf" +"e\x81\x1cT6]\xf4\xa3\xe4\r\x81\x9e/\xd3y\xb4}\xa3#=\r\xef\xe\xfb\xce\x4\xad\x8b\xaa" +"8\x88Oji\xfe\\\x37>8\xae\xf\xd0$\x14\x80\xf2\xbe|\xcd\x18\xaf\x85\x91m'\x3\xa0Iw" +"\x9f\xe7\x39\x8f\xc4}4\x84T\xcf\x3\xf2.\xb3\xfe\xcc\x6\x46\x6\x95x\x98\xb5\x64\x34" +"d\x84TE\xc2\\\xc}h\\\x8d\xb0\x42\xaf]X\x82\x17\x43t\xac\xe9\x0\x81\xc6\x86x\x9b\xca" +"\x96\xac`.\xb4\x1d\x31{\xd6R)>\xe6(\x95\x18ud\x16\x61\xec\x86\xa2\xc4\n\x42\xe8\xf0" +"\x81:\x86\x1d\x41\xa0\xf5\x17\x8eUCe\x1c\xa0\xe9\x91PF-\xb5\xee\x0\x10\xf0\r\xe6" +"\xd5[\r\x7f\xd7\xec[\xae\xa2N\xd3\xe9\n}j\x5\x89v\x19\"\xb9\x1aj\x91:\x7f\xed\xdd" +";h%M\x89\xec\xf7g\xce\x8e'\xf9\x66\x42j\x8bO\xb1\xb4\x8S\x84\xfd\x9\xd6>(\x84\x5" +"\xb7\x8a\x64oD\xc8~\xee\"\xc8Yk\x13\x18\x80\x85G\x9fu\xf6==\x97\xa2\x8f\x9c\x83\x6" +"\xfd }\xbf\xd3\x8d\xed\xf0\xff\xeb}\xd8\xb*2\x92\xdf\xbf\x1e\xd6\x5\xad\xf1\xb3>" +"\x85\xb0\x10\x30\x9e>\xc0X\xfc\xd9\"\xb1\x32_\xeeq\xef\xf2\xdb\xbc.h\xdbR\xd5\x13" +"\xe0$\xc0\x1dG\xcf\x65{\xb6\x1c\x97\x34\x64\x9aJ\xb6<\n\xf4r\xe\xc3\xef\xcd\x82\xdd" +"<\xa6\xe8\xb\xb6;\xcf\x1b\x8d\xe8\x10\xa0\xc6\xc5\x17\xc6;v\xfeh\xc0\xb2\x86\x86" +"{\xe1\x2\x42O\xc3\x1cI7\x4\x8bo2=\x3\x96\x18Xo\xc2\x17\x31\x0]\x94\x9e}\x80*C\r\xf8" +"\xd2\xf0\xce\x99\xf2\xa2\x37l)S\xef\xc4\x18\x43U\xe4\xd1/B,\x9e\x1e%\xc4\xdf\x38" +"\xde\xa3\x34\xdb\xc8\x9bT\xe\x14\xc6\x1awi\xd7q\x15\xce\x89h\xfbv\xb2}\x8\x63\xce" +"\xa2Ig\x83\x11L$\xd4\xcc\x81m\xa8\x84\xd9S\xda?\x9b\x9d:\xf8\x93\x8b\xc6\x7\xbf&" +"\xa0q\x95l\xa0~jU\x9\xea/]\x80\xe5\xcb\xeb\x98\x4\x1b\x19\x7f\xacv\x9v\xeeu\xb4p" +"\xdc \xaa\x2;\xa3\xf6<(v\xeb(\x1f\xf5\x17;\xb4\x90\xd6\x81V\x4Qz\xa1\xb1\xfa\x6\x31" +"@\x1b<\x1a\x4\xca\x10>,\xa4\xec\xcd\x83\x87M\x9c\xfc\x8a\xbc\x13L\xc0\xf9\x14\x1d" +"\x9a\xfaV\x84\x8b\xf2\"\x34 \x16\xc5V\xc1K4\x82H-\xce]\xbn\xf1\xabR*\xa1\x81+\xdd" +"\x8d\xd3\x39~\x5\x32~\xc1'H\xfcH\x8\x42\x9b\x97 .$\xe1\xde\xc|\r',\x4k\xa7;7\xd3" +"\x9\x30\xc5\xdeZG\xd9iU\xcb\xf]\xed\x8f:\xd9)\xa8\xb4-(9\x4X\xf5\x91\n\xf\x93\x61" +"\xfy\xed\xdb'\x7\x89\x43\xdf\xe1|qme\xf9\x65\x89v\x93I\xf3\xb6j\xb7\xb8\xc0\x4\xcc" +"\xc5\x9e\xf6\x88\x1ft^\xc7\x12\x98\x65\xa7o\x9c-\x2\x9d\x46`\xcc\xfbM_\x9d\x41+\xa3" +"7*'\xcb\x17^\x9d\x65\xf7YW\\\xf1JX\x99\xa8\xd3\x1f\xf0\x39\xac\x2\xdb\xd8\x39\x1c" +"3\x97\x42\x8a\xc0\xd5q|\x0R\x0y\x7\x85\x35H\x13\xc8\x85\x9b\xe9\xe\xe\x17\x91Ol\xb9" +"\xc6t\xf1\xe9\xa9\x64\x86W\xb5N^\x1fRulO\x98-\xf7Ns\xf6\xe4\xd4\x7\x18\xc7\x1d\x1d" +"\xe$ \xfbtb\xfe\xc9\xe4W\xc0\x41J\x96\xe4u\xc6\xbe,\x10\x43p\x96\xfc\xa0\xc9\x42" +"\xe9\x95\xa9\xad\xa7\x89\xab\x63{d\x87\x81\xd3-\xfbh\xe6.\x91\xc2\xce~\x13h\xf\x8d" +"1\xec\xf8\xc8$\x88_\xa7\x61\x89\x81\xcd\x5\xfb\x33Z\xa1\x11\xb4\x9\xc5\x9e\xe3\x37" +"\xdfN_\x9d\xcc\x92\n_\xc0\xd6 \xdc\x7\xf2\r\xad\x63\xf4\xff^\xe\xe5\xa2\xf3\x90\xaf" +"\x1c\x32\x12+\xa7x\xf!\x2)\xe5\xa5\xe3\xed\x97\xbc\x1c<\xdd\xdd\x45ns\x9c\xa7\x82" +"\xed\xbfK\x81\x5R6\x8e\x9csK\xcx\xb0\xb8\xe3\xf8\xb2\xddx(b\xb7\x43\x18\x87\x1b\xb1" +"\xef\x8x(\xcc\x17={\x4\x98\x11\xfc\xf5\x98\xb8\xef\xdeM\x9b\xc5\x44\x7fHH\xc9\x80" +")\xc8T\xf3\xae\x46\x1b\x9d\x46\xdd\xad\x8c\xe6zR\x1f<\x81\x1a\x81\xa3\x96\xcb\xf" +"\x80\xf3\xc8\xd8\xec\x88\x30S/\xb7\xf9\x62O|\xae\xf\x8cm\xf8u\x7\x33\x33\xde\xb2" +"\x8a\xaa\x90\xaa\xf4\x86\xab\x8c\x93%S\xcei{\x88^q\xec\x8e@\xc7\x83\\\xd5\xd5\x9a" +",i]\xb9\xe5\x12\x16\xff\x9bw\xa1[\r\xa6\x37\x17\xff%\xb0[\x93\x9e\x45\xcf\x7f\xbe" +"I\xeQ\xe9\x34\x42\x13\xb3.\x11\\-\xe1Mv\xdf\xd5\x84P\x88\xde\x64[\xeu\x4*a\xd8/\xb1" +"uZ\x9kh\x1d;\xc5\x1a\x9f\xf3.\xba\xff\xf7\xec\xa8\xb5\x9d@\xf0" +"\x93~\xef\xf3\x83\x12\xaeWF,{\xf3\xb1\xfe$\xd2\xba\x8d\xfe\x84QRp\xe0\x90\x63\xce" +"<\x80\xdfI5\xe4\x9\xf6.\xb4\xf5J\xf1j\x18mC)\x97+\x9b\xdf\x15\xfb\x8\x46\x1bh\x8e" +"\xd4\x99(B\x92&\xca\xd9\xf6|\x9d\x63m\x13u\xcb\xb7\xb0\x8aV1\x95k\x7f\xe2\x9c\xc9" +"\xef\xa8\xd7\\\x9eI\x19\xc8\xc2\xc5O@\x1d.\r{\xfb\xa4\xcP\xca\xe2\x14\xd2\x10\xc6" +"\xf3\xeaX\x2\x33\x9f\x63\xfcL\x1c\x19\x95xv\x17\xf3\xec,\x80l\xe4L\xf8\xe2\x9fv`" +"l\xd5\x83onZ.B<\xd7\x91\xbe\xcd?\x11/%e}\xfe\xd9\x36o\xc4\xad\xf9\xbh\\\xceJV\x98" +"\xe5\xfe\x16\xd7T+\x91?\xbc\x1\xb2\x88\xdd\x13\xf4=\xb2\xb1\xed\x8c\xcb\x80\x15\x9d" +"\xbd\xc9\n\x81\x32\x12]\xf8\xdfT|HQ\xca`\x9d\x1foMdwA&\xe\x84[Ey7xx'\xa8\x9e\x37" +"\xcd\xa0k\xb1\x91\x66\x9a\xc8K\x86\x8\xea\xe1\x32\xd1\x1w\xf3\xfc\x38I\x80\xf3\xa6" +"\xe4\x39\xb0H\xa3\x8d\rk\x9c\xef\x9\xf3\xf2\xd7\x32\xaaq\xbd\x5\x81i\xd6\xd0\xf8" +"\xc9\xd1\x46\xd9\xda\x4gt\x2uY\xa8\xb3\x84?a\x16\xb4\x18\x42~xGj\xd8\xf0\xf8\x1e" +"\x8ak\x12\x9\x80`\xff}\xd6\x86P?\x97-lB\xfdl\xc2\x9c\x8:\xc3\xd7.7Q\xf2\x1d.D\xa5" +"r\xee\xc8\xe\x81\xee\x44\xc9\xf\xaaz\xfa\xbc\xd3\xec\xeb\x98\xfd@h\xf6\xc3\xa4\xde" +"\xd0\xe6\xce\xc5#\xc9\xa0\x5M\x1f\xc2\xa8\xd6\x1aJ&\xf9\xbc%\xb\x8f\x30$\x16\x92" +"J\xb2.r\"\x97\x88\x8b\x85\xb9\xc1/\x8d\xfd*tL\xbd\x14?\x9b%\x14\xc1\xcb\xe9\x88\xd9" +"\xcbNw\xd9\xb.\xfd\\*R\x83U\xa3_|J\xf0\x39\xc7\xd1\xd7V0Yg\xb8G\xd4\xac\xbb\x81&" +"=I\x92\xc0\x1\xe2\xa2\x62\xb9\xfe\xe2\xd1\xf5\x2+\xe5\xb1^\x1d\x8f\x1dg\xbcR\"sD" +"\xee\x91,\x1\x8c\xb7>_G\xce\xd5O\xd2\x2\x62ww\xbbw\xaa\xcf>\xe6\xb2'\x6\xfb/\xa9" +"\x6+\xee\x87\xe2,\xd2\x80.w\x6\x32&H\xda\xa0\xc6$\xea\x88T0\x17_tn\x1fSo\x9a\x8e" +"\x1c\x61\xcJv\x1d\x7$\x84&\xdb\x63\xc9\x31\x9a\x88\xa3\xfa\x44\x9c?\xb8\xac\x94\xc6" +"\x0\xdd\xd6\xfb\xebSJ\xf1_t\xf6n\xf8" +"\xd1N\x7f\xf7}\x8a](L\x82\x2\xddZ`S\xce\xaa`k\xf9%\x99#\x82^\xf4\xef\xfa\xa8\xd8" +"xe*L\xaf.\xe4>\xd2k\xf3Y\x4\x2hl\x87o\x86\xc1\xae\x95\x4nRv\x17\xcd\xd3\xc4)\xbd" +"L\xc3\xf9\x65M,v\xdd\x41\x2G\x1f\xf7\x46\xfa\x9f\xa3y\xb1m\xf9k\xfe\x38\x36\xd4?" +"\xcc\xb\x8e\x95\x12\xc'7\x0I\xac\xa4\xac\x31>\x1dP\xd7-\x18\x14\xf2Vk\x8b)\xfa\x9c" +"\x9c \xd0H\x87\x43r*vd6wg\x83\xb9\x39\x17\x1f\xff\xa0\xe\x4\x80Z\x8bX!MO\x11O{\x9c" +"<\x17\xcet\x86\xae\xa2\xbc\xc8\x95\xec\xde\x80\x95\x2\xbd\xe5y\x81\x31\x8a\x93\xf2" +"0\x16\xf0V\xa4!\xb7\x33\xc4Y\xe\x34\xab\x8\xbb\x34\x8d\xa4\xa4\x8f\x19\xb6\xbe\xfa" +"\xa1\xdd\xd2\xa4\x9alD\x4\x43\x2\x83\x33\xcd\xd4\x8c\x85\xcdi\x8a\xda\xf3\xfd\x86" +"vs\x9e\x44@\n\x98\xb5u\xbe\x2\x35\x5v\xf9l\xfaT\xd4\x18K\xa4uU\xb8\xd1#t\xb8m\x3" +"\x8d\x8_\x7f\xa5\x1f\xf4\xbe/\xf5\x98\x14\x8\x99\x9bH\xb2\xfa\xf3\x5!.\xd5K.7\x1f" +"Z\x0t\xcfh\xd1\xb0\xe5\xcd'\x9b\xbc\x8b\xba\xefiJ\x89\xa6\xc4?Q\x8d\x1\xbbN\x84\x2" +"\xaa\xdf\x34\xe9n\x9b?\xcc\xabL\xbe\xa2t\x1d?\xd9\xad\xf7\xaf\x32\x38\x8fwq\x84Z" +"\xf9\x99\x65\xa6\x7\x8fM\xa3\x35\xef\xa4\x36\xbe\x36\x90>3\xa7\x43\xc1\x12\xc0&s" +"\x9\xf2\x66\xdd\x44\xfa\x99\x8c\x9a\x13\x97\x4\xe4\x0\xb8\x9d\xab\x95.\xec\xfe*\xc0" +"\x9c\x82\xd9\xf4\x97Sq\xcc\xc2}\xa3x\x90\xec\x84\x12\x31\x93\x31M\x8azp|!\x7f\xfc" +"\x95\x1aT~\xe5\xb6\xd1\xb7\xc8\xed\x85\xbe\xbd\x9d?K\x9b\x9jx\xe5\xf7\xdf\x88\xc9" +"1\xe3\xf3\x96\x97\x39tENY4\xc\xa5\x1d\xbf\xea\x1a\x0\xde\x8Kdc\xe&\xc6\xd6\xa3Y;" +"\x82\x88\x14\xe2}\xb0\x18k\xf2\xa8~\xef&\x8a\xa1\xb1\x35\xac\x9\xb5,\xfeS\x5\x1c" +"\xbc\xc8\x8c\xecVW\xbdG\xf6\x3\xc8\xe1\xa6$\x91\x61hO\xd9\x8J\xc2y\xf5zO\x9b\xbd" +"\nTj\x87\xe1G\xb6*\xc8`\x91\x19i\xa2\x9b\x8a\xa2\xe:\xaa\xd0\x7\x9d\x64\xe6\xbf\x1b" +"\xf,\xe8\xf0\xc5L\x90\x19 ~\x1b@3X%\xb6,j\xfa\xd8\xa0\xd7\xad\x16)" +"\xf2\xce\xca\xd8+\x8f\xde\x38\x97S\x3v\x8c}:\x8\xb9\x14x\xed\xb3\xc4Z\x8ckw%\xea" +"\x85\x96\xa8\xedP\xb8\x35_\xb8R\xfb\x89\x66G\x9d\x12\xe1\x8\x62#\xb1\xe6R:e\xfb\xa8" +"\x1d\xd1\x6\xfe%Os\x9q\x87h\xab\x0\x9f\xf7qJ\x8c\x36;\x9\xdd\xa7<\xd3\xf8\x1b\xf9" +"\xc0\xcd;\xc\x80l\xf3\xb7\xbb\xfa\xb7>F\xfa\xca\xd2H\xe\xeb\xa9z\xe6\x8e\xc9M=y\xaa" +"\x1\xec\xc2 g\x85\x8e\xff\xa9\xd7\xb7\xf9\x97\xab\xd2\xceZ\xaa\x87\x81\xe5I\x9e\x85" +"\x80\xc4\x5h\x1c\xc6>\xeaS\xbbG\xe5^\xcc[\xa2\xa7\xa3\xc5G-\xf0\x34\xb0\"\xf4U\xc6" +"\xf\xff\x97\x1b\x1X:)\xe2\x11\xa8\x7fqc\x18{\x19\xb\xc\x10\x83\xd6\x96\xb5\x86\xe9" +"C\x8f\xd8\xba\xa4Q\x1\xa5\xed\xcd\x1b\xe5\xab\x9aXU\x11\x8\x9d\xda\xc8\xdf\x1b\x1f" +"\xdb\xe5\x82\xab\xd9\x45\xe6\x7f\x99\xad\xc4\x45)\x88\xa9\x85\x9e\x39\xc9\xe\xf7" +"\x94\xc5\xc4\xe6)\x97\x8[z\x16\xa0\xd9\x1\x7\xd0\x86\x10\xba\x17Z\xd6\x63w4Vb\xda" +"}\xa4\xd8\xfe\xf8G\xee]W\xe3\xacT\xb9(\xa0\x95|\xc1\xc9\x44\xe7\xff\x14\x65\x8f\xe4" +"\xa6\x41\xcd&\xc6\x11\x5\xc0\xf1\x36\xa7YPvKi\xca\x17P\x9e<\x19\x35\x1d\x45k\"\xc8" +"|U\xe8\xdc\xc4\xac\xd3\xe1P\xd9\x36\x33?\xf3\x64\x99\xadk\x2\xb6@=\xe0\xf1)\x1\x30" +"\x1e\xcb.\xba\x10\x32K\xa7+X j\x13\xb8\xf3{\n\xeb\x12\x11]\xc\x12\x87\x9c\x8e\xa8" +"\xa2\xebp\xe8\\\x95\x43\x45\x64\xba=\xffH\x1c\x89rX~\xfft\xee\xbb\xba\xb1O\xb3+\x8a" +"\x84\xb8\xfc\x42\xeb\xec\xa6]%\xe8\xc3,\x19\xcaYb\x83+\xf4]\xfd\xa4\xe8qP\x8a\xec" +"1\x84\x95\rm\xbe\x89\x1\x9c\xea)\xe4\x4\x84\xc3n3\xd7kubUS\x1a\xdd\x1d\xb2L\x3\xb2" +"\xa6JG\xbd\x8f\xba?\xdc\xb1\xf5\xb9o\x8e\xec\xb6\rX4\xab\x0\x1apt\x4\x98r\n\xfbn" +"\xc0\x34\x45\xcc\x35\xb5\x1fy\x87\x10\x96\x18\xc6\xc7\x8c\xbe\x30\x41\xbe\xdci\xb6" +"\xfb\x12\x81\x42\xce\xc5\xc8h;U\x8a\xfe\x30$\xef\xf7\xa1-\x4\xefY\xa7.\x15m\xf1\x1d" +"3\xab\xa0\x8a\x8e\xeb\x16%\x9d\xd9R\x9c\xd0\x3\xadN\xf4\x13{o\xf1\x65\x42\x36G=\xfb" +"\x93\xf5\x97\x33\x1a^&\xc7yoR\x8f\x65\xc9O\xe0{;OM\xd4\x90\x34\xfa\xc\xc1\x89\xdf" +"\xcd\xffp\xc2\xf1\xc6\xd3\xdf\x30\xae\x10>*\xc5\xcf\xf2\x6\x64\xab\x93L\xe5\xc1\x96" +"\x93) q\xc9;\xd5\x90\x38>\n\x19\x31\xe0M\x1d\xdd\x18\x7\x1d\xaf\xb6(\xf5\xd7G.E{" +"\xf8\x1d`d\xed\xfa\x8d\xeb\xff\x91p\x1cP8\xcb\x30\x86]a\"\x7j3g2\xdb\xcd\xb0\xa6" +"%T\x87s\xd0\x1\x36H\xa7o\x7\xbb\xdc\x9c\x16(M\x15\x8e\xc7\xa1\x5\xae\x37\xa6\"yA" +"\x9c:/6\r\xczt\xd6\xfd\xd0\xe3m\xca*\x8b\xd5\x99\x45\xa4\x19\x65\x98\xf6\x90\x87" +"\x8f\x84\xc8\x94\x85,\x18\x11\xaf\xeaK\xe3\xb9\xf6\xa5!\x9e\x66(\xc6\x66i\xdb\xd8" +"\xfa\x9a\xc\xfc-\xdew\x16\xa3V\xfcO\xb2q\xd8\xa2\xcd\xdc\x8d\x46\x84\xde\x44sU\xbc" +"z(}\xc5hR\xa6\x38\xc5wx&\xebn\xb7/\xac\xcc\x86\xf8\xb\xed\xdd\r\x64\x9a\x88<\xfe" +"\xefMtu\x1r\xa9\xb]\xd8%%\x92\xfc\xfe\x19\xff\xaa\xd8h\xe9\x95\x62\xda\xea\xe7\x5" +"\x14\xf5\xde)n\xf7\xb5~o\x19\x37\x37\xab\xb6\xaa\x31yVXD#\x81~\x11\x66Jg8\x91\x97" +"\xad\x9f\x8fw\x1e\xa5\x95Q\x98\xc9\xee@\xa0v\x16\x39\xe6\x38\xce\x9d\x89\r\xf4hd" +"&p#_\x13s\xd3\xack\x1f\x43\xb5w\x7f\xc0\xa9\x1a\x96\xe0\x95\xe8\x9b\xb9\xfd\x62\x61" +"M\xe4V\xcez\xfdk\x85Q\x12\x36us\xfd\x9f\xcb\xbdJO\x9cgng-b\xdd\xd3J\x9b\xfe\x83\x11" +"\xb6\x17Z\x0<\xd1\x43\xc0\xdf\x15\xe4\xc0\xb4\x8csT\x4\x8nH\xae\xedko\xa2\x1f\xd9" +"\xf4\xb\x84!]\xff(\x7f\x6w\x90N-\xdf\xdawJ@\x19\xdf\x45\xcc\x87\x7fU>\x95\xa1\xc6" +"]\xf1\xd6{\xc0\xc6\xe\xb\xbaM \\\r\xa3\xda\x80\"\x9f\xddq\x85\x9f\x65\xad\x4Pk0\x8c" +"+x89\xf3\x1c\xfe\x44%&2$\xf0\x8c\\~\x98\xa2\xc9\xd3\xdc\x8e\xa5\xac\x19 \xf4\xe3" +"\x95\x41\x32\x62\xe0\x83k\xc0\x19\xa0\x92\xa0\xde\xca\x10N\xb2\xdfkc9*\xe8\xe2\x13" +"cy\x14\r\xe5\xfc\x98\xb0\xb6\x98`\xfe\x8e\x31\xda\xb5\xc5\xdfx\x7\xd1\x9b\xea\x34" +"\xac\x14\xe0\xab\xc6\xf6Q\x9cQ${\x10M\xe7\xd9\x12\xc5\xbfn\xf1\x1bH\xfcm\xf8\x45" +"\x12\xe9\xf5\xfe\xbbH\xf7/\xf1\xb7\"\xbd\xc3\xbb.\x83[.|\xc6\x32K\xee\x84\x89\x39" +"\x96\xb8\xdc-M\xc2y:Oi\xc1\x8e\x63\xda\xf0J{\xb5\xc0\xa9\x7n-Z4>\x13L\xc3\xc8\x9c" +"G\x12\x90\x6V\xff\xc2\x2\xe1\x98\x85&\xd8\xc\x7f\xd9(\x1f\xe4\x7f\xba\x8a\xb5\xd0" +"%\xe6:\x84\x5\x1fk\x13\x16{\xec\x15\xb3\x46!,\xbd\x5\x1a\xfez\x98\xbe:$\x91\xf3\xc4" +"iq\x8aX\xe7\x83\xed\x91\xf9\xe'O\xb4\x97\x8f\x87\x19\xe9*\x99\xa1\xe8\xf1\x42\xea" +"~\x1f,F\xaf\xf0\xa2\xfbP\xf4\xd1\x5\x13\xc\xe8\xea\x30\x9b\xeH\r\xc8\xf8\rPar\xb6" +"\x9\xeaK\xb4\xe2\xbb\xae\x98\xd8\x88(\x14\xfb'>i\r\xa9\x90\xb6\n\x9c\xda \xa2\x41" +"\x82\x46\xbd\x10\xaeg\xd8\x46\xa0\xfa\x81Z\xc2XX\x14Z\xdd\xa1\x6\xa6w\x8a\x11\x87" +"\x7f\xe5\x9a*\xbe\x30\r}\xb9\xbb\xab\x31\xcb[\x96\xb~N\xf9\x1d\x46\x0\x88m\x87\x95" +"\xdc\x36\x1c\xbd\xdd\xde\x5\xeb\xd5K\x19\x41\xf4&\xf7\xfa\x83\x99'\r/T\xc9\x98\xbe" +"\x92\xd1\x46\"rp\xa8\xe8\x9a\xf9\xcH\xba\xfcN\xcc\xca\x1\xe6\x32*\xfc\x16WCG^u/9" +"\xbd\xae\xc4\x92\x97)\x5\x10\xff\xa2\x64\x34*\n\xfe)\x85\xf8]\xee\xc6l6\xebJ\x1d" +"Fh>\xe7\xc5\x91\xa8\x9b\x81V\x9a\x85\x66\xaf\xbc\xa2h\x10\xdd\xb0\x97\x5w\xa7n\xc8" +"\xa0\x66\x62&\x6\xb0\x83\x15\xdb\xf.lg\x1f\x32Y\xc7\x36\x37\xd7s\xd1\xa1\x80\xaa" +"\xd6j\xda\xda*e\x95\xb5\xf4\x81\xe5\xf5\x9eQ\xcb\xa8v\xfa\x6\xd2\x1e\x1dgL\xfa\xb4" +"j\x2\xd2g\xe2\x2\x34\x32M\x8\x91\xe7\x84|\x13\xc6\x9b\xfc\xee\xa3\xacU\xf2\xea\xf7" +"Srk\xce\xb0\xde\x1e\xec\xf4*\xda\x96K\xf9\xe4u\x95\x33\x2\xc2\xfc\xa8\x4\xb7\xbw" +"\x94\x82\xdc\x93\x19\xb4\x3\x81\xe0\x9c\x0\x96\x46\n\xe1\x13\xc1\x9a-\xc9\x15\x7f" +"\xa1\x38\xcf\xewX\xf7\x10\x8\xe7\x1d\xfu\x99tMd{\x9\xb1n\xbf\x14\x37:\x5\x87X\xc4\x42\x93\x9d\x36wD5UHQ\xe9Q\x9b" +"o\x9\xc3\x1e\xf2kl\xd9\x97\xda\xfa\x11\xda\x91\xfa\x97Y\xf1{py\x16L[G\xb9\x9c\xcb" +"z\x87o\xba\xb1\xd0\xd5\xd1\xe1\xa2h<\xd6\x91Nk;uY9\xce\xf1\xc9\x16\x8d\x30\xb2s\x8c" +"CIe\xc\xf8l\x90\xd2T/\xc9\xb9\xf\x36\xa4\x94\xc0\x35\xa1\xc8m\xd7\x16\x1J\xa1nk\x9e" +"\xc7\xaa\x3\xb1\x65T\xbe\xc4\x36Q\x1d\xd3\x9\x7f\xab\x1f\xd0\xcdI\xed\xab\x96\xf7" +"N\x8f\xd2\x64\x0\xfct\x8c\xbd\x9e\xe1\xee\xae\xe2M\xa3\r\xb6\xf8sKR\x81\x8b:^Q\n" +"\xa5\xc1NB\x6\x8\x98\x3>~6\xcb\xa9\xa6@B\xcf\x94\xa7NKR\xe3z\xc0'\xc0\xdci\xba\xc4" +"\x94L\xce\x12\xe7\xad\x81\xae\xdc\xe6\x42\xec\x34\xca#\xe3\xff\x7\xb8\xcd\x35\xdf" +"\xf1\x9f\x33\xc8\xd4\xdb\xb5jRSO\x8a\x82{\xe4z\xd4\xae\xdc\xad\x83\xb2s8@\x9f\xd1" +"\x10\x1cM\xff?\x12\xd3\xdfy\xad\x1f\xce\x65\xb2\xf4\x19\x45\x1d\xd0Y\xc8\x8b\xf0" +"fA>#\xde'\xd3\x62\x1d\xac-\xcc\x8f\x9f\x36 \xda\xd0\xf4\xb1\xa6\xe8\xc9\xe6\xe8\xad" +"\xb5R\xe1\xeb,K*;s\x98j\xd5>\xd9\xed\x89\x11\xf8/u\r\xf0\\\xd2\xeb\xa3\xe1\xb0\xdf" +" \x8a\x87\xfb^\xd4L2\x96\xb8\x3\x88\x1c\x1d\x97v\xd1\x33P\xcd)\xc3\xf7\x16\xf0\xb5" +"\xa8\xb8Ux\x12\x2K\xa7\x0i\xbe\x65\x89\xaaW\x9e\xad\xb1\xf6Wq-\xf2W\x8\x43\xd7\xc5" +"\xff\x7f@\x9\xd4\xd2\x32\xd3T}\xc8\xb9.\xd5\xc4\xdbw\xb7\x62U\xe6\x61\xff\x8b\x16" +",a\x91K\xd7\x96\xef\x8a\x8s\xf7\x9f\x96" +"O\xde(\xb7\x92\xba\x99\xa2\xc?\x1f^\xd1\xfd\x18\x9f\xb1\x86|\x84\xdc\xd6\xaf\x43" +"\xd4\x94 \xc8\xb1\xf3\xdc\xe7\xdb\xaeq\xde\xb1\x7f\xe4VD\xdb$OD\xb1\x1\x1c|v\x8e" +"\xbbrT\xf4\xda\xca\x64\xe9\xba\x87\xaa|\xd0\xf0\xc4\xb2\"\x8f\xfb\x9e\xbd\xcf=\xde" +"M\xce\xd3\x93\x99\xff\xeb\x34\x88\x11T}\x2S \xa8\x8bH\x9\x43\xa3\x39\xe2\xcd/\xa3" +"`Z\xaa\xe8y9\xb1\xd7\x90\x14\x65\xa1\x87\x9b\xcbL[\xe1\xa1y\xe7\xe3q\xf1\xba.\x8" +"D\xf8\x8a\xfb\xae\x9bx\xdc\xcaG\xae\x8a\xed\xf5\xbd=E\x8c}Jz\x8\xac\xcb\xf8\x80\xd1" +"\xf1\xdci\xc6\x36\x62\x8d\xf1\xeb\xdc\\\x42\xff\x88\xff\x8b\x66\x35\x1f?r\xd7\x3" +"\xe5/<\xe9\x1eN\x0u\x97S\xa5\x99\xfd\xd8\x63x\x8e\x99\x85\x84\x98\xb6k\x93\xe5\x8" +";\xc3P\x1c\x39\xa9\xba\x92\x8b\rv<(\x82o\xd2\x37\xe9I\xef\xb\xa8\\\xca\x9a\xa2\xc" +"@]\xb6\xd5\x61-\xb7\x18\xf7\xb4\xad\x31\xd2S\xae\x30nM|\xb6\x15\xc5\x9a\xe6h\xd3" +"G\xa4\xe6\xf\xff{\x10?\x8b\xd0\xe7\xcb\xdb\x14*v;\xe8\x8a\xb4\xe\xefk\x8f\xc2\x0" +"E\x8dr\x89\x30\xad\xf\x94\xfeR\xac\xbf\x6W\xc4\x90|\xc7\x94'\x10\xab\x1f\xd8\xbd" +"\x14\x9a\x9c\x9d\xefk\x8d\xca}\xb9\x6*\xa7\xb1\xb0\x11\xab\xb5\xaa\xe8\xb7x\x93\xa0" +"#\xf9\xee\xee\xd4\xa2\xf\xbc\x30\xf9\"(*z\xe2\xf1\xac\xff\x64\x15\x10\x13\xd6\xb8" +"\xac.\xaa\xe5\x81q\xa1\xf\x80\xbc\x18\xc3\xbb\xb5\xde\x1e\"\xeb\xe6\x3;\xf8\x30@" +"b\x90#\xd7L\xcb\xab?\x19#\xcf\xa4\xa6s^\x1d\xfa\x8a\x1b&\x1f\xbf\x1c\x39~&\xf3\xba" +"\x9c&)\xcf\xda\x84\xdf\xa3\xd1\x8~\xbb\x19\xdd\xa7\xe2\xd7n0\xdc.\x15\xb8\x82\x1d" +"R\x91\xda\x1d\xfds\x94\xeU`\xa8\xa6\xdc\x91\xbe\x0u\xe3\xed\x8d\x9e\x8c\xac\x85\xac" +" v\x8d\x86\x8c\xd2\xdc\x45\xde\xad\xcc\x8bY\xaa\xben\xe5\xb2\xf8\x91\xe0\xd7\xcb" +"\xae\x82\xf\x83G\x93\x32\xbf\x97\x7Hf\x98\xfe\x19lr\xefr\xb5/T1C)\xfcI\x81qx+\xf1" +"`\xe1\x11\n\x19\xb8 \x8f\xc5\x91\xef\xf\r\xa7\x1a\xf6W\xb4:|\xc6I\xa8H\x8bu\x9f{" +"i\x13KO\x9d\xcfy\xda\xeb\xc1\xceR\xcc\x80\x15\xf3$\xc9\xd4\x63 \xf4N\x15Q\xed\xa6" +"\xd8\x61\x39\xdf\xd1\xdb\x81L\xf3\x8a\"\xa8\x9f\xab\xb4\xf7_\xb8\x96\xb0\xev\x98" +" \xf7\x63Hn\x86\x66\x82S\xcc\x46l\x15)\xa5\xa9$\xcc\x33|HD\x88Q\xa3\x81\xdc\xef\x63" +"\xa0\xa3\x2\xb6R\x3\xd6W\x1a\x1d\xd1\xfb\x9d\xc0\xc3\xbdj\xefH\x91Ip3\x10\x9c\xeb" +"ZH\x1b\xfe\x44\"I\x94\xe\xc5@\x96\xf1\xd0\xf2\x43m\x9e`I]\n\xcf\xf9g\xa7\x41\xb3" +"\x4g\xd2J\xc6\xb0\x3\"\x13\x18\x66k\x95\x1e\xfd\x45\x32I\x87\xb1\xb\xefJ\xaa\xf\xf1" +"\xdfh\x87\x37z\x7fp\xf5U\xdf\xb9\xff\x10\x1\xc6t8\xa1g\xa0\xb\x5\xd2\xc3peeQs\xa7" +"\xed\x9a\xe3\x42\xdf\xa1I\x7f\xb1\xf2\xfe\xd6\x9\x89\x1$\x9a\x8]1\xb6m\xbbj\xc2^" +"\xf1l\x10k\no\xf3G\xcd\xf6\x64\x34\xdc?\x0\x12\xda\xad\xe8\xb\x94-R,\xd5\x9a\xf4" +"\xc3\x1c\x1c\x6!W\xb3\xd0\x0\xb9\xcb\x86\xe2\xaa{J[\xf3\x16\x5\x8a\rZ\x14\x8e\xaa" +",g\x97\x7f\xaa\x9\x66\xe4\xc3\x45N\x8\xdf\x14\xc2I\x8a\xd7n8\x9a\xf6],\x13\x9am\x86" +"u)\x8c\x46\xac\xeb}\xbei\x4\xc3s\xc0n_q9\x9b.\xda\xb@\xab\x96\xe8\xbe\x99\x1d\xdc" +"9\xf9/\x1d$y\x7f\x9e\xc9\xf2\xfa\xe2Vi\xb4\x37T\xe2I\x8e\x8e\xa5\xc4K\x17l?\xb3\xe8" +"\xf7\xa7\xa1H\x12u\xa4\x61\xf2T\x9a\xfcL\xc7>(A{\xd8\xc5!,\x13\x10^\xab\x96}\xaa" +"g\x9a\xe8\"\xb9\xb7[7*\x99\xc7\xe8-k\xd8:\xa2\xba\x0\x31M\xa4\xacQ\xb9\xca\xa3\r" +"\x80Pu\x5\xbe$\xba\xd0\xa8|]]s6\xed\xf6\xc\xcaL\xec\x82\x1\xd2\x43\xc3\x93/t\xd1" +"q\xe2@\x9dx\x9a\xad\r\x4\xa7\xbb\"\xfbm\xc3\xab\x92\xae\x33\xff\xea\x89|HMt\x10\x39" +"\xf3\x8c\x31~\xa3\x96\xa0\xfb\xb9\xf1Z'\xd8\x7f\xcb\xe0\x7U\x87\x99\xba\xb7\x32\x12" +"\xb6\xe5\xfa\xf2\x8\xb\xa0trN\xac\x87\xd8\x81\x66\xdb\xc1\x46L\xf5\xd4\x1b\x99\x42" +"\x88Q\xff\x1d\x99$iDQ\x1c\xf4,?\x92HQ>\x9eQY?%=\x89\xc6\x4\x38\x8a\xd7\x13-j\x16" +"\x9e\x9d\xd8\x88\xe0 \xac\x1f\x8b\xa6\x6\xf2\xe1\xeb\xb9yw\xe5\x5\xd8\xc4\x8Se=\x8f" +"9\x8fq\xcc\x9f\x8f\x9cT\xc\"\xa1\xe6\x19[\xa5x\xaerb\xfc\x84_\xcc\xf7{3\xf3>\xef" +"&d\x89\xaf\x8b\x81\xa6\x15\xd6\xa1\x34\x64\xbc\xa5\x8b\xec\x16\xc2?1\xd6x\xf1J\x93" +"\x8b\xec\x31'-\xac<\xcb\x1b-\xaeWz&\xbe\xd8R\xfcY\x84\x31v\xa5\xfc\xfc\xfa\n\xb7" +"\xfb\x0\xd2\x30\x9d\xe5\\\x82\xcb\x90I\xf4O\xa6\x1f\x1e\x31\x32\x5\xa7\x63\x17\xc4" +"\xcfR\x9a\x44V\x1\x9d\x97\x6$\x12\x96\x81\xf4j\x9c\xd7\x95\xb\x8b\\@a\x85\x30@\x11" +"<\x81\x15\x31\x9eh\xb3\x7f\x88\xd8\x64\xc6\x95}\xf8\x13\xb3\x5\xd0\x9ej\x17\x16\xb1" +"\xf&\xf2\xef\\r\x7f\xc7z\xab\xbas\xe1+Z\xe6\x41j\xb1\x9f\x65\x63\xce\x14\x4kq[\xd4" +"\xcb+\x1eM1_B\xd1\xft\xcd\xed\xe8+\xcd\xd5$\xa1\xa5\x46\x9!\x90\x84\xcf\x1c\xda\xbf" +"\xe7,\xc8\x37Tx\xb4\x16\x14\xbc\x18\xa9\x14\x90\x35\x96\xd6\xfc/6\x1e\xe5\x19\xf8" +"u8_N\xcbP\xf7\x5\x31'N\xbd\xeb\x14\xa5\xdb\xd9\x6\xa6\x8\x17$`B\xe3y\x9b\xb3\xac" +"d|\xdarD\xb7\x99\x8a\xe4\xf3\xbf\xbe\\v\x7f\xd2\x14.HQ\x8a\x42\x17Y\x9e\xe\xc2\xcf" +"^\x86\xc8\xc2p\xff\x8b\x2\xf9I\xee\x0\x1djC\x9b\xcbK\xc7\xd7\xf7\xc8\x16|:\xe0\xa7" +"\xe5\x96\x87\xfb\x8b\xf6\xf3{\xea\xa1\x64T\x1b\x8e\xaf\xd9.\x9d\x15.?\xd0\xf4\x13" +"\xc9\x9c\xcc\x34\xfc\xd8\xaa\x45Z\xbU\xde\xc8\x46\xa5\x87K\x94\xfc\x95\xcf\xf1\xbb" +"8k*\x1e\"\xcd\x1c\x39\x14&Km[\xd1tir\x85|\x92\x35\x5-w\xa6\xc0\xdd\x30\x19\xf8\xa3" +"\x7\xfb\xee\x63\xa3\xef\x12\xb0\x39\xb2$\x10\x82v\xff\xa8@!\xf1\xac[t\\Ti\xb?\xf5" +"\x87\xb4\xb1q\n\xc3S:g\xbc\xef\xc5\x3\xad\xf1\xf4\xb6+)\x10\xb3\x19\x65\xe3\x64\xee" +"\xc9\xcc\x43|\xc4\x1\x81\xa7\x32\xc\xd5+\xe9\xc5\x46\xb8\xf1\xdc\x82\x43\x12!l/\xd8" +"#.+\xb8\xd4\xe\xe2\xe3\x14T\xc0\x97r\xa3\x87\xf9R\xe\x33\x14V\xc2i\xf5\x1a\x7\x8e" +"j\xbd\x9f\xb6\xa6\x8b\xfd_Ur\x15\xb0\xbb\xd2\"{\x89Y\xcb\xd1\xbdJ\xee\xab\x9M\xd1" +"\x8e\x89\x1c\x61\xfb\x0\x93<\n\rv\x17M\x16\x9c\xb\x64\x45\xd3L\x0\xdc\x9e\x6\xd8" +"^\xb0\x86\xc1\x8f;\xe2}\xf7\x34\xeb\xb9\xcf\x7\x8a\xff\x65\x14\x43\x85I\xcb\xe9*" +"\xc\r%\xef\xe4\xa5'\xd8o\x15\x8bN\x9d\x88p\xc7\xac]l\x5\x96\x43\xa3)\x80y\xcc 9\x83" +"$\xca\x87';\x86\xed\x80\x10W\xd7\x97\xd9\x1b\xc3\xcf/\x96\xc6P\xee\x15\x66\xcd<\xf8" +"el\xc5w\xd3\x8b\x83\x2\x1\xbeq\x8d\xc9\xa4\x94&\x81w\xa5\x1\x95\x46\xee\xed\xbf\x10" +"\x19\x96\xbeY61eKc\x8cu\xa6\xba\xa6H\xcd\x1ez\xa9\xac\x1e\xa6\xfL\xd6\x4\x7\x1c\x89" +"\xdc\xcf\xf8\xb3\xe4\x30\xa5~\xd6\xde\x11\xc5\x83~x\x95n\xd9\x91\x5\x8f\x36\x46!" +"\x9b\xea\xe9NM\x93\x81\xa3=H\xca\x9b\x8f\xf1+T\xa7?\xf8i\xd0\xee\xed~\x9\x8d\x80" +"\x15\"\x95\xe6\x1l\xdd\x80\x91s\xc5}\x1f_\xce\x90\x8a\x37\x1\n\xd4\xc4G\x1aSE\x1d" +"\xe9\xb4\x36;cC|7LY\x8fT\x8f\x14]=(\x8f\x42S\x1f\xcf\x36\xa9\xcd\xf7%!\xf1\xc0\x86" +"\x8f\xce\xee\xb1\x85~\xa9\x83\xf6\xb7\\\xe2\x45\xd8u\xbe\xad\x1b\xcb\x88\x19\xe5" +"FE\x18\xe0G\x17\xb7\x8b\xd6\xe3\x35\xf0\xadw\xb8\x32\xafV\x82\x6*\x1e*\xc7|\xd5\xed" +"\xd5\xdc\x37.\xe4V\xc9m8\xbf\x8b\xf3H\xda\xc2\xb4\xeb\xbb$@\xf2\xce\x97\xb4\xb3\x37" +"\xf2\xe2\x32G\xe3\xe8\x42;\xfa\x92\x37\xcal\xebo\xb9?\x96\xc\xad\x89J\x96\xf0\x37" +"\x11h\xa3\x32\"\x5-\xe9\xb3\xbe\x4\xb0\"\xab\x95\xc0\xc2\x43Hn5\x19w!\xfcU1\x1d\xc5" +"_\x87\xbcr\xd0\x9bl\x94\xc\xa3nf@\xae\xb6l9JYI\xa6\x4\xe7\xf1]\xce:\x0\x8b\xb4\x1b" +"\xe\xef(@\xa3W\xf3HD;M\xce\x6KL\x15\xe5\xecR\xe4H\xc9\x85\xfa\xa1\xc3\xd6Rbp\xb1" +"\xcci\x10\x9\x95\x9av \xc9\xa6 &\x19\xa1\x9b\xe4\x10\xff{\xd5\x35\xa8\xb2\x64\n\xaa" +"E\x9d\xfd\xcb\x8f+\xb3Q\x12\x62\x64\x97\xe8\xa3\x97\xd4\xf9\xe0G\x88\x32*s\x8d\xc8" +"\x90|\xb6\x43\x15\xcf\x63\xc9X\x9\xe9\r\x6\xef\x2\xf7*\xb0J\xa6\x1f\xe0.\xcc\xf7" +"\xe9\x4\x9f\xf9\xf3\xef\"X\xa7VV\x17\x8a\xaa\xc9\xf3\xc2\xa2l\x0\x13\x41\x86-Rl\xc1" +"N\x92\xa8\x1b\xd6\x35\x2\xf9Y\x6n\xb\xcd\x65\x9c\xb9\xb5\xa4V\x6\x15=\xd7p9\xb8\xc5" +"\xd5\xb1\x35\x65\xf0\r\x95\xa4\x19\x37\xcf\x97\x8\x9f\x39\x38\xe3\x96Y\xa6M\xc3\xd6" +"\x4m\xe\x9e\xf6\x65\x44\xca\xf8\xa2\x6\x63]\xf4\x99&\xa3\xee\xf3\xfd\xbc\x9d\xcc" +"\xea(\x86\xec\x85_\x18!\xc4\xb9\xce\x1d\x2\xa1\x9a\x11\xbb\xbe\xf4:}MSg\x15T\x8a" +"b\x80/d\xaf\x30\xbb\xcb\xea\x8c~U\xadV\xc8\x1\xd8\xa5i\xc8\x18\x36\x15\xa7\x8c\xd3" +"\x93\xca\x42\xc1\x3\xf1U\x94\x1e\x84W\x12\xc3\x35\xf4\xac\xfcx\x7 +\x92\xa9\x83\x11" +"\x1a\xed$\x1b\xbb\x85\x1\xf1U`\xe8\xf2\x15|)u+\xdc\xdb'@\x8\x13rw\x92\x0S\xd6\xd7" +"\xdc\xdc\x62jWJ\x82\xa8\xa3O\x1ew\xb2\xfc\x8c\xf7\xc1\xa7\x32/\"\xdf\xcb\x45\x2Y" +"\xeb\x45\xcR\xb7\r\xf3XJ|T\xc8\x13\xdb\x41\xe3\xdd\x81%:\x3\xb0+\xc2R4j\xf0\x16\x7" +"\x16\x35W\x97\xb6\xf8!\xc\x45=\xd7\xe1\xe7V\xff\x8\xc7\xe6\xa5\xf4\xf8v\x5\xe1\xdf" +"\xf3Z\x13\ry\x14\x8aW\xb7\xad\x12\xd9J\x12\x9f\xe3\xf0U\xcf\x97N\xba\x9\xa2\xb1=" +"\xee\xca.\x2\xea\x81\x8aX\xb8\x1e\x87\x43\x0\x46\x46\xc7ta\x10\xbc\x61\xb8j\xdf-" +"]\x8c\x45\xa6\xa5\x46\x1e\xb3\x44\x97\xfc\xcd\x9\xe7\x11\xf4{\xfat,s\xf8{%{S\xf3" +"\xc\xb6\x8d\x15\x14$\xdc\x8a\xc6|$\x95\xa8#n\xa2\xd7\x98Z^\x1d\xea\xc6\x99\xd7" +"\xb7\x0\xe6\xd3\x8e\xee.\x93\xb1\x91\xba\xa5\xa8\xa2\xc9\x16\xd2\x6\xc6?\xe6\x34" +"'\xaa\xaf\xed+W\x84'o\xc2\x1e\xef\xf2\xd7\xeG\xc8T\r\xcc\xc3\xe0\x1\x34\x64+p7\x95" +"\xcd\x37\x2\x63\x1a\xe2\xa9\xe\x6:!\x8b\x61\xe5\xb8\x9b\xbc\xff\xf8OV~7\xa3\x1a\x9b" +"4\x97\x17\xa8\xcd\xb9\xc9\x37r\x15\xba\x83\x8f\xf7\x46\x9b\xc4\x86\xb6N\xf2\xb6\xd9" +"%\x19\xc0\xbf\x8&\xe3\x65)\x3\xf4\xe@\x6\x89\xf5t\x9d\xf8o\xe3\xde\x17\x8e!\xe2\xe" +"\xdf\x90S\x8\x1f\x65\x10\xd8\xf1\x9a\xcd\x2\x1c\xbaH\x1cHM0\xea\xd3\xb8N\xd0\x19" +"\x0\x87\xeeG\x8a\x17\x15K$3F\xc3\x93\x8f\xddS@\xcfnG\xb1\x85\xe6J\xbd\xf4O\x8c\xbc" +"\xdb\x82\x94I+\x91\x92\x9b\xfe\xb9\xda+\x3<:\xce\xe5T\xf0\xf1\xa7\xf8\xa5m\xf7\xc0" +"j5\x83\xc1\xe9\xc5\xca\x45\x8d@\xe5P\xfd\xf3\xe2\xf2\xe7\xbe\x83\x12\xd5\xfe\xe9" +"\x85\x43\x38\x8e\xdc\x8a\x4\xca)\xf1\xb8+z\xb4\xad\xab\xba?,3\x1e\xff\x35!\xb2\xb9" +"/\x99\xc4\x37z\xb8'\xa9\x89\xb4#u\r6\xad\xdd.(n\x7f;iN)\xb8\xbc@6\x93\xc6\xf7\xca" +"\xb5\xfe\x34\xf1\xe4\x8c\x8d\x41\xb4x1\xe8\xc3\xf5\xbe^\xd5\x14.KD\xd9\x9b\xa5\xcd\x33T\xf\x34\n\x35\xdd\xd4\x66" +"\xab\xeaNr\xe5\x4\xfc\x9b\xaa\xe5\x1d#\x1c\x33\xa8\xce}\xc2\x97\r\xe4\xc1\xfb[\x9" +"j=\x9c\x64\x1e\xf7}\xc9\x3\x98\x86\x83\x1d\xdd\x1\xc4\xf2\x1en\x16\x8e\x38\xbb\xdd" +"\xa5\xf4\x30\x8c\x95\x9c{\xbf\x36\xa4-\x4-\xa6\x86)7\xeb \xd4\xfa.Y't\x1aX\xda\\" +"\xbf\xfd\x95S\xbe\xff\xbd\x92\xe6\xd6Hq\xd8\xb2]\x90I\xf4\xe7\x19p\xa8\xffUW\xd1" +"\xde\x83\xdd$(ml>Gp\xee\x0\xf9\xa1\xa0\xb0\x6<\x99\x99J\xecu\xe8Mo\x9cH\x84\x34\xd1" +"\xf3\xdc\xfd\n\x8b\xee\x9e\xd8%|\xa9~u\xe8\xb1(WG\x18Mm\"(\xef\x95\xd4\xa0\xb8\xda" +"%#\x18\xab\xd3\\\x83\x98\xfc\x65h\xb2\x94\xd9\n\xb3\x8\xa7g_\x9f\x16\x1@\xf0\xa0" +"\x8c\x88\xad\xc\xa1\xca,\xf8^M\x3\x1c\xfa;\x87\x63_\x13\x98\xeb}\xbc\x66j%\x9f\x2" +"\xdbgA\xd1>\x11\xb2\x30\x2]\xd6\xdd\x64\xc4\x38@\x9a\xf1\x9\x9\x0X\x15\x1eM\xfb\x8c" +"\xe\x9c\xd6Y5\xc4\xcc\x6<\xc6\x10\xf\xdep\x89n#\xe3\x66\x1c\x7f\xc1\xb8\"\x8b&\xa5" +"Y\x3\xe9\x97\xf8\x2\x7\xed\xd8\x86?\xa0t\xeeO\xf2;\xe5\x85\xba\xf7\x8\x4\xc\x9f\x8c" +"\xfd\xeb\x42\xfb\x8e\xb7\x1dL\xb6\xd7u~\x97>M\x8c\x9d\xdd\x8'\x12\xc2?\x86\x8e\x11" +"5\xec\xd9\x12P\xbb\x43\x35\x95\x8b\x7\xc1/\xdau\xee\xb5k\xe1\x9d\x16\x44\xc1\xf7" +"j\x88\x11\xc0!\x12&\x19\xf7Q\xcb\xbf\xeb\x1d=\xc9\x12\x99\x90\x17\xfa\x16\x36r\xa1" +"\xefuL\\\xb7\x89\x62\xba\xabv\xecHF\x1bI/\xa8\x8f\x98\x97\x17\r\xe8W\xcc\x83t\xc8" +"\xba\xe4\x17\xd4\xc7\x8aV\x4p$s\x1fJE\x14_\x3\x93\xa2|\xab\x61J\x7f\xf7G\xbb\xc2" +"\x8eh\x80\xd4\xd0\x1c\nl\xf3\x17\xa1\xde[\xb5\xad\xfaK_\xbf\xe0\xc5u\x98\xc7\x9f" +"%\xaeW\xbbyzH\x9dQ\xf8Z\x9b\x9c\xf8\xbe\xa6\x42\x93\xf8\xfc\xc4;\rT\x84\xdf\x99\xdb" +"\xe1\x91Ri,\xe7V\xf6\xfb\xe8\xceX1\xcfK\x8aZ\xf4u$\xe2r\xc4\\\x62\xac\xbf\xbd\xfe" +"~`\xb0[\xb1\xa1\xa6\xaf\xe\x92\x10\x1 \x14i\xb3\xdb\xb4\x9e\xc7\xb2:6?\xa6\x84\x17" +"\xb7\x11\x8d\xce\xa7\x1dJ\xca.6\xf8\x8cm\xde\xfbp ]\xf3\xab|t\xcf\x65\xcf\xd0\x1f" +"\xf8_\xaf\x99\xf1rh\x97\x37\x33\x1dLl\xffz)\x2\x97r\xf4\x87\xfb\xf6%\xf1{\xda\xd8" +"\x9bJ\xc0v\x94\x82w\xb4\xedhx@0\x10\x16\xc2\xb7\xadLm\x2\xf8\x1e\x88\xc7[z\x4\xd7" +"$\xe2\x34\xe3\x8a\x38&\x93QX\"E\xe3\x61\xa4,u\xb8%j\xfdV$\xb5X\xad\xa2\x19\xf\x96" +"\n\x89k\xba\xe7\xa8\xc5~v\xda\x10\xdc)\xe6\x9b\xbf:\xa8\x62\x14\xc0\x1\xa2{9\xc1" +"\xd1|T\x8d\xa5`\x1e\x86\xa5\xcfS\xe7\xb1\x89k\xf0\x3\xaa\xe9\x38z\xba\x9b\x10.\xb1" +"\xe9\x0-\xd3uJ7\x8f>I\xf2\xc6\xee\xcfG\xeb\x1b\xac,\xfc\xe1\x1a\xc0\xc5\xcb\x6\x36" +"r\xd3'3V?>\x1e\x89\x1b`ss\x9b\xc5:\xaa\x0\x43\xfc\x45\xe9\xe\x41=\xfb\xd4T\x8d\xd3" +" \xb6\x81\xedp\xa7\x44:#=y\xe3\xf0\x38\xd2iuXn\\\xdd!\x15\xaa\x61G'\xb1\xf6\xdd@" +"$\xb8\\\xcc\xfcy\xd1\xb{j\xfax\x9d\xb3{\xd0\xe8\xc4#\xc1\xa4\xa8h\x1b_\xf3\xa9\xfa" +"\x1f\x61\xa4nF\xc4\xb1\x83m\x1a\xa4\x1a\x89&J\x7fK\x1c%\x9eK\x10\xec\xdf\x37[\xd2" +"j\x1f\x41/\xe0\x1f\xbd\xc0\x33h\xfc\xafH\xaa\xe\xc2\x8b\x1b\xd6\x3\xa6\xa0\xd0\xda" +"\xde\x66\xd1L\x9br\x85V\x92\x30\xfa\xb7h\x3\x35\xbe\x10\x43\x5\xe4\xb7H\xfa\x99\xfa" +"1\xf2\x39\x91`\x8d\xfd\xd2\x9}\xa2\x92U\x11\x36\xf2U\x5\x1c\x9f~\xef?\xb7\xc7\xfd" +"\xb4\xe6Q\xc3\xd0:L\xa3W\xb5\x87$R6\xf4\xff\x32RV?k\xe0\x8e\xf8\xa3\xec\x9\xbe+\xf2" +"{\x91 \xf7\xd3x\x1\xf6\x99\x9e\xfb\x1c\x8a\xd1\xa0\x86\x98\xccY\xce\xae,\xfc\xdb" +"\xf6\xbd\x8f\x94\xde\xc9O~\xbf\x33\xaf\x5\xf5,\x85v\xc\x63\x95\xb\x45U\x10\xc6\xab" +"\x93\x98\xd0\x9a\xc2\x88\xef\xa0\x9e\x8f\x63\x1aY\xb0?\xbb\xc7[\xbd\xaf\xd6u\xff" +"\xac\xcc\xf8\xad\xf7\x1e\x81ZJI\xf1K\xf7\xe\x42\xdb\xbsG\xb5(N#L$\x1\xe!w\xdb\xbd" +"Wd\x8e\x39\x8f\xa6\xb5\x45q\xa3{\xa8\xc9\x89P5\x94\xd0x\xd1\x8\xe4\xc7\x34\xf6N\xe2\xf1,\xc9V,\xbd" +"\xf3\x63\xef\xafR\x1\xb6s\xad\x0X?\xf1\x8\xaf\xf6\xb6\x80U\xa5\xf2\x99\x45-\x17n" +"\xaa\xfb\x92\xc8O\x11L\x8c\"\xa0^\xad\x65\x64\xa3\x37\x14 \xea\x9e\x64\x63\x8\xde" +"\x97\xd4\x7\x5\xe1\x63\x8d\xf0\x87\x4\xfc\x90$\x9c\xbc\r->\x88JEb\xcc'7\xb\x1a\x97" +"8\x9d\x8e\xfd#~dJsp\xb8\xb3\x8e\xd1\xc3w\xf5\"\xc7_\x98\x1d\x87\x8a^\x87\x10\x1e" +"b\x1d\xf9\xd8\\r\x7\xbb\xe5\xa8|\xcb`\x7f\x93\xa2\xe5/f\xe\x5\xc8:zl\xe6\xd0\x1a" +"\xb4\xb6*\x1e\xf8\xdaG\xcf\x97\xd4\xbb\xa0\xfa\x8e\xff\xa9\xc0\xf6\x1a\x32Z\x97\xad" +"\xa6\x94\x45\xf2:\xb1\xfe'\xa6l'\x16\x39\xf8\x39 0@\xd4K\x11\xec\xc6\xe8\x5\xfb\xe8" +"\x88\x43\xb3LO\xd5-\x1d]\xa1\xb0\xaf\x7\xc2\x37t\xb1" +"\x9c\x9e\xf5\x92\x81\xf5\xd8\x84\x99\r\x61\x94\x17\r\x82\x93\xa8m\xb5*\xf\xe1~\x88" +"\xda\x82 \x9a\x0\xa1k\xd2\x9b\x8b/\x13\xfd`\xaa%\xfc\xfa\x97\x45\xf5|\x82\x16(<\x1d" +"n\xa1\xc1\x19\xcb\x9b\x8dW\xc0\x4\x19R\x10\xff\xbdV9Z>\xc2\xd3\x9\x8e\xd3\x8f\x38" +"\x9e\xfc\x3$\xfd\xeU\xea\x33\x9b\x38\x92V\x82)\xd8\xd3\xe2\x5\xa8!\xe8!\x9f\xcb\x1a" +"w\x13\xfc\xf3\x45\xf\x8b\xef\x97l\xa0\xbe\xcaG7j\x8c\xa7=\xf8[4\xcg\xef\xe4SME\x96" +"\x17\x99\x65&\xb5\xe5\xd3\xd1\x9e\x17\xccTI\xe5\xef+\x82\xb2\xc4\xc2\x13\x1f\xf8" +"\xa1\x9f\xcf\xe6\xa1\x86\xa9\x84\r\x87-\x85\xc4\x6\x65\xa7\xa0Ng\xee&\xb8\xbc\x92" +"\x6\xc3[D\xc8\xf8\xa1\xaf\xc3\x86}\x96\xdcmH\xbd\x45\x6;\xe2[\x88.\x9b\xc0\xd0\x94" +"\x8c\x18\xdc\x87\xei%\x81\x8e\x1f\xe1}3b\x17\xf1t\xeb\x44\x81\xf5\xc0\xed\x37\xa3" +"\xbe\xaf\xafMF\xf8W\x81\x1bg(\xbe\xc4\x61\xae\x64h\xd8zser\xf4\xff\x95\xb5\x8b\x4" +"VJ\x9d<\"uE\x87\xdf\x15IZ1\x9d\x82+\x83\x84\x61vKsH<\x1f|\xb9\x30\xee\xccot$\x84" +"\x1e\xe1\xe@\x87\xe9Q /\xe8\x8a\x39\x13u\xc9k\xec\x44\x80\x32\x8aTt\x2\x13\xf7\x41" +"\x10[\x12\xa3\x9f\x19\x80\x8f\x38#P{\x88\x11]F\x8c\x61\xb2\x12\xa8\xab\xaet\x80\xe3" +"\x9b\xa5#\x90\xa1\x89,~\xc5\x2q\x15kN\x80v\xfc:\xda\"&\x95\xdf\x37#\x85\xda{\x11" +"z)\xe0L\xd2\xb8\n\x32\xf\x18ma\xc9\x63\xfb\xda\xfe\x92$\xe5\x37\x5|I\xe8.@Q\x96\xaa" +"\xb6!\xb5\xfe@\x11\xe1x*t~\xf9\x35\xed\x8b\xb1\x1b\xda\x39\xa1\x41\xcc\xb\xa4-\x4" +"\xae\x12\x33\x83\xbc\x95\xa1\xd0:\x85\xa9\x44\x0\x10\xc3\xb9\x61\x30\x64\xff\xec" +"\xa7\x61\x97\xe1\x9\x19\xbaP\x6\xf3X7\xed\x9b\xcd}\xe5\xe6\xd9h\xaa\xcbo\xc9\x11" +"x\x9\x1f\xa4g\xefo\xde\xb7(\xe1r\x93\xdc\x89\xdd\xe5\xa5&\x1f\xaa\x95\xa2\xb0\x0" +"\xf\xc7P\xe7\x7\x39\x0\xd4\xd8\x82G\xda\x46\x46\x13\xad\xc2\xb3\x90:a2\xd9j\xc0\xe1" +"\xc5\x64\x38_\xfb\xf6$\x9d\xeav\xbe\xa2\xa9\x91`c-\xd2\xfc+\x99\x13>\x9f/G\xfr\xb4" +"]o\x18\xb4P \xf6\x4\xb0l\xd9\x17K\xa3\x80]\xb6\xe\xb9\xc5\xe6\xa9\xc7\x89\xac\xe7" +"j\xe9\xc7\x9c\x1b\xd3\x44\x34\xe9^P\x1b\xc9hc:\xf9?\xf4\x88B\xa7%\xa0\x34Y\xcb\x36\xee\x34\xa0\x94\x13\x9a\xf5\xfc\xf4" +"\x87\xd3\xdf\xe6?\xad \xbf\r\xfb`\xde\xed\xa2\xac\xca\x35\x10\xe9\x63\x18\x9d\x12" +"V\xea\xbd\x81%?\x7f\xf9\xd1\x12\x63\xfd\xbc\x1d\xcf\xda=\x1e\xa2\xe5 \x5\xce<`\\" +"\x99\x32\x31%\x8aqt#\xf6K\xfe\xeb\xc3\x46\x84\xef\xa6v5\x8b\x9bT< B\xbe\xf9T\x82" +"\x9f\xe3$j\x87\x98\x45\xb3\xe\xba\xcb\x43\xd8\xddz \xfc\xfe\xdfv:\xd2\xc5\xd2\ny" +"\x8bi\xe0\x87\"\xdc\xe6\xa5v.$\x9a\xce\x30U\xb6P\xd9\xe1\x10Y\x9e\xa3\r\xe5\xc4\xfe" +"r\x0\xd5\xa8\xda\x9e\x1f\xe2hcP\xd0\xdf\x33Hw\xd0\xb9\xf6RLU-\xbm\xff\xae\x12^\xc4" +"\xc1\x8fuG\xbdQ\xc1\x42\x88\xe4\xab\xb7\xf8\xa1\xa0\x4XYl9\n\xee\xe6\xfa\x30\x8a" +"\xc1\xf7\x88\xfa\xe3\r\x7f\x89(\xaf\xc9\x1dM\xe6\x35- \xb1\x9d\x8d\x8a\xb1\"\xb7" +"7\x8c\xb3y\xc5\xbe~<\xe2\x92/\xe6g\xea\x5{]{?\xbQ\xc7\xbf\xc\x85\xf8z\xc2\xf3`\xd8" +",8\x96OM\xab\xcc\x91\x4\xb3/\xf\xb8\x80\"\x35\xe8\xe8\xd9\xa5\x99}9\"Y\x7L\x0\xaf" +",\xe1\xd2\xbf{\x8e\x90\xe2\xe2\xac\x34\x18\\h\xa0;\xab\x8b&wx)+\"rE\xd7\xff\x86p" +"xn?to\x86\xb9\xd4\xd1q\x90\xdb\x85\x9a\xe\x14K*a\xe6\xac\x92T\xde]\xba\xef \xe2\xe9" +"\xdb\xb/\xf6T\xb9\x96\xe9\x62\xf5^F]\xd2\x38\xbd\x16\x43\xceY\xdc+ZX\xb1\xe6\xe4" +"\xae-\xdc-t\xd7\x9a\xff<4\xe4\xe5\x93\xe0Q\xfd\xa2\x36\xb7\x9c\xc0\xdb&\x8d*\x89" +"\xb1\x87\x80Q\";\xb8\xf3?\xf9\x9b\xa8zH\x11\xc0\xb3\xbc\xc0\x11q\xd0\xa7\x31\xeb" +"s.\xcd\x87I\xd2yR\xc2x\x86\xb2R\xf9\xc3\xd1\x90\x41\x9f\xd2\x90\x9\x87\xa0\xa2U\xb9" +"u?\xb7\xaap\xc3tb\x13LFz,Ky \xbe\xd9\xf9\xe8o\x8f\x98\xb9m\x0\xaf\x8b\x5\xa4\xbd" +"_\x14\xc2\xa0\xd9\x14\xa9\xa8\x41`\xd5T\xfd\x7\x18\xf5\xe\xcb]\xf5\xe7\x66#\x6XR" +"\xda\xa7L\x9a\xd6\xda\x7\xa1\x19\xdf\x12\xc3W\x7f\xe2v\xaeU\x1dH\xb1\xc5\xcd\x8a" +"P\xe8M\xec\x9c\xb0\x84\x5 \xd7\x8f\xa7\xf9\xa7\xc2\x7\x1e(\xcd \xecvI\xb9\x91\xf3" +"\x81\x8c\xde)\\\xdb`\x85\xf2O\xcf\x93\x14~\x9fM\xd0\x84\xfb\xd3%%\x32m.\xa1G\xec" +"\xd5\xb6\xc9\xd9\xf4\xa7\x16\x66\x63\xad\x18\xbf#N\x9c\xb9/\xf7!8\xa8\xa4\x9es\xe5" +"'\xe9\xa6H\x8aL\xa8\x8\xae\xca\xbc\x94\xd6\x93\xcd,\xc\x35}(_e\x0o\xa2\xf9\x19\x7f" +"a\xfb\xcan\xf0{\x1>+U\x8a\xb5\x31\xd2\xfd'\xc\xee\x7f\xa8\xe4g\xfa\xb8\x85\xe9\xc" +"X\x84\x84:\xa0\x8e+\xbf\xea\n\xa5ud7'\xba\x18\xac\xc4\x99\xff\x34\xe3\x43\x86\x45" +"\xbe*\xa7\x1e\xa4\x91\xe5\x46\x87\xcd\x30^\x12\xbb\xc9O\xae\xc8H1\x1a\xe8\x16I[\x1" +";\xc5\x7Z-*\xe5Jz\xd7\xc9\x10[d5l\xb5\x1f\x18\xc2\xc2\x8e:\x83\xb9\xd8\x1a\x45T\xdb" +"\xec\x9b\xea\x9a\x66\xc\xf7\xe1\xba\x89\xe6\xd4\xdf\xb3\xee\xc6\xa3\xde?\xcd\xed" +"\x9b-aAV\xed\xae\x8c\xfd\xad_\xf0\xef\xee\x31\xda>jT\xd9L\xe9\x45:\x1c\xaa\xd9um" +"\x91\xbe\x85\x31_e\x14\xba\xfb\xc8!\xee\x81\xb\xb5\xd8\xe1\xb8\xf0_d\xf3\xf7,K5\xd4" +"$\xf7\xe4\xdc:\xb5\x81\xb7J\xde\xb6\xd6)|\xdez\xa8'\x89\x9\xf2i\xfe\xd7\x9b}\xfd" +"9\xb1\xc0\x33\x8e\x1\xd5V\xc4\xdb\x9c\xa3\xa8W\x8a\xce>\xc3\xd7\x43\xedK\x9c\x1\x45" +"\xe4R^\x8c\x31_z\x1b\x98XK\x97\\p\xf0\xd4\x15p\x8c\x8c\xcc\x13\xf8H\xb1\xd3j\xc8" +"$\x9bsc\x8f\x95\xde\xc\xd2|~\xfbR\xbe\xd4\x33\x9e\xbd\xa4\x81%\x64\xd7\xa7t\x16\xdd" +"\xf4\xcc\x88\xcf\xb5-\x7\xa2R\xd8\x93S\xc6\x82l\xa1\x83*\x15\x32\x42\x97\x9bl\xee" +"x:\xbd\xe6\\\x8b@\xcfN\xa7\xb4+\x8d\xbc\xc0\xe0$#\xddi1\x8\x0ojJ\xeb\xf0S\xb6\x66" +"\xc3\xcb\x63\xd1\x86\x1f\x86\xea\xac\xd4;\xb9\xbbo,:\x17)<\x18\x93\x31\xd2S\xb4G" +"u~\xe7\xcb\xf4Q\x8b\xab\xb7:\x1d\x44\x87M\x7f\x6%\xe6\xa0\x13\xc6\x8\xe9\x91\xb4" +"\xad\x17\xa9\xad\xb3g@\xd2^>5\xb4Y\xb4\"\xf7\x37\xb\x13L\xdf\xff?;\xccL2\xb4\xe9" +"\xeb\xf6\xa2G\x80\x13\xf6i3\xa1\xfa\x94\x3\xa2\xf1\x16\x1e\xc6\x32\xf1\xf0N\xdf\x95" +"\xed\xf\x33\xda\xd9\x66]T\xdd\x9d\xb2VNQ\xda{e\x97\x8c\xabP\xd6\xdc\x15h\x97n\x83" +"\xb0V\xeb\xe:gXQ\x8bn\x17\xe9\xeb\xfeI\xb7.\xb1H\xb4r\xba\x14K\xdc*\xc9WD\xc9\xbf" +"\x12X\xf0\xa2\xe4tp\xab\xe\xff\x90\xe1\x90\xa4\x11\x8\x91J\xb8\xc1\xedk\x11\xe0h" +"\x17xR\x18p\xe8\xc\x16\xaf*\xfcr<\xad\x87\x19\xad\xb6-99\xd3\xbc\x8c\xc1\xd8\xa4" +"\xe0~\x9dsOT\xec\xa3=\x93m,9\xd5\xc8\x5W9\xc3>S5\x9b\xd4\xeWl\x11\xe9;KL\x12+\xdb" +"\xc9\xb1\xbb\xf4\x42\x43\xafO\xb\xcd\xbd\xfa\xdeh\xc5&\xb5\xcdt\xe2\x9c\xe3\xf7\r" +"b\xba\x83\xc4\x89\x3\x41\x11\xfe\x8eM\xae\xa2\xf0\x1f\x9d\x93\x8a\xbbS-\xee\xac\xe" +"2\x9f\x42\x45?\xf5\xc1]\xec*\xea\x8c\x19\x83#\xc9\xe8\xfe\xa5[?]\xc4u\x1d..\x16\xb6" +"\x15N\x7f*\xdd\x46\x86\xe\x9c\xa7\x1d\xc1\x14\xc9\x9d\x80\xe7\xea\x1d\xabQ\xe9%\xde" +"\x16\x1c\xed\xd6x\xee\x62\x82\xaf\xf3\x8e<\xd0\xe6YT\x9c\x97\x6\x13 \x99U\xa3\xf5" +"\x81\xe1\xab\xe4\x85\xe5\x64\x2\xa3\xdb\r\x1e\x9b\x8a\x9d\xfd\x5\xc4\xb0\xb7\xf9" +"\x7f\xc6\xd0\xee\xd0\xb6\x9a\xd6\xf1\x82\xb1\xd0(\xad\xd2\xf2\x44\x63\x83K\x13\xf5" +"\xc1\x30\x7f\x91\xd3\x63\x89\x18$\xe8\x11\x8\xe5|\xfdR\x11\xf8\x64\x0\xd3\xe9k\x10" +"\x7f;\x1f\xe8\x9cI\x8\x64\x9d\x4\xa4m\xc3\xce\xe0\xde\x66\xaf\x3\xa7\xff\x9fM\xaf" +"\xec\xddm\xf4\xd9\x37\x84\xcc\x89\x9bRw\x84\xdb\xe0q\x80P\xfc\xe1\x85\xbd\xe3\xf3" +"\x9d\xeb\xcd\xd6`\xb2H\x8d#\xab\x1c\xff\x87\xb0Tm\x2\xb4\x8e{w$\xc9\xe8{q\xbf\x34" +"\xb5\xd6\x64\xe\xfn\xceG\xb1\x82\xd4\x1c\x89\x46\x1fq(I\xc6\xcf\xdb~?^\xbc\x1a\xcd" +"\xd1-e\xa4\"\xba\x36*\x8f\xd6\xca\xacQ\x4\xcc\xc5\xab_\xc0JF\xe4\x30\x9a\xca\xc8" +"=e\x9d\xdd\xa2V\xcc\xdd\xd1\xbf\xf9\xab\x36\"\x45\xcO\xbc\x89\xc8\"\x14\xf0\xc\x42" +"\xfb\x3\x11\xbc\xb1\xb7\"\xa6\x91\xed\x83\x9c\xaf\x90$\xfb\x16q\xf1\x8e\x46\x39\xc9" +"m\x84q\x8c\x66:CA\xde\xc0\x37\x17\\k\xbd(\x8b\xbfZ\x4x)\x8c\xa7&Vz\x9bt\xc3*Rs9\xc6" +"f\xa2\x94\xa1\x7fh!\xcb\xf2\x43\xd1>\xa4\xb1`<))S0\x8bVfSB>s\x1\xa0\x32\xe5\xd5\xe2" +"\xb9?\x1c\x14\x34\x89\x36\x33\xdd\x19P\x1a\xd1'(\xb5\xa1\xd9\xd3\x66\x35\xb5\x89" +"\xfa.\x15\x11@\xb5\x43\xd7\xc5\xe4i\xaf\xae\x8e\x80\xc4\xfc\x1d\x9c\xb6\xc3\x82<" +"\xc1\xbb~\xe4\n\xec\xb5\x8c\xbc\x14\x65y\"&\xb1\x9e\xf\xe7\x92\x35\x11_j:\xfe\x19" +"\xf9\x8c]\xb6=7-\xd7\xc0\x41\xcd\x94\xfOy\xf2GM\x9c\xee\xa0\x33O\xa0J\x97\xdc\x97" +"s\x6H\x95\xcf\x11\xcfs\xf1\x1b\x46\x84\xf0nH\xf4\x46\x9fj\x1a\xeb,\xbb\xc5)\x94\xdf" +"\xab\x33\x19\xdc\xe3\xa0\xc8\xc2\xef\xa9\x62t\x96\xf8\xcc\x84\xd3\xdf;\xdcO\xfc\xb6" +"\x16rx\xf)OE2x\xae\xb9&.fHhV\xd3{vG\x14\x1a\x82\xe0I6N\xd3\xd0?\x92R\x84\xa3\xf1" +"\xfa=\xdfL\xbH\xb3\xfe\"\xe7\xdf\x9a\xba#\x9d\x33\xcd\x30\xf\xfa\x8f\xd4\xb9\x61" +"\x92\xbdV\x8f\xb1\x8d\x32\\\xaa\x8e\x1f\x1f\xd4\xb2u'A{\x3HA\xfdI\xe4\xa7\x7f!pb" +"<\xc8\xb2!\x1\x16m\x80\x36\x1e\xb1_\xa9\x2\r$\xf6\x10\x7\xb0\xa8'M\xf9\xdf\xcd\x8e" +"\x97\xc8Uh\xe7m4\xad]\xb1w\x9b\x2\xf0\x34\xa6\x9c\xcf\x9dN\xba\xa1\x88\xeb\x30\x17" +"\xee\xf5\xb2*\nU&\x96\xa5t\x90\x7fiP\x98\xbd\x8aHI\xd5\xc8\x31\x1f\x12\x94G\xcdz" +"<\xf8\x8b\x81\x91\xae\xc0\xaf\xf3\n\x38\xa9\xab\x81\x35`\x8ax) z}$/n\x1f\xa7\xdd" +"\xa1\x9f^L(V\rB\xdb\x44\x5w\xcc\xc_X\x3\xee\xe8\x97\x10>\xca\xb\xd9\x44\xe3 \xac" +"&U;\xeexR\xea\xa7\x33\xbd\x13\xdfv\x0V\xb2\xf5\xbd\x12\x43\xbe\xda\xbc<\x1e\xa0S" +"\x10\x17\xd7KG\xe1\x8f\x80\x1a`\x7Mm\xf8I\xfd\x5\x32#EE\xe5\xb5\xe1\x12\xd1\xe7\x38" +"SA\xd3\x9a\x89U\x1c\x80\xdc-\xea\xed]]\xa2\xa4\xbeP\x15\xd2\x97\x32N\x92\xbe\x64" +"\xc6\x84(\x13.n\xc6T\xddK\xdc\xc6\x64\xch\x83_\xf8\xa0^\x9\x96\x4\xb8\xcd\x43\xd3" +"\xaf+/\xe1\xc\x8a\xfe\xde\xc5\xa7\n\xf8P\x9d\x12\xf6\x62\x33\x8c\xbf\x16m\x94R\xcd" +"63\x17X\xacOL\xbd~\xddR\x13\x9a\xd2}\xc5%i\x87\x7f\xe7\x9\xf2\x97\x44LO1\x89\x9d" +"\x19\x45\xc8\x1b\x14\xab\xde\xcb\xf3\x1d\xc4\x63\xa4\x14\x8f\x4\xecO\xb9p<\x15\x82" +"\x16\xc0\xfb\xe6\\\xcd\x45\x0\x43\xab\xfdNe\xbf\x8b(\xcc\x14\x82R\xe9\xf3\xe7\x97" +"\xea\xbW\xb8r\x1c\x94\xcb\xc2\xea`-\xf2\xc5~\x87\x93\x8c\x88z8-&Y\"dc\xbc}j\x1d\xa8" +"\x7fJ4\x1aY\xbe\xa4X\x17}?\x18\xd1!59\xdc\xe\x30\x1fn\xfe\x1\x11\xfc\xf6\x92\x13" +"h\xbe\x17\xcc\xbbt(\x12~\xc\x5\x9c,Z\xdb*?\x1\x97\xf0\xce\xabw\xff\x7f<\x2z\x8e\xc3" +"\xeev\xcf\\\x98n\xb4|\xb6\x5\x61\xc7s\xb3\xa2\xdaG\xb5\xa3S\x94\xe2\x93s\xdb\xd5" +"\xc3\xffL\x92\x13\xa8\x9a\xedw\xccO?\xcf\xc4\x9e\xf6\xecuW\xc5!\x97\x9aTi\x83\xc1" +"\x6\xb3\x62{_\xd2\xd7\x1c\xc5\xf0\x8a\x32\xbfI3*\x89\xc5\xdaq\xaf\xbf\xb9L\x94\x9a" +"\x91\"\n\xb1\xf8\x85\xc9\x81\x42:\xf9?s\xbc\x1c\xa4\xd9-\x9d\xba\xe3\xef\xe6\xa7" +"n-\xe3\xd0\xf7O\xd3%X cn?\x1ak|\x18S\x6#\xc1*\xf9\xc\xdc\xd2\xc0\xa7(R\x1e\x9b\x63" +"\x9e\xb6\x34]\x1d\xe8\xff\xfc;\x19\xc7.z\x93\x82=\xfe\x31\x15\xe9\xe7\xbb\xbe\xb2" +"\x8c\xb7=\xb1!\xae\xd8\x92\rG\xd8\xcc\x8\xea.G.9\xa4\xca\xd5\x88\x1b\\\x42\x4\xf2" +"\xb7\x32\xaf\x9dQ\x89\xd2Z\xbf\x41<\xc7\x87\x14\xcb\x1\xb1\xd8\xcaUe\x16\x9a\x91" +"\x9d\xc4\x81\xf6\xd2\xe6\x7f\x1dI\n\xeb\xc5\xcc\x62\xa8\xf6,\x1a\x32>\xbbU\xed\x35" +"\xaa\\\x8do\x8b\x97\xe\x93 \\'\x1\xcfH\x17\xbd\xa9\x94\xfc\x16\x19{F\x9e\xcc_^\x9d" +"\xdf\xf\xa0V@\xc2\xe5q\x84\x95q\xcb\xd2\x64\x2\xb1\xeb\x1e\x80?\xcf\x42\x33\x45\x0" +"{\x9bR\xb1>;\x3N\x8c\xb3\x98K\x92^\xbf\xfeq\x9e\xd4\xf3\x9f=\xe\x33\x43\x31jo\xdc" +"&\xbd\xbe\xa8\x8c\x43\x66\xd3\xb2\xf8Q\xd2\xb2\x44\xcc\x44\x8%\x1a\xe2\xc7sH\xcc" +"\xe9\xdd\x8b\xb9\xc8\x98\x0\xb5r\xd3\x8c]\x1c\xc3Lt\xb\xee\xbb]\xdb\n\x8b\xb2Qe_" +"\xb9\x89\x84\r# ]\x16\x31\x1a\x9f\xcc\xf7\xc8_m\xff\xea\x97\x4I*Nz\x8fl\xb\xdc)t" +"Z\xac*\xbf\xae\xba\x2\xb0\xe7\xae\xfe\xb9+\xa6:\xb0\xdf\x84N\xb0\x9dP\\=\xfc\x10" +"X\xce\x42\xcd\xd8\x4;v9\x84\x1\xe1\xdb\x86/\xf9\xf7l\x5\xe8\xbc\x62`\xa4\x44<\xf4" +"\x94\xbc\x17U\x91=Qt[\xf4Z\xdf/\x8cz\x95\x46\xd7\xefO\xb1\x1e\x9d\x94\xe4S\x96\x32" +"\xc2\xa3\x96\x6\xd0\x44\x80\xee\x45\x94\x8\xd7\xa2\xa8i\x80zL\x1\x88\x1c\x1b\xb2" +"\x1c)j@+^n\x7\x9=\x83<=\xff\x7_M\xd4&\xeb\x87\xb1\xb8\xde\x16\xc1\x46\xdey\xf5/Y" +"C\x1S1\xee\xb8R\x80\x9c\xbb\x8e\x1d\x64`\xacM\x17o\xe9o\x8d\x19\xf6\xcc\xb2*\xbb" +"\xba\xa2|D\x97\xd9\x13\x12\xc3\xcf\xb5\xbb\x91;1NC\xd2\xecj\xb6\x89{\xa7\xc3L\xf2" +"\xca\xa6\xdbK\xd6\x9e\xb5\xdf\xce\xe0\xaa\x91}iP\xe3jh\xa4\xc2*`\xdc\xc6\x93y\xd4" +"uD\xa5\x8d\x64\xe\xb1\r\xfe\x12\xf\xca\x84;X\x8c\xa8\xb9Oxi\xf9v\x9\xa6\xfe\x3\xac" +"\x86\xec\x1f|\xea\xd2\xec\x8e\x81\x97}\x1b\x94nE\x9d\xfc\xfe\xfe\x65\xa7\xbf\xf6" +"~f\xf5\xf7\x8a\x45\xd8\xdf\x65\xaf\x1\x46\xdft\xe0$\xfc\x4#(\x88l\xc1\xddwy\xf4\x9c" +"\xdb\xb7P4\\\xf8<\xd6x\xa6\xa8\x89uw)\x9d\xeb\x38\xad\x66]\xc4\xf2\x1c\xe1\x89*\x18" +"\xc2V\xf3\x18\x10}\xd3\xe9$\\\x1a\xd3\xbc\x93\xce\xf7\xb7\xbf\x5~3\xec\x9a?\x95\x32" +"Q&\x1a\xa3\xd1\xa8\x34ra\xe7\n\x46\xf7w:\x84\xf3\xd4\xd1\xa0\xdfm\xd2*\x96\x42\x93" +"I\xde\r\x18\x3\x10\xe1yU\xb1\xf\xbfS\"\xe\xf6H=\x3\xc6P\xa8\xd5\xc1mc\xda\xf6\\!" +"\xad\xcdl-\xb]J\xde\xb2\xf5Rj\xac\xf7\xcf\x42\xf9\xa8\xbfH2\xfb-Os\xf3\xd5\xff\xd9" +"\x84\xb5r#/\x87\xbd>Y\x13>\xd3\xd2\xfa\x19\xf7\x85j\xd8\x12Q\\t\xf7\xd8QW@\x19\xc5" +"2\xc2_\x8e\x16>Y_\xc9\xc8>>\x82\xc<\xbfi\r\xa6%x\xa9\x80\xfc\x8\x3\xebm\xb9\xb1\xe9" +"\xe\x32V\xbd\x46P\x81j\xbe^\xa8l\xe6\\.\xb4\x18\xd0\xad\xda_>\xa0N\x17\xaa\x8c\x45" +"6\xccG\x1a\xc2\x2\x36\xe6n\xca\x36\x19\xf1\x61\xdf\xef\xa4\x85\x38l0\xeb\xb8jz\xd9" +"0\xfd\n\xad\xf2\xdai\xdc\xaf&\xc0\xf6w n 0\xe3\xb1[6b\xc0\xad\x3\xdb\xc1\x63n\xbf" +"\xad\x1f/,7\xf5\xfa\x98V\xb0\x19\x8c[\x1d\x80\xb6\x9c^\xff\xd9L\xe0qQ5\xc6I\xc2k" +"\x9b\xa1&k\n['\xc\xd0\x8apaf\xc0\xb3 \x91\\\x87\xb2}\xe2\x1d\xeb]~H\x6\xf6\xe7\x0" +"\xb7\xa0jN)\xb6)\xcb@v\x19\x83\xe9\xca\x8e\x34\xe8i\xab\xd0M\xda\x19\xb\xfeZn\xe8" +"\xb2-~Q\x1b\x84\xeaXJ\x84!\x1f'\xaf\x89\x18\xdcZ\xf8\xa1\xff-6\xbk\xe3\xca\x8e\x66" +"\xbaL\xd2\xcej%\xe7\xe8\x94\x6hM\xa8?\xfb\xcc\xcc\xbf\xd0\x84O\xe3\xbe\xcd}\xe6w" +"d\xc5\x9c\x2-\xb1\x16\x8dX_\xe2Ps\xfe\x0\xe3\x2\x18\xd1\xdf\xe1\x15\xca\x1f\xc6\x6" +"\xaf\xcb\x4\xf2\xa0\x82\xef\x91x\x8bk\xd0\x96\x84\xde\xa3\x1f \x3J\x91\xab\x9d\x97" +"\x13\x66\xf9{P\x9\xfe\xfb\xf1\xef\n\xd9\x41\x65@\x81\xb1\xe8\xf0\xb2\xeaIPi\xa1\xdd" +"\xf1\x1d\xc5hW\xd2\x95\x33\xdc\x85yX\xb4\x9d\x1a\x7ys(\x19\xfd\"\xe4\x37\x8K\xd9" +"\xf3\xc4\xf2\xcd\xa4\xd1,\xa1\x44\x31\x93z\xb6:\x3\xf9\xc0@\xaf\x1d\x80\x1f\x36z" +"\xbd\xcas\x2\xe1\x8a\x90P\xd6\x2o\xbaZZ\x7f\xad\x44\xe3\x15\x93\x17<\xdf'|\xd7\x37" +"\xd1\xce\xf5\x9f\xe9hBR\xbc\r\xdd\x0\xa8\xe\x2;\x88\"$\x94\xc1\xc8\xc0\x88\x42\x30" +"\xab\x11\xd1\x8\x32%\xaf\xdc\xdb\xc1\xe2MJ\xd5\xfa\xb3\x96\xd2\xe3p\xe4Juq\xb2\x30" +"f\rQ\nPv\xd8\xe3_}\xb7,\x5\x66\xdf\xc1\x19\xee\x1b\x8a\xc3\xc0@iP\xa3\xc4\xa4\xda" +"6\xbd\xe2\x97\x4\n'\xf7\x7S\xa8~l\xd5\x93\xdck\xe9\x96\"\x61\xa9\x9a\xe5\x94\x93" +"@\xc5\xd4\\\x94\xa9\xaa=\xd6\x36\xce\x8bI{\xbb\x81#E|\x82OD:S\xb3\xeeY\\8\x98?\xe3" +"\xe0}\xbd\xc6\xac\xd5\\\xae\x8b\xe1\x8\x1a\xfdHW\xa5\xf5*<\x92QCPz<7\xf1\x99,\xf7" +".\xd0\xd4\xc4\x8d\x94\xael\xad\xdc;\xc8z\xc3\xa3\xef\x3^\x2\x18\x1fxD\x9eK\x6;\x8" +"5\xe8'd@QU\x1c\x16\x3\xe2\xea\xb5\x87_(\xfcw\xbe\xbai#B\x8dU!\xc6\x98\xc6\xb7\xf1" +"3\xb0\xf6\x89\xf1\x5\xfd\xba\xc3\n\x8e\xd2\xf2\x9f\x2U\xdd\xf8\xa0\x37\xb8\x1f\x4" +"\xed\xf0\x4\xcb\xe6\x39\xc8\xdb\xf\x94\xd0\xc5\xdb\x92\xd3Mf\xc2\xfe\xd6l\xf8\xb8" +"\x95\xaf\xc4\xe6Y\xd0\x83\x88\xea\x44\xea\xe8<\xe4Y\xe5\xbe\x30gP\xa6\x82\xb6'\x80" +")\x90\x3qW3\x9b\xf1\x42\xbc\xb9\xc0\x8f\xaf\xdc \xccO" +"\xc7\xca!\xe2\xc3\xf6\xc5\x46\xcdx\xde\xe3H\xf1\xa4\xc8\xcbT\x8e\xf2\xc\x4\x96x\x91" +"gq\xd8:\xcc\x9b{\"xJ\xd8X\x1\x34G\x1ae\xf\xe4\xa3\x33\r\xa9\xc3~\x9e\xb4\x99\xdfZ4-\x8b\xa4" +"\xc0\xa0\x33\xc3\x34|\xb2Z1\xbe\x14>\xcb\xf9\x13\x84\xf2\x38\x1e\x32>\x7f\xd3\xa8" +"*1\x97\xc1\x89\x5\x32\x0\xae,\x86\xb9\xd0\x1a\xb0\xb2\x89\x84\x1e\xa7\xe9\xe9\xa2" +"if\xe0\xde\xf5M\xe0\xb8]\x8d\xf0\x84\xb8\xc5\x90\x8\x1e\x44K\xaf\x1e\x1f`g\xf\xa1" +"*\xb9qY1\x86$\xf2\xaf\x1b^\xc7\xdd\x83\xc1\x7:\x99\x39\x8d!C\xa5-\x10\xa1< \x1f\xb3" +"V\xbc\x9e\x90\xc6;\xb0\xbc-LB\xafJ\x8b\x9c\x8cMX\xa1\xb3.\x5\x97\xc6;?\x8b>\x89;" +"\xd3\xbe\x8c`#\x18\x38\xf1\xbcx\xe7:l\x8c\xdd^\x7f)\x7\xf8\x97\xfc\x8e\xe9\x9b\xff" +"\xdas8\xbc\xef\xb5\xae\xf9P\xe5T\x9a\xdf\xd2\x7\xae\xb1XF\xb5\x9\xfcW\x98\x98\x83" +"d$\x98\xa3\x81\x1b\x8e\\\xdei\xc0Y$\xef\xae\xc2\x32\xfaL\xef\x30.\xe3%\x13\x66\xec" +"\xae\xf5}%\xcf\xa3\xb4\xa9\xe6\x39}\x99oB\x1c\x90\xb\xeb\xcfs\xb0\x38\xfe{\x16\xfd" +"\n\x11r\xac/@\xd1\x9c\xe0\xb0/\xce\xb8\xbcG\xdaSD\xcb\x93<\x7f\xec\x95\x1\x84\xf7" +"\x8a\xcb\x32\xd3\xe5\xe2\x90\xe8K\xe7S\xb9\xe7\xa7\xbf\xc4\x41l\xcf)\xd0#v\xc\x6" +"\xcd\xde\xf2PX\x6\xa6^\x15\x8\x99\x5)$PY\xaf\xd3\x1\xdb\x66\x9d\x41\xbdr\xbfz\x80" +"\xa9\xdf\x66\xb8v\xb3U?\xdfM\xd3\x8d\x15(\x9a\xf7\xa1\xaf\xbcS\xff\xff\x13ZcH\xdd" +"xJ\xb4*l\rj\xa3\x30\xb0i`~-\xf3\xcb\xef\xcey\xd6\xf6>'L\x9es\xa3>\xb8RF\xd5\xeb\xb9" +"\x86\xbf\xa9#\xdfh\xb2\xb8\xcf\x82\xafl3\xe7\x85\xf3[%\xb1\xd1\xd6\x14\xde\x85\xa4" +"\xf4Q\n\xdf\xe4-u\xb5\xfaT\x8\xa5\x9a\xbeS\x85\x9e(\xb3\xd0\x0\xeb\x9cj}/g\xc9\x1d" +"\xd1L\x89[\xa8{\x9c\xb5{\x85\x1eQ\x93\xfc\xc2\xa4\x43\xaf\x85\xfe(\xdfo9S\x7f#\xa0" +"X\xbc\xf8\x1d\xd8\xc0L\xb2\xc2P@0\xfLU\x97^\x85m\xcbN!\xe2\xb5H\x1b\xdc\xc0V\x1\x94" +"/\xb2[\xb8\xa6\xb6\xf9>,*3\xcdG\x8b\x44\x65VW\xc5W\xeb\xb0\x80\x17\x9e\xe5\xd9\x8c" +"\\\xeb\xe0\xb2[\xfd\xd9R\xff\xeb%\x80\x14\xd7\xa5\xbcK\xcaO\x1a#\xbb\xa7\xf6\xcenwv:#\xaa\xc7}\xa8\x8c\x8e\xfa{\xbb)\x91\xe4" +"r\xff u\xfb%\xa7Z\xcf\xa7\n\x4\xc2\x87\x64\xf4\xaeL\x12\x5\x1b%\xb1 \xca\xd2\xe3" +"\x4M\xa3\\\x1f\x94\x13]\xbdi\xb1\r\xe1G2\x1c\xbb\xdc\x81L\xe9\x99\x82\xac\x1dv\xce" +"=30\xe4\x1a\xb3\x1f\xfb" +"S\x5\xf4\x9c\xb8\xc7\xbc\x45\x13!\xad\xd7\xd8\x96\x39]&\x9d\xcd\xfd\xd0\x84\xeb:" +"\xa7\x3\x38l\x6\x97\xe9\x62\x92\x96Q\x16\x41\x35\xc0\x94\xd9\xbb\x1c\x9b\x94\x9d" +"^\xeb\xd3\xbb\x17\xf0,\x98\xc8\x13\xcc\xbf\xb2<,&!\x8a/Lc\x9a\x8b\x9d\xff,)@`7\xf9" +"\x19\x38\xa5\xe1\"s\x10r\x84(\xb5oH\x10\x8c\xde\xb3;\xd3\x19\x1e\xca\x89\xf9G'\x19" +"\x83\xdbwk+\xc8\x97\xa3\xe\xec\xf2`\x1e\xe3\xb2\xa6\xf0\xe1\x35\x39v\"\xaa\xc1\xf2" +"\xdfR<\xe6\xe6\xbcr\xe\x13\xcbS\xc\xefJ\xb9\xc8';\xd3\xd8\x15\x63\xac\x8a\x8elD\xa1" +"\x95\x11-\xaf\x82K\xc7\xa7/\xcd\xc4\xe1)\xa4\x80q{\xeb\x1\x8]\xee\x65\xee\x43\x44" +"\xd0\xb4\x1e\xc0\xbc\xdf\x84%\x66\xb1\xd9\xf5\x35;\x1fj\x6?\xfal\xdb\x6\xef\x63L" +"\x8b\xd5\xa7\xa6?\x99\x1d\x17\x8fV\xea\xca\x65=\xd6v\x85\xceI\xe9\x8cuTtZJ\xc5\x33" +"!vb\xd2>\x1di7\x13]\x13\xbc\"\x8\xeb\x8dPV\n+\xaa\xc3\x19\xdf\xaeG\x8bk\xa4\xca^" +"\xda \"/\xe\x9b\xdb\x8\x6\x32\xe\xd1\x66[T\xa3G\xde\xc\x42\xe9\xf7xB\xdeM\x18\x8e" +"~\x82N\xb2\xf0\xd7\xad\x16?\x5H\n\x7f\xa9\x9cZ`;\xbc]\xbc\x84\x37t\xca\x66\xe8\x89" +"\xb9\x45\x5L\xe\xd0\xb1\xa4\xbb\x14\x32N\xf9\x1\xb0#\xc2\x8\xcb\x95\xdf\xce\x92\x84" +"\x89x\x96\x90\xcc\x45\xba\xb9{\xe4I\xf8\xe2\xf5\xaa\x92v\xc0W\x13\x3\xe9x\x8c\x46" +"\xe7\xf7\x89U[\xfc\xdc?\xa9\xed\x8d\xa8\xad\x9b\xa4\x8b:\xe0\x94\x4\x66\x43\x91\xe6" +":\x98\x9e\xf1\xe2K\xb4\x64\x4:\xa0\x99\xe4\xf2\xd7\x96\xe3R\xeb'q\x6\xd8\xd8\x1b" +"\xaf/\x85\x62\xef\x46\xbc\xfd\x1e\x0G\xe8\x1\x8c\xbd\x97\x30!\xdc\x1c\x1d\x82\x1a" +"\xf0?\x8?\xb\x8\x8a\x62\xeb\xcf+\xf6\xc5\xb0\xfc\xfa\x44\x1a\xad\x16%\xfd\xb8\x34" +"\xf9\x43\xddG\xa5\xa4.\xb3\xe9\xa5\xb4\x96\x41\xf7\x97\xc2\x88\xb7\x99\xa6H\x97\xf1" +"4`pF\x1bmS^\xcN\xd0\x99\x19\x9c\x38z1v\xae\xdc}\xa7\xe7\xd9\xe1\x18\xe5Ue\x9*6\xf7" +"\xc7J\xbf(\x17 \xc0\x14\x7fNO7\xd4\x94\x36\x46la\xff\x12vN0C\xd8\xa6\xd0'\xe7\x5" +"7\x16O\xeyB\xf4\xac\xa4+\xb2\xcb\x13\x61w\xefq\x97\xe7oI\xab@?t\x1c\xe\xf9\x2\xfe" +"\xbcG\x1a\xd6\xc6'BC \xa8\xc3\xa1\xf0L1\xcQ\x1b?\x91\xc3\x93}\x9a\xcf\x45\x99\x99" +"\xc1\x8a\x33\xf2\xc8R\xec\x38\xca\x80\x65\x99\xc7(\xc5\x43q@\x18\xc6^,_C\xf\x62p" +"\xafR\xadq\xed\x38\x81;`D\x7yE_\x95)\xa4\xa1\x62<\xb9\xf5\x42+\x92\x16\xf9\xcd\xba" +"\x91;\x9a\x1c\xd9]\xa2%\xe2T\xe8\x10\x12\x16\x8P f\x5\x9\xd0:\x3K]~2\xe3\xdb^Yb\xa9" +"\xa2w\x11\xd4\xc3\xe2\x9c\xd8@W\xf7\xd0\xd7\xe8\x0\x9G\xaf\xe8\x96\xf8R2S9\x1d.\x11" +"\xff\xfeR3f\xb0\\S-V)\xa9\x7\x41\xea\xb3\xd4\xa7\x31\xd3\xf6\xd4\xf0?\xf9\x32\x33" +"\xdd\xf8\x8b\xb1\x91:\xba\"\xeb\x9a\xa6\x31\x1e\x31\x44\x38\x1d\xae)\xbc\xc8\x63" +"\x99X\xee\xe5\x9a\xcc\xfa\x6\xf3]\xcc\xc6>\x6\x9\xf5\x42\xf3\xee]\xfb\x1c\xf7\x18" +"\xca?2\x84Uro\x8f\x65\xe2:\xcd\x97\xe@I\"Y\x98\x37\x1b\x63\xe3Z\xe9\x8d\xc5M\x83" +")\xb8\xdb\x9\x1\xfa\xa6\x31)\xed\xe2\x1b\x15\x87v\x98\x1dM\x9@\x13\xc0\x96\xe9\xcd" +"\x2\x3\x15\xd1#\xc0=\xeb\xa2\x1e\x97\xe4\xb5\x84\xb4\xbc\n\xf2_]\xceS\xc2\xdc\xf" +">a\xf9\x9b\xec\xab@y\x94x\xbe\x7fZ\xfd\x7fh\xe2>\xf5\n\xd6\x64\\\x96~\xe1\x12\x6" +"\xb6\xe7\x91v\x94(\xac\xdc\x37\r\x64\xe4\xf2\xb3\x97.\xeOD\"\x97\x19\x93Pf=nw/\xc6" +"wz\x9b\x9d\xe2\x15'=\x8,\xceN\x86x\xfe\x99H\xdc\x8d[\xe\x45\x9c\xd0/\x16\x45\xac" +"V \xf3W\x1a@\xb4\xd5\xa1}\xf5\xcf\xf4\x8bl\x84=\xde\xab^\xbfX\xfe\x13\xd7\xda\x8" +"\xe8\xaay\x2\x11\x92H\xb3\xb1Q\xdaX1\x1\xcf\x80\x85;\x1P\xfe\x5\xbd\xed\xbf\xb5\n" +"\x7f\xb0\xf6W(\xc9;\x9d\xf4\x8c\xe8\xaf\x1d\xf1\xfa\xc2\\\x1dX\xe1\xad\x30'J\x0\xeb" +"T\xcf/\x16\x2\x9e\x1a\xc0\xa0\x91\x9c\x6UGK\x9ai6\xae\xe0\xfbt\xbd\x18_\xe7\xd7\xb" +"\xb8G\x86\x99}4\xa4\x3&\xa7\x43V\xa4\xaf\xae\xe6{k&\xd1\xc1\xa7\xbc\xff\x86\x97\xb5" +"\\\x81l\xcdw1,3*U1]\xc5O\x9b\xc0\xa0\xf1%\x0\xe0\xa7k96)*=\xa2\xdd\xf5\xaa\x8c\xbb" +"\x9b]\xc3.\xda\xccH'\xd6\x84\xd2t\xe6[\x8bv\xfb,+\x19\xf7\xd5`u#\xfa\x95>4\xbb\x39" +"\x3,\x5\xb1\xc1$C\x4`lUf\r<\xa8`~vN\xa5\xb0=\xb7\xfc\xab\\\xf7x\x8cn`\xec\x8c\x44" +"\x9b\xca\xfd\x90\xbc\xab\xa4\x13+l\xbc\xcf\xf1g\x84\xfbY\xb3kw\xcf\n\x9e\xa5r\xe4" +"\xca\n\x1\xc7%\xa6\xcf.E\x0\xcd\xdf[\xac\xcb\x90\x94\xd4\x89%\x43O\x4\x41\x18\xcf" +"\xdc&\x96\xaf_\xc0\xca\xb3\x88\x41\x7\xed\x17\xb9\xbd\xe0\xc0\x10K\x12\x92\xa1\xf8" +"\xc9\x9b\x6\xfcJc`\xb2\x44\x80\xbdY\xdf\x4\x88\x64\x18\x99\xb0\xf4+\x13\x11\xb5\x82" +"q{\xa7\xec\xfe\xe1\x41\x43\x65KSq\xc8\xb9\xb2\xd8\x6\x85\xad\x38\xd8\x97\xad\x1e" +"d\x87\\(\xc7\x2\n\x84\xfb\xb3\xa3\xbb\xee\x16\x61}\xcb\x9b\xc8\"\xb7\xc5\x9cZ\x18" +"\xc0\xcf~\x80\x16:\xdf\xb7\xaa\x3\xb7\xcd\xe8I|\x16\x97\xd9\xf.\xd9\xf\x81\x30\x95" +"\xc5\xb9\x16W\xfc)N\xf0\xe3\x41\xdb\x33\x92\xed\x86\xc\xb2\xe0\xaa\x9)=\xf\x99\xae" +"\x9e\xb5Lv\x1c\xa2\xdb\x1eQ\xe1\xce\xae\xab'l{\xd9\x16\xc6\x85\x10\xd7-\x9agF\x8b" +"\x9\xb3\xc3\x9ax\x15\x62\x8f\xb1&\xcd\xfd^\xffY\xcc\x81\x84\xc0\xd3Z[Y`\xf8$\xbd" +"\x17T\x95\xdd>\xb1*N\x96\x0\x8c\xb1;\x8cWE0>f\xcf\x86\x8\xff'\xc4p\x9c\x1d\x85N\xb7" +"\x96\x8\xe5/\x6\x8f\xec\x1Q\xa7L\x12^\xde\xae\xa5U\xc1\x98\xfc\x8\x2{\xbb\xb8\x2" +"\x83^\x1d\x43Pw\xaeK\x1c\xcd\xbfr#T\xf6\xc5r\xbe\xb1\x37m>4!\x95\xfa\x80\xac\x97" +"\"\xeb/F\xe4M\xe0_Z\"{s\x1b\x8dJKn\xde\xf0J\xf2\xc5\xde\xc2\xee\xf8\xffH\xc5\xb1" +"\x87\x10\xad\xe3\xdb\xfa\xc\x95\x65\x5\xb6\xda\x9c\xcb|\xbb\x83M\xb6\xccuIH\x85]" +"\x83\x36p\xff\n\xc4*Gs\xfe\xa8\x32+\xec\xee\x4\xcat\xac-f\x85Q2\xd1\x1aQRD\x88\xc5" +"Gq\xb5\xb7\xa5\x12ym}z\xe0\xf9\xc1\xfb\xc9\xcb\xdb\xa0\x83\x10t\xf4\xd2\x0\x34\x9d" +"\xc\xa4\x5\x37\xb9$\x96i'f\xf0 \xac\x43\xac\x1\xdb\x8b*\xa2\xef\xa9\xd2\x17\x32\xbe" +":1_l\xaa@+\xb2\xe6\x1d@\xdd\xeb\xde\x11'm\x90\xc2\xc6\x1\xa9\x35\xc1h\xbe`\x4\x64" +"v\xad\xed\x15\x8}T\xa1Lh\xee\xcb\xbb\xb5\x90\x92|\x1e\x10\xd2\x91\xc9(S4\xcb\xc\x80" +"\xed\xbd\x39+\xdeMS^\xb6\x1f\x8evA\xf5\x8a\xc1\xdf[\x1cZ]\x91\xe3\xe2~\x5\xca\xf7" +"\xec\x97\xec\xf0\xc8[d%\x19z\xa8VR\x1e\xd7\x1\xe5\xae\xb8*\x7fR\xa8\xbd}\xc9}[?\xb5" +"\xc9\x9a]\xf8M\x1b\xaf\xf8\x90r\x92%\x9\xd7k\xc6\xed\xb1\\\xe5\xf9\xeb\x8f\x41T\xbe" +"\xe1\xe8 $\x2\x83\xbd\xc8:\x8eI\xaa\x9a&I\xb7\x95]\\\x5\x8f(\x18\xa6;\xd0\xbf\xe7" +"\xea\xce\xd4\xa4\x90\x63\xc4\x89\xa6&'z\xe1$or\x1c\x99&\xe2\xa2\xb6\xc3\x10\x45\xfb" +"\xcd#_<\xc5\x8b\xc4\xddlW\xfe\x99\x8e\xbd\x1e\x9f\xa5\x15\x46R\xbe:\x16\x85\xbc\xd2" +"\xef\xaa\x7\x9a\x32\x93\xf7\x81\x42\xa6G8\"\xfa\xb6'\x92~\xac\xcd\x61\xb3\xe9\x9c" +"0w\x10=-\x19\x38+\xc7\xee\x15\xba\xd0\xfd\xe4\x89`-\x5Z\x1\xdb\xbc\xf9\x1aVitU\x9d" +"\x1bG| \x94\x16\x88pS\x16\x9c?\x8fY\x95[\xe4\xde\x82\xb6\x5X\xcc\x9a\xe1V\x2\xa9" +"?\x2\x9fkC)\xe0\xe6*\x3\x98-\xb3/R)qN\xfa\x14\x91\xa7\xb2J\xef\xe1\x8f\xeb\xc2\xc9" +"=\xfeP\xb3\xf6\x41\xb5\x1b\xdd\x33\xda\x38\x87\x1b\xf5$<\x17P-\x0\xae\xa2\xd9\xe9" +"sN\x80\xa9g\x88\xd4\xcf[\xc1*B\xbc\x38\x61\x62\xfc\x88\xa7\x43^\xe1\x32\x0\xc1\xc2" +"\xc6\xcc\xc5\xd2\x1a\x3\x94\x10\x7\xb4\xc4)\x1b\xdbq\x14\x46\xce\xaf'\x14\x81\x4" +"\xbb$\x3W\xd5\xed\xa0\xeaZ\\\xe2}J\x83\x90\x9du\xbf\xc0]u\xf1\n\xa7Jm\xe3}}\xe1\\" +"\x1d\xda:\xc3\x4]\xa6\xcdH2=\x90NqkD^^\x9o\xcb\x37\x93S\xedp\xcfKo\xac\x10,v'\x11" +"\x7\x9e\xfa\xf1?\xb7L\x9bG\xafu\xf3\xf6\xbd\xa2\xa4\x64}*\xb4~\xca\xb6M\xa6\xcc\x1" +"G\x9f\x61\x8e\x8d-\n6ED^\x87\x44h<\xbb\xc5`\xd4|\x98\x7\x8b\x84 n\x90\xeb\x83\x9b" +"\x2\xd3|\x85+\x8e(Dc\xd4\xe4\xd8\x90 <=[ 5!\x10\x3N\xadk\xd7\xf4\x14V\xb8\x7\xe1" +"\xdb\x16\x31\xa9\xd4\x99\xe5.\x9d\x98S\xd8g(\xb1\xa2\xe5\x11\xf4\xf\x8c\xa1\xe4r" +"J\r\x17\xec\xd6@\xb5/\xf6\xc6n(i=\x89v_\xc3\x91\x61.X\x89\xe7t#\xec\x85\xcb\xd0\xa0" +"8\xb6\xba\x98\xb6\x7p\x1d\xc0\xc4\xb6k;(\xc7y\n\x1f\x1e\xb8\xd0Q\xdc\x98'm\xd9\xcf" +"\xef\xab?e\xc1\xc9(\xe4\x8a\x6\xc\x99+9*C\xe5n\xaam\xed\x89m\xeb\xceq\xf8$[\xe4h" +"\x7f/\x1b\x8f\xc0\xf4>\xce\x8d\xb0\xbd\n\xb0\x81\x1c\\\xe7<\xbe\x33`#\xa0\xd6\x61" +"h\xb3J\x95\xb4\xb0\xa7P\xb3\xbf\x1d\x19~<\x4,y\x14\xfas\x1dx1\xafy\x8e\x94)W\x1c" +"\xbb\x97~bX$N\x84p\x1e_\xf9\x1d`\x8f\x98\xfc=h\xa4\xee[\x81\xd5\xff\x38\xb6\xc1\x84" +"\xf6\x11\x8b\x87_\x2+L\xe2\x7\xdc{7\xe1\x45-\xfd\xc5\x91\xa3\xe5\x6\xae\x82\xc7\xe7" +"\xbf\xf0\x1\x1b\n=\xbd\x61j\x99?\xbf\x87\x8f\xb0;l\x9f U\xa2\xb0\x95\xd2\x93\x61" +"\xf8%<&#e6\x87\xfe\n\xb9\x80x\xf6\xae\xe5\xfc,+\xde\x4\x5\xea\xbe\xdb:3\xeb\x7f\x4" +"\xcbh7\x17\x62\x45\xf1\x90\xc6\xbb\xbc\xd6\x45\"\xb1/\xe7\xf9\xcd\xcf \x1a\x1a\xa8" +"\xa1\x9a{\xbcJ\xc0\x64\xb4\x95\x8f\x44\xaa\xf\x8d\xda#\x83Z\xd2\x8a\x1f\xd0\xea\x10" +"]\xe2\xf3\x95\x38]\xcc\xfb\xe2&\x1d\xc5\xa8\x9a#\xaf`j9\x85\xe5\x3\x87\x6\xb1\xfe" +"\x9\x10@\xe\x16\xbf\x0\x8f%\xf;\xde:\xd8\x6\xc7\x35I]I\x9f\x16\xf9\x92u\x1\x4x\xfd" +"!'\xbf|\xed\xd6\xb5\xbdP_\xbe\x9b\xd0\x6[Jp\x90\xc9\xd2|\xd5\xb3l:\xd3>\x1b\x31\xeb" +"mD\xe3u\x0;Q\xb9\x9\xdaP\xbd\x18!\x84\x18\xb3\xcd\"\xb4\x32x\xb1\x44\xbex@n\xaf\x16" +"\xc7\xdfkl\x1c\x62\x38\x0J\xabssk8\xe1hD\x1d\xc1o\x9a\\\xf6\x7\x93\xa1\x86\x33\xbc" +"C\xd7\x86t\xd1-8\xcc\x97\x9f|\xaa\xdan\xfe\x80|\xeaI\x9c\xb9\xfe\x61\x64\x96h*f\xe0" +"K\xbd\xac\xe1\xdc\x11+!V\xb9\xb0\xb2\nX\xa8\xcb\x43\xff\xe\xed\xb9\x98\x5#K\x9aW" +"\x89v*\xc7\xd6_Z1\x9c\x33\xf4\xf7\x43\x8c\xd1^\x6\xbb\x80\xa7\xa9~\x97n\x8c\xec#" +"\xf4\xc6\x46\xa5\x82\x18\x80\xa8+/\x1d\xc2wg\xf0\x90\x99~\x91H\x8b\xfa\x15\x6Kp/" +"\x86O\xce\x65\x5\xd6\xce\xf8}*\n\x12\xb5[\xa1\x89\xaf&\x98\x11\xe3\xb8\xb8P\xc8@" +"\x1f\x39\x6\xc0\x80\xd3&\x18\xd9i\x8avg2\xa4\n\x9f\xc5\xa9N[\xdd\xa3\xd0(\xd8#\xd6" +"\xb6\x3\xb6\xd1}\xd0\x46\xde\x18\x1f\xd9\x89\xea\xf\x80\xb4\xca\x62\xf7\x97>M\xf5" +"\xe0\x32\xa3\x1f\xe6\xbc\x8f\\\xdag\x8dJrx~\xb8%>\xa5\x88,3|\xdf\x9a\xa3\xe1\xe7" +"\xd9Sm\xd0\x9b\x4|\xd8\x96.w?r\xf6\x41\x8a:\xefZ(\x9b\x34\x6\xc1R\xa5\xc\xe7\xbd" +"KI?\xff\xc2\x7fj\xa5/y\xeag\xe3\x62\xfd\x92U\x9a\xa4\xf9J/x\x7fls]\xfa\xdc\xf2\xf0" +"\x8a\xaf\x98\xb8\xcS\xcaV\x7\xa9O%\xf0J\xa6Zp\xa7Y7\x84\xes\x5[=e\xfb\x5Lc\xe2\xe4" +"\x8ehH\x8c\x93\x15\xa1>\xe9I\xe0>Fr<\x11\xccu\x9d\",\xbf\xad.\x1a\x87\xca\xd7y\xb2" +"=8\xf7\xe2\xf6`\xde\x13\x88\xea\xf1\xcfM\x18\x99Mu\xc6\xcc\x63\xf1\x87\xfd\xb9I\x94" +"\xc\x18\xb5\x37\xa0\xaf\xb1*\xc5\xf6{\x2\x83\xca^\xfe.vLCi\x10K\x9d;\x6I\r\x12\x44" +"\xc4\x1d`\x85\xc8_\x11\x6\x8.\xc9\xdb\x84Xb0Q\x1c\x5\xc8$\x12\xd2\xcd\xf3\xda\xfb" +"\xf4u\x9awV(\x87\x8f\x99t\x15)k\xc4\x16\xac\x83R\xa6\xc6\x98\x86\x91\xfc\xb8\x31" +"\xcf\x95\xc1\xb\xaei\x1a\xdb;\xa2\x91\x8b\x35\x92K\xd5\xc3\xac\xad\x8b\x13s\x97\xb1" +"\n\xf8+G\x98\x0\xfe\x16\xd4r\xcd\xc\xdb\xda\xabO\x88*\x6I\xcfV\x10\x4\xb8\xcb|\xa3" +".\xc1)\xd0\xa4\x15\xbel\xb9\x1d\xa2\xb6_D\xe8\r\x13\x88\x8\xa1'\xe8Q\xa7\xfc\xf9" +"'\xe9\x9d\xaa\xe\xa2\xd6&\xb7z\x16\xc7.7\xf0X\xa3\xb8\x82\xfcIU\xdc\x8c\xb6\x31$" +"4\xbd;\xce\xd7W\x80\xb1\x35\x90\xbfO\xe8\xd6J\xcf\x3q\xf9\xfb\x1d\x36\x1b\x5\x2X" +"R\xaa\xb9\xed\xa1\xa0\xc9\x97\xcf\xa5\x80R\xc4T\xfd\x45\x1el\x1f\x19OM61\x14\xe3" +"\x12\xf6\xdc\x35\xbb\xaf\x35z2\xcd \n=\xd9\x65\x41U\x13\x42Y\x88}gz\xcc\x44\xf8\x9a" +"\xa4\x1\xca'(-\xf7\xdc?/\x4\xa1\x8\xcb\xef%X\xdc\xce(\xba\xc2\xd8{\x8d[q\x81\xea" +"\x92\x7f\x61\x97wd\xf8\x82\x62mJ\xb3\x38\xd9\\\x94w\xc5N\x9c\x36\x1*<\xff\xbe\x19" +"\x9e\xc8\x12\n\x99\xd2\xd7\n!\xf9\xd9\xa0\x35NN\xacyG\x99\xe\x8an\x6\x1yj\xafo\x14" +"\xe7X\xca\xbc\xab\xdf\xbd\x82\x4\xa8\xe7H\xa3\xe5\xfe\xbaW\r6\xe2\xbfGL\x0\x83\"" +"\x9a\x63\xf9\x61\x14\x18#!\xb2\xeb\xe1\xbcv\xdd\x19\x37$\xc4X\x8c\x1d\x39\xd1\x84" +"\xc3\x32\xfa\xea\xf4\xc6)\xf2\xb3\xb2\xf4\x99\x96\xe4j\xa6\xc9\xf4\x97\x42\x8b\xea" +"R\xd5\x88v\xb0\xdc\x7\xb4`$\x8b\xc8\\\xc1gs\xa5\xda\xc3l\xde\x8b\x15-\x96\x5\x7f" +"N\xfa\xaf\x8b\x1d\xc1\x0\"\x3\x85w6\x80Wi\x9b:7\x17\x8a\x9f\x1fll\xc6\xb\xae\x82" +"\xbz\xdd\x7\x17\x91\x1b\xd2:m\xcd\xad\xaf\xa3$sI\x1a\xa8\xc\xfe\x90\xf2\xa7~$\xce" +"(&\xffw\xb1\x8b\x86\x9c\x33\xfa)/\xe0\x1d\x64wvPD\xc7\xd1JT\x8b(\xb1\x36\x1%\xc6" +"\x93?\x5\xc5\x8b\x8\x89\x39\x5\x37\xcd\xd1o\x8e\x96~\xb\x38W\x94I\xdf\xc1\xe0s\x89" +"\xb7\x6\x9a\xa8YLQ\x3\x46]PA\xcc\x92\x92h\xde\x86?\xad\xb6\x92[5\n\xa9J'\xd4!\xfb" +"\x7f\xcc\x81\xc6\xb3_\x90o\x12$kzQ@Q\x1a\x97!\x1b\xa9\xbdh1\xa5\x8\xe9\x63\xfe\x8b" +"\xe9\x61\x33/Ux\x8H\x8f\x6\xea\xd7^\x86\xd6\r\xe3\xfa$%\xae\x84\x39\xec\xb9\x11+" +"\xc3\xe4\xd7\x37G\xc1\xc8\xe8zd\x99\x19\x82pI\x83-\xb0\xbfm\xa8\xc8\\\x9a%\x92\xac" +"\x0(\x9\x7\x9\x0\xec\xadR\xa5o\x1b\xfd\x45j\xfe\x6\x65\x9iN\xac\x7W\x88\x45k\xb\xb" +"\xdd|\x19-2\x1e\x9f\xb6\xaa\xdc\xae\xf0\xfW\xf\"\xcdJS\"\xfb\xce\x8f\xa9\x8f\xae" +"\xb6\x81\x94\x8\x95\x42\x62p\xbb\x43\x19\xc1\x1d\xa6}\x88U*ss9\x8a\xec]\xa7\xc9\xca" +"\xa9\xf3\xb3\x45\x81\xc6\xe9h\xda\xaa\xb2u\x1c\xc0\x12\x19\x9d\xd8\x97\xb4H\x98l" +"\xff\xba\xe4\xd4\x12\xbf\x9e\xcb\xf4gBqZ\x95i\x93%\x16%\x9d;:T1\xcdp(\xe4/\xc7Q\xc4" +"4\xe2\xb7\x14\xc7\x18 +\xf0,\xaf\x9b\x8a u\xde\x92#\"\xea|\xfa`\\\x83v\xfa\x95\x8b" +"\x8f\xbe\x43\x3\x1e\x10&\xfb\xe6\x12j7u\xf6\x43\xeag\xeb\xbd\x97\xf2\x39\xfb\xc7\x1c\xab\xf\x89\xe3M`\xc6" +"\x9b'/\xad\xc2.\x8e{\xdc\x62\x10\xdb\x9\xfd\xd9\x13\xe2\x9\xf4\x9f\xd2\x8e\x87\x12" +"\xb8P\x89\x4\x62\x2Ptl\xa3\xb2\x1b\x2n\xda\xe6\n(\"\xf5\x9e\x91.bk\x93\xe0\xd2\xbf" +"\xb3#\r\xfd\xeT\xe9\x1a\x1d\xba%\xa6\x9\xb6MA\xab\xd8\x97\xa5\xd2\x17\x64\xc3Q\xe8" +"_\x9e\x87\xbe\xab\x9e\x64QI\xad\x32\xae\xeb\xb3\xb1\x16\x10\x32\xc7\x1\x64q\x15\xf9" +"\x8c\x1c*\xae\xce\x87\x18\x62\xd9\x1d\x32\x1a\xb9\xf>\x92;\x1f\xde\xe0\r\x92\x7f" +"\x89z\xa9\x81#se6\xe2\xe0p\xf\x10\x5=~lX\x9b\xf6`)\xd7\x94\x88>\xaeL\x82(\x94\x1c" +"\xe9\x65\x65\xb5\rH\x88{S\x14\xa2\xe5SyYc\x82\"\xa6\xcaT\xc7|\xba\xbd\x46\r\xac\x11" +"\xb0\x63Q\x9a\xe4\xf5\r\x93\xde\x41v;\xa7\xcf\xbfLw$6\xeu\x4x\xeb\x62\x89!\xda\xa0" +"e\x85\x83\x41\x95\x8eO>\xb5\x96lm\xd7|\x5\xee\xec\xdfK_l\xf1\x9a\xb5\x7X\x9b\x42" +"\x19\x37yY\xbd%\x8e\xc9!\xc3O\xe1\xdb\x0?}\xf\xea>/\xd6\xf5\xdd\xb0\xa2\xd6,\xa5" +"\xa2\xcdj/\x9d\xbf\x9f?4\xa0\x85" +"\xf4/\xe6:\xcd\x93\x1c\xd8\x46\xb5}0\xdb\xe2\xd6\xb4\xb4+\xa7\xb3\x84\x12\x4\xcf" +"\x18Z\xae\xeay{\r\x16\xdf\x1d`\x6\xb\xeb\xe8?\xbd\xd4\x93\x1a\xf1\x82{D\x9b\xef." +"\xab\x88y\xeb\xef\xe5Y\x1 \xef\xfb\x8fx;\xe0\xe`/\xa7nS\xeeN \xe9\xa5Q\x89\xbe\xe4" +"\xe\xcb\x84-88\xdc\xc5O\xbft#\"\x9a\xd6\x8b\x98\xe0\x33\x81;\x1a>F\xfJ\x9b\xae\xa1" +"\x87`\xd0]\x85\x98K\xb>\x16\x1f\x13\r\x92\xab\x90\xa1\xf4t\x16\xb3\xf2\x1dw\x97\xd2" +"\x84\x42+\xbf?\x18[\xff+-\xe1&\x4m\x9\xb\xe4O\x9a]\x8el\x80\r\xef\xd3\xa5\x39\x44" +"\xff\xf1uf\xaa\xb6\x9c\x8f^X\xcd~&\xc1\x5\xbb,\xa8\xac\x7\xb6\xff\x10\x43u\xa9\x8e" +"#\xe4\xef_7\x3\x11\xee\xaa\x19T\x16\x9c\xde\xc1\xa8#\xb5\x1f\x1d\xa9>P\xa6\xc0\x32" +"c\xf\xe\xd2\xf0\x10\x98$\xf7\xae\xb6\xb3\x85\xe\xc9\xd1\xc2\xa9\xbe\xe7\xdb\xd8\xc7" +"\x87\xf7\x8a\x94\x2\xf9l\x7f\xd7V\xf9\xc6\x31Q\xca\xft+\x8a\x1e\xe5\r\x12~\xa8`\\" +"\x1c\x1f\xe1\x94\x83\x32\x18\xe9\x1e\x6&\x1c\xbf\x15N|\xe4\xce\xcb\xb9\x41\xd7\x65" +"\x9fm\xa4\xbd\x99\x8d\xf9\xfd\x18Nol\xb0X<\x8b\xa1\x8a}&\xc9\xe8\xcd\xa7\xf7\x97" +"\x84\xf0S$6\x84i7\x0\xa4\x82\xa8\xf2\x18,\x91\x42\x11O%S<\xbf\x9b\xa2\xb4=\x83:\xa0" +"\xfc\x1dz\x95\xee\x86\xcd\xb1\x99!\xb4\xe2{H~.5<\x8b\x94+\xfd\xcd\x6\x97K\x81\x15" +"\xfa )\x1f%q\xfa\x63UQ\x10\xb9\xfd\x8e\xe1\xbc\x94g\xeb\xdc\xd4\x14[7,\xca\xd7\xe9" +"\xf9\x34`D\x9f$3\x1a`0)L\x17+\xc9\x18\xb1&bq\xe8\xc3\x9eR\x85\r\x83\xd2\xa7\x8d\x8f" +"\xd2\x63m>\xb9'ru\xf1\x44\x98$_\xdf&-T\xab\"\xc9\x19\x87m:\xb4\x7\xf0\x7f\xec\x8e" +"#\xd2\x8a\xcb-=A7W\xedO\xba\xf2\xd0=\xba\xae\xe7\x3\x45\xf6&r\xa2\x38X\x9a\x3\xb2" +"\x8b\x3\xa3\xa1\xabk;\x97\r(\xd2\xf7G\xfa\xcb\x7\xbe\xf7\xe8\xcb\xc0\xa8G\x89\x8f" +"\x0\xe6\xa2s \xcfQ\xdb.\x14\x39\x35\xf1n,m\xa9\xd1\xebT\x81\xf6\xe7XR\xc3\xbc|\xbd" +"\xbb\xde\xb5\xb2z)\x9e\x1a@\x3\xb0\x89\x65j\x96\xde&\xfbT\xd3\xfd\xe4\xb\x8d\xd6" +"M\x1\xe3\x30\xda)Hku(\x90\xa2\xe0\x80/\xc8q\xca\x86\xcb\x8e\xb4\x3zr\xfesP\xe8\xa8" +"{\xdc\xae\xaf\x18#3\xa6\xbb\x92\x9b} +\xd5\xe4\xd1\xac\x9e\xd6\x9d\x15\xf8\x16\xe3" +"\x9d\x45\x8\x9d\xbd\x9e\xd2\x34\x3\x2\xf6\x39Im`\x18\x1c\x0\xc3\xc8@\x17\x15\x85" +"\xc3M\x97\x91\xfc\xf0@\xf1(Xt6~\x12[\xe5\x82\x8\x8c\x1\xdc\xf7swP9#}\xa5\x33\xe6" +"y\xfe}\xfb\x9br!\xb0O-i\xad\xd1\x9e\xcf\xda\xb\x94\xbfS\xdc\x38\x9f\xd0\x66n\x7f" +"\xc2\x92\x38\x39\x95Q\x8f\xb7\x81s$\x8d\x9e\xe7\xf0\xfey\xca\x89\xad\x1J\x19\x16" +"\xda&z\xee<\xe7\x1\x5[\xc8\x8cL\xc0\x5=\x8d~\x9\xca\x7*\x4\xf1[\x18q\xa3\xc1\x11" +";)\xdf\x7f\xa0\xc1\xa6\x8\x8d\xdbk/\x97\xe0=\x82\x9fm\xe8\xfb\x1cQ\xd4\xe3\x44\x87" +"0\xfc\x94\xaf]b\xb6\x9e*\xfb\x84:\xe2\xa8\xb1-PF\xe7\xbf\xe9\xfb\xfc$\x4\xbc\x62" +"2\xe3R\xb2Z\x12\x8e\x8aP\x1do\xec\xf0%q\x9e\x1e\x1a\xd7\x89\xb@\xff\xff\xb0\x6\xdc" +"\xd4*e@-\xf3}\x8b+\x91\xcc\xff\x1b\xed\x30\xb8\xe1\x92\xb5\xf2\xf5=&:\xde\x7\x98" +"\xf2\xfc\x94\xd1\x96\x93sK\x16\xab\x45\xae\r\x0\r\xee\x66+ \x9d\xb9%\xadT\xaf\xc3" +"\xb5?\x15%\xa4\xbb\xb1.\xa7\xec\xd7\x12\xb1\xa4\x2\x97\x42\x98Z-W\"7b\xd6\xd8\x36" +"\x88\x45u\x15\xd9\xc\xa3\xff\xe2\x1d\x90\x99\x97\x9eN\xbcy\xbf\xacp\x8d\xa0\xad\xc4" +" \xc6v\xadYq(\x8a\xaf+\x8d\xacJtq\\\xfcv\xb1\xe6\xd5%\x1\xe0\xf7v\xb6PeE\x8e\x63" +"\xe1m\xc2\xc6\xd6\xce\x18\xad\xc8\xba\x94\x13\r*\x90x\n\x12|\x9b=\x87\x8e\x94&\xce" +"\x14\x96\x7f\x8e\x65\xe4\xbf\xd9\xf4u\x82\xef,7\xc3\x61\xc1\x0\x8d\xb7\xfe$Zm\xd6" +"\xc5\xbf\x8a\x84\xcc\xca\x5\xcd\x96\xcd\x1a\xea\xe0r\xc0\x98V\xb3\x36V>fA[r}X\xd6" +".\x9d\xcbs\x82\xc2\x1b\xc7\xe4P<04l\xe2\xbc\xf4\xba\xa2\xc8{p\xf1\xa7\x13\xea&\xfd" +"w\x93\xb1\x14\xe3\xb7q\x4\xd5\xf1\xc5\xee\x8c(+\xc0\x1eY\x1c\x6\x89s\xf8S\xc5x\x81" +"\x19\xd0\xcfS\xae!<\x17p\xab\xdb\x1c\xf3\xfb\xf8\n>w\xf7\xdbY\xf9\x30.\xa5[\xbb\x16" +"\xe9\xf7u\xd0O2B\xca\xd8\x8e*\x1c\xec\xe8\x7\xdbY\xda\xec|\xf7\xe8\x9c\xcc\xf7\x36" +"\xe\xc6\x11\xde\xcc\xfdPC\x1dg\xfb\xe3\xe\x80\x84:\xb2\x8c\xc0\xe3\xe9\xe1\x37L$" +"\xc1UgE>\x8e\x92\x8es\x5\xfe\x9e\xea\xb4\xe3\xc8\xb1\xbd\x92\x14\xb\xb0\xd4\xd4\xf" +"\x80\xbc\xe7\x63\xc2[\xb9\xf\x35\xa6\xe9\x7u\x9eWL~\x9d\x34*,x\xb1\xb7\x8bh\xcd\x93" +"\x1\x7^j\xa6X:N\x18R\x8b\xf0\x66\xbc\x84\x37R\x10\xa9s\xdd\x1a`\xa6\x93\xb4^\xff" +"lQ\xff\x89\x9\x46\xad\x33\x1a\xc0^\xf8\xb\xba`\x84$\xa5\x82\x96\x85H\xd1\xc5\x64" +"\xc\xb8(W\x86\xfd\xe0\x1c\xf8\xfb\x15\xc5\xb8!\xc5W\x7fz\xbe\x96\x83\xc1\x64\xba" +"\x9ai\x19\x6p\x9a\xc4mfK\x83:\xa7\xfeZ?\xad\xb6z\xd3\xbd\x82\xae\x43\x8|\xe7\x2\x12" +"\xb4i\xce\xa0\xe2\x8b\xfc\xce\xc3\x4\x96\xf8\x3\xd3\xec\x1f\xca\x36l\xa9%\xba? \xbe" +"\x9c\x34\xd8-\rr\x15\x19\x9e\x82\x9fM\r{N\x96\x30\x87\x9d\xa6\x8c\xa0Qa\xe4\x31\xb3" +"e\x10\x80M\x97\xab\xc1\x89\x1c\xb7l\xa2K\xfbz\x89x5\xe6\x7f,*\xd7\xd0\x97\x1d\xbb" +"\xd6\x81N\xb6T/~O\xa3\x6\xfc\x97\xa0X@`\x98\xc5\x35\x64\xef\xbf\x46\x89\xdc\x44\x8f" +"\xb6\x90\x80\xa0\x8aT\xc3`+U\xa6\x81\x9\xd3\xad?\xb8>\xed\xa6\xdd\xed\xa6\xdd\xea" +"N\xa4$U>\xc2/\xbd\xde\xf6RTH\x8f\x91\xadN\xd3\x8e\xf1\x95\xc4\x18\x42\x8e\xea\x7f" +"\xe8P\xc6-\xba\xc2\xf9\xe3\xc9\xcf\xc8\x65\x42\x15=\r\\\xaf\x94\xc7\x89\x16\xc\xee" +"\x1f\xc0\x9\xd0\xceh\x95\x1az\xe1\xb6\x66\xe4\xab\xbe\x82\xa1\xc6\xa3\xe9XY5.\x84" +"\x0\xe1\xf3\xe2\x7fN" +"\x6\x80\xba\xb3~>\xb4\"\r\xe2\xe2qs\x8a\x5\xc3\x33?\x7\xd0\x44\x41\xa4\xc7~\\\xb0" +"\xfe\xdd\x6/=\xc\x93\xd0&vD\xf5k!\xb1\xef\xda\xd3\xb6^\x8c\xc0\xd2\xccRdY\xcf#\x91" +"\x19\xf0\xda\x1b\xfd\xd8\x1fz/\xc1]\xe8\x65\x8c\xea\xc0\x1f\xa7\xf8~`(\xa8\xf2\\" +"\xe7\x11\xf2phB\x98\x1e\xde\xa8\xc6g\xf9\x8b.\x1a\x44\x63\x98\xee\x1a\xaf\x31\x1a" +"\xa9\x11\xed\x16\xdf\x8\x91\x93\xbbXaM\xf7\xbfYc\x11/\xc1L\x0\xdd\x18\x8f\xcdo\xfd" +"\xa5\x12\xdc\x8f\xd7\x1c\x30\n\xdc\x86\x61\xaf\x41\xcf\xfb\x7fp\xbap-\xfa\xdd\x1a" +"p\x1c\x1et\xab\xd0~\x80\xf9\x31L>\xa6\x6\xac\xa7WOM\x1d\xdd\xebK5\x8\xc7\x8c\xbb" +"7fw\xdbH0CX\x94\xa6\x1\xc8\xb3\xc7\x9f\xdb\x4\xaa\x4\x8d~\xeZ\xe3\xa5\xdbI\x4Y\xb1" +"Bf\x8f\x84\x81&.=I\xea\xeb\xaa\x86\x37\xce\x2\x11s\\\xfd[\xf2\x98\xbc\"t\xa3Uw\xb9" +"[\xd6\x9d\xc5\xaf\x9\x9f\x64\xf3\xc1\x1d\x64\xd6\x45}\x9d\xad\xf2-R\xf1JP\xd7\xd0" +"\xd8{-\xb6\xb1\xe1\x92$\xf7 0\x88\x8e$A\xf\x4\xc8\x9a\xad~\xf4Ut\xee\xf2\x3n>\x9e" +"y\x8d\x2\x10/c\xc6\xb8\xbb\x1\x8a\x91^Z\xf6*\xb7\xbc}\xb9\xb4\xda(\x9\xbd\xbe%\xe5" +"u\x16\xe8\xd1\x88\xe1\x98h\xbd*\xe0*\xf6\x9\xee\xda\x35\x88)h\x9f\x61\xd8\x11]\xca" +"\xe3\x8b\xcd\x8e\xf8\x61]V*\x83\xcf\xfe^\x97\xe2\xf0\x17\xe0\xb7\x89WV\x98i\x13\xe1" +"\xbf\x88W\x86\xe5T\xdd\x46M\x9c\x9e\x98\x44\xcd\x35z\xfb\x85\x8b\xfc(W[\xa3" +"\xe3P\xe8\x8b\xba*\x4[\xe0.\xdc\n$\xbc?\xf2\x1f\x98\xe3\x18\xd8L\xf2;\xa7)1\xaa'" +"\x8e\xe2\x1aG\x93u\xe0\xd5\x1\x93\xd8\xf8\xaa\xdf\xe2Ta\x9c\xfd\x82ZU\x9f\x96\x39" +"\xf1\x98\xce\xb4\x91\xba\xd5R\xf\x11\x99\x33.\xa0\xcf\xaa+\xcb\x8f\xaa}\x0\xf9\x7f" +"\xdck\xa2\xe1\x1f\x15\xd3\x0\xa9gj\x12\xf0\xe4Q\xf9-.\xd5G\xe2\xdf\r[\x8b\xbd@\xbb" +"Z\xa2\xdf\x66\xff\xbehS~\x82=\xa6|)6\x1d\x9c\x89\xc1\xfd\x19\x1d\x9b\xab\x91\x30" +"\x9e\xff^\xcWX\xd9\xea\xb\x9b\x19\x97\xcc\x10\x1f}\xb3x\x8b\xd9\xff\x8e\x1\xe1\xcf" +"\x1b\xa0\x32\xec\x90\xddYR\x85\x87&\xdf\x33\xcf\xb6\xa0\xb%I|\xd5\x14N\xda\xf4\x81" +"I\xf&\xc8\x2\xa0\xa3\xd2\xe9\xe8\x11O#\xb3\xf0\xff#\xfe\xe2M\x1a\xad\xbc\x36I.\xe" +"\xdf\xab\xec\rO\xa5|\x3LG\xd2\xe8\xac\xb5\xe9\xff^\xc4\x86\xda*\xc3\xedQ\xa3\xb3" +"i3\xd5\x2\x4K\xce\xc7\xca\xee\xbd\x38W\xd3\x83\xdd\xc2\x8f\x97\x63\"\xaa&1^?\xd7" +"w\x9aP1\xab\x41\xef\xe\xfb\xb2\x95\xaf\xe0\x66\xe7\xc1\xe8\x8\x36q\xe5\x16(\xecy" +"\x9aT\x9b\xdeH\xa5\x2\xf8y\xf1\x36\x1a\xf8\xc1w\xb1\"\xfe\x8e\xac\x38\x66\x8d\x88" +"\x82\xa4n} X{\xd5\x61\xb3\x44\x86\xda\xd3l)\x15\xc2O\xc4\x46\xd2\xbb\xc4\x1e%j\xf4" +"\xea~\xdd(\x91J\x1\x91\xee\x41\x16\x96\x1f\x33\x9b\xb8[\xdd\x38\xc1\x41vi\xb3\x45" +"\xd4okn\xa2\xe3 \x98\x12\xac\x61\xd0\x80s\x1d\r\xc8\x96#\xc9\xa2\x85\x66\xa7&\xa6" +"fZ\x5\xc7\xc{\xd2\xe1\xe7W\xc0\xa0;\xf8\x9b\xe8\x1\x6>@\xd6\xb6I'\x9c\xf4\xfc\xce" +"e\\\xc6\xcb*-\x95\xc8\x46\xd6\x4\x88S\xd6T(m\\,-\x8e\xea\x94\xfe\xfbgb\xfc\x17\xcd" +"\x93\xee\x1f\xba\xc2\xdf\xfe\xf8w\xc7K\xda\xceqc\xb6T\x98-\x86Kh\x81\x39\xdb\xf4" +"|z\xd4\xf3\x8c\xda\xb4+\xcaS\xee\xa1MBb\xda\x83(\xb7\\\xc8\xa3\x42W\xcs\x3\xc0S\xb4" +"\xc5\x7\xec.<\xcd,\xa8\xde\xf5Q\xeb\xcc\xc4\xf6\xfb\x92[\xa2\xac\x8f|\xaf\xbe\xd0" +"\xb0\xbf\xae \xa2~\xec\xce\xda\xf7\x90\xeb\x90R\xfc\xb6\xa2T\xa3\xedQ7L\x92U\xcb" +"DH\xf9\x9e\x41\x87p\x98z\x19(\x2vd\x17\xdb\xf6\x92\x9f\xed\x93{\xb3@V\x8e\x82\x62" +"w\xe8\xdc\x38\xf4\xdc\xed\x64N#\xb8\xf2\x98\xb7P[\x11\xb3{\xff\x88\x64\xa7\x18\x82" +"\x1dQ}\xc7\xaf-\x9b\xaa\x66\x19^{\xeb*l\xf3\n \xcbzr\x81\xc1;\x1e\x95\x39g\x6\xeb" +"=X\x8f\x93\xd2\x17-\xc5\xd0\x16X\xcc*F\"\x8f/dW\xae\x88N\x11\x81Y0\xe9\r\xe7\xef" +"f\xec~V\xd5\x39\xa4\x1bs\x90\xb4\xc1;)\xcdT\xb4>\x4\xef\x10v\xd4\x42\xab\xd4\x1b" +"\xad\x91\xf6\xbd+R6f\x9e_\xb\x83\x37Z6=\xb7\x5\xac\xd5(\x80>D[ 2\xf4\x10\xa6\xaa" +"\x9b\xfc\xc1\xc7\x4\xd9\xb9\x36M\xc7\xed\x9f\xb3L<\xbc)\x1c\x1aiH\xcb\xe7+\xd0\xb8" +"`\xf4;\xd4?\xfc\xabl\x19\n\x94U\x98\x30xjX\xeb\xebK\x88gs\xa2L\xefT;\x6\xb9\xde\xf3" +"\x6\xe8h\xdf\xb6\x9f\x80\xdd\x18\xb0w`n\xfa\xa2\x88\xf3\xa5\xfc\xc5\xad=\xd1\xd1" +"\xa3\x8e\"\xe8\xab\xeeP\xa7\xa6\xc5\xcb\x44\x7\xcb\x9d\xc3\x39\xfc\x4\xff\xda\xd6" +"\xe4\x81\x85\xbb\xe2\xe3\x96\xfe\x1c\x39\x86\xf\x94+\xc5\n\xa4\xcc\xdb\x2\xe5\xf9" +"a\xf8\x44\x1d\xaeT51i\xcf \x86t\xa9\x9e\xae\xf7l\x99\xc4\xac\x8al\xctP\x8c~Gp.\xc1" +"\x7f\x90\xe4\x2GI:\xc9\x6\xf2\x88\xde\xab`\x8f\xf6\xa5\xe6\xef\xa2`\xe0HR\xe7\xdb" +"\xc7\x9c\xad\xc1\x9a\xe8\xbf\x33\xbd\xe2\xf{\xdd\x11\xc6\x0\xe8\x36\x9e\r\xa0;\x87" +"|\xb4\xa0\x8fq\x91\x2\xd3\xc3\xf2\xf5\x8a\xb4\xb0\xa3\xaf\xc2\xa9\x10\x90\xbfj\xa5" +"\xeat\xac\x7\xcf\x30P<\xf5\x15\xa1\xbe\xd7\xd5\x94\xbf\xec\xbfo\xa5\xcc\x43\x61'" +"\x9f`|\xbcz\xce\"$\xaeO\xdb\x89\x83\x97\xc5\x0\x63\x1eo+\xfcS\x7f\x45\x7f\x86>\x9d" +"\x8e\xa5\x15\x34\xad\xac\xd7\xa1\xea\x8\xf4M\x8a\xe8\x82\xed\xa4\x11\xb0\x7f%\xab" +"\xedT\xfcR\x84?\xef\xe2\xfe\x3\xc7\xbc,\xfc\xc9^\xad\xa5'c\x15\xbd\x13\x83\x97\x10" +"/\x5\x65)\xec\x7f>\x12\xad\xd6\xa2\x90\xcc\x96\xda\xc9\xa4g\x87\x88\xc0\x63U\xc6" +"#\x5\x94\x85\"\x1c_\x3!S<\xfd\x0KO\xd7\x9cG\x92\x8mdX\x8c*\xbd\xc0\x34w\x1f\xd0," +"|B\xc5\xe1Lv\"\xcf\xb2\x19\x34\xce\x2\x11>\xbf\xe7\x1c\x9e\x36\x14\xe7/\x1c\xde\xbd" +"N`Ng\x9NV\x94\x12\x97\x4\xa2)\xd2\x5\xf1\x16\xb4<\x1cv\xcb\xed@\x9e\x1d!\xe\xf1\xa4" +"\x5\xf7\xf\x61\xc3\xb$\xaf\xc0s\xa3\xa5\xb8\"\xeb!}\xb4\x61\x88v\x7f\xe3:\xd1\x8e" +"\x9b\xeYEm\xb4\xd3:\xdc\xf\x18\x9b\xa4\x86I\xe8Ml\x9\x9b\xbe\xc7\x8c$\xf4\x87\x4" +"\xc6\xa9\x34\xdd\xb1\xa9nXf\xf3\x89\xf0;65u\x8a\x9d\xffoc\x9b\xc6\x45\x61\xa5\xab" +"\x17\xaa?\x1bK\xdf\xb0\xc0\x5\x9d\x33\xe0IF\xe9\xa5\xdaM\xe3\xfdU\x10\x7f\x9d\xa9" +"\xa9q\xdd\xb1M\xa8\xf3ur\xe8R\xb5T\xdbj\x88\x80oFa\xb0\xae#B4\xe1[\x99\xa6\xc4\x16" +"\xab!\xd3h\xdf-\x1c\xa6^\x9a?\xb7\x36\xdat\x6\x88\x43\"\r\x91\x63\x1bW\xd7\xb0\xf" +"\xcf_$l\xa9+\xb8\x38\x9d\x95\x1b\x9b\xafPp\x87\"m\xa9\xb5\x30\x62w\xbe\x1fR\x8f\x3" +"\xdc\x61\x16\x81\x13\xeeVG\xa7,\xddhlt\xd7.\x13\xa0w\xc4\x6\xebX\x89LW\x1e\xc9\xd5" +"\x8cs\xa4H,0\x2*\xe3\x83\xda\xbb\x44\x15\xde~u\x8a\xd9\xf6\x92\x44\xea\xbf\xe5.\x8b" +"\xe1\xe1\x42\x9c\x1a\xe5\x9b\x31\xfc$\xa5@\xa3\x1b\x91\x14\xab\xb6u\x8c\x43\x9no" +"\xa3\xe7\x14\xf7\xc2\xa4#\xa6q\xdd\x42\xd5jS\x3\"\x8fh#\xd5\xba\x62\xe1\xad\xec\x2" +"\x8b\x0\xc4\x38\x96\x9c.\xd5\xc1\xc2[\x9e\x8f+Zi\xf8\x9c\x9b\xfe\x8b\xbfP\xc4\xfc" +"k\xef\x8c\x8b\xb7\xd6\xf3\xb4\x85\x8d\xc5,Z\x8a\x90\xe5\xb1}\xfb\xab\xfa\x38\xea" +"\xf5?Qq\xacn)\xaf\x9a\x64\xc1=gn\xdb\x7f\xe8UVa\xbf\x42kq\xfb\x80\xf9\x84\xa3w\x8" +"\x96^q\x98\x13=d\xba>\xb4\x65\x98\x8eq\xf5\x91\xe\xc1\xb\xe=\xb6\x81\xe7\xec\xba" +"\xc9\xbd\x99\x91\xe6\xbe\xd1\xc3\xc7Z\x8a\r\x98\x6v\xddY+\xdag\x9a\x37\xcf\xeeMM" +"\xf2\xfa\x84\xe0\x1c\x98P\x7q\xcd\xef\xd3\xe5\xd7\xc8\xfeT5\xe3\x90V\xc0\x32\xe5" +"\xf4\x99L\x8e\xf1\xf5y\x9c\xa7\n;3\x12g\x9b-\xae\xb3:\xfb\x89%$hg\xf7\x10\xa7\xed" +"x\xaf\xf3)\x8b\xdf\xd5\xbb\xf5\xf4\x30\xc9\xc1Y\xc5m\x5\xc6^\xf4@OLRU\x1e\xbd|\xe6" +"H\xad*D\xb6\xbe\xf6\xd1\x8e\xbf\xebU\x2\x96\xc2\xb\xda\xe0\x46(t=\x7f\xfa\xff\xcb" +"\x8dG>\xb8q\xb6\xfbN\xd9L\x8c\xbb\xb0=\xd6\x9b\x1f[\xb4\x5\n\xb4\xf0\x92\xe\x88\xac" +"\x9e\xad\x11K\xc5\x32\xda\xb6\x98\x14\xf5\xc0\x2\x0J\x95\x9c\xa6\x30\xbd\xb0\x63" +"\xbe\x3\xbc\r\x35s*\xa5\x80#z\x5^\xba\xe9\xa0\xc\xa1\r\xb2\x83\xf6\xe1\x93\x99\xd9" +"\xfb\x9b\xd6l\x86%;\xd0\xd3\xdcs\xb_\xc8\x98\xbf\xa5P\x88\\N<\xbdkr\xf4;\x9e*\xb" +"\x1d\x36-c\x1g\xd5&\x95\xf0wR\x5*7\xb6U*\xa2\x90\xd1\xe7\x30#\xbb\x66\xa4\xae\x15" +"\x6\xa3\xc9\xa0\xdc\xe0\xa5\x8c\xeaV#hc\"\xa8\xfen\x88\xf2\x18\x2\x1%%r\x84\xf1R" +"\xcc\xee\x92\x31\x34(\xeb\x65\x33UCtY\xe1Z\xd3t\xe6\x86\xac\xa6ns\x7f\xdf\xb7\xc2" +"\x87\xbe\xa4\x14 \x1\x9bi\xb6\xa3\r\n\xc\x65\xb6\xd4\xb0`\x8a\xaf\x9a\xb4V\xe5\x64" +"\xa8\xca-\xbe\xed~\xe6\xba\x9cJ\xb1\x6l\xa0\x98\x35\x97\x1N)\x86\xb0\xd9\xf6" +"\x88\x90\x8a\x43\xee\xac`K\xcf\x9a\xb<\xa6\n\xba\x15_J\x3VZ\xc9\xf9\xfc\xc5\x61\x1f" +"\xbf\x5\x97\x8\x44\x31\xd3}\x97\xa9\x15.Q~\xf0\xf6\xac\x30\xc7\xaf\x14\xcaI\xbLv" +"\xc3\xa8\xc8@6\x11\xf2J'\x14\xbb\xf9R\xa4\xefwgQ\x8b\xf0\xb6\x97\x37\xb6[{j\xea-" +"h\xac\xb1\xf8,^\x96k\xe6\xab\x8b\xb3\x8a\xb1\x82\x37u\xbb\x35\xd6\xb\x1e\xc0\x1e" +"\x1a\x95nu\xad\x8f\xf6>\x90\xd7\xc3\xa0\x97\x98\xcb\x1a\xc0\xe1#WBuy\x85\x8~r~\x13\x93O\xb1\x37\x82\xe7\x19\x1c\xc0\x62\x83$\x6\xa8\xbc\x38" +"\xc5v\xb5\xd9l?\xf1%\xfb\x92]q\xf2\x17\xd7\xe6\x7u\xc0\xc6\x36`\x19\x37\xb7\xb5\xd7" +"\xbb\x35\xb6\xae\x8\xf1tZ\x1f{B\xdd?=\xc1Y\x9a+\x89v\n\xf2\x34\xd0\xcaU}\xf5\xf3" +"\xbe\x13\xd9\xe7\xce\xdd,>\x98'\xf2\x9f\x46g\xe4\xa5^\x8b\xac\x85\xba\xcf\x33qos" +"T\xeak\x96wl&\xbft\xf8\xc6\xdc\x18\x81\x41\x3\xcf\x41l\x82\xb2\"g\x85\xdb\x86\xe6" +"n\xdd\xe4]\xa8\xe5\xaas\x89\x34\xd0\x84\xed?\x8b\xab\x45\xc5\xa4i@\xed\xd3&\x10n" +"\xe1\xaal\x8b$\n\x98\xf1\xec\x82\x84\xbc\xac\x2/\xef\xbe\x97\x38\x85\xa2\xc5\xfe" +"\x2ZD\x8e\xf2\xec\x64\xc5z\xc0i\x98\xaa\xf2Op+p\xea\xd8\x62\xf4\x32tg\xdcUX\xb5!" +"\xb5\xa4u\xfa\xe8YSM-\xef\xf3k\x8f\xf2\x89\xc9\xc0U\x7m\xbeG/\x83\x38\x9dt0j\xa6" +"5\xa7\xd3s\x8f\x9\x0_\xa7;\xd9\x3\xa9?\xa9\x8fZ\xdaHZdJ\x11[\xedt\xa7\xfc\xc\x90" +"\xfe\xbc\xe2*\xc7\xce\n\xd8\xe6\x41\x43\x30\x1ag\x1e\x98\n\xc3\x35\xa9\xf\xa7\x35" +"\x17-\x98\x43\xf6^L\xf&\x7fIiud\xf8\x42\xce\x34\x9d\xda\xac\x38k1r\"\xa0\x13\x65" +"!\xc6\xec\xae'kc\xbe\xb2\xc1\x92}\x4\x88\x61x\xec>\xd9x=\xdf\x41N\xe1\x34\xd8\xb1" +"N\x92?\xfe\x1eZO\x1e&~uS\xe3\xb0!\xee'\xe5\x36\xbdIc\xc6\x94U1\x8e\\\x1d\xed\xa0" +"\xbbO\xaf\x81L\xd4\x99\x8ajJp4\xef\r\xa8\xc6O0\xef\x18\xc6\xab\x16Nb##>a\x83\x41" +"\x9fS\xa8\x1d\x92!\xa9\x64h\xdd\x39X\x8a~\x9a\x38\xfc\x7*\x96\x81," +"\x8cQ~\xea\xd5o6\x10XF\x86\xce\x91%\x5\xd5\xfa\x81\xcc\x1d\xe9\\{\x9c\x96\xc1\xc7" +">\xa7ip\xb2\xc3\x43\xca\x86S\xe}\x1b\xecV\xf0\xbc\x43\x7\xc6\xa4\xaa\xd3&\xad\x32" +"\x96\x97\x18w\xa6)H\n\xfa\x1a\x9b`*h \xf2\x1c\x65 \xbc\x9c\xde\xfc\x1\xa7\xc4\x8d" +"\xb7\x9c\xaf\xf6\xcf\xcc+\x9f\xb\xcai\xd4\x11%Go-7.\x1c\x8bkI\x9d\xab\x94>\x11\x30" +"\xa7\x64m\xd1\x7fn\xba\xe2\xbe\x1f\xaduxKP\x6\xf2\xd7\x13\xae\x30\xa4\xcb\xab\xcd" +"P\xd0\xda\x9a\xfaL\xf3\x38\x3X\xe5u\xb7i\xc6\"\x8b\x38tC\r\xb6\x8a\xa0\x41\x1e\x11" +"b\x18q\xd3W\xe2[\xc3\x99G\xe2W<\xc6\x8b\xfcS,\xcf&\x6\x83\x91\xdcQi(\xf8\xe7\x32" +"\xd2\x8\xe5H*\xd3\xc7>%]\x1a\xe8\xa9\x37\x0\x96*V\xc0\xf8:\xbe\x63\x8\x9f,\x9clB" +"\x16')\xd7M\xfe\x84\xbfr\x2\x6\xd4-\x82\xd2\x2-\xf2\x38\x18,\xd3=\xc4\xbc\x0\x13" +"\xc0\x30\xa9)!\xc4\xf9\x43\xcc\x8f\x13\x42\xf3Z\xc1\xdd\xd2\xa6\xff\x37\xb9,\xe6" +"\xc9S\xa9x\x8e\xe8\xc4\xca`2\x8cv\xfc\x37\xdf;\\\xbf\xb7\xbe\xe8\xd1\xa0\xf5\x93" +"N5;2\x9e\xc6\x9b\x91\x0\xc4\x1fR\xa0>\x80\xbf?\xaeQ\x90\xaf\x63\x17{\xcc\xee\xab" +"+D]\xff\x1b\xc\xfa\x37 \xc8\x9f\xfe!\x10\x81\x66\xe6\xcb\x33\x83Y+\xa4\x4<28n\x17" +"\xab\x84\xd5\x9a\x46\x32\x30\xa1\xe3\xbd\xb4(\xf3\xa0\x62L\xb0.\xda/\xdb\xcfk\x10" +"kr\xd9\xa3?\xb\xf2\xe\xf7\xe4\x65\x44\x89L\xf\x95\x8d\x9d!\xa5\xbe\xaa\x95\xdc\x9c" +"\xa8\xb3\xaf\xd3\x3\x98\x86\x1d\x41\xe8\xd1\xf0R>\xcf\xf6\r\xc3\x99Z\xdf\x84\xa4" +"d\xda\x46\x11\xc6\xf4V\x7f\x17O\x93\xc6\x89\xabr\xcd\x38\xc9!Wz\n\x13r\x81\x5\\[" +"\x8b\xbd\xdbp-\xca\xe5S5\x8\x12Ob\xc6\xb6\xae\x94~\xf8\x88\xdf\x84@\xb\x91\xf1]-" +"\"\xaf\x9f\x36\x86\xe\x8e\xfd\x8d\x31\xcd\x1dP|*\x93H\x1bR.2\xf8\x6?\x81\xf6\x8e" +"\xce\x98\\\x35\xec\xb0\xd8|\xcd\xa2\xbf\xdaI\xa7\x45\x1b\xf8?O\xfb\x45\xdb\x63\xb6" +"q]N\x11\x61N\xbZ\xdd?\x90\x13yh\xab\xb3\x39\x45\xa5\x36y\xc4\xa3u\xc6J'\xe7r\xf3" +"\xa2\x86\x91\xc5\x6K\x13\x35\x19\xaa\x12\x97\x9\x38\xc3\xbcG&\r\x8d;\x1e\x6\xbfj" +"90\x15\xe3im\xb9\x9\xea\x8a\x80\xef\x4\x37Y.\x88\x10`\xbe\x81\n\xf9o\xc1\x13\xda" +"8k\xa7`\xf5\xdf@\xfa!\x9e\x14\xa1\x1b\xa6\xa5\xbc}lT\xab\xf5\x9eq\xf3\xe8\xeb^\xb0" +"/\x8\x81\x94\xac:\x2\xdek\x89\xbf\xd5v\x82k\x14\xe2%\x34%\x1f\x63\xf8\x9fL\xa0Z\xb6" +"\xc7(t\x8a\xdf\xfd\x2\xe6\xb2\x1d!\x97\xe8~\n\xcf\x1c\x8\x1b\x65S\x90\x83\xce\xe9" +"ZG\xe2m\xd8\xf8H\xc2\x42%um\x9b%\x2\xe5\xfc\xf4\x82\x1v\xf5\x19\xe1\xfe\xb8uI\xf9" +"j\x0\x38\xb7\x97\x80ht\xd6v1\xb3\x41\xdc\xcfZ\x84\x14\xe8\x65x\x83\x9d~\xc3)h\xc5" +"~+p8{O\x1b\xa2\x11\x97\xac\x8d\xf1\xca\xc6\x17^\xf0\xa6\xf4he\xc8\xac\xbb\xeb\x12" +"\xab\xfb\x83\xd3OKR^\xac\xc1-'3\xc2\x9d\xf3\xccJ(\xa7\xe0\x30\x92&\x9\xe0\x39\x85" +"e\xff\xa5[\x1\x18\xa9\x4\xa4\xcb\xf\xedZ\xf5\x85\xc9\x38\xa8\x9\xe1W?c\xd8)\x1b\xcf" +"\xaa\xc2\xbb\x1d\xecVJ\x94\xd3\x90\"\x36\x97\x32;\xa9\xd5\x8a\xc7M(\xe3p2\xafo$\xf6" +"\x7l\xe4\xe9\x19\xb7\xb8Vy\xe2(\xc7\x43\"\x30\xa8]5\x5\xd6\xf6Y\xbe\x33\xb4i~L\xb" +"kn\xe2\nQ*\xdc:\x1d\x2v\xc0i\xe4k\x8bh\xe8\x1eH\x93\xfc\xf9\x1c\x64\xb8Nc\x1e\x92" +"\xa5+\xa9}\xae\xcc\xf4\xc3R\xa7x\"Ye\xf2\x9a\xcah\x9ft\xc1WZP\xc3\xfen\x90\xbe\xe" +"\x1d\xb1jnG=g\x9eZ\xd5\xf4\"\xbf\xb0\xa4\xba\xf0)\x81\xb0\xa1@\xa3P!\xd2\xa9\x91v\xd3G6>\xa7h\xb7\x1\xa4\r\xc7" +"h\xd5S^\x18`a+\x84\x19\x8e\xff\xd0\n\xa7\xbc\x9\xf3\x6zqk$\xdd\xe0M0\xb7?\xc9\xfb" +"x5\x15\xc6-\x3\x91\xc8,\xf8\xb3\xbf\xby\x96-\xb0\xbb\xb6\x99)_2Oi\x9_\x1a\x43\x8" +"=?t6\xa5\xf4\x96P\xba\xfb\x86\xd2\xd6\xad\xee,\x97S\xdf\xbe\xc5\x12\xbd\xc5\x1e\xf2" +"T\x9e\xcf\x37n\xc0_k:\xa3\x9\xd9\xc7\x9b\xe2\xc\x35\x9d\xdc\xe0\xf1\xbfO\x12w\xde" +"\x85\x64\xa2 $\xe2\x88\"\xe7\x34w\xcq\x7fp\xc7+\xc3\x99\xfa\xf5\xd8\xb6\x80\\:|k" +"\xad\xe9\xf1m7\xd5\xe7\xed\xa4\xd7WjE\xa9\xad\xa1\xe9\x99j\x99@\"\xb7w\xbe\n\x1c" +"m\x9c\xb5\x8b\x9\x87\x31\x9d\xeev\xe0\xd3p\x97\x94\xc0]\x15\xadJ\xef$\xb\x2\xcd\xba" +"=\xd5\xad\x38\xae[\xcb\x9c\r\xf2\x34+rw\xa0\xe2\x41\xaa]\xc4\xb7\xc0\xb5\xd6\xc6" +"j\xe3\xc8\x1c\xc7X\xd9\x7\x1cw\x9fqO2\x8b\xef\xff>\xbe\xc~~lN\xeb\x16\xc2u\x85\xa8" +"\xb2-g\x91\xb3MN.\xb9\xc8\n\xd9%\x46\x9b\x3pm\x99\x96\x2\xe)\x8e\x93\x1\x90\xeb\x9a" +"0\xf5jb8\x9f\xb4\x9b\x0\xd1\xf9\x1aj\xf2\xfa\x86\xd8_\xabO\x9b\x89\xdb\xd0v\xa0\x36" +"@S\xe7\x1a\x91<\x88un0TP\xc4\xa8 \xc8s#\xe4\n\x61[qX\xd8\x93\x12\xf8G&s\xce#r\x8a" +"\xae\xd2M\x4\xba\xee!Y\x1a\xeew%\x8eW?v\\C-\x1c\xd4\"\x1a|\xe5#9\xb7\xbaY\xa1\xac" +"+\xac\xf1R\xfb\xec\x1X\xe7\x87mA \x13v\x95\xa8\xbe\xad\xb5\x8a\x10\x7\x63\xa5\xed" +"\x95\x9b\x9c\xa8\x9fH\x1d\x9d\x9e\"o{`\x9aY\x9b\x30\xa6\xa4iK\xc1\x66\xee\xff\xf9" +"T\xe1\x87\xd5\x39\x87\x86\x8eM\x9f\x11\x12\x38\x8e\xb1+\x9eP\x17\xe3Vh\x1\xfb'\xa0" +"\x10\x12'\x84\x9d\x15\n\x64\xfb\xb6\x10N\xc6\xd1\xe7\xc3T\xa1\xba\xf4%\xc5\x83\xfc" +"G\xdb\xdb\x95\x8b\x8f^\xb6S\xb5\xa0\x45\xfe\xf9\x92y\xa4\xa7m\x9H\x12\x1fM7\xc0\x34" +"1\x9\x31\x15\x13\xe8#_qyH3}w|\x8\r\x13\x30\x17w\xab\x89\x87\xb3\xd6M\xe\xafp\xfe" +"(\xe9W\xa1\xe9*\x7f\xfe\x93\x82\xa5p#{=;\xd3y\x10\xda.Q\xbc\xf0KVl\xad\xca\"j\xe0" +"\xb8\xc6!\x5s\x8f&\xbfW\xedOn\xf0\xf4\xfe\x16\x41\x45\xdbY\x2\x86\xd1k,\xa3k?w\xa0" +"\xb4\xd2\x43G\x8cY\xcb\x34IK\x9 \x9e\xa1MO\xe0$\xf3s\x87z\xf8\x87\x93\xed\xa2\x93" +"W\xfd\x90\x81\x95\xa1\x95%\x7\xb7&\x13\x8e\x37{W&\xd2\x84GV-\xf5\x8e\x2\x66;\x86" +"\xcb\xfd\xf2t\r4\xa0\xcf\xb1\xc5\x14R>\xa1\xb7\xb2\x6\x1\x97\x13\xce\x97\x94?\xf8" +"ny\xed\x7f=\xbbY\xa6\xfd\x96h\x2\x64\xe6\x93\xf0k\x3\xe9P\xe4\xa2\xc3\xed#M\xb5\xc" +"\xa2\xa6U\x94\xc8\x90\\gJ\x9b\xef\x1f\xdf\xae\x8a\x6\x88P\xaf\x66,\xd0\x4)\xafOA" +"\xa8\xa9]\xbc\xbb\xa1\xbd~+T!\xa1\xfa#|\xf3\x1b\xc5/sj\xed\xdb\x18\x14\xf5\xa2)\xa1" +"\xe8\x1a\x3\x16\xc6\xf7\r\x17rC\xad\xc4\x81?\x84)\xad\x87M\x9e\xfa\xb\x92y\x97]\xc1" +"[\xc1\x41\xdd?\xa2\xc5iljd/\xdeN\xeanTvM\xa5\x9\x10\xe5\x1etPm_\x0}\x1b\x19\x46\xac" +"a\xf4\xb5\x46z\xe9\x44\x91\x92\xd3\xf3sg@pM(\xdf%\xa0\x18\xa6\x81\xc2M\xca\x18\x62" +"\xcf\x19\x89\xf1\x17\x9c\x80\xed\xf7\xea\x97\xebH\xb7%\x13\xa2\xf5\xf9\x41\n\xd3" +";\x1eg\xafJ\x9b\x84\xb7\x3\xc6L\x91H\xa4V@Zk\xdeK\xef\x9e \xd3;\x91\xb9!c%\x15\xd9" +"\xb7\xd0\x7f\xbf\xe4\x2\xd1\x61y\xe9\x11\x1\xaf\x1e\xbe\x99\xdfqX/\xbc\xc1\xaa\xeb" +"\xa1\x37\xcf\x37w}\xb5\x93i\xeb\x36\xeb\x8b\x88\xfdl\rq\xb8\x9f\x34\xfd\x1d\xf0\r" +"\xcf\xf\x1dXL\x12\xcd\x99\x8b\x8d\x31y\xf9Z\xe3\xc1\xdaH5C\xbd\x19w\xd8\x83\x10\xb7" +"f\x90\xd5VTk0\xc5sd\x1d\x1b\x63\x10\xd3\xf3\xc9\xe8\xc3\x98\xcam\x1b\x4\x8c\x62\x9d" +"\x14\x35\x84\xf6\xb5\x11w\xa8\xca\xe3$p[\xe0u\x1b\x1dv\x9cOz\x80\xff\xe8\x10\xf0" +"v\xd0\x7\xe0\x1aM\x8d+\xb8\xe\x6\xa1\xdd\xb\xc6\xa7\x9a-\xb1\xffQ'h\x80\x35+\xc\xa2" +"\xaa*s\x99\x91\x8b\xd9\x11P\x91\x7(\x92\x14\x9eQ\xd7\x8:G\x1c\x8\x35\xa5\xf5\x95" +"\x7f\"GKI\xeb\xc6\xec}j\xe0\xef\\\xde\x36\x34\xb8xT@\x99\xc5\x8c\x31%Il\xde\xb9\x88" +"t3[\xf1\xc7V\xb8\xf6\xcc{\n\xa4\x9d\x93\xc0HE\x1anH7z\xee\xf2\xef.\xdd?\xfd\x1d^" +"\xfe\x84\xe2:\xaa\x14\x38\x84\xd6\xf\x6\xf3k=_\xa9P\xc3sq\x5\xcd\x80\xbf\x38<\xaf" +"\x1e\x1c\x46\xe\xe9\x30\xe4$\x1#\xb3K\x83\x30z\xcb\n\x2\xa3\x82\xfd'\x93\x16\xc9" +"\xf\xa6\x9c\x1f\xdc\x17\x1fL\x7f\x30\xf6\x45\xd4\xfb\x88y9\x90\x30R\x1a\xf4\xee\\" +"\"^l\xef\xd3\xf1!\x5P\x19\x37\x85\xe2\x17z\xe5\xcd|\x13\xe%M\xf3\x9bM\xe5:{KK\xea" +">t}\xe4W\x7\x3#3\xb2\x1e\x13\x62\x1c\xd6\xab\x91/\xc7\x1\xe7\"\xd7\xfa\xc2n\x92\xc9" +"\xd7y\xb6\xd6\xbbI\x12\xe3\xc8I\x7f\xdaPH\xd4\xc8V\x1c\xa5\xe8\x34uEy\x86\xa8\xaa" +"%\x86\x9e\x83)\xc5\xaf\xc2\xbexP\xef\x12\xc4US\x10\xfb\xf4$\xecUh\xff\xe9.\xd1\xea" +"#\x96\x5Q\x81V]K\x11\xf9\x8cr\x18\x9a\xbeo I\x18\x0\x46\x91\xdb\x14\x11\x81\x93\xc5" +"\xe2\x91\xe0}5\xc4\\\xea\xfa\x1b<1U\xc4\xc2\xc9\xa9\x1a{\xaa\x9b\x11\n\x97\xa0\x94" +"h'\xe2R\xdch\xd6\xa1\x95\x92\x88\xff\xb6>\xb6r\x1f\xdc\xa0>\x1er\xc0\xd3|\xa7\xdc" +"\x7f=\xea\xbe\x15\xf4\xe8\x4\xcb\xb7\xf5\x65\n\x14;\xdf\xf5\xe8m\xe3o\x9f\x82lO\xc0" +"]Vg\xeaJ\xdf]\x8\xa3\x1c\xd4\xf0\xd2\xfc\x95\xf5\xec\xcd\x87J@\xc0\x84{\x2\xcfO\x9c" +"K\x4|'\xe5\xc7\x2\n#\xe2\xf4PJ\xa1\xb7\xa4" +"QJ\xf7\x96\xbc\xdd\x85\x94!\x12\x45\x82`T\x17\xda\x88\xf9k\xd9\xbd\n\x44\xf6\xa1" +"\x3R\xf3\x1b\xe3\x88\x61\xee\xc0=^\xf4\x34\x9c\x62g\x81q\xbc\xbb%\xc7\x89\xcf\xa6" +"P\xeavqj\xd9\x9f\x9e\xf4\xa3\x61\x46}\xfK\xdd\x30[\x16V\xc8\xe2&\xbc\x61\x99>\x98" +"\xfe\x31\xdc\x93l\x90\x2\xf6\x9c\xaf\x89\xe0\xaa\xd3\xa2\x15hZ\x82'SW\xfc\xe7%\x87" +"{R~\xecV\xa7NJ\xa3R\xa0\x7f\xce\xc7\xb6m\x2Z\xd7 \xc7`\xec]\xcd\x46\xcb\x18\xcz\xec" +"\x17\x1a\x32\x0\xc2\xbfi\x7f\xd3\xbc\xf7\x84G\x5M\xc8\xc3\x8c\xd4\x43\x96K'(\x5T" +"\xa6\xb3\xa8x\xea\x93\xb9\x95\xba\n\xcbt\xa4\xe9\x61\x18\xb2]\xae/g\xab\xe2\xee^" +"X\xb\xc\xb.\xeb\x8a\rs\x9x\xe9r\x5'x#A\x1f\x1c\x4\xbe\xca|+\xa5\x88\x63\x1a\xb1\x2" +"pp\x8b\xa7.\xb0\xc9\xd7\x64r\xe9\xf\\s9\x97\x3\x1dR\x88\xc0l$I\xed\xea\x82\xb0\xcf" +"e<\xf1\xdcZ\xfd\x64\xc1\xb\xbd\xed\x31\xa2\xc3\xa2\xc7\xa0\xb\xf7\xb6\x88\xc7x\x88" +"\xd6\xe6\x17]\x8c \x99\x43\x82\xea\xae\xc1M\xf3x=K;\xc9\x7f\x1c\xc3\xee\x61\x13\xd5" +"\xb\xbb\xc2\xfb\x1b\x82\xda\xfc\x12|FmY\x9\xdb:|,[1\xa1}\xd5\x88\xf1[\x8bR\x11\xdf" +"1O\xb3\x34\xc4\xf5\x41/\xb2\x38\x8\xbb\x1a{\xb3\xf8Wb\xa0\x88\x17\x65\xb0\xd5\xb8" +"\xcc\x8al\xa8\"\x8f)\xe7\xe7;Iks\x16\xe\xe8\xf9\x1b]\xc4\xa5\xc\n\x9=(\xc0\x18P3" +"lV\xa1.\x95\xc0\xb5;9\xc8u\xf8jdo\x14\x92\x41\xaa\x7\xf\xed}j\xd4.\xff?\xec~\x3\x9c" +"6\xa3z\xa3\xe5\xbe\xc4\xc4\x97\xb1\xf5\x1d\x7\x5{\xf4\xe9\xbd\x6r\x9\x85\xf#\xa6" +"\x14\xb0^\xe5\x99=[a#O\x94V\xfevt\x8a\xca\xd8\x1m\xc2\xfeH\xeb[M\xc7\xf2\xf6\x98" +"s\x4vLH\xa7JPb\x1c\xab\xc3\xd8R\x8d\xd0\x8a\xadMKU\xaa\xb3\xa0N\xfa\x8ei\xc3\xf5" +"\x9e\xf9.:\x81\xc8\xbe#\xbe\x14\x36u\x8c\x1a\xc3WBl5X\xeb\xf6z\xc9guQ\xdaSc\x8a\x95" +"\xf1\x65\x32\xe,1\xde=\x9d\xadz\xaf\xc9\x9a\xe3\xd4\x14\xb\xd6\x90\xba\x98}\xa1\x61" +"\xe8\x95\x1cg\xa9\xa7IH\xc3PM\x1b\x7\xd5\xc7iLL\x81t\x14\xd0W\x93\x8\x11p\xd3\x87" +"\xbe\xed\x9f\xcbZ}\x9\xa6\xc5\x6\x8a\xef\xf;t\xe3U`\xd2\x15\x93\xec\xfcQ\xb9\x12" +"=\xa0\xda\x11\x43\xca\x1b\xe6\x4H\x9jf9\x87O5[(%\xa4\xc8\x61\x35\xd3u\xe8\x83\x13" +"G\x88\x61\xf1\xb9\xaa\xf8?9\xe2\xe1\x8a\x9d\xa3\xee\xf7\x94L\x98M\xe5J\xdf\x42$\xd6" +"\x1f\xfb\xb8_\xdc\x6|\xcbl7\xf8\x16\x87\xa5\x8g\x4\x35\x66P\xd4\x87g\x8f\xa2\x38" +"OH\xe9\xe4\x3Y\xccn\xfa\xfW\x9f\x8a\x18\x1d\xbb\x8a\xa0\x1f\xff\xce\xae\x9e\x1a\x97" +"f\xe6\x2\xaa\xfa\xfc\x42\x45\x9c\\\xc5\x97\x9\xcf\xd3\xc7\xc7\xb7#[\x9d\x9f&\xa5" +"\xb!\xc1\x13\xdb@\x1f\xa1\xe9\x94h\xe5\xbf\x42\x9d\xdf\x94o\xefjo&\xaa\xfu\xd7rb" +"\x11\x9e\x30\xebU)\xb9\\\x8c\xa5(\xafx\xde\x86\xa4\xe\xd5\xdb\xae\xf\x1c\x36\x62" +"Z`B+\xe9\xe6\xf7}VrV^\xbc\x80\xe3\x99{\x15\xdd\xd5\x90=\x85\xf3\\\xbfv\xb3\x88\x84" +"\x8\x6\x5\xfa\xa1\xc1}?\xdc\xdc_e{\xc4\xab\x38g\xe9\x17\xc9\x8c\xe6\xc3P\nvY\xd3" +"\"\xc9\x81\xe3\xb2\xe0`+Fb\xd2\x10n\x1f&\rd\xa8\x94\xaa\x1e\xd3\x8eh\x1a\x1d\x1\x64" +"0z\xf8\x1f\xa1\x9c\x1c\x8e\xd2\x62\x7]\xf3\xe9x\xa1\xe2_\xd5\xa8\x95_\x9\xeb\\\x8e" +"\xc7\x9c\xe0#\x9\x66\xec+\x90\x19\x8a\xc6\x96\x1e\xdfJ\xb\x9d|Y&\xd1\xb5UbV\xfd\x15" +"\xeb\xdeP\xa4uj\xa1\x63\xb7\x9\x18\xe6\x97\xad\x9b\x8y:\xde\xe1\xa5\xbf\x9d.\xd8" +"\x6\x9f\xb5\x65\xb\xb6\xa2\x15\xb1\\\x80\xa2vN\xbb\xd6U\x87\xe3h\xfaQ\xf?%\xb\x30" +"\x2\xf9%o\xa6\xc2\x1b\x14\x44\x35\x5\xb2\x3\xc7\xe1\xf0\xe0\xb6H-\xe3\x17\xbdV\xb4" +"F0\xb1\xa6\xc8\x36\xa2\xe3\x98\xec\x36\xdb\x92\xa9\xa3\x18mU *~\xe8\x8f\x98\x1f\x14" +"6\x8c\x44G\xa1ra\x9cO\x9c\x9etz\xd2\x86\xd0\x1f\xd2#\xb5Q\x3\xc1\xe0g,\x97\x8\x4" +"/c\xbat\xbd\xd0\xd5y\x95\x3\xb6\x42\x9bp\xc9\xa4\x92T\x81\xf6\x34\x8}\xbd]\xc8i\xda" +"\x8dW\xfcv\x1U.\xdbQ\xb9\x91\x87\x9\xbb\xec\x37\x65\x83\x92\xa2\x87\xf5\x7J\x8c\x1" +"\xcc\xfbI\xcc}\x83:E\x1\xcc\xef\xb4\xe9\xa9\x82\xed\x89\r\x18\x7\xcb({\x9d\xdb\x8e" +"~/C\xf2\xfd\xfd\xd1\xb4\x17KE\xacK \xca\xfc$\xe2_\x87\x1b`\xbc\x41\x92\xb2\xe6\x43" +"\x1d\xd2K\xfa\x8a?\xad\xa8\x94\x10\xd0\xbbh\xb8\x65\xf3\xe4;\x89{\xa4\xf9\x8f/\xb3" +"\xda,2(\"\xbc\x80\xa5^\xff\xa4\x98\x90\xf1\x92\xc\xb8$\xa1mg\xd1\x9a\x33\xd8\xcd" +"\xa9\x86\xc8\x4\\\xc8\x39\xe2\xe\xf9@w\xd1\x91\xf6-\xd4\xa8\xaf\x82\xc2\xf4\xe9Z" +"d\xe1\xaf\x8d\x88-\xad\x32\x3\xff\xf\x86\x35(\xdbr\xef \xa1\xbd\xf8\xd9\x98\xaa\x85" +"\x1\x1b\x31t\xc0\xef\xa0\xca\x63x\xd4\x88\xde\x30\x96\x1@\xf9\xdf\x85\xb\x36\xbd" +"1\r\x1a\x18L\xf4{p\xd7\x66T\xa3\x9d,]P\xcaV\xbb\xc9\xa1\x66uH*\xb0\x1d\x14%\xff\xfa" +"&L\xfb\x84\x9b{\xb6\xa6\r\xd4\xdd\xfc\x43\x95\xed\xa9\xf7\xdb\xac\x1f\x9b\xd1g\xfc" +"\xb3\xe2\xa5\xc7^X\x14\x82\x86+er\xc5\xab\x18_\x13\x4\xfb\xc9\x1\x9!ea\xc5:vk\xae" +"\xef\x42\x81\x1ak'\xcf\xe7\x34%\xa8s\xc6\xf2\x33\x13\xce\x98\xa1U\xa6z\xf5\x94Q\xb8" +"Z\xf8\xafQO\x1e\xbb\x9c\x8bU\xfb\xbf\x17O\xaa\xc6\xa1\x15\x15@\xe5\x9d\x11\x18Z\xe7" +"0F\x83\x83\x80\xe3\x84\xb2\x34\xa7o\xedt\xda\x8f\xe2\xdf\xb1o\xe8\x80\x5\x61\xea" +"\xa8\xbe\xf5 \x1a#\xc3\xc1\x62\xf1\x15 ~\x1fp\x8c%/\xc\x80\xeb\xc0\x10/\xa1\x85\x9d" +"\x1d\x14\xd6\x37ol\xa3\x93\xe1\xb7^Y\xe9g\x86\xe4\x43\xcc\xfa|\xff\xa5\xd5\xa5\x32" +"\xea\x30\x1d\x1a;\x11\xdc\xa3\xe9RH\x89\xbbG1\xfas\xe3\xc7\x10m\xe3\n\xb\x10;\"\xa0" +"?\xf9\x10\x31\xf8\xb3\x5\x84\x9a\x12,\x18\x14\x96\xf8k9\xef\xc0\xa3\xc3\xf0\x36\x1" +"\xfb;\xea\x64\x1e\x4\x9akj[\x94\xc3\xd2\xfc\x43%\xbe\x8b`\xd5pv\xe6\xc6\xb3\xc9\x19" +"\xd0\xe9\xac\x9a\x35.b\xc5\xa1\x8b\xc1t\xf4@\x9\x17V~Z\xb8]\xa3ZJ\x0\xb9\x9d\xb2" +"\xd0\xa0\x43\x95\xb5\x32\xa5\x89\x83\xb7\xe1\xd9\xcan\xc1\xb3X\xe0\xd5/\xfb\x82\xe0" +"\xa2\xb6\x1b\x38\x18\x65\xc9\x13\xaaT\xac\x9\xbc{\x90\xdc\x93\x6\x81\x83\x45\x9b" +"\x1e\x9c\xa7K\xe6'\x18\xeb\x1a\x33\xc0\x38[\r\xb5\x11\xdf\x9c\xde\x3\x0>\xe8\xa0" +"\xaf\n]\xe0\x5\xd9\xc8\xd1\n\x96\xc0T\xa1\xd4uh\xcc:\x18i\xbeH0^Z^\xb2}g\xa4\xe9" +"\x93\x1f(\x98\x1f\xc4\x82\xc0Q\x9e\x33\x1b\xab\xc2\xb0\x16\xd4N\xb1\xd5h\x91\x82" +"5\xed\x2\x34\x98\x84\xde.\xda\x44\xf\xe7\xb9\x8b\xc0-\xea\xd0\xea\xf7o_\xa8]*l8K" +"it\xc8\xb1\xec\xde\xde)\xe\x81\x39u2\xda\x1cQO\xe3\n\x34I\xca\x33\xfa\xa2\r$\xa4" +"}=\xdd\xc4N\x3\x7\xe\xb9\x44\xb4\x41I^\xf2\xae\x38;\xd2\xb9\xb6V\xbb\x0\x15\xd7\xd8" +"\xe\x81>3\x88o\xba\xdb\x1c\xe0\x8f\xcb\xec\xef\x19\x34V\xec\x9e.\x9c\xe0\xfb{\x8e" +"\xb7\x15\x34\xd6\xecV[\x9P\xcb\xb\x9d\x92\x1bJi\x80\xf6\x39\rO\xaa\x16\xcf\x46j\x2" +"\xae*U\x14\x65\x41\xa2\xcZ\x99\x96\xc5\xff\x61\x45\x8\x87\xb5\xdar\xaa\xce\x42\x83" +"@\xd9\x88k\xec\xbd}\x8b\x7!&\x98\x83 \x1f\xfa(\xd1\xa1\xba\x32\xafw\x98\xae\xbc\x6" +"L\xcf\n\"\xfc\x9f-E\xb\x9f\r&\xfe\x2\x30\x99\xa9W\x91\xc7\x31y\xba\xaf\x84n\x9f\x10" +"\x2\xa9\x30\xc5\x8\x62\xd5\xe4\x9f'\xd4i\xf6}\x94\x85\x80\x87~\x85\x83\xc4\xcd\xf" +"\xd4\x8e\xd9\x85\x1\xe3\xf6\xd0\x94\xaa\x0\x14P\x91\xcf\x33s\xb7\xadlPP\xb9\x7\x62" +"\xa9\x8d!\x84=\x1d\xf3\x12\x93\xe5\xb8\xa5\xf2S\x91!;\xd3\xf8\xefx\xf1\xed\x91\xa5" +",P\x8\x9c\x34@\xe7\x85_1\\<\xe3\xc5\xd0-\xa2\x1a\x17\x10U\\\xbe\xad\xa8\xd4\x6\xe0" +"\xf6\x44\xbf\xc2\x64\x9ck\x5\x9a\xe0\x9e\xa3\xce?\xdfU>\xb6)\x8eih\xf0l\x1f>x\xa3" +"\xda\xdb\xf8\xe}\xfe\xb2\xbd{\x87\x62\x0\x83\x95\xb6$\xe0\xcc\xbc\xf\xabn\xc0'\x9b" +"\x95\x1c\x7\x91\xb6\x5n\xa7\xe0m\xd3\xa7\xea\xc1<\x93\x90\xab\xd9\x8e\xa4',\x99\xde" +"\x1a\x65\x34[d\x0T\x9e\xd0\xc8\xad\xf4\xeb\xbb\x46\xf0Rb\xe2\xf5\xc4\xfa\xe6*'\x9d" +"[\xe6\x39x]\x7f&\xa8\x15\x8aw`v\x12\xcf\\\xf9\xb6\xcb\x35\x39\xcd%]\x9b\x94'\xaf" +"\x6\x65\xad\x63\xc1\xe8\xdf\x8c\xc9<\xff\x8d\xb2:\xc5=\x16\xf6\x1fm\xc2qH\x8b\x0" +"\x88\xe5'M\x1f?>\xc8\xf8\xf2\x8c\x85#\x83\x45T+\xa4\xd5\x38\xff*K\x8\xaf)d\xc_\xa7" +"\xcc\x8c\xd8\x9aG\xa0\x83\xdb\x93\x9n\xa8\xd4\xb9\x92:\xc\x6\x9a \xe0\x0 \xdc)oX" +"7\x10'\x9e\xb6\xf4\x4\x16-\xa3\x38\x31?\xb4\xdbPU\xf0\xb5\xf6\xddK\xe\xcdnj\xe4\xbe" +"e\xf4\xcb\x8e\xc6\xb1\xf7\n\xdeIp$V\xa0\x1\x31/\xecV\xb\xd2\xbb\x6\x87\xd6\x1a\xdd" +"\xe\xf2\xe2x\xa1\x34Rsow\x81N'{\x15:\xf6\xfdO\xd9\x9e\x9a\xdc\x65&\x9a\x9e\xf9\xcd" +"\xde\xa9\x89S\x89$D\xe1\xf4\x9d:j3u\xed\x9a\xcb\xd9\xa9\xf1\x10p5\x9e\x8e\x8d\x97" +"R\x7f\xc8t\x5\x9b^\xa3\xb0\xa8/\xd7\xd9&]\xe7\x15>\xff\x41\xb2\x8e\x39wg\xe9\xd0" +"\x93\"\x61\xf8\x39\xdd\xa7\xb3Y\xb0=M\xdf(!\xa8\x39\x8f\xe7\"\x16@\xe0\x35\xe4\x9e" +"7\x1bU\x94\xb6\x1a\xda\xcf\xa5\xde\xe8\x38\x9d\xbd\xa0N\xe3I\x7*\xe5\x6\xc5\x19\xef" +"C\xcd\x8c\x1b\xc9\xf\xc8ww\xd9\xbfo\xef&P\x88\xe\xe\xcc\x17\xc4\xd4\x8d\x1c~1\xdb" +"_E\x5\x81\xee\xeez\xf6_f\\\xe4r\xda\x87\xbc\x90\xd3\"\xc0\xfd\x87\x8f\x81.\xbd\x66" +"\xc9\xea\xa0\x33\xd5\xd9\x62/\x8fuI6\x10/\xd5\x14\x89\xab\xa3{rSe\xbc\xc3\xdc\xf1" +"\x2\x30\x0\x6\x1b\xab\x41\x87\x37\x90\x1c\xc0\x15\x0\xe0\xdc\xb2\xb3\xbc\x19n\x89" +"\xd1\x64\x62-\xab\xa2m1\xef\xc6\xb6)Q\xb1\xd2n\x15\xfd\x1b\x14H\xd7\xdcgP1\xb9\xc" +"\xa1\x35\xe4%p\xb0\xa9H\xe3N\x1e\xd7\xe0\xe3\x6\x63mG`\xfbU5 u\x2\xfe\x96\xca\xc6" +"\xb9\xb0\xa5-\xb7\xf0LA@\xea\xa8&\xb0\xf6\x84\x96\x88\xc4\xa3S\xadv\xd7\x80\xd0\xba" +"\x8a\xaa\xaa\xd6\xd4z?\xd7vG\xc9\x15\x9a\xf9\x1e\x9bt\xcb\xfd\x38\xee\x17\x88\xcf" +"7\xddl\x9c\xb7!\xa9v0d\x93Z\xce*\x94\x1b\x65\xd5\xb1\x1c\xa2\xec\x6\xcdp\xe@\xdd" +"\xa9}Ss\xc5\xd4\xd3\xa9k\xda\x17\x3\xc2\x8\xcf\xa2\x35\x90\x9e\xc7\x9d\xfc\xff\xea" +"(Nt;\x7f\x4\x88\xe7\xcbh\xfc\xc3\xe6\xc4\xf7\xa4\x9f\x94]\x85\x98\x89\x44'H`z\xcf" +"\x89\xe8\xd2\xb2\x1ev\xde\xff\x12\xdf\x17|\xb5\xb7\x12\xf0\x38_2\x8f\x65\xd2\x38\xab\x8a\xe\xdc\xf6\xd6\xb8" +"\xed\xa3\xb2\"\xdaT\"\xc0&\xdbq\x2\x37_x2>\x84\xfa\x86o\x1e.Q\xc5\x13r\x1d\x66l\x17" +"\xa4\x89\xa2\xe0\n\xc5\xad\xd0\xael\xe4\xd4O\xde\xfd\x65\xdf\x43\\IE~\xc1\x41\x91" +"5\x1c\x5\x44?4\x9e\x41\xb6\xb6\xeb\x46u\xc0o\x82\xbbU\x84R+\xf8\xf3\x16\x85H\x19" +"\"\xacz\x1b\xd5\x1b\x86$:\x97\xdc\\'\xf\x7\xc7+\x9cZ\x80zj\xa7\xc3o?\x13\xf4LFI\x1f" +"!l\xb1\xf;]\x1b\xc0\xe8M,\xc9[\xdd\xa6\x46\x19\xd8\xe9\xe0\xf2\xb9\xd1\xb3\xa5\xe8" +"\xa9\xaa\x18\xd4\xeb\x41\x87#\x9e\x10\x10VkV\x1e\xf6\x13\xfaX*Kf\x14\x9c\x1b\x1e" +"\xed\xed}\xba\xd6\xc2\xdc\xec\x39\x31_sZ\xd2\xc3\r\xfbv\xa9\xe4+s\x91-\x1\x8d?\x19" +"\xf2\xc7~\xb7\xf9<\xe2\x43\x33\x9\xd7\xd8\x2\x94\x9d\x9e\xd4\xfa\x7f\xf6\xcd\xe7" +"5w\xc9\x1b\xb2\xb0\x65\xea\x38\x9c\xe!\x4W\x98\x7f\x98\x14g\x9b=\xa6\xc4\xda\x85" +"\x10\xcd\xd4\x46.$\x9a\xa3pH2\xc\xddH\xba\xcbo\xc8)o\x12\xaa\x31`)z\xd9\xe3l\x1\xac" +"x\x7\xb6\x99\xe\xe7\xd6\x46\xd8\xad\x8d\x65Wc\xa2\xd6\x85\xaeV\xaf\x11\x0\x99\xec" +"wJ\xc8m\xf2\xbc\x8c#\xd4\x4\xda>\x4'z\x14\xd2\x91\xc6\x4\x0\x16=VBr\xb1\x5\xc6\x17" +"%\xbf\xec\x1b\x1e\xe7\xf5\xdc\xfdz\x10\xb1N\x1\x84\x97\x8e\x12>?&Y\xb\x32\x88w\x12" +"C\xfc\x11\xa4%+\n\xf0-\xb6x\xeb\x84\x62\x16H\xe2[\xfc\x32\xe9\x42\x6\xc9\x8bzJ\xdf" +":\xf6\x35\xd5\xb5\x90\xc6\x6\xb4r\x99n\x7f\xfd&\xb7\xf0UK\x97QBG33\xa0\x61\xeb\xf7" +"\x98g4\x1b\xd0j[\x5v\x1cYP\x87\xf2\x3I\xee\xeahE\xc8w\x85\xe7\x91\x17\xc3\xa9]G\x1e" +"\xae\x9dSG\x97\xe\xccG3\x1c\xf6\xa9\x4<(\x83\xf4\x98x{\x90\xe6\x94\x9c\x8e\xf3\x11" +"\xe3\xc9}X\xe6\xdd]\xeb\x0\xc8\x8cG\xe3\x91(:\x9aP\xbd\x0o\xe5\xa1\n:\xd0\x41 Cs" +"\x93\xe8\n\\\xcaY[\xce\x1bz\xe0^\x6\x85\xdc\x0?\xac\x9a\x8e]\x86\xe,#%\xa5h\xf4\"" +"*\xf2\xfb\x7fQF?\xc3\x5\x1a\xa6\x43\xb3\xc3\x6\xeb\xd9\x86N\x8\xd3M\xe7\xa9\xb4\x9b" +"\xb6\x9d\xcfi\xdb\n\xd5\x4\x7\x86\x38\x3;\x14<\xf2\xb7\x30\xd5\x98y\xcJ\xf2gf\x94" +"\xec\xf\xfa\xef=\x9dn\x4\x45\x94\xe\xacZ\x90" +"+0K]\xe5\xc0\xb9\xde#\xeb)\x8f\x37t\xb1wS\x94\xa2l\x89\x63\xbd~\x7 K\x81u\xb7\xf2" +"\xc5\x7\x32'\xa1m\xcat\xe4\xbb$\xca\x63\xc8o\xa6^mQ!\xa7)\rX\xa1\x1e\xc{\x98\xca" +"~\xb6_\xd6\x36\xb2\xe\xf5\x61V\xbe\x14\x3\x8a\x42\xd5\x1c\x87=R\xa6V\xb1\xa5}\x8b" +"\xdb\xde\x43\x5=\xd0\x96\xdf\xf8\xec\"+\xde\x65wl,F\xa0\xd6M\x92}\x8f\xfa\xb4\xea" +"\x1e\x9e\xf1w\xa7\x11\xa8\x1f\x7f\xc6\x66\xd3\nh\x19\x96\xf1\x94\xe4\xd5\xc5\x33" +"\xc4\x3\xa9\x32q\x6\x8b\x1\x99o\xe%\xe\x1\xc2\xee\x63\xfd\x1d\n\x91\x63\xbf\x8bg" +"\xf\x97\nm\xd4\x16\xb2\xae\xbb\xc9m\xeb\x2\xd2~\n\x83\xde<\x87x\x1e\xda\xc6\xaa\xa5" +"\xa0\xd1\xfdxw\"(\x97\x94\xd3\x5k\xc7O\\\x89\x9f\x64\x98\x8a%\xdcg\xc3\xf1M\xa8\x87" +"\x1di\xfc]\x8c\xf6\xb0\xe7\xbcp\xe3\x98iBv\xc6\x9bw\xa4\x80\x19\x98\x9b\x93uS@\xe0" +"\x0\xcc\xc4\xfa\x98\xcf\xca\xaa\xf1Y0U\x13\xa5o\x89\x87u\x8c\x97\x9b_\xbc\x87\x94" +"\xca\xde\x87m\x81\xe4\xec\xf0I_2\x9a>\xc2\x92~\x95\x9a\xec-&\xc1\xad\x32\xa3\xd1" +"\x11\xd0\x1d\xc\x93&$\xb9\x4\xda\x42\x12=DB\x1c\x84\xbcq0z\xd1=\x0\x41\x30\x8f\xab" +"\x8d\xe\xe6\xf9\xdetd\x0\xaa\x4\x1a|j\x99\xa7#\x0\xa9\xb9\x11\xfds\xf0\xcf.\rA\x92" +"\x12\x32\xf2\x43\xec\xa8g'wh\x90\xbd\xf9\xd1\x38u+\xb9'\xb6H\\\x1b\x45\xb9\x41m\x10" +"x\xa7\x3K\xa2\xb9\xfb\x1c\x7f\x9c\xb5W4\xf8}N\x1f\x8\x1d|Jf\xb5$\xb2\x42z\xba\xba" +"^\x91\xc1\x31\x89#i\x9a\xe3\x82\x6W\xe8\x9a\xc8\xc7S\"\xf0@\x17\x43\x9c~\xc5>\x18" +"\x91(\x88.v\x1b\x3\x63\x93\x8b\x7f\xaa\xe\x64@\xe1\xb6\x97\xdb&\xdeO\xc2\xb2\xf3" +"\xe1u-\x0\x7X\x97\x82\x92\xda\x3\xc7\xfd\xdd\xf1+_\x11`g\x98\xa4\x1kubp\xc1\xea\x9" +"_\xca\x4\xef\x36\xb1\xa7*\xa2}\xa0M-\xc9\xf3\x8\x43\x13x4\xa4\xb3\x39~\xb8\x7f\x10" +"v1\xbb\xab\x8erO\x0\x14 \x91\xb5X5z\x7S\xbd\xd8\x85\x98\x87{JP`x)!\x86\xa8R\xf3n" +"8\xe6\x6\xb1.\xad\x12\x0/\x2s\x10\x8cYM\x86\xd0\x42y($'\xed\xd4\x9f\xc3\x32]|\xde" +"v\xe9\xe5\xe\x17\xc3\xea\xd4\x8d\xa0\xb5\xb3@\x9d\xf1\xe7\xb7\x11\xdej\xc9\xcd\x1a" +"H\xb9\x7\xe0\xe6\xfa\xb8\xdf\x98x/\xdfH\xdc\x44\x43\x31HBC\x4i\x92\x42\xce\xcf\x9b" +"\xb4\xd6\x99\x11J\x95\rS\xc7\xd8\x16`\x18\xb0\x8a\xb5$m\x83j\x6\x33\x4Zl\xf\xdfs" +"@\xabs\x9e\x4\xab\x89(\xff|\xe6Huh+\xc5\x14&\x18\xc2!\xce{l8c\x7f\x5[w&[u\xd4\x16\xe1U\x91\x33\xc4" +"\xb9\x11\x9b\xf6\x9c@W2\xb6\x1b\xc6i\xbako\xbb\xea\xc9)\x8c\xee\x1f\xce\xf2kA\x89" +"I\x90\x86\xd2\xdb\x96\xc8\xaf\xb5\x34\xeb\xcf\xf7IAw%*\xec\xe0\xb1\xb9h\x9b\x7f(" +"I9#\xa6\x1m\xcf\xa0\xee\x1P%\xf8\xbf\xc4\xea*)):|[\x83\x42\xf4\x44\xdb!Z\x9evRp\x9a" +"g\xb1\x9f\xa0\xbd\xa6\xa2\x89\xa3\x94\x39}T:DL\xe4w\xe5\x43\x41\x43_Nc\xf9\xd1X\xd8" +"\x12\xb4\x34\xf9\xf5\xec\x1e\x9f\x8e\x1dSB\xa2\x8c\x9b\xe4\x94\xb4\x95\x1\xc6\xf9" +"\xef\x34\x9c\xf2\xc0\xd2JbD\xa3\x65+\x90y\xa1(\x9b\xa7\x3\x1dM\x97\xde\"]\xf6\xec" +"B\xa8\xdc\xf1>\xd3\xa3uq\xd6\x0\x99\xd5\xdfgv\x9b\xee'\xa1\xb2\x18\x19\x8a\x36\x65" +"\x93.\xfe\xb7\xfe!{C\x14\xd3\xa4\xd7\x99\x1b\xefj\xa5\xff\x8b\x80\x19\xa5\xf3\n`" +"\x9f'\x99\x80\x45\xa2\x7\x8\xb9\x66\n\xe8'\xd5\xac\xca\x4\xe9L\x0I\xe0\xecW\xaa\xe4" +"\xc0\xe6\\\xcc\xbb\xa8R\x88g\xa1\x86\x36\x89qe}W\x96\xc1\xcb\x1c\n=,S\xd8\xe2\x15" +"\xe0\r\xad\x14S(#\x89\x97\xa7\x1b\xaa\xaes\xc2\x1a\xfc\x81\xc5\xb7\x19\xeb\x10\xdd" +"\x8b\x9e\xe8\xf3\xec\xb7y\xa3\x94\x5t\x1b\xfc\x7\x8b\xcc\x99ZO\xc2n\xb9\xd9i\x8f" +"\x6\xa0\xf8?\xc\x0T,\x85\xb7\xb4\x82{r \xb0q\xc8\x81\x94\xd0\x33\x1a\x35\x31\x9b" +"c\x8a\x66\xed\xd7\xbe\x30\xe8j\xa1\xbf\xf1\xd2\x9b\xe\xbc\xaf\xb9h\xc6\x8fj\xc5\x17" +"f\xb7\x4\x80\xf1[K\xe0\x30\x1a\xc6\x9f\xc8\x45\x9c\x39\xbf\xdd@\x15\\\x14\x1f\xaf" +"\x8f\xb1\x12;m\xc2:t\xf7\xcb\x86\x35$\xb9q\xea\xea\x15t\xc6|\xf\xd7\xbf\xbc\xbe\xd4" +"\xb9\x94s\xe0}\x8d\x41H\x11)\xfdU\xb5w\x91\x88kbo\xb\x1c]\xcd>\x5\x0\x86\x1a' \x95" +"\xb1\xea\xc0\x96\xbe\xc7\xf2\xddS\xb1\xe4\x89\x1d\xde\xf5\x41\n\x63\xce[\xf7H]\xfe" +"\x80\xfb\x96\x15\x94\xa8\x33\xc8\x1c\xa8\xa5\x81\xe6Ww\x18\xeVp0|\x9by\xca\x97\xff" +"8\xbc\xbf\x6)\x95\xbd\xad\xbe]\xdbM\n\x90\xa5\xde\x1f\x35G\xd8\xcf\xa9\xec\x14$\x85" +"\xab\xa9MY}\x13\x87\xb9\x37\x39_\x13n>\x93Ksd\x9d\xc4\xbdX|xPH7;I6\xe7\x37rJ\xaf" +"l@\x7f\xc5{\x8a\x1b\xe3\xf7#\xfaOJhQ\x1d\xf9\xf7\xb7\x1ckpe\xc1<\x15\xfd\x11\xff" +"tivG\xdb)\xdc\xdd\xb0vX'IY\xe8\xb5\x11\xa9\xb3^DeA\xd3\x9c\xff\xe1!2\x9a\xb2\xd9" +"L'\x9\xe0\x8c\x13\x89\xffz\xfa\xd2ucP\xbf,\xcb\x35\xf3\x42(\xc4\xee\xc4\xee\xe5\x65" +"iA\xe2\xe8g\xad\x1d(Tu\x93\x9ciP\x92\x9b\x33\xcb\xfb\x30\xc5\xc\xd4\xb3+\xdfk\xb2" +"V\x90\xf3.\xca\xbe\x1aq\x93-\xddo\x19\xa3\xb6)\x17=\x1a:$0\x83\x96$L\x85\x7\xe4r" +"\xf6\x39U\xcb\xa6\x93\xfan\x18\xb1\xc6\x1e\x80\xd5\xfey\xa0&h1E\x8a\x37\xe4\x39\r" +"D'd\x94\xdc\x3\xce\xf7\xde\x44\x93?\x1d\xb9K\xb1\x95\x8d\x8cw\xcb\x65\xb7V\xafK\x87" +"\xb1\xad\x13\xc6\x43\x9eO\x98\x3\xbd\xb2\x64\xd6_\xce\x94\x16\x89\xb}\x5N\xb3\xd4" +"L\"MR\xdb\x95\xd8\x3\xd1\xcf+U|\x0\xf2)\x81\xfa\xff~\x9d" +"zC\xb7\x8b!\x82\xae\xd2[X%\xb0\x37\x94\x94\x89\x46\xd3\xb\x30\xca\xc8'C\x80\xad\x33" +"\x6]\x14\xedJ\x3\n\xe0\x5\x33\xc0\xe0r\x85\x90\xef\xee\x41\\\xac\xce\x63\xe8\x14" +"\xa0\xfdT\xbf\x98\xb2\\\xdd\xd4\x12\x12\x61\x7f\r\x39\x88L\x86%\xcb\x19\x5\xae\x42" +"\xdap\x1b\x3o`h\x7\x11\xee\x85\xe5\xf4}\xc0V\x4X\x90\x15k\x14iiB. \xf8\xa2\xa6l\xc4" +"\xa6\xf6\xfa\xbd\x6:\x16\x8f;\xef\x11\xd6\xa3i\xf1\x41\x8b\x84\x14=q\xd3\xcm\x96" +"_\x18\xabO\xc0\x89\x87H/\x83\x13\x8c\xddo\xb4\"jI\x8\xfc\x9\x1f\"\x9c\x62\x65\x17" +"\x1f\xc\xb5#(`\x80w\x93 \xb3\rK\xd6x`>\xcc\x91\x61\xad\x8c\xb5\xa5\x1\x83\x32\x87" +"\xba\x6|\x97\x3`\x80\xc9\xc9;\xcc\x12\xd6\x90\x13p#\x2\xc7\x5\xda\xc2V\xd7\x64\xfe" +"o\x1d\x1dW\xb0\xc5\x8e\x80n\xb4_\xa4-\xac\x9fg\xa7\x9d\xf2\xb4\xe9\xe3\xef.w\x9d" +"\x0\xa7\x7fy#\xd8\x66\np%:?X\xed\xbe\x1dK\xd6\xb9\xe8`n\x9e\xe9\xc\xcar]\xb8R!b\x87" +"I\xc0-\xdd\xc1\xb2\x9b\x64\xee\r~,FI\xd9r\xf5\x4\x7f\x9b\x37nI\x8bz\xc2\x8a\xc6\xd9" +"\r\x1e\x34H<$\xf1tca\xb6\x12v\xf1\ro\xc3\x83[G\xe2\xfe\xf1\x43\xbf\x95\x0\xb9\xb8" +"2F9\xa7\xaex\xb2\xdf\x88$W\xc4\xd3\x99\xe5\xfe`Z\x96\xc9\xf6\xdb]\xe2\xcb\"\xc7\x11" +"\x9a\xec\x39\xbe=\xc6\xc2\x8\xed\x1f\xe6\xfa\xe4\xe1\x1d\xd8\x90Up\xec\xa9|C\x8a" +"\xcd^\xb7\x41\xfd\x8b\x35Ud\xe3iqIe\xa6.\x86\xf9\x1d\xf8\x10nDE\xd4\xd9Y\xa7\xb9" +"\xc-\xcc\xdf=\xf6\x1c\x9f\x4\xc\xff\xc7\xbd\xe8\xc4\xdfPPT$+\xb0\x1e\x98\xb0W\xc6" +"K\xf6`3Jz\x1\xdf\xb2\xf1\x43`l\x7/\xd1\xb4j\x5L\x9e\x62Vv|M\x8a\x93\xf0\x61\xad\xca" +"\xfd\x45\xcH{\xd8\xe6\rk\x2U\xf5\x88\xc8\x4\xdf\xef\x12\x8bM\x8d\xcck\xdc\xfcT\xda" +"U\xe1\xe3\xdb\r\xcd\xd8<\x1a\x94s\xdd\xf6%\xb0N\xf8\xca\xbf\xe7\xffy\xd7\xad\xec" +"\x16\xcf\xb8\x36Z\xb8t\xf0\xda\x37\xb9\xc7\x93)\x1b\xcd{+\x9f\x35\x41\xb1\x85\x10" +"\xcbz\xde! v\"j\xb0\x0\xbd\xeb\xc4\xee\"\xbc\xdd\x9c\xfel\x14\xaf\x1a\xe4\xb5;\xa2" +"~\xba<\x85\x61j\x80\x86^z\xfd_\xcb\x87\xf5\xa6!g\x8aU\x83\xd6\x9at\xc5\x1a\x61\xe6" +"LJ\xa8y$V\xcc\x9d(\xa4\xae\xec\xa9\xfeGd\xf9\x82\xe5&rJpw8$\xf9\xdc\xbb\x91=\x87" +"\xab\\\x45\x1f\xd8X\x15O<\xecMh?\xb1\xa1\xf3\xd7\"t\xf4=\xb4\xb0\xa9\xfb\x32\xe1" +"\xe3\xed\xc5\xb2\xabM\x19\x1\xf\xec\x11\xe3I\xcc\x96\x1e\xf0\x16\xab\xbd\x36\x81" +"\xd6\xb8\xf3t\x9d/n\x19\xab\xba.-\x8b\xc2\xa6N\x92nZT\xd1\xbd\x86\xb5\x9aT\x9\xd5" +"\x89G\xbb\x1u\x97w\xe8\x92\x45\x7\xae\xee\x61\xbb\xe3n\xba\xbc{\xce\xd4&\x93R\xbd" +"\xe9\xda\x7\xc9\xb0U\x14R\xf2\x2z\xf0\x1c\x13!\x8e\x9a\xfe\xc7\xc6\x84\xf8\xa8k\x11" +"\xd4\xe3\x3\xe1\xe9\x84u\x8dt\x87\xbf\xd5\x96S\xee\x86\x99\xa9|W\n\xe0\x91O\xc2\xa9" +"E~%\x1a\x9a\xfb\xa9MAW'\x9c&&\x2[\xc7\x9b\x18\x93T=\x1a\x35\xc8\x66\xff[\xc3\xc0" +"!$\x1e\r\x16\x84\xcb\x16\xb3\x88Z\xf9\xd2\xf0\xa2\n\xb7[\xc5j\xedR-N2(j\xae\xfc\xc8" +"\x2@-l\xc6\xb!)\xba>\x6\xa7\\r&\xbd\xd4k\xed\xb2\xb5Yb\xb5\x86\x37\x8f\x16\x8b\xa9" +"\xfaJ\x9\xe6\xa9\x10\xa3_W\xfep\x80\xe5\x32\x90Sz\x83\x7\x8P@P\xd7y\xd6\xd6\xa7\x46" +"\xe8\xf2\xf0\xae\xda\xcc;.\xb0\x34\x17W\x90Y\xce\xed\xe7;;\xc\x61\x1fW\xcaM\x10." +"\xad\xea\xe2\xb4\xf9\x61\x12p\x96\x9a\x45\x43\xb3G1i\xce\x8b\"\xd2\xfe\x62\xb2\x41" +"\xf6\x61\xe0vq\xd8\xc2\xd9]TD\xb9\x5\x61[\xa5\xb4\xc2\xccyH\x89*,j\rw'\x1c\xb6\xf2" +"\x84\x7\xea\xba\xd0 .%\xd8@\xf\x0n\xe3\xf2\x41\xf5\xbe\x1fH\xec\x0GuF\x97\x17\x65" +";z#o\x87k.\xdd\x88\xd4\x33\xd4\xb8\xed/G\xf7=\x96J\x9b\xab\x3\x8c>A@\x0\xc7P\xec" +"\xbe?\xbd\x39\x2\xf8\xd2O\xd6\xcaR\xd4G\"pS\xe3T\x9c\xcd\xc4\x9f\xea\x46\xec~5x\xec" +"rG\xf7}\xfa&Z\x0z\x1b\x88\x9d\x36\xe5\x5\xf7\xbf\x8f\xab;h\xe7m\x9b\xc0\xeT\xda\xbd" +")\xb1\xb3\xd9\x7t\x8c\xa1\x34\xf0g#\no\x8a\x7\x9c\x8d\xaa\x81\xb2\xbd!\xa7\xab\x19" +"\x99ZD\x7fn\xee\x35\xe6\xd8\xc5\x3\xcc\xcfg\x9bl\x8f\xcf\xac\x7\xc3\xa8\xee\xc2\xca" +"\x9dQ/Z\xf7\xac}\xa2\x8c\x39\x1f\xa1q\x15:9\xcanG\xc\xa7,\x81;\x84.\xfc\xda\xb6\x32" +"\xf3\xa3]'\x8eHxj\xdf\x30\xc6q\xa5\x0\xdf\x99;L'\xd7\x8f\xe6g|'\xa5\x89\xba{R\xd0" +"\x1c\xf\x89\xae<\xa6\x94\x41\xd0\xcf\x32Q=b\xe6S\x90\x8c\x0\xfe%\xa2J\xcM\xce\xb1" +"\xff\x98\xb0\xa4\xb7\xa2\xf5\x9,\xad\x2\x8f\xc2\x16\xb7\x1e;\xd4\x99\x14\xc6U\x81" +"\x1b\x46\x88i\x85\x38\x38\xc9\xcb\xc\xaeZ\x95i\xcc\x97\x89\xdb}R\x91\xf2\x9?o\x2" +"\xc2\xaa\xfe\xba\xfe\x8fk`'\xae\x4?~\x9a\x6\xe5\xe0\xc7J\xe9\xc1y/\x88wg\xf\xf1\xdd" +"\xbd\xc4\xd3\x32\xb8ob\x81X\xf6\xf0\xd9v\xd5j\x12s{!\x9eV\x15y\x1i\xd2\n\xa7\xca" +"\xa6v\xa8\xf1{i%\xb1\x36\xbd\x18\xed#L+\x96\xe9\x93\x34\xc0\xdc\x4\x2kW\x9cZ\xa4" +"\x7\x88\x13\n\xa8\x4\x34\xe\x62\xdf\x9c\x85\xec\x99n5\xc4\xa9\xf9\xf4\x9b\x81\xd5" +"\xc8|\"F\x11\xa2\xd9\xd5\x18.\xf8]\x1\xeb*\x7f\x9a/\x9f\x96\xd4]S\x8a\xfc\xef\xae" +"\xacr\xe2\x36\x1b\xba\\J\xc1\x61\xae\x12\xf1\x65-\x1f\xd8\x42V\xaf\x1a%\x96\xe4\xcb" +"\"}[\xe5t\x81P\xf1\x37\x1d\xaa\xe\x4\xa7\x85_\xf1\x91\xe6\xc2\xe4R\x1fVP\x80oTEF" +"V\x14\xaf\x80\x1eO\xac\xe7\xa7\xa1I\x89U\x1bj\x0IY5\xed\x1f\xf4\x17*\xbf^x\xf5\xa0" +"\xc3\x1e\xa6\xb7\x7f\xb9\x30\xd5\x8d\x80\x8fG0Zj\xc\x98|\xd6\xb2\xd9;\x1~\xcb\xfa" +"W\x7\x1Q\xf1\x8UL\xfb\xbc\x6\x9b\x9dQ\xcd\x37/m\xbb\xb~\xf7\x8e\x65\x4\x46\xb0\xe7" +"\x16\xf0\x9a\xbb\x1f\xf0\xcc\x1f\x81\x46\x64)t\xaf\xc5\xed\x85\xe5\xe8{\xc9\xb0\"" +"\xc1\xa1Mr\xfbY;\x9e\xb7\xe4\xf0\x99\x85\xe\xb8\xab\xbf\xec\x11\x8ai\xad>\x17\x8e" +"\x8b(\xbc+\n\xf9\xba:\x8b\xa6\xc4\x15\xfbU\xd1\xfc\xa1\x17\xb8\x37\xe4\xc2\x65\x9e" +"\x86\x39x\x9c\xc3XY\xe1N2\xf\xdb\xc3\x99\xdb\x88\xfb\xa0\x95\xad)\xb0\xfb\xa7\x8f" +"\xec=\xa2S\xe5Hrm\x96\xac(\r\x98\xb7\xf4]\xfa\xa3\x1b\xc5=/\xdc\xbb\xad\x10\x63\xad" +"F,D\xea\xb2\xaa|\xc8\x32\xec\x1f\\\xadp\xe2@\x9d\xfb:H}\xdd\xfd;6PL\x1c\x85\xad\x4" +"\xd1\xb4\x10>\xbb\x92\xa3\xf8\x1\xc8\xaf\xb7hWU\xb2\x66t.r\xaa\xfa?\x87|G\xc5r\xbc" +"\x96\x9a\x18\xa7\xfb\x80K\x16\x43\n^\xad\x8b/\x7f\xdf\x9f&\xac\x92(\x84\x90l\xc1" +"\xeb\x17\x15\x86\xdc\xb7\x92\xb2t\xb2\x13L\x4\xf7Y\x9d\x87\x17\xb0\xee\x5z9\x89\xa7" +"!\xeb\xca\x30\xaa\x85\xd3\x1a\xb9\x43yp#\x6\\_dF\xa8\x91\x1d}\xa2v\xe6\xec\xb4V\x9a" +"\x9e\xbe]o\x18\xb1)g\x16\xda{G\xdb\x14\xc3.9\x83=6\x1e\xcc\xc8\x11R\x13\x94\xcc\x38" +"\xb4}&\x9bk\xb0O\xb\xd8\xbf\xfb\x63\xcd\xb%\\\x96\xc9\x8a\n\xc\x46\x5\x65\xc9\xa0" +"\x88\x90\x0Q\xfb\xc6\x62\x34\x1\x32\x45\xc1/\xa4~\\eY\xc5\xc1\x90*:<\x19\x35\xce" +"\x9ax\xe4\xf\xcd\x17\x86=\xc6\x93\xeero\xb7\x88L{}\xe5\xa6v\x1ciBK\xf9\"\x43w\x9f" +"\xf6\xa9\xe5\x66\xaeSr\xadZJM\xe\x8c\xed\xa9\xe\xa1-\"W\x9b\x1_ln\x9dTE\xfbU[E\xbf" +"(\xc\x3\xf5\x4\x9d=\xb3h!q\x1c\x8a}\xd5\xe7\xa2\xc1\xcd\xe2\xb3|\x80OP\xfe\xdd\xae" +"\xaa+\x8a\x2\x9b\xf4{N\x91}Y4\x18\xa2\xe7!8@\xe7\x9f\xd2\xd1\x61\x0\xd8+v\x95i\"" +"\xfb\x93\xef\\\xb7\xa1j\xfe\x18\xcc\xcak\xc8\x9c+d\x3\xb3\xa1\xce\x8a\xbc'h\xd8\x92" +"0\x5<\xb2\xc1>92,\xa4\xe4h,\xe1\xf3\xeb\x9c\xa5\xdd\x64(\xb9\xba\x1c\xcW;\x9b\xac" +"\xaf\xdf\x8a\xa1)\xcd\xff\x32\x1a\xdf\xd5\x14\xb2Yj~\xe7\x36q\xd8\xcf\xdf\xfa`\x14" +"\xdfq\xa1K\xcf|$o\xca\xc1\x19T\xc4i\xa5\x8[\xcbXeE^xD\xf8\xa4\x11:\xeat\x98-\x1e" +"\xc5\xe0k\xc8\x8b\x6V\xaam\xceo\xf1\x94\x91\xd0\x33\x1b\x9e\x12\xd3Hb/\x11\x89t>" +"\x97L\x19\x3\x4(\xd9\"\x43!\x6<@E]\x14 a~\xe0VW. r\xab%J\xf4\x33\x9b\xc9u\xf9^f\xb0" +"\x93\xfb\xe3\xce]k\xd5\xc6\x1\xa7\xec\x41\xbe\xa5#I\xf9\xfX_\xc5.W\xdb\x9f\xed\x41" +"\xc6\x10n\x15rL\x8d%\xe9\xa9*\x97`G\xe1L\x2\x83\x98\x1c\xd5\x32 V\xcLGy\x85\xe5\xff" +"\x9\xddW\x86\xa3\xd6\xb2\x3\x37\xea\x6\xe4\r\xdd\x15\n\xed\xa6\xe7\x41oC\x9b\xb8" +"\x18\xe2g\xa9p\xa5O\xbd\x46\x8\x8e\xa0,\x1e\x8bh\x9d\xf8\x1e\xd5\x17\xa2\x37#\r\xf2" +"6\x9a\xcf~\xe9\xce\x6\xc3\xe2N\x83\xa5\x62\xc\xe4pG\xc7%\xfboW\xa1&\xd5W\x81@lg\xb" +"\xa0\xdd\xe4\xce\xdb\xb7\xb2\x8c=\xa9(\xb6\xb8(\xef\xda\x0\xf2\x1b\xdc\x87\x63\x8a" +"k\xb5\x9b\x12\x9fP\xaay\xff\xef\x5\xcd\xdb\xe7\xf3kY\x97\x88\xd9\xb8\x13\x80W7\x83" +"\xdb\xde\xdd\xd0\x8bW\xaa`\n\x8c\xf8\xa2\x94\xfd\xda\x95-m\x1d`\x98\xf\xea\xdd\xb0" +"\x90Q\x17\xf5P!\x98\x18n\x8aW\x1\x9d\xe9~\xd3\x36\x9c)\xd2\x17\xfa,\xae}\x94\xa8" +"*\xcd\xdc\x8a\x32\xbc\xfe\xbf\xdb\x16}U.\xa8@\xb9\xe8\xb2h\x9b\x3rI\x7\xbe\x1a\x8f" +"\x97\xbaN\xd0\xe0\xfd\x98%y_\xdcTd\xa4]6w\xfc{\x14oo\\f\xd8z\x7W\xdf\x35\xd1^\xad" +"\x8c\xadL\xcf\xe9\x86Y\xb6\xc5\x81\x1d\xe8,\xf5\x64N\x0\x43K\xcb\x8b\xdc\xda\xc7" +"\xcf\xc5\x17\xcd\xc4.\x8bu\x84\x94\xb6\x93\x9b\xec\xc2\xd6\x42\x66\x2\xf1v\x7\xfe" +"\xb9\xa7\x18\x36\xb1\nY\x80^\xc4\x30\xfbn\xfcI\x17P\x10\xcb\x9a\xb1\x95>\x90l\xf6" +"o\xcd\xe4\xd2R\xa6\x83\xcf\xba\xc8\xf4\x1e\r\"\x1e\x35\xfd\xa9\x6}\xec\xaaq\xda\x1d" +"C\x93\x80\x33\x92\x45\x9\r\xf4\xe2\x1d\x81\x84[#?d\xad`\xddm@F\xb1\xa2W\xdb#\xe6" +"\x82\xd0\x66\\U/\xd3\xacn\x95\x65\xa7?\x8f\x91=\x84\xd8\x62s\xc5\x7f%\x14\xb2\x89" +"\xbfQR\x87\x98\xefL9\xc\xb2'\xa5g\xc1\xb0\x16\xe7\x1f\x2\xbf{\xf0\xae\x89I\x9d\xe5" +"=\x7LJ\xe4\x95X#\x17\xa5\x9c\xf5\x94\x7f\xc4i\x5\x46H\xb8\x81u;\"\xf6:\xb9\x36\xc8" +"b\xec\xe5\xab\xfa\xfc\x1\xe0\xab\xdbL\xf1\x63&y\x11\"\x9c\x36\xdd\x1d\xf0\x42\xac" +"\xf9\x32\xf1\xc5\x87;\x5\x91\xc2oWl\xad\xccjS\xad\x63~\xb1\x1c\x8c.\xe6\xcc\x84\xe1" +" @%\xa9(\x90zY\x1a\xe\x8n5L\xf1\xf5\x83\x5IS\xaa\xeb\xcfN\xf8\x9cN\xb2\xc3\xf0\x1f" +"@\x9e\xfe\xf3u\xcf\xd8\xed\x93-n\xc3J\xc9\xabk\r\x95\x84\"\x63%\x9f!\xdf\x66\xde" +"]Z\xe7q\x88]\x85t4\x9b\x89Yt@}\xe4i\x5\x8c\x94\xcc]^\xcf\x94\x99T\xf0\x80\x1e[\xe8" +"\xde\xdb\xac\xba~\x89?\x9a\x14\xe2\x11\xe2^\xb9\xa8\xd4&\xdd\xd6\x92\x66\x9fx\x5" +"D\x17\xba\xf8\xdc(*\xab\xd7\xef\xb1H\xde\x94\x15\xb5\x63\x46\xe5Z\x8f\xc3\xe5)ms" +"\x9e\x83v\x97\x31\xc4\x8a\x95\x31\x8d\x95\xebI=\x0T\xb9\xd5\x88|5\xcf.L8\xeP\xe1" +"\xbe\x66\x90\xc5\xf6\xe9\xe7\x1\x8c\xda\x11m\r\x8a\x98=C\xee$dV[\xf8\xc1\xfbVa\xb7" +"X8\xd1\xc1\x82>\xae\xcb\xd2\xed'!\xfc\xc3SQn\x94\xf5\xca@\x13\x9b\x8ci\xf6\x9a\xbf" +"H\x9f\xd3\xe0\xd7\x6lZr,\xf5\xcav0s\x4\x1b\xae?\xe9\xff\xac&\x1fuE{\xa5\xd0\xf5\x46" +"\xee\xc5t\x1aw\x0X\xb2\xe8\xb7iX\xab\xe5\xa2|\xde\xd4\xa8\xd1\x90\xad|\\S\xb5\x1e" +"2\xc1\x5\xf4w=\xaf%\x9em\x1b%\xe9]\x8c\xb0\x1\x80R;Q\x80u:\x18\xe7\xfa\xac|G\xfe" +"\x9cJ\xa7\x19\xea!n\xfa\xda\xecR-\x1d\xf9\x6\x32\xe5O\x8c\xca\x66\x96:]\xb7\x84R" +"\xdf\x42iEy\x8b\xf\x91Q\xa9)W\x15%\x99^\x15\xee&8\xc7K\xdau\xe8\x14\x1\x61\x1a\xa4" +"H\xe9\x36\x14\xd4\x84\x1a\xb[\xe4\x1\x98\xa4L\x5\x8d\xdf\x14\x8\x98\x81g?c&\x82\x1" +"\xc1\x99\xdeP\xebH*\xe&\x87\xf0.\xd9\x9d\xe1\xaf{,@\xef\x8a\xe4>\x84\xf7\x99#\xbe" +"\xd8\xdc\xa6\x13-v\x2\xbb\x1e\xa2;\x10\x46\x96(\xc6\xc2\x63\xac\xba\xfb/\x1b\x9a" +"\xe5=\xf\xc9\xec\xdc\x64\xf3\xb9\xd5\x13\x61^\x1b\xaeT-\xd4\x7\xc6h\xd3\x8b\xcf\x1f" +")\xc\x82#\x4\xaaI%\x1e\xd2R\xf0\x36P\xee\x62(\xe\xd4\xe1i\x2\xca.\xdd\xb2Mq\xe4\xb1" +"f\x17\xf4G\xc6\xbc\x90}\xb1\x87\xa0\x1e\x9b\xe9\x1aG$\x81\x61\x36\xbe\x46\xee\x38" +"\xa4\xcf\x91\xcf\xf5\xf4j<\x19\x95\xc1" +"\xd3\xfe\x17\x16\x7x~\xe0H\xf6J\x17\xea\xe6\xaf\x90#\xe9Wo\xb4\xca,\xee\xd4]\x91" +"\x95\x65\x10\xb8N\x7{\xc6-\xdaHwv\xa2\xa2ie\xd1o1\xd1\xea[\xf\xc1W\x1\x38\x89\x16" +"\x80+\x84SP\x10\x7\xd6\xce\xe7\x95\x32\xbc&\xc3\xda\xa5\xa2\xe0]\x8a\x17\xf4O\xa7" +"\xfdL\x2\x66^\xd1K\x93\x9e\x8b\x85;08\"\xbc\x1b>\xc5-\xbb\x8c\x88\x85\x2\x7\xea\xed" +"\xe9\x17\x66;\xb7Q\xe0W\xb6\x90Ih\xca[\x86\x85\xc5\x84\xc1\x1b\x9c\x98\xed\xa0\xc7" +"\xcf\xa5\x31\xa3@\x9f\xc0\xc7\x66L\x95K-{|\xed\xdf\x9b\xb4\xbc\xdf\x14\xa3\x41\xa8" +"\x10\xffI\x82\xd9\xa4:\xdb@1MVY\xfd\xc2\xc7\x90Q\x1c\xc0\x85W\xe3P\x11\xef\x1c\x0" +"\x5\xe\x93\x82\xc5p\xd7\x16\x19\x80\xc0\xe3S\xfb\x17\x85\xcf\x9c\xb6\xa2\xa4\xe6" +"\xb5\x82 e\xac\x84\x91*10\xa1\xa8\x62\x7f\x98j\x95G\x1\xf8\xa4~\x8a\x9d\xa1-'N\xe9" +"^Q\xdc\xbem\xce\x62.\xbf\xf3X\xe6=A\x9d\xed\x6\xaf\xff\xd7\x14vaV{h[2\xe1\xc1\x7f" +")=y\x17^\xd1\xdf\x33\xd1\x0\x82\xe3\xfQ\xcd\x8b\xc8\\~\x81}\xba\xba\xe\xa6\x3\x41" +"\xd3\xe0\xab \xbe\xc2\x87?\xd3\xd1[\xba\xe3{K\xa1\xfd\x32\xd0\xc\x13#\xbej\xa6\xcd" +"\x85&\xcc\xb2\xfa`\x18\xe0\"\x1b\x84\x42\xe1\xe1\x86\xf4/I\xe7Hfk\x1ag\xdd\x61#i" +"\xc1\x9a\xfe\xcbY\x8f\x1f\x46\x1d\x45\xd4\xac\xf5\xb6\xfb\xd0\x12@\xc4o\xe3[\xf9" +"\xf9`\x19\xfb(\"\xaeM\xa1\xac\x88\xe6\xd9\xa5\xa4#L\x92\x84\x31\x84w\xbbR\xb0\x6\x12\x95:\x9a" +"\x8e\xbb\"\xbbt\xec\x37\xb9\xe3K&q\xcf\x85\xebV\x1b\xb2\x9f\xc8N\xa3\xd8\xb8J\x92" +"\xcd\xc6\x31\xb\xcf\x9eVC\xf4\xb4\xecU\x8f\xd6\xabO\xae\xe1\xaa\x15V8q\x16\xc8,\xfd" +"\x9f{^6j\xaf\xbd\x36[\x1e)\x13R\xf5\xa7|\xd1?O2\x3\x8f\xc8\x65\xbe\x94\x2\x92\xa3" +"\x11M1p \x1a.\x1a\xf0\x5\xe1\xd1v\xecW?3\xe0\x34?fVyn\x1f\x2\x16z\xcd\x81\x37\x8c" +"\xbc\x3\xf1\x86\x99\xb5\x35\xff\x63[\x80\xbc\xc4\xb4I8\r\xa8\x30`\xfb\x7fw\x3\xd9" +"N\x19\x94\x1a\xcf\xec*\xe9\xdd\x11\xab\xf8]\xa4\x9d\x99\xf3\x8d\xa1\xe7mW)\x91\xaa" +"\x89\n\x8bl\xb7\xf9\x17O\x14\x45\xc5\x92jFff\xfa\x8e*\xba\xae]z\x16\xdf.\x91\xdc" +"\x3\xf0~.K\x90\x17\x31\xd6\x9b\x7f\x84:\xa4\x1f\xd2\xa7\xdc\x2\x9c\x43Q\xe\xf3\xf7" +"\xd6\xb8 r\xbb\xbcM\xef\x97+L\xc2\xfe\xe6v\x99\x10\xe2Qg*\xf8\xfe\xbe\x1{\xa7m\xb5" +"\xc2\x1bWi\xb6\xca\xb6\x13\x14VR\xfanW| \xe3\x44&\xc2\xc9\x2\xc5\x39\x84\xf2:kV\xf4" +"0 \x0\x1c\x39\no\xd6U\x2g7\x8f\xe8\x9K\xaa\x64\x8br&\x88\xff\xaa\xdf\xb0\x8c\xf3" +"0\xd0\x96\x98?nC@\x85\x33\xb5\xea:R\xf\x89\x44>\xb\x88\x19\xb7\xc1\x18g\x5\x1\x89" +"\xb6Y\x11Z\x9a\x19\xe8\xf5\xbb(\xf2}m\xee\x19\xfe\x63\xfc\xbe\xa0o?\x1d\xed.\x81" +"\xfcOI=\xbe\x6\xe2gB\xab\x96\x1d\xba\x19]\xdf\xe8nI9\rp\x94\x0\x8a\xc5!M1\xc4\xfe" +"\xaa$j\xbf\x1a(Se\xed>e\x4*\xd9(J\xb8T\x86\x43\x34\x8\xb9\xad\x90\xf2\x45z;b\xb6" +"\xfd\x99\x7?\xb:\x11k\xe3\xbbjV\x8e\xc2{\xab\xabZZ7\xd1\xa1_\x97\xe9\xe0u\xe1\xff" +"\xa1\xa9\xbe\x38\xbf\xf6N6kVS\xd0\xf2\x90\x1a\x38\xdc\xfa\x9bz\x95\xa9\xa6\x61\xbe" +"\xf4\xdf\xee\x91\xe6\x8d\xd6\xa7G\xc7\x12\x96\x34\x15\x30\x9f\x95\x12\xa7_\xcc\xb6" +"\x8e+S\xb4\xff\xe5\xaa\x14\xc4\x9a\x43\x46\xda\xe1\x93\xef\xe9RSF7\x90\xd3\x7Y\x2" +"\x14 \"q\xc4i\xae\xb5\xdc\x1d;\xa6\x66\x61\x88\xe5\xe1)\xa8\x43\xf9" +"{\x84\xa3\xd8\xcc\xfc\x84\xc1Ww\xb8\xd7\xdb\xd5\xe3\xf7_\x8~\x6\x88W\x17?y[dJjO\xf0" +"\xe1'F\r\x15\xc\xf0\"S\"\xdd\xc0\xde/ \x11\x37>d\x99\x15\x46\x39M\xd2~\xd6\x8b\x81" +"\x82\xfd~\x98\x85\xcck\x5\x7\x15z\x8a\x7f\x5\xec\x99\xb7\x44\x31\x80\xfc\xa4\xa1" +"t\xb7\xaa\xb1\x10\xd9\xea\xe5`n\xbf\xb5o\xf5\x35\x82\xbd\xa0\x12(\xd9[8\xa4\xd8{" +"\xd8\xae\xe6\xdf\x9e\x95\xd6K\xbb\xac\x35\x84\x1aG\x86\x94S\x1e\x1\x43'\x2\xc\x12" +"m\x4\x6\xc0\x46mV\xb6\x34\x9\xe7z\x9d\xaf\xae\xd1UE!qe\x19\x88\xf0\xf6\xef\x1c\x35" +"}\x9b\xb\xde\xc9\xb4\xa3\xeb%g\x14\x98\xcbk\xf5\xd5r\x3\xb\xaf>\xb6\x37\xcb\xed\xa7" +"d\xf7PC\x1c\"j\xa9\x90\xab{\xf1\xd1Y=\x2\x43\xc1\xd4\xda\x65+dP\xaf\x33\x1\x30\xc3" +"\xbcI\x0\x8e\xc4\x9J\x12\xa1\xd8;_E\x11\x41!\xae\xf1\x63 \x9e\x39!3&\xd3_8\x8$\xb8" +"\xe\x80\x41\xd2\xe9\x8bl~c\x10g\xa4:\x5\xf5\xea\xf6\x1\x8e\xda\x38}\x8e\xf3\x42\xa3" +"{\x8\xba_\xc5\xc8\x61\xd8\xbfpH\xcn\xdf\x82\xf9\xc9s\xba\n\x8c\x1b\xa3\xa7\x63\x96" +"\x15\x45+\x7\x39\x0i\xb0x\x83#C\x8 \x96\xe4\xda;\x8\x85\x96\xe\x8e\xc6qQ:\xbcs:\xfb" +"\x94s\x81$/L ~\x13\x41\x91\xc7p\x7f\xfc\xe8\x33\xca\xb3\x9b\x31\xe4\xb6p\x97\x12" +"=\xaa\x32j\xb0\x6\xdd\xc7}&\x85\xf7\xbb\x9b\x12\x35\xea\xea\xf8\x4\x33\xbc\xd7\x42" +"K\xca\xd8\xc6\xb2\x61q\xf7\x46\x38\xac+\x7\xfc\xdb?\x8a\xaf\xdc_P\xb8\x3\xc0\x1b" +"\xae\xf5\x80\x89\xb0\x7\xb8\xaa\x30\"r\x8c\x5{\x1aq4=\xac\xc4\x1c^\xacO\xc4\x43\x8a" +"\x82T\xf5\xaa\x93.A[In\xc9\xcb\x16\xba`\x8f\xde\x83\x41\x9d*\x1d\xdfUo\xe8\xd6\x3" +"`l\xeb$\xa5\x81(\x8c\x45\n\x62\xec\xf7wU\xfb\xfa\x98o\xa0\xb0\xde\x13\x34{/\x90\xa8" +"\xcd\xb7\xe2\x35\xdcYz\xea\x9e\xe2\x87\x65\xbHi\xabX\xc9~\xa5Y{\xea\xfe\x42SZ\x8c" +"j4[\x97\xaf\x14\xb6\x9c\xe6\x36\x91%Q\x8c\xb6\xf7\xa8\x96\x82\x91\xc6\xa6\xb1\x61" +"`\x19=Z!\x87\x2\xb7R:\xd3W\x10\xef\xcfL\\\x8e\x9a*0\xd9\x95\xdc\xeb\x13\xea\xe7\x17" +":#\xb4\xaa\xae\xf5\x85t\xa2\x66\x30^\xa7\xacZ\xae\x80\x1c,\x17\x4Z\xe%\x19]\xb4\xa8" +"_\xe7\x8c\xf8\x42\xfa~9\xa2\x3\x84-/t\x81`0YC\xc3mE\x10\xf3\xfd\x82\x9d\xd1\xe4\x81" +"\xd6\xdd\x88\xa1QE\xa9\xdd\xe8\x8a-\xbf'+\xa5\x16\xda(\xe4\x14\x8\xd6^\x9a>P/a\n" +"#!\xe9qJ\xd0lB^\x96\xd1=P\xeb\x8dO\xf1T\xc1z\x85N\xfe\xcb\x9c\xc7)'\xa5\x42\xb8|" +"\x80\xc4\x85\x62\x1d\xeb\xb5\x30\x44>\x9a\xec\xa2?\xe2\xff\x9f\xeb\xa3*M\x8c\x96" +"\xbf\xe7\x97\x91;\x8k\xec\xc4\xea\x17\xddt\xc2\x8bO\x7f\xca\x43\xf4\x31\xbf\xb6\x88" +"\xf1\xfc\xda\xe5\x65\xaak}\x14\x1\x39 \x92\x30{\xf3_\xb5\xbb\x38\x37\xe8\x85\xf7" +"e\xf1\xc4\xef\x31HwhW\xf1\xc1\x84\x62j\x9c\xa1\x98\x92\xb1\xc7\x2\xb7,\xf9\xb4\xa6" +"\x98\xa8\x8f;\xaa\xfb\xa2Wxt\x82/Kd{>\xf9m\xa5\x8e\x45\x89\xf\xc9\xa0Vac\xf4\xca" +"C\xe1\xc5\xe2\xa8\x62\xa7\x61\xda\x31\xf8\x97\xc5\xe\xe5\xd0\xef\x12@m\xabrGQ<\xac" +"\xc1\xbe\xbf\x84\x2\r\xd0\xca#\x2\xf3\x45\x82\x10\x95\x4! \x81 \x80\xea\xfb\x7f." +"\x94\xc6|\x88\x1b\xef\x5\xdaY~K_\xc7\x97\x44\x1a)\n;Z\xeb\xcc\xa1\xb9\xf2\x37\xf2" +"\xb9#5\xc8\xdc\x10\xb0\x8e)\xae\xd7\x42)\xab\xba\xf5u\xabZ\xed\xb9\x44\x11\xc5\xd1" +"\xf8\x37\x15\x13\x9e\x61\xaa\x9aV'mHc=\xcd\xeb\x7fZ\x9f\xff\x32\xc9\x95qh\xee\x9c" +"\xb1j\x99\xa4k\xe0\xd6\xc0'\xc1\xfaQ\xb0\xcc\xf4\x85\xb7\x9f\xf0\x65\xa3\xa5t\xab" +"B\x11S\xde\x39\xe4\x19\xd6m\x12\x43x\xc3\x83\x19\x44\x96{\xc1q\x9c\xdf\x90\xc\x14" +"~_\xea\xe7}j\r_e\xcdW\xc8`\xda\x6\xd8|\xb8}U\xb9s\x4\xfdw\xa6n(e\xf4p\xa4\x1d\x86" +"`T\x1f\x31\x87\xcd\xac\xe3\x46QTx\xfb\xe5\x5\x82\xb9\xce\xb2n\x94\x9\xbc)JC\xb4\x1d" +"\x8d.\xea.3\xa9\xdc\xe8=\x1f\xae\xc4\xb0\xaf\x9d\xabgr7\xb0\xd4\x42\xe0~\xe7\x9c" +"%\xdc\xeb\xb8\xfa\xa9X\xed\x89\x8e\xf9\x91\xd1\x66\x34\xbd\x80\xdbt<\x7\xf0p\x81" +"\x2\x14\x1c\x9c\x32I\xe0\x99\x99H:\xad_\xd7\xe0j\xbf\xa5\x9c\xde\xd8\xf5\xaej\xf6" +"N\xc5\xf6\xe6\xc2^\x10\x1bvX\xb\xc4\xa7v\xdd^\x90\x9c\xe9,\\\xc2\x32\x41\xfbr\xba" +"\xcf^\xc9\x35P\xb6\xba\x30\x13UL\xa9\x8\x8c\xce\xd4Z\x8c\xc6\x0)\xf3\xa7\xec\xc5" +";\xe5\xea\xfb\x16\x90Y\xabKsP\x6h`\r\xc1\x45\xc9*c\xc9\xbdM\x1b\xc9\xa9\x2\xbc\xd9R\xa0\xdb\x12\x96\x35Z/\xe0\x9a\x65\xf7\xfc\x34JR\xe2" +"\xbQ\x91\x30_\xffL\xcc\x97\x32^/\xffV3J\xf2\xa3O$t\xfd\xe3g@28|\x8\xfc\xee\xc5/\x19" +"\xc4\xf7\x32\x46\xdd\x30:\xf9\x97\x1c\xa8\xc2{o\xde<\xd2\xb6\xd3&~\xc8-\xd3i\xbe" +"\xaa\x19\xc0\x8b\xeb.\x2\x11<\xc7\xe9>9\x88\xcb\xd6\x65{!\ro\xe7\x96\xf0\x32^\xcc" +"1\x5\xf4m\x6\x36\x43\x85\xe6\x9G[\x96~R\xdbNCH\xe3\x9dQ\x9c\xea\xc2\x13W`\x8\x93" +"\x19\x9a\x1\xd7\x35\x9c\x8e\x45L\x10.\xc6\x97\x44\xb0{\x87\xfeS\x9f\x4q\xa4t\xa6" +"k\xa6\x2[\x12h\x8bM\xa2\x65\x61\xacm\x7J-<\x85Y\xa0\xe\x9b\x8e&\xcd\x64\xaf\xba\xf6" +"s\xb8:\x89\xc8~\xdd\xf4\x62&\xae\x41s\xaf\x9\x64\xb5\xdc=\x91~\xb2\x45\x62\x95\x37" +"\x82\x8d\x8e\xb0\xb2\xa6\xad\xc5\x11\xd2h\xdb\x2\x9b\x1c\x42\xcd\x36\xe6\x1b\xa3" +"$\x89J\xe4\x33o?\xeb\xd0\x8b\xae\x32\x34\xe3u\x1c\x1f!k\"\xc5#L\x81L\xdc\xd5\xa5" +"\xf0\x9f\\z\n\xb0.j\xd3\xd0.\xe4\x2_c\xf9\x13\x9e\xe7\n\xb5\xf5\xd2\x98\\\xe1\x1b" +"8\xe0\x14:\xdd\x2^\xe4o\xc*\x1d\xb3\xdd\xca\xa1\xf8\\\x6\x89\x3\x45\x85\x41\xce~" +"\xa0\x38\xaa#\x8c\xc6\xf4\x0\x85\x65\x9d\xda\x5\xc9\xf3\xe5\x9e\xf1nK\x14\x7w\xce" +"\xc0k\xa3\x89\x6\x34\xf7\x66\xb4OE\xb\x98\xc3\x32\x33\x81\xe7\x9bJ\xbc\xee\xf7\x85" +"+\xc5\x84\xcf\xa3!\x15\xc1\x93\xd2\x7\x94\n\x8f\r\xd1\x0\x81\x6\x81\x88\xfbG\x87" +"{\xc5r\x9\xe4\x81\x89\x17\xd5\xd6\x19\xb7\xa7\x16 \xf9\xf5iO\x81Y\xf1\x14\xb6\xbb" +"\x9f\xb3W\xb9\xc5\x6\x37\x97\xce\x14\xb0\xdcjv>\x80\xba\xf1\xe2G\x85\x99\xbe\xef" +"i\x9e\x9f+|\x3\xb8g\xa5\x9e\x61Z\xd4=\xdd\x1e\xab\xc5\xca<\xd4\x9c\xfb\x89]8\xee" +"y\xa2\x92UL\xd4\x1d\x16\x6k\x6\xb0\xc9\x62\xe6N\xae\xec\x8c\x38iSr\x15\xc5g\xfe\xe6" +"\xf3V\xcd\x46\x10$\xbf\x4J\xf0`\x7\xcal\x7'\x17\x80Q\xea\xe2\xb5\xeb)z\xdeVs\xae" +"\xae\x3\x1a\x8d\xc7\xbf\xa4#\x8bIH\xb2\xbd\xb8\xa7\xad,\x89\x99\x82[M\xbb~^\xf3K" +"3e\xdc\xc7\x1clD\xcbzl\xc0\x1b\x65\xa8\x17\x1f\xb\xdcJJv\xb0W\x9a\xba\x33\xc4\x38" +"\xcf\x7f\x10\xb0\x9eTk\xa2\x1e\xf3\xfb)\xcb\x38{\xc8\xe9\xc7\xf6#\x98\x1\xbf\xb5" +"pR\xee\xd5\xc7\xadu\xedQi\xe\xe5\x91M6|\xce\xa4&\x9d\x95\\'\xf1\xf0\xf6M\x1eO\x16" +"\x9b\xdb\x86!\x91\x86\x17\x43<\xf8-p\x80\xcf\xe8 \xe4\xf2\x8d\xc5\xcb/\x9c\xb6\xe7" +"\x89\x92\x84\x7\xdd\xaf\xc4'\r}^4\xe4\xc0\xcb\xd3\xe1\x82+I\x86\x91o\xac\x9f\xb6" +"\xd5\xdf#\xbf\xef\x93\xdb-z.\x89\x16\xc4#\x9a\x13\xf1\x9c\xf6\x38\x92\xf0\x45\xd0" +"e\xbc\xf5\xc8@=3Z\xc0\xfe\x41\xd4(o\x0\xc3\xd8\x9a\xdc$\xe1t \xf7\x97\xee\x45t\x9c" +"rq\x8b\xea\x13\xc2\x43\xa9\x1e\xb7l!Y\xdd\x85\xbb\xb6\xa7\xa9#:\x3\xd5\xdb\xed|\xf7" +"\xa7\xd2\x4\xcb\x61\xa4\xc\xb6W\x88m\x18\xa2\x94pP\x9b\xc6}Z\xfc\x33\x89GF\xef\xbd" +"\\h\xe4\x91x\x8f\x17\x83\xb9\xa1v\xab\x9bH5\x80;\x9bQ\x90\x98\xd4\xcaR\xde\xb1\x8c" +"\x9\x9b\xba\x12\x1\x85\xf8\x62T\xaa\x8c^B\xeb\x9al4I$\xf5\xbc\xd6*\xe4]2R=\xad" +"\xad\xdb\xc0\xc\x39\x8u\xfb\xf5\x89:\x5\xd0hZ\x2\xa4\xbc\xfb\xb{\x86\xd5\xb5#\x1b" +"\x4\x18qsyA}\x2\x7f\x30\xd3qz#\x1\xca\xde\xdf\x99\xc7\x37\x38\xab\xf2\xe9\r\x16\x32" +"\xe6\x2\x39\xe7Z\xc1\x42\x1b]\xfd\x9\xda\x8f\xfl\xfe<\x91\x44\x97N\x1e\xf3\x92=R" +"\xe2\xfb\x96\x8a\xbe;=\xe2xe\xf2\xd9)\xcf\x84O\x9c\xd6\r\xe0\xe1{\x10\xde\x17q3P" +"\xa8Y\xce\xea\x43v)\xfa\x31!\xfc\xc1\x86\xc@K\xea\xac^f\xa9\xe9\x15\xb3\x5\xfc\xfa" +"mO\x4\xc3\n|\xb5\xf9\x35\xc6g\x8d<\xd3\xfe\xaf\xa1\xcbn\xa8`=4t\xd9-g\x4\x0\xba\x9" +"@\xa0\x90\x33\xa3\xdc\x38#@Gd\xd5\xa4" +"\x80Q\x8e\xfb\x63Y\xbc\x32\xa5\x39\x12\xe0\x8c\xc1\xc8H\xdd\xb9\xe8\xfc#\xe1\xd2" +"\x87\xa8\x88/\xd8\x33\xb8\x84\x9f\x0!\xfc\xce\xa7\x64\xbc\xec\xc0Y\xd2+q0\x3\x18" +"\xe5.e1\x81\x1S\xb5\xd3\xf1+\x82\x2\xec\xd5\x8f\xa2\r\xa6'ad\xe4\x43\xea\xcc\x34" +"!\xf5}\xdf\xb5}E\xdb\xed\xbf\x8\x8)=\xf2\x96\x88\x1e&!\x9f'\nF\x8e\xa6\x95\x91\xd5" +"\xee_\xae\x92\xa9\x13\xe2\x90_\x1\x1b\xcd\r\xc7\xb7\x94\xcc\x8b\x1c\x8d\x16n\xf1" +"\x15\xe4\xa0\xf3g\x8e\x9eS\xc9\x36\xc9\x82^0\xe3\xed\x62\xe6\x89\xc6\x7fl1\xbf(*" +"qOA\xd9\x88\xa0\xf3Z\n\x1\xb8\xc7\xd0\xa3\xde\xba\r\x94}\n|\xa5\xa3!\xe3y\x83{+\x1" +"u\xfcl\xd4m-\xd2\xb0\xc6\x64-\xdd\x14\x96y,K\x1d\xfa\xe6\x1\x1a\xf1\x65\x14\x99\x2" +"z|\xd1\xe5\xabOR\xeb\xaa\xc9\xc6\x0\xbe\xf9&\xf9U\xc9\xd8\xda\x1a^\xaf\x46\x98\xa7" +"\x1f\xc0\xfcp\x95\x30\x36_\x2ZU\x87G\xe1\x1a@\xc1!\xa1\x30\xa0\x13\x3\xf6hS#\x86" +"\xd0\xc9\xa5v\x93|\x19\x85G\xb4\xddO3\xc2R\xcb\xfe\x9d\x90o\xc9@\xc5n\xea\xa2\x42" +"\xc0\x8a^\xc3\xb4O}\x8f\x42\xb3\xd9O\xb5;ZJ\x8c\x9c\xb1\x1fk\xb4k\x15?\x0\xb6\xd5" +"\x8c\xa6\xa0\x31L\xb1nKe\xd5\xb7\x1cs\x9c\r\x42Y\xbd\x30\xa2\x13\x45\xab\xb5\xd7" +"\x85s\xa8\xfb\x7\x9\x94^_Sm0h\x96\x63\xb3\x1e\x64\x30\x98\x43(\xe7\x63\x9\xec\x9d" +"\xb\x81m\xff\x66\x96\xd3JVOiK.\x8b\n\xd6-T\xfc\x97\xd2\xd0\x9c\xa9\x45yu\xbd\x86" +"I?0k\xe8\xae\x62V\xf5\x8f\xfd\x6\xb1\xd9\x6jK:\xd2\x64nIC\xfd\xa6\xf1\x31\x63\xca" +"\xbc\xffX\x1f\x8b\x92\xd5\xf3>\xdfQ+\xc8\n\xbc,\x84\x35R\xd7\xc7\xdc#d\xbd\xee\xfa" +"\xdf\xee_\x84,\x10\x9\x81\x7f\x11S\xbf\x9+1\x91\xee\xab\xa2\x9\x91\x36&PR\xca\x19" +"\x92\xf7\x93\xa8[\x1f\xe1\xc1\xac\xd6\xd6\xb5\xab{\x16\x9c\x5\xbc\x65\xbb\xa8\xa8" +"\xd4}\x1\xf5\xc4\xb0\x14z\x97\xca\x15l\xeep\xd3:\xbb^X\xaa$f\x9b$\x5@\xfd\x1d\xe6" +"g\x1e\xf0g\xa3\xfc\xc2\xda\x39\x33\x7f\xfd\x87\xe6}4\xfd\x4$$\xa4\xb3Z\x1f\x89=\xe8" +"\x97iv\xfaj(\xf3xf_\xcQ#\x7f[\x83)K\x9e\x89\x85#\xbe[\xd0\x92\xf\x14W\xc4\x80\xdc" +"\x88\xb9\x7f%\x10Z\x4\xae\xc0\xd0\x9cj\xad\x91]\xe6\xb2\xd5\xb8\xf0\x1\xefh\xd3\"" +"\xbf\x42\x1c\x98 T\x83\xb2/{by~\x12\x36\xde\xbe\x1\x96\xbe\x1a\x42;4\xdal\xc4\x1a" +"\x15\x8\xdd\xe4\x99\xb5\xba{\xe0{\xde\"Zex\x88\x3>\x8\x13K\xf4$\xc5\x39\xea&f\xb3" +"\xc1\x32\x2\xb5\x6]\xde\x6MdL\x13\xa5\x1an\x9\x83\xd0\x42s#\x8L\x0\xbc\xabs \x1f" +"t\xcc\xda\xe0.\x95\x1d\xe4-\xd4@9\x89\x16\x1\xfa\xb4\x45{K\x0UQ`y\x10\xd2!8\x6V\xb1" +"\xec\xdb\x91\xf4\x9a\x96>\x9f\x90\xf4\xa8\x46h\xf2\xda^\xe9z\xec]\xaa\xfe\xd5\xd1" +"\xb7n\xc9\xf2\xb6\x63\xd3\xff\x10\xb3P\xfb\xa4K\xc4 \x83\x88\xcf\x30\x84\xa2m*r\x0" +"\xa0\xf9\xe5\x93\x30\xb8s\xe5\x82\x61N\xd9\x62_3\xb1\\\x32\xe5O\xf&\xc8\xc4\xb2r" +"a,\xeds\xb7\x5\xf0\x81\x43\x82\x18\xb9\xeb\xe6\xa9\x34\xa4\x43\xb8\x66w&\xfd\xc4" +"\xac*\x1d>%\xc%|o\xb7\xf5%\xb5w\x85\"\x62\xbe\x1c\x11\xe6\\\x99\xb0\x65\xfaI\xdf" +"\x16X\xe2$ley\xc2\xc3\xd4@\x86xo]\xf5P\xf7\\\x97\xdc\xd4\"\x99\xd3\xffO\xe3i\xda" +"\xfc\x86\xc6\xff\xb8\xb4\xbb\xe\xd2U\xf0\x89\x90\x42\xb4\xa5\xa2\xe\x34H\x7\x6\xfb" +"W\xc6\xaa\x7\x8\x45\xaa\xb5\x1cR\xa4\xaa\xbe\x1aO\xcc\xd2\x84xp\x9bo\xb7\x82z\xa0" +"h\xba \x81@\x9a\x39m\xab\xd3\xb0\xb7\xfe\xf9\xad\xeb\xbf!\xbe\x84\\~\xa7\xea\xa6" +"\xa0\x8a\x44J\x13<\xb4\xe^\xca\x88\xbf\\\xef\xf2\xdf\x18\x1euI\x95\x14\xcb\x88\x37" +"r\xe4jj\x88\xfe\xdf\x8f\x42\xa8\xdf\x5?7\x9e\x89\xda\x98]\x1b\xaf\x95]\x9c!\x80\xc6" +"\x1f\xe8\xd3\x89\xd2\xf7\x83\xc6\xecGB\xb9~\xcf\x86\xdb\xd8\xdf\x35\xa1\xb8\xb3+" +"\xc3\xba\xbdXo\x13\xf\xc7\x8d\n\x45\x8a\x92\x36\xdd\x38\xcf\xef\x1b_\xd9\x9d\x36" +"\xc6Lg\xb2&!L\xd2N#m!\x85\xa8=\xc7\xc1}\xe1\xfa{^\xf4\xa8)s\x9a\xa9\x9e,M\xf2/z\x97" +"%\xc9\x8f\xf1\xefIz\xd9\xdfN#\xa0\x7fl\xe\x13!|\xe2\xbb\xce\xa3\xab\xeew\x19\xd1" +"@7\xb7\xae\xffZ\x8c\xd2\xa1O\x96'\xc%u\x1\r\xdf\xf8TO\xe3\xfd\xb7\xb2\x91\x94\x38" +"\xfa.\x82\xc6\x10 \xceOS\xb6\xbc\x8\x9f\x35\xe\x33\xdc\xf7W\xce\x8a\xe3\xf\xc8~/" +"R\x19\x83\xeeHJ\xae\x9b\x17\x80\xe3\x3\xc2\x81v\xc\xb7\x1\x1a\xe1\x45\x42\x97t4\xe7" +"\xd4\xeb\xf8G\xe8\x9b\x9d\x7f\xe4\x80\xa4NV\x3q\xec\xd8\"\x80\xf5\xabG0\xe0g\xef" +"\x1d\xd2\x45\x8eg\xe5\xd5\xa6\x88\xcbY7nF\xdb\xea\x7fm\x1\xa4\xf7\x9a\x1b\xbd\x8f" +"t\x16\x64y\xce\x63\xd7\x9e\xa0!\xae?\x97\x87\x34\xd3+J\xf0\x80<\x19=XK@\x12z5\x17" +"\xff\x31\xa1\x8a\x13\xbe\x94\xb6\x39\xb6\x0\xb0\x15\x97]\xbf%\xfa\x63\x37\x7w\xe1" +"\xd4\xaa\xef\x38\x1d\xa4}/\xe4S\xb2=\xfb\xec\xc\x42z'FQ\x97,\xd3-j\xech\x8f\x2#4" +"\xb0\xcc\x1b\x1e \xfeZ\xce/\xf5\xb8\x42\x8a\x80\x32\x30tT[\xbb\x66\xe9\xa0j\xa0z" +"c_\xc7\x7f\x98\xc1\xb3\xa3o\xdf\xb6\xeb\xb5\x98\xc1\"\xd8\x17\xe\xa4\x66JS\x13Il" +"pZ\xd1\xff\x7f\x8c\xee\x9eL\xd2\x42\xac\x1dn_\xea\xf0Ve`_\xa6\xf4\xf6i\x19\xc7\xf1" +"{\xc4\xce\xdbslF\xe8\xe8\x14\xb1)\xc3X\x4\xe\xa8\xb2\xbc\xd8|S}zr\xea\\\xcd\x32/" +"q36\n\xee\x10\x8c\xb7\x88\xae\xf1\x90w\xcb\xfe\xde\x4$\xd7I\n\x9b\x9c\x9Z\xa5 \x8b" +".\xb1{\xe0\xb)2\xd1[\xe5{\xf\xc0\x33+\x9c\x7\x18\xfd\xde\xe1\xec\x98\xfdY-\x9f\xf4" +"R\x6\xa8\xc5\xfe\x38\x93\xd9!\xe3\x65x`a\xab>?>\xec\xabX\xee\xa5\xda\xff\x2u\x8f" +"\xb7\xac\xbd\x8f\xbe\xdb^~\xd2Z\x19\xcd.\x80\x30\xb8\xb6\x6p\xf9\x19\xb0\xef\r\xf" +"w\xd4&\xfc\"\x89\x44\x46Z\x8c\xc1G\xe5\xfeh@\x7\xc5\x96\x1f#P\xab\x38\xe0\x31\xb3" +"w\x88\xad\xd0u\xc9\x9aM\x85\x17\x39K_\x0}\x93\xbf}On&\xd0\xca\x16\x81\x8e\x1b\xd0" +"\x15\xc9Q\xce\xea\x44J\xf8\x36\xf3\xe5NZq}\x15\x42\x62\xe2\xe9L\x13\xac$fp\xc6\xe6" +"\xa2\xcc\xf5WJ\xbbu*p\xf5L6\xdc\x93\x8a\x1c\xd1\x93\xad\x89\x8b\xdb\xbf\xfb\x6\x86" +"\x7z\rv\xb9n\xe0*\xa4^\xd3\xe3\xf1\xd7\xd8re\x15\xd5\xdc\xc2\x96\xed\x1e\xaa\x36" +"\xb4\x36\xb9@M\xf2\xee\x1e\xdf\xcb\x7\x62\xe3\xc9\xc3\xb3\xa9q;H_'nj\xdc(?\xb3\x1a" +"\x8f\xc\x8e\x30\xb1,\x9f\xb0\x1b\xc2\x84\x8f+\x87\xe7j\x93J\xd5X?\xcc\xb0\xbe w\xbf" +"h\x5\xe7\xbf\xa2\xb3\"\x63u\xc2\xc1\xc5~X\xf8<\x85\xcc\x39@h\xa7y\x86\x12\xdcG\xfc" +"B\xf\x10\xa6\x13\x1f\xb\xb5)\xc8\xc7\xf1\xcerZ\x9c-c\x10\x81\x16\xb3\xf4\x86\x6k" +"\xf4\x41\xbe\x65X\r\xfsW\xb3\x92\x3\x41J\xd2\xe1\xed\xc5\xde?\x8b\xc8\x9e\x35\xd4" +"\xb\xbf\x43\x43\xdd\x7fyOq\xc2;\xb1\xf5\x44\xdc=\xf7\x1b'\x1e\xa1\xa0I6H\x1c\x6\xdb" +"\xa5\x8e\xc\x14\xa3\xb4\xc7\x65\x31\x1eo\x9aR]\xdap\xfc\xd3jP\xe\x95\x92\xa2\xd0" +"\x9arOX\xb1\xbd\xcb\x9fk\xee\"\x2\xc5\xc3K\xd4\xda\xb4\xfd\xa3q\xb2\x63\xc6\x38\xb" +"\xaa\x85\x88p%\xb1\xb3\xf8.\xe0,\xb9\xdf\n\x35\x8f\x46\x91\x31\xccj|}\x10\x90\x18" +"I\x98\\\xc0R4\xcd\x31=\xa5p\x93\xc2\xb0S9\xeaJ3\xef\xcb\xae|o\xean\x83\xb6u\xe6(" +"\xaa\xe9\xee\x4\xd9:\xa0P\x2\xdb\xdf\xac>\xc4\x39\x13GA\xd3\xb5\x83.\xc5\x9b.\xd5" +"L\xdc\x1\n\xb3\xf2\xf7u\xcf\xfa\x46\xa7\xf1\xad\x14\x8b\x85\x12,\xed\x80\xc7\x1b" +"\xda\x36\x9\xd6\x46\xdeO\xcf\xa6\xee\xa5\x99\x9a-rS\xa2\xa2\x93[\x81\x90\xea\x39" +"\xfd\x8b\x8b#3{;\xa3\xd2\xb7\xb2\x8c\x97K\xdc\xba\xe3\xce#t!C\xbftNm;\xfa\xck\r\xe3" +"\xa3)\xaeI\x97,\xdc*ZT\xcf\xed\xd4\xc3v\":\xe6\xfb\x11Vm4k\xe7\x1cM\x94.G\xcc\x5" +"\x87\xbb\x1d\xfd\xf5\xd4\xdb\xd2\xc0\xdb\x44\xb1@J\xa3\x65-,I\xcb\x0w\x9d\xfc\xb3" +"\xb9r:l\xd4`H\xb1\xc5\xd6\xfd\x1c\x62\x64\xd9\xc1\xce\x8eU\xb7\xf5\x31L*\xd4vMi\r" +"log\xc8\xc\x87\xe3\xba\x18\x31\x87nF\x2\xc2\xec\xcd\xfa?\xc1\xf5\xe3\x86\x30\x31" +"l\xf4\xb1\xa7\x8c\x8c\x19\x1*|B\xf9Us`tu\x8aP\x94\x9f\x7f\xe5o\xf2\xcu\x0\x7f\x0" +"\xef\x89\x16y\x8$kcjI\x9d\x10g\xbeV\r\xd5\x38\x98,\xb\x43-\xce%\x15\r\x9c\xf5\x1b" +">+7nB\x8b\xec\x13U\xd4-4\x18\xfd\xd8\xcd\xcf\x15\x32\x13\xfb\xa7|\x2\x11\xae\xaf" +";\xb5\xbf\x9d\x8a\xec\xaa+\xe9\xfc\"\xbfY\xab\x4\xb9\xb8rup\x3:1\xc7\x96\xf8\x18" +"%\x91\xa9r\xeb\xf0\x1b\xfX\xb2|\xda$\xdcM>\xbe\x96\x14\xb5\x39o?\xabg`\xb7\xa4z\xbb" +"(\xc6\x39\xdcvu\xe2\x7f\x89\x84\xbb\x7\xad\x37\xb\xe6\x31\xee\xe6\xc6\xbf\xf9\x3" +"\xf2vF\xa5\xb1+,\x9f\x8f\xc2\x44n\xd6\xd2\x9a\xfb\xe3MR\xa0\xb5\xaa\xc\xd2\\\x15" +"\xe6T\x16\x3\x1b\xb9\x1f,\xf9\xa8\x42\xdc\xb6\xdcwVB=\xfd\x18}bN\xe3\xfc\xb3\xec" +"\xa3\xbd\x9e\x64\xcc\xd5):N\xd6*\xb2^\xf0\xd3\xf4\x65=\x94\xddJ\x12\x91>\xcfX\x19" +"\xb1\x99-\"\x81\xc\xf6H\x94\x9d&\xbfKu.\x1d\x8fp\xab\x42@\xcd\xc4\xa3\x7\x90\xa9" +"\x8f\xa8\xa7\xb8\xe\x8e\xba\xbe\x34?\xda\xeb\xa4\x1a\x10\xd0UL%\x1\x82\xd0K\xea\xcd" +"\xcc\xdc\xfbow\x9b\x88\x92o\xedq\x16\xee\xbc\x9f\x9e\xei\x10\xd3\xb3\xa4\x80xZ!\x17" +"1K\xf0k\xd2\"V\xba\xaa\xb6j,\xe4\xbb\nMX[-R\xf8\xac\x37\x44]x\xfb\xa1\x86\xf\xe5" +"\x94\xbb\xda\x12\x7\xc7,\xf7\xa3}\x14\xa5\xea\x9b\x95\x3'\x97q\xaf\x9ct\xbdsu\xe5" +"Qr\xad\xf6\xd8\xab\xccR_\x1b\xb1\x99\xf8%Ya\xd0u\x2\xc\n\xc6\xab\xf4\xbe\n\xe6^!" +"#\xfa\xf1\xc9\xbe\xb3\x38\x32\xe0\x8d\xf2\x8b\xe%\xe9\xdcm\xc8\xb8ie\x99\x8c%\x9c" +">\x1d\xd0Y\x96\xc0\x30\xbd 6\x80X\x8d\xddh\r\xe3\xfc}\xcdk\xdd\x32\x9e\xc6yY~D\x8" +"\xd2H\xd6\x10w\x8b\xc2\x86\x8e\x9a\xa3\xff\xb1\xb4\xb\x8d\x38\x91\xcd\x3\xe7&\xb1" +"\xea\x1d~nY\x15}\xf0\xbd\xd8Zg\xb3\\\\\xe6q\xacY]\x95\xfbZ\x99\x6\xd7>$\xe5\xe0L" +"n\xd0\x89tqcX\\z\x89Yj7\xef\xaa\xcaj~\xef\xc7\x94\xfc\x65\x80\xb\xe7\x9f^\x8$\xaf" +"\xb0\xc4\x30\x30\xb3\xbd\xb3\x42\xa9\xb4\xf0Tcf\xd9?+6\x99\x8d\xed\xb8Z\x8c\xe1\x86" +"\xa7\x8b\xb3/\xb4\x84\xca\xbe\x86t\xda\xfa\x5\xda\xbd\xa1\x80\xfb\xc3\x8e\xaa\x84" +"\xd4\xe3{M\x17\xe7qz)#:)n\x95\xef&\xb0K\xcd\xe0\xc0\x19o\x96\xbd\xde\xaeo\xeb\xc6" +"\xe\x9e\xf0o\xa1/\xaa\x16\xda\xe0\x17\x8d\x4R|Yl5\xab\x31\x12\\\xf1{#\xae\xb6\x8f" +"\x84\r\xa1\x46R\x5\xe4\x82\xfa\xa1s\x88\xf6=\x18\xc8\xf6V\xba\x94\xa1\xa8\xe8\xc7" +"K\xa8\xb0\xbb\xc8\xba\x45M;B\xe8[\xbc\xbf\x8d\"\xfb\x0\x8b\xe8n\x9d\xd2,\x95\xd1" +"<\xf0\xa4q\xc2\x7\xb2%\xa4\"\x62\x65\xd6\x8c\x8a\xaa\x17\x46\xe4\xee\xea\x66\x7f" +"_j\xeah\xfd\xcc\x91\xde\x8a\xbd\x88\x33\x86\xd2\xa1\xa8\xde{yS]\xb2\xaf\xf8<\x13" +"\xaf@\xe4o\xae\x1f\x92)\xe9\xa0{PK:\xd1\xa3\xcf\xd9$\xc0\xb7\xb0\xf8\xcY\xd9\xcf" +"\xcd\x0\x19\xb1\xb\xf8\x0\x4\x1\x15[\xb6!E\xd5\x61\x18\xb3\xde(\xfaZ\x98\n\x9cZ\xa1" +"\xdf\xdb|\x99!\xd7!E\xfd\x64\xfa\x62<\xf7\xf8!\"\x9e/VB\xa6n\xf5!\xf3\xd7>\x11\x17" +"a\xee\xe0\x46\x38\xeb\xd9\x33\xf3\xb1\xaf\xcf\x9a\x14\xcd\xf8\xe3\x9a\x95l\x1b\xad" +"S<\xc9\xbd\xb0\xc1]\xfe\xaa\xe1@2\x83\x90y\xabU*\xd6GhX&\xac\x14Q\x95Wl\x18O\xcd" +"\xae\x44\xfcRMt\xd3K[C\xbb\x98\x85\xb8\xe3\xf0\xed\x13\np\x87`\xe9&P\xf8hh!@Dy\xa8" +"\x8a\xb1l\xc0\xfa.\xd5\xbb,\xd3\xbc\xc0\xb3\xbb\xc3vD\xec\x84k_\xa0\x8dS:K:s\r\xd4" +"\xb6\xe9\x41qRk)\xb7\xf8\x9d\x5\x1\xac\xcdo\xf7\n E\x18w\xfd\\\xf\n\xd6\x91Q\xbe" +"\r\x12u\x2\xdb\x63\x84\x1b)\xe9l\xb3\xcd\xf0\xb\xa2\xe4\xd4\x1d|vW~\xe1\xea~\x99\x1c\x88\xa1\x91\xca\x1a\x98z,\xed;\xe8\xc7\xb" +"\xc5\xf9\xb2\x63\xb7Vr\x1e\x1e>*\x85\xc\x46\x82\xa1j{F\x10x\n+\xde\xd9\xda'<\xb7" +"D<\xb5\x9amz\x1Y\xc2T\x1,Kb1\xff\xf2\x38\xceN\x11\xef\xf9!A6n\x8c%\xcf\xa8\xc8\xaf" +"\xc\x80\xa8\x9\xad\xb5\x62\x33\xed ]\xe8\xb0\xc#:\x1d\x66l\x8 BD\xc0\xf0\xd2%\xe3" +"\x8c\x85\x34O\x92G\xe1\xacY\xd4\x65\xb7\x41\x9\xba\x18\xfd\x4I\x12\x31Z:\xb5\x8c" +"\x80|\"\xa3\xe2\xf0}\xddLx\xc5\x1fNh\xf1\xa8Z\x1a\xb4}\x18\n\xe3s\x94\x31n\xe5\x13" +"\xe3/\x8b:\x94\x16\xbf\x96H\xd5Ug\x91\xe5\xd4\xfd\xe3\xd1\xf9\xf1\xe4\xa0\x13\\\x64" +"\x9d\xe3\xe7\x30\x89\x33\xdb\xba\xb8@\xf5\xe7\xac\xa8/\x96&\x19h\x8d\x9d\x92\xfc" +"\x10\xf0\x1a\xb5\xe4\x61h\x9b\x16=\xe8S\x8i\xa7\x33\xed\xed\x11<\x1bK\xd5\x6\x63" +"\xf3N/\x12\xed\x35y|\xc6\x45\x7f\x90\x45o\xd5\xd2Of\xcb\xc0\xd7:\\\x1\xa2\x18\x92" +"Q\x8f\xff\x9\xa3\x1c]\ni(:g\x1f\xd0\xed\n\xa9\xbd\x8f[\x90\x0\xe0\xde]F\xe7Q\x3R" +"\xc4Zf;A\x8d__\xf9\xef\x32\x8\x84\x17\xe0\\\x66\x86(m\xd1\x41\x31n\xbe\xf4\x8b\xbb" +"\xb1\x1a\x7f\xd9{\xfe\xaa\xe4(&>\xc2\xc8R\xf2H\x93\\\x17Ii\xb0\x43g\x13v\xa3\xe9" +"\xfe\xf9\xd4w\xccxS=ln\xedRIEN]p\xce;(\x84\xdd\xd4\xf\x9epy\xac\x84\nY\xba\xd2w\n" +"\x4\xa7\x46%\xe3\xfc_`\x9e\x90?\xeb\xa6\x16UM\xa4$;\xb3\x89\x35\x1bU\x92:q2\xb0\x46" +"_\xe4\xbd\xf2\x93G\xb0\x91\xe3\xddy\xeI\xf9\xab\"\xef\xc4\x17\x45\x82\x99Hy\xf2\xd6" +"\xcb\\\xf\xcb|\x7]J\xd3\\\xa1\\P\xcd\x5\xb5\x12P(\xfb\x1\xb1\n\x94nG\x90~\xe7\xdf" +"\xee\x98\x16\xa4\xba\xac\xf5\x8cl&u\x86Y)'\xbb\x42\xf7\x98!\\\x7\xcb\xb8pY\x0\xd0" +"\nl\xb7q\xe0\xb5\x3\x94\x30\x7fZ\xfc\xeik\xae|\xeb'X%\xcfK\xd2r\xcd\xc8>L\x92\xc1" +"\xa7K\xa4\xe4\x9f\x36\xb6\x65\xf2%X\xe5\xb\xf2P\x8dG\xd0\n=\xb1v\xd0t\xa9z\xc3\x84" +"\xbf\x91/\x15\xa1\x1dy\xa1\xd8\x34v_K\xa6x\xc0\n\xcd\x9b\xa9\xf2\xfe\xd3\xba\n\x82" +"Jv\xb9\x15\x94\xfcWQvg\xa2\x8a\xb6\xec\xb3p\xa9\xc9\x9ey\xa6\xc1\xe2j\xc0Q/\xa4U" +"\x11\xa1\x88\xde\xa7\x62\xac\xdb;L\x1d\x0#\x85\x45\xcd\x8f\x66\x84TD\xb9\x38\x9b" +"3\x86\xcd\x1aJ\x99(\xc1\x99\xbc\x90\x38\x95\xb4\xfzGp\x11{\xa8\x89\x94\xd3\xb0\xbd" +"\xa8)\x18\xacLezEbk\xcf\xb3\xc2-\xa3\x85]7t\xf7PQ\xb3\xd7\x43\xaf\xef\xd9\xd7Y\x14" +"\xc\x95\x9\xd7\xca\xb6\x84\x97\xa0\x9f*\xc7\x85o\xfa\xb\xef\xd1>t\xbc\xc5\xe3\xdd" +"\x8e\xd7\xf0\xb5\xf3\x1a\xd4Ph(K\xe0\x89\x8f\x44\x65\xdc\x13\xbf\x17\xe4\xadi\xe2" +"\xb8\xe4\x90\xec&p\xe1\x84\xab\x81\xb1\xe9\x66\x63\xce\xdf\x95\x33%|\xbe\xcb)\xeb" +"\xf2p\x89\xf6G\x8f\x17\xd1*\xb9>R\x1f\x8a\x31\xc3\xf6\x31\xd1\x8d\xd3Pj\x0\x1\x9e" +"\x86\x61\x12\xa6#\x9f\xe5\xbb\xda\xf1^\x88\xc1\xfe\xc8w\xa8\xbd\x8d\x1d\x2\x3\x8f" +"(\x15\x9a{\x18\xfc\x4\xd9\x15\x5;\x84\xa9\xd1\xa8V\x8c\x44\xac\x1b%\xac\xe3\xdb\xe9" +"\x13\x41\xb\xc3@\xf1\x32\x0\xe0X\x92\xbd#\xef\xd7\x88\x8b\xa0\xf8\xa1\x9fq\xb0%\xcb" +"\xa0_\x1cR\xd8Nz\xf9<\xffz\xee\xe6i,\x8\xae\xc4J:\xe4\x46\xe2pH\xb4\xdf\xf1g\xa4" +"\xd1'\x4\x93\xa2\x8c\x84\xe7/\x8c\x91[\xd9\\\xb6}^\x7\xac\x85^\xf0gP\"PqvN\x1f\x85" +"\xa4jb\xb0w\x8f\xa0\xd1n\xdf;\xb7\x14\xc5\xa0\xe2Y\xae\xc7\x1cm\x9b\xf8\x8\x35k\xce" +"r\x19\xac\xe6\xbc\x87Pe\x89\x3\xd5\x8b\xa7}x|A0\xe1.\xfe\xddN\xad\xc9\xdc\xf6\x7" +"X\xcaOm\x18\x4\xd3n>\x8d\xcc\xe4QR%5\xbe\n\x13\x62\x31\xb2\x8b`\xcar\x85\xd9W<\xf1" +"%\x99\x1a\x7\xe1\xb9\xb7G\xb0\xc2\x7f\x81m\xfd\xd3\x91\xc4\x46\x10\xb5\x8eW[A^r." +"K)\x83\xd0[\x19R\xe8x\xa4\xac\x16\x66\xc9\xed\x61=\xe4o\xcf\x14\x8b\x14\xde\xc3\x80" +"\xb1\x1f\x80\x61\xf3\xde\x38\xb9 \x15\x87\x8aPL\xda\x12\x38g\x9d\xb3\x19\x11\xfe" +"\x82\xa0\xb8\xd4\x8b\x8c\x1brX\xaf\xdd\x18&\x19\x66\xae\x42\xb9\x30y\xe9\xfb\xa6" +"\x83\xa9W\x18\x8f\x9j\x9e!\x9b\x7f\xed\xe7\xbf\xd5_L\xe5\xae\xe9G\xe8\xfe\xe2" +"\x13\xf0\x34\xad\xb2\x19[\x84\xcd\xfa\x8\x90\x63\xea\xef^H\x95\x83\xc4.\x94u\xcc" +"]\xfa\xed;\x90\xaa\xc4\xf8\x9\xcf\x9f\xe5*h\xa5/W\xc3)\xb7\xd5\xb1\x91\xbbMu\x3\x88" +"9\x80\x11\xea\xf8\x11\x16\xcf\x82\x10*\xf3 \xc9*\x8f\x45#\xf8\x8\xd2\x8\xce\xfe\x1c" +"\xd7\xc4\xc1\xe3j\xf0\x30(\xdc{\xcf\x61)\xe8.\xbe\x32\x8c\x62\xe8\xb8Qw[\xb4\xdb" +"\xb9\x93\x14\xbcK\xcKJ\x6h\xd6\xe8\x91\xf4\xb5\xca\xfe\xe3\xcc\xa7\x9\xb5\xe\xfb" +"\xdc\x63\xa6\xe4\xf0\xb6\x45\xc2\x41)V~J\xa9v\xfe\xdf(Z\xbe\xc1\xb2\x1a\x94\xe1\xab" +"\xe1@\xf5O\x16\x5\xa0\\=C*1o\xe9/t.\x99\r\x16\x39\x62\x88\xa8\x12\xa9\x95\x11\x14" +"\xd8\xcbh\x8e\xe9K|Iw\xe3\x98\xe2O\r\xa3gF\x10\xdek\x83J\xdf;\xa0\xd3$\xa3\x95\x85" +"\x7f\x1fka2Q\xdar\xe5W\xe0\xb5\x1Vk@\xa6\xba/\xc3>2}\xe7\xeen\xc6\x30\x63p\xfe\x89" +"\xd1\x6\x8bn!\xd3\xfd\x16\xc6\x43\xe7^\x8d\xae\xf9\xe2\x1dLM\x1a\xd5\xeb\xc2\xbY" +"\xa4\xec\x8dHq\xaa\xf6\x1a\xfb\xe6\x12I\xb9\xa7\xc9\x8c\xb1\x17\x13\xf7W\xbd|\xc4" +"\x95\xe9\x90\xc8\xf4\xc0/\x16vC\"o\xc7\xbcQ\x9bj\xd1<\x10\x8d\xf\xcf`\x11Rb\x11(" +"qI\x17\x9c\xb3\xa3\x65\xbe\xab\xd9V\x98\x8bt'\xa6\xc9\x9e\x31\x38\xcf\xca\x94\xb" +"\xd9\xa1\x0\xcc\x42)\xa4\xe3\x93\x94\xf1\x31p\xe0 \xf0 \x1d>\x12\xfd\x87\x33\xdb" +" \xd6\x42\x93\x97\x16/\xa8\xc\xf6Q\x8d\xf7\x32\x93\xfc\xf7\x13\xc0q\x8fL\xee\x89" +"\x8e\x44X\xd2\xf\xca\xbd}\xf1\xd5\x15\x16\r\xea\x8e\xe6W\xba#\xb9\xcf\xa0Kw\xe9s" +"^\xa8\xa2\x86\x30\xf4\xb5\x9cl\xc\x88\x4T\xd8\x31\x63'm\x15\xa4LT\x95N\r\xb0\x1a" +"\xb9H\xe5\xd4=\xc3\xd9\xc3Q\x88\xb5\x98_\x90\xd3\x83n\x98\x39\x1c\xb1X\xe0w\xdf\xa9" +"j\xc6\x32|\xff\x10\x9\x8b\xb\xd0%\x1c?\x8dkR\xa3\r\xf2\x5~\xe7\xe7\xefGm\xf0\x8d" +"\xa9Omr\x5\xdb\x46\x1cY\xa5\x37\x46)]\x97$S\xd3RY\xaeX\xe9\xc8J\xba\\\xe7\x8e\xdc" +"\x9d\xc3\xa3\xbb\xbf\x9a\x84v\xfe\xd3\xdc\x7f\xb0\xca\xee\xa4\x1eO\x91\x33\xdf\xf" +"o\xdf\xca\x3\xfc\n\x9)\xb8\xc9\xaa\xe4q0n\x8f]jJ\xcf\xfa\xf9\xca\xd0T\xba\x13\x1f" +"\x95H\r\x9c\x39\xacX}w*B\xa5\xebh\x4\xe1\x94\x90\x34\xbb'\x97\xd2m\xaf\xd1xi\xbf" +"\xcbn\xf7\xeb\xc8\x65\x34\xcf\xc4r\x85\n\x38~c\n\xdf\x1f\x44\xef\x30\x30\x41J\x4" +"=\x1aG\xb\x42\x43\xdf\x8fO!g\xad\x1d\x41\xfc\x46O\xf6\xa2\xdd\xe9\x46\xa4\\@\xb2" +"-\xfb\xd0\xd6\x95\xe4\xa4\xe2<3\xdf\x35\xa6\x31\x31\xd5,\xeaI\xc3\x8bl*\xf7\xff\x86" +"a\x18\x8f\xad\x7\xc1\xb9\xb6\n\x8a\xbd\x8cXeJl\x7f\x15i\x9WD\xb6\xb5\xea\xad\xeb" +"\xb9\xbb\x84\xf3\xea\x89i\x16\x99\x13-U\xb\x3_)\r\x98\xd0\x91-s;IS\xb8L\x8c\xc\xe3" +"j\x84\xa3\x19\xd7>\xd6\x9a\xdaG\x10\xe2\xa1\xe\n\xd5\x92\x17\xc7\x16\x8e\xd9\xdb" +"\xb9\x9eR\xdb\xaf\x90NZ\xb2\x80\x12+}\x92\x94\x97\n\xd8\xf0\xc5\x2T\xb\x15\xdb:|" +"\x92\xbe\x0L\xd2\xac\x7f\xb6q\xa7`\x2\xca\xd4r\xe7^\xe1\x88\xcf\xbdjR\x96\xb2\xb5" +"\xba\xfe\xa2K\xe2=\xf3,76\x99\xf3\x96@\xce\xdd\x84o\r<\x17\x9c\xb0.\x1c\xdb\xee\x87" +"\xfc\n\x64\x84\x5\x10\xd3S?{s\xc9\\l\xd2\\\xf4mS\xdc\x8fu\x16n*\x8eT\xbb\xd8*\xf5" +"2\xc5\x19\xc3\xe5=\xd5\xc6TN\x97\x37\x30\x1!\xfe\xc\x63\xd4\x37<\xc9\x44\xfd\xba" +"\x94\x37\x36\xa1\x4\xc6W\xc0\xbf\xe8L\x6\x98RA\xe1\x1c\xbe\xac\xacp\xc1\x37\x8a\xb3" +"\xb\xa5\xd3\xa5\xc9?\x4\xb0\x62oZ\xe\x5^\xfc\x1e\xd8r\x9\x0\xe6\xd4\xa4\x91L}\x6" +"0\xe9\xed\xek\xf9\x8ar\xeb\x93\x81\xa3\xd9>r\x0t/\xb6[\xae(\x85\"\x12r\xbe\xec\xbe" +"{$w_D\xbd\xc9\xa3p\x8e\x84\xbbi\x17\x32\xaf\x1f\x39\xf7$=`\xc\xf7\xee\x9b%\xc5\xa2" +"\xa5+\xf\x1a\xbe\xej\x98\x45\x90\xc7\xe4\x30\xcc\xfc\x85$\xfa\x7f\x1e \xc9.\xe1\r" +"wc\xd0\x96\xb5\xb7\x92\xd4\x8l\x8d\xd2\xba\xfe\xa1Z\xd1\x9a\xb7T\xc0\x8a/\x81\x19" +"\xcd\x7\x33\xc3=G\xea\x1d\x84yO\xc4z/\x83\x43\x9a\xc4\xa6^\xaeu%\xde\x87\x45\xb2" +"\x97\x1b\xee\x81\x16\x86\x7>U\xb1\x87\x8\x94^\x4\x45\xd6\x95\xde\xda\xabV\xf5\xaa" +"\x1f\xa2\x9b\x46W_\x99[\xf6\x4\xfc\x45\xae]\xc0\x43\x11\x95,\xcc\xde<\x99\xe2\xfa" +"hpO\xc4s\x8\xad\xd2\xfc?\x83\xcb\x63\xb2\xb8s\xc2\x13\xeb.\xf#T\x8d\xe5+9\x8\xcd" +"1G2\x13\xc9\xeb\x64U\xe\xe1\x90\x8a\xb3\xc2\xf1\x34\x1M\xf3<4Sl\x17\xd8\x12\x90j" +"\xf4\x9cuP\x90NY\x90.\xdbQS\xd3\xe8nd\x9e\x37)@\xe9\"=2\x95\xcc\xde\x8\x7\xc9YV[" +"T&\xca\x1b\xa9Y\xdd:d\xb6\x35z\x7\x89\xdeTs\xba\x11u\xd6zS\xd9\xdb\x96\x8d\x96\x82" +"\xfe\xbdL*\x1\xcf(\xe6\xbd~Z\x14\x11\xf4\x88\xf9\xbcW\x1d\xe0!\x0=\x98\x8d\xe8\x31" +"\xa3\xd6\xf1\xe5\x1f\xae\xcc\x90\x2\x9bR{\xef\xd5\x9d\xa8\x43\xe5\x8b\xa9\xf4\xd0" +"\xacG\xd7\x9e\x91\xc5l\xc4\x8cZ\xd0\x7Y\x11\xdf,\x7ft\xc3\x82o\xa7\xdc\xabof\xf4" +"\x92:\x19\xe4\x38\x9d\xc4\xe8\xf0\xa2\x0H$H*JL\xb9o\xa4\x31\xd2Q\xa5\x1f\x3RX\xb9" +"\r\x8c\xe3\x65\x19\x14\xb3\xc9\xd9U\xb7\x7f\x36\xb2\xce\x3\xf8\xcb\xdd\x7\x93\xf1" +"\xf2\xebq\x16\xf2@5\xf3\x33\xf3\xd1\xa6\x9z\x1a\xebq\x5\x46\xa0\x9c\x9b\xab\xee(" +"\x81\xeb\x44\xa0\x9c\xd2\xd1\x92Q\xca\x80\x44\xb7\x8c\xf3\x1cm\x8a\xce\x83\xc5X\x0" +"\xbf\\;\x10\x41\xa6T\xbev\xae' \xb2)\x0\x31^\n\xd2\xe9\x33\xbe\x99\x45\xe4~l\xa6" +"\xb7Gz\x94\xcc\x95\x82'N\\\x89J\xec\xd1\xb5\x44\x85kh\xc7,WNP`\x2Q\x95\x45\x32\xbd" +"\x9e\xc0\n\xae\x14k\xb1\x4\x8d\xfc\n\x6\xff\xe8\xa2\xf2\xc0\xa2\x80ziT\xb4U\xbe\x7" +"\x8c(\x9bZ\xf2\x1c\xdf-\xee\x3h\xb6\xb8\x85\x90\xed\xf8\x13W\xc3\xccN\xe3\x16R<\x1c" +"\xfn\xdc\xe3\x39:Z\xca\xda\xfcV\xdc\x65\x65\xefUK\x8c\xcb\xde\xf6\x95\x43\x85\x16" +"[\x86G\xaf\x8c|\xf2g\x84]\xd4.*\x8d\xf4\x93\xf5oSE\x0\xc7\xd8!I\xca!\xc6\xa2\x94" +"N\xc9\x1c\x17\x30\xc6=C)\xe5\xf\xbe\x42P\x81\x16\xde\xb0!u:\xbb\x64\xabu,E\xe0\n" +"\xd6\x97\xd9\x9c\r\xdf\xf0\x9e\xaf\xaa\x8d\xb9\x18\x9fZ\xe7\xfdL\xfcX\xf9\x9\x8d" +"\xfg\xec\xc4\x89qJ}v\x84\xe8[\x2\xc0\xa5\xb8\xd5\x98\xef\x32\xa7\x91\x37\xe1\x1a" +"\x12\xc8\xc1L\xfc\xc0\xbd\xa0\xef\xfa/,#\x98\xb0\xcd\xd5\xea\xfc\x9\x66\xb1\xccl" +"\xb0\xaaQ\xf2%\xfd%\xc4\x99I\xfe\x9fx\xb1\x89\xfei\x8eO\xd3\x7fu[\x1e\x9a\xd1-\x80" +"~\x16\xcb\xfdg\x1e\x37IM\xdc@v0\xdbw\xf0qV\x2;[G\xf0\xa4y\x9b\x96I\x2\x8cV\x2\x16" +"u\nj|\x89\xc7\xc3\xcc\n/\xad \x11\x13\xac\xb1\x8e\xb0\xba\x31\xbc\xe9\xb0\x63\x1a" +"\xbc\x96\xa5\x84\xf4\xd4\xf7\x8c\rp\x82\xf7\x43\xe8\x99\xb1\xc0\x12\xec\xec\x31\xe4" +"\x99\x96>\xbb\xbd\xfb\x97\xd9,\x99\xe5\x63\xc8\xe9]\x8d\x37\x2\xe4\xed\x81i\x89\x19" +"\x1e\xcc\x46\xd1U\xc2\x85\xbd\xbd\xfc{(<)\xb0\xe5\xc8\x0\x34]\xd4\xb\xcc\xc0z\xbd" +"\xff\x17>\x15\x96\x17\x7\x34\xa3\xd9\x1d\x89%\x9\xe0\x8a\x94\x8f\xc1'\xe2\xc5\xde" +"RWx\xb2\xfd\xf\xc0\x84\x16&\xf8\x1e%\xc0\xdets\xfa\x62t'\xef\xej \xe3\x91$\x8c\xd9" +"\xcf\x31\x0 \x9b\xb1s\xd5m\xaf\x8c\x45*8\x8f\x30\xd8\xd9\x61Rv\xe4v \xac\xc1\x94" +"1g@J\xae\xb2\xfeil6H\x9e!\x87\x81\x87\xdf\x1\xb4Z\x88\x8f\x34\x4^a\x11JIF\xe2\x9c" +"\x16\xa2\x3mw\x89\xb8\xe4l$7uO\xb1\x2|\xbd\x10Z\x8a\\\xb1\xb6\xef\xe2\xb6`\xdc\xc9" +"{C\xc7+\x8\xc6\x33\xf9h\xbbT\x99n\xe8\x45+\x8a\xd9;.s\xa8\xed\x46\xe1\xe1s\xe6\xf7" +"\xc4Q\xbb\xcc\xddV\xe8<\xa7\xae\xe8\x34\xd0\xfa\x12\xa4Y\xd4r\xc1ZS\xa1]\xd7S\xf9" +"<%s\x1e\x9d\x65\x38 \xfb>\xea\x99Wz\xaa\x86v\x1c\xb9\xbc\xb4\xb0@\n\xa7\xf8\xff\x43" +"9\xc4\xf0\xbe\x38\x80^/\x1a\x46\x85\x31\x9a\xad\x1a\x88%\x32\xb7\xdf\x96$\x83\xd6" +"\xec\x9aG\xb8\xae\x11\x8\x45\x13\xf4\x98\x16\xca\xafM\xec\xaapF\x0\x31\xe7\xff\x9f" +"\xbb\xc1?\xba<\x12\xb6:\xec\x32\x85\xb7\x46\x7f\xbc\x39\x9c\xe6X \xa7\xbd\x2\x38" +"\xf3\x14\xfd\x15\xb1\xf9\xb0\xd2\x8a^\xf0\x43\xe5\xb2z\xa4\xb3\xe7\x43O\xc4\n\x92" +"<[#\xde\xbe\xe9\x61:\x9\xc4\x8e\xbb\x5\xb8\x10l\x9b_\xce\xffz\xa9\x38q\xfb\x90\x1" +"k\xd7*\xe8\xc5\x9b\xcd_^\x8e\x91/\xaf\x18\x94\x90o\xfc\xbc\xc0\xfe\x34\xa6\x7f+\x9" +"\x5\xc5g@\x85\x81\x5\xd4\x8e\xa5\xf5\xe2\xed\xe2\x9cYj\xcb\x85\xa6\xcZl\x5\x85\x4" +"\x81/\xa9\xf\xb0R\x11\xcbm\xe6\xd9]\x0\x98\xc0\xcb\xcd\x8f\xd3yQ\xde\x11\xa1gP\xdb" +"\x13\x32>\xb4\xb9\x61\xa4\xdb\xf9;\xae\x32\x32G\x1d\x65JN;z\n\x9f\xc8v\x86\xfc\"" +"\xc8\x9b\x6\xf3\xed]\x7f\xae]\x6\x15\xb3\x34\xa7\xfe[\x95\xcb\x3\xc7H\xb2\xf0-\xcb" +"\xdd%<\x94\x42\x43\x11X\x82\x31\x8eKt\xda\\LZ\xc6\x63\xbd\xce\x95\x80?gA\xcfPC+\x1c" +"Ud\x10}\xd0^\xe0\xb6\xb7\xad\x11 \x80\xfc\x65\xc4\x80%=8\xb2\xa5\xcb\x8k\xc8\xfa" +".6.5\x93\xd4\xf0p\xcb\x16\xee\xc\xfd\xe3\xc5\xc\x39\xd5h\x9d,\xf5\xcdVW\x80\x46\x41" +"\xd8R^\xdc\x36\xeb\x9f\xab\x81\x9f\xf5I'\xf\x16\xa7On\xbb\xd8\xa9y\"\xae\xb9\x99" +"\x82\xdf\xf0]2#\"-\x4\xfc\x9a\x9c\x38]\xb2\x46\xf4\x14IS*\x1b\xe9\x4\x1a\x64k\xcd" +"r\xf4\xd3\xa2\xe6\x82\n\x83),}GHA\x10\xcc\x62\xf1N\\\x8\xcd\x42\xaf\x83\xf7\xbc-" +"d\xa0\x95n\xe\xbdp\x15\xbaz\xa3\xbc\xec\xf\xcdX\x85\x30\x8a\xf5\x9\xae\xd4\x2\xf1" +"9lz%\xe4~\xb2Y \xcf\xe8\x8f\x95\xb7\xff\x66\xd6\xd5\n\x9e\xef\xc2\xd6o=\x13\x92\xcc" +"\x12\xcb\xa2\x63x\xf0ZS\xa4\xc4}D\xb8\x0lj\xa3\x19\x31\xbd\x8f\x44,\x13\xa0\xc2\x1e" +"H\xc5\x86\x8a\x1c'Z>\x84\xad_'\xa2\xc9\xff\xe1n\xd8\xea}+7%\xe2\xfc\x31\xb0}\xfb" +"\xe9\xbf\x4\xa0}\xc8\"\x86\x19xPw\xd9\x91\x37\xb4\xf7\xcd\xe5z\xa7I\xc\xc2X\xc2\xb2" +"\xd1\xc4\xc9 \xf3?\xd1U\xa6\xfd\x1b\xc7\x9c&T\x8b\xe6\x9d\x8e/P\xe5/Cv\xf\xd5\"\xfc" +"`Z\xb3V\xa0\xe1\xb8\x8b\xd2\xa6\xda\xd4\xfd\x98\x1eY\x6=\xc7k\xeaV\x15\x92\x66\x4" +"%\xce\x39P\xa1\xa8\xae\"\xa8#\x4\xbc\x1e\xa0T*\x94\x35(w:U\xb4\xdb\xa0\x1a$\xab\x34" +"\xfb\x45\x2\x1d\x97\x99\xbf)ek-p\x89\x82\xc7\xfh\xb5\x94%\x94\xd9\xe7\xd9\xc4\xb8" +"\xfc}\x16\xf3\x1f\xa7\xda\x5 \x9fK2\xc7[.\xf4\xd1\xcbH[\xf8\x33\x39\xb4\xddJ;\x6" +"\xb5\x61x\r\xab\xdb\x95\x90$ M\x1b\x10\xc2\x1a\xf5\xb5<\xcf\x11Wj[\xedIAS\x5\x1e" +"\xc6\xfc\x89k\xe6\x96`\r\xeex\x6\x1f\x66\x1f\xa0\r\x32\x2\xc\xbe\xee\xda\xb1\x8e" +"C-\xc7\x85\xfa\xc8\xb0\x7fG\xd0\xc5\xac\r\x65S\xf5\x62\x8e\xb5`\x90(\x6\xd4\x13+" +"\xban\xc\"\x0\x30`\xea\x45\xd4\x37@&\xd0\x0\x9e#\x1b\xe7\x9e\x94\x82\x99\x7l:\x2" +"\r<\xcf\x8a\x96\xe6\xf5\xb7\x81\x2}uI\xb\x10\xea\x64\x6v\x92\xcc\x17\x42)_\xf0\x1e" +"\x17;\xd3\xd9/\xed\xb3\xa5%n\x81\x34\x1b`\x89\x19\xe4\xfb\x90\x35\x39\x3r\xd5`\x84" +"\x9b\xf0\x13M\xb5}C\xe2\x45\xf9rj\x8d;\xf1n\xdc\x36\xc9\x94Wr\x9c\xc2\x1e\xb0\xd6" +"6\xb3\x93\x89\rQ\xc6\x96\xb6#L\x4\xd4\xa7\x9\xbd\xd8H\x17L&\xde:\x10)\n\xe7\xe3\xe0" +"\xe0\n\xd6\x7f,G\xc0\x97\x46]O\x9f\xb7*\xe2\xcdx\x17\x81\xd8v\xccO\xad\x8fM\xd3$" +"\x87H\x1c\x12X\xb2r\xb9\x45v!h\rg\xa0\xdf\xdep[\x92\xdeL\x90'\xa2\x15\x9c\xf3\x95" +"\xd1Q\x8c\x1f\xb9p\xfaVl>\xac\xcb\xe5\xbe\xbb\xc6~\xea&\xb0\x1c\x8c>v<\xa3@ TN\xb3" +"\xef\xb6\x15\xe1\x84(}\x0[\xf5\x13\xd8?PY\xb4Q\x18IP\xbc\x33r\\\xd3\x83\x92\x1f\x11" +"\x1&:\xf8\xf6\x8a\xe5(\xf0\xb8\xfdX\xb2?\xf4\xe3\x33w\xffL\xd4+{\xb8\x62\xc4\xf2" +"L\xf3[x\xc1\xa0jY\x91\x9+\xe7\n\xfb\xe7\x63\xd9\x88XL\xa8\xe2zE\xf2\x2\xeav\xc5\xbb" +"\xadu\xeb\xa8J\x8ehw\x1\xd2\xff\xa6\xeb\xdb\x8b\x89/\xe0\xb7\xd2\xf6\xbb\"\xa9\xe6" +"=\x1\xdb\x96\xf4\x8a\xfaSl\xdb\x36=2\x94\xc6\xb9\x12\xbc\x83\x93\xaf\xe6\xcd\x9\x33" +"\xc2\xfbi\xc3\xbb\x9b\x2G\xa6\x9c\x9c\xe9,\xcb\xb8j1\x9c\xba\xfe\x87\x1d\x86\xeb" +"\x1b\xef\xf0W\xdf\x17@\xd5\xd7\x89\x43\xb7\x1e\xed\xfb]\x10\xbe\xa9\xc9\xb5\xf5\xb2" +"VB\x8f\x84\x83\xbd\xfbtDo\x1\xe1\x97\x4\xbb\x63\xff\x46\xb8\x9a\xc1\xad\x1e\xa9\xe6" +"\xb8\x16w@\xd9($\xb7\r\x10\xe6+\xf9\x1e_\x19]<[4\xc8\x9e\xbbv\xdd\xc:\xe8\x15\x83" +"\xe6+0\xfa\x89\xbc\x91P]\xdd\xe2\xbaI\x1c\x88\xb2\xcbO\xe1\xff\xe9i\xfa\x63\x9cs" +"\x1c\xdf\x8b\xc4\xf4\x2l\x95\x87v\x83\xdf\xfaL\xa8\x45\xcf>\xc8\x17&$\x82\xbb@'\xbb" +"~[\x90\xc2\xc5\x61SR\x9f\x62\xfcT\xd2\xb5l\x95\x1c\xda\x1d\xae;\xd3\xc9\xb1h\xbc" +"\x93\xcbu\x8\xc9[\xc0\xb9h\x1f\x91\x66\x1d\x8d \x1f\x65W\x1W.\x90\xde\x7\xce \xb2" +"\x7f_\x91\xc6\x62\x16\xe6j\x89\xa3\x9c\rp\x80]\xcd\xa7x\x9d>K\xb2\x92\xe1\x93\x46" +"G7\xd7%K\xc7\xb\x93\xa5\xc9\xb4\xc4\x9b\xfe\xef=\xf5\xfa-3>\xef\"\xd0g\xdf\x63^b" +"d\xd1Q\x13yH\xe4L\xbf\xfc\xe8\xb7\xa2\xf8^\xcf\x80\x8e?O\x8f\x1e\xae<\xc3\xdf\x13" +"\xda>\x92\x91\x19\x10\xe9+_\xf6\x41\x15Q\x80\xbeLw\xf5\xec\xc\xcf\n\xd2\xe7\x39_" +"\xab\xa6\xb8H\xb3\x88=-\x7W?\xbd\x44k_\x97\x18\xea\x9\xd1\x91\x8b\xab\x44\x87\xb8" +"\x19[T6\xc8\x17gcU%\xbau<\xa7\x42:\x97\x83\xff\xeaX^\x99\x32\xfc\xbb\xf6\xef\xaa" +"\xed\xd1\xf9\xf1\xe4\xa0\x13\\\x64\xe8\xce\xc2\x83\x87\x66x\xcdV\x8fu\xa1\x16\xac" +"\x9cuu(bQv\xa3\xa8\xbc\x8b\x63\xb7\xb9\xe8\xcd\x6\xa9\xb6\r\x0\xc5\xc2\x1fj\x1d\xab" +"f\xc7\x80!\x10s{>\x1c\xe8\xab\xa5\xd1@a\xb6\x4\xc1\x8d\x7f\xcfm\xcaq\x8cYBY\xbdt" +"TrP\xc0\xd4{0\xe3)}\xbb\x5\xc5\xf\x41(\xb8?X\xfa\x96\x32\x1el\x1f\xe3MR\x96\xe1\x1b" +"\xfbL\xc5P\xcd\x80\xa1!M\x82\x1c\x4\xbe\x92\xb7\xae\xee>\xf4\xe4\xb7\xe\x62v5a}T" +"\x96\xdc\x32\x81\xfbGG\x18\xe5Is\x3\x19\x9b\xdc\xbc\x33\x18\x42>\xc\"'y_\xf3I#w," +"\x7fS\xe6\xcd\x8\x11\xda},#\x10\x18GT\x1e]j$9\xb2\x31?~\xcf_\x12\xd7\x31\xd0\xde" +"\x9d\xb8\xbd\x45\xb0\x8e\x1a\xb1)\xee\xc0\xd4\xea\xb8\xec\x63-\xeQv\xadg\xea\x81" +"\xc6\x81\xb9 :I\x88\xd2-\xb6\xb6\x5\x9f?\xd8\x87\x8\x89\x66N\x1f\x88\x82\x65\xed" +";1b\x19\xdf\xbe$\xa7\xd4%L\xc2\xf4\x98\x1a\xe4+\xd7\x8cs2`\x19\xc5\x4\xed\xa3\xa4" +"\xd3\xfd\x18\x1ap\xddP\x85\x88<\x11\x63|x\xb8+_\xc7\x8e'\x87\x8bS \x8cU\x93\xa5!" +"\x14\xd8<7\x2`A\xf8\x1\xd9P\xa6\x9b\xf9\xcb\xc9\xb7[\x12\x81>\xad\xd6\x95\xe6\\\x15" +"\x83%K%\xd1t\x3\xfaMY\xf5\x18\xc5r\xf8\xac\x90\xa3\x86\xc9\xb6<\xb6\x62\xf5\r\x9" +",\xdf\x37N\\\x14\xbd\x92\xe5\xf\xf4nO\xef-\x8a\x9e=\xa3g\xe7\xd3\xf3\xba\x17@\rT" +"EF9\x92t\xfb\xc8\x1\xc1\x1e\x85\xe8\xd1\x4P\xac\xb\xeazF\x8f\x1b\xa9\x90\xb4\xd9" +"Y).@\xbb\xc1\x1d%\x30\xe4.e5g\x19\xa8\\v\xef\xccn\xa9\xa3`)A\x1c\xa1\"[\x11\x44\x81" +"\x15\xc1mQ\xc\x4V\xec\xcaY\x8e\xcd\xc3\xed\xed\x5\x15+f\x9d\xe\x7f\xf3\xe8\x3r\xf2" +">\x9\x8cm\x2\xeb\x9eZ\xfb%\x63Y@[\xfc\x81\xcc\x9a\x92uP\xe4\x99L\x9d\xee\x8\x15\xaf" +"\xff\xaf-\n_\xd3\xec\xe4\xf9\x5{\xc6\xfe\x4\x87\x61\xf7M\x81\x5~\xef+O\xbe\xd3\x8f" +"\x8c\xf6\xdfvYu\xd3\xccQ1\x9?u|9\xe\x1e\x32L\x15\x9apG-xNI\xe6\xcc\xb7Z\xf3\xf3\x3" +"\xf9\xca\x91\xe2\xec\xa0\x66JKM\xdd\x83%n\"u?\x1f\xbf+[\x1esw\x93\x90\xc8\xc5\x82" +"\xe1\x11:\xcf\xdb!,\x1a\x9a\xa7S}\xdb\x19|<6\xc6\x42\x65z\\rB\xb6\xd2Yv\xbd\x15\xe1" +"\xac`}\xb1\x86\xbc/\xfbH\xb\x1c\x95\xb1\xf7\x1f\xaf\x19\x3\xc8\x64\xe0\x36\xdd\xb4" +"*h\x1f#\x18\xdc!+\x1b\xe3\xa8\xfdx\x1d\xbai\xda\xf6\x39\xe\xbe)\x9a]W\xd5\x96\xe2" +"Ks|R\x9eH\xd7\xd8\xae\x8f)\xd8\x97\xed\xdd\\\xfd\x97\nu\x2\xef\xe9\xdf\xf7\xa8\xde" +"\xf5H\xd0}\xfc\xad|\xf7\x17\x1f\x14\x46N\xd1\x85\xca\x1c\xa7\xf8\x12\x64}\x82\xf3" +"rg\xf9\x34\xbK\x81\x38G\x10\x99\xbc\x99G\xff\xe8\x83j_\xca\x14]$b\x98\xfaj\x16\xa2" +" \xc4\x95}\xc0\x9e\x1f}\xb8\x3\xa4\x88\xbd\x9e#\xe9\xb0j\x94\x8f\x46\x32z\x1t\xf3" +"\x85\x64\xf5\xaa\xb4v\xc3\x87\x81\xbd\x1$\x0\x31\xdc\xba\xd5\xf3\xea\x38\xb\xd1\xda" +"*W\xd5\x83:(\x4\xf3\x38WA\xd1\x6/\xbe\xc7\xf2\xdc\xb9\x90)\xf6q\xe7= \xc\xdew\x13-\x1a?\x10PP\xd4\xec\xe2\xe" +"1PB\xecg\x3UR\xa3'\xe5\xd2\x13\x43U\xb6Xr\xfcpC\xd7\x96\xe4U,6\n\xde\xec\xd5\x8f" +"\xfc\xe6\xeb\xc1\x42m6\x4\x16>\x87\x36\xd6X\xb5-\xe\xb3\x1f\x61\xe7\xda$\xce`\x83" +"IN\x10;\x1\x38\x8\x42X\x1ftY\x84\xd9\\\xdb\x80\xa5\xb3\x18\x65\x1f\r\x96\x9e\x88" +"\xb6\xa1\x92\xd8\xfbh3\xc8\xed\xc1r\x13\x46Q.0\xddV8\xd4\xbf\xa4\xccmj\xe5\x95\x46" +"\xd3\"\x61\xfb\r\xa9$\x90\xc8\x1fHj\xf1\"/\xb5\xb8\xa8\xbe\xff\x0\x9au3\xbe\x98\xae" +"\xe6|u\x15\x2\xe8\x11\xe6\xd8\n\xce\x82\x31n\x10\x87.\xc0\x38\xf3\xba\x8d\xb2\x88" +"D\xe6\"k\xf7o\xb4\xdd\x1dS>2\xdd\x98\xaf\xad\x8hn\xd7\xac_\"\xd2:\xc3\xef\xc4\xca" +"<\x88\x7\x96\x33)\xd4\xc5\xe5\x44^H;1\xfe\xb1\xb6\x65\xe8\x1e\xfa\x14\xe5\x0\x16" +"\xcfj\xd2\xc9\x90+\xbb\x9\xc1\x16\x9c\xc0\x98|\x89\x65\xe1\x7f\xfd\xa6\xef\x44 \x9c" +"X\xe\x87\xe2\x14\x35\x9f\xf2\xf1\x65\x8f`,!F\x9e\x86\x1f\xa9:i\"\xfb\x81\x17>\xdc" +"0\x87\xd9g\xc2\x98\x61\xb5\xacK\x8b\xf0\x9a\x80\xa3\x9aq\x9b\xbb\xef\x19X3\xa5\x35" +"\xb7\x95\x15]1\xd2\xc5\x14\xefw\xb6?\xaf\xea\r>e\xfd=\x3m4\x7f\x9b\x13\x16\x44\x17" +"-\x1d\x5\xb1KX\xe0\xa3\xd0^\x1e\xb3\xc6<\xb5\x9c\x99!FWf\xabh\x3?\xd2h\xc3\x5\xa4" +"\x84\xcf^\xc0\xfcW\xab\x81\x87\x34\xb6\xfa\xcclSwj'\xe1\xea\xab\xdf\"\xbc\x86/\xef" +"\xae\x9aZ\xd8\x64\xaf\xcb.\x10%\xb9.B\xb8\xf7\xfc\x36\xf\xdc\x84\x38J[\x85\xe5\xd3" +"\xdc\xb8\xbbZ\x8c\nq\xae\xf4\x43\xfa\xbep\xf6\x1f%H]\xce;]\x13\x9_\x83\x46=\xfe\xd9" +"\xd1\xe6\xf0v\xea\x41\xf6\x45\x84\x15\xd6_\xa5\xf1\xfc~\x10\xe7\x1b\xc5S\x80P\xb4" +"\x1f\xe2}?\xc5*\x1\x11\xff\x11\x1c\xbe\xa4!\xa9\x63\xcb\x89\x13\xb5<\xc9\xe2\xe9" +"\xf5\xf6\xa1 +\xb\x1f\xfe\xbe\x8a\xfd|\x8e\x38\x5\xc6\x31\x2\x8e\x15\xa3\xbc\xe7" +"\"|n/UO\xb6\xd8-\xb3\x4U\xd5t\xec\x84\xfd\xbdNX\x9e\xc0\x93\xe7\xa9\xf2hz0\xa0p\x9d" +"\xa9&\xaa\x83\x66\xe\x19\xac\x33\x10);\x93\xb6\xb7\x61M|\x8b\x94\x14\x35&\x8b\xf8" +"\x8d}\xaa\x8f\x41<\xfa\xa4\xbc\xda\xde;\x6\xe0\xa4\xaf\xb6>f\xcd\xbf\xce?\xff]\xa6" +"f\x8c|K\x8c\x9\xf3\x64p1_\x9f\xbdlA\x91{K\xef\xfe\x85\xc2\xfe\x87\x89\xc2l\xf0~\xae" +"\x1e\xb5\xf5\x12\x13\xec\x41\x88\xa4)\x8dj~\xca\x9d\xbd\xb3S4\xeerz9>w\x93\x92\x10" +"m\xe9\x94#\xbf\xa7\x8e\xae\xda\xff\x42\xe7\x19\xef\x1e\x43\x0\x15\xdcJ\xed\xf\x66" +"\xdb\x1b\xc7\"\xd1\xceP\"\xed\x1\xec\x61`\xb9\xc6\xa1\xe0Y\x0jcL\xf1\xc8\x17\x38" +"\xaas[\x1b\x8a\xdf;S\xf0\x38\x1c\x92\x1d>\x1d\xb1g\x97\xd9\x35\xa9\rq\x0\xda\xd0" +"I2\x13@\x98\xcf\xbe\xf6\x7\xd4\x93\xb1\xc2\x85\x8fK\xbf\xd5\x9f\xd7\x11\x86\x1e\x7f" +"\xc8\xd3\xc3\x92u\x13r\x9\xe8x\xb5I'\xebS\x8f\xbc\x1bup\xd9N\xc7*A||\x93\xb9~d\xff" +"\xa4\x89\xfe\xaa\x8e\x44\x8f`\xbdq\x98\xeb\x87p\xcU\xaf \xc2k0\xb7\x41\x17\x94\x8d" +":,\x8e\x63\xf5Q\xdf\xa1Y~\x11Q\xfd\x3kE\xe\xd3\x65\xdc\xeb\x62z\x82v\xae\x18kc\xcd" +"\xfd\xc9\xbf\xee\xcf\xabI\xe2L\xfc\xc8\x8e\x33o(r\x9\xad|\x19\xed\x66sU%8%\x82\xd3" +"J\x1c\x42\x7f\xca\xc4.\xea.+\xb2\xbc\xa3\xb8\x89\xf2\xf9L\x17\x88\x9a\xf1{\x85'\xfa" +"\x8c\x98\xdb\x89\xa6/\xfb\xd0\xe7\xd7J\xf8\x3g.\xf0\xac\x1aO\x8a\xb7\x30\xdf\xaa" +"~9'\x9d\xbe\xa0\xb7\xeb\x15\x94\x33\x9\xda\xcf\x9a\xe8\xd7\xeaU0\xbf\x42>\x8b\x9" +"\xba\xf5\x91\xb7\xfc\xb0\xbf\x32\xbeI\xfc\xe9|\xf6Rx\xb3\xa0x\xe6\x93\xab@\x9\xe8" +"\x99\x1e\xdd\x66\xdf_e\x17\xd1\xcb\x89l#\xc9X&\x2h\xb7\xa1\x3\x43tL\x83\x36\x1a}" +"L\xfX\xd2\xa3\xb1G\xf8j\xa9\x61\x5\xb6\x8a*h\xfb\x84u\n\xcd\x80~\xfc+C\xe7Z\xaf?" +"i\x11\xf@\x7\xf0\xda\xd9\xbe\x64\xc5\x17t\xa9\xev\xf5\x9f{\xa2\x1cN!;\x9e\x3n\x8f" +"\xd9[qI\xed\xe8'\xc8\x95\xa7\xc9\x35\xd0\x4\xae\xaa\x65}\x8e\x89\x80\x8b\x94\x35" +"\x17\xaa\xe1;\x98\xb7\xfa%\xbb,\x5\xb+\xf3\xd2\xaa\x94\xd0\x36`\x87\xe\xbc\x33\x13" +"\xdf(\xb0\x19\xdc\x87\xa8\x34\xaf\xf7\x8d\xd2\x33\xd3)\xb6\x30z\xbd\xe4\x8f{3\x13" +"e\x91\xaf\x9f\xdc\x15&\xa3\xb2\x90\xc0tp\x1a\x93\xfdN-#\xe8\xc%\x45*F\x84OgQ\xb1" +"\x8e\x38<~e{b-\xf0\xb5\\\x12\xfd\x92\xc6\x96m\xb5L\xc7\xce\x98r\xd3\x81\xd9\xf3" +"3qa\xeb>\xf6Y\x16M-\xb7\xb3\xc0\xae\\\x1b\x8f\xbb\\o2Xs\xc3\x46\x9c\x42\xeaxI\xdd" +"\xb5J\xb8m\xa4\x99\xe3\x87\x6\x99\xa3I\xba\x1f*\x88+\xbd\xec*-\xef\xeb\xd8\n\x91" +"\xe2\xfX\xc\x35_\x99\xd2\xc1\xc1vW\xb2!\x5\x7\xa6\x15\x2kX\xeb\x11YF\x8b\xba\xc0" +"k\xac\xd1\x84\xb>\x9eJ/\xed\xbd=\xb9\xb3\xdaj\xa5\x93XW\xc2\xf3Z\x8a\x7\xf8\x99\x34" +"\xf0?\x1a\xc4\x17\x9b\xdf-\xea\xca\xcd\x37\xdd`Yh\x90\xd5j\xc5\xde\x35\xd3\x46\xf0" +"\\\xcb\xeb\x1\xafwolkx\xc7\xff\xeaw=\x9f\xb0&8\xa2z\x15r\xe8\x85\x6\x62{\xdf)F\x1b" +"N\xa9u}=\xc4\xb4\x88\x1c#\xaf\xda\xe1\xb3\xe6\xeax\x90\xe5y\x1a\x5\xac\x9b\xe1K\xfe" +"P1\xa5\xe7u\x9f\xe0\xa7z,C<_J\xbd-m\xd2LEZa\xbaK\xbd\xbf\xb8y\x95L0\x1c\x87\xcb\x83" +"\xa6Uq\xab\xb4\xed\r\x12\xb3\x82G\xa1\"\xe6\xed%)\xa3\xe9\xf3\x3\xccP3O\xf6\x66\x33" +"\x91\x34t\xef[9D\xf4\x31rx\x17\xc3?\x99\x96\x1c\x8f\xaeJ\x9f\xado\x7f\xce\xa2\xca" +"=\xcd\x7f\xf6\x30\xe1\xdd\x1a+\x1b.w\x2\xd4[\x90\x2.;\x98o\x8a\xc0*\xe7\x33}\x88" +"\x1a\xae;^\xd5\xff\x65\x89\x98,\x3v\xf7\xe0\x18N&woI\x10\xf5vJ\x9e\x87\xc0\xa0\x11" +"\xc4\x82h\x84\xb7\x33\xa7\xc9@\x81P/\xd6\x42\xf9\xd0\x1e\xf2\xf0\xd1;\x8c\x32\x2" +"\xb0\xc6P\x17\xdcR\xc6\xbb\x89j-]jn\xb7\x18\x65\x95\x39\\\x17\x61\xfb\xa3\xbaxS:" +"\xdd\xe3\xcc\x35\xcb\xc6\x1f^0I#Xr!\x7f\x85\x86\x0\xc7\xd9\xdcTFh\x9e/\xdcK\xc1\x8b" +"\xae\r\xc6\x9ak\x95\x38\x89\x9ar\xeb\x97-\xa7\x1b\xcf K\xe2\xa1\xbdO;A\xffN\x88\n" +"GNx\xb3\xcd\x97\x87%^\xd1)\xff_\xdb\x19q\xbd\xe1\xa6(\xf3\xd0\x3\x1c\x9c\x7r\x94" +"e:\x80Pi\xb0s|V\xf1<\xad\x9aw\x12\xc5\xa8\x9c\x8\x36N\xa2\xa7\xecGE\x9f\x1\xeb\x1e" +"y\xb1\xeb\xae\xdf\x65\xb7M/\x4\x11)C\xe9%\xc7sS\xb8[\xf4(MD\xf9\xe0\x35\xf9\x8e\xb3" +"\x81\x4\xde\x86,\xdbgX\x8b\xdcz\x1\xed\x46\xe3\xb4\x2\x1a\x36\\\x14>\xb8\xf2\xa2" +"\x89\xea\x8c\xb8l&\xe+h\x7\x98X\xcd\x80\xd7\xd0\x10\x62\xc7w\xccU\x9\x10,\xa7\x8f" +"5\xa1K7\x12(\xd9\xf3\xbey\xc2`\xbb\x44K\xf1/\"\x9emsOE_Gw\xd3\x44\xc4\xad\xf4\xe3" +"\xbe\xa7K?\xab\xbe\xf4\xffoP\x81\xc\x9b\xa2\xccL\xeb\x64 E\xc5\x4u\xe0Q\x9d\xcao" +"\x80\xdb\xaa\x84\xbb=R\x99;|d\xed\xa5\x7\xd3\xfa\x96#7\x82\xb7\x46\x6\x16\xfcG\x9b" +"\xcc\x66\xf1\xfa\x45\xdaPnhAsL\x4\x19z\xfd\xf2.IH\xfb\xe4\x63!\xf2@\xaa\x99\xc9V" +"{b>\xde\xf4\x0\x19\x64\x2)B\xa1\x4\xa3\xedM\xedK\x7R\xce\x87}A2\x97\n\xda\xdfj7\x7" +"\xe5\xe9\x99\xeb\x90\x83s\x1e\xd7\nLM<\xa5\x16\xe1\xf2\xa2\xcc!\xe7\xa3\x33[\xea" +"?)\x98Y\x87v\xca<\xab\xcIZY_\x8\xb1Mm\x4p\x88'\x1a\x42\xde\xc\xd8\x94\xfa.\xf4\x3" +"!\xe6U\xfa\x94\x93MV\xde\xa7\x9f\xb0\x9\xe1\x80\x11\xe6O\rq+\x85<\x13\x6\x1d\x9b" +"\xf1\x8d$I\x10-\xd6\xb7m\x2l\xb4\x1b\xf1\x88\xa4H\xd7X\xc8\xd6\x11\x11\xec\xc6\x64" +"\xa1W|\x90\xba\xee\xf2\x19p\xe1\xf7\x96\xec\x34\xbau\x89h\xc0\x61\xf4\xd3\xa0\xf4" +"\xc6\xf2\x96\x7f\x33\xe6\xad,)b\x93\xbe\xee\xebx$L7\xbeI$\xf8\x88\x80m\xd8\xa2\x62" +">z\xfe\xae+?;\x7f\xb2\\,\xa5\xf9\xdb\xa9\xf6\x84\x7f!\xa5\xd2\x35\xe\x9\xea\x9f\xcf" +":{4q\xc7\xf\xb\xba/L\xe9j\xfe(\x86p\xd8\x87\x61\x88\xae\xe1\xc0\xb9G\x7f\x64[=M\x9e" +"\xf8\x1f\xab\x33\xaf?l\xd1\xb\xbeyI\xa5\x1e\xfc\xb1\x89\xf8\xd7\xbd\xfd\x18\xcb\xf" +"\xf3\x7fR\x95\xf6\x17\xbd!B,\x8\x8e\xbe\x9a\xe3HYr\x8b\xf8\xe2&\xf\x5V\xffl\xf2\x66" +"\xbe\x35\x33\xb\xf2\x18:F\xb0\xf2\xe0+\xe6sR`\xfd\x8e\x32\x99K\xc9\xeb\xb6m\xa8\x17" +"!x\xc0\xa5\xd2\xa4n\xbf\x81\xd5\x33\xdc\xe\x8d\x85\xf9\xda\x0\x9d\x9c\xeb\xe0\xe5" +"\x12\xb9\xb3\xc2" +"\xb4\xcd\x1x\x99\x83P\xc8z\xfaO\x8b\xf9\xb1\xd4\xc8\x8f\x14\x46\xf3\xbd(\xb7\xf7" +"\xe6\xa1#Se\x4tn\xcd\xe5\x36\xcn\xacy\x8ck\x8e\xff\xb2\x82\xa9\x30\x80nU\x9e\\\x61" +"G\xf7[:\x9b\xfbo\x80\xddg v\xf9\x9d\x8e\xbb\x6H\x1\x19m\xc1<\x83\x7f\xe2PmR?\xdb" +"\xe6\x87\x1c\xf3\xcd(oU7C\xb2\xc2\x96V\xf8\x62+\xf5\x7\xfd\x99M\x1a,\xbf" +"\xb\x62R\xa1gh\x2\xe4\x1a\xac\x85\x8f\xc8\xc0_;\xf\x9b\xd7\xf5\x65\x9d\xaf&5\xbc" +"eO-N\xc5\x84\x4v\xdf[\xbe\x92\xc9Om\xfe\x1\xb0S\x81{\xd1\x1e\x98)<\x1d\x82\xd4&\x18" +"\xffv\xb7\xd7G|\xf4JU\xa0^bg\xc7\x80(\x84\x97S\x87s\xc4^|\x0Te\xbe\x37\x6\xcf\xed" +"\xa1\xa7h\xe3K\x16R\x91\x30\x15\x1c\x81\xc2\x1c\xb7\x9b\\\xa2\x61\x31\x18\xdc\x99" +"\x80\x10V\xfb \xdd\xfbw*\xf8\xf6\xc0X\xd2\x91\xbb`\xd1\xbf\xe$\xf1\x9\xc\xfe\x10" +"-\xbc\xfc\xdf>\xbe\x9c+\xe9X0\xbct%O\xb3<^\xe9\x61\x17=\x7f\x19,w\xe9\xf3\xcfV\n" +"j\xcf\xae!e7\x8f\x8e\xc2\x7\x94\xbc/\xe8\x9b\xe5\xfd,\xc4\xcb{\xc6K\x18\xe\x31ml" +"z\x8a\xec\x2\xcd;\xa4\x89\xea\x1b\xc7)\rD? \x17\xdb\\\x9fV\xd3\xc0\x1f`\xaa\xc3\x61" +"\xdf\xbb!9\x1d\x46\x31\xe1\xce}\xca\xaf\x8bqGBM.(\x4\x1U.\xb8\xd2\x8e\xa2\x9a.:\xe8" +"\xd4\x97\x89\x9b\n\x9a\xb0ur\x89\x43\xe3\x10\xb6\xf1\x19\xf7\xf4t_\xbf\x15vy\xfc" +"\xaf\xec\xa4\xb4\x89\xb2\xc9\x89\x16\x95r\xd9\xee\xa4\xeaJ&\x8a\xd5\\\x9\xe5\xf9" +"5\xe5\x81\xfb<;\xdfz\x19\xcb\xcaN1\xc2\xf1\x1c\x7f\x94\x4\x1c\x17 \xf4\xaf\xae\xb3" +"B\x97\xd0\xd4\x43\xea\x15\xf4PG\xd4(\xe1p\xbe\x83\xe9I\xa7G\xf2\xb0\xeb\x11\x14\xad" +"\xfeX\x16\xe4\xc6\xdc\xe2\xe1_\xa5\xc0L\xbf\xc3^\xef\xb2\xff\x31\xe7\xe8$\x9ah\xdc" +"\x18+\xea\\\x38\xd9L\xc1MO\xba\x93{\xf7\xddm\r~\x97\xe8\x86\xda\xb9\xca\xbc\x10\x65" +"\x15/\xe\xea\x63I\r\x8f\xf3\xfc\xed\xed|f\xb9KC!d\xfa\xce\xec\xd5\x37\xe8\xdd}vO" +"\x9cr3\x0\xf6w\xcb\xf9\x62\xf5\x12\xe0\xc2\xbd\x92j\xed\xce\xce\xd2\x3!\x9b\x44\xc6" +"\xa3>\xb8\x1fh\xa8\x8ti/\xb\xa4u\xe1Qs\\\x2\xf3|\x7f\x82{|\x18\xa5\xf@<`\xb2k\xa0" +"u\x98\xa2\x34\x0y\xecy\x87\xf\xdc\xf1\xd0\xa1\xf\x95\xb4\x91z\xe9\xba\x41O\xbb\xa0" +"\r\xd5\x61\xff\xf7\xe3\x66\x9a\x84\rV7\xa6p\xb9\xc7`?\x95\xb\xe1\x94\x10\xda\x99" +"(\xf\x83m1exb~\xd4\x6\xe\x8a\xad\x11\x97QB\xbc\x93\x1e\xfb\xb5S!d\x11\xd2\xa3\xee" +"\x8\x9e\x4\x35\xd2V\xcfl'\x13O\x97\x42k\xe3\xfd\x8aj\xe9\xa0\xb7\xb6\xb7\xd6`\xe4" +"\xbd\xbe\x8b\xaf^\xa8\xd8\x1f\x42I\xf0?\xa5:J\xd8\xc4\x9f\xa7\x9a\\\x34oms8J\xf3" +"Mk\xa5s6PyK\x84\xb\xbc\x12\xc2\xd1\xe6\x93\xe6\xa2\xde\x9f\xf5\xb3\x17\x46\x83\x81" +"D\xbd\xac~\xcbW\x84\x7f&\xc1\x80{\xee\xa2)\xa7\xef\x3\x32\x92\xdfW|O\xa8\xdfq%\xc9" +"_\xbe\xb9\xd3\xc9\xa6z\x95\xea\x90\xf9u\xa9<\xcf\xf6hJ@v6}m\xf1?@6s\xc1\x30\x98\xef" +"U\xe1\xc5\x95sIT\x8c\xe2\x17u\xc7\x42\x8d\xd3\x39\x4\xff\xc4\xaa\xe2I\xcb\x65\xc0" +"\\*\xc6\xfe\x64?\xb7Z/J\xa2y9 \x13Q:j\x90\x8e\xd6\xbc+\xb5\xc5j8\xa6\x9aZZ\n\xa0" +"~\x84\xaeX\x95\xa2\n\xdd\xa2\xca)!E\xd1.\xd4&H\x9/\x9d~y\xeel\xec\x97\x8e\x1a\x35" +"H^\xf3\".>\x9d\xd4\xf9\xc2M\xf\xa7Q\x89\x30\x8a\xd0\x38\x19\xb4%(@\xaf\xd4N\x87\xe4" +"\xf4W\xfc{\x8e\xf6|\xad(\xc1$+\xeb\xe3v\xbZ\x90\xe3u.\xd2\xf\xa3\xb4G\xe5w\xd6\xb2" +"\xc4\x90\xebv\xf5\xb3W\xc0\xa6\x18\x12\x8\xa8\xf9\x95I\xa2\x80\x9b|O\xfe\x37\xe2" +")\xe3\xe0\x1d^{\xd6|o\x82\x11O\xa9\x43jy\xbf\r=o\xb8\x8f''\x92g\xb\xfk\"\xd1L_!\x93" +"\xd9\xed\x7f\x12\xf6\xf1\xc7\xf3\x36\xf5\x97\xd2\xf1\xbYAcSP\xeekF#S\xc2\xf2\x11" +"\xd0\x18\x10I\x15V\xda\xe1hS\x3P\xe9\x94!\xb5\x9\x10ZnU\xb\xcf\x9e(C`[\x95\xa8\x9c" +"\x93\xab$\xb9\xd9\xb7\xed:\x99\x65\xb6\xfc\xa2\x1a\xb9\\V\xb\x2\xe7\x63 /|UF\x14" +"\x19\x98N\xdb\x14M\xe\xbb\xef\x64\x36\xaa\xa3\xc6\x89Y\xb0\x86\x9bX\xe5\xbc\xbcT" +"Cl#\x8a\xc9:\xaf\x88.[\xc0\x14\xe0?^\xae\xb6q\xac<\xc0\x90\xeb\xcb\xfb*\xaci\x18" +"l\xf3gF\xf5\x35sj,\x8b\xd7\x3\xaa\xbbz\xb8\xc9\xdf\x63\xd7\x31\x91\xb9\x8e\xe4'\x94" +"s\xdc\xa2\x98\xc4\x1aog\x98>\xf9\x1b.V\xefY\xb9\x33Y\xd4\x5\xb4/Z0\xac\x81\x17\xcf" +"{\xe5/\x1\x2!7D\x1e\xfa\x8T\x9b\xca\xdb.\xfb\x90\xadL\xcd\x93\xa6\x2*\x84$\xa8n\xd4" +"\xa4\x8c!3&s{\xd9h\xe6'\xf6\xf8\xa8\xe8\x6gk\xfc\xd6\xa6Q~b;\x84 J]\x8d\xfa\x46\xea" +"\xe6\xab\xe8\x98p\xff;\xb1\x9c\x64R\xff\xa3\xa5\xab\xd0\xe0\xcd\x41\x8f\xfd/\xf2" +"!\x82{\xd3\x13\xd7S\xa6\x34\x34\xea\x1b\xf9\x82*\xa9\xd7\xf2\xe8\x39\xe9\xa0\xde" +"\xbb\xea\xad\xd3\xa4\xeaGF\xdc\xb2\x81K\x98\xa5/\xa0\r\xb4\xc1\xc7\x1b\xd7hpI\xb5" +"\xfa\xea\xf5\x64\x95\x7\xc2\x30\x35\x13\xf1\xb3\xa6\xf4\xf7\xdex;\xcc\xf8Z\xea\x62" +"\x8b\x1a\xfd\x8fG0v\xe9Q\x95\xd1\xe8\xaf\x64\xa0]\x5\xa6\x61\xe2\xb2\xf7wy\x14I\x5" +"\xa2\xc5`\x1d\xf0\xee\xf0\xc8\x81+\x8d\x9aQeH\x93\x96\xac\x9d\xe5MqRP\xa3\xac\xce" +"\xffVY\xb1\xf5\x1a\xd7\xa7#\x9d\x9a\x8b\xc7\x63\x1a\x35\xdf$N\x9c\xf1\xa3\xd0\x80" +"\xde\x8f\xdf\x9\x5-\xaf\xb2\x0\xb9\x7\xe8\xda[\xb2@N\xfa\xb1N]5\x0w\x10\xf3i\xd3" +"\xdc\xe9\x65M\x3\x32\xbb\x19\xa5\xbc\x9b\xcf\x10\xc2\xae\x8a\x12\xd9x1\xbf\xd0\xc0" +"h\x81\xbe\xf8\xca\xc8\xa9\xbd\xeb\x42\xa2\x64Y2T\xad\x8dr\xfa\x97\xf1\x89\x90\x1a" +"\x85x0\xcfR\xcf\x13\x7f\xcbmF\xb9\xb9\x34\xb9\x8eR\xa2Q\xb0)B-\xda\xee\xe2j\xaa\x89" +"\xa5~;\xc0\xc4\xe\x95\xbc\xdc\x9d\x9a\xa3j4\x80U \xa6G\xa1\xdd]\xe1H\xd7\xd5\r\xc9" +"\xea\xd7\r\x92<\x9cx\xdb\x90\xf8\xba\x2\xd6\x8c<\xec\x9f_\xd7q\xc3\x31@\xb9;\x82" +"\xec\x6<\x8d\xa7\xd9\x64\x44\xbe\xb4\xfd\x1f\x94\x38\xc0\xb\x1ct}\x88\x33\xdd\n\x1e" +"\x12\xfe 6\xbf\x38\xb4\xae\xa8\xf8p\x8b\xd3\xe3\xe2\x89\x42Z\xbb\xe7\xa6\xce\n\x9b" +":N\xb6\xd6\xcf\x2\x1a\x3\xa4\xb\x32\xa6\xfb'\xf7\x14\xab(\xb1\xa8\xd0\xa7\xbe\x38" +"\xe3X\\\xfb\xdf\x46\xac\x9\x6\xb0\x65\x65\x99\x99\x83\x31\xba\xeb$\xe9N\xff\xc3\xd5" +"k7\xa6\xf3\x36\x95\xc8G\xb4^\xaeJ\xbe\x90q(\x98~{\xc6\x1c\x9c,\xbc\x35\xb8\xed\xb6" +"\xc4\xd0\x0\x4\xd3m\xd0_\xe0\x1\xfe%\xa0\x44\xbb\x32Q\x17\xff\xcd:\xe3\x7h@)\xc2" +"\x9e\xd0\xce\xdasM\x1b\x96\x85\xdaL\xday\xc5S\xee\xfb~&\xd3\xe3\x1c\xaa\x1b\x81^" +"1\xd0q\x8b\x19\xb\xe6\x91\xab\xff\x96\xc3\xc8\x9a\xd3\xab\x86i\xa6\x91!I\xe5\x9e" +"\xebVn\xc9Q\x13\x89_\x17\xd5\xae\x2\x1e\x1e\xe2\x85\xd0\xc4\x9e\x5\x41S\x94Nc\xe0" +"\x19\xfb\xbb\x8\x63\xda\xce\x34\x1bS\xcd[\x97o{a\xed\x8/d#\xdc\xb6\x31IM.mF\x85\xbc" +"\xeay\xf5\xdc\xd4\xdb\x9eN2[8\xc7\x39\x10\xd8\xc9\x45\xb0" +"Y\xc3n&!\x19V\xe6vY\xbc\x13\xac\x10\n\xe8\xbf\xbc)z\x8cL\x89\x85\xfb_\xb4\"r7R\x85" +"n9\xd5q5W\xe4\xeb?\x14\xc5\xe1_\x82-\"\x4\xef\x14\xa9\x1cj\xb8\x13ll\xcb\xf9\x4\xbe" +"\xabr\r\xaa\xacWu\xa4\xad'6)\x86\xebx\xd9\x95\xb7\xebp\x91\x35\x19\xf0\xb0\xd2\x95" +"\x91\x62O\x15\x92\x85\x88\xc\xa1\x8b\x18\x32@A\xc\xbd\xe\x9a)?\" \xc6\xff\xc2\x89" +"f\x8c\xa8 \xccn?\x8cn$\xc4\x37(\xe\x6sy\xbe\xbb}\xcd{\xfe\xe7:\x80M\xe0Hf\xc1\x2" +"H\x8ar\x1d\xc5\xc1\x9f\x64\xc1{\x1b\xa6\xf5\x43\xfd\x2J+\xdd\xf2\xb4='\x18[sU\xec" +"\xe2\xfa{\x9f\x36}]V\xcf@\xe8\xc8\x61\x3\x9bp&\xb4\x65\xd4\n\xc2\x64\xbd\xf4\xd4" +";\xb5\x9e\x45\x1a\x15/\x2\x19\x80\xdfr\xac\x89\xcaS\xff\xf8\xdd*xI\x87{\xd8\xff\xe" +"\xd6T%L\xe9\x3y%\xd3\xc0t}#\xde\xde\xf3?\x95\x10\xa6s\xc\x95\x37P:F\x12\xc7k6i\x8e" +"K\xb1)z?\xf7,\xaa\x98{\xfd\xf\xb8\x1TO\xa5\xb0GSx\xf\xae\xeau\xa5g\xea\x18\x9\x8f" +"*\xe8O\"b \xdf\x46\x42\xa7\xbo\x5Ww-{\xa1\xf1;\xef|\xe9\xd9\xc1\xf3%O7;\xa0\xfc\xfc" +"D\xc0\x6?\xcf\xf3\xc2\xd7\xb4\x8b\x1c\xdd\xed\x8fx\xa1\xec|\x6i\\\xe8\x89g\xbi!\xf9" +"\x8d\x98\x65G\xfbu\xff?\xaf\xbe\x9\n-3\xc4\x1a\x1f_\xec\xdd,!\xe5\xef\x80\x8d|\xd4" +"\xa7\x19[w\x15ve!\xc0\x8\x15\xf5$\xe7]\x1bUH\x16\xfa\xda\x8\xb6\xc2\x46\xd1\xb6l" +"\xde\xc4\xbf\x19\x9\xd4\rH\xd5\xa2[\xb\x16\x15R?\xba\xc1\xee\xc4\x9f@M\xd7\"G\xb2" +"\xc0|\xef\xb4\x5\xfa\xaa'9s\xe8qK\x13\xae^v=b\xd0w\xf1_\xbb\x15\x3\r{@b'S5\x98{\xc5" +"\xed\x9b\xce$s\xba\xac\xc9\xfe\x39\xea\x65\xd5\xa7\xff\xe\x37g\x129\xaf;Jj6\x95i\xb9\xd8u\x7f\xd0T\xcc" +"\rkb\xee)\xcdl\xf2\xfc\xbcj\x8dW\xa2\xf9\xc6\xa5\x4\xba\xb4\x10\x4\xdfR\x92\xda\xfa" +"\xec\x65\xa2\x86\x1b\x43-\xc4\x1a\x36\x81\x36\x11{teSw\x7f\x1f\xa0\xf7\xb2\xe3\xfa" +"\xf2S\xa0\xbf@\xd3\x92\xb4\xe0\x46\xcfiz\xbfM\x8b\x32h\xe4\xf2\x64\x84\x39\xad\xe9" +"\xd2\xe4U$\xf3\xc0\xe0R\x7k\xf3T\x0\xcb\xdd\x16\xe7\xf\x88#\x9d\xeat\xcd'c2u\xcc" +"\xed\xe4\x9ck|#\x7f\xb7\xbd \x1b=\xfa\x9bw\x94UYaAM\x80\xfd\\\x32\x3*3\x10\xb6\xb3" +"-F\xa6\xe7\x44\x93O\x9dh\xc_\xfd\x81\xf3\x31\x99\x1d\x1c\x99~\xb3\xe4\xce$\x19\x16" +"\x17M\xa8\xbf\xb5\x6\xb0\xff\x91\x8c\x61\x17Wjo\xcd\xf4\xbd\x9d\xd9\xc\x9bRs3\x1c" +"[\xf0~X\x97\xe9\xf0*\xa3)l\xc0\\\xf4~H\xb5X\x86\xb8\x82o(\"\x14\xc\xc8OT\xb8\xb9" +"\xd6G}\x98\x93\xeet\xfes\xe3\x92\x97\xbf\x41N\x1y\xbd\xb2Qf\xe8\x83mI\xb2\xad\xd6" +"'J\xff\x33\xc8#a\x19yh\xfd\xfa\xcc\xa4\x9b\x85w-\xe9\xa1H\xe0\x17\xa8\xff\xc6*8\xa3" +"\xb\xe5\x85\x5\x13\x7\x17'\xf3\xba\x34\xdd\x64L\xe0\x8b\xf3\xfd*U\x8\x9s\n\\5\x91" +"\xd6\xc;\xe>\xd2N\xafW\x81}L\x84\xa4\x66\xc5\xf0\x37\x94\xe6\xae\xb3\xe1\x84j\xb2" +"\xe9:]\xcc>\xf8\x35\x66J\xe0\x13\x46I7E\x11\x80\xab\xb9\x1dT\xcc\x81\x96|\xf8^\xe6" +"\xb9\xd7\\\x14\xa7\x7fs\x7f\xa6\xb4\x14\xed\x66\x7f\xca\xba\x82\xde\xd6\x65;\x8d" +"fI\xcf\xe5{Fr\xc4N\xf\xb\xfeZ\xd6\x30\xc4\x8c\xcfT\x9b|\xd2\xde\xae\x9cU'\xd0G\x83" +"\xecS\x19\xbb\x9e\xf7\xd7P\xd8{\xa3\xc6\xb9\xb8\x19T\\\xa2\x42\xd4\x1fv\xfc\xd3\xdf" +"/\x88\x42\xfaW\x14\xaf\xf9\xe5\x13\x9b\xd2\x90\x8a\x0=\\\xe\x62\x63\xa2\xbb\xe4\x10" +"\\Q\x0\x87\xdb\xe\xcd|KW\xcc:\xf6M\xba\xaa\xc5\xde!\xbc\xab\x8aX\x0\x32%\xef\xe6" +"{\xe7\xf9\xa6p\x9e\xee%\xd3Y\xfc\x1a\xeb\xc9i\x13\xf\x30P\xc0\xeb\xb6\xd8\xb7HY\xad" +"T\x86_@\x8\x63\xd7i\xe9\x1d\xb9\xed\xeb\x43\x85%\xa7\xc7\xca\xa6\x8b\r\x19\x84u\xa4" +"I\xf5\xf8{^\xbbI^\xbb\xd0\xdc\xe8{\xbf\x35@\x86y0+M\xc6m\x89?KAX\xe1\xb5\x30T\xab" +"\x9b\x19|n\xcb\x7y+\xa9\xc8\xc5\xb9\xc9\x0\xaf\xc5\xa0\\\xc9\xc3\x1bPxBz\x1c}tD\x9b" +"\x9e\xb8\x61{?\x0\x98\xef\xf3\xc5\x86tM\xbd'Z\x11}\n\xa1J\x4,Q\xb7Pa0\xdeYiM\xb9" +"\xe4]H\xf3\x9a\x31\x41\x1b\x65\x65\x12\xa3-<\xd9\x66\x86\x80js\xca\x7f\x46\xdc\xf9" +"\xa4\x87,\x3\x34\xc8\x9f\xfc)H\xa2\xbd\x98\xbb/\x0:\x85\x83L\x4\x98w\xa4r\x9f<\xf0" +"\x1\xb1\x38X\x14\xa1{\xaf \xa0\xefup\x8d\xdf\xfKemA\"\xe3\ryM\xa0H\xd8; \x1a%,\x92" +"\xc8\xc9(\x9\xcc\x30'\x15\n\xd6^\xcc\x94\xcb\x14i\xc5\xdbV\x96ZB\xb3g\xca'\x1[\x16" +"\x1a\xcb#\x18hk\xc3\x45\x1e\x3\xa2\x99\xf6}\xe0\xad\xbd\xe7\xf3\x38\x7!5e\xcf\xaa" +"\xb7\xa5\xad\x4\xa4\x42\xfd<\xb7\x10\xa6\xd4\xb7\x8a\x62\xc3\x18\x81_\xf2\xd9\xe1" +"K\x93W\xe8\xbb\xd1?\xaa\xbe\x9d\x9e\xa4<\xc\x39\xbfIv\xff\x3\xd1W;\x15q\xe3\x1<\xfe" +"\xd9\xbf\xaa\xc\x42\x1~\xcf%\xd7\xc1-pA\xez\ry\xe3}]P]\x11\xda\x96\x96\xe2\xb1\x13" +"\x1\x9e\x10\x35Z\xffIg\xc5n\xa8mCb\xa8\x9b\x42\xcc\x1\xf3\xab\xf0\xde\xa5\xf0)\xef" +"\xc/\xd3\xf3;\xfdX\xe3\x1a\x65 @\xac\x61yX_\x9b\xb0>\xb\xf8\xf1\xe9M\xa9\x32@\xf5" +"c\x7f\xa6!h{\xb4\xb7\xed\xc3\xa2\xf5\xf8\x9f\xd1\x43\x44\x12\x33:\xa9\xb9{\xd0\xc1" +"\xd3\x62(Z\xb6\x43\xf4&\xf7]\xd8T\xf1\x16\xa0\xd8\xbb\xdc\xdb\x80\xceQ<\xc4VP\x94" +"[Tor\xcai\xdd\x9d'\x7\xeb{[\xdd\x95\x1\xfe\xba\xc3\xc4GhR\xa1\xd2\x1dl\xec\x9a%\xe4" +"\xd1g\x1d\xcd\xbb\xb6{o\xb0*x\xda\xab\xb5_\x14\xe\xec\x15~\xb9\x10u\xe1\xf5\xcf\xbc" +"*\xa8\xd8\xd3\xfe\x99\xfGB\x9b\xc5s\xb6R\xd0\xdag9\x9\xf3k\xf1XR\xa7\xff\xd9\x91" +"\xd9'\xe9\x9al\x95o3@\x8a\x8f^\xdcm{ \xe\xf6=\xce\xb2\xcf\xb8\xda\x94u\xd3\x45(#" +"\x8fMZz\xac\xb9\x5\xe6\xa7if*1\xdd\xadNuy_\x11\xf3\x33+\xee\x3\x9b\xea~\xb9\xa9)" +"Z\x93\xe8\xf0Z\x9x\xd8\x81s\xc2\xf4\x8az@=\xaa\xf4|\x4\x44\xacI\xe3TJ*\xa3\x19\x17" +"mQ\x91\x1bI\xda\xc\x3O>\x9c\x33\x84\xf9\x6=D\x9e\xad\xde`I\x1e\xd2,;\xb5\xc0\xba" +"\xc3\x1f\xc5\x64\xbbu\xcfuY|\x97{\xd9\xab\xf9\x5\x99;\xde\xc6\x86r\x8b\x1c;\xce]" +"\xf\x63\x2\xb3\xe0\x34\xe5V\xe4?\xbe\x18Q\xb2\xd1\x37\xcfs\x8a'\x7f\xc4\xce?(\x9c" +"\x1bj\xca\x82\xf9t\x1\xea\xc8\xe\xa9\xa7h,\xdc\x9aX\x8a\xb1\x0\xc8\x44\x8b`\xac\xb" +"6\xf\x1a\xf0:\xb5RU6\xc3\x43Q\xdc}\x11i\x19>q\xfa\x12\x89.\xe7\x9a\x9e\x41U/]\xee" +"\xe0^\x9bqE\x87(\x88R\xdeyM\x16\xc5q\xa4\xd6\x1c*A\xdf\xb1\xc5\xe0\xc0\xe6\xe2\xe9" +"\xdcN\xc7\x92\x7f\xb7kR\xec\xb\xd5\x81\xf6\x98)i\xc8\xdd$\x0\x37t(\xfcup\x10\xad" +"\x3\x9c\xc3\xc9\x17\x42\x1a~ \xd2\x61\x3K\x9f\x86\xc6\x97#\xe9\x82:&H\xd6H\x87\x9e" +"\x13\xba\xaa\x98\xbcY\xe4Q\x80\xec\xd9\x7\x80L\x1\x32\xb1OZ\x90pXi\xa8\xc3\xb0k\x1a" +"`086@)\xf3\x80\x1e\xf7L\x8fy\x8fq+\xeb*\xebU\xa9\x17\xe4\xe1Y\x7\xe1`p\xa0\xf9\xb5" +")(\x92\xa0P\x82\xb8\xccZQ\xaa\xcb\x34\xe2'\xfa\x8b\x38\x9c\x8$[\xda?\x3W\xf\x4\xc1" +"\xa0\x64\x62L\x89)\x93\x8e\x96k\xcd\x98\x1c\x11\xf7\x5\x9\xbc\x65\xbe}=\x18%\xa9" +"\x18\xa7<\x9c\x34y\xcd\x93$\xcc`N\xb\x38\xbd\xd7{\xeb\x80-O\xe0\xc6\xc7]\xc1IOh\x16" +"\xddR\xf)\\\x1a#\xd0\xc\x8e\xc1nE\xd9\xd3\xaa\x9e[l\x13\x8bvi\xbe\x34\xf6+rP\xfb" +"\x1`4\xfc=E\x9f\xacI\x1b\xb4\x7P\x1f\x99\xffi\x15\xf1{\xa0X\x7f\x17\xd1\x9f\x5\xe4" +"\x1\x1a\x82`\xc6\xd9\xea\x10\xcf\xe8M\xb4\xcd\xaco\\\xb8\xf8\xa8\xc1\x9dq\xa8\xb5" +"\x1c\x80?\xec\xaa^x\xd0\x90\xeq~m\xb0\xf1m\xb5\xe3\xfdvk\"\x10\x33\xd6LF\x95\x12" +"s\x99\xca\x9eUY7K\xbeq|w'F\xff\x2\xbe\r\x9c\xda\x2\x16\xa2\x2H\x9a\xa5\x87- \xe\x9c" +"\x96\xa7\xco7\x9&L@G\x84z`cS\xfc>\xab\x9\x95\xcb\xe4\xdc\x92\x9\xcdS\xd2\xf8i\xe8" +"\xfbI\x95-%\x7\xc2\x8d\x97\x8a\x44HH\xcf}@ \xeV\xa1\xdd\xe\xca=\xd2\xcd\x86\x1a\xb8" +"\x2\x9e\x8f\xed\x1e.\xa8\xa4\xb4WQJ\xc\x11\x8cld\xb3\xff\xde\xaf\xd9\xfa?\xbf\x92" +"\xdc\x13-\xc4\xac\xb1\xdd\x8.\xd5\xef\x10\xe1\xc8[\xd4`\x1a>\xf2\xa6\xb5\x8=\xed" +"U\xf5\xd9\xd2\xc5u\xd0\xeb\xa8\x97\x0\xb4\x80m\xbc\xc6\xe5\xd2\xa2\xad&\xc7,\xb5" +"P.\xaf\x92\xce\x2\xeb\x7i\xb5R\xf7\xb3r\xed\xc1\xd1N\xbc\x12TUE\xd5^\x1b\xe0\xca" +"\xce\x86\xe\xa9P\xc8\x91\xf4z\x6n3O\xda:\xfa_\xcc\xe5\xcbX\xa1!\xc7\n\x64n\x8f\xcf" +";k=+\xdd\xbd;\xb1\x37\xabK\x1b\x30V449C-\xf4\xaa\x8\x9bp\xb4u\x11\xcf\xec\x8f\xf6" +"\xbc>\x97\xb3 \xf8\xbe\xe6\xfbI\x98\x1d\xd5\xb4\x11 ~\xe7\xf4\xbc\xaa]\x17\xe9\xae" +"0\xfby\xca\x88|\x4 \xc8\x2L\xb1\x44Q7\xe2\x43\xd4/\xcb\xfe\xa9obY\xdd\xd0]3[9\xe" +"\xd2X\r\xc8-\n\xba\xee^f\x9dS~vn~\xc1lQ*\x8bG\xaa\xe6\x38\r\x89\x94\xc8}\x0\xdf\xed" +"\x9f]\x85#*\x84\xe3\xd3\xcb>\xa5\xb3\x7\xc1l\xbb/\x96.\xff\xa1l\xae\x18\xa2\xb6\xf8" +"\xb1\xef\x4 \xe0K\x1e\x86X\xf3h\xb7\xd9M\x94\x9a\xea'\xac\xa6\xad\x42\x90\x7\x36" +"<\xe8p\xcd\xe7W=\xca\xb8\xe9\x81=\xdb\x31\x81\x63\x45%tA\x18\"\x8\x90\xa4\xc1rI\xce" +"z\xe3\x14\xa9\xad\xcd\xe3\x89\x94\x9f\x14\x64\x97kJ\x81\x9e\x87\xb7X\x8a\xaa\xf4" +"\xee\x1aP\x1c\x3\xa1\xc7\xe9(\xc3\xb4@\x1e\xbe\xb2\xeb^\xc5\xb6]\x6\xd6\x1c\x11\x83" +"\x1aP\xe5\x91$\xee\x7f\xda\x18\xfcI\xca\xfa*\xe4\x7\xafRm\x1a\x94\xa3\x5\x96\xe5" +"\xaa\x91\xe7\x99\x1e\xf4\xc0\\\xb0\xff\x34\x8e\x86\x94,pl\xfc\xd8y\xb5'\xc8\xe5\xf0" +"\xc\xcd\x36 \xf2\xe1\x11\x83\x17\x17,\xe\xf4\xcd\xa0r\xfa\xf9\x95\xd0\xd8\xdb\xb" +"\x83\\\xc9\xdf\x19!\xfa\x42\xbc\xd2\x61=8\xb1I\xa9\xff\xc4QNr{E<|\x8d\xed\xec\xf4" +"^\x1el\x15\xb7\xf2\xd5\xe8\x41\xb2\x8es\xe6)\x8e\xd6\x45\xaa\x91\x33z\x7\x2\x18y" +"\xc9\xc3\xc8\x6\x18\x37\"\x42\xf0\xc6\xd4 nW\xfc\xb6\xe\x42m\xac\xc9\xeb\xe8\x31" +"\x9c\xcd\xc3\xa6\xab}\x7K\x85\xfb\xfa\xa9K!5y\n\xe8/\xb3\xa4\x89;D\xf2\x41N?\x9f" +"=\xa8Z\x83\x8\x41\x7f\x19{\x92\x81\xc-l\x80\xb2\xfb\x8drZi\xa5\xdfn\x19|\xd8*w\xdf" +"\xac}\x82\xed\x90:I\xe8\x1d'\xe6%jrhX\xa6\xf4~\xef\xfc\xac\x83\xae\xd1p\xe2 Y\xc4" +"\x1a\xae\x41\x9c\x13\x97\x43\x6w\xb1\xe3\x8dM\x10\xea\x1ds\xd5\x9b\x83m\xc1\xa0\x32" +"\xf5\xff<_\xcb\x37\xb1Q\xca\x33\xdeo\xed\xb9\xb6s$p\x96^\xc1\x95G\xe1\xcf*qz\x1d" +"\x85\x8a\xco\xf0Zt\xfc\xc9\xb5\x12\xe4\xf5\x4\xe9\xde+\xda\x92*%N\xd8\x10\xb0\xca" +"\n5,>m\xb3\xe0\x8e\xc0\xaf\xd8#\x91i\x7f\x38\x18\xbdP\xa9\xcc\x3\xaa\x1a\xd6*\x9d" +"\xdb\xe4/Z\xb7\xf4\xbc\xc1N^\xf4j#u\xf\x8b\x9\x95\x9c\xbJ\xfd\xd7\x9f{\xfd\x8f\x9b" +"\xa0\xdd\xe9*\xe6\x31\xacR\xcgdTepG\xed\x18\xa0r2D\xe9\xaa\xcf\x63\x94\xc7\xd1\xdf" +"\xe2\xcR\xef\xde\xd8\x32\xb1\xaa\xe4\xdd\x2\x15'\x1f\xc4n\xf5\xb9\r\xe2QO\xb1\x18" +"9jz`i\xbbI\xb9[\xb2@amA\x15\x9b\xe7+_\xb3}O 7\xc3\x9a\x41\x63\x18\x3y\xe5\xe9\x1a" +"\xdc\x98p\x3\xb0\xa1\xcdgl\xcb\x8c\xf6\xe4OR<;t\xd5\x43\xd5^\xb3\xcc\x46TcD\x7 \xbe" +"\x8\xee?\x85\xa6\xb\x93\x98g=~I\x0\xc4X9y\x88|n\"\xd3\xf2|\r\xb0\x35\x9as\x5\xb5" +"FRt\xd0\x9f{\xcb;{\x4\x89;,\x9c\xb5v\xe8\xe5p\xb4\x9e\xfc@\x9c\xe5\x5\x45H\xff\xb1" +"\xb1\x9d\xd3\x9\x80)\x95\x83`\xb0\xd9\x36\xb7\xb1\x7\xce\x4\x66H\xba\x43{\xef\xa9" +"\xbe\xf6{\x8c\xbd\xde\xcb\x82\xcd\x9cK\x1b\xcd\xc7\xfcj\xf2`u\xf3\xcb)$\xdf\xac\xf5" +"\xf1\xc4\x16\r\x1f\x96\xf2\xd7Y+W\xed\xb1\xca\xd2\xe\xf9\x39Sq\xd6\xaa\xc1y\x1e\x98" +"\xbfK\xc8K\xfd\x81\xb9*\\+@\xdb\xfe\xe3\xd5\xe\xe9&\x9d\xf6\x32\xa6\x8c\x9fn\xf7" +"]i\x93\x9evJ\x1bOR~I\x93\x9z\x1b\xf2\x8cnV\x90\xab\x9e\x32\xc7;)\xd0'^\x10\xf9U\x9b" +"\xa7\xf9k\xf7\xc7\x1iL\xe1\x31\x33\xe6\xfb\xa2'l\x12[\x83\xf4:\x84\xcf>\x8a\xbaJ" +"\x86\xb1\x80\xf6hB&~p\xf5\xc7\x94\x30\x36\x89\x96*\xe0g)\xe,\xf8~?\xddwN\xd1s\xf9" +"\x1f\xa1\xfb\xb0\xf6\xeb\xa3\xef\x1a\x34\xe8&`Ia\xd2\xcbG\xb4\xb&\ry\xb9\xb2\xfd" +"\x1d\xe5\x84\xeay2\x9d\xc8\xecu\xe8M\xbc\xd9\xb\x88\x8cY\xe8\xf7\xe5\xe9\xfN,\xf7" +"\xad\x8c\xc5\xd6\xacjB\xbb\n\xba'#n\xe4\xd6\x8e\x99J\x1f\xa5\xe5\xec\x15\xa5\\\x15" +"\xb0\x30\x62\x97\xa6\x37\xd6in\x19\x33\xd8\xc0\xe9\xc4\xe8\x1a\x46%\xf4'\xaaG\xb7" +"\xe8U;X\nE\xc1h^`&~V>\x9a\x37\x85\xa9\xc1n2\xdf\xa6jU\xff\xcc\xc8\xeb\xce\x39V\xc1" +"\xe9w\x8b\x64%\x8e\x9i_\xae\x8kI>=/\xccL\xf6\x90N*\xb2+K\xa6\x31\xc5\x5'\xa5h\x1" +"s{\xfc\xd8\x81\xbf\x4\x99\x1bvwf/\xb\xc6p\x9b\x98\x1em\xd9\xdf\xa9\xc\xd3g.\xa0\xe" +"\x0\xbf&I\x16<= \xc6\xba\xea\xf3\xfa,\xf5l\xdc^\xcc$b\x89\x36\xbd\xc5\xa3\x9\x10" +"\xce\xe7\xaf\xb9~\xddO\x1a\x38\xfa\xb7\xfa:\\\xad\x31\xbb\xb8!\xea\x10;g\xf9\x9d" +"\xbt\xd7\xc1W\xa3Q\x14K\x9du[6\xe2P\xfd\xa9mhk\xf4\xd6\x9d{o\xd6\xbfX\x8\xf7\x15" +"\xfc\x39=\xe1[\x86\xa6\xe4\xb1\xe8x\xad\x83\x11^\x90\xed\xa0ST\xfc\x1c\xbc\x17\x34" +"\xa0$`|\x8\x1f\xc2)\xad\x35w\x0\x30\xd7}\xd1\x64\xc8\xe2U>\x97\x45\xed@\xd9\xbc\xe5" +"Bu6y:\xf0\x13\x66Z9L\xf9\x66\xf2SW\x13\xed,J?\xf8\x16\xf5\xc+\xc9\xc9\xdc\xbf\xe5" +"2#\xd0j\x0\x92h\xdaYk\xf8\x94\xce\x95\x80\xef#\xf4\xee\xe7\xdb\x88wpp\x9f~\xa8\x90" +"\x9e\xf7\x44\xba\xe\xa8Rg\xe6%s\xdb\xa5\x1c%\xf7u(\x87\n\xd3\x17\xf1\xed\x63\xb2" +"\x80/\xc5M\x81\xd1I\xa2\x12\x17\x62\xdc\xcav\xe^\xa5\xe7\xac\x32\xa1\xd4\x81\x91" +"\xd6<\xbf\x1e\x4\x9bx\xdf\xa7\xbb+\"7\xa9\xd5/qHY\xf5\xeal\x92\xd4L\x17\xb6N\xfd" +"P~,\x98 W\\\xa9\xba\x46\x2o\xbc\xc2^\xfb\xca\x84\x9a\xbcJ\x9c\x38U \xe5\xd7\xd6J" +"x}\xfd#\"\x9b\xfa\xca\x7\x85\xaa!\x9f\x31\ro\x2\x10\xe4\xaa\xfd_u\x3>\xd5`\xf1#\x96" +"Dv\x97+\xdb*\x80\x87\xdf\x61\xd0\xffG\xfe\xf5r\x0\x9a\x81\x80\x9cp!\xd6-\xbaS\xf6" +"\xb6\xa2k\x97mS\x94\xef\xf1\x9\xb3\xafX\x8c\xf8\xde\xb4K\xb0\x7\x63Rd#\xd8\x7x6\xd5" +"\xe3\xbc\xe1\x3x\xce\x95\xcf\x14\xd8s,\xca\xb6\x91\xdd\xd1?\x9a\x0\xd2\x85\xf2\xd6" +"?\xa8\xe7\xb1\x61\x36\xb1\xa8\xed\xfb\x44\xa4\x62%M\xe6\xd3\xa5\xecq\xb\x91\x84\xc2" +"\xbf\x8b#\xeb\x1a\xad\xc2\xd4\xb\xcbS\x82-\xd2\x9fN\\\xb0\x45>\x86<\x11\xaas\xe1" +"\xbb\xfc(\xe3\x36\xbd\xb5\x9c\xe3\xe8\x80\x65\xea\x9d\x8by\x99\x14\x61\xbc:\r\\\x97" +"\xfe\xba\xb0`y\xf7\xa1\xde\xfb\x82\xbc\xa1/(2\x9c\x6:\xb7&\xab|j-\xac\xda\xc6\xe1" +"\xda\x46\xe5\x82\x85\x1V\x95\xa4\xb2\x6\xd9\xe0\xa4\xdfp\x93\x3:\x9e\x42\xdd\x9|" +"j\xc0\xad\x87\xfd\xf4+\x8d\x45\x39\x36s\x14H\xdd\xd3\x87\nI\xc\xd4\x8f\xce\x94+\xae" +"j\x88\xcc\xf\x85%x\x8e\"\"\x39\xa3\x84v\x94``\xa8\xfe\xb6\x95\x96\x13\xb2\x8a\x1" +"\x9\x2\x93\xa9\xf5\x89_{P\x99\x85\xe3\x64>\xe4wR\xeb\xad\x36MTC~\xf2\xcel?\xe8jM" +"+\xe1(\x12W{\x12m\xf1\x32\xcc}`-\xc5\xecl\xee\xd3\x4\x1a\xf2\x8\xb6\x9b~\x98\xcc" +"\xadH\xb2\xe6\xd9\x9a\xb6\x7\xbb\xb3:\x19\xea\n\xd9\x41k1\xe1\x45\xd3\x93\x9e\x4" +"\xe9\xb4\xaf\xbc\xc2PL\x82\xd8y\xde\xe5\x44U\xc0\xf5\xd0\x1c\x2\x8d\x46H\xbd=;\x9c" +"\xd2\x3\x65\x37vA\x2\x0}\xf0\x35\xa9\xed\x96`\x12?\xae\xda%Zs\x85\xad\xab_\x13\xe3" +"\xfd\xc4\x90P=\x9b\x63\x1cS\x7f\x1c\x44G\xa4\xfdO\xe3\xf1\xcb\xb2\x42pT1\xa9\x85" +"\x8a\xc`\xfa\x8a\x83l0t\x97i\x80S\xcd\x8c\x62\xf2\x1a\xad\x3\xab\x6\xac\xa9 \xbc" +"\xad\x87\xf6\x8a\xfc\x45\x39\xf3\x9d\x9dgY\xb7\xc0N\x15\xed\xe5\x9b\xbc\xc0OR\x8a" +"'z\x92qR\xec\x89@\x91\x92\xf2\xe5&\xf7\x99!\xa4\xe7o\xec\xe2\x37?3u\xc3\xc0\xa3j" +"\xe1\xd6\xf3\xbd\x1bpXj\xb9\x46\x1f\x65\xdf\xc1\xc5\x65K[Z\xec_\x92\xd6\x38z\x11" +"\xbb(\xb8\x1d#f\xfe\x46:^\xa0\xf8\x19\x8a\x1f\xd8\xdf\xe0\x88\x9a(\x1e\x10\x16\xd7" +"!\x88\x2=\xe9\xc0$Gd\xe4\x80\xb8\x1\xf8\x33\x81\x36\xb\xffz5\x9V\x9\xa6\xe6\x11t" +"\xb0'L+r\x93P\x9f\x9cNN\xec)\xe,S\x8c\x2\xad\xb8w\xc8\xb2\x1f\x62\xc0p\xf5\x8c\xea" +"\x8b\xb4\x36\xd3\xb3G\x6\xdejo\xe8\xda\xe9\x31\xca\xaf\xba\x63J\xca\x19H\xda\x44" +"\xc2\xce\xf4\xd8\xbek\x19M\xb5 \xb5\xe2G\xaf\x46\xf3\x1e\xe8P}\xeb\x17" +"t\xabr\x81\xa3+\xd0\xfdnd9\xfe\xe6\xe9JI\xa8V~h\xd3\x15l\xb3\x42\x12\xea\x86\xb6" +"\xe9\x7f(fM\xad\xac\xf5\x17>d\xc7\xd3\x92\x37\xd0tK1_\xab{k\x85\xa6\xa2\x95Z\x8f" +"E\xeb\xff\xbd\x87\x9b\xda_|\xb3(\\rAP\x2x\xed\x45t\xe4\x64\xad\xb3\xd3\xf0\x7fZc" +"V\x8s\xab\xa6\xe7\xf9\xf3\xf5\xaf\xc5\x80\xd0o\xe0%K\xce\xa4\xda\x8a\xf4\xdf\xad" +"\x93\xb9\"]ck\xc\xadzDf\xd3\xel7\x8b].\x15\xe5J\r&\x86\xf9q\xb8\xa3\xa0K\xd4\x12" +"\xeaMYxK\xf7;{\x82\x15~9\x80V\xa4\x8f\xd3\x91gt \xdd\\\x85\xc3\xae\xd1G\x9\x87\x1f" +"\xa3\x19\xb5gx\x89\x2.\x1b;\x9e'\x17-\xee]\xf9\xaa`L\x98\x30|Wn)+\xbd\x17\x83k\xef" +"\x6\x8b\xe3\x41\x36S\x8e\xa7z\xd4\xa0\x0\x89O\xd8%\x1e\x99P\xfc\xc4\x1bp\xc2\xbe" +"\x93h\x15\x0V\xbc\xd4\x1b\xad\xb9\x1d\x89M\xa2\xf9\x8dY\x9b\xf2$\x12\xf\xc5\xa5p" +"(\xc8\xddU\x14\x8cx\x8a$\xf8\xfe\xb1\x9d\xa2\x37\xfc\xa4\x93\xa9\xa0\xe3\x13\xe3" +"{\xae Z\x0\x82\x9c\x9f}\xby\x3i\xf6\xcf[\x1cT\xf4\xef\xe3\x91xQ\xe9\xf6z)\xdd&M+" +"\xa0\xb1\xbd\xb0]\xe9\xc6\x89K0\xcf\x8d[-7\xa9`\xb2K\x14\xacR\xe9\x34!\xda]?.D\x84" +"\xd8p\xf3\x33\xce\x95\x44\xa9\xf5x\xed\xee\x46\xde\x93\x12[\xd6^\x5\x84=G\\d\xb2" +"\xfc\x3li\x9e\xec\xd9\xa1\xb5K\\\xa8\xc3|\x2\x36]\xfez\xfe\x91\x82\x4\xf6\xe4\x9" +"\xd2N\xf9.\x8a\xf2-\x13%\xf8K\xd3\x17\x16\xad\xd0\rS#\xd3M\xa1w\xb1\xdd\x37{w\xa5" +"\n\x8\xd8o\x13\x0\x0\x39\xbaN\x15\x1\xed\xabm\xdb\x0s\xbaxC\xe2/I\xf9<\x80\xbb}~" +"\x9\xa1,\xe\x9c*\xf0P\xfa\x39\xa8>\xcf\x87\xe6\x6r%zb\xafo6\x86\xaa\x17\xb0\xf2\x46" +"\xfc\xf1\xa1\x9\xcc/z*t\xec\xd6(I\xc7\x41\xd4]\x92\xbe\xb3\x86Kcw\xf6HXZr\x92\xf2" +"\x98\xcc\xcci\x8a\x96\xf4\xc8\x39\xed\xc7I_P\xb3$LY\xed*1" +"5\x9\xe2\x61\x32\xec)\x6p\x92\xc1%xqQ\x4\xdf\xf4\xcc\xe\x30\xec\x1d\xa6\xc1\x39\x61" +"\xb9\xf8\xb6\x8a\x88\x65\xfc\xab(\x9d\\\xba\x90M\x88\x91\xaa\x7f\xec{\xd5|\xb4\x18" +"<\xefU\xad|\xbd\xa7\x1\xd2\xcf\n\x38x\xc5*w\xe1\xe2,\xfc\xb4\xbf\x8f\xf5\xe3\xe0" +"\x83?M\xdeY\xf2\xe8\xa6\xdc^\xb9\xb6%\xf0ZeuD\\\xf9\x82g\xe4\x42\x6\x1d*\xd9\x9b" +"R\xccx\x9d\x1d\x8fi\x88\x43<\\\r\x1dKOQ\xf\x8cs\xf6\xbb\xa8\xe9)6.\xbf\x38\xd2l\x9b" +"\xe8\xae\xca\xec\x33\xf2h\xe2r]?Q\xcd\x32|H\xd2\xab\xc5.&[\xe6:*/\xc8tT\xae\x42\x0" +">\xb5\xa2\x8dl\xa5\xda-~\x8a\xbb\xb9\xe8\x43\x9bh>\x8e\x63\x1f.m\xa1\xf4\xb8\\\x4" +"\xd8\xbb\xb1s\xf,\xaa\x9\x1f\x1b\x1e\xef\x31\xe0\x8f\xa4\xdf\x9a\x9b\x9e\xb8\xc6" +"B\x1c\xd5\xbc\xc0\xf6\xde\xd6\x7f\xd1\x96\x17!:\x80\xd1\x80$\xaby\xf4\x8\xf7\xcf" +"\xe3hD\x83\x81\x9c\x85\xa0\x61\xc5;O\xe8S\xe3\x82\xa3\xa7w\x8f\xa4q\xa1\x96\xf2N" +"\x12K\x14\x36)\x92j$b\x0\x37\xe5\xf7>\xe2\x93\x1\x95\xe2\xec\xf4\xec\xd5\x34\x61" +"\xb5\xb7\xc5\xaa\x46\xc0`T\x13\x66?F\xec\xed\x8a" +">\x98\x33K\x9c*\xb4\x30\xf4\x35\xf7\x92\x17ht\xdf\x89\xf2\xf1g\\]5\xf\xa2\x17$\xa0" +"\xd2\xf1\x9ak$\xf8o\x85\x8d\n\xf6\x93M\x8f\xb8@\x16\xcf\xff%\x8b\xa1Y5\xa2\x61-O" +"\xa0m\xc5W\x95\x34\xc7\x19\x33$\xb2\x82\xa8\xf5\xa6z\x8cw\xee\xe3^\xcf/\xc7\x0Z=" +"\x8d]n\xd4\xa4\xe1\x9d\x38XH\xa8\xb9Z\xa6\x45\x45s\x81]\x1\x82\xf4\xc9:?\xac\xe7" +"-|,3\xce\xe1\x94\x99\xd1#*\xdf\xb7\x42\xe6!*l\x93\x66k\xc1\xda\xc3\xa4'\\\x12(\xab" +"\x98\xb9w\x98P\xea)\x1e\xdd\xa7\xbb\xf1K^,h\xaa&\xf1\xb8w\x92\n\xff\x9c\xa3\x7\x88" +"4\x87\x98\xb4\x42;9O\xad\x93[5\xe3\xd5\xe7\x12w\xec\x32\xb1\x42\xa3\x86\xa9o\xec" +"\xe1O\xb9m;1\xfb\x36\xb3\x64@\xa7\x1c-\x83\xc5\xda\x38\xc9\xfe\xdf\x38\x14\x8f|\xd5" +"\x87H\xbb&\x12\xbeKH\x95\xb0.\x8e\xb0\x9a[\xeuH\xcd\xe6\xc9\x39\xce\x88\x80\xeb\x89" +"\xb1\x9b>&\xf3T\xcb!\xad*1\xf8\xdbkIh?\xc7\xfdxP\xa8\x1fK\x80\x1b\xb9\xf1\x8h\x84" +"5\xa2\xb8\xff\x61v\x7\xc5p\xde\xfc\xe9\xc4Xj\xbd]\xa7\xcd*\x81\xc9<\x9eS\xc3\xec" +"\xc7\x9d\x63{\xe3\xd0\xd9\xf8\xb0\xb0\x82\x14\xaf)\xb7\xc5%\xc6\x41[\x89\xe0u\x9c" +"\\c\x89\xbf\x0\xd0\x1e\x88M\x9f\xf8k\x1b\xd3[\xa5\xd6y\xe8\xf\x93\xd2Y\xe8\x85\x88" +"\xc5\xef^\x81\xd8\x9a)\xb4\x81N\xf4\xa5L\xb3wP\x18/Pf-\xb8\xfb\xc2z\x3\xff\xb3\xd0" +"\xbc\xeb\xa5\xcc\xa6\x81\x5\xd5|,$k\x9\"+%\x92mSh\xe6'(\xac\xb1\xb9\x8f\xf5\x1e\xb1\xfej\x13\x8e\x66" +"\x3\x61\xca\xf8\xf3\x7M\xe1+q7\xdbH\x19\xbc\xa2\xb3\x94\x9\x63l\x8f\xf8\x36\x8c\x7" +"\xcc\x46TQ\x81\x8e~ro\x2\xc9\xdc\x80>\x1eS\xfa\x4\xde&\xccY\xb2K]\x86\xcd\x16\xa1" +"\xab~\xa7\x30:\xf8\xcb\xb2\xad|\xe3\x2V\x5,\xd4\xc3\xb0\x86\x44m\xb5\xbd\x86w\xa6" +"\xc8\xfd\xc1;\xfcx$#\xe9iLz`P\x1a\xde\x93\xa3\xc8g\xa5\x94\xc0L\xc0\xfb\x16&\xfd" +"\xe2\x84\xb5\x66\xea\x1eOo{y\xf4\xf2/\xe9\xc5\x86\xd2]\x8b@\xc0\xa4\x14{z+\xe2J\x83" +"\xaf\xa6_*\xdf\xf8\x16\xd6V\x19\x5-\x81\xc9\xcc\x87\xbesr3\xaa\x9\x16\xb9\xcc\x41" +"sn\xa4\x63\xfM\x10\xc0\x86z\xae\x5\x9f\"\xec\xbc\x38h\xed\xd1\x1fL\xc9}\xc4\x45\x81" +"\xc5.\xf5\xa5\x87\x9d\xa4\xe\x35\x62\x81\xbc\xe\x1er\xc0^\xf\x3\x9ag\x9f\xc\x13\x95" +"^oW\x7f\xb6\xe7\x8c\x94\x81\xe\xbc\x9cu\xd9Q\x9axh\xd4t\xb3-\x8a,b\xd7\xe8&0\x5\x93" +"%\xa9\xcd\x33\xd2\xca\x35\xd0\x36\x9b\xd4\\\xd6\xf1}\x83\xc2\xc3\x1r\x1b\xd3\xc9" +"\xc3Lh\xb0\xe7\x9\xdf\xe5\xb\x42\x8aO\x5\x17\x86\xab\x64\xf7\x7\xddNM\x8a\x7^\x6" +"W\"\xd5\xb6\x8e^\x90\x95\xc5\x18L\xd7\xc0\x12\x46\xcf\xc4\x18\xf7Y\x14\xf0\xa0\x1b" +"\x8\x8f\xff\xfa\xdf\x85\xc8I\x9c\xb1@\x8fs\x96\xb0\xd9K\xb]\xfe\x84\xe9\xa6\x19\xc5" +"^\x87$\n\x81\xaf\x16\xee\x89\x39\x84\xfe\x33\x1f\x15\xf5\x97\xcd<\x94\x15S?\x9bS" +"V>G\x8d\x8cj\x15\x9e\x42\x8a\x80m3\xf4\x61o\xfd\x81\x3\xad\"\x1a\x19\x84UG\x9{\xd9" +"\xf1\xb2\x34\xc1\xfe\xdc\xdc\xfa\r\x8f\xfe\xc3V\x13\x5\x15\xc5\xc5\x11\xfe\\[\xa8" +"\xd2_\xf6\x1e\x63ht\x1c\xc4\x66Y,\xd9 in\x96L\xfc\xb\xde\x1c^\xb\x1f\xba\xda\x15" +"\xb8q\xd8\xee\x1a\xd9K\xc4\xa4,\xbaj\xf0Rj\x6\x1d\x15\x35\xd8\xf3\xfbL\xfc\xf2I\xad" +"\xf9g.s\xa4\xafZ\xe3R\xb1\x91\x1]\xe3\x31\xdb\xff*\x88\x98\x39\xc4\xe\xa4\xd3\x15" +"\x81\x36\x4\xf4OoQ\x14M\x0\x14\xfbi\xfb\xc5\xd4\xd6M\x94\x86\xb7(]u3\xa7\x46P9 !" +"/\x1e\xe2\x8b\x61\xb9\xb4Oy\xe1]\xccQ\xfb\xfe\xdc\xb9\x1b\x9e\xab\x18\xbf\x94%%\xdf" +"\x15\xe6vD\xbdM\x5)\xfe\x44\x33\x31u\xed\x90\x9c\x6\xd6\xec\x35(\xf\xf1\x35K\xdc" +"\xfbP\x92\x95\xff\x31#\xe2\xa5\x31\x8yv\xenz\xf5\xb0\xd6\xfd\x44\xc1O\x82\xcaL\xa8" +"\x9f\xc4\x17qt^\x12\x90\xac\x86\x90\x9d\xcd\x89J6\xb\x9cT\x99\x39R,~T\xab\x92\xd1" +"\xcf\xb[\xdcL\xf8\xe9\xc8\xb9\xfdI\xb5\xf2\x46\xb6\xbbQ\xfb\xb8\x81\xebj\x11\x84" +"\xb2\x38:\xcf\xa9\xc8\x90}\xd7<\x8b\xe9\xa2\x0\xe5U\xf6t\xc7=\xe7\r\x9c\x17\x1e\xb3" +"\xa2\x13?\xc8\x5\x8c\x1a\x44\xad\xf8\xb1\x43\xac\xb4;9M\x14.\xed\x9f\xbe\xa7\xb0" +"\xcc;\xe9`\xe0\x38N\xf1\xdc\xf4\x9J\"\xe0\xb3\xb4\xb7;\x88\xec\xeQ\x83\xb2\x99o\xd9" +"\x6\xb9\xbf=\x12\xa8\x18\xc8\x17\xb1j\xfb\x99\xbf|\r\xe1\x91\xee\xf8\xae\xed\x90" +"\xfa\x13\x7f\xd2\xab\x84\xdc\x9d'\xe4\x97\x93^\xc1\xbeG\xd5\xb2U^\x98\xd1X\x6\x87" +"\xff\x82\xcb\xf0\xb9\xb7o\xe0sb\xc\xe3:$P\x9\\\xe8Y\xa8\x9eh\xa9M\x96\xfd\x9c\x8a" +"\xe0{\xb9\xd0`\x8ag\xc1}\xc1\\\xa2s\xc0\x13\xc8\x16\x15\xe\xed\x83\xd0?P.}\xbf \x8b" +"wH\x11z\xd5\x9b$\x18|`\xe4\xa4O\xac\\\x9dS\xca\x11\xa2\xf5\x42m.P7''\xc5v\x4&GH_" +"?\x6\xa7y\xc1\x1a\x39\x8e\xb9\x14@\xc7M\x85\x66T\x87\x10\x42\xa9v\xcdT\xf8\xf3\xe7" +"q\xac\x35\"j\x8b\xdd\xb8x\x84\xa1\xd7:\x88\x80\x19\xe1\x18\x45I]o5N$\xaf#\xa9\xcd" +"\xaf\xee\xba}Q|\xaf\xd8\x9cz7\x96\xee\xfc vF~[.\xf4\xa2\x44\xd2i\xfa\xd7\x41\xb2" +"KM\xde\xa4\xd5#t\xaeVUE\x7f\xa3\xfK\x8b\x1b\"\x11\nh\xbb\x90\x11\xf5^\xdf\xf5G\x83" +"\x82\xcf\xc3\xff\x17\xc3\xe5*7k\xe2\x95\xd3Ty \x12|\x96$|\x9c-\x6\x9e\xa9\xf1\n\x41" +"\xd2\x6\xe4[\"\x89\x1\xd8\xecG\xf2\x61TLK\xd1\x97\x46\x92\xecQ\x95\x83\x9a\x63\x8d" +"\xe4\x91\x2)\xf\xd0\x9f\x83\x1a\x1b[c\x98\xee\x8c#7\xb1\x8b\xa4~)\xd3\xa2(\xcc<\xf1" +"D}\xf2\xde\x31`\xb2\xf2\xea\x11\xeb\xd3\x43\r\x44\xd1v\xc1:Z\x87lk\xf1\x37\x65\xfb" +"/J\xa9\xe7\xe0\xad\x31\x1a:\x83.}N\xc3\xd0J\x15L\x4\xc5\xb\xdd~\x8\xc3)\xc0\xc6\x82" +"\xc5\x66i\xfdpM\xa7\xb4\xc4\xa5jP\xf5\xf`\xad\xc6\xa3\xf\x31T'\x6\xf8\x9/\xdf@`5" +"\x16{\xda\xfe\xf9\x81\x11\xe3\x9d=\x8b\xe1?\x5~DV,\x1b\x3\x31\x15\xc8\xc4\xad\xca" +"\xba\x90\xb7\xf7&[rg\x95,Qd\xe6\x8a\x44\x34\xb7hAx\xa1\xae\x46\xe7\xbf\x10\xe3\x44" +"\xab\x99y\x94\x61\xab\xae\x9e=NBM\xe0\xbd\x99\xa6l\xd3\xb0\xfa\xcf)\xef\x82H" +"\x91\x83\x31\x7n\xc4X\xa8_\x98\xcb\xb0\xfc\nxc\xe\x99\xdbz\xb0\xf1x\xc6)\xbbrlQ\x18" +"%\xcbr%\x14\xca\x36}\xcd\xd0g\xa7\x31\xc8\xedr2N\\\xf7\x15\xa1&\x2\xf6\xa4\x9f\x92" +"\x1f\x6\x32\x17_a^\x1d\x93\xbb\"V\x84\xb5\xf\x39\xb2me\xa0\x11\xe\x9e\xa4_\xabQv" +"?\xb7\x85\xe5\x5\x94+K\xe\r\x8d\xe2\x13V\xd5\x8c]\x87\xefiE}\xd4yD\xb3NK))<\xd5\x35" +"\xf7\xc2Zv+\xf2\x42\x33/\x12\x95]\xaa\xb\x4\xaf\x9b\xf\x1a\xe4\xbb\xcb-J\xbf\x16" +"7@8VmA\x9eq\xd8\xb9\xd9\x1a\xaf\x8b(8\xc3\xf6\x9dx\x2\xd9\x10\x1\x83~\xeai\xbeG\xf5" +"\x95\xf8\x64\xee\x3\xfe\"p\xe0UVh\xcq\x9a\xf\x33\xe2IS\xf7\xbb\xe3\r\x3\xc3\x1f\x88" +"\x12Z\x88\x8a\x9f\xc4t\x6W\x8cy\xddi\x9a\x9es\xae\xc1y\x97\x37N\xc9N\x9f\x1G\x0x" +"\x6@}\xf2\x13\xed\xf9\xfa\xe4W\xf3\x96\xe4\x3\x92\x91\xc2>\nT\xe6\xd0|(e#t\xa3g@" +"L:\x8cP\xa7N\xaaL\xee\xae\xa9\x8a\x5\xec\"\x0\x3\xa8\xf\x35\x65\xad\x5\x10\n\x39" +"|\x89\xde\xde\x62\x9b\xa9\xafg\xcd\xf1`\x8b\x8\xba\x1\xf6SD\xbd\x44\xb5\xd8\xa6U" +"\xe1\xfb\xd2R\x1b\xf\xac\x16\xb\xfb\x46()loq-\x98\xef\xef\xd2\x8c\xbe&1\xdcMS\xbd" +"\x91T\x83Xl\x96\x19\xc7\xa6\x65\xea$8w\xb4\xd3LU\rG:6\xf9\xc1\xdd\xab\xa8\x9a|rz" +"&%\xf7l\xc3\xd8sN\xfe\x91?\x4\xbfj\x9a\xba\x43Z\xb3,\xe2o!$\x99\xcbLN\x97\xda`+K" +"Q\xc3[#\x7f\x93>\xf5\x1e\x9\x1b\xea\xcb\x8e\n\xc2u\xb1\x43\x39\xe1\x32\x99\x37\x43" +"x\xff\xb3\xa0\xf2V\x91\xdd\x7f+\xee\xa5\xed\xb9\xbd\x15*\xdc\x86\xd0\x1f\xa3\xe9" +"\xac\xee\xf2\xee\xc4[\xd0\x16\xe2U\xdcX\xdf*\x9c\\\xd6J\x7\xb4\xbc\x41\xb\x37\xa1" +"7!\r\xcf!L0'\xd1\x87g&V}\x9cP\x92o\xf4U\x3\x91\x7\x9a\x2\xc7\xb4\x8|\x11\x8\xc5\x9" +"\xd8\x8fV\xdf\xcez\xc5\x97\x88\xea\x14\xa4/\xc6\x94\x19\x88*\x86\x9c\x62Ta\x88\x43" +"y\xf\x98qC\xa6\xba\x0`\x82\x97\x39\xcb\xe2\x13\xe3\x1\x94\xf2\x1d\x1-\xce\xd3\x4" +"G\x8G\xed\xc+\x8fY\x7f\xf\xd5p\xeb\x4\x41\xc3\xa1S\x84\x30\x9d\xd8?.\xef\xd3\xd2" +"v\x9\xdd\x9\xc\x5W9\x1a\x4\xbb\xf9\x11\n\xfd\xd0\r\xd5\x84\xbe\xbb\xcb\x42P\x17M" +"u\x3\xd8\x61\xb\xec\xa0\xae\x95\xaa\xba\x34\xa3\n\xbb~\xce\xf6\x8e\x10vj\xda\xc8" +"\x1a(\x14\x5\x1bOHDx\xc6k94\x84\x36hvp\x18_\x17\x17\xf8M\xa0\x62\xd4\x8f\xe0w,\x98" +"g\x13\xee\xc9\xfbZ\xf2\xdf\x8d\xda\x8d\xbdv\xaa\xcb\x89\x82\x17\x61\xf7op\xbc\x34" +"\xc9\x37vo\x16\xf0\xeX\x98\xea\x15\x31\xe8\xb4\xb4\xff\x65\xea\x1\x89\xa8\xea\xb7" +":\x3\x8\x9e ^y\x1a\x65SJ\xc9\x91\x13\xf9u\xeaR#\xb4\x38\x88\x41\xe3\x80\x1\x14\x2" +"\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" +"000000000000000000000000000000000000000000000\r000000000000000000000000000000000" +"0000000000000000000000000000000\r00000000000000000000000000000000000000000000000" +"00000000000000000\r0000000000000000000000000000000000000000000000000000000000000" +"000\r0000000000000000000000000000000000000000000000000000000000000000\r000000000" +"0000000000000000000000000000000000000000000000000000000\r00000000000000000000000" +"00000000000000000000000000000000000000000\r0000000000000000000000000000000000000" +"000000000000000000000000000\rcleartomark\n\x80\x3" +; +int s050000l_afm_len = 9686; +char* s050000l_afm = +"StartFontMetrics 3.0\nComment Copyright URW Software, Copyright 1997 by URW\nCom" +"ment Creation Date: 10/21/1999\nComment See the file COPYING (GNU General Public" +" License) for license conditions.\nFontName StandardSymL\nFullName Standard Symb" +"ols L\nFamilyName Standard Symbols L\nWeight Regular\nItalicAngle 0.0\nIsFixedPi" +"tch false\nUnderlinePosition -229\nUnderlineThickness 46\nVersion 001.005\nNotic" +"e URW Software, Copyright 1997 by URW\nEncodingScheme FontSpecific\nFontBBox -18" +"0 -293 1090 1010\nCapHeight 673\nXHeight 500\nDescender -222\nAscender 673\nStar" +"tCharMetrics 190\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N excla" +"m ; B 128 -13 240 686 ;\nC 34 ; WX 713 ; N universal ; B 31 0 681 673 ;\nC 35 ; " +"WX 500 ; N numbersign ; B 20 0 481 631 ;\nC 36 ; WX 549 ; N existential ; B 25 0" +" 478 673 ;\nC 37 ; WX 833 ; N percent ; B 63 -7 771 673 ;\nC 38 ; WX 778 ; N amp" +"ersand ; B 41 -13 750 675 ;\nC 39 ; WX 439 ; N suchthat ; B 48 -13 414 503 ;\nC " +"40 ; WX 333 ; N parenleft ; B 53 -172 300 680 ;\nC 41 ; WX 333 ; N parenright ; " +"B 30 -172 277 680 ;\nC 42 ; WX 500 ; N asteriskmath ; B 65 127 427 546 ;\nC 43 ;" +" WX 549 ; N plus ; B 10 0 539 533 ;\nC 44 ; WX 250 ; N comma ; B 56 -120 194 102" +" ;\nC 45 ; WX 549 ; N minus ; B 11 239 535 294 ;\nC 46 ; WX 250 ; N period ; B 6" +"9 -13 181 100 ;\nC 47 ; WX 278 ; N slash ; B 0 0 254 673 ;\nC 48 ; WX 500 ; N ze" +"ro ; B 23 -13 471 686 ;\nC 49 ; WX 500 ; N one ; B 117 0 390 673 ;\nC 50 ; WX 50" +"0 ; N two ; B 25 0 475 686 ;\nC 51 ; WX 500 ; N three ; B 39 -13 435 686 ;\nC 52" +" ; WX 500 ; N four ; B 16 0 469 680 ;\nC 53 ; WX 500 ; N five ; B 29 -13 443 699" +" ;\nC 54 ; WX 500 ; N six ; B 36 -13 468 685 ;\nC 55 ; WX 500 ; N seven ; B 24 -" +"7 448 673 ;\nC 56 ; WX 500 ; N eight ; B 54 -13 440 686 ;\nC 57 ; WX 500 ; N nin" +"e ; B 31 -13 460 686 ;\nC 58 ; WX 278 ; N colon ; B 81 -13 193 463 ;\nC 59 ; WX " +"278 ; N semicolon ; B 83 -120 221 463 ;\nC 60 ; WX 549 ; N less ; B 26 0 523 522" +" ;\nC 61 ; WX 549 ; N equal ; B 11 142 537 391 ;\nC 62 ; WX 549 ; N greater ; B " +"26 0 523 522 ;\nC 63 ; WX 444 ; N question ; B 70 -13 412 686 ;\nC 64 ; WX 549 ;" +" N congruent ; B 11 0 537 475 ;\nC 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;\nC 66" +" ; WX 667 ; N Beta ; B 29 0 592 673 ;\nC 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;\n" +"C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC 69 ; WX 611 ; N Epsilon ; B 32 0 61" +"7 673 ;\nC 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;\nC 71 ; WX 603 ; N Gamma ; B 2" +"4 0 609 673 ;\nC 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;\nC 73 ; WX 333 ; N Iota " +"; B 32 0 316 673 ;\nC 74 ; WX 631 ; N theta1 ; B 18 -13 623 686 ;\nC 75 ; WX 722" +" ; N Kappa ; B 35 0 722 673 ;\nC 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;\nC 77 " +"; WX 889 ; N Mu ; B 28 0 887 673 ;\nC 78 ; WX 722 ; N Nu ; B 29 0 720 673 ;\nC 7" +"9 ; WX 722 ; N Omicron ; B 41 -13 715 686 ;\nC 80 ; WX 768 ; N Pi ; B 25 0 745 6" +"73 ;\nC 81 ; WX 741 ; N Theta ; B 41 -13 715 686 ;\nC 82 ; WX 556 ; N Rho ; B 28" +" 0 563 673 ;\nC 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;\nC 84 ; WX 611 ; N Tau ;" +" B 33 0 607 673 ;\nC 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;\nC 86 ; WX 439 ;" +" N sigma1 ; B 40 -222 436 513 ;\nC 87 ; WX 768 ; N Omega ; B 34 0 736 686 ;\nC 8" +"8 ; WX 645 ; N Xi ; B 40 0 599 673 ;\nC 89 ; WX 795 ; N Psi ; B 15 0 781 686 ;\n" +"C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;\nC 91 ; WX 333 ; N bracketleft ; B 86 " +"-165 299 673 ;\nC 92 ; WX 863 ; N therefore ; B 163 -13 701 433 ;\nC 93 ; WX 333" +" ; N bracketright ; B 33 -165 246 673 ;\nC 94 ; WX 658 ; N perpendicular ; B 15 " +"0 652 673 ;\nC 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;\nC 96 ; WX 500 " +"; N radicalex ; B 480 857 1090 913 ;\nC 97 ; WX 631 ; N alpha ; B 41 -13 622 513" +" ;\nC 98 ; WX 549 ; N beta ; B 61 -222 515 740 ;\nC 99 ; WX 549 ; N chi ; B 12 -" +"210 522 513 ;\nC 100 ; WX 494 ; N delta ; B 40 -13 481 740 ;\nC 101 ; WX 439 ; N" +" epsilon ; B 22 -13 427 513 ;\nC 102 ; WX 521 ; N phi ; B 27 -222 490 686 ;\nC 1" +"03 ; WX 411 ; N gamma ; B 5 -219 484 513 ;\nC 104 ; WX 603 ; N eta ; B 0 -222 52" +"7 513 ;\nC 105 ; WX 329 ; N iota ; B 0 -13 301 513 ;\nC 106 ; WX 603 ; N phi1 ; " +"B 36 -222 587 513 ;\nC 107 ; WX 549 ; N kappa ; B 33 0 558 513 ;\nC 108 ; WX 549" +" ; N lambda ; B 24 -13 548 740 ;\nC 109 ; WX 576 ; N mu ; B 33 -219 567 500 ;\nC" +" 110 ; WX 521 ; N nu ; B -9 -13 475 513 ;\nC 111 ; WX 549 ; N omicron ; B 35 -13" +" 501 513 ;\nC 112 ; WX 549 ; N pi ; B 10 -13 530 500 ;\nC 113 ; WX 521 ; N theta" +" ; B 43 -13 485 686 ;\nC 114 ; WX 549 ; N rho ; B 50 -220 490 513 ;\nC 115 ; WX " +"603 ; N sigma ; B 30 -13 588 500 ;\nC 116 ; WX 439 ; N tau ; B 10 -13 418 500 ;\n" +"C 117 ; WX 576 ; N upsilon ; B 7 -13 535 513 ;\nC 118 ; WX 713 ; N omega1 ; B 12" +" -13 671 583 ;\nC 119 ; WX 686 ; N omega ; B 42 -13 684 513 ;\nC 120 ; WX 493 ; " +"N xi ; B 27 -222 469 766 ;\nC 121 ; WX 686 ; N psi ; B 12 -222 701 513 ;\nC 122 " +"; WX 494 ; N zeta ; B 60 -222 467 756 ;\nC 123 ; WX 480 ; N braceleft ; B 58 -16" +"5 397 673 ;\nC 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;\nC 125 ; WX 480 ; N br" +"aceright ; B 79 -165 418 673 ;\nC 126 ; WX 549 ; N similar ; B 17 196 529 325 ;\n" +"C 160 ; WX 762 ; N Euro ; B 53 -4 722 671 ;\nC 161 ; WX 620 ; N Upsilon1 ; B -2 " +"0 610 687 ;\nC 162 ; WX 247 ; N minute ; B 27 476 228 735 ;\nC 163 ; WX 549 ; N " +"lessequal ; B 29 0 526 639 ;\nC 164 ; WX 167 ; N fraction ; B -180 0 340 673 ;\n" +"C 165 ; WX 713 ; N infinity ; B 26 115 688 414 ;\nC 166 ; WX 500 ; N florin ; B " +"2 -174 494 687 ;\nC 167 ; WX 753 ; N club ; B 86 -26 660 544 ;\nC 168 ; WX 753 ;" +" N diamond ; B 142 -36 600 550 ;\nC 169 ; WX 753 ; N heart ; B 117 -33 631 528 ;" +"\nC 170 ; WX 753 ; N spade ; B 113 -36 629 591 ;\nC 171 ; WX 1042 ; N arrowboth " +"; B 24 -16 1024 512 ;\nC 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;\nC 173 " +"; WX 603 ; N arrowup ; B 45 0 571 910 ;\nC 174 ; WX 987 ; N arrowright ; B 49 -1" +"5 959 511 ;\nC 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;\nC 176 ; WX 400 ;" +" N degree ; B 50 380 350 686 ;\nC 177 ; WX 549 ; N plusminus ; B 10 0 539 662 ;\n" +"C 178 ; WX 411 ; N second ; B 20 476 413 735 ;\nC 179 ; WX 549 ; N greaterequal " +"; B 29 0 526 639 ;\nC 180 ; WX 549 ; N multiply ; B 17 9 533 525 ;\nC 181 ; WX 7" +"13 ; N proportional ; B 27 114 639 416 ;\nC 182 ; WX 494 ; N partialdiff ; B 26 " +"-10 462 753 ;\nC 183 ; WX 460 ; N bullet ; B 50 155 410 518 ;\nC 184 ; WX 549 ; " +"N divide ; B 10 2 536 525 ;\nC 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;\nC" +" 186 ; WX 549 ; N equivalence ; B 14 87 538 446 ;\nC 187 ; WX 549 ; N approxequa" +"l ; B 14 121 527 408 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -13 889 100 ;\nC 18" +"9 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;\nC 190 ; WX 1000 ; N arrowhor" +"izex ; B -60 220 1050 276 ;\nC 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 62" +"9 ;\nC 192 ; WX 823 ; N aleph ; B 175 0 662 689 ;\nC 193 ; WX 686 ; N Ifraktur ;" +" B 10 -54 578 736 ;\nC 194 ; WX 795 ; N Rfraktur ; B 26 -16 759 730 ;\nC 195 ; W" +"X 987 ; N weierstrass ; B 159 -211 870 574 ;\nC 196 ; WX 768 ; N circlemultiply " +"; B 43 0 733 691 ;\nC 197 ; WX 768 ; N circleplus ; B 43 0 733 689 ;\nC 198 ; WX" +" 823 ; N emptyset ; B 39 -24 781 718 ;\nC 199 ; WX 768 ; N intersection ; B 40 0" +" 732 507 ;\nC 200 ; WX 768 ; N union ; B 40 -18 732 489 ;\nC 201 ; WX 713 ; N pr" +"opersuperset ; B 20 0 673 470 ;\nC 202 ; WX 713 ; N reflexsuperset ; B 20 -125 6" +"73 470 ;\nC 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;\nC 204 ; WX 713 ; N " +"propersubset ; B 37 0 690 470 ;\nC 205 ; WX 713 ; N reflexsubset ; B 37 -125 690" +" 470 ;\nC 206 ; WX 713 ; N element ; B 45 0 505 470 ;\nC 207 ; WX 713 ; N notele" +"ment ; B 45 -58 505 555 ;\nC 208 ; WX 768 ; N angle ; B 26 -1 738 672 ;\nC 209 ;" +" WX 713 ; N gradient ; B 36 0 681 687 ;\nC 210 ; WX 790 ; N registerserif ; B 50" +" -13 740 690 ;\nC 211 ; WX 790 ; N copyrightserif ; B 51 -13 741 690 ;\nC 212 ; " +"WX 890 ; N trademarkserif ; B 18 269 855 673 ;\nC 213 ; WX 823 ; N product ; B 2" +"5 -124 803 751 ;\nC 214 ; WX 549 ; N radical ; B 10 -35 515 913 ;\nC 215 ; WX 25" +"0 ; N dotmath ; B 69 209 169 311 ;\nC 216 ; WX 713 ; N logicalnot ; B 15 40 680 " +"367 ;\nC 217 ; WX 603 ; N logicaland ; B 23 -1 583 476 ;\nC 218 ; WX 603 ; N log" +"icalor ; B 30 -1 578 476 ;\nC 219 ; WX 1042 ; N arrowdblboth ; B 27 -19 1023 506" +" ;\nC 220 ; WX 987 ; N arrowdblleft ; B 30 -19 939 506 ;\nC 221 ; WX 603 ; N arr" +"owdblup ; B 39 0 567 909 ;\nC 222 ; WX 987 ; N arrowdblright ; B 45 -19 954 506 " +";\nC 223 ; WX 603 ; N arrowdbldown ; B 44 0 572 909 ;\nC 224 ; WX 494 ; N lozeng" +"e ; B 18 -1 466 740 ;\nC 225 ; WX 329 ; N angleleft ; B 25 -152 306 757 ;\nC 226" +" ; WX 790 ; N registersans ; B 50 -12 740 679 ;\nC 227 ; WX 790 ; N copyrightsan" +"s ; B 49 -12 739 679 ;\nC 228 ; WX 786 ; N trademarksans ; B 5 277 725 673 ;\nC " +"229 ; WX 713 ; N summation ; B 14 -123 695 752 ;\nC 230 ; WX 384 ; N parenlefttp" +" ; B 40 -293 436 926 ;\nC 231 ; WX 384 ; N parenleftex ; B 40 -79 92 925 ;\nC 23" +"2 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ;\nC 233 ; WX 384 ; N bracketleft" +"tp ; B 0 -80 341 926 ;\nC 234 ; WX 384 ; N bracketleftex ; B 0 -85 55 925 ;\nC 2" +"35 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ;\nC 236 ; WX 494 ; N braceleftt" +"p ; B 201 -75 439 926 ;\nC 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ;\nC" +" 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ;\nC 239 ; WX 494 ; N braceex " +"; B 201 -79 255 925 ;\nC 241 ; WX 329 ; N angleright ; B 21 -152 302 757 ;\nC 24" +"2 ; WX 274 ; N integral ; B 2 -107 291 916 ;\nC 243 ; WX 686 ; N integraltp ; B " +"332 -83 715 922 ;\nC 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;\nC 245 ; " +"WX 686 ; N integralbt ; B 39 -81 415 921 ;\nC 246 ; WX 384 ; N parenrighttp ; B " +"54 -293 450 926 ;\nC 247 ; WX 384 ; N parenrightex ; B 398 -70 450 935 ;\nC 248 " +"; WX 384 ; N parenrightbt ; B 54 -293 450 926 ;\nC 249 ; WX 384 ; N bracketright" +"tp ; B 22 -80 360 926 ;\nC 250 ; WX 384 ; N bracketrightex ; B 305 -85 360 925 ;" +"\nC 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ;\nC 252 ; WX 494 ; N bra" +"cerighttp ; B 17 -75 255 926 ;\nC 253 ; WX 494 ; N bracerightmid ; B 201 -85 442" +" 935 ;\nC 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ;\nC -1 ; WX 250 ; N " +".notdef ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n" +; +int s050000l_pfb_len = 33709; +char* s050000l_pfb = +"\x80\x1\xfb\x15\x0\x0%!PS-AdobeFont-1.0: StandardSymL 001.005\n%%CreationDate: T" +"hu Oct 21 1999\n% Copyright URW Software, Copyright 1997 by URW\n% URW Software," +" Copyright 1997 by URW\n% See the file COPYING (GNU General Public License) for " +"license conditions.\n% As a special exception, permission is granted to include " +"this font\n% program in a Postscript or PDF file that consists of a document tha" +"t\n% contains text to be displayed or printed using this font, regardless\n% of " +"the conditions or license applying to the document itself.\n12 dict begin\n/Font" +"Info 10 dict dup begin\n/version (001.005) readonly def\n/Notice (URW Software, " +"Copyright 1997 by URW. See the file COPYING (GNU General Public License) for lic" +"ense conditions. As a special exception, permission is granted to include this f" +"ont program in a Postscript or PDF file that consists of a document that contain" +"s text to be displayed or printed using this font, regardless of the conditions " +"or license applying to the document itself.) readonly def\n/Copyright (Copyright" +" URW Software, Copyright 1997 by URW) readonly def\n/FullName (Standard Symbols " +"L) readonly def\n/FamilyName (Standard Symbols L) readonly def\n/Weight (Regular" +") readonly def\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePositio" +"n -229 def\n/UnderlineThickness 46 def\nend readonly def\n/FontName /StandardSym" +"L def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-180 -293 1090 1010} readonly " +"def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/E" +"ncoding 256 array \n0 1 255 {1 index exch /.notdef put} for \ndup 32 /space put\n" +"dup 33 /exclam put\ndup 34 /universal put\ndup 35 /numbersign put\ndup 36 /exist" +"ential put\ndup 37 /percent put\ndup 38 /ampersand put\ndup 39 /suchthat put\ndu" +"p 40 /parenleft put\ndup 41 /parenright put\ndup 42 /asteriskmath put\ndup 43 /p" +"lus put\ndup 44 /comma put\ndup 45 /minus put\ndup 46 /period put\ndup 47 /slash" +" put\ndup 48 /zero put\ndup 49 /one put\ndup 50 /two put\ndup 51 /three put\ndup" +" 52 /four put\ndup 53 /five put\ndup 54 /six put\ndup 55 /seven put\ndup 56 /eig" +"ht put\ndup 57 /nine put\ndup 58 /colon put\ndup 59 /semicolon put\ndup 60 /less" +" put\ndup 61 /equal put\ndup 62 /greater put\ndup 63 /question put\ndup 64 /cong" +"ruent put\ndup 65 /Alpha put\ndup 66 /Beta put\ndup 67 /Chi put\ndup 68 /Delta p" +"ut\ndup 69 /Epsilon put\ndup 70 /Phi put\ndup 71 /Gamma put\ndup 72 /Eta put\ndu" +"p 73 /Iota put\ndup 74 /theta1 put\ndup 75 /Kappa put\ndup 76 /Lambda put\ndup 7" +"7 /Mu put\ndup 78 /Nu put\ndup 79 /Omicron put\ndup 80 /Pi put\ndup 81 /Theta pu" +"t\ndup 82 /Rho put\ndup 83 /Sigma put\ndup 84 /Tau put\ndup 85 /Upsilon put\ndup" +" 86 /sigma1 put\ndup 87 /Omega put\ndup 88 /Xi put\ndup 89 /Psi put\ndup 90 /Zet" +"a put\ndup 91 /bracketleft put\ndup 92 /therefore put\ndup 93 /bracketright put\n" +"dup 94 /perpendicular put\ndup 95 /underscore put\ndup 96 /radicalex put\ndup 97" +" /alpha put\ndup 98 /beta put\ndup 99 /chi put\ndup 100 /delta put\ndup 101 /eps" +"ilon put\ndup 102 /phi put\ndup 103 /gamma put\ndup 104 /eta put\ndup 105 /iota " +"put\ndup 106 /phi1 put\ndup 107 /kappa put\ndup 108 /lambda put\ndup 109 /mu put" +"\ndup 110 /nu put\ndup 111 /omicron put\ndup 112 /pi put\ndup 113 /theta put\ndu" +"p 114 /rho put\ndup 115 /sigma put\ndup 116 /tau put\ndup 117 /upsilon put\ndup " +"118 /omega1 put\ndup 119 /omega put\ndup 120 /xi put\ndup 121 /psi put\ndup 122 " +"/zeta put\ndup 123 /braceleft put\ndup 124 /bar put\ndup 125 /braceright put\ndu" +"p 126 /similar put\ndup 161 /Upsilon1 put\ndup 160 /Euro put\ndup 162 /minute pu" +"t\ndup 163 /lessequal put\ndup 164 /fraction put\ndup 165 /infinity put\ndup 166" +" /florin put\ndup 167 /club put\ndup 168 /diamond put\ndup 169 /heart put\ndup 1" +"70 /spade put\ndup 171 /arrowboth put\ndup 172 /arrowleft put\ndup 173 /arrowup " +"put\ndup 174 /arrowright put\ndup 175 /arrowdown put\ndup 176 /degree put\ndup 1" +"77 /plusminus put\ndup 178 /second put\ndup 179 /greaterequal put\ndup 180 /mult" +"iply put\ndup 181 /proportional put\ndup 182 /partialdiff put\ndup 183 /bullet p" +"ut\ndup 184 /divide put\ndup 185 /notequal put\ndup 186 /equivalence put\ndup 18" +"7 /approxequal put\ndup 188 /ellipsis put\ndup 189 /arrowvertex put\ndup 190 /ar" +"rowhorizex put\ndup 191 /carriagereturn put\ndup 192 /aleph put\ndup 193 /Ifrakt" +"ur put\ndup 194 /Rfraktur put\ndup 195 /weierstrass put\ndup 196 /circlemultiply" +" put\ndup 197 /circleplus put\ndup 198 /emptyset put\ndup 199 /intersection put\n" +"dup 200 /union put\ndup 201 /propersuperset put\ndup 202 /reflexsuperset put\ndu" +"p 203 /notsubset put\ndup 204 /propersubset put\ndup 205 /reflexsubset put\ndup " +"206 /element put\ndup 207 /notelement put\ndup 208 /angle put\ndup 209 /gradient" +" put\ndup 210 /registerserif put\ndup 211 /copyrightserif put\ndup 212 /trademar" +"kserif put\ndup 213 /product put\ndup 214 /radical put\ndup 215 /dotmath put\ndu" +"p 216 /logicalnot put\ndup 217 /logicaland put\ndup 218 /logicalor put\ndup 219 " +"/arrowdblboth put\ndup 220 /arrowdblleft put\ndup 221 /arrowdblup put\ndup 222 /" +"arrowdblright put\ndup 223 /arrowdbldown put\ndup 224 /lozenge put\ndup 225 /ang" +"leleft put\ndup 226 /registersans put\ndup 227 /copyrightsans put\ndup 228 /trad" +"emarksans put\ndup 229 /summation put\ndup 230 /parenlefttp put\ndup 231 /parenl" +"eftex put\ndup 232 /parenleftbt put\ndup 233 /bracketlefttp put\ndup 234 /bracke" +"tleftex put\ndup 235 /bracketleftbt put\ndup 236 /bracelefttp put\ndup 237 /brac" +"eleftmid put\ndup 238 /braceleftbt put\ndup 239 /braceex put\ndup 241 /anglerigh" +"t put\ndup 242 /integral put\ndup 243 /integraltp put\ndup 244 /integralex put\n" +"dup 245 /integralbt put\ndup 246 /parenrighttp put\ndup 247 /parenrightex put\nd" +"up 248 /parenrightbt put\ndup 249 /bracketrighttp put\ndup 250 /bracketrightex p" +"ut\ndup 251 /bracketrightbt put\ndup 252 /bracerighttp put\ndup 253 /bracerightm" +"id put\ndup 254 /bracerightbt put\nreadonly def\n/UniqueID 5021339 def\ncurrentd" +"ict end\ncurrentfile eexec\r\x80\x2\x8ak\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9" +"\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K" +"\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88" +"\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3" +"\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2" +"P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81" +"\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x13\xe5\x92" +"v\x17\xae\x7f$zq\xce\xc}V\xaf\xd7]\x85\xed-\x9f \xff\x9al8\xe8\xd5 Q\x97\xd0\x87" +"\x80\x18\xc\xca\x9c\x35R+\x16\x9\xb5\x1rMMd\x0\x16\x9b\x91\xbc\xebjM\xe0\n\xfcx\x1c" +"\xf8\x87\x30\x12\xb3\x11}\"\xa1\x85\x87\x89UC\xdb\xc2\xa1\xff\xc7u#v\xde\xcdL\x92" +"\xa6\x91\"\x42X\xe8\xf8\xf1\x13\xf2\xa5\xcb=\x8d\xa1\xf\xe8#\xc6\x65j\x88\x0\xcb" +"\xc7\xff\xd0\x18\xa2\x8a\xc2\x88_5\xe2.\xf9\xfbT\x9b\x0\xe2=1\xbb\xa3\x4\xdd\x9c" +"(\xdf\x2\xa8\xc3p\xceI\xc5\x8a@\xc9\xf6s\xad\x61\xf5\xab\xee\x9d\x62\xeb\xacY\xb" +"ZD\xf2\xba\xbd\x96\xe1\x37\x46M\xb0\x66\xb6\x2\xa5\xd8\xd4>\xd0\x41\xb7\x80\xf0\xfb" +"\x98\xf9\x95/ \xad\x80\x84\x19\x9a\xdf\xee\x9e\xcb\x19<\x1\x87r\xe6:Z\x83\xbb\x6" +"\x0\x96/\xe7$\xf6\x33Q\xb4\xb7\xa1\x64\x12t:\xd1J8A\x88wv\x8a\xf4#\xe3\x34\x8dH\xed" +"w<.\x87\x62L\xfe\xf7w\xa1[hr\xf5\x44\x88\xe4,HI\xaemT\xcb\x85}\xc0\x97.\x1bW\xc8" +"\x8f@\xb8\x99(\xea\x43\xc1\x8d\xbcs\x18/i\xb5/\xb\xd6kq3\x88\x16vaj\xb6ir2@\xf1}" +"^\xaa\xa2|\x8e)Xb(\x8d\xc3\x9\x18\xd0\x0\x8\xc9Y*Q\xf3\x9e\x30\xdd\xc4\x62\xf6(v" +"T\xec\xcc\x13\xfb\x95%\xf6\xea\xc5p\x9e\x95/\xb2\x37\xe8\xcb\x8p\xca\xc5\xdd\xc1" +"=\xa5\x8d\xbd\x6\r\x31\x93\xfc\x92\xe6\xc4\xce\xf3\xbc\xfd\x81\xcek6y\xbf\xc5\x85" +"W\x96\xcd\xfa\x8a&\xd6:e\x9a/\xf7\xa1\xa7\xe3\x18\xa7\xf7o\xf8\xe\x84j-d}8\xe8'\xff" +"\xafT\xbdZ\x92!\xee\xb4\x16\xa4u\xea\xbfN\xf0@\x9b<\xc1Pw\xe0\x1ft,F\xed\x43\xca" +"r\x92L2\xe4\x8axb$c9f\x80\xca\xc3\x63@lRJ\x9b;v\x8c\xd5\xa6\x89&C\xf7\x8b|\xd6\\" +"a\xe\xbf\xeb\xd1\x5\x8d\xfe\xeag\xd8\xa9\xb9\xaf\xd9\xbf\x39\x3:V\x85\x65\x37\xc0" +"ou\xba\xb0\xa4py\xdf\xf6L\xf7\x34<\xd6\xe7\xfe{\xb1\xfb\xce\xe3'I\xc9\x14\x35\xcb" +"\x86\xf7U\rP\\\x81\xde\xff\xbe\x1e:\x1f\x63\x4\xdd\x3\xcd \x84+3]\x7f\xcen\xb3\x1f" +"\x17W$\xd5\x1c\x18H\x0\xc3um\xb0\x44\xe2\xfe\x4\xbfS\xe9\x95\xfb\x42Z\xac\x96\xfc" +"\xef\x38L\x93\x3\x34\xb5\xf3\x84Sl\xb3\xab\xd9\x84G\x84K\xab\xf0L\xa7g\xed\xb7\x7" +"\x86\x13,yl\xc2\xf6S\x8R'Z\xb4\xdf\xc\x8bM.\xae\x1\x38\xe\xd2Nb\xf5\xa8]\xc8\x34" +"]Ulg\xf0\xf\x62-2\xdd\x66\xfe\x18!\x91i\xda\xca\x37\x44\xa8\x19\xcf\xac\xc3\x5\xfc" +"\xa9G\x1a\r\xe5\x93n'\xe;-N\x12\x11\xd9\xda\x8d\xe2ny\xcoV\xc2\xce\x8b\x19\xe1u%" +"n\x8b\xf8[\x8eR\xdb}\xa8\xc4O\xe5.W\xafH\xde\x9bw\x16X\x13\x9bk\x81\xb3`\x92\xec" +"\xe2\xb6)\xc0\xf6M1\xd6-\xc7\xd4\"\xc2\xa2\x4\xbc\x4\x14\xccox\xf4\xe9u\xbf\x8f'" +"\xa1|\xc3\xb3[1\xed\x31;Rt\xf4\x87\xa9.\xbb\x33\xb0*\xf4r\xeb\xd8LK\x1b@\x6\xe5\xc5" +"\"\x8aor\"\xda\xb4\x90%\x9d\xe2\"?L\xbc\xdd\x0jeI\xf0\x80\x85\xea\xea\xe5\x1eM{\x8" +"\xac\xc8\xb0\x8e\x8f\x98\xdb\xf7\x9e\xd4\"\x1\x32\xa7U\xc0\x7\x36\x66\x0\xfc'\xe0" +"\xba\xdds\xc8u\x7Ko!\x1d\xa0_\xf1\x45G0\xf3\xdd\xfe\x96\xd3l\xa1/\x82I\xcb\xe7L\x82" +"\xa9@\xf1\xd6\x2\x5\xcd\x96$\xae\xb7\x82M[\n\x15x\xeb?\xd4_\xfd\xb9~f\xbf\xf\xaa" +"'\xbc%\xe6\x31\xc2\x6t\xe7\xd6\xdb^L\xc7\xb1\xf:ws\x1a\xa3\xa5:\x18~R\x11\xda\x39" +"\xf2\xe9|\x2\x36\xe3o\x87\x14\xc4\x9d\x63\xen\x1f\xb4\"\x6\xca\xd9\x36\x17\x94\xa9" +"\xe0\x2\x36\x9c\xcc\x65\x87\xf9\xa4\xcb\xce\\\xfd\xe2\x66V\xdd\x8a\x36\x66<\xa8." +"\xfc\x1e\x93\xccX\x86>:)\x0\x90\x90\x62 \x92?TN\x8c\xa0^\\\x83w$\xaf\xc6t\xe6\x0" +"\x82x\xfc\xc6\x96\x46,\xd7\x98j\xa3\xb8\x84\xed\\\x17\xf9\xd0\x35\xb9\xa1\xa1i\xd9" +"\xf8\xf2\x88u\xf7\xe5\xd7\xba\xb3\x46h\xb6\x1d\x2ow\xe3rw\xd5>\x9e\x4g\x15/j\xc7" +"\xabV\xae\x92\x6\xf1Qws.\xad{*\x0\x37\x99\x86'r\xb2\x41\xd6X\x18\xc0\xd2\xd6\xc5" +"?\xd0\x94\\\xaa\x17\x19\xdb\x44o|\xe5\xc3\x83\xf2\x8b\xb1\xf4\x19\xf0#\xf3\xde\xf2" +"\x4\xe8\x95\xb8\x5t\x7\x64\x8e\xfe\x19s\xdc\x8f{\x8c\x17\xab\xaa\x17\x16\xabi\xf3" +"\xbf\x5u\xf5\x64\xc3@\xf\xb5[\xc4\x30\xf4U\xb2\x66\x87\x1eui\xc3\x9a\x81\xbd\xb0" +"\x82\xfaQ4#\x92r\xf9\xd6\x9d/[\xe4\x93)%U\xa5\x11Z\r\xbd\xf3\r\xa7\x1b\xdd\xa4\x18" +"\xcdXu\xbf,\xc\xcf\x0\xe2\x36\xf2\xc9pV\xb1\x2\xe8\xe0\x14\xc2\xc1\x18\xa7l\xf7\x9c" +"\x10\xfe)!\xd3 \"\xb8\xf9\x64\x43\xbf\xa1\xb3\x41\x89\xe5\xc5\xab\xcf\xecQ\xad \xcc" +"E\x8\xacSvi\xb\xcf\xe0\x1d\xc8\xf9$\xfa\x19\no\x12\x95\xc1\\t\xdd\xad^\x9c@G\xad" +"\x1\x45v\x85\x8a&_\xfc\xe0\xbe\x9ew\xe7\x63\xe9\x11\xbb\x66#Y\xdf\x98\xddvsg\xda" +"\xe1\xb6\x86\xee\xde\xca\xe1\xf0\xc9\xcb\xc5K\xc4\xcd\x46\xe5\x14q%k\xd3@\xb3\x38" +"\xc3\x8d\xcb\xd6\xd3'\xfem#H\xb4\xeb*\x1c\x95\xbf\x8/.J\x1b\xda\xdb\xe3I\xfb\x33" +"\x1a\xe9\xea\x0,` \x97tbeEZ\\`\xa7\xc0\xbb\xd2\xf4\x7\xc8\xa7\xe5\xfe\x9f\xbe\xa4" +"\xbd\x8e\xc9\x96%\x42\xe2\xe3\x2\x1a\xc\xa4\xf;?\xfd\xb7\x90Y!g\xaf\xb2\x1d\xbb\xb9" +"\xec\xa9\x1-\x6\x8o\x1d\xe6t\x9f\xf3\xc6;\xe3n\nU\xa9\xa1\x3@m\x8c\xcc\x9Yu\x87/" +"\xe8\x95\xb8\xc4:*DZ\xfa^\x3\xc7\x90$\x89\xd4\xf4\xc4\xa9\xac\x82\x91!\xe5\x32\xc6" +"`L\x5\x9c\x35VR\xfc\x9c/\x16\xa5S\xd5\x36\x8b\xa0u-\xfd\xcaL\xe\x9b\x94K\xd1\xc2" +"\xd1\x15\xc2^D!\xeb\xe4\x12\xb1q)\n\xb0\xd0\xe5\xb0\xb2\xc4+\xbeX\xa4\xeb\x39\xea" +"a\xc7\x10Im\xd8\xa4\xf0\xdevu\x9f]U\xf5W\"JK\x95I\xce\xa2\x1b\x8f\xe2w\xfcXH\x8f" +"\xc3i\xd9\xc0\xf1\xa3\xdcR\xb8T!%\xbb\x42V\x1bYK\xdf\x33\xbe\x43\xae\xf9?\x0\xee" +"\\`'J\xff\xc0T\x84\xb0\x1\x1d\x8c\x46_V\xbb\x9d\x4\xfe\xb8\x8bm\xe5O\xc2\x10K\x7" +"\xdc^\xc8\xcd\x41\x9d\x9fY~_M\xdf\xc0\xbb\xb0\xe9 b\x9f\xdf\x6I+\xecx\xc9p\xc1\xe6" +"e=K\xbf\x92\xd3\xf1\xca\xbd\xc4\xfb\xae\x38\xb\"\xf1\xdbn\x8a\xa9\xb0P\xe3:8M\\\xad" +"\x95\x43\xa3\xad\xbf\x91\xa4\xa9@Yp] \xd9\x6\xfc|\xeb%w\xcaP\x4\x33\x9e\xcb\xd2\xa3" +"g\x9f)\xeb\x43\xc8\x92G\xfa\x11\x35\xb\xad\x35\xeb\xc9\x38\xbb\xd7\x45\xf7tr}\xe9" +".\xb7\x8b\xfc\xbd\xb1\x9\xc5@\"\xad\x9\xc2\x1e\x85`\r\xcbp\xcb\x1bQ\xae\xea\xb9\xcc" +"\xe5{\x8b\x14\xc5N\xeb\x1e\x95j\x8c\x39\x61tr\x16X\x8\"\xc5\x31\xbe\xa4\x5\x13\x18" +"(:<\xf1\xf6\x12\x36\xbM>\xd7\x85\xecv\xc5\x9e\xa4u\xc1[\x15\xe9\xe1\x93\x14\xbf\xc6" +"\xa1(\x92I\x1c\xd9\xd7\xcb:\xfd\x90 \xbd(\xb6\x85\x12\x9e\xf9\xe2\xc1Q\xc5\x95\x99" +"\xf1\xe8\xe1>\xea\x8f\xb5tl\xce\x8a\xe3\x17i\x1a(\xd2\x63\xc7w\x14\xe5\xf4\x1\xf9" +"\xed\xae\xf0\x85\xb7*\x86\xa9\xcf]\xfdVs\x9e;\xfc\xabI)g\x9e\xf1\x11\xd2\x33x\xa4" +"CD\xc\xf9R=;\xf2?\x9b\xdc\xdc\xd7\xf2\xc4\ru\x9\x9f\x37w\xe6on?\x1a\xe4\xde\xf3\xd5" +"\xb0\x62\xff\xbb/\xbd\xa4\xb9\x38\xf8\xft\xb6\xbe\x30\x32\xbb\xa7\x7f\x99P\x18xV" +"\x7fH\xa6N\xb0\x9f\x16\x84\xf0\x95\xf8\xb4\xe4\x7\xa7\x8c\x96H%\xab\xdbq\xfa\xad" +"\xb4*\xab|A\xe1\x46\xff\xd2\x1a\xc7\x42W@I\xdc\xa2W\xe9\xf3\xd4\xce\x46\xd2\x0\xf7" +"v\xedy\x15\xee\xa1\x91^2\x11w\x96=\xed\xb2\xa2L\x87\x1\xd7\n&XV\x8c\xf1\x31?\xdc" +"Af\xe6\xeaY\xa4\xbd\x30\x9\x30\x91\x1c\x13\xb7\xbfNr\x1/\xc9\x9c\xcc\xda;\x8cm\x7" +"\xfe\xbf\x15\xc0\xa1\\\x1\xb2 \xa6\xdf\xbb\x1d\x80\xce\xeds\x81+\xe5%\xe5\xb7\xb3" +"[\xad\x9bgr\xc6g<\xa1\xf5\x80\xff\xf1o<\x96\xb9\xb9\xb7\xf0\x41\xae\xd5\xc\xdf\xcf" +"rF\xdb xt6\xc9\xe2\xb8pm8Y\x13r\xba\xda\xc2\x19\xb8=\xdb;\xfa\x1a\xf8S\xaa:}\xa4" +"\x1b\x16\xbd\xf5\xe4,\x82w\xc2\xccs\xc1\xc9\xf6h\x93\x1e\x66\xadU#\xd4\x35\xdb\xe6" +"\x80q\xd0V\xcb\x8f\xe1\xde\x17\x9cRD\xccQ\x1d@\xbb\xa8\x31\x1d\x97j! \xa6\xc4n\x85" +"\xb9\x39)\x1f`9L\x91\x1e\x30\xa2\x14\xad\x3\xbf\xe5\x8a\x3\xe9/\xc6{\xfe\x81\xb8" +"(\x2\x8e&6P\xd2{\x6\x45X\xe3\xebr\xf0\x1b@\xcaL\xf0)\xb6\xf1\xc1\x84\x31\x93\xfb" +"#r\x1f\x1fo\x19\x92/\x82\x1c(\xec\xd4\x34\xf\x10\xe9n\xb3\x8bx\x8cX\x9c\xb8\x81[" +"\xb7\x8\xb0\xc4l7\x8e\x8c\x16\xea\xccr\xcc\xf9\xca\xb\x9e\xbd\xb0\xb4\x90j\xf5\x8f" +"\xc5\xcb\x8e}b\x19\x1f\x1c\x11\x94;\xb7m\x82%\x12X\xc4\xb2Q\xaa\x95\x61\xd4*\xdc" +"\xf0\xa5\xf9\x18I\x1e\x6;j\x88\xcd\xf4\xe0\xc8\xd4\x1c\x96\x8dW\xc6\xe3\xfb\xcdk" +"\xc6\x18\xd1\x39\xa6\x87\x30>\xe1*k1\xbb\xf2:\x4\xf1\x95\x90T\x4h\xbb\x12\xbc\x46" +"\xc3\xe6\x9fK\xab}\x19Z\x1f\xe7\xdb@\x98\x9\xf5\xa6\xb0\x17\x8aw\xa4y/i\xc2\x34\x89" +"\xf5\x3\x43y\xb4\xa7\x66\x8c\xc1\xc9\x36\x9a\x36\xf8\x95\x1b\xe8\xc8^#\xd2\xe4}\xed" +"\xf3q\x8c\n*\xdf\x81j\xcb\xfb\xda\x1d\x46\xae\x86)4H\xab\xc7\x32\xdb\x99\xc1znt}" +"\xfe L\xb1\x16\x1c\x94\x30\xad\xa3x{\xdb\x92\x45V#O\x9e,\xfa\xe7W\x1f\x95\x42\xfc" +"\x6\xc7\xb7\xcc\x6\xf6\x30\xd4<\x4\xa4T\xc2\xdb\xd1\xb2\x35I1\x1b\x3\xd8\xba\xce" +"\x1\xfe\xad\x8e\xfIg\xf5\x14\xad\x83G)W\xcb/\xd7\x66\x1b\xd1\x82\x15\xaf\x41\x66" +"\x9\x66\x9e\x87\x8cr\xe1\xb8\xf6\x92\xc4I\x11\x95\x8c\xb9\x8b\xca\xc7\xc3\x8yV\xe5" +"6\x9eoA\xf1`>\xd4\x96\xf4vo\xd3Q~\x88h\r7\x10OTU\xd0\xbwi\xaa\x1e\xb0I}e\xb9\xc5" +"9R\xb4\xce\xca`\xad\xd1V\xd9\x1f\x86\xc6\xcnh=\xe2\xd6\x7f\xd9\x0\xe0\n\xffU\x80" +"\x4\xa6n\x12\xa9\xc1\xb9K.\xac\x61\x62\xc8\x96\x10\x94>e\xdeR\xfc\x63\xa8\xff\x4" +"\xc6\xe0\xb8\xc\xbf\xe5>\x15\xf9\x46G\xc5\xea@\xec\xc4*k\xdb\xbe\x98\x1c\xc2\x7f" +"\xed\x8d\xf2\x13i\xc3p\x12\x8|\xe7t\x8\xb7xf\xec\xb3\x81\xf0\xa1\xdd\x65\x17rr\x8b" +"\x8e\x7r\x8b\xc8*\xd7\"%\xc9L\x86\xb2\x45\x1d\x89\x1c\x1e\x1b\xf8\x43\x6}8\xec\x94" +"#\xa2i\xda\xaa=q\xeb\xa0\x7f\xb7\xf5\x98+\xd7<\xcf\x1\xc6\x15\xce\x12\xb3\x96\xf6" +"V\xd8n\xeLb\xbf\xf0\x30Uf\xcb\xc8\x39\xb1\x84\x30\x46\xca\xe4\xb5y\x93\xf8l\xb5\xd5" +"\xee\x8aS\x81\xc3?\x13n\x1\xb7yI.=\xc\x86xyC\x4\x63$\x88~\xb4\xe9'0vx\xf2\xc8\xc8" +"\xaf\x15\xd5\xafxu\x84%N\x99\xba\xf1\xe3\x34]\x89\xee\xca\x11\x84l\xcc\xd6+\xf0\x8b" +"l97\xf7\xa3\xd8\x16\xcan\xd3\xcq\x99\x9a\x39-4\xf0NP.\x1\x93O-\xf0GA\xer\xb5\nS\xf1" +"\x10y\x10\x35\x2\x8\xeu\xe0\x31K\xdd\xaa\x96@\x88\x7f\xd0\xb2\xd2H\xb7>\x8e\xa8\xb" +"\xd8\xcfib\x7f\r\x34Zsy\x1f%{\xb5\x9b;\nv$;\xb0k\xd0\xb1\xfc\xa3\x44\x8e\xf0\x8f" +"\x1/\xe7\xd6\x96\rY)#\xb1:ib\xb0\xeb\xef\xf6\xee\x81Kl\xb3i\xca\xd2\x39\x9a;>9\xad" +"\x7f\r\xd9\xc3/\xc7\xea\xab\x81\x9e\xec\xc9\xb3\xfd\x97\x12\x31\xa8\x33\xd0\xb\xcf" +"x\xce\"I3\xc4\xf\x1f\xd3\x1a\xb1\x1d\x89\x93.\xd5`F\xd8{\xeb\xeb\r\x4\xdf\xab\xa8" +"\x8f \x7\x7\x45\xa4\xfa%\xcd\xc7\xf4\x82\xf6\xa2\x9e\x32\xd5\xcf\xcdP\xfc\xe2:\x12" +"\x81\xcc\x91M\x9d/\xa2\xd6!\x14\xe0\x2\x93\xe2\xe7N%\xe9\x9c\xe2\xdb\x6\x96\xdex" +"\xb6{\xcbG\xaey7!\xe6\x95\x8cm\xa4shSj\\\x9f\x9f\xbc\x13M\xddM\x8\xbf\\\xb-;\xb4" +"\xf8\x63\xeb,\xe\x88\xe8i\x96\x45\xa4\x1a\xde\x9c\xe5\xbf\xc8w\xd7\xc3\xc7\xbc\xab" +"#o\xb5\x8\xe5\xc8\xfbj\x1c\x33\x17\x96p\xe2\x94\xa7\xa0h\x19\x95\x81\x96\\\xf\xfd" +"\x8b\x11!\xf4\x63 \x88\xbc\x96\x93\x14\xd1\x31\x92\x46\xe8\xc9\xe4VK\xc6\xbb\xb7" +"#i\x8e\xdd\x94\x9d\x12V\xb\x33\xf7p\xfb\xec\xbe\xa8\xc2;\xed\xddW\xe0\x8c\x91\x65" +"B\xc\xaf\x1b\x35HR\xb0{j\xf7\xf\x3R\xff\xbc\xc7\x1c\x91r\xd6-\x85\xc6{\xcd\x90\xcb" +"\xd7\x33I\x1e\xcft|\xcaubP\xfeP\x93\xa9\xb8\x45\x7f\xf\xabo\xb3\xf3\x65\xcd\x16@" +"\xe3\x0s\xd6\xf3Yo\x89nU\xd1\xc0\x63\x95s(K\xe2\xbe\x1c\xa0\r\xb0\x36\xd4\xd0U'N" +"b\xe\xc8u\xc5\xd1o&\x89\xb2\x8\x65\xba\xe0\xf1K\x14S\xcf\xfe\xfc\xacY\xfe\xfv\xbe" +"\x88\xd1m_\xaf\"\x91Ivy\x16\xee\xe5\xd3~K+\x6\n:75\xfc\xbd\x7\x87\x5\xfc\xe3\xe7" +"\x95\x44\x35h\xc6\xb7K\x1e\xd8\xf4\xcq&a\xb\xeaR\x80\x83\x34\x9c+\xb6\n\xd9\xc1^" +"\xdc\xd2X\x8c\x9\xc7\x1eS\x99\xc0\xdf~\xe8\xe5\x1cK\xf6x\x91\xee\x65%\x33VM~Z\xf2" +"\xd8\x91\n\x98y\xdc\xa3\x82\xee\x62\x37\x8e*<~\xdft7\xb5\xf6\x39\xb6\x33\xff\xd5" +"\xaf\xd3\x45Z{\x1d\xa9\xc4\xc7\xfe\xc\x3\xca\x92{\xc9\x33\xd8\x82\x1e/\x9byb\xb8" +"\xe7uqv)\xe2K\xc9\x80\xbeQ~\xab\xeeg\xce\x87 =\x4#\xe8V\xf1\xeJ[p\x16\x95/i(\xa1" +"\xd3\x8\n\xac\xe%\x63\xb\x19\xab\xd7\xb4\xbb\xbe>\xc9Y\xd6\x3\x43\xffM\xf7\x15\x45" +"^\xa4[_\xe5\xa6\xe3\xfc\xc7~\xa1\x18\x3y\x19\xb2\xa2\xb1\xde\xdapZ\xfdS$1\xbe\x9a" +"\xd7S\x9\xec\xf8&\xaf}c\xed\xa6\xc1\x43K\x6\xbc^\x9a\xcb\x43\xee \x9e{k\xc2\x1g\x2" +"\x8c\xa7\x85\xd3\x93\xbaw\x9c\xe7\xa1t\xa8\x98\x8c/v#\xcc\xf2\xce\x9a\xc3\xc8\x98" +",\x86Q t\xb\xd7IL\xca\xe3(\xbb\x37\xaaHs\xff\xd9\x9c\x46\xd2\x0Y\xc1\xc5\xbc\xb9" +"\xac\xa5\xe0\xfa\x9e\x12\x0\xd1%\x45\xdf\x87lX\xe\x1e\xcd\x18\x82\x95\xa7\x90\xe0" +"9r\x9e\xf9\x39!\x17\x4N\x15pQ\xce\x87\xef?\xe5\x9b\xff\xf2U|q8\xd4\xc6\x30h\xf\x93" +"\xf3\x1d\xc5\x1b\x87\xcd\x7f\xd8\xd2\x14.\x16\xb8\x9b:\xbf\xfd\xa3n\xf0Q\xb5\x64" +"\xeb\x1f\x8a\xc1\x8d\xf7\x0r\x93\x0\xd3\xfaZ\xbe\xf4\x9bS\xa8\x87\xfa\xdb\r\xcd" +"[>\xb\"\xd9\x88\xc2\xd6\x7\xdd,\x9fQ\x6\xf8:R\x1euV\x84\xab\xf2\x19`\xa0\xf9\x3\x30" +"f\xd5s\xdf\x4:\xdf\x95\xf7\xc8\xe9\xf8\"\xcb\x1f\xbd^\xed\x34\xd0U\xf\x44\xfa\xbf" +"sj^c8\xab\x99\xcd\xc\xed\x9c\x8a'\x9\xc\x85\xb4\x98\x19\x9c>\xb5g\xf2\xe9%g\xfe\x87" +"\xb2\x8\x99\xa3\xb6\x84=q\xd4;(\xb1\xc2\r\xe0Y\xc1\x2\xc0X\x2Td/$\xef\xd1\x1e\xc8" +"\xac(\x19\xdd\xab\xf1\xadK\x1c\xd9\xaf\xe9,\xc0\xe4n\x19He\xb9\x80\xb2\x8c\xd5\x43" +"\xdf\x6\xac#\xef\xc9\xc6L\xbe\xe9\xd9!\xc2\x9cioG\xbd\x8ep\xbm|\x1d\x5.u\xf7Y|]Q" +"\xbf.k\x9c\x97\xf1_\xc\xb8\x4o\x9" +"\x80\xb0yhWb\x16&\xeb\xc8\x2\xd5\xf3\x19\x8e\xd9\x1e\xc3!R-o\xa8O\xc3\xbcu/joG\xfc" +",\x5\x1a\xd1\x93\xadN@l\xa0\x15\n\x9aw\xde\x93q\xf8\x32\xd3\xac\xa7\xa8L\xa8\xc3" +"\xf7\xd9}\xc5\xe9H\\O*w\xef\x7\x19\x19\xcc\x90\xbe\x7f\xe1\x36\x18\xa4\xa9\xbds\x87" +"\n\x96\x8c\xb8\xba$h\x87\x8\xf4\x85\xc1Xr\x88\x82 \xe7:\xa6\x62\x36\x8f\x41\xe\xf7" +"k4eVc\xc5J\xae\xfe\xe8'\xb7\xc5S\xab\xc8%\x43\xfa\x8e\x8d\xde\x13#\xc6\x4\xf\xb8" +"\xf2O\xc2\x13\xa1\x88\xf1\x94\x9aG\x1\xb7<\x4\x64\xad\x96W\xa7ST@0x\x97\xd8\x16\xb3" +"\xe4\xb6\xda\xcav\x84\xf9*Kt&-w)i\xde\xe7\x11\xe4\xed\x9e\xe1\x15\xfb\x7f\x91\xbd" +"\x9d\x1a=@2_\x13[.\x3sP\xa3kC\xcfZL\xad\xeah\xac\xa3h\xf9\x92x\xfa^\xcd\xff\r\x10" +"\xed\x15\x17H\x9c>YV\x8c\xf5g`\x15\xd0m)nz&\x1=\x12\x82\xb0\xbe\x1a\xed\x1e\x1b\xb" +"r\xa9\xbd\xf8\xe8\xd7\xbc\xc1\x46\x33\x87\\\x7\xcf\\\xca )e\xc0\xab\x8d\xcf%\xc\x33" +"\x99\x0s&\xca@\xb0\xe3\xb4Z\x9f\x82\xe6\x1\xb0\xf6\x9d\x36,\xc9\x35-\xef\xaf\xb0" +"\x17\xf7g\x10\xf8)\xde\xe9\xf4\xba\xdf\xcfU\xc\x83\x86\x8bQ\x0\xac\x89\x35\x17\xa8" +"N\r\xd8\xca,\r\xbf\x35n\nzS0\x80\xed\x1b\x39\xdei\xd1\xa3\x1f\r/\xc4\xd8\xc\xf0\x9e" +"u\xa8$\x1\xb9\xe2\x5\x95\x35q\xc2\x98\x8c\xc6\x8a\xe6\x1e\xc\x98nv1\xb8\"\xff\x44" +"\x80\x98\xf0\x15\xa9%\xfa\x95\x89\xd4\xdaO\xbGA2\x18\xa6\xc4T-E\xae\x8f\x32\x83\x18" +"\xebgiD\xd9\xcd\x6\x11&<\xe4\xf1\xbe\xc8G\r\x1b\x86\x46\xde\x66\xd3Qdb\x0\xb5\xa3" +"\xe8\xc7\xa7i@TL\xff\xcdo\xdc\x98$'[\xa4\x9^\xf0\x8f[C\xcf$\xdb}\x8b\x1a\xb\x19n" +"%[\xd6\x9\x8d\xbc?\x98Y\xd4\x9a\x15\x9ci\"\x84\xb5.\xde\xd6\x32\x2\x30\x64\x87\xc9" +"\x97@\xde\xe2R\xee\xb2\xcejSG\x9e\xaf\x7f\xcd`W4kj\x83\xad\x35x\xe6R\x18\xee;\xfa" +"R\xf9\xfdpR\xdb\xb3\xb3\xf8\x41\x88|\xab\x19\x39_dw\x9f\x64\xd3\xf9\xb4\xa3\xfe\x39" +"G\xb6\xa5\x1\xb6\x8b\xc2\x88\xc6\xef\x89/4\xf8\xe2\n\x94`[lB\xdf\x84\xd6\x1e\xdc" +"\xd0\x0\xdb\xab&\xf4\xa1\xe7\xbb-\xa0\xa9&\xbav+!\x12\xbc\x10\x92\x1b\x38~\x10\r" +"\x9d\xb2\x9\x5\xe2}G\xf0\xdb<|\xc6\x7f)\xe4\xef\xebo\x17\x9f\x14K\x83\xae\x94\x93" +"\xf7$\xabX\x9e\x94\xbf\xfb\xdc\xda\x86\xfe+\xb3>aX\xbf\x15G2\x10\x15\xd4n\x16g\xa2" +"/\xcc|V\xd3\xc6\xc\xa2U\x10\\\xec\x8b\x3\xe8\x8b\xfa\x66\x95\x4$\xe8y\xd6\xdb,O\xfd" +"\x9dm\xf3Z\xb3\xec\xc8\xd5\xdai\x91g\x84\xe2t\xbd?\xc3 w\xd6\x63n\xd7\x34\x3\x10" +"U\x6\xfe\x86\xc7\x39=m\xa5\xc0\xf4:\x88G\xef\xd4m)\x99\xc2\xa6\x62\xb2\xca\xee\x14" +"\xad\x13\xe4\x8f\x14\x87\xf5\x34\xb6\x66\xbd\x38\x82\xd5\xad\x91\xde\xd5\x0#\x84" +"\xc\x31\x37^\xe1\xbf\xb5@\x19\xf\x11\xc9S\xc3\xc8l\xf\x66\x13\x9eW\xecP\xaa\xd8\xfe" +"\x9b\n\xa1T%\xfs\xc0\xe1+\x85\xb4+R\xf4k}\xc8^\xc0\x61\xc\xcd\xd0\x8c/?zS_\xd6\x9" +"\x89~G+\xe4\xa4\"\x8e\x45\x16\x93\x92\x1e\xd1\xf6\xfd\x9b\xfd\xab\x63\x8d\xa1Q#\xf3" +"U-\xc8\xbe\x5\x30\xc8\xa7n\x85\xf5\x9e\x13\xd9[Z\xe4\x1d\x31q\xf8\xc3\xaa\x8d\xad" +"\n\x2\xc3t\x9e \x90\xc6\xa7\x95\xd5\x36\x5\x34\xcN\x9bYh\x18\xaa\xb1\xc\xa1&\xe8" +"O\x90#\xc8\x1b\xf2<\xc7?a\xdd\xc6\x61\x99\xe5\x62x\n\xde\xbd.\x90\x35G\x9\x8aY\x15" +"\xfcrh\x19\x8a\xf3\x1\xc5\x1\xd5\x9b\x90\xf5\xbcP}\xa3\xb2\xfa\xe2r\x87\x46\xcb\xc4" +"\xec\xda\xdf\x62\xae\xb3\xff\x19R\xd7\xd9\xf1\x4*\xc5\x44\x8aw\xf3`\xb3M\xa1\xe7" +"\x82\xf3\xf1\x1\x94\xb3\xd4\x34\x36\xb4\x11v\x94W_v\x11\xd1\xe3\x42\x7f\x7fx\x14" +"\xd9J\xf7\xf5\xc1\xfe&\x8a\xfd\x82\xc2\xe7\xe9\xe3\xf6\xe0\xb8\xb5\xfd\x82}\xb4\xe7" +"\xb4~\x13\x17\x93\xc6\xe2\x9b\x33\xc9\xb0\x85t5\xe4\xd5\x7fQ^\xbc)\x90#\xa4\x38\xe1" +"t\x15\x4\x3\xc8\x94\xae\xf5\xc%\xacZ\xaf\x7f\x87 U\xfa\xf3\xc1\xed\x1\x44\xa6\xc1" +"\x2\x8e%,:\xf2P\xa1\x81\xbe\xc8s\x2\x83\xa0\x87\x84^\xb7t\xd9\xd6O\xb8\xe7;7p\xb4" +"\x1eu\x5\xe4\xa5\x2\xff\x35^?u\x82\xf3)p%\x8T\x9d^\x7Q\x12\x44U\x81\x45\xd9\xc4W" +"\xdfHV\x15Y%\x93\x82\x7f\x8e\x16\xe0\xc3\x92\x1\x9e\x9b\xb9\xaf\xa2\x9d.\xc3~(\xf5" +"_\x1d\x81-?U-\xd4>\x9ap\x7f\xb2\x36R\xe9\x44\x96{=\xa0\x9\x45=\x84\x18\xc0\xd7\x9" +"\x2\x1b=`6\x13\x36\x11S&d\xe9.\xb7\xccx\xa0\xaa\xea~\xc8>\xd8\x35\x35Q\xb6\xd7\xed" +"Eq\xe4\x66\xe5\\\x0\xda\x9)d[\x99\x8c\x12\xf2\x96\x9dv\xa2}V\xee\x94\xd9\x81\xfe" +"\xec[\x95z\xc\xa6\x37\xa0J?\n\xe1\xbe\xf5}\x8a\x83\xd1\xa1Y?\xe0M\xa2\x96H\"\x91" +"@\x91\x85\xf0\xe2\xae\x9\xfeL$9\xe2\xf4W\x9fT\xc7\x84\xc5\xa5=8\x97\xb6\xaf\x8b\x9" +"[\x9a\x98\x5K\xf8\x9f\xeb\xaf\x16\xc4\x81\xf3Vu<\x8b\xb8\x1\x95\xbd$DZ\x80*\x5\x17" +"\xae\x9\x44\xee\xc6\x30y\x96\xf8\x38\x1b-\x97Mye\xe3\xf3\xe9\"\x96\xbe\x91\xdelT" +"\x86\x30\xe7&#le\x8d\x98\x61\xca\xb9\x8b%ryC/\xa4t\x85O\x92\x16\xec{m'\xa1\x32\x1a" +"{g\n\xdere\xc1\xbj\xa5\x9\xbf\xd3\xad\xfa\x44\xcc:\x1d\x33\xdc\x82\xdcL\x1b\x13\x9d" +"\x95\xdd\xd7\xa2\x31k\xfa&\xc6\x8\xb4\n\x36\xba\x9b\xf9/D\x1e\xbb\xc8:]\xb\x46'\xc5" +"h\xf6]\\\x5\x37(Abz\x8d\x8e\x30Y\xd8su\x19\x93\\\"\x15\xbei\xd4\xc5\xf6\rM\xff#\n" +"\x9\xe7$1\xc1\xf0\xac\x98\x85\x92\x5twZ\x12$\xc3\xc5Y\xb0\xf3@\x8S\x2\xd0z\xd4\x1" +"b\x0\x44;;\xb0\x65\xcb\x7n\x89\x83\x81\xfa\xf8z\xf0\xab\x61\x1aU\xa4\x1b\x92\xed" +"m\x95\x10\x95\x17Q\xc0\xed\xb\xcf\xbc\xee\xa7\x92\xffk\x87\x97\x94\x89y\x1d\xc8;" +"\x88\xe7Gp\xc0}\xf3Nx+\xbd\x14\x37{\x3\x99\x2[\x1\x1c}\xb9,\xa2\xdb}\x8\x9\x9ah\xe3" +"\x95\xe9\xf2\x82\xf8\xd7\x16\x9e\x41\x38\xdc\xe2\x82N\x5>\xe7om\xe8\xb5\x82\x96\xba" +"8\xb0\xd9\xd2s\xe3\xa4\x61o`\xf2\x91\xdb\xf4\x34hH\xe7\xdc\n\xf3\xb6:v\xd8?\x6\xab" +"\xcf!uU\nU\xb6\xcbJ1h\xf0\xd3?\xae\x38\x9e\x4\x84\xeeg{\xdd\xe1l\x10o9\xbf\xfb\x37" +"\xf9\r\x89\x12\xab\x66t\xa6\x31\xa3\xe1.\xfb.\x3\x91\xbc\xe4*\x1d\xb0\x98\x12\xdb" +"\xd0\xfb\xb\xb0\x1a\xbb\x13N\xbd\xbn\xca\x13J~\xa7\xe0\xee\x66\xf8\x9\xc4n_\xad\xb7" +"\x0\x85\xd7\xf0\xc8\xf7\xd7\x8f\xa8\x64\xf2\x41\xeaP\x1b\xdc\xdf\xb8\xfb\x1d$\x96" +"\xd9j\xc2\x33\x37\x15l\xb6?\x99!\xbf\x84\xb0j\x7f\x9d\xe4$\xed\xb0\x90p\xd0\x9e\xfc" +"\xfc\xd3*pa\xc9\x90\xbf\xa0\x88\x17N\xc4Z\xfJ8X\x3\xc6\x64\xc2.\xab\x4\x1bq\xcc\x95" +"\x9d\x9f<\xf8\xfc\xb2~k\xe9\xd7\xe1\x36\x18H,0\xdeT%8/\xb9\x64\xa3\xbd\x82\xe7\x42" +"j\x8c\xa0\xac\x81\xa8\xc0\x9bl\xb\x41o3\xc5JE\xc4\xf5{\xbf\x10&\xa1,[\xaa\x1aU@\xe7" +"\xdb^\x95N\xe1\x1\xc3jp6#\xa7)\xc\xe3\x2u>\xc1X\xb6_\x81\xf|F\xc5\\\x7f\x9f\x12z" +"\xa3\x94_\xe2\xa3 \xa6\xaaI21%\xc8^\x17J\x82\x8cU\x97\x83\x10~\xdd~9g\xbb\x1f\\\x61" +"c\xb9\xa1[\x8c\x9d+\xe8\x44\x19\xfd\x9c\xf\x36\x1\x8b\xde\x46+{\xee J\xf1^\xae\xe3" +"\xe4\xf5\xfe\x39\xa2it+\xa5\x39\x8b\xc6\xdc\xdb\xac\xfd\x34\x66\x99\xa2\x8b\x8dp" +"\x8e\x8b\x9\xef\x0\xc4\xff\xe6\xfc\x8b\xe1!\xce\x97\xaem\x92\xb0\x42\x89SDI*\xd9" +"\xa6i2\x91\x35\x63\x2\\\xb\xeb\x65\xca\x34?\xbc\xdd\x12\x1e\x12lIi-R\xabK\xcbq_R" +"\xdb\x80h\xc\xfU\xa2 \x1b\"\xc2\xf2\x63\xd3\x8a\x89\xcc\x89\x81\xc5k\xcd\xb2\x45" +"\x80SG\xa7\x97\xd0\xd7\x1e\x2\xa1\x1b\x82\x38\xfb\xc2\x42\x45\x62P\x1\xech\x90\xcf" +"\xb1\xa0\x93\x99\x37\xaa\xb8/\xf6\x35\xdeR\xe4}b\xcb\xb3\x8dL\x89R5V\x12]v\x1e\xfb" +"\xeeV\x91o.\xd3Q\xa8\xc8\xbe\xde\xb3u\xb4\x0\xa5I\x9e\xf7\xcc}\xb0\xd9\xd7\xf6\x6" +"G\xc3\x41l\xe1\xd5\x5)>\xc1(\x9c\xc0\x18\x14y\xb2\x8aq\xac\xcc\xd3]\x1cI\x7f\x62" +"\x84\x43\xfd\x33)\x1aH\xf7\xaf\xa1\xd6\xa6u\xae+\xaa\xc9\xfb\xc4\xa1\x89\xfc\x4\xa4" +"B\xb\x91\xe3\xd5\x1e\xd1\xba\x42\xc2\xac\xa6|\xdd\xab\x41\x63\x8c\x82#of\xa8\xf2" +"\xce\xf2\xc6j3\xd5\x42S\xb5`\x99\x89\x16\x8e\x1c\xb5\xe9.\x9a\x46%j\x87\x10O\xf\xa8" +"9\r\xbb\xfb\x81H\xd7\xf9\x0\xb9\x63J>g\xb0\xf7\x61\xbf\xf5\xf4\x16\xb-\xb2\x15(\xd0" +"\xa4\xd5Xt\xee\xa9\xf0\x15\xd9R\xcb\x8f\xf8\x8f:\xfe\x83O\xc1\xea\x1d\xe2s\xb9\xc0" +"\x4\x8e\x45\xe3\xe2\xaaW\xe4\xc0\x92\x61\x8bP\xb3\xc1\xf5\x15!\xd0>\x9b\xa7\x43\x89" +"\xab\x46\x13\xb0\x33},tx_(\xee\xe5t\xf1\x81x\xc1g\xe6\xa3\xb5\xa5\xf6\x61?\xbeX\xb5" +"\x84\xa3S\"$X\xb6\xe5J\xc8\xaa\x8\xf3\x1a\xb0v\x1e\x15g&_\xff@\xcb>u\x9\x63\xf8\x17" +"\x9dI\\\"b\x84\x12Sg\xd1\xac]\x18\x8f\\\xa6\xa9\xfe\xf%\x12_05=\xf5N\x96\xe1\xf6" +"\xc5\x11\xc9\x38\xe1\x0\xbe\xc\x1bJ\xe6\x8dN33yO\xb\xc9]\x9a\xe9\xbbQ~\r\x18<\xfe" +"\x88\xe0H;\xca\x95x\xf\xb6\x43|\xd3\xc2\xbc:\xf9\x65\xbck\xc5\x8d\x84]0F\xce]\x12" +"\xec\x92\x85\xc1\xfd\xde\x31\x46`\xa9`\xaf~J\x7f\x7\xf9\xf\x95\xf\x6\xc7{\xe9\xf2" +"o\xa9\x1f\x14\xfa\xc8\xdd\x90N\xaey\xe\xd2\x16\xe7\xcc\"\xffG_\x8f\x46.\x1a\x46\xbc" +"\xdaq\xa9\xd6]\x7\xde\xdc\x3\x8d\x0\xf4\x93\xb3\x88ogI\x83\xdc\xfd\xd7\xd7`\xfb\xde" +"{\xaa\xcdx\xac\x12\xf1\x8d\xefU\x88i8\xf8\x8b\x99\xadO\xc8\xa4 \xcb\xd6\x0\x36\x15" +"\xd4\xe3\x1f\xf2\x94+5\xf7,\x1a\x1f\xb1<+\"bRs\xf7\x15\xe5\xd8\x9aM\xfe\x43\xe2\x4" +"ub\xf7~\x9c\x8e\\))\xbd\xc7gN\xe9\xbe\xaa\x8c|\xe8\x2\x1d(I-\\Tv\x8c\x0*6j\x86+\xba" +"\x99\x39\xb\xe4\x87\xe4x\x15\x13\xb8\n{\xcd]G\xdc#T\x1c\x9aU\xb9\x45\\S\xe9\x32]" +"\rw\xfb\x3\x90\xcd~\x12\xce.N4X\x1aJ\xb5$\xa6\xa9\x1f\xd3\xbd\xb9\xe0ySDq\x16\xc7" +"\xe4\xf4)\xa9\x9f\xf6\xc4\xc1\x1b\x1c\xed\x99\xe5\x11'\xc3\x9\x4\xbd\xf3\xed\x12" +"\xd7&\x1c\x31\xaaH3\xacr_U\x97\xb3\xc1\x17\nH\x92\xc3\xcc\xc7\x65\xf0!)D-I\x1b\x12" +"'\x4\x13\xa4l\x92\xc9\xb8=A\xea\xdb\x8\xc7\x80\x37\xa1\xc8\x63\x5\x99i_\x0\xbd|\x8b" +")\x84\x15@:\xec\x63\x2\x37\x43/~ou8Q\xcb\x35\x88\xe2)\xac\x8a\xe\xe3u\xd8\x15\xac" +"\xc\x2%\x0\x61\x9\xbd\xf8\xe0\xb4\x96\xde\xdd*\xa9\xcf\xaa\x16(jFb\xe2Vw\x8b\x12" +"\\\xb4\xdb\x5\xd2R\xaa\x66\xda\xda]\x16\x1e\xf6\xa5\x97\x1e\x9e\xd8\\\x91=\x1b\xef" +"\xa7\xd8\x62\xaa\xb7\xe1k\xc9^\x3\x95\x64`\xe1\xf5Z\xa7YH\x0`\r_\r\x14\x33\xee\x8f" +"\xf\xb\xe4\xce\xc4\x3\xcf\xed\xcaRsFE\x82n\xb6\x96\x1a\xf0\xc4\xe1\xdf\xfai\xf1\x93" +"\xe\x19h\x15\x39\x96\xe\xb5\x8b\xc3\x86\xfe\x31\xf2\x66\xf5\xe1\xb\x13\xbeMOF\xa2" +"\x9b\xa9T\x3\xe7\x5\xca\x8d\xbc\xdc\xc0<'5\x9\xd9\xa8\xbd\xedna\x18\xda\xf7\xfb\xc3" +"c\xc7\xe7\x84\xf8\x30o\x8e\xebwI\xccm\x85^\xd2\x9f\x99\xc7\xea\x8b\x43\x37\x8c\x12" +"s\x8f\xb8\x13\xfb\x82\\\xde\xad\x8a\x66N\x1f\xad\xf1\x1fz\xb8O\xa7\xe4%{\xd1\xef" +"\x7f\xcb\xc3\x1e-\xa8\xa8X/C\xbej\xe0\xfc\xa6g`HLQ\"\xcb\x38\x17iQD\x99\x19\x34\x1a" +"\x9e\xb6\x0\x93\xed\xce\xea\x34\x7f\xf8:\x16'\x8c\x37\xa9\xff\x38 +'\xa4\xf7\\\x6" +"o\xe4\x43\xa2\x41\xb6\x30\x14\x9cXWP\xe2\xd8\x15\xf6'\xa1%\x42v\xdb\xea\xe8\x18\"" +"p\xf2i\x9a\xc1\xe7\x8cj\x9v~)jdn^\xde\xd4\x84=.\xb8\xa6\x86s\xac[\x81\xe0\x65\x10" +"\xdb\x64\x87%G\xa9*K\xc8Q\xe7h\xf4=\xa0S\xa6\xbb;\xe8\x9c\xbe\xf1\x66\xe8\xa3\x41" +"\x9e\xed\xe1\xb9}\xf8\x8ai\x8c\xf_\x86M\x81\xb5\xc4\xf7\xad\x97\xeb\xf7\x8bN\xe8" +",\xcdq\xa3L9\x8d\xd3\xf7\x46\x9\xc5U\xb7\x65<\xe2~x\xbe\r\xe7\xca\xa1\x1d\xe7\x8f" +"\xca\xc0\xe0)1\x1\xa2\xa8\xc5TYA)\x1cV\xd4\x95\x7f\xcd\x65\xe3l\xccW\xc8\xc9\xdc" +"\xcc\x7@z\x11\xf5\xc9\xcb!O\xf5\x8\xa5\xf6\x17\xff$\xf0\xb6\x17\x0Mg\x87\xea\xca" +"\x97)a\x8\xb8\xb0\x2v\xf3\xb7\xe2\x8a\xf1\xdb\x99\x8c\x36\xefQ|8\xd9m\xbc\xaf\x33" +"\xde\xb8\x99\xa3\x44\xa6\xc0G\xcd\xd2\x66*\x2\xb9O9\xacR\x8a!\xff\xaa\xfe\x36Gp\xbc" +"\xfb\x99_b\xeb\xcm\x7o\x12$\x1fr\xe4\xb2\x84\xf0\x85\xa3\xc6\xfe\x92\x63\xf8y\xaf" +"\x8c\x4\x99y\xf5\x1e\xbfI1M\xd0\x33\x1e\x93_\x94\xf2\xa5\x8a\x10y\x6\xc2&^;\xd6\xd6" +"D\xeau\xc9(\xee\x81&\x8e}\xb0\xd2\xb6\x17u\xcb\xdc\xfc\xe7\x43\xef\x1a\xe9xLJ\x9b" +"-N\xb0\xd5\xbc&Q\xd7\x9f\x10\x83\x6r&p9\x9d*\x90\xe4Sdg\xc0\r\xe8o\xf4\xa4\xf4\xa5" +"\x11v\xedr\x1e\xa3\xa1\xc7,\xee\x35LT\xf6-\xb4\x98*Vc\x7\xcf\xd3 \xd6$[\xc3\x10\x8a" +"\x5OD\xb3\xf4\xf6\x1f\xde,\x84\xab\x41m\x18\x16\x45\x44\x30\xb6\x46\x8cW\xd8l\x15" +"R\x18\xc6\xf0_\xae\x1f\xe2*}\xa4\x61\xe9`\xc2\x10\xecnD\xbd\x7f\xeay|\x1c\xc6\xb6" +"?_\x93\xe7[\xf6\xce\x42\xddU\x9e\xb1\xe9z\x8c\xd0\x1d\xaa\xd4\xe9\xaf*TH\x96\xf6" +"\xe5\x97\xed\x16\xd6\x84~HS\x9d\xf\xe0\xc1\xdf\x99)\x86\x30\xec+F]\xd0\x37\xcav\x17" +"\xea\xd3\x4\x99\x39rK\xb3\xd4(\xe9\x13}\xdag\x9\xdd\xe2\xe7.\x16\xc8\xc\xc9`\xcb" +"\x85\xf1r{\xf3\x8\x45\xfaQ\xfc\xa8\xd5+`\x99\xa6Z\xc\xdd\x44M\xaa\x35SG\x82\xae\x34" +"|\xfa}\x84\x9a\xd3\xa9\x37I\xdb\x90\x41\x3\xe5\x97\xf6\xddV\xe0\x32\x2_Y\xf7\xb7" +"$\xd1\xc9G5\x80\x99\xff;3nmh\x8br\xbd\x11[\x86\xd6\xd0\xc5M\xd4W\xb7\xbc\xe4\x43" +"RL\xb0q\x8a\x82\xd6\x66\x1f\xbb\x5g;\x86\xa3\xef\x66\xd1\x98\x17\x88\x3\x9a\x1e&" +"Y\x7f/lQ\xd0U\xb1\xde\x1d\x32\x14]9\xb2\x44\xc9\x1e\xb3\xef\xd2<=Kx[\x96)j\xcb\x8c" +"\xe2\x18\x82\xb4\x81L\xa4\xd2^\xd8\x8a;g)\x89\xc\xca\x88\x43\xc1\xe2\xf7\x46(\x9b" +"N;\xf5\x19n&\x8c\\\x8\xe5&p\xe8u\xae\xedN\x9c\xefoE\xa7\ro\x94J\xa9Q\x8c.\xc8`\xd1" +"c\x13\x1b\x66\xe6\x1b\xe3\x44\xaa\xfa\xf\xcdKZ\xf2H0\xda.\x98\x11\xc4\x2L\xb8\x7" +"\xaf)\xceV\xa5wfk\xb8\xa6\xae\x62\xddx\xf>\xd0(5-\xee\x9bj\xeft\x83I\xf0q\xf1Q\xb9" +"\xb3:\\p}i\xc\xac\xac\xdc\x1f\xbc\x8e\xaa\xb9 \xd1\x1cN\xbf@h'2\x93\x3\x32\xa7T," +"\x0.\xd0\xe4\xef-<\xc5\xa6\x11\xa4\x85\x85\xfc\x0\x97\x42o\x97\x10\xd6\xde\xa7\xf" +"\x1f\xfc\xa6[=9\xc8u6\x9a\x91\xc0\x45\xaes\xd2\xde(\xb5H\xf6\xbd\x8d\rv\xe8te^z\xb6" +"\xef[\xf9\xa4\xe0\x8e\x12\xa1\xad\x86\x7f\xf1\xb7\xc\xb0\xf2\xac=\x19\x8d_p\xc3\xa2" +"Q\x5\x82\x91\xd7\xf5\x37\xe6j\xf5l\x87\xc1\x19\x16\x39\xbw\x5\x82\x11\x7\xc6X\xd2" +"\xa4\x3\xcf\x1cl\xacy\x13u\x5\xd9\x4\xa6\xe3\x1f\x34\xef#\x4_\x92:\xc4\n\xa9\x33" +"PX\xadv\r\xcd\xdf\x43\xaa\x9bQfR\xfb\x81\xfd\xe9\x1\xd2\x9c\xc3\xd2\xea\x99\xc4/" +"\xb8\xcb\xb1\n\\\xfc\x4\x3\xc5\xdbrV\xc7\xd3\xad\x11\x93M?\xcd\xcb\xde{\x87\xe1\x19" +"f\xfd\x33\x61!\xc\xc5\x11\x45\x9c\xd8+a\xca\x45\xe2\x8\xa9.\xdc\x4\xc\xd5\x8b((\xfa" +"\xd6R\xab\x38\x46\xc0\x41_\xbb\xc5\x3\xc9%\x1d\x7f\xa6\x61\xfb\x8e_\xd1g\xfd>\x9d" +"\xf8\xbb\x17\xa5-#\x1\xc2\x1f\x97K\x16\x34\n\xc7\xe4\x31'+H\x89_\x83v\x87\xcb\x41" +"\xeeu\x95\xa8&1S8\xd9\x97\xfb\xa4:\x9f\x8a\n\x90g\"\x95\x37\xc8\\\xaa\xab\xc2\x66" +"p\x0\xe6\x96\x1f\\\xa1\x1d`\xd3\xcb\x97\r\xe\x5\x9etF\xf1\xb4!f)-\x96\xab\xae\x83" +"\xa1\x85\xdd\xee\xab\xbf\xf0\xd9\xdaT\xce\xd5\xcb\x12\xe7\x82\xa2kq(\xf0\xda\x66" +"\xeb\xbc\xba\x7f\x45\xb6\xd4R*;\xaa\xfa\x39\xd7\x64\xb7\xc8>\xfd\xa7w\xdd\x17\x37" +" \xd4\x1e\xcIII7/\x9b\xe6\x1d\xe1u\xba\xe4\xad\xb\xf8\xd7\x88\xb3\xd5\x3+\xc4n\x95" +"\x82\x12\x90\xcblfQ\"\"\xc\xcdl\xff%\x44\xb3\xad\x1e\x11\xdd\xee<\xc\x65\x31\x81" +"\xab\xe2\xfjf\xa4\xe8\x98\xebHcj\x8d`\x87\xfbyGz\xaaT\x19\xb7\x85\xda\xd5OI\xca\xa8" +"\xc3\x42\x7f)s\xa4\x9a[\x6Gg\xaf\xc3\xb0(\xfaS\xca\x96@\x1d\x91*qQJ\xbe\xdbh\xe6" +"\xa4\x1b-\xc6\x19\x4\x1a\xe1\xb7\x98\xc1\xd6\xd0\x64G\x8b\xa1|\r\x4\xfs\xf1\xd1X" +"\xc7/\xef\x16\r\x30\xb8\n\x9e\xe8\x5K\xa8\x86\xfi\xf2$\x1ai&sz\x4\xe\x6\xfe)ED\xa3" +"\x93\xfb\xa3\x8e\x9d\x85\n\xda\xae\xc2\xae\x18;\x12\xfbwl\x82\xcb\x34`\xdbL\xee\xff" +"\xac\xfa\xba\x62\x9cz\xe\xdc\x66-\x8f\xc4\x8bY\xdb\x18\xe8\xc5\x90\x8dI\x13Y\xa9" +"\xc1\xda\xbe\x14\x18\xb4ix\x92L\xd0\x2\x8f\x1e\x19\x39\x99\x4s\x7f\x41\xad\x8d\xe1" +"\rB\x14\xd0]jM\xb4\x85\xcb\xfc\xf4\xdf\x9!\xe4\xe6)\xab\x83Ji\\1{y\x1b\xaa\xf9\x2" +"\xecY#\x1b\x85n>dhh\xce\x13\xfb\xd5\xcc\x41\xb6\xfd\xf3\xe4\xd9\x18\xa0.\xfa\xa2" +"\n\xab}Rj\x4\xed\xcb.\xb3\x88\xa2\xcc\xbc\xee\xdb\x9d\xb\r\xf1\x34>\x18\x31\x7f\x46" +"\xa6\x5L+\xbb\x14 \x1a\x92\xaf\xbc\x45,v\xf\x16\xe1,\xf9L\x8a\x90\x1fP\xf1&>\x1\x93" +"\x8\xc5\xaa\xd2\x46\xca\x64W\xb\x12 2\x94\x8b\xbc\xfe\x11R\x93|,2\xb7\x64\xf7\x8b" +"\xc2H\x17Jr\xa7\x6\xfc\xe7H~\xe6\xc6\x5\xd4\x8e\xaf\xc2)\xc9 `w\xa3\xf0\xfe\x8h\xad" +"_\xed\xab\x9a\x9b\x7\xa7\xd7\xd9s\xfd\xaa\xb8\x91P\x9a\x8c\x8c<\xb9\x86+\xbf\xe0" +"L\xd0\xc3P]\xf3\xea\x8aKQ\x98\x17\x5\xb3\x8f\xf5\x3\xab\xc1\x7f\xd8\x82\x30\xbf$" +"/\xd7\x37\x31K\x9d{a9\x89\x43\x8d\x9e\xfq\xd5\xcb\xecw\xf1\xd9:Q}\x9f\xe0\x8e\n\xa1" +"8\xd3\xaaU\xc2\x32\xf4\x93\xcc\xc1\xf1>\xc4_.\x7[\xb3\xa9_\rJ2\xd5\xdd!v\xa0k\xcb" +"\xcc\xfa\x8d\xf\xf2\xe2 \n\xd6\xf2\xcb\x91\xd3%\xeeH@\xaeJ'\xc8p\x9e\xec\xed\xe5" +"h,\xf\xd5\xd9MW\x7\x90\xe3\x4\xb9\xb4\xfb\xff\x8\x85-\x98\x95\xf7\xfa\xa0\x46Ob^" +"}Q\xf3\xfbT$\xee%\xe8\x9d\xa3\x39\x36\xde_1=\x13\xf3\xa5\xc5\x65\xe3>\xde\x87\xb2" +",\xad!\x1e\xb5\x8bp\xf6q\xf5\xa8\xc4s\xa1X\x98\xef=5\xc0\xd4\x96\xc6+\x1\xdd\xa1" +"\x96\x39\x99\xd3\x13\xb4u\xdb\xe8\xaa\x88\x8aMf\xcf\xe1\xaf\x9c\x86p}\x86&z\xb1\x8f" +"\xbf\xed\xe6\x88H\xbb\xb9\xddZ\xf6\xa5\x81{U\x94\xc6\xa7M\xae\x1c\xb8>\xbe\xd6\x16" +"\xf7\xbd\xe4\xa4\xe6\x1b-C" +"\xad\x97\xb0\xccX\xd4\x65{\xc2z\xefvr\x15\xcf\xe5\xc9\xf7\xa8}\xf9\xd4\x39\xce\xcf" +"a$\xba\xf2na\x9e}z\n\xff\xb6x\xdfn\xb3\xd6\x63\xbc\x9fw\xaa\xcdu\xfa\xba\xd0\xb4" +"\x16\"\xc3\xd5\xac\x9ax\xa4\x32YW\x15_6\xc9\xdb\xe2\xd1\xdf\xa8\x1b\xf0\xe1\x1e\x5" +"\x12\x97\x8b\xc8\xe7M0\xb7?\xc9\xfbx59\xa1\xc1\x32\x1b\x89;O\xf9xp\x84\x18R\x80\x96" +"{--\xf7&\x90\x33\x99\x94V;\x8a\xbd\x37\x1f\xfb\xb8\x32\x16[\xf1g\xf\x1b\x18\x19\x88\xda\x99\x62\x62\xbb\x3&\xef\x95\x91\xbc\xcd" +"\xb4\xd4\x80v\x86\x45\x1dXB\xd7\xa7\x9d^_Q\x4R\x8c\x89\x17\x8e(jA\x15\xb9\xec\xdd" +"6\xcc;\x1a\x8\xf3\x1cT\xa2\x94\x30'\xde\x1\x14\xee\x35\xd0\x96\x37\x9c\x16\x97\xff" +"`3aUt\x1c\xb4\x66\x9b<\xa4\x1cn\xad%\x8f})\xea;L\x93%\x11\xf6\x97\xee\xda\"\xb9\xc" +"\x0\xe\xd5\xdf\x81p\xf0\xe1\x89\xb1\x10\x13\xe3\x85)S\xc2\xfa/\xb2\x19\x7\xc5\xe1" +"\x9b\x83\x43\xfe\x43R\x9fr\x19\xfe\xcf\xa8\xb4\xa7\xbb>\x1\xfct\xeb-\xc1H\x94\xe" +"3-\x1fS\xf4\xf7\"lx\xb1X\xca\xdf\x82\xd7V\xb2\x1e\x96q\x8d\xb7{\xa7\xac\xa3\x1f\xd5" +"'\x9d\x19\xb1\xcf@i\xc\xf3\xf7\xa3\x62\x46\x11\xba\xb4\xa7\xb0\xeew\xb4\xe3\n\x10" +"\x9b\xbc\x15I\xd0\xa6\xf9\xb6\xf7\x36?s\"j\xd1\x9b\x92\x95\x82L\x15#\xa8\xca\xe\xfd" +"\x87\x8c\xdf\x81\xe8\xdf\x64\x15m\x7f_\x6\x87\x30\xeb\x30J\xbe\xe1\x34J\x9f\x8d\x36" +"m\x5@\xe9\x13\xd8\xf7\x9e\x9d\xa8\x4M\xe9\x0\x66\xa6\x39yo\xe6%i\xc7\x8a\xd5\xe5" +"-\xa7\x85;\\\xd2Qs\x7f\xce\xd1\xe1~us\xb5\x34\x1a\xe6\x92~\xf3\x8b\xb5z\x84\x37\xc" +"\xca\xa5\x6\xbf\x96V\xea\x0\xc7\xd6Z\xfcj|bSB\xf3i\xbd\x93'E\xfdN\xc2ZZ\xfbW\xc9" +"\xbc\xc\x8c\x82\xde\x8e\x9es\x90\xb1`d\xef\xff\xbd\x15\x1d\x9e\x16\x9f\x42\xbb\xf5" +"\xec\x9d\xf5,\xf8\x82\x89\xea\x9d\x82\x9a)\xa5\x61\xb0<\xcb\x14\xbcj\xc\xc6'|\xd5" +"5$\xe9L\n\xa1s\xd4\xb7->\xd2\xfd}}\xc7\xa2[|\xb9\xb7h1\xb\x88Z\x99H\x3\x37\xce,\x11" +"\xfe\x90=\x7f\xc5\xb5\x93v\xc9=l\x16\x9d%\xb9\xe8\xa2\xce\xc8\xb5\xd9q\xf7\x7f\x0" +")\xb6\x1d\x36\xd9\xc4j_\xea}I\xff\xe0\x32\xc;\x83\xf5\xa7\xdd\xa4\x8e\xe4\xa5\xe1" +"W!\xf7x\x12\xc5\xf6\x18xFp\xc9-r6\xcd\x1d\x19$\x8f\xc8\xc9\xel\xb\xc8v\xa1\xd9\xe3" +"\xb5\x38W\xfd>\xe7y\xfHn~\xc4\xdd=\xa9\x44\x96}b\xf7\xe8\xd7\x6\xa9\xf6\xeb\xff\x86" +"\xb3\x8aS\x0\xdfoTD\x14\x89xE3Q\xbf\x8d#\x2\x15\xd3RW\xbbT\xa7\x2\xef\xeb\xb4\xba" +"\x90\xf5<\xd1\x34i\x9\x32\x9e\x92\xe0\x64q\x2Y\xff\x8a\x33\xf1\xa9\xcc\xa5\xae[\xfd" +"\xea\x62\x87\x65\x39\xc0\xaay\xb2\xdb\xd9_\xb\x80\xacQ\x84.\xdf\xac\x8b\xa6\xc7\x9a" +"\xa9\xf0\x91\x41\x13\xca)VS\x84W\x1b\x88Z\xed\x9f\xf1\xe2\xdf;\xdd\x66u\x14\xa7\x8e" +"\xe2kY\xf9\x62\x61\xb6&\x8bz\xfb$]\xe6\xee\x93\x9\x43\xc3\xd5,#\x8e\xbbm\xef\x8f" +"gw\xdc\x98@\xd0\xc2 \xae\x81u\\t,<\xf4/l\xf3\xc3:,jO\xab\xca\x1\xea\x12\xc3{,\xd8" +"\x99\xcex\xe\x43\x45\x92\xf2<\x7f\xe9o\x87\x8a\xa5\xf1\x96\xd9\xa7\xb\xb3\xd5\x44" +"$z_)PB\x84!\x81\xd7\x8f\x1d\xd5\x8a\xf0\x9d\x99\xd2_FG\xbf\xefY\xe1\x33\xd4%z\xa6" +"\x89\xbd\xcf$\x85\x32UnjL\xfd\xf5X\xbf\xc1\xaf\x8d\x9\x91\x88\x9a\xd6\x1d\x8b\xa1" +"\r\xa5v\xd1\x36k\xe4\xf6\xb0 8\x99\xf9\xa0/\xab\x34\xe9!\xe9\xa7\xb0\x9c-\x6\xf8" +"\xc6`\xb\x9f\xfc\xb1\x87\xd9\\\x1f\xac\xf7=\x1e\xcd\xb2\x8b\xd4\xf5\x14;\xac\xae" +"^\x19=\xc0\xd1\x96\xe1j\xb2\xe4\xd3\x16\x8av$\xde\x98\x8e\x1b%\xe5\x64\x6\xf1+hF" +"\xc6m~\xe0w\x1eq\xbex\xe2\xab\xa6\x37\x36M\xf7t\xf9\x1b\xd4>f\x8\x35\x9b\x85@\xbd" +"\xf2.(\xc3K\xae\x81\xae[\xfeP\xd7TU<\xb6\x85\x8a\x8c/\xb7\xdf\xe8@B\x1bp+\x99\xf2" +"+\"\x14U\xd2\x8a\xc5_+\x8b\x1\xe5\xc6\xed\x89}B\xfe\x45\xa3m9o+&?\xe5\x16\x63\xf8" +"\x98\xfdtv0\xde\xa1\x34\xd7X\x95MR\xa4N6\xc7\x43\xdc\xd5\x83\x1fs*#\xd4\xaa\xf4\x9a" +"\xcfk\xcb\xb3\x88J!\x6<\xf0\xa0\x7\xe2Qk\xfaqh>4\xb3\x61\xd4\x45oSS\xe7,\x1d\xb7" +"\xc6\x93\xc9\xd0\x35z\xe8\x17\x9a\x64O/7=\\v?^l\x8c\x8bHr\x88\xfb\x83w\x11'\x84\xfc" +"P\xb3\x1e\x39\xdd]i\xd1J\xa8\x93\xb5U47L\xec\xf6\x19\xa9\x8bG\xee\xf8\x1c\x8c\xd2" +"\xb\xd3\xb1\x83\x86T\xf3\x8\xfc\xaf\x94PO\xd5\xfd\x8e\x93\xf0zG`\xc1\x82\x65\x11" +"Ew\x89\x90\x12.*\xfa{V#\x6\x1e\xc3\xf4\xd7\xd9\xf0\x61\xf2\xb7\xa7\xa0\x9a<\xcd\xc3" +"<\xb1` \x93\x36\x9a\xcf\xf1\xeb\x1cm\xfds\xdf\xd6zJ\xa9x\xba\x1b\xa4\x96\xbc\x17" +"\xef\xdf\xe7\xa8\xf5\x33Hl;i\xdf\x1\xbcZ #\x2\x35\x45O9\xf7\xach\xcaU\xa4\r\x9a\x5\xe2\xe3\x85\x83\\" +"\x88\x82\x88\xc2L\xd9\xfcQ\xad\"PI1\"\xe0\x30&U\xc4\x63\xcd~\x11\x88\xb5\x8\x13\x87" +"\xc4gK\xf1n\xdd,\x1f\x1eI\xb2h\x99\xdb^\x1aL\xb1\xbfj\xfe\x14\xdd$@\x8w\xf8\xc8\x65" +"{\xa4\xd3\"|v|\x19q\xbd\x33\xefpG,%B\xb6\x1H\xfcJ\xe3\x10\x35$\xb\xf5x\xe3\xbaL\xe8" +"\xa4y\xfe\xb4\xab-\x6\xca\x63\xf8\xb8\xc\xb0\xb5\x92\xb2\xe6\x97}\xb0+\xd2\xd9\xf8" +"\x13\x35\xf1?\x80?\\\\\xae\x42\x2\x36\xe8\xc5\xc1\x1d\xc4\xd6|!\xc\xf2iKG\xe7\xd7" +"\x1bG\xc2\x9c(\x0\x61\xb9\xca.O\xd8\xa3\x3\xba\x12\xae\xf8\x15P;g\x95_b\xbf\xcd{" +"*.\xa4\xe3\x1fy\x99\x87\xbd\xad]\x2\x8b)\xeb\x1d\x91\xbf\x89J\x8c\xc7\xf4u\x1d\x15" +"\xd1\x1f\x80\xc4\xc\xe\xaa\x38\xafZ\x9c\xf6\x9d\x89\x42\xa2\x13R\xe3\x65|6W\xd9+" +"@\x98^\xdc\x1e\xbf\xa8\x7\xc5(Zt\xc4}\xfd\xffy\xc4\x1a\xaa\"\x82n\xc0\x16\x1e:Nb" +"IfO{\x7fR\x16\x1d\xe\xd4\x63\xc\xa4\xcf\xddmh\xfe+KzMd\xd7\x5\x1b,\x12\xcd\xeM\xae" +"\xf\x66\x93-x\x81\xd6\x1\xfb\x62\xf3\xee\xacU.eL-\xe5\xbd\xaf\x65\x17\x8e\xfa\xc1" +"\xd9\x1d\xda\xdf\x43\x98\xb\x1a#\xd5\xc3\xb5\xd3\x8a\x39\x11UH\xb7\x12K\x8b\xc5\xfc" +"\x8f\x45\xe1_2\xf5\x6\xef\r}\xcf\x45\xc9=)%\x82\x91\x33\xa7\x32\xa8X\xcdo&\xa3Tj" +"a;\xc1\x2J\x8d\x31'nR\x93\"\xd8\x7[\xfc\x9e\x97\x4\x15\x94\xf\x96\xef\x9b\xe1\x14" +"\xaa<\x97\xfc\xc0\x8ang\x97\x1ahT\xf4\xcf\xdf\x8fkC\xa8\xd9\xfc\xe5<\xde\xaa\x81" +"\xaco\x97\xa3T_\x91\x88Ymx\xb6\xa3\x34v\xdf\xb8\x38\xfdlO\xa7\x85tr\x3\x13=E\x18" +"\xae\xe0\xc\x18J\xe0\xfd\xf5\xdb\x85\x3&\xad\x9f\xdc\xdb$K\xb4\xf6Y\xb6n3\x19\x33" +"OY\xea \x88\xe4\x95tw\xa5\xde\xfc\xa2\xd4\xa5\xfa>7\xfb\xfe\xd1\x38\x45\x0xN\x8\xff" +"\xa2\xf5\xaa\x41w\x95\xa1\xd2\xfeT\x82.\x10\xcb(E\x15\xb6\xf3\x94\xe7h\x1f\xd9\x11" +"Q\xb\xd6\x8e\xfa\"\x95y0`\x86%wZd\xa4\x8d\xc$\x92\xbe\xb3\xeb\xfe/\x85\xbbn\xbeJ" +"^@\x9f\xc7\xf1J\x98\xf9#\x93\x6\xc5\xeb>m\x4\xd7\x41\xbf=\xfcG\x8b\xd0<\xcf\xff\xf8" +"H\xe0\xed\x18\xe4{\xec\xb6\xc5\\\x39\xa4\x66\"\x83\xf3\xc4\xe2\xdf\xb7l\xae\xf1l" +"O\xab\x89\x44\xc1\xff\x62\x43\xe2'\x15\xaf\xbM\xe2\xfdjD.\xa5j\\\x88\xa6\xb9<6\xeb" +"\xe5\"\xb5\xc4`\x14\xbc\x3\xe8\x61gH\x1dY\x9b\xc3\xfe\xee\x5\x64\xa0\x90\xe4\x35" +"q\xb0\xdb\xe0\x96\x11H-i\xa2Pbm\xcb\x90\x96h\xf1\x45\xf9\xb6&\xf9\xa7\x90\x7fJ\x17" +"x\xe8\xac\x6j\xf5\xb9\xee\x2Qr\x91w&\xcc\xf4\x16K\x1e\xc~|\x94\xe3\xb7\xdf\x85\x16" +"\xc7\x8b\x1cr\xf6\xfdW\xca\n\xed\xe\x41\x9f,]\xd1\xff$\xf4t8\xc0\xe0G>\xdf\x9b_\xcf" +"'|\x84\xd5\x0\xa4\xff\x5Uf\xee~\xcb\xf5prb\xfd\xcd\x82_\xaf}\xa1\x65\x66'Q\xe0\x81\x13\x4\xec\xc1\xa7\xc7?\xf8\x6\x38\r\xac]aa\x13" +"\x88\xf3}z\x92\xdd\xa1\xc5\x35\xa3\x36Z\x82\"\x7f\x99\x9e?=\xde\x8b\xbdr\xa5#+32" +"\xe0\xcb'S\x12\xcd(\xf4\xc8@\xc9]\xe6\x36n\x2\x81p(x,\xe6\xee|V\xa0\x4\xd6\xdeJ'" +"\x86\x6\xf\xcbkm\x5\xaf\xdd\xc7\x43\xc2\x10\xf6\xf0\x45\x86\x3\x38,\x1b\xe8>a\xe9" +"\xa0\x38\x35\xc2\xf6\xbb\xa1\xa4v\x5\x64\x63[\xe8\x99\xf7[\xd2;\xf6\xf6\x36\x37\x1b" +"\xd2#\x8br3\x12 \x15o\xda\xf0\xa5\xd9\x32\xd2H)\xea\x5Kky\x10\xa7\x38\xc0<#\x1d\x1d" +"\xbc\x9c\xaf\x1\x65\xd4\x9\x1a\x31\x35\r\xa2u\x97i$\xf8<\xb4\x18~a\x89\x17\xb5o\xd9" +"\xb8\x81\xbb%\xa8\xd7\xf8t\x1b@z\x89\xab&q\x9d\xb2W\xd9\xe6\xb6\xc<%\x87\x8cX\x96" +"\x9M\xff\xc5\x88\x91\xfc|\xa3\xea\xeaj\xe4\x87l\xe3k=2\x82\xc4\xd1\xda\xb3sSL&\x11" +"\x4\xd2\x35\xca\x94\xc0\x8a\x9d\xaa\x3\x95@e\xf\xbb\x97\xba\x61\xd5\xd9\x7$K\xe0" +"\xb6\xae\x1a\xe2\xc3\x15\xfcz\x13\xfd\x19I`\x92.]T\xc8R\x8e\x8a\xe6\x65\x1e\x9b\x36" +"\xd7&j\xc9\x5\x8a\xe9~\xe0\xaf['\xb4\xc0\x45\xae\xc4\xd2\xbe\xd7\xc4,\xab\x91N\x10" +"h\xcc\x85\x38\x86\x1a\xec\xee\x62\x43\xb3\xd3\x8f`\xae\x9\xcd\x65]\xa0Z+\xcb\x1a" +"\x15\xf9\x14\xa4\xb8\x19\xd1\xe1s\xc4\xab\xf8\xd2_?)\xb4\\K\xcd\xcd\xcb\xff>$\xad" +"\xd7\xe7j\xea\x86g_\xd8\xe8wIH\xa1\x62]\xbd^\xe5\xfe\xc0\xd5\x12\xde\x9f,\xa7\xe9" +"\x1b\x97\xaf\xdfJK\xf2\x42I\x9bm\x8f\x4vk\xb\x8eu\"\xcf\x88H\xa4\xbc\xbe\x38,9\xcb" +"\xb3\xbf\x39>\xf1\x3G\xf1\x8a.m\xfa\xa6\x84.1\xcb\x9e\xee\xe4\x19\xc7\x62\xde\xbf" +"\xca\xf4\x9c\xd7\xbfXt\xf9\x92\xa7\x87\x3\x8\x17\xe9\xda\x99\x81\xb0\xd9\xe\xcd\xc5" +"8\xeb\xb1\x81+\x88\xc9kn\x93\xb3P\xb3'\xea]sx\x87z\xac\x9dq)\xc1P\xc5q\xec\xddH\x8" +"\xf0$y\xbb\xfc\x87\xf1\xdf\x80\xdf\x86\xedkW39\xb6\x9b\xcd\xec$\xfb\x9d\xf9<\x87" +"\x1aj\xab\x8f\xa2\x36\xb3\xd3\x9a\xba\xa1@C!\xd9\x3)qI\x92\x38\x99\xdf\xb4G\x2\x1b" +"\x95\x10\x42\x4\x41\xb9\xfd\x8a\xe8\x9e&gD\x1dvp\xb4\x6\x14\x39\xcf\xd8v}0\xd2\xd2" +"\x98\xea\x15\xc1\xab-\xd7\xb2_\xa5\x14\xba\xb9\xf7\x14\x17l\x8a\xe5\xa2\x4\xbb\x16" +"|\xdb\x33[\x13*5\xf6\xbd\x14\xb7\xf\xfdp1\xce\xbc~\x18\x9$\xf2O\xc5\x41q\x99\xcf" +"!\x1e\xe8\xe6\xa5^\x9J\xfbV73N\x8d\x42\x16\x8d\xa0\xdb\xcd\xa3\xb2S6pY\x88\xc9)\xef" +"\xe6\x8aV\xff\xdb\x15n\xac\x31\xc\xce\r\x6}\xc6\xb5\x64\x63Jq\xd6\xcb\xd6\xf9\xca" +"\x9f\x86\x8f\xd2\xae\x88w\x8d*\xc5*\xe7\x8d\xdb\xb7\xfa\x9c\x93\x9d\xba\x89}=\xcd" +"\xe0\xac\xf6\xe0MYe=\xf2+\xcbp\xf9\xfb\xfc\xfe\xc1\xeep>\x92;\x7\xe0\xd4\x13p\xc4" +"\xe4\xcfp\xff\x63\xf8\xc7\x9c\\\x64\x38\xf8g%\xa5\xeI\xe3\xee\xe1\x86\x87\xea\x32" +"Ne\x1d\xab\xad\x2.\x8ax\xefW\xc6\x30\xf1.\x9b*\xff\x39\x86q$\r\xc2" +"\x16\xa2\x9c^\xc1}D\xe0_\x1a\x8d\xde\x90v\xde\x92\x45n\x96\x9c\x80U\xb8Z<\x4\x4\x13" +"e\xec\x35\xd7\x9f,\x5\xab\xd0u\xf1N\xb2n\xeeG\x8d\xef\xf3\xd1/\xcf\x99\x37\xdd\x39" +"\x1\xd5\x9\xb6\x95\xf8\xc1\xfaY\r\x97}x\xdb\x84\xb2\x84\x95\x62\xc4`e\x98\x42\xa7" +"\xb9\xf\x8b!\xc2\xcc'\xd6\x42Xhr\xc4\x9bSM)\x9b?\xb7\xe1Mp\xa8h\x13\x83qU\xf\x9e" +"\x2\x1at\xd2\xa6\xe0\xf6}\x90\xd5>\xc4\x8P,@\xd8\xdcQ\xea\xab\xbe\x86\xfb\xf5W**" +"\x7f\x12\x1b\xea\x99\xbe\xb\x0\x45\xd2\xc5\x16\xd1\xc\x9b\xeb\x81>\x16\xf4@\x82Z" +"w\xd4\xde\xde,\x8bI\xc4\xac[q\xc1\x1e\xbd\x8f\x8f\xc4\xcds\xa6.G\xf7\xeb!/\xf0W\"" +"\x81\xb4'\x96\x33/pr\x8d\x92\x5\xce\x38W\xc\x96\xbd\x89\xb3\xf2\xa3\xed\xf4\x98\xca" +"\x83\xa3z\xcb@'\xb5\x61\xde(\xba\x37\xb9\x19\x9d\x4\xa5n\x14ql\xebJF3\x0v7\xb2\x16" +"\xb9\xf6\xba*N\xca\x8a-\xe0\xcd\x63\xff\x9\x44\xdc\x63\x5\x9b\xef\xef\r\xfbS\xa4" +"\x8e\xf6/T\xf1[\xc0\x35SVxy#\xedr\x9ax-\x96+Mx#]\xe8\xdc\xb3\x18\x92\x63\x8fQ\x0" +"\xf\x89\x81\xb8k\xfb\xd8S\xb2\x89)\xf8\x96\xa0S\xbr\xf0u\xcc\xb\xfa\xc7\x99\x63\x1f" +".Q\xf4t\xac/\x98\xe6\xe2\xfa\xb8\x9c+8\x90\x0y\x13\xbb\x98\x41\x96\x9b\x44\xedv\xd4" +"\xe8\x88\xd9\xb3\xd9\x84\x1d\xfa\xc5\xd4\x14Y\xdb\xe7#7E\xbbNy\xfc\"\xfd~Ff\x1\x15" +">\xfe<\xd7p\n\xa8j\xca\xd0{\x6\x92\xce\xaak\x0\xb2\rv\x8c^`R\x89LY\x15`~\x9c\xbc" +"I\xf8\xfeOo<3\x4_\xb4\xf0\xec \xa3\xc9H\xaf(\xe8\xf\xb6\x7f\x37\x9c\xcc\x1b\xd0\x19" +"\xb3\x39S!\x91\xcd\xb8\x3\xca\x96v\x97~\xd9\xca\x1\xbb\x3\x95SH\x17_\x8c\xaa\x95" +"\xa0qC'\xd5\x9b\x82\x44M\xf2*\xc4\xee\x8fPI\xc9\x14s\xf2&\xd4\xf2|\xe4\x2\xbb\xea" +"o@l\xf2\x18r\xb1[\x19\xafl\xc\xdby\x8f\x80i\x94\xec\x1a\xa9\x5\x66\x37\xb1\x39\x12" +"\xef\xfa\x8\xdc\x1[\xb6\x7f<\xa7\xa4\xc8,^4\xd3\x9d\x88\xcd\xd5(|0D\xba\x95\xf2\xf7" +"_km\xb9\xf1\xd6\n\x41\xfa\x90\x34\xd9\x1b\xd9\xcb\xec\xfc|\xe7\xd7o@H o_\xab\x9\x1" +"\xf7\xcd\xd6\x39\xed\x6\x8c\xc8+\xe1|5\xf6\xdb\xb8\xd8Y\x95\xa6?\xf6\x9eR\xbc\n\x1" +"&\x16\x62\x15>\xc3@\xfd@'\xea\xad[\x1b\x81\x1f\xad\x9e\x16\x66\x39\x18\xe4n\x98;" +"\x2\xa3\xad\x97\xeeTW\x8b\xf6Y\x9e" +"y\xa9\x9\xf\x35\xbe,\x9f\xde\x41\xe\xbf\xf0^\xa7\x61 \xc7\xd5+*b\xd6s\x8b\x1b" +"J\x9f \xeek:|\x1c\x6\x41\xb5P-R\xa2\x8d\x95\xdd\x7\xda\x8f\xc8\xeb\x96\xa2\x34V_" +"\xb0\xb9\xd8,\xbb&4P\xf9)\xc9\x15]=)\xae*u\xeb\xe8\x93\xd1\xebt\xb6\xf0\x62\x8f[" +"\xcaL\x90\xa7\xdd\x94=\xb0\xe9\x9b\x17\x8a\r\x83RH\x0\xb3\x61\r\x65\x14u\x90Y\x83" +"\xe8OY\x5\xf4\x9b\xe\xf1-\x88\xc\xee\".\x91;[\xa5\x1b\xc5S*\xfar/\x8e\xf9%LI\xf7" +"\xf6/tMX\xb\xfb\xde\xe1}@\xff\x9a\x4\xac+\xf6@\x16\xd4g:E8\xa6nR#\x8bOL\x1d\x37\xac" +"\x94\xf1\xf6\\{\xed\xa2\x46\x8a\x10\xb0\xdf\xa3!\xb1\x8c\x84\xe3x\xcd\xd2U\\E=b\xc9" +",B\x93\xba\n\xedg3\xaa\xfc\xad\xfbH\x8d\xfb\xe5\x45\xde\x91\xe4\x12\xc8\xa1\xad\x4" +"\xd9Y\xc7Rb\xe9*7\xc4\xd1\xbbH\xdc\xdc\xa4\xc8\xf6\xd9\xfb\x7\xa9\x18\xbo\x9cV\xef" +"\xa9\xad\x9a\xb9\xfeH\xed\x61\xd5\x9cZK\xf\xc2\x84\x35\x1d\x43\x9e~P>\x92\x35\xa3" +"\x8\x63@\x8f\xa5\xa9\x9a\xaai<\xb8\xae\xbb\xa6\xeb\x84v\x0\x92\x34\xbe\x91L\xe2\x35" +"\xbc m\x9\x32\x0\xd3Y7C\xea\xe9\xdb@\xf6\x39\xea\xb1o\xd3\xa7\xd0I\x0_\xbf\x93\x86" +"\x96\x94\x8d\x82\xbc%gLi\xd1\xd7\xed\xd0\xb6\xd5\x14\x38\x18<0v\x9c\xa3\x10N\xb3" +"x\xb8+\xcb^`]\x1e\x6Z\x11\xe1x\x92\xe0\xa3.\xb0\x7f\xa9t\xd3\xc6\xf7\xc\xb\x65s\x84" +"\xae\x83\x9ft\xc6\"\x65n\xfb\xd3\x87\x8az\xff\x1a\x1\xa2\x93>G\xf3\x66\x95;\xd2\x87" +"s\x87\x8cl\x99\x9f\x39\xab\xb2pH\xe5\x39p\xa5\xc8\x8a\x13|u\xe4\x9c\x91\xa5\x33\x16" +"\xc5\xf9\x4\x44\x64\xe4\xc\x1e\xeb>\xba\x35v*I\n?\xfe\x8f\xc8\x86\xd2\x99\xe9\xec" +"\xfc\xfeU=\xbf\x33I\x13\xb3\xe\x3\xe5\xbf\xbd=\xe0\x62\x7\xbfG\xcd\xaa\xeaL\xfc\x81" +"G\xbb\xfa\x15Mb\x95\xbd\x46\xafh\xad)\x8b\\\x2\xfb\x5i\xb6\xcaR\x13\x61\x42|U\xd4" +"V\xffm\x80\x83\x41\x7f;\xb3\xee\x88:\x95}\xd0\xe4S\xa8\x89\xd3\x89\xbd\xf5tQk\xe1" +"GI\x9c\xb0-\x9dv\xb\x62\xdd\xe4\xee\xebp\xa7\xfd\xc1#8\xab\xd0\x1dp\x9c\xcd%o\xfa" +"_b\xa7\xf4\xaam<\x7f#]\xae'eS\xda\x64\x99\x31G\xb5\xb8ob\xc4s\xd0\xd3\xed\x14\x88" +">\xd0\xdet\xf1\xc6#\xf3\xe6$\x9dj\xf1W\x1d\xc1w\xd2~,\x1f\xb\xff~\xd9\xdc\xce\x8f" +"\xcb\xd3{\xea\x85\x1\xae\xa6\xc6\xd7\xb2YB\xb\xdf\xb8\x4\xe3\xbf\xa4\xe3\x39p\x8d" +"\x19\xfc\xa7H\xd8\xed\x84\x5\x4\x39\xba\x7fZ\x8\x8d\xa4\x80/\xdc\x46\xb9Z\x99\x95" +"\x9e\x95\xf1\x84\x7\xab\xe2\x39p\x1ao\xba}n \x94\x64\x1cP\x9d\xa6o\xe5Vtz!\xb0\xd7" +">>~\x15{\xa4\x1\x82\x95\xee\xe6\x83\xd0\xfb\xdb\xfdRC~\xf5\x81\xb0\xe\xf2\xddX&a" +"\xa4\xa9\x9b\x2\xf6h\\\xb1\x83\xac\x80\x1f\x3\x8e\x32\x37\xeb\"\xf9P\x8cT\xb3N\x6" +"\xa1\xaa\xfd\xb4\xfcj\xdd\xacQ\x10\xd2V\x9dI!\xef\x8b\x43\xc6\xce\x36>d)Q\xba\xdf" +"\x0\xad\x1\xb5m&,\xb0ynk\xc3P\xf\xb7`\xac\xe1\xe7\xc9\xfe\x44\xd6\x81l\x84\x6;z\xff" +"\xe\xa0M\x91\x8d\x4\x8d\xc1\x93\xfc\x7\xba\xd3\xbb\x8ez\x17\x8f\x87 \xb6\x8a\x80" +"\x2~\x9f\xf2\xfeK\xf8\xf6\x1\xdeH\xb4\xc8\x63\xaej\xf\\\xc9\xfc\xa4\x61O\xb4\x87" +"\xa0\xd7\xe4,\xc1~\xc4)\xe1\x9L\x6q\x8aL\x1\xc5\x32\xcd\x8P>\xed\x35\xbe\xf2\xa8" +"<\x86\xe8Z\x8et\xcb\x93\x64\xa0\x1dz\xa5\x1a\xf9\xa7\xadY\xe9;x\xe3\xd1\x19\xe4\x0" +"\xed\x46\xc6\x8\xc7\x1e\x33\xfa\xcd)\xe4$\x12\x36&\xb5\x35\xa7\xec\x87\xcf,\x12\xd1" +"\x96\xe3x\x98g2\xc8\x94\x81\xd8\x8f\x14\xfc\xf9P}\xcdP\x83\x41\x10\xc0q\xb6\x88`" +"\x9\xe\x12\x8c\xb5%\xea\xc3\xb5\x19\xc2\x19\x1d\xcc}9\xd5\x87\xe5o\xb3:\xc6\xbb#" +"\x12\xeb!}\x8\xbd\xf9\xc9\xeb\x34\xce\x91\n\x7Gp1\xd4\xed\xc8\"nqB\x1fj\xe9\xb\xfc" +"C\xc7\x39\x89(\xdc/\xdf\x62\xa5H2L\x99\xe7@\xb5\x81\\\xba\xc9\x15\x7f/[Q\xa4j\x1c" +"\xf6\xec\xb6\xa0\x37S\xe7\xfdI\xcbJ\x4\xe5\xe8\xab\x19\xc4\xac/\xb5\x6\x18\xbd\x9f" +"\x14\x17\xfa\xf3\x42%R:j\xf9\xf9\xb2>\xf9\x82\x83\x1c_\x19\x46\x46\x7\x95\xe0\xb5" +"\x97\xb\x38;\xf8\xad\xde\xb0\x45\xc5N\x9cY?^\x1f\x9d\xaa\xef}\xc5\x8b\xda(\x19 \x9f" +"\x5\xae\xacO\xf2\x34\xe3\xbfG\xec_Ilu2$\x17\xa9m\xe3\xb7\xcP\x96\x93-\xd0\x2\x63" +"\x84\xc3\xd1R`Db\x92\xbaz\xc\xc5p\xa2\x9ak1\xb7\xa3u\x96\xdb\x1^\xc0\x84k\xfd\n\x66" +"L\xda\x3)\xe8\xa4R$\x1c\xbctC\xb4\xcf\xcb\xecH\xb9J\x1f\xb2\xba\xd1\x7\x32h\xaf\xd3" +"#\x1b\xb2\x1a\xc3v\x2\xdb\xf5\x65\x37\x80!^A\x8\xe2\xd4\xf7\x16K\x12\xe7H$9ss\xc4" +"\x5\x18H\x88g5s\xb1\xf2&=\xbb\xcd\xc0|\xea\xdb-\"\x2\xa1\x8a\xd0\x36R\xf0\x35_\xab" +"\xf0\xdf\x8\xc3\x2xIb\x90\x30o\x93\xbe~B\xf6\x63\xb5\x1eO\xf~I\xd3)#p\xc9+E\xbb\xb7" +"f\x7H\xcd\xad\x64\x1b\x1c-$\xbd\xc3=\xdd\x92r\xc8\xbclL\x80\xfd\xb1\xd6Gj\xa6\xa1" +"}\xe\x35\xb4>\xf7\xd3\xfb\xc7\x82\x8f\x2\x9\xd6\xf8;\x4\xaf\x1d\xf3P\xce\x10\xa3" +"\xaf\x84\x85[\xb9\n/\xde\xc6\xfymZ \xee\xe1\xb3#\xed\xfd\xe3\xd6\x99P\xce\x90\x89" +"A\x84$m\xce)I\x9c>\x87\xef\xfdV0\xaa\xbe\x14\x42\xe2\x39\x9f\x3\x93\xf2\x1b\xeb\x96" +"p\x8bl\xf0\xb6\xb2\x7\xe4rs\xbb\xe3\x3\xa3P$\xcfI\x89\x93(\xc8q\x91\xbf\xbf\xff\xef" +"\x95\x0\x61\x1b\xeb\xee\xdb'\x93;\x1fS\xd6\xbc\x80^\xd7\xc3'\x1f\xe9M\xcc\x7f\xfa" +"\x9f/S\x81\xc\xd3\xd0\x89I\xd5\xab\xb\x14J\x8f\xacS;\xa3\xeer\xbc\xe2\xbe\\\xd8\x80" +"4\xc6\x30<}2?\xef$2\xed\xc9G\xca\xd4\xafk\x1c\x38\xbe\x9b\xd1H\xca\xca\x12\x32?f" +"\xebW\xc3\x9lr\xf8&\x8etl\xff\xd4\xef\x80\xdf^\xcb\xcfR-\x85\xaa\x41\x16o\xdd\xed" +"\xfe\x8d\x84<\xb2[\x99u\x90\x8b]\xe7\xc4\xda\xb8\xff\xf7\xb9\x8b\x8c$\xec\x1e\x84" +"w\x12p\xea\x87{*^\xdc\xe1U9hY\x91\x97\x19\"\xf5\x4\x4\xb1K\xbf\x10\xe6\x62\x64\xfd" +"\x82\x7\xcf\x5\xc|\x3\x11\xd3\x87\xc6+x\xaa\xac+\x96\x9d\x31_Jyc\xa7\x9f\x8erO^\xfa" +"\x1\x90%\xe7y\xej\\\x90+}\xa8WC\x8e\x84\xa9\xbf\xf6y@\x9d\xed\xf5\xa4\xa0\xf6p\xae" +"E6\xf0P#\xa9\xe1\x12\xf1\x7f\xa4\xa2\xf\x18\x14\xf" +"\xf5\x65\x8\x8b\xe1qK\xc1\x97\x1\xa1Qf\xde\x32\x42\x9a\xb5\x5\x90;\xa5.\x1e\xf0r" +"\xa3\x4\xd1\x44\x87U\xce\x0\xdcp\x82\xdf}\x99\x6\x35WL\x9a[f\xda\xad\n\x45`Y\x3\xd7" +"1y\xe0\xed\x9e&0\xf4\x38\x61\xe2#T\xea\x16\x41\x8c\xec\xdf\xdc\xa0R\x1\xe2\xf7Z\xb6" +"\xf7\xb3\xea\xe3\x36\xc4\xeb\xf7\xe3\x85\x1c\xc0\x97\xe2\x10[\xea\xed!\x11\x44M\xe9" +"\x83\xc6\xb8/\x11\xb3/\xdd\x61\xea\xb4S1\xf7\xeb\xc1\xf9<\xef\x31\xf2#\xfc\xe6\xa3" +"I\xd8\x96\x96Q\xab\x62zH\x13\x14\xfb\xa2\xa3\xaa\x95\x3'%\x7f\x8fP\xe6\x9e\x1a \x94" +"8\x16\xef\x41\"Z\xe1\xb7h\x11\xc5\xaf\x88\x97lKN\x2t\xb4:X\xf6:'\xea\x89X\xa3\xf5" +"\xd8uD\x8c\xb5z\xbb\xebHYf\x8a\x11Q\x8\x97ha\x1T*\x8\x30\xac\x31\xf0v\xc5\xed\x66" +"&\xec\xd9\xee\xd0J\xd3\xe7\x62\xe9\x31\x8c{\xab\x7\xad\x32\x4\x83\x1fW\xb4\xf1\r" +"\xee\xed\x8\x95\xe2\x46h\xaa\xdc\xbe\xba\x92W\xf1\xec\x41\x91\x11\xe7%\x7f\xca\x9" +"\x8d<\xa8\x9a\x1d\xed\x16\x9M\x10#\x1b\xbc\xdc\xaf\xac\x11\x66\xc0\x8ap\x7t\x97H" +"\xe8\xc4\xf5\x0\xb9\xb8{\x84\xe8\x11pBWZ[\rPe#U\xdfl\xc6\x1c\xd2\xc7\x85\xb1\xc6" +"\x81\x1d\xb2\xe9\xb9\xb7\xb4rf\xb4\xa1\x8K\xe1\xf3\xf7\xd1\x88\xfb\xd9IL\xecQ\x16" +"\xfa\x62|\x80i\x95\x1\x13\xf7\x9\x9\x36\xf1\r\xe3\xd7\x1d\xe1\xb7\n\xfcV\xb6\x1e" +"\xe2\x45\xefrx\x86\xb\x64\x11\x32\x33\xa8\xa7\x81z\xc\xa2>_\x8\x37\xc\xd4\x85H\xe4" +"utx\xb0W\xa0\xaeY\xe9\xce\x81\xa4\xed\x7f\xf3\xac=!\x17\x35L\xb0\xa9\x86#p]\xea\xfa" +"\xd8\x9c\xe0\xc5\xb5\x19gv\xcb]Cy \xbb\\r\xa8\xa7\x18\xae\x62\x9b%\xe2S\xc7U\x1U" +"T b\x14\x80\xaf\xa2\xb9\x1bun\x96|\x7f$\xe3\x0Tb\xcd\x14\x96\xfbX\xf3JB\xa9\xd5\x9a" +"\x10\xd6\xd6\x8b\xb3\xc4%\x66\x16\x10Y\xdf\xbb\xcb\xa5i\xa0\x89\xd9\xc1\xdb\xae\xbd" +"\xe6Q\xb2']Y\xdf\x9\x33\xdc!\xd0\xa9\x2\xf2\x1c_P7)\x9cn\x8f\xb9T\x16\x91\xed\x13" +"\xc0\xe3jZ\xf5\x8d{\x8b\xb3`\xe8\xbd\xd2\xa7{$\x13\x8b\x88\xa5\xaa)8\x6o\xf6\xb0" +"\x98\x32l+C\x85\x38\x0\xea\xa4\xa3\x4\x10\"\x81\x32^\xcd\xfb\xb2\xbb\x14\x0\xf0\x9e" +"\xde\xe9z\xe8\x12r\x8c\xc1S\xf7\xea\xbcJ|\xf7\x61\x9at\xb4\x95\xfc\x82\xb5\xa8\x9a" +"\x9e\x2\x46\xf9\x83\"\xc2&k\xf8\x38\xbd\x1d\xef\xb5\x16\xc7\xa3q\xd9\x1b\xf5s\xde" +"\x96\xf0P\x1\xecH\xfd\xcb\x9e\x90\x45\xab\x1f\xc9\x10\xf6\xb9\x34J\xdbI\xc3\x8e\xb7" +"P#\x1n#\x98\x84\x66\x2\xe2\xfez\x7\xa9\xc\xa8\x63v\xfc\x12]\x8b\xed\x19V\xb8\x97" +"x\x1d\xefn\xb4)\x82\x4\xe4\xb5Q\xee\xc3\xce\x13\xb1\xfe\xe5q\x1f\x10\xc0\xc8#,\xcd" +"S?\x82\x31p'\xa8|0\xb9\x1b\xc1M\x91\xe1J\xd3\xac\x92\x17x0C\\'\xfa\x8b\x8f\x8d\xbc" +"u\xc0L\xab\x1\x81\x45^\xab=\x1e\x10\x1b\x14\x97JoO\xb9\x9c\x87\xed\x43_8\xf \x87" +"C\x8bK7\x1d\x1e\x61\x13\xbd\x65\x19\xaf\xbf\xd9$O\x3\x84\xda\xe1\x85\x2Z\xea\x64" +"W@\x1fTT^4\x94\x12\x1\x5\x9c\xe7V\xcf\x7f\xabO\xa5\x83\xf9\x86\xa8\xb4\xd5Y\xe8\x34" +"\xef\x33\x1ah3\x97\x1c\x89\xf9lX\xcd_\xb3\xbe\x13\\\xb0oe\x8f\xe2\x62u\x9\xc8\xcd" +"\xfa\x91\xed\xeb\x43\x9e\xb3\x86\xe3\xbf\x9b\xc4\xdcNr\x90\xa2\xff\xea\xe\xc2\\\xb" +"\x9c\x2\x12\x85\xab\xcc\x82\x1b\xef\xa4\x42\xc8|\xed\xb0\xa6\xc2\x34,\x93=\xd4\x61" +"\x16\xcaxm\xfa>\xe4:\x7f:\xea\xcaI\xe4\xf3\xa1\xd4\x4\xe5\x9e\xb3V\x11\xcf\xc6\x8e" +"\xbf\xb5\x32\x1e\xe4\xd8q\xb2\x6\xac\x86\x92\x93\xc\x89-\xd7\xcd\xc7\xb3\x1b\xae" +"\xa9\xa4\x39\xff\xfb\xc5\xf9\xd3\xcb\xa3\xe7\x1fV8\xdcm\xcb\x8c\x64\xf7\x63\xe2T" +"\xc3'\xf7sR){\xd7\x6\xf3\xa9\xb4\xec\xf0\x45\xb1\xf1\x32\xefx\xc2\x96~91\x0\xbeW" +"\xae\xa4\xb6\xa5\xa8\xcdQ\xb6\x8b\xc1\x14\xad\x91\xe1\xe4\x35\x12\xb8\x7\x98\x34" +"FNJ\x92\x31\xce\x83\x98%\xce\xcd@\xfq\xde\xa1\xb4\xda \x10\xd8\x9f?\xa8Po&\x88\x8f" +"%VOo\xbXdv\x8a\xbe=>\x85{\xc2\x65\xfbk\x99\xe9Td\x95\xe4\xbe?{;\xd6\x16\xed\xa6\xfc" +"\xa1\x9f\x5\xb8M\xf9j+qt\xcd\x31P)\x8.\xc0=t\xe9\xb1o\xdeU\xe6\xc5\x1c\x86\xb0\xe6" +"\xc0\xa1\x87Ru\xfb\xc8\xf2N\x8\xef\xf2k\xa2?\n\x96?z@\xc3Y\xdf\x33\xa2s\x1f\x13\xfe" +",\x90_o`\xac\xb4=M\x3\xcc\x63r\\\x85\xa4\x6\x10\x80\x89\xc3=\x82\xe1\xaa\x10|\xcf" +"\x7f\x5\x17\xbe\xbaVCv\xc2\x1c\xc2X\x9d\xday\x94\xcd\x35s\x97\"P\x9c\x63\xcO\x88" +"\x95\xbf\x36\x87\xbb\x8a\xba\xe7;^\x1c\x42\x91Y\x94\xc6\x14\xe9\x87kz\x1d\xc5q\xc0" +"n\xf0\x0\xd7\xecY\xde\xb5(\x19\xae$Qj\xaf\x5K\xb9\x15\x45\x31\x1\x16\xf9\xc4j\xf6" +"SC\x85?\x89\x66h\xdc\xeeGX\x99\xd0\x8fK\xc4\x5\xef\xbd\xc9\xd4U\xd2\xb4\x8c\xd2=" +"\x1d\xd4\xe4\xb\x89H\xfb\xf8\x34\x13+\x83\xbf{\x95\xe/\x83\xa0\x91\\\xc2w\xd4\x95" +"\x1b\x1d\x9b\xf8\xc9\xd7\xc2\x90\xe\xd2\"\xca\x89\xe7\xaa\xb7\xe6M(\xb0\xd9\n\xdf" +"\x9cG\n\xc9\n\xfa\x39Zc\x96\x46\x4\x65\x39\x36\xa6\x18\xdb\xbe\xe3<\xaa\x44t\xed" +"R*\xce\xe5\x61\x4}\xc1\x63\xc7\x84\xd5\xb8\xa2n\x4%k\x16\xf9lc\xee\xba;c\xdd\x8c" +"\xb0V\x83M\xf7\xf8\x46\xfa\x32\xe3/\xf\xfc\x14\xf0t\xf0\x38\x91\x81m\xe8`\xf2\x1" +"\x2\x80`\xc3\x4;9\x1f\xe9\x85\x8c\xf2\x96\"\xd5T\x18\xd6\x7f^nlq\x8f\x1f\xc2\xe6" +"-\xaf\x1d\xd4\xcfy\xeb\x95\xa1m\x9c?\xec\xcd\xed\xf2\x61\xf9\xf4\x19\x5\xf8\xb8\xc3" +"\x9b\x9b\xff\xb2\xc0\xe8\xd6^\xe4\xf9\xcb\xaeR\xb5_\xb3\xbb\xe1\x7\xc0\x8c:\xbd\x66" +"\x8e\x91`\x1c\x84\x9a\xf2\xe0\x34\xb9\x9d\xe6\x89\x12$\xa5\x61\xb7\x44\x9a\xec=\xb" +"\xe4u\x99\x1fR!\x1b\x9d\x16h1\x1a\xaaz\xc9\x18^x\xf9\xf\xd3\x1a\x32Kl\x82\xf\x7f" +"\x8e\x18\x9e\x95,\xd1^W\xd4uC\xe\x1b\xea\xf7S|\xf6\x64\x9e\x80\xe3]\xf1o\xc0:q\xea" +"\x16*\x19\xb7\xd2\x96\x17\xbdZ\xf3\x41\xe7\xec\x81\xdd\xc3\x38`o\xe0PvI\xbfv\x1e" +"\xcaor\xdc\xd2\xb2\x17\x97\x32\xba\xebQ\xd6Wy\x1\x9eg\x8c\xc8\x46\xf1\x84\xba\xae" +"\x95U\xf\xc4\x30\xd6\xc4\xe3\x15\xc1\xa6\x61\x93.Z\x8cM=\x81\xac\xb4\x45\xe2\xb0" +"\xb8\x7w\x1e*\xad\x84\x65\x84\x7f\xbf\xde\xfdr\x9\xd1\r\xbf\xa7\xfa\xf2\xc3\x4\x1a" +"g\x8cp\xa1\xc8\x7\xa6\xf8.\xb4Hh\x8c\x8e\x9al\x96\x8f\x7f\x9fL\xbf\xa8\x85\x5\x99" +"ur\xcej\xa2(\xca\xc0\xa8\xfI\x96IW\x1~\x90\x90\xbe\xe3lVl\x6\xe7\x9b\xeb\xed\xc2" +"\xde\x9ay\x2u\xe\x1d%\xf2\xb4\xa5\x1e\x10\"\x1bN\xf8-\x8f\x1f\xbf\xad\xdc\xe9\xf9" +"h/8C\xa5\x81\xeb\x10\xb5\\\xeaJ\x8e\xa1\xe2\xf7\xc8Kc\x94\xe0N\xa4\xb6\xbc\x9d\x9a" +"\xd3\x44\xc4\x14wrJ\x19os\xd9+\x9c\x43X\xf7:?\x88/DR\x4\\\"UQ'\xbf\x9c\xaa\xf5'w" +"\xc2\x0\xd6y\x86\"|\xb1\x7f\x94\xa1\x18\xba\x66\x34(\xab?\xdd\xa9\\\x35\x9a\x35;" +"J\xae\x31\xf9K\x4\xd8J\x9c\xci\x94\x7\xca\xaf\xb2r\xaeX\xef\x32\x8e\x90\x65\xb5|" +"3\xbc\x9b\xd7[5\xe4\xf7\xd2\xa6\x9a\xff\xb2\x13z\x9GW=R\x97+\x1J(\xf1G\x0\xf0\xfc" +"*\xf0\xaf\xb7\x1f\xa3\xc0\x38\xa4\xfb_\xc2\xee/\xc6Q%\x96\xb4-;r\xa6\x12\xb8\x62" +"c\x86+\xd3\xb2\xdd\x43\x33u\x86\x11\x7tt\xfa\xc0\xa7\"\xe1\xd9\x19\x9d\x66Q\n\x1a" +"\x86\xf8\x7\xaa\r\xe7\x1c\x13\x92\r[\xd7\x32\x88t\xbf\x1a\xe+\x80\xc6\xd0v8\xf2\x61" +"\xac$\xdc\xf7HS\x1\xc5\xd5\xcf\n\x8b\x62\xd6\x46\x88\x17\xd5{\x9e\xb8\x35\xa3\xf9" +"\x96n\xbfs\"<\xb5\x90\x9a\x1a\xe2\xa8[\xc9\xf\x1.\xe2kHJ@\xc8\xa9\x98\xad\xa3!\xa0" +"\xfa\x95\x5\xd9\xa0\x9c\x8f\x61\xd7\x8\xe8\xc{_GY\x9d\x12\xe0 \xfey\xd6;\xcb\xb6" +"\"~AX\xac\xfd\x41\x87\x9\x41\xfdwOe%\xb7\x8ag\x81\xfbPQ\x9a\xd9$\xe\xc7\xf3\x1c\x1b" +"\x85\xaa\xd4\x87\x45\xea.X\xef\x88\xb8\x90\xbf\x9c\\\xc5\x91\x1H\xae\xd5)\xf2iO\x1c" +"\xec\x8b\xe,0\x95*M\xd9\"\x1dS\xba\x84l\xbb\xaa-g\xd6N\xc2]\xb9\x7f\xef\x89s\xd5" +"\x12\x7\x93\xf\xe5XL\xde(\xa2sF\x8e\xd7q<\xf2\xe8\x86]\xec(^ \xf4\x9a\xd3\xe6\xca" +"NC\x90\x8a\x91\x16\xdf\x1b\xae\x41\xbf\xdbrK;\xf2\xcb\xfd%^\xe\xb6\x95`\xb3)\xb7" +"\xee\xa1K\xbc\xdf\xd0\x39\x8c\x66:\xb9\xc1<\xfcx\x98\xc6t\xbf\xa2\x7\x1\x8c\xd1\xc8" +"R\x81\xc4\xbc\x99[\x16\xee\xc7w\xf5\x1b\r\x19)\x10\x5SS,L>\x8eq\xac\xc6\xda\xf2\x19" +"4qpM?\xb9-\xe4\x94\xe8\x9f\x81\xbb\xf7\xbbp\r\xf\xe4m\x9a!\xf9\xcck\xf2Q\xae\x31" +"\xf4\x3\x34\xc6k\xd4\xf\x80\x1d\x2\xed\x63\xb5,>\xc6\xa1\x30=e\x9e\xde\x33\xc\xd5" +"=\xe8P(\x99\xeb\xc6\xdd\xa6U\xde=X1\x4\xe0\x1e\x12\x30\x1\xbc\xa6\xfb;\xa5\xff\xd4" +"\xf1\xe5\x6\xcf~\xd5\x9f\xe3\xf9\x91\x80\x8b\"r\xb1\x19r\x10\xe5\xea!;;\xf7\xd6\xa2" +"\x17|\xca;\x4\x83\x44{\xdb\x44\xad,\x80\xe0L\xf5\xe3hR_\x8dk\x9b\xa6\xb1\x14\xa4" +"\x14\\,\x8ai1\x13!\xc8\xd5\xceh/.\x13\xeeG \xe0V\x8e\xfd\x84\x88\xfa\xf5w`\xa9\x37" +"\"\xdf\xda\x84\x89\xefIc\xf2\xe6Yx\xad\xfa\xb8\xb9\xc9\xc8\xd9\x14\x61\x80\xb9+<" +"\x84\xc7%\xe1\xf5\xe\xa1\x35\x0Kdy|\xa6\xc6\xa8|\x95\x95.\x8f]h\x95\x8b\x64\x42v" +"\xd1\x6\xe3pj\xf1S\xca'\xf\x15\x9fo\x8a\xd7o\xb\x9fK\xe4\x93WO\xf5I\xadj\xb9\x9\xd4" +".W\x18\x42@\x1\xd8\xaa\x17V}\xfe\xc6j>\xc\xda\xf9\x8c\x89\xe5jF\x92\xf0\xd5\x85\xb1" +">\x8c\x8e\x1d\xd4\xa5\x80\x1b\x1e\xee\x8b:3;c\xd4Ne\xa2\xc5\n\x1b\x46\x61Z\xfcU\x3" +"\x90\xc1\x66\x8e\xa0j\xb0\xf6\xf9\xa1u\xe4\x8\xb1V\x8b\xb4p\xf7:\x9b\xab\xc7\xf8" +"'\x95\xad\x94\x6\x15p\x1e\xf5\xe2\x4h\x87\x41Gp\xff\xbe\x9c\x86\xbe\xcb\xef\x31\xda" +"o)O\xae\xd8\xe4\xf9\xca\x8Ja\x91]/q\x94\xadW\x8f\xd5\xb9\xe0\x1fL#\x2w\x8\xad\xd4" +"2o\xd7\xbH\xd0\xcb\xf9\xb4-\xf2\x86\x7\x84\x85\x9d\xd9\xcb\xc7\x7\x2\xc\x39\x17\xd1" +"\x92\xc\xe1\x64\xa6q\xd5\xe0\x9d&\x85\x45\xdf\xb9\xd2UZ\x1c{\x82\n\xc8\x2\x0|T\xb4" +"\x3\xe1\xa6\xf9U>l\xd5,d\x81nx\x8e\x61\x15\xeb\xe9R\rW\xaa]\x2x\xc1\xe6\x94\xf\xb8" +"\x9Y\x94\x1a\xf7\x8b\xdd\x96\x87ry\xca\xb4\\\x9e\xf7\xe4}\x90\xd2K[>\x8i\xb7i\xd3" +"\xa0\xfb\x3\xdc\xday\xee:R4\x9f?\xe8\x92\x4\xaf\xe5\x17\xb9tU\xea\x1b\x5o\x87\xcd" +"\x84\x62\x2Y<\xb7v\x8d\xd8\x93!\xaf=\xbd\xc0\xc1\x88\xda%\xb9i\x9c\xden\xb\x19(\xcb" +"@`\xf0\x9bOjl+hp\xb\xc1N\xb9\xfe(\x90\xfe\xcb^8\x9ev\x6\x18mD\x17\xf5\xf5\xa6\xba" +"\xbd\xf4<\x13R\xf4\xfe\xb4:\x99i\x8e\xcas\xc7\xd7\xeb\x93\xff]8\xeb\xfem\x10,\xfd" +"\r\x98j\xf3\x91\x84\xb4\xe0\x7\xbf\x65\x13\x1bj-\xab\xd1Y0 \xe2\xfd\xbaU\x9e\x93" +"\x9d\xaf\x7fl\xba\xce!vH\x9d\x45\xab\x86\xf\xa4\xa0Y0\xcdw\x18\x9cg\xd4\xb7-\xf0" +"?\xe8\xcfH$\x19\x97&!\xde_/\x1\x43\xea\x14\xf5\xdc\x8\x46;0+\xe1\xf4\xbds\xcd\x1f" +"l[\x17\xc7Mw@\xc8\x2\xcf\x19z\xb3\xf4\x12\xb6\x97\xc2\xbc\x8f\x41t>\xb2\xbeU\xe2" +"8\xdc\xdcj\x2S\xa7.cG\x9d\xbfV>j\x16\x19\x35\xf7\x7f\xe[\xc5\x37-\xd1\xf9*\xe1v>" +"\x5\xe0\x19\xb4yg\x80\x9d\x42p\x93$\xea\xde\x6\xce\xcd\x85\xda\xab\xc4V\xd9\xe9\x3" +"\xe0\x8=:t\xd5\xcd-\xf3\xb\xf1\xdb\x14w\xa6\xa7\x1aU\xa5#Y\xf4\x94\xf,3\x9b\xdbn" +"\xdb\xaa\xde>aML|6\xfa+&\xac\xcb\xf5 W\x9d\xf8\x9ar9\xec\x62xi\xae\xc6(\xe7\xf4\xac" +"\x9\xea\x13/~-\x3\x4\x8\xdc\x91\xf2Yl\x95J\x9c\x2o\xad\xcc\x41o\x1e\x6\x1bHCr!\xb5" +"\r\x8aKs\\\x91\xd6\xe8\xd2\x93~DT\xb0\xe8\xd1\xf5S\xb8J5\xc4>\x11\x1\xf4\x97\xf5" +"\xe4)\xd6\xe0\x85/\x1\x12\x13\xe7\x6\x8dS\xe4\xdcioo\x7f\xf9\x63}:\xc5\xed(\xb0\xf8" +"\xb5[\xaa\xba\xbf\xe8\xe9\xaa\x7f\xa6\x1rE\xb\xd1{a[\x1b\x89\x4\x8f\xcf\xee\x82\x95" +"R\x7z\xbc\x1d\x30\x61\\\x9bW%p\x1c\xb3\x9e\x66u@L\x82\x30\xba'9Z\xc8\xb5\x44O1\x86" +"\x0\xdd\xe1\x3\xd3\x3\x9c\xde\xf4\x65\xeh\xa9\xf1(\xc\xa8J\xa8\xcf\x87\xc6R\xae\xb4" +"\\\xce\xaf\xd1\xa2\x17\x93\x38Z\x17MJZX0p\x5\x93\xcd\xd9Ma7O\xf4\xebV>\xea\xee\x80" +"\xb7\x61#\xe\xd6\x1d\x6\xbe\x11\xfaWM\xe0\xael4RX:\xa5\x37h#\x8a%\xf5p\xef\xf0\xaf" +"_^\xbf\xde\xea\x98\xc8Z\xfd\xa5\x33\x19\x18&\x11\xe3\xe6(VY\xec\x99\xd2zq\x8a\xc5" +"\xa1\xcd|\xd8\xf,\x97\xbf\xe9\xbb\xed\xf6\x91*A\xa1q\xecX:\xe\xaaJ\xc5q\xb4\x95\xac" +"x\xb2u\xbe\xd4\x9e\xb3*\x2\x2\xa0\x7f\x1e\xbc\xb0\xa8\x9f\xd2\xd1\xcbn\xc4\x36\x31" +"\xe8\xe2hi\xaaj\xbdw_1\xe1\xca\xe5\x15\x8f\x90J\xc\x14\xa4\xefr\xd5\x1e P?\xf7\x81" +"Lqz\xf\x9b(\xae\x19\x89zD\x8d\x89\x5r]\xa4\xe4\xf\x17\xf6\xd7\x97\x85\x38\x9Z\xdd" +"^\x82\xe\x80\xde\x9f&\x1a\xce\x43\xd7}K\xf9u\x10\xf7t\x86\xe\x45\x3|y<(\x91[\x1\xcf" +"\xbf|c\x88\xb2\xe9\"[\xe'!\xcf_\xbbR\xba-\xa6\xbf\xbc\x11\xd5\x15>\xd1\x42?\xab\xc0" +"V$\xb5J\x1a`#^\xe2n\x90\x8f\x63\xc5(&1_\x1a\xd8O\xc7\x9d\xe2>\xd7\x93\xccuexGY\x0" +"\xe7\xa9\xba\x8a\x81.\x6\xd2\xb9r\x15VH?\xce\x1\xec\xdb\x7f\x83\x19\xbJo.\xb8r\x8f" +"[\xf9\x41\xa5\x93L\x96\x5H\xe4\xa8\xc0\xd1\x7fg\x8\x38\x66\x7\xa0P*\x1c\xeb\xc\xf8" +"\xee+\xa7\r\xe\xb\x35\x0\x19\xba\xf4\x15\xa6n\xe5\xe\xa8\xa8\xce\xefx\xad$$!\xd7" +"9|\x6\xca\xf7\x62\xf6\xb4\xbbT\xbb;\x84\x84\xf3\x98\x0\xf\x5q\xf3\xc9\x11\x1e\x96" +"\x16J\xf8\x42\nz\xaa\xd2\xb6\xb5\x5n\xc3]\xb\xd0+F\xa7\xe0\x7\xe2N\x1c\xdd\x16\x31" +"\xd3\x43\x85m\xa9\xa4\xb6n\xf3\x65\x61\x84K\x16\xe6\xbe\xb6\xf0\x8b\r\xc8\xde\x4" +"\xb0\x43\x64\x33]fW\xff\x91\x64\x95\xc3\xf9\xaa]\x87\xa2\xe4UB\x8a-H\x9fp\xc2\xaa" +"\xe0;d9\nn\x8\x30\x94\xe9%\xf7_\x7f.\xa2\x9a\x44\xc7n\xbbP\xd6-\x91\xfdx\xc3\x3\\" +"\xf4\xbb\xe1==r\x5\xda\xa2\x8e\xbb\xb2XEn(8\xc6\x41\xabQ\xe1\x65%\x94\xc9/Y/\xf8" +"\xd3\x1d\x90\xc6\xf1y\xe0gt~\x9dI\x9a^\xf\xcc\xf5\xc1gS\xbf\xb7\n\x32\x1\xfd\xee" +"d\x1c\x9f\x45\xcc\xff\xad\x87\x9eGyc\xc8\xd8\x91\x62\x19Tt\xef\x98O\x1e\xd3\xd6\x93" +"i\x90Z=U\xcag\x3\x88\x92\x13\xfd\x8c\xfd{\x2\x9a;\xe8\xad\xaa\xbf\x62\x1\x11g_oe" +"\xdf_[\x5\xc6\x35\xeb\xff\xd9\xd6\xc5s\xb0\xd6!tH\xc8\x81\xa4\xd2Rb\xce\xfd\xf4\x90" +"\x83\xe7uX\x9a@n\xd0?\x8b\x0\x38\xdc|G\xe1\xb4\x84\xdd\xff\x3Y\x94\xf4\xa6 \x9#\xc8" +"^\xdc\x82\x36\xd2\xe\x46\xb0\xd3\xe6\x17\xa8\xb0&\xcfpp\xce\xd1K3@\xe6\xdc\x34\xfe" +"\xf0 \xa9\xbep.\x17\xf4\xbc\xbcs\x87p\xe7oG\xff\xd8IaN$ }\xfa^o\x8d*\xaa\xb2\x4Q" +"\xd4\x41%\x46\xe4\xe\x8c\xbfV\xda\x8d\x12\x1f\x36N\x3\xee\x31\xc\xe1\xcb\x7fo\xa5" +"\x1ck\xce\xde\x9f\xc1\x98\xb6m9\xd5{#\xec\xcd\x34\x41\x46\x5\x93\xf4N\xc2,\xb4\x33" +"[\xf1\x9e\x9\xdd\xd8\x91\x84\xdc\xf\x9\xf6\x82\xdc\xa1\x87\x63\xear\xdbl\x8e\x32" +"\xfa\xaa\x8f\x0-I\xf9\x2='\xb5\x8\x39Z\xb7Q\xbe[\x2\xb5\xdb\x30\x9d\xc9\xa5\x1b@" +"\xe7uR\xbe\xe4\x8e\x37\x9f\xe4x\xbf\x33~\x3\x9d\xef\xcd\x99*\xfc/q*[\xf\x64n\xf0" +"\x90+Y=\x8e\x9f\x3\xbd\x9e\xb5\x12\xee\x34N\x11_\x84g\x1f!\xe5\xb5\xd0;\n\xc0T\x84" +"\x81\xa9\xa0r\x92\xf7\x9b\xf7LAw.\x16\x61\x1d\x15\xcf\x15\xec\x7\x98\x14\xec\xa3" +"\x1d\xf3\x80\xee?V\xe9\xbd\xb3\x9e\x0(\xb1W\x93g\n\xa6\xd1\xeb\xee\x19`0q\xee<\xa5" +"\x17\xfd\xa6\xf8\xc5v<\x9c\x97\xd1\x1e\xf6,\xd1\x95\x42\x41+U\xd5PX\x2t\x94\x14?" +"!}\xf4/\xf2\xde\x1cR\x9eS=\r\xdd\x46\xeb\xfa\x88m\xdc\xb9\x7-)\x9c\x13&m|\x7\xa2" +"\xce\x9f[v\xad\xdb\x44\xee\x65\x13$M}MU\xbe\x1a\xad\x98\x82\x14\x31(\xe\x33H\x89" +"q\x8b`\xb3\xe5\x89)\xa1\xb7\x19}K\xe0\x37S\xe2*[\xea!f\x9aN\xe7\x8a\xb0p\xa4\x1f" +".\xb0\x1a\x30\xf2\x0\x61\x9f\xcd\xb7\\\xff\x89\x81R\xf0\xc4K/\xa2U\x8\xcb\x34\x66" +"a\xf4\xfexF\x92\x8dR\x1J\xe2\x89\x81\xd8\x3\xea\xe\xb8R^j#\x18\xcd.\xd9os\x86\xa2" +"*\xc3`%\x2|]\x9dP\x18kZ(0\xde\x6+\x7\xefV\xba\x35\x88:\xe1\xa0\xc7k\xe5J\x9\x86\xeb" +"\xa0\x8f\xc4\x64\xb]\x18\xbd$\x7f,\xad}\x9f\x95\xbi\x8d\x11\xeb\x11\xaa\xe9\xf8G" +"\xf9%>\x91\xadL\xb5j\x1b\x8d\xc5\r\x19\xb8\x13\x62\xd1\xe1\xb0\x46\x61\xe5\x8f\xc8" +"k\x1\x65\x3\xbc\xff\xb6;=\xee\xf0<]\xfd\xfd\xb7\xcf,s-w\xa0\xd5_\xf7}/jz\xe2\xa8" +"\x96\xbc\x11\x84\xc9\xde\xb\xe3\x19$\xe0\x87\xe0\x82\x86(B~\xe\x61\xf5\x64\x14u\xc0" +"f\xcc\x66\xdb\x89\xc\x41}\xf5\x87\x9f\x11[\xf5\xd5+\x9b\xca\x3\xbbH" +"-\xa2\x39\x37/J\xf2\xdc\x92\xac\xf7'*5\xcf\x62,\xf6%\x12\x18\xdf\x39\xd9\xb3\xd0" +"DM6\xc8\xb7\xef}\xb3\xf7\xebW\xdf\x36\\\xed\x86\xf4\xa9-Hx,!\x94\x0\xb1:\n\x96\xab" +"2\xe0\x9e\x12K\x8a\xa0\x85\xbcP\x8c\x44\xe2\x99\xb7\xd5h\x9d\xbd|\xe0\x98\x1c!'\xd6" +"\x85;\xc0\x99\xe4\x37\xca\x5\x92\xafh\x1c\xe6\xffq\xa2\xdd$\x80y\x97(\x8a\xfa\x1a" +"@v\x2\x34-\x18\xf0i_D\"A\xc8\x97P\x4\x32\xfdsR\x9e\xeaU\x94\x8c\xa7~\x86\xc3\xf6" +"\xd4\xe8u\xae\xd4\xdc\xc5\x37}\x5Z\x8\xce\xc7\x0W\xe4\x13\x32@\xc6;\xa2\x8c\x1c\xa9" +"\x6#\xbe\xb5\x12\xe8\x9fO?\xcaV#\x9a\xd0\xc5z\x7f\xa9\xccmN\xbc~\xff\xb4'Io\xc3m" +"\x5\xc3\x95\xcd\xea\xfbZ!\xdd\x43\xc\x98\xfd\x80\x94>\xc4\x1e{A\xa6\x41\xa2\x8f\xc2" +"W\x92\x46\x92\xa5\x92\xc1\xae\xa4\x97\x12\xdf\xa7\xba\xa4o\x8cUbj\x1f\x30\xfd\x1" +"\x10]/\x9f\x46\xb\xdf\xfa\x83\x42\xcc\xad'{\xa5\xd1\x1d\x81[E\xad\xad[\xe5\xf7;\xd7" +">\xb5\xe2\xe5\xfc\xcc \x88;\xb5\xa1\xb5\xd5\xd5i\xc9\x93[\xb\xe7\x1e\x7f\xb8/\xb2" +"\xd1\xb4\xc2\xa8\xdc\xe2\x42\x36\xf6]+\x8f\xbf\xf5\x6o\xa3\x0\xf6g\xa4\xd2\xb6\xf1" +"P\xa9\xb1\xc2\xc6\xe5\rkod/\xaf\xf\xdb\x85\xcm~\xfd\x95_\x85\x82\x38O\x1a\x93z\x9a" +"2\xdd\x35tt\x3\xba\x93\xde|\xf7\xed\xe4\x37\xed\xb8>\x84\xe9\xdb\xaf\xfc\xe\x45\xf9" +"\x1Q\x1d\xfc>e\x14\x34\xbdX\xf0\xfcR\xc2\x8fl\xac\x35.\xb7\xac\xe4\xed\x61\xf4\x9d" +"\xf8\xce\xbf\xbe\xc\x9\x64\xe4\x84\xd2\xca\x8c\xa5\xf1\xfb\xc8\x39\xb9\x7\xf8\xc2" +"\xb5\xa4 \xcc\xa0\x65\x82\x86\x88'\xe9\x11S\x1\xfa\xa2\xbb\x43N[\xc9\xcc\x19x!\x7f" +"\xf5\xa9\x9a\x30\x38\xac\xf1:\x9d\x8f\xf8~\xa5\x45\xe4\x9d\xa1\xe9\xdd\xd0\xe9S\xf3" +"\x9c\xe7\xfe\xa2\xb0g+D3\x1d\x85\xa0:0\x15\x39\x9eO-\x3\xebr\xda\x46\x93\xf7\x33" +"\xa3K\xfa\x87)x\x6\xe\x65\xdcNB\x89O4\x14s\xee\xed`C\x1c\xe8\xfe\x1f,\xfc>WF\xc1" +"\xea\xd9n\"\x8c\xcd\x12\x3\xb\xbagK\xd3\xef\xc3\xdb{\xc7oV\xb7X\xa3\x91\xd4K\xd6" +"\xe9:Ke\xc1\xb1\x9\xda\x98\x81\x1b\x8\xffJ\x1c\x98\x19\xb$\xfe\xb0\xfd\xa2\x10\x7f" +"\xf8\x37\xbb;)\xc3\x1a\xfb-\xde\xbc\x35\x93\xedm\xf\xf0\xe8\x8b\x85\x32\"\x30\xac" +"\xa6\xf9\xcb\x82\xd6\x41\xa6~`,:\xb@\xa6\x95\xac\x1breS\x8aS\xb0M\xd2+T9Tn\x8cN\xf9" +"`p\xb6\x44i\x86\xb\x82\xbaO\xb7;BOh\x12\xcbX\xe\x17qPj\x89\x1cg\x8d\xf4\x85\x17\x84" +"\xeb\x30\xca\xa4\xd3\xdf\xe1@\xe5\x18\x62/\x87\x37\xb8oM\x9c\xff\xd8pq2\xe2\xb1[" +"\xe6\xb9\x87\xdd\x30\xa3\xbe\x84\x33\xe7\xdf\xfd\xe4\xd6*\xfc\x8em\xdf\xcf\xd6\x8d" +"\x7\xb2\xfd\xe9NBS\xb7U\x1\xd2\xc8\xe9\xf5VB\xe\x14\xc8\x89\x93\x32*$\xc3\x1fn7\xd4" +"[\xa1\xa2\xe0\x34\xb3\xf7I\xd3p^C\xce\xf5\x45\xd4z\xf8iHD\x8d\xd0\xb8\x86\xcc:\x98" +"\xa1\xc1\xb8\x39\x9b\xee\xa8k\xa1\xf3\xa6\x9f\xd5\xa4\xef,\xed\xb6p\xf5\xb9$\x9e" +"\x17h\x97\xe4\x6\x14\x9a\xe0\xc6\x6=\xa4\x9a\xca\xfb\x1d\xbf\xf7\x11\xb9w\xdc\x7f" +"]Jg6n\x93\xc7\xb7\xd2\xcf\xe4\x61\xe8\xfa\xa4\xd1i\x10\x9c\x8>l\xdd\x15\x64\xe5\x94" +"\r;\xcf\x64!\xabhO\x83" +"\x8a\xb2\x16[\xcfn\xc6\xd3\xa9=\xe2\xbd\x6)\x1bl\x4\xf8\x65\x87\x85\xa2\xf7\x1aL" +"\xcf(j\xbb\x90'f\xa4^\x97%\xf0\xdeVMq\xcf\x9dQJ\r\x88\xa2\xfa\xcb\x11\x9c\x7f`w\xd9" +"W\x16\xe5\xac\x93T9\xb4\x7f\xa0 \x8e\x9e_\xd9\x66\x61y\xf4Z!\xef\xc4\x17\xb8.\x11" +"\rl,\xb5\xd7$\xc3\xfc\x10\x32\xdd[$dL\xa4\x91\x8dL\xb4\xdf\xb=\x8e\xcd\xdc\xb2\xe1" +";\xaa\x96}v\xd4\xab\xcc$9 ^\x4\xc9;\x11$\xc\xae\x2\\\x45m\xe5\xda%\x34\xa5$\xaf\xd8" +"~N`\xd6.\xb1\xab}\x1dT\xe2>b\x9d\xd8\x87T\xc0V\xe7\x8f\x5~\xf6lI}\x99:\xf6\x1f\x9b" +"fTJ<\xa6\x99\xdf\xb2\xed\xeer\"\x19\x19\x9dIb\xcbr\xd3No{_\xc4\xbc\x45\xef\xd1$\xb" +"\xf4\xa8z+\x88\x35\\\xaa?\xbc\xfb\xdf\x61Y\xbc\x1cr\xdb\x44\x89\xbc\xa2yP~\x8d\xbe" +"g\xb1h\xdb\x9ek>\xe1\xe0$\xe4.\x2\xcb\x7j\xb7\x1e\xe6\x9\xf8\x8a\x10\x9b\xf0\xf\xf7" +"_\xc9\x1aS\xd4\x91Q\xf1\xf8O\xd1_\x99\x3\xf1\xd3\xa3\xc6\x66\x18\xc4\xc0\x7!\x87" +"_\x84\xa9\xb2UFfs\xdf{\xfe\xfd\x19:\xb0\r#\x94\x97\xd5\xae\xfaoxpY4\xf1\xaa\xad\x9b" +"jQQ;\xaesI\xccOR\x15LC\xe0\x36\x16\xbc\xdc\xda\xaa\x9d\xbd\x16\x8d\xce\xd6v\xbch" +"\xf\xfcj\xc\xcd\x9c/n\xfe\x80|\xf6\xab]\x82\xd2\xbau\xdc\xa1\xc2\xd7\xe0\x8d%\xbf" +"\xfd\x64\x8c\xd3[\x1e\x3\x82t\xaa\xd7\xcf\xc2q\xff\xef\xeb\xa5\rv\xd6\xd2)'\xb4\xd7" +"\x93\x1f\xbb\xc3\xcfJ\xec\x10\x1e\x7\x43L\xd8\xba\xa2\x8dz4O+K'U\xa6\xf7\x46\xa6" +"ch\xcc\xdax\xa0\xc4\n\xf1\xc1\xae\xf1\x81\x32\x13\xbc\x1b\xbd\x17\x15\x1b\xa7s-\xfb" +"\x8bY\x3x\xbe\xc8\x42\x66\xa3\xda\xa3Hqf\x9d\xb9\x97\xb1x\xf7\x99\xc0]1\r\xa0\xd9" +"}>\xd2\xf4\xb3\x1e\x33\xe4\xf1\x34\xb1y\x81\x8bo\xaa\xe8\r\xdc\x15\x99\xd0M\xc8\xfd" +"\x18\x92\xa9^\xbb\x12\x8eq\x9c\xfb\x88^\x13\xfd\xbf\xab\x96\xbe\xd7\x32\x63~u\xa4" +"#{\x3\x9\x90\xac\xf7\x9\x64\xbc?\x16\xb0\x95i\xc\x8bT\xd1\x62p\xb9\x0\x45\x63~\xe" +"P\x94{[l\xe\xc4\x38<\xf4z\xf5\x8awq\"\x11{\x1d\x93\x91.\x1d\x93\x90\xd3\x64\xe7\x65" +"?\x92\xf)_\xbdy\xc6\x35\xa1\x12H\x15\x83\xbbx\x18\x44\xe3\xef\xf4\xc8\x66|\x1f\x8a" +"\xab\xbdmt\xf6\x37\x86\x11\xfa\xa1\xb0\x91u\xba\x98\xef\xfc\x2\xf9\xce'\xd6l}\x18" +"\xc\xe4\xe8\xa7m\xa7\xcd\xb8\x99\x1&\rr\xafy\xf8R\x94\x7f\x89\xdb)\x93\xdd\x1d\x11" +"\xce\xd6 /p\xb9\xa6\xca\xecz\x82\x13\xc8N\xee\x4\x36;\xd2\xd6\xb\xc9\xbb\xe9\x36" +"\x89\xfa\xfe\xa0\xed\xe5u\xd4\x89\xa0\x31Q\x98\x18\xaeP\x8cY\x9a{\x14;\x1b_\xe2\xae" +"\x16J\x82\x63{w\xcb\xe4\x36\xd7\xcd]\x18@\xf1\xbe\xc3\xe4\xd6\xfa\xbe\xb3\xde\xea" +"\xbbW\xc\xde'\x0p\xb1\x41~,r?\x85>\x0\xa1\xd1\xd1*.\xc6\xca#\xaax\xe1\x36\xb1|\x7" +"\xe7\xb6\x9a)\x16\r\x61\xbaTW\x83\xa3\x86K\x1d\xa0\x89\x42\xfe@\xcd\"\n\xc3\x80\x8a" +"\xfcoi\xf1\x1c\x8b\xc8\xe2v\x1at\xd8s\x8c\xd4\x1b\xe9\x44\xfcP[%\xc3\xa7\x84\xe1" +"]\xbc\xec\x5\x9\x99\xc8\xe1\xf5WI\xc8\x32\xd6M\xfe\x1a\xf1\x19\xe5\xddJ\x5\x32^\xcc" +"f+\xcf\x7fjp\xdfo+a1\xba=\x95\xf0\xd3V?\x7f\x43\xa6x\xeb\x9c\x44\xf7\xf5\xaaP\xa8" +"\x6\x1al\x16\xd0N\x9\xb8\xac\x5\x82x\x9\xbe\xec\x45\x1a\xf1\xe2\xc2S\xfI*,\xaf\\" +"\xf3\x80\x1\xf2\xa6\x16\x86\xc2Lj\x11\x13\xe9\x9\x8b,I\xf9\x92\xd3*\xc4\xa8\xf0i" +"t\xef\x9f\x97K$\x11!\x91^\xce\x38\x33LA\x82x\xf\x9e\x32\xd4 _t\x84\xc0\x33\xd5\x97" +"\xc0\x91\rG\xbc\x37\x64\x0mK_\xc2\x8a\x46\x15\xbd'\xb4n[\xb9\xbb\x84\x83\xb5\x46" +"\x19\x33\xdc\x9e\x8i>\x9\xc2g\xba\xeb\x17P\rv>\xde\xfbP6\xf8 \x8\x1c\x1a\xd0\xc7" +"1\x12\x32\x6\xdewO\xa4\x64\xb9\xdf\x19\xe2\xbeIK;0\xe2\x9a\xb\x8a\xad&6\x2\x35~\xd1" +"\x1a\x66\x62r\xbb\xb1\x14\xa1\xe4\x90\x43\x1d\x83\x8b\xe1\x9a&\x8e\xa9j\x8d\x64n" +"\xdc\x15Y\x80\x38Y\x85$yk\x89\xa8W\xb0%\x93S\xd0\xc2V\xf+9\xb6\xde\x83\x83\xcb\xb6" +"\xcaM\xf\xfb#Z+v\x1b\xa3\xf7\x94\xd0g\xf1o\xd0\xe6Qq\x18&\x14\xc8\xc8(\x83\xbd\x92" +"\x3\x31\x8f\x38\xe1'\x9a\xc7\x13\xe6\x8e\xe3\x93\xef\xaeL\xb\xef\x1dOP\x9d\x19\xf5" +"@E\x92\xf0h\x90S\xd4\x7\xf1pj?a\xee\xf0\xce\x1dn\xbc\xffI\x1\xd8w\x15\x63\xb0\xe4" +"\xfb\x7\x85\x97\xf9\xc5\x90$\xb0\xc6z\xef\x2\x1W\xc0\x94Q\xef\xfb_\xbau\xa9\xc2x" +"\r\x87\xa8\x65t]\xc\xe8\xd1\xf5\x35\xdd\x7\xfe\n\x17\xd5t\xbb\x14W\xb5\xd1\xee\x9d" +"\xc5\xdc\x41\xec\x41\x8a\xa3\x18\x32\xeZ\xbc\x7\xb+g]\x1c\x46?w\xd7'S\x1cx|\xeb\xb4" +"f\x7-\xf\xda\xf2$\xa1\x90?\x18\xdf\x46\xe9\x8b\xb4\xccR\x88\xf1\x1f\x88oW\rw\xb\x34" +"k\xe0\x5\x98\xf9\x92\x9\xeb\xc5\xf2\xcc^\xd4\xaf\x88\xa9mlc$\xc4n\x96I\xb2\xfc\x37" +"\xb5k\n\x7+\xad\xb2\xc7\xf8\xafK\xe1\xcaYx\xd9\xdb\x9a\x45\xc9\x9d\x41i\x1\xcf\x8c" +"0\x90-=O\xd4\x13i_\x18\x4\x34\x45\x88\x8e\x91\xa7k\xd5r\xccL>\xd8\xea\xbf\xf2\x96" +"\xfe\x8a\x8e\xd3\x32\x5'\xee\xc\x98\x82\xed\xf4\x9cn\xb8\x39\xa1\xaa\xfa\xcb\x82" +"\xac\xdb\x87\xd4\xa1@\x97\nj`<\xdf\xe8\xbe\xe7-\x8auQ\xe\x43\xd1i\x0\x1a\xdb),\xc6" +"\xb6-\x6\x93R\xc4\xcf\xf9\x6n\x12\xd8\"l\x14\x36*0\xa6(\x8e\x38QY7\xfcT\x1d\x1d^" +"\xca\xb8\xa3)\x10\x98\xd3<\xfa\xf8\x93\x39\xc4\x38\x44\xf8N\xe3\xc5\x7f\x17\x15\x35" +"O\xd2\xab\x8f\xef\xa1\r>\x4\xf4\x31\xb6gG\xe9\x1a\xee,\x93_g\xd2Uk\xebK\x16\x41\x8b" +"<\xa8\x18\xc8\xb8_\x83\xb5\x92\xca\x99\x15\xd3\x41\x14\x1d\xc5*fvM\xb0\xbbt\x10@" +"\x88\xd9\x31Y\xc8\xcf\x31U\x83\x34\xe0\xbf\xd4\xc0\x1a\x12.Z\xb0o5\xb7Q\xf7\xfe\xa6" +"O?\x7\xe1\x6\x43\x81O85p3\xb3M\x82\xe7\x1c\xf9\x9e\x94\x81\xbd\x44\xf0\\\x9b:\xb0" +"\xdd\xd0\xc9\x2\x8d[%\x1e\xf3\xbc\x16}m\xc1\x37u\x87\x1c\xad)\xda\x1f\xd9\x1e\x46" +"\x1P\xf5\x15\x6\xb4\xfe\x13\x4T\xf2\xe7\xa3\xe4\xc9\xa4\xa2\xd7\xe6\xc4\x32\x91\xf7" +"\xd9\x41\x8d\x87r\xf5uV`a\xf\xa4\x90\x9bT]YM\xb\xf9\x8\xc8\x10\x92y9\x9c\xeb)3\xd1" +"\xec\xbb\xdd\xb1\x85\xb8\x41ra\xf[\xb\xe7\x12\xda~2O\x93\x38\xba|VdDI\xf\x83)2\xfd" +"\xb3?\xd0\x9e\x39{\xe0j\r\xe\xc0n\x94o\xf0gs\xa3\x38\xed\xe4\xe3\xbe\x9f\xc8\xac" +"\xf9\x8b\xc9\x81\xe1\xaf\xc\x41/\xc0\xbdsX\x93$6\xbd\xdc\x43\xb0|\x6\x19\x9\xd9)" +"h.}\xe9\x87*\xfbm\x9bW\xe9m\xef\x7f\xf9\xdd\xbeJd\xef!\xd1\x41\x89\xf7\x0Zd\xd2\x13" +"`z\xbeH\xc6p\"\x98\xc\xb3h\x17\x41\xd6\x33\xdc\xc1]_\xd3HL\xac\xea\xf5\x6k\xaf\xdd" +"\x86>>\xae\x64\xb6\x82n\xd7\xd7Ht\xab\xac\xaf(\xce\x96\"\xb1\xb8\xd4\x34*-\x83\x36" +"\x8w_\x97\xd0\xa5Y\xce\x42\x33\x0\x8c\x41/\xb0\x11~r\xe4S\x7\xb0\x99\xc6G$\x14\x15" +"\x6\xb2\xa9\xc5\x65\xedT\x1dG\x8fI\xae]\x98\xcc\x9a\x9bu\x11\x3\xef\xcb\xb9\xf0\x97" +"\x99\xfa\x87O\xd3\xc9\xbe\xab\xeY|\xe6\xeb\x42_\x93\xf4\xb8\x35`\xdb\x87\xf7Q\x82" +"\xa7U\xcc\xa3\xdd\xdd\xb8pve\xa8\xbe\x1\n@\xec\x61\x17\x4l\x91\xe5\x33\x7f\xb7\xca" +"7~\xc9o\x6;\xa5\xe1\xf9{\xfe\x1c\x12\x14qq\x3`l\xd3s\x85\x36&\xfd\x46\x6 \x13\r\xb0" +" \xb0_N\xa1\xd3\x64K*\x8d\xa1\x1c\xdd,l*\x6Q\x17'\x80\x98\x63\xb\xc7\xf\xdc\xe0\x65" +"\x1b\xc5\x16\x85\x84\x1d\x82O\xa4-\xf0\xea\xb5\x42|@\x81\x98\xdb\x9'\xc9\x11\x66" +"\xb4l\x9d\x89\xa7`\xee\xdb\x93\x8\xa5\x15\xcvu\xbc\x5\xec\xcc\xbc\x0Q\xea\x8d\xa1" +"\xfd\xe8\x13,\xc0\x64\x12\xf1\xd6\xdc\xe0+\xc7o\xfc\xee\xb8\x87\x5\x64\x7\x86 \xf9" +"\xfa\x7f\xda\x86x\x11\xa3\x30O\x0\xa4\x16\x9d\x96\xe5\xcf\xec.\xbf\xa9\r\x81\xdd" +"\xe0yIe\x9d\x31?\xf7\xf8@+\xdb\x1e\xeaL\xe0\x16\x63\xe3\xbe\xc0\x4\x0\xaa\x33\xf6" +"\xb8\x16ij\x13\xc8\xdb\xc3\x38\xaa\x19/\xcc>\x6\xc4[v\xea\x41\xef\x15k6E\xbf\xc3" +"\xee_\x1f+\x15\xef\x8f\xefv\"\x0q\x96\xf9\xd8'\x90\x97\x91\x9a\"T1\xe6h;\xb3\xca" +"\xbbq\xdf\xf8\xd8\xa5y\xd1t\xb2\x6?H\xd6;\x7f\xe1j\x9c\x83\xdf\xf1\xff\xae\xbf\xd3" +">\x9c\xa2\x93\xa8\xc3\xe6\xf9P\x1es\x90\xb\xf?\\i\x86\xeb.zt0{m\x86\xb8H\x6'\xc3" +"\x9c-\x1!\\O\x95\xba\xed\x4#\x5\xd7 \xdd\xe7\x11k\x93\x19\xe\x87\xd5\xf5\x5\n\xa0" +"\xdb\xd0\xe8\xd6\x98\x8a\x98.}*\x1bp\xb3\xb7\xf5\xf8\xb8\x6\xf4\x9d\x36&\xdd\x1e" +"\\\xb7\x3\x38\x3]\xf5S\xab\xdbL\xe6\xbeK_\x97}\xb8r(\x99\xce\x46\xc3\xd0\xaa\x83" +"1C\x8f\x1c\"\xe1iy\x83\xb8*:k\x12\x8f*\xe5\x13P\x9f\xc6m\x8aV\xf4\xf7IUqm\x0\x8\x1e" +"O\x1d\xcf\xda\x34@\x8f\xfc\x5\xca\x46\x81\x37\x97%\x18\x83x4?\x87^sK\xf5\xdd\xce" +"\x99\x18l\x95\x32\x99\x98\x0\xcdKBc\x10^\xf3\x14\xb8\xce\x10*>\xc7\xb5\xec\x8\x38" +"\xe6\x61\x8c\xc0\x16\xd8\xda\xb5\xc4Yv\xf4\x91\xcf\xc1\xf5\x42\xb6\x2\xc\x90}d\xf8" +"\"\xbb\x62j\xa0?\x4\x34H\x4\xda\x44M\xe1M\xe2U\x85\x32w\xdd\x16x\xaf\xaa\xf8*\xb3" +"\x85\x1a\xaf\xd2\xc8\xff\xb6\xb7\xa2^\xb5\xa1\x16Y6\xac\x2\xa5?\xca[j$\xc5\xb0\xc9" +"\x88M\x1\xb5H\x95\xcd\xc6\xe6LO0a\xd2\xeav\xa7\xb4\xf7\xb0\x16O\xaf\x3\xac\xcd?\xbe" +"\x9b\xcez\x12\xd2\xa3z\xf3\xf4L.\x86O\xbe\x84\"\xd4\x61\xabU<\x10\x1f\x9e!\xa5\xb" +"\xbd\xcbm\xdf\x39N/\x80\xf9J,r\x1f\xfd\xba\x3v\x88\xf0\x16\xc9\xbe\xc8\xdc\x1b\xbb" +"i\xca\x91\xb0H#\xca\xa2\xfd\x7\xaa\xb\x1f\x10q!2Q\xd2GS\xfcz\x8e\x15&(\xe2?[\xbf" +"\xcb\xae\xcb\xf\x61\xca\xc8\xdc\xc6\xa8\xff\xca\x3\x11H='\x98\x45\xcJ\xf2\x1fW\x98" +"v?[N\xc5N\x99\xcc%\xcc\xf0\x1\x9e\x95\xc7\xb8\x99g\xef\xf0\xe0\x2\xf5vX;\xf8\xff" +"\xa6hP\x0n\x9f\xeb\xf\x46\x18\xab" +";\xf2\xa8\xcd\x65\xcf\xe9vN\x8d\x99\x98\xb1\xd9r\xca\xcf\x11'8\xd7\x80LM/TU)\x3\x1f" +"\x81\x30o_\xbb\xe9t\x6\x39\x35uL\x8d\x8aU\xcc\xce\x35\xfe\xf8\r\xbb\x63\x19\xa4\xc" +"$\x84\xda\x95\xc7w\xd9\xab\x30\xdeV\xf0q\xec\x32\x98\xe3\x16\x33X\xc5\xf2\xd7\xd0" +"\xb8\x96\x8c\xa4\xdfr{\x8c|~W\x12\x36\xb7\xfc\x30\x8dl\x9a\xed\x82J~\xa3R\x7f\xcc" +"\xf2\x62n\xea\xd5\x81\r\x45\xdf\x80\x1a\xb7\\\xd9X\xcb\x42\xa0\xf\xf9sJ\xe6\xa9\xd8" +"p\xa4\x39-bI\x96/\x81\xbb\x14]b?_8\x4\x6\x2]N:I\x15\x9\x43\x9c\xa5\xc9Uy8ab\xaa\x2" +"\xd4W@\x80\xaa\xaf\xda \x3\xa2\xcch\x1\x65t\x9f\xd5\xdc\xea\xa9\x1b\xf4{\xd8\x38" +"\xf1j!\xe1\x16\xa3\x96\xe9\xe6\xf7X\xd4\x1d\xf5\r?\x16\x10\xf7\xd8\xa6RW\xae\x0\xf2" +"\xce\xdel\xab\n\xda\x9b\x16\xd9\xad\xdc\x30\xcbz\x6\x8b\x35\x8e$z\xb5\xc1\x81\x9" +"\"\xa7\xe#\xd6\xf\xcb]\x13\xb5" +"\xe5\x99|\xb2\xd1\x15\xab\xdd\x35\xc8\xd8\xd6N\xc1\xba\xc\xb\x1d\xa8o\xc4\xb\xb1" +"\xa4V\xc0=y\xbe\x63\xa8p\xe9\xa8\x82\xc2\x35\x95\xb\xeb\xabs;ZP\xad\xb0|5\xbd\x8c" +"\x7f\x88\x7\xf6\x3\xfd\x7\x34\xb4\x96\xe1\xa7\x83\xe5\x18\xa9\x6\x9b\xc2,\xe8\xf4" +"\x8f)\xb9\x5\xa1\x8f\x11\xf\xda\x8e\xe4:\xcf\"\xbe\xdf\x99\xb2\xeb\xb1\xe6\x7\xd1" +"\xab\x92\r\xc2\x90\xe3\r\x4\x1c\x46\x8a\xc\xf2}\x94\x83Q\xd5\xcr\x5uRd\xdcj\xddR" +"y\xca\x17*\xbf'\xba\x1b\x93\xa6#\xf2\xe4yd\x9Y,\xe8L\x1a\xe4\x10.K\x92!\xc6\xa8\xc8" +"Fc\x19\xe6\xbf\xe0\x89u\x9dh\xddX\xf7L\x19\xb3\xdf\x9e\x14\n\xa3\x1a\xc2kuD\xa8I" +"seP{5\xf8U\x86\xb6\x2U\x81\xb8\xf\x66G\xff\xf7\x13\x39\xac\xdd\x1\xc2\xfe\x36\xc6" +"\xb7\xe6\x15\xca#0J\x82\x8f\xb7\x9d\x89\x15\x45\xab\x8c\xf5\xd1Q)\xb9u\xaa\x66\x13" +"+\x89\xbd\x18\xe8\x9a\x91\x6\xb7\xa9]\xe0J;\xb4\xf0\x80%q\x88l\\8\xd0Z\xd0\x9a;\xe3" +"\xbb)`\x12\x8b\xf2+p\xa8\x10*, c\x83L\x96\x9c\xf0P\xa5\xaf<\x5\n\x33G5\x8e\x0\xfd" +"\xb0\x39\x1d\xc3\xe0\xbe\xfd\xb1\xe5!x$:\r\xde]\xc8?\xc7\xa8T\xeb\xa1\x98,\xe7\xff" +"e\xe7P\xb9\xc4\xdd\x86\xdd\xb7\xffJ\xe7\xb7'\x2\xd3\xcb\xc7\xa0\xb3i\x10-$|\xae\x19" +"g}\x99\x8f{U\xf\x90\x1a\xday\xa8#\x19\xf2N\x18\x6\xf4M\xd8%\x32m\x7f]\xf6\xa9\xc0" +"\xbb\x95\x46\xeb(\xe1\xd6\xdb\xdb,\xc1\x8b\xa3\xd4\x63\xab\xd8\x38\xb2\x8\x41\x9c" +"\x16\x8a-\xe6\x8f%(%\xfa\xf4%\xfe\x39\x7f\x85/\xbf\xb4\xd3yins\xb8K\x9a\x87\x64X" +"\xf5&\xa6#\xa5\xa0#\x8a!\xc\xd5\xbbq\\3\xd3\xa8\xb4\x83R\x90,-\x83\xd1\x89R\xc5_" +"\xa7I\x88Q2\xabk~m\xb7\x94\xb1Y\x88\xb9\xd5\x11\x43\x81$\xd8\xdd\xe3g\x8ateO\x92" +"S\xd0\xb8\xb5p;\xd0\xd3[?~\xa2\x94\xfd\xd9\xb4\x46\x1\xa8\xe7<\xcb?\xdb\xd9\x80\xc2" +"9\x1dLy(\xb4\x1b\x46\xe9\xad\x16\x38\x86\xac\xc2\xb6\x8c\\L*\x6\x91\x1a\x7f\xb3n" +"\xccTK}\x88lu\xda\xcbR0\x8e\xe0\xef\xea^?\x16\xa1\x10(\xa5\x39)\xf7\xb4\x95\x38\x96" +"\x1\xbd\xca\x15\x86\x9\xb9\xd8\xbe\x1a]h\xe5\xce\x38'\x18\x9a\xfJ~\x18-\xb0\xeb\x81" +"\xfa\r\xcdlXp\x98\xf2\x64\xa3\xd0\xe2\x4\x9f\x84\xc8\xa4\xe8\xffP:h\xe8\x10+CjK\xc9" +"V\xeb\x90\x81\x14<\xf2\xcb\x90:\xbas\x7\xf\x8b\xf\x39" +"\x80\xce\xb2\x88\x14\x94$\x96\x8b\xc1\n\xb2\x46j\x15\xce\xdb\xdfU\xe\xea\x62<\x16" +"*:yc\xd6W\xce\xd1\x19\x10\x16\x2\x89\x8b#\xd7\xcb\x99\x61\x8b[=Y\x86\x8fZ\xc3\x1c" +"\xe2\x89\xef\x1d\xf5k\xa4\xc5\xc3\x98\x6\x8dZ\x92\x8aJ\xa5\x33%\xd9[\xd1\xc7t\xf0" +"\xd1\xd5\x3\x62\x8b\xa1ToFC\x3\xe0\xf4T\xccj\xca\x98\xd0\x32\xac\xf0Xr\xda\x95\xa9" +"\x18\x8d\xf\"K\x87\\\x5\x15|/\xc9\x93\xd6U!\xa7p\xe6\x96$\x7\xa2,\xf*\x14\xb8\x0" +"d\xbb\xc7OIla\xb4\x42U\xc4\xcQ\xbd\xf6\r\xbf\xa7\x90\xfw)mY\xab\xf6\x1f\x96O\xef" +"\xb6\xaf\xf3\xf5\xdc\xcd\xd7\xa8\x12\xfb^\xc3\xcm\xc8\x6;\xd8(\xf6\xad\xea\xd2\x42" +"\xdc\nnr\xb1\x0\xa6\x94\xac$\x8\x9d\x15\xb\x87)\xdeZ2*\xd7}\x84\xe7\xf4\xa6%p\xa1" +"x\xf0\xa9\xec\r\xd3*{\x90\x91x\xd9\xa5\x44\x43\xc\xff\x30\xe2\xe5p\xdb\xbb\x64\x9d" +"\x9e\x19UK9Tg\x13\x4~\xe0\x86\x1b\x8a\r\x96\xfi\r..\x16\xf$\xf1R\xf6\xf0\xa9?k\x13" +"\xb1\xeb$w\xa4\x16\xfb\xf3\xc1R\x96\xdd\xb1:=\x9\xf7q\xd8\x61\x8a\x85\xde\xc2\x36" +"/\x88\xd1\x17\xf1\xbb\x17N\x82\x9f\x96\xf9\xbe\x96[\x17S!\xa3\xbb\x7\x46\x37k\x95" +"&\xb\x82\xcf\x34\x13M)\xba\x64%\xd9\xb8nvG\x91\xd6\x99xAQ\xbf&\xd4\xdc[\x1\xcc\xf" +"\x88&\x1d\xf8\x8e<\xab\xb3q\xd3\x34\xe1\xa2\xf5\xf6\x9R\xecp8@? E\xf7\x9%\xe9\xd8" +"\xb4\x9e\xcc\x33\xb\xd9\xfV=8\x94\xb1\\\xe6)\xe6\x86\xe3\xba\xe5\x94\xe5\xc2Q/y\x82" +"\xea\xb9_\xd4<\xd5\x95\xd8\xec_\xdf\x96/^Rw\xe4\x16\xa9\x1c'\x91x\xbd\x98\xd0\x82" +"\xce\xd5\x65P\x15\xc9\xf4%\xc0H\xae\xc1\x35\xf5\xbf\x41&\r\xeat\xfc\x1c\x16\x98L" +"=\xb8\xde\xaa\n\x65\xc1\x42kz^\x91\xac_g\xe2\"\x90^\xfc\xdd)|\x1c\xaa\x1d\xfc\x17" +"\xfa\x1a=\xe4\x62\xd3 \n\x14\x91\xd4\x1b&\xf7\x99G]\xae\xd3\xd6\xe3\xb1\xfe\x92=" +"<\xacPX#\xa1\xe7|\xe6\xb0|\xc.\xfe\xc2\x7\x34z\x8e\x44\xd3\xc5\xd1\x96\x37l{~\xdc" +"\xe7\xc9\xbe\xd0Q\x9d\xa1\x91\xa6?\xab\x42z\xb9\x30\xc1\x15oQ\xc8\xd5\xac[\xd9\xd0" +"b\xe0\xe0@\x89\x35]\xf1\x61\x94P\xc4\r\x0P\xbe\xcf\x10\x37\xbd\xc9\xb6-}L\x90\xb7" +"b\x19\x99\x1d!Z7\xb3\x10\x91\xcf\xd8\x32\xd6\xa9Vi\xdd\x2\xb9\x4\n\xc2\xb6\x4\x19" +"\xdc\xf0\x64\xaap\xa3\xc9\x1a\x10\xe5\xe4\x8p\x93$o\xb9VE\x82\x8au\x8d\x83_Q\xdc" +"\xc7\xab\x13;6\r\xbb\x0<\xee\xaa\xa1\x10-\xfc\x7\x93\x1f\xe\xe2\x38'=\x9d\xc4\xc9" +"\xc8\xb8\xff\x8\x92\x32\xbf\x82?\xfd\xd7\xa3=\r~\x14 p\xf2@\xd0x\xfd\xf5\x90\xda" +"\xfd\x88\xb8\x96)\xb0'Z\xf4\"\xebT\xbc\x12\x85\xea\xe5\x8c\xad\x6\xbc+\x12\xd5\xa0" +"\xc2\xbf\xe5\x1cM\x10\x82\xaa#\xea\xaf\x33\x42q\xc0R>1\x93\xd6\xaaKj0\xbc\xca\x62" +"\xed\xb6\x62\xd3\r\x93\xf5\xf5S\xa2\x11\x61,\xc2\xea}\xa1\xd1\x91\x12\xcb\x98\x17" +"'\xed\xf4\x41\x36\xef\x35\x8e\xda\x2\x44\x46I\x0\x8a\x8e\x9d\xb0\x98Z\xce\x34\xa5" +"k\xcc\xd4\x93\x37\x81\x38\xaf?\x16\x32\xcd\x88RY\xf0\x1f\x97\xa3\x8b\x18TC\xe3\xb4" +"@\x8a\xaa\x6\xc0\x95)@5E\xdcv\x8b\xe1\xf6\xe4\xb4\xe8^\xc2\xf0\x94\xab\x6\xd4\xed" +"xb\x4\x89\xde\x90\x14\xed=Jv\xaf\x19\xa7\\=e\xc7<\xf8\xb3\xae\xda\x99>\x97(\x9b\xba" +"AgX\xd5\x61\xd6\xdc\x12#\xf3\xa5\xa7@\xc2\xa6O\xe4\xaa\x2\xa8\xaf.\xff\xf0\xa3\xfd" +"\x8c\r\xac\xc5\xb6\xa9\xf0\xea\xe8\x83\x33Y\xbfk\xef\x10\xd0;\xd9\x31\xf0[\xea\\" +"\xc1\x17\xe2\x1a\xa4\xe3\xa4\x86\x84SW\xa2V\xaf\x1a\xc2\x82\x96qit[\xce\x45\x92\xb4" +"P\x1c\xf4\x10\xe4\x4Z\x8a\xc4{\xf7/\x80,\xe9>V)H\xb0\x8Hs\xf3?\x87#@\xb4\x93\x9T" +"\xa9z\xe2^\x9ctgq\x17\xeb\xba\xcc\x18\xe5\xcf\x9d\xa2\x89\x61\xe6\x44,T_~\xe1\r\x6" +"\x89\xca\xd6{^~\x9a\xbc\xba\xd9\x34g.\x1:b+\xcd\xe5\x41\xa2\xba\xea\x62\xf9W\xc1" +"\x99\xfc>\xeb\x1b\xb8\x9\x1e\xd8\xac\x15\x9fZ\xfb\x61\xd3X\x93\xaf\xba\xa5\x88*\n)P\xf9\xac\xdb\xb8\x8dH\xb9\xd7\x64\x80" +"\x91[\r\xd9\x85\x7L\x4)\xe9\xf4\xec\x35lm\x1f\x41\x80\x96\xea\xd1\x8c\xb7\x66\x9d" +"\xcev\xe8\xb2\x1ak\xc\xf1\x9d\xba\xf1\xe7\x9e,p\xa1\x88\x8f\xfc\xaev\x17\x45\x18" +"\xc3U\xc3\xf7\x33\xb6\xd0Q\xd9\x37\x1byi\x8\xc0\x9b\xa1\xcb\x9f\xe3\xc7\xe1nE)\x91" +"!&\xb5%>\xffj\xce\xcd\xa3\xc3\x7f\xcc\xc7\x61\xf9\xd7\x81\xf0\xc7^\xb7\x7\\\x12\x1c" +"hT\x7\x6\x95\x8e&\x16n\x19\xe1\xc0\xb2\x9e\xe0\x8d,#\x82\xf9\x9a\xc7\xe\xe4\xeeJ" +"b\x96\xa4\xff\xecU/=\xb6G\x1a\xa4-;8\x85r#\xfeQ\x1d\n\xa3Z\x84\xb1\xc1 Z0K-\xb\xfc" +"\x95\xff\xfb\xd6\x3\xe8\xe6\xf4.`\x1z(\x8\xba\xbe\x0\xc2p\xce\xbao\x93\xb8;\xb9\xc4" +"\x1cw\x87\x99'4\x17\x1f\xc2\xa4\xf0\xb4o\x6\xc6\xf0)\xc8,\xcc\x98[|<\x84\xea\x65" +"Tx\xffy\xe8\xab\x8f\xe6\xcc\xe5\x91\xec\xb3\x9c\x35:\x80\x1\x14\x2\x0\x0\x30\x30" +"00000000000000000000000000000000000000000000000000000000000000\r0000000000000000" +"000000000000000000000000000000000000000000000000\r000000000000000000000000000000" +"0000000000000000000000000000000000\r00000000000000000000000000000000000000000000" +"00000000000000000000\r0000000000000000000000000000000000000000000000000000000000" +"000000\r0000000000000000000000000000000000000000000000000000000000000000\r000000" +"0000000000000000000000000000000000000000000000000000000000\r00000000000000000000" +"00000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" +; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h new file mode 100644 index 000000000..79a897f65 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h @@ -0,0 +1,69 @@ +#ifndef __fonts_h__ +#define __fonts_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +extern char* d050000l_afm; +extern int d050000l_afm_len; +extern char* d050000l_pfb; +extern int d050000l_pfb_len; +extern char* n019003l_afm; +extern int n019003l_afm_len; +extern char* n019003l_pfb; +extern int n019003l_pfb_len; +extern char* n019004l_afm; +extern int n019004l_afm_len; +extern char* n019004l_pfb; +extern int n019004l_pfb_len; +extern char* n019023l_afm; +extern int n019023l_afm_len; +extern char* n019023l_pfb; +extern int n019023l_pfb_len; +extern char* n019024l_afm; +extern int n019024l_afm_len; +extern char* n019024l_pfb; +extern int n019024l_pfb_len; +extern char* n021003l_afm; +extern int n021003l_afm_len; +extern char* n021003l_pfb; +extern int n021003l_pfb_len; +extern char* n021004l_afm; +extern int n021004l_afm_len; +extern char* n021004l_pfb; +extern int n021004l_pfb_len; +extern char* n021023l_afm; +extern int n021023l_afm_len; +extern char* n021023l_pfb; +extern int n021023l_pfb_len; +extern char* n021024l_afm; +extern int n021024l_afm_len; +extern char* n021024l_pfb; +extern int n021024l_pfb_len; +extern char* n022003l_afm; +extern int n022003l_afm_len; +extern char* n022003l_pfb; +extern int n022003l_pfb_len; +extern char* n022004l_afm; +extern int n022004l_afm_len; +extern char* n022004l_pfb; +extern int n022004l_pfb_len; +extern char* n022023l_afm; +extern int n022023l_afm_len; +extern char* n022023l_pfb; +extern int n022023l_pfb_len; +extern char* n022024l_afm; +extern int n022024l_afm_len; +extern char* n022024l_pfb; +extern int n022024l_pfb_len; +extern char* s050000l_afm; +extern int s050000l_afm_len; +extern char* s050000l_pfb; +extern int s050000l_pfb_len; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc new file mode 100644 index 000000000..1e668a054 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc @@ -0,0 +1,606 @@ +#include +#include +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../devices/rescale.h" +#include "../log.h" +#include "../../config.h" +#ifdef HAVE_POPPLER + #include +#else + #include "xpdf/config.h" +#endif +#include "GlobalParams.h" +#include "InfoOutputDev.h" +#include "CharOutputDev.h" +#include "FullBitmapOutputDev.h" +#include "BitmapOutputDev.h" +#include "VectorGraphicOutputDev.h" +#include "../mem.h" +#include "pdf.h" +#define NO_ARGPARSER +#include "../args.h" +#include "../utf8.h" + +static double zoom = 72; /* xpdf: 86 */ +static int zoomtowidth = 0; +static double multiply = 1.0; +static char* global_page_range = 0; +static int threadsafe = 0; + +static int globalparams_count=0; + +typedef struct _pdf_page_info +{ + int xMin, yMin, xMax, yMax; + int width,height; + int number_of_images; + int number_of_links; + int number_of_fonts; + char has_info; +} pdf_page_info_t; + +typedef struct _pdf_doc_internal +{ + char config_bitmap_optimizing; + char config_full_bitmap_optimizing; + char config_only_text; + char config_print; + gfxparams_t* parameters; + + int protect; + int nocopy; + int noprint; + + GString*fileName; + GString*userPW; + PDFDoc*doc; + + Object docinfo; + InfoOutputDev*info; + + pdf_page_info_t*pages; + char*filename; + + /* page map */ + int*pagemap; + int pagemap_size; + int pagemap_pos; + + gfxsource_t*parent; +} pdf_doc_internal_t; + +typedef struct _pdf_page_internal +{ +} pdf_page_internal_t; + +typedef struct _dev_output_internal +{ + CommonOutputDev*outputDev; +} dev_output_internal_t; + + +typedef struct _gfxsource_internal +{ + gfxparams_t* parameters; +} gfxsource_internal_t; + + +static const char* dirseparator() +{ +#ifdef WIN32 + return "\\"; +#else + return "/"; +#endif +} + +void pdfpage_destroy(gfxpage_t*pdf_page) +{ + pdf_page_internal_t*i= (pdf_page_internal_t*)pdf_page->internal; + free(pdf_page->internal);pdf_page->internal = 0; + free(pdf_page);pdf_page=0; +} + +static void render2(gfxpage_t*page, gfxdevice_t*dev, int x,int y, int x1,int y1,int x2,int y2) +{ + pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; + gfxsource_internal_t*i = (gfxsource_internal_t*)pi->parent->internal; + + if(!pi->config_print && pi->nocopy) {msg(" PDF disallows copying");exit(0);} + if(pi->config_print && pi->noprint) {msg(" PDF disallows printing");exit(0);} + + CommonOutputDev*outputDev = 0; + if(pi->config_full_bitmap_optimizing) { + FullBitmapOutputDev*d = new FullBitmapOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); + outputDev = (CommonOutputDev*)d; + } else if(pi->config_bitmap_optimizing) { + BitmapOutputDev*d = new BitmapOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); + outputDev = (CommonOutputDev*)d; + } else if(pi->config_only_text) { + CharOutputDev*d = new CharOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); + outputDev = (CommonOutputDev*)d; + } else { + VectorGraphicOutputDev*d = new VectorGraphicOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); + outputDev = (CommonOutputDev*)d; + } + + /* pass global parameters to PDF driver*/ + gfxparam_t*p = i->parameters->params; + while(p) { + outputDev->setParameter(p->key, p->value); + p = p->next; + } + p = pi->parameters->params; + while(p) { + outputDev->setParameter(p->key, p->value); + p = p->next; + } + + gfxdevice_t* middev=0; + if(multiply!=1.0) { + middev = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_rescale_init(middev, 0x00000000, 0, 0, 1.0 / multiply); + gfxdevice_rescale_setdevice(middev, dev); + dev = middev; + } + + if(!pi) { + msg(" pdf_page_render: Parent PDF this page belongs to doesn't exist yet/anymore"); + return; + } + + if(!pi->pages[page->nr-1].has_info) { + msg(" pdf_page_render: page %d was previously set as not-to-render via the \"pages\" option", page->nr); + return; + } + + if(pi->protect) { + dev->setparameter(dev, "protect", "1"); + } + + outputDev->setDevice(dev); + pi->doc->processLinks((OutputDev*)outputDev, page->nr); + pi->doc->displayPage((OutputDev*)outputDev, page->nr, zoom*multiply, zoom*multiply, /*rotate*/0, true, true, pi->config_print); + outputDev->finishPage(); + outputDev->setDevice(0); + delete outputDev; + + if(middev) { + gfxdevice_rescale_setdevice(middev, 0x00000000); + middev->finish(middev); + } + +} + + +void pdfpage_render(gfxpage_t*page, gfxdevice_t*output) +{ + pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; + render2(page, output, 0,0, 0,0,0,0); +} + +void pdfpage_rendersection(gfxpage_t*page, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t _x1, gfxcoord_t _y1, gfxcoord_t _x2, gfxcoord_t _y2) +{ + pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; + + int x1=(int)_x1,y1=(int)_y1,x2=(int)_x2,y2=(int)_y2; + if((x1|y1|x2|y2)==0) x2++; + + render2(page, output, (int)x*multiply,(int)y*multiply, + (int)x1*multiply,(int)y1*multiply,(int)x2*multiply,(int)y2*multiply); +} + +void pdf_doc_destroy(gfxdocument_t*gfx) +{ + pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal; + + if (i->userPW) { + delete i->userPW;i->userPW = 0; + } + if (i->fileName) { + /* will be freed by PDFDoc::~PDFDoc */ + i->fileName = 0; + } + + if(i->doc) { + delete i->doc; i->doc=0; + } + free(i->pages); i->pages = 0; + + if(i->pagemap) { + free(i->pagemap); + } + + i->docinfo.free(); + + if(i->filename) { + free(i->filename);i->filename=0; + } + + if(i->info) { + delete i->info;i->info=0; + } + if(i->parameters) { + gfxparams_free(i->parameters); + i->parameters=0; + } + + free(gfx->internal);gfx->internal=0; + free(gfx);gfx=0; + + if(global_page_range) { + free(global_page_range); + global_page_range = 0; + } + + /*globalparams_count--; + if(!globalparams_count) { + delete globalParams; + globalParams = 0; + globalparams_count = 0; + }*/ +} + +static void add_page_to_map(gfxdocument_t*gfx, int pdfpage, int outputpage) +{ + pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal; + if(pdfpage < 0) + return; + if(pdfpage >= i->pagemap_size) { + int oldlen = i->pagemap_size; + i->pagemap_size = oldlen + 1024; + if(pdfpage > i->pagemap_size) + i->pagemap_size = pdfpage+1; + + if(i->pages) { + i->pagemap = (int*)malloc(i->pagemap_size*sizeof(int)); + } else { + i->pagemap = (int*)realloc(i->pages, i->pagemap_size*sizeof(int)); + } + memset(&i->pagemap[oldlen], -1, (i->pagemap_size-oldlen)*sizeof(int)); + } + i->pagemap[pdfpage] = outputpage; + if(pdfpage > i->pagemap_pos) + i->pagemap_pos = pdfpage; +} + +void pdf_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value) +{ + pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal; + if(!strcmp(name, "pagemap")) { + int pdfpage=0, outputpage=0; + sscanf(value,"%d:%d", &pdfpage, &outputpage); + add_page_to_map(gfx, pdfpage, outputpage); + } else if(!strcmp(name, "poly2bitmap")) { + i->config_bitmap_optimizing = atoi(value); + } else if(!strcmp(name, "bitmapfonts") || !strcmp(name, "bitmap")) { + i->config_full_bitmap_optimizing = atoi(value); + } else if(!strcmp(name, "asprint")) { + i->config_print = atoi(value); + } else if(!strcmp(name, "onlytext")) { + i->config_only_text = atoi(value); + } else { + gfxparams_store(i->parameters, name, value); + } +} + +gfxpage_t* pdf_doc_getpage(gfxdocument_t*doc, int page) +{ + pdf_doc_internal_t*di= (pdf_doc_internal_t*)doc->internal; + if(threadsafe) { + /* for multi-thread operation, we need to create a new PDFDoc instance + for each thread */ + di->doc = 0; + } + if(!di->doc) { + di->doc = new PDFDoc(di->fileName, di->userPW); + } + + if(page < 1 || page > doc->num_pages) + return 0; + + gfxpage_t* pdf_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); + pdf_page_internal_t*pi= (pdf_page_internal_t*)malloc(sizeof(pdf_page_internal_t)); + memset(pi, 0, sizeof(pdf_page_internal_t)); + pdf_page->internal = pi; + + pdf_page->destroy = pdfpage_destroy; + pdf_page->render = pdfpage_render; + pdf_page->rendersection = pdfpage_rendersection; + pdf_page->width = di->pages[page-1].width; + pdf_page->height = di->pages[page-1].height; + + pdf_page->parent = doc; + pdf_page->nr = page; + return pdf_page; +} + +static char*getInfoString(Dict *infoDict, const char *key) +{ + Object obj; + GString *s1, *s2; + int i; + unsigned int u; + + if (infoDict && infoDict->lookup((char*)key, &obj)->isString()) { + s1 = obj.getString(); + if ((s1->getChar(0) & 0xff) == 0xfe && + (s1->getChar(1) & 0xff) == 0xff) { + s2 = new GString(); + for (i = 2; i < obj.getString()->getLength(); i += 2) { + u = ((s1->getChar(i) & 0xff) << 8) | (s1->getChar(i+1) & 0xff); + s2->append(getUTF8(u)); + } + char*ret = strdup(s2->getCString()); + delete s2; + obj.free(); + return ret; + } else { + char*ret = strdup(s1->getCString()); + obj.free(); + return ret; + } + } + return strdup(""); +} + +static char*getInfoDate(Dict *infoDict, const char *key) +{ + Object obj; + char *s; + + if (infoDict && infoDict->lookup((char*)key, &obj)->isString()) { + s = obj.getString()->getCString(); + if (s[0] == 'D' && s[1] == ':') { + s += 2; + } + char*ret = strdup(s); + obj.free(); + return ret; + } + return strdup(""); +} + +char* pdf_doc_getinfo(gfxdocument_t*doc, const char*name) +{ + pdf_doc_internal_t*i= (pdf_doc_internal_t*)doc->internal; + if(!strcmp(name, "title")) return getInfoString(i->docinfo.getDict(), "Title"); + else if(!strcmp(name, "subject")) return getInfoString(i->docinfo.getDict(), "Subject"); + else if(!strcmp(name, "keywords")) return getInfoString(i->docinfo.getDict(), "Keywords"); + else if(!strcmp(name, "author")) return getInfoString(i->docinfo.getDict(), "Author"); + else if(!strcmp(name, "creator")) return getInfoString(i->docinfo.getDict(), "Creator"); + else if(!strcmp(name, "producer")) return getInfoString(i->docinfo.getDict(), "Producer"); + else if(!strcmp(name, "creationdate")) return getInfoDate(i->docinfo.getDict(), "CreationDate"); + else if(!strcmp(name, "moddate")) return getInfoDate(i->docinfo.getDict(), "ModDate"); + else if(!strcmp(name, "linearized")) return strdup(i->doc->isLinearized() ? "yes" : "no"); + else if(!strcmp(name, "tagged")) return strdup(i->doc->getStructTreeRoot()->isDict() ? "yes" : "no"); + else if(!strcmp(name, "encrypted")) return strdup(i->doc->isEncrypted() ? "yes" : "no"); + else if(!strcmp(name, "oktoprint")) return strdup(i->doc->okToPrint() ? "yes" : "no"); + else if(!strcmp(name, "oktocopy")) return strdup(i->doc->okToCopy() ? "yes" : "no"); + else if(!strcmp(name, "oktochange")) return strdup(i->doc->okToChange() ? "yes" : "no"); + else if(!strcmp(name, "oktoaddnotes")) return strdup(i->doc->okToAddNotes() ? "yes" : "no"); + else if(!strcmp(name, "version")) { + char buf[32]; +#ifdef HAVE_POPPLER + sprintf(buf, "%d.%d", i->doc->getPDFMajorVersion(), i->doc->getPDFMinorVersion()); +#else + sprintf(buf, "%.1f", i->doc->getPDFVersion()); +#endif + return strdup(buf); + } + return strdup(""); +} + + +/* shortcut to InfoOutputDev.cc */ +extern int config_unique_unicode; +extern int config_poly2bitmap_pass1; +extern int config_skewedtobitmap_pass1; +extern int config_addspace; +extern int config_fontquality; +extern int config_bigchar; +extern int config_marker_glyph; +extern int config_normalize_fonts; +extern int config_remove_font_transforms; +extern int config_remove_invisible_outlines; +extern int config_break_on_warning; + +static void pdf_setparameter(gfxsource_t*src, const char*name, const char*value) +{ + gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal; + + gfxparams_store(i->parameters, name, value); + + msg(" setting parameter %s to \"%s\"", name, value); + if(!strncmp(name, "fontdir", strlen("fontdir"))) { + addGlobalFontDir(value); + } else if(!strcmp(name, "addspacechars")) { + config_addspace = atoi(value); + gfxparams_store(i->parameters, "detectspaces", "0"); + } else if(!strcmp(name, "detectspaces")) { + config_addspace = atoi(value); + } else if(!strcmp(name, "unique_unicode")) { + config_unique_unicode = atoi(value); + } else if(!strcmp(name, "poly2bitmap")) { + config_poly2bitmap_pass1 = atoi(value); + } else if(!strcmp(name, "marker_glyph")) { + config_marker_glyph = atoi(value); + } else if(!strcmp(name, "normalize_fonts")) { + config_normalize_fonts = atoi(value); + } else if(!strcmp(name, "skewedtobitmap")) { + config_skewedtobitmap_pass1 = atoi(value); + } else if(!strcmp(name, "remove_font_transforms")) { + config_remove_font_transforms = atoi(value); + } else if(!strcmp(name, "breakonwarning")) { + config_break_on_warning = atoi(value); + } else if(!strcmp(name, "remove_invisible_outlines")) { + config_remove_invisible_outlines = atoi(value); + } else if(!strcmp(name, "fontquality")) { + config_fontquality = atoi(value); + } else if(!strcmp(name, "bigchar")) { + config_bigchar = atoi(value); + } else if(!strcmp(name, "pages")) { + global_page_range = strdup(value); + } else if(!strncmp(name, "font", strlen("font")) && name[4]!='q') { + addGlobalFont(value); + } else if(!strncmp(name, "languagedir", strlen("languagedir"))) { + addGlobalLanguageDir(value); + } else if(!strcmp(name, "threadsafe")) { + threadsafe = atoi(value); + } else if(!strcmp(name, "zoomtowidth")) { + zoomtowidth = atoi(value); + } else if(!strcmp(name, "zoom")) { + char buf[80]; + zoom = atof(value); + } else if(!strcmp(name, "jpegdpi") || !strcmp(name, "ppmdpi")) { + msg(" %s not supported anymore. Please use jpegsubpixels/ppmsubpixels"); + } else if(!strcmp(name, "multiply")) { + multiply = atof(value); + } else if(!strcmp(name, "help")) { + printf("\nPDF device global parameters:\n"); + printf("fontdir= a directory with additional fonts\n"); + printf("font= an additional font filename\n"); + printf("pages= the range of pages to convert (example: pages=1-100,210-)\n"); + printf("zoom= the resultion (default: 72)\n"); + printf("languagedir= Add an xpdf language directory\n"); + printf("multiply= Render everything at the resolution\n"); + printf("poly2bitmap Convert graphics to bitmaps\n"); + printf("bitmap Convert everything to bitmaps\n"); + } +} + +void pdf_doc_prepare(gfxdocument_t*doc, gfxdevice_t*dev) +{ + pdf_doc_internal_t*i= (pdf_doc_internal_t*)doc->internal; + i->info->dumpfonts(dev); +} + +static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) +{ + gfxsource_internal_t*isrc = (gfxsource_internal_t*)src->internal; + gfxdocument_t*pdf_doc = (gfxdocument_t*)malloc(sizeof(gfxdocument_t)); + memset(pdf_doc, 0, sizeof(gfxdocument_t)); + pdf_doc_internal_t*i= (pdf_doc_internal_t*)malloc(sizeof(pdf_doc_internal_t)); + memset(i, 0, sizeof(pdf_doc_internal_t)); + i->parent = src; + i->parameters = gfxparams_new(); + pdf_doc->internal = i; + char*userPassword=0; + + i->filename = strdup(filename); + + char*x = 0; + if((x = strchr((char*)filename, '|'))) { + *x = 0; + userPassword = x+1; + } + + i->fileName = new GString(filename); + + // open PDF file + if (userPassword && userPassword[0]) { + i->userPW = new GString(userPassword); + } else { + i->userPW = NULL; + } + i->doc = new PDFDoc(i->fileName, i->userPW); + if (!i->doc->isOk()) { + return 0; + } + + // get doc info + i->doc->getDocInfo(&i->docinfo); + + pdf_doc->num_pages = i->doc->getNumPages(); + i->protect = 0; + if (i->doc->isEncrypted()) { + if(!i->doc->okToCopy()) { + i->nocopy = 1; + } + if(!i->doc->okToPrint()) { + i->noprint = 1; + } + if(!i->doc->okToChange() || !i->doc->okToAddNotes()) + i->protect = 1; + } + + if(zoomtowidth && i->doc->getNumPages()) { + Page*page = i->doc->getCatalog()->getPage(1); + PDFRectangle *r = page->getCropBox(); + double width_before = r->x2 - r->x1; + zoom = 72.0 * zoomtowidth / width_before; + msg(" Rendering at %f DPI. (Page width at 72 DPI: %f, target width: %d)", zoom, width_before, zoomtowidth); + } + + i->info = new InfoOutputDev(i->doc->getXRef()); + int t; + i->pages = (pdf_page_info_t*)malloc(sizeof(pdf_page_info_t)*pdf_doc->num_pages); + memset(i->pages,0,sizeof(pdf_page_info_t)*pdf_doc->num_pages); + for(t=1;t<=pdf_doc->num_pages;t++) { + if(!global_page_range || is_in_range(t, global_page_range)) { + i->doc->displayPage((OutputDev*)i->info, t, zoom, zoom, /*rotate*/0, /*usemediabox*/true, /*crop*/true, i->config_print); + i->doc->processLinks((OutputDev*)i->info, t); + i->pages[t-1].xMin = i->info->x1; + i->pages[t-1].yMin = i->info->y1; + i->pages[t-1].xMax = i->info->x2; + i->pages[t-1].yMax = i->info->y2; + i->pages[t-1].width = i->info->x2 - i->info->x1; + i->pages[t-1].height = i->info->y2 - i->info->y1; + i->pages[t-1].number_of_images = i->info->num_ppm_images + i->info->num_jpeg_images; + i->pages[t-1].number_of_links = i->info->num_links; + i->pages[t-1].number_of_fonts = i->info->num_fonts; + i->pages[t-1].has_info = 1; + } + } + + pdf_doc->get = 0; + pdf_doc->destroy = pdf_doc_destroy; + pdf_doc->setparameter = pdf_doc_setparameter; + pdf_doc->getinfo = pdf_doc_getinfo; + pdf_doc->getpage = pdf_doc_getpage; + pdf_doc->prepare = pdf_doc_prepare; + + /* pass global parameters to PDF driver*/ + gfxparam_t*p = isrc->parameters->params; + while(p) { + pdf_doc->setparameter(pdf_doc, p->key, p->value); + p = p->next; + } + return pdf_doc; +} + +void pdf_destroy(gfxsource_t*src) +{ + if(!src->internal) + return; + gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal; + + gfxparams_free(i->parameters); + i->parameters=0; + + free(src->internal);src->internal=0; + + delete globalParams;globalParams = 0; + free(src); +} + +gfxsource_t*gfxsource_pdf_create() +{ + gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t)); + memset(src, 0, sizeof(gfxsource_t)); + src->setparameter = pdf_setparameter; + src->open = pdf_open; + src->destroy = pdf_destroy; + gfxsource_internal_t*i = (gfxsource_internal_t*)rfx_calloc(sizeof(gfxsource_internal_t)); + src->internal = (void*)i; + i->parameters = gfxparams_new(); + + if(!globalParams) { + globalParams = new GFXGlobalParams(); + //globalparams_count++; + } + + + return src; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h new file mode 100644 index 000000000..3a6f4fcd6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h @@ -0,0 +1,37 @@ +/* swfoutput.h + Header file for swfoutput.cc (and swfoutput_x11.cc). + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __pdfsource_h__ +#define __pdfsource_h__ + +#include "../gfxsource.h" + +#ifdef __cplusplus +extern "C" { +#endif + +gfxsource_t*gfxsource_pdf_create(); + +#ifdef __cplusplus +} +#endif + +#endif //__pdfsource_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c new file mode 100644 index 000000000..4a3fb1632 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c @@ -0,0 +1,163 @@ +/* pdf2jpeg.c + Converts a pdf page to a jpeg. + + Copyright (c) 2010 Matthias Kramm + Copyright (c) 1998-2009 Derek Noonburg + + Swftools is free software; you can redistribute it and/or 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. + + Swftools is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with swftools; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include +#include +#include "parseargs.h" +#include "gmem.h" +#include "GString.h" +#include "GlobalParams.h" +#include "Object.h" +#include "PDFDoc.h" +#include "SplashBitmap.h" +#include "Splash.h" +#include "SplashOutputDev.h" +#include "config.h" +#include "../jpeg.h" + +static int page = 1; +static int width = 0; +static int resolution = 150; +static int quality = 95; +static char ownerPassword[33] = ""; +static char userPassword[33] = ""; +static char cfgFileName[256] = ""; +static GBool printVersion = gFalse; +static GBool printHelp = gFalse; +static char output[256] = "output.jpg"; + +static ArgDesc argDesc[] = { + {"-p", argInt, &page, 0, + "first page to print"}, + {"-r", argInt, &resolution, 0, + "resolution, in DPI (default is 150)"}, + {"-q", argInt, &quality, 0, + "jpeg conversion quality"}, + {"-w", argInt, &width, 0, + "zoom to this width"}, + {"-o", argString, &output, sizeof(output), + "resolution, in DPI (default is 150)"}, + {"-opw", argString, ownerPassword, sizeof(ownerPassword), + "owner password (for encrypted files)"}, + {"-upw", argString, userPassword, sizeof(userPassword), + "user password (for encrypted files)"}, + {"-cfg", argString, cfgFileName, sizeof(cfgFileName), + "configuration file to use in place of .xpdfrc"}, + {"-v", argFlag, &printVersion, 0, + "print copyright and version info"}, + {"-h", argFlag, &printHelp, 0, + "print usage information"}, + {"-help", argFlag, &printHelp, 0, + "print usage information"}, + {"--help", argFlag, &printHelp, 0, + "print usage information"}, + {"-?", argFlag, &printHelp, 0, + "print usage information"}, + {NULL} +}; + +int main(int argc, char *argv[]) { + PDFDoc *doc; + GString *fileName; + GString *ownerPW, *userPW; + SplashColor paperColor; + SplashOutputDev *splashOut; + GBool ok; + int exitCode; + int pg; + + exitCode = 99; + + // parse args + ok = parseArgs(argDesc, &argc, argv); + + if (!ok || argc != 2 || printVersion || printHelp) { + fprintf(stderr, "pdf2jpeg version %s\n", xpdfVersion); + fprintf(stderr, "%s\n", xpdfCopyright); + if (!printVersion) { + printUsage("pdf2jpeg", " -o ", argDesc); + } + goto err0; + } + fileName = new GString(argv[1]); + + // read config file + globalParams = new GlobalParams(cfgFileName); + globalParams->setupBaseFonts(NULL); + + // open PDF file + if (ownerPassword[0]) { + ownerPW = new GString(ownerPassword); + } else { + ownerPW = NULL; + } + if (userPassword[0]) { + userPW = new GString(userPassword); + } else { + userPW = NULL; + } + doc = new PDFDoc(fileName, ownerPW, userPW); + if (userPW) { + delete userPW; + } + if (ownerPW) { + delete ownerPW; + } + if (!doc->isOk()) { + exitCode = 1; + goto err1; + } + + paperColor[0] = paperColor[1] = paperColor[2] = 0xff; + splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse, paperColor); + + splashOut->startDoc(doc->getXRef()); + + if(page>=1 && page<=doc->getNumPages()) { + double r = resolution; + if(width) { + int old_width = doc->getPageCropWidth(page); + r = 72.0*width/old_width; + } + doc->displayPage(splashOut, page, r, r, 0, gFalse, gTrue, gFalse); + SplashBitmap*bitmap = splashOut->getBitmap(); + if(bitmap) { + Guchar*rgb = bitmap->getDataPtr(); + int width = bitmap->getWidth(); + int height = bitmap->getHeight(); + jpeg_save(rgb, width, height, quality, output); + } + } + delete splashOut; + + exitCode = 0; + + // clean up + err1: + delete doc; + delete globalParams; + err0: + + // check for memory leaks + Object::memCheck(stderr); + gMemReport(stderr); + + return exitCode; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc new file mode 100644 index 000000000..4da1a6fba --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc @@ -0,0 +1,52 @@ +#include +#include +#include +#include "popplercompat.h" + +#ifdef HAVE_POPPLER +static char* getTempDir() +{ +#ifdef WIN32 + char*dir = getenv("TMP"); + if(!dir) dir = getenv("TEMP"); + if(!dir) dir = getenv("tmp"); + if(!dir) dir = getenv("temp"); + if(!dir) dir = "C:\\"; +#else + char* dir = "/tmp/"; +#endif + return dir; +} + +char* mktmpname(char*ptr) { + static char tmpbuf[128]; + char*dir = getTempDir(); + int l = strlen(dir); + char*sep = ""; + if(!ptr) + ptr = tmpbuf; + if(l && dir[l-1]!='/' && dir[l-1]!='\\') { +#ifdef WIN32 + sep = "\\"; +#else + sep = "/"; +#endif + } + + // used to be mktemp. This does remove the warnings, but + // It's not exactly an improvement. +#ifdef HAVE_LRAND48 + sprintf(ptr, "%s%s%08x%08x",dir,sep,(unsigned int)lrand48(),(unsigned int)lrand48()); +#else +# ifdef HAVE_RAND + sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand()); +# else + static int count = 1; + sprintf(ptr, "%s%s%08x%04x%04x",dir,sep,time(0),(unsigned int)tmpbuf^((unsigned int)tmpbuf)>>16,count); + count ++; +# endif +#endif + return ptr; +} + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h new file mode 100644 index 000000000..8303369a4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h @@ -0,0 +1,69 @@ +#ifndef __popplercompat_h__ +#define __popplercompat_h__ + +#include "../../config.h" + +#ifdef HAVE_POPPLER + #define POPPLER_INTERPOLATE GBool interpolate, + #define POPPLER_INTERPOLATE_ARG interpolate, + #define POPPLER_MASK_INTERPOLATE , GBool maskInterpolate + #define POPPLER_MASK_INTERPOLATE_ARG , maskInterpolate +#else + #define POPPLER_INTERPOLATE + #define POPPLER_INTERPOLATE_ARG + #define POPPLER_MASK_INTERPOLATE + #define POPPLER_MASK_INTERPOLATE_ARG +#endif + +#ifdef HAVE_POPPLER + #define POPPLER_TILING_PATERN_RETURN GBool + #define POPPLER_TILING_PATERN_GFX + #define POPPLER_TILING_PATERN_GFX_ARG +#else + #define POPPLER_TILING_PATERN_RETURN void + #if (xpdfMajorVersion*10000 + xpdfMinorVersion*100 + xpdfUpdateVersion) < 30207 + #define POPPLER_TILING_PATERN_GFX + #define POPPLER_TILING_PATERN_GFX_ARG + #else + #define POPPLER_TILING_PATERN_GFX Gfx *gfx, + #define POPPLER_TILING_PATERN_GFX_ARG gfx, + #endif +#endif + +#ifdef HAVE_POPPLER +char* mktmpname(char*ptr); +#endif + +#ifdef HAVE_POPPLER + #define POPPLER_RAXIAL_MIN_MAX , double min, double max + #define POPPLER_RAXIAL_MIN_MAX_ARG , min, max +#else + #define POPPLER_RAXIAL_MIN_MAX + #define POPPLER_RAXIAL_MIN_MAX_ARG +#endif + +#ifdef HAVE_POPPLER + #include + #include +#else + #include "xpdf/config.h" + #include "gfile.h" + #include "GString.h" +#endif +#include "Object.h" +#include "Stream.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "PDFDoc.h" +#include "Error.h" +#include "Link.h" +#include "OutputDev.h" +#include "GfxFont.h" +#include "GfxState.h" +//#include "NameToUnicodeTable.h" +#include "GlobalParams.h" + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc new file mode 100644 index 000000000..1f5d8d156 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc @@ -0,0 +1,1556 @@ +//======================================================================== +// +// Annot.cc +// +// Copyright 2000-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "GList.h" +#include "Error.h" +#include "Object.h" +#include "Catalog.h" +#include "Gfx.h" +#include "GfxFont.h" +#include "Lexer.h" +#include "Annot.h" + +//------------------------------------------------------------------------ + +#define annotFlagHidden 0x0002 +#define annotFlagPrint 0x0004 +#define annotFlagNoView 0x0020 + +#define fieldFlagReadOnly 0x00000001 +#define fieldFlagRequired 0x00000002 +#define fieldFlagNoExport 0x00000004 +#define fieldFlagMultiline 0x00001000 +#define fieldFlagPassword 0x00002000 +#define fieldFlagNoToggleToOff 0x00004000 +#define fieldFlagRadio 0x00008000 +#define fieldFlagPushbutton 0x00010000 +#define fieldFlagCombo 0x00020000 +#define fieldFlagEdit 0x00040000 +#define fieldFlagSort 0x00080000 +#define fieldFlagFileSelect 0x00100000 +#define fieldFlagMultiSelect 0x00200000 +#define fieldFlagDoNotSpellCheck 0x00400000 +#define fieldFlagDoNotScroll 0x00800000 +#define fieldFlagComb 0x01000000 +#define fieldFlagRichText 0x02000000 +#define fieldFlagRadiosInUnison 0x02000000 +#define fieldFlagCommitOnSelChange 0x04000000 + +#define fieldQuadLeft 0 +#define fieldQuadCenter 1 +#define fieldQuadRight 2 + +// distance of Bezier control point from center for circle approximation +// = (4 * (sqrt(2) - 1) / 3) * r +#define bezierCircle 0.55228475 + +//------------------------------------------------------------------------ +// AnnotBorderStyle +//------------------------------------------------------------------------ + +AnnotBorderStyle::AnnotBorderStyle(AnnotBorderType typeA, double widthA, + double *dashA, int dashLengthA, + double rA, double gA, double bA) { + type = typeA; + width = widthA; + dash = dashA; + dashLength = dashLengthA; + r = rA; + g = gA; + b = bA; +} + +AnnotBorderStyle::~AnnotBorderStyle() { + if (dash) { + gfree(dash); + } +} + +//------------------------------------------------------------------------ +// Annot +//------------------------------------------------------------------------ + +Annot::Annot(XRef *xrefA, Dict *acroForm, Dict *dict, Ref *refA) { + Object apObj, asObj, obj1, obj2, obj3; + AnnotBorderType borderType; + double borderWidth; + double *borderDash; + int borderDashLength; + double borderR, borderG, borderB; + double t; + int i; + + ok = gTrue; + xref = xrefA; + ref = *refA; + type = NULL; + appearBuf = NULL; + borderStyle = NULL; + + //----- parse the type + + if (dict->lookup("Subtype", &obj1)->isName()) { + type = new GString(obj1.getName()); + } + obj1.free(); + + //----- parse the rectangle + + if (dict->lookup("Rect", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + xMin = yMin = xMax = yMax = 0; + if (obj1.arrayGet(0, &obj2)->isNum()) { + xMin = obj2.getNum(); + } + obj2.free(); + if (obj1.arrayGet(1, &obj2)->isNum()) { + yMin = obj2.getNum(); + } + obj2.free(); + if (obj1.arrayGet(2, &obj2)->isNum()) { + xMax = obj2.getNum(); + } + obj2.free(); + if (obj1.arrayGet(3, &obj2)->isNum()) { + yMax = obj2.getNum(); + } + obj2.free(); + if (xMin > xMax) { + t = xMin; xMin = xMax; xMax = t; + } + if (yMin > yMax) { + t = yMin; yMin = yMax; yMax = t; + } + } else { + error(-1, "Bad bounding box for annotation"); + ok = gFalse; + } + obj1.free(); + + //----- parse the flags + + if (dict->lookup("F", &obj1)->isInt()) { + flags = obj1.getInt(); + } else { + flags = 0; + } + obj1.free(); + + //----- parse the border style + + borderType = annotBorderSolid; + borderWidth = 1; + borderDash = NULL; + borderDashLength = 0; + borderR = 0; + borderG = 0; + borderB = 1; + if (dict->lookup("BS", &obj1)->isDict()) { + if (obj1.dictLookup("S", &obj2)->isName()) { + if (obj2.isName("S")) { + borderType = annotBorderSolid; + } else if (obj2.isName("D")) { + borderType = annotBorderDashed; + } else if (obj2.isName("B")) { + borderType = annotBorderBeveled; + } else if (obj2.isName("I")) { + borderType = annotBorderInset; + } else if (obj2.isName("U")) { + borderType = annotBorderUnderlined; + } + } + obj2.free(); + if (obj1.dictLookup("W", &obj2)->isNum()) { + borderWidth = obj2.getNum(); + } + obj2.free(); + if (obj1.dictLookup("D", &obj2)->isArray()) { + borderDashLength = obj2.arrayGetLength(); + borderDash = (double *)gmallocn(borderDashLength, sizeof(double)); + for (i = 0; i < borderDashLength; ++i) { + if (obj2.arrayGet(i, &obj3)->isNum()) { + borderDash[i] = obj3.getNum(); + } else { + borderDash[i] = 1; + } + obj3.free(); + } + } + obj2.free(); + } else { + obj1.free(); + if (dict->lookup("Border", &obj1)->isArray()) { + if (obj1.arrayGetLength() >= 3) { + if (obj1.arrayGet(2, &obj2)->isNum()) { + borderWidth = obj2.getNum(); + } + obj2.free(); + if (obj1.arrayGetLength() >= 4) { + if (obj1.arrayGet(3, &obj2)->isArray()) { + borderType = annotBorderDashed; + borderDashLength = obj2.arrayGetLength(); + borderDash = (double *)gmallocn(borderDashLength, sizeof(double)); + for (i = 0; i < borderDashLength; ++i) { + if (obj2.arrayGet(i, &obj3)->isNum()) { + borderDash[i] = obj3.getNum(); + } else { + borderDash[i] = 1; + } + obj3.free(); + } + } else { + // Adobe draws no border at all if the last element is of + // the wrong type. + borderWidth = 0; + } + obj2.free(); + } + } + } + } + obj1.free(); + if (dict->lookup("C", &obj1)->isArray() && obj1.arrayGetLength() == 3) { + if (obj1.arrayGet(0, &obj2)->isNum()) { + borderR = obj2.getNum(); + } + obj1.free(); + if (obj1.arrayGet(1, &obj2)->isNum()) { + borderG = obj2.getNum(); + } + obj1.free(); + if (obj1.arrayGet(2, &obj2)->isNum()) { + borderB = obj2.getNum(); + } + obj1.free(); + } + obj1.free(); + borderStyle = new AnnotBorderStyle(borderType, borderWidth, + borderDash, borderDashLength, + borderR, borderG, borderB); + + //----- get the annotation appearance + + if (dict->lookup("AP", &apObj)->isDict()) { + if (dict->lookup("AS", &asObj)->isName()) { + if (apObj.dictLookup("N", &obj1)->isDict()) { + if (obj1.dictLookupNF(asObj.getName(), &obj2)->isRef()) { + obj2.copy(&appearance); + ok = gTrue; + } else { + obj2.free(); + if (obj1.dictLookupNF("Off", &obj2)->isRef()) { + obj2.copy(&appearance); + } + } + obj2.free(); + } + obj1.free(); + } else { + if (apObj.dictLookupNF("N", &obj1)->isRef()) { + obj1.copy(&appearance); + } + obj1.free(); + } + asObj.free(); + } + apObj.free(); +} + +Annot::~Annot() { + if (type) { + delete type; + } + appearance.free(); + if (appearBuf) { + delete appearBuf; + } + if (borderStyle) { + delete borderStyle; + } +} + +void Annot::generateFieldAppearance(Dict *field, Dict *annot, Dict *acroForm) { + Object mkObj, ftObj, appearDict, drObj, obj1, obj2, obj3; + Dict *mkDict; + MemStream *appearStream; + GfxFontDict *fontDict; + GBool hasCaption; + double w, dx, dy, r; + double *dash; + GString *caption, *da; + GString **text; + GBool *selection; + int dashLength, ff, quadding, comb, nOptions, topIdx, i, j; + + // must be a Widget annotation + if (type->cmp("Widget")) { + return; + } + + appearBuf = new GString(); + + // get the appearance characteristics (MK) dictionary + if (annot->lookup("MK", &mkObj)->isDict()) { + mkDict = mkObj.getDict(); + } else { + mkDict = NULL; + } + + // draw the background + if (mkDict) { + if (mkDict->lookup("BG", &obj1)->isArray() && + obj1.arrayGetLength() > 0) { + setColor(obj1.getArray(), gTrue, 0); + appearBuf->appendf("0 0 {0:.2f} {1:.2f} re f\n", + xMax - xMin, yMax - yMin); + } + obj1.free(); + } + + // get the field type + fieldLookup(field, "FT", &ftObj); + + // get the field flags (Ff) value + if (fieldLookup(field, "Ff", &obj1)->isInt()) { + ff = obj1.getInt(); + } else { + ff = 0; + } + obj1.free(); + + // draw the border + if (mkDict) { + w = borderStyle->getWidth(); + if (w > 0) { + mkDict->lookup("BC", &obj1); + if (!(obj1.isArray() && obj1.arrayGetLength() > 0)) { + mkDict->lookup("BG", &obj1); + } + if (obj1.isArray() && obj1.arrayGetLength() > 0) { + dx = xMax - xMin; + dy = yMax - yMin; + + // radio buttons with no caption have a round border + hasCaption = mkDict->lookup("CA", &obj2)->isString(); + obj2.free(); + if (ftObj.isName("Btn") && (ff & fieldFlagRadio) && !hasCaption) { + r = 0.5 * (dx < dy ? dx : dy); + switch (borderStyle->getType()) { + case annotBorderDashed: + appearBuf->append("["); + borderStyle->getDash(&dash, &dashLength); + for (i = 0; i < dashLength; ++i) { + appearBuf->appendf(" {0:.2f}", dash[i]); + } + appearBuf->append("] 0 d\n"); + // fall through to the solid case + case annotBorderSolid: + case annotBorderUnderlined: + appearBuf->appendf("{0:.2f} w\n", w); + setColor(obj1.getArray(), gFalse, 0); + drawCircle(0.5 * dx, 0.5 * dy, r - 0.5 * w, gFalse); + break; + case annotBorderBeveled: + case annotBorderInset: + appearBuf->appendf("{0:.2f} w\n", 0.5 * w); + setColor(obj1.getArray(), gFalse, 0); + drawCircle(0.5 * dx, 0.5 * dy, r - 0.25 * w, gFalse); + setColor(obj1.getArray(), gFalse, + borderStyle->getType() == annotBorderBeveled ? 1 : -1); + drawCircleTopLeft(0.5 * dx, 0.5 * dy, r - 0.75 * w); + setColor(obj1.getArray(), gFalse, + borderStyle->getType() == annotBorderBeveled ? -1 : 1); + drawCircleBottomRight(0.5 * dx, 0.5 * dy, r - 0.75 * w); + break; + } + + } else { + switch (borderStyle->getType()) { + case annotBorderDashed: + appearBuf->append("["); + borderStyle->getDash(&dash, &dashLength); + for (i = 0; i < dashLength; ++i) { + appearBuf->appendf(" {0:.2f}", dash[i]); + } + appearBuf->append("] 0 d\n"); + // fall through to the solid case + case annotBorderSolid: + appearBuf->appendf("{0:.2f} w\n", w); + setColor(obj1.getArray(), gFalse, 0); + appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re s\n", + 0.5 * w, dx - w, dy - w); + break; + case annotBorderBeveled: + case annotBorderInset: + setColor(obj1.getArray(), gTrue, + borderStyle->getType() == annotBorderBeveled ? 1 : -1); + appearBuf->append("0 0 m\n"); + appearBuf->appendf("0 {0:.2f} l\n", dy); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", w, dy - w); + appearBuf->appendf("{0:.2f} {0:.2f} l\n", w); + appearBuf->append("f\n"); + setColor(obj1.getArray(), gTrue, + borderStyle->getType() == annotBorderBeveled ? -1 : 1); + appearBuf->append("0 0 m\n"); + appearBuf->appendf("{0:.2f} 0 l\n", dx); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w); + appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, w); + appearBuf->appendf("{0:.2f} {0:.2f} l\n", w); + appearBuf->append("f\n"); + break; + case annotBorderUnderlined: + appearBuf->appendf("{0:.2f} w\n", w); + setColor(obj1.getArray(), gFalse, 0); + appearBuf->appendf("0 0 m {0:.2f} 0 l s\n", dx); + break; + } + + // clip to the inside of the border + appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", + w, dx - 2 * w, dy - 2 * w); + } + } + obj1.free(); + } + } + + // get the resource dictionary + acroForm->lookup("DR", &drObj); + + // build the font dictionary + if (drObj.isDict() && drObj.dictLookup("Font", &obj1)->isDict()) { + fontDict = new GfxFontDict(xref, NULL, obj1.getDict()); + } else { + fontDict = NULL; + } + obj1.free(); + + // get the default appearance string + if (fieldLookup(field, "DA", &obj1)->isNull()) { + obj1.free(); + acroForm->lookup("DA", &obj1); + } + if (obj1.isString()) { + da = obj1.getString()->copy(); + } else { + da = NULL; + } + obj1.free(); + + // draw the field contents + if (ftObj.isName("Btn")) { + caption = NULL; + if (mkDict) { + if (mkDict->lookup("CA", &obj1)->isString()) { + caption = obj1.getString()->copy(); + } + obj1.free(); + } + // radio button + if (ff & fieldFlagRadio) { + //~ Acrobat doesn't draw a caption if there is no AP dict (?) + if (fieldLookup(field, "V", &obj1)->isName()) { + if (annot->lookup("AS", &obj2)->isName(obj1.getName())) { + if (caption) { + drawText(caption, da, fontDict, gFalse, 0, fieldQuadCenter, + gFalse, gTrue); + } else { + if (mkDict) { + if (mkDict->lookup("BC", &obj3)->isArray() && + obj3.arrayGetLength() > 0) { + dx = xMax - xMin; + dy = yMax - yMin; + setColor(obj3.getArray(), gTrue, 0); + drawCircle(0.5 * dx, 0.5 * dy, 0.2 * (dx < dy ? dx : dy), + gTrue); + } + obj3.free(); + } + } + } + obj2.free(); + } + obj1.free(); + // pushbutton + } else if (ff & fieldFlagPushbutton) { + if (caption) { + drawText(caption, da, fontDict, gFalse, 0, fieldQuadCenter, + gFalse, gFalse); + } + // checkbox + } else { + // According to the PDF spec the off state must be named "Off", + // and the on state can be named anything, but Acrobat apparently + // looks for "Yes" and treats anything else as off. + if (fieldLookup(field, "V", &obj1)->isName("Yes")) { + if (!caption) { + caption = new GString("3"); // ZapfDingbats checkmark + } + drawText(caption, da, fontDict, gFalse, 0, fieldQuadCenter, + gFalse, gTrue); + } + obj1.free(); + } + if (caption) { + delete caption; + } + } else if (ftObj.isName("Tx")) { + //~ value strings can be Unicode + if (fieldLookup(field, "V", &obj1)->isString()) { + if (fieldLookup(field, "Q", &obj2)->isInt()) { + quadding = obj2.getInt(); + } else { + quadding = fieldQuadLeft; + } + obj2.free(); + comb = 0; + if (ff & fieldFlagComb) { + if (fieldLookup(field, "MaxLen", &obj2)->isInt()) { + comb = obj2.getInt(); + } + obj2.free(); + } + drawText(obj1.getString(), da, fontDict, + ff & fieldFlagMultiline, comb, quadding, gTrue, gFalse); + } + obj1.free(); + } else if (ftObj.isName("Ch")) { + //~ value/option strings can be Unicode + if (fieldLookup(field, "Q", &obj1)->isInt()) { + quadding = obj1.getInt(); + } else { + quadding = fieldQuadLeft; + } + obj1.free(); + // combo box + if (ff & fieldFlagCombo) { + if (fieldLookup(field, "V", &obj1)->isString()) { + drawText(obj1.getString(), da, fontDict, + gFalse, 0, quadding, gTrue, gFalse); + //~ Acrobat draws a popup icon on the right side + } + obj1.free(); + // list box + } else { + if (field->lookup("Opt", &obj1)->isArray()) { + nOptions = obj1.arrayGetLength(); + // get the option text + text = (GString **)gmallocn(nOptions, sizeof(GString *)); + for (i = 0; i < nOptions; ++i) { + text[i] = NULL; + obj1.arrayGet(i, &obj2); + if (obj2.isString()) { + text[i] = obj2.getString()->copy(); + } else if (obj2.isArray() && obj2.arrayGetLength() == 2) { + if (obj2.arrayGet(1, &obj3)->isString()) { + text[i] = obj3.getString()->copy(); + } + obj3.free(); + } + obj2.free(); + if (!text[i]) { + text[i] = new GString(); + } + } + // get the selected option(s) + selection = (GBool *)gmallocn(nOptions, sizeof(GBool)); + //~ need to use the I field in addition to the V field + fieldLookup(field, "V", &obj2); + for (i = 0; i < nOptions; ++i) { + selection[i] = gFalse; + if (obj2.isString()) { + if (!obj2.getString()->cmp(text[i])) { + selection[i] = gTrue; + } + } else if (obj2.isArray()) { + for (j = 0; j < obj2.arrayGetLength(); ++j) { + if (obj2.arrayGet(j, &obj3)->isString() && + !obj3.getString()->cmp(text[i])) { + selection[i] = gTrue; + } + obj3.free(); + } + } + } + obj2.free(); + // get the top index + if (field->lookup("TI", &obj2)->isInt()) { + topIdx = obj2.getInt(); + } else { + topIdx = 0; + } + obj2.free(); + // draw the text + drawListBox(text, selection, nOptions, topIdx, da, fontDict, quadding); + for (i = 0; i < nOptions; ++i) { + delete text[i]; + } + gfree(text); + gfree(selection); + } + obj1.free(); + } + } else if (ftObj.isName("Sig")) { + //~unimp + } else { + error(-1, "Unknown field type"); + } + + if (da) { + delete da; + } + + // build the appearance stream dictionary + appearDict.initDict(xref); + appearDict.dictAdd(copyString("Length"), + obj1.initInt(appearBuf->getLength())); + appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form")); + obj1.initArray(xref); + obj1.arrayAdd(obj2.initReal(0)); + obj1.arrayAdd(obj2.initReal(0)); + obj1.arrayAdd(obj2.initReal(xMax - xMin)); + obj1.arrayAdd(obj2.initReal(yMax - yMin)); + appearDict.dictAdd(copyString("BBox"), &obj1); + + // set the resource dictionary + if (drObj.isDict()) { + appearDict.dictAdd(copyString("Resources"), drObj.copy(&obj1)); + } + drObj.free(); + + // build the appearance stream + appearStream = new MemStream(appearBuf->getCString(), 0, + appearBuf->getLength(), &appearDict); + appearance.free(); + appearance.initStream(appearStream); + + if (fontDict) { + delete fontDict; + } + ftObj.free(); + mkObj.free(); +} + +// Set the current fill or stroke color, based on (which should +// have 1, 3, or 4 elements). If is +1, color is brightened; +// if is -1, color is darkened; otherwise color is not +// modified. +void Annot::setColor(Array *a, GBool fill, int adjust) { + Object obj1; + double color[4]; + int nComps, i; + + nComps = a->getLength(); + if (nComps > 4) { + nComps = 4; + } + for (i = 0; i < nComps && i < 4; ++i) { + if (a->get(i, &obj1)->isNum()) { + color[i] = obj1.getNum(); + } else { + color[i] = 0; + } + obj1.free(); + } + if (nComps == 4) { + adjust = -adjust; + } + if (adjust > 0) { + for (i = 0; i < nComps; ++i) { + color[i] = 0.5 * color[i] + 0.5; + } + } else if (adjust < 0) { + for (i = 0; i < nComps; ++i) { + color[i] = 0.5 * color[i]; + } + } + if (nComps == 4) { + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n", + color[0], color[1], color[2], color[3], + fill ? 'k' : 'K'); + } else if (nComps == 3) { + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:s}\n", + color[0], color[1], color[2], + fill ? "rg" : "RG"); + } else { + appearBuf->appendf("{0:.2f} {1:c}\n", + color[0], + fill ? 'g' : 'G'); + } +} + +// Draw the variable text or caption for a field. +void Annot::drawText(GString *text, GString *da, GfxFontDict *fontDict, + GBool multiline, int comb, int quadding, + GBool txField, GBool forceZapfDingbats) { + GList *daToks; + GString *tok; + GfxFont *font; + double fontSize, fontSize2, border, x, xPrev, y, w, w2, wMax; + int tfPos, tmPos, i, j, k, c; + + //~ if there is no MK entry, this should use the existing content stream, + //~ and only replace the marked content portion of it + //~ (this is only relevant for Tx fields) + + // parse the default appearance string + tfPos = tmPos = -1; + if (da) { + daToks = new GList(); + i = 0; + while (i < da->getLength()) { + while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { + ++i; + } + if (i < da->getLength()) { + for (j = i + 1; + j < da->getLength() && !Lexer::isSpace(da->getChar(j)); + ++j) ; + daToks->append(new GString(da, i, j - i)); + i = j; + } + } + for (i = 2; i < daToks->getLength(); ++i) { + if (i >= 2 && !((GString *)daToks->get(i))->cmp("Tf")) { + tfPos = i - 2; + } else if (i >= 6 && !((GString *)daToks->get(i))->cmp("Tm")) { + tmPos = i - 6; + } + } + } else { + daToks = NULL; + } + + // force ZapfDingbats + //~ this should create the font if needed (?) + if (forceZapfDingbats) { + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos); + if (tok->cmp("/ZaDb")) { + tok->clear(); + tok->append("/ZaDb"); + } + } + } + + // get the font and font size + font = NULL; + fontSize = 0; + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos); + if (tok->getLength() >= 1 && tok->getChar(0) == '/') { + if (!fontDict || !(font = fontDict->lookup(tok->getCString() + 1))) { + error(-1, "Unknown font in field's DA string"); + } + } else { + error(-1, "Invalid font name in 'Tf' operator in field's DA string"); + } + tok = (GString *)daToks->get(tfPos + 1); + fontSize = atof(tok->getCString()); + } else { + error(-1, "Missing 'Tf' operator in field's DA string"); + } + + // get the border width + border = borderStyle->getWidth(); + + // setup + if (txField) { + appearBuf->append("/Tx BMC\n"); + } + appearBuf->append("q\n"); + appearBuf->append("BT\n"); + + // multi-line text + if (multiline) { + // note: the comb flag is ignored in multiline mode + + wMax = xMax - xMin - 2 * border - 4; + + // compute font autosize + if (fontSize == 0) { + for (fontSize = 20; fontSize > 1; --fontSize) { + y = yMax - yMin; + w2 = 0; + i = 0; + while (i < text->getLength()) { + getNextLine(text, i, font, fontSize, wMax, &j, &w, &k); + if (w > w2) { + w2 = w; + } + i = k; + y -= fontSize; + } + // approximate the descender for the last line + if (y >= 0.33 * fontSize) { + break; + } + } + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + // starting y coordinate + // (note: each line of text starts with a Td operator that moves + // down a line) + y = yMax - yMin; + + // set the font matrix + if (tmPos >= 0) { + tok = (GString *)daToks->get(tmPos + 4); + tok->clear(); + tok->append('0'); + tok = (GString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (i = 0; i < daToks->getLength(); ++i) { + appearBuf->append((GString *)daToks->get(i))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 0 {0:.2f} Tm\n", y); + } + + // write a series of lines of text + i = 0; + xPrev = 0; + while (i < text->getLength()) { + + getNextLine(text, i, font, fontSize, wMax, &j, &w, &k); + + // compute text start position + switch (quadding) { + case fieldQuadLeft: + default: + x = border + 2; + break; + case fieldQuadCenter: + x = (xMax - xMin - w) / 2; + break; + case fieldQuadRight: + x = xMax - xMin - border - 2 - w; + break; + } + + // draw the line + appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize); + appearBuf->append('('); + for (; i < j; ++i) { + c = text->getChar(i) & 0xff; + if (c == '(' || c == ')' || c == '\\') { + appearBuf->append('\\'); + appearBuf->append(c); + } else if (c < 0x20 || c >= 0x80) { + appearBuf->appendf("\\{0:03o}", c); + } else { + appearBuf->append(c); + } + } + appearBuf->append(") Tj\n"); + + // next line + i = k; + xPrev = x; + } + + // single-line text + } else { + //~ replace newlines with spaces? - what does Acrobat do? + + // comb formatting + if (comb > 0) { + + // compute comb spacing + w = (xMax - xMin - 2 * border) / comb; + + // compute font autosize + if (fontSize == 0) { + fontSize = yMax - yMin - 2 * border; + if (w < fontSize) { + fontSize = w; + } + fontSize = floor(fontSize); + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + // compute text start position + switch (quadding) { + case fieldQuadLeft: + default: + x = border + 2; + break; + case fieldQuadCenter: + x = border + 2 + 0.5 * (comb - text->getLength()) * w; + break; + case fieldQuadRight: + x = border + 2 + (comb - text->getLength()) * w; + break; + } + y = 0.5 * (yMax - yMin) - 0.4 * fontSize; + + // set the font matrix + if (tmPos >= 0) { + tok = (GString *)daToks->get(tmPos + 4); + tok->clear(); + tok->appendf("{0:.2f}", x); + tok = (GString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (i = 0; i < daToks->getLength(); ++i) { + appearBuf->append((GString *)daToks->get(i))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); + } + + // write the text string + //~ this should center (instead of left-justify) each character within + //~ its comb cell + for (i = 0; i < text->getLength(); ++i) { + if (i > 0) { + appearBuf->appendf("{0:.2f} 0 Td\n", w); + } + appearBuf->append('('); + c = text->getChar(i) & 0xff; + if (c == '(' || c == ')' || c == '\\') { + appearBuf->append('\\'); + appearBuf->append(c); + } else if (c < 0x20 || c >= 0x80) { + appearBuf->appendf("{0:.2f} 0 Td\n", w); + } else { + appearBuf->append(c); + } + appearBuf->append(") Tj\n"); + } + + // regular (non-comb) formatting + } else { + + // compute string width + if (font && !font->isCIDFont()) { + w = 0; + for (i = 0; i < text->getLength(); ++i) { + w += ((Gfx8BitFont *)font)->getWidth(text->getChar(i)); + } + } else { + // otherwise, make a crude estimate + w = text->getLength() * 0.5; + } + + // compute font autosize + if (fontSize == 0) { + fontSize = yMax - yMin - 2 * border; + fontSize2 = (xMax - xMin - 4 - 2 * border) / w; + if (fontSize2 < fontSize) { + fontSize = fontSize2; + } + fontSize = floor(fontSize); + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + // compute text start position + w *= fontSize; + switch (quadding) { + case fieldQuadLeft: + default: + x = border + 2; + break; + case fieldQuadCenter: + x = (xMax - xMin - w) / 2; + break; + case fieldQuadRight: + x = xMax - xMin - border - 2 - w; + break; + } + y = 0.5 * (yMax - yMin) - 0.4 * fontSize; + + // set the font matrix + if (tmPos >= 0) { + tok = (GString *)daToks->get(tmPos + 4); + tok->clear(); + tok->appendf("{0:.2f}", x); + tok = (GString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (i = 0; i < daToks->getLength(); ++i) { + appearBuf->append((GString *)daToks->get(i))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); + } + + // write the text string + appearBuf->append('('); + for (i = 0; i < text->getLength(); ++i) { + c = text->getChar(i) & 0xff; + if (c == '(' || c == ')' || c == '\\') { + appearBuf->append('\\'); + appearBuf->append(c); + } else if (c < 0x20 || c >= 0x80) { + appearBuf->appendf("\\{0:03o}", c); + } else { + appearBuf->append(c); + } + } + appearBuf->append(") Tj\n"); + } + } + + // cleanup + appearBuf->append("ET\n"); + appearBuf->append("Q\n"); + if (txField) { + appearBuf->append("EMC\n"); + } + + if (daToks) { + deleteGList(daToks, GString); + } +} + +// Draw the variable text or caption for a field. +void Annot::drawListBox(GString **text, GBool *selection, + int nOptions, int topIdx, + GString *da, GfxFontDict *fontDict, GBool quadding) { + GList *daToks; + GString *tok; + GfxFont *font; + double fontSize, fontSize2, border, x, y, w, wMax; + int tfPos, tmPos, i, j, c; + + //~ if there is no MK entry, this should use the existing content stream, + //~ and only replace the marked content portion of it + //~ (this is only relevant for Tx fields) + + // parse the default appearance string + tfPos = tmPos = -1; + if (da) { + daToks = new GList(); + i = 0; + while (i < da->getLength()) { + while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { + ++i; + } + if (i < da->getLength()) { + for (j = i + 1; + j < da->getLength() && !Lexer::isSpace(da->getChar(j)); + ++j) ; + daToks->append(new GString(da, i, j - i)); + i = j; + } + } + for (i = 2; i < daToks->getLength(); ++i) { + if (i >= 2 && !((GString *)daToks->get(i))->cmp("Tf")) { + tfPos = i - 2; + } else if (i >= 6 && !((GString *)daToks->get(i))->cmp("Tm")) { + tmPos = i - 6; + } + } + } else { + daToks = NULL; + } + + // get the font and font size + font = NULL; + fontSize = 0; + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos); + if (tok->getLength() >= 1 && tok->getChar(0) == '/') { + if (!fontDict || !(font = fontDict->lookup(tok->getCString() + 1))) { + error(-1, "Unknown font in field's DA string"); + } + } else { + error(-1, "Invalid font name in 'Tf' operator in field's DA string"); + } + tok = (GString *)daToks->get(tfPos + 1); + fontSize = atof(tok->getCString()); + } else { + error(-1, "Missing 'Tf' operator in field's DA string"); + } + + // get the border width + border = borderStyle->getWidth(); + + // compute font autosize + if (fontSize == 0) { + wMax = 0; + for (i = 0; i < nOptions; ++i) { + if (font && !font->isCIDFont()) { + w = 0; + for (j = 0; j < text[i]->getLength(); ++j) { + w += ((Gfx8BitFont *)font)->getWidth(text[i]->getChar(j)); + } + } else { + // otherwise, make a crude estimate + w = text[i]->getLength() * 0.5; + } + if (w > wMax) { + wMax = w; + } + } + fontSize = yMax - yMin - 2 * border; + fontSize2 = (xMax - xMin - 4 - 2 * border) / wMax; + if (fontSize2 < fontSize) { + fontSize = fontSize2; + } + fontSize = floor(fontSize); + if (tfPos >= 0) { + tok = (GString *)daToks->get(tfPos + 1); + tok->clear(); + tok->appendf("{0:.2f}", fontSize); + } + } + + // draw the text + y = yMax - yMin - 1.1 * fontSize; + for (i = topIdx; i < nOptions; ++i) { + + // setup + appearBuf->append("q\n"); + + // draw the background if selected + if (selection[i]) { + appearBuf->append("0 g f\n"); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re f\n", + border, + y - 0.2 * fontSize, + xMax - xMin - 2 * border, + 1.1 * fontSize); + } + + // setup + appearBuf->append("BT\n"); + + // compute string width + if (font && !font->isCIDFont()) { + w = 0; + for (j = 0; j < text[i]->getLength(); ++j) { + w += ((Gfx8BitFont *)font)->getWidth(text[i]->getChar(j)); + } + } else { + // otherwise, make a crude estimate + w = text[i]->getLength() * 0.5; + } + + // compute text start position + w *= fontSize; + switch (quadding) { + case fieldQuadLeft: + default: + x = border + 2; + break; + case fieldQuadCenter: + x = (xMax - xMin - w) / 2; + break; + case fieldQuadRight: + x = xMax - xMin - border - 2 - w; + break; + } + + // set the font matrix + if (tmPos >= 0) { + tok = (GString *)daToks->get(tmPos + 4); + tok->clear(); + tok->appendf("{0:.2f}", x); + tok = (GString *)daToks->get(tmPos + 5); + tok->clear(); + tok->appendf("{0:.2f}", y); + } + + // write the DA string + if (daToks) { + for (j = 0; j < daToks->getLength(); ++j) { + appearBuf->append((GString *)daToks->get(j))->append(' '); + } + } + + // write the font matrix (if not part of the DA string) + if (tmPos < 0) { + appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); + } + + // change the text color if selected + if (selection[i]) { + appearBuf->append("1 g\n"); + } + + // write the text string + appearBuf->append('('); + for (j = 0; j < text[i]->getLength(); ++j) { + c = text[i]->getChar(j) & 0xff; + if (c == '(' || c == ')' || c == '\\') { + appearBuf->append('\\'); + appearBuf->append(c); + } else if (c < 0x20 || c >= 0x80) { + appearBuf->appendf("\\{0:03o}", c); + } else { + appearBuf->append(c); + } + } + appearBuf->append(") Tj\n"); + + // cleanup + appearBuf->append("ET\n"); + appearBuf->append("Q\n"); + + // next line + y -= 1.1 * fontSize; + } + + if (daToks) { + deleteGList(daToks, GString); + } +} + +// Figure out how much text will fit on the next line. Returns: +// *end = one past the last character to be included +// *width = width of the characters start .. end-1 +// *next = index of first character on the following line +void Annot::getNextLine(GString *text, int start, + GfxFont *font, double fontSize, double wMax, + int *end, double *width, int *next) { + double w, dw; + int j, k, c; + + // figure out how much text will fit on the line + //~ what does Adobe do with tabs? + w = 0; + for (j = start; j < text->getLength() && w <= wMax; ++j) { + c = text->getChar(j) & 0xff; + if (c == 0x0a || c == 0x0d) { + break; + } + if (font && !font->isCIDFont()) { + dw = ((Gfx8BitFont *)font)->getWidth(c) * fontSize; + } else { + // otherwise, make a crude estimate + dw = 0.5 * fontSize; + } + w += dw; + } + if (w > wMax) { + for (k = j; k > start && text->getChar(k-1) != ' '; --k) ; + for (; k > start && text->getChar(k-1) == ' '; --k) ; + if (k > start) { + j = k; + } + if (j == start) { + // handle the pathological case where the first character is + // too wide to fit on the line all by itself + j = start + 1; + } + } + *end = j; + + // compute the width + w = 0; + for (k = start; k < j; ++k) { + if (font && !font->isCIDFont()) { + dw = ((Gfx8BitFont *)font)->getWidth(text->getChar(k)) * fontSize; + } else { + // otherwise, make a crude estimate + dw = 0.5 * fontSize; + } + w += dw; + } + *width = w; + + // next line + while (j < text->getLength() && text->getChar(j) == ' ') { + ++j; + } + if (j < text->getLength() && text->getChar(j) == 0x0d) { + ++j; + } + if (j < text->getLength() && text->getChar(j) == 0x0a) { + ++j; + } + *next = j; +} + +// Draw an (approximate) circle of radius centered at (, ). +// If is true, the circle is filled; otherwise it is stroked. +void Annot::drawCircle(double cx, double cy, double r, GBool fill) { + appearBuf->appendf("{0:.2f} {1:.2f} m\n", + cx + r, cy); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + r, cy + bezierCircle * r, + cx + bezierCircle * r, cy + r, + cx, cy + r); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - bezierCircle * r, cy + r, + cx - r, cy + bezierCircle * r, + cx - r, cy); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - r, cy - bezierCircle * r, + cx - bezierCircle * r, cy - r, + cx, cy - r); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + bezierCircle * r, cy - r, + cx + r, cy - bezierCircle * r, + cx + r, cy); + appearBuf->append(fill ? "f\n" : "s\n"); +} + +// Draw the top-left half of an (approximate) circle of radius +// centered at (, ). +void Annot::drawCircleTopLeft(double cx, double cy, double r) { + double r2; + + r2 = r / sqrt(2.0); + appearBuf->appendf("{0:.2f} {1:.2f} m\n", + cx + r2, cy + r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + (1 - bezierCircle) * r2, + cy + (1 + bezierCircle) * r2, + cx - (1 - bezierCircle) * r2, + cy + (1 + bezierCircle) * r2, + cx - r2, + cy + r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - (1 + bezierCircle) * r2, + cy + (1 - bezierCircle) * r2, + cx - (1 + bezierCircle) * r2, + cy - (1 - bezierCircle) * r2, + cx - r2, + cy - r2); + appearBuf->append("S\n"); +} + +// Draw the bottom-right half of an (approximate) circle of radius +// centered at (, ). +void Annot::drawCircleBottomRight(double cx, double cy, double r) { + double r2; + + r2 = r / sqrt(2.0); + appearBuf->appendf("{0:.2f} {1:.2f} m\n", + cx - r2, cy - r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx - (1 - bezierCircle) * r2, + cy - (1 + bezierCircle) * r2, + cx + (1 - bezierCircle) * r2, + cy - (1 + bezierCircle) * r2, + cx + r2, + cy - r2); + appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", + cx + (1 + bezierCircle) * r2, + cy - (1 - bezierCircle) * r2, + cx + (1 + bezierCircle) * r2, + cy + (1 - bezierCircle) * r2, + cx + r2, + cy + r2); + appearBuf->append("S\n"); +} + +// Look up an inheritable field dictionary entry. +Object *Annot::fieldLookup(Dict *field, char *key, Object *obj) { + Dict *dict; + Object parent; + + dict = field; + if (!dict->lookup(key, obj)->isNull()) { + return obj; + } + obj->free(); + if (dict->lookup("Parent", &parent)->isDict()) { + fieldLookup(parent.getDict(), key, obj); + } else { + obj->initNull(); + } + parent.free(); + return obj; +} + +void Annot::draw(Gfx *gfx, GBool printing) { + Object obj; + GBool isLink; + + // check the flags + if ((flags & annotFlagHidden) || + (printing && !(flags & annotFlagPrint)) || + (!printing && (flags & annotFlagNoView))) { + return; + } + + // draw the appearance stream + isLink = type && !type->cmp("Link"); + appearance.fetch(xref, &obj); + gfx->drawAnnot(&obj, isLink ? borderStyle : (AnnotBorderStyle *)NULL, + xMin, yMin, xMax, yMax); + obj.free(); +} + +//------------------------------------------------------------------------ +// Annots +//------------------------------------------------------------------------ + +Annots::Annots(XRef *xref, Catalog *catalog, Object *annotsObj) { + Dict *acroForm; + Annot *annot; + Object obj1; + Ref ref; + int size; + int i; + + annots = NULL; + size = 0; + nAnnots = 0; + + acroForm = catalog->getAcroForm()->isDict() ? + catalog->getAcroForm()->getDict() : NULL; + if (annotsObj->isArray()) { + for (i = 0; i < annotsObj->arrayGetLength(); ++i) { + if (annotsObj->arrayGetNF(i, &obj1)->isRef()) { + ref = obj1.getRef(); + obj1.free(); + annotsObj->arrayGet(i, &obj1); + } else { + ref.num = ref.gen = -1; + } + if (obj1.isDict()) { + annot = new Annot(xref, acroForm, obj1.getDict(), &ref); + if (annot->isOk()) { + if (nAnnots >= size) { + size += 16; + annots = (Annot **)greallocn(annots, size, sizeof(Annot *)); + } + annots[nAnnots++] = annot; + } else { + delete annot; + } + } + obj1.free(); + } + } +} + +Annots::~Annots() { + int i; + + for (i = 0; i < nAnnots; ++i) { + delete annots[i]; + } + gfree(annots); +} + +void Annots::generateAppearances(Dict *acroForm) { + Object obj1, obj2; + Ref ref; + int i; + + if (acroForm->lookup("Fields", &obj1)->isArray()) { + for (i = 0; i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGetNF(i, &obj2)->isRef()) { + ref = obj2.getRef(); + obj2.free(); + obj1.arrayGet(i, &obj2); + } else { + ref.num = ref.gen = -1; + } + if (obj2.isDict()) { + scanFieldAppearances(obj2.getDict(), &ref, NULL, acroForm); + } + obj2.free(); + } + } + obj1.free(); +} + +void Annots::scanFieldAppearances(Dict *node, Ref *ref, Dict *parent, + Dict *acroForm) { + Annot *annot; + Object obj1, obj2; + Ref ref2; + int i; + + // non-terminal node: scan the children + if (node->lookup("Kids", &obj1)->isArray()) { + for (i = 0; i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGetNF(i, &obj2)->isRef()) { + ref2 = obj2.getRef(); + obj2.free(); + obj1.arrayGet(i, &obj2); + } else { + ref2.num = ref2.gen = -1; + } + if (obj2.isDict()) { + scanFieldAppearances(obj2.getDict(), &ref2, node, acroForm); + } + obj2.free(); + } + obj1.free(); + return; + } + obj1.free(); + + // terminal node: this is either a combined annot/field dict, or an + // annot dict whose parent is a field + if ((annot = findAnnot(ref))) { + node->lookupNF("Parent", &obj1); + if (!parent || !obj1.isNull()) { + annot->generateFieldAppearance(node, node, acroForm); + } else { + annot->generateFieldAppearance(parent, node, acroForm); + } + obj1.free(); + } +} + +Annot *Annots::findAnnot(Ref *ref) { + int i; + + for (i = 0; i < nAnnots; ++i) { + if (annots[i]->match(ref)) { + return annots[i]; + } + } + return NULL; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h new file mode 100644 index 000000000..1f89d4978 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h @@ -0,0 +1,142 @@ +//======================================================================== +// +// Annot.h +// +// Copyright 2000-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef ANNOT_H +#define ANNOT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +class XRef; +class Catalog; +class Gfx; +class GfxFontDict; + +//------------------------------------------------------------------------ +// AnnotBorderStyle +//------------------------------------------------------------------------ + +enum AnnotBorderType { + annotBorderSolid, + annotBorderDashed, + annotBorderBeveled, + annotBorderInset, + annotBorderUnderlined +}; + +class AnnotBorderStyle { +public: + + AnnotBorderStyle(AnnotBorderType typeA, double widthA, + double *dashA, int dashLengthA, + double rA, double gA, double bA); + ~AnnotBorderStyle(); + + AnnotBorderType getType() { return type; } + double getWidth() { return width; } + void getDash(double **dashA, int *dashLengthA) + { *dashA = dash; *dashLengthA = dashLength; } + void getColor(double *rA, double *gA, double *bA) + { *rA = r; *gA = g; *bA = b; } + +private: + + AnnotBorderType type; + double width; + double *dash; + int dashLength; + double r, g, b; +}; + +//------------------------------------------------------------------------ +// Annot +//------------------------------------------------------------------------ + +class Annot { +public: + + Annot(XRef *xrefA, Dict *acroForm, Dict *dict, Ref *refA); + ~Annot(); + GBool isOk() { return ok; } + + void draw(Gfx *gfx, GBool printing); + + // Get appearance object. + Object *getAppearance(Object *obj) { return appearance.fetch(xref, obj); } + + AnnotBorderStyle *getBorderStyle() { return borderStyle; } + + GBool match(Ref *refA) + { return ref.num == refA->num && ref.gen == refA->gen; } + + void generateFieldAppearance(Dict *field, Dict *annot, Dict *acroForm); + +private: + + void setColor(Array *a, GBool fill, int adjust); + void drawText(GString *text, GString *da, GfxFontDict *fontDict, + GBool multiline, int comb, int quadding, + GBool txField, GBool forceZapfDingbats); + void drawListBox(GString **text, GBool *selection, + int nOptions, int topIdx, + GString *da, GfxFontDict *fontDict, GBool quadding); + void getNextLine(GString *text, int start, + GfxFont *font, double fontSize, double wMax, + int *end, double *width, int *next); + void drawCircle(double cx, double cy, double r, GBool fill); + void drawCircleTopLeft(double cx, double cy, double r); + void drawCircleBottomRight(double cx, double cy, double r); + Object *fieldLookup(Dict *field, char *key, Object *obj); + + XRef *xref; // the xref table for this PDF file + Ref ref; // object ref identifying this annotation + GString *type; // annotation type + Object appearance; // a reference to the Form XObject stream + // for the normal appearance + GString *appearBuf; + double xMin, yMin, // annotation rectangle + xMax, yMax; + Guint flags; + AnnotBorderStyle *borderStyle; + GBool ok; +}; + +//------------------------------------------------------------------------ +// Annots +//------------------------------------------------------------------------ + +class Annots { +public: + + // Build a list of Annot objects. + Annots(XRef *xref, Catalog *catalog, Object *annotsObj); + + ~Annots(); + + // Iterate through list of annotations. + int getNumAnnots() { return nAnnots; } + Annot *getAnnot(int i) { return annots[i]; } + + // (Re)generate the appearance streams for all annotations belonging + // to a form field. + void generateAppearances(Dict *acroForm); + +private: + + void scanFieldAppearances(Dict *node, Ref *ref, Dict *parent, + Dict *acroForm); + Annot *findAnnot(Ref *ref); + + Annot **annots; + int nAnnots; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc new file mode 100644 index 000000000..10ded148d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc @@ -0,0 +1,73 @@ +//======================================================================== +// +// Array.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "Object.h" +#include "Array.h" + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +Array::Array(XRef *xrefA) { + xref = xrefA; + elems = NULL; + size = length = 0; + ref = 1; +} + +Array::~Array() { + int i; + + for (i = 0; i < length; ++i) + elems[i].free(); + gfree(elems); +} + +void Array::add(Object *elem) { + if (length == size) { + if (length == 0) { + size = 8; + } else { + size *= 2; + } + elems = (Object *)greallocn(elems, size, sizeof(Object)); + } + elems[length] = *elem; + ++length; +} + +Object *Array::get(int i, Object *obj) { + if (i < 0 || i >= length) { +#ifdef DEBUG_MEM + abort(); +#else + return obj->initNull(); +#endif + } + return elems[i].fetch(xref, obj); +} + +Object *Array::getNF(int i, Object *obj) { + if (i < 0 || i >= length) { +#ifdef DEBUG_MEM + abort(); +#else + return obj->initNull(); +#endif + } + return elems[i].copy(obj); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h new file mode 100644 index 000000000..20ae05f29 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h @@ -0,0 +1,58 @@ +//======================================================================== +// +// Array.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef ARRAY_H +#define ARRAY_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class XRef; + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +class Array { +public: + + // Constructor. + Array(XRef *xrefA); + + // Destructor. + ~Array(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get number of elements. + int getLength() { return length; } + + // Add an element. + void add(Object *elem); + + // Accessors. + Object *get(int i, Object *obj); + Object *getNF(int i, Object *obj); + +private: + + XRef *xref; // the xref table for this PDF file + Object *elems; // array of elements + int size; // size of array + int length; // number of elements in array + int ref; // reference count +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc new file mode 100644 index 000000000..ce9895712 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc @@ -0,0 +1,65 @@ +//======================================================================== +// +// BuiltinFont.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "FontEncodingTables.h" +#include "BuiltinFont.h" + +//------------------------------------------------------------------------ + +BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) { + int i, h; + + size = sizeA; + tab = (BuiltinFontWidth **)gmallocn(size, sizeof(BuiltinFontWidth *)); + for (i = 0; i < size; ++i) { + tab[i] = NULL; + } + for (i = 0; i < sizeA; ++i) { + h = hash(widths[i].name); + widths[i].next = tab[h]; + tab[h] = &widths[i]; + } +} + +BuiltinFontWidths::~BuiltinFontWidths() { + gfree(tab); +} + +GBool BuiltinFontWidths::getWidth(char *name, Gushort *width) { + int h; + BuiltinFontWidth *p; + + h = hash(name); + for (p = tab[h]; p; p = p->next) { + if (!strcmp(p->name, name)) { + *width = p->width; + return gTrue; + } + } + return gFalse; +} + +int BuiltinFontWidths::hash(char *name) { + char *p; + unsigned int h; + + h = 0; + for (p = name; *p; ++p) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h new file mode 100644 index 000000000..903ed19ec --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h @@ -0,0 +1,57 @@ +//======================================================================== +// +// BuiltinFont.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef BUILTINFONT_H +#define BUILTINFONT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +struct BuiltinFont; +class BuiltinFontWidths; + +//------------------------------------------------------------------------ + +struct BuiltinFont { + char *name; + char **defaultBaseEnc; + short ascent; + short descent; + short bbox[4]; + BuiltinFontWidths *widths; +}; + +//------------------------------------------------------------------------ + +struct BuiltinFontWidth { + char *name; + Gushort width; + BuiltinFontWidth *next; +}; + +class BuiltinFontWidths { +public: + + BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA); + ~BuiltinFontWidths(); + GBool getWidth(char *name, Gushort *width); + +private: + + int hash(char *name); + + BuiltinFontWidth **tab; + int size; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc new file mode 100644 index 000000000..9c362389c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc @@ -0,0 +1,4284 @@ +//======================================================================== +// +// BuiltinFontTables.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include +#include +#include "FontEncodingTables.h" +#include "BuiltinFontTables.h" + +static BuiltinFontWidth courierWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "L", 600, NULL }, + { "backslash", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "equal", 600, NULL }, + { "question", 600, NULL }, + { "X", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "hyphen", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "five", 600, NULL }, + { "nine", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "zero", 600, NULL }, + { "multiply", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Racute", 600, NULL }, + { "Ograve", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "scedilla", 600, NULL }, + { "Oacute", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "ampersand", 600, NULL }, + { "Iacute", 600, NULL }, + { "lacute", 600, NULL }, + { "igrave", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "iacute", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "seven", 600, NULL }, + { "Amacron", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "braceright", 600, NULL }, + { "icircumflex", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth courierBoldWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth courierBoldObliqueWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth courierObliqueWidthsTab[] = { + { "Ntilde", 600, NULL }, + { "rcaron", 600, NULL }, + { "kcommaaccent", 600, NULL }, + { "Ncommaaccent", 600, NULL }, + { "Zacute", 600, NULL }, + { "comma", 600, NULL }, + { "cedilla", 600, NULL }, + { "plusminus", 600, NULL }, + { "circumflex", 600, NULL }, + { "dotaccent", 600, NULL }, + { "edotaccent", 600, NULL }, + { "asciitilde", 600, NULL }, + { "colon", 600, NULL }, + { "onehalf", 600, NULL }, + { "dollar", 600, NULL }, + { "Lcaron", 600, NULL }, + { "ntilde", 600, NULL }, + { "Aogonek", 600, NULL }, + { "ncommaaccent", 600, NULL }, + { "minus", 600, NULL }, + { "Iogonek", 600, NULL }, + { "zacute", 600, NULL }, + { "yen", 600, NULL }, + { "space", 600, NULL }, + { "Omacron", 600, NULL }, + { "questiondown", 600, NULL }, + { "emdash", 600, NULL }, + { "Agrave", 600, NULL }, + { "three", 600, NULL }, + { "numbersign", 600, NULL }, + { "lcaron", 600, NULL }, + { "A", 600, NULL }, + { "B", 600, NULL }, + { "C", 600, NULL }, + { "aogonek", 600, NULL }, + { "D", 600, NULL }, + { "E", 600, NULL }, + { "onequarter", 600, NULL }, + { "F", 600, NULL }, + { "G", 600, NULL }, + { "H", 600, NULL }, + { "I", 600, NULL }, + { "J", 600, NULL }, + { "K", 600, NULL }, + { "iogonek", 600, NULL }, + { "backslash", 600, NULL }, + { "L", 600, NULL }, + { "periodcentered", 600, NULL }, + { "M", 600, NULL }, + { "N", 600, NULL }, + { "omacron", 600, NULL }, + { "Tcommaaccent", 600, NULL }, + { "O", 600, NULL }, + { "P", 600, NULL }, + { "Q", 600, NULL }, + { "Uhungarumlaut", 600, NULL }, + { "R", 600, NULL }, + { "Aacute", 600, NULL }, + { "caron", 600, NULL }, + { "S", 600, NULL }, + { "T", 600, NULL }, + { "U", 600, NULL }, + { "agrave", 600, NULL }, + { "V", 600, NULL }, + { "W", 600, NULL }, + { "X", 600, NULL }, + { "question", 600, NULL }, + { "equal", 600, NULL }, + { "Y", 600, NULL }, + { "Z", 600, NULL }, + { "four", 600, NULL }, + { "a", 600, NULL }, + { "Gcommaaccent", 600, NULL }, + { "b", 600, NULL }, + { "c", 600, NULL }, + { "d", 600, NULL }, + { "e", 600, NULL }, + { "f", 600, NULL }, + { "g", 600, NULL }, + { "bullet", 600, NULL }, + { "h", 600, NULL }, + { "i", 600, NULL }, + { "Oslash", 600, NULL }, + { "dagger", 600, NULL }, + { "j", 600, NULL }, + { "k", 600, NULL }, + { "l", 600, NULL }, + { "m", 600, NULL }, + { "n", 600, NULL }, + { "tcommaaccent", 600, NULL }, + { "o", 600, NULL }, + { "ordfeminine", 600, NULL }, + { "ring", 600, NULL }, + { "p", 600, NULL }, + { "q", 600, NULL }, + { "uhungarumlaut", 600, NULL }, + { "r", 600, NULL }, + { "twosuperior", 600, NULL }, + { "aacute", 600, NULL }, + { "s", 600, NULL }, + { "OE", 600, NULL }, + { "t", 600, NULL }, + { "divide", 600, NULL }, + { "u", 600, NULL }, + { "Ccaron", 600, NULL }, + { "v", 600, NULL }, + { "w", 600, NULL }, + { "x", 600, NULL }, + { "y", 600, NULL }, + { "z", 600, NULL }, + { "Gbreve", 600, NULL }, + { "commaaccent", 600, NULL }, + { "hungarumlaut", 600, NULL }, + { "Idotaccent", 600, NULL }, + { "Nacute", 600, NULL }, + { "quotedbl", 600, NULL }, + { "gcommaaccent", 600, NULL }, + { "mu", 600, NULL }, + { "greaterequal", 600, NULL }, + { "Scaron", 600, NULL }, + { "Lslash", 600, NULL }, + { "semicolon", 600, NULL }, + { "oslash", 600, NULL }, + { "lessequal", 600, NULL }, + { "lozenge", 600, NULL }, + { "parenright", 600, NULL }, + { "ccaron", 600, NULL }, + { "Ecircumflex", 600, NULL }, + { "gbreve", 600, NULL }, + { "trademark", 600, NULL }, + { "daggerdbl", 600, NULL }, + { "nacute", 600, NULL }, + { "macron", 600, NULL }, + { "Otilde", 600, NULL }, + { "Emacron", 600, NULL }, + { "ellipsis", 600, NULL }, + { "scaron", 600, NULL }, + { "AE", 600, NULL }, + { "Ucircumflex", 600, NULL }, + { "lslash", 600, NULL }, + { "quotedblleft", 600, NULL }, + { "guilsinglright", 600, NULL }, + { "hyphen", 600, NULL }, + { "quotesingle", 600, NULL }, + { "eight", 600, NULL }, + { "exclamdown", 600, NULL }, + { "endash", 600, NULL }, + { "oe", 600, NULL }, + { "Abreve", 600, NULL }, + { "Umacron", 600, NULL }, + { "ecircumflex", 600, NULL }, + { "Adieresis", 600, NULL }, + { "copyright", 600, NULL }, + { "Egrave", 600, NULL }, + { "slash", 600, NULL }, + { "Edieresis", 600, NULL }, + { "otilde", 600, NULL }, + { "Idieresis", 600, NULL }, + { "parenleft", 600, NULL }, + { "one", 600, NULL }, + { "emacron", 600, NULL }, + { "Odieresis", 600, NULL }, + { "ucircumflex", 600, NULL }, + { "bracketleft", 600, NULL }, + { "Ugrave", 600, NULL }, + { "quoteright", 600, NULL }, + { "Udieresis", 600, NULL }, + { "perthousand", 600, NULL }, + { "Ydieresis", 600, NULL }, + { "umacron", 600, NULL }, + { "abreve", 600, NULL }, + { "Eacute", 600, NULL }, + { "adieresis", 600, NULL }, + { "egrave", 600, NULL }, + { "edieresis", 600, NULL }, + { "idieresis", 600, NULL }, + { "Eth", 600, NULL }, + { "ae", 600, NULL }, + { "asterisk", 600, NULL }, + { "odieresis", 600, NULL }, + { "Uacute", 600, NULL }, + { "ugrave", 600, NULL }, + { "nine", 600, NULL }, + { "five", 600, NULL }, + { "udieresis", 600, NULL }, + { "Zcaron", 600, NULL }, + { "Scommaaccent", 600, NULL }, + { "threequarters", 600, NULL }, + { "guillemotright", 600, NULL }, + { "Ccedilla", 600, NULL }, + { "ydieresis", 600, NULL }, + { "tilde", 600, NULL }, + { "at", 600, NULL }, + { "eacute", 600, NULL }, + { "underscore", 600, NULL }, + { "Euro", 600, NULL }, + { "Dcroat", 600, NULL }, + { "multiply", 600, NULL }, + { "zero", 600, NULL }, + { "eth", 600, NULL }, + { "Scedilla", 600, NULL }, + { "Ograve", 600, NULL }, + { "Racute", 600, NULL }, + { "partialdiff", 600, NULL }, + { "uacute", 600, NULL }, + { "braceleft", 600, NULL }, + { "Thorn", 600, NULL }, + { "zcaron", 600, NULL }, + { "scommaaccent", 600, NULL }, + { "ccedilla", 600, NULL }, + { "Dcaron", 600, NULL }, + { "dcroat", 600, NULL }, + { "Ocircumflex", 600, NULL }, + { "Oacute", 600, NULL }, + { "scedilla", 600, NULL }, + { "ogonek", 600, NULL }, + { "ograve", 600, NULL }, + { "racute", 600, NULL }, + { "Tcaron", 600, NULL }, + { "Eogonek", 600, NULL }, + { "thorn", 600, NULL }, + { "degree", 600, NULL }, + { "registered", 600, NULL }, + { "radical", 600, NULL }, + { "Aring", 600, NULL }, + { "percent", 600, NULL }, + { "six", 600, NULL }, + { "paragraph", 600, NULL }, + { "dcaron", 600, NULL }, + { "Uogonek", 600, NULL }, + { "two", 600, NULL }, + { "summation", 600, NULL }, + { "Igrave", 600, NULL }, + { "Lacute", 600, NULL }, + { "ocircumflex", 600, NULL }, + { "oacute", 600, NULL }, + { "Uring", 600, NULL }, + { "Lcommaaccent", 600, NULL }, + { "tcaron", 600, NULL }, + { "eogonek", 600, NULL }, + { "Delta", 600, NULL }, + { "Ohungarumlaut", 600, NULL }, + { "asciicircum", 600, NULL }, + { "aring", 600, NULL }, + { "grave", 600, NULL }, + { "uogonek", 600, NULL }, + { "bracketright", 600, NULL }, + { "Iacute", 600, NULL }, + { "ampersand", 600, NULL }, + { "igrave", 600, NULL }, + { "lacute", 600, NULL }, + { "Ncaron", 600, NULL }, + { "plus", 600, NULL }, + { "uring", 600, NULL }, + { "quotesinglbase", 600, NULL }, + { "lcommaaccent", 600, NULL }, + { "Yacute", 600, NULL }, + { "ohungarumlaut", 600, NULL }, + { "threesuperior", 600, NULL }, + { "acute", 600, NULL }, + { "section", 600, NULL }, + { "dieresis", 600, NULL }, + { "iacute", 600, NULL }, + { "quotedblbase", 600, NULL }, + { "ncaron", 600, NULL }, + { "florin", 600, NULL }, + { "yacute", 600, NULL }, + { "Rcommaaccent", 600, NULL }, + { "fi", 600, NULL }, + { "fl", 600, NULL }, + { "Acircumflex", 600, NULL }, + { "Cacute", 600, NULL }, + { "Icircumflex", 600, NULL }, + { "guillemotleft", 600, NULL }, + { "germandbls", 600, NULL }, + { "Amacron", 600, NULL }, + { "seven", 600, NULL }, + { "Sacute", 600, NULL }, + { "ordmasculine", 600, NULL }, + { "dotlessi", 600, NULL }, + { "sterling", 600, NULL }, + { "notequal", 600, NULL }, + { "Imacron", 600, NULL }, + { "rcommaaccent", 600, NULL }, + { "Zdotaccent", 600, NULL }, + { "acircumflex", 600, NULL }, + { "cacute", 600, NULL }, + { "Ecaron", 600, NULL }, + { "icircumflex", 600, NULL }, + { "braceright", 600, NULL }, + { "quotedblright", 600, NULL }, + { "amacron", 600, NULL }, + { "sacute", 600, NULL }, + { "imacron", 600, NULL }, + { "cent", 600, NULL }, + { "currency", 600, NULL }, + { "logicalnot", 600, NULL }, + { "zdotaccent", 600, NULL }, + { "Atilde", 600, NULL }, + { "breve", 600, NULL }, + { "bar", 600, NULL }, + { "fraction", 600, NULL }, + { "less", 600, NULL }, + { "ecaron", 600, NULL }, + { "guilsinglleft", 600, NULL }, + { "exclam", 600, NULL }, + { "period", 600, NULL }, + { "Rcaron", 600, NULL }, + { "Kcommaaccent", 600, NULL }, + { "greater", 600, NULL }, + { "atilde", 600, NULL }, + { "brokenbar", 600, NULL }, + { "quoteleft", 600, NULL }, + { "Edotaccent", 600, NULL }, + { "onesuperior", 600, NULL } +}; + +static BuiltinFontWidth helveticaWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 278, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 556, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 299, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 222, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 556, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 556, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 500, NULL }, + { "d", 556, NULL }, + { "e", 556, NULL }, + { "f", 278, NULL }, + { "g", 556, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 222, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 222, NULL }, + { "k", 500, NULL }, + { "l", 222, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 556, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 333, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 500, NULL }, + { "OE", 1000, NULL }, + { "t", 278, NULL }, + { "divide", 584, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 355, NULL }, + { "gcommaaccent", 556, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 500, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 556, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 500, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 222, NULL }, + { "quotedblleft", 333, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 191, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 556, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 278, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 222, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 556, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 556, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 1015, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 556, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 334, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 500, NULL }, + { "ccedilla", 500, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 500, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 556, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 453, NULL }, + { "Aring", 667, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 537, NULL }, + { "dcaron", 643, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 556, NULL }, + { "oacute", 556, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 317, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 278, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 667, NULL }, + { "igrave", 278, NULL }, + { "lacute", 222, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 222, NULL }, + { "lcommaaccent", 222, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 556, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 333, NULL }, + { "ncaron", 556, NULL }, + { "florin", 556, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 667, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 500, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 334, NULL }, + { "quotedblright", 333, NULL }, + { "amacron", 556, NULL }, + { "sacute", 500, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 260, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 278, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 260, NULL }, + { "quoteleft", 222, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth helveticaBoldWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 333, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 611, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 611, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 400, NULL }, + { "A", 722, NULL }, + { "B", 722, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 556, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 611, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 611, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 611, NULL }, + { "c", 556, NULL }, + { "d", 611, NULL }, + { "e", 556, NULL }, + { "f", 333, NULL }, + { "g", 611, NULL }, + { "bullet", 350, NULL }, + { "h", 611, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 278, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 889, NULL }, + { "n", 611, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 611, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 611, NULL }, + { "q", 611, NULL }, + { "uhungarumlaut", 611, NULL }, + { "r", 389, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 556, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 584, NULL }, + { "u", 611, NULL }, + { "Ccaron", 722, NULL }, + { "v", 556, NULL }, + { "w", 778, NULL }, + { "x", 556, NULL }, + { "y", 556, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 474, NULL }, + { "gcommaaccent", 611, NULL }, + { "mu", 611, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 556, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 611, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 611, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 556, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 238, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 611, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 611, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 278, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 611, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 611, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 611, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 611, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 556, NULL }, + { "tilde", 333, NULL }, + { "dbldaggerumlaut", 556, NULL }, + { "at", 975, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 611, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 611, NULL }, + { "braceleft", 389, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 556, NULL }, + { "ccedilla", 556, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 611, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 556, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 611, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 611, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 556, NULL }, + { "dcaron", 743, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 611, NULL }, + { "oacute", 611, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 389, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 584, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 611, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 722, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 611, NULL }, + { "quotesinglbase", 278, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 611, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 611, NULL }, + { "florin", 556, NULL }, + { "yacute", 556, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 611, NULL }, + { "fl", 611, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 722, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 556, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 389, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 556, NULL }, + { "sacute", 556, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 280, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 280, NULL }, + { "quoteleft", 278, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth helveticaBoldObliqueWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 333, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 611, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 611, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 400, NULL }, + { "A", 722, NULL }, + { "B", 722, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 556, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 611, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 611, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 611, NULL }, + { "c", 556, NULL }, + { "d", 611, NULL }, + { "e", 556, NULL }, + { "f", 333, NULL }, + { "g", 611, NULL }, + { "bullet", 350, NULL }, + { "h", 611, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 278, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 889, NULL }, + { "n", 611, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 611, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 611, NULL }, + { "q", 611, NULL }, + { "uhungarumlaut", 611, NULL }, + { "r", 389, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 556, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 584, NULL }, + { "u", 611, NULL }, + { "Ccaron", 722, NULL }, + { "v", 556, NULL }, + { "w", 778, NULL }, + { "x", 556, NULL }, + { "y", 556, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 474, NULL }, + { "gcommaaccent", 611, NULL }, + { "mu", 611, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 556, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 611, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 611, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 556, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 238, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 611, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 611, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 278, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 611, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 611, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 611, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 611, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 556, NULL }, + { "tilde", 333, NULL }, + { "at", 975, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 611, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 611, NULL }, + { "braceleft", 389, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 556, NULL }, + { "ccedilla", 556, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 611, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 556, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 611, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 611, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 556, NULL }, + { "dcaron", 743, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 611, NULL }, + { "oacute", 611, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 389, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 584, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 611, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 722, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 611, NULL }, + { "quotesinglbase", 278, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 611, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 611, NULL }, + { "florin", 556, NULL }, + { "yacute", 556, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 611, NULL }, + { "fl", 611, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 722, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 556, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 389, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 556, NULL }, + { "sacute", 556, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 280, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 280, NULL }, + { "quoteleft", 278, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth helveticaObliqueWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 278, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 584, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 556, NULL }, + { "asciitilde", 584, NULL }, + { "colon", 278, NULL }, + { "onehalf", 834, NULL }, + { "dollar", 556, NULL }, + { "Lcaron", 556, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 584, NULL }, + { "Iogonek", 278, NULL }, + { "zacute", 500, NULL }, + { "yen", 556, NULL }, + { "space", 278, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 611, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 556, NULL }, + { "numbersign", 556, NULL }, + { "lcaron", 299, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 556, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 834, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 722, NULL }, + { "I", 278, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 222, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 278, NULL }, + { "M", 833, NULL }, + { "N", 722, NULL }, + { "omacron", 556, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 778, NULL }, + { "P", 667, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 667, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 556, NULL }, + { "V", 667, NULL }, + { "W", 944, NULL }, + { "X", 667, NULL }, + { "question", 556, NULL }, + { "equal", 584, NULL }, + { "Y", 667, NULL }, + { "Z", 611, NULL }, + { "four", 556, NULL }, + { "a", 556, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 500, NULL }, + { "d", 556, NULL }, + { "e", 556, NULL }, + { "f", 278, NULL }, + { "g", 556, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 222, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 556, NULL }, + { "j", 222, NULL }, + { "k", 500, NULL }, + { "l", 222, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 556, NULL }, + { "ordfeminine", 370, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 333, NULL }, + { "twosuperior", 333, NULL }, + { "aacute", 556, NULL }, + { "s", 500, NULL }, + { "OE", 1000, NULL }, + { "t", 278, NULL }, + { "divide", 584, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 500, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 278, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 355, NULL }, + { "gcommaaccent", 556, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 667, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 611, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 500, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 556, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 556, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 500, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 222, NULL }, + { "quotedblleft", 333, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 191, NULL }, + { "eight", 556, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 556, NULL }, + { "oe", 944, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 556, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 737, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 556, NULL }, + { "Idieresis", 278, NULL }, + { "parenleft", 333, NULL }, + { "one", 556, NULL }, + { "emacron", 556, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 278, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 222, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 667, NULL }, + { "umacron", 556, NULL }, + { "abreve", 556, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 556, NULL }, + { "egrave", 556, NULL }, + { "edieresis", 556, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 889, NULL }, + { "asterisk", 389, NULL }, + { "odieresis", 556, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 556, NULL }, + { "five", 556, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 667, NULL }, + { "threequarters", 834, NULL }, + { "guillemotright", 556, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 1015, NULL }, + { "eacute", 556, NULL }, + { "underscore", 556, NULL }, + { "Euro", 556, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 584, NULL }, + { "zero", 556, NULL }, + { "eth", 556, NULL }, + { "Scedilla", 667, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 334, NULL }, + { "Thorn", 667, NULL }, + { "zcaron", 500, NULL }, + { "scommaaccent", 500, NULL }, + { "ccedilla", 500, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 500, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 556, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 737, NULL }, + { "radical", 453, NULL }, + { "Aring", 667, NULL }, + { "percent", 889, NULL }, + { "six", 556, NULL }, + { "paragraph", 537, NULL }, + { "dcaron", 643, NULL }, + { "Uogonek", 722, NULL }, + { "two", 556, NULL }, + { "summation", 600, NULL }, + { "Igrave", 278, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 556, NULL }, + { "oacute", 556, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 317, NULL }, + { "eogonek", 556, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 556, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 278, NULL }, + { "Iacute", 278, NULL }, + { "ampersand", 667, NULL }, + { "igrave", 278, NULL }, + { "lacute", 222, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 584, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 222, NULL }, + { "lcommaaccent", 222, NULL }, + { "Yacute", 667, NULL }, + { "ohungarumlaut", 556, NULL }, + { "threesuperior", 333, NULL }, + { "acute", 333, NULL }, + { "section", 556, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 333, NULL }, + { "ncaron", 556, NULL }, + { "florin", 556, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 278, NULL }, + { "guillemotleft", 556, NULL }, + { "germandbls", 611, NULL }, + { "Amacron", 667, NULL }, + { "seven", 556, NULL }, + { "Sacute", 667, NULL }, + { "ordmasculine", 365, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 556, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 278, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 556, NULL }, + { "cacute", 500, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 334, NULL }, + { "quotedblright", 333, NULL }, + { "amacron", 556, NULL }, + { "sacute", 500, NULL }, + { "imacron", 278, NULL }, + { "cent", 556, NULL }, + { "currency", 556, NULL }, + { "logicalnot", 584, NULL }, + { "zdotaccent", 500, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 260, NULL }, + { "fraction", 167, NULL }, + { "less", 584, NULL }, + { "ecaron", 556, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 278, NULL }, + { "period", 278, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 584, NULL }, + { "atilde", 556, NULL }, + { "brokenbar", 260, NULL }, + { "quoteleft", 222, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 333, NULL } +}; + +static BuiltinFontWidth symbolWidthsTab[] = { + { "bracketleftex", 384, NULL }, + { "alpha", 631, NULL }, + { "union", 768, NULL }, + { "infinity", 713, NULL }, + { "comma", 250, NULL }, + { "copyrightsans", 790, NULL }, + { "plusminus", 549, NULL }, + { "arrowup", 603, NULL }, + { "apple", 790, NULL }, + { "parenleftbt", 384, NULL }, + { "notelement", 713, NULL }, + { "colon", 278, NULL }, + { "beta", 549, NULL }, + { "braceleftbt", 494, NULL }, + { "Lambda", 686, NULL }, + { "Phi", 763, NULL }, + { "minus", 549, NULL }, + { "space", 250, NULL }, + { "Sigma", 592, NULL }, + { "approxequal", 549, NULL }, + { "minute", 247, NULL }, + { "circleplus", 768, NULL }, + { "Omicron", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lambda", 549, NULL }, + { "phi", 521, NULL }, + { "aleph", 823, NULL }, + { "Tau", 611, NULL }, + { "spade", 753, NULL }, + { "logicaland", 603, NULL }, + { "sigma", 603, NULL }, + { "propersuperset", 713, NULL }, + { "omicron", 549, NULL }, + { "question", 444, NULL }, + { "equal", 549, NULL }, + { "Epsilon", 611, NULL }, + { "emptyset", 823, NULL }, + { "diamond", 753, NULL }, + { "four", 500, NULL }, + { "Mu", 889, NULL }, + { "parenlefttp", 384, NULL }, + { "club", 753, NULL }, + { "bullet", 460, NULL }, + { "Omega", 768, NULL }, + { "tau", 439, NULL }, + { "Upsilon", 690, NULL }, + { "bracelefttp", 494, NULL }, + { "heart", 753, NULL }, + { "divide", 549, NULL }, + { "epsilon", 439, NULL }, + { "logicalor", 603, NULL }, + { "parenleftex", 384, NULL }, + { "greaterequal", 549, NULL }, + { "mu", 576, NULL }, + { "Nu", 722, NULL }, + { "therefore", 863, NULL }, + { "notsubset", 713, NULL }, + { "omega", 686, NULL }, + { "semicolon", 278, NULL }, + { "element", 713, NULL }, + { "upsilon", 576, NULL }, + { "existential", 549, NULL }, + { "integralbt", 686, NULL }, + { "lessequal", 549, NULL }, + { "phi1", 603, NULL }, + { "lozenge", 494, NULL }, + { "trademarkserif", 890, NULL }, + { "parenright", 333, NULL }, + { "reflexsuperset", 713, NULL }, + { "sigma1", 439, NULL }, + { "nu", 521, NULL }, + { "Gamma", 603, NULL }, + { "angleright", 329, NULL }, + { "ellipsis", 1000, NULL }, + { "Rho", 556, NULL }, + { "parenrightbt", 384, NULL }, + { "radicalex", 500, NULL }, + { "eight", 500, NULL }, + { "angleleft", 329, NULL }, + { "arrowdbldown", 603, NULL }, + { "congruent", 549, NULL }, + { "Theta", 741, NULL }, + { "intersection", 768, NULL }, + { "Pi", 768, NULL }, + { "slash", 278, NULL }, + { "registerserif", 790, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "gamma", 411, NULL }, + { "bracketleft", 333, NULL }, + { "rho", 549, NULL }, + { "circlemultiply", 768, NULL }, + { "Chi", 722, NULL }, + { "theta", 521, NULL }, + { "pi", 549, NULL }, + { "integraltp", 686, NULL }, + { "Eta", 722, NULL }, + { "product", 823, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "propersubset", 713, NULL }, + { "bracketrightbt", 384, NULL }, + { "trademarksans", 786, NULL }, + { "dotmath", 250, NULL }, + { "integralex", 686, NULL }, + { "chi", 549, NULL }, + { "parenrighttp", 384, NULL }, + { "eta", 603, NULL }, + { "underscore", 500, NULL }, + { "Euro", 750, NULL }, + { "multiply", 549, NULL }, + { "zero", 500, NULL }, + { "partialdiff", 494, NULL }, + { "angle", 768, NULL }, + { "arrowdblleft", 987, NULL }, + { "braceleft", 480, NULL }, + { "parenrightex", 384, NULL }, + { "Rfraktur", 795, NULL }, + { "Zeta", 611, NULL }, + { "braceex", 494, NULL }, + { "arrowdblup", 603, NULL }, + { "arrowdown", 603, NULL }, + { "Ifraktur", 686, NULL }, + { "degree", 400, NULL }, + { "Iota", 333, NULL }, + { "perpendicular", 658, NULL }, + { "radical", 549, NULL }, + { "asteriskmath", 500, NULL }, + { "percent", 833, NULL }, + { "zeta", 494, NULL }, + { "six", 500, NULL }, + { "two", 500, NULL }, + { "weierstrass", 987, NULL }, + { "summation", 713, NULL }, + { "bracketrighttp", 384, NULL }, + { "carriagereturn", 658, NULL }, + { "suchthat", 439, NULL }, + { "arrowvertex", 603, NULL }, + { "Delta", 612, NULL }, + { "iota", 329, NULL }, + { "arrowhorizex", 1000, NULL }, + { "bracketrightex", 384, NULL }, + { "bracketright", 333, NULL }, + { "ampersand", 778, NULL }, + { "plus", 549, NULL }, + { "proportional", 713, NULL }, + { "delta", 494, NULL }, + { "copyrightserif", 790, NULL }, + { "bracerightmid", 494, NULL }, + { "arrowleft", 987, NULL }, + { "second", 411, NULL }, + { "arrowdblboth", 1042, NULL }, + { "florin", 500, NULL }, + { "Psi", 795, NULL }, + { "bracerightbt", 494, NULL }, + { "bracketleftbt", 384, NULL }, + { "seven", 500, NULL }, + { "braceleftmid", 494, NULL }, + { "notequal", 549, NULL }, + { "psi", 686, NULL }, + { "equivalence", 549, NULL }, + { "universal", 713, NULL }, + { "arrowdblright", 987, NULL }, + { "braceright", 480, NULL }, + { "reflexsubset", 713, NULL }, + { "Xi", 645, NULL }, + { "theta1", 631, NULL }, + { "logicalnot", 713, NULL }, + { "Kappa", 722, NULL }, + { "similar", 549, NULL }, + { "bar", 200, NULL }, + { "fraction", 167, NULL }, + { "less", 549, NULL }, + { "registersans", 790, NULL }, + { "omega1", 713, NULL }, + { "exclam", 333, NULL }, + { "Upsilon1", 620, NULL }, + { "bracerighttp", 494, NULL }, + { "xi", 493, NULL }, + { "period", 250, NULL }, + { "Alpha", 722, NULL }, + { "arrowright", 987, NULL }, + { "greater", 549, NULL }, + { "bracketlefttp", 384, NULL }, + { "kappa", 549, NULL }, + { "gradient", 713, NULL }, + { "integral", 274, NULL }, + { "arrowboth", 1042, NULL }, + { "Beta", 667, NULL } +}; + +static BuiltinFontWidth timesBoldWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 444, NULL }, + { "kcommaaccent", 556, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 667, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 570, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 520, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 667, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 570, NULL }, + { "Iogonek", 389, NULL }, + { "zacute", 444, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 778, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 394, NULL }, + { "A", 722, NULL }, + { "B", 667, NULL }, + { "C", 722, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 750, NULL }, + { "F", 611, NULL }, + { "G", 778, NULL }, + { "H", 778, NULL }, + { "I", 389, NULL }, + { "J", 500, NULL }, + { "K", 778, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 667, NULL }, + { "periodcentered", 250, NULL }, + { "M", 944, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 667, NULL }, + { "O", 778, NULL }, + { "P", 611, NULL }, + { "Q", 778, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 722, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 667, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 722, NULL }, + { "W", 1000, NULL }, + { "X", 722, NULL }, + { "question", 500, NULL }, + { "equal", 570, NULL }, + { "Y", 722, NULL }, + { "Z", 667, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 778, NULL }, + { "b", 556, NULL }, + { "c", 444, NULL }, + { "d", 556, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 278, NULL }, + { "Oslash", 778, NULL }, + { "dagger", 500, NULL }, + { "j", 333, NULL }, + { "k", 556, NULL }, + { "l", 278, NULL }, + { "m", 833, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 333, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 300, NULL }, + { "ring", 333, NULL }, + { "p", 556, NULL }, + { "q", 556, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 444, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 1000, NULL }, + { "t", 333, NULL }, + { "divide", 570, NULL }, + { "u", 556, NULL }, + { "Ccaron", 722, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 444, NULL }, + { "Gbreve", 778, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 389, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 555, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 556, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 667, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 778, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 1000, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 278, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 747, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 389, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 778, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 722, NULL }, + { "umacron", 556, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 722, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 667, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 722, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 930, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 570, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 778, NULL }, + { "Racute", 722, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 394, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 444, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 556, NULL }, + { "Ocircumflex", 778, NULL }, + { "Oacute", 778, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 444, NULL }, + { "Tcaron", 667, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 556, NULL }, + { "degree", 400, NULL }, + { "registered", 747, NULL }, + { "radical", 549, NULL }, + { "Aring", 722, NULL }, + { "percent", 1000, NULL }, + { "six", 500, NULL }, + { "paragraph", 540, NULL }, + { "dcaron", 672, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 389, NULL }, + { "Lacute", 667, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 667, NULL }, + { "tcaron", 416, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 778, NULL }, + { "asciicircum", 581, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 389, NULL }, + { "ampersand", 833, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 570, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 722, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 556, NULL }, + { "florin", 500, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 722, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 722, NULL }, + { "Icircumflex", 389, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 556, NULL }, + { "Amacron", 722, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 330, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 389, NULL }, + { "rcommaaccent", 444, NULL }, + { "Zdotaccent", 667, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 394, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 570, NULL }, + { "zdotaccent", 444, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 220, NULL }, + { "fraction", 167, NULL }, + { "less", 570, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 722, NULL }, + { "Kcommaaccent", 778, NULL }, + { "greater", 570, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 220, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth timesBoldItalicWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 570, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 570, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 556, NULL }, + { "Aogonek", 667, NULL }, + { "ncommaaccent", 556, NULL }, + { "minus", 606, NULL }, + { "Iogonek", 389, NULL }, + { "zacute", 389, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 667, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 382, NULL }, + { "A", 667, NULL }, + { "B", 667, NULL }, + { "C", 667, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 667, NULL }, + { "onequarter", 750, NULL }, + { "F", 667, NULL }, + { "G", 722, NULL }, + { "H", 778, NULL }, + { "I", 389, NULL }, + { "J", 500, NULL }, + { "K", 667, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 250, NULL }, + { "M", 889, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 722, NULL }, + { "P", 611, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 667, NULL }, + { "Aacute", 667, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 667, NULL }, + { "W", 889, NULL }, + { "X", 667, NULL }, + { "question", 500, NULL }, + { "equal", 570, NULL }, + { "Y", 611, NULL }, + { "Z", 611, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 556, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 500, NULL }, + { "l", 278, NULL }, + { "m", 778, NULL }, + { "n", 556, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 266, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 556, NULL }, + { "r", 389, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 944, NULL }, + { "t", 278, NULL }, + { "divide", 570, NULL }, + { "u", 556, NULL }, + { "Ccaron", 667, NULL }, + { "v", 444, NULL }, + { "w", 667, NULL }, + { "x", 500, NULL }, + { "y", 444, NULL }, + { "z", 389, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 389, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 555, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 576, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 494, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 667, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 1000, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 556, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 667, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 944, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 500, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 278, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 389, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 667, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 667, NULL }, + { "copyright", 747, NULL }, + { "Egrave", 667, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 667, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 389, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 556, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 611, NULL }, + { "umacron", 556, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 667, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 722, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 556, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 556, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 444, NULL }, + { "tilde", 333, NULL }, + { "at", 832, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 570, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 667, NULL }, + { "partialdiff", 494, NULL }, + { "uacute", 556, NULL }, + { "braceleft", 348, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 389, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 667, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 747, NULL }, + { "radical", 549, NULL }, + { "Aring", 667, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 500, NULL }, + { "dcaron", 608, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 389, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 366, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 570, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 556, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 389, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 570, NULL }, + { "uring", 556, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 611, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 500, NULL }, + { "ncaron", 556, NULL }, + { "florin", 500, NULL }, + { "yacute", 444, NULL }, + { "Rcommaaccent", 667, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 667, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 389, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 667, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 300, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 389, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 667, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 348, NULL }, + { "quotedblright", 500, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 606, NULL }, + { "zdotaccent", 389, NULL }, + { "Atilde", 667, NULL }, + { "breve", 333, NULL }, + { "bar", 220, NULL }, + { "fraction", 167, NULL }, + { "less", 570, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 389, NULL }, + { "period", 250, NULL }, + { "Rcaron", 667, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 570, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 220, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 667, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth timesItalicWidthsTab[] = { + { "Ntilde", 667, NULL }, + { "rcaron", 389, NULL }, + { "kcommaaccent", 444, NULL }, + { "Ncommaaccent", 667, NULL }, + { "Zacute", 556, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 675, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 541, NULL }, + { "colon", 333, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 500, NULL }, + { "Aogonek", 611, NULL }, + { "ncommaaccent", 500, NULL }, + { "minus", 675, NULL }, + { "Iogonek", 333, NULL }, + { "zacute", 389, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 500, NULL }, + { "emdash", 889, NULL }, + { "Agrave", 611, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 300, NULL }, + { "A", 611, NULL }, + { "B", 611, NULL }, + { "C", 667, NULL }, + { "aogonek", 500, NULL }, + { "D", 722, NULL }, + { "E", 611, NULL }, + { "onequarter", 750, NULL }, + { "F", 611, NULL }, + { "G", 722, NULL }, + { "H", 722, NULL }, + { "I", 333, NULL }, + { "J", 444, NULL }, + { "K", 667, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 556, NULL }, + { "periodcentered", 250, NULL }, + { "M", 833, NULL }, + { "N", 667, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 556, NULL }, + { "O", 722, NULL }, + { "P", 611, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 611, NULL }, + { "Aacute", 611, NULL }, + { "caron", 333, NULL }, + { "S", 500, NULL }, + { "T", 556, NULL }, + { "U", 722, NULL }, + { "agrave", 500, NULL }, + { "V", 611, NULL }, + { "W", 833, NULL }, + { "X", 611, NULL }, + { "question", 500, NULL }, + { "equal", 675, NULL }, + { "Y", 556, NULL }, + { "Z", 556, NULL }, + { "four", 500, NULL }, + { "a", 500, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 278, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 500, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 444, NULL }, + { "l", 278, NULL }, + { "m", 722, NULL }, + { "n", 500, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 276, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 500, NULL }, + { "r", 389, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 500, NULL }, + { "s", 389, NULL }, + { "OE", 944, NULL }, + { "t", 278, NULL }, + { "divide", 675, NULL }, + { "u", 500, NULL }, + { "Ccaron", 667, NULL }, + { "v", 444, NULL }, + { "w", 667, NULL }, + { "x", 444, NULL }, + { "y", 444, NULL }, + { "z", 389, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 333, NULL }, + { "Nacute", 667, NULL }, + { "quotedbl", 420, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 500, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 500, NULL }, + { "Lslash", 556, NULL }, + { "semicolon", 333, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 611, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 980, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 500, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 611, NULL }, + { "ellipsis", 889, NULL }, + { "scaron", 389, NULL }, + { "AE", 889, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 556, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 214, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 389, NULL }, + { "endash", 500, NULL }, + { "oe", 667, NULL }, + { "Abreve", 611, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 611, NULL }, + { "copyright", 760, NULL }, + { "Egrave", 611, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 611, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 333, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 500, NULL }, + { "bracketleft", 389, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 556, NULL }, + { "umacron", 500, NULL }, + { "abreve", 500, NULL }, + { "Eacute", 611, NULL }, + { "adieresis", 500, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 667, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 500, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 500, NULL }, + { "Zcaron", 556, NULL }, + { "Scommaaccent", 500, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 444, NULL }, + { "tilde", 333, NULL }, + { "at", 920, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 675, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 500, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 611, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 500, NULL }, + { "braceleft", 400, NULL }, + { "Thorn", 611, NULL }, + { "zcaron", 389, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 389, NULL }, + { "Tcaron", 556, NULL }, + { "Eogonek", 611, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 760, NULL }, + { "radical", 453, NULL }, + { "Aring", 611, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 523, NULL }, + { "dcaron", 544, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 333, NULL }, + { "Lacute", 556, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 556, NULL }, + { "tcaron", 300, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 422, NULL }, + { "aring", 500, NULL }, + { "grave", 333, NULL }, + { "uogonek", 500, NULL }, + { "bracketright", 389, NULL }, + { "Iacute", 333, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 667, NULL }, + { "plus", 675, NULL }, + { "uring", 500, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 556, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 556, NULL }, + { "ncaron", 500, NULL }, + { "florin", 500, NULL }, + { "yacute", 444, NULL }, + { "Rcommaaccent", 611, NULL }, + { "fi", 500, NULL }, + { "fl", 500, NULL }, + { "Acircumflex", 611, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 333, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 611, NULL }, + { "seven", 500, NULL }, + { "Sacute", 500, NULL }, + { "ordmasculine", 310, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 333, NULL }, + { "rcommaaccent", 389, NULL }, + { "Zdotaccent", 556, NULL }, + { "acircumflex", 500, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 611, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 400, NULL }, + { "quotedblright", 556, NULL }, + { "amacron", 500, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 675, NULL }, + { "zdotaccent", 389, NULL }, + { "Atilde", 611, NULL }, + { "breve", 333, NULL }, + { "bar", 275, NULL }, + { "fraction", 167, NULL }, + { "less", 675, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 611, NULL }, + { "Kcommaaccent", 667, NULL }, + { "greater", 675, NULL }, + { "atilde", 500, NULL }, + { "brokenbar", 275, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 611, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth timesRomanWidthsTab[] = { + { "Ntilde", 722, NULL }, + { "rcaron", 333, NULL }, + { "kcommaaccent", 500, NULL }, + { "Ncommaaccent", 722, NULL }, + { "Zacute", 611, NULL }, + { "comma", 250, NULL }, + { "cedilla", 333, NULL }, + { "plusminus", 564, NULL }, + { "circumflex", 333, NULL }, + { "dotaccent", 333, NULL }, + { "edotaccent", 444, NULL }, + { "asciitilde", 541, NULL }, + { "colon", 278, NULL }, + { "onehalf", 750, NULL }, + { "dollar", 500, NULL }, + { "Lcaron", 611, NULL }, + { "ntilde", 500, NULL }, + { "Aogonek", 722, NULL }, + { "ncommaaccent", 500, NULL }, + { "minus", 564, NULL }, + { "Iogonek", 333, NULL }, + { "zacute", 444, NULL }, + { "yen", 500, NULL }, + { "space", 250, NULL }, + { "Omacron", 722, NULL }, + { "questiondown", 444, NULL }, + { "emdash", 1000, NULL }, + { "Agrave", 722, NULL }, + { "three", 500, NULL }, + { "numbersign", 500, NULL }, + { "lcaron", 344, NULL }, + { "A", 722, NULL }, + { "B", 667, NULL }, + { "C", 667, NULL }, + { "aogonek", 444, NULL }, + { "D", 722, NULL }, + { "E", 611, NULL }, + { "onequarter", 750, NULL }, + { "F", 556, NULL }, + { "G", 722, NULL }, + { "H", 722, NULL }, + { "I", 333, NULL }, + { "J", 389, NULL }, + { "K", 722, NULL }, + { "iogonek", 278, NULL }, + { "backslash", 278, NULL }, + { "L", 611, NULL }, + { "periodcentered", 250, NULL }, + { "M", 889, NULL }, + { "N", 722, NULL }, + { "omacron", 500, NULL }, + { "Tcommaaccent", 611, NULL }, + { "O", 722, NULL }, + { "P", 556, NULL }, + { "Q", 722, NULL }, + { "Uhungarumlaut", 722, NULL }, + { "R", 667, NULL }, + { "Aacute", 722, NULL }, + { "caron", 333, NULL }, + { "S", 556, NULL }, + { "T", 611, NULL }, + { "U", 722, NULL }, + { "agrave", 444, NULL }, + { "V", 722, NULL }, + { "W", 944, NULL }, + { "X", 722, NULL }, + { "question", 444, NULL }, + { "equal", 564, NULL }, + { "Y", 722, NULL }, + { "Z", 611, NULL }, + { "four", 500, NULL }, + { "a", 444, NULL }, + { "Gcommaaccent", 722, NULL }, + { "b", 500, NULL }, + { "c", 444, NULL }, + { "d", 500, NULL }, + { "e", 444, NULL }, + { "f", 333, NULL }, + { "g", 500, NULL }, + { "bullet", 350, NULL }, + { "h", 500, NULL }, + { "i", 278, NULL }, + { "Oslash", 722, NULL }, + { "dagger", 500, NULL }, + { "j", 278, NULL }, + { "k", 500, NULL }, + { "l", 278, NULL }, + { "m", 778, NULL }, + { "n", 500, NULL }, + { "tcommaaccent", 278, NULL }, + { "o", 500, NULL }, + { "ordfeminine", 276, NULL }, + { "ring", 333, NULL }, + { "p", 500, NULL }, + { "q", 500, NULL }, + { "uhungarumlaut", 500, NULL }, + { "r", 333, NULL }, + { "twosuperior", 300, NULL }, + { "aacute", 444, NULL }, + { "s", 389, NULL }, + { "OE", 889, NULL }, + { "t", 278, NULL }, + { "divide", 564, NULL }, + { "u", 500, NULL }, + { "Ccaron", 667, NULL }, + { "v", 500, NULL }, + { "w", 722, NULL }, + { "x", 500, NULL }, + { "y", 500, NULL }, + { "z", 444, NULL }, + { "Gbreve", 722, NULL }, + { "commaaccent", 250, NULL }, + { "hungarumlaut", 333, NULL }, + { "Idotaccent", 333, NULL }, + { "Nacute", 722, NULL }, + { "quotedbl", 408, NULL }, + { "gcommaaccent", 500, NULL }, + { "mu", 500, NULL }, + { "greaterequal", 549, NULL }, + { "Scaron", 556, NULL }, + { "Lslash", 611, NULL }, + { "semicolon", 278, NULL }, + { "oslash", 500, NULL }, + { "lessequal", 549, NULL }, + { "lozenge", 471, NULL }, + { "parenright", 333, NULL }, + { "ccaron", 444, NULL }, + { "Ecircumflex", 611, NULL }, + { "gbreve", 500, NULL }, + { "trademark", 980, NULL }, + { "daggerdbl", 500, NULL }, + { "nacute", 500, NULL }, + { "macron", 333, NULL }, + { "Otilde", 722, NULL }, + { "Emacron", 611, NULL }, + { "ellipsis", 1000, NULL }, + { "scaron", 389, NULL }, + { "AE", 889, NULL }, + { "Ucircumflex", 722, NULL }, + { "lslash", 278, NULL }, + { "quotedblleft", 444, NULL }, + { "guilsinglright", 333, NULL }, + { "hyphen", 333, NULL }, + { "quotesingle", 180, NULL }, + { "eight", 500, NULL }, + { "exclamdown", 333, NULL }, + { "endash", 500, NULL }, + { "oe", 722, NULL }, + { "Abreve", 722, NULL }, + { "Umacron", 722, NULL }, + { "ecircumflex", 444, NULL }, + { "Adieresis", 722, NULL }, + { "copyright", 760, NULL }, + { "Egrave", 611, NULL }, + { "slash", 278, NULL }, + { "Edieresis", 611, NULL }, + { "otilde", 500, NULL }, + { "Idieresis", 333, NULL }, + { "parenleft", 333, NULL }, + { "one", 500, NULL }, + { "emacron", 444, NULL }, + { "Odieresis", 722, NULL }, + { "ucircumflex", 500, NULL }, + { "bracketleft", 333, NULL }, + { "Ugrave", 722, NULL }, + { "quoteright", 333, NULL }, + { "Udieresis", 722, NULL }, + { "perthousand", 1000, NULL }, + { "Ydieresis", 722, NULL }, + { "umacron", 500, NULL }, + { "abreve", 444, NULL }, + { "Eacute", 611, NULL }, + { "adieresis", 444, NULL }, + { "egrave", 444, NULL }, + { "edieresis", 444, NULL }, + { "idieresis", 278, NULL }, + { "Eth", 722, NULL }, + { "ae", 667, NULL }, + { "asterisk", 500, NULL }, + { "odieresis", 500, NULL }, + { "Uacute", 722, NULL }, + { "ugrave", 500, NULL }, + { "nine", 500, NULL }, + { "five", 500, NULL }, + { "udieresis", 500, NULL }, + { "Zcaron", 611, NULL }, + { "Scommaaccent", 556, NULL }, + { "threequarters", 750, NULL }, + { "guillemotright", 500, NULL }, + { "Ccedilla", 667, NULL }, + { "ydieresis", 500, NULL }, + { "tilde", 333, NULL }, + { "at", 921, NULL }, + { "eacute", 444, NULL }, + { "underscore", 500, NULL }, + { "Euro", 500, NULL }, + { "Dcroat", 722, NULL }, + { "multiply", 564, NULL }, + { "zero", 500, NULL }, + { "eth", 500, NULL }, + { "Scedilla", 556, NULL }, + { "Ograve", 722, NULL }, + { "Racute", 667, NULL }, + { "partialdiff", 476, NULL }, + { "uacute", 500, NULL }, + { "braceleft", 480, NULL }, + { "Thorn", 556, NULL }, + { "zcaron", 444, NULL }, + { "scommaaccent", 389, NULL }, + { "ccedilla", 444, NULL }, + { "Dcaron", 722, NULL }, + { "dcroat", 500, NULL }, + { "Ocircumflex", 722, NULL }, + { "Oacute", 722, NULL }, + { "scedilla", 389, NULL }, + { "ogonek", 333, NULL }, + { "ograve", 500, NULL }, + { "racute", 333, NULL }, + { "Tcaron", 611, NULL }, + { "Eogonek", 611, NULL }, + { "thorn", 500, NULL }, + { "degree", 400, NULL }, + { "registered", 760, NULL }, + { "radical", 453, NULL }, + { "Aring", 722, NULL }, + { "percent", 833, NULL }, + { "six", 500, NULL }, + { "paragraph", 453, NULL }, + { "dcaron", 588, NULL }, + { "Uogonek", 722, NULL }, + { "two", 500, NULL }, + { "summation", 600, NULL }, + { "Igrave", 333, NULL }, + { "Lacute", 611, NULL }, + { "ocircumflex", 500, NULL }, + { "oacute", 500, NULL }, + { "Uring", 722, NULL }, + { "Lcommaaccent", 611, NULL }, + { "tcaron", 326, NULL }, + { "eogonek", 444, NULL }, + { "Delta", 612, NULL }, + { "Ohungarumlaut", 722, NULL }, + { "asciicircum", 469, NULL }, + { "aring", 444, NULL }, + { "grave", 333, NULL }, + { "uogonek", 500, NULL }, + { "bracketright", 333, NULL }, + { "Iacute", 333, NULL }, + { "ampersand", 778, NULL }, + { "igrave", 278, NULL }, + { "lacute", 278, NULL }, + { "Ncaron", 722, NULL }, + { "plus", 564, NULL }, + { "uring", 500, NULL }, + { "quotesinglbase", 333, NULL }, + { "lcommaaccent", 278, NULL }, + { "Yacute", 722, NULL }, + { "ohungarumlaut", 500, NULL }, + { "threesuperior", 300, NULL }, + { "acute", 333, NULL }, + { "section", 500, NULL }, + { "dieresis", 333, NULL }, + { "iacute", 278, NULL }, + { "quotedblbase", 444, NULL }, + { "ncaron", 500, NULL }, + { "florin", 500, NULL }, + { "yacute", 500, NULL }, + { "Rcommaaccent", 667, NULL }, + { "fi", 556, NULL }, + { "fl", 556, NULL }, + { "Acircumflex", 722, NULL }, + { "Cacute", 667, NULL }, + { "Icircumflex", 333, NULL }, + { "guillemotleft", 500, NULL }, + { "germandbls", 500, NULL }, + { "Amacron", 722, NULL }, + { "seven", 500, NULL }, + { "Sacute", 556, NULL }, + { "ordmasculine", 310, NULL }, + { "dotlessi", 278, NULL }, + { "sterling", 500, NULL }, + { "notequal", 549, NULL }, + { "Imacron", 333, NULL }, + { "rcommaaccent", 333, NULL }, + { "Zdotaccent", 611, NULL }, + { "acircumflex", 444, NULL }, + { "cacute", 444, NULL }, + { "Ecaron", 611, NULL }, + { "icircumflex", 278, NULL }, + { "braceright", 480, NULL }, + { "quotedblright", 444, NULL }, + { "amacron", 444, NULL }, + { "sacute", 389, NULL }, + { "imacron", 278, NULL }, + { "cent", 500, NULL }, + { "currency", 500, NULL }, + { "logicalnot", 564, NULL }, + { "zdotaccent", 444, NULL }, + { "Atilde", 722, NULL }, + { "breve", 333, NULL }, + { "bar", 200, NULL }, + { "fraction", 167, NULL }, + { "less", 564, NULL }, + { "ecaron", 444, NULL }, + { "guilsinglleft", 333, NULL }, + { "exclam", 333, NULL }, + { "period", 250, NULL }, + { "Rcaron", 667, NULL }, + { "Kcommaaccent", 722, NULL }, + { "greater", 564, NULL }, + { "atilde", 444, NULL }, + { "brokenbar", 200, NULL }, + { "quoteleft", 333, NULL }, + { "Edotaccent", 611, NULL }, + { "onesuperior", 300, NULL } +}; + +static BuiltinFontWidth zapfDingbatsWidthsTab[] = { + { "a81", 438, NULL }, + { "a82", 138, NULL }, + { "a83", 277, NULL }, + { "a84", 415, NULL }, + { "a85", 509, NULL }, + { "a86", 410, NULL }, + { "a87", 234, NULL }, + { "a88", 234, NULL }, + { "a89", 390, NULL }, + { "a140", 788, NULL }, + { "a141", 788, NULL }, + { "a142", 788, NULL }, + { "a143", 788, NULL }, + { "a144", 788, NULL }, + { "a145", 788, NULL }, + { "a146", 788, NULL }, + { "a147", 788, NULL }, + { "a148", 788, NULL }, + { "a149", 788, NULL }, + { "a90", 390, NULL }, + { "a91", 276, NULL }, + { "a92", 276, NULL }, + { "space", 278, NULL }, + { "a93", 317, NULL }, + { "a94", 317, NULL }, + { "a95", 334, NULL }, + { "a96", 334, NULL }, + { "a97", 392, NULL }, + { "a98", 392, NULL }, + { "a99", 668, NULL }, + { "a150", 788, NULL }, + { "a151", 788, NULL }, + { "a152", 788, NULL }, + { "a153", 788, NULL }, + { "a154", 788, NULL }, + { "a155", 788, NULL }, + { "a156", 788, NULL }, + { "a157", 788, NULL }, + { "a158", 788, NULL }, + { "a159", 788, NULL }, + { "a160", 894, NULL }, + { "a161", 838, NULL }, + { "a162", 924, NULL }, + { "a163", 1016, NULL }, + { "a164", 458, NULL }, + { "a165", 924, NULL }, + { "a166", 918, NULL }, + { "a167", 927, NULL }, + { "a168", 928, NULL }, + { "a169", 928, NULL }, + { "a170", 834, NULL }, + { "a171", 873, NULL }, + { "a172", 828, NULL }, + { "a173", 924, NULL }, + { "a174", 917, NULL }, + { "a175", 930, NULL }, + { "a176", 931, NULL }, + { "a177", 463, NULL }, + { "a178", 883, NULL }, + { "a179", 836, NULL }, + { "a180", 867, NULL }, + { "a181", 696, NULL }, + { "a182", 874, NULL }, + { "a183", 760, NULL }, + { "a184", 946, NULL }, + { "a185", 865, NULL }, + { "a186", 967, NULL }, + { "a187", 831, NULL }, + { "a188", 873, NULL }, + { "a189", 927, NULL }, + { "a1", 974, NULL }, + { "a2", 961, NULL }, + { "a3", 980, NULL }, + { "a4", 719, NULL }, + { "a5", 789, NULL }, + { "a6", 494, NULL }, + { "a7", 552, NULL }, + { "a8", 537, NULL }, + { "a9", 577, NULL }, + { "a190", 970, NULL }, + { "a191", 918, NULL }, + { "a192", 748, NULL }, + { "a193", 836, NULL }, + { "a194", 771, NULL }, + { "a195", 888, NULL }, + { "a196", 748, NULL }, + { "a197", 771, NULL }, + { "a198", 888, NULL }, + { "a199", 867, NULL }, + { "a10", 692, NULL }, + { "a11", 960, NULL }, + { "a12", 939, NULL }, + { "a13", 549, NULL }, + { "a14", 855, NULL }, + { "a15", 911, NULL }, + { "a16", 933, NULL }, + { "a17", 945, NULL }, + { "a18", 974, NULL }, + { "a19", 755, NULL }, + { "a20", 846, NULL }, + { "a21", 762, NULL }, + { "a22", 761, NULL }, + { "a23", 571, NULL }, + { "a24", 677, NULL }, + { "a25", 763, NULL }, + { "a26", 760, NULL }, + { "a27", 759, NULL }, + { "a28", 754, NULL }, + { "a29", 786, NULL }, + { "a30", 788, NULL }, + { "a31", 788, NULL }, + { "a32", 790, NULL }, + { "a33", 793, NULL }, + { "a34", 794, NULL }, + { "a35", 816, NULL }, + { "a36", 823, NULL }, + { "a37", 789, NULL }, + { "a38", 841, NULL }, + { "a39", 823, NULL }, + { "a40", 833, NULL }, + { "a41", 816, NULL }, + { "a42", 831, NULL }, + { "a43", 923, NULL }, + { "a44", 744, NULL }, + { "a45", 723, NULL }, + { "a46", 749, NULL }, + { "a47", 790, NULL }, + { "a48", 792, NULL }, + { "a49", 695, NULL }, + { "a100", 668, NULL }, + { "a101", 732, NULL }, + { "a102", 544, NULL }, + { "a103", 544, NULL }, + { "a104", 910, NULL }, + { "a105", 911, NULL }, + { "a106", 667, NULL }, + { "a107", 760, NULL }, + { "a108", 760, NULL }, + { "a109", 626, NULL }, + { "a50", 776, NULL }, + { "a51", 768, NULL }, + { "a52", 792, NULL }, + { "a53", 759, NULL }, + { "a54", 707, NULL }, + { "a55", 708, NULL }, + { "a56", 682, NULL }, + { "a57", 701, NULL }, + { "a58", 826, NULL }, + { "a59", 815, NULL }, + { "a110", 694, NULL }, + { "a111", 595, NULL }, + { "a112", 776, NULL }, + { "a117", 690, NULL }, + { "a118", 791, NULL }, + { "a119", 790, NULL }, + { "a60", 789, NULL }, + { "a61", 789, NULL }, + { "a62", 707, NULL }, + { "a63", 687, NULL }, + { "a64", 696, NULL }, + { "a65", 689, NULL }, + { "a66", 786, NULL }, + { "a67", 787, NULL }, + { "a68", 713, NULL }, + { "a69", 791, NULL }, + { "a200", 696, NULL }, + { "a201", 874, NULL }, + { "a120", 788, NULL }, + { "a121", 788, NULL }, + { "a202", 974, NULL }, + { "a122", 788, NULL }, + { "a203", 762, NULL }, + { "a123", 788, NULL }, + { "a204", 759, NULL }, + { "a124", 788, NULL }, + { "a205", 509, NULL }, + { "a125", 788, NULL }, + { "a206", 410, NULL }, + { "a126", 788, NULL }, + { "a127", 788, NULL }, + { "a128", 788, NULL }, + { "a129", 788, NULL }, + { "a70", 785, NULL }, + { "a71", 791, NULL }, + { "a72", 873, NULL }, + { "a73", 761, NULL }, + { "a74", 762, NULL }, + { "a75", 759, NULL }, + { "a76", 892, NULL }, + { "a77", 892, NULL }, + { "a78", 788, NULL }, + { "a79", 784, NULL }, + { "a130", 788, NULL }, + { "a131", 788, NULL }, + { "a132", 788, NULL }, + { "a133", 788, NULL }, + { "a134", 788, NULL }, + { "a135", 788, NULL }, + { "a136", 788, NULL }, + { "a137", 788, NULL }, + { "a138", 788, NULL }, + { "a139", 788, NULL } +}; + +BuiltinFont builtinFonts[] = { + { "Courier", standardEncoding, 629, -157, { -23, -250, 715, 805}, NULL }, + { "Courier-Bold", standardEncoding, 629, -157, {-113, -250, 749, 801}, NULL }, + { "Courier-BoldOblique", standardEncoding, 629, -157, { -57, -250, 869, 801}, NULL }, + { "Courier-Oblique", standardEncoding, 629, -157, { -27, -250, 849, 805}, NULL }, + { "Helvetica", standardEncoding, 718, -207, {-166, -225, 1000, 931}, NULL }, + { "Helvetica-Bold", standardEncoding, 718, -207, {-170, -228, 1003, 962}, NULL }, + { "Helvetica-BoldOblique", standardEncoding, 718, -207, {-174, -228, 1114, 962}, NULL }, + { "Helvetica-Oblique", standardEncoding, 718, -207, {-170, -225, 1116, 931}, NULL }, + { "Symbol", symbolEncoding, 1010, -293, {-180, -293, 1090, 1010}, NULL }, + { "Times-Bold", standardEncoding, 683, -217, {-168, -218, 1000, 935}, NULL }, + { "Times-BoldItalic", standardEncoding, 683, -217, {-200, -218, 996, 921}, NULL }, + { "Times-Italic", standardEncoding, 683, -217, {-169, -217, 1010, 883}, NULL }, + { "Times-Roman", standardEncoding, 683, -217, {-168, -218, 1000, 898}, NULL }, + { "ZapfDingbats", zapfDingbatsEncoding, 820, -143, { -1, -143, 981, 820}, NULL } +}; + +BuiltinFont *builtinFontSubst[] = { + &builtinFonts[0], + &builtinFonts[3], + &builtinFonts[1], + &builtinFonts[2], + &builtinFonts[4], + &builtinFonts[7], + &builtinFonts[5], + &builtinFonts[6], + &builtinFonts[12], + &builtinFonts[11], + &builtinFonts[9], + &builtinFonts[10] +}; + +void initBuiltinFontTables() { + builtinFonts[0].widths = new BuiltinFontWidths(courierWidthsTab, 315); + builtinFonts[1].widths = new BuiltinFontWidths(courierBoldWidthsTab, 315); + builtinFonts[2].widths = new BuiltinFontWidths(courierBoldObliqueWidthsTab, 315); + builtinFonts[3].widths = new BuiltinFontWidths(courierObliqueWidthsTab, 315); + builtinFonts[4].widths = new BuiltinFontWidths(helveticaWidthsTab, 315); + builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 316); + builtinFonts[6].widths = new BuiltinFontWidths(helveticaBoldObliqueWidthsTab, 315); + builtinFonts[7].widths = new BuiltinFontWidths(helveticaObliqueWidthsTab, 315); + builtinFonts[8].widths = new BuiltinFontWidths(symbolWidthsTab, 190); + builtinFonts[9].widths = new BuiltinFontWidths(timesBoldWidthsTab, 315); + builtinFonts[10].widths = new BuiltinFontWidths(timesBoldItalicWidthsTab, 315); + builtinFonts[11].widths = new BuiltinFontWidths(timesItalicWidthsTab, 315); + builtinFonts[12].widths = new BuiltinFontWidths(timesRomanWidthsTab, 315); + builtinFonts[13].widths = new BuiltinFontWidths(zapfDingbatsWidthsTab, 202); +} + +void freeBuiltinFontTables() { + int i; + + for (i = 0; i < 14; ++i) { + delete builtinFonts[i].widths; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h new file mode 100644 index 000000000..eb45549ef --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h @@ -0,0 +1,23 @@ +//======================================================================== +// +// BuiltinFontTables.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef BUILTINFONTTABLES_H +#define BUILTINFONTTABLES_H + +#include "BuiltinFont.h" + +#define nBuiltinFonts 14 +#define nBuiltinFontSubsts 12 + +extern BuiltinFont builtinFonts[nBuiltinFonts]; +extern BuiltinFont *builtinFontSubst[nBuiltinFontSubsts]; + +extern void initBuiltinFontTables(); +extern void freeBuiltinFontTables(); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc new file mode 100644 index 000000000..303cf0952 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc @@ -0,0 +1,408 @@ +//======================================================================== +// +// CMap.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "gfile.h" +#include "GString.h" +#include "Error.h" +#include "GlobalParams.h" +#include "PSTokenizer.h" +#include "CMap.h" + +//------------------------------------------------------------------------ + +struct CMapVectorEntry { + GBool isVector; + union { + CMapVectorEntry *vector; + CID cid; + }; +}; + +//------------------------------------------------------------------------ + +static int getCharFromFile(void *data) { + return fgetc((FILE *)data); +} + +//------------------------------------------------------------------------ + +CMap *CMap::parse(CMapCache *cache, GString *collectionA, + GString *cMapNameA) { + FILE *f; + CMap *cmap; + PSTokenizer *pst; + char tok1[256], tok2[256], tok3[256]; + int n1, n2, n3; + Guint start, end, code; + + if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) { + + // Check for an identity CMap. + if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) { + return new CMap(collectionA->copy(), cMapNameA->copy(), 0); + } + if (!cMapNameA->cmp("Identity-V")) { + return new CMap(collectionA->copy(), cMapNameA->copy(), 1); + } + + error(-1, "Couldn't find '%s' CMap file for '%s' collection", + cMapNameA->getCString(), collectionA->getCString()); + return NULL; + } + + cmap = new CMap(collectionA->copy(), cMapNameA->copy()); + + pst = new PSTokenizer(&getCharFromFile, f); + pst->getToken(tok1, sizeof(tok1), &n1); + while (pst->getToken(tok2, sizeof(tok2), &n2)) { + if (!strcmp(tok2, "usecmap")) { + if (tok1[0] == '/') { + cmap->useCMap(cache, tok1 + 1); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok1, "/WMode")) { + cmap->wMode = atoi(tok2); + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincodespacerange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcodespacerange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcodespacerange")) { + error(-1, "Illegal entry in codespacerange block in CMap"); + break; + } + if (tok1[0] == '<' && tok2[0] == '<' && + n1 == n2 && n1 >= 4 && (n1 & 1) == 0) { + tok1[n1 - 1] = tok2[n1 - 1] = '\0'; + sscanf(tok1 + 1, "%x", &start); + sscanf(tok2 + 1, "%x", &end); + n1 = (n1 - 2) / 2; + cmap->addCodeSpace(cmap->vector, start, end, n1); + } + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincidchar")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcidchar")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcidchar")) { + error(-1, "Illegal entry in cidchar block in CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + n1 >= 4 && (n1 & 1) == 0)) { + error(-1, "Illegal entry in cidchar block in CMap"); + continue; + } + tok1[n1 - 1] = '\0'; + if (sscanf(tok1 + 1, "%x", &code) != 1) { + error(-1, "Illegal entry in cidchar block in CMap"); + continue; + } + n1 = (n1 - 2) / 2; + cmap->addCIDs(code, code, n1, (CID)atoi(tok2)); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "begincidrange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endcidrange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endcidrange") || + !pst->getToken(tok3, sizeof(tok3), &n3) || + !strcmp(tok3, "endcidrange")) { + error(-1, "Illegal entry in cidrange block in CMap"); + break; + } + if (tok1[0] == '<' && tok2[0] == '<' && + n1 == n2 && n1 >= 4 && (n1 & 1) == 0) { + tok1[n1 - 1] = tok2[n1 - 1] = '\0'; + sscanf(tok1 + 1, "%x", &start); + sscanf(tok2 + 1, "%x", &end); + n1 = (n1 - 2) / 2; + cmap->addCIDs(start, end, n1, (CID)atoi(tok3)); + } + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else { + strcpy(tok1, tok2); + } + } + delete pst; + + fclose(f); + + return cmap; +} + +CMap::CMap(GString *collectionA, GString *cMapNameA) { + int i; + + collection = collectionA; + cMapName = cMapNameA; + wMode = 0; + vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); + for (i = 0; i < 256; ++i) { + vector[i].isVector = gFalse; + vector[i].cid = 0; + } + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CMap::CMap(GString *collectionA, GString *cMapNameA, int wModeA) { + collection = collectionA; + cMapName = cMapNameA; + wMode = wModeA; + vector = NULL; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +void CMap::useCMap(CMapCache *cache, char *useName) { + GString *useNameStr; + CMap *subCMap; + + useNameStr = new GString(useName); + subCMap = cache->getCMap(collection, useNameStr); + delete useNameStr; + if (!subCMap) { + return; + } + copyVector(vector, subCMap->vector); + subCMap->decRefCnt(); +} + +void CMap::copyVector(CMapVectorEntry *dest, CMapVectorEntry *src) { + int i, j; + + for (i = 0; i < 256; ++i) { + if (src[i].isVector) { + if (!dest[i].isVector) { + dest[i].isVector = gTrue; + dest[i].vector = + (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); + for (j = 0; j < 256; ++j) { + dest[i].vector[j].isVector = gFalse; + dest[i].vector[j].cid = 0; + } + } + copyVector(dest[i].vector, src[i].vector); + } else { + if (dest[i].isVector) { + error(-1, "Collision in usecmap"); + } else { + dest[i].cid = src[i].cid; + } + } + } +} + +void CMap::addCodeSpace(CMapVectorEntry *vec, Guint start, Guint end, + Guint nBytes) { + Guint start2, end2; + int startByte, endByte, i, j; + + if (nBytes > 1) { + startByte = (start >> (8 * (nBytes - 1))) & 0xff; + endByte = (end >> (8 * (nBytes - 1))) & 0xff; + start2 = start & ((1 << (8 * (nBytes - 1))) - 1); + end2 = end & ((1 << (8 * (nBytes - 1))) - 1); + for (i = startByte; i <= endByte; ++i) { + if (!vec[i].isVector) { + vec[i].isVector = gTrue; + vec[i].vector = + (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); + for (j = 0; j < 256; ++j) { + vec[i].vector[j].isVector = gFalse; + vec[i].vector[j].cid = 0; + } + } + addCodeSpace(vec[i].vector, start2, end2, nBytes - 1); + } + } +} + +void CMap::addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID) { + CMapVectorEntry *vec; + CID cid; + int byte; + Guint i; + + vec = vector; + for (i = nBytes - 1; i >= 1; --i) { + byte = (start >> (8 * i)) & 0xff; + if (!vec[byte].isVector) { + error(-1, "Invalid CID (%0*x - %0*x) in CMap", + 2*nBytes, start, 2*nBytes, end); + return; + } + vec = vec[byte].vector; + } + cid = firstCID; + for (byte = (int)(start & 0xff); byte <= (int)(end & 0xff); ++byte) { + if (vec[byte].isVector) { + error(-1, "Invalid CID (%0*x - %0*x) in CMap", + 2*nBytes, start, 2*nBytes, end); + } else { + vec[byte].cid = cid; + } + ++cid; + } +} + +CMap::~CMap() { + delete collection; + delete cMapName; + if (vector) { + freeCMapVector(vector); + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +void CMap::freeCMapVector(CMapVectorEntry *vec) { + int i; + + for (i = 0; i < 256; ++i) { + if (vec[i].isVector) { + freeCMapVector(vec[i].vector); + } + } + gfree(vec); +} + +void CMap::incRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + ++refCnt; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +void CMap::decRefCnt() { + GBool done; + +#if MULTITHREADED + gLockMutex(&mutex); +#endif + done = --refCnt == 0; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + if (done) { + delete this; + } +} + +GBool CMap::match(GString *collectionA, GString *cMapNameA) { + return !collection->cmp(collectionA) && !cMapName->cmp(cMapNameA); +} + +CID CMap::getCID(char *s, int len, int *nUsed) { + CMapVectorEntry *vec; + int n, i; + + if (!(vec = vector)) { + // identity CMap + *nUsed = 2; + if (len < 2) { + return 0; + } + return ((s[0] & 0xff) << 8) + (s[1] & 0xff); + } + n = 0; + while (1) { + if (n >= len) { + *nUsed = n; + return 0; + } + i = s[n++] & 0xff; + if (!vec[i].isVector) { + *nUsed = n; + return vec[i].cid; + } + vec = vec[i].vector; + } +} + +//------------------------------------------------------------------------ + +CMapCache::CMapCache() { + int i; + + for (i = 0; i < cMapCacheSize; ++i) { + cache[i] = NULL; + } +} + +CMapCache::~CMapCache() { + int i; + + for (i = 0; i < cMapCacheSize; ++i) { + if (cache[i]) { + cache[i]->decRefCnt(); + } + } +} + +CMap *CMapCache::getCMap(GString *collection, GString *cMapName) { + CMap *cmap; + int i, j; + + if (cache[0] && cache[0]->match(collection, cMapName)) { + cache[0]->incRefCnt(); + return cache[0]; + } + for (i = 1; i < cMapCacheSize; ++i) { + if (cache[i] && cache[i]->match(collection, cMapName)) { + cmap = cache[i]; + for (j = i; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = cmap; + cmap->incRefCnt(); + return cmap; + } + } + if ((cmap = CMap::parse(this, collection, cMapName))) { + if (cache[cMapCacheSize - 1]) { + cache[cMapCacheSize - 1]->decRefCnt(); + } + for (j = cMapCacheSize - 1; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = cmap; + cmap->incRefCnt(); + return cmap; + } + return NULL; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h new file mode 100644 index 000000000..c321a57ab --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h @@ -0,0 +1,102 @@ +//======================================================================== +// +// CMap.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef CMAP_H +#define CMAP_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "GMutex.h" +#endif + +class GString; +struct CMapVectorEntry; +class CMapCache; + +//------------------------------------------------------------------------ + +class CMap { +public: + + // Create the CMap specified by and . Sets + // the initial reference count to 1. Returns NULL on failure. + static CMap *parse(CMapCache *cache, GString *collectionA, + GString *cMapNameA); + + ~CMap(); + + void incRefCnt(); + void decRefCnt(); + + // Return collection name (-). + GString *getCollection() { return collection; } + + // Return true if this CMap matches the specified , and + // . + GBool match(GString *collectionA, GString *cMapNameA); + + // Return the CID corresponding to the character code starting at + // , which contains bytes. Sets * to the number of + // bytes used by the char code. + CID getCID(char *s, int len, int *nUsed); + + // Return the writing mode (0=horizontal, 1=vertical). + int getWMode() { return wMode; } + +private: + + CMap(GString *collectionA, GString *cMapNameA); + CMap(GString *collectionA, GString *cMapNameA, int wModeA); + void useCMap(CMapCache *cache, char *useName); + void copyVector(CMapVectorEntry *dest, CMapVectorEntry *src); + void addCodeSpace(CMapVectorEntry *vec, Guint start, Guint end, + Guint nBytes); + void addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID); + void freeCMapVector(CMapVectorEntry *vec); + + GString *collection; + GString *cMapName; + int wMode; // writing mode (0=horizontal, 1=vertical) + CMapVectorEntry *vector; // vector for first byte (NULL for + // identity CMap) + int refCnt; +#if MULTITHREADED + GMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ + +#define cMapCacheSize 4 + +class CMapCache { +public: + + CMapCache(); + ~CMapCache(); + + // Get the CMap for the specified character collection. + // Increments its reference count; there will be one reference for + // the cache plus one for the caller of this function. Returns NULL + // on failure. + CMap *getCMap(GString *collection, GString *cMapName); + +private: + + CMap *cache[cMapCacheSize]; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc new file mode 100644 index 000000000..4b89b3132 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc @@ -0,0 +1,374 @@ +//======================================================================== +// +// Catalog.cc +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "Object.h" +#include "XRef.h" +#include "Array.h" +#include "Dict.h" +#include "Page.h" +#include "Error.h" +#include "Link.h" +#include "Catalog.h" + +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +Catalog::Catalog(XRef *xrefA) { + Object catDict, pagesDict, pagesDictRef; + Object obj, obj2; + char *alreadyRead; + int numPages0; + int i; + + ok = gTrue; + xref = xrefA; + pages = NULL; + pageRefs = NULL; + numPages = pagesSize = 0; + baseURI = NULL; + + xref->getCatalog(&catDict); + if (!catDict.isDict()) { + error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); + goto err1; + } + + // read page tree + catDict.dictLookup("Pages", &pagesDict); + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + if (!pagesDict.isDict()) { + error(-1, "Top-level pages object is wrong type (%s)", + pagesDict.getTypeName()); + goto err2; + } + pagesDict.dictLookup("Count", &obj); + // some PDF files actually use real numbers here ("/Count 9.0") + if (!obj.isNum()) { + error(-1, "Page count in top-level pages object is wrong type (%s)", + obj.getTypeName()); + goto err3; + } + pagesSize = numPages0 = (int)obj.getNum(); + obj.free(); + pages = (Page **)gmallocn(pagesSize, sizeof(Page *)); + pageRefs = (Ref *)gmallocn(pagesSize, sizeof(Ref)); + for (i = 0; i < pagesSize; ++i) { + pages[i] = NULL; + pageRefs[i].num = -1; + pageRefs[i].gen = -1; + } + alreadyRead = (char *)gmalloc(xref->getNumObjects()); + memset(alreadyRead, 0, xref->getNumObjects()); + if (catDict.dictLookupNF("Pages", &pagesDictRef)->isRef() && + pagesDictRef.getRefNum() >= 0 && + pagesDictRef.getRefNum() < xref->getNumObjects()) { + alreadyRead[pagesDictRef.getRefNum()] = 1; + } + pagesDictRef.free(); + numPages = readPageTree(pagesDict.getDict(), NULL, 0, alreadyRead); + gfree(alreadyRead); + if (numPages != numPages0) { + error(-1, "Page count in top-level pages object is incorrect"); + } + pagesDict.free(); + + // read named destination dictionary + catDict.dictLookup("Dests", &dests); + + // read root of named destination tree + if (catDict.dictLookup("Names", &obj)->isDict()) + obj.dictLookup("Dests", &nameTree); + else + nameTree.initNull(); + obj.free(); + + // read base URI + if (catDict.dictLookup("URI", &obj)->isDict()) { + if (obj.dictLookup("Base", &obj2)->isString()) { + baseURI = obj2.getString()->copy(); + } + obj2.free(); + } + obj.free(); + + // get the metadata stream + catDict.dictLookup("Metadata", &metadata); + + // get the structure tree root + catDict.dictLookup("StructTreeRoot", &structTreeRoot); + + // get the outline dictionary + catDict.dictLookup("Outlines", &outline); + + // get the AcroForm dictionary + catDict.dictLookup("AcroForm", &acroForm); + + catDict.free(); + return; + + err3: + obj.free(); + err2: + pagesDict.free(); + err1: + catDict.free(); + dests.initNull(); + nameTree.initNull(); + ok = gFalse; +} + +Catalog::~Catalog() { + int i; + + if (pages) { + for (i = 0; i < pagesSize; ++i) { + if (pages[i]) { + delete pages[i]; + } + } + gfree(pages); + gfree(pageRefs); + } + dests.free(); + nameTree.free(); + if (baseURI) { + delete baseURI; + } + metadata.free(); + structTreeRoot.free(); + outline.free(); + acroForm.free(); +} + +GString *Catalog::readMetadata() { + GString *s; + Dict *dict; + Object obj; + int c; + + if (!metadata.isStream()) { + return NULL; + } + dict = metadata.streamGetDict(); + if (!dict->lookup("Subtype", &obj)->isName("XML")) { + error(-1, "Unknown Metadata type: '%s'", + obj.isName() ? obj.getName() : "???"); + } + obj.free(); + s = new GString(); + metadata.streamReset(); + while ((c = metadata.streamGetChar()) != EOF) { + s->append(c); + } + metadata.streamClose(); + return s; +} + +int Catalog::readPageTree(Dict *pagesDict, PageAttrs *attrs, int start, + char *alreadyRead) { + Object kids; + Object kid; + Object kidRef; + PageAttrs *attrs1, *attrs2; + Page *page; + int i, j; + + attrs1 = new PageAttrs(attrs, pagesDict); + pagesDict->lookup("Kids", &kids); + if (!kids.isArray()) { + error(-1, "Kids object (page %d) is wrong type (%s)", + start+1, kids.getTypeName()); + return start; + } + for (i = 0; i < kids.arrayGetLength(); ++i) { + kids.arrayGetNF(i, &kidRef); + if (kidRef.isRef() && + kidRef.getRefNum() >= 0 && + kidRef.getRefNum() < xref->getNumObjects()) { + if (alreadyRead[kidRef.getRefNum()]) { + error(-1, "Loop in Pages tree"); + kidRef.free(); + continue; + } + alreadyRead[kidRef.getRefNum()] = 1; + } + kids.arrayGet(i, &kid); + if (kid.isDict("Page")) { + attrs2 = new PageAttrs(attrs1, kid.getDict()); + page = new Page(xref, start+1, kid.getDict(), attrs2); + if (!page->isOk()) { + ++start; + goto err3; + } + if (start >= pagesSize) { + pagesSize += 32; + pages = (Page **)greallocn(pages, pagesSize, sizeof(Page *)); + pageRefs = (Ref *)greallocn(pageRefs, pagesSize, sizeof(Ref)); + for (j = pagesSize - 32; j < pagesSize; ++j) { + pages[j] = NULL; + pageRefs[j].num = -1; + pageRefs[j].gen = -1; + } + } + pages[start] = page; + if (kidRef.isRef()) { + pageRefs[start].num = kidRef.getRefNum(); + pageRefs[start].gen = kidRef.getRefGen(); + } + ++start; + // This should really be isDict("Pages"), but I've seen at least one + // PDF file where the /Type entry is missing. + } else if (kid.isDict()) { + if ((start = readPageTree(kid.getDict(), attrs1, start, alreadyRead)) + < 0) + goto err2; + } else { + error(-1, "Kid object (page %d) is wrong type (%s)", + start+1, kid.getTypeName()); + } + kid.free(); + kidRef.free(); + } + delete attrs1; + kids.free(); + return start; + + err3: + delete page; + err2: + kid.free(); + err1: + kids.free(); + delete attrs1; + ok = gFalse; + return -1; +} + +int Catalog::findPage(int num, int gen) { + int i; + + for (i = 0; i < numPages; ++i) { + if (pageRefs[i].num == num && pageRefs[i].gen == gen) + return i + 1; + } + return 0; +} + +LinkDest *Catalog::findDest(GString *name) { + LinkDest *dest; + Object obj1, obj2; + GBool found; + + // try named destination dictionary then name tree + found = gFalse; + if (dests.isDict()) { + if (!dests.dictLookup(name->getCString(), &obj1)->isNull()) + found = gTrue; + else + obj1.free(); + } + if (!found && nameTree.isDict()) { + if (!findDestInTree(&nameTree, name, &obj1)->isNull()) + found = gTrue; + else + obj1.free(); + } + if (!found) + return NULL; + + // construct LinkDest + dest = NULL; + if (obj1.isArray()) { + dest = new LinkDest(obj1.getArray()); + } else if (obj1.isDict()) { + if (obj1.dictLookup("D", &obj2)->isArray()) + dest = new LinkDest(obj2.getArray()); + else + error(-1, "Bad named destination value"); + obj2.free(); + } else { + error(-1, "Bad named destination value"); + } + obj1.free(); + if (dest && !dest->isOk()) { + delete dest; + dest = NULL; + } + + return dest; +} + +Object *Catalog::findDestInTree(Object *tree, GString *name, Object *obj) { + Object names, name1; + Object kids, kid, limits, low, high; + GBool done, found; + int cmp, i; + + // leaf node + if (tree->dictLookup("Names", &names)->isArray()) { + done = found = gFalse; + for (i = 0; !done && i < names.arrayGetLength(); i += 2) { + if (names.arrayGet(i, &name1)->isString()) { + cmp = name->cmp(name1.getString()); + if (cmp == 0) { + names.arrayGet(i+1, obj); + found = gTrue; + done = gTrue; + } else if (cmp < 0) { + done = gTrue; + } + } + name1.free(); + } + names.free(); + if (!found) + obj->initNull(); + return obj; + } + names.free(); + + // root or intermediate node + done = gFalse; + if (tree->dictLookup("Kids", &kids)->isArray()) { + for (i = 0; !done && i < kids.arrayGetLength(); ++i) { + if (kids.arrayGet(i, &kid)->isDict()) { + if (kid.dictLookup("Limits", &limits)->isArray()) { + if (limits.arrayGet(0, &low)->isString() && + name->cmp(low.getString()) >= 0) { + if (limits.arrayGet(1, &high)->isString() && + name->cmp(high.getString()) <= 0) { + findDestInTree(&kid, name, obj); + done = gTrue; + } + high.free(); + } + low.free(); + } + limits.free(); + } + kid.free(); + } + } + kids.free(); + + // name was outside of ranges of all kids + if (!done) + obj->initNull(); + + return obj; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h new file mode 100644 index 000000000..6403194f9 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h @@ -0,0 +1,97 @@ +//======================================================================== +// +// Catalog.h +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef CATALOG_H +#define CATALOG_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +class XRef; +class Object; +class Page; +class PageAttrs; +struct Ref; +class LinkDest; + +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +class Catalog { +public: + + // Constructor. + Catalog(XRef *xrefA); + + // Destructor. + ~Catalog(); + + // Is catalog valid? + GBool isOk() { return ok; } + + // Get number of pages. + int getNumPages() { return numPages; } + + // Get a page. + Page *getPage(int i) { return pages[i-1]; } + + // Get the reference for a page object. + Ref *getPageRef(int i) { return &pageRefs[i-1]; } + + // Return base URI, or NULL if none. + GString *getBaseURI() { return baseURI; } + + // Return the contents of the metadata stream, or NULL if there is + // no metadata. + GString *readMetadata(); + + // Return the structure tree root object. + Object *getStructTreeRoot() { return &structTreeRoot; } + + // Find a page, given its object ID. Returns page number, or 0 if + // not found. + int findPage(int num, int gen); + + // Find a named destination. Returns the link destination, or + // NULL if is not a destination. + LinkDest *findDest(GString *name); + + Object *getDests() { return &dests; } + + Object *getNameTree() { return &nameTree; } + + Object *getOutline() { return &outline; } + + Object *getAcroForm() { return &acroForm; } + +private: + + XRef *xref; // the xref table for this PDF file + Page **pages; // array of pages + Ref *pageRefs; // object ID for each page + int numPages; // number of pages + int pagesSize; // size of pages array + Object dests; // named destination dictionary + Object nameTree; // name tree + GString *baseURI; // base URI for URI-type links + Object metadata; // metadata stream + Object structTreeRoot; // structure tree root dictionary + Object outline; // outline dictionary + Object acroForm; // AcroForm dictionary + GBool ok; // true if catalog is valid + + int readPageTree(Dict *pages, PageAttrs *attrs, int start, + char *alreadyRead); + Object *findDestInTree(Object *tree, GString *name, Object *obj); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc new file mode 100644 index 000000000..a428b0086 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc @@ -0,0 +1,553 @@ +//======================================================================== +// +// CharCodeToUnicode.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "gfile.h" +#include "GString.h" +#include "Error.h" +#include "GlobalParams.h" +#include "PSTokenizer.h" +#include "CharCodeToUnicode.h" + +//------------------------------------------------------------------------ + +#define maxUnicodeString 8 + +struct CharCodeToUnicodeString { + CharCode c; + Unicode u[maxUnicodeString]; + int len; +}; + +//------------------------------------------------------------------------ + +static int getCharFromString(void *data) { + char *p; + int c; + + p = *(char **)data; + if (*p) { + c = *p++; + *(char **)data = p; + } else { + c = EOF; + } + return c; +} + +static int getCharFromFile(void *data) { + return fgetc((FILE *)data); +} + +//------------------------------------------------------------------------ + +CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GString *fileName, + GString *collection) { + FILE *f; + Unicode *mapA; + CharCode size, mapLenA; + char buf[64]; + Unicode u; + CharCodeToUnicode *ctu; + + if (!(f = fopen(fileName->getCString(), "r"))) { + error(-1, "Couldn't open cidToUnicode file '%s'", + fileName->getCString()); + return NULL; + } + + size = 32768; + mapA = (Unicode *)gmallocn(size, sizeof(Unicode)); + mapLenA = 0; + + while (getLine(buf, sizeof(buf), f)) { + if (mapLenA == size) { + size *= 2; + mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode)); + } + if (sscanf(buf, "%x", &u) == 1) { + mapA[mapLenA] = u; + } else { + error(-1, "Bad line (%d) in cidToUnicode file '%s'", + (int)(mapLenA + 1), fileName->getCString()); + mapA[mapLenA] = 0; + } + ++mapLenA; + } + fclose(f); + + ctu = new CharCodeToUnicode(collection->copy(), mapA, mapLenA, gTrue, + NULL, 0, 0); + gfree(mapA); + return ctu; +} + +CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode( + GString *fileName) { + FILE *f; + Unicode *mapA; + CharCodeToUnicodeString *sMapA; + CharCode size, oldSize, len, sMapSizeA, sMapLenA; + char buf[256]; + char *tok; + Unicode u0; + Unicode uBuf[maxUnicodeString]; + CharCodeToUnicode *ctu; + int line, n, i; + + if (!(f = fopen(fileName->getCString(), "r"))) { + error(-1, "Couldn't open unicodeToUnicode file '%s'", + fileName->getCString()); + return NULL; + } + + size = 4096; + mapA = (Unicode *)gmallocn(size, sizeof(Unicode)); + memset(mapA, 0, size * sizeof(Unicode)); + len = 0; + sMapA = NULL; + sMapSizeA = sMapLenA = 0; + + line = 0; + while (getLine(buf, sizeof(buf), f)) { + ++line; + if (!(tok = strtok(buf, " \t\r\n")) || + sscanf(tok, "%x", &u0) != 1) { + error(-1, "Bad line (%d) in unicodeToUnicode file '%s'", + line, fileName->getCString()); + continue; + } + n = 0; + while (n < maxUnicodeString) { + if (!(tok = strtok(NULL, " \t\r\n"))) { + break; + } + if (sscanf(tok, "%x", &uBuf[n]) != 1) { + error(-1, "Bad line (%d) in unicodeToUnicode file '%s'", + line, fileName->getCString()); + break; + } + ++n; + } + if (n < 1) { + error(-1, "Bad line (%d) in unicodeToUnicode file '%s'", + line, fileName->getCString()); + continue; + } + if (u0 >= size) { + oldSize = size; + while (u0 >= size) { + size *= 2; + } + mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode)); + memset(mapA + oldSize, 0, (size - oldSize) * sizeof(Unicode)); + } + if (n == 1) { + mapA[u0] = uBuf[0]; + } else { + mapA[u0] = 0; + if (sMapLenA == sMapSizeA) { + sMapSizeA += 16; + sMapA = (CharCodeToUnicodeString *) + greallocn(sMapA, sMapSizeA, sizeof(CharCodeToUnicodeString)); + } + sMapA[sMapLenA].c = u0; + for (i = 0; i < n; ++i) { + sMapA[sMapLenA].u[i] = uBuf[i]; + } + sMapA[sMapLenA].len = n; + ++sMapLenA; + } + if (u0 >= len) { + len = u0 + 1; + } + } + fclose(f); + + ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue, + sMapA, sMapLenA, sMapSizeA); + gfree(mapA); + return ctu; +} + +CharCodeToUnicode *CharCodeToUnicode::make8BitToUnicode(Unicode *toUnicode) { + return new CharCodeToUnicode(NULL, toUnicode, 256, gTrue, NULL, 0, 0); +} + +CharCodeToUnicode *CharCodeToUnicode::parseCMap(GString *buf, int nBits) { + CharCodeToUnicode *ctu; + char *p; + + ctu = new CharCodeToUnicode(NULL); + p = buf->getCString(); + ctu->parseCMap1(&getCharFromString, &p, nBits); + return ctu; +} + +void CharCodeToUnicode::mergeCMap(GString *buf, int nBits) { + char *p; + + p = buf->getCString(); + parseCMap1(&getCharFromString, &p, nBits); +} + +void CharCodeToUnicode::parseCMap1(int (*getCharFunc)(void *), void *data, + int nBits) { + PSTokenizer *pst; + char tok1[256], tok2[256], tok3[256]; + int maxCode, n1, n2, n3; + CharCode i; + CharCode code1, code2; + GString *name; + FILE *f; + + maxCode = (nBits == 8) ? 0xff : (nBits == 16) ? 0xffff : 0xffffffff; + pst = new PSTokenizer(getCharFunc, data); + pst->getToken(tok1, sizeof(tok1), &n1); + while (pst->getToken(tok2, sizeof(tok2), &n2)) { + if (!strcmp(tok2, "usecmap")) { + if (tok1[0] == '/') { + name = new GString(tok1 + 1); + if ((f = globalParams->findToUnicodeFile(name))) { + parseCMap1(&getCharFromFile, f, nBits); + fclose(f); + } else { + error(-1, "Couldn't find ToUnicode CMap file for '%s'", + name->getCString()); + } + delete name; + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "beginbfchar")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endbfchar")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endbfchar")) { + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + tok2[0] == '<' && tok2[n2 - 1] == '>')) { + error(-1, "Illegal entry in bfchar block in ToUnicode CMap."); + continue; + } + tok1[n1 - 1] = tok2[n2 - 1] = '\0'; + if (sscanf(tok1 + 1, "%x", &code1) != 1) { + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); + continue; + } + if (code1 > maxCode) { + error(-1, "Invalid entry in bfchar block in ToUnicode CMap"); + } + addMapping(code1, tok2 + 1, n2 - 2, 0); + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "beginbfrange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endbfrange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endbfrange") || + !pst->getToken(tok3, sizeof(tok3), &n3) || + !strcmp(tok3, "endbfrange")) { + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); + break; + } + if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && + tok2[0] == '<' && tok2[n2 - 1] == '>')) { + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); + continue; + } + tok1[n1 - 1] = tok2[n2 - 1] = '\0'; + if (sscanf(tok1 + 1, "%x", &code1) != 1 || + sscanf(tok2 + 1, "%x", &code2) != 1) { + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); + continue; + } + if (code1 > maxCode || code2 > maxCode) { + error(-1, "Invalid entry in bfrange block in ToUnicode CMap"); + } + + if (!strcmp(tok3, "[")) { + i = 0; + while (pst->getToken(tok1, sizeof(tok1), &n1) && + code1 + i <= code2) { + if (!strcmp(tok1, "]")) { + break; + } + if (tok1[0] == '<' && tok1[n1 - 1] == '>') { + tok1[n1 - 1] = '\0'; + addMapping(code1 + i, tok1 + 1, n1 - 2, 0); + } else { + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); + } + ++i; + } + } else if (tok3[0] == '<' && tok3[n3 - 1] == '>') { + tok3[n3 - 1] = '\0'; + for (i = 0; code1 <= code2; ++code1, ++i) { + addMapping(code1, tok3 + 1, n3 - 2, i); + } + + } else { + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); + } + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else { + strcpy(tok1, tok2); + } + } + delete pst; +} + +void CharCodeToUnicode::addMapping(CharCode code, char *uStr, int n, + int offset) { + CharCode oldLen, i; + Unicode u; + char uHex[5]; + int j; + + if (code >= mapLen) { + oldLen = mapLen; + mapLen = (code + 256) & ~255; + Unicode *oldmap; + map = (Unicode *)greallocn(map, mapLen, sizeof(Unicode)); + if(!map) { + /* we sometimes get overflows for files trying to use 0xffffffff as charcode */ + map = oldmap; + return; + } + for (i = oldLen; i < mapLen; ++i) { + map[i] = 0; + } + } + if (n <= 4) { + if (sscanf(uStr, "%x", &u) != 1) { + error(-1, "Illegal entry in ToUnicode CMap"); + return; + } + map[code] = u + offset; + } else { + if (sMapLen >= sMapSize) { + sMapSize = sMapSize + 16; + sMap = (CharCodeToUnicodeString *) + greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); + } + map[code] = 0; + sMap[sMapLen].c = code; + sMap[sMapLen].len = n / 4; + for (j = 0; j < sMap[sMapLen].len && j < maxUnicodeString; ++j) { + strncpy(uHex, uStr + j*4, 4); + uHex[4] = '\0'; + if (sscanf(uHex, "%x", &sMap[sMapLen].u[j]) != 1) { + error(-1, "Illegal entry in ToUnicode CMap"); + } + } + sMap[sMapLen].u[sMap[sMapLen].len - 1] += offset; + ++sMapLen; + } +} + +CharCodeToUnicode::CharCodeToUnicode(GString *tagA) { + CharCode i; + + tag = tagA; + mapLen = 256; + map = (Unicode *)gmallocn(mapLen, sizeof(Unicode)); + for (i = 0; i < mapLen; ++i) { + map[i] = 0; + } + sMap = NULL; + sMapLen = sMapSize = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CharCodeToUnicode::CharCodeToUnicode(GString *tagA, Unicode *mapA, + CharCode mapLenA, GBool copyMap, + CharCodeToUnicodeString *sMapA, + int sMapLenA, int sMapSizeA) { + tag = tagA; + mapLen = mapLenA; + if (copyMap) { + map = (Unicode *)gmallocn(mapLen, sizeof(Unicode)); + memcpy(map, mapA, mapLen * sizeof(Unicode)); + } else { + map = mapA; + } + sMap = sMapA; + sMapLen = sMapLenA; + sMapSize = sMapSizeA; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CharCodeToUnicode::~CharCodeToUnicode() { + if (tag) { + delete tag; + } + gfree(map); + if (sMap) { + gfree(sMap); + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +void CharCodeToUnicode::incRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + ++refCnt; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +void CharCodeToUnicode::decRefCnt() { + GBool done; + +#if MULTITHREADED + gLockMutex(&mutex); +#endif + done = --refCnt == 0; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + if (done) { + delete this; + } +} + +GBool CharCodeToUnicode::match(GString *tagA) { + return tag && !tag->cmp(tagA); +} + +void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) { + int i, j; + + if (len == 1) { + map[c] = u[0]; + } else { + for (i = 0; i < sMapLen; ++i) { + if (sMap[i].c == c) { + break; + } + } + if (i == sMapLen) { + if (sMapLen == sMapSize) { + sMapSize += 8; + sMap = (CharCodeToUnicodeString *) + greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); + } + ++sMapLen; + } + map[c] = 0; + sMap[i].c = c; + sMap[i].len = len; + for (j = 0; j < len && j < maxUnicodeString; ++j) { + sMap[i].u[j] = u[j]; + } + } +} + +int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode *u, int size) { + int i, j; + + if (c >= mapLen) { + return 0; + } + if (map[c]) { + u[0] = map[c]; + return 1; + } + for (i = 0; i < sMapLen; ++i) { + if (sMap[i].c == c) { + for (j = 0; j < sMap[i].len && j < size; ++j) { + u[j] = sMap[i].u[j]; + } + return j; + } + } + return 0; +} + +//------------------------------------------------------------------------ + +CharCodeToUnicodeCache::CharCodeToUnicodeCache(int sizeA) { + int i; + + size = sizeA; + cache = (CharCodeToUnicode **)gmallocn(size, sizeof(CharCodeToUnicode *)); + for (i = 0; i < size; ++i) { + cache[i] = NULL; + } +} + +CharCodeToUnicodeCache::~CharCodeToUnicodeCache() { + int i; + + for (i = 0; i < size; ++i) { + if (cache[i]) { + cache[i]->decRefCnt(); + } + } + gfree(cache); +} + +CharCodeToUnicode *CharCodeToUnicodeCache::getCharCodeToUnicode(GString *tag) { + CharCodeToUnicode *ctu; + int i, j; + + if (cache[0] && cache[0]->match(tag)) { + cache[0]->incRefCnt(); + return cache[0]; + } + for (i = 1; i < size; ++i) { + if (cache[i] && cache[i]->match(tag)) { + ctu = cache[i]; + for (j = i; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = ctu; + ctu->incRefCnt(); + return ctu; + } + } + return NULL; +} + +void CharCodeToUnicodeCache::add(CharCodeToUnicode *ctu) { + int i; + + if (cache[size - 1]) { + cache[size - 1]->decRefCnt(); + } + for (i = size - 1; i >= 1; --i) { + cache[i] = cache[i - 1]; + } + cache[0] = ctu; + ctu->incRefCnt(); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h new file mode 100644 index 000000000..04852aea8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h @@ -0,0 +1,117 @@ +//======================================================================== +// +// CharCodeToUnicode.h +// +// Mapping from character codes to Unicode. +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef CHARCODETOUNICODE_H +#define CHARCODETOUNICODE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "CharTypes.h" + +#if MULTITHREADED +#include "GMutex.h" +#endif + +struct CharCodeToUnicodeString; + +//------------------------------------------------------------------------ + +class CharCodeToUnicode { +public: + + // Read the CID-to-Unicode mapping for from the file + // specified by . Sets the initial reference count to 1. + // Returns NULL on failure. + static CharCodeToUnicode *parseCIDToUnicode(GString *fileName, + GString *collection); + + // Create a Unicode-to-Unicode mapping from the file specified by + // . Sets the initial reference count to 1. Returns NULL + // on failure. + static CharCodeToUnicode *parseUnicodeToUnicode(GString *fileName); + + // Create the CharCode-to-Unicode mapping for an 8-bit font. + // is an array of 256 Unicode indexes. Sets the initial + // reference count to 1. + static CharCodeToUnicode *make8BitToUnicode(Unicode *toUnicode); + + // Parse a ToUnicode CMap for an 8- or 16-bit font. + static CharCodeToUnicode *parseCMap(GString *buf, int nBits); + + // Parse a ToUnicode CMap for an 8- or 16-bit font, merging it into + // . + void mergeCMap(GString *buf, int nBits); + + ~CharCodeToUnicode(); + + void incRefCnt(); + void decRefCnt(); + + // Return true if this mapping matches the specified . + GBool match(GString *tagA); + + // Set the mapping for . + void setMapping(CharCode c, Unicode *u, int len); + + // Map a CharCode to Unicode. + int mapToUnicode(CharCode c, Unicode *u, int size); + + // Return the mapping's length, i.e., one more than the max char + // code supported by the mapping. + CharCode getLength() { return mapLen; } + +private: + + void parseCMap1(int (*getCharFunc)(void *), void *data, int nBits); + void addMapping(CharCode code, char *uStr, int n, int offset); + CharCodeToUnicode(GString *tagA); + CharCodeToUnicode(GString *tagA, Unicode *mapA, + CharCode mapLenA, GBool copyMap, + CharCodeToUnicodeString *sMapA, + int sMapLenA, int sMapSizeA); + + GString *tag; + Unicode *map; + CharCode mapLen; + CharCodeToUnicodeString *sMap; + int sMapLen, sMapSize; + int refCnt; +#if MULTITHREADED + GMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ + +class CharCodeToUnicodeCache { +public: + + CharCodeToUnicodeCache(int sizeA); + ~CharCodeToUnicodeCache(); + + // Get the CharCodeToUnicode object for . Increments its + // reference count; there will be one reference for the cache plus + // one for the caller of this function. Returns NULL on failure. + CharCodeToUnicode *getCharCodeToUnicode(GString *tag); + + // Insert into the cache, in the most-recently-used position. + void add(CharCodeToUnicode *ctu); + +private: + + CharCodeToUnicode **cache; + int size; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h new file mode 100644 index 000000000..d0df630d0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h @@ -0,0 +1,24 @@ +//======================================================================== +// +// CharTypes.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef CHARTYPES_H +#define CHARTYPES_H + +// Unicode character. +typedef unsigned int Unicode; + +// Character ID for CID character collections. +typedef unsigned int CID; + +// This is large enough to hold any of the following: +// - 8-bit char code +// - 16-bit CID +// - Unicode +typedef unsigned int CharCode; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc new file mode 100644 index 000000000..b561aa569 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc @@ -0,0 +1,777 @@ +//======================================================================== +// +// Decrypt.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "Decrypt.h" + +static void rc4InitKey(Guchar *key, int keyLen, Guchar *state); +static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c); +static void aesKeyExpansion(DecryptAESState *s, + Guchar *objKey, int objKeyLen); +static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last); +static void md5(Guchar *msg, int msgLen, Guchar *digest); + +static Guchar passwordPad[32] = { + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, + 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, + 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, + 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a +}; + +//------------------------------------------------------------------------ +// Decrypt +//------------------------------------------------------------------------ + +GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength, + GString *ownerKey, GString *userKey, + int permissions, GString *fileID, + GString *ownerPassword, GString *userPassword, + Guchar *fileKey, GBool encryptMetadata, + GBool *ownerPasswordOk) { + Guchar test[32], test2[32]; + GString *userPassword2; + Guchar fState[256]; + Guchar tmpKey[16]; + Guchar fx, fy; + int len, i, j; + + // try using the supplied owner password to generate the user password + *ownerPasswordOk = gFalse; + if (ownerPassword) { + len = ownerPassword->getLength(); + if (len < 32) { + memcpy(test, ownerPassword->getCString(), len); + memcpy(test + len, passwordPad, 32 - len); + } else { + memcpy(test, ownerPassword->getCString(), 32); + } + md5(test, 32, test); + if (encRevision == 3) { + for (i = 0; i < 50; ++i) { + md5(test, 16, test); + } + } + if (encRevision == 2) { + rc4InitKey(test, keyLength, fState); + fx = fy = 0; + for (i = 0; i < 32; ++i) { + test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i)); + } + } else { + memcpy(test2, ownerKey->getCString(), 32); + for (i = 19; i >= 0; --i) { + for (j = 0; j < keyLength; ++j) { + tmpKey[j] = test[j] ^ i; + } + rc4InitKey(tmpKey, keyLength, fState); + fx = fy = 0; + for (j = 0; j < 32; ++j) { + test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]); + } + } + } + userPassword2 = new GString((char *)test2, 32); + if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey, + permissions, fileID, userPassword2, fileKey, + encryptMetadata)) { + *ownerPasswordOk = gTrue; + delete userPassword2; + return gTrue; + } + delete userPassword2; + } + + // try using the supplied user password + return makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey, + permissions, fileID, userPassword, fileKey, + encryptMetadata); +} + +GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength, + GString *ownerKey, GString *userKey, + int permissions, GString *fileID, + GString *userPassword, Guchar *fileKey, + GBool encryptMetadata) { + Guchar *buf; + Guchar test[32]; + Guchar fState[256]; + Guchar tmpKey[16]; + Guchar fx, fy; + int len, i, j; + GBool ok; + + // generate file key + buf = (Guchar *)gmalloc(72 + fileID->getLength()); + if (userPassword) { + len = userPassword->getLength(); + if (len < 32) { + memcpy(buf, userPassword->getCString(), len); + memcpy(buf + len, passwordPad, 32 - len); + } else { + memcpy(buf, userPassword->getCString(), 32); + } + } else { + memcpy(buf, passwordPad, 32); + } + memcpy(buf + 32, ownerKey->getCString(), 32); + buf[64] = permissions & 0xff; + buf[65] = (permissions >> 8) & 0xff; + buf[66] = (permissions >> 16) & 0xff; + buf[67] = (permissions >> 24) & 0xff; + memcpy(buf + 68, fileID->getCString(), fileID->getLength()); + len = 68 + fileID->getLength(); + if (!encryptMetadata) { + buf[len++] = 0xff; + buf[len++] = 0xff; + buf[len++] = 0xff; + buf[len++] = 0xff; + } + md5(buf, len, fileKey); + if (encRevision == 3) { + for (i = 0; i < 50; ++i) { + md5(fileKey, keyLength, fileKey); + } + } + + // test user password + if (encRevision == 2) { + rc4InitKey(fileKey, keyLength, fState); + fx = fy = 0; + for (i = 0; i < 32; ++i) { + test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i)); + } + ok = memcmp(test, passwordPad, 32) == 0; + } else if (encRevision == 3) { + memcpy(test, userKey->getCString(), 32); + for (i = 19; i >= 0; --i) { + for (j = 0; j < keyLength; ++j) { + tmpKey[j] = fileKey[j] ^ i; + } + rc4InitKey(tmpKey, keyLength, fState); + fx = fy = 0; + for (j = 0; j < 32; ++j) { + test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]); + } + } + memcpy(buf, passwordPad, 32); + memcpy(buf + 32, fileID->getCString(), fileID->getLength()); + md5(buf, 32 + fileID->getLength(), buf); + ok = memcmp(test, buf, 16) == 0; + } else { + ok = gFalse; + } + + gfree(buf); + return ok; +} + +//------------------------------------------------------------------------ +// DecryptStream +//------------------------------------------------------------------------ + +DecryptStream::DecryptStream(Stream *strA, Guchar *fileKey, + CryptAlgorithm algoA, int keyLength, + int objNum, int objGen): + FilterStream(strA) +{ + int n, i; + + algo = algoA; + + // construct object key + for (i = 0; i < keyLength; ++i) { + objKey[i] = fileKey[i]; + } + objKey[keyLength] = objNum & 0xff; + objKey[keyLength + 1] = (objNum >> 8) & 0xff; + objKey[keyLength + 2] = (objNum >> 16) & 0xff; + objKey[keyLength + 3] = objGen & 0xff; + objKey[keyLength + 4] = (objGen >> 8) & 0xff; + if (algo == cryptAES) { + objKey[keyLength + 5] = 0x73; // 's' + objKey[keyLength + 6] = 0x41; // 'A' + objKey[keyLength + 7] = 0x6c; // 'l' + objKey[keyLength + 8] = 0x54; // 'T' + n = keyLength + 9; + } else { + n = keyLength + 5; + } + md5(objKey, n, objKey); + if ((objKeyLength = keyLength + 5) > 16) { + objKeyLength = 16; + } +} + +DecryptStream::~DecryptStream() { + delete str; +} + +void DecryptStream::reset() { + int i; + + str->reset(); + switch (algo) { + case cryptRC4: + state.rc4.x = state.rc4.y = 0; + rc4InitKey(objKey, objKeyLength, state.rc4.state); + state.rc4.buf = EOF; + break; + case cryptAES: + aesKeyExpansion(&state.aes, objKey, objKeyLength); + for (i = 0; i < 16; ++i) { + state.aes.cbc[i] = str->getChar(); + } + state.aes.bufIdx = 16; + break; + } +} + +int DecryptStream::getChar() { + Guchar in[16]; + int c, i; + + c = EOF; // make gcc happy + switch (algo) { + case cryptRC4: + if (state.rc4.buf == EOF) { + c = str->getChar(); + if (c != EOF) { + state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x, + &state.rc4.y, (Guchar)c); + } + } + c = state.rc4.buf; + state.rc4.buf = EOF; + break; + case cryptAES: + if (state.aes.bufIdx == 16) { + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) == EOF) { + return EOF; + } + in[i] = (Guchar)c; + } + aesDecryptBlock(&state.aes, in, str->lookChar() == EOF); + } + if (state.aes.bufIdx == 16) { + c = EOF; + } else { + c = state.aes.buf[state.aes.bufIdx++]; + } + break; + } + return c; +} + +int DecryptStream::lookChar() { + Guchar in[16]; + int c, i; + + c = EOF; // make gcc happy + switch (algo) { + case cryptRC4: + if (state.rc4.buf == EOF) { + c = str->getChar(); + if (c != EOF) { + state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x, + &state.rc4.y, (Guchar)c); + } + } + c = state.rc4.buf; + break; + case cryptAES: + if (state.aes.bufIdx == 16) { + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) == EOF) { + return EOF; + } + in[i] = c; + } + aesDecryptBlock(&state.aes, in, str->lookChar() == EOF); + } + if (state.aes.bufIdx == 16) { + c = EOF; + } else { + c = state.aes.buf[state.aes.bufIdx]; + } + break; + } + return c; +} + +GBool DecryptStream::isBinary(GBool last) { + return str->isBinary(last); +} + +//------------------------------------------------------------------------ +// RC4-compatible decryption +//------------------------------------------------------------------------ + +static void rc4InitKey(Guchar *key, int keyLen, Guchar *state) { + Guchar index1, index2; + Guchar t; + int i; + + for (i = 0; i < 256; ++i) + state[i] = i; + index1 = index2 = 0; + for (i = 0; i < 256; ++i) { + index2 = (key[index1] + state[i] + index2) % 256; + t = state[i]; + state[i] = state[index2]; + state[index2] = t; + index1 = (index1 + 1) % keyLen; + } +} + +static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) { + Guchar x1, y1, tx, ty; + + x1 = *x = (*x + 1) % 256; + y1 = *y = (state[*x] + *y) % 256; + tx = state[x1]; + ty = state[y1]; + state[x1] = ty; + state[y1] = tx; + return c ^ state[(tx + ty) % 256]; +} + +//------------------------------------------------------------------------ +// AES decryption +//------------------------------------------------------------------------ + +static Guchar sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +static Guchar invSbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; + +static Guint rcon[11] = { + 0x00000000, // unused + 0x01000000, + 0x02000000, + 0x04000000, + 0x08000000, + 0x10000000, + 0x20000000, + 0x40000000, + 0x80000000, + 0x1b000000, + 0x36000000 +}; + +static inline Guint subWord(Guint x) { + return (sbox[x >> 24] << 24) + | (sbox[(x >> 16) & 0xff] << 16) + | (sbox[(x >> 8) & 0xff] << 8) + | sbox[x & 0xff]; +} + +static inline Guint rotWord(Guint x) { + return ((x << 8) & 0xffffffff) | (x >> 24); +} + +static inline void invSubBytes(Guchar *state) { + int i; + + for (i = 0; i < 16; ++i) { + state[i] = invSbox[state[i]]; + } +} + +static inline void invShiftRows(Guchar *state) { + Guchar t; + + t = state[7]; + state[7] = state[6]; + state[6] = state[5]; + state[5] = state[4]; + state[4] = t; + + t = state[8]; + state[8] = state[10]; + state[10] = t; + t = state[9]; + state[9] = state[11]; + state[11] = t; + + t = state[12]; + state[12] = state[13]; + state[13] = state[14]; + state[14] = state[15]; + state[15] = t; +} + +// {09} \cdot s +static inline Guchar mul09(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s ^ s8; +} + +// {0b} \cdot s +static inline Guchar mul0b(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s ^ s2 ^ s8; +} + +// {0d} \cdot s +static inline Guchar mul0d(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s ^ s4 ^ s8; +} + +// {0e} \cdot s +static inline Guchar mul0e(Guchar s) { + Guchar s2, s4, s8; + + s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); + s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); + return s2 ^ s4 ^ s8; +} + +static inline void invMixColumns(Guchar *state) { + int c; + Guchar s0, s1, s2, s3; + + for (c = 0; c < 4; ++c) { + s0 = state[c]; + s1 = state[4+c]; + s2 = state[8+c]; + s3 = state[12+c]; + state[c] = mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3); + state[4+c] = mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3); + state[8+c] = mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3); + state[12+c] = mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3); + } +} + +static inline void invMixColumnsW(Guint *w) { + int c; + Guchar s0, s1, s2, s3; + + for (c = 0; c < 4; ++c) { + s0 = w[c] >> 24; + s1 = w[c] >> 16; + s2 = w[c] >> 8; + s3 = w[c]; + w[c] = ((mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3)) << 24) + | ((mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3)) << 16) + | ((mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3)) << 8) + | (mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3)); + } +} + +static inline void addRoundKey(Guchar *state, Guint *w) { + int c; + + for (c = 0; c < 4; ++c) { + state[c] ^= w[c] >> 24; + state[4+c] ^= w[c] >> 16; + state[8+c] ^= w[c] >> 8; + state[12+c] ^= w[c]; + } +} + +static void aesKeyExpansion(DecryptAESState *s, + Guchar *objKey, int objKeyLen) { + Guint temp; + int i, round; + + //~ this assumes objKeyLen == 16 + + for (i = 0; i < 4; ++i) { + s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) + + (objKey[4*i+2] << 8) + objKey[4*i+3]; + } + for (i = 4; i < 44; ++i) { + temp = s->w[i-1]; + if (!(i & 3)) { + temp = subWord(rotWord(temp)) ^ rcon[i/4]; + } + s->w[i] = s->w[i-4] ^ temp; + } + for (round = 1; round <= 9; ++round) { + invMixColumnsW(&s->w[round * 4]); + } +} + +static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last) { + int c, round, n, i; + + // initial state + for (c = 0; c < 4; ++c) { + s->state[c] = in[4*c]; + s->state[4+c] = in[4*c+1]; + s->state[8+c] = in[4*c+2]; + s->state[12+c] = in[4*c+3]; + } + + // round 0 + addRoundKey(s->state, &s->w[10 * 4]); + + // rounds 1-9 + for (round = 9; round >= 1; --round) { + invSubBytes(s->state); + invShiftRows(s->state); + invMixColumns(s->state); + addRoundKey(s->state, &s->w[round * 4]); + } + + // round 10 + invSubBytes(s->state); + invShiftRows(s->state); + addRoundKey(s->state, &s->w[0]); + + // CBC + for (c = 0; c < 4; ++c) { + s->buf[4*c] = s->state[c] ^ s->cbc[4*c]; + s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1]; + s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2]; + s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3]; + } + + // save the input block for the next CBC + for (i = 0; i < 16; ++i) { + s->cbc[i] = in[i]; + } + + // remove padding + s->bufIdx = 0; + if (last) { + n = s->buf[15]; + if(!n || n>16) n=16; + for (i = 15; i >= n; --i) { + s->buf[i] = s->buf[i-n]; + } + s->bufIdx = n; + } +} + +//------------------------------------------------------------------------ +// MD5 message digest +//------------------------------------------------------------------------ + +// this works around a bug in older Sun compilers +static inline Gulong rotateLeft(Gulong x, int r) { + x &= 0xffffffff; + return ((x << r) | (x >> (32 - r))) & 0xffffffff; +} + +static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s); +} + +static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s); +} + +static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s); +} + +static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d, + Gulong Xk, Gulong s, Gulong Ti) { + return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s); +} + +static void md5(Guchar *msg, int msgLen, Guchar *digest) { + Gulong x[16]; + Gulong a, b, c, d, aa, bb, cc, dd; + int n64; + int i, j, k; + + // compute number of 64-byte blocks + // (length + pad byte (0x80) + 8 bytes for length) + n64 = (msgLen + 1 + 8 + 63) / 64; + + // initialize a, b, c, d + a = 0x67452301; + b = 0xefcdab89; + c = 0x98badcfe; + d = 0x10325476; + + // loop through blocks + k = 0; + for (i = 0; i < n64; ++i) { + + // grab a 64-byte block + for (j = 0; j < 16 && k < msgLen - 3; ++j, k += 4) + x[j] = (((((msg[k+3] << 8) + msg[k+2]) << 8) + msg[k+1]) << 8) + msg[k]; + if (i == n64 - 1) { + if (k == msgLen - 3) + x[j] = 0x80000000 + (((msg[k+2] << 8) + msg[k+1]) << 8) + msg[k]; + else if (k == msgLen - 2) + x[j] = 0x800000 + (msg[k+1] << 8) + msg[k]; + else if (k == msgLen - 1) + x[j] = 0x8000 + msg[k]; + else + x[j] = 0x80; + ++j; + while (j < 16) + x[j++] = 0; + x[14] = msgLen << 3; + } + + // save a, b, c, d + aa = a; + bb = b; + cc = c; + dd = d; + + // round 1 + a = md5Round1(a, b, c, d, x[0], 7, 0xd76aa478); + d = md5Round1(d, a, b, c, x[1], 12, 0xe8c7b756); + c = md5Round1(c, d, a, b, x[2], 17, 0x242070db); + b = md5Round1(b, c, d, a, x[3], 22, 0xc1bdceee); + a = md5Round1(a, b, c, d, x[4], 7, 0xf57c0faf); + d = md5Round1(d, a, b, c, x[5], 12, 0x4787c62a); + c = md5Round1(c, d, a, b, x[6], 17, 0xa8304613); + b = md5Round1(b, c, d, a, x[7], 22, 0xfd469501); + a = md5Round1(a, b, c, d, x[8], 7, 0x698098d8); + d = md5Round1(d, a, b, c, x[9], 12, 0x8b44f7af); + c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1); + b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be); + a = md5Round1(a, b, c, d, x[12], 7, 0x6b901122); + d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193); + c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e); + b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821); + + // round 2 + a = md5Round2(a, b, c, d, x[1], 5, 0xf61e2562); + d = md5Round2(d, a, b, c, x[6], 9, 0xc040b340); + c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51); + b = md5Round2(b, c, d, a, x[0], 20, 0xe9b6c7aa); + a = md5Round2(a, b, c, d, x[5], 5, 0xd62f105d); + d = md5Round2(d, a, b, c, x[10], 9, 0x02441453); + c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681); + b = md5Round2(b, c, d, a, x[4], 20, 0xe7d3fbc8); + a = md5Round2(a, b, c, d, x[9], 5, 0x21e1cde6); + d = md5Round2(d, a, b, c, x[14], 9, 0xc33707d6); + c = md5Round2(c, d, a, b, x[3], 14, 0xf4d50d87); + b = md5Round2(b, c, d, a, x[8], 20, 0x455a14ed); + a = md5Round2(a, b, c, d, x[13], 5, 0xa9e3e905); + d = md5Round2(d, a, b, c, x[2], 9, 0xfcefa3f8); + c = md5Round2(c, d, a, b, x[7], 14, 0x676f02d9); + b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a); + + // round 3 + a = md5Round3(a, b, c, d, x[5], 4, 0xfffa3942); + d = md5Round3(d, a, b, c, x[8], 11, 0x8771f681); + c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122); + b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c); + a = md5Round3(a, b, c, d, x[1], 4, 0xa4beea44); + d = md5Round3(d, a, b, c, x[4], 11, 0x4bdecfa9); + c = md5Round3(c, d, a, b, x[7], 16, 0xf6bb4b60); + b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70); + a = md5Round3(a, b, c, d, x[13], 4, 0x289b7ec6); + d = md5Round3(d, a, b, c, x[0], 11, 0xeaa127fa); + c = md5Round3(c, d, a, b, x[3], 16, 0xd4ef3085); + b = md5Round3(b, c, d, a, x[6], 23, 0x04881d05); + a = md5Round3(a, b, c, d, x[9], 4, 0xd9d4d039); + d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5); + c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8); + b = md5Round3(b, c, d, a, x[2], 23, 0xc4ac5665); + + // round 4 + a = md5Round4(a, b, c, d, x[0], 6, 0xf4292244); + d = md5Round4(d, a, b, c, x[7], 10, 0x432aff97); + c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7); + b = md5Round4(b, c, d, a, x[5], 21, 0xfc93a039); + a = md5Round4(a, b, c, d, x[12], 6, 0x655b59c3); + d = md5Round4(d, a, b, c, x[3], 10, 0x8f0ccc92); + c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d); + b = md5Round4(b, c, d, a, x[1], 21, 0x85845dd1); + a = md5Round4(a, b, c, d, x[8], 6, 0x6fa87e4f); + d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0); + c = md5Round4(c, d, a, b, x[6], 15, 0xa3014314); + b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1); + a = md5Round4(a, b, c, d, x[4], 6, 0xf7537e82); + d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235); + c = md5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb); + b = md5Round4(b, c, d, a, x[9], 21, 0xeb86d391); + + // increment a, b, c, d + a += aa; + b += bb; + c += cc; + d += dd; + } + + // break digest into bytes + digest[0] = (Guchar)(a & 0xff); + digest[1] = (Guchar)((a >>= 8) & 0xff); + digest[2] = (Guchar)((a >>= 8) & 0xff); + digest[3] = (Guchar)((a >>= 8) & 0xff); + digest[4] = (Guchar)(b & 0xff); + digest[5] = (Guchar)((b >>= 8) & 0xff); + digest[6] = (Guchar)((b >>= 8) & 0xff); + digest[7] = (Guchar)((b >>= 8) & 0xff); + digest[8] = (Guchar)(c & 0xff); + digest[9] = (Guchar)((c >>= 8) & 0xff); + digest[10] = (Guchar)((c >>= 8) & 0xff); + digest[11] = (Guchar)((c >>= 8) & 0xff); + digest[12] = (Guchar)(d & 0xff); + digest[13] = (Guchar)((d >>= 8) & 0xff); + digest[14] = (Guchar)((d >>= 8) & 0xff); + digest[15] = (Guchar)((d >>= 8) & 0xff); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h new file mode 100644 index 000000000..56f34b77f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h @@ -0,0 +1,95 @@ +//======================================================================== +// +// Decrypt.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef DECRYPT_H +#define DECRYPT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "GString.h" +#include "Object.h" +#include "Stream.h" + +//------------------------------------------------------------------------ +// Decrypt +//------------------------------------------------------------------------ + +class Decrypt { +public: + + // Generate a file key. The buffer must have space for at + // least 16 bytes. Checks and then + // and returns true if either is correct. Sets if + // the owner password was correct. Either or both of the passwords + // may be NULL, which is treated as an empty string. + static GBool makeFileKey(int encVersion, int encRevision, int keyLength, + GString *ownerKey, GString *userKey, + int permissions, GString *fileID, + GString *ownerPassword, GString *userPassword, + Guchar *fileKey, GBool encryptMetadata, + GBool *ownerPasswordOk); + +private: + + static GBool makeFileKey2(int encVersion, int encRevision, int keyLength, + GString *ownerKey, GString *userKey, + int permissions, GString *fileID, + GString *userPassword, Guchar *fileKey, + GBool encryptMetadata); +}; + +//------------------------------------------------------------------------ +// DecryptStream +//------------------------------------------------------------------------ + +struct DecryptRC4State { + Guchar state[256]; + Guchar x, y; + int buf; +}; + +struct DecryptAESState { + Guint w[44]; + Guchar state[16]; + Guchar cbc[16]; + Guchar buf[16]; + int bufIdx; +}; + +class DecryptStream: public FilterStream { +public: + + DecryptStream(Stream *strA, Guchar *fileKey, + CryptAlgorithm algoA, int keyLength, + int objNum, int objGen); + virtual ~DecryptStream(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual GBool isBinary(GBool last); + virtual Stream *getUndecodedStream() { return this; } + +private: + + CryptAlgorithm algo; + int objKeyLength; + Guchar objKey[16 + 9]; + + union { + DecryptRC4State rc4; + DecryptAESState aes; + } state; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc new file mode 100644 index 000000000..dd1517f0a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc @@ -0,0 +1,95 @@ +//======================================================================== +// +// Dict.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "Object.h" +#include "XRef.h" +#include "Dict.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +Dict::Dict(XRef *xrefA) { + xref = xrefA; + entries = NULL; + size = length = 0; + ref = 1; +} + +Dict::~Dict() { + int i; + + for (i = 0; i < length; ++i) { + gfree(entries[i].key); + entries[i].val.free(); + } + gfree(entries); +} + +void Dict::add(char *key, Object *val) { + if (length == size) { + if (length == 0) { + size = 8; + } else { + size *= 2; + } + entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry)); + } + entries[length].key = key; + entries[length].val = *val; + ++length; +} + +inline DictEntry *Dict::find(char *key) { + int i; + + for (i = 0; i < length; ++i) { + if (!strcmp(key, entries[i].key)) + return &entries[i]; + } + return NULL; +} + +GBool Dict::is(char *type) { + DictEntry *e; + + return (e = find("Type")) && e->val.isName(type); +} + +Object *Dict::lookup(char *key, Object *obj) { + DictEntry *e; + + return (e = find(key)) ? e->val.fetch(xref, obj) : obj->initNull(); +} + +Object *Dict::lookupNF(char *key, Object *obj) { + DictEntry *e; + + return (e = find(key)) ? e->val.copy(obj) : obj->initNull(); +} + +char *Dict::getKey(int i) { + return entries[i].key; +} + +Object *Dict::getVal(int i, Object *obj) { + return entries[i].val.fetch(xref, obj); +} + +Object *Dict::getValNF(int i, Object *obj) { + return entries[i].val.copy(obj); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h new file mode 100644 index 000000000..08f55ecd4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h @@ -0,0 +1,77 @@ +//======================================================================== +// +// Dict.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef DICT_H +#define DICT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +struct DictEntry { + char *key; + Object val; +}; + +class Dict { +public: + + // Constructor. + Dict(XRef *xrefA); + + // Destructor. + ~Dict(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get number of entries. + int getLength() { return length; } + + // Add an entry. NB: does not copy key. + void add(char *key, Object *val); + + // Check if dictionary is of specified type. + GBool is(char *type); + + // Look up an entry and return the value. Returns a null object + // if is not in the dictionary. + Object *lookup(char *key, Object *obj); + Object *lookupNF(char *key, Object *obj); + + // Iterative accessors. + char *getKey(int i); + Object *getVal(int i, Object *obj); + Object *getValNF(int i, Object *obj); + + // Set the xref pointer. This is only used in one special case: the + // trailer dictionary, which is read before the xref table is + // parsed. + void setXRef(XRef *xrefA) { xref = xrefA; } + +private: + + XRef *xref; // the xref table for this PDF file + DictEntry *entries; // array of entries + int size; // size of array + int length; // number of entries in dictionary + int ref; // reference count + + DictEntry *find(char *key); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc new file mode 100644 index 000000000..c03f75f48 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc @@ -0,0 +1,38 @@ +//======================================================================== +// +// Error.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "GlobalParams.h" +#include "Error.h" + +void CDECL error(int pos, char *msg, ...) { + va_list args; + + // NB: this can be called before the globalParams object is created + if (globalParams && globalParams->getErrQuiet()) { + return; + } + if (pos >= 0) { + fprintf(stderr, "Error (%d): ", pos); + } else { + fprintf(stderr, "Error: "); + } + va_start(args, msg); + vfprintf(stderr, msg, args); + va_end(args); + fprintf(stderr, "\n"); + fflush(stderr); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h new file mode 100644 index 000000000..0ce55e9ab --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h @@ -0,0 +1,23 @@ +//======================================================================== +// +// Error.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef ERROR_H +#define ERROR_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "config.h" + +extern void CDECL error(int pos, char *msg, ...); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h new file mode 100644 index 000000000..b28528df5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h @@ -0,0 +1,36 @@ +//======================================================================== +// +// ErrorCodes.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef ERRORCODES_H +#define ERRORCODES_H + +#define errNone 0 // no error + +#define errOpenFile 1 // couldn't open the PDF file + +#define errBadCatalog 2 // couldn't read the page catalog + +#define errDamaged 3 // PDF file was damaged and couldn't be + // repaired + +#define errEncrypted 4 // file was encrypted and password was + // incorrect or not supplied + +#define errHighlightFile 5 // nonexistent or invalid highlight file + +#define errBadPrinter 6 // invalid printer + +#define errPrinting 7 // error during printing + +#define errPermission 8 // PDF file doesn't allow that operation + +#define errBadPageNum 9 // invalid page number + +#define errFileIO 10 // file I/O error + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc new file mode 100644 index 000000000..28d0b8ca8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc @@ -0,0 +1,156 @@ +//======================================================================== +// +// FoFiBase.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "FoFiBase.h" + +//------------------------------------------------------------------------ +// FoFiBase +//------------------------------------------------------------------------ + +FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) { + fileData = file = (Guchar *)fileA; + len = lenA; + freeFileData = freeFileDataA; +} + +FoFiBase::~FoFiBase() { + if (freeFileData) { + gfree(fileData); + } +} + +char *FoFiBase::readFile(char *fileName, int *fileLen) { + FILE *f; + char *buf; + int n; + + if (!(f = fopen(fileName, "rb"))) { + return NULL; + } + fseek(f, 0, SEEK_END); + n = (int)ftell(f); + fseek(f, 0, SEEK_SET); + buf = (char *)gmalloc(n); + if ((int)fread(buf, 1, n, f) != n) { + gfree(buf); + fclose(f); + return NULL; + } + fclose(f); + *fileLen = n; + return buf; +} + +int FoFiBase::getS8(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos >= len) { + *ok = gFalse; + return 0; + } + x = file[pos]; + if (x & 0x80) { + x |= ~0xff; + } + return x; +} + +int FoFiBase::getU8(int pos, GBool *ok) { + if (pos < 0 || pos >= len) { + *ok = gFalse; + return 0; + } + return file[pos]; +} + +int FoFiBase::getS16BE(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos+1 >= len) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + if (x & 0x8000) { + x |= ~0xffff; + } + return x; +} + +int FoFiBase::getU16BE(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos+1 >= len) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + return x; +} + +int FoFiBase::getS32BE(int pos, GBool *ok) { + int x; + + if (pos < 0 || pos+3 >= len) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + x = (x << 8) + file[pos+2]; + x = (x << 8) + file[pos+3]; + if (x & 0x80000000) { + x |= ~0xffffffff; + } + return x; +} + +Guint FoFiBase::getU32BE(int pos, GBool *ok) { + Guint x; + + if (pos < 0 || pos+3 >= len) { + *ok = gFalse; + return 0; + } + x = file[pos]; + x = (x << 8) + file[pos+1]; + x = (x << 8) + file[pos+2]; + x = (x << 8) + file[pos+3]; + return x; +} + +Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) { + Guint x; + int i; + + if (pos < 0 || pos + size > len) { + *ok = gFalse; + return 0; + } + x = 0; + for (i = 0; i < size; ++i) { + x = (x << 8) + file[pos + i]; + } + return x; +} + +GBool FoFiBase::checkRegion(int pos, int size) { + return pos >= 0 && + pos + size >= pos && + pos + size <= len; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h new file mode 100644 index 000000000..b78840b2a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h @@ -0,0 +1,57 @@ +//======================================================================== +// +// FoFiBase.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFIBASE_H +#define FOFIBASE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ + +typedef void (*FoFiOutputFunc)(void *stream, char *data, int len); + +//------------------------------------------------------------------------ +// FoFiBase +//------------------------------------------------------------------------ + +class FoFiBase { +public: + + virtual ~FoFiBase(); + +protected: + + FoFiBase(char *fileA, int lenA, GBool freeFileDataA); + static char *readFile(char *fileName, int *fileLen); + + // S = signed / U = unsigned + // 8/16/32/Var = word length, in bytes + // BE = big endian + int getS8(int pos, GBool *ok); + int getU8(int pos, GBool *ok); + int getS16BE(int pos, GBool *ok); + int getU16BE(int pos, GBool *ok); + int getS32BE(int pos, GBool *ok); + Guint getU32BE(int pos, GBool *ok); + Guint getUVarBE(int pos, int size, GBool *ok); + + GBool checkRegion(int pos, int size); + + Guchar *fileData; + Guchar *file; + int len; + GBool freeFileData; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc new file mode 100644 index 000000000..37a17f5df --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc @@ -0,0 +1,994 @@ +//======================================================================== +// +// FoFiEncodings.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "FoFiEncodings.h" + +//------------------------------------------------------------------------ +// Type 1 and 1C font data +//------------------------------------------------------------------------ + +char *fofiType1StandardEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL +}; + +char *fofiType1ExpertEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall" +}; + +//------------------------------------------------------------------------ +// Type 1C font data +//------------------------------------------------------------------------ + +char *fofiType1CStdStrings[391] = { + ".notdef", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "endash", + "dagger", + "daggerdbl", + "periodcentered", + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + "questiondown", + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "emdash", + "AE", + "ordfeminine", + "Lslash", + "Oslash", + "OE", + "ordmasculine", + "ae", + "dotlessi", + "lslash", + "oslash", + "oe", + "germandbls", + "onesuperior", + "logicalnot", + "mu", + "trademark", + "Eth", + "onehalf", + "plusminus", + "Thorn", + "onequarter", + "divide", + "brokenbar", + "degree", + "thorn", + "threequarters", + "twosuperior", + "registered", + "minus", + "eth", + "multiply", + "threesuperior", + "copyright", + "Aacute", + "Acircumflex", + "Adieresis", + "Agrave", + "Aring", + "Atilde", + "Ccedilla", + "Eacute", + "Ecircumflex", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Ntilde", + "Oacute", + "Ocircumflex", + "Odieresis", + "Ograve", + "Otilde", + "Scaron", + "Uacute", + "Ucircumflex", + "Udieresis", + "Ugrave", + "Yacute", + "Ydieresis", + "Zcaron", + "aacute", + "acircumflex", + "adieresis", + "agrave", + "aring", + "atilde", + "ccedilla", + "eacute", + "ecircumflex", + "edieresis", + "egrave", + "iacute", + "icircumflex", + "idieresis", + "igrave", + "ntilde", + "oacute", + "ocircumflex", + "odieresis", + "ograve", + "otilde", + "scaron", + "uacute", + "ucircumflex", + "udieresis", + "ugrave", + "yacute", + "ydieresis", + "zcaron", + "exclamsmall", + "Hungarumlautsmall", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + "isuperior", + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + "rsuperior", + "ssuperior", + "tsuperior", + "ff", + "ffi", + "ffl", + "parenleftinferior", + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + "Dotaccentsmall", + "Macronsmall", + "figuredash", + "hypheninferior", + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + "zerosuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall", + "001.000", + "001.001", + "001.002", + "001.003", + "Black", + "Bold", + "Book", + "Light", + "Medium", + "Regular", + "Roman", + "Semibold" +}; + +Gushort fofiType1CISOAdobeCharset[229] = { + 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 +}; + +Gushort fofiType1CExpertCharset[166] = { + 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, + 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 +}; + +Gushort fofiType1CExpertSubsetCharset[87] = { + 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, + 15, 99, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, 300, 301, + 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, + 323, 324, 325, 326, 150, 164, 169, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h new file mode 100644 index 000000000..50e285d7c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h @@ -0,0 +1,36 @@ +//======================================================================== +// +// FoFiEncodings.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFIENCODINGS_H +#define FOFIENCODINGS_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ +// Type 1 and 1C font data +//------------------------------------------------------------------------ + +extern char *fofiType1StandardEncoding[256]; +extern char *fofiType1ExpertEncoding[256]; + +//------------------------------------------------------------------------ +// Type 1C font data +//------------------------------------------------------------------------ + +extern char *fofiType1CStdStrings[391]; +extern Gushort fofiType1CISOAdobeCharset[229]; +extern Gushort fofiType1CExpertCharset[166]; +extern Gushort fofiType1CExpertSubsetCharset[87]; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc new file mode 100644 index 000000000..f8a1aa347 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc @@ -0,0 +1,2027 @@ +//======================================================================== +// +// FoFiTrueType.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gtypes.h" +#include "gmem.h" +#include "GString.h" +#include "GHash.h" +#include "FoFiType1C.h" +#include "FoFiTrueType.h" + +// +// Terminology +// ----------- +// +// character code = number used as an element of a text string +// +// character name = glyph name = name for a particular glyph within a +// font +// +// glyph index = GID = position (within some internal table in the font) +// where the instructions to draw a particular glyph are +// stored +// +// Type 1 fonts +// ------------ +// +// Type 1 fonts contain: +// +// Encoding: array of glyph names, maps char codes to glyph names +// +// Encoding[charCode] = charName +// +// CharStrings: dictionary of instructions, keyed by character names, +// maps character name to glyph data +// +// CharStrings[charName] = glyphData +// +// TrueType fonts +// -------------- +// +// TrueType fonts contain: +// +// 'cmap' table: mapping from character code to glyph index; there may +// be multiple cmaps in a TrueType font +// +// cmap[charCode] = gid +// +// 'post' table: mapping from glyph index to glyph name +// +// post[gid] = glyphName +// +// Type 42 fonts +// ------------- +// +// Type 42 fonts contain: +// +// Encoding: array of glyph names, maps char codes to glyph names +// +// Encoding[charCode] = charName +// +// CharStrings: dictionary of glyph indexes, keyed by character names, +// maps character name to glyph index +// +// CharStrings[charName] = gid +// + +//------------------------------------------------------------------------ + +#define ttcfTag 0x74746366 + +//------------------------------------------------------------------------ + +struct TrueTypeTable { + Guint tag; + Guint checksum; + int offset; + int origOffset; + int len; +}; + +struct TrueTypeCmap { + int platform; + int encoding; + int offset; + int len; + int fmt; +}; + +struct TrueTypeLoca { + int idx; + int origOffset; + int newOffset; + int len; +}; + +#define cmapTag 0x636d6170 +#define glyfTag 0x676c7966 +#define headTag 0x68656164 +#define hheaTag 0x68686561 +#define hmtxTag 0x686d7478 +#define locaTag 0x6c6f6361 +#define nameTag 0x6e616d65 +#define os2Tag 0x4f532f32 +#define postTag 0x706f7374 + +static int cmpTrueTypeLocaOffset(const void *p1, const void *p2) { + TrueTypeLoca *loca1 = (TrueTypeLoca *)p1; + TrueTypeLoca *loca2 = (TrueTypeLoca *)p2; + + if (loca1->origOffset == loca2->origOffset) { + return loca1->idx - loca2->idx; + } + return loca1->origOffset - loca2->origOffset; +} + +static int cmpTrueTypeLocaIdx(const void *p1, const void *p2) { + TrueTypeLoca *loca1 = (TrueTypeLoca *)p1; + TrueTypeLoca *loca2 = (TrueTypeLoca *)p2; + + return loca1->idx - loca2->idx; +} + +static int cmpTrueTypeTableTag(const void *p1, const void *p2) { + TrueTypeTable *tab1 = (TrueTypeTable *)p1; + TrueTypeTable *tab2 = (TrueTypeTable *)p2; + + return (int)tab1->tag - (int)tab2->tag; +} + +//------------------------------------------------------------------------ + +struct T42Table { + char *tag; // 4-byte tag + GBool required; // required by the TrueType spec? +}; + +// TrueType tables to be embedded in Type 42 fonts. +// NB: the table names must be in alphabetical order here. +#define nT42Tables 11 +static T42Table t42Tables[nT42Tables] = { + { "cvt ", gTrue }, + { "fpgm", gTrue }, + { "glyf", gTrue }, + { "head", gTrue }, + { "hhea", gTrue }, + { "hmtx", gTrue }, + { "loca", gTrue }, + { "maxp", gTrue }, + { "prep", gTrue }, + { "vhea", gFalse }, + { "vmtx", gFalse } +}; +#define t42HeadTable 3 +#define t42LocaTable 6 +#define t42GlyfTable 2 +#define t42VheaTable 9 +#define t42VmtxTable 10 + +//------------------------------------------------------------------------ + +// Glyph names in some arbitrary standard order that Apple uses for +// their TrueType fonts. +static char *macGlyphNames[258] = { + ".notdef", "null", "CR", "space", + "exclam", "quotedbl", "numbersign", "dollar", + "percent", "ampersand", "quotesingle", "parenleft", + "parenright", "asterisk", "plus", "comma", + "hyphen", "period", "slash", "zero", + "one", "two", "three", "four", + "five", "six", "seven", "eight", + "nine", "colon", "semicolon", "less", + "equal", "greater", "question", "at", + "A", "B", "C", "D", + "E", "F", "G", "H", + "I", "J", "K", "L", + "M", "N", "O", "P", + "Q", "R", "S", "T", + "U", "V", "W", "X", + "Y", "Z", "bracketleft", "backslash", + "bracketright", "asciicircum", "underscore", "grave", + "a", "b", "c", "d", + "e", "f", "g", "h", + "i", "j", "k", "l", + "m", "n", "o", "p", + "q", "r", "s", "t", + "u", "v", "w", "x", + "y", "z", "braceleft", "bar", + "braceright", "asciitilde", "Adieresis", "Aring", + "Ccedilla", "Eacute", "Ntilde", "Odieresis", + "Udieresis", "aacute", "agrave", "acircumflex", + "adieresis", "atilde", "aring", "ccedilla", + "eacute", "egrave", "ecircumflex", "edieresis", + "iacute", "igrave", "icircumflex", "idieresis", + "ntilde", "oacute", "ograve", "ocircumflex", + "odieresis", "otilde", "uacute", "ugrave", + "ucircumflex", "udieresis", "dagger", "degree", + "cent", "sterling", "section", "bullet", + "paragraph", "germandbls", "registered", "copyright", + "trademark", "acute", "dieresis", "notequal", + "AE", "Oslash", "infinity", "plusminus", + "lessequal", "greaterequal", "yen", "mu1", + "partialdiff", "summation", "product", "pi", + "integral", "ordfeminine", "ordmasculine", "Ohm", + "ae", "oslash", "questiondown", "exclamdown", + "logicalnot", "radical", "florin", "approxequal", + "increment", "guillemotleft", "guillemotright", "ellipsis", + "nbspace", "Agrave", "Atilde", "Otilde", + "OE", "oe", "endash", "emdash", + "quotedblleft", "quotedblright", "quoteleft", "quoteright", + "divide", "lozenge", "ydieresis", "Ydieresis", + "fraction", "currency", "guilsinglleft", "guilsinglright", + "fi", "fl", "daggerdbl", "periodcentered", + "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + "Ecircumflex", "Aacute", "Edieresis", "Egrave", + "Iacute", "Icircumflex", "Idieresis", "Igrave", + "Oacute", "Ocircumflex", "applelogo", "Ograve", + "Uacute", "Ucircumflex", "Ugrave", "dotlessi", + "circumflex", "tilde", "overscore", "breve", + "dotaccent", "ring", "cedilla", "hungarumlaut", + "ogonek", "caron", "Lslash", "lslash", + "Scaron", "scaron", "Zcaron", "zcaron", + "brokenbar", "Eth", "eth", "Yacute", + "yacute", "Thorn", "thorn", "minus", + "multiply", "onesuperior", "twosuperior", "threesuperior", + "onehalf", "onequarter", "threequarters", "franc", + "Gbreve", "gbreve", "Idot", "Scedilla", + "scedilla", "Cacute", "cacute", "Ccaron", + "ccaron", "dmacron" +}; + +//------------------------------------------------------------------------ +// FoFiTrueType +//------------------------------------------------------------------------ + +FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA) { + FoFiTrueType *ff; + + ff = new FoFiTrueType(fileA, lenA, gFalse); + if (!ff->parsedOk) { + delete ff; + return NULL; + } + return ff; +} + +FoFiTrueType *FoFiTrueType::load(char *fileName) { + FoFiTrueType *ff; + char *fileA; + int lenA; + + if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { + return NULL; + } + ff = new FoFiTrueType(fileA, lenA, gTrue); + if (!ff->parsedOk) { + delete ff; + return NULL; + } + return ff; +} + +FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA): + FoFiBase(fileA, lenA, freeFileDataA) +{ + tables = NULL; + nTables = 0; + cmaps = NULL; + nCmaps = 0; + nameToGID = NULL; + parsedOk = gFalse; + + parse(); +} + +FoFiTrueType::~FoFiTrueType() { + gfree(tables); + gfree(cmaps); + if (nameToGID) { + delete nameToGID; + } +} + +int FoFiTrueType::getNumCmaps() { + return nCmaps; +} + +int FoFiTrueType::getCmapPlatform(int i) { + return cmaps[i].platform; +} + +int FoFiTrueType::getCmapEncoding(int i) { + return cmaps[i].encoding; +} + +int FoFiTrueType::findCmap(int platform, int encoding) { + int i; + + for (i = 0; i < nCmaps; ++i) { + if (cmaps[i].platform == platform && cmaps[i].encoding == encoding) { + return i; + } + } + return -1; +} + +Gushort FoFiTrueType::mapCodeToGID(int i, int c) { + Gushort gid; + int segCnt, segEnd, segStart, segDelta, segOffset; + int cmapFirst, cmapLen; + int pos, a, b, m; + GBool ok; + + if (i < 0 || i >= nCmaps) { + return 0; + } + ok = gTrue; + pos = cmaps[i].offset; + switch (cmaps[i].fmt) { + case 0: + if (c < 0 || c >= cmaps[i].len - 6) { + return 0; + } + gid = getU8(cmaps[i].offset + 6 + c, &ok); + break; + case 4: + segCnt = getU16BE(pos + 6, &ok) / 2; + a = -1; + b = segCnt - 1; + segEnd = getU16BE(pos + 14 + 2*b, &ok); + if (c > segEnd) { + // malformed font -- the TrueType spec requires the last segEnd + // to be 0xffff + return 0; + } + // invariant: seg[a].end < code <= seg[b].end + while (b - a > 1 && ok) { + m = (a + b) / 2; + segEnd = getU16BE(pos + 14 + 2*m, &ok); + if (segEnd < c) { + a = m; + } else { + b = m; + } + } + segStart = getU16BE(pos + 16 + 2*segCnt + 2*b, &ok); + segDelta = getU16BE(pos + 16 + 4*segCnt + 2*b, &ok); + segOffset = getU16BE(pos + 16 + 6*segCnt + 2*b, &ok); + if (c < segStart) { + return 0; + } + if (segOffset == 0) { + gid = (c + segDelta) & 0xffff; + } else { + gid = getU16BE(pos + 16 + 6*segCnt + 2*b + + segOffset + 2 * (c - segStart), &ok); + if (gid != 0) { + gid = (gid + segDelta) & 0xffff; + } + } + break; + case 6: + cmapFirst = getU16BE(pos + 6, &ok); + cmapLen = getU16BE(pos + 8, &ok); + if (c < cmapFirst || c >= cmapFirst + cmapLen) { + return 0; + } + gid = getU16BE(pos + 10 + 2 * (c - cmapFirst), &ok); + break; + default: + return 0; + } + if (!ok) { + return 0; + } + return gid; +} + +int FoFiTrueType::mapNameToGID(char *name) { + if (!nameToGID) { + return 0; + } + return nameToGID->lookupInt(name); +} + +Gushort *FoFiTrueType::getCIDToGIDMap(int *nCIDs) { + FoFiType1C *ff; + Gushort *map; + int i; + + *nCIDs = 0; + if (!openTypeCFF) { + return NULL; + } + i = seekTable("CFF "); + if (!checkRegion(tables[i].offset, tables[i].len)) { + return NULL; + } + if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, + tables[i].len))) { + return NULL; + } + map = ff->getCIDToGIDMap(nCIDs); + delete ff; + return map; +} + +int FoFiTrueType::getEmbeddingRights() { + int i, fsType; + GBool ok; + + if ((i = seekTable("OS/2")) < 0) { + return 4; + } + ok = gTrue; + fsType = getU16BE(tables[i].offset + 8, &ok); + if (!ok) { + return 4; + } + if (fsType & 0x0008) { + return 2; + } + if (fsType & 0x0004) { + return 1; + } + if (fsType & 0x0002) { + return 0; + } + return 3; +} + +void FoFiTrueType::convertToType42(char *psName, char **encoding, + Gushort *codeToGID, + FoFiOutputFunc outputFunc, + void *outputStream) { + GString *buf; + GBool ok; + + if (openTypeCFF) { + return; + } + + // write the header + ok = gTrue; + buf = GString::format("%!PS-TrueTypeFont-{0:2g}\n", + (double)getS32BE(0, &ok) / 65536.0); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + + // begin the font dictionary + (*outputFunc)(outputStream, "10 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/FontType 42 def\n", 17); + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + buf = GString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); + + // write the guts of the dictionary + cvtEncoding(encoding, outputFunc, outputStream); + cvtCharStrings(encoding, codeToGID, outputFunc, outputStream); + cvtSfnts(outputFunc, outputStream, NULL, gFalse); + + // end the dictionary and define the font + (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); +} + +void FoFiTrueType::convertToType1(char *psName, char **newEncoding, + GBool ascii, FoFiOutputFunc outputFunc, + void *outputStream) { + FoFiType1C *ff; + int i; + + if (!openTypeCFF) { + return; + } + i = seekTable("CFF "); + if (!checkRegion(tables[i].offset, tables[i].len)) { + return; + } + if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, + tables[i].len))) { + return; + } + ff->convertToType1(psName, newEncoding, ascii, outputFunc, outputStream); + delete ff; +} + +void FoFiTrueType::convertToCIDType2(char *psName, + Gushort *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, + void *outputStream) { + GString *buf; + Gushort cid; + GBool ok; + int i, j, k; + + if (openTypeCFF) { + return; + } + + // write the header + ok = gTrue; + buf = GString::format("%!PS-TrueTypeFont-{0:2g}\n", + (double)getS32BE(0, &ok) / 65536.0); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + + // begin the font dictionary + (*outputFunc)(outputStream, "20 dict begin\n", 14); + (*outputFunc)(outputStream, "/CIDFontName /", 14); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/CIDFontType 2 def\n", 19); + (*outputFunc)(outputStream, "/FontType 42 def\n", 17); + (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); + (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); + (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); + (*outputFunc)(outputStream, " /Supplement 0 def\n", 20); + (*outputFunc)(outputStream, " end def\n", 10); + (*outputFunc)(outputStream, "/GDBytes 2 def\n", 15); + if (cidMap) { + buf = GString::format("/CIDCount {0:d} def\n", nCIDs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (nCIDs > 32767) { + (*outputFunc)(outputStream, "/CIDMap [", 9); + for (i = 0; i < nCIDs; i += 32768 - 16) { + (*outputFunc)(outputStream, "<\n", 2); + for (j = 0; j < 32768 - 16 && i+j < nCIDs; j += 16) { + (*outputFunc)(outputStream, " ", 2); + for (k = 0; k < 16 && i+j+k < nCIDs; ++k) { + cid = cidMap[i+j+k]; + buf = GString::format("{0:02x}{1:02x}", + (cid >> 8) & 0xff, cid & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "\n", 1); + } + (*outputFunc)(outputStream, " >", 3); + } + (*outputFunc)(outputStream, "\n", 1); + (*outputFunc)(outputStream, "] def\n", 6); + } else { + (*outputFunc)(outputStream, "/CIDMap <\n", 10); + for (i = 0; i < nCIDs; i += 16) { + (*outputFunc)(outputStream, " ", 2); + for (j = 0; j < 16 && i+j < nCIDs; ++j) { + cid = cidMap[i+j]; + buf = GString::format("{0:02x}{1:02x}", + (cid >> 8) & 0xff, cid & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "\n", 1); + } + (*outputFunc)(outputStream, "> def\n", 6); + } + } else { + // direct mapping - just fill the string(s) with s[i]=i + buf = GString::format("/CIDCount {0:d} def\n", nGlyphs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (nGlyphs > 32767) { + (*outputFunc)(outputStream, "/CIDMap [\n", 10); + for (i = 0; i < nGlyphs; i += 32767) { + j = nGlyphs - i < 32767 ? nGlyphs - i : 32767; + buf = GString::format(" {0:d} string 0 1 {1:d} {{\n", 2 * j, j - 1); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format(" 2 copy dup 2 mul exch {0:d} add -8 bitshift put\n", + i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format(" 1 index exch dup 2 mul 1 add exch {0:d} add" + " 255 and put\n", i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, " } for\n", 8); + } + (*outputFunc)(outputStream, "] def\n", 6); + } else { + buf = GString::format("/CIDMap {0:d} string\n", 2 * nGlyphs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format(" 0 1 {0:d} {{\n", nGlyphs - 1); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, + " 2 copy dup 2 mul exch -8 bitshift put\n", 42); + (*outputFunc)(outputStream, + " 1 index exch dup 2 mul 1 add exch 255 and put\n", 50); + (*outputFunc)(outputStream, " } for\n", 8); + (*outputFunc)(outputStream, "def\n", 4); + } + } + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + buf = GString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); + (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26); + (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30); + (*outputFunc)(outputStream, " /.notdef 0 def\n", 17); + (*outputFunc)(outputStream, " end readonly def\n", 19); + + // write the guts of the dictionary + cvtSfnts(outputFunc, outputStream, NULL, needVerticalMetrics); + + // end the dictionary and define the font + (*outputFunc)(outputStream, + "CIDFontName currentdict end /CIDFont defineresource pop\n", + 56); +} + +void FoFiTrueType::convertToCIDType0(char *psName, + FoFiOutputFunc outputFunc, + void *outputStream) { + FoFiType1C *ff; + int i; + + if (!openTypeCFF) { + return; + } + i = seekTable("CFF "); + if (!checkRegion(tables[i].offset, tables[i].len)) { + return; + } + if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, + tables[i].len))) { + return; + } + ff->convertToCIDType0(psName, outputFunc, outputStream); + delete ff; +} + +void FoFiTrueType::convertToType0(char *psName, Gushort *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, + void *outputStream) { + GString *buf; + GString *sfntsName; + int n, i, j; + + if (openTypeCFF) { + return; + } + + // write the Type 42 sfnts array + sfntsName = (new GString(psName))->append("_sfnts"); + cvtSfnts(outputFunc, outputStream, sfntsName, needVerticalMetrics); + delete sfntsName; + + // write the descendant Type 42 fonts + n = cidMap ? nCIDs : nGlyphs; + for (i = 0; i < n; i += 256) { + (*outputFunc)(outputStream, "10 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GString::format("_{0:02x} def\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 42 def\n", 17); + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + buf = GString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", + bbox[0], bbox[1], bbox[2], bbox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); + (*outputFunc)(outputStream, "/sfnts ", 7); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, "_sfnts def\n", 11); + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + for (j = 0; j < 256 && i+j < n; ++j) { + buf = GString::format("dup {0:d} /c{1:02x} put\n", j, j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "readonly def\n", 13); + (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32); + (*outputFunc)(outputStream, "/.notdef 0 def\n", 15); + for (j = 0; j < 256 && i+j < n; ++j) { + buf = GString::format("/c{0:02x} {1:d} def\n", + j, cidMap ? cidMap[i+j] : i+j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "end readonly def\n", 17); + (*outputFunc)(outputStream, + "FontName currentdict end definefont pop\n", 40); + } + + // write the Type 0 parent font + (*outputFunc)(outputStream, "16 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/FontType 0 def\n", 16); + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); + (*outputFunc)(outputStream, "/Encoding [\n", 12); + for (i = 0; i < n; i += 256) { + buf = GString::format("{0:d}\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "/FDepVector [\n", 14); + for (i = 0; i < n; i += 256) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GString::format("_{0:02x} findfont\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); +} + +void FoFiTrueType::convertToType0(char *psName, + FoFiOutputFunc outputFunc, + void *outputStream) { + FoFiType1C *ff; + int i; + + if (!openTypeCFF) { + return; + } + i = seekTable("CFF "); + if (!checkRegion(tables[i].offset, tables[i].len)) { + return; + } + if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, + tables[i].len))) { + return; + } + ff->convertToType0(psName, outputFunc, outputStream); + delete ff; +} + +void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc, + void *outputStream, char *name, + Gushort *codeToGID) { + // this substitute cmap table maps char codes 0000-ffff directly to + // glyphs 0000-ffff + static char cmapTab[36] = { + 0, 0, // table version number + 0, 1, // number of encoding tables + 0, 1, // platform ID + 0, 0, // encoding ID + 0, 0, 0, 12, // offset of subtable + 0, 4, // subtable format + 0, 24, // subtable length + 0, 0, // subtable version + 0, 2, // segment count * 2 + 0, 2, // 2 * 2 ^ floor(log2(segCount)) + 0, 0, // floor(log2(segCount)) + 0, 0, // 2*segCount - 2*2^floor(log2(segCount)) + (char)0xff, (char)0xff, // endCount[0] + 0, 0, // reserved + 0, 0, // startCount[0] + 0, 0, // idDelta[0] + 0, 0 // pad to a mulitple of four bytes + }; + static char nameTab[8] = { + 0, 0, // format + 0, 0, // number of name records + 0, 6, // offset to start of string storage + 0, 0 // pad to multiple of four bytes + }; + static char postTab[32] = { + 0, 1, 0, 0, // format + 0, 0, 0, 0, // italic angle + 0, 0, // underline position + 0, 0, // underline thickness + 0, 0, 0, 0, // fixed pitch + 0, 0, 0, 0, // min Type 42 memory + 0, 0, 0, 0, // max Type 42 memory + 0, 0, 0, 0, // min Type 1 memory + 0, 0, 0, 0 // max Type 1 memory + }; + static char os2Tab[86] = { + 0, 1, // version + 0, 1, // xAvgCharWidth + 0, 0, // usWeightClass + 0, 0, // usWidthClass + 0, 0, // fsType + 0, 0, // ySubscriptXSize + 0, 0, // ySubscriptYSize + 0, 0, // ySubscriptXOffset + 0, 0, // ySubscriptYOffset + 0, 0, // ySuperscriptXSize + 0, 0, // ySuperscriptYSize + 0, 0, // ySuperscriptXOffset + 0, 0, // ySuperscriptYOffset + 0, 0, // yStrikeoutSize + 0, 0, // yStrikeoutPosition + 0, 0, // sFamilyClass + 0, 0, 0, 0, 0, // panose + 0, 0, 0, 0, 0, + 0, 0, 0, 0, // ulUnicodeRange1 + 0, 0, 0, 0, // ulUnicodeRange2 + 0, 0, 0, 0, // ulUnicodeRange3 + 0, 0, 0, 0, // ulUnicodeRange4 + 0, 0, 0, 0, // achVendID + 0, 0, // fsSelection + 0, 0, // usFirstCharIndex + 0, 0, // usLastCharIndex + 0, 0, // sTypoAscender + 0, 0, // sTypoDescender + 0, 0, // sTypoLineGap + 0, 0, // usWinAscent + 0, 0, // usWinDescent + 0, 0, 0, 0, // ulCodePageRange1 + 0, 0, 0, 0 // ulCodePageRange2 + }; + GBool missingCmap, missingName, missingPost, missingOS2; + GBool unsortedLoca, badCmapLen, abbrevHMTX; + int nZeroLengthTables; + int nHMetrics, advWidth, lsb; + TrueTypeLoca *locaTable; + TrueTypeTable *newTables; + char *newNameTab, *newCmapTab, *newHHEATab, *newHMTXTab; + int nNewTables, cmapIdx, cmapLen, glyfLen, newNameLen, newCmapLen, next; + int newHHEALen, newHMTXLen; + Guint locaChecksum, glyfChecksum, fileChecksum; + char *tableDir; + char locaBuf[4], checksumBuf[4]; + GBool ok; + Guint t; + int pos, i, j, k, n; + + if (openTypeCFF) { + return; + } + + // check for missing tables + // (Note: if the OS/2 table is missing, the Microsoft PCL5 driver + // will embed a PCL TrueType font with the pitch field set to zero, + // which apparently causes divide-by-zero errors. As far as I can + // tell, the only important field in the OS/2 table is + // xAvgCharWidth.) + missingCmap = (cmapIdx = seekTable("cmap")) < 0; + missingName = seekTable("name") < 0; + missingPost = seekTable("post") < 0; + missingOS2 = seekTable("OS/2") < 0; + + // read the loca table, check to see if it's sorted + locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca)); + unsortedLoca = gFalse; + i = seekTable("loca"); + pos = tables[i].offset; + ok = gTrue; + for (i = 0; i <= nGlyphs; ++i) { + if (locaFmt) { + locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok); + } else { + locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok); + } + if (i > 0 && locaTable[i].origOffset < locaTable[i-1].origOffset) { + unsortedLoca = gTrue; + } + // glyph descriptions must be at least 12 bytes long (nContours, + // xMin, yMin, xMax, yMax, instructionLength - two bytes each); + // invalid glyph descriptions (even if they're never used) make + // Windows choke, so we work around that problem here (ideally, + // this would parse the glyph descriptions in the glyf table and + // remove any that were invalid, but this quick test is a decent + // start) + if (i > 0 && + locaTable[i].origOffset - locaTable[i-1].origOffset > 0 && + locaTable[i].origOffset - locaTable[i-1].origOffset < 12) { + locaTable[i-1].origOffset = locaTable[i].origOffset; + unsortedLoca = gTrue; + } + locaTable[i].idx = i; + } + + // check for zero-length tables + nZeroLengthTables = 0; + for (i = 0; i < nTables; ++i) { + if (tables[i].len == 0) { + ++nZeroLengthTables; + } + } + + // check for an incorrect cmap table length + badCmapLen = gFalse; + cmapLen = 0; // make gcc happy + if (!missingCmap) { + cmapLen = cmaps[0].offset + cmaps[0].len; + for (i = 1; i < nCmaps; ++i) { + if (cmaps[i].offset + cmaps[i].len > cmapLen) { + cmapLen = cmaps[i].offset + cmaps[i].len; + } + } + cmapLen -= tables[cmapIdx].offset; + if (cmapLen > tables[cmapIdx].len) { + badCmapLen = gTrue; + } + } + + // check for an abbreviated hmtx table (this is completely legal, + // but confuses the Microsoft PCL5 printer driver, which generates + // embedded fonts with the pitch field set to zero) + i = seekTable("hhea"); + nHMetrics = getU16BE(tables[i].offset + 34, &ok); + abbrevHMTX = nHMetrics < nGlyphs; + + // if nothing is broken, just write the TTF file as is + if (!missingCmap && !missingName && !missingPost && !missingOS2 && + !unsortedLoca && !badCmapLen && !abbrevHMTX && nZeroLengthTables == 0 && + !name && !codeToGID) { + (*outputFunc)(outputStream, (char *)file, len); + goto done1; + } + + // sort the 'loca' table: some (non-compliant) fonts have + // out-of-order loca tables; in order to correctly handle the case + // where (compliant) fonts have empty entries in the middle of the + // table, cmpTrueTypeLocaOffset uses offset as its primary sort key, + // and idx as its secondary key (ensuring that adjacent entries with + // the same pos value remain in the same order) + glyfLen = 0; // make gcc happy + if (unsortedLoca) { + qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), + &cmpTrueTypeLocaOffset); + for (i = 0; i < nGlyphs; ++i) { + locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset; + } + locaTable[nGlyphs].len = 0; + qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), + &cmpTrueTypeLocaIdx); + pos = 0; + for (i = 0; i <= nGlyphs; ++i) { + locaTable[i].newOffset = pos; + pos += locaTable[i].len; + if (pos & 3) { + pos += 4 - (pos & 3); + } + } + glyfLen = pos; + } + + // compute checksums for the loca and glyf tables + locaChecksum = glyfChecksum = 0; + if (unsortedLoca) { + if (locaFmt) { + for (j = 0; j <= nGlyphs; ++j) { + locaChecksum += locaTable[j].newOffset; + } + } else { + for (j = 0; j <= nGlyphs; j += 2) { + locaChecksum += locaTable[j].newOffset << 16; + if (j + 1 <= nGlyphs) { + locaChecksum += locaTable[j+1].newOffset; + } + } + } + pos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + n = locaTable[j].len; + if (n > 0) { + k = locaTable[j].origOffset; + if (checkRegion(pos + k, n)) { + glyfChecksum += computeTableChecksum(file + pos + k, n); + } + } + } + } + + // construct the new name table + if (name) { + n = strlen(name); + newNameLen = (6 + 4*12 + 2 * (3*n + 7) + 3) & ~3; + newNameTab = (char *)gmalloc(newNameLen); + memset(newNameTab, 0, newNameLen); + newNameTab[0] = 0; // format selector + newNameTab[1] = 0; + newNameTab[2] = 0; // number of name records + newNameTab[3] = 4; + newNameTab[4] = 0; // offset to start of string storage + newNameTab[5] = 6 + 4*12; + next = 0; + for (i = 0; i < 4; ++i) { + newNameTab[6 + i*12 + 0] = 0; // platform ID = Microsoft + newNameTab[6 + i*12 + 1] = 3; + newNameTab[6 + i*12 + 2] = 0; // encoding ID = Unicode + newNameTab[6 + i*12 + 3] = 1; + newNameTab[6 + i*12 + 4] = 0x04; // language ID = American English + newNameTab[6 + i*12 + 5] = 0x09; + newNameTab[6 + i*12 + 6] = 0; // name ID + newNameTab[6 + i*12 + 7] = i + 1; + newNameTab[6 + i*12 + 8] = i+1 == 2 ? 0 : ((2*n) >> 8); // string length + newNameTab[6 + i*12 + 9] = i+1 == 2 ? 14 : ((2*n) & 0xff); + newNameTab[6 + i*12 + 10] = next >> 8; // string offset + newNameTab[6 + i*12 + 11] = next & 0xff; + if (i+1 == 2) { + memcpy(newNameTab + 6 + 4*12 + next, "\0R\0e\0g\0u\0l\0a\0r", 14); + next += 14; + } else { + for (j = 0; j < n; ++j) { + newNameTab[6 + 4*12 + next + 2*j] = 0; + newNameTab[6 + 4*12 + next + 2*j + 1] = name[j]; + } + next += 2*n; + } + } + } else { + newNameLen = 0; + newNameTab = NULL; + } + + // construct the new cmap table + if (codeToGID) { + newCmapLen = 44 + 256 * 2; + newCmapTab = (char *)gmalloc(newCmapLen); + newCmapTab[0] = 0; // table version number = 0 + newCmapTab[1] = 0; + newCmapTab[2] = 0; // number of encoding tables = 1 + newCmapTab[3] = 1; + newCmapTab[4] = 0; // platform ID = Microsoft + newCmapTab[5] = 3; + newCmapTab[6] = 0; // encoding ID = Unicode + newCmapTab[7] = 1; + newCmapTab[8] = 0; // offset of subtable + newCmapTab[9] = 0; + newCmapTab[10] = 0; + newCmapTab[11] = 12; + newCmapTab[12] = 0; // subtable format = 4 + newCmapTab[13] = 4; + newCmapTab[14] = 0x02; // subtable length + newCmapTab[15] = 0x20; + newCmapTab[16] = 0; // subtable version = 0 + newCmapTab[17] = 0; + newCmapTab[18] = 0; // segment count * 2 + newCmapTab[19] = 4; + newCmapTab[20] = 0; // 2 * 2 ^ floor(log2(segCount)) + newCmapTab[21] = 4; + newCmapTab[22] = 0; // floor(log2(segCount)) + newCmapTab[23] = 1; + newCmapTab[24] = 0; // 2*segCount - 2*2^floor(log2(segCount)) + newCmapTab[25] = 0; + newCmapTab[26] = 0x00; // endCount[0] + newCmapTab[27] = (char)0xff; + newCmapTab[28] = (char)0xff; // endCount[1] + newCmapTab[29] = (char)0xff; + newCmapTab[30] = 0; // reserved + newCmapTab[31] = 0; + newCmapTab[32] = 0x00; // startCount[0] + newCmapTab[33] = 0x00; + newCmapTab[34] = (char)0xff; // startCount[1] + newCmapTab[35] = (char)0xff; + newCmapTab[36] = 0; // idDelta[0] + newCmapTab[37] = 0; + newCmapTab[38] = 0; // idDelta[1] + newCmapTab[39] = 1; + newCmapTab[40] = 0; // idRangeOffset[0] + newCmapTab[41] = 4; + newCmapTab[42] = 0; // idRangeOffset[1] + newCmapTab[43] = 0; + for (i = 0; i < 256; ++i) { + newCmapTab[44 + 2*i] = codeToGID[i] >> 8; + newCmapTab[44 + 2*i + 1] = codeToGID[i] & 0xff; + } + } else { + newCmapLen = 0; + newCmapTab = NULL; + } + + // generate the new hmtx table and the updated hhea table + if (abbrevHMTX) { + i = seekTable("hhea"); + pos = tables[i].offset; + newHHEALen = 36; + newHHEATab = (char *)gmalloc(newHHEALen); + for (i = 0; i < newHHEALen; ++i) { + newHHEATab[i] = getU8(pos++, &ok); + } + newHHEATab[34] = nGlyphs >> 8; + newHHEATab[35] = nGlyphs & 0xff; + i = seekTable("hmtx"); + pos = tables[i].offset; + newHMTXLen = 4 * nGlyphs; + newHMTXTab = (char *)gmalloc(newHMTXLen); + advWidth = 0; + for (i = 0; i < nHMetrics; ++i) { + advWidth = getU16BE(pos, &ok); + lsb = getU16BE(pos + 2, &ok); + pos += 4; + newHMTXTab[4*i ] = advWidth >> 8; + newHMTXTab[4*i + 1] = advWidth & 0xff; + newHMTXTab[4*i + 2] = lsb >> 8; + newHMTXTab[4*i + 3] = lsb & 0xff; + } + for (; i < nGlyphs; ++i) { + lsb = getU16BE(pos, &ok); + pos += 2; + newHMTXTab[4*i ] = advWidth >> 8; + newHMTXTab[4*i + 1] = advWidth & 0xff; + newHMTXTab[4*i + 2] = lsb >> 8; + newHMTXTab[4*i + 3] = lsb & 0xff; + } + } else { + newHHEATab = newHMTXTab = NULL; + newHHEALen = newHMTXLen = 0; // make gcc happy + } + + // construct the new table directory: + // - keep all original tables with non-zero length + // - fix the cmap table's length, if necessary + // - add missing tables + // - sort the table by tag + // - compute new table positions, including 4-byte alignment + // - (re)compute table checksums + nNewTables = nTables - nZeroLengthTables + + (missingCmap ? 1 : 0) + (missingName ? 1 : 0) + + (missingPost ? 1 : 0) + (missingOS2 ? 1 : 0); + newTables = (TrueTypeTable *)gmallocn(nNewTables, sizeof(TrueTypeTable)); + j = 0; + for (i = 0; i < nTables; ++i) { + if (tables[i].len > 0) { + newTables[j] = tables[i]; + newTables[j].origOffset = tables[i].offset; + if (checkRegion(tables[i].offset, newTables[i].len)) { + newTables[j].checksum = + computeTableChecksum(file + tables[i].offset, tables[i].len); + if (tables[i].tag == headTag) { + // don't include the file checksum + newTables[j].checksum -= getU32BE(tables[i].offset + 8, &ok); + } + } + if (newTables[j].tag == cmapTag && codeToGID) { + newTables[j].len = newCmapLen; + newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab, + newCmapLen); + } else if (newTables[j].tag == cmapTag && badCmapLen) { + newTables[j].len = cmapLen; + } else if (newTables[j].tag == locaTag && unsortedLoca) { + newTables[j].len = (nGlyphs + 1) * (locaFmt ? 4 : 2); + newTables[j].checksum = locaChecksum; + } else if (newTables[j].tag == glyfTag && unsortedLoca) { + newTables[j].len = glyfLen; + newTables[j].checksum = glyfChecksum; + } else if (newTables[j].tag == nameTag && name) { + newTables[j].len = newNameLen; + newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab, + newNameLen); + } else if (newTables[j].tag == hheaTag && abbrevHMTX) { + newTables[j].len = newHHEALen; + newTables[j].checksum = computeTableChecksum((Guchar *)newHHEATab, + newHHEALen); + } else if (newTables[j].tag == hmtxTag && abbrevHMTX) { + newTables[j].len = newHMTXLen; + newTables[j].checksum = computeTableChecksum((Guchar *)newHMTXTab, + newHMTXLen); + } + ++j; + } + } + if (missingCmap) { + newTables[j].tag = cmapTag; + if (codeToGID) { + newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab, + newCmapLen); + newTables[j].len = newCmapLen; + } else { + newTables[j].checksum = computeTableChecksum((Guchar *)cmapTab, + sizeof(cmapTab)); + newTables[j].len = sizeof(cmapTab); + } + ++j; + } + if (missingName) { + newTables[j].tag = nameTag; + if (name) { + newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab, + newNameLen); + newTables[j].len = newNameLen; + } else { + newTables[j].checksum = computeTableChecksum((Guchar *)nameTab, + sizeof(nameTab)); + newTables[j].len = sizeof(nameTab); + } + ++j; + } + if (missingPost) { + newTables[j].tag = postTag; + newTables[j].checksum = computeTableChecksum((Guchar *)postTab, + sizeof(postTab)); + newTables[j].len = sizeof(postTab); + ++j; + } + if (missingOS2) { + newTables[j].tag = os2Tag; + newTables[j].checksum = computeTableChecksum((Guchar *)os2Tab, + sizeof(os2Tab)); + newTables[j].len = sizeof(os2Tab); + ++j; + } + qsort(newTables, nNewTables, sizeof(TrueTypeTable), + &cmpTrueTypeTableTag); + pos = 12 + nNewTables * 16; + for (i = 0; i < nNewTables; ++i) { + newTables[i].offset = pos; + pos += newTables[i].len; + if (pos & 3) { + pos += 4 - (pos & 3); + } + } + + // write the table directory + tableDir = (char *)gmalloc(12 + nNewTables * 16); + tableDir[0] = 0x00; // sfnt version + tableDir[1] = 0x01; + tableDir[2] = 0x00; + tableDir[3] = 0x00; + tableDir[4] = (char)((nNewTables >> 8) & 0xff); // numTables + tableDir[5] = (char)(nNewTables & 0xff); + for (i = -1, t = (Guint)nNewTables; t; ++i, t >>= 1) ; + t = 1 << (4 + i); + tableDir[6] = (char)((t >> 8) & 0xff); // searchRange + tableDir[7] = (char)(t & 0xff); + tableDir[8] = (char)((i >> 8) & 0xff); // entrySelector + tableDir[9] = (char)(i & 0xff); + t = nNewTables * 16 - t; + tableDir[10] = (char)((t >> 8) & 0xff); // rangeShift + tableDir[11] = (char)(t & 0xff); + pos = 12; + for (i = 0; i < nNewTables; ++i) { + tableDir[pos ] = (char)(newTables[i].tag >> 24); + tableDir[pos+ 1] = (char)(newTables[i].tag >> 16); + tableDir[pos+ 2] = (char)(newTables[i].tag >> 8); + tableDir[pos+ 3] = (char) newTables[i].tag; + tableDir[pos+ 4] = (char)(newTables[i].checksum >> 24); + tableDir[pos+ 5] = (char)(newTables[i].checksum >> 16); + tableDir[pos+ 6] = (char)(newTables[i].checksum >> 8); + tableDir[pos+ 7] = (char) newTables[i].checksum; + tableDir[pos+ 8] = (char)(newTables[i].offset >> 24); + tableDir[pos+ 9] = (char)(newTables[i].offset >> 16); + tableDir[pos+10] = (char)(newTables[i].offset >> 8); + tableDir[pos+11] = (char) newTables[i].offset; + tableDir[pos+12] = (char)(newTables[i].len >> 24); + tableDir[pos+13] = (char)(newTables[i].len >> 16); + tableDir[pos+14] = (char)(newTables[i].len >> 8); + tableDir[pos+15] = (char) newTables[i].len; + pos += 16; + } + (*outputFunc)(outputStream, tableDir, 12 + nNewTables * 16); + + // compute the file checksum + fileChecksum = computeTableChecksum((Guchar *)tableDir, + 12 + nNewTables * 16); + for (i = 0; i < nNewTables; ++i) { + fileChecksum += newTables[i].checksum; + } + fileChecksum = 0xb1b0afba - fileChecksum; + + // write the tables + for (i = 0; i < nNewTables; ++i) { + if (newTables[i].tag == headTag) { + if (checkRegion(newTables[i].origOffset, newTables[i].len)) { + (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, 8); + checksumBuf[0] = fileChecksum >> 24; + checksumBuf[1] = fileChecksum >> 16; + checksumBuf[2] = fileChecksum >> 8; + checksumBuf[3] = fileChecksum; + (*outputFunc)(outputStream, checksumBuf, 4); + (*outputFunc)(outputStream, + (char *)file + newTables[i].origOffset + 12, + newTables[i].len - 12); + } else { + for (j = 0; j < newTables[i].len; ++j) { + (*outputFunc)(outputStream, "\0", 1); + } + } + } else if (newTables[i].tag == cmapTag && codeToGID) { + (*outputFunc)(outputStream, newCmapTab, newTables[i].len); + } else if (newTables[i].tag == cmapTag && missingCmap) { + (*outputFunc)(outputStream, cmapTab, newTables[i].len); + } else if (newTables[i].tag == nameTag && name) { + (*outputFunc)(outputStream, newNameTab, newTables[i].len); + } else if (newTables[i].tag == nameTag && missingName) { + (*outputFunc)(outputStream, nameTab, newTables[i].len); + } else if (newTables[i].tag == postTag && missingPost) { + (*outputFunc)(outputStream, postTab, newTables[i].len); + } else if (newTables[i].tag == os2Tag && missingOS2) { + (*outputFunc)(outputStream, os2Tab, newTables[i].len); + } else if (newTables[i].tag == hheaTag && abbrevHMTX) { + (*outputFunc)(outputStream, newHHEATab, newTables[i].len); + } else if (newTables[i].tag == hmtxTag && abbrevHMTX) { + (*outputFunc)(outputStream, newHMTXTab, newTables[i].len); + } else if (newTables[i].tag == locaTag && unsortedLoca) { + for (j = 0; j <= nGlyphs; ++j) { + if (locaFmt) { + locaBuf[0] = (char)(locaTable[j].newOffset >> 24); + locaBuf[1] = (char)(locaTable[j].newOffset >> 16); + locaBuf[2] = (char)(locaTable[j].newOffset >> 8); + locaBuf[3] = (char) locaTable[j].newOffset; + (*outputFunc)(outputStream, locaBuf, 4); + } else { + locaBuf[0] = (char)(locaTable[j].newOffset >> 9); + locaBuf[1] = (char)(locaTable[j].newOffset >> 1); + (*outputFunc)(outputStream, locaBuf, 2); + } + } + } else if (newTables[i].tag == glyfTag && unsortedLoca) { + pos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + n = locaTable[j].len; + if (n > 0) { + k = locaTable[j].origOffset; + if (checkRegion(pos + k, n)) { + (*outputFunc)(outputStream, (char *)file + pos + k, n); + } else { + for (k = 0; k < n; ++k) { + (*outputFunc)(outputStream, "\0", 1); + } + } + if ((k = locaTable[j].len & 3)) { + (*outputFunc)(outputStream, "\0\0\0\0", 4 - k); + } + } + } + } else { + if (checkRegion(newTables[i].origOffset, newTables[i].len)) { + (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, + newTables[i].len); + } else { + for (j = 0; j < newTables[i].len; ++j) { + (*outputFunc)(outputStream, "\0", 1); + } + } + } + if (newTables[i].len & 3) { + (*outputFunc)(outputStream, "\0\0\0", 4 - (newTables[i].len & 3)); + } + } + + gfree(newHMTXTab); + gfree(newHHEATab); + gfree(newCmapTab); + gfree(newNameTab); + gfree(tableDir); + gfree(newTables); + done1: + gfree(locaTable); +} + +void FoFiTrueType::cvtEncoding(char **encoding, + FoFiOutputFunc outputFunc, + void *outputStream) { + char *name; + GString *buf; + int i; + + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + if (encoding) { + for (i = 0; i < 256; ++i) { + if (!(name = encoding[i])) { + name = ".notdef"; + } + buf = GString::format("dup {0:d} /", i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, name, strlen(name)); + (*outputFunc)(outputStream, " put\n", 5); + } + } else { + for (i = 0; i < 256; ++i) { + buf = GString::format("dup {0:d} /c{1:02x} put\n", i, i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + (*outputFunc)(outputStream, "readonly def\n", 13); +} + +void FoFiTrueType::cvtCharStrings(char **encoding, + Gushort *codeToGID, + FoFiOutputFunc outputFunc, + void *outputStream) { + char *name; + GString *buf; + char buf2[16]; + int i, k; + + // always define '.notdef' + (*outputFunc)(outputStream, "/CharStrings 256 dict dup begin\n", 32); + (*outputFunc)(outputStream, "/.notdef 0 def\n", 15); + + // if there's no 'cmap' table, punt + if (nCmaps == 0) { + goto err; + } + + // map char name to glyph index: + // 1. use encoding to map name to char code + // 2. use codeToGID to map char code to glyph index + // N.B. We do this in reverse order because font subsets can have + // weird encodings that use the same character name twice, and + // the first definition is probably the one we want. + k = 0; // make gcc happy + for (i = 255; i >= 0; --i) { + if (encoding) { + name = encoding[i]; + } else { + sprintf(buf2, "c%02x", i); + name = buf2; + } + if (name && strcmp(name, ".notdef")) { + k = codeToGID[i]; + // note: Distiller (maybe Adobe's PS interpreter in general) + // doesn't like TrueType fonts that have CharStrings entries + // which point to nonexistent glyphs, hence the (k < nGlyphs) + // test + if (k > 0 && k < nGlyphs) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, name, strlen(name)); + buf = GString::format(" {0:d} def\n", k); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + } + + err: + (*outputFunc)(outputStream, "end readonly def\n", 17); +} + +void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc, + void *outputStream, GString *name, + GBool needVerticalMetrics) { + Guchar headData[54]; + TrueTypeLoca *locaTable; + Guchar *locaData; + TrueTypeTable newTables[nT42Tables]; + Guchar tableDir[12 + nT42Tables*16]; + GBool ok; + Guint checksum; + int nNewTables; + int length, pos, glyfPos, i, j, k; + Guchar vheaTab[36] = { + 0, 1, 0, 0, // table version number + 0, 0, // ascent + 0, 0, // descent + 0, 0, // reserved + 0, 0, // max advance height + 0, 0, // min top side bearing + 0, 0, // min bottom side bearing + 0, 0, // y max extent + 0, 0, // caret slope rise + 0, 1, // caret slope run + 0, 0, // caret offset + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // reserved + 0, 0, // metric data format + 0, 1 // number of advance heights in vmtx table + }; + Guchar *vmtxTab; + GBool needVhea, needVmtx; + int advance; + + // construct the 'head' table, zero out the font checksum + i = seekTable("head"); + pos = tables[i].offset; + if (!checkRegion(pos, 54)) { + return; + } + memcpy(headData, file + pos, 54); + headData[8] = headData[9] = headData[10] = headData[11] = (Guchar)0; + + // read the original 'loca' table, pad entries out to 4 bytes, and + // sort it into proper order -- some (non-compliant) fonts have + // out-of-order loca tables; in order to correctly handle the case + // where (compliant) fonts have empty entries in the middle of the + // table, cmpTrueTypeLocaPos uses offset as its primary sort key, + // and idx as its secondary key (ensuring that adjacent entries with + // the same pos value remain in the same order) + locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca)); + i = seekTable("loca"); + pos = tables[i].offset; + ok = gTrue; + for (i = 0; i <= nGlyphs; ++i) { + locaTable[i].idx = i; + if (locaFmt) { + locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok); + } else { + locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok); + } + } + qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), + &cmpTrueTypeLocaOffset); + for (i = 0; i < nGlyphs; ++i) { + locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset; + } + locaTable[nGlyphs].len = 0; + qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), + &cmpTrueTypeLocaIdx); + pos = 0; + for (i = 0; i <= nGlyphs; ++i) { + locaTable[i].newOffset = pos; + pos += locaTable[i].len; + if (pos & 3) { + pos += 4 - (pos & 3); + } + } + + // construct the new 'loca' table + locaData = (Guchar *)gmallocn(nGlyphs + 1, (locaFmt ? 4 : 2)); + for (i = 0; i <= nGlyphs; ++i) { + pos = locaTable[i].newOffset; + if (locaFmt) { + locaData[4*i ] = (Guchar)(pos >> 24); + locaData[4*i+1] = (Guchar)(pos >> 16); + locaData[4*i+2] = (Guchar)(pos >> 8); + locaData[4*i+3] = (Guchar) pos; + } else { + locaData[2*i ] = (Guchar)(pos >> 9); + locaData[2*i+1] = (Guchar)(pos >> 1); + } + } + + // count the number of tables + nNewTables = 0; + for (i = 0; i < nT42Tables; ++i) { + if (t42Tables[i].required || + seekTable(t42Tables[i].tag) >= 0) { + ++nNewTables; + } + } + vmtxTab = NULL; // make gcc happy + advance = 0; // make gcc happy + if (needVerticalMetrics) { + needVhea = seekTable("vhea") < 0; + needVmtx = seekTable("vmtx") < 0; + if (needVhea || needVmtx) { + i = seekTable("head"); + advance = getU16BE(tables[i].offset + 18, &ok); // units per em + if (needVhea) { + ++nNewTables; + } + if (needVmtx) { + ++nNewTables; + } + } + } + + // construct the new table headers, including table checksums + // (pad each table out to a multiple of 4 bytes) + pos = 12 + nNewTables*16; + k = 0; + for (i = 0; i < nT42Tables; ++i) { + length = -1; + checksum = 0; // make gcc happy + if (i == t42HeadTable) { + length = 54; + checksum = computeTableChecksum(headData, 54); + } else if (i == t42LocaTable) { + length = (nGlyphs + 1) * (locaFmt ? 4 : 2); + checksum = computeTableChecksum(locaData, length); + } else if (i == t42GlyfTable) { + length = 0; + checksum = 0; + glyfPos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + length += locaTable[j].len; + if (length & 3) { + length += 4 - (length & 3); + } + if (checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) { + checksum += + computeTableChecksum(file + glyfPos + locaTable[j].origOffset, + locaTable[j].len); + } + } + } else { + if ((j = seekTable(t42Tables[i].tag)) >= 0) { + length = tables[j].len; + if (checkRegion(tables[j].offset, length)) { + checksum = computeTableChecksum(file + tables[j].offset, length); + } + } else if (needVerticalMetrics && i == t42VheaTable) { + vheaTab[10] = advance / 256; // max advance height + vheaTab[11] = advance % 256; + length = sizeof(vheaTab); + checksum = computeTableChecksum(vheaTab, length); + } else if (needVerticalMetrics && i == t42VmtxTable) { + length = 4 + (nGlyphs - 1) * 4; + vmtxTab = (Guchar *)gmalloc(length); + vmtxTab[0] = advance / 256; + vmtxTab[1] = advance % 256; + for (j = 2; j < length; j += 2) { + vmtxTab[j] = 0; + vmtxTab[j+1] = 0; + } + checksum = computeTableChecksum(vmtxTab, length); + } else if (t42Tables[i].required) { + //~ error(-1, "Embedded TrueType font is missing a required table ('%s')", + //~ t42Tables[i].tag); + length = 0; + checksum = 0; + } + } + if (length >= 0) { + newTables[k].tag = ((t42Tables[i].tag[0] & 0xff) << 24) | + ((t42Tables[i].tag[1] & 0xff) << 16) | + ((t42Tables[i].tag[2] & 0xff) << 8) | + (t42Tables[i].tag[3] & 0xff); + newTables[k].checksum = checksum; + newTables[k].offset = pos; + newTables[k].len = length; + pos += length; + if (pos & 3) { + pos += 4 - (length & 3); + } + ++k; + } + } + + // construct the table directory + tableDir[0] = 0x00; // sfnt version + tableDir[1] = 0x01; + tableDir[2] = 0x00; + tableDir[3] = 0x00; + tableDir[4] = 0; // numTables + tableDir[5] = nNewTables; + tableDir[6] = 0; // searchRange + tableDir[7] = (Guchar)128; + tableDir[8] = 0; // entrySelector + tableDir[9] = 3; + tableDir[10] = 0; // rangeShift + tableDir[11] = (Guchar)(16 * nNewTables - 128); + pos = 12; + for (i = 0; i < nNewTables; ++i) { + tableDir[pos ] = (Guchar)(newTables[i].tag >> 24); + tableDir[pos+ 1] = (Guchar)(newTables[i].tag >> 16); + tableDir[pos+ 2] = (Guchar)(newTables[i].tag >> 8); + tableDir[pos+ 3] = (Guchar) newTables[i].tag; + tableDir[pos+ 4] = (Guchar)(newTables[i].checksum >> 24); + tableDir[pos+ 5] = (Guchar)(newTables[i].checksum >> 16); + tableDir[pos+ 6] = (Guchar)(newTables[i].checksum >> 8); + tableDir[pos+ 7] = (Guchar) newTables[i].checksum; + tableDir[pos+ 8] = (Guchar)(newTables[i].offset >> 24); + tableDir[pos+ 9] = (Guchar)(newTables[i].offset >> 16); + tableDir[pos+10] = (Guchar)(newTables[i].offset >> 8); + tableDir[pos+11] = (Guchar) newTables[i].offset; + tableDir[pos+12] = (Guchar)(newTables[i].len >> 24); + tableDir[pos+13] = (Guchar)(newTables[i].len >> 16); + tableDir[pos+14] = (Guchar)(newTables[i].len >> 8); + tableDir[pos+15] = (Guchar) newTables[i].len; + pos += 16; + } + + // compute the font checksum and store it in the head table + checksum = computeTableChecksum(tableDir, 12 + nNewTables*16); + for (i = 0; i < nNewTables; ++i) { + checksum += newTables[i].checksum; + } + checksum = 0xb1b0afba - checksum; // because the TrueType spec says so + headData[ 8] = (Guchar)(checksum >> 24); + headData[ 9] = (Guchar)(checksum >> 16); + headData[10] = (Guchar)(checksum >> 8); + headData[11] = (Guchar) checksum; + + // start the sfnts array + if (name) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, name->getCString(), name->getLength()); + (*outputFunc)(outputStream, " [\n", 3); + } else { + (*outputFunc)(outputStream, "/sfnts [\n", 9); + } + + // write the table directory + dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream); + + // write the tables + for (i = 0; i < nNewTables; ++i) { + if (i == t42HeadTable) { + dumpString(headData, 54, outputFunc, outputStream); + } else if (i == t42LocaTable) { + length = (nGlyphs + 1) * (locaFmt ? 4 : 2); + dumpString(locaData, length, outputFunc, outputStream); + } else if (i == t42GlyfTable) { + glyfPos = tables[seekTable("glyf")].offset; + for (j = 0; j < nGlyphs; ++j) { + if (locaTable[j].len > 0 && + checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) { + dumpString(file + glyfPos + locaTable[j].origOffset, + locaTable[j].len, outputFunc, outputStream); + } + } + } else { + // length == 0 means the table is missing and the error was + // already reported during the construction of the table + // headers + if ((length = newTables[i].len) > 0) { + if ((j = seekTable(t42Tables[i].tag)) >= 0 && + checkRegion(tables[j].offset, tables[j].len)) { + dumpString(file + tables[j].offset, tables[j].len, + outputFunc, outputStream); + } else if (needVerticalMetrics && i == t42VheaTable) { + dumpString(vheaTab, length, outputFunc, outputStream); + } else if (needVerticalMetrics && i == t42VmtxTable) { + dumpString(vmtxTab, length, outputFunc, outputStream); + gfree(vmtxTab); + } + } + } + } + + // end the sfnts array + (*outputFunc)(outputStream, "] def\n", 6); + + gfree(locaData); + gfree(locaTable); +} + +void FoFiTrueType::dumpString(Guchar *s, int length, + FoFiOutputFunc outputFunc, + void *outputStream) { + GString *buf; + int pad, i, j; + + (*outputFunc)(outputStream, "<", 1); + for (i = 0; i < length; i += 32) { + for (j = 0; j < 32 && i+j < length; ++j) { + buf = GString::format("{0:02x}", s[i+j] & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (i % (65536 - 32) == 65536 - 64) { + (*outputFunc)(outputStream, ">\n<", 3); + } else if (i+32 < length) { + (*outputFunc)(outputStream, "\n", 1); + } + } + if (length & 3) { + pad = 4 - (length & 3); + for (i = 0; i < pad; ++i) { + (*outputFunc)(outputStream, "00", 2); + } + } + // add an extra zero byte because the Adobe Type 42 spec says so + (*outputFunc)(outputStream, "00>\n", 4); +} + +Guint FoFiTrueType::computeTableChecksum(Guchar *data, int length) { + Guint checksum, word; + int i; + + checksum = 0; + for (i = 0; i+3 < length; i += 4) { + word = ((data[i ] & 0xff) << 24) + + ((data[i+1] & 0xff) << 16) + + ((data[i+2] & 0xff) << 8) + + (data[i+3] & 0xff); + checksum += word; + } + if (length & 3) { + word = 0; + i = length & ~3; + switch (length & 3) { + case 3: + word |= (data[i+2] & 0xff) << 8; + case 2: + word |= (data[i+1] & 0xff) << 16; + case 1: + word |= (data[i ] & 0xff) << 24; + break; + } + checksum += word; + } + return checksum; +} + +void FoFiTrueType::parse() { + Guint topTag; + int pos, ver, i, j; + + parsedOk = gTrue; + + // look for a collection (TTC) + topTag = getU32BE(0, &parsedOk); + if (!parsedOk) { + return; + } + if (topTag == ttcfTag) { + pos = getU32BE(12, &parsedOk); + if (!parsedOk) { + return; + } + } else { + pos = 0; + } + + // check the sfnt version + ver = getU32BE(pos, &parsedOk); + if (!parsedOk) { + return; + } + openTypeCFF = ver == 0x4f54544f; // 'OTTO' + + // read the table directory + nTables = getU16BE(pos + 4, &parsedOk); + if (!parsedOk) { + return; + } + tables = (TrueTypeTable *)gmallocn(nTables, sizeof(TrueTypeTable)); + pos += 12; + for (i = 0; i < nTables; ++i) { + tables[i].tag = getU32BE(pos, &parsedOk); + tables[i].checksum = getU32BE(pos + 4, &parsedOk); + tables[i].offset = (int)getU32BE(pos + 8, &parsedOk); + tables[i].len = (int)getU32BE(pos + 12, &parsedOk); + if (tables[i].offset + tables[i].len < tables[i].offset || + tables[i].offset + tables[i].len > len) { + parsedOk = gFalse; + } + pos += 16; + } + if (!parsedOk) { + return; + } + + // check for tables that are required by both the TrueType spec and + // the Type 42 spec + if (seekTable("head") < 0 || + seekTable("hhea") < 0 || + seekTable("maxp") < 0 || + seekTable("hmtx") < 0 || + (!openTypeCFF && seekTable("loca") < 0) || + (!openTypeCFF && seekTable("glyf") < 0) || + (openTypeCFF && seekTable("CFF ") < 0)) { + parsedOk = gFalse; + return; + } + + // read the cmaps + if ((i = seekTable("cmap")) >= 0) { + pos = tables[i].offset + 2; + nCmaps = getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + return; + } + cmaps = (TrueTypeCmap *)gmallocn(nCmaps, sizeof(TrueTypeCmap)); + for (j = 0; j < nCmaps; ++j) { + cmaps[j].platform = getU16BE(pos, &parsedOk); + cmaps[j].encoding = getU16BE(pos + 2, &parsedOk); + cmaps[j].offset = tables[i].offset + getU32BE(pos + 4, &parsedOk); + pos += 8; + cmaps[j].fmt = getU16BE(cmaps[j].offset, &parsedOk); + cmaps[j].len = getU16BE(cmaps[j].offset + 2, &parsedOk); + } + if (!parsedOk) { + return; + } + } else { + nCmaps = 0; + } + + // get the number of glyphs from the maxp table + i = seekTable("maxp"); + nGlyphs = getU16BE(tables[i].offset + 4, &parsedOk); + if (!parsedOk) { + return; + } + + // get the bbox and loca table format from the head table + i = seekTable("head"); + bbox[0] = getS16BE(tables[i].offset + 36, &parsedOk); + bbox[1] = getS16BE(tables[i].offset + 38, &parsedOk); + bbox[2] = getS16BE(tables[i].offset + 40, &parsedOk); + bbox[3] = getS16BE(tables[i].offset + 42, &parsedOk); + locaFmt = getS16BE(tables[i].offset + 50, &parsedOk); + if (!parsedOk) { + return; + } + + // make sure the loca table is sane (correct length and entries are + // in bounds) + if (!openTypeCFF) { + i = seekTable("loca"); + if (tables[i].len < 0) { + parsedOk = gFalse; + return; + } + if (tables[i].len < (nGlyphs + 1) * (locaFmt ? 4 : 2)) { + nGlyphs = tables[i].len / (locaFmt ? 4 : 2) - 1; + } + for (j = 0; j <= nGlyphs; ++j) { + if (locaFmt) { + pos = (int)getU32BE(tables[i].offset + j*4, &parsedOk); + } else { + pos = getU16BE(tables[i].offset + j*2, &parsedOk); + } + if (pos < 0 || pos > len) { + parsedOk = gFalse; + } + } + if (!parsedOk) { + return; + } + } + + // read the post table + readPostTable(); +} + +void FoFiTrueType::readPostTable() { + GString *name; + int tablePos, postFmt, stringIdx, stringPos; + GBool ok; + int i, j, n, m; + + ok = gTrue; + if ((i = seekTable("post")) < 0) { + return; + } + tablePos = tables[i].offset; + postFmt = getU32BE(tablePos, &ok); + if (!ok) { + goto err; + } + if (postFmt == 0x00010000) { + nameToGID = new GHash(gTrue); + for (i = 0; i < 258; ++i) { + nameToGID->add(new GString(macGlyphNames[i]), i); + } + } else if (postFmt == 0x00020000) { + nameToGID = new GHash(gTrue); + n = getU16BE(tablePos + 32, &ok); + if (!ok) { + goto err; + } + if (n > nGlyphs) { + n = nGlyphs; + } + stringIdx = 0; + stringPos = tablePos + 34 + 2*n; + for (i = 0; i < n; ++i) { + j = getU16BE(tablePos + 34 + 2*i, &ok); + if (j < 258) { + nameToGID->removeInt(macGlyphNames[j]); + nameToGID->add(new GString(macGlyphNames[j]), i); + } else { + j -= 258; + if (j != stringIdx) { + for (stringIdx = 0, stringPos = tablePos + 34 + 2*n; + stringIdx < j; + ++stringIdx, stringPos += 1 + getU8(stringPos, &ok)) ; + if (!ok) { + goto err; + } + } + m = getU8(stringPos, &ok); + if (!ok || !checkRegion(stringPos + 1, m)) { + goto err; + } + name = new GString((char *)&file[stringPos + 1], m); + nameToGID->removeInt(name); + nameToGID->add(name, i); + ++stringIdx; + stringPos += 1 + m; + } + } + } else if (postFmt == 0x00028000) { + nameToGID = new GHash(gTrue); + for (i = 0; i < nGlyphs; ++i) { + j = getU8(tablePos + 32 + i, &ok); + if (!ok) { + goto err; + } + if (j < 258) { + nameToGID->removeInt(macGlyphNames[j]); + nameToGID->add(new GString(macGlyphNames[j]), i); + } + } + } + + return; + + err: + if (nameToGID) { + delete nameToGID; + nameToGID = NULL; + } +} + +int FoFiTrueType::seekTable(char *tag) { + Guint tagI; + int i; + + tagI = ((tag[0] & 0xff) << 24) | + ((tag[1] & 0xff) << 16) | + ((tag[2] & 0xff) << 8) | + (tag[3] & 0xff); + for (i = 0; i < nTables; ++i) { + if (tables[i].tag == tagI) { + return i; + } + } + return -1; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h new file mode 100644 index 000000000..cf06ae78a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h @@ -0,0 +1,174 @@ +//======================================================================== +// +// FoFiTrueType.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFITRUETYPE_H +#define FOFITRUETYPE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "FoFiBase.h" + +class GString; +class GHash; +struct TrueTypeTable; +struct TrueTypeCmap; + +//------------------------------------------------------------------------ +// FoFiTrueType +//------------------------------------------------------------------------ + +class FoFiTrueType: public FoFiBase { +public: + + // Create a FoFiTrueType object from a memory buffer. + static FoFiTrueType *make(char *fileA, int lenA); + + // Create a FoFiTrueType object from a file on disk. + static FoFiTrueType *load(char *fileName); + + virtual ~FoFiTrueType(); + + // Returns true if this an OpenType font containing CFF data, false + // if it's a TrueType font (or OpenType font with TrueType data). + GBool isOpenTypeCFF() { return openTypeCFF; } + + // Return the number of cmaps defined by this font. + int getNumCmaps(); + + // Return the platform ID of the th cmap. + int getCmapPlatform(int i); + + // Return the encoding ID of the th cmap. + int getCmapEncoding(int i); + + // Return the index of the cmap for , . Returns + // -1 if there is no corresponding cmap. + int findCmap(int platform, int encoding); + + // Return the GID corresponding to according to the th cmap. + Gushort mapCodeToGID(int i, int c); + + // Returns the GID corresponding to according to the post + // table. Returns 0 if there is no mapping for or if the + // font does not have a post table. + int mapNameToGID(char *name); + + // Return the mapping from CIDs to GIDs, and return the number of + // CIDs in *. This is only useful for CID fonts. (Only + // useful for OpenType CFF fonts.) + Gushort *getCIDToGIDMap(int *nCIDs); + + // Returns the least restrictive embedding licensing right (as + // defined by the TrueType spec): + // * 4: OS/2 table is missing or invalid + // * 3: installable embedding + // * 2: editable embedding + // * 1: preview & print embedding + // * 0: restricted license embedding + int getEmbeddingRights(); + + // Convert to a Type 42 font, suitable for embedding in a PostScript + // file. will be used as the PostScript font name (so we + // don't need to depend on the 'name' table in the font). The + // array specifies the mapping from char codes to names. + // If is NULL, the encoding is unknown or undefined. The + // array specifies the mapping from char codes to GIDs. + // (Not useful for OpenType CFF fonts.) + void convertToType42(char *psName, char **encoding, + Gushort *codeToGID, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 1 font, suitable for embedding in a PostScript + // file. This is only useful with 8-bit fonts. If is + // not NULL, it will be used in place of the encoding in the Type 1C + // font. If is true the eexec section will be hex-encoded, + // otherwise it will be left as binary data. If is + // non-NULL, it will be used as the PostScript font name. (Only + // useful for OpenType CFF fonts.) + void convertToType1(char *psName, char **newEncoding, GBool ascii, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 2 CIDFont, suitable for embedding in a + // PostScript file. will be used as the PostScript font + // name (so we don't need to depend on the 'name' table in the + // font). The array maps CIDs to GIDs; it has + // entries. (Not useful for OpenType CFF fonts.) + void convertToCIDType2(char *psName, Gushort *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 CIDFont, suitable for embedding in a + // PostScript file. will be used as the PostScript font + // name. (Only useful for OpenType CFF fonts.) + void convertToCIDType0(char *psName, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. will be used as the + // PostScript font name (so we don't need to depend on the 'name' + // table in the font). The array maps CIDs to GIDs; it has + // entries. (Not useful for OpenType CFF fonts.) + void convertToType0(char *psName, Gushort *cidMap, int nCIDs, + GBool needVerticalMetrics, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. will be used as the + // PostScript font name. (Only useful for OpenType CFF fonts.) + void convertToType0(char *psName, + FoFiOutputFunc outputFunc, void *outputStream); + + // Write a clean TTF file, filling in missing tables and correcting + // various other errors. If is non-NULL, the font is renamed + // to . If is non-NULL, the font is re-encoded, + // using a Windows Unicode cmap. If is NULL and the font is + // complete and correct, it will be written unmodified. (Not useful + // for OpenType CFF fonts.) + void writeTTF(FoFiOutputFunc outputFunc, void *outputStream, + char *name = NULL, Gushort *codeToGID = NULL); + +private: + + FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA); + void cvtEncoding(char **encoding, + FoFiOutputFunc outputFunc, + void *outputStream); + void cvtCharStrings(char **encoding, + Gushort *codeToGID, + FoFiOutputFunc outputFunc, + void *outputStream); + void cvtSfnts(FoFiOutputFunc outputFunc, + void *outputStream, GString *name, + GBool needVerticalMetrics); + void dumpString(Guchar *s, int length, + FoFiOutputFunc outputFunc, + void *outputStream); + Guint computeTableChecksum(Guchar *data, int length); + void parse(); + void readPostTable(); + int seekTable(char *tag); + + TrueTypeTable *tables; + int nTables; + TrueTypeCmap *cmaps; + int nCmaps; + int nGlyphs; + int locaFmt; + int bbox[4]; + GHash *nameToGID; + GBool openTypeCFF; + + GBool parsedOk; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc new file mode 100644 index 000000000..efad5ee4e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc @@ -0,0 +1,252 @@ +//======================================================================== +// +// FoFiType1.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "FoFiEncodings.h" +#include "FoFiType1.h" + +//------------------------------------------------------------------------ +// FoFiType1 +//------------------------------------------------------------------------ + +FoFiType1 *FoFiType1::make(char *fileA, int lenA) { + return new FoFiType1(fileA, lenA, gFalse); +} + +FoFiType1 *FoFiType1::load(char *fileName) { + char *fileA; + int lenA; + + if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { + return NULL; + } + return new FoFiType1(fileA, lenA, gTrue); +} + +FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA): + FoFiBase(fileA, lenA, freeFileDataA) +{ + name = NULL; + encoding = NULL; + parsed = gFalse; +} + +FoFiType1::~FoFiType1() { + int i; + + if (name) { + gfree(name); + } + if (encoding && encoding != fofiType1StandardEncoding) { + for (i = 0; i < 256; ++i) { + gfree(encoding[i]); + } + gfree(encoding); + } +} + +char *FoFiType1::getName() { + if (!parsed) { + parse(); + } + return name; +} + +char **FoFiType1::getEncoding() { + if (!parsed) { + parse(); + } + return encoding; +} + +void FoFiType1::writeEncoded(char **newEncoding, + FoFiOutputFunc outputFunc, void *outputStream) { + char buf[512]; + char *line, *line2, *p; + int i; + + // copy everything up to the encoding + for (line = (char *)file; + line && strncmp(line, "/Encoding", 9); + line = getNextLine(line)) ; + if (!line) { + // no encoding - just copy the whole font file + (*outputFunc)(outputStream, (char *)file, len); + return; + } + (*outputFunc)(outputStream, (char *)file, line - (char *)file); + + // write the new encoding + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + (*outputFunc)(outputStream, + "0 1 255 {1 index exch /.notdef put} for\n", 40); + for (i = 0; i < 256; ++i) { + if (newEncoding[i]) { + sprintf(buf, "dup %d /%s put\n", i, newEncoding[i]); + (*outputFunc)(outputStream, buf, strlen(buf)); + } + } + (*outputFunc)(outputStream, "readonly def\n", 13); + + // find the end of the encoding data + //~ this ought to parse PostScript tokens + if (!strncmp(line, "/Encoding StandardEncoding def", 30)) { + line = getNextLine(line); + } else { + // skip "/Encoding" + one whitespace char, + // then look for 'def' preceded by PostScript whitespace + p = line + 10; + line = NULL; + for (; p < (char *)file + len; ++p) { + if ((*p == ' ' || *p == '\t' || *p == '\x0a' || + *p == '\x0d' || *p == '\x0c' || *p == '\0') && + p + 4 <= (char *)file + len && + !strncmp(p + 1, "def", 3)) { + line = p + 4; + break; + } + } + } + + // some fonts have two /Encoding entries in their dictionary, so we + // check for a second one here + if (line) { + for (line2 = line, i = 0; + i < 20 && line2 && strncmp(line2, "/Encoding", 9); + line2 = getNextLine(line2), ++i) ; + if (i < 20 && line2) { + (*outputFunc)(outputStream, line, line2 - line); + if (!strncmp(line2, "/Encoding StandardEncoding def", 30)) { + line = getNextLine(line2); + } else { + // skip "/Encoding" + one whitespace char, + // then look for 'def' preceded by PostScript whitespace + p = line2 + 10; + line = NULL; + for (; p < (char *)file + len; ++p) { + if ((*p == ' ' || *p == '\t' || *p == '\x0a' || + *p == '\x0d' || *p == '\x0c' || *p == '\0') && + p + 4 <= (char *)file + len && + !strncmp(p + 1, "def", 3)) { + line = p + 4; + break; + } + } + } + } + + // copy everything after the encoding + if (line) { + (*outputFunc)(outputStream, line, ((char *)file + len) - line); + } + } +} + +char *FoFiType1::getNextLine(char *line) { + while (line < (char *)file + len && *line != '\x0a' && *line != '\x0d') { + ++line; + } + if (line < (char *)file + len && *line == '\x0d') { + ++line; + } + if (line < (char *)file + len && *line == '\x0a') { + ++line; + } + if (line >= (char *)file + len) { + return NULL; + } + return line; +} + +void FoFiType1::parse() { + char *line, *line1, *p, *p2; + char buf[256]; + char c; + int n, code, i, j; + + for (i = 1, line = (char *)file; + i <= 100 && line && (!name || !encoding); + ++i) { + + // get font name + if (!name && !strncmp(line, "/FontName", 9)) { + strncpy(buf, line, 255); + buf[255] = '\0'; + if ((p = strchr(buf+9, '/')) && + (p = strtok(p+1, " \t\n\r"))) { + name = copyString(p); + } + line = getNextLine(line); + + // get encoding + } else if (!encoding && + !strncmp(line, "/Encoding StandardEncoding def", 30)) { + encoding = fofiType1StandardEncoding; + } else if (!encoding && + !strncmp(line, "/Encoding 256 array", 19)) { + encoding = (char **)gmallocn(256, sizeof(char *)); + for (j = 0; j < 256; ++j) { + encoding[j] = NULL; + } + for (j = 0, line = getNextLine(line); + j < 300 && line && (line1 = getNextLine(line)); + ++j, line = line1) { + if ((n = line1 - line) > 255) { + n = 255; + } + strncpy(buf, line, n); + buf[n] = '\0'; + for (p = buf; *p == ' ' || *p == '\t'; ++p) ; + if (!strncmp(p, "dup", 3)) { + for (p += 3; *p == ' ' || *p == '\t'; ++p) ; + for (p2 = p; *p2 >= '0' && *p2 <= '9'; ++p2) ; + if (*p2) { + c = *p2; + *p2 = '\0'; + code = atoi(p); + *p2 = c; + if (code == 8 && *p2 == '#') { + code = 0; + for (++p2; *p2 >= '0' && *p2 <= '7'; ++p2) { + code = code * 8 + (*p2 - '0'); + } + } + if (code < 256) { + for (p = p2; *p == ' ' || *p == '\t'; ++p) ; + if (*p == '/') { + ++p; + for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ; + *p2 = '\0'; + encoding[code] = copyString(p); + } + } + } + } else { + if (strtok(buf, " \t") && + (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) { + break; + } + } + } + //~ check for getinterval/putinterval junk + + } else { + line = getNextLine(line); + } + } + + parsed = gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h new file mode 100644 index 000000000..843352b2a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h @@ -0,0 +1,59 @@ +//======================================================================== +// +// FoFiType1.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFITYPE1_H +#define FOFITYPE1_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "FoFiBase.h" + +//------------------------------------------------------------------------ +// FoFiType1 +//------------------------------------------------------------------------ + +class FoFiType1: public FoFiBase { +public: + + // Create a FoFiType1 object from a memory buffer. + static FoFiType1 *make(char *fileA, int lenA); + + // Create a FoFiType1 object from a file on disk. + static FoFiType1 *load(char *fileName); + + virtual ~FoFiType1(); + + // Return the font name. + char *getName(); + + // Return the encoding, as an array of 256 names (any of which may + // be NULL). + char **getEncoding(); + + // Write a version of the Type 1 font file with a new encoding. + void writeEncoded(char **newEncoding, + FoFiOutputFunc outputFunc, void *outputStream); + +private: + + FoFiType1(char *fileA, int lenA, GBool freeFileDataA); + + char *getNextLine(char *line); + void parse(); + + char *name; + char **encoding; + GBool parsed; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc new file mode 100644 index 000000000..3b28f3210 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc @@ -0,0 +1,2603 @@ +//======================================================================== +// +// FoFiType1C.cc +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "gmem.h" +#include "GString.h" +#include "FoFiEncodings.h" +#include "FoFiType1C.h" + +//------------------------------------------------------------------------ + +static char hexChars[17] = "0123456789ABCDEF"; + +//------------------------------------------------------------------------ +// FoFiType1C +//------------------------------------------------------------------------ + +FoFiType1C *FoFiType1C::make(char *fileA, int lenA) { + FoFiType1C *ff; + + ff = new FoFiType1C(fileA, lenA, gFalse); + if (!ff->parse()) { + delete ff; + return NULL; + } + return ff; +} + +FoFiType1C *FoFiType1C::load(char *fileName) { + FoFiType1C *ff; + char *fileA; + int lenA; + + if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { + return NULL; + } + ff = new FoFiType1C(fileA, lenA, gTrue); + if (!ff->parse()) { + delete ff; + return NULL; + } + return ff; +} + +FoFiType1C::FoFiType1C(char *fileA, int lenA, GBool freeFileDataA): + FoFiBase(fileA, lenA, freeFileDataA) +{ + name = NULL; + encoding = NULL; + privateDicts = NULL; + fdSelect = NULL; + charset = NULL; +} + +FoFiType1C::~FoFiType1C() { + int i; + + if (name) { + delete name; + } + if (encoding && + encoding != fofiType1StandardEncoding && + encoding != fofiType1ExpertEncoding) { + for (i = 0; i < 256; ++i) { + gfree(encoding[i]); + } + gfree(encoding); + } + if (privateDicts) { + gfree(privateDicts); + } + if (fdSelect) { + gfree(fdSelect); + } + if (charset && + charset != fofiType1CISOAdobeCharset && + charset != fofiType1CExpertCharset && + charset != fofiType1CExpertSubsetCharset) { + gfree(charset); + } +} + +char *FoFiType1C::getName() { + return name ? name->getCString() : (char *)NULL; +} + +char **FoFiType1C::getEncoding() { + return encoding; +} + +Gushort *FoFiType1C::getCIDToGIDMap(int *nCIDs) { + Gushort *map; + int n, i; + + // a CID font's top dict has ROS as the first operator + if (topDict.firstOp != 0x0c1e) { + *nCIDs = 0; + return NULL; + } + + // in a CID font, the charset data is the GID-to-CID mapping, so all + // we have to do is reverse it + n = 0; + for (i = 0; i < nGlyphs; ++i) { + if (charset[i] > n) { + n = charset[i]; + } + } + ++n; + map = (Gushort *)gmallocn(n, sizeof(Gushort)); + memset(map, 0, n * sizeof(Gushort)); + for (i = 0; i < nGlyphs; ++i) { + map[charset[i]] = i; + } + *nCIDs = n; + return map; +} + +void FoFiType1C::convertToType1(char *psName, char **newEncoding, GBool ascii, + FoFiOutputFunc outputFunc, + void *outputStream) { + int psNameLen; + Type1CEexecBuf eb; + Type1CIndex subrIdx; + Type1CIndexVal val; + GString *buf; + char buf2[256]; + char **enc; + GBool ok; + int i; + + if (psName) { + psNameLen = strlen(psName); + } else { + psName = name->getCString(); + psNameLen = name->getLength(); + } + + // write header and font dictionary, up to encoding + ok = gTrue; + (*outputFunc)(outputStream, "%!FontType1-1.0: ", 17); + (*outputFunc)(outputStream, psName, psNameLen); + if (topDict.versionSID != 0) { + getString(topDict.versionSID, buf2, &ok); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + } + (*outputFunc)(outputStream, "\n", 1); + // the dictionary needs room for 12 entries: the following 9, plus + // Private and CharStrings (in the eexec section) and FID (which is + // added by definefont) + (*outputFunc)(outputStream, "12 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontInfo 10 dict dup begin\n", 28); + if (topDict.versionSID != 0) { + (*outputFunc)(outputStream, "/version (", 10); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") readonly def\n", 15); + } + if (topDict.noticeSID != 0) { + getString(topDict.noticeSID, buf2, &ok); + (*outputFunc)(outputStream, "/Notice (", 9); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") readonly def\n", 15); + } + if (topDict.copyrightSID != 0) { + getString(topDict.copyrightSID, buf2, &ok); + (*outputFunc)(outputStream, "/Copyright (", 12); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") readonly def\n", 15); + } + if (topDict.fullNameSID != 0) { + getString(topDict.fullNameSID, buf2, &ok); + (*outputFunc)(outputStream, "/FullName (", 11); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") readonly def\n", 15); + } + if (topDict.familyNameSID != 0) { + getString(topDict.familyNameSID, buf2, &ok); + (*outputFunc)(outputStream, "/FamilyName (", 13); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") readonly def\n", 15); + } + if (topDict.weightSID != 0) { + getString(topDict.weightSID, buf2, &ok); + (*outputFunc)(outputStream, "/Weight (", 9); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") readonly def\n", 15); + } + if (topDict.isFixedPitch) { + (*outputFunc)(outputStream, "/isFixedPitch true def\n", 23); + } else { + (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24); + } + buf = GString::format("/ItalicAngle {0:.4g} def\n", topDict.italicAngle); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format("/UnderlinePosition {0:.4g} def\n", + topDict.underlinePosition); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format("/UnderlineThickness {0:.4g} def\n", + topDict.underlineThickness); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "end readonly def\n", 17); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, psNameLen); + (*outputFunc)(outputStream, " def\n", 5); + buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 1 def\n", 16); + buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] readonly def\n", + topDict.fontMatrix[0], topDict.fontMatrix[1], + topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] readonly def\n", + topDict.fontBBox[0], topDict.fontBBox[1], + topDict.fontBBox[2], topDict.fontBBox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (topDict.uniqueID != 0) { + buf = GString::format("/UniqueID {0:d} def\n", topDict.uniqueID); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + + // write the encoding + (*outputFunc)(outputStream, "/Encoding ", 10); + if (!newEncoding && encoding == fofiType1StandardEncoding) { + (*outputFunc)(outputStream, "StandardEncoding def\n", 21); + } else { + (*outputFunc)(outputStream, "256 array\n", 10); + (*outputFunc)(outputStream, + "0 1 255 {1 index exch /.notdef put} for\n", 40); + enc = newEncoding ? newEncoding : encoding; + for (i = 0; i < 256; ++i) { + if (enc[i]) { + buf = GString::format("dup {0:d} /{1:s} put\n", i, enc[i]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + (*outputFunc)(outputStream, "readonly def\n", 13); + } + (*outputFunc)(outputStream, "currentdict end\n", 16); + + // start the binary section + (*outputFunc)(outputStream, "currentfile eexec\n", 18); + eb.outputFunc = outputFunc; + eb.outputStream = outputStream; + eb.ascii = ascii; + eb.r1 = 55665; + eb.line = 0; + + // write the private dictionary + eexecWrite(&eb, "\x83\xca\x73\xd5"); + eexecWrite(&eb, "dup /Private 32 dict dup begin\n"); + eexecWrite(&eb, "/RD {string currentfile exch readstring pop}" + " executeonly def\n"); + eexecWrite(&eb, "/ND {noaccess def} executeonly def\n"); + eexecWrite(&eb, "/NP {noaccess put} executeonly def\n"); + eexecWrite(&eb, "/MinFeature {16 16} def\n"); + eexecWrite(&eb, "/password 5839 def\n"); + if (privateDicts[0].nBlueValues) { + eexecWrite(&eb, "/BlueValues ["); + for (i = 0; i < privateDicts[0].nBlueValues; ++i) { + buf = GString::format("{0:s}{1:d}", + i > 0 ? " " : "", privateDicts[0].blueValues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nOtherBlues) { + eexecWrite(&eb, "/OtherBlues ["); + for (i = 0; i < privateDicts[0].nOtherBlues; ++i) { + buf = GString::format("{0:s}{1:d}", + i > 0 ? " " : "", privateDicts[0].otherBlues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nFamilyBlues) { + eexecWrite(&eb, "/FamilyBlues ["); + for (i = 0; i < privateDicts[0].nFamilyBlues; ++i) { + buf = GString::format("{0:s}{1:d}", + i > 0 ? " " : "", privateDicts[0].familyBlues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nFamilyOtherBlues) { + eexecWrite(&eb, "/FamilyOtherBlues ["); + for (i = 0; i < privateDicts[0].nFamilyOtherBlues; ++i) { + buf = GString::format("{0:s}{1:d}", i > 0 ? " " : "", + privateDicts[0].familyOtherBlues[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].blueScale != 0.039625) { + buf = GString::format("/BlueScale {0:.4g} def\n", + privateDicts[0].blueScale); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].blueShift != 7) { + buf = GString::format("/BlueShift {0:d} def\n", privateDicts[0].blueShift); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].blueFuzz != 1) { + buf = GString::format("/BlueFuzz {0:d} def\n", privateDicts[0].blueFuzz); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].hasStdHW) { + buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[0].stdHW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].hasStdVW) { + buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[0].stdVW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].nStemSnapH) { + eexecWrite(&eb, "/StemSnapH ["); + for (i = 0; i < privateDicts[0].nStemSnapH; ++i) { + buf = GString::format("{0:s}{1:.4g}", + i > 0 ? " " : "", privateDicts[0].stemSnapH[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].nStemSnapV) { + eexecWrite(&eb, "/StemSnapV ["); + for (i = 0; i < privateDicts[0].nStemSnapV; ++i) { + buf = GString::format("{0:s}{1:.4g}", + i > 0 ? " " : "", privateDicts[0].stemSnapV[i]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[0].hasForceBold) { + buf = GString::format("/ForceBold {0:s} def\n", + privateDicts[0].forceBold ? "true" : "false"); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].forceBoldThreshold != 0) { + buf = GString::format("/ForceBoldThreshold {0:.4g} def\n", + privateDicts[0].forceBoldThreshold); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].languageGroup != 0) { + buf = GString::format("/LanguageGroup {0:d} def\n", + privateDicts[0].languageGroup); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[0].expansionFactor != 0.06) { + buf = GString::format("/ExpansionFactor {0:.4g} def\n", + privateDicts[0].expansionFactor); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + + // set up subroutines + ok = gTrue; + getIndex(privateDicts[0].subrsOffset, &subrIdx, &ok); + if (!ok) { + subrIdx.pos = -1; + } + + // write the CharStrings + buf = GString::format("2 index /CharStrings {0:d} dict dup begin\n", + nGlyphs); + eexecWrite(&eb, buf->getCString()); + delete buf; + for (i = 0; i < nGlyphs; ++i) { + ok = gTrue; + getIndexVal(&charStringsIdx, i, &val, &ok); + if (ok) { + getString(charset[i], buf2, &ok); + if (ok) { + eexecCvtGlyph(&eb, buf2, val.pos, val.len, &subrIdx, &privateDicts[0]); + } + } + } + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "readonly put\n"); + eexecWrite(&eb, "noaccess put\n"); + eexecWrite(&eb, "dup /FontName get exch definefont pop\n"); + eexecWrite(&eb, "mark currentfile closefile\n"); + + // trailer + if (ascii && eb.line > 0) { + (*outputFunc)(outputStream, "\n", 1); + } + for (i = 0; i < 8; ++i) { + (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); + } + (*outputFunc)(outputStream, "cleartomark\n", 12); +} + +void FoFiType1C::convertToCIDType0(char *psName, + FoFiOutputFunc outputFunc, + void *outputStream) { + int *cidMap; + GString *charStrings; + int *charStringOffsets; + Type1CIndex subrIdx; + Type1CIndexVal val; + int nCIDs, gdBytes; + GString *buf; + char buf2[256]; + GBool ok; + int gid, offset, n, i, j, k; + + // compute the CID count and build the CID-to-GID mapping + nCIDs = 0; + for (i = 0; i < nGlyphs; ++i) { + if (charset[i] >= nCIDs) { + nCIDs = charset[i] + 1; + } + } + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + cidMap[i] = -1; + } + for (i = 0; i < nGlyphs; ++i) { + cidMap[charset[i]] = i; + } + + // build the charstrings + charStrings = new GString(); + charStringOffsets = (int *)gmallocn(nCIDs + 1, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + charStringOffsets[i] = charStrings->getLength(); + if ((gid = cidMap[i]) >= 0) { + ok = gTrue; + getIndexVal(&charStringsIdx, gid, &val, &ok); + if (ok) { + getIndex(privateDicts[fdSelect[gid]].subrsOffset, &subrIdx, &ok); + if (!ok) { + subrIdx.pos = -1; + } + cvtGlyph(val.pos, val.len, charStrings, + &subrIdx, &privateDicts[fdSelect[gid]], gTrue); + } + } + } + charStringOffsets[nCIDs] = charStrings->getLength(); + + // compute gdBytes = number of bytes needed for charstring offsets + // (offset size needs to account for the charstring offset table, + // with a worst case of five bytes per entry, plus the charstrings + // themselves) + i = (nCIDs + 1) * 5 + charStrings->getLength(); + if (i < 0x100) { + gdBytes = 1; + } else if (i < 0x10000) { + gdBytes = 2; + } else if (i < 0x1000000) { + gdBytes = 3; + } else { + gdBytes = 4; + } + + // begin the font dictionary + (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37); + (*outputFunc)(outputStream, "20 dict begin\n", 14); + (*outputFunc)(outputStream, "/CIDFontName /", 14); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19); + (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); + if (topDict.registrySID > 0 && topDict.orderingSID > 0) { + ok = gTrue; + getString(topDict.registrySID, buf2, &ok); + if (ok) { + (*outputFunc)(outputStream, " /Registry (", 13); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") def\n", 6); + } + ok = gTrue; + getString(topDict.orderingSID, buf2, &ok); + if (ok) { + (*outputFunc)(outputStream, " /Ordering (", 13); + (*outputFunc)(outputStream, buf2, strlen(buf2)); + (*outputFunc)(outputStream, ") def\n", 6); + } + } else { + (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); + (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); + } + buf = GString::format(" /Supplement {0:d} def\n", topDict.supplement); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "end def\n", 8); + if (topDict.hasFontMatrix) { + buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + topDict.fontMatrix[0], topDict.fontMatrix[1], + topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else if (privateDicts[0].hasFontMatrix) { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } else { + (*outputFunc)(outputStream, + "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); + } + buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", + topDict.fontBBox[0], topDict.fontBBox[1], + topDict.fontBBox[2], topDict.fontBBox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27); + (*outputFunc)(outputStream, " /FSType 8 def\n", 16); + (*outputFunc)(outputStream, "end def\n", 8); + + // CIDFont-specific entries + buf = GString::format("/CIDCount {0:d} def\n", nCIDs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15); + buf = GString::format("/GDBytes {0:d} def\n", gdBytes); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20); + if (topDict.paintType != 0) { + buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + + // FDArray entry + buf = GString::format("/FDArray {0:d} array\n", nFDs); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + for (i = 0; i < nFDs; ++i) { + buf = GString::format("dup {0:d} 10 dict begin\n", i); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 1 def\n", 16); + if (privateDicts[i].hasFontMatrix) { + buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + privateDicts[i].fontMatrix[0], + privateDicts[i].fontMatrix[1], + privateDicts[i].fontMatrix[2], + privateDicts[i].fontMatrix[3], + privateDicts[i].fontMatrix[4], + privateDicts[i].fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23); + if (privateDicts[i].nBlueValues) { + (*outputFunc)(outputStream, "/BlueValues [", 13); + for (j = 0; j < privateDicts[i].nBlueValues; ++j) { + buf = GString::format("{0:s}{1:d}", + j > 0 ? " " : "", privateDicts[i].blueValues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nOtherBlues) { + (*outputFunc)(outputStream, "/OtherBlues [", 13); + for (j = 0; j < privateDicts[i].nOtherBlues; ++j) { + buf = GString::format("{0:s}{1:d}", + j > 0 ? " " : "", privateDicts[i].otherBlues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nFamilyBlues) { + (*outputFunc)(outputStream, "/FamilyBlues [", 14); + for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) { + buf = GString::format("{0:s}{1:d}", + j > 0 ? " " : "", + privateDicts[i].familyBlues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nFamilyOtherBlues) { + (*outputFunc)(outputStream, "/FamilyOtherBlues [", 19); + for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) { + buf = GString::format("{0:s}{1:d}", j > 0 ? " " : "", + privateDicts[i].familyOtherBlues[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].blueScale != 0.039625) { + buf = GString::format("/BlueScale {0:.4g} def\n", + privateDicts[i].blueScale); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].blueShift != 7) { + buf = GString::format("/BlueShift {0:d} def\n", + privateDicts[i].blueShift); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].blueFuzz != 1) { + buf = GString::format("/BlueFuzz {0:d} def\n", privateDicts[i].blueFuzz); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].hasStdHW) { + buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[i].stdHW); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].hasStdVW) { + buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[i].stdVW); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].nStemSnapH) { + (*outputFunc)(outputStream, "/StemSnapH [", 12); + for (j = 0; j < privateDicts[i].nStemSnapH; ++j) { + buf = GString::format("{0:s}{1:.4g}", + j > 0 ? " " : "", privateDicts[i].stemSnapH[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].nStemSnapV) { + (*outputFunc)(outputStream, "/StemSnapV [", 12); + for (j = 0; j < privateDicts[i].nStemSnapV; ++j) { + buf = GString::format("{0:s}{1:.4g}", + j > 0 ? " " : "", privateDicts[i].stemSnapV[j]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + } + if (privateDicts[i].hasForceBold) { + buf = GString::format("/ForceBold {0:s} def\n", + privateDicts[i].forceBold ? "true" : "false"); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].forceBoldThreshold != 0) { + buf = GString::format("/ForceBoldThreshold {0:.4g} def\n", + privateDicts[i].forceBoldThreshold); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].languageGroup != 0) { + buf = GString::format("/LanguageGroup {0:d} def\n", + privateDicts[i].languageGroup); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (privateDicts[i].expansionFactor != 0.06) { + buf = GString::format("/ExpansionFactor {0:.4g} def\n", + privateDicts[i].expansionFactor); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "currentdict end def\n", 20); + (*outputFunc)(outputStream, "currentdict end put\n", 20); + } + (*outputFunc)(outputStream, "def\n", 4); + + // start the binary section + offset = (nCIDs + 1) * (1 + gdBytes); + buf = GString::format("(Hex) {0:d} StartData\n", + offset + charStrings->getLength()); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + + // write the charstring offset (CIDMap) table + for (i = 0; i <= nCIDs; i += 6) { + for (j = 0; j < 6 && i+j <= nCIDs; ++j) { + if (i+j < nCIDs && cidMap[i+j] >= 0) { + buf2[0] = (char)fdSelect[cidMap[i+j]]; + } else { + buf2[0] = (char)0; + } + n = offset + charStringOffsets[i+j]; + for (k = gdBytes; k >= 1; --k) { + buf2[k] = (char)(n & 0xff); + n >>= 8; + } + for (k = 0; k <= gdBytes; ++k) { + buf = GString::format("{0:02x}", buf2[k] & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + } + (*outputFunc)(outputStream, "\n", 1); + } + + // write the charstring data + n = charStrings->getLength(); + for (i = 0; i < n; i += 32) { + for (j = 0; j < 32 && i+j < n; ++j) { + buf = GString::format("{0:02x}", charStrings->getChar(i+j) & 0xff); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (i + 32 >= n) { + (*outputFunc)(outputStream, ">", 1); + } + (*outputFunc)(outputStream, "\n", 1); + } + + gfree(charStringOffsets); + delete charStrings; + gfree(cidMap); +} + +void FoFiType1C::convertToType0(char *psName, + FoFiOutputFunc outputFunc, + void *outputStream) { + int *cidMap; + Type1CIndex subrIdx; + Type1CIndexVal val; + int nCIDs; + GString *buf; + Type1CEexecBuf eb; + GBool ok; + int fd, i, j, k; + + // compute the CID count and build the CID-to-GID mapping + nCIDs = 0; + for (i = 0; i < nGlyphs; ++i) { + if (charset[i] >= nCIDs) { + nCIDs = charset[i] + 1; + } + } + cidMap = (int *)gmallocn(nCIDs, sizeof(int)); + for (i = 0; i < nCIDs; ++i) { + cidMap[i] = -1; + } + for (i = 0; i < nGlyphs; ++i) { + cidMap[charset[i]] = i; + } + + // write the descendant Type 1 fonts + for (i = 0; i < nCIDs; i += 256) { + + //~ this assumes that all CIDs in this block have the same FD -- + //~ to handle multiple FDs correctly, need to somehow divide the + //~ font up by FD; as a kludge we ignore CID 0, which is .notdef + fd = 0; + for (j = i==0 ? 1 : 0; j < 256 && i+j < nCIDs; ++j) { + if (cidMap[i+j] >= 0) { + fd = fdSelect[cidMap[i+j]]; + break; + } + } + + // font dictionary (unencrypted section) + (*outputFunc)(outputStream, "16 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GString::format("_{0:02x} def\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + (*outputFunc)(outputStream, "/FontType 1 def\n", 16); + if (privateDicts[fd].hasFontMatrix) { + buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + privateDicts[fd].fontMatrix[0], + privateDicts[fd].fontMatrix[1], + privateDicts[fd].fontMatrix[2], + privateDicts[fd].fontMatrix[3], + privateDicts[fd].fontMatrix[4], + privateDicts[fd].fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else if (topDict.hasFontMatrix) { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } else { + (*outputFunc)(outputStream, + "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); + } + buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", + topDict.fontBBox[0], topDict.fontBBox[1], + topDict.fontBBox[2], topDict.fontBBox[3]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + if (topDict.paintType != 0) { + buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); + for (j = 0; j < 256 && i+j < nCIDs; ++j) { + buf = GString::format("dup {0:d} /c{1:02x} put\n", j, j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + if (j < 256) { + buf = GString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n", + j); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "readonly def\n", 13); + (*outputFunc)(outputStream, "currentdict end\n", 16); + + // start the binary section + (*outputFunc)(outputStream, "currentfile eexec\n", 18); + eb.outputFunc = outputFunc; + eb.outputStream = outputStream; + eb.ascii = gTrue; + eb.r1 = 55665; + eb.line = 0; + + // start the private dictionary + eexecWrite(&eb, "\x83\xca\x73\xd5"); + eexecWrite(&eb, "dup /Private 32 dict dup begin\n"); + eexecWrite(&eb, "/RD {string currentfile exch readstring pop}" + " executeonly def\n"); + eexecWrite(&eb, "/ND {noaccess def} executeonly def\n"); + eexecWrite(&eb, "/NP {noaccess put} executeonly def\n"); + eexecWrite(&eb, "/MinFeature {16 16} def\n"); + eexecWrite(&eb, "/password 5839 def\n"); + if (privateDicts[fd].nBlueValues) { + eexecWrite(&eb, "/BlueValues ["); + for (k = 0; k < privateDicts[fd].nBlueValues; ++k) { + buf = GString::format("{0:s}{1:d}", + k > 0 ? " " : "", + privateDicts[fd].blueValues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nOtherBlues) { + eexecWrite(&eb, "/OtherBlues ["); + for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) { + buf = GString::format("{0:s}{1:d}", + k > 0 ? " " : "", + privateDicts[fd].otherBlues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nFamilyBlues) { + eexecWrite(&eb, "/FamilyBlues ["); + for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) { + buf = GString::format("{0:s}{1:d}", k > 0 ? " " : "", + privateDicts[fd].familyBlues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nFamilyOtherBlues) { + eexecWrite(&eb, "/FamilyOtherBlues ["); + for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) { + buf = GString::format("{0:s}{1:d}", k > 0 ? " " : "", + privateDicts[fd].familyOtherBlues[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].blueScale != 0.039625) { + buf = GString::format("/BlueScale {0:.4g} def\n", + privateDicts[fd].blueScale); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].blueShift != 7) { + buf = GString::format("/BlueShift {0:d} def\n", + privateDicts[fd].blueShift); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].blueFuzz != 1) { + buf = GString::format("/BlueFuzz {0:d} def\n", + privateDicts[fd].blueFuzz); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].hasStdHW) { + buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].hasStdVW) { + buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].nStemSnapH) { + eexecWrite(&eb, "/StemSnapH ["); + for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) { + buf = GString::format("{0:s}{1:.4g}", + k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].nStemSnapV) { + eexecWrite(&eb, "/StemSnapV ["); + for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) { + buf = GString::format("{0:s}{1:.4g}", + k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + eexecWrite(&eb, "] def\n"); + } + if (privateDicts[fd].hasForceBold) { + buf = GString::format("/ForceBold {0:s} def\n", + privateDicts[fd].forceBold ? "true" : "false"); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].forceBoldThreshold != 0) { + buf = GString::format("/ForceBoldThreshold {0:.4g} def\n", + privateDicts[fd].forceBoldThreshold); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].languageGroup != 0) { + buf = GString::format("/LanguageGroup {0:d} def\n", + privateDicts[fd].languageGroup); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + if (privateDicts[fd].expansionFactor != 0.06) { + buf = GString::format("/ExpansionFactor {0:.4g} def\n", + privateDicts[fd].expansionFactor); + eexecWrite(&eb, buf->getCString()); + delete buf; + } + + // set up the subroutines + ok = gTrue; + getIndex(privateDicts[fd].subrsOffset, &subrIdx, &ok); + if (!ok) { + subrIdx.pos = -1; + } + + // start the CharStrings + eexecWrite(&eb, "2 index /CharStrings 256 dict dup begin\n"); + + // write the .notdef CharString + ok = gTrue; + getIndexVal(&charStringsIdx, 0, &val, &ok); + if (ok) { + eexecCvtGlyph(&eb, ".notdef", val.pos, val.len, + &subrIdx, &privateDicts[fd]); + } + + // write the CharStrings + for (j = 0; j < 256 && i+j < nCIDs; ++j) { + if (cidMap[i+j] >= 0) { + ok = gTrue; + getIndexVal(&charStringsIdx, cidMap[i+j], &val, &ok); + if (ok) { + buf = GString::format("c{0:02x}", j); + eexecCvtGlyph(&eb, buf->getCString(), val.pos, val.len, + &subrIdx, &privateDicts[fd]); + delete buf; + } + } + } + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "end\n"); + eexecWrite(&eb, "readonly put\n"); + eexecWrite(&eb, "noaccess put\n"); + eexecWrite(&eb, "dup /FontName get exch definefont pop\n"); + eexecWrite(&eb, "mark currentfile closefile\n"); + + // trailer + if (eb.line > 0) { + (*outputFunc)(outputStream, "\n", 1); + } + for (j = 0; j < 8; ++j) { + (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); + } + (*outputFunc)(outputStream, "cleartomark\n", 12); + } + + // write the Type 0 parent font + (*outputFunc)(outputStream, "16 dict begin\n", 14); + (*outputFunc)(outputStream, "/FontName /", 11); + (*outputFunc)(outputStream, psName, strlen(psName)); + (*outputFunc)(outputStream, " def\n", 5); + (*outputFunc)(outputStream, "/FontType 0 def\n", 16); + if (topDict.hasFontMatrix) { + buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", + topDict.fontMatrix[0], topDict.fontMatrix[1], + topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } else { + (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); + } + (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); + (*outputFunc)(outputStream, "/Encoding [\n", 12); + for (i = 0; i < nCIDs; i += 256) { + buf = GString::format("{0:d}\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "/FDepVector [\n", 14); + for (i = 0; i < nCIDs; i += 256) { + (*outputFunc)(outputStream, "/", 1); + (*outputFunc)(outputStream, psName, strlen(psName)); + buf = GString::format("_{0:02x} findfont\n", i >> 8); + (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); + delete buf; + } + (*outputFunc)(outputStream, "] def\n", 6); + (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); + + gfree(cidMap); +} + +void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName, + int offset, int nBytes, + Type1CIndex *subrIdx, + Type1CPrivateDict *pDict) { + GString *buf; + GString *charBuf; + + // generate the charstring + charBuf = new GString(); + cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, gTrue); + + buf = GString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength()); + eexecWrite(eb, buf->getCString()); + delete buf; + eexecWriteCharstring(eb, (Guchar *)charBuf->getCString(), + charBuf->getLength()); + eexecWrite(eb, " ND\n"); + + delete charBuf; +} + +void FoFiType1C::cvtGlyph(int offset, int nBytes, GString *charBuf, + Type1CIndex *subrIdx, Type1CPrivateDict *pDict, + GBool top) { + Type1CIndexVal val; + GBool ok, dFP; + double d, dx, dy; + Gushort r2; + Guchar byte; + int pos, subrBias, start, i, k; + + start = charBuf->getLength(); + if (top) { + charBuf->append((char)73); + charBuf->append((char)58); + charBuf->append((char)147); + charBuf->append((char)134); + nOps = 0; + nHints = 0; + firstOp = gTrue; + openPath = gFalse; + } + + pos = offset; + while (pos < offset + nBytes) { + ok = gTrue; + pos = getOp(pos, gTrue, &ok); + if (!ok) { + break; + } + if (!ops[nOps - 1].isNum) { + --nOps; // drop the operator + switch (ops[nOps].op) { + case 0x0001: // hstem + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps); + } + d = 0; + dFP = gFalse; + for (k = 0; k < nOps; k += 2) { + // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints + if (ops[k+1].num < 0) { + d += ops[k].num + ops[k+1].num; + dFP |= ops[k].isFP | ops[k+1].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf); + } else { + d += ops[k].num; + dFP |= ops[k].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + d += ops[k+1].num; + dFP |= ops[k+1].isFP; + } + charBuf->append((char)1); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0003: // vstem + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps); + } + d = 0; + dFP = gFalse; + for (k = 0; k < nOps; k += 2) { + // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints + if (ops[k+1].num < 0) { + d += ops[k].num + ops[k+1].num; + dFP |= ops[k].isFP | ops[k+1].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf); + } else { + d += ops[k].num; + dFP |= ops[k].isFP; + cvtNum(d, dFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + d += ops[k+1].num; + dFP |= ops[k+1].isFP; + } + charBuf->append((char)3); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0004: // vmoveto + if (firstOp) { + cvtGlyphWidth(nOps == 2, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps != 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + charBuf->append((char)4); + nOps = 0; + break; + case 0x0005: // rlineto + if (nOps < 2 || nOps % 2 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps); + } + for (k = 0; k < nOps; k += 2) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + charBuf->append((char)5); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0006: // hlineto + if (nOps < 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps); + } + for (k = 0; k < nOps; ++k) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + charBuf->append((char)((k & 1) ? 7 : 6)); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0007: // vlineto + if (nOps < 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps); + } + for (k = 0; k < nOps; ++k) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + charBuf->append((char)((k & 1) ? 6 : 7)); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0008: // rrcurveto + if (nOps < 6 || nOps % 6 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps); + } + for (k = 0; k < nOps; k += 6) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x000a: // callsubr + if (nOps >= 1) { + subrBias = (subrIdx->len < 1240) + ? 107 : (subrIdx->len < 33900) ? 1131 : 32768; + k = subrBias + (int)ops[nOps - 1].num; + --nOps; + ok = gTrue; + getIndexVal(subrIdx, k, &val, &ok); + if (ok) { + cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse); + } + } else { + //~ error(-1, "Too few args to Type 2 callsubr"); + } + // don't clear the stack + break; + case 0x000b: // return + // don't clear the stack + break; + case 0x000e: // endchar / seac + if (firstOp) { + cvtGlyphWidth(nOps == 1 || nOps == 5, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps == 4) { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + charBuf->append((char)12)->append((char)6); + } else if (nOps == 0) { + charBuf->append((char)14); + } else { + //~ error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps); + } + nOps = 0; + break; + case 0x000f: // (obsolete) + // this op is ignored, but we need the glyph width + if (firstOp) { + cvtGlyphWidth(nOps > 0, charBuf, pDict); + firstOp = gFalse; + } + nOps = 0; + break; + case 0x0010: // blend + //~ error(-1, "Unimplemented Type 2 charstring op: %d", file[i]); + nOps = 0; + break; + case 0x0012: // hstemhm + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0013: // hintmask + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps > 0) { + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm", + //~ nOps); + } + nHints += nOps / 2; + } + pos += (nHints + 7) >> 3; + nOps = 0; + break; + case 0x0014: // cntrmask + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps > 0) { + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm", + //~ nOps); + } + nHints += nOps / 2; + } + pos += (nHints + 7) >> 3; + nOps = 0; + break; + case 0x0015: // rmoveto + if (firstOp) { + cvtGlyphWidth(nOps == 3, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps != 2) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + charBuf->append((char)21); + nOps = 0; + break; + case 0x0016: // hmoveto + if (firstOp) { + cvtGlyphWidth(nOps == 2, charBuf, pDict); + firstOp = gFalse; + } + if (openPath) { + charBuf->append((char)9); + openPath = gFalse; + } + if (nOps != 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + charBuf->append((char)22); + nOps = 0; + break; + case 0x0017: // vstemhm + // ignored + if (firstOp) { + cvtGlyphWidth(nOps & 1, charBuf, pDict); + firstOp = gFalse; + } + if (nOps & 1) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps); + } + nHints += nOps / 2; + nOps = 0; + break; + case 0x0018: // rcurveline + if (nOps < 8 || (nOps - 2) % 6 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps); + } + for (k = 0; k < nOps - 2; k += 6) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); + charBuf->append((char)8); + } + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k].isFP, charBuf); + charBuf->append((char)5); + nOps = 0; + openPath = gTrue; + break; + case 0x0019: // rlinecurve + if (nOps < 8 || (nOps - 6) % 2 != 0) { + //~ error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps); + } + for (k = 0; k < nOps - 6; k += 2) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k].isFP, charBuf); + charBuf->append((char)5); + } + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x001a: // vvcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps); + } + if (nOps % 2 == 1) { + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + charBuf->append((char)8); + k = 5; + } else { + k = 0; + } + for (; k < nOps; k += 4) { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x001b: // hhcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps); + } + if (nOps % 2 == 1) { + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + k = 5; + } else { + k = 0; + } + for (; k < nOps; k += 4) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x001d: // callgsubr + if (nOps >= 1) { + k = gsubrBias + (int)ops[nOps - 1].num; + --nOps; + ok = gTrue; + getIndexVal(&gsubrIdx, k, &val, &ok); + if (ok) { + cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse); + } + } else { + //~ error(-1, "Too few args to Type 2 callgsubr"); + } + // don't clear the stack + break; + case 0x001e: // vhcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps); + } + for (k = 0; k < nOps && k != nOps-5; k += 4) { + if (k % 8 == 0) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)30); + } else { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)31); + } + } + if (k == nOps-5) { + if (k % 8 == 0) { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + } else { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + } + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x001f: // hvcurveto + if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps); + } + for (k = 0; k < nOps && k != nOps-5; k += 4) { + if (k % 8 == 0) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)31); + } else { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + charBuf->append((char)30); + } + } + if (k == nOps-5) { + if (k % 8 == 0) { + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + } else { + cvtNum(0, gFalse, charBuf); + cvtNum(ops[k].num, ops[k].isFP, charBuf); + cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); + cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); + cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); + cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); + } + charBuf->append((char)8); + } + nOps = 0; + openPath = gTrue; + break; + case 0x0c00: // dotsection (should be Type 1 only?) + // ignored + nOps = 0; + break; + case 0x0c03: // and + case 0x0c04: // or + case 0x0c05: // not + case 0x0c08: // store + case 0x0c09: // abs + case 0x0c0a: // add + case 0x0c0b: // sub + case 0x0c0c: // div + case 0x0c0d: // load + case 0x0c0e: // neg + case 0x0c0f: // eq + case 0x0c12: // drop + case 0x0c14: // put + case 0x0c15: // get + case 0x0c16: // ifelse + case 0x0c17: // random + case 0x0c18: // mul + case 0x0c1a: // sqrt + case 0x0c1b: // dup + case 0x0c1c: // exch + case 0x0c1d: // index + case 0x0c1e: // roll + //~ error(-1, "Unimplemented Type 2 charstring op: 12.%d", file[i+1]); + nOps = 0; + break; + case 0x0c22: // hflex + if (nOps != 7) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hflex", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + cvtNum(-ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x0c23: // flex + if (nOps != 13) { + //~ error(-1, "Wrong number of args (%d) to Type 2 flex", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + charBuf->append((char)8); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(ops[7].num, ops[7].isFP, charBuf); + cvtNum(ops[8].num, ops[8].isFP, charBuf); + cvtNum(ops[9].num, ops[9].isFP, charBuf); + cvtNum(ops[10].num, ops[10].isFP, charBuf); + cvtNum(ops[11].num, ops[11].isFP, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x0c24: // hflex1 + if (nOps != 9) { + //~ error(-1, "Wrong number of args (%d) to Type 2 hflex1", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + charBuf->append((char)8); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + cvtNum(0, gFalse, charBuf); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(ops[7].num, ops[7].isFP, charBuf); + cvtNum(ops[8].num, ops[8].isFP, charBuf); + cvtNum(-(ops[1].num + ops[3].num + ops[7].num), + ops[1].isFP | ops[3].isFP | ops[7].isFP, charBuf); + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + case 0x0c25: // flex1 + if (nOps != 11) { + //~ error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps); + } + cvtNum(ops[0].num, ops[0].isFP, charBuf); + cvtNum(ops[1].num, ops[1].isFP, charBuf); + cvtNum(ops[2].num, ops[2].isFP, charBuf); + cvtNum(ops[3].num, ops[3].isFP, charBuf); + cvtNum(ops[4].num, ops[4].isFP, charBuf); + cvtNum(ops[5].num, ops[5].isFP, charBuf); + charBuf->append((char)8); + cvtNum(ops[6].num, ops[6].isFP, charBuf); + cvtNum(ops[7].num, ops[7].isFP, charBuf); + cvtNum(ops[8].num, ops[8].isFP, charBuf); + cvtNum(ops[9].num, ops[9].isFP, charBuf); + dx = ops[0].num + ops[2].num + ops[4].num + ops[6].num + ops[8].num; + dy = ops[1].num + ops[3].num + ops[5].num + ops[7].num + ops[9].num; + if (fabs(dx) > fabs(dy)) { + cvtNum(ops[10].num, ops[10].isFP, charBuf); + cvtNum(-dy, ops[1].isFP | ops[3].isFP | ops[5].isFP | + ops[7].isFP | ops[9].isFP, charBuf); + } else { + cvtNum(-dx, ops[0].isFP | ops[2].isFP | ops[4].isFP | + ops[6].isFP | ops[8].isFP, charBuf); + cvtNum(ops[10].num, ops[10].isFP, charBuf); + } + charBuf->append((char)8); + nOps = 0; + openPath = gTrue; + break; + default: + //~ error(-1, "Illegal Type 2 charstring op: %04x", + //~ ops[nOps].op); + nOps = 0; + break; + } + } + } + + // charstring encryption + if (top) { + r2 = 4330; + for (i = start; i < charBuf->getLength(); ++i) { + byte = charBuf->getChar(i) ^ (r2 >> 8); + charBuf->setChar(i, byte); + r2 = (byte + r2) * 52845 + 22719; + } + } +} + +void FoFiType1C::cvtGlyphWidth(GBool useOp, GString *charBuf, + Type1CPrivateDict *pDict) { + double w; + GBool wFP; + int i; + + if (useOp) { + w = pDict->nominalWidthX + ops[0].num; + wFP = pDict->nominalWidthXFP | ops[0].isFP; + for (i = 1; i < nOps; ++i) { + ops[i-1] = ops[i]; + } + --nOps; + } else { + w = pDict->defaultWidthX; + wFP = pDict->defaultWidthXFP; + } + cvtNum(0, gFalse, charBuf); + cvtNum(w, wFP, charBuf); + charBuf->append((char)13); +} + +void FoFiType1C::cvtNum(double x, GBool isFP, GString *charBuf) { + Guchar buf[12]; + int y, n; + + n = 0; + if (isFP) { + if (x >= -32768 && x < 32768) { + y = (int)(x * 256.0); + buf[0] = 255; + buf[1] = (Guchar)(y >> 24); + buf[2] = (Guchar)(y >> 16); + buf[3] = (Guchar)(y >> 8); + buf[4] = (Guchar)y; + buf[5] = 255; + buf[6] = 0; + buf[7] = 0; + buf[8] = 1; + buf[9] = 0; + buf[10] = 12; + buf[11] = 12; + n = 12; + } else { + //~ error(-1, "Type 2 fixed point constant out of range"); + } + } else { + y = (int)x; + if (y >= -107 && y <= 107) { + buf[0] = (Guchar)(y + 139); + n = 1; + } else if (y > 107 && y <= 1131) { + y -= 108; + buf[0] = (Guchar)((y >> 8) + 247); + buf[1] = (Guchar)(y & 0xff); + n = 2; + } else if (y < -107 && y >= -1131) { + y = -y - 108; + buf[0] = (Guchar)((y >> 8) + 251); + buf[1] = (Guchar)(y & 0xff); + n = 2; + } else { + buf[0] = 255; + buf[1] = (Guchar)(y >> 24); + buf[2] = (Guchar)(y >> 16); + buf[3] = (Guchar)(y >> 8); + buf[4] = (Guchar)y; + n = 5; + } + } + charBuf->append((char *)buf, n); +} + +void FoFiType1C::eexecWrite(Type1CEexecBuf *eb, char *s) { + Guchar *p; + Guchar x; + + for (p = (Guchar *)s; *p; ++p) { + x = *p ^ (eb->r1 >> 8); + eb->r1 = (x + eb->r1) * 52845 + 22719; + if (eb->ascii) { + (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1); + (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1); + eb->line += 2; + if (eb->line == 64) { + (*eb->outputFunc)(eb->outputStream, "\n", 1); + eb->line = 0; + } + } else { + (*eb->outputFunc)(eb->outputStream, (char *)&x, 1); + } + } +} + +void FoFiType1C::eexecWriteCharstring(Type1CEexecBuf *eb, + Guchar *s, int n) { + Guchar x; + int i; + + // eexec encryption + for (i = 0; i < n; ++i) { + x = s[i] ^ (eb->r1 >> 8); + eb->r1 = (x + eb->r1) * 52845 + 22719; + if (eb->ascii) { + (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1); + (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1); + eb->line += 2; + if (eb->line == 64) { + (*eb->outputFunc)(eb->outputStream, "\n", 1); + eb->line = 0; + } + } else { + (*eb->outputFunc)(eb->outputStream, (char *)&x, 1); + } + } +} + +GBool FoFiType1C::parse() { + Type1CIndex fdIdx; + Type1CIndexVal val; + int i; + + parsedOk = gTrue; + + // some tools embed Type 1C fonts with an extra whitespace char at + // the beginning + if (len > 0 && file[0] != '\x01') { + ++file; + --len; + } + + // find the indexes + getIndex(getU8(2, &parsedOk), &nameIdx, &parsedOk); + getIndex(nameIdx.endPos, &topDictIdx, &parsedOk); + getIndex(topDictIdx.endPos, &stringIdx, &parsedOk); + getIndex(stringIdx.endPos, &gsubrIdx, &parsedOk); + if (!parsedOk) { + return gFalse; + } + gsubrBias = (gsubrIdx.len < 1240) ? 107 + : (gsubrIdx.len < 33900) ? 1131 : 32768; + + // read the first font name + getIndexVal(&nameIdx, 0, &val, &parsedOk); + if (!parsedOk) { + return gFalse; + } + name = new GString((char *)&file[val.pos], val.len); + + // read the top dict for the first font + readTopDict(); + + // for CID fonts: read the FDArray dicts and private dicts + if (topDict.firstOp == 0x0c1e) { + if (topDict.fdArrayOffset == 0) { + nFDs = 1; + privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict)); + readPrivateDict(0, 0, &privateDicts[0]); + } else { + getIndex(topDict.fdArrayOffset, &fdIdx, &parsedOk); + if (!parsedOk) { + return gFalse; + } + nFDs = fdIdx.len; + privateDicts = (Type1CPrivateDict *) + gmallocn(nFDs, sizeof(Type1CPrivateDict)); + for (i = 0; i < nFDs; ++i) { + getIndexVal(&fdIdx, i, &val, &parsedOk); + if (!parsedOk) { + return gFalse; + } + readFD(val.pos, val.len, &privateDicts[i]); + } + } + + // for 8-bit fonts: read the private dict + } else { + privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict)); + readPrivateDict(topDict.privateOffset, topDict.privateSize, + &privateDicts[0]); + } + + // check for parse errors in the private dict(s) + if (!parsedOk) { + return gFalse; + } + + // get the charstrings index + if (topDict.charStringsOffset <= 0) { + parsedOk = gFalse; + return gFalse; + } + getIndex(topDict.charStringsOffset, &charStringsIdx, &parsedOk); + if (!parsedOk) { + return gFalse; + } + nGlyphs = charStringsIdx.len; + + // for CID fonts: read the FDSelect table + if (topDict.firstOp == 0x0c1e) { + readFDSelect(); + if (!parsedOk) { + return gFalse; + } + } + + // read the charset + if (!readCharset()) { + parsedOk = gFalse; + return gFalse; + } + + // for 8-bit fonts: build the encoding + if (topDict.firstOp != 0x0c14 && topDict.firstOp != 0x0c1e) { + buildEncoding(); + if (!parsedOk) { + return gFalse; + } + } + + return parsedOk; +} + +void FoFiType1C::readTopDict() { + Type1CIndexVal topDictPtr; + int pos; + + topDict.firstOp = -1; + topDict.versionSID = 0; + topDict.noticeSID = 0; + topDict.copyrightSID = 0; + topDict.fullNameSID = 0; + topDict.familyNameSID = 0; + topDict.weightSID = 0; + topDict.isFixedPitch = 0; + topDict.italicAngle = 0; + topDict.underlinePosition = -100; + topDict.underlineThickness = 50; + topDict.paintType = 0; + topDict.charstringType = 2; + topDict.fontMatrix[0] = 0.001; + topDict.fontMatrix[1] = 0; + topDict.fontMatrix[2] = 0; + topDict.fontMatrix[3] = 0.001; + topDict.fontMatrix[4] = 0; + topDict.fontMatrix[5] = 0; + topDict.hasFontMatrix = gFalse; + topDict.uniqueID = 0; + topDict.fontBBox[0] = 0; + topDict.fontBBox[1] = 0; + topDict.fontBBox[2] = 0; + topDict.fontBBox[3] = 0; + topDict.strokeWidth = 0; + topDict.charsetOffset = 0; + topDict.encodingOffset = 0; + topDict.charStringsOffset = 0; + topDict.privateSize = 0; + topDict.privateOffset = 0; + topDict.registrySID = 0; + topDict.orderingSID = 0; + topDict.supplement = 0; + topDict.fdArrayOffset = 0; + topDict.fdSelectOffset = 0; + + getIndexVal(&topDictIdx, 0, &topDictPtr, &parsedOk); + pos = topDictPtr.pos; + nOps = 0; + while (pos < topDictPtr.pos + topDictPtr.len) { + pos = getOp(pos, gFalse, &parsedOk); + if (!parsedOk) { + break; + } + if (!ops[nOps - 1].isNum) { + --nOps; // drop the operator + if (topDict.firstOp < 0) { + topDict.firstOp = ops[nOps].op; + } + switch (ops[nOps].op) { + case 0x0000: topDict.versionSID = (int)ops[0].num; break; + case 0x0001: topDict.noticeSID = (int)ops[0].num; break; + case 0x0c00: topDict.copyrightSID = (int)ops[0].num; break; + case 0x0002: topDict.fullNameSID = (int)ops[0].num; break; + case 0x0003: topDict.familyNameSID = (int)ops[0].num; break; + case 0x0004: topDict.weightSID = (int)ops[0].num; break; + case 0x0c01: topDict.isFixedPitch = (int)ops[0].num; break; + case 0x0c02: topDict.italicAngle = ops[0].num; break; + case 0x0c03: topDict.underlinePosition = ops[0].num; break; + case 0x0c04: topDict.underlineThickness = ops[0].num; break; + case 0x0c05: topDict.paintType = (int)ops[0].num; break; + case 0x0c06: topDict.charstringType = (int)ops[0].num; break; + case 0x0c07: topDict.fontMatrix[0] = ops[0].num; + topDict.fontMatrix[1] = ops[1].num; + topDict.fontMatrix[2] = ops[2].num; + topDict.fontMatrix[3] = ops[3].num; + topDict.fontMatrix[4] = ops[4].num; + topDict.fontMatrix[5] = ops[5].num; + topDict.hasFontMatrix = gTrue; break; + case 0x000d: topDict.uniqueID = (int)ops[0].num; break; + case 0x0005: topDict.fontBBox[0] = ops[0].num; + topDict.fontBBox[1] = ops[1].num; + topDict.fontBBox[2] = ops[2].num; + topDict.fontBBox[3] = ops[3].num; break; + case 0x0c08: topDict.strokeWidth = ops[0].num; break; + case 0x000f: topDict.charsetOffset = (int)ops[0].num; break; + case 0x0010: topDict.encodingOffset = (int)ops[0].num; break; + case 0x0011: topDict.charStringsOffset = (int)ops[0].num; break; + case 0x0012: topDict.privateSize = (int)ops[0].num; + topDict.privateOffset = (int)ops[1].num; break; + case 0x0c1e: topDict.registrySID = (int)ops[0].num; + topDict.orderingSID = (int)ops[1].num; + topDict.supplement = (int)ops[2].num; break; + case 0x0c24: topDict.fdArrayOffset = (int)ops[0].num; break; + case 0x0c25: topDict.fdSelectOffset = (int)ops[0].num; break; + } + nOps = 0; + } + } +} + +// Read a CID font dict (FD) - this pulls out the private dict +// pointer, and reads the private dict. It also pulls the FontMatrix +// (if any) out of the FD. +void FoFiType1C::readFD(int offset, int length, Type1CPrivateDict *pDict) { + int pos, pSize, pOffset; + double fontMatrix[6]; + GBool hasFontMatrix; + + hasFontMatrix = gFalse; + pSize = pOffset = 0; + pos = offset; + nOps = 0; + while (pos < offset + length) { + pos = getOp(pos, gFalse, &parsedOk); + if (!parsedOk) { + return; + } + if (!ops[nOps - 1].isNum) { + if (ops[nOps - 1].op == 0x0012) { + if (nOps < 3) { + parsedOk = gFalse; + return; + } + pSize = (int)ops[0].num; + pOffset = (int)ops[1].num; + break; + } else if (ops[nOps - 1].op == 0x0c07) { + fontMatrix[0] = ops[0].num; + fontMatrix[1] = ops[1].num; + fontMatrix[2] = ops[2].num; + fontMatrix[3] = ops[3].num; + fontMatrix[4] = ops[4].num; + fontMatrix[5] = ops[5].num; + hasFontMatrix = gTrue; + } + nOps = 0; + } + } + readPrivateDict(pOffset, pSize, pDict); + if (hasFontMatrix) { + pDict->fontMatrix[0] = fontMatrix[0]; + pDict->fontMatrix[1] = fontMatrix[1]; + pDict->fontMatrix[2] = fontMatrix[2]; + pDict->fontMatrix[3] = fontMatrix[3]; + pDict->fontMatrix[4] = fontMatrix[4]; + pDict->fontMatrix[5] = fontMatrix[5]; + pDict->hasFontMatrix = gTrue; + } +} + +void FoFiType1C::readPrivateDict(int offset, int length, + Type1CPrivateDict *pDict) { + int pos; + + pDict->hasFontMatrix = gFalse; + pDict->nBlueValues = 0; + pDict->nOtherBlues = 0; + pDict->nFamilyBlues = 0; + pDict->nFamilyOtherBlues = 0; + pDict->blueScale = 0.039625; + pDict->blueShift = 7; + pDict->blueFuzz = 1; + pDict->hasStdHW = gFalse; + pDict->hasStdVW = gFalse; + pDict->nStemSnapH = 0; + pDict->nStemSnapV = 0; + pDict->hasForceBold = gFalse; + pDict->forceBoldThreshold = 0; + pDict->languageGroup = 0; + pDict->expansionFactor = 0.06; + pDict->initialRandomSeed = 0; + pDict->subrsOffset = 0; + pDict->defaultWidthX = 0; + pDict->defaultWidthXFP = gFalse; + pDict->nominalWidthX = 0; + pDict->nominalWidthXFP = gFalse; + + // no dictionary + if (offset == 0 || length == 0) { + return; + } + + pos = offset; + nOps = 0; + while (pos < offset + length) { + pos = getOp(pos, gFalse, &parsedOk); + if (!parsedOk) { + break; + } + if (!ops[nOps - 1].isNum) { + --nOps; // drop the operator + switch (ops[nOps].op) { + case 0x0006: + pDict->nBlueValues = getDeltaIntArray(pDict->blueValues, + type1CMaxBlueValues); + break; + case 0x0007: + pDict->nOtherBlues = getDeltaIntArray(pDict->otherBlues, + type1CMaxOtherBlues); + break; + case 0x0008: + pDict->nFamilyBlues = getDeltaIntArray(pDict->familyBlues, + type1CMaxBlueValues); + break; + case 0x0009: + pDict->nFamilyOtherBlues = getDeltaIntArray(pDict->familyOtherBlues, + type1CMaxOtherBlues); + break; + case 0x0c09: + pDict->blueScale = ops[0].num; + break; + case 0x0c0a: + pDict->blueShift = (int)ops[0].num; + break; + case 0x0c0b: + pDict->blueFuzz = (int)ops[0].num; + break; + case 0x000a: + pDict->stdHW = ops[0].num; + pDict->hasStdHW = gTrue; + break; + case 0x000b: + pDict->stdVW = ops[0].num; + pDict->hasStdVW = gTrue; + break; + case 0x0c0c: + pDict->nStemSnapH = getDeltaFPArray(pDict->stemSnapH, + type1CMaxStemSnap); + break; + case 0x0c0d: + pDict->nStemSnapV = getDeltaFPArray(pDict->stemSnapV, + type1CMaxStemSnap); + break; + case 0x0c0e: + pDict->forceBold = ops[0].num != 0; + pDict->hasForceBold = gTrue; + break; + case 0x0c0f: + pDict->forceBoldThreshold = ops[0].num; + break; + case 0x0c11: + pDict->languageGroup = (int)ops[0].num; + break; + case 0x0c12: + pDict->expansionFactor = ops[0].num; + break; + case 0x0c13: + pDict->initialRandomSeed = (int)ops[0].num; + break; + case 0x0013: + pDict->subrsOffset = offset + (int)ops[0].num; + break; + case 0x0014: + pDict->defaultWidthX = ops[0].num; + pDict->defaultWidthXFP = ops[0].isFP; + break; + case 0x0015: + pDict->nominalWidthX = ops[0].num; + pDict->nominalWidthXFP = ops[0].isFP; + break; + } + nOps = 0; + } + } +} + +void FoFiType1C::readFDSelect() { + int fdSelectFmt, pos, nRanges, gid0, gid1, fd, i, j; + + fdSelect = (Guchar *)gmalloc(nGlyphs); + if (topDict.fdSelectOffset == 0) { + for (i = 0; i < nGlyphs; ++i) { + fdSelect[i] = 0; + } + } else { + pos = topDict.fdSelectOffset; + fdSelectFmt = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if (fdSelectFmt == 0) { + if (!checkRegion(pos, nGlyphs)) { + parsedOk = gFalse; + return; + } + memcpy(fdSelect, file + pos, nGlyphs); + } else if (fdSelectFmt == 3) { + nRanges = getU16BE(pos, &parsedOk); + pos += 2; + gid0 = getU16BE(pos, &parsedOk); + pos += 2; + for (i = 1; i <= nRanges; ++i) { + fd = getU8(pos++, &parsedOk); + gid1 = getU16BE(pos, &parsedOk); + if (!parsedOk) { + return; + } + pos += 2; + if (gid0 > gid1 || gid1 > nGlyphs) { + //~ error(-1, "Bad FDSelect table in CID font"); + parsedOk = gFalse; + return; + } + for (j = gid0; j < gid1; ++j) { + fdSelect[j] = fd; + } + gid0 = gid1; + } + } else { + //~ error(-1, "Unknown FDSelect table format in CID font"); + for (i = 0; i < nGlyphs; ++i) { + fdSelect[i] = 0; + } + } + } +} + +void FoFiType1C::buildEncoding() { + char buf[256]; + int nCodes, nRanges, encFormat; + int pos, c, sid, nLeft, nSups, i, j; + + if (topDict.encodingOffset == 0) { + encoding = fofiType1StandardEncoding; + + } else if (topDict.encodingOffset == 1) { + encoding = fofiType1ExpertEncoding; + + } else { + encoding = (char **)gmallocn(256, sizeof(char *)); + for (i = 0; i < 256; ++i) { + encoding[i] = NULL; + } + pos = topDict.encodingOffset; + encFormat = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if ((encFormat & 0x7f) == 0) { + nCodes = 1 + getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if (nCodes > nGlyphs) { + nCodes = nGlyphs; + } + for (i = 1; i < nCodes; ++i) { + c = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + if (encoding[c]) { + gfree(encoding[c]); + } + encoding[c] = copyString(getString(charset[i], buf, &parsedOk)); + } + } else if ((encFormat & 0x7f) == 1) { + nRanges = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + nCodes = 1; + for (i = 0; i < nRanges; ++i) { + c = getU8(pos++, &parsedOk); + nLeft = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + for (j = 0; j <= nLeft && nCodes < nGlyphs; ++j) { + if (c < 256) { + if (encoding[c]) { + gfree(encoding[c]); + } + encoding[c] = copyString(getString(charset[nCodes], buf, + &parsedOk)); + } + ++nCodes; + ++c; + } + } + } + if (encFormat & 0x80) { + nSups = getU8(pos++, &parsedOk); + if (!parsedOk) { + return; + } + for (i = 0; i < nSups; ++i) { + c = getU8(pos++, &parsedOk);; + if (!parsedOk) { + return;; + } + sid = getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + return; + } + if (encoding[c]) { + gfree(encoding[c]); + } + encoding[c] = copyString(getString(sid, buf, &parsedOk)); + } + } + } +} + +GBool FoFiType1C::readCharset() { + int charsetFormat, c, pos; + int nLeft, i, j; + + if (topDict.charsetOffset == 0) { + charset = fofiType1CISOAdobeCharset; + } else if (topDict.charsetOffset == 1) { + charset = fofiType1CExpertCharset; + } else if (topDict.charsetOffset == 2) { + charset = fofiType1CExpertSubsetCharset; + } else { + charset = (Gushort *)gmallocn(nGlyphs, sizeof(Gushort)); + for (i = 0; i < nGlyphs; ++i) { + charset[i] = 0; + } + pos = topDict.charsetOffset; + charsetFormat = getU8(pos++, &parsedOk); + if (charsetFormat == 0) { + for (i = 1; i < nGlyphs; ++i) { + charset[i] = (Gushort)getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + break; + } + } + } else if (charsetFormat == 1) { + i = 1; + while (i < nGlyphs) { + c = getU16BE(pos, &parsedOk); + pos += 2; + nLeft = getU8(pos++, &parsedOk); + if (!parsedOk) { + break; + } + for (j = 0; j <= nLeft && i < nGlyphs; ++j) { + charset[i++] = (Gushort)c++; + } + } + } else if (charsetFormat == 2) { + i = 1; + while (i < nGlyphs) { + c = getU16BE(pos, &parsedOk); + pos += 2; + nLeft = getU16BE(pos, &parsedOk); + pos += 2; + if (!parsedOk) { + break; + } + for (j = 0; j <= nLeft && i < nGlyphs; ++j) { + charset[i++] = (Gushort)c++; + } + } + } + if (!parsedOk) { + gfree(charset); + charset = NULL; + return gFalse; + } + } + return gTrue; +} + +int FoFiType1C::getOp(int pos, GBool charstring, GBool *ok) { + static char nybChars[16] = "0123456789.ee -"; + Type1COp op; + char buf[65]; + int b0, b1, nyb0, nyb1, x, i; + + b0 = getU8(pos++, ok); + op.isNum = gTrue; + op.isFP = gFalse; + + if (b0 == 28) { + x = getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + if (x & 0x8000) { + x |= ~0xffff; + } + op.num = x; + + } else if (!charstring && b0 == 29) { + x = getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + if (x & 0x80000000) { + x |= ~0xffffffff; + } + op.num = x; + + } else if (!charstring && b0 == 30) { + i = 0; + do { + b1 = getU8(pos++, ok); + nyb0 = b1 >> 4; + nyb1 = b1 & 0x0f; + if (nyb0 == 0xf) { + break; + } + buf[i++] = nybChars[nyb0]; + if (i == 64) { + break; + } + if (nyb0 == 0xc) { + buf[i++] = '-'; + } + if (i == 64) { + break; + } + if (nyb1 == 0xf) { + break; + } + buf[i++] = nybChars[nyb1]; + if (i == 64) { + break; + } + if (nyb1 == 0xc) { + buf[i++] = '-'; + } + } while (i < 64); + buf[i] = '\0'; + op.num = atof(buf); + op.isFP = gTrue; + + } else if (b0 >= 32 && b0 <= 246) { + op.num = b0 - 139; + + } else if (b0 >= 247 && b0 <= 250) { + op.num = ((b0 - 247) << 8) + getU8(pos++, ok) + 108; + + } else if (b0 >= 251 && b0 <= 254) { + op.num = -((b0 - 251) << 8) - getU8(pos++, ok) - 108; + + } else if (charstring && b0 == 255) { + x = getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + x = (x << 8) | getU8(pos++, ok); + if (x & 0x80000000) { + x |= ~0xffffffff; + } + op.num = (double)x / 65536.0; + op.isFP = gTrue; + + } else if (b0 == 12) { + op.isNum = gFalse; + op.op = 0x0c00 + getU8(pos++, ok); + + } else { + op.isNum = gFalse; + op.op = b0; + } + + if (nOps < 49) { + ops[nOps++] = op; + } + + return pos; +} + +// Convert the delta-encoded ops array to an array of ints. +int FoFiType1C::getDeltaIntArray(int *arr, int maxLen) { + int x; + int n, i; + + if ((n = nOps) > maxLen) { + n = maxLen; + } + x = 0; + for (i = 0; i < n; ++i) { + x += (int)ops[i].num; + arr[i] = x; + } + return n; +} + +// Convert the delta-encoded ops array to an array of doubles. +int FoFiType1C::getDeltaFPArray(double *arr, int maxLen) { + double x; + int n, i; + + if ((n = nOps) > maxLen) { + n = maxLen; + } + x = 0; + for (i = 0; i < n; ++i) { + x += ops[i].num; + arr[i] = x; + } + return n; +} + +void FoFiType1C::getIndex(int pos, Type1CIndex *idx, GBool *ok) { + idx->pos = pos; + idx->len = getU16BE(pos, ok); + if (idx->len == 0) { + // empty indexes are legal and contain just the length field + idx->offSize = 0; + idx->startPos = idx->endPos = pos + 2; + } else { + idx->offSize = getU8(pos + 2, ok); + if (idx->offSize < 1 || idx->offSize > 4) { + *ok = gFalse; + } + idx->startPos = pos + 3 + (idx->len + 1) * idx->offSize - 1; + if (idx->startPos < 0 || idx->startPos >= len) { + *ok = gFalse; + } + idx->endPos = idx->startPos + getUVarBE(pos + 3 + idx->len * idx->offSize, + idx->offSize, ok); + if (idx->endPos < idx->startPos || idx->endPos > len) { + *ok = gFalse; + } + } +} + +void FoFiType1C::getIndexVal(Type1CIndex *idx, int i, + Type1CIndexVal *val, GBool *ok) { + int pos0, pos1; + + if (i < 0 || i >= idx->len) { + *ok = gFalse; + return; + } + pos0 = idx->startPos + getUVarBE(idx->pos + 3 + i * idx->offSize, + idx->offSize, ok); + pos1 = idx->startPos + getUVarBE(idx->pos + 3 + (i + 1) * idx->offSize, + idx->offSize, ok); + if (pos0 < idx->startPos || pos0 > idx->endPos || + pos1 <= idx->startPos || pos1 > idx->endPos || + pos1 < pos0) { + *ok = gFalse; + } + val->pos = pos0; + val->len = pos1 - pos0; +} + +char *FoFiType1C::getString(int sid, char *buf, GBool *ok) { + Type1CIndexVal val; + int n; + + if (sid < 391) { + strcpy(buf, fofiType1CStdStrings[sid]); + } else { + sid -= 391; + getIndexVal(&stringIdx, sid, &val, ok); + if (*ok) { + if ((n = val.len) > 255) { + n = 255; + } + strncpy(buf, (char *)&file[val.pos], n); + buf[n] = '\0'; + } else { + buf[0] = '\0'; + } + } + return buf; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h new file mode 100644 index 000000000..eec275554 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h @@ -0,0 +1,233 @@ +//======================================================================== +// +// FoFiType1C.h +// +// Copyright 1999-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FOFITYPE1C_H +#define FOFITYPE1C_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "FoFiBase.h" + +class GString; + +//------------------------------------------------------------------------ + +struct Type1CIndex { + int pos; // absolute position in file + int len; // length (number of entries) + int offSize; // offset size + int startPos; // position of start of index data - 1 + int endPos; // position one byte past end of the index +}; + +struct Type1CIndexVal { + int pos; // absolute position in file + int len; // length, in bytes +}; + +struct Type1CTopDict { + int firstOp; + + int versionSID; + int noticeSID; + int copyrightSID; + int fullNameSID; + int familyNameSID; + int weightSID; + int isFixedPitch; + double italicAngle; + double underlinePosition; + double underlineThickness; + int paintType; + int charstringType; + double fontMatrix[6]; + GBool hasFontMatrix; // CID fonts are allowed to put their + // FontMatrix in the FD instead of the + // top dict + int uniqueID; + double fontBBox[4]; + double strokeWidth; + int charsetOffset; + int encodingOffset; + int charStringsOffset; + int privateSize; + int privateOffset; + + // CIDFont entries + int registrySID; + int orderingSID; + int supplement; + int fdArrayOffset; + int fdSelectOffset; +}; + +#define type1CMaxBlueValues 14 +#define type1CMaxOtherBlues 10 +#define type1CMaxStemSnap 12 + +struct Type1CPrivateDict { + double fontMatrix[6]; + GBool hasFontMatrix; + int blueValues[type1CMaxBlueValues]; + int nBlueValues; + int otherBlues[type1CMaxOtherBlues]; + int nOtherBlues; + int familyBlues[type1CMaxBlueValues]; + int nFamilyBlues; + int familyOtherBlues[type1CMaxOtherBlues]; + int nFamilyOtherBlues; + double blueScale; + int blueShift; + int blueFuzz; + double stdHW; + GBool hasStdHW; + double stdVW; + GBool hasStdVW; + double stemSnapH[type1CMaxStemSnap]; + int nStemSnapH; + double stemSnapV[type1CMaxStemSnap]; + int nStemSnapV; + GBool forceBold; + GBool hasForceBold; + double forceBoldThreshold; + int languageGroup; + double expansionFactor; + int initialRandomSeed; + int subrsOffset; + double defaultWidthX; + GBool defaultWidthXFP; + double nominalWidthX; + GBool nominalWidthXFP; +}; + +struct Type1COp { + GBool isNum; // true -> number, false -> operator + GBool isFP; // true -> floating point number, false -> int + union { + double num; // if num is true + int op; // if num is false + }; +}; + +struct Type1CEexecBuf { + FoFiOutputFunc outputFunc; + void *outputStream; + GBool ascii; // ASCII encoding? + Gushort r1; // eexec encryption key + int line; // number of eexec chars left on current line +}; + +//------------------------------------------------------------------------ +// FoFiType1C +//------------------------------------------------------------------------ + +class FoFiType1C: public FoFiBase { +public: + + // Create a FoFiType1C object from a memory buffer. + static FoFiType1C *make(char *fileA, int lenA); + + // Create a FoFiType1C object from a file on disk. + static FoFiType1C *load(char *fileName); + + virtual ~FoFiType1C(); + + // Return the font name. + char *getName(); + + // Return the encoding, as an array of 256 names (any of which may + // be NULL). This is only useful with 8-bit fonts. + char **getEncoding(); + + // Return the mapping from CIDs to GIDs, and return the number of + // CIDs in *. This is only useful for CID fonts. + Gushort *getCIDToGIDMap(int *nCIDs); + + // Convert to a Type 1 font, suitable for embedding in a PostScript + // file. This is only useful with 8-bit fonts. If is + // not NULL, it will be used in place of the encoding in the Type 1C + // font. If is true the eexec section will be hex-encoded, + // otherwise it will be left as binary data. If is non-NULL, + // it will be used as the PostScript font name. + void convertToType1(char *psName, char **newEncoding, GBool ascii, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 CIDFont, suitable for embedding in a + // PostScript file. will be used as the PostScript font + // name. + void convertToCIDType0(char *psName, + FoFiOutputFunc outputFunc, void *outputStream); + + // Convert to a Type 0 (but non-CID) composite font, suitable for + // embedding in a PostScript file. will be used as the + // PostScript font name. + void convertToType0(char *psName, + FoFiOutputFunc outputFunc, void *outputStream); + +private: + + FoFiType1C(char *fileA, int lenA, GBool freeFileDataA); + void eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName, + int offset, int nBytes, + Type1CIndex *subrIdx, + Type1CPrivateDict *pDict); + void cvtGlyph(int offset, int nBytes, GString *charBuf, + Type1CIndex *subrIdx, Type1CPrivateDict *pDict, + GBool top); + void cvtGlyphWidth(GBool useOp, GString *charBuf, + Type1CPrivateDict *pDict); + void cvtNum(double x, GBool isFP, GString *charBuf); + void eexecWrite(Type1CEexecBuf *eb, char *s); + void eexecWriteCharstring(Type1CEexecBuf *eb, Guchar *s, int n); + GBool parse(); + void readTopDict(); + void readFD(int offset, int length, Type1CPrivateDict *pDict); + void readPrivateDict(int offset, int length, Type1CPrivateDict *pDict); + void readFDSelect(); + void buildEncoding(); + GBool readCharset(); + int getOp(int pos, GBool charstring, GBool *ok); + int getDeltaIntArray(int *arr, int maxLen); + int getDeltaFPArray(double *arr, int maxLen); + void getIndex(int pos, Type1CIndex *idx, GBool *ok); + void getIndexVal(Type1CIndex *idx, int i, Type1CIndexVal *val, GBool *ok); + char *getString(int sid, char *buf, GBool *ok); + + GString *name; + char **encoding; + + Type1CIndex nameIdx; + Type1CIndex topDictIdx; + Type1CIndex stringIdx; + Type1CIndex gsubrIdx; + Type1CIndex charStringsIdx; + + Type1CTopDict topDict; + Type1CPrivateDict *privateDicts; + + int nGlyphs; + int nFDs; + Guchar *fdSelect; + Gushort *charset; + int gsubrBias; + + GBool parsedOk; + + Type1COp ops[49]; // operands and operator + int nOps; // number of operands + int nHints; // number of hints for the current glyph + GBool firstOp; // true if we haven't hit the first op yet + GBool openPath; // true if there is an unclosed path +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc new file mode 100644 index 000000000..f3b9280aa --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc @@ -0,0 +1,1824 @@ +//======================================================================== +// +// FontEncodingTables.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include +#include +#include "FontEncodingTables.h" + +char *macRomanEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + "Adieresis", + "Aring", + "Ccedilla", + "Eacute", + "Ntilde", + "Odieresis", + "Udieresis", + "aacute", + "agrave", + "acircumflex", + "adieresis", + "atilde", + "aring", + "ccedilla", + "eacute", + "egrave", + "ecircumflex", + "edieresis", + "iacute", + "igrave", + "icircumflex", + "idieresis", + "ntilde", + "oacute", + "ograve", + "ocircumflex", + "odieresis", + "otilde", + "uacute", + "ugrave", + "ucircumflex", + "udieresis", + "dagger", + "degree", + "cent", + "sterling", + "section", + "bullet", + "paragraph", + "germandbls", + "registered", + "copyright", + "trademark", + "acute", + "dieresis", + "notequal", + "AE", + "Oslash", + "infinity", + "plusminus", + "lessequal", + "greaterequal", + "yen", + "mu", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "ordfeminine", + "ordmasculine", + "Omega", + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + "radical", + "florin", + "approxequal", + "Delta", + "guillemotleft", + "guillemotright", + "ellipsis", + "space", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + "lozenge", + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + "apple", + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron" +}; + +char *macExpertEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + "centoldstyle", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + NULL, + "threequartersemdash", + NULL, + "questionsmall", + NULL, + NULL, + NULL, + NULL, + "Ethsmall", + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hypheninferior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + "asuperior", + "centsuperior", + NULL, + NULL, + NULL, + NULL, + "Aacutesmall", + "Agravesmall", + "Acircumflexsmall", + "Adieresissmall", + "Atildesmall", + "Aringsmall", + "Ccedillasmall", + "Eacutesmall", + "Egravesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Iacutesmall", + "Igravesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ntildesmall", + "Oacutesmall", + "Ogravesmall", + "Ocircumflexsmall", + "Odieresissmall", + "Otildesmall", + "Uacutesmall", + "Ugravesmall", + "Ucircumflexsmall", + "Udieresissmall", + NULL, + "eightsuperior", + "fourinferior", + "threeinferior", + "sixinferior", + "eightinferior", + "seveninferior", + "Scaronsmall", + NULL, + "centinferior", + "twoinferior", + NULL, + "Dieresissmall", + NULL, + "Caronsmall", + "osuperior", + "fiveinferior", + NULL, + "commainferior", + "periodinferior", + "Yacutesmall", + NULL, + "dollarinferior", + NULL, + NULL, + "Thornsmall", + NULL, + "nineinferior", + "zeroinferior", + "Zcaronsmall", + "AEsmall", + "Oslashsmall", + "questiondownsmall", + "oneinferior", + "Lslashsmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Cedillasmall", + NULL, + NULL, + NULL, + NULL, + NULL, + "OEsmall", + "figuredash", + "hyphensuperior", + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + NULL, + "Ydieresissmall", + NULL, + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "ninesuperior", + "zerosuperior", + NULL, + "esuperior", + "rsuperior", + "tsuperior", + NULL, + NULL, + "isuperior", + "ssuperior", + "dsuperior", + NULL, + NULL, + NULL, + NULL, + NULL, + "lsuperior", + "Ogoneksmall", + "Brevesmall", + "Macronsmall", + "bsuperior", + "nsuperior", + "msuperior", + "commasuperior", + "periodsuperior", + "Dotaccentsmall", + "Ringsmall", + NULL, + NULL, + NULL, + NULL +}; + +char *winAnsiEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "bullet", + "Euro", + "bullet", + "quotesinglbase", + "florin", + "quotedblbase", + "ellipsis", + "dagger", + "daggerdbl", + "circumflex", + "perthousand", + "Scaron", + "guilsinglleft", + "OE", + "bullet", + "Zcaron", + "bullet", + "bullet", + "quoteleft", + "quoteright", + "quotedblleft", + "quotedblright", + "bullet", + "endash", + "emdash", + "tilde", + "trademark", + "scaron", + "guilsinglright", + "oe", + "bullet", + "zcaron", + "Ydieresis", + "space", + "exclamdown", + "cent", + "sterling", + "currency", + "yen", + "brokenbar", + "section", + "dieresis", + "copyright", + "ordfeminine", + "guillemotleft", + "logicalnot", + "hyphen", + "registered", + "macron", + "degree", + "plusminus", + "twosuperior", + "threesuperior", + "acute", + "mu", + "paragraph", + "periodcentered", + "cedilla", + "onesuperior", + "ordmasculine", + "guillemotright", + "onequarter", + "onehalf", + "threequarters", + "questiondown", + "Agrave", + "Aacute", + "Acircumflex", + "Atilde", + "Adieresis", + "Aring", + "AE", + "Ccedilla", + "Egrave", + "Eacute", + "Ecircumflex", + "Edieresis", + "Igrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Eth", + "Ntilde", + "Ograve", + "Oacute", + "Ocircumflex", + "Otilde", + "Odieresis", + "multiply", + "Oslash", + "Ugrave", + "Uacute", + "Ucircumflex", + "Udieresis", + "Yacute", + "Thorn", + "germandbls", + "agrave", + "aacute", + "acircumflex", + "atilde", + "adieresis", + "aring", + "ae", + "ccedilla", + "egrave", + "eacute", + "ecircumflex", + "edieresis", + "igrave", + "iacute", + "icircumflex", + "idieresis", + "eth", + "ntilde", + "ograve", + "oacute", + "ocircumflex", + "otilde", + "odieresis", + "divide", + "oslash", + "ugrave", + "uacute", + "ucircumflex", + "udieresis", + "yacute", + "thorn", + "ydieresis" +}; + +char *standardEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + NULL, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + NULL, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + NULL, + "questiondown", + NULL, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + NULL, + "ring", + "cedilla", + NULL, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "AE", + NULL, + "ordfeminine", + NULL, + NULL, + NULL, + NULL, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + NULL, + NULL, + NULL, + NULL, + NULL, + "ae", + NULL, + NULL, + NULL, + "dotlessi", + NULL, + NULL, + "lslash", + "oslash", + "oe", + "germandbls", + NULL, + NULL, + NULL, + NULL +}; + +char *expertEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclamsmall", + "Hungarumlautsmall", + NULL, + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + "commasuperior", + "threequartersemdash", + "periodsuperior", + "questionsmall", + NULL, + "asuperior", + "bsuperior", + "centsuperior", + "dsuperior", + "esuperior", + NULL, + NULL, + NULL, + "isuperior", + NULL, + NULL, + "lsuperior", + "msuperior", + "nsuperior", + "osuperior", + NULL, + NULL, + "rsuperior", + "ssuperior", + "tsuperior", + NULL, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + NULL, + "parenrightinferior", + "Circumflexsmall", + "hyphensuperior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "exclamdownsmall", + "centoldstyle", + "Lslashsmall", + NULL, + NULL, + "Scaronsmall", + "Zcaronsmall", + "Dieresissmall", + "Brevesmall", + "Caronsmall", + NULL, + "Dotaccentsmall", + NULL, + NULL, + "Macronsmall", + NULL, + NULL, + "figuredash", + "hypheninferior", + NULL, + NULL, + "Ogoneksmall", + "Ringsmall", + "Cedillasmall", + NULL, + NULL, + NULL, + "onequarter", + "onehalf", + "threequarters", + "questiondownsmall", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + NULL, + NULL, + "zerosuperior", + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "eightsuperior", + "ninesuperior", + "zeroinferior", + "oneinferior", + "twoinferior", + "threeinferior", + "fourinferior", + "fiveinferior", + "sixinferior", + "seveninferior", + "eightinferior", + "nineinferior", + "centinferior", + "dollarinferior", + "periodinferior", + "commainferior", + "Agravesmall", + "Aacutesmall", + "Acircumflexsmall", + "Atildesmall", + "Adieresissmall", + "Aringsmall", + "AEsmall", + "Ccedillasmall", + "Egravesmall", + "Eacutesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Igravesmall", + "Iacutesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ethsmall", + "Ntildesmall", + "Ogravesmall", + "Oacutesmall", + "Ocircumflexsmall", + "Otildesmall", + "Odieresissmall", + "OEsmall", + "Oslashsmall", + "Ugravesmall", + "Uacutesmall", + "Ucircumflexsmall", + "Udieresissmall", + "Yacutesmall", + "Thornsmall", + "Ydieresissmall" +}; + +char *symbolEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "exclam", + "universal", + "numbersign", + "existential", + "percent", + "ampersand", + "suchthat", + "parenleft", + "parenright", + "asteriskmath", + "plus", + "comma", + "minus", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "congruent", + "Alpha", + "Beta", + "Chi", + "Delta", + "Epsilon", + "Phi", + "Gamma", + "Eta", + "Iota", + "theta1", + "Kappa", + "Lambda", + "Mu", + "Nu", + "Omicron", + "Pi", + "Theta", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "sigma1", + "Omega", + "Xi", + "Psi", + "Zeta", + "bracketleft", + "therefore", + "bracketright", + "perpendicular", + "underscore", + "radicalex", + "alpha", + "beta", + "chi", + "delta", + "epsilon", + "phi", + "gamma", + "eta", + "iota", + "phi1", + "kappa", + "lambda", + "mu", + "nu", + "omicron", + "pi", + "theta", + "rho", + "sigma", + "tau", + "upsilon", + "omega1", + "omega", + "xi", + "psi", + "zeta", + "braceleft", + "bar", + "braceright", + "similar", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "Upsilon1", + "minute", + "lessequal", + "fraction", + "infinity", + "florin", + "club", + "diamond", + "heart", + "spade", + "arrowboth", + "arrowleft", + "arrowup", + "arrowright", + "arrowdown", + "degree", + "plusminus", + "second", + "greaterequal", + "multiply", + "proportional", + "partialdiff", + "bullet", + "divide", + "notequal", + "equivalence", + "approxequal", + "ellipsis", + "arrowvertex", + "arrowhorizex", + "carriagereturn", + "aleph", + "Ifraktur", + "Rfraktur", + "weierstrass", + "circlemultiply", + "circleplus", + "emptyset", + "intersection", + "union", + "propersuperset", + "reflexsuperset", + "notsubset", + "propersubset", + "reflexsubset", + "element", + "notelement", + "angle", + "gradient", + "registerserif", + "copyrightserif", + "trademarkserif", + "product", + "radical", + "dotmath", + "logicalnot", + "logicaland", + "logicalor", + "arrowdblboth", + "arrowdblleft", + "arrowdblup", + "arrowdblright", + "arrowdbldown", + "lozenge", + "angleleft", + "registersans", + "copyrightsans", + "trademarksans", + "summation", + "parenlefttp", + "parenleftex", + "parenleftbt", + "bracketlefttp", + "bracketleftex", + "bracketleftbt", + "bracelefttp", + "braceleftmid", + "braceleftbt", + "braceex", + NULL, + "angleright", + "integral", + "integraltp", + "integralex", + "integralbt", + "parenrighttp", + "parenrightex", + "parenrightbt", + "bracketrighttp", + "bracketrightex", + "bracketrightbt", + "bracerighttp", + "bracerightmid", + "bracerightbt", + NULL +}; + +char *zapfDingbatsEncoding[256] = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "space", + "a1", + "a2", + "a202", + "a3", + "a4", + "a5", + "a119", + "a118", + "a117", + "a11", + "a12", + "a13", + "a14", + "a15", + "a16", + "a105", + "a17", + "a18", + "a19", + "a20", + "a21", + "a22", + "a23", + "a24", + "a25", + "a26", + "a27", + "a28", + "a6", + "a7", + "a8", + "a9", + "a10", + "a29", + "a30", + "a31", + "a32", + "a33", + "a34", + "a35", + "a36", + "a37", + "a38", + "a39", + "a40", + "a41", + "a42", + "a43", + "a44", + "a45", + "a46", + "a47", + "a48", + "a49", + "a50", + "a51", + "a52", + "a53", + "a54", + "a55", + "a56", + "a57", + "a58", + "a59", + "a60", + "a61", + "a62", + "a63", + "a64", + "a65", + "a66", + "a67", + "a68", + "a69", + "a70", + "a71", + "a72", + "a73", + "a74", + "a203", + "a75", + "a204", + "a76", + "a77", + "a78", + "a79", + "a81", + "a82", + "a83", + "a84", + "a97", + "a98", + "a99", + "a100", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "a101", + "a102", + "a103", + "a104", + "a106", + "a107", + "a108", + "a112", + "a111", + "a110", + "a109", + "a120", + "a121", + "a122", + "a123", + "a124", + "a125", + "a126", + "a127", + "a128", + "a129", + "a130", + "a131", + "a132", + "a133", + "a134", + "a135", + "a136", + "a137", + "a138", + "a139", + "a140", + "a141", + "a142", + "a143", + "a144", + "a145", + "a146", + "a147", + "a148", + "a149", + "a150", + "a151", + "a152", + "a153", + "a154", + "a155", + "a156", + "a157", + "a158", + "a159", + "a160", + "a161", + "a163", + "a164", + "a196", + "a165", + "a192", + "a166", + "a167", + "a168", + "a169", + "a170", + "a171", + "a172", + "a173", + "a162", + "a174", + "a175", + "a176", + "a177", + "a178", + "a179", + "a193", + "a180", + "a199", + "a181", + "a200", + "a182", + NULL, + "a201", + "a183", + "a184", + "a197", + "a185", + "a194", + "a198", + "a186", + "a195", + "a187", + "a188", + "a189", + "a190", + "a191", + NULL +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h new file mode 100644 index 000000000..8b0a1e7e9 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h @@ -0,0 +1,20 @@ +//======================================================================== +// +// FontEncodingTables.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FONTENCODINGTABLES_H +#define FONTENCODINGTABLES_H + +extern char *macRomanEncoding[]; +extern char *macExpertEncoding[]; +extern char *winAnsiEncoding[]; +extern char *standardEncoding[]; +extern char *expertEncoding[]; +extern char *symbolEncoding[]; +extern char *zapfDingbatsEncoding[]; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc new file mode 100644 index 000000000..05555eebc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc @@ -0,0 +1,1573 @@ +//======================================================================== +// +// Function.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "Object.h" +#include "Dict.h" +#include "Stream.h" +#include "Error.h" +#include "Function.h" + +//------------------------------------------------------------------------ +// Function +//------------------------------------------------------------------------ + +Function::Function() { +} + +Function::~Function() { +} + +Function *Function::parse(Object *funcObj) { + Function *func; + Dict *dict; + int funcType; + Object obj1; + + if (funcObj->isStream()) { + dict = funcObj->streamGetDict(); + } else if (funcObj->isDict()) { + dict = funcObj->getDict(); + } else if (funcObj->isName("Identity")) { + return new IdentityFunction(); + } else { + error(-1, "Expected function dictionary or stream"); + return NULL; + } + + if (!dict->lookup("FunctionType", &obj1)->isInt()) { + error(-1, "Function type is missing or wrong type"); + obj1.free(); + return NULL; + } + funcType = obj1.getInt(); + obj1.free(); + + if (funcType == 0) { + func = new SampledFunction(funcObj, dict); + } else if (funcType == 2) { + func = new ExponentialFunction(funcObj, dict); + } else if (funcType == 3) { + func = new StitchingFunction(funcObj, dict); + } else if (funcType == 4) { + func = new PostScriptFunction(funcObj, dict); + } else { + error(-1, "Unimplemented function type (%d)", funcType); + return NULL; + } + if (!func->isOk()) { + delete func; + return NULL; + } + + return func; +} + +GBool Function::init(Dict *dict) { + Object obj1, obj2; + int i; + + //----- Domain + if (!dict->lookup("Domain", &obj1)->isArray()) { + error(-1, "Function is missing domain"); + goto err2; + } + m = obj1.arrayGetLength() / 2; + if (m > funcMaxInputs) { + error(-1, "Functions with more than %d inputs are unsupported", + funcMaxInputs); + goto err2; + } + for (i = 0; i < m; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function domain array"); + goto err1; + } + domain[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function domain array"); + goto err1; + } + domain[i][1] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + //----- Range + hasRange = gFalse; + n = 0; + if (dict->lookup("Range", &obj1)->isArray()) { + hasRange = gTrue; + n = obj1.arrayGetLength() / 2; + if (n > funcMaxOutputs) { + error(-1, "Functions with more than %d outputs are unsupported", + funcMaxOutputs); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function range array"); + goto err1; + } + range[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function range array"); + goto err1; + } + range[i][1] = obj2.getNum(); + obj2.free(); + } + } + obj1.free(); + + return gTrue; + + err1: + obj2.free(); + err2: + obj1.free(); + return gFalse; +} + +//------------------------------------------------------------------------ +// IdentityFunction +//------------------------------------------------------------------------ + +IdentityFunction::IdentityFunction() { + int i; + + // fill these in with arbitrary values just in case they get used + // somewhere + m = funcMaxInputs; + n = funcMaxOutputs; + for (i = 0; i < funcMaxInputs; ++i) { + domain[i][0] = 0; + domain[i][1] = 1; + } + hasRange = gFalse; +} + +IdentityFunction::~IdentityFunction() { +} + +void IdentityFunction::transform(double *in, double *out) { + int i; + + for (i = 0; i < funcMaxOutputs; ++i) { + out[i] = in[i]; + } +} + +//------------------------------------------------------------------------ +// SampledFunction +//------------------------------------------------------------------------ + +SampledFunction::SampledFunction(Object *funcObj, Dict *dict) { + Stream *str; + int sampleBits; + double sampleMul; + Object obj1, obj2; + Guint buf, bitMask; + int bits; + Guint s; + int i; + + samples = NULL; + sBuf = NULL; + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (!hasRange) { + error(-1, "Type 0 function is missing range"); + goto err1; + } + if (m > sampledFuncMaxInputs) { + error(-1, "Sampled functions with more than %d inputs are unsupported", + sampledFuncMaxInputs); + goto err1; + } + + //----- buffer + sBuf = (double *)gmallocn(1 << m, sizeof(double)); + + //----- get the stream + if (!funcObj->isStream()) { + error(-1, "Type 0 function isn't a stream"); + goto err1; + } + str = funcObj->getStream(); + + //----- Size + if (!dict->lookup("Size", &obj1)->isArray() || + obj1.arrayGetLength() != m) { + error(-1, "Function has missing or invalid size array"); + goto err2; + } + for (i = 0; i < m; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isInt()) { + error(-1, "Illegal value in function size array"); + goto err3; + } + sampleSize[i] = obj2.getInt(); + obj2.free(); + } + obj1.free(); + idxMul[0] = n; + for (i = 1; i < m; ++i) { + idxMul[i] = idxMul[i-1] * sampleSize[i-1]; + } + + //----- BitsPerSample + if (!dict->lookup("BitsPerSample", &obj1)->isInt()) { + error(-1, "Function has missing or invalid BitsPerSample"); + goto err2; + } + sampleBits = obj1.getInt(); + sampleMul = 1.0 / (pow(2.0, (double)sampleBits) - 1); + obj1.free(); + + //----- Encode + if (dict->lookup("Encode", &obj1)->isArray() && + obj1.arrayGetLength() == 2*m) { + for (i = 0; i < m; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function encode array"); + goto err3; + } + encode[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function encode array"); + goto err3; + } + encode[i][1] = obj2.getNum(); + obj2.free(); + } + } else { + for (i = 0; i < m; ++i) { + encode[i][0] = 0; + encode[i][1] = sampleSize[i] - 1; + } + } + obj1.free(); + for (i = 0; i < m; ++i) { + inputMul[i] = (encode[i][1] - encode[i][0]) / + (domain[i][1] - domain[i][0]); + } + + //----- Decode + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() == 2*n) { + for (i = 0; i < n; ++i) { + obj1.arrayGet(2*i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function decode array"); + goto err3; + } + decode[i][0] = obj2.getNum(); + obj2.free(); + obj1.arrayGet(2*i+1, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function decode array"); + goto err3; + } + decode[i][1] = obj2.getNum(); + obj2.free(); + } + } else { + for (i = 0; i < n; ++i) { + decode[i][0] = range[i][0]; + decode[i][1] = range[i][1]; + } + } + obj1.free(); + + //----- samples + nSamples = n; + for (i = 0; i < m; ++i) + nSamples *= sampleSize[i]; + samples = (double *)gmallocn(nSamples, sizeof(double)); + buf = 0; + bits = 0; + bitMask = (1 << sampleBits) - 1; + str->reset(); + for (i = 0; i < nSamples; ++i) { + if (sampleBits == 8) { + s = str->getChar(); + } else if (sampleBits == 16) { + s = str->getChar(); + s = (s << 8) + str->getChar(); + } else if (sampleBits == 32) { + s = str->getChar(); + s = (s << 8) + str->getChar(); + s = (s << 8) + str->getChar(); + s = (s << 8) + str->getChar(); + } else { + while (bits < sampleBits) { + buf = (buf << 8) | (str->getChar() & 0xff); + bits += 8; + } + s = (buf >> (bits - sampleBits)) & bitMask; + bits -= sampleBits; + } + samples[i] = (double)s * sampleMul; + } + str->close(); + + ok = gTrue; + return; + + err3: + obj2.free(); + err2: + obj1.free(); + err1: + return; +} + +SampledFunction::~SampledFunction() { + if (samples) { + gfree(samples); + } + if (sBuf) { + gfree(sBuf); + } +} + +SampledFunction::SampledFunction(SampledFunction *func) { + memcpy(this, func, sizeof(SampledFunction)); + samples = (double *)gmallocn(nSamples, sizeof(double)); + memcpy(samples, func->samples, nSamples * sizeof(double)); + sBuf = (double *)gmallocn(1 << m, sizeof(double)); +} + +void SampledFunction::transform(double *in, double *out) { + double x; + int e[funcMaxInputs][2]; + double efrac0[funcMaxInputs]; + double efrac1[funcMaxInputs]; + int i, j, k, idx, t; + + // map input values into sample array + for (i = 0; i < m; ++i) { + x = (in[i] - domain[i][0]) * inputMul[i] + encode[i][0]; + if (x < 0) { + x = 0; + } else if (x > sampleSize[i] - 1) { + x = sampleSize[i] - 1; + } + e[i][0] = (int)x; + if ((e[i][1] = e[i][0] + 1) >= sampleSize[i]) { + // this happens if in[i] = domain[i][1] + e[i][1] = e[i][0]; + } + efrac1[i] = x - e[i][0]; + efrac0[i] = 1 - efrac1[i]; + } + + // for each output, do m-linear interpolation + for (i = 0; i < n; ++i) { + + // pull 2^m values out of the sample array + for (j = 0; j < (1<>= 1) { + idx += idxMul[k] * (e[k][t & 1]); + } + sBuf[j] = (idx>=0&&idx>= 1) { + for (k = 0; k < t; k += 2) { + sBuf[k >> 1] = efrac0[j] * sBuf[k] + efrac1[j] * sBuf[k+1]; + } + } + + // map output value to range + out[i] = sBuf[0] * (decode[i][1] - decode[i][0]) + decode[i][0]; + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } +} + +//------------------------------------------------------------------------ +// ExponentialFunction +//------------------------------------------------------------------------ + +ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { + Object obj1, obj2; + int i; + + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (m != 1) { + error(-1, "Exponential function with more than one input"); + goto err1; + } + + //----- C0 + if (dict->lookup("C0", &obj1)->isArray()) { + if (hasRange && obj1.arrayGetLength() != n) { + error(-1, "Function's C0 array is wrong length"); + goto err2; + } + n = obj1.arrayGetLength(); + for (i = 0; i < n; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function C0 array"); + goto err3; + } + c0[i] = obj2.getNum(); + obj2.free(); + } + } else { + if (hasRange && n != 1) { + error(-1, "Function's C0 array is wrong length"); + goto err2; + } + n = 1; + c0[0] = 0; + } + obj1.free(); + + //----- C1 + if (dict->lookup("C1", &obj1)->isArray()) { + if (obj1.arrayGetLength() != n) { + error(-1, "Function's C1 array is wrong length"); + goto err2; + } + for (i = 0; i < n; ++i) { + obj1.arrayGet(i, &obj2); + if (!obj2.isNum()) { + error(-1, "Illegal value in function C1 array"); + goto err3; + } + c1[i] = obj2.getNum(); + obj2.free(); + } + } else { + if (n != 1) { + error(-1, "Function's C1 array is wrong length"); + goto err2; + } + c1[0] = 1; + } + obj1.free(); + + //----- N (exponent) + if (!dict->lookup("N", &obj1)->isNum()) { + error(-1, "Function has missing or invalid N"); + goto err2; + } + e = obj1.getNum(); + obj1.free(); + + ok = gTrue; + return; + + err3: + obj2.free(); + err2: + obj1.free(); + err1: + return; +} + +ExponentialFunction::~ExponentialFunction() { +} + +ExponentialFunction::ExponentialFunction(ExponentialFunction *func) { + memcpy(this, func, sizeof(ExponentialFunction)); +} + +void ExponentialFunction::transform(double *in, double *out) { + double x; + int i; + + if (in[0] < domain[0][0]) { + x = domain[0][0]; + } else if (in[0] > domain[0][1]) { + x = domain[0][1]; + } else { + x = in[0]; + } + for (i = 0; i < n; ++i) { + out[i] = c0[i] + pow(x, e) * (c1[i] - c0[i]); + if (hasRange) { + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } + } + return; +} + +//------------------------------------------------------------------------ +// StitchingFunction +//------------------------------------------------------------------------ + +StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict) { + Object obj1, obj2; + int i; + + ok = gFalse; + funcs = NULL; + bounds = NULL; + encode = NULL; + scale = NULL; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (m != 1) { + error(-1, "Stitching function with more than one input"); + goto err1; + } + + //----- Functions + if (!dict->lookup("Functions", &obj1)->isArray()) { + error(-1, "Missing 'Functions' entry in stitching function"); + goto err1; + } + k = obj1.arrayGetLength(); + funcs = (Function **)gmallocn(k, sizeof(Function *)); + bounds = (double *)gmallocn(k + 1, sizeof(double)); + encode = (double *)gmallocn(2 * k, sizeof(double)); + scale = (double *)gmallocn(k, sizeof(double)); + for (i = 0; i < k; ++i) { + funcs[i] = NULL; + } + for (i = 0; i < k; ++i) { + if (!(funcs[i] = Function::parse(obj1.arrayGet(i, &obj2)))) { + goto err2; + } + if (i > 0 && (funcs[i]->getInputSize() != 1 || + funcs[i]->getOutputSize() != funcs[0]->getOutputSize())) { + error(-1, "Incompatible subfunctions in stitching function"); + goto err2; + } + obj2.free(); + } + obj1.free(); + + //----- Bounds + if (!dict->lookup("Bounds", &obj1)->isArray() || + obj1.arrayGetLength() != k - 1) { + error(-1, "Missing or invalid 'Bounds' entry in stitching function"); + goto err1; + } + bounds[0] = domain[0][0]; + for (i = 1; i < k; ++i) { + if (!obj1.arrayGet(i - 1, &obj2)->isNum()) { + error(-1, "Invalid type in 'Bounds' array in stitching function"); + goto err2; + } + bounds[i] = obj2.getNum(); + obj2.free(); + } + bounds[k] = domain[0][1]; + obj1.free(); + + //----- Encode + if (!dict->lookup("Encode", &obj1)->isArray() || + obj1.arrayGetLength() != 2 * k) { + error(-1, "Missing or invalid 'Encode' entry in stitching function"); + goto err1; + } + for (i = 0; i < 2 * k; ++i) { + if (!obj1.arrayGet(i, &obj2)->isNum()) { + error(-1, "Invalid type in 'Encode' array in stitching function"); + goto err2; + } + encode[i] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + //----- pre-compute the scale factors + for (i = 0; i < k; ++i) { + if (bounds[i] == bounds[i+1]) { + // avoid a divide-by-zero -- in this situation, function i will + // never be used anyway + scale[i] = 0; + } else { + scale[i] = (encode[2*i+1] - encode[2*i]) / (bounds[i+1] - bounds[i]); + } + } + + ok = gTrue; + return; + + err2: + obj2.free(); + err1: + obj1.free(); +} + +StitchingFunction::StitchingFunction(StitchingFunction *func) { + int i; + + k = func->k; + funcs = (Function **)gmallocn(k, sizeof(Function *)); + for (i = 0; i < k; ++i) { + funcs[i] = func->funcs[i]->copy(); + } + bounds = (double *)gmallocn(k + 1, sizeof(double)); + memcpy(bounds, func->bounds, (k + 1) * sizeof(double)); + encode = (double *)gmallocn(2 * k, sizeof(double)); + memcpy(encode, func->encode, 2 * k * sizeof(double)); + scale = (double *)gmallocn(k, sizeof(double)); + memcpy(scale, func->scale, k * sizeof(double)); + ok = gTrue; +} + +StitchingFunction::~StitchingFunction() { + int i; + + if (funcs) { + for (i = 0; i < k; ++i) { + if (funcs[i]) { + delete funcs[i]; + } + } + } + gfree(funcs); + gfree(bounds); + gfree(encode); + gfree(scale); +} + +void StitchingFunction::transform(double *in, double *out) { + double x; + int i; + + if (in[0] < domain[0][0]) { + x = domain[0][0]; + } else if (in[0] > domain[0][1]) { + x = domain[0][1]; + } else { + x = in[0]; + } + for (i = 0; i < k - 1; ++i) { + if (x < bounds[i+1]) { + break; + } + } + x = encode[2*i] + (x - bounds[i]) * scale[i]; + funcs[i]->transform(&x, out); +} + +//------------------------------------------------------------------------ +// PostScriptFunction +//------------------------------------------------------------------------ + +enum PSOp { + psOpAbs, + psOpAdd, + psOpAnd, + psOpAtan, + psOpBitshift, + psOpCeiling, + psOpCopy, + psOpCos, + psOpCvi, + psOpCvr, + psOpDiv, + psOpDup, + psOpEq, + psOpExch, + psOpExp, + psOpFalse, + psOpFloor, + psOpGe, + psOpGt, + psOpIdiv, + psOpIndex, + psOpLe, + psOpLn, + psOpLog, + psOpLt, + psOpMod, + psOpMul, + psOpNe, + psOpNeg, + psOpNot, + psOpOr, + psOpPop, + psOpRoll, + psOpRound, + psOpSin, + psOpSqrt, + psOpSub, + psOpTrue, + psOpTruncate, + psOpXor, + psOpIf, + psOpIfelse, + psOpReturn +}; + +// Note: 'if' and 'ifelse' are parsed separately. +// The rest are listed here in alphabetical order. +// The index in this table is equivalent to the entry in PSOp. +char *psOpNames[] = { + "abs", + "add", + "and", + "atan", + "bitshift", + "ceiling", + "copy", + "cos", + "cvi", + "cvr", + "div", + "dup", + "eq", + "exch", + "exp", + "false", + "floor", + "ge", + "gt", + "idiv", + "index", + "le", + "ln", + "log", + "lt", + "mod", + "mul", + "ne", + "neg", + "not", + "or", + "pop", + "roll", + "round", + "sin", + "sqrt", + "sub", + "true", + "truncate", + "xor" +}; + +#define nPSOps (sizeof(psOpNames) / sizeof(char *)) + +enum PSObjectType { + psBool, + psInt, + psReal, + psOperator, + psBlock +}; + +// In the code array, 'if'/'ifelse' operators take up three slots +// plus space for the code in the subclause(s). +// +// +---------------------------------+ +// | psOperator: psOpIf / psOpIfelse | +// +---------------------------------+ +// | psBlock: ptr= | +// +---------------------------------+ +// | psBlock: ptr= | +// +---------------------------------+ +// | if clause | +// | ... | +// | psOperator: psOpReturn | +// +---------------------------------+ +// | else clause | +// | ... | +// | psOperator: psOpReturn | +// +---------------------------------+ +// | ... | +// +// For 'if', pointer is present in the code stream but unused. + +struct PSObject { + PSObjectType type; + union { + GBool booln; // boolean (stack only) + int intg; // integer (stack and code) + double real; // real (stack and code) + PSOp op; // operator (code only) + int blk; // if/ifelse block pointer (code only) + }; +}; + +#define psStackSize 100 + +class PSStack { +public: + + PSStack() { sp = psStackSize; } + void pushBool(GBool booln); + void pushInt(int intg); + void pushReal(double real); + GBool popBool(); + int popInt(); + double popNum(); + GBool empty() { return sp == psStackSize; } + GBool topIsInt() { return sp < psStackSize && stack[sp].type == psInt; } + GBool topTwoAreInts() + { return sp < psStackSize - 1 && + stack[sp].type == psInt && + stack[sp+1].type == psInt; } + GBool topIsReal() { return sp < psStackSize && stack[sp].type == psReal; } + GBool topTwoAreNums() + { return sp < psStackSize - 1 && + (stack[sp].type == psInt || stack[sp].type == psReal) && + (stack[sp+1].type == psInt || stack[sp+1].type == psReal); } + void copy(int n); + void roll(int n, int j); + void index(int i); + void pop(); + +private: + + GBool checkOverflow(int n = 1); + GBool checkUnderflow(); + GBool checkType(PSObjectType t1, PSObjectType t2); + + PSObject stack[psStackSize]; + int sp; +}; + +GBool PSStack::checkOverflow(int n) { + if (sp - n < 0) { + error(-1, "Stack overflow in PostScript function"); + return gFalse; + } + return gTrue; +} + +GBool PSStack::checkUnderflow() { + if (sp == psStackSize) { + error(-1, "Stack underflow in PostScript function"); + return gFalse; + } + return gTrue; +} + +GBool PSStack::checkType(PSObjectType t1, PSObjectType t2) { + if (stack[sp].type != t1 && stack[sp].type != t2) { + error(-1, "Type mismatch in PostScript function"); + return gFalse; + } + return gTrue; +} + +void PSStack::pushBool(GBool booln) { + if (checkOverflow()) { + stack[--sp].type = psBool; + stack[sp].booln = booln; + } +} + +void PSStack::pushInt(int intg) { + if (checkOverflow()) { + stack[--sp].type = psInt; + stack[sp].intg = intg; + } +} + +void PSStack::pushReal(double real) { + if (checkOverflow()) { + stack[--sp].type = psReal; + stack[sp].real = real; + } +} + +GBool PSStack::popBool() { + if (checkUnderflow() && checkType(psBool, psBool)) { + return stack[sp++].booln; + } + return gFalse; +} + +int PSStack::popInt() { + if (checkUnderflow() && checkType(psInt, psInt)) { + return stack[sp++].intg; + } + return 0; +} + +double PSStack::popNum() { + double ret; + + if (checkUnderflow() && checkType(psInt, psReal)) { + ret = (stack[sp].type == psInt) ? (double)stack[sp].intg : stack[sp].real; + ++sp; + return ret; + } + return 0; +} + +void PSStack::copy(int n) { + int i; + + if (sp + n > psStackSize) { + error(-1, "Stack underflow in PostScript function"); + return; + } + if (!checkOverflow(n)) { + return; + } + for (i = sp + n - 1; i >= sp; --i) { + stack[i - n] = stack[i]; + } + sp -= n; +} + +void PSStack::roll(int n, int j) { + PSObject obj; + int i, k; + + if (j >= 0) { + j %= n; + } else { + j = -j % n; + if (j != 0) { + j = n - j; + } + } + if (n <= 0 || j == 0) { + return; + } + for (i = 0; i < j; ++i) { + obj = stack[sp]; + for (k = sp; k < sp + n - 1; ++k) { + stack[k] = stack[k+1]; + } + stack[sp + n - 1] = obj; + } +} + +void PSStack::index(int i) { + if (!checkOverflow()) { + return; + } + --sp; + stack[sp] = stack[sp + 1 + i]; +} + +void PSStack::pop() { + if (!checkUnderflow()) { + return; + } + ++sp; +} + +PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) { + Stream *str; + int codePtr; + GString *tok; + + code = NULL; + codeSize = 0; + ok = gFalse; + + //----- initialize the generic stuff + if (!init(dict)) { + goto err1; + } + if (!hasRange) { + error(-1, "Type 4 function is missing range"); + goto err1; + } + + //----- get the stream + if (!funcObj->isStream()) { + error(-1, "Type 4 function isn't a stream"); + goto err1; + } + str = funcObj->getStream(); + + //----- parse the function + codeString = new GString(); + str->reset(); + if (!(tok = getToken(str)) || tok->cmp("{")) { + error(-1, "Expected '{' at start of PostScript function"); + if (tok) { + delete tok; + } + goto err1; + } + delete tok; + codePtr = 0; + if (!parseCode(str, &codePtr)) { + goto err2; + } + str->close(); + + ok = gTrue; + + err2: + str->close(); + err1: + return; +} + +PostScriptFunction::PostScriptFunction(PostScriptFunction *func) { + memcpy(this, func, sizeof(PostScriptFunction)); + code = (PSObject *)gmallocn(codeSize, sizeof(PSObject)); + memcpy(code, func->code, codeSize * sizeof(PSObject)); + codeString = func->codeString->copy(); +} + +PostScriptFunction::~PostScriptFunction() { + gfree(code); + delete codeString; +} + +void PostScriptFunction::transform(double *in, double *out) { + PSStack *stack; + int i; + + stack = new PSStack(); + for (i = 0; i < m; ++i) { + //~ may need to check for integers here + stack->pushReal(in[i]); + } + exec(stack, 0); + for (i = n - 1; i >= 0; --i) { + out[i] = stack->popNum(); + if (out[i] < range[i][0]) { + out[i] = range[i][0]; + } else if (out[i] > range[i][1]) { + out[i] = range[i][1]; + } + } + // if (!stack->empty()) { + // error(-1, "Extra values on stack at end of PostScript function"); + // } + delete stack; +} + +GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) { + GString *tok; + char *p; + GBool isReal; + int opPtr, elsePtr; + int a, b, mid, cmp; + + while (1) { + if (!(tok = getToken(str))) { + error(-1, "Unexpected end of PostScript function stream"); + return gFalse; + } + p = tok->getCString(); + if (isdigit(*p) || *p == '.' || *p == '-') { + isReal = gFalse; + for (++p; *p; ++p) { + if (*p == '.') { + isReal = gTrue; + break; + } + } + resizeCode(*codePtr); + if (isReal) { + code[*codePtr].type = psReal; + code[*codePtr].real = atof(tok->getCString()); + } else { + code[*codePtr].type = psInt; + code[*codePtr].intg = atoi(tok->getCString()); + } + ++*codePtr; + delete tok; + } else if (!tok->cmp("{")) { + delete tok; + opPtr = *codePtr; + *codePtr += 3; + resizeCode(opPtr + 2); + if (!parseCode(str, codePtr)) { + return gFalse; + } + if (!(tok = getToken(str))) { + error(-1, "Unexpected end of PostScript function stream"); + return gFalse; + } + if (!tok->cmp("{")) { + elsePtr = *codePtr; + if (!parseCode(str, codePtr)) { + return gFalse; + } + delete tok; + if (!(tok = getToken(str))) { + error(-1, "Unexpected end of PostScript function stream"); + return gFalse; + } + } else { + elsePtr = -1; + } + if (!tok->cmp("if")) { + if (elsePtr >= 0) { + error(-1, "Got 'if' operator with two blocks in PostScript function"); + return gFalse; + } + code[opPtr].type = psOperator; + code[opPtr].op = psOpIf; + code[opPtr+2].type = psBlock; + code[opPtr+2].blk = *codePtr; + } else if (!tok->cmp("ifelse")) { + if (elsePtr < 0) { + error(-1, "Got 'ifelse' operator with one blocks in PostScript function"); + return gFalse; + } + code[opPtr].type = psOperator; + code[opPtr].op = psOpIfelse; + code[opPtr+1].type = psBlock; + code[opPtr+1].blk = elsePtr; + code[opPtr+2].type = psBlock; + code[opPtr+2].blk = *codePtr; + } else { + error(-1, "Expected if/ifelse operator in PostScript function"); + delete tok; + return gFalse; + } + delete tok; + } else if (!tok->cmp("}")) { + delete tok; + resizeCode(*codePtr); + code[*codePtr].type = psOperator; + code[*codePtr].op = psOpReturn; + ++*codePtr; + break; + } else { + a = -1; + b = nPSOps; + // invariant: psOpNames[a] < tok < psOpNames[b] + while (b - a > 1) { + mid = (a + b) / 2; + cmp = tok->cmp(psOpNames[mid]); + if (cmp > 0) { + a = mid; + } else if (cmp < 0) { + b = mid; + } else { + a = b = mid; + } + } + if (cmp != 0) { + error(-1, "Unknown operator '%s' in PostScript function", + tok->getCString()); + delete tok; + return gFalse; + } + delete tok; + resizeCode(*codePtr); + code[*codePtr].type = psOperator; + code[*codePtr].op = (PSOp)a; + ++*codePtr; + } + } + return gTrue; +} + +GString *PostScriptFunction::getToken(Stream *str) { + GString *s; + int c; + GBool comment; + + s = new GString(); + comment = gFalse; + while (1) { + if ((c = str->getChar()) == EOF) { + break; + } + codeString->append(c); + if (comment) { + if (c == '\x0a' || c == '\x0d') { + comment = gFalse; + } + } else if (c == '%') { + comment = gTrue; + } else if (!isspace(c)) { + break; + } + } + if (c == '{' || c == '}') { + s->append((char)c); + } else if (isdigit(c) || c == '.' || c == '-') { + while (1) { + s->append((char)c); + c = str->lookChar(); + if (c == EOF || !(isdigit(c) || c == '.' || c == '-')) { + break; + } + str->getChar(); + codeString->append(c); + } + } else { + while (1) { + s->append((char)c); + c = str->lookChar(); + if (c == EOF || !isalnum(c)) { + break; + } + str->getChar(); + codeString->append(c); + } + } + return s; +} + +void PostScriptFunction::resizeCode(int newSize) { + if (newSize >= codeSize) { + codeSize += 64; + code = (PSObject *)greallocn(code, codeSize, sizeof(PSObject)); + } +} + +void PostScriptFunction::exec(PSStack *stack, int codePtr) { + int i1, i2; + double r1, r2; + GBool b1, b2; + + while (1) { + switch (code[codePtr].type) { + case psInt: + stack->pushInt(code[codePtr++].intg); + break; + case psReal: + stack->pushReal(code[codePtr++].real); + break; + case psOperator: + switch (code[codePtr++].op) { + case psOpAbs: + if (stack->topIsInt()) { + stack->pushInt(abs(stack->popInt())); + } else { + stack->pushReal(fabs(stack->popNum())); + } + break; + case psOpAdd: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 + i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 + r2); + } + break; + case psOpAnd: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 & i2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 && b2); + } + break; + case psOpAtan: + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(atan2(r1, r2)); + break; + case psOpBitshift: + i2 = stack->popInt(); + i1 = stack->popInt(); + if (i2 > 0) { + stack->pushInt(i1 << i2); + } else if (i2 < 0) { + stack->pushInt((int)((Guint)i1 >> i2)); + } else { + stack->pushInt(i1); + } + break; + case psOpCeiling: + if (!stack->topIsInt()) { + stack->pushReal(ceil(stack->popNum())); + } + break; + case psOpCopy: + stack->copy(stack->popInt()); + break; + case psOpCos: + stack->pushReal(cos(stack->popNum())); + break; + case psOpCvi: + if (!stack->topIsInt()) { + stack->pushInt((int)stack->popNum()); + } + break; + case psOpCvr: + if (!stack->topIsReal()) { + stack->pushReal(stack->popNum()); + } + break; + case psOpDiv: + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 / r2); + break; + case psOpDup: + stack->copy(1); + break; + case psOpEq: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 == i2); + } else if (stack->topTwoAreNums()) { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 == r2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 == b2); + } + break; + case psOpExch: + stack->roll(2, 1); + break; + case psOpExp: + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(pow(r1, r2)); + break; + case psOpFalse: + stack->pushBool(gFalse); + break; + case psOpFloor: + if (!stack->topIsInt()) { + stack->pushReal(floor(stack->popNum())); + } + break; + case psOpGe: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 >= i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 >= r2); + } + break; + case psOpGt: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 > i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 > r2); + } + break; + case psOpIdiv: + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 / i2); + break; + case psOpIndex: + stack->index(stack->popInt()); + break; + case psOpLe: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 <= i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 <= r2); + } + break; + case psOpLn: + stack->pushReal(log(stack->popNum())); + break; + case psOpLog: + stack->pushReal(log10(stack->popNum())); + break; + case psOpLt: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 < i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 < r2); + } + break; + case psOpMod: + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 % i2); + break; + case psOpMul: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + //~ should check for out-of-range, and push a real instead + stack->pushInt(i1 * i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 * r2); + } + break; + case psOpNe: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushBool(i1 != i2); + } else if (stack->topTwoAreNums()) { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushBool(r1 != r2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 != b2); + } + break; + case psOpNeg: + if (stack->topIsInt()) { + stack->pushInt(-stack->popInt()); + } else { + stack->pushReal(-stack->popNum()); + } + break; + case psOpNot: + if (stack->topIsInt()) { + stack->pushInt(~stack->popInt()); + } else { + stack->pushBool(!stack->popBool()); + } + break; + case psOpOr: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 | i2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 || b2); + } + break; + case psOpPop: + stack->pop(); + break; + case psOpRoll: + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->roll(i1, i2); + break; + case psOpRound: + if (!stack->topIsInt()) { + r1 = stack->popNum(); + stack->pushReal((r1 >= 0) ? floor(r1 + 0.5) : ceil(r1 - 0.5)); + } + break; + case psOpSin: + stack->pushReal(sin(stack->popNum())); + break; + case psOpSqrt: + stack->pushReal(sqrt(stack->popNum())); + break; + case psOpSub: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 - i2); + } else { + r2 = stack->popNum(); + r1 = stack->popNum(); + stack->pushReal(r1 - r2); + } + break; + case psOpTrue: + stack->pushBool(gTrue); + break; + case psOpTruncate: + if (!stack->topIsInt()) { + r1 = stack->popNum(); + stack->pushReal((r1 >= 0) ? floor(r1) : ceil(r1)); + } + break; + case psOpXor: + if (stack->topTwoAreInts()) { + i2 = stack->popInt(); + i1 = stack->popInt(); + stack->pushInt(i1 ^ i2); + } else { + b2 = stack->popBool(); + b1 = stack->popBool(); + stack->pushBool(b1 ^ b2); + } + break; + case psOpIf: + b1 = stack->popBool(); + if (b1) { + exec(stack, codePtr + 2); + } + codePtr = code[codePtr + 1].blk; + break; + case psOpIfelse: + b1 = stack->popBool(); + if (b1) { + exec(stack, codePtr + 2); + } else { + exec(stack, code[codePtr].blk); + } + codePtr = code[codePtr + 1].blk; + break; + case psOpReturn: + return; + } + break; + default: + error(-1, "Internal: bad object in PostScript function code"); + break; + } + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h new file mode 100644 index 000000000..334a4390f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h @@ -0,0 +1,229 @@ +//======================================================================== +// +// Function.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef FUNCTION_H +#define FUNCTION_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" + +class Dict; +class Stream; +struct PSObject; +class PSStack; + +//------------------------------------------------------------------------ +// Function +//------------------------------------------------------------------------ + +#define funcMaxInputs 32 +#define funcMaxOutputs 32 +#define sampledFuncMaxInputs 16 + +class Function { +public: + + Function(); + + virtual ~Function(); + + // Construct a function. Returns NULL if unsuccessful. + static Function *parse(Object *funcObj); + + // Initialize the entries common to all function types. + GBool init(Dict *dict); + + virtual Function *copy() = 0; + + // Return the function type: + // -1 : identity + // 0 : sampled + // 2 : exponential + // 3 : stitching + // 4 : PostScript + virtual int getType() = 0; + + // Return size of input and output tuples. + int getInputSize() { return m; } + int getOutputSize() { return n; } + + double getDomainMin(int i) { return domain[i][0]; } + double getDomainMax(int i) { return domain[i][1]; } + double getRangeMin(int i) { return range[i][0]; } + double getRangeMax(int i) { return range[i][1]; } + GBool getHasRange() { return hasRange; } + + // Transform an input tuple into an output tuple. + virtual void transform(double *in, double *out) = 0; + + virtual GBool isOk() = 0; + +protected: + + int m, n; // size of input and output tuples + double // min and max values for function domain + domain[funcMaxInputs][2]; + double // min and max values for function range + range[funcMaxOutputs][2]; + GBool hasRange; // set if range is defined +}; + +//------------------------------------------------------------------------ +// IdentityFunction +//------------------------------------------------------------------------ + +class IdentityFunction: public Function { +public: + + IdentityFunction(); + virtual ~IdentityFunction(); + virtual Function *copy() { return new IdentityFunction(); } + virtual int getType() { return -1; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return gTrue; } + +private: +}; + +//------------------------------------------------------------------------ +// SampledFunction +//------------------------------------------------------------------------ + +class SampledFunction: public Function { +public: + + SampledFunction(Object *funcObj, Dict *dict); + virtual ~SampledFunction(); + virtual Function *copy() { return new SampledFunction(this); } + virtual int getType() { return 0; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + int getSampleSize(int i) { return sampleSize[i]; } + double getEncodeMin(int i) { return encode[i][0]; } + double getEncodeMax(int i) { return encode[i][1]; } + double getDecodeMin(int i) { return decode[i][0]; } + double getDecodeMax(int i) { return decode[i][1]; } + double *getSamples() { return samples; } + +private: + + SampledFunction(SampledFunction *func); + + int // number of samples for each domain element + sampleSize[funcMaxInputs]; + double // min and max values for domain encoder + encode[funcMaxInputs][2]; + double // min and max values for range decoder + decode[funcMaxOutputs][2]; + double // input multipliers + inputMul[funcMaxInputs]; + int idxMul[funcMaxInputs]; // sample array index multipliers + double *samples; // the samples + int nSamples; // size of the samples array + double *sBuf; // buffer for the transform function + GBool ok; +}; + +//------------------------------------------------------------------------ +// ExponentialFunction +//------------------------------------------------------------------------ + +class ExponentialFunction: public Function { +public: + + ExponentialFunction(Object *funcObj, Dict *dict); + virtual ~ExponentialFunction(); + virtual Function *copy() { return new ExponentialFunction(this); } + virtual int getType() { return 2; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + double *getC0() { return c0; } + double *getC1() { return c1; } + double getE() { return e; } + +private: + + ExponentialFunction(ExponentialFunction *func); + + double c0[funcMaxOutputs]; + double c1[funcMaxOutputs]; + double e; + GBool ok; +}; + +//------------------------------------------------------------------------ +// StitchingFunction +//------------------------------------------------------------------------ + +class StitchingFunction: public Function { +public: + + StitchingFunction(Object *funcObj, Dict *dict); + virtual ~StitchingFunction(); + virtual Function *copy() { return new StitchingFunction(this); } + virtual int getType() { return 3; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + int getNumFuncs() { return k; } + Function *getFunc(int i) { return funcs[i]; } + double *getBounds() { return bounds; } + double *getEncode() { return encode; } + double *getScale() { return scale; } + +private: + + StitchingFunction(StitchingFunction *func); + + int k; + Function **funcs; + double *bounds; + double *encode; + double *scale; + GBool ok; +}; + +//------------------------------------------------------------------------ +// PostScriptFunction +//------------------------------------------------------------------------ + +class PostScriptFunction: public Function { +public: + + PostScriptFunction(Object *funcObj, Dict *dict); + virtual ~PostScriptFunction(); + virtual Function *copy() { return new PostScriptFunction(this); } + virtual int getType() { return 4; } + virtual void transform(double *in, double *out); + virtual GBool isOk() { return ok; } + + GString *getCodeString() { return codeString; } + +private: + + PostScriptFunction(PostScriptFunction *func); + GBool parseCode(Stream *str, int *codePtr); + GString *getToken(Stream *str); + void resizeCode(int newSize); + void exec(PSStack *stack, int codePtr); + + GString *codeString; + PSObject *code; + int codeSize; + GBool ok; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc new file mode 100644 index 000000000..b51a76430 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc @@ -0,0 +1,380 @@ +//======================================================================== +// +// GHash.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "gmem.h" +#include "GString.h" +#include "GHash.h" + +//------------------------------------------------------------------------ + +struct GHashBucket { + GString *key; + union { + void *p; + int i; + } val; + GHashBucket *next; +}; + +struct GHashIter { + int h; + GHashBucket *p; +}; + +//------------------------------------------------------------------------ + +GHash::GHash(GBool deleteKeysA) { + int h; + + deleteKeys = deleteKeysA; + size = 7; + tab = (GHashBucket **)gmallocn(size, sizeof(GHashBucket *)); + for (h = 0; h < size; ++h) { + tab[h] = NULL; + } + len = 0; +} + +GHash::~GHash() { + GHashBucket *p; + int h; + + for (h = 0; h < size; ++h) { + while (tab[h]) { + p = tab[h]; + tab[h] = p->next; + if (deleteKeys) { + delete p->key; + } + delete p; + } + } + gfree(tab); +} + +void GHash::add(GString *key, void *val) { + GHashBucket *p; + int h; + + // expand the table if necessary + if (len >= size) { + expand(); + } + + // add the new symbol + p = new GHashBucket; + p->key = key; + p->val.p = val; + h = hash(key); + p->next = tab[h]; + tab[h] = p; + ++len; +} + +void GHash::add(GString *key, int val) { + GHashBucket *p; + int h; + + // expand the table if necessary + if (len >= size) { + expand(); + } + + // add the new symbol + p = new GHashBucket; + p->key = key; + p->val.i = val; + h = hash(key); + p->next = tab[h]; + tab[h] = p; + ++len; +} + +void GHash::replace(GString *key, void *val) { + GHashBucket *p; + int h; + + if ((p = find(key, &h))) { + p->val.p = val; + delete key; + } else { + add(key, val); + } +} + +void GHash::replace(GString *key, int val) { + GHashBucket *p; + int h; + + if ((p = find(key, &h))) { + p->val.i = val; + delete key; + } else { + add(key, val); + } +} + +void *GHash::lookup(GString *key) { + GHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + return p->val.p; +} + +int GHash::lookupInt(GString *key) { + GHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + return p->val.i; +} + +void *GHash::lookup(char *key) { + GHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + return p->val.p; +} + +int GHash::lookupInt(char *key) { + GHashBucket *p; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + return p->val.i; +} + +void *GHash::remove(GString *key) { + GHashBucket *p; + GHashBucket **q; + void *val; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.p; + delete p; + --len; + return val; +} + +int GHash::removeInt(GString *key) { + GHashBucket *p; + GHashBucket **q; + int val; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.i; + delete p; + --len; + return val; +} + +void *GHash::remove(char *key) { + GHashBucket *p; + GHashBucket **q; + void *val; + int h; + + if (!(p = find(key, &h))) { + return NULL; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.p; + delete p; + --len; + return val; +} + +int GHash::removeInt(char *key) { + GHashBucket *p; + GHashBucket **q; + int val; + int h; + + if (!(p = find(key, &h))) { + return 0; + } + q = &tab[h]; + while (*q != p) { + q = &((*q)->next); + } + *q = p->next; + if (deleteKeys) { + delete p->key; + } + val = p->val.i; + delete p; + --len; + return val; +} + +void GHash::startIter(GHashIter **iter) { + *iter = new GHashIter; + (*iter)->h = -1; + (*iter)->p = NULL; +} + +GBool GHash::getNext(GHashIter **iter, GString **key, void **val) { + if (!*iter) { + return gFalse; + } + if ((*iter)->p) { + (*iter)->p = (*iter)->p->next; + } + while (!(*iter)->p) { + if (++(*iter)->h == size) { + delete *iter; + *iter = NULL; + return gFalse; + } + (*iter)->p = tab[(*iter)->h]; + } + *key = (*iter)->p->key; + *val = (*iter)->p->val.p; + return gTrue; +} + +GBool GHash::getNext(GHashIter **iter, GString **key, int *val) { + if (!*iter) { + return gFalse; + } + if ((*iter)->p) { + (*iter)->p = (*iter)->p->next; + } + while (!(*iter)->p) { + if (++(*iter)->h == size) { + delete *iter; + *iter = NULL; + return gFalse; + } + (*iter)->p = tab[(*iter)->h]; + } + *key = (*iter)->p->key; + *val = (*iter)->p->val.i; + return gTrue; +} + +void GHash::killIter(GHashIter **iter) { + delete *iter; + *iter = NULL; +} + +void GHash::expand() { + GHashBucket **oldTab; + GHashBucket *p; + int oldSize, h, i; + + oldSize = size; + oldTab = tab; + size = 2*size + 1; + tab = (GHashBucket **)gmallocn(size, sizeof(GHashBucket *)); + for (h = 0; h < size; ++h) { + tab[h] = NULL; + } + for (i = 0; i < oldSize; ++i) { + while (oldTab[i]) { + p = oldTab[i]; + oldTab[i] = oldTab[i]->next; + h = hash(p->key); + p->next = tab[h]; + tab[h] = p; + } + } + gfree(oldTab); +} + +GHashBucket *GHash::find(GString *key, int *h) { + GHashBucket *p; + + *h = hash(key); + for (p = tab[*h]; p; p = p->next) { + if (!p->key->cmp(key)) { + return p; + } + } + return NULL; +} + +GHashBucket *GHash::find(char *key, int *h) { + GHashBucket *p; + + *h = hash(key); + for (p = tab[*h]; p; p = p->next) { + if (!p->key->cmp(key)) { + return p; + } + } + return NULL; +} + +int GHash::hash(GString *key) { + char *p; + unsigned int h; + int i; + + h = 0; + for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} + +int GHash::hash(char *key) { + char *p; + unsigned int h; + + h = 0; + for (p = key; *p; ++p) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h new file mode 100644 index 000000000..31aba9325 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h @@ -0,0 +1,78 @@ +//======================================================================== +// +// GHash.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GHASH_H +#define GHASH_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +class GString; +struct GHashBucket; +struct GHashIter; + +//------------------------------------------------------------------------ + +class GHash { +public: + + GHash(GBool deleteKeysA = gFalse); + ~GHash(); + void add(GString *key, void *val); + void add(GString *key, int val); + void replace(GString *key, void *val); + void replace(GString *key, int val); + void *lookup(GString *key); + int lookupInt(GString *key); + void *lookup(char *key); + int lookupInt(char *key); + void *remove(GString *key); + int removeInt(GString *key); + void *remove(char *key); + int removeInt(char *key); + int getLength() { return len; } + void startIter(GHashIter **iter); + GBool getNext(GHashIter **iter, GString **key, void **val); + GBool getNext(GHashIter **iter, GString **key, int *val); + void killIter(GHashIter **iter); + +private: + + void expand(); + GHashBucket *find(GString *key, int *h); + GHashBucket *find(char *key, int *h); + int hash(GString *key); + int hash(char *key); + + GBool deleteKeys; // set if key strings should be deleted + int size; // number of buckets + int len; // number of entries + GHashBucket **tab; +}; + +#define deleteGHash(hash, T) \ + do { \ + GHash *_hash = (hash); \ + { \ + GHashIter *_iter; \ + GString *_key; \ + void *_p; \ + _hash->startIter(&_iter); \ + while (_hash->getNext(&_iter, &_key, &_p)) { \ + delete (T*)_p; \ + } \ + delete _hash; \ + } \ + } while(0) + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc new file mode 100644 index 000000000..fb5fd6284 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc @@ -0,0 +1,97 @@ +//======================================================================== +// +// GList.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "GList.h" + +//------------------------------------------------------------------------ +// GList +//------------------------------------------------------------------------ + +GList::GList() { + size = 8; + data = (void **)gmallocn(size, sizeof(void*)); + length = 0; + inc = 0; +} + +GList::GList(int sizeA) { + size = sizeA; + data = (void **)gmallocn(size, sizeof(void*)); + length = 0; + inc = 0; +} + +GList::~GList() { + gfree(data); +} + +void GList::append(void *p) { + if (length >= size) { + expand(); + } + data[length++] = p; +} + +void GList::append(GList *list) { + int i; + + while (length + list->length > size) { + expand(); + } + for (i = 0; i < list->length; ++i) { + data[length++] = list->data[i]; + } +} + +void GList::insert(int i, void *p) { + if (length >= size) { + expand(); + } + if (i < length) { + memmove(data+i+1, data+i, (length - i) * sizeof(void *)); + } + data[i] = p; + ++length; +} + +void *GList::del(int i) { + void *p; + + p = data[i]; + if (i < length - 1) { + memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *)); + } + --length; + if (size - length >= ((inc > 0) ? inc : size/2)) { + shrink(); + } + return p; +} + +void GList::sort(int (*cmp)(const void *obj1, const void *obj2)) { + qsort(data, length, sizeof(void *), cmp); +} + +void GList::expand() { + size += (inc > 0) ? inc : size; + data = (void **)greallocn(data, size, sizeof(void*)); +} + +void GList::shrink() { + size -= (inc > 0) ? inc : size/2; + data = (void **)greallocn(data, size, sizeof(void*)); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h new file mode 100644 index 000000000..e4d8ff8f1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h @@ -0,0 +1,96 @@ +//======================================================================== +// +// GList.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GLIST_H +#define GLIST_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ +// GList +//------------------------------------------------------------------------ + +class GList { +public: + + // Create an empty list. + GList(); + + // Create an empty list with space for elements. + GList(int sizeA); + + // Destructor - does not free pointed-to objects. + ~GList(); + + //----- general + + // Get the number of elements. + int getLength() { return length; } + + //----- ordered list support + + // Return the th element. + // Assumes 0 <= i < length. + void *get(int i) { return data[i]; } + + // Append an element to the end of the list. + void append(void *p); + + // Append another list to the end of this one. + void append(GList *list); + + // Insert an element at index . + // Assumes 0 <= i <= length. + void insert(int i, void *p); + + // Deletes and returns the element at index . + // Assumes 0 <= i < length. + void *del(int i); + + // Sort the list accoring to the given comparison function. + // NB: this sorts an array of pointers, so the pointer args need to + // be double-dereferenced. + void sort(int (*cmp)(const void *ptr1, const void *ptr2)); + + //----- control + + // Set allocation increment to . If inc > 0, that many + // elements will be allocated every time the list is expanded. + // If inc <= 0, the list will be doubled in size. + void setAllocIncr(int incA) { inc = incA; } + +private: + + void expand(); + void shrink(); + + void **data; // the list elements + int size; // size of data array + int length; // number of elements on list + int inc; // allocation increment +}; + +#define deleteGList(list, T) \ + do { \ + GList *_list = (list); \ + { \ + int _i; \ + for (_i = 0; _i < _list->getLength(); ++_i) { \ + delete (T*)_list->get(_i); \ + } \ + delete _list; \ + } \ + } while (0) + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h new file mode 100644 index 000000000..7fa93d85e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h @@ -0,0 +1,49 @@ +//======================================================================== +// +// GMutex.h +// +// Portable mutex macros. +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GMUTEX_H +#define GMUTEX_H + +// Usage: +// +// GMutex m; +// gInitMutex(&m); +// ... +// gLockMutex(&m); +// ... critical section ... +// gUnlockMutex(&m); +// ... +// gDestroyMutex(&m); + +#ifdef WIN32 + +#include + +typedef CRITICAL_SECTION GMutex; + +#define gInitMutex(m) InitializeCriticalSection(m) +#define gDestroyMutex(m) DeleteCriticalSection(m) +#define gLockMutex(m) EnterCriticalSection(m) +#define gUnlockMutex(m) LeaveCriticalSection(m) + +#else // assume pthreads + +#include + +typedef pthread_mutex_t GMutex; + +#define gInitMutex(m) pthread_mutex_init(m, NULL) +#define gDestroyMutex(m) pthread_mutex_destroy(m) +#define gLockMutex(m) pthread_mutex_lock(m) +#define gUnlockMutex(m) pthread_mutex_unlock(m) + +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc new file mode 100644 index 000000000..e21fd3ea6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc @@ -0,0 +1,718 @@ +//======================================================================== +// +// GString.cc +// +// Simple variable-length string type. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "gmem.h" +#include "GString.h" + +//------------------------------------------------------------------------ + +union GStringFormatArg { + int i; + Guint ui; + long l; + Gulong ul; + double f; + char c; + char *s; + GString *gs; +}; + +enum GStringFormatType { + fmtIntDecimal, + fmtIntHex, + fmtIntOctal, + fmtIntBinary, + fmtUIntDecimal, + fmtUIntHex, + fmtUIntOctal, + fmtUIntBinary, + fmtLongDecimal, + fmtLongHex, + fmtLongOctal, + fmtLongBinary, + fmtULongDecimal, + fmtULongHex, + fmtULongOctal, + fmtULongBinary, + fmtDouble, + fmtDoubleTrim, + fmtChar, + fmtString, + fmtGString, + fmtSpace +}; + +static char *formatStrings[] = { + "d", "x", "o", "b", "ud", "ux", "uo", "ub", + "ld", "lx", "lo", "lb", "uld", "ulx", "ulo", "ulb", + "f", "g", + "c", + "s", + "t", + "w", + NULL +}; + +//------------------------------------------------------------------------ + +static inline int size(int len) { + int delta; + for (delta = 8; delta < len && delta < 0x100000; delta <<= 1) ; + // this is ((len + 1) + (delta - 1)) & ~(delta - 1) + return (len + delta) & ~(delta - 1); +} + +inline void GString::resize(int length1) { + char *s1; + + if (!s) { + s = new char[size(length1)]; + } else if (size(length1) != size(length)) { + s1 = new char[size(length1)]; + if (length1 < length) { + memcpy(s1, s, length1); + s1[length1] = '\0'; + } else { + memcpy(s1, s, length + 1); + } + delete[] s; + s = s1; + } +} + +GString::GString() { + s = NULL; + resize(length = 0); + s[0] = '\0'; +} + +GString::GString(const char *sA) { + int n = strlen(sA); + + s = NULL; + resize(length = n); + memcpy(s, sA, n + 1); +} + +GString::GString(const char *sA, int lengthA) { + s = NULL; + resize(length = lengthA); + memcpy(s, sA, length * sizeof(char)); + s[length] = '\0'; +} + +GString::GString(GString *str, int idx, int lengthA) { + s = NULL; + resize(length = lengthA); + memcpy(s, str->getCString() + idx, length); + s[length] = '\0'; +} + +GString::GString(GString *str) { + s = NULL; + resize(length = str->getLength()); + memcpy(s, str->getCString(), length + 1); +} + +GString::GString(GString *str1, GString *str2) { + int n1 = str1->getLength(); + int n2 = str2->getLength(); + + s = NULL; + resize(length = n1 + n2); + memcpy(s, str1->getCString(), n1); + memcpy(s + n1, str2->getCString(), n2 + 1); +} + +GString *GString::fromInt(int x) { + char buf[24]; // enough space for 64-bit ints plus a little extra + char *p; + int len; + + formatInt(x, buf, sizeof(buf), gFalse, 0, 10, &p, &len); + return new GString(p, len); +} + +GString *GString::format(char *fmt, ...) { + va_list argList; + GString *s; + + s = new GString(); + va_start(argList, fmt); + s->appendfv(fmt, argList); + va_end(argList); + return s; +} + +GString *GString::formatv(char *fmt, va_list argList) { + GString *s; + + s = new GString(); + s->appendfv(fmt, argList); + return s; +} + +GString::~GString() { + delete[] s; +} + +GString *GString::clear() { + s[length = 0] = '\0'; + resize(0); + return this; +} + +GString *GString::append(char c) { + resize(length + 1); + s[length++] = c; + s[length] = '\0'; + return this; +} + +GString *GString::append(GString *str) { + int n = str->getLength(); + + resize(length + n); + memcpy(s + length, str->getCString(), n + 1); + length += n; + return this; +} + +GString *GString::append(const char *str) { + int n = strlen(str); + + resize(length + n); + memcpy(s + length, str, n + 1); + length += n; + return this; +} + +GString *GString::append(const char *str, int lengthA) { + resize(length + lengthA); + memcpy(s + length, str, lengthA); + length += lengthA; + s[length] = '\0'; + return this; +} + +GString *GString::appendf(char *fmt, ...) { + va_list argList; + + va_start(argList, fmt); + appendfv(fmt, argList); + va_end(argList); + return this; +} + +GString *GString::appendfv(char *fmt, va_list argList) { + GStringFormatArg *args; + int argsLen, argsSize; + GStringFormatArg arg; + int idx, width, prec; + GBool reverseAlign, zeroFill; + GStringFormatType ft; + char buf[65]; + int len, i; + char *p0, *p1, *str; + + argsLen = 0; + argsSize = 8; + args = (GStringFormatArg *)gmallocn(argsSize, sizeof(GStringFormatArg)); + + p0 = fmt; + while (*p0) { + if (*p0 == '{') { + ++p0; + if (*p0 == '{') { + ++p0; + append('{'); + } else { + + // parse the format string + if (!(*p0 >= '0' && *p0 <= '9')) { + break; + } + idx = *p0 - '0'; + for (++p0; *p0 >= '0' && *p0 <= '9'; ++p0) { + idx = 10 * idx + (*p0 - '0'); + } + if (*p0 != ':') { + break; + } + ++p0; + if (*p0 == '-') { + reverseAlign = gTrue; + ++p0; + } else { + reverseAlign = gFalse; + } + width = 0; + zeroFill = *p0 == '0'; + for (; *p0 >= '0' && *p0 <= '9'; ++p0) { + width = 10 * width + (*p0 - '0'); + } + if (*p0 == '.') { + ++p0; + prec = 0; + for (; *p0 >= '0' && *p0 <= '9'; ++p0) { + prec = 10 * prec + (*p0 - '0'); + } + } else { + prec = 0; + } + for (ft = (GStringFormatType)0; + formatStrings[ft]; + ft = (GStringFormatType)(ft + 1)) { + if (!strncmp(p0, formatStrings[ft], strlen(formatStrings[ft]))) { + break; + } + } + if (!formatStrings[ft]) { + break; + } + p0 += strlen(formatStrings[ft]); + if (*p0 != '}') { + break; + } + ++p0; + + // fetch the argument + if (idx > argsLen) { + break; + } + if (idx == argsLen) { + if (argsLen == argsSize) { + argsSize *= 2; + args = (GStringFormatArg *)greallocn(args, argsSize, + sizeof(GStringFormatArg)); + } + switch (ft) { + case fmtIntDecimal: + case fmtIntHex: + case fmtIntOctal: + case fmtIntBinary: + case fmtSpace: + args[argsLen].i = va_arg(argList, int); + break; + case fmtUIntDecimal: + case fmtUIntHex: + case fmtUIntOctal: + case fmtUIntBinary: + args[argsLen].ui = va_arg(argList, Guint); + break; + case fmtLongDecimal: + case fmtLongHex: + case fmtLongOctal: + case fmtLongBinary: + args[argsLen].l = va_arg(argList, long); + break; + case fmtULongDecimal: + case fmtULongHex: + case fmtULongOctal: + case fmtULongBinary: + args[argsLen].ul = va_arg(argList, Gulong); + break; + case fmtDouble: + case fmtDoubleTrim: + args[argsLen].f = va_arg(argList, double); + break; + case fmtChar: + args[argsLen].c = (char)va_arg(argList, int); + break; + case fmtString: + args[argsLen].s = va_arg(argList, char *); + break; + case fmtGString: + args[argsLen].gs = va_arg(argList, GString *); + break; + } + ++argsLen; + } + + // format the argument + arg = args[idx]; + switch (ft) { + case fmtIntDecimal: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 10, &str, &len); + break; + case fmtIntHex: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 16, &str, &len); + break; + case fmtIntOctal: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtIntBinary: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtUIntDecimal: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 10, + &str, &len); + break; + case fmtUIntHex: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 16, + &str, &len); + break; + case fmtUIntOctal: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtUIntBinary: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtLongDecimal: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 10, &str, &len); + break; + case fmtLongHex: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 16, &str, &len); + break; + case fmtLongOctal: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtLongBinary: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtULongDecimal: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 10, + &str, &len); + break; + case fmtULongHex: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 16, + &str, &len); + break; + case fmtULongOctal: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 8, &str, &len); + break; + case fmtULongBinary: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 2, &str, &len); + break; + case fmtDouble: + formatDouble(arg.f, buf, sizeof(buf), prec, gFalse, &str, &len); + break; + case fmtDoubleTrim: + formatDouble(arg.f, buf, sizeof(buf), prec, gTrue, &str, &len); + break; + case fmtChar: + buf[0] = arg.c; + str = buf; + len = 1; + reverseAlign = !reverseAlign; + break; + case fmtString: + str = arg.s; + len = strlen(str); + reverseAlign = !reverseAlign; + break; + case fmtGString: + str = arg.gs->getCString(); + len = arg.gs->getLength(); + reverseAlign = !reverseAlign; + break; + case fmtSpace: + str = buf; + len = 0; + width = arg.i; + break; + } + + // append the formatted arg, handling width and alignment + if (!reverseAlign && len < width) { + for (i = len; i < width; ++i) { + append(' '); + } + } + append(str, len); + if (reverseAlign && len < width) { + for (i = len; i < width; ++i) { + append(' '); + } + } + } + + } else if (*p0 == '}') { + ++p0; + if (*p0 == '}') { + ++p0; + } + append('}'); + + } else { + for (p1 = p0 + 1; *p1 && *p1 != '{' && *p1 != '}'; ++p1) ; + append(p0, p1 - p0); + p0 = p1; + } + } + + gfree(args); + return this; +} + +void GString::formatInt(long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len) { + static char vals[17] = "0123456789abcdef"; + GBool neg; + int start, i, j; + + i = bufSize; + if ((neg = x < 0)) { + x = -x; + } + start = neg ? 1 : 0; + if (x == 0) { + buf[--i] = '0'; + } else { + while (i > start && x) { + buf[--i] = vals[x % base]; + x /= base; + } + } + if (zeroFill) { + for (j = bufSize - i; i > start && j < width - start; ++j) { + buf[--i] = '0'; + } + } + if (neg) { + buf[--i] = '-'; + } + *p = buf + i; + *len = bufSize - i; +} + +void GString::formatUInt(Gulong x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len) { + static char vals[17] = "0123456789abcdef"; + int i, j; + + i = bufSize; + if (x == 0) { + buf[--i] = '0'; + } else { + while (i > 0 && x) { + buf[--i] = vals[x % base]; + x /= base; + } + } + if (zeroFill) { + for (j = bufSize - i; i > 0 && j < width; ++j) { + buf[--i] = '0'; + } + } + *p = buf + i; + *len = bufSize - i; +} + +void GString::formatDouble(double x, char *buf, int bufSize, int prec, + GBool trim, char **p, int *len) { + GBool neg, started; + double x2; + int d, i, j; + + if ((neg = x < 0)) { + x = -x; + } + x = floor(x * pow(10, prec) + 0.5); + i = bufSize; + started = !trim; + for (j = 0; j < prec && i > 1; ++j) { + x2 = floor(0.1 * (x + 0.5)); + d = (int)floor(x - 10 * x2 + 0.5); + if (started || d != 0) { + buf[--i] = '0' + d; + started = gTrue; + } + x = x2; + } + if (i > 1 && started) { + buf[--i] = '.'; + } + if (i > 1) { + do { + x2 = floor(0.1 * (x + 0.5)); + d = (int)floor(x - 10 * x2 + 0.5); + buf[--i] = '0' + d; + x = x2; + } while (i > 1 && x); + } + if (neg) { + buf[--i] = '-'; + } + *p = buf + i; + *len = bufSize - i; +} + +GString *GString::insert(int i, char c) { + int j; + + resize(length + 1); + for (j = length + 1; j > i; --j) + s[j] = s[j-1]; + s[i] = c; + ++length; + return this; +} + +GString *GString::insert(int i, GString *str) { + int n = str->getLength(); + int j; + + resize(length + n); + for (j = length; j >= i; --j) + s[j+n] = s[j]; + memcpy(s+i, str->getCString(), n); + length += n; + return this; +} + +GString *GString::insert(int i, const char *str) { + int n = strlen(str); + int j; + + resize(length + n); + for (j = length; j >= i; --j) + s[j+n] = s[j]; + memcpy(s+i, str, n); + length += n; + return this; +} + +GString *GString::insert(int i, const char *str, int lengthA) { + int j; + + resize(length + lengthA); + for (j = length; j >= i; --j) + s[j+lengthA] = s[j]; + memcpy(s+i, str, lengthA); + length += lengthA; + return this; +} + +GString *GString::del(int i, int n) { + int j; + + if (n > 0) { + if (i + n > length) { + n = length - i; + } + for (j = i; j <= length - n; ++j) { + s[j] = s[j + n]; + } + resize(length -= n); + } + return this; +} + +GString *GString::upperCase() { + int i; + + for (i = 0; i < length; ++i) { + if (islower(s[i])) + s[i] = toupper(s[i]); + } + return this; +} + +GString *GString::lowerCase() { + int i; + + for (i = 0; i < length; ++i) { + if (isupper(s[i])) + s[i] = tolower(s[i]); + } + return this; +} + +int GString::cmp(GString *str) { + int n1, n2, i, x; + char *p1, *p2; + + n1 = length; + n2 = str->length; + for (i = 0, p1 = s, p2 = str->s; i < n1 && i < n2; ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + return n1 - n2; +} + +int GString::cmpN(GString *str, int n) { + int n1, n2, i, x; + char *p1, *p2; + + n1 = length; + n2 = str->length; + for (i = 0, p1 = s, p2 = str->s; + i < n1 && i < n2 && i < n; + ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + if (i == n) { + return 0; + } + return n1 - n2; +} + +int GString::cmp(const char *sA) { + int n1, i, x; + const char *p1, *p2; + + n1 = length; + for (i = 0, p1 = s, p2 = sA; i < n1 && *p2; ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + if (i < n1) { + return 1; + } + if (*p2) { + return -1; + } + return 0; +} + +int GString::cmpN(const char *sA, int n) { + int n1, i, x; + const char *p1, *p2; + + n1 = length; + for (i = 0, p1 = s, p2 = sA; i < n1 && *p2 && i < n; ++i, ++p1, ++p2) { + x = *p1 - *p2; + if (x != 0) { + return x; + } + } + if (i == n) { + return 0; + } + if (i < n1) { + return 1; + } + if (*p2) { + return -1; + } + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h new file mode 100644 index 000000000..dd22e2d8f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h @@ -0,0 +1,136 @@ +//======================================================================== +// +// GString.h +// +// Simple variable-length string type. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GSTRING_H +#define GSTRING_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "gtypes.h" + +class GString { +public: + + // Create an empty string. + GString(); + + // Create a string from a C string. + GString(const char *sA); + + // Create a string from chars at . This string + // can contain null characters. + GString(const char *sA, int lengthA); + + // Create a string from chars at in . + GString(GString *str, int idx, int lengthA); + + // Copy a string. + GString(GString *str); + GString *copy() { return new GString(this); } + + // Concatenate two strings. + GString(GString *str1, GString *str2); + + // Convert an integer to a string. + static GString *fromInt(int x); + + // Create a formatted string. Similar to printf, but without the + // string overflow issues. Formatting elements consist of: + // {:[][.]} + // where: + // - is the argument number (arg 0 is the first argument + // following the format string) -- NB: args must be first used in + // order; they can be reused in any order + // - is the field width -- negative to reverse the alignment; + // starting with a leading zero to zero-fill (for integers) + // - is the number of digits to the right of the decimal + // point (for floating point numbers) + // - is one of: + // d, x, o, b -- int in decimal, hex, octal, binary + // ud, ux, uo, ub -- unsigned int + // ld, lx, lo, lb, uld, ulx, ulo, ulb -- long, unsigned long + // f, g -- double + // c -- char + // s -- string (char *) + // t -- GString * + // w -- blank space; arg determines width + // To get literal curly braces, use {{ or }}. + static GString *format(char *fmt, ...); + static GString *formatv(char *fmt, va_list argList); + + // Destructor. + ~GString(); + + // Get length. + int getLength() { return length; } + + // Get C string. + char *getCString() { return s; } + + // Get th character. + char getChar(int i) { return s[i]; } + + // Change th character. + void setChar(int i, char c) { s[i] = c; } + + // Clear string to zero length. + GString *clear(); + + // Append a character or string. + GString *append(char c); + GString *append(GString *str); + GString *append(const char *str); + GString *append(const char *str, int lengthA); + + // Append a formatted string. + GString *appendf(char *fmt, ...); + GString *appendfv(char *fmt, va_list argList); + + // Insert a character or string. + GString *insert(int i, char c); + GString *insert(int i, GString *str); + GString *insert(int i, const char *str); + GString *insert(int i, const char *str, int lengthA); + + // Delete a character or range of characters. + GString *del(int i, int n = 1); + + // Convert string to all-upper/all-lower case. + GString *upperCase(); + GString *lowerCase(); + + // Compare two strings: -1:< 0:= +1:> + int cmp(GString *str); + int cmpN(GString *str, int n); + int cmp(const char *sA); + int cmpN(const char *sA, int n); + +private: + + int length; + char *s; + + void resize(int length1); + static void formatInt(long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len); + static void formatUInt(Gulong x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len); + static void formatDouble(double x, char *buf, int bufSize, int prec, + GBool trim, char **p, int *len); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc new file mode 100644 index 000000000..6bc6add8d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc @@ -0,0 +1,4197 @@ +//======================================================================== +// +// Gfx.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#include "gmem.h" +#include "GlobalParams.h" +#include "CharTypes.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "GfxFont.h" +#include "GfxState.h" +#include "OutputDev.h" +#include "Page.h" +#include "Annot.h" +#include "Error.h" +#include "Gfx.h" + +// the MSVC math.h doesn't define this +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +//------------------------------------------------------------------------ +// constants +//------------------------------------------------------------------------ + +// Max recursive depth for a function shading fill. +#define functionMaxDepth 6 + +// Max delta allowed in any color component for a function shading fill. +#define functionColorDelta (dblToCol(1 / 256.0)) + +// Max number of splits along the t axis for an axial shading fill. +#define axialMaxSplits 256 + +// Max delta allowed in any color component for an axial shading fill. +#define axialColorDelta (dblToCol(1 / 256.0)) + +// Max number of splits along the t axis for a radial shading fill. +#define radialMaxSplits 256 + +// Max delta allowed in any color component for a radial shading fill. +#define radialColorDelta (dblToCol(1 / 256.0)) + +// Max recursive depth for a Gouraud triangle shading fill. +#define gouraudMaxDepth 6 + +// Max delta allowed in any color component for a Gouraud triangle +// shading fill. +#define gouraudColorDelta (dblToCol(1 / 256.0)) + +// Max recursive depth for a patch mesh shading fill. +#define patchMaxDepth 6 + +// Max delta allowed in any color component for a patch mesh shading +// fill. +#define patchColorDelta (dblToCol(1 / 256.0)) + +//------------------------------------------------------------------------ +// Operator table +//------------------------------------------------------------------------ + +#ifdef WIN32 // this works around a bug in the VC7 compiler +# pragma optimize("",off) +#endif + +Operator Gfx::opTab[] = { + {"\"", 3, {tchkNum, tchkNum, tchkString}, + &Gfx::opMoveSetShowText}, + {"'", 1, {tchkString}, + &Gfx::opMoveShowText}, + {"B", 0, {tchkNone}, + &Gfx::opFillStroke}, + {"B*", 0, {tchkNone}, + &Gfx::opEOFillStroke}, + {"BDC", 2, {tchkName, tchkProps}, + &Gfx::opBeginMarkedContent}, + {"BI", 0, {tchkNone}, + &Gfx::opBeginImage}, + {"BMC", 1, {tchkName}, + &Gfx::opBeginMarkedContent}, + {"BT", 0, {tchkNone}, + &Gfx::opBeginText}, + {"BX", 0, {tchkNone}, + &Gfx::opBeginIgnoreUndef}, + {"CS", 1, {tchkName}, + &Gfx::opSetStrokeColorSpace}, + {"DP", 2, {tchkName, tchkProps}, + &Gfx::opMarkPoint}, + {"Do", 1, {tchkName}, + &Gfx::opXObject}, + {"EI", 0, {tchkNone}, + &Gfx::opEndImage}, + {"EMC", 0, {tchkNone}, + &Gfx::opEndMarkedContent}, + {"ET", 0, {tchkNone}, + &Gfx::opEndText}, + {"EX", 0, {tchkNone}, + &Gfx::opEndIgnoreUndef}, + {"F", 0, {tchkNone}, + &Gfx::opFill}, + {"G", 1, {tchkNum}, + &Gfx::opSetStrokeGray}, + {"ID", 0, {tchkNone}, + &Gfx::opImageData}, + {"J", 1, {tchkInt}, + &Gfx::opSetLineCap}, + {"K", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeCMYKColor}, + {"M", 1, {tchkNum}, + &Gfx::opSetMiterLimit}, + {"MP", 1, {tchkName}, + &Gfx::opMarkPoint}, + {"Q", 0, {tchkNone}, + &Gfx::opRestore}, + {"RG", 3, {tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeRGBColor}, + {"S", 0, {tchkNone}, + &Gfx::opStroke}, + {"SC", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetStrokeColor}, + {"SCN", -33, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN}, + &Gfx::opSetStrokeColorN}, + {"T*", 0, {tchkNone}, + &Gfx::opTextNextLine}, + {"TD", 2, {tchkNum, tchkNum}, + &Gfx::opTextMoveSet}, + {"TJ", 1, {tchkArray}, + &Gfx::opShowSpaceText}, + {"TL", 1, {tchkNum}, + &Gfx::opSetTextLeading}, + {"Tc", 1, {tchkNum}, + &Gfx::opSetCharSpacing}, + {"Td", 2, {tchkNum, tchkNum}, + &Gfx::opTextMove}, + {"Tf", 2, {tchkName, tchkNum}, + &Gfx::opSetFont}, + {"Tj", 1, {tchkString}, + &Gfx::opShowText}, + {"Tm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opSetTextMatrix}, + {"Tr", 1, {tchkInt}, + &Gfx::opSetTextRender}, + {"Ts", 1, {tchkNum}, + &Gfx::opSetTextRise}, + {"Tw", 1, {tchkNum}, + &Gfx::opSetWordSpacing}, + {"Tz", 1, {tchkNum}, + &Gfx::opSetHorizScaling}, + {"W", 0, {tchkNone}, + &Gfx::opClip}, + {"W*", 0, {tchkNone}, + &Gfx::opEOClip}, + {"b", 0, {tchkNone}, + &Gfx::opCloseFillStroke}, + {"b*", 0, {tchkNone}, + &Gfx::opCloseEOFillStroke}, + {"c", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opCurveTo}, + {"cm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opConcat}, + {"cs", 1, {tchkName}, + &Gfx::opSetFillColorSpace}, + {"d", 2, {tchkArray, tchkNum}, + &Gfx::opSetDash}, + {"d0", 2, {tchkNum, tchkNum}, + &Gfx::opSetCharWidth}, + {"d1", 6, {tchkNum, tchkNum, tchkNum, tchkNum, + tchkNum, tchkNum}, + &Gfx::opSetCacheDevice}, + {"f", 0, {tchkNone}, + &Gfx::opFill}, + {"f*", 0, {tchkNone}, + &Gfx::opEOFill}, + {"g", 1, {tchkNum}, + &Gfx::opSetFillGray}, + {"gs", 1, {tchkName}, + &Gfx::opSetExtGState}, + {"h", 0, {tchkNone}, + &Gfx::opClosePath}, + {"i", 1, {tchkNum}, + &Gfx::opSetFlat}, + {"j", 1, {tchkInt}, + &Gfx::opSetLineJoin}, + {"k", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillCMYKColor}, + {"l", 2, {tchkNum, tchkNum}, + &Gfx::opLineTo}, + {"m", 2, {tchkNum, tchkNum}, + &Gfx::opMoveTo}, + {"n", 0, {tchkNone}, + &Gfx::opEndPath}, + {"q", 0, {tchkNone}, + &Gfx::opSave}, + {"re", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opRectangle}, + {"rg", 3, {tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillRGBColor}, + {"ri", 1, {tchkName}, + &Gfx::opSetRenderingIntent}, + {"s", 0, {tchkNone}, + &Gfx::opCloseStroke}, + {"sc", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opSetFillColor}, + {"scn", -33, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN, tchkSCN, tchkSCN, tchkSCN, + tchkSCN}, + &Gfx::opSetFillColorN}, + {"sh", 1, {tchkName}, + &Gfx::opShFill}, + {"v", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opCurveTo1}, + {"w", 1, {tchkNum}, + &Gfx::opSetLineWidth}, + {"y", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, + &Gfx::opCurveTo2}, +}; + +#ifdef WIN32 // this works around a bug in the VC7 compiler +# pragma optimize("",on) +#endif + +#define numOps (sizeof(opTab) / sizeof(Operator)) + +//------------------------------------------------------------------------ +// GfxResources +//------------------------------------------------------------------------ + +GfxResources::GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA) { + Object obj1, obj2; + Ref r; + + if (resDict) { + + // build font dictionary + fonts = NULL; + resDict->lookupNF("Font", &obj1); + if (obj1.isRef()) { + obj1.fetch(xref, &obj2); + if (obj2.isDict()) { + r = obj1.getRef(); + fonts = new GfxFontDict(xref, &r, obj2.getDict()); + } + obj2.free(); + } else if (obj1.isDict()) { + fonts = new GfxFontDict(xref, NULL, obj1.getDict()); + } + obj1.free(); + + // get XObject dictionary + resDict->lookup("XObject", &xObjDict); + + // get color space dictionary + resDict->lookup("ColorSpace", &colorSpaceDict); + + // get pattern dictionary + resDict->lookup("Pattern", &patternDict); + + // get shading dictionary + resDict->lookup("Shading", &shadingDict); + + // get graphics state parameter dictionary + resDict->lookup("ExtGState", &gStateDict); + + } else { + fonts = NULL; + xObjDict.initNull(); + colorSpaceDict.initNull(); + patternDict.initNull(); + shadingDict.initNull(); + gStateDict.initNull(); + } + + next = nextA; +} + +GfxResources::~GfxResources() { + if (fonts) { + delete fonts; + } + xObjDict.free(); + colorSpaceDict.free(); + patternDict.free(); + shadingDict.free(); + gStateDict.free(); +} + +GfxFont *GfxResources::lookupFont(char *name) { + GfxFont *font; + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->fonts) { + if ((font = resPtr->fonts->lookup(name))) + return font; + } + } + error(-1, "Unknown font tag '%s'", name); + return NULL; +} + +GBool GfxResources::lookupXObject(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->xObjDict.isDict()) { + if (!resPtr->xObjDict.dictLookup(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(-1, "XObject '%s' is unknown", name); + return gFalse; +} + +GBool GfxResources::lookupXObjectNF(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->xObjDict.isDict()) { + if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull()) + return gTrue; + obj->free(); + } + } + error(-1, "XObject '%s' is unknown", name); + return gFalse; +} + +void GfxResources::lookupColorSpace(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->colorSpaceDict.isDict()) { + if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) { + return; + } + obj->free(); + } + } + obj->initNull(); +} + +GfxPattern *GfxResources::lookupPattern(char *name) { + GfxResources *resPtr; + GfxPattern *pattern; + Object obj; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->patternDict.isDict()) { + if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) { + pattern = GfxPattern::parse(&obj); + obj.free(); + return pattern; + } + obj.free(); + } + } + error(-1, "Unknown pattern '%s'", name); + return NULL; +} + +GfxShading *GfxResources::lookupShading(char *name) { + GfxResources *resPtr; + GfxShading *shading; + Object obj; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->shadingDict.isDict()) { + if (!resPtr->shadingDict.dictLookup(name, &obj)->isNull()) { + shading = GfxShading::parse(&obj); + obj.free(); + return shading; + } + obj.free(); + } + } + error(-1, "Unknown shading '%s'", name); + return NULL; +} + +GBool GfxResources::lookupGState(char *name, Object *obj) { + GfxResources *resPtr; + + for (resPtr = this; resPtr; resPtr = resPtr->next) { + if (resPtr->gStateDict.isDict()) { + if (!resPtr->gStateDict.dictLookup(name, obj)->isNull()) { + return gTrue; + } + obj->free(); + } + } + error(-1, "ExtGState '%s' is unknown", name); + return gFalse; +} + +//------------------------------------------------------------------------ +// Gfx +//------------------------------------------------------------------------ + +Gfx::Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, + double hDPI, double vDPI, PDFRectangle *box, + PDFRectangle *cropBox, int rotate, + GBool (*abortCheckCbkA)(void *data), + void *abortCheckCbkDataA) { + int i; + + xref = xrefA; + subPage = gFalse; + printCommands = globalParams->getPrintCommands(); + parser = NULL; + + // start the resource stack + res = new GfxResources(xref, resDict, NULL); + + // initialize + out = outA; + state = new GfxState(hDPI, vDPI, box, rotate, out->upsideDown()); + fontChanged = gFalse; + clip = clipNone; + ignoreUndef = 0; + out->startPage(pageNum, state); + out->setDefaultCTM(state->getCTM()); + out->updateAll(state); + for (i = 0; i < 6; ++i) { + baseMatrix[i] = state->getCTM()[i]; + } + formDepth = 0; + abortCheckCbk = abortCheckCbkA; + abortCheckCbkData = abortCheckCbkDataA; + + // set crop box +#ifdef XPDFEXE + if (cropBox) { + state->moveTo(cropBox->x1, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y2); + state->lineTo(cropBox->x1, cropBox->y2); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } +#endif +} + +Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, + PDFRectangle *box, PDFRectangle *cropBox, + GBool (*abortCheckCbkA)(void *data), + void *abortCheckCbkDataA) { + int i; + + xref = xrefA; + subPage = gTrue; + printCommands = globalParams->getPrintCommands(); + + // start the resource stack + res = new GfxResources(xref, resDict, NULL); + + // initialize + out = outA; + state = new GfxState(72, 72, box, 0, gFalse); + fontChanged = gFalse; + clip = clipNone; + ignoreUndef = 0; + for (i = 0; i < 6; ++i) { + baseMatrix[i] = state->getCTM()[i]; + } + formDepth = 0; + abortCheckCbk = abortCheckCbkA; + abortCheckCbkData = abortCheckCbkDataA; + + // set crop box + if (cropBox) { + state->moveTo(cropBox->x1, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y1); + state->lineTo(cropBox->x2, cropBox->y2); + state->lineTo(cropBox->x1, cropBox->y2); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } +} + +Gfx::~Gfx() { + while (state->hasSaves()) { + restoreState(); + } + if (!subPage) { + out->endPage(); + } + while (res) { + popResources(); + } + if (state) { + delete state; + } +} + +void Gfx::display(Object *obj, GBool topLevel) { + Object obj2; + int i; + + if (obj->isArray()) { + for (i = 0; i < obj->arrayGetLength(); ++i) { + obj->arrayGet(i, &obj2); + if (!obj2.isStream()) { + error(-1, "Weird page contents"); + obj2.free(); + return; + } + obj2.free(); + } + } else if (!obj->isStream()) { + error(-1, "Weird page contents"); + return; + } + parser = new Parser(xref, new Lexer(xref, obj), gFalse); + go(topLevel); + delete parser; + parser = NULL; +} + +void Gfx::go(GBool topLevel) { + Object obj; + Object args[maxArgs]; + int numArgs, i; + int lastAbortCheck; + + // scan a sequence of objects + updateLevel = lastAbortCheck = 0; + numArgs = 0; + parser->getObj(&obj); + while (!obj.isEOF()) { + + // got a command - execute it + if (obj.isCmd()) { + if (printCommands) { + obj.print(stdout); + for (i = 0; i < numArgs; ++i) { + printf(" "); + args[i].print(stdout); + } + printf("\n"); + fflush(stdout); + } + execOp(&obj, args, numArgs); + obj.free(); + for (i = 0; i < numArgs; ++i) + args[i].free(); + numArgs = 0; + + // periodically update display + if (++updateLevel >= 20000) { + out->dump(); + updateLevel = 0; + } + + // check for an abort + if (abortCheckCbk) { + if (updateLevel - lastAbortCheck > 10) { + if ((*abortCheckCbk)(abortCheckCbkData)) { + break; + } + lastAbortCheck = updateLevel; + } + } + + // got an argument - save it + } else if (numArgs < maxArgs) { + args[numArgs++] = obj; + + // too many arguments - something is wrong + } else { + error(getPos(), "Too many args in content stream"); + if (printCommands) { + printf("throwing away arg: "); + obj.print(stdout); + printf("\n"); + fflush(stdout); + } + obj.free(); + } + + // grab the next object + parser->getObj(&obj); + } + obj.free(); + + // args at end with no command + if (numArgs > 0) { + error(getPos(), "Leftover args in content stream"); + if (printCommands) { + printf("%d leftovers:", numArgs); + for (i = 0; i < numArgs; ++i) { + printf(" "); + args[i].print(stdout); + } + printf("\n"); + fflush(stdout); + } + for (i = 0; i < numArgs; ++i) + args[i].free(); + } + + // update display + if (topLevel && updateLevel > 0) { + out->dump(); + } +} + +void Gfx::execOp(Object *cmd, Object args[], int numArgs) { + Operator *op; + char *name; + Object *argPtr; + int i; + + // find operator + name = cmd->getCmd(); + if (!(op = findOp(name))) { + if (ignoreUndef == 0) + error(getPos(), "Unknown operator '%s'", name); + return; + } + + // type check args + argPtr = args; + if (op->numArgs >= 0) { + if (numArgs < op->numArgs) { + error(getPos(), "Too few (%d) args to '%s' operator", numArgs, name); + return; + } + if (numArgs > op->numArgs) { +#if 0 + error(getPos(), "Too many (%d) args to '%s' operator", numArgs, name); +#endif + argPtr += numArgs - op->numArgs; + numArgs = op->numArgs; + } + } else { + if (numArgs > -op->numArgs) { + error(getPos(), "Too many (%d) args to '%s' operator", + numArgs, name); + return; + } + } + for (i = 0; i < numArgs; ++i) { + if (!checkArg(&argPtr[i], op->tchk[i])) { + error(getPos(), "Arg #%d to '%s' operator is wrong type (%s)", + i, name, argPtr[i].getTypeName()); + return; + } + } + + // do it + (this->*op->func)(argPtr, numArgs); +} + +Operator *Gfx::findOp(char *name) { + int a, b, m, cmp; + + a = -1; + b = numOps; + // invariant: opTab[a] < name < opTab[b] + while (b - a > 1) { + m = (a + b) / 2; + cmp = strcmp(opTab[m].name, name); + if (cmp < 0) + a = m; + else if (cmp > 0) + b = m; + else + a = b = m; + } + if (cmp != 0) + return NULL; + return &opTab[a]; +} + +GBool Gfx::checkArg(Object *arg, TchkType type) { + switch (type) { + case tchkBool: return arg->isBool(); + case tchkInt: return arg->isInt(); + case tchkNum: return arg->isNum(); + case tchkString: return arg->isString(); + case tchkName: return arg->isName(); + case tchkArray: return arg->isArray(); + case tchkProps: return arg->isDict() || arg->isName(); + case tchkSCN: return arg->isNum() || arg->isName(); + case tchkNone: return gFalse; + } + return gFalse; +} + +int Gfx::getPos() { + return parser ? parser->getPos() : -1; +} + +//------------------------------------------------------------------------ +// graphics state operators +//------------------------------------------------------------------------ + +void Gfx::opSave(Object args[], int numArgs) { + saveState(); +} + +void Gfx::opRestore(Object args[], int numArgs) { + restoreState(); +} + +void Gfx::opConcat(Object args[], int numArgs) { + state->concatCTM(args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + out->updateCTM(state, args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + fontChanged = gTrue; +} + +void Gfx::opSetDash(Object args[], int numArgs) { + Array *a; + int length; + Object obj; + double *dash; + int i; + + a = args[0].getArray(); + length = a->getLength(); + if (length == 0) { + dash = NULL; + } else { + dash = (double *)gmallocn(length, sizeof(double)); + for (i = 0; i < length; ++i) { + dash[i] = a->get(i, &obj)->getNum(); + obj.free(); + } + } + state->setLineDash(dash, length, args[1].getNum()); + out->updateLineDash(state); +} + +void Gfx::opSetFlat(Object args[], int numArgs) { + state->setFlatness((int)args[0].getNum()); + out->updateFlatness(state); +} + +void Gfx::opSetLineJoin(Object args[], int numArgs) { + state->setLineJoin(args[0].getInt()); + out->updateLineJoin(state); +} + +void Gfx::opSetLineCap(Object args[], int numArgs) { + state->setLineCap(args[0].getInt()); + out->updateLineCap(state); +} + +void Gfx::opSetMiterLimit(Object args[], int numArgs) { + state->setMiterLimit(args[0].getNum()); + out->updateMiterLimit(state); +} + +void Gfx::opSetLineWidth(Object args[], int numArgs) { + state->setLineWidth(args[0].getNum()); + out->updateLineWidth(state); +} + +void Gfx::opSetExtGState(Object args[], int numArgs) { + Object obj1, obj2, obj3, obj4, obj5; + GfxBlendMode mode; + GBool haveFillOP; + Function *funcs[4]; + GfxColor backdropColor; + GBool haveBackdropColor; + GfxColorSpace *blendingColorSpace; + GBool alpha, isolated, knockout; + int i; + + if (!res->lookupGState(args[0].getName(), &obj1)) { + return; + } + if (!obj1.isDict()) { + error(getPos(), "ExtGState '%s' is wrong type", args[0].getName()); + obj1.free(); + return; + } + if (printCommands) { + printf(" gfx state dict: "); + obj1.print(); + printf("\n"); + } + + // transparency support: blend mode, fill/stroke opacity + if (!obj1.dictLookup("BM", &obj2)->isNull()) { + if (state->parseBlendMode(&obj2, &mode)) { + state->setBlendMode(mode); + out->updateBlendMode(state); + } else { + error(getPos(), "Invalid blend mode in ExtGState"); + } + } + obj2.free(); + if (obj1.dictLookup("ca", &obj2)->isNum()) { + state->setFillOpacity(obj2.getNum()); + out->updateFillOpacity(state); + } + obj2.free(); + if (obj1.dictLookup("CA", &obj2)->isNum()) { + state->setStrokeOpacity(obj2.getNum()); + out->updateStrokeOpacity(state); + } + obj2.free(); + + // fill/stroke overprint + if ((haveFillOP = (obj1.dictLookup("op", &obj2)->isBool()))) { + state->setFillOverprint(obj2.getBool()); + out->updateFillOverprint(state); + } + obj2.free(); + if (obj1.dictLookup("OP", &obj2)->isBool()) { + state->setStrokeOverprint(obj2.getBool()); + out->updateStrokeOverprint(state); + if (!haveFillOP) { + state->setFillOverprint(obj2.getBool()); + out->updateFillOverprint(state); + } + } + obj2.free(); + + // stroke adjust + if (obj1.dictLookup("SA", &obj2)->isBool()) { + state->setStrokeAdjust(obj2.getBool()); + out->updateStrokeAdjust(state); + } + obj2.free(); + + // transfer function + if (obj1.dictLookup("TR2", &obj2)->isNull()) { + obj2.free(); + obj1.dictLookup("TR", &obj2); + } + if (obj2.isName("Default") || + obj2.isName("Identity")) { + funcs[0] = funcs[1] = funcs[2] = funcs[3] = NULL; + state->setTransfer(funcs); + out->updateTransfer(state); + } else if (obj2.isArray() && obj2.arrayGetLength() == 4) { + for (i = 0; i < 4; ++i) { + obj2.arrayGet(i, &obj3); + funcs[i] = Function::parse(&obj3); + obj3.free(); + if (!funcs[i]) { + break; + } + } + if (i == 4) { + state->setTransfer(funcs); + out->updateTransfer(state); + } + } else if (obj2.isName() || obj2.isDict() || obj2.isStream()) { + if ((funcs[0] = Function::parse(&obj2))) { + funcs[1] = funcs[2] = funcs[3] = NULL; + state->setTransfer(funcs); + out->updateTransfer(state); + } + } else if (!obj2.isNull()) { + error(getPos(), "Invalid transfer function in ExtGState"); + } + obj2.free(); + + // soft mask + if (!obj1.dictLookup("SMask", &obj2)->isNull()) { + if (obj2.isName("None")) { + out->clearSoftMask(state); + } else if (obj2.isDict()) { + if (obj2.dictLookup("S", &obj3)->isName("Alpha")) { + alpha = gTrue; + } else { // "Luminosity" + alpha = gFalse; + } + obj3.free(); + funcs[0] = NULL; + if (!obj2.dictLookup("TR", &obj3)->isNull()) { + funcs[0] = Function::parse(&obj3); + if (funcs[0]->getInputSize() != 1 || + funcs[0]->getOutputSize() != 1) { + error(getPos(), + "Invalid transfer function in soft mask in ExtGState"); + delete funcs[0]; + funcs[0] = NULL; + } + } + obj3.free(); + if ((haveBackdropColor = obj2.dictLookup("BC", &obj3)->isArray())) { + for (i = 0; i < gfxColorMaxComps; ++i) { + backdropColor.c[i] = 0; + } + for (i = 0; i < obj3.arrayGetLength() && i < gfxColorMaxComps; ++i) { + obj3.arrayGet(i, &obj4); + if (obj4.isNum()) { + backdropColor.c[i] = dblToCol(obj4.getNum()); + } + obj4.free(); + } + } + obj3.free(); + if (obj2.dictLookup("G", &obj3)->isStream()) { + if (obj3.streamGetDict()->lookup("Group", &obj4)->isDict()) { + blendingColorSpace = NULL; + isolated = knockout = gFalse; + if (!obj4.dictLookup("CS", &obj5)->isNull()) { + blendingColorSpace = GfxColorSpace::parse(&obj5); + } + obj5.free(); + if (obj4.dictLookup("I", &obj5)->isBool()) { + isolated = obj5.getBool(); + } + obj5.free(); + if (obj4.dictLookup("K", &obj5)->isBool()) { + knockout = obj5.getBool(); + } + obj5.free(); + if (!haveBackdropColor) { + if (blendingColorSpace) { + blendingColorSpace->getDefaultColor(&backdropColor); + } else { + //~ need to get the parent or default color space (?) + for (i = 0; i < gfxColorMaxComps; ++i) { + backdropColor.c[i] = 0; + } + } + } + doSoftMask(&obj3, alpha, blendingColorSpace, + isolated, knockout, funcs[0], &backdropColor); + if (funcs[0]) { + delete funcs[0]; + } + } else { + error(getPos(), "Invalid soft mask in ExtGState - missing group"); + } + obj4.free(); + } else { + error(getPos(), "Invalid soft mask in ExtGState - missing group"); + } + obj3.free(); + } else if (!obj2.isNull()) { + error(getPos(), "Invalid soft mask in ExtGState"); + } + } + obj2.free(); + + obj1.free(); +} + +void Gfx::doSoftMask(Object *str, GBool alpha, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + Function *transferFunc, GfxColor *backdropColor) { + Dict *dict, *resDict; + double m[6], bbox[4]; + Object obj1, obj2; + int i; + + // check for excessive recursion + if (formDepth > 20) { + return; + } + + // get stream dict + dict = str->streamGetDict(); + + // check form type + dict->lookup("FormType", &obj1); + if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { + error(getPos(), "Unknown form type"); + } + obj1.free(); + + // get bounding box + dict->lookup("BBox", &obj1); + if (!obj1.isArray()) { + obj1.free(); + error(getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + obj1.arrayGet(i, &obj2); + bbox[i] = obj2.getNum(); + obj2.free(); + } + obj1.free(); + + // get matrix + dict->lookup("Matrix", &obj1); + if (obj1.isArray()) { + for (i = 0; i < 6; ++i) { + obj1.arrayGet(i, &obj2); + m[i] = obj2.getNum(); + obj2.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + obj1.free(); + + // get resources + dict->lookup("Resources", &obj1); + resDict = obj1.isDict() ? obj1.getDict() : (Dict *)NULL; + + // draw it + ++formDepth; + doForm1(str, resDict, m, bbox, gTrue, gTrue, + blendingColorSpace, isolated, knockout, + alpha, transferFunc, backdropColor); + --formDepth; + + if (blendingColorSpace) { + delete blendingColorSpace; + } + obj1.free(); +} + +void Gfx::opSetRenderingIntent(Object args[], int numArgs) { +} + +//------------------------------------------------------------------------ +// color operators +//------------------------------------------------------------------------ + +void Gfx::opSetFillGray(Object args[], int numArgs) { + GfxColor color; + + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceGrayColorSpace()); + out->updateFillColorSpace(state); + color.c[0] = dblToCol(args[0].getNum()); + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeGray(Object args[], int numArgs) { + GfxColor color; + + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); + out->updateStrokeColorSpace(state); + color.c[0] = dblToCol(args[0].getNum()); + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillCMYKColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceCMYKColorSpace()); + out->updateFillColorSpace(state); + for (i = 0; i < 4; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceCMYKColorSpace()); + out->updateStrokeColorSpace(state); + for (i = 0; i < 4; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillRGBColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceRGBColorSpace()); + out->updateFillColorSpace(state); + for (i = 0; i < 3; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) { + GfxColor color; + int i; + + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceRGBColorSpace()); + out->updateStrokeColorSpace(state); + for (i = 0; i < 3; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColorSpace(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace; + GfxColor color; + + state->setFillPattern(NULL); + res->lookupColorSpace(args[0].getName(), &obj); + if (obj.isNull()) { + colorSpace = GfxColorSpace::parse(&args[0]); + } else { + colorSpace = GfxColorSpace::parse(&obj); + } + obj.free(); + if (colorSpace) { + state->setFillColorSpace(colorSpace); + out->updateFillColorSpace(state); + colorSpace->getDefaultColor(&color); + state->setFillColor(&color); + out->updateFillColor(state); + } else { + error(getPos(), "Bad color space (fill)"); + } +} + +void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) { + Object obj; + GfxColorSpace *colorSpace; + GfxColor color; + + state->setStrokePattern(NULL); + res->lookupColorSpace(args[0].getName(), &obj); + if (obj.isNull()) { + colorSpace = GfxColorSpace::parse(&args[0]); + } else { + colorSpace = GfxColorSpace::parse(&obj); + } + obj.free(); + if (colorSpace) { + state->setStrokeColorSpace(colorSpace); + out->updateStrokeColorSpace(state); + colorSpace->getDefaultColor(&color); + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } else { + error(getPos(), "Bad color space (stroke)"); + } +} + +void Gfx::opSetFillColor(Object args[], int numArgs) { + GfxColor color; + int i; + + if (numArgs != state->getFillColorSpace()->getNComps()) { + error(getPos(), "Incorrect number of arguments in 'sc' command"); + return; + } + state->setFillPattern(NULL); + for (i = 0; i < numArgs; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); +} + +void Gfx::opSetStrokeColor(Object args[], int numArgs) { + GfxColor color; + int i; + + if (numArgs != state->getStrokeColorSpace()->getNComps()) { + error(getPos(), "Incorrect number of arguments in 'SC' command"); + return; + } + state->setStrokePattern(NULL); + for (i = 0; i < numArgs; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); +} + +void Gfx::opSetFillColorN(Object args[], int numArgs) { + GfxColor color; + GfxPattern *pattern; + int i; + + if (state->getFillColorSpace()->getMode() == csPattern) { + if (numArgs > 1) { + if (!((GfxPatternColorSpace *)state->getFillColorSpace())->getUnder() || + numArgs - 1 != ((GfxPatternColorSpace *)state->getFillColorSpace()) + ->getUnder()->getNComps()) { + error(getPos(), "Incorrect number of arguments in 'scn' command"); + return; + } + for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } + } + state->setFillColor(&color); + out->updateFillColor(state); + } + if (args[numArgs-1].isName() && + (pattern = res->lookupPattern(args[numArgs-1].getName()))) { + state->setFillPattern(pattern); + } + + } else { + if (numArgs != state->getFillColorSpace()->getNComps()) { + error(getPos(), "Incorrect number of arguments in 'scn' command"); + return; + } + state->setFillPattern(NULL); + for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } + } + state->setFillColor(&color); + out->updateFillColor(state); + } +} + +void Gfx::opSetStrokeColorN(Object args[], int numArgs) { + GfxColor color; + GfxPattern *pattern; + int i; + + if (state->getStrokeColorSpace()->getMode() == csPattern) { + if (numArgs > 1) { + if (!((GfxPatternColorSpace *)state->getStrokeColorSpace()) + ->getUnder() || + numArgs - 1 != ((GfxPatternColorSpace *)state->getStrokeColorSpace()) + ->getUnder()->getNComps()) { + error(getPos(), "Incorrect number of arguments in 'SCN' command"); + return; + } + for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } + if (args[numArgs-1].isName() && + (pattern = res->lookupPattern(args[numArgs-1].getName()))) { + state->setStrokePattern(pattern); + } + + } else { + if (numArgs != state->getStrokeColorSpace()->getNComps()) { + error(getPos(), "Incorrect number of arguments in 'SCN' command"); + return; + } + state->setStrokePattern(NULL); + for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) { + if (args[i].isNum()) { + color.c[i] = dblToCol(args[i].getNum()); + } + } + state->setStrokeColor(&color); + out->updateStrokeColor(state); + } +} + +//------------------------------------------------------------------------ +// path segment operators +//------------------------------------------------------------------------ + +void Gfx::opMoveTo(Object args[], int numArgs) { + state->moveTo(args[0].getNum(), args[1].getNum()); +} + +void Gfx::opLineTo(Object args[], int numArgs) { + if (!state->isCurPt()) { + error(getPos(), "No current point in lineto"); + return; + } + state->lineTo(args[0].getNum(), args[1].getNum()); +} + +void Gfx::opCurveTo(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(getPos(), "No current point in curveto"); + return; + } + x1 = args[0].getNum(); + y1 = args[1].getNum(); + x2 = args[2].getNum(); + y2 = args[3].getNum(); + x3 = args[4].getNum(); + y3 = args[5].getNum(); + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opCurveTo1(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(getPos(), "No current point in curveto1"); + return; + } + x1 = state->getCurX(); + y1 = state->getCurY(); + x2 = args[0].getNum(); + y2 = args[1].getNum(); + x3 = args[2].getNum(); + y3 = args[3].getNum(); + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opCurveTo2(Object args[], int numArgs) { + double x1, y1, x2, y2, x3, y3; + + if (!state->isCurPt()) { + error(getPos(), "No current point in curveto2"); + return; + } + x1 = args[0].getNum(); + y1 = args[1].getNum(); + x2 = args[2].getNum(); + y2 = args[3].getNum(); + x3 = x2; + y3 = y2; + state->curveTo(x1, y1, x2, y2, x3, y3); +} + +void Gfx::opRectangle(Object args[], int numArgs) { + double x, y, w, h; + + x = args[0].getNum(); + y = args[1].getNum(); + w = args[2].getNum(); + h = args[3].getNum(); + state->moveTo(x, y); + state->lineTo(x + w, y); + state->lineTo(x + w, y + h); + state->lineTo(x, y + h); + state->closePath(); +} + +void Gfx::opClosePath(Object args[], int numArgs) { + if (!state->isCurPt()) { + error(getPos(), "No current point in closepath"); + return; + } + state->closePath(); +} + +//------------------------------------------------------------------------ +// path painting operators +//------------------------------------------------------------------------ + +void Gfx::opEndPath(Object args[], int numArgs) { + doEndPath(); +} + +void Gfx::opStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in stroke"); + return; + } + if (state->isPath()) { + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + doEndPath(); +} + +void Gfx::opCloseStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in closepath/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + doEndPath(); +} + +void Gfx::opFill(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in fill"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + } + doEndPath(); +} + +void Gfx::opEOFill(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in eofill"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + } + doEndPath(); +} + +void Gfx::opFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in fill/stroke"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + doEndPath(); +} + +void Gfx::opCloseFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in closepath/fill/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gFalse); + } else { + out->fill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + doEndPath(); +} + +void Gfx::opEOFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in eofill/stroke"); + return; + } + if (state->isPath()) { + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + doEndPath(); +} + +void Gfx::opCloseEOFillStroke(Object args[], int numArgs) { + if (!state->isCurPt()) { + //error(getPos(), "No path in closepath/eofill/stroke"); + return; + } + if (state->isPath()) { + state->closePath(); + if (state->getFillColorSpace()->getMode() == csPattern) { + doPatternFill(gTrue); + } else { + out->eoFill(state); + } + if (state->getStrokeColorSpace()->getMode() == csPattern) { + doPatternStroke(); + } else { + out->stroke(state); + } + } + doEndPath(); +} + +void Gfx::doPatternFill(GBool eoFill) { + GfxPattern *pattern; + + // this is a bit of a kludge -- patterns can be really slow, so we + // skip them if we're only doing text extraction, since they almost + // certainly don't contain any text + if (!out->needNonText()) { + return; + } + + if (!(pattern = state->getFillPattern())) { + return; + } + switch (pattern->getType()) { + case 1: + doTilingPatternFill((GfxTilingPattern *)pattern, gFalse, eoFill); + break; + case 2: + doShadingPatternFill((GfxShadingPattern *)pattern, gFalse, eoFill); + break; + default: + error(getPos(), "Unimplemented pattern type (%d) in fill", + pattern->getType()); + break; + } +} + +void Gfx::doPatternStroke() { + GfxPattern *pattern; + + // this is a bit of a kludge -- patterns can be really slow, so we + // skip them if we're only doing text extraction, since they almost + // certainly don't contain any text + if (!out->needNonText()) { + return; + } + + if (!(pattern = state->getStrokePattern())) { + return; + } + switch (pattern->getType()) { + case 1: + doTilingPatternFill((GfxTilingPattern *)pattern, gTrue, gFalse); + break; + case 2: + doShadingPatternFill((GfxShadingPattern *)pattern, gTrue, gFalse); + break; + default: + error(getPos(), "Unimplemented pattern type (%d) in stroke", + pattern->getType()); + break; + } +} + +void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, + GBool stroke, GBool eoFill) { + GfxPatternColorSpace *patCS; + GfxColorSpace *cs; + GfxPath *savedPath; + double xMin, yMin, xMax, yMax, x, y, x1, y1; + double cxMin, cyMin, cxMax, cyMax; + int xi0, yi0, xi1, yi1, xi, yi; + double *ctm, *btm, *ptm; + double m[6], ictm[6], m1[6], imb[6]; + double det; + double xstep, ystep; + int i; + + // get color space + patCS = (GfxPatternColorSpace *)(stroke ? state->getStrokeColorSpace() + : state->getFillColorSpace()); + + // construct a (pattern space) -> (current space) transform matrix + ctm = state->getCTM(); + btm = baseMatrix; + ptm = tPat->getMatrix(); + // iCTM = invert CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + // m1 = PTM * BTM = PTM * base transform matrix + m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; + m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; + m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; + m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; + m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; + m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; + // m = m1 * iCTM = (PTM * BTM) * (iCTM) + m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; + m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; + m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; + m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; + m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; + m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; + + // construct a (device space) -> (pattern space) transform matrix + det = 1 / (m1[0] * m1[3] - m1[1] * m1[2]); + imb[0] = m1[3] * det; + imb[1] = -m1[1] * det; + imb[2] = -m1[2] * det; + imb[3] = m1[0] * det; + imb[4] = (m1[2] * m1[5] - m1[3] * m1[4]) * det; + imb[5] = (m1[1] * m1[4] - m1[0] * m1[5]) * det; + + // save current graphics state + savedPath = state->getPath()->copy(); + saveState(); + + // set underlying color space (for uncolored tiling patterns); set + // various other parameters (stroke color, line width) to match + // Adobe's behavior + if (tPat->getPaintType() == 2 && (cs = patCS->getUnder())) { + state->setFillColorSpace(cs->copy()); + out->updateFillColorSpace(state); + state->setStrokeColorSpace(cs->copy()); + out->updateStrokeColorSpace(state); + state->setStrokeColor(state->getFillColor()); + } else { + state->setFillColorSpace(new GfxDeviceGrayColorSpace()); + out->updateFillColorSpace(state); + state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); + out->updateStrokeColorSpace(state); + } + state->setFillPattern(NULL); + out->updateFillColor(state); + state->setStrokePattern(NULL); + out->updateStrokeColor(state); + if (!stroke) { + state->setLineWidth(0); + out->updateLineWidth(state); + } + + // clip to current path + if (stroke) { + state->clipToStrokePath(); + out->clipToStrokePath(state); + } else { + state->clip(); + if (eoFill) { + out->eoClip(state); + } else { + out->clip(state); + } + } + state->clearPath(); + + // get the clip region, check for empty + state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax); + if (cxMin > cxMax || cyMin > cyMax) { + goto err; + } + + // transform clip region bbox to pattern space + xMin = xMax = cxMin * imb[0] + cyMin * imb[2] + imb[4]; + yMin = yMax = cxMin * imb[1] + cyMin * imb[3] + imb[5]; + x1 = cxMin * imb[0] + cyMax * imb[2] + imb[4]; + y1 = cxMin * imb[1] + cyMax * imb[3] + imb[5]; + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + x1 = cxMax * imb[0] + cyMin * imb[2] + imb[4]; + y1 = cxMax * imb[1] + cyMin * imb[3] + imb[5]; + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + x1 = cxMax * imb[0] + cyMax * imb[2] + imb[4]; + y1 = cxMax * imb[1] + cyMax * imb[3] + imb[5]; + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + + // draw the pattern + //~ this should treat negative steps differently -- start at right/top + //~ edge instead of left/bottom (?) + xstep = fabs(tPat->getXStep()); + ystep = fabs(tPat->getYStep()); + xi0 = (int)ceil((xMin - tPat->getBBox()[2]) / xstep); + xi1 = (int)floor((xMax - tPat->getBBox()[0]) / xstep) + 1; + yi0 = (int)ceil((yMin - tPat->getBBox()[3]) / ystep); + yi1 = (int)floor((yMax - tPat->getBBox()[1]) / ystep) + 1; + for (i = 0; i < 4; ++i) { + m1[i] = m[i]; + } + if (out->useTilingPatternFill()) { + m1[4] = m[4]; + m1[5] = m[5]; + out->tilingPatternFill(state, tPat->getContentStream(), + tPat->getPaintType(), tPat->getResDict(), + m1, tPat->getBBox(), + xi0, yi0, xi1, yi1, xstep, ystep); + } else { + for (yi = yi0; yi < yi1; ++yi) { + for (xi = xi0; xi < xi1; ++xi) { + x = xi * xstep; + y = yi * ystep; + m1[4] = x * m[0] + y * m[2] + m[4]; + m1[5] = x * m[1] + y * m[3] + m[5]; + doForm1(tPat->getContentStream(), tPat->getResDict(), + m1, tPat->getBBox()); + } + } + } + + // restore graphics state + err: + restoreState(); + state->setPath(savedPath); +} + +void Gfx::doShadingPatternFill(GfxShadingPattern *sPat, + GBool stroke, GBool eoFill) { + GfxShading *shading; + GfxPath *savedPath; + double *ctm, *btm, *ptm; + double m[6], ictm[6], m1[6]; + double xMin, yMin, xMax, yMax; + double det; + + shading = sPat->getShading(); + + // save current graphics state + savedPath = state->getPath()->copy(); + saveState(); + + // clip to bbox + if (shading->getHasBBox()) { + shading->getBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + state->clip(); + out->clip(state); + state->setPath(savedPath->copy()); + } + + // clip to current path + if (stroke) { + state->clipToStrokePath(); + out->clipToStrokePath(state); + } else { + state->clip(); + if (eoFill) { + out->eoClip(state); + } else { + out->clip(state); + } + } + + // set the color space + state->setFillColorSpace(shading->getColorSpace()->copy()); + out->updateFillColorSpace(state); + + // background color fill + if (shading->getHasBackground()) { + state->setFillColor(shading->getBackground()); + out->updateFillColor(state); + out->fill(state); + } + state->clearPath(); + + // construct a (pattern space) -> (current space) transform matrix + ctm = state->getCTM(); + btm = baseMatrix; + ptm = sPat->getMatrix(); + // iCTM = invert CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + // m1 = PTM * BTM = PTM * base transform matrix + m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; + m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; + m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; + m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; + m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; + m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; + // m = m1 * iCTM = (PTM * BTM) * (iCTM) + m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; + m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; + m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; + m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; + m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; + m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; + + // set the new matrix + state->concatCTM(m[0], m[1], m[2], m[3], m[4], m[5]); + out->updateCTM(state, m[0], m[1], m[2], m[3], m[4], m[5]); + +#if 1 //~tmp: turn off anti-aliasing temporarily + GBool vaa = out->getVectorAntialias(); + if (vaa) { + out->setVectorAntialias(gFalse); + } +#endif + + // do shading type-specific operations + switch (shading->getType()) { + case 1: + doFunctionShFill((GfxFunctionShading *)shading); + break; + case 2: + doAxialShFill((GfxAxialShading *)shading); + break; + case 3: + doRadialShFill((GfxRadialShading *)shading); + break; + case 4: + case 5: + doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading); + break; + case 6: + case 7: + doPatchMeshShFill((GfxPatchMeshShading *)shading); + break; + } + +#if 1 //~tmp: turn off anti-aliasing temporarily + if (vaa) { + out->setVectorAntialias(gTrue); + } +#endif + + // restore graphics state + restoreState(); + state->setPath(savedPath); +} + +void Gfx::opShFill(Object args[], int numArgs) { + GfxShading *shading; + GfxPath *savedPath; + double xMin, yMin, xMax, yMax; + + if (!(shading = res->lookupShading(args[0].getName()))) { + return; + } + + // save current graphics state + savedPath = state->getPath()->copy(); + saveState(); + + // clip to bbox + if (shading->getHasBBox()) { + shading->getBBox(&xMin, &yMin, &xMax, &yMax); + state->moveTo(xMin, yMin); + state->lineTo(xMax, yMin); + state->lineTo(xMax, yMax); + state->lineTo(xMin, yMax); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + } + + // set the color space + state->setFillColorSpace(shading->getColorSpace()->copy()); + out->updateFillColorSpace(state); + +#if 1 //~tmp: turn off anti-aliasing temporarily + GBool vaa = out->getVectorAntialias(); + if (vaa) { + out->setVectorAntialias(gFalse); + } +#endif + + // do shading type-specific operations + switch (shading->getType()) { + case 1: + doFunctionShFill((GfxFunctionShading *)shading); + break; + case 2: + doAxialShFill((GfxAxialShading *)shading); + break; + case 3: + doRadialShFill((GfxRadialShading *)shading); + break; + case 4: + case 5: + doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading); + break; + case 6: + case 7: + doPatchMeshShFill((GfxPatchMeshShading *)shading); + break; + } + +#if 1 //~tmp: turn off anti-aliasing temporarily + if (vaa) { + out->setVectorAntialias(gTrue); + } +#endif + + // restore graphics state + restoreState(); + state->setPath(savedPath); + + delete shading; +} + +void Gfx::doFunctionShFill(GfxFunctionShading *shading) { + double x0, y0, x1, y1; + GfxColor colors[4]; + + if (out->useShadedFills() && + out->functionShadedFill(state, shading)) { + return; + } + + shading->getDomain(&x0, &y0, &x1, &y1); + shading->getColor(x0, y0, &colors[0]); + shading->getColor(x0, y1, &colors[1]); + shading->getColor(x1, y0, &colors[2]); + shading->getColor(x1, y1, &colors[3]); + doFunctionShFill1(shading, x0, y0, x1, y1, colors, 0); +} + +void Gfx::doFunctionShFill1(GfxFunctionShading *shading, + double x0, double y0, + double x1, double y1, + GfxColor *colors, int depth) { + GfxColor fillColor; + GfxColor color0M, color1M, colorM0, colorM1, colorMM; + GfxColor colors2[4]; + double *matrix; + double xM, yM; + int nComps, i, j; + + nComps = shading->getColorSpace()->getNComps(); + matrix = shading->getMatrix(); + + // compare the four corner colors + for (i = 0; i < 4; ++i) { + for (j = 0; j < nComps; ++j) { + if (abs(colors[i].c[j] - colors[(i+1)&3].c[j]) > functionColorDelta) { + break; + } + } + if (j < nComps) { + break; + } + } + + // center of the rectangle + xM = 0.5 * (x0 + x1); + yM = 0.5 * (y0 + y1); + + // the four corner colors are close (or we hit the recursive limit) + // -- fill the rectangle; but require at least one subdivision + // (depth==0) to avoid problems when the four outer corners of the + // shaded region are the same color + if ((i == 4 && depth > 0) || depth == functionMaxDepth) { + + // use the center color + shading->getColor(xM, yM, &fillColor); + state->setFillColor(&fillColor); + out->updateFillColor(state); + + // fill the rectangle + state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4], + x0 * matrix[1] + y0 * matrix[3] + matrix[5]); + state->lineTo(x1 * matrix[0] + y0 * matrix[2] + matrix[4], + x1 * matrix[1] + y0 * matrix[3] + matrix[5]); + state->lineTo(x1 * matrix[0] + y1 * matrix[2] + matrix[4], + x1 * matrix[1] + y1 * matrix[3] + matrix[5]); + state->lineTo(x0 * matrix[0] + y1 * matrix[2] + matrix[4], + x0 * matrix[1] + y1 * matrix[3] + matrix[5]); + state->closePath(); + out->fill(state); + state->clearPath(); + + // the four corner colors are not close enough -- subdivide the + // rectangle + } else { + + // colors[0] colorM0 colors[2] + // (x0,y0) (xM,y0) (x1,y0) + // +----------+----------+ + // | | | + // | UL | UR | + // color0M | colorMM | color1M + // (x0,yM) +----------+----------+ (x1,yM) + // | (xM,yM) | + // | LL | LR | + // | | | + // +----------+----------+ + // colors[1] colorM1 colors[3] + // (x0,y1) (xM,y1) (x1,y1) + + shading->getColor(x0, yM, &color0M); + shading->getColor(x1, yM, &color1M); + shading->getColor(xM, y0, &colorM0); + shading->getColor(xM, y1, &colorM1); + shading->getColor(xM, yM, &colorMM); + + // upper-left sub-rectangle + colors2[0] = colors[0]; + colors2[1] = color0M; + colors2[2] = colorM0; + colors2[3] = colorMM; + doFunctionShFill1(shading, x0, y0, xM, yM, colors2, depth + 1); + + // lower-left sub-rectangle + colors2[0] = color0M; + colors2[1] = colors[1]; + colors2[2] = colorMM; + colors2[3] = colorM1; + doFunctionShFill1(shading, x0, yM, xM, y1, colors2, depth + 1); + + // upper-right sub-rectangle + colors2[0] = colorM0; + colors2[1] = colorMM; + colors2[2] = colors[2]; + colors2[3] = color1M; + doFunctionShFill1(shading, xM, y0, x1, yM, colors2, depth + 1); + + // lower-right sub-rectangle + colors2[0] = colorMM; + colors2[1] = colorM1; + colors2[2] = color1M; + colors2[3] = colors[3]; + doFunctionShFill1(shading, xM, yM, x1, y1, colors2, depth + 1); + } +} + +void Gfx::doAxialShFill(GfxAxialShading *shading) { + double xMin, yMin, xMax, yMax; + double x0, y0, x1, y1; + double dx, dy, mul; + GBool dxZero, dyZero; + double tMin, tMax, t, tx, ty; + double s[4], sMin, sMax, tmp; + double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1; + double t0, t1, tt; + double ta[axialMaxSplits + 1]; + int next[axialMaxSplits + 1]; + GfxColor color0, color1; + int nComps; + int i, j, k, kk; + + if (out->useShadedFills() && + out->axialShadedFill(state, shading)) { + return; + } + + // get the clip region bbox + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + + // compute min and max t values, based on the four corners of the + // clip region bbox + shading->getCoords(&x0, &y0, &x1, &y1); + dx = x1 - x0; + dy = y1 - y0; + dxZero = fabs(dx) < 0.01; + dyZero = fabs(dy) < 0.01; + if (dxZero && dyZero) { + tMin = tMax = 0; + } else { + mul = 1 / (dx * dx + dy * dy); + tMin = tMax = ((xMin - x0) * dx + (yMin - y0) * dy) * mul; + t = ((xMin - x0) * dx + (yMax - y0) * dy) * mul; + if (t < tMin) { + tMin = t; + } else if (t > tMax) { + tMax = t; + } + t = ((xMax - x0) * dx + (yMin - y0) * dy) * mul; + if (t < tMin) { + tMin = t; + } else if (t > tMax) { + tMax = t; + } + t = ((xMax - x0) * dx + (yMax - y0) * dy) * mul; + if (t < tMin) { + tMin = t; + } else if (t > tMax) { + tMax = t; + } + if (tMin < 0 && !shading->getExtend0()) { + tMin = 0; + } + if (tMax > 1 && !shading->getExtend1()) { + tMax = 1; + } + } + + // get the function domain + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + + // Traverse the t axis and do the shading. + // + // For each point (tx, ty) on the t axis, consider a line through + // that point perpendicular to the t axis: + // + // x(s) = tx + s * -dy --> s = (x - tx) / -dy + // y(s) = ty + s * dx --> s = (y - ty) / dx + // + // Then look at the intersection of this line with the bounding box + // (xMin, yMin, xMax, yMax). In the general case, there are four + // intersection points: + // + // s0 = (xMin - tx) / -dy + // s1 = (xMax - tx) / -dy + // s2 = (yMin - ty) / dx + // s3 = (yMax - ty) / dx + // + // and we want the middle two s values. + // + // In the case where dx = 0, take s0 and s1; in the case where dy = + // 0, take s2 and s3. + // + // Each filled polygon is bounded by two of these line segments + // perpdendicular to the t axis. + // + // The t axis is bisected into smaller regions until the color + // difference across a region is small enough, and then the region + // is painted with a single color. + + // set up: require at least one split to avoid problems when the two + // ends of the t axis have the same color + nComps = shading->getColorSpace()->getNComps(); + ta[0] = tMin; + next[0] = axialMaxSplits / 2; + ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax); + next[axialMaxSplits / 2] = axialMaxSplits; + ta[axialMaxSplits] = tMax; + + // compute the color at t = tMin + if (tMin < 0) { + tt = t0; + } else if (tMin > 1) { + tt = t1; + } else { + tt = t0 + (t1 - t0) * tMin; + } + shading->getColor(tt, &color0); + + // compute the coordinates of the point on the t axis at t = tMin; + // then compute the intersection of the perpendicular line with the + // bounding box + tx = x0 + tMin * dx; + ty = y0 + tMin * dy; + if (dxZero && dyZero) { + sMin = sMax = 0; + } else if (dxZero) { + sMin = (xMin - tx) / -dy; + sMax = (xMax - tx) / -dy; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else if (dyZero) { + sMin = (yMin - ty) / dx; + sMax = (yMax - ty) / dx; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else { + s[0] = (yMin - ty) / dx; + s[1] = (yMax - ty) / dx; + s[2] = (xMin - tx) / -dy; + s[3] = (xMax - tx) / -dy; + for (j = 0; j < 3; ++j) { + kk = j; + for (k = j + 1; k < 4; ++k) { + if (s[k] < s[kk]) { + kk = k; + } + } + tmp = s[j]; s[j] = s[kk]; s[kk] = tmp; + } + sMin = s[1]; + sMax = s[2]; + } + ux0 = tx - sMin * dy; + uy0 = ty + sMin * dx; + vx0 = tx - sMax * dy; + vy0 = ty + sMax * dx; + + i = 0; + while (i < axialMaxSplits) { + + // bisect until color difference is small enough or we hit the + // bisection limit + j = next[i]; + while (j > i + 1) { + if (ta[j] < 0) { + tt = t0; + } else if (ta[j] > 1) { + tt = t1; + } else { + tt = t0 + (t1 - t0) * ta[j]; + } + shading->getColor(tt, &color1); + for (k = 0; k < nComps; ++k) { + if (abs(color1.c[k] - color0.c[k]) > axialColorDelta) { + break; + } + } + if (k == nComps) { + break; + } + k = (i + j) / 2; + ta[k] = 0.5 * (ta[i] + ta[j]); + next[i] = k; + next[k] = j; + j = k; + } + + // use the average of the colors of the two sides of the region + for (k = 0; k < nComps; ++k) { + color0.c[k] = (color0.c[k] + color1.c[k]) / 2; + } + + // compute the coordinates of the point on the t axis; then + // compute the intersection of the perpendicular line with the + // bounding box + tx = x0 + ta[j] * dx; + ty = y0 + ta[j] * dy; + if (dxZero && dyZero) { + sMin = sMax = 0; + } else if (dxZero) { + sMin = (xMin - tx) / -dy; + sMax = (xMax - tx) / -dy; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else if (dyZero) { + sMin = (yMin - ty) / dx; + sMax = (yMax - ty) / dx; + if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } + } else { + s[0] = (yMin - ty) / dx; + s[1] = (yMax - ty) / dx; + s[2] = (xMin - tx) / -dy; + s[3] = (xMax - tx) / -dy; + for (j = 0; j < 3; ++j) { + kk = j; + for (k = j + 1; k < 4; ++k) { + if (s[k] < s[kk]) { + kk = k; + } + } + tmp = s[j]; s[j] = s[kk]; s[kk] = tmp; + } + sMin = s[1]; + sMax = s[2]; + } + ux1 = tx - sMin * dy; + uy1 = ty + sMin * dx; + vx1 = tx - sMax * dy; + vy1 = ty + sMax * dx; + + // set the color + state->setFillColor(&color0); + out->updateFillColor(state); + + // fill the region + state->moveTo(ux0, uy0); + state->lineTo(vx0, vy0); + state->lineTo(vx1, vy1); + state->lineTo(ux1, uy1); + state->closePath(); + out->fill(state); + state->clearPath(); + + // set up for next region + ux0 = ux1; + uy0 = uy1; + vx0 = vx1; + vy0 = vy1; + color0 = color1; + i = next[i]; + } +} + +void Gfx::doRadialShFill(GfxRadialShading *shading) { + double xMin, yMin, xMax, yMax; + double x0, y0, r0, x1, y1, r1, t0, t1; + int nComps; + GfxColor colorA, colorB; + double xa, ya, xb, yb, ra, rb; + double ta, tb, sa, sb; + double sz, xz, yz, sMin, sMax; + GBool enclosed; + int ia, ib, k, n; + double *ctm; + double theta, alpha, angle, t; + + if (out->useShadedFills() && + out->radialShadedFill(state, shading)) { + return; + } + + // get the shading info + shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1); + t0 = shading->getDomain0(); + t1 = shading->getDomain1(); + nComps = shading->getColorSpace()->getNComps(); + + // Compute the point at which r(s) = 0; check for the enclosed + // circles case; and compute the angles for the tangent lines. + if (x0 == x1 && y0 == y1) { + enclosed = gTrue; + theta = 0; // make gcc happy + sz = 0; // make gcc happy + } else if (r0 == r1) { + enclosed = gFalse; + theta = 0; + sz = 0; // make gcc happy + } else { + sz = -r0 / (r1 - r0); + xz = x0 + sz * (x1 - x0); + yz = y0 + sz * (y1 - y0); + enclosed = (xz - x0) * (xz - x0) + (yz - y0) * (yz - y0) <= r0 * r0; + theta = asin(r0 / sqrt((x0 - xz) * (x0 - xz) + (y0 - yz) * (y0 - yz))); + if (r0 > r1) { + theta = -theta; + } + } + if (enclosed) { + alpha = 0; + } else { + alpha = atan2(y1 - y0, x1 - x0); + } + + // compute the (possibly extended) s range + state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); + if (enclosed) { + sMin = 0; + sMax = 1; + } else { + sMin = 1; + sMax = 0; + // solve for x(s) + r(s) = xMin + if ((x1 + r1) - (x0 + r0) != 0) { + sa = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // solve for x(s) - r(s) = xMax + if ((x1 - r1) - (x0 - r0) != 0) { + sa = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // solve for y(s) + r(s) = yMin + if ((y1 + r1) - (y0 + r0) != 0) { + sa = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // solve for y(s) - r(s) = yMax + if ((y1 - r1) - (y0 - r0) != 0) { + sa = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0)); + if (sa < sMin) { + sMin = sa; + } else if (sa > sMax) { + sMax = sa; + } + } + // check against sz + if (r0 < r1) { + if (sMin < sz) { + sMin = sz; + } + } else if (r0 > r1) { + if (sMax > sz) { + sMax = sz; + } + } + // check the 'extend' flags + if (!shading->getExtend0() && sMin < 0) { + sMin = 0; + } + if (!shading->getExtend1() && sMax > 1) { + sMax = 1; + } + } + + // compute the number of steps into which circles must be divided to + // achieve a curve flatness of 0.1 pixel in device space for the + // largest circle (note that "device space" is 72 dpi when generating + // PostScript, hence the relatively small 0.1 pixel accuracy) + ctm = state->getCTM(); + t = fabs(ctm[0]); + if (fabs(ctm[1]) > t) { + t = fabs(ctm[1]); + } + if (fabs(ctm[2]) > t) { + t = fabs(ctm[2]); + } + if (fabs(ctm[3]) > t) { + t = fabs(ctm[3]); + } + if (r0 > r1) { + t *= r0; + } else { + t *= r1; + } + if (t < 1) { + n = 3; + } else { + n = (int)(M_PI / acos(1 - 0.1 / t)); + if (n < 3) { + n = 3; + } else if (n > 200) { + n = 200; + } + } + + // setup for the start circle + ia = 0; + sa = sMin; + ta = t0 + sa * (t1 - t0); + xa = x0 + sa * (x1 - x0); + ya = y0 + sa * (y1 - y0); + ra = r0 + sa * (r1 - r0); + if (ta < t0) { + shading->getColor(t0, &colorA); + } else if (ta > t1) { + shading->getColor(t1, &colorA); + } else { + shading->getColor(ta, &colorA); + } + + // fill the circles + while (ia < radialMaxSplits) { + + // go as far along the t axis (toward t1) as we can, such that the + // color difference is within the tolerance (radialColorDelta) -- + // this uses bisection (between the current value, t, and t1), + // limited to radialMaxSplits points along the t axis; require at + // least one split to avoid problems when the innermost and + // outermost colors are the same + ib = radialMaxSplits; + sb = sMax; + tb = t0 + sb * (t1 - t0); + if (tb < t0) { + shading->getColor(t0, &colorB); + } else if (tb > t1) { + shading->getColor(t1, &colorB); + } else { + shading->getColor(tb, &colorB); + } + while (ib - ia > 1) { + for (k = 0; k < nComps; ++k) { + if (abs(colorB.c[k] - colorA.c[k]) > radialColorDelta) { + break; + } + } + if (k == nComps && ib < radialMaxSplits) { + break; + } + ib = (ia + ib) / 2; + sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin); + tb = t0 + sb * (t1 - t0); + if (tb < t0) { + shading->getColor(t0, &colorB); + } else if (tb > t1) { + shading->getColor(t1, &colorB); + } else { + shading->getColor(tb, &colorB); + } + } + + // compute center and radius of the circle + xb = x0 + sb * (x1 - x0); + yb = y0 + sb * (y1 - y0); + rb = r0 + sb * (r1 - r0); + + // use the average of the colors at the two circles + for (k = 0; k < nComps; ++k) { + colorA.c[k] = (colorA.c[k] + colorB.c[k]) / 2; + } + state->setFillColor(&colorA); + out->updateFillColor(state); + + if (enclosed) { + + // construct path for first circle (counterclockwise) + state->moveTo(xa + ra, ya); + for (k = 1; k < n; ++k) { + angle = ((double)k / (double)n) * 2 * M_PI; + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + + // construct and append path for second circle (clockwise) + state->moveTo(xb + rb, yb); + for (k = 1; k < n; ++k) { + angle = -((double)k / (double)n) * 2 * M_PI; + state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); + } + state->closePath(); + + } else { + + // construct the first subpath (clockwise) + state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI), + ya + ra * sin(alpha + theta + 0.5 * M_PI)); + for (k = 0; k < n; ++k) { + angle = alpha + theta + 0.5 * M_PI + - ((double)k / (double)n) * (2 * theta + M_PI); + state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); + } + for (k = 0; k < n; ++k) { + angle = alpha - theta - 0.5 * M_PI + + ((double)k / (double)n) * (2 * theta - M_PI); + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + + // construct the second subpath (counterclockwise) + state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI), + ya + ra * sin(alpha + theta + 0.5 * M_PI)); + for (k = 0; k < n; ++k) { + angle = alpha + theta + 0.5 * M_PI + + ((double)k / (double)n) * (-2 * theta + M_PI); + state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); + } + for (k = 0; k < n; ++k) { + angle = alpha - theta - 0.5 * M_PI + + ((double)k / (double)n) * (2 * theta + M_PI); + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + } + + // fill the path + out->fill(state); + state->clearPath(); + + // step to the next value of t + ia = ib; + sa = sb; + ta = tb; + xa = xb; + ya = yb; + ra = rb; + colorA = colorB; + } + + if (enclosed) { + // extend the smaller circle + if ((shading->getExtend0() && r0 <= r1) || + (shading->getExtend1() && r1 < r0)) { + if (r0 <= r1) { + ta = t0; + ra = r0; + xa = x0; + ya = y0; + } else { + ta = t1; + ra = r1; + xa = x1; + ya = y1; + } + shading->getColor(ta, &colorA); + state->setFillColor(&colorA); + out->updateFillColor(state); + state->moveTo(xa + ra, ya); + for (k = 1; k < n; ++k) { + angle = ((double)k / (double)n) * 2 * M_PI; + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + out->fill(state); + state->clearPath(); + } + + // extend the larger circle + if ((shading->getExtend0() && r0 > r1) || + (shading->getExtend1() && r1 >= r0)) { + if (r0 > r1) { + ta = t0; + ra = r0; + xa = x0; + ya = y0; + } else { + ta = t1; + ra = r1; + xa = x1; + ya = y1; + } + shading->getColor(ta, &colorA); + state->setFillColor(&colorA); + out->updateFillColor(state); + state->moveTo(xMin, yMin); + state->lineTo(xMin, yMax); + state->lineTo(xMax, yMax); + state->lineTo(xMax, yMin); + state->closePath(); + state->moveTo(xa + ra, ya); + for (k = 1; k < n; ++k) { + angle = ((double)k / (double)n) * 2 * M_PI; + state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); + } + state->closePath(); + out->fill(state); + state->clearPath(); + } + } +} + +void Gfx::doGouraudTriangleShFill(GfxGouraudTriangleShading *shading) { + double x0, y0, x1, y1, x2, y2; + GfxColor color0, color1, color2; + int i; + + for (i = 0; i < shading->getNTriangles(); ++i) { + shading->getTriangle(i, &x0, &y0, &color0, + &x1, &y1, &color1, + &x2, &y2, &color2); + gouraudFillTriangle(x0, y0, &color0, x1, y1, &color1, x2, y2, &color2, + shading->getColorSpace()->getNComps(), 0); + } +} + +void Gfx::gouraudFillTriangle(double x0, double y0, GfxColor *color0, + double x1, double y1, GfxColor *color1, + double x2, double y2, GfxColor *color2, + int nComps, int depth) { + double x01, y01, x12, y12, x20, y20; + GfxColor color01, color12, color20; + int i; + + for (i = 0; i < nComps; ++i) { + if (abs(color0->c[i] - color1->c[i]) > gouraudColorDelta || + abs(color1->c[i] - color2->c[i]) > gouraudColorDelta) { + break; + } + } + if (i == nComps || depth == gouraudMaxDepth) { + state->setFillColor(color0); + out->updateFillColor(state); + state->moveTo(x0, y0); + state->lineTo(x1, y1); + state->lineTo(x2, y2); + state->closePath(); + out->fill(state); + state->clearPath(); + } else { + x01 = 0.5 * (x0 + x1); + y01 = 0.5 * (y0 + y1); + x12 = 0.5 * (x1 + x2); + y12 = 0.5 * (y1 + y2); + x20 = 0.5 * (x2 + x0); + y20 = 0.5 * (y2 + y0); + //~ if the shading has a Function, this should interpolate on the + //~ function parameter, not on the color components + for (i = 0; i < nComps; ++i) { + color01.c[i] = (color0->c[i] + color1->c[i]) / 2; + color12.c[i] = (color1->c[i] + color2->c[i]) / 2; + color20.c[i] = (color2->c[i] + color0->c[i]) / 2; + } + gouraudFillTriangle(x0, y0, color0, x01, y01, &color01, + x20, y20, &color20, nComps, depth + 1); + gouraudFillTriangle(x01, y01, &color01, x1, y1, color1, + x12, y12, &color12, nComps, depth + 1); + gouraudFillTriangle(x01, y01, &color01, x12, y12, &color12, + x20, y20, &color20, nComps, depth + 1); + gouraudFillTriangle(x20, y20, &color20, x12, y12, &color12, + x2, y2, color2, nComps, depth + 1); + } +} + +void Gfx::doPatchMeshShFill(GfxPatchMeshShading *shading) { + int start, i; + + if (shading->getNPatches() > 128) { + start = 3; + } else if (shading->getNPatches() > 64) { + start = 2; + } else if (shading->getNPatches() > 16) { + start = 1; + } else { + start = 0; + } + for (i = 0; i < shading->getNPatches(); ++i) { + fillPatch(shading->getPatch(i), shading->getColorSpace()->getNComps(), + start); + } +} + +void Gfx::fillPatch(GfxPatch *patch, int nComps, int depth) { + GfxPatch patch00, patch01, patch10, patch11; + double xx[4][8], yy[4][8]; + double xxm, yym; + int i; + + for (i = 0; i < nComps; ++i) { + if (abs(patch->color[0][0].c[i] - patch->color[0][1].c[i]) + > patchColorDelta || + abs(patch->color[0][1].c[i] - patch->color[1][1].c[i]) + > patchColorDelta || + abs(patch->color[1][1].c[i] - patch->color[1][0].c[i]) + > patchColorDelta || + abs(patch->color[1][0].c[i] - patch->color[0][0].c[i]) + > patchColorDelta) { + break; + } + } + if (i == nComps || depth == patchMaxDepth) { + state->setFillColor(&patch->color[0][0]); + out->updateFillColor(state); + state->moveTo(patch->x[0][0], patch->y[0][0]); + state->curveTo(patch->x[0][1], patch->y[0][1], + patch->x[0][2], patch->y[0][2], + patch->x[0][3], patch->y[0][3]); + state->curveTo(patch->x[1][3], patch->y[1][3], + patch->x[2][3], patch->y[2][3], + patch->x[3][3], patch->y[3][3]); + state->curveTo(patch->x[3][2], patch->y[3][2], + patch->x[3][1], patch->y[3][1], + patch->x[3][0], patch->y[3][0]); + state->curveTo(patch->x[2][0], patch->y[2][0], + patch->x[1][0], patch->y[1][0], + patch->x[0][0], patch->y[0][0]); + state->closePath(); + out->fill(state); + state->clearPath(); + } else { + for (i = 0; i < 4; ++i) { + xx[i][0] = patch->x[i][0]; + yy[i][0] = patch->y[i][0]; + xx[i][1] = 0.5 * (patch->x[i][0] + patch->x[i][1]); + yy[i][1] = 0.5 * (patch->y[i][0] + patch->y[i][1]); + xxm = 0.5 * (patch->x[i][1] + patch->x[i][2]); + yym = 0.5 * (patch->y[i][1] + patch->y[i][2]); + xx[i][6] = 0.5 * (patch->x[i][2] + patch->x[i][3]); + yy[i][6] = 0.5 * (patch->y[i][2] + patch->y[i][3]); + xx[i][2] = 0.5 * (xx[i][1] + xxm); + yy[i][2] = 0.5 * (yy[i][1] + yym); + xx[i][5] = 0.5 * (xxm + xx[i][6]); + yy[i][5] = 0.5 * (yym + yy[i][6]); + xx[i][3] = xx[i][4] = 0.5 * (xx[i][2] + xx[i][5]); + yy[i][3] = yy[i][4] = 0.5 * (yy[i][2] + yy[i][5]); + xx[i][7] = patch->x[i][3]; + yy[i][7] = patch->y[i][3]; + } + for (i = 0; i < 4; ++i) { + patch00.x[0][i] = xx[0][i]; + patch00.y[0][i] = yy[0][i]; + patch00.x[1][i] = 0.5 * (xx[0][i] + xx[1][i]); + patch00.y[1][i] = 0.5 * (yy[0][i] + yy[1][i]); + xxm = 0.5 * (xx[1][i] + xx[2][i]); + yym = 0.5 * (yy[1][i] + yy[2][i]); + patch10.x[2][i] = 0.5 * (xx[2][i] + xx[3][i]); + patch10.y[2][i] = 0.5 * (yy[2][i] + yy[3][i]); + patch00.x[2][i] = 0.5 * (patch00.x[1][i] + xxm); + patch00.y[2][i] = 0.5 * (patch00.y[1][i] + yym); + patch10.x[1][i] = 0.5 * (xxm + patch10.x[2][i]); + patch10.y[1][i] = 0.5 * (yym + patch10.y[2][i]); + patch00.x[3][i] = 0.5 * (patch00.x[2][i] + patch10.x[1][i]); + patch00.y[3][i] = 0.5 * (patch00.y[2][i] + patch10.y[1][i]); + patch10.x[0][i] = patch00.x[3][i]; + patch10.y[0][i] = patch00.y[3][i]; + patch10.x[3][i] = xx[3][i]; + patch10.y[3][i] = yy[3][i]; + } + for (i = 4; i < 8; ++i) { + patch01.x[0][i-4] = xx[0][i]; + patch01.y[0][i-4] = yy[0][i]; + patch01.x[1][i-4] = 0.5 * (xx[0][i] + xx[1][i]); + patch01.y[1][i-4] = 0.5 * (yy[0][i] + yy[1][i]); + xxm = 0.5 * (xx[1][i] + xx[2][i]); + yym = 0.5 * (yy[1][i] + yy[2][i]); + patch11.x[2][i-4] = 0.5 * (xx[2][i] + xx[3][i]); + patch11.y[2][i-4] = 0.5 * (yy[2][i] + yy[3][i]); + patch01.x[2][i-4] = 0.5 * (patch01.x[1][i-4] + xxm); + patch01.y[2][i-4] = 0.5 * (patch01.y[1][i-4] + yym); + patch11.x[1][i-4] = 0.5 * (xxm + patch11.x[2][i-4]); + patch11.y[1][i-4] = 0.5 * (yym + patch11.y[2][i-4]); + patch01.x[3][i-4] = 0.5 * (patch01.x[2][i-4] + patch11.x[1][i-4]); + patch01.y[3][i-4] = 0.5 * (patch01.y[2][i-4] + patch11.y[1][i-4]); + patch11.x[0][i-4] = patch01.x[3][i-4]; + patch11.y[0][i-4] = patch01.y[3][i-4]; + patch11.x[3][i-4] = xx[3][i]; + patch11.y[3][i-4] = yy[3][i]; + } + //~ if the shading has a Function, this should interpolate on the + //~ function parameter, not on the color components + for (i = 0; i < nComps; ++i) { + patch00.color[0][0].c[i] = patch->color[0][0].c[i]; + patch00.color[0][1].c[i] = (patch->color[0][0].c[i] + + patch->color[0][1].c[i]) / 2; + patch01.color[0][0].c[i] = patch00.color[0][1].c[i]; + patch01.color[0][1].c[i] = patch->color[0][1].c[i]; + patch01.color[1][1].c[i] = (patch->color[0][1].c[i] + + patch->color[1][1].c[i]) / 2; + patch11.color[0][1].c[i] = patch01.color[1][1].c[i]; + patch11.color[1][1].c[i] = patch->color[1][1].c[i]; + patch11.color[1][0].c[i] = (patch->color[1][1].c[i] + + patch->color[1][0].c[i]) / 2; + patch10.color[1][1].c[i] = patch11.color[1][0].c[i]; + patch10.color[1][0].c[i] = patch->color[1][0].c[i]; + patch10.color[0][0].c[i] = (patch->color[1][0].c[i] + + patch->color[0][0].c[i]) / 2; + patch00.color[1][0].c[i] = patch10.color[0][0].c[i]; + patch00.color[1][1].c[i] = (patch00.color[1][0].c[i] + + patch01.color[1][1].c[i]) / 2; + patch01.color[1][0].c[i] = patch00.color[1][1].c[i]; + patch11.color[0][0].c[i] = patch00.color[1][1].c[i]; + patch10.color[0][1].c[i] = patch00.color[1][1].c[i]; + } + fillPatch(&patch00, nComps, depth + 1); + fillPatch(&patch10, nComps, depth + 1); + fillPatch(&patch01, nComps, depth + 1); + fillPatch(&patch11, nComps, depth + 1); + } +} + +void Gfx::doEndPath() { + if (state->isCurPt() && clip != clipNone) { + state->clip(); + if (clip == clipNormal) { + out->clip(state); + } else { + out->eoClip(state); + } + } + clip = clipNone; + state->clearPath(); +} + +//------------------------------------------------------------------------ +// path clipping operators +//------------------------------------------------------------------------ + +void Gfx::opClip(Object args[], int numArgs) { + clip = clipNormal; +} + +void Gfx::opEOClip(Object args[], int numArgs) { + clip = clipEO; +} + +//------------------------------------------------------------------------ +// text object operators +//------------------------------------------------------------------------ + +void Gfx::opBeginText(Object args[], int numArgs) { + state->setTextMat(1, 0, 0, 1, 0, 0); + state->textMoveTo(0, 0); + out->updateTextMat(state); + out->updateTextPos(state); + fontChanged = gTrue; +} + +void Gfx::opEndText(Object args[], int numArgs) { + out->endTextObject(state); +} + +//------------------------------------------------------------------------ +// text state operators +//------------------------------------------------------------------------ + +void Gfx::opSetCharSpacing(Object args[], int numArgs) { + state->setCharSpace(args[0].getNum()); + out->updateCharSpace(state); +} + +void Gfx::opSetFont(Object args[], int numArgs) { + GfxFont *font; + + if (!(font = res->lookupFont(args[0].getName()))) { + return; + } + if (printCommands) { + printf(" font: tag=%s name='%s' %g\n", + font->getTag()->getCString(), + font->getName() ? font->getName()->getCString() : "???", + args[1].getNum()); + fflush(stdout); + } + state->setFont(font, args[1].getNum()); + fontChanged = gTrue; +} + +void Gfx::opSetTextLeading(Object args[], int numArgs) { + state->setLeading(args[0].getNum()); +} + +void Gfx::opSetTextRender(Object args[], int numArgs) { + state->setRender(args[0].getInt()); + out->updateRender(state); +} + +void Gfx::opSetTextRise(Object args[], int numArgs) { + state->setRise(args[0].getNum()); + out->updateRise(state); +} + +void Gfx::opSetWordSpacing(Object args[], int numArgs) { + state->setWordSpace(args[0].getNum()); + out->updateWordSpace(state); +} + +void Gfx::opSetHorizScaling(Object args[], int numArgs) { + state->setHorizScaling(args[0].getNum()); + out->updateHorizScaling(state); + fontChanged = gTrue; +} + +//------------------------------------------------------------------------ +// text positioning operators +//------------------------------------------------------------------------ + +void Gfx::opTextMove(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX() + args[0].getNum(); + ty = state->getLineY() + args[1].getNum(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +void Gfx::opTextMoveSet(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX() + args[0].getNum(); + ty = args[1].getNum(); + state->setLeading(-ty); + ty += state->getLineY(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +void Gfx::opSetTextMatrix(Object args[], int numArgs) { + state->setTextMat(args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); + state->textMoveTo(0, 0); + out->updateTextMat(state); + out->updateTextPos(state); + fontChanged = gTrue; +} + +void Gfx::opTextNextLine(Object args[], int numArgs) { + double tx, ty; + + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); +} + +//------------------------------------------------------------------------ +// text string operators +//------------------------------------------------------------------------ + +void Gfx::opShowText(Object args[], int numArgs) { + if (!state->getFont()) { + error(getPos(), "No font in show"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + out->beginStringOp(state); + doShowText(args[0].getString()); + out->endStringOp(state); +} + +void Gfx::opMoveShowText(Object args[], int numArgs) { + double tx, ty; + + if (!state->getFont()) { + error(getPos(), "No font in move/show"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateTextPos(state); + out->beginStringOp(state); + doShowText(args[0].getString()); + out->endStringOp(state); +} + +void Gfx::opMoveSetShowText(Object args[], int numArgs) { + double tx, ty; + + if (!state->getFont()) { + error(getPos(), "No font in move/set/show"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + state->setWordSpace(args[0].getNum()); + state->setCharSpace(args[1].getNum()); + tx = state->getLineX(); + ty = state->getLineY() - state->getLeading(); + state->textMoveTo(tx, ty); + out->updateWordSpace(state); + out->updateCharSpace(state); + out->updateTextPos(state); + out->beginStringOp(state); + doShowText(args[2].getString()); + out->endStringOp(state); +} + +void Gfx::opShowSpaceText(Object args[], int numArgs) { + Array *a; + Object obj; + int wMode; + int i; + + if (!state->getFont()) { + error(getPos(), "No font in show/space"); + return; + } + if (fontChanged) { + out->updateFont(state); + fontChanged = gFalse; + } + out->beginStringOp(state); + wMode = state->getFont()->getWMode(); + a = args[0].getArray(); + for (i = 0; i < a->getLength(); ++i) { + a->get(i, &obj); + if (obj.isNum()) { + // this uses the absolute value of the font size to match + // Acrobat's behavior + if (wMode) { + state->textShift(0, -obj.getNum() * 0.001 * + fabs(state->getFontSize())); + } else { + state->textShift(-obj.getNum() * 0.001 * + fabs(state->getFontSize()), 0); + } + out->updateTextShift(state, obj.getNum()); + } else if (obj.isString()) { + doShowText(obj.getString()); + } else { + error(getPos(), "Element of show/space array must be number or string"); + } + obj.free(); + } + out->endStringOp(state); +} + +void Gfx::doShowText(GString *s) { + GfxFont *font; + int wMode; + double riseX, riseY; + CharCode code; + Unicode u[8]; + double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, lineX, lineY; + double originX, originY, tOriginX, tOriginY; + double oldCTM[6], newCTM[6]; + double *mat; + Object charProc; + Dict *resDict; + Parser *oldParser; + char *p; + int len, n, uLen, nChars, nSpaces, i; + + font = state->getFont(); + wMode = font->getWMode(); + + if (out->useDrawChar()) { + out->beginString(state, s); + } + + // handle a Type 3 char + if (font->getType() == fontType3 && out->interpretType3Chars()) { + mat = state->getCTM(); + for (i = 0; i < 6; ++i) { + oldCTM[i] = mat[i]; + } + mat = state->getTextMat(); + newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2]; + newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3]; + newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2]; + newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3]; + mat = font->getFontMatrix(); + newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2]; + newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3]; + newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2]; + newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3]; + newCTM[0] *= state->getFontSize(); + newCTM[1] *= state->getFontSize(); + newCTM[2] *= state->getFontSize(); + newCTM[3] *= state->getFontSize(); + newCTM[0] *= state->getHorizScaling(); + newCTM[2] *= state->getHorizScaling(); + state->textTransformDelta(0, state->getRise(), &riseX, &riseY); + curX = state->getCurX(); + curY = state->getCurY(); + lineX = state->getLineX(); + lineY = state->getLineY(); + oldParser = parser; + p = s->getCString(); + len = s->getLength(); + while (len > 0) { + n = font->getNextChar(p, len, &code, + u, (int)(sizeof(u) / sizeof(Unicode)), &uLen, + &dx, &dy, &originX, &originY); + dx = dx * state->getFontSize() + state->getCharSpace(); + if (n == 1 && (*p == ' ' || *p == 0)) { + double w=state->getWordSpace(); + if (w==0 && dx==0) + w=state->getFontSize()/3; // workaround for zero word space + dx += w; + } + dx *= state->getHorizScaling(); + dy *= state->getFontSize(); + state->textTransformDelta(dx, dy, &tdx, &tdy); + state->transform(curX + riseX, curY + riseY, &x, &y); + saveState(); + state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y); + //~ the CTM concat values here are wrong (but never used) + out->updateCTM(state, 1, 0, 0, 1, 0, 0); + if (!out->beginType3Char(state, curX + riseX, curY + riseY, tdx, tdy, + code, u, uLen)) { + ((Gfx8BitFont *)font)->getCharProc(code, &charProc); + if ((resDict = ((Gfx8BitFont *)font)->getResources())) { + pushResources(resDict); + } + if (charProc.isStream()) { + display(&charProc, gFalse); + } else { + error(getPos(), "Missing or bad Type3 CharProc entry"); + } + out->endType3Char(state); + if (resDict) { + popResources(); + } + charProc.free(); + } + restoreState(); + // GfxState::restore() does *not* restore the current position, + // so we deal with it here using (curX, curY) and (lineX, lineY) + curX += tdx; + curY += tdy; + state->moveTo(curX, curY); + state->textSetPos(lineX, lineY); + p += n; + len -= n; + } + parser = oldParser; + + } else if (out->useDrawChar()) { + state->textTransformDelta(0, state->getRise(), &riseX, &riseY); + p = s->getCString(); + len = s->getLength(); + while (len > 0) { + n = font->getNextChar(p, len, &code, + u, (int)(sizeof(u) / sizeof(Unicode)), &uLen, + &dx, &dy, &originX, &originY); + if (wMode) { + dx *= state->getFontSize(); + dy = dy * state->getFontSize() + state->getCharSpace(); + if (n == 1 && *p == ' ') { + dy += state->getWordSpace(); + } + } else { + dx = dx * state->getFontSize() + state->getCharSpace(); + if (n == 1 && *p == ' ') { + dx += state->getWordSpace(); + } + dx *= state->getHorizScaling(); + dy *= state->getFontSize(); + } + state->textTransformDelta(dx, dy, &tdx, &tdy); + originX *= state->getFontSize(); + originY *= state->getFontSize(); + state->textTransformDelta(originX, originY, &tOriginX, &tOriginY); + out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY, + tdx, tdy, tOriginX, tOriginY, code, n, u, uLen); + state->shift(tdx, tdy); + p += n; + len -= n; + } + + } else { + dx = dy = 0; + p = s->getCString(); + len = s->getLength(); + nChars = nSpaces = 0; + while (len > 0) { + n = font->getNextChar(p, len, &code, + u, (int)(sizeof(u) / sizeof(Unicode)), &uLen, + &dx2, &dy2, &originX, &originY); + dx += dx2; + dy += dy2; + if (n == 1 && *p == ' ') { + ++nSpaces; + } + ++nChars; + p += n; + len -= n; + } + if (wMode) { + dx *= state->getFontSize(); + dy = dy * state->getFontSize() + + nChars * state->getCharSpace() + + nSpaces * state->getWordSpace(); + } else { + dx = dx * state->getFontSize() + + nChars * state->getCharSpace() + + nSpaces * state->getWordSpace(); + dx *= state->getHorizScaling(); + dy *= state->getFontSize(); + } + state->textTransformDelta(dx, dy, &tdx, &tdy); + out->drawString(state, s); + state->shift(tdx, tdy); + } + + if (out->useDrawChar()) { + out->endString(state); + } + + updateLevel += 10 * s->getLength(); +} + +//------------------------------------------------------------------------ +// XObject operators +//------------------------------------------------------------------------ + +void Gfx::opXObject(Object args[], int numArgs) { + char *name; + Object obj1, obj2, obj3, refObj; +#if OPI_SUPPORT + Object opiDict; +#endif + + name = args[0].getName(); + if (!res->lookupXObject(name, &obj1)) { + return; + } + if (!obj1.isStream()) { + error(getPos(), "XObject '%s' is wrong type", name); + obj1.free(); + return; + } +#if OPI_SUPPORT + obj1.streamGetDict()->lookup("OPI", &opiDict); + if (opiDict.isDict()) { + out->opiBegin(state, opiDict.getDict()); + } +#endif + obj1.streamGetDict()->lookup("Subtype", &obj2); + if (obj2.isName("Image")) { + if (out->needNonText()) { + res->lookupXObjectNF(name, &refObj); + doImage(&refObj, obj1.getStream(), gFalse); + refObj.free(); + } + } else if (obj2.isName("Form")) { + res->lookupXObjectNF(name, &refObj); + if (out->useDrawForm() && refObj.isRef()) { + out->drawForm(refObj.getRef()); + } else { + doForm(&obj1); + } + refObj.free(); + } else if (obj2.isName("PS")) { + obj1.streamGetDict()->lookup("Level1", &obj3); + out->psXObject(obj1.getStream(), + obj3.isStream() ? obj3.getStream() : (Stream *)NULL); + } else if (obj2.isName()) { + error(getPos(), "Unknown XObject subtype '%s'", obj2.getName()); + } else { + error(getPos(), "XObject subtype is missing or wrong type"); + } + obj2.free(); +#if OPI_SUPPORT + if (opiDict.isDict()) { + out->opiEnd(state, opiDict.getDict()); + } + opiDict.free(); +#endif + obj1.free(); +} + +void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) { + Dict *dict, *maskDict; + int width, height; + int bits, maskBits; + StreamColorSpaceMode csMode; + GBool mask; + GBool invert; + GfxColorSpace *colorSpace, *maskColorSpace; + GfxImageColorMap *colorMap, *maskColorMap; + Object maskObj, smaskObj; + GBool haveColorKeyMask, haveExplicitMask, haveSoftMask; + int maskColors[2*gfxColorMaxComps]; + int maskWidth, maskHeight; + GBool maskInvert; + Stream *maskStr; + Object obj1, obj2; + int i; + + // get info from the stream + bits = 0; + csMode = streamCSNone; + str->getImageParams(&bits, &csMode); + + // get stream dict + dict = str->getDict(); + + // get size + dict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("W", &obj1); + } + if (!obj1.isInt()) + goto err2; + width = obj1.getInt(); + obj1.free(); + dict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("H", &obj1); + } + if (!obj1.isInt()) + goto err2; + height = obj1.getInt(); + obj1.free(); + + // image or mask? + dict->lookup("ImageMask", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("IM", &obj1); + } + mask = gFalse; + if (obj1.isBool()) + mask = obj1.getBool(); + else if (!obj1.isNull()) + goto err2; + obj1.free(); + + // bit depth + if (bits == 0) { + dict->lookup("BitsPerComponent", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("BPC", &obj1); + } + if (obj1.isInt()) { + bits = obj1.getInt(); + } else if (mask) { + bits = 1; + } else { + goto err2; + } + obj1.free(); + } + + // display a mask + if (mask) { + + // check for inverted mask + if (bits != 1) + goto err1; + invert = gFalse; + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + if (obj1.isArray()) { + obj1.arrayGet(0, &obj2); + if (obj2.isInt() && obj2.getInt() == 1) + invert = gTrue; + obj2.free(); + } else if (!obj1.isNull()) { + goto err2; + } + obj1.free(); + + // draw it + out->drawImageMask(state, ref, str, width, height, invert, inlineImg); + + } else { + + // get color space and color map + dict->lookup("ColorSpace", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("CS", &obj1); + } + if (obj1.isName()) { + res->lookupColorSpace(obj1.getName(), &obj2); + if (!obj2.isNull()) { + obj1.free(); + obj1 = obj2; + } else { + obj2.free(); + } + } + if (!obj1.isNull()) { + colorSpace = GfxColorSpace::parse(&obj1, csMode); + } else if (csMode == streamCSDeviceGray) { + colorSpace = new GfxDeviceGrayColorSpace(); + } else if (csMode == streamCSDeviceRGB) { + colorSpace = new GfxDeviceRGBColorSpace(); + } else if (csMode == streamCSDeviceRGBX) { + colorSpace = new GfxDeviceRGBXColorSpace(); + } else if (csMode == streamCSDeviceCMYK) { + colorSpace = new GfxDeviceCMYKColorSpace(); + } else { + colorSpace = NULL; + } + obj1.free(); + if (!colorSpace) { + goto err1; + } + dict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("D", &obj1); + } + colorMap = new GfxImageColorMap(bits, &obj1, colorSpace); + obj1.free(); + if (!colorMap->isOk()) { + delete colorMap; + goto err1; + } + + // get the mask + haveColorKeyMask = haveExplicitMask = haveSoftMask = gFalse; + maskStr = NULL; // make gcc happy + maskWidth = maskHeight = 0; // make gcc happy + maskInvert = gFalse; // make gcc happy + maskColorMap = NULL; // make gcc happy + dict->lookup("Mask", &maskObj); + dict->lookup("SMask", &smaskObj); + if (smaskObj.isStream()) { + // soft mask + if (inlineImg) { + goto err1; + } + maskStr = smaskObj.getStream(); + maskDict = smaskObj.streamGetDict(); + maskDict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("W", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskWidth = obj1.getInt(); + obj1.free(); + maskDict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("H", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskHeight = obj1.getInt(); + obj1.free(); + maskDict->lookup("BitsPerComponent", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("BPC", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskBits = obj1.getInt(); + obj1.free(); + maskDict->lookup("ColorSpace", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("CS", &obj1); + } + if (obj1.isName()) { + res->lookupColorSpace(obj1.getName(), &obj2); + if (!obj2.isNull()) { + obj1.free(); + obj1 = obj2; + } else { + obj2.free(); + } + } + maskColorSpace = GfxColorSpace::parse(&obj1); + obj1.free(); + if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) { + goto err1; + } + maskDict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("D", &obj1); + } + maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace); + obj1.free(); + if (!maskColorMap->isOk()) { + delete maskColorMap; + goto err1; + } + //~ handle the Matte entry + haveSoftMask = gTrue; + } else if (maskObj.isArray()) { + // color key mask + for (i = 0; + i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps; + ++i) { + maskObj.arrayGet(i, &obj1); + maskColors[i] = obj1.getInt(); + obj1.free(); + } + haveColorKeyMask = gTrue; + } else if (maskObj.isStream()) { + // explicit mask + if (inlineImg) { + goto err1; + } + maskStr = maskObj.getStream(); + maskDict = maskObj.streamGetDict(); + maskDict->lookup("Width", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("W", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskWidth = obj1.getInt(); + obj1.free(); + maskDict->lookup("Height", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("H", &obj1); + } + if (!obj1.isInt()) { + goto err2; + } + maskHeight = obj1.getInt(); + obj1.free(); + maskDict->lookup("ImageMask", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("IM", &obj1); + } + if (!obj1.isBool() || !obj1.getBool()) { + goto err2; + } + obj1.free(); + maskInvert = gFalse; + maskDict->lookup("Decode", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("D", &obj1); + } + if (obj1.isArray()) { + obj1.arrayGet(0, &obj2); + if (obj2.isInt() && obj2.getInt() == 1) { + maskInvert = gTrue; + } + obj2.free(); + } else if (!obj1.isNull()) { + goto err2; + } + obj1.free(); + haveExplicitMask = gTrue; + } + + // draw it + if (haveSoftMask) { + out->drawSoftMaskedImage(state, ref, str, width, height, colorMap, + maskStr, maskWidth, maskHeight, maskColorMap); + delete maskColorMap; + } else if (haveExplicitMask) { + out->drawMaskedImage(state, ref, str, width, height, colorMap, + maskStr, maskWidth, maskHeight, maskInvert); + } else { + out->drawImage(state, ref, str, width, height, colorMap, + haveColorKeyMask ? maskColors : (int *)NULL, inlineImg); + } + delete colorMap; + + maskObj.free(); + smaskObj.free(); + } + + if ((i = width * height) > 1000) { + i = 1000; + } + updateLevel += i; + + return; + + err2: + obj1.free(); + err1: + error(getPos(), "Bad image parameters"); +} + +void Gfx::doForm(Object *str) { + Dict *dict; + GBool transpGroup, isolated, knockout; + GfxColorSpace *blendingColorSpace; + Object matrixObj, bboxObj; + double m[6], bbox[4]; + Object resObj; + Dict *resDict; + Object obj1, obj2, obj3; + int i; + + // check for excessive recursion + if (formDepth > 20) { + return; + } + + // get stream dict + dict = str->streamGetDict(); + + // check form type + dict->lookup("FormType", &obj1); + if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { + error(getPos(), "Unknown form type"); + } + obj1.free(); + + // get bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + bboxObj.free(); + error(getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + bbox[i] = obj1.getNum(); + obj1.free(); + } + bboxObj.free(); + + // get matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray()) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + m[i] = obj1.getNum(); + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // get resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; + + // check for a transparency group + transpGroup = isolated = knockout = gFalse; + blendingColorSpace = NULL; + if (dict->lookup("Group", &obj1)->isDict()) { + if (obj1.dictLookup("S", &obj2)->isName("Transparency")) { + transpGroup = gTrue; + if (!obj1.dictLookup("CS", &obj3)->isNull()) { + blendingColorSpace = GfxColorSpace::parse(&obj3); + } + obj3.free(); + if (obj1.dictLookup("I", &obj3)->isBool()) { + isolated = obj3.getBool(); + } + obj3.free(); + if (obj1.dictLookup("K", &obj3)->isBool()) { + knockout = obj3.getBool(); + } + obj3.free(); + } + obj2.free(); + } + obj1.free(); + + // draw it + ++formDepth; + doForm1(str, resDict, m, bbox, + transpGroup, gFalse, blendingColorSpace, isolated, knockout); + --formDepth; + + if (blendingColorSpace) { + delete blendingColorSpace; + } + resObj.free(); +} + +void Gfx::doForm1(Object *str, Dict *resDict, double *matrix, double *bbox, + GBool transpGroup, GBool softMask, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool alpha, Function *transferFunc, + GfxColor *backdropColor) { + Parser *oldParser; + double oldBaseMatrix[6]; + int i; + + // push new resources on stack + pushResources(resDict); + + // save current graphics state + saveState(); + + // kill any pre-existing path + state->clearPath(); + + // save current parser + oldParser = parser; + + // set form transformation matrix + state->concatCTM(matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + out->updateCTM(state, matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5]); + + // set form bounding box + state->moveTo(bbox[0], bbox[1]); + state->lineTo(bbox[2], bbox[1]); + state->lineTo(bbox[2], bbox[3]); + state->lineTo(bbox[0], bbox[3]); + state->closePath(); + state->clip(); + out->clip(state); + state->clearPath(); + + if (softMask || transpGroup) { + if (state->getBlendMode() != gfxBlendNormal) { + state->setBlendMode(gfxBlendNormal); + out->updateBlendMode(state); + } + if (state->getFillOpacity() != 1) { + state->setFillOpacity(1); + out->updateFillOpacity(state); + } + if (state->getStrokeOpacity() != 1) { + state->setStrokeOpacity(1); + out->updateStrokeOpacity(state); + } + out->clearSoftMask(state); + out->beginTransparencyGroup(state, bbox, blendingColorSpace, + isolated, knockout, softMask); + } + GfxState*old_state = state; + + // set new base matrix + for (i = 0; i < 6; ++i) { + oldBaseMatrix[i] = baseMatrix[i]; + baseMatrix[i] = state->getCTM()[i]; + } + + // draw the form + display(str, gFalse); + + if (softMask || transpGroup) { + // restore graphics state + while(state != old_state) + restoreState(); + out->endTransparencyGroup(state); + } + + // restore base matrix + for (i = 0; i < 6; ++i) { + baseMatrix[i] = oldBaseMatrix[i]; + } + + // restore parser + parser = oldParser; + + // restore graphics state + restoreState(); + + // pop resource stack + popResources(); + + if (softMask) { + out->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); + } else if (transpGroup) { + out->paintTransparencyGroup(state, bbox); + } + + return; +} + +//------------------------------------------------------------------------ +// in-line image operators +//------------------------------------------------------------------------ + +void Gfx::opBeginImage(Object args[], int numArgs) { + Stream *str; + int c1, c2; + + // build dict/stream + str = buildImageStream(); + + // display the image + if (str) { + doImage(NULL, str, gTrue); + + // skip 'EI' tag + c1 = str->getUndecodedStream()->getChar(); + c2 = str->getUndecodedStream()->getChar(); + while (!(c1 == 'E' && c2 == 'I') && c2 != EOF) { + c1 = c2; + c2 = str->getUndecodedStream()->getChar(); + } + delete str; + } +} + +Stream *Gfx::buildImageStream() { + Object dict; + Object obj; + char *key; + Stream *str; + + // build dictionary + dict.initDict(xref); + parser->getObj(&obj); + while (!obj.isCmd("ID") && !obj.isEOF()) { + if (!obj.isName()) { + error(getPos(), "Inline image dictionary key must be a name object"); + obj.free(); + } else { + key = copyString(obj.getName()); + obj.free(); + parser->getObj(&obj); + if (obj.isEOF() || obj.isError()) { + gfree(key); + break; + } + dict.dictAdd(key, &obj); + } + parser->getObj(&obj); + } + if (obj.isEOF()) { + error(getPos(), "End of file in inline image"); + obj.free(); + dict.free(); + return NULL; + } + obj.free(); + + // make stream + if(!parser->getStream()) { + error(getPos(), "Couldn't get stream"); + return NULL; + } + str = new EmbedStream(parser->getStream(), &dict, gFalse, 0); + str = str->addFilters(&dict); + + return str; +} + +void Gfx::opImageData(Object args[], int numArgs) { + error(getPos(), "Internal: got 'ID' operator"); +} + +void Gfx::opEndImage(Object args[], int numArgs) { + error(getPos(), "Internal: got 'EI' operator"); +} + +//------------------------------------------------------------------------ +// type 3 font operators +//------------------------------------------------------------------------ + +void Gfx::opSetCharWidth(Object args[], int numArgs) { + out->type3D0(state, args[0].getNum(), args[1].getNum()); +} + +void Gfx::opSetCacheDevice(Object args[], int numArgs) { + out->type3D1(state, args[0].getNum(), args[1].getNum(), + args[2].getNum(), args[3].getNum(), + args[4].getNum(), args[5].getNum()); +} + +//------------------------------------------------------------------------ +// compatibility operators +//------------------------------------------------------------------------ + +void Gfx::opBeginIgnoreUndef(Object args[], int numArgs) { + ++ignoreUndef; +} + +void Gfx::opEndIgnoreUndef(Object args[], int numArgs) { + if (ignoreUndef > 0) + --ignoreUndef; +} + +//------------------------------------------------------------------------ +// marked content operators +//------------------------------------------------------------------------ + +void Gfx::opBeginMarkedContent(Object args[], int numArgs) { + if (printCommands) { + printf(" marked content: %s ", args[0].getName()); + if (numArgs == 2) + args[2].print(stdout); + printf("\n"); + fflush(stdout); + } +} + +void Gfx::opEndMarkedContent(Object args[], int numArgs) { +} + +void Gfx::opMarkPoint(Object args[], int numArgs) { + if (printCommands) { + printf(" mark point: %s ", args[0].getName()); + if (numArgs == 2) + args[2].print(stdout); + printf("\n"); + fflush(stdout); + } +} + +//------------------------------------------------------------------------ +// misc +//------------------------------------------------------------------------ + +void Gfx::drawAnnot(Object *str, AnnotBorderStyle *borderStyle, + double xMin, double yMin, double xMax, double yMax) { + Dict *dict, *resDict; + Object matrixObj, bboxObj, resObj; + Object obj1; + double m[6], bbox[4], ictm[6]; + double *ctm; + double formX0, formY0, formX1, formY1; + double annotX0, annotY0, annotX1, annotY1; + double det, x, y, sx, sy; + double r, g, b; + GfxColor color; + double *dash, *dash2; + int dashLength; + int i; + + //~ can we assume that we're in default user space? + //~ (i.e., baseMatrix = ctm) + + // transform the annotation bbox from default user space to user + // space: (bbox * baseMatrix) * iCTM + ctm = state->getCTM(); + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + x = baseMatrix[0] * xMin + baseMatrix[2] * yMin + baseMatrix[4]; + y = baseMatrix[1] * xMin + baseMatrix[3] * yMin + baseMatrix[5]; + annotX0 = ictm[0] * x + ictm[2] * y + ictm[4]; + annotY0 = ictm[1] * x + ictm[3] * y + ictm[5]; + x = baseMatrix[0] * xMax + baseMatrix[2] * yMax + baseMatrix[4]; + y = baseMatrix[1] * xMax + baseMatrix[3] * yMax + baseMatrix[5]; + annotX1 = ictm[0] * x + ictm[2] * y + ictm[4]; + annotY1 = ictm[1] * x + ictm[3] * y + ictm[5]; + if (annotX0 > annotX1) { + x = annotX0; annotX0 = annotX1; annotX1 = x; + } + if (annotY0 > annotY1) { + y = annotY0; annotY0 = annotY1; annotY1 = y; + } + + // draw the appearance stream (if there is one) + if (str->isStream()) { + + // get stream dict + dict = str->streamGetDict(); + + // get the form bounding box + dict->lookup("BBox", &bboxObj); + if (!bboxObj.isArray()) { + bboxObj.free(); + error(getPos(), "Bad form bounding box"); + return; + } + for (i = 0; i < 4; ++i) { + bboxObj.arrayGet(i, &obj1); + bbox[i] = obj1.getNum(); + obj1.free(); + } + bboxObj.free(); + + // get the form matrix + dict->lookup("Matrix", &matrixObj); + if (matrixObj.isArray()) { + for (i = 0; i < 6; ++i) { + matrixObj.arrayGet(i, &obj1); + m[i] = obj1.getNum(); + obj1.free(); + } + } else { + m[0] = 1; m[1] = 0; + m[2] = 0; m[3] = 1; + m[4] = 0; m[5] = 0; + } + matrixObj.free(); + + // transform the form bbox from form space to user space + formX0 = bbox[0] * m[0] + bbox[1] * m[2] + m[4]; + formY0 = bbox[0] * m[1] + bbox[1] * m[3] + m[5]; + formX1 = bbox[2] * m[0] + bbox[3] * m[2] + m[4]; + formY1 = bbox[2] * m[1] + bbox[3] * m[3] + m[5]; + if (formX0 > formX1) { + x = formX0; formX0 = formX1; formX1 = x; + } + if (formY0 > formY1) { + y = formY0; formY0 = formY1; formY1 = y; + } + + // scale the form to fit the annotation bbox + if (formX1 == formX0) { + // this shouldn't happen + sx = 1; + } else { + sx = (annotX1 - annotX0) / (formX1 - formX0); + } + if (formY1 == formY0) { + // this shouldn't happen + sy = 1; + } else { + sy = (annotY1 - annotY0) / (formY1 - formY0); + } + m[0] *= sx; + m[2] *= sx; + m[4] = (m[4] - formX0) * sx + annotX0; + m[1] *= sy; + m[3] *= sy; + m[5] = (m[5] - formY0) * sy + annotY0; + + // get resources + dict->lookup("Resources", &resObj); + resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; + + // draw it + doForm1(str, resDict, m, bbox); + + resObj.free(); + } + + // draw the border + if (borderStyle && borderStyle->getWidth() > 0) { + if (state->getStrokeColorSpace()->getMode() != csDeviceRGB) { + state->setStrokePattern(NULL); + state->setStrokeColorSpace(new GfxDeviceRGBColorSpace()); + out->updateStrokeColorSpace(state); + } + borderStyle->getColor(&r, &g, &b); + color.c[0] = dblToCol(r); + color.c[1] = dblToCol(g); + color.c[2] = dblToCol(b); + state->setStrokeColor(&color); + out->updateStrokeColor(state); + // compute the width scale factor when going from default user + // space to user space + x = (baseMatrix[0] + baseMatrix[2]) * ictm[0] + + (baseMatrix[1] + baseMatrix[3]) * ictm[2]; + y = (baseMatrix[0] + baseMatrix[2]) * ictm[1] + + (baseMatrix[1] + baseMatrix[3]) * ictm[3]; + x = sqrt(0.5 * (x * x + y * y)); + state->setLineWidth(x * borderStyle->getWidth()); + out->updateLineWidth(state); + borderStyle->getDash(&dash, &dashLength); + if (borderStyle->getType() == annotBorderDashed && dashLength > 0) { + dash2 = (double *)gmallocn(dashLength, sizeof(double)); + for (i = 0; i < dashLength; ++i) { + dash2[i] = x * dash[i]; + } + state->setLineDash(dash2, dashLength, 0); + out->updateLineDash(state); + } + //~ this doesn't currently handle the beveled and engraved styles + state->clearPath(); + state->moveTo(annotX0, out->upsideDown() ? annotY1 : annotY0); + state->lineTo(annotX1, out->upsideDown() ? annotY1 : annotY0); + if (borderStyle->getType() != annotBorderUnderlined) { + state->lineTo(annotX1, out->upsideDown() ? annotY0 : annotY1); + state->lineTo(annotX0, out->upsideDown() ? annotY0 : annotY1); + state->closePath(); + } + out->stroke(state); + } +} + +void Gfx::saveState() { + out->saveState(state); + state = state->save(); +} + +void Gfx::restoreState() { + state = state->restore(); + out->restoreState(state); +} + +void Gfx::pushResources(Dict *resDict) { + res = new GfxResources(xref, resDict, res); +} + +void Gfx::popResources() { + GfxResources *resPtr; + + resPtr = res->getNext(); + delete res; + res = resPtr; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h new file mode 100644 index 000000000..0e4263cee --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h @@ -0,0 +1,312 @@ +//======================================================================== +// +// Gfx.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GFX_H +#define GFX_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +class GString; +class XRef; +class Array; +class Stream; +class Parser; +class Dict; +class Function; +class OutputDev; +class GfxFontDict; +class GfxFont; +class GfxPattern; +class GfxTilingPattern; +class GfxShadingPattern; +class GfxShading; +class GfxFunctionShading; +class GfxAxialShading; +class GfxRadialShading; +class GfxGouraudTriangleShading; +class GfxPatchMeshShading; +struct GfxPatch; +class GfxState; +struct GfxColor; +class GfxColorSpace; +class Gfx; +class PDFRectangle; +class AnnotBorderStyle; + +//------------------------------------------------------------------------ + +enum GfxClipType { + clipNone, + clipNormal, + clipEO +}; + +enum TchkType { + tchkBool, // boolean + tchkInt, // integer + tchkNum, // number (integer or real) + tchkString, // string + tchkName, // name + tchkArray, // array + tchkProps, // properties (dictionary or name) + tchkSCN, // scn/SCN args (number of name) + tchkNone // used to avoid empty initializer lists +}; + +#define maxArgs 33 + +struct Operator { + char name[4]; + int numArgs; + TchkType tchk[maxArgs]; + void (Gfx::*func)(Object args[], int numArgs); +}; + +//------------------------------------------------------------------------ + +class GfxResources { +public: + + GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA); + ~GfxResources(); + + GfxFont *lookupFont(char *name); + GBool lookupXObject(char *name, Object *obj); + GBool lookupXObjectNF(char *name, Object *obj); + void lookupColorSpace(char *name, Object *obj); + GfxPattern *lookupPattern(char *name); + GfxShading *lookupShading(char *name); + GBool lookupGState(char *name, Object *obj); + + GfxResources *getNext() { return next; } + +private: + + GfxFontDict *fonts; + Object xObjDict; + Object colorSpaceDict; + Object patternDict; + Object shadingDict; + Object gStateDict; + GfxResources *next; +}; + +//------------------------------------------------------------------------ +// Gfx +//------------------------------------------------------------------------ + +class Gfx { +public: + + // Constructor for regular output. + Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, + double hDPI, double vDPI, PDFRectangle *box, + PDFRectangle *cropBox, int rotate, + GBool (*abortCheckCbkA)(void *data) = NULL, + void *abortCheckCbkDataA = NULL); + + // Constructor for a sub-page object. + Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, + PDFRectangle *box, PDFRectangle *cropBox, + GBool (*abortCheckCbkA)(void *data) = NULL, + void *abortCheckCbkDataA = NULL); + + ~Gfx(); + + // Interpret a stream or array of streams. + void display(Object *obj, GBool topLevel = gTrue); + + // Display an annotation, given its appearance (a Form XObject), + // border style, and bounding box (in default user space). + void drawAnnot(Object *str, AnnotBorderStyle *borderStyle, + double xMin, double yMin, double xMax, double yMax); + + // Save graphics state. + void saveState(); + + // Restore graphics state. + void restoreState(); + + // Get the current graphics state object. + GfxState *getState() { return state; } + +private: + + XRef *xref; // the xref table for this PDF file + OutputDev *out; // output device + GBool subPage; // is this a sub-page object? + GBool printCommands; // print the drawing commands (for debugging) + GfxResources *res; // resource stack + int updateLevel; + + GfxState *state; // current graphics state + GBool fontChanged; // set if font or text matrix has changed + GfxClipType clip; // do a clip? + int ignoreUndef; // current BX/EX nesting level + double baseMatrix[6]; // default matrix for most recent + // page/form/pattern + int formDepth; + + Parser *parser; // parser for page content stream(s) + + GBool // callback to check for an abort + (*abortCheckCbk)(void *data); + void *abortCheckCbkData; + + static Operator opTab[]; // table of operators + + void go(GBool topLevel); + void execOp(Object *cmd, Object args[], int numArgs); + Operator *findOp(char *name); + GBool checkArg(Object *arg, TchkType type); + int getPos(); + + // graphics state operators + void opSave(Object args[], int numArgs); + void opRestore(Object args[], int numArgs); + void opConcat(Object args[], int numArgs); + void opSetDash(Object args[], int numArgs); + void opSetFlat(Object args[], int numArgs); + void opSetLineJoin(Object args[], int numArgs); + void opSetLineCap(Object args[], int numArgs); + void opSetMiterLimit(Object args[], int numArgs); + void opSetLineWidth(Object args[], int numArgs); + void opSetExtGState(Object args[], int numArgs); + void doSoftMask(Object *str, GBool alpha, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + Function *transferFunc, GfxColor *backdropColor); + void opSetRenderingIntent(Object args[], int numArgs); + + // color operators + void opSetFillGray(Object args[], int numArgs); + void opSetStrokeGray(Object args[], int numArgs); + void opSetFillCMYKColor(Object args[], int numArgs); + void opSetStrokeCMYKColor(Object args[], int numArgs); + void opSetFillRGBColor(Object args[], int numArgs); + void opSetStrokeRGBColor(Object args[], int numArgs); + void opSetFillColorSpace(Object args[], int numArgs); + void opSetStrokeColorSpace(Object args[], int numArgs); + void opSetFillColor(Object args[], int numArgs); + void opSetStrokeColor(Object args[], int numArgs); + void opSetFillColorN(Object args[], int numArgs); + void opSetStrokeColorN(Object args[], int numArgs); + + // path segment operators + void opMoveTo(Object args[], int numArgs); + void opLineTo(Object args[], int numArgs); + void opCurveTo(Object args[], int numArgs); + void opCurveTo1(Object args[], int numArgs); + void opCurveTo2(Object args[], int numArgs); + void opRectangle(Object args[], int numArgs); + void opClosePath(Object args[], int numArgs); + + // path painting operators + void opEndPath(Object args[], int numArgs); + void opStroke(Object args[], int numArgs); + void opCloseStroke(Object args[], int numArgs); + void opFill(Object args[], int numArgs); + void opEOFill(Object args[], int numArgs); + void opFillStroke(Object args[], int numArgs); + void opCloseFillStroke(Object args[], int numArgs); + void opEOFillStroke(Object args[], int numArgs); + void opCloseEOFillStroke(Object args[], int numArgs); + void doPatternFill(GBool eoFill); + void doPatternStroke(); + void doTilingPatternFill(GfxTilingPattern *tPat, + GBool stroke, GBool eoFill); + void doShadingPatternFill(GfxShadingPattern *sPat, + GBool stroke, GBool eoFill); + void opShFill(Object args[], int numArgs); + void doFunctionShFill(GfxFunctionShading *shading); + void doFunctionShFill1(GfxFunctionShading *shading, + double x0, double y0, + double x1, double y1, + GfxColor *colors, int depth); + void doAxialShFill(GfxAxialShading *shading); + void doRadialShFill(GfxRadialShading *shading); + void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading); + void gouraudFillTriangle(double x0, double y0, GfxColor *color0, + double x1, double y1, GfxColor *color1, + double x2, double y2, GfxColor *color2, + int nComps, int depth); + void doPatchMeshShFill(GfxPatchMeshShading *shading); + void fillPatch(GfxPatch *patch, int nComps, int depth); + void doEndPath(); + + // path clipping operators + void opClip(Object args[], int numArgs); + void opEOClip(Object args[], int numArgs); + + // text object operators + void opBeginText(Object args[], int numArgs); + void opEndText(Object args[], int numArgs); + + // text state operators + void opSetCharSpacing(Object args[], int numArgs); + void opSetFont(Object args[], int numArgs); + void opSetTextLeading(Object args[], int numArgs); + void opSetTextRender(Object args[], int numArgs); + void opSetTextRise(Object args[], int numArgs); + void opSetWordSpacing(Object args[], int numArgs); + void opSetHorizScaling(Object args[], int numArgs); + + // text positioning operators + void opTextMove(Object args[], int numArgs); + void opTextMoveSet(Object args[], int numArgs); + void opSetTextMatrix(Object args[], int numArgs); + void opTextNextLine(Object args[], int numArgs); + + // text string operators + void opShowText(Object args[], int numArgs); + void opMoveShowText(Object args[], int numArgs); + void opMoveSetShowText(Object args[], int numArgs); + void opShowSpaceText(Object args[], int numArgs); + void doShowText(GString *s); + + // XObject operators + void opXObject(Object args[], int numArgs); + void doImage(Object *ref, Stream *str, GBool inlineImg); + void doForm(Object *str); + void doForm1(Object *str, Dict *resDict, double *matrix, double *bbox, + GBool transpGroup = gFalse, GBool softMask = gFalse, + GfxColorSpace *blendingColorSpace = NULL, + GBool isolated = gFalse, GBool knockout = gFalse, + GBool alpha = gFalse, Function *transferFunc = NULL, + GfxColor *backdropColor = NULL); + + // in-line image operators + void opBeginImage(Object args[], int numArgs); + Stream *buildImageStream(); + void opImageData(Object args[], int numArgs); + void opEndImage(Object args[], int numArgs); + + // type 3 font operators + void opSetCharWidth(Object args[], int numArgs); + void opSetCacheDevice(Object args[], int numArgs); + + // compatibility operators + void opBeginIgnoreUndef(Object args[], int numArgs); + void opEndIgnoreUndef(Object args[], int numArgs); + + // marked content operators + void opBeginMarkedContent(Object args[], int numArgs); + void opEndMarkedContent(Object args[], int numArgs); + void opMarkPoint(Object args[], int numArgs); + + void pushResources(Dict *resDict); + void popResources(); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc new file mode 100644 index 000000000..2692144a2 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc @@ -0,0 +1,1576 @@ +//======================================================================== +// +// GfxFont.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "Error.h" +#include "Object.h" +#include "Dict.h" +#include "GlobalParams.h" +#include "CMap.h" +#include "CharCodeToUnicode.h" +#include "FontEncodingTables.h" +#include "BuiltinFontTables.h" +#include "FoFiType1.h" +#include "FoFiType1C.h" +#include "FoFiTrueType.h" +#include "GfxFont.h" + +//------------------------------------------------------------------------ + +struct StdFontMapEntry { + char *altName; + char *properName; +}; + +// Acrobat 4.0 and earlier substituted Base14-compatible fonts without +// providing Widths and a FontDescriptor, so we munge the names into +// the proper Base14 names. This table is from implementation note 44 +// in the PDF 1.4 spec, with some additions based on empirical +// evidence. +static StdFontMapEntry stdFontMap[] = { + { "Arial", "Helvetica" }, + { "Arial,Bold", "Helvetica-Bold" }, + { "Arial,BoldItalic", "Helvetica-BoldOblique" }, + { "Arial,Italic", "Helvetica-Oblique" }, + { "Arial-Bold", "Helvetica-Bold" }, + { "Arial-BoldItalic", "Helvetica-BoldOblique" }, + { "Arial-BoldItalicMT", "Helvetica-BoldOblique" }, + { "Arial-BoldMT", "Helvetica-Bold" }, + { "Arial-Italic", "Helvetica-Oblique" }, + { "Arial-ItalicMT", "Helvetica-Oblique" }, + { "ArialMT", "Helvetica" }, + { "Courier,Bold", "Courier-Bold" }, + { "Courier,BoldItalic", "Courier-BoldOblique" }, + { "Courier,Italic", "Courier-Oblique" }, + { "CourierNew", "Courier" }, + { "CourierNew,Bold", "Courier-Bold" }, + { "CourierNew,BoldItalic", "Courier-BoldOblique" }, + { "CourierNew,Italic", "Courier-Oblique" }, + { "CourierNew-Bold", "Courier-Bold" }, + { "CourierNew-BoldItalic", "Courier-BoldOblique" }, + { "CourierNew-Italic", "Courier-Oblique" }, + { "CourierNewPS-BoldItalicMT", "Courier-BoldOblique" }, + { "CourierNewPS-BoldMT", "Courier-Bold" }, + { "CourierNewPS-ItalicMT", "Courier-Oblique" }, + { "CourierNewPSMT", "Courier" }, + { "Helvetica,Bold", "Helvetica-Bold" }, + { "Helvetica,BoldItalic", "Helvetica-BoldOblique" }, + { "Helvetica,Italic", "Helvetica-Oblique" }, + { "Helvetica-BoldItalic", "Helvetica-BoldOblique" }, + { "Helvetica-Italic", "Helvetica-Oblique" }, + { "Symbol,Bold", "Symbol" }, + { "Symbol,BoldItalic", "Symbol" }, + { "Symbol,Italic", "Symbol" }, + { "TimesNewRoman", "Times-Roman" }, + { "TimesNewRoman,Bold", "Times-Bold" }, + { "TimesNewRoman,BoldItalic", "Times-BoldItalic" }, + { "TimesNewRoman,Italic", "Times-Italic" }, + { "TimesNewRoman-Bold", "Times-Bold" }, + { "TimesNewRoman-BoldItalic", "Times-BoldItalic" }, + { "TimesNewRoman-Italic", "Times-Italic" }, + { "TimesNewRomanPS", "Times-Roman" }, + { "TimesNewRomanPS-Bold", "Times-Bold" }, + { "TimesNewRomanPS-BoldItalic", "Times-BoldItalic" }, + { "TimesNewRomanPS-BoldItalicMT", "Times-BoldItalic" }, + { "TimesNewRomanPS-BoldMT", "Times-Bold" }, + { "TimesNewRomanPS-Italic", "Times-Italic" }, + { "TimesNewRomanPS-ItalicMT", "Times-Italic" }, + { "TimesNewRomanPSMT", "Times-Roman" }, + { "TimesNewRomanPSMT,Bold", "Times-Bold" }, + { "TimesNewRomanPSMT,BoldItalic", "Times-BoldItalic" }, + { "TimesNewRomanPSMT,Italic", "Times-Italic" } +}; + +//------------------------------------------------------------------------ +// GfxFont +//------------------------------------------------------------------------ + +GfxFont *GfxFont::makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict) { + GString *nameA; + GfxFont *font; + Object obj1; + + // get base font name + nameA = NULL; + fontDict->lookup("BaseFont", &obj1); + if (obj1.isName()) { + nameA = new GString(obj1.getName()); + } + obj1.free(); + + // get font type + font = NULL; + fontDict->lookup("Subtype", &obj1); + if (obj1.isName("Type1") || obj1.isName("MMType1")) { + font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType1, fontDict); + } else if (obj1.isName("Type1C")) { + font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType1C, fontDict); + } else if (obj1.isName("Type3")) { + font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType3, fontDict); + } else if (obj1.isName("TrueType")) { + font = new Gfx8BitFont(xref, tagA, idA, nameA, fontTrueType, fontDict); + } else if (obj1.isName("Type0")) { + font = new GfxCIDFont(xref, tagA, idA, nameA, fontDict); + } else { + error(-1, "Unknown font type: '%s'", + obj1.isName() ? obj1.getName() : "???"); + font = new Gfx8BitFont(xref, tagA, idA, nameA, fontUnknownType, fontDict); + } + obj1.free(); + + return font; +} + +GfxFont::GfxFont(char *tagA, Ref idA, GString *nameA) { + ok = gFalse; + tag = new GString(tagA); + id = idA; + name = nameA; + origName = nameA; + embFontName = NULL; + extFontFile = NULL; +} + +GfxFont::~GfxFont() { + delete tag; + if (origName && origName != name) { + delete origName; + } + if (name) { + delete name; + } + if (embFontName) { + delete embFontName; + } + if (extFontFile) { + delete extFontFile; + } +} + +void GfxFont::readFontDescriptor(XRef *xref, Dict *fontDict) { + Object obj1, obj2, obj3, obj4; + double t; + int i; + + // assume Times-Roman by default (for substitution purposes) + flags = fontSerif; + + embFontID.num = -1; + embFontID.gen = -1; + missingWidth = 0; + + if (fontDict->lookup("FontDescriptor", &obj1)->isDict()) { + + // get flags + if (obj1.dictLookup("Flags", &obj2)->isInt()) { + flags = obj2.getInt(); + } + obj2.free(); + + // get name + obj1.dictLookup("FontName", &obj2); + if (obj2.isName()) { + embFontName = new GString(obj2.getName()); + } + obj2.free(); + + // look for embedded font file + if (obj1.dictLookupNF("FontFile", &obj2)->isRef()) { + embFontID = obj2.getRef(); + if (type != fontType1) { + error(-1, "Mismatch between font type and embedded font file"); + type = isCIDFont() ? fontCIDType0 : fontType1; + } + } + obj2.free(); + if (embFontID.num == -1 && + obj1.dictLookupNF("FontFile2", &obj2)->isRef()) { + embFontID = obj2.getRef(); + if (type != fontTrueType && type != fontCIDType2) { + error(-1, "Mismatch between font type and embedded font file"); + type = type == fontCIDType0 ? fontCIDType2 : fontTrueType; + } + } + obj2.free(); + if (embFontID.num == -1 && + obj1.dictLookupNF("FontFile3", &obj2)->isRef()) { + if (obj2.fetch(xref, &obj3)->isStream()) { + obj3.streamGetDict()->lookup("Subtype", &obj4); + if (obj4.isName("Type1")) { + embFontID = obj2.getRef(); + if (type != fontType1) { + error(-1, "Mismatch between font type and embedded font file"); + type = fontType1; + } + } else if (obj4.isName("Type1C")) { + embFontID = obj2.getRef(); + if (type != fontType1 && type != fontType1C) { + error(-1, "Mismatch between font type and embedded font file"); + } + type = fontType1C; + } else if (obj4.isName("TrueType")) { + embFontID = obj2.getRef(); + if (type != fontTrueType) { + error(-1, "Mismatch between font type and embedded font file"); + type = fontTrueType; + } + } else if (obj4.isName("CIDFontType0C")) { + embFontID = obj2.getRef(); + if (type != fontCIDType0) { + error(-1, "Mismatch between font type and embedded font file"); + } + type = fontCIDType0C; + } else if (obj4.isName("OpenType")) { + embFontID = obj2.getRef(); + if (type == fontTrueType) { + type = fontTrueTypeOT; + } else if (type == fontType1) { + type = fontType1COT; + } else if (type == fontCIDType0) { + type = fontCIDType0COT; + } else if (type == fontCIDType2) { + type = fontCIDType2OT; + } else { + error(-1, "Mismatch between font type and embedded font file"); + } + } else { + error(-1, "Unknown embedded font type '%s'", + obj4.isName() ? obj4.getName() : "???"); + } + obj4.free(); + } + obj3.free(); + } + obj2.free(); + + // look for MissingWidth + obj1.dictLookup("MissingWidth", &obj2); + if (obj2.isNum()) { + missingWidth = obj2.getNum(); + } + obj2.free(); + + // get Ascent and Descent + obj1.dictLookup("Ascent", &obj2); + if (obj2.isNum()) { + t = 0.001 * obj2.getNum(); + // some broken font descriptors set ascent and descent to 0 + if (t != 0) { + ascent = t; + } + } + obj2.free(); + obj1.dictLookup("Descent", &obj2); + if (obj2.isNum()) { + t = 0.001 * obj2.getNum(); + // some broken font descriptors set ascent and descent to 0 + if (t != 0) { + descent = t; + } + // some broken font descriptors specify a positive descent + if (descent > 0) { + descent = -descent; + } + } + obj2.free(); + + // font FontBBox + if (obj1.dictLookup("FontBBox", &obj2)->isArray()) { + for (i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) { + if (obj2.arrayGet(i, &obj3)->isNum()) { + fontBBox[i] = 0.001 * obj3.getNum(); + } + obj3.free(); + } + } + obj2.free(); + + } + obj1.free(); +} + +CharCodeToUnicode *GfxFont::readToUnicodeCMap(Dict *fontDict, int nBits, + CharCodeToUnicode *ctu) { + GString *buf; + Object obj1; + int c; + + if (!fontDict->lookup("ToUnicode", &obj1)->isStream()) { + obj1.free(); + return NULL; + } + buf = new GString(); + obj1.streamReset(); + while ((c = obj1.streamGetChar()) != EOF) { + buf->append(c); + } + obj1.streamClose(); + obj1.free(); + if (ctu) { + ctu->mergeCMap(buf, nBits); + } else { + ctu = CharCodeToUnicode::parseCMap(buf, nBits); + } + delete buf; + return ctu; +} + +void GfxFont::findExtFontFile() { + static char *type1Exts[] = { ".pfa", ".pfb", ".ps", "", NULL }; + static char *ttExts[] = { ".ttf", NULL }; + + if (name) { + if (type == fontType1) { + extFontFile = globalParams->findFontFile(name, type1Exts); + } else if (type == fontTrueType) { + extFontFile = globalParams->findFontFile(name, ttExts); + } + } +} + +char *GfxFont::readExtFontFile(int *len) { + FILE *f; + char *buf; + + if (!(f = fopen(extFontFile->getCString(), "rb"))) { + error(-1, "External font file '%s' vanished", extFontFile->getCString()); + return NULL; + } + fseek(f, 0, SEEK_END); + *len = (int)ftell(f); + fseek(f, 0, SEEK_SET); + buf = (char *)gmalloc(*len); + if ((int)fread(buf, 1, *len, f) != *len) { + error(-1, "Error reading external font file '%s'", + extFontFile->getCString()); + } + fclose(f); + return buf; +} + +char *GfxFont::readEmbFontFile(XRef *xref, int *len) { + char *buf; + Object obj1, obj2; + Stream *str; + int c; + int size, i; + + obj1.initRef(embFontID.num, embFontID.gen); + obj1.fetch(xref, &obj2); + if (!obj2.isStream()) { + error(-1, "Embedded font file is not a stream"); + obj2.free(); + obj1.free(); + embFontID.num = -1; + return NULL; + } + str = obj2.getStream(); + + buf = NULL; + i = size = 0; + str->reset(); + while ((c = str->getChar()) != EOF) { + if (i == size) { + size += 4096; + buf = (char *)grealloc(buf, size); + } + buf[i++] = c; + } + *len = i; + str->close(); + + obj2.free(); + obj1.free(); + + return buf; +} + +//------------------------------------------------------------------------ +// Gfx8BitFont +//------------------------------------------------------------------------ + +Gfx8BitFont::Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA, + GfxFontType typeA, Dict *fontDict): + GfxFont(tagA, idA, nameA) +{ + GString *name2; + BuiltinFont *builtinFont; + char **baseEnc; + GBool baseEncFromFontFile; + char *buf; + int len; + FoFiType1 *ffT1; + FoFiType1C *ffT1C; + int code, code2; + char *charName; + GBool missing, hex; + Unicode toUnicode[256]; + CharCodeToUnicode *utu, *ctu2; + Unicode uBuf[8]; + double mul; + int firstChar, lastChar; + Gushort w; + Object obj1, obj2, obj3; + int n, i, a, b, m; + + type = typeA; + ctu = NULL; + + // do font name substitution for various aliases of the Base 14 font + // names + if (name) { + name2 = name->copy(); + i = 0; + while (i < name2->getLength()) { + if (name2->getChar(i) == ' ') { + name2->del(i); + } else { + ++i; + } + } + a = 0; + b = sizeof(stdFontMap) / sizeof(StdFontMapEntry); + // invariant: stdFontMap[a].altName <= name2 < stdFontMap[b].altName + while (b - a > 1) { + m = (a + b) / 2; + if (name2->cmp(stdFontMap[m].altName) >= 0) { + a = m; + } else { + b = m; + } + } + if (!name2->cmp(stdFontMap[a].altName)) { + name = new GString(stdFontMap[a].properName); + } + delete name2; + } + + // is it a built-in font? + builtinFont = NULL; + if (name) { + for (i = 0; i < nBuiltinFonts; ++i) { + if (!name->cmp(builtinFonts[i].name)) { + builtinFont = &builtinFonts[i]; + break; + } + } + } + + // default ascent/descent values + if (builtinFont) { + ascent = 0.001 * builtinFont->ascent; + descent = 0.001 * builtinFont->descent; + fontBBox[0] = 0.001 * builtinFont->bbox[0]; + fontBBox[1] = 0.001 * builtinFont->bbox[1]; + fontBBox[2] = 0.001 * builtinFont->bbox[2]; + fontBBox[3] = 0.001 * builtinFont->bbox[3]; + } else { + ascent = 0.95; + descent = -0.35; + fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; + } + + // get info from font descriptor + readFontDescriptor(xref, fontDict); + + // for non-embedded fonts, don't trust the ascent/descent/bbox + // values from the font descriptor + if (builtinFont && embFontID.num < 0) { + ascent = 0.001 * builtinFont->ascent; + descent = 0.001 * builtinFont->descent; + fontBBox[0] = 0.001 * builtinFont->bbox[0]; + fontBBox[1] = 0.001 * builtinFont->bbox[1]; + fontBBox[2] = 0.001 * builtinFont->bbox[2]; + fontBBox[3] = 0.001 * builtinFont->bbox[3]; + } + + // look for an external font file + findExtFontFile(); + + // get font matrix + fontMat[0] = fontMat[3] = 1; + fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0; + if (fontDict->lookup("FontMatrix", &obj1)->isArray()) { + for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + fontMat[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + + // get Type 3 bounding box, font definition, and resources + if (type == fontType3) { + if (fontDict->lookup("FontBBox", &obj1)->isArray()) { + for (i = 0; i < 4 && i < obj1.arrayGetLength(); ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + fontBBox[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + if (!fontDict->lookup("CharProcs", &charProcs)->isDict()) { + error(-1, "Missing or invalid CharProcs dictionary in Type 3 font"); + charProcs.free(); + } + if (!fontDict->lookup("Resources", &resources)->isDict()) { + resources.free(); + } + } + + //----- build the font encoding ----- + + // Encodings start with a base encoding, which can come from + // (in order of priority): + // 1. FontDict.Encoding or FontDict.Encoding.BaseEncoding + // - MacRoman / MacExpert / WinAnsi / Standard + // 2. embedded or external font file + // 3. default: + // - builtin --> builtin encoding + // - TrueType --> WinAnsiEncoding + // - others --> StandardEncoding + // and then add a list of differences (if any) from + // FontDict.Encoding.Differences. + + // check FontDict for base encoding + hasEncoding = gFalse; + usesMacRomanEnc = gFalse; + baseEnc = NULL; + baseEncFromFontFile = gFalse; + fontDict->lookup("Encoding", &obj1); + if (obj1.isDict()) { + obj1.dictLookup("BaseEncoding", &obj2); + if (obj2.isName("MacRomanEncoding")) { + hasEncoding = gTrue; + usesMacRomanEnc = gTrue; + baseEnc = macRomanEncoding; + } else if (obj2.isName("MacExpertEncoding")) { + hasEncoding = gTrue; + baseEnc = macExpertEncoding; + } else if (obj2.isName("WinAnsiEncoding")) { + hasEncoding = gTrue; + baseEnc = winAnsiEncoding; + } + obj2.free(); + } else if (obj1.isName("MacRomanEncoding")) { + hasEncoding = gTrue; + usesMacRomanEnc = gTrue; + baseEnc = macRomanEncoding; + } else if (obj1.isName("MacExpertEncoding")) { + hasEncoding = gTrue; + baseEnc = macExpertEncoding; + } else if (obj1.isName("WinAnsiEncoding")) { + hasEncoding = gTrue; + baseEnc = winAnsiEncoding; + } + + // check embedded or external font file for base encoding + // (only for Type 1 fonts - trying to get an encoding out of a + // TrueType font is a losing proposition) + ffT1 = NULL; + ffT1C = NULL; + buf = NULL; + if (type == fontType1 && (extFontFile || embFontID.num >= 0)) { + if (extFontFile) { + ffT1 = FoFiType1::load(extFontFile->getCString()); + } else { + buf = readEmbFontFile(xref, &len); + ffT1 = FoFiType1::make(buf, len); + } + if (ffT1) { + if (ffT1->getName()) { + if (embFontName) { + delete embFontName; + } + embFontName = new GString(ffT1->getName()); + } + if (!baseEnc) { + baseEnc = ffT1->getEncoding(); + baseEncFromFontFile = gTrue; + } + } + } else if (type == fontType1C && (extFontFile || embFontID.num >= 0)) { + if (extFontFile) { + ffT1C = FoFiType1C::load(extFontFile->getCString()); + } else { + buf = readEmbFontFile(xref, &len); + ffT1C = FoFiType1C::make(buf, len); + } + if (ffT1C) { + if (ffT1C->getName()) { + if (embFontName) { + delete embFontName; + } + embFontName = new GString(ffT1C->getName()); + } + if (!baseEnc) { + baseEnc = ffT1C->getEncoding(); + baseEncFromFontFile = gTrue; + } + } + } + if (buf) { + gfree(buf); + } + + // get default base encoding + if (!baseEnc) { + if (builtinFont && embFontID.num < 0) { + baseEnc = builtinFont->defaultBaseEnc; + hasEncoding = gTrue; + } else if (type == fontTrueType) { + baseEnc = winAnsiEncoding; + } else { + baseEnc = standardEncoding; + } + } + + // copy the base encoding + for (i = 0; i < 256; ++i) { + enc[i] = baseEnc[i]; + if ((encFree[i] = baseEncFromFontFile) && enc[i]) { + enc[i] = copyString(baseEnc[i]); + } + } + + // some Type 1C font files have empty encodings, which can break the + // T1C->T1 conversion (since the 'seac' operator depends on having + // the accents in the encoding), so we fill in any gaps from + // StandardEncoding + if (type == fontType1C && (extFontFile || embFontID.num >= 0) && + baseEncFromFontFile) { + for (i = 0; i < 256; ++i) { + if (!enc[i] && standardEncoding[i]) { + enc[i] = standardEncoding[i]; + encFree[i] = gFalse; + } + } + } + + // merge differences into encoding + if (obj1.isDict()) { + obj1.dictLookup("Differences", &obj2); + if (obj2.isArray()) { + hasEncoding = gTrue; + code = 0; + for (i = 0; i < obj2.arrayGetLength(); ++i) { + obj2.arrayGet(i, &obj3); + if (obj3.isInt()) { + code = obj3.getInt(); + } else if (obj3.isName()) { + if (code >= 0 && code < 256) { + if (encFree[code]) { + gfree(enc[code]); + } + enc[code] = copyString(obj3.getName()); + encFree[code] = gTrue; + } + ++code; + } else { + error(-1, "Wrong type in font encoding resource differences (%s)", + obj3.getTypeName()); + } + obj3.free(); + } + } + obj2.free(); + } + obj1.free(); + if (ffT1) { + delete ffT1; + } + if (ffT1C) { + delete ffT1C; + } + + //----- build the mapping to Unicode ----- + + // pass 1: use the name-to-Unicode mapping table + missing = hex = gFalse; + for (code = 0; code < 256; ++code) { + if ((charName = enc[code])) { + if (!(toUnicode[code] = globalParams->mapNameToUnicode(charName)) && + strcmp(charName, ".notdef")) { + // if it wasn't in the name-to-Unicode table, check for a + // name that looks like 'Axx' or 'xx', where 'A' is any letter + // and 'xx' is two hex digits + if ((strlen(charName) == 3 && + isalpha(charName[0]) && + isxdigit(charName[1]) && isxdigit(charName[2]) && + ((charName[1] >= 'a' && charName[1] <= 'f') || + (charName[1] >= 'A' && charName[1] <= 'F') || + (charName[2] >= 'a' && charName[2] <= 'f') || + (charName[2] >= 'A' && charName[2] <= 'F'))) || + (strlen(charName) == 2 && + isxdigit(charName[0]) && isxdigit(charName[1]) && + ((charName[0] >= 'a' && charName[0] <= 'f') || + (charName[0] >= 'A' && charName[0] <= 'F') || + (charName[1] >= 'a' && charName[1] <= 'f') || + (charName[1] >= 'A' && charName[1] <= 'F')))) { + hex = gTrue; + } + missing = gTrue; + } + } else { + toUnicode[code] = 0; + } + } + + // pass 2: try to fill in the missing chars, looking for names of + // the form 'Axx', 'xx', 'Ann', 'ABnn', or 'nn', where 'A' and 'B' + // are any letters, 'xx' is two hex digits, and 'nn' is 2-4 + // decimal digits + if (missing && globalParams->getMapNumericCharNames()) { + for (code = 0; code < 256; ++code) { + if ((charName = enc[code]) && !toUnicode[code] && + strcmp(charName, ".notdef")) { + n = strlen(charName); + code2 = -1; + if (hex && n == 3 && isalpha(charName[0]) && + isxdigit(charName[1]) && isxdigit(charName[2])) { + sscanf(charName+1, "%x", &code2); + } else if (hex && n == 2 && + isxdigit(charName[0]) && isxdigit(charName[1])) { + sscanf(charName, "%x", &code2); + } else if (!hex && n >= 2 && n <= 4 && + isdigit(charName[0]) && isdigit(charName[1])) { + code2 = atoi(charName); + } else if (n >= 3 && n <= 5 && + isdigit(charName[1]) && isdigit(charName[2])) { + code2 = atoi(charName+1); + } else if (n >= 4 && n <= 6 && + isdigit(charName[2]) && isdigit(charName[3])) { + code2 = atoi(charName+2); + } + if (code2 >= 0 && code2 <= 0xff) { + toUnicode[code] = (Unicode)code2; + } + } + } + + // if the 'mapUnknownCharNames' flag is set, do a simple pass-through + // mapping for unknown character names + } else if (missing && globalParams->getMapUnknownCharNames()) { + for (code = 0; code < 256; ++code) { + if (!toUnicode[code]) { + toUnicode[code] = code; + } + } + } + + // construct the char code -> Unicode mapping object + ctu = CharCodeToUnicode::make8BitToUnicode(toUnicode); + + // merge in a ToUnicode CMap, if there is one -- this overwrites + // existing entries in ctu, i.e., the ToUnicode CMap takes + // precedence, but the other encoding info is allowed to fill in any + // holes + readToUnicodeCMap(fontDict, 8, ctu); + + // look for a Unicode-to-Unicode mapping + if (name && (utu = globalParams->getUnicodeToUnicode(name))) { + for (i = 0; i < 256; ++i) { + toUnicode[i] = 0; + } + ctu2 = CharCodeToUnicode::make8BitToUnicode(toUnicode); + for (i = 0; i < 256; ++i) { + n = ctu->mapToUnicode((CharCode)i, uBuf, 8); + if (n >= 1) { + n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8); + if (n >= 1) { + ctu2->setMapping((CharCode)i, uBuf, n); + } + } + } + utu->decRefCnt(); + delete ctu; + ctu = ctu2; + } + + //----- get the character widths ----- + + // initialize all widths + for (code = 0; code < 256; ++code) { + widths[code] = missingWidth * 0.001; + } + + // use widths from font dict, if present + fontDict->lookup("FirstChar", &obj1); + firstChar = obj1.isInt() ? obj1.getInt() : 0; + obj1.free(); + if (firstChar < 0 || firstChar > 255) { + firstChar = 0; + } + fontDict->lookup("LastChar", &obj1); + lastChar = obj1.isInt() ? obj1.getInt() : 255; + obj1.free(); + if (lastChar < 0 || lastChar > 255) { + lastChar = 255; + } + mul = (type == fontType3) ? fontMat[0] : 0.001; + fontDict->lookup("Widths", &obj1); + if (obj1.isArray()) { + flags |= fontFixedWidth; + if (obj1.arrayGetLength() < lastChar - firstChar + 1) { + lastChar = firstChar + obj1.arrayGetLength() - 1; + } + for (code = firstChar; code <= lastChar; ++code) { + obj1.arrayGet(code - firstChar, &obj2); + if (obj2.isNum()) { + widths[code] = obj2.getNum() * mul; + if (widths[code] != widths[firstChar]) { + flags &= ~fontFixedWidth; + } + } + obj2.free(); + } + + // use widths from built-in font + } else if (builtinFont) { + // this is a kludge for broken PDF files that encode char 32 + // as .notdef + if (builtinFont->widths->getWidth("space", &w)) { + widths[32] = 0.001 * w; + } + for (code = 0; code < 256; ++code) { + if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) { + widths[code] = 0.001 * w; + } + } + + // couldn't find widths -- use defaults + } else { + // this is technically an error -- the Widths entry is required + // for all but the Base-14 fonts -- but certain PDF generators + // apparently don't include widths for Arial and TimesNewRoman + if (isFixedWidth()) { + i = 0; + } else if (isSerif()) { + i = 8; + } else { + i = 4; + } + if (isBold()) { + i += 2; + } + if (isItalic()) { + i += 1; + } + builtinFont = builtinFontSubst[i]; + // this is a kludge for broken PDF files that encode char 32 + // as .notdef + if (builtinFont->widths->getWidth("space", &w)) { + widths[32] = 0.001 * w; + } + for (code = 0; code < 256; ++code) { + if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) { + widths[code] = 0.001 * w; + } + } + } + obj1.free(); + + ok = gTrue; +} + +Gfx8BitFont::~Gfx8BitFont() { + int i; + + for (i = 0; i < 256; ++i) { + if (encFree[i] && enc[i]) { + gfree(enc[i]); + } + } + ctu->decRefCnt(); + if (charProcs.isDict()) { + charProcs.free(); + } + if (resources.isDict()) { + resources.free(); + } +} + +int Gfx8BitFont::getNextChar(char *s, int len, CharCode *code, + Unicode *u, int uSize, int *uLen, + double *dx, double *dy, double *ox, double *oy) { + CharCode c; + + *code = c = (CharCode)(*s & 0xff); + *uLen = ctu->mapToUnicode(c, u, uSize); + *dx = widths[c]; + *dy = *ox = *oy = 0; + return 1; +} + +CharCodeToUnicode* Gfx8BitFont::getCTU() { + return ctu; +} + +CharCodeToUnicode *Gfx8BitFont::getToUnicode() { + ctu->incRefCnt(); + return ctu; +} + +Gushort *Gfx8BitFont::getCodeToGIDMap(FoFiTrueType *ff) { + Gushort *map; + int cmapPlatform, cmapEncoding; + int unicodeCmap, macRomanCmap, msSymbolCmap, cmap; + GBool useMacRoman, useUnicode; + char *charName; + Unicode u; + int code, i, n; + + map = (Gushort *)gmallocn(256, sizeof(Gushort)); + for (i = 0; i < 256; ++i) { + map[i] = 0; + } + + // To match up with the Adobe-defined behaviour, we choose a cmap + // like this: + // 1. If the PDF font has an encoding: + // 1a. If the PDF font specified MacRomanEncoding and the + // TrueType font has a Macintosh Roman cmap, use it, and + // reverse map the char names through MacRomanEncoding to + // get char codes. + // 1b. If the TrueType font has a Microsoft Unicode cmap or a + // non-Microsoft Unicode cmap, use it, and use the Unicode + // indexes, not the char codes. + // 1c. If the PDF font is symbolic and the TrueType font has a + // Microsoft Symbol cmap, use it, and use char codes + // directly (possibly with an offset of 0xf000). + // 1d. If the TrueType font has a Macintosh Roman cmap, use it, + // as in case 1a. + // 2. If the PDF font does not have an encoding or the PDF font is + // symbolic: + // 2a. If the TrueType font has a Macintosh Roman cmap, use it, + // and use char codes directly (possibly with an offset of + // 0xf000). + // 2b. If the TrueType font has a Microsoft Symbol cmap, use it, + // and use char codes directly (possible with an offset of + // 0xf000). + // 3. If none of these rules apply, use the first cmap and hope for + // the best (this shouldn't happen). + unicodeCmap = macRomanCmap = msSymbolCmap = -1; + for (i = 0; i < ff->getNumCmaps(); ++i) { + cmapPlatform = ff->getCmapPlatform(i); + cmapEncoding = ff->getCmapEncoding(i); + if ((cmapPlatform == 3 && cmapEncoding == 1) || + cmapPlatform == 0) { + unicodeCmap = i; + } else if (cmapPlatform == 1 && cmapEncoding == 0) { + macRomanCmap = i; + } else if (cmapPlatform == 3 && cmapEncoding == 0) { + msSymbolCmap = i; + } + } + cmap = 0; + useMacRoman = gFalse; + useUnicode = gFalse; + if (hasEncoding) { + if (usesMacRomanEnc && macRomanCmap >= 0) { + cmap = macRomanCmap; + useMacRoman = gTrue; + } else if (unicodeCmap >= 0) { + cmap = unicodeCmap; + useUnicode = gTrue; + } else if ((flags & fontSymbolic) && msSymbolCmap >= 0) { + cmap = msSymbolCmap; + } else if ((flags & fontSymbolic) && macRomanCmap >= 0) { + cmap = macRomanCmap; + } else if (macRomanCmap >= 0) { + cmap = macRomanCmap; + useMacRoman = gTrue; + } + } else { + if (msSymbolCmap >= 0) { + cmap = msSymbolCmap; + } else if (macRomanCmap >= 0) { + cmap = macRomanCmap; + } + } + + // reverse map the char names through MacRomanEncoding, then map the + // char codes through the cmap + if (useMacRoman) { + for (i = 0; i < 256; ++i) { + if ((charName = enc[i])) { + if ((code = globalParams->getMacRomanCharCode(charName))) { + map[i] = ff->mapCodeToGID(cmap, code); + } + } + } + + // map Unicode through the cmap + } else if (useUnicode) { + for (i = 0; i < 256; ++i) { + if (((charName = enc[i]) && + (u = globalParams->mapNameToUnicode(charName))) || + (n = ctu->mapToUnicode((CharCode)i, &u, 1))) { + map[i] = ff->mapCodeToGID(cmap, u); + } + } + + // map the char codes through the cmap, possibly with an offset of + // 0xf000 + } else { + for (i = 0; i < 256; ++i) { + if (!(map[i] = ff->mapCodeToGID(cmap, i))) { + map[i] = ff->mapCodeToGID(cmap, 0xf000 + i); + } + } + } + + // try the TrueType 'post' table to handle any unmapped characters + for (i = 0; i < 256; ++i) { + if (!map[i] && (charName = enc[i])) { + map[i] = (Gushort)(int)ff->mapNameToGID(charName); + } + } + + return map; +} + +Dict *Gfx8BitFont::getCharProcs() { + return charProcs.isDict() ? charProcs.getDict() : (Dict *)NULL; +} + +Object *Gfx8BitFont::getCharProc(int code, Object *proc) { + if (enc[code] && charProcs.isDict()) { + charProcs.dictLookup(enc[code], proc); + } else { + proc->initNull(); + } + return proc; +} + +Dict *Gfx8BitFont::getResources() { + return resources.isDict() ? resources.getDict() : (Dict *)NULL; +} + +//------------------------------------------------------------------------ +// GfxCIDFont +//------------------------------------------------------------------------ + +static int CDECL cmpWidthExcep(const void *w1, const void *w2) { + return ((GfxFontCIDWidthExcep *)w1)->first - + ((GfxFontCIDWidthExcep *)w2)->first; +} + +static int CDECL cmpWidthExcepV(const void *w1, const void *w2) { + return ((GfxFontCIDWidthExcepV *)w1)->first - + ((GfxFontCIDWidthExcepV *)w2)->first; +} + +GfxCIDFont::GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA, + Dict *fontDict): + GfxFont(tagA, idA, nameA) +{ + Dict *desFontDict; + GString *collection, *cMapName; + Object desFontDictObj; + Object obj1, obj2, obj3, obj4, obj5, obj6; + CharCodeToUnicode *utu; + CharCode c; + Unicode uBuf[8]; + int c1, c2; + int excepsSize, i, j, k, n; + + ascent = 0.95; + descent = -0.35; + fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; + cMap = NULL; + ctu = NULL; + widths.defWidth = 1.0; + widths.defHeight = -1.0; + widths.defVY = 0.880; + widths.exceps = NULL; + widths.nExceps = 0; + widths.excepsV = NULL; + widths.nExcepsV = 0; + cidToGID = NULL; + cidToGIDLen = 0; + + // get the descendant font + if (!fontDict->lookup("DescendantFonts", &obj1)->isArray()) { + error(-1, "Missing DescendantFonts entry in Type 0 font"); + obj1.free(); + goto err1; + } + if (!obj1.arrayGet(0, &desFontDictObj)->isDict()) { + error(-1, "Bad descendant font in Type 0 font"); + goto err3; + } + obj1.free(); + desFontDict = desFontDictObj.getDict(); + + // font type + if (!desFontDict->lookup("Subtype", &obj1)) { + error(-1, "Missing Subtype entry in Type 0 descendant font"); + goto err3; + } + if (obj1.isName("CIDFontType0")) { + type = fontCIDType0; + } else if (obj1.isName("CIDFontType2")) { + type = fontCIDType2; + } else { + error(-1, "Unknown Type 0 descendant font type '%s'", + obj1.isName() ? obj1.getName() : "???"); + goto err3; + } + obj1.free(); + + // get info from font descriptor + readFontDescriptor(xref, desFontDict); + + // look for an external font file + findExtFontFile(); + + //----- encoding info ----- + + // char collection + if (!desFontDict->lookup("CIDSystemInfo", &obj1)->isDict()) { + error(-1, "Missing CIDSystemInfo dictionary in Type 0 descendant font"); + goto err3; + } + obj1.dictLookup("Registry", &obj2); + obj1.dictLookup("Ordering", &obj3); + if (!obj2.isString() || !obj3.isString()) { + error(-1, "Invalid CIDSystemInfo dictionary in Type 0 descendant font"); + goto err4; + } + collection = obj2.getString()->copy()->append('-')->append(obj3.getString()); + obj3.free(); + obj2.free(); + obj1.free(); + + // look for a ToUnicode CMap + if (!(ctu = readToUnicodeCMap(fontDict, 16, NULL))) { + + // the "Adobe-Identity" and "Adobe-UCS" collections don't have + // cidToUnicode files + if (collection->cmp("Adobe-Identity") && + collection->cmp("Adobe-UCS")) { + + // look for a user-supplied .cidToUnicode file + if (!(ctu = globalParams->getCIDToUnicode(collection))) { + error(-1, "Unknown character collection '%s'", + collection->getCString()); + // fall-through, assuming the Identity mapping -- this appears + // to match Adobe's behavior + } + } + } + + // look for a Unicode-to-Unicode mapping + if (name && (utu = globalParams->getUnicodeToUnicode(name))) { + if (ctu) { + for (c = 0; c < ctu->getLength(); ++c) { + n = ctu->mapToUnicode(c, uBuf, 8); + if (n >= 1) { + n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8); + if (n >= 1) { + ctu->setMapping(c, uBuf, n); + } + } + } + utu->decRefCnt(); + } else { + ctu = utu; + } + } + + // encoding (i.e., CMap) + //~ need to handle a CMap stream here + //~ also need to deal with the UseCMap entry in the stream dict + if (!fontDict->lookup("Encoding", &obj1)->isName()) { + error(-1, "Missing or invalid Encoding entry in Type 0 font"); + delete collection; + goto err3; + } + cMapName = new GString(obj1.getName()); + obj1.free(); + if (!(cMap = globalParams->getCMap(collection, cMapName))) { + error(-1, "Unknown CMap '%s' for character collection '%s'", + cMapName->getCString(), collection->getCString()); + delete collection; + delete cMapName; + goto err2; + } + delete collection; + delete cMapName; + + // CIDToGIDMap (for embedded TrueType fonts) + if (type == fontCIDType2) { + desFontDict->lookup("CIDToGIDMap", &obj1); + if (obj1.isStream()) { + cidToGIDLen = 0; + i = 64; + cidToGID = (Gushort *)gmallocn(i, sizeof(Gushort)); + obj1.streamReset(); + while ((c1 = obj1.streamGetChar()) != EOF && + (c2 = obj1.streamGetChar()) != EOF) { + if (cidToGIDLen == i) { + i *= 2; + cidToGID = (Gushort *)greallocn(cidToGID, i, sizeof(Gushort)); + } + cidToGID[cidToGIDLen++] = (Gushort)((c1 << 8) + c2); + } + } else if (!obj1.isName("Identity") && !obj1.isNull()) { + error(-1, "Invalid CIDToGIDMap entry in CID font"); + } + obj1.free(); + } + + //----- character metrics ----- + + // default char width + if (desFontDict->lookup("DW", &obj1)->isInt()) { + widths.defWidth = obj1.getInt() * 0.001; + } + obj1.free(); + + // char width exceptions + if (desFontDict->lookup("W", &obj1)->isArray()) { + excepsSize = 0; + i = 0; + while (i + 1 < obj1.arrayGetLength()) { + obj1.arrayGet(i, &obj2); + obj1.arrayGet(i + 1, &obj3); + if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) { + if (obj1.arrayGet(i + 2, &obj4)->isNum()) { + if (widths.nExceps == excepsSize) { + excepsSize += 16; + widths.exceps = (GfxFontCIDWidthExcep *) + greallocn(widths.exceps, + excepsSize, sizeof(GfxFontCIDWidthExcep)); + } + widths.exceps[widths.nExceps].first = obj2.getInt(); + widths.exceps[widths.nExceps].last = obj3.getInt(); + widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001; + ++widths.nExceps; + } else { + error(-1, "Bad widths array in Type 0 font"); + } + obj4.free(); + i += 3; + } else if (obj2.isInt() && obj3.isArray()) { + if (widths.nExceps + obj3.arrayGetLength() > excepsSize) { + excepsSize = (widths.nExceps + obj3.arrayGetLength() + 15) & ~15; + widths.exceps = (GfxFontCIDWidthExcep *) + greallocn(widths.exceps, + excepsSize, sizeof(GfxFontCIDWidthExcep)); + } + j = obj2.getInt(); + for (k = 0; k < obj3.arrayGetLength(); ++k) { + if (obj3.arrayGet(k, &obj4)->isNum()) { + widths.exceps[widths.nExceps].first = j; + widths.exceps[widths.nExceps].last = j; + widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001; + ++j; + ++widths.nExceps; + } else { + error(-1, "Bad widths array in Type 0 font"); + } + obj4.free(); + } + i += 2; + } else { + error(-1, "Bad widths array in Type 0 font"); + ++i; + } + obj3.free(); + obj2.free(); + } + qsort(widths.exceps, widths.nExceps, sizeof(GfxFontCIDWidthExcep), + &cmpWidthExcep); + } + obj1.free(); + + // default metrics for vertical font + if (desFontDict->lookup("DW2", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + if (obj1.arrayGet(0, &obj2)->isNum()) { + widths.defVY = obj2.getNum() * 0.001; + } + obj2.free(); + if (obj1.arrayGet(1, &obj2)->isNum()) { + widths.defHeight = obj2.getNum() * 0.001; + } + obj2.free(); + } + obj1.free(); + + // char metric exceptions for vertical font + if (desFontDict->lookup("W2", &obj1)->isArray()) { + excepsSize = 0; + i = 0; + while (i + 1 < obj1.arrayGetLength()) { + obj1.arrayGet(i, &obj2); + obj1.arrayGet(i+ 1, &obj3); + if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) { + if (obj1.arrayGet(i + 2, &obj4)->isNum() && + obj1.arrayGet(i + 3, &obj5)->isNum() && + obj1.arrayGet(i + 4, &obj6)->isNum()) { + if (widths.nExcepsV == excepsSize) { + excepsSize += 16; + widths.excepsV = (GfxFontCIDWidthExcepV *) + greallocn(widths.excepsV, + excepsSize, sizeof(GfxFontCIDWidthExcepV)); + } + widths.excepsV[widths.nExcepsV].first = obj2.getInt(); + widths.excepsV[widths.nExcepsV].last = obj3.getInt(); + widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001; + widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001; + widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001; + ++widths.nExcepsV; + } else { + error(-1, "Bad widths (W2) array in Type 0 font"); + } + obj6.free(); + obj5.free(); + obj4.free(); + i += 5; + } else if (obj2.isInt() && obj3.isArray()) { + if (widths.nExcepsV + obj3.arrayGetLength() / 3 > excepsSize) { + excepsSize = + (widths.nExcepsV + obj3.arrayGetLength() / 3 + 15) & ~15; + widths.excepsV = (GfxFontCIDWidthExcepV *) + greallocn(widths.excepsV, + excepsSize, sizeof(GfxFontCIDWidthExcepV)); + } + j = obj2.getInt(); + for (k = 0; k < obj3.arrayGetLength(); k += 3) { + if (obj3.arrayGet(k, &obj4)->isNum() && + obj3.arrayGet(k+1, &obj5)->isNum() && + obj3.arrayGet(k+2, &obj6)->isNum()) { + widths.excepsV[widths.nExceps].first = j; + widths.excepsV[widths.nExceps].last = j; + widths.excepsV[widths.nExceps].height = obj4.getNum() * 0.001; + widths.excepsV[widths.nExceps].vx = obj5.getNum() * 0.001; + widths.excepsV[widths.nExceps].vy = obj6.getNum() * 0.001; + ++j; + ++widths.nExcepsV; + } else { + error(-1, "Bad widths (W2) array in Type 0 font"); + } + obj6.free(); + obj5.free(); + obj4.free(); + } + i += 2; + } else { + error(-1, "Bad widths (W2) array in Type 0 font"); + ++i; + } + obj3.free(); + obj2.free(); + } + qsort(widths.excepsV, widths.nExcepsV, sizeof(GfxFontCIDWidthExcepV), + &cmpWidthExcepV); + } + obj1.free(); + + desFontDictObj.free(); + ok = gTrue; + return; + + err4: + obj3.free(); + obj2.free(); + err3: + obj1.free(); + err2: + desFontDictObj.free(); + err1:; +} + +GfxCIDFont::~GfxCIDFont() { + if (cMap) { + cMap->decRefCnt(); + } + if (ctu) { + ctu->decRefCnt(); + } + gfree(widths.exceps); + gfree(widths.excepsV); + if (cidToGID) { + gfree(cidToGID); + } +} + +CharCodeToUnicode* GfxCIDFont::getCTU() { + return ctu; +} + +int GfxCIDFont::getNextChar(char *s, int len, CharCode *code, + Unicode *u, int uSize, int *uLen, + double *dx, double *dy, double *ox, double *oy) { + CID cid; + double w, h, vx, vy; + int n, a, b, m; + + if (!cMap) { + *code = 0; + *uLen = 0; + *dx = *dy = 0; + return 1; + } + + *code = (CharCode)(cid = cMap->getCID(s, len, &n)); + if (ctu) { + *uLen = ctu->mapToUnicode(cid, u, uSize); + } else { + *uLen = 0; + } + + // horizontal + if (cMap->getWMode() == 0) { + w = widths.defWidth; + h = vx = vy = 0; + if (widths.nExceps > 0 && cid >= widths.exceps[0].first) { + a = 0; + b = widths.nExceps; + // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths.exceps[m].first <= cid) { + a = m; + } else { + b = m; + } + } + if (cid <= widths.exceps[a].last) { + w = widths.exceps[a].width; + } + } + + // vertical + } else { + w = 0; + h = widths.defHeight; + vx = widths.defWidth / 2; + vy = widths.defVY; + if (widths.nExcepsV > 0 && cid >= widths.excepsV[0].first) { + a = 0; + b = widths.nExcepsV; + // invariant: widths.excepsV[a].first <= cid < widths.excepsV[b].first + while (b - a > 1) { + m = (a + b) / 2; + if (widths.excepsV[m].last <= cid) { + a = m; + } else { + b = m; + } + } + if (cid <= widths.excepsV[a].last) { + h = widths.excepsV[a].height; + vx = widths.excepsV[a].vx; + vy = widths.excepsV[a].vy; + } + } + } + + *dx = w; + *dy = h; + *ox = vx; + *oy = vy; + + return n; +} + +int GfxCIDFont::getWMode() { + return cMap ? cMap->getWMode() : 0; +} + +CharCodeToUnicode *GfxCIDFont::getToUnicode() { + if (ctu) { + ctu->incRefCnt(); + } + return ctu; +} + +GString *GfxCIDFont::getCollection() { + return cMap ? cMap->getCollection() : (GString *)NULL; +} + +//------------------------------------------------------------------------ +// GfxFontDict +//------------------------------------------------------------------------ + +GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) { + int i; + Object obj1, obj2; + Ref r; + + numFonts = fontDict->getLength(); + fonts = (GfxFont **)gmallocn(numFonts, sizeof(GfxFont *)); + for (i = 0; i < numFonts; ++i) { + fontDict->getValNF(i, &obj1); + obj1.fetch(xref, &obj2); + if (obj2.isDict()) { + if (obj1.isRef()) { + r = obj1.getRef(); + } else { + // no indirect reference for this font, so invent a unique one + // (legal generation numbers are five digits, so any 6-digit + // number would be safe) + r.num = i; + if (fontDictRef) { + r.gen = 100000 + fontDictRef->num; + } else { + r.gen = 999999; + } + } + fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), + r, obj2.getDict()); + if (fonts[i] && !fonts[i]->isOk()) { + delete fonts[i]; + fonts[i] = NULL; + } + } else { + error(-1, "font resource is not a dictionary"); + fonts[i] = NULL; + } + obj1.free(); + obj2.free(); + } +} + +GfxFontDict::~GfxFontDict() { + int i; + + for (i = 0; i < numFonts; ++i) { + if (fonts[i]) { + delete fonts[i]; + } + } + gfree(fonts); +} + +GfxFont *GfxFontDict::lookup(char *tag) { + int i; + + for (i = 0; i < numFonts; ++i) { + if (fonts[i] && fonts[i]->matches(tag)) { + return fonts[i]; + } + } + return NULL; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h new file mode 100644 index 000000000..c16e9e375 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h @@ -0,0 +1,323 @@ +//======================================================================== +// +// GfxFont.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GFXFONT_H +#define GFXFONT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "GString.h" +#include "Object.h" +#include "CharTypes.h" + +class Dict; +class CMap; +class CharCodeToUnicode; +class FoFiTrueType; +struct GfxFontCIDWidths; + +//------------------------------------------------------------------------ +// GfxFontType +//------------------------------------------------------------------------ + +enum GfxFontType { + //----- Gfx8BitFont + fontUnknownType, + fontType1, + fontType1C, + fontType1COT, + fontType3, + fontTrueType, + fontTrueTypeOT, + //----- GfxCIDFont + fontCIDType0, + fontCIDType0C, + fontCIDType0COT, + fontCIDType2, + fontCIDType2OT +}; + +//------------------------------------------------------------------------ +// GfxFontCIDWidths +//------------------------------------------------------------------------ + +struct GfxFontCIDWidthExcep { + CID first; // this record applies to + CID last; // CIDs .. + double width; // char width +}; + +struct GfxFontCIDWidthExcepV { + CID first; // this record applies to + CID last; // CIDs .. + double height; // char height + double vx, vy; // origin position +}; + +struct GfxFontCIDWidths { + double defWidth; // default char width + double defHeight; // default char height + double defVY; // default origin position + GfxFontCIDWidthExcep *exceps; // exceptions + int nExceps; // number of valid entries in exceps + GfxFontCIDWidthExcepV * // exceptions for vertical font + excepsV; + int nExcepsV; // number of valid entries in excepsV +}; + +//------------------------------------------------------------------------ +// GfxFont +//------------------------------------------------------------------------ + +#define fontFixedWidth (1 << 0) +#define fontSerif (1 << 1) +#define fontSymbolic (1 << 2) +#define fontItalic (1 << 6) +#define fontBold (1 << 18) + +class GfxFont { +public: + + // Build a GfxFont object. + static GfxFont *makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict); + + GfxFont(char *tagA, Ref idA, GString *nameA); + + virtual ~GfxFont(); + + GBool isOk() { return ok; } + + // Get font tag. + GString *getTag() { return tag; } + + // Get font dictionary ID. + Ref *getID() { return &id; } + + // Does this font match the tag? + GBool matches(char *tagA) { return !tag->cmp(tagA); } + + // Get base font name. + GString *getName() { return name; } + + // Get the original font name (ignornig any munging that might have + // been done to map to a canonical Base-14 font name). + GString *getOrigName() { return origName; } + + // Get font type. + GfxFontType getType() { return type; } + virtual GBool isCIDFont() { return gFalse; } + + // Get embedded font ID, i.e., a ref for the font file stream. + // Returns false if there is no embedded font. + GBool getEmbeddedFontID(Ref *embID) + { *embID = embFontID; return embFontID.num >= 0; } + + // Get the PostScript font name for the embedded font. Returns + // NULL if there is no embedded font. + GString *getEmbeddedFontName() { return embFontName; } + + // Get the name of the external font file. Returns NULL if there + // is no external font file. + GString *getExtFontFile() { return extFontFile; } + + // Get font descriptor flags. + int getFlags() { return flags; } + GBool isFixedWidth() { return flags & fontFixedWidth; } + GBool isSerif() { return flags & fontSerif; } + GBool isSymbolic() { return flags & fontSymbolic; } + GBool isItalic() { return flags & fontItalic; } + GBool isBold() { return flags & fontBold; } + + // Return the font matrix. + double *getFontMatrix() { return fontMat; } + + // Return the font bounding box. + double *getFontBBox() { return fontBBox; } + + // Return the ascent and descent values. + double getAscent() { return ascent; } + double getDescent() { return descent; } + + // Return the writing mode (0=horizontal, 1=vertical). + virtual int getWMode() { return 0; } + + // Read an external or embedded font file into a buffer. + char *readExtFontFile(int *len); + char *readEmbFontFile(XRef *xref, int *len); + + // Get the next char from a string of bytes, returning the + // char , its Unicode mapping , its displacement vector + // (, ), and its origin offset vector (, ). + // is the number of entries available in , and is set to + // the number actually used. Returns the number of bytes used by + // the char code. + virtual int getNextChar(char *s, int len, CharCode *code, + Unicode *u, int uSize, int *uLen, + double *dx, double *dy, double *ox, double *oy) = 0; + virtual CharCodeToUnicode* getCTU() = 0; + +protected: + + void readFontDescriptor(XRef *xref, Dict *fontDict); + CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits, + CharCodeToUnicode *ctu); + void findExtFontFile(); + + GString *tag; // PDF font tag + Ref id; // reference (used as unique ID) + GString *name; // font name + GString *origName; // original font name + GfxFontType type; // type of font + int flags; // font descriptor flags + GString *embFontName; // name of embedded font + Ref embFontID; // ref to embedded font file stream + GString *extFontFile; // external font file name + double fontMat[6]; // font matrix (Type 3 only) + double fontBBox[4]; // font bounding box (Type 3 only) + double missingWidth; // "default" width + double ascent; // max height above baseline + double descent; // max depth below baseline + GBool ok; +}; + +//------------------------------------------------------------------------ +// Gfx8BitFont +//------------------------------------------------------------------------ + +class Gfx8BitFont: public GfxFont { +public: + + Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA, + GfxFontType typeA, Dict *fontDict); + + virtual ~Gfx8BitFont(); + + virtual int getNextChar(char *s, int len, CharCode *code, + Unicode *u, int uSize, int *uLen, + double *dx, double *dy, double *ox, double *oy); + virtual CharCodeToUnicode* getCTU(); + + // Return the encoding. + char **getEncoding() { return enc; } + + // Return the Unicode map. + CharCodeToUnicode *getToUnicode(); + + // Return the character name associated with . + char *getCharName(int code) { return code>=256?0:enc[code]; } + + // Returns true if the PDF font specified an encoding. + GBool getHasEncoding() { return hasEncoding; } + + // Returns true if the PDF font specified MacRomanEncoding. + GBool getUsesMacRomanEnc() { return usesMacRomanEnc; } + + // Get width of a character. + double getWidth(Guchar c) { return widths[c]; } + + // Return a char code-to-GID mapping for the provided font file. + // (This is only useful for TrueType fonts.) + Gushort *getCodeToGIDMap(FoFiTrueType *ff); + + // Return the Type 3 CharProc dictionary, or NULL if none. + Dict *getCharProcs(); + + // Return the Type 3 CharProc for the character associated with . + Object *getCharProc(int code, Object *proc); + + // Return the Type 3 Resources dictionary, or NULL if none. + Dict *getResources(); + +private: + + char *enc[256]; // char code --> char name + char encFree[256]; // boolean for each char name: if set, + // the string is malloc'ed + CharCodeToUnicode *ctu; // char code --> Unicode + GBool hasEncoding; + GBool usesMacRomanEnc; + double widths[256]; // character widths + Object charProcs; // Type 3 CharProcs dictionary + Object resources; // Type 3 Resources dictionary +}; + +//------------------------------------------------------------------------ +// GfxCIDFont +//------------------------------------------------------------------------ + +class GfxCIDFont: public GfxFont { +public: + + GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA, + Dict *fontDict); + + virtual ~GfxCIDFont(); + + virtual GBool isCIDFont() { return gTrue; } + + virtual int getNextChar(char *s, int len, CharCode *code, + Unicode *u, int uSize, int *uLen, + double *dx, double *dy, double *ox, double *oy); + virtual CharCodeToUnicode* getCTU(); + + // Return the writing mode (0=horizontal, 1=vertical). + virtual int getWMode(); + + // Return the Unicode map. + CharCodeToUnicode *getToUnicode(); + + // Get the collection name (-). + GString *getCollection(); + + // Return the CID-to-GID mapping table. These should only be called + // if type is fontCIDType2. + Gushort *getCIDToGID() { return cidToGID; } + int getCIDToGIDLen() { return cidToGIDLen; } + +private: + + CMap *cMap; // char code --> CID + CharCodeToUnicode *ctu; // CID --> Unicode + GfxFontCIDWidths widths; // character widths + Gushort *cidToGID; // CID --> GID mapping (for embedded + // TrueType fonts) + int cidToGIDLen; +}; + +//------------------------------------------------------------------------ +// GfxFontDict +//------------------------------------------------------------------------ + +class GfxFontDict { +public: + + // Build the font dictionary, given the PDF font dictionary. + GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict); + + // Destructor. + ~GfxFontDict(); + + // Get the specified font. + GfxFont *lookup(char *tag); + + // Iterative access. + int getNumFonts() { return numFonts; } + GfxFont *getFont(int i) { return fonts[i]; } + +private: + + GfxFont **fonts; // list of fonts + int numFonts; // number of fonts +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc new file mode 100644 index 000000000..da07245b0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc @@ -0,0 +1,4172 @@ +//======================================================================== +// +// GfxState.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "gmem.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "Page.h" +#include "GfxState.h" +#include "cmyk.h" + +//------------------------------------------------------------------------ + +static inline GfxColorComp clip01(GfxColorComp x) { + return (x < 0) ? 0 : (x > gfxColorComp1) ? gfxColorComp1 : x; +} + +static inline double clip01(double x) { + return (x < 0) ? 0 : (x > 1) ? 1 : x; +} + +//------------------------------------------------------------------------ + +struct GfxBlendModeInfo { + char *name; + GfxBlendMode mode; +}; + +static GfxBlendModeInfo gfxBlendModeNames[] = { + { "Normal", gfxBlendNormal }, + { "Compatible", gfxBlendNormal }, + { "Multiply", gfxBlendMultiply }, + { "Screen", gfxBlendScreen }, + { "Overlay", gfxBlendOverlay }, + { "Darken", gfxBlendDarken }, + { "Lighten", gfxBlendLighten }, + { "ColorDodge", gfxBlendColorDodge }, + { "ColorBurn", gfxBlendColorBurn }, + { "HardLight", gfxBlendHardLight }, + { "SoftLight", gfxBlendSoftLight }, + { "Difference", gfxBlendDifference }, + { "Exclusion", gfxBlendExclusion }, + { "Hue", gfxBlendHue }, + { "Saturation", gfxBlendSaturation }, + { "Color", gfxBlendColor }, + { "Luminosity", gfxBlendLuminosity } +}; + +#define nGfxBlendModeNames \ + ((int)((sizeof(gfxBlendModeNames) / sizeof(GfxBlendModeInfo)))) + +//------------------------------------------------------------------------ + +// NB: This must match the GfxColorSpaceMode enum defined in +// GfxState.h +static char *gfxColorSpaceModeNames[] = { + "DeviceGray", + "CalGray", + "DeviceRGB", + "CalRGB", + "DeviceCMYK", + "Lab", + "ICCBased", + "Indexed", + "Separation", + "DeviceN", + "Pattern" +}; + +#define nGfxColorSpaceModes ((sizeof(gfxColorSpaceModeNames) / sizeof(char *))) + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +GfxColorSpace::GfxColorSpace() { +} + +GfxColorSpace::~GfxColorSpace() { +} + +GfxColorSpace *GfxColorSpace::parse(Object *csObj, StreamColorSpaceMode csMode) { + GfxColorSpace *cs; + Object obj1; + + cs = NULL; + if (csObj->isName()) { + if (csObj->isName("DeviceGray") || csObj->isName("G")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) { + if(csMode == streamCSDeviceRGBX) + cs = new GfxDeviceRGBXColorSpace(); + else + cs = new GfxDeviceRGBColorSpace(); + } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else if (csObj->isName("Pattern")) { + cs = new GfxPatternColorSpace(NULL); + } else { + error(-1, "Bad color space '%s'", csObj->getName()); + } + } else if (csObj->isArray()) { + csObj->arrayGet(0, &obj1); + if (obj1.isName("DeviceGray") || obj1.isName("G")) { + cs = new GfxDeviceGrayColorSpace(); + } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) { + if(csMode == streamCSDeviceRGBX) + cs = new GfxDeviceRGBColorSpace(); + else + cs = new GfxDeviceRGBColorSpace(); + } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) { + cs = new GfxDeviceCMYKColorSpace(); + } else if (obj1.isName("CalGray")) { + cs = GfxCalGrayColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("CalRGB")) { + cs = GfxCalRGBColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Lab")) { + cs = GfxLabColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("ICCBased")) { + cs = GfxICCBasedColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Indexed") || obj1.isName("I")) { + cs = GfxIndexedColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Separation")) { + cs = GfxSeparationColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("DeviceN")) { + cs = GfxDeviceNColorSpace::parse(csObj->getArray()); + } else if (obj1.isName("Pattern")) { + cs = GfxPatternColorSpace::parse(csObj->getArray()); + } else { + error(-1, "Bad color space"); + } + obj1.free(); + } else { + error(-1, "Bad color space - expected name or array"); + } + return cs; +} + +void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel) { + int i; + + for (i = 0; i < getNComps(); ++i) { + decodeLow[i] = 0; + decodeRange[i] = 1; + } +} + +int GfxColorSpace::getNumColorSpaceModes() { + return nGfxColorSpaceModes; +} + +char *GfxColorSpace::getColorSpaceModeName(int idx) { + return gfxColorSpaceModeNames[idx]; +} + +//------------------------------------------------------------------------ +// GfxDeviceGrayColorSpace +//------------------------------------------------------------------------ + +GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() { +} + +GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() { +} + +GfxColorSpace *GfxDeviceGrayColorSpace::copy() { + return new GfxDeviceGrayColorSpace(); +} + +void GfxDeviceGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01(color->c[0]); +} + +void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = clip01(color->c[0]); +} + +void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = clip01(gfxColorComp1 - color->c[0]); +} + +void GfxDeviceGrayColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; +} + +//------------------------------------------------------------------------ +// GfxCalGrayColorSpace +//------------------------------------------------------------------------ + +GfxCalGrayColorSpace::GfxCalGrayColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + gamma = 1; +} + +GfxCalGrayColorSpace::~GfxCalGrayColorSpace() { +} + +GfxColorSpace *GfxCalGrayColorSpace::copy() { + GfxCalGrayColorSpace *cs; + + cs = new GfxCalGrayColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->gamma = gamma; + return cs; +} + +GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) { + GfxCalGrayColorSpace *cs; + Object obj1, obj2, obj3; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(-1, "Bad CalGray color space"); + obj1.free(); + return NULL; + } + cs = new GfxCalGrayColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Gamma", &obj2)->isNum()) { + cs->gamma = obj2.getNum(); + } + obj2.free(); + obj1.free(); + return cs; +} + +void GfxCalGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01(color->c[0]); +} + +void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = clip01(color->c[0]); +} + +void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = clip01(gfxColorComp1 - color->c[0]); +} + +void GfxCalGrayColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; +} + +//------------------------------------------------------------------------ +// GfxDeviceRGBColorSpace +//------------------------------------------------------------------------ + +GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() { +} + +GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() { +} + +GfxColorSpace *GfxDeviceRGBColorSpace::copy() { + return new GfxDeviceRGBColorSpace(); +} + +void GfxDeviceRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01((GfxColorComp)(0.3 * color->c[0] + + 0.59 * color->c[1] + + 0.11 * color->c[2] + 0.5)); +} + +void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = clip01(color->c[0]); + rgb->g = clip01(color->c[1]); + rgb->b = clip01(color->c[2]); +} + +void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColorComp c, m, y, k; + + c = clip01(gfxColorComp1 - color->c[0]); + m = clip01(gfxColorComp1 - color->c[1]); + y = clip01(gfxColorComp1 - color->c[2]); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxDeviceRGBColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + color->c[1] = 0; + color->c[2] = 0; +} + +//------------------------------------------------------------------------ +// GfxDeviceRGBXColorSpace +//------------------------------------------------------------------------ + +GfxDeviceRGBXColorSpace::GfxDeviceRGBXColorSpace() { +} + +GfxColorSpace *GfxDeviceRGBXColorSpace::copy() { + return new GfxDeviceRGBXColorSpace(); +} + +//------------------------------------------------------------------------ +// GfxCalRGBColorSpace +//------------------------------------------------------------------------ + +GfxCalRGBColorSpace::GfxCalRGBColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + gammaR = gammaG = gammaB = 1; + mat[0] = 1; mat[1] = 0; mat[2] = 0; + mat[3] = 0; mat[4] = 1; mat[5] = 0; + mat[6] = 0; mat[7] = 0; mat[8] = 1; +} + +GfxCalRGBColorSpace::~GfxCalRGBColorSpace() { +} + +GfxColorSpace *GfxCalRGBColorSpace::copy() { + GfxCalRGBColorSpace *cs; + int i; + + cs = new GfxCalRGBColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->gammaR = gammaR; + cs->gammaG = gammaG; + cs->gammaB = gammaB; + for (i = 0; i < 9; ++i) { + cs->mat[i] = mat[i]; + } + return cs; +} + +GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) { + GfxCalRGBColorSpace *cs; + Object obj1, obj2, obj3; + int i; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(-1, "Bad CalRGB color space"); + obj1.free(); + return NULL; + } + cs = new GfxCalRGBColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Gamma", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->gammaR = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->gammaG = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->gammaB = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Matrix", &obj2)->isArray() && + obj2.arrayGetLength() == 9) { + for (i = 0; i < 9; ++i) { + obj2.arrayGet(i, &obj3); + cs->mat[i] = obj3.getNum(); + obj3.free(); + } + } + obj2.free(); + obj1.free(); + return cs; +} + +void GfxCalRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01((GfxColorComp)(0.299 * color->c[0] + + 0.587 * color->c[1] + + 0.114 * color->c[2] + 0.5)); +} + +void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = clip01(color->c[0]); + rgb->g = clip01(color->c[1]); + rgb->b = clip01(color->c[2]); +} + +void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColorComp c, m, y, k; + + c = clip01(gfxColorComp1 - color->c[0]); + m = clip01(gfxColorComp1 - color->c[1]); + y = clip01(gfxColorComp1 - color->c[2]); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxCalRGBColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + color->c[1] = 0; + color->c[2] = 0; +} + +//------------------------------------------------------------------------ +// GfxDeviceCMYKColorSpace +//------------------------------------------------------------------------ + +GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() { +} + +GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() { +} + +GfxColorSpace *GfxDeviceCMYKColorSpace::copy() { + return new GfxDeviceCMYKColorSpace(); +} + +void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = clip01((GfxColorComp)(gfxColorComp1 - color->c[3] + - 0.3 * color->c[0] + - 0.59 * color->c[1] + - 0.11 * color->c[2] + 0.5)); +} + +/*void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + unsigned char r,g,b; + float c = color->c[0]; + float m = color->c[1]; + float y = color->c[2]; + float k = color->c[3]; + convert_cmyk2rgb(c,m,y,k, &r,&g,&b); + rgb->r = r/255.0; + rgb->g = g/255.0; + rgb->b = b/255.0; +}*/ + +void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double c, m, y, k, c1, m1, y1, k1, r, g, b, x; + + c = colToDbl(color->c[0]); + m = colToDbl(color->c[1]); + y = colToDbl(color->c[2]); + k = colToDbl(color->c[3]); + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + // this is a matrix multiplication, unrolled for performance + // C M Y K + x = c1 * m1 * y1 * k1; // 0 0 0 0 + r = g = b = x; + x = c1 * m1 * y1 * k; // 0 0 0 1 + r += 0.1373 * x; + g += 0.1216 * x; + b += 0.1255 * x; + x = c1 * m1 * y * k1; // 0 0 1 0 + r += x; + g += 0.9490 * x; + x = c1 * m1 * y * k; // 0 0 1 1 + r += 0.1098 * x; + g += 0.1020 * x; + x = c1 * m * y1 * k1; // 0 1 0 0 + r += 0.9255 * x; + b += 0.5490 * x; + x = c1 * m * y1 * k; // 0 1 0 1 + r += 0.1412 * x; + x = c1 * m * y * k1; // 0 1 1 0 + r += 0.9294 * x; + g += 0.1098 * x; + b += 0.1412 * x; + x = c1 * m * y * k; // 0 1 1 1 + r += 0.1333 * x; + x = c * m1 * y1 * k1; // 1 0 0 0 + g += 0.6784 * x; + b += 0.9373 * x; + x = c * m1 * y1 * k; // 1 0 0 1 + g += 0.0588 * x; + b += 0.1412 * x; + x = c * m1 * y * k1; // 1 0 1 0 + g += 0.6510 * x; + b += 0.3137 * x; + x = c * m1 * y * k; // 1 0 1 1 + g += 0.0745 * x; + x = c * m * y1 * k1; // 1 1 0 0 + r += 0.1804 * x; + g += 0.1922 * x; + b += 0.5725 * x; + x = c * m * y1 * k; // 1 1 0 1 + b += 0.0078 * x; + x = c * m * y * k1; // 1 1 1 0 + r += 0.2118 * x; + g += 0.2119 * x; + b += 0.2235 * x; + rgb->r = clip01(dblToCol(r)); + rgb->g = clip01(dblToCol(g)); + rgb->b = clip01(dblToCol(b)); +} + +void GfxDeviceCMYKColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = clip01(color->c[0]); + cmyk->m = clip01(color->c[1]); + cmyk->y = clip01(color->c[2]); + cmyk->k = clip01(color->c[3]); +} + +void GfxDeviceCMYKColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + color->c[1] = 0; + color->c[2] = 0; + color->c[3] = gfxColorComp1; +} + +//------------------------------------------------------------------------ +// GfxLabColorSpace +//------------------------------------------------------------------------ + +// This is the inverse of MatrixLMN in Example 4.10 from the PostScript +// Language Reference, Third Edition. +static double xyzrgb[3][3] = { + { 3.240449, -1.537136, -0.498531 }, + { -0.969265, 1.876011, 0.041556 }, + { 0.055643, -0.204026, 1.057229 } +}; + +GfxLabColorSpace::GfxLabColorSpace() { + whiteX = whiteY = whiteZ = 1; + blackX = blackY = blackZ = 0; + aMin = bMin = -100; + aMax = bMax = 100; +} + +GfxLabColorSpace::~GfxLabColorSpace() { +} + +GfxColorSpace *GfxLabColorSpace::copy() { + GfxLabColorSpace *cs; + + cs = new GfxLabColorSpace(); + cs->whiteX = whiteX; + cs->whiteY = whiteY; + cs->whiteZ = whiteZ; + cs->blackX = blackX; + cs->blackY = blackY; + cs->blackZ = blackZ; + cs->aMin = aMin; + cs->aMax = aMax; + cs->bMin = bMin; + cs->bMax = bMax; + cs->kr = kr; + cs->kg = kg; + cs->kb = kb; + return cs; +} + +GfxColorSpace *GfxLabColorSpace::parse(Array *arr) { + GfxLabColorSpace *cs; + Object obj1, obj2, obj3; + + arr->get(1, &obj1); + if (!obj1.isDict()) { + error(-1, "Bad Lab color space"); + obj1.free(); + return NULL; + } + cs = new GfxLabColorSpace(); + if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->whiteX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->whiteY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->whiteZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && + obj2.arrayGetLength() == 3) { + obj2.arrayGet(0, &obj3); + cs->blackX = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->blackY = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->blackZ = obj3.getNum(); + obj3.free(); + } + obj2.free(); + if (obj1.dictLookup("Range", &obj2)->isArray() && + obj2.arrayGetLength() == 4) { + obj2.arrayGet(0, &obj3); + cs->aMin = obj3.getNum(); + obj3.free(); + obj2.arrayGet(1, &obj3); + cs->aMax = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2, &obj3); + cs->bMin = obj3.getNum(); + obj3.free(); + obj2.arrayGet(3, &obj3); + cs->bMax = obj3.getNum(); + obj3.free(); + } + obj2.free(); + obj1.free(); + + cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX + + xyzrgb[0][1] * cs->whiteY + + xyzrgb[0][2] * cs->whiteZ); + cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX + + xyzrgb[1][1] * cs->whiteY + + xyzrgb[1][2] * cs->whiteZ); + cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX + + xyzrgb[2][1] * cs->whiteY + + xyzrgb[2][2] * cs->whiteZ); + + return cs; +} + +void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxRGB rgb; + + getRGB(color, &rgb); + *gray = clip01((GfxColorComp)(0.299 * rgb.r + + 0.587 * rgb.g + + 0.114 * rgb.b + 0.5)); +} + +void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double X, Y, Z; + double t1, t2; + double r, g, b; + + // convert L*a*b* to CIE 1931 XYZ color space + t1 = (colToDbl(color->c[0]) + 16) / 116; + t2 = t1 + colToDbl(color->c[1]) / 500; + if (t2 >= (6.0 / 29.0)) { + X = t2 * t2 * t2; + } else { + X = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); + } + X *= whiteX; + if (t1 >= (6.0 / 29.0)) { + Y = t1 * t1 * t1; + } else { + Y = (108.0 / 841.0) * (t1 - (4.0 / 29.0)); + } + Y *= whiteY; + t2 = t1 - colToDbl(color->c[2]) / 200; + if (t2 >= (6.0 / 29.0)) { + Z = t2 * t2 * t2; + } else { + Z = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); + } + Z *= whiteZ; + + // convert XYZ to RGB, including gamut mapping and gamma correction + r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z; + g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z; + b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z; + rgb->r = dblToCol(pow(clip01(r * kr), 0.5)); + rgb->g = dblToCol(pow(clip01(g * kg), 0.5)); + rgb->b = dblToCol(pow(clip01(b * kb), 0.5)); +} + +void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxRGB rgb; + GfxColorComp c, m, y, k; + + getRGB(color, &rgb); + c = clip01(gfxColorComp1 - rgb.r); + m = clip01(gfxColorComp1 - rgb.g); + y = clip01(gfxColorComp1 - rgb.b); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + cmyk->c = c - k; + cmyk->m = m - k; + cmyk->y = y - k; + cmyk->k = k; +} + +void GfxLabColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; + if (aMin > 0) { + color->c[1] = dblToCol(aMin); + } else if (aMax < 0) { + color->c[1] = dblToCol(aMax); + } else { + color->c[1] = 0; + } + if (bMin > 0) { + color->c[2] = dblToCol(bMin); + } else if (bMax < 0) { + color->c[2] = dblToCol(bMax); + } else { + color->c[2] = 0; + } +} + +void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel) { + decodeLow[0] = 0; + decodeRange[0] = 100; + decodeLow[1] = aMin; + decodeRange[1] = aMax - aMin; + decodeLow[2] = bMin; + decodeRange[2] = bMax - bMin; +} + +//------------------------------------------------------------------------ +// GfxICCBasedColorSpace +//------------------------------------------------------------------------ + +GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA, + Ref *iccProfileStreamA) { + nComps = nCompsA; + alt = altA; + iccProfileStream = *iccProfileStreamA; + rangeMin[0] = rangeMin[1] = rangeMin[2] = rangeMin[3] = 0; + rangeMax[0] = rangeMax[1] = rangeMax[2] = rangeMax[3] = 1; +} + +GfxICCBasedColorSpace::~GfxICCBasedColorSpace() { + delete alt; +} + +GfxColorSpace *GfxICCBasedColorSpace::copy() { + GfxICCBasedColorSpace *cs; + int i; + + cs = new GfxICCBasedColorSpace(nComps, alt->copy(), &iccProfileStream); + for (i = 0; i < 4; ++i) { + cs->rangeMin[i] = rangeMin[i]; + cs->rangeMax[i] = rangeMax[i]; + } + return cs; +} + +GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) { + GfxICCBasedColorSpace *cs; + Ref iccProfileStreamA; + int nCompsA; + GfxColorSpace *altA; + Dict *dict; + Object obj1, obj2, obj3; + int i; + + arr->getNF(1, &obj1); + if (obj1.isRef()) { + iccProfileStreamA = obj1.getRef(); + } else { + iccProfileStreamA.num = 0; + iccProfileStreamA.gen = 0; + } + obj1.free(); + arr->get(1, &obj1); + if (!obj1.isStream()) { + error(-1, "Bad ICCBased color space (stream)"); + obj1.free(); + return NULL; + } + dict = obj1.streamGetDict(); + if (!dict->lookup("N", &obj2)->isInt()) { + error(-1, "Bad ICCBased color space (N)"); + obj2.free(); + obj1.free(); + return NULL; + } + nCompsA = obj2.getInt(); + obj2.free(); + if (nCompsA > gfxColorMaxComps) { + error(-1, "ICCBased color space with too many (%d > %d) components", + nCompsA, gfxColorMaxComps); + nCompsA = gfxColorMaxComps; + } + if (dict->lookup("Alternate", &obj2)->isNull() || + !(altA = GfxColorSpace::parse(&obj2))) { + switch (nCompsA) { + case 1: + altA = new GfxDeviceGrayColorSpace(); + break; + case 3: + altA = new GfxDeviceRGBColorSpace(); + break; + case 4: + altA = new GfxDeviceCMYKColorSpace(); + break; + default: + error(-1, "Bad ICCBased color space - invalid N"); + obj2.free(); + obj1.free(); + return NULL; + } + } + obj2.free(); + cs = new GfxICCBasedColorSpace(nCompsA, altA, &iccProfileStreamA); + if (dict->lookup("Range", &obj2)->isArray() && + obj2.arrayGetLength() == 2 * nCompsA) { + for (i = 0; i < nCompsA; ++i) { + obj2.arrayGet(2*i, &obj3); + cs->rangeMin[i] = obj3.getNum(); + obj3.free(); + obj2.arrayGet(2*i+1, &obj3); + cs->rangeMax[i] = obj3.getNum(); + obj3.free(); + } + } + obj2.free(); + obj1.free(); + return cs; +} + +void GfxICCBasedColorSpace::getGray(GfxColor *color, GfxGray *gray) { + alt->getGray(color, gray); +} + +void GfxICCBasedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + alt->getRGB(color, rgb); +} + +void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + alt->getCMYK(color, cmyk); +} + +void GfxICCBasedColorSpace::getDefaultColor(GfxColor *color) { + int i; + + for (i = 0; i < nComps; ++i) { + if (rangeMin[i] > 0) { + color->c[i] = dblToCol(rangeMin[i]); + } else if (rangeMax[i] < 0) { + color->c[i] = dblToCol(rangeMax[i]); + } else { + color->c[i] = 0; + } + } +} + +void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow, + double *decodeRange, + int maxImgPixel) { + alt->getDefaultRanges(decodeLow, decodeRange, maxImgPixel); + +#if 0 + // this is nominally correct, but some PDF files don't set the + // correct ranges in the ICCBased dict + int i; + + for (i = 0; i < nComps; ++i) { + decodeLow[i] = rangeMin[i]; + decodeRange[i] = rangeMax[i] - rangeMin[i]; + } +#endif +} + +//------------------------------------------------------------------------ +// GfxIndexedColorSpace +//------------------------------------------------------------------------ + +GfxIndexedColorSpace::GfxIndexedColorSpace(GfxColorSpace *baseA, + int indexHighA) { + base = baseA; + indexHigh = indexHighA; + lookup = (Guchar *)gmallocn((indexHigh + 1) * base->getNComps(), + sizeof(Guchar)); +} + +GfxIndexedColorSpace::~GfxIndexedColorSpace() { + delete base; + gfree(lookup); +} + +GfxColorSpace *GfxIndexedColorSpace::copy() { + GfxIndexedColorSpace *cs; + + cs = new GfxIndexedColorSpace(base->copy(), indexHigh); + memcpy(cs->lookup, lookup, + (indexHigh + 1) * base->getNComps() * sizeof(Guchar)); + return cs; +} + +GfxColorSpace *GfxIndexedColorSpace::parse(Array *arr) { + GfxIndexedColorSpace *cs; + GfxColorSpace *baseA; + int indexHighA; + Object obj1; + int x; + char *s; + int n, i, j; + + if (arr->getLength() != 4) { + error(-1, "Bad Indexed color space"); + goto err1; + } + arr->get(1, &obj1); + if (!(baseA = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad Indexed color space (base color space)"); + goto err2; + } + obj1.free(); + if (!arr->get(2, &obj1)->isInt()) { + error(-1, "Bad Indexed color space (hival)"); + delete baseA; + goto err2; + } + indexHighA = obj1.getInt(); + if (indexHighA < 0 || indexHighA > 255) { + // the PDF spec requires indexHigh to be in [0,255] -- allowing + // values larger than 255 creates a security hole: if nComps * + // indexHigh is greater than 2^31, the loop below may overwrite + // past the end of the array + error(-1, "Bad Indexed color space (invalid indexHigh value)"); + delete baseA; + goto err2; + } + obj1.free(); + cs = new GfxIndexedColorSpace(baseA, indexHighA); + arr->get(3, &obj1); + n = baseA->getNComps(); + if (obj1.isStream()) { + obj1.streamReset(); + for (i = 0; i <= indexHighA; ++i) { + for (j = 0; j < n; ++j) { + if ((x = obj1.streamGetChar()) == EOF) { + error(-1, "Bad Indexed color space (lookup table stream too short)"); + goto err3; + } + cs->lookup[i*n + j] = (Guchar)x; + } + } + obj1.streamClose(); + } else if (obj1.isString()) { + if (obj1.getString()->getLength() < (indexHighA + 1) * n) { + error(-1, "Bad Indexed color space (lookup table string too short)"); + goto err3; + } + s = obj1.getString()->getCString(); + for (i = 0; i <= indexHighA; ++i) { + for (j = 0; j < n; ++j) { + cs->lookup[i*n + j] = (Guchar)*s++; + } + } + } else { + error(-1, "Bad Indexed color space (lookup table)"); + goto err3; + } + obj1.free(); + return cs; + + err3: + delete cs; + err2: + obj1.free(); + err1: + return NULL; +} + +GfxColor *GfxIndexedColorSpace::mapColorToBase(GfxColor *color, + GfxColor *baseColor) { + Guchar *p; + double low[gfxColorMaxComps], range[gfxColorMaxComps]; + int n, i; + + n = base->getNComps(); + base->getDefaultRanges(low, range, indexHigh); + p = &lookup[(int)(colToDbl(color->c[0]) + 0.5) * n]; + for (i = 0; i < n; ++i) { + baseColor->c[i] = dblToCol(low[i] + (p[i] / 255.0) * range[i]); + } + return baseColor; +} + +void GfxIndexedColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxColor color2; + + base->getGray(mapColorToBase(color, &color2), gray); +} + +void GfxIndexedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + GfxColor color2; + + base->getRGB(mapColorToBase(color, &color2), rgb); +} + +void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColor color2; + + base->getCMYK(mapColorToBase(color, &color2), cmyk); +} + +void GfxIndexedColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = 0; +} + +void GfxIndexedColorSpace::getDefaultRanges(double *decodeLow, + double *decodeRange, + int maxImgPixel) { + decodeLow[0] = 0; + decodeRange[0] = maxImgPixel; +} + +//------------------------------------------------------------------------ +// GfxSeparationColorSpace +//------------------------------------------------------------------------ + +GfxSeparationColorSpace::GfxSeparationColorSpace(GString *nameA, + GfxColorSpace *altA, + Function *funcA) { + name = nameA; + alt = altA; + func = funcA; + nonMarking = !name->cmp("None"); +} + +GfxSeparationColorSpace::~GfxSeparationColorSpace() { + delete name; + delete alt; + delete func; +} + +GfxColorSpace *GfxSeparationColorSpace::copy() { + return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy()); +} + +//~ handle the 'All' and 'None' colorants +GfxColorSpace *GfxSeparationColorSpace::parse(Array *arr) { + GfxSeparationColorSpace *cs; + GString *nameA; + GfxColorSpace *altA; + Function *funcA; + Object obj1; + + if (arr->getLength() != 4) { + error(-1, "Bad Separation color space"); + goto err1; + } + if (!arr->get(1, &obj1)->isName()) { + error(-1, "Bad Separation color space (name)"); + goto err2; + } + nameA = new GString(obj1.getName()); + obj1.free(); + arr->get(2, &obj1); + if (!(altA = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad Separation color space (alternate color space)"); + goto err3; + } + obj1.free(); + arr->get(3, &obj1); + if (!(funcA = Function::parse(&obj1))) { + goto err4; + } + obj1.free(); + cs = new GfxSeparationColorSpace(nameA, altA, funcA); + return cs; + + err4: + delete altA; + err3: + delete nameA; + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxSeparationColorSpace::getGray(GfxColor *color, GfxGray *gray) { + double x; + double c[gfxColorMaxComps]; + GfxColor color2; + int i; + + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getGray(&color2, gray); +} + +void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double x; + double c[gfxColorMaxComps]; + GfxColor color2; + int i; + + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getRGB(&color2, rgb); +} + +void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + double x; + double c[gfxColorMaxComps]; + GfxColor color2; + int i; + + x = colToDbl(color->c[0]); + func->transform(&x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getCMYK(&color2, cmyk); +} + +void GfxSeparationColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = gfxColorComp1; +} + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, + GfxColorSpace *altA, + Function *funcA) { + nComps = nCompsA; + alt = altA; + func = funcA; + nonMarking = gFalse; +} + +GfxDeviceNColorSpace::~GfxDeviceNColorSpace() { + int i; + + for (i = 0; i < nComps; ++i) { + delete names[i]; + } + delete alt; + delete func; +} + +GfxColorSpace *GfxDeviceNColorSpace::copy() { + GfxDeviceNColorSpace *cs; + int i; + + cs = new GfxDeviceNColorSpace(nComps, alt->copy(), func->copy()); + for (i = 0; i < nComps; ++i) { + cs->names[i] = names[i]->copy(); + } + cs->nonMarking = nonMarking; + return cs; +} + +//~ handle the 'None' colorant +GfxColorSpace *GfxDeviceNColorSpace::parse(Array *arr) { + GfxDeviceNColorSpace *cs; + int nCompsA; + GString *namesA[gfxColorMaxComps]; + GfxColorSpace *altA; + Function *funcA; + Object obj1, obj2; + int i; + + if (arr->getLength() != 4 && arr->getLength() != 5) { + error(-1, "Bad DeviceN color space"); + goto err1; + } + if (!arr->get(1, &obj1)->isArray()) { + error(-1, "Bad DeviceN color space (names)"); + goto err2; + } + nCompsA = obj1.arrayGetLength(); + if (nCompsA > gfxColorMaxComps) { + error(-1, "DeviceN color space with too many (%d > %d) components", + nCompsA, gfxColorMaxComps); + nCompsA = gfxColorMaxComps; + } + for (i = 0; i < nCompsA; ++i) { + if (!obj1.arrayGet(i, &obj2)->isName()) { + error(-1, "Bad DeviceN color space (names)"); + obj2.free(); + goto err2; + } + namesA[i] = new GString(obj2.getName()); + obj2.free(); + } + obj1.free(); + arr->get(2, &obj1); + if (!(altA = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad DeviceN color space (alternate color space)"); + goto err3; + } + obj1.free(); + arr->get(3, &obj1); + if (!(funcA = Function::parse(&obj1))) { + goto err4; + } + obj1.free(); + cs = new GfxDeviceNColorSpace(nCompsA, altA, funcA); + cs->nonMarking = gTrue; + for (i = 0; i < nCompsA; ++i) { + cs->names[i] = namesA[i]; + if (namesA[i]->cmp("None")) { + cs->nonMarking = gFalse; + } + } + return cs; + + err4: + delete altA; + err3: + for (i = 0; i < nCompsA; ++i) { + delete namesA[i]; + } + err2: + obj1.free(); + err1: + return NULL; +} + +void GfxDeviceNColorSpace::getGray(GfxColor *color, GfxGray *gray) { + double x[gfxColorMaxComps], c[gfxColorMaxComps]; + GfxColor color2; + int i; + + for (i = 0; i < nComps; ++i) { + x[i] = colToDbl(color->c[i]); + } + func->transform(x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getGray(&color2, gray); +} + +void GfxDeviceNColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + double x[gfxColorMaxComps], c[gfxColorMaxComps]; + GfxColor color2; + int i; + + for (i = 0; i < nComps; ++i) { + x[i] = colToDbl(color->c[i]); + } + func->transform(x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getRGB(&color2, rgb); +} + +void GfxDeviceNColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + double x[gfxColorMaxComps], c[gfxColorMaxComps]; + GfxColor color2; + int i; + + for (i = 0; i < nComps; ++i) { + x[i] = colToDbl(color->c[i]); + } + func->transform(x, c); + for (i = 0; i < alt->getNComps(); ++i) { + color2.c[i] = dblToCol(c[i]); + } + alt->getCMYK(&color2, cmyk); +} + +void GfxDeviceNColorSpace::getDefaultColor(GfxColor *color) { + int i; + + for (i = 0; i < nComps; ++i) { + color->c[i] = gfxColorComp1; + } +} + +//------------------------------------------------------------------------ +// GfxPatternColorSpace +//------------------------------------------------------------------------ + +GfxPatternColorSpace::GfxPatternColorSpace(GfxColorSpace *underA) { + under = underA; +} + +GfxPatternColorSpace::~GfxPatternColorSpace() { + if (under) { + delete under; + } +} + +GfxColorSpace *GfxPatternColorSpace::copy() { + return new GfxPatternColorSpace(under ? under->copy() : + (GfxColorSpace *)NULL); +} + +GfxColorSpace *GfxPatternColorSpace::parse(Array *arr) { + GfxPatternColorSpace *cs; + GfxColorSpace *underA; + Object obj1; + + if (arr->getLength() != 1 && arr->getLength() != 2) { + error(-1, "Bad Pattern color space"); + return NULL; + } + underA = NULL; + if (arr->getLength() == 2) { + arr->get(1, &obj1); + if (!(underA = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad Pattern color space (underlying color space)"); + obj1.free(); + return NULL; + } + obj1.free(); + } + cs = new GfxPatternColorSpace(underA); + return cs; +} + +void GfxPatternColorSpace::getGray(GfxColor *color, GfxGray *gray) { + *gray = 0; +} + +void GfxPatternColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { + rgb->r = rgb->g = rgb->b = 0; +} + +void GfxPatternColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = 1; +} + +void GfxPatternColorSpace::getDefaultColor(GfxColor *color) { + // not used +} + +//------------------------------------------------------------------------ +// Pattern +//------------------------------------------------------------------------ + +GfxPattern::GfxPattern(int typeA) { + type = typeA; +} + +GfxPattern::~GfxPattern() { +} + +GfxPattern *GfxPattern::parse(Object *obj) { + GfxPattern *pattern; + Object obj1; + + if (obj->isDict()) { + obj->dictLookup("PatternType", &obj1); + } else if (obj->isStream()) { + obj->streamGetDict()->lookup("PatternType", &obj1); + } else { + return NULL; + } + pattern = NULL; + if (obj1.isInt() && obj1.getInt() == 1) { + pattern = GfxTilingPattern::parse(obj); + } else if (obj1.isInt() && obj1.getInt() == 2) { + pattern = GfxShadingPattern::parse(obj); + } + obj1.free(); + return pattern; +} + +//------------------------------------------------------------------------ +// GfxTilingPattern +//------------------------------------------------------------------------ + +GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) { + GfxTilingPattern *pat; + Dict *dict; + int paintTypeA, tilingTypeA; + double bboxA[4], matrixA[6]; + double xStepA, yStepA; + Object resDictA; + Object obj1, obj2; + int i; + + if (!patObj->isStream()) { + return NULL; + } + dict = patObj->streamGetDict(); + + if (dict->lookup("PaintType", &obj1)->isInt()) { + paintTypeA = obj1.getInt(); + } else { + paintTypeA = 1; + error(-1, "Invalid or missing PaintType in pattern"); + } + obj1.free(); + if (dict->lookup("TilingType", &obj1)->isInt()) { + tilingTypeA = obj1.getInt(); + } else { + tilingTypeA = 1; + error(-1, "Invalid or missing TilingType in pattern"); + } + obj1.free(); + bboxA[0] = bboxA[1] = 0; + bboxA[2] = bboxA[3] = 1; + if (dict->lookup("BBox", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + for (i = 0; i < 4; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + bboxA[i] = obj2.getNum(); + } + obj2.free(); + } + } else { + error(-1, "Invalid or missing BBox in pattern"); + } + obj1.free(); + if (dict->lookup("XStep", &obj1)->isNum()) { + xStepA = obj1.getNum(); + } else { + xStepA = 1; + error(-1, "Invalid or missing XStep in pattern"); + } + obj1.free(); + if (dict->lookup("YStep", &obj1)->isNum()) { + yStepA = obj1.getNum(); + } else { + yStepA = 1; + error(-1, "Invalid or missing YStep in pattern"); + } + obj1.free(); + if (!dict->lookup("Resources", &resDictA)->isDict()) { + resDictA.free(); + resDictA.initNull(); + error(-1, "Invalid or missing Resources in pattern"); + } + matrixA[0] = 1; matrixA[1] = 0; + matrixA[2] = 0; matrixA[3] = 1; + matrixA[4] = 0; matrixA[5] = 0; + if (dict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + for (i = 0; i < 6; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + matrixA[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + + pat = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA, + &resDictA, matrixA, patObj); + resDictA.free(); + return pat; +} + +GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA, + double *bboxA, double xStepA, double yStepA, + Object *resDictA, double *matrixA, + Object *contentStreamA): + GfxPattern(1) +{ + int i; + + paintType = paintTypeA; + tilingType = tilingTypeA; + for (i = 0; i < 4; ++i) { + bbox[i] = bboxA[i]; + } + xStep = xStepA; + yStep = yStepA; + resDictA->copy(&resDict); + for (i = 0; i < 6; ++i) { + matrix[i] = matrixA[i]; + } + contentStreamA->copy(&contentStream); +} + +GfxTilingPattern::~GfxTilingPattern() { + resDict.free(); + contentStream.free(); +} + +GfxPattern *GfxTilingPattern::copy() { + return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep, + &resDict, matrix, &contentStream); +} + +//------------------------------------------------------------------------ +// GfxShadingPattern +//------------------------------------------------------------------------ + +GfxShadingPattern *GfxShadingPattern::parse(Object *patObj) { + Dict *dict; + GfxShading *shadingA; + double matrixA[6]; + Object obj1, obj2; + int i; + + if (!patObj->isDict()) { + return NULL; + } + dict = patObj->getDict(); + + dict->lookup("Shading", &obj1); + shadingA = GfxShading::parse(&obj1); + obj1.free(); + if (!shadingA) { + return NULL; + } + + matrixA[0] = 1; matrixA[1] = 0; + matrixA[2] = 0; matrixA[3] = 1; + matrixA[4] = 0; matrixA[5] = 0; + if (dict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + for (i = 0; i < 6; ++i) { + if (obj1.arrayGet(i, &obj2)->isNum()) { + matrixA[i] = obj2.getNum(); + } + obj2.free(); + } + } + obj1.free(); + + return new GfxShadingPattern(shadingA, matrixA); +} + +GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA): + GfxPattern(2) +{ + int i; + + shading = shadingA; + for (i = 0; i < 6; ++i) { + matrix[i] = matrixA[i]; + } +} + +GfxShadingPattern::~GfxShadingPattern() { + delete shading; +} + +GfxPattern *GfxShadingPattern::copy() { + return new GfxShadingPattern(shading->copy(), matrix); +} + +//------------------------------------------------------------------------ +// GfxShading +//------------------------------------------------------------------------ + +GfxShading::GfxShading(int typeA) { + type = typeA; + colorSpace = NULL; +} + +GfxShading::GfxShading(GfxShading *shading) { + int i; + + type = shading->type; + colorSpace = shading->colorSpace->copy(); + for (i = 0; i < gfxColorMaxComps; ++i) { + background.c[i] = shading->background.c[i]; + } + hasBackground = shading->hasBackground; + xMin = shading->xMin; + yMin = shading->yMin; + xMax = shading->xMax; + yMax = shading->yMax; + hasBBox = shading->hasBBox; +} + +GfxShading::~GfxShading() { + if (colorSpace) { + delete colorSpace; + } +} + +GfxShading *GfxShading::parse(Object *obj) { + GfxShading *shading; + Dict *dict; + int typeA; + Object obj1; + + if (obj->isDict()) { + dict = obj->getDict(); + } else if (obj->isStream()) { + dict = obj->streamGetDict(); + } else { + return NULL; + } + + if (!dict->lookup("ShadingType", &obj1)->isInt()) { + error(-1, "Invalid ShadingType in shading dictionary"); + obj1.free(); + return NULL; + } + typeA = obj1.getInt(); + obj1.free(); + + switch (typeA) { + case 1: + shading = GfxFunctionShading::parse(dict); + break; + case 2: + shading = GfxAxialShading::parse(dict); + break; + case 3: + shading = GfxRadialShading::parse(dict); + break; + case 4: + if (obj->isStream()) { + shading = GfxGouraudTriangleShading::parse(4, dict, obj->getStream()); + } else { + error(-1, "Invalid Type 4 shading object"); + goto err1; + } + break; + case 5: + if (obj->isStream()) { + shading = GfxGouraudTriangleShading::parse(5, dict, obj->getStream()); + } else { + error(-1, "Invalid Type 5 shading object"); + goto err1; + } + break; + case 6: + if (obj->isStream()) { + shading = GfxPatchMeshShading::parse(6, dict, obj->getStream()); + } else { + error(-1, "Invalid Type 6 shading object"); + goto err1; + } + break; + case 7: + if (obj->isStream()) { + shading = GfxPatchMeshShading::parse(7, dict, obj->getStream()); + } else { + error(-1, "Invalid Type 7 shading object"); + goto err1; + } + break; + default: + error(-1, "Unimplemented shading type %d", typeA); + goto err1; + } + + return shading; + + err1: + return NULL; +} + +GBool GfxShading::init(Dict *dict) { + Object obj1, obj2; + int i; + + dict->lookup("ColorSpace", &obj1); + if (!(colorSpace = GfxColorSpace::parse(&obj1))) { + error(-1, "Bad color space in shading dictionary"); + obj1.free(); + return gFalse; + } + obj1.free(); + + for (i = 0; i < gfxColorMaxComps; ++i) { + background.c[i] = 0; + } + hasBackground = gFalse; + if (dict->lookup("Background", &obj1)->isArray()) { + if (obj1.arrayGetLength() == colorSpace->getNComps()) { + hasBackground = gTrue; + for (i = 0; i < colorSpace->getNComps(); ++i) { + background.c[i] = dblToCol(obj1.arrayGet(i, &obj2)->getNum()); + obj2.free(); + } + } else { + error(-1, "Bad Background in shading dictionary"); + } + } + obj1.free(); + + xMin = yMin = xMax = yMax = 0; + hasBBox = gFalse; + if (dict->lookup("BBox", &obj1)->isArray()) { + if (obj1.arrayGetLength() == 4) { + hasBBox = gTrue; + xMin = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + yMin = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + xMax = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + yMax = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + } else { + error(-1, "Bad BBox in shading dictionary"); + } + } + obj1.free(); + + return gTrue; +} + +//------------------------------------------------------------------------ +// GfxFunctionShading +//------------------------------------------------------------------------ + +GfxFunctionShading::GfxFunctionShading(double x0A, double y0A, + double x1A, double y1A, + double *matrixA, + Function **funcsA, int nFuncsA): + GfxShading(1) +{ + int i; + + x0 = x0A; + y0 = y0A; + x1 = x1A; + y1 = y1A; + for (i = 0; i < 6; ++i) { + matrix[i] = matrixA[i]; + } + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } +} + +GfxFunctionShading::GfxFunctionShading(GfxFunctionShading *shading): + GfxShading(shading) +{ + int i; + + x0 = shading->x0; + y0 = shading->y0; + x1 = shading->x1; + y1 = shading->y1; + for (i = 0; i < 6; ++i) { + matrix[i] = shading->matrix[i]; + } + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } +} + +GfxFunctionShading::~GfxFunctionShading() { + int i; + + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxFunctionShading *GfxFunctionShading::parse(Dict *dict) { + GfxFunctionShading *shading; + double x0A, y0A, x1A, y1A; + double matrixA[6]; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + Object obj1, obj2; + int i; + + x0A = y0A = 0; + x1A = y1A = 1; + if (dict->lookup("Domain", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + x0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + y0A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + x1A = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + y1A = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + matrixA[0] = 1; matrixA[1] = 0; + matrixA[2] = 0; matrixA[3] = 1; + matrixA[4] = 0; matrixA[5] = 0; + if (dict->lookup("Matrix", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + matrixA[0] = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + matrixA[1] = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + matrixA[2] = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + matrixA[3] = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + matrixA[4] = obj1.arrayGet(4, &obj2)->getNum(); + obj2.free(); + matrixA[5] = obj1.arrayGet(5, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + dict->lookup("Function", &obj1); + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(-1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + goto err2; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + goto err1; + } + } + obj1.free(); + + shading = new GfxFunctionShading(x0A, y0A, x1A, y1A, matrixA, + funcsA, nFuncsA); + if (!shading->init(dict)) { + delete shading; + return NULL; + } + return shading; + + err2: + obj2.free(); + err1: + obj1.free(); + return NULL; +} + +GfxShading *GfxFunctionShading::copy() { + return new GfxFunctionShading(this); +} + +void GfxFunctionShading::getColor(double x, double y, GfxColor *color) { + double in[2], out[gfxColorMaxComps]; + int i; + + // NB: there can be one function with n outputs or n functions with + // one output each (where n = number of color components) + for (i = 0; i < gfxColorMaxComps; ++i) { + out[i] = 0; + } + in[0] = x; + in[1] = y; + for (i = 0; i < nFuncs; ++i) { + funcs[i]->transform(in, &out[i]); + } + for (i = 0; i < gfxColorMaxComps; ++i) { + color->c[i] = dblToCol(out[i]); + } +} + +//------------------------------------------------------------------------ +// GfxAxialShading +//------------------------------------------------------------------------ + +GfxAxialShading::GfxAxialShading(double x0A, double y0A, + double x1A, double y1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A): + GfxShading(2) +{ + int i; + + x0 = x0A; + y0 = y0A; + x1 = x1A; + y1 = y1A; + t0 = t0A; + t1 = t1A; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } + extend0 = extend0A; + extend1 = extend1A; +} + +GfxAxialShading::GfxAxialShading(GfxAxialShading *shading): + GfxShading(shading) +{ + int i; + + x0 = shading->x0; + y0 = shading->y0; + x1 = shading->x1; + y1 = shading->y1; + t0 = shading->t0; + y1 = shading->t1; + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } + extend0 = shading->extend0; + extend1 = shading->extend1; +} + +GfxAxialShading::~GfxAxialShading() { + int i; + + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxAxialShading *GfxAxialShading::parse(Dict *dict) { + GfxAxialShading *shading; + double x0A, y0A, x1A, y1A; + double t0A, t1A; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + GBool extend0A, extend1A; + Object obj1, obj2; + int i; + + x0A = y0A = x1A = y1A = 0; + if (dict->lookup("Coords", &obj1)->isArray() && + obj1.arrayGetLength() == 4) { + x0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + y0A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + x1A = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + y1A = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + } else { + error(-1, "Missing or invalid Coords in shading dictionary"); + goto err1; + } + obj1.free(); + + t0A = 0; + t1A = 1; + if (dict->lookup("Domain", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + t0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + t1A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + dict->lookup("Function", &obj1); + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(-1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + obj1.free(); + + extend0A = extend1A = gFalse; + if (dict->lookup("Extend", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + extend0A = obj1.arrayGet(0, &obj2)->getBool(); + obj2.free(); + extend1A = obj1.arrayGet(1, &obj2)->getBool(); + obj2.free(); + } + obj1.free(); + + shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A, + funcsA, nFuncsA, extend0A, extend1A); + if (!shading->init(dict)) { + delete shading; + return NULL; + } + return shading; + + err1: + return NULL; +} + +GfxShading *GfxAxialShading::copy() { + return new GfxAxialShading(this); +} + +void GfxAxialShading::getColor(double t, GfxColor *color) { + double out[gfxColorMaxComps]; + int i; + + // NB: there can be one function with n outputs or n functions with + // one output each (where n = number of color components) + for (i = 0; i < gfxColorMaxComps; ++i) { + out[i] = 0; + } + for (i = 0; i < nFuncs; ++i) { + funcs[i]->transform(&t, &out[i]); + } + for (i = 0; i < gfxColorMaxComps; ++i) { + color->c[i] = dblToCol(out[i]); + } +} + +//------------------------------------------------------------------------ +// GfxRadialShading +//------------------------------------------------------------------------ + +GfxRadialShading::GfxRadialShading(double x0A, double y0A, double r0A, + double x1A, double y1A, double r1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A): + GfxShading(3) +{ + int i; + + x0 = x0A; + y0 = y0A; + r0 = r0A; + x1 = x1A; + y1 = y1A; + r1 = r1A; + t0 = t0A; + t1 = t1A; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } + extend0 = extend0A; + extend1 = extend1A; +} + +GfxRadialShading::GfxRadialShading(GfxRadialShading *shading): + GfxShading(shading) +{ + int i; + + x0 = shading->x0; + y0 = shading->y0; + r0 = shading->r0; + x1 = shading->x1; + y1 = shading->y1; + r1 = shading->r1; + t0 = shading->t0; + y1 = shading->t1; + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } + extend0 = shading->extend0; + extend1 = shading->extend1; +} + +GfxRadialShading::~GfxRadialShading() { + int i; + + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxRadialShading *GfxRadialShading::parse(Dict *dict) { + GfxRadialShading *shading; + double x0A, y0A, r0A, x1A, y1A, r1A; + double t0A, t1A; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + GBool extend0A, extend1A; + Object obj1, obj2; + int i; + + x0A = y0A = r0A = x1A = y1A = r1A = 0; + if (dict->lookup("Coords", &obj1)->isArray() && + obj1.arrayGetLength() == 6) { + x0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + y0A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + r0A = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + x1A = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + y1A = obj1.arrayGet(4, &obj2)->getNum(); + obj2.free(); + r1A = obj1.arrayGet(5, &obj2)->getNum(); + obj2.free(); + } else { + error(-1, "Missing or invalid Coords in shading dictionary"); + goto err1; + } + obj1.free(); + + t0A = 0; + t1A = 1; + if (dict->lookup("Domain", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + t0A = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + t1A = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + } + obj1.free(); + + dict->lookup("Function", &obj1); + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(-1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + obj1.free(); + + extend0A = extend1A = gFalse; + if (dict->lookup("Extend", &obj1)->isArray() && + obj1.arrayGetLength() == 2) { + extend0A = obj1.arrayGet(0, &obj2)->getBool(); + obj2.free(); + extend1A = obj1.arrayGet(1, &obj2)->getBool(); + obj2.free(); + } + obj1.free(); + + shading = new GfxRadialShading(x0A, y0A, r0A, x1A, y1A, r1A, t0A, t1A, + funcsA, nFuncsA, extend0A, extend1A); + if (!shading->init(dict)) { + delete shading; + return NULL; + } + return shading; + + err1: + return NULL; +} + +GfxShading *GfxRadialShading::copy() { + return new GfxRadialShading(this); +} + +void GfxRadialShading::getColor(double t, GfxColor *color) { + double out[gfxColorMaxComps]; + int i; + + // NB: there can be one function with n outputs or n functions with + // one output each (where n = number of color components) + for (i = 0; i < gfxColorMaxComps; ++i) { + out[i] = 0; + } + for (i = 0; i < nFuncs; ++i) { + funcs[i]->transform(&t, &out[i]); + } + for (i = 0; i < gfxColorMaxComps; ++i) { + color->c[i] = dblToCol(out[i]); + } +} + +//------------------------------------------------------------------------ +// GfxShadingBitBuf +//------------------------------------------------------------------------ + +class GfxShadingBitBuf { +public: + + GfxShadingBitBuf(Stream *strA); + ~GfxShadingBitBuf(); + GBool getBits(int n, Guint *val); + void flushBits(); + +private: + + Stream *str; + int bitBuf; + int nBits; +}; + +GfxShadingBitBuf::GfxShadingBitBuf(Stream *strA) { + str = strA; + str->reset(); + bitBuf = 0; + nBits = 0; +} + +GfxShadingBitBuf::~GfxShadingBitBuf() { + str->close(); +} + +GBool GfxShadingBitBuf::getBits(int n, Guint *val) { + int x; + + if (nBits >= n) { + x = (bitBuf >> (nBits - n)) & ((1 << n) - 1); + nBits -= n; + } else { + x = 0; + if (nBits > 0) { + x = bitBuf & ((1 << nBits) - 1); + n -= nBits; + nBits = 0; + } + while (n > 0) { + if ((bitBuf = str->getChar()) == EOF) { + nBits = 0; + return gFalse; + } + if (n >= 8) { + x = (x << 8) | bitBuf; + n -= 8; + } else { + x = (x << n) | (bitBuf >> (8 - n)); + nBits = 8 - n; + n = 0; + } + } + } + *val = x; + return gTrue; +} + +void GfxShadingBitBuf::flushBits() { + bitBuf = 0; + nBits = 0; +} + +//------------------------------------------------------------------------ +// GfxGouraudTriangleShading +//------------------------------------------------------------------------ + +GfxGouraudTriangleShading::GfxGouraudTriangleShading( + int typeA, + GfxGouraudVertex *verticesA, int nVerticesA, + int (*trianglesA)[3], int nTrianglesA, + Function **funcsA, int nFuncsA): + GfxShading(typeA) +{ + int i; + + vertices = verticesA; + nVertices = nVerticesA; + triangles = trianglesA; + nTriangles = nTrianglesA; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } +} + +GfxGouraudTriangleShading::GfxGouraudTriangleShading( + GfxGouraudTriangleShading *shading): + GfxShading(shading) +{ + int i; + + nVertices = shading->nVertices; + vertices = (GfxGouraudVertex *)gmallocn(nVertices, sizeof(GfxGouraudVertex)); + memcpy(vertices, shading->vertices, nVertices * sizeof(GfxGouraudVertex)); + nTriangles = shading->nTriangles; + triangles = (int (*)[3])gmallocn(nTriangles * 3, sizeof(int)); + memcpy(triangles, shading->triangles, nTriangles * 3 * sizeof(int)); + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } +} + +GfxGouraudTriangleShading::~GfxGouraudTriangleShading() { + int i; + + gfree(vertices); + gfree(triangles); + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxGouraudTriangleShading *GfxGouraudTriangleShading::parse(int typeA, + Dict *dict, + Stream *str) { + GfxGouraudTriangleShading *shading; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + int coordBits, compBits, flagBits, vertsPerRow, nRows; + double xMin, xMax, yMin, yMax; + double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps]; + double xMul, yMul; + double cMul[gfxColorMaxComps]; + GfxGouraudVertex *verticesA; + int (*trianglesA)[3]; + int nComps, nVerticesA, nTrianglesA, vertSize, triSize; + Guint x, y, flag; + Guint c[gfxColorMaxComps]; + GfxShadingBitBuf *bitBuf; + Object obj1, obj2; + int i, j, k, state; + + if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) { + coordBits = obj1.getInt(); + } else { + error(-1, "Missing or invalid BitsPerCoordinate in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("BitsPerComponent", &obj1)->isInt()) { + compBits = obj1.getInt(); + } else { + error(-1, "Missing or invalid BitsPerComponent in shading dictionary"); + goto err2; + } + obj1.free(); + flagBits = vertsPerRow = 0; // make gcc happy + if (typeA == 4) { + if (dict->lookup("BitsPerFlag", &obj1)->isInt()) { + flagBits = obj1.getInt(); + } else { + error(-1, "Missing or invalid BitsPerFlag in shading dictionary"); + goto err2; + } + obj1.free(); + } else { + if (dict->lookup("VerticesPerRow", &obj1)->isInt()) { + vertsPerRow = obj1.getInt(); + } else { + error(-1, "Missing or invalid VerticesPerRow in shading dictionary"); + goto err2; + } + obj1.free(); + } + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() >= 6) { + xMin = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + xMax = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1); + yMin = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + yMax = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1); + for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) { + cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(); + obj2.free(); + cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(); + obj2.free(); + cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1); + } + nComps = i; + } else { + error(-1, "Missing or invalid Decode array in shading dictionary"); + goto err2; + } + obj1.free(); + + if (!dict->lookup("Function", &obj1)->isNull()) { + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(-1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + } else { + nFuncsA = 0; + } + obj1.free(); + + nVerticesA = nTrianglesA = 0; + verticesA = NULL; + trianglesA = NULL; + vertSize = triSize = 0; + state = 0; + flag = 0; // make gcc happy + bitBuf = new GfxShadingBitBuf(str); + while (1) { + if (typeA == 4) { + if (!bitBuf->getBits(flagBits, &flag)) { + break; + } + } + if (!bitBuf->getBits(coordBits, &x) || + !bitBuf->getBits(coordBits, &y)) { + break; + } + for (i = 0; i < nComps; ++i) { + if (!bitBuf->getBits(compBits, &c[i])) { + break; + } + } + if (i < nComps) { + break; + } + if (nVerticesA == vertSize) { + vertSize = (vertSize == 0) ? 16 : 2 * vertSize; + verticesA = (GfxGouraudVertex *) + greallocn(verticesA, vertSize, sizeof(GfxGouraudVertex)); + } + verticesA[nVerticesA].x = xMin + xMul * (double)x; + verticesA[nVerticesA].y = yMin + yMul * (double)y; + for (i = 0; i < nComps; ++i) { + verticesA[nVerticesA].color.c[i] = + dblToCol(cMin[i] + cMul[i] * (double)c[i]); + } + ++nVerticesA; + bitBuf->flushBits(); + if (typeA == 4) { + if (state == 0 || state == 1) { + ++state; + } else if (state == 2 || flag > 0) { + if (nTrianglesA == triSize) { + triSize = (triSize == 0) ? 16 : 2 * triSize; + trianglesA = (int (*)[3]) + greallocn(trianglesA, triSize * 3, sizeof(int)); + } + if (state == 2) { + trianglesA[nTrianglesA][0] = nVerticesA - 3; + trianglesA[nTrianglesA][1] = nVerticesA - 2; + trianglesA[nTrianglesA][2] = nVerticesA - 1; + ++state; + } else if (flag == 1) { + trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][1]; + trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2]; + trianglesA[nTrianglesA][2] = nVerticesA - 1; + } else { // flag == 2 + trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][0]; + trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2]; + trianglesA[nTrianglesA][2] = nVerticesA - 1; + } + ++nTrianglesA; + } else { // state == 3 && flag == 0 + state = 1; + } + } + } + delete bitBuf; + if (typeA == 5) { + nRows = nVerticesA / vertsPerRow; + nTrianglesA = (nRows - 1) * 2 * (vertsPerRow - 1); + trianglesA = (int (*)[3])gmallocn(nTrianglesA * 3, sizeof(int)); + k = 0; + for (i = 0; i < nRows - 1; ++i) { + for (j = 0; j < vertsPerRow - 1; ++j) { + trianglesA[k][0] = i * vertsPerRow + j; + trianglesA[k][1] = i * vertsPerRow + j+1; + trianglesA[k][2] = (i+1) * vertsPerRow + j; + ++k; + trianglesA[k][0] = i * vertsPerRow + j+1; + trianglesA[k][1] = (i+1) * vertsPerRow + j; + trianglesA[k][2] = (i+1) * vertsPerRow + j+1; + ++k; + } + } + } + + shading = new GfxGouraudTriangleShading(typeA, verticesA, nVerticesA, + trianglesA, nTrianglesA, + funcsA, nFuncsA); + if (!shading->init(dict)) { + delete shading; + return NULL; + } + return shading; + + err2: + obj1.free(); + err1: + return NULL; +} + +GfxShading *GfxGouraudTriangleShading::copy() { + return new GfxGouraudTriangleShading(this); +} + +void GfxGouraudTriangleShading::getTriangle( + int i, + double *x0, double *y0, GfxColor *color0, + double *x1, double *y1, GfxColor *color1, + double *x2, double *y2, GfxColor *color2) { + double in; + double out[gfxColorMaxComps]; + int v, j; + + v = triangles[i][0]; + *x0 = vertices[v].x; + *y0 = vertices[v].y; + if (nFuncs > 0) { + in = colToDbl(vertices[v].color.c[0]); + for (j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&in, &out[j]); + } + for (j = 0; j < gfxColorMaxComps; ++j) { + color0->c[j] = dblToCol(out[j]); + } + } else { + *color0 = vertices[v].color; + } + v = triangles[i][1]; + *x1 = vertices[v].x; + *y1 = vertices[v].y; + if (nFuncs > 0) { + in = colToDbl(vertices[v].color.c[0]); + for (j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&in, &out[j]); + } + for (j = 0; j < gfxColorMaxComps; ++j) { + color1->c[j] = dblToCol(out[j]); + } + } else { + *color1 = vertices[v].color; + } + v = triangles[i][2]; + *x2 = vertices[v].x; + *y2 = vertices[v].y; + if (nFuncs > 0) { + in = colToDbl(vertices[v].color.c[0]); + for (j = 0; j < nFuncs; ++j) { + funcs[j]->transform(&in, &out[j]); + } + for (j = 0; j < gfxColorMaxComps; ++j) { + color2->c[j] = dblToCol(out[j]); + } + } else { + *color2 = vertices[v].color; + } +} + +//------------------------------------------------------------------------ +// GfxPatchMeshShading +//------------------------------------------------------------------------ + +GfxPatchMeshShading::GfxPatchMeshShading(int typeA, + GfxPatch *patchesA, int nPatchesA, + Function **funcsA, int nFuncsA): + GfxShading(typeA) +{ + int i; + + patches = patchesA; + nPatches = nPatchesA; + nFuncs = nFuncsA; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = funcsA[i]; + } +} + +GfxPatchMeshShading::GfxPatchMeshShading(GfxPatchMeshShading *shading): + GfxShading(shading) +{ + int i; + + nPatches = shading->nPatches; + patches = (GfxPatch *)gmallocn(nPatches, sizeof(GfxPatch)); + memcpy(patches, shading->patches, nPatches * sizeof(GfxPatch)); + nFuncs = shading->nFuncs; + for (i = 0; i < nFuncs; ++i) { + funcs[i] = shading->funcs[i]->copy(); + } +} + +GfxPatchMeshShading::~GfxPatchMeshShading() { + int i; + + gfree(patches); + for (i = 0; i < nFuncs; ++i) { + delete funcs[i]; + } +} + +GfxPatchMeshShading *GfxPatchMeshShading::parse(int typeA, Dict *dict, + Stream *str) { + GfxPatchMeshShading *shading; + Function *funcsA[gfxColorMaxComps]; + int nFuncsA; + int coordBits, compBits, flagBits; + double xMin, xMax, yMin, yMax; + double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps]; + double xMul, yMul; + double cMul[gfxColorMaxComps]; + GfxPatch *patchesA, *p; + int nComps, nPatchesA, patchesSize, nPts, nColors; + Guint flag; + double x[16], y[16]; + Guint xi, yi; + GfxColorComp c[4][gfxColorMaxComps]; + Guint ci[4]; + GfxShadingBitBuf *bitBuf; + Object obj1, obj2; + int i, j; + + if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) { + coordBits = obj1.getInt(); + } else { + error(-1, "Missing or invalid BitsPerCoordinate in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("BitsPerComponent", &obj1)->isInt()) { + compBits = obj1.getInt(); + } else { + error(-1, "Missing or invalid BitsPerComponent in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("BitsPerFlag", &obj1)->isInt()) { + flagBits = obj1.getInt(); + } else { + error(-1, "Missing or invalid BitsPerFlag in shading dictionary"); + goto err2; + } + obj1.free(); + if (dict->lookup("Decode", &obj1)->isArray() && + obj1.arrayGetLength() >= 6) { + xMin = obj1.arrayGet(0, &obj2)->getNum(); + obj2.free(); + xMax = obj1.arrayGet(1, &obj2)->getNum(); + obj2.free(); + xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1); + yMin = obj1.arrayGet(2, &obj2)->getNum(); + obj2.free(); + yMax = obj1.arrayGet(3, &obj2)->getNum(); + obj2.free(); + yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1); + for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) { + cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(); + obj2.free(); + cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(); + obj2.free(); + cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1); + } + nComps = i; + } else { + error(-1, "Missing or invalid Decode array in shading dictionary"); + goto err2; + } + obj1.free(); + + if (!dict->lookup("Function", &obj1)->isNull()) { + if (obj1.isArray()) { + nFuncsA = obj1.arrayGetLength(); + if (nFuncsA > gfxColorMaxComps) { + error(-1, "Invalid Function array in shading dictionary"); + goto err1; + } + for (i = 0; i < nFuncsA; ++i) { + obj1.arrayGet(i, &obj2); + if (!(funcsA[i] = Function::parse(&obj2))) { + obj1.free(); + obj2.free(); + goto err1; + } + obj2.free(); + } + } else { + nFuncsA = 1; + if (!(funcsA[0] = Function::parse(&obj1))) { + obj1.free(); + goto err1; + } + } + } else { + nFuncsA = 0; + } + obj1.free(); + + nPatchesA = 0; + patchesA = NULL; + patchesSize = 0; + bitBuf = new GfxShadingBitBuf(str); + while (1) { + if (!bitBuf->getBits(flagBits, &flag)) { + break; + } + if (typeA == 6) { + switch (flag) { + case 0: nPts = 12; nColors = 4; break; + case 1: + case 2: + case 3: + default: nPts = 8; nColors = 2; break; + } + } else { + switch (flag) { + case 0: nPts = 16; nColors = 4; break; + case 1: + case 2: + case 3: + default: nPts = 12; nColors = 2; break; + } + } + for (i = 0; i < nPts; ++i) { + if (!bitBuf->getBits(coordBits, &xi) || + !bitBuf->getBits(coordBits, &yi)) { + break; + } + x[i] = xMin + xMul * (double)xi; + y[i] = yMin + yMul * (double)yi; + } + if (i < nPts) { + break; + } + for (i = 0; i < nColors; ++i) { + for (j = 0; j < nComps; ++j) { + if (!bitBuf->getBits(compBits, &ci[j])) { + break; + } + c[i][j] = dblToCol(cMin[j] + cMul[j] * (double)ci[j]); + } + if (j < nComps) { + break; + } + } + if (i < nColors) { + break; + } + if (nPatchesA == patchesSize) { + patchesSize = (patchesSize == 0) ? 16 : 2 * patchesSize; + patchesA = (GfxPatch *)greallocn(patchesA, + patchesSize, sizeof(GfxPatch)); + } + p = &patchesA[nPatchesA]; + if (typeA == 6) { + switch (flag) { + case 0: + p->x[0][0] = x[0]; + p->y[0][0] = y[0]; + p->x[0][1] = x[1]; + p->y[0][1] = y[1]; + p->x[0][2] = x[2]; + p->y[0][2] = y[2]; + p->x[0][3] = x[3]; + p->y[0][3] = y[3]; + p->x[1][3] = x[4]; + p->y[1][3] = y[4]; + p->x[2][3] = x[5]; + p->y[2][3] = y[5]; + p->x[3][3] = x[6]; + p->y[3][3] = y[6]; + p->x[3][2] = x[7]; + p->y[3][2] = y[7]; + p->x[3][1] = x[8]; + p->y[3][1] = y[8]; + p->x[3][0] = x[9]; + p->y[3][0] = y[9]; + p->x[2][0] = x[10]; + p->y[2][0] = y[10]; + p->x[1][0] = x[11]; + p->y[1][0] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = c[0][j]; + p->color[0][1].c[j] = c[1][j]; + p->color[1][1].c[j] = c[2][j]; + p->color[1][0].c[j] = c[3][j]; + } + break; + case 1: + p->x[0][0] = patchesA[nPatchesA-1].x[0][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[0][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[1][3]; + p->y[0][1] = patchesA[nPatchesA-1].y[1][3]; + p->x[0][2] = patchesA[nPatchesA-1].x[2][3]; + p->y[0][2] = patchesA[nPatchesA-1].y[2][3]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][3]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 2: + p->x[0][0] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[3][2]; + p->y[0][1] = patchesA[nPatchesA-1].y[3][2]; + p->x[0][2] = patchesA[nPatchesA-1].x[3][1]; + p->y[0][2] = patchesA[nPatchesA-1].y[3][1]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 3: + p->x[0][0] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][0]; + p->x[0][1] = patchesA[nPatchesA-1].x[2][0]; + p->y[0][1] = patchesA[nPatchesA-1].y[2][0]; + p->x[0][2] = patchesA[nPatchesA-1].x[1][0]; + p->y[0][2] = patchesA[nPatchesA-1].y[1][0]; + p->x[0][3] = patchesA[nPatchesA-1].x[0][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[0][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + for (j = 0; j < nComps; ++j) { + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + } + } else { + switch (flag) { + case 0: + p->x[0][0] = x[0]; + p->y[0][0] = y[0]; + p->x[0][1] = x[1]; + p->y[0][1] = y[1]; + p->x[0][2] = x[2]; + p->y[0][2] = y[2]; + p->x[0][3] = x[3]; + p->y[0][3] = y[3]; + p->x[1][3] = x[4]; + p->y[1][3] = y[4]; + p->x[2][3] = x[5]; + p->y[2][3] = y[5]; + p->x[3][3] = x[6]; + p->y[3][3] = y[6]; + p->x[3][2] = x[7]; + p->y[3][2] = y[7]; + p->x[3][1] = x[8]; + p->y[3][1] = y[8]; + p->x[3][0] = x[9]; + p->y[3][0] = y[9]; + p->x[2][0] = x[10]; + p->y[2][0] = y[10]; + p->x[1][0] = x[11]; + p->y[1][0] = y[11]; + p->x[1][1] = x[12]; + p->y[1][1] = y[12]; + p->x[1][2] = x[13]; + p->y[1][2] = y[13]; + p->x[2][2] = x[14]; + p->y[2][2] = y[14]; + p->x[2][1] = x[15]; + p->y[2][1] = y[15]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = c[0][j]; + p->color[0][1].c[j] = c[1][j]; + p->color[1][1].c[j] = c[2][j]; + p->color[1][0].c[j] = c[3][j]; + } + break; + case 1: + p->x[0][0] = patchesA[nPatchesA-1].x[0][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[0][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[1][3]; + p->y[0][1] = patchesA[nPatchesA-1].y[1][3]; + p->x[0][2] = patchesA[nPatchesA-1].x[2][3]; + p->y[0][2] = patchesA[nPatchesA-1].y[2][3]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][3]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + p->x[1][1] = x[8]; + p->y[1][1] = y[8]; + p->x[1][2] = x[9]; + p->y[1][2] = y[9]; + p->x[2][2] = x[10]; + p->y[2][2] = y[10]; + p->x[2][1] = x[11]; + p->y[2][1] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 2: + p->x[0][0] = patchesA[nPatchesA-1].x[3][3]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][3]; + p->x[0][1] = patchesA[nPatchesA-1].x[3][2]; + p->y[0][1] = patchesA[nPatchesA-1].y[3][2]; + p->x[0][2] = patchesA[nPatchesA-1].x[3][1]; + p->y[0][2] = patchesA[nPatchesA-1].y[3][1]; + p->x[0][3] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[3][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + p->x[1][1] = x[8]; + p->y[1][1] = y[8]; + p->x[1][2] = x[9]; + p->y[1][2] = y[9]; + p->x[2][2] = x[10]; + p->y[2][2] = y[10]; + p->x[2][1] = x[11]; + p->y[2][1] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + case 3: + p->x[0][0] = patchesA[nPatchesA-1].x[3][0]; + p->y[0][0] = patchesA[nPatchesA-1].y[3][0]; + p->x[0][1] = patchesA[nPatchesA-1].x[2][0]; + p->y[0][1] = patchesA[nPatchesA-1].y[2][0]; + p->x[0][2] = patchesA[nPatchesA-1].x[1][0]; + p->y[0][2] = patchesA[nPatchesA-1].y[1][0]; + p->x[0][3] = patchesA[nPatchesA-1].x[0][0]; + p->y[0][3] = patchesA[nPatchesA-1].y[0][0]; + p->x[1][3] = x[0]; + p->y[1][3] = y[0]; + p->x[2][3] = x[1]; + p->y[2][3] = y[1]; + p->x[3][3] = x[2]; + p->y[3][3] = y[2]; + p->x[3][2] = x[3]; + p->y[3][2] = y[3]; + p->x[3][1] = x[4]; + p->y[3][1] = y[4]; + p->x[3][0] = x[5]; + p->y[3][0] = y[5]; + p->x[2][0] = x[6]; + p->y[2][0] = y[6]; + p->x[1][0] = x[7]; + p->y[1][0] = y[7]; + p->x[1][1] = x[8]; + p->y[1][1] = y[8]; + p->x[1][2] = x[9]; + p->y[1][2] = y[9]; + p->x[2][2] = x[10]; + p->y[2][2] = y[10]; + p->x[2][1] = x[11]; + p->y[2][1] = y[11]; + for (j = 0; j < nComps; ++j) { + p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; + p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j]; + p->color[1][1].c[j] = c[0][j]; + p->color[1][0].c[j] = c[1][j]; + } + break; + } + } + ++nPatchesA; + bitBuf->flushBits(); + } + delete bitBuf; + + if (typeA == 6) { + for (i = 0; i < nPatchesA; ++i) { + p = &patchesA[i]; + p->x[1][1] = (-4 * p->x[0][0] + +6 * (p->x[0][1] + p->x[1][0]) + -2 * (p->x[0][3] + p->x[3][0]) + +3 * (p->x[3][1] + p->x[1][3]) + - p->x[3][3]) / 9; + p->y[1][1] = (-4 * p->y[0][0] + +6 * (p->y[0][1] + p->y[1][0]) + -2 * (p->y[0][3] + p->y[3][0]) + +3 * (p->y[3][1] + p->y[1][3]) + - p->y[3][3]) / 9; + p->x[1][2] = (-4 * p->x[0][3] + +6 * (p->x[0][2] + p->x[1][3]) + -2 * (p->x[0][0] + p->x[3][3]) + +3 * (p->x[3][2] + p->x[1][0]) + - p->x[3][0]) / 9; + p->y[1][2] = (-4 * p->y[0][3] + +6 * (p->y[0][2] + p->y[1][3]) + -2 * (p->y[0][0] + p->y[3][3]) + +3 * (p->y[3][2] + p->y[1][0]) + - p->y[3][0]) / 9; + p->x[2][1] = (-4 * p->x[3][0] + +6 * (p->x[3][1] + p->x[2][0]) + -2 * (p->x[3][3] + p->x[0][0]) + +3 * (p->x[0][1] + p->x[2][3]) + - p->x[0][3]) / 9; + p->y[2][1] = (-4 * p->y[3][0] + +6 * (p->y[3][1] + p->y[2][0]) + -2 * (p->y[3][3] + p->y[0][0]) + +3 * (p->y[0][1] + p->y[2][3]) + - p->y[0][3]) / 9; + p->x[2][2] = (-4 * p->x[3][3] + +6 * (p->x[3][2] + p->x[2][3]) + -2 * (p->x[3][0] + p->x[0][3]) + +3 * (p->x[0][2] + p->x[2][0]) + - p->x[0][0]) / 9; + p->y[2][2] = (-4 * p->y[3][3] + +6 * (p->y[3][2] + p->y[2][3]) + -2 * (p->y[3][0] + p->y[0][3]) + +3 * (p->y[0][2] + p->y[2][0]) + - p->y[0][0]) / 9; + } + } + + shading = new GfxPatchMeshShading(typeA, patchesA, nPatchesA, + funcsA, nFuncsA); + if (!shading->init(dict)) { + delete shading; + return NULL; + } + return shading; + + err2: + obj1.free(); + err1: + return NULL; +} + +GfxShading *GfxPatchMeshShading::copy() { + return new GfxPatchMeshShading(this); +} + +//------------------------------------------------------------------------ +// GfxImageColorMap +//------------------------------------------------------------------------ + +GfxImageColorMap::GfxImageColorMap(int bitsA, Object *decode, + GfxColorSpace *colorSpaceA) { + GfxIndexedColorSpace *indexedCS; + GfxSeparationColorSpace *sepCS; + int maxPixel, indexHigh; + int maxPixelForAlloc; + Guchar *lookup2; + Function *sepFunc; + Object obj; + double x[gfxColorMaxComps]; + double y[gfxColorMaxComps]; + int i, j, k; + + ok = gTrue; + + // bits per component and color space + bits = bitsA; + maxPixel = (1 << bits) - 1; + maxPixelForAlloc = (1 << (bits>8?bits:8)); + colorSpace = colorSpaceA; + + // initialize + for (k = 0; k < gfxColorMaxComps; ++k) { + lookup[k] = NULL; + } + + // get decode map + if (decode->isNull()) { + nComps = colorSpace->getNComps(); + colorSpace->getDefaultRanges(decodeLow, decodeRange, maxPixel); + } else if (decode->isArray()) { + nComps = decode->arrayGetLength() / 2; + if (nComps != colorSpace->getNComps()) { + goto err1; + } + for (i = 0; i < nComps; ++i) { + decode->arrayGet(2*i, &obj); + if (!obj.isNum()) { + goto err2; + } + decodeLow[i] = obj.getNum(); + obj.free(); + decode->arrayGet(2*i+1, &obj); + if (!obj.isNum()) { + goto err2; + } + decodeRange[i] = obj.getNum() - decodeLow[i]; + obj.free(); + } + } else { + goto err1; + } + + // Construct a lookup table -- this stores pre-computed decoded + // values for each component, i.e., the result of applying the + // decode mapping to each possible image pixel component value. + // + // Optimization: for Indexed and Separation color spaces (which have + // only one component), we store color values in the lookup table + // rather than component values. + colorSpace2 = NULL; + nComps2 = 0; + if (colorSpace->getMode() == csIndexed) { + // Note that indexHigh may not be the same as maxPixel -- + // Distiller will remove unused palette entries, resulting in + // indexHigh < maxPixel. + indexedCS = (GfxIndexedColorSpace *)colorSpace; + colorSpace2 = indexedCS->getBase(); + indexHigh = indexedCS->getIndexHigh(); + nComps2 = colorSpace2->getNComps(); + lookup2 = indexedCS->getLookup(); + colorSpace2->getDefaultRanges(x, y, indexHigh); + for (k = 0; k < nComps2; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5); + if (j < 0) { + j = 0; + } else if (j > indexHigh) { + j = indexHigh; + } + lookup[k][i] = + dblToCol(x[k] + (lookup2[j*nComps2 + k] / 255.0) * y[k]); + } + } + } else if (colorSpace->getMode() == csSeparation) { + sepCS = (GfxSeparationColorSpace *)colorSpace; + colorSpace2 = sepCS->getAlt(); + nComps2 = colorSpace2->getNComps(); + sepFunc = sepCS->getFunc(); + for (k = 0; k < nComps2; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel; + sepFunc->transform(x, y); + lookup[k][i] = dblToCol(y[k]); + } + } + } else { + for (k = 0; k < nComps; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1, + sizeof(GfxColorComp)); + for (i = 0; i <= maxPixel; ++i) { + lookup[k][i] = dblToCol(decodeLow[k] + + (i * decodeRange[k]) / maxPixel); + } + } + } + + return; + + err2: + obj.free(); + err1: + ok = gFalse; +} + +GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) { + int n, i, k; + + colorSpace = colorMap->colorSpace->copy(); + bits = colorMap->bits; + nComps = colorMap->nComps; + nComps2 = colorMap->nComps2; + colorSpace2 = NULL; + for (k = 0; k < gfxColorMaxComps; ++k) { + lookup[k] = NULL; + } + n = 1 << bits; + if (colorSpace->getMode() == csIndexed) { + colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase(); + for (k = 0; k < nComps2; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); + memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); + } + } else if (colorSpace->getMode() == csSeparation) { + colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt(); + for (k = 0; k < nComps2; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); + memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); + } + } else { + for (k = 0; k < nComps; ++k) { + lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); + memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); + } + } + for (i = 0; i < nComps; ++i) { + decodeLow[i] = colorMap->decodeLow[i]; + decodeRange[i] = colorMap->decodeRange[i]; + } + ok = gTrue; +} + +GfxImageColorMap::~GfxImageColorMap() { + int i; + + delete colorSpace; + for (i = 0; i < gfxColorMaxComps; ++i) { + gfree(lookup[i]); + } +} + +void GfxImageColorMap::getGray(Guchar *x, GfxGray *gray) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup[i][x[0]]; + } + colorSpace2->getGray(&color, gray); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[i][x[i]]; + } + colorSpace->getGray(&color, gray); + } +} + +void GfxImageColorMap::getRGB(Guchar *x, GfxRGB *rgb) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup[i][x[0]]; + } + colorSpace2->getRGB(&color, rgb); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[i][x[i]]; + } + colorSpace->getRGB(&color, rgb); + } +} + +void GfxImageColorMap::getCMYK(Guchar *x, GfxCMYK *cmyk) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup[i][x[0]]; + } + colorSpace2->getCMYK(&color, cmyk); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[i][x[i]]; + } + colorSpace->getCMYK(&color, cmyk); + } +} + +void GfxImageColorMap::getColor(Guchar *x, GfxColor *color) { + int maxPixel, i; + + maxPixel = (1 << bits) - 1; + for (i = 0; i < nComps; ++i) { + color->c[i] = dblToCol(decodeLow[i] + (x[i] * decodeRange[i]) / maxPixel); + } +} + +//------------------------------------------------------------------------ +// GfxSubpath and GfxPath +//------------------------------------------------------------------------ + +GfxSubpath::GfxSubpath(double x1, double y1) { + size = 16; + x = (double *)gmallocn(size, sizeof(double)); + y = (double *)gmallocn(size, sizeof(double)); + curve = (GBool *)gmallocn(size, sizeof(GBool)); + n = 1; + x[0] = x1; + y[0] = y1; + curve[0] = gFalse; + closed = gFalse; +} + +GfxSubpath::~GfxSubpath() { + gfree(x); + gfree(y); + gfree(curve); +} + +// Used for copy(). +GfxSubpath::GfxSubpath(GfxSubpath *subpath) { + size = subpath->size; + n = subpath->n; + x = (double *)gmallocn(size, sizeof(double)); + y = (double *)gmallocn(size, sizeof(double)); + curve = (GBool *)gmallocn(size, sizeof(GBool)); + memcpy(x, subpath->x, n * sizeof(double)); + memcpy(y, subpath->y, n * sizeof(double)); + memcpy(curve, subpath->curve, n * sizeof(GBool)); + closed = subpath->closed; +} + +void GfxSubpath::lineTo(double x1, double y1) { + if (n >= size) { + size += 16; + x = (double *)greallocn(x, size, sizeof(double)); + y = (double *)greallocn(y, size, sizeof(double)); + curve = (GBool *)greallocn(curve, size, sizeof(GBool)); + } + x[n] = x1; + y[n] = y1; + curve[n] = gFalse; + ++n; +} + +void GfxSubpath::curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) { + if (n+3 > size) { + size += 16; + x = (double *)greallocn(x, size, sizeof(double)); + y = (double *)greallocn(y, size, sizeof(double)); + curve = (GBool *)greallocn(curve, size, sizeof(GBool)); + } + x[n] = x1; + y[n] = y1; + x[n+1] = x2; + y[n+1] = y2; + x[n+2] = x3; + y[n+2] = y3; + curve[n] = curve[n+1] = gTrue; + curve[n+2] = gFalse; + n += 3; +} + +void GfxSubpath::close() { + if (x[n-1] != x[0] || y[n-1] != y[0]) { + lineTo(x[0], y[0]); + } + closed = gTrue; +} + +void GfxSubpath::offset(double dx, double dy) { + int i; + + for (i = 0; i < n; ++i) { + x[i] += dx; + y[i] += dy; + } +} + +GfxPath::GfxPath() { + justMoved = gFalse; + size = 16; + n = 0; + firstX = firstY = 0; + subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *)); +} + +GfxPath::~GfxPath() { + int i; + + for (i = 0; i < n; ++i) + delete subpaths[i]; + gfree(subpaths); +} + +// Used for copy(). +GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1, + GfxSubpath **subpaths1, int n1, int size1) { + int i; + + justMoved = justMoved1; + firstX = firstX1; + firstY = firstY1; + size = size1; + n = n1; + subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *)); + for (i = 0; i < n; ++i) + subpaths[i] = subpaths1[i]->copy(); +} + +void GfxPath::moveTo(double x, double y) { + justMoved = gTrue; + firstX = x; + firstY = y; +} + +void GfxPath::lineTo(double x, double y) { + if (justMoved) { + if (n >= size) { + size += 16; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + subpaths[n] = new GfxSubpath(firstX, firstY); + ++n; + justMoved = gFalse; + } + subpaths[n-1]->lineTo(x, y); +} + +void GfxPath::curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) { + if (justMoved) { + if (n >= size) { + size += 16; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + subpaths[n] = new GfxSubpath(firstX, firstY); + ++n; + justMoved = gFalse; + } + subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3); +} + +void GfxPath::close() { + // this is necessary to handle the pathological case of + // moveto/closepath/clip, which defines an empty clipping region + if (justMoved) { + if (n >= size) { + size += 16; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + subpaths[n] = new GfxSubpath(firstX, firstY); + ++n; + justMoved = gFalse; + } + subpaths[n-1]->close(); +} + +void GfxPath::append(GfxPath *path) { + int i; + + if (n + path->n > size) { + size = n + path->n; + subpaths = (GfxSubpath **) + greallocn(subpaths, size, sizeof(GfxSubpath *)); + } + for (i = 0; i < path->n; ++i) { + subpaths[n++] = path->subpaths[i]->copy(); + } + justMoved = gFalse; +} + +void GfxPath::offset(double dx, double dy) { + int i; + + for (i = 0; i < n; ++i) { + subpaths[i]->offset(dx, dy); + } +} + +//------------------------------------------------------------------------ +// GfxState +//------------------------------------------------------------------------ + +GfxState::GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox, + int rotateA, GBool upsideDown) { + double kx, ky; + + hDPI = hDPIA; + vDPI = vDPIA; + rotate = rotateA; + px1 = pageBox->x1; + py1 = pageBox->y1; + px2 = pageBox->x2; + py2 = pageBox->y2; + kx = hDPI / 72.0; + ky = vDPI / 72.0; + if (rotate == 90) { + ctm[0] = 0; + ctm[1] = upsideDown ? ky : -ky; + ctm[2] = kx; + ctm[3] = 0; + ctm[4] = -kx * py1; + ctm[5] = ky * (upsideDown ? -px1 : px2); + pageWidth = kx * (py2 - py1); + pageHeight = ky * (px2 - px1); + } else if (rotate == 180) { + ctm[0] = -kx; + ctm[1] = 0; + ctm[2] = 0; + ctm[3] = upsideDown ? ky : -ky; + ctm[4] = kx * px2; + ctm[5] = ky * (upsideDown ? -py1 : py2); + pageWidth = kx * (px2 - px1); + pageHeight = ky * (py2 - py1); + } else if (rotate == 270) { + ctm[0] = 0; + ctm[1] = upsideDown ? -ky : ky; + ctm[2] = -kx; + ctm[3] = 0; + ctm[4] = kx * py2; + ctm[5] = ky * (upsideDown ? px2 : -px1); + pageWidth = kx * (py2 - py1); + pageHeight = ky * (px2 - px1); + } else { + ctm[0] = kx; + ctm[1] = 0; + ctm[2] = 0; + ctm[3] = upsideDown ? -ky : ky; + ctm[4] = -kx * px1; + ctm[5] = ky * (upsideDown ? py2 : -py1); + pageWidth = kx * (px2 - px1); + pageHeight = ky * (py2 - py1); + } + + fillColorSpace = new GfxDeviceGrayColorSpace(); + strokeColorSpace = new GfxDeviceGrayColorSpace(); + fillColor.c[0] = 0; + strokeColor.c[0] = 0; + fillPattern = NULL; + strokePattern = NULL; + blendMode = gfxBlendNormal; + fillOpacity = 1; + strokeOpacity = 1; + fillOverprint = gFalse; + strokeOverprint = gFalse; + transfer[0] = transfer[1] = transfer[2] = transfer[3] = NULL; + + lineWidth = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashStart = 0; + flatness = 1; + lineJoin = 0; + lineCap = 0; + miterLimit = 10; + strokeAdjust = gFalse; + + font = NULL; + fontSize = 0; + textMat[0] = 1; textMat[1] = 0; + textMat[2] = 0; textMat[3] = 1; + textMat[4] = 0; textMat[5] = 0; + charSpace = 0; + wordSpace = 0; + horizScaling = 1; + leading = 0; + rise = 0; + render = 0; + + path = new GfxPath(); + curX = curY = 0; + lineX = lineY = 0; + + clipXMin = 0; + clipYMin = 0; + clipXMax = pageWidth; + clipYMax = pageHeight; + + saved = NULL; +} + +GfxState::~GfxState() { + int i; + + if (fillColorSpace) { + delete fillColorSpace; + } + if (strokeColorSpace) { + delete strokeColorSpace; + } + if (fillPattern) { + delete fillPattern; + } + if (strokePattern) { + delete strokePattern; + } + for (i = 0; i < 4; ++i) { + if (transfer[i]) { + delete transfer[i]; + } + } + gfree(lineDash); + if (path) { + // this gets set to NULL by restore() + delete path; + } + if (saved) { + delete saved; + } +} + +// Used for copy(); +GfxState::GfxState(GfxState *state) { + int i; + + memcpy(this, state, sizeof(GfxState)); + if (fillColorSpace) { + fillColorSpace = state->fillColorSpace->copy(); + } + if (strokeColorSpace) { + strokeColorSpace = state->strokeColorSpace->copy(); + } + if (fillPattern) { + fillPattern = state->fillPattern->copy(); + } + if (strokePattern) { + strokePattern = state->strokePattern->copy(); + } + for (i = 0; i < 4; ++i) { + if (transfer[i]) { + transfer[i] = state->transfer[i]->copy(); + } + } + if (lineDashLength > 0) { + lineDash = (double *)gmallocn(lineDashLength, sizeof(double)); + memcpy(lineDash, state->lineDash, lineDashLength * sizeof(double)); + } + saved = NULL; +} + +void GfxState::setPath(GfxPath *pathA) { + if(pathA) { + if(path) + delete path; + } + path = pathA; +} + +void GfxState::getUserClipBBox(double *xMin, double *yMin, + double *xMax, double *yMax) { + double ictm[6]; + double xMin1, yMin1, xMax1, yMax1, det, tx, ty; + + // invert the CTM + det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); + ictm[0] = ctm[3] * det; + ictm[1] = -ctm[1] * det; + ictm[2] = -ctm[2] * det; + ictm[3] = ctm[0] * det; + ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; + ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; + + // transform all four corners of the clip bbox; find the min and max + // x and y values + xMin1 = xMax1 = clipXMin * ictm[0] + clipYMin * ictm[2] + ictm[4]; + yMin1 = yMax1 = clipXMin * ictm[1] + clipYMin * ictm[3] + ictm[5]; + tx = clipXMin * ictm[0] + clipYMax * ictm[2] + ictm[4]; + ty = clipXMin * ictm[1] + clipYMax * ictm[3] + ictm[5]; + if (tx < xMin1) { + xMin1 = tx; + } else if (tx > xMax1) { + xMax1 = tx; + } + if (ty < yMin1) { + yMin1 = ty; + } else if (ty > yMax1) { + yMax1 = ty; + } + tx = clipXMax * ictm[0] + clipYMin * ictm[2] + ictm[4]; + ty = clipXMax * ictm[1] + clipYMin * ictm[3] + ictm[5]; + if (tx < xMin1) { + xMin1 = tx; + } else if (tx > xMax1) { + xMax1 = tx; + } + if (ty < yMin1) { + yMin1 = ty; + } else if (ty > yMax1) { + yMax1 = ty; + } + tx = clipXMax * ictm[0] + clipYMax * ictm[2] + ictm[4]; + ty = clipXMax * ictm[1] + clipYMax * ictm[3] + ictm[5]; + if (tx < xMin1) { + xMin1 = tx; + } else if (tx > xMax1) { + xMax1 = tx; + } + if (ty < yMin1) { + yMin1 = ty; + } else if (ty > yMax1) { + yMax1 = ty; + } + + *xMin = xMin1; + *yMin = yMin1; + *xMax = xMax1; + *yMax = yMax1; +} + +double GfxState::transformWidth(double w) { + double x, y; + + x = ctm[0] + ctm[2]; + y = ctm[1] + ctm[3]; + return w * sqrt(0.5 * (x * x + y * y)); +} + +double GfxState::getTransformedFontSize() { + double x1, y1, x2, y2; + + x1 = textMat[2] * fontSize; + y1 = textMat[3] * fontSize; + x2 = ctm[0] * x1 + ctm[2] * y1; + y2 = ctm[1] * x1 + ctm[3] * y1; + return sqrt(x2 * x2 + y2 * y2); +} + +void GfxState::getFontTransMat(double *m11, double *m12, + double *m21, double *m22) { + *m11 = (textMat[0] * ctm[0] + textMat[1] * ctm[2]) * fontSize; + *m12 = (textMat[0] * ctm[1] + textMat[1] * ctm[3]) * fontSize; + *m21 = (textMat[2] * ctm[0] + textMat[3] * ctm[2]) * fontSize; + *m22 = (textMat[2] * ctm[1] + textMat[3] * ctm[3]) * fontSize; +} + +void GfxState::setCTM(double a, double b, double c, + double d, double e, double f) { + int i; + + ctm[0] = a; + ctm[1] = b; + ctm[2] = c; + ctm[3] = d; + ctm[4] = e; + ctm[5] = f; + + // avoid FP exceptions on badly messed up PDF files + for (i = 0; i < 6; ++i) { + if (ctm[i] > 1e10) { + ctm[i] = 1e10; + } else if (ctm[i] < -1e10) { + ctm[i] = -1e10; + } + } +} + +void GfxState::concatCTM(double a, double b, double c, + double d, double e, double f) { + double a1 = ctm[0]; + double b1 = ctm[1]; + double c1 = ctm[2]; + double d1 = ctm[3]; + int i; + + ctm[0] = a * a1 + b * c1; + ctm[1] = a * b1 + b * d1; + ctm[2] = c * a1 + d * c1; + ctm[3] = c * b1 + d * d1; + ctm[4] = e * a1 + f * c1 + ctm[4]; + ctm[5] = e * b1 + f * d1 + ctm[5]; + + // avoid FP exceptions on badly messed up PDF files + for (i = 0; i < 6; ++i) { + if (ctm[i] > 1e10) { + ctm[i] = 1e10; + } else if (ctm[i] < -1e10) { + ctm[i] = -1e10; + } + } +} + +void GfxState::shiftCTM(double tx, double ty) { + ctm[4] += tx; + ctm[5] += ty; + clipXMin += tx; + clipYMin += ty; + clipXMax += tx; + clipYMax += ty; +} + +void GfxState::setFillColorSpace(GfxColorSpace *colorSpace) { + if (fillColorSpace) { + delete fillColorSpace; + } + fillColorSpace = colorSpace; +} + +void GfxState::setStrokeColorSpace(GfxColorSpace *colorSpace) { + if (strokeColorSpace) { + delete strokeColorSpace; + } + strokeColorSpace = colorSpace; +} + +void GfxState::setFillPattern(GfxPattern *pattern) { + if (fillPattern) { + delete fillPattern; + } + fillPattern = pattern; +} + +void GfxState::setStrokePattern(GfxPattern *pattern) { + if (strokePattern) { + delete strokePattern; + } + strokePattern = pattern; +} + +void GfxState::setTransfer(Function **funcs) { + int i; + + for (i = 0; i < 4; ++i) { + if (transfer[i]) { + delete transfer[i]; + } + transfer[i] = funcs[i]; + } +} + +void GfxState::setLineDash(double *dash, int length, double start) { + if (lineDash) + gfree(lineDash); + lineDash = dash; + lineDashLength = length; + lineDashStart = start; +} + +void GfxState::clearPath() { + delete path; + path = new GfxPath(); +} + +void GfxState::clip() { + double xMin, yMin, xMax, yMax, x, y; + GfxSubpath *subpath; + int i, j; + + xMin = xMax = yMin = yMax = 0; // make gcc happy + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + for (j = 0; j < subpath->getNumPoints(); ++j) { + transform(subpath->getX(j), subpath->getY(j), &x, &y); + if (i == 0 && j == 0) { + xMin = xMax = x; + yMin = yMax = y; + } else { + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + } + } + } + if (xMin > clipXMin) { + clipXMin = xMin; + } + if (yMin > clipYMin) { + clipYMin = yMin; + } + if (xMax < clipXMax) { + clipXMax = xMax; + } + if (yMax < clipYMax) { + clipYMax = yMax; + } +} + +void GfxState::clipToStrokePath() { + double xMin, yMin, xMax, yMax, x, y, t0, t1; + GfxSubpath *subpath; + int i, j; + + xMin = xMax = yMin = yMax = 0; // make gcc happy + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + for (j = 0; j < subpath->getNumPoints(); ++j) { + transform(subpath->getX(j), subpath->getY(j), &x, &y); + if (i == 0 && j == 0) { + xMin = xMax = x; + yMin = yMax = y; + } else { + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + } + } + } + + // allow for the line width + //~ miter joins can extend farther than this + t0 = fabs(ctm[0]); + t1 = fabs(ctm[2]); + if (t0 > t1) { + xMin -= 0.5 * lineWidth * t0; + xMax += 0.5 * lineWidth * t0; + } else { + xMin -= 0.5 * lineWidth * t1; + xMax += 0.5 * lineWidth * t1; + } + t0 = fabs(ctm[0]); + t1 = fabs(ctm[3]); + if (t0 > t1) { + yMin -= 0.5 * lineWidth * t0; + yMax += 0.5 * lineWidth * t0; + } else { + yMin -= 0.5 * lineWidth * t1; + yMax += 0.5 * lineWidth * t1; + } + + if (xMin > clipXMin) { + clipXMin = xMin; + } + if (yMin > clipYMin) { + clipYMin = yMin; + } + if (xMax < clipXMax) { + clipXMax = xMax; + } + if (yMax < clipYMax) { + clipYMax = yMax; + } +} + +void GfxState::textShift(double tx, double ty) { + double dx, dy; + + textTransformDelta(tx, ty, &dx, &dy); + curX += dx; + curY += dy; +} + +void GfxState::shift(double dx, double dy) { + curX += dx; + curY += dy; +} + +GfxState *GfxState::save() { + GfxState *newState; + + newState = copy(); + newState->saved = this; + return newState; +} + +GfxState *GfxState::restore() { + GfxState *oldState; + + if (saved) { + oldState = saved; + + // these attributes aren't saved/restored by the q/Q operators + oldState->path = path; + oldState->curX = curX; + oldState->curY = curY; + oldState->lineX = lineX; + oldState->lineY = lineY; + + path = NULL; + saved = NULL; + delete this; + + } else { + oldState = this; + } + + return oldState; +} + +GBool GfxState::parseBlendMode(Object *obj, GfxBlendMode *mode) { + Object obj2; + int i, j; + + if (obj->isName()) { + for (i = 0; i < nGfxBlendModeNames; ++i) { + if (!strcmp(obj->getName(), gfxBlendModeNames[i].name)) { + *mode = gfxBlendModeNames[i].mode; + return gTrue; + } + } + return gFalse; + } else if (obj->isArray()) { + for (i = 0; i < obj->arrayGetLength(); ++i) { + obj->arrayGet(i, &obj2); + if (!obj2.isName()) { + obj2.free(); + return gFalse; + } + for (j = 0; j < nGfxBlendModeNames; ++j) { + if (!strcmp(obj2.getName(), gfxBlendModeNames[j].name)) { + obj2.free(); + *mode = gfxBlendModeNames[j].mode; + return gTrue; + } + } + obj2.free(); + } + *mode = gfxBlendNormal; + return gTrue; + } else { + return gFalse; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h new file mode 100644 index 000000000..c0c73fd2f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h @@ -0,0 +1,1257 @@ +//======================================================================== +// +// GfxState.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GFXSTATE_H +#define GFXSTATE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" +#include "Function.h" + +class Array; +class GfxFont; +class PDFRectangle; +class GfxShading; + +//------------------------------------------------------------------------ +// GfxBlendMode +//------------------------------------------------------------------------ + +enum GfxBlendMode { + gfxBlendNormal, + gfxBlendMultiply, + gfxBlendScreen, + gfxBlendOverlay, + gfxBlendDarken, + gfxBlendLighten, + gfxBlendColorDodge, + gfxBlendColorBurn, + gfxBlendHardLight, + gfxBlendSoftLight, + gfxBlendDifference, + gfxBlendExclusion, + gfxBlendHue, + gfxBlendSaturation, + gfxBlendColor, + gfxBlendLuminosity +}; + +//------------------------------------------------------------------------ +// GfxColorComp +//------------------------------------------------------------------------ + +// 16.16 fixed point color component +typedef int GfxColorComp; + +#define gfxColorComp1 0x10000 + +static inline GfxColorComp dblToCol(double x) { + return (GfxColorComp)(x * gfxColorComp1); +} + +static inline double colToDbl(GfxColorComp x) { + return (double)x / (double)gfxColorComp1; +} + +static inline GfxColorComp byteToCol(Guchar x) { + // (x / 255) << 16 = (0.0000000100000001... * x) << 16 + // = ((x << 8) + (x) + (x >> 8) + ...) << 16 + // = (x << 8) + (x) + (x >> 7) + // [for rounding] + return (GfxColorComp)((x << 8) + x + (x >> 7)); +} + +static inline Guchar colToByte(GfxColorComp x) { + // 255 * x + 0.5 = 256 * x - x + 0x8000 + return (Guchar)(((x << 8) - x + 0x8000) >> 16); +} + +//------------------------------------------------------------------------ +// GfxColor +//------------------------------------------------------------------------ + +#define gfxColorMaxComps funcMaxOutputs + +struct GfxColor { + GfxColorComp c[gfxColorMaxComps]; +}; + +//------------------------------------------------------------------------ +// GfxGray +//------------------------------------------------------------------------ + +typedef GfxColorComp GfxGray; + +//------------------------------------------------------------------------ +// GfxRGB +//------------------------------------------------------------------------ + +struct GfxRGB { + GfxColorComp r, g, b; +}; + +//------------------------------------------------------------------------ +// GfxCMYK +//------------------------------------------------------------------------ + +struct GfxCMYK { + GfxColorComp c, m, y, k; +}; + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +// NB: The nGfxColorSpaceModes constant and the gfxColorSpaceModeNames +// array defined in GfxState.cc must match this enum. +enum GfxColorSpaceMode { + csDeviceGray, + csCalGray, + csDeviceRGB, + csCalRGB, + csDeviceCMYK, + csLab, + csICCBased, + csIndexed, + csSeparation, + csDeviceN, + csPattern +}; + +class GfxColorSpace { +public: + + GfxColorSpace(); + virtual ~GfxColorSpace(); + virtual GfxColorSpace *copy() = 0; + virtual GfxColorSpaceMode getMode() = 0; + + // Construct a color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Object *csObj, StreamColorSpaceMode csMode = streamCSNone); + + // Convert to gray, RGB, or CMYK. + virtual void getGray(GfxColor *color, GfxGray *gray) = 0; + virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0; + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0; + + // Return the number of color components. + virtual int getNComps() = 0; + + // Get this color space's default color. + virtual void getDefaultColor(GfxColor *color) = 0; + + // Return the default ranges for each component, assuming an image + // with a max pixel value of . + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Returns true if painting operations in this color space never + // mark the page (e.g., the "None" colorant). + virtual GBool isNonMarking() { return gFalse; } + + // Return the number of color space modes + static int getNumColorSpaceModes(); + + // Return the name of the th color space mode. + static char *getColorSpaceModeName(int idx); + +private: +}; + +//------------------------------------------------------------------------ +// GfxDeviceGrayColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceGrayColorSpace: public GfxColorSpace { +public: + + GfxDeviceGrayColorSpace(); + virtual ~GfxDeviceGrayColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceGray; } + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + +private: +}; + +//------------------------------------------------------------------------ +// GfxCalGrayColorSpace +//------------------------------------------------------------------------ + +class GfxCalGrayColorSpace: public GfxColorSpace { +public: + + GfxCalGrayColorSpace(); + virtual ~GfxCalGrayColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csCalGray; } + + // Construct a CalGray color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + + // CalGray-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getGamma() { return gamma; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double gamma; // gamma value +}; + +//------------------------------------------------------------------------ +// GfxDeviceRGBColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceRGBColorSpace: public GfxColorSpace { +public: + + GfxDeviceRGBColorSpace(); + virtual ~GfxDeviceRGBColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceRGB; } + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + virtual void getDefaultColor(GfxColor *color); + +private: +}; + +//------------------------------------------------------------------------ +// GfxDeviceRGBXColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceRGBXColorSpace: public GfxDeviceRGBColorSpace { +public: + + GfxDeviceRGBXColorSpace(); + virtual GfxColorSpace *copy(); + virtual int getNComps() { return 4; } +private: +}; + +//------------------------------------------------------------------------ +// GfxCalRGBColorSpace +//------------------------------------------------------------------------ + +class GfxCalRGBColorSpace: public GfxColorSpace { +public: + + GfxCalRGBColorSpace(); + virtual ~GfxCalRGBColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csCalRGB; } + + // Construct a CalRGB color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + virtual void getDefaultColor(GfxColor *color); + + // CalRGB-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getGammaR() { return gammaR; } + double getGammaG() { return gammaG; } + double getGammaB() { return gammaB; } + double *getMatrix() { return mat; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double gammaR, gammaG, gammaB; // gamma values + double mat[9]; // ABC -> XYZ transform matrix +}; + +//------------------------------------------------------------------------ +// GfxDeviceCMYKColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceCMYKColorSpace: public GfxColorSpace { +public: + + GfxDeviceCMYKColorSpace(); + virtual ~GfxDeviceCMYKColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; } + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 4; } + virtual void getDefaultColor(GfxColor *color); + +private: +}; + +//------------------------------------------------------------------------ +// GfxLabColorSpace +//------------------------------------------------------------------------ + +class GfxLabColorSpace: public GfxColorSpace { +public: + + GfxLabColorSpace(); + virtual ~GfxLabColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csLab; } + + // Construct a Lab color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 3; } + virtual void getDefaultColor(GfxColor *color); + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Lab-specific access. + double getWhiteX() { return whiteX; } + double getWhiteY() { return whiteY; } + double getWhiteZ() { return whiteZ; } + double getBlackX() { return blackX; } + double getBlackY() { return blackY; } + double getBlackZ() { return blackZ; } + double getAMin() { return aMin; } + double getAMax() { return aMax; } + double getBMin() { return bMin; } + double getBMax() { return bMax; } + +private: + + double whiteX, whiteY, whiteZ; // white point + double blackX, blackY, blackZ; // black point + double aMin, aMax, bMin, bMax; // range for the a and b components + double kr, kg, kb; // gamut mapping mulitpliers +}; + +//------------------------------------------------------------------------ +// GfxICCBasedColorSpace +//------------------------------------------------------------------------ + +class GfxICCBasedColorSpace: public GfxColorSpace { +public: + + GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA, + Ref *iccProfileStreamA); + virtual ~GfxICCBasedColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csICCBased; } + + // Construct an ICCBased color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return nComps; } + virtual void getDefaultColor(GfxColor *color); + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // ICCBased-specific access. + GfxColorSpace *getAlt() { return alt; } + +private: + + int nComps; // number of color components (1, 3, or 4) + GfxColorSpace *alt; // alternate color space + double rangeMin[4]; // min values for each component + double rangeMax[4]; // max values for each component + Ref iccProfileStream; // the ICC profile +}; + +//------------------------------------------------------------------------ +// GfxIndexedColorSpace +//------------------------------------------------------------------------ + +class GfxIndexedColorSpace: public GfxColorSpace { +public: + + GfxIndexedColorSpace(GfxColorSpace *baseA, int indexHighA); + virtual ~GfxIndexedColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csIndexed; } + + // Construct a Lab color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + + virtual void getDefaultRanges(double *decodeLow, double *decodeRange, + int maxImgPixel); + + // Indexed-specific access. + GfxColorSpace *getBase() { return base; } + int getIndexHigh() { return indexHigh; } + Guchar *getLookup() { return lookup; } + GfxColor *mapColorToBase(GfxColor *color, GfxColor *baseColor); + +private: + + GfxColorSpace *base; // base color space + int indexHigh; // max pixel value + Guchar *lookup; // lookup table +}; + +//------------------------------------------------------------------------ +// GfxSeparationColorSpace +//------------------------------------------------------------------------ + +class GfxSeparationColorSpace: public GfxColorSpace { +public: + + GfxSeparationColorSpace(GString *nameA, GfxColorSpace *altA, + Function *funcA); + virtual ~GfxSeparationColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csSeparation; } + + // Construct a Separation color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 1; } + virtual void getDefaultColor(GfxColor *color); + + virtual GBool isNonMarking() { return nonMarking; } + + // Separation-specific access. + GString *getName() { return name; } + GfxColorSpace *getAlt() { return alt; } + Function *getFunc() { return func; } + +private: + + GString *name; // colorant name + GfxColorSpace *alt; // alternate color space + Function *func; // tint transform (into alternate color space) + GBool nonMarking; +}; + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +class GfxDeviceNColorSpace: public GfxColorSpace { +public: + + GfxDeviceNColorSpace(int nCompsA, GfxColorSpace *alt, Function *func); + virtual ~GfxDeviceNColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceN; } + + // Construct a DeviceN color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return nComps; } + virtual void getDefaultColor(GfxColor *color); + + virtual GBool isNonMarking() { return nonMarking; } + + // DeviceN-specific access. + GString *getColorantName(int i) { return names[i]; } + GfxColorSpace *getAlt() { return alt; } + Function *getTintTransformFunc() { return func; } + +private: + + int nComps; // number of components + GString // colorant names + *names[gfxColorMaxComps]; + GfxColorSpace *alt; // alternate color space + Function *func; // tint transform (into alternate color space) + GBool nonMarking; +}; + +//------------------------------------------------------------------------ +// GfxPatternColorSpace +//------------------------------------------------------------------------ + +class GfxPatternColorSpace: public GfxColorSpace { +public: + + GfxPatternColorSpace(GfxColorSpace *underA); + virtual ~GfxPatternColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csPattern; } + + // Construct a Pattern color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(Array *arr); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + + virtual int getNComps() { return 0; } + virtual void getDefaultColor(GfxColor *color); + + // Pattern-specific access. + GfxColorSpace *getUnder() { return under; } + +private: + + GfxColorSpace *under; // underlying color space (for uncolored + // patterns) +}; + +//------------------------------------------------------------------------ +// GfxPattern +//------------------------------------------------------------------------ + +class GfxPattern { +public: + + GfxPattern(int typeA); + virtual ~GfxPattern(); + + static GfxPattern *parse(Object *obj); + + virtual GfxPattern *copy() = 0; + + int getType() { return type; } + +private: + + int type; +}; + +//------------------------------------------------------------------------ +// GfxTilingPattern +//------------------------------------------------------------------------ + +class GfxTilingPattern: public GfxPattern { +public: + + static GfxTilingPattern *parse(Object *patObj); + virtual ~GfxTilingPattern(); + + virtual GfxPattern *copy(); + + int getPaintType() { return paintType; } + int getTilingType() { return tilingType; } + double *getBBox() { return bbox; } + double getXStep() { return xStep; } + double getYStep() { return yStep; } + Dict *getResDict() + { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; } + double *getMatrix() { return matrix; } + Object *getContentStream() { return &contentStream; } + +private: + + GfxTilingPattern(int paintTypeA, int tilingTypeA, + double *bboxA, double xStepA, double yStepA, + Object *resDictA, double *matrixA, + Object *contentStreamA); + + int paintType; + int tilingType; + double bbox[4]; + double xStep, yStep; + Object resDict; + double matrix[6]; + Object contentStream; +}; + +//------------------------------------------------------------------------ +// GfxShadingPattern +//------------------------------------------------------------------------ + +class GfxShadingPattern: public GfxPattern { +public: + + static GfxShadingPattern *parse(Object *patObj); + virtual ~GfxShadingPattern(); + + virtual GfxPattern *copy(); + + GfxShading *getShading() { return shading; } + double *getMatrix() { return matrix; } + +private: + + GfxShadingPattern(GfxShading *shadingA, double *matrixA); + + GfxShading *shading; + double matrix[6]; +}; + +//------------------------------------------------------------------------ +// GfxShading +//------------------------------------------------------------------------ + +class GfxShading { +public: + + GfxShading(int typeA); + GfxShading(GfxShading *shading); + virtual ~GfxShading(); + + static GfxShading *parse(Object *obj); + + virtual GfxShading *copy() = 0; + + int getType() { return type; } + GfxColorSpace *getColorSpace() { return colorSpace; } + GfxColor *getBackground() { return &background; } + GBool getHasBackground() { return hasBackground; } + void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + GBool getHasBBox() { return hasBBox; } + +protected: + + GBool init(Dict *dict); + + int type; + GfxColorSpace *colorSpace; + GfxColor background; + GBool hasBackground; + double xMin, yMin, xMax, yMax; + GBool hasBBox; +}; + +//------------------------------------------------------------------------ +// GfxFunctionShading +//------------------------------------------------------------------------ + +class GfxFunctionShading: public GfxShading { +public: + + GfxFunctionShading(double x0A, double y0A, + double x1A, double y1A, + double *matrixA, + Function **funcsA, int nFuncsA); + GfxFunctionShading(GfxFunctionShading *shading); + virtual ~GfxFunctionShading(); + + static GfxFunctionShading *parse(Dict *dict); + + virtual GfxShading *copy(); + + void getDomain(double *x0A, double *y0A, double *x1A, double *y1A) + { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; } + double *getMatrix() { return matrix; } + int getNFuncs() { return nFuncs; } + Function *getFunc(int i) { return funcs[i]; } + void getColor(double x, double y, GfxColor *color); + +private: + + double x0, y0, x1, y1; + double matrix[6]; + Function *funcs[gfxColorMaxComps]; + int nFuncs; +}; + +//------------------------------------------------------------------------ +// GfxAxialShading +//------------------------------------------------------------------------ + +class GfxAxialShading: public GfxShading { +public: + + GfxAxialShading(double x0A, double y0A, + double x1A, double y1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A); + GfxAxialShading(GfxAxialShading *shading); + virtual ~GfxAxialShading(); + + static GfxAxialShading *parse(Dict *dict); + + virtual GfxShading *copy(); + + void getCoords(double *x0A, double *y0A, double *x1A, double *y1A) + { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; } + double getDomain0() { return t0; } + double getDomain1() { return t1; } + GBool getExtend0() { return extend0; } + GBool getExtend1() { return extend1; } + int getNFuncs() { return nFuncs; } + Function *getFunc(int i) { return funcs[i]; } + void getColor(double t, GfxColor *color); + +private: + + double x0, y0, x1, y1; + double t0, t1; + Function *funcs[gfxColorMaxComps]; + int nFuncs; + GBool extend0, extend1; +}; + +//------------------------------------------------------------------------ +// GfxRadialShading +//------------------------------------------------------------------------ + +class GfxRadialShading: public GfxShading { +public: + + GfxRadialShading(double x0A, double y0A, double r0A, + double x1A, double y1A, double r1A, + double t0A, double t1A, + Function **funcsA, int nFuncsA, + GBool extend0A, GBool extend1A); + GfxRadialShading(GfxRadialShading *shading); + virtual ~GfxRadialShading(); + + static GfxRadialShading *parse(Dict *dict); + + virtual GfxShading *copy(); + + void getCoords(double *x0A, double *y0A, double *r0A, + double *x1A, double *y1A, double *r1A) + { *x0A = x0; *y0A = y0; *r0A = r0; *x1A = x1; *y1A = y1; *r1A = r1; } + double getDomain0() { return t0; } + double getDomain1() { return t1; } + GBool getExtend0() { return extend0; } + GBool getExtend1() { return extend1; } + int getNFuncs() { return nFuncs; } + Function *getFunc(int i) { return funcs[i]; } + void getColor(double t, GfxColor *color); + +private: + + double x0, y0, r0, x1, y1, r1; + double t0, t1; + Function *funcs[gfxColorMaxComps]; + int nFuncs; + GBool extend0, extend1; +}; + +//------------------------------------------------------------------------ +// GfxGouraudTriangleShading +//------------------------------------------------------------------------ + +struct GfxGouraudVertex { + double x, y; + GfxColor color; +}; + +class GfxGouraudTriangleShading: public GfxShading { +public: + + GfxGouraudTriangleShading(int typeA, + GfxGouraudVertex *verticesA, int nVerticesA, + int (*trianglesA)[3], int nTrianglesA, + Function **funcsA, int nFuncsA); + GfxGouraudTriangleShading(GfxGouraudTriangleShading *shading); + virtual ~GfxGouraudTriangleShading(); + + static GfxGouraudTriangleShading *parse(int typeA, Dict *dict, Stream *str); + + virtual GfxShading *copy(); + + int getNTriangles() { return nTriangles; } + void getTriangle(int i, double *x0, double *y0, GfxColor *color0, + double *x1, double *y1, GfxColor *color1, + double *x2, double *y2, GfxColor *color2); + +private: + + GfxGouraudVertex *vertices; + int nVertices; + int (*triangles)[3]; + int nTriangles; + Function *funcs[gfxColorMaxComps]; + int nFuncs; +}; + +//------------------------------------------------------------------------ +// GfxPatchMeshShading +//------------------------------------------------------------------------ + +struct GfxPatch { + double x[4][4]; + double y[4][4]; + GfxColor color[2][2]; +}; + +class GfxPatchMeshShading: public GfxShading { +public: + + GfxPatchMeshShading(int typeA, GfxPatch *patchesA, int nPatchesA, + Function **funcsA, int nFuncsA); + GfxPatchMeshShading(GfxPatchMeshShading *shading); + virtual ~GfxPatchMeshShading(); + + static GfxPatchMeshShading *parse(int typeA, Dict *dict, Stream *str); + + virtual GfxShading *copy(); + + int getNPatches() { return nPatches; } + GfxPatch *getPatch(int i) { return &patches[i]; } + +private: + + GfxPatch *patches; + int nPatches; + Function *funcs[gfxColorMaxComps]; + int nFuncs; +}; + +//------------------------------------------------------------------------ +// GfxImageColorMap +//------------------------------------------------------------------------ + +class GfxImageColorMap { +public: + + // Constructor. + GfxImageColorMap(int bitsA, Object *decode, GfxColorSpace *colorSpaceA); + + // Destructor. + ~GfxImageColorMap(); + + // Return a copy of this color map. + GfxImageColorMap *copy() { return new GfxImageColorMap(this); } + + // Is color map valid? + GBool isOk() { return ok; } + + // Get the color space. + GfxColorSpace *getColorSpace() { return colorSpace; } + + // Get stream decoding info. + int getNumPixelComps() { return nComps; } + int getBits() { return bits; } + + // Get decode table. + double getDecodeLow(int i) { return decodeLow[i]; } + double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; } + + // Convert an image pixel to a color. + void getGray(Guchar *x, GfxGray *gray); + void getRGB(Guchar *x, GfxRGB *rgb); + void getCMYK(Guchar *x, GfxCMYK *cmyk); + void getColor(Guchar *x, GfxColor *color); + +private: + + GfxImageColorMap(GfxImageColorMap *colorMap); + + GfxColorSpace *colorSpace; // the image color space + int bits; // bits per component + int nComps; // number of components in a pixel + GfxColorSpace *colorSpace2; // secondary color space + int nComps2; // number of components in colorSpace2 + GfxColorComp * // lookup table + lookup[gfxColorMaxComps]; + double // minimum values for each component + decodeLow[gfxColorMaxComps]; + double // max - min value for each component + decodeRange[gfxColorMaxComps]; + GBool ok; +}; + +//------------------------------------------------------------------------ +// GfxSubpath and GfxPath +//------------------------------------------------------------------------ + +class GfxSubpath { +public: + + // Constructor. + GfxSubpath(double x1, double y1); + + // Destructor. + ~GfxSubpath(); + + // Copy. + GfxSubpath *copy() { return new GfxSubpath(this); } + + // Get points. + int getNumPoints() { return n; } + double getX(int i) { return x[i]; } + double getY(int i) { return y[i]; } + GBool getCurve(int i) { return curve[i]; } + + // Get last point. + double getLastX() { return x[n-1]; } + double getLastY() { return y[n-1]; } + + // Add a line segment. + void lineTo(double x1, double y1); + + // Add a Bezier curve. + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + + // Close the subpath. + void close(); + GBool isClosed() { return closed; } + + // Add (, ) to each point in the subpath. + void offset(double dx, double dy); + +private: + + double *x, *y; // points + GBool *curve; // curve[i] => point i is a control point + // for a Bezier curve + int n; // number of points + int size; // size of x/y arrays + GBool closed; // set if path is closed + + GfxSubpath(GfxSubpath *subpath); +}; + +class GfxPath { +public: + + // Constructor. + GfxPath(); + + // Destructor. + ~GfxPath(); + + // Copy. + GfxPath *copy() + { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); } + + // Is there a current point? + GBool isCurPt() { return n > 0 || justMoved; } + + // Is the path non-empty, i.e., is there at least one segment? + GBool isPath() { return n > 0; } + + // Get subpaths. + int getNumSubpaths() { return n; } + GfxSubpath *getSubpath(int i) { return subpaths[i]; } + + // Get last point on last subpath. + double getLastX() { return subpaths[n-1]->getLastX(); } + double getLastY() { return subpaths[n-1]->getLastY(); } + + // Move the current point. + void moveTo(double x, double y); + + // Add a segment to the last subpath. + void lineTo(double x, double y); + + // Add a Bezier curve to the last subpath + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3); + + // Close the last subpath. + void close(); + + // Append to . + void append(GfxPath *path); + + // Add (, ) to each point in the path. + void offset(double dx, double dy); + +private: + + GBool justMoved; // set if a new subpath was just started + double firstX, firstY; // first point in new subpath + GfxSubpath **subpaths; // subpaths + int n; // number of subpaths + int size; // size of subpaths array + + GfxPath(GBool justMoved1, double firstX1, double firstY1, + GfxSubpath **subpaths1, int n1, int size1); +}; + +//------------------------------------------------------------------------ +// GfxState +//------------------------------------------------------------------------ + +class GfxState { +public: + + // Construct a default GfxState, for a device with resolution + // x , page box , page rotation , and + // coordinate system specified by . + GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox, + int rotateA, GBool upsideDown); + + // Destructor. + ~GfxState(); + + // Copy. + GfxState *copy() { return new GfxState(this); } + + // Accessors. + double getHDPI() { return hDPI; } + double getVDPI() { return vDPI; } + double *getCTM() { return ctm; } + double getX1() { return px1; } + double getY1() { return py1; } + double getX2() { return px2; } + double getY2() { return py2; } + double getPageWidth() { return pageWidth; } + double getPageHeight() { return pageHeight; } + int getRotate() { return rotate; } + GfxColor *getFillColor() { return &fillColor; } + GfxColor *getStrokeColor() { return &strokeColor; } + void getFillGray(GfxGray *gray) + { fillColorSpace->getGray(&fillColor, gray); } + void getStrokeGray(GfxGray *gray) + { strokeColorSpace->getGray(&strokeColor, gray); } + void getFillRGB(GfxRGB *rgb) + { fillColorSpace->getRGB(&fillColor, rgb); } + void getStrokeRGB(GfxRGB *rgb) + { strokeColorSpace->getRGB(&strokeColor, rgb); } + void getFillCMYK(GfxCMYK *cmyk) + { fillColorSpace->getCMYK(&fillColor, cmyk); } + void getStrokeCMYK(GfxCMYK *cmyk) + { strokeColorSpace->getCMYK(&strokeColor, cmyk); } + GfxColorSpace *getFillColorSpace() { return fillColorSpace; } + GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; } + GfxPattern *getFillPattern() { return fillPattern; } + GfxPattern *getStrokePattern() { return strokePattern; } + GfxBlendMode getBlendMode() { return blendMode; } + double getFillOpacity() { return fillOpacity; } + double getStrokeOpacity() { return strokeOpacity; } + GBool getFillOverprint() { return fillOverprint; } + GBool getStrokeOverprint() { return strokeOverprint; } + Function **getTransfer() { return transfer; } + double getLineWidth() { return lineWidth; } + void getLineDash(double **dash, int *length, double *start) + { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; } + int getFlatness() { return flatness; } + int getLineJoin() { return lineJoin; } + int getLineCap() { return lineCap; } + double getMiterLimit() { return miterLimit; } + GBool getStrokeAdjust() { return strokeAdjust; } + GfxFont *getFont() { return font; } + double getFontSize() { return fontSize; } + double *getTextMat() { return textMat; } + double getCharSpace() { return charSpace; } + double getWordSpace() { return wordSpace; } + double getHorizScaling() { return horizScaling; } + double getLeading() { return leading; } + double getRise() { return rise; } + int getRender() { return render; } + GfxPath *getPath() { return path; } + void setPath(GfxPath *pathA); + double getCurX() { return curX; } + double getCurY() { return curY; } + void getClipBBox(double *xMin, double *yMin, double *xMax, double *yMax) + { *xMin = clipXMin; *yMin = clipYMin; *xMax = clipXMax; *yMax = clipYMax; } + void getUserClipBBox(double *xMin, double *yMin, double *xMax, double *yMax); + double getLineX() { return lineX; } + double getLineY() { return lineY; } + + // Is there a current point/path? + GBool isCurPt() { return path->isCurPt(); } + GBool isPath() { return path->isPath(); } + + // Transforms. + void transform(double x1, double y1, double *x2, double *y2) + { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4]; + *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; } + void transformDelta(double x1, double y1, double *x2, double *y2) + { *x2 = ctm[0] * x1 + ctm[2] * y1; + *y2 = ctm[1] * x1 + ctm[3] * y1; } + void textTransform(double x1, double y1, double *x2, double *y2) + { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4]; + *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; } + void textTransformDelta(double x1, double y1, double *x2, double *y2) + { *x2 = textMat[0] * x1 + textMat[2] * y1; + *y2 = textMat[1] * x1 + textMat[3] * y1; } + double transformWidth(double w); + double getTransformedLineWidth() + { return transformWidth(lineWidth); } + double getTransformedFontSize(); + void getFontTransMat(double *m11, double *m12, double *m21, double *m22); + + // Change state parameters. + void setCTM(double a, double b, double c, + double d, double e, double f); + void concatCTM(double a, double b, double c, + double d, double e, double f); + void shiftCTM(double tx, double ty); + void setFillColorSpace(GfxColorSpace *colorSpace); + void setStrokeColorSpace(GfxColorSpace *colorSpace); + void setFillColor(GfxColor *color) { fillColor = *color; } + void setStrokeColor(GfxColor *color) { strokeColor = *color; } + void setFillPattern(GfxPattern *pattern); + void setStrokePattern(GfxPattern *pattern); + void setBlendMode(GfxBlendMode mode) { blendMode = mode; } + void setFillOpacity(double opac) { fillOpacity = opac; } + void setStrokeOpacity(double opac) { strokeOpacity = opac; } + void setFillOverprint(GBool op) { fillOverprint = op; } + void setStrokeOverprint(GBool op) { strokeOverprint = op; } + void setTransfer(Function **funcs); + void setLineWidth(double width) { lineWidth = width; } + void setLineDash(double *dash, int length, double start); + void setFlatness(int flatness1) { flatness = flatness1; } + void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; } + void setLineCap(int lineCap1) { lineCap = lineCap1; } + void setMiterLimit(double limit) { miterLimit = limit; } + void setStrokeAdjust(GBool sa) { strokeAdjust = sa; } + void setFont(GfxFont *fontA, double fontSizeA) + { font = fontA; fontSize = fontSizeA; } + void setTextMat(double a, double b, double c, + double d, double e, double f) + { textMat[0] = a; textMat[1] = b; textMat[2] = c; + textMat[3] = d; textMat[4] = e; textMat[5] = f; } + void setCharSpace(double space) + { charSpace = space; } + void setWordSpace(double space) + { wordSpace = space; } + void setHorizScaling(double scale) + { horizScaling = 0.01 * scale; } + void setLeading(double leadingA) + { leading = leadingA; } + void setRise(double riseA) + { rise = riseA; } + void setRender(int renderA) + { render = renderA; } + + // Add to path. + void moveTo(double x, double y) + { path->moveTo(curX = x, curY = y); } + void lineTo(double x, double y) + { path->lineTo(curX = x, curY = y); } + void curveTo(double x1, double y1, double x2, double y2, + double x3, double y3) + { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); } + void closePath() + { path->close(); curX = path->getLastX(); curY = path->getLastY(); } + void clearPath(); + + // Update clip region. + void clip(); + void clipToStrokePath(); + + // Text position. + void textSetPos(double tx, double ty) { lineX = tx; lineY = ty; } + void textMoveTo(double tx, double ty) + { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); } + void textShift(double tx, double ty); + void shift(double dx, double dy); + + // Push/pop GfxState on/off stack. + GfxState *save(); + GfxState *restore(); + GBool hasSaves() { return saved != NULL; } + + // Misc + GBool parseBlendMode(Object *obj, GfxBlendMode *mode); + +private: + + double hDPI, vDPI; // resolution + double ctm[6]; // coord transform matrix + double px1, py1, px2, py2; // page corners (user coords) + double pageWidth, pageHeight; // page size (pixels) + int rotate; // page rotation angle + + GfxColorSpace *fillColorSpace; // fill color space + GfxColorSpace *strokeColorSpace; // stroke color space + GfxColor fillColor; // fill color + GfxColor strokeColor; // stroke color + GfxPattern *fillPattern; // fill pattern + GfxPattern *strokePattern; // stroke pattern + GfxBlendMode blendMode; // transparency blend mode + double fillOpacity; // fill opacity + double strokeOpacity; // stroke opacity + GBool fillOverprint; // fill overprint + GBool strokeOverprint; // stroke overprint + Function *transfer[4]; // transfer function (entries may be: all + // NULL = identity; last three NULL = + // single function; all four non-NULL = + // R,G,B,gray functions) + + double lineWidth; // line width + double *lineDash; // line dash + int lineDashLength; + double lineDashStart; + int flatness; // curve flatness + int lineJoin; // line join style + int lineCap; // line cap style + double miterLimit; // line miter limit + GBool strokeAdjust; // stroke adjustment + + GfxFont *font; // font + double fontSize; // font size + double textMat[6]; // text matrix + double charSpace; // character spacing + double wordSpace; // word spacing + double horizScaling; // horizontal scaling + double leading; // text leading + double rise; // text rise + int render; // text rendering mode + + GfxPath *path; // array of path elements + double curX, curY; // current point (user coords) + double lineX, lineY; // start of current text line (text coords) + + double clipXMin, clipYMin, // bounding box for clip region + clipXMax, clipYMax; + + GfxState *saved; // next GfxState on stack + + GfxState(GfxState *state); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc new file mode 100644 index 000000000..faf700c46 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc @@ -0,0 +1,2980 @@ +//======================================================================== +// +// GlobalParams.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#ifdef ENABLE_PLUGINS +# ifndef WIN32 +# include +# endif +#endif +#ifdef WIN32 +# include +#endif +#if HAVE_PAPER_H +#include +#endif +#include "gmem.h" +#include "GString.h" +#include "GList.h" +#include "GHash.h" +#include "gfile.h" +#include "Error.h" +#include "NameToCharCode.h" +#include "CharCodeToUnicode.h" +#include "UnicodeMap.h" +#include "CMap.h" +#include "BuiltinFontTables.h" +#include "FontEncodingTables.h" +#ifdef ENABLE_PLUGINS +# include "XpdfPluginAPI.h" +#endif +#include "GlobalParams.h" + +#ifdef WIN32 +# define strcasecmp stricmp +#endif + +#if MULTITHREADED +# define lockGlobalParams gLockMutex(&mutex) +# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex) +# define lockCMapCache gLockMutex(&cMapCacheMutex) +# define unlockGlobalParams gUnlockMutex(&mutex) +# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex) +# define unlockCMapCache gUnlockMutex(&cMapCacheMutex) +#else +# define lockGlobalParams +# define lockUnicodeMapCache +# define lockCMapCache +# define unlockGlobalParams +# define unlockUnicodeMapCache +# define unlockCMapCache +#endif + +#include "NameToUnicodeTable.h" +#include "UnicodeMapTables.h" +#include "UTF8.h" + +#ifdef ENABLE_PLUGINS +# ifdef WIN32 +extern XpdfPluginVecTable xpdfPluginVecTable; +# endif +#endif + +//------------------------------------------------------------------------ + +#define cidToUnicodeCacheSize 4 +#define unicodeToUnicodeCacheSize 4 + +//------------------------------------------------------------------------ + +static struct { + char *name; + char *t1FileName; + char *ttFileName; +} displayFontTab[] = { + {"Courier", "n022003l.pfb", "cour.ttf"}, + {"Courier-Bold", "n022004l.pfb", "courbd.ttf"}, + {"Courier-BoldOblique", "n022024l.pfb", "courbi.ttf"}, + {"Courier-Oblique", "n022023l.pfb", "couri.ttf"}, + {"Helvetica", "n019003l.pfb", "arial.ttf"}, + {"Helvetica-Bold", "n019004l.pfb", "arialbd.ttf"}, + {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf"}, + {"Helvetica-Oblique", "n019023l.pfb", "ariali.ttf"}, + {"Symbol", "s050000l.pfb", NULL}, + {"Times-Bold", "n021004l.pfb", "timesbd.ttf"}, + {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf"}, + {"Times-Italic", "n021023l.pfb", "timesi.ttf"}, + {"Times-Roman", "n021003l.pfb", "times.ttf"}, + {"ZapfDingbats", "d050000l.pfb", NULL}, + {NULL} +}; + +#ifdef WIN32 +static char *displayFontDirs[] = { + "c:/windows/fonts", + "c:/winnt/fonts", + NULL +}; +#else +static char *displayFontDirs[] = { + "/usr/share/ghostscript/fonts", + "/usr/local/share/ghostscript/fonts", + "/usr/share/fonts/default/Type1", + "/usr/share/fonts/default/ghostscript", + "/usr/share/fonts/type1/gsfonts", + NULL +}; +#endif + +//------------------------------------------------------------------------ + +GlobalParams *globalParams = NULL; + +//------------------------------------------------------------------------ +// DisplayFontParam +//------------------------------------------------------------------------ + +DisplayFontParam::DisplayFontParam(GString *nameA, + DisplayFontParamKind kindA) { + name = nameA; + kind = kindA; + switch (kind) { + case displayFontT1: + t1.fileName = NULL; + break; + case displayFontTT: + tt.fileName = NULL; + break; + } +} + +DisplayFontParam::~DisplayFontParam() { + delete name; + switch (kind) { + case displayFontT1: + if (t1.fileName) { + delete t1.fileName; + } + break; + case displayFontTT: + if (tt.fileName) { + delete tt.fileName; + } + break; + } +} + +#ifdef WIN32 + +//------------------------------------------------------------------------ +// WinFontInfo +//------------------------------------------------------------------------ + +class WinFontInfo: public DisplayFontParam { +public: + + GBool bold, italic; + + static WinFontInfo *make(GString *nameA, GBool boldA, GBool italicA, + HKEY regKey, char *winFontDir); + WinFontInfo(GString *nameA, GBool boldA, GBool italicA, + GString *fileNameA); + virtual ~WinFontInfo(); + GBool equals(WinFontInfo *fi); +}; + +WinFontInfo *WinFontInfo::make(GString *nameA, GBool boldA, GBool italicA, + HKEY regKey, char *winFontDir) { + GString *regName; + GString *fileNameA; + char buf[MAX_PATH]; + DWORD n; + char c; + int i; + + //----- find the font file + fileNameA = NULL; + regName = nameA->copy(); + if (boldA) { + regName->append(" Bold"); + } + if (italicA) { + regName->append(" Italic"); + } + regName->append(" (TrueType)"); + n = sizeof(buf); + if (RegQueryValueEx(regKey, regName->getCString(), NULL, NULL, + (LPBYTE)buf, &n) == ERROR_SUCCESS) { + fileNameA = new GString(winFontDir); + fileNameA->append('\\')->append(buf); + } + delete regName; + if (!fileNameA) { + delete nameA; + return NULL; + } + + //----- normalize the font name + i = 0; + while (i < nameA->getLength()) { + c = nameA->getChar(i); + if (c == ' ' || c == ',' || c == '-') { + nameA->del(i); + } else { + ++i; + } + } + + return new WinFontInfo(nameA, boldA, italicA, fileNameA); +} + +WinFontInfo::WinFontInfo(GString *nameA, GBool boldA, GBool italicA, + GString *fileNameA): + DisplayFontParam(nameA, displayFontTT) +{ + bold = boldA; + italic = italicA; + tt.fileName = fileNameA; +} + +WinFontInfo::~WinFontInfo() { +} + +GBool WinFontInfo::equals(WinFontInfo *fi) { + return !name->cmp(fi->name) && bold == fi->bold && italic == fi->italic; +} + +//------------------------------------------------------------------------ +// WinFontList +//------------------------------------------------------------------------ + +class WinFontList { +public: + + WinFontList(char *winFontDirA); + ~WinFontList(); + WinFontInfo *find(GString *font); + +private: + + void add(WinFontInfo *fi); + static int CALLBACK enumFunc1(CONST LOGFONT *font, + CONST TEXTMETRIC *metrics, + DWORD type, LPARAM data); + static int CALLBACK enumFunc2(CONST LOGFONT *font, + CONST TEXTMETRIC *metrics, + DWORD type, LPARAM data); + + GList *fonts; // [WinFontInfo] + HDC dc; // (only used during enumeration) + HKEY regKey; // (only used during enumeration) + char *winFontDir; // (only used during enumeration) +}; + +WinFontList::WinFontList(char *winFontDirA) { + OSVERSIONINFO version; + char *path; + + fonts = new GList(); + dc = GetDC(NULL); + winFontDir = winFontDirA; + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\\"; + } else { + path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts\\"; + } + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, + KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, + ®Key) == ERROR_SUCCESS) { + EnumFonts(dc, NULL, &WinFontList::enumFunc1, (LPARAM)this); + RegCloseKey(regKey); + } + ReleaseDC(NULL, dc); +} + +WinFontList::~WinFontList() { + deleteGList(fonts, WinFontInfo); +} + +void WinFontList::add(WinFontInfo *fi) { + int i; + + for (i = 0; i < fonts->getLength(); ++i) { + if (((WinFontInfo *)fonts->get(i))->equals(fi)) { + delete fi; + return; + } + } + fonts->append(fi); +} + +WinFontInfo *WinFontList::find(GString *font) { + GString *name; + GBool bold, italic; + WinFontInfo *fi; + char c; + int n, i; + + name = font->copy(); + + // remove space, comma, dash chars + i = 0; + while (i < name->getLength()) { + c = name->getChar(i); + if (c == ' ' || c == ',' || c == '-') { + name->del(i); + } else { + ++i; + } + } + n = name->getLength(); + + // remove trailing "MT" (Foo-MT, Foo-BoldMT, etc.) + if (!strcmp(name->getCString() + n - 2, "MT")) { + name->del(n - 2, 2); + n -= 2; + } + + // look for "Italic" + if (!strcmp(name->getCString() + n - 6, "Italic")) { + name->del(n - 6, 6); + italic = gTrue; + n -= 6; + } else { + italic = gFalse; + } + + // look for "Bold" + if (!strcmp(name->getCString() + n - 4, "Bold")) { + name->del(n - 4, 4); + bold = gTrue; + n -= 4; + } else { + bold = gFalse; + } + + // remove trailing "MT" (FooMT-Bold, etc.) + if (!strcmp(name->getCString() + n - 2, "MT")) { + name->del(n - 2, 2); + n -= 2; + } + + // remove trailing "PS" + if (!strcmp(name->getCString() + n - 2, "PS")) { + name->del(n - 2, 2); + n -= 2; + } + + // search for the font + fi = NULL; + for (i = 0; i < fonts->getLength(); ++i) { + fi = (WinFontInfo *)fonts->get(i); + if (!fi->name->cmp(name) && fi->bold == bold && fi->italic == italic) { + break; + } + fi = NULL; + } + + delete name; + return fi; +} + +int CALLBACK WinFontList::enumFunc1(CONST LOGFONT *font, + CONST TEXTMETRIC *metrics, + DWORD type, LPARAM data) { + WinFontList *fl = (WinFontList *)data; + + EnumFonts(fl->dc, font->lfFaceName, &WinFontList::enumFunc2, (LPARAM)fl); + return 1; +} + +int CALLBACK WinFontList::enumFunc2(CONST LOGFONT *font, + CONST TEXTMETRIC *metrics, + DWORD type, LPARAM data) { + WinFontList *fl = (WinFontList *)data; + WinFontInfo *fi; + + if (type & TRUETYPE_FONTTYPE) { + if ((fi = WinFontInfo::make(new GString(font->lfFaceName), + font->lfWeight >= 600, + font->lfItalic ? gTrue : gFalse, + fl->regKey, fl->winFontDir))) { + fl->add(fi); + } + } + return 1; +} + +#endif // WIN32 + +//------------------------------------------------------------------------ +// PSFontParam +//------------------------------------------------------------------------ + +PSFontParam::PSFontParam(GString *pdfFontNameA, int wModeA, + GString *psFontNameA, GString *encodingA) { + pdfFontName = pdfFontNameA; + wMode = wModeA; + psFontName = psFontNameA; + encoding = encodingA; +} + +PSFontParam::~PSFontParam() { + delete pdfFontName; + delete psFontName; + if (encoding) { + delete encoding; + } +} + +//------------------------------------------------------------------------ +// KeyBinding +//------------------------------------------------------------------------ + +KeyBinding::KeyBinding(int codeA, int modsA, int contextA, char *cmd0) { + code = codeA; + mods = modsA; + context = contextA; + cmds = new GList(); + cmds->append(new GString(cmd0)); +} + +KeyBinding::KeyBinding(int codeA, int modsA, int contextA, + char *cmd0, char *cmd1) { + code = codeA; + mods = modsA; + context = contextA; + cmds = new GList(); + cmds->append(new GString(cmd0)); + cmds->append(new GString(cmd1)); +} + +KeyBinding::KeyBinding(int codeA, int modsA, int contextA, GList *cmdsA) { + code = codeA; + mods = modsA; + context = contextA; + cmds = cmdsA; +} + +KeyBinding::~KeyBinding() { + deleteGList(cmds, GString); +} + +#ifdef ENABLE_PLUGINS +//------------------------------------------------------------------------ +// Plugin +//------------------------------------------------------------------------ + +class Plugin { +public: + + static Plugin *load(char *type, char *name); + ~Plugin(); + +private: + +#ifdef WIN32 + Plugin(HMODULE libA); + HMODULE lib; +#else + Plugin(void *dlA); + void *dl; +#endif +}; + +Plugin *Plugin::load(char *type, char *name) { + GString *path; + Plugin *plugin; + XpdfPluginVecTable *vt; + XpdfBool (*xpdfInitPlugin)(void); +#ifdef WIN32 + HMODULE libA; +#else + void *dlA; +#endif + + path = globalParams->getBaseDir(); + appendToPath(path, "plugins"); + appendToPath(path, type); + appendToPath(path, name); + +#ifdef WIN32 + path->append(".dll"); + if (!(libA = LoadLibrary(path->getCString()))) { + error(-1, "Failed to load plugin '%s'", + path->getCString()); + goto err1; + } + if (!(vt = (XpdfPluginVecTable *) + GetProcAddress(libA, "xpdfPluginVecTable"))) { + error(-1, "Failed to find xpdfPluginVecTable in plugin '%s'", + path->getCString()); + goto err2; + } +#else + //~ need to deal with other extensions here + path->append(".so"); + if (!(dlA = dlopen(path->getCString(), RTLD_NOW))) { + error(-1, "Failed to load plugin '%s': %s", + path->getCString(), dlerror()); + goto err1; + } + if (!(vt = (XpdfPluginVecTable *)dlsym(dlA, "xpdfPluginVecTable"))) { + error(-1, "Failed to find xpdfPluginVecTable in plugin '%s'", + path->getCString()); + goto err2; + } +#endif + + if (vt->version != xpdfPluginVecTable.version) { + error(-1, "Plugin '%s' is wrong version", path->getCString()); + goto err2; + } + memcpy(vt, &xpdfPluginVecTable, sizeof(xpdfPluginVecTable)); + +#ifdef WIN32 + if (!(xpdfInitPlugin = (XpdfBool (*)(void)) + GetProcAddress(libA, "xpdfInitPlugin"))) { + error(-1, "Failed to find xpdfInitPlugin in plugin '%s'", + path->getCString()); + goto err2; + } +#else + if (!(xpdfInitPlugin = (XpdfBool (*)(void))dlsym(dlA, "xpdfInitPlugin"))) { + error(-1, "Failed to find xpdfInitPlugin in plugin '%s'", + path->getCString()); + goto err2; + } +#endif + + if (!(*xpdfInitPlugin)()) { + error(-1, "Initialization of plugin '%s' failed", + path->getCString()); + goto err2; + } + +#ifdef WIN32 + plugin = new Plugin(libA); +#else + plugin = new Plugin(dlA); +#endif + + delete path; + return plugin; + + err2: +#ifdef WIN32 + FreeLibrary(libA); +#else + dlclose(dlA); +#endif + err1: + delete path; + return NULL; +} + +#ifdef WIN32 +Plugin::Plugin(HMODULE libA) { + lib = libA; +} +#else +Plugin::Plugin(void *dlA) { + dl = dlA; +} +#endif + +Plugin::~Plugin() { + void (*xpdfFreePlugin)(void); + +#ifdef WIN32 + if ((xpdfFreePlugin = (void (*)(void)) + GetProcAddress(lib, "xpdfFreePlugin"))) { + (*xpdfFreePlugin)(); + } + FreeLibrary(lib); +#else + if ((xpdfFreePlugin = (void (*)(void))dlsym(dl, "xpdfFreePlugin"))) { + (*xpdfFreePlugin)(); + } + dlclose(dl); +#endif +} + +#endif // ENABLE_PLUGINS + +//------------------------------------------------------------------------ +// parsing +//------------------------------------------------------------------------ + +GlobalParams::GlobalParams(char *cfgFileName) { + UnicodeMap *map; + GString *fileName; + FILE *f; + int i; + +#if MULTITHREADED + gInitMutex(&mutex); + gInitMutex(&unicodeMapCacheMutex); + gInitMutex(&cMapCacheMutex); +#endif + + initBuiltinFontTables(); + + // scan the encoding in reverse because we want the lowest-numbered + // index for each char name ('space' is encoded twice) + macRomanReverseMap = new NameToCharCode(); + for (i = 255; i >= 0; --i) { + if (macRomanEncoding[i]) { + macRomanReverseMap->add(macRomanEncoding[i], (CharCode)i); + } + } + +#ifdef WIN32 + // baseDir will be set by a call to setBaseDir + baseDir = new GString(); +#else + baseDir = appendToPath(getHomeDir(), ".xpdf"); +#endif + nameToUnicode = new NameToCharCode(); + cidToUnicodes = new GHash(gTrue); + unicodeToUnicodes = new GHash(gTrue); + residentUnicodeMaps = new GHash(); + unicodeMaps = new GHash(gTrue); + cMapDirs = new GHash(gTrue); + toUnicodeDirs = new GList(); + displayFonts = new GHash(); + displayCIDFonts = new GHash(); + displayNamedCIDFonts = new GHash(); +#if HAVE_PAPER_H + char *paperName; + const struct paper *paperType; + paperinit(); + if ((paperName = systempapername())) { + paperType = paperinfo(paperName); + psPaperWidth = (int)paperpswidth(paperType); + psPaperHeight = (int)paperpsheight(paperType); + } else { + error(-1, "No paper information available - using defaults"); + psPaperWidth = defPaperWidth; + psPaperHeight = defPaperHeight; + } + paperdone(); +#else + psPaperWidth = defPaperWidth; + psPaperHeight = defPaperHeight; +#endif + psImageableLLX = psImageableLLY = 0; + psImageableURX = psPaperWidth; + psImageableURY = psPaperHeight; + psCrop = gTrue; + psExpandSmaller = gFalse; + psShrinkLarger = gTrue; + psCenter = gTrue; + psDuplex = gFalse; + psLevel = psLevel2; + psFile = NULL; + psFonts = new GHash(); + psNamedFonts16 = new GList(); + psFonts16 = new GList(); + psEmbedType1 = gTrue; + psEmbedTrueType = gTrue; + psEmbedCIDPostScript = gTrue; + psEmbedCIDTrueType = gTrue; + psPreload = gFalse; + psOPI = gFalse; + psASCIIHex = gFalse; + textEncoding = new GString("Latin1"); +#if defined(WIN32) + textEOL = eolDOS; +#elif defined(MACOS) + textEOL = eolMac; +#else + textEOL = eolUnix; +#endif + textPageBreaks = gTrue; + textKeepTinyChars = gFalse; + fontDirs = new GList(); + initialZoom = new GString("125"); + continuousView = gFalse; + enableT1lib = gTrue; + enableFreeType = gTrue; + antialias = gTrue; + vectorAntialias = gTrue; + strokeAdjust = gTrue; + screenType = screenUnset; + screenSize = -1; + screenDotRadius = -1; + screenGamma = 1.0; + screenBlackThreshold = 0.0; + screenWhiteThreshold = 1.0; + urlCommand = NULL; + movieCommand = NULL; + mapNumericCharNames = gTrue; + mapUnknownCharNames = gFalse; + createDefaultKeyBindings(); + printCommands = gFalse; + errQuiet = gFalse; + + cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize); + unicodeToUnicodeCache = + new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize); + unicodeMapCache = new UnicodeMapCache(); + cMapCache = new CMapCache(); + +#ifdef WIN32 + winFontList = NULL; +#endif + +#ifdef ENABLE_PLUGINS + plugins = new GList(); + securityHandlers = new GList(); +#endif + + // set up the initial nameToUnicode table + for (i = 0; nameToUnicodeTab[i].name; ++i) { + nameToUnicode->add(nameToUnicodeTab[i].name, nameToUnicodeTab[i].u); + } + + // set up the residentUnicodeMaps table + map = new UnicodeMap("Latin1", gFalse, + latin1UnicodeMapRanges, latin1UnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("ASCII7", gFalse, + ascii7UnicodeMapRanges, ascii7UnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("Symbol", gFalse, + symbolUnicodeMapRanges, symbolUnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges, + zapfDingbatsUnicodeMapLen); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("UTF-8", gTrue, &mapUTF8); + residentUnicodeMaps->add(map->getEncodingName(), map); + map = new UnicodeMap("UCS-2", gTrue, &mapUCS2); + residentUnicodeMaps->add(map->getEncodingName(), map); + + // look for a user config file, then a system-wide config file + f = NULL; + fileName = NULL; + if (cfgFileName && cfgFileName[0]) { + fileName = new GString(cfgFileName); + if (!(f = fopen(fileName->getCString(), "r"))) { + delete fileName; + } + } + if (!f) { + fileName = appendToPath(getHomeDir(), xpdfUserConfigFile); + if (!(f = fopen(fileName->getCString(), "r"))) { + delete fileName; + } + } + if (!f) { +#if defined(WIN32) && !defined(__CYGWIN32__) + char buf[512]; + i = GetModuleFileName(NULL, buf, sizeof(buf)); + if (i <= 0 || i >= sizeof(buf)) { + // error or path too long for buffer - just use the current dir + buf[0] = '\0'; + } + fileName = grabPath(buf); + appendToPath(fileName, xpdfSysConfigFile); +#else + fileName = new GString(xpdfSysConfigFile); +#endif + if (!(f = fopen(fileName->getCString(), "r"))) { + delete fileName; + } + } + if (f) { + parseFile(fileName, f); + delete fileName; + fclose(f); + } +} + +void GlobalParams::createDefaultKeyBindings() { + keyBindings = new GList(); + + //----- mouse buttons + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress1, xpdfKeyModNone, + xpdfKeyContextAny, "startSelection")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMouseRelease1, xpdfKeyModNone, + xpdfKeyContextAny, "endSelection", + "followLinkNoSel")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress2, xpdfKeyModNone, + xpdfKeyContextAny, "startPan")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMouseRelease2, xpdfKeyModNone, + xpdfKeyContextAny, "endPan")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress3, xpdfKeyModNone, + xpdfKeyContextAny, "postPopupMenu")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress4, xpdfKeyModNone, + xpdfKeyContextAny, + "scrollUpPrevPage(16)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress5, xpdfKeyModNone, + xpdfKeyContextAny, + "scrollDownNextPage(16)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress6, xpdfKeyModNone, + xpdfKeyContextAny, "scrollLeft(16)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress7, xpdfKeyModNone, + xpdfKeyContextAny, "scrollRight(16)")); + + //----- keys + keyBindings->append(new KeyBinding(xpdfKeyCodeHome, xpdfKeyModCtrl, + xpdfKeyContextAny, "gotoPage(1)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeHome, xpdfKeyModNone, + xpdfKeyContextAny, "scrollToTopLeft")); + keyBindings->append(new KeyBinding(xpdfKeyCodeEnd, xpdfKeyModCtrl, + xpdfKeyContextAny, "gotoLastPage")); + keyBindings->append(new KeyBinding(xpdfKeyCodeEnd, xpdfKeyModNone, + xpdfKeyContextAny, + "scrollToBottomRight")); + keyBindings->append(new KeyBinding(xpdfKeyCodePgUp, xpdfKeyModNone, + xpdfKeyContextAny, "pageUp")); + keyBindings->append(new KeyBinding(xpdfKeyCodeBackspace, xpdfKeyModNone, + xpdfKeyContextAny, "pageUp")); + keyBindings->append(new KeyBinding(xpdfKeyCodeDelete, xpdfKeyModNone, + xpdfKeyContextAny, "pageUp")); + keyBindings->append(new KeyBinding(xpdfKeyCodePgDn, xpdfKeyModNone, + xpdfKeyContextAny, "pageDown")); + keyBindings->append(new KeyBinding(' ', xpdfKeyModNone, + xpdfKeyContextAny, "pageDown")); + keyBindings->append(new KeyBinding(xpdfKeyCodeLeft, xpdfKeyModNone, + xpdfKeyContextAny, "scrollLeft(16)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeRight, xpdfKeyModNone, + xpdfKeyContextAny, "scrollRight(16)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeUp, xpdfKeyModNone, + xpdfKeyContextAny, "scrollUp(16)")); + keyBindings->append(new KeyBinding(xpdfKeyCodeDown, xpdfKeyModNone, + xpdfKeyContextAny, "scrollDown(16)")); + keyBindings->append(new KeyBinding('o', xpdfKeyModNone, + xpdfKeyContextAny, "open")); + keyBindings->append(new KeyBinding('O', xpdfKeyModNone, + xpdfKeyContextAny, "open")); + keyBindings->append(new KeyBinding('r', xpdfKeyModNone, + xpdfKeyContextAny, "reload")); + keyBindings->append(new KeyBinding('R', xpdfKeyModNone, + xpdfKeyContextAny, "reload")); + keyBindings->append(new KeyBinding('f', xpdfKeyModNone, + xpdfKeyContextAny, "find")); + keyBindings->append(new KeyBinding('F', xpdfKeyModNone, + xpdfKeyContextAny, "find")); + keyBindings->append(new KeyBinding('f', xpdfKeyModCtrl, + xpdfKeyContextAny, "find")); + keyBindings->append(new KeyBinding('g', xpdfKeyModCtrl, + xpdfKeyContextAny, "findNext")); + keyBindings->append(new KeyBinding('p', xpdfKeyModCtrl, + xpdfKeyContextAny, "print")); + keyBindings->append(new KeyBinding('n', xpdfKeyModNone, + xpdfKeyContextScrLockOff, "nextPage")); + keyBindings->append(new KeyBinding('N', xpdfKeyModNone, + xpdfKeyContextScrLockOff, "nextPage")); + keyBindings->append(new KeyBinding('n', xpdfKeyModNone, + xpdfKeyContextScrLockOn, + "nextPageNoScroll")); + keyBindings->append(new KeyBinding('N', xpdfKeyModNone, + xpdfKeyContextScrLockOn, + "nextPageNoScroll")); + keyBindings->append(new KeyBinding('p', xpdfKeyModNone, + xpdfKeyContextScrLockOff, "prevPage")); + keyBindings->append(new KeyBinding('P', xpdfKeyModNone, + xpdfKeyContextScrLockOff, "prevPage")); + keyBindings->append(new KeyBinding('p', xpdfKeyModNone, + xpdfKeyContextScrLockOn, + "prevPageNoScroll")); + keyBindings->append(new KeyBinding('P', xpdfKeyModNone, + xpdfKeyContextScrLockOn, + "prevPageNoScroll")); + keyBindings->append(new KeyBinding('v', xpdfKeyModNone, + xpdfKeyContextAny, "goForward")); + keyBindings->append(new KeyBinding('b', xpdfKeyModNone, + xpdfKeyContextAny, "goBackward")); + keyBindings->append(new KeyBinding('g', xpdfKeyModNone, + xpdfKeyContextAny, "focusToPageNum")); + keyBindings->append(new KeyBinding('0', xpdfKeyModNone, + xpdfKeyContextAny, "zoomPercent(125)")); + keyBindings->append(new KeyBinding('+', xpdfKeyModNone, + xpdfKeyContextAny, "zoomIn")); + keyBindings->append(new KeyBinding('-', xpdfKeyModNone, + xpdfKeyContextAny, "zoomOut")); + keyBindings->append(new KeyBinding('z', xpdfKeyModNone, + xpdfKeyContextAny, "zoomFitPage")); + keyBindings->append(new KeyBinding('w', xpdfKeyModNone, + xpdfKeyContextAny, "zoomFitWidth")); + keyBindings->append(new KeyBinding('f', xpdfKeyModAlt, + xpdfKeyContextAny, + "toggleFullScreenMode")); + keyBindings->append(new KeyBinding('l', xpdfKeyModCtrl, + xpdfKeyContextAny, "redraw")); + keyBindings->append(new KeyBinding('w', xpdfKeyModCtrl, + xpdfKeyContextAny, "closeWindow")); + keyBindings->append(new KeyBinding('?', xpdfKeyModNone, + xpdfKeyContextAny, "about")); + keyBindings->append(new KeyBinding('q', xpdfKeyModNone, + xpdfKeyContextAny, "quit")); + keyBindings->append(new KeyBinding('Q', xpdfKeyModNone, + xpdfKeyContextAny, "quit")); +} + +void GlobalParams::parseFile(GString *fileName, FILE *f) { + int line; + char buf[512]; + + /* extract path */ + if(fileName) { + char* cfgFileName = fileName->getCString(); + char* pos1 = strrchr(cfgFileName, '/'); + char* pos2 = strrchr(cfgFileName, '\\'); + char* p = pos1>pos2?pos1:pos2; + int pos = p ? p-cfgFileName : -1; + GString*path = new GString(new GString(cfgFileName), 0, (pos < 0 ? strlen(cfgFileName): pos)); + if(pos1>=0) + path->append('/'); + else if(pos2>=0) + path->append('\\'); + else +#ifdef WIN32 + path->append('\\'); +#else + path->append('/'); +#endif + this->path = path; + } else { + this->path = new GString(); + } + + line = 1; + while (getLine(buf, sizeof(buf) - 1, f)) { + parseLine(buf, fileName, line); + ++line; + } +} + +void GlobalParams::parseLine(char *buf, GString *fileName, int line) { + GList *tokens; + GString *cmd, *incFile; + char *p1, *p2; + FILE *f2; + + // break the line into tokens + tokens = new GList(); + p1 = buf; + while (*p1) { + for (; *p1 && isspace(*p1); ++p1) ; + if (!*p1) { + break; + } + if (*p1 == '"' || *p1 == '\'') { + for (p2 = p1 + 1; *p2 && *p2 != *p1; ++p2) ; + ++p1; + } else { + for (p2 = p1 + 1; *p2 && !isspace(*p2); ++p2) ; + } + tokens->append(new GString(p1, p2 - p1)); + p1 = *p2 ? p2 + 1 : p2; + } + + // parse the line + if (tokens->getLength() > 0 && + ((GString *)tokens->get(0))->getChar(0) != '#') { + cmd = (GString *)tokens->get(0); + if (!cmd->cmp("include")) { + if (tokens->getLength() == 2) { + incFile = (GString *)tokens->get(1); + if ((f2 = fopen(incFile->getCString(), "r"))) { + parseFile(incFile, f2); + fclose(f2); + } else { + error(-1, "Couldn't find included config file: '%s' (%s:%d)", + incFile->getCString(), fileName->getCString(), line); + } + } else { + error(-1, "Bad 'include' config file command (%s:%d)", + fileName->getCString(), line); + } + } else if (!cmd->cmp("nameToUnicode")) { + parseNameToUnicode(tokens, fileName, line); + } else if (!cmd->cmp("cidToUnicode")) { + parseCIDToUnicode(tokens, fileName, line); + } else if (!cmd->cmp("unicodeToUnicode")) { + parseUnicodeToUnicode(tokens, fileName, line); + } else if (!cmd->cmp("unicodeMap")) { + parseUnicodeMap(tokens, fileName, line); + } else if (!cmd->cmp("cMapDir")) { + parseCMapDir(tokens, fileName, line); + } else if (!cmd->cmp("toUnicodeDir")) { + parseToUnicodeDir(tokens, fileName, line); + } else if (!cmd->cmp("displayFontT1")) { + parseDisplayFont(tokens, displayFonts, displayFontT1, fileName, line); + } else if (!cmd->cmp("displayFontTT")) { + parseDisplayFont(tokens, displayFonts, displayFontTT, fileName, line); + } else if (!cmd->cmp("displayNamedCIDFontT1")) { + parseDisplayFont(tokens, displayNamedCIDFonts, + displayFontT1, fileName, line); + } else if (!cmd->cmp("displayCIDFontT1")) { + parseDisplayFont(tokens, displayCIDFonts, + displayFontT1, fileName, line); + } else if (!cmd->cmp("displayNamedCIDFontTT")) { + parseDisplayFont(tokens, displayNamedCIDFonts, + displayFontTT, fileName, line); + } else if (!cmd->cmp("displayCIDFontTT")) { + parseDisplayFont(tokens, displayCIDFonts, + displayFontTT, fileName, line); + } else if (!cmd->cmp("psFile")) { + parsePSFile(tokens, fileName, line); + } else if (!cmd->cmp("psFont")) { + parsePSFont(tokens, fileName, line); + } else if (!cmd->cmp("psNamedFont16")) { + parsePSFont16("psNamedFont16", psNamedFonts16, + tokens, fileName, line); + } else if (!cmd->cmp("psFont16")) { + parsePSFont16("psFont16", psFonts16, tokens, fileName, line); + } else if (!cmd->cmp("psPaperSize")) { + parsePSPaperSize(tokens, fileName, line); + } else if (!cmd->cmp("psImageableArea")) { + parsePSImageableArea(tokens, fileName, line); + } else if (!cmd->cmp("psCrop")) { + parseYesNo("psCrop", &psCrop, tokens, fileName, line); + } else if (!cmd->cmp("psExpandSmaller")) { + parseYesNo("psExpandSmaller", &psExpandSmaller, + tokens, fileName, line); + } else if (!cmd->cmp("psShrinkLarger")) { + parseYesNo("psShrinkLarger", &psShrinkLarger, tokens, fileName, line); + } else if (!cmd->cmp("psCenter")) { + parseYesNo("psCenter", &psCenter, tokens, fileName, line); + } else if (!cmd->cmp("psDuplex")) { + parseYesNo("psDuplex", &psDuplex, tokens, fileName, line); + } else if (!cmd->cmp("psLevel")) { + parsePSLevel(tokens, fileName, line); + } else if (!cmd->cmp("psEmbedType1Fonts")) { + parseYesNo("psEmbedType1", &psEmbedType1, tokens, fileName, line); + } else if (!cmd->cmp("psEmbedTrueTypeFonts")) { + parseYesNo("psEmbedTrueType", &psEmbedTrueType, + tokens, fileName, line); + } else if (!cmd->cmp("psEmbedCIDPostScriptFonts")) { + parseYesNo("psEmbedCIDPostScript", &psEmbedCIDPostScript, + tokens, fileName, line); + } else if (!cmd->cmp("psEmbedCIDTrueTypeFonts")) { + parseYesNo("psEmbedCIDTrueType", &psEmbedCIDTrueType, + tokens, fileName, line); + } else if (!cmd->cmp("psPreload")) { + parseYesNo("psPreload", &psPreload, tokens, fileName, line); + } else if (!cmd->cmp("psOPI")) { + parseYesNo("psOPI", &psOPI, tokens, fileName, line); + } else if (!cmd->cmp("psASCIIHex")) { + parseYesNo("psASCIIHex", &psASCIIHex, tokens, fileName, line); + } else if (!cmd->cmp("textEncoding")) { + parseTextEncoding(tokens, fileName, line); + } else if (!cmd->cmp("textEOL")) { + parseTextEOL(tokens, fileName, line); + } else if (!cmd->cmp("textPageBreaks")) { + parseYesNo("textPageBreaks", &textPageBreaks, + tokens, fileName, line); + } else if (!cmd->cmp("textKeepTinyChars")) { + parseYesNo("textKeepTinyChars", &textKeepTinyChars, + tokens, fileName, line); + } else if (!cmd->cmp("fontDir")) { + parseFontDir(tokens, fileName, line); + } else if (!cmd->cmp("initialZoom")) { + parseInitialZoom(tokens, fileName, line); + } else if (!cmd->cmp("continuousView")) { + parseYesNo("continuousView", &continuousView, tokens, fileName, line); + } else if (!cmd->cmp("enableT1lib")) { + parseYesNo("enableT1lib", &enableT1lib, tokens, fileName, line); + } else if (!cmd->cmp("enableFreeType")) { + parseYesNo("enableFreeType", &enableFreeType, tokens, fileName, line); + } else if (!cmd->cmp("antialias")) { + parseYesNo("antialias", &antialias, tokens, fileName, line); + } else if (!cmd->cmp("vectorAntialias")) { + parseYesNo("vectorAntialias", &vectorAntialias, + tokens, fileName, line); + } else if (!cmd->cmp("strokeAdjust")) { + parseYesNo("strokeAdjust", &strokeAdjust, tokens, fileName, line); + } else if (!cmd->cmp("screenType")) { + parseScreenType(tokens, fileName, line); + } else if (!cmd->cmp("screenSize")) { + parseInteger("screenSize", &screenSize, tokens, fileName, line); + } else if (!cmd->cmp("screenDotRadius")) { + parseInteger("screenDotRadius", &screenDotRadius, + tokens, fileName, line); + } else if (!cmd->cmp("screenGamma")) { + parseFloat("screenGamma", &screenGamma, + tokens, fileName, line); + } else if (!cmd->cmp("screenBlackThreshold")) { + parseFloat("screenBlackThreshold", &screenBlackThreshold, + tokens, fileName, line); + } else if (!cmd->cmp("screenWhiteThreshold")) { + parseFloat("screenWhiteThreshold", &screenWhiteThreshold, + tokens, fileName, line); + } else if (!cmd->cmp("urlCommand")) { + parseCommand("urlCommand", &urlCommand, tokens, fileName, line); + } else if (!cmd->cmp("movieCommand")) { + parseCommand("movieCommand", &movieCommand, tokens, fileName, line); + } else if (!cmd->cmp("mapNumericCharNames")) { + parseYesNo("mapNumericCharNames", &mapNumericCharNames, + tokens, fileName, line); + } else if (!cmd->cmp("mapUnknownCharNames")) { + parseYesNo("mapUnknownCharNames", &mapUnknownCharNames, + tokens, fileName, line); + } else if (!cmd->cmp("bind")) { + parseBind(tokens, fileName, line); + } else if (!cmd->cmp("unbind")) { + parseUnbind(tokens, fileName, line); + } else if (!cmd->cmp("printCommands")) { + parseYesNo("printCommands", &printCommands, tokens, fileName, line); + } else if (!cmd->cmp("errQuiet")) { + parseYesNo("errQuiet", &errQuiet, tokens, fileName, line); + } else { + error(-1, "Unknown config file command '%s' (%s:%d)", + cmd->getCString(), fileName->getCString(), line); + if (!cmd->cmp("displayFontX") || + !cmd->cmp("displayNamedCIDFontX") || + !cmd->cmp("displayCIDFontX")) { + error(-1, "-- Xpdf no longer supports X fonts"); + } else if (!cmd->cmp("t1libControl") || !cmd->cmp("freetypeControl")) { + error(-1, "-- The t1libControl and freetypeControl options have been replaced"); + error(-1, " by the enableT1lib, enableFreeType, and antialias options"); + } else if (!cmd->cmp("fontpath") || !cmd->cmp("fontmap")) { + error(-1, "-- the config file format has changed since Xpdf 0.9x"); + } + } + } + + deleteGList(tokens, GString); +} + +static char is_absolute(char*filename) +{ + int l = strlen(filename); + if(filename[0] == '/' || filename[0] == '\\') + return 1; + if(l>2 && filename[1]==':' && (filename[2]=='\\' || filename[2]=='/')) + return 1; + return 0; +} + +static GString* qualify_filename(GString*path, GString*filename) +{ + GString*fullpath = 0; + char*prefix = "/usr/local/share/xpdf/"; + + if (!is_absolute(filename->getCString())) { + /* relative path */ + fullpath = path->copy(); + fullpath->append(filename); + } else if (!strncmp(filename->getCString(), prefix, strlen(prefix))) { + /* xpdf default path */ + char*s = strchr(filename->getCString()+strlen(prefix), '/'); + if(s) { + fullpath = path->copy(); + fullpath->append(s+1); + } else { + fullpath = filename->copy(); + } + } else { + /* absolute path */ + fullpath = filename->copy(); + } + //printf("%s -%s-> %s\n", filename->getCString(), path->getCString(), fullpath->getCString()); + return fullpath; +} + +void GlobalParams::parseNameToUnicode(GList *tokens, GString *fileName, + int line) { + GString *name; + char *tok1, *tok2; + FILE *f; + char buf[256]; + int line2; + Unicode u; + + if (tokens->getLength() != 2) { + error(-1, "Bad 'nameToUnicode' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + name = qualify_filename(this->path, (GString *)tokens->get(1)); + if (!(f = fopen(name->getCString(), "r"))) { + error(-1, "Couldn't open 'nameToUnicode' file '%s' using path '%s'", + name->getCString(), path->getCString()); + return; + } + line2 = 1; + while (getLine(buf, sizeof(buf), f)) { + tok1 = strtok(buf, " \t\r\n"); + tok2 = strtok(NULL, " \t\r\n"); + if (tok1 && tok2) { + sscanf(tok1, "%x", &u); + nameToUnicode->add(tok2, u); + } else { + error(-1, "Bad line in 'nameToUnicode' file (%s:%d)", name, line2); + } + ++line2; + } + fclose(f); +} + +void GlobalParams::parseCIDToUnicode(GList *tokens, GString *fileName, + int line) { + GString *collection, *name, *old; + + if (tokens->getLength() != 3) { + error(-1, "Bad 'cidToUnicode' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + collection = (GString *)tokens->get(1); + name = (GString *)tokens->get(2); + + if ((old = (GString *)cidToUnicodes->remove(collection))) { + delete old; + } + + cidToUnicodes->add(collection->copy(), qualify_filename(this->path, name)); +} + +void GlobalParams::parseUnicodeToUnicode(GList *tokens, GString *fileName, + int line) { + GString *font, *file, *old; + + if (tokens->getLength() != 3) { + error(-1, "Bad 'unicodeToUnicode' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + font = (GString *)tokens->get(1); + file = (GString *)tokens->get(2); + if ((old = (GString *)unicodeToUnicodes->remove(font))) { + delete old; + } + + unicodeToUnicodes->add(font->copy(), qualify_filename(this->path, file)); +} + +void GlobalParams::parseUnicodeMap(GList *tokens, GString *fileName, + int line) { + GString *encodingName, *name, *old; + + if (tokens->getLength() != 3) { + error(-1, "Bad 'unicodeMap' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + encodingName = (GString *)tokens->get(1); + name = (GString *)tokens->get(2); + if ((old = (GString *)unicodeMaps->remove(encodingName))) { + delete old; + } + + unicodeMaps->add(encodingName->copy(), qualify_filename(this->path, name)); +} + +void GlobalParams::parseCMapDir(GList *tokens, GString *fileName, int line) { + GString *collection, *dir; + GList *list; + + if (tokens->getLength() != 3) { + error(-1, "Bad 'cMapDir' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + collection = (GString *)tokens->get(1); + dir = (GString *)tokens->get(2); + if (!(list = (GList *)cMapDirs->lookup(collection))) { + list = new GList(); + cMapDirs->add(collection->copy(), list); + } + + list->append(qualify_filename(this->path, dir)); +} + +void GlobalParams::parseToUnicodeDir(GList *tokens, GString *fileName, + int line) { + GString *dir; + + if (tokens->getLength() != 2) { + error(-1, "Bad 'toUnicodeDir' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + + dir = (GString *)tokens->get(1); + + toUnicodeDirs->append(qualify_filename(this->path, dir)); +} + +void GlobalParams::parseDisplayFont(GList *tokens, GHash *fontHash, + DisplayFontParamKind kind, + GString *fileName, int line) { + DisplayFontParam *param, *old; + GString *file; + + if (tokens->getLength() < 2) { + goto err1; + } + param = new DisplayFontParam(((GString *)tokens->get(1))->copy(), kind); + + switch (kind) { + case displayFontT1: + if (tokens->getLength() != 3) { + goto err2; + } + file = (GString *)tokens->get(2); + param->t1.fileName = qualify_filename(this->path, file); + break; + case displayFontTT: + if (tokens->getLength() != 3) { + goto err2; + } + file = (GString *)tokens->get(2); + param->tt.fileName = qualify_filename(this->path, file); + break; + } + + if ((old = (DisplayFontParam *)fontHash->remove(param->name))) { + delete old; + } + fontHash->add(param->name, param); + return; + + err2: + delete param; + err1: + error(-1, "Bad 'display*Font*' config file command (%s:%d)", + fileName->getCString(), line); +} + +void GlobalParams::parsePSPaperSize(GList *tokens, GString *fileName, + int line) { + GString *tok; + + if (tokens->getLength() == 2) { + tok = (GString *)tokens->get(1); + if (!setPSPaperSize(tok->getCString())) { + error(-1, "Bad 'psPaperSize' config file command (%s:%d)", + fileName->getCString(), line); + } + } else if (tokens->getLength() == 3) { + tok = (GString *)tokens->get(1); + psPaperWidth = atoi(tok->getCString()); + tok = (GString *)tokens->get(2); + psPaperHeight = atoi(tok->getCString()); + psImageableLLX = psImageableLLY = 0; + psImageableURX = psPaperWidth; + psImageableURY = psPaperHeight; + } else { + error(-1, "Bad 'psPaperSize' config file command (%s:%d)", + fileName->getCString(), line); + } +} + +void GlobalParams::parsePSImageableArea(GList *tokens, GString *fileName, + int line) { + if (tokens->getLength() != 5) { + error(-1, "Bad 'psImageableArea' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + psImageableLLX = atoi(((GString *)tokens->get(1))->getCString()); + psImageableLLY = atoi(((GString *)tokens->get(2))->getCString()); + psImageableURX = atoi(((GString *)tokens->get(3))->getCString()); + psImageableURY = atoi(((GString *)tokens->get(4))->getCString()); +} + +void GlobalParams::parsePSLevel(GList *tokens, GString *fileName, int line) { + GString *tok; + + if (tokens->getLength() != 2) { + error(-1, "Bad 'psLevel' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(1); + if (!tok->cmp("level1")) { + psLevel = psLevel1; + } else if (!tok->cmp("level1sep")) { + psLevel = psLevel1Sep; + } else if (!tok->cmp("level2")) { + psLevel = psLevel2; + } else if (!tok->cmp("level2sep")) { + psLevel = psLevel2Sep; + } else if (!tok->cmp("level3")) { + psLevel = psLevel3; + } else if (!tok->cmp("level3Sep")) { + psLevel = psLevel3Sep; + } else { + error(-1, "Bad 'psLevel' config file command (%s:%d)", + fileName->getCString(), line); + } +} + +void GlobalParams::parsePSFile(GList *tokens, GString *fileName, int line) { + if (tokens->getLength() != 2) { + error(-1, "Bad 'psFile' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + if (psFile) { + delete psFile; + } + psFile = ((GString *)tokens->get(1))->copy(); +} + +void GlobalParams::parsePSFont(GList *tokens, GString *fileName, int line) { + PSFontParam *param; + + if (tokens->getLength() != 3) { + error(-1, "Bad 'psFont' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + param = new PSFontParam(((GString *)tokens->get(1))->copy(), 0, + ((GString *)tokens->get(2))->copy(), NULL); + psFonts->add(param->pdfFontName, param); +} + +void GlobalParams::parsePSFont16(char *cmdName, GList *fontList, + GList *tokens, GString *fileName, int line) { + PSFontParam *param; + int wMode; + GString *tok; + + if (tokens->getLength() != 5) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(2); + if (!tok->cmp("H")) { + wMode = 0; + } else if (!tok->cmp("V")) { + wMode = 1; + } else { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + param = new PSFontParam(((GString *)tokens->get(1))->copy(), + wMode, + ((GString *)tokens->get(3))->copy(), + ((GString *)tokens->get(4))->copy()); + fontList->append(param); +} + +void GlobalParams::parseTextEncoding(GList *tokens, GString *fileName, + int line) { + if (tokens->getLength() != 2) { + error(-1, "Bad 'textEncoding' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + delete textEncoding; + textEncoding = ((GString *)tokens->get(1))->copy(); +} + +void GlobalParams::parseTextEOL(GList *tokens, GString *fileName, int line) { + GString *tok; + + if (tokens->getLength() != 2) { + error(-1, "Bad 'textEOL' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(1); + if (!tok->cmp("unix")) { + textEOL = eolUnix; + } else if (!tok->cmp("dos")) { + textEOL = eolDOS; + } else if (!tok->cmp("mac")) { + textEOL = eolMac; + } else { + error(-1, "Bad 'textEOL' config file command (%s:%d)", + fileName->getCString(), line); + } +} + +void GlobalParams::parseFontDir(GList *tokens, GString *fileName, int line) { + if (tokens->getLength() != 2) { + error(-1, "Bad 'fontDir' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + fontDirs->append(((GString *)tokens->get(1))->copy()); +} + +void GlobalParams::parseInitialZoom(GList *tokens, + GString *fileName, int line) { + if (tokens->getLength() != 2) { + error(-1, "Bad 'initialZoom' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + delete initialZoom; + initialZoom = ((GString *)tokens->get(1))->copy(); +} + +void GlobalParams::parseScreenType(GList *tokens, GString *fileName, + int line) { + GString *tok; + + if (tokens->getLength() != 2) { + error(-1, "Bad 'screenType' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(1); + if (!tok->cmp("dispersed")) { + screenType = screenDispersed; + } else if (!tok->cmp("clustered")) { + screenType = screenClustered; + } else if (!tok->cmp("stochasticClustered")) { + screenType = screenStochasticClustered; + } else { + error(-1, "Bad 'screenType' config file command (%s:%d)", + fileName->getCString(), line); + } +} + +void GlobalParams::parseBind(GList *tokens, GString *fileName, int line) { + KeyBinding *binding; + GList *cmds; + int code, mods, context, i; + + if (tokens->getLength() < 4) { + error(-1, "Bad 'bind' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + if (!parseKey((GString *)tokens->get(1), (GString *)tokens->get(2), + &code, &mods, &context, + "bind", tokens, fileName, line)) { + return; + } + for (i = 0; i < keyBindings->getLength(); ++i) { + binding = (KeyBinding *)keyBindings->get(i); + if (binding->code == code && + binding->mods == mods && + binding->context == context) { + delete (KeyBinding *)keyBindings->del(i); + break; + } + } + cmds = new GList(); + for (i = 3; i < tokens->getLength(); ++i) { + cmds->append(((GString *)tokens->get(i))->copy()); + } + keyBindings->append(new KeyBinding(code, mods, context, cmds)); +} + +void GlobalParams::parseUnbind(GList *tokens, GString *fileName, int line) { + KeyBinding *binding; + int code, mods, context, i; + + if (tokens->getLength() != 3) { + error(-1, "Bad 'unbind' config file command (%s:%d)", + fileName->getCString(), line); + return; + } + if (!parseKey((GString *)tokens->get(1), (GString *)tokens->get(2), + &code, &mods, &context, + "unbind", tokens, fileName, line)) { + return; + } + for (i = 0; i < keyBindings->getLength(); ++i) { + binding = (KeyBinding *)keyBindings->get(i); + if (binding->code == code && + binding->mods == mods && + binding->context == context) { + delete (KeyBinding *)keyBindings->del(i); + break; + } + } +} + +GBool GlobalParams::parseKey(GString *modKeyStr, GString *contextStr, + int *code, int *mods, int *context, + char *cmdName, + GList *tokens, GString *fileName, int line) { + char *p0; + + *mods = xpdfKeyModNone; + p0 = modKeyStr->getCString(); + while (1) { + if (!strncmp(p0, "shift-", 6)) { + *mods |= xpdfKeyModShift; + p0 += 6; + } else if (!strncmp(p0, "ctrl-", 5)) { + *mods |= xpdfKeyModCtrl; + p0 += 5; + } else if (!strncmp(p0, "alt-", 4)) { + *mods |= xpdfKeyModAlt; + p0 += 4; + } else { + break; + } + } + + if (!strcmp(p0, "space")) { + *code = ' '; + } else if (!strcmp(p0, "tab")) { + *code = xpdfKeyCodeTab; + } else if (!strcmp(p0, "return")) { + *code = xpdfKeyCodeReturn; + } else if (!strcmp(p0, "enter")) { + *code = xpdfKeyCodeEnter; + } else if (!strcmp(p0, "backspace")) { + *code = xpdfKeyCodeBackspace; + } else if (!strcmp(p0, "insert")) { + *code = xpdfKeyCodeInsert; + } else if (!strcmp(p0, "delete")) { + *code = xpdfKeyCodeDelete; + } else if (!strcmp(p0, "home")) { + *code = xpdfKeyCodeHome; + } else if (!strcmp(p0, "end")) { + *code = xpdfKeyCodeEnd; + } else if (!strcmp(p0, "pgup")) { + *code = xpdfKeyCodePgUp; + } else if (!strcmp(p0, "pgdn")) { + *code = xpdfKeyCodePgDn; + } else if (!strcmp(p0, "left")) { + *code = xpdfKeyCodeLeft; + } else if (!strcmp(p0, "right")) { + *code = xpdfKeyCodeRight; + } else if (!strcmp(p0, "up")) { + *code = xpdfKeyCodeUp; + } else if (!strcmp(p0, "down")) { + *code = xpdfKeyCodeDown; + } else if (p0[0] == 'f' && p0[1] >= '1' && p0[1] <= '9' && !p0[2]) { + *code = xpdfKeyCodeF1 + (p0[1] - '1'); + } else if (p0[0] == 'f' && + ((p0[1] >= '1' && p0[1] <= '2' && p0[2] >= '0' && p0[2] <= '9') || + (p0[1] == '3' && p0[2] >= '0' && p0[2] <= '5')) && + !p0[3]) { + *code = xpdfKeyCodeF1 + 10 * (p0[1] - '0') + (p0[2] - '0') - 1; + } else if (!strncmp(p0, "mousePress", 10) && + p0[10] >= '1' && p0[10] <= '7' && !p0[11]) { + *code = xpdfKeyCodeMousePress1 + (p0[10] - '1'); + } else if (!strncmp(p0, "mouseRelease", 12) && + p0[12] >= '1' && p0[12] <= '7' && !p0[13]) { + *code = xpdfKeyCodeMouseRelease1 + (p0[12] - '1'); + } else if (*p0 >= 0x20 && *p0 <= 0x7e && !p0[1]) { + *code = (int)*p0; + } else { + error(-1, "Bad key/modifier in '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return gFalse; + } + + p0 = contextStr->getCString(); + if (!strcmp(p0, "any")) { + *context = xpdfKeyContextAny; + } else { + *context = xpdfKeyContextAny; + while (1) { + if (!strncmp(p0, "fullScreen", 10)) { + *context |= xpdfKeyContextFullScreen; + p0 += 10; + } else if (!strncmp(p0, "window", 6)) { + *context |= xpdfKeyContextWindow; + p0 += 6; + } else if (!strncmp(p0, "continuous", 10)) { + *context |= xpdfKeyContextContinuous; + p0 += 10; + } else if (!strncmp(p0, "singlePage", 10)) { + *context |= xpdfKeyContextSinglePage; + p0 += 10; + } else if (!strncmp(p0, "overLink", 8)) { + *context |= xpdfKeyContextOverLink; + p0 += 8; + } else if (!strncmp(p0, "offLink", 7)) { + *context |= xpdfKeyContextOffLink; + p0 += 7; + } else if (!strncmp(p0, "outline", 7)) { + *context |= xpdfKeyContextOutline; + p0 += 7; + } else if (!strncmp(p0, "mainWin", 7)) { + *context |= xpdfKeyContextMainWin; + p0 += 7; + } else if (!strncmp(p0, "scrLockOn", 9)) { + *context |= xpdfKeyContextScrLockOn; + p0 += 9; + } else if (!strncmp(p0, "scrLockOff", 10)) { + *context |= xpdfKeyContextScrLockOff; + p0 += 10; + } else { + error(-1, "Bad context in '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return gFalse; + } + if (!*p0) { + break; + } + if (*p0 != ',') { + error(-1, "Bad context in '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return gFalse; + } + ++p0; + } + } + + return gTrue; +} + +void GlobalParams::parseCommand(char *cmdName, GString **val, + GList *tokens, GString *fileName, int line) { + if (tokens->getLength() != 2) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + if (*val) { + delete *val; + } + *val = ((GString *)tokens->get(1))->copy(); +} + +void GlobalParams::parseYesNo(char *cmdName, GBool *flag, + GList *tokens, GString *fileName, int line) { + GString *tok; + + if (tokens->getLength() != 2) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(1); + if (!parseYesNo2(tok->getCString(), flag)) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + } +} + +GBool GlobalParams::parseYesNo2(char *token, GBool *flag) { + if (!strcmp(token, "yes")) { + *flag = gTrue; + } else if (!strcmp(token, "no")) { + *flag = gFalse; + } else { + return gFalse; + } + return gTrue; +} + +void GlobalParams::parseInteger(char *cmdName, int *val, + GList *tokens, GString *fileName, int line) { + GString *tok; + int i; + + if (tokens->getLength() != 2) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(1); + if (tok->getLength() == 0) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + if (tok->getChar(0) == '-') { + i = 1; + } else { + i = 0; + } + for (; i < tok->getLength(); ++i) { + if (tok->getChar(i) < '0' || tok->getChar(i) > '9') { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + } + *val = atoi(tok->getCString()); +} + +void GlobalParams::parseFloat(char *cmdName, double *val, + GList *tokens, GString *fileName, int line) { + GString *tok; + int i; + + if (tokens->getLength() != 2) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + tok = (GString *)tokens->get(1); + if (tok->getLength() == 0) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + if (tok->getChar(0) == '-') { + i = 1; + } else { + i = 0; + } + for (; i < tok->getLength(); ++i) { + if (!((tok->getChar(i) >= '0' && tok->getChar(i) <= '9') || + tok->getChar(i) == '.')) { + error(-1, "Bad '%s' config file command (%s:%d)", + cmdName, fileName->getCString(), line); + return; + } + } + *val = atof(tok->getCString()); +} + +GlobalParams::~GlobalParams() { + GHashIter *iter; + GString *key; + GList *list; + + freeBuiltinFontTables(); + + delete macRomanReverseMap; + + delete baseDir; + delete nameToUnicode; + deleteGHash(cidToUnicodes, GString); + deleteGHash(unicodeToUnicodes, GString); + deleteGHash(residentUnicodeMaps, UnicodeMap); + deleteGHash(unicodeMaps, GString); + deleteGList(toUnicodeDirs, GString); + deleteGHash(displayFonts, DisplayFontParam); + deleteGHash(displayCIDFonts, DisplayFontParam); + deleteGHash(displayNamedCIDFonts, DisplayFontParam); +#ifdef WIN32 + if (winFontList) { + delete winFontList; + } +#endif + if (psFile) { + delete psFile; + } + deleteGHash(psFonts, PSFontParam); + deleteGList(psNamedFonts16, PSFontParam); + deleteGList(psFonts16, PSFontParam); + delete textEncoding; + deleteGList(fontDirs, GString); + delete initialZoom; + if (urlCommand) { + delete urlCommand; + } + if (movieCommand) { + delete movieCommand; + } + deleteGList(keyBindings, KeyBinding); + + cMapDirs->startIter(&iter); + while (cMapDirs->getNext(&iter, &key, (void **)&list)) { + deleteGList(list, GString); + } + delete cMapDirs; + + delete cidToUnicodeCache; + delete unicodeToUnicodeCache; + delete unicodeMapCache; + delete cMapCache; + +#ifdef ENABLE_PLUGINS + delete securityHandlers; + deleteGList(plugins, Plugin); +#endif + +#if MULTITHREADED + gDestroyMutex(&mutex); + gDestroyMutex(&unicodeMapCacheMutex); + gDestroyMutex(&cMapCacheMutex); +#endif +} + +//------------------------------------------------------------------------ + +void GlobalParams::setBaseDir(char *dir) { + delete baseDir; + baseDir = new GString(dir); +} + +void GlobalParams::setupBaseFonts(char *dir) { + GString *fontName; + GString *fileName; +#ifdef WIN32 + HMODULE shell32Lib; + BOOL (__stdcall *SHGetSpecialFolderPathFunc)(HWND hwndOwner, + LPTSTR lpszPath, + int nFolder, + BOOL fCreate); + char winFontDir[MAX_PATH]; +#endif + FILE *f; + DisplayFontParamKind kind; + DisplayFontParam *dfp; + int i, j; + +#ifdef WIN32 + // SHGetSpecialFolderPath isn't available in older versions of + // shell32.dll (Win95 and WinNT4), so do a dynamic load + winFontDir[0] = '\0'; + if ((shell32Lib = LoadLibrary("shell32.dll"))) { + if ((SHGetSpecialFolderPathFunc = + (BOOL (__stdcall *)(HWND hwndOwner, LPTSTR lpszPath, + int nFolder, BOOL fCreate)) + GetProcAddress(shell32Lib, "SHGetSpecialFolderPathA"))) { + if (!(*SHGetSpecialFolderPathFunc)(NULL, winFontDir, + CSIDL_FONTS, FALSE)) { + winFontDir[0] = '\0'; + } + } + } +#endif + for (i = 0; displayFontTab[i].name; ++i) { + fontName = new GString(displayFontTab[i].name); + if (getDisplayFont(fontName)) { + delete fontName; + continue; + } + fileName = NULL; + kind = displayFontT1; // make gcc happy + if (dir) { + fileName = appendToPath(new GString(dir), displayFontTab[i].t1FileName); + kind = displayFontT1; + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + } else { + delete fileName; + fileName = NULL; + } + } +#ifdef WIN32 + if (!fileName && winFontDir[0] && displayFontTab[i].ttFileName) { + fileName = appendToPath(new GString(winFontDir), + displayFontTab[i].ttFileName); + kind = displayFontTT; + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + } else { + delete fileName; + fileName = NULL; + } + } + // SHGetSpecialFolderPath(CSIDL_FONTS) doesn't work on Win 2k Server + // or Win2003 Server, or with older versions of shell32.dll, so check + // the "standard" directories + if (displayFontTab[i].ttFileName) { + for (j = 0; !fileName && displayFontDirs[j]; ++j) { + fileName = appendToPath(new GString(displayFontDirs[j]), + displayFontTab[i].ttFileName); + kind = displayFontTT; + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + } else { + delete fileName; + fileName = NULL; + } + } + } +#else + for (j = 0; !fileName && displayFontDirs[j]; ++j) { + fileName = appendToPath(new GString(displayFontDirs[j]), + displayFontTab[i].t1FileName); + kind = displayFontT1; + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + } else { + delete fileName; + fileName = NULL; + } + } +#endif + if (!fileName) { + error(-1, "No display font for '%s'", displayFontTab[i].name); + delete fontName; + continue; + } + dfp = new DisplayFontParam(fontName, kind); + dfp->t1.fileName = fileName; + globalParams->addDisplayFont(dfp); + } + +#ifdef WIN32 + if (winFontDir[0]) { + winFontList = new WinFontList(winFontDir); + } +#endif +} + +//------------------------------------------------------------------------ +// accessors +//------------------------------------------------------------------------ + +CharCode GlobalParams::getMacRomanCharCode(char *charName) { + // no need to lock - macRomanReverseMap is constant + return macRomanReverseMap->lookup(charName); +} + +GString *GlobalParams::getBaseDir() { + GString *s; + + lockGlobalParams; + s = baseDir->copy(); + unlockGlobalParams; + return s; +} + +Unicode GlobalParams::mapNameToUnicode(char *charName) { + // no need to lock - nameToUnicode is constant + return nameToUnicode->lookup(charName); +} + +UnicodeMap *GlobalParams::getResidentUnicodeMap(GString *encodingName) { + UnicodeMap *map; + + lockGlobalParams; + map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName); + unlockGlobalParams; + if (map) { + map->incRefCnt(); + } + return map; +} + +FILE *GlobalParams::getUnicodeMapFile(GString *encodingName) { + GString *fileName; + FILE *f; + + lockGlobalParams; + if ((fileName = (GString *)unicodeMaps->lookup(encodingName))) { + f = fopen(fileName->getCString(), "r"); + } else { + f = NULL; + } + unlockGlobalParams; + return f; +} + +FILE *GlobalParams::findCMapFile(GString *collection, GString *cMapName) { + GList *list; + GString *dir; + GString *fileName; + FILE *f; + int i; + + lockGlobalParams; + if (!(list = (GList *)cMapDirs->lookup(collection))) { + unlockGlobalParams; + return NULL; + } + for (i = 0; i < list->getLength(); ++i) { + dir = (GString *)list->get(i); + fileName = appendToPath(dir->copy(), cMapName->getCString()); + f = fopen(fileName->getCString(), "r"); + delete fileName; + if (f) { + unlockGlobalParams; + return f; + } + } + unlockGlobalParams; + return NULL; +} + +FILE *GlobalParams::findToUnicodeFile(GString *name) { + GString *dir, *fileName; + FILE *f; + int i; + + lockGlobalParams; + for (i = 0; i < toUnicodeDirs->getLength(); ++i) { + dir = (GString *)toUnicodeDirs->get(i); + fileName = appendToPath(dir->copy(), name->getCString()); + f = fopen(fileName->getCString(), "r"); + delete fileName; + if (f) { + unlockGlobalParams; + return f; + } + } + unlockGlobalParams; + return NULL; +} + +DisplayFontParam *GlobalParams::getDisplayFont(GString *fontName) { + DisplayFontParam *dfp; + + lockGlobalParams; + dfp = (DisplayFontParam *)displayFonts->lookup(fontName); +#ifdef WIN32 + if (!dfp && winFontList) { + dfp = winFontList->find(fontName); + } +#endif + unlockGlobalParams; + return dfp; +} + +DisplayFontParam *GlobalParams::getDisplayCIDFont(GString *fontName, + GString *collection) { + DisplayFontParam *dfp; + + lockGlobalParams; + if (!fontName || + !(dfp = (DisplayFontParam *)displayNamedCIDFonts->lookup(fontName))) { + dfp = (DisplayFontParam *)displayCIDFonts->lookup(collection); + } + unlockGlobalParams; + return dfp; +} + +GString *GlobalParams::getPSFile() { + GString *s; + + lockGlobalParams; + s = psFile ? psFile->copy() : (GString *)NULL; + unlockGlobalParams; + return s; +} + +int GlobalParams::getPSPaperWidth() { + int w; + + lockGlobalParams; + w = psPaperWidth; + unlockGlobalParams; + return w; +} + +int GlobalParams::getPSPaperHeight() { + int h; + + lockGlobalParams; + h = psPaperHeight; + unlockGlobalParams; + return h; +} + +void GlobalParams::getPSImageableArea(int *llx, int *lly, int *urx, int *ury) { + lockGlobalParams; + *llx = psImageableLLX; + *lly = psImageableLLY; + *urx = psImageableURX; + *ury = psImageableURY; + unlockGlobalParams; +} + +GBool GlobalParams::getPSCrop() { + GBool f; + + lockGlobalParams; + f = psCrop; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getPSExpandSmaller() { + GBool f; + + lockGlobalParams; + f = psExpandSmaller; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getPSShrinkLarger() { + GBool f; + + lockGlobalParams; + f = psShrinkLarger; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getPSCenter() { + GBool f; + + lockGlobalParams; + f = psCenter; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getPSDuplex() { + GBool d; + + lockGlobalParams; + d = psDuplex; + unlockGlobalParams; + return d; +} + +PSLevel GlobalParams::getPSLevel() { + PSLevel level; + + lockGlobalParams; + level = psLevel; + unlockGlobalParams; + return level; +} + +PSFontParam *GlobalParams::getPSFont(GString *fontName) { + PSFontParam *p; + + lockGlobalParams; + p = (PSFontParam *)psFonts->lookup(fontName); + unlockGlobalParams; + return p; +} + +PSFontParam *GlobalParams::getPSFont16(GString *fontName, + GString *collection, int wMode) { + PSFontParam *p; + int i; + + lockGlobalParams; + p = NULL; + if (fontName) { + for (i = 0; i < psNamedFonts16->getLength(); ++i) { + p = (PSFontParam *)psNamedFonts16->get(i); + if (!p->pdfFontName->cmp(fontName) && + p->wMode == wMode) { + break; + } + p = NULL; + } + } + if (!p && collection) { + for (i = 0; i < psFonts16->getLength(); ++i) { + p = (PSFontParam *)psFonts16->get(i); + if (!p->pdfFontName->cmp(collection) && + p->wMode == wMode) { + break; + } + p = NULL; + } + } + unlockGlobalParams; + return p; +} + +GBool GlobalParams::getPSEmbedType1() { + GBool e; + + lockGlobalParams; + e = psEmbedType1; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSEmbedTrueType() { + GBool e; + + lockGlobalParams; + e = psEmbedTrueType; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSEmbedCIDPostScript() { + GBool e; + + lockGlobalParams; + e = psEmbedCIDPostScript; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSEmbedCIDTrueType() { + GBool e; + + lockGlobalParams; + e = psEmbedCIDTrueType; + unlockGlobalParams; + return e; +} + +GBool GlobalParams::getPSPreload() { + GBool preload; + + lockGlobalParams; + preload = psPreload; + unlockGlobalParams; + return preload; +} + +GBool GlobalParams::getPSOPI() { + GBool opi; + + lockGlobalParams; + opi = psOPI; + unlockGlobalParams; + return opi; +} + +GBool GlobalParams::getPSASCIIHex() { + GBool ah; + + lockGlobalParams; + ah = psASCIIHex; + unlockGlobalParams; + return ah; +} + +GString *GlobalParams::getTextEncodingName() { + GString *s; + + lockGlobalParams; + s = textEncoding->copy(); + unlockGlobalParams; + return s; +} + +EndOfLineKind GlobalParams::getTextEOL() { + EndOfLineKind eol; + + lockGlobalParams; + eol = textEOL; + unlockGlobalParams; + return eol; +} + +GBool GlobalParams::getTextPageBreaks() { + GBool pageBreaks; + + lockGlobalParams; + pageBreaks = textPageBreaks; + unlockGlobalParams; + return pageBreaks; +} + +GBool GlobalParams::getTextKeepTinyChars() { + GBool tiny; + + lockGlobalParams; + tiny = textKeepTinyChars; + unlockGlobalParams; + return tiny; +} + +GString *GlobalParams::findFontFile(GString *fontName, char **exts) { + GString *dir, *fileName; + char **ext; + FILE *f; + int i; + + lockGlobalParams; + for (i = 0; i < fontDirs->getLength(); ++i) { + dir = (GString *)fontDirs->get(i); + for (ext = exts; *ext; ++ext) { + fileName = appendToPath(dir->copy(), fontName->getCString()); + fileName->append(*ext); + if ((f = fopen(fileName->getCString(), "rb"))) { + fclose(f); + unlockGlobalParams; + return fileName; + } + delete fileName; + } + } + unlockGlobalParams; + return NULL; +} + +GString *GlobalParams::getInitialZoom() { + GString *s; + + lockGlobalParams; + s = initialZoom->copy(); + unlockGlobalParams; + return s; +} + +GBool GlobalParams::getContinuousView() { + GBool f; + + lockGlobalParams; + f = continuousView; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getEnableT1lib() { + GBool f; + + lockGlobalParams; + f = enableT1lib; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getEnableFreeType() { + GBool f; + + lockGlobalParams; + f = enableFreeType; + unlockGlobalParams; + return f; +} + + +GBool GlobalParams::getAntialias() { + GBool f; + + lockGlobalParams; + f = antialias; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getVectorAntialias() { + GBool f; + + lockGlobalParams; + f = vectorAntialias; + unlockGlobalParams; + return f; +} + +GBool GlobalParams::getStrokeAdjust() { + GBool f; + + lockGlobalParams; + f = strokeAdjust; + unlockGlobalParams; + return f; +} + +ScreenType GlobalParams::getScreenType() { + ScreenType t; + + lockGlobalParams; + t = screenType; + unlockGlobalParams; + return t; +} + +int GlobalParams::getScreenSize() { + int size; + + lockGlobalParams; + size = screenSize; + unlockGlobalParams; + return size; +} + +int GlobalParams::getScreenDotRadius() { + int r; + + lockGlobalParams; + r = screenDotRadius; + unlockGlobalParams; + return r; +} + +double GlobalParams::getScreenGamma() { + double gamma; + + lockGlobalParams; + gamma = screenGamma; + unlockGlobalParams; + return gamma; +} + +double GlobalParams::getScreenBlackThreshold() { + double thresh; + + lockGlobalParams; + thresh = screenBlackThreshold; + unlockGlobalParams; + return thresh; +} + +double GlobalParams::getScreenWhiteThreshold() { + double thresh; + + lockGlobalParams; + thresh = screenWhiteThreshold; + unlockGlobalParams; + return thresh; +} + +GBool GlobalParams::getMapNumericCharNames() { + GBool map; + + lockGlobalParams; + map = mapNumericCharNames; + unlockGlobalParams; + return map; +} + +GBool GlobalParams::getMapUnknownCharNames() { + GBool map; + + lockGlobalParams; + map = mapUnknownCharNames; + unlockGlobalParams; + return map; +} + +GList *GlobalParams::getKeyBinding(int code, int mods, int context) { + KeyBinding *binding; + GList *cmds; + int modMask; + int i, j; + + lockGlobalParams; + cmds = NULL; + // for ASCII chars, ignore the shift modifier + modMask = code <= 0xff ? ~xpdfKeyModShift : ~0; + for (i = 0; i < keyBindings->getLength(); ++i) { + binding = (KeyBinding *)keyBindings->get(i); + if (binding->code == code && + (binding->mods & modMask) == (mods & modMask) && + (~binding->context | context) == ~0) { + cmds = new GList(); + for (j = 0; j < binding->cmds->getLength(); ++j) { + cmds->append(((GString *)binding->cmds->get(j))->copy()); + } + break; + } + } + unlockGlobalParams; + return cmds; +} + +GBool GlobalParams::getPrintCommands() { + GBool p; + + lockGlobalParams; + p = printCommands; + unlockGlobalParams; + return p; +} + +GBool GlobalParams::getErrQuiet() { + // no locking -- this function may get called from inside a locked + // section + return errQuiet; +} + +CharCodeToUnicode *GlobalParams::getCIDToUnicode(GString *collection) { + GString *fileName; + CharCodeToUnicode *ctu; + + lockGlobalParams; + if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) { + if ((fileName = (GString *)cidToUnicodes->lookup(collection)) && + (ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) { + cidToUnicodeCache->add(ctu); + } + } + unlockGlobalParams; + return ctu; +} + +CharCodeToUnicode *GlobalParams::getUnicodeToUnicode(GString *fontName) { + CharCodeToUnicode *ctu; + GHashIter *iter; + GString *fontPattern, *fileName; + + lockGlobalParams; + fileName = NULL; + unicodeToUnicodes->startIter(&iter); + while (unicodeToUnicodes->getNext(&iter, &fontPattern, (void **)&fileName)) { + if (strstr(fontName->getCString(), fontPattern->getCString())) { + unicodeToUnicodes->killIter(&iter); + break; + } + fileName = NULL; + } + if (fileName) { + if (!(ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName))) { + if ((ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName))) { + unicodeToUnicodeCache->add(ctu); + } + } + } else { + ctu = NULL; + } + unlockGlobalParams; + return ctu; +} + +UnicodeMap *GlobalParams::getUnicodeMap(GString *encodingName) { + return getUnicodeMap2(encodingName); +} + +UnicodeMap *GlobalParams::getUnicodeMap2(GString *encodingName) { + UnicodeMap *map; + + if (!(map = getResidentUnicodeMap(encodingName))) { + lockUnicodeMapCache; + map = unicodeMapCache->getUnicodeMap(encodingName); + unlockUnicodeMapCache; + } + return map; +} + +CMap *GlobalParams::getCMap(GString *collection, GString *cMapName) { + CMap *cMap; + + lockCMapCache; + cMap = cMapCache->getCMap(collection, cMapName); + unlockCMapCache; + return cMap; +} + +UnicodeMap *GlobalParams::getTextEncoding() { + return getUnicodeMap2(textEncoding); +} + +//------------------------------------------------------------------------ +// functions to set parameters +//------------------------------------------------------------------------ + +void GlobalParams::addDisplayFont(DisplayFontParam *param) { + DisplayFontParam *old; + + lockGlobalParams; + if ((old = (DisplayFontParam *)displayFonts->remove(param->name))) { + delete old; + } + displayFonts->add(param->name, param); + unlockGlobalParams; +} + +void GlobalParams::setPSFile(char *file) { + lockGlobalParams; + if (psFile) { + delete psFile; + } + psFile = new GString(file); + unlockGlobalParams; +} + +GBool GlobalParams::setPSPaperSize(char *size) { + lockGlobalParams; + if (!strcmp(size, "match")) { + psPaperWidth = psPaperHeight = -1; + } else if (!strcmp(size, "letter")) { + psPaperWidth = 612; + psPaperHeight = 792; + } else if (!strcmp(size, "legal")) { + psPaperWidth = 612; + psPaperHeight = 1008; + } else if (!strcmp(size, "A4")) { + psPaperWidth = 595; + psPaperHeight = 842; + } else if (!strcmp(size, "A3")) { + psPaperWidth = 842; + psPaperHeight = 1190; + } else { + unlockGlobalParams; + return gFalse; + } + psImageableLLX = psImageableLLY = 0; + psImageableURX = psPaperWidth; + psImageableURY = psPaperHeight; + unlockGlobalParams; + return gTrue; +} + +void GlobalParams::setPSPaperWidth(int width) { + lockGlobalParams; + psPaperWidth = width; + psImageableLLX = 0; + psImageableURX = psPaperWidth; + unlockGlobalParams; +} + +void GlobalParams::setPSPaperHeight(int height) { + lockGlobalParams; + psPaperHeight = height; + psImageableLLY = 0; + psImageableURY = psPaperHeight; + unlockGlobalParams; +} + +void GlobalParams::setPSImageableArea(int llx, int lly, int urx, int ury) { + lockGlobalParams; + psImageableLLX = llx; + psImageableLLY = lly; + psImageableURX = urx; + psImageableURY = ury; + unlockGlobalParams; +} + +void GlobalParams::setPSCrop(GBool crop) { + lockGlobalParams; + psCrop = crop; + unlockGlobalParams; +} + +void GlobalParams::setPSExpandSmaller(GBool expand) { + lockGlobalParams; + psExpandSmaller = expand; + unlockGlobalParams; +} + +void GlobalParams::setPSShrinkLarger(GBool shrink) { + lockGlobalParams; + psShrinkLarger = shrink; + unlockGlobalParams; +} + +void GlobalParams::setPSCenter(GBool center) { + lockGlobalParams; + psCenter = center; + unlockGlobalParams; +} + +void GlobalParams::setPSDuplex(GBool duplex) { + lockGlobalParams; + psDuplex = duplex; + unlockGlobalParams; +} + +void GlobalParams::setPSLevel(PSLevel level) { + lockGlobalParams; + psLevel = level; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedType1(GBool embed) { + lockGlobalParams; + psEmbedType1 = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedTrueType(GBool embed) { + lockGlobalParams; + psEmbedTrueType = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedCIDPostScript(GBool embed) { + lockGlobalParams; + psEmbedCIDPostScript = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSEmbedCIDTrueType(GBool embed) { + lockGlobalParams; + psEmbedCIDTrueType = embed; + unlockGlobalParams; +} + +void GlobalParams::setPSPreload(GBool preload) { + lockGlobalParams; + psPreload = preload; + unlockGlobalParams; +} + +void GlobalParams::setPSOPI(GBool opi) { + lockGlobalParams; + psOPI = opi; + unlockGlobalParams; +} + +void GlobalParams::setPSASCIIHex(GBool hex) { + lockGlobalParams; + psASCIIHex = hex; + unlockGlobalParams; +} + +void GlobalParams::setTextEncoding(char *encodingName) { + lockGlobalParams; + delete textEncoding; + textEncoding = new GString(encodingName); + unlockGlobalParams; +} + +GBool GlobalParams::setTextEOL(char *s) { + lockGlobalParams; + if (!strcmp(s, "unix")) { + textEOL = eolUnix; + } else if (!strcmp(s, "dos")) { + textEOL = eolDOS; + } else if (!strcmp(s, "mac")) { + textEOL = eolMac; + } else { + unlockGlobalParams; + return gFalse; + } + unlockGlobalParams; + return gTrue; +} + +void GlobalParams::setTextPageBreaks(GBool pageBreaks) { + lockGlobalParams; + textPageBreaks = pageBreaks; + unlockGlobalParams; +} + +void GlobalParams::setTextKeepTinyChars(GBool keep) { + lockGlobalParams; + textKeepTinyChars = keep; + unlockGlobalParams; +} + +void GlobalParams::setInitialZoom(char *s) { + lockGlobalParams; + delete initialZoom; + initialZoom = new GString(s); + unlockGlobalParams; +} + +void GlobalParams::setContinuousView(GBool cont) { + lockGlobalParams; + continuousView = cont; + unlockGlobalParams; +} + +GBool GlobalParams::setEnableT1lib(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &enableT1lib); + unlockGlobalParams; + return ok; +} + +GBool GlobalParams::setEnableFreeType(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &enableFreeType); + unlockGlobalParams; + return ok; +} + + +GBool GlobalParams::setAntialias(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &antialias); + unlockGlobalParams; + return ok; +} + +GBool GlobalParams::setVectorAntialias(char *s) { + GBool ok; + + lockGlobalParams; + ok = parseYesNo2(s, &vectorAntialias); + unlockGlobalParams; + return ok; +} + +void GlobalParams::setScreenType(ScreenType t) { + lockGlobalParams; + screenType = t; + unlockGlobalParams; +} + +void GlobalParams::setScreenSize(int size) { + lockGlobalParams; + screenSize = size; + unlockGlobalParams; +} + +void GlobalParams::setScreenDotRadius(int r) { + lockGlobalParams; + screenDotRadius = r; + unlockGlobalParams; +} + +void GlobalParams::setScreenGamma(double gamma) { + lockGlobalParams; + screenGamma = gamma; + unlockGlobalParams; +} + +void GlobalParams::setScreenBlackThreshold(double thresh) { + lockGlobalParams; + screenBlackThreshold = thresh; + unlockGlobalParams; +} + +void GlobalParams::setScreenWhiteThreshold(double thresh) { + lockGlobalParams; + screenWhiteThreshold = thresh; + unlockGlobalParams; +} + +void GlobalParams::setMapNumericCharNames(GBool map) { + lockGlobalParams; + mapNumericCharNames = map; + unlockGlobalParams; +} + +void GlobalParams::setMapUnknownCharNames(GBool map) { + lockGlobalParams; + mapUnknownCharNames = map; + unlockGlobalParams; +} + +void GlobalParams::setPrintCommands(GBool printCommandsA) { + lockGlobalParams; + printCommands = printCommandsA; + unlockGlobalParams; +} + +void GlobalParams::setErrQuiet(GBool errQuietA) { + lockGlobalParams; + errQuiet = errQuietA; + unlockGlobalParams; +} + +void GlobalParams::addSecurityHandler(XpdfSecurityHandler *handler) { +#ifdef ENABLE_PLUGINS + lockGlobalParams; + securityHandlers->append(handler); + unlockGlobalParams; +#endif +} + +XpdfSecurityHandler *GlobalParams::getSecurityHandler(char *name) { +#ifdef ENABLE_PLUGINS + XpdfSecurityHandler *hdlr; + int i; + + lockGlobalParams; + for (i = 0; i < securityHandlers->getLength(); ++i) { + hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); + if (!strcasecmp(hdlr->name, name)) { + unlockGlobalParams; + return hdlr; + } + } + unlockGlobalParams; + + if (!loadPlugin("security", name)) { + return NULL; + } + + lockGlobalParams; + for (i = 0; i < securityHandlers->getLength(); ++i) { + hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); + if (!strcmp(hdlr->name, name)) { + unlockGlobalParams; + return hdlr; + } + } + unlockGlobalParams; +#endif + + return NULL; +} + +#ifdef ENABLE_PLUGINS +//------------------------------------------------------------------------ +// plugins +//------------------------------------------------------------------------ + +GBool GlobalParams::loadPlugin(char *type, char *name) { + Plugin *plugin; + + if (!(plugin = Plugin::load(type, name))) { + return gFalse; + } + lockGlobalParams; + plugins->append(plugin); + unlockGlobalParams; + return gTrue; +} + +#endif // ENABLE_PLUGINS diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h new file mode 100644 index 000000000..14bce4429 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h @@ -0,0 +1,467 @@ +//======================================================================== +// +// GlobalParams.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GLOBALPARAMS_H +#define GLOBALPARAMS_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "GMutex.h" +#endif + +class GString; +class GList; +class GHash; +class NameToCharCode; +class CharCodeToUnicode; +class CharCodeToUnicodeCache; +class UnicodeMap; +class UnicodeMapCache; +class CMap; +class CMapCache; +struct XpdfSecurityHandler; +class GlobalParams; +#ifdef WIN32 +class WinFontList; +#endif + +//------------------------------------------------------------------------ + +// The global parameters object. +extern GlobalParams *globalParams; + +//------------------------------------------------------------------------ + +enum DisplayFontParamKind { + displayFontT1, + displayFontTT +}; + +struct DisplayFontParamT1 { + GString *fileName; +}; + +struct DisplayFontParamTT { + GString *fileName; +}; + +class DisplayFontParam { +public: + + GString *name; // font name for 8-bit fonts and named + // CID fonts; collection name for + // generic CID fonts + DisplayFontParamKind kind; + union { + DisplayFontParamT1 t1; + DisplayFontParamTT tt; + }; + + DisplayFontParam(GString *nameA, DisplayFontParamKind kindA); + virtual ~DisplayFontParam(); +}; + +//------------------------------------------------------------------------ + +class PSFontParam { +public: + + GString *pdfFontName; // PDF font name for 8-bit fonts and + // named 16-bit fonts; char collection + // name for generic 16-bit fonts + int wMode; // writing mode (0=horiz, 1=vert) for + // 16-bit fonts + GString *psFontName; // PostScript font name + GString *encoding; // encoding, for 16-bit fonts only + + PSFontParam(GString *pdfFontNameA, int wModeA, + GString *psFontNameA, GString *encodingA); + ~PSFontParam(); +}; + +//------------------------------------------------------------------------ + +enum PSLevel { + psLevel1, + psLevel1Sep, + psLevel2, + psLevel2Sep, + psLevel3, + psLevel3Sep +}; + +//------------------------------------------------------------------------ + +enum EndOfLineKind { + eolUnix, // LF + eolDOS, // CR+LF + eolMac // CR +}; + +//------------------------------------------------------------------------ + +enum ScreenType { + screenUnset, + screenDispersed, + screenClustered, + screenStochasticClustered +}; + +//------------------------------------------------------------------------ + +class KeyBinding { +public: + + int code; // 0x20 .. 0xfe = ASCII, + // >=0x10000 = special keys, mouse buttons, + // etc. (xpdfKeyCode* symbols) + int mods; // modifiers (xpdfKeyMod* symbols, or-ed + // together) + int context; // context (xpdfKeyContext* symbols, or-ed + // together) + GList *cmds; // list of commands [GString] + + KeyBinding(int codeA, int modsA, int contextA, char *cmd0); + KeyBinding(int codeA, int modsA, int contextA, char *cmd0, char *cmd1); + KeyBinding(int codeA, int modsA, int contextA, GList *cmdsA); + ~KeyBinding(); +}; + +#define xpdfKeyCodeTab 0x1000 +#define xpdfKeyCodeReturn 0x1001 +#define xpdfKeyCodeEnter 0x1002 +#define xpdfKeyCodeBackspace 0x1003 +#define xpdfKeyCodeInsert 0x1004 +#define xpdfKeyCodeDelete 0x1005 +#define xpdfKeyCodeHome 0x1006 +#define xpdfKeyCodeEnd 0x1007 +#define xpdfKeyCodePgUp 0x1008 +#define xpdfKeyCodePgDn 0x1009 +#define xpdfKeyCodeLeft 0x100a +#define xpdfKeyCodeRight 0x100b +#define xpdfKeyCodeUp 0x100c +#define xpdfKeyCodeDown 0x100d +#define xpdfKeyCodeF1 0x1100 +#define xpdfKeyCodeF35 0x1122 +#define xpdfKeyCodeMousePress1 0x2001 +#define xpdfKeyCodeMousePress2 0x2002 +#define xpdfKeyCodeMousePress3 0x2003 +#define xpdfKeyCodeMousePress4 0x2004 +#define xpdfKeyCodeMousePress5 0x2005 +#define xpdfKeyCodeMousePress6 0x2006 +#define xpdfKeyCodeMousePress7 0x2007 +#define xpdfKeyCodeMouseRelease1 0x2101 +#define xpdfKeyCodeMouseRelease2 0x2102 +#define xpdfKeyCodeMouseRelease3 0x2103 +#define xpdfKeyCodeMouseRelease4 0x2104 +#define xpdfKeyCodeMouseRelease5 0x2105 +#define xpdfKeyCodeMouseRelease6 0x2106 +#define xpdfKeyCodeMouseRelease7 0x2107 +#define xpdfKeyModNone 0 +#define xpdfKeyModShift (1 << 0) +#define xpdfKeyModCtrl (1 << 1) +#define xpdfKeyModAlt (1 << 2) +#define xpdfKeyContextAny 0 +#define xpdfKeyContextFullScreen (1 << 0) +#define xpdfKeyContextWindow (2 << 0) +#define xpdfKeyContextContinuous (1 << 2) +#define xpdfKeyContextSinglePage (2 << 2) +#define xpdfKeyContextOverLink (1 << 4) +#define xpdfKeyContextOffLink (2 << 4) +#define xpdfKeyContextOutline (1 << 6) +#define xpdfKeyContextMainWin (2 << 6) +#define xpdfKeyContextScrLockOn (1 << 8) +#define xpdfKeyContextScrLockOff (2 << 8) + +//------------------------------------------------------------------------ + +class GlobalParams { +public: + + // Initialize the global parameters by attempting to read a config + // file. + GlobalParams(char *cfgFileName); + + virtual ~GlobalParams(); + + void setBaseDir(char *dir); + void setupBaseFonts(char *dir); + + void parseLine(char *buf, GString *fileName, int line); + + //----- accessors + + CharCode getMacRomanCharCode(char *charName); + + GString *getBaseDir(); + Unicode mapNameToUnicode(char *charName); + UnicodeMap *getResidentUnicodeMap(GString *encodingName); + FILE *getUnicodeMapFile(GString *encodingName); + FILE *findCMapFile(GString *collection, GString *cMapName); + FILE *findToUnicodeFile(GString *name); + virtual DisplayFontParam *getDisplayFont(GString *fontName); + virtual DisplayFontParam *getDisplayCIDFont(GString *fontName, GString *collection); + GString *getPSFile(); + int getPSPaperWidth(); + int getPSPaperHeight(); + void getPSImageableArea(int *llx, int *lly, int *urx, int *ury); + GBool getPSDuplex(); + GBool getPSCrop(); + GBool getPSExpandSmaller(); + GBool getPSShrinkLarger(); + GBool getPSCenter(); + PSLevel getPSLevel(); + PSFontParam *getPSFont(GString *fontName); + PSFontParam *getPSFont16(GString *fontName, GString *collection, int wMode); + GBool getPSEmbedType1(); + GBool getPSEmbedTrueType(); + GBool getPSEmbedCIDPostScript(); + GBool getPSEmbedCIDTrueType(); + GBool getPSPreload(); + GBool getPSOPI(); + GBool getPSASCIIHex(); + GString *getTextEncodingName(); + EndOfLineKind getTextEOL(); + GBool getTextPageBreaks(); + GBool getTextKeepTinyChars(); + GString *findFontFile(GString *fontName, char **exts); + GString *getInitialZoom(); + GBool getContinuousView(); + GBool getEnableT1lib(); + GBool getEnableFreeType(); + GBool getAntialias(); + GBool getVectorAntialias(); + GBool getStrokeAdjust(); + ScreenType getScreenType(); + int getScreenSize(); + int getScreenDotRadius(); + double getScreenGamma(); + double getScreenBlackThreshold(); + double getScreenWhiteThreshold(); + GString *getURLCommand() { return urlCommand; } + GString *getMovieCommand() { return movieCommand; } + GBool getMapNumericCharNames(); + GBool getMapUnknownCharNames(); + GList *getKeyBinding(int code, int mods, int context); + GBool getPrintCommands(); + GBool getErrQuiet(); + + CharCodeToUnicode *getCIDToUnicode(GString *collection); + CharCodeToUnicode *getUnicodeToUnicode(GString *fontName); + UnicodeMap *getUnicodeMap(GString *encodingName); + CMap *getCMap(GString *collection, GString *cMapName); + UnicodeMap *getTextEncoding(); + + //----- functions to set parameters + + void addDisplayFont(DisplayFontParam *param); + void setPSFile(char *file); + GBool setPSPaperSize(char *size); + void setPSPaperWidth(int width); + void setPSPaperHeight(int height); + void setPSImageableArea(int llx, int lly, int urx, int ury); + void setPSDuplex(GBool duplex); + void setPSCrop(GBool crop); + void setPSExpandSmaller(GBool expand); + void setPSShrinkLarger(GBool shrink); + void setPSCenter(GBool center); + void setPSLevel(PSLevel level); + void setPSEmbedType1(GBool embed); + void setPSEmbedTrueType(GBool embed); + void setPSEmbedCIDPostScript(GBool embed); + void setPSEmbedCIDTrueType(GBool embed); + void setPSPreload(GBool preload); + void setPSOPI(GBool opi); + void setPSASCIIHex(GBool hex); + void setTextEncoding(char *encodingName); + GBool setTextEOL(char *s); + void setTextPageBreaks(GBool pageBreaks); + void setTextKeepTinyChars(GBool keep); + void setInitialZoom(char *s); + void setContinuousView(GBool cont); + GBool setEnableT1lib(char *s); + GBool setEnableFreeType(char *s); + GBool setAntialias(char *s); + GBool setVectorAntialias(char *s); + void setScreenType(ScreenType t); + void setScreenSize(int size); + void setScreenDotRadius(int r); + void setScreenGamma(double gamma); + void setScreenBlackThreshold(double thresh); + void setScreenWhiteThreshold(double thresh); + void setMapNumericCharNames(GBool map); + void setMapUnknownCharNames(GBool map); + void setPrintCommands(GBool printCommandsA); + void setErrQuiet(GBool errQuietA); + + //----- security handlers + + void addSecurityHandler(XpdfSecurityHandler *handler); + XpdfSecurityHandler *getSecurityHandler(char *name); + +private: + + void createDefaultKeyBindings(); +public: void parseFile(GString *fileName, FILE *f); private: + void parseNameToUnicode(GList *tokens, GString *fileName, int line); + void parseCIDToUnicode(GList *tokens, GString *fileName, int line); + void parseUnicodeToUnicode(GList *tokens, GString *fileName, int line); + void parseUnicodeMap(GList *tokens, GString *fileName, int line); + void parseCMapDir(GList *tokens, GString *fileName, int line); + void parseToUnicodeDir(GList *tokens, GString *fileName, int line); + void parseDisplayFont(GList *tokens, GHash *fontHash, + DisplayFontParamKind kind, + GString *fileName, int line); + void parsePSFile(GList *tokens, GString *fileName, int line); + void parsePSPaperSize(GList *tokens, GString *fileName, int line); + void parsePSImageableArea(GList *tokens, GString *fileName, int line); + void parsePSLevel(GList *tokens, GString *fileName, int line); + void parsePSFont(GList *tokens, GString *fileName, int line); + void parsePSFont16(char *cmdName, GList *fontList, + GList *tokens, GString *fileName, int line); + void parseTextEncoding(GList *tokens, GString *fileName, int line); + void parseTextEOL(GList *tokens, GString *fileName, int line); + void parseFontDir(GList *tokens, GString *fileName, int line); + void parseInitialZoom(GList *tokens, GString *fileName, int line); + void parseScreenType(GList *tokens, GString *fileName, int line); + void parseBind(GList *tokens, GString *fileName, int line); + void parseUnbind(GList *tokens, GString *fileName, int line); + GBool parseKey(GString *modKeyStr, GString *contextStr, + int *code, int *mods, int *context, + char *cmdName, + GList *tokens, GString *fileName, int line); + void parseCommand(char *cmdName, GString **val, + GList *tokens, GString *fileName, int line); + void parseYesNo(char *cmdName, GBool *flag, + GList *tokens, GString *fileName, int line); + GBool parseYesNo2(char *token, GBool *flag); + void parseInteger(char *cmdName, int *val, + GList *tokens, GString *fileName, int line); + void parseFloat(char *cmdName, double *val, + GList *tokens, GString *fileName, int line); + UnicodeMap *getUnicodeMap2(GString *encodingName); +#ifdef ENABLE_PLUGINS + GBool loadPlugin(char *type, char *name); +#endif + + //----- config file base path + + GString*path; + + //----- static tables + + NameToCharCode * // mapping from char name to + macRomanReverseMap; // MacRomanEncoding index + + //----- user-modifiable settings + + GString *baseDir; // base directory - for plugins, etc. + NameToCharCode * // mapping from char name to Unicode + nameToUnicode; + GHash *cidToUnicodes; // files for mappings from char collections + // to Unicode, indexed by collection name + // [GString] + GHash *unicodeToUnicodes; // files for Unicode-to-Unicode mappings, + // indexed by font name pattern [GString] + GHash *residentUnicodeMaps; // mappings from Unicode to char codes, + // indexed by encoding name [UnicodeMap] + GHash *unicodeMaps; // files for mappings from Unicode to char + // codes, indexed by encoding name [GString] + GHash *cMapDirs; // list of CMap dirs, indexed by collection + // name [GList[GString]] + GList *toUnicodeDirs; // list of ToUnicode CMap dirs [GString] + GHash *displayFonts; // display font info, indexed by font name + // [DisplayFontParam] +#ifdef WIN32 + WinFontList *winFontList; // system TrueType fonts +#endif + GHash *displayCIDFonts; // display CID font info, indexed by + // collection [DisplayFontParam] + GHash *displayNamedCIDFonts; // display CID font info, indexed by + // font name [DisplayFontParam] + GString *psFile; // PostScript file or command (for xpdf) + int psPaperWidth; // paper size, in PostScript points, for + int psPaperHeight; // PostScript output + int psImageableLLX, // imageable area, in PostScript points, + psImageableLLY, // for PostScript output + psImageableURX, + psImageableURY; + GBool psCrop; // crop PS output to CropBox + GBool psExpandSmaller; // expand smaller pages to fill paper + GBool psShrinkLarger; // shrink larger pages to fit paper + GBool psCenter; // center pages on the paper + GBool psDuplex; // enable duplexing in PostScript? + PSLevel psLevel; // PostScript level to generate + GHash *psFonts; // PostScript font info, indexed by PDF + // font name [PSFontParam] + GList *psNamedFonts16; // named 16-bit fonts [PSFontParam] + GList *psFonts16; // generic 16-bit fonts [PSFontParam] + GBool psEmbedType1; // embed Type 1 fonts? + GBool psEmbedTrueType; // embed TrueType fonts? + GBool psEmbedCIDPostScript; // embed CID PostScript fonts? + GBool psEmbedCIDTrueType; // embed CID TrueType fonts? + GBool psPreload; // preload PostScript images and forms into + // memory + GBool psOPI; // generate PostScript OPI comments? + GBool psASCIIHex; // use ASCIIHex instead of ASCII85? + GString *textEncoding; // encoding (unicodeMap) to use for text + // output + EndOfLineKind textEOL; // type of EOL marker to use for text + // output + GBool textPageBreaks; // insert end-of-page markers? + GBool textKeepTinyChars; // keep all characters in text output + GList *fontDirs; // list of font dirs [GString] + GString *initialZoom; // initial zoom level + GBool continuousView; // continuous view mode + GBool enableT1lib; // t1lib enable flag + GBool enableFreeType; // FreeType enable flag + GBool antialias; // font anti-aliasing enable flag + GBool vectorAntialias; // vector anti-aliasing enable flag + GBool strokeAdjust; // stroke adjustment enable flag + ScreenType screenType; // halftone screen type + int screenSize; // screen matrix size + int screenDotRadius; // screen dot radius + double screenGamma; // screen gamma correction + double screenBlackThreshold; // screen black clamping threshold + double screenWhiteThreshold; // screen white clamping threshold + GString *urlCommand; // command executed for URL links + GString *movieCommand; // command executed for movie annotations + GBool mapNumericCharNames; // map numeric char names (from font subsets)? + GBool mapUnknownCharNames; // map unknown char names? + GList *keyBindings; // key & mouse button bindings [KeyBinding] + GBool printCommands; // print the drawing commands + GBool errQuiet; // suppress error messages? + + CharCodeToUnicodeCache *cidToUnicodeCache; + CharCodeToUnicodeCache *unicodeToUnicodeCache; + UnicodeMapCache *unicodeMapCache; + CMapCache *cMapCache; + +#ifdef ENABLE_PLUGINS + GList *plugins; // list of plugins [Plugin] + GList *securityHandlers; // list of loaded security handlers + // [XpdfSecurityHandler] +#endif + +#if MULTITHREADED + GMutex mutex; + GMutex unicodeMapCacheMutex; + GMutex cMapCacheMutex; +#endif +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc new file mode 100644 index 000000000..195b73e1c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc @@ -0,0 +1,322 @@ +//======================================================================== +// +// JArithmeticDecoder.cc +// +// Copyright 2002-2004 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "Object.h" +#include "Stream.h" +#include "JArithmeticDecoder.h" + +//------------------------------------------------------------------------ +// JArithmeticDecoderStates +//------------------------------------------------------------------------ + +JArithmeticDecoderStats::JArithmeticDecoderStats(int contextSizeA) { + contextSize = contextSizeA; + cxTab = (Guchar *)gmallocn(contextSize, sizeof(Guchar)); + reset(); +} + +JArithmeticDecoderStats::~JArithmeticDecoderStats() { + gfree(cxTab); +} + +JArithmeticDecoderStats *JArithmeticDecoderStats::copy() { + JArithmeticDecoderStats *stats; + + stats = new JArithmeticDecoderStats(contextSize); + memcpy(stats->cxTab, cxTab, contextSize); + return stats; +} + +void JArithmeticDecoderStats::reset() { + memset(cxTab, 0, contextSize); +} + +void JArithmeticDecoderStats::copyFrom(JArithmeticDecoderStats *stats) { + memcpy(cxTab, stats->cxTab, contextSize); +} + +void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) { + cxTab[cx] = (i << 1) + mps; +} + +//------------------------------------------------------------------------ +// JArithmeticDecoder +//------------------------------------------------------------------------ + +Guint JArithmeticDecoder::qeTab[47] = { + 0x56010000, 0x34010000, 0x18010000, 0x0AC10000, + 0x05210000, 0x02210000, 0x56010000, 0x54010000, + 0x48010000, 0x38010000, 0x30010000, 0x24010000, + 0x1C010000, 0x16010000, 0x56010000, 0x54010000, + 0x51010000, 0x48010000, 0x38010000, 0x34010000, + 0x30010000, 0x28010000, 0x24010000, 0x22010000, + 0x1C010000, 0x18010000, 0x16010000, 0x14010000, + 0x12010000, 0x11010000, 0x0AC10000, 0x09C10000, + 0x08A10000, 0x05210000, 0x04410000, 0x02A10000, + 0x02210000, 0x01410000, 0x01110000, 0x00850000, + 0x00490000, 0x00250000, 0x00150000, 0x00090000, + 0x00050000, 0x00010000, 0x56010000 +}; + +int JArithmeticDecoder::nmpsTab[47] = { + 1, 2, 3, 4, 5, 38, 7, 8, 9, 10, 11, 12, 13, 29, 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, 45, 46 +}; + +int JArithmeticDecoder::nlpsTab[47] = { + 1, 6, 9, 12, 29, 33, 6, 14, 14, 14, 17, 18, 20, 21, 14, 14, + 15, 16, 17, 18, 19, 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, 46 +}; + +int JArithmeticDecoder::switchTab[47] = { + 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +JArithmeticDecoder::JArithmeticDecoder() { + str = NULL; + dataLen = 0; + limitStream = gFalse; +} + +inline Guint JArithmeticDecoder::readByte() { + if (limitStream) { + --dataLen; + if (dataLen < 0) { + return 0xff; + } + } + return (Guint)str->getChar() & 0xff; +} + +JArithmeticDecoder::~JArithmeticDecoder() { + cleanup(); +} + +void JArithmeticDecoder::start() { + buf0 = readByte(); + buf1 = readByte(); + + // INITDEC + c = (buf0 ^ 0xff) << 16; + byteIn(); + c <<= 7; + ct -= 7; + a = 0x80000000; +} + +void JArithmeticDecoder::restart(int dataLenA) { + int oldDataLen; + + oldDataLen = dataLen; + dataLen = dataLenA; + if (oldDataLen == -1) { + buf1 = readByte(); + } else if (oldDataLen <= -2) { + buf0 = readByte(); + buf1 = readByte(); + } +} + +void JArithmeticDecoder::cleanup() { + if (limitStream) { + while (dataLen > 0) { + buf0 = buf1; + buf1 = readByte(); + } + } +} + +int JArithmeticDecoder::decodeBit(Guint context, + JArithmeticDecoderStats *stats) { + int bit; + Guint qe; + int iCX, mpsCX; + + iCX = stats->cxTab[context] >> 1; + mpsCX = stats->cxTab[context] & 1; + qe = qeTab[iCX]; + a -= qe; + if (c < a) { + if (a & 0x80000000) { + bit = mpsCX; + } else { + // MPS_EXCHANGE + if (a < qe) { + bit = 1 - mpsCX; + if (switchTab[iCX]) { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX); + } else { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX; + } + } else { + bit = mpsCX; + stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX; + } + // RENORMD + do { + if (ct == 0) { + byteIn(); + } + a <<= 1; + c <<= 1; + --ct; + } while (!(a & 0x80000000)); + } + } else { + c -= a; + // LPS_EXCHANGE + if (a < qe) { + bit = mpsCX; + stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX; + } else { + bit = 1 - mpsCX; + if (switchTab[iCX]) { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX); + } else { + stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX; + } + } + a = qe; + // RENORMD + do { + if (ct == 0) { + byteIn(); + } + a <<= 1; + c <<= 1; + --ct; + } while (!(a & 0x80000000)); + } + return bit; +} + +int JArithmeticDecoder::decodeByte(Guint context, + JArithmeticDecoderStats *stats) { + int byte; + int i; + + byte = 0; + for (i = 0; i < 8; ++i) { + byte = (byte << 1) | decodeBit(context, stats); + } + return byte; +} + +GBool JArithmeticDecoder::decodeInt(int *x, JArithmeticDecoderStats *stats) { + int s; + Guint v; + int i; + + prev = 1; + s = decodeIntBit(stats); + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + if (decodeIntBit(stats)) { + v = 0; + for (i = 0; i < 32; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 4436; + } else { + v = 0; + for (i = 0; i < 12; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 340; + } + } else { + v = 0; + for (i = 0; i < 8; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 84; + } + } else { + v = 0; + for (i = 0; i < 6; ++i) { + v = (v << 1) | decodeIntBit(stats); + } + v += 20; + } + } else { + v = decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + v += 4; + } + } else { + v = decodeIntBit(stats); + v = (v << 1) | decodeIntBit(stats); + } + + if (s) { + if (v == 0) { + return gFalse; + } + *x = -(int)v; + } else { + *x = (int)v; + } + return gTrue; +} + +int JArithmeticDecoder::decodeIntBit(JArithmeticDecoderStats *stats) { + int bit; + + bit = decodeBit(prev, stats); + if (prev < 0x100) { + prev = (prev << 1) | bit; + } else { + prev = (((prev << 1) | bit) & 0x1ff) | 0x100; + } + return bit; +} + +Guint JArithmeticDecoder::decodeIAID(Guint codeLen, + JArithmeticDecoderStats *stats) { + Guint i; + int bit; + + prev = 1; + for (i = 0; i < codeLen; ++i) { + bit = decodeBit(prev, stats); + prev = (prev << 1) | bit; + } + return prev - (1 << codeLen); +} + +void JArithmeticDecoder::byteIn() { + if (buf0 == 0xff) { + if (buf1 > 0x8f) { + ct = 8; + } else { + buf0 = buf1; + buf1 = readByte(); + c = c + 0xfe00 - (buf0 << 9); + ct = 7; + } + } else { + buf0 = buf1; + buf1 = readByte(); + c = c + 0xff00 - (buf0 << 8); + ct = 8; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h new file mode 100644 index 000000000..a40823ddb --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h @@ -0,0 +1,109 @@ +//======================================================================== +// +// JArithmeticDecoder.h +// +// Arithmetic decoder used by the JBIG2 and JPEG2000 decoders. +// +// Copyright 2002-2004 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef JARITHMETICDECODER_H +#define JARITHMETICDECODER_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +class Stream; + +//------------------------------------------------------------------------ +// JArithmeticDecoderStats +//------------------------------------------------------------------------ + +class JArithmeticDecoderStats { +public: + + JArithmeticDecoderStats(int contextSizeA); + ~JArithmeticDecoderStats(); + JArithmeticDecoderStats *copy(); + void reset(); + int getContextSize() { return contextSize; } + void copyFrom(JArithmeticDecoderStats *stats); + void setEntry(Guint cx, int i, int mps); + +private: + + Guchar *cxTab; // cxTab[cx] = (i[cx] << 1) + mps[cx] + int contextSize; + + friend class JArithmeticDecoder; +}; + +//------------------------------------------------------------------------ +// JArithmeticDecoder +//------------------------------------------------------------------------ + +class JArithmeticDecoder { +public: + + JArithmeticDecoder(); + ~JArithmeticDecoder(); + + void setStream(Stream *strA) + { str = strA; dataLen = 0; limitStream = gFalse; } + void setStream(Stream *strA, int dataLenA) + { str = strA; dataLen = dataLenA; limitStream = gTrue; } + + // Start decoding on a new stream. This fills the byte buffers and + // runs INITDEC. + void start(); + + // Restart decoding on an interrupted stream. This refills the + // buffers if needed, but does not run INITDEC. (This is used in + // JPEG 2000 streams when codeblock data is split across multiple + // packets/layers.) + void restart(int dataLenA); + + // Read any leftover data in the stream. + void cleanup(); + + // Decode one bit. + int decodeBit(Guint context, JArithmeticDecoderStats *stats); + + // Decode eight bits. + int decodeByte(Guint context, JArithmeticDecoderStats *stats); + + // Returns false for OOB, otherwise sets * and returns true. + GBool decodeInt(int *x, JArithmeticDecoderStats *stats); + + Guint decodeIAID(Guint codeLen, + JArithmeticDecoderStats *stats); + +private: + + Guint readByte(); + int decodeIntBit(JArithmeticDecoderStats *stats); + void byteIn(); + + static Guint qeTab[47]; + static int nmpsTab[47]; + static int nlpsTab[47]; + static int switchTab[47]; + + Guint buf0, buf1; + Guint c, a; + int ct; + + Guint prev; // for the integer decoder + + Stream *str; + int dataLen; + GBool limitStream; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc new file mode 100644 index 000000000..375d9ba72 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc @@ -0,0 +1,3726 @@ +//======================================================================== +// +// JBIG2Stream.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +//======================================================================== +// +// Modified under the Poppler project - http://poppler.freedesktop.org +// +// All changes made under the Poppler project to this file are licensed +// under GPL version 2 or later +// +// Copyright (C) 2006 Raj Kumar +// Copyright (C) 2006 Paul Walmsley +// Copyright (C) 2006-2009 Albert Astals Cid +// Copyright (C) 2009 David Benjamin +// +// To see a description of the changes please see the Changelog file that +// came with your tarball or type make ChangeLog if you are building from git +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "GList.h" +#include "Error.h" +#include "JArithmeticDecoder.h" +#include "JBIG2Stream.h" + +//~ share these tables +#include "Stream-CCITT.h" + +//------------------------------------------------------------------------ + +static const int contextSize[4] = { 16, 13, 10, 10 }; +static const int refContextSize[2] = { 13, 10 }; + +//------------------------------------------------------------------------ +// JBIG2HuffmanTable +//------------------------------------------------------------------------ + +#define jbig2HuffmanLOW 0xfffffffd +#define jbig2HuffmanOOB 0xfffffffe +#define jbig2HuffmanEOT 0xffffffff + +struct JBIG2HuffmanTable { + int val; + Guint prefixLen; + Guint rangeLen; // can also be LOW, OOB, or EOT + Guint prefix; +}; + +static JBIG2HuffmanTable huffTableA[] = { + { 0, 1, 4, 0x000 }, + { 16, 2, 8, 0x002 }, + { 272, 3, 16, 0x006 }, + { 65808, 3, 32, 0x007 }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableB[] = { + { 0, 1, 0, 0x000 }, + { 1, 2, 0, 0x002 }, + { 2, 3, 0, 0x006 }, + { 3, 4, 3, 0x00e }, + { 11, 5, 6, 0x01e }, + { 75, 6, 32, 0x03e }, + { 0, 6, jbig2HuffmanOOB, 0x03f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableC[] = { + { 0, 1, 0, 0x000 }, + { 1, 2, 0, 0x002 }, + { 2, 3, 0, 0x006 }, + { 3, 4, 3, 0x00e }, + { 11, 5, 6, 0x01e }, + { 0, 6, jbig2HuffmanOOB, 0x03e }, + { 75, 7, 32, 0x0fe }, + { -256, 8, 8, 0x0fe }, + { -257, 8, jbig2HuffmanLOW, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableD[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 0, 0x006 }, + { 4, 4, 3, 0x00e }, + { 12, 5, 6, 0x01e }, + { 76, 5, 32, 0x01f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableE[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 0, 0x006 }, + { 4, 4, 3, 0x00e }, + { 12, 5, 6, 0x01e }, + { 76, 6, 32, 0x03e }, + { -255, 7, 8, 0x07e }, + { -256, 7, jbig2HuffmanLOW, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableF[] = { + { 0, 2, 7, 0x000 }, + { 128, 3, 7, 0x002 }, + { 256, 3, 8, 0x003 }, + { -1024, 4, 9, 0x008 }, + { -512, 4, 8, 0x009 }, + { -256, 4, 7, 0x00a }, + { -32, 4, 5, 0x00b }, + { 512, 4, 9, 0x00c }, + { 1024, 4, 10, 0x00d }, + { -2048, 5, 10, 0x01c }, + { -128, 5, 6, 0x01d }, + { -64, 5, 5, 0x01e }, + { -2049, 6, jbig2HuffmanLOW, 0x03e }, + { 2048, 6, 32, 0x03f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableG[] = { + { -512, 3, 8, 0x000 }, + { 256, 3, 8, 0x001 }, + { 512, 3, 9, 0x002 }, + { 1024, 3, 10, 0x003 }, + { -1024, 4, 9, 0x008 }, + { -256, 4, 7, 0x009 }, + { -32, 4, 5, 0x00a }, + { 0, 4, 5, 0x00b }, + { 128, 4, 7, 0x00c }, + { -128, 5, 6, 0x01a }, + { -64, 5, 5, 0x01b }, + { 32, 5, 5, 0x01c }, + { 64, 5, 6, 0x01d }, + { -1025, 5, jbig2HuffmanLOW, 0x01e }, + { 2048, 5, 32, 0x01f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableH[] = { + { 0, 2, 1, 0x000 }, + { 0, 2, jbig2HuffmanOOB, 0x001 }, + { 4, 3, 4, 0x004 }, + { -1, 4, 0, 0x00a }, + { 22, 4, 4, 0x00b }, + { 38, 4, 5, 0x00c }, + { 2, 5, 0, 0x01a }, + { 70, 5, 6, 0x01b }, + { 134, 5, 7, 0x01c }, + { 3, 6, 0, 0x03a }, + { 20, 6, 1, 0x03b }, + { 262, 6, 7, 0x03c }, + { 646, 6, 10, 0x03d }, + { -2, 7, 0, 0x07c }, + { 390, 7, 8, 0x07d }, + { -15, 8, 3, 0x0fc }, + { -5, 8, 1, 0x0fd }, + { -7, 9, 1, 0x1fc }, + { -3, 9, 0, 0x1fd }, + { -16, 9, jbig2HuffmanLOW, 0x1fe }, + { 1670, 9, 32, 0x1ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableI[] = { + { 0, 2, jbig2HuffmanOOB, 0x000 }, + { -1, 3, 1, 0x002 }, + { 1, 3, 1, 0x003 }, + { 7, 3, 5, 0x004 }, + { -3, 4, 1, 0x00a }, + { 43, 4, 5, 0x00b }, + { 75, 4, 6, 0x00c }, + { 3, 5, 1, 0x01a }, + { 139, 5, 7, 0x01b }, + { 267, 5, 8, 0x01c }, + { 5, 6, 1, 0x03a }, + { 39, 6, 2, 0x03b }, + { 523, 6, 8, 0x03c }, + { 1291, 6, 11, 0x03d }, + { -5, 7, 1, 0x07c }, + { 779, 7, 9, 0x07d }, + { -31, 8, 4, 0x0fc }, + { -11, 8, 2, 0x0fd }, + { -15, 9, 2, 0x1fc }, + { -7, 9, 1, 0x1fd }, + { -32, 9, jbig2HuffmanLOW, 0x1fe }, + { 3339, 9, 32, 0x1ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableJ[] = { + { -2, 2, 2, 0x000 }, + { 6, 2, 6, 0x001 }, + { 0, 2, jbig2HuffmanOOB, 0x002 }, + { -3, 5, 0, 0x018 }, + { 2, 5, 0, 0x019 }, + { 70, 5, 5, 0x01a }, + { 3, 6, 0, 0x036 }, + { 102, 6, 5, 0x037 }, + { 134, 6, 6, 0x038 }, + { 198, 6, 7, 0x039 }, + { 326, 6, 8, 0x03a }, + { 582, 6, 9, 0x03b }, + { 1094, 6, 10, 0x03c }, + { -21, 7, 4, 0x07a }, + { -4, 7, 0, 0x07b }, + { 4, 7, 0, 0x07c }, + { 2118, 7, 11, 0x07d }, + { -5, 8, 0, 0x0fc }, + { 5, 8, 0, 0x0fd }, + { -22, 8, jbig2HuffmanLOW, 0x0fe }, + { 4166, 8, 32, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableK[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 1, 0x002 }, + { 4, 4, 0, 0x00c }, + { 5, 4, 1, 0x00d }, + { 7, 5, 1, 0x01c }, + { 9, 5, 2, 0x01d }, + { 13, 6, 2, 0x03c }, + { 17, 7, 2, 0x07a }, + { 21, 7, 3, 0x07b }, + { 29, 7, 4, 0x07c }, + { 45, 7, 5, 0x07d }, + { 77, 7, 6, 0x07e }, + { 141, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableL[] = { + { 1, 1, 0, 0x000 }, + { 2, 2, 0, 0x002 }, + { 3, 3, 1, 0x006 }, + { 5, 5, 0, 0x01c }, + { 6, 5, 1, 0x01d }, + { 8, 6, 1, 0x03c }, + { 10, 7, 0, 0x07a }, + { 11, 7, 1, 0x07b }, + { 13, 7, 2, 0x07c }, + { 17, 7, 3, 0x07d }, + { 25, 7, 4, 0x07e }, + { 41, 8, 5, 0x0fe }, + { 73, 8, 32, 0x0ff }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableM[] = { + { 1, 1, 0, 0x000 }, + { 2, 3, 0, 0x004 }, + { 7, 3, 3, 0x005 }, + { 3, 4, 0, 0x00c }, + { 5, 4, 1, 0x00d }, + { 4, 5, 0, 0x01c }, + { 15, 6, 1, 0x03a }, + { 17, 6, 2, 0x03b }, + { 21, 6, 3, 0x03c }, + { 29, 6, 4, 0x03d }, + { 45, 6, 5, 0x03e }, + { 77, 7, 6, 0x07e }, + { 141, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableN[] = { + { 0, 1, 0, 0x000 }, + { -2, 3, 0, 0x004 }, + { -1, 3, 0, 0x005 }, + { 1, 3, 0, 0x006 }, + { 2, 3, 0, 0x007 }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +static JBIG2HuffmanTable huffTableO[] = { + { 0, 1, 0, 0x000 }, + { -1, 3, 0, 0x004 }, + { 1, 3, 0, 0x005 }, + { -2, 4, 0, 0x00c }, + { 2, 4, 0, 0x00d }, + { -4, 5, 1, 0x01c }, + { 3, 5, 1, 0x01d }, + { -8, 6, 2, 0x03c }, + { 5, 6, 2, 0x03d }, + { -24, 7, 4, 0x07c }, + { 9, 7, 4, 0x07d }, + { -25, 7, jbig2HuffmanLOW, 0x07e }, + { 25, 7, 32, 0x07f }, + { 0, 0, jbig2HuffmanEOT, 0 } +}; + +//------------------------------------------------------------------------ +// JBIG2HuffmanDecoder +//------------------------------------------------------------------------ + +class JBIG2HuffmanDecoder { +public: + + JBIG2HuffmanDecoder(); + ~JBIG2HuffmanDecoder(); + void setStream(Stream *strA) { str = strA; } + + void reset(); + + // Returns false for OOB, otherwise sets * and returns true. + GBool decodeInt(int *x, JBIG2HuffmanTable *table); + + Guint readBits(Guint n); + Guint readBit(); + + // Sort the table by prefix length and assign prefix values. + void buildTable(JBIG2HuffmanTable *table, Guint len); + +private: + + Stream *str; + Guint buf; + Guint bufLen; +}; + +JBIG2HuffmanDecoder::JBIG2HuffmanDecoder() { + str = NULL; + reset(); +} + +JBIG2HuffmanDecoder::~JBIG2HuffmanDecoder() { +} + +void JBIG2HuffmanDecoder::reset() { + buf = 0; + bufLen = 0; +} + +//~ optimize this +GBool JBIG2HuffmanDecoder::decodeInt(int *x, JBIG2HuffmanTable *table) { + Guint i, len, prefix; + + i = 0; + len = 0; + prefix = 0; + while (table[i].rangeLen != jbig2HuffmanEOT) { + while (len < table[i].prefixLen) { + prefix = (prefix << 1) | readBit(); + ++len; + } + if (prefix == table[i].prefix) { + if (table[i].rangeLen == jbig2HuffmanOOB) { + return gFalse; + } + if (table[i].rangeLen == jbig2HuffmanLOW) { + *x = table[i].val - readBits(32); + } else if (table[i].rangeLen > 0) { + *x = table[i].val + readBits(table[i].rangeLen); + } else { + *x = table[i].val; + } + return gTrue; + } + ++i; + } + return gFalse; +} + +Guint JBIG2HuffmanDecoder::readBits(Guint n) { + Guint x, mask, nLeft; + + mask = (n == 32) ? 0xffffffff : ((1 << n) - 1); + if (bufLen >= n) { + x = (buf >> (bufLen - n)) & mask; + bufLen -= n; + } else { + x = buf & ((1 << bufLen) - 1); + nLeft = n - bufLen; + bufLen = 0; + while (nLeft >= 8) { + x = (x << 8) | (str->getChar() & 0xff); + nLeft -= 8; + } + if (nLeft > 0) { + buf = str->getChar(); + bufLen = 8 - nLeft; + x = (x << nLeft) | ((buf >> bufLen) & ((1 << nLeft) - 1)); + } + } + return x; +} + +Guint JBIG2HuffmanDecoder::readBit() { + if (bufLen == 0) { + buf = str->getChar(); + bufLen = 8; + } + --bufLen; + return (buf >> bufLen) & 1; +} + +void JBIG2HuffmanDecoder::buildTable(JBIG2HuffmanTable *table, Guint len) { + Guint i, j, k, prefix; + JBIG2HuffmanTable tab; + + // stable selection sort: + // - entries with prefixLen > 0, in ascending prefixLen order + // - entry with prefixLen = 0, rangeLen = EOT + // - all other entries with prefixLen = 0 + // (on entry, table[len] has prefixLen = 0, rangeLen = EOT) + for (i = 0; i < len; ++i) { + for (j = i; j < len && table[j].prefixLen == 0; ++j) ; + if (j == len) { + break; + } + for (k = j + 1; k < len; ++k) { + if (table[k].prefixLen > 0 && + table[k].prefixLen < table[j].prefixLen) { + j = k; + } + } + if (j != i) { + tab = table[j]; + for (k = j; k > i; --k) { + table[k] = table[k - 1]; + } + table[i] = tab; + } + } + table[i] = table[len]; + + // assign prefixes + if (table[0].rangeLen != jbig2HuffmanEOT) { + i = 0; + prefix = 0; + table[i++].prefix = prefix++; + for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { + prefix <<= table[i].prefixLen - table[i-1].prefixLen; + table[i].prefix = prefix++; + } + } +} + +//------------------------------------------------------------------------ +// JBIG2MMRDecoder +//------------------------------------------------------------------------ + +class JBIG2MMRDecoder { +public: + + JBIG2MMRDecoder(); + ~JBIG2MMRDecoder(); + void setStream(Stream *strA) { str = strA; } + void reset(); + int get2DCode(); + int getBlackCode(); + int getWhiteCode(); + Guint get24Bits(); + void skipTo(Guint length); + +private: + + Stream *str; + Guint buf; + Guint bufLen; + Guint nBytesRead; +}; + +JBIG2MMRDecoder::JBIG2MMRDecoder() { + str = NULL; + reset(); +} + +JBIG2MMRDecoder::~JBIG2MMRDecoder() { +} + +void JBIG2MMRDecoder::reset() { + buf = 0; + bufLen = 0; + nBytesRead = 0; +} + +int JBIG2MMRDecoder::get2DCode() { + const CCITTCode *p; + + if (bufLen == 0) { + buf = str->getChar() & 0xff; + bufLen = 8; + ++nBytesRead; + p = &twoDimTab1[(buf >> 1) & 0x7f]; + } else if (bufLen == 8) { + p = &twoDimTab1[(buf >> 1) & 0x7f]; + } else { + p = &twoDimTab1[(buf << (7 - bufLen)) & 0x7f]; + if (p->bits < 0 || p->bits > (int)bufLen) { + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + p = &twoDimTab1[(buf >> (bufLen - 7)) & 0x7f]; + } + } + if (p->bits < 0) { + error(str->getPos(), "Bad two dim code in JBIG2 MMR stream"); + return EOF; + } + bufLen -= p->bits; + return p->n; +} + +int JBIG2MMRDecoder::getWhiteCode() { + const CCITTCode *p; + Guint code; + + if (bufLen == 0) { + buf = str->getChar() & 0xff; + bufLen = 8; + ++nBytesRead; + } + while (1) { + if (bufLen >= 11 && ((buf >> (bufLen - 7)) & 0x7f) == 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { + code = buf >> (bufLen - 12); + } + p = &whiteTab1[code & 0x1f]; + } else { + if (bufLen <= 9) { + code = buf << (9 - bufLen); + } else { + code = buf >> (bufLen - 9); + } + p = &whiteTab2[code & 0x1ff]; + } + if (p->bits > 0 && p->bits <= (int)bufLen) { + bufLen -= p->bits; + return p->n; + } + if (bufLen >= 12) { + break; + } + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + } + error(str->getPos(), "Bad white code in JBIG2 MMR stream"); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + --bufLen; + return 1; +} + +int JBIG2MMRDecoder::getBlackCode() { + const CCITTCode *p; + Guint code; + + if (bufLen == 0) { + buf = str->getChar() & 0xff; + bufLen = 8; + ++nBytesRead; + } + while (1) { + if (bufLen >= 10 && ((buf >> (bufLen - 6)) & 0x3f) == 0) { + if (bufLen <= 13) { + code = buf << (13 - bufLen); + } else { + code = buf >> (bufLen - 13); + } + p = &blackTab1[code & 0x7f]; + } else if (bufLen >= 7 && ((buf >> (bufLen - 4)) & 0x0f) == 0 && + ((buf >> (bufLen - 6)) & 0x03) != 0) { + if (bufLen <= 12) { + code = buf << (12 - bufLen); + } else { + code = buf >> (bufLen - 12); + } + p = &blackTab2[(code & 0xff) - 64]; + } else { + if (bufLen <= 6) { + code = buf << (6 - bufLen); + } else { + code = buf >> (bufLen - 6); + } + p = &blackTab3[code & 0x3f]; + } + if (p->bits > 0 && p->bits <= (int)bufLen) { + bufLen -= p->bits; + return p->n; + } + if (bufLen >= 13) { + break; + } + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + } + error(str->getPos(), "Bad black code in JBIG2 MMR stream"); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + --bufLen; + return 1; +} + +Guint JBIG2MMRDecoder::get24Bits() { + while (bufLen < 24) { + buf = (buf << 8) | (str->getChar() & 0xff); + bufLen += 8; + ++nBytesRead; + } + return (buf >> (bufLen - 24)) & 0xffffff; +} + +void JBIG2MMRDecoder::skipTo(Guint length) { + while (nBytesRead < length) { + str->getChar(); + ++nBytesRead; + } +} + +//------------------------------------------------------------------------ +// JBIG2Segment +//------------------------------------------------------------------------ + +enum JBIG2SegmentType { + jbig2SegBitmap, + jbig2SegSymbolDict, + jbig2SegPatternDict, + jbig2SegCodeTable +}; + +class JBIG2Segment { +public: + + JBIG2Segment(Guint segNumA) { segNum = segNumA; } + virtual ~JBIG2Segment() {} + void setSegNum(Guint segNumA) { segNum = segNumA; } + Guint getSegNum() { return segNum; } + virtual JBIG2SegmentType getType() = 0; + +private: + + Guint segNum; +}; + +//------------------------------------------------------------------------ +// JBIG2Bitmap +//------------------------------------------------------------------------ + +struct JBIG2BitmapPtr { + Guchar *p; + int shift; + int x; +}; + +class JBIG2Bitmap: public JBIG2Segment { +public: + + JBIG2Bitmap(Guint segNumA, int wA, int hA); + virtual ~JBIG2Bitmap(); + virtual JBIG2SegmentType getType() { return jbig2SegBitmap; } + JBIG2Bitmap *copy() { return new JBIG2Bitmap(0, this); } + JBIG2Bitmap *getSlice(Guint x, Guint y, Guint wA, Guint hA); + void expand(int newH, Guint pixel); + void clearToZero(); + void clearToOne(); + int getWidth() { return w; } + int getHeight() { return h; } + int getPixel(int x, int y) + { return (x < 0 || x >= w || y < 0 || y >= h) ? 0 : + (data[y * line + (x >> 3)] >> (7 - (x & 7))) & 1; } + void setPixel(int x, int y) + { data[y * line + (x >> 3)] |= 1 << (7 - (x & 7)); } + void clearPixel(int x, int y) + { data[y * line + (x >> 3)] &= 0x7f7f >> (x & 7); } + void getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr); + int nextPixel(JBIG2BitmapPtr *ptr); + void duplicateRow(int yDest, int ySrc); + void combine(JBIG2Bitmap *bitmap, int x, int y, Guint combOp); + Guchar *getDataPtr() { return data; } + int getDataSize() { return h * line; } + GBool isOk() { return data != NULL; } + +private: + + JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap); + + int w, h, line; + Guchar *data; +}; + +JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, int wA, int hA): + JBIG2Segment(segNumA) +{ + w = wA; + h = hA; + line = (wA + 7) >> 3; + + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { + error(-1, "invalid width/height"); + data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); + data[h * line] = 0; +} + +JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap): + JBIG2Segment(segNumA) +{ + w = bitmap->w; + h = bitmap->h; + line = bitmap->line; + + if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { + error(-1, "invalid width/height"); + data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)gmalloc(h * line + 1); + memcpy(data, bitmap->data, h * line); + data[h * line] = 0; +} + +JBIG2Bitmap::~JBIG2Bitmap() { + gfree(data); +} + +//~ optimize this +JBIG2Bitmap *JBIG2Bitmap::getSlice(Guint x, Guint y, Guint wA, Guint hA) { + JBIG2Bitmap *slice; + Guint xx, yy; + + slice = new JBIG2Bitmap(0, wA, hA); + slice->clearToZero(); + for (yy = 0; yy < hA; ++yy) { + for (xx = 0; xx < wA; ++xx) { + if (getPixel(x + xx, y + yy)) { + slice->setPixel(xx, yy); + } + } + } + return slice; +} + +void JBIG2Bitmap::expand(int newH, Guint pixel) { + if (newH <= h || line <= 0 || newH >= (INT_MAX - 1) / line) { + error(-1, "invalid width/height"); + gfree(data); + data = NULL; + return; + } + // need to allocate one extra guard byte for use in combine() + data = (Guchar *)grealloc(data, newH * line + 1); + if (pixel) { + memset(data + h * line, 0xff, (newH - h) * line); + } else { + memset(data + h * line, 0x00, (newH - h) * line); + } + h = newH; + data[h * line] = 0; +} + +void JBIG2Bitmap::clearToZero() { + memset(data, 0, h * line); +} + +void JBIG2Bitmap::clearToOne() { + memset(data, 0xff, h * line); +} + +inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) { + if (y < 0 || y >= h || x >= w) { + ptr->p = NULL; + ptr->shift = 0; // make gcc happy + ptr->x = 0; // make gcc happy + } else if (x < 0) { + ptr->p = &data[y * line]; + ptr->shift = 7; + ptr->x = x; + } else { + ptr->p = &data[y * line + (x >> 3)]; + ptr->shift = 7 - (x & 7); + ptr->x = x; + } +} + +inline int JBIG2Bitmap::nextPixel(JBIG2BitmapPtr *ptr) { + int pix; + + if (!ptr->p) { + pix = 0; + } else if (ptr->x < 0) { + ++ptr->x; + pix = 0; + } else { + pix = (*ptr->p >> ptr->shift) & 1; + if (++ptr->x == w) { + ptr->p = NULL; + } else if (ptr->shift == 0) { + ++ptr->p; + ptr->shift = 7; + } else { + --ptr->shift; + } + } + return pix; +} + +void JBIG2Bitmap::duplicateRow(int yDest, int ySrc) { + memcpy(data + yDest * line, data + ySrc * line, line); +} + +void JBIG2Bitmap::combine(JBIG2Bitmap *bitmap, int x, int y, + Guint combOp) { + int x0, x1, y0, y1, xx, yy; + Guchar *srcPtr, *destPtr; + Guint src0, src1, src, dest, s1, s2, m1, m2, m3; + GBool oneByte; + + // check for the pathological case where y = -2^31 + if (y < -0x7fffffff) { + return; + } + if (y < 0) { + y0 = -y; + } else { + y0 = 0; + } + if (y + bitmap->h > h) { + y1 = h - y; + } else { + y1 = bitmap->h; + } + if (y0 >= y1) { + return; + } + + if (x >= 0) { + x0 = x & ~7; + } else { + x0 = 0; + } + x1 = x + bitmap->w; + if (x1 > w) { + x1 = w; + } + if (x0 >= x1) { + return; + } + + s1 = x & 7; + s2 = 8 - s1; + m1 = 0xff >> (x1 & 7); + m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); + m3 = (0xff >> s1) & m2; + + oneByte = x0 == ((x1 - 1) & ~7); + + for (yy = y0; yy < y1; ++yy) { + + // one byte per line -- need to mask both left and right side + if (oneByte) { + if (x >= 0) { + destPtr = data + (y + yy) * line + (x >> 3); + srcPtr = bitmap->data + yy * bitmap->line; + dest = *destPtr; + src1 = *srcPtr; + switch (combOp) { + case 0: // or + dest |= (src1 >> s1) & m2; + break; + case 1: // and + dest &= ((0xff00 | src1) >> s1) | m1; + break; + case 2: // xor + dest ^= (src1 >> s1) & m2; + break; + case 3: // xnor + dest ^= ((src1 ^ 0xff) >> s1) & m2; + break; + case 4: // replace + dest = (dest & ~m3) | ((src1 >> s1) & m3); + break; + } + *destPtr = dest; + } else { + destPtr = data + (y + yy) * line; + srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); + dest = *destPtr; + src1 = *srcPtr; + switch (combOp) { + case 0: // or + dest |= src1 & m2; + break; + case 1: // and + dest &= src1 | m1; + break; + case 2: // xor + dest ^= src1 & m2; + break; + case 3: // xnor + dest ^= (src1 ^ 0xff) & m2; + break; + case 4: // replace + dest = (src1 & m2) | (dest & m1); + break; + } + *destPtr = dest; + } + + // multiple bytes per line -- need to mask left side of left-most + // byte and right side of right-most byte + } else { + + // left-most byte + if (x >= 0) { + destPtr = data + (y + yy) * line + (x >> 3); + srcPtr = bitmap->data + yy * bitmap->line; + src1 = *srcPtr++; + dest = *destPtr; + switch (combOp) { + case 0: // or + dest |= src1 >> s1; + break; + case 1: // and + dest &= (0xff00 | src1) >> s1; + break; + case 2: // xor + dest ^= src1 >> s1; + break; + case 3: // xnor + dest ^= (src1 ^ 0xff) >> s1; + break; + case 4: // replace + dest = (dest & (0xff << s2)) | (src1 >> s1); + break; + } + *destPtr++ = dest; + xx = x0 + 8; + } else { + destPtr = data + (y + yy) * line; + srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + } + + // middle bytes + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + switch (combOp) { + case 0: // or + dest |= src; + break; + case 1: // and + dest &= src; + break; + case 2: // xor + dest ^= src; + break; + case 3: // xnor + dest ^= src ^ 0xff; + break; + case 4: // replace + dest = src; + break; + } + *destPtr++ = dest; + } + + // right-most byte + // note: this last byte (src1) may not actually be used, depending + // on the values of s1, m1, and m2 - and in fact, it may be off + // the edge of the source bitmap, which means we need to allocate + // one extra guard byte at the end of each bitmap + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + switch (combOp) { + case 0: // or + dest |= src & m2; + break; + case 1: // and + dest &= src | m1; + break; + case 2: // xor + dest ^= src & m2; + break; + case 3: // xnor + dest ^= (src ^ 0xff) & m2; + break; + case 4: // replace + dest = (src & m2) | (dest & m1); + break; + } + *destPtr = dest; + } + } +} + +//------------------------------------------------------------------------ +// JBIG2SymbolDict +//------------------------------------------------------------------------ + +class JBIG2SymbolDict: public JBIG2Segment { +public: + + JBIG2SymbolDict(Guint segNumA, Guint sizeA); + virtual ~JBIG2SymbolDict(); + virtual JBIG2SegmentType getType() { return jbig2SegSymbolDict; } + Guint getSize() { return size; } + void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } + JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } + GBool isOk() { return bitmaps != NULL; } + void setGenericRegionStats(JArithmeticDecoderStats *stats) + { genericRegionStats = stats; } + void setRefinementRegionStats(JArithmeticDecoderStats *stats) + { refinementRegionStats = stats; } + JArithmeticDecoderStats *getGenericRegionStats() + { return genericRegionStats; } + JArithmeticDecoderStats *getRefinementRegionStats() + { return refinementRegionStats; } + +private: + + Guint size; + JBIG2Bitmap **bitmaps; + JArithmeticDecoderStats *genericRegionStats; + JArithmeticDecoderStats *refinementRegionStats; +}; + +JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA): + JBIG2Segment(segNumA) +{ + size = sizeA; + bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); + if (!bitmaps) size = 0; + genericRegionStats = NULL; + refinementRegionStats = NULL; +} + +JBIG2SymbolDict::~JBIG2SymbolDict() { + Guint i; + + for (i = 0; i < size; ++i) { + delete bitmaps[i]; + } + gfree(bitmaps); + if (genericRegionStats) { + delete genericRegionStats; + } + if (refinementRegionStats) { + delete refinementRegionStats; + } +} + +//------------------------------------------------------------------------ +// JBIG2PatternDict +//------------------------------------------------------------------------ + +class JBIG2PatternDict: public JBIG2Segment { +public: + + JBIG2PatternDict(Guint segNumA, Guint sizeA); + virtual ~JBIG2PatternDict(); + virtual JBIG2SegmentType getType() { return jbig2SegPatternDict; } + Guint getSize() { return size; } + void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } + JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } + +private: + + Guint size; + JBIG2Bitmap **bitmaps; +}; + +JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA): + JBIG2Segment(segNumA) +{ + size = sizeA; + bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); +} + +JBIG2PatternDict::~JBIG2PatternDict() { + Guint i; + + for (i = 0; i < size; ++i) { + delete bitmaps[i]; + } + gfree(bitmaps); +} + +//------------------------------------------------------------------------ +// JBIG2CodeTable +//------------------------------------------------------------------------ + +class JBIG2CodeTable: public JBIG2Segment { +public: + + JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA); + virtual ~JBIG2CodeTable(); + virtual JBIG2SegmentType getType() { return jbig2SegCodeTable; } + JBIG2HuffmanTable *getHuffTable() { return table; } + +private: + + JBIG2HuffmanTable *table; +}; + +JBIG2CodeTable::JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA): + JBIG2Segment(segNumA) +{ + table = tableA; +} + +JBIG2CodeTable::~JBIG2CodeTable() { + gfree(table); +} + +//------------------------------------------------------------------------ +// JBIG2Stream +//------------------------------------------------------------------------ + +JBIG2Stream::JBIG2Stream(Stream *strA, Object *globalsStreamA): + FilterStream(strA) +{ + pageBitmap = NULL; + + arithDecoder = new JArithmeticDecoder(); + genericRegionStats = new JArithmeticDecoderStats(1 << 1); + refinementRegionStats = new JArithmeticDecoderStats(1 << 1); + iadhStats = new JArithmeticDecoderStats(1 << 9); + iadwStats = new JArithmeticDecoderStats(1 << 9); + iaexStats = new JArithmeticDecoderStats(1 << 9); + iaaiStats = new JArithmeticDecoderStats(1 << 9); + iadtStats = new JArithmeticDecoderStats(1 << 9); + iaitStats = new JArithmeticDecoderStats(1 << 9); + iafsStats = new JArithmeticDecoderStats(1 << 9); + iadsStats = new JArithmeticDecoderStats(1 << 9); + iardxStats = new JArithmeticDecoderStats(1 << 9); + iardyStats = new JArithmeticDecoderStats(1 << 9); + iardwStats = new JArithmeticDecoderStats(1 << 9); + iardhStats = new JArithmeticDecoderStats(1 << 9); + iariStats = new JArithmeticDecoderStats(1 << 9); + iaidStats = new JArithmeticDecoderStats(1 << 1); + huffDecoder = new JBIG2HuffmanDecoder(); + mmrDecoder = new JBIG2MMRDecoder(); + + globalsStreamA->copy(&globalsStream); + segments = globalSegments = NULL; + curStr = NULL; + dataPtr = dataEnd = NULL; +} + +JBIG2Stream::~JBIG2Stream() { + close(); + globalsStream.free(); + delete arithDecoder; + delete genericRegionStats; + delete refinementRegionStats; + delete iadhStats; + delete iadwStats; + delete iaexStats; + delete iaaiStats; + delete iadtStats; + delete iaitStats; + delete iafsStats; + delete iadsStats; + delete iardxStats; + delete iardyStats; + delete iardwStats; + delete iardhStats; + delete iariStats; + delete iaidStats; + delete huffDecoder; + delete mmrDecoder; + delete str; +} + +void JBIG2Stream::reset() { + // read the globals stream + globalSegments = new GList(); + if (globalsStream.isStream()) { + segments = globalSegments; + curStr = globalsStream.getStream(); + curStr->reset(); + arithDecoder->setStream(curStr); + huffDecoder->setStream(curStr); + mmrDecoder->setStream(curStr); + readSegments(); + curStr->close(); + } + + // read the main stream + segments = new GList(); + curStr = str; + curStr->reset(); + arithDecoder->setStream(curStr); + huffDecoder->setStream(curStr); + mmrDecoder->setStream(curStr); + readSegments(); + + if (pageBitmap) { + dataPtr = pageBitmap->getDataPtr(); + dataEnd = dataPtr + pageBitmap->getDataSize(); + } else { + dataPtr = dataEnd = NULL; + } +} + +void JBIG2Stream::close() { + if (pageBitmap) { + delete pageBitmap; + pageBitmap = NULL; + } + if (segments) { + deleteGList(segments, JBIG2Segment); + segments = NULL; + } + if (globalSegments) { + deleteGList(globalSegments, JBIG2Segment); + globalSegments = NULL; + } + dataPtr = dataEnd = NULL; + FilterStream::close(); +} + +int JBIG2Stream::getChar() { + if (dataPtr && dataPtr < dataEnd) { + return (*dataPtr++ ^ 0xff) & 0xff; + } + return EOF; +} + +int JBIG2Stream::lookChar() { + if (dataPtr && dataPtr < dataEnd) { + return (*dataPtr ^ 0xff) & 0xff; + } + return EOF; +} + +GString *JBIG2Stream::getPSFilter(int psLevel, char *indent) { + return NULL; +} + +GBool JBIG2Stream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void JBIG2Stream::readSegments() { + Guint segNum, segFlags, segType, page, segLength; + Guint refFlags, nRefSegs; + Guint *refSegs; + int segDataPos; + int c1, c2, c3; + Guint i; + + while (readULong(&segNum)) { + + // segment header flags + if (!readUByte(&segFlags)) { + goto eofError1; + } + segType = segFlags & 0x3f; + + // referred-to segment count and retention flags + if (!readUByte(&refFlags)) { + goto eofError1; + } + nRefSegs = refFlags >> 5; + if (nRefSegs == 7) { + if ((c1 = curStr->getChar()) == EOF || + (c2 = curStr->getChar()) == EOF || + (c3 = curStr->getChar()) == EOF) { + goto eofError1; + } + refFlags = (refFlags << 24) | (c1 << 16) | (c2 << 8) | c3; + nRefSegs = refFlags & 0x1fffffff; + for (i = 0; i < (nRefSegs + 9) >> 3; ++i) { + c1 = curStr->getChar(); + } + } + + // referred-to segment numbers + refSegs = (Guint *)gmallocn(nRefSegs, sizeof(Guint)); + if (segNum <= 256) { + for (i = 0; i < nRefSegs; ++i) { + if (!readUByte(&refSegs[i])) { + goto eofError2; + } + } + } else if (segNum <= 65536) { + for (i = 0; i < nRefSegs; ++i) { + if (!readUWord(&refSegs[i])) { + goto eofError2; + } + } + } else { + for (i = 0; i < nRefSegs; ++i) { + if (!readULong(&refSegs[i])) { + goto eofError2; + } + } + } + + // segment page association + if (segFlags & 0x40) { + if (!readULong(&page)) { + goto eofError2; + } + } else { + if (!readUByte(&page)) { + goto eofError2; + } + } + + // segment data length + if (!readULong(&segLength)) { + goto eofError2; + } + + // keep track of the start of the segment data + segDataPos = getPos(); + + // check for missing page information segment + if (!pageBitmap && ((segType >= 4 && segType <= 7) || + (segType >= 20 && segType <= 43))) { + error(getPos(), "First JBIG2 segment associated with a page must be a page information segment"); + goto syntaxError; + } + + // read the segment data + switch (segType) { + case 0: + if (!readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs)) { + goto syntaxError; + } + break; + case 4: + readTextRegionSeg(segNum, gFalse, gFalse, segLength, refSegs, nRefSegs); + break; + case 6: + readTextRegionSeg(segNum, gTrue, gFalse, segLength, refSegs, nRefSegs); + break; + case 7: + readTextRegionSeg(segNum, gTrue, gTrue, segLength, refSegs, nRefSegs); + break; + case 16: + readPatternDictSeg(segNum, segLength); + break; + case 20: + readHalftoneRegionSeg(segNum, gFalse, gFalse, segLength, + refSegs, nRefSegs); + break; + case 22: + readHalftoneRegionSeg(segNum, gTrue, gFalse, segLength, + refSegs, nRefSegs); + break; + case 23: + readHalftoneRegionSeg(segNum, gTrue, gTrue, segLength, + refSegs, nRefSegs); + break; + case 36: + readGenericRegionSeg(segNum, gFalse, gFalse, segLength); + break; + case 38: + readGenericRegionSeg(segNum, gTrue, gFalse, segLength); + break; + case 39: + readGenericRegionSeg(segNum, gTrue, gTrue, segLength); + break; + case 40: + readGenericRefinementRegionSeg(segNum, gFalse, gFalse, segLength, + refSegs, nRefSegs); + break; + case 42: + readGenericRefinementRegionSeg(segNum, gTrue, gFalse, segLength, + refSegs, nRefSegs); + break; + case 43: + readGenericRefinementRegionSeg(segNum, gTrue, gTrue, segLength, + refSegs, nRefSegs); + break; + case 48: + readPageInfoSeg(segLength); + break; + case 50: + readEndOfStripeSeg(segLength); + break; + case 52: + readProfilesSeg(segLength); + break; + case 53: + readCodeTableSeg(segNum, segLength); + break; + case 62: + readExtensionSeg(segLength); + break; + default: + error(getPos(), "Unknown segment type in JBIG2 stream"); + for (i = 0; i < segLength; ++i) { + if ((c1 = curStr->getChar()) == EOF) { + goto eofError2; + } + } + break; + } + + // Make sure the segment handler read all of the bytes in the + // segment data, unless this segment is marked as having an + // unknown length (section 7.2.7 of the JBIG2 Final Committee Draft) + + if (segLength != 0xffffffff) { + + int segExtraBytes = segDataPos + segLength - getPos(); + if (segExtraBytes > 0) { + + // If we didn't read all of the bytes in the segment data, + // indicate an error, and throw away the rest of the data. + + // v.3.1.01.13 of the LuraTech PDF Compressor Server will + // sometimes generate an extraneous NULL byte at the end of + // arithmetic-coded symbol dictionary segments when numNewSyms + // == 0. Segments like this often occur for blank pages. + + error(getPos(), "%d extraneous byte%s after segment", + segExtraBytes, (segExtraBytes > 1) ? "s" : ""); + + // Burn through the remaining bytes -- inefficient, but + // hopefully we're not doing this much + + int trash; + for (int i = segExtraBytes; i > 0; i--) { + readByte(&trash); + } + + } else if (segExtraBytes < 0) { + + // If we read more bytes than we should have, according to the + // segment length field, note an error. + + error(getPos(), "Previous segment handler read too many bytes"); + + } + + } + + gfree(refSegs); + } + + return; + + syntaxError: + gfree(refSegs); + return; + + eofError2: + gfree(refSegs); + eofError1: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +GBool JBIG2Stream::readSymbolDictSeg(Guint segNum, Guint length, + Guint *refSegs, Guint nRefSegs) { + JBIG2SymbolDict *symbolDict; + JBIG2HuffmanTable *huffDHTable, *huffDWTable; + JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable; + JBIG2Segment *seg; + GList *codeTables; + JBIG2SymbolDict *inputSymbolDict; + Guint flags, sdTemplate, sdrTemplate, huff, refAgg; + Guint huffDH, huffDW, huffBMSize, huffAggInst; + Guint contextUsed, contextRetained; + int sdATX[4], sdATY[4], sdrATX[2], sdrATY[2]; + Guint numExSyms, numNewSyms, numInputSyms, symCodeLen; + JBIG2Bitmap **bitmaps; + JBIG2Bitmap *collBitmap, *refBitmap; + Guint *symWidths; + Guint symHeight, symWidth, totalWidth, x, symID; + int dh, dw, refAggNum, refDX, refDY, bmSize; + GBool ex; + int run, cnt; + Guint i, j, k; + Guchar *p; + + symWidths = NULL; + + // symbol dictionary flags + if (!readUWord(&flags)) { + goto eofError; + } + sdTemplate = (flags >> 10) & 3; + sdrTemplate = (flags >> 12) & 1; + huff = flags & 1; + refAgg = (flags >> 1) & 1; + huffDH = (flags >> 2) & 3; + huffDW = (flags >> 4) & 3; + huffBMSize = (flags >> 6) & 1; + huffAggInst = (flags >> 7) & 1; + contextUsed = (flags >> 8) & 1; + contextRetained = (flags >> 9) & 1; + + // symbol dictionary AT flags + if (!huff) { + if (sdTemplate == 0) { + if (!readByte(&sdATX[0]) || + !readByte(&sdATY[0]) || + !readByte(&sdATX[1]) || + !readByte(&sdATY[1]) || + !readByte(&sdATX[2]) || + !readByte(&sdATY[2]) || + !readByte(&sdATX[3]) || + !readByte(&sdATY[3])) { + goto eofError; + } + } else { + if (!readByte(&sdATX[0]) || + !readByte(&sdATY[0])) { + goto eofError; + } + } + } + + // symbol dictionary refinement AT flags + if (refAgg && !sdrTemplate) { + if (!readByte(&sdrATX[0]) || + !readByte(&sdrATY[0]) || + !readByte(&sdrATX[1]) || + !readByte(&sdrATY[1])) { + goto eofError; + } + } + + // SDNUMEXSYMS and SDNUMNEWSYMS + if (!readULong(&numExSyms) || !readULong(&numNewSyms)) { + goto eofError; + } + + // get referenced segments: input symbol dictionaries and code tables + codeTables = new GList(); + numInputSyms = 0; + for (i = 0; i < nRefSegs; ++i) { + // This is need by bug 12014, returning gFalse makes it not crash + // but we end up with a empty page while acroread is able to render + // part of it + if ((seg = findSegment(refSegs[i]))) { + if (seg->getType() == jbig2SegSymbolDict) { + j = ((JBIG2SymbolDict *)seg)->getSize(); + if (numInputSyms > UINT_MAX - j) { + error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); + delete codeTables; + goto eofError; + } + numInputSyms += j; + } else if (seg->getType() == jbig2SegCodeTable) { + codeTables->append(seg); + } + } else { + delete codeTables; + return gFalse; + } + } + if (numInputSyms > UINT_MAX - numNewSyms) { + error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); + delete codeTables; + goto eofError; + } + + // compute symbol code length + symCodeLen = 0; + i = 1; + while (i < numInputSyms + numNewSyms) { + ++symCodeLen; + i <<= 1; + } + if (huff && symCodeLen == 0) { + symCodeLen = 1; + } + + // get the input symbol bitmaps + bitmaps = (JBIG2Bitmap **)gmallocn(numInputSyms + numNewSyms, + sizeof(JBIG2Bitmap *)); + for (i = 0; i < numInputSyms + numNewSyms; ++i) { + bitmaps[i] = NULL; + } + k = 0; + inputSymbolDict = NULL; + for (i = 0; i < nRefSegs; ++i) { + seg = findSegment(refSegs[i]); + if (seg != NULL && seg->getType() == jbig2SegSymbolDict) { + inputSymbolDict = (JBIG2SymbolDict *)seg; + for (j = 0; j < inputSymbolDict->getSize(); ++j) { + bitmaps[k++] = inputSymbolDict->getBitmap(j); + } + } + } + + // get the Huffman tables + huffDHTable = huffDWTable = NULL; // make gcc happy + huffBMSizeTable = huffAggInstTable = NULL; // make gcc happy + i = 0; + if (huff) { + if (huffDH == 0) { + huffDHTable = huffTableD; + } else if (huffDH == 1) { + huffDHTable = huffTableE; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDW == 0) { + huffDWTable = huffTableB; + } else if (huffDW == 1) { + huffDWTable = huffTableC; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffBMSize == 0) { + huffBMSizeTable = huffTableA; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffBMSizeTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffAggInst == 0) { + huffAggInstTable = huffTableA; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffAggInstTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + } + delete codeTables; + + // set up the Huffman decoder + if (huff) { + huffDecoder->reset(); + + // set up the arithmetic decoder + } else { + if (contextUsed && inputSymbolDict) { + resetGenericStats(sdTemplate, inputSymbolDict->getGenericRegionStats()); + } else { + resetGenericStats(sdTemplate, NULL); + } + resetIntStats(symCodeLen); + arithDecoder->start(); + } + + // set up the arithmetic decoder for refinement/aggregation + if (refAgg) { + if (contextUsed && inputSymbolDict) { + resetRefinementStats(sdrTemplate, + inputSymbolDict->getRefinementRegionStats()); + } else { + resetRefinementStats(sdrTemplate, NULL); + } + } + + // allocate symbol widths storage + if (huff && !refAgg) { + symWidths = (Guint *)gmallocn(numNewSyms, sizeof(Guint)); + } + + symHeight = 0; + i = 0; + while (i < numNewSyms) { + + // read the height class delta height + if (huff) { + huffDecoder->decodeInt(&dh, huffDHTable); + } else { + arithDecoder->decodeInt(&dh, iadhStats); + } + if (dh < 0 && (Guint)-dh >= symHeight) { + error(getPos(), "Bad delta-height value in JBIG2 symbol dictionary"); + goto syntaxError; + } + symHeight += dh; + symWidth = 0; + totalWidth = 0; + j = i; + + // read the symbols in this height class + while (1) { + + // read the delta width + if (huff) { + if (!huffDecoder->decodeInt(&dw, huffDWTable)) { + break; + } + } else { + if (!arithDecoder->decodeInt(&dw, iadwStats)) { + break; + } + } + if (dw < 0 && (Guint)-dw >= symWidth) { + error(getPos(), "Bad delta-height value in JBIG2 symbol dictionary"); + goto syntaxError; + } + symWidth += dw; + if (i >= numNewSyms) { + error(getPos(), "Too many symbols in JBIG2 symbol dictionary"); + goto syntaxError; + } + + // using a collective bitmap, so don't read a bitmap here + if (huff && !refAgg) { + symWidths[i] = symWidth; + totalWidth += symWidth; + + // refinement/aggregate coding + } else if (refAgg) { + if (huff) { + if (!huffDecoder->decodeInt(&refAggNum, huffAggInstTable)) { + break; + } + } else { + if (!arithDecoder->decodeInt(&refAggNum, iaaiStats)) { + break; + } + } +#if 0 //~ This special case was added about a year before the final draft + //~ of the JBIG2 spec was released. I have encountered some old + //~ JBIG2 images that predate it. + if (0) { +#else + if (refAggNum == 1) { +#endif + if (huff) { + symID = huffDecoder->readBits(symCodeLen); + huffDecoder->decodeInt(&refDX, huffTableO); + huffDecoder->decodeInt(&refDY, huffTableO); + huffDecoder->decodeInt(&bmSize, huffTableA); + huffDecoder->reset(); + arithDecoder->start(); + } else { + symID = arithDecoder->decodeIAID(symCodeLen, iaidStats); + arithDecoder->decodeInt(&refDX, iardxStats); + arithDecoder->decodeInt(&refDY, iardyStats); + } + if (symID >= numInputSyms + i) { + error(getPos(), "Invalid symbol ID in JBIG2 symbol dictionary"); + goto syntaxError; + } + refBitmap = bitmaps[symID]; + bitmaps[numInputSyms + i] = + readGenericRefinementRegion(symWidth, symHeight, + sdrTemplate, gFalse, + refBitmap, refDX, refDY, + sdrATX, sdrATY); + //~ do we need to use the bmSize value here (in Huffman mode)? + } else { + bitmaps[numInputSyms + i] = + readTextRegion(huff, gTrue, symWidth, symHeight, + refAggNum, 0, numInputSyms + i, NULL, + symCodeLen, bitmaps, 0, 0, 0, 1, 0, + huffTableF, huffTableH, huffTableK, huffTableO, + huffTableO, huffTableO, huffTableO, huffTableA, + sdrTemplate, sdrATX, sdrATY); + } + + // non-ref/agg coding + } else { + bitmaps[numInputSyms + i] = + readGenericBitmap(gFalse, symWidth, symHeight, + sdTemplate, gFalse, gFalse, NULL, + sdATX, sdATY, 0); + } + + ++i; + } + + // read the collective bitmap + if (huff && !refAgg) { + huffDecoder->decodeInt(&bmSize, huffBMSizeTable); + huffDecoder->reset(); + if (bmSize == 0) { + collBitmap = new JBIG2Bitmap(0, totalWidth, symHeight); + bmSize = symHeight * ((totalWidth + 7) >> 3); + p = collBitmap->getDataPtr(); + for (k = 0; k < (Guint)bmSize; ++k) { + *p++ = curStr->getChar(); + } + } else { + collBitmap = readGenericBitmap(gTrue, totalWidth, symHeight, + 0, gFalse, gFalse, NULL, NULL, NULL, + bmSize); + } + x = 0; + for (; j < i; ++j) { + bitmaps[numInputSyms + j] = + collBitmap->getSlice(x, 0, symWidths[j], symHeight); + x += symWidths[j]; + } + delete collBitmap; + } + } + + // create the symbol dict object + symbolDict = new JBIG2SymbolDict(segNum, numExSyms); + if (!symbolDict->isOk()) { + delete symbolDict; + goto syntaxError; + } + + // exported symbol list + i = j = 0; + ex = gFalse; + while (i < numInputSyms + numNewSyms) { + if (huff) { + huffDecoder->decodeInt(&run, huffTableA); + } else { + arithDecoder->decodeInt(&run, iaexStats); + } + if (i + run > numInputSyms + numNewSyms || + (ex && j + run > numExSyms)) { + error(getPos(), "Too many exported symbols in JBIG2 symbol dictionary"); + for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL); + delete symbolDict; + goto syntaxError; + } + if (ex) { + for (cnt = 0; cnt < run; ++cnt) { + symbolDict->setBitmap(j++, bitmaps[i++]->copy()); + } + } else { + i += run; + } + ex = !ex; + } + if (j != numExSyms) { + error(getPos(), "Too few symbols in JBIG2 symbol dictionary"); + for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL); + delete symbolDict; + goto syntaxError; + } + + for (i = 0; i < numNewSyms; ++i) { + delete bitmaps[numInputSyms + i]; + } + gfree(bitmaps); + if (symWidths) { + gfree(symWidths); + } + + // save the arithmetic decoder stats + if (!huff && contextRetained) { + symbolDict->setGenericRegionStats(genericRegionStats->copy()); + if (refAgg) { + symbolDict->setRefinementRegionStats(refinementRegionStats->copy()); + } + } + + // store the new symbol dict + segments->append(symbolDict); + + return gTrue; + + codeTableError: + error(getPos(), "Missing code table in JBIG2 symbol dictionary"); + delete codeTables; + + syntaxError: + for (i = 0; i < numNewSyms; ++i) { + if (bitmaps[numInputSyms + i]) { + delete bitmaps[numInputSyms + i]; + } + } + gfree(bitmaps); + if (symWidths) { + gfree(symWidths); + } + return gFalse; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); + return gFalse; +} + +void JBIG2Stream::readTextRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs) { + JBIG2Bitmap *bitmap; + JBIG2HuffmanTable runLengthTab[36]; + JBIG2HuffmanTable *symCodeTab; + JBIG2HuffmanTable *huffFSTable, *huffDSTable, *huffDTTable; + JBIG2HuffmanTable *huffRDWTable, *huffRDHTable; + JBIG2HuffmanTable *huffRDXTable, *huffRDYTable, *huffRSizeTable; + JBIG2Segment *seg; + GList *codeTables; + JBIG2SymbolDict *symbolDict; + JBIG2Bitmap **syms; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, huff, refine, logStrips, refCorner, transposed; + Guint combOp, defPixel, templ; + int sOffset; + Guint huffFlags, huffFS, huffDS, huffDT; + Guint huffRDW, huffRDH, huffRDX, huffRDY, huffRSize; + Guint numInstances, numSyms, symCodeLen; + int atx[2], aty[2]; + Guint i, k, kk; + int j; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the text region header + if (!readUWord(&flags)) { + goto eofError; + } + huff = flags & 1; + refine = (flags >> 1) & 1; + logStrips = (flags >> 2) & 3; + refCorner = (flags >> 4) & 3; + transposed = (flags >> 6) & 1; + combOp = (flags >> 7) & 3; + defPixel = (flags >> 9) & 1; + sOffset = (flags >> 10) & 0x1f; + if (sOffset & 0x10) { + sOffset |= -1 - 0x0f; + } + templ = (flags >> 15) & 1; + huffFS = huffDS = huffDT = 0; // make gcc happy + huffRDW = huffRDH = huffRDX = huffRDY = huffRSize = 0; // make gcc happy + if (huff) { + if (!readUWord(&huffFlags)) { + goto eofError; + } + huffFS = huffFlags & 3; + huffDS = (huffFlags >> 2) & 3; + huffDT = (huffFlags >> 4) & 3; + huffRDW = (huffFlags >> 6) & 3; + huffRDH = (huffFlags >> 8) & 3; + huffRDX = (huffFlags >> 10) & 3; + huffRDY = (huffFlags >> 12) & 3; + huffRSize = (huffFlags >> 14) & 1; + } + if (refine && templ == 0) { + if (!readByte(&atx[0]) || !readByte(&aty[0]) || + !readByte(&atx[1]) || !readByte(&aty[1])) { + goto eofError; + } + } + if (!readULong(&numInstances)) { + goto eofError; + } + + // get symbol dictionaries and tables + codeTables = new GList(); + numSyms = 0; + for (i = 0; i < nRefSegs; ++i) { + if ((seg = findSegment(refSegs[i]))) { + if (seg->getType() == jbig2SegSymbolDict) { + numSyms += ((JBIG2SymbolDict *)seg)->getSize(); + } else if (seg->getType() == jbig2SegCodeTable) { + codeTables->append(seg); + } + } else { + error(getPos(), "Invalid segment reference in JBIG2 text region"); + delete codeTables; + return; + } + } + symCodeLen = 0; + i = 1; + while (i < numSyms) { + ++symCodeLen; + i <<= 1; + } + if (huff && symCodeLen == 0) { + symCodeLen = 1; + } + + // get the symbol bitmaps + syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *)); + kk = 0; + for (i = 0; i < nRefSegs; ++i) { + if ((seg = findSegment(refSegs[i]))) { + if (seg->getType() == jbig2SegSymbolDict) { + symbolDict = (JBIG2SymbolDict *)seg; + for (k = 0; k < symbolDict->getSize(); ++k) { + syms[kk++] = symbolDict->getBitmap(k); + } + } + } + } + + // get the Huffman tables + huffFSTable = huffDSTable = huffDTTable = NULL; // make gcc happy + huffRDWTable = huffRDHTable = NULL; // make gcc happy + huffRDXTable = huffRDYTable = huffRSizeTable = NULL; // make gcc happy + i = 0; + if (huff) { + if (huffFS == 0) { + huffFSTable = huffTableF; + } else if (huffFS == 1) { + huffFSTable = huffTableG; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDS == 0) { + huffDSTable = huffTableH; + } else if (huffDS == 1) { + huffDSTable = huffTableI; + } else if (huffDS == 2) { + huffDSTable = huffTableJ; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffDT == 0) { + huffDTTable = huffTableK; + } else if (huffDT == 1) { + huffDTTable = huffTableL; + } else if (huffDT == 2) { + huffDTTable = huffTableM; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDW == 0) { + huffRDWTable = huffTableN; + } else if (huffRDW == 1) { + huffRDWTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDH == 0) { + huffRDHTable = huffTableN; + } else if (huffRDH == 1) { + huffRDHTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDX == 0) { + huffRDXTable = huffTableN; + } else if (huffRDX == 1) { + huffRDXTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRDY == 0) { + huffRDYTable = huffTableN; + } else if (huffRDY == 1) { + huffRDYTable = huffTableO; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + if (huffRSize == 0) { + huffRSizeTable = huffTableA; + } else { + if (i >= (Guint)codeTables->getLength()) { + goto codeTableError; + } + huffRSizeTable = + ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); + } + } + delete codeTables; + + // symbol ID Huffman decoding table + if (huff) { + huffDecoder->reset(); + for (i = 0; i < 32; ++i) { + runLengthTab[i].val = i; + runLengthTab[i].prefixLen = huffDecoder->readBits(4); + runLengthTab[i].rangeLen = 0; + } + runLengthTab[32].val = 0x103; + runLengthTab[32].prefixLen = huffDecoder->readBits(4); + runLengthTab[32].rangeLen = 2; + runLengthTab[33].val = 0x203; + runLengthTab[33].prefixLen = huffDecoder->readBits(4); + runLengthTab[33].rangeLen = 3; + runLengthTab[34].val = 0x20b; + runLengthTab[34].prefixLen = huffDecoder->readBits(4); + runLengthTab[34].rangeLen = 7; + runLengthTab[35].prefixLen = 0; + runLengthTab[35].rangeLen = jbig2HuffmanEOT; + huffDecoder->buildTable(runLengthTab, 35); + symCodeTab = (JBIG2HuffmanTable *)gmallocn(numSyms + 1, + sizeof(JBIG2HuffmanTable)); + for (i = 0; i < numSyms; ++i) { + symCodeTab[i].val = i; + symCodeTab[i].rangeLen = 0; + } + i = 0; + while (i < numSyms) { + huffDecoder->decodeInt(&j, runLengthTab); + if (j > 0x200) { + for (j -= 0x200; j && i < numSyms; --j) { + symCodeTab[i++].prefixLen = 0; + } + } else if (j > 0x100) { + for (j -= 0x100; j && i < numSyms; --j) { + symCodeTab[i].prefixLen = symCodeTab[i-1].prefixLen; + ++i; + } + } else { + symCodeTab[i++].prefixLen = j; + } + } + symCodeTab[numSyms].prefixLen = 0; + symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT; + huffDecoder->buildTable(symCodeTab, numSyms); + huffDecoder->reset(); + + // set up the arithmetic decoder + } else { + symCodeTab = NULL; + resetIntStats(symCodeLen); + arithDecoder->start(); + } + if (refine) { + resetRefinementStats(templ, NULL); + } + + bitmap = readTextRegion(huff, refine, w, h, numInstances, + logStrips, numSyms, symCodeTab, symCodeLen, syms, + defPixel, combOp, transposed, refCorner, sOffset, + huffFSTable, huffDSTable, huffDTTable, + huffRDWTable, huffRDHTable, + huffRDXTable, huffRDYTable, huffRSizeTable, + templ, atx, aty); + + gfree(syms); + + if (bitmap) { + // combine the region bitmap into the page bitmap + if (imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + bitmap->setSegNum(segNum); + segments->append(bitmap); + } + } + + // clean up the Huffman decoder + if (huff) { + gfree(symCodeTab); + } + + return; + + codeTableError: + error(getPos(), "Missing code table in JBIG2 text region"); + gfree(codeTables); + delete syms; + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); + return; +} + +JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine, + int w, int h, + Guint numInstances, + Guint logStrips, + int numSyms, + JBIG2HuffmanTable *symCodeTab, + Guint symCodeLen, + JBIG2Bitmap **syms, + Guint defPixel, Guint combOp, + Guint transposed, Guint refCorner, + int sOffset, + JBIG2HuffmanTable *huffFSTable, + JBIG2HuffmanTable *huffDSTable, + JBIG2HuffmanTable *huffDTTable, + JBIG2HuffmanTable *huffRDWTable, + JBIG2HuffmanTable *huffRDHTable, + JBIG2HuffmanTable *huffRDXTable, + JBIG2HuffmanTable *huffRDYTable, + JBIG2HuffmanTable *huffRSizeTable, + Guint templ, + int *atx, int *aty) { + JBIG2Bitmap *bitmap; + JBIG2Bitmap *symbolBitmap; + Guint strips; + int t, dt, tt, s, ds, sFirst, j; + int rdw, rdh, rdx, rdy, ri, refDX, refDY, bmSize; + Guint symID, inst, bw, bh; + + strips = 1 << logStrips; + + // allocate the bitmap + bitmap = new JBIG2Bitmap(0, w, h); + if (!bitmap->isOk()) { + delete bitmap; + return NULL; + } + if (defPixel) { + bitmap->clearToOne(); + } else { + bitmap->clearToZero(); + } + + // decode initial T value + if (huff) { + huffDecoder->decodeInt(&t, huffDTTable); + } else { + arithDecoder->decodeInt(&t, iadtStats); + } + t *= -(int)strips; + + inst = 0; + sFirst = 0; + while (inst < numInstances) { + + // decode delta-T + if (huff) { + huffDecoder->decodeInt(&dt, huffDTTable); + } else { + arithDecoder->decodeInt(&dt, iadtStats); + } + t += dt * strips; + + // first S value + if (huff) { + huffDecoder->decodeInt(&ds, huffFSTable); + } else { + arithDecoder->decodeInt(&ds, iafsStats); + } + sFirst += ds; + s = sFirst; + + // read the instances + while (1) { + + // T value + if (strips == 1) { + dt = 0; + } else if (huff) { + dt = huffDecoder->readBits(logStrips); + } else { + arithDecoder->decodeInt(&dt, iaitStats); + } + tt = t + dt; + + // symbol ID + if (huff) { + if (symCodeTab) { + huffDecoder->decodeInt(&j, symCodeTab); + symID = (Guint)j; + } else { + symID = huffDecoder->readBits(symCodeLen); + } + } else { + symID = arithDecoder->decodeIAID(symCodeLen, iaidStats); + } + + if (symID >= (Guint)numSyms) { + error(getPos(), "Invalid symbol number in JBIG2 text region"); + } else { + + // get the symbol bitmap + symbolBitmap = NULL; + if (refine) { + if (huff) { + ri = (int)huffDecoder->readBit(); + } else { + arithDecoder->decodeInt(&ri, iariStats); + } + } else { + ri = 0; + } + if (ri) { + GBool decodeSuccess; + if (huff) { + decodeSuccess = huffDecoder->decodeInt(&rdw, huffRDWTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdh, huffRDHTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdx, huffRDXTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdy, huffRDYTable); + decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&bmSize, huffRSizeTable); + huffDecoder->reset(); + arithDecoder->start(); + } else { + decodeSuccess = arithDecoder->decodeInt(&rdw, iardwStats); + decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdh, iardhStats); + decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdx, iardxStats); + decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdy, iardyStats); + } + + if (decodeSuccess && syms[symID]) + { + refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx; + refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy; + + symbolBitmap = + readGenericRefinementRegion(rdw + syms[symID]->getWidth(), + rdh + syms[symID]->getHeight(), + templ, gFalse, syms[symID], + refDX, refDY, atx, aty); + } + //~ do we need to use the bmSize value here (in Huffman mode)? + } else { + symbolBitmap = syms[symID]; + } + + if (symbolBitmap) { + // combine the symbol bitmap into the region bitmap + //~ something is wrong here - refCorner shouldn't degenerate into + //~ two cases + bw = symbolBitmap->getWidth() - 1; + bh = symbolBitmap->getHeight() - 1; + if (transposed) { + switch (refCorner) { + case 0: // bottom left + bitmap->combine(symbolBitmap, tt, s, combOp); + break; + case 1: // top left + bitmap->combine(symbolBitmap, tt, s, combOp); + break; + case 2: // bottom right + bitmap->combine(symbolBitmap, tt - bw, s, combOp); + break; + case 3: // top right + bitmap->combine(symbolBitmap, tt - bw, s, combOp); + break; + } + s += bh; + } else { + switch (refCorner) { + case 0: // bottom left + bitmap->combine(symbolBitmap, s, tt - bh, combOp); + break; + case 1: // top left + bitmap->combine(symbolBitmap, s, tt, combOp); + break; + case 2: // bottom right + bitmap->combine(symbolBitmap, s, tt - bh, combOp); + break; + case 3: // top right + bitmap->combine(symbolBitmap, s, tt, combOp); + break; + } + s += bw; + } + if (ri) { + delete symbolBitmap; + } + } else { + // NULL symbolBitmap only happens on error + delete bitmap; + return NULL; + } + } + + // next instance + ++inst; + + // next S value + if (huff) { + if (!huffDecoder->decodeInt(&ds, huffDSTable)) { + break; + } + } else { + if (!arithDecoder->decodeInt(&ds, iadsStats)) { + break; + } + } + s += sOffset + ds; + } + } + + return bitmap; +} + +void JBIG2Stream::readPatternDictSeg(Guint segNum, Guint length) { + JBIG2PatternDict *patternDict; + JBIG2Bitmap *bitmap; + Guint flags, patternW, patternH, grayMax, templ, mmr; + int atx[4], aty[4]; + Guint i, x; + + // halftone dictionary flags, pattern width and height, max gray value + if (!readUByte(&flags) || + !readUByte(&patternW) || + !readUByte(&patternH) || + !readULong(&grayMax)) { + goto eofError; + } + templ = (flags >> 1) & 3; + mmr = flags & 1; + + // set up the arithmetic decoder + if (!mmr) { + resetGenericStats(templ, NULL); + arithDecoder->start(); + } + + // read the bitmap + atx[0] = -(int)patternW; aty[0] = 0; + atx[1] = -3; aty[1] = -1; + atx[2] = 2; aty[2] = -2; + atx[3] = -2; aty[3] = -2; + bitmap = readGenericBitmap(mmr, (grayMax + 1) * patternW, patternH, + templ, gFalse, gFalse, NULL, + atx, aty, length - 7); + + // create the pattern dict object + patternDict = new JBIG2PatternDict(segNum, grayMax + 1); + + // split up the bitmap + x = 0; + for (i = 0; i <= grayMax; ++i) { + patternDict->setBitmap(i, bitmap->getSlice(x, 0, patternW, patternH)); + x += patternW; + } + + // free memory + delete bitmap; + + // store the new pattern dict + segments->append(patternDict); + + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readHalftoneRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs) { + JBIG2Bitmap *bitmap; + JBIG2Segment *seg; + JBIG2PatternDict *patternDict; + JBIG2Bitmap *skipBitmap; + Guint *grayImg; + JBIG2Bitmap *grayBitmap; + JBIG2Bitmap *patternBitmap; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, mmr, templ, enableSkip, combOp; + Guint gridW, gridH, stepX, stepY, patW, patH; + int atx[4], aty[4]; + int gridX, gridY, xx, yy, bit, j; + Guint bpp, m, n, i; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the halftone region header + if (!readUByte(&flags)) { + goto eofError; + } + mmr = flags & 1; + templ = (flags >> 1) & 3; + enableSkip = (flags >> 3) & 1; + combOp = (flags >> 4) & 7; + if (!readULong(&gridW) || !readULong(&gridH) || + !readLong(&gridX) || !readLong(&gridY) || + !readUWord(&stepX) || !readUWord(&stepY)) { + goto eofError; + } + if (w == 0 || h == 0 || w >= INT_MAX / h) { + error(getPos(), "Bad bitmap size in JBIG2 halftone segment"); + return; + } + if (gridH == 0 || gridW >= INT_MAX / gridH) { + error(getPos(), "Bad grid size in JBIG2 halftone segment"); + return; + } + + // get pattern dictionary + if (nRefSegs != 1) { + error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } + seg = findSegment(refSegs[0]); + if (seg == NULL || seg->getType() != jbig2SegPatternDict) { + error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); + return; + } + + patternDict = (JBIG2PatternDict *)seg; + bpp = 0; + i = 1; + while (i < patternDict->getSize()) { + ++bpp; + i <<= 1; + } + patW = patternDict->getBitmap(0)->getWidth(); + patH = patternDict->getBitmap(0)->getHeight(); + + // set up the arithmetic decoder + if (!mmr) { + resetGenericStats(templ, NULL); + arithDecoder->start(); + } + + // allocate the bitmap + bitmap = new JBIG2Bitmap(segNum, w, h); + if (flags & 0x80) { // HDEFPIXEL + bitmap->clearToOne(); + } else { + bitmap->clearToZero(); + } + + // compute the skip bitmap + skipBitmap = NULL; + if (enableSkip) { + skipBitmap = new JBIG2Bitmap(0, gridW, gridH); + skipBitmap->clearToZero(); + for (m = 0; m < gridH; ++m) { + for (n = 0; n < gridW; ++n) { + xx = gridX + m * stepY + n * stepX; + yy = gridY + m * stepX - n * stepY; + if (((xx + (int)patW) >> 8) <= 0 || (xx >> 8) >= (int)w || + ((yy + (int)patH) >> 8) <= 0 || (yy >> 8) >= (int)h) { + skipBitmap->setPixel(n, m); + } + } + } + } + + // read the gray-scale image + grayImg = (Guint *)gmallocn(gridW * gridH, sizeof(Guint)); + memset(grayImg, 0, gridW * gridH * sizeof(Guint)); + atx[0] = templ <= 1 ? 3 : 2; aty[0] = -1; + atx[1] = -3; aty[1] = -1; + atx[2] = 2; aty[2] = -2; + atx[3] = -2; aty[3] = -2; + for (j = bpp - 1; j >= 0; --j) { + grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, gFalse, + enableSkip, skipBitmap, atx, aty, -1); + i = 0; + for (m = 0; m < gridH; ++m) { + for (n = 0; n < gridW; ++n) { + bit = grayBitmap->getPixel(n, m) ^ (grayImg[i] & 1); + grayImg[i] = (grayImg[i] << 1) | bit; + ++i; + } + } + delete grayBitmap; + } + + // decode the image + i = 0; + for (m = 0; m < gridH; ++m) { + xx = gridX + m * stepY; + yy = gridY + m * stepX; + for (n = 0; n < gridW; ++n) { + if (!(enableSkip && skipBitmap->getPixel(n, m))) { + patternBitmap = patternDict->getBitmap(grayImg[i]); + bitmap->combine(patternBitmap, xx >> 8, yy >> 8, combOp); + } + xx += stepX; + yy -= stepY; + ++i; + } + } + + gfree(grayImg); + if (skipBitmap) { + delete skipBitmap; + } + + // combine the region bitmap into the page bitmap + if (imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + segments->append(bitmap); + } + + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readGenericRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length) { + JBIG2Bitmap *bitmap; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, mmr, templ, tpgdOn; + int atx[4], aty[4]; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the generic region segment header + if (!readUByte(&flags)) { + goto eofError; + } + mmr = flags & 1; + templ = (flags >> 1) & 3; + tpgdOn = (flags >> 3) & 1; + + // AT flags + if (!mmr) { + if (templ == 0) { + if (!readByte(&atx[0]) || + !readByte(&aty[0]) || + !readByte(&atx[1]) || + !readByte(&aty[1]) || + !readByte(&atx[2]) || + !readByte(&aty[2]) || + !readByte(&atx[3]) || + !readByte(&aty[3])) { + goto eofError; + } + } else { + if (!readByte(&atx[0]) || + !readByte(&aty[0])) { + goto eofError; + } + } + } + + // set up the arithmetic decoder + if (!mmr) { + resetGenericStats(templ, NULL); + arithDecoder->start(); + } + + // read the bitmap + bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse, + NULL, atx, aty, mmr ? length - 18 : 0); + if (!bitmap) + return; + + // combine the region bitmap into the page bitmap + if (imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + bitmap->setSegNum(segNum); + segments->append(bitmap); + } + + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +inline void JBIG2Stream::mmrAddPixels(int a1, int blackPixels, + int *codingLine, int *a0i, int w) { + if (a1 > codingLine[*a0i]) { + if (a1 > w) { + error(getPos(), "JBIG2 MMR row is wrong length (%d)", a1); + a1 = w; + } + if ((*a0i & 1) ^ blackPixels) { + ++*a0i; + } + codingLine[*a0i] = a1; + } +} + +inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels, + int *codingLine, int *a0i, int w) { + if (a1 > codingLine[*a0i]) { + if (a1 > w) { + error(getPos(), "JBIG2 MMR row is wrong length (%d)", a1); + a1 = w; + } + if ((*a0i & 1) ^ blackPixels) { + ++*a0i; + } + codingLine[*a0i] = a1; + } else if (a1 < codingLine[*a0i]) { + if (a1 < 0) { + error(getPos(), "Invalid JBIG2 MMR code"); + a1 = 0; + } + while (*a0i > 0 && a1 <= codingLine[*a0i - 1]) { + --*a0i; + } + codingLine[*a0i] = a1; + } +} + +JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h, + int templ, GBool tpgdOn, + GBool useSkip, JBIG2Bitmap *skip, + int *atx, int *aty, + int mmrDataLength) { + JBIG2Bitmap *bitmap; + GBool ltp; + Guint ltpCX, cx, cx0, cx1, cx2; + JBIG2BitmapPtr cxPtr0 = {0}, cxPtr1 = {0}; + JBIG2BitmapPtr atPtr0 = {0}, atPtr1 = {0}, atPtr2 = {0}, atPtr3 = {0}; + int *refLine, *codingLine; + int code1, code2, code3; + int x, y, a0i, b1i, blackPixels, pix, i; + + bitmap = new JBIG2Bitmap(0, w, h); + if (!bitmap->isOk()) { + delete bitmap; + return NULL; + } + bitmap->clearToZero(); + + //----- MMR decode + + if (mmr) { + + mmrDecoder->reset(); + if (w > INT_MAX - 2) { + error(getPos(), "Bad width in JBIG2 generic bitmap"); + // force a call to gmalloc(-1), which will throw an exception + w = -3; + } + // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w + // ---> max codingLine size = w + 1 + // refLine has one extra guard entry at the end + // ---> max refLine size = w + 2 + codingLine = (int *)gmallocn(w + 1, sizeof(int)); + refLine = (int *)gmallocn(w + 2, sizeof(int)); + for (i = 0; i < w + 1; ++i) codingLine[i] = w; + + for (y = 0; y < h; ++y) { + + // copy coding line to ref line + for (i = 0; codingLine[i] < w; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = w; + refLine[i] = w; + + // decode a line + codingLine[0] = 0; + a0i = 0; + b1i = 0; + blackPixels = 0; + // invariant: + // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] <= w + // exception at left edge: + // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible + // exception at right edge: + // refLine[b1i] = refLine[b1i+1] = w is possible + while (codingLine[a0i] < w) { + code1 = mmrDecoder->get2DCode(); + switch (code1) { + case twoDimPass: + mmrAddPixels(refLine[b1i + 1], blackPixels, codingLine, &a0i, w); + if (refLine[b1i + 1] < w) { + b1i += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = mmrDecoder->getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = mmrDecoder->getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = mmrDecoder->getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = mmrDecoder->getBlackCode(); + } while (code3 >= 64); + } + mmrAddPixels(codingLine[a0i] + code1, blackPixels, + codingLine, &a0i, w); + if (codingLine[a0i] < w) { + mmrAddPixels(codingLine[a0i] + code2, blackPixels ^ 1, + codingLine, &a0i, w); + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + break; + case twoDimVertR3: + mmrAddPixels(refLine[b1i] + 3, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertR2: + mmrAddPixels(refLine[b1i] + 2, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertR1: + mmrAddPixels(refLine[b1i] + 1, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVert0: + mmrAddPixels(refLine[b1i], blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertL3: + mmrAddPixelsNeg(refLine[b1i] - 3, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertL2: + mmrAddPixelsNeg(refLine[b1i] - 2, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case twoDimVertL1: + mmrAddPixelsNeg(refLine[b1i] - 1, blackPixels, codingLine, &a0i, w); + blackPixels ^= 1; + if (codingLine[a0i] < w) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { + b1i += 2; + } + } + break; + case EOF: + mmrAddPixels(w, 0, codingLine, &a0i, w); + break; + default: + error(getPos(), "Illegal code in JBIG2 MMR bitmap data"); + mmrAddPixels(w, 0, codingLine, &a0i, w); + break; + } + } + + // convert the run lengths to a bitmap line + i = 0; + while (1) { + for (x = codingLine[i]; x < codingLine[i+1]; ++x) { + bitmap->setPixel(x, y); + } + if (codingLine[i+1] >= w || codingLine[i+2] >= w) { + break; + } + i += 2; + } + } + + if (mmrDataLength >= 0) { + mmrDecoder->skipTo(mmrDataLength); + } else { + if (mmrDecoder->get24Bits() != 0x001001) { + error(getPos(), "Missing EOFB in JBIG2 MMR bitmap data"); + } + } + + gfree(refLine); + gfree(codingLine); + + //----- arithmetic decode + + } else { + // set up the typical row context + ltpCX = 0; // make gcc happy + if (tpgdOn) { + switch (templ) { + case 0: + ltpCX = 0x3953; // 001 11001 0101 0011 + break; + case 1: + ltpCX = 0x079a; // 0011 11001 101 0 + break; + case 2: + ltpCX = 0x0e3; // 001 1100 01 1 + break; + case 3: + ltpCX = 0x18a; // 01100 0101 1 + break; + } + } + + ltp = 0; + cx = cx0 = cx1 = cx2 = 0; // make gcc happy + for (y = 0; y < h; ++y) { + + // check for a "typical" (duplicate) row + if (tpgdOn) { + if (arithDecoder->decodeBit(ltpCX, genericRegionStats)) { + ltp = !ltp; + } + if (ltp) { + if (y > 0) { + bitmap->duplicateRow(y, y-1); + } + continue; + } + } + + switch (templ) { + case 0: + + // set up the context + bitmap->getPixelPtr(0, y-2, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(0, y-1, &cxPtr1); + cx1 = bitmap->nextPixel(&cxPtr1); + cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); + cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); + cx2 = 0; + bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); + bitmap->getPixelPtr(atx[1], y + aty[1], &atPtr1); + bitmap->getPixelPtr(atx[2], y + aty[2], &atPtr2); + bitmap->getPixelPtr(atx[3], y + aty[3], &atPtr3); + + // decode the row + for (x = 0; x < w; ++x) { + + // build the context + cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) | + (bitmap->nextPixel(&atPtr0) << 3) | + (bitmap->nextPixel(&atPtr1) << 2) | + (bitmap->nextPixel(&atPtr2) << 1) | + bitmap->nextPixel(&atPtr3); + + // check for a skipped pixel + if (useSkip && skip->getPixel(x, y)) { + pix = 0; + + // decode the pixel + } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + bitmap->setPixel(x, y); + } + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x07; + cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f; + cx2 = ((cx2 << 1) | pix) & 0x0f; + } + break; + + case 1: + + // set up the context + bitmap->getPixelPtr(0, y-2, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); + cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(0, y-1, &cxPtr1); + cx1 = bitmap->nextPixel(&cxPtr1); + cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); + cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); + cx2 = 0; + bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); + + // decode the row + for (x = 0; x < w; ++x) { + + // build the context + cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) | + bitmap->nextPixel(&atPtr0); + + // check for a skipped pixel + if (useSkip && skip->getPixel(x, y)) { + pix = 0; + + // decode the pixel + } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + bitmap->setPixel(x, y); + } + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x0f; + cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f; + cx2 = ((cx2 << 1) | pix) & 0x07; + } + break; + + case 2: + + // set up the context + bitmap->getPixelPtr(0, y-2, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(0, y-1, &cxPtr1); + cx1 = bitmap->nextPixel(&cxPtr1); + cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); + cx2 = 0; + bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); + + // decode the row + for (x = 0; x < w; ++x) { + + // build the context + cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) | + bitmap->nextPixel(&atPtr0); + + // check for a skipped pixel + if (useSkip && skip->getPixel(x, y)) { + pix = 0; + + // decode the pixel + } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + bitmap->setPixel(x, y); + } + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x07; + cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x0f; + cx2 = ((cx2 << 1) | pix) & 0x03; + } + break; + + case 3: + + // set up the context + bitmap->getPixelPtr(0, y-1, &cxPtr1); + cx1 = bitmap->nextPixel(&cxPtr1); + cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); + cx2 = 0; + bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); + + // decode the row + for (x = 0; x < w; ++x) { + + // build the context + cx = (cx1 << 5) | (cx2 << 1) | + bitmap->nextPixel(&atPtr0); + + // check for a skipped pixel + if (useSkip && skip->getPixel(x, y)) { + pix = 0; + + // decode the pixel + } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { + bitmap->setPixel(x, y); + } + + // update the context + cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f; + cx2 = ((cx2 << 1) | pix) & 0x0f; + } + break; + } + } + } + + return bitmap; +} + +void JBIG2Stream::readGenericRefinementRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, + Guint nRefSegs) { + JBIG2Bitmap *bitmap, *refBitmap; + Guint w, h, x, y, segInfoFlags, extCombOp; + Guint flags, templ, tpgrOn; + int atx[2], aty[2]; + JBIG2Segment *seg; + + // region segment info field + if (!readULong(&w) || !readULong(&h) || + !readULong(&x) || !readULong(&y) || + !readUByte(&segInfoFlags)) { + goto eofError; + } + extCombOp = segInfoFlags & 7; + + // rest of the generic refinement region segment header + if (!readUByte(&flags)) { + goto eofError; + } + templ = flags & 1; + tpgrOn = (flags >> 1) & 1; + + // AT flags + if (!templ) { + if (!readByte(&atx[0]) || !readByte(&aty[0]) || + !readByte(&atx[1]) || !readByte(&aty[1])) { + goto eofError; + } + } + + // resize the page bitmap if needed + if (nRefSegs == 0 || imm) { + if (pageH == 0xffffffff && y + h > curPageH) { + pageBitmap->expand(y + h, pageDefPixel); + } + } + + // get referenced bitmap + if (nRefSegs > 1) { + error(getPos(), "Bad reference in JBIG2 generic refinement segment"); + return; + } + if (nRefSegs == 1) { + seg = findSegment(refSegs[0]); + if (seg == NULL || seg->getType() != jbig2SegBitmap) { + error(getPos(), "Bad bitmap reference in JBIG2 generic refinement segment"); + return; + } + refBitmap = (JBIG2Bitmap *)seg; + } else { + refBitmap = pageBitmap->getSlice(x, y, w, h); + } + + // set up the arithmetic decoder + resetRefinementStats(templ, NULL); + arithDecoder->start(); + + // read + bitmap = readGenericRefinementRegion(w, h, templ, tpgrOn, + refBitmap, 0, 0, atx, aty); + + // combine the region bitmap into the page bitmap + if (imm) { + pageBitmap->combine(bitmap, x, y, extCombOp); + delete bitmap; + + // store the region bitmap + } else { + bitmap->setSegNum(segNum); + segments->append(bitmap); + } + + // delete the referenced bitmap + if (nRefSegs == 1) { + discardSegment(refSegs[0]); + } else { + delete refBitmap; + } + + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h, + int templ, GBool tpgrOn, + JBIG2Bitmap *refBitmap, + int refDX, int refDY, + int *atx, int *aty) { + JBIG2Bitmap *bitmap; + GBool ltp; + Guint ltpCX, cx, cx0, cx2, cx3, cx4, tpgrCX0, tpgrCX1, tpgrCX2; + JBIG2BitmapPtr cxPtr0 = {0}; + JBIG2BitmapPtr cxPtr1 = {0}; + JBIG2BitmapPtr cxPtr2 = {0}; + JBIG2BitmapPtr cxPtr3 = {0}; + JBIG2BitmapPtr cxPtr4 = {0}; + JBIG2BitmapPtr cxPtr5 = {0}; + JBIG2BitmapPtr cxPtr6 = {0}; + JBIG2BitmapPtr tpgrCXPtr0 = {0}; + JBIG2BitmapPtr tpgrCXPtr1 = {0}; + JBIG2BitmapPtr tpgrCXPtr2 = {0}; + int x, y, pix; + + bitmap = new JBIG2Bitmap(0, w, h); + if (!bitmap->isOk()) + { + delete bitmap; + return NULL; + } + bitmap->clearToZero(); + + // set up the typical row context + if (templ) { + ltpCX = 0x008; + } else { + ltpCX = 0x0010; + } + + ltp = 0; + for (y = 0; y < h; ++y) { + + if (templ) { + + // set up the context + bitmap->getPixelPtr(0, y-1, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(-1, y, &cxPtr1); + refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3); + cx3 = refBitmap->nextPixel(&cxPtr3); + cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3); + refBitmap->getPixelPtr(-refDX, y+1-refDY, &cxPtr4); + cx4 = refBitmap->nextPixel(&cxPtr4); + + // set up the typical prediction context + tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy + if (tpgrOn) { + refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0); + tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1); + tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2); + tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + } else { + tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy + tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; + tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; + } + + for (x = 0; x < w; ++x) { + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 7; + cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7; + cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 3; + + if (tpgrOn) { + // update the typical predictor context + tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7; + tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7; + tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7; + + // check for a "typical" pixel + if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) { + ltp = !ltp; + } + if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) { + bitmap->clearPixel(x, y); + continue; + } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) { + bitmap->setPixel(x, y); + continue; + } + } + + // build the context + cx = (cx0 << 7) | (bitmap->nextPixel(&cxPtr1) << 6) | + (refBitmap->nextPixel(&cxPtr2) << 5) | + (cx3 << 2) | cx4; + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) { + bitmap->setPixel(x, y); + } + } + + } else { + + // set up the context + bitmap->getPixelPtr(0, y-1, &cxPtr0); + cx0 = bitmap->nextPixel(&cxPtr0); + bitmap->getPixelPtr(-1, y, &cxPtr1); + refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2); + cx2 = refBitmap->nextPixel(&cxPtr2); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3); + cx3 = refBitmap->nextPixel(&cxPtr3); + cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3); + refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &cxPtr4); + cx4 = refBitmap->nextPixel(&cxPtr4); + cx4 = (cx4 << 1) | refBitmap->nextPixel(&cxPtr4); + bitmap->getPixelPtr(atx[0], y+aty[0], &cxPtr5); + refBitmap->getPixelPtr(atx[1]-refDX, y+aty[1]-refDY, &cxPtr6); + + // set up the typical prediction context + tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy + if (tpgrOn) { + refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0); + tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); + refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1); + tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); + refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2); + tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); + } else { + tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy + tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; + tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; + } + + for (x = 0; x < w; ++x) { + + // update the context + cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 3; + cx2 = ((cx2 << 1) | refBitmap->nextPixel(&cxPtr2)) & 3; + cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7; + cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 7; + + if (tpgrOn) { + // update the typical predictor context + tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7; + tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7; + tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7; + + // check for a "typical" pixel + if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) { + ltp = !ltp; + } + if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) { + bitmap->clearPixel(x, y); + continue; + } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) { + bitmap->setPixel(x, y); + continue; + } + } + + // build the context + cx = (cx0 << 11) | (bitmap->nextPixel(&cxPtr1) << 10) | + (cx2 << 8) | (cx3 << 5) | (cx4 << 2) | + (bitmap->nextPixel(&cxPtr5) << 1) | + refBitmap->nextPixel(&cxPtr6); + + // decode the pixel + if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) { + bitmap->setPixel(x, y); + } + } + } + } + + return bitmap; +} + +void JBIG2Stream::readPageInfoSeg(Guint length) { + Guint xRes, yRes, flags, striping; + + if (!readULong(&pageW) || !readULong(&pageH) || + !readULong(&xRes) || !readULong(&yRes) || + !readUByte(&flags) || !readUWord(&striping)) { + goto eofError; + } + pageDefPixel = (flags >> 2) & 1; + defCombOp = (flags >> 3) & 3; + + // allocate the page bitmap + if (pageH == 0xffffffff) { + curPageH = striping & 0x7fff; + } else { + curPageH = pageH; + } + pageBitmap = new JBIG2Bitmap(0, pageW, curPageH); + + if (!pageBitmap->isOk()) { + delete pageBitmap; + pageBitmap = NULL; + return; + } + + // default pixel value + if (pageDefPixel) { + pageBitmap->clearToOne(); + } else { + pageBitmap->clearToZero(); + } + + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readEndOfStripeSeg(Guint length) { + Guint i; + + // skip the segment + for (i = 0; i < length; ++i) { + curStr->getChar(); + } +} + +void JBIG2Stream::readProfilesSeg(Guint length) { + Guint i; + + // skip the segment + for (i = 0; i < length; ++i) { + curStr->getChar(); + } +} + +void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) { + JBIG2HuffmanTable *huffTab; + Guint flags, oob, prefixBits, rangeBits; + int lowVal, highVal, val; + Guint huffTabSize, i; + + if (!readUByte(&flags) || !readLong(&lowVal) || !readLong(&highVal)) { + goto eofError; + } + oob = flags & 1; + prefixBits = ((flags >> 1) & 7) + 1; + rangeBits = ((flags >> 4) & 7) + 1; + + huffDecoder->reset(); + huffTabSize = 8; + huffTab = (JBIG2HuffmanTable *) + gmallocn(huffTabSize, sizeof(JBIG2HuffmanTable)); + i = 0; + val = lowVal; + while (val < highVal) { + if (i == huffTabSize) { + huffTabSize *= 2; + huffTab = (JBIG2HuffmanTable *) + greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable)); + } + huffTab[i].val = val; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = huffDecoder->readBits(rangeBits); + val += 1 << huffTab[i].rangeLen; + ++i; + } + if (i + oob + 3 > huffTabSize) { + huffTabSize = i + oob + 3; + huffTab = (JBIG2HuffmanTable *) + greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable)); + } + huffTab[i].val = lowVal - 1; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = jbig2HuffmanLOW; + ++i; + huffTab[i].val = highVal; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = 32; + ++i; + if (oob) { + huffTab[i].val = 0; + huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); + huffTab[i].rangeLen = jbig2HuffmanOOB; + ++i; + } + huffTab[i].val = 0; + huffTab[i].prefixLen = 0; + huffTab[i].rangeLen = jbig2HuffmanEOT; + huffDecoder->buildTable(huffTab, i); + + // create and store the new table segment + segments->append(new JBIG2CodeTable(segNum, huffTab)); + + return; + + eofError: + error(getPos(), "Unexpected EOF in JBIG2 stream"); +} + +void JBIG2Stream::readExtensionSeg(Guint length) { + Guint i; + + // skip the segment + for (i = 0; i < length; ++i) { + curStr->getChar(); + } +} + +JBIG2Segment *JBIG2Stream::findSegment(Guint segNum) { + JBIG2Segment *seg; + int i; + + for (i = 0; i < globalSegments->getLength(); ++i) { + seg = (JBIG2Segment *)globalSegments->get(i); + if (seg->getSegNum() == segNum) { + return seg; + } + } + for (i = 0; i < segments->getLength(); ++i) { + seg = (JBIG2Segment *)segments->get(i); + if (seg->getSegNum() == segNum) { + return seg; + } + } + return NULL; +} + +void JBIG2Stream::discardSegment(Guint segNum) { + JBIG2Segment *seg; + int i; + + for (i = 0; i < globalSegments->getLength(); ++i) { + seg = (JBIG2Segment *)globalSegments->get(i); + if (seg->getSegNum() == segNum) { + globalSegments->del(i); + return; + } + } + for (i = 0; i < segments->getLength(); ++i) { + seg = (JBIG2Segment *)segments->get(i); + if (seg->getSegNum() == segNum) { + segments->del(i); + return; + } + } +} + +void JBIG2Stream::resetGenericStats(Guint templ, + JArithmeticDecoderStats *prevStats) { + int size; + + size = contextSize[templ]; + if (prevStats && prevStats->getContextSize() == size) { + if (genericRegionStats->getContextSize() == size) { + genericRegionStats->copyFrom(prevStats); + } else { + delete genericRegionStats; + genericRegionStats = prevStats->copy(); + } + } else { + if (genericRegionStats->getContextSize() == size) { + genericRegionStats->reset(); + } else { + delete genericRegionStats; + genericRegionStats = new JArithmeticDecoderStats(1 << size); + } + } +} + +void JBIG2Stream::resetRefinementStats(Guint templ, + JArithmeticDecoderStats *prevStats) { + int size; + + size = refContextSize[templ]; + if (prevStats && prevStats->getContextSize() == size) { + if (refinementRegionStats->getContextSize() == size) { + refinementRegionStats->copyFrom(prevStats); + } else { + delete refinementRegionStats; + refinementRegionStats = prevStats->copy(); + } + } else { + if (refinementRegionStats->getContextSize() == size) { + refinementRegionStats->reset(); + } else { + delete refinementRegionStats; + refinementRegionStats = new JArithmeticDecoderStats(1 << size); + } + } +} + +void JBIG2Stream::resetIntStats(int symCodeLen) { + iadhStats->reset(); + iadwStats->reset(); + iaexStats->reset(); + iaaiStats->reset(); + iadtStats->reset(); + iaitStats->reset(); + iafsStats->reset(); + iadsStats->reset(); + iardxStats->reset(); + iardyStats->reset(); + iardwStats->reset(); + iardhStats->reset(); + iariStats->reset(); + if (iaidStats->getContextSize() == 1 << (symCodeLen + 1)) { + iaidStats->reset(); + } else { + delete iaidStats; + iaidStats = new JArithmeticDecoderStats(1 << (symCodeLen + 1)); + } +} + +GBool JBIG2Stream::readUByte(Guint *x) { + int c0; + + if ((c0 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)c0; + return gTrue; +} + +GBool JBIG2Stream::readByte(int *x) { + int c0; + + if ((c0 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = c0; + if (c0 & 0x80) { + *x |= -1 - 0xff; + } + return gTrue; +} + +GBool JBIG2Stream::readUWord(Guint *x) { + int c0, c1; + + if ((c0 = curStr->getChar()) == EOF || + (c1 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 8) | c1); + return gTrue; +} + +GBool JBIG2Stream::readULong(Guint *x) { + int c0, c1, c2, c3; + + if ((c0 = curStr->getChar()) == EOF || + (c1 = curStr->getChar()) == EOF || + (c2 = curStr->getChar()) == EOF || + (c3 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); + return gTrue; +} + +GBool JBIG2Stream::readLong(int *x) { + int c0, c1, c2, c3; + + if ((c0 = curStr->getChar()) == EOF || + (c1 = curStr->getChar()) == EOF || + (c2 = curStr->getChar()) == EOF || + (c3 = curStr->getChar()) == EOF) { + return gFalse; + } + *x = ((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); + if (c0 & 0x80) { + *x |= -1 - (int)0xffffffff; + } + return gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h new file mode 100644 index 000000000..f3443b3d5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h @@ -0,0 +1,149 @@ +//======================================================================== +// +// JBIG2Stream.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef JBIG2STREAM_H +#define JBIG2STREAM_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" +#include "Stream.h" + +class GList; +class JBIG2Segment; +class JBIG2Bitmap; +class JArithmeticDecoder; +class JArithmeticDecoderStats; +class JBIG2HuffmanDecoder; +struct JBIG2HuffmanTable; +class JBIG2MMRDecoder; + +//------------------------------------------------------------------------ + +class JBIG2Stream: public FilterStream { +public: + + JBIG2Stream(Stream *strA, Object *globalsStreamA); + virtual ~JBIG2Stream(); + virtual StreamKind getKind() { return strJBIG2; } + virtual void reset(); + virtual void close(); + virtual int getChar(); + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + void readSegments(); + GBool readSymbolDictSeg(Guint segNum, Guint length, + Guint *refSegs, Guint nRefSegs); + void readTextRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs); + JBIG2Bitmap *readTextRegion(GBool huff, GBool refine, + int w, int h, + Guint numInstances, + Guint logStrips, + int numSyms, + JBIG2HuffmanTable *symCodeTab, + Guint symCodeLen, + JBIG2Bitmap **syms, + Guint defPixel, Guint combOp, + Guint transposed, Guint refCorner, + int sOffset, + JBIG2HuffmanTable *huffFSTable, + JBIG2HuffmanTable *huffDSTable, + JBIG2HuffmanTable *huffDTTable, + JBIG2HuffmanTable *huffRDWTable, + JBIG2HuffmanTable *huffRDHTable, + JBIG2HuffmanTable *huffRDXTable, + JBIG2HuffmanTable *huffRDYTable, + JBIG2HuffmanTable *huffRSizeTable, + Guint templ, + int *atx, int *aty); + void readPatternDictSeg(Guint segNum, Guint length); + void readHalftoneRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, Guint nRefSegs); + void readGenericRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length); + void mmrAddPixels(int a1, int blackPixels, + int *codingLine, int *a0i, int w); + void mmrAddPixelsNeg(int a1, int blackPixels, + int *codingLine, int *a0i, int w); + JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h, + int templ, GBool tpgdOn, + GBool useSkip, JBIG2Bitmap *skip, + int *atx, int *aty, + int mmrDataLength); + void readGenericRefinementRegionSeg(Guint segNum, GBool imm, + GBool lossless, Guint length, + Guint *refSegs, + Guint nRefSegs); + JBIG2Bitmap *readGenericRefinementRegion(int w, int h, + int templ, GBool tpgrOn, + JBIG2Bitmap *refBitmap, + int refDX, int refDY, + int *atx, int *aty); + void readPageInfoSeg(Guint length); + void readEndOfStripeSeg(Guint length); + void readProfilesSeg(Guint length); + void readCodeTableSeg(Guint segNum, Guint length); + void readExtensionSeg(Guint length); + JBIG2Segment *findSegment(Guint segNum); + void discardSegment(Guint segNum); + void resetGenericStats(Guint templ, + JArithmeticDecoderStats *prevStats); + void resetRefinementStats(Guint templ, + JArithmeticDecoderStats *prevStats); + void resetIntStats(int symCodeLen); + GBool readUByte(Guint *x); + GBool readByte(int *x); + GBool readUWord(Guint *x); + GBool readULong(Guint *x); + GBool readLong(int *x); + + Object globalsStream; + Guint pageW, pageH, curPageH; + Guint pageDefPixel; + JBIG2Bitmap *pageBitmap; + Guint defCombOp; + GList *segments; // [JBIG2Segment] + GList *globalSegments; // [JBIG2Segment] + Stream *curStr; + Guchar *dataPtr; + Guchar *dataEnd; + + JArithmeticDecoder *arithDecoder; + JArithmeticDecoderStats *genericRegionStats; + JArithmeticDecoderStats *refinementRegionStats; + JArithmeticDecoderStats *iadhStats; + JArithmeticDecoderStats *iadwStats; + JArithmeticDecoderStats *iaexStats; + JArithmeticDecoderStats *iaaiStats; + JArithmeticDecoderStats *iadtStats; + JArithmeticDecoderStats *iaitStats; + JArithmeticDecoderStats *iafsStats; + JArithmeticDecoderStats *iadsStats; + JArithmeticDecoderStats *iardxStats; + JArithmeticDecoderStats *iardyStats; + JArithmeticDecoderStats *iardwStats; + JArithmeticDecoderStats *iardhStats; + JArithmeticDecoderStats *iariStats; + JArithmeticDecoderStats *iaidStats; + JBIG2HuffmanDecoder *huffDecoder; + JBIG2MMRDecoder *mmrDecoder; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc new file mode 100644 index 000000000..79b9c75d6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc @@ -0,0 +1,3154 @@ +//======================================================================== +// +// JPXStream.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "Error.h" +#include "JArithmeticDecoder.h" +#include "JPXStream.h" + +//~ to do: +// - precincts +// - ROI +// - progression order changes +// - packed packet headers +// - support for palettes, channel maps, etc. +// - make sure all needed JP2/JPX subboxes are parsed (readBoxes) +// - can we assume that QCC segments must come after the QCD segment? +// - skip EPH markers (readTilePartData) +// - handle tilePartToEOC in readTilePartData +// - deal with multiple codeword segments (readTilePartData, +// readCodeBlockData) +// - progression orders 2, 3, and 4 +// - in coefficient decoding (readCodeBlockData): +// - termination pattern: terminate after every coding pass +// - error resilience segmentation symbol +// - selective arithmetic coding bypass +// - vertically causal context formation +// - coeffs longer than 31 bits (should just ignore the extra bits?) +// - handle boxes larger than 2^32 bytes +// - the fixed-point arithmetic won't handle 16-bit pixels + +//------------------------------------------------------------------------ + +// number of contexts for the arithmetic decoder +#define jpxNContexts 19 + +#define jpxContextSigProp 0 // 0 - 8: significance prop and cleanup +#define jpxContextSign 9 // 9 - 13: sign +#define jpxContextMagRef 14 // 14 -16: magnitude refinement +#define jpxContextRunLength 17 // cleanup: run length +#define jpxContextUniform 18 // cleanup: first signif coeff + +//------------------------------------------------------------------------ + +#define jpxPassSigProp 0 +#define jpxPassMagRef 1 +#define jpxPassCleanup 2 + +//------------------------------------------------------------------------ + +// arithmetic decoder context for the significance propagation and +// cleanup passes: +// [horiz][vert][diag][subband] +// where subband = 0 for HL +// = 1 for LH and LL +// = 2 for HH +static Guint sigPropContext[3][3][5][3] = { + {{{ 0, 0, 0 }, // horiz=0, vert=0, diag=0 + { 1, 1, 3 }, // horiz=0, vert=0, diag=1 + { 2, 2, 6 }, // horiz=0, vert=0, diag=2 + { 2, 2, 8 }, // horiz=0, vert=0, diag=3 + { 2, 2, 8 }}, // horiz=0, vert=0, diag=4 + {{ 5, 3, 1 }, // horiz=0, vert=1, diag=0 + { 6, 3, 4 }, // horiz=0, vert=1, diag=1 + { 6, 3, 7 }, // horiz=0, vert=1, diag=2 + { 6, 3, 8 }, // horiz=0, vert=1, diag=3 + { 6, 3, 8 }}, // horiz=0, vert=1, diag=4 + {{ 8, 4, 2 }, // horiz=0, vert=2, diag=0 + { 8, 4, 5 }, // horiz=0, vert=2, diag=1 + { 8, 4, 7 }, // horiz=0, vert=2, diag=2 + { 8, 4, 8 }, // horiz=0, vert=2, diag=3 + { 8, 4, 8 }}}, // horiz=0, vert=2, diag=4 + {{{ 3, 5, 1 }, // horiz=1, vert=0, diag=0 + { 3, 6, 4 }, // horiz=1, vert=0, diag=1 + { 3, 6, 7 }, // horiz=1, vert=0, diag=2 + { 3, 6, 8 }, // horiz=1, vert=0, diag=3 + { 3, 6, 8 }}, // horiz=1, vert=0, diag=4 + {{ 7, 7, 2 }, // horiz=1, vert=1, diag=0 + { 7, 7, 5 }, // horiz=1, vert=1, diag=1 + { 7, 7, 7 }, // horiz=1, vert=1, diag=2 + { 7, 7, 8 }, // horiz=1, vert=1, diag=3 + { 7, 7, 8 }}, // horiz=1, vert=1, diag=4 + {{ 8, 7, 2 }, // horiz=1, vert=2, diag=0 + { 8, 7, 5 }, // horiz=1, vert=2, diag=1 + { 8, 7, 7 }, // horiz=1, vert=2, diag=2 + { 8, 7, 8 }, // horiz=1, vert=2, diag=3 + { 8, 7, 8 }}}, // horiz=1, vert=2, diag=4 + {{{ 4, 8, 2 }, // horiz=2, vert=0, diag=0 + { 4, 8, 5 }, // horiz=2, vert=0, diag=1 + { 4, 8, 7 }, // horiz=2, vert=0, diag=2 + { 4, 8, 8 }, // horiz=2, vert=0, diag=3 + { 4, 8, 8 }}, // horiz=2, vert=0, diag=4 + {{ 7, 8, 2 }, // horiz=2, vert=1, diag=0 + { 7, 8, 5 }, // horiz=2, vert=1, diag=1 + { 7, 8, 7 }, // horiz=2, vert=1, diag=2 + { 7, 8, 8 }, // horiz=2, vert=1, diag=3 + { 7, 8, 8 }}, // horiz=2, vert=1, diag=4 + {{ 8, 8, 2 }, // horiz=2, vert=2, diag=0 + { 8, 8, 5 }, // horiz=2, vert=2, diag=1 + { 8, 8, 7 }, // horiz=2, vert=2, diag=2 + { 8, 8, 8 }, // horiz=2, vert=2, diag=3 + { 8, 8, 8 }}} // horiz=2, vert=2, diag=4 +}; + +// arithmetic decoder context and xor bit for the sign bit in the +// significance propagation pass: +// [horiz][vert][k] +// where horiz/vert are offset by 2 (i.e., range is -2 .. 2) +// and k = 0 for the context +// = 1 for the xor bit +static Guint signContext[5][5][2] = { + {{ 13, 1 }, // horiz=-2, vert=-2 + { 13, 1 }, // horiz=-2, vert=-1 + { 12, 1 }, // horiz=-2, vert= 0 + { 11, 1 }, // horiz=-2, vert=+1 + { 11, 1 }}, // horiz=-2, vert=+2 + {{ 13, 1 }, // horiz=-1, vert=-2 + { 13, 1 }, // horiz=-1, vert=-1 + { 12, 1 }, // horiz=-1, vert= 0 + { 11, 1 }, // horiz=-1, vert=+1 + { 11, 1 }}, // horiz=-1, vert=+2 + {{ 10, 1 }, // horiz= 0, vert=-2 + { 10, 1 }, // horiz= 0, vert=-1 + { 9, 0 }, // horiz= 0, vert= 0 + { 10, 0 }, // horiz= 0, vert=+1 + { 10, 0 }}, // horiz= 0, vert=+2 + {{ 11, 0 }, // horiz=+1, vert=-2 + { 11, 0 }, // horiz=+1, vert=-1 + { 12, 0 }, // horiz=+1, vert= 0 + { 13, 0 }, // horiz=+1, vert=+1 + { 13, 0 }}, // horiz=+1, vert=+2 + {{ 11, 0 }, // horiz=+2, vert=-2 + { 11, 0 }, // horiz=+2, vert=-1 + { 12, 0 }, // horiz=+2, vert= 0 + { 13, 0 }, // horiz=+2, vert=+1 + { 13, 0 }}, // horiz=+2, vert=+2 +}; + +//------------------------------------------------------------------------ + +// constants used in the IDWT +#define idwtAlpha -1.586134342059924 +#define idwtBeta -0.052980118572961 +#define idwtGamma 0.882911075530934 +#define idwtDelta 0.443506852043971 +#define idwtKappa 1.230174104914001 +#define idwtIKappa (1.0 / idwtKappa) + +// number of bits to the right of the decimal point for the fixed +// point arithmetic used in the IDWT +#define fracBits 16 + +//------------------------------------------------------------------------ + +// floor(x / y) +#define jpxFloorDiv(x, y) ((x) / (y)) + +// floor(x / 2^y) +#define jpxFloorDivPow2(x, y) ((x) >> (y)) + +// ceil(x / y) +#define jpxCeilDiv(x, y) (((x) + (y) - 1) / (y)) + +// ceil(x / 2^y) +#define jpxCeilDivPow2(x, y) (((x) + (1 << (y)) - 1) >> (y)) + +//------------------------------------------------------------------------ + +#if 1 //----- disable coverage tracking + +#define cover(idx) + +#else //----- enable coverage tracking + +class JPXCover { +public: + + JPXCover(int sizeA); + ~JPXCover(); + void incr(int idx); + +private: + + int size, used; + int *data; +}; + +JPXCover::JPXCover(int sizeA) { + size = sizeA; + used = -1; + data = (int *)gmallocn(size, sizeof(int)); + memset(data, 0, size * sizeof(int)); +} + +JPXCover::~JPXCover() { + int i; + + printf("JPX coverage:\n"); + for (i = 0; i <= used; ++i) { + printf(" %4d: %8d\n", i, data[i]); + } + gfree(data); +} + +void JPXCover::incr(int idx) { + if (idx < size) { + ++data[idx]; + if (idx > used) { + used = idx; + } + } +} + +JPXCover jpxCover(150); + +#define cover(idx) jpxCover.incr(idx) + +#endif //----- coverage tracking + +//------------------------------------------------------------------------ + +JPXStream::JPXStream(Stream *strA): + FilterStream(strA) +{ + nComps = 0; + bpc = NULL; + width = height = 0; + haveCS = gFalse; + havePalette = gFalse; + haveCompMap = gFalse; + haveChannelDefn = gFalse; + + img.xSize = 0; + img.ySize = 0; + img.xOffset = 0; + img.yOffset = 0; + curX = 0; + curY = 0; + img.tiles = NULL; + bitBuf = 0; + bitBufLen = 0; + bitBufSkip = gFalse; + byteCount = 0; +} + +JPXStream::~JPXStream() { + close(); + delete str; +} + +void JPXStream::reset() { + str->reset(); + if (readBoxes()) { + curY = img.yOffset; + } else { + // readBoxes reported an error, so we go immediately to EOF + curY = img.ySize; + } + curX = img.xOffset; + curComp = 0; + readBufLen = 0; +} + +void JPXStream::close() { + JPXTile *tile; + JPXTileComp *tileComp; + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + Guint comp, i, k, r, pre, sb; + + gfree(bpc); + bpc = NULL; + if (havePalette) { + gfree(palette.bpc); + gfree(palette.c); + havePalette = gFalse; + } + if (haveCompMap) { + gfree(compMap.comp); + gfree(compMap.type); + gfree(compMap.pComp); + haveCompMap = gFalse; + } + if (haveChannelDefn) { + gfree(channelDefn.idx); + gfree(channelDefn.type); + gfree(channelDefn.assoc); + haveChannelDefn = gFalse; + } + + if (img.tiles) { + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + tile = &img.tiles[i]; + if (tile->tileComps) { + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + gfree(tileComp->quantSteps); + gfree(tileComp->data); + gfree(tileComp->buf); + if (tileComp->resLevels) { + for (r = 0; r <= tileComp->nDecompLevels; ++r) { + resLevel = &tileComp->resLevels[r]; + if (resLevel->precincts) { + for (pre = 0; pre < 1; ++pre) { + precinct = &resLevel->precincts[pre]; + if (precinct->subbands) { + for (sb = 0; sb < (Guint)(r == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + gfree(subband->inclusion); + gfree(subband->zeroBitPlane); + if (subband->cbs) { + for (k = 0; k < subband->nXCBs * subband->nYCBs; ++k) { + cb = &subband->cbs[k]; + gfree(cb->coeffs); + if (cb->arithDecoder) { + delete cb->arithDecoder; + } + if (cb->stats) { + delete cb->stats; + } + } + gfree(subband->cbs); + } + } + gfree(precinct->subbands); + } + } + gfree(img.tiles[i].tileComps[comp].resLevels[r].precincts); + } + } + gfree(img.tiles[i].tileComps[comp].resLevels); + } + } + gfree(img.tiles[i].tileComps); + } + } + gfree(img.tiles); + img.tiles = NULL; + } + FilterStream::close(); +} + +int JPXStream::getChar() { + int c; + + if (readBufLen < 8) { + fillReadBuf(); + } + if (readBufLen == 8) { + c = readBuf & 0xff; + readBufLen = 0; + } else if (readBufLen > 8) { + c = (readBuf >> (readBufLen - 8)) & 0xff; + readBufLen -= 8; + } else if (readBufLen == 0) { + c = EOF; + } else { + c = (readBuf << (8 - readBufLen)) & 0xff; + readBufLen = 0; + } + return c; +} + +int JPXStream::lookChar() { + int c; + + if (readBufLen < 8) { + fillReadBuf(); + } + if (readBufLen == 8) { + c = readBuf & 0xff; + } else if (readBufLen > 8) { + c = (readBuf >> (readBufLen - 8)) & 0xff; + } else if (readBufLen == 0) { + c = EOF; + } else { + c = (readBuf << (8 - readBufLen)) & 0xff; + } + return c; +} + +void JPXStream::fillReadBuf() { + JPXTileComp *tileComp; + Guint tileIdx, tx, ty; + int pix, pixBits; + + do { + if (curY >= img.ySize) { + return; + } + tileIdx = ((curY - img.yTileOffset) / img.yTileSize) * img.nXTiles + + (curX - img.xTileOffset) / img.xTileSize; +#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid + tileComp = &img.tiles[tileIdx].tileComps[curComp]; +#else + tileComp = &img.tiles[tileIdx].tileComps[havePalette ? 0 : curComp]; +#endif + tx = jpxCeilDiv((curX - img.xTileOffset) % img.xTileSize, tileComp->hSep); + ty = jpxCeilDiv((curY - img.yTileOffset) % img.yTileSize, tileComp->vSep); + pix = (int)tileComp->data[ty * (tileComp->x1 - tileComp->x0) + tx]; + pixBits = tileComp->prec; +#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid + if (++curComp == img.nComps) { +#else + if (havePalette) { + if (pix >= 0 && pix < palette.nEntries) { + pix = palette.c[pix * palette.nComps + curComp]; + } else { + pix = + pixBits = palette.bpc[curComp]; + } + if (++curComp == (Guint)(havePalette ? palette.nComps : img.nComps)) { +#endif + curComp = 0; + if (++curX == img.xSize) { + curX = img.xOffset; + ++curY; + } + } + if (pixBits == 8) { + readBuf = (readBuf << 8) | (pix & 0xff); + } else { + readBuf = (readBuf << pixBits) | (pix & ((1 << pixBits) - 1)); + } + readBufLen += pixBits; + } while (readBufLen < 8); +} + +GString *JPXStream::getPSFilter(int psLevel, char *indent) { + return NULL; +} + +GBool JPXStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void JPXStream::getImageParams(int *bitsPerComponent, + StreamColorSpaceMode *csMode) { + Guint boxType, boxLen, dataLen, csEnum; + Guint bpc1, dummy, i; + int csMeth, csPrec, csPrec1, dummy2; + StreamColorSpaceMode csMode1; + GBool haveBPC, haveCSMode; + + csPrec = 0; // make gcc happy + Guint num_components = 0; + haveBPC = haveCSMode = gFalse; + str->reset(); + if (str->lookChar() == 0xff) { + getImageParams2(bitsPerComponent, csMode); + } else { + while (readBoxHdr(&boxType, &boxLen, &dataLen)) { + if (boxType == 0x6a703268) { // JP2 header + cover(0); + // skip the superbox + } else if (boxType == 0x69686472) { // image header + cover(1); + if (readULong(&dummy) && + readULong(&dummy) && + readUWord(&num_components) && + readUByte(&bpc1) && + readUByte(&dummy) && + readUByte(&dummy) && + readUByte(&dummy)) { + *bitsPerComponent = bpc1 + 1; + haveBPC = gTrue; + } + } else if (boxType == 0x636F6C72) { // color specification + cover(2); + if (readByte(&csMeth) && + readByte(&csPrec1) && + readByte(&dummy2)) { + if (csMeth == 1) { + if (readULong(&csEnum)) { + csMode1 = streamCSNone; + if (csEnum == jpxCSBiLevel || + csEnum == jpxCSGrayscale) { + csMode1 = streamCSDeviceGray; + } else if (csEnum == jpxCSCMYK) { + csMode1 = streamCSDeviceCMYK; + } else if (csEnum == jpxCSsRGB || + csEnum == jpxCSCISesRGB || + csEnum == jpxCSROMMRGB) { + csMode1 = streamCSDeviceRGB; + } + if (csMode1 != streamCSNone && + (!haveCSMode || csPrec1 > csPrec)) { + *csMode = csMode1; + csPrec = csPrec1; + haveCSMode = gTrue; + } + for (i = 0; i < dataLen - 7; ++i) { + str->getChar(); + } + } + } else { + for (i = 0; i < dataLen - 3; ++i) { + str->getChar(); + } + } + } + } else if (boxType == 0x6A703263) { // codestream + cover(3); + if (!(haveBPC && haveCSMode)) { + getImageParams2(bitsPerComponent, csMode); + } + break; + } else { + cover(4); + for (i = 0; i < dataLen; ++i) { + str->getChar(); + } + } + } + } + if(*csMode == streamCSDeviceRGB && num_components == 4) { + *csMode = streamCSDeviceRGBX; + } + str->close(); +} + +// Get image parameters from the codestream. +void JPXStream::getImageParams2(int *bitsPerComponent, + StreamColorSpaceMode *csMode) { + int segType; + Guint segLen, nComps1, bpc1, dummy, i; + + while (readMarkerHdr(&segType, &segLen)) { + if (segType == 0x51) { // SIZ - image and tile size + cover(5); + if (readUWord(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readULong(&dummy) && + readUWord(&nComps1) && + readUByte(&bpc1)) { + *bitsPerComponent = (bpc1 & 0x7f) + 1; + // if there's no color space info, take a guess + if (nComps1 == 1) { + *csMode = streamCSDeviceGray; + } else if (nComps1 == 3) { + *csMode = streamCSDeviceRGB; + } else if (nComps1 == 4) { + *csMode = streamCSDeviceCMYK; + } + } + break; + } else { + cover(6); + if (segLen > 2) { + for (i = 0; i < segLen - 2; ++i) { + str->getChar(); + } + } + } + } +} + +GBool JPXStream::readBoxes() { + Guint boxType, boxLen, dataLen; + Guint bpc1, compression, unknownColorspace, ipr; + Guint i, j; + + haveImgHdr = gFalse; + + // check for a naked JPEG 2000 codestream (without the JP2/JPX + // wrapper) -- this appears to be a violation of the PDF spec, but + // Acrobat allows it + if (str->lookChar() == 0xff) { + cover(7); + error(getPos(), "Naked JPEG 2000 codestream, missing JP2/JPX wrapper"); + readCodestream(0); + nComps = img.nComps; + bpc = (Guint *)gmallocn(nComps, sizeof(Guint)); + for (i = 0; i < nComps; ++i) { + bpc[i] = img.tiles[0].tileComps[i].prec; + } + width = img.xSize - img.xOffset; + height = img.ySize - img.yOffset; + return gTrue; + } + + while (readBoxHdr(&boxType, &boxLen, &dataLen)) { + switch (boxType) { + case 0x6a703268: // JP2 header + // this is a grouping box ('superbox') which has no real + // contents and doesn't appear to be used consistently, i.e., + // some things which should be subboxes of the JP2 header box + // show up outside of it - so we simply ignore the JP2 header + // box + cover(8); + break; + case 0x69686472: // image header + cover(9); + if (!readULong(&height) || + !readULong(&width) || + !readUWord(&nComps) || + !readUByte(&bpc1) || + !readUByte(&compression) || + !readUByte(&unknownColorspace) || + !readUByte(&ipr)) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + if (compression != 7) { + error(getPos(), "Unknown compression type in JPX stream"); + return gFalse; + } + bpc = (Guint *)gmallocn(nComps, sizeof(Guint)); + for (i = 0; i < nComps; ++i) { + bpc[i] = bpc1; + } + haveImgHdr = gTrue; + break; + case 0x62706363: // bits per component + cover(10); + if (!haveImgHdr) { + error(getPos(), "Found bits per component box before image header box in JPX stream"); + return gFalse; + } + if (dataLen != nComps) { + error(getPos(), "Invalid bits per component box in JPX stream"); + return gFalse; + } + for (i = 0; i < nComps; ++i) { + if (!readUByte(&bpc[i])) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + break; + case 0x636F6C72: // color specification + cover(11); + if (!readColorSpecBox(dataLen)) { + return gFalse; + } + break; + case 0x70636c72: // palette + cover(12); + if (!readUWord(&palette.nEntries) || + !readUByte(&palette.nComps)) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + palette.bpc = (Guint *)gmallocn(palette.nComps, sizeof(Guint)); + palette.c = + (int *)gmallocn(palette.nEntries * palette.nComps, sizeof(int)); + for (i = 0; i < palette.nComps; ++i) { + if (!readUByte(&palette.bpc[i])) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + ++palette.bpc[i]; + } + for (i = 0; i < palette.nEntries; ++i) { + for (j = 0; j < palette.nComps; ++j) { + if (!readNBytes(((palette.bpc[j] & 0x7f) + 7) >> 3, + (palette.bpc[j] & 0x80) ? gTrue : gFalse, + &palette.c[i * palette.nComps + j])) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + } + havePalette = gTrue; + break; + case 0x636d6170: // component mapping + cover(13); + compMap.nChannels = dataLen / 4; + compMap.comp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); + compMap.type = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); + compMap.pComp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); + for (i = 0; i < compMap.nChannels; ++i) { + if (!readUWord(&compMap.comp[i]) || + !readUByte(&compMap.type[i]) || + !readUByte(&compMap.pComp[i])) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + haveCompMap = gTrue; + break; + case 0x63646566: // channel definition + cover(14); + if (!readUWord(&channelDefn.nChannels)) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + channelDefn.idx = + (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); + channelDefn.type = + (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); + channelDefn.assoc = + (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); + for (i = 0; i < channelDefn.nChannels; ++i) { + if (!readUWord(&channelDefn.idx[i]) || + !readUWord(&channelDefn.type[i]) || + !readUWord(&channelDefn.assoc[i])) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + haveChannelDefn = gTrue; + break; + case 0x6A703263: // contiguous codestream + cover(15); + if (!bpc) { + error(getPos(), "JPX stream is missing the image header box"); + } + if (!haveCS) { + error(getPos(), "JPX stream has no supported color spec"); + } + if (!readCodestream(dataLen)) { + return gFalse; + } + break; + default: + cover(16); + for (i = 0; i < dataLen; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Unexpected EOF in JPX stream"); + return gFalse; + } + } + break; + } + } + return gTrue; +} + +GBool JPXStream::readColorSpecBox(Guint dataLen) { + JPXColorSpec newCS; + Guint csApprox, csEnum; + Guint i; + GBool ok; + + ok = gFalse; + if (!readUByte(&newCS.meth) || + !readByte(&newCS.prec) || + !readUByte(&csApprox)) { + goto err; + } + switch (newCS.meth) { + case 1: // enumerated colorspace + cover(17); + if (!readULong(&csEnum)) { + goto err; + } + newCS.enumerated.type = (JPXColorSpaceType)csEnum; + switch (newCS.enumerated.type) { + case jpxCSBiLevel: + ok = gTrue; + break; + case jpxCSYCbCr1: + ok = gTrue; + break; + case jpxCSYCbCr2: + ok = gTrue; + break; + case jpxCSYCBCr3: + ok = gTrue; + break; + case jpxCSPhotoYCC: + ok = gTrue; + break; + case jpxCSCMY: + ok = gTrue; + break; + case jpxCSCMYK: + ok = gTrue; + break; + case jpxCSYCCK: + ok = gTrue; + break; + case jpxCSCIELab: + if (dataLen == 7 + 7*4) { + if (!readULong(&newCS.enumerated.cieLab.rl) || + !readULong(&newCS.enumerated.cieLab.ol) || + !readULong(&newCS.enumerated.cieLab.ra) || + !readULong(&newCS.enumerated.cieLab.oa) || + !readULong(&newCS.enumerated.cieLab.rb) || + !readULong(&newCS.enumerated.cieLab.ob) || + !readULong(&newCS.enumerated.cieLab.il)) { + goto err; + } + } else if (dataLen == 7) { + //~ this assumes the 8-bit case + cover(92); + newCS.enumerated.cieLab.rl = 100; + newCS.enumerated.cieLab.ol = 0; + newCS.enumerated.cieLab.ra = 255; + newCS.enumerated.cieLab.oa = 128; + newCS.enumerated.cieLab.rb = 255; + newCS.enumerated.cieLab.ob = 96; + newCS.enumerated.cieLab.il = 0x00443530; + } else { + goto err; + } + ok = gTrue; + break; + case jpxCSsRGB: + ok = gTrue; + break; + case jpxCSGrayscale: + ok = gTrue; + break; + case jpxCSBiLevel2: + ok = gTrue; + break; + case jpxCSCIEJab: + // not allowed in PDF + goto err; + case jpxCSCISesRGB: + ok = gTrue; + break; + case jpxCSROMMRGB: + ok = gTrue; + break; + case jpxCSsRGBYCbCr: + ok = gTrue; + break; + case jpxCSYPbPr1125: + ok = gTrue; + break; + case jpxCSYPbPr1250: + ok = gTrue; + break; + default: + goto err; + } + break; + case 2: // restricted ICC profile + case 3: // any ICC profile (JPX) + case 4: // vendor color (JPX) + cover(18); + for (i = 0; i < dataLen - 3; ++i) { + if (str->getChar() == EOF) { + goto err; + } + } + break; + } + + if (ok && (!haveCS || newCS.prec > cs.prec)) { + cs = newCS; + haveCS = gTrue; + } + + return gTrue; + + err: + error(getPos(), "Error in JPX color spec"); + return gFalse; +} + +GBool JPXStream::readCodestream(Guint len) { + JPXTile *tile; + JPXTileComp *tileComp; + int segType; + GBool haveSIZ, haveCOD, haveQCD, haveSOT; + Guint precinctSize, style; + Guint segLen, capabilities, comp, i, j, r; + + //----- main header + haveSIZ = haveCOD = haveQCD = haveSOT = gFalse; + do { + if (!readMarkerHdr(&segType, &segLen)) { + error(getPos(), "Error in JPX codestream"); + return gFalse; + } + switch (segType) { + case 0x4f: // SOC - start of codestream + // marker only + cover(19); + break; + case 0x51: // SIZ - image and tile size + cover(20); + if (!readUWord(&capabilities) || + !readULong(&img.xSize) || + !readULong(&img.ySize) || + !readULong(&img.xOffset) || + !readULong(&img.yOffset) || + !readULong(&img.xTileSize) || + !readULong(&img.yTileSize) || + !readULong(&img.xTileOffset) || + !readULong(&img.yTileOffset) || + !readUWord(&img.nComps)) { + error(getPos(), "Error in JPX SIZ marker segment"); + return gFalse; + } + if (haveImgHdr && img.nComps != nComps) { + error(getPos(), "Different number of components in JPX SIZ marker segment"); + return gFalse; + } + img.nXTiles = (img.xSize - img.xTileOffset + img.xTileSize - 1) + / img.xTileSize; + img.nYTiles = (img.ySize - img.yTileOffset + img.yTileSize - 1) + / img.yTileSize; + // check for overflow before allocating memory + if (img.nXTiles <= 0 || img.nYTiles <= 0 || + img.nXTiles >= INT_MAX / img.nYTiles) { + error(getPos(), "Bad tile count in JPX SIZ marker segment"); + return gFalse; + } + img.tiles = (JPXTile *)gmallocn(img.nXTiles * img.nYTiles, + sizeof(JPXTile)); + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + img.tiles[i].tileComps = (JPXTileComp *)gmallocn(img.nComps, + sizeof(JPXTileComp)); + for (comp = 0; comp < img.nComps; ++comp) { + img.tiles[i].tileComps[comp].quantSteps = NULL; + img.tiles[i].tileComps[comp].data = NULL; + img.tiles[i].tileComps[comp].buf = NULL; + img.tiles[i].tileComps[comp].resLevels = NULL; + } + } + for (comp = 0; comp < img.nComps; ++comp) { + if (!readUByte(&img.tiles[0].tileComps[comp].prec) || + !readUByte(&img.tiles[0].tileComps[comp].hSep) || + !readUByte(&img.tiles[0].tileComps[comp].vSep)) { + error(getPos(), "Error in JPX SIZ marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].sgned = + (img.tiles[0].tileComps[comp].prec & 0x80) ? gTrue : gFalse; + img.tiles[0].tileComps[comp].prec = + (img.tiles[0].tileComps[comp].prec & 0x7f) + 1; + for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { + img.tiles[i].tileComps[comp] = img.tiles[0].tileComps[comp]; + } + } + haveSIZ = gTrue; + break; + case 0x52: // COD - coding style default + cover(21); + if (!readUByte(&img.tiles[0].tileComps[0].style) || + !readUByte(&img.tiles[0].progOrder) || + !readUWord(&img.tiles[0].nLayers) || + !readUByte(&img.tiles[0].multiComp) || + !readUByte(&img.tiles[0].tileComps[0].nDecompLevels) || + !readUByte(&img.tiles[0].tileComps[0].codeBlockW) || + !readUByte(&img.tiles[0].tileComps[0].codeBlockH) || + !readUByte(&img.tiles[0].tileComps[0].codeBlockStyle) || + !readUByte(&img.tiles[0].tileComps[0].transform)) { + error(getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[0].codeBlockW += 2; + img.tiles[0].tileComps[0].codeBlockH += 2; + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + if (i != 0) { + img.tiles[i].progOrder = img.tiles[0].progOrder; + img.tiles[i].nLayers = img.tiles[0].nLayers; + img.tiles[i].multiComp = img.tiles[0].multiComp; + } + for (comp = 0; comp < img.nComps; ++comp) { + if (!(i == 0 && comp == 0)) { + img.tiles[i].tileComps[comp].style = + img.tiles[0].tileComps[0].style; + img.tiles[i].tileComps[comp].nDecompLevels = + img.tiles[0].tileComps[0].nDecompLevels; + img.tiles[i].tileComps[comp].codeBlockW = + img.tiles[0].tileComps[0].codeBlockW; + img.tiles[i].tileComps[comp].codeBlockH = + img.tiles[0].tileComps[0].codeBlockH; + img.tiles[i].tileComps[comp].codeBlockStyle = + img.tiles[0].tileComps[0].codeBlockStyle; + img.tiles[i].tileComps[comp].transform = + img.tiles[0].tileComps[0].transform; + } + img.tiles[i].tileComps[comp].resLevels = + (JPXResLevel *)gmallocn( + (img.tiles[i].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; + } + } + } + for (r = 0; r <= img.tiles[0].tileComps[0].nDecompLevels; ++r) { + if (img.tiles[0].tileComps[0].style & 0x01) { + cover(91); + if (!readUByte(&precinctSize)) { + error(getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[0].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[0].tileComps[0].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[0].tileComps[0].resLevels[r].precinctWidth = 15; + img.tiles[0].tileComps[0].resLevels[r].precinctHeight = 15; + } + } + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + for (comp = 0; comp < img.nComps; ++comp) { + if (!(i == 0 && comp == 0)) { + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = + img.tiles[0].tileComps[0].resLevels[r].precinctWidth; + img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = + img.tiles[0].tileComps[0].resLevels[r].precinctHeight; + } + } + } + } + haveCOD = gTrue; + break; + case 0x53: // COC - coding style component + cover(22); + if (!haveCOD) { + error(getPos(), "JPX COC marker segment before COD segment"); + return gFalse; + } + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&style) || + !readUByte(&img.tiles[0].tileComps[comp].nDecompLevels) || + !readUByte(&img.tiles[0].tileComps[comp].codeBlockW) || + !readUByte(&img.tiles[0].tileComps[comp].codeBlockH) || + !readUByte(&img.tiles[0].tileComps[comp].codeBlockStyle) || + !readUByte(&img.tiles[0].tileComps[comp].transform)) { + error(getPos(), "Error in JPX COC marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].style = + (img.tiles[0].tileComps[comp].style & ~1) | (style & 1); + img.tiles[0].tileComps[comp].codeBlockW += 2; + img.tiles[0].tileComps[comp].codeBlockH += 2; + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + if (i != 0) { + img.tiles[i].tileComps[comp].style = + img.tiles[0].tileComps[comp].style; + img.tiles[i].tileComps[comp].nDecompLevels = + img.tiles[0].tileComps[comp].nDecompLevels; + img.tiles[i].tileComps[comp].codeBlockW = + img.tiles[0].tileComps[comp].codeBlockW; + img.tiles[i].tileComps[comp].codeBlockH = + img.tiles[0].tileComps[comp].codeBlockH; + img.tiles[i].tileComps[comp].codeBlockStyle = + img.tiles[0].tileComps[comp].codeBlockStyle; + img.tiles[i].tileComps[comp].transform = + img.tiles[0].tileComps[comp].transform; + } + img.tiles[i].tileComps[comp].resLevels = + (JPXResLevel *)greallocn( + img.tiles[i].tileComps[comp].resLevels, + (img.tiles[i].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; + } + } + for (r = 0; r <= img.tiles[0].tileComps[comp].nDecompLevels; ++r) { + if (img.tiles[0].tileComps[comp].style & 0x01) { + if (!readUByte(&precinctSize)) { + error(getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = 15; + img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = 15; + } + } + for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { + for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { + img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = + img.tiles[0].tileComps[comp].resLevels[r].precinctWidth; + img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = + img.tiles[0].tileComps[comp].resLevels[r].precinctHeight; + } + } + break; + case 0x5c: // QCD - quantization default + cover(23); + if (!readUByte(&img.tiles[0].tileComps[0].quantStyle)) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x00) { + img.tiles[0].tileComps[0].nQuantSteps = segLen - 3; + img.tiles[0].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[0].tileComps[0].quantSteps[i])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x01) { + img.tiles[0].tileComps[0].nQuantSteps = 1; + img.tiles[0].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[0])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x02) { + img.tiles[0].tileComps[0].nQuantSteps = (segLen - 3) / 2; + img.tiles[0].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[i])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + for (comp = 0; comp < img.nComps; ++comp) { + if (!(i == 0 && comp == 0)) { + img.tiles[i].tileComps[comp].quantStyle = + img.tiles[0].tileComps[0].quantStyle; + img.tiles[i].tileComps[comp].nQuantSteps = + img.tiles[0].tileComps[0].nQuantSteps; + img.tiles[i].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, + img.tiles[0].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (j = 0; j < img.tiles[0].tileComps[0].nQuantSteps; ++j) { + img.tiles[i].tileComps[comp].quantSteps[j] = + img.tiles[0].tileComps[0].quantSteps[j]; + } + } + } + } + haveQCD = gTrue; + break; + case 0x5d: // QCC - quantization component + cover(24); + if (!haveQCD) { + error(getPos(), "JPX QCC marker segment before QCD segment"); + return gFalse; + } + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&img.tiles[0].tileComps[comp].quantStyle)) { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x00) { + img.tiles[0].tileComps[comp].nQuantSteps = + segLen - (img.nComps > 256 ? 5 : 4); + img.tiles[0].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[0].tileComps[comp].quantSteps[i])) { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } + } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x01) { + img.tiles[0].tileComps[comp].nQuantSteps = 1; + img.tiles[0].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[0])) { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x02) { + img.tiles[0].tileComps[comp].nQuantSteps = + (segLen - (img.nComps > 256 ? 5 : 4)) / 2; + img.tiles[0].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[i])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { + img.tiles[i].tileComps[comp].quantStyle = + img.tiles[0].tileComps[comp].quantStyle; + img.tiles[i].tileComps[comp].nQuantSteps = + img.tiles[0].tileComps[comp].nQuantSteps; + img.tiles[i].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, + img.tiles[0].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (j = 0; j < img.tiles[0].tileComps[comp].nQuantSteps; ++j) { + img.tiles[i].tileComps[comp].quantSteps[j] = + img.tiles[0].tileComps[comp].quantSteps[j]; + } + } + break; + case 0x5e: // RGN - region of interest + cover(25); +#if 1 //~ ROI is unimplemented + fprintf(stderr, "RGN\n"); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PPM marker segment"); + return gFalse; + } + } +#else + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&compInfo[comp].defROI.style) || + !readUByte(&compInfo[comp].defROI.shift)) { + error(getPos(), "Error in JPX RGN marker segment"); + return gFalse; + } +#endif + break; + case 0x5f: // POC - progression order change + cover(26); +#if 1 //~ progression order changes are unimplemented + fprintf(stderr, "POC\n"); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PPM marker segment"); + return gFalse; + } + } +#else + nProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); + progs = (JPXProgOrder *)gmallocn(nProgs, sizeof(JPXProgOrder)); + for (i = 0; i < nProgs; ++i) { + if (!readUByte(&progs[i].startRes) || + !(img.nComps > 256 && readUWord(&progs[i].startComp)) || + !(img.nComps <= 256 && readUByte(&progs[i].startComp)) || + !readUWord(&progs[i].endLayer) || + !readUByte(&progs[i].endRes) || + !(img.nComps > 256 && readUWord(&progs[i].endComp)) || + !(img.nComps <= 256 && readUByte(&progs[i].endComp)) || + !readUByte(&progs[i].progOrder)) { + error(getPos(), "Error in JPX POC marker segment"); + return gFalse; + } + } +#endif + break; + case 0x60: // PPM - packed packet headers, main header + cover(27); +#if 1 //~ packed packet headers are unimplemented + fprintf(stderr, "PPM\n"); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PPM marker segment"); + return gFalse; + } + } +#endif + break; + case 0x55: // TLM - tile-part lengths + // skipped + cover(28); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX TLM marker segment"); + return gFalse; + } + } + break; + case 0x57: // PLM - packet length, main header + // skipped + cover(29); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PLM marker segment"); + return gFalse; + } + } + break; + case 0x63: // CRG - component registration + // skipped + cover(30); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX CRG marker segment"); + return gFalse; + } + } + break; + case 0x64: // COM - comment + // skipped + cover(31); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX COM marker segment"); + return gFalse; + } + } + break; + case 0x90: // SOT - start of tile + cover(32); + haveSOT = gTrue; + break; + default: + cover(33); + error(getPos(), "Unknown marker segment %02x in JPX stream", segType); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + break; + } + } + break; + } + } while (!haveSOT); + + if (!haveSIZ) { + error(getPos(), "Missing SIZ marker segment in JPX stream"); + return gFalse; + } + if (!haveCOD) { + error(getPos(), "Missing COD marker segment in JPX stream"); + return gFalse; + } + if (!haveQCD) { + error(getPos(), "Missing QCD marker segment in JPX stream"); + return gFalse; + } + + //----- read the tile-parts + while (1) { + if (!readTilePart()) { + return gFalse; + } + if (!readMarkerHdr(&segType, &segLen)) { + error(getPos(), "Error in JPX codestream"); + return gFalse; + } + if (segType != 0x90) { // SOT - start of tile + break; + } + } + + if (segType != 0xd9) { // EOC - end of codestream + error(getPos(), "Missing EOC marker in JPX codestream"); + return gFalse; + } + + //----- finish decoding the image + for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { + tile = &img.tiles[i]; + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + inverseTransform(tileComp); + } + if (!inverseMultiCompAndDC(tile)) { + return gFalse; + } + } + + //~ can free memory below tileComps here, and also tileComp.buf + + return gTrue; +} + +GBool JPXStream::readTilePart() { + JPXTile *tile; + JPXTileComp *tileComp; + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + GBool haveSOD; + Guint tileIdx, tilePartLen, tilePartIdx, nTileParts; + GBool tilePartToEOC; + Guint precinctSize, style; + Guint n, nSBs, nx, ny, sbx0, sby0, comp, segLen; + Guint i, j, k, cbX, cbY, r, pre, sb, cbi; + int segType, level; + + // process the SOT marker segment + if (!readUWord(&tileIdx) || + !readULong(&tilePartLen) || + !readUByte(&tilePartIdx) || + !readUByte(&nTileParts)) { + error(getPos(), "Error in JPX SOT marker segment"); + return gFalse; + } + + if (tileIdx >= img.nXTiles * img.nYTiles) { + error(getPos(), "Weird tile index in JPX stream"); + return gFalse; + } + + tilePartToEOC = tilePartLen == 0; + tilePartLen -= 12; // subtract size of SOT segment + + haveSOD = gFalse; + do { + if (!readMarkerHdr(&segType, &segLen)) { + error(getPos(), "Error in JPX tile-part codestream"); + return gFalse; + } + tilePartLen -= 2 + segLen; + switch (segType) { + case 0x52: // COD - coding style default + cover(34); + if (!readUByte(&img.tiles[tileIdx].tileComps[0].style) || + !readUByte(&img.tiles[tileIdx].progOrder) || + !readUWord(&img.tiles[tileIdx].nLayers) || + !readUByte(&img.tiles[tileIdx].multiComp) || + !readUByte(&img.tiles[tileIdx].tileComps[0].nDecompLevels) || + !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockW) || + !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockH) || + !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockStyle) || + !readUByte(&img.tiles[tileIdx].tileComps[0].transform)) { + error(getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[0].codeBlockW += 2; + img.tiles[tileIdx].tileComps[0].codeBlockH += 2; + for (comp = 0; comp < img.nComps; ++comp) { + if (comp != 0) { + img.tiles[tileIdx].tileComps[comp].style = + img.tiles[tileIdx].tileComps[0].style; + img.tiles[tileIdx].tileComps[comp].nDecompLevels = + img.tiles[tileIdx].tileComps[0].nDecompLevels; + img.tiles[tileIdx].tileComps[comp].codeBlockW = + img.tiles[tileIdx].tileComps[0].codeBlockW; + img.tiles[tileIdx].tileComps[comp].codeBlockH = + img.tiles[tileIdx].tileComps[0].codeBlockH; + img.tiles[tileIdx].tileComps[comp].codeBlockStyle = + img.tiles[tileIdx].tileComps[0].codeBlockStyle; + img.tiles[tileIdx].tileComps[comp].transform = + img.tiles[tileIdx].tileComps[0].transform; + } + img.tiles[tileIdx].tileComps[comp].resLevels = + (JPXResLevel *)greallocn( + img.tiles[tileIdx].tileComps[comp].resLevels, + (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; + r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; + ++r) { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL; + } + } + for (r = 0; r <= img.tiles[tileIdx].tileComps[0].nDecompLevels; ++r) { + if (img.tiles[tileIdx].tileComps[0].style & 0x01) { + if (!readUByte(&precinctSize)) { + error(getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = 15; + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = 15; + } + } + for (comp = 1; comp < img.nComps; ++comp) { + for (r = 0; + r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; + ++r) { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth; + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = + img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight; + } + } + break; + case 0x53: // COC - coding style component + cover(35); + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&style) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].nDecompLevels) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockW) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockH) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockStyle) || + !readUByte(&img.tiles[tileIdx].tileComps[comp].transform)) { + error(getPos(), "Error in JPX COC marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[comp].style = + (img.tiles[tileIdx].tileComps[comp].style & ~1) | (style & 1); + img.tiles[tileIdx].tileComps[comp].codeBlockW += 2; + img.tiles[tileIdx].tileComps[comp].codeBlockH += 2; + img.tiles[tileIdx].tileComps[comp].resLevels = + (JPXResLevel *)greallocn( + img.tiles[tileIdx].tileComps[comp].resLevels, + (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL; + } + for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) { + if (img.tiles[tileIdx].tileComps[comp].style & 0x01) { + if (!readUByte(&precinctSize)) { + error(getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = + precinctSize & 0x0f; + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = + (precinctSize >> 4) & 0x0f; + } else { + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = 15; + img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = 15; + } + } + break; + case 0x5c: // QCD - quantization default + cover(36); + if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantStyle)) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x00) { + img.tiles[tileIdx].tileComps[0].nQuantSteps = + segLen - 3; + img.tiles[tileIdx].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x01) { + img.tiles[tileIdx].tileComps[0].nQuantSteps = 1; + img.tiles[tileIdx].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[0])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x02) { + img.tiles[tileIdx].tileComps[0].nQuantSteps = (segLen - 3) / 2; + img.tiles[tileIdx].tileComps[0].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + for (comp = 1; comp < img.nComps; ++comp) { + img.tiles[tileIdx].tileComps[comp].quantStyle = + img.tiles[tileIdx].tileComps[0].quantStyle; + img.tiles[tileIdx].tileComps[comp].nQuantSteps = + img.tiles[tileIdx].tileComps[0].nQuantSteps; + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[0].nQuantSteps, + sizeof(Guint)); + for (j = 0; j < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++j) { + img.tiles[tileIdx].tileComps[comp].quantSteps[j] = + img.tiles[tileIdx].tileComps[0].quantSteps[j]; + } + } + break; + case 0x5d: // QCC - quantization component + cover(37); + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&img.tiles[tileIdx].tileComps[comp].quantStyle)) { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) == 0x00) { + img.tiles[tileIdx].tileComps[comp].nQuantSteps = + segLen - (img.nComps > 256 ? 5 : 4); + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) { + if (!readUByte(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } + } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) + == 0x01) { + img.tiles[tileIdx].tileComps[comp].nQuantSteps = 1; + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[comp].nQuantSteps, + sizeof(Guint)); + if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[0])) { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) + == 0x02) { + img.tiles[tileIdx].tileComps[comp].nQuantSteps = + (segLen - (img.nComps > 256 ? 5 : 4)) / 2; + img.tiles[tileIdx].tileComps[comp].quantSteps = + (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, + img.tiles[tileIdx].tileComps[comp].nQuantSteps, + sizeof(Guint)); + for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) { + if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) { + error(getPos(), "Error in JPX QCD marker segment"); + return gFalse; + } + } + } else { + error(getPos(), "Error in JPX QCC marker segment"); + return gFalse; + } + break; + case 0x5e: // RGN - region of interest + cover(38); +#if 1 //~ ROI is unimplemented + fprintf(stderr, "RGN\n"); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PPM marker segment"); + return gFalse; + } + } +#else + if ((img.nComps > 256 && !readUWord(&comp)) || + (img.nComps <= 256 && !readUByte(&comp)) || + comp >= img.nComps || + !readUByte(&compInfo[comp].roi.style) || + !readUByte(&compInfo[comp].roi.shift)) { + error(getPos(), "Error in JPX RGN marker segment"); + return gFalse; + } +#endif + break; + case 0x5f: // POC - progression order change + cover(39); +#if 1 //~ progression order changes are unimplemented + fprintf(stderr, "POC\n"); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PPM marker segment"); + return gFalse; + } + } +#else + nTileProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); + tileProgs = (JPXProgOrder *)gmallocn(nTileProgs, sizeof(JPXProgOrder)); + for (i = 0; i < nTileProgs; ++i) { + if (!readUByte(&tileProgs[i].startRes) || + !(img.nComps > 256 && readUWord(&tileProgs[i].startComp)) || + !(img.nComps <= 256 && readUByte(&tileProgs[i].startComp)) || + !readUWord(&tileProgs[i].endLayer) || + !readUByte(&tileProgs[i].endRes) || + !(img.nComps > 256 && readUWord(&tileProgs[i].endComp)) || + !(img.nComps <= 256 && readUByte(&tileProgs[i].endComp)) || + !readUByte(&tileProgs[i].progOrder)) { + error(getPos(), "Error in JPX POC marker segment"); + return gFalse; + } + } +#endif + break; + case 0x61: // PPT - packed packet headers, tile-part hdr + cover(40); +#if 1 //~ packed packet headers are unimplemented + fprintf(stderr, "PPT\n"); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PPT marker segment"); + return gFalse; + } + } +#endif + case 0x58: // PLT - packet length, tile-part header + // skipped + cover(41); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX PLT marker segment"); + return gFalse; + } + } + break; + case 0x64: // COM - comment + // skipped + cover(42); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + error(getPos(), "Error in JPX COM marker segment"); + return gFalse; + } + } + break; + case 0x93: // SOD - start of data + cover(43); + haveSOD = gTrue; + break; + default: + cover(44); + error(getPos(), "Unknown marker segment %02x in JPX tile-part stream", + segType); + for (i = 0; i < segLen - 2; ++i) { + if (str->getChar() == EOF) { + break; + } + } + break; + } + } while (!haveSOD); + + //----- initialize the tile, precincts, and code-blocks + if (tilePartIdx == 0) { + tile = &img.tiles[tileIdx]; + i = tileIdx / img.nXTiles; + j = tileIdx % img.nXTiles; + if ((tile->x0 = img.xTileOffset + j * img.xTileSize) < img.xOffset) { + tile->x0 = img.xOffset; + } + if ((tile->y0 = img.yTileOffset + i * img.yTileSize) < img.yOffset) { + tile->y0 = img.yOffset; + } + if ((tile->x1 = img.xTileOffset + (j + 1) * img.xTileSize) > img.xSize) { + tile->x1 = img.xSize; + } + if ((tile->y1 = img.yTileOffset + (i + 1) * img.yTileSize) > img.ySize) { + tile->y1 = img.ySize; + } + tile->comp = 0; + tile->res = 0; + tile->precinct = 0; + tile->layer = 0; + tile->maxNDecompLevels = 0; + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + if (tileComp->nDecompLevels > tile->maxNDecompLevels) { + tile->maxNDecompLevels = tileComp->nDecompLevels; + } + tileComp->x0 = jpxCeilDiv(tile->x0, tileComp->hSep); + tileComp->y0 = jpxCeilDiv(tile->y0, tileComp->hSep); + tileComp->x1 = jpxCeilDiv(tile->x1, tileComp->hSep); + tileComp->y1 = jpxCeilDiv(tile->y1, tileComp->hSep); + tileComp->cbW = 1 << tileComp->codeBlockW; + tileComp->cbH = 1 << tileComp->codeBlockH; + tileComp->data = (int *)gmallocn((tileComp->x1 - tileComp->x0) * + (tileComp->y1 - tileComp->y0), + sizeof(int)); + if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { + n = tileComp->x1 - tileComp->x0; + } else { + n = tileComp->y1 - tileComp->y0; + } + tileComp->buf = (int *)gmallocn(n + 8, sizeof(int)); + for (r = 0; r <= tileComp->nDecompLevels; ++r) { + resLevel = &tileComp->resLevels[r]; + k = r == 0 ? tileComp->nDecompLevels + : tileComp->nDecompLevels - r + 1; + resLevel->x0 = jpxCeilDivPow2(tileComp->x0, k); + resLevel->y0 = jpxCeilDivPow2(tileComp->y0, k); + resLevel->x1 = jpxCeilDivPow2(tileComp->x1, k); + resLevel->y1 = jpxCeilDivPow2(tileComp->y1, k); + if (r == 0) { + resLevel->bx0[0] = resLevel->x0; + resLevel->by0[0] = resLevel->y0; + resLevel->bx1[0] = resLevel->x1; + resLevel->by1[0] = resLevel->y1; + } else { + resLevel->bx0[0] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k); + resLevel->by0[0] = resLevel->y0; + resLevel->bx1[0] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k); + resLevel->by1[0] = resLevel->y1; + resLevel->bx0[1] = resLevel->x0; + resLevel->by0[1] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k); + resLevel->bx1[1] = resLevel->x1; + resLevel->by1[1] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k); + resLevel->bx0[2] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k); + resLevel->by0[2] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k); + resLevel->bx1[2] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k); + resLevel->by1[2] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k); + } + resLevel->precincts = (JPXPrecinct *)gmallocn(1, sizeof(JPXPrecinct)); + for (pre = 0; pre < 1; ++pre) { + precinct = &resLevel->precincts[pre]; + precinct->x0 = resLevel->x0; + precinct->y0 = resLevel->y0; + precinct->x1 = resLevel->x1; + precinct->y1 = resLevel->y1; + nSBs = r == 0 ? 1 : 3; + precinct->subbands = + (JPXSubband *)gmallocn(nSBs, sizeof(JPXSubband)); + for (sb = 0; sb < nSBs; ++sb) { + subband = &precinct->subbands[sb]; + subband->x0 = resLevel->bx0[sb]; + subband->y0 = resLevel->by0[sb]; + subband->x1 = resLevel->bx1[sb]; + subband->y1 = resLevel->by1[sb]; + subband->nXCBs = jpxCeilDivPow2(subband->x1, + tileComp->codeBlockW) + - jpxFloorDivPow2(subband->x0, + tileComp->codeBlockW); + subband->nYCBs = jpxCeilDivPow2(subband->y1, + tileComp->codeBlockH) + - jpxFloorDivPow2(subband->y0, + tileComp->codeBlockH); + n = subband->nXCBs > subband->nYCBs ? subband->nXCBs + : subband->nYCBs; + for (subband->maxTTLevel = 0, --n; + n; + ++subband->maxTTLevel, n >>= 1) ; + n = 0; + for (level = subband->maxTTLevel; level >= 0; --level) { + nx = jpxCeilDivPow2(subband->nXCBs, level); + ny = jpxCeilDivPow2(subband->nYCBs, level); + n += nx * ny; + } + subband->inclusion = + (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode)); + subband->zeroBitPlane = + (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode)); + for (k = 0; k < n; ++k) { + subband->inclusion[k].finished = gFalse; + subband->inclusion[k].val = 0; + subband->zeroBitPlane[k].finished = gFalse; + subband->zeroBitPlane[k].val = 0; + } + subband->cbs = (JPXCodeBlock *)gmallocn(subband->nXCBs * + subband->nYCBs, + sizeof(JPXCodeBlock)); + sbx0 = jpxFloorDivPow2(subband->x0, tileComp->codeBlockW); + sby0 = jpxFloorDivPow2(subband->y0, tileComp->codeBlockH); + cb = subband->cbs; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb->x0 = (sbx0 + cbX) << tileComp->codeBlockW; + cb->x1 = cb->x0 + tileComp->cbW; + if (subband->x0 > cb->x0) { + cb->x0 = subband->x0; + } + if (subband->x1 < cb->x1) { + cb->x1 = subband->x1; + } + cb->y0 = (sby0 + cbY) << tileComp->codeBlockH; + cb->y1 = cb->y0 + tileComp->cbH; + if (subband->y0 > cb->y0) { + cb->y0 = subband->y0; + } + if (subband->y1 < cb->y1) { + cb->y1 = subband->y1; + } + cb->seen = gFalse; + cb->lBlock = 3; + cb->nextPass = jpxPassCleanup; + cb->nZeroBitPlanes = 0; + cb->coeffs = + (JPXCoeff *)gmallocn((1 << (tileComp->codeBlockW + + tileComp->codeBlockH)), + sizeof(JPXCoeff)); + for (cbi = 0; + cbi < (Guint)(1 << (tileComp->codeBlockW + + tileComp->codeBlockH)); + ++cbi) { + cb->coeffs[cbi].flags = 0; + cb->coeffs[cbi].len = 0; + cb->coeffs[cbi].mag = 0; + } + cb->arithDecoder = NULL; + cb->stats = NULL; + ++cb; + } + } + } + } + } + } + } + + return readTilePartData(tileIdx, tilePartLen, tilePartToEOC); +} + +GBool JPXStream::readTilePartData(Guint tileIdx, + Guint tilePartLen, GBool tilePartToEOC) { + JPXTile *tile; + JPXTileComp *tileComp; + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + Guint ttVal; + Guint bits, cbX, cbY, nx, ny, i, j, n, sb; + int level; + + tile = &img.tiles[tileIdx]; + + // read all packets from this tile-part + while (1) { + if (tilePartToEOC) { + //~ peek for an EOC marker + cover(93); + } else if (tilePartLen == 0) { + break; + } + + tileComp = &tile->tileComps[tile->comp]; + resLevel = &tileComp->resLevels[tile->res]; + precinct = &resLevel->precincts[tile->precinct]; + + //----- packet header + + // setup + startBitBuf(tilePartLen); + + // zero-length flag + if (!readBits(1, &bits)) { + goto err; + } + if (!bits) { + // packet is empty -- clear all code-block inclusion flags + cover(45); + for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb = &subband->cbs[cbY * subband->nXCBs + cbX]; + cb->included = gFalse; + } + } + } + } else { + + for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb = &subband->cbs[cbY * subband->nXCBs + cbX]; + + // skip code-blocks with no coefficients + if (cb->x0 >= cb->x1 || cb->y0 >= cb->y1) { + cover(46); + cb->included = gFalse; + continue; + } + + // code-block inclusion + if (cb->seen) { + cover(47); + if (!readBits(1, &cb->included)) { + goto err; + } + } else { + cover(48); + ttVal = 0; + i = 0; + for (level = subband->maxTTLevel; level >= 0; --level) { + nx = jpxCeilDivPow2(subband->nXCBs, level); + ny = jpxCeilDivPow2(subband->nYCBs, level); + j = i + (cbY >> level) * nx + (cbX >> level); + if (!subband->inclusion[j].finished && + !subband->inclusion[j].val) { + subband->inclusion[j].val = ttVal; + } else { + ttVal = subband->inclusion[j].val; + } + while (!subband->inclusion[j].finished && + ttVal <= tile->layer) { + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 1) { + subband->inclusion[j].finished = gTrue; + } else { + ++ttVal; + } + } + subband->inclusion[j].val = ttVal; + if (ttVal > tile->layer) { + break; + } + i += nx * ny; + } + cb->included = level < 0; + } + + if (cb->included) { + cover(49); + + // zero bit-plane count + if (!cb->seen) { + cover(50); + ttVal = 0; + i = 0; + for (level = subband->maxTTLevel; level >= 0; --level) { + nx = jpxCeilDivPow2(subband->nXCBs, level); + ny = jpxCeilDivPow2(subband->nYCBs, level); + j = i + (cbY >> level) * nx + (cbX >> level); + if (!subband->zeroBitPlane[j].finished && + !subband->zeroBitPlane[j].val) { + subband->zeroBitPlane[j].val = ttVal; + } else { + ttVal = subband->zeroBitPlane[j].val; + } + while (!subband->zeroBitPlane[j].finished) { + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 1) { + subband->zeroBitPlane[j].finished = gTrue; + } else { + ++ttVal; + } + } + subband->zeroBitPlane[j].val = ttVal; + i += nx * ny; + } + cb->nZeroBitPlanes = ttVal; + } + + // number of coding passes + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 0) { + cover(51); + cb->nCodingPasses = 1; + } else { + if (!readBits(1, &bits)) { + goto err; + } + if (bits == 0) { + cover(52); + cb->nCodingPasses = 2; + } else { + cover(53); + if (!readBits(2, &bits)) { + goto err; + } + if (bits < 3) { + cover(54); + cb->nCodingPasses = 3 + bits; + } else { + cover(55); + if (!readBits(5, &bits)) { + goto err; + } + if (bits < 31) { + cover(56); + cb->nCodingPasses = 6 + bits; + } else { + cover(57); + if (!readBits(7, &bits)) { + goto err; + } + cb->nCodingPasses = 37 + bits; + } + } + } + } + + // update Lblock + while (1) { + if (!readBits(1, &bits)) { + goto err; + } + if (!bits) { + break; + } + ++cb->lBlock; + } + + // length of compressed data + //~ deal with multiple codeword segments + for (n = cb->lBlock, i = cb->nCodingPasses >> 1; + i; + ++n, i >>= 1) ; + if (!readBits(n, &cb->dataLen)) { + goto err; + } + } + } + } + } + } + tilePartLen = finishBitBuf(); + + //----- packet data + + for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { + subband = &precinct->subbands[sb]; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + cb = &subband->cbs[cbY * subband->nXCBs + cbX]; + if (cb->included) { + if (!readCodeBlockData(tileComp, resLevel, precinct, subband, + tile->res, sb, cb)) { + return gFalse; + } + tilePartLen -= cb->dataLen; + cb->seen = gTrue; + } + } + } + } + + //----- next packet + + switch (tile->progOrder) { + case 0: // layer, resolution level, component, precinct + cover(58); + if (++tile->comp == img.nComps) { + tile->comp = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + } + } + } + break; + case 1: // resolution level, layer, component, precinct + cover(59); + if (++tile->comp == img.nComps) { + tile->comp = 0; + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + } + } + } + break; + case 2: // resolution level, precinct, component, layer + //~ this isn't correct -- see B.12.1.3 + cover(60); + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->comp == img.nComps) { + tile->comp = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + } + } + } + break; + case 3: // precinct, component, resolution level, layer + //~ this isn't correct -- see B.12.1.4 + cover(61); + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + if (++tile->comp == img.nComps) { + tile->comp = 0; + } + } + } + break; + case 4: // component, precinct, resolution level, layer + //~ this isn't correct -- see B.12.1.5 + cover(62); + if (++tile->layer == tile->nLayers) { + tile->layer = 0; + if (++tile->res == tile->maxNDecompLevels + 1) { + tile->res = 0; + if (++tile->comp == img.nComps) { + tile->comp = 0; + } + } + } + break; + } + } + + return gTrue; + + err: + error(getPos(), "Error in JPX stream"); + return gFalse; +} + +GBool JPXStream::readCodeBlockData(JPXTileComp *tileComp, + JPXResLevel *resLevel, + JPXPrecinct *precinct, + JPXSubband *subband, + Guint res, Guint sb, + JPXCodeBlock *cb) { + JPXCoeff *coeff0, *coeff1, *coeff; + Guint horiz, vert, diag, all, cx, xorBit; + int horizSign, vertSign; + Guint i, x, y0, y1, y2; + + if (cb->arithDecoder) { + cover(63); + cb->arithDecoder->restart(cb->dataLen); + } else { + cover(64); + cb->arithDecoder = new JArithmeticDecoder(); + cb->arithDecoder->setStream(str, cb->dataLen); + cb->arithDecoder->start(); + cb->stats = new JArithmeticDecoderStats(jpxNContexts); + cb->stats->setEntry(jpxContextSigProp, 4, 0); + cb->stats->setEntry(jpxContextRunLength, 3, 0); + cb->stats->setEntry(jpxContextUniform, 46, 0); + } + + for (i = 0; i < cb->nCodingPasses; ++i) { + switch (cb->nextPass) { + + //----- significance propagation pass + case jpxPassSigProp: + cover(65); + for (y0 = cb->y0, coeff0 = cb->coeffs; + y0 < cb->y1; + y0 += 4, coeff0 += 4 << tileComp->codeBlockW) { + for (x = cb->x0, coeff1 = coeff0; + x < cb->x1; + ++x, ++coeff1) { + for (y1 = 0, coeff = coeff1; + y1 < 4 && y0+y1 < cb->y1; + ++y1, coeff += tileComp->cbW) { + if (!(coeff->flags & jpxCoeffSignificant)) { + horiz = vert = diag = 0; + horizSign = vertSign = 2; + if (x > cb->x0) { + if (coeff[-1].flags & jpxCoeffSignificant) { + ++horiz; + horizSign += (coeff[-1].flags & jpxCoeffSign) ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += (coeff[-(int)tileComp->cbW - 1].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + diag += (coeff[tileComp->cbW - 1].flags + >> jpxCoeffSignificantB) & 1; + } + } + if (x < cb->x1 - 1) { + if (coeff[1].flags & jpxCoeffSignificant) { + ++horiz; + horizSign += (coeff[1].flags & jpxCoeffSign) ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += (coeff[-(int)tileComp->cbW + 1].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + diag += (coeff[tileComp->cbW + 1].flags + >> jpxCoeffSignificantB) & 1; + } + } + if (y0+y1 > cb->y0) { + if (coeff[-(int)tileComp->cbW].flags & jpxCoeffSignificant) { + ++vert; + vertSign += (coeff[-(int)tileComp->cbW].flags & jpxCoeffSign) + ? -1 : 1; + } + } + if (y0+y1 < cb->y1 - 1) { + if (coeff[tileComp->cbW].flags & jpxCoeffSignificant) { + ++vert; + vertSign += (coeff[tileComp->cbW].flags & jpxCoeffSign) + ? -1 : 1; + } + } + cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb]; + if (cx != 0) { + if (cb->arithDecoder->decodeBit(cx, cb->stats)) { + coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef; + coeff->mag = (coeff->mag << 1) | 1; + cx = signContext[horizSign][vertSign][0]; + xorBit = signContext[horizSign][vertSign][1]; + if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { + coeff->flags |= jpxCoeffSign; + } + } + ++coeff->len; + coeff->flags |= jpxCoeffTouched; + } + } + } + } + } + ++cb->nextPass; + break; + + //----- magnitude refinement pass + case jpxPassMagRef: + cover(66); + for (y0 = cb->y0, coeff0 = cb->coeffs; + y0 < cb->y1; + y0 += 4, coeff0 += 4 << tileComp->codeBlockW) { + for (x = cb->x0, coeff1 = coeff0; + x < cb->x1; + ++x, ++coeff1) { + for (y1 = 0, coeff = coeff1; + y1 < 4 && y0+y1 < cb->y1; + ++y1, coeff += tileComp->cbW) { + if ((coeff->flags & jpxCoeffSignificant) && + !(coeff->flags & jpxCoeffTouched)) { + if (coeff->flags & jpxCoeffFirstMagRef) { + all = 0; + if (x > cb->x0) { + all += (coeff[-1].flags >> jpxCoeffSignificantB) & 1; + if (y0+y1 > cb->y0) { + all += (coeff[-(int)tileComp->cbW - 1].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + all += (coeff[tileComp->cbW - 1].flags + >> jpxCoeffSignificantB) & 1; + } + } + if (x < cb->x1 - 1) { + all += (coeff[1].flags >> jpxCoeffSignificantB) & 1; + if (y0+y1 > cb->y0) { + all += (coeff[-(int)tileComp->cbW + 1].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + all += (coeff[tileComp->cbW + 1].flags + >> jpxCoeffSignificantB) & 1; + } + } + if (y0+y1 > cb->y0) { + all += (coeff[-(int)tileComp->cbW].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + all += (coeff[tileComp->cbW].flags + >> jpxCoeffSignificantB) & 1; + } + cx = all ? 15 : 14; + } else { + cx = 16; + } + coeff->mag = (coeff->mag << 1) | + cb->arithDecoder->decodeBit(cx, cb->stats); + ++coeff->len; + coeff->flags |= jpxCoeffTouched; + coeff->flags &= ~jpxCoeffFirstMagRef; + } + } + } + } + ++cb->nextPass; + break; + + //----- cleanup pass + case jpxPassCleanup: + cover(67); + for (y0 = cb->y0, coeff0 = cb->coeffs; + y0 < cb->y1; + y0 += 4, coeff0 += 4 << tileComp->codeBlockW) { + for (x = cb->x0, coeff1 = coeff0; + x < cb->x1; + ++x, ++coeff1) { + y1 = 0; + if (y0 + 3 < cb->y1 && + !(coeff1->flags & jpxCoeffTouched) && + !(coeff1[tileComp->cbW].flags & jpxCoeffTouched) && + !(coeff1[2 * tileComp->cbW].flags & jpxCoeffTouched) && + !(coeff1[3 * tileComp->cbW].flags & jpxCoeffTouched) && + (x == cb->x0 || y0 == cb->y0 || + !(coeff1[-(int)tileComp->cbW - 1].flags + & jpxCoeffSignificant)) && + (y0 == cb->y0 || + !(coeff1[-(int)tileComp->cbW].flags + & jpxCoeffSignificant)) && + (x == cb->x1 - 1 || y0 == cb->y0 || + !(coeff1[-(int)tileComp->cbW + 1].flags + & jpxCoeffSignificant)) && + (x == cb->x0 || + (!(coeff1[-1].flags & jpxCoeffSignificant) && + !(coeff1[tileComp->cbW - 1].flags + & jpxCoeffSignificant) && + !(coeff1[2 * tileComp->cbW - 1].flags + & jpxCoeffSignificant) && + !(coeff1[3 * tileComp->cbW - 1].flags + & jpxCoeffSignificant))) && + (x == cb->x1 - 1 || + (!(coeff1[1].flags & jpxCoeffSignificant) && + !(coeff1[tileComp->cbW + 1].flags + & jpxCoeffSignificant) && + !(coeff1[2 * tileComp->cbW + 1].flags + & jpxCoeffSignificant) && + !(coeff1[3 * tileComp->cbW + 1].flags + & jpxCoeffSignificant))) && + (x == cb->x0 || y0+4 == cb->y1 || + !(coeff1[4 * tileComp->cbW - 1].flags & jpxCoeffSignificant)) && + (y0+4 == cb->y1 || + !(coeff1[4 * tileComp->cbW].flags & jpxCoeffSignificant)) && + (x == cb->x1 - 1 || y0+4 == cb->y1 || + !(coeff1[4 * tileComp->cbW + 1].flags + & jpxCoeffSignificant))) { + if (cb->arithDecoder->decodeBit(jpxContextRunLength, cb->stats)) { + y1 = cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats); + y1 = (y1 << 1) | + cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats); + for (y2 = 0, coeff = coeff1; + y2 < y1; + ++y2, coeff += tileComp->cbW) { + ++coeff->len; + } + coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef; + coeff->mag = (coeff->mag << 1) | 1; + ++coeff->len; + cx = signContext[2][2][0]; + xorBit = signContext[2][2][1]; + if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { + coeff->flags |= jpxCoeffSign; + } + ++y1; + } else { + for (y1 = 0, coeff = coeff1; + y1 < 4; + ++y1, coeff += tileComp->cbW) { + ++coeff->len; + } + y1 = 4; + } + } + for (coeff = &coeff1[y1 << tileComp->codeBlockW]; + y1 < 4 && y0 + y1 < cb->y1; + ++y1, coeff += tileComp->cbW) { + if (!(coeff->flags & jpxCoeffTouched)) { + horiz = vert = diag = 0; + horizSign = vertSign = 2; + if (x > cb->x0) { + if (coeff[-1].flags & jpxCoeffSignificant) { + ++horiz; + horizSign += (coeff[-1].flags & jpxCoeffSign) ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += (coeff[-(int)tileComp->cbW - 1].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + diag += (coeff[tileComp->cbW - 1].flags + >> jpxCoeffSignificantB) & 1; + } + } + if (x < cb->x1 - 1) { + if (coeff[1].flags & jpxCoeffSignificant) { + ++horiz; + horizSign += (coeff[1].flags & jpxCoeffSign) ? -1 : 1; + } + if (y0+y1 > cb->y0) { + diag += (coeff[-(int)tileComp->cbW + 1].flags + >> jpxCoeffSignificantB) & 1; + } + if (y0+y1 < cb->y1 - 1) { + diag += (coeff[tileComp->cbW + 1].flags + >> jpxCoeffSignificantB) & 1; + } + } + if (y0+y1 > cb->y0) { + if (coeff[-(int)tileComp->cbW].flags & jpxCoeffSignificant) { + ++vert; + vertSign += (coeff[-(int)tileComp->cbW].flags & jpxCoeffSign) + ? -1 : 1; + } + } + if (y0+y1 < cb->y1 - 1) { + if (coeff[tileComp->cbW].flags & jpxCoeffSignificant) { + ++vert; + vertSign += (coeff[tileComp->cbW].flags & jpxCoeffSign) + ? -1 : 1; + } + } + cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb]; + if (cb->arithDecoder->decodeBit(cx, cb->stats)) { + coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef; + coeff->mag = (coeff->mag << 1) | 1; + cx = signContext[horizSign][vertSign][0]; + xorBit = signContext[horizSign][vertSign][1]; + if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { + coeff->flags |= jpxCoeffSign; + } + } + ++coeff->len; + } else { + coeff->flags &= ~jpxCoeffTouched; + } + } + } + } + cb->nextPass = jpxPassSigProp; + break; + } + } + + cb->arithDecoder->cleanup(); + return gTrue; +} + +// Inverse quantization, and wavelet transform (IDWT). This also does +// the initial shift to convert to fixed point format. +void JPXStream::inverseTransform(JPXTileComp *tileComp) { + JPXResLevel *resLevel; + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + JPXCoeff *coeff0, *coeff; + Guint qStyle, guard, eps, shift; + int shift2; + double mu; + int val; + int *dataPtr; + Guint nx0, ny0, nx1, ny1; + Guint r, cbX, cbY, x, y; + + cover(68); + + //----- (NL)LL subband (resolution level 0) + + resLevel = &tileComp->resLevels[0]; + precinct = &resLevel->precincts[0]; + subband = &precinct->subbands[0]; + + // i-quant parameters + qStyle = tileComp->quantStyle & 0x1f; + guard = (tileComp->quantStyle >> 5) & 7; + if (qStyle == 0) { + cover(69); + eps = (tileComp->quantSteps[0] >> 3) & 0x1f; + shift = guard + eps - 1; + mu = 0; // make gcc happy + } else { + cover(70); + shift = guard - 1 + tileComp->prec; + mu = (double)(0x800 + (tileComp->quantSteps[0] & 0x7ff)) / 2048.0; + } + if (tileComp->transform == 0) { + cover(71); + shift += fracBits; + } + + // copy (NL)LL into the upper-left corner of the data array, doing + // the fixed point adjustment and dequantization along the way + cb = subband->cbs; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + for (y = cb->y0, coeff0 = cb->coeffs; + y < cb->y1; + ++y, coeff0 += tileComp->cbW) { + dataPtr = &tileComp->data[(y - subband->y0) + * (tileComp->x1 - tileComp->x0) + + (cb->x0 - subband->x0)]; + for (x = cb->x0, coeff = coeff0; x < cb->x1; ++x, ++coeff) { + val = (int)coeff->mag; + if (val != 0) { + shift2 = shift - (cb->nZeroBitPlanes + coeff->len); + if (shift2 > 0) { + cover(94); + val = (val << shift2) + (1 << (shift2 - 1)); + } else { + cover(95); + val >>= -shift2; + } + if (qStyle == 0) { + cover(96); + if (tileComp->transform == 0) { + cover(97); + val &= -1 << fracBits; + } + } else { + cover(98); + val = (int)((double)val * mu); + } + if (coeff->flags & jpxCoeffSign) { + cover(99); + val = -val; + } + } + *dataPtr++ = val; + } + } + ++cb; + } + } + + //----- IDWT for each level + + for (r = 1; r <= tileComp->nDecompLevels; ++r) { + resLevel = &tileComp->resLevels[r]; + + // (n)LL is already in the upper-left corner of the + // tile-component data array -- interleave with (n)HL/LH/HH + // and inverse transform to get (n-1)LL, which will be stored + // in the upper-left corner of the tile-component data array + if (r == tileComp->nDecompLevels) { + cover(72); + nx0 = tileComp->x0; + ny0 = tileComp->y0; + nx1 = tileComp->x1; + ny1 = tileComp->y1; + } else { + cover(73); + nx0 = tileComp->resLevels[r+1].x0; + ny0 = tileComp->resLevels[r+1].y0; + nx1 = tileComp->resLevels[r+1].x1; + ny1 = tileComp->resLevels[r+1].y1; + } + inverseTransformLevel(tileComp, r, resLevel, nx0, ny0, nx1, ny1); + } +} + +// Do one level of the inverse transform: +// - take (n)LL from the tile-component data array +// - take (n)HL/LH/HH from +// - leave the resulting (n-1)LL in the tile-component data array +void JPXStream::inverseTransformLevel(JPXTileComp *tileComp, + Guint r, JPXResLevel *resLevel, + Guint nx0, Guint ny0, + Guint nx1, Guint ny1) { + JPXPrecinct *precinct; + JPXSubband *subband; + JPXCodeBlock *cb; + JPXCoeff *coeff0, *coeff; + Guint qStyle, guard, eps, shift, t; + int shift2; + double mu; + int val; + int *dataPtr; + Guint xo, yo; + Guint x, y, sb, cbX, cbY; + int xx, yy; + + //----- interleave + + // spread out LL + for (yy = resLevel->y1 - 1; yy >= (int)resLevel->y0; --yy) { + for (xx = resLevel->x1 - 1; xx >= (int)resLevel->x0; --xx) { + tileComp->data[(2 * yy - ny0) * (tileComp->x1 - tileComp->x0) + + (2 * xx - nx0)] = + tileComp->data[(yy - resLevel->y0) * (tileComp->x1 - tileComp->x0) + + (xx - resLevel->x0)]; + } + } + + // i-quant parameters + qStyle = tileComp->quantStyle & 0x1f; + guard = (tileComp->quantStyle >> 5) & 7; + + // interleave HL/LH/HH + precinct = &resLevel->precincts[0]; + for (sb = 0; sb < 3; ++sb) { + + // i-quant parameters + if (qStyle == 0) { + cover(100); + eps = (tileComp->quantSteps[3*r - 2 + sb] >> 3) & 0x1f; + shift = guard + eps - 1; + mu = 0; // make gcc happy + } else { + cover(101); + shift = guard + tileComp->prec; + if (sb == 2) { + cover(102); + ++shift; + } + t = tileComp->quantSteps[qStyle == 1 ? 0 : (3*r - 2 + sb)]; + mu = (double)(0x800 + (t & 0x7ff)) / 2048.0; + } + if (tileComp->transform == 0) { + cover(103); + shift += fracBits; + } + + // copy the subband coefficients into the data array, doing the + // fixed point adjustment and dequantization along the way + xo = (sb & 1) ? 0 : 1; + yo = (sb > 0) ? 1 : 0; + subband = &precinct->subbands[sb]; + cb = subband->cbs; + for (cbY = 0; cbY < subband->nYCBs; ++cbY) { + for (cbX = 0; cbX < subband->nXCBs; ++cbX) { + for (y = cb->y0, coeff0 = cb->coeffs; + y < cb->y1; + ++y, coeff0 += tileComp->cbW) { + dataPtr = &tileComp->data[(2 * y + yo - ny0) + * (tileComp->x1 - tileComp->x0) + + (2 * cb->x0 + xo - nx0)]; + for (x = cb->x0, coeff = coeff0; x < cb->x1; ++x, ++coeff) { + val = (int)coeff->mag; + if (val != 0) { + shift2 = shift - (cb->nZeroBitPlanes + coeff->len); + if (shift2 > 0) { + cover(74); + val = (val << shift2) + (1 << (shift2 - 1)); + } else { + cover(75); + val >>= -shift2; + } + if (qStyle == 0) { + cover(76); + if (tileComp->transform == 0) { + val &= -1 << fracBits; + } + } else { + cover(77); + val = (int)((double)val * mu); + } + if (coeff->flags & jpxCoeffSign) { + cover(78); + val = -val; + } + } + *dataPtr = val; + dataPtr += 2; + } + } + ++cb; + } + } + } + + //----- horizontal (row) transforms + dataPtr = tileComp->data; + for (y = 0; y < ny1 - ny0; ++y) { + inverseTransform1D(tileComp, dataPtr, 1, nx0, nx1); + dataPtr += tileComp->x1 - tileComp->x0; + } + + //----- vertical (column) transforms + dataPtr = tileComp->data; + for (x = 0; x < nx1 - nx0; ++x) { + inverseTransform1D(tileComp, dataPtr, + tileComp->x1 - tileComp->x0, ny0, ny1); + ++dataPtr; + } +} + +void JPXStream::inverseTransform1D(JPXTileComp *tileComp, + int *data, Guint stride, + Guint i0, Guint i1) { + int *buf; + Guint offset, end, i; + + //----- special case for length = 1 + if (i1 - i0 == 1) { + cover(79); + if (i0 & 1) { + cover(104); + *data >>= 1; + } + + } else { + cover(80); + + // choose an offset: this makes even buf[] indexes correspond to + // odd values of i, and vice versa + offset = 3 + (i0 & 1); + end = offset + i1 - i0; + + //----- gather + buf = tileComp->buf; + for (i = 0; i < i1 - i0; ++i) { + buf[offset + i] = data[i * stride]; + } + + //----- extend right + buf[end] = buf[end - 2]; + if (i1 - i0 == 2) { + cover(81); + buf[end+1] = buf[offset + 1]; + buf[end+2] = buf[offset]; + buf[end+3] = buf[offset + 1]; + } else { + cover(82); + buf[end+1] = buf[end - 3]; + if (i1 - i0 == 3) { + cover(105); + buf[end+2] = buf[offset + 1]; + buf[end+3] = buf[offset + 2]; + } else { + cover(106); + buf[end+2] = buf[end - 4]; + if (i1 - i0 == 4) { + cover(107); + buf[end+3] = buf[offset + 1]; + } else { + cover(108); + buf[end+3] = buf[end - 5]; + } + } + } + + //----- extend left + buf[offset - 1] = buf[offset + 1]; + buf[offset - 2] = buf[offset + 2]; + buf[offset - 3] = buf[offset + 3]; + if (offset == 4) { + cover(83); + buf[0] = buf[offset + 4]; + } + + //----- 9-7 irreversible filter + + if (tileComp->transform == 0) { + cover(84); + // step 1 (even) + for (i = 1; i <= end + 2; i += 2) { + buf[i] = (int)(idwtKappa * buf[i]); + } + // step 2 (odd) + for (i = 0; i <= end + 3; i += 2) { + buf[i] = (int)(idwtIKappa * buf[i]); + } + // step 3 (even) + for (i = 1; i <= end + 2; i += 2) { + buf[i] = (int)(buf[i] - idwtDelta * (buf[i-1] + buf[i+1])); + } + // step 4 (odd) + for (i = 2; i <= end + 1; i += 2) { + buf[i] = (int)(buf[i] - idwtGamma * (buf[i-1] + buf[i+1])); + } + // step 5 (even) + for (i = 3; i <= end; i += 2) { + buf[i] = (int)(buf[i] - idwtBeta * (buf[i-1] + buf[i+1])); + } + // step 6 (odd) + for (i = 4; i <= end - 1; i += 2) { + buf[i] = (int)(buf[i] - idwtAlpha * (buf[i-1] + buf[i+1])); + } + + //----- 5-3 reversible filter + + } else { + cover(85); + // step 1 (even) + for (i = 3; i <= end; i += 2) { + buf[i] -= (buf[i-1] + buf[i+1] + 2) >> 2; + } + // step 2 (odd) + for (i = 4; i < end; i += 2) { + buf[i] += (buf[i-1] + buf[i+1]) >> 1; + } + } + + //----- scatter + for (i = 0; i < i1 - i0; ++i) { + data[i * stride] = buf[offset + i]; + } + } +} + +// Inverse multi-component transform and DC level shift. This also +// converts fixed point samples back to integers. +GBool JPXStream::inverseMultiCompAndDC(JPXTile *tile) { + JPXTileComp *tileComp; + int coeff, d0, d1, d2, t, minVal, maxVal, zeroVal; + int *dataPtr; + Guint j, comp, x, y; + + //----- inverse multi-component transform + + if (tile->multiComp == 1) { + cover(86); + if (img.nComps < 3 || + tile->tileComps[0].hSep != tile->tileComps[1].hSep || + tile->tileComps[0].vSep != tile->tileComps[1].vSep || + tile->tileComps[1].hSep != tile->tileComps[2].hSep || + tile->tileComps[1].vSep != tile->tileComps[2].vSep) { + return gFalse; + } + + // inverse irreversible multiple component transform + if (tile->tileComps[0].transform == 0) { + cover(87); + j = 0; + for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) { + for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) { + d0 = tile->tileComps[0].data[j]; + d1 = tile->tileComps[1].data[j]; + d2 = tile->tileComps[2].data[j]; + tile->tileComps[0].data[j] = (int)(d0 + 1.402 * d2 + 0.5); + tile->tileComps[1].data[j] = + (int)(d0 - 0.34413 * d1 - 0.71414 * d2 + 0.5); + tile->tileComps[2].data[j] = (int)(d0 + 1.772 * d1 + 0.5); + ++j; + } + } + + // inverse reversible multiple component transform + } else { + cover(88); + j = 0; + for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) { + for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) { + d0 = tile->tileComps[0].data[j]; + d1 = tile->tileComps[1].data[j]; + d2 = tile->tileComps[2].data[j]; + tile->tileComps[1].data[j] = t = d0 - ((d2 + d1) >> 2); + tile->tileComps[0].data[j] = d2 + t; + tile->tileComps[2].data[j] = d1 + t; + ++j; + } + } + } + } + + //----- DC level shift + for (comp = 0; comp < img.nComps; ++comp) { + tileComp = &tile->tileComps[comp]; + + // signed: clip + if (tileComp->sgned) { + cover(89); + minVal = -(1 << (tileComp->prec - 1)); + maxVal = (1 << (tileComp->prec - 1)) - 1; + dataPtr = tileComp->data; + for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) { + for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) { + coeff = *dataPtr; + if (tileComp->transform == 0) { + cover(109); + coeff >>= fracBits; + } + if (coeff < minVal) { + cover(110); + coeff = minVal; + } else if (coeff > maxVal) { + cover(111); + coeff = maxVal; + } + *dataPtr++ = coeff; + } + } + + // unsigned: inverse DC level shift and clip + } else { + cover(90); + maxVal = (1 << tileComp->prec) - 1; + zeroVal = 1 << (tileComp->prec - 1); + dataPtr = tileComp->data; + for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) { + for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) { + coeff = *dataPtr; + if (tileComp->transform == 0) { + cover(112); + coeff >>= fracBits; + } + coeff += zeroVal; + if (coeff < 0) { + cover(113); + coeff = 0; + } else if (coeff > maxVal) { + cover(114); + coeff = maxVal; + } + *dataPtr++ = coeff; + } + } + } + } + + return gTrue; +} + +GBool JPXStream::readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen) { + Guint len, lenH; + + if (!readULong(&len) || + !readULong(boxType)) { + return gFalse; + } + if (len == 1) { + if (!readULong(&lenH) || !readULong(&len)) { + return gFalse; + } + if (lenH) { + error(getPos(), "JPX stream contains a box larger than 2^32 bytes"); + return gFalse; + } + *boxLen = len; + *dataLen = len - 16; + } else if (len == 0) { + *boxLen = 0; + *dataLen = 0; + } else { + *boxLen = len; + *dataLen = len - 8; + } + return gTrue; +} + +int JPXStream::readMarkerHdr(int *segType, Guint *segLen) { + int c; + + do { + do { + if ((c = str->getChar()) == EOF) { + return gFalse; + } + } while (c != 0xff); + do { + if ((c = str->getChar()) == EOF) { + return gFalse; + } + } while (c == 0xff); + } while (c == 0x00); + *segType = c; + if ((c >= 0x30 && c <= 0x3f) || + c == 0x4f || c == 0x92 || c == 0x93 || c == 0xd9) { + *segLen = 0; + return gTrue; + } + return readUWord(segLen); +} + +GBool JPXStream::readUByte(Guint *x) { + int c0; + + if ((c0 = str->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)c0; + return gTrue; +} + +GBool JPXStream::readByte(int *x) { + int c0; + + if ((c0 = str->getChar()) == EOF) { + return gFalse; + } + *x = c0; + if (c0 & 0x80) { + *x |= -1 - 0xff; + } + return gTrue; +} + +GBool JPXStream::readUWord(Guint *x) { + int c0, c1; + + if ((c0 = str->getChar()) == EOF || + (c1 = str->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 8) | c1); + return gTrue; +} + +GBool JPXStream::readULong(Guint *x) { + int c0, c1, c2, c3; + + if ((c0 = str->getChar()) == EOF || + (c1 = str->getChar()) == EOF || + (c2 = str->getChar()) == EOF || + (c3 = str->getChar()) == EOF) { + return gFalse; + } + *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); + return gTrue; +} + +GBool JPXStream::readNBytes(int nBytes, GBool signd, int *x) { + int y, c, i; + + y = 0; + for (i = 0; i < nBytes; ++i) { + if ((c = str->getChar()) == EOF) { + return gFalse; + } + y = (y << 8) + c; + } + if (signd) { + if (y & (1 << (8 * nBytes - 1))) { + y |= -1 << (8 * nBytes); + } + } + *x = y; + return gTrue; +} + +GBool JPXStream::readBits(int nBits, Guint *x) { + int c; + + while (bitBufLen < nBits) { + if (byteCount == 0 || (c = str->getChar()) == EOF) { + return gFalse; + } + --byteCount; + if (bitBufSkip) { + bitBuf = (bitBuf << 7) | (c & 0x7f); + bitBufLen += 7; + } else { + bitBuf = (bitBuf << 8) | (c & 0xff); + bitBufLen += 8; + } + bitBufSkip = c == 0xff; + } + *x = (bitBuf >> (bitBufLen - nBits)) & ((1 << nBits) - 1); + bitBufLen -= nBits; + return gTrue; +} + +void JPXStream::startBitBuf(Guint byteCountA) { + bitBufLen = 0; + bitBufSkip = gFalse; + byteCount = byteCountA; +} + +Guint JPXStream::finishBitBuf() { + if (bitBufSkip) { + str->getChar(); + --byteCount; + } + return byteCount; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h new file mode 100644 index 000000000..e96e7d388 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h @@ -0,0 +1,351 @@ +//======================================================================== +// +// JPXStream.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef JPXSTREAM_H +#define JPXSTREAM_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" +#include "Stream.h" + +class JArithmeticDecoder; +class JArithmeticDecoderStats; + +//------------------------------------------------------------------------ + +enum JPXColorSpaceType { + jpxCSBiLevel = 0, + jpxCSYCbCr1 = 1, + jpxCSYCbCr2 = 3, + jpxCSYCBCr3 = 4, + jpxCSPhotoYCC = 9, + jpxCSCMY = 11, + jpxCSCMYK = 12, + jpxCSYCCK = 13, + jpxCSCIELab = 14, + jpxCSsRGB = 16, + jpxCSGrayscale = 17, + jpxCSBiLevel2 = 18, + jpxCSCIEJab = 19, + jpxCSCISesRGB = 20, + jpxCSROMMRGB = 21, + jpxCSsRGBYCbCr = 22, + jpxCSYPbPr1125 = 23, + jpxCSYPbPr1250 = 24 +}; + +struct JPXColorSpecCIELab { + Guint rl, ol, ra, oa, rb, ob, il; +}; + +struct JPXColorSpecEnumerated { + JPXColorSpaceType type; // color space type + union { + JPXColorSpecCIELab cieLab; + }; +}; + +struct JPXColorSpec { + Guint meth; // method + int prec; // precedence + union { + JPXColorSpecEnumerated enumerated; + }; +}; + +//------------------------------------------------------------------------ + +struct JPXPalette { + Guint nEntries; // number of entries in the palette + Guint nComps; // number of components in each entry + Guint *bpc; // bits per component, for each component + int *c; // color data: + // c[i*nComps+j] = entry i, component j +}; + +//------------------------------------------------------------------------ + +struct JPXCompMap { + Guint nChannels; // number of channels + Guint *comp; // codestream components mapped to each channel + Guint *type; // 0 for direct use, 1 for palette mapping + Guint *pComp; // palette components to use +}; + +//------------------------------------------------------------------------ + +struct JPXChannelDefn { + Guint nChannels; // number of channels + Guint *idx; // channel indexes + Guint *type; // channel types + Guint *assoc; // channel associations +}; + +//------------------------------------------------------------------------ + +struct JPXTagTreeNode { + GBool finished; // true if this node is finished + Guint val; // current value +}; + +//------------------------------------------------------------------------ + +struct JPXCoeff { + Gushort flags; // flag bits + Gushort len; // number of significant bits in mag + Guint mag; // magnitude value +}; + +// coefficient flags +#define jpxCoeffSignificantB 0 +#define jpxCoeffTouchedB 1 +#define jpxCoeffFirstMagRefB 2 +#define jpxCoeffSignB 7 +#define jpxCoeffSignificant (1 << jpxCoeffSignificantB) +#define jpxCoeffTouched (1 << jpxCoeffTouchedB) +#define jpxCoeffFirstMagRef (1 << jpxCoeffFirstMagRefB) +#define jpxCoeffSign (1 << jpxCoeffSignB) + +//------------------------------------------------------------------------ + +struct JPXCodeBlock { + //----- size + Guint x0, y0, x1, y1; // bounds + + //----- persistent state + GBool seen; // true if this code-block has already + // been seen + Guint lBlock; // base number of bits used for pkt data length + Guint nextPass; // next coding pass + + //---- info from first packet + Guint nZeroBitPlanes; // number of zero bit planes + + //----- info for the current packet + Guint included; // code-block inclusion in this packet: + // 0=not included, 1=included + Guint nCodingPasses; // number of coding passes in this pkt + Guint dataLen; // pkt data length + + //----- coefficient data + JPXCoeff *coeffs; // the coefficients + JArithmeticDecoder // arithmetic decoder + *arithDecoder; + JArithmeticDecoderStats // arithmetic decoder stats + *stats; +}; + +//------------------------------------------------------------------------ + +struct JPXSubband { + //----- computed + Guint x0, y0, x1, y1; // bounds + Guint nXCBs, nYCBs; // number of code-blocks in the x and y + // directions + + //----- tag trees + Guint maxTTLevel; // max tag tree level + JPXTagTreeNode *inclusion; // inclusion tag tree for each subband + JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each + // subband + + //----- children + JPXCodeBlock *cbs; // the code-blocks (len = nXCBs * nYCBs) +}; + +//------------------------------------------------------------------------ + +struct JPXPrecinct { + //----- computed + Guint x0, y0, x1, y1; // bounds of the precinct + + //----- children + JPXSubband *subbands; // the subbands +}; + +//------------------------------------------------------------------------ + +struct JPXResLevel { + //----- from the COD and COC segments (main and tile) + Guint precinctWidth; // log2(precinct width) + Guint precinctHeight; // log2(precinct height) + + //----- computed + Guint x0, y0, x1, y1; // bounds of the tile-comp (for this res level) + Guint bx0[3], by0[3], // subband bounds + bx1[3], by1[3]; + + //---- children + JPXPrecinct *precincts; // the precincts +}; + +//------------------------------------------------------------------------ + +struct JPXTileComp { + //----- from the SIZ segment + GBool sgned; // 1 for signed, 0 for unsigned + Guint prec; // precision, in bits + Guint hSep; // horizontal separation of samples + Guint vSep; // vertical separation of samples + + //----- from the COD and COC segments (main and tile) + Guint style; // coding style parameter (Scod / Scoc) + Guint nDecompLevels; // number of decomposition levels + Guint codeBlockW; // log2(code-block width) + Guint codeBlockH; // log2(code-block height) + Guint codeBlockStyle; // code-block style + Guint transform; // wavelet transformation + + //----- from the QCD and QCC segments (main and tile) + Guint quantStyle; // quantization style + Guint *quantSteps; // quantization step size for each subband + Guint nQuantSteps; // number of entries in quantSteps + + //----- computed + Guint x0, y0, x1, y1; // bounds of the tile-comp, in ref coords + Guint cbW; // code-block width + Guint cbH; // code-block height + + //----- image data + int *data; // the decoded image data + int *buf; // intermediate buffer for the inverse + // transform + + //----- children + JPXResLevel *resLevels; // the resolution levels + // (len = nDecompLevels + 1) +}; + +//------------------------------------------------------------------------ + +struct JPXTile { + //----- from the COD segments (main and tile) + Guint progOrder; // progression order + Guint nLayers; // number of layers + Guint multiComp; // multiple component transformation + + //----- computed + Guint x0, y0, x1, y1; // bounds of the tile, in ref coords + Guint maxNDecompLevels; // max number of decomposition levels used + // in any component in this tile + + //----- progression order loop counters + Guint comp; // component + Guint res; // resolution level + Guint precinct; // precinct + Guint layer; // layer + + //----- children + JPXTileComp *tileComps; // the tile-components (len = JPXImage.nComps) +}; + +//------------------------------------------------------------------------ + +struct JPXImage { + //----- from the SIZ segment + Guint xSize, ySize; // size of reference grid + Guint xOffset, yOffset; // image offset + Guint xTileSize, yTileSize; // size of tiles + Guint xTileOffset, // offset of first tile + yTileOffset; + Guint nComps; // number of components + + //----- computed + Guint nXTiles; // number of tiles in x direction + Guint nYTiles; // number of tiles in y direction + + //----- children + JPXTile *tiles; // the tiles (len = nXTiles * nYTiles) +}; + +//------------------------------------------------------------------------ + +class JPXStream: public FilterStream { +public: + + JPXStream(Stream *strA); + virtual ~JPXStream(); + virtual StreamKind getKind() { return strJPX; } + virtual void reset(); + virtual void close(); + virtual int getChar(); + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + virtual void getImageParams(int *bitsPerComponent, + StreamColorSpaceMode *csMode); + +private: + + void fillReadBuf(); + void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode); + GBool readBoxes(); + GBool readColorSpecBox(Guint dataLen); + GBool readCodestream(Guint len); + GBool readTilePart(); + GBool readTilePartData(Guint tileIdx, + Guint tilePartLen, GBool tilePartToEOC); + GBool readCodeBlockData(JPXTileComp *tileComp, + JPXResLevel *resLevel, + JPXPrecinct *precinct, + JPXSubband *subband, + Guint res, Guint sb, + JPXCodeBlock *cb); + void inverseTransform(JPXTileComp *tileComp); + void inverseTransformLevel(JPXTileComp *tileComp, + Guint r, JPXResLevel *resLevel, + Guint nx0, Guint ny0, + Guint nx1, Guint ny1); + void inverseTransform1D(JPXTileComp *tileComp, + int *data, Guint stride, + Guint i0, Guint i1); + GBool inverseMultiCompAndDC(JPXTile *tile); + GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen); + int readMarkerHdr(int *segType, Guint *segLen); + GBool readUByte(Guint *x); + GBool readByte(int *x); + GBool readUWord(Guint *x); + GBool readULong(Guint *x); + GBool readNBytes(int nBytes, GBool signd, int *x); + GBool readBits(int nBits, Guint *x); + void startBitBuf(Guint byteCountA); + Guint finishBitBuf(); + + Guint nComps; // number of components + Guint *bpc; // bits per component, for each component + Guint width, height; // image size + GBool haveImgHdr; // set if a JP2/JPX image header has been + // found + JPXColorSpec cs; // color specification + GBool haveCS; // set if a color spec has been found + JPXPalette palette; // the palette + GBool havePalette; // set if a palette has been found + JPXCompMap compMap; // the component mapping + GBool haveCompMap; // set if a component mapping has been found + JPXChannelDefn channelDefn; // channel definition + GBool haveChannelDefn; // set if a channel defn has been found + + JPXImage img; // JPEG2000 decoder data + Guint bitBuf; // buffer for bit reads + int bitBufLen; // number of bits in bitBuf + GBool bitBufSkip; // true if next bit should be skipped + // (for bit stuffing) + Guint byteCount; // number of available bytes left + + Guint curX, curY, curComp; // current position for lookChar/getChar + Guint readBuf; // read buffer + Guint readBufLen; // number of valid bits in readBuf +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc new file mode 100644 index 000000000..ee9dc5952 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc @@ -0,0 +1,493 @@ +//======================================================================== +// +// Lexer.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "Lexer.h" +#include "Error.h" + +//------------------------------------------------------------------------ + +// A '1' in this array means the character is white space. A '1' or +// '2' means the character ends a name or command. +static char specialChars[256] = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx +}; + +//------------------------------------------------------------------------ +// Lexer +//------------------------------------------------------------------------ + +Lexer::Lexer(XRef *xref, Stream *str) { + Object obj; + + curStr.initStream(str); + streams = new Array(xref); + streams->add(curStr.copy(&obj)); + strPtr = 0; + freeArray = gTrue; + curStr.streamReset(); +} + +Lexer::Lexer(XRef *xref, Object *obj) { + Object obj2; + + if (obj->isStream()) { + streams = new Array(xref); + freeArray = gTrue; + streams->add(obj->copy(&obj2)); + } else { + streams = obj->getArray(); + freeArray = gFalse; + } + strPtr = 0; + if (streams->getLength() > 0) { + streams->get(strPtr, &curStr); + curStr.streamReset(); + } +} +static int illegalChars = 0; + +Lexer::~Lexer() { + if (!curStr.isNone()) { + curStr.streamClose(); + curStr.free(); + } + if (freeArray) { + delete streams; + } + if(illegalChars) + error(0, "Illegal characters in hex string (%d)", illegalChars); + illegalChars = 0; +} + +int Lexer::getChar() { + int c; + + c = EOF; + while (!curStr.isNone() && (c = curStr.streamGetChar()) == EOF) { + curStr.streamClose(); + curStr.free(); + ++strPtr; + if (strPtr < streams->getLength()) { + streams->get(strPtr, &curStr); + curStr.streamReset(); + } + } + return c; +} + +int Lexer::lookChar() { + if (curStr.isNone()) { + return EOF; + } + return curStr.streamLookChar(); +} + +Object *Lexer::getObj(Object *obj) { + char *p; + int c, c2; + GBool comment, neg, done; + int numParen; + int xi; + double xf, scale; + GString *s; + int n, m; + + // skip whitespace and comments + comment = gFalse; + while (1) { + if ((c = getChar()) == EOF) { + return obj->initEOF(); + } + if (comment) { + if (c == '\r' || c == '\n') + comment = gFalse; + } else if (c == '%') { + comment = gTrue; + } else if (specialChars[c] != 1) { + break; + } + } + + // start reading token + switch (c) { + + // number + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': case '.': + neg = gFalse; + xi = 0; + if (c == '-') { + neg = gTrue; + } else if (c == '.') { + goto doReal; + } else { + xi = c - '0'; + } + while (1) { + c = lookChar(); + if (isdigit(c)) { + getChar(); + xi = xi * 10 + (c - '0'); + } else if (c == '.') { + getChar(); + goto doReal; + } else { + break; + } + } + if (neg) + xi = -xi; + obj->initInt(xi); + break; + doReal: + xf = xi; + scale = 0.1; + while (1) { + c = lookChar(); + if (c == '-') { + // ignore minus signs in the middle of numbers to match + // Adobe's behavior + error(getPos(), "Badly formatted number"); + getChar(); + continue; + } + if (!isdigit(c)) { + break; + } + getChar(); + xf = xf + scale * (c - '0'); + scale *= 0.1; + } + if (neg) + xf = -xf; + obj->initReal(xf); + break; + + // string + case '(': + p = tokBuf; + n = 0; + numParen = 1; + done = gFalse; + s = NULL; + do { + c2 = EOF; + switch (c = getChar()) { + + case EOF: +#if 0 + // This breaks some PDF files, e.g., ones from Photoshop. + case '\r': + case '\n': +#endif + error(getPos(), "Unterminated string"); + done = gTrue; + break; + + case '(': + ++numParen; + c2 = c; + break; + + case ')': + if (--numParen == 0) { + done = gTrue; + } else { + c2 = c; + } + break; + + case '\\': + switch (c = getChar()) { + case 'n': + c2 = '\n'; + break; + case 'r': + c2 = '\r'; + break; + case 't': + c2 = '\t'; + break; + case 'b': + c2 = '\b'; + break; + case 'f': + c2 = '\f'; + break; + case '\\': + case '(': + case ')': + c2 = c; + break; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c2 = c - '0'; + c = lookChar(); + if (c >= '0' && c <= '7') { + getChar(); + c2 = (c2 << 3) + (c - '0'); + c = lookChar(); + if (c >= '0' && c <= '7') { + getChar(); + c2 = (c2 << 3) + (c - '0'); + } + } + break; + case '\r': + c = lookChar(); + if (c == '\n') { + getChar(); + } + break; + case '\n': + break; + case EOF: + error(getPos(), "Unterminated string"); + done = gTrue; + break; + default: + c2 = c; + break; + } + break; + + default: + c2 = c; + break; + } + + if (c2 != EOF) { + if (n == tokBufSize) { + if (!s) + s = new GString(tokBuf, tokBufSize); + else + s->append(tokBuf, tokBufSize); + p = tokBuf; + n = 0; + } + *p++ = (char)c2; + ++n; + } + } while (!done); + if (!s) + s = new GString(tokBuf, n); + else + s->append(tokBuf, n); + obj->initString(s); + break; + + // name + case '/': + p = tokBuf; + n = 0; + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (c == '#') { + c2 = lookChar(); + if (c2 >= '0' && c2 <= '9') { + c = c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + c = c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + c = c2 - 'a' + 10; + } else { + goto notEscChar; + } + getChar(); + c <<= 4; + c2 = getChar(); + if (c2 >= '0' && c2 <= '9') { + c += c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + c += c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + c += c2 - 'a' + 10; + } else { + illegalChars++; + //error(getPos(), "Illegal digit in hex char in name"); + } + } + notEscChar: + if (++n == tokBufSize) { + error(getPos(), "Name token too long"); + break; + } + *p++ = c; + } + *p = '\0'; + obj->initName(tokBuf); + break; + + // array punctuation + case '[': + case ']': + tokBuf[0] = c; + tokBuf[1] = '\0'; + obj->initCmd(tokBuf); + break; + + // hex string or dict punctuation + case '<': + c = lookChar(); + + // dict punctuation + if (c == '<') { + getChar(); + tokBuf[0] = tokBuf[1] = '<'; + tokBuf[2] = '\0'; + obj->initCmd(tokBuf); + + // hex string + } else { + p = tokBuf; + m = n = 0; + c2 = 0; + s = NULL; + while (1) { + c = getChar(); + if (c == '>') { + break; + } else if (c == EOF) { + error(getPos(), "Unterminated hex string"); + break; + } else if (specialChars[c] != 1) { + c2 = c2 << 4; + if (c >= '0' && c <= '9') + c2 += c - '0'; + else if (c >= 'A' && c <= 'F') + c2 += c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + c2 += c - 'a' + 10; + else { + illegalChars++; + //error(getPos(), "Illegal character <%02x> in hex string", c); + } + if (++m == 2) { + if (n == tokBufSize) { + if (!s) + s = new GString(tokBuf, tokBufSize); + else + s->append(tokBuf, tokBufSize); + p = tokBuf; + n = 0; + } + *p++ = (char)c2; + ++n; + c2 = 0; + m = 0; + } + } + } + if (!s) + s = new GString(tokBuf, n); + else + s->append(tokBuf, n); + if (m == 1) + s->append((char)(c2 << 4)); + obj->initString(s); + } + break; + + // dict punctuation + case '>': + c = lookChar(); + if (c == '>') { + getChar(); + tokBuf[0] = tokBuf[1] = '>'; + tokBuf[2] = '\0'; + obj->initCmd(tokBuf); + } else { + illegalChars++; + //error(getPos(), "Illegal character '>'"); + obj->initError(); + } + break; + + // error + case ')': + case '{': + case '}': + //error(getPos(), "Illegal character '%c'", c); + illegalChars++; + obj->initError(); + break; + + // command + default: + p = tokBuf; + *p++ = c; + n = 1; + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (++n == tokBufSize) { + error(getPos(), "Command token too long"); + break; + } + *p++ = c; + } + *p = '\0'; + if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) { + obj->initBool(gTrue); + } else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) { + obj->initBool(gFalse); + } else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) { + obj->initNull(); + } else { + obj->initCmd(tokBuf); + } + break; + } + return obj; +} + +void Lexer::skipToNextLine() { + int c; + + while (1) { + c = getChar(); + if (c == EOF || c == '\n') { + return; + } + if (c == '\r') { + if ((c = lookChar()) == '\n') { + getChar(); + } + return; + } + } +} + +GBool Lexer::isSpace(int c) { + return c >= 0 && c <= 0xff && specialChars[c] == 1; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h new file mode 100644 index 000000000..f6ad9ce96 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h @@ -0,0 +1,80 @@ +//======================================================================== +// +// Lexer.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef LEXER_H +#define LEXER_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" +#include "Stream.h" + +class XRef; + +#define tokBufSize 128 // size of token buffer + +//------------------------------------------------------------------------ +// Lexer +//------------------------------------------------------------------------ + +class Lexer { +public: + + // Construct a lexer for a single stream. Deletes the stream when + // lexer is deleted. + Lexer(XRef *xref, Stream *str); + + // Construct a lexer for a stream or array of streams (assumes obj + // is either a stream or array of streams). + Lexer(XRef *xref, Object *obj); + + // Destructor. + ~Lexer(); + + // Get the next object from the input stream. + Object *getObj(Object *obj); + + // Skip to the beginning of the next line in the input stream. + void skipToNextLine(); + + // Skip over one character. + void skipChar() { getChar(); } + + // Get stream. + Stream *getStream() + { return curStr.isNone() ? (Stream *)NULL : curStr.getStream(); } + + // Get current position in file. This is only used for error + // messages, so it returns an int instead of a Guint. + int getPos() + { return curStr.isNone() ? -1 : (int)curStr.streamGetPos(); } + + // Set position in file. + void setPos(Guint pos, int dir = 0) + { if (!curStr.isNone()) curStr.streamSetPos(pos, dir); } + + // Returns true if is a whitespace character. + static GBool isSpace(int c); + +private: + + int getChar(); + int lookChar(); + + Array *streams; // array of input streams + int strPtr; // index of current stream + Object curStr; // current stream + GBool freeArray; // should lexer free the streams array? + char tokBuf[tokBufSize]; // temporary token buffer +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc new file mode 100644 index 000000000..97f82038b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc @@ -0,0 +1,782 @@ +//======================================================================== +// +// Link.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "GString.h" +#include "Error.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Link.h" + +//------------------------------------------------------------------------ +// LinkAction +//------------------------------------------------------------------------ + +LinkAction *LinkAction::parseDest(Object *obj) { + LinkAction *action; + + action = new LinkGoTo(obj); + if (!action->isOk()) { + delete action; + return NULL; + } + return action; +} + +LinkAction *LinkAction::parseAction(Object *obj, GString *baseURI) { + LinkAction *action; + Object obj2, obj3, obj4; + + if (!obj->isDict()) { + error(-1, "Bad annotation action"); + return NULL; + } + + obj->dictLookup("S", &obj2); + + // GoTo action + if (obj2.isName("GoTo")) { + obj->dictLookup("D", &obj3); + action = new LinkGoTo(&obj3); + obj3.free(); + + // GoToR action + } else if (obj2.isName("GoToR")) { + obj->dictLookup("F", &obj3); + obj->dictLookup("D", &obj4); + action = new LinkGoToR(&obj3, &obj4); + obj3.free(); + obj4.free(); + + // Launch action + } else if (obj2.isName("Launch")) { + action = new LinkLaunch(obj); + + // URI action + } else if (obj2.isName("URI")) { + obj->dictLookup("URI", &obj3); + action = new LinkURI(&obj3, baseURI); + obj3.free(); + + // Named action + } else if (obj2.isName("Named")) { + obj->dictLookup("N", &obj3); + action = new LinkNamed(&obj3); + obj3.free(); + + // Movie action + } else if (obj2.isName("Movie")) { + obj->dictLookupNF("Annot", &obj3); + obj->dictLookup("T", &obj4); + action = new LinkMovie(&obj3, &obj4); + obj3.free(); + obj4.free(); + + // unknown action + } else if (obj2.isName()) { + action = new LinkUnknown(obj2.getName()); + + // action is missing or wrong type + } else { + error(-1, "Bad annotation action"); + action = NULL; + } + + obj2.free(); + + if (action && !action->isOk()) { + delete action; + return NULL; + } + return action; +} + +GString *LinkAction::getFileSpecName(Object *fileSpecObj) { + GString *name; + Object obj1; + + name = NULL; + + // string + if (fileSpecObj->isString()) { + name = fileSpecObj->getString()->copy(); + + // dictionary + } else if (fileSpecObj->isDict()) { +#ifdef WIN32 + if (!fileSpecObj->dictLookup("DOS", &obj1)->isString()) { +#else + if (!fileSpecObj->dictLookup("Unix", &obj1)->isString()) { +#endif + obj1.free(); + fileSpecObj->dictLookup("F", &obj1); + } + if (obj1.isString()) { + name = obj1.getString()->copy(); + } else { + error(-1, "Illegal file spec in link"); + } + obj1.free(); + + // error + } else { + error(-1, "Illegal file spec in link"); + } + + // system-dependent path manipulation + if (name) { +#ifdef WIN32 + int i, j; + + // "//...." --> "\...." + // "/x/...." --> "x:\...." + // "/server/share/...." --> "\\server\share\...." + // convert escaped slashes to slashes and unescaped slashes to backslashes + i = 0; + if (name->getChar(0) == '/') { + if (name->getLength() >= 2 && name->getChar(1) == '/') { + name->del(0); + i = 0; + } else if (name->getLength() >= 2 && + ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') || + (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) && + (name->getLength() == 2 || name->getChar(2) == '/')) { + name->setChar(0, name->getChar(1)); + name->setChar(1, ':'); + i = 2; + } else { + for (j = 2; j < name->getLength(); ++j) { + if (name->getChar(j-1) != '\\' && + name->getChar(j) == '/') { + break; + } + } + if (j < name->getLength()) { + name->setChar(0, '\\'); + name->insert(0, '\\'); + i = 2; + } + } + } + for (; i < name->getLength(); ++i) { + if (name->getChar(i) == '/') { + name->setChar(i, '\\'); + } else if (name->getChar(i) == '\\' && + i+1 < name->getLength() && + name->getChar(i+1) == '/') { + name->del(i); + } + } +#else + // no manipulation needed for Unix +#endif + } + + return name; +} + +//------------------------------------------------------------------------ +// LinkDest +//------------------------------------------------------------------------ + +LinkDest::LinkDest(Array *a) { + Object obj1, obj2; + + // initialize fields + left = bottom = right = top = zoom = 0; + ok = gFalse; + + // get page + if (a->getLength() < 2) { + error(-1, "Annotation destination array is too short"); + return; + } + a->getNF(0, &obj1); + if (obj1.isInt()) { + pageNum = obj1.getInt() + 1; + pageIsRef = gFalse; + } else if (obj1.isRef()) { + pageRef.num = obj1.getRefNum(); + pageRef.gen = obj1.getRefGen(); + pageIsRef = gTrue; + } else { + error(-1, "Bad annotation destination"); + goto err2; + } + obj1.free(); + + // get destination type + a->get(1, &obj1); + + // XYZ link + if (obj1.isName("XYZ")) { + kind = destXYZ; + if (a->getLength() < 3) { + changeLeft = gFalse; + } else { + a->get(2, &obj2); + if (obj2.isNull()) { + changeLeft = gFalse; + } else if (obj2.isNum()) { + changeLeft = gTrue; + left = obj2.getNum(); + } else { + error(-1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + } + if (a->getLength() < 4) { + changeTop = gFalse; + } else { + a->get(3, &obj2); + if (obj2.isNull()) { + changeTop = gFalse; + } else if (obj2.isNum()) { + changeTop = gTrue; + top = obj2.getNum(); + } else { + error(-1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + } + if (a->getLength() < 5) { + changeZoom = gFalse; + } else { + a->get(4, &obj2); + if (obj2.isNull()) { + changeZoom = gFalse; + } else if (obj2.isNum()) { + changeZoom = gTrue; + zoom = obj2.getNum(); + } else { + error(-1, "Bad annotation destination position"); + goto err1; + } + obj2.free(); + } + + // Fit link + } else if (obj1.isName("Fit")) { + if (a->getLength() < 2) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFit; + + // FitH link + } else if (obj1.isName("FitH")) { + if (a->getLength() < 3) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitH; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + top = obj2.getNum(); + obj2.free(); + + // FitV link + } else if (obj1.isName("FitV")) { + if (a->getLength() < 3) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitV; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + left = obj2.getNum(); + obj2.free(); + + // FitR link + } else if (obj1.isName("FitR")) { + if (a->getLength() < 6) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitR; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + left = obj2.getNum(); + obj2.free(); + if (!a->get(3, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + bottom = obj2.getNum(); + obj2.free(); + if (!a->get(4, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + right = obj2.getNum(); + obj2.free(); + if (!a->get(5, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + top = obj2.getNum(); + obj2.free(); + + // FitB link + } else if (obj1.isName("FitB")) { + if (a->getLength() < 2) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitB; + + // FitBH link + } else if (obj1.isName("FitBH")) { + if (a->getLength() < 3) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitBH; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + top = obj2.getNum(); + obj2.free(); + + // FitBV link + } else if (obj1.isName("FitBV")) { + if (a->getLength() < 3) { + error(-1, "Annotation destination array is too short"); + goto err2; + } + kind = destFitBV; + if (!a->get(2, &obj2)->isNum()) { + error(-1, "Bad annotation destination position"); + kind = destFit; + } + left = obj2.getNum(); + obj2.free(); + + // unknown link kind + } else { + error(-1, "Unknown annotation destination type"); + goto err2; + } + + obj1.free(); + ok = gTrue; + return; + + err1: + obj2.free(); + err2: + obj1.free(); +} + +LinkDest::LinkDest(LinkDest *dest) { + kind = dest->kind; + pageIsRef = dest->pageIsRef; + if (pageIsRef) + pageRef = dest->pageRef; + else + pageNum = dest->pageNum; + left = dest->left; + bottom = dest->bottom; + right = dest->right; + top = dest->top; + zoom = dest->zoom; + changeLeft = dest->changeLeft; + changeTop = dest->changeTop; + changeZoom = dest->changeZoom; + ok = gTrue; +} + +//------------------------------------------------------------------------ +// LinkGoTo +//------------------------------------------------------------------------ + +LinkGoTo::LinkGoTo(Object *destObj) { + dest = NULL; + namedDest = NULL; + + // named destination + if (destObj->isName()) { + namedDest = new GString(destObj->getName()); + } else if (destObj->isString()) { + namedDest = destObj->getString()->copy(); + + // destination dictionary + } else if (destObj->isArray()) { + dest = new LinkDest(destObj->getArray()); + if (!dest->isOk()) { + delete dest; + dest = NULL; + } + // error + } else { + error(-1, "Illegal annotation destination %d", destObj->getType()); + } +} + +LinkGoTo::~LinkGoTo() { + if (dest) + delete dest; + if (namedDest) + delete namedDest; +} + +//------------------------------------------------------------------------ +// LinkGoToR +//------------------------------------------------------------------------ + +LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) { + dest = NULL; + namedDest = NULL; + + // get file name + fileName = getFileSpecName(fileSpecObj); + + // named destination + if (destObj->isName()) { + namedDest = new GString(destObj->getName()); + } else if (destObj->isString()) { + namedDest = destObj->getString()->copy(); + + // destination dictionary + } else if (destObj->isArray()) { + dest = new LinkDest(destObj->getArray()); + if (!dest->isOk()) { + delete dest; + dest = NULL; + } + // error + } else { + error(-1, "Illegal annotation destination %d", destObj->getType()); + } +} + +LinkGoToR::~LinkGoToR() { + if (fileName) + delete fileName; + if (dest) + delete dest; + if (namedDest) + delete namedDest; +} + + +//------------------------------------------------------------------------ +// LinkLaunch +//------------------------------------------------------------------------ + +LinkLaunch::LinkLaunch(Object *actionObj) { + Object obj1, obj2; + + fileName = NULL; + params = NULL; + + if (actionObj->isDict()) { + if (!actionObj->dictLookup("F", &obj1)->isNull()) { + fileName = getFileSpecName(&obj1); + } else { + obj1.free(); +#ifdef WIN32 + if (actionObj->dictLookup("Win", &obj1)->isDict()) { + obj1.dictLookup("F", &obj2); + fileName = getFileSpecName(&obj2); + obj2.free(); + if (obj1.dictLookup("P", &obj2)->isString()) { + params = obj2.getString()->copy(); + } + obj2.free(); + } else { + error(-1, "Bad launch-type link action"); + } +#else + //~ This hasn't been defined by Adobe yet, so assume it looks + //~ just like the Win dictionary until they say otherwise. + if (actionObj->dictLookup("Unix", &obj1)->isDict()) { + obj1.dictLookup("F", &obj2); + fileName = getFileSpecName(&obj2); + obj2.free(); + if (obj1.dictLookup("P", &obj2)->isString()) { + params = obj2.getString()->copy(); + } + obj2.free(); + } else { + error(-1, "Bad launch-type link action"); + } +#endif + } + obj1.free(); + } +} + +LinkLaunch::~LinkLaunch() { + if (fileName) + delete fileName; + if (params) + delete params; +} + +//------------------------------------------------------------------------ +// LinkURI +//------------------------------------------------------------------------ + +LinkURI::LinkURI(Object *uriObj, GString *baseURI) { + GString *uri2; + int n; + char c; + + uri = NULL; + if (uriObj->isString()) { + uri2 = uriObj->getString()->copy(); + if (baseURI && baseURI->getLength() > 0) { + n = strcspn(uri2->getCString(), "/:"); + if (n == uri2->getLength() || uri2->getChar(n) == '/') { + uri = baseURI->copy(); + c = uri->getChar(uri->getLength() - 1); + if (c == '/' || c == '?') { + if (uri2->getChar(0) == '/') { + uri2->del(0); + } + } else { + if (uri2->getChar(0) != '/') { + uri->append('/'); + } + } + uri->append(uri2); + delete uri2; + } else { + uri = uri2; + } + } else { + uri = uri2; + } + } else { + error(-1, "Illegal URI-type link"); + } +} + +LinkURI::~LinkURI() { + if (uri) + delete uri; +} + +//------------------------------------------------------------------------ +// LinkNamed +//------------------------------------------------------------------------ + +LinkNamed::LinkNamed(Object *nameObj) { + name = NULL; + if (nameObj->isName()) { + name = new GString(nameObj->getName()); + } +} + +LinkNamed::~LinkNamed() { + if (name) { + delete name; + } +} + +//------------------------------------------------------------------------ +// LinkMovie +//------------------------------------------------------------------------ + +LinkMovie::LinkMovie(Object *annotObj, Object *titleObj) { + annotRef.num = -1; + title = NULL; + if (annotObj->isRef()) { + annotRef = annotObj->getRef(); + } else if (titleObj->isString()) { + title = titleObj->getString()->copy(); + } else { + error(-1, "Movie action is missing both the Annot and T keys"); + } +} + +LinkMovie::~LinkMovie() { + if (title) { + delete title; + } +} + +//------------------------------------------------------------------------ +// LinkUnknown +//------------------------------------------------------------------------ + +LinkUnknown::LinkUnknown(char *actionA) { + action = new GString(actionA); +} + +LinkUnknown::~LinkUnknown() { + delete action; +} + +//------------------------------------------------------------------------ +// Link +//------------------------------------------------------------------------ + +Link::Link(Dict *dict, GString *baseURI) { + Object obj1, obj2; + double t; + + action = NULL; + ok = gFalse; + + // get rectangle + if (!dict->lookup("Rect", &obj1)->isArray()) { + error(-1, "Annotation rectangle is wrong type"); + goto err2; + } + if (!obj1.arrayGet(0, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + x1 = obj2.getNum(); + obj2.free(); + if (!obj1.arrayGet(1, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + y1 = obj2.getNum(); + obj2.free(); + if (!obj1.arrayGet(2, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + x2 = obj2.getNum(); + obj2.free(); + if (!obj1.arrayGet(3, &obj2)->isNum()) { + error(-1, "Bad annotation rectangle"); + goto err1; + } + y2 = obj2.getNum(); + obj2.free(); + obj1.free(); + if (x1 > x2) { + t = x1; + x1 = x2; + x2 = t; + } + if (y1 > y2) { + t = y1; + y1 = y2; + y2 = t; + } + + // look for destination + if (!dict->lookup("Dest", &obj1)->isNull()) { + action = LinkAction::parseDest(&obj1); + + // look for action + } else { + obj1.free(); + if (dict->lookup("A", &obj1)->isDict()) { + action = LinkAction::parseAction(&obj1, baseURI); + } + } + obj1.free(); + + // check for bad action + if (action) { + ok = gTrue; + } + + return; + + err1: + obj2.free(); + err2: + obj1.free(); +} + +Link::~Link() { + if (action) { + delete action; + } +} + +//------------------------------------------------------------------------ +// Links +//------------------------------------------------------------------------ + +Links::Links(Object *annots, GString *baseURI) { + Link *link; + Object obj1, obj2; + int size; + int i; + + links = NULL; + size = 0; + numLinks = 0; + + if (annots->isArray()) { + for (i = 0; i < annots->arrayGetLength(); ++i) { + if (annots->arrayGet(i, &obj1)->isDict()) { + if (obj1.dictLookup("Subtype", &obj2)->isName("Link")) { + link = new Link(obj1.getDict(), baseURI); + if (link->isOk()) { + if (numLinks >= size) { + size += 16; + links = (Link **)greallocn(links, size, sizeof(Link *)); + } + links[numLinks++] = link; + } else { + delete link; + } + } + obj2.free(); + } + obj1.free(); + } + } +} + +Links::~Links() { + int i; + + for (i = 0; i < numLinks; ++i) + delete links[i]; + gfree(links); +} + +LinkAction *Links::find(double x, double y) { + int i; + + for (i = numLinks - 1; i >= 0; --i) { + if (links[i]->inRect(x, y)) { + return links[i]->getAction(); + } + } + return NULL; +} + +GBool Links::onLink(double x, double y) { + int i; + + for (i = 0; i < numLinks; ++i) { + if (links[i]->inRect(x, y)) + return gTrue; + } + return gFalse; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h new file mode 100644 index 000000000..698f2c852 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h @@ -0,0 +1,369 @@ +//======================================================================== +// +// Link.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef LINK_H +#define LINK_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class GString; +class Array; +class Dict; + +//------------------------------------------------------------------------ +// LinkAction +//------------------------------------------------------------------------ + +enum LinkActionKind { + actionGoTo, // go to destination + actionGoToR, // go to destination in new file + actionLaunch, // launch app (or open document) + actionURI, // URI + actionNamed, // named action + actionMovie, // movie action + actionUnknown // anything else +}; + +class LinkAction { +public: + + // Destructor. + virtual ~LinkAction() {} + + // Was the LinkAction created successfully? + virtual GBool isOk() = 0; + + // Check link action type. + virtual LinkActionKind getKind() = 0; + + // Parse a destination (old-style action) name, string, or array. + static LinkAction *parseDest(Object *obj); + + // Parse an action dictionary. + static LinkAction *parseAction(Object *obj, GString *baseURI = NULL); + + // Extract a file name from a file specification (string or + // dictionary). + static GString *getFileSpecName(Object *fileSpecObj); +}; + +//------------------------------------------------------------------------ +// LinkDest +//------------------------------------------------------------------------ + +enum LinkDestKind { + destXYZ, + destFit, + destFitH, + destFitV, + destFitR, + destFitB, + destFitBH, + destFitBV +}; + +class LinkDest { +public: + + // Build a LinkDest from the array. + LinkDest(Array *a); + + // Copy a LinkDest. + LinkDest *copy() { return new LinkDest(this); } + + // Was the LinkDest created successfully? + GBool isOk() { return ok; } + + // Accessors. + LinkDestKind getKind() { return kind; } + GBool isPageRef() { return pageIsRef; } + int getPageNum() { return pageNum; } + Ref getPageRef() { return pageRef; } + double getLeft() { return left; } + double getBottom() { return bottom; } + double getRight() { return right; } + double getTop() { return top; } + double getZoom() { return zoom; } + GBool getChangeLeft() { return changeLeft; } + GBool getChangeTop() { return changeTop; } + GBool getChangeZoom() { return changeZoom; } + +private: + + LinkDestKind kind; // destination type + GBool pageIsRef; // is the page a reference or number? + union { + Ref pageRef; // reference to page + int pageNum; // one-relative page number + }; + double left, bottom; // position + double right, top; + double zoom; // zoom factor + GBool changeLeft, changeTop; // for destXYZ links, which position + GBool changeZoom; // components to change + GBool ok; // set if created successfully + + LinkDest(LinkDest *dest); +}; + +//------------------------------------------------------------------------ +// LinkGoTo +//------------------------------------------------------------------------ + +class LinkGoTo: public LinkAction { +public: + + // Build a LinkGoTo from a destination (dictionary, name, or string). + LinkGoTo(Object *destObj); + + // Destructor. + virtual ~LinkGoTo(); + + // Was the LinkGoTo created successfully? + virtual GBool isOk() { return dest || namedDest; } + + // Accessors. + virtual LinkActionKind getKind() { return actionGoTo; } + LinkDest *getDest() { return dest; } + GString *getNamedDest() { return namedDest; } + +private: + + LinkDest *dest; // regular destination (NULL for remote + // link with bad destination) + GString *namedDest; // named destination (only one of dest and + // and namedDest may be non-NULL) +}; + +//------------------------------------------------------------------------ +// LinkGoToR +//------------------------------------------------------------------------ + +class LinkGoToR: public LinkAction { +public: + + // Build a LinkGoToR from a file spec (dictionary) and destination + // (dictionary, name, or string). + LinkGoToR(Object *fileSpecObj, Object *destObj); + + // Destructor. + virtual ~LinkGoToR(); + + // Was the LinkGoToR created successfully? + virtual GBool isOk() { return fileName && (dest || namedDest); } + + // Accessors. + virtual LinkActionKind getKind() { return actionGoToR; } + GString *getFileName() { return fileName; } + LinkDest *getDest() { return dest; } + GString *getNamedDest() { return namedDest; } + +private: + + GString *fileName; // file name + LinkDest *dest; // regular destination (NULL for remote + // link with bad destination) + GString *namedDest; // named destination (only one of dest and + // and namedDest may be non-NULL) +}; + +//------------------------------------------------------------------------ +// LinkLaunch +//------------------------------------------------------------------------ + +class LinkLaunch: public LinkAction { +public: + + // Build a LinkLaunch from an action dictionary. + LinkLaunch(Object *actionObj); + + // Destructor. + virtual ~LinkLaunch(); + + // Was the LinkLaunch created successfully? + virtual GBool isOk() { return fileName != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionLaunch; } + GString *getFileName() { return fileName; } + GString *getParams() { return params; } + +private: + + GString *fileName; // file name + GString *params; // parameters +}; + +//------------------------------------------------------------------------ +// LinkURI +//------------------------------------------------------------------------ + +class LinkURI: public LinkAction { +public: + + // Build a LinkURI given the URI (string) and base URI. + LinkURI(Object *uriObj, GString *baseURI); + + // Destructor. + virtual ~LinkURI(); + + // Was the LinkURI created successfully? + virtual GBool isOk() { return uri != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionURI; } + GString *getURI() { return uri; } + +private: + + GString *uri; // the URI +}; + +//------------------------------------------------------------------------ +// LinkNamed +//------------------------------------------------------------------------ + +class LinkNamed: public LinkAction { +public: + + // Build a LinkNamed given the action name. + LinkNamed(Object *nameObj); + + virtual ~LinkNamed(); + + virtual GBool isOk() { return name != NULL; } + + virtual LinkActionKind getKind() { return actionNamed; } + GString *getName() { return name; } + +private: + + GString *name; +}; + +//------------------------------------------------------------------------ +// LinkMovie +//------------------------------------------------------------------------ + +class LinkMovie: public LinkAction { +public: + + LinkMovie(Object *annotObj, Object *titleObj); + + virtual ~LinkMovie(); + + virtual GBool isOk() { return annotRef.num >= 0 || title != NULL; } + + virtual LinkActionKind getKind() { return actionMovie; } + GBool hasAnnotRef() { return annotRef.num >= 0; } + Ref *getAnnotRef() { return &annotRef; } + GString *getTitle() { return title; } + +private: + + Ref annotRef; + GString *title; +}; + +//------------------------------------------------------------------------ +// LinkUnknown +//------------------------------------------------------------------------ + +class LinkUnknown: public LinkAction { +public: + + // Build a LinkUnknown with the specified action type. + LinkUnknown(char *actionA); + + // Destructor. + virtual ~LinkUnknown(); + + // Was the LinkUnknown create successfully? + virtual GBool isOk() { return action != NULL; } + + // Accessors. + virtual LinkActionKind getKind() { return actionUnknown; } + GString *getAction() { return action; } + +private: + + GString *action; // action subtype +}; + +//------------------------------------------------------------------------ +// Link +//------------------------------------------------------------------------ + +class Link { +public: + + // Construct a link, given its dictionary. + Link(Dict *dict, GString *baseURI); + + // Destructor. + ~Link(); + + // Was the link created successfully? + GBool isOk() { return ok; } + + // Check if point is inside the link rectangle. + GBool inRect(double x, double y) + { return x1 <= x && x <= x2 && y1 <= y && y <= y2; } + + // Get action. + LinkAction *getAction() { return action; } + + // Get the link rectangle. + void getRect(double *xa1, double *ya1, double *xa2, double *ya2) + { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; } + +private: + + double x1, y1; // lower left corner + double x2, y2; // upper right corner + LinkAction *action; // action + GBool ok; // is link valid? +}; + +//------------------------------------------------------------------------ +// Links +//------------------------------------------------------------------------ + +class Links { +public: + + // Extract links from array of annotations. + Links(Object *annots, GString *baseURI); + + // Destructor. + ~Links(); + + // Iterate through list of links. + int getNumLinks() { return numLinks; } + Link *getLink(int i) { return links[i]; } + + // If point , is in a link, return the associated action; + // else return NULL. + LinkAction *find(double x, double y); + + // Return true if , is in a link. + GBool onLink(double x, double y); + +private: + + Link **links; + int numLinks; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc new file mode 100644 index 000000000..7ebf4e165 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc @@ -0,0 +1,116 @@ +//======================================================================== +// +// NameToCharCode.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "NameToCharCode.h" + +//------------------------------------------------------------------------ + +struct NameToCharCodeEntry { + char *name; + CharCode c; +}; + +//------------------------------------------------------------------------ + +NameToCharCode::NameToCharCode() { + int i; + + size = 31; + len = 0; + tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry)); + for (i = 0; i < size; ++i) { + tab[i].name = NULL; + } +} + +NameToCharCode::~NameToCharCode() { + int i; + + for (i = 0; i < size; ++i) { + if (tab[i].name) { + gfree(tab[i].name); + } + } + gfree(tab); +} + +void NameToCharCode::add(char *name, CharCode c) { + NameToCharCodeEntry *oldTab; + int h, i, oldSize; + + // expand the table if necessary + if (len >= size / 2) { + oldSize = size; + oldTab = tab; + size = 2*size + 1; + tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry)); + for (h = 0; h < size; ++h) { + tab[h].name = NULL; + } + for (i = 0; i < oldSize; ++i) { + if (oldTab[i].name) { + h = hash(oldTab[i].name); + while (tab[h].name) { + if (++h == size) { + h = 0; + } + } + tab[h] = oldTab[i]; + } + } + gfree(oldTab); + } + + // add the new name + h = hash(name); + while (tab[h].name && strcmp(tab[h].name, name)) { + if (++h == size) { + h = 0; + } + } + if (!tab[h].name) { + tab[h].name = copyString(name); + } + tab[h].c = c; + + ++len; +} + +CharCode NameToCharCode::lookup(char *name) { + int h; + + h = hash(name); + while (tab[h].name) { + if (!strcmp(tab[h].name, name)) { + return tab[h].c; + } + if (++h == size) { + h = 0; + } + } + return 0; +} + +int NameToCharCode::hash(char *name) { + char *p; + unsigned int h; + + h = 0; + for (p = name; *p; ++p) { + h = 17 * h + (int)(*p & 0xff); + } + return (int)(h % size); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h new file mode 100644 index 000000000..65453c3a3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h @@ -0,0 +1,42 @@ +//======================================================================== +// +// NameToCharCode.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef NAMETOCHARCODE_H +#define NAMETOCHARCODE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "CharTypes.h" + +struct NameToCharCodeEntry; + +//------------------------------------------------------------------------ + +class NameToCharCode { +public: + + NameToCharCode(); + ~NameToCharCode(); + + void add(char *name, CharCode c); + CharCode lookup(char *name); + +private: + + int hash(char *name); + + NameToCharCodeEntry *tab; + int size; + int len; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h new file mode 100644 index 000000000..c5ecba496 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h @@ -0,0 +1,1097 @@ +//======================================================================== +// +// NameToUnicodeTable.h +// +// Copyright 2001-2004 Glyph & Cog, LLC +// +//======================================================================== + +static struct { + Unicode u; + char *name; +} nameToUnicodeTab[] = { + {0x0021, "!"}, + {0x0023, "#"}, + {0x0024, "$"}, + {0x0025, "%"}, + {0x0026, "&"}, + {0x0027, "'"}, + {0x0028, "("}, + {0x0029, ")"}, + {0x002a, "*"}, + {0x002b, "+"}, + {0x002c, ","}, + {0x002d, "-"}, + {0x002e, "."}, + {0x002f, "/"}, + {0x0030, "0"}, + {0x0031, "1"}, + {0x0032, "2"}, + {0x0033, "3"}, + {0x0034, "4"}, + {0x0035, "5"}, + {0x0036, "6"}, + {0x0037, "7"}, + {0x0038, "8"}, + {0x0039, "9"}, + {0x003a, ":"}, + {0x003b, ";"}, + {0x003c, "<"}, + {0x003d, "="}, + {0x003e, ">"}, + {0x003f, "?"}, + {0x0040, "@"}, + {0x0041, "A"}, + {0x00c6, "AE"}, + {0x01fc, "AEacute"}, + {0xf7e6, "AEsmall"}, + {0x00c1, "Aacute"}, + {0xf7e1, "Aacutesmall"}, + {0x0102, "Abreve"}, + {0x00c2, "Acircumflex"}, + {0xf7e2, "Acircumflexsmall"}, + {0xf6c9, "Acute"}, + {0xf7b4, "Acutesmall"}, + {0x00c4, "Adieresis"}, + {0xf7e4, "Adieresissmall"}, + {0x00c0, "Agrave"}, + {0xf7e0, "Agravesmall"}, + {0x0391, "Alpha"}, + {0x0386, "Alphatonos"}, + {0x0100, "Amacron"}, + {0x0104, "Aogonek"}, + {0x00c5, "Aring"}, + {0x01fa, "Aringacute"}, + {0xf7e5, "Aringsmall"}, + {0xf761, "Asmall"}, + {0x00c3, "Atilde"}, + {0xf7e3, "Atildesmall"}, + {0x0042, "B"}, + {0x0392, "Beta"}, + {0xf6f4, "Brevesmall"}, + {0xf762, "Bsmall"}, + {0x0043, "C"}, + {0x0106, "Cacute"}, + {0xf6ca, "Caron"}, + {0xf6f5, "Caronsmall"}, + {0x010c, "Ccaron"}, + {0x00c7, "Ccedilla"}, + {0xf7e7, "Ccedillasmall"}, + {0x0108, "Ccircumflex"}, + {0x010a, "Cdotaccent"}, + {0xf7b8, "Cedillasmall"}, + {0x03a7, "Chi"}, + {0xf6f6, "Circumflexsmall"}, + {0xf763, "Csmall"}, + {0x0044, "D"}, + {0x010e, "Dcaron"}, + {0x0110, "Dcroat"}, + {0x2206, "Delta"}, + {0xf6cb, "Dieresis"}, + {0xf6cc, "DieresisAcute"}, + {0xf6cd, "DieresisGrave"}, + {0xf7a8, "Dieresissmall"}, + {0xf6f7, "Dotaccentsmall"}, + {0xf764, "Dsmall"}, + {0x0045, "E"}, + {0x00c9, "Eacute"}, + {0xf7e9, "Eacutesmall"}, + {0x0114, "Ebreve"}, + {0x011a, "Ecaron"}, + {0x00ca, "Ecircumflex"}, + {0xf7ea, "Ecircumflexsmall"}, + {0x00cb, "Edieresis"}, + {0xf7eb, "Edieresissmall"}, + {0x0116, "Edotaccent"}, + {0x00c8, "Egrave"}, + {0xf7e8, "Egravesmall"}, + {0x0112, "Emacron"}, + {0x014a, "Eng"}, + {0x0118, "Eogonek"}, + {0x0395, "Epsilon"}, + {0x0388, "Epsilontonos"}, + {0xf765, "Esmall"}, + {0x0397, "Eta"}, + {0x0389, "Etatonos"}, + {0x00d0, "Eth"}, + {0xf7f0, "Ethsmall"}, + {0x20ac, "Euro"}, + {0x0046, "F"}, + {0xf766, "Fsmall"}, + {0x0047, "G"}, + {0x0393, "Gamma"}, + {0x011e, "Gbreve"}, + {0x01e6, "Gcaron"}, + {0x011c, "Gcircumflex"}, + {0x0122, "Gcommaaccent"}, + {0x0120, "Gdotaccent"}, + {0xf6ce, "Grave"}, + {0xf760, "Gravesmall"}, + {0xf767, "Gsmall"}, + {0x0048, "H"}, + {0x25cf, "H18533"}, + {0x25aa, "H18543"}, + {0x25ab, "H18551"}, + {0x25a1, "H22073"}, + {0x0126, "Hbar"}, + {0x0124, "Hcircumflex"}, + {0xf768, "Hsmall"}, + {0xf6cf, "Hungarumlaut"}, + {0xf6f8, "Hungarumlautsmall"}, + {0x0049, "I"}, + {0x0132, "IJ"}, + {0x00cd, "Iacute"}, + {0xf7ed, "Iacutesmall"}, + {0x012c, "Ibreve"}, + {0x00ce, "Icircumflex"}, + {0xf7ee, "Icircumflexsmall"}, + {0x00cf, "Idieresis"}, + {0xf7ef, "Idieresissmall"}, + {0x0130, "Idotaccent"}, + {0x2111, "Ifraktur"}, + {0x00cc, "Igrave"}, + {0xf7ec, "Igravesmall"}, + {0x012a, "Imacron"}, + {0x012e, "Iogonek"}, + {0x0399, "Iota"}, + {0x03aa, "Iotadieresis"}, + {0x038a, "Iotatonos"}, + {0xf769, "Ismall"}, + {0x0128, "Itilde"}, + {0x004a, "J"}, + {0x0134, "Jcircumflex"}, + {0xf76a, "Jsmall"}, + {0x004b, "K"}, + {0x039a, "Kappa"}, + {0x0136, "Kcommaaccent"}, + {0xf76b, "Ksmall"}, + {0x004c, "L"}, + {0xf6bf, "LL"}, + {0x0139, "Lacute"}, + {0x039b, "Lambda"}, + {0x013d, "Lcaron"}, + {0x013b, "Lcommaaccent"}, + {0x013f, "Ldot"}, + {0x0141, "Lslash"}, + {0xf6f9, "Lslashsmall"}, + {0xf76c, "Lsmall"}, + {0x004d, "M"}, + {0xf6d0, "Macron"}, + {0xf7af, "Macronsmall"}, + {0xf76d, "Msmall"}, + {0x039c, "Mu"}, + {0x004e, "N"}, + {0x0143, "Nacute"}, + {0x0147, "Ncaron"}, + {0x0145, "Ncommaaccent"}, + {0xf76e, "Nsmall"}, + {0x00d1, "Ntilde"}, + {0xf7f1, "Ntildesmall"}, + {0x039d, "Nu"}, + {0x004f, "O"}, + {0x0152, "OE"}, + {0xf6fa, "OEsmall"}, + {0x00d3, "Oacute"}, + {0xf7f3, "Oacutesmall"}, + {0x014e, "Obreve"}, + {0x00d4, "Ocircumflex"}, + {0xf7f4, "Ocircumflexsmall"}, + {0x00d6, "Odieresis"}, + {0xf7f6, "Odieresissmall"}, + {0xf6fb, "Ogoneksmall"}, + {0x00d2, "Ograve"}, + {0xf7f2, "Ogravesmall"}, + {0x01a0, "Ohorn"}, + {0x0150, "Ohungarumlaut"}, + {0x014c, "Omacron"}, + {0x2126, "Omega"}, + {0x038f, "Omegatonos"}, + {0x039f, "Omicron"}, + {0x038c, "Omicrontonos"}, + {0x00d8, "Oslash"}, + {0x01fe, "Oslashacute"}, + {0xf7f8, "Oslashsmall"}, + {0xf76f, "Osmall"}, + {0x00d5, "Otilde"}, + {0xf7f5, "Otildesmall"}, + {0x0050, "P"}, + {0x03a6, "Phi"}, + {0x03a0, "Pi"}, + {0x03a8, "Psi"}, + {0xf770, "Psmall"}, + {0x0051, "Q"}, + {0xf771, "Qsmall"}, + {0x0052, "R"}, + {0x0154, "Racute"}, + {0x0158, "Rcaron"}, + {0x0156, "Rcommaaccent"}, + {0x211c, "Rfraktur"}, + {0x03a1, "Rho"}, + {0xf6fc, "Ringsmall"}, + {0xf772, "Rsmall"}, + {0x0053, "S"}, + {0x250c, "SF010000"}, + {0x2514, "SF020000"}, + {0x2510, "SF030000"}, + {0x2518, "SF040000"}, + {0x253c, "SF050000"}, + {0x252c, "SF060000"}, + {0x2534, "SF070000"}, + {0x251c, "SF080000"}, + {0x2524, "SF090000"}, + {0x2500, "SF100000"}, + {0x2502, "SF110000"}, + {0x2561, "SF190000"}, + {0x2562, "SF200000"}, + {0x2556, "SF210000"}, + {0x2555, "SF220000"}, + {0x2563, "SF230000"}, + {0x2551, "SF240000"}, + {0x2557, "SF250000"}, + {0x255d, "SF260000"}, + {0x255c, "SF270000"}, + {0x255b, "SF280000"}, + {0x255e, "SF360000"}, + {0x255f, "SF370000"}, + {0x255a, "SF380000"}, + {0x2554, "SF390000"}, + {0x2569, "SF400000"}, + {0x2566, "SF410000"}, + {0x2560, "SF420000"}, + {0x2550, "SF430000"}, + {0x256c, "SF440000"}, + {0x2567, "SF450000"}, + {0x2568, "SF460000"}, + {0x2564, "SF470000"}, + {0x2565, "SF480000"}, + {0x2559, "SF490000"}, + {0x2558, "SF500000"}, + {0x2552, "SF510000"}, + {0x2553, "SF520000"}, + {0x256b, "SF530000"}, + {0x256a, "SF540000"}, + {0x015a, "Sacute"}, + {0x0160, "Scaron"}, + {0xf6fd, "Scaronsmall"}, + {0x015e, "Scedilla"}, + {0x015c, "Scircumflex"}, + {0x0218, "Scommaaccent"}, + {0x03a3, "Sigma"}, + {0xf773, "Ssmall"}, + {0x0054, "T"}, + {0x03a4, "Tau"}, + {0x0166, "Tbar"}, + {0x0164, "Tcaron"}, + {0x0162, "Tcommaaccent"}, + {0x0398, "Theta"}, + {0x00de, "Thorn"}, + {0xf7fe, "Thornsmall"}, + {0xf6fe, "Tildesmall"}, + {0xf774, "Tsmall"}, + {0x0055, "U"}, + {0x00da, "Uacute"}, + {0xf7fa, "Uacutesmall"}, + {0x016c, "Ubreve"}, + {0x00db, "Ucircumflex"}, + {0xf7fb, "Ucircumflexsmall"}, + {0x00dc, "Udieresis"}, + {0xf7fc, "Udieresissmall"}, + {0x00d9, "Ugrave"}, + {0xf7f9, "Ugravesmall"}, + {0x01af, "Uhorn"}, + {0x0170, "Uhungarumlaut"}, + {0x016a, "Umacron"}, + {0x0172, "Uogonek"}, + {0x03a5, "Upsilon"}, + {0x03d2, "Upsilon1"}, + {0x03ab, "Upsilondieresis"}, + {0x038e, "Upsilontonos"}, + {0x016e, "Uring"}, + {0xf775, "Usmall"}, + {0x0168, "Utilde"}, + {0x0056, "V"}, + {0xf776, "Vsmall"}, + {0x0057, "W"}, + {0x1e82, "Wacute"}, + {0x0174, "Wcircumflex"}, + {0x1e84, "Wdieresis"}, + {0x1e80, "Wgrave"}, + {0xf777, "Wsmall"}, + {0x0058, "X"}, + {0x039e, "Xi"}, + {0xf778, "Xsmall"}, + {0x0059, "Y"}, + {0x00dd, "Yacute"}, + {0xf7fd, "Yacutesmall"}, + {0x0176, "Ycircumflex"}, + {0x0178, "Ydieresis"}, + {0xf7ff, "Ydieresissmall"}, + {0x1ef2, "Ygrave"}, + {0xf779, "Ysmall"}, + {0x005a, "Z"}, + {0x0179, "Zacute"}, + {0x017d, "Zcaron"}, + {0xf6ff, "Zcaronsmall"}, + {0x017b, "Zdotaccent"}, + {0x0396, "Zeta"}, + {0xf77a, "Zsmall"}, + {0x0022, "\""}, + {0x005c, "\\"}, + {0x005d, "]"}, + {0x005e, "^"}, + {0x005f, "_"}, + {0x0060, "`"}, + {0x0061, "a"}, + {0x00e1, "aacute"}, + {0x0103, "abreve"}, + {0x00e2, "acircumflex"}, + {0x00b4, "acute"}, + {0x0301, "acutecomb"}, + {0x00e4, "adieresis"}, + {0x00e6, "ae"}, + {0x01fd, "aeacute"}, + {0x2015, "afii00208"}, + {0x0410, "afii10017"}, + {0x0411, "afii10018"}, + {0x0412, "afii10019"}, + {0x0413, "afii10020"}, + {0x0414, "afii10021"}, + {0x0415, "afii10022"}, + {0x0401, "afii10023"}, + {0x0416, "afii10024"}, + {0x0417, "afii10025"}, + {0x0418, "afii10026"}, + {0x0419, "afii10027"}, + {0x041a, "afii10028"}, + {0x041b, "afii10029"}, + {0x041c, "afii10030"}, + {0x041d, "afii10031"}, + {0x041e, "afii10032"}, + {0x041f, "afii10033"}, + {0x0420, "afii10034"}, + {0x0421, "afii10035"}, + {0x0422, "afii10036"}, + {0x0423, "afii10037"}, + {0x0424, "afii10038"}, + {0x0425, "afii10039"}, + {0x0426, "afii10040"}, + {0x0427, "afii10041"}, + {0x0428, "afii10042"}, + {0x0429, "afii10043"}, + {0x042a, "afii10044"}, + {0x042b, "afii10045"}, + {0x042c, "afii10046"}, + {0x042d, "afii10047"}, + {0x042e, "afii10048"}, + {0x042f, "afii10049"}, + {0x0490, "afii10050"}, + {0x0402, "afii10051"}, + {0x0403, "afii10052"}, + {0x0404, "afii10053"}, + {0x0405, "afii10054"}, + {0x0406, "afii10055"}, + {0x0407, "afii10056"}, + {0x0408, "afii10057"}, + {0x0409, "afii10058"}, + {0x040a, "afii10059"}, + {0x040b, "afii10060"}, + {0x040c, "afii10061"}, + {0x040e, "afii10062"}, + {0xf6c4, "afii10063"}, + {0xf6c5, "afii10064"}, + {0x0430, "afii10065"}, + {0x0431, "afii10066"}, + {0x0432, "afii10067"}, + {0x0433, "afii10068"}, + {0x0434, "afii10069"}, + {0x0435, "afii10070"}, + {0x0451, "afii10071"}, + {0x0436, "afii10072"}, + {0x0437, "afii10073"}, + {0x0438, "afii10074"}, + {0x0439, "afii10075"}, + {0x043a, "afii10076"}, + {0x043b, "afii10077"}, + {0x043c, "afii10078"}, + {0x043d, "afii10079"}, + {0x043e, "afii10080"}, + {0x043f, "afii10081"}, + {0x0440, "afii10082"}, + {0x0441, "afii10083"}, + {0x0442, "afii10084"}, + {0x0443, "afii10085"}, + {0x0444, "afii10086"}, + {0x0445, "afii10087"}, + {0x0446, "afii10088"}, + {0x0447, "afii10089"}, + {0x0448, "afii10090"}, + {0x0449, "afii10091"}, + {0x044a, "afii10092"}, + {0x044b, "afii10093"}, + {0x044c, "afii10094"}, + {0x044d, "afii10095"}, + {0x044e, "afii10096"}, + {0x044f, "afii10097"}, + {0x0491, "afii10098"}, + {0x0452, "afii10099"}, + {0x0453, "afii10100"}, + {0x0454, "afii10101"}, + {0x0455, "afii10102"}, + {0x0456, "afii10103"}, + {0x0457, "afii10104"}, + {0x0458, "afii10105"}, + {0x0459, "afii10106"}, + {0x045a, "afii10107"}, + {0x045b, "afii10108"}, + {0x045c, "afii10109"}, + {0x045e, "afii10110"}, + {0x040f, "afii10145"}, + {0x0462, "afii10146"}, + {0x0472, "afii10147"}, + {0x0474, "afii10148"}, + {0xf6c6, "afii10192"}, + {0x045f, "afii10193"}, + {0x0463, "afii10194"}, + {0x0473, "afii10195"}, + {0x0475, "afii10196"}, + {0xf6c7, "afii10831"}, + {0xf6c8, "afii10832"}, + {0x04d9, "afii10846"}, + {0x200e, "afii299"}, + {0x200f, "afii300"}, + {0x200d, "afii301"}, + {0x066a, "afii57381"}, + {0x060c, "afii57388"}, + {0x0660, "afii57392"}, + {0x0661, "afii57393"}, + {0x0662, "afii57394"}, + {0x0663, "afii57395"}, + {0x0664, "afii57396"}, + {0x0665, "afii57397"}, + {0x0666, "afii57398"}, + {0x0667, "afii57399"}, + {0x0668, "afii57400"}, + {0x0669, "afii57401"}, + {0x061b, "afii57403"}, + {0x061f, "afii57407"}, + {0x0621, "afii57409"}, + {0x0622, "afii57410"}, + {0x0623, "afii57411"}, + {0x0624, "afii57412"}, + {0x0625, "afii57413"}, + {0x0626, "afii57414"}, + {0x0627, "afii57415"}, + {0x0628, "afii57416"}, + {0x0629, "afii57417"}, + {0x062a, "afii57418"}, + {0x062b, "afii57419"}, + {0x062c, "afii57420"}, + {0x062d, "afii57421"}, + {0x062e, "afii57422"}, + {0x062f, "afii57423"}, + {0x0630, "afii57424"}, + {0x0631, "afii57425"}, + {0x0632, "afii57426"}, + {0x0633, "afii57427"}, + {0x0634, "afii57428"}, + {0x0635, "afii57429"}, + {0x0636, "afii57430"}, + {0x0637, "afii57431"}, + {0x0638, "afii57432"}, + {0x0639, "afii57433"}, + {0x063a, "afii57434"}, + {0x0640, "afii57440"}, + {0x0641, "afii57441"}, + {0x0642, "afii57442"}, + {0x0643, "afii57443"}, + {0x0644, "afii57444"}, + {0x0645, "afii57445"}, + {0x0646, "afii57446"}, + {0x0648, "afii57448"}, + {0x0649, "afii57449"}, + {0x064a, "afii57450"}, + {0x064b, "afii57451"}, + {0x064c, "afii57452"}, + {0x064d, "afii57453"}, + {0x064e, "afii57454"}, + {0x064f, "afii57455"}, + {0x0650, "afii57456"}, + {0x0651, "afii57457"}, + {0x0652, "afii57458"}, + {0x0647, "afii57470"}, + {0x06a4, "afii57505"}, + {0x067e, "afii57506"}, + {0x0686, "afii57507"}, + {0x0698, "afii57508"}, + {0x06af, "afii57509"}, + {0x0679, "afii57511"}, + {0x0688, "afii57512"}, + {0x0691, "afii57513"}, + {0x06ba, "afii57514"}, + {0x06d2, "afii57519"}, + {0x06d5, "afii57534"}, + {0x20aa, "afii57636"}, + {0x05be, "afii57645"}, + {0x05c3, "afii57658"}, + {0x05d0, "afii57664"}, + {0x05d1, "afii57665"}, + {0x05d2, "afii57666"}, + {0x05d3, "afii57667"}, + {0x05d4, "afii57668"}, + {0x05d5, "afii57669"}, + {0x05d6, "afii57670"}, + {0x05d7, "afii57671"}, + {0x05d8, "afii57672"}, + {0x05d9, "afii57673"}, + {0x05da, "afii57674"}, + {0x05db, "afii57675"}, + {0x05dc, "afii57676"}, + {0x05dd, "afii57677"}, + {0x05de, "afii57678"}, + {0x05df, "afii57679"}, + {0x05e0, "afii57680"}, + {0x05e1, "afii57681"}, + {0x05e2, "afii57682"}, + {0x05e3, "afii57683"}, + {0x05e4, "afii57684"}, + {0x05e5, "afii57685"}, + {0x05e6, "afii57686"}, + {0x05e7, "afii57687"}, + {0x05e8, "afii57688"}, + {0x05e9, "afii57689"}, + {0x05ea, "afii57690"}, + {0xfb2a, "afii57694"}, + {0xfb2b, "afii57695"}, + {0xfb4b, "afii57700"}, + {0xfb1f, "afii57705"}, + {0x05f0, "afii57716"}, + {0x05f1, "afii57717"}, + {0x05f2, "afii57718"}, + {0xfb35, "afii57723"}, + {0x05b4, "afii57793"}, + {0x05b5, "afii57794"}, + {0x05b6, "afii57795"}, + {0x05bb, "afii57796"}, + {0x05b8, "afii57797"}, + {0x05b7, "afii57798"}, + {0x05b0, "afii57799"}, + {0x05b2, "afii57800"}, + {0x05b1, "afii57801"}, + {0x05b3, "afii57802"}, + {0x05c2, "afii57803"}, + {0x05c1, "afii57804"}, + {0x05b9, "afii57806"}, + {0x05bc, "afii57807"}, + {0x05bd, "afii57839"}, + {0x05bf, "afii57841"}, + {0x05c0, "afii57842"}, + {0x02bc, "afii57929"}, + {0x2105, "afii61248"}, + {0x2113, "afii61289"}, + {0x2116, "afii61352"}, + {0x202c, "afii61573"}, + {0x202d, "afii61574"}, + {0x202e, "afii61575"}, + {0x200c, "afii61664"}, + {0x066d, "afii63167"}, + {0x02bd, "afii64937"}, + {0x00e0, "agrave"}, + {0x2135, "aleph"}, + {0x03b1, "alpha"}, + {0x03ac, "alphatonos"}, + {0x0101, "amacron"}, + {0x0026, "ampersand"}, + {0xf726, "ampersandsmall"}, + {0x2220, "angle"}, + {0x2329, "angleleft"}, + {0x232a, "angleright"}, + {0x0387, "anoteleia"}, + {0x0105, "aogonek"}, + {0x2248, "approxequal"}, + {0x00e5, "aring"}, + {0x01fb, "aringacute"}, + {0x2194, "arrowboth"}, + {0x21d4, "arrowdblboth"}, + {0x21d3, "arrowdbldown"}, + {0x21d0, "arrowdblleft"}, + {0x21d2, "arrowdblright"}, + {0x21d1, "arrowdblup"}, + {0x2193, "arrowdown"}, + {0xf8e7, "arrowhorizex"}, + {0x2190, "arrowleft"}, + {0x2192, "arrowright"}, + {0x2191, "arrowup"}, + {0x2195, "arrowupdn"}, + {0x21a8, "arrowupdnbse"}, + {0xf8e6, "arrowvertex"}, + {0x005e, "asciicircum"}, + {0x007e, "asciitilde"}, + {0x002a, "asterisk"}, + {0x2217, "asteriskmath"}, + {0xf6e9, "asuperior"}, + {0x0040, "at"}, + {0x00e3, "atilde"}, + {0x0062, "b"}, + {0x005c, "backslash"}, + {0x007c, "bar"}, + {0x03b2, "beta"}, + {0x2588, "block"}, + {0xf8f4, "braceex"}, + {0x007b, "braceleft"}, + {0xf8f3, "braceleftbt"}, + {0xf8f2, "braceleftmid"}, + {0xf8f1, "bracelefttp"}, + {0x007d, "braceright"}, + {0xf8fe, "bracerightbt"}, + {0xf8fd, "bracerightmid"}, + {0xf8fc, "bracerighttp"}, + {0x005b, "bracketleft"}, + {0xf8f0, "bracketleftbt"}, + {0xf8ef, "bracketleftex"}, + {0xf8ee, "bracketlefttp"}, + {0x005d, "bracketright"}, + {0xf8fb, "bracketrightbt"}, + {0xf8fa, "bracketrightex"}, + {0xf8f9, "bracketrighttp"}, + {0x02d8, "breve"}, + {0x00a6, "brokenbar"}, + {0xf6ea, "bsuperior"}, + {0x2022, "bullet"}, + {0x0063, "c"}, + {0x0107, "cacute"}, + {0x02c7, "caron"}, + {0x21b5, "carriagereturn"}, + {0x010d, "ccaron"}, + {0x00e7, "ccedilla"}, + {0x0109, "ccircumflex"}, + {0x010b, "cdotaccent"}, + {0x00b8, "cedilla"}, + {0x00a2, "cent"}, + {0xf6df, "centinferior"}, + {0xf7a2, "centoldstyle"}, + {0xf6e0, "centsuperior"}, + {0x03c7, "chi"}, + {0x25cb, "circle"}, + {0x2297, "circlemultiply"}, + {0x2295, "circleplus"}, + {0x02c6, "circumflex"}, + {0x2663, "club"}, + {0x003a, "colon"}, + {0x20a1, "colonmonetary"}, + {0x002c, "comma"}, + {0xf6c3, "commaaccent"}, + {0xf6e1, "commainferior"}, + {0xf6e2, "commasuperior"}, + {0x2245, "congruent"}, + {0x00a9, "copyright"}, + {0x00a9, "copyrightsans"}, + {0x00a9, "copyrightserif"}, + {0x00a4, "currency"}, + {0xf6d1, "cyrBreve"}, + {0xf6d2, "cyrFlex"}, + {0xf6d4, "cyrbreve"}, + {0xf6d5, "cyrflex"}, + {0x0064, "d"}, + {0x2020, "dagger"}, + {0x2021, "daggerdbl"}, + {0xf6d3, "dblGrave"}, + {0xf6d6, "dblgrave"}, + {0x010f, "dcaron"}, + {0x0111, "dcroat"}, + {0x00b0, "degree"}, + {0x03b4, "delta"}, + {0x2666, "diamond"}, + {0x00a8, "dieresis"}, + {0xf6d7, "dieresisacute"}, + {0xf6d8, "dieresisgrave"}, + {0x0385, "dieresistonos"}, + {0x00f7, "divide"}, + {0x2593, "dkshade"}, + {0x2584, "dnblock"}, + {0x0024, "dollar"}, + {0xf6e3, "dollarinferior"}, + {0xf724, "dollaroldstyle"}, + {0xf6e4, "dollarsuperior"}, + {0x20ab, "dong"}, + {0x02d9, "dotaccent"}, + {0x0323, "dotbelowcomb"}, + {0x0131, "dotlessi"}, + {0xf6be, "dotlessj"}, + {0x22c5, "dotmath"}, + {0xf6eb, "dsuperior"}, + {0x0065, "e"}, + {0x00e9, "eacute"}, + {0x0115, "ebreve"}, + {0x011b, "ecaron"}, + {0x00ea, "ecircumflex"}, + {0x00eb, "edieresis"}, + {0x0117, "edotaccent"}, + {0x00e8, "egrave"}, + {0x0038, "eight"}, + {0x2088, "eightinferior"}, + {0xf738, "eightoldstyle"}, + {0x2078, "eightsuperior"}, + {0x2208, "element"}, + {0x2026, "ellipsis"}, + {0x0113, "emacron"}, + {0x2014, "emdash"}, + {0x2205, "emptyset"}, + {0x2013, "endash"}, + {0x014b, "eng"}, + {0x0119, "eogonek"}, + {0x03b5, "epsilon"}, + {0x03ad, "epsilontonos"}, + {0x003d, "equal"}, + {0x2261, "equivalence"}, + {0x212e, "estimated"}, + {0xf6ec, "esuperior"}, + {0x03b7, "eta"}, + {0x03ae, "etatonos"}, + {0x00f0, "eth"}, + {0x0021, "exclam"}, + {0x203c, "exclamdbl"}, + {0x00a1, "exclamdown"}, + {0xf7a1, "exclamdownsmall"}, + {0x0021, "exclamleft"}, + {0xf721, "exclamsmall"}, + {0x2203, "existential"}, + {0x0066, "f"}, + {0x2640, "female"}, + {0xfb00, "ff"}, + {0xfb03, "ffi"}, + {0xfb04, "ffl"}, + {0xfb01, "fi"}, + {0x2012, "figuredash"}, + {0x25a0, "filledbox"}, + {0x25ac, "filledrect"}, + {0x0035, "five"}, + {0x215d, "fiveeighths"}, + {0x2085, "fiveinferior"}, + {0xf735, "fiveoldstyle"}, + {0x2075, "fivesuperior"}, + {0xfb02, "fl"}, + {0x0192, "florin"}, + {0x0034, "four"}, + {0x2084, "fourinferior"}, + {0xf734, "fouroldstyle"}, + {0x2074, "foursuperior"}, + {0x2044, "fraction"}, + {0x20a3, "franc"}, + {0x0067, "g"}, + {0x03b3, "gamma"}, + {0x011f, "gbreve"}, + {0x01e7, "gcaron"}, + {0x011d, "gcircumflex"}, + {0x0123, "gcommaaccent"}, + {0x0121, "gdotaccent"}, + {0x00df, "germandbls"}, + {0x2207, "gradient"}, + {0x0060, "grave"}, + {0x0300, "gravecomb"}, + {0x003e, "greater"}, + {0x2265, "greaterequal"}, + {0x00ab, "guillemotleft"}, + {0x00bb, "guillemotright"}, + {0x2039, "guilsinglleft"}, + {0x203a, "guilsinglright"}, + {0x0068, "h"}, + {0x0127, "hbar"}, + {0x0125, "hcircumflex"}, + {0x2665, "heart"}, + {0x0309, "hookabovecomb"}, + {0x2302, "house"}, + {0x02dd, "hungarumlaut"}, + {0x002d, "hyphen"}, + {0xf6e5, "hypheninferior"}, + {0xf6e6, "hyphensuperior"}, + {0x0069, "i"}, + {0x00ed, "iacute"}, + {0x012d, "ibreve"}, + {0x00ee, "icircumflex"}, + {0x00ef, "idieresis"}, + {0x00ec, "igrave"}, + {0x0133, "ij"}, + {0x012b, "imacron"}, + {0x221e, "infinity"}, + {0x222b, "integral"}, + {0x2321, "integralbt"}, + {0xf8f5, "integralex"}, + {0x2320, "integraltp"}, + {0x2229, "intersection"}, + {0x25d8, "invbullet"}, + {0x25d9, "invcircle"}, + {0x263b, "invsmileface"}, + {0x012f, "iogonek"}, + {0x03b9, "iota"}, + {0x03ca, "iotadieresis"}, + {0x0390, "iotadieresistonos"}, + {0x03af, "iotatonos"}, + {0xf6ed, "isuperior"}, + {0x0129, "itilde"}, + {0x006a, "j"}, + {0x0135, "jcircumflex"}, + {0x006b, "k"}, + {0x03ba, "kappa"}, + {0x0137, "kcommaaccent"}, + {0x0138, "kgreenlandic"}, + {0x006c, "l"}, + {0x013a, "lacute"}, + {0x03bb, "lambda"}, + {0x013e, "lcaron"}, + {0x013c, "lcommaaccent"}, + {0x0140, "ldot"}, + {0x003c, "less"}, + {0x2264, "lessequal"}, + {0x258c, "lfblock"}, + {0x20a4, "lira"}, + {0xf6c0, "ll"}, + {0x2227, "logicaland"}, + {0x00ac, "logicalnot"}, + {0x2228, "logicalor"}, + {0x017f, "longs"}, + {0x25ca, "lozenge"}, + {0x0142, "lslash"}, + {0xf6ee, "lsuperior"}, + {0x2591, "ltshade"}, + {0x006d, "m"}, + {0x00af, "macron"}, + {0x2642, "male"}, + {0x2212, "minus"}, + {0x2032, "minute"}, + {0xf6ef, "msuperior"}, + {0x00b5, "mu"}, + {0x00d7, "multiply"}, + {0x266a, "musicalnote"}, + {0x266b, "musicalnotedbl"}, + {0x006e, "n"}, + {0x0144, "nacute"}, + {0x0149, "napostrophe"}, + {0x00a0, "nbspace"}, + {0x0148, "ncaron"}, + {0x0146, "ncommaaccent"}, + {0x0039, "nine"}, + {0x2089, "nineinferior"}, + {0xf739, "nineoldstyle"}, + {0x2079, "ninesuperior"}, + {0x00a0, "nonbreakingspace"}, + {0x2209, "notelement"}, + {0x2260, "notequal"}, + {0x2284, "notsubset"}, + {0x207f, "nsuperior"}, + {0x00f1, "ntilde"}, + {0x03bd, "nu"}, + {0x0023, "numbersign"}, + {0x006f, "o"}, + {0x00f3, "oacute"}, + {0x014f, "obreve"}, + {0x00f4, "ocircumflex"}, + {0x00f6, "odieresis"}, + {0x0153, "oe"}, + {0x02db, "ogonek"}, + {0x00f2, "ograve"}, + {0x01a1, "ohorn"}, + {0x0151, "ohungarumlaut"}, + {0x014d, "omacron"}, + {0x03c9, "omega"}, + {0x03d6, "omega1"}, + {0x03ce, "omegatonos"}, + {0x03bf, "omicron"}, + {0x03cc, "omicrontonos"}, + {0x0031, "one"}, + {0x2024, "onedotenleader"}, + {0x215b, "oneeighth"}, + {0xf6dc, "onefitted"}, + {0x00bd, "onehalf"}, + {0x2081, "oneinferior"}, + {0xf731, "oneoldstyle"}, + {0x00bc, "onequarter"}, + {0x00b9, "onesuperior"}, + {0x2153, "onethird"}, + {0x25e6, "openbullet"}, + {0x00aa, "ordfeminine"}, + {0x00ba, "ordmasculine"}, + {0x221f, "orthogonal"}, + {0x00f8, "oslash"}, + {0x01ff, "oslashacute"}, + {0xf6f0, "osuperior"}, + {0x00f5, "otilde"}, + {0x0070, "p"}, + {0x00b6, "paragraph"}, + {0x0028, "parenleft"}, + {0xf8ed, "parenleftbt"}, + {0xf8ec, "parenleftex"}, + {0x208d, "parenleftinferior"}, + {0x207d, "parenleftsuperior"}, + {0xf8eb, "parenlefttp"}, + {0x0029, "parenright"}, + {0xf8f8, "parenrightbt"}, + {0xf8f7, "parenrightex"}, + {0x208e, "parenrightinferior"}, + {0x207e, "parenrightsuperior"}, + {0xf8f6, "parenrighttp"}, + {0x2202, "partialdiff"}, + {0x0025, "percent"}, + {0x002e, "period"}, + {0x00b7, "periodcentered"}, + {0xf6e7, "periodinferior"}, + {0xf6e8, "periodsuperior"}, + {0x22a5, "perpendicular"}, + {0x2030, "perthousand"}, + {0x20a7, "peseta"}, + {0x03c6, "phi"}, + {0x03d5, "phi1"}, + {0x03c0, "pi"}, + {0x002b, "plus"}, + {0x00b1, "plusminus"}, + {0x211e, "prescription"}, + {0x220f, "product"}, + {0x2282, "propersubset"}, + {0x2283, "propersuperset"}, + {0x221d, "proportional"}, + {0x03c8, "psi"}, + {0x0071, "q"}, + {0x003f, "question"}, + {0x00bf, "questiondown"}, + {0xf7bf, "questiondownsmall"}, + {0xf73f, "questionsmall"}, + {0x0022, "quotedbl"}, + {0x201e, "quotedblbase"}, + {0x201c, "quotedblleft"}, + {0x201d, "quotedblright"}, + {0x2018, "quoteleft"}, + {0x201b, "quotereversed"}, + {0x2019, "quoteright"}, + {0x201a, "quotesinglbase"}, + {0x0027, "quotesingle"}, + {0x0072, "r"}, + {0x0155, "racute"}, + {0x221a, "radical"}, + {0xf8e5, "radicalex"}, + {0x0159, "rcaron"}, + {0x0157, "rcommaaccent"}, + {0x2286, "reflexsubset"}, + {0x2287, "reflexsuperset"}, + {0x00ae, "registered"}, + {0x00ae, "registersans"}, + {0x00ae, "registerserif"}, + {0x2310, "revlogicalnot"}, + {0x03c1, "rho"}, + {0x02da, "ring"}, + {0xf6f1, "rsuperior"}, + {0x2590, "rtblock"}, + {0xf6dd, "rupiah"}, + {0x0073, "s"}, + {0x015b, "sacute"}, + {0x0161, "scaron"}, + {0x015f, "scedilla"}, + {0x015d, "scircumflex"}, + {0x0219, "scommaaccent"}, + {0x2033, "second"}, + {0x00a7, "section"}, + {0x003b, "semicolon"}, + {0x0037, "seven"}, + {0x215e, "seveneighths"}, + {0x2087, "seveninferior"}, + {0xf737, "sevenoldstyle"}, + {0x2077, "sevensuperior"}, + {0x2592, "shade"}, + {0x03c3, "sigma"}, + {0x03c2, "sigma1"}, + {0x223c, "similar"}, + {0x0036, "six"}, + {0x2086, "sixinferior"}, + {0xf736, "sixoldstyle"}, + {0x2076, "sixsuperior"}, + {0x002f, "slash"}, + {0x263a, "smileface"}, + {0x0020, "space"}, + {0x2660, "spade"}, + {0xf6f2, "ssuperior"}, + {0x00a3, "sterling"}, + {0x220b, "suchthat"}, + {0x2211, "summation"}, + {0x263c, "sun"}, + {0x0074, "t"}, + {0x03c4, "tau"}, + {0x0167, "tbar"}, + {0x0165, "tcaron"}, + {0x0163, "tcommaaccent"}, + {0x2234, "therefore"}, + {0x03b8, "theta"}, + {0x03d1, "theta1"}, + {0x00fe, "thorn"}, + {0x0033, "three"}, + {0x215c, "threeeighths"}, + {0x2083, "threeinferior"}, + {0xf733, "threeoldstyle"}, + {0x00be, "threequarters"}, + {0xf6de, "threequartersemdash"}, + {0x00b3, "threesuperior"}, + {0x02dc, "tilde"}, + {0x0303, "tildecomb"}, + {0x0384, "tonos"}, + {0x2122, "trademark"}, + {0x2122, "trademarksans"}, + {0x2122, "trademarkserif"}, + {0x25bc, "triagdn"}, + {0x25c4, "triaglf"}, + {0x25ba, "triagrt"}, + {0x25b2, "triagup"}, + {0xf6f3, "tsuperior"}, + {0x0032, "two"}, + {0x2025, "twodotenleader"}, + {0x2082, "twoinferior"}, + {0xf732, "twooldstyle"}, + {0x00b2, "twosuperior"}, + {0x2154, "twothirds"}, + {0x0075, "u"}, + {0x00fa, "uacute"}, + {0x016d, "ubreve"}, + {0x00fb, "ucircumflex"}, + {0x00fc, "udieresis"}, + {0x00f9, "ugrave"}, + {0x01b0, "uhorn"}, + {0x0171, "uhungarumlaut"}, + {0x016b, "umacron"}, + {0x005f, "underscore"}, + {0x2017, "underscoredbl"}, + {0x222a, "union"}, + {0x2200, "universal"}, + {0x0173, "uogonek"}, + {0x2580, "upblock"}, + {0x03c5, "upsilon"}, + {0x03cb, "upsilondieresis"}, + {0x03b0, "upsilondieresistonos"}, + {0x03cd, "upsilontonos"}, + {0x016f, "uring"}, + {0x0169, "utilde"}, + {0x0076, "v"}, + {0x0077, "w"}, + {0x1e83, "wacute"}, + {0x0175, "wcircumflex"}, + {0x1e85, "wdieresis"}, + {0x2118, "weierstrass"}, + {0x1e81, "wgrave"}, + {0x0078, "x"}, + {0x03be, "xi"}, + {0x0079, "y"}, + {0x00fd, "yacute"}, + {0x0177, "ycircumflex"}, + {0x00ff, "ydieresis"}, + {0x00a5, "yen"}, + {0x1ef3, "ygrave"}, + {0x007a, "z"}, + {0x017a, "zacute"}, + {0x017e, "zcaron"}, + {0x017c, "zdotaccent"}, + {0x0030, "zero"}, + {0x2080, "zeroinferior"}, + {0xf730, "zerooldstyle"}, + {0x2070, "zerosuperior"}, + {0x03b6, "zeta"}, + {0x007b, "{"}, + {0x007c, "|"}, + {0x007d, "}"}, + {0x007e, "~"}, + { 0, NULL } +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc new file mode 100644 index 000000000..71c632a1a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc @@ -0,0 +1,231 @@ +//======================================================================== +// +// Object.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Error.h" +#include "Stream.h" +#include "XRef.h" + +//------------------------------------------------------------------------ +// Object +//------------------------------------------------------------------------ + +char *objTypeNames[numObjTypes] = { + "boolean", + "integer", + "real", + "string", + "name", + "null", + "array", + "dictionary", + "stream", + "ref", + "cmd", + "error", + "eof", + "none" +}; + +#ifdef DEBUG_MEM +int Object::numAlloc[numObjTypes] = + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif + +Object *Object::initArray(XRef *xref) { + initObj(objArray); + array = new Array(xref); + return this; +} + +Object *Object::initDict(XRef *xref) { + initObj(objDict); + dict = new Dict(xref); + return this; +} + +Object *Object::initDict(Dict *dictA) { + initObj(objDict); + dict = dictA; + dict->incRef(); + return this; +} + +Object *Object::initStream(Stream *streamA) { + initObj(objStream); + stream = streamA; + return this; +} + +Object *Object::copy(Object *obj) { + *obj = *this; + switch (type) { + case objString: + obj->string = string->copy(); + break; + case objName: + obj->name = copyString(name); + break; + case objArray: + array->incRef(); + break; + case objDict: + dict->incRef(); + break; + case objStream: + stream->incRef(); + break; + case objCmd: + obj->cmd = copyString(cmd); + break; + default: + break; + } +#ifdef DEBUG_MEM + ++numAlloc[type]; +#endif + return obj; +} + +Object *Object::fetch(XRef *xref, Object *obj) { + return (type == objRef && xref) ? + xref->fetch(ref.num, ref.gen, obj) : copy(obj); +} + +void Object::free() { + switch (type) { + case objString: + delete string; + break; + case objName: + gfree(name); + break; + case objArray: + if (!array->decRef()) { + delete array; + } + break; + case objDict: + if (!dict->decRef()) { + delete dict; + } + break; + case objStream: + if (!stream->decRef()) { + delete stream; + } + break; + case objCmd: + gfree(cmd); + break; + default: + break; + } +#ifdef DEBUG_MEM + --numAlloc[type]; +#endif + type = objNone; +} + +char *Object::getTypeName() { + return objTypeNames[type]; +} + +void Object::print(FILE *f) { + Object obj; + int i; + + switch (type) { + case objBool: + fprintf(f, "%s", booln ? "true" : "false"); + break; + case objInt: + fprintf(f, "%d", intg); + break; + case objReal: + fprintf(f, "%g", real); + break; + case objString: + fprintf(f, "("); + fwrite(string->getCString(), 1, string->getLength(), f); + fprintf(f, ")"); + break; + case objName: + fprintf(f, "/%s", name); + break; + case objNull: + fprintf(f, "null"); + break; + case objArray: + fprintf(f, "["); + for (i = 0; i < arrayGetLength(); ++i) { + if (i > 0) + fprintf(f, " "); + arrayGetNF(i, &obj); + obj.print(f); + obj.free(); + } + fprintf(f, "]"); + break; + case objDict: + fprintf(f, "<<"); + for (i = 0; i < dictGetLength(); ++i) { + fprintf(f, " /%s ", dictGetKey(i)); + dictGetValNF(i, &obj); + obj.print(f); + obj.free(); + } + fprintf(f, " >>"); + break; + case objStream: + fprintf(f, ""); + break; + case objRef: + fprintf(f, "%d %d R", ref.num, ref.gen); + break; + case objCmd: + fprintf(f, "%s", cmd); + break; + case objError: + fprintf(f, ""); + break; + case objEOF: + fprintf(f, ""); + break; + case objNone: + fprintf(f, ""); + break; + } +} + +void Object::memCheck(FILE *f) { +#ifdef DEBUG_MEM + int i; + int t; + + t = 0; + for (i = 0; i < numObjTypes; ++i) + t += numAlloc[i]; + if (t > 0) { + fprintf(f, "Allocated objects:\n"); + for (i = 0; i < numObjTypes; ++i) { + if (numAlloc[i] > 0) + fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]); + } + } +#endif +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h new file mode 100644 index 000000000..8b1807c5b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h @@ -0,0 +1,303 @@ +//======================================================================== +// +// Object.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef OBJECT_H +#define OBJECT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include +#include "gtypes.h" +#include "gmem.h" +#include "GString.h" + +class XRef; +class Array; +class Dict; +class Stream; + +//------------------------------------------------------------------------ +// Ref +//------------------------------------------------------------------------ + +struct Ref { + int num; // object number + int gen; // generation number +}; + +//------------------------------------------------------------------------ +// object types +//------------------------------------------------------------------------ + +enum ObjType { + // simple objects + objBool, // boolean + objInt, // integer + objReal, // real + objString, // string + objName, // name + objNull, // null + + // complex objects + objArray, // array + objDict, // dictionary + objStream, // stream + objRef, // indirect reference + + // special objects + objCmd, // command name + objError, // error return from Lexer + objEOF, // end of file return from Lexer + objNone // uninitialized object +}; + +#define numObjTypes 14 // total number of object types + +//------------------------------------------------------------------------ +// Object +//------------------------------------------------------------------------ + +#ifdef DEBUG_MEM +#define initObj(t) ++numAlloc[type = t] +#else +#define initObj(t) type = t +#endif + +class Object { +public: + + // Default constructor. + Object(): + type(objNone) {} + + // Initialize an object. + Object *initBool(GBool boolnA) + { initObj(objBool); booln = boolnA; return this; } + Object *initInt(int intgA) + { initObj(objInt); intg = intgA; return this; } + Object *initReal(double realA) + { initObj(objReal); real = realA; return this; } + Object *initString(GString *stringA) + { initObj(objString); string = stringA; return this; } + Object *initName(char *nameA) + { initObj(objName); name = copyString(nameA); return this; } + Object *initNull() + { initObj(objNull); return this; } + Object *initArray(XRef *xref); + Object *initDict(XRef *xref); + Object *initDict(Dict *dictA); + Object *initStream(Stream *streamA); + Object *initRef(int numA, int genA) + { initObj(objRef); ref.num = numA; ref.gen = genA; return this; } + Object *initCmd(char *cmdA) + { initObj(objCmd); cmd = copyString(cmdA); return this; } + Object *initError() + { initObj(objError); return this; } + Object *initEOF() + { initObj(objEOF); return this; } + + // Copy an object. + Object *copy(Object *obj); + + // If object is a Ref, fetch and return the referenced object. + // Otherwise, return a copy of the object. + Object *fetch(XRef *xref, Object *obj); + + // Free object contents. + void free(); + + // Type checking. + ObjType getType() { return type; } + GBool isBool() { return type == objBool; } + GBool isInt() { return type == objInt; } + GBool isReal() { return type == objReal; } + GBool isNum() { return type == objInt || type == objReal; } + GBool isString() { return type == objString; } + GBool isName() { return type == objName; } + GBool isNull() { return type == objNull; } + GBool isArray() { return type == objArray; } + GBool isDict() { return type == objDict; } + GBool isStream() { return type == objStream; } + GBool isRef() { return type == objRef; } + GBool isCmd() { return type == objCmd; } + GBool isError() { return type == objError; } + GBool isEOF() { return type == objEOF; } + GBool isNone() { return type == objNone; } + + // Special type checking. + GBool isName(char *nameA) + { return type == objName && !strcmp(name, nameA); } + GBool isDict(char *dictType); + GBool isStream(char *dictType); + GBool isCmd(char *cmdA) + { return type == objCmd && !strcmp(cmd, cmdA); } + + // Accessors. NB: these assume object is of correct type. + GBool getBool() { return booln; } + int getInt() { return intg; } + double getReal() { return real; } + double getNum() { return type == objInt ? (double)intg : real; } + GString *getString() { return string; } + char *getName() { return name; } + Array *getArray() { return array; } + Dict *getDict() { return dict; } + Stream *getStream() { return stream; } + Ref getRef() { return ref; } + int getRefNum() { return ref.num; } + int getRefGen() { return ref.gen; } + char *getCmd() { return cmd; } + + // Array accessors. + int arrayGetLength(); + void arrayAdd(Object *elem); + Object *arrayGet(int i, Object *obj); + Object *arrayGetNF(int i, Object *obj); + + // Dict accessors. + int dictGetLength(); + void dictAdd(char *key, Object *val); + GBool dictIs(char *dictType); + Object *dictLookup(char *key, Object *obj); + Object *dictLookupNF(char *key, Object *obj); + char *dictGetKey(int i); + Object *dictGetVal(int i, Object *obj); + Object *dictGetValNF(int i, Object *obj); + + // Stream accessors. + GBool streamIs(char *dictType); + void streamReset(); + void streamClose(); + int streamGetChar(); + int streamLookChar(); + char *streamGetLine(char *buf, int size); + Guint streamGetPos(); + void streamSetPos(Guint pos, int dir = 0); + Dict *streamGetDict(); + + // Output. + char *getTypeName(); + void print(FILE *f = stdout); + + // Memory testing. + static void memCheck(FILE *f); + +private: + + ObjType type; // object type + union { // value for each type: + GBool booln; // boolean + int intg; // integer + double real; // real + GString *string; // string + char *name; // name + Array *array; // array + Dict *dict; // dictionary + Stream *stream; // stream + Ref ref; // indirect reference + char *cmd; // command + }; + +#ifdef DEBUG_MEM + static int // number of each type of object + numAlloc[numObjTypes]; // currently allocated +#endif +}; + +//------------------------------------------------------------------------ +// Array accessors. +//------------------------------------------------------------------------ + +#include "Array.h" + +inline int Object::arrayGetLength() + { return array->getLength(); } + +inline void Object::arrayAdd(Object *elem) + { array->add(elem); } + +inline Object *Object::arrayGet(int i, Object *obj) + { return array->get(i, obj); } + +inline Object *Object::arrayGetNF(int i, Object *obj) + { return array->getNF(i, obj); } + +//------------------------------------------------------------------------ +// Dict accessors. +//------------------------------------------------------------------------ + +#include "Dict.h" + +inline int Object::dictGetLength() + { return dict->getLength(); } + +inline void Object::dictAdd(char *key, Object *val) + { dict->add(key, val); } + +inline GBool Object::dictIs(char *dictType) + { return dict->is(dictType); } + +inline GBool Object::isDict(char *dictType) + { return type == objDict && dictIs(dictType); } + +inline Object *Object::dictLookup(char *key, Object *obj) + { return dict->lookup(key, obj); } + +inline Object *Object::dictLookupNF(char *key, Object *obj) + { return dict->lookupNF(key, obj); } + +inline char *Object::dictGetKey(int i) + { return dict->getKey(i); } + +inline Object *Object::dictGetVal(int i, Object *obj) + { return dict->getVal(i, obj); } + +inline Object *Object::dictGetValNF(int i, Object *obj) + { return dict->getValNF(i, obj); } + +//------------------------------------------------------------------------ +// Stream accessors. +//------------------------------------------------------------------------ + +#include "Stream.h" + +inline GBool Object::streamIs(char *dictType) + { return stream->getDict()->is(dictType); } + +inline GBool Object::isStream(char *dictType) + { return type == objStream && streamIs(dictType); } + +inline void Object::streamReset() + { stream->reset(); } + +inline void Object::streamClose() + { stream->close(); } + +inline int Object::streamGetChar() + { return stream->getChar(); } + +inline int Object::streamLookChar() + { return stream->lookChar(); } + +inline char *Object::streamGetLine(char *buf, int size) + { return stream->getLine(buf, size); } + +inline Guint Object::streamGetPos() + { return stream->getPos(); } + +inline void Object::streamSetPos(Guint pos, int dir) + { stream->setPos(pos, dir); } + +inline Dict *Object::streamGetDict() + { return stream->getDict(); } + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc new file mode 100644 index 000000000..39e89a3c3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc @@ -0,0 +1,151 @@ +//======================================================================== +// +// Outline.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "gmem.h" +#include "GString.h" +#include "GList.h" +#include "Link.h" +#include "PDFDocEncoding.h" +#include "Outline.h" + +//------------------------------------------------------------------------ + +Outline::Outline(Object *outlineObj, XRef *xref) { + Object first, last; + + items = NULL; + if (!outlineObj->isDict()) { + return; + } + items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first), + outlineObj->dictLookupNF("Last", &last), + xref); + first.free(); + last.free(); +} + +Outline::~Outline() { + if (items) { + deleteGList(items, OutlineItem); + } +} + +//------------------------------------------------------------------------ + +OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) { + Object obj1; + GString *s; + int i; + + xref = xrefA; + title = NULL; + action = NULL; + kids = NULL; + + if (dict->lookup("Title", &obj1)->isString()) { + s = obj1.getString(); + if ((s->getChar(0) & 0xff) == 0xfe && + (s->getChar(1) & 0xff) == 0xff) { + titleLen = (s->getLength() - 2) / 2; + title = (Unicode *)gmallocn(titleLen, sizeof(Unicode)); + for (i = 0; i < titleLen; ++i) { + title[i] = ((s->getChar(2 + 2*i) & 0xff) << 8) | + (s->getChar(3 + 2*i) & 0xff); + } + } else { + titleLen = s->getLength(); + title = (Unicode *)gmallocn(titleLen, sizeof(Unicode)); + for (i = 0; i < titleLen; ++i) { + title[i] = pdfDocEncoding[s->getChar(i) & 0xff]; + } + } + } else { + titleLen = 0; + } + obj1.free(); + + if (!dict->lookup("Dest", &obj1)->isNull()) { + action = LinkAction::parseDest(&obj1); + } else { + obj1.free(); + if (!dict->lookup("A", &obj1)->isNull()) { + action = LinkAction::parseAction(&obj1); + } + } + obj1.free(); + + dict->lookupNF("First", &firstRef); + dict->lookupNF("Last", &lastRef); + dict->lookupNF("Next", &nextRef); + + startsOpen = gFalse; + if (dict->lookup("Count", &obj1)->isInt()) { + if (obj1.getInt() > 0) { + startsOpen = gTrue; + } + } + obj1.free(); +} + +OutlineItem::~OutlineItem() { + close(); + if (title) { + gfree(title); + } + if (action) { + delete action; + } + firstRef.free(); + lastRef.free(); + nextRef.free(); +} + +GList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef, + XRef *xrefA) { + GList *items; + OutlineItem *item; + Object obj; + Object *p; + + items = new GList(); + p = firstItemRef; + while (p->isRef()) { + if (!p->fetch(xrefA, &obj)->isDict()) { + obj.free(); + break; + } + item = new OutlineItem(obj.getDict(), xrefA); + obj.free(); + items->append(item); + if (p->getRef().num == lastItemRef->getRef().num && + p->getRef().gen == lastItemRef->getRef().gen) { + break; + } + p = &item->nextRef; + } + return items; +} + +void OutlineItem::open() { + if (!kids) { + kids = readItemList(&firstRef, &lastRef, xref); + } +} + +void OutlineItem::close() { + if (kids) { + deleteGList(kids, OutlineItem); + kids = NULL; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h new file mode 100644 index 000000000..f38f8d161 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h @@ -0,0 +1,76 @@ +//======================================================================== +// +// Outline.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef OUTLINE_H +#define OUTLINE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" +#include "CharTypes.h" + +class GString; +class GList; +class XRef; +class LinkAction; + +//------------------------------------------------------------------------ + +class Outline { +public: + + Outline(Object *outlineObj, XRef *xref); + ~Outline(); + + GList *getItems() { return items; } + +private: + + GList *items; // NULL if document has no outline + // [OutlineItem] +}; + +//------------------------------------------------------------------------ + +class OutlineItem { +public: + + OutlineItem(Dict *dict, XRef *xrefA); + ~OutlineItem(); + + static GList *readItemList(Object *firstItemRef, Object *lastItemRef, + XRef *xrefA); + + void open(); + void close(); + + Unicode *getTitle() { return title; } + int getTitleLength() { return titleLen; } + LinkAction *getAction() { return action; } + GBool isOpen() { return startsOpen; } + GBool hasKids() { return firstRef.isRef(); } + GList *getKids() { return kids; } + +private: + + XRef *xref; + Unicode *title; + int titleLen; + LinkAction *action; + Object firstRef; + Object lastRef; + Object nextRef; + GBool startsOpen; + GList *kids; // NULL unless this item is open [OutlineItem] +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc new file mode 100644 index 000000000..8d4763b7d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc @@ -0,0 +1,131 @@ +//======================================================================== +// +// OutputDev.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Stream.h" +#include "GfxState.h" +#include "OutputDev.h" + +//------------------------------------------------------------------------ +// OutputDev +//------------------------------------------------------------------------ + +void OutputDev::setDefaultCTM(double *ctm) { + int i; + double det; + + for (i = 0; i < 6; ++i) { + defCTM[i] = ctm[i]; + } + det = 1 / (defCTM[0] * defCTM[3] - defCTM[1] * defCTM[2]); + defICTM[0] = defCTM[3] * det; + defICTM[1] = -defCTM[1] * det; + defICTM[2] = -defCTM[2] * det; + defICTM[3] = defCTM[0] * det; + defICTM[4] = (defCTM[2] * defCTM[5] - defCTM[3] * defCTM[4]) * det; + defICTM[5] = (defCTM[1] * defCTM[4] - defCTM[0] * defCTM[5]) * det; +} + +void OutputDev::cvtDevToUser(double dx, double dy, double *ux, double *uy) { + *ux = defICTM[0] * dx + defICTM[2] * dy + defICTM[4]; + *uy = defICTM[1] * dx + defICTM[3] * dy + defICTM[5]; +} + +void OutputDev::cvtUserToDev(double ux, double uy, int *dx, int *dy) { + *dx = (int)(defCTM[0] * ux + defCTM[2] * uy + defCTM[4] + 0.5); + *dy = (int)(defCTM[1] * ux + defCTM[3] * uy + defCTM[5] + 0.5); +} + +void OutputDev::updateAll(GfxState *state) { + updateLineDash(state); + updateFlatness(state); + updateLineJoin(state); + updateLineCap(state); + updateMiterLimit(state); + updateLineWidth(state); + updateStrokeAdjust(state); + updateFillColorSpace(state); + updateFillColor(state); + updateStrokeColorSpace(state); + updateStrokeColor(state); + updateBlendMode(state); + updateFillOpacity(state); + updateStrokeOpacity(state); + updateFillOverprint(state); + updateStrokeOverprint(state); + updateTransfer(state); + updateFont(state); +} + +GBool OutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) { + return gFalse; +} + +void OutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg) { + int i, j; + + if (inlineImg) { + str->reset(); + j = height * ((width + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + str->close(); + } +} + +void OutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg) { + int i, j; + + if (inlineImg) { + str->reset(); + j = height * ((width * colorMap->getNumPixelComps() * + colorMap->getBits() + 7) / 8); + for (i = 0; i < j; ++i) + str->getChar(); + str->close(); + } +} + +void OutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert) { + drawImage(state, ref, str, width, height, colorMap, NULL, gFalse); +} + +void OutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap) { + drawImage(state, ref, str, width, height, colorMap, NULL, gFalse); +} + +#if OPI_SUPPORT +void OutputDev::opiBegin(GfxState *state, Dict *opiDict) { +} + +void OutputDev::opiEnd(GfxState *state, Dict *opiDict) { +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h new file mode 100644 index 000000000..d9255a986 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h @@ -0,0 +1,251 @@ +//======================================================================== +// +// OutputDev.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef OUTPUTDEV_H +#define OUTPUTDEV_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "CharTypes.h" +#include "Object.h" + +class GString; +class GfxState; +struct GfxColor; +class GfxColorSpace; +class GfxImageColorMap; +class GfxFunctionShading; +class GfxAxialShading; +class GfxRadialShading; +class Stream; +class Links; +class Link; +class Catalog; +class Page; +class Function; + +//------------------------------------------------------------------------ +// OutputDev +//------------------------------------------------------------------------ + +class OutputDev { +public: + + // Constructor. + OutputDev() {} + + // Destructor. + virtual ~OutputDev() {} + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() = 0; + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() = 0; + + // Does this device use tilingPatternFill()? If this returns false, + // tiling pattern fills will be reduced to a series of other drawing + // operations. + virtual GBool useTilingPatternFill() { return gFalse; } + + // Does this device use functionShadedFill(), axialShadedFill(), and + // radialShadedFill()? If this returns false, these shaded fills + // will be reduced to a series of other drawing operations. + virtual GBool useShadedFills() { return gFalse; } + + // Does this device use drawForm()? If this returns false, + // form-type XObjects will be interpreted (i.e., unrolled). + virtual GBool useDrawForm() { return gFalse; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() = 0; + + // Does this device need non-text content? + virtual GBool needNonText() { return gTrue; } + + //----- initialization and control + + // Set default transform matrix. + virtual void setDefaultCTM(double *ctm); + + // Check to see if a page slice should be displayed. If this + // returns false, the page display is aborted. Typically, an + // OutputDev will use some alternate means to display the page + // before returning false. + virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL) + { return gTrue; } + + // Start a page. + virtual void startPage(int pageNum, GfxState *state) {} + + // End a page. + virtual void endPage() {} + + // Dump page contents to display. + virtual void dump() {} + + //----- coordinate conversion + + // Convert between device and user coordinates. + virtual void cvtDevToUser(double dx, double dy, double *ux, double *uy); + virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy); + + double *getDefCTM() { return defCTM; } + double *getDefICTM() { return defICTM; } + + //----- save/restore graphics state + virtual void saveState(GfxState *state) {} + virtual void restoreState(GfxState *state) {} + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32) {} + virtual void updateLineDash(GfxState *state) {} + virtual void updateFlatness(GfxState *state) {} + virtual void updateLineJoin(GfxState *state) {} + virtual void updateLineCap(GfxState *state) {} + virtual void updateMiterLimit(GfxState *state) {} + virtual void updateLineWidth(GfxState *state) {} + virtual void updateStrokeAdjust(GfxState *state) {} + virtual void updateFillColorSpace(GfxState *state) {} + virtual void updateStrokeColorSpace(GfxState *state) {} + virtual void updateFillColor(GfxState *state) {} + virtual void updateStrokeColor(GfxState *state) {} + virtual void updateBlendMode(GfxState *state) {} + virtual void updateFillOpacity(GfxState *state) {} + virtual void updateStrokeOpacity(GfxState *state) {} + virtual void updateFillOverprint(GfxState *state) {} + virtual void updateStrokeOverprint(GfxState *state) {} + virtual void updateTransfer(GfxState *state) {} + + //----- update text state + virtual void updateFont(GfxState *state) {} + virtual void updateTextMat(GfxState *state) {} + virtual void updateCharSpace(GfxState *state) {} + virtual void updateRender(GfxState *state) {} + virtual void updateRise(GfxState *state) {} + virtual void updateWordSpace(GfxState *state) {} + virtual void updateHorizScaling(GfxState *state) {} + virtual void updateTextPos(GfxState *state) {} + virtual void updateTextShift(GfxState *state, double shift) {} + + //----- path painting + virtual void stroke(GfxState *state) {} + virtual void fill(GfxState *state) {} + virtual void eoFill(GfxState *state) {} + virtual void tilingPatternFill(GfxState *state, Object *str, + int paintType, Dict *resDict, + double *mat, double *bbox, + int x0, int y0, int x1, int y1, + double xStep, double yStep) {} + virtual GBool functionShadedFill(GfxState *state, + GfxFunctionShading *shading) + { return gFalse; } + virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading) + { return gFalse; } + virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading) + { return gFalse; } + + //----- path clipping + virtual void clip(GfxState *state) {} + virtual void eoClip(GfxState *state) {} + virtual void clipToStrokePath(GfxState *state) {} + + //----- text drawing + virtual void beginStringOp(GfxState *state) {} + virtual void endStringOp(GfxState *state) {} + virtual void beginString(GfxState *state, GString *s) {} + virtual void endString(GfxState *state) {} + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen) {} + virtual void drawString(GfxState *state, GString *s) {} + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state) {} + virtual void endTextObject(GfxState *state) {} + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap); + +#if OPI_SUPPORT + //----- OPI functions + virtual void opiBegin(GfxState *state, Dict *opiDict); + virtual void opiEnd(GfxState *state, Dict *opiDict); +#endif + + //----- Type 3 font operators + virtual void type3D0(GfxState *state, double wx, double wy) {} + virtual void type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury) {} + + //----- form XObjects + virtual void drawForm(Ref id) {} + + //----- PostScript XObjects + virtual void psXObject(Stream *psStream, Stream *level1Stream) {} + + //----- transparency groups and soft masks + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask) {} + virtual void endTransparencyGroup(GfxState *state) {} + virtual void paintTransparencyGroup(GfxState *state, double *bbox) {} + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, + Function *transferFunc, GfxColor *backdropColor) {} + virtual void clearSoftMask(GfxState *state) {} + + //----- links + virtual void processLink(Link *link, Catalog *catalog) {} + +#if 1 //~tmp: turn off anti-aliasing temporarily + virtual GBool getVectorAntialias() { return gFalse; } + virtual void setVectorAntialias(GBool vaa) {} +#endif + +private: + + double defCTM[6]; // default coordinate transform matrix + double defICTM[6]; // inverse of default CTM +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc new file mode 100644 index 000000000..c559eefcf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc @@ -0,0 +1,402 @@ +//======================================================================== +// +// PDFDoc.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#ifdef WIN32 +# include +#endif +#include "GString.h" +#include "config.h" +#include "GlobalParams.h" +#include "Page.h" +#include "Catalog.h" +#include "Stream.h" +#include "XRef.h" +#include "Link.h" +#include "OutputDev.h" +#include "Error.h" +#include "ErrorCodes.h" +#include "Lexer.h" +#include "Parser.h" +#include "SecurityHandler.h" +#ifndef DISABLE_OUTLINE +#include "Outline.h" +#endif +#include "PDFDoc.h" + +//------------------------------------------------------------------------ + +#define headerSearchSize 1024 // read this many bytes at beginning of + // file to look for '%PDF' + +//------------------------------------------------------------------------ +// PDFDoc +//------------------------------------------------------------------------ + +PDFDoc::PDFDoc(GString *fileNameA, GString *ownerPassword, + GString *userPassword, void *guiDataA) { + Object obj; + GString *fileName1, *fileName2; + + ok = gFalse; + errCode = errNone; + + guiData = guiDataA; + + file = NULL; + str = NULL; + xref = NULL; + catalog = NULL; +#ifndef DISABLE_OUTLINE + outline = NULL; +#endif + + fileName = fileNameA; + fileName1 = fileName; + + + // try to open file + fileName2 = NULL; +#ifdef VMS + if (!(file = fopen(fileName1->getCString(), "rb", "ctx=stm"))) { + error(-1, "Couldn't open file '%s'", fileName1->getCString()); + errCode = errOpenFile; + return; + } +#else + if (!(file = fopen(fileName1->getCString(), "rb"))) { + fileName2 = fileName->copy(); + fileName2->lowerCase(); + if (!(file = fopen(fileName2->getCString(), "rb"))) { + fileName2->upperCase(); + if (!(file = fopen(fileName2->getCString(), "rb"))) { + error(-1, "Couldn't open file '%s'", fileName->getCString()); + delete fileName2; + errCode = errOpenFile; + return; + } + } + delete fileName2; + } +#endif + + // create stream + obj.initNull(); + str = new FileStream(file, 0, gFalse, 0, &obj); + + ok = setup(ownerPassword, userPassword); +} + +#ifdef WIN32 +PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GString *ownerPassword, + GString *userPassword, void *guiDataA) { + OSVERSIONINFO version; + wchar_t fileName2[_MAX_PATH + 1]; + Object obj; + int i; + + ok = gFalse; + errCode = errNone; + + guiData = guiDataA; + + file = NULL; + str = NULL; + xref = NULL; + catalog = NULL; +#ifndef DISABLE_OUTLINE + outline = NULL; +#endif + + //~ file name should be stored in Unicode (?) + fileName = new GString(); + for (i = 0; i < fileNameLen; ++i) { + fileName->append((char)fileNameA[i]); + } + + // zero-terminate the file name string + for (i = 0; i < fileNameLen && i < _MAX_PATH; ++i) { + fileName2[i] = fileNameA[i]; + } + fileName2[i] = 0; + + // try to open file + // NB: _wfopen is only available in NT + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + file = _wfopen(fileName2, L"rb"); + } else { + file = fopen(fileName->getCString(), "rb"); + } + if (!file) { + error(-1, "Couldn't open file '%s'", fileName->getCString()); + errCode = errOpenFile; + return; + } + + // create stream + obj.initNull(); + str = new FileStream(file, 0, gFalse, 0, &obj); + + ok = setup(ownerPassword, userPassword); +} +#endif + +PDFDoc::PDFDoc(BaseStream *strA, GString *ownerPassword, + GString *userPassword, void *guiDataA) { + ok = gFalse; + errCode = errNone; + guiData = guiDataA; + if (strA->getFileName()) { + fileName = strA->getFileName()->copy(); + } else { + fileName = NULL; + } + file = NULL; + str = strA; + xref = NULL; + catalog = NULL; +#ifndef DISABLE_OUTLINE + outline = NULL; +#endif + ok = setup(ownerPassword, userPassword); +} + +GBool PDFDoc::setup(GString *ownerPassword, GString *userPassword) { + str->reset(); + + // check header + checkHeader(); + + // read xref table + xref = new XRef(str); + if (!xref->isOk()) { + error(-1, "Couldn't read xref table"); + errCode = xref->getErrorCode(); + return gFalse; + } + + // check for encryption + if (!checkEncryption(ownerPassword, userPassword)) { + errCode = errEncrypted; + return gFalse; + } + + // read catalog + catalog = new Catalog(xref); + if (!catalog->isOk()) { + error(-1, "Couldn't read page catalog"); + errCode = errBadCatalog; + return gFalse; + } + +#ifndef DISABLE_OUTLINE + // read outline + outline = new Outline(catalog->getOutline(), xref); +#endif + + // done + return gTrue; +} + +PDFDoc::~PDFDoc() { +#ifndef DISABLE_OUTLINE + if (outline) { + delete outline; + } +#endif + if (catalog) { + delete catalog; + } + if (xref) { + delete xref; + } + if (str) { + delete str; + } + if (file) { + fclose(file); + } + if (fileName) { + delete fileName; + } +} + +// Check for a PDF header on this stream. Skip past some garbage +// if necessary. +void PDFDoc::checkHeader() { + char hdrBuf[headerSearchSize+1]; + char *p; + int i; + + pdfVersion = 0; + for (i = 0; i < headerSearchSize; ++i) { + hdrBuf[i] = str->getChar(); + } + hdrBuf[headerSearchSize] = '\0'; + for (i = 0; i < headerSearchSize - 5; ++i) { + if (!strncmp(&hdrBuf[i], "%PDF-", 5)) { + break; + } + } + if (i >= headerSearchSize - 5) { + error(-1, "May not be a PDF file (continuing anyway)"); + return; + } + str->moveStart(i); + if (!(p = strtok(&hdrBuf[i+5], " \t\n\r"))) { + error(-1, "May not be a PDF file (continuing anyway)"); + return; + } + pdfVersion = atof(p); + if (!(hdrBuf[i+5] >= '0' && hdrBuf[i+5] <= '9') || + pdfVersion > supportedPDFVersionNum + 0.0001) { + error(-1, "PDF version %s -- xpdf supports version %s" + " (continuing anyway)", p, supportedPDFVersionStr); + } +} + +GBool PDFDoc::checkEncryption(GString *ownerPassword, GString *userPassword) { + Object encrypt; + GBool encrypted; + SecurityHandler *secHdlr; + GBool ret; + + xref->getTrailerDict()->dictLookup("Encrypt", &encrypt); + if ((encrypted = encrypt.isDict())) { + if ((secHdlr = SecurityHandler::make(this, &encrypt))) { + if (secHdlr->checkEncryption(ownerPassword, userPassword)) { + // authorization succeeded + xref->setEncryption(secHdlr->getPermissionFlags(), + secHdlr->getOwnerPasswordOk(), + secHdlr->getFileKey(), + secHdlr->getFileKeyLength(), + secHdlr->getEncVersion(), + secHdlr->getEncAlgorithm()); + ret = gTrue; + } else { + // authorization failed + ret = gFalse; + } + delete secHdlr; + } else { + // couldn't find the matching security handler + ret = gFalse; + } + } else { + // document is not encrypted + ret = gTrue; + } + encrypt.free(); + return ret; +} + +void PDFDoc::displayPage(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) { + if (globalParams->getPrintCommands()) { + printf("***** page %d *****\n", page); + } + catalog->getPage(page)->display(out, hDPI, vDPI, + rotate, useMediaBox, crop, printing, catalog, + abortCheckCbk, abortCheckCbkData); +} + +void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) { + int page; + + for (page = firstPage; page <= lastPage; ++page) { + displayPage(out, page, hDPI, vDPI, rotate, useMediaBox, crop, printing, + abortCheckCbk, abortCheckCbkData); + } +} + +void PDFDoc::displayPageSlice(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) { + catalog->getPage(page)->displaySlice(out, hDPI, vDPI, + rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, catalog, + abortCheckCbk, abortCheckCbkData); +} + +Links *PDFDoc::getLinks(int page) { + return catalog->getPage(page)->getLinks(catalog); +} + +void PDFDoc::processLinks(OutputDev *out, int page) { + catalog->getPage(page)->processLinks(out, catalog); +} + +GBool PDFDoc::isLinearized() { + Parser *parser; + Object obj1, obj2, obj3, obj4, obj5; + GBool lin; + + lin = gFalse; + obj1.initNull(); + parser = new Parser(xref, + new Lexer(xref, + str->makeSubStream(str->getStart(), gFalse, 0, &obj1)), + gTrue); + parser->getObj(&obj1); + parser->getObj(&obj2); + parser->getObj(&obj3); + parser->getObj(&obj4); + if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && + obj4.isDict()) { + obj4.dictLookup("Linearized", &obj5); + if (obj5.isNum() && obj5.getNum() > 0) { + lin = gTrue; + } + obj5.free(); + } + obj4.free(); + obj3.free(); + obj2.free(); + obj1.free(); + delete parser; + return lin; +} + +GBool PDFDoc::saveAs(GString *name) { + FILE *f; + int c; + + if (!(f = fopen(name->getCString(), "wb"))) { + error(-1, "Couldn't open file '%s'", name->getCString()); + return gFalse; + } + str->reset(); + while ((c = str->getChar()) != EOF) { + fputc(c, f); + } + str->close(); + fclose(f); + return gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h new file mode 100644 index 000000000..208b61efa --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h @@ -0,0 +1,183 @@ +//======================================================================== +// +// PDFDoc.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef PDFDOC_H +#define PDFDOC_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" + +class GString; +class BaseStream; +class OutputDev; +class Links; +class LinkAction; +class LinkDest; +class Outline; + +//------------------------------------------------------------------------ +// PDFDoc +//------------------------------------------------------------------------ + +class PDFDoc { +public: + + PDFDoc(GString *fileNameA, GString *ownerPassword = NULL, + GString *userPassword = NULL, void *guiDataA = NULL); +#ifdef WIN32 + PDFDoc(wchar_t *fileNameA, int fileNameLen, GString *ownerPassword = NULL, + GString *userPassword = NULL, void *guiDataA = NULL); +#endif + PDFDoc(BaseStream *strA, GString *ownerPassword = NULL, + GString *userPassword = NULL, void *guiDataA = NULL); + ~PDFDoc(); + + // Was PDF document successfully opened? + GBool isOk() { return ok; } + + // Get the error code (if isOk() returns false). + int getErrorCode() { return errCode; } + + // Get file name. + GString *getFileName() { return fileName; } + + // Get the xref table. + XRef *getXRef() { return xref; } + + // Get catalog. + Catalog *getCatalog() { return catalog; } + + // Get base stream. + BaseStream *getBaseStream() { return str; } + + // Get page parameters. + double getPageMediaWidth(int page) + { return catalog->getPage(page)->getMediaWidth(); } + double getPageMediaHeight(int page) + { return catalog->getPage(page)->getMediaHeight(); } + double getPageCropWidth(int page) + { return catalog->getPage(page)->getCropWidth(); } + double getPageCropHeight(int page) + { return catalog->getPage(page)->getCropHeight(); } + int getPageRotate(int page) + { return catalog->getPage(page)->getRotate(); } + + // Get number of pages. + int getNumPages() { return catalog->getNumPages(); } + + // Return the contents of the metadata stream, or NULL if there is + // no metadata. + GString *readMetadata() { return catalog->readMetadata(); } + + // Return the structure tree root object. + Object *getStructTreeRoot() { return catalog->getStructTreeRoot(); } + + // Display a page. + void displayPage(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + // Display a range of pages. + void displayPages(OutputDev *out, int firstPage, int lastPage, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + // Display part of a page. + void displayPageSlice(OutputDev *out, int page, + double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool crop, GBool printing, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + // Find a page, given its object ID. Returns page number, or 0 if + // not found. + int findPage(int num, int gen) { return catalog->findPage(num, gen); } + + // Returns the links for the current page, transferring ownership to + // the caller. + Links *getLinks(int page); + + // Find a named destination. Returns the link destination, or + // NULL if is not a destination. + LinkDest *findDest(GString *name) + { return catalog->findDest(name); } + + // Process the links for a page. + void processLinks(OutputDev *out, int page); + +#ifndef DISABLE_OUTLINE + // Return the outline object. + Outline *getOutline() { return outline; } +#endif + + // Is the file encrypted? + GBool isEncrypted() { return xref->isEncrypted(); } + + // Check various permissions. + GBool okToPrint(GBool ignoreOwnerPW = gFalse) + { return xref->okToPrint(ignoreOwnerPW); } + GBool okToChange(GBool ignoreOwnerPW = gFalse) + { return xref->okToChange(ignoreOwnerPW); } + GBool okToCopy(GBool ignoreOwnerPW = gFalse) + { return xref->okToCopy(ignoreOwnerPW); } + GBool okToAddNotes(GBool ignoreOwnerPW = gFalse) + { return xref->okToAddNotes(ignoreOwnerPW); } + + // Is this document linearized? + GBool isLinearized(); + + // Return the document's Info dictionary (if any). + Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); } + Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); } + + // Return the PDF version specified by the file. + double getPDFVersion() { return pdfVersion; } + + // Save this file with another name. + GBool saveAs(GString *name); + + // Return a pointer to the GUI (XPDFCore or WinPDFCore object). + void *getGUIData() { return guiData; } + + +private: + + GBool setup(GString *ownerPassword, GString *userPassword); + void checkHeader(); + GBool checkEncryption(GString *ownerPassword, GString *userPassword); + + GString *fileName; + FILE *file; + BaseStream *str; + void *guiData; + double pdfVersion; + XRef *xref; + Catalog *catalog; +#ifndef DISABLE_OUTLINE + Outline *outline; +#endif + + + GBool ok; + int errCode; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc new file mode 100644 index 000000000..89dc38283 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc @@ -0,0 +1,44 @@ +//======================================================================== +// +// PDFDocEncoding.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include "PDFDocEncoding.h" + +Unicode pdfDocEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 00 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 10 + 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, // 20 + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 30 + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 40 + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 50 + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 60 + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // 70 + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, // 80 + 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, // 90 + 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0 + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0 + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0 + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0 + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0 + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0 + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h new file mode 100644 index 000000000..3259d3e10 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h @@ -0,0 +1,16 @@ +//======================================================================== +// +// PDFDocEncoding.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef PDFDOCENCODING_H +#define PDFDOCENCODING_H + +#include "CharTypes.h" + +extern Unicode pdfDocEncoding[256]; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc new file mode 100644 index 000000000..0ad376185 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc @@ -0,0 +1,135 @@ +//======================================================================== +// +// PSTokenizer.cc +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "PSTokenizer.h" + +//------------------------------------------------------------------------ + +// A '1' in this array means the character is white space. A '1' or +// '2' means the character ends a name or command. +static char specialChars[256] = { + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x + 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx +}; + +//------------------------------------------------------------------------ + +PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) { + getCharFunc = getCharFuncA; + data = dataA; + charBuf = -1; +} + +PSTokenizer::~PSTokenizer() { +} + +GBool PSTokenizer::getToken(char *buf, int size, int *length) { + GBool comment, backslash; + int c; + int i; + + // skip whitespace and comments + comment = gFalse; + while (1) { + if ((c = getChar()) == EOF) { + buf[0] = '\0'; + *length = 0; + return gFalse; + } + if (comment) { + if (c == '\x0a' || c == '\x0d') { + comment = gFalse; + } + } else if (c == '%') { + comment = gTrue; + } else if (specialChars[c] != 1) { + break; + } + } + + // read a token + i = 0; + buf[i++] = c; + if (c == '(') { + backslash = gFalse; + while ((c = lookChar()) != EOF) { + if (i < size - 1) { + buf[i++] = c; + } + getChar(); + if (c == '\\') { + backslash = gTrue; + } else if (!backslash && c == ')') { + break; + } else { + backslash = gFalse; + } + } + } else if (c == '<') { + while ((c = lookChar()) != EOF) { + getChar(); + if (i < size - 1 && specialChars[c] != 1) { + buf[i++] = c; + } + if (c == '>') { + break; + } + } + } else if (c != '[' && c != ']') { + while ((c = lookChar()) != EOF && !specialChars[c]) { + getChar(); + if (i < size - 1) { + buf[i++] = c; + } + } + } + buf[i] = '\0'; + *length = i; + + return gTrue; +} + +int PSTokenizer::lookChar() { + if (charBuf < 0) { + charBuf = (*getCharFunc)(data); + } + return charBuf; +} + +int PSTokenizer::getChar() { + int c; + + if (charBuf < 0) { + charBuf = (*getCharFunc)(data); + } + c = charBuf; + charBuf = -1; + return c; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h new file mode 100644 index 000000000..4d5ee97f4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h @@ -0,0 +1,41 @@ +//======================================================================== +// +// PSTokenizer.h +// +// Copyright 2002-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef PSTOKENIZER_H +#define PSTOKENIZER_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ + +class PSTokenizer { +public: + + PSTokenizer(int (*getCharFuncA)(void *), void *dataA); + ~PSTokenizer(); + + // Get the next PostScript token. Returns false at end-of-stream. + GBool getToken(char *buf, int size, int *length); + +private: + + int lookChar(); + int getChar(); + + int (*getCharFunc)(void *); + void *data; + int charBuf; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc new file mode 100644 index 000000000..c93066548 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc @@ -0,0 +1,441 @@ +//======================================================================== +// +// Page.cc +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "GlobalParams.h" +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "XRef.h" +#include "Link.h" +#include "OutputDev.h" +#ifndef PDF_PARSER_ONLY +#include "Gfx.h" +#include "GfxState.h" +#include "Annot.h" +#endif +#include "Error.h" +#include "Catalog.h" +#include "Page.h" + +//------------------------------------------------------------------------ +// PDFRectangle +//------------------------------------------------------------------------ + +void PDFRectangle::clipTo(PDFRectangle *rect) { + if (x1 < rect->x1) { + x1 = rect->x1; + } else if (x1 > rect->x2) { + x1 = rect->x2; + } + if (x2 < rect->x1) { + x2 = rect->x1; + } else if (x2 > rect->x2) { + x2 = rect->x2; + } + if (y1 < rect->y1) { + y1 = rect->y1; + } else if (y1 > rect->y2) { + y1 = rect->y2; + } + if (y2 < rect->y1) { + y2 = rect->y1; + } else if (y2 > rect->y2) { + y2 = rect->y2; + } +} + +//------------------------------------------------------------------------ +// PageAttrs +//------------------------------------------------------------------------ + +PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) { + Object obj1; + + // get old/default values + if (attrs) { + mediaBox = attrs->mediaBox; + cropBox = attrs->cropBox; + haveCropBox = attrs->haveCropBox; + rotate = attrs->rotate; + attrs->resources.copy(&resources); + } else { + // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary + // but some (non-compliant) PDF files don't specify a MediaBox + mediaBox.x1 = 0; + mediaBox.y1 = 0; + mediaBox.x2 = 612; + mediaBox.y2 = 792; + cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0; + haveCropBox = gFalse; + rotate = 0; + resources.initNull(); + } + + // media box + readBox(dict, "MediaBox", &mediaBox); + + // crop box + if (readBox(dict, "CropBox", &cropBox)) { + haveCropBox = gTrue; + } + if (!haveCropBox) { + cropBox = mediaBox; + } + + // other boxes + bleedBox = cropBox; + readBox(dict, "BleedBox", &bleedBox); + trimBox = cropBox; + readBox(dict, "TrimBox", &trimBox); + artBox = cropBox; + readBox(dict, "ArtBox", &artBox); + + // clip all other boxes to the media box + cropBox.clipTo(&mediaBox); + bleedBox.clipTo(&mediaBox); + trimBox.clipTo(&mediaBox); + artBox.clipTo(&mediaBox); + + // rotate + dict->lookup("Rotate", &obj1); + if (obj1.isInt()) { + rotate = obj1.getInt(); + } + obj1.free(); + while (rotate < 0) { + rotate += 360; + } + while (rotate >= 360) { + rotate -= 360; + } + + // misc attributes + dict->lookup("LastModified", &lastModified); + dict->lookup("BoxColorInfo", &boxColorInfo); + dict->lookup("Group", &group); + dict->lookup("Metadata", &metadata); + dict->lookup("PieceInfo", &pieceInfo); + dict->lookup("SeparationInfo", &separationInfo); + + // resource dictionary + dict->lookup("Resources", &obj1); + if (obj1.isDict()) { + resources.free(); + obj1.copy(&resources); + } + obj1.free(); +} + +PageAttrs::~PageAttrs() { + lastModified.free(); + boxColorInfo.free(); + group.free(); + metadata.free(); + pieceInfo.free(); + separationInfo.free(); + resources.free(); +} + +GBool PageAttrs::readBox(Dict *dict, char *key, PDFRectangle *box) { + PDFRectangle tmp; + double t; + Object obj1, obj2; + GBool ok; + + dict->lookup(key, &obj1); + if (obj1.isArray() && obj1.arrayGetLength() == 4) { + ok = gTrue; + obj1.arrayGet(0, &obj2); + if (obj2.isNum()) { + tmp.x1 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + obj1.arrayGet(1, &obj2); + if (obj2.isNum()) { + tmp.y1 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + obj1.arrayGet(2, &obj2); + if (obj2.isNum()) { + tmp.x2 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + obj1.arrayGet(3, &obj2); + if (obj2.isNum()) { + tmp.y2 = obj2.getNum(); + } else { + ok = gFalse; + } + obj2.free(); + if (ok) { + if (tmp.x1 > tmp.x2) { + t = tmp.x1; tmp.x1 = tmp.x2; tmp.x2 = t; + } + if (tmp.y1 > tmp.y2) { + t = tmp.y1; tmp.y1 = tmp.y2; tmp.y2 = t; + } + *box = tmp; + } + } else { + ok = gFalse; + } + obj1.free(); + return ok; +} + +//------------------------------------------------------------------------ +// Page +//------------------------------------------------------------------------ + +Page::Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA) { + ok = gTrue; + xref = xrefA; + num = numA; + + // get attributes + attrs = attrsA; + + // annotations + pageDict->lookupNF("Annots", &annots); + if (!(annots.isRef() || annots.isArray() || annots.isNull())) { + error(-1, "Page annotations object (page %d) is wrong type (%s)", + num, annots.getTypeName()); + annots.free(); + goto err2; + } + + // contents + pageDict->lookupNF("Contents", &contents); + if (!(contents.isRef() || contents.isArray() || + contents.isNull())) { + error(-1, "Page contents object (page %d) is wrong type (%s)", + num, contents.getTypeName()); + contents.free(); + goto err1; + } + + return; + + err2: + annots.initNull(); + err1: + contents.initNull(); + ok = gFalse; +} + +Page::~Page() { + delete attrs; + annots.free(); + contents.free(); +} + +Links *Page::getLinks(Catalog *catalog) { + Links *links; + Object obj; + + links = new Links(getAnnots(&obj), catalog->getBaseURI()); + obj.free(); + return links; +} + +void Page::display(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) { + displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, + -1, -1, -1, -1, printing, catalog, + abortCheckCbk, abortCheckCbkData); +} + +void Page::displaySlice(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data), + void *abortCheckCbkData) { +#ifndef PDF_PARSER_ONLY + PDFRectangle *mediaBox, *cropBox; + PDFRectangle box; + Gfx *gfx; + Object obj; + Annots *annotList; + Dict *acroForm; + int i; + + if (!out->checkPageSlice(this, hDPI, vDPI, rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, catalog, + abortCheckCbk, abortCheckCbkData)) { + return; + } + + rotate += getRotate(); + if (rotate >= 360) { + rotate -= 360; + } else if (rotate < 0) { + rotate += 360; + } + + makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(), + sliceX, sliceY, sliceW, sliceH, &box, &crop); + cropBox = getCropBox(); + + if (globalParams->getPrintCommands()) { + mediaBox = getMediaBox(); + printf("***** MediaBox = ll:%g,%g ur:%g,%g\n", + mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2); + printf("***** CropBox = ll:%g,%g ur:%g,%g\n", + cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2); + printf("***** Rotate = %d\n", attrs->getRotate()); + } + + gfx = new Gfx(xref, out, num, attrs->getResourceDict(), + hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL, + rotate, abortCheckCbk, abortCheckCbkData); + contents.fetch(xref, &obj); + if (!obj.isNull()) { + gfx->saveState(); + gfx->display(&obj); + gfx->restoreState(); + } + obj.free(); + + // draw annotations + annotList = new Annots(xref, catalog, getAnnots(&obj)); + obj.free(); + acroForm = catalog->getAcroForm()->isDict() ? + catalog->getAcroForm()->getDict() : NULL; + if (acroForm) { + if (acroForm->lookup("NeedAppearances", &obj)) { + if (obj.isBool() && obj.getBool()) { + annotList->generateAppearances(acroForm); + } + } + obj.free(); + } + if (annotList->getNumAnnots() > 0) { + if (globalParams->getPrintCommands()) { + printf("***** Annotations\n"); + } + for (i = 0; i < annotList->getNumAnnots(); ++i) { + annotList->getAnnot(i)->draw(gfx, printing); + } + out->dump(); + } + delete annotList; + + delete gfx; +#endif +} + +void Page::makeBox(double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool upsideDown, + double sliceX, double sliceY, double sliceW, double sliceH, + PDFRectangle *box, GBool *crop) { + PDFRectangle *mediaBox, *cropBox, *baseBox; + double kx, ky; + + mediaBox = getMediaBox(); + cropBox = getCropBox(); + if (sliceW >= 0 && sliceH >= 0) { + baseBox = useMediaBox ? mediaBox : cropBox; + kx = 72.0 / hDPI; + ky = 72.0 / vDPI; + if (rotate == 90) { + if (upsideDown) { + box->x1 = baseBox->x1 + ky * sliceY; + box->x2 = baseBox->x1 + ky * (sliceY + sliceH); + } else { + box->x1 = baseBox->x2 - ky * (sliceY + sliceH); + box->x2 = baseBox->x2 - ky * sliceY; + } + box->y1 = baseBox->y1 + kx * sliceX; + box->y2 = baseBox->y1 + kx * (sliceX + sliceW); + } else if (rotate == 180) { + box->x1 = baseBox->x2 - kx * (sliceX + sliceW); + box->x2 = baseBox->x2 - kx * sliceX; + if (upsideDown) { + box->y1 = baseBox->y1 + ky * sliceY; + box->y2 = baseBox->y1 + ky * (sliceY + sliceH); + } else { + box->y1 = baseBox->y2 - ky * (sliceY + sliceH); + box->y2 = baseBox->y2 - ky * sliceY; + } + } else if (rotate == 270) { + if (upsideDown) { + box->x1 = baseBox->x2 - ky * (sliceY + sliceH); + box->x2 = baseBox->x2 - ky * sliceY; + } else { + box->x1 = baseBox->x1 + ky * sliceY; + box->x2 = baseBox->x1 + ky * (sliceY + sliceH); + } + box->y1 = baseBox->y2 - kx * (sliceX + sliceW); + box->y2 = baseBox->y2 - kx * sliceX; + } else { + box->x1 = baseBox->x1 + kx * sliceX; + box->x2 = baseBox->x1 + kx * (sliceX + sliceW); + if (upsideDown) { + box->y1 = baseBox->y2 - ky * (sliceY + sliceH); + box->y2 = baseBox->y2 - ky * sliceY; + } else { + box->y1 = baseBox->y1 + ky * sliceY; + box->y2 = baseBox->y1 + ky * (sliceY + sliceH); + } + } + } else if (useMediaBox) { + *box = *mediaBox; + } else { + *box = *cropBox; + *crop = gFalse; + } +} + +void Page::processLinks(OutputDev *out, Catalog *catalog) { + Links *links; + int i; + + links = getLinks(catalog); + for (i = 0; i < links->getNumLinks(); ++i) { + out->processLink(links->getLink(i), catalog); + } + delete links; +} + +void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool upsideDown) { + GfxState *state; + int i; + + rotate += getRotate(); + if (rotate >= 360) { + rotate -= 360; + } else if (rotate < 0) { + rotate += 360; + } + state = new GfxState(hDPI, vDPI, + useMediaBox ? getMediaBox() : getCropBox(), + rotate, upsideDown); + for (i = 0; i < 6; ++i) { + ctm[i] = state->getCTM()[i]; + } + delete state; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h new file mode 100644 index 000000000..2b011756e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h @@ -0,0 +1,187 @@ +//======================================================================== +// +// Page.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef PAGE_H +#define PAGE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" + +class Dict; +class XRef; +class OutputDev; +class Links; +class Catalog; + +//------------------------------------------------------------------------ + +class PDFRectangle { +public: + double x1, y1, x2, y2; + + PDFRectangle() { x1 = y1 = x2 = y2 = 0; } + PDFRectangle(double x1A, double y1A, double x2A, double y2A) + { x1 = x1A; y1 = y1A; x2 = x2A; y2 = y2A; } + GBool isValid() { return x1 != 0 || y1 != 0 || x2 != 0 || y2 != 0; } + void clipTo(PDFRectangle *rect); +}; + +//------------------------------------------------------------------------ +// PageAttrs +//------------------------------------------------------------------------ + +class PageAttrs { +public: + + // Construct a new PageAttrs object by merging a dictionary + // (of type Pages or Page) into another PageAttrs object. If + // is NULL, uses defaults. + PageAttrs(PageAttrs *attrs, Dict *dict); + + // Destructor. + ~PageAttrs(); + + // Accessors. + PDFRectangle *getMediaBox() { return &mediaBox; } + PDFRectangle *getCropBox() { return &cropBox; } + GBool isCropped() { return haveCropBox; } + PDFRectangle *getBleedBox() { return &bleedBox; } + PDFRectangle *getTrimBox() { return &trimBox; } + PDFRectangle *getArtBox() { return &artBox; } + int getRotate() { return rotate; } + GString *getLastModified() + { return lastModified.isString() + ? lastModified.getString() : (GString *)NULL; } + Dict *getBoxColorInfo() + { return boxColorInfo.isDict() ? boxColorInfo.getDict() : (Dict *)NULL; } + Dict *getGroup() + { return group.isDict() ? group.getDict() : (Dict *)NULL; } + Stream *getMetadata() + { return metadata.isStream() ? metadata.getStream() : (Stream *)NULL; } + Dict *getPieceInfo() + { return pieceInfo.isDict() ? pieceInfo.getDict() : (Dict *)NULL; } + Dict *getSeparationInfo() + { return separationInfo.isDict() + ? separationInfo.getDict() : (Dict *)NULL; } + Dict *getResourceDict() + { return resources.isDict() ? resources.getDict() : (Dict *)NULL; } + +private: + + GBool readBox(Dict *dict, char *key, PDFRectangle *box); + + PDFRectangle mediaBox; + PDFRectangle cropBox; + GBool haveCropBox; + PDFRectangle bleedBox; + PDFRectangle trimBox; + PDFRectangle artBox; + int rotate; + Object lastModified; + Object boxColorInfo; + Object group; + Object metadata; + Object pieceInfo; + Object separationInfo; + Object resources; +}; + +//------------------------------------------------------------------------ +// Page +//------------------------------------------------------------------------ + +class Page { +public: + + // Constructor. + Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA); + + // Destructor. + ~Page(); + + // Is page valid? + GBool isOk() { return ok; } + + // Get page parameters. + int getNum() { return num; } + PDFRectangle *getMediaBox() { return attrs->getMediaBox(); } + PDFRectangle *getCropBox() { return attrs->getCropBox(); } + GBool isCropped() { return attrs->isCropped(); } + double getMediaWidth() + { return attrs->getMediaBox()->x2 - attrs->getMediaBox()->x1; } + double getMediaHeight() + { return attrs->getMediaBox()->y2 - attrs->getMediaBox()->y1; } + double getCropWidth() + { return attrs->getCropBox()->x2 - attrs->getCropBox()->x1; } + double getCropHeight() + { return attrs->getCropBox()->y2 - attrs->getCropBox()->y1; } + PDFRectangle *getBleedBox() { return attrs->getBleedBox(); } + PDFRectangle *getTrimBox() { return attrs->getTrimBox(); } + PDFRectangle *getArtBox() { return attrs->getArtBox(); } + int getRotate() { return attrs->getRotate(); } + GString *getLastModified() { return attrs->getLastModified(); } + Dict *getBoxColorInfo() { return attrs->getBoxColorInfo(); } + Dict *getGroup() { return attrs->getGroup(); } + Stream *getMetadata() { return attrs->getMetadata(); } + Dict *getPieceInfo() { return attrs->getPieceInfo(); } + Dict *getSeparationInfo() { return attrs->getSeparationInfo(); } + + // Get resource dictionary. + Dict *getResourceDict() { return attrs->getResourceDict(); } + + // Get annotations array. + Object *getAnnots(Object *obj) { return annots.fetch(xref, obj); } + + // Return a list of links. + Links *getLinks(Catalog *catalog); + + // Get contents. + Object *getContents(Object *obj) { return contents.fetch(xref, obj); } + + // Display a page. + void display(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + // Display part of a page. + void displaySlice(OutputDev *out, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool crop, + int sliceX, int sliceY, int sliceW, int sliceH, + GBool printing, Catalog *catalog, + GBool (*abortCheckCbk)(void *data) = NULL, + void *abortCheckCbkData = NULL); + + void makeBox(double hDPI, double vDPI, int rotate, + GBool useMediaBox, GBool upsideDown, + double sliceX, double sliceY, double sliceW, double sliceH, + PDFRectangle *box, GBool *crop); + + void processLinks(OutputDev *out, Catalog *catalog); + + // Get the page's default CTM. + void getDefaultCTM(double *ctm, double hDPI, double vDPI, + int rotate, GBool useMediaBox, GBool upsideDown); + +private: + + XRef *xref; // the xref table for this PDF file + int num; // page number + PageAttrs *attrs; // page attributes + Object annots; // annotations array + Object contents; // page contents + GBool ok; // true if page is valid +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc new file mode 100644 index 000000000..c1fc71521 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc @@ -0,0 +1,227 @@ +//======================================================================== +// +// Parser.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "Object.h" +#include "Array.h" +#include "Dict.h" +#include "Decrypt.h" +#include "Parser.h" +#include "XRef.h" +#include "Error.h" + +Parser::Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA) { + xref = xrefA; + lexer = lexerA; + inlineImg = 0; + allowStreams = allowStreamsA; + lexer->getObj(&buf1); + lexer->getObj(&buf2); +} + +Parser::~Parser() { + buf1.free(); + buf2.free(); + delete lexer; +} + +Object *Parser::getObj(Object *obj, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, + int objNum, int objGen) { + char *key; + Stream *str; + Object obj2; + int num; + DecryptStream *decrypt; + GString *s, *s2; + int c; + + // refill buffer after inline image data + if (inlineImg == 2) { + buf1.free(); + buf2.free(); + lexer->getObj(&buf1); + lexer->getObj(&buf2); + inlineImg = 0; + } + + // array + if (buf1.isCmd("[")) { + shift(); + obj->initArray(xref); + while (!buf1.isCmd("]") && !buf1.isEOF()) + obj->arrayAdd(getObj(&obj2, fileKey, encAlgorithm, keyLength, + objNum, objGen)); + if (buf1.isEOF()) + error(getPos(), "End of file inside array"); + shift(); + + // dictionary or stream + } else if (buf1.isCmd("<<")) { + shift(); + obj->initDict(xref); + while (!buf1.isCmd(">>") && !buf1.isEOF()) { + if (!buf1.isName()) { + error(getPos(), "Dictionary key must be a name object"); + shift(); + } else { + key = copyString(buf1.getName()); + shift(); + if (buf1.isEOF() || buf1.isError()) { + gfree(key); + break; + } + obj->dictAdd(key, getObj(&obj2, fileKey, encAlgorithm, keyLength, + objNum, objGen)); + } + } + if (buf1.isEOF()) + error(getPos(), "End of file inside dictionary"); + // stream objects are not allowed inside content streams or + // object streams + if (allowStreams && buf2.isCmd("stream")) { + if ((str = makeStream(obj, fileKey, encAlgorithm, keyLength, + objNum, objGen))) { + obj->initStream(str); + } else { + obj->free(); + obj->initError(); + } + } else { + shift(); + } + + // indirect reference or integer + } else if (buf1.isInt()) { + num = buf1.getInt(); + shift(); + if (buf1.isInt() && buf2.isCmd("R")) { + obj->initRef(num, buf1.getInt()); + shift(); + shift(); + } else { + obj->initInt(num); + } + + // string + } else if (buf1.isString() && fileKey) { + s = buf1.getString(); + s2 = new GString(); + obj2.initNull(); + decrypt = new DecryptStream(new MemStream(s->getCString(), 0, + s->getLength(), &obj2), + fileKey, encAlgorithm, keyLength, + objNum, objGen); + decrypt->reset(); + while ((c = decrypt->getChar()) != EOF) { + s2->append((char)c); + } + delete decrypt; + obj->initString(s2); + shift(); + + // simple object + } else { + buf1.copy(obj); + shift(); + } + + return obj; +} + +Stream *Parser::makeStream(Object *dict, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, + int objNum, int objGen) { + Object obj; + BaseStream *baseStr; + Stream *str; + Guint pos, endPos, length; + + // get stream start position + lexer->skipToNextLine(); + pos = lexer->getPos(); + + // get length + dict->dictLookup("Length", &obj); + if (obj.isInt()) { + length = (Guint)obj.getInt(); + obj.free(); + } else { + error(getPos(), "Bad 'Length' attribute in stream"); + obj.free(); + return NULL; + } + + // check for length in damaged file + if (xref && xref->getStreamEnd(pos, &endPos)) { + length = endPos - pos; + } + + // in badly damaged PDF files, we can run off the end of the input + // stream immediately after the "stream" token + if (!lexer->getStream()) { + return NULL; + } + baseStr = lexer->getStream()->getBaseStream(); + + // skip over stream data + lexer->setPos(pos + length); + + // refill token buffers and check for 'endstream' + shift(); // kill '>>' + shift(); // kill 'stream' + if (buf1.isCmd("endstream")) { + shift(); + } else { + error(getPos(), "Missing 'endstream'"); + // kludge for broken PDF files: just add 5k to the length, and + // hope its enough + length += 5000; + } + + // make base stream + str = baseStr->makeSubStream(pos, gTrue, length, dict); + + // handle decryption + if (fileKey) { + str = new DecryptStream(str, fileKey, encAlgorithm, keyLength, + objNum, objGen); + } + + // get filters + str = str->addFilters(dict); + + return str; +} + +void Parser::shift() { + if (inlineImg > 0) { + if (inlineImg < 2) { + ++inlineImg; + } else { + // in a damaged content stream, if 'ID' shows up in the middle + // of a dictionary, we need to reset + inlineImg = 0; + } + } else if (buf2.isCmd("ID")) { + lexer->skipChar(); // skip char after 'ID' command + inlineImg = 1; + } + buf1.free(); + buf1 = buf2; + if (inlineImg > 0) // don't buffer inline image data + buf2.initNull(); + else + lexer->getObj(&buf2); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h new file mode 100644 index 000000000..a109558b0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h @@ -0,0 +1,59 @@ +//======================================================================== +// +// Parser.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef PARSER_H +#define PARSER_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Lexer.h" + +//------------------------------------------------------------------------ +// Parser +//------------------------------------------------------------------------ + +class Parser { +public: + + // Constructor. + Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA); + + // Destructor. + ~Parser(); + + // Get the next object from the input stream. + Object *getObj(Object *obj, Guchar *fileKey = NULL, + CryptAlgorithm encAlgorithm = cryptRC4, int keyLength = 0, + int objNum = 0, int objGen = 0); + + // Get stream. + Stream *getStream() { return lexer->getStream(); } + + // Get current position in file. + int getPos() { return lexer->getPos(); } + +private: + + XRef *xref; // the xref table for this PDF file + Lexer *lexer; // input stream + GBool allowStreams; // parse stream objects? + Object buf1, buf2; // next two tokens + int inlineImg; // set when inline image data is encountered + + Stream *makeStream(Object *dict, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, + int objNum, int objGen); + void shift(); +}; + +#endif + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc new file mode 100644 index 000000000..ea0f9341d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc @@ -0,0 +1,390 @@ +//======================================================================== +// +// SecurityHandler.cc +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "GString.h" +#include "PDFDoc.h" +#include "Decrypt.h" +#include "Error.h" +#include "GlobalParams.h" +#if HAVE_XPDFCORE +# include "XPDFCore.h" +#elif HAVE_WINPDFCORE +# include "WinPDFCore.h" +#endif +#ifdef ENABLE_PLUGINS +# include "XpdfPluginAPI.h" +#endif +#include "SecurityHandler.h" + +//------------------------------------------------------------------------ +// SecurityHandler +//------------------------------------------------------------------------ + +SecurityHandler *SecurityHandler::make(PDFDoc *docA, Object *encryptDictA) { + Object filterObj; + SecurityHandler *secHdlr; +#ifdef ENABLE_PLUGINS + XpdfSecurityHandler *xsh; +#endif + + encryptDictA->dictLookup("Filter", &filterObj); + if (filterObj.isName("Standard")) { + secHdlr = new StandardSecurityHandler(docA, encryptDictA); + } else if (filterObj.isName()) { +#ifdef ENABLE_PLUGINS + if ((xsh = globalParams->getSecurityHandler(filterObj.getName()))) { + secHdlr = new ExternalSecurityHandler(docA, encryptDictA, xsh); + } else { +#endif + error(-1, "Couldn't find the '%s' security handler", + filterObj.getName()); + secHdlr = NULL; +#ifdef ENABLE_PLUGINS + } +#endif + } else { + error(-1, "Missing or invalid 'Filter' entry in encryption dictionary"); + secHdlr = NULL; + } + filterObj.free(); + return secHdlr; +} + +SecurityHandler::SecurityHandler(PDFDoc *docA) { + doc = docA; +} + +SecurityHandler::~SecurityHandler() { +} + +GBool SecurityHandler::checkEncryption(GString *ownerPassword, + GString *userPassword) { + void *authData; + GBool ok; + int i; + + if (ownerPassword || userPassword) { + authData = makeAuthData(ownerPassword, userPassword); + } else { + authData = NULL; + } + ok = authorize(authData); + if (authData) { + freeAuthData(authData); + } + for (i = 0; !ok && i < 3; ++i) { + if (!(authData = getAuthData())) { + break; + } + ok = authorize(authData); + if (authData) { + freeAuthData(authData); + } + } + if (!ok) { + error(-1, "Incorrect password"); + } + return ok; +} + +//------------------------------------------------------------------------ +// StandardSecurityHandler +//------------------------------------------------------------------------ + +class StandardAuthData { +public: + + StandardAuthData(GString *ownerPasswordA, GString *userPasswordA) { + ownerPassword = ownerPasswordA; + userPassword = userPasswordA; + } + + ~StandardAuthData() { + if (ownerPassword) { + delete ownerPassword; + } + if (userPassword) { + delete userPassword; + } + } + + GString *ownerPassword; + GString *userPassword; +}; + +StandardSecurityHandler::StandardSecurityHandler(PDFDoc *docA, + Object *encryptDictA): + SecurityHandler(docA) +{ + Object versionObj, revisionObj, lengthObj; + Object ownerKeyObj, userKeyObj, permObj, fileIDObj; + Object fileIDObj1; + Object cryptFiltersObj, streamFilterObj, stringFilterObj; + Object cryptFilterObj, cfmObj, cfLengthObj; + Object encryptMetadataObj; + + ok = gFalse; + fileID = NULL; + ownerKey = NULL; + userKey = NULL; + + encryptDictA->dictLookup("V", &versionObj); + encryptDictA->dictLookup("R", &revisionObj); + encryptDictA->dictLookup("Length", &lengthObj); + encryptDictA->dictLookup("O", &ownerKeyObj); + encryptDictA->dictLookup("U", &userKeyObj); + encryptDictA->dictLookup("P", &permObj); + doc->getXRef()->getTrailerDict()->dictLookup("ID", &fileIDObj); + if (versionObj.isInt() && + revisionObj.isInt() && + ownerKeyObj.isString() && ownerKeyObj.getString()->getLength() == 32 && + userKeyObj.isString() && userKeyObj.getString()->getLength() == 32 && + permObj.isInt()) { + encVersion = versionObj.getInt(); + encRevision = revisionObj.getInt(); + encAlgorithm = cryptRC4; + // revision 2 forces a 40-bit key - some buggy PDF generators + // set the Length value incorrectly + if (encRevision == 2 || !lengthObj.isInt()) { + fileKeyLength = 5; + } else { + fileKeyLength = lengthObj.getInt() / 8; + } + encryptMetadata = gTrue; + //~ this currently only handles a subset of crypt filter functionality + if (encVersion == 4 && encRevision == 4) { + encryptDictA->dictLookup("CF", &cryptFiltersObj); + encryptDictA->dictLookup("StmF", &streamFilterObj); + encryptDictA->dictLookup("StrF", &stringFilterObj); + if (cryptFiltersObj.isDict() && + streamFilterObj.isName() && + stringFilterObj.isName() && + !strcmp(streamFilterObj.getName(), stringFilterObj.getName())) { + if (cryptFiltersObj.dictLookup(streamFilterObj.getName(), + &cryptFilterObj)->isDict()) { + cryptFilterObj.dictLookup("CFM", &cfmObj); + if (cfmObj.isName("V2")) { + encVersion = 2; + encRevision = 3; + if (cryptFilterObj.dictLookup("Length", &cfLengthObj)->isInt()) { + //~ according to the spec, this should be cfLengthObj / 8 + fileKeyLength = cfLengthObj.getInt(); + } + cfLengthObj.free(); + } else if (cfmObj.isName("AESV2")) { + encVersion = 2; + encRevision = 3; + encAlgorithm = cryptAES; + if (cryptFilterObj.dictLookup("Length", &cfLengthObj)->isInt()) { + //~ according to the spec, this should be cfLengthObj / 8 + fileKeyLength = cfLengthObj.getInt(); + } + cfLengthObj.free(); + } + cfmObj.free(); + } + cryptFilterObj.free(); + } + stringFilterObj.free(); + streamFilterObj.free(); + cryptFiltersObj.free(); + if (encryptDictA->dictLookup("EncryptMetadata", + &encryptMetadataObj)->isBool()) { + encryptMetadata = encryptMetadataObj.getBool(); + } + encryptMetadataObj.free(); + } + permFlags = permObj.getInt(); + ownerKey = ownerKeyObj.getString()->copy(); + userKey = userKeyObj.getString()->copy(); + if (encVersion >= 1 && encVersion <= 2 && + encRevision >= 2 && encRevision <= 3) { + if (fileIDObj.isArray()) { + if (fileIDObj.arrayGet(0, &fileIDObj1)->isString()) { + fileID = fileIDObj1.getString()->copy(); + } else { + fileID = new GString(); + } + fileIDObj1.free(); + } else { + fileID = new GString(); + } + ok = gTrue; + } else { + error(-1, "Unsupported version/revision (%d/%d) of Standard security handler", + encVersion, encRevision); + } + } else { + error(-1, "Weird encryption info"); + } + if (fileKeyLength > 16) { + fileKeyLength = 16; + } + fileIDObj.free(); + permObj.free(); + userKeyObj.free(); + ownerKeyObj.free(); + lengthObj.free(); + revisionObj.free(); + versionObj.free(); +} + +StandardSecurityHandler::~StandardSecurityHandler() { + if (fileID) { + delete fileID; + } + if (ownerKey) { + delete ownerKey; + } + if (userKey) { + delete userKey; + } +} + +void *StandardSecurityHandler::makeAuthData(GString *ownerPassword, + GString *userPassword) { + return new StandardAuthData(ownerPassword ? ownerPassword->copy() + : (GString *)NULL, + userPassword ? userPassword->copy() + : (GString *)NULL); +} + +void *StandardSecurityHandler::getAuthData() { +#if HAVE_XPDFCORE + XPDFCore *core; + GString *password; + + if (!(core = (XPDFCore *)doc->getGUIData()) || + !(password = core->getPassword())) { + return NULL; + } + return new StandardAuthData(password, password->copy()); +#elif HAVE_WINPDFCORE + WinPDFCore *core; + GString *password; + + if (!(core = (WinPDFCore *)doc->getGUIData()) || + !(password = core->getPassword())) { + return NULL; + } + return new StandardAuthData(password, password->copy()); +#else + return NULL; +#endif +} + +void StandardSecurityHandler::freeAuthData(void *authData) { + delete (StandardAuthData *)authData; +} + +GBool StandardSecurityHandler::authorize(void *authData) { + GString *ownerPassword, *userPassword; + + if (!ok) { + return gFalse; + } + if (authData) { + ownerPassword = ((StandardAuthData *)authData)->ownerPassword; + userPassword = ((StandardAuthData *)authData)->userPassword; + } else { + ownerPassword = NULL; + userPassword = NULL; + } + if (!Decrypt::makeFileKey(encVersion, encRevision, fileKeyLength, + ownerKey, userKey, permFlags, fileID, + ownerPassword, userPassword, fileKey, + encryptMetadata, &ownerPasswordOk)) { + return gFalse; + } + return gTrue; +} + +#ifdef ENABLE_PLUGINS + +//------------------------------------------------------------------------ +// ExternalSecurityHandler +//------------------------------------------------------------------------ + +ExternalSecurityHandler::ExternalSecurityHandler(PDFDoc *docA, + Object *encryptDictA, + XpdfSecurityHandler *xshA): + SecurityHandler(docA) +{ + encryptDictA->copy(&encryptDict); + xsh = xshA; + encAlgorithm = cryptRC4; //~ this should be obtained via getKey + ok = gFalse; + + if (!(*xsh->newDoc)(xsh->handlerData, (XpdfDoc)docA, + (XpdfObject)encryptDictA, &docData)) { + return; + } + + ok = gTrue; +} + +ExternalSecurityHandler::~ExternalSecurityHandler() { + (*xsh->freeDoc)(xsh->handlerData, docData); + encryptDict.free(); +} + +void *ExternalSecurityHandler::makeAuthData(GString *ownerPassword, + GString *userPassword) { + char *opw, *upw; + void *authData; + + opw = ownerPassword ? ownerPassword->getCString() : (char *)NULL; + upw = userPassword ? userPassword->getCString() : (char *)NULL; + if (!(*xsh->makeAuthData)(xsh->handlerData, docData, opw, upw, &authData)) { + return NULL; + } + return authData; +} + +void *ExternalSecurityHandler::getAuthData() { + void *authData; + + if (!(*xsh->getAuthData)(xsh->handlerData, docData, &authData)) { + return NULL; + } + return authData; +} + +void ExternalSecurityHandler::freeAuthData(void *authData) { + (*xsh->freeAuthData)(xsh->handlerData, docData, authData); +} + +GBool ExternalSecurityHandler::authorize(void *authData) { + char *key; + int length; + + if (!ok) { + return gFalse; + } + permFlags = (*xsh->authorize)(xsh->handlerData, docData, authData); + if (!(permFlags & xpdfPermissionOpen)) { + return gFalse; + } + if (!(*xsh->getKey)(xsh->handlerData, docData, &key, &length, &encVersion)) { + return gFalse; + } + if ((fileKeyLength = length) > 16) { + fileKeyLength = 16; + } + memcpy(fileKey, key, fileKeyLength); + (*xsh->freeKey)(xsh->handlerData, docData, key, length); + return gTrue; +} + +#endif // ENABLE_PLUGINS diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h new file mode 100644 index 000000000..a27868c24 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h @@ -0,0 +1,160 @@ +//======================================================================== +// +// SecurityHandler.h +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef SECURITYHANDLER_H +#define SECURITYHANDLER_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" + +class GString; +class PDFDoc; +struct XpdfSecurityHandler; + +//------------------------------------------------------------------------ +// SecurityHandler +//------------------------------------------------------------------------ + +class SecurityHandler { +public: + + static SecurityHandler *make(PDFDoc *docA, Object *encryptDictA); + + SecurityHandler(PDFDoc *docA); + virtual ~SecurityHandler(); + + // Check the document's encryption. If the document is encrypted, + // this will first try and (in + // "batch" mode), and if those fail, it will attempt to request a + // password from the user. This is the high-level function that + // calls the lower level functions for the specific security handler + // (requesting a password three times, etc.). Returns true if the + // document can be opened (if it's unencrypted, or if a correct + // password is obtained); false otherwise (encrypted and no correct + // password). + GBool checkEncryption(GString *ownerPassword, + GString *userPassword); + + // Create authorization data for the specified owner and user + // passwords. If the security handler doesn't support "batch" mode, + // this function should return NULL. + virtual void *makeAuthData(GString *ownerPassword, + GString *userPassword) = 0; + + // Construct authorization data, typically by prompting the user for + // a password. Returns an authorization data object, or NULL to + // cancel. + virtual void *getAuthData() = 0; + + // Free the authorization data returned by makeAuthData or + // getAuthData. + virtual void freeAuthData(void *authData) = 0; + + // Attempt to authorize the document, using the supplied + // authorization data (which may be NULL). Returns true if + // successful (i.e., if at least the right to open the document was + // granted). + virtual GBool authorize(void *authData) = 0; + + // Return the various authorization parameters. These are only + // valid after authorize has returned true. + virtual int getPermissionFlags() = 0; + virtual GBool getOwnerPasswordOk() = 0; + virtual Guchar *getFileKey() = 0; + virtual int getFileKeyLength() = 0; + virtual int getEncVersion() = 0; + virtual CryptAlgorithm getEncAlgorithm() = 0; + +protected: + + PDFDoc *doc; +}; + +//------------------------------------------------------------------------ +// StandardSecurityHandler +//------------------------------------------------------------------------ + +class StandardSecurityHandler: public SecurityHandler { +public: + + StandardSecurityHandler(PDFDoc *docA, Object *encryptDictA); + virtual ~StandardSecurityHandler(); + + virtual void *makeAuthData(GString *ownerPassword, + GString *userPassword); + virtual void *getAuthData(); + virtual void freeAuthData(void *authData); + virtual GBool authorize(void *authData); + virtual int getPermissionFlags() { return permFlags; } + virtual GBool getOwnerPasswordOk() { return ownerPasswordOk; } + virtual Guchar *getFileKey() { return fileKey; } + virtual int getFileKeyLength() { return fileKeyLength; } + virtual int getEncVersion() { return encVersion; } + virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; } + +private: + + int permFlags; + GBool ownerPasswordOk; + Guchar fileKey[16]; + int fileKeyLength; + int encVersion; + int encRevision; + CryptAlgorithm encAlgorithm; + GBool encryptMetadata; + + GString *ownerKey, *userKey; + GString *fileID; + GBool ok; +}; + +#ifdef ENABLE_PLUGINS +//------------------------------------------------------------------------ +// ExternalSecurityHandler +//------------------------------------------------------------------------ + +class ExternalSecurityHandler: public SecurityHandler { +public: + + ExternalSecurityHandler(PDFDoc *docA, Object *encryptDictA, + XpdfSecurityHandler *xshA); + virtual ~ExternalSecurityHandler(); + + virtual void *makeAuthData(GString *ownerPassword, + GString *userPassword); + virtual void *getAuthData(); + virtual void freeAuthData(void *authData); + virtual GBool authorize(void *authData); + virtual int getPermissionFlags() { return permFlags; } + virtual GBool getOwnerPasswordOk() { return gFalse; } + virtual Guchar *getFileKey() { return fileKey; } + virtual int getFileKeyLength() { return fileKeyLength; } + virtual int getEncVersion() { return encVersion; } + virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; } + +private: + + Object encryptDict; + XpdfSecurityHandler *xsh; + void *docData; + int permFlags; + Guchar fileKey[16]; + int fileKeyLength; + int encVersion; + CryptAlgorithm encAlgorithm; + GBool ok; +}; +#endif // ENABLE_PLUGINS + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc new file mode 100644 index 000000000..537ee1a79 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc @@ -0,0 +1,3310 @@ +//======================================================================== +// +// Splash.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashErrorCodes.h" +#include "SplashMath.h" +#include "SplashBitmap.h" +#include "SplashState.h" +#include "SplashPath.h" +#include "SplashXPath.h" +#include "SplashXPathScanner.h" +#include "SplashPattern.h" +#include "SplashScreen.h" +#include "SplashFont.h" +#include "SplashGlyphBitmap.h" +#include "Splash.h" + +//------------------------------------------------------------------------ + +// distance of Bezier control point from center for circle approximation +// = (4 * (sqrt(2) - 1) / 3) * r +#define bezierCircle ((SplashCoord)0.55228475) +#define bezierCircle2 ((SplashCoord)(0.5 * 0.55228475)) + +// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result. +static inline Guchar div255(int x) { + return (Guchar)((x + (x >> 8) + 0x80) >> 8); +} + +//------------------------------------------------------------------------ +// SplashPipe +//------------------------------------------------------------------------ + +#define splashPipeMaxStages 9 + +struct SplashPipe { + // pixel coordinates + int x, y; + + // source pattern + SplashPattern *pattern; + + // source alpha and color + SplashCoord aInput; + GBool usesShape; + Guchar aSrc; + SplashColorPtr cSrc; + SplashColor cSrcVal; + + // non-isolated group alpha0 + Guchar *alpha0Ptr; + + // soft mask + SplashColorPtr softMaskPtr; + + // destination alpha and color + SplashColorPtr destColorPtr; + int destColorMask; + Guchar *destAlphaPtr; + + // shape + SplashCoord shape; + + // result alpha and color + GBool noTransparency; + SplashPipeResultColorCtrl resultColorCtrl; + + // non-isolated group correction + int nonIsolatedGroup; +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorNoAlphaBlend[] = { + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorNoAlphaBlendCMYK +#endif +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = { + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendRGB, + splashPipeResultColorAlphaNoBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaNoBlendCMYK +#endif +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = { + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendRGB, + splashPipeResultColorAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaBlendCMYK +#endif +}; + +//------------------------------------------------------------------------ + +static void blendXor(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = src[i] ^ dest[i]; + } +} + +//------------------------------------------------------------------------ +// modified region +//------------------------------------------------------------------------ + +void Splash::clearModRegion() { + modXMin = bitmap->getWidth(); + modYMin = bitmap->getHeight(); + modXMax = -1; + modYMax = -1; +} + +inline void Splash::updateModX(int x) { + if (x < modXMin) { + modXMin = x; + } + if (x > modXMax) { + modXMax = x; + } +} + +inline void Splash::updateModY(int y) { + if (y < modYMin) { + modYMin = y; + } + if (y > modYMax) { + modYMax = y; + } +} + +//------------------------------------------------------------------------ +// pipeline +//------------------------------------------------------------------------ + +inline void Splash::pipeInit(SplashPipe *pipe, int x, int y, + SplashPattern *pattern, SplashColorPtr cSrc, + SplashCoord aInput, GBool usesShape, + GBool nonIsolatedGroup) { + pipeSetXY(pipe, x, y); + pipe->pattern = NULL; + + // source color + if (pattern) { + if (pattern->isStatic()) { + pattern->getColor(x, y, pipe->cSrcVal); + } else { + pipe->pattern = pattern; + } + pipe->cSrc = pipe->cSrcVal; + } else { + pipe->cSrc = cSrc; + } + + // source alpha + pipe->aInput = aInput; + if (!state->softMask) { + if (usesShape) { + pipe->aInput *= 255; + } else { + pipe->aSrc = (Guchar)splashRound(pipe->aInput * 255); + } + } + pipe->usesShape = usesShape; + + // result alpha + if (aInput == 1 && !state->softMask && !usesShape && + !state->inNonIsolatedGroup) { + pipe->noTransparency = gTrue; + } else { + pipe->noTransparency = gFalse; + } + + // result color + if (pipe->noTransparency) { + // the !state->blendFunc case is handled separately in pipeRun + pipe->resultColorCtrl = pipeResultColorNoAlphaBlend[bitmap->mode]; + } else if (!state->blendFunc) { + pipe->resultColorCtrl = pipeResultColorAlphaNoBlend[bitmap->mode]; + } else { + pipe->resultColorCtrl = pipeResultColorAlphaBlend[bitmap->mode]; + } + + // non-isolated group correction + if (nonIsolatedGroup) { + pipe->nonIsolatedGroup = splashColorModeNComps[bitmap->mode]; + } else { + pipe->nonIsolatedGroup = 0; + } +} + +inline void Splash::pipeRun(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, alpha0, aResult; + SplashColor cDest, cBlend; + Guchar cResult0, cResult1, cResult2, cResult3; + + //----- source color + + // static pattern: handled in pipeInit + // fixed color: handled in pipeInit + + // dynamic pattern + if (pipe->pattern) { + pipe->pattern->getColor(pipe->x, pipe->y, pipe->cSrcVal); + } + + if (pipe->noTransparency && !state->blendFunc) { + + //----- write destination pixel + + switch (bitmap->mode) { + case splashModeMono1: + cResult0 = pipe->cSrc[0]; + if (state->screen->test(pipe->x, pipe->y, cResult0)) { + *pipe->destColorPtr |= pipe->destColorMask; + } else { + *pipe->destColorPtr &= ~pipe->destColorMask; + } + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + break; + case splashModeMono8: + *pipe->destColorPtr++ = pipe->cSrc[0]; + break; + case splashModeRGB8: + *pipe->destColorPtr++ = pipe->cSrc[0]; + *pipe->destColorPtr++ = pipe->cSrc[1]; + *pipe->destColorPtr++ = pipe->cSrc[2]; + break; + case splashModeBGR8: + *pipe->destColorPtr++ = pipe->cSrc[2]; + *pipe->destColorPtr++ = pipe->cSrc[1]; + *pipe->destColorPtr++ = pipe->cSrc[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + *pipe->destColorPtr++ = pipe->cSrc[0]; + *pipe->destColorPtr++ = pipe->cSrc[1]; + *pipe->destColorPtr++ = pipe->cSrc[2]; + *pipe->destColorPtr++ = pipe->cSrc[3]; + break; +#endif + } + if (pipe->destAlphaPtr) { + *pipe->destAlphaPtr++ = 255; + } + + } else { + + //----- read destination pixel + + switch (bitmap->mode) { + case splashModeMono1: + cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00; + break; + case splashModeMono8: + cDest[0] = *pipe->destColorPtr; + break; + case splashModeRGB8: + cDest[0] = pipe->destColorPtr[0]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[2]; + break; + case splashModeBGR8: + cDest[0] = pipe->destColorPtr[2]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + cDest[0] = pipe->destColorPtr[0]; + cDest[1] = pipe->destColorPtr[1]; + cDest[2] = pipe->destColorPtr[2]; + cDest[3] = pipe->destColorPtr[3]; + break; +#endif + } + if (pipe->destAlphaPtr) { + aDest = *pipe->destAlphaPtr; + } else { + aDest = 0xff; + } + + //----- blend function + + if (state->blendFunc) { + (*state->blendFunc)(pipe->cSrc, cDest, cBlend, bitmap->mode); + } + + //----- source alpha + + if (state->softMask) { + if (pipe->usesShape) { + aSrc = (Guchar)splashRound(pipe->aInput * *pipe->softMaskPtr++ + * pipe->shape); + } else { + aSrc = (Guchar)splashRound(pipe->aInput * *pipe->softMaskPtr++); + } + } else if (pipe->usesShape) { + // pipe->aInput is premultiplied by 255 in pipeInit + aSrc = (Guchar)splashRound(pipe->aInput * pipe->shape); + } else { + // precomputed in pipeInit + aSrc = pipe->aSrc; + } + + //----- result alpha and non-isolated group element correction + + if (pipe->noTransparency) { + alpha2 = aResult = 255; + } else { + aResult = aSrc + aDest - div255(aSrc * aDest); + + if (pipe->alpha0Ptr) { + alpha0 = *pipe->alpha0Ptr++; + alpha2 = aResult + alpha0 - div255(aResult * alpha0); + } else { + alpha2 = aResult; + } + } + + //----- result color + + cResult0 = cResult1 = cResult2 = cResult3 = 0; // make gcc happy + + switch (pipe->resultColorCtrl) { + +#if SPLASH_CMYK + case splashPipeResultColorNoAlphaBlendCMYK: + cResult3 = div255((255 - aDest) * pipe->cSrc[3] + aDest * cBlend[3]); +#endif + case splashPipeResultColorNoAlphaBlendRGB: + cResult2 = div255((255 - aDest) * pipe->cSrc[2] + aDest * cBlend[2]); + cResult1 = div255((255 - aDest) * pipe->cSrc[1] + aDest * cBlend[1]); + case splashPipeResultColorNoAlphaBlendMono: + cResult0 = div255((255 - aDest) * pipe->cSrc[0] + aDest * cBlend[0]); + break; + + case splashPipeResultColorAlphaNoBlendMono: + if (alpha2 == 0) { + cResult0 = 0; + } else { + cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2); + } + break; + case splashPipeResultColorAlphaNoBlendRGB: + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2); + cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * pipe->cSrc[1]) / alpha2); + cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * pipe->cSrc[2]) / alpha2); + } + break; +#if SPLASH_CMYK + case splashPipeResultColorAlphaNoBlendCMYK: + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + cResult3 = 0; + } else { + cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * pipe->cSrc[0]) / alpha2); + cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * pipe->cSrc[1]) / alpha2); + cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * pipe->cSrc[2]) / alpha2); + cResult3 = (Guchar)(((alpha2 - aSrc) * cDest[3] + + aSrc * pipe->cSrc[3]) / alpha2); + } + break; +#endif + + case splashPipeResultColorAlphaBlendMono: + if (alpha2 == 0) { + cResult0 = 0; + } else { + cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * ((255 - aDest) * pipe->cSrc[0] + + aDest * cBlend[0]) / 255) / + alpha2); + } + break; + case splashPipeResultColorAlphaBlendRGB: + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + } else { + cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * ((255 - aDest) * pipe->cSrc[0] + + aDest * cBlend[0]) / 255) / + alpha2); + cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * ((255 - aDest) * pipe->cSrc[1] + + aDest * cBlend[1]) / 255) / + alpha2); + cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * ((255 - aDest) * pipe->cSrc[2] + + aDest * cBlend[2]) / 255) / + alpha2); + } + break; +#if SPLASH_CMYK + case splashPipeResultColorAlphaBlendCMYK: + if (alpha2 == 0) { + cResult0 = 0; + cResult1 = 0; + cResult2 = 0; + cResult3 = 0; + } else { + cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + + aSrc * ((255 - aDest) * pipe->cSrc[0] + + aDest * cBlend[0]) / 255) / + alpha2); + cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + + aSrc * ((255 - aDest) * pipe->cSrc[1] + + aDest * cBlend[1]) / 255) / + alpha2); + cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + + aSrc * ((255 - aDest) * pipe->cSrc[2] + + aDest * cBlend[2]) / 255) / + alpha2); + cResult3 = (Guchar)(((alpha2 - aSrc) * cDest[3] + + aSrc * ((255 - aDest) * pipe->cSrc[3] + + aDest * cBlend[3]) / 255) / + alpha2); + } + break; +#endif + } + + //----- non-isolated group correction + + if (aResult != 0) { + switch (pipe->nonIsolatedGroup) { +#if SPLASH_CMYK + case 4: + cResult3 += (cResult3 - cDest[3]) * aDest * + (255 - aResult) / (255 * aResult); +#endif + case 3: + cResult2 += (cResult2 - cDest[2]) * aDest * + (255 - aResult) / (255 * aResult); + cResult1 += (cResult1 - cDest[1]) * aDest * + (255 - aResult) / (255 * aResult); + case 1: + cResult0 += (cResult0 - cDest[0]) * aDest * + (255 - aResult) / (255 * aResult); + case 0: + break; + } + } + + //----- write destination pixel + + switch (bitmap->mode) { + case splashModeMono1: + if (state->screen->test(pipe->x, pipe->y, cResult0)) { + *pipe->destColorPtr |= pipe->destColorMask; + } else { + *pipe->destColorPtr &= ~pipe->destColorMask; + } + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + break; + case splashModeMono8: + *pipe->destColorPtr++ = cResult0; + break; + case splashModeRGB8: + *pipe->destColorPtr++ = cResult0; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult2; + break; + case splashModeBGR8: + *pipe->destColorPtr++ = cResult2; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult0; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + *pipe->destColorPtr++ = cResult0; + *pipe->destColorPtr++ = cResult1; + *pipe->destColorPtr++ = cResult2; + *pipe->destColorPtr++ = cResult3; + break; +#endif + } + if (pipe->destAlphaPtr) { + *pipe->destAlphaPtr++ = aResult; + } + + } + + ++pipe->x; +} + +inline void Splash::pipeSetXY(SplashPipe *pipe, int x, int y) { + pipe->x = x; + pipe->y = y; + if (state->softMask) { + pipe->softMaskPtr = + &state->softMask->data[y * state->softMask->rowSize + x]; + } + switch (bitmap->mode) { + case splashModeMono1: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (x >> 3)]; + pipe->destColorMask = 0x80 >> (x & 7); + break; + case splashModeMono8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + x]; + break; + case splashModeRGB8: + case splashModeBGR8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 3 * x]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x]; + break; +#endif + } + if (bitmap->alpha) { + pipe->destAlphaPtr = &bitmap->alpha[y * bitmap->width + x]; + } else { + pipe->destAlphaPtr = NULL; + } + if (state->inNonIsolatedGroup && alpha0Bitmap->alpha) { + pipe->alpha0Ptr = + &alpha0Bitmap->alpha[(alpha0Y + y) * alpha0Bitmap->width + + (alpha0X + x)]; + } else { + pipe->alpha0Ptr = NULL; + } +} + +inline void Splash::pipeIncX(SplashPipe *pipe) { + ++pipe->x; + if (state->softMask) { + ++pipe->softMaskPtr; + } + switch (bitmap->mode) { + case splashModeMono1: + if (!(pipe->destColorMask >>= 1)) { + pipe->destColorMask = 0x80; + ++pipe->destColorPtr; + } + break; + case splashModeMono8: + ++pipe->destColorPtr; + break; + case splashModeRGB8: + case splashModeBGR8: + pipe->destColorPtr += 3; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + pipe->destColorPtr += 4; + break; +#endif + } + if (pipe->destAlphaPtr) { + ++pipe->destAlphaPtr; + } + if (pipe->alpha0Ptr) { + ++pipe->alpha0Ptr; + } +} + +inline void Splash::drawPixel(SplashPipe *pipe, int x, int y, GBool noClip) { + if (noClip || state->clip->test(x, y)) { + pipeSetXY(pipe, x, y); + pipeRun(pipe); + updateModX(x); + updateModY(y); + } +} + +inline void Splash::drawAAPixelInit() { + aaBufY = -1; +} + +inline void Splash::drawAAPixel(SplashPipe *pipe, int x, int y) { +#if splashAASize == 4 + static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, + 1, 2, 2, 3, 2, 3, 3, 4 }; + int w; +#else + int xx, yy; +#endif + SplashColorPtr p; + int x0, x1, t; + + if (x < 0 || x >= bitmap->width || + y < state->clip->getYMinI() || y > state->clip->getYMaxI()) { + return; + } + + // update aaBuf + if (y != aaBufY) { + memset(aaBuf->getDataPtr(), 0xff, + aaBuf->getRowSize() * aaBuf->getHeight()); + x0 = 0; + x1 = bitmap->width - 1; + state->clip->clipAALine(aaBuf, &x0, &x1, y); + aaBufY = y; + } + + // compute the shape value +#if splashAASize == 4 + p = aaBuf->getDataPtr() + (x >> 1); + w = aaBuf->getRowSize(); + if (x & 1) { + t = bitCount4[*p & 0x0f] + bitCount4[p[w] & 0x0f] + + bitCount4[p[2*w] & 0x0f] + bitCount4[p[3*w] & 0x0f]; + } else { + t = bitCount4[*p >> 4] + bitCount4[p[w] >> 4] + + bitCount4[p[2*w] >> 4] + bitCount4[p[3*w] >> 4]; + } +#else + t = 0; + for (yy = 0; yy < splashAASize; ++yy) { + for (xx = 0; xx < splashAASize; ++xx) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + + ((x * splashAASize + xx) >> 3); + t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1; + } + } +#endif + + // draw the pixel + if (t != 0) { + pipeSetXY(pipe, x, y); + pipe->shape *= aaGamma[t]; + pipeRun(pipe); + updateModX(x); + updateModY(y); + } +} + +inline void Splash::drawSpan(SplashPipe *pipe, int x0, int x1, int y, + GBool noClip) { + int x; + + pipeSetXY(pipe, x0, y); + if (noClip) { + for (x = x0; x <= x1; ++x) { + pipeRun(pipe); + } + updateModX(x0); + updateModX(x1); + updateModY(y); + } else { + for (x = x0; x <= x1; ++x) { + if (state->clip->test(x, y)) { + pipeRun(pipe); + updateModX(x); + updateModY(y); + } else { + pipeIncX(pipe); + } + } + } +} + +inline void Splash::drawAALine(SplashPipe *pipe, int x0, int x1, int y) { +#if splashAASize == 4 + static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, + 1, 2, 2, 3, 2, 3, 3, 4 }; + SplashColorPtr p0, p1, p2, p3; + int t; +#else + SplashColorPtr p; + int xx, yy, t; +#endif + int x; + +#if splashAASize == 4 + p0 = aaBuf->getDataPtr() + (x0 >> 1); + p1 = p0 + aaBuf->getRowSize(); + p2 = p1 + aaBuf->getRowSize(); + p3 = p2 + aaBuf->getRowSize(); +#endif + pipeSetXY(pipe, x0, y); + for (x = x0; x <= x1; ++x) { + + // compute the shape value +#if splashAASize == 4 + if (x & 1) { + t = bitCount4[*p0 & 0x0f] + bitCount4[*p1 & 0x0f] + + bitCount4[*p2 & 0x0f] + bitCount4[*p3 & 0x0f]; + ++p0; ++p1; ++p2; ++p3; + } else { + t = bitCount4[*p0 >> 4] + bitCount4[*p1 >> 4] + + bitCount4[*p2 >> 4] + bitCount4[*p3 >> 4]; + } +#else + t = 0; + for (yy = 0; yy < splashAASize; ++yy) { + for (xx = 0; xx < splashAASize; ++xx) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + + ((x * splashAASize + xx) >> 3); + t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1; + } + } +#endif + + if (t != 0) { + pipe->shape = aaGamma[t]; + pipeRun(pipe); + updateModX(x); + updateModY(y); + } else { + pipeIncX(pipe); + } + } +} + +//------------------------------------------------------------------------ + +// Transform a point from user space to device space. +inline void Splash::transform(SplashCoord *matrix, + SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo) { + // [ m[0] m[1] 0 ] + // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ] + // [ m[4] m[5] 1 ] + *xo = xi * matrix[0] + yi * matrix[2] + matrix[4]; + *yo = xi * matrix[1] + yi * matrix[3] + matrix[5]; +} + +//------------------------------------------------------------------------ +// Splash +//------------------------------------------------------------------------ + +Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreenParams *screenParams) { + int i; + + bitmap = bitmapA; + vectorAntialias = vectorAntialiasA; + state = new SplashState(bitmap->width, bitmap->height, vectorAntialias, + screenParams); + if (vectorAntialias) { + aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize, + 1, splashModeMono1, gFalse); + for (i = 0; i <= splashAASize * splashAASize; ++i) { + aaGamma[i] = splashPow((SplashCoord)i / + (SplashCoord)(splashAASize * splashAASize), + 1.5); + } + } else { + aaBuf = NULL; + } + clearModRegion(); + debugMode = gFalse; +} + +Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreen *screenA) { + int i; + + bitmap = bitmapA; + vectorAntialias = vectorAntialiasA; + state = new SplashState(bitmap->width, bitmap->height, vectorAntialias, + screenA); + if (vectorAntialias) { + aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize, + 1, splashModeMono1, gFalse); + for (i = 0; i <= splashAASize * splashAASize; ++i) { + aaGamma[i] = splashPow((SplashCoord)i / + (SplashCoord)(splashAASize * splashAASize), + 1.5); + } + } else { + aaBuf = NULL; + } + clearModRegion(); + debugMode = gFalse; +} + +Splash::~Splash() { + while (state->next) { + restoreState(); + } + delete state; + if (vectorAntialias) { + delete aaBuf; + } +} + +//------------------------------------------------------------------------ +// state read +//------------------------------------------------------------------------ + +SplashCoord *Splash::getMatrix() { + return state->matrix; +} + +SplashPattern *Splash::getStrokePattern() { + return state->strokePattern; +} + +SplashPattern *Splash::getFillPattern() { + return state->fillPattern; +} + +SplashScreen *Splash::getScreen() { + return state->screen; +} + +SplashBlendFunc Splash::getBlendFunc() { + return state->blendFunc; +} + +SplashCoord Splash::getStrokeAlpha() { + return state->strokeAlpha; +} + +SplashCoord Splash::getFillAlpha() { + return state->fillAlpha; +} + +SplashCoord Splash::getLineWidth() { + return state->lineWidth; +} + +int Splash::getLineCap() { + return state->lineCap; +} + +int Splash::getLineJoin() { + return state->lineJoin; +} + +SplashCoord Splash::getMiterLimit() { + return state->miterLimit; +} + +SplashCoord Splash::getFlatness() { + return state->flatness; +} + +SplashCoord *Splash::getLineDash() { + return state->lineDash; +} + +int Splash::getLineDashLength() { + return state->lineDashLength; +} + +SplashCoord Splash::getLineDashPhase() { + return state->lineDashPhase; +} + +SplashClip *Splash::getClip() { + return state->clip; +} + +SplashBitmap *Splash::getSoftMask() { + return state->softMask; +} + +GBool Splash::getInNonIsolatedGroup() { + return state->inNonIsolatedGroup; +} + +//------------------------------------------------------------------------ +// state write +//------------------------------------------------------------------------ + +void Splash::setMatrix(SplashCoord *matrix) { + memcpy(state->matrix, matrix, 6 * sizeof(SplashCoord)); +} + +void Splash::setStrokePattern(SplashPattern *strokePattern) { + state->setStrokePattern(strokePattern); +} + +void Splash::setFillPattern(SplashPattern *fillPattern) { + state->setFillPattern(fillPattern); +} + +void Splash::setScreen(SplashScreen *screen) { + state->setScreen(screen); +} + +void Splash::setBlendFunc(SplashBlendFunc func) { + state->blendFunc = func; +} + +void Splash::setStrokeAlpha(SplashCoord alpha) { + state->strokeAlpha = alpha; +} + +void Splash::setFillAlpha(SplashCoord alpha) { + state->fillAlpha = alpha; +} + +void Splash::setLineWidth(SplashCoord lineWidth) { + state->lineWidth = lineWidth; +} + +void Splash::setLineCap(int lineCap) { + state->lineCap = lineCap; +} + +void Splash::setLineJoin(int lineJoin) { + state->lineJoin = lineJoin; +} + +void Splash::setMiterLimit(SplashCoord miterLimit) { + state->miterLimit = miterLimit; +} + +void Splash::setFlatness(SplashCoord flatness) { + if (flatness < 1) { + state->flatness = 1; + } else { + state->flatness = flatness; + } +} + +void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength, + SplashCoord lineDashPhase) { + state->setLineDash(lineDash, lineDashLength, lineDashPhase); +} + +void Splash::setStrokeAdjust(GBool strokeAdjust) { + state->strokeAdjust = strokeAdjust; +} + +void Splash::clipResetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + state->clip->resetToRect(x0, y0, x1, y1); +} + +SplashError Splash::clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + return state->clip->clipToRect(x0, y0, x1, y1); +} + +SplashError Splash::clipToPath(SplashPath *path, GBool eo) { + return state->clip->clipToPath(path, state->matrix, state->flatness, eo); +} + +void Splash::setSoftMask(SplashBitmap *softMask) { + state->setSoftMask(softMask); +} + +void Splash::setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, + int alpha0XA, int alpha0YA) { + alpha0Bitmap = alpha0BitmapA; + alpha0X = alpha0XA; + alpha0Y = alpha0YA; + state->inNonIsolatedGroup = gTrue; +} + +//------------------------------------------------------------------------ +// state save/restore +//------------------------------------------------------------------------ + +void Splash::saveState() { + SplashState *newState; + + newState = state->copy(); + newState->next = state; + state = newState; +} + +SplashError Splash::restoreState() { + SplashState *oldState; + + if (!state->next) { + return splashErrNoSave; + } + oldState = state; + state = state->next; + delete oldState; + return splashOk; +} + +//------------------------------------------------------------------------ +// drawing operations +//------------------------------------------------------------------------ + +void Splash::clear(SplashColorPtr color, Guchar alpha) { + SplashColorPtr row, p; + Guchar mono; + int x, y; + + switch (bitmap->mode) { + case splashModeMono1: + mono = (color[0] & 0x80) ? 0xff : 0x00; + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + mono, -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, mono, bitmap->rowSize * bitmap->height); + } + break; + case splashModeMono8: + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + break; + case splashModeRGB8: + if (color[0] == color[1] && color[1] == color[2]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[2]; + *p++ = color[1]; + *p++ = color[0]; + } + row += bitmap->rowSize; + } + } + break; + case splashModeBGR8: + if (color[0] == color[1] && color[1] == color[2]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[0]; + *p++ = color[1]; + *p++ = color[2]; + } + row += bitmap->rowSize; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + if (color[0] == color[1] && color[1] == color[2] && color[2] == color[3]) { + if (bitmap->rowSize < 0) { + memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), + color[0], -bitmap->rowSize * bitmap->height); + } else { + memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); + } + } else { + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + *p++ = color[0]; + *p++ = color[1]; + *p++ = color[2]; + *p++ = color[3]; + } + row += bitmap->rowSize; + } + } + break; +#endif + } + + if (bitmap->alpha) { + memset(bitmap->alpha, alpha, bitmap->width * bitmap->height); + } + + updateModX(0); + updateModY(0); + updateModX(bitmap->width - 1); + updateModY(bitmap->height - 1); +} + +SplashError Splash::stroke(SplashPath *path) { + SplashPath *path2, *dPath; + + if (debugMode) { + printf("stroke [dash:%d] [width:%.2f]:\n", + state->lineDashLength, (double)state->lineWidth); + dumpPath(path); + } + opClipRes = splashClipAllOutside; + if (path->length == 0) { + return splashErrEmptyPath; + } + path2 = flattenPath(path, state->matrix, state->flatness); + if (state->lineDashLength > 0) { + dPath = makeDashedPath(path2); + delete path2; + path2 = dPath; + } + if (state->lineWidth == 0) { + strokeNarrow(path2); + } else { + strokeWide(path2); + } + delete path2; + return splashOk; +} + +void Splash::strokeNarrow(SplashPath *path) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathSeg *seg; + int x0, x1, x2, x3, y0, y1, x, y, t; + SplashCoord dx, dy, dxdy; + SplashClipResult clipRes; + int nClipRes[3]; + int i; + + nClipRes[0] = nClipRes[1] = nClipRes[2] = 0; + + xPath = new SplashXPath(path, state->matrix, state->flatness, gFalse); + + pipeInit(&pipe, 0, 0, state->strokePattern, NULL, state->strokeAlpha, + gFalse, gFalse); + + for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) { + + x0 = splashFloor(seg->x0); + x1 = splashFloor(seg->x1); + y0 = splashFloor(seg->y0); + y1 = splashFloor(seg->y1); + + // horizontal segment + if (y0 == y1) { + if (x0 > x1) { + t = x0; x0 = x1; x1 = t; + } + if ((clipRes = state->clip->testSpan(x0, x1, y0)) + != splashClipAllOutside) { + drawSpan(&pipe, x0, x1, y0, clipRes == splashClipAllInside); + } + + // segment with |dx| > |dy| + } else if (splashAbs(seg->dxdy) > 1) { + dx = seg->x1 - seg->x0; + dy = seg->y1 - seg->y0; + dxdy = seg->dxdy; + if (y0 > y1) { + t = y0; y0 = y1; y1 = t; + t = x0; x0 = x1; x1 = t; + dx = -dx; + dy = -dy; + } + if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0, + x0 <= x1 ? x1 : x0, y1)) + != splashClipAllOutside) { + if (dx > 0) { + x2 = x0; + x3 = splashFloor(seg->x0 + ((SplashCoord)y0 + 1 - seg->y0) * dxdy); + drawSpan(&pipe, x2, (x2 <= x3 - 1) ? x3 - 1 : x2, y0, + clipRes == splashClipAllInside); + x2 = x3; + for (y = y0 + 1; y <= y1 - 1; ++y) { + x3 = splashFloor(seg->x0 + ((SplashCoord)y + 1 - seg->y0) * dxdy); + drawSpan(&pipe, x2, x3 - 1, y, clipRes == splashClipAllInside); + x2 = x3; + } + drawSpan(&pipe, x2, x2 <= x1 ? x1 : x2, y1, + clipRes == splashClipAllInside); + } else { + x2 = x0; + x3 = splashFloor(seg->x0 + ((SplashCoord)y0 + 1 - seg->y0) * dxdy); + drawSpan(&pipe, (x3 + 1 <= x2) ? x3 + 1 : x2, x2, y0, + clipRes == splashClipAllInside); + x2 = x3; + for (y = y0 + 1; y <= y1 - 1; ++y) { + x3 = splashFloor(seg->x0 + ((SplashCoord)y + 1 - seg->y0) * dxdy); + drawSpan(&pipe, x3 + 1, x2, y, clipRes == splashClipAllInside); + x2 = x3; + } + drawSpan(&pipe, x1, (x1 <= x2) ? x2 : x1, y1, + clipRes == splashClipAllInside); + } + } + + // segment with |dy| > |dx| + } else { + dxdy = seg->dxdy; + if (y0 > y1) { + t = x0; x0 = x1; x1 = t; + t = y0; y0 = y1; y1 = t; + } + if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0, + x0 <= x1 ? x1 : x0, y1)) + != splashClipAllOutside) { + drawPixel(&pipe, x0, y0, clipRes == splashClipAllInside); + for (y = y0 + 1; y <= y1 - 1; ++y) { + x = splashFloor(seg->x0 + ((SplashCoord)y - seg->y0) * dxdy); + drawPixel(&pipe, x, y, clipRes == splashClipAllInside); + } + drawPixel(&pipe, x1, y1, clipRes == splashClipAllInside); + } + } + ++nClipRes[clipRes]; + } + if (nClipRes[splashClipPartial] || + (nClipRes[splashClipAllInside] && nClipRes[splashClipAllOutside])) { + opClipRes = splashClipPartial; + } else if (nClipRes[splashClipAllInside]) { + opClipRes = splashClipAllInside; + } else { + opClipRes = splashClipAllOutside; + } + + delete xPath; +} + +void Splash::strokeWide(SplashPath *path) { + SplashPath *path2; + + path2 = makeStrokePath(path, gFalse); + fillWithPattern(path2, gFalse, state->strokePattern, state->strokeAlpha); + delete path2; +} + +SplashPath *Splash::flattenPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness) { + SplashPath *fPath; + SplashCoord flatness2; + Guchar flag; + int i; + + fPath = new SplashPath(); + flatness2 = flatness * flatness; + i = 0; + while (i < path->length) { + flag = path->flags[i]; + if (flag & splashPathFirst) { + fPath->moveTo(path->pts[i].x, path->pts[i].y); + ++i; + } else { + if (flag & splashPathCurve) { + flattenCurve(path->pts[i-1].x, path->pts[i-1].y, + path->pts[i ].x, path->pts[i ].y, + path->pts[i+1].x, path->pts[i+1].y, + path->pts[i+2].x, path->pts[i+2].y, + matrix, flatness2, fPath); + i += 3; + } else { + fPath->lineTo(path->pts[i].x, path->pts[i].y); + ++i; + } + if (path->flags[i-1] & splashPathClosed) { + fPath->close(); + } + } + } + return fPath; +} + +void Splash::flattenCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord *matrix, SplashCoord flatness2, + SplashPath *fPath) { + SplashCoord cx[splashMaxCurveSplits + 1][3]; + SplashCoord cy[splashMaxCurveSplits + 1][3]; + int cNext[splashMaxCurveSplits + 1]; + SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh; + SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh; + SplashCoord dx, dy, mx, my, tx, ty, d1, d2; + int p1, p2, p3; + + // initial segment + p1 = 0; + p2 = splashMaxCurveSplits; + cx[p1][0] = x0; cy[p1][0] = y0; + cx[p1][1] = x1; cy[p1][1] = y1; + cx[p1][2] = x2; cy[p1][2] = y2; + cx[p2][0] = x3; cy[p2][0] = y3; + cNext[p1] = p2; + + while (p1 < splashMaxCurveSplits) { + + // get the next segment + xl0 = cx[p1][0]; yl0 = cy[p1][0]; + xx1 = cx[p1][1]; yy1 = cy[p1][1]; + xx2 = cx[p1][2]; yy2 = cy[p1][2]; + p2 = cNext[p1]; + xr3 = cx[p2][0]; yr3 = cy[p2][0]; + + // compute the distances (in device space) from the control points + // to the midpoint of the straight line (this is a bit of a hack, + // but it's much faster than computing the actual distances to the + // line) + transform(matrix, (xl0 + xr3) * 0.5, (yl0 + yr3) * 0.5, &mx, &my); + transform(matrix, xx1, yy1, &tx, &ty); + dx = tx - mx; + dy = ty - my; + d1 = dx*dx + dy*dy; + transform(matrix, xx2, yy2, &tx, &ty); + dx = tx - mx; + dy = ty - my; + d2 = dx*dx + dy*dy; + + // if the curve is flat enough, or no more subdivisions are + // allowed, add the straight line segment + if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) { + fPath->lineTo(xr3, yr3); + p1 = p2; + + // otherwise, subdivide the curve + } else { + xl1 = (xl0 + xx1) * 0.5; + yl1 = (yl0 + yy1) * 0.5; + xh = (xx1 + xx2) * 0.5; + yh = (yy1 + yy2) * 0.5; + xl2 = (xl1 + xh) * 0.5; + yl2 = (yl1 + yh) * 0.5; + xr2 = (xx2 + xr3) * 0.5; + yr2 = (yy2 + yr3) * 0.5; + xr1 = (xh + xr2) * 0.5; + yr1 = (yh + yr2) * 0.5; + xr0 = (xl2 + xr1) * 0.5; + yr0 = (yl2 + yr1) * 0.5; + // add the new subdivision points + p3 = (p1 + p2) / 2; + cx[p1][1] = xl1; cy[p1][1] = yl1; + cx[p1][2] = xl2; cy[p1][2] = yl2; + cNext[p1] = p3; + cx[p3][0] = xr0; cy[p3][0] = yr0; + cx[p3][1] = xr1; cy[p3][1] = yr1; + cx[p3][2] = xr2; cy[p3][2] = yr2; + cNext[p3] = p2; + } + } +} + +SplashPath *Splash::makeDashedPath(SplashPath *path) { + SplashPath *dPath; + SplashCoord lineDashTotal; + SplashCoord lineDashStartPhase, lineDashDist, segLen; + SplashCoord x0, y0, x1, y1, xa, ya; + GBool lineDashStartOn, lineDashOn, newPath; + int lineDashStartIdx, lineDashIdx; + int i, j, k; + + lineDashTotal = 0; + for (i = 0; i < state->lineDashLength; ++i) { + lineDashTotal += state->lineDash[i]; + } + lineDashStartPhase = state->lineDashPhase; + i = splashFloor(lineDashStartPhase / lineDashTotal); + lineDashStartPhase -= (SplashCoord)i * lineDashTotal; + lineDashStartOn = gTrue; + lineDashStartIdx = 0; + while (lineDashStartPhase >= state->lineDash[lineDashStartIdx]) { + lineDashStartOn = !lineDashStartOn; + lineDashStartPhase -= state->lineDash[lineDashStartIdx]; + ++lineDashStartIdx; + } + + dPath = new SplashPath(); + + // process each subpath + i = 0; + while (i < path->length) { + + // find the end of the subpath + for (j = i; + j < path->length - 1 && !(path->flags[j] & splashPathLast); + ++j) ; + + // initialize the dash parameters + lineDashOn = lineDashStartOn; + lineDashIdx = lineDashStartIdx; + lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase; + + // process each segment of the subpath + newPath = gTrue; + for (k = i; k < j; ++k) { + + // grab the segment + x0 = path->pts[k].x; + y0 = path->pts[k].y; + x1 = path->pts[k+1].x; + y1 = path->pts[k+1].y; + segLen = splashDist(x0, y0, x1, y1); + + // process the segment + while (segLen > 0) { + + if (lineDashDist >= segLen) { + if (lineDashOn) { + if (newPath) { + dPath->moveTo(x0, y0); + newPath = gFalse; + } + dPath->lineTo(x1, y1); + } + lineDashDist -= segLen; + segLen = 0; + + } else { + xa = x0 + (lineDashDist / segLen) * (x1 - x0); + ya = y0 + (lineDashDist / segLen) * (y1 - y0); + if (lineDashOn) { + if (newPath) { + dPath->moveTo(x0, y0); + newPath = gFalse; + } + dPath->lineTo(xa, ya); + } + x0 = xa; + y0 = ya; + segLen -= lineDashDist; + lineDashDist = 0; + } + + // get the next entry in the dash array + if (lineDashDist <= 0) { + lineDashOn = !lineDashOn; + if (++lineDashIdx == state->lineDashLength) { + lineDashIdx = 0; + } + lineDashDist = state->lineDash[lineDashIdx]; + newPath = gTrue; + } + } + } + i = j + 1; + } + + return dPath; +} + +SplashError Splash::fill(SplashPath *path, GBool eo) { + if (debugMode) { + printf("fill [eo:%d]:\n", eo); + dumpPath(path); + } + return fillWithPattern(path, eo, state->fillPattern, state->fillAlpha); +} + +SplashError Splash::fillWithPattern(SplashPath *path, GBool eo, + SplashPattern *pattern, + SplashCoord alpha) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathScanner *scanner; + int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; + SplashClipResult clipRes, clipRes2; + + if (path->length == 0) { + return splashErrEmptyPath; + } + xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); + if (vectorAntialias) { + xPath->aaScale(); + } + xPath->sort(); + scanner = new SplashXPathScanner(xPath, eo); + + // get the min and max x and y values + if (vectorAntialias) { + scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI); + } else { + scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); + } + + // check clipping + if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) + != splashClipAllOutside) { + + // limit the y range + if (yMinI < state->clip->getYMinI()) { + yMinI = state->clip->getYMinI(); + } + if (yMaxI > state->clip->getYMaxI()) { + yMaxI = state->clip->getYMaxI(); + } + + pipeInit(&pipe, 0, yMinI, pattern, NULL, alpha, vectorAntialias, gFalse); + + // draw the spans + if (vectorAntialias) { + for (y = yMinI; y <= yMaxI; ++y) { + scanner->renderAALine(aaBuf, &x0, &x1, y); + if (clipRes != splashClipAllInside) { + state->clip->clipAALine(aaBuf, &x0, &x1, y); + } + drawAALine(&pipe, x0, x1, y); + } + } else { + for (y = yMinI; y <= yMaxI; ++y) { + while (scanner->getNextSpan(y, &x0, &x1)) { + if (clipRes == splashClipAllInside) { + drawSpan(&pipe, x0, x1, y, gTrue); + } else { + // limit the x range + if (x0 < state->clip->getXMinI()) { + x0 = state->clip->getXMinI(); + } + if (x1 > state->clip->getXMaxI()) { + x1 = state->clip->getXMaxI(); + } + clipRes2 = state->clip->testSpan(x0, x1, y); + drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); + } + } + } + } + } + opClipRes = clipRes; + + delete scanner; + delete xPath; + return splashOk; +} + +SplashError Splash::xorFill(SplashPath *path, GBool eo) { + SplashPipe pipe; + SplashXPath *xPath; + SplashXPathScanner *scanner; + int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; + SplashClipResult clipRes, clipRes2; + SplashBlendFunc origBlendFunc; + + if (path->length == 0) { + return splashErrEmptyPath; + } + xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); + xPath->sort(); + scanner = new SplashXPathScanner(xPath, eo); + + // get the min and max x and y values + scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); + + // check clipping + if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) + != splashClipAllOutside) { + + // limit the y range + if (yMinI < state->clip->getYMinI()) { + yMinI = state->clip->getYMinI(); + } + if (yMaxI > state->clip->getYMaxI()) { + yMaxI = state->clip->getYMaxI(); + } + + origBlendFunc = state->blendFunc; + state->blendFunc = &blendXor; + pipeInit(&pipe, 0, yMinI, state->fillPattern, NULL, 1, gFalse, gFalse); + + // draw the spans + for (y = yMinI; y <= yMaxI; ++y) { + while (scanner->getNextSpan(y, &x0, &x1)) { + if (clipRes == splashClipAllInside) { + drawSpan(&pipe, x0, x1, y, gTrue); + } else { + // limit the x range + if (x0 < state->clip->getXMinI()) { + x0 = state->clip->getXMinI(); + } + if (x1 > state->clip->getXMaxI()) { + x1 = state->clip->getXMaxI(); + } + clipRes2 = state->clip->testSpan(x0, x1, y); + drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); + } + } + } + state->blendFunc = origBlendFunc; + } + opClipRes = clipRes; + + delete scanner; + delete xPath; + return splashOk; +} + +SplashError Splash::fillChar(SplashCoord x, SplashCoord y, + int c, SplashFont *font) { + SplashGlyphBitmap glyph; + SplashCoord xt, yt; + int x0, y0, xFrac, yFrac; + SplashError err; + + if (debugMode) { + printf("fillChar: x=%.2f y=%.2f c=%3d=0x%02x='%c'\n", + (double)x, (double)y, c, c, c); + } + transform(state->matrix, x, y, &xt, &yt); + x0 = splashFloor(xt); + xFrac = splashFloor((xt - x0) * splashFontFraction); + y0 = splashFloor(yt); + yFrac = splashFloor((yt - y0) * splashFontFraction); + if (!font->getGlyph(c, xFrac, yFrac, &glyph)) { + return splashErrNoGlyph; + } + err = fillGlyph2(x0, y0, &glyph); + if (glyph.freeData) { + gfree(glyph.data); + } + return err; +} + +SplashError Splash::fillGlyph(SplashCoord x, SplashCoord y, + SplashGlyphBitmap *glyph) { + SplashCoord xt, yt; + int x0, y0; + + transform(state->matrix, x, y, &xt, &yt); + x0 = splashFloor(xt); + y0 = splashFloor(yt); + return fillGlyph2(x0, y0, glyph); +} + +SplashError Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph) { + SplashPipe pipe; + SplashClipResult clipRes; + GBool noClip; + int alpha0, alpha; + Guchar *p; + int x1, y1, xx, xx1, yy; + + if ((clipRes = state->clip->testRect(x0 - glyph->x, + y0 - glyph->y, + x0 - glyph->x + glyph->w - 1, + y0 - glyph->y + glyph->h - 1)) + != splashClipAllOutside) { + noClip = clipRes == splashClipAllInside; + + if (noClip) { + if (glyph->aa) { + pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, + state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse); + p = glyph->data; + for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { + pipeSetXY(&pipe, x0 - glyph->x, y1); + for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) { + alpha = *p++; + if (alpha != 0) { + pipe.shape = (SplashCoord)(alpha / 255.0); + pipeRun(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + } + } + } else { + pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, + state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse); + p = glyph->data; + for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { + pipeSetXY(&pipe, x0 - glyph->x, y1); + for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) { + alpha0 = *p++; + for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) { + if (alpha0 & 0x80) { + pipeRun(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + alpha0 <<= 1; + } + } + } + } + } else { + if (glyph->aa) { + pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, + state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse); + p = glyph->data; + for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { + pipeSetXY(&pipe, x0 - glyph->x, y1); + for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) { + if (state->clip->test(x1, y1)) { + alpha = *p++; + if (alpha != 0) { + pipe.shape = (SplashCoord)(alpha / 255.0); + pipeRun(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + } else { + pipeIncX(&pipe); + ++p; + } + } + } + } else { + pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, + state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse); + p = glyph->data; + for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { + pipeSetXY(&pipe, x0 - glyph->x, y1); + for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) { + alpha0 = *p++; + for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) { + if (state->clip->test(x1, y1)) { + if (alpha0 & 0x80) { + pipeRun(&pipe); + updateModX(x1); + updateModY(y1); + } else { + pipeIncX(&pipe); + } + } else { + pipeIncX(&pipe); + } + alpha0 <<= 1; + } + } + } + } + } + } + opClipRes = clipRes; + + return splashOk; +} + +SplashError Splash::fillImageMask(SplashImageMaskSource src, void *srcData, + int w, int h, SplashCoord *mat, + GBool glyphMode) { + SplashPipe pipe; + GBool rot; + SplashCoord xScale, yScale, xShear, yShear, yShear1; + int tx, tx2, ty, ty2, scaledWidth, scaledHeight, xSign, ySign; + int ulx, uly, llx, lly, urx, ury, lrx, lry; + int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1; + int xMin, xMax, yMin, yMax; + SplashClipResult clipRes, clipRes2; + int yp, yq, yt, yStep, lastYStep; + int xp, xq, xt, xStep, xSrc; + int k1, spanXMin, spanXMax, spanY; + SplashColorPtr pixBuf, p; + int pixAcc; + int x, y, x1, x2, y2; + SplashCoord y1; + int n, m, i, j; + + if (debugMode) { + printf("fillImageMask: w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n", + w, h, (double)mat[0], (double)mat[1], (double)mat[2], + (double)mat[3], (double)mat[4], (double)mat[5]); + } + + // check for singular matrix + if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) { + return splashErrSingularMatrix; + } + + // compute scale, shear, rotation, translation parameters + rot = splashAbs(mat[1]) > splashAbs(mat[0]); + if (rot) { + xScale = -mat[1]; + yScale = mat[2] - (mat[0] * mat[3]) / mat[1]; + xShear = -mat[3] / yScale; + yShear = -mat[0] / mat[1]; + } else { + xScale = mat[0]; + yScale = mat[3] - (mat[1] * mat[2]) / mat[0]; + xShear = mat[2] / yScale; + yShear = mat[1] / mat[0]; + } + // Note 1: The PDF spec says that all pixels whose *centers* lie + // within the region get painted -- but that doesn't seem to match + // up with what Acrobat actually does: it ends up leaving gaps + // between image stripes. So we use the same rule here as for + // fills: any pixel that overlaps the region gets painted. + // Note 2: The "glyphMode" flag is a kludge: it switches back to + // "correct" behavior (matching the spec), for use in rendering Type + // 3 fonts. + // Note 3: The +/-0.01 in these computations is to avoid floating + // point precision problems which can lead to gaps between image + // stripes (it can cause image stripes to overlap, but that's a much + // less visible problem). + if (glyphMode) { + if (xScale >= 0) { + tx = splashRound(mat[4]); + tx2 = splashRound(mat[4] + xScale) - 1; + } else { + tx = splashRound(mat[4]) - 1; + tx2 = splashRound(mat[4] + xScale); + } + } else { + if (xScale >= 0) { + tx = splashFloor(mat[4] - 0.01); + tx2 = splashFloor(mat[4] + xScale + 0.01); + } else { + tx = splashFloor(mat[4] + 0.01); + tx2 = splashFloor(mat[4] + xScale - 0.01); + } + } + scaledWidth = abs(tx2 - tx) + 1; + if (glyphMode) { + if (yScale >= 0) { + ty = splashRound(mat[5]); + ty2 = splashRound(mat[5] + yScale) - 1; + } else { + ty = splashRound(mat[5]) - 1; + ty2 = splashRound(mat[5] + yScale); + } + } else { + if (yScale >= 0) { + ty = splashFloor(mat[5] - 0.01); + ty2 = splashFloor(mat[5] + yScale + 0.01); + } else { + ty = splashFloor(mat[5] + 0.01); + ty2 = splashFloor(mat[5] + yScale - 0.01); + } + } + scaledHeight = abs(ty2 - ty) + 1; + xSign = (xScale < 0) ? -1 : 1; + ySign = (yScale < 0) ? -1 : 1; + yShear1 = (SplashCoord)xSign * yShear; + + // clipping + ulx1 = 0; + uly1 = 0; + urx1 = xSign * (scaledWidth - 1); + ury1 = (int)(yShear * urx1); + llx1 = splashRound(xShear * ySign * (scaledHeight - 1)); + lly1 = ySign * (scaledHeight - 1) + (int)(yShear * llx1); + lrx1 = xSign * (scaledWidth - 1) + + splashRound(xShear * ySign * (scaledHeight - 1)); + lry1 = ySign * (scaledHeight - 1) + (int)(yShear * lrx1); + if (rot) { + ulx = tx + uly1; uly = ty - ulx1; + urx = tx + ury1; ury = ty - urx1; + llx = tx + lly1; lly = ty - llx1; + lrx = tx + lry1; lry = ty - lrx1; + } else { + ulx = tx + ulx1; uly = ty + uly1; + urx = tx + urx1; ury = ty + ury1; + llx = tx + llx1; lly = ty + lly1; + lrx = tx + lrx1; lry = ty + lry1; + } + xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx + : (llx < lrx) ? llx : lrx + : (urx < llx) ? (urx < lrx) ? urx : lrx + : (llx < lrx) ? llx : lrx; + xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx + : (llx > lrx) ? llx : lrx + : (urx > llx) ? (urx > lrx) ? urx : lrx + : (llx > lrx) ? llx : lrx; + yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry + : (lly < lry) ? lly : lry + : (ury < lly) ? (ury < lry) ? ury : lry + : (lly < lry) ? lly : lry; + yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry + : (lly > lry) ? lly : lry + : (ury > lly) ? (ury > lry) ? ury : lry + : (lly > lry) ? lly : lry; + clipRes = state->clip->testRect(xMin, yMin, xMax, yMax); + opClipRes = clipRes; + + // compute Bresenham parameters for x and y scaling + yp = h / scaledHeight; + yq = h % scaledHeight; + xp = w / scaledWidth; + xq = w % scaledWidth; + + // allocate pixel buffer + pixBuf = (SplashColorPtr)gmalloc((yp + 1) * w); + + // initialize the pixel pipe + pipeInit(&pipe, 0, 0, state->fillPattern, NULL, state->fillAlpha, + gTrue, gFalse); + if (vectorAntialias) { + drawAAPixelInit(); + } + + // init y scale Bresenham + yt = 0; + lastYStep = 1; + + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + yStep = yp; + yt += yq; + if (yt >= scaledHeight) { + yt -= scaledHeight; + ++yStep; + } + + // read row(s) from image + n = (yp > 0) ? yStep : lastYStep; + if (n > 0) { + p = pixBuf; + for (i = 0; i < n; ++i) { + (*src)(srcData, p); + p += w; + } + } + lastYStep = yStep; + + // loop-invariant constants + k1 = splashRound(xShear * ySign * y); + + // clipping test + if (clipRes != splashClipAllInside && + !rot && + (int)(yShear * k1) == + (int)(yShear * (xSign * (scaledWidth - 1) + k1))) { + if (xSign > 0) { + spanXMin = tx + k1; + spanXMax = spanXMin + (scaledWidth - 1); + } else { + spanXMax = tx + k1; + spanXMin = spanXMax - (scaledWidth - 1); + } + spanY = ty + ySign * y + (int)(yShear * k1); + clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY); + if (clipRes2 == splashClipAllOutside) { + continue; + } + } else { + clipRes2 = clipRes; + } + + // init x scale Bresenham + xt = 0; + xSrc = 0; + + // x shear + x1 = k1; + + // y shear + y1 = (SplashCoord)ySign * y + yShear * x1; + // this is a kludge: if yShear1 is negative, then (int)y1 would + // change immediately after the first pixel, which is not what we + // want + if (yShear1 < 0) { + y1 += 0.999; + } + + // loop-invariant constants + n = yStep > 0 ? yStep : 1; + + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the alpha value for (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + p = pixBuf + xSrc; + pixAcc = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc += *p++; + } + p += w - m; + } + + // blend fill color with background + if (pixAcc != 0) { + pipe.shape = (pixAcc == n * m) + ? (SplashCoord)1 + : (SplashCoord)pixAcc / (SplashCoord)(n * m); + if (vectorAntialias && clipRes2 != splashClipAllInside) { + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, clipRes2 == splashClipAllInside); + } + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + } + + // free memory + gfree(pixBuf); + + return splashOk; +} + +SplashError Splash::drawImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, GBool srcAlpha, + int w, int h, SplashCoord *mat) { + SplashPipe pipe; + GBool ok, rot; + SplashCoord xScale, yScale, xShear, yShear, yShear1; + int tx, tx2, ty, ty2, scaledWidth, scaledHeight, xSign, ySign; + int ulx, uly, llx, lly, urx, ury, lrx, lry; + int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1; + int xMin, xMax, yMin, yMax; + SplashClipResult clipRes, clipRes2; + int yp, yq, yt, yStep, lastYStep; + int xp, xq, xt, xStep, xSrc; + int k1, spanXMin, spanXMax, spanY; + SplashColorPtr colorBuf, p; + SplashColor pix; + Guchar *alphaBuf, *q; +#if SPLASH_CMYK + int pixAcc0, pixAcc1, pixAcc2, pixAcc3; +#else + int pixAcc0, pixAcc1, pixAcc2; +#endif + int alphaAcc; + SplashCoord pixMul, alphaMul, alpha; + int x, y, x1, x2, y2; + SplashCoord y1; + int nComps, n, m, i, j; + + if (debugMode) { + printf("drawImage: srcMode=%d srcAlpha=%d w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n", + srcMode, srcAlpha, w, h, (double)mat[0], (double)mat[1], (double)mat[2], + (double)mat[3], (double)mat[4], (double)mat[5]); + } + + // check color modes + ok = gFalse; // make gcc happy + nComps = 0; // make gcc happy + switch (bitmap->mode) { + case splashModeMono1: + case splashModeMono8: + ok = srcMode == splashModeMono8; + nComps = 1; + break; + case splashModeRGB8: + ok = srcMode == splashModeRGB8; + nComps = 3; + break; + case splashModeBGR8: + ok = srcMode == splashModeBGR8; + nComps = 3; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + ok = srcMode == splashModeCMYK8; + nComps = 4; + break; +#endif + } + if (!ok) { + return splashErrModeMismatch; + } + + // check for singular matrix + if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) { + return splashErrSingularMatrix; + } + + // compute scale, shear, rotation, translation parameters + rot = splashAbs(mat[1]) > splashAbs(mat[0]); + if (rot) { + xScale = -mat[1]; + yScale = mat[2] - (mat[0] * mat[3]) / mat[1]; + xShear = -mat[3] / yScale; + yShear = -mat[0] / mat[1]; + } else { + xScale = mat[0]; + yScale = mat[3] - (mat[1] * mat[2]) / mat[0]; + xShear = mat[2] / yScale; + yShear = mat[1] / mat[0]; + } + // Note 1: The PDF spec says that all pixels whose *centers* lie + // within the region get painted -- but that doesn't seem to match + // up with what Acrobat actually does: it ends up leaving gaps + // between image stripes. So we use the same rule here as for + // fills: any pixel that overlaps the region gets painted. + // Note 2: The +/-0.01 in these computations is to avoid floating + // point precision problems which can lead to gaps between image + // stripes (it can cause image stripes to overlap, but that's a much + // less visible problem). + if (xScale >= 0) { + tx = splashFloor(mat[4] - 0.01); + tx2 = splashFloor(mat[4] + xScale + 0.01); + } else { + tx = splashFloor(mat[4] + 0.01); + tx2 = splashFloor(mat[4] + xScale - 0.01); + } + scaledWidth = abs(tx2 - tx) + 1; + if (yScale >= 0) { + ty = splashFloor(mat[5] - 0.01); + ty2 = splashFloor(mat[5] + yScale + 0.01); + } else { + ty = splashFloor(mat[5] + 0.01); + ty2 = splashFloor(mat[5] + yScale - 0.01); + } + scaledHeight = abs(ty2 - ty) + 1; + xSign = (xScale < 0) ? -1 : 1; + ySign = (yScale < 0) ? -1 : 1; + yShear1 = (SplashCoord)xSign * yShear; + + // clipping + ulx1 = 0; + uly1 = 0; + urx1 = xSign * (scaledWidth - 1); + ury1 = (int)(yShear * urx1); + llx1 = splashRound(xShear * ySign * (scaledHeight - 1)); + lly1 = ySign * (scaledHeight - 1) + (int)(yShear * llx1); + lrx1 = xSign * (scaledWidth - 1) + + splashRound(xShear * ySign * (scaledHeight - 1)); + lry1 = ySign * (scaledHeight - 1) + (int)(yShear * lrx1); + if (rot) { + ulx = tx + uly1; uly = ty - ulx1; + urx = tx + ury1; ury = ty - urx1; + llx = tx + lly1; lly = ty - llx1; + lrx = tx + lry1; lry = ty - lrx1; + } else { + ulx = tx + ulx1; uly = ty + uly1; + urx = tx + urx1; ury = ty + ury1; + llx = tx + llx1; lly = ty + lly1; + lrx = tx + lrx1; lry = ty + lry1; + } + xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx + : (llx < lrx) ? llx : lrx + : (urx < llx) ? (urx < lrx) ? urx : lrx + : (llx < lrx) ? llx : lrx; + xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx + : (llx > lrx) ? llx : lrx + : (urx > llx) ? (urx > lrx) ? urx : lrx + : (llx > lrx) ? llx : lrx; + yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry + : (lly < lry) ? lly : lry + : (ury < lly) ? (ury < lry) ? ury : lry + : (lly < lry) ? lly : lry; + yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry + : (lly > lry) ? lly : lry + : (ury > lly) ? (ury > lry) ? ury : lry + : (lly > lry) ? lly : lry; + clipRes = state->clip->testRect(xMin, yMin, xMax, yMax); + opClipRes = clipRes; + if (clipRes == splashClipAllOutside) { + return splashOk; + } + + // compute Bresenham parameters for x and y scaling + yp = h / scaledHeight; + yq = h % scaledHeight; + xp = w / scaledWidth; + xq = w % scaledWidth; + + // allocate pixel buffers + colorBuf = (SplashColorPtr)gmalloc((yp + 1) * w * nComps); + if (srcAlpha) { + alphaBuf = (Guchar *)gmalloc((yp + 1) * w); + } else { + alphaBuf = NULL; + } + + pixAcc0 = pixAcc1 = pixAcc2 = 0; // make gcc happy +#if SPLASH_CMYK + pixAcc3 = 0; // make gcc happy +#endif + + // initialize the pixel pipe + pipeInit(&pipe, 0, 0, NULL, pix, state->fillAlpha, + srcAlpha || (vectorAntialias && clipRes != splashClipAllInside), + gFalse); + if (vectorAntialias) { + drawAAPixelInit(); + } + + if (srcAlpha) { + + // init y scale Bresenham + yt = 0; + lastYStep = 1; + + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + yStep = yp; + yt += yq; + if (yt >= scaledHeight) { + yt -= scaledHeight; + ++yStep; + } + + // read row(s) from image + n = (yp > 0) ? yStep : lastYStep; + if (n > 0) { + p = colorBuf; + q = alphaBuf; + for (i = 0; i < n; ++i) { + (*src)(srcData, p, q); + p += w * nComps; + q += w; + } + } + lastYStep = yStep; + + // loop-invariant constants + k1 = splashRound(xShear * ySign * y); + + // clipping test + if (clipRes != splashClipAllInside && + !rot && + (int)(yShear * k1) == + (int)(yShear * (xSign * (scaledWidth - 1) + k1))) { + if (xSign > 0) { + spanXMin = tx + k1; + spanXMax = spanXMin + (scaledWidth - 1); + } else { + spanXMax = tx + k1; + spanXMin = spanXMax - (scaledWidth - 1); + } + spanY = ty + ySign * y + (int)(yShear * k1); + clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY); + if (clipRes2 == splashClipAllOutside) { + continue; + } + } else { + clipRes2 = clipRes; + } + + // init x scale Bresenham + xt = 0; + xSrc = 0; + + // x shear + x1 = k1; + + // y shear + y1 = (SplashCoord)ySign * y + yShear * x1; + // this is a kludge: if yShear1 is negative, then (int)y1 would + // change immediately after the first pixel, which is not what + // we want + if (yShear1 < 0) { + y1 += 0.999; + } + + // loop-invariant constants + n = yStep > 0 ? yStep : 1; + + switch (srcMode) { + + case splashModeMono1: + case splashModeMono8: + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the filtered pixel at (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + alphaAcc = 0; + p = colorBuf + xSrc; + q = alphaBuf + xSrc; + pixAcc0 = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc0 += *p++; + alphaAcc += *q++; + } + p += w - m; + q += w - m; + } + pixMul = (SplashCoord)1 / (SplashCoord)(n * m); + alphaMul = pixMul * (1.0 / 255.0); + alpha = (SplashCoord)alphaAcc * alphaMul; + + if (alpha > 0) { + pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); + + // set pixel + pipe.shape = alpha; + if (vectorAntialias && clipRes != splashClipAllInside) { + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, + clipRes2 == splashClipAllInside); + } + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + break; + + case splashModeRGB8: + case splashModeBGR8: + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the filtered pixel at (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + alphaAcc = 0; + p = colorBuf + xSrc * 3; + q = alphaBuf + xSrc; + pixAcc0 = pixAcc1 = pixAcc2 = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc0 += *p++; + pixAcc1 += *p++; + pixAcc2 += *p++; + alphaAcc += *q++; + } + p += 3 * (w - m); + q += w - m; + } + pixMul = (SplashCoord)1 / (SplashCoord)(n * m); + alphaMul = pixMul * (1.0 / 255.0); + alpha = (SplashCoord)alphaAcc * alphaMul; + + if (alpha > 0) { + pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); + pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); + pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); + + // set pixel + pipe.shape = alpha; + if (vectorAntialias && clipRes != splashClipAllInside) { + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, + clipRes2 == splashClipAllInside); + } + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + break; + +#if SPLASH_CMYK + case splashModeCMYK8: + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the filtered pixel at (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + alphaAcc = 0; + p = colorBuf + xSrc * 4; + q = alphaBuf + xSrc; + pixAcc0 = pixAcc1 = pixAcc2 = pixAcc3 = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc0 += *p++; + pixAcc1 += *p++; + pixAcc2 += *p++; + pixAcc3 += *p++; + alphaAcc += *q++; + } + p += 4 * (w - m); + q += w - m; + } + pixMul = (SplashCoord)1 / (SplashCoord)(n * m); + alphaMul = pixMul * (1.0 / 255.0); + alpha = (SplashCoord)alphaAcc * alphaMul; + + if (alpha > 0) { + pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); + pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); + pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); + pix[3] = (int)((SplashCoord)pixAcc3 * pixMul); + + // set pixel + pipe.shape = alpha; + if (vectorAntialias && clipRes != splashClipAllInside) { + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, + clipRes2 == splashClipAllInside); + } + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + break; +#endif // SPLASH_CMYK + } + } + + } else { + + // init y scale Bresenham + yt = 0; + lastYStep = 1; + + for (y = 0; y < scaledHeight; ++y) { + + // y scale Bresenham + yStep = yp; + yt += yq; + if (yt >= scaledHeight) { + yt -= scaledHeight; + ++yStep; + } + + // read row(s) from image + n = (yp > 0) ? yStep : lastYStep; + if (n > 0) { + p = colorBuf; + for (i = 0; i < n; ++i) { + (*src)(srcData, p, NULL); + p += w * nComps; + } + } + lastYStep = yStep; + + // loop-invariant constants + k1 = splashRound(xShear * ySign * y); + + // clipping test + if (clipRes != splashClipAllInside && + !rot && + (int)(yShear * k1) == + (int)(yShear * (xSign * (scaledWidth - 1) + k1))) { + if (xSign > 0) { + spanXMin = tx + k1; + spanXMax = spanXMin + (scaledWidth - 1); + } else { + spanXMax = tx + k1; + spanXMin = spanXMax - (scaledWidth - 1); + } + spanY = ty + ySign * y + (int)(yShear * k1); + clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY); + if (clipRes2 == splashClipAllOutside) { + continue; + } + } else { + clipRes2 = clipRes; + } + + // init x scale Bresenham + xt = 0; + xSrc = 0; + + // x shear + x1 = k1; + + // y shear + y1 = (SplashCoord)ySign * y + yShear * x1; + // this is a kludge: if yShear1 is negative, then (int)y1 would + // change immediately after the first pixel, which is not what + // we want + if (yShear1 < 0) { + y1 += 0.999; + } + + // loop-invariant constants + n = yStep > 0 ? yStep : 1; + + switch (srcMode) { + + case splashModeMono1: + case splashModeMono8: + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the filtered pixel at (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + p = colorBuf + xSrc; + pixAcc0 = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc0 += *p++; + } + p += w - m; + } + pixMul = (SplashCoord)1 / (SplashCoord)(n * m); + + pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); + + // set pixel + if (vectorAntialias && clipRes != splashClipAllInside) { + pipe.shape = (SplashCoord)1; + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, + clipRes2 == splashClipAllInside); + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + break; + + case splashModeRGB8: + case splashModeBGR8: + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the filtered pixel at (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + p = colorBuf + xSrc * 3; + pixAcc0 = pixAcc1 = pixAcc2 = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc0 += *p++; + pixAcc1 += *p++; + pixAcc2 += *p++; + } + p += 3 * (w - m); + } + pixMul = (SplashCoord)1 / (SplashCoord)(n * m); + + pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); + pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); + pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); + + // set pixel + if (vectorAntialias && clipRes != splashClipAllInside) { + pipe.shape = (SplashCoord)1; + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, + clipRes2 == splashClipAllInside); + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + break; + +#if SPLASH_CMYK + case splashModeCMYK8: + for (x = 0; x < scaledWidth; ++x) { + + // x scale Bresenham + xStep = xp; + xt += xq; + if (xt >= scaledWidth) { + xt -= scaledWidth; + ++xStep; + } + + // rotation + if (rot) { + x2 = (int)y1; + y2 = -x1; + } else { + x2 = x1; + y2 = (int)y1; + } + + // compute the filtered pixel at (x,y) after the x and y scaling + // operations + m = xStep > 0 ? xStep : 1; + p = colorBuf + xSrc * 4; + pixAcc0 = pixAcc1 = pixAcc2 = pixAcc3 = 0; + for (i = 0; i < n; ++i) { + for (j = 0; j < m; ++j) { + pixAcc0 += *p++; + pixAcc1 += *p++; + pixAcc2 += *p++; + pixAcc3 += *p++; + } + p += 4 * (w - m); + } + pixMul = (SplashCoord)1 / (SplashCoord)(n * m); + + pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); + pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); + pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); + pix[3] = (int)((SplashCoord)pixAcc3 * pixMul); + + // set pixel + if (vectorAntialias && clipRes != splashClipAllInside) { + pipe.shape = (SplashCoord)1; + drawAAPixel(&pipe, tx + x2, ty + y2); + } else { + drawPixel(&pipe, tx + x2, ty + y2, + clipRes2 == splashClipAllInside); + } + + // x scale Bresenham + xSrc += xStep; + + // x shear + x1 += xSign; + + // y shear + y1 += yShear1; + } + break; +#endif // SPLASH_CMYK + } + } + + } + + gfree(colorBuf); + gfree(alphaBuf); + + return splashOk; +} + +SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h, + GBool noClip, GBool nonIsolated) { + SplashPipe pipe; + SplashColor pixel; + Guchar alpha; + Guchar *ap; + int x, y; + + if (src->mode != bitmap->mode) { + return splashErrModeMismatch; + } + + if (src->alpha) { + pipeInit(&pipe, xDest, yDest, NULL, pixel, state->fillAlpha, + gTrue, nonIsolated); + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + alpha = *ap++; + if (noClip || state->clip->test(xDest + x, yDest + y)) { + // this uses shape instead of alpha, which isn't technically + // correct, but works out the same + pipe.shape = (SplashCoord)(alpha / 255.0); + pipeRun(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + } + } + } + } else { + pipeInit(&pipe, xDest, yDest, NULL, pixel, state->fillAlpha, + gFalse, nonIsolated); + for (y = 0; y < h; ++y) { + pipeSetXY(&pipe, xDest, yDest + y); + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + if (noClip || state->clip->test(xDest + x, yDest + y)) { + pipeRun(&pipe); + updateModX(xDest + x); + updateModY(yDest + y); + } else { + pipeIncX(&pipe); + } + } + } + } + + return splashOk; +} + +void Splash::compositeBackground(SplashColorPtr color) { + SplashColorPtr p; + Guchar *q; + Guchar alpha, alpha1, c, color0, color1, color2, color3; + int x, y, mask; + + switch (bitmap->mode) { + case splashModeMono1: + color0 = color[0]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + mask = 0x80; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + alpha1 = 255 - alpha; + c = (*p & mask) ? 0xff : 0x00; + c = div255(alpha1 * color0 + alpha * c); + if (c & 0x80) { + *p |= mask; + } else { + *p &= ~mask; + } + if (!(mask >>= 1)) { + mask = 0x80; + ++p; + } + } + } + break; + case splashModeMono8: + color0 = color[0]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + ++p; + } + } + break; + case splashModeRGB8: + case splashModeBGR8: + color0 = color[0]; + color1 = color[1]; + color2 = color[2]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + p[1] = div255(alpha1 * color1 + alpha * p[1]); + p[2] = div255(alpha1 * color2 + alpha * p[2]); + p += 3; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + color0 = color[0]; + color1 = color[1]; + color2 = color[2]; + color3 = color[3]; + for (y = 0; y < bitmap->height; ++y) { + p = &bitmap->data[y * bitmap->rowSize]; + q = &bitmap->alpha[y * bitmap->width]; + for (x = 0; x < bitmap->width; ++x) { + alpha = *q++; + alpha1 = 255 - alpha; + p[0] = div255(alpha1 * color0 + alpha * p[0]); + p[1] = div255(alpha1 * color1 + alpha * p[1]); + p[2] = div255(alpha1 * color2 + alpha * p[2]); + p[3] = div255(alpha1 * color3 + alpha * p[3]); + p += 4; + } + } + break; +#endif + } + memset(bitmap->alpha, 255, bitmap->width * bitmap->height); +} + +SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h) { + SplashColor pixel; + SplashColorPtr p; + Guchar *q; + int x, y, mask; + + if (src->mode != bitmap->mode) { + return splashErrModeMismatch; + } + + switch (bitmap->mode) { + case splashModeMono1: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + (xDest >> 3)]; + mask = 0x80 >> (xDest & 7); + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + if (pixel[0]) { + *p |= mask; + } else { + *p &= ~mask; + } + if (!(mask >>= 1)) { + mask = 0x80; + ++p; + } + } + } + break; + case splashModeMono8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + xDest]; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + *p++ = pixel[0]; + } + } + break; + case splashModeRGB8: + case splashModeBGR8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + 3 * xDest]; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + *p++ = pixel[0]; + *p++ = pixel[1]; + *p++ = pixel[2]; + } + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest]; + for (x = 0; x < w; ++x) { + src->getPixel(xSrc + x, ySrc + y, pixel); + *p++ = pixel[0]; + *p++ = pixel[1]; + *p++ = pixel[2]; + *p++ = pixel[3]; + } + } + break; +#endif + } + + if (bitmap->alpha) { + for (y = 0; y < h; ++y) { + q = &bitmap->alpha[(yDest + y) * bitmap->width + xDest]; + for (x = 0; x < w; ++x) { + *q++ = 0x00; + } + } + } + + return splashOk; +} + +SplashPath *Splash::makeStrokePath(SplashPath *path, GBool flatten) { + SplashPath *pathIn, *pathOut; + SplashCoord w, d, dx, dy, wdx, wdy, dxNext, dyNext, wdxNext, wdyNext; + SplashCoord crossprod, dotprod, miter, m; + GBool first, last, closed; + int subpathStart, next, i; + int left0, left1, left2, right0, right1, right2, join0, join1, join2; + int leftFirst, rightFirst, firstPt; + + if (flatten) { + pathIn = flattenPath(path, state->matrix, state->flatness); + if (state->lineDashLength > 0) { + pathOut = makeDashedPath(pathIn); + delete pathIn; + pathIn = pathOut; + } + } else { + pathIn = path; + } + + subpathStart = 0; // make gcc happy + closed = gFalse; // make gcc happy + left0 = left1 = right0 = right1 = join0 = join1 = 0; // make gcc happy + leftFirst = rightFirst = firstPt = 0; // make gcc happy + + pathOut = new SplashPath(); + w = state->lineWidth; + + for (i = 0; i < pathIn->length - 1; ++i) { + if (pathIn->flags[i] & splashPathLast) { + continue; + } + if ((first = pathIn->flags[i] & splashPathFirst)) { + subpathStart = i; + closed = pathIn->flags[i] & splashPathClosed; + } + last = pathIn->flags[i+1] & splashPathLast; + + // compute the deltas for segment (i, i+1) + d = splashDist(pathIn->pts[i].x, pathIn->pts[i].y, + pathIn->pts[i+1].x, pathIn->pts[i+1].y); + if (d == 0) { + // we need to draw end caps on zero-length lines + //~ not clear what the behavior should be for splashLineCapButt + //~ with d==0 + dx = 0; + dy = 1; + } else { + d = (SplashCoord)1 / d; + dx = d * (pathIn->pts[i+1].x - pathIn->pts[i].x); + dy = d * (pathIn->pts[i+1].y - pathIn->pts[i].y); + } + wdx = (SplashCoord)0.5 * w * dx; + wdy = (SplashCoord)0.5 * w * dy; + + // compute the deltas for segment (i+1, next) + next = last ? subpathStart + 1 : i + 2; + d = splashDist(pathIn->pts[i+1].x, pathIn->pts[i+1].y, + pathIn->pts[next].x, pathIn->pts[next].y); + if (d == 0) { + // we need to draw end caps on zero-length lines + //~ not clear what the behavior should be for splashLineCapButt + //~ with d==0 + dxNext = 0; + dyNext = 1; + } else { + d = (SplashCoord)1 / d; + dxNext = d * (pathIn->pts[next].x - pathIn->pts[i+1].x); + dyNext = d * (pathIn->pts[next].y - pathIn->pts[i+1].y); + } + wdxNext = (SplashCoord)0.5 * w * dxNext; + wdyNext = (SplashCoord)0.5 * w * dyNext; + + // draw the start cap + pathOut->moveTo(pathIn->pts[i].x - wdy, pathIn->pts[i].y + wdx); + if (i == subpathStart) { + firstPt = pathOut->length - 1; + } + if (first && !closed) { + switch (state->lineCap) { + case splashLineCapButt: + pathOut->lineTo(pathIn->pts[i].x + wdy, pathIn->pts[i].y - wdx); + break; + case splashLineCapRound: + pathOut->curveTo(pathIn->pts[i].x - wdy - bezierCircle * wdx, + pathIn->pts[i].y + wdx - bezierCircle * wdy, + pathIn->pts[i].x - wdx - bezierCircle * wdy, + pathIn->pts[i].y - wdy + bezierCircle * wdx, + pathIn->pts[i].x - wdx, + pathIn->pts[i].y - wdy); + pathOut->curveTo(pathIn->pts[i].x - wdx + bezierCircle * wdy, + pathIn->pts[i].y - wdy - bezierCircle * wdx, + pathIn->pts[i].x + wdy - bezierCircle * wdx, + pathIn->pts[i].y - wdx - bezierCircle * wdy, + pathIn->pts[i].x + wdy, + pathIn->pts[i].y - wdx); + break; + case splashLineCapProjecting: + pathOut->lineTo(pathIn->pts[i].x - wdx - wdy, + pathIn->pts[i].y + wdx - wdy); + pathOut->lineTo(pathIn->pts[i].x - wdx + wdy, + pathIn->pts[i].y - wdx - wdy); + pathOut->lineTo(pathIn->pts[i].x + wdy, + pathIn->pts[i].y - wdx); + break; + } + } else { + pathOut->lineTo(pathIn->pts[i].x + wdy, pathIn->pts[i].y - wdx); + } + + // draw the left side of the segment rectangle + left2 = pathOut->length - 1; + pathOut->lineTo(pathIn->pts[i+1].x + wdy, pathIn->pts[i+1].y - wdx); + + // draw the end cap + if (last && !closed) { + switch (state->lineCap) { + case splashLineCapButt: + pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx); + break; + case splashLineCapRound: + pathOut->curveTo(pathIn->pts[i+1].x + wdy + bezierCircle * wdx, + pathIn->pts[i+1].y - wdx + bezierCircle * wdy, + pathIn->pts[i+1].x + wdx + bezierCircle * wdy, + pathIn->pts[i+1].y + wdy - bezierCircle * wdx, + pathIn->pts[i+1].x + wdx, + pathIn->pts[i+1].y + wdy); + pathOut->curveTo(pathIn->pts[i+1].x + wdx - bezierCircle * wdy, + pathIn->pts[i+1].y + wdy + bezierCircle * wdx, + pathIn->pts[i+1].x - wdy + bezierCircle * wdx, + pathIn->pts[i+1].y + wdx + bezierCircle * wdy, + pathIn->pts[i+1].x - wdy, + pathIn->pts[i+1].y + wdx); + break; + case splashLineCapProjecting: + pathOut->lineTo(pathIn->pts[i+1].x + wdy + wdx, + pathIn->pts[i+1].y - wdx + wdy); + pathOut->lineTo(pathIn->pts[i+1].x - wdy + wdx, + pathIn->pts[i+1].y + wdx + wdy); + pathOut->lineTo(pathIn->pts[i+1].x - wdy, + pathIn->pts[i+1].y + wdx); + break; + } + } else { + pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx); + } + + // draw the right side of the segment rectangle + right2 = pathOut->length - 1; + pathOut->close(); + + // draw the join + join2 = pathOut->length; + if (!last || closed) { + crossprod = dx * dyNext - dy * dxNext; + dotprod = -(dx * dxNext + dy * dyNext); + if (dotprod > 0.99999) { + // avoid a divide-by-zero -- set miter to something arbitrary + // such that sqrt(miter) will exceed miterLimit (and m is never + // used in that situation) + miter = (state->miterLimit + 1) * (state->miterLimit + 1); + m = 0; + } else { + miter = (SplashCoord)2 / ((SplashCoord)1 - dotprod); + if (miter < 1) { + // this can happen because of floating point inaccuracies + miter = 1; + } + m = splashSqrt(miter - 1); + } + + // round join + if (state->lineJoin == splashLineJoinRound) { + pathOut->moveTo(pathIn->pts[i+1].x + (SplashCoord)0.5 * w, + pathIn->pts[i+1].y); + pathOut->curveTo(pathIn->pts[i+1].x + (SplashCoord)0.5 * w, + pathIn->pts[i+1].y + bezierCircle2 * w, + pathIn->pts[i+1].x + bezierCircle2 * w, + pathIn->pts[i+1].y + (SplashCoord)0.5 * w, + pathIn->pts[i+1].x, + pathIn->pts[i+1].y + (SplashCoord)0.5 * w); + pathOut->curveTo(pathIn->pts[i+1].x - bezierCircle2 * w, + pathIn->pts[i+1].y + (SplashCoord)0.5 * w, + pathIn->pts[i+1].x - (SplashCoord)0.5 * w, + pathIn->pts[i+1].y + bezierCircle2 * w, + pathIn->pts[i+1].x - (SplashCoord)0.5 * w, + pathIn->pts[i+1].y); + pathOut->curveTo(pathIn->pts[i+1].x - (SplashCoord)0.5 * w, + pathIn->pts[i+1].y - bezierCircle2 * w, + pathIn->pts[i+1].x - bezierCircle2 * w, + pathIn->pts[i+1].y - (SplashCoord)0.5 * w, + pathIn->pts[i+1].x, + pathIn->pts[i+1].y - (SplashCoord)0.5 * w); + pathOut->curveTo(pathIn->pts[i+1].x + bezierCircle2 * w, + pathIn->pts[i+1].y - (SplashCoord)0.5 * w, + pathIn->pts[i+1].x + (SplashCoord)0.5 * w, + pathIn->pts[i+1].y - bezierCircle2 * w, + pathIn->pts[i+1].x + (SplashCoord)0.5 * w, + pathIn->pts[i+1].y); + + } else { + pathOut->moveTo(pathIn->pts[i+1].x, pathIn->pts[i+1].y); + + // angle < 180 + if (crossprod < 0) { + pathOut->lineTo(pathIn->pts[i+1].x - wdyNext, + pathIn->pts[i+1].y + wdxNext); + // miter join inside limit + if (state->lineJoin == splashLineJoinMiter && + splashSqrt(miter) <= state->miterLimit) { + pathOut->lineTo(pathIn->pts[i+1].x - wdy + wdx * m, + pathIn->pts[i+1].y + wdx + wdy * m); + pathOut->lineTo(pathIn->pts[i+1].x - wdy, + pathIn->pts[i+1].y + wdx); + // bevel join or miter join outside limit + } else { + pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx); + } + + // angle >= 180 + } else { + pathOut->lineTo(pathIn->pts[i+1].x + wdy, + pathIn->pts[i+1].y - wdx); + // miter join inside limit + if (state->lineJoin == splashLineJoinMiter && + splashSqrt(miter) <= state->miterLimit) { + pathOut->lineTo(pathIn->pts[i+1].x + wdy + wdx * m, + pathIn->pts[i+1].y - wdx + wdy * m); + pathOut->lineTo(pathIn->pts[i+1].x + wdyNext, + pathIn->pts[i+1].y - wdxNext); + // bevel join or miter join outside limit + } else { + pathOut->lineTo(pathIn->pts[i+1].x + wdyNext, + pathIn->pts[i+1].y - wdxNext); + } + } + } + + pathOut->close(); + } + + // add stroke adjustment hints + if (state->strokeAdjust) { + if (i >= subpathStart + 1) { + if (i >= subpathStart + 2) { + pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0); + pathOut->addStrokeAdjustHint(left1, right1, join0, left2); + } else { + pathOut->addStrokeAdjustHint(left1, right1, firstPt, left2); + } + pathOut->addStrokeAdjustHint(left1, right1, right2 + 1, right2 + 1); + } + left0 = left1; + left1 = left2; + right0 = right1; + right1 = right2; + join0 = join1; + join1 = join2; + if (i == subpathStart) { + leftFirst = left2; + rightFirst = right2; + } + if (last) { + if (i >= subpathStart + 2) { + pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0); + pathOut->addStrokeAdjustHint(left1, right1, + join0, pathOut->length - 1); + } else { + pathOut->addStrokeAdjustHint(left1, right1, + firstPt, pathOut->length - 1); + } + if (closed) { + pathOut->addStrokeAdjustHint(left1, right1, firstPt, leftFirst); + pathOut->addStrokeAdjustHint(left1, right1, + rightFirst + 1, rightFirst + 1); + pathOut->addStrokeAdjustHint(leftFirst, rightFirst, + left1 + 1, right1); + pathOut->addStrokeAdjustHint(leftFirst, rightFirst, + join1, pathOut->length - 1); + } + } + } + } + + if (pathIn != path) { + delete pathIn; + } + + return pathOut; +} + +void Splash::dumpPath(SplashPath *path) { + int i; + + for (i = 0; i < path->length; ++i) { + printf(" %3d: x=%8.2f y=%8.2f%s%s%s%s\n", + i, (double)path->pts[i].x, (double)path->pts[i].y, + (path->flags[i] & splashPathFirst) ? " first" : "", + (path->flags[i] & splashPathLast) ? " last" : "", + (path->flags[i] & splashPathClosed) ? " closed" : "", + (path->flags[i] & splashPathCurve) ? " curve" : ""); + } +} + +void Splash::dumpXPath(SplashXPath *path) { + int i; + + for (i = 0; i < path->length; ++i) { + printf(" %4d: x0=%8.2f y0=%8.2f x1=%8.2f y1=%8.2f %s%s%s%s%s%s%s\n", + i, (double)path->segs[i].x0, (double)path->segs[i].y0, + (double)path->segs[i].x1, (double)path->segs[i].y1, + (path->segs[i].flags & splashXPathFirst) ? "F" : " ", + (path->segs[i].flags & splashXPathLast) ? "L" : " ", + (path->segs[i].flags & splashXPathEnd0) ? "0" : " ", + (path->segs[i].flags & splashXPathEnd1) ? "1" : " ", + (path->segs[i].flags & splashXPathHoriz) ? "H" : " ", + (path->segs[i].flags & splashXPathVert) ? "V" : " ", + (path->segs[i].flags & splashXPathFlip) ? "P" : " "); + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h new file mode 100644 index 000000000..c6246227c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h @@ -0,0 +1,293 @@ +//======================================================================== +// +// Splash.h +// +//======================================================================== + +#ifndef SPLASH_H +#define SPLASH_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" +#include "SplashClip.h" + +class Splash; +class SplashBitmap; +struct SplashGlyphBitmap; +class SplashState; +class SplashPattern; +class SplashScreen; +class SplashPath; +class SplashXPath; +class SplashFont; +struct SplashPipe; + +//------------------------------------------------------------------------ + +// Retrieves the next line of pixels in an image mask. Normally, +// fills in * and returns true. If the image stream is +// exhausted, returns false. +typedef GBool (*SplashImageMaskSource)(void *data, SplashColorPtr pixel); + +// Retrieves the next line of pixels in an image. Normally, fills in +// * and returns true. If the image stream is exhausted, +// returns false. +typedef GBool (*SplashImageSource)(void *data, SplashColorPtr colorLine, + Guchar *alphaLine); + +//------------------------------------------------------------------------ + +enum SplashPipeResultColorCtrl { +#if SPLASH_CMYK + splashPipeResultColorNoAlphaBlendCMYK, +#endif + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendRGB, +#if SPLASH_CMYK + splashPipeResultColorAlphaNoBlendCMYK, +#endif + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaBlendCMYK +#endif +}; + +//------------------------------------------------------------------------ +// Splash +//------------------------------------------------------------------------ + +class Splash { +public: + + // Create a new rasterizer object. + Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreenParams *screenParams = NULL); + Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, + SplashScreen *screenA); + + ~Splash(); + + //----- state read + + SplashCoord *getMatrix(); + SplashPattern *getStrokePattern(); + SplashPattern *getFillPattern(); + SplashScreen *getScreen(); + SplashBlendFunc getBlendFunc(); + SplashCoord getStrokeAlpha(); + SplashCoord getFillAlpha(); + SplashCoord getLineWidth(); + int getLineCap(); + int getLineJoin(); + SplashCoord getMiterLimit(); + SplashCoord getFlatness(); + SplashCoord *getLineDash(); + int getLineDashLength(); + SplashCoord getLineDashPhase(); + SplashClip *getClip(); + SplashBitmap *getSoftMask(); + GBool getInNonIsolatedGroup(); + + //----- state write + + void setMatrix(SplashCoord *matrix); + void setStrokePattern(SplashPattern *strokeColor); + void setFillPattern(SplashPattern *fillColor); + void setScreen(SplashScreen *screen); + void setBlendFunc(SplashBlendFunc func); + void setStrokeAlpha(SplashCoord alpha); + void setFillAlpha(SplashCoord alpha); + void setLineWidth(SplashCoord lineWidth); + void setLineCap(int lineCap); + void setLineJoin(int lineJoin); + void setMiterLimit(SplashCoord miterLimit); + void setFlatness(SplashCoord flatness); + // the array will be copied + void setLineDash(SplashCoord *lineDash, int lineDashLength, + SplashCoord lineDashPhase); + void setStrokeAdjust(GBool strokeAdjust); + // NB: uses transformed coordinates. + void clipResetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + // NB: uses transformed coordinates. + SplashError clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + // NB: uses untransformed coordinates. + SplashError clipToPath(SplashPath *path, GBool eo); + void setSoftMask(SplashBitmap *softMask); + void setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, + int alpha0XA, int alpha0YA); + + //----- state save/restore + + void saveState(); + SplashError restoreState(); + + //----- drawing operations + + // Fill the bitmap with . This is not subject to clipping. + void clear(SplashColorPtr color, Guchar alpha = 0x00); + + // Stroke a path using the current stroke pattern. + SplashError stroke(SplashPath *path); + + // Fill a path using the current fill pattern. + SplashError fill(SplashPath *path, GBool eo); + + // Fill a path, XORing with the current fill pattern. + SplashError xorFill(SplashPath *path, GBool eo); + + // Draw a character, using the current fill pattern. + SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font); + + // Draw a glyph, using the current fill pattern. This function does + // not free any data, i.e., it ignores glyph->freeData. + SplashError fillGlyph(SplashCoord x, SplashCoord y, + SplashGlyphBitmap *glyph); + + // Draws an image mask using the fill color. This will read + // lines of pixels from , starting with the top line. "1" + // pixels will be drawn with the current fill color; "0" pixels are + // transparent. The matrix: + // [ mat[0] mat[1] 0 ] + // [ mat[2] mat[3] 0 ] + // [ mat[4] mat[5] 1 ] + // maps a unit square to the desired destination for the image, in + // PostScript style: + // [x' y' 1] = [x y 1] * mat + // Note that the Splash y axis points downward, and the image source + // is assumed to produce pixels in raster order, starting from the + // top line. + SplashError fillImageMask(SplashImageMaskSource src, void *srcData, + int w, int h, SplashCoord *mat, + GBool glyphMode); + + // Draw an image. This will read lines of pixels from + // , starting with the top line. These pixels are assumed to + // be in the source mode, . If is true, the + // alpha values returned by are used; otherwise they are + // ignored. The following combinations of source and target modes + // are supported: + // source target + // ------ ------ + // Mono1 Mono1 + // Mono8 Mono1 -- with dithering + // Mono8 Mono8 + // RGB8 RGB8 + // BGR8 BGR8 + // CMYK8 CMYK8 + // The matrix behaves as for fillImageMask. + SplashError drawImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, GBool srcAlpha, + int w, int h, SplashCoord *mat); + + // Composite a rectangular region from onto this Splash + // object. + SplashError composite(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h, + GBool noClip, GBool nonIsolated); + + // Composite this Splash object onto a background color. The + // background alpha is assumed to be 1. + void compositeBackground(SplashColorPtr color); + + // Copy a rectangular region from onto the bitmap belonging to + // this Splash object. The destination alpha values are all set to + // zero. + SplashError blitTransparent(SplashBitmap *src, int xSrc, int ySrc, + int xDest, int yDest, int w, int h); + + //----- misc + + // Construct a path for a stroke, given the path to be stroked, and + // using the current line parameters. If is true, this + // function will first flatten the path and handle the linedash. + SplashPath *makeStrokePath(SplashPath *path, GBool flatten = gTrue); + + // Return the associated bitmap. + SplashBitmap *getBitmap() { return bitmap; } + + // Get a bounding box which includes all modifications since the + // last call to clearModRegion. + void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax) + { *xMin = modXMin; *yMin = modYMin; *xMax = modXMax; *yMax = modYMax; } + + // Clear the modified region bounding box. + void clearModRegion(); + + // Get clipping status for the last drawing operation subject to + // clipping. + SplashClipResult getClipRes() { return opClipRes; } + + // Toggle debug mode on or off. + void setDebugMode(GBool debugModeA) { debugMode = debugModeA; } + +#if 1 //~tmp: turn off anti-aliasing temporarily + GBool getVectorAntialias() { return vectorAntialias; } + void setVectorAntialias(GBool vaa) { vectorAntialias = vaa; } +#endif + +private: + + void pipeInit(SplashPipe *pipe, int x, int y, + SplashPattern *pattern, SplashColorPtr cSrc, + SplashCoord aInput, GBool usesShape, + GBool nonIsolatedGroup); + void pipeRun(SplashPipe *pipe); + void pipeSetXY(SplashPipe *pipe, int x, int y); + void pipeIncX(SplashPipe *pipe); + void drawPixel(SplashPipe *pipe, int x, int y, GBool noClip); + void drawAAPixelInit(); + void drawAAPixel(SplashPipe *pipe, int x, int y); + void drawSpan(SplashPipe *pipe, int x0, int x1, int y, GBool noClip); + void drawAALine(SplashPipe *pipe, int x0, int x1, int y); + void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo); + void updateModX(int x); + void updateModY(int y); + void strokeNarrow(SplashPath *path); + void strokeWide(SplashPath *path); + SplashPath *flattenPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness); + void flattenCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord *matrix, SplashCoord flatness2, + SplashPath *fPath); + SplashPath *makeDashedPath(SplashPath *xPath); + SplashError fillWithPattern(SplashPath *path, GBool eo, + SplashPattern *pattern, SplashCoord alpha); + SplashError fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph); + void dumpPath(SplashPath *path); + void dumpXPath(SplashXPath *path); + + static SplashPipeResultColorCtrl pipeResultColorNoAlphaBlend[]; + static SplashPipeResultColorCtrl pipeResultColorAlphaNoBlend[]; + static SplashPipeResultColorCtrl pipeResultColorAlphaBlend[]; + static int pipeNonIsoGroupCorrection[]; + + SplashBitmap *bitmap; + SplashState *state; + SplashBitmap *aaBuf; + int aaBufY; + SplashBitmap *alpha0Bitmap; // for non-isolated groups, this is the + // bitmap containing the alpha0 values + int alpha0X, alpha0Y; // offset within alpha0Bitmap + SplashCoord aaGamma[splashAASize * splashAASize + 1]; + int modXMin, modYMin, modXMax, modYMax; + SplashClipResult opClipRes; + GBool vectorAntialias; + GBool debugMode; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc new file mode 100644 index 000000000..0cb1a752a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc @@ -0,0 +1,188 @@ +//======================================================================== +// +// SplashBitmap.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "SplashErrorCodes.h" +#include "SplashBitmap.h" + +//------------------------------------------------------------------------ +// SplashBitmap +//------------------------------------------------------------------------ + +SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPad, + SplashColorMode modeA, GBool alphaA, + GBool topDown) { + width = widthA; + height = heightA; + mode = modeA; + switch (mode) { + case splashModeMono1: + rowSize = (width + 7) >> 3; + break; + case splashModeMono8: + rowSize = width; + break; + case splashModeRGB8: + case splashModeBGR8: + rowSize = width * 3; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + rowSize = width * 4; + break; +#endif + } + rowSize += rowPad - 1; + rowSize -= rowSize % rowPad; + data = (SplashColorPtr)gmalloc(rowSize * height); + if (!topDown) { + data += (height - 1) * rowSize; + rowSize = -rowSize; + } + if (alphaA) { + alpha = (Guchar *)gmalloc(width * height); + } else { + alpha = NULL; + } +} + + +SplashBitmap::~SplashBitmap() { + if (rowSize < 0) { + gfree(data + (height - 1) * rowSize); + } else { + gfree(data); + } + gfree(alpha); +} + +SplashError SplashBitmap::writePNMFile(char *fileName) { + FILE *f; + SplashColorPtr row, p; + int x, y; + + if (!(f = fopen(fileName, "wb"))) { + return splashErrOpenFile; + } + + switch (mode) { + + case splashModeMono1: + fprintf(f, "P4\n%d %d\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; x += 8) { + fputc(*p ^ 0xff, f); + ++p; + } + row += rowSize; + } + break; + + case splashModeMono8: + fprintf(f, "P5\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; ++x) { + fputc(*p, f); + ++p; + } + row += rowSize; + } + break; + + case splashModeRGB8: + fprintf(f, "P6\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; ++x) { + fputc(splashRGB8R(p), f); + fputc(splashRGB8G(p), f); + fputc(splashRGB8B(p), f); + p += 3; + } + row += rowSize; + } + break; + + case splashModeBGR8: + fprintf(f, "P6\n%d %d\n255\n", width, height); + row = data; + for (y = 0; y < height; ++y) { + p = row; + for (x = 0; x < width; ++x) { + fputc(splashBGR8R(p), f); + fputc(splashBGR8G(p), f); + fputc(splashBGR8B(p), f); + p += 3; + } + row += rowSize; + } + break; + +#if SPLASH_CMYK + case splashModeCMYK8: + // PNM doesn't support CMYK + break; +#endif + } + + fclose(f); + return splashOk; +} + +void SplashBitmap::getPixel(int x, int y, SplashColorPtr pixel) { + SplashColorPtr p; + + if (y < 0 || y >= height || x < 0 || x >= width) { + return; + } + switch (mode) { + case splashModeMono1: + p = &data[y * rowSize + (x >> 3)]; + pixel[0] = (p[0] & (0x80 >> (x & 7))) ? 0xff : 0x00; + break; + case splashModeMono8: + p = &data[y * rowSize + x]; + pixel[0] = p[0]; + break; + case splashModeRGB8: + p = &data[y * rowSize + 3 * x]; + pixel[0] = p[0]; + pixel[1] = p[1]; + pixel[2] = p[2]; + break; + case splashModeBGR8: + p = &data[y * rowSize + 3 * x]; + pixel[0] = p[2]; + pixel[1] = p[1]; + pixel[2] = p[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + p = &data[y * rowSize + 4 * x]; + pixel[0] = p[0]; + pixel[1] = p[1]; + pixel[2] = p[2]; + pixel[3] = p[3]; + break; +#endif + } +} + +Guchar SplashBitmap::getAlpha(int x, int y) { + return alpha[y * width + x]; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h new file mode 100644 index 000000000..69ab058e5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h @@ -0,0 +1,61 @@ +//======================================================================== +// +// SplashBitmap.h +// +//======================================================================== + +#ifndef SPLASHBITMAP_H +#define SPLASHBITMAP_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +//------------------------------------------------------------------------ +// SplashBitmap +//------------------------------------------------------------------------ + +class SplashBitmap { +public: + + // Create a new bitmap. It will have x pixels in + // color mode . Rows will be padded out to a multiple of + // bytes. If is false, the bitmap will be stored + // upside-down, i.e., with the last row first in memory. + SplashBitmap(int widthA, int heightA, int rowPad, + SplashColorMode modeA, GBool alphaA, + GBool topDown = gTrue); + + ~SplashBitmap(); + + int getWidth() { return width; } + int getHeight() { return height; } + int getRowSize() { return rowSize; } + int getAlphaRowSize() { return width; } + SplashColorMode getMode() { return mode; } + SplashColorPtr getDataPtr() { return data; } + Guchar *getAlphaPtr() { return alpha; } + + SplashError writePNMFile(char *fileName); + + void getPixel(int x, int y, SplashColorPtr pixel); + Guchar getAlpha(int x, int y); + +private: + + int width, height; // size of bitmap + int rowSize; // size of one row of data, in bytes + // - negative for bottom-up bitmaps + SplashColorMode mode; // color mode + SplashColorPtr data; // pointer to row zero of the color data + Guchar *alpha; // pointer to row zero of the alpha data + // (always top-down) + + friend class Splash; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc new file mode 100644 index 000000000..ef8acbabd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc @@ -0,0 +1,382 @@ +//======================================================================== +// +// SplashClip.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashErrorCodes.h" +#include "SplashPath.h" +#include "SplashXPath.h" +#include "SplashXPathScanner.h" +#include "SplashBitmap.h" +#include "SplashClip.h" + +//------------------------------------------------------------------------ +// SplashClip.flags +//------------------------------------------------------------------------ + +#define splashClipEO 0x01 // use even-odd rule + +//------------------------------------------------------------------------ +// SplashClip +//------------------------------------------------------------------------ + +SplashClip::SplashClip(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + GBool antialiasA) { + antialias = antialiasA; + if (x0 < x1) { + xMin = x0; + xMax = x1; + } else { + xMin = x1; + xMax = x0; + } + if (y0 < y1) { + yMin = y0; + yMax = y1; + } else { + yMin = y1; + yMax = y0; + } + xMinI = splashFloor(xMin); + yMinI = splashFloor(yMin); + xMaxI = splashFloor(xMax); + yMaxI = splashFloor(yMax); + paths = NULL; + flags = NULL; + scanners = NULL; + length = size = 0; +} + +SplashClip::SplashClip(SplashClip *clip) { + int i; + + antialias = clip->antialias; + xMin = clip->xMin; + yMin = clip->yMin; + xMax = clip->xMax; + yMax = clip->yMax; + xMinI = clip->xMinI; + yMinI = clip->yMinI; + xMaxI = clip->xMaxI; + yMaxI = clip->yMaxI; + length = clip->length; + size = clip->size; + paths = (SplashXPath **)gmallocn(size, sizeof(SplashXPath *)); + flags = (Guchar *)gmallocn(size, sizeof(Guchar)); + scanners = (SplashXPathScanner **) + gmallocn(size, sizeof(SplashXPathScanner *)); + for (i = 0; i < length; ++i) { + paths[i] = clip->paths[i]->copy(); + flags[i] = clip->flags[i]; + scanners[i] = new SplashXPathScanner(paths[i], flags[i] & splashClipEO); + } +} + +SplashClip::~SplashClip() { + int i; + + for (i = 0; i < length; ++i) { + delete paths[i]; + delete scanners[i]; + } + gfree(paths); + gfree(flags); + gfree(scanners); +} + +void SplashClip::grow(int nPaths) { + if (length + nPaths > size) { + if (size == 0) { + size = 32; + } + while (size < length + nPaths) { + size *= 2; + } + paths = (SplashXPath **)greallocn(paths, size, sizeof(SplashXPath *)); + flags = (Guchar *)greallocn(flags, size, sizeof(Guchar)); + scanners = (SplashXPathScanner **) + greallocn(scanners, size, sizeof(SplashXPathScanner *)); + } +} + +void SplashClip::resetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + int i; + + for (i = 0; i < length; ++i) { + delete paths[i]; + delete scanners[i]; + } + gfree(paths); + gfree(flags); + gfree(scanners); + paths = NULL; + flags = NULL; + scanners = NULL; + length = size = 0; + + if (x0 < x1) { + xMin = x0; + xMax = x1; + } else { + xMin = x1; + xMax = x0; + } + if (y0 < y1) { + yMin = y0; + yMax = y1; + } else { + yMin = y1; + yMax = y0; + } + xMinI = splashFloor(xMin); + yMinI = splashFloor(yMin); + xMaxI = splashFloor(xMax); + yMaxI = splashFloor(yMax); +} + +SplashError SplashClip::clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + if (x0 < x1) { + if (x0 > xMin) { + xMin = x0; + xMinI = splashFloor(xMin); + } + if (x1 < xMax) { + xMax = x1; + xMaxI = splashFloor(xMax); + } + } else { + if (x1 > xMin) { + xMin = x1; + xMinI = splashFloor(xMin); + } + if (x0 < xMax) { + xMax = x0; + xMaxI = splashFloor(xMax); + } + } + if (y0 < y1) { + if (y0 > yMin) { + yMin = y0; + yMinI = splashFloor(yMin); + } + if (y1 < yMax) { + yMax = y1; + yMaxI = splashFloor(yMax); + } + } else { + if (y1 > yMin) { + yMin = y1; + yMinI = splashFloor(yMin); + } + if (y0 < yMax) { + yMax = y0; + yMaxI = splashFloor(yMax); + } + } + return splashOk; +} + +SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool eo) { + SplashXPath *xPath; + + xPath = new SplashXPath(path, matrix, flatness, gTrue); + + // check for an empty path + if (xPath->length == 0) { + xMax = xMin - 1; + yMax = yMin - 1; + xMaxI = splashFloor(xMax); + yMaxI = splashFloor(yMax); + delete xPath; + + // check for a rectangle + } else if (xPath->length == 4 && + ((xPath->segs[0].x0 == xPath->segs[0].x1 && + xPath->segs[0].x0 == xPath->segs[1].x0 && + xPath->segs[0].x0 == xPath->segs[3].x1 && + xPath->segs[2].x0 == xPath->segs[2].x1 && + xPath->segs[2].x0 == xPath->segs[1].x1 && + xPath->segs[2].x0 == xPath->segs[3].x0 && + xPath->segs[1].y0 == xPath->segs[1].y1 && + xPath->segs[1].y0 == xPath->segs[0].y1 && + xPath->segs[1].y0 == xPath->segs[2].y0 && + xPath->segs[3].y0 == xPath->segs[3].y1 && + xPath->segs[3].y0 == xPath->segs[0].y0 && + xPath->segs[3].y0 == xPath->segs[2].y1) || + (xPath->segs[0].y0 == xPath->segs[0].y1 && + xPath->segs[0].y0 == xPath->segs[1].y0 && + xPath->segs[0].y0 == xPath->segs[3].y1 && + xPath->segs[2].y0 == xPath->segs[2].y1 && + xPath->segs[2].y0 == xPath->segs[1].y1 && + xPath->segs[2].y0 == xPath->segs[3].y0 && + xPath->segs[1].x0 == xPath->segs[1].x1 && + xPath->segs[1].x0 == xPath->segs[0].x1 && + xPath->segs[1].x0 == xPath->segs[2].x0 && + xPath->segs[3].x0 == xPath->segs[3].x1 && + xPath->segs[3].x0 == xPath->segs[0].x0 && + xPath->segs[3].x0 == xPath->segs[2].x1))) { + clipToRect(xPath->segs[0].x0, xPath->segs[0].y0, + xPath->segs[2].x0, xPath->segs[2].y0); + delete xPath; + + } else { + grow(1); + if (antialias) { + xPath->aaScale(); + } + xPath->sort(); + paths[length] = xPath; + flags[length] = eo ? splashClipEO : 0; + scanners[length] = new SplashXPathScanner(xPath, eo); + ++length; + } + + return splashOk; +} + +GBool SplashClip::test(int x, int y) { + int i; + + // check the rectangle + if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) { + return gFalse; + } + + // check the paths + if (antialias) { + for (i = 0; i < length; ++i) { + if (!scanners[i]->test(x * splashAASize, y * splashAASize)) { + return gFalse; + } + } + } else { + for (i = 0; i < length; ++i) { + if (!scanners[i]->test(x, y)) { + return gFalse; + } + } + } + + return gTrue; +} + +SplashClipResult SplashClip::testRect(int rectXMin, int rectYMin, + int rectXMax, int rectYMax) { + // This tests the rectangle: + // x = [rectXMin, rectXMax + 1) (note: rect coords are ints) + // y = [rectYMin, rectYMax + 1) + // against the clipping region: + // x = [xMin, xMax] (note: clipping coords are fp) + // y = [yMin, yMax] + if ((SplashCoord)(rectXMax + 1) <= xMin || (SplashCoord)rectXMin > xMax || + (SplashCoord)(rectYMax + 1) <= yMin || (SplashCoord)rectYMin > yMax) { + return splashClipAllOutside; + } + if ((SplashCoord)rectXMin >= xMin && (SplashCoord)(rectXMax + 1) <= xMax && + (SplashCoord)rectYMin >= yMin && (SplashCoord)(rectYMax + 1) <= yMax && + length == 0) { + return splashClipAllInside; + } + return splashClipPartial; +} + +SplashClipResult SplashClip::testSpan(int spanXMin, int spanXMax, int spanY) { + int i; + + // This tests the rectangle: + // x = [spanXMin, spanXMax + 1) (note: span coords are ints) + // y = [spanY, spanY + 1) + // against the clipping region: + // x = [xMin, xMax] (note: clipping coords are fp) + // y = [yMin, yMax] + if ((SplashCoord)(spanXMax + 1) <= xMin || (SplashCoord)spanXMin > xMax || + (SplashCoord)(spanY + 1) <= yMin || (SplashCoord)spanY > yMax) { + return splashClipAllOutside; + } + if (!((SplashCoord)spanXMin >= xMin && (SplashCoord)(spanXMax + 1) <= xMax && + (SplashCoord)spanY >= yMin && (SplashCoord)(spanY + 1) <= yMax)) { + return splashClipPartial; + } + if (antialias) { + for (i = 0; i < length; ++i) { + if (!scanners[i]->testSpan(spanXMin * splashAASize, + spanXMax * splashAASize + (splashAASize - 1), + spanY * splashAASize)) { + return splashClipPartial; + } + } + } else { + for (i = 0; i < length; ++i) { + if (!scanners[i]->testSpan(spanXMin, spanXMax, spanY)) { + return splashClipPartial; + } + } + } + return splashClipAllInside; +} + +void SplashClip::clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y) { + int xx0, xx1, xx, yy, i; + SplashColorPtr p; + + // zero out pixels with x < xMin + xx0 = *x0 * splashAASize; + xx1 = splashFloor(xMin * splashAASize); + if (xx1 > aaBuf->getWidth()) { + xx1 = aaBuf->getWidth(); + } + if (xx0 < xx1) { + xx0 &= ~7; + for (yy = 0; yy < splashAASize; ++yy) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3); + for (xx = xx0; xx + 7 < xx1; xx += 8) { + *p++ = 0; + } + if (xx < xx1) { + *p &= 0xff >> (xx1 & 7); + } + } + *x0 = splashFloor(xMin); + } + + // zero out pixels with x > xMax + xx0 = splashFloor(xMax * splashAASize) + 1; + if (xx0 < 0) { + xx0 = 0; + } + xx1 = (*x1 + 1) * splashAASize; + if (xx0 < xx1) { + for (yy = 0; yy < splashAASize; ++yy) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3); + xx = xx0; + if (xx & 7) { + *p &= 0xff00 >> (xx & 7); + xx = (xx & ~7) + 8; + ++p; + } + for (; xx < xx1; xx += 8) { + *p++ = 0; + } + } + *x1 = splashFloor(xMax); + } + + // check the paths + for (i = 0; i < length; ++i) { + scanners[i]->clipAALine(aaBuf, x0, x1, y); + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h new file mode 100644 index 000000000..8ae2154bf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h @@ -0,0 +1,107 @@ +//======================================================================== +// +// SplashClip.h +// +//======================================================================== + +#ifndef SPLASHCLIP_H +#define SPLASHCLIP_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" +#include "SplashMath.h" + +class SplashPath; +class SplashXPath; +class SplashXPathScanner; +class SplashBitmap; + +//------------------------------------------------------------------------ + +enum SplashClipResult { + splashClipAllInside, + splashClipAllOutside, + splashClipPartial +}; + +//------------------------------------------------------------------------ +// SplashClip +//------------------------------------------------------------------------ + +class SplashClip { +public: + + // Create a clip, for the given rectangle. + SplashClip(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + GBool antialiasA); + + // Copy a clip. + SplashClip *copy() { return new SplashClip(this); } + + ~SplashClip(); + + // Reset the clip to a rectangle. + void resetToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + + // Intersect the clip with a rectangle. + SplashError clipToRect(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1); + + // Interesect the clip with . + SplashError clipToPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool eo); + + // Returns true if (,) is inside the clip. + GBool test(int x, int y); + + // Tests a rectangle against the clipping region. Returns one of: + // - splashClipAllInside if the entire rectangle is inside the + // clipping region, i.e., all pixels in the rectangle are + // visible + // - splashClipAllOutside if the entire rectangle is outside the + // clipping region, i.e., all the pixels in the rectangle are + // clipped + // - splashClipPartial if the rectangle is part inside and part + // outside the clipping region + SplashClipResult testRect(int rectXMin, int rectYMin, + int rectXMax, int rectYMax); + + // Similar to testRect, but tests a horizontal span. + SplashClipResult testSpan(int spanXMin, int spanXMax, int spanY); + + // Clips an anti-aliased line by setting pixels to zero. On entry, + // all non-zero pixels are between and . This function + // will update and . + void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); + + // Get the rectangle part of the clip region, in integer coordinates. + int getXMinI() { return xMinI; } + int getXMaxI() { return xMaxI; } + int getYMinI() { return yMinI; } + int getYMaxI() { return yMaxI; } + + // Get the number of arbitrary paths used by the clip region. + int getNumPaths() { return length; } + +private: + + SplashClip(SplashClip *clip); + void grow(int nPaths); + + GBool antialias; + SplashCoord xMin, yMin, xMax, yMax; + int xMinI, yMinI, xMaxI, yMaxI; + SplashXPath **paths; + Guchar *flags; + SplashXPathScanner **scanners; + int length, size; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h new file mode 100644 index 000000000..2a70d4b77 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h @@ -0,0 +1,32 @@ +//======================================================================== +// +// SplashErrorCodes.h +// +//======================================================================== + +#ifndef SPLASHERRORCODES_H +#define SPLASHERRORCODES_H + +#include + +//------------------------------------------------------------------------ + +#define splashOk 0 // no error + +#define splashErrNoCurPt 1 // no current point + +#define splashErrEmptyPath 2 // zero points in path + +#define splashErrBogusPath 3 // only one point in subpath + +#define splashErrNoSave 4 // state stack is empty + +#define splashErrOpenFile 5 // couldn't open file + +#define splashErrNoGlyph 6 // couldn't get the requested glyph + +#define splashErrModeMismatch 7 // invalid combination of color modes + +#define splashErrSingularMatrix 8 // matrix is singular + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc new file mode 100644 index 000000000..c46c77038 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc @@ -0,0 +1,379 @@ +//======================================================================== +// +// SplashFTFont.cc +// +//======================================================================== + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include FT_OUTLINE_H +#include FT_SIZES_H +#include FT_GLYPH_H +#include "gmem.h" +#include "SplashMath.h" +#include "SplashGlyphBitmap.h" +#include "SplashPath.h" +#include "SplashFTFontEngine.h" +#include "SplashFTFontFile.h" +#include "SplashFTFont.h" + +//------------------------------------------------------------------------ + +static int glyphPathMoveTo(const FT_Vector *pt, void *path); +static int glyphPathLineTo(const FT_Vector *pt, void *path); +static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt, + void *path); +static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2, + const FT_Vector *pt, void *path); + +//------------------------------------------------------------------------ +// SplashFTFont +//------------------------------------------------------------------------ + +SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA): + SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa) +{ + FT_Face face; + SplashCoord size, div; + int x, y; + + face = fontFileA->face; + + if (FT_New_Size(face, &sizeObj)) { + return; + } + face->size = sizeObj; + size = splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]); + if (FT_Set_Pixel_Sizes(face, 0, (int)size)) { + return; + } + + this->ascender = face->ascender; + this->descender = face->descender; + + // if the textMat values are too small, FreeType's fixed point + // arithmetic doesn't work so well + textScale = splashSqrt(textMat[2]*textMat[2] + textMat[3]*textMat[3]) / size; + + div = face->bbox.xMax > 20000 ? 65536 : 1; + + // transform the four corners of the font bounding box -- the min + // and max values form the bounding box of the transformed font + x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMin) / + (div * face->units_per_EM)); + xMin = xMax = x; + y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMin) / + (div * face->units_per_EM)); + yMin = yMax = y; + x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMin) / + (div * face->units_per_EM)); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMin) / + (div * face->units_per_EM)); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMax) / + (div * face->units_per_EM)); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + // This is a kludge: some buggy PDF generators embed fonts with + // zero bounding boxes. + if (xMax == xMin) { + xMin = 0; + xMax = (int)size; + } + if (yMax == yMin) { + yMin = 0; + yMax = (int)((SplashCoord)1.2 * size); + } + + // compute the transform matrix +#if USE_FIXEDPOINT + matrix.xx = (FT_Fixed)((mat[0] / size).getRaw()); + matrix.yx = (FT_Fixed)((mat[1] / size).getRaw()); + matrix.xy = (FT_Fixed)((mat[2] / size).getRaw()); + matrix.yy = (FT_Fixed)((mat[3] / size).getRaw()); + textMatrix.xx = (FT_Fixed)((textMat[0] / (size * textScale)).getRaw()); + textMatrix.yx = (FT_Fixed)((textMat[1] / (size * textScale)).getRaw()); + textMatrix.xy = (FT_Fixed)((textMat[2] / (size * textScale)).getRaw()); + textMatrix.yy = (FT_Fixed)((textMat[3] / (size * textScale)).getRaw()); +#else + matrix.xx = (FT_Fixed)((mat[0] / size) * 65536); + matrix.yx = (FT_Fixed)((mat[1] / size) * 65536); + matrix.xy = (FT_Fixed)((mat[2] / size) * 65536); + matrix.yy = (FT_Fixed)((mat[3] / size) * 65536); + textMatrix.xx = (FT_Fixed)((textMat[0] / (size * textScale)) * 65536); + textMatrix.yx = (FT_Fixed)((textMat[1] / (size * textScale)) * 65536); + textMatrix.xy = (FT_Fixed)((textMat[2] / (size * textScale)) * 65536); + textMatrix.yy = (FT_Fixed)((textMat[3] / (size * textScale)) * 65536); +#endif +} + +SplashFTFont::~SplashFTFont() { +} + +GBool SplashFTFont::getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap) { + return SplashFont::getGlyph(c, xFrac, 0, bitmap); +} + +GBool SplashFTFont::makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap) { + SplashFTFontFile *ff; + FT_Vector offset; + FT_GlyphSlot slot; + FT_UInt gid; + int rowSize; + Guchar *p, *q; + int i; + + ff = (SplashFTFontFile *)fontFile; + + ff->face->size = sizeObj; + offset.x = (FT_Pos)(int)((SplashCoord)xFrac * splashFontFractionMul * 64); + offset.y = 0; + FT_Set_Transform(ff->face, &matrix, &offset); + slot = ff->face->glyph; + + if (ff->codeToGID && c < ff->codeToGIDLen) { + gid = (FT_UInt)ff->codeToGID[c]; + } else { + gid = (FT_UInt)c; + } + if (ff->trueType && gid == 0) { + // skip the TrueType notdef glyph + return gFalse; + } + + // if we have the FT2 bytecode interpreter, autohinting won't be used +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + if (FT_Load_Glyph(ff->face, gid, + aa ? FT_LOAD_NO_BITMAP : FT_LOAD_DEFAULT)) { + return gFalse; + } +#else + // FT2's autohinting doesn't always work very well (especially with + // font subsets), so turn it off if anti-aliasing is enabled; if + // anti-aliasing is disabled, this seems to be a tossup - some fonts + // look better with hinting, some without, so leave hinting on + if (FT_Load_Glyph(ff->face, gid, + aa ? FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP + : FT_LOAD_DEFAULT)) { + return gFalse; + } +#endif + if (FT_Render_Glyph(slot, aa ? ft_render_mode_normal + : ft_render_mode_mono)) { + return gFalse; + } + + bitmap->x = -slot->bitmap_left; + bitmap->y = slot->bitmap_top; + bitmap->w = slot->bitmap.width; + bitmap->h = slot->bitmap.rows; + bitmap->aa = aa; + if (aa) { + rowSize = bitmap->w; + } else { + rowSize = (bitmap->w + 7) >> 3; + } + bitmap->data = (Guchar *)gmalloc(rowSize * bitmap->h); + bitmap->freeData = gTrue; + for (i = 0, p = bitmap->data, q = slot->bitmap.buffer; + i < bitmap->h; + ++i, p += rowSize, q += slot->bitmap.pitch) { + memcpy(p, q, rowSize); + } + + return gTrue; +} + +struct SplashFTFontPath { + SplashPath *path; + SplashCoord textScale; + GBool needClose; +}; + +int SplashFTFont::getNumChars() +{ + SplashFTFontFile* ff = (SplashFTFontFile *)fontFile; + return ff->face->num_glyphs; +} + +SplashPath *SplashFTFont::getGlyphPath(int c) { + static FT_Outline_Funcs outlineFuncs = { +#if FREETYPE_MINOR <= 1 + (int (*)(FT_Vector *, void *))&glyphPathMoveTo, + (int (*)(FT_Vector *, void *))&glyphPathLineTo, + (int (*)(FT_Vector *, FT_Vector *, void *))&glyphPathConicTo, + (int (*)(FT_Vector *, FT_Vector *, FT_Vector *, void *))&glyphPathCubicTo, +#else + &glyphPathMoveTo, + &glyphPathLineTo, + &glyphPathConicTo, + &glyphPathCubicTo, +#endif + 0, 0 + }; + SplashFTFontFile *ff; + SplashFTFontPath path; + FT_GlyphSlot slot; + FT_UInt gid; + FT_Glyph glyph; + + this->last_advance = -1; + + ff = (SplashFTFontFile *)fontFile; + ff->face->size = sizeObj; + FT_Set_Transform(ff->face, &textMatrix, NULL); + slot = ff->face->glyph; + if (ff->codeToGID && c < ff->codeToGIDLen) { + gid = ff->codeToGID[c]; + } else { + gid = (FT_UInt)c; + } + if (ff->trueType && gid == 0) { + // skip the TrueType notdef glyph + return NULL; + } + int error = 0; + if ((error=FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP))) { + if ((error=FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP|FT_LOAD_NO_HINTING))) { + fprintf(stderr, "Truetype wasn't able to load glyph %d, error %d\n", gid, error); + return NULL; + } + } + if (FT_Get_Glyph(slot, &glyph)) { + return NULL; + } + this->last_advance = glyph->advance.x/65536.0; + + path.path = new SplashPath(); + path.textScale = textScale; + path.needClose = gFalse; + error = FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline, + &outlineFuncs, &path); + if(error) { + fprintf(stderr, "Truetype wasn't able to read glyph %d, error %d\n", gid, error); + } + if (path.needClose) { + path.path->close(); + } + FT_Done_Glyph(glyph); + return path.path; +} + +static int glyphPathMoveTo(const FT_Vector *pt, void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + + if (p->needClose) { + p->path->close(); + p->needClose = gFalse; + } + p->path->moveTo((SplashCoord)pt->x * p->textScale / 64.0, + (SplashCoord)pt->y * p->textScale / 64.0); + return 0; +} + +static int glyphPathLineTo(const FT_Vector *pt, void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + + p->path->lineTo((SplashCoord)pt->x * p->textScale / 64.0, + (SplashCoord)pt->y * p->textScale / 64.0); + p->needClose = gTrue; + return 0; +} + +static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt, + void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xc, yc; + + if (!p->path->getCurPt(&x0, &y0)) { + return 0; + } + xc = (SplashCoord)ctrl->x * p->textScale / 64.0; + yc = (SplashCoord)ctrl->y * p->textScale / 64.0; + x3 = (SplashCoord)pt->x * p->textScale / 64.0; + y3 = (SplashCoord)pt->y * p->textScale / 64.0; + + // A second-order Bezier curve is defined by two endpoints, p0 and + // p3, and one control point, pc: + // + // p(t) = (1-t)^2*p0 + t*(1-t)*pc + t^2*p3 + // + // A third-order Bezier curve is defined by the same two endpoints, + // p0 and p3, and two control points, p1 and p2: + // + // p(t) = (1-t)^3*p0 + 3t*(1-t)^2*p1 + 3t^2*(1-t)*p2 + t^3*p3 + // + // Applying some algebra, we can convert a second-order curve to a + // third-order curve: + // + // p1 = (1/3) * (p0 + 2pc) + // p2 = (1/3) * (2pc + p3) + + x1 = (SplashCoord)(1.0 / 3.0) * (x0 + (SplashCoord)2 * xc); + y1 = (SplashCoord)(1.0 / 3.0) * (y0 + (SplashCoord)2 * yc); + x2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * xc + x3); + y2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * yc + y3); + + p->path->curveTo(x1, y1, x2, y2, x3, y3); + p->needClose = gTrue; + return 0; +} + +static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2, + const FT_Vector *pt, void *path) { + SplashFTFontPath *p = (SplashFTFontPath *)path; + + p->path->curveTo((SplashCoord)ctrl1->x * p->textScale / 64.0, + (SplashCoord)ctrl1->y * p->textScale / 64.0, + (SplashCoord)ctrl2->x * p->textScale / 64.0, + (SplashCoord)ctrl2->y * p->textScale / 64.0, + (SplashCoord)pt->x * p->textScale / 64.0, + (SplashCoord)pt->y * p->textScale / 64.0); + p->needClose = gTrue; + return 0; +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h new file mode 100644 index 000000000..8ca0cd19e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h @@ -0,0 +1,61 @@ +//======================================================================== +// +// SplashFTFont.h +// +//======================================================================== + +#ifndef SPLASHFTFONT_H +#define SPLASHFTFONT_H + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include FT_FREETYPE_H +#include "SplashFont.h" + +class SplashFTFontFile; + +//------------------------------------------------------------------------ +// SplashFTFont +//------------------------------------------------------------------------ + +class SplashFTFont: public SplashFont { +public: + + SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA); + + virtual ~SplashFTFont(); + + // Munge xFrac and yFrac before calling SplashFont::getGlyph. + virtual GBool getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap); + + // Rasterize a glyph. The and values are the same + // as described for getGlyph. + virtual GBool makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap); + + // return the number of characters in this font + virtual int getNumChars(); + + // Return the path for a glyph. + virtual SplashPath *getGlyphPath(int c); + +private: + + FT_Size sizeObj; + FT_Matrix matrix; + FT_Matrix textMatrix; + SplashCoord textScale; +}; + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc new file mode 100644 index 000000000..0e23a7531 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc @@ -0,0 +1,177 @@ +//======================================================================== +// +// SplashFTFontEngine.cc +// +//======================================================================== + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +# include +#include "gmem.h" +#include "GString.h" +#include "gfile.h" +#include "FoFiTrueType.h" +#include "FoFiType1C.h" +#include "SplashFTFontFile.h" +#include "SplashFTFontEngine.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ + +static void fileWrite(void *stream, char *data, int len) { + fwrite(data, 1, len, (FILE *)stream); +} + +//------------------------------------------------------------------------ +// SplashFTFontEngine +//------------------------------------------------------------------------ + +SplashFTFontEngine::SplashFTFontEngine(GBool aaA, FT_Library libA) { + FT_Int major, minor, patch; + + aa = aaA; + lib = libA; + + // as of FT 2.1.8, CID fonts are indexed by CID instead of GID + FT_Library_Version(lib, &major, &minor, &patch); + useCIDs = major > 2 || + (major == 2 && (minor > 1 || (minor == 1 && patch > 7))); +} + +SplashFTFontEngine *SplashFTFontEngine::init(GBool aaA) { + FT_Library libA; + + if (FT_Init_FreeType(&libA)) { + return NULL; + } + return new SplashFTFontEngine(aaA, libA); +} + +SplashFTFontEngine::~SplashFTFontEngine() { + FT_Done_FreeType(lib); +} + +SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc); +} + +SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc); +} + +SplashFontFile *SplashFTFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc); +} + +SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile) { + FoFiType1C *ff; + Gushort *cidToGIDMap; + int nCIDs; + SplashFontFile *ret; + + // check for a CFF font + if (useCIDs) { + cidToGIDMap = NULL; + nCIDs = 0; + } else if ((ff = FoFiType1C::load(fileName))) { + cidToGIDMap = ff->getCIDToGIDMap(&nCIDs); + delete ff; + } else { + cidToGIDMap = NULL; + nCIDs = 0; + } + ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile, + cidToGIDMap, nCIDs); + if (!ret) { + gfree(cidToGIDMap); + } + return ret; +} + +SplashFontFile *SplashFTFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile) { + FoFiTrueType *ff; + GBool isCID; + Gushort *cidToGIDMap; + int nCIDs; + SplashFontFile *ret; + + cidToGIDMap = NULL; + nCIDs = 0; + isCID = gFalse; + if (!useCIDs) { + if ((ff = FoFiTrueType::load(fileName))) { + if (ff->isOpenTypeCFF()) { + cidToGIDMap = ff->getCIDToGIDMap(&nCIDs); + } + delete ff; + } + } + ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile, + cidToGIDMap, nCIDs); + if (!ret) { + gfree(cidToGIDMap); + } + return ret; +} + +SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + Gushort *codeToGID, + int codeToGIDLen) { + FoFiTrueType *ff; + GString *tmpFileName; + FILE *tmpFile; + SplashFontFile *ret; + + if (!(ff = FoFiTrueType::load(fileName))) { + return NULL; + } + tmpFileName = NULL; + if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { + delete ff; + return NULL; + } + ff->writeTTF(&fileWrite, tmpFile); + delete ff; + fclose(tmpFile); + ret = SplashFTFontFile::loadTrueTypeFont(this, idA, + tmpFileName->getCString(), + gTrue, codeToGID, codeToGIDLen); + if (ret) { + if (deleteFile) { + unlink(fileName); + } + } else { + unlink(tmpFileName->getCString()); + } + delete tmpFileName; + return ret; +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h new file mode 100644 index 000000000..b8b9f7fbc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h @@ -0,0 +1,65 @@ +//======================================================================== +// +// SplashFTFontEngine.h +// +//======================================================================== + +#ifndef SPLASHFTFONTENGINE_H +#define SPLASHFTFONTENGINE_H + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include FT_FREETYPE_H +#include "gtypes.h" + +class SplashFontFile; +class SplashFontFileID; + +//------------------------------------------------------------------------ +// SplashFTFontEngine +//------------------------------------------------------------------------ + +class SplashFTFontEngine { +public: + + static SplashFTFontEngine *init(GBool aaA); + + ~SplashFTFontEngine(); + + // Load fonts. + SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile); + SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile); + SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, + Gushort *codeToGID, int codeToGIDLen); + +private: + + SplashFTFontEngine(GBool aaA, FT_Library libA); + + GBool aa; + FT_Library lib; + GBool useCIDs; + + friend class SplashFTFontFile; + friend class SplashFTFont; +}; + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc new file mode 100644 index 000000000..dd3767609 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc @@ -0,0 +1,114 @@ +//======================================================================== +// +// SplashFTFontFile.cc +// +//======================================================================== + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "gmem.h" +#include "SplashFTFontEngine.h" +#include "SplashFTFont.h" +#include "SplashFTFontFile.h" + +//------------------------------------------------------------------------ +// SplashFTFontFile +//------------------------------------------------------------------------ + +SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, + GBool deleteFileA, + char **encA) { + FT_Face faceA; + Gushort *codeToGIDA; + char *name; + int i; + + if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { + return NULL; + } + codeToGIDA = (Gushort *)gmallocn(256, sizeof(int)); + for (i = 0; i < 256; ++i) { + codeToGIDA[i] = 0; + if ((name = encA[i])) { + codeToGIDA[i] = (Gushort)FT_Get_Name_Index(faceA, name); + } + } + + return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA, + faceA, codeToGIDA, 256, gFalse); +} + +SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, + GBool deleteFileA, + Gushort *codeToGIDA, + int codeToGIDLenA) { + FT_Face faceA; + + if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { + return NULL; + } + + return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA, + faceA, codeToGIDA, codeToGIDLenA, gFalse); +} + +SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, + GBool deleteFileA, + Gushort *codeToGIDA, + int codeToGIDLenA) { + FT_Face faceA; + + if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { + return NULL; + } + + return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA, + faceA, codeToGIDA, codeToGIDLenA, gTrue); +} + +SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, GBool deleteFileA, + FT_Face faceA, + Gushort *codeToGIDA, int codeToGIDLenA, + GBool trueTypeA): + SplashFontFile(idA, fileNameA, deleteFileA) +{ + engine = engineA; + face = faceA; + codeToGID = codeToGIDA; + codeToGIDLen = codeToGIDLenA; + trueType = trueTypeA; +} + +SplashFTFontFile::~SplashFTFontFile() { + if (face) { + FT_Done_Face(face); + } + if (codeToGID) { + gfree(codeToGID); + } +} + +SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat, + SplashCoord *textMat) { + SplashFont *font; + + font = new SplashFTFont(this, mat, textMat); + font->initCache(); + return font; +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h new file mode 100644 index 000000000..af6a8a0e0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h @@ -0,0 +1,73 @@ +//======================================================================== +// +// SplashFTFontFile.h +// +//======================================================================== + +#ifndef SPLASHFTFONTFILE_H +#define SPLASHFTFONTFILE_H + +#include + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include FT_FREETYPE_H +#include "SplashFontFile.h" + +class SplashFontFileID; +class SplashFTFontEngine; + +//------------------------------------------------------------------------ +// SplashFTFontFile +//------------------------------------------------------------------------ + +class SplashFTFontFile: public SplashFontFile { +public: + + static SplashFontFile *loadType1Font(SplashFTFontEngine *engineA, + SplashFontFileID *idA, char *fileNameA, + GBool deleteFileA, char **encA); + static SplashFontFile *loadCIDFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, char *fileNameA, + GBool deleteFileA, + Gushort *codeToCIDA, int codeToGIDLenA); + static SplashFontFile *loadTrueTypeFont(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, + GBool deleteFileA, + Gushort *codeToGIDA, + int codeToGIDLenA); + + virtual ~SplashFTFontFile(); + + // Create a new SplashFTFont, i.e., a scaled instance of this font + // file. + virtual SplashFont *makeFont(SplashCoord *mat, + SplashCoord *textMat); + +private: + + SplashFTFontFile(SplashFTFontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, GBool deleteFileA, + FT_Face faceA, + Gushort *codeToGIDA, int codeToGIDLenA, + GBool trueTypeA); + + SplashFTFontEngine *engine; + FT_Face face; + Gushort *codeToGID; + int codeToGIDLen; + GBool trueType; + + friend class SplashFTFont; +}; + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc new file mode 100644 index 000000000..72a8412a1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc @@ -0,0 +1,184 @@ +//======================================================================== +// +// SplashFont.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "SplashMath.h" +#include "SplashGlyphBitmap.h" +#include "SplashFontFile.h" +#include "SplashFont.h" + +//------------------------------------------------------------------------ + +struct SplashFontCacheTag { + int c; + short xFrac, yFrac; // x and y fractions + int mru; // valid bit (0x80000000) and MRU index + int x, y, w, h; // offset and size of glyph +}; + +//------------------------------------------------------------------------ +// SplashFont +//------------------------------------------------------------------------ + +SplashFont::SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA, GBool aaA) { + fontFile = fontFileA; + fontFile->incRefCnt(); + mat[0] = matA[0]; + mat[1] = matA[1]; + mat[2] = matA[2]; + mat[3] = matA[3]; + textMat[0] = textMatA[0]; + textMat[1] = textMatA[1]; + textMat[2] = textMatA[2]; + textMat[3] = textMatA[3]; + aa = aaA; + + cache = NULL; + cacheTags = NULL; + + xMin = yMin = xMax = yMax = 0; + + last_advance = -1; + ascender = -1; + descender = -1; +} + +void SplashFont::initCache() { + int i; + + // this should be (max - min + 1), but we add some padding to + // deal with rounding errors + glyphW = xMax - xMin + 3; + glyphH = yMax - yMin + 3; + if (aa) { + glyphSize = glyphW * glyphH; + } else { + glyphSize = ((glyphW + 7) >> 3) * glyphH; + } + + // set up the glyph pixmap cache + cacheAssoc = 8; + if (glyphSize <= 256) { + cacheSets = 8; + } else if (glyphSize <= 512) { + cacheSets = 4; + } else if (glyphSize <= 1024) { + cacheSets = 2; + } else { + cacheSets = 1; + } + cache = (Guchar *)gmallocn_noexit(cacheSets * cacheAssoc, glyphSize); + if(cache) { + cacheTags = (SplashFontCacheTag *)gmallocn(cacheSets * cacheAssoc, + sizeof(SplashFontCacheTag)); + for (i = 0; i < cacheSets * cacheAssoc; ++i) { + cacheTags[i].mru = i & (cacheAssoc - 1); + } + } else { + cacheAssoc = 0; + } +} + +SplashFont::~SplashFont() { + fontFile->decRefCnt(); + if (cache) { + gfree(cache); + } + if (cacheTags) { + gfree(cacheTags); + } +} + +GBool SplashFont::getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap) { + SplashGlyphBitmap bitmap2; + int size; + Guchar *p; + int i, j, k; + + // no fractional coordinates for large glyphs or non-anti-aliased + // glyphs + if (!aa || glyphH > 50) { + xFrac = yFrac = 0; + } + + // check the cache + i = (c & (cacheSets - 1)) * cacheAssoc; + for (j = 0; j < cacheAssoc; ++j) { + if ((cacheTags[i+j].mru & 0x80000000) && + cacheTags[i+j].c == c && + (int)cacheTags[i+j].xFrac == xFrac && + (int)cacheTags[i+j].yFrac == yFrac) { + bitmap->x = cacheTags[i+j].x; + bitmap->y = cacheTags[i+j].y; + bitmap->w = cacheTags[i+j].w; + bitmap->h = cacheTags[i+j].h; + for (k = 0; k < cacheAssoc; ++k) { + if (k != j && + (cacheTags[i+k].mru & 0x7fffffff) < + (cacheTags[i+j].mru & 0x7fffffff)) { + ++cacheTags[i+k].mru; + } + } + cacheTags[i+j].mru = 0x80000000; + bitmap->aa = aa; + bitmap->data = cache + (i+j) * glyphSize; + bitmap->freeData = gFalse; + return gTrue; + } + } + + // generate the glyph bitmap + if (!makeGlyph(c, xFrac, yFrac, &bitmap2)) { + return gFalse; + } + + // if the glyph doesn't fit in the bounding box, return a temporary + // uncached bitmap + if (bitmap2.w > glyphW || bitmap2.h > glyphH) { + *bitmap = bitmap2; + return gTrue; + } + + // insert glyph pixmap in cache + if (aa) { + size = bitmap2.w * bitmap2.h; + } else { + size = ((bitmap2.w + 7) >> 3) * bitmap2.h; + } + p = NULL; // make gcc happy + for (j = 0; j < cacheAssoc; ++j) { + if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc - 1) { + cacheTags[i+j].mru = 0x80000000; + cacheTags[i+j].c = c; + cacheTags[i+j].xFrac = (short)xFrac; + cacheTags[i+j].yFrac = (short)yFrac; + cacheTags[i+j].x = bitmap2.x; + cacheTags[i+j].y = bitmap2.y; + cacheTags[i+j].w = bitmap2.w; + cacheTags[i+j].h = bitmap2.h; + p = cache + (i+j) * glyphSize; + memcpy(p, bitmap2.data, size); + } else { + ++cacheTags[i+j].mru; + } + } + *bitmap = bitmap2; + bitmap->data = p; + bitmap->freeData = gFalse; + if (bitmap2.freeData) { + gfree(bitmap2.data); + } + return gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h new file mode 100644 index 000000000..3cb167f85 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h @@ -0,0 +1,110 @@ +//======================================================================== +// +// SplashFont.h +// +//======================================================================== + +#ifndef SPLASHFONT_H +#define SPLASHFONT_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "SplashTypes.h" + +struct SplashGlyphBitmap; +struct SplashFontCacheTag; +class SplashFontFile; +class SplashPath; + +//------------------------------------------------------------------------ + +// Fractional positioning uses this many bits to the right of the +// decimal points. +#define splashFontFractionBits 2 +#define splashFontFraction (1 << splashFontFractionBits) +#define splashFontFractionMul \ + ((SplashCoord)1 / (SplashCoord)splashFontFraction) + +//------------------------------------------------------------------------ +// SplashFont +//------------------------------------------------------------------------ + +class SplashFont { +public: + + SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA, GBool aaA); + + // This must be called after the constructor, so that the subclass + // constructor has a chance to compute the bbox. + void initCache(); + + virtual ~SplashFont(); + + SplashFontFile *getFontFile() { return fontFile; } + + // Return true if matches the specified font file and matrix. + GBool matches(SplashFontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA) { + return fontFileA == fontFile && + matA[0] == mat[0] && matA[1] == mat[1] && + matA[2] == mat[2] && matA[3] == mat[3] && + textMatA[0] == textMat[0] && textMatA[1] == textMat[1] && + textMatA[2] == textMat[2] && textMatA[3] == textMat[3]; + } + + // Get a glyph - this does a cache lookup first, and if not found, + // creates a new bitmap and adds it to the cache. The and + // values are splashFontFractionBits bits each, representing + // the numerators of fractions in [0, 1), where the denominator is + // splashFontFraction = 1 << splashFontFractionBits. Subclasses + // should override this to zero out xFrac and/or yFrac if they don't + // support fractional coordinates. + virtual GBool getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap); + + // Rasterize a glyph. The and values are the same + // as described for getGlyph. + virtual GBool makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap) = 0; + + // return the number of characters in this font + virtual int getNumChars() = 0; + + // Return the path for a glyph. + virtual SplashPath *getGlyphPath(int c) = 0; + + // Return the font transform matrix. + SplashCoord *getMatrix() { return mat; } + + // Return the glyph bounding box. + void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + + double ascender; + double descender; + double last_advance; //set after getGlyphPath() +protected: + + SplashFontFile *fontFile; + SplashCoord mat[4]; // font transform matrix + // (text space -> device space) + SplashCoord textMat[4]; // text transform matrix + // (text space -> user space) + GBool aa; // anti-aliasing + int xMin, yMin, xMax, yMax; // glyph bounding box + Guchar *cache; // glyph bitmap cache + SplashFontCacheTag * // cache tags + cacheTags; + int glyphW, glyphH; // size of glyph bitmaps + int glyphSize; // size of glyph bitmaps, in bytes + int cacheSets; // number of sets in cache + int cacheAssoc; // cache associativity (glyphs per set) +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc new file mode 100644 index 000000000..1c090f6e8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc @@ -0,0 +1,317 @@ +//======================================================================== +// +// SplashFontEngine.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#if HAVE_T1LIB_H +#include +#endif + +#include +#include +#ifndef WIN32 +# include +#endif +#include "gmem.h" +#include "GString.h" +#include "SplashMath.h" +#include "SplashT1FontEngine.h" +#include "SplashFTFontEngine.h" +#include "SplashFontFile.h" +#include "SplashFontFileID.h" +#include "SplashFont.h" +#include "SplashFontEngine.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ +// SplashFontEngine +//------------------------------------------------------------------------ + +SplashFontEngine::SplashFontEngine( +#if HAVE_T1LIB_H + GBool enableT1lib, +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + GBool enableFreeType, +#endif + GBool aa) { + int i; + + for (i = 0; i < splashFontCacheSize; ++i) { + fontCache[i] = NULL; + } + +#if HAVE_T1LIB_H + if (enableT1lib) { + t1Engine = SplashT1FontEngine::init(aa); + } else { + t1Engine = NULL; + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (enableFreeType) { + ftEngine = SplashFTFontEngine::init(aa); + } else { + ftEngine = NULL; + } +#endif +} + +SplashFontEngine::~SplashFontEngine() { + int i; + + for (i = 0; i < splashFontCacheSize; ++i) { + if (fontCache[i]) { + delete fontCache[i]; + } + } + +#if HAVE_T1LIB_H + if (t1Engine) { + delete t1Engine; + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (ftEngine) { + delete ftEngine; + } +#endif +} + +SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) { + SplashFontFile *fontFile; + int i; + + for (i = 0; i < splashFontCacheSize; ++i) { + if (fontCache[i]) { + fontFile = fontCache[i]->getFontFile(); + if (fontFile && fontFile->getID()->matches(id)) { + return fontFile; + } + } + } + return NULL; +} + +SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, char **enc) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_T1LIB_H + if (!fontFile && t1Engine) { + fontFile = t1Engine->loadType1Font(idA, fileName, deleteFile, enc); + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadType1Font(idA, fileName, deleteFile, enc); + } +#endif + +#ifndef WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (deleteFile) { + unlink(fontFile ? fontFile->fileName->getCString() : fileName); + } +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_T1LIB_H + if (!fontFile && t1Engine) { + fontFile = t1Engine->loadType1CFont(idA, fileName, deleteFile, enc); + } +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadType1CFont(idA, fileName, deleteFile, enc); + } +#endif + +#ifndef WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (deleteFile) { + unlink(fontFile ? fontFile->fileName->getCString() : fileName); + } +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadOpenTypeT1CFont(idA, fileName, deleteFile, enc); + } +#endif + +#ifndef WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (deleteFile) { + unlink(fontFile ? fontFile->fileName->getCString() : fileName); + } +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadCIDFont(idA, fileName, deleteFile); + } +#endif + +#ifndef WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (deleteFile) { + unlink(fontFile ? fontFile->fileName->getCString() : fileName); + } +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadOpenTypeCFFFont(idA, fileName, deleteFile); + } +#endif + +#ifndef WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (deleteFile) { + unlink(fontFile ? fontFile->fileName->getCString() : fileName); + } +#endif + + return fontFile; +} + +SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + Gushort *codeToGID, + int codeToGIDLen) { + SplashFontFile *fontFile; + + fontFile = NULL; +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + if (!fontFile && ftEngine) { + fontFile = ftEngine->loadTrueTypeFont(idA, fileName, deleteFile, + codeToGID, codeToGIDLen); + } +#endif + + if (!fontFile) { + gfree(codeToGID); + } + +#ifndef WIN32 + // delete the (temporary) font file -- with Unix hard link + // semantics, this will remove the last link; otherwise it will + // return an error, leaving the file to be deleted later (if + // loadXYZFont failed, the file will always be deleted) + if (deleteFile) { + unlink(fontFile ? fontFile->fileName->getCString() : fileName); + } +#endif + + return fontFile; +} + +SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile, + SplashCoord *textMat, + SplashCoord *ctm) { + SplashCoord mat[4]; + SplashFont *font; + int i, j; + + mat[0] = textMat[0] * ctm[0] + textMat[1] * ctm[2]; + mat[1] = -(textMat[0] * ctm[1] + textMat[1] * ctm[3]); + mat[2] = textMat[2] * ctm[0] + textMat[3] * ctm[2]; + mat[3] = -(textMat[2] * ctm[1] + textMat[3] * ctm[3]); + if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.01) { + // avoid a singular (or close-to-singular) matrix + mat[0] = 0.01; mat[1] = 0; + mat[2] = 0; mat[3] = 0.01; + } + + font = fontCache[0]; + if (font && font->matches(fontFile, mat, textMat)) { + return font; + } + for (i = 1; i < splashFontCacheSize; ++i) { + font = fontCache[i]; + if (font && font->matches(fontFile, mat, textMat)) { + for (j = i; j > 0; --j) { + fontCache[j] = fontCache[j-1]; + } + fontCache[0] = font; + return font; + } + } + font = fontFile->makeFont(mat, textMat); + if (fontCache[splashFontCacheSize - 1]) { + delete fontCache[splashFontCacheSize - 1]; + } + for (j = splashFontCacheSize - 1; j > 0; --j) { + fontCache[j] = fontCache[j-1]; + } + fontCache[0] = font; + return font; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h new file mode 100644 index 000000000..6da4a7489 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h @@ -0,0 +1,91 @@ +//======================================================================== +// +// SplashFontEngine.h +// +//======================================================================== + +#ifndef SPLASHFONTENGINE_H +#define SPLASHFONTENGINE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +class SplashT1FontEngine; +class SplashFTFontEngine; +class SplashDTFontEngine; +class SplashDT4FontEngine; +class SplashFontFile; +class SplashFontFileID; +class SplashFont; + +//------------------------------------------------------------------------ + +#define splashFontCacheSize 16 + +//------------------------------------------------------------------------ +// SplashFontEngine +//------------------------------------------------------------------------ + +class SplashFontEngine { +public: + + // Create a font engine. + SplashFontEngine( +#if HAVE_T1LIB_H + GBool enableT1lib, +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + GBool enableFreeType, +#endif + GBool aa); + + ~SplashFontEngine(); + + // Get a font file from the cache. Returns NULL if there is no + // matching entry in the cache. + SplashFontFile *getFontFile(SplashFontFileID *id); + + // Load fonts - these create new SplashFontFile objects. + SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile); + SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile); + SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, + Gushort *codeToGID, int codeToGIDLen); + + // Get a font - this does a cache lookup first, and if not found, + // creates a new SplashFont object and adds it to the cache. The + // matrix, mat = textMat * ctm: + // [ mat[0] mat[1] ] + // [ mat[2] mat[3] ] + // specifies the font transform in PostScript style: + // [x' y'] = [x y] * mat + // Note that the Splash y axis points downward. + SplashFont *getFont(SplashFontFile *fontFile, + SplashCoord *textMat, SplashCoord *ctm); + +private: + + SplashFont *fontCache[splashFontCacheSize]; + +#if HAVE_T1LIB_H + SplashT1FontEngine *t1Engine; +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + SplashFTFontEngine *ftEngine; +#endif +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc new file mode 100644 index 000000000..edeb63eab --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc @@ -0,0 +1,53 @@ +//======================================================================== +// +// SplashFontFile.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "GString.h" +#include "SplashFontFile.h" +#include "SplashFontFileID.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ +// SplashFontFile +//------------------------------------------------------------------------ + +SplashFontFile::SplashFontFile(SplashFontFileID *idA, char *fileNameA, + GBool deleteFileA) { + id = idA; + fileName = new GString(fileNameA); + deleteFile = deleteFileA; + refCnt = 0; +} + +SplashFontFile::~SplashFontFile() { + if (deleteFile) { + unlink(fileName->getCString()); + } + delete fileName; + delete id; +} + +void SplashFontFile::incRefCnt() { + ++refCnt; +} + +void SplashFontFile::decRefCnt() { + if (!--refCnt) { + delete this; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h new file mode 100644 index 000000000..9f8931295 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h @@ -0,0 +1,60 @@ +//======================================================================== +// +// SplashFontFile.h +// +//======================================================================== + +#ifndef SPLASHFONTFILE_H +#define SPLASHFONTFILE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "SplashTypes.h" + +class GString; +class SplashFontEngine; +class SplashFont; +class SplashFontFileID; + +//------------------------------------------------------------------------ +// SplashFontFile +//------------------------------------------------------------------------ + +class SplashFontFile { +public: + + virtual ~SplashFontFile(); + + // Create a new SplashFont, i.e., a scaled instance of this font + // file. + virtual SplashFont *makeFont(SplashCoord *mat, SplashCoord *textMat) = 0; + + // Get the font file ID. + SplashFontFileID *getID() { return id; } + + // Increment the reference count. + void incRefCnt(); + + // Decrement the reference count. If the new value is zero, delete + // the SplashFontFile object. + void decRefCnt(); + +protected: + + SplashFontFile(SplashFontFileID *idA, char *fileNameA, + GBool deleteFileA); + + SplashFontFileID *id; + GString *fileName; + GBool deleteFile; + int refCnt; + + friend class SplashFontEngine; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc new file mode 100644 index 000000000..af37cb2fd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc @@ -0,0 +1,23 @@ +//======================================================================== +// +// SplashFontFileID.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "SplashFontFileID.h" + +//------------------------------------------------------------------------ +// SplashFontFileID +//------------------------------------------------------------------------ + +SplashFontFileID::SplashFontFileID() { +} + +SplashFontFileID::~SplashFontFileID() { +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h new file mode 100644 index 000000000..bed11d336 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h @@ -0,0 +1,30 @@ +//======================================================================== +// +// SplashFontFileID.h +// +//======================================================================== + +#ifndef SPLASHFONTFILEID_H +#define SPLASHFONTFILEID_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +//------------------------------------------------------------------------ +// SplashFontFileID +//------------------------------------------------------------------------ + +class SplashFontFileID { +public: + + SplashFontFileID(); + virtual ~SplashFontFileID(); + virtual GBool matches(SplashFontFileID *id) = 0; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h new file mode 100644 index 000000000..044ba4a66 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h @@ -0,0 +1,26 @@ +//======================================================================== +// +// SplashGlyphBitmap.h +// +//======================================================================== + +#ifndef SPLASHGLYPHBITMAP_H +#define SPLASHGLYPHBITMAP_H + +#include + +#include "gtypes.h" + +//------------------------------------------------------------------------ +// SplashGlyphBitmap +//------------------------------------------------------------------------ + +struct SplashGlyphBitmap { + int x, y, w, h; // offset and size of glyph + GBool aa; // anti-aliased: true means 8-bit alpha + // bitmap; false means 1-bit + Guchar *data; // bitmap data + GBool freeData; // true if data memory should be freed +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h new file mode 100644 index 000000000..1dd60dd05 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h @@ -0,0 +1,89 @@ +//======================================================================== +// +// SplashMath.h +// +//======================================================================== + +#ifndef SPLASHMATH_H +#define SPLASHMATH_H + +#include +#if USE_FIXEDPONT +#include "FixedPoint.h" +#else +#include +#endif +#include "SplashTypes.h" + +static inline SplashCoord splashAbs(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::abs(x); +#else + return fabs(x); +#endif +} + +static inline int splashFloor(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::floor(x); +#else + return (int)floor(x); +#endif +} + +static inline int splashCeil(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::ceil(x); +#else + return (int)ceil(x); +#endif +} + +static inline int splashRound(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::round(x); +#else + return (int)floor(x + 0.5); +#endif +} + +static inline SplashCoord splashSqrt(SplashCoord x) { +#if USE_FIXEDPOINT + return FixedPoint::sqrt(x); +#else + return sqrt(x); +#endif +} + +static inline SplashCoord splashPow(SplashCoord x, SplashCoord y) { +#if USE_FIXEDPOINT + return FixedPoint::pow(x, y); +#else + return pow(x, y); +#endif +} + +static inline SplashCoord splashDist(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1) { + SplashCoord dx, dy; + dx = x1 - x0; + dy = y1 - y0; +#if USE_FIXEDPOINT + // this handles the situation where dx*dx or dy*dy is too large to + // fit in the 16.16 fixed point format + SplashCoord dxa, dya; + dxa = splashAbs(dx); + dya = splashAbs(dy); + if (dxa == 0 && dya == 0) { + return 0; + } else if (dxa > dya) { + return dxa * FixedPoint::sqrt(dya / dxa + 1); + } else { + return dya * FixedPoint::sqrt(dxa / dya + 1); + } +#else + return sqrt(dx * dx + dy * dy); +#endif +} + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc new file mode 100644 index 000000000..2d81faf31 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc @@ -0,0 +1,2846 @@ +//======================================================================== +// +// SplashOutputDev.cc +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include "gfile.h" +#include "GlobalParams.h" +#include "Error.h" +#include "Object.h" +#include "GfxFont.h" +#include "Link.h" +#include "CharCodeToUnicode.h" +#include "FontEncodingTables.h" +#include "FoFiTrueType.h" +#include "SplashBitmap.h" +#include "SplashGlyphBitmap.h" +#include "SplashPattern.h" +#include "SplashScreen.h" +#include "SplashPath.h" +#include "SplashState.h" +#include "SplashErrorCodes.h" +#include "SplashFontEngine.h" +#include "SplashFont.h" +#include "SplashFontFile.h" +#include "SplashFontFileID.h" +#include "Splash.h" +#include "SplashOutputDev.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ + +// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result. +static inline Guchar div255(int x) { + return (Guchar)((x + (x >> 8) + 0x80) >> 8); +} + +//------------------------------------------------------------------------ +// Blend functions +//------------------------------------------------------------------------ + +static void splashOutBlendMultiply(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = (dest[i] * src[i]) / 255; + } +} + +static void splashOutBlendScreen(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] + src[i] - (dest[i] * src[i]) / 255; + } +} + +static void splashOutBlendOverlay(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < 0x80 + ? (src[i] * 2 * dest[i]) / 255 + : 255 - 2 * ((255 - src[i]) * (255 - dest[i])) / 255; + } +} + +static void splashOutBlendDarken(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < src[i] ? dest[i] : src[i]; + } +} + +static void splashOutBlendLighten(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] > src[i] ? dest[i] : src[i]; + } +} + +static void splashOutBlendColorDodge(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int i, x; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + if (src[i] == 255) { + blend[i] = 255; + } else { + x = (dest[i] * 255) / (255 - src[i]); + blend[i] = x <= 255 ? x : 255; + } + } +} + +static void splashOutBlendColorBurn(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i, x; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + if (src[i] == 0) { + blend[i] = 0; + } else { + x = ((255 - dest[i]) * 255) / src[i]; + blend[i] = x <= 255 ? 255 - x : 0; + } + } +} + +static void splashOutBlendHardLight(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = src[i] < 0x80 + ? (dest[i] * 2 * src[i]) / 255 + : 255 - 2 * ((255 - dest[i]) * (255 - src[i])) / 255; + } +} + +static void splashOutBlendSoftLight(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i, x; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + if (src[i] < 0x80) { + blend[i] = dest[i] - (255 - 2 * src[i]) * dest[i] * (255 - dest[i]) / + (255 * 255); + } else { + if (dest[i] < 0x40) { + x = (((((16 * dest[i] - 12 * 255) * dest[i]) / 255) + + 4 * 255) * dest[i]) / 255; + } else { + x = (int)sqrt(255.0 * dest[i]); + } + blend[i] = dest[i] + (2 * src[i] - 255) * (x - dest[i]) / 255; + } + } +} + +static void splashOutBlendDifference(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < src[i] ? src[i] - dest[i] : dest[i] - src[i]; + } +} + +static void splashOutBlendExclusion(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] + src[i] - (2 * dest[i] * src[i]) / 255; + } +} + +static void cvtRGBToHSV(Guchar r, Guchar g, Guchar b, int *h, int *s, int *v) { + int cmax, cmid, cmin, x; + + if (r >= g) { + if (g >= b) { x = 0; cmax = r; cmid = g; cmin = b; } + else if (b >= r) { x = 4; cmax = b; cmid = r; cmin = g; } + else { x = 5; cmax = r; cmid = b; cmin = g; } + } else { + if (r >= b) { x = 1; cmax = g; cmid = r; cmin = b; } + else if (g >= b) { x = 2; cmax = g; cmid = b; cmin = r; } + else { x = 3; cmax = b; cmid = g; cmin = r; } + } + if (cmax == cmin) { + *h = *s = 0; + } else { + *h = x * 60; + if (x & 1) { + *h += ((cmax - cmid) * 60) / (cmax - cmin); + } else { + *h += ((cmid - cmin) * 60) / (cmax - cmin); + } + *s = (255 * (cmax - cmin)) / cmax; + } + *v = cmax; +} + +static void cvtHSVToRGB(int h, int s, int v, Guchar *r, Guchar *g, Guchar *b) { + int x, f, cmax, cmid, cmin; + + if (s == 0) { + *r = *g = *b = v; + } else { + x = h / 60; + f = h % 60; + cmax = v; + if (x & 1) { + cmid = div255(v * 255 - ((s * f) / 60)); + } else { + cmid = div255(v * (255 - ((s * (60 - f)) / 60))); + } + cmin = div255(v * (255 - s)); + switch (x) { + case 0: *r = cmax; *g = cmid; *b = cmin; break; + case 1: *g = cmax; *r = cmid; *b = cmin; break; + case 2: *g = cmax; *b = cmid; *r = cmin; break; + case 3: *b = cmax; *g = cmid; *r = cmin; break; + case 4: *b = cmax; *r = cmid; *g = cmin; break; + case 5: *r = cmax; *b = cmid; *g = cmin; break; + } + } +} + +static void splashOutBlendHue(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int hs, ss, vs, hd, sd, vd; +#if SPLASH_CMYK + Guchar r, g, b; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeRGB8: + case splashModeBGR8: + cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); + cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); + cvtHSVToRGB(hs, sd, vd, &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + //~ (0xff - ...) should be clipped + cvtRGBToHSV(0xff - (src[0] + src[3]), + 0xff - (src[1] + src[3]), + 0xff - (src[2] + src[3]), &hs, &ss, &vs); + cvtRGBToHSV(0xff - (dest[0] + dest[3]), + 0xff - (dest[1] + dest[3]), + 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); + cvtHSVToRGB(hs, sd, vd, &r, &g, &b); + //~ should do black generation + blend[0] = 0xff - r; + blend[1] = 0xff - g; + blend[2] = 0xff - b; + blend[3] = 0; + break; +#endif + } +} + +static void splashOutBlendSaturation(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int hs, ss, vs, hd, sd, vd; +#if SPLASH_CMYK + Guchar r, g, b; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeRGB8: + case splashModeBGR8: + cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); + cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); + cvtHSVToRGB(hd, ss, vd, &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + //~ (0xff - ...) should be clipped + cvtRGBToHSV(0xff - (src[0] + src[3]), + 0xff - (src[1] + src[3]), + 0xff - (src[2] + src[3]), &hs, &ss, &vs); + cvtRGBToHSV(0xff - (dest[0] + dest[3]), + 0xff - (dest[1] + dest[3]), + 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); + cvtHSVToRGB(hd, ss, vd, &r, &g, &b); + //~ should do black generation + blend[0] = 0xff - r; + blend[1] = 0xff - g; + blend[2] = 0xff - b; + blend[3] = 0; + break; +#endif + } +} + +static void splashOutBlendColor(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int hs, ss, vs, hd, sd, vd; +#if SPLASH_CMYK + Guchar r, g, b; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeRGB8: + case splashModeBGR8: + cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); + cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); + cvtHSVToRGB(hs, ss, vd, &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + //~ (0xff - ...) should be clipped + cvtRGBToHSV(0xff - (src[0] + src[3]), + 0xff - (src[1] + src[3]), + 0xff - (src[2] + src[3]), &hs, &ss, &vs); + cvtRGBToHSV(0xff - (dest[0] + dest[3]), + 0xff - (dest[1] + dest[3]), + 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); + cvtHSVToRGB(hs, ss, vd, &r, &g, &b); + //~ should do black generation + blend[0] = 0xff - r; + blend[1] = 0xff - g; + blend[2] = 0xff - b; + blend[3] = 0; + break; +#endif + } +} + +static void splashOutBlendLuminosity(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int hs, ss, vs, hd, sd, vd; +#if SPLASH_CMYK + Guchar r, g, b; +#endif + + switch (cm) { + case splashModeMono1: + case splashModeMono8: + blend[0] = dest[0]; + break; + case splashModeRGB8: + case splashModeBGR8: + cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); + cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); + cvtHSVToRGB(hd, sd, vs, &blend[0], &blend[1], &blend[2]); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + //~ (0xff - ...) should be clipped + cvtRGBToHSV(0xff - (src[0] + src[3]), + 0xff - (src[1] + src[3]), + 0xff - (src[2] + src[3]), &hs, &ss, &vs); + cvtRGBToHSV(0xff - (dest[0] + dest[3]), + 0xff - (dest[1] + dest[3]), + 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); + cvtHSVToRGB(hd, sd, vs, &r, &g, &b); + //~ should do black generation + blend[0] = 0xff - r; + blend[1] = 0xff - g; + blend[2] = 0xff - b; + blend[3] = 0; + break; +#endif + } +} + +// NB: This must match the GfxBlendMode enum defined in GfxState.h. +SplashBlendFunc splashOutBlendFuncs[] = { + NULL, + &splashOutBlendMultiply, + &splashOutBlendScreen, + &splashOutBlendOverlay, + &splashOutBlendDarken, + &splashOutBlendLighten, + &splashOutBlendColorDodge, + &splashOutBlendColorBurn, + &splashOutBlendHardLight, + &splashOutBlendSoftLight, + &splashOutBlendDifference, + &splashOutBlendExclusion, + &splashOutBlendHue, + &splashOutBlendSaturation, + &splashOutBlendColor, + &splashOutBlendLuminosity +}; + +//------------------------------------------------------------------------ +// Font substitutions +//------------------------------------------------------------------------ + +struct SplashOutFontSubst { + char *name; + double mWidth; +}; + +// index: {symbolic:12, fixed:8, serif:4, sans-serif:0} + bold*2 + italic +static SplashOutFontSubst splashOutSubstFonts[16] = { + {"Helvetica", 0.833}, + {"Helvetica-Oblique", 0.833}, + {"Helvetica-Bold", 0.889}, + {"Helvetica-BoldOblique", 0.889}, + {"Times-Roman", 0.788}, + {"Times-Italic", 0.722}, + {"Times-Bold", 0.833}, + {"Times-BoldItalic", 0.778}, + {"Courier", 0.600}, + {"Courier-Oblique", 0.600}, + {"Courier-Bold", 0.600}, + {"Courier-BoldOblique", 0.600}, + {"Symbol", 0.576}, + {"Symbol", 0.576}, + {"Symbol", 0.576}, + {"Symbol", 0.576} +}; + +//------------------------------------------------------------------------ +// SplashOutFontFileID +//------------------------------------------------------------------------ + +class SplashOutFontFileID: public SplashFontFileID { +public: + + SplashOutFontFileID(Ref *rA) { r = *rA; substIdx = -1; } + + ~SplashOutFontFileID() {} + + GBool matches(SplashFontFileID *id) { + return ((SplashOutFontFileID *)id)->r.num == r.num && + ((SplashOutFontFileID *)id)->r.gen == r.gen; + } + + void setSubstIdx(int substIdxA) { substIdx = substIdxA; } + int getSubstIdx() { return substIdx; } + +private: + + Ref r; + int substIdx; +}; + +//------------------------------------------------------------------------ +// T3FontCache +//------------------------------------------------------------------------ + +struct T3FontCacheTag { + Gushort code; + Gushort mru; // valid bit (0x8000) and MRU index +}; + +class T3FontCache { +public: + + T3FontCache(Ref *fontID, double m11A, double m12A, + double m21A, double m22A, + int glyphXA, int glyphYA, int glyphWA, int glyphHA, + GBool aa, GBool validBBoxA); + ~T3FontCache(); + GBool matches(Ref *idA, double m11A, double m12A, + double m21A, double m22A) + { return fontID.num == idA->num && fontID.gen == idA->gen && + m11 == m11A && m12 == m12A && m21 == m21A && m22 == m22A; } + + Ref fontID; // PDF font ID + double m11, m12, m21, m22; // transform matrix + int glyphX, glyphY; // pixel offset of glyph bitmaps + int glyphW, glyphH; // size of glyph bitmaps, in pixels + GBool validBBox; // false if the bbox was [0 0 0 0] + int glyphSize; // size of glyph bitmaps, in bytes + int cacheSets; // number of sets in cache + int cacheAssoc; // cache associativity (glyphs per set) + Guchar *cacheData; // glyph pixmap cache + T3FontCacheTag *cacheTags; // cache tags, i.e., char codes +}; + +T3FontCache::T3FontCache(Ref *fontIDA, double m11A, double m12A, + double m21A, double m22A, + int glyphXA, int glyphYA, int glyphWA, int glyphHA, + GBool validBBoxA, GBool aa) { + int i; + + fontID = *fontIDA; + m11 = m11A; + m12 = m12A; + m21 = m21A; + m22 = m22A; + glyphX = glyphXA; + glyphY = glyphYA; + glyphW = glyphWA; + glyphH = glyphHA; + validBBox = validBBoxA; + if (aa) { + glyphSize = glyphW * glyphH; + } else { + glyphSize = ((glyphW + 7) >> 3) * glyphH; + } + cacheAssoc = 8; + if (glyphSize <= 256) { + cacheSets = 8; + } else if (glyphSize <= 512) { + cacheSets = 4; + } else if (glyphSize <= 1024) { + cacheSets = 2; + } else { + cacheSets = 1; + } + cacheData = (Guchar *)gmallocn(cacheSets * cacheAssoc, glyphSize); + cacheTags = (T3FontCacheTag *)gmallocn(cacheSets * cacheAssoc, + sizeof(T3FontCacheTag)); + for (i = 0; i < cacheSets * cacheAssoc; ++i) { + cacheTags[i].mru = i & (cacheAssoc - 1); + } +} + +T3FontCache::~T3FontCache() { + gfree(cacheData); + gfree(cacheTags); +} + +struct T3GlyphStack { + Gushort code; // character code + + //----- cache info + T3FontCache *cache; // font cache for the current font + T3FontCacheTag *cacheTag; // pointer to cache tag for the glyph + Guchar *cacheData; // pointer to cache data for the glyph + + //----- saved state + SplashBitmap *origBitmap; + Splash *origSplash; + double origCTM4, origCTM5; + + T3GlyphStack *next; // next object on stack +}; + +//------------------------------------------------------------------------ +// SplashTransparencyGroup +//------------------------------------------------------------------------ + +struct SplashTransparencyGroup { + int tx, ty; // translation coordinates + SplashBitmap *tBitmap; // bitmap for transparency group + GfxColorSpace *blendingColorSpace; + GBool isolated; + + //----- saved state + SplashBitmap *origBitmap; + Splash *origSplash; + + SplashTransparencyGroup *next; +}; + +//------------------------------------------------------------------------ +// SplashOutputDev +//------------------------------------------------------------------------ + +SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, + int bitmapRowPadA, + GBool reverseVideoA, + SplashColorPtr paperColorA, + GBool bitmapTopDownA, + GBool allowAntialiasA) { + colorMode = colorModeA; + bitmapRowPad = bitmapRowPadA; + bitmapTopDown = bitmapTopDownA; + allowAntialias = allowAntialiasA; + vectorAntialias = allowAntialias && + globalParams->getVectorAntialias() && + colorMode != splashModeMono1; + setupScreenParams(72.0, 72.0); + reverseVideo = reverseVideoA; + splashColorCopy(paperColor, paperColorA); + + xref = NULL; + + bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + splash = new Splash(bitmap, vectorAntialias, &screenParams); + splash->clear(paperColor, 0); + + fontEngine = NULL; + + nT3Fonts = 0; + t3GlyphStack = NULL; + + font = NULL; + needFontUpdate = gFalse; + textClipPath = NULL; + + transpGroupStack = NULL; +} + +void SplashOutputDev::setupScreenParams(double hDPI, double vDPI) { + screenParams.size = globalParams->getScreenSize(); + screenParams.dotRadius = globalParams->getScreenDotRadius(); + screenParams.gamma = (SplashCoord)globalParams->getScreenGamma(); + screenParams.blackThreshold = + (SplashCoord)globalParams->getScreenBlackThreshold(); + screenParams.whiteThreshold = + (SplashCoord)globalParams->getScreenWhiteThreshold(); + switch (globalParams->getScreenType()) { + case screenDispersed: + screenParams.type = splashScreenDispersed; + if (screenParams.size < 0) { + screenParams.size = 4; + } + break; + case screenClustered: + screenParams.type = splashScreenClustered; + if (screenParams.size < 0) { + screenParams.size = 10; + } + break; + case screenStochasticClustered: + screenParams.type = splashScreenStochasticClustered; + if (screenParams.size < 0) { + screenParams.size = 100; + } + if (screenParams.dotRadius < 0) { + screenParams.dotRadius = 2; + } + break; + case screenUnset: + default: + // use clustered dithering for resolution >= 300 dpi + // (compare to 299.9 to avoid floating point issues) + if (hDPI > 299.9 && vDPI > 299.9) { + screenParams.type = splashScreenStochasticClustered; + if (screenParams.size < 0) { + screenParams.size = 100; + } + if (screenParams.dotRadius < 0) { + screenParams.dotRadius = 2; + } + } else { + screenParams.type = splashScreenDispersed; + if (screenParams.size < 0) { + screenParams.size = 4; + } + } + } +} + +SplashOutputDev::~SplashOutputDev() { + int i; + + for (i = 0; i < nT3Fonts; ++i) { + delete t3FontCache[i]; + } + if (fontEngine) { + delete fontEngine; + } + if (splash) { + delete splash; + } + if (bitmap) { + delete bitmap; + } +} + +void SplashOutputDev::startDoc(XRef *xrefA) { + int i; + + xref = xrefA; + if (fontEngine) { + delete fontEngine; + } + fontEngine = new SplashFontEngine( +#if HAVE_T1LIB_H + globalParams->getEnableT1lib(), +#endif +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + globalParams->getEnableFreeType(), +#endif + allowAntialias && + globalParams->getAntialias() && + colorMode != splashModeMono1); + for (i = 0; i < nT3Fonts; ++i) { + delete t3FontCache[i]; + } + nT3Fonts = 0; +} + +void SplashOutputDev::startPage(int pageNum, GfxState *state) { + int w, h; + double *ctm; + SplashCoord mat[6]; + SplashColor color; + + if (state) { + setupScreenParams(state->getHDPI(), state->getVDPI()); + w = (int)(state->getPageWidth() + 0.5); + if (w <= 0) { + w = 1; + } + h = (int)(state->getPageHeight() + 0.5); + if (h <= 0) { + h = 1; + } + } else { + w = h = 1; + } + if (splash) { + delete splash; + } + if (!bitmap || w != bitmap->getWidth() || h != bitmap->getHeight()) { + if (bitmap) { + delete bitmap; + } + bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + } + splash = new Splash(bitmap, vectorAntialias, &screenParams); + if (state) { + ctm = state->getCTM(); + mat[0] = (SplashCoord)ctm[0]; + mat[1] = (SplashCoord)ctm[1]; + mat[2] = (SplashCoord)ctm[2]; + mat[3] = (SplashCoord)ctm[3]; + mat[4] = (SplashCoord)ctm[4]; + mat[5] = (SplashCoord)ctm[5]; + splash->setMatrix(mat); + } + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + color[0] = 0; + break; + case splashModeRGB8: + case splashModeBGR8: + color[0] = color[1] = color[2] = 0; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + color[0] = color[1] = color[2] = color[3] = 0; + break; +#endif + } + splash->setStrokePattern(new SplashSolidColor(color)); + splash->setFillPattern(new SplashSolidColor(color)); + splash->setLineCap(splashLineCapButt); + splash->setLineJoin(splashLineJoinMiter); + splash->setLineDash(NULL, 0, 0); + splash->setMiterLimit(10); + splash->setFlatness(1); + // the SA parameter supposedly defaults to false, but Acrobat + // apparently hardwires it to true + splash->setStrokeAdjust(globalParams->getStrokeAdjust()); + splash->clear(paperColor, 0); +} + +void SplashOutputDev::endPage() { + if (colorMode != splashModeMono1) { + splash->compositeBackground(paperColor); + } +} + +void SplashOutputDev::saveState(GfxState *state) { + splash->saveState(); +} + +void SplashOutputDev::restoreState(GfxState *state) { + splash->restoreState(); + needFontUpdate = gTrue; +} + +void SplashOutputDev::updateAll(GfxState *state) { + updateLineDash(state); + updateLineJoin(state); + updateLineCap(state); + updateLineWidth(state); + updateFlatness(state); + updateMiterLimit(state); + updateStrokeAdjust(state); + updateFillColor(state); + updateStrokeColor(state); + needFontUpdate = gTrue; +} + +void SplashOutputDev::updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, + double m31, double m32) { + double *ctm; + SplashCoord mat[6]; + + ctm = state->getCTM(); + mat[0] = (SplashCoord)ctm[0]; + mat[1] = (SplashCoord)ctm[1]; + mat[2] = (SplashCoord)ctm[2]; + mat[3] = (SplashCoord)ctm[3]; + mat[4] = (SplashCoord)ctm[4]; + mat[5] = (SplashCoord)ctm[5]; + splash->setMatrix(mat); +} + +void SplashOutputDev::updateLineDash(GfxState *state) { + double *dashPattern; + int dashLength; + double dashStart; + SplashCoord dash[20]; + int i; + + state->getLineDash(&dashPattern, &dashLength, &dashStart); + if (dashLength > 20) { + dashLength = 20; + } + for (i = 0; i < dashLength; ++i) { + dash[i] = (SplashCoord)dashPattern[i]; + if (dash[i] < 0) { + dash[i] = 0; + } + } + splash->setLineDash(dash, dashLength, (SplashCoord)dashStart); +} + +void SplashOutputDev::updateFlatness(GfxState *state) { + splash->setFlatness(state->getFlatness()); +} + +void SplashOutputDev::updateLineJoin(GfxState *state) { + splash->setLineJoin(state->getLineJoin()); +} + +void SplashOutputDev::updateLineCap(GfxState *state) { + splash->setLineCap(state->getLineCap()); +} + +void SplashOutputDev::updateMiterLimit(GfxState *state) { + splash->setMiterLimit(state->getMiterLimit()); +} + +void SplashOutputDev::updateLineWidth(GfxState *state) { + splash->setLineWidth(state->getLineWidth()); +} + +void SplashOutputDev::updateStrokeAdjust(GfxState *state) { +#if 0 // the SA parameter supposedly defaults to false, but Acrobat + // apparently hardwires it to true + splash->setStrokeAdjust(state->getStrokeAdjust()); +#endif +} + +void SplashOutputDev::updateFillColor(GfxState *state) { + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + + state->getFillGray(&gray); + state->getFillRGB(&rgb); +#if SPLASH_CMYK + state->getFillCMYK(&cmyk); + splash->setFillPattern(getColor(gray, &rgb, &cmyk)); +#else + splash->setFillPattern(getColor(gray, &rgb)); +#endif +} + +void SplashOutputDev::updateStrokeColor(GfxState *state) { + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + + state->getStrokeGray(&gray); + state->getStrokeRGB(&rgb); +#if SPLASH_CMYK + state->getStrokeCMYK(&cmyk); + splash->setStrokePattern(getColor(gray, &rgb, &cmyk)); +#else + splash->setStrokePattern(getColor(gray, &rgb)); +#endif +} + +#if SPLASH_CMYK +SplashPattern *SplashOutputDev::getColor(GfxGray gray, GfxRGB *rgb, + GfxCMYK *cmyk) { +#else +SplashPattern *SplashOutputDev::getColor(GfxGray gray, GfxRGB *rgb) { +#endif + SplashPattern *pattern; + SplashColor color; + GfxColorComp r, g, b; + + if (reverseVideo) { + gray = gfxColorComp1 - gray; + r = gfxColorComp1 - rgb->r; + g = gfxColorComp1 - rgb->g; + b = gfxColorComp1 - rgb->b; + } else { + r = rgb->r; + g = rgb->g; + b = rgb->b; + } + + pattern = NULL; // make gcc happy + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + color[0] = colToByte(gray); + pattern = new SplashSolidColor(color); + break; + case splashModeRGB8: + case splashModeBGR8: + color[0] = colToByte(r); + color[1] = colToByte(g); + color[2] = colToByte(b); + pattern = new SplashSolidColor(color); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + color[0] = colToByte(cmyk->c); + color[1] = colToByte(cmyk->m); + color[2] = colToByte(cmyk->y); + color[3] = colToByte(cmyk->k); + pattern = new SplashSolidColor(color); + break; +#endif + } + + return pattern; +} + +void SplashOutputDev::updateBlendMode(GfxState *state) { + splash->setBlendFunc(splashOutBlendFuncs[state->getBlendMode()]); +} + +void SplashOutputDev::updateFillOpacity(GfxState *state) { + splash->setFillAlpha((SplashCoord)state->getFillOpacity()); +} + +void SplashOutputDev::updateStrokeOpacity(GfxState *state) { + splash->setStrokeAlpha((SplashCoord)state->getStrokeOpacity()); +} + +void SplashOutputDev::updateFont(GfxState *state) { + needFontUpdate = gTrue; +} + +void SplashOutputDev::doUpdateFont(GfxState *state) { + GfxFont *gfxFont; + GfxFontType fontType; + SplashOutFontFileID *id; + SplashFontFile *fontFile; + FoFiTrueType *ff; + Ref embRef; + Object refObj, strObj; + GString *tmpFileName, *fileName, *substName; + FILE *tmpFile; + Gushort *codeToGID; + DisplayFontParam *dfp; + CharCodeToUnicode *ctu; + double *textMat; + double m11, m12, m21, m22, w1, w2, fontSize; + SplashCoord mat[4]; + char *name; + Unicode uBuf[8]; + int c, substIdx, n, code, cmap; + + needFontUpdate = gFalse; + font = NULL; + tmpFileName = NULL; + substIdx = -1; + dfp = NULL; + + if (!(gfxFont = state->getFont())) { + goto err1; + } + fontType = gfxFont->getType(); + if (fontType == fontType3) { + goto err1; + } + + // check the font file cache + id = new SplashOutFontFileID(gfxFont->getID()); + if ((fontFile = fontEngine->getFontFile(id))) { + delete id; + + } else { + + // if there is an embedded font, write it to disk + if (gfxFont->getEmbeddedFontID(&embRef)) { + if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { + error(-1, "Couldn't create temporary font file"); + goto err2; + } + refObj.initRef(embRef.num, embRef.gen); + refObj.fetch(xref, &strObj); + refObj.free(); + if (!strObj.isStream()) { + error(-1, "Embedded font object is wrong type"); + strObj.free(); + fclose(tmpFile); + goto err2; + } + strObj.streamReset(); + while ((c = strObj.streamGetChar()) != EOF) { + fputc(c, tmpFile); + } + strObj.streamClose(); + strObj.free(); + fclose(tmpFile); + fileName = tmpFileName; + + // if there is an external font file, use it + } else if (!(fileName = gfxFont->getExtFontFile())) { + + // look for a display font mapping or a substitute font + if (gfxFont->isCIDFont()) { + if (((GfxCIDFont *)gfxFont)->getCollection()) { + dfp = globalParams-> + getDisplayCIDFont(gfxFont->getName(), + ((GfxCIDFont *)gfxFont)->getCollection()); + } + } else { + if (gfxFont->getName()) { + dfp = globalParams->getDisplayFont(gfxFont->getName()); + } + if (!dfp) { + // 8-bit font substitution + if (gfxFont->isFixedWidth()) { + substIdx = 8; + } else if (gfxFont->isSerif()) { + substIdx = 4; + } else { + substIdx = 0; + } + if (gfxFont->isBold()) { + substIdx += 2; + } + if (gfxFont->isItalic()) { + substIdx += 1; + } + substName = new GString(splashOutSubstFonts[substIdx].name); + dfp = globalParams->getDisplayFont(substName); + delete substName; + id->setSubstIdx(substIdx); + } + } + if (!dfp) { + error(-1, "Couldn't find a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + switch (dfp->kind) { + case displayFontT1: + fileName = dfp->t1.fileName; + fontType = gfxFont->isCIDFont() ? fontCIDType0 : fontType1; + break; + case displayFontTT: + fileName = dfp->tt.fileName; + fontType = gfxFont->isCIDFont() ? fontCIDType2 : fontTrueType; + break; + } + } + + // load the font file + switch (fontType) { + case fontType1: + if (!(fontFile = fontEngine->loadType1Font( + id, + fileName->getCString(), + fileName == tmpFileName, + ((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontType1C: + if (!(fontFile = fontEngine->loadType1CFont( + id, + fileName->getCString(), + fileName == tmpFileName, + ((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontType1COT: + if (!(fontFile = fontEngine->loadOpenTypeT1CFont( + id, + fileName->getCString(), + fileName == tmpFileName, + ((Gfx8BitFont *)gfxFont)->getEncoding()))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontTrueType: + case fontTrueTypeOT: + if ((ff = FoFiTrueType::load(fileName->getCString()))) { + codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff); + n = 256; + delete ff; + } else { + codeToGID = NULL; + n = 0; + } + if (!(fontFile = fontEngine->loadTrueTypeFont( + id, + fileName->getCString(), + fileName == tmpFileName, + codeToGID, n))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType0: + case fontCIDType0C: + if (!(fontFile = fontEngine->loadCIDFont( + id, + fileName->getCString(), + fileName == tmpFileName))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType0COT: + if (!(fontFile = fontEngine->loadOpenTypeCFFFont( + id, + fileName->getCString(), + fileName == tmpFileName))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + case fontCIDType2: + case fontCIDType2OT: + codeToGID = NULL; + n = 0; + if (dfp) { + // create a CID-to-GID mapping, via Unicode + if ((ctu = ((GfxCIDFont *)gfxFont)->getToUnicode())) { + if ((ff = FoFiTrueType::load(fileName->getCString()))) { + // look for a Unicode cmap + for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) { + if ((ff->getCmapPlatform(cmap) == 3 && + ff->getCmapEncoding(cmap) == 1) || + ff->getCmapPlatform(cmap) == 0) { + break; + } + } + if (cmap < ff->getNumCmaps()) { + // map CID -> Unicode -> GID + n = ctu->getLength(); + codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort)); + for (code = 0; code < n; ++code) { + if (ctu->mapToUnicode(code, uBuf, 8) > 0) { + codeToGID[code] = ff->mapCodeToGID(cmap, uBuf[0]); + } else { + codeToGID[code] = 0; + } + } + } + delete ff; + } + ctu->decRefCnt(); + } else { + error(-1, "Couldn't find a mapping to Unicode for font '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + } + } else { + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(Gushort)); + } + } + if (!(fontFile = fontEngine->loadTrueTypeFont( + id, + fileName->getCString(), + fileName == tmpFileName, + codeToGID, n))) { + error(-1, "Couldn't create a font for '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + goto err2; + } + break; + default: + // this shouldn't happen + goto err2; + } + } + + // get the font matrix + textMat = state->getTextMat(); + fontSize = state->getFontSize(); + m11 = textMat[0] * fontSize * state->getHorizScaling(); + m12 = textMat[1] * fontSize * state->getHorizScaling(); + m21 = textMat[2] * fontSize; + m22 = textMat[3] * fontSize; + + // for substituted fonts: adjust the font matrix -- compare the + // width of 'm' in the original font and the substituted font + substIdx = ((SplashOutFontFileID *)fontFile->getID())->getSubstIdx(); + if (substIdx >= 0) { + for (code = 0; code < 256; ++code) { + if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) && + name[0] == 'm' && name[1] == '\0') { + break; + } + } + if (code < 256) { + w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code); + w2 = splashOutSubstFonts[substIdx].mWidth; + if (!gfxFont->isSymbolic()) { + // if real font is substantially narrower than substituted + // font, reduce the font size accordingly + if (w1 > 0.01 && w1 < 0.9 * w2) { + w1 /= w2; + m11 *= w1; + m21 *= w1; + } + } + } + } + + // create the scaled font + mat[0] = m11; mat[1] = m12; + mat[2] = m21; mat[3] = m22; + font = fontEngine->getFont(fontFile, mat, splash->getMatrix()); + + if (tmpFileName) { + delete tmpFileName; + } + return; + + err2: + delete id; + err1: + if (tmpFileName) { + unlink(tmpFileName->getCString()); + delete tmpFileName; + } + return; +} + +void SplashOutputDev::stroke(GfxState *state) { + SplashPath *path; + + if (state->getStrokeColorSpace()->isNonMarking()) { + return; + } + path = convertPath(state, state->getPath()); + splash->stroke(path); + delete path; +} + +void SplashOutputDev::fill(GfxState *state) { + SplashPath *path; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + path = convertPath(state, state->getPath()); + splash->fill(path, gFalse); + delete path; +} + +void SplashOutputDev::eoFill(GfxState *state) { + SplashPath *path; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + path = convertPath(state, state->getPath()); + splash->fill(path, gTrue); + delete path; +} + +void SplashOutputDev::clip(GfxState *state) { + SplashPath *path; + + path = convertPath(state, state->getPath()); + splash->clipToPath(path, gFalse); + delete path; +} + +void SplashOutputDev::eoClip(GfxState *state) { + SplashPath *path; + + path = convertPath(state, state->getPath()); + splash->clipToPath(path, gTrue); + delete path; +} + +void SplashOutputDev::clipToStrokePath(GfxState *state) { + SplashPath *path, *path2; + + path = convertPath(state, state->getPath()); + path2 = splash->makeStrokePath(path); + delete path; + splash->clipToPath(path2, gFalse); + delete path2; +} + +SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path) { + SplashPath *sPath; + GfxSubpath *subpath; + int i, j; + + sPath = new SplashPath(); + for (i = 0; i < path->getNumSubpaths(); ++i) { + subpath = path->getSubpath(i); + if (subpath->getNumPoints() > 0) { + sPath->moveTo((SplashCoord)subpath->getX(0), + (SplashCoord)subpath->getY(0)); + j = 1; + while (j < subpath->getNumPoints()) { + if (subpath->getCurve(j)) { + sPath->curveTo((SplashCoord)subpath->getX(j), + (SplashCoord)subpath->getY(j), + (SplashCoord)subpath->getX(j+1), + (SplashCoord)subpath->getY(j+1), + (SplashCoord)subpath->getX(j+2), + (SplashCoord)subpath->getY(j+2)); + j += 3; + } else { + sPath->lineTo((SplashCoord)subpath->getX(j), + (SplashCoord)subpath->getY(j)); + ++j; + } + } + if (subpath->isClosed()) { + sPath->close(); + } + } + } + return sPath; +} + +void SplashOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, + Unicode *u, int uLen) { + SplashPath *path; + int render; + + // check for invisible text -- this is used by Acrobat Capture + render = state->getRender(); + if (render == 3) { + return; + } + + if (needFontUpdate) { + doUpdateFont(state); + } + if (!font) { + return; + } + + x -= originX; + y -= originY; + + // fill + if (!(render & 1)) { + if (!state->getFillColorSpace()->isNonMarking()) { + splash->fillChar((SplashCoord)x, (SplashCoord)y, code, font); + } + } + + // stroke + if ((render & 3) == 1 || (render & 3) == 2) { + if (!state->getStrokeColorSpace()->isNonMarking()) { + if ((path = font->getGlyphPath(code))) { + path->offset((SplashCoord)x, (SplashCoord)y); + splash->stroke(path); + delete path; + } + } + } + + // clip + if (render & 4) { + if ((path = font->getGlyphPath(code))) { + path->offset((SplashCoord)x, (SplashCoord)y); + if (textClipPath) { + textClipPath->append(path); + delete path; + } else { + textClipPath = path; + } + } + } +} + +GBool SplashOutputDev::beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen) { + GfxFont *gfxFont; + Ref *fontID; + double *ctm, *bbox; + T3FontCache *t3Font; + T3GlyphStack *t3gs; + GBool validBBox; + double x1, y1, xMin, yMin, xMax, yMax, xt, yt; + int i, j; + + if (!(gfxFont = state->getFont())) { + return gFalse; + } + fontID = gfxFont->getID(); + ctm = state->getCTM(); + state->transform(0, 0, &xt, &yt); + + // is it the first (MRU) font in the cache? + if (!(nT3Fonts > 0 && + t3FontCache[0]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3]))) { + + // is the font elsewhere in the cache? + for (i = 1; i < nT3Fonts; ++i) { + if (t3FontCache[i]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3])) { + t3Font = t3FontCache[i]; + for (j = i; j > 0; --j) { + t3FontCache[j] = t3FontCache[j - 1]; + } + t3FontCache[0] = t3Font; + break; + } + } + if (i >= nT3Fonts) { + + // create new entry in the font cache + if (nT3Fonts == splashOutT3FontCacheSize) { + delete t3FontCache[nT3Fonts - 1]; + --nT3Fonts; + } + for (j = nT3Fonts; j > 0; --j) { + t3FontCache[j] = t3FontCache[j - 1]; + } + ++nT3Fonts; + bbox = gfxFont->getFontBBox(); + if (bbox[0] == 0 && bbox[1] == 0 && bbox[2] == 0 && bbox[3] == 0) { + // unspecified bounding box -- just take a guess + xMin = xt - 5; + xMax = xMin + 30; + yMax = yt + 15; + yMin = yMax - 45; + validBBox = gFalse; + } else { + state->transform(bbox[0], bbox[1], &x1, &y1); + xMin = xMax = x1; + yMin = yMax = y1; + state->transform(bbox[0], bbox[3], &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(bbox[2], bbox[1], &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(bbox[2], bbox[3], &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + validBBox = gTrue; + } + t3FontCache[0] = new T3FontCache(fontID, ctm[0], ctm[1], ctm[2], ctm[3], + (int)floor(xMin - xt), + (int)floor(yMin - yt), + (int)ceil(xMax) - (int)floor(xMin) + 3, + (int)ceil(yMax) - (int)floor(yMin) + 3, + validBBox, + colorMode != splashModeMono1); + } + } + t3Font = t3FontCache[0]; + + // is the glyph in the cache? + i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; + for (j = 0; j < t3Font->cacheAssoc; ++j) { + if ((t3Font->cacheTags[i+j].mru & 0x8000) && + t3Font->cacheTags[i+j].code == code) { + drawType3Glyph(t3Font, &t3Font->cacheTags[i+j], + t3Font->cacheData + (i+j) * t3Font->glyphSize); + return gTrue; + } + } + + // push a new Type 3 glyph record + t3gs = new T3GlyphStack(); + t3gs->next = t3GlyphStack; + t3GlyphStack = t3gs; + t3GlyphStack->code = code; + t3GlyphStack->cache = t3Font; + t3GlyphStack->cacheTag = NULL; + t3GlyphStack->cacheData = NULL; + + return gFalse; +} + +void SplashOutputDev::endType3Char(GfxState *state) { + T3GlyphStack *t3gs; + double *ctm; + + if (t3GlyphStack->cacheTag) { + memcpy(t3GlyphStack->cacheData, bitmap->getDataPtr(), + t3GlyphStack->cache->glyphSize); + delete bitmap; + delete splash; + bitmap = t3GlyphStack->origBitmap; + splash = t3GlyphStack->origSplash; + ctm = state->getCTM(); + state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], + t3GlyphStack->origCTM4, t3GlyphStack->origCTM5); + updateCTM(state, 0, 0, 0, 0, 0, 0); + drawType3Glyph(t3GlyphStack->cache, + t3GlyphStack->cacheTag, t3GlyphStack->cacheData); + } + t3gs = t3GlyphStack; + t3GlyphStack = t3gs->next; + delete t3gs; +} + +void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) { +} + +void SplashOutputDev::type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury) { + double *ctm; + T3FontCache *t3Font; + SplashColor color; + double xt, yt, xMin, xMax, yMin, yMax, x1, y1; + int i, j; + + t3Font = t3GlyphStack->cache; + + // check for a valid bbox + state->transform(0, 0, &xt, &yt); + state->transform(llx, lly, &x1, &y1); + xMin = xMax = x1; + yMin = yMax = y1; + state->transform(llx, ury, &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(urx, lly, &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + state->transform(urx, ury, &x1, &y1); + if (x1 < xMin) { + xMin = x1; + } else if (x1 > xMax) { + xMax = x1; + } + if (y1 < yMin) { + yMin = y1; + } else if (y1 > yMax) { + yMax = y1; + } + if (xMin - xt < t3Font->glyphX || + yMin - yt < t3Font->glyphY || + xMax - xt > t3Font->glyphX + t3Font->glyphW || + yMax - yt > t3Font->glyphY + t3Font->glyphH) { + if (t3Font->validBBox) { + error(-1, "Bad bounding box in Type 3 glyph"); + } + return; + } + + // allocate a cache entry + i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; + for (j = 0; j < t3Font->cacheAssoc; ++j) { + if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) { + t3Font->cacheTags[i+j].mru = 0x8000; + t3Font->cacheTags[i+j].code = t3GlyphStack->code; + t3GlyphStack->cacheTag = &t3Font->cacheTags[i+j]; + t3GlyphStack->cacheData = t3Font->cacheData + (i+j) * t3Font->glyphSize; + } else { + ++t3Font->cacheTags[i+j].mru; + } + } + + // save state + t3GlyphStack->origBitmap = bitmap; + t3GlyphStack->origSplash = splash; + ctm = state->getCTM(); + t3GlyphStack->origCTM4 = ctm[4]; + t3GlyphStack->origCTM5 = ctm[5]; + + // create the temporary bitmap + if (colorMode == splashModeMono1) { + bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1, + splashModeMono1, gFalse); + splash = new Splash(bitmap, gFalse, + t3GlyphStack->origSplash->getScreen()); + color[0] = 0; + splash->clear(color); + color[0] = 1; + } else { + bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1, + splashModeMono8, gFalse); + splash = new Splash(bitmap, vectorAntialias, + t3GlyphStack->origSplash->getScreen()); + color[0] = 0x00; + splash->clear(color); + color[0] = 0xff; + } + splash->setFillPattern(new SplashSolidColor(color)); + splash->setStrokePattern(new SplashSolidColor(color)); + //~ this should copy other state from t3GlyphStack->origSplash? + state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], + -t3Font->glyphX, -t3Font->glyphY); + updateCTM(state, 0, 0, 0, 0, 0, 0); +} + +void SplashOutputDev::drawType3Glyph(T3FontCache *t3Font, + T3FontCacheTag *tag, Guchar *data) { + SplashGlyphBitmap glyph; + + glyph.x = -t3Font->glyphX; + glyph.y = -t3Font->glyphY; + glyph.w = t3Font->glyphW; + glyph.h = t3Font->glyphH; + glyph.aa = colorMode != splashModeMono1; + glyph.data = data; + glyph.freeData = gFalse; + splash->fillGlyph(0, 0, &glyph); +} + +void SplashOutputDev::endTextObject(GfxState *state) { + if (textClipPath) { + splash->clipToPath(textClipPath, gFalse); + delete textClipPath; + textClipPath = NULL; + } +} + +struct SplashOutImageMaskData { + ImageStream *imgStr; + GBool invert; + int width, height, y; +}; + +GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) { + SplashOutImageMaskData *imgMaskData = (SplashOutImageMaskData *)data; + Guchar *p; + SplashColorPtr q; + int x; + + if (imgMaskData->y == imgMaskData->height) { + return gFalse; + } + for (x = 0, p = imgMaskData->imgStr->getLine(), q = line; + x < imgMaskData->width; + ++x) { + *q++ = *p++ ^ imgMaskData->invert; + } + ++imgMaskData->y; + return gTrue; +} + +void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageMaskData imgMaskData; + + if (state->getFillColorSpace()->isNonMarking()) { + return; + } + + ctm = state->getCTM(); + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + imgMaskData.imgStr = new ImageStream(str, width, 1, 1); + imgMaskData.imgStr->reset(); + imgMaskData.invert = invert ? 0 : 1; + imgMaskData.width = width; + imgMaskData.height = height; + imgMaskData.y = 0; + + splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, + t3GlyphStack != NULL); + if (inlineImg) { + while (imgMaskData.y < height) { + imgMaskData.imgStr->getLine(); + ++imgMaskData.y; + } + } + + delete imgMaskData.imgStr; + str->close(); +} + +struct SplashOutImageData { + ImageStream *imgStr; + GfxImageColorMap *colorMap; + SplashColorPtr lookup; + int *maskColors; + SplashColorMode colorMode; + int width, height, y; +}; + +GBool SplashOutputDev::imageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + Guchar *p; + SplashColorPtr q, col; + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + int nComps, x; + + if (imgData->y == imgData->height) { + return gFalse; + } + + nComps = imgData->colorMap->getNumPixelComps(); + + if (imgData->lookup) { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; + x < imgData->width; + ++x, ++p) { + *q++ = imgData->lookup[*p]; + } + break; + case splashModeRGB8: + case splashModeBGR8: + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; + x < imgData->width; + ++x, ++p) { + col = &imgData->lookup[3 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; + x < imgData->width; + ++x, ++p) { + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + } + break; +#endif + } + } else { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; + x < imgData->width; + ++x, p += nComps) { + imgData->colorMap->getGray(p, &gray); + *q++ = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; + x < imgData->width; + ++x, p += nComps) { + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; + x < imgData->width; + ++x, p += nComps) { + imgData->colorMap->getCMYK(p, &cmyk); + *q++ = colToByte(cmyk.c); + *q++ = colToByte(cmyk.m); + *q++ = colToByte(cmyk.y); + *q++ = colToByte(cmyk.k); + } + break; +#endif + } + } + + ++imgData->y; + return gTrue; +} + +GBool SplashOutputDev::alphaImageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + Guchar *p, *aq; + SplashColorPtr q, col; + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar alpha; + int nComps, x, i; + + if (imgData->y == imgData->height) { + return gFalse; + } + + nComps = imgData->colorMap->getNumPixelComps(); + + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine, aq = alphaLine; + x < imgData->width; + ++x, p += nComps) { + alpha = 0; + for (i = 0; i < nComps; ++i) { + if (p[i] < imgData->maskColors[2*i] || + p[i] > imgData->maskColors[2*i+1]) { + alpha = 0xff; + break; + } + } + if (imgData->lookup) { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + *q++ = imgData->lookup[*p]; + *aq++ = alpha; + break; + case splashModeRGB8: + case splashModeBGR8: + col = &imgData->lookup[3 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *aq++ = alpha; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + *aq++ = alpha; + break; +#endif + } + } else { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData->colorMap->getGray(p, &gray); + *q++ = colToByte(gray); + *aq++ = alpha; + break; + case splashModeRGB8: + case splashModeBGR8: + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + *aq++ = alpha; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData->colorMap->getCMYK(p, &cmyk); + *q++ = colToByte(cmyk.c); + *q++ = colToByte(cmyk.m); + *q++ = colToByte(cmyk.y); + *q++ = colToByte(cmyk.k); + *aq++ = alpha; + break; +#endif + } + } + } + + ++imgData->y; + return gTrue; +} + +void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageData imgData; + SplashColorMode srcMode; + SplashImageSource src; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar pix; + int n, i; + + ctm = state->getCTM(); + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + imgData.imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgData.imgStr->reset(); + imgData.colorMap = colorMap; + imgData.maskColors = maskColors; + imgData.colorMode = colorMode; + imgData.width = width; + imgData.height = height; + imgData.y = 0; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + imgData.lookup = NULL; + if (colorMap->getNumPixelComps() == 1) { + n = 1 << colorMap->getBits(); + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getGray(&pix, &gray); + imgData.lookup[i] = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + imgData.lookup = (SplashColorPtr)gmalloc(3 * n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[3*i] = colToByte(rgb.r); + imgData.lookup[3*i+1] = colToByte(rgb.g); + imgData.lookup[3*i+2] = colToByte(rgb.b); + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData.lookup = (SplashColorPtr)gmalloc(4 * n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getCMYK(&pix, &cmyk); + imgData.lookup[4*i] = colToByte(cmyk.c); + imgData.lookup[4*i+1] = colToByte(cmyk.m); + imgData.lookup[4*i+2] = colToByte(cmyk.y); + imgData.lookup[4*i+3] = colToByte(cmyk.k); + } + break; +#endif + break; + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + src = maskColors ? &alphaImageSrc : &imageSrc; + splash->drawImage(src, &imgData, srcMode, maskColors ? gTrue : gFalse, + width, height, mat); + if (inlineImg) { + while (imgData.y < height) { + imgData.imgStr->getLine(); + ++imgData.y; + } + } + + gfree(imgData.lookup); + delete imgData.imgStr; + str->close(); +} + +struct SplashOutMaskedImageData { + ImageStream *imgStr; + GfxImageColorMap *colorMap; + SplashBitmap *mask; + SplashColorPtr lookup; + SplashColorMode colorMode; + int width, height, y; +}; + +GBool SplashOutputDev::maskedImageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine) { + SplashOutMaskedImageData *imgData = (SplashOutMaskedImageData *)data; + Guchar *p, *aq; + SplashColor maskColor; + SplashColorPtr q, col; + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar alpha; + int nComps, x; + + if (imgData->y == imgData->height) { + return gFalse; + } + + nComps = imgData->colorMap->getNumPixelComps(); + + for (x = 0, p = imgData->imgStr->getLine(), q = colorLine, aq = alphaLine; + x < imgData->width; + ++x, p += nComps) { + imgData->mask->getPixel(x, imgData->y, maskColor); + alpha = maskColor[0] ? 0xff : 0x00; + if (imgData->lookup) { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + *q++ = imgData->lookup[*p]; + *aq++ = alpha; + break; + case splashModeRGB8: + case splashModeBGR8: + col = &imgData->lookup[3 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *aq++ = alpha; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + col = &imgData->lookup[4 * *p]; + *q++ = col[0]; + *q++ = col[1]; + *q++ = col[2]; + *q++ = col[3]; + *aq++ = alpha; + break; +#endif + } + } else { + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData->colorMap->getGray(p, &gray); + *q++ = colToByte(gray); + *aq++ = alpha; + break; + case splashModeRGB8: + case splashModeBGR8: + imgData->colorMap->getRGB(p, &rgb); + *q++ = colToByte(rgb.r); + *q++ = colToByte(rgb.g); + *q++ = colToByte(rgb.b); + *aq++ = alpha; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData->colorMap->getCMYK(p, &cmyk); + *q++ = colToByte(cmyk.c); + *q++ = colToByte(cmyk.m); + *q++ = colToByte(cmyk.y); + *q++ = colToByte(cmyk.k); + *aq++ = alpha; + break; +#endif + } + } + } + + ++imgData->y; + return gTrue; +} + +void SplashOutputDev::drawMaskedImage(GfxState *state, Object *ref, + Stream *str, int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, int maskWidth, + int maskHeight, GBool maskInvert) { + GfxImageColorMap *maskColorMap; + Object maskDecode, decodeLow, decodeHigh; + double *ctm; + SplashCoord mat[6]; + SplashOutMaskedImageData imgData; + SplashOutImageMaskData imgMaskData; + SplashColorMode srcMode; + SplashBitmap *maskBitmap; + Splash *maskSplash; + SplashColor maskColor; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar pix; + int n, i; + + // If the mask is higher resolution than the image, use + // drawSoftMaskedImage() instead. + if (maskWidth > width || maskHeight > height) { + decodeLow.initInt(maskInvert ? 0 : 1); + decodeHigh.initInt(maskInvert ? 1 : 0); + maskDecode.initArray(xref); + maskDecode.arrayAdd(&decodeLow); + maskDecode.arrayAdd(&decodeHigh); + maskColorMap = new GfxImageColorMap(1, &maskDecode, + new GfxDeviceGrayColorSpace()); + maskDecode.free(); + drawSoftMaskedImage(state, ref, str, width, height, colorMap, + maskStr, maskWidth, maskHeight, maskColorMap); + delete maskColorMap; + + } else { + + //----- scale the mask image to the same size as the source image + + mat[0] = (SplashCoord)width; + mat[1] = 0; + mat[2] = 0; + mat[3] = (SplashCoord)height; + mat[4] = 0; + mat[5] = 0; + imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, 1, 1); + imgMaskData.imgStr->reset(); + imgMaskData.invert = maskInvert ? 0 : 1; + imgMaskData.width = maskWidth; + imgMaskData.height = maskHeight; + imgMaskData.y = 0; + maskBitmap = new SplashBitmap(width, height, 1, splashModeMono1, gFalse); + maskSplash = new Splash(maskBitmap, gFalse); + maskColor[0] = 0; + maskSplash->clear(maskColor); + maskColor[0] = 0xff; + maskSplash->setFillPattern(new SplashSolidColor(maskColor)); + maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData, + maskWidth, maskHeight, mat, gFalse); + delete imgMaskData.imgStr; + maskStr->close(); + delete maskSplash; + + //----- draw the source image + + ctm = state->getCTM(); + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + imgData.imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgData.imgStr->reset(); + imgData.colorMap = colorMap; + imgData.mask = maskBitmap; + imgData.colorMode = colorMode; + imgData.width = width; + imgData.height = height; + imgData.y = 0; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + imgData.lookup = NULL; + if (colorMap->getNumPixelComps() == 1) { + n = 1 << colorMap->getBits(); + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getGray(&pix, &gray); + imgData.lookup[i] = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + imgData.lookup = (SplashColorPtr)gmalloc(3 * n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[3*i] = colToByte(rgb.r); + imgData.lookup[3*i+1] = colToByte(rgb.g); + imgData.lookup[3*i+2] = colToByte(rgb.b); + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData.lookup = (SplashColorPtr)gmalloc(4 * n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getCMYK(&pix, &cmyk); + imgData.lookup[4*i] = colToByte(cmyk.c); + imgData.lookup[4*i+1] = colToByte(cmyk.m); + imgData.lookup[4*i+2] = colToByte(cmyk.y); + imgData.lookup[4*i+3] = colToByte(cmyk.k); + } + break; +#endif + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + splash->drawImage(&maskedImageSrc, &imgData, srcMode, gTrue, + width, height, mat); + + delete maskBitmap; + gfree(imgData.lookup); + delete imgData.imgStr; + str->close(); + } +} + +void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, + Stream *str, int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap) { + double *ctm; + SplashCoord mat[6]; + SplashOutImageData imgData; + SplashOutImageData imgMaskData; + SplashColorMode srcMode; + SplashBitmap *maskBitmap; + Splash *maskSplash; + SplashColor maskColor; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + Guchar pix; + int n, i; + + ctm = state->getCTM(); + mat[0] = ctm[0]; + mat[1] = ctm[1]; + mat[2] = -ctm[2]; + mat[3] = -ctm[3]; + mat[4] = ctm[2] + ctm[4]; + mat[5] = ctm[3] + ctm[5]; + + //----- set up the soft mask + + imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, + maskColorMap->getNumPixelComps(), + maskColorMap->getBits()); + imgMaskData.imgStr->reset(); + imgMaskData.colorMap = maskColorMap; + imgMaskData.maskColors = NULL; + imgMaskData.colorMode = splashModeMono8; + imgMaskData.width = maskWidth; + imgMaskData.height = maskHeight; + imgMaskData.y = 0; + n = 1 << maskColorMap->getBits(); + imgMaskData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + maskColorMap->getGray(&pix, &gray); + imgMaskData.lookup[i] = colToByte(gray); + } + maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), + 1, splashModeMono8, gFalse); + maskSplash = new Splash(maskBitmap, vectorAntialias); + maskColor[0] = 0; + maskSplash->clear(maskColor); + maskSplash->drawImage(&imageSrc, &imgMaskData, splashModeMono8, gFalse, + maskWidth, maskHeight, mat); + delete imgMaskData.imgStr; + maskStr->close(); + gfree(imgMaskData.lookup); + delete maskSplash; + splash->setSoftMask(maskBitmap); + + //----- draw the source image + + imgData.imgStr = new ImageStream(str, width, + colorMap->getNumPixelComps(), + colorMap->getBits()); + imgData.imgStr->reset(); + imgData.colorMap = colorMap; + imgData.maskColors = NULL; + imgData.colorMode = colorMode; + imgData.width = width; + imgData.height = height; + imgData.y = 0; + + // special case for one-channel (monochrome/gray/separation) images: + // build a lookup table here + imgData.lookup = NULL; + if (colorMap->getNumPixelComps() == 1) { + n = 1 << colorMap->getBits(); + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData.lookup = (SplashColorPtr)gmalloc(n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getGray(&pix, &gray); + imgData.lookup[i] = colToByte(gray); + } + break; + case splashModeRGB8: + case splashModeBGR8: + imgData.lookup = (SplashColorPtr)gmalloc(3 * n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getRGB(&pix, &rgb); + imgData.lookup[3*i] = colToByte(rgb.r); + imgData.lookup[3*i+1] = colToByte(rgb.g); + imgData.lookup[3*i+2] = colToByte(rgb.b); + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData.lookup = (SplashColorPtr)gmalloc(4 * n); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getCMYK(&pix, &cmyk); + imgData.lookup[4*i] = colToByte(cmyk.c); + imgData.lookup[4*i+1] = colToByte(cmyk.m); + imgData.lookup[4*i+2] = colToByte(cmyk.y); + imgData.lookup[4*i+3] = colToByte(cmyk.k); + } + break; +#endif + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + splash->drawImage(&imageSrc, &imgData, srcMode, gFalse, width, height, mat); + + splash->setSoftMask(NULL); + gfree(imgData.lookup); + delete imgData.imgStr; + str->close(); +} + +void SplashOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask) { + SplashTransparencyGroup *transpGroup; + SplashColor color; + double xMin, yMin, xMax, yMax, x, y; + int tx, ty, w, h; + + // transform the bbox + state->transform(bbox[0], bbox[1], &x, &y); + xMin = xMax = x; + yMin = yMax = y; + state->transform(bbox[0], bbox[3], &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + state->transform(bbox[2], bbox[1], &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + state->transform(bbox[2], bbox[3], &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + tx = (int)floor(xMin); + if (tx < 0) { + tx = 0; + } else if (tx > bitmap->getWidth()) { + tx = bitmap->getWidth(); + } + ty = (int)floor(yMin); + if (ty < 0) { + ty = 0; + } else if (ty > bitmap->getHeight()) { + ty = bitmap->getHeight(); + } + w = (int)ceil(xMax) - tx + 1; + if (tx + w > bitmap->getWidth()) { + w = bitmap->getWidth() - tx; + } + if (w < 1) { + w = 1; + } + h = (int)ceil(yMax) - ty + 1; + if (ty + h > bitmap->getHeight()) { + h = bitmap->getHeight() - ty; + } + if (h < 1) { + h = 1; + } + + // push a new stack entry + transpGroup = new SplashTransparencyGroup(); + transpGroup->tx = tx; + transpGroup->ty = ty; + transpGroup->blendingColorSpace = blendingColorSpace; + transpGroup->isolated = isolated; + transpGroup->next = transpGroupStack; + transpGroupStack = transpGroup; + + // save state + transpGroup->origBitmap = bitmap; + transpGroup->origSplash = splash; + + //~ this ignores the blendingColorSpace arg + + // create the temporary bitmap + bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, gTrue, + bitmapTopDown); + splash = new Splash(bitmap, vectorAntialias, + transpGroup->origSplash->getScreen()); + if (isolated) { + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + color[0] = 0; + break; + case splashModeRGB8: + case splashModeBGR8: + color[0] = color[1] = color[2] = 0; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + color[0] = color[1] = color[2] = color[3] = 0; + break; +#endif + default: + // make gcc happy + break; + } + splash->clear(color, 0); + } else { + splash->blitTransparent(transpGroup->origBitmap, tx, ty, 0, 0, w, h); + splash->setInNonIsolatedGroup(transpGroup->origBitmap, tx, ty); + } + transpGroup->tBitmap = bitmap; + state->shiftCTM(-tx, -ty); + updateCTM(state, 0, 0, 0, 0, 0, 0); +} + +void SplashOutputDev::endTransparencyGroup(GfxState *state) { + double *ctm; + + // restore state + delete splash; + bitmap = transpGroupStack->origBitmap; + splash = transpGroupStack->origSplash; + ctm = state->getCTM(); + state->shiftCTM(transpGroupStack->tx, transpGroupStack->ty); + updateCTM(state, 0, 0, 0, 0, 0, 0); +} + +void SplashOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) { + SplashBitmap *tBitmap; + SplashTransparencyGroup *transpGroup; + GBool isolated; + int tx, ty; + + tx = transpGroupStack->tx; + ty = transpGroupStack->ty; + tBitmap = transpGroupStack->tBitmap; + isolated = transpGroupStack->isolated; + + // paint the transparency group onto the parent bitmap + // - the clip path was set in the parent's state) + splash->composite(tBitmap, 0, 0, tx, ty, + tBitmap->getWidth(), tBitmap->getHeight(), + gFalse, !isolated); + + // pop the stack + transpGroup = transpGroupStack; + transpGroupStack = transpGroup->next; + delete transpGroup; + + delete tBitmap; +} + +void SplashOutputDev::setSoftMask(GfxState *state, double *bbox, + GBool alpha, Function *transferFunc, + GfxColor *backdropColor) { + SplashBitmap *softMask, *tBitmap; + Splash *tSplash; + SplashTransparencyGroup *transpGroup; + SplashColor color; + SplashColorPtr p; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + double lum, lum2; + int tx, ty, x, y; + + tx = transpGroupStack->tx; + ty = transpGroupStack->ty; + tBitmap = transpGroupStack->tBitmap; + + // composite with backdrop color + if (!alpha && colorMode != splashModeMono1) { + //~ need to correctly handle the case where no blending color + //~ space is given + tSplash = new Splash(tBitmap, vectorAntialias, + transpGroupStack->origSplash->getScreen()); + if (transpGroupStack->blendingColorSpace) { + switch (colorMode) { + case splashModeMono1: + // transparency is not supported in mono1 mode + break; + case splashModeMono8: + transpGroupStack->blendingColorSpace->getGray(backdropColor, &gray); + color[0] = colToByte(gray); + tSplash->compositeBackground(color); + break; + case splashModeRGB8: + case splashModeBGR8: + transpGroupStack->blendingColorSpace->getRGB(backdropColor, &rgb); + color[0] = colToByte(rgb.r); + color[1] = colToByte(rgb.g); + color[2] = colToByte(rgb.b); + tSplash->compositeBackground(color); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + transpGroupStack->blendingColorSpace->getCMYK(backdropColor, &cmyk); + color[0] = colToByte(cmyk.c); + color[1] = colToByte(cmyk.m); + color[2] = colToByte(cmyk.y); + color[3] = colToByte(cmyk.k); + tSplash->compositeBackground(color); + break; +#endif + } + delete tSplash; + } + } + + softMask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), + 1, splashModeMono8, gFalse); + memset(softMask->getDataPtr(), 0x00, softMask->getRowSize()*softMask->getHeight()); + p = softMask->getDataPtr() + ty * softMask->getRowSize() + tx; + if (txgetWidth() && tygetHeight()) + for (y = 0; y < tBitmap->getHeight(); ++y) { + for (x = 0; x < tBitmap->getWidth(); ++x) { + tBitmap->getPixel(x, y, color); + if (alpha) { + //~ unimplemented + } else { + // convert to luminosity + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + lum = color[0] / 255.0; + break; + case splashModeRGB8: + case splashModeBGR8: + lum = (0.3 / 255.0) * color[0] + + (0.59 / 255.0) * color[1] + + (0.11 / 255.0) * color[2]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + lum = (1 - color[4] / 255.0) + - (0.3 / 255.0) * color[0] + - (0.59 / 255.0) * color[1] + - (0.11 / 255.0) * color[2]; + if (lum < 0) { + lum = 0; + } + break; +#endif + } + if (transferFunc) { + transferFunc->transform(&lum, &lum2); + } else { + lum2 = lum; + } + p[x] = (int)(lum2 * 255.0 + 0.5); + } + } + p += softMask->getRowSize(); + } + splash->setSoftMask(softMask); + + // pop the stack + transpGroup = transpGroupStack; + transpGroupStack = transpGroup->next; + delete transpGroup; + + delete tBitmap; +} + +void SplashOutputDev::clearSoftMask(GfxState *state) { + splash->setSoftMask(NULL); +} + +void SplashOutputDev::setPaperColor(SplashColorPtr paperColorA) { + splashColorCopy(paperColor, paperColorA); +} + +int SplashOutputDev::getBitmapWidth() { + return bitmap->getWidth(); +} + +int SplashOutputDev::getBitmapHeight() { + return bitmap->getHeight(); +} + +SplashBitmap *SplashOutputDev::takeBitmap() { + SplashBitmap *ret; + + ret = bitmap; + bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + return ret; +} + +void SplashOutputDev::getModRegion(int *xMin, int *yMin, + int *xMax, int *yMax) { + splash->getModRegion(xMin, yMin, xMax, yMax); +} + +void SplashOutputDev::clearModRegion() { + splash->clearModRegion(); +} + +void SplashOutputDev::setFillColor(int r, int g, int b) { + GfxRGB rgb; + GfxGray gray; +#if SPLASH_CMYK + GfxCMYK cmyk; +#endif + + rgb.r = byteToCol(r); + rgb.g = byteToCol(g); + rgb.b = byteToCol(b); + gray = (GfxColorComp)(0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.g + 0.5); + if (gray > gfxColorComp1) { + gray = gfxColorComp1; + } +#if SPLASH_CMYK + cmyk.c = gfxColorComp1 - rgb.r; + cmyk.m = gfxColorComp1 - rgb.g; + cmyk.y = gfxColorComp1 - rgb.b; + cmyk.k = 0; + splash->setFillPattern(getColor(gray, &rgb, &cmyk)); +#else + splash->setFillPattern(getColor(gray, &rgb)); +#endif +} + +SplashFont *SplashOutputDev::getFont(GString *name, double *textMatA) { + DisplayFontParam *dfp; + Ref ref; + SplashOutFontFileID *id; + SplashFontFile *fontFile; + SplashFont *fontObj; + FoFiTrueType *ff; + Gushort *codeToGID; + Unicode u; + SplashCoord textMat[4]; + int cmap, i; + + for (i = 0; i < 16; ++i) { + if (!name->cmp(splashOutSubstFonts[i].name)) { + break; + } + } + if (i == 16) { + return NULL; + } + ref.num = i; + ref.gen = -1; + id = new SplashOutFontFileID(&ref); + + // check the font file cache + if ((fontFile = fontEngine->getFontFile(id))) { + delete id; + + // load the font file + } else { + dfp = globalParams->getDisplayFont(name); + if (dfp && dfp->kind == displayFontT1) { + fontFile = fontEngine->loadType1Font(id, dfp->t1.fileName->getCString(), + gFalse, winAnsiEncoding); + } else if (dfp && dfp->kind == displayFontTT) { + if (!(ff = FoFiTrueType::load(dfp->tt.fileName->getCString()))) { + return NULL; + } + for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) { + if ((ff->getCmapPlatform(cmap) == 3 && + ff->getCmapEncoding(cmap) == 1) || + ff->getCmapPlatform(cmap) == 0) { + break; + } + } + if (cmap == ff->getNumCmaps()) { + delete ff; + return NULL; + } + codeToGID = (Gushort *)gmallocn(256, sizeof(Gushort)); + for (i = 0; i < 256; ++i) { + codeToGID[i] = 0; + if (winAnsiEncoding[i] && + (u = globalParams->mapNameToUnicode(winAnsiEncoding[i]))) { + codeToGID[i] = ff->mapCodeToGID(cmap, u); + } + } + delete ff; + fontFile = fontEngine->loadTrueTypeFont(id, + dfp->tt.fileName->getCString(), + gFalse, codeToGID, 256); + } else { + return NULL; + } + } + + // create the scaled font + textMat[0] = (SplashCoord)textMatA[0]; + textMat[1] = (SplashCoord)textMatA[1]; + textMat[2] = (SplashCoord)textMatA[2]; + textMat[3] = (SplashCoord)textMatA[3]; + fontObj = fontEngine->getFont(fontFile, textMat, splash->getMatrix()); + + return fontObj; +} + +#if 1 //~tmp: turn off anti-aliasing temporarily +GBool SplashOutputDev::getVectorAntialias() { + return splash->getVectorAntialias(); +} + +void SplashOutputDev::setVectorAntialias(GBool vaa) { + splash->setVectorAntialias(vaa); +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h new file mode 100644 index 000000000..1dd610926 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h @@ -0,0 +1,248 @@ +//======================================================================== +// +// SplashOutputDev.h +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef SPLASHOUTPUTDEV_H +#define SPLASHOUTPUTDEV_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "SplashTypes.h" +#include "config.h" +#include "OutputDev.h" +#include "GfxState.h" + +class Gfx8BitFont; +class SplashBitmap; +class Splash; +class SplashPath; +class SplashPattern; +class SplashFontEngine; +class SplashFont; +class T3FontCache; +struct T3FontCacheTag; +struct T3GlyphStack; +struct SplashTransparencyGroup; + +//------------------------------------------------------------------------ + +// number of Type 3 fonts to cache +#define splashOutT3FontCacheSize 8 + +//------------------------------------------------------------------------ +// SplashOutputDev +//------------------------------------------------------------------------ + +class SplashOutputDev: public OutputDev { +public: + + // Constructor. + SplashOutputDev(SplashColorMode colorModeA, int bitmapRowPadA, + GBool reverseVideoA, SplashColorPtr paperColorA, + GBool bitmapTopDownA = gTrue, + GBool allowAntialiasA = gTrue); + + // Destructor. + virtual ~SplashOutputDev(); + + //----- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- save/restore graphics state + virtual void saveState(GfxState *state); + virtual void restoreState(GfxState *state); + + //----- update graphics state + virtual void updateAll(GfxState *state); + virtual void updateCTM(GfxState *state, double m11, double m12, + double m21, double m22, double m31, double m32); + virtual void updateLineDash(GfxState *state); + virtual void updateFlatness(GfxState *state); + virtual void updateLineJoin(GfxState *state); + virtual void updateLineCap(GfxState *state); + virtual void updateMiterLimit(GfxState *state); + virtual void updateLineWidth(GfxState *state); + virtual void updateStrokeAdjust(GfxState *state); + virtual void updateFillColor(GfxState *state); + virtual void updateStrokeColor(GfxState *state); + virtual void updateBlendMode(GfxState *state); + virtual void updateFillOpacity(GfxState *state); + virtual void updateStrokeOpacity(GfxState *state); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + + //----- path clipping + virtual void clip(GfxState *state); + virtual void eoClip(GfxState *state); + virtual void clipToStrokePath(GfxState *state); + + //----- text drawing + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode code, int nBytes, Unicode *u, int uLen); + virtual GBool beginType3Char(GfxState *state, double x, double y, + double dx, double dy, + CharCode code, Unicode *u, int uLen); + virtual void endType3Char(GfxState *state); + virtual void endTextObject(GfxState *state); + + //----- image drawing + virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg); + virtual void drawImage(GfxState *state, Object *ref, Stream *str, + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg); + virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, int maskWidth, int maskHeight, + GBool maskInvert); + virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap); + + //----- Type 3 font operators + virtual void type3D0(GfxState *state, double wx, double wy); + virtual void type3D1(GfxState *state, double wx, double wy, + double llx, double lly, double urx, double ury); + + //----- transparency groups and soft masks + virtual void beginTransparencyGroup(GfxState *state, double *bbox, + GfxColorSpace *blendingColorSpace, + GBool isolated, GBool knockout, + GBool forSoftMask); + virtual void endTransparencyGroup(GfxState *state); + virtual void paintTransparencyGroup(GfxState *state, double *bbox); + virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, + Function *transferFunc, GfxColor *backdropColor); + virtual void clearSoftMask(GfxState *state); + + //----- special access + + // Called to indicate that a new PDF document has been loaded. + void startDoc(XRef *xrefA); + + void setPaperColor(SplashColorPtr paperColorA); + + GBool isReverseVideo() { return reverseVideo; } + void setReverseVideo(GBool reverseVideoA) { reverseVideo = reverseVideoA; } + + // Get the bitmap and its size. + SplashBitmap *getBitmap() { return bitmap; } + int getBitmapWidth(); + int getBitmapHeight(); + + // Returns the last rasterized bitmap, transferring ownership to the + // caller. + SplashBitmap *takeBitmap(); + + // Get the Splash object. + Splash *getSplash() { return splash; } + + // Get the modified region. + void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax); + + // Clear the modified region. + void clearModRegion(); + + // Set the Splash fill color. + void setFillColor(int r, int g, int b); + + // Get a font object for a Base-14 font, using the Latin-1 encoding. + SplashFont *getFont(GString *name, double *textMatA); + + SplashFont *getCurrentFont() { return font; } + +#if 1 //~tmp: turn off anti-aliasing temporarily + virtual GBool getVectorAntialias(); + virtual void setVectorAntialias(GBool vaa); +#endif + + void doUpdateFont(GfxState *state); + GBool needFontUpdate; // set when the font needs to be updated + + SplashPath *convertPath(GfxState *state, GfxPath *path); +private: + + void setupScreenParams(double hDPI, double vDPI); +#if SPLASH_CMYK + SplashPattern *getColor(GfxGray gray, GfxRGB *rgb, GfxCMYK *cmyk); +#else + SplashPattern *getColor(GfxGray gray, GfxRGB *rgb); +#endif + void drawType3Glyph(T3FontCache *t3Font, + T3FontCacheTag *tag, Guchar *data); + static GBool imageMaskSrc(void *data, SplashColorPtr line); + static GBool imageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine); + static GBool alphaImageSrc(void *data, SplashColorPtr line, + Guchar *alphaLine); + static GBool maskedImageSrc(void *data, SplashColorPtr line, + Guchar *alphaLine); + + SplashColorMode colorMode; + int bitmapRowPad; + GBool bitmapTopDown; + GBool allowAntialias; + GBool vectorAntialias; + GBool reverseVideo; // reverse video mode + SplashColor paperColor; // paper color + SplashScreenParams screenParams; + + XRef *xref; // xref table for current document + + SplashBitmap *bitmap; + Splash *splash; + SplashFontEngine *fontEngine; + + T3FontCache * // Type 3 font cache + t3FontCache[splashOutT3FontCacheSize]; + int nT3Fonts; // number of valid entries in t3FontCache + T3GlyphStack *t3GlyphStack; // Type 3 glyph context stack + + SplashFont *font; // current font + SplashPath *textClipPath; // clipping path built with text object + + SplashTransparencyGroup * // transparency group stack + transpGroupStack; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc new file mode 100644 index 000000000..e3a89271f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc @@ -0,0 +1,184 @@ +//======================================================================== +// +// SplashPath.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "SplashErrorCodes.h" +#include "SplashPath.h" + +//------------------------------------------------------------------------ +// SplashPath +//------------------------------------------------------------------------ + +// A path can be in three possible states: +// +// 1. no current point -- zero or more finished subpaths +// [curSubpath == length] +// +// 2. one point in subpath +// [curSubpath == length - 1] +// +// 3. open subpath with two or more points +// [curSubpath < length - 1] + +SplashPath::SplashPath() { + pts = NULL; + flags = NULL; + length = size = 0; + curSubpath = 0; + hints = NULL; + hintsLength = hintsSize = 0; +} + +SplashPath::SplashPath(SplashPath *path) { + length = path->length; + size = path->size; + pts = (SplashPathPoint *)gmallocn(size, sizeof(SplashPathPoint)); + flags = (Guchar *)gmallocn(size, sizeof(Guchar)); + memcpy(pts, path->pts, length * sizeof(SplashPathPoint)); + memcpy(flags, path->flags, length * sizeof(Guchar)); + curSubpath = path->curSubpath; + if (path->hints) { + hintsLength = hintsSize = path->hintsLength; + hints = (SplashPathHint *)gmallocn(hintsSize, sizeof(SplashPathHint)); + memcpy(hints, path->hints, hintsLength * sizeof(SplashPathHint)); + } else { + hints = NULL; + } +} + +SplashPath::~SplashPath() { + gfree(pts); + gfree(flags); + gfree(hints); +} + +// Add space for more points. +void SplashPath::grow(int nPts) { + if (length + nPts > size) { + if (size == 0) { + size = 32; + } + while (size < length + nPts) { + size *= 2; + } + pts = (SplashPathPoint *)greallocn(pts, size, sizeof(SplashPathPoint)); + flags = (Guchar *)greallocn(flags, size, sizeof(Guchar)); + } +} + +void SplashPath::append(SplashPath *path) { + int i; + + curSubpath = length + path->curSubpath; + grow(path->length); + for (i = 0; i < path->length; ++i) { + pts[length] = path->pts[i]; + flags[length] = path->flags[i]; + ++length; + } +} + +SplashError SplashPath::moveTo(SplashCoord x, SplashCoord y) { + if (onePointSubpath()) { + return splashErrBogusPath; + } + grow(1); + pts[length].x = x; + pts[length].y = y; + flags[length] = splashPathFirst | splashPathLast; + curSubpath = length++; + return splashOk; +} + +SplashError SplashPath::lineTo(SplashCoord x, SplashCoord y) { + if (noCurrentPoint()) { + return splashErrNoCurPt; + } + flags[length-1] &= ~splashPathLast; + grow(1); + pts[length].x = x; + pts[length].y = y; + flags[length] = splashPathLast; + ++length; + return splashOk; +} + +SplashError SplashPath::curveTo(SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3) { + if (noCurrentPoint()) { + return splashErrNoCurPt; + } + flags[length-1] &= ~splashPathLast; + grow(3); + pts[length].x = x1; + pts[length].y = y1; + flags[length] = splashPathCurve; + ++length; + pts[length].x = x2; + pts[length].y = y2; + flags[length] = splashPathCurve; + ++length; + pts[length].x = x3; + pts[length].y = y3; + flags[length] = splashPathLast; + ++length; + return splashOk; +} + +SplashError SplashPath::close() { + if (noCurrentPoint()) { + return splashErrNoCurPt; + } + if (curSubpath == length - 1 || + pts[length - 1].x != pts[curSubpath].x || + pts[length - 1].y != pts[curSubpath].y) { + lineTo(pts[curSubpath].x, pts[curSubpath].y); + } + flags[curSubpath] |= splashPathClosed; + flags[length - 1] |= splashPathClosed; + curSubpath = length; + return splashOk; +} + +void SplashPath::addStrokeAdjustHint(int ctrl0, int ctrl1, + int firstPt, int lastPt) { + if (hintsLength == hintsSize) { + hintsSize = hintsLength ? 2 * hintsLength : 8; + hints = (SplashPathHint *)greallocn(hints, hintsSize, + sizeof(SplashPathHint)); + } + hints[hintsLength].ctrl0 = ctrl0; + hints[hintsLength].ctrl1 = ctrl1; + hints[hintsLength].firstPt = firstPt; + hints[hintsLength].lastPt = lastPt; + ++hintsLength; +} + +void SplashPath::offset(SplashCoord dx, SplashCoord dy) { + int i; + + for (i = 0; i < length; ++i) { + pts[i].x += dx; + pts[i].y += dy; + } +} + +GBool SplashPath::getCurPt(SplashCoord *x, SplashCoord *y) { + if (noCurrentPoint()) { + return gFalse; + } + *x = pts[length - 1].x; + *y = pts[length - 1].y; + return gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h new file mode 100644 index 000000000..b63ee5df8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h @@ -0,0 +1,121 @@ +//======================================================================== +// +// SplashPath.h +// +//======================================================================== + +#ifndef SPLASHPATH_H +#define SPLASHPATH_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +//------------------------------------------------------------------------ +// SplashPathPoint +//------------------------------------------------------------------------ + +struct SplashPathPoint { + SplashCoord x, y; +}; + +//------------------------------------------------------------------------ +// SplashPath.flags +//------------------------------------------------------------------------ + +// first point on each subpath sets this flag +#define splashPathFirst 0x01 + +// last point on each subpath sets this flag +#define splashPathLast 0x02 + +// if the subpath is closed, its first and last points must be +// identical, and must set this flag +#define splashPathClosed 0x04 + +// curve control points set this flag +#define splashPathCurve 0x08 + +//------------------------------------------------------------------------ +// SplashPathHint +//------------------------------------------------------------------------ + +struct SplashPathHint { + int ctrl0, ctrl1; + int firstPt, lastPt; +}; + +//------------------------------------------------------------------------ +// SplashPath +//------------------------------------------------------------------------ + +class SplashPath { +public: + + // Create an empty path. + SplashPath(); + + // Copy a path. + SplashPath *copy() { return new SplashPath(this); } + + ~SplashPath(); + + // Append to . + void append(SplashPath *path); + + // Start a new subpath. + SplashError moveTo(SplashCoord x, SplashCoord y); + + // Add a line segment to the last subpath. + SplashError lineTo(SplashCoord x, SplashCoord y); + + // Add a third-order (cubic) Bezier curve segment to the last + // subpath. + SplashError curveTo(SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3); + + // Close the last subpath, adding a line segment if necessary. + SplashError close(); + + // Add a stroke adjustment hint. The controlling segments are + // and (where segments are identified by their first + // point), and the points to be adjusted are .. . + void addStrokeAdjustHint(int ctrl0, int ctrl1, int firstPt, int lastPt); + + // Add (, ) to every point on this path. + void offset(SplashCoord dx, SplashCoord dy); + + // Get the points on the path. + int getLength() { return length; } + void getPoint(int i, double *x, double *y, Guchar *f) + { *x = pts[i].x; *y = pts[i].y; *f = flags[i]; } + + // Get the current point. + GBool getCurPt(SplashCoord *x, SplashCoord *y); + +private: + + SplashPath(SplashPath *path); + void grow(int nPts); + GBool noCurrentPoint() { return curSubpath == length; } + GBool onePointSubpath() { return curSubpath == length - 1; } + GBool openSubpath() { return curSubpath < length - 1; } + + SplashPathPoint *pts; // array of points + Guchar *flags; // array of flags + int length, size; // length/size of the pts and flags arrays + int curSubpath; // index of first point in last subpath + + SplashPathHint *hints; // list of hints + int hintsLength, hintsSize; + + friend class SplashXPath; + friend class Splash; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc new file mode 100644 index 000000000..b77658ef4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc @@ -0,0 +1,40 @@ +//======================================================================== +// +// SplashPattern.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "SplashMath.h" +#include "SplashScreen.h" +#include "SplashPattern.h" + +//------------------------------------------------------------------------ +// SplashPattern +//------------------------------------------------------------------------ + +SplashPattern::SplashPattern() { +} + +SplashPattern::~SplashPattern() { +} + +//------------------------------------------------------------------------ +// SplashSolidColor +//------------------------------------------------------------------------ + +SplashSolidColor::SplashSolidColor(SplashColorPtr colorA) { + splashColorCopy(color, colorA); +} + +SplashSolidColor::~SplashSolidColor() { +} + +void SplashSolidColor::getColor(int x, int y, SplashColorPtr c) { + splashColorCopy(c, color); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h new file mode 100644 index 000000000..0a02e9c29 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h @@ -0,0 +1,65 @@ +//======================================================================== +// +// SplashPattern.h +// +//======================================================================== + +#ifndef SPLASHPATTERN_H +#define SPLASHPATTERN_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashScreen; + +//------------------------------------------------------------------------ +// SplashPattern +//------------------------------------------------------------------------ + +class SplashPattern { +public: + + SplashPattern(); + + virtual SplashPattern *copy() = 0; + + virtual ~SplashPattern(); + + // Return the color value for a specific pixel. + virtual void getColor(int x, int y, SplashColorPtr c) = 0; + + // Returns true if this pattern object will return the same color + // value for all pixels. + virtual GBool isStatic() = 0; + +private: +}; + +//------------------------------------------------------------------------ +// SplashSolidColor +//------------------------------------------------------------------------ + +class SplashSolidColor: public SplashPattern { +public: + + SplashSolidColor(SplashColorPtr colorA); + + virtual SplashPattern *copy() { return new SplashSolidColor(color); } + + virtual ~SplashSolidColor(); + + virtual void getColor(int x, int y, SplashColorPtr c); + + virtual GBool isStatic() { return gTrue; } + +private: + + SplashColor color; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc new file mode 100644 index 000000000..af082f8d7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc @@ -0,0 +1,385 @@ +//======================================================================== +// +// SplashScreen.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashMath.h" +#include "SplashScreen.h" + +//------------------------------------------------------------------------ + +static SplashScreenParams defaultParams = { + splashScreenDispersed, // type + 2, // size + 2, // dotRadius + 1.0, // gamma + 0.0, // blackThreshold + 1.0 // whiteThreshold +}; + +//------------------------------------------------------------------------ + +struct SplashScreenPoint { + int x, y; + int dist; +}; + +static int cmpDistances(const void *p0, const void *p1) { + return ((SplashScreenPoint *)p0)->dist - ((SplashScreenPoint *)p1)->dist; +} + +//------------------------------------------------------------------------ +// SplashScreen +//------------------------------------------------------------------------ + +// If is true, this generates a 45 degree screen using a +// circular dot spot function. DPI = resolution / ((size / 2) * +// sqrt(2)). If is false, this generates an optimal +// threshold matrix using recursive tesselation. Gamma correction +// (gamma = 1 / 1.33) is also computed here. +SplashScreen::SplashScreen(SplashScreenParams *params) { + Guchar u, black, white; + int i; + + if (!params) { + params = &defaultParams; + } + + switch (params->type) { + + case splashScreenDispersed: + // size must be a power of 2 + for (size = 1; size < params->size; size <<= 1) ; + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + buildDispersedMatrix(size/2, size/2, 1, size/2, 1); + break; + + case splashScreenClustered: + // size must be even + size = (params->size >> 1) << 1; + if (size < 2) { + size = 2; + } + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + buildClusteredMatrix(); + break; + + case splashScreenStochasticClustered: + // size must be at least 2*r + if (params->size < 2 * params->dotRadius) { + size = 2 * params->dotRadius; + } else { + size = params->size; + } + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + buildSCDMatrix(params->dotRadius); + break; + } + + // do gamma correction and compute minVal/maxVal + minVal = 255; + maxVal = 0; + black = splashRound((SplashCoord)255.0 * params->blackThreshold); + if (black < 1) { + black = 1; + } + white = splashRound((SplashCoord)255.0 * params->whiteThreshold); + if (white > 255) { + white = 255; + } + for (i = 0; i < size * size; ++i) { + u = splashRound((SplashCoord)255.0 * + splashPow((SplashCoord)mat[i] / 255.0, params->gamma)); + if (u < black) { + u = black; + } else if (u >= white) { + u = white; + } + mat[i] = u; + if (u < minVal) { + minVal = u; + } else if (u > maxVal) { + maxVal = u; + } + } +} + +void SplashScreen::buildDispersedMatrix(int i, int j, int val, + int delta, int offset) { + if (delta == 0) { + // map values in [1, size^2] --> [1, 255] + mat[i * size + j] = 1 + (254 * (val - 1)) / (size * size - 1); + } else { + buildDispersedMatrix(i, j, + val, delta / 2, 4*offset); + buildDispersedMatrix((i + delta) % size, (j + delta) % size, + val + offset, delta / 2, 4*offset); + buildDispersedMatrix((i + delta) % size, j, + val + 2*offset, delta / 2, 4*offset); + buildDispersedMatrix((i + 2*delta) % size, (j + delta) % size, + val + 3*offset, delta / 2, 4*offset); + } +} + +void SplashScreen::buildClusteredMatrix() { + SplashCoord *dist; + SplashCoord u, v, d; + Guchar val; + int size2, x, y, x1, y1, i; + + size2 = size >> 1; + + // initialize the threshold matrix + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + mat[y * size + x] = 0; + } + } + + // build the distance matrix + dist = (SplashCoord *)gmallocn(size * size2, sizeof(SplashCoord)); + for (y = 0; y < size2; ++y) { + for (x = 0; x < size2; ++x) { + if (x + y < size2 - 1) { + u = (SplashCoord)x + 0.5 - 0; + v = (SplashCoord)y + 0.5 - 0; + } else { + u = (SplashCoord)x + 0.5 - (SplashCoord)size2; + v = (SplashCoord)y + 0.5 - (SplashCoord)size2; + } + dist[y * size2 + x] = u*u + v*v; + } + } + for (y = 0; y < size2; ++y) { + for (x = 0; x < size2; ++x) { + if (x < y) { + u = (SplashCoord)x + 0.5 - 0; + v = (SplashCoord)y + 0.5 - (SplashCoord)size2; + } else { + u = (SplashCoord)x + 0.5 - (SplashCoord)size2; + v = (SplashCoord)y + 0.5 - 0; + } + dist[(size2 + y) * size2 + x] = u*u + v*v; + } + } + + // build the threshold matrix + minVal = 1; + maxVal = 0; + x1 = y1 = 0; // make gcc happy + for (i = 0; i < size * size2; ++i) { + d = -1; + for (y = 0; y < size; ++y) { + for (x = 0; x < size2; ++x) { + if (mat[y * size + x] == 0 && + dist[y * size2 + x] > d) { + x1 = x; + y1 = y; + d = dist[y1 * size2 + x1]; + } + } + } + // map values in [0, 2*size*size2-1] --> [1, 255] + val = 1 + (254 * (2*i)) / (2*size*size2 - 1); + mat[y1 * size + x1] = val; + val = 1 + (254 * (2*i+1)) / (2*size*size2 - 1); + if (y1 < size2) { + mat[(y1 + size2) * size + x1 + size2] = val; + } else { + mat[(y1 - size2) * size + x1 + size2] = val; + } + } + + gfree(dist); +} + +// Compute the distance between two points on a toroid. +int SplashScreen::distance(int x0, int y0, int x1, int y1) { + int dx0, dx1, dx, dy0, dy1, dy; + + dx0 = abs(x0 - x1); + dx1 = size - dx0; + dx = dx0 < dx1 ? dx0 : dx1; + dy0 = abs(y0 - y1); + dy1 = size - dy0; + dy = dy0 < dy1 ? dy0 : dy1; + return dx * dx + dy * dy; +} + +// Algorithm taken from: +// Victor Ostromoukhov and Roger D. Hersch, "Stochastic Clustered-Dot +// Dithering" in Color Imaging: Device-Independent Color, Color +// Hardcopy, and Graphic Arts IV, SPIE Vol. 3648, pp. 496-505, 1999. +void SplashScreen::buildSCDMatrix(int r) { + SplashScreenPoint *dots, *pts; + int dotsLen, dotsSize; + char *tmpl; + char *grid; + int *region, *dist; + int x, y, xx, yy, x0, x1, y0, y1, i, j, d, iMin, dMin, n; + + //~ this should probably happen somewhere else + srand(123); + + // generate the random space-filling curve + pts = (SplashScreenPoint *)gmallocn(size * size, sizeof(SplashScreenPoint)); + i = 0; + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + pts[i].x = x; + pts[i].y = y; + ++i; + } + } + for (i = 0; i < size * size; ++i) { + j = i + (int)((double)(size * size - i) * + (double)rand() / ((double)RAND_MAX + 1.0)); + x = pts[i].x; + y = pts[i].y; + pts[i].x = pts[j].x; + pts[i].y = pts[j].y; + pts[j].x = x; + pts[j].y = y; + } + + // construct the circle template + tmpl = (char *)gmallocn((r+1)*(r+1), sizeof(char)); + for (y = 0; y <= r; ++y) { + for (x = 0; x <= r; ++x) { + tmpl[y*(r+1) + x] = (x * y <= r * r) ? 1 : 0; + } + } + + // mark all grid cells as free + grid = (char *)gmallocn(size * size, sizeof(char)); + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + grid[y*size + x] = 0; + } + } + + // walk the space-filling curve, adding dots + dotsLen = 0; + dotsSize = 32; + dots = (SplashScreenPoint *)gmallocn(dotsSize, sizeof(SplashScreenPoint)); + for (i = 0; i < size * size; ++i) { + x = pts[i].x; + y = pts[i].y; + if (!grid[y*size + x]) { + if (dotsLen == dotsSize) { + dotsSize *= 2; + dots = (SplashScreenPoint *)greallocn(dots, dotsSize, + sizeof(SplashScreenPoint)); + } + dots[dotsLen++] = pts[i]; + for (yy = 0; yy <= r; ++yy) { + y0 = (y + yy) % size; + y1 = (y - yy + size) % size; + for (xx = 0; xx <= r; ++xx) { + if (tmpl[yy*(r+1) + xx]) { + x0 = (x + xx) % size; + x1 = (x - xx + size) % size; + grid[y0*size + x0] = 1; + grid[y0*size + x1] = 1; + grid[y1*size + x0] = 1; + grid[y1*size + x1] = 1; + } + } + } + } + } + + gfree(tmpl); + gfree(grid); + + // assign each cell to a dot, compute distance to center of dot + region = (int *)gmallocn(size * size, sizeof(int)); + dist = (int *)gmallocn(size * size, sizeof(int)); + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + iMin = 0; + dMin = distance(dots[0].x, dots[0].y, x, y); + for (i = 1; i < dotsLen; ++i) { + d = distance(dots[i].x, dots[i].y, x, y); + if (d < dMin) { + iMin = i; + dMin = d; + } + } + region[y*size + x] = iMin; + dist[y*size + x] = dMin; + } + } + + // compute threshold values + for (i = 0; i < dotsLen; ++i) { + n = 0; + for (y = 0; y < size; ++y) { + for (x = 0; x < size; ++x) { + if (region[y*size + x] == i) { + pts[n].x = x; + pts[n].y = y; + pts[n].dist = distance(dots[i].x, dots[i].y, x, y); + ++n; + } + } + } + qsort(pts, n, sizeof(SplashScreenPoint), &cmpDistances); + for (j = 0; j < n; ++j) { + // map values in [0 .. n-1] --> [255 .. 1] + mat[pts[j].y * size + pts[j].x] = 255 - (254 * j) / (n - 1); + } + } + + gfree(pts); + gfree(region); + gfree(dist); + + gfree(dots); +} + +SplashScreen::SplashScreen(SplashScreen *screen) { + size = screen->size; + mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); + memcpy(mat, screen->mat, size * size * sizeof(Guchar)); + minVal = screen->minVal; + maxVal = screen->maxVal; +} + +SplashScreen::~SplashScreen() { + gfree(mat); +} + +int SplashScreen::test(int x, int y, Guchar value) { + int xx, yy; + + return 1; + + if (value < minVal) { + return 0; + } + if (value >= maxVal) { + return 1; + } + if ((xx = x % size) < 0) { + xx = -xx; + } + if ((yy = y % size) < 0) { + yy = -yy; + } + return value < mat[yy * size + xx] ? 0 : 1; +} + +GBool SplashScreen::isStatic(Guchar value) { + return value < minVal || value >= maxVal; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h new file mode 100644 index 000000000..2baa9b5d7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h @@ -0,0 +1,56 @@ +//======================================================================== +// +// SplashScreen.h +// +//======================================================================== + +#ifndef SPLASHSCREEN_H +#define SPLASHSCREEN_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +//------------------------------------------------------------------------ +// SplashScreen +//------------------------------------------------------------------------ + +class SplashScreen { +public: + + SplashScreen(SplashScreenParams *params); + SplashScreen(SplashScreen *screen); + ~SplashScreen(); + + SplashScreen *copy() { return new SplashScreen(this); } + + // Return the computed pixel value (0=black, 1=white) for the gray + // level at (, ). + int test(int x, int y, Guchar value); + + // Returns true if value is above the white threshold or below the + // black threshold, i.e., if the corresponding halftone will be + // solid white or black. + GBool isStatic(Guchar value); + +private: + + void buildDispersedMatrix(int i, int j, int val, + int delta, int offset); + void buildClusteredMatrix(); + int distance(int x0, int y0, int x1, int y1); + void buildSCDMatrix(int r); + + Guchar *mat; // threshold matrix + int size; // size of the threshold matrix + Guchar minVal; // any pixel value below minVal generates + // solid black + Guchar maxVal; // any pixel value above maxVal generates + // solid white +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc new file mode 100644 index 000000000..e2c34c442 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc @@ -0,0 +1,165 @@ +//======================================================================== +// +// SplashState.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include "gmem.h" +#include "SplashPattern.h" +#include "SplashScreen.h" +#include "SplashClip.h" +#include "SplashBitmap.h" +#include "SplashState.h" + +//------------------------------------------------------------------------ +// SplashState +//------------------------------------------------------------------------ + +// number of components in each color mode +int splashColorModeNComps[] = { + 1, 1, 3, 3, 4 +}; + +SplashState::SplashState(int width, int height, GBool vectorAntialias, + SplashScreenParams *screenParams) { + SplashColor color; + + matrix[0] = 1; matrix[1] = 0; + matrix[2] = 0; matrix[3] = 1; + matrix[4] = 0; matrix[5] = 0; + memset(&color, 0, sizeof(SplashColor)); + strokePattern = new SplashSolidColor(color); + fillPattern = new SplashSolidColor(color); + screen = new SplashScreen(screenParams); + blendFunc = NULL; + strokeAlpha = 1; + fillAlpha = 1; + lineWidth = 0; + lineCap = splashLineCapButt; + lineJoin = splashLineJoinMiter; + miterLimit = 10; + flatness = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashPhase = 0; + strokeAdjust = gFalse; + clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias); + softMask = NULL; + deleteSoftMask = gFalse; + inNonIsolatedGroup = gFalse; + next = NULL; +} + +SplashState::SplashState(int width, int height, GBool vectorAntialias, + SplashScreen *screenA) { + SplashColor color; + + matrix[0] = 1; matrix[1] = 0; + matrix[2] = 0; matrix[3] = 1; + matrix[4] = 0; matrix[5] = 0; + memset(&color, 0, sizeof(SplashColor)); + strokePattern = new SplashSolidColor(color); + fillPattern = new SplashSolidColor(color); + screen = screenA->copy(); + blendFunc = NULL; + strokeAlpha = 1; + fillAlpha = 1; + lineWidth = 0; + lineCap = splashLineCapButt; + lineJoin = splashLineJoinMiter; + miterLimit = 10; + flatness = 1; + lineDash = NULL; + lineDashLength = 0; + lineDashPhase = 0; + strokeAdjust = gFalse; + clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias); + softMask = NULL; + deleteSoftMask = gFalse; + inNonIsolatedGroup = gFalse; + next = NULL; +} + +SplashState::SplashState(SplashState *state) { + memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord)); + strokePattern = state->strokePattern->copy(); + fillPattern = state->fillPattern->copy(); + screen = state->screen->copy(); + blendFunc = state->blendFunc; + strokeAlpha = state->strokeAlpha; + fillAlpha = state->fillAlpha; + lineWidth = state->lineWidth; + lineCap = state->lineCap; + lineJoin = state->lineJoin; + miterLimit = state->miterLimit; + flatness = state->flatness; + if (state->lineDash) { + lineDashLength = state->lineDashLength; + lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord)); + memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord)); + } else { + lineDash = NULL; + lineDashLength = 0; + } + lineDashPhase = state->lineDashPhase; + strokeAdjust = state->strokeAdjust; + clip = state->clip->copy(); + softMask = state->softMask; + deleteSoftMask = gFalse; + inNonIsolatedGroup = state->inNonIsolatedGroup; + next = NULL; +} + +SplashState::~SplashState() { + delete strokePattern; + delete fillPattern; + delete screen; + gfree(lineDash); + delete clip; + if (deleteSoftMask && softMask) { + delete softMask; + } +} + +void SplashState::setStrokePattern(SplashPattern *strokePatternA) { + delete strokePattern; + strokePattern = strokePatternA; +} + +void SplashState::setFillPattern(SplashPattern *fillPatternA) { + delete fillPattern; + fillPattern = fillPatternA; +} + +void SplashState::setScreen(SplashScreen *screenA) { + delete screen; + screen = screenA; +} + +void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA, + SplashCoord lineDashPhaseA) { + gfree(lineDash); + lineDashLength = lineDashLengthA; + if (lineDashLength > 0) { + lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord)); + memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord)); + } else { + lineDash = NULL; + } + lineDashPhase = lineDashPhaseA; +} + +void SplashState::setSoftMask(SplashBitmap *softMaskA) { + if (deleteSoftMask) { + delete softMask; + } + softMask = softMaskA; + deleteSoftMask = gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h new file mode 100644 index 000000000..1f5a88da2 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h @@ -0,0 +1,103 @@ +//======================================================================== +// +// SplashState.h +// +//======================================================================== + +#ifndef SPLASHSTATE_H +#define SPLASHSTATE_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashPattern; +class SplashScreen; +class SplashClip; +class SplashBitmap; + +//------------------------------------------------------------------------ +// line cap values +//------------------------------------------------------------------------ + +#define splashLineCapButt 0 +#define splashLineCapRound 1 +#define splashLineCapProjecting 2 + +//------------------------------------------------------------------------ +// line join values +//------------------------------------------------------------------------ + +#define splashLineJoinMiter 0 +#define splashLineJoinRound 1 +#define splashLineJoinBevel 2 + +//------------------------------------------------------------------------ +// SplashState +//------------------------------------------------------------------------ + +class SplashState { +public: + + // Create a new state object, initialized with default settings. + SplashState(int width, int height, GBool vectorAntialias, + SplashScreenParams *screenParams); + SplashState(int width, int height, GBool vectorAntialias, + SplashScreen *screenA); + + // Copy a state object. + SplashState *copy() { return new SplashState(this); } + + ~SplashState(); + + // Set the stroke pattern. This does not copy . + void setStrokePattern(SplashPattern *strokePatternA); + + // Set the fill pattern. This does not copy . + void setFillPattern(SplashPattern *fillPatternA); + + // Set the screen. This does not copy . + void setScreen(SplashScreen *screenA); + + // Set the line dash pattern. This copies the array. + void setLineDash(SplashCoord *lineDashA, int lineDashLengthA, + SplashCoord lineDashPhaseA); + + // Set the soft mask bitmap. + void setSoftMask(SplashBitmap *softMaskA); + +private: + + SplashState(SplashState *state); + + SplashCoord matrix[6]; + SplashPattern *strokePattern; + SplashPattern *fillPattern; + SplashScreen *screen; + SplashBlendFunc blendFunc; + SplashCoord strokeAlpha; + SplashCoord fillAlpha; + SplashCoord lineWidth; + int lineCap; + int lineJoin; + SplashCoord miterLimit; + SplashCoord flatness; + SplashCoord *lineDash; + int lineDashLength; + SplashCoord lineDashPhase; + GBool strokeAdjust; + SplashClip *clip; + SplashBitmap *softMask; + GBool deleteSoftMask; + GBool inNonIsolatedGroup; + + SplashState *next; // used by Splash class + + friend class Splash; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc new file mode 100644 index 000000000..8219596c6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc @@ -0,0 +1,287 @@ +//======================================================================== +// +// SplashT1Font.cc +// +//======================================================================== + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashMath.h" +#include "SplashGlyphBitmap.h" +#include "SplashPath.h" +#include "SplashT1FontEngine.h" +#include "SplashT1FontFile.h" +#include "SplashT1Font.h" + +//------------------------------------------------------------------------ + +static Guchar bitReverse[256] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff +}; + +//------------------------------------------------------------------------ +// SplashT1Font +//------------------------------------------------------------------------ + +SplashT1Font::SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA): + SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa) +{ + T1_TMATRIX matrix; + BBox bbox; + SplashCoord bbx0, bby0, bbx1, bby1; + int x, y; + + t1libID = T1_CopyFont(fontFileA->t1libID); + outlineID = -1; + + // compute font size + size = (float)splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]); + + // transform the four corners of the font bounding box -- the min + // and max values form the bounding box of the transformed font + bbox = T1_GetFontBBox(t1libID); + bbx0 = 0.001 * bbox.llx; + bby0 = 0.001 * bbox.lly; + bbx1 = 0.001 * bbox.urx; + bby1 = 0.001 * bbox.ury; + // some fonts are completely broken, so we fake it (with values + // large enough that most glyphs should fit) + if (bbx0 == 0 && bby0 == 0 && bbx1 == 0 && bby1 == 0) { + bbx0 = bby0 = -0.5; + bbx1 = bby1 = 1.5; + } + x = (int)(mat[0] * bbx0 + mat[2] * bby0); + xMin = xMax = x; + y = (int)(mat[1] * bbx0 + mat[3] * bby0); + yMin = yMax = y; + x = (int)(mat[0] * bbx0 + mat[2] * bby1); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * bbx0 + mat[3] * bby1); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)(mat[0] * bbx1 + mat[2] * bby0); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * bbx1 + mat[3] * bby0); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + x = (int)(mat[0] * bbx1 + mat[2] * bby1); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + y = (int)(mat[1] * bbx1 + mat[3] * bby1); + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + // This is a kludge: some buggy PDF generators embed fonts with + // zero bounding boxes. + if (xMax == xMin) { + xMin = 0; + xMax = (int)size; + } + if (yMax == yMin) { + yMin = 0; + yMax = (int)(1.2 * size); + } + // Another kludge: an unusually large xMin or yMin coordinate is + // probably wrong. + if (xMin > 0) { + xMin = 0; + } + if (yMin > 0) { + yMin = 0; + } + // Another kludge: t1lib doesn't correctly handle fonts with + // real (non-integer) bounding box coordinates. + if (xMax - xMin > 5000) { + xMin = 0; + xMax = (int)size; + } + if (yMax - yMin > 5000) { + yMin = 0; + yMax = (int)(1.2 * size); + } + + // transform the font + matrix.cxx = (double)mat[0] / size; + matrix.cxy = (double)mat[1] / size; + matrix.cyx = (double)mat[2] / size; + matrix.cyy = (double)mat[3] / size; + T1_TransformFont(t1libID, &matrix); +} + +SplashT1Font::~SplashT1Font() { + T1_DeleteFont(t1libID); + if (outlineID >= 0) { + T1_DeleteFont(outlineID); + } +} + +GBool SplashT1Font::getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap) { + return SplashFont::getGlyph(c, 0, 0, bitmap); +} + +GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap) { + GLYPH *glyph; + int n, i; + + if (aa) { + glyph = T1_AASetChar(t1libID, c, size, NULL); + } else { + glyph = T1_SetChar(t1libID, c, size, NULL); + } + if (!glyph) { + return gFalse; + } + + bitmap->x = -glyph->metrics.leftSideBearing; + bitmap->y = glyph->metrics.ascent; + bitmap->w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; + bitmap->h = glyph->metrics.ascent - glyph->metrics.descent; + bitmap->aa = aa; + if (aa) { + bitmap->data = (Guchar *)glyph->bits; + bitmap->freeData = gFalse; + } else { + n = bitmap->h * ((bitmap->w + 7) >> 3); + bitmap->data = (Guchar *)gmalloc(n); + for (i = 0; i < n; ++i) { + bitmap->data[i] = bitReverse[glyph->bits[i] & 0xff]; + } + bitmap->freeData = gTrue; + } + + return gTrue; +} + +SplashPath *SplashT1Font::getGlyphPath(int c) { + T1_TMATRIX matrix; + SplashPath *path; + T1_OUTLINE *outline; + T1_PATHSEGMENT *seg; + T1_BEZIERSEGMENT *bez; + SplashCoord x, y, x1, y1; + GBool needClose; + + if (outlineID < 0) { + outlineID = T1_CopyFont(((SplashT1FontFile *)fontFile)->t1libID); + outlineSize = (float)splashSqrt(textMat[2]*textMat[2] + + textMat[3]*textMat[3]); + matrix.cxx = (double)textMat[0] / outlineSize; + matrix.cxy = (double)textMat[1] / outlineSize; + matrix.cyx = (double)textMat[2] / outlineSize; + matrix.cyy = (double)textMat[3] / outlineSize; + // t1lib doesn't seem to handle small sizes correctly here, so set + // the size to 1000, and scale the resulting coordinates later + outlineMul = (float)(outlineSize / 65536000.0); + outlineSize = 1000; + T1_TransformFont(outlineID, &matrix); + } + + path = new SplashPath(); + if ((outline = T1_GetCharOutline(outlineID, c, outlineSize, NULL))) { + x = 0; + y = 0; + needClose = gFalse; + for (seg = outline; seg; seg = seg->link) { + switch (seg->type) { + case T1_PATHTYPE_MOVE: + if (needClose) { + path->close(); + needClose = gFalse; + } + x += seg->dest.x * outlineMul; + y += seg->dest.y * outlineMul; + path->moveTo(x, -y); + break; + case T1_PATHTYPE_LINE: + x += seg->dest.x * outlineMul; + y += seg->dest.y * outlineMul; + path->lineTo(x, -y); + needClose = gTrue; + break; + case T1_PATHTYPE_BEZIER: + bez = (T1_BEZIERSEGMENT *)seg; + x1 = x + (SplashCoord)(bez->dest.x * outlineMul); + y1 = y + (SplashCoord)(bez->dest.y * outlineMul); + path->curveTo(x + (SplashCoord)(bez->B.x * outlineMul), + -(y + (SplashCoord)(bez->B.y * outlineMul)), + x + (SplashCoord)(bez->C.x * outlineMul), + -(y + (SplashCoord)(bez->C.y * outlineMul)), + x1, -y1); + x = x1; + y = y1; + needClose = gTrue; + break; + } + } + if (needClose) { + path->close(); + } + T1_FreeOutline(outline); + } + + return path; +} + +#endif // HAVE_T1LIB_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h new file mode 100644 index 000000000..8ea74de48 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h @@ -0,0 +1,57 @@ +//======================================================================== +// +// SplashT1Font.h +// +//======================================================================== + +#ifndef SPLASHT1FONT_H +#define SPLASHT1FONT_H + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashFont.h" + +class SplashT1FontFile; + +//------------------------------------------------------------------------ +// SplashT1Font +//------------------------------------------------------------------------ + +class SplashT1Font: public SplashFont { +public: + + SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, + SplashCoord *textMatA); + + virtual ~SplashT1Font(); + + // Munge xFrac and yFrac before calling SplashFont::getGlyph. + virtual GBool getGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap); + + // Rasterize a glyph. The and values are the same + // as described for getGlyph. + virtual GBool makeGlyph(int c, int xFrac, int yFrac, + SplashGlyphBitmap *bitmap); + + // Return the path for a glyph. + virtual SplashPath *getGlyphPath(int c); + +private: + + int t1libID; // t1lib font ID + int outlineID; // t1lib font ID for glyph outlines + float size; + float outlineSize; // size for glyph outlines + float outlineMul; +}; + +#endif // HAVE_T1LIB_H + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc new file mode 100644 index 000000000..ca1453a5f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc @@ -0,0 +1,124 @@ +//======================================================================== +// +// SplashT1FontEngine.cc +// +//======================================================================== + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#ifndef WIN32 +# include +#endif +#include +#include "GString.h" +#include "gfile.h" +#include "FoFiType1C.h" +#include "SplashT1FontFile.h" +#include "SplashT1FontEngine.h" + +#ifdef VMS +#if (__VMS_VER < 70000000) +extern "C" int unlink(char *filename); +#endif +#endif + +//------------------------------------------------------------------------ + +int SplashT1FontEngine::t1libInitCount = 0; + +//------------------------------------------------------------------------ + +static void fileWrite(void *stream, char *data, int len) { + fwrite(data, 1, len, (FILE *)stream); +} + +//------------------------------------------------------------------------ +// SplashT1FontEngine +//------------------------------------------------------------------------ + +SplashT1FontEngine::SplashT1FontEngine(GBool aaA) { + aa = aaA; +} + +SplashT1FontEngine *SplashT1FontEngine::init(GBool aaA) { + // grayVals[i] = round(i * 255 / 16) + static unsigned long grayVals[17] = { + 0, 16, 32, 48, 64, 80, 96, 112, 128, 143, 159, 175, 191, 207, 223, 239, 255 + }; + + //~ for multithreading: need a mutex here + if (t1libInitCount == 0) { + T1_SetBitmapPad(8); + if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE | + T1_NO_AFM)) { + return NULL; + } + if (aaA) { + T1_AASetBitsPerPixel(8); + T1_AASetLevel(T1_AA_HIGH); + T1_AAHSetGrayValues(grayVals); + } else { + T1_AANSetGrayValues(0, 1); + } + } + ++t1libInitCount; + + return new SplashT1FontEngine(aaA); +} + +SplashT1FontEngine::~SplashT1FontEngine() { + //~ for multithreading: need a mutex here + if (--t1libInitCount == 0) { + T1_CloseLib(); + } +} + +SplashFontFile *SplashT1FontEngine::loadType1Font(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + return SplashT1FontFile::loadType1Font(this, idA, fileName, deleteFile, enc); +} + +SplashFontFile *SplashT1FontEngine::loadType1CFont(SplashFontFileID *idA, + char *fileName, + GBool deleteFile, + char **enc) { + FoFiType1C *ff; + GString *tmpFileName; + FILE *tmpFile; + SplashFontFile *ret; + + if (!(ff = FoFiType1C::load(fileName))) { + return NULL; + } + tmpFileName = NULL; + if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { + delete ff; + return NULL; + } + ff->convertToType1(NULL, NULL, gTrue, &fileWrite, tmpFile); + delete ff; + fclose(tmpFile); + ret = SplashT1FontFile::loadType1Font(this, idA, tmpFileName->getCString(), + gTrue, enc); + if (ret) { + if (deleteFile) { + unlink(fileName); + } + } else { + unlink(tmpFileName->getCString()); + } + delete tmpFileName; + return ret; +} + +#endif // HAVE_T1LIB_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h new file mode 100644 index 000000000..57a04487d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h @@ -0,0 +1,53 @@ +//======================================================================== +// +// SplashT1FontEngine.h +// +//======================================================================== + +#ifndef SPLASHT1FONTENGINE_H +#define SPLASHT1FONTENGINE_H + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" + +class SplashFontFile; +class SplashFontFileID; + +//------------------------------------------------------------------------ +// SplashT1FontEngine +//------------------------------------------------------------------------ + +class SplashT1FontEngine { +public: + + static SplashT1FontEngine *init(GBool aaA); + + ~SplashT1FontEngine(); + + // Load fonts. + SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName, + GBool deleteFile, char **enc); + +private: + + SplashT1FontEngine(GBool aaA); + + static int t1libInitCount; + GBool aa; + + friend class SplashT1FontFile; + friend class SplashT1Font; +}; + +#endif // HAVE_T1LIB_H + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc new file mode 100644 index 000000000..0dbb8f055 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc @@ -0,0 +1,97 @@ +//======================================================================== +// +// SplashT1FontFile.cc +// +//======================================================================== + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashT1FontEngine.h" +#include "SplashT1Font.h" +#include "SplashT1FontFile.h" + +//------------------------------------------------------------------------ +// SplashT1FontFile +//------------------------------------------------------------------------ + +SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, + GBool deleteFileA, + char **encA) { + int t1libIDA; + char **encTmp; + char *encStrTmp; + int encStrSize; + char *encPtr; + int i; + + // load the font file + if ((t1libIDA = T1_AddFont(fileNameA)) < 0) { + return NULL; + } + T1_LoadFont(t1libIDA); + + // reencode it + encStrSize = 0; + for (i = 0; i < 256; ++i) { + if (encA[i]) { + encStrSize += strlen(encA[i]) + 1; + } + } + encTmp = (char **)gmallocn(257, sizeof(char *)); + encStrTmp = (char *)gmallocn(encStrSize, sizeof(char)); + encPtr = encStrTmp; + for (i = 0; i < 256; ++i) { + if (encA[i]) { + strcpy(encPtr, encA[i]); + encTmp[i] = encPtr; + encPtr += strlen(encPtr) + 1; + } else { + encTmp[i] = ".notdef"; + } + } + encTmp[256] = "custom"; + T1_ReencodeFont(t1libIDA, encTmp); + + return new SplashT1FontFile(engineA, idA, fileNameA, deleteFileA, + t1libIDA, encTmp, encStrTmp); +} + +SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, GBool deleteFileA, + int t1libIDA, char **encA, char *encStrA): + SplashFontFile(idA, fileNameA, deleteFileA) +{ + engine = engineA; + t1libID = t1libIDA; + enc = encA; + encStr = encStrA; +} + +SplashT1FontFile::~SplashT1FontFile() { + gfree(encStr); + gfree(enc); + T1_DeleteFont(t1libID); +} + +SplashFont *SplashT1FontFile::makeFont(SplashCoord *mat, + SplashCoord *textMat) { + SplashFont *font; + + font = new SplashT1Font(this, mat, textMat); + font->initCache(); + return font; +} + +#endif // HAVE_T1LIB_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h new file mode 100644 index 000000000..69c9caf0e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h @@ -0,0 +1,58 @@ +//======================================================================== +// +// SplashT1FontFile.h +// +//======================================================================== + +#ifndef SPLASHT1FONTFILE_H +#define SPLASHT1FONTFILE_H + +#include + +#if HAVE_T1LIB_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashFontFile.h" + +class SplashT1FontEngine; + +//------------------------------------------------------------------------ +// SplashT1FontFile +//------------------------------------------------------------------------ + +class SplashT1FontFile: public SplashFontFile { +public: + + static SplashFontFile *loadType1Font(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, GBool deleteFileA, + char **encA); + + virtual ~SplashT1FontFile(); + + // Create a new SplashT1Font, i.e., a scaled instance of this font + // file. + virtual SplashFont *makeFont(SplashCoord *mat, + SplashCoord *textMat); + +private: + + SplashT1FontFile(SplashT1FontEngine *engineA, + SplashFontFileID *idA, + char *fileNameA, GBool deleteFileA, + int t1libIDA, char **encA, char *encStrA); + + SplashT1FontEngine *engine; + int t1libID; // t1lib font ID + char **enc; + char *encStr; + + friend class SplashT1Font; +}; + +#endif // HAVE_T1LIB_H + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h new file mode 100644 index 000000000..35551b90a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h @@ -0,0 +1,132 @@ +//======================================================================== +// +// SplashTypes.h +// +//======================================================================== + +#ifndef SPLASHTYPES_H +#define SPLASHTYPES_H + +#include +#include "gtypes.h" + +//------------------------------------------------------------------------ +// coordinates +//------------------------------------------------------------------------ + +#if USE_FIXEDPOINT +#include "FixedPoint.h" +typedef FixedPoint SplashCoord; +#else +typedef double SplashCoord; +#endif + +//------------------------------------------------------------------------ +// antialiasing +//------------------------------------------------------------------------ + +#define splashAASize 4 + +//------------------------------------------------------------------------ +// colors +//------------------------------------------------------------------------ + +enum SplashColorMode { + splashModeMono1, // 1 bit per component, 8 pixels per byte, + // MSbit is on the left + splashModeMono8, // 1 byte per component, 1 byte per pixel + splashModeRGB8, // 1 byte per component, 3 bytes per pixel: + // RGBRGB... + splashModeBGR8 // 1 byte per component, 3 bytes per pixel: + // BGRBGR... + +#if SPLASH_CMYK + , + splashModeCMYK8 // 1 byte per component, 4 bytes per pixel: + // CMYKCMYK... +#endif +}; + +// number of components in each color mode +// (defined in SplashState.cc) +extern int splashColorModeNComps[]; + +// max number of components in any SplashColor +#if SPLASH_CMYK +# define splashMaxColorComps 4 +#else +# define splashMaxColorComps 3 +#endif + +typedef Guchar SplashColor[splashMaxColorComps]; +typedef Guchar *SplashColorPtr; + +// RGB8 +static inline Guchar splashRGB8R(SplashColorPtr rgb8) { return rgb8[0]; } +static inline Guchar splashRGB8G(SplashColorPtr rgb8) { return rgb8[1]; } +static inline Guchar splashRGB8B(SplashColorPtr rgb8) { return rgb8[2]; } + +// BGR8 +static inline Guchar splashBGR8R(SplashColorPtr bgr8) { return bgr8[2]; } +static inline Guchar splashBGR8G(SplashColorPtr bgr8) { return bgr8[1]; } +static inline Guchar splashBGR8B(SplashColorPtr bgr8) { return bgr8[0]; } + +#if SPLASH_CMYK +// CMYK8 +static inline Guchar splashCMYK8C(SplashColorPtr cmyk8) { return cmyk8[0]; } +static inline Guchar splashCMYK8M(SplashColorPtr cmyk8) { return cmyk8[1]; } +static inline Guchar splashCMYK8Y(SplashColorPtr cmyk8) { return cmyk8[2]; } +static inline Guchar splashCMYK8K(SplashColorPtr cmyk8) { return cmyk8[3]; } +#endif + +static inline void splashColorCopy(SplashColorPtr dest, SplashColorPtr src) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; +#if SPLASH_CMYK + dest[3] = src[3]; +#endif +} + +static inline void splashColorXor(SplashColorPtr dest, SplashColorPtr src) { + dest[0] ^= src[0]; + dest[1] ^= src[1]; + dest[2] ^= src[2]; +#if SPLASH_CMYK + dest[3] ^= src[3]; +#endif +} + +//------------------------------------------------------------------------ +// blend functions +//------------------------------------------------------------------------ + +typedef void (*SplashBlendFunc)(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm); + +//------------------------------------------------------------------------ +// screen parameters +//------------------------------------------------------------------------ + +enum SplashScreenType { + splashScreenDispersed, + splashScreenClustered, + splashScreenStochasticClustered +}; + +struct SplashScreenParams { + SplashScreenType type; + int size; + int dotRadius; + SplashCoord gamma; + SplashCoord blackThreshold; + SplashCoord whiteThreshold; +}; + +//------------------------------------------------------------------------ +// error results +//------------------------------------------------------------------------ + +typedef int SplashError; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc new file mode 100644 index 000000000..da296b171 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc @@ -0,0 +1,438 @@ +//======================================================================== +// +// SplashXPath.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashMath.h" +#include "SplashPath.h" +#include "SplashXPath.h" + +//------------------------------------------------------------------------ + +struct SplashXPathPoint { + SplashCoord x, y; +}; + +struct SplashXPathAdjust { + int firstPt, lastPt; // range of points + GBool vert; // vertical or horizontal hint + SplashCoord x0a, x0b, // hint boundaries + xma, xmb, + x1a, x1b; + SplashCoord x0, x1, xm; // adjusted coordinates +}; + +//------------------------------------------------------------------------ + +// Transform a point from user space to device space. +inline void SplashXPath::transform(SplashCoord *matrix, + SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo) { + // [ m[0] m[1] 0 ] + // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ] + // [ m[4] m[5] 1 ] + *xo = xi * matrix[0] + yi * matrix[2] + matrix[4]; + *yo = xi * matrix[1] + yi * matrix[3] + matrix[5]; +} + +//------------------------------------------------------------------------ +// SplashXPath +//------------------------------------------------------------------------ + +SplashXPath::SplashXPath() { + segs = NULL; + length = size = 0; +} + +SplashXPath::SplashXPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool closeSubpaths) { + SplashPathHint *hint; + SplashXPathPoint *pts; + SplashXPathAdjust *adjusts, *adjust; + SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xsp, ysp; + SplashCoord adj0, adj1, w; + int ww; + int curSubpath, curSubpathX, i, j; + + // transform the points + pts = (SplashXPathPoint *)gmallocn(path->length, sizeof(SplashXPathPoint)); + for (i = 0; i < path->length; ++i) { + transform(matrix, path->pts[i].x, path->pts[i].y, &pts[i].x, &pts[i].y); + } + + // set up the stroke adjustment hints + if (path->hints) { + adjusts = (SplashXPathAdjust *)gmallocn(path->hintsLength, + sizeof(SplashXPathAdjust)); + for (i = 0; i < path->hintsLength; ++i) { + hint = &path->hints[i]; + x0 = pts[hint->ctrl0 ].x; y0 = pts[hint->ctrl0 ].y; + x1 = pts[hint->ctrl0 + 1].x; y1 = pts[hint->ctrl0 + 1].y; + x2 = pts[hint->ctrl1 ].x; y2 = pts[hint->ctrl1 ].y; + x3 = pts[hint->ctrl1 + 1].x; y3 = pts[hint->ctrl1 + 1].y; + if (x0 == x1 && x2 == x3) { + adjusts[i].vert = gTrue; + adj0 = x0; + adj1 = x2; + } else if (y0 == y1 && y2 == y3) { + adjusts[i].vert = gFalse; + adj0 = y0; + adj1 = y2; + } else { + gfree(adjusts); + adjusts = NULL; + break; + } + if (adj0 > adj1) { + x0 = adj0; + adj0 = adj1; + adj1 = x0; + } + w = adj1 - adj0; + ww = splashRound(w); + if (ww == 0) { + ww = 1; + } + adjusts[i].x0a = adj0 - 0.01; + adjusts[i].x0b = adj0 + 0.01; + adjusts[i].xma = (SplashCoord)0.5 * (adj0 + adj1) - 0.01; + adjusts[i].xmb = (SplashCoord)0.5 * (adj0 + adj1) + 0.01; + adjusts[i].x1a = adj1 - 0.01; + adjusts[i].x1b = adj1 + 0.01; + adjusts[i].x0 = (SplashCoord)splashRound(adj0); + adjusts[i].x1 = adjusts[i].x0 + ww - 0.01; + adjusts[i].xm = (SplashCoord)0.5 * (adjusts[i].x0 + adjusts[i].x1); + adjusts[i].firstPt = hint->firstPt; + adjusts[i].lastPt = hint->lastPt; + } + + } else { + adjusts = NULL; + } + + // perform stroke adjustment + if (adjusts) { + for (i = 0, adjust = adjusts; i < path->hintsLength; ++i, ++adjust) { + for (j = adjust->firstPt; j <= adjust->lastPt; ++j) { + strokeAdjust(adjust, &pts[j].x, &pts[j].y); + } + } + gfree(adjusts); + } + + segs = NULL; + length = size = 0; + + x0 = y0 = xsp = ysp = 0; // make gcc happy + adj0 = adj1 = 0; // make gcc happy + curSubpath = 0; + curSubpathX = 0; + i = 0; + while (i < path->length) { + + // first point in subpath - skip it + if (path->flags[i] & splashPathFirst) { + x0 = pts[i].x; + y0 = pts[i].y; + xsp = x0; + ysp = y0; + curSubpath = i; + curSubpathX = length; + ++i; + + } else { + + // curve segment + if (path->flags[i] & splashPathCurve) { + x1 = pts[i].x; + y1 = pts[i].y; + x2 = pts[i+1].x; + y2 = pts[i+1].y; + x3 = pts[i+2].x; + y3 = pts[i+2].y; + addCurve(x0, y0, x1, y1, x2, y2, x3, y3, + flatness, + (path->flags[i-1] & splashPathFirst), + (path->flags[i+2] & splashPathLast), + !closeSubpaths && + (path->flags[i-1] & splashPathFirst) && + !(path->flags[i-1] & splashPathClosed), + !closeSubpaths && + (path->flags[i+2] & splashPathLast) && + !(path->flags[i+2] & splashPathClosed)); + x0 = x3; + y0 = y3; + i += 3; + + // line segment + } else { + x1 = pts[i].x; + y1 = pts[i].y; + addSegment(x0, y0, x1, y1, + path->flags[i-1] & splashPathFirst, + path->flags[i] & splashPathLast, + !closeSubpaths && + (path->flags[i-1] & splashPathFirst) && + !(path->flags[i-1] & splashPathClosed), + !closeSubpaths && + (path->flags[i] & splashPathLast) && + !(path->flags[i] & splashPathClosed)); + x0 = x1; + y0 = y1; + ++i; + } + + // close a subpath + if (closeSubpaths && + (path->flags[i-1] & splashPathLast) && + (pts[i-1].x != pts[curSubpath].x || + pts[i-1].y != pts[curSubpath].y)) { + addSegment(x0, y0, xsp, ysp, + gFalse, gTrue, gFalse, gFalse); + } + } + } + + gfree(pts); +} + +// Apply the stroke adjust hints to point : (*, *). +void SplashXPath::strokeAdjust(SplashXPathAdjust *adjust, + SplashCoord *xp, SplashCoord *yp) { + SplashCoord x, y; + + if (adjust->vert) { + x = *xp; + if (x > adjust->x0a && x < adjust->x0b) { + *xp = adjust->x0; + } else if (x > adjust->xma && x < adjust->xmb) { + *xp = adjust->xm; + } else if (x > adjust->x1a && x < adjust->x1b) { + *xp = adjust->x1; + } + } else { + y = *yp; + if (y > adjust->x0a && y < adjust->x0b) { + *yp = adjust->x0; + } else if (y > adjust->xma && y < adjust->xmb) { + *yp = adjust->xm; + } else if (y > adjust->x1a && y < adjust->x1b) { + *yp = adjust->x1; + } + } +} + +SplashXPath::SplashXPath(SplashXPath *xPath) { + length = xPath->length; + size = xPath->size; + segs = (SplashXPathSeg *)gmallocn(size, sizeof(SplashXPathSeg)); + memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg)); +} + +SplashXPath::~SplashXPath() { + gfree(segs); +} + +// Add space for more segments +void SplashXPath::grow(int nSegs) { + if (length + nSegs > size) { + if (size == 0) { + size = 32; + } + while (size < length + nSegs) { + size *= 2; + } + segs = (SplashXPathSeg *)greallocn(segs, size, sizeof(SplashXPathSeg)); + } +} + +void SplashXPath::addCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord flatness, + GBool first, GBool last, GBool end0, GBool end1) { + SplashCoord cx[splashMaxCurveSplits + 1][3]; + SplashCoord cy[splashMaxCurveSplits + 1][3]; + int cNext[splashMaxCurveSplits + 1]; + SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh; + SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh; + SplashCoord dx, dy, mx, my, d1, d2, flatness2; + int p1, p2, p3; + + flatness2 = flatness * flatness; + + // initial segment + p1 = 0; + p2 = splashMaxCurveSplits; + cx[p1][0] = x0; cy[p1][0] = y0; + cx[p1][1] = x1; cy[p1][1] = y1; + cx[p1][2] = x2; cy[p1][2] = y2; + cx[p2][0] = x3; cy[p2][0] = y3; + cNext[p1] = p2; + + while (p1 < splashMaxCurveSplits) { + + // get the next segment + xl0 = cx[p1][0]; yl0 = cy[p1][0]; + xx1 = cx[p1][1]; yy1 = cy[p1][1]; + xx2 = cx[p1][2]; yy2 = cy[p1][2]; + p2 = cNext[p1]; + xr3 = cx[p2][0]; yr3 = cy[p2][0]; + + // compute the distances from the control points to the + // midpoint of the straight line (this is a bit of a hack, but + // it's much faster than computing the actual distances to the + // line) + mx = (xl0 + xr3) * 0.5; + my = (yl0 + yr3) * 0.5; + dx = xx1 - mx; + dy = yy1 - my; + d1 = dx*dx + dy*dy; + dx = xx2 - mx; + dy = yy2 - my; + d2 = dx*dx + dy*dy; + + // if the curve is flat enough, or no more subdivisions are + // allowed, add the straight line segment + if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) { + addSegment(xl0, yl0, xr3, yr3, + p1 == 0 && first, + p2 == splashMaxCurveSplits && last, + p1 == 0 && end0, + p2 == splashMaxCurveSplits && end1); + p1 = p2; + + // otherwise, subdivide the curve + } else { + xl1 = (xl0 + xx1) * 0.5; + yl1 = (yl0 + yy1) * 0.5; + xh = (xx1 + xx2) * 0.5; + yh = (yy1 + yy2) * 0.5; + xl2 = (xl1 + xh) * 0.5; + yl2 = (yl1 + yh) * 0.5; + xr2 = (xx2 + xr3) * 0.5; + yr2 = (yy2 + yr3) * 0.5; + xr1 = (xh + xr2) * 0.5; + yr1 = (yh + yr2) * 0.5; + xr0 = (xl2 + xr1) * 0.5; + yr0 = (yl2 + yr1) * 0.5; + // add the new subdivision points + p3 = (p1 + p2) / 2; + cx[p1][1] = xl1; cy[p1][1] = yl1; + cx[p1][2] = xl2; cy[p1][2] = yl2; + cNext[p1] = p3; + cx[p3][0] = xr0; cy[p3][0] = yr0; + cx[p3][1] = xr1; cy[p3][1] = yr1; + cx[p3][2] = xr2; cy[p3][2] = yr2; + cNext[p3] = p2; + } + } +} + +void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + GBool first, GBool last, GBool end0, GBool end1) { + grow(1); + segs[length].x0 = x0; + segs[length].y0 = y0; + segs[length].x1 = x1; + segs[length].y1 = y1; + segs[length].flags = 0; + if (first) { + segs[length].flags |= splashXPathFirst; + } + if (last) { + segs[length].flags |= splashXPathLast; + } + if (end0) { + segs[length].flags |= splashXPathEnd0; + } + if (end1) { + segs[length].flags |= splashXPathEnd1; + } + if (y1 == y0) { + segs[length].dxdy = segs[length].dydx = 0; + segs[length].flags |= splashXPathHoriz; + if (x1 == x0) { + segs[length].flags |= splashXPathVert; + } + } else if (x1 == x0) { + segs[length].dxdy = segs[length].dydx = 0; + segs[length].flags |= splashXPathVert; + } else { +#if USE_FIXEDPOINT + if (FixedPoint::divCheck(x1 - x0, y1 - y0, &segs[length].dxdy)) { + segs[length].dydx = (SplashCoord)1 / segs[length].dxdy; + } else { + segs[length].dxdy = segs[length].dydx = 0; + if (splashAbs(x1 - x0) > splashAbs(y1 - y0)) { + segs[length].flags |= splashXPathHoriz; + } else { + segs[length].flags |= splashXPathVert; + } + } +#else + segs[length].dxdy = (x1 - x0) / (y1 - y0); + segs[length].dydx = (SplashCoord)1 / segs[length].dxdy; +#endif + } + if (y0 > y1) { + segs[length].flags |= splashXPathFlip; + } + ++length; +} + +static int cmpXPathSegs(const void *arg0, const void *arg1) { + SplashXPathSeg *seg0 = (SplashXPathSeg *)arg0; + SplashXPathSeg *seg1 = (SplashXPathSeg *)arg1; + SplashCoord x0, y0, x1, y1; + + if (seg0->flags & splashXPathFlip) { + x0 = seg0->x1; + y0 = seg0->y1; + } else { + x0 = seg0->x0; + y0 = seg0->y0; + } + if (seg1->flags & splashXPathFlip) { + x1 = seg1->x1; + y1 = seg1->y1; + } else { + x1 = seg1->x0; + y1 = seg1->y0; + } + if (y0 != y1) { + return (y0 > y1) ? 1 : -1; + } + if (x0 != x1) { + return (x0 > x1) ? 1 : -1; + } + return 0; +} + +void SplashXPath::aaScale() { + SplashXPathSeg *seg; + int i; + + for (i = 0, seg = segs; i < length; ++i, ++seg) { + seg->x0 *= splashAASize; + seg->y0 *= splashAASize; + seg->x1 *= splashAASize; + seg->y1 *= splashAASize; + } +} + +void SplashXPath::sort() { + qsort(segs, length, sizeof(SplashXPathSeg), &cmpXPathSegs); +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h new file mode 100644 index 000000000..43276b848 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h @@ -0,0 +1,100 @@ +//======================================================================== +// +// SplashXPath.h +// +//======================================================================== + +#ifndef SPLASHXPATH_H +#define SPLASHXPATH_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashPath; +struct SplashXPathAdjust; + +//------------------------------------------------------------------------ + +#define splashMaxCurveSplits (1 << 10) + +//------------------------------------------------------------------------ +// SplashXPathSeg +//------------------------------------------------------------------------ + +struct SplashXPathSeg { + SplashCoord x0, y0; // first endpoint + SplashCoord x1, y1; // second endpoint + SplashCoord dxdy; // slope: delta-x / delta-y + SplashCoord dydx; // slope: delta-y / delta-x + Guint flags; +}; + +#define splashXPathFirst 0x01 // first segment of a subpath +#define splashXPathLast 0x02 // last segment of a subpath +#define splashXPathEnd0 0x04 // first endpoint is end of an open subpath +#define splashXPathEnd1 0x08 // second endpoint is end of an open subpath +#define splashXPathHoriz 0x10 // segment is vertical (y0 == y1) + // (dxdy is undef) +#define splashXPathVert 0x20 // segment is horizontal (x0 == x1) + // (dydx is undef) +#define splashXPathFlip 0x40 // y0 > y1 + +//------------------------------------------------------------------------ +// SplashXPath +//------------------------------------------------------------------------ + +class SplashXPath { +public: + + // Expands (converts to segments) and flattens (converts curves to + // lines) . Transforms all points from user space to device + // space, via . If is true, closes all open + // subpaths. + SplashXPath(SplashPath *path, SplashCoord *matrix, + SplashCoord flatness, GBool closeSubpaths); + + // Copy an expanded path. + SplashXPath *copy() { return new SplashXPath(this); } + + ~SplashXPath(); + + // Multiply all coordinates by splashAASize, in preparation for + // anti-aliased rendering. + void aaScale(); + + // Sort by upper coordinate (lower y), in y-major order. + void sort(); + +private: + + SplashXPath(); + SplashXPath(SplashXPath *xPath); + void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, + SplashCoord *xo, SplashCoord *yo); + void strokeAdjust(SplashXPathAdjust *adjust, + SplashCoord *xp, SplashCoord *yp); + void grow(int nSegs); + void addCurve(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + SplashCoord x2, SplashCoord y2, + SplashCoord x3, SplashCoord y3, + SplashCoord flatness, + GBool first, GBool last, GBool end0, GBool end1); + void addSegment(SplashCoord x0, SplashCoord y0, + SplashCoord x1, SplashCoord y1, + GBool first, GBool last, GBool end0, GBool end1); + + SplashXPathSeg *segs; + int length, size; // length and size of segs array + + friend class SplashXPathScanner; + friend class SplashClip; + friend class Splash; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc new file mode 100644 index 000000000..e9383373d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc @@ -0,0 +1,428 @@ +//======================================================================== +// +// SplashXPathScanner.cc +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "SplashMath.h" +#include "SplashXPath.h" +#include "SplashBitmap.h" +#include "SplashXPathScanner.h" + +//------------------------------------------------------------------------ + +struct SplashIntersect { + int x0, x1; // intersection of segment with [y, y+1) + int count; // EO/NZWN counter increment +}; + +static int cmpIntersect(const void *p0, const void *p1) { + return ((SplashIntersect *)p0)->x0 - ((SplashIntersect *)p1)->x0; +} + +//------------------------------------------------------------------------ +// SplashXPathScanner +//------------------------------------------------------------------------ + +SplashXPathScanner::SplashXPathScanner(SplashXPath *xPathA, GBool eoA) { + SplashXPathSeg *seg; + SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP; + int i; + + xPath = xPathA; + eo = eoA; + + // compute the bbox + if (xPath->length == 0) { + xMin = yMin = 1; + xMax = yMax = 0; + } else { + seg = &xPath->segs[0]; + if (seg->x0 <= seg->x1) { + xMinFP = seg->x0; + xMaxFP = seg->x1; + } else { + xMinFP = seg->x1; + xMaxFP = seg->x0; + } + if (seg->flags & splashXPathFlip) { + yMinFP = seg->y1; + yMaxFP = seg->y0; + } else { + yMinFP = seg->y0; + yMaxFP = seg->y1; + } + for (i = 1; i < xPath->length; ++i) { + seg = &xPath->segs[i]; + if (seg->x0 < xMinFP) { + xMinFP = seg->x0; + } else if (seg->x0 > xMaxFP) { + xMaxFP = seg->x0; + } + if (seg->x1 < xMinFP) { + xMinFP = seg->x1; + } else if (seg->x1 > xMaxFP) { + xMaxFP = seg->x1; + } + if (seg->flags & splashXPathFlip) { + if (seg->y0 > yMaxFP) { + yMaxFP = seg->y0; + } + } else { + if (seg->y1 > yMaxFP) { + yMaxFP = seg->y1; + } + } + } + xMin = splashFloor(xMinFP); + xMax = splashFloor(xMaxFP); + yMin = splashFloor(yMinFP); + yMax = splashFloor(yMaxFP); + } + + interY = yMin - 1; + xPathIdx = 0; + inter = NULL; + interLen = interSize = 0; +} + +SplashXPathScanner::~SplashXPathScanner() { + gfree(inter); +} + +void SplashXPathScanner::getBBoxAA(int *xMinA, int *yMinA, + int *xMaxA, int *yMaxA) { + *xMinA = xMin / splashAASize; + *yMinA = yMin / splashAASize; + *xMaxA = xMax / splashAASize; + *yMaxA = yMax / splashAASize; +} + +void SplashXPathScanner::getSpanBounds(int y, int *spanXMin, int *spanXMax) { + if (interY != y) { + computeIntersections(y); + } + if (interLen > 0) { + *spanXMin = inter[0].x0; + *spanXMax = inter[interLen - 1].x1; + } else { + *spanXMin = xMax + 1; + *spanXMax = xMax; + } +} + +GBool SplashXPathScanner::test(int x, int y) { + int count, i; + + if (interY != y) { + computeIntersections(y); + } + count = 0; + for (i = 0; i < interLen && inter[i].x0 <= x; ++i) { + if (x <= inter[i].x1) { + return gTrue; + } + count += inter[i].count; + } + return eo ? (count & 1) : (count != 0); +} + +GBool SplashXPathScanner::testSpan(int x0, int x1, int y) { + int count, xx1, i; + + if (interY != y) { + computeIntersections(y); + } + + count = 0; + for (i = 0; i < interLen && inter[i].x1 < x0; ++i) { + count += inter[i].count; + } + + // invariant: the subspan [x0,xx1] is inside the path + xx1 = x0 - 1; + while (xx1 < x1) { + if (i >= interLen) { + return gFalse; + } + if (inter[i].x0 > xx1 + 1 && + !(eo ? (count & 1) : (count != 0))) { + return gFalse; + } + if (inter[i].x1 > xx1) { + xx1 = inter[i].x1; + } + count += inter[i].count; + ++i; + } + + return gTrue; +} + +GBool SplashXPathScanner::getNextSpan(int y, int *x0, int *x1) { + int xx0, xx1; + + if (interY != y) { + computeIntersections(y); + } + if (interIdx >= interLen) { + return gFalse; + } + xx0 = inter[interIdx].x0; + xx1 = inter[interIdx].x1; + interCount += inter[interIdx].count; + ++interIdx; + while (interIdx < interLen && + (inter[interIdx].x0 <= xx1 || + (eo ? (interCount & 1) : (interCount != 0)))) { + if (inter[interIdx].x1 > xx1) { + xx1 = inter[interIdx].x1; + } + interCount += inter[interIdx].count; + ++interIdx; + } + *x0 = xx0; + *x1 = xx1; + return gTrue; +} + +void SplashXPathScanner::computeIntersections(int y) { + SplashCoord xSegMin, xSegMax, ySegMin, ySegMax, xx0, xx1; + SplashXPathSeg *seg; + int i, j; + + // find the first segment that intersects [y, y+1) + i = (y >= interY) ? xPathIdx : 0; + while (i < xPath->length && + xPath->segs[i].y0 < y && xPath->segs[i].y1 < y) { + ++i; + } + xPathIdx = i; + + // find all of the segments that intersect [y, y+1) and create an + // Intersect element for each one + interLen = 0; + for (j = i; j < xPath->length; ++j) { + seg = &xPath->segs[j]; + if (seg->flags & splashXPathFlip) { + ySegMin = seg->y1; + ySegMax = seg->y0; + } else { + ySegMin = seg->y0; + ySegMax = seg->y1; + } + + // ensure that: ySegMin < y+1 + // y <= ySegMax + if (ySegMin >= y + 1) { + break; + } + if (ySegMax < y) { + continue; + } + + if (interLen == interSize) { + if (interSize == 0) { + interSize = 16; + } else { + interSize *= 2; + } + inter = (SplashIntersect *)greallocn(inter, interSize, + sizeof(SplashIntersect)); + } + + if (seg->flags & splashXPathHoriz) { + xx0 = seg->x0; + xx1 = seg->x1; + } else if (seg->flags & splashXPathVert) { + xx0 = xx1 = seg->x0; + } else { + if (seg->x0 < seg->x1) { + xSegMin = seg->x0; + xSegMax = seg->x1; + } else { + xSegMin = seg->x1; + xSegMax = seg->x0; + } + // intersection with top edge + xx0 = seg->x0 + ((SplashCoord)y - seg->y0) * seg->dxdy; + // intersection with bottom edge + xx1 = seg->x0 + ((SplashCoord)y + 1 - seg->y0) * seg->dxdy; + // the segment may not actually extend to the top and/or bottom edges + if (xx0 < xSegMin) { + xx0 = xSegMin; + } else if (xx0 > xSegMax) { + xx0 = xSegMax; + } + if (xx1 < xSegMin) { + xx1 = xSegMin; + } else if (xx1 > xSegMax) { + xx1 = xSegMax; + } + } + if (xx0 < xx1) { + inter[interLen].x0 = splashFloor(xx0); + inter[interLen].x1 = splashFloor(xx1); + } else { + inter[interLen].x0 = splashFloor(xx1); + inter[interLen].x1 = splashFloor(xx0); + } + if (ySegMin <= y && + (SplashCoord)y < ySegMax && + !(seg->flags & splashXPathHoriz)) { + inter[interLen].count = eo ? 1 + : (seg->flags & splashXPathFlip) ? 1 : -1; + } else { + inter[interLen].count = 0; + } + ++interLen; + } + + qsort(inter, interLen, sizeof(SplashIntersect), &cmpIntersect); + + interY = y; + interIdx = 0; + interCount = 0; +} + +void SplashXPathScanner::renderAALine(SplashBitmap *aaBuf, + int *x0, int *x1, int y) { + int xx0, xx1, xx, xxMin, xxMax, yy; + Guchar mask; + SplashColorPtr p; + + memset(aaBuf->getDataPtr(), 0, aaBuf->getRowSize() * aaBuf->getHeight()); + xxMin = aaBuf->getWidth(); + xxMax = -1; + for (yy = 0; yy < splashAASize; ++yy) { + computeIntersections(splashAASize * y + yy); + while (interIdx < interLen) { + xx0 = inter[interIdx].x0; + xx1 = inter[interIdx].x1; + interCount += inter[interIdx].count; + ++interIdx; + while (interIdx < interLen && + (inter[interIdx].x0 <= xx1 || + (eo ? (interCount & 1) : (interCount != 0)))) { + if (inter[interIdx].x1 > xx1) { + xx1 = inter[interIdx].x1; + } + interCount += inter[interIdx].count; + ++interIdx; + } + if (xx0 < 0) { + xx0 = 0; + } + ++xx1; + if (xx1 > aaBuf->getWidth()) { + xx1 = aaBuf->getWidth(); + } + // set [xx0, xx1) to 1 + if (xx0 < xx1) { + xx = xx0; + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); + if (xx & 7) { + mask = 0xff >> (xx & 7); + if ((xx & ~7) == (xx1 & ~7)) { + mask &= (Guchar)(0xff00 >> (xx1 & 7)); + } + *p++ |= mask; + xx = (xx & ~7) + 8; + } + for (; xx + 7 < xx1; xx += 8) { + *p++ |= 0xff; + } + if (xx < xx1) { + *p |= (Guchar)(0xff00 >> (xx1 & 7)); + } + } + if (xx0 < xxMin) { + xxMin = xx0; + } + if (xx1 > xxMax) { + xxMax = xx1; + } + } + } + *x0 = xxMin / splashAASize; + *x1 = (xxMax - 1) / splashAASize; +} + +void SplashXPathScanner::clipAALine(SplashBitmap *aaBuf, + int *x0, int *x1, int y) { + int xx0, xx1, xx, yy; + Guchar mask; + SplashColorPtr p; + + for (yy = 0; yy < splashAASize; ++yy) { + xx = *x0 * splashAASize; + computeIntersections(splashAASize * y + yy); + while (interIdx < interLen && xx < (*x1 + 1) * splashAASize) { + xx0 = inter[interIdx].x0; + xx1 = inter[interIdx].x1; + interCount += inter[interIdx].count; + ++interIdx; + while (interIdx < interLen && + (inter[interIdx].x0 <= xx1 || + (eo ? (interCount & 1) : (interCount != 0)))) { + if (inter[interIdx].x1 > xx1) { + xx1 = inter[interIdx].x1; + } + interCount += inter[interIdx].count; + ++interIdx; + } + if (xx0 > aaBuf->getWidth()) { + xx0 = aaBuf->getWidth(); + } + // set [xx, xx0) to 0 + if (xx < xx0) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); + if (xx & 7) { + mask = (Guchar)(0xff00 >> (xx & 7)); + if ((xx & ~7) == (xx0 & ~7)) { + mask |= 0xff >> (xx0 & 7); + } + *p++ &= mask; + xx = (xx & ~7) + 8; + } + for (; xx + 7 < xx0; xx += 8) { + *p++ = 0x00; + } + if (xx < xx0) { + *p &= 0xff >> (xx0 & 7); + } + } + if (xx1 >= xx) { + xx = xx1 + 1; + } + } + xx0 = (*x1 + 1) * splashAASize; + // set [xx, xx0) to 0 + if (xx < xx0) { + p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); + if (xx & 7) { + mask = (Guchar)(0xff00 >> (xx & 7)); + if ((xx & ~7) == (xx0 & ~7)) { + mask &= 0xff >> (xx0 & 7); + } + *p++ &= mask; + xx = (xx & ~7) + 8; + } + for (; xx + 7 < xx0; xx += 8) { + *p++ = 0x00; + } + if (xx < xx0) { + *p &= 0xff >> (xx0 & 7); + } + } + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h new file mode 100644 index 000000000..ab02fcc99 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h @@ -0,0 +1,87 @@ +//======================================================================== +// +// SplashXPathScanner.h +// +//======================================================================== + +#ifndef SPLASHXPATHSCANNER_H +#define SPLASHXPATHSCANNER_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashXPath; +class SplashBitmap; +struct SplashIntersect; + +//------------------------------------------------------------------------ +// SplashXPathScanner +//------------------------------------------------------------------------ + +class SplashXPathScanner { +public: + + // Create a new SplashXPathScanner object. must be sorted. + SplashXPathScanner(SplashXPath *xPathA, GBool eoA); + + ~SplashXPathScanner(); + + // Return the path's bounding box. + void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + + // Return the path's bounding box. + void getBBoxAA(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA); + + // Return the min/max x values for the span at . + void getSpanBounds(int y, int *spanXMin, int *spanXMax); + + // Returns true if (,) is inside the path. + GBool test(int x, int y); + + // Returns true if the entire span ([,], ) is inside the + // path. + GBool testSpan(int x0, int x1, int y); + + // Returns the next span inside the path at . If is + // different than the previous call to getNextSpan, this returns the + // first span at ; otherwise it returns the next span (relative + // to the previous call to getNextSpan). Returns false if there are + // no more spans at . + GBool getNextSpan(int y, int *x0, int *x1); + + // Renders one anti-aliased line into . Returns the min and + // max x coordinates with non-zero pixels in and . + void renderAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); + + // Clips an anti-aliased line by setting pixels to zero. On entry, + // all non-zero pixels are between and . This function + // will update and . + void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); + +private: + + void computeIntersections(int y); + + SplashXPath *xPath; + GBool eo; + int xMin, yMin, xMax, yMax; + + int interY; // current y value + int interIdx; // current index into - used by + // getNextSpan + int interCount; // current EO/NZWN counter - used by + // getNextSpan + int xPathIdx; // current index into - used by + // computeIntersections + SplashIntersect *inter; // intersections array for + int interLen; // number of intersections in + int interSize; // size of the array +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h new file mode 100644 index 000000000..c4458fe71 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h @@ -0,0 +1,459 @@ +//======================================================================== +// +// Stream-CCITT.h +// +// Tables for CCITT Fax decoding. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +struct CCITTCode { + short bits; + short n; +}; + +#define ccittEOL -2 + +//------------------------------------------------------------------------ +// 2D codes +//------------------------------------------------------------------------ + +#define twoDimPass 0 +#define twoDimHoriz 1 +#define twoDimVert0 2 +#define twoDimVertR1 3 +#define twoDimVertL1 4 +#define twoDimVertR2 5 +#define twoDimVertL2 6 +#define twoDimVertR3 7 +#define twoDimVertL3 8 + +// 1-7 bit codes +static CCITTCode twoDimTab1[128] = { + {-1, -1}, {-1, -1}, // 000000x + {7, twoDimVertL3}, // 0000010 + {7, twoDimVertR3}, // 0000011 + {6, twoDimVertL2}, {6, twoDimVertL2}, // 000010x + {6, twoDimVertR2}, {6, twoDimVertR2}, // 000011x + {4, twoDimPass}, {4, twoDimPass}, // 0001xxx + {4, twoDimPass}, {4, twoDimPass}, + {4, twoDimPass}, {4, twoDimPass}, + {4, twoDimPass}, {4, twoDimPass}, + {3, twoDimHoriz}, {3, twoDimHoriz}, // 001xxxx + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimHoriz}, {3, twoDimHoriz}, + {3, twoDimVertL1}, {3, twoDimVertL1}, // 010xxxx + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertL1}, {3, twoDimVertL1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, // 011xxxx + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {3, twoDimVertR1}, {3, twoDimVertR1}, + {1, twoDimVert0}, {1, twoDimVert0}, // 1xxxxxx + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0}, + {1, twoDimVert0}, {1, twoDimVert0} +}; + +//------------------------------------------------------------------------ +// white run lengths +//------------------------------------------------------------------------ + +// 11-12 bit codes (upper 7 bits are 0) +static CCITTCode whiteTab1[32] = { + {-1, -1}, // 00000 + {12, ccittEOL}, // 00001 + {-1, -1}, {-1, -1}, // 0001x + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 001xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 010xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 011xx + {11, 1792}, {11, 1792}, // 1000x + {12, 1984}, // 10010 + {12, 2048}, // 10011 + {12, 2112}, // 10100 + {12, 2176}, // 10101 + {12, 2240}, // 10110 + {12, 2304}, // 10111 + {11, 1856}, {11, 1856}, // 1100x + {11, 1920}, {11, 1920}, // 1101x + {12, 2368}, // 11100 + {12, 2432}, // 11101 + {12, 2496}, // 11110 + {12, 2560} // 11111 +}; + +// 1-9 bit codes +static CCITTCode whiteTab2[512] = { + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000000xx + {8, 29}, {8, 29}, // 00000010x + {8, 30}, {8, 30}, // 00000011x + {8, 45}, {8, 45}, // 00000100x + {8, 46}, {8, 46}, // 00000101x + {7, 22}, {7, 22}, {7, 22}, {7, 22}, // 0000011xx + {7, 23}, {7, 23}, {7, 23}, {7, 23}, // 0000100xx + {8, 47}, {8, 47}, // 00001010x + {8, 48}, {8, 48}, // 00001011x + {6, 13}, {6, 13}, {6, 13}, {6, 13}, // 000011xxx + {6, 13}, {6, 13}, {6, 13}, {6, 13}, + {7, 20}, {7, 20}, {7, 20}, {7, 20}, // 0001000xx + {8, 33}, {8, 33}, // 00010010x + {8, 34}, {8, 34}, // 00010011x + {8, 35}, {8, 35}, // 00010100x + {8, 36}, {8, 36}, // 00010101x + {8, 37}, {8, 37}, // 00010110x + {8, 38}, {8, 38}, // 00010111x + {7, 19}, {7, 19}, {7, 19}, {7, 19}, // 0001100xx + {8, 31}, {8, 31}, // 00011010x + {8, 32}, {8, 32}, // 00011011x + {6, 1}, {6, 1}, {6, 1}, {6, 1}, // 000111xxx + {6, 1}, {6, 1}, {6, 1}, {6, 1}, + {6, 12}, {6, 12}, {6, 12}, {6, 12}, // 001000xxx + {6, 12}, {6, 12}, {6, 12}, {6, 12}, + {8, 53}, {8, 53}, // 00100100x + {8, 54}, {8, 54}, // 00100101x + {7, 26}, {7, 26}, {7, 26}, {7, 26}, // 0010011xx + {8, 39}, {8, 39}, // 00101000x + {8, 40}, {8, 40}, // 00101001x + {8, 41}, {8, 41}, // 00101010x + {8, 42}, {8, 42}, // 00101011x + {8, 43}, {8, 43}, // 00101100x + {8, 44}, {8, 44}, // 00101101x + {7, 21}, {7, 21}, {7, 21}, {7, 21}, // 0010111xx + {7, 28}, {7, 28}, {7, 28}, {7, 28}, // 0011000xx + {8, 61}, {8, 61}, // 00110010x + {8, 62}, {8, 62}, // 00110011x + {8, 63}, {8, 63}, // 00110100x + {8, 0}, {8, 0}, // 00110101x + {8, 320}, {8, 320}, // 00110110x + {8, 384}, {8, 384}, // 00110111x + {5, 10}, {5, 10}, {5, 10}, {5, 10}, // 00111xxxx + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 10}, {5, 10}, {5, 10}, {5, 10}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, // 01000xxxx + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {5, 11}, {5, 11}, {5, 11}, {5, 11}, + {7, 27}, {7, 27}, {7, 27}, {7, 27}, // 0100100xx + {8, 59}, {8, 59}, // 01001010x + {8, 60}, {8, 60}, // 01001011x + {9, 1472}, // 010011000 + {9, 1536}, // 010011001 + {9, 1600}, // 010011010 + {9, 1728}, // 010011011 + {7, 18}, {7, 18}, {7, 18}, {7, 18}, // 0100111xx + {7, 24}, {7, 24}, {7, 24}, {7, 24}, // 0101000xx + {8, 49}, {8, 49}, // 01010010x + {8, 50}, {8, 50}, // 01010011x + {8, 51}, {8, 51}, // 01010100x + {8, 52}, {8, 52}, // 01010101x + {7, 25}, {7, 25}, {7, 25}, {7, 25}, // 0101011xx + {8, 55}, {8, 55}, // 01011000x + {8, 56}, {8, 56}, // 01011001x + {8, 57}, {8, 57}, // 01011010x + {8, 58}, {8, 58}, // 01011011x + {6, 192}, {6, 192}, {6, 192}, {6, 192}, // 010111xxx + {6, 192}, {6, 192}, {6, 192}, {6, 192}, + {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, // 011000xxx + {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, + {8, 448}, {8, 448}, // 01100100x + {8, 512}, {8, 512}, // 01100101x + {9, 704}, // 011001100 + {9, 768}, // 011001101 + {8, 640}, {8, 640}, // 01100111x + {8, 576}, {8, 576}, // 01101000x + {9, 832}, // 011010010 + {9, 896}, // 011010011 + {9, 960}, // 011010100 + {9, 1024}, // 011010101 + {9, 1088}, // 011010110 + {9, 1152}, // 011010111 + {9, 1216}, // 011011000 + {9, 1280}, // 011011001 + {9, 1344}, // 011011010 + {9, 1408}, // 011011011 + {7, 256}, {7, 256}, {7, 256}, {7, 256}, // 0110111xx + {4, 2}, {4, 2}, {4, 2}, {4, 2}, // 0111xxxxx + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 2}, {4, 2}, {4, 2}, {4, 2}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, // 1000xxxxx + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {4, 3}, {4, 3}, {4, 3}, {4, 3}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, // 10010xxxx + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 128}, {5, 128}, {5, 128}, {5, 128}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, // 10011xxxx + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 8}, {5, 8}, {5, 8}, {5, 8}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, // 10100xxxx + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {5, 9}, {5, 9}, {5, 9}, {5, 9}, + {6, 16}, {6, 16}, {6, 16}, {6, 16}, // 101010xxx + {6, 16}, {6, 16}, {6, 16}, {6, 16}, + {6, 17}, {6, 17}, {6, 17}, {6, 17}, // 101011xxx + {6, 17}, {6, 17}, {6, 17}, {6, 17}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, // 1011xxxxx + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 4}, {4, 4}, {4, 4}, {4, 4}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 1100xxxxx + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {4, 5}, {4, 5}, {4, 5}, {4, 5}, + {6, 14}, {6, 14}, {6, 14}, {6, 14}, // 110100xxx + {6, 14}, {6, 14}, {6, 14}, {6, 14}, + {6, 15}, {6, 15}, {6, 15}, {6, 15}, // 110101xxx + {6, 15}, {6, 15}, {6, 15}, {6, 15}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, // 11011xxxx + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {5, 64}, {5, 64}, {5, 64}, {5, 64}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 1110xxxxx + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 6}, {4, 6}, {4, 6}, {4, 6}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, // 1111xxxxx + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7}, + {4, 7}, {4, 7}, {4, 7}, {4, 7} +}; + +//------------------------------------------------------------------------ +// black run lengths +//------------------------------------------------------------------------ + +// 10-13 bit codes (upper 6 bits are 0) +static CCITTCode blackTab1[128] = { + {-1, -1}, {-1, -1}, // 000000000000x + {12, ccittEOL}, {12, ccittEOL}, // 000000000001x + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000001xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000010xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000011xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000100xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000101xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000110xx + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000111xx + {11, 1792}, {11, 1792}, {11, 1792}, {11, 1792}, // 00000001000xx + {12, 1984}, {12, 1984}, // 000000010010x + {12, 2048}, {12, 2048}, // 000000010011x + {12, 2112}, {12, 2112}, // 000000010100x + {12, 2176}, {12, 2176}, // 000000010101x + {12, 2240}, {12, 2240}, // 000000010110x + {12, 2304}, {12, 2304}, // 000000010111x + {11, 1856}, {11, 1856}, {11, 1856}, {11, 1856}, // 00000001100xx + {11, 1920}, {11, 1920}, {11, 1920}, {11, 1920}, // 00000001101xx + {12, 2368}, {12, 2368}, // 000000011100x + {12, 2432}, {12, 2432}, // 000000011101x + {12, 2496}, {12, 2496}, // 000000011110x + {12, 2560}, {12, 2560}, // 000000011111x + {10, 18}, {10, 18}, {10, 18}, {10, 18}, // 0000001000xxx + {10, 18}, {10, 18}, {10, 18}, {10, 18}, + {12, 52}, {12, 52}, // 000000100100x + {13, 640}, // 0000001001010 + {13, 704}, // 0000001001011 + {13, 768}, // 0000001001100 + {13, 832}, // 0000001001101 + {12, 55}, {12, 55}, // 000000100111x + {12, 56}, {12, 56}, // 000000101000x + {13, 1280}, // 0000001010010 + {13, 1344}, // 0000001010011 + {13, 1408}, // 0000001010100 + {13, 1472}, // 0000001010101 + {12, 59}, {12, 59}, // 000000101011x + {12, 60}, {12, 60}, // 000000101100x + {13, 1536}, // 0000001011010 + {13, 1600}, // 0000001011011 + {11, 24}, {11, 24}, {11, 24}, {11, 24}, // 00000010111xx + {11, 25}, {11, 25}, {11, 25}, {11, 25}, // 00000011000xx + {13, 1664}, // 0000001100100 + {13, 1728}, // 0000001100101 + {12, 320}, {12, 320}, // 000000110011x + {12, 384}, {12, 384}, // 000000110100x + {12, 448}, {12, 448}, // 000000110101x + {13, 512}, // 0000001101100 + {13, 576}, // 0000001101101 + {12, 53}, {12, 53}, // 000000110111x + {12, 54}, {12, 54}, // 000000111000x + {13, 896}, // 0000001110010 + {13, 960}, // 0000001110011 + {13, 1024}, // 0000001110100 + {13, 1088}, // 0000001110101 + {13, 1152}, // 0000001110110 + {13, 1216}, // 0000001110111 + {10, 64}, {10, 64}, {10, 64}, {10, 64}, // 0000001111xxx + {10, 64}, {10, 64}, {10, 64}, {10, 64} +}; + +// 7-12 bit codes (upper 4 bits are 0) +static CCITTCode blackTab2[192] = { + {8, 13}, {8, 13}, {8, 13}, {8, 13}, // 00000100xxxx + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {8, 13}, {8, 13}, {8, 13}, {8, 13}, + {11, 23}, {11, 23}, // 00000101000x + {12, 50}, // 000001010010 + {12, 51}, // 000001010011 + {12, 44}, // 000001010100 + {12, 45}, // 000001010101 + {12, 46}, // 000001010110 + {12, 47}, // 000001010111 + {12, 57}, // 000001011000 + {12, 58}, // 000001011001 + {12, 61}, // 000001011010 + {12, 256}, // 000001011011 + {10, 16}, {10, 16}, {10, 16}, {10, 16}, // 0000010111xx + {10, 17}, {10, 17}, {10, 17}, {10, 17}, // 0000011000xx + {12, 48}, // 000001100100 + {12, 49}, // 000001100101 + {12, 62}, // 000001100110 + {12, 63}, // 000001100111 + {12, 30}, // 000001101000 + {12, 31}, // 000001101001 + {12, 32}, // 000001101010 + {12, 33}, // 000001101011 + {12, 40}, // 000001101100 + {12, 41}, // 000001101101 + {11, 22}, {11, 22}, // 00000110111x + {8, 14}, {8, 14}, {8, 14}, {8, 14}, // 00000111xxxx + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {8, 14}, {8, 14}, {8, 14}, {8, 14}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, // 0000100xxxxx + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 10}, {7, 10}, {7, 10}, {7, 10}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, // 0000101xxxxx + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {7, 11}, {7, 11}, {7, 11}, {7, 11}, + {9, 15}, {9, 15}, {9, 15}, {9, 15}, // 000011000xxx + {9, 15}, {9, 15}, {9, 15}, {9, 15}, + {12, 128}, // 000011001000 + {12, 192}, // 000011001001 + {12, 26}, // 000011001010 + {12, 27}, // 000011001011 + {12, 28}, // 000011001100 + {12, 29}, // 000011001101 + {11, 19}, {11, 19}, // 00001100111x + {11, 20}, {11, 20}, // 00001101000x + {12, 34}, // 000011010010 + {12, 35}, // 000011010011 + {12, 36}, // 000011010100 + {12, 37}, // 000011010101 + {12, 38}, // 000011010110 + {12, 39}, // 000011010111 + {11, 21}, {11, 21}, // 00001101100x + {12, 42}, // 000011011010 + {12, 43}, // 000011011011 + {10, 0}, {10, 0}, {10, 0}, {10, 0}, // 0000110111xx + {7, 12}, {7, 12}, {7, 12}, {7, 12}, // 0000111xxxxx + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12}, + {7, 12}, {7, 12}, {7, 12}, {7, 12} +}; + +// 2-6 bit codes +static CCITTCode blackTab3[64] = { + {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000xx + {6, 9}, // 000100 + {6, 8}, // 000101 + {5, 7}, {5, 7}, // 00011x + {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 0010xx + {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 0011xx + {3, 1}, {3, 1}, {3, 1}, {3, 1}, // 010xxx + {3, 1}, {3, 1}, {3, 1}, {3, 1}, + {3, 4}, {3, 4}, {3, 4}, {3, 4}, // 011xxx + {3, 4}, {3, 4}, {3, 4}, {3, 4}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, // 10xxxx + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 3}, {2, 3}, {2, 3}, {2, 3}, + {2, 2}, {2, 2}, {2, 2}, {2, 2}, // 11xxxx + {2, 2}, {2, 2}, {2, 2}, {2, 2}, + {2, 2}, {2, 2}, {2, 2}, {2, 2}, + {2, 2}, {2, 2}, {2, 2}, {2, 2} +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc new file mode 100644 index 000000000..567c10219 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc @@ -0,0 +1,4703 @@ +//======================================================================== +// +// Stream.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#ifndef WIN32 +#include +#else +extern "C" int unlink(char *filename); +#endif +#include +#include +#include "gmem.h" +#include "gfile.h" +#include "config.h" +#include "Error.h" +#include "Object.h" +#include "Lexer.h" +#include "GfxState.h" +#include "Stream.h" +#include "JBIG2Stream.h" +#include "JPXStream.h" +#include "Stream-CCITT.h" + +#ifdef __DJGPP__ +static GBool setDJSYSFLAGS = gFalse; +#endif + +#ifdef VMS +#ifdef __GNUC__ +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif +#endif + +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +Stream::Stream() { + ref = 1; +} + +Stream::~Stream() { +} + +void Stream::close() { +} + +int Stream::getRawChar() { + error(-1, "Internal: called getRawChar() on non-predictor stream"); + return EOF; +} + +char *Stream::getLine(char *buf, int size) { + int i; + int c; + + if (lookChar() == EOF) + return NULL; + for (i = 0; i < size - 1; ++i) { + c = getChar(); + if (c == EOF || c == '\n') + break; + if (c == '\r') { + if ((c = lookChar()) == '\n') + getChar(); + break; + } + buf[i] = c; + } + buf[i] = '\0'; + return buf; +} + +GString *Stream::getPSFilter(int psLevel, char *indent) { + return new GString(); +} + +Stream *Stream::addFilters(Object *dict) { + Object obj, obj2; + Object params, params2; + Stream *str; + int i; + + str = this; + dict->dictLookup("Filter", &obj); + if (obj.isNull()) { + obj.free(); + dict->dictLookup("F", &obj); + } + dict->dictLookup("DecodeParms", ¶ms); + if (params.isNull()) { + params.free(); + dict->dictLookup("DP", ¶ms); + } + if (obj.isName()) { + str = makeFilter(obj.getName(), str, ¶ms); + } else if (obj.isArray()) { + for (i = 0; i < obj.arrayGetLength(); ++i) { + obj.arrayGet(i, &obj2); + if (params.isArray()) + params.arrayGet(i, ¶ms2); + else + params2.initNull(); + if (obj2.isName()) { + str = makeFilter(obj2.getName(), str, ¶ms2); + } else { + error(getPos(), "Bad filter name"); + str = new EOFStream(str); + } + obj2.free(); + params2.free(); + } + } else if (!obj.isNull()) { + error(getPos(), "Bad 'Filter' attribute in stream"); + } + obj.free(); + params.free(); + + return str; +} + +Stream *Stream::makeFilter(char *name, Stream *str, Object *params) { + int pred; // parameters + int colors; + int bits; + int early; + int encoding; + GBool endOfLine, byteAlign, endOfBlock, black; + int columns, rows; + int colorXform; + Object globals, obj; + + if (!strcmp(name, "ASCIIHexDecode") || !strcmp(name, "AHx")) { + str = new ASCIIHexStream(str); + } else if (!strcmp(name, "ASCII85Decode") || !strcmp(name, "A85")) { + str = new ASCII85Stream(str); + } else if (!strcmp(name, "LZWDecode") || !strcmp(name, "LZW")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + early = 1; + if (params->isDict()) { + params->dictLookup("Predictor", &obj); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + params->dictLookup("EarlyChange", &obj); + if (obj.isInt()) + early = obj.getInt(); + obj.free(); + } + str = new LZWStream(str, pred, columns, colors, bits, early); + } else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) { + str = new RunLengthStream(str); + } else if (!strcmp(name, "CCITTFaxDecode") || !strcmp(name, "CCF")) { + encoding = 0; + endOfLine = gFalse; + byteAlign = gFalse; + columns = 1728; + rows = 0; + endOfBlock = gTrue; + black = gFalse; + if (params->isDict()) { + params->dictLookup("K", &obj); + if (obj.isInt()) { + encoding = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfLine", &obj); + if (obj.isBool()) { + endOfLine = obj.getBool(); + } + obj.free(); + params->dictLookup("EncodedByteAlign", &obj); + if (obj.isBool()) { + byteAlign = obj.getBool(); + } + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) { + columns = obj.getInt(); + } + obj.free(); + params->dictLookup("Rows", &obj); + if (obj.isInt()) { + rows = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfBlock", &obj); + if (obj.isBool()) { + endOfBlock = obj.getBool(); + } + obj.free(); + params->dictLookup("BlackIs1", &obj); + if (obj.isBool()) { + black = obj.getBool(); + } + obj.free(); + } + str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign, + columns, rows, endOfBlock, black); + } else if (!strcmp(name, "DCTDecode") || !strcmp(name, "DCT")) { + colorXform = -1; + if (params->isDict()) { + if (params->dictLookup("ColorTransform", &obj)->isInt()) { + colorXform = obj.getInt(); + } + obj.free(); + } + str = new DCTStream(str, colorXform); + } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + if (params->isDict()) { + params->dictLookup("Predictor", &obj); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + } + str = new FlateStream(str, pred, columns, colors, bits); + } else if (!strcmp(name, "JBIG2Decode")) { + if (params->isDict()) { + params->dictLookup("JBIG2Globals", &globals); + } + str = new JBIG2Stream(str, &globals); + globals.free(); + } else if (!strcmp(name, "JPXDecode")) { + str = new JPXStream(str); + } else { + error(getPos(), "Unknown filter '%s'", name); + str = new EOFStream(str); + } + return str; +} + +//------------------------------------------------------------------------ +// BaseStream +//------------------------------------------------------------------------ + +BaseStream::BaseStream(Object *dictA) { + dict = *dictA; +} + +BaseStream::~BaseStream() { + dict.free(); +} + +//------------------------------------------------------------------------ +// FilterStream +//------------------------------------------------------------------------ + +FilterStream::FilterStream(Stream *strA) { + str = strA; +} + +FilterStream::~FilterStream() { +} + +void FilterStream::close() { + str->close(); +} + +void FilterStream::setPos(Guint pos, int dir) { + error(-1, "Internal: called setPos() on FilterStream"); +} + +//------------------------------------------------------------------------ +// ImageStream +//------------------------------------------------------------------------ + +ImageStream::ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA) { + int imgLineSize; + + str = strA; + width = widthA; + nComps = nCompsA; + nBits = nBitsA; + + nVals = width * nComps; + if (nBits == 1) { + imgLineSize = (nVals + 7) & ~7; + } else { + imgLineSize = nVals; + } + imgLine = (Guchar *)gmallocn(imgLineSize, sizeof(Guchar)); + imgIdx = nVals; +} + +ImageStream::~ImageStream() { + gfree(imgLine); +} + +void ImageStream::reset() { + str->reset(); +} + +GBool ImageStream::getPixel(Guchar *pix) { + int i; + + if (imgIdx >= nVals) { + getLine(); + imgIdx = 0; + } + for (i = 0; i < nComps; ++i) { + pix[i] = imgLine[imgIdx++]; + } + return gTrue; +} + +Guchar *ImageStream::getLine() { + Gulong buf, bitMask; + int bits; + int c; + int i; + + if (nBits == 1) { + for (i = 0; i < nVals; i += 8) { + c = str->getChar(); + imgLine[i+0] = (Guchar)((c >> 7) & 1); + imgLine[i+1] = (Guchar)((c >> 6) & 1); + imgLine[i+2] = (Guchar)((c >> 5) & 1); + imgLine[i+3] = (Guchar)((c >> 4) & 1); + imgLine[i+4] = (Guchar)((c >> 3) & 1); + imgLine[i+5] = (Guchar)((c >> 2) & 1); + imgLine[i+6] = (Guchar)((c >> 1) & 1); + imgLine[i+7] = (Guchar)(c & 1); + } + } else if (nBits == 8) { + for (i = 0; i < nVals; ++i) { + imgLine[i] = str->getChar(); + } + } else { + bitMask = (1 << nBits) - 1; + buf = 0; + bits = 0; + for (i = 0; i < nVals; ++i) { + if (bits < nBits) { + buf = (buf << 8) | (str->getChar() & 0xff); + bits += 8; + } + imgLine[i] = (Guchar)((buf >> (bits - nBits)) & bitMask); + bits -= nBits; + } + } + return imgLine; +} + +void ImageStream::skipLine() { + int n, i; + + n = (nVals * nBits + 7) >> 3; + for (i = 0; i < n; ++i) { + str->getChar(); + } +} + +//------------------------------------------------------------------------ +// StreamPredictor +//------------------------------------------------------------------------ + +StreamPredictor::StreamPredictor(Stream *strA, int predictorA, + int widthA, int nCompsA, int nBitsA) { + str = strA; + predictor = predictorA; + width = widthA; + nComps = nCompsA; + nBits = nBitsA; + predLine = NULL; + ok = gFalse; + + nVals = width * nComps; + pixBytes = (nComps * nBits + 7) >> 3; + rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; + if (width <= 0 || nComps <= 0 || nBits <= 0 || + nComps > gfxColorMaxComps || + nBits > 16 || + width >= INT_MAX / nComps || // check for overflow in nVals + nVals >= (INT_MAX - 7) / nBits) { // check for overflow in rowBytes + return; + } + predLine = (Guchar *)gmalloc(rowBytes); + memset(predLine, 0, rowBytes); + predIdx = rowBytes; + + ok = gTrue; +} + +StreamPredictor::~StreamPredictor() { + gfree(predLine); +} + +int StreamPredictor::lookChar() { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + return EOF; + } + } + return predLine[predIdx]; +} + +int StreamPredictor::getChar() { + if (predIdx >= rowBytes) { + if (!getNextLine()) { + return EOF; + } + } + return predLine[predIdx++]; +} + +GBool StreamPredictor::getNextLine() { + int curPred; + Guchar upLeftBuf[gfxColorMaxComps * 2 + 1]; + int left, up, upLeft, p, pa, pb, pc; + int c; + Gulong inBuf, outBuf, bitMask; + int inBits, outBits; + int i, j, k, kk; + + // get PNG optimum predictor number + if (predictor >= 10) { + if ((curPred = str->getRawChar()) == EOF) { + return gFalse; + } + curPred += 10; + } else { + curPred = predictor; + } + + // read the raw line, apply PNG (byte) predictor + memset(upLeftBuf, 0, pixBytes + 1); + for (i = pixBytes; i < rowBytes; ++i) { + for (j = pixBytes; j > 0; --j) { + upLeftBuf[j] = upLeftBuf[j-1]; + } + upLeftBuf[0] = predLine[i]; + if ((c = str->getRawChar()) == EOF) { + if (i > pixBytes) { + // this ought to return false, but some (broken) PDF files + // contain truncated image data, and Adobe apparently reads the + // last partial line + break; + } + return gFalse; + } + switch (curPred) { + case 11: // PNG sub + predLine[i] = predLine[i - pixBytes] + (Guchar)c; + break; + case 12: // PNG up + predLine[i] = predLine[i] + (Guchar)c; + break; + case 13: // PNG average + predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) + + (Guchar)c; + break; + case 14: // PNG Paeth + left = predLine[i - pixBytes]; + up = predLine[i]; + upLeft = upLeftBuf[pixBytes]; + p = left + up - upLeft; + if ((pa = p - left) < 0) + pa = -pa; + if ((pb = p - up) < 0) + pb = -pb; + if ((pc = p - upLeft) < 0) + pc = -pc; + if (pa <= pb && pa <= pc) + predLine[i] = left + (Guchar)c; + else if (pb <= pc) + predLine[i] = up + (Guchar)c; + else + predLine[i] = upLeft + (Guchar)c; + break; + case 10: // PNG none + default: // no predictor or TIFF predictor + predLine[i] = (Guchar)c; + break; + } + } + + // apply TIFF (component) predictor + if (predictor == 2) { + if (nBits == 1) { + inBuf = predLine[pixBytes - 1]; + for (i = pixBytes; i < rowBytes; i += 8) { + // 1-bit add is just xor + inBuf = (inBuf << 8) | predLine[i]; + predLine[i] ^= inBuf >> nComps; + } + } else if (nBits == 8) { + for (i = pixBytes; i < rowBytes; ++i) { + predLine[i] += predLine[i - nComps]; + } + } else { + memset(upLeftBuf, 0, nComps + 1); + bitMask = (1 << nBits) - 1; + inBuf = outBuf = 0; + inBits = outBits = 0; + j = k = pixBytes; + for (i = 0; i < width; ++i) { + for (kk = 0; kk < nComps; ++kk) { + if (inBits < nBits) { + inBuf = (inBuf << 8) | (predLine[j++] & 0xff); + inBits += 8; + } + upLeftBuf[kk] = (Guchar)((upLeftBuf[kk] + + (inBuf >> (inBits - nBits))) & bitMask); + inBits -= nBits; + outBuf = (outBuf << nBits) | upLeftBuf[kk]; + outBits += nBits; + if (outBits >= 8) { + predLine[k++] = (Guchar)(outBuf >> (outBits - 8)); + outBits -= 8; + } + } + } + if (outBits > 0) { + predLine[k++] = (Guchar)((outBuf << (8 - outBits)) + + (inBuf & ((1 << (8 - outBits)) - 1))); + } + } + } + + // reset to start of line + predIdx = pixBytes; + + return gTrue; +} + +//------------------------------------------------------------------------ +// FileStream +//------------------------------------------------------------------------ + +FileStream::FileStream(FILE *fA, Guint startA, GBool limitedA, + Guint lengthA, Object *dictA): + BaseStream(dictA) { + f = fA; + start = startA; + limited = limitedA; + length = lengthA; + bufPtr = bufEnd = buf; + bufPos = start; + savePos = 0; + saved = gFalse; +} + +FileStream::~FileStream() { + close(); +} + +Stream *FileStream::makeSubStream(Guint startA, GBool limitedA, + Guint lengthA, Object *dictA) { + return new FileStream(f, startA, limitedA, lengthA, dictA); +} + +void FileStream::reset() { +#if HAVE_FSEEKO + savePos = (Guint)ftello(f); + fseeko(f, start, SEEK_SET); +#elif HAVE_FSEEK64 + savePos = (Guint)ftell64(f); + fseek64(f, start, SEEK_SET); +#else + savePos = (Guint)ftell(f); + fseek(f, start, SEEK_SET); +#endif + saved = gTrue; + bufPtr = bufEnd = buf; + bufPos = start; +} + +void FileStream::close() { + if (saved) { +#if HAVE_FSEEKO + fseeko(f, savePos, SEEK_SET); +#elif HAVE_FSEEK64 + fseek64(f, savePos, SEEK_SET); +#else + fseek(f, savePos, SEEK_SET); +#endif + saved = gFalse; + } +} + +GBool FileStream::fillBuf() { + int n; + + bufPos += bufEnd - buf; + bufPtr = bufEnd = buf; + if (limited && bufPos >= start + length) { + return gFalse; + } + if (limited && bufPos + fileStreamBufSize > start + length) { + n = start + length - bufPos; + } else { + n = fileStreamBufSize; + } + n = fread(buf, 1, n, f); + bufEnd = buf + n; + if (bufPtr >= bufEnd) { + return gFalse; + } + return gTrue; +} + +void FileStream::setPos(Guint pos, int dir) { + Guint size; + + if (dir >= 0) { +#if HAVE_FSEEKO + fseeko(f, pos, SEEK_SET); +#elif HAVE_FSEEK64 + fseek64(f, pos, SEEK_SET); +#else + fseek(f, pos, SEEK_SET); +#endif + bufPos = pos; + } else { +#if HAVE_FSEEKO + fseeko(f, 0, SEEK_END); + size = (Guint)ftello(f); +#elif HAVE_FSEEK64 + fseek64(f, 0, SEEK_END); + size = (Guint)ftell64(f); +#else + fseek(f, 0, SEEK_END); + size = (Guint)ftell(f); +#endif + if (pos > size) + pos = (Guint)size; +#ifdef __CYGWIN32__ + //~ work around a bug in cygwin's implementation of fseek + rewind(f); +#endif +#if HAVE_FSEEKO + fseeko(f, -(int)pos, SEEK_END); + bufPos = (Guint)ftello(f); +#elif HAVE_FSEEK64 + fseek64(f, -(int)pos, SEEK_END); + bufPos = (Guint)ftell64(f); +#else + fseek(f, -(int)pos, SEEK_END); + bufPos = (Guint)ftell(f); +#endif + } + bufPtr = bufEnd = buf; +} + +void FileStream::moveStart(int delta) { + start += delta; + bufPtr = bufEnd = buf; + bufPos = start; +} + +//------------------------------------------------------------------------ +// MemStream +//------------------------------------------------------------------------ + +MemStream::MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA): + BaseStream(dictA) { + buf = bufA; + start = startA; + length = lengthA; + bufEnd = buf + start + length; + bufPtr = buf + start; + needFree = gFalse; +} + +MemStream::~MemStream() { + if (needFree) { + gfree(buf); + } +} + +Stream *MemStream::makeSubStream(Guint startA, GBool limited, + Guint lengthA, Object *dictA) { + MemStream *subStr; + Guint newLength; + + if (!limited || startA + lengthA > start + length) { + newLength = start + length - startA; + } else { + newLength = lengthA; + } + subStr = new MemStream(buf, startA, newLength, dictA); + return subStr; +} + +void MemStream::reset() { + bufPtr = buf + start; +} + +void MemStream::close() { +} + +void MemStream::setPos(Guint pos, int dir) { + Guint i; + + if (dir >= 0) { + i = pos; + } else { + i = start + length - pos; + } + if (i < start) { + i = start; + } else if (i > start + length) { + i = start + length; + } + bufPtr = buf + i; +} + +void MemStream::moveStart(int delta) { + start += delta; + length -= delta; + bufPtr = buf + start; +} + +//------------------------------------------------------------------------ +// EmbedStream +//------------------------------------------------------------------------ + +EmbedStream::EmbedStream(Stream *strA, Object *dictA, + GBool limitedA, Guint lengthA): + BaseStream(dictA) { + str = strA; + limited = limitedA; + length = lengthA; +} + +EmbedStream::~EmbedStream() { +} + +Stream *EmbedStream::makeSubStream(Guint start, GBool limitedA, + Guint lengthA, Object *dictA) { + error(-1, "Internal: called makeSubStream() on EmbedStream"); + return NULL; +} + +int EmbedStream::getChar() { + if (limited && !length) { + return EOF; + } + --length; + return str->getChar(); +} + +int EmbedStream::lookChar() { + if (limited && !length) { + return EOF; + } + return str->lookChar(); +} + +void EmbedStream::setPos(Guint pos, int dir) { + error(-1, "Internal: called setPos() on EmbedStream"); +} + +Guint EmbedStream::getStart() { + error(-1, "Internal: called getStart() on EmbedStream"); + return 0; +} + +void EmbedStream::moveStart(int delta) { + error(-1, "Internal: called moveStart() on EmbedStream"); +} + +//------------------------------------------------------------------------ +// ASCIIHexStream +//------------------------------------------------------------------------ + +ASCIIHexStream::ASCIIHexStream(Stream *strA): + FilterStream(strA) { + buf = EOF; + eof = gFalse; +} + +ASCIIHexStream::~ASCIIHexStream() { + delete str; +} + +void ASCIIHexStream::reset() { + str->reset(); + buf = EOF; + eof = gFalse; +} + +int ASCIIHexStream::lookChar() { + int c1, c2, x; + + if (buf != EOF) + return buf; + if (eof) { + buf = EOF; + return EOF; + } + do { + c1 = str->getChar(); + } while (isspace(c1)); + if (c1 == '>') { + eof = gTrue; + buf = EOF; + return buf; + } + do { + c2 = str->getChar(); + } while (isspace(c2)); + if (c2 == '>') { + eof = gTrue; + c2 = '0'; + } + if (c1 >= '0' && c1 <= '9') { + x = (c1 - '0') << 4; + } else if (c1 >= 'A' && c1 <= 'F') { + x = (c1 - 'A' + 10) << 4; + } else if (c1 >= 'a' && c1 <= 'f') { + x = (c1 - 'a' + 10) << 4; + } else if (c1 == EOF) { + eof = gTrue; + x = 0; + } else { + error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c1); + x = 0; + } + if (c2 >= '0' && c2 <= '9') { + x += c2 - '0'; + } else if (c2 >= 'A' && c2 <= 'F') { + x += c2 - 'A' + 10; + } else if (c2 >= 'a' && c2 <= 'f') { + x += c2 - 'a' + 10; + } else if (c2 == EOF) { + eof = gTrue; + x = 0; + } else { + error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c2); + } + buf = x & 0xff; + return buf; +} + +GString *ASCIIHexStream::getPSFilter(int psLevel, char *indent) { + GString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("/ASCIIHexDecode filter\n"); + return s; +} + +GBool ASCIIHexStream::isBinary(GBool last) { + return str->isBinary(gFalse); +} + +//------------------------------------------------------------------------ +// ASCII85Stream +//------------------------------------------------------------------------ + +ASCII85Stream::ASCII85Stream(Stream *strA): + FilterStream(strA) { + index = n = 0; + eof = gFalse; +} + +ASCII85Stream::~ASCII85Stream() { + delete str; +} + +void ASCII85Stream::reset() { + str->reset(); + index = n = 0; + eof = gFalse; +} + +int ASCII85Stream::lookChar() { + int k; + Gulong t; + + if (index >= n) { + if (eof) + return EOF; + index = 0; + do { + c[0] = str->getChar(); + } while (Lexer::isSpace(c[0])); + if (c[0] == '~' || c[0] == EOF) { + eof = gTrue; + n = 0; + return EOF; + } else if (c[0] == 'z') { + b[0] = b[1] = b[2] = b[3] = 0; + n = 4; + } else { + for (k = 1; k < 5; ++k) { + do { + c[k] = str->getChar(); + } while (Lexer::isSpace(c[k])); + if (c[k] == '~' || c[k] == EOF) + break; + } + n = k - 1; + if (k < 5 && (c[k] == '~' || c[k] == EOF)) { + for (++k; k < 5; ++k) + c[k] = 0x21 + 84; + eof = gTrue; + } + t = 0; + for (k = 0; k < 5; ++k) + t = t * 85 + (c[k] - 0x21); + for (k = 3; k >= 0; --k) { + b[k] = (int)(t & 0xff); + t >>= 8; + } + } + } + return b[index]; +} + +GString *ASCII85Stream::getPSFilter(int psLevel, char *indent) { + GString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("/ASCII85Decode filter\n"); + return s; +} + +GBool ASCII85Stream::isBinary(GBool last) { + return str->isBinary(gFalse); +} + +//------------------------------------------------------------------------ +// LZWStream +//------------------------------------------------------------------------ + +LZWStream::LZWStream(Stream *strA, int predictor, int columns, int colors, + int bits, int earlyA): + FilterStream(strA) { + if (predictor != 1) { + pred = new StreamPredictor(this, predictor, columns, colors, bits); + if (!pred->isOk()) { + delete pred; + pred = NULL; + } + } else { + pred = NULL; + } + early = earlyA; + eof = gFalse; + inputBits = 0; + clearTable(); +} + +LZWStream::~LZWStream() { + if (pred) { + delete pred; + } + delete str; +} + +int LZWStream::getChar() { + if (pred) { + return pred->getChar(); + } + if (eof) { + return EOF; + } + if (seqIndex >= seqLength) { + if (!processNextCode()) { + return EOF; + } + } + return seqBuf[seqIndex++]; +} + +int LZWStream::lookChar() { + if (pred) { + return pred->lookChar(); + } + if (eof) { + return EOF; + } + if (seqIndex >= seqLength) { + if (!processNextCode()) { + return EOF; + } + } + return seqBuf[seqIndex]; +} + +int LZWStream::getRawChar() { + if (eof) { + return EOF; + } + if (seqIndex >= seqLength) { + if (!processNextCode()) { + return EOF; + } + } + return seqBuf[seqIndex++]; +} + +void LZWStream::reset() { + str->reset(); + eof = gFalse; + inputBits = 0; + clearTable(); +} + +GBool LZWStream::processNextCode() { + int code; + int nextLength; + int i, j; + + // check for EOF + if (eof) { + return gFalse; + } + + // check for eod and clear-table codes + start: + code = getCode(); + if (code == EOF || code == 257) { + eof = gTrue; + return gFalse; + } + if (code == 256) { + clearTable(); + goto start; + } + if (nextCode >= 4097) { + error(getPos(), "Bad LZW stream - expected clear-table code"); + clearTable(); + } + + // process the next code + nextLength = seqLength + 1; + if (code < 256) { + seqBuf[0] = code; + seqLength = 1; + } else if (code < nextCode) { + seqLength = table[code].length; + for (i = seqLength - 1, j = code; i > 0; --i) { + seqBuf[i] = table[j].tail; + j = table[j].head; + } + seqBuf[0] = j; + } else if (code == nextCode) { + seqBuf[seqLength] = newChar; + ++seqLength; + } else { + error(getPos(), "Bad LZW stream - unexpected code"); + eof = gTrue; + return gFalse; + } + newChar = seqBuf[0]; + if (first) { + first = gFalse; + } else { + table[nextCode].length = nextLength; + table[nextCode].head = prevCode; + table[nextCode].tail = newChar; + ++nextCode; + if (nextCode + early == 512) + nextBits = 10; + else if (nextCode + early == 1024) + nextBits = 11; + else if (nextCode + early == 2048) + nextBits = 12; + } + prevCode = code; + + // reset buffer + seqIndex = 0; + + return gTrue; +} + +void LZWStream::clearTable() { + nextCode = 258; + nextBits = 9; + seqIndex = seqLength = 0; + first = gTrue; +} + +int LZWStream::getCode() { + int c; + int code; + + while (inputBits < nextBits) { + if ((c = str->getChar()) == EOF) + return EOF; + inputBuf = (inputBuf << 8) | (c & 0xff); + inputBits += 8; + } + code = (inputBuf >> (inputBits - nextBits)) & ((1 << nextBits) - 1); + inputBits -= nextBits; + return code; +} + +GString *LZWStream::getPSFilter(int psLevel, char *indent) { + GString *s; + + if (psLevel < 2 || pred) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< "); + if (!early) { + s->append("/EarlyChange 0 "); + } + s->append(">> /LZWDecode filter\n"); + return s; +} + +GBool LZWStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// RunLengthStream +//------------------------------------------------------------------------ + +RunLengthStream::RunLengthStream(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + eof = gFalse; +} + +RunLengthStream::~RunLengthStream() { + delete str; +} + +void RunLengthStream::reset() { + str->reset(); + bufPtr = bufEnd = buf; + eof = gFalse; +} + +GString *RunLengthStream::getPSFilter(int psLevel, char *indent) { + GString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("/RunLengthDecode filter\n"); + return s; +} + +GBool RunLengthStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +GBool RunLengthStream::fillBuf() { + int c; + int n, i; + + if (eof) + return gFalse; + c = str->getChar(); + if (c == 0x80 || c == EOF) { + eof = gTrue; + return gFalse; + } + if (c < 0x80) { + n = c + 1; + for (i = 0; i < n; ++i) + buf[i] = (char)str->getChar(); + } else { + n = 0x101 - c; + c = str->getChar(); + for (i = 0; i < n; ++i) + buf[i] = (char)c; + } + bufPtr = buf; + bufEnd = buf + n; + return gTrue; +} + +//------------------------------------------------------------------------ +// CCITTFaxStream +//------------------------------------------------------------------------ + +CCITTFaxStream::CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA, + GBool byteAlignA, int columnsA, int rowsA, + GBool endOfBlockA, GBool blackA): + FilterStream(strA) { + encoding = encodingA; + endOfLine = endOfLineA; + byteAlign = byteAlignA; + columns = columnsA; + if (columns < 1) { + columns = 1; + } else if (columns > INT_MAX - 2) { + columns = INT_MAX - 2; + } + rows = rowsA; + endOfBlock = endOfBlockA; + black = blackA; + // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = columns + // ---> max codingLine size = columns + 1 + // refLine has one extra guard entry at the end + // ---> max refLine size = columns + 2 + codingLine = (int *)gmallocn(columns + 1, sizeof(int)); + refLine = (int *)gmallocn(columns + 2, sizeof(int)); + + eof = gFalse; + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; + codingLine[0] = columns; + a0i = 0; + outputBits = 0; + + buf = EOF; +} + +CCITTFaxStream::~CCITTFaxStream() { + delete str; + gfree(refLine); + gfree(codingLine); +} + +void CCITTFaxStream::reset() { + short code1; + + str->reset(); + eof = gFalse; + row = 0; + nextLine2D = encoding < 0; + inputBits = 0; + codingLine[0] = columns; + a0i = 0; + outputBits = 0; + buf = EOF; + + // skip any initial zero bits and end-of-line marker, and get the 2D + // encoding tag + while ((code1 = lookBits(12)) == 0) { + eatBits(1); + } + if (code1 == 0x001) { + eatBits(12); + } + if (encoding > 0) { + nextLine2D = !lookBits(1); + eatBits(1); + } +} + +inline void CCITTFaxStream::addPixels(int a1, int blackPixels) { + if (a1 > codingLine[a0i]) { + if (a1 > columns) { + error(getPos(), "CCITTFax row is wrong length (%d)", a1); + err = gTrue; + a1 = columns; + } + if ((a0i & 1) ^ blackPixels) { + ++a0i; + } + codingLine[a0i] = a1; + } +} + +inline void CCITTFaxStream::addPixelsNeg(int a1, int blackPixels) { + if (a1 > codingLine[a0i]) { + if (a1 > columns) { + error(getPos(), "CCITTFax row is wrong length (%d)", a1); + err = gTrue; + a1 = columns; + } + if ((a0i & 1) ^ blackPixels) { + ++a0i; + } + codingLine[a0i] = a1; + } else if (a1 < codingLine[a0i]) { + if (a1 < 0) { + error(getPos(), "Invalid CCITTFax code"); + err = gTrue; + a1 = 0; + } + while (a0i > 0 && a1 <= codingLine[a0i - 1]) { + --a0i; + } + codingLine[a0i] = a1; + } +} + +int CCITTFaxStream::lookChar() { + short code1, code2, code3; + int b1i, blackPixels, i, bits; + GBool gotEOL; + + if (buf != EOF) { + return buf; + } + + // read the next row + if (outputBits == 0) { + + // if at eof just return EOF + if (eof) { + return EOF; + } + + err = gFalse; + + // 2-D encoding + if (nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; + a0i = 0; + b1i = 0; + blackPixels = 0; + // invariant: + // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] + // <= columns + // exception at left edge: + // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible + // exception at right edge: + // refLine[b1i] = refLine[b1i+1] = columns is possible + while (codingLine[a0i] < columns) { + code1 = getTwoDimCode(); + switch (code1) { + case twoDimPass: + addPixels(refLine[b1i + 1], blackPixels); + if (refLine[b1i + 1] < columns) { + b1i += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = getBlackCode(); + } while (code3 >= 64); + } + addPixels(codingLine[a0i] + code1, blackPixels); + if (codingLine[a0i] < columns) { + addPixels(codingLine[a0i] + code2, blackPixels ^ 1); + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + break; + case twoDimVertR3: + addPixels(refLine[b1i] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertR2: + addPixels(refLine[b1i] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertR1: + addPixels(refLine[b1i] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVert0: + addPixels(refLine[b1i], blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertL3: + addPixelsNeg(refLine[b1i] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertL2: + addPixelsNeg(refLine[b1i] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case twoDimVertL1: + addPixelsNeg(refLine[b1i] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + if (b1i > 0) { + --b1i; + } else { + ++b1i; + } + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + } + } + break; + case EOF: + addPixels(columns, 0); + eof = gTrue; + break; + default: + error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1); + addPixels(columns, 0); + err = gTrue; + break; + } + } + + // 1-D encoding + } else { + codingLine[0] = 0; + a0i = 0; + blackPixels = 0; + while (codingLine[a0i] < columns) { + code1 = 0; + if (blackPixels) { + do { + code1 += code3 = getBlackCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = getWhiteCode(); + } while (code3 >= 64); + } + addPixels(codingLine[a0i] + code1, blackPixels); + blackPixels ^= 1; + } + } + + // byte-align the row + if (byteAlign) { + inputBits &= ~7; + } + + // check for end-of-line marker, skipping over any extra zero bits + gotEOL = gFalse; + if (!endOfBlock && row == rows - 1) { + eof = gTrue; + } else { + code1 = lookBits(12); + while (code1 == 0) { + eatBits(1); + code1 = lookBits(12); + } + if (code1 == 0x001) { + eatBits(12); + gotEOL = gTrue; + } else if (code1 == EOF) { + eof = gTrue; + } + } + + // get 2D encoding tag + if (!eof && encoding > 0) { + nextLine2D = !lookBits(1); + eatBits(1); + } + + // check for end-of-block marker + if (endOfBlock && gotEOL) { + code1 = lookBits(12); + if (code1 == 0x001) { + eatBits(12); + if (encoding > 0) { + lookBits(1); + eatBits(1); + } + if (encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = lookBits(12); + if (code1 != 0x001) { + error(getPos(), "Bad RTC code in CCITTFax stream"); + } + eatBits(12); + if (encoding > 0) { + lookBits(1); + eatBits(1); + } + } + } + eof = gTrue; + } + + // look for an end-of-line marker after an error -- we only do + // this if we know the stream contains end-of-line markers because + // the "just plow on" technique tends to work better otherwise + } else if (err && endOfLine) { + while (1) { + code1 = lookBits(13); + if (code1 == EOF) { + eof = gTrue; + return EOF; + } + if ((code1 >> 1) == 0x001) { + break; + } + eatBits(1); + } + eatBits(12); + if (encoding > 0) { + eatBits(1); + nextLine2D = !(code1 & 1); + } + } + + // set up for output + if (codingLine[0] > 0) { + outputBits = codingLine[a0i = 0]; + } else { + outputBits = codingLine[a0i = 1]; + } + + ++row; + } + + // get a byte + if (outputBits >= 8) { + buf = (a0i & 1) ? 0x00 : 0xff; + outputBits -= 8; + if (outputBits == 0 && codingLine[a0i] < columns) { + ++a0i; + outputBits = codingLine[a0i] - codingLine[a0i - 1]; + } + } else { + bits = 8; + buf = 0; + do { + if (outputBits > bits) { + buf <<= bits; + if (!(a0i & 1)) { + buf |= 0xff >> (8 - bits); + } + outputBits -= bits; + bits = 0; + } else { + buf <<= outputBits; + if (!(a0i & 1)) { + buf |= 0xff >> (8 - outputBits); + } + bits -= outputBits; + outputBits = 0; + if (codingLine[a0i] < columns) { + ++a0i; + outputBits = codingLine[a0i] - codingLine[a0i - 1]; + } else if (bits > 0) { + buf <<= bits; + bits = 0; + } + } + } while (bits); + } + if (black) { + buf ^= 0xff; + } + return buf; +} + +short CCITTFaxStream::getTwoDimCode() { + short code; + CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(7); + p = &twoDimTab1[code]; + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 1; n <= 7; ++n) { + code = lookBits(n); + if (n < 7) { + code <<= 7 - n; + } + p = &twoDimTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(getPos(), "Bad two dim code (%04x) in CCITTFax stream", code); + return EOF; +} + +short CCITTFaxStream::getWhiteCode() { + short code; + CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(12); + if (code == EOF) { + return 1; + } + if ((code >> 5) == 0) { + p = &whiteTab1[code]; + } else { + p = &whiteTab2[code >> 3]; + } + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 1; n <= 9; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 9) { + code <<= 9 - n; + } + p = &whiteTab2[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + for (n = 11; n <= 12; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 12) { + code <<= 12 - n; + } + p = &whiteTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(getPos(), "Bad white code (%04x) in CCITTFax stream", code); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + eatBits(1); + return 1; +} + +short CCITTFaxStream::getBlackCode() { + short code; + CCITTCode *p; + int n; + + code = 0; // make gcc happy + if (endOfBlock) { + code = lookBits(13); + if (code == EOF) { + return 1; + } + if ((code >> 7) == 0) { + p = &blackTab1[code]; + } else if ((code >> 9) == 0 && (code >> 7) != 0) { + p = &blackTab2[(code >> 1) - 64]; + } else { + p = &blackTab3[code >> 7]; + } + if (p->bits > 0) { + eatBits(p->bits); + return p->n; + } + } else { + for (n = 2; n <= 6; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 6) { + code <<= 6 - n; + } + p = &blackTab3[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + for (n = 7; n <= 12; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 12) { + code <<= 12 - n; + } + if (code >= 64) { + p = &blackTab2[code - 64]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + for (n = 10; n <= 13; ++n) { + code = lookBits(n); + if (code == EOF) { + return 1; + } + if (n < 13) { + code <<= 13 - n; + } + p = &blackTab1[code]; + if (p->bits == n) { + eatBits(n); + return p->n; + } + } + } + error(getPos(), "Bad black code (%04x) in CCITTFax stream", code); + // eat a bit and return a positive number so that the caller doesn't + // go into an infinite loop + eatBits(1); + return 1; +} + +short CCITTFaxStream::lookBits(int n) { + int c; + + while (inputBits < n) { + if ((c = str->getChar()) == EOF) { + if (inputBits == 0) { + return EOF; + } + // near the end of the stream, the caller may ask for more bits + // than are available, but there may still be a valid code in + // however many bits are available -- we need to return correct + // data in this case + return (inputBuf << (n - inputBits)) & (0xffff >> (16 - n)); + } + inputBuf = (inputBuf << 8) + c; + inputBits += 8; + } + return (inputBuf >> (inputBits - n)) & (0xffff >> (16 - n)); +} + +GString *CCITTFaxStream::getPSFilter(int psLevel, char *indent) { + GString *s; + char s1[50]; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< "); + if (encoding != 0) { + sprintf(s1, "/K %d ", encoding); + s->append(s1); + } + if (endOfLine) { + s->append("/EndOfLine true "); + } + if (byteAlign) { + s->append("/EncodedByteAlign true "); + } + sprintf(s1, "/Columns %d ", columns); + s->append(s1); + if (rows != 0) { + sprintf(s1, "/Rows %d ", rows); + s->append(s1); + } + if (!endOfBlock) { + s->append("/EndOfBlock false "); + } + if (black) { + s->append("/BlackIs1 true "); + } + s->append(">> /CCITTFaxDecode filter\n"); + return s; +} + +GBool CCITTFaxStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// DCTStream +//------------------------------------------------------------------------ + +// IDCT constants (20.12 fixed point format) +#define dctCos1 4017 // cos(pi/16) +#define dctSin1 799 // sin(pi/16) +#define dctCos3 3406 // cos(3*pi/16) +#define dctSin3 2276 // sin(3*pi/16) +#define dctCos6 1567 // cos(6*pi/16) +#define dctSin6 3784 // sin(6*pi/16) +#define dctSqrt2 5793 // sqrt(2) +#define dctSqrt1d2 2896 // sqrt(2) / 2 + +// color conversion parameters (16.16 fixed point format) +#define dctCrToR 91881 // 1.4020 +#define dctCbToG -22553 // -0.3441363 +#define dctCrToG -46802 // -0.71413636 +#define dctCbToB 116130 // 1.772 + +// clip [-256,511] --> [0,255] +#define dctClipOffset 256 +static Guchar dctClip[768]; +static int dctClipInit = 0; + +// zig zag decode map +static int dctZigZag[64] = { + 0, + 1, 8, + 16, 9, 2, + 3, 10, 17, 24, + 32, 25, 18, 11, 4, + 5, 12, 19, 26, 33, 40, + 48, 41, 34, 27, 20, 13, 6, + 7, 14, 21, 28, 35, 42, 49, 56, + 57, 50, 43, 36, 29, 22, 15, + 23, 30, 37, 44, 51, 58, + 59, 52, 45, 38, 31, + 39, 46, 53, 60, + 61, 54, 47, + 55, 62, + 63 +}; + +DCTStream::DCTStream(Stream *strA, GBool colorXformA): + FilterStream(strA) { + int i, j; + + colorXform = colorXformA; + progressive = interleaved = gFalse; + width = height = 0; + mcuWidth = mcuHeight = 0; + numComps = 0; + comp = 0; + x = y = dy = 0; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 32; ++j) { + rowBuf[i][j] = NULL; + } + frameBuf[i] = NULL; + } + + if (!dctClipInit) { + for (i = -256; i < 0; ++i) + dctClip[dctClipOffset + i] = 0; + for (i = 0; i < 256; ++i) + dctClip[dctClipOffset + i] = i; + for (i = 256; i < 512; ++i) + dctClip[dctClipOffset + i] = 255; + dctClipInit = 1; + } +} + +DCTStream::~DCTStream() { + close(); + delete str; +} + +void DCTStream::reset() { + int i, j; + + str->reset(); + + progressive = interleaved = gFalse; + width = height = 0; + numComps = 0; + numQuantTables = 0; + numDCHuffTables = 0; + numACHuffTables = 0; + gotJFIFMarker = gFalse; + gotAdobeMarker = gFalse; + restartInterval = 0; + + if (!readHeader()) { + y = height; + return; + } + + // compute MCU size + if (numComps == 1) { + compInfo[0].hSample = compInfo[0].vSample = 1; + } + mcuWidth = compInfo[0].hSample; + mcuHeight = compInfo[0].vSample; + for (i = 1; i < numComps; ++i) { + if (compInfo[i].hSample > mcuWidth) { + mcuWidth = compInfo[i].hSample; + } + if (compInfo[i].vSample > mcuHeight) { + mcuHeight = compInfo[i].vSample; + } + } + mcuWidth *= 8; + mcuHeight *= 8; + + // figure out color transform + if (colorXform == -1) { + if (numComps == 3) { + if (gotJFIFMarker) { + colorXform = 1; + } else if (compInfo[0].id == 82 && compInfo[1].id == 71 && + compInfo[2].id == 66) { // ASCII "RGB" + colorXform = 0; + } else { + colorXform = 1; + } + } else { + colorXform = 0; + } + } + + if (progressive || !interleaved) { + + // allocate a buffer for the whole image + bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; + bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight; + if (bufWidth <= 0 || bufHeight <= 0 || + bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) { + error(getPos(), "Invalid image size in DCT stream"); + y = height; + return; + } + for (i = 0; i < numComps; ++i) { + frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int)); + memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int)); + } + + // read the image data + do { + restartMarker = 0xd0; + restart(); + readScan(); + } while (readHeader()); + + // decode + decodeImage(); + + // initialize counters + comp = 0; + x = 0; + y = 0; + + } else { + + // allocate a buffer for one row of MCUs + bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; + for (i = 0; i < numComps; ++i) { + for (j = 0; j < mcuHeight; ++j) { + rowBuf[i][j] = (Guchar *)gmallocn(bufWidth, sizeof(Guchar)); + } + } + + // initialize counters + comp = 0; + x = 0; + y = 0; + dy = mcuHeight; + + restartMarker = 0xd0; + restart(); + } +} + +void DCTStream::close() { + int i, j; + + for (i = 0; i < 4; ++i) { + for (j = 0; j < 32; ++j) { + gfree(rowBuf[i][j]); + rowBuf[i][j] = NULL; + } + gfree(frameBuf[i]); + frameBuf[i] = NULL; + } + FilterStream::close(); +} + +int DCTStream::getChar() { + int c; + + if (y >= height) { + return EOF; + } + if (progressive || !interleaved) { + c = frameBuf[comp][y * bufWidth + x]; + if (++comp == numComps) { + comp = 0; + if (++x == width) { + x = 0; + ++y; + } + } + } else { + if (dy >= mcuHeight) { + if (!readMCURow()) { + y = height; + return EOF; + } + comp = 0; + x = 0; + dy = 0; + } + c = rowBuf[comp][dy][x]; + if (++comp == numComps) { + comp = 0; + if (++x == width) { + x = 0; + ++y; + ++dy; + if (y == height) { + readTrailer(); + } + } + } + } + return c; +} + +int DCTStream::lookChar() { + if (y >= height) { + return EOF; + } + if (progressive || !interleaved) { + return frameBuf[comp][y * bufWidth + x]; + } else { + if (dy >= mcuHeight) { + if (!readMCURow()) { + y = height; + return EOF; + } + comp = 0; + x = 0; + dy = 0; + } + return rowBuf[comp][dy][x]; + } +} + +void DCTStream::restart() { + int i; + + inputBits = 0; + restartCtr = restartInterval; + for (i = 0; i < numComps; ++i) { + compInfo[i].prevDC = 0; + } + eobRun = 0; +} + +// Read one row of MCUs from a sequential JPEG stream. +GBool DCTStream::readMCURow() { + int data1[64]; + Guchar data2[64]; + Guchar *p1, *p2; + int pY, pCb, pCr, pR, pG, pB; + int h, v, horiz, vert, hSub, vSub; + int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; + int c; + + for (x1 = 0; x1 < width; x1 += mcuWidth) { + + // deal with restart marker + if (restartInterval > 0 && restartCtr == 0) { + c = readMarker(); + if (c != restartMarker) { + error(getPos(), "Bad DCT data: incorrect restart marker"); + return gFalse; + } + if (++restartMarker == 0xd8) + restartMarker = 0xd0; + restart(); + } + + // read one MCU + for (cc = 0; cc < numComps; ++cc) { + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + hSub = horiz / 8; + vSub = vert / 8; + for (y2 = 0; y2 < mcuHeight; y2 += vert) { + for (x2 = 0; x2 < mcuWidth; x2 += horiz) { + if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]], + &acHuffTables[scanInfo.acHuffTable[cc]], + &compInfo[cc].prevDC, + data1)) { + return gFalse; + } + transformDataUnit(quantTables[compInfo[cc].quantTable], + data1, data2); + if (hSub == 1 && vSub == 1) { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1 = &rowBuf[cc][y2+y3][x1+x2]; + p1[0] = data2[i]; + p1[1] = data2[i+1]; + p1[2] = data2[i+2]; + p1[3] = data2[i+3]; + p1[4] = data2[i+4]; + p1[5] = data2[i+5]; + p1[6] = data2[i+6]; + p1[7] = data2[i+7]; + } + } else if (hSub == 2 && vSub == 2) { + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { + p1 = &rowBuf[cc][y2+y3][x1+x2]; + p2 = &rowBuf[cc][y2+y3+1][x1+x2]; + p1[0] = p1[1] = p2[0] = p2[1] = data2[i]; + p1[2] = p1[3] = p2[2] = p2[3] = data2[i+1]; + p1[4] = p1[5] = p2[4] = p2[5] = data2[i+2]; + p1[6] = p1[7] = p2[6] = p2[7] = data2[i+3]; + p1[8] = p1[9] = p2[8] = p2[9] = data2[i+4]; + p1[10] = p1[11] = p2[10] = p2[11] = data2[i+5]; + p1[12] = p1[13] = p2[12] = p2[13] = data2[i+6]; + p1[14] = p1[15] = p2[14] = p2[15] = data2[i+7]; + } + } else { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { + for (y5 = 0; y5 < vSub; ++y5) + for (x5 = 0; x5 < hSub; ++x5) + rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data2[i]; + ++i; + } + } + } + } + } + } + --restartCtr; + + // color space conversion + if (colorXform) { + // convert YCbCr to RGB + if (numComps == 3) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = rowBuf[0][y2][x1+x2]; + pCb = rowBuf[1][y2][x1+x2] - 128; + pCr = rowBuf[2][y2][x1+x2] - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; + rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB]; + } + } + // convert YCbCrK to CMYK (K is passed through unchanged) + } else if (numComps == 4) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = rowBuf[0][y2][x1+x2]; + pCb = rowBuf[1][y2][x1+x2] - 128; + pCr = rowBuf[2][y2][x1+x2] - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; + rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB]; + } + } + } + } + } + return gTrue; +} + +// Read one scan from a progressive or non-interleaved JPEG stream. +void DCTStream::readScan() { + int data[64]; + int x1, y1, dx1, dy1, x2, y2, y3, cc, i; + int h, v, horiz, vert, vSub; + int *p1; + int c; + + if (scanInfo.numComps == 1) { + for (cc = 0; cc < numComps; ++cc) { + if (scanInfo.comp[cc]) { + break; + } + } + dx1 = mcuWidth / compInfo[cc].hSample; + dy1 = mcuHeight / compInfo[cc].vSample; + } else { + dx1 = mcuWidth; + dy1 = mcuHeight; + } + + for (y1 = 0; y1 < height; y1 += dy1) { + for (x1 = 0; x1 < width; x1 += dx1) { + + // deal with restart marker + if (restartInterval > 0 && restartCtr == 0) { + c = readMarker(); + if (c != restartMarker) { + error(getPos(), "Bad DCT data: incorrect restart marker"); + return; + } + if (++restartMarker == 0xd8) { + restartMarker = 0xd0; + } + restart(); + } + + // read one MCU + for (cc = 0; cc < numComps; ++cc) { + if (!scanInfo.comp[cc]) { + continue; + } + + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + vSub = vert / 8; + for (y2 = 0; y2 < dy1; y2 += vert) { + for (x2 = 0; x2 < dx1; x2 += horiz) { + + // pull out the current values + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + data[i] = p1[0]; + data[i+1] = p1[1]; + data[i+2] = p1[2]; + data[i+3] = p1[3]; + data[i+4] = p1[4]; + data[i+5] = p1[5]; + data[i+6] = p1[6]; + data[i+7] = p1[7]; + p1 += bufWidth * vSub; + } + + // read one data unit + if (progressive) { + if (!readProgressiveDataUnit( + &dcHuffTables[scanInfo.dcHuffTable[cc]], + &acHuffTables[scanInfo.acHuffTable[cc]], + &compInfo[cc].prevDC, + data)) { + return; + } + } else { + if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]], + &acHuffTables[scanInfo.acHuffTable[cc]], + &compInfo[cc].prevDC, + data)) { + return; + } + } + + // add the data unit into frameBuf + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1[0] = data[i]; + p1[1] = data[i+1]; + p1[2] = data[i+2]; + p1[3] = data[i+3]; + p1[4] = data[i+4]; + p1[5] = data[i+5]; + p1[6] = data[i+6]; + p1[7] = data[i+7]; + p1 += bufWidth * vSub; + } + } + } + } + --restartCtr; + } + } +} + +// Read one data unit from a sequential JPEG stream. +GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]) { + int run, size, amp; + int c; + int i, j; + + if ((size = readHuffSym(dcHuffTable)) == 9999) { + return gFalse; + } + if (size > 0) { + if ((amp = readAmp(size)) == 9999) { + return gFalse; + } + } else { + amp = 0; + } + data[0] = *prevDC += amp; + for (i = 1; i < 64; ++i) { + data[i] = 0; + } + i = 1; + while (i < 64) { + run = 0; + while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) { + run += 0x10; + } + if (c == 9999) { + return gFalse; + } + if (c == 0x00) { + break; + } else { + run += (c >> 4) & 0x0f; + size = c & 0x0f; + amp = readAmp(size); + if (amp == 9999) { + return gFalse; + } + i += run; + if (i < 64) { + j = dctZigZag[i++]; + data[j] = amp; + } + } + } + return gTrue; +} + +// Read one data unit from a sequential JPEG stream. +GBool DCTStream::readProgressiveDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]) { + int run, size, amp, bit, c; + int i, j, k; + + // get the DC coefficient + i = scanInfo.firstCoeff; + if (i == 0) { + if (scanInfo.ah == 0) { + if ((size = readHuffSym(dcHuffTable)) == 9999) { + return gFalse; + } + if (size > 0) { + if ((amp = readAmp(size)) == 9999) { + return gFalse; + } + } else { + amp = 0; + } + data[0] += (*prevDC += amp) << scanInfo.al; + } else { + if ((bit = readBit()) == 9999) { + return gFalse; + } + data[0] += bit << scanInfo.al; + } + ++i; + } + if (scanInfo.lastCoeff == 0) { + return gTrue; + } + + // check for an EOB run + if (eobRun > 0) { + while (i <= scanInfo.lastCoeff) { + if(i>=64) { + return gFalse; + } + j = dctZigZag[i++]; + if (data[j] != 0) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + } + } + --eobRun; + return gTrue; + } + + // read the AC coefficients + while (i <= scanInfo.lastCoeff) { + if ((c = readHuffSym(acHuffTable)) == 9999) { + return gFalse; + } + + // ZRL + if (c == 0xf0) { + k = 0; + while (k < 16) { + if(i>=64) { + return gFalse; + } + j = dctZigZag[i++]; + if (data[j] == 0) { + ++k; + } else { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + } + } + + // EOB run + } else if ((c & 0x0f) == 0x00) { + j = c >> 4; + eobRun = 0; + for (k = 0; k < j; ++k) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + eobRun = (eobRun << 1) | bit; + } + eobRun += 1 << j; + while (i <= scanInfo.lastCoeff) { + if(i>=64) { + return gFalse; + } + j = dctZigZag[i++]; + if (data[j] != 0) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + } + } + --eobRun; + break; + + // zero run and one AC coefficient + } else { + run = (c >> 4) & 0x0f; + size = c & 0x0f; + if ((amp = readAmp(size)) == 9999) { + return gFalse; + } + k = 0; + do { + if(i>=64) { + return gFalse; + } + j = dctZigZag[i++]; + while (data[j] != 0) { + if ((bit = readBit()) == EOF) { + return gFalse; + } + if (bit) { + data[j] += 1 << scanInfo.al; + } + if(i>=64) { + return gFalse; + } + j = dctZigZag[i++]; + } + ++k; + } while (k <= run); + data[j] = amp << scanInfo.al; + } + } + + return gTrue; +} + +// Decode a progressive JPEG image. +void DCTStream::decodeImage() { + int dataIn[64]; + Guchar dataOut[64]; + Gushort *quantTable; + int pY, pCb, pCr, pR, pG, pB; + int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; + int h, v, horiz, vert, hSub, vSub; + int *p0, *p1, *p2; + + for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) { + for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) { + for (cc = 0; cc < numComps; ++cc) { + quantTable = quantTables[compInfo[cc].quantTable]; + h = compInfo[cc].hSample; + v = compInfo[cc].vSample; + horiz = mcuWidth / h; + vert = mcuHeight / v; + hSub = horiz / 8; + vSub = vert / 8; + for (y2 = 0; y2 < mcuHeight; y2 += vert) { + for (x2 = 0; x2 < mcuWidth; x2 += horiz) { + + // pull out the coded data unit + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + dataIn[i] = p1[0]; + dataIn[i+1] = p1[1]; + dataIn[i+2] = p1[2]; + dataIn[i+3] = p1[3]; + dataIn[i+4] = p1[4]; + dataIn[i+5] = p1[5]; + dataIn[i+6] = p1[6]; + dataIn[i+7] = p1[7]; + p1 += bufWidth * vSub; + } + + // transform + transformDataUnit(quantTable, dataIn, dataOut); + + // store back into frameBuf, doing replication for + // subsampled components + p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; + if (hSub == 1 && vSub == 1) { + for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { + p1[0] = dataOut[i] & 0xff; + p1[1] = dataOut[i+1] & 0xff; + p1[2] = dataOut[i+2] & 0xff; + p1[3] = dataOut[i+3] & 0xff; + p1[4] = dataOut[i+4] & 0xff; + p1[5] = dataOut[i+5] & 0xff; + p1[6] = dataOut[i+6] & 0xff; + p1[7] = dataOut[i+7] & 0xff; + p1 += bufWidth; + } + } else if (hSub == 2 && vSub == 2) { + p2 = p1 + bufWidth; + for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { + p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff; + p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff; + p1[4] = p1[5] = p2[4] = p2[5] = dataOut[i+2] & 0xff; + p1[6] = p1[7] = p2[6] = p2[7] = dataOut[i+3] & 0xff; + p1[8] = p1[9] = p2[8] = p2[9] = dataOut[i+4] & 0xff; + p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff; + p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff; + p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff; + p1 += bufWidth * 2; + p2 += bufWidth * 2; + } + } else { + i = 0; + for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { + for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { + p2 = p1 + x4; + for (y5 = 0; y5 < vSub; ++y5) { + for (x5 = 0; x5 < hSub; ++x5) { + p2[x5] = dataOut[i] & 0xff; + } + p2 += bufWidth; + } + ++i; + } + p1 += bufWidth * vSub; + } + } + } + } + } + + // color space conversion + if (colorXform) { + // convert YCbCr to RGB + if (numComps == 3) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + p0 = &frameBuf[0][(y1+y2) * bufWidth + x1]; + p1 = &frameBuf[1][(y1+y2) * bufWidth + x1]; + p2 = &frameBuf[2][(y1+y2) * bufWidth + x1]; + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = *p0; + pCb = *p1 - 128; + pCr = *p2 - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + *p0++ = dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + + 32768) >> 16; + *p1++ = dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + *p2++ = dctClip[dctClipOffset + pB]; + } + } + // convert YCbCrK to CMYK (K is passed through unchanged) + } else if (numComps == 4) { + for (y2 = 0; y2 < mcuHeight; ++y2) { + p0 = &frameBuf[0][(y1+y2) * bufWidth + x1]; + p1 = &frameBuf[1][(y1+y2) * bufWidth + x1]; + p2 = &frameBuf[2][(y1+y2) * bufWidth + x1]; + for (x2 = 0; x2 < mcuWidth; ++x2) { + pY = *p0; + pCb = *p1 - 128; + pCr = *p2 - 128; + pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; + *p0++ = 255 - dctClip[dctClipOffset + pR]; + pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + + 32768) >> 16; + *p1++ = 255 - dctClip[dctClipOffset + pG]; + pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; + *p2++ = 255 - dctClip[dctClipOffset + pB]; + } + } + } + } + } + } +} + +// Transform one data unit -- this performs the dequantization and +// IDCT steps. This IDCT algorithm is taken from: +// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, +// "Practical Fast 1-D DCT Algorithms with 11 Multiplications", +// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, +// 988-991. +// The stage numbers mentioned in the comments refer to Figure 1 in this +// paper. +void DCTStream::transformDataUnit(Gushort *quantTable, + int dataIn[64], Guchar dataOut[64]) { + int v0, v1, v2, v3, v4, v5, v6, v7, t; + int *p; + int i; + + // dequant + for (i = 0; i < 64; ++i) { + dataIn[i] *= quantTable[i]; + } + + // inverse DCT on rows + for (i = 0; i < 64; i += 8) { + p = dataIn + i; + + // check for all-zero AC coefficients + if (p[1] == 0 && p[2] == 0 && p[3] == 0 && + p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] == 0) { + t = (dctSqrt2 * p[0] + 512) >> 10; + p[0] = t; + p[1] = t; + p[2] = t; + p[3] = t; + p[4] = t; + p[5] = t; + p[6] = t; + p[7] = t; + continue; + } + + // stage 4 + v0 = (dctSqrt2 * p[0] + 128) >> 8; + v1 = (dctSqrt2 * p[4] + 128) >> 8; + v2 = p[2]; + v3 = p[6]; + v4 = (dctSqrt1d2 * (p[1] - p[7]) + 128) >> 8; + v7 = (dctSqrt1d2 * (p[1] + p[7]) + 128) >> 8; + v5 = p[3] << 4; + v6 = p[5] << 4; + + // stage 3 + t = (v0 - v1+ 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + p[0] = v0 + v7; + p[7] = v0 - v7; + p[1] = v1 + v6; + p[6] = v1 - v6; + p[2] = v2 + v5; + p[5] = v2 - v5; + p[3] = v3 + v4; + p[4] = v3 - v4; + } + + // inverse DCT on columns + for (i = 0; i < 8; ++i) { + p = dataIn + i; + + // check for all-zero AC coefficients + if (p[1*8] == 0 && p[2*8] == 0 && p[3*8] == 0 && + p[4*8] == 0 && p[5*8] == 0 && p[6*8] == 0 && p[7*8] == 0) { + t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14; + p[0*8] = t; + p[1*8] = t; + p[2*8] = t; + p[3*8] = t; + p[4*8] = t; + p[5*8] = t; + p[6*8] = t; + p[7*8] = t; + continue; + } + + // stage 4 + v0 = (dctSqrt2 * p[0*8] + 2048) >> 12; + v1 = (dctSqrt2 * p[4*8] + 2048) >> 12; + v2 = p[2*8]; + v3 = p[6*8]; + v4 = (dctSqrt1d2 * (p[1*8] - p[7*8]) + 2048) >> 12; + v7 = (dctSqrt1d2 * (p[1*8] + p[7*8]) + 2048) >> 12; + v5 = p[3*8]; + v6 = p[5*8]; + + // stage 3 + t = (v0 - v1 + 1) >> 1; + v0 = (v0 + v1 + 1) >> 1; + v1 = t; + t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; + v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; + v3 = t; + t = (v4 - v6 + 1) >> 1; + v4 = (v4 + v6 + 1) >> 1; + v6 = t; + t = (v7 + v5 + 1) >> 1; + v5 = (v7 - v5 + 1) >> 1; + v7 = t; + + // stage 2 + t = (v0 - v3 + 1) >> 1; + v0 = (v0 + v3 + 1) >> 1; + v3 = t; + t = (v1 - v2 + 1) >> 1; + v1 = (v1 + v2 + 1) >> 1; + v2 = t; + t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; + v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; + v7 = t; + t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; + v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; + v6 = t; + + // stage 1 + p[0*8] = v0 + v7; + p[7*8] = v0 - v7; + p[1*8] = v1 + v6; + p[6*8] = v1 - v6; + p[2*8] = v2 + v5; + p[5*8] = v2 - v5; + p[3*8] = v3 + v4; + p[4*8] = v3 - v4; + } + + // convert to 8-bit integers + for (i = 0; i < 64; ++i) { + dataOut[i] = dctClip[dctClipOffset + 128 + ((dataIn[i] + 8) >> 4)]; + } +} + +int DCTStream::readHuffSym(DCTHuffTable *table) { + Gushort code; + int bit; + int codeBits; + + code = 0; + codeBits = 0; + do { + // add a bit to the code + if ((bit = readBit()) == EOF) + return 9999; + code = (code << 1) + bit; + ++codeBits; + + // look up code + if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) { + code -= table->firstCode[codeBits]; + return table->sym[table->firstSym[codeBits] + code]; + } + } while (codeBits < 16); + + error(getPos(), "Bad Huffman code in DCT stream"); + return 9999; +} + +int DCTStream::readAmp(int size) { + int amp, bit; + int bits; + + amp = 0; + for (bits = 0; bits < size; ++bits) { + if ((bit = readBit()) == EOF) + return 9999; + amp = (amp << 1) + bit; + } + if (amp < (1 << (size - 1))) + amp -= (1 << size) - 1; + return amp; +} + +int DCTStream::readBit() { + int bit; + int c, c2; + + if (inputBits == 0) { + if ((c = str->getChar()) == EOF) + return EOF; + if (c == 0xff) { + do { + c2 = str->getChar(); + } while (c2 == 0xff); + if (c2 != 0x00) { + error(getPos(), "Bad DCT data: missing 00 after ff"); + return EOF; + } + } + inputBuf = c; + inputBits = 8; + } + bit = (inputBuf >> (inputBits - 1)) & 1; + --inputBits; + return bit; +} + +GBool DCTStream::readHeader() { + GBool doScan; + int n; + int c = 0; + int i; + + // read headers + doScan = gFalse; + while (!doScan) { + c = readMarker(); + switch (c) { + case 0xc0: // SOF0 (sequential) + case 0xc1: // SOF1 (extended sequential) + if (!readBaselineSOF()) { + return gFalse; + } + break; + case 0xc2: // SOF2 (progressive) + if (!readProgressiveSOF()) { + return gFalse; + } + break; + case 0xc4: // DHT + if (!readHuffmanTables()) { + return gFalse; + } + break; + case 0xd8: // SOI + break; + case 0xd9: // EOI + return gFalse; + case 0xda: // SOS + if (!readScanInfo()) { + return gFalse; + } + doScan = gTrue; + break; + case 0xdb: // DQT + if (!readQuantTables()) { + return gFalse; + } + break; + case 0xdd: // DRI + if (!readRestartInterval()) { + return gFalse; + } + break; + case 0xe0: // APP0 + if (!readJFIFMarker()) { + return gFalse; + } + break; + case 0xee: // APP14 + if (!readAdobeMarker()) { + return gFalse; + } + break; + case EOF: + error(getPos(), "Bad DCT header"); + return gFalse; + default: + // skip APPn / COM / etc. + if (c >= 0xe0) { + n = read16() - 2; + for (i = 0; i < n; ++i) { + str->getChar(); + } + } else { + error(getPos(), "Unknown DCT marker <%02x>", c); + return gFalse; + } + break; + } + } + + return gTrue; +} + +GBool DCTStream::readBaselineSOF() { + int length; + int prec; + int i; + int c; + + length = read16(); + prec = str->getChar(); + height = read16(); + width = read16(); + numComps = str->getChar(); + if (numComps <= 0 || numComps > 4) { + error(getPos(), "Bad number of components in DCT stream"); + numComps = 0; + return gFalse; + } + if (prec != 8) { + error(getPos(), "Bad DCT precision %d", prec); + return gFalse; + } + for (i = 0; i < numComps; ++i) { + compInfo[i].id = str->getChar(); + c = str->getChar(); + compInfo[i].hSample = (c >> 4) & 0x0f; + compInfo[i].vSample = c & 0x0f; + compInfo[i].quantTable = str->getChar(); + } + progressive = gFalse; + return gTrue; +} + +GBool DCTStream::readProgressiveSOF() { + int length; + int prec; + int i; + int c; + + length = read16(); + prec = str->getChar(); + height = read16(); + width = read16(); + numComps = str->getChar(); + if (numComps <= 0 || numComps > 4) { + error(getPos(), "Bad number of components in DCT stream"); + numComps = 0; + return gFalse; + } + if (prec != 8) { + error(getPos(), "Bad DCT precision %d", prec); + return gFalse; + } + for (i = 0; i < numComps; ++i) { + compInfo[i].id = str->getChar(); + c = str->getChar(); + compInfo[i].hSample = (c >> 4) & 0x0f; + compInfo[i].vSample = c & 0x0f; + compInfo[i].quantTable = str->getChar(); + } + progressive = gTrue; + return gTrue; +} + +GBool DCTStream::readScanInfo() { + int length; + int id, c; + int i, j; + + length = read16() - 2; + scanInfo.numComps = str->getChar(); + if (scanInfo.numComps <= 0 || scanInfo.numComps > 4) { + error(getPos(), "Bad number of components in DCT stream"); + scanInfo.numComps = 0; + return gFalse; + } + --length; + if (length != 2 * scanInfo.numComps + 3) { + error(getPos(), "Bad DCT scan info block"); + return gFalse; + } + interleaved = scanInfo.numComps == numComps; + for (j = 0; j < numComps; ++j) { + scanInfo.comp[j] = gFalse; + } + for (i = 0; i < scanInfo.numComps; ++i) { + id = str->getChar(); + // some (broken) DCT streams reuse ID numbers, but at least they + // keep the components in order, so we check compInfo[i] first to + // work around the problem + if (id == compInfo[i].id) { + j = i; + } else { + for (j = 0; j < numComps; ++j) { + if (id == compInfo[j].id) { + break; + } + } + if (j == numComps) { + error(getPos(), "Bad DCT component ID in scan info block"); + return gFalse; + } + } + scanInfo.comp[j] = gTrue; + c = str->getChar(); + scanInfo.dcHuffTable[j] = (c >> 4) & 0x0f; + scanInfo.acHuffTable[j] = c & 0x0f; + } + scanInfo.firstCoeff = str->getChar(); + scanInfo.lastCoeff = str->getChar(); + if (scanInfo.firstCoeff < 0 || scanInfo.lastCoeff > 63 || + scanInfo.firstCoeff > scanInfo.lastCoeff) { + error(getPos(), "Bad DCT coefficient numbers in scan info block"); + return gFalse; + } + c = str->getChar(); + scanInfo.ah = (c >> 4) & 0x0f; + scanInfo.al = c & 0x0f; + return gTrue; +} + +GBool DCTStream::readQuantTables() { + int length, prec, i, index; + + length = read16() - 2; + while (length > 0) { + index = str->getChar(); + prec = (index >> 4) & 0x0f; + index &= 0x0f; + if (prec > 1 || index >= 4) { + error(getPos(), "Bad DCT quantization table"); + return gFalse; + } + if (index == numQuantTables) { + numQuantTables = index + 1; + } + for (i = 0; i < 64; ++i) { + if (prec) { + quantTables[index][dctZigZag[i]] = read16(); + } else { + quantTables[index][dctZigZag[i]] = str->getChar(); + } + } + if (prec) { + length -= 129; + } else { + length -= 65; + } + } + return gTrue; +} + +GBool DCTStream::readHuffmanTables() { + DCTHuffTable *tbl; + int length; + int index; + Gushort code; + Guchar sym; + int i; + int c; + + length = read16() - 2; + while (length > 0) { + index = str->getChar(); + --length; + if ((index & 0x0f) >= 4) { + error(getPos(), "Bad DCT Huffman table"); + return gFalse; + } + if (index & 0x10) { + index &= 0x0f; + if (index >= numACHuffTables) + numACHuffTables = index+1; + tbl = &acHuffTables[index]; + } else { + index &= 0x0f; + if (index >= numDCHuffTables) + numDCHuffTables = index+1; + tbl = &dcHuffTables[index]; + } + sym = 0; + code = 0; + for (i = 1; i <= 16; ++i) { + c = str->getChar(); + tbl->firstSym[i] = sym; + tbl->firstCode[i] = code; + tbl->numCodes[i] = c; + sym += c; + code = (code + c) << 1; + } + length -= 16; + for (i = 0; i < sym; ++i) + tbl->sym[i] = str->getChar(); + length -= sym; + } + return gTrue; +} + +GBool DCTStream::readRestartInterval() { + int length; + + length = read16(); + if (length != 4) { + error(getPos(), "Bad DCT restart interval"); + return gFalse; + } + restartInterval = read16(); + return gTrue; +} + +GBool DCTStream::readJFIFMarker() { + int length, i; + char buf[5]; + int c; + + length = read16(); + length -= 2; + if (length >= 5) { + for (i = 0; i < 5; ++i) { + if ((c = str->getChar()) == EOF) { + error(getPos(), "Bad DCT APP0 marker"); + return gFalse; + } + buf[i] = c; + } + length -= 5; + if (!memcmp(buf, "JFIF\0", 5)) { + gotJFIFMarker = gTrue; + } + } + while (length > 0) { + if (str->getChar() == EOF) { + error(getPos(), "Bad DCT APP0 marker"); + return gFalse; + } + --length; + } + return gTrue; +} + +GBool DCTStream::readAdobeMarker() { + int length, i; + char buf[12]; + int c; + + length = read16(); + if (length < 14) { + goto err; + } + for (i = 0; i < 12; ++i) { + if ((c = str->getChar()) == EOF) { + goto err; + } + buf[i] = c; + } + if (strncmp(buf, "Adobe", 5)) { + goto err; + } + colorXform = buf[11]; + gotAdobeMarker = gTrue; + for (i = 14; i < length; ++i) { + if (str->getChar() == EOF) { + goto err; + } + } + return gTrue; + + err: + error(getPos(), "Bad DCT Adobe APP14 marker"); + return gFalse; +} + +GBool DCTStream::readTrailer() { + int c; + + c = readMarker(); + if (c != 0xd9) { // EOI + error(getPos(), "Bad DCT trailer"); + return gFalse; + } + return gTrue; +} + +int DCTStream::readMarker() { + int c; + + do { + do { + c = str->getChar(); + } while (c != 0xff && c != EOF); + do { + c = str->getChar(); + } while (c == 0xff); + } while (c == 0x00); + return c; +} + +int DCTStream::read16() { + int c1, c2; + + if ((c1 = str->getChar()) == EOF) + return EOF; + if ((c2 = str->getChar()) == EOF) + return EOF; + return (c1 << 8) + c2; +} + +GString *DCTStream::getPSFilter(int psLevel, char *indent) { + GString *s; + + if (psLevel < 2) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< >> /DCTDecode filter\n"); + return s; +} + +GBool DCTStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// FlateStream +//------------------------------------------------------------------------ + +int FlateStream::codeLenCodeMap[flateMaxCodeLenCodes] = { + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 +}; + +FlateDecode FlateStream::lengthDecode[flateMaxLitCodes-257] = { + {0, 3}, + {0, 4}, + {0, 5}, + {0, 6}, + {0, 7}, + {0, 8}, + {0, 9}, + {0, 10}, + {1, 11}, + {1, 13}, + {1, 15}, + {1, 17}, + {2, 19}, + {2, 23}, + {2, 27}, + {2, 31}, + {3, 35}, + {3, 43}, + {3, 51}, + {3, 59}, + {4, 67}, + {4, 83}, + {4, 99}, + {4, 115}, + {5, 131}, + {5, 163}, + {5, 195}, + {5, 227}, + {0, 258}, + {0, 258}, + {0, 258} +}; + +FlateDecode FlateStream::distDecode[flateMaxDistCodes] = { + { 0, 1}, + { 0, 2}, + { 0, 3}, + { 0, 4}, + { 1, 5}, + { 1, 7}, + { 2, 9}, + { 2, 13}, + { 3, 17}, + { 3, 25}, + { 4, 33}, + { 4, 49}, + { 5, 65}, + { 5, 97}, + { 6, 129}, + { 6, 193}, + { 7, 257}, + { 7, 385}, + { 8, 513}, + { 8, 769}, + { 9, 1025}, + { 9, 1537}, + {10, 2049}, + {10, 3073}, + {11, 4097}, + {11, 6145}, + {12, 8193}, + {12, 12289}, + {13, 16385}, + {13, 24577} +}; + +static FlateCode flateFixedLitCodeTabCodes[512] = { + {7, 0x0100}, + {8, 0x0050}, + {8, 0x0010}, + {8, 0x0118}, + {7, 0x0110}, + {8, 0x0070}, + {8, 0x0030}, + {9, 0x00c0}, + {7, 0x0108}, + {8, 0x0060}, + {8, 0x0020}, + {9, 0x00a0}, + {8, 0x0000}, + {8, 0x0080}, + {8, 0x0040}, + {9, 0x00e0}, + {7, 0x0104}, + {8, 0x0058}, + {8, 0x0018}, + {9, 0x0090}, + {7, 0x0114}, + {8, 0x0078}, + {8, 0x0038}, + {9, 0x00d0}, + {7, 0x010c}, + {8, 0x0068}, + {8, 0x0028}, + {9, 0x00b0}, + {8, 0x0008}, + {8, 0x0088}, + {8, 0x0048}, + {9, 0x00f0}, + {7, 0x0102}, + {8, 0x0054}, + {8, 0x0014}, + {8, 0x011c}, + {7, 0x0112}, + {8, 0x0074}, + {8, 0x0034}, + {9, 0x00c8}, + {7, 0x010a}, + {8, 0x0064}, + {8, 0x0024}, + {9, 0x00a8}, + {8, 0x0004}, + {8, 0x0084}, + {8, 0x0044}, + {9, 0x00e8}, + {7, 0x0106}, + {8, 0x005c}, + {8, 0x001c}, + {9, 0x0098}, + {7, 0x0116}, + {8, 0x007c}, + {8, 0x003c}, + {9, 0x00d8}, + {7, 0x010e}, + {8, 0x006c}, + {8, 0x002c}, + {9, 0x00b8}, + {8, 0x000c}, + {8, 0x008c}, + {8, 0x004c}, + {9, 0x00f8}, + {7, 0x0101}, + {8, 0x0052}, + {8, 0x0012}, + {8, 0x011a}, + {7, 0x0111}, + {8, 0x0072}, + {8, 0x0032}, + {9, 0x00c4}, + {7, 0x0109}, + {8, 0x0062}, + {8, 0x0022}, + {9, 0x00a4}, + {8, 0x0002}, + {8, 0x0082}, + {8, 0x0042}, + {9, 0x00e4}, + {7, 0x0105}, + {8, 0x005a}, + {8, 0x001a}, + {9, 0x0094}, + {7, 0x0115}, + {8, 0x007a}, + {8, 0x003a}, + {9, 0x00d4}, + {7, 0x010d}, + {8, 0x006a}, + {8, 0x002a}, + {9, 0x00b4}, + {8, 0x000a}, + {8, 0x008a}, + {8, 0x004a}, + {9, 0x00f4}, + {7, 0x0103}, + {8, 0x0056}, + {8, 0x0016}, + {8, 0x011e}, + {7, 0x0113}, + {8, 0x0076}, + {8, 0x0036}, + {9, 0x00cc}, + {7, 0x010b}, + {8, 0x0066}, + {8, 0x0026}, + {9, 0x00ac}, + {8, 0x0006}, + {8, 0x0086}, + {8, 0x0046}, + {9, 0x00ec}, + {7, 0x0107}, + {8, 0x005e}, + {8, 0x001e}, + {9, 0x009c}, + {7, 0x0117}, + {8, 0x007e}, + {8, 0x003e}, + {9, 0x00dc}, + {7, 0x010f}, + {8, 0x006e}, + {8, 0x002e}, + {9, 0x00bc}, + {8, 0x000e}, + {8, 0x008e}, + {8, 0x004e}, + {9, 0x00fc}, + {7, 0x0100}, + {8, 0x0051}, + {8, 0x0011}, + {8, 0x0119}, + {7, 0x0110}, + {8, 0x0071}, + {8, 0x0031}, + {9, 0x00c2}, + {7, 0x0108}, + {8, 0x0061}, + {8, 0x0021}, + {9, 0x00a2}, + {8, 0x0001}, + {8, 0x0081}, + {8, 0x0041}, + {9, 0x00e2}, + {7, 0x0104}, + {8, 0x0059}, + {8, 0x0019}, + {9, 0x0092}, + {7, 0x0114}, + {8, 0x0079}, + {8, 0x0039}, + {9, 0x00d2}, + {7, 0x010c}, + {8, 0x0069}, + {8, 0x0029}, + {9, 0x00b2}, + {8, 0x0009}, + {8, 0x0089}, + {8, 0x0049}, + {9, 0x00f2}, + {7, 0x0102}, + {8, 0x0055}, + {8, 0x0015}, + {8, 0x011d}, + {7, 0x0112}, + {8, 0x0075}, + {8, 0x0035}, + {9, 0x00ca}, + {7, 0x010a}, + {8, 0x0065}, + {8, 0x0025}, + {9, 0x00aa}, + {8, 0x0005}, + {8, 0x0085}, + {8, 0x0045}, + {9, 0x00ea}, + {7, 0x0106}, + {8, 0x005d}, + {8, 0x001d}, + {9, 0x009a}, + {7, 0x0116}, + {8, 0x007d}, + {8, 0x003d}, + {9, 0x00da}, + {7, 0x010e}, + {8, 0x006d}, + {8, 0x002d}, + {9, 0x00ba}, + {8, 0x000d}, + {8, 0x008d}, + {8, 0x004d}, + {9, 0x00fa}, + {7, 0x0101}, + {8, 0x0053}, + {8, 0x0013}, + {8, 0x011b}, + {7, 0x0111}, + {8, 0x0073}, + {8, 0x0033}, + {9, 0x00c6}, + {7, 0x0109}, + {8, 0x0063}, + {8, 0x0023}, + {9, 0x00a6}, + {8, 0x0003}, + {8, 0x0083}, + {8, 0x0043}, + {9, 0x00e6}, + {7, 0x0105}, + {8, 0x005b}, + {8, 0x001b}, + {9, 0x0096}, + {7, 0x0115}, + {8, 0x007b}, + {8, 0x003b}, + {9, 0x00d6}, + {7, 0x010d}, + {8, 0x006b}, + {8, 0x002b}, + {9, 0x00b6}, + {8, 0x000b}, + {8, 0x008b}, + {8, 0x004b}, + {9, 0x00f6}, + {7, 0x0103}, + {8, 0x0057}, + {8, 0x0017}, + {8, 0x011f}, + {7, 0x0113}, + {8, 0x0077}, + {8, 0x0037}, + {9, 0x00ce}, + {7, 0x010b}, + {8, 0x0067}, + {8, 0x0027}, + {9, 0x00ae}, + {8, 0x0007}, + {8, 0x0087}, + {8, 0x0047}, + {9, 0x00ee}, + {7, 0x0107}, + {8, 0x005f}, + {8, 0x001f}, + {9, 0x009e}, + {7, 0x0117}, + {8, 0x007f}, + {8, 0x003f}, + {9, 0x00de}, + {7, 0x010f}, + {8, 0x006f}, + {8, 0x002f}, + {9, 0x00be}, + {8, 0x000f}, + {8, 0x008f}, + {8, 0x004f}, + {9, 0x00fe}, + {7, 0x0100}, + {8, 0x0050}, + {8, 0x0010}, + {8, 0x0118}, + {7, 0x0110}, + {8, 0x0070}, + {8, 0x0030}, + {9, 0x00c1}, + {7, 0x0108}, + {8, 0x0060}, + {8, 0x0020}, + {9, 0x00a1}, + {8, 0x0000}, + {8, 0x0080}, + {8, 0x0040}, + {9, 0x00e1}, + {7, 0x0104}, + {8, 0x0058}, + {8, 0x0018}, + {9, 0x0091}, + {7, 0x0114}, + {8, 0x0078}, + {8, 0x0038}, + {9, 0x00d1}, + {7, 0x010c}, + {8, 0x0068}, + {8, 0x0028}, + {9, 0x00b1}, + {8, 0x0008}, + {8, 0x0088}, + {8, 0x0048}, + {9, 0x00f1}, + {7, 0x0102}, + {8, 0x0054}, + {8, 0x0014}, + {8, 0x011c}, + {7, 0x0112}, + {8, 0x0074}, + {8, 0x0034}, + {9, 0x00c9}, + {7, 0x010a}, + {8, 0x0064}, + {8, 0x0024}, + {9, 0x00a9}, + {8, 0x0004}, + {8, 0x0084}, + {8, 0x0044}, + {9, 0x00e9}, + {7, 0x0106}, + {8, 0x005c}, + {8, 0x001c}, + {9, 0x0099}, + {7, 0x0116}, + {8, 0x007c}, + {8, 0x003c}, + {9, 0x00d9}, + {7, 0x010e}, + {8, 0x006c}, + {8, 0x002c}, + {9, 0x00b9}, + {8, 0x000c}, + {8, 0x008c}, + {8, 0x004c}, + {9, 0x00f9}, + {7, 0x0101}, + {8, 0x0052}, + {8, 0x0012}, + {8, 0x011a}, + {7, 0x0111}, + {8, 0x0072}, + {8, 0x0032}, + {9, 0x00c5}, + {7, 0x0109}, + {8, 0x0062}, + {8, 0x0022}, + {9, 0x00a5}, + {8, 0x0002}, + {8, 0x0082}, + {8, 0x0042}, + {9, 0x00e5}, + {7, 0x0105}, + {8, 0x005a}, + {8, 0x001a}, + {9, 0x0095}, + {7, 0x0115}, + {8, 0x007a}, + {8, 0x003a}, + {9, 0x00d5}, + {7, 0x010d}, + {8, 0x006a}, + {8, 0x002a}, + {9, 0x00b5}, + {8, 0x000a}, + {8, 0x008a}, + {8, 0x004a}, + {9, 0x00f5}, + {7, 0x0103}, + {8, 0x0056}, + {8, 0x0016}, + {8, 0x011e}, + {7, 0x0113}, + {8, 0x0076}, + {8, 0x0036}, + {9, 0x00cd}, + {7, 0x010b}, + {8, 0x0066}, + {8, 0x0026}, + {9, 0x00ad}, + {8, 0x0006}, + {8, 0x0086}, + {8, 0x0046}, + {9, 0x00ed}, + {7, 0x0107}, + {8, 0x005e}, + {8, 0x001e}, + {9, 0x009d}, + {7, 0x0117}, + {8, 0x007e}, + {8, 0x003e}, + {9, 0x00dd}, + {7, 0x010f}, + {8, 0x006e}, + {8, 0x002e}, + {9, 0x00bd}, + {8, 0x000e}, + {8, 0x008e}, + {8, 0x004e}, + {9, 0x00fd}, + {7, 0x0100}, + {8, 0x0051}, + {8, 0x0011}, + {8, 0x0119}, + {7, 0x0110}, + {8, 0x0071}, + {8, 0x0031}, + {9, 0x00c3}, + {7, 0x0108}, + {8, 0x0061}, + {8, 0x0021}, + {9, 0x00a3}, + {8, 0x0001}, + {8, 0x0081}, + {8, 0x0041}, + {9, 0x00e3}, + {7, 0x0104}, + {8, 0x0059}, + {8, 0x0019}, + {9, 0x0093}, + {7, 0x0114}, + {8, 0x0079}, + {8, 0x0039}, + {9, 0x00d3}, + {7, 0x010c}, + {8, 0x0069}, + {8, 0x0029}, + {9, 0x00b3}, + {8, 0x0009}, + {8, 0x0089}, + {8, 0x0049}, + {9, 0x00f3}, + {7, 0x0102}, + {8, 0x0055}, + {8, 0x0015}, + {8, 0x011d}, + {7, 0x0112}, + {8, 0x0075}, + {8, 0x0035}, + {9, 0x00cb}, + {7, 0x010a}, + {8, 0x0065}, + {8, 0x0025}, + {9, 0x00ab}, + {8, 0x0005}, + {8, 0x0085}, + {8, 0x0045}, + {9, 0x00eb}, + {7, 0x0106}, + {8, 0x005d}, + {8, 0x001d}, + {9, 0x009b}, + {7, 0x0116}, + {8, 0x007d}, + {8, 0x003d}, + {9, 0x00db}, + {7, 0x010e}, + {8, 0x006d}, + {8, 0x002d}, + {9, 0x00bb}, + {8, 0x000d}, + {8, 0x008d}, + {8, 0x004d}, + {9, 0x00fb}, + {7, 0x0101}, + {8, 0x0053}, + {8, 0x0013}, + {8, 0x011b}, + {7, 0x0111}, + {8, 0x0073}, + {8, 0x0033}, + {9, 0x00c7}, + {7, 0x0109}, + {8, 0x0063}, + {8, 0x0023}, + {9, 0x00a7}, + {8, 0x0003}, + {8, 0x0083}, + {8, 0x0043}, + {9, 0x00e7}, + {7, 0x0105}, + {8, 0x005b}, + {8, 0x001b}, + {9, 0x0097}, + {7, 0x0115}, + {8, 0x007b}, + {8, 0x003b}, + {9, 0x00d7}, + {7, 0x010d}, + {8, 0x006b}, + {8, 0x002b}, + {9, 0x00b7}, + {8, 0x000b}, + {8, 0x008b}, + {8, 0x004b}, + {9, 0x00f7}, + {7, 0x0103}, + {8, 0x0057}, + {8, 0x0017}, + {8, 0x011f}, + {7, 0x0113}, + {8, 0x0077}, + {8, 0x0037}, + {9, 0x00cf}, + {7, 0x010b}, + {8, 0x0067}, + {8, 0x0027}, + {9, 0x00af}, + {8, 0x0007}, + {8, 0x0087}, + {8, 0x0047}, + {9, 0x00ef}, + {7, 0x0107}, + {8, 0x005f}, + {8, 0x001f}, + {9, 0x009f}, + {7, 0x0117}, + {8, 0x007f}, + {8, 0x003f}, + {9, 0x00df}, + {7, 0x010f}, + {8, 0x006f}, + {8, 0x002f}, + {9, 0x00bf}, + {8, 0x000f}, + {8, 0x008f}, + {8, 0x004f}, + {9, 0x00ff} +}; + +FlateHuffmanTab FlateStream::fixedLitCodeTab = { + flateFixedLitCodeTabCodes, 9 +}; + +static FlateCode flateFixedDistCodeTabCodes[32] = { + {5, 0x0000}, + {5, 0x0010}, + {5, 0x0008}, + {5, 0x0018}, + {5, 0x0004}, + {5, 0x0014}, + {5, 0x000c}, + {5, 0x001c}, + {5, 0x0002}, + {5, 0x0012}, + {5, 0x000a}, + {5, 0x001a}, + {5, 0x0006}, + {5, 0x0016}, + {5, 0x000e}, + {0, 0x0000}, + {5, 0x0001}, + {5, 0x0011}, + {5, 0x0009}, + {5, 0x0019}, + {5, 0x0005}, + {5, 0x0015}, + {5, 0x000d}, + {5, 0x001d}, + {5, 0x0003}, + {5, 0x0013}, + {5, 0x000b}, + {5, 0x001b}, + {5, 0x0007}, + {5, 0x0017}, + {5, 0x000f}, + {0, 0x0000} +}; + +FlateHuffmanTab FlateStream::fixedDistCodeTab = { + flateFixedDistCodeTabCodes, 5 +}; + +FlateStream::FlateStream(Stream *strA, int predictor, int columns, + int colors, int bits): + FilterStream(strA) { + if (predictor != 1) { + pred = new StreamPredictor(this, predictor, columns, colors, bits); + if (!pred->isOk()) { + delete pred; + pred = NULL; + } + } else { + pred = NULL; + } + litCodeTab.codes = NULL; + distCodeTab.codes = NULL; + memset(buf, 0, flateWindow); +} + +FlateStream::~FlateStream() { + if (litCodeTab.codes != fixedLitCodeTab.codes) { + gfree(litCodeTab.codes); + } + if (distCodeTab.codes != fixedDistCodeTab.codes) { + gfree(distCodeTab.codes); + } + if (pred) { + delete pred; + } + delete str; +} + +void FlateStream::reset() { + int cmf, flg; + + index = 0; + remain = 0; + codeBuf = 0; + codeSize = 0; + compressedBlock = gFalse; + endOfBlock = gTrue; + eof = gTrue; + + str->reset(); + + // read header + //~ need to look at window size? + endOfBlock = eof = gTrue; + cmf = str->getChar(); + flg = str->getChar(); + if (cmf == EOF || flg == EOF) + return; + if ((cmf & 0x0f) != 0x08) { + error(getPos(), "Unknown compression method in flate stream"); + return; + } + if ((((cmf << 8) + flg) % 31) != 0) { + error(getPos(), "Bad FCHECK in flate stream"); + return; + } + if (flg & 0x20) { + error(getPos(), "FDICT bit set in flate stream"); + return; + } + + eof = gFalse; +} + +int FlateStream::getChar() { + int c; + + if (pred) { + return pred->getChar(); + } + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + index = (index + 1) & flateMask; + --remain; + return c; +} + +int FlateStream::lookChar() { + int c; + + if (pred) { + return pred->lookChar(); + } + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + return c; +} + +int FlateStream::getRawChar() { + int c; + + while (remain == 0) { + if (endOfBlock && eof) + return EOF; + readSome(); + } + c = buf[index]; + index = (index + 1) & flateMask; + --remain; + return c; +} + +GString *FlateStream::getPSFilter(int psLevel, char *indent) { + GString *s; + + if (psLevel < 3 || pred) { + return NULL; + } + if (!(s = str->getPSFilter(psLevel, indent))) { + return NULL; + } + s->append(indent)->append("<< >> /FlateDecode filter\n"); + return s; +} + +GBool FlateStream::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +void FlateStream::readSome() { + int code1, code2; + int len, dist; + int i, j, k; + int c; + + if (endOfBlock) { + if (!startBlock()) + return; + } + + if (compressedBlock) { + if ((code1 = getHuffmanCodeWord(&litCodeTab)) == EOF) + goto err; + if (code1 < 256) { + buf[index] = code1; + remain = 1; + } else if (code1 == 256) { + endOfBlock = gTrue; + remain = 0; + } else { + code1 -= 257; + code2 = lengthDecode[code1].bits; + if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) + goto err; + len = lengthDecode[code1].first + code2; + if ((code1 = getHuffmanCodeWord(&distCodeTab)) == EOF) + goto err; + code2 = distDecode[code1].bits; + if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) + goto err; + dist = distDecode[code1].first + code2; + i = index; + j = (index - dist) & flateMask; + for (k = 0; k < len; ++k) { + buf[i] = buf[j]; + i = (i + 1) & flateMask; + j = (j + 1) & flateMask; + } + remain = len; + } + + } else { + len = (blockLen < flateWindow) ? blockLen : flateWindow; + for (i = 0, j = index; i < len; ++i, j = (j + 1) & flateMask) { + if ((c = str->getChar()) == EOF) { + endOfBlock = eof = gTrue; + break; + } + buf[j] = c & 0xff; + } + remain = i; + blockLen -= len; + if (blockLen == 0) + endOfBlock = gTrue; + } + + return; + +err: + error(getPos(), "Unexpected end of file in flate stream"); + endOfBlock = eof = gTrue; + remain = 0; +} + +GBool FlateStream::startBlock() { + int blockHdr; + int c; + int check; + + // free the code tables from the previous block + if (litCodeTab.codes != fixedLitCodeTab.codes) { + gfree(litCodeTab.codes); + } + litCodeTab.codes = NULL; + if (distCodeTab.codes != fixedDistCodeTab.codes) { + gfree(distCodeTab.codes); + } + distCodeTab.codes = NULL; + + // read block header + blockHdr = getCodeWord(3); + if (blockHdr & 1) + eof = gTrue; + blockHdr >>= 1; + + // uncompressed block + if (blockHdr == 0) { + compressedBlock = gFalse; + if ((c = str->getChar()) == EOF) + goto err; + blockLen = c & 0xff; + if ((c = str->getChar()) == EOF) + goto err; + blockLen |= (c & 0xff) << 8; + if ((c = str->getChar()) == EOF) + goto err; + check = c & 0xff; + if ((c = str->getChar()) == EOF) + goto err; + check |= (c & 0xff) << 8; + if (check != (~blockLen & 0xffff)) + error(getPos(), "Bad uncompressed block length in flate stream"); + codeBuf = 0; + codeSize = 0; + + // compressed block with fixed codes + } else if (blockHdr == 1) { + compressedBlock = gTrue; + loadFixedCodes(); + + // compressed block with dynamic codes + } else if (blockHdr == 2) { + compressedBlock = gTrue; + if (!readDynamicCodes()) { + goto err; + } + + // unknown block type + } else { + goto err; + } + + endOfBlock = gFalse; + return gTrue; + +err: + error(getPos(), "Bad block header in flate stream"); + endOfBlock = eof = gTrue; + return gFalse; +} + +void FlateStream::loadFixedCodes() { + litCodeTab.codes = fixedLitCodeTab.codes; + litCodeTab.maxLen = fixedLitCodeTab.maxLen; + distCodeTab.codes = fixedDistCodeTab.codes; + distCodeTab.maxLen = fixedDistCodeTab.maxLen; +} + +GBool FlateStream::readDynamicCodes() { + int numCodeLenCodes; + int numLitCodes; + int numDistCodes; + int codeLenCodeLengths[flateMaxCodeLenCodes]; + FlateHuffmanTab codeLenCodeTab; + int len, repeat, code; + int i; + + codeLenCodeTab.codes = NULL; + + // read lengths + if ((numLitCodes = getCodeWord(5)) == EOF) { + goto err; + } + numLitCodes += 257; + if ((numDistCodes = getCodeWord(5)) == EOF) { + goto err; + } + numDistCodes += 1; + if ((numCodeLenCodes = getCodeWord(4)) == EOF) { + goto err; + } + numCodeLenCodes += 4; + if (numLitCodes > flateMaxLitCodes || + numDistCodes > flateMaxDistCodes || + numCodeLenCodes > flateMaxCodeLenCodes) { + goto err; + } + + // build the code length code table + for (i = 0; i < flateMaxCodeLenCodes; ++i) { + codeLenCodeLengths[i] = 0; + } + for (i = 0; i < numCodeLenCodes; ++i) { + if ((codeLenCodeLengths[codeLenCodeMap[i]] = getCodeWord(3)) == -1) { + goto err; + } + } + compHuffmanCodes(codeLenCodeLengths, flateMaxCodeLenCodes, &codeLenCodeTab); + + // build the literal and distance code tables + len = 0; + repeat = 0; + i = 0; + while (i < numLitCodes + numDistCodes) { + if ((code = getHuffmanCodeWord(&codeLenCodeTab)) == EOF) { + goto err; + } + if (code == 16) { + if ((repeat = getCodeWord(2)) == EOF) { + goto err; + } + repeat += 3; + if (i + repeat > numLitCodes + numDistCodes) { + goto err; + } + for (; repeat > 0; --repeat) { + codeLengths[i++] = len; + } + } else if (code == 17) { + if ((repeat = getCodeWord(3)) == EOF) { + goto err; + } + repeat += 3; + if (i + repeat > numLitCodes + numDistCodes) { + goto err; + } + len = 0; + for (; repeat > 0; --repeat) { + codeLengths[i++] = 0; + } + } else if (code == 18) { + if ((repeat = getCodeWord(7)) == EOF) { + goto err; + } + repeat += 11; + if (i + repeat > numLitCodes + numDistCodes) { + goto err; + } + len = 0; + for (; repeat > 0; --repeat) { + codeLengths[i++] = 0; + } + } else { + codeLengths[i++] = len = code; + } + } + compHuffmanCodes(codeLengths, numLitCodes, &litCodeTab); + compHuffmanCodes(codeLengths + numLitCodes, numDistCodes, &distCodeTab); + + gfree(codeLenCodeTab.codes); + return gTrue; + +err: + error(getPos(), "Bad dynamic code table in flate stream"); + gfree(codeLenCodeTab.codes); + return gFalse; +} + +// Convert an array of lengths, in value order, into a +// Huffman code lookup table. +void FlateStream::compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab) { + int tabSize, len, code, code2, skip, val, i, t; + + // find max code length + tab->maxLen = 0; + for (val = 0; val < n; ++val) { + if (lengths[val] > tab->maxLen) { + tab->maxLen = lengths[val]; + } + } + + // allocate the table + tabSize = 1 << tab->maxLen; + tab->codes = (FlateCode *)gmallocn(tabSize, sizeof(FlateCode)); + + // clear the table + for (i = 0; i < tabSize; ++i) { + tab->codes[i].len = 0; + tab->codes[i].val = 0; + } + + // build the table + for (len = 1, code = 0, skip = 2; + len <= tab->maxLen; + ++len, code <<= 1, skip <<= 1) { + for (val = 0; val < n; ++val) { + if (lengths[val] == len) { + + // bit-reverse the code + code2 = 0; + t = code; + for (i = 0; i < len; ++i) { + code2 = (code2 << 1) | (t & 1); + t >>= 1; + } + + // fill in the table entries + for (i = code2; i < tabSize; i += skip) { + tab->codes[i].len = (Gushort)len; + tab->codes[i].val = (Gushort)val; + } + + ++code; + } + } + } +} + +int FlateStream::getHuffmanCodeWord(FlateHuffmanTab *tab) { + FlateCode *code; + int c; + + while (codeSize < tab->maxLen) { + if ((c = str->getChar()) == EOF) { + break; + } + codeBuf |= (c & 0xff) << codeSize; + codeSize += 8; + } + code = &tab->codes[codeBuf & ((1 << tab->maxLen) - 1)]; + if (codeSize == 0 || codeSize < code->len || code->len == 0) { + return EOF; + } + codeBuf >>= code->len; + codeSize -= code->len; + return (int)code->val; +} + +int FlateStream::getCodeWord(int bits) { + int c; + + while (codeSize < bits) { + if ((c = str->getChar()) == EOF) + return EOF; + codeBuf |= (c & 0xff) << codeSize; + codeSize += 8; + } + c = codeBuf & ((1 << bits) - 1); + codeBuf >>= bits; + codeSize -= bits; + return c; +} + +//------------------------------------------------------------------------ +// EOFStream +//------------------------------------------------------------------------ + +EOFStream::EOFStream(Stream *strA): + FilterStream(strA) { +} + +EOFStream::~EOFStream() { + delete str; +} + +//------------------------------------------------------------------------ +// FixedLengthEncoder +//------------------------------------------------------------------------ + +FixedLengthEncoder::FixedLengthEncoder(Stream *strA, int lengthA): + FilterStream(strA) { + length = lengthA; + count = 0; +} + +FixedLengthEncoder::~FixedLengthEncoder() { + if (str->isEncoder()) + delete str; +} + +void FixedLengthEncoder::reset() { + str->reset(); + count = 0; +} + +int FixedLengthEncoder::getChar() { + if (length >= 0 && count >= length) + return EOF; + ++count; + return str->getChar(); +} + +int FixedLengthEncoder::lookChar() { + if (length >= 0 && count >= length) + return EOF; + return str->getChar(); +} + +GBool FixedLengthEncoder::isBinary(GBool last) { + return str->isBinary(gTrue); +} + +//------------------------------------------------------------------------ +// ASCIIHexEncoder +//------------------------------------------------------------------------ + +ASCIIHexEncoder::ASCIIHexEncoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +ASCIIHexEncoder::~ASCIIHexEncoder() { + if (str->isEncoder()) { + delete str; + } +} + +void ASCIIHexEncoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +GBool ASCIIHexEncoder::fillBuf() { + static char *hex = "0123456789abcdef"; + int c; + + if (eof) { + return gFalse; + } + bufPtr = bufEnd = buf; + if ((c = str->getChar()) == EOF) { + *bufEnd++ = '>'; + eof = gTrue; + } else { + if (lineLen >= 64) { + *bufEnd++ = '\n'; + lineLen = 0; + } + *bufEnd++ = hex[(c >> 4) & 0x0f]; + *bufEnd++ = hex[c & 0x0f]; + lineLen += 2; + } + return gTrue; +} + +//------------------------------------------------------------------------ +// ASCII85Encoder +//------------------------------------------------------------------------ + +ASCII85Encoder::ASCII85Encoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +ASCII85Encoder::~ASCII85Encoder() { + if (str->isEncoder()) + delete str; +} + +void ASCII85Encoder::reset() { + str->reset(); + bufPtr = bufEnd = buf; + lineLen = 0; + eof = gFalse; +} + +GBool ASCII85Encoder::fillBuf() { + Gulong t; + char buf1[5]; + int c0, c1, c2, c3; + int n, i; + + if (eof) { + return gFalse; + } + c0 = str->getChar(); + c1 = str->getChar(); + c2 = str->getChar(); + c3 = str->getChar(); + bufPtr = bufEnd = buf; + if (c3 == EOF) { + if (c0 == EOF) { + n = 0; + t = 0; + } else { + if (c1 == EOF) { + n = 1; + t = c0 << 24; + } else if (c2 == EOF) { + n = 2; + t = (c0 << 24) | (c1 << 16); + } else { + n = 3; + t = (c0 << 24) | (c1 << 16) | (c2 << 8); + } + for (i = 4; i >= 0; --i) { + buf1[i] = (char)(t % 85 + 0x21); + t /= 85; + } + for (i = 0; i <= n; ++i) { + *bufEnd++ = buf1[i]; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } + } + *bufEnd++ = '~'; + *bufEnd++ = '>'; + eof = gTrue; + } else { + t = (c0 << 24) | (c1 << 16) | (c2 << 8) | c3; + if (t == 0) { + *bufEnd++ = 'z'; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } else { + for (i = 4; i >= 0; --i) { + buf1[i] = (char)(t % 85 + 0x21); + t /= 85; + } + for (i = 0; i <= 4; ++i) { + *bufEnd++ = buf1[i]; + if (++lineLen == 65) { + *bufEnd++ = '\n'; + lineLen = 0; + } + } + } + } + return gTrue; +} + +//------------------------------------------------------------------------ +// RunLengthEncoder +//------------------------------------------------------------------------ + +RunLengthEncoder::RunLengthEncoder(Stream *strA): + FilterStream(strA) { + bufPtr = bufEnd = nextEnd = buf; + eof = gFalse; +} + +RunLengthEncoder::~RunLengthEncoder() { + if (str->isEncoder()) + delete str; +} + +void RunLengthEncoder::reset() { + str->reset(); + bufPtr = bufEnd = nextEnd = buf; + eof = gFalse; +} + +// +// When fillBuf finishes, buf[] looks like this: +// +-----+--------------+-----------------+-- +// + tag | ... data ... | next 0, 1, or 2 | +// +-----+--------------+-----------------+-- +// ^ ^ ^ +// bufPtr bufEnd nextEnd +// +GBool RunLengthEncoder::fillBuf() { + int c, c1, c2; + int n; + + // already hit EOF? + if (eof) + return gFalse; + + // grab two bytes + if (nextEnd < bufEnd + 1) { + if ((c1 = str->getChar()) == EOF) { + eof = gTrue; + return gFalse; + } + } else { + c1 = bufEnd[0] & 0xff; + } + if (nextEnd < bufEnd + 2) { + if ((c2 = str->getChar()) == EOF) { + eof = gTrue; + buf[0] = 0; + buf[1] = c1; + bufPtr = buf; + bufEnd = &buf[2]; + return gTrue; + } + } else { + c2 = bufEnd[1] & 0xff; + } + + // check for repeat + c = 0; // make gcc happy + if (c1 == c2) { + n = 2; + while (n < 128 && (c = str->getChar()) == c1) + ++n; + buf[0] = (char)(257 - n); + buf[1] = c1; + bufEnd = &buf[2]; + if (c == EOF) { + eof = gTrue; + } else if (n < 128) { + buf[2] = c; + nextEnd = &buf[3]; + } else { + nextEnd = bufEnd; + } + + // get up to 128 chars + } else { + buf[1] = c1; + buf[2] = c2; + n = 2; + while (n < 128) { + if ((c = str->getChar()) == EOF) { + eof = gTrue; + break; + } + ++n; + buf[n] = c; + if (buf[n] == buf[n-1]) + break; + } + if (buf[n] == buf[n-1]) { + buf[0] = (char)(n-2-1); + bufEnd = &buf[n-1]; + nextEnd = &buf[n+1]; + } else { + buf[0] = (char)(n-1); + bufEnd = nextEnd = &buf[n+1]; + } + } + bufPtr = buf; + return gTrue; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h new file mode 100644 index 000000000..4695878e7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h @@ -0,0 +1,861 @@ +//======================================================================== +// +// Stream.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef STREAM_H +#define STREAM_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "gtypes.h" +#include "Object.h" + +class BaseStream; + +//------------------------------------------------------------------------ + +enum StreamKind { + strFile, + strASCIIHex, + strASCII85, + strLZW, + strRunLength, + strCCITTFax, + strDCT, + strFlate, + strJBIG2, + strJPX, + strWeird // internal-use stream types +}; + +enum StreamColorSpaceMode { + streamCSNone, + streamCSDeviceGray, + streamCSDeviceRGB, + streamCSDeviceCMYK, + streamCSDeviceRGBX +}; + +//------------------------------------------------------------------------ + +// This is in Stream.h instead of Decrypt.h to avoid really annoying +// include file dependency loops. +enum CryptAlgorithm { + cryptRC4, + cryptAES +}; + +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +class Stream { +public: + + // Constructor. + Stream(); + + // Destructor. + virtual ~Stream(); + + // Reference counting. + int incRef() { return ++ref; } + int decRef() { return --ref; } + + // Get kind of stream. + virtual StreamKind getKind() = 0; + + // Reset stream to beginning. + virtual void reset() = 0; + + // Close down the stream. + virtual void close(); + + // Get next char from stream. + virtual int getChar() = 0; + + // Peek at next char in stream. + virtual int lookChar() = 0; + + // Get next char from stream without using the predictor. + // This is only used by StreamPredictor. + virtual int getRawChar(); + + // Get next line from stream. + virtual char *getLine(char *buf, int size); + + // Get current position in file. + virtual int getPos() = 0; + + // Go to a position in the stream. If is negative, the + // position is from the end of the file; otherwise the position is + // from the start of the file. + virtual void setPos(Guint pos, int dir = 0) = 0; + + // Get PostScript command for the filter(s). + virtual GString *getPSFilter(int psLevel, char *indent); + + // Does this stream type potentially contain non-printable chars? + virtual GBool isBinary(GBool last = gTrue) = 0; + + // Get the BaseStream of this stream. + virtual BaseStream *getBaseStream() = 0; + + // Get the stream after the last decoder (this may be a BaseStream + // or a DecryptStream). + virtual Stream *getUndecodedStream() = 0; + + // Get the dictionary associated with this stream. + virtual Dict *getDict() = 0; + + // Is this an encoding filter? + virtual GBool isEncoder() { return gFalse; } + + // Get image parameters which are defined by the stream contents. + virtual void getImageParams(int *bitsPerComponent, + StreamColorSpaceMode *csMode) {} + + // Return the next stream in the "stack". + virtual Stream *getNextStream() { return NULL; } + + // Add filters to this stream according to the parameters in . + // Returns the new stream. + Stream *addFilters(Object *dict); + +private: + + Stream *makeFilter(char *name, Stream *str, Object *params); + + int ref; // reference count +}; + +//------------------------------------------------------------------------ +// BaseStream +// +// This is the base class for all streams that read directly from a file. +//------------------------------------------------------------------------ + +class BaseStream: public Stream { +public: + + BaseStream(Object *dictA); + virtual ~BaseStream(); + virtual Stream *makeSubStream(Guint start, GBool limited, + Guint length, Object *dict) = 0; + virtual void setPos(Guint pos, int dir = 0) = 0; + virtual GBool isBinary(GBool last = gTrue) { return last; } + virtual BaseStream *getBaseStream() { return this; } + virtual Stream *getUndecodedStream() { return this; } + virtual Dict *getDict() { return dict.getDict(); } + virtual GString *getFileName() { return NULL; } + + // Get/set position of first byte of stream within the file. + virtual Guint getStart() = 0; + virtual void moveStart(int delta) = 0; + +private: + + Object dict; +}; + +//------------------------------------------------------------------------ +// FilterStream +// +// This is the base class for all streams that filter another stream. +//------------------------------------------------------------------------ + +class FilterStream: public Stream { +public: + + FilterStream(Stream *strA); + virtual ~FilterStream(); + virtual void close(); + virtual int getPos() { return str->getPos(); } + virtual void setPos(Guint pos, int dir = 0); + virtual BaseStream *getBaseStream() { return str->getBaseStream(); } + virtual Stream *getUndecodedStream() { return str->getUndecodedStream(); } + virtual Dict *getDict() { return str->getDict(); } + virtual Stream *getNextStream() { return str; } + +protected: + + Stream *str; +}; + +//------------------------------------------------------------------------ +// ImageStream +//------------------------------------------------------------------------ + +class ImageStream { +public: + + // Create an image stream object for an image with the specified + // parameters. Note that these are the actual image parameters, + // which may be different from the predictor parameters. + ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA); + + ~ImageStream(); + + // Reset the stream. + void reset(); + + // Gets the next pixel from the stream. should be able to hold + // at least nComps elements. Returns false at end of file. + GBool getPixel(Guchar *pix); + + // Returns a pointer to the next line of pixels. Returns NULL at + // end of file. + Guchar *getLine(); + + // Skip an entire line from the image. + void skipLine(); + +private: + + Stream *str; // base stream + int width; // pixels per line + int nComps; // components per pixel + int nBits; // bits per component + int nVals; // components per line + Guchar *imgLine; // line buffer + int imgIdx; // current index in imgLine +}; + +//------------------------------------------------------------------------ +// StreamPredictor +//------------------------------------------------------------------------ + +class StreamPredictor { +public: + + // Create a predictor object. Note that the parameters are for the + // predictor, and may not match the actual image parameters. + StreamPredictor(Stream *strA, int predictorA, + int widthA, int nCompsA, int nBitsA); + + ~StreamPredictor(); + + GBool isOk() { return ok; } + + int lookChar(); + int getChar(); + +private: + + GBool getNextLine(); + + Stream *str; // base stream + int predictor; // predictor + int width; // pixels per line + int nComps; // components per pixel + int nBits; // bits per component + int nVals; // components per line + int pixBytes; // bytes per pixel + int rowBytes; // bytes per line + Guchar *predLine; // line buffer + int predIdx; // current index in predLine + GBool ok; +}; + +//------------------------------------------------------------------------ +// FileStream +//------------------------------------------------------------------------ + +#define fileStreamBufSize 256 + +class FileStream: public BaseStream { +public: + + FileStream(FILE *fA, Guint startA, GBool limitedA, + Guint lengthA, Object *dictA); + virtual ~FileStream(); + virtual Stream *makeSubStream(Guint startA, GBool limitedA, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return strFile; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual int getPos() { return bufPos + (bufPtr - buf); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart() { return start; } + virtual void moveStart(int delta); + +private: + + GBool fillBuf(); + + FILE *f; + Guint start; + GBool limited; + Guint length; + char buf[fileStreamBufSize]; + char *bufPtr; + char *bufEnd; + Guint bufPos; + int savePos; + GBool saved; +}; + +//------------------------------------------------------------------------ +// MemStream +//------------------------------------------------------------------------ + +class MemStream: public BaseStream { +public: + + MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA); + virtual ~MemStream(); + virtual Stream *makeSubStream(Guint start, GBool limited, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual void close(); + virtual int getChar() + { return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; } + virtual int lookChar() + { return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; } + virtual int getPos() { return (int)(bufPtr - buf); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart() { return start; } + virtual void moveStart(int delta); + +private: + + char *buf; + Guint start; + Guint length; + char *bufEnd; + char *bufPtr; + GBool needFree; +}; + +//------------------------------------------------------------------------ +// EmbedStream +// +// This is a special stream type used for embedded streams (inline +// images). It reads directly from the base stream -- after the +// EmbedStream is deleted, reads from the base stream will proceed where +// the BaseStream left off. Note that this is very different behavior +// that creating a new FileStream (using makeSubStream). +//------------------------------------------------------------------------ + +class EmbedStream: public BaseStream { +public: + + EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Guint lengthA); + virtual ~EmbedStream(); + virtual Stream *makeSubStream(Guint start, GBool limitedA, + Guint lengthA, Object *dictA); + virtual StreamKind getKind() { return str->getKind(); } + virtual void reset() {} + virtual int getChar(); + virtual int lookChar(); + virtual int getPos() { return str->getPos(); } + virtual void setPos(Guint pos, int dir = 0); + virtual Guint getStart(); + virtual void moveStart(int delta); + +private: + + Stream *str; + GBool limited; + Guint length; +}; + +//------------------------------------------------------------------------ +// ASCIIHexStream +//------------------------------------------------------------------------ + +class ASCIIHexStream: public FilterStream { +public: + + ASCIIHexStream(Stream *strA); + virtual ~ASCIIHexStream(); + virtual StreamKind getKind() { return strASCIIHex; } + virtual void reset(); + virtual int getChar() + { int c = lookChar(); buf = EOF; return c; } + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int buf; + GBool eof; +}; + +//------------------------------------------------------------------------ +// ASCII85Stream +//------------------------------------------------------------------------ + +class ASCII85Stream: public FilterStream { +public: + + ASCII85Stream(Stream *strA); + virtual ~ASCII85Stream(); + virtual StreamKind getKind() { return strASCII85; } + virtual void reset(); + virtual int getChar() + { int ch = lookChar(); ++index; return ch; } + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int c[5]; + int b[4]; + int index, n; + GBool eof; +}; + +//------------------------------------------------------------------------ +// LZWStream +//------------------------------------------------------------------------ + +class LZWStream: public FilterStream { +public: + + LZWStream(Stream *strA, int predictor, int columns, int colors, + int bits, int earlyA); + virtual ~LZWStream(); + virtual StreamKind getKind() { return strLZW; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + StreamPredictor *pred; // predictor + int early; // early parameter + GBool eof; // true if at eof + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer + struct { // decoding table + int length; + int head; + Guchar tail; + } table[4097]; + int nextCode; // next code to be used + int nextBits; // number of bits in next code word + int prevCode; // previous code used in stream + int newChar; // next char to be added to table + Guchar seqBuf[4097]; // buffer for current sequence + int seqLength; // length of current sequence + int seqIndex; // index into current sequence + GBool first; // first code after a table clear + + GBool processNextCode(); + void clearTable(); + int getCode(); +}; + +//------------------------------------------------------------------------ +// RunLengthStream +//------------------------------------------------------------------------ + +class RunLengthStream: public FilterStream { +public: + + RunLengthStream(Stream *strA); + virtual ~RunLengthStream(); + virtual StreamKind getKind() { return strRunLength; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + char buf[128]; // buffer + char *bufPtr; // next char to read + char *bufEnd; // end of buffer + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// CCITTFaxStream +//------------------------------------------------------------------------ + +struct CCITTCodeTable; + +class CCITTFaxStream: public FilterStream { +public: + + CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA, + GBool byteAlignA, int columnsA, int rowsA, + GBool endOfBlockA, GBool blackA); + virtual ~CCITTFaxStream(); + virtual StreamKind getKind() { return strCCITTFax; } + virtual void reset(); + virtual int getChar() + { int c = lookChar(); buf = EOF; return c; } + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + int encoding; // 'K' parameter + GBool endOfLine; // 'EndOfLine' parameter + GBool byteAlign; // 'EncodedByteAlign' parameter + int columns; // 'Columns' parameter + int rows; // 'Rows' parameter + GBool endOfBlock; // 'EndOfBlock' parameter + GBool black; // 'BlackIs1' parameter + GBool eof; // true if at eof + GBool nextLine2D; // true if next line uses 2D encoding + int row; // current row + int inputBuf; // input buffer + int inputBits; // number of bits in input buffer + int *codingLine; // coding line changing elements + int *refLine; // reference line changing elements + int a0i; // index into codingLine + GBool err; // error on current line + int outputBits; // remaining ouput bits + int buf; // character buffer + + void addPixels(int a1, int black); + void addPixelsNeg(int a1, int black); + short getTwoDimCode(); + short getWhiteCode(); + short getBlackCode(); + short lookBits(int n); + void eatBits(int n) { if ((inputBits -= n) < 0) inputBits = 0; } +}; + +//------------------------------------------------------------------------ +// DCTStream +//------------------------------------------------------------------------ + +// DCT component info +struct DCTCompInfo { + int id; // component ID + int hSample, vSample; // horiz/vert sampling resolutions + int quantTable; // quantization table number + int prevDC; // DC coefficient accumulator +}; + +struct DCTScanInfo { + GBool comp[4]; // comp[i] is set if component i is + // included in this scan + int numComps; // number of components in the scan + int dcHuffTable[4]; // DC Huffman table numbers + int acHuffTable[4]; // AC Huffman table numbers + int firstCoeff, lastCoeff; // first and last DCT coefficient + int ah, al; // successive approximation parameters +}; + +// DCT Huffman decoding table +struct DCTHuffTable { + Guchar firstSym[17]; // first symbol for this bit length + Gushort firstCode[17]; // first code for this bit length + Gushort numCodes[17]; // number of codes of this bit length + Guchar sym[256]; // symbols +}; + +class DCTStream: public FilterStream { +public: + + DCTStream(Stream *strA, int colorXformA); + virtual ~DCTStream(); + virtual StreamKind getKind() { return strDCT; } + virtual void reset(); + virtual void close(); + virtual int getChar(); + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + Stream *getRawStream() { return str; } + +private: + + GBool progressive; // set if in progressive mode + GBool interleaved; // set if in interleaved mode + int width, height; // image size + int mcuWidth, mcuHeight; // size of min coding unit, in data units + int bufWidth, bufHeight; // frameBuf size + DCTCompInfo compInfo[4]; // info for each component + DCTScanInfo scanInfo; // info for the current scan + int numComps; // number of components in image + int colorXform; // color transform: -1 = unspecified + // 0 = none + // 1 = YUV/YUVK -> RGB/CMYK + GBool gotJFIFMarker; // set if APP0 JFIF marker was present + GBool gotAdobeMarker; // set if APP14 Adobe marker was present + int restartInterval; // restart interval, in MCUs + Gushort quantTables[4][64]; // quantization tables + int numQuantTables; // number of quantization tables + DCTHuffTable dcHuffTables[4]; // DC Huffman tables + DCTHuffTable acHuffTables[4]; // AC Huffman tables + int numDCHuffTables; // number of DC Huffman tables + int numACHuffTables; // number of AC Huffman tables + Guchar *rowBuf[4][32]; // buffer for one MCU (non-progressive mode) + int *frameBuf[4]; // buffer for frame (progressive mode) + int comp, x, y, dy; // current position within image/MCU + int restartCtr; // MCUs left until restart + int restartMarker; // next restart marker + int eobRun; // number of EOBs left in the current run + int inputBuf; // input buffer for variable length codes + int inputBits; // number of valid bits in input buffer + + void restart(); + GBool readMCURow(); + void readScan(); + GBool readDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]); + GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable, + DCTHuffTable *acHuffTable, + int *prevDC, int data[64]); + void decodeImage(); + void transformDataUnit(Gushort *quantTable, + int dataIn[64], Guchar dataOut[64]); + int readHuffSym(DCTHuffTable *table); + int readAmp(int size); + int readBit(); + GBool readHeader(); + GBool readBaselineSOF(); + GBool readProgressiveSOF(); + GBool readScanInfo(); + GBool readQuantTables(); + GBool readHuffmanTables(); + GBool readRestartInterval(); + GBool readJFIFMarker(); + GBool readAdobeMarker(); + GBool readTrailer(); + int readMarker(); + int read16(); +}; + +//------------------------------------------------------------------------ +// FlateStream +//------------------------------------------------------------------------ + +#define flateWindow 32768 // buffer size +#define flateMask (flateWindow-1) +#define flateMaxHuffman 15 // max Huffman code length +#define flateMaxCodeLenCodes 19 // max # code length codes +#define flateMaxLitCodes 288 // max # literal codes +#define flateMaxDistCodes 30 // max # distance codes + +// Huffman code table entry +struct FlateCode { + Gushort len; // code length, in bits + Gushort val; // value represented by this code +}; + +struct FlateHuffmanTab { + FlateCode *codes; + int maxLen; +}; + +// Decoding info for length and distance code words +struct FlateDecode { + int bits; // # extra bits + int first; // first length/distance +}; + +class FlateStream: public FilterStream { +public: + + FlateStream(Stream *strA, int predictor, int columns, + int colors, int bits); + virtual ~FlateStream(); + virtual StreamKind getKind() { return strFlate; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual int getRawChar(); + virtual GString *getPSFilter(int psLevel, char *indent); + virtual GBool isBinary(GBool last = gTrue); + +private: + + StreamPredictor *pred; // predictor + Guchar buf[flateWindow]; // output data buffer + int index; // current index into output buffer + int remain; // number valid bytes in output buffer + int codeBuf; // input buffer + int codeSize; // number of bits in input buffer + int // literal and distance code lengths + codeLengths[flateMaxLitCodes + flateMaxDistCodes]; + FlateHuffmanTab litCodeTab; // literal code table + FlateHuffmanTab distCodeTab; // distance code table + GBool compressedBlock; // set if reading a compressed block + int blockLen; // remaining length of uncompressed block + GBool endOfBlock; // set when end of block is reached + GBool eof; // set when end of stream is reached + + static int // code length code reordering + codeLenCodeMap[flateMaxCodeLenCodes]; + static FlateDecode // length decoding info + lengthDecode[flateMaxLitCodes-257]; + static FlateDecode // distance decoding info + distDecode[flateMaxDistCodes]; + static FlateHuffmanTab // fixed literal code table + fixedLitCodeTab; + static FlateHuffmanTab // fixed distance code table + fixedDistCodeTab; + + void readSome(); + GBool startBlock(); + void loadFixedCodes(); + GBool readDynamicCodes(); + void compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab); + int getHuffmanCodeWord(FlateHuffmanTab *tab); + int getCodeWord(int bits); +}; + +//------------------------------------------------------------------------ +// EOFStream +//------------------------------------------------------------------------ + +class EOFStream: public FilterStream { +public: + + EOFStream(Stream *strA); + virtual ~EOFStream(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset() {} + virtual int getChar() { return EOF; } + virtual int lookChar() { return EOF; } + virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } +}; + +//------------------------------------------------------------------------ +// FixedLengthEncoder +//------------------------------------------------------------------------ + +class FixedLengthEncoder: public FilterStream { +public: + + FixedLengthEncoder(Stream *strA, int lengthA); + ~FixedLengthEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar(); + virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue); + virtual GBool isEncoder() { return gTrue; } + +private: + + int length; + int count; +}; + +//------------------------------------------------------------------------ +// ASCIIHexEncoder +//------------------------------------------------------------------------ + +class ASCIIHexEncoder: public FilterStream { +public: + + ASCIIHexEncoder(Stream *strA); + virtual ~ASCIIHexEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[4]; + char *bufPtr; + char *bufEnd; + int lineLen; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// ASCII85Encoder +//------------------------------------------------------------------------ + +class ASCII85Encoder: public FilterStream { +public: + + ASCII85Encoder(Stream *strA); + virtual ~ASCII85Encoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gFalse; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[8]; + char *bufPtr; + char *bufEnd; + int lineLen; + GBool eof; + + GBool fillBuf(); +}; + +//------------------------------------------------------------------------ +// RunLengthEncoder +//------------------------------------------------------------------------ + +class RunLengthEncoder: public FilterStream { +public: + + RunLengthEncoder(Stream *strA); + virtual ~RunLengthEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } + virtual int lookChar() + { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } + virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gTrue; } + virtual GBool isEncoder() { return gTrue; } + +private: + + char buf[131]; + char *bufPtr; + char *bufEnd; + char *nextEnd; + GBool eof; + + GBool fillBuf(); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc new file mode 100644 index 000000000..a78f0ee8d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc @@ -0,0 +1,4090 @@ +//======================================================================== +// +// TextOutputDev.cc +// +// Copyright 1997-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include +#ifdef WIN32 +#include // for O_BINARY +#include // for setmode +#endif +#include "gmem.h" +#include "GString.h" +#include "GList.h" +#include "config.h" +#include "Error.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" +#include "UnicodeTypeTable.h" +#include "GfxState.h" +#include "Link.h" +#include "TextOutputDev.h" + +#ifdef MACOS +// needed for setting type/creator of MacOS files +#include "ICSupport.h" +#endif + +//------------------------------------------------------------------------ +// parameters +//------------------------------------------------------------------------ + +// Each bucket in a text pool includes baselines within a range of +// this many points. +#define textPoolStep 4 + +// Inter-character space width which will cause addChar to start a new +// word. +#define minWordBreakSpace 0.1 + +// Negative inter-character space width, i.e., overlap, which will +// cause addChar to start a new word. +#define minDupBreakOverlap 0.2 + +// Max distance between baselines of two lines within a block, as a +// fraction of the font size. +#define maxLineSpacingDelta 1.5 + +// Max difference in primary font sizes on two lines in the same +// block. Delta1 is used when examining new lines above and below the +// current block; delta2 is used when examining text that overlaps the +// current block; delta3 is used when examining text to the left and +// right of the current block. +#define maxBlockFontSizeDelta1 0.05 +#define maxBlockFontSizeDelta2 0.6 +#define maxBlockFontSizeDelta3 0.2 + +// Max difference in font sizes inside a word. +#define maxWordFontSizeDelta 0.05 + +// Maximum distance between baselines of two words on the same line, +// e.g., distance between subscript or superscript and the primary +// baseline, as a fraction of the font size. +#define maxIntraLineDelta 0.5 + +// Minimum inter-word spacing, as a fraction of the font size. (Only +// used for raw ordering.) +#define minWordSpacing 0.15 + +// Maximum inter-word spacing, as a fraction of the font size. +#define maxWordSpacing 1.5 + +// Maximum horizontal spacing which will allow a word to be pulled +// into a block. +#define minColSpacing1 0.3 + +// Minimum spacing between columns, as a fraction of the font size. +#define minColSpacing2 1.0 + +// Maximum vertical spacing between blocks within a flow, as a +// multiple of the font size. +#define maxBlockSpacing 2.5 + +// Minimum spacing between characters within a word, as a fraction of +// the font size. +#define minCharSpacing -0.2 + +// Maximum spacing between characters within a word, as a fraction of +// the font size, when there is no obvious extra-wide character +// spacing. +#define maxCharSpacing 0.03 + +// When extra-wide character spacing is detected, the inter-character +// space threshold is set to the minimum inter-character space +// multiplied by this constant. +#define maxWideCharSpacingMul 1.3 + +// Upper limit on spacing between characters in a word. +#define maxWideCharSpacing 0.4 + +// Max difference in primary,secondary coordinates (as a fraction of +// the font size) allowed for duplicated text (fake boldface, drop +// shadows) which is to be discarded. +#define dupMaxPriDelta 0.1 +#define dupMaxSecDelta 0.2 + +// Max width of underlines (in points). +#define maxUnderlineWidth 3 + +// Min distance between baseline and underline (in points). +//~ this should be font-size-dependent +#define minUnderlineGap -2 + +// Max distance between baseline and underline (in points). +//~ this should be font-size-dependent +#define maxUnderlineGap 4 + +// Max horizontal distance between edge of word and start of underline +// (in points). +//~ this should be font-size-dependent +#define underlineSlack 1 + +// Max distance between edge of text and edge of link border +#define hyperlinkSlack 2 + +//------------------------------------------------------------------------ +// TextUnderline +//------------------------------------------------------------------------ + +class TextUnderline { +public: + + TextUnderline(double x0A, double y0A, double x1A, double y1A) + { x0 = x0A; y0 = y0A; x1 = x1A; y1 = y1A; horiz = y0 == y1; } + ~TextUnderline() {} + + double x0, y0, x1, y1; + GBool horiz; +}; + +//------------------------------------------------------------------------ +// TextLink +//------------------------------------------------------------------------ + +class TextLink { +public: + + TextLink(int xMinA, int yMinA, int xMaxA, int yMaxA, Link *linkA) + { xMin = xMinA; yMin = yMinA; xMax = xMaxA; yMax = yMaxA; link = linkA; } + ~TextLink() {} + + int xMin, yMin, xMax, yMax; + Link *link; +}; + +//------------------------------------------------------------------------ +// TextFontInfo +//------------------------------------------------------------------------ + +TextFontInfo::TextFontInfo(GfxState *state) { + gfxFont = state->getFont(); +#if TEXTOUT_WORD_LIST + fontName = (gfxFont && gfxFont->getOrigName()) + ? gfxFont->getOrigName()->copy() + : (GString *)NULL; + flags = gfxFont ? gfxFont->getFlags() : 0; +#endif +} + +TextFontInfo::~TextFontInfo() { +#if TEXTOUT_WORD_LIST + if (fontName) { + delete fontName; + } +#endif +} + +GBool TextFontInfo::matches(GfxState *state) { + return state->getFont() == gfxFont; +} + +//------------------------------------------------------------------------ +// TextWord +//------------------------------------------------------------------------ + +TextWord::TextWord(GfxState *state, int rotA, double x0, double y0, + int charPosA, TextFontInfo *fontA, double fontSizeA) { + GfxFont *gfxFont; + double x, y, ascent, descent; + + rot = rotA; + charPos = charPosA; + charLen = 0; + font = fontA; + fontSize = fontSizeA; + state->transform(x0, y0, &x, &y); + if ((gfxFont = font->gfxFont)) { + ascent = gfxFont->getAscent() * fontSize; + descent = gfxFont->getDescent() * fontSize; + } else { + // this means that the PDF file draws text without a current font, + // which should never happen + ascent = 0.95 * fontSize; + descent = -0.35 * fontSize; + } + switch (rot) { + case 0: + yMin = y - ascent; + yMax = y - descent; + if (yMin == yMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + yMin = y; + yMax = y + 1; + } + base = y; + break; + case 1: + xMin = x + descent; + xMax = x + ascent; + if (xMin == xMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + xMin = x; + xMax = x + 1; + } + base = x; + break; + case 2: + yMin = y + descent; + yMax = y + ascent; + if (yMin == yMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + yMin = y; + yMax = y + 1; + } + base = y; + break; + case 3: + xMin = x - ascent; + xMax = x - descent; + if (xMin == xMax) { + // this is a sanity check for a case that shouldn't happen -- but + // if it does happen, we want to avoid dividing by zero later + xMin = x; + xMax = x + 1; + } + base = x; + break; + } + text = NULL; + edge = NULL; + len = size = 0; + spaceAfter = gFalse; + next = NULL; + +#if TEXTOUT_WORD_LIST + GfxRGB rgb; + + if ((state->getRender() & 3) == 1) { + state->getStrokeRGB(&rgb); + } else { + state->getFillRGB(&rgb); + } + colorR = colToDbl(rgb.r); + colorG = colToDbl(rgb.g); + colorB = colToDbl(rgb.b); +#endif + + underlined = gFalse; + link = NULL; +} + +TextWord::~TextWord() { + gfree(text); + gfree(edge); +} + +void TextWord::addChar(GfxState *state, double x, double y, + double dx, double dy, Unicode u) { + if (len == size) { + size += 16; + text = (Unicode *)greallocn(text, size, sizeof(Unicode)); + edge = (double *)greallocn(edge, size + 1, sizeof(double)); + } + text[len] = u; + switch (rot) { + case 0: + if (len == 0) { + xMin = x; + } + edge[len] = x; + xMax = edge[len+1] = x + dx; + break; + case 1: + if (len == 0) { + yMin = y; + } + edge[len] = y; + yMax = edge[len+1] = y + dy; + break; + case 2: + if (len == 0) { + xMax = x; + } + edge[len] = x; + xMin = edge[len+1] = x + dx; + break; + case 3: + if (len == 0) { + yMax = y; + } + edge[len] = y; + yMin = edge[len+1] = y + dy; + break; + } + ++len; +} + +void TextWord::merge(TextWord *word) { + int i; + + if (word->xMin < xMin) { + xMin = word->xMin; + } + if (word->yMin < yMin) { + yMin = word->yMin; + } + if (word->xMax > xMax) { + xMax = word->xMax; + } + if (word->yMax > yMax) { + yMax = word->yMax; + } + if (len + word->len > size) { + size = len + word->len; + text = (Unicode *)greallocn(text, size, sizeof(Unicode)); + edge = (double *)greallocn(edge, size + 1, sizeof(double)); + } + for (i = 0; i < word->len; ++i) { + text[len + i] = word->text[i]; + edge[len + i] = word->edge[i]; + } + edge[len + word->len] = word->edge[word->len]; + len += word->len; + charLen += word->charLen; +} + +inline int TextWord::primaryCmp(TextWord *word) { + double cmp; + + cmp = 0; // make gcc happy + switch (rot) { + case 0: + cmp = xMin - word->xMin; + break; + case 1: + cmp = yMin - word->yMin; + break; + case 2: + cmp = word->xMax - xMax; + break; + case 3: + cmp = word->yMax - yMax; + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +double TextWord::primaryDelta(TextWord *word) { + double delta; + + delta = 0; // make gcc happy + switch (rot) { + case 0: + delta = word->xMin - xMax; + break; + case 1: + delta = word->yMin - yMax; + break; + case 2: + delta = xMin - word->xMax; + break; + case 3: + delta = yMin - word->yMax; + break; + } + return delta; +} + +int TextWord::cmpYX(const void *p1, const void *p2) { + TextWord *word1 = *(TextWord **)p1; + TextWord *word2 = *(TextWord **)p2; + double cmp; + + cmp = word1->yMin - word2->yMin; + if (cmp == 0) { + cmp = word1->xMin - word2->xMin; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +#if TEXTOUT_WORD_LIST + +GString *TextWord::getText() { + GString *s; + UnicodeMap *uMap; + char buf[8]; + int n, i; + + s = new GString(); + if (!(uMap = globalParams->getTextEncoding())) { + return s; + } + for (i = 0; i < len; ++i) { + n = uMap->mapUnicode(text[i], buf, sizeof(buf)); + s->append(buf, n); + } + uMap->decRefCnt(); + return s; +} + +void TextWord::getCharBBox(int charIdx, double *xMinA, double *yMinA, + double *xMaxA, double *yMaxA) { + if (charIdx < 0 || charIdx >= len) { + return; + } + switch (rot) { + case 0: + *xMinA = edge[charIdx]; + *xMaxA = edge[charIdx + 1]; + *yMinA = yMin; + *yMaxA = yMax; + break; + case 1: + *xMinA = xMin; + *xMaxA = xMax; + *yMinA = edge[charIdx]; + *yMaxA = edge[charIdx + 1]; + break; + case 2: + *xMinA = edge[charIdx + 1]; + *xMaxA = edge[charIdx]; + *yMinA = yMin; + *yMaxA = yMax; + break; + case 3: + *xMinA = xMin; + *xMaxA = xMax; + *yMinA = edge[charIdx + 1]; + *yMaxA = edge[charIdx]; + break; + } +} + +#endif // TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextPool +//------------------------------------------------------------------------ + +TextPool::TextPool() { + minBaseIdx = 0; + maxBaseIdx = -1; + pool = NULL; + cursor = NULL; + cursorBaseIdx = -1; +} + +TextPool::~TextPool() { + int baseIdx; + TextWord *word, *word2; + + for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { + for (word = pool[baseIdx - minBaseIdx]; word; word = word2) { + word2 = word->next; + delete word; + } + } + gfree(pool); +} + +int TextPool::getBaseIdx(double base) { + int baseIdx; + + baseIdx = (int)(base / textPoolStep); + if (baseIdx < minBaseIdx) { + return minBaseIdx; + } + if (baseIdx > maxBaseIdx) { + return maxBaseIdx; + } + return baseIdx; +} + +void TextPool::addWord(TextWord *word) { + TextWord **newPool; + int wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx; + TextWord *w0, *w1; + + // expand the array if needed + wordBaseIdx = (int)(word->base / textPoolStep); + if (minBaseIdx > maxBaseIdx) { + minBaseIdx = wordBaseIdx - 128; + maxBaseIdx = wordBaseIdx + 128; + pool = (TextWord **)gmallocn(maxBaseIdx - minBaseIdx + 1, + sizeof(TextWord *)); + for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { + pool[baseIdx - minBaseIdx] = NULL; + } + } else if (wordBaseIdx < minBaseIdx) { + newMinBaseIdx = wordBaseIdx - 128; + newPool = (TextWord **)gmallocn(maxBaseIdx - newMinBaseIdx + 1, + sizeof(TextWord *)); + for (baseIdx = newMinBaseIdx; baseIdx < minBaseIdx; ++baseIdx) { + newPool[baseIdx - newMinBaseIdx] = NULL; + } + memcpy(&newPool[minBaseIdx - newMinBaseIdx], pool, + (maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *)); + gfree(pool); + pool = newPool; + minBaseIdx = newMinBaseIdx; + } else if (wordBaseIdx > maxBaseIdx) { + newMaxBaseIdx = wordBaseIdx + 128; + pool = (TextWord **)greallocn(pool, newMaxBaseIdx - minBaseIdx + 1, + sizeof(TextWord *)); + for (baseIdx = maxBaseIdx + 1; baseIdx <= newMaxBaseIdx; ++baseIdx) { + pool[baseIdx - minBaseIdx] = NULL; + } + maxBaseIdx = newMaxBaseIdx; + } + + // insert the new word + if (cursor && wordBaseIdx == cursorBaseIdx && + word->primaryCmp(cursor) > 0) { + w0 = cursor; + w1 = cursor->next; + } else { + w0 = NULL; + w1 = pool[wordBaseIdx - minBaseIdx]; + } + for (; w1 && word->primaryCmp(w1) > 0; w0 = w1, w1 = w1->next) ; + word->next = w1; + if (w0) { + w0->next = word; + } else { + pool[wordBaseIdx - minBaseIdx] = word; + } + cursor = word; + cursorBaseIdx = wordBaseIdx; +} + +//------------------------------------------------------------------------ +// TextLine +//------------------------------------------------------------------------ + +TextLine::TextLine(TextBlock *blkA, int rotA, double baseA) { + blk = blkA; + rot = rotA; + xMin = yMin = 0; + xMax = yMax = -1; + base = baseA; + words = lastWord = NULL; + text = NULL; + edge = NULL; + col = NULL; + len = 0; + convertedLen = 0; + hyphenated = gFalse; + next = NULL; +} + +TextLine::~TextLine() { + TextWord *word; + + while (words) { + word = words; + words = words->next; + delete word; + } + gfree(text); + gfree(edge); + gfree(col); +} + +void TextLine::addWord(TextWord *word) { + if (lastWord) { + lastWord->next = word; + } else { + words = word; + } + lastWord = word; + + if (xMin > xMax) { + xMin = word->xMin; + xMax = word->xMax; + yMin = word->yMin; + yMax = word->yMax; + } else { + if (word->xMin < xMin) { + xMin = word->xMin; + } + if (word->xMax > xMax) { + xMax = word->xMax; + } + if (word->yMin < yMin) { + yMin = word->yMin; + } + if (word->yMax > yMax) { + yMax = word->yMax; + } + } +} + +double TextLine::primaryDelta(TextLine *line) { + double delta; + + delta = 0; // make gcc happy + switch (rot) { + case 0: + delta = line->xMin - xMax; + break; + case 1: + delta = line->yMin - yMax; + break; + case 2: + delta = xMin - line->xMax; + break; + case 3: + delta = yMin - line->yMax; + break; + } + return delta; +} + +int TextLine::primaryCmp(TextLine *line) { + double cmp; + + cmp = 0; // make gcc happy + switch (rot) { + case 0: + cmp = xMin - line->xMin; + break; + case 1: + cmp = yMin - line->yMin; + break; + case 2: + cmp = line->xMax - xMax; + break; + case 3: + cmp = line->yMax - yMax; + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLine::secondaryCmp(TextLine *line) { + double cmp; + + cmp = (rot == 0 || rot == 3) ? base - line->base : line->base - base; + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLine::cmpYX(TextLine *line) { + int cmp; + + if ((cmp = secondaryCmp(line))) { + return cmp; + } + return primaryCmp(line); +} + +int TextLine::cmpXY(const void *p1, const void *p2) { + TextLine *line1 = *(TextLine **)p1; + TextLine *line2 = *(TextLine **)p2; + int cmp; + + if ((cmp = line1->primaryCmp(line2))) { + return cmp; + } + return line1->secondaryCmp(line2); +} + +void TextLine::coalesce(UnicodeMap *uMap) { + TextWord *word0, *word1; + double space, delta, minSpace; + GBool isUnicode; + char buf[8]; + int i, j; + + if (words->next) { + + // compute the inter-word space threshold + if (words->len > 1 || words->next->len > 1) { + minSpace = 0; + } else { + minSpace = words->primaryDelta(words->next); + for (word0 = words->next, word1 = word0->next; + word1 && minSpace > 0; + word0 = word1, word1 = word0->next) { + if (word1->len > 1) { + minSpace = 0; + } + delta = word0->primaryDelta(word1); + if (delta < minSpace) { + minSpace = delta; + } + } + } + if (minSpace <= 0) { + space = maxCharSpacing * words->fontSize; + } else { + space = maxWideCharSpacingMul * minSpace; + if (space > maxWideCharSpacing * words->fontSize) { + space = maxWideCharSpacing * words->fontSize; + } + } + + // merge words + word0 = words; + word1 = words->next; + while (word1) { + if (word0->primaryDelta(word1) >= space) { + word0->spaceAfter = gTrue; + word0 = word1; + word1 = word1->next; + } else if (word0->font == word1->font && + word0->underlined == word1->underlined && + fabs(word0->fontSize - word1->fontSize) < + maxWordFontSizeDelta * words->fontSize && + word1->charPos == word0->charPos + word0->charLen) { + word0->merge(word1); + word0->next = word1->next; + delete word1; + word1 = word0->next; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + + // build the line text + isUnicode = uMap ? uMap->isUnicode() : gFalse; + len = 0; + for (word1 = words; word1; word1 = word1->next) { + len += word1->len; + if (word1->spaceAfter) { + ++len; + } + } + text = (Unicode *)gmallocn(len, sizeof(Unicode)); + edge = (double *)gmallocn(len + 1, sizeof(double)); + i = 0; + for (word1 = words; word1; word1 = word1->next) { + for (j = 0; j < word1->len; ++j) { + text[i] = word1->text[j]; + edge[i] = word1->edge[j]; + ++i; + } + edge[i] = word1->edge[word1->len]; + if (word1->spaceAfter) { + text[i] = (Unicode)0x0020; + ++i; + } + } + + // compute convertedLen and set up the col array + col = (int *)gmallocn(len + 1, sizeof(int)); + convertedLen = 0; + for (i = 0; i < len; ++i) { + col[i] = convertedLen; + if (isUnicode) { + ++convertedLen; + } else if (uMap) { + convertedLen += uMap->mapUnicode(text[i], buf, sizeof(buf)); + } + } + col[len] = convertedLen; + + // check for hyphen at end of line + //~ need to check for other chars used as hyphens + hyphenated = text[len - 1] == (Unicode)'-'; +} + +//------------------------------------------------------------------------ +// TextLineFrag +//------------------------------------------------------------------------ + +class TextLineFrag { +public: + + TextLine *line; // the line object + int start, len; // offset and length of this fragment + // (in Unicode chars) + double xMin, xMax; // bounding box coordinates + double yMin, yMax; + double base; // baseline virtual coordinate + int col; // first column + + void init(TextLine *lineA, int startA, int lenA); + void computeCoords(GBool oneRot); + + static int cmpYXPrimaryRot(const void *p1, const void *p2); + static int cmpYXLineRot(const void *p1, const void *p2); + static int cmpXYLineRot(const void *p1, const void *p2); + static int cmpXYColumnPrimaryRot(const void *p1, const void *p2); + static int cmpXYColumnLineRot(const void *p1, const void *p2); +}; + +void TextLineFrag::init(TextLine *lineA, int startA, int lenA) { + line = lineA; + start = startA; + len = lenA; + col = line->col[start]; +} + +void TextLineFrag::computeCoords(GBool oneRot) { + TextBlock *blk; + double d0, d1, d2, d3, d4; + + if (oneRot) { + + switch (line->rot) { + case 0: + xMin = line->edge[start]; + xMax = line->edge[start + len]; + yMin = line->yMin; + yMax = line->yMax; + break; + case 1: + xMin = line->xMin; + xMax = line->xMax; + yMin = line->edge[start]; + yMax = line->edge[start + len]; + break; + case 2: + xMin = line->edge[start + len]; + xMax = line->edge[start]; + yMin = line->yMin; + yMax = line->yMax; + break; + case 3: + xMin = line->xMin; + xMax = line->xMax; + yMin = line->edge[start + len]; + yMax = line->edge[start]; + break; + } + base = line->base; + + } else { + + if (line->rot == 0 && line->blk->page->primaryRot == 0) { + + xMin = line->edge[start]; + xMax = line->edge[start + len]; + yMin = line->yMin; + yMax = line->yMax; + base = line->base; + + } else { + + blk = line->blk; + d0 = line->edge[start]; + d1 = line->edge[start + len]; + d2 = d3 = d4 = 0; // make gcc happy + + switch (line->rot) { + case 0: + d2 = line->yMin; + d3 = line->yMax; + d4 = line->base; + d0 = (d0 - blk->xMin) / (blk->xMax - blk->xMin); + d1 = (d1 - blk->xMin) / (blk->xMax - blk->xMin); + d2 = (d2 - blk->yMin) / (blk->yMax - blk->yMin); + d3 = (d3 - blk->yMin) / (blk->yMax - blk->yMin); + d4 = (d4 - blk->yMin) / (blk->yMax - blk->yMin); + break; + case 1: + d2 = line->xMax; + d3 = line->xMin; + d4 = line->base; + d0 = (d0 - blk->yMin) / (blk->yMax - blk->yMin); + d1 = (d1 - blk->yMin) / (blk->yMax - blk->yMin); + d2 = (blk->xMax - d2) / (blk->xMax - blk->xMin); + d3 = (blk->xMax - d3) / (blk->xMax - blk->xMin); + d4 = (blk->xMax - d4) / (blk->xMax - blk->xMin); + break; + case 2: + d2 = line->yMax; + d3 = line->yMin; + d4 = line->base; + d0 = (blk->xMax - d0) / (blk->xMax - blk->xMin); + d1 = (blk->xMax - d1) / (blk->xMax - blk->xMin); + d2 = (blk->yMax - d2) / (blk->yMax - blk->yMin); + d3 = (blk->yMax - d3) / (blk->yMax - blk->yMin); + d4 = (blk->yMax - d4) / (blk->yMax - blk->yMin); + break; + case 3: + d2 = line->xMin; + d3 = line->xMax; + d4 = line->base; + d0 = (blk->yMax - d0) / (blk->yMax - blk->yMin); + d1 = (blk->yMax - d1) / (blk->yMax - blk->yMin); + d2 = (d2 - blk->xMin) / (blk->xMax - blk->xMin); + d3 = (d3 - blk->xMin) / (blk->xMax - blk->xMin); + d4 = (d4 - blk->xMin) / (blk->xMax - blk->xMin); + break; + } + + switch (line->blk->page->primaryRot) { + case 0: + xMin = blk->xMin + d0 * (blk->xMax - blk->xMin); + xMax = blk->xMin + d1 * (blk->xMax - blk->xMin); + yMin = blk->yMin + d2 * (blk->yMax - blk->yMin); + yMax = blk->yMin + d3 * (blk->yMax - blk->yMin); + base = blk->yMin + base * (blk->yMax - blk->yMin); + break; + case 1: + xMin = blk->xMax - d3 * (blk->xMax - blk->xMin); + xMax = blk->xMax - d2 * (blk->xMax - blk->xMin); + yMin = blk->yMin + d0 * (blk->yMax - blk->yMin); + yMax = blk->yMin + d1 * (blk->yMax - blk->yMin); + base = blk->xMax - d4 * (blk->xMax - blk->xMin); + break; + case 2: + xMin = blk->xMax - d1 * (blk->xMax - blk->xMin); + xMax = blk->xMax - d0 * (blk->xMax - blk->xMin); + yMin = blk->yMax - d3 * (blk->yMax - blk->yMin); + yMax = blk->yMax - d2 * (blk->yMax - blk->yMin); + base = blk->yMax - d4 * (blk->yMax - blk->yMin); + break; + case 3: + xMin = blk->xMin + d2 * (blk->xMax - blk->xMin); + xMax = blk->xMin + d3 * (blk->xMax - blk->xMin); + yMin = blk->yMax - d1 * (blk->yMax - blk->yMin); + yMax = blk->yMax - d0 * (blk->yMax - blk->yMin); + base = blk->xMin + d4 * (blk->xMax - blk->xMin); + break; + } + + } + } +} + +int TextLineFrag::cmpYXPrimaryRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (frag1->line->blk->page->primaryRot) { + case 0: + if (fabs(cmp = frag1->yMin - frag2->yMin) < 0.01) { + cmp = frag1->xMin - frag2->xMin; + } + break; + case 1: + if (fabs(cmp = frag2->xMax - frag1->xMax) < 0.01) { + cmp = frag1->yMin - frag2->yMin; + } + break; + case 2: + if (fabs(cmp = frag2->yMin - frag1->yMin) < 0.01) { + cmp = frag2->xMax - frag1->xMax; + } + break; + case 3: + if (fabs(cmp = frag1->xMax - frag2->xMax) < 0.01) { + cmp = frag2->yMax - frag1->yMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLineFrag::cmpYXLineRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (frag1->line->rot) { + case 0: + if ((cmp = frag1->yMin - frag2->yMin) == 0) { + cmp = frag1->xMin - frag2->xMin; + } + break; + case 1: + if ((cmp = frag2->xMax - frag1->xMax) == 0) { + cmp = frag1->yMin - frag2->yMin; + } + break; + case 2: + if ((cmp = frag2->yMin - frag1->yMin) == 0) { + cmp = frag2->xMax - frag1->xMax; + } + break; + case 3: + if ((cmp = frag1->xMax - frag2->xMax) == 0) { + cmp = frag2->yMax - frag1->yMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLineFrag::cmpXYLineRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (frag1->line->rot) { + case 0: + if ((cmp = frag1->xMin - frag2->xMin) == 0) { + cmp = frag1->yMin - frag2->yMin; + } + break; + case 1: + if ((cmp = frag1->yMin - frag2->yMin) == 0) { + cmp = frag2->xMax - frag1->xMax; + } + break; + case 2: + if ((cmp = frag2->xMax - frag1->xMax) == 0) { + cmp = frag2->yMin - frag1->yMin; + } + break; + case 3: + if ((cmp = frag2->yMax - frag1->yMax) == 0) { + cmp = frag1->xMax - frag2->xMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextLineFrag::cmpXYColumnPrimaryRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + // if columns overlap, compare y values + if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] - + frag2->line->col[frag2->start]) && + frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start])) { + cmp = 0; // make gcc happy + switch (frag1->line->blk->page->primaryRot) { + case 0: cmp = frag1->yMin - frag2->yMin; break; + case 1: cmp = frag2->xMax - frag1->xMax; break; + case 2: cmp = frag2->yMin - frag1->yMin; break; + case 3: cmp = frag1->xMax - frag2->xMax; break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; + } + + // otherwise, compare starting column + return frag1->col - frag2->col; +} + +int TextLineFrag::cmpXYColumnLineRot(const void *p1, const void *p2) { + TextLineFrag *frag1 = (TextLineFrag *)p1; + TextLineFrag *frag2 = (TextLineFrag *)p2; + double cmp; + + // if columns overlap, compare y values + if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] - + frag2->line->col[frag2->start]) && + frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start])) { + cmp = 0; // make gcc happy + switch (frag1->line->rot) { + case 0: cmp = frag1->yMin - frag2->yMin; break; + case 1: cmp = frag2->xMax - frag1->xMax; break; + case 2: cmp = frag2->yMin - frag1->yMin; break; + case 3: cmp = frag1->xMax - frag2->xMax; break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; + } + + // otherwise, compare starting column + return frag1->col - frag2->col; +} + +//------------------------------------------------------------------------ +// TextBlock +//------------------------------------------------------------------------ + +TextBlock::TextBlock(TextPage *pageA, int rotA) { + page = pageA; + rot = rotA; + xMin = yMin = 0; + xMax = yMax = -1; + priMin = 0; + priMax = page->pageWidth; + pool = new TextPool(); + lines = NULL; + curLine = NULL; + next = NULL; + stackNext = NULL; +} + +TextBlock::~TextBlock() { + TextLine *line; + + delete pool; + while (lines) { + line = lines; + lines = lines->next; + delete line; + } +} + +void TextBlock::addWord(TextWord *word) { + pool->addWord(word); + if (xMin > xMax) { + xMin = word->xMin; + xMax = word->xMax; + yMin = word->yMin; + yMax = word->yMax; + } else { + if (word->xMin < xMin) { + xMin = word->xMin; + } + if (word->xMax > xMax) { + xMax = word->xMax; + } + if (word->yMin < yMin) { + yMin = word->yMin; + } + if (word->yMax > yMax) { + yMax = word->yMax; + } + } +} + +void TextBlock::coalesce(UnicodeMap *uMap) { + TextWord *word0, *word1, *word2, *bestWord0, *bestWord1, *lastWord; + TextLine *line, *line0, *line1; + int poolMinBaseIdx, startBaseIdx, minBaseIdx, maxBaseIdx; + int baseIdx, bestWordBaseIdx, idx0, idx1; + double minBase, maxBase; + double fontSize, delta, priDelta, secDelta; + TextLine **lineArray; + GBool found; + int col1, col2; + int i, j, k; + + // discard duplicated text (fake boldface, drop shadows) + for (idx0 = pool->minBaseIdx; idx0 <= pool->maxBaseIdx; ++idx0) { + word0 = pool->getPool(idx0); + while (word0) { + priDelta = dupMaxPriDelta * word0->fontSize; + secDelta = dupMaxSecDelta * word0->fontSize; + if (rot == 0 || rot == 3) { + maxBaseIdx = pool->getBaseIdx(word0->base + secDelta); + } else { + maxBaseIdx = pool->getBaseIdx(word0->base - secDelta); + } + found = gFalse; + word1 = word2 = NULL; // make gcc happy + for (idx1 = idx0; idx1 <= maxBaseIdx; ++idx1) { + if (idx1 == idx0) { + word1 = word0; + word2 = word0->next; + } else { + word1 = NULL; + word2 = pool->getPool(idx1); + } + for (; word2; word1 = word2, word2 = word2->next) { + if (word2->len == word0->len && + !memcmp(word2->text, word0->text, + word0->len * sizeof(Unicode))) { + switch (rot) { + case 0: + case 2: + found = fabs(word0->xMin - word2->xMin) < priDelta && + fabs(word0->xMax - word2->xMax) < priDelta && + fabs(word0->yMin - word2->yMin) < secDelta && + fabs(word0->yMax - word2->yMax) < secDelta; + break; + case 1: + case 3: + found = fabs(word0->xMin - word2->xMin) < secDelta && + fabs(word0->xMax - word2->xMax) < secDelta && + fabs(word0->yMin - word2->yMin) < priDelta && + fabs(word0->yMax - word2->yMax) < priDelta; + break; + } + } + if (found) { + break; + } + } + if (found) { + break; + } + } + if (found) { + if (word1) { + word1->next = word2->next; + } else { + pool->setPool(idx1, word2->next); + } + delete word2; + } else { + word0 = word0->next; + } + } + } + + // build the lines + curLine = NULL; + poolMinBaseIdx = pool->minBaseIdx; + charCount = 0; + nLines = 0; + while (1) { + + // find the first non-empty line in the pool + for (; + poolMinBaseIdx <= pool->maxBaseIdx && !pool->getPool(poolMinBaseIdx); + ++poolMinBaseIdx) ; + if (poolMinBaseIdx > pool->maxBaseIdx) { + break; + } + + // look for the left-most word in the first four lines of the + // pool -- this avoids starting with a superscript word + startBaseIdx = poolMinBaseIdx; + for (baseIdx = poolMinBaseIdx + 1; + baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx; + ++baseIdx) { + if (!pool->getPool(baseIdx)) { + continue; + } + if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx)) + < 0) { + startBaseIdx = baseIdx; + } + } + + // create a new line + word0 = pool->getPool(startBaseIdx); + pool->setPool(startBaseIdx, word0->next); + word0->next = NULL; + line = new TextLine(this, word0->rot, word0->base); + line->addWord(word0); + lastWord = word0; + + // compute the search range + fontSize = word0->fontSize; + minBase = word0->base - maxIntraLineDelta * fontSize; + maxBase = word0->base + maxIntraLineDelta * fontSize; + minBaseIdx = pool->getBaseIdx(minBase); + maxBaseIdx = pool->getBaseIdx(maxBase); + + // find the rest of the words in this line + while (1) { + + // find the left-most word whose baseline is in the range for + // this line + bestWordBaseIdx = 0; + bestWord0 = bestWord1 = NULL; + for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { + for (word0 = NULL, word1 = pool->getPool(baseIdx); + word1; + word0 = word1, word1 = word1->next) { + if (word1->base >= minBase && + word1->base <= maxBase && + (delta = lastWord->primaryDelta(word1)) >= + minCharSpacing * fontSize) { + if (delta < maxWordSpacing * fontSize && + (!bestWord1 || word1->primaryCmp(bestWord1) < 0)) { + bestWordBaseIdx = baseIdx; + bestWord0 = word0; + bestWord1 = word1; + } + break; + } + } + } + if (!bestWord1) { + break; + } + + // remove it from the pool, and add it to the line + if (bestWord0) { + bestWord0->next = bestWord1->next; + } else { + pool->setPool(bestWordBaseIdx, bestWord1->next); + } + bestWord1->next = NULL; + line->addWord(bestWord1); + lastWord = bestWord1; + } + + // add the line + if (curLine && line->cmpYX(curLine) > 0) { + line0 = curLine; + line1 = curLine->next; + } else { + line0 = NULL; + line1 = lines; + } + for (; + line1 && line->cmpYX(line1) > 0; + line0 = line1, line1 = line1->next) ; + if (line0) { + line0->next = line; + } else { + lines = line; + } + line->next = line1; + curLine = line; + line->coalesce(uMap); + charCount += line->len; + ++nLines; + } + + // sort lines into xy order for column assignment + lineArray = (TextLine **)gmallocn(nLines, sizeof(TextLine *)); + for (line = lines, i = 0; line; line = line->next, ++i) { + lineArray[i] = line; + } + qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY); + + // column assignment + nColumns = 0; + for (i = 0; i < nLines; ++i) { + line0 = lineArray[i]; + col1 = 0; + for (j = 0; j < i; ++j) { + line1 = lineArray[j]; + if (line1->primaryDelta(line0) >= 0) { + col2 = line1->col[line1->len] + 1; + } else { + k = 0; // make gcc happy + switch (rot) { + case 0: + for (k = 0; + k < line1->len && + line0->xMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + case 1: + for (k = 0; + k < line1->len && + line0->yMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + case 2: + for (k = 0; + k < line1->len && + line0->xMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + case 3: + for (k = 0; + k < line1->len && + line0->yMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]); + ++k) ; + break; + } + col2 = line1->col[k]; + } + if (col2 > col1) { + col1 = col2; + } + } + for (k = 0; k <= line0->len; ++k) { + line0->col[k] += col1; + } + if (line0->col[line0->len] > nColumns) { + nColumns = line0->col[line0->len]; + } + } + gfree(lineArray); +} + +void TextBlock::updatePriMinMax(TextBlock *blk) { + double newPriMin, newPriMax; + GBool gotPriMin, gotPriMax; + + gotPriMin = gotPriMax = gFalse; + newPriMin = newPriMax = 0; // make gcc happy + switch (page->primaryRot) { + case 0: + case 2: + if (blk->yMin < yMax && blk->yMax > yMin) { + if (blk->xMin < xMin) { + newPriMin = blk->xMax; + gotPriMin = gTrue; + } + if (blk->xMax > xMax) { + newPriMax = blk->xMin; + gotPriMax = gTrue; + } + } + break; + case 1: + case 3: + if (blk->xMin < xMax && blk->xMax > xMin) { + if (blk->yMin < yMin) { + newPriMin = blk->yMax; + gotPriMin = gTrue; + } + if (blk->yMax > yMax) { + newPriMax = blk->yMin; + gotPriMax = gTrue; + } + } + break; + } + if (gotPriMin) { + if (newPriMin > xMin) { + newPriMin = xMin; + } + if (newPriMin > priMin) { + priMin = newPriMin; + } + } + if (gotPriMax) { + if (newPriMax < xMax) { + newPriMax = xMax; + } + if (newPriMax < priMax) { + priMax = newPriMax; + } + } +} + +int TextBlock::cmpXYPrimaryRot(const void *p1, const void *p2) { + TextBlock *blk1 = *(TextBlock **)p1; + TextBlock *blk2 = *(TextBlock **)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (blk1->page->primaryRot) { + case 0: + if ((cmp = blk1->xMin - blk2->xMin) == 0) { + cmp = blk1->yMin - blk2->yMin; + } + break; + case 1: + if ((cmp = blk1->yMin - blk2->yMin) == 0) { + cmp = blk2->xMax - blk1->xMax; + } + break; + case 2: + if ((cmp = blk2->xMax - blk1->xMax) == 0) { + cmp = blk2->yMin - blk1->yMin; + } + break; + case 3: + if ((cmp = blk2->yMax - blk1->yMax) == 0) { + cmp = blk1->xMax - blk2->xMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextBlock::cmpYXPrimaryRot(const void *p1, const void *p2) { + TextBlock *blk1 = *(TextBlock **)p1; + TextBlock *blk2 = *(TextBlock **)p2; + double cmp; + + cmp = 0; // make gcc happy + switch (blk1->page->primaryRot) { + case 0: + if ((cmp = blk1->yMin - blk2->yMin) == 0) { + cmp = blk1->xMin - blk2->xMin; + } + break; + case 1: + if ((cmp = blk2->xMax - blk1->xMax) == 0) { + cmp = blk1->yMin - blk2->yMin; + } + break; + case 2: + if ((cmp = blk2->yMin - blk1->yMin) == 0) { + cmp = blk2->xMax - blk1->xMax; + } + break; + case 3: + if ((cmp = blk1->xMax - blk2->xMax) == 0) { + cmp = blk2->yMax - blk1->yMax; + } + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +int TextBlock::primaryCmp(TextBlock *blk) { + double cmp; + + cmp = 0; // make gcc happy + switch (rot) { + case 0: + cmp = xMin - blk->xMin; + break; + case 1: + cmp = yMin - blk->yMin; + break; + case 2: + cmp = blk->xMax - xMax; + break; + case 3: + cmp = blk->yMax - yMax; + break; + } + return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; +} + +double TextBlock::secondaryDelta(TextBlock *blk) { + double delta; + + delta = 0; // make gcc happy + switch (rot) { + case 0: + delta = blk->yMin - yMax; + break; + case 1: + delta = xMin - blk->xMax; + break; + case 2: + delta = yMin - blk->yMax; + break; + case 3: + delta = blk->xMin - xMax; + break; + } + return delta; +} + +GBool TextBlock::isBelow(TextBlock *blk) { + GBool below; + + below = gFalse; // make gcc happy + switch (page->primaryRot) { + case 0: + below = xMin >= blk->priMin && xMax <= blk->priMax && + yMin > blk->yMin; + break; + case 1: + below = yMin >= blk->priMin && yMax <= blk->priMax && + xMax < blk->xMax; + break; + case 2: + below = xMin >= blk->priMin && xMax <= blk->priMax && + yMax < blk->yMax; + break; + case 3: + below = yMin >= blk->priMin && yMax <= blk->priMax && + xMin > blk->xMin; + break; + } + + return below; +} + +//------------------------------------------------------------------------ +// TextFlow +//------------------------------------------------------------------------ + +TextFlow::TextFlow(TextPage *pageA, TextBlock *blk) { + page = pageA; + xMin = blk->xMin; + xMax = blk->xMax; + yMin = blk->yMin; + yMax = blk->yMax; + priMin = blk->priMin; + priMax = blk->priMax; + blocks = lastBlk = blk; + next = NULL; +} + +TextFlow::~TextFlow() { + TextBlock *blk; + + while (blocks) { + blk = blocks; + blocks = blocks->next; + delete blk; + } +} + +void TextFlow::addBlock(TextBlock *blk) { + if (lastBlk) { + lastBlk->next = blk; + } else { + blocks = blk; + } + lastBlk = blk; + if (blk->xMin < xMin) { + xMin = blk->xMin; + } + if (blk->xMax > xMax) { + xMax = blk->xMax; + } + if (blk->yMin < yMin) { + yMin = blk->yMin; + } + if (blk->yMax > yMax) { + yMax = blk->yMax; + } +} + +GBool TextFlow::blockFits(TextBlock *blk, TextBlock *prevBlk) { + GBool fits; + + // lower blocks must use smaller fonts + if (blk->lines->words->fontSize > lastBlk->lines->words->fontSize) { + return gFalse; + } + + fits = gFalse; // make gcc happy + switch (page->primaryRot) { + case 0: + fits = blk->xMin >= priMin && blk->xMax <= priMax; + break; + case 1: + fits = blk->yMin >= priMin && blk->yMax <= priMax; + break; + case 2: + fits = blk->xMin >= priMin && blk->xMax <= priMax; + break; + case 3: + fits = blk->yMin >= priMin && blk->yMax <= priMax; + break; + } + return fits; +} + +#if TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextWordList +//------------------------------------------------------------------------ + +TextWordList::TextWordList(TextPage *text, GBool physLayout) { + TextFlow *flow; + TextBlock *blk; + TextLine *line; + TextWord *word; + TextWord **wordArray; + int nWords, i; + + words = new GList(); + + if (text->rawOrder) { + for (word = text->rawWords; word; word = word->next) { + words->append(word); + } + + } else if (physLayout) { + // this is inefficient, but it's also the least useful of these + // three cases + nWords = 0; + for (flow = text->flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + ++nWords; + } + } + } + } + wordArray = (TextWord **)gmallocn(nWords, sizeof(TextWord *)); + i = 0; + for (flow = text->flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + wordArray[i++] = word; + } + } + } + } + qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX); + for (i = 0; i < nWords; ++i) { + words->append(wordArray[i]); + } + gfree(wordArray); + + } else { + for (flow = text->flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + words->append(word); + } + } + } + } + } +} + +TextWordList::~TextWordList() { + delete words; +} + +int TextWordList::getLength() { + return words->getLength(); +} + +TextWord *TextWordList::get(int idx) { + if (idx < 0 || idx >= words->getLength()) { + return NULL; + } + return (TextWord *)words->get(idx); +} + +#endif // TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextPage +//------------------------------------------------------------------------ + +TextPage::TextPage(GBool rawOrderA) { + int rot; + + rawOrder = rawOrderA; + curWord = NULL; + charPos = 0; + curFont = NULL; + curFontSize = 0; + nest = 0; + nTinyChars = 0; + lastCharOverlap = gFalse; + if (!rawOrder) { + for (rot = 0; rot < 4; ++rot) { + pools[rot] = new TextPool(); + } + } + flows = NULL; + blocks = NULL; + rawWords = NULL; + rawLastWord = NULL; + fonts = new GList(); + lastFindXMin = lastFindYMin = 0; + haveLastFind = gFalse; + underlines = new GList(); + links = new GList(); +} + +TextPage::~TextPage() { + int rot; + + clear(); + if (!rawOrder) { + for (rot = 0; rot < 4; ++rot) { + delete pools[rot]; + } + } + delete fonts; + deleteGList(underlines, TextUnderline); + deleteGList(links, TextLink); +} + +void TextPage::startPage(GfxState *state) { + clear(); + if (state) { + pageWidth = state->getPageWidth(); + pageHeight = state->getPageHeight(); + } else { + pageWidth = pageHeight = 0; + } +} + +void TextPage::endPage() { + if (curWord) { + endWord(); + } +} + +void TextPage::clear() { + int rot; + TextFlow *flow; + TextWord *word; + + if (curWord) { + delete curWord; + curWord = NULL; + } + if (rawOrder) { + while (rawWords) { + word = rawWords; + rawWords = rawWords->next; + delete word; + } + } else { + for (rot = 0; rot < 4; ++rot) { + delete pools[rot]; + } + while (flows) { + flow = flows; + flows = flows->next; + delete flow; + } + gfree(blocks); + } + deleteGList(fonts, TextFontInfo); + + curWord = NULL; + charPos = 0; + curFont = NULL; + curFontSize = 0; + nest = 0; + nTinyChars = 0; + if (!rawOrder) { + for (rot = 0; rot < 4; ++rot) { + pools[rot] = new TextPool(); + } + } + flows = NULL; + blocks = NULL; + rawWords = NULL; + rawLastWord = NULL; + fonts = new GList(); +} + +void TextPage::updateFont(GfxState *state) { + GfxFont *gfxFont; + double *fm; + char *name; + int code, mCode, letterCode, anyCode; + double w; + int i; + + // get the font info object + curFont = NULL; + for (i = 0; i < fonts->getLength(); ++i) { + curFont = (TextFontInfo *)fonts->get(i); + if (curFont->matches(state)) { + break; + } + curFont = NULL; + } + if (!curFont) { + curFont = new TextFontInfo(state); + fonts->append(curFont); + } + + // adjust the font size + gfxFont = state->getFont(); + curFontSize = state->getTransformedFontSize(); + if (gfxFont && gfxFont->getType() == fontType3) { + // This is a hack which makes it possible to deal with some Type 3 + // fonts. The problem is that it's impossible to know what the + // base coordinate system used in the font is without actually + // rendering the font. This code tries to guess by looking at the + // width of the character 'm' (which breaks if the font is a + // subset that doesn't contain 'm'). + mCode = letterCode = anyCode = -1; + for (code = 0; code < 256; ++code) { + name = ((Gfx8BitFont *)gfxFont)->getCharName(code); + if (name && name[0] == 'm' && name[1] == '\0') { + mCode = code; + } + if (letterCode < 0 && name && name[1] == '\0' && + ((name[0] >= 'A' && name[0] <= 'Z') || + (name[0] >= 'a' && name[0] <= 'z'))) { + letterCode = code; + } + if (anyCode < 0 && name && + ((Gfx8BitFont *)gfxFont)->getWidth(code) > 0) { + anyCode = code; + } + } + if (mCode >= 0 && + (w = ((Gfx8BitFont *)gfxFont)->getWidth(mCode)) > 0) { + // 0.6 is a generic average 'm' width -- yes, this is a hack + curFontSize *= w / 0.6; + } else if (letterCode >= 0 && + (w = ((Gfx8BitFont *)gfxFont)->getWidth(letterCode)) > 0) { + // even more of a hack: 0.5 is a generic letter width + curFontSize *= w / 0.5; + } else if (anyCode >= 0 && + (w = ((Gfx8BitFont *)gfxFont)->getWidth(anyCode)) > 0) { + // better than nothing: 0.5 is a generic character width + curFontSize *= w / 0.5; + } + fm = gfxFont->getFontMatrix(); + if (fm[0] != 0) { + curFontSize *= fabs(fm[3] / fm[0]); + } + } +} + +void TextPage::beginWord(GfxState *state, double x0, double y0) { + double *fontm; + double m[4], m2[4]; + int rot; + + // This check is needed because Type 3 characters can contain + // text-drawing operations (when TextPage is being used via + // {X,Win}SplashOutputDev rather than TextOutputDev). + if (curWord) { + ++nest; + return; + } + + // compute the rotation + state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]); + if (state->getFont()->getType() == fontType3) { + fontm = state->getFont()->getFontMatrix(); + m2[0] = fontm[0] * m[0] + fontm[1] * m[2]; + m2[1] = fontm[0] * m[1] + fontm[1] * m[3]; + m2[2] = fontm[2] * m[0] + fontm[3] * m[2]; + m2[3] = fontm[2] * m[1] + fontm[3] * m[3]; + m[0] = m2[0]; + m[1] = m2[1]; + m[2] = m2[2]; + m[3] = m2[3]; + } + if (fabs(m[0] * m[3]) > fabs(m[1] * m[2])) { + rot = (m[3] < 0) ? 0 : 2; + } else { + rot = (m[2] > 0) ? 1 : 3; + } + + curWord = new TextWord(state, rot, x0, y0, charPos, curFont, curFontSize); +} + +void TextPage::addChar(GfxState *state, double x, double y, + double dx, double dy, + CharCode c, int nBytes, Unicode *u, int uLen) { + double x1, y1, w1, h1, dx2, dy2, base, sp, delta; + GBool overlap; + int i; + + // subtract char and word spacing from the dx,dy values + sp = state->getCharSpace(); + if (c == (CharCode)0x20) { + sp += state->getWordSpace(); + } + state->textTransformDelta(sp * state->getHorizScaling(), 0, &dx2, &dy2); + dx -= dx2; + dy -= dy2; + state->transformDelta(dx, dy, &w1, &h1); + + // throw away chars that aren't inside the page bounds + // (and also do a sanity check on the character size) + state->transform(x, y, &x1, &y1); + if (x1 + w1 < 0 || x1 > pageWidth || + y1 + h1 < 0 || y1 > pageHeight || + w1 > pageWidth || h1 > pageHeight) { + charPos += nBytes; + return; + } + + // check the tiny chars limit + if (!globalParams->getTextKeepTinyChars() && + fabs(w1) < 3 && fabs(h1) < 3) { + if (++nTinyChars > 50000) { + charPos += nBytes; + return; + } + } + + // break words at space character + if (uLen == 1 && u[0] == (Unicode)0x20) { + if (curWord) { + ++curWord->charLen; + } + charPos += nBytes; + endWord(); + return; + } + + // start a new word if: + // (1) this character doesn't fall in the right place relative to + // the end of the previous word (this places upper and lower + // constraints on the position deltas along both the primary + // and secondary axes), or + // (2) this character overlaps the previous one (duplicated text), or + // (3) the previous character was an overlap (we want each duplicated + // character to be in a word by itself at this stage), + // (4) the font size has changed + if (curWord && curWord->len > 0) { + base = sp = delta = 0; // make gcc happy + switch (curWord->rot) { + case 0: + base = y1; + sp = x1 - curWord->xMax; + delta = x1 - curWord->edge[curWord->len - 1]; + break; + case 1: + base = x1; + sp = y1 - curWord->yMax; + delta = y1 - curWord->edge[curWord->len - 1]; + break; + case 2: + base = y1; + sp = curWord->xMin - x1; + delta = curWord->edge[curWord->len - 1] - x1; + break; + case 3: + base = x1; + sp = curWord->yMin - y1; + delta = curWord->edge[curWord->len - 1] - y1; + break; + } + overlap = fabs(delta) < dupMaxPriDelta * curWord->fontSize && + fabs(base - curWord->base) < dupMaxSecDelta * curWord->fontSize; + if (overlap || lastCharOverlap || + sp < -minDupBreakOverlap * curWord->fontSize || + sp > minWordBreakSpace * curWord->fontSize || + fabs(base - curWord->base) > 0.5 || + curFontSize != curWord->fontSize) { + endWord(); + } + lastCharOverlap = overlap; + } else { + lastCharOverlap = gFalse; + } + + if (uLen != 0) { + // start a new word if needed + if (!curWord) { + beginWord(state, x, y); + } + + // page rotation and/or transform matrices can cause text to be + // drawn in reverse order -- in this case, swap the begin/end + // coordinates and break text into individual chars + if ((curWord->rot == 0 && w1 < 0) || + (curWord->rot == 1 && h1 < 0) || + (curWord->rot == 2 && w1 > 0) || + (curWord->rot == 3 && h1 > 0)) { + endWord(); + beginWord(state, x + dx, y + dy); + x1 += w1; + y1 += h1; + w1 = -w1; + h1 = -h1; + } + + // add the characters to the current word + w1 /= uLen; + h1 /= uLen; + for (i = 0; i < uLen; ++i) { + curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u[i]); + } + } + if (curWord) { + curWord->charLen += nBytes; + } + charPos += nBytes; +} + +void TextPage::endWord() { + // This check is needed because Type 3 characters can contain + // text-drawing operations (when TextPage is being used via + // {X,Win}SplashOutputDev rather than TextOutputDev). + if (nest > 0) { + --nest; + return; + } + + if (curWord) { + addWord(curWord); + curWord = NULL; + } +} + +void TextPage::addWord(TextWord *word) { + // throw away zero-length words -- they don't have valid xMin/xMax + // values, and they're useless anyway + if (word->len == 0) { + delete word; + return; + } + + if (rawOrder) { + if (rawLastWord) { + rawLastWord->next = word; + } else { + rawWords = word; + } + rawLastWord = word; + } else { + pools[word->rot]->addWord(word); + } +} + +void TextPage::addUnderline(double x0, double y0, double x1, double y1) { + underlines->append(new TextUnderline(x0, y0, x1, y1)); +} + +void TextPage::addLink(int xMin, int yMin, int xMax, int yMax, Link *link) { + links->append(new TextLink(xMin, yMin, xMax, yMax, link)); +} + +void TextPage::coalesce(GBool physLayout, GBool doHTML) { + UnicodeMap *uMap; + TextPool *pool; + TextWord *word0, *word1, *word2; + TextLine *line; + TextBlock *blkList, *blkStack, *blk, *lastBlk, *blk0, *blk1; + TextBlock **blkArray; + TextFlow *flow, *lastFlow; + TextUnderline *underline; + TextLink *link; + int rot, poolMinBaseIdx, baseIdx, startBaseIdx, endBaseIdx; + double minBase, maxBase, newMinBase, newMaxBase; + double fontSize, colSpace1, colSpace2, lineSpace, intraLineSpace, blkSpace; + GBool found; + int count[4]; + int lrCount; + int firstBlkIdx, nBlocksLeft; + int col1, col2; + int i, j, n; + + if (rawOrder) { + primaryRot = 0; + primaryLR = gTrue; + return; + } + + uMap = globalParams->getTextEncoding(); + blkList = NULL; + lastBlk = NULL; + nBlocks = 0; + primaryRot = -1; + +#if 0 // for debugging + printf("*** initial words ***\n"); + for (rot = 0; rot < 4; ++rot) { + pool = pools[rot]; + for (baseIdx = pool->minBaseIdx; baseIdx <= pool->maxBaseIdx; ++baseIdx) { + for (word0 = pool->getPool(baseIdx); word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f rot=%d link=%p '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, rot*90, word0->link); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + +#if 0 //~ for debugging + for (i = 0; i < underlines->getLength(); ++i) { + underline = (TextUnderline *)underlines->get(i); + printf("underline: x=%g..%g y=%g..%g horiz=%d\n", + underline->x0, underline->x1, underline->y0, underline->y1, + underline->horiz); + } +#endif + + if (doHTML) { + + //----- handle underlining + for (i = 0; i < underlines->getLength(); ++i) { + underline = (TextUnderline *)underlines->get(i); + if (underline->horiz) { + // rot = 0 + if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { + startBaseIdx = pools[0]->getBaseIdx(underline->y0 + minUnderlineGap); + endBaseIdx = pools[0]->getBaseIdx(underline->y0 + maxUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) { + //~ need to check the y value against the word baseline + if (underline->x0 < word0->xMin + underlineSlack && + word0->xMax - underlineSlack < underline->x1) { + word0->underlined = gTrue; + } + } + } + } + + // rot = 2 + if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) { + startBaseIdx = pools[2]->getBaseIdx(underline->y0 - maxUnderlineGap); + endBaseIdx = pools[2]->getBaseIdx(underline->y0 - minUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) { + if (underline->x0 < word0->xMin + underlineSlack && + word0->xMax - underlineSlack < underline->x1) { + word0->underlined = gTrue; + } + } + } + } + } else { + // rot = 1 + if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) { + startBaseIdx = pools[1]->getBaseIdx(underline->x0 - maxUnderlineGap); + endBaseIdx = pools[1]->getBaseIdx(underline->x0 - minUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) { + if (underline->y0 < word0->yMin + underlineSlack && + word0->yMax - underlineSlack < underline->y1) { + word0->underlined = gTrue; + } + } + } + } + + // rot = 3 + if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) { + startBaseIdx = pools[3]->getBaseIdx(underline->x0 + minUnderlineGap); + endBaseIdx = pools[3]->getBaseIdx(underline->x0 + maxUnderlineGap); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) { + if (underline->y0 < word0->yMin + underlineSlack && + word0->yMax - underlineSlack < underline->y1) { + word0->underlined = gTrue; + } + } + } + } + } + } + + //----- handle links + for (i = 0; i < links->getLength(); ++i) { + link = (TextLink *)links->get(i); + + // rot = 0 + if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { + startBaseIdx = pools[0]->getBaseIdx(link->yMin); + endBaseIdx = pools[0]->getBaseIdx(link->yMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) { + if (link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax && + link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax) { + word0->link = link->link; + } + } + } + } + + // rot = 2 + if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) { + startBaseIdx = pools[2]->getBaseIdx(link->yMin); + endBaseIdx = pools[2]->getBaseIdx(link->yMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) { + if (link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax && + link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax) { + word0->link = link->link; + } + } + } + } + + // rot = 1 + if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) { + startBaseIdx = pools[1]->getBaseIdx(link->xMin); + endBaseIdx = pools[1]->getBaseIdx(link->xMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) { + if (link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax && + link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax) { + word0->link = link->link; + } + } + } + } + + // rot = 3 + if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) { + startBaseIdx = pools[3]->getBaseIdx(link->xMin); + endBaseIdx = pools[3]->getBaseIdx(link->xMax); + for (j = startBaseIdx; j <= endBaseIdx; ++j) { + for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) { + if (link->yMin < word0->yMin + hyperlinkSlack && + word0->yMax - hyperlinkSlack < link->yMax && + link->xMin < word0->xMin + hyperlinkSlack && + word0->xMax - hyperlinkSlack < link->xMax) { + word0->link = link->link; + } + } + } + } + } + } + + //----- assemble the blocks + + //~ add an outer loop for writing mode (vertical text) + + // build blocks for each rotation value + for (rot = 0; rot < 4; ++rot) { + pool = pools[rot]; + poolMinBaseIdx = pool->minBaseIdx; + count[rot] = 0; + + // add blocks until no more words are left + while (1) { + + // find the first non-empty line in the pool + for (; + poolMinBaseIdx <= pool->maxBaseIdx && + !pool->getPool(poolMinBaseIdx); + ++poolMinBaseIdx) ; + if (poolMinBaseIdx > pool->maxBaseIdx) { + break; + } + + // look for the left-most word in the first four lines of the + // pool -- this avoids starting with a superscript word + startBaseIdx = poolMinBaseIdx; + for (baseIdx = poolMinBaseIdx + 1; + baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx; + ++baseIdx) { + if (!pool->getPool(baseIdx)) { + continue; + } + if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx)) + < 0) { + startBaseIdx = baseIdx; + } + } + + // create a new block + word0 = pool->getPool(startBaseIdx); + pool->setPool(startBaseIdx, word0->next); + word0->next = NULL; + blk = new TextBlock(this, rot); + blk->addWord(word0); + + fontSize = word0->fontSize; + minBase = maxBase = word0->base; + colSpace1 = minColSpacing1 * fontSize; + colSpace2 = minColSpacing2 * fontSize; + lineSpace = maxLineSpacingDelta * fontSize; + intraLineSpace = maxIntraLineDelta * fontSize; + + // add words to the block + do { + found = gFalse; + + // look for words on the line above the current top edge of + // the block + newMinBase = minBase; + for (baseIdx = pool->getBaseIdx(minBase); + baseIdx >= pool->getBaseIdx(minBase - lineSpace); + --baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base < minBase && + word1->base >= minBase - lineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin) + : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta1 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + found = gTrue; + newMinBase = word2->base; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + minBase = newMinBase; + + // look for words on the line below the current bottom edge of + // the block + newMaxBase = maxBase; + for (baseIdx = pool->getBaseIdx(maxBase); + baseIdx <= pool->getBaseIdx(maxBase + lineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base > maxBase && + word1->base <= maxBase + lineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin) + : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta1 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + found = gTrue; + newMaxBase = word2->base; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + maxBase = newMaxBase; + + // look for words that are on lines already in the block, and + // that overlap the block horizontally + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin < blk->xMax + colSpace1 && + word1->xMax > blk->xMin - colSpace1) + : (word1->yMin < blk->yMax + colSpace1 && + word1->yMax > blk->yMin - colSpace1)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta2 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + found = gTrue; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + + // only check for outlying words (the next two chunks of code) + // if we didn't find anything else + if (found) { + continue; + } + + // scan down the left side of the block, looking for words + // that are near (but not overlapping) the block; if there are + // three or fewer, add them to the block + n = 0; + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMax <= blk->xMin && + word1->xMax > blk->xMin - colSpace2) + : (word1->yMax <= blk->yMin && + word1->yMax > blk->yMin - colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + ++n; + break; + } + word1 = word1->next; + } + } + if (n > 0 && n <= 3) { + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMax <= blk->xMin && + word1->xMax > blk->xMin - colSpace2) + : (word1->yMax <= blk->yMin && + word1->yMax > blk->yMin - colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + if (word2->base < minBase) { + minBase = word2->base; + } else if (word2->base > maxBase) { + maxBase = word2->base; + } + found = gTrue; + break; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + } + + // scan down the right side of the block, looking for words + // that are near (but not overlapping) the block; if there are + // three or fewer, add them to the block + n = 0; + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin >= blk->xMax && + word1->xMin < blk->xMax + colSpace2) + : (word1->yMin >= blk->yMax && + word1->yMin < blk->yMax + colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + ++n; + break; + } + word1 = word1->next; + } + } + if (n > 0 && n <= 3) { + for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); + baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); + ++baseIdx) { + word0 = NULL; + word1 = pool->getPool(baseIdx); + while (word1) { + if (word1->base >= minBase - intraLineSpace && + word1->base <= maxBase + intraLineSpace && + ((rot == 0 || rot == 2) + ? (word1->xMin >= blk->xMax && + word1->xMin < blk->xMax + colSpace2) + : (word1->yMin >= blk->yMax && + word1->yMin < blk->yMax + colSpace2)) && + fabs(word1->fontSize - fontSize) < + maxBlockFontSizeDelta3 * fontSize) { + word2 = word1; + if (word0) { + word0->next = word1->next; + } else { + pool->setPool(baseIdx, word1->next); + } + word1 = word1->next; + word2->next = NULL; + blk->addWord(word2); + if (word2->base < minBase) { + minBase = word2->base; + } else if (word2->base > maxBase) { + maxBase = word2->base; + } + found = gTrue; + break; + } else { + word0 = word1; + word1 = word1->next; + } + } + } + } + + } while (found); + + //~ need to compute the primary writing mode (horiz/vert) in + //~ addition to primary rotation + + // coalesce the block, and add it to the list + blk->coalesce(uMap); + if (lastBlk) { + lastBlk->next = blk; + } else { + blkList = blk; + } + lastBlk = blk; + count[rot] += blk->charCount; + if (primaryRot < 0 || count[rot] > count[primaryRot]) { + primaryRot = rot; + } + ++nBlocks; + } + } + +#if 0 // for debugging + printf("*** rotation ***\n"); + for (rot = 0; rot < 4; ++rot) { + printf(" %d: %6d\n", rot, count[rot]); + } + printf(" primary rot = %d\n", primaryRot); + printf("\n"); +#endif + +#if 0 // for debugging + printf("*** blocks ***\n"); + for (blk = blkList; blk; blk = blk->next) { + printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax); + for (line = blk->lines; line; line = line->next) { + printf(" line: x=%.2f..%.2f y=%.2f..%.2f base=%.2f\n", + line->xMin, line->xMax, line->yMin, line->yMax, line->base); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + + // determine the primary direction + lrCount = 0; + for (blk = blkList; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + for (word0 = line->words; word0; word0 = word0->next) { + for (i = 0; i < word0->len; ++i) { + if (unicodeTypeL(word0->text[i])) { + ++lrCount; + } else if (unicodeTypeR(word0->text[i])) { + --lrCount; + } + } + } + } + } + primaryLR = lrCount >= 0; + +#if 0 // for debugging + printf("*** direction ***\n"); + printf("lrCount = %d\n", lrCount); + printf("primaryLR = %d\n", primaryLR); +#endif + + //----- column assignment + + // sort blocks into xy order for column assignment + blocks = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *)); + for (blk = blkList, i = 0; blk; blk = blk->next, ++i) { + blocks[i] = blk; + } + qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot); + + // column assignment + for (i = 0; i < nBlocks; ++i) { + blk0 = blocks[i]; + col1 = 0; + for (j = 0; j < i; ++j) { + blk1 = blocks[j]; + col2 = 0; // make gcc happy + switch (primaryRot) { + case 0: + if (blk0->xMin > blk1->xMax) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->xMax == blk1->xMin) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->xMin - blk1->xMin) / + (blk1->xMax - blk1->xMin)) * + blk1->nColumns); + } + break; + case 1: + if (blk0->yMin > blk1->yMax) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->yMax == blk1->yMin) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->yMin - blk1->yMin) / + (blk1->yMax - blk1->yMin)) * + blk1->nColumns); + } + break; + case 2: + if (blk0->xMax < blk1->xMin) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->xMin == blk1->xMax) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->xMax - blk1->xMax) / + (blk1->xMin - blk1->xMax)) * + blk1->nColumns); + } + break; + case 3: + if (blk0->yMax < blk1->yMin) { + col2 = blk1->col + blk1->nColumns + 3; + } else if (blk1->yMin == blk1->yMax) { + col2 = blk1->col; + } else { + col2 = blk1->col + (int)(((blk0->yMax - blk1->yMax) / + (blk1->yMin - blk1->yMax)) * + blk1->nColumns); + } + break; + } + if (col2 > col1) { + col1 = col2; + } + } + blk0->col = col1; + for (line = blk0->lines; line; line = line->next) { + for (j = 0; j <= line->len; ++j) { + line->col[j] += col1; + } + } + } + +#if 0 // for debugging + printf("*** blocks, after column assignment ***\n"); + for (blk = blkList; blk; blk = blk->next) { + printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f col=%d nCols=%d\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, blk->col, + blk->nColumns); + for (line = blk->lines; line; line = line->next) { + printf(" line:\n"); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + + //----- reading order sort + + // sort blocks into yx order (in preparation for reading order sort) + qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpYXPrimaryRot); + + // compute space on left and right sides of each block + for (i = 0; i < nBlocks; ++i) { + blk0 = blocks[i]; + for (j = 0; j < nBlocks; ++j) { + blk1 = blocks[j]; + if (blk1 != blk0) { + blk0->updatePriMinMax(blk1); + } + } + } + +#if 0 // for debugging + printf("*** blocks, after yx sort ***\n"); + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f space=%.2f..%.2f\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, + blk->priMin, blk->priMax); + for (line = blk->lines; line; line = line->next) { + printf(" line:\n"); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (j = 0; j < word0->len; ++j) { + fputc(word0->text[j] & 0xff, stdout); + } + printf("'\n"); + } + } + } + printf("\n"); +#endif + + // build the flows + //~ this needs to be adjusted for writing mode (vertical text) + //~ this also needs to account for right-to-left column ordering + blkArray = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *)); + memcpy(blkArray, blocks, nBlocks * sizeof(TextBlock *)); + flows = lastFlow = NULL; + firstBlkIdx = 0; + nBlocksLeft = nBlocks; + while (nBlocksLeft > 0) { + + // find the upper-left-most block + for (; !blkArray[firstBlkIdx]; ++firstBlkIdx) ; + i = firstBlkIdx; + blk = blkArray[i]; + for (j = firstBlkIdx + 1; j < nBlocks; ++j) { + blk1 = blkArray[j]; + if (blk1) { + if (blk && blk->secondaryDelta(blk1) > 0) { + break; + } + if (blk1->primaryCmp(blk) < 0) { + i = j; + blk = blk1; + } + } + } + blkArray[i] = NULL; + --nBlocksLeft; + blk->next = NULL; + + // create a new flow, starting with the upper-left-most block + flow = new TextFlow(this, blk); + if (lastFlow) { + lastFlow->next = flow; + } else { + flows = flow; + } + lastFlow = flow; + fontSize = blk->lines->words->fontSize; + + // push the upper-left-most block on the stack + blk->stackNext = NULL; + blkStack = blk; + + // find the other blocks in this flow + while (blkStack) { + + // find the upper-left-most block under (but within + // maxBlockSpacing of) the top block on the stack + blkSpace = maxBlockSpacing * blkStack->lines->words->fontSize; + blk = NULL; + i = -1; + for (j = firstBlkIdx; j < nBlocks; ++j) { + blk1 = blkArray[j]; + if (blk1) { + if (blkStack->secondaryDelta(blk1) > blkSpace) { + break; + } + if (blk && blk->secondaryDelta(blk1) > 0) { + break; + } + if (blk1->isBelow(blkStack) && + (!blk || blk1->primaryCmp(blk) < 0)) { + i = j; + blk = blk1; + } + } + } + + // if a suitable block was found, add it to the flow and push it + // onto the stack + if (blk && flow->blockFits(blk, blkStack)) { + blkArray[i] = NULL; + --nBlocksLeft; + blk->next = NULL; + flow->addBlock(blk); + fontSize = blk->lines->words->fontSize; + blk->stackNext = blkStack; + blkStack = blk; + + // otherwise (if there is no block under the top block or the + // block is not suitable), pop the stack + } else { + blkStack = blkStack->stackNext; + } + } + } + gfree(blkArray); + +#if 0 // for debugging + printf("*** flows ***\n"); + for (flow = flows; flow; flow = flow->next) { + printf("flow: x=%.2f..%.2f y=%.2f..%.2f pri:%.2f..%.2f\n", + flow->xMin, flow->xMax, flow->yMin, flow->yMax, + flow->priMin, flow->priMax); + for (blk = flow->blocks; blk; blk = blk->next) { + printf(" block: rot=%d x=%.2f..%.2f y=%.2f..%.2f pri=%.2f..%.2f\n", + blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, + blk->priMin, blk->priMax); + for (line = blk->lines; line; line = line->next) { + printf(" line:\n"); + for (word0 = line->words; word0; word0 = word0->next) { + printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", + word0->xMin, word0->xMax, word0->yMin, word0->yMax, + word0->base, word0->fontSize, word0->spaceAfter); + for (i = 0; i < word0->len; ++i) { + fputc(word0->text[i] & 0xff, stdout); + } + printf("'\n"); + } + } + } + } + printf("\n"); +#endif + + if (uMap) { + uMap->decRefCnt(); + } +} + +GBool TextPage::findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + double *xMin, double *yMin, + double *xMax, double *yMax) { + TextBlock *blk; + TextLine *line; + Unicode *s2, *txt; + Unicode *p; + int txtSize, m, i, j, k; + double xStart, yStart, xStop, yStop; + double xMin0, yMin0, xMax0, yMax0; + double xMin1, yMin1, xMax1, yMax1; + GBool found; + + //~ needs to handle right-to-left text + + if (rawOrder) { + return gFalse; + } + + // convert the search string to uppercase + if (!caseSensitive) { + s2 = (Unicode *)gmallocn(len, sizeof(Unicode)); + for (i = 0; i < len; ++i) { + s2[i] = unicodeToUpper(s[i]); + } + } else { + s2 = s; + } + + txt = NULL; + txtSize = 0; + + xStart = yStart = xStop = yStop = 0; + if (startAtLast && haveLastFind) { + xStart = lastFindXMin; + yStart = lastFindYMin; + } else if (!startAtTop) { + xStart = *xMin; + yStart = *yMin; + } + if (stopAtLast && haveLastFind) { + xStop = lastFindXMin; + yStop = lastFindYMin; + } else if (!stopAtBottom) { + xStop = *xMax; + yStop = *yMax; + } + + found = gFalse; + xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy + xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy + + for (i = backward ? nBlocks - 1 : 0; + backward ? i >= 0 : i < nBlocks; + i += backward ? -1 : 1) { + blk = blocks[i]; + + // check: is the block above the top limit? + if (!startAtTop && (backward ? blk->yMin > yStart : blk->yMax < yStart)) { + continue; + } + + // check: is the block below the bottom limit? + if (!stopAtBottom && (backward ? blk->yMax < yStop : blk->yMin > yStop)) { + break; + } + + for (line = blk->lines; line; line = line->next) { + + // check: is the line above the top limit? + if (!startAtTop && + (backward ? line->yMin > yStart : line->yMin < yStart)) { + continue; + } + + // check: is the line below the bottom limit? + if (!stopAtBottom && + (backward ? line->yMin < yStop : line->yMin > yStop)) { + continue; + } + + // convert the line to uppercase + m = line->len; + if (!caseSensitive) { + if (m > txtSize) { + txt = (Unicode *)greallocn(txt, m, sizeof(Unicode)); + txtSize = m; + } + for (k = 0; k < m; ++k) { + txt[k] = unicodeToUpper(line->text[k]); + } + } else { + txt = line->text; + } + + // search each position in this line + j = backward ? m - len : 0; + p = txt + j; + while (backward ? j >= 0 : j <= m - len) { + + // compare the strings + for (k = 0; k < len; ++k) { + if (p[k] != s2[k]) { + break; + } + } + + // found it + if (k == len) { + switch (line->rot) { + case 0: + xMin1 = line->edge[j]; + xMax1 = line->edge[j + len]; + yMin1 = line->yMin; + yMax1 = line->yMax; + break; + case 1: + xMin1 = line->xMin; + xMax1 = line->xMax; + yMin1 = line->edge[j]; + yMax1 = line->edge[j + len]; + break; + case 2: + xMin1 = line->edge[j + len]; + xMax1 = line->edge[j]; + yMin1 = line->yMin; + yMax1 = line->yMax; + break; + case 3: + xMin1 = line->xMin; + xMax1 = line->xMax; + yMin1 = line->edge[j + len]; + yMax1 = line->edge[j]; + break; + } + if (backward) { + if ((startAtTop || + yMin1 < yStart || (yMin1 == yStart && xMin1 < xStart)) && + (stopAtBottom || + yMin1 > yStop || (yMin1 == yStop && xMin1 > xStop))) { + if (!found || + yMin1 > yMin0 || (yMin1 == yMin0 && xMin1 > xMin0)) { + xMin0 = xMin1; + xMax0 = xMax1; + yMin0 = yMin1; + yMax0 = yMax1; + found = gTrue; + } + } + } else { + if ((startAtTop || + yMin1 > yStart || (yMin1 == yStart && xMin1 > xStart)) && + (stopAtBottom || + yMin1 < yStop || (yMin1 == yStop && xMin1 < xStop))) { + if (!found || + yMin1 < yMin0 || (yMin1 == yMin0 && xMin1 < xMin0)) { + xMin0 = xMin1; + xMax0 = xMax1; + yMin0 = yMin1; + yMax0 = yMax1; + found = gTrue; + } + } + } + } + if (backward) { + --j; + --p; + } else { + ++j; + ++p; + } + } + } + } + + if (!caseSensitive) { + gfree(s2); + gfree(txt); + } + + if (found) { + *xMin = xMin0; + *xMax = xMax0; + *yMin = yMin0; + *yMax = yMax0; + lastFindXMin = xMin0; + lastFindYMin = yMin0; + haveLastFind = gTrue; + return gTrue; + } + + return gFalse; +} + +GString *TextPage::getText(double xMin, double yMin, + double xMax, double yMax) { + GString *s; + UnicodeMap *uMap; + GBool isUnicode; + TextBlock *blk; + TextLine *line; + TextLineFrag *frags; + int nFrags, fragsSize; + TextLineFrag *frag; + char space[8], eol[16]; + int spaceLen, eolLen; + int lastRot; + double x, y, delta; + int col, idx0, idx1, i, j; + GBool multiLine, oneRot; + + s = new GString(); + + if (rawOrder) { + return s; + } + + // get the output encoding + if (!(uMap = globalParams->getTextEncoding())) { + return s; + } + isUnicode = uMap->isUnicode(); + spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); + eolLen = 0; // make gcc happy + switch (globalParams->getTextEOL()) { + case eolUnix: + eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); + break; + case eolDOS: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen); + break; + case eolMac: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + break; + } + + //~ writing mode (horiz/vert) + + // collect the line fragments that are in the rectangle + fragsSize = 256; + frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); + nFrags = 0; + lastRot = -1; + oneRot = gTrue; + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + if (xMin < blk->xMax && blk->xMin < xMax && + yMin < blk->yMax && blk->yMin < yMax) { + for (line = blk->lines; line; line = line->next) { + if (xMin < line->xMax && line->xMin < xMax && + yMin < line->yMax && line->yMin < yMax) { + idx0 = idx1 = -1; + switch (line->rot) { + case 0: + y = 0.5 * (line->yMin + line->yMax); + if (yMin < y && y < yMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) { + idx1 = j; + break; + } + --j; + } + } + break; + case 1: + x = 0.5 * (line->xMin + line->xMax); + if (xMin < x && x < xMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) { + idx1 = j; + break; + } + --j; + } + } + break; + case 2: + y = 0.5 * (line->yMin + line->yMax); + if (yMin < y && y < yMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) { + idx1 = j; + break; + } + --j; + } + } + break; + case 3: + x = 0.5 * (line->xMin + line->xMax); + if (xMin < x && x < xMax) { + j = 0; + while (j < line->len) { + if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) { + idx0 = j; + break; + } + ++j; + } + j = line->len - 1; + while (j >= 0) { + if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) { + idx1 = j; + break; + } + --j; + } + } + break; + } + if (idx0 >= 0 && idx1 >= 0) { + if (nFrags == fragsSize) { + fragsSize *= 2; + frags = (TextLineFrag *) + greallocn(frags, fragsSize, sizeof(TextLineFrag)); + } + frags[nFrags].init(line, idx0, idx1 - idx0 + 1); + ++nFrags; + if (lastRot >= 0 && line->rot != lastRot) { + oneRot = gFalse; + } + lastRot = line->rot; + } + } + } + } + } + + // sort the fragments and generate the string + if (nFrags > 0) { + + for (i = 0; i < nFrags; ++i) { + frags[i].computeCoords(oneRot); + } + assignColumns(frags, nFrags, oneRot); + + // if all lines in the region have the same rotation, use it; + // otherwise, use the page's primary rotation + if (oneRot) { + qsort(frags, nFrags, sizeof(TextLineFrag), + &TextLineFrag::cmpYXLineRot); + } else { + qsort(frags, nFrags, sizeof(TextLineFrag), + &TextLineFrag::cmpYXPrimaryRot); + } + i = 0; + while (i < nFrags) { + delta = maxIntraLineDelta * frags[i].line->words->fontSize; + for (j = i+1; + j < nFrags && fabs(frags[j].base - frags[i].base) < delta; + ++j) ; + qsort(frags + i, j - i, sizeof(TextLineFrag), + oneRot ? &TextLineFrag::cmpXYColumnLineRot + : &TextLineFrag::cmpXYColumnPrimaryRot); + i = j; + } + + col = 0; + multiLine = gFalse; + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + + // insert a return + if (frag->col < col || + (i > 0 && fabs(frag->base - frags[i-1].base) > + maxIntraLineDelta * frags[i-1].line->words->fontSize)) { + s->append(eol, eolLen); + col = 0; + multiLine = gTrue; + } + + // column alignment + for (; col < frag->col; ++col) { + s->append(space, spaceLen); + } + + // get the fragment text + col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s); + } + + if (multiLine) { + s->append(eol, eolLen); + } + } + + gfree(frags); + uMap->decRefCnt(); + + return s; +} + +GBool TextPage::findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax) { + TextBlock *blk; + TextLine *line; + TextWord *word; + double xMin0, xMax0, yMin0, yMax0; + double xMin1, xMax1, yMin1, yMax1; + GBool first; + int i, j0, j1; + + if (rawOrder) { + return gFalse; + } + + //~ this doesn't correctly handle: + //~ - ranges split across multiple lines (the highlighted region + //~ is the bounding box of all the parts of the range) + //~ - cases where characters don't convert one-to-one into Unicode + first = gTrue; + xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy + xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + for (line = blk->lines; line; line = line->next) { + for (word = line->words; word; word = word->next) { + if (pos < word->charPos + word->charLen && + word->charPos < pos + length) { + j0 = pos - word->charPos; + if (j0 < 0) { + j0 = 0; + } + j1 = pos + length - 1 - word->charPos; + if (j1 >= word->len) { + j1 = word->len - 1; + } + switch (line->rot) { + case 0: + xMin1 = word->edge[j0]; + xMax1 = word->edge[j1 + 1]; + yMin1 = word->yMin; + yMax1 = word->yMax; + break; + case 1: + xMin1 = word->xMin; + xMax1 = word->xMax; + yMin1 = word->edge[j0]; + yMax1 = word->edge[j1 + 1]; + break; + case 2: + xMin1 = word->edge[j1 + 1]; + xMax1 = word->edge[j0]; + yMin1 = word->yMin; + yMax1 = word->yMax; + break; + case 3: + xMin1 = word->xMin; + xMax1 = word->xMax; + yMin1 = word->edge[j1 + 1]; + yMax1 = word->edge[j0]; + break; + } + if (first || xMin1 < xMin0) { + xMin0 = xMin1; + } + if (first || xMax1 > xMax0) { + xMax0 = xMax1; + } + if (first || yMin1 < yMin0) { + yMin0 = yMin1; + } + if (first || yMax1 > yMax0) { + yMax0 = yMax1; + } + first = gFalse; + } + } + } + } + if (!first) { + *xMin = xMin0; + *xMax = xMax0; + *yMin = yMin0; + *yMax = yMax0; + return gTrue; + } + return gFalse; +} + +void TextPage::dump(void *outputStream, TextOutputFunc outputFunc, + GBool physLayout) { + UnicodeMap *uMap; + TextFlow *flow; + TextBlock *blk; + TextLine *line; + TextLineFrag *frags; + TextWord *word; + int nFrags, fragsSize; + TextLineFrag *frag; + char space[8], eol[16], eop[8]; + int spaceLen, eolLen, eopLen; + GBool pageBreaks; + GString *s; + double delta; + int col, i, j, d, n; + + // get the output encoding + if (!(uMap = globalParams->getTextEncoding())) { + return; + } + spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); + eolLen = 0; // make gcc happy + switch (globalParams->getTextEOL()) { + case eolUnix: + eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); + break; + case eolDOS: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen); + break; + case eolMac: + eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); + break; + } + eopLen = uMap->mapUnicode(0x0c, eop, sizeof(eop)); + pageBreaks = globalParams->getTextPageBreaks(); + + //~ writing mode (horiz/vert) + + // output the page in raw (content stream) order + if (rawOrder) { + + for (word = rawWords; word; word = word->next) { + s = new GString(); + dumpFragment(word->text, word->len, uMap, s); + (*outputFunc)(outputStream, s->getCString(), s->getLength()); + delete s; + if (word->next && + fabs(word->next->base - word->base) < + maxIntraLineDelta * word->fontSize) { + if (word->next->xMin > word->xMax + minWordSpacing * word->fontSize) { + (*outputFunc)(outputStream, space, spaceLen); + } + } else { + (*outputFunc)(outputStream, eol, eolLen); + } + } + + // output the page, maintaining the original physical layout + } else if (physLayout) { + + // collect the line fragments for the page and sort them + fragsSize = 256; + frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); + nFrags = 0; + for (i = 0; i < nBlocks; ++i) { + blk = blocks[i]; + for (line = blk->lines; line; line = line->next) { + if (nFrags == fragsSize) { + fragsSize *= 2; + frags = (TextLineFrag *)greallocn(frags, + fragsSize, sizeof(TextLineFrag)); + } + frags[nFrags].init(line, 0, line->len); + frags[nFrags].computeCoords(gTrue); + ++nFrags; + } + } + qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpYXPrimaryRot); + i = 0; + while (i < nFrags) { + delta = maxIntraLineDelta * frags[i].line->words->fontSize; + for (j = i+1; + j < nFrags && fabs(frags[j].base - frags[i].base) < delta; + ++j) ; + qsort(frags + i, j - i, sizeof(TextLineFrag), + &TextLineFrag::cmpXYColumnPrimaryRot); + i = j; + } + +#if 0 // for debugging + printf("*** line fragments ***\n"); + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + printf("frag: x=%.2f..%.2f y=%.2f..%.2f base=%.2f '", + frag->xMin, frag->xMax, frag->yMin, frag->yMax, frag->base); + for (n = 0; n < frag->len; ++n) { + fputc(frag->line->text[frag->start + n] & 0xff, stdout); + } + printf("'\n"); + } + printf("\n"); +#endif + + // generate output + col = 0; + for (i = 0; i < nFrags; ++i) { + frag = &frags[i]; + + // column alignment + for (; col < frag->col; ++col) { + (*outputFunc)(outputStream, space, spaceLen); + } + + // print the line + s = new GString(); + col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s); + (*outputFunc)(outputStream, s->getCString(), s->getLength()); + delete s; + + // print one or more returns if necessary + if (i == nFrags - 1 || + frags[i+1].col < col || + fabs(frags[i+1].base - frag->base) > + maxIntraLineDelta * frag->line->words->fontSize) { + if (i < nFrags - 1) { + d = (int)((frags[i+1].base - frag->base) / + frag->line->words->fontSize); + if (d < 1) { + d = 1; + } else if (d > 5) { + d = 5; + } + } else { + d = 1; + } + for (; d > 0; --d) { + (*outputFunc)(outputStream, eol, eolLen); + } + col = 0; + } + } + + gfree(frags); + + // output the page, "undoing" the layout + } else { + for (flow = flows; flow; flow = flow->next) { + for (blk = flow->blocks; blk; blk = blk->next) { + for (line = blk->lines; line; line = line->next) { + n = line->len; + if (line->hyphenated && (line->next || blk->next)) { + --n; + } + s = new GString(); + dumpFragment(line->text, n, uMap, s); + (*outputFunc)(outputStream, s->getCString(), s->getLength()); + delete s; + if (!line->hyphenated) { + if (line->next) { + (*outputFunc)(outputStream, space, spaceLen); + } else if (blk->next) { + //~ this is a bit of a kludge - we should really do a more + //~ intelligent determination of paragraphs + if (blk->next->lines->words->fontSize == + blk->lines->words->fontSize) { + (*outputFunc)(outputStream, space, spaceLen); + } else { + (*outputFunc)(outputStream, eol, eolLen); + } + } + } + } + } + (*outputFunc)(outputStream, eol, eolLen); + (*outputFunc)(outputStream, eol, eolLen); + } + } + + // end of page + if (pageBreaks) { + (*outputFunc)(outputStream, eop, eopLen); + } + + uMap->decRefCnt(); +} + +void TextPage::assignColumns(TextLineFrag *frags, int nFrags, GBool oneRot) { + TextLineFrag *frag0, *frag1; + int rot, col1, col2, i, j, k; + + // all text in the region has the same rotation -- recompute the + // column numbers based only on the text in the region + if (oneRot) { + qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpXYLineRot); + rot = frags[0].line->rot; + for (i = 0; i < nFrags; ++i) { + frag0 = &frags[i]; + col1 = 0; + for (j = 0; j < i; ++j) { + frag1 = &frags[j]; + col2 = 0; // make gcc happy + switch (rot) { + case 0: + if (frag0->xMin >= frag1->xMax) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->xMin >= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + case 1: + if (frag0->yMin >= frag1->yMax) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->yMin >= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + case 2: + if (frag0->xMax <= frag1->xMin) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->xMax <= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + case 3: + if (frag0->yMax <= frag1->yMin) { + col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - + frag1->line->col[frag1->start]) + 1; + } else { + for (k = frag1->start; + k < frag1->start + frag1->len && + frag0->yMax <= 0.5 * (frag1->line->edge[k] + + frag1->line->edge[k+1]); + ++k) ; + col2 = frag1->col + + frag1->line->col[k] - frag1->line->col[frag1->start]; + } + break; + } + if (col2 > col1) { + col1 = col2; + } + } + frag0->col = col1; + } + + // the region includes text at different rotations -- use the + // globally assigned column numbers, offset by the minimum column + // number (i.e., shift everything over to column 0) + } else { + col1 = frags[0].col; + for (i = 1; i < nFrags; ++i) { + if (frags[i].col < col1) { + col1 = frags[i].col; + } + } + for (i = 0; i < nFrags; ++i) { + frags[i].col -= col1; + } + } +} + +int TextPage::dumpFragment(Unicode *text, int len, UnicodeMap *uMap, + GString *s) { + char lre[8], rle[8], popdf[8], buf[8]; + int lreLen, rleLen, popdfLen, n; + int nCols, i, j, k; + + nCols = 0; + + if (uMap->isUnicode()) { + + lreLen = uMap->mapUnicode(0x202a, lre, sizeof(lre)); + rleLen = uMap->mapUnicode(0x202b, rle, sizeof(rle)); + popdfLen = uMap->mapUnicode(0x202c, popdf, sizeof(popdf)); + + if (primaryLR) { + + i = 0; + while (i < len) { + // output a left-to-right section + for (j = i; j < len && !unicodeTypeR(text[j]); ++j) ; + for (k = i; k < j; ++k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + i = j; + // output a right-to-left section + for (j = i; j < len && !unicodeTypeL(text[j]); ++j) ; + if (j > i) { + s->append(rle, rleLen); + for (k = j - 1; k >= i; --k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + s->append(popdf, popdfLen); + i = j; + } + } + + } else { + + s->append(rle, rleLen); + i = len - 1; + while (i >= 0) { + // output a right-to-left section + for (j = i; j >= 0 && !unicodeTypeL(text[j]); --j) ; + for (k = i; k > j; --k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + i = j; + // output a left-to-right section + for (j = i; j >= 0 && !unicodeTypeR(text[j]); --j) ; + if (j < i) { + s->append(lre, lreLen); + for (k = j + 1; k <= i; ++k) { + n = uMap->mapUnicode(text[k], buf, sizeof(buf)); + s->append(buf, n); + ++nCols; + } + s->append(popdf, popdfLen); + i = j; + } + } + s->append(popdf, popdfLen); + + } + + } else { + for (i = 0; i < len; ++i) { + n = uMap->mapUnicode(text[i], buf, sizeof(buf)); + s->append(buf, n); + nCols += n; + } + } + + return nCols; +} + +#if TEXTOUT_WORD_LIST +TextWordList *TextPage::makeWordList(GBool physLayout) { + return new TextWordList(this, physLayout); +} +#endif + +//------------------------------------------------------------------------ +// TextOutputDev +//------------------------------------------------------------------------ + +static void outputToFile(void *stream, char *text, int len) { + fwrite(text, 1, len, (FILE *)stream); +} + +TextOutputDev::TextOutputDev(char *fileName, GBool physLayoutA, + GBool rawOrderA, GBool append) { + text = NULL; + physLayout = physLayoutA; + rawOrder = rawOrderA; + doHTML = gFalse; + ok = gTrue; + + // open file + needClose = gFalse; + if (fileName) { + if (!strcmp(fileName, "-")) { + outputStream = stdout; +#ifdef WIN32 + // keep DOS from munging the end-of-line characters + setmode(fileno(stdout), O_BINARY); +#endif + } else if ((outputStream = fopen(fileName, append ? "ab" : "wb"))) { + needClose = gTrue; + } else { + error(-1, "Couldn't open text file '%s'", fileName); + ok = gFalse; + return; + } + outputFunc = &outputToFile; + } else { + outputStream = NULL; + } + + // set up text object + text = new TextPage(rawOrderA); +} + +TextOutputDev::TextOutputDev(TextOutputFunc func, void *stream, + GBool physLayoutA, GBool rawOrderA) { + outputFunc = func; + outputStream = stream; + needClose = gFalse; + physLayout = physLayoutA; + rawOrder = rawOrderA; + doHTML = gFalse; + text = new TextPage(rawOrderA); + ok = gTrue; +} + +TextOutputDev::~TextOutputDev() { + if (needClose) { +#ifdef MACOS + ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle); +#endif + fclose((FILE *)outputStream); + } + if (text) { + delete text; + } +} + +void TextOutputDev::startPage(int pageNum, GfxState *state) { + text->startPage(state); +} + +void TextOutputDev::endPage() { + text->endPage(); + text->coalesce(physLayout, doHTML); + if (outputStream) { + text->dump(outputStream, outputFunc, physLayout); + } +} + +void TextOutputDev::updateFont(GfxState *state) { + text->updateFont(state); +} + +void TextOutputDev::beginString(GfxState *state, GString *s) { +} + +void TextOutputDev::endString(GfxState *state) { +} + +void TextOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode c, int nBytes, Unicode *u, int uLen) { + text->addChar(state, x, y, dx, dy, c, nBytes, u, uLen); +} + +void TextOutputDev::stroke(GfxState *state) { + GfxPath *path; + GfxSubpath *subpath; + double x[2], y[2]; + + if (!doHTML) { + return; + } + path = state->getPath(); + if (path->getNumSubpaths() != 1) { + return; + } + subpath = path->getSubpath(0); + if (subpath->getNumPoints() != 2) { + return; + } + state->transform(subpath->getX(0), subpath->getY(0), &x[0], &y[0]); + state->transform(subpath->getX(1), subpath->getY(1), &x[1], &y[1]); + + // look for a vertical or horizontal line + if (x[0] == x[1] || y[0] == y[1]) { + text->addUnderline(x[0], y[0], x[1], y[1]); + } +} + +void TextOutputDev::fill(GfxState *state) { + GfxPath *path; + GfxSubpath *subpath; + double x[5], y[5]; + double rx0, ry0, rx1, ry1, t; + int i; + + if (!doHTML) { + return; + } + path = state->getPath(); + if (path->getNumSubpaths() != 1) { + return; + } + subpath = path->getSubpath(0); + if (subpath->getNumPoints() != 5) { + return; + } + for (i = 0; i < 5; ++i) { + if (subpath->getCurve(i)) { + return; + } + state->transform(subpath->getX(i), subpath->getY(i), &x[i], &y[i]); + } + + // look for a rectangle + if (x[0] == x[1] && y[1] == y[2] && x[2] == x[3] && y[3] == y[4] && + x[0] == x[4] && y[0] == y[4]) { + rx0 = x[0]; + ry0 = y[0]; + rx1 = x[2]; + ry1 = y[1]; + } else if (y[0] == y[1] && x[1] == x[2] && y[2] == y[3] && x[3] == x[4] && + x[0] == x[4] && y[0] == y[4]) { + rx0 = x[0]; + ry0 = y[0]; + rx1 = x[1]; + ry1 = y[2]; + } else { + return; + } + if (rx1 < rx0) { + t = rx0; + rx0 = rx1; + rx1 = t; + } + if (ry1 < ry0) { + t = ry0; + ry0 = ry1; + ry1 = t; + } + + // skinny horizontal rectangle + if (ry1 - ry0 < rx1 - rx0) { + if (ry1 - ry0 < maxUnderlineWidth) { + ry0 = 0.5 * (ry0 + ry1); + text->addUnderline(rx0, ry0, rx1, ry0); + } + + // skinny vertical rectangle + } else { + if (rx1 - rx0 < maxUnderlineWidth) { + rx0 = 0.5 * (rx0 + rx1); + text->addUnderline(rx0, ry0, rx0, ry1); + } + } +} + +void TextOutputDev::eoFill(GfxState *state) { + if (!doHTML) { + return; + } + fill(state); +} + +void TextOutputDev::processLink(Link *link, Catalog *catalog) { + double x1, y1, x2, y2; + int xMin, yMin, xMax, yMax, x, y; + + if (!doHTML) { + return; + } + link->getRect(&x1, &y1, &x2, &y2); + cvtUserToDev(x1, y1, &x, &y); + xMin = xMax = x; + yMin = yMax = y; + cvtUserToDev(x1, y2, &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + cvtUserToDev(x2, y1, &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + cvtUserToDev(x2, y2, &x, &y); + if (x < xMin) { + xMin = x; + } else if (x > xMax) { + xMax = x; + } + if (y < yMin) { + yMin = y; + } else if (y > yMax) { + yMax = y; + } + text->addLink(xMin, yMin, xMax, yMax, link); +} + +GBool TextOutputDev::findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + double *xMin, double *yMin, + double *xMax, double *yMax) { + return text->findText(s, len, startAtTop, stopAtBottom, + startAtLast, stopAtLast, caseSensitive, backward, + xMin, yMin, xMax, yMax); +} + +GString *TextOutputDev::getText(double xMin, double yMin, + double xMax, double yMax) { + return text->getText(xMin, yMin, xMax, yMax); +} + +GBool TextOutputDev::findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax) { + return text->findCharRange(pos, length, xMin, yMin, xMax, yMax); +} + +#if TEXTOUT_WORD_LIST +TextWordList *TextOutputDev::makeWordList() { + return text->makeWordList(physLayout); +} +#endif + +TextPage *TextOutputDev::takeText() { + TextPage *ret; + + ret = text; + text = new TextPage(rawOrder); + return ret; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h new file mode 100644 index 000000000..9d4c29b06 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h @@ -0,0 +1,662 @@ +//======================================================================== +// +// TextOutputDev.h +// +// Copyright 1997-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef TEXTOUTPUTDEV_H +#define TEXTOUTPUTDEV_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include +#include "gtypes.h" +#include "GfxFont.h" +#include "OutputDev.h" + +class GString; +class GList; +class GfxFont; +class GfxState; +class UnicodeMap; +class Link; + +class TextWord; +class TextPool; +class TextLine; +class TextLineFrag; +class TextBlock; +class TextFlow; +class TextWordList; +class TextPage; + +//------------------------------------------------------------------------ + +typedef void (*TextOutputFunc)(void *stream, char *text, int len); + +//------------------------------------------------------------------------ +// TextFontInfo +//------------------------------------------------------------------------ + +class TextFontInfo { +public: + + TextFontInfo(GfxState *state); + ~TextFontInfo(); + + GBool matches(GfxState *state); + +#if TEXTOUT_WORD_LIST + // Get the font name (which may be NULL). + GString *getFontName() { return fontName; } + + // Get font descriptor flags. + GBool isFixedWidth() { return flags & fontFixedWidth; } + GBool isSerif() { return flags & fontSerif; } + GBool isSymbolic() { return flags & fontSymbolic; } + GBool isItalic() { return flags & fontItalic; } + GBool isBold() { return flags & fontBold; } +#endif + +private: + + GfxFont *gfxFont; +#if TEXTOUT_WORD_LIST + GString *fontName; + int flags; +#endif + + friend class TextWord; + friend class TextPage; +}; + +//------------------------------------------------------------------------ +// TextWord +//------------------------------------------------------------------------ + +class TextWord { +public: + + // Constructor. + TextWord(GfxState *state, int rotA, double x0, double y0, + int charPosA, TextFontInfo *fontA, double fontSize); + + // Destructor. + ~TextWord(); + + // Add a character to the word. + void addChar(GfxState *state, double x, double y, + double dx, double dy, Unicode u); + + // Merge onto the end of . + void merge(TextWord *word); + + // Compares to , returning -1 (<), 0 (=), or +1 (>), + // based on a primary-axis comparison, e.g., x ordering if rot=0. + int primaryCmp(TextWord *word); + + // Return the distance along the primary axis between and + // . + double primaryDelta(TextWord *word); + + static int cmpYX(const void *p1, const void *p2); + + // Get the TextFontInfo object associated with this word. + TextFontInfo *getFontInfo() { return font; } + + // Get the next TextWord on the linked list. + TextWord *getNext() { return next; } + +#if TEXTOUT_WORD_LIST + int getLength() { return len; } + Unicode getChar(int idx) { return text[idx]; } + GString *getText(); + GString *getFontName() { return font->fontName; } + void getColor(double *r, double *g, double *b) + { *r = colorR; *g = colorG; *b = colorB; } + void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) + { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } + void getCharBBox(int charIdx, double *xMinA, double *yMinA, + double *xMaxA, double *yMaxA); + double getFontSize() { return fontSize; } + int getRotation() { return rot; } + int getCharPos() { return charPos; } + int getCharLen() { return charLen; } + GBool getSpaceAfter() { return spaceAfter; } +#endif + + GBool isUnderlined() { return underlined; } + Link *getLink() { return link; } + +private: + + int rot; // rotation, multiple of 90 degrees + // (0, 1, 2, or 3) + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double base; // baseline x or y coordinate + Unicode *text; // the text + double *edge; // "near" edge x or y coord of each char + // (plus one extra entry for the last char) + int len; // length of text and edge arrays + int size; // size of text and edge arrays + int charPos; // character position (within content stream) + int charLen; // number of content stream characters in + // this word + TextFontInfo *font; // font information + double fontSize; // font size + GBool spaceAfter; // set if there is a space between this + // word and the next word on the line + TextWord *next; // next word in line + +#if TEXTOUT_WORD_LIST + double colorR, // word color + colorG, + colorB; +#endif + + GBool underlined; + Link *link; + + friend class TextPool; + friend class TextLine; + friend class TextBlock; + friend class TextFlow; + friend class TextWordList; + friend class TextPage; + friend class XMLOutputDev; +}; + +//------------------------------------------------------------------------ +// TextPool +//------------------------------------------------------------------------ + +class TextPool { +public: + + TextPool(); + ~TextPool(); + + TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; } + void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; } + + int getBaseIdx(double base); + + void addWord(TextWord *word); + +private: + + int minBaseIdx; // min baseline bucket index + int maxBaseIdx; // max baseline bucket index + TextWord **pool; // array of linked lists, one for each + // baseline value (multiple of 4 pts) + TextWord *cursor; // pointer to last-accessed word + int cursorBaseIdx; // baseline bucket index of last-accessed word + + friend class TextBlock; + friend class TextPage; +}; + +//------------------------------------------------------------------------ +// TextLine +//------------------------------------------------------------------------ + +class TextLine { +public: + + TextLine(TextBlock *blkA, int rotA, double baseA); + ~TextLine(); + + void addWord(TextWord *word); + + // Return the distance along the primary axis between and + // . + double primaryDelta(TextLine *line); + + // Compares to , returning -1 (<), 0 (=), or +1 (>), + // based on a primary-axis comparison, e.g., x ordering if rot=0. + int primaryCmp(TextLine *line); + + // Compares to , returning -1 (<), 0 (=), or +1 (>), + // based on a secondary-axis comparison of the baselines, e.g., y + // ordering if rot=0. + int secondaryCmp(TextLine *line); + + int cmpYX(TextLine *line); + + static int cmpXY(const void *p1, const void *p2); + + void coalesce(UnicodeMap *uMap); + + // Get the head of the linked list of TextWords. + TextWord *getWords() { return words; } + + // Get the next TextLine on the linked list. + TextLine *getNext() { return next; } + + // Returns true if the last char of the line is a hyphen. + GBool isHyphenated() { return hyphenated; } + +private: + + TextBlock *blk; // parent block + int rot; // text rotation + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double base; // baseline x or y coordinate + TextWord *words; // words in this line + TextWord *lastWord; // last word in this line + Unicode *text; // Unicode text of the line, including + // spaces between words + double *edge; // "near" edge x or y coord of each char + // (plus one extra entry for the last char) + int *col; // starting column number of each Unicode char + int len; // number of Unicode chars + int convertedLen; // total number of converted characters + GBool hyphenated; // set if last char is a hyphen + TextLine *next; // next line in block + + friend class TextLineFrag; + friend class TextBlock; + friend class TextFlow; + friend class TextWordList; + friend class TextPage; +}; + +//------------------------------------------------------------------------ +// TextBlock +//------------------------------------------------------------------------ + +class TextBlock { +public: + + TextBlock(TextPage *pageA, int rotA); + ~TextBlock(); + + void addWord(TextWord *word); + + void coalesce(UnicodeMap *uMap); + + // Update this block's priMin and priMax values, looking at . + void updatePriMinMax(TextBlock *blk); + + static int cmpXYPrimaryRot(const void *p1, const void *p2); + + static int cmpYXPrimaryRot(const void *p1, const void *p2); + + int primaryCmp(TextBlock *blk); + + double secondaryDelta(TextBlock *blk); + + // Returns true if is below , relative to the page's + // primary rotation. + GBool isBelow(TextBlock *blk); + + // Get the head of the linked list of TextLines. + TextLine *getLines() { return lines; } + + // Get the next TextBlock on the linked list. + TextBlock *getNext() { return next; } + +private: + + TextPage *page; // the parent page + int rot; // text rotation + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double priMin, priMax; // whitespace bounding box along primary axis + + TextPool *pool; // pool of words (used only until lines + // are built) + TextLine *lines; // linked list of lines + TextLine *curLine; // most recently added line + int nLines; // number of lines + int charCount; // number of characters in the block + int col; // starting column + int nColumns; // number of columns in the block + + TextBlock *next; + TextBlock *stackNext; + + friend class TextLine; + friend class TextLineFrag; + friend class TextFlow; + friend class TextWordList; + friend class TextPage; +}; + +//------------------------------------------------------------------------ +// TextFlow +//------------------------------------------------------------------------ + +class TextFlow { +public: + + TextFlow(TextPage *pageA, TextBlock *blk); + ~TextFlow(); + + // Add a block to the end of this flow. + void addBlock(TextBlock *blk); + + // Returns true if fits below in the flow, i.e., (1) + // it uses a font no larger than the last block added to the flow, + // and (2) it fits within the flow's [priMin, priMax] along the + // primary axis. + GBool blockFits(TextBlock *blk, TextBlock *prevBlk); + + // Get the head of the linked list of TextBlocks. + TextBlock *getBlocks() { return blocks; } + + // Get the next TextFlow on the linked list. + TextFlow *getNext() { return next; } + +private: + + TextPage *page; // the parent page + double xMin, xMax; // bounding box x coordinates + double yMin, yMax; // bounding box y coordinates + double priMin, priMax; // whitespace bounding box along primary axis + TextBlock *blocks; // blocks in flow + TextBlock *lastBlk; // last block in this flow + TextFlow *next; + + friend class TextWordList; + friend class TextPage; +}; + +#if TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextWordList +//------------------------------------------------------------------------ + +class TextWordList { +public: + + // Build a flat word list, in content stream order (if + // text->rawOrder is true), physical layout order (if + // is true and text->rawOrder is false), or reading order (if both + // flags are false). + TextWordList(TextPage *text, GBool physLayout); + + ~TextWordList(); + + // Return the number of words on the list. + int getLength(); + + // Return the th word from the list. + TextWord *get(int idx); + +private: + + GList *words; // [TextWord] +}; + +#endif // TEXTOUT_WORD_LIST + +//------------------------------------------------------------------------ +// TextPage +//------------------------------------------------------------------------ + +class TextPage { +public: + + // Constructor. + TextPage(GBool rawOrderA); + + // Destructor. + ~TextPage(); + + // Start a new page. + void startPage(GfxState *state); + + // End the current page. + void endPage(); + + // Update the current font. + void updateFont(GfxState *state); + + // Begin a new word. + void beginWord(GfxState *state, double x0, double y0); + + // Add a character to the current word. + void addChar(GfxState *state, double x, double y, + double dx, double dy, + CharCode c, int nBytes, Unicode *u, int uLen); + + // End the current word, sorting it into the list of words. + void endWord(); + + // Add a word, sorting it into the list of words. + void addWord(TextWord *word); + + // Add a (potential) underline. + void addUnderline(double x0, double y0, double x1, double y1); + + // Add a hyperlink. + void addLink(int xMin, int yMin, int xMax, int yMax, Link *link); + + // Coalesce strings that look like parts of the same line. + void coalesce(GBool physLayout, GBool doHTML); + + // Find a string. If is true, starts looking at the + // top of the page; else if is true, starts looking + // immediately after the last find result; else starts looking at + // ,. If is true, stops looking at the + // bottom of the page; else if is true, stops looking + // just before the last find result; else stops looking at + // ,. + GBool findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Get the text which is inside the specified rectangle. + GString *getText(double xMin, double yMin, + double xMax, double yMax); + + // Find a string by character position and length. If found, sets + // the text bounding rectangle and returns true; otherwise returns + // false. + GBool findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Dump contents of page to a file. + void dump(void *outputStream, TextOutputFunc outputFunc, + GBool physLayout); + + // Get the head of the linked list of TextFlows. + TextFlow *getFlows() { return flows; } + +#if TEXTOUT_WORD_LIST + // Build a flat word list, in content stream order (if + // this->rawOrder is true), physical layout order (if + // is true and this->rawOrder is false), or reading order (if both + // flags are false). + TextWordList *makeWordList(GBool physLayout); +#endif + +private: + + void clear(); + void assignColumns(TextLineFrag *frags, int nFrags, int rot); + int dumpFragment(Unicode *text, int len, UnicodeMap *uMap, GString *s); + + GBool rawOrder; // keep text in content stream order + + double pageWidth, pageHeight; // width and height of current page + TextWord *curWord; // currently active string + int charPos; // next character position (within content + // stream) + TextFontInfo *curFont; // current font + double curFontSize; // current font size + int nest; // current nesting level (for Type 3 fonts) + int nTinyChars; // number of "tiny" chars seen so far + GBool lastCharOverlap; // set if the last added char overlapped the + // previous char + + TextPool *pools[4]; // a "pool" of TextWords for each rotation + TextFlow *flows; // linked list of flows + TextBlock **blocks; // array of blocks, in yx order + int nBlocks; // number of blocks + int primaryRot; // primary rotation + GBool primaryLR; // primary direction (true means L-to-R, + // false means R-to-L) + TextWord *rawWords; // list of words, in raw order (only if + // rawOrder is set) + TextWord *rawLastWord; // last word on rawWords list + + GList *fonts; // all font info objects used on this + // page [TextFontInfo] + + double lastFindXMin, // coordinates of the last "find" result + lastFindYMin; + GBool haveLastFind; + + GList *underlines; // [TextUnderline] + GList *links; // [TextLink] + + friend class TextLine; + friend class TextLineFrag; + friend class TextBlock; + friend class TextFlow; + friend class TextWordList; +}; + +//------------------------------------------------------------------------ +// TextOutputDev +//------------------------------------------------------------------------ + +class TextOutputDev: public OutputDev { +public: + + // Open a text output file. If is NULL, no file is + // written (this is useful, e.g., for searching text). If + // is true, the original physical layout of the text + // is maintained. If is true, the text is kept in + // content stream order. + TextOutputDev(char *fileName, GBool physLayoutA, + GBool rawOrderA, GBool append); + + // Create a TextOutputDev which will write to a generic stream. If + // is true, the original physical layout of the text + // is maintained. If is true, the text is kept in + // content stream order. + TextOutputDev(TextOutputFunc func, void *stream, + GBool physLayoutA, GBool rawOrderA); + + // Destructor. + virtual ~TextOutputDev(); + + // Check if file was successfully created. + virtual GBool isOk() { return ok; } + + //---- get info about output device + + // Does this device use upside-down coordinates? + // (Upside-down means (0,0) is the top left corner of the page.) + virtual GBool upsideDown() { return gTrue; } + + // Does this device use drawChar() or drawString()? + virtual GBool useDrawChar() { return gTrue; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + // Does this device need non-text content? + virtual GBool needNonText() { return gFalse; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state); + + // End a page. + virtual void endPage(); + + //----- update text state + virtual void updateFont(GfxState *state); + + //----- text drawing + virtual void beginString(GfxState *state, GString *s); + virtual void endString(GfxState *state); + virtual void drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode c, int nBytes, Unicode *u, int uLen); + + //----- path painting + virtual void stroke(GfxState *state); + virtual void fill(GfxState *state); + virtual void eoFill(GfxState *state); + + //----- link borders + virtual void processLink(Link *link, Catalog *catalog); + + //----- special access + + // Find a string. If is true, starts looking at the + // top of the page; else if is true, starts looking + // immediately after the last find result; else starts looking at + // ,. If is true, stops looking at the + // bottom of the page; else if is true, stops looking + // just before the last find result; else stops looking at + // ,. + GBool findText(Unicode *s, int len, + GBool startAtTop, GBool stopAtBottom, + GBool startAtLast, GBool stopAtLast, + GBool caseSensitive, GBool backward, + double *xMin, double *yMin, + double *xMax, double *yMax); + + // Get the text which is inside the specified rectangle. + GString *getText(double xMin, double yMin, + double xMax, double yMax); + + // Find a string by character position and length. If found, sets + // the text bounding rectangle and returns true; otherwise returns + // false. + GBool findCharRange(int pos, int length, + double *xMin, double *yMin, + double *xMax, double *yMax); + +#if TEXTOUT_WORD_LIST + // Build a flat word list, in content stream order (if + // this->rawOrder is true), physical layout order (if + // this->physLayout is true and this->rawOrder is false), or reading + // order (if both flags are false). + TextWordList *makeWordList(); +#endif + + // Returns the TextPage object for the last rasterized page, + // transferring ownership to the caller. + TextPage *takeText(); + + // Turn extra processing for HTML conversion on or off. + void enableHTMLExtras(GBool doHTMLA) { doHTML = doHTMLA; } + +private: + + TextOutputFunc outputFunc; // output function + void *outputStream; // output stream + GBool needClose; // need to close the output file? + // (only if outputStream is a FILE*) + TextPage *text; // text for the current page + GBool physLayout; // maintain original physical layout when + // dumping text + GBool rawOrder; // keep text in content stream order + GBool doHTML; // extra processing for HTML conversion + GBool ok; // set up ok? +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h new file mode 100644 index 000000000..8536dbf94 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h @@ -0,0 +1,56 @@ +//======================================================================== +// +// UTF8.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +static int mapUTF8(Unicode u, char *buf, int bufSize) { + if (u <= 0x0000007f) { + if (bufSize < 1) { + return 0; + } + buf[0] = (char)u; + return 1; + } else if (u <= 0x000007ff) { + if (bufSize < 2) { + return 0; + } + buf[0] = (char)(0xc0 + (u >> 6)); + buf[1] = (char)(0x80 + (u & 0x3f)); + return 2; + } else if (u <= 0x0000ffff) { + if (bufSize < 3) { + return 0; + } + buf[0] = (char)(0xe0 + (u >> 12)); + buf[1] = (char)(0x80 + ((u >> 6) & 0x3f)); + buf[2] = (char)(0x80 + (u & 0x3f)); + return 3; + } else if (u <= 0x0010ffff) { + if (bufSize < 4) { + return 0; + } + buf[0] = (char)(0xf0 + (u >> 18)); + buf[1] = (char)(0x80 + ((u >> 12) & 0x3f)); + buf[2] = (char)(0x80 + ((u >> 6) & 0x3f)); + buf[3] = (char)(0x80 + (u & 0x3f)); + return 4; + } else { + return 0; + } +} + +static int mapUCS2(Unicode u, char *buf, int bufSize) { + if (u <= 0xffff) { + if (bufSize < 2) { + return 0; + } + buf[0] = (char)((u >> 8) & 0xff); + buf[1] = (char)(u & 0xff); + return 2; + } else { + return 0; + } +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc new file mode 100644 index 000000000..2b8cb1f7a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc @@ -0,0 +1,293 @@ +//======================================================================== +// +// UnicodeMap.cc +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include "gmem.h" +#include "gfile.h" +#include "GString.h" +#include "GList.h" +#include "Error.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" + +//------------------------------------------------------------------------ + +#define maxExtCode 16 + +struct UnicodeMapExt { + Unicode u; // Unicode char + char code[maxExtCode]; + Guint nBytes; +}; + +//------------------------------------------------------------------------ + +UnicodeMap *UnicodeMap::parse(GString *encodingNameA) { + FILE *f; + UnicodeMap *map; + UnicodeMapRange *range; + UnicodeMapExt *eMap; + int size, eMapsSize; + char buf[256]; + int line, nBytes, i, x; + char *tok1, *tok2, *tok3; + + if (!(f = globalParams->getUnicodeMapFile(encodingNameA))) { + error(-1, "Couldn't find unicodeMap file for the '%s' encoding", + encodingNameA->getCString()); + return NULL; + } + + map = new UnicodeMap(encodingNameA->copy()); + + size = 8; + map->ranges = (UnicodeMapRange *)gmallocn(size, sizeof(UnicodeMapRange)); + eMapsSize = 0; + + line = 1; + while (getLine(buf, sizeof(buf), f)) { + if ((tok1 = strtok(buf, " \t\r\n")) && + (tok2 = strtok(NULL, " \t\r\n"))) { + if (!(tok3 = strtok(NULL, " \t\r\n"))) { + tok3 = tok2; + tok2 = tok1; + } + nBytes = strlen(tok3) / 2; + if (nBytes <= 4) { + if (map->len == size) { + size *= 2; + map->ranges = (UnicodeMapRange *) + greallocn(map->ranges, size, sizeof(UnicodeMapRange)); + } + range = &map->ranges[map->len]; + sscanf(tok1, "%x", &range->start); + sscanf(tok2, "%x", &range->end); + sscanf(tok3, "%x", &range->code); + range->nBytes = nBytes; + ++map->len; + } else if (tok2 == tok1) { + if (map->eMapsLen == eMapsSize) { + eMapsSize += 16; + map->eMaps = (UnicodeMapExt *) + greallocn(map->eMaps, eMapsSize, sizeof(UnicodeMapExt)); + } + eMap = &map->eMaps[map->eMapsLen]; + sscanf(tok1, "%x", &eMap->u); + for (i = 0; i < nBytes; ++i) { + sscanf(tok3 + i*2, "%2x", &x); + eMap->code[i] = (char)x; + } + eMap->nBytes = nBytes; + ++map->eMapsLen; + } else { + error(-1, "Bad line (%d) in unicodeMap file for the '%s' encoding", + line, encodingNameA->getCString()); + } + } else { + error(-1, "Bad line (%d) in unicodeMap file for the '%s' encoding", + line, encodingNameA->getCString()); + } + ++line; + } + + fclose(f); + + return map; +} + +UnicodeMap::UnicodeMap(GString *encodingNameA) { + encodingName = encodingNameA; + unicodeOut = gFalse; + kind = unicodeMapUser; + ranges = NULL; + len = 0; + eMaps = NULL; + eMapsLen = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA, + UnicodeMapRange *rangesA, int lenA) { + encodingName = new GString(encodingNameA); + unicodeOut = unicodeOutA; + kind = unicodeMapResident; + ranges = rangesA; + len = lenA; + eMaps = NULL; + eMapsLen = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA, + UnicodeMapFunc funcA) { + encodingName = new GString(encodingNameA); + unicodeOut = unicodeOutA; + kind = unicodeMapFunc; + func = funcA; + eMaps = NULL; + eMapsLen = 0; + refCnt = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +UnicodeMap::~UnicodeMap() { + delete encodingName; + if (kind == unicodeMapUser && ranges) { + gfree(ranges); + } + if (eMaps) { + gfree(eMaps); + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +void UnicodeMap::incRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + ++refCnt; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +void UnicodeMap::decRefCnt() { + GBool done; + +#if MULTITHREADED + gLockMutex(&mutex); +#endif + done = --refCnt == 0; +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + if (done) { + delete this; + } +} + +GBool UnicodeMap::match(GString *encodingNameA) { + return !encodingName->cmp(encodingNameA); +} + +int UnicodeMap::mapUnicode(Unicode u, char *buf, int bufSize) { + int a, b, m, n, i, j; + Guint code; + + if (kind == unicodeMapFunc) { + return (*func)(u, buf, bufSize); + } + + a = 0; + b = len; + if (u >= ranges[a].start) { + // invariant: ranges[a].start <= u < ranges[b].start + while (b - a > 1) { + m = (a + b) / 2; + if (u >= ranges[m].start) { + a = m; + } else if (u < ranges[m].start) { + b = m; + } + } + if (u <= ranges[a].end) { + n = ranges[a].nBytes; + if (n > bufSize) { + return 0; + } + code = ranges[a].code + (u - ranges[a].start); + for (i = n - 1; i >= 0; --i) { + buf[i] = (char)(code & 0xff); + code >>= 8; + } + return n; + } + } + + for (i = 0; i < eMapsLen; ++i) { + if (eMaps[i].u == u) { + n = eMaps[i].nBytes; + for (j = 0; j < n; ++j) { + buf[j] = eMaps[i].code[j]; + } + return n; + } + } + + return 0; +} + +//------------------------------------------------------------------------ + +UnicodeMapCache::UnicodeMapCache() { + int i; + + for (i = 0; i < unicodeMapCacheSize; ++i) { + cache[i] = NULL; + } +} + +UnicodeMapCache::~UnicodeMapCache() { + int i; + + for (i = 0; i < unicodeMapCacheSize; ++i) { + if (cache[i]) { + cache[i]->decRefCnt(); + } + } +} + +UnicodeMap *UnicodeMapCache::getUnicodeMap(GString *encodingName) { + UnicodeMap *map; + int i, j; + + if (cache[0] && cache[0]->match(encodingName)) { + cache[0]->incRefCnt(); + return cache[0]; + } + for (i = 1; i < unicodeMapCacheSize; ++i) { + if (cache[i] && cache[i]->match(encodingName)) { + map = cache[i]; + for (j = i; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = map; + map->incRefCnt(); + return map; + } + } + if ((map = UnicodeMap::parse(encodingName))) { + if (cache[unicodeMapCacheSize - 1]) { + cache[unicodeMapCacheSize - 1]->decRefCnt(); + } + for (j = unicodeMapCacheSize - 1; j >= 1; --j) { + cache[j] = cache[j - 1]; + } + cache[0] = map; + map->incRefCnt(); + return map; + } + return NULL; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h new file mode 100644 index 000000000..0f86101e0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h @@ -0,0 +1,123 @@ +//======================================================================== +// +// UnicodeMap.h +// +// Mapping from Unicode to an encoding. +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef UNICODEMAP_H +#define UNICODEMAP_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "GMutex.h" +#endif + +class GString; + +//------------------------------------------------------------------------ + +enum UnicodeMapKind { + unicodeMapUser, // read from a file + unicodeMapResident, // static list of ranges + unicodeMapFunc // function pointer +}; + +typedef int (*UnicodeMapFunc)(Unicode u, char *buf, int bufSize); + +struct UnicodeMapRange { + Unicode start, end; // range of Unicode chars + Guint code, nBytes; // first output code +}; + +struct UnicodeMapExt; + +//------------------------------------------------------------------------ + +class UnicodeMap { +public: + + // Create the UnicodeMap specified by . Sets the + // initial reference count to 1. Returns NULL on failure. + static UnicodeMap *parse(GString *encodingNameA); + + // Create a resident UnicodeMap. + UnicodeMap(char *encodingNameA, GBool unicodeOutA, + UnicodeMapRange *rangesA, int lenA); + + // Create a resident UnicodeMap that uses a function instead of a + // list of ranges. + UnicodeMap(char *encodingNameA, GBool unicodeOutA, + UnicodeMapFunc funcA); + + ~UnicodeMap(); + + void incRefCnt(); + void decRefCnt(); + + GString *getEncodingName() { return encodingName; } + + GBool isUnicode() { return unicodeOut; } + + // Return true if this UnicodeMap matches the specified + // . + GBool match(GString *encodingNameA); + + // Map Unicode to the target encoding. Fills in with the + // output and returns the number of bytes used. Output will be + // truncated at bytes. No string terminator is written. + // Returns 0 if no mapping is found. + int mapUnicode(Unicode u, char *buf, int bufSize); + +private: + + UnicodeMap(GString *encodingNameA); + + GString *encodingName; + UnicodeMapKind kind; + GBool unicodeOut; + union { + UnicodeMapRange *ranges; // (user, resident) + UnicodeMapFunc func; // (func) + }; + int len; // (user, resident) + UnicodeMapExt *eMaps; // (user) + int eMapsLen; // (user) + int refCnt; +#if MULTITHREADED + GMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ + +#define unicodeMapCacheSize 4 + +class UnicodeMapCache { +public: + + UnicodeMapCache(); + ~UnicodeMapCache(); + + // Get the UnicodeMap for . Increments its reference + // count; there will be one reference for the cache plus one for the + // caller of this function. Returns NULL on failure. + UnicodeMap *getUnicodeMap(GString *encodingName); + +private: + + UnicodeMap *cache[unicodeMapCacheSize]; +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h new file mode 100644 index 000000000..9c5103461 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h @@ -0,0 +1,361 @@ +//======================================================================== +// +// UnicodeMapTables.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +static UnicodeMapRange latin1UnicodeMapRanges[] = { + { 0x000a, 0x000a, 0x0a, 1 }, + { 0x000c, 0x000d, 0x0c, 1 }, + { 0x0020, 0x007e, 0x20, 1 }, + { 0x00a0, 0x00a0, 0x20, 1 }, + { 0x00a1, 0x00ac, 0xa1, 1 }, + { 0x00ae, 0x00ff, 0xae, 1 }, + { 0x010c, 0x010c, 0x43, 1 }, + { 0x010d, 0x010d, 0x63, 1 }, + { 0x0131, 0x0131, 0x69, 1 }, + { 0x0141, 0x0141, 0x4c, 1 }, + { 0x0142, 0x0142, 0x6c, 1 }, + { 0x0152, 0x0152, 0x4f45, 2 }, + { 0x0153, 0x0153, 0x6f65, 2 }, + { 0x0160, 0x0160, 0x53, 1 }, + { 0x0161, 0x0161, 0x73, 1 }, + { 0x0178, 0x0178, 0x59, 1 }, + { 0x017d, 0x017d, 0x5a, 1 }, + { 0x017e, 0x017e, 0x7a, 1 }, + { 0x02c6, 0x02c6, 0x5e, 1 }, + { 0x02da, 0x02da, 0xb0, 1 }, + { 0x02dc, 0x02dc, 0x7e, 1 }, + { 0x2013, 0x2013, 0xad, 1 }, + { 0x2014, 0x2014, 0x2d2d, 2 }, + { 0x2018, 0x2018, 0x60, 1 }, + { 0x2019, 0x2019, 0x27, 1 }, + { 0x201a, 0x201a, 0x2c, 1 }, + { 0x201c, 0x201c, 0x22, 1 }, + { 0x201d, 0x201d, 0x22, 1 }, + { 0x201e, 0x201e, 0x2c2c, 2 }, + { 0x2022, 0x2022, 0xb7, 1 }, + { 0x2026, 0x2026, 0x2e2e2e, 3 }, + { 0x2039, 0x2039, 0x3c, 1 }, + { 0x203a, 0x203a, 0x3e, 1 }, + { 0x2044, 0x2044, 0x2f, 1 }, + { 0x2122, 0x2122, 0x544d, 2 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0xf6f9, 0xf6f9, 0x4c, 1 }, + { 0xf6fa, 0xf6fa, 0x4f45, 2 }, + { 0xf6fc, 0xf6fc, 0xb0, 1 }, + { 0xf6fd, 0xf6fd, 0x53, 1 }, + { 0xf6fe, 0xf6fe, 0x7e, 1 }, + { 0xf6ff, 0xf6ff, 0x5a, 1 }, + { 0xf721, 0xf721, 0x21, 1 }, + { 0xf724, 0xf724, 0x24, 1 }, + { 0xf726, 0xf726, 0x26, 1 }, + { 0xf730, 0xf739, 0x30, 1 }, + { 0xf73f, 0xf73f, 0x3f, 1 }, + { 0xf761, 0xf77a, 0x41, 1 }, + { 0xf7a1, 0xf7a2, 0xa1, 1 }, + { 0xf7bf, 0xf7bf, 0xbf, 1 }, + { 0xf7e0, 0xf7f6, 0xc0, 1 }, + { 0xf7f8, 0xf7fe, 0xd8, 1 }, + { 0xf7ff, 0xf7ff, 0x59, 1 }, + { 0xfb00, 0xfb00, 0x6666, 2 }, + { 0xfb01, 0xfb01, 0x6669, 2 }, + { 0xfb02, 0xfb02, 0x666c, 2 }, + { 0xfb03, 0xfb03, 0x666669, 3 }, + { 0xfb04, 0xfb04, 0x66666c, 3 } +}; +#define latin1UnicodeMapLen (sizeof(latin1UnicodeMapRanges) / sizeof(UnicodeMapRange)) + +static UnicodeMapRange ascii7UnicodeMapRanges[] = { + { 0x000a, 0x000a, 0x0a, 1 }, + { 0x000c, 0x000d, 0x0c, 1 }, + { 0x0020, 0x005f, 0x20, 1 }, + { 0x0061, 0x007e, 0x61, 1 }, + { 0x00a6, 0x00a6, 0x7c, 1 }, + { 0x00a9, 0x00a9, 0x286329, 3 }, + { 0x00ae, 0x00ae, 0x285229, 3 }, + { 0x00b7, 0x00b7, 0x2a, 1 }, + { 0x00bc, 0x00bc, 0x312f34, 3 }, + { 0x00bd, 0x00bd, 0x312f32, 3 }, + { 0x00be, 0x00be, 0x332f34, 3 }, + { 0x00c0, 0x00c0, 0x41, 1 }, + { 0x00c1, 0x00c1, 0x41, 1 }, + { 0x00c2, 0x00c2, 0x41, 1 }, + { 0x00c3, 0x00c3, 0x41, 1 }, + { 0x00c4, 0x00c4, 0x41, 1 }, + { 0x00c5, 0x00c5, 0x41, 1 }, + { 0x00c6, 0x00c6, 0x4145, 2 }, + { 0x00c7, 0x00c7, 0x43, 1 }, + { 0x00c8, 0x00c8, 0x45, 1 }, + { 0x00c9, 0x00c9, 0x45, 1 }, + { 0x00ca, 0x00ca, 0x45, 1 }, + { 0x00cb, 0x00cb, 0x45, 1 }, + { 0x00cc, 0x00cc, 0x49, 1 }, + { 0x00cd, 0x00cd, 0x49, 1 }, + { 0x00ce, 0x00ce, 0x49, 1 }, + { 0x00cf, 0x00cf, 0x49, 1 }, + { 0x00d1, 0x00d2, 0x4e, 1 }, + { 0x00d3, 0x00d3, 0x4f, 1 }, + { 0x00d4, 0x00d4, 0x4f, 1 }, + { 0x00d5, 0x00d5, 0x4f, 1 }, + { 0x00d6, 0x00d6, 0x4f, 1 }, + { 0x00d7, 0x00d7, 0x78, 1 }, + { 0x00d8, 0x00d8, 0x4f, 1 }, + { 0x00d9, 0x00d9, 0x55, 1 }, + { 0x00da, 0x00da, 0x55, 1 }, + { 0x00db, 0x00db, 0x55, 1 }, + { 0x00dc, 0x00dc, 0x55, 1 }, + { 0x00dd, 0x00dd, 0x59, 1 }, + { 0x00e0, 0x00e0, 0x61, 1 }, + { 0x00e1, 0x00e1, 0x61, 1 }, + { 0x00e2, 0x00e2, 0x61, 1 }, + { 0x00e3, 0x00e3, 0x61, 1 }, + { 0x00e4, 0x00e4, 0x61, 1 }, + { 0x00e5, 0x00e5, 0x61, 1 }, + { 0x00e6, 0x00e6, 0x6165, 2 }, + { 0x00e7, 0x00e7, 0x63, 1 }, + { 0x00e8, 0x00e8, 0x65, 1 }, + { 0x00e9, 0x00e9, 0x65, 1 }, + { 0x00ea, 0x00ea, 0x65, 1 }, + { 0x00eb, 0x00eb, 0x65, 1 }, + { 0x00ec, 0x00ec, 0x69, 1 }, + { 0x00ed, 0x00ed, 0x69, 1 }, + { 0x00ee, 0x00ee, 0x69, 1 }, + { 0x00ef, 0x00ef, 0x69, 1 }, + { 0x00f1, 0x00f2, 0x6e, 1 }, + { 0x00f3, 0x00f3, 0x6f, 1 }, + { 0x00f4, 0x00f4, 0x6f, 1 }, + { 0x00f5, 0x00f5, 0x6f, 1 }, + { 0x00f6, 0x00f6, 0x6f, 1 }, + { 0x00f7, 0x00f7, 0x2f, 1 }, + { 0x00f8, 0x00f8, 0x6f, 1 }, + { 0x00f9, 0x00f9, 0x75, 1 }, + { 0x00fa, 0x00fa, 0x75, 1 }, + { 0x00fb, 0x00fb, 0x75, 1 }, + { 0x00fc, 0x00fc, 0x75, 1 }, + { 0x00fd, 0x00fd, 0x79, 1 }, + { 0x00ff, 0x00ff, 0x79, 1 }, + { 0x0131, 0x0131, 0x69, 1 }, + { 0x0141, 0x0141, 0x4c, 1 }, + { 0x0152, 0x0152, 0x4f45, 2 }, + { 0x0153, 0x0153, 0x6f65, 2 }, + { 0x0160, 0x0160, 0x53, 1 }, + { 0x0178, 0x0178, 0x59, 1 }, + { 0x017d, 0x017d, 0x5a, 1 }, + { 0x2013, 0x2013, 0x2d, 1 }, + { 0x2014, 0x2014, 0x2d2d, 2 }, + { 0x2018, 0x2018, 0x60, 1 }, + { 0x2019, 0x2019, 0x27, 1 }, + { 0x201c, 0x201c, 0x22, 1 }, + { 0x201d, 0x201d, 0x22, 1 }, + { 0x2022, 0x2022, 0x2a, 1 }, + { 0x2026, 0x2026, 0x2e2e2e, 3 }, + { 0x2122, 0x2122, 0x544d, 2 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0xf6f9, 0xf6f9, 0x4c, 1 }, + { 0xf6fa, 0xf6fa, 0x4f45, 2 }, + { 0xf6fd, 0xf6fd, 0x53, 1 }, + { 0xf6fe, 0xf6fe, 0x7e, 1 }, + { 0xf6ff, 0xf6ff, 0x5a, 1 }, + { 0xf721, 0xf721, 0x21, 1 }, + { 0xf724, 0xf724, 0x24, 1 }, + { 0xf726, 0xf726, 0x26, 1 }, + { 0xf730, 0xf739, 0x30, 1 }, + { 0xf73f, 0xf73f, 0x3f, 1 }, + { 0xf761, 0xf77a, 0x41, 1 }, + { 0xf7e0, 0xf7e0, 0x41, 1 }, + { 0xf7e1, 0xf7e1, 0x41, 1 }, + { 0xf7e2, 0xf7e2, 0x41, 1 }, + { 0xf7e3, 0xf7e3, 0x41, 1 }, + { 0xf7e4, 0xf7e4, 0x41, 1 }, + { 0xf7e5, 0xf7e5, 0x41, 1 }, + { 0xf7e6, 0xf7e6, 0x4145, 2 }, + { 0xf7e7, 0xf7e7, 0x43, 1 }, + { 0xf7e8, 0xf7e8, 0x45, 1 }, + { 0xf7e9, 0xf7e9, 0x45, 1 }, + { 0xf7ea, 0xf7ea, 0x45, 1 }, + { 0xf7eb, 0xf7eb, 0x45, 1 }, + { 0xf7ec, 0xf7ec, 0x49, 1 }, + { 0xf7ed, 0xf7ed, 0x49, 1 }, + { 0xf7ee, 0xf7ee, 0x49, 1 }, + { 0xf7ef, 0xf7ef, 0x49, 1 }, + { 0xf7f1, 0xf7f2, 0x4e, 1 }, + { 0xf7f3, 0xf7f3, 0x4f, 1 }, + { 0xf7f4, 0xf7f4, 0x4f, 1 }, + { 0xf7f5, 0xf7f5, 0x4f, 1 }, + { 0xf7f6, 0xf7f6, 0x4f, 1 }, + { 0xf7f8, 0xf7f8, 0x4f, 1 }, + { 0xf7f9, 0xf7f9, 0x55, 1 }, + { 0xf7fa, 0xf7fa, 0x55, 1 }, + { 0xf7fb, 0xf7fb, 0x55, 1 }, + { 0xf7fc, 0xf7fc, 0x55, 1 }, + { 0xf7fd, 0xf7fd, 0x59, 1 }, + { 0xf7ff, 0xf7ff, 0x59, 1 }, + { 0xfb00, 0xfb00, 0x6666, 2 }, + { 0xfb01, 0xfb01, 0x6669, 2 }, + { 0xfb02, 0xfb02, 0x666c, 2 }, + { 0xfb03, 0xfb03, 0x666669, 3 }, + { 0xfb04, 0xfb04, 0x66666c, 3 } +}; +#define ascii7UnicodeMapLen (sizeof(ascii7UnicodeMapRanges) / sizeof(UnicodeMapRange)) + +static UnicodeMapRange symbolUnicodeMapRanges[] = { + { 0x0020, 0x0021, 0x20, 1 }, + { 0x0023, 0x0023, 0x23, 1 }, + { 0x0025, 0x0026, 0x25, 1 }, + { 0x0028, 0x0029, 0x28, 1 }, + { 0x002b, 0x002c, 0x2b, 1 }, + { 0x002e, 0x003f, 0x2e, 1 }, + { 0x005b, 0x005b, 0x5b, 1 }, + { 0x005d, 0x005d, 0x5d, 1 }, + { 0x005f, 0x005f, 0x5f, 1 }, + { 0x007b, 0x007d, 0x7b, 1 }, + { 0x00ac, 0x00ac, 0xd8, 1 }, + { 0x00b0, 0x00b1, 0xb0, 1 }, + { 0x00b5, 0x00b5, 0x6d, 1 }, + { 0x00d7, 0x00d7, 0xb4, 1 }, + { 0x00f7, 0x00f7, 0xb8, 1 }, + { 0x0192, 0x0192, 0xa6, 1 }, + { 0x0391, 0x0392, 0x41, 1 }, + { 0x0393, 0x0393, 0x47, 1 }, + { 0x0395, 0x0395, 0x45, 1 }, + { 0x0396, 0x0396, 0x5a, 1 }, + { 0x0397, 0x0397, 0x48, 1 }, + { 0x0398, 0x0398, 0x51, 1 }, + { 0x0399, 0x0399, 0x49, 1 }, + { 0x039a, 0x039d, 0x4b, 1 }, + { 0x039e, 0x039e, 0x58, 1 }, + { 0x039f, 0x03a0, 0x4f, 1 }, + { 0x03a1, 0x03a1, 0x52, 1 }, + { 0x03a3, 0x03a5, 0x53, 1 }, + { 0x03a6, 0x03a6, 0x46, 1 }, + { 0x03a7, 0x03a7, 0x43, 1 }, + { 0x03a8, 0x03a8, 0x59, 1 }, + { 0x03b1, 0x03b2, 0x61, 1 }, + { 0x03b3, 0x03b3, 0x67, 1 }, + { 0x03b4, 0x03b5, 0x64, 1 }, + { 0x03b6, 0x03b6, 0x7a, 1 }, + { 0x03b7, 0x03b7, 0x68, 1 }, + { 0x03b8, 0x03b8, 0x71, 1 }, + { 0x03b9, 0x03b9, 0x69, 1 }, + { 0x03ba, 0x03bb, 0x6b, 1 }, + { 0x03bd, 0x03bd, 0x6e, 1 }, + { 0x03be, 0x03be, 0x78, 1 }, + { 0x03bf, 0x03c0, 0x6f, 1 }, + { 0x03c1, 0x03c1, 0x72, 1 }, + { 0x03c2, 0x03c2, 0x56, 1 }, + { 0x03c3, 0x03c5, 0x73, 1 }, + { 0x03c6, 0x03c6, 0x66, 1 }, + { 0x03c7, 0x03c7, 0x63, 1 }, + { 0x03c8, 0x03c8, 0x79, 1 }, + { 0x03c9, 0x03c9, 0x77, 1 }, + { 0x03d1, 0x03d1, 0x4a, 1 }, + { 0x03d2, 0x03d2, 0xa1, 1 }, + { 0x03d5, 0x03d5, 0x6a, 1 }, + { 0x03d6, 0x03d6, 0x76, 1 }, + { 0x2022, 0x2022, 0xb7, 1 }, + { 0x2026, 0x2026, 0xbc, 1 }, + { 0x2032, 0x2032, 0xa2, 1 }, + { 0x2033, 0x2033, 0xb2, 1 }, + { 0x2044, 0x2044, 0xa4, 1 }, + { 0x2111, 0x2111, 0xc1, 1 }, + { 0x2118, 0x2118, 0xc3, 1 }, + { 0x211c, 0x211c, 0xc2, 1 }, + { 0x2126, 0x2126, 0x57, 1 }, + { 0x2135, 0x2135, 0xc0, 1 }, + { 0x2190, 0x2193, 0xac, 1 }, + { 0x2194, 0x2194, 0xab, 1 }, + { 0x21b5, 0x21b5, 0xbf, 1 }, + { 0x21d0, 0x21d3, 0xdc, 1 }, + { 0x21d4, 0x21d4, 0xdb, 1 }, + { 0x2200, 0x2200, 0x22, 1 }, + { 0x2202, 0x2202, 0xb6, 1 }, + { 0x2203, 0x2203, 0x24, 1 }, + { 0x2205, 0x2205, 0xc6, 1 }, + { 0x2206, 0x2206, 0x44, 1 }, + { 0x2207, 0x2207, 0xd1, 1 }, + { 0x2208, 0x2209, 0xce, 1 }, + { 0x220b, 0x220b, 0x27, 1 }, + { 0x220f, 0x220f, 0xd5, 1 }, + { 0x2211, 0x2211, 0xe5, 1 }, + { 0x2212, 0x2212, 0x2d, 1 }, + { 0x2217, 0x2217, 0x2a, 1 }, + { 0x221a, 0x221a, 0xd6, 1 }, + { 0x221d, 0x221d, 0xb5, 1 }, + { 0x221e, 0x221e, 0xa5, 1 }, + { 0x2220, 0x2220, 0xd0, 1 }, + { 0x2227, 0x2228, 0xd9, 1 }, + { 0x2229, 0x222a, 0xc7, 1 }, + { 0x222b, 0x222b, 0xf2, 1 }, + { 0x2234, 0x2234, 0x5c, 1 }, + { 0x223c, 0x223c, 0x7e, 1 }, + { 0x2245, 0x2245, 0x40, 1 }, + { 0x2248, 0x2248, 0xbb, 1 }, + { 0x2260, 0x2261, 0xb9, 1 }, + { 0x2264, 0x2264, 0xa3, 1 }, + { 0x2265, 0x2265, 0xb3, 1 }, + { 0x2282, 0x2282, 0xcc, 1 }, + { 0x2283, 0x2283, 0xc9, 1 }, + { 0x2284, 0x2284, 0xcb, 1 }, + { 0x2286, 0x2286, 0xcd, 1 }, + { 0x2287, 0x2287, 0xca, 1 }, + { 0x2295, 0x2295, 0xc5, 1 }, + { 0x2297, 0x2297, 0xc4, 1 }, + { 0x22a5, 0x22a5, 0x5e, 1 }, + { 0x22c5, 0x22c5, 0xd7, 1 }, + { 0x2320, 0x2320, 0xf3, 1 }, + { 0x2321, 0x2321, 0xf5, 1 }, + { 0x2329, 0x2329, 0xe1, 1 }, + { 0x232a, 0x232a, 0xf1, 1 }, + { 0x25ca, 0x25ca, 0xe0, 1 }, + { 0x2660, 0x2660, 0xaa, 1 }, + { 0x2663, 0x2663, 0xa7, 1 }, + { 0x2665, 0x2665, 0xa9, 1 }, + { 0x2666, 0x2666, 0xa8, 1 }, + { 0xf6d9, 0xf6d9, 0xd3, 1 }, + { 0xf6da, 0xf6da, 0xd2, 1 }, + { 0xf6db, 0xf6db, 0xd4, 1 }, + { 0xf8e5, 0xf8e5, 0x60, 1 }, + { 0xf8e6, 0xf8e7, 0xbd, 1 }, + { 0xf8e8, 0xf8ea, 0xe2, 1 }, + { 0xf8eb, 0xf8f4, 0xe6, 1 }, + { 0xf8f5, 0xf8f5, 0xf4, 1 }, + { 0xf8f6, 0xf8fe, 0xf6, 1 } +}; +#define symbolUnicodeMapLen (sizeof(symbolUnicodeMapRanges) / sizeof(UnicodeMapRange)) + +static UnicodeMapRange zapfDingbatsUnicodeMapRanges[] = { + { 0x0020, 0x0020, 0x20, 1 }, + { 0x2192, 0x2192, 0xd5, 1 }, + { 0x2194, 0x2195, 0xd6, 1 }, + { 0x2460, 0x2469, 0xac, 1 }, + { 0x25a0, 0x25a0, 0x6e, 1 }, + { 0x25b2, 0x25b2, 0x73, 1 }, + { 0x25bc, 0x25bc, 0x74, 1 }, + { 0x25c6, 0x25c6, 0x75, 1 }, + { 0x25cf, 0x25cf, 0x6c, 1 }, + { 0x25d7, 0x25d7, 0x77, 1 }, + { 0x2605, 0x2605, 0x48, 1 }, + { 0x260e, 0x260e, 0x25, 1 }, + { 0x261b, 0x261b, 0x2a, 1 }, + { 0x261e, 0x261e, 0x2b, 1 }, + { 0x2660, 0x2660, 0xab, 1 }, + { 0x2663, 0x2663, 0xa8, 1 }, + { 0x2665, 0x2665, 0xaa, 1 }, + { 0x2666, 0x2666, 0xa9, 1 }, + { 0x2701, 0x2704, 0x21, 1 }, + { 0x2706, 0x2709, 0x26, 1 }, + { 0x270c, 0x2727, 0x2c, 1 }, + { 0x2729, 0x274b, 0x49, 1 }, + { 0x274d, 0x274d, 0x6d, 1 }, + { 0x274f, 0x2752, 0x6f, 1 }, + { 0x2756, 0x2756, 0x76, 1 }, + { 0x2758, 0x275e, 0x78, 1 }, + { 0x2761, 0x2767, 0xa1, 1 }, + { 0x2776, 0x2794, 0xb6, 1 }, + { 0x2798, 0x27af, 0xd8, 1 }, + { 0x27b1, 0x27be, 0xf1, 1 } +}; +#define zapfDingbatsUnicodeMapLen (sizeof(zapfDingbatsUnicodeMapRanges) / sizeof(UnicodeMapRange)) diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc new file mode 100644 index 000000000..b89604036 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc @@ -0,0 +1,949 @@ +//======================================================================== +// +// UnicodeTypeTable.cc +// +// Copyright 2004 Glyph & Cog, LLC +// +//======================================================================== + +#include +#include "CharTypes.h" +#include "UnicodeTypeTable.h" + +struct UnicodeMapTableEntry { + char *vector; + char type; +}; + +struct UnicodeCaseTableVector { + Unicode codes[256]; +}; + +static UnicodeMapTableEntry typeTable[256] = { + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNLNNNNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL", 'X' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLNNNNNNNNNNNNNNLLNNNNNNNNNNNNNNLLLLLNNNNNNNNNLNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLNNNNNNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRNRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' }, + { "RRRRNNNNNNNNNRNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNRNNNNNNNRRNNNNNNNRRNNNNNNNNNNRRRRRR", 'X' }, + { "RRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'N' }, + { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLNNNNLLLLLLLLLLLLLNNLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLNNLLLLLLLNNNNN", 'X' }, + { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLNNNNNNNNNNNNNNNN", 'X' }, + { "NNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLNLNNNLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNNNNLLLLLLLNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNLNNNNNLNNLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLNLLNNNNNNNNNNNLLLLLLLNLNLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLNNNNNLLLLLLNLLLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNNNLLLLLLLLLLLNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLNNNLLLLLLLLLLLLLNNN", 'X' }, + { "NNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNNNNNLRNLRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNLNNNNLNNLLLLLLLLLLNLNNNLLLLLNNNNNNLNLNLNLLLLNLLLNLLLLLLLNNLLLLNNNNNLLLLLNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'N' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'L' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { NULL, 'N' }, + { "NNNNNLLLNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNNNNNNNLLLLLNNLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLL", 'X' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { NULL, 'L' }, + { "LLLLLLLLLLLLLLLLLLLLLLLLRRRRRRNRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' }, + { NULL, 'R' }, + { "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' }, + { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLL", 'X' } +}; + +static UnicodeCaseTableVector caseTable00 = {{ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x03bc, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00d7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}}; +static UnicodeCaseTableVector caseTable01 = {{ + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010b, 0x010b, 0x010d, 0x010d, 0x010f, 0x010f, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011b, 0x011b, 0x011d, 0x011d, 0x011f, 0x011f, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012b, 0x012b, 0x012d, 0x012d, 0x012f, 0x012f, + 0x0130, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, + 0x0138, 0x013a, 0x013a, 0x013c, 0x013c, 0x013e, 0x013e, 0x0140, + 0x0140, 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, + 0x0148, 0x0149, 0x014b, 0x014b, 0x014d, 0x014d, 0x014f, 0x014f, + 0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, + 0x0159, 0x0159, 0x015b, 0x015b, 0x015d, 0x015d, 0x015f, 0x015f, + 0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, + 0x0169, 0x0169, 0x016b, 0x016b, 0x016d, 0x016d, 0x016f, 0x016f, + 0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, + 0x00ff, 0x017a, 0x017a, 0x017c, 0x017c, 0x017e, 0x017e, 0x0073, + 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, + 0x0188, 0x0256, 0x0257, 0x018c, 0x018c, 0x018d, 0x01dd, 0x0259, + 0x025b, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, + 0x0199, 0x0199, 0x019a, 0x019b, 0x026f, 0x0272, 0x019e, 0x0275, + 0x01a1, 0x01a1, 0x01a3, 0x01a3, 0x01a5, 0x01a5, 0x0280, 0x01a8, + 0x01a8, 0x0283, 0x01aa, 0x01ab, 0x01ad, 0x01ad, 0x0288, 0x01b0, + 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b4, 0x01b6, 0x01b6, 0x0292, + 0x01b9, 0x01b9, 0x01ba, 0x01bb, 0x01bd, 0x01bd, 0x01be, 0x01bf, + 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c6, 0x01c6, 0x01c6, 0x01c9, + 0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01cc, 0x01ce, 0x01ce, 0x01d0, + 0x01d0, 0x01d2, 0x01d2, 0x01d4, 0x01d4, 0x01d6, 0x01d6, 0x01d8, + 0x01d8, 0x01da, 0x01da, 0x01dc, 0x01dc, 0x01dd, 0x01df, 0x01df, + 0x01e1, 0x01e1, 0x01e3, 0x01e3, 0x01e5, 0x01e5, 0x01e7, 0x01e7, + 0x01e9, 0x01e9, 0x01eb, 0x01eb, 0x01ed, 0x01ed, 0x01ef, 0x01ef, + 0x01f0, 0x01f3, 0x01f3, 0x01f3, 0x01f5, 0x01f5, 0x0195, 0x01bf, + 0x01f9, 0x01f9, 0x01fb, 0x01fb, 0x01fd, 0x01fd, 0x01ff, 0x01ff +}}; +static UnicodeCaseTableVector caseTable02 = {{ + 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, + 0x0209, 0x0209, 0x020b, 0x020b, 0x020d, 0x020d, 0x020f, 0x020f, + 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, + 0x0219, 0x0219, 0x021b, 0x021b, 0x021d, 0x021d, 0x021f, 0x021f, + 0x019e, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, + 0x0229, 0x0229, 0x022b, 0x022b, 0x022d, 0x022d, 0x022f, 0x022f, + 0x0231, 0x0231, 0x0233, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, + 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, + 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, + 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, + 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, + 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, + 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, + 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, + 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, + 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, + 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, + 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, + 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, + 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, + 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, + 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, + 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, + 0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, + 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, + 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, + 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, + 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, + 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, + 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, + 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, + 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff +}}; +static UnicodeCaseTableVector caseTable03 = {{ + 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, + 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, + 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, + 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, + 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, + 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, + 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x03b9, 0x0346, 0x0347, + 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, + 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, + 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, + 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, + 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, + 0x0378, 0x0379, 0x037a, 0x037b, 0x037c, 0x037d, 0x037e, 0x037f, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x03ac, 0x0387, + 0x03ad, 0x03ae, 0x03af, 0x038b, 0x03cc, 0x038d, 0x03cd, 0x03ce, + 0x0390, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03a2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03ac, 0x03ad, 0x03ae, 0x03af, + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c3, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x03cf, + 0x03b2, 0x03b8, 0x03d2, 0x03d3, 0x03d4, 0x03c6, 0x03c0, 0x03d7, + 0x03d9, 0x03d9, 0x03db, 0x03db, 0x03dd, 0x03dd, 0x03df, 0x03df, + 0x03e1, 0x03e1, 0x03e3, 0x03e3, 0x03e5, 0x03e5, 0x03e7, 0x03e7, + 0x03e9, 0x03e9, 0x03eb, 0x03eb, 0x03ed, 0x03ed, 0x03ef, 0x03ef, + 0x03ba, 0x03c1, 0x03f2, 0x03f3, 0x03b8, 0x03b5, 0x03f6, 0x03f8, + 0x03f8, 0x03f2, 0x03fb, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff +}}; +static UnicodeCaseTableVector caseTable04 = {{ + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, + 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, + 0x0469, 0x0469, 0x046b, 0x046b, 0x046d, 0x046d, 0x046f, 0x046f, + 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477, + 0x0479, 0x0479, 0x047b, 0x047b, 0x047d, 0x047d, 0x047f, 0x047f, + 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0488, 0x0489, 0x048b, 0x048b, 0x048d, 0x048d, 0x048f, 0x048f, + 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, + 0x0499, 0x0499, 0x049b, 0x049b, 0x049d, 0x049d, 0x049f, 0x049f, + 0x04a1, 0x04a1, 0x04a3, 0x04a3, 0x04a5, 0x04a5, 0x04a7, 0x04a7, + 0x04a9, 0x04a9, 0x04ab, 0x04ab, 0x04ad, 0x04ad, 0x04af, 0x04af, + 0x04b1, 0x04b1, 0x04b3, 0x04b3, 0x04b5, 0x04b5, 0x04b7, 0x04b7, + 0x04b9, 0x04b9, 0x04bb, 0x04bb, 0x04bd, 0x04bd, 0x04bf, 0x04bf, + 0x04c0, 0x04c2, 0x04c2, 0x04c4, 0x04c4, 0x04c6, 0x04c6, 0x04c8, + 0x04c8, 0x04ca, 0x04ca, 0x04cc, 0x04cc, 0x04ce, 0x04ce, 0x04cf, + 0x04d1, 0x04d1, 0x04d3, 0x04d3, 0x04d5, 0x04d5, 0x04d7, 0x04d7, + 0x04d9, 0x04d9, 0x04db, 0x04db, 0x04dd, 0x04dd, 0x04df, 0x04df, + 0x04e1, 0x04e1, 0x04e3, 0x04e3, 0x04e5, 0x04e5, 0x04e7, 0x04e7, + 0x04e9, 0x04e9, 0x04eb, 0x04eb, 0x04ed, 0x04ed, 0x04ef, 0x04ef, + 0x04f1, 0x04f1, 0x04f3, 0x04f3, 0x04f5, 0x04f5, 0x04f6, 0x04f7, + 0x04f9, 0x04f9, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff +}}; +static UnicodeCaseTableVector caseTable05 = {{ + 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507, + 0x0509, 0x0509, 0x050b, 0x050b, 0x050d, 0x050d, 0x050f, 0x050f, + 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, + 0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f, + 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, + 0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f, + 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, + 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, + 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, + 0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f, + 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, + 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, + 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, + 0x0588, 0x0589, 0x058a, 0x058b, 0x058c, 0x058d, 0x058e, 0x058f, + 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, + 0x0598, 0x0599, 0x059a, 0x059b, 0x059c, 0x059d, 0x059e, 0x059f, + 0x05a0, 0x05a1, 0x05a2, 0x05a3, 0x05a4, 0x05a5, 0x05a6, 0x05a7, + 0x05a8, 0x05a9, 0x05aa, 0x05ab, 0x05ac, 0x05ad, 0x05ae, 0x05af, + 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, + 0x05b8, 0x05b9, 0x05ba, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, + 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, + 0x05c8, 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf, + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, + 0x05e8, 0x05e9, 0x05ea, 0x05eb, 0x05ec, 0x05ed, 0x05ee, 0x05ef, + 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x05f5, 0x05f6, 0x05f7, + 0x05f8, 0x05f9, 0x05fa, 0x05fb, 0x05fc, 0x05fd, 0x05fe, 0x05ff +}}; +static UnicodeCaseTableVector caseTable1e = {{ + 0x1e01, 0x1e01, 0x1e03, 0x1e03, 0x1e05, 0x1e05, 0x1e07, 0x1e07, + 0x1e09, 0x1e09, 0x1e0b, 0x1e0b, 0x1e0d, 0x1e0d, 0x1e0f, 0x1e0f, + 0x1e11, 0x1e11, 0x1e13, 0x1e13, 0x1e15, 0x1e15, 0x1e17, 0x1e17, + 0x1e19, 0x1e19, 0x1e1b, 0x1e1b, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1f, + 0x1e21, 0x1e21, 0x1e23, 0x1e23, 0x1e25, 0x1e25, 0x1e27, 0x1e27, + 0x1e29, 0x1e29, 0x1e2b, 0x1e2b, 0x1e2d, 0x1e2d, 0x1e2f, 0x1e2f, + 0x1e31, 0x1e31, 0x1e33, 0x1e33, 0x1e35, 0x1e35, 0x1e37, 0x1e37, + 0x1e39, 0x1e39, 0x1e3b, 0x1e3b, 0x1e3d, 0x1e3d, 0x1e3f, 0x1e3f, + 0x1e41, 0x1e41, 0x1e43, 0x1e43, 0x1e45, 0x1e45, 0x1e47, 0x1e47, + 0x1e49, 0x1e49, 0x1e4b, 0x1e4b, 0x1e4d, 0x1e4d, 0x1e4f, 0x1e4f, + 0x1e51, 0x1e51, 0x1e53, 0x1e53, 0x1e55, 0x1e55, 0x1e57, 0x1e57, + 0x1e59, 0x1e59, 0x1e5b, 0x1e5b, 0x1e5d, 0x1e5d, 0x1e5f, 0x1e5f, + 0x1e61, 0x1e61, 0x1e63, 0x1e63, 0x1e65, 0x1e65, 0x1e67, 0x1e67, + 0x1e69, 0x1e69, 0x1e6b, 0x1e6b, 0x1e6d, 0x1e6d, 0x1e6f, 0x1e6f, + 0x1e71, 0x1e71, 0x1e73, 0x1e73, 0x1e75, 0x1e75, 0x1e77, 0x1e77, + 0x1e79, 0x1e79, 0x1e7b, 0x1e7b, 0x1e7d, 0x1e7d, 0x1e7f, 0x1e7f, + 0x1e81, 0x1e81, 0x1e83, 0x1e83, 0x1e85, 0x1e85, 0x1e87, 0x1e87, + 0x1e89, 0x1e89, 0x1e8b, 0x1e8b, 0x1e8d, 0x1e8d, 0x1e8f, 0x1e8f, + 0x1e91, 0x1e91, 0x1e93, 0x1e93, 0x1e95, 0x1e95, 0x1e96, 0x1e97, + 0x1e98, 0x1e99, 0x1e9a, 0x1e61, 0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f, + 0x1ea1, 0x1ea1, 0x1ea3, 0x1ea3, 0x1ea5, 0x1ea5, 0x1ea7, 0x1ea7, + 0x1ea9, 0x1ea9, 0x1eab, 0x1eab, 0x1ead, 0x1ead, 0x1eaf, 0x1eaf, + 0x1eb1, 0x1eb1, 0x1eb3, 0x1eb3, 0x1eb5, 0x1eb5, 0x1eb7, 0x1eb7, + 0x1eb9, 0x1eb9, 0x1ebb, 0x1ebb, 0x1ebd, 0x1ebd, 0x1ebf, 0x1ebf, + 0x1ec1, 0x1ec1, 0x1ec3, 0x1ec3, 0x1ec5, 0x1ec5, 0x1ec7, 0x1ec7, + 0x1ec9, 0x1ec9, 0x1ecb, 0x1ecb, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecf, + 0x1ed1, 0x1ed1, 0x1ed3, 0x1ed3, 0x1ed5, 0x1ed5, 0x1ed7, 0x1ed7, + 0x1ed9, 0x1ed9, 0x1edb, 0x1edb, 0x1edd, 0x1edd, 0x1edf, 0x1edf, + 0x1ee1, 0x1ee1, 0x1ee3, 0x1ee3, 0x1ee5, 0x1ee5, 0x1ee7, 0x1ee7, + 0x1ee9, 0x1ee9, 0x1eeb, 0x1eeb, 0x1eed, 0x1eed, 0x1eef, 0x1eef, + 0x1ef1, 0x1ef1, 0x1ef3, 0x1ef3, 0x1ef5, 0x1ef5, 0x1ef7, 0x1ef7, + 0x1ef9, 0x1ef9, 0x1efa, 0x1efb, 0x1efc, 0x1efd, 0x1efe, 0x1eff +}}; +static UnicodeCaseTableVector caseTable1f = {{ + 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, + 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, + 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f16, 0x1f17, + 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f1e, 0x1f1f, + 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, + 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, + 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, + 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, + 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f46, 0x1f47, + 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f4e, 0x1f4f, + 0x1f50, 0x1f51, 0x1f52, 0x1f53, 0x1f54, 0x1f55, 0x1f56, 0x1f57, + 0x1f58, 0x1f51, 0x1f5a, 0x1f53, 0x1f5c, 0x1f55, 0x1f5e, 0x1f57, + 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, + 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, + 0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1f76, 0x1f77, + 0x1f78, 0x1f79, 0x1f7a, 0x1f7b, 0x1f7c, 0x1f7d, 0x1f7e, 0x1f7f, + 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, + 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, + 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, + 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, + 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, + 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, + 0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7, + 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0x1fbd, 0x03b9, 0x1fbf, + 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, 0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7, + 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0x1fcd, 0x1fce, 0x1fcf, + 0x1fd0, 0x1fd1, 0x1fd2, 0x1fd3, 0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7, + 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fdc, 0x1fdd, 0x1fde, 0x1fdf, + 0x1fe0, 0x1fe1, 0x1fe2, 0x1fe3, 0x1fe4, 0x1fe5, 0x1fe6, 0x1fe7, + 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1fed, 0x1fee, 0x1fef, + 0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7, + 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0x1ffd, 0x1ffe, 0x1fff +}}; +static UnicodeCaseTableVector caseTable21 = {{ + 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, + 0x2108, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x210e, 0x210f, + 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, + 0x2118, 0x2119, 0x211a, 0x211b, 0x211c, 0x211d, 0x211e, 0x211f, + 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x03c9, 0x2127, + 0x2128, 0x2129, 0x006b, 0x00e5, 0x212c, 0x212d, 0x212e, 0x212f, + 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, + 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, 0x213f, + 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, + 0x2148, 0x2149, 0x214a, 0x214b, 0x214c, 0x214d, 0x214e, 0x214f, + 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x215f, + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, + 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, + 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, + 0x2188, 0x2189, 0x218a, 0x218b, 0x218c, 0x218d, 0x218e, 0x218f, + 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, + 0x2198, 0x2199, 0x219a, 0x219b, 0x219c, 0x219d, 0x219e, 0x219f, + 0x21a0, 0x21a1, 0x21a2, 0x21a3, 0x21a4, 0x21a5, 0x21a6, 0x21a7, + 0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ad, 0x21ae, 0x21af, + 0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b4, 0x21b5, 0x21b6, 0x21b7, + 0x21b8, 0x21b9, 0x21ba, 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21bf, + 0x21c0, 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c6, 0x21c7, + 0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cc, 0x21cd, 0x21ce, 0x21cf, + 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x21d5, 0x21d6, 0x21d7, + 0x21d8, 0x21d9, 0x21da, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df, + 0x21e0, 0x21e1, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e6, 0x21e7, + 0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21ec, 0x21ed, 0x21ee, 0x21ef, + 0x21f0, 0x21f1, 0x21f2, 0x21f3, 0x21f4, 0x21f5, 0x21f6, 0x21f7, + 0x21f8, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fd, 0x21fe, 0x21ff +}}; +static UnicodeCaseTableVector caseTable24 = {{ + 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, + 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, + 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, + 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, + 0x2420, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, + 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, + 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, + 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, + 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, + 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, + 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, + 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, + 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, + 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, + 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, + 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, + 0x2498, 0x2499, 0x249a, 0x249b, 0x249c, 0x249d, 0x249e, 0x249f, + 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, + 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, + 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x24d0, 0x24d1, + 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, + 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, + 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, + 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, + 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, + 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, + 0x24e8, 0x24e9, 0x24ea, 0x24eb, 0x24ec, 0x24ed, 0x24ee, 0x24ef, + 0x24f0, 0x24f1, 0x24f2, 0x24f3, 0x24f4, 0x24f5, 0x24f6, 0x24f7, + 0x24f8, 0x24f9, 0x24fa, 0x24fb, 0x24fc, 0x24fd, 0x24fe, 0x24ff +}}; +static UnicodeCaseTableVector caseTableff = {{ + 0xff00, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, + 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, + 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, + 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, + 0xff20, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, + 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, + 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, + 0xff58, 0xff59, 0xff5a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, + 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, + 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, + 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, + 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f, + 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, + 0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, + 0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, + 0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, + 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, + 0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, + 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, + 0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, + 0xffa0, 0xffa1, 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, + 0xffa8, 0xffa9, 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, + 0xffb0, 0xffb1, 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, + 0xffb8, 0xffb9, 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf, + 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, + 0xffc8, 0xffc9, 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, + 0xffd0, 0xffd1, 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, + 0xffd8, 0xffd9, 0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf, + 0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7, + 0xffe8, 0xffe9, 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef, + 0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7, + 0xfff8, 0xfff9, 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff +}}; +static UnicodeCaseTableVector *caseTable[256] = { + &caseTable00, + &caseTable01, + &caseTable02, + &caseTable03, + &caseTable04, + &caseTable05, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &caseTable1e, + &caseTable1f, + NULL, + &caseTable21, + NULL, + NULL, + &caseTable24, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &caseTableff +}; + +static inline char getType(Unicode c) { + int i; + char type; + + if (c > 0xffff) { + type = 'X'; + } else { + i = (c >> 8) & 0xff; + if ((type = typeTable[i].type) == 'X') { + type = typeTable[i].vector[c & 0xff]; + } + } + return type; +} + +GBool unicodeTypeL(Unicode c) { + return getType(c) == 'L'; +} + +GBool unicodeTypeR(Unicode c) { + return getType(c) == 'R'; +} + +Unicode unicodeToUpper(Unicode c) { + int i; + + if (c > 0xffff) { + return c; + } + i = (c >> 8) & 0xff; + if (caseTable[i]) { + return caseTable[i]->codes[c & 0xff]; + } + return c; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h new file mode 100644 index 000000000..7103dbddf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h @@ -0,0 +1,20 @@ +//======================================================================== +// +// UnicodeTypeTable.h +// +// Copyright 2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef UNICODETYPETABLE_H +#define UNICODETYPETABLE_H + +#include "gtypes.h" + +extern GBool unicodeTypeL(Unicode c); + +extern GBool unicodeTypeR(Unicode c); + +extern Unicode unicodeToUpper(Unicode c); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc new file mode 100644 index 000000000..6a5b6c83b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc @@ -0,0 +1,896 @@ +//======================================================================== +// +// XRef.cc +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include +#include +#include +#include +#include "gmem.h" +#include "Object.h" +#include "Stream.h" +#include "Lexer.h" +#include "Parser.h" +#include "Dict.h" +#include "Error.h" +#include "ErrorCodes.h" +#include "XRef.h" + +//------------------------------------------------------------------------ + +#define xrefSearchSize 1024 // read this many bytes at end of file + // to look for 'startxref' + +//------------------------------------------------------------------------ +// Permission bits +//------------------------------------------------------------------------ + +#define permPrint (1<<2) +#define permChange (1<<3) +#define permCopy (1<<4) +#define permNotes (1<<5) +#define defPermFlags 0xfffc + +//------------------------------------------------------------------------ +// ObjectStream +//------------------------------------------------------------------------ + +class ObjectStream { +public: + + // Create an object stream, using object number , + // generation 0. + ObjectStream(XRef *xref, int objStrNumA); + + ~ObjectStream(); + + // Return the object number of this object stream. + int getObjStrNum() { return objStrNum; } + + // Get the th object from this stream, which should be + // object number , generation 0. + Object *getObject(int objIdx, int objNum, Object *obj); + +private: + + int objStrNum; // object number of the object stream + int nObjects; // number of objects in the stream + Object *objs; // the objects (length = nObjects) + int *objNums; // the object numbers (length = nObjects) +}; + +ObjectStream::ObjectStream(XRef *xref, int objStrNumA) { + Stream *str; + Parser *parser; + int *offsets; + Object objStr, obj1, obj2; + int first, i; + + objStrNum = objStrNumA; + nObjects = 0; + objs = NULL; + objNums = NULL; + + if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) { + goto err1; + } + + if (!objStr.streamGetDict()->lookup("N", &obj1)->isInt()) { + obj1.free(); + goto err1; + } + nObjects = obj1.getInt(); + obj1.free(); + if (nObjects <= 0) { + goto err1; + } + + if (!objStr.streamGetDict()->lookup("First", &obj1)->isInt()) { + obj1.free(); + goto err1; + } + first = obj1.getInt(); + obj1.free(); + if (first < 0) { + goto err1; + } + + objs = new Object[nObjects]; + objNums = (int *)gmallocn(nObjects, sizeof(int)); + offsets = (int *)gmallocn(nObjects, sizeof(int)); + + // parse the header: object numbers and offsets + objStr.streamReset(); + obj1.initNull(); + str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first); + parser = new Parser(xref, new Lexer(xref, str), gFalse); + for (i = 0; i < nObjects; ++i) { + parser->getObj(&obj1); + parser->getObj(&obj2); + if (!obj1.isInt() || !obj2.isInt()) { + obj1.free(); + obj2.free(); + delete parser; + gfree(offsets); + goto err1; + } + objNums[i] = obj1.getInt(); + offsets[i] = obj2.getInt(); + obj1.free(); + obj2.free(); + if (objNums[i] < 0 || offsets[i] < 0 || + (i > 0 && offsets[i] < offsets[i-1])) { + delete parser; + gfree(offsets); + goto err1; + } + } + while (str->getChar() != EOF) ; + delete parser; + + // skip to the first object - this shouldn't be necessary because + // the First key is supposed to be equal to offsets[0], but just in + // case... + for (i = first; i < offsets[0]; ++i) { + objStr.getStream()->getChar(); + } + + // parse the objects + for (i = 0; i < nObjects; ++i) { + obj1.initNull(); + if (i == nObjects - 1) { + str = new EmbedStream(objStr.getStream(), &obj1, gFalse, 0); + } else { + str = new EmbedStream(objStr.getStream(), &obj1, gTrue, + offsets[i+1] - offsets[i]); + } + parser = new Parser(xref, new Lexer(xref, str), gFalse); + parser->getObj(&objs[i]); + while (str->getChar() != EOF) ; + delete parser; + } + + gfree(offsets); + + err1: + objStr.free(); + return; +} + +ObjectStream::~ObjectStream() { + int i; + + if (objs) { + for (i = 0; i < nObjects; ++i) { + objs[i].free(); + } + delete[] objs; + } + gfree(objNums); +} + +Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) { + if (objIdx < 0 || objIdx >= nObjects || objNum != objNums[objIdx]) { + return obj->initNull(); + } + return objs[objIdx].copy(obj); +} + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +XRef::XRef(BaseStream *strA) { + Guint pos; + Object obj; + + ok = gTrue; + errCode = errNone; + size = 0; + entries = NULL; + streamEnds = NULL; + streamEndsLen = 0; + objStr = NULL; + + encrypted = gFalse; + permFlags = defPermFlags; + ownerPasswordOk = gFalse; + + // read the trailer + str = strA; + start = str->getStart(); + pos = getStartXref(); + + // if there was a problem with the 'startxref' position, try to + // reconstruct the xref table + if (pos == 0) { + if (!(ok = constructXRef())) { + errCode = errDamaged; + return; + } + + // read the xref table + } else { + while (readXRef(&pos)) ; + + // if there was a problem with the xref table, + // try to reconstruct it + if (!ok) { + if (!(ok = constructXRef())) { + errCode = errDamaged; + return; + } + } + } + + // get the root dictionary (catalog) object + trailerDict.dictLookupNF("Root", &obj); + if (obj.isRef()) { + rootNum = obj.getRefNum(); + rootGen = obj.getRefGen(); + obj.free(); + } else { + obj.free(); + if (!(ok = constructXRef())) { + errCode = errDamaged; + return; + } + } + + // now set the trailer dictionary's xref pointer so we can fetch + // indirect objects from it + trailerDict.getDict()->setXRef(this); +} + +XRef::~XRef() { + gfree(entries); + trailerDict.free(); + if (streamEnds) { + gfree(streamEnds); + } + if (objStr) { + delete objStr; + } +} + +// Read the 'startxref' position. +Guint XRef::getStartXref() { + char buf[xrefSearchSize+1]; + char *p; + int c, n, i; + + // read last xrefSearchSize bytes + str->setPos(xrefSearchSize, -1); + for (n = 0; n < xrefSearchSize; ++n) { + if ((c = str->getChar()) == EOF) { + break; + } + buf[n] = c; + } + buf[n] = '\0'; + + // find startxref + for (i = n - 9; i >= 0; --i) { + if (!strncmp(&buf[i], "startxref", 9)) { + break; + } + } + if (i < 0) { + return 0; + } + for (p = &buf[i+9]; isspace(*p); ++p) ; + lastXRefPos = strToUnsigned(p); + + return lastXRefPos; +} + +// Read one xref table section. Also reads the associated trailer +// dictionary, and returns the prev pointer (if any). +GBool XRef::readXRef(Guint *pos) { + Parser *parser; + Object obj; + GBool more; + + // start up a parser, parse one token + obj.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, + str->makeSubStream(start + *pos, gFalse, 0, &obj)), + gTrue); + parser->getObj(&obj); + + // parse an old-style xref table + if (obj.isCmd("xref")) { + obj.free(); + more = readXRefTable(parser, pos); + + // parse an xref stream + } else if (obj.isInt()) { + obj.free(); + if (!parser->getObj(&obj)->isInt()) { + goto err1; + } + obj.free(); + if (!parser->getObj(&obj)->isCmd("obj")) { + goto err1; + } + obj.free(); + if (!parser->getObj(&obj)->isStream()) { + goto err1; + } + more = readXRefStream(obj.getStream(), pos); + obj.free(); + + } else { + goto err1; + } + + delete parser; + return more; + + err1: + obj.free(); + delete parser; + ok = gFalse; + return gFalse; +} + +GBool XRef::readXRefTable(Parser *parser, Guint *pos) { + XRefEntry entry; + GBool more; + Object obj, obj2; + Guint pos2; + int first, n, newSize, i; + + while (1) { + parser->getObj(&obj); + if (obj.isCmd("trailer")) { + obj.free(); + break; + } + if (!obj.isInt()) { + goto err1; + } + first = obj.getInt(); + obj.free(); + if (!parser->getObj(&obj)->isInt()) { + goto err1; + } + n = obj.getInt(); + obj.free(); + if (first < 0 || n < 0 || first + n < 0) { + goto err1; + } + if (first + n > size) { + for (newSize = size ? 2 * size : 1024; + first + n > newSize && newSize > 0; + newSize <<= 1) ; + if (newSize < 0) { + goto err1; + } + entries = (XRefEntry *)greallocn(entries, newSize, sizeof(XRefEntry)); + for (i = size; i < newSize; ++i) { + entries[i].offset = 0xffffffff; + entries[i].type = xrefEntryFree; + } + size = newSize; + } + for (i = first; i < first + n; ++i) { + if (!parser->getObj(&obj)->isInt()) { + goto err1; + } + entry.offset = (Guint)obj.getInt(); + obj.free(); + if (!parser->getObj(&obj)->isInt()) { + goto err1; + } + entry.gen = obj.getInt(); + obj.free(); + parser->getObj(&obj); + if (obj.isCmd("n")) { + entry.type = xrefEntryUncompressed; + } else if (obj.isCmd("f")) { + entry.type = xrefEntryFree; + } else { + goto err1; + } + obj.free(); + if (entries[i].offset == 0xffffffff) { + entries[i] = entry; + // PDF files of patents from the IBM Intellectual Property + // Network have a bug: the xref table claims to start at 1 + // instead of 0. + if (i == 1 && first == 1 && + entries[1].offset == 0 && entries[1].gen == 65535 && + entries[1].type == xrefEntryFree) { + i = first = 0; + entries[0] = entries[1]; + entries[1].offset = 0xffffffff; + } + } + } + } + + // read the trailer dictionary + if (!parser->getObj(&obj)->isDict()) { + goto err1; + } + + // get the 'Prev' pointer + obj.getDict()->lookupNF("Prev", &obj2); + if (obj2.isInt()) { + *pos = (Guint)obj2.getInt(); + more = gTrue; + } else if (obj2.isRef()) { + // certain buggy PDF generators generate "/Prev NNN 0 R" instead + // of "/Prev NNN" + *pos = (Guint)obj2.getRefNum(); + more = gTrue; + } else { + more = gFalse; + } + obj2.free(); + + // save the first trailer dictionary + if (trailerDict.isNone()) { + obj.copy(&trailerDict); + } + + // check for an 'XRefStm' key + if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) { + pos2 = (Guint)obj2.getInt(); + readXRef(&pos2); + if (!ok) { + obj2.free(); + goto err1; + } + } + obj2.free(); + + obj.free(); + return more; + + err1: + obj.free(); + ok = gFalse; + return gFalse; +} + +GBool XRef::readXRefStream(Stream *xrefStr, Guint *pos) { + Dict *dict; + int w[3]; + GBool more; + Object obj, obj2, idx; + int newSize, first, n, i; + + dict = xrefStr->getDict(); + + if (!dict->lookupNF("Size", &obj)->isInt()) { + goto err1; + } + newSize = obj.getInt(); + obj.free(); + if (newSize < 0) { + goto err1; + } + if (newSize > size) { + entries = (XRefEntry *)greallocn(entries, newSize, sizeof(XRefEntry)); + for (i = size; i < newSize; ++i) { + entries[i].offset = 0xffffffff; + entries[i].type = xrefEntryFree; + } + size = newSize; + } + + if (!dict->lookupNF("W", &obj)->isArray() || + obj.arrayGetLength() < 3) { + goto err1; + } + for (i = 0; i < 3; ++i) { + if (!obj.arrayGet(i, &obj2)->isInt()) { + obj2.free(); + goto err1; + } + w[i] = obj2.getInt(); + obj2.free(); + if (w[i] < 0 || w[i] > 4) { + goto err1; + } + } + obj.free(); + + xrefStr->reset(); + dict->lookupNF("Index", &idx); + if (idx.isArray()) { + for (i = 0; i+1 < idx.arrayGetLength(); i += 2) { + if (!idx.arrayGet(i, &obj)->isInt()) { + idx.free(); + goto err1; + } + first = obj.getInt(); + obj.free(); + if (!idx.arrayGet(i+1, &obj)->isInt()) { + idx.free(); + goto err1; + } + n = obj.getInt(); + obj.free(); + if (first < 0 || n < 0 || + !readXRefStreamSection(xrefStr, w, first, n)) { + idx.free(); + goto err0; + } + } + } else { + if (!readXRefStreamSection(xrefStr, w, 0, newSize)) { + idx.free(); + goto err0; + } + } + idx.free(); + + dict->lookupNF("Prev", &obj); + if (obj.isInt()) { + *pos = (Guint)obj.getInt(); + more = gTrue; + } else { + more = gFalse; + } + obj.free(); + if (trailerDict.isNone()) { + trailerDict.initDict(dict); + } + + return more; + + err1: + obj.free(); + err0: + ok = gFalse; + return gFalse; +} + +GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) { + Guint offset; + int type, gen, c, newSize, i, j; + + if (first + n < 0) { + return gFalse; + } + if (first + n > size) { + for (newSize = size ? 2 * size : 1024; + first + n > newSize && newSize > 0; + newSize <<= 1) ; + if (newSize < 0) { + return gFalse; + } + entries = (XRefEntry *)greallocn(entries, newSize, sizeof(XRefEntry)); + for (i = size; i < newSize; ++i) { + entries[i].offset = 0xffffffff; + entries[i].type = xrefEntryFree; + } + size = newSize; + } + for (i = first; i < first + n; ++i) { + if (w[0] == 0) { + type = 1; + } else { + for (type = 0, j = 0; j < w[0]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + type = (type << 8) + c; + } + } + for (offset = 0, j = 0; j < w[1]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + offset = (offset << 8) + c; + } + for (gen = 0, j = 0; j < w[2]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + gen = (gen << 8) + c; + } + if (entries[i].offset == 0xffffffff) { + switch (type) { + case 0: + entries[i].offset = offset; + entries[i].gen = gen; + entries[i].type = xrefEntryFree; + break; + case 1: + entries[i].offset = offset; + entries[i].gen = gen; + entries[i].type = xrefEntryUncompressed; + break; + case 2: + entries[i].offset = offset; + entries[i].gen = gen; + entries[i].type = xrefEntryCompressed; + break; + default: + return gFalse; + } + } + } + + return gTrue; +} + +// Attempt to construct an xref table for a damaged file. +GBool XRef::constructXRef() { + Parser *parser; + Object newTrailerDict, obj; + char buf[256]; + Guint pos; + int num, gen; + int newSize; + int streamEndsSize; + char *p; + int i; + GBool gotRoot; + + gfree(entries); + size = 0; + entries = NULL; + + error(-1, "PDF file is damaged - attempting to reconstruct xref table..."); + gotRoot = gFalse; + streamEndsLen = streamEndsSize = 0; + + str->reset(); + while (1) { + pos = str->getPos(); + if (!str->getLine(buf, 256)) { + break; + } + p = buf; + + // skip whitespace + while (*p && Lexer::isSpace(*p & 0xff)) ++p; + + // got trailer dictionary + if (!strncmp(p, "trailer", 7)) { + obj.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, + str->makeSubStream(pos + 7, gFalse, 0, &obj)), + gFalse); + parser->getObj(&newTrailerDict); + if (newTrailerDict.isDict()) { + newTrailerDict.dictLookupNF("Root", &obj); + if (obj.isRef()) { + rootNum = obj.getRefNum(); + rootGen = obj.getRefGen(); + if (!trailerDict.isNone()) { + trailerDict.free(); + } + newTrailerDict.copy(&trailerDict); + gotRoot = gTrue; + } + obj.free(); + } + newTrailerDict.free(); + delete parser; + + // look for object + } else if (isdigit(*p)) { + num = atoi(p); + if (num > 0) { + do { + ++p; + } while (*p && isdigit(*p)); + if (isspace(*p)) { + do { + ++p; + } while (*p && isspace(*p)); + if (isdigit(*p)) { + gen = atoi(p); + do { + ++p; + } while (*p && isdigit(*p)); + if (isspace(*p)) { + do { + ++p; + } while (*p && isspace(*p)); + if (!strncmp(p, "obj", 3)) { + if (num >= size) { + newSize = (num + 1 + 255) & ~255; + if (newSize < 0) { + error(-1, "Bad object number"); + return gFalse; + } + entries = (XRefEntry *) + greallocn(entries, newSize, sizeof(XRefEntry)); + for (i = size; i < newSize; ++i) { + entries[i].offset = 0xffffffff; + entries[i].type = xrefEntryFree; + } + size = newSize; + } + if (entries[num].type == xrefEntryFree || + gen >= entries[num].gen) { + entries[num].offset = pos - start; + entries[num].gen = gen; + entries[num].type = xrefEntryUncompressed; + } + } + } + } + } + } + + } else if (!strncmp(p, "endstream", 9)) { + if (streamEndsLen == streamEndsSize) { + streamEndsSize += 64; + streamEnds = (Guint *)greallocn(streamEnds, + streamEndsSize, sizeof(int)); + } + streamEnds[streamEndsLen++] = pos; + } + } + + if (gotRoot) + return gTrue; + + error(-1, "Couldn't find trailer dictionary"); + return gFalse; +} + +void XRef::setEncryption(int permFlagsA, GBool ownerPasswordOkA, + Guchar *fileKeyA, int keyLengthA, int encVersionA, + CryptAlgorithm encAlgorithmA) { + int i; + + encrypted = gTrue; + permFlags = permFlagsA; + ownerPasswordOk = ownerPasswordOkA; + if (keyLengthA <= 16) { + keyLength = keyLengthA; + } else { + keyLength = 16; + } + for (i = 0; i < keyLength; ++i) { + fileKey[i] = fileKeyA[i]; + } + encVersion = encVersionA; + encAlgorithm = encAlgorithmA; +} + +GBool XRef::okToPrint(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permPrint); +} + +GBool XRef::okToChange(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permChange); +} + +GBool XRef::okToCopy(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permCopy); +} + +GBool XRef::okToAddNotes(GBool ignoreOwnerPW) { + return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permNotes); +} + +Object *XRef::fetch(int num, int gen, Object *obj) { + XRefEntry *e; + Parser *parser; + Object obj1, obj2, obj3; + + // check for bogus ref - this can happen in corrupted PDF files + if (num < 0 || num >= size) { + goto err; + } + + e = &entries[num]; + switch (e->type) { + + case xrefEntryUncompressed: + if (e->gen != gen) { + goto err; + } + obj1.initNull(); + parser = new Parser(this, + new Lexer(this, + str->makeSubStream(start + e->offset, gFalse, 0, &obj1)), + gTrue); + parser->getObj(&obj1); + parser->getObj(&obj2); + parser->getObj(&obj3); + if (!obj1.isInt() || obj1.getInt() != num || + !obj2.isInt() || obj2.getInt() != gen || + !obj3.isCmd("obj")) { + obj1.free(); + obj2.free(); + obj3.free(); + delete parser; + goto err; + } + parser->getObj(obj, encrypted ? fileKey : (Guchar *)NULL, + encAlgorithm, keyLength, num, gen); + obj1.free(); + obj2.free(); + obj3.free(); + delete parser; + break; + + case xrefEntryCompressed: + if (gen != 0) { + goto err; + } + if (!objStr || objStr->getObjStrNum() != (int)e->offset) { + if (objStr) { + delete objStr; + } + objStr = new ObjectStream(this, e->offset); + } + objStr->getObject(e->gen, num, obj); + break; + + default: + goto err; + } + + return obj; + + err: + return obj->initNull(); +} + +Object *XRef::getDocInfo(Object *obj) { + return trailerDict.dictLookup("Info", obj); +} + +// Added for the pdftex project. +Object *XRef::getDocInfoNF(Object *obj) { + return trailerDict.dictLookupNF("Info", obj); +} + +GBool XRef::getStreamEnd(Guint streamStart, Guint *streamEnd) { + int a, b, m; + + if (streamEndsLen == 0 || + streamStart > streamEnds[streamEndsLen - 1]) { + return gFalse; + } + + a = -1; + b = streamEndsLen - 1; + // invariant: streamEnds[a] < streamStart <= streamEnds[b] + while (b - a > 1) { + m = (a + b) / 2; + if (streamStart <= streamEnds[m]) { + b = m; + } else { + a = m; + } + } + *streamEnd = streamEnds[b]; + return gTrue; +} + +Guint XRef::strToUnsigned(char *s) { + Guint x; + char *p; + int i; + + x = 0; + for (p = s, i = 0; *p && isdigit(*p) && i < 10; ++p, ++i) { + x = 10 * x + (*p - '0'); + } + return x; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h new file mode 100644 index 000000000..8a5e66c02 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h @@ -0,0 +1,133 @@ +//======================================================================== +// +// XRef.h +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef XREF_H +#define XREF_H + +#include + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "gtypes.h" +#include "Object.h" + +class Dict; +class Stream; +class Parser; +class ObjectStream; + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +enum XRefEntryType { + xrefEntryFree, + xrefEntryUncompressed, + xrefEntryCompressed +}; + +struct XRefEntry { + Guint offset; + int gen; + XRefEntryType type; +}; + +class XRef { +public: + + // Constructor. Read xref table from stream. + XRef(BaseStream *strA); + + // Destructor. + ~XRef(); + + // Is xref table valid? + GBool isOk() { return ok; } + + // Get the error code (if isOk() returns false). + int getErrorCode() { return errCode; } + + // Set the encryption parameters. + void setEncryption(int permFlagsA, GBool ownerPasswordOkA, + Guchar *fileKeyA, int keyLengthA, int encVersionA, + CryptAlgorithm encAlgorithmA); + + // Is the file encrypted? + GBool isEncrypted() { return encrypted; } + + // Check various permissions. + GBool okToPrint(GBool ignoreOwnerPW = gFalse); + GBool okToChange(GBool ignoreOwnerPW = gFalse); + GBool okToCopy(GBool ignoreOwnerPW = gFalse); + GBool okToAddNotes(GBool ignoreOwnerPW = gFalse); + + // Get catalog object. + Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); } + + // Fetch an indirect reference. + Object *fetch(int num, int gen, Object *obj); + + // Return the document's Info dictionary (if any). + Object *getDocInfo(Object *obj); + Object *getDocInfoNF(Object *obj); + + // Return the number of objects in the xref table. + int getNumObjects() { return size; } + + // Return the offset of the last xref table. + Guint getLastXRefPos() { return lastXRefPos; } + + // Return the catalog object reference. + int getRootNum() { return rootNum; } + int getRootGen() { return rootGen; } + + // Get end position for a stream in a damaged file. + // Returns false if unknown or file is not damaged. + GBool getStreamEnd(Guint streamStart, Guint *streamEnd); + + // Direct access. + int getSize() { return size; } + XRefEntry *getEntry(int i) { return &entries[i]; } + Object *getTrailerDict() { return &trailerDict; } + +private: + + BaseStream *str; // input stream + Guint start; // offset in file (to allow for garbage + // at beginning of file) + XRefEntry *entries; // xref entries + int size; // size of array + int rootNum, rootGen; // catalog dict + GBool ok; // true if xref table is valid + int errCode; // error code (if is false) + Object trailerDict; // trailer dictionary + Guint lastXRefPos; // offset of last xref table + Guint *streamEnds; // 'endstream' positions - only used in + // damaged files + int streamEndsLen; // number of valid entries in streamEnds + ObjectStream *objStr; // cached object stream + GBool encrypted; // true if file is encrypted + int permFlags; // permission bits + GBool ownerPasswordOk; // true if owner password is correct + Guchar fileKey[16]; // file decryption key + int keyLength; // length of key, in bytes + int encVersion; // encryption version + CryptAlgorithm encAlgorithm; // encryption algorithm + + Guint getStartXref(); + GBool readXRef(Guint *pos); + GBool readXRefTable(Parser *parser, Guint *pos); + GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); + GBool readXRefStream(Stream *xrefStr, Guint *pos); + GBool constructXRef(); + Guint strToUnsigned(char *s); +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h new file mode 100644 index 000000000..81d4dd071 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h @@ -0,0 +1,112 @@ +//======================================================================== +// +// config.h +// +// Copyright 1996-2007 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef CONFIG_H +#define CONFIG_H + +//------------------------------------------------------------------------ +// version +//------------------------------------------------------------------------ + +// xpdf version +#define xpdfVersion "3.02" +#define xpdfVersionNum 3.02 +#define xpdfMajorVersion 3 +#define xpdfMinorVersion 2 +#define xpdfUpdateVersion 0 +#define xpdfMajorVersionStr "3" +#define xpdfMinorVersionStr "2" +#define xpdfUpdateVersionStr "0" + +// supported PDF version +#define supportedPDFVersionStr "1.7" +#define supportedPDFVersionNum 1.7 + +// copyright notice +#define xpdfCopyright "Copyright 1996-2007 Glyph & Cog, LLC" + +// Windows resource file stuff +#define winxpdfVersion "WinXpdf 3.02" +#define xpdfCopyrightAmp "Copyright 1996-2007 Glyph && Cog, LLC" + +//------------------------------------------------------------------------ +// paper size +//------------------------------------------------------------------------ + +// default paper size (in points) for PostScript output +#ifdef A4_PAPER +#define defPaperWidth 595 // ISO A4 (210x297 mm) +#define defPaperHeight 842 +#else +#define defPaperWidth 612 // American letter (8.5x11") +#define defPaperHeight 792 +#endif + +//------------------------------------------------------------------------ +// config file (xpdfrc) path +//------------------------------------------------------------------------ + +// user config file name, relative to the user's home directory +#if defined(VMS) || (defined(WIN32) && !defined(__CYGWIN32__)) +#define xpdfUserConfigFile "xpdfrc" +#else +#define xpdfUserConfigFile ".xpdfrc" +#endif + +// system config file name (set via the configure script) +#ifdef SYSTEM_XPDFRC +#define xpdfSysConfigFile SYSTEM_XPDFRC +#else +// under Windows, we get the directory with the executable and then +// append this file name +#define xpdfSysConfigFile "xpdfrc" +#endif + +//------------------------------------------------------------------------ +// X-related constants +//------------------------------------------------------------------------ + +// default maximum size of color cube to allocate +#define defaultRGBCube 5 + +// number of fonts (combined t1lib, FreeType, X server) to cache +#define xOutFontCacheSize 64 + +// number of Type 3 fonts to cache +#define xOutT3FontCacheSize 8 + +//------------------------------------------------------------------------ +// popen +//------------------------------------------------------------------------ + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define popen _popen +#define pclose _pclose +#endif + +#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(WIN32) || defined(__DJGPP__) || defined(MACOS) +#define POPEN_READ_MODE "rb" +#else +#define POPEN_READ_MODE "r" +#endif + +//------------------------------------------------------------------------ +// Win32 stuff +//------------------------------------------------------------------------ + +#ifdef CDECL +#undef CDECL +#endif + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define CDECL __cdecl +#else +#define CDECL +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc new file mode 100644 index 000000000..b2ec1735c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc @@ -0,0 +1,777 @@ +//======================================================================== +// +// gfile.cc +// +// Miscellaneous file and directory name manipulation. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#include + +#ifdef WIN32 +# include +#else +# if defined(MACOS) +# include +# elif !defined(ACORN) +# include +# include +# include +# endif +# include +# include +# if !defined(VMS) && !defined(ACORN) && !defined(MACOS) +# include +# endif +# if defined(VMS) && (__DECCXX_VER < 50200000) +# include +# endif +#endif // WIN32 +#include "GString.h" +#include "gfile.h" + +// Some systems don't define this, so just make it something reasonably +// large. +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +//------------------------------------------------------------------------ + +GString *getHomeDir() { +#ifdef VMS + //---------- VMS ---------- + return new GString("SYS$LOGIN:"); + +#elif defined(__EMX__) || defined(WIN32) + //---------- OS/2+EMX and Win32 ---------- + char *s; + GString *ret; + + if ((s = getenv("HOME"))) + ret = new GString(s); + else + ret = new GString("."); + return ret; + +#elif defined(ACORN) + //---------- RISCOS ---------- + return new GString("@"); + +#elif defined(MACOS) + //---------- MacOS ---------- + return new GString(":"); + +#else + //---------- Unix ---------- + char *s; + struct passwd *pw; + GString *ret; + + if ((s = getenv("HOME"))) { + ret = new GString(s); + } else { + if ((s = getenv("USER"))) + pw = getpwnam(s); + else + pw = getpwuid(getuid()); + if (pw) + ret = new GString(pw->pw_dir); + else + ret = new GString("."); + } + return ret; +#endif +} + +GString *getCurrentDir() { + char buf[PATH_MAX+1]; + +#if defined(__EMX__) + if (_getcwd2(buf, sizeof(buf))) +#elif defined(WIN32) + if (GetCurrentDirectory(sizeof(buf), buf)) +#elif defined(ACORN) + if (strcpy(buf, "@")) +#elif defined(MACOS) + if (strcpy(buf, ":")) +#else + if (getcwd(buf, sizeof(buf))) +#endif + return new GString(buf); + return new GString(); +} + +GString *appendToPath(GString *path, char *fileName) { +#if defined(VMS) + //---------- VMS ---------- + //~ this should handle everything necessary for file + //~ requesters, but it's certainly not complete + char *p0, *p1, *p2; + char *q1; + + p0 = path->getCString(); + p1 = p0 + path->getLength() - 1; + if (!strcmp(fileName, "-")) { + if (*p1 == ']') { + for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ; + if (*p2 == '[') + ++p2; + path->del(p2 - p0, p1 - p2); + } else if (*p1 == ':') { + path->append("[-]"); + } else { + path->clear(); + path->append("[-]"); + } + } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) { + if (*p1 == ']') { + path->insert(p1 - p0, '.'); + path->insert(p1 - p0 + 1, fileName, q1 - fileName); + } else if (*p1 == ':') { + path->append('['); + path->append(']'); + path->append(fileName, q1 - fileName); + } else { + path->clear(); + path->append(fileName, q1 - fileName); + } + } else { + if (*p1 != ']' && *p1 != ':') + path->clear(); + path->append(fileName); + } + return path; + +#elif defined(WIN32) + //---------- Win32 ---------- + GString *tmp; + char buf[256]; + char *fp; + + tmp = new GString(path); + tmp->append('/'); + tmp->append(fileName); + GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp); + delete tmp; + path->clear(); + path->append(buf); + return path; + +#elif defined(ACORN) + //---------- RISCOS ---------- + char *p; + int i; + + path->append("."); + i = path->getLength(); + path->append(fileName); + for (p = path->getCString() + i; *p; ++p) { + if (*p == '/') { + *p = '.'; + } else if (*p == '.') { + *p = '/'; + } + } + return path; + +#elif defined(MACOS) + //---------- MacOS ---------- + char *p; + int i; + + path->append(":"); + i = path->getLength(); + path->append(fileName); + for (p = path->getCString() + i; *p; ++p) { + if (*p == '/') { + *p = ':'; + } else if (*p == '.') { + *p = ':'; + } + } + return path; + +#elif defined(__EMX__) + //---------- OS/2+EMX ---------- + int i; + + // appending "." does nothing + if (!strcmp(fileName, ".")) + return path; + + // appending ".." goes up one directory + if (!strcmp(fileName, "..")) { + for (i = path->getLength() - 2; i >= 0; --i) { + if (path->getChar(i) == '/' || path->getChar(i) == '\\' || + path->getChar(i) == ':') + break; + } + if (i <= 0) { + if (path->getChar(0) == '/' || path->getChar(0) == '\\') { + path->del(1, path->getLength() - 1); + } else if (path->getLength() >= 2 && path->getChar(1) == ':') { + path->del(2, path->getLength() - 2); + } else { + path->clear(); + path->append(".."); + } + } else { + if (path->getChar(i-1) == ':') + ++i; + path->del(i, path->getLength() - i); + } + return path; + } + + // otherwise, append "/" and new path component + if (path->getLength() > 0 && + path->getChar(path->getLength() - 1) != '/' && + path->getChar(path->getLength() - 1) != '\\') + path->append('/'); + path->append(fileName); + return path; + +#else + //---------- Unix ---------- + int i; + + // appending "." does nothing + if (!strcmp(fileName, ".")) + return path; + + // appending ".." goes up one directory + if (!strcmp(fileName, "..")) { + for (i = path->getLength() - 2; i >= 0; --i) { + if (path->getChar(i) == '/') + break; + } + if (i <= 0) { + if (path->getChar(0) == '/') { + path->del(1, path->getLength() - 1); + } else { + path->clear(); + path->append(".."); + } + } else { + path->del(i, path->getLength() - i); + } + return path; + } + + // otherwise, append "/" and new path component + if (path->getLength() > 0 && + path->getChar(path->getLength() - 1) != '/') + path->append('/'); + path->append(fileName); + return path; +#endif +} + +GString *grabPath(char *fileName) { +#ifdef VMS + //---------- VMS ---------- + char *p; + + if ((p = strrchr(fileName, ']'))) + return new GString(fileName, p + 1 - fileName); + if ((p = strrchr(fileName, ':'))) + return new GString(fileName, p + 1 - fileName); + return new GString(); + +#elif defined(__EMX__) || defined(WIN32) + //---------- OS/2+EMX and Win32 ---------- + char *p; + + if ((p = strrchr(fileName, '/'))) + return new GString(fileName, p - fileName); + if ((p = strrchr(fileName, '\\'))) + return new GString(fileName, p - fileName); + if ((p = strrchr(fileName, ':'))) + return new GString(fileName, p + 1 - fileName); + return new GString(); + +#elif defined(ACORN) + //---------- RISCOS ---------- + char *p; + + if ((p = strrchr(fileName, '.'))) + return new GString(fileName, p - fileName); + return new GString(); + +#elif defined(MACOS) + //---------- MacOS ---------- + char *p; + + if ((p = strrchr(fileName, ':'))) + return new GString(fileName, p - fileName); + return new GString(); + +#else + //---------- Unix ---------- + char *p; + + if ((p = strrchr(fileName, '/'))) + return new GString(fileName, p - fileName); + return new GString(); +#endif +} + +GBool isAbsolutePath(char *path) { +#ifdef VMS + //---------- VMS ---------- + return strchr(path, ':') || + (path[0] == '[' && path[1] != '.' && path[1] != '-'); + +#elif defined(__EMX__) || defined(WIN32) + //---------- OS/2+EMX and Win32 ---------- + return path[0] == '/' || path[0] == '\\' || path[1] == ':'; + +#elif defined(ACORN) + //---------- RISCOS ---------- + return path[0] == '$'; + +#elif defined(MACOS) + //---------- MacOS ---------- + return path[0] != ':'; + +#else + //---------- Unix ---------- + return path[0] == '/'; +#endif +} + +GString *makePathAbsolute(GString *path) { +#ifdef VMS + //---------- VMS ---------- + char buf[PATH_MAX+1]; + + if (!isAbsolutePath(path->getCString())) { + if (getcwd(buf, sizeof(buf))) { + path->insert(0, buf); + } + } + return path; + +#elif defined(WIN32) + //---------- Win32 ---------- + char buf[_MAX_PATH]; + char *fp; + + buf[0] = '\0'; + if (!GetFullPathName(path->getCString(), _MAX_PATH, buf, &fp)) { + path->clear(); + return path; + } + path->clear(); + path->append(buf); + return path; + +#elif defined(ACORN) + //---------- RISCOS ---------- + path->insert(0, '@'); + return path; + +#elif defined(MACOS) + //---------- MacOS ---------- + path->del(0, 1); + return path; + +#else + //---------- Unix and OS/2+EMX ---------- + struct passwd *pw; + char buf[PATH_MAX+1]; + GString *s; + char *p1, *p2; + int n; + + if (path->getChar(0) == '~') { + if (path->getChar(1) == '/' || +#ifdef __EMX__ + path->getChar(1) == '\\' || +#endif + path->getLength() == 1) { + path->del(0, 1); + s = getHomeDir(); + path->insert(0, s); + delete s; + } else { + p1 = path->getCString() + 1; +#ifdef __EMX__ + for (p2 = p1; *p2 && *p2 != '/' && *p2 != '\\'; ++p2) ; +#else + for (p2 = p1; *p2 && *p2 != '/'; ++p2) ; +#endif + if ((n = p2 - p1) > PATH_MAX) + n = PATH_MAX; + strncpy(buf, p1, n); + buf[n] = '\0'; + if ((pw = getpwnam(buf))) { + path->del(0, p2 - p1 + 1); + path->insert(0, pw->pw_dir); + } + } + } else if (!isAbsolutePath(path->getCString())) { + if (getcwd(buf, sizeof(buf))) { +#ifndef __EMX__ + path->insert(0, '/'); +#endif + path->insert(0, buf); + } + } + return path; +#endif +} + +time_t getModTime(char *fileName) { +#ifdef WIN32 + //~ should implement this, but it's (currently) only used in xpdf + return 0; +#else + struct stat statBuf; + + if (stat(fileName, &statBuf)) { + return 0; + } + return statBuf.st_mtime; +#endif +} + +static char* getTempDir() +{ +#ifdef WIN32 + char*dir = getenv("TMP"); + if(!dir) dir = getenv("TEMP"); + if(!dir) dir = getenv("tmp"); + if(!dir) dir = getenv("temp"); + if(!dir) dir = "C:\\"; +#else + char* dir = "/tmp/"; +#endif + return dir; +} + +char* mktmpname(char*ptr) { + static char tmpbuf[128]; + char*dir = getTempDir(); + int l = strlen(dir); + char*sep = ""; + if(!ptr) + ptr = tmpbuf; + if(l && dir[l-1]!='/' && dir[l-1]!='\\') { +#ifdef WIN32 + sep = "\\"; +#else + sep = "/"; +#endif + } + + // used to be mktemp. This does remove the warnings, but + // It's not exactly an improvement. +#ifdef HAVE_LRAND48 + sprintf(ptr, "%s%s%08x%08x",dir,sep,(unsigned int)lrand48(),(unsigned int)lrand48()); +#else +# ifdef HAVE_RAND + sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand()); +# else + static int count = 1; + sprintf(ptr, "%s%s%08x%04x%04x",dir,sep,time(0),(unsigned int)tmpbuf^((unsigned int)tmpbuf)>>16,count); + count ++; +# endif +#endif + return ptr; +} + + +GBool openTempFile(GString **name, FILE **f, char *mode, char *ext) { +#if defined(WIN32) + //---------- Win32 ---------- + char *tempDir; + GString *s, *s2; + char buf[32]; + FILE *f2; + int t, i; + + // this has the standard race condition problem, but I haven't found + // a better way to generate temp file names with extensions on + // Windows + if ((tempDir = getenv("TEMP"))) { + s = new GString(tempDir); + s->append('\\'); + } else { + s = new GString(); + } + s->append("x"); + t = (int)time(NULL); + for (i = 0; i < 1000; ++i) { + sprintf(buf, "%08x-%08x", t + i, GetCurrentThreadId()); + s2 = s->copy()->append(buf); + if (ext) { + s2->append(ext); + } + if (!(f2 = fopen(s2->getCString(), "r"))) { + if (!(f2 = fopen(s2->getCString(), mode))) { + delete s2; + continue; + } + *name = s2; + *f = f2; + delete s; + return gTrue; + } + fclose(f2); + delete s2; + } + fprintf(stderr, "Couldn't create temporary file\n"); + delete s; + return gFalse; +#elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS) + //---------- non-Unix ---------- + char *s; + + // There is a security hole here: an attacker can create a symlink + // with this file name after the tmpnam call and before the fopen + // call. I will happily accept fixes to this function for non-Unix + // OSs. + if (!(s = mktmpname(NULL))) { + return gFalse; + } + *name = new GString(s); + if (ext) { + (*name)->append(ext); + } + if (!(*f = fopen((*name)->getCString(), mode))) { + delete (*name); + return gFalse; + } + return gTrue; +#else + //---------- Unix ---------- + char *s; + int fd; + + if (ext) { +#if HAVE_MKSTEMPS + if ((s = getenv("TMPDIR"))) { + *name = new GString(s); + } else { + *name = new GString("/tmp"); + } + (*name)->append("/XXXXXX")->append(ext); + fd = mkstemps((*name)->getCString(), strlen(ext)); +#else + if (!(s = mktmpname(NULL))) { + return gFalse; + } + *name = new GString(s); + (*name)->append(ext); + fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); +#endif + } else { +#if HAVE_MKSTEMP + if ((s = getenv("TMPDIR"))) { + *name = new GString(s); + } else { + *name = new GString("/tmp"); + } + (*name)->append("/XXXXXX"); + fd = mkstemp((*name)->getCString()); +#else // HAVE_MKSTEMP + if (!(s = mktmpname(NULL))) { + return gFalse; + } + *name = new GString(s); + fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); +#endif // HAVE_MKSTEMP + } + if (fd < 0 || !(*f = fdopen(fd, mode))) { + delete *name; + return gFalse; + } + return gTrue; +#endif +} + +GBool executeCommand(char *cmd) { +#ifdef VMS + return system(cmd) ? gTrue : gFalse; +#else + return system(cmd) ? gFalse : gTrue; +#endif +} + +char *getLine(char *buf, int size, FILE *f) { + int c, i; + + i = 0; + while (i < size - 1) { + if ((c = fgetc(f)) == EOF) { + break; + } + buf[i++] = (char)c; + if (c == '\x0a') { + break; + } + if (c == '\x0d') { + c = fgetc(f); + if (c == '\x0a' && i < size - 1) { + buf[i++] = (char)c; + } else if (c != EOF) { + ungetc(c, f); + } + break; + } + } + buf[i] = '\0'; + if (i == 0) { + return NULL; + } + return buf; +} + +//------------------------------------------------------------------------ +// GDir and GDirEntry +//------------------------------------------------------------------------ + +GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) { +#ifdef VMS + char *p; +#elif defined(WIN32) + int fa; + GString *s; +#elif defined(ACORN) +#else + struct stat st; + GString *s; +#endif + + name = new GString(nameA); + dir = gFalse; + if (doStat) { +#ifdef VMS + if (!strcmp(nameA, "-") || + ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5))) + dir = gTrue; +#elif defined(ACORN) +#else + s = new GString(dirPath); + appendToPath(s, nameA); +#ifdef WIN32 + fa = GetFileAttributes(s->getCString()); + dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY)); +#else + if (stat(s->getCString(), &st) == 0) + dir = S_ISDIR(st.st_mode); +#endif + delete s; +#endif + } +} + +GDirEntry::~GDirEntry() { + delete name; +} + +GDir::GDir(char *name, GBool doStatA) { + path = new GString(name); + doStat = doStatA; +#if defined(WIN32) + GString *tmp; + + tmp = path->copy(); + tmp->append("/*.*"); + hnd = FindFirstFile(tmp->getCString(), &ffd); + delete tmp; +#elif defined(ACORN) +#elif defined(MACOS) +#else + dir = opendir(name); +#ifdef VMS + needParent = strchr(name, '[') != NULL; +#endif +#endif +} + +GDir::~GDir() { + delete path; +#if defined(WIN32) + if (hnd) { + FindClose(hnd); + hnd = NULL; + } +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) + closedir(dir); +#endif +} + +GDirEntry *GDir::getNextEntry() { + GDirEntry *e; + +#if defined(WIN32) + if (hnd) { + e = new GDirEntry(path->getCString(), ffd.cFileName, doStat); + if (hnd && !FindNextFile(hnd, &ffd)) { + FindClose(hnd); + hnd = NULL; + } + } else { + e = NULL; + } +#elif defined(ACORN) +#elif defined(MACOS) +#elif defined(VMS) + struct dirent *ent; + e = NULL; + if (dir) { + if (needParent) { + e = new GDirEntry(path->getCString(), "-", doStat); + needParent = gFalse; + return e; + } + ent = readdir(dir); + if (ent) { + e = new GDirEntry(path->getCString(), ent->d_name, doStat); + } + } +#else + struct dirent *ent; + e = NULL; + if (dir) { + ent = (struct dirent *)readdir(dir); + if (ent && !strcmp(ent->d_name, ".")) { + ent = (struct dirent *)readdir(dir); + } + if (ent) { + e = new GDirEntry(path->getCString(), ent->d_name, doStat); + } + } +#endif + + return e; +} + +void GDir::rewind() { +#ifdef WIN32 + GString *tmp; + + if (hnd) + FindClose(hnd); + tmp = path->copy(); + tmp->append("/*.*"); + hnd = FindFirstFile(tmp->getCString(), &ffd); + delete tmp; +#elif defined(ACORN) +#elif defined(MACOS) +#else + if (dir) + rewinddir(dir); +#ifdef VMS + needParent = strchr(path->getCString(), '[') != NULL; +#endif +#endif +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h new file mode 100644 index 000000000..10a422607 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h @@ -0,0 +1,141 @@ +//======================================================================== +// +// gfile.h +// +// Miscellaneous file and directory name manipulation. +// +// Copyright 1996-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GFILE_H +#define GFILE_H + +#include +#include +#include +#if defined(WIN32) +# include +# ifdef FPTEX +# include +# else +# include +# endif +#elif defined(ACORN) +#elif defined(MACOS) +# include +#else +# include +# include +# ifdef VMS +# include "vms_dirent.h" +# elif HAVE_DIRENT_H +# include +# define NAMLEN(d) strlen((d)->d_name) +# else +# define dirent direct +# define NAMLEN(d) (d)->d_namlen +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +# endif +#endif +#include "gtypes.h" + +class GString; + +//------------------------------------------------------------------------ + +// Get home directory path. +extern GString *getHomeDir(); + +// Get current directory. +extern GString *getCurrentDir(); + +/* create a temporary filename */ +char* mktmpname(char*ptr); + +// Append a file name to a path string. may be an empty +// string, denoting the current directory). Returns . +extern GString *appendToPath(GString *path, char *fileName); + +// Grab the path from the front of the file name. If there is no +// directory component in , returns an empty string. +extern GString *grabPath(char *fileName); + +// Is this an absolute path or file name? +extern GBool isAbsolutePath(char *path); + +// Make this path absolute by prepending current directory (if path is +// relative) or prepending user's directory (if path starts with '~'). +extern GString *makePathAbsolute(GString *path); + +// Get the modification time for . Returns 0 if there is an +// error. +extern time_t getModTime(char *fileName); + +// Create a temporary file and open it for writing. If is not +// NULL, it will be used as the file name extension. Returns both the +// name and the file pointer. For security reasons, all writing +// should be done to the returned file pointer; the file may be +// reopened later for reading, but not for writing. The string +// should be "w" or "wb". Returns true on success. +extern GBool openTempFile(GString **name, FILE **f, char *mode, char *ext); + +// Execute . Returns true on success. +extern GBool executeCommand(char *cmd); + +// Just like fgets, but handles Unix, Mac, and/or DOS end-of-line +// conventions. +extern char *getLine(char *buf, int size, FILE *f); + +//------------------------------------------------------------------------ +// GDir and GDirEntry +//------------------------------------------------------------------------ + +class GDirEntry { +public: + + GDirEntry(char *dirPath, char *nameA, GBool doStat); + ~GDirEntry(); + GString *getName() { return name; } + GBool isDir() { return dir; } + +private: + + GString *name; // dir/file name + GBool dir; // is it a directory? +}; + +class GDir { +public: + + GDir(char *name, GBool doStatA = gTrue); + ~GDir(); + GDirEntry *getNextEntry(); + void rewind(); + +private: + + GString *path; // directory path + GBool doStat; // call stat() for each entry? +#if defined(WIN32) + WIN32_FIND_DATA ffd; + HANDLE hnd; +#elif defined(ACORN) +#elif defined(MACOS) +#else + DIR *dir; // the DIR structure from opendir() +#ifdef VMS + GBool needParent; // need to return an entry for [-] +#endif +#endif +}; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc new file mode 100644 index 000000000..7a905c466 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc @@ -0,0 +1,348 @@ +/* + * gmem.c + * + * Memory routines with out-of-memory checking. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +#include +#include +#include +#include +#include +#include +#include +#include "gmem.h" + +#ifdef DEBUG_MEM + +typedef struct _GMemHdr { + unsigned int magic; + int size; + int index; + struct _GMemHdr *next, *prev; +} GMemHdr; + +#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7) +#define gMemTrlSize (sizeof(long)) + +#define gMemMagic 0xabcd9999 + +#if gmemTrlSize==8 +#define gMemDeadVal 0xdeadbeefdeadbeefUL +#else +#define gMemDeadVal 0xdeadbeefUL +#endif + +/* round data size so trailer will be aligned */ +#define gMemDataSize(size) \ + ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize) + +static GMemHdr *gMemHead = NULL; +static GMemHdr *gMemTail = NULL; + +static int gMemIndex = 0; +static int gMemAlloc = 0; +static int gMemInUse = 0; + +#endif /* DEBUG_MEM */ + +void *gmalloc(int size, bool exit_on_error) GMEM_EXCEP { +#ifdef DEBUG_MEM + int size1; + char *mem; + GMemHdr *hdr; + void *data; + unsigned long *trl, *p; + + if (size < 0) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Invalid memory allocation size\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + if (size == 0) { + return NULL; + } + size1 = gMemDataSize(size); + if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Out of memory\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + hdr = (GMemHdr *)mem; + data = (void *)(mem + gMemHdrSize); + trl = (unsigned long *)(mem + gMemHdrSize + size1); + hdr->magic = gMemMagic; + hdr->size = size; + hdr->index = gMemIndex++; + if (gMemTail) { + gMemTail->next = hdr; + hdr->prev = gMemTail; + gMemTail = hdr; + } else { + hdr->prev = NULL; + gMemHead = gMemTail = hdr; + } + hdr->next = NULL; + ++gMemAlloc; + gMemInUse += size; + for (p = (unsigned long *)data; p <= trl; ++p) { + *p = gMemDeadVal; + } + return data; +#else + void *p; + + if (size < 0) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Invalid memory allocation size\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + if (size == 0) { + return NULL; + } + if (!(p = malloc(size))) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Out of memory\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + return p; +#endif +} +void *gmalloc(int size) GMEM_EXCEP { + return gmalloc(size, true); +} +void *gmalloc_noexit(int size) GMEM_EXCEP { + return gmalloc(size, false); +} + +void *grealloc(void *p, int size, bool exit_on_error) GMEM_EXCEP { +#ifdef DEBUG_MEM + GMemHdr *hdr; + void *q; + int oldSize; + + if (size < 0) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Invalid memory allocation size\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + if (size == 0) { + if (p) { + gfree(p); + } + return NULL; + } + if (p) { + hdr = (GMemHdr *)((char *)p - gMemHdrSize); + oldSize = hdr->size; + q = gmalloc(size); + memcpy(q, p, size < oldSize ? size : oldSize); + gfree(p); + } else { + q = gmalloc(size); + } + return q; +#else + void *q; + + if (size < 0) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Invalid memory allocation size\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + if (size == 0) { + if (p) { + free(p); + } + return NULL; + } + if (p) { + q = realloc(p, size); + } else { + q = malloc(size); + } + if (!q) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Out of memory\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + return q; +#endif +} +void *grealloc(void *p, int size) GMEM_EXCEP { + return grealloc(p, size, true); +} +void *grealloc_noexit(void *p, int size) GMEM_EXCEP { + return grealloc(p, size, false); +} + +void *gmallocn(int nObjs, int objSize, bool exit_on_error) GMEM_EXCEP { + int n; + + if (nObjs == 0) { + return NULL; + } + n = nObjs * objSize; + if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Bogus memory allocation size\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + return gmalloc(n); +} +void *gmallocn(int nObjs, int objSize) GMEM_EXCEP { + return gmallocn(nObjs, objSize, true); +} +void *gmallocn_noexit(int nObjs, int objSize) GMEM_EXCEP { + return gmallocn(nObjs, objSize, false); +} + +void *greallocn(void *p, int nObjs, int objSize, bool exit_on_error) GMEM_EXCEP { + int n; + + if (nObjs == 0) { + if (p) { + gfree(p); + } + return NULL; + } + n = nObjs * objSize; + if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) { +#if USE_EXCEPTIONS + throw GMemException(); +#else + fprintf(stderr, "Bogus memory allocation size\n"); + if(exit_on_error) + exit(1); + else + return NULL; +#endif + } + return grealloc(p, n); +} +void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP { + return greallocn(p, nObjs, objSize, true); +} +void *greallocn_noexit(void *p, int nObjs, int objSize) GMEM_EXCEP { + return greallocn(p, nObjs, objSize, false); +} + +void gfree(void *p) { +#ifdef DEBUG_MEM + int size; + GMemHdr *hdr; + unsigned long *trl, *clr; + + if (p) { + hdr = (GMemHdr *)((char *)p - gMemHdrSize); + if (hdr->magic == gMemMagic && + ((hdr->prev == NULL) == (hdr == gMemHead)) && + ((hdr->next == NULL) == (hdr == gMemTail))) { + if (hdr->prev) { + hdr->prev->next = hdr->next; + } else { + gMemHead = hdr->next; + } + if (hdr->next) { + hdr->next->prev = hdr->prev; + } else { + gMemTail = hdr->prev; + } + --gMemAlloc; + gMemInUse -= hdr->size; + size = gMemDataSize(hdr->size); + trl = (unsigned long *)((char *)hdr + gMemHdrSize + size); + if (*trl != gMemDeadVal) { + fprintf(stderr, "Overwrite past end of block %d at address %p\n", + hdr->index, p); + } + for (clr = (unsigned long *)hdr; clr <= trl; ++clr) { + *clr = gMemDeadVal; + } + free(hdr); + } else { + fprintf(stderr, "Attempted to free bad address %p\n", p); + } + } +#else + if (p) { + free(p); + } +#endif +} + +#ifdef DEBUG_MEM +void gMemReport(FILE *f) { + GMemHdr *p; + + fprintf(f, "%d memory allocations in all\n", gMemIndex); + if (gMemAlloc > 0) { + fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc); + fprintf(f, " index size\n"); + fprintf(f, "-------- --------\n"); + for (p = gMemHead; p; p = p->next) { + fprintf(f, "%8d %8d\n", p->index, p->size); + } + } else { + fprintf(f, "No memory blocks left allocated\n"); + } +} +#endif + +char *copyString(char *s) { + char *s1; + + s1 = (char *)gmalloc(strlen(s) + 1); + strcpy(s1, s); + return s1; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h new file mode 100644 index 000000000..1c247cb70 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h @@ -0,0 +1,83 @@ +/* + * gmem.h + * + * Memory routines with out-of-memory checking. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +#ifndef GMEM_H +#define GMEM_H + +#include +#include + +#if USE_EXCEPTIONS + +class GMemException { +public: + GMemException() {} + ~GMemException() {} +}; + +#define GMEM_EXCEP throw(GMemException) + +#else // USE_EXCEPTIONS + +#define GMEM_EXCEP + +#endif // USE_EXCEPTIONS + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Same as malloc, but prints error message and exits if malloc() + * returns NULL. + */ +extern void *gmalloc(int size) GMEM_EXCEP; +extern void *gmalloc_noexit(int size) GMEM_EXCEP; + +/* + * Same as realloc, but prints error message and exits if realloc() + * returns NULL. If

is NULL, calls malloc instead of realloc(). + */ +extern void *grealloc(void *p, int size) GMEM_EXCEP; +extern void *grealloc_noexit(void *p, int size) GMEM_EXCEP; + +/* + * These are similar to gmalloc and grealloc, but take an object count + * and size. The result is similar to allocating nObjs * objSize + * bytes, but there is an additional error check that the total size + * doesn't overflow an int. + */ +extern void *gmallocn(int nObjs, int objSize) GMEM_EXCEP; +extern void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP; +extern void *gmallocn_noexit(int nObjs, int objSize) GMEM_EXCEP; +extern void *greallocn_noexit(void *p, int nObjs, int objSize) GMEM_EXCEP; + +/* + * Same as free, but checks for and ignores NULL pointers. + */ +extern void gfree(void *p); + +#ifdef DEBUG_MEM +/* + * Report on unfreed memory. + */ +extern void gMemReport(FILE *f); +#else +#define gMemReport(f) +#endif + +/* + * Allocate memory and copy a string into it. + */ +extern char *copyString(char *s); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h new file mode 100644 index 000000000..9f64f57d4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h @@ -0,0 +1,29 @@ +/* + * gtypes.h + * + * Some useful simple types. + * + * Copyright 1996-2003 Glyph & Cog, LLC + */ + +#ifndef GTYPES_H +#define GTYPES_H + +/* + * These have stupid names to avoid conflicts with some (but not all) + * C++ compilers which define them. + */ +typedef int GBool; +#define gTrue 1 +#define gFalse 0 + +/* + * These have stupid names to avoid conflicts with , + * which on various systems defines some random subset of these. + */ +typedef unsigned char Guchar; +typedef unsigned short Gushort; +typedef unsigned int Guint; +typedef unsigned long Gulong; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/png.c b/fluidbook/tools/swftools-special-swfdump/lib/png.c new file mode 100644 index 000000000..66eebb44d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/png.c @@ -0,0 +1,1711 @@ +/* png.c + + Copyright (c) 2003/2004/2005 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef EXPORT +#undef EXPORT +#endif + +#ifdef PNG_INLINE_EXPORTS +#define EXPORT static +#else +#define EXPORT +#include "png.h" +#endif + +typedef unsigned u32; + +typedef struct _COL { + unsigned char a,r,g,b; +} COL; + +static int png_read_chunk(char (*head)[4], int*destlen, unsigned char**destdata, FILE*fi) +{ + unsigned int len; + unsigned char blen[4]; + if(destlen) *destlen=0; + if(destdata) *destdata=0; + if(!fread(&blen, 4, 1, fi)) { + return 0; + } + if(!fread(head, 4, 1, fi)) { + return 0; + } + len = blen[0]<<24|blen[1]<<16|blen[2]<<8|blen[3]; + if(destlen) *destlen = len; + if(destdata) { + if(!len) { + *destdata = 0; + } else { + *destdata = (unsigned char*)malloc(len); + if(!fread(*destdata, len, 1, fi)) { + *destdata = 0; + if(destlen) *destlen=0; + return 0; + } + } + fseek(fi, 4, SEEK_CUR); + + } else { + fseek(fi, len+4, SEEK_CUR); + } + return 1; +} + +static unsigned int png_get_dword(FILE*fi) +{ + unsigned int a; + unsigned char b[4]; + fread(&b,4,1,fi); + return b[0]<<24|b[1]<<16|b[2]<<8|b[3]; +} + +struct png_header +{ + unsigned width; + unsigned height; + int bpp; + int mode; +}; + +static int png_read_header(FILE*fi, struct png_header*header) +{ + char id[4]; + int len; + int ok=0; + unsigned char head[8] = {137,80,78,71,13,10,26,10}; + unsigned char head2[8]; + unsigned char*data; + fread(head2,8,1,fi); + if(strncmp((const char*)head,(const char*)head2,4)) + return 0; // not a png file + + while(png_read_chunk(&id, &len, &data, fi)) + { + //printf("Chunk: %c%c%c%c (len:%d)\n", id[0],id[1],id[2],id[3], len); + if(!strncmp(id, "IHDR", 4)) { + char a,b,c,f,i; + if(len < 8) exit(1); + header->width = data[0]<<24|data[1]<<16|data[2]<<8|data[3]; + header->height = data[4]<<24|data[5]<<16|data[6]<<8|data[7]; + a = data[8]; // should be 8 + b = data[9]; // should be 3(indexed) or 2(rgb) + + c = data[10]; // compression mode (0) + f = data[11]; // filter mode (0) + i = data[12]; // interlace mode (0) + + if(b!=0 && b!=4 && b!=2 && b!=3 && b!=6) { + fprintf(stderr, "Image mode %d not supported!\n", b); + return 0; + } + if(a!=8 && (b==2 || b==6)) { + printf("Bpp %d in mode %d not supported!\n", b, a); + return 0; + } + if(c!=0) { + printf("Compression mode %d not supported!\n", c); + return 0; + } + if(f!=0) { + printf("Filter mode %d not supported!\n", f); + return 0; + } + if(i!=0) { + printf("Interlace mode %d not supported!\n", i); + return 0; + } + //printf("%dx%d bpp:%d mode:%d comp:%d filter:%d interlace:%d\n",header->width, header->height, a,b,c,f,i); + header->bpp = a; + header->mode = b; + ok = 1; + } + + free(data); + } + return ok; +} + +typedef unsigned char byte; +#define ABS(a) ((a)>0?(a):(-(a))) +static inline byte PaethPredictor (byte a,byte b,byte c) +{ + // a = left, b = above, c = upper left + int p = a + b - c; // initial estimate + int pa = ABS(p - a); // distances to a, b, c + int pb = ABS(p - b); + int pc = ABS(p - c); + // return nearest of a,b,c, + // breaking ties in order a,b,c. + if (pa <= pb && pa <= pc) + return a; + else if (pb <= pc) + return b; + else return c; +} + +static void applyfilter1(int mode, unsigned char*src, unsigned char*old, unsigned char*dest, unsigned width) +{ + int x; + unsigned char last=0; + unsigned char upperlast=0; + + if(mode==0) { + for(x=0;x 0xffffffff) + return 0; + unsigned long imagedatalen = (unsigned long)imagedatalen_64; + imagedata = (unsigned char*)malloc(imagedatalen); + + fseek(fi,8,SEEK_SET); + while(!feof(fi)) + { + if(!png_read_chunk(&tagid, &len, &data, fi)) + break; + if(!strncmp(tagid, "IEND", 4)) { + break; + } + if(!strncmp(tagid, "PLTE", 4)) { + palette = data; + palettelen = len/3; + data = 0; //don't free data + //printf("%d colors in palette\n", palettelen); + } + if(!strncmp(tagid, "tRNS", 4)) { + if(header.mode == 3) { + alphapalette = data; + alphapalettelen = len; + data = 0; //don't free data + //printf("found %d alpha colors\n", alphapalettelen); + } else if(header.mode == 0 || header.mode == 2) { + int t; + if(header.mode == 2) { + alphacolor[0] = data[1]; + alphacolor[1] = data[3]; + alphacolor[2] = data[5]; + } else { + alphacolor[0] = alphacolor[1] = alphacolor[2] = data[1]; + } + hasalphacolor = 1; + } + } + if(!strncmp(tagid, "IDAT", 4)) { + if(!zimagedata) { + zimagedatalen = len; + zimagedata = (unsigned char*)malloc(len); + memcpy(zimagedata,data,len); + } else { + zimagedata = (unsigned char*)realloc(zimagedata, zimagedatalen+len); + memcpy(&zimagedata[zimagedatalen], data, len); + zimagedatalen += len; + } + } + if(!strncmp(tagid, "tEXt", 4)) { + /*int t; + printf("Image Text: "); + for(t=0;t=32 && data[t]<128) + printf("%c", data[t]); + else + printf("?"); + } + printf("\n");*/ + } + if(data) { + free(data); data=0; + } + } + + fclose(fi); + if(!zimagedata || uncompress(imagedata, &imagedatalen, zimagedata, zimagedatalen) != Z_OK) { + printf("Couldn't uncompress %s!\n", sname); + if(zimagedata) + free(zimagedata); + return 0; + } + free(zimagedata); + + *destwidth = header.width; + *destheight = header.height; + + data2 = (unsigned char*)malloc(header.width*header.height*4); + + if(header.mode == 4) + { + int i,s=0; + int x,y; + int pos=0; + unsigned char* old= (unsigned char*)malloc(header.width*2); + memset(old, 0, header.width*2); + *destdata = data2; + for(y=0;y=0;x--) { + unsigned char gray = dest[x*2+0]; + unsigned char alpha = dest[x*2+1]; + dest[x*4+0] = alpha; + dest[x*4+1] = gray; + dest[x*4+2] = gray; + dest[x*4+3] = gray; + } + } + free(old); + free(imagedata); + } else if(header.mode == 6 || header.mode == 2) { + int i,s=0; + int x,y; + int pos=0; + *destdata = data2; + + unsigned char* firstline = malloc(header.width*4); + memset(firstline,0,header.width*4); + for(y=0;y>header.bpp); + palettelen = 1<32 bit conversion */ + for(i=0;i>(16-header.bpp-(s&7)))&v; + s+=header.bpp; + } + src = tmpline; + pos+=(header.width*header.bpp+7)/8; + } + + if(!y) { + memset(destline,0,header.width); + old = &destline[y*header.width]; + } else { + old = tmpline; + } + applyfilter1(mode, src, old, destline, header.width); + memcpy(tmpline,destline,header.width); + for(x=0;xnum - c1->num; +} + +static colornum_t* getColors(COL*image, int size, int*num) +{ + unsigned char*colexists = malloc((256*256*256)/8); + memset(colexists, 0, (256*256*256)/8); + int t; + int count=0; + + /* find all different colors in the image */ + for(t=0;t= col) max=i; + else min=i+1; + } + assert(colors[i].color==col); + colors[i].num++; + } + free(colexists); + *num = count; + return colors; +} + +static void getOptimalPalette(COL*image, int size, int palettesize, COL*palette) +{ + int num; + memset(palette, 0, sizeof(COL)*256); + colornum_t*colors = getColors(image, size, &num); + + assert(palettesize<=256); + + qsort(colors, num, sizeof(colornum_t), compare_colors); + + if(num<=palettesize) { + /* if there are not more than palettesize different colors in + the image anyway, we are done */ + int t; + for(t=0;t>8; + palette[t].b = colors[t].color>>16; + palette[t].a = 255; + } + return; + } + + if(num>2048) { + /* if there are too many different colors, pick the ones that + occur most often */ + num = 2048; + } + + colornum_t*centers = malloc(sizeof(colornum_t)*palettesize); + int t; + for(t=0;t= (palettesize+num)*2) { + fprintf(stderr, "Warning: didn't find optimal palette\n"); + break; + } + change = 0; + int s,t; + for(s=0;s>0&0xff) - (colors[t].color>>0&0xff)); + distance += abs((centers[s].color>>8&0xff) - (colors[t].color>>8&0xff)); + distance += abs((centers[s].color>>16&0xff) - (colors[t].color>>16&0xff)); + distance *= colors[t].num; + if(distance>0)&0xff)*colors[t].num; + g += ((colors[t].color>>8)&0xff)*colors[t].num; + b += ((colors[t].color>>16)&0xff)*colors[t].num; + count+=colors[t].num; + } + } + if(!count) { + int random = rand()%num; + centers[s].color = colors[random].color; + centers[s].num = 0; + change = 1; + } else { + r /= count; + g /= count; + b /= count; + centers[s].color = r|g<<8|b<<16; + centers[s].num = count; + } + } + } + free(belongsto); + free(colors); + for(t=0;t>8; + palette[t].b = centers[t].color>>16; + palette[t].a = 255; + } + free(centers); +} + +static int sqr(const int x) {return x*x;} + +static void png_quantize_image(unsigned char*_image, int size, int numcolors, unsigned char**newimage, COL*palette) +{ + COL*image = (COL*)_image; + getOptimalPalette(image, size, numcolors, palette); + *newimage = (unsigned char*)malloc(size); + int t; + for(t=0;t> 1); + } + crc32_table[t] = c; + } +} +static inline void png_write_byte(FILE*fi, unsigned char byte) +{ + fwrite(&byte,1,1,fi); + mycrc32 = crc32_table[(mycrc32 ^ byte) & 0xff] ^ (mycrc32 >> 8); +} +static long png_start_chunk(FILE*fi, char*type, int len) +{ + unsigned char mytype[4]={0,0,0,0}; + unsigned char mylen[4]; + long filepos; + mylen[0] = len>>24; + mylen[1] = len>>16; + mylen[2] = len>>8; + mylen[3] = len; + memcpy(mytype,type,strlen(type)); + filepos = ftell(fi); + fwrite(&mylen, 4, 1, fi); + mycrc32=0xffffffff; + png_write_byte(fi,mytype[0]); + png_write_byte(fi,mytype[1]); + png_write_byte(fi,mytype[2]); + png_write_byte(fi,mytype[3]); + return filepos; +} +static void png_patch_len(FILE*fi, int pos, int len) +{ + unsigned char mylen[4]; + long filepos; + mylen[0] = len>>24; + mylen[1] = len>>16; + mylen[2] = len>>8; + mylen[3] = len; + fseek(fi, pos, SEEK_SET); + fwrite(&mylen, 4, 1, fi); + fseek(fi, 0, SEEK_END); +} +static void png_write_bytes(FILE*fi, unsigned char*bytes, int len) +{ + int t; + for(t=0;t>24); + png_write_byte(fi,dword>>16); + png_write_byte(fi,dword>>8); + png_write_byte(fi,dword); +} +static void png_end_chunk(FILE*fi) +{ + u32 tmp = mycrc32^0xffffffff; + unsigned char tmp2[4]; + tmp2[0] = tmp>>24; + tmp2[1] = tmp>>16; + tmp2[2] = tmp>>8; + tmp2[3] = tmp; + fwrite(&tmp2,4,1,fi); +} + +#define ZLIB_BUFFER_SIZE 16384 + +static long compress_line(z_stream*zs, Bytef*line, int len, FILE*fi) +{ + long size = 0; + zs->next_in = line; + zs->avail_in = len; + + while(1) { + int ret = deflate(zs, Z_NO_FLUSH); + if (ret != Z_OK) { + fprintf(stderr, "error in deflate(): %s", zs->msg?zs->msg:"unknown"); + return 0; + } + if(zs->avail_out != ZLIB_BUFFER_SIZE) { + int consumed = ZLIB_BUFFER_SIZE - zs->avail_out; + size += consumed; + png_write_bytes(fi, zs->next_out - consumed , consumed); + zs->next_out = zs->next_out - consumed; + zs->avail_out = ZLIB_BUFFER_SIZE; + } + if(!zs->avail_in) { + break; + } + } + return size; +} + +static int test_line(z_stream*zs_orig, Bytef*line, int linelen) +{ + z_stream zs; + int ret = deflateCopy(&zs, zs_orig); + if(ret != Z_OK) { + fprintf(stderr, "Couldn't copy stream\n"); + return 0; + } + + zs.next_in = line; + zs.avail_in = linelen; + + long size = 0; + + int mode = Z_SYNC_FLUSH; + while(1) { + int ret = deflate(&zs, mode); + if (ret != Z_OK && ret != Z_STREAM_END) { + fprintf(stderr, "error in deflate(): %s (mode %s, %d bytes remaining)\n", zs.msg?zs.msg:"unknown", + mode==Z_SYNC_FLUSH?"Z_SYNC_FLUSH":"Z_FINISH", zs.avail_in); + return 0; + } + if(zs.avail_out != ZLIB_BUFFER_SIZE) { + int consumed = ZLIB_BUFFER_SIZE - zs.avail_out; + size += consumed; + zs.next_out = zs.next_out - consumed; + zs.avail_out = ZLIB_BUFFER_SIZE; + } + if (ret == Z_STREAM_END) { + break; + } + if(!zs.avail_in) { + mode = Z_FINISH; + } + } + ret = deflateEnd(&zs); + if (ret != Z_OK) { + fprintf(stderr, "error in deflateEnd(): %s\n", zs.msg?zs.msg:"unknown"); + return 0; + } + return size; +} + +static int finishzlib(z_stream*zs, FILE*fi) +{ + int size = 0; + int ret; + while(1) { + ret = deflate(zs, Z_FINISH); + if (ret != Z_OK && + ret != Z_STREAM_END) { + fprintf(stderr, "error in deflate(finish): %s\n", zs->msg?zs->msg:"unknown"); + return 0; + } + + if(zs->avail_out != ZLIB_BUFFER_SIZE) { + int consumed = ZLIB_BUFFER_SIZE - zs->avail_out; + size += consumed; + png_write_bytes(fi, zs->next_out - consumed , consumed); + zs->next_out = zs->next_out - consumed; + zs->avail_out = ZLIB_BUFFER_SIZE; + } + if (ret == Z_STREAM_END) { + break; + } + } + ret = deflateEnd(zs); + if (ret != Z_OK) { + fprintf(stderr, "error in deflateEnd(): %s\n", zs->msg?zs->msg:"unknown"); + return 0; + } + return size; +} + +static inline u32 color_hash(COL*col) +{ + u32 col32 = *(u32*)col; + u32 hash = (col32 >> 17) ^ col32; + hash ^= ((hash>>8) + 1) ^ hash; + return hash; +} + +static int png_get_number_of_palette_entries(COL*img, unsigned width, unsigned height, COL*palette, char*has_alpha) +{ + int len = width*height; + int t; + int palsize = 0; + int size[256]; + int palette_overflow = 0; + u32 lastcol32 = 0; + + memset(size, 0, sizeof(size)); + + u32*pal = (u32*)malloc(65536*sizeof(u32)); + int*count = (int*)malloc(65536*sizeof(int)); + + assert(sizeof(COL)==sizeof(u32)); + assert(width && height); + + lastcol32 = (*(u32*)&img[0])^0xffffffff; // don't match + + for(t=0;t0?5:2; //don't apply y-direction filter in first line + + int bytes_per_pixel = bpp>>3; + int w = width*bytes_per_pixel; + int back_x = bytes_per_pixel; + int back_y = y?width*bytes_per_pixel:0; + + unsigned char*pairs[5]; + pairs[0] = calloc(1, 8192); + pairs[1] = calloc(1, 8192); + pairs[2] = calloc(1, 8192); + pairs[3] = calloc(1, 8192); + pairs[4] = calloc(1, 8192); + + unsigned char old[5]; + int l = bytes_per_pixel - 1; + old[0] = src[l]; + old[1] = src[l]; + old[2] = src[l] - src[l-back_y]; + old[3] = src[l] - src[l-back_y]; + old[4] = src[l] - PaethPredictor(0, src[l-back_y], 0); + + int different_pairs[5] = {0,0,0,0,0}; + + int x; + for(x=bytes_per_pixel;x>3; + int b = 1<<(v&7); + if(!pairs[i][p]&b) { + pairs[i][p]|=b; + different_pairs[i]++; + } + } + memcpy(old, dest, sizeof(old)); + } + int f; + int best_nr = 0; + int best_energy = INT_MAX; + for(f=0;f0?5:2; //don't apply y-direction filter in first line + int f; + int best_energy = INT_MAX; + int w = width*(bpp/8); + unsigned char* pairs = malloc(8192); + assert(bpp==8 || bpp==32); + for(f=0;f>3; + int b = 1<<(v&7); + if(!pairs[p]&b) { + pairs[p]|=b; + different_pairs ++; + } + } + int energy = different_pairs; + if(energy256) { + bpp = 32; + cols = 0; + format = 5; + } else if(!numcolors) { + int num = png_get_number_of_palette_entries((COL*)data, width, height, palette, &has_alpha); + if(num<=255) { + //printf("image has %d different colors (alpha=%d)\n", num, has_alpha); + data2 = malloc(width*height); + png_map_to_palette((COL*)data, data2, width*height, palette, num); + data = data2; + bpp = 8; + cols = num; + format = 3; + } else { + bpp = 32; + cols = 0; + format = 5; + } + } else { + bpp = 8; + cols = numcolors; + format = 3; + png_quantize_image(data, width*height, numcolors, &data, palette); + } + + fi = fopen(filename, "wb"); + if(!fi) { + perror("open"); + return; + } + fwrite(head,sizeof(head),1,fi); + + png_start_chunk(fi, "IHDR", 13); + png_write_dword(fi,width); + png_write_dword(fi,height); + png_write_byte(fi,8); + if(format == 3) + png_write_byte(fi,3); //indexed + else if(format == 5 && alpha==0) + png_write_byte(fi,2); //rgb + else if(format == 5 && alpha==1) + png_write_byte(fi,6); //rgba + else return; + + png_write_byte(fi,0); //compression mode + png_write_byte(fi,0); //filter mode + png_write_byte(fi,0); //interlace mode + png_end_chunk(fi); + + if(format == 3) { + png_start_chunk(fi, "PLTE", cols*3); + for(t=0;t=2) + continue; // don't do y direction filters in the first row + + line[0]=filtermode; //filter type + if(bpp==8) + png_apply_specific_filter_8(filtermode, line+1, &data[y*srcwidth], width); + else + png_apply_specific_filter_32(filtermode, line+1, &data[y*srcwidth], width); + + int size = test_line(&zs, line, linelen); + if(size < bestsize) { + memcpy(bestline, line, linelen); + bestsize = size; + } + } + idatsize += compress_line(&zs, bestline, linelen, fi); + } + free(bestline); +#else + for(y=0;y + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __png_h__ +#define __png_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +int png_apply_filter_32(unsigned char*dest, unsigned char*src, unsigned width, int y); +void png_inverse_filter_32(int mode, unsigned char*src, unsigned char*old, unsigned char*dest, unsigned width); + +int png_load(const char*sname, unsigned*destwidth, unsigned*destheight, unsigned char**destdata); +int png_getdimensions(const char*sname, unsigned*destwidth, unsigned*destheight); + +void png_write_palette_based(const char*filename, unsigned char*data, unsigned width, unsigned height, int numcolors); + +void png_write(const char*filename, unsigned char*data, unsigned width, unsigned height); +void png_write_quick(const char*filename, unsigned char*data, unsigned width, unsigned height); +void png_write_palette_based_2(const char*filename, unsigned char*data, unsigned width, unsigned height); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile new file mode 100644 index 000000000..d13b16bb3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile @@ -0,0 +1,81 @@ +top_builddir = ../.. +srcdir = . +top_srcdir = ../.. +include ../../Makefile.common + +all: gfx.$(SLEXT) +static: SWF$(A) gfx$(A) +exe: mypython$(E) swfpython$(E) testmem$(E) + +primitives.$(O): primitives.c primitives.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c primitives.c -o primitives.$(O) +tagmap.$(O): tagmap.c tagmap.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tagmap.c -o tagmap.$(O) +taglist.$(O): taglist.c taglist.h tagmap.h tag.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c taglist.c -o taglist.$(O) +tag.$(O): tag.c tag.h tagmap.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tag.c -o tag.$(O) +tags.$(O): tags.c tags.h tagmap.h tag.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tags.c -o tags.$(O) +image.$(O): image.c image.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c image.c -o image.$(O) +action.$(O): action.c action.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c action.c -o action.$(O) +pyutils.$(O): pyutils.c pyutils.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c pyutils.c -o pyutils.$(O) +gfx.$(O): gfx.c + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c gfx.c -o gfx.$(O) + +SWF.$(O): SWF.c pyutils.h primitives.h taglist.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c SWF.c -o SWF.$(O) + +SWF_OBJS=SWF.$(O) taglist.$(O) tag.$(O) image.$(O) tags.$(O) tagmap.$(O) action.$(O) primitives.$(O) pyutils.$(O) +SWF_DEPS=../librfxswf$(A) ../libbase$(A) +SWF.$(SLEXT): $(SWF_OBJS) $(SWF_DEPS) Makefile + $(L) -g $(SHARED) $(SWF_OBJS) $(SWF_DEPS) -o SWF.$(SLEXT) $(PYTHON_LIB) $(LIBS) +SWF$(A): $(SWF_OBJS) $(SWF_DEPS) Makefile + $(AR) cru SWF$(A) $(SWF_OBJS) $(SWF_DEPS) + $(RANLIB) SWF$(A) + +GFX_DEPS=../libgfxpdf$(A) ../libgfxswf$(A) ../librfxswf$(A) ../libgfx$(A) ../libocr$(A) ../libbase$(A) +gfx.$(SLEXT): gfx.$(O) $(GFX_DEPS) Makefile + $(L) -g $(SHARED) gfx.$(O) -o gfx.$(SLEXT) $(GFX_DEPS) $(PYTHON_LIB) $(LIBS) $(CXXLIBS) +gfx$(A): gfx.$(O) $(GFX_DEPS) Makefile + mkdir -p tmp + ar cru gfx$(A) gfx.$(O) + for file in $(GFX_DEPS);do rm -f tmp/*;cd tmp;ar x ../$$file || cp ../$$file .;cd ..;$(AR) q gfx$(A) tmp/*.$(O) || break;done + $(RANLIB) gfx$(A) + +#TODO: +install: + +# for debugging: +mypython$(E): mypython.c Makefile + $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) mypython.c -o mypython$(E) $(PYTHON_LIB) +swfpython$(E): swfpython.c Makefile primitives.$(O) tagmap.$(O) taglist.$(O) tag.$(O) tags.$(O) action.$(O) pyutils.$(O) SWF.$(O) + $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) swfpython.c -o swfpython$(E) $(PYTHON_LIB) ../librfxswf$(A) ../png.$(O) $(LIBS) +testmem$(E): testmem.c Makefile + $(L) $(PYTHON_INCLUDES) testmem.c -o testmem$(E) $(PYTHON_LIB) $(LIBS) + +test: test6 + +test1: SWF.$(SLEXT) + ./test_create.py + swfdump -p tmp/test.swf +test2: SWF.$(SLEXT) + ./test_combine.py + swfdump -u -p tmp/combined.swf +test3: SWF.$(SLEXT) + ./test_simple.py +test4: SWF.$(SLEXT) + ./test_movie.py + swfdump -u -p tmp/test.swf +test5: SWF.$(SLEXT) + ./test_image.py + swfdump -u -p tmp/test.swf +test6: SWF.$(SLEXT) + ./test_sprite.py +clean: + rm -f *.o *.obj *.so mypython swfpython + +.PHONY: test test1 test2 static all exe diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in new file mode 100644 index 000000000..703949bdf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in @@ -0,0 +1,81 @@ +top_builddir = ../.. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../../Makefile.common + +all: gfx.$(SLEXT) +static: SWF$(A) gfx$(A) +exe: mypython$(E) swfpython$(E) testmem$(E) + +primitives.$(O): primitives.c primitives.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c primitives.c -o primitives.$(O) +tagmap.$(O): tagmap.c tagmap.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tagmap.c -o tagmap.$(O) +taglist.$(O): taglist.c taglist.h tagmap.h tag.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c taglist.c -o taglist.$(O) +tag.$(O): tag.c tag.h tagmap.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tag.c -o tag.$(O) +tags.$(O): tags.c tags.h tagmap.h tag.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tags.c -o tags.$(O) +image.$(O): image.c image.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c image.c -o image.$(O) +action.$(O): action.c action.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c action.c -o action.$(O) +pyutils.$(O): pyutils.c pyutils.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c pyutils.c -o pyutils.$(O) +gfx.$(O): gfx.c + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c gfx.c -o gfx.$(O) + +SWF.$(O): SWF.c pyutils.h primitives.h taglist.h + $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c SWF.c -o SWF.$(O) + +SWF_OBJS=SWF.$(O) taglist.$(O) tag.$(O) image.$(O) tags.$(O) tagmap.$(O) action.$(O) primitives.$(O) pyutils.$(O) +SWF_DEPS=../librfxswf$(A) ../libbase$(A) +SWF.$(SLEXT): $(SWF_OBJS) $(SWF_DEPS) Makefile + $(L) -g $(SHARED) $(SWF_OBJS) $(SWF_DEPS) -o SWF.$(SLEXT) $(PYTHON_LIB) $(LIBS) +SWF$(A): $(SWF_OBJS) $(SWF_DEPS) Makefile + $(AR) cru SWF$(A) $(SWF_OBJS) $(SWF_DEPS) + $(RANLIB) SWF$(A) + +GFX_DEPS=../libgfxpdf$(A) ../libgfxswf$(A) ../librfxswf$(A) ../libgfx$(A) ../libocr$(A) ../libbase$(A) +gfx.$(SLEXT): gfx.$(O) $(GFX_DEPS) Makefile + $(L) -g $(SHARED) gfx.$(O) -o gfx.$(SLEXT) $(GFX_DEPS) $(PYTHON_LIB) $(LIBS) $(CXXLIBS) +gfx$(A): gfx.$(O) $(GFX_DEPS) Makefile + mkdir -p tmp + ar cru gfx$(A) gfx.$(O) + for file in $(GFX_DEPS);do rm -f tmp/*;cd tmp;ar x ../$$file || cp ../$$file .;cd ..;$(AR) q gfx$(A) tmp/*.$(O) || break;done + $(RANLIB) gfx$(A) + +#TODO: +install: + +# for debugging: +mypython$(E): mypython.c Makefile + $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) mypython.c -o mypython$(E) $(PYTHON_LIB) +swfpython$(E): swfpython.c Makefile primitives.$(O) tagmap.$(O) taglist.$(O) tag.$(O) tags.$(O) action.$(O) pyutils.$(O) SWF.$(O) + $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) swfpython.c -o swfpython$(E) $(PYTHON_LIB) ../librfxswf$(A) ../png.$(O) $(LIBS) +testmem$(E): testmem.c Makefile + $(L) $(PYTHON_INCLUDES) testmem.c -o testmem$(E) $(PYTHON_LIB) $(LIBS) + +test: test6 + +test1: SWF.$(SLEXT) + ./test_create.py + swfdump -p tmp/test.swf +test2: SWF.$(SLEXT) + ./test_combine.py + swfdump -u -p tmp/combined.swf +test3: SWF.$(SLEXT) + ./test_simple.py +test4: SWF.$(SLEXT) + ./test_movie.py + swfdump -u -p tmp/test.swf +test5: SWF.$(SLEXT) + ./test_image.py + swfdump -u -p tmp/test.swf +test6: SWF.$(SLEXT) + ./test_sprite.py +clean: + rm -f *.o *.obj *.so mypython swfpython + +.PHONY: test test1 test2 static all exe diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c b/fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c new file mode 100644 index 000000000..050b36a43 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c @@ -0,0 +1,465 @@ +/* SWF.c + + Python wrapper for librfxswf- module core. + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" +#include "../log.h" +#include "./pyutils.h" +#include "./tags.h" +#include "./taglist.h" +#include "./primitives.h" +#include "./action.h" + +/* +TODO: + 1) taglist is rfxswflib's linked list. It should maybe implemented as Python + list, which would, however, mean that we would have to convert the list + back and forth for the following functions: + load, save, writeCGI, unfoldAll, foldAll, optimizeOrder + 2) taglist should have an ID handler. Every time a tag is inserted, it's ID + is stored in a lookup list. + 3) +*/ + +//-------------------------- Types ------------------------------------------- + +staticforward PyTypeObject SWFClass; + +/* Tags, Objects */ + +typedef struct { + PyObject_HEAD + SWF swf; //swf.firstTag is not used + PyObject*taglist; + char*filename; +} SWFObject; + + +//---------------------------------------------------------------------------- +static PyObject* f_create(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"version", "fps", "bbox", "name", NULL}; + SWFObject* swf; + int version = 6; + double framerate = 25; + PyObject * obbox = 0; + SRECT bbox = {0,0,0,0}; + char* filename = 0; + + swf = PyObject_New(SWFObject, &SWFClass); + mylog("+%08x(%d) create\n", (int)swf, swf->ob_refcnt); + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|idOs", + kwlist, &version, &framerate, + &obbox, &filename)) + return NULL; + + if(obbox) { + if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { + obbox = f_BBox(0, obbox, 0); + if(!obbox) + return NULL; + } + bbox = bbox_getSRECT(obbox); + } + + memset(&swf->swf, 0, sizeof(SWF)); + if(filename) + swf->filename = strdup(filename); + else + swf->filename = 0; + + swf->swf.fileVersion = version; + swf->swf.frameRate = (int)(framerate*0x100); + swf->swf.movieSize = bbox; + swf->taglist = taglist_new(); + + if(swf->swf.fileVersion>=6) + swf->swf.compressed = 1; + + mylog(" %08x(%d) create: done\n", (int)swf, swf->ob_refcnt); + return (PyObject*)swf; +} +//---------------------------------------------------------------------------- +static PyObject* f_load(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist1[] = {"filename", NULL}; + static char *kwlist2[] = {"data", NULL}; + char* filename = 0; + char* data = 0; + int len = 0; + SWFObject* swf; + int fi; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist1, &filename)) { + PyErr_Clear(); + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#", kwlist2, &data, &len)) { + PyErr_Clear(); + PyArg_ParseTupleAndKeywords(args, kwargs, "s:load", kwlist1, &filename); + return 0; + } + } + + swf = PyObject_New(SWFObject, &SWFClass); + mylog("+%08x(%d) f_load\n", (int)swf, swf->ob_refcnt); + + memset(&swf->swf, 0, sizeof(SWF)); + + if(filename) { + if(!filename) { + PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename)); + return 0; + } + swf->filename = strdup(filename); + fi = open(filename,O_RDONLY|O_BINARY); + if (fi<0) { + return PY_ERROR("Couldn't open file %s", filename); + } + if(swf_ReadSWF(fi,&swf->swf)<0) { + close(fi); + return PY_ERROR("%s is not a valid SWF file or contains errors",filename); + } + close(fi); + } else { + reader_t r; + reader_init_memreader(&r, data, len); + swf->filename = 0; + if(swf_ReadSWF2(&r, &swf->swf)<0) { + return PY_ERROR(" is not a valid SWF file or contains errors"); + } + r.dealloc(&r); + } + swf_FoldAll(&swf->swf); + + swf->taglist = taglist_new2(swf->swf.firstTag); + if(swf->taglist == NULL) { + return NULL; + } + + swf_FreeTags(&swf->swf); + swf->swf.firstTag = 0; + + return (PyObject*)swf; +} +//---------------------------------------------------------------------------- +static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"name", "compress", NULL}; + SWFObject*swfo; + SWF*swf; + int fi; + char*filename = 0; + int compress = 0; + + if(!self) + return NULL; + + swfo = (SWFObject*)self; + swf = &swfo->swf; + + filename = swfo->filename; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &filename, &compress)) + return NULL; + + mylog(" %08x(%d) f_save filename=%s compress=%d\n", (int)self, self->ob_refcnt, filename, compress); + + // keyword arg compress (=1) forces compression + if(compress) + swf->compressed = 1; + + swf->firstTag = taglist_getTAGs(swfo->taglist); + + /*if(!swf->firstTag) + return NULL;*/ + + // fix the file, in case it is empty or not terminated properly + { + TAG*tag = swf->firstTag; + if(!tag) + tag = swf->firstTag = swf_InsertTag(0,ST_END); + while(tag && tag->next) { + tag = tag->next; + } + if(tag->id != ST_END) { + tag = swf_InsertTag(tag,ST_END); + } + } + + fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if(fi<0) { + PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename)); + return 0; + } + if(swf_WriteSWF(fi, swf)<0) { + close(fi); + PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed.")); + return 0; + } + close(fi); + + swf_FreeTags(swf); + /*{ TAG * t = swf->firstTag; + while (t) + { + mylog("tag: %08x\n",t); + mylog(" id: %d (%s)\n", t->id, swf_TagGetName(t)); + mylog(" data: %08x (%d bytes)\n", t->data, t->len); + mylog(" next: %08x\n", t->next); + TAG * tnew = t->next; + mylog("->free data\n"); + if (t->data) free(t->data); + mylog("->free tag\n"); + free(t); + t = tnew; + } + }*/ + swf->firstTag = 0; + + mylog(" %08x(%d) f_save filename=%s done\n", (int)self, self->ob_refcnt, filename); + + return PY_NONE; +} +//---------------------------------------------------------------------------- +static PyObject * swf_writeCGI(PyObject* self, PyObject* args) +{ + SWFObject*swf = (SWFObject*)self; + if(!self || !PyArg_ParseTuple(args,"")) + return NULL; + swf->swf.firstTag = taglist_getTAGs(swf->taglist); + if(!swf->swf.firstTag) + return NULL; + swf_WriteCGI(&swf->swf); + swf_FreeTags(&swf->swf); + swf->swf.firstTag = 0; + return PY_NONE; +} +//---------------------------------------------------------------------------- + +//TODO: void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free + +static PyMethodDef swf_functions[] = +{{"save", (PyCFunction)swf_save, METH_KEYWORDS, "Save SWF to disk"}, + {"writeCGI", (PyCFunction)swf_writeCGI, METH_VARARGS, "print SWF as CGI to stdout"}, + {NULL, NULL, 0, NULL} +}; + +//---------------------------------------------------------------------------- +static void swf_dealloc(PyObject* self) +{ + mylog("-%08x(%d) swf_dealloc\n", (int)self, self->ob_refcnt); + SWFObject*swfo; + SWF*swf; + swfo = (SWFObject*)self; + swf = &swfo->swf; + if(swfo->filename) { + free(swfo->filename); + swfo->filename = 0; + } + Py_DECREF(swfo->taglist); + swfo->taglist = 0; + PyObject_Del(self); +} +//---------------------------------------------------------------------------- +static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW +{ + mylog(" %08x(%d) print \n", (int)self, self->ob_refcnt); + SWFObject*swf = (SWFObject*)self; + swf_DumpHeader(fi, &swf->swf); + //void swf_DumpSWF(FILE * f,SWF*swf); + return 0; +} +//---------------------------------------------------------------------------- +static PyObject* swf_getattr(PyObject * self, char* a) +{ + SWFObject*swf = (SWFObject*)self; + PyObject* ret = 0; + + if(!strcmp(a, "fps")) { + double fps = swf->swf.frameRate/256.0; + mylog(" %08x(%d) swf_getattr %s = %f\n", (int)self, self->ob_refcnt, a, fps); + return Py_BuildValue("d", fps); + } else if(!strcmp(a, "version")) { + int version = swf->swf.fileVersion;; + mylog(" %08x(%d) swf_getattr %s = %d\n", (int)self, self->ob_refcnt, a, version); + return Py_BuildValue("i", version); + } else if(!strcmp(a, "name")) { + char*filename = swf->filename; + mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename); + return Py_BuildValue("s", filename); + } else if(!strcmp(a, "bbox")) { + return f_BBox2(swf->swf.movieSize); + } else if(!strcmp(a, "tags")) { + PyObject*ret = (PyObject*)(swf->taglist); + Py_INCREF(ret); + mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt); + return ret; + } else if(!strcmp(a, "filesize")) { + int s = swf->swf.fileSize; + return Py_BuildValue("i", s); + } else if(!strcmp(a, "width")) { + int w = (swf->swf.movieSize.xmax - swf->swf.movieSize.xmin) / 20; + return Py_BuildValue("i", w); + } else if(!strcmp(a, "height")) { + int h = (swf->swf.movieSize.ymax - swf->swf.movieSize.ymin) / 20; + return Py_BuildValue("i", h); + } else if(!strcmp(a, "framecount")) { + int f = swf->swf.frameCount; + return Py_BuildValue("i", f); + } + + ret = Py_FindMethod(swf_functions, self, a); + mylog(" %08x(%d) swf_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); + return ret; +} +//---------------------------------------------------------------------------- +static int swf_setattr(PyObject * self, char* a, PyObject * o) +{ + SWFObject*swf = (SWFObject*)self; + if(!strcmp(a, "fps")) { + double fps; + if (!PyArg_Parse(o, "d", &fps)) + goto err; + swf->swf.frameRate = (int)(fps*0x100); + mylog(" %08x(%d) swf_setattr %s = %f\n", (int)self, self->ob_refcnt, a, fps); + return 0; + } else if(!strcmp(a, "version")) { + int version; + if (!PyArg_Parse(o, "i", &version)) + goto err; + swf->swf.fileVersion = version; + mylog(" %08x(%d) swf_setattr %s = %d\n", (int)self, self->ob_refcnt, a, version); + return 0; + } else if(!strcmp(a, "name")) { + char*filename; + if (!PyArg_Parse(o, "s", &filename)) + goto err; + if(swf->filename) { + free(swf->filename);swf->filename=0; + } + swf->filename = strdup(filename); + mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename); + return 0; + } else if(!strcmp(a, "bbox")) { + PyObject *obbox = o; + if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { + obbox = f_BBox(0, o, 0); + if(!obbox) + return 1; + } + SRECT bbox = bbox_getSRECT(obbox); + + swf->swf.movieSize = bbox; + mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax); + return 0; + } else if(!strcmp(a, "tags")) { + PyObject* taglist; + taglist = o; + PY_ASSERT_TYPE(taglist,&TagListClass); + Py_DECREF(swf->taglist); + swf->taglist = taglist; + Py_INCREF(swf->taglist); + mylog(" %08x(%d) swf_setattr %s = %08x\n", (int)self, self->ob_refcnt, a, swf->taglist); + return 0; + } +err: + mylog(" %08x(%d) swf_setattr %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o); + return 1; +} + +//---------------------------------------------------------------------------- +static PyTypeObject SWFClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "SWF", + tp_basicsize: sizeof(SWFObject), + tp_itemsize: 0, + tp_dealloc: swf_dealloc, + tp_print: swf_print, + tp_getattr: swf_getattr, + tp_setattr: swf_setattr, +}; +//---------------------------------------------------------------------------- + +static PyMethodDef SWFMethods[] = +{ + /* SWF creation*/ + {"load", (PyCFunction)f_load, METH_KEYWORDS, "Load a SWF from disc."}, + {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."}, + {0,0,0,0} + // save is a member function +}; +PyMethodDef* swf_getMethods() +{ + SWFClass.ob_type = &PyType_Type; + return SWFMethods; +} + +// ============================================================================= + +#include "primitives.h" +#include "action.h" +#include "tag.h" +#include "taglist.h" + +static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs) +{ + int _verbose = 0; + static char *kwlist[] = {"verbosity", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &_verbose)) + return NULL; + setVerbosity(_verbose); + + return Py_BuildValue("s", 0); +} + +static PyMethodDef LoggingMethods[] = +{ + /* Module functions */ + {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"}, + {0,0,0,0} +}; + +void initSWF(void) +{ + PyObject*module; + PyMethodDef* primitive_methods = primitive_getMethods(); + PyMethodDef* tag_methods = tags_getMethods(); + PyMethodDef* action_methods = action_getMethods(); + PyMethodDef* swf_methods = swf_getMethods(); + + PyMethodDef* all_methods = 0; + all_methods = addMethods(all_methods, primitive_methods); + all_methods = addMethods(all_methods, tag_methods); + all_methods = addMethods(all_methods, action_methods); + all_methods = addMethods(all_methods, swf_methods); + + all_methods = addMethods(all_methods, LoggingMethods); + + module = Py_InitModule("SWF", all_methods); + + /* Python doesn't copy the PyMethodDef struct, so we need + to keep it around */ + // free(all_methods) +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/action.c b/fluidbook/tools/swftools-special-swfdump/lib/python/action.c new file mode 100644 index 000000000..7ef6c9cef --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/action.c @@ -0,0 +1,115 @@ +/* action.c + + Python wrapper for librfxswf- actionscript stuff + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" +#include "../log.h" +#include "./pyutils.h" +#include "action.h" + + +typedef struct { + PyObject_HEAD + ActionTAG*action; +} ActionObject; + +PyObject* f_Action(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"code", NULL}; + ActionObject* action; + char*code = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &code)) + return NULL; + action = PyObject_New(ActionObject, &ActionClass); + action->action = 0; + return (PyObject*)action; +} +static PyObject* action_getattr(PyObject * self, char* a) +{ + ActionObject*action = (ActionObject*)self; +/* if(!strcmp(a, "r")) { + return Py_BuildValue("r", action->rgba.r); + } else if(!strcmp(a, "g")) { + return Py_BuildValue("g", action->rgba.g); + } else if(!strcmp(a, "b")) { + return Py_BuildValue("b", action->rgba.b); + } else if(!strcmp(a, "a")) { + return Py_BuildValue("a", action->rgba.a); + }*/ + return NULL; +} +static int action_setattr(PyObject * self, char* attr, PyObject* o) +{ + ActionObject*action = (ActionObject*)self; +/* if(!strcmp(attr, "r")) { + if (!PyArg_Parse(o, "d", &action->rgba.r)) goto err; + return 0; + } else if(!strcmp(attr, "g")) { + if (!PyArg_Parse(o, "d", &action->rgba.g)) goto err; + return 0; + } else if(!strcmp(attr, "b")) { + if (!PyArg_Parse(o, "d", &action->rgba.b)) goto err; + return 0; + } else if(!strcmp(attr, "a")) { + if (!PyArg_Parse(o, "d", &action->rgba.a)) goto err; + return 0; + } +err: + mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, attr, o);*/ + return 1; +} + +ActionTAG* action_getAction(PyObject*self) +{ + ActionObject*action= 0; + if (!PyArg_Parse(self, "O!", &ActionClass, &action)) { + return 0; + } + return action->action; +} + +PyTypeObject ActionClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "Action", + tp_basicsize: sizeof(ActionObject), + tp_itemsize: 0, + tp_dealloc: dummy_dealloc, + tp_print: 0, + tp_getattr: action_getattr, + tp_setattr: action_setattr, +}; + +static PyMethodDef action_methods[] = +{ + {"Action", (PyCFunction)f_Action, METH_KEYWORDS, "Create a new action object."}, + {NULL, NULL, 0, NULL} +}; + +PyMethodDef* action_getMethods() +{ + ActionClass.ob_type = &PyType_Type; + return action_methods; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/action.h b/fluidbook/tools/swftools-special-swfdump/lib/python/action.h new file mode 100644 index 000000000..22637a95e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/action.h @@ -0,0 +1,35 @@ +/* action.h + + Python wrapper for librfxswf- actionscript stuff (header) + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __action_h__ +#define __action_h__ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" + +extern PyTypeObject ActionClass; +PyObject* f_Action(PyObject* self, PyObject* args, PyObject* kwargs); +ActionTAG* action_getAction(PyObject* self); + +PyMethodDef* action_getMethods(); +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c b/fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c new file mode 100644 index 000000000..b0ce8f325 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c @@ -0,0 +1,2016 @@ +/* gfx.c + + Python wrapper for gfx convert + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#undef HAVE_STAT +#include "../../config.h" +#include "../gfxtools.h" +#include "../devices/swf.h" +#include "../devices/render.h" +#include "../devices/ocr.h" +#include "../devices/rescale.h" +#include "../devices/text.h" +#ifdef USE_OPENGL +#include "../devices/opengl.h" +#endif +#include "../pdf/pdf.h" +#include "../readers/swf.h" +#include "../readers/image.h" +#include "../log.h" +#include "../kdtree.h" +#include "../utf8.h" +#include "../gfxdevice.h" +#include "../gfximage.h" + +#if PY_MAJOR_VERSION >= 3 +#define PYTHON3 +#define M_FLAGS (METH_VARARGS|METH_KEYWORDS) +#else +#define M_FLAGS (METH_KEYWORDS) +#endif + +typedef struct _state { + gfxsource_t*pdfdriver; + gfxsource_t*swfdriver; + gfxsource_t*imagedriver; +} state_t; + +#ifdef PYTHON3 +#define STATE(m) ((state_t*)PyModule_GetState(m)) +#else +static state_t global_state = {0,0,0}; +#define STATE(m) &global_state; +#endif + + +static PyTypeObject OutputClass; +static PyTypeObject PageClass; +static PyTypeObject DocClass; +static PyTypeObject FontClass; +static PyTypeObject GlyphClass; +static PyTypeObject CharClass; +static PyTypeObject KDTreeClass; +static PyTypeObject BitmapClass; + +typedef struct { + PyObject_HEAD + gfxdevice_t*output_device; + PyObject*pyobj; //only for passthrough +} OutputObject; + +typedef struct { + PyObject_HEAD + PyObject*parent; + gfxpage_t*page; + int nr; +} PageObject; + +typedef struct { + PyObject_HEAD + gfxdocument_t*doc; + char*filename; + int page_pos; +} DocObject; + +typedef struct { + PyObject_HEAD + gfxfont_t*gfxfont; +} FontObject; + +typedef struct { + PyObject_HEAD + FontObject*font; + int nr; +} GlyphObject; + +typedef struct { + PyObject_HEAD + FontObject*font; + int nr; + gfxmatrix_t matrix; + int size; + gfxcolor_t color; +} CharObject; + +typedef struct { + PyObject_HEAD + kdtree_t*kdtree; +} KDTreeObject; + +typedef struct { + PyObject_HEAD + gfximage_t*image; +} BitmapObject; + +static char* strf(char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + return strdup(buf); +} +static inline PyObject*pystring_fromstring(const char*s) +{ +#ifdef PYTHON3 + return PyUnicode_FromString(s); +#else + return PyString_FromString(s); +#endif +} +static inline int pystring_check(PyObject*o) +{ +#ifdef PYTHON3 + return PyUnicode_Check(o); +#else + return PyString_Check(o); +#endif +} +static inline PyObject*pyint_fromlong(long l) +{ +#ifdef PYTHON3 + return PyLong_FromLong(l); +#else + return PyInt_FromLong(l); +#endif +} +static inline const char*pystring_asstring(PyObject*s) +{ +#ifdef PYTHON3 + return PyUnicode_AS_DATA(s); +#else + return PyString_AsString(s); +#endif +} +PyObject*forward_getattr(PyObject*self, char *a) +{ + PyObject*o = pystring_fromstring(a); + PyObject*ret = PyObject_GenericGetAttr(self, o); + Py_DECREF(o); + return ret; +} + +#define PY_ERROR(s,args...) (PyErr_SetString(PyExc_Exception, strf(s, ## args)),(void*)NULL) +#define PY_NONE Py_BuildValue("s", 0) + +//--------------------------------------------------------------------- +PyDoc_STRVAR(output_save_doc, \ +"save(filename)\n\n" +"Saves the contents of an output device to a file\n" +"Depending on what the output device is, the contents\n" +"of the file may be plain text, an image, an SWF file,\n" +"etc.\n" +"For the ImageList device, several files (named\n" +"filename.1.png, filename.2.png etc.) might be created)\n" +); +static PyObject* output_save(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + char*filename = 0; + static char *kwlist[] = {"filename", NULL}; + int ret; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + gfxresult_t*result = self->output_device->finish(self->output_device); + self->output_device = 0; + ret = result->save(result, filename); + result->destroy(result); + Py_END_ALLOW_THREADS + if(ret < 0) { + return PY_ERROR("Couldn't write to %s", filename); + } + return PY_NONE; +} + +PyDoc_STRVAR(output_startpage_doc, \ +"startpage(width, height)\n\n" +"Starts a new page/frame in the output device.\n" +"The usual way to render documents is to start a new page in the\n" +"device for each page in the document:\n" +"\n" +"for pagenr in range(1,doc.pages+1):\n" +" page = doc.getPage(pagenr)\n" +" output.startpage(page.width, page.height)\n" +" page.render(output)\n" +" output.endpage()\n" +"\n" +"It is, however, also possible to render more than one document page\n" +"to a single output page. E.g. for side-by-side or book views.\n" +); +static PyObject* output_startpage(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + int width=0, height=0; + if (!PyArg_ParseTuple(args, "ii", &width, &height)) + return NULL; + Py_BEGIN_ALLOW_THREADS + self->output_device->startpage(self->output_device, width, height); + Py_END_ALLOW_THREADS + return PY_NONE; +} + +/* as the definition of the python image type comes from another module (not + included here, reproduce the necessary structure and extract the image + without using the type definition */ +typedef struct { + PyObject_HEAD + gfximage_t*image; + PyObject* strrepr; +} ImageObject; +static gfximage_t*toImage(PyObject*_bitmap) +{ + if(!_bitmap || !_bitmap->ob_type->tp_name || strcmp(_bitmap->ob_type->tp_name, "Image")) { + PY_ERROR("Second argument to fillbitmap must be an image"); + return 0; + } + ImageObject*bitmap = (ImageObject*)_bitmap; + return bitmap->image; +} + +static gfxline_t*toLine(PyObject*_line) +{ + int t; + int num = PyList_Size(_line); + gfxline_t first; + first.next = 0; + gfxline_t*last=&first; + for(t=0;tnext = l; + last = l; + if(type[0]=='m') { + l->type = gfx_moveTo; + if(size!=3) + return PY_ERROR("need 2 values for move"); + l->x = PyFloat_AsDouble(PyTuple_GetItem(p, 1)); + l->y = PyFloat_AsDouble(PyTuple_GetItem(p, 2)); + } else if(type[0]=='l') { + l->type = gfx_lineTo; + if(size!=3) + return PY_ERROR("need 2 values for line"); + l->x = PyFloat_AsDouble(PyTuple_GetItem(p, 1)); + l->y = PyFloat_AsDouble(PyTuple_GetItem(p, 2)); + } else if(type[0]=='s') { + l->type = gfx_splineTo; + if(size!=5) + return PY_ERROR("need 4 values for spline"); + l->x = PyFloat_AsDouble(PyTuple_GetItem(p, 1)); + l->y = PyFloat_AsDouble(PyTuple_GetItem(p, 2)); + l->sx = PyFloat_AsDouble(PyTuple_GetItem(p, 3)); + l->sy = PyFloat_AsDouble(PyTuple_GetItem(p, 4)); + } else { + return PY_ERROR("Unknown line code '%s'", type); + } + } + return first.next; +} + +PyDoc_STRVAR(output_fillbitmap_doc, \ +"fillbitmap()\n\n" +"fill a polygon with a bitmap pattern\n" +); +static PyObject* output_fillbitmap(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + PyObject*_line=0; + PyObject*_bitmap=0; + static char *kwlist[] = {"line", "bitmap", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O", kwlist, &PyList_Type, &_line, &_bitmap)) + return NULL; + + gfximage_t*image = toImage(_bitmap); + if(!image) + return PY_ERROR("invalid image"); + + gfxline_t*line = toLine(_line); + if(!line) + return 0; + + /* TODO */ + gfxmatrix_t m; + memset(&m, 0, sizeof(gfxmatrix_t)); + m.m00 = m.m11 = 1.0; + + self->output_device->fillbitmap(self->output_device, line, image, &m, 0); + gfxline_free(line); + return PY_NONE; +} + +PyDoc_STRVAR(output_fill_doc, \ +"fill()\n\n" +"fill a polygon with a color\n" +); +static PyObject* output_fill(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + PyObject*_line=0; + PyObject*_bitmap=0; + static char *kwlist[] = {"line", "color", NULL}; + + PyObject* color=0; + + int a=255,r=0,g=0,b=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O", kwlist, &PyList_Type, &_line, &color)) + return NULL; + + if(!PyArg_ParseTuple(color, "iiii:color", &a, &r, &g, &b)) { + return NULL; + } + + gfxcolor_t c; + c.r = r; c.g = g; c.b = b; c.a = a; + + gfxline_t*line = toLine(_line); + if(!line) + return 0; + + /* TODO */ + gfxmatrix_t m; + memset(&m, 0, sizeof(gfxmatrix_t)); + m.m00 = m.m11 = 1.0; + + self->output_device->fill(self->output_device, line, &c); + gfxline_free(line); + return PY_NONE; +} + +PyDoc_STRVAR(output_stroke_doc, \ +"stroke()\n\n" +"stroke a polygon with a color\n" +); +static PyObject* output_stroke(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + PyObject*_line=0; + PyObject*_bitmap=0; + static char *kwlist[] = {"line", "width", "color", NULL}; + + PyObject* color=0; + + int a=255,r=0,g=0,b=0; + float width = 1.0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!fO", kwlist, &PyList_Type, &_line, &width, &color)) + return NULL; + + if(!PyArg_ParseTuple(color, "iiii:color", &a, &r, &g, &b)) { + return NULL; + } + + gfxcolor_t c; + c.r = r; c.g = g; c.b = b; c.a = a; + + gfxline_t*line = toLine(_line); + if(!line) + return 0; + + self->output_device->stroke(self->output_device, line, width, &c, + /*TODO*/ gfx_capRound, gfx_joinRound, 0.0); + gfxline_free(line); + return PY_NONE; +} + +PyDoc_STRVAR(output_endpage_doc, \ +"endpage()\n\n" +"Ends a page in the output device. This function should be called\n" +"once for every startpage()\n" +); +static PyObject* output_endpage(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + if (!PyArg_ParseTuple(args, "")) + return NULL; + Py_BEGIN_ALLOW_THREADS + self->output_device->endpage(self->output_device); + Py_END_ALLOW_THREADS + return PY_NONE; +} +PyDoc_STRVAR(output_setparameter_doc, \ +"setparameter(key, value)\n\n" +"Set a output-device dependent parameter" +); +static PyObject* output_setparameter(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + OutputObject* self = (OutputObject*)_self; + static char *kwlist[] = {"key", "value", NULL}; + char*key=0,*value=0; + if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value)) + return NULL; + self->output_device->setparameter(self->output_device, key, value); + return PY_NONE; +} +PyDoc_STRVAR(f_createSWF_doc, \ +"SWF()\n\n" +"Creates a device which renders documents to SWF (Flash) files.\n" +"Depending on the way the document parser behaves (see the poly2bitmap\n" +"and bitmap parameters), the resulting SWF might use vector operations\n" +"and Flash Texts to display the document, or just a single bitmap.\n" +); +static PyObject* f_createSWF(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {NULL}; + if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) + return NULL; + OutputObject*self = PyObject_New(OutputObject, &OutputClass); + + self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_swf_init(self->output_device); + return (PyObject*)self; +} + +PyDoc_STRVAR(f_createOCR_doc, \ +"OCR()\n\n" +"Creates a device which processes documents using OCR (optical\n" +"character recognition).\n" +"This is handy for e.g. extracting fulltext from PDF documents\n" +"which have broken fonts, and where hence the \"PlainText\"\n" +"device doesn't work.\n" +); +static PyObject* f_createOCR(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {NULL}; + if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) + return NULL; + OutputObject*self = PyObject_New(OutputObject, &OutputClass); + + self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_ocr_init(self->output_device); + return (PyObject*)self; +} + + +PyDoc_STRVAR(f_createImageList_doc, \ +"ImageList()\n\n" +"Creates a device which renders documents to bitmaps.\n" +"Each page that is rendered will create new bitmap.\n" +"Using save(), you can save the images to a number\n" +"of files\n" +); +static PyObject* f_createImageList(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) + return NULL; + OutputObject*self = PyObject_New(OutputObject, &OutputClass); + + self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_render_init(self->output_device); + return (PyObject*)self; +} + +PyDoc_STRVAR(f_createPlainText_doc, \ +"PlainText()\n\n" +"Creates a device which can be used to extract text from documents,\n" +"by passing it as parameter to page.render().\n" +"The extracted text can be saved by plaintext.save(filename).\n" +); +static PyObject* f_createPlainText(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) + return NULL; + OutputObject*self = PyObject_New(OutputObject, &OutputClass); + + self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_text_init(self->output_device); + return (PyObject*)self; +} + +#ifdef USE_OPENGL +PyDoc_STRVAR(f_createOpenGL_doc, \ +"OpenGL()\n\n" +"Creates a device which renders everything to OpenGL.\n" +"Can be used for desktop display and debugging.\n" +"This device is not available on all systems.\n" +); +static PyObject* f_createOpenGL(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) + return NULL; + OutputObject*self = PyObject_New(OutputObject, &OutputClass); + + self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_opengl_init(self->output_device); + return (PyObject*)self; +} +#endif + +static jmp_buf backjump; +static int has_backjump = 0; + +static PyObject* convert_gfxline(gfxline_t*line) +{ + gfxline_t*l; + int len = 0, i = 0; + l = line; + while(l) {l=l->next;len++;} + PyObject*list = PyList_New(len); + l = line; + while(l) { + PyObject*point=0; + if(l->type == gfx_moveTo) { + point = PyTuple_New(3); + PyTuple_SetItem(point, 0, pystring_fromstring("m")); + PyTuple_SetItem(point, 1, PyFloat_FromDouble(l->x)); + PyTuple_SetItem(point, 2, PyFloat_FromDouble(l->y)); + } else if(l->type == gfx_lineTo) { + point = PyTuple_New(3); + PyTuple_SetItem(point, 0, pystring_fromstring("l")); + PyTuple_SetItem(point, 1, PyFloat_FromDouble(l->x)); + PyTuple_SetItem(point, 2, PyFloat_FromDouble(l->y)); + } else if(l->type == gfx_splineTo) { + point = PyTuple_New(5); + PyTuple_SetItem(point, 0, pystring_fromstring("s")); + PyTuple_SetItem(point, 1, PyFloat_FromDouble(l->x)); + PyTuple_SetItem(point, 2, PyFloat_FromDouble(l->y)); + PyTuple_SetItem(point, 3, PyFloat_FromDouble(l->sx)); + PyTuple_SetItem(point, 4, PyFloat_FromDouble(l->sy)); + } else { + point = PY_NONE; + } + PyList_SetItem(list, i, point); + l = l->next; + i++; + } + return list; +} +static PyObject* convert_matrix(gfxmatrix_t*m) +{ + PyObject*columns = PyTuple_New(3); + PyObject*column0 = PyTuple_New(2); + PyTuple_SetItem(column0, 0, PyFloat_FromDouble(m->m00)); + PyTuple_SetItem(column0, 1, PyFloat_FromDouble(m->m10)); + PyTuple_SetItem(columns, 0, column0); + PyObject*column1 = PyTuple_New(2); + PyTuple_SetItem(column1, 0, PyFloat_FromDouble(m->m01)); + PyTuple_SetItem(column1, 1, PyFloat_FromDouble(m->m11)); + PyTuple_SetItem(columns, 1, column1); + PyObject*column2 = PyTuple_New(2); + PyTuple_SetItem(column2, 0, PyFloat_FromDouble(m->tx)); + PyTuple_SetItem(column2, 1, PyFloat_FromDouble(m->ty)); + PyTuple_SetItem(columns, 2, column2); + return columns; +} +static PyObject* convert_color(gfxcolor_t*col) +{ + PyObject*obj = PyTuple_New(4); + PyTuple_SetItem(obj, 0, pyint_fromlong(col->a)); + PyTuple_SetItem(obj, 1, pyint_fromlong(col->r)); + PyTuple_SetItem(obj, 2, pyint_fromlong(col->g)); + PyTuple_SetItem(obj, 3, pyint_fromlong(col->b)); + return obj; +} + +static PyObject* lookup_font(gfxfont_t*font); +static PyObject* char_new(gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix); +static PyObject* create_bitmap(gfximage_t*img); + +static gfxfontlist_t* global_fonts; +static char callback_python(char*function, gfxdevice_t*dev, const char*format, ...) +{ + OutputObject*self = (OutputObject*)dev->internal; + + if(!PyObject_HasAttrString(self->pyobj, function)) + return 0; + + va_list ap; + va_start(ap, format); + + PyObject*tuple = PyTuple_New(strlen(format)); + int pos = 0; + while(format[pos]) { + char p = format[pos]; + PyObject*obj = 0; + switch(p) { + case 's': { + char*s = va_arg(ap, char*); + obj = pystring_fromstring(s); + break; + } + case 'i': { + int i = va_arg(ap, int); + obj = pyint_fromlong(i); + break; + } + case 'd': { + int i = va_arg(ap, double); + obj = PyFloat_FromDouble(i); + break; + } + case 'c': { + void* ptr = va_arg(ap, void*); + gfxcolor_t*col = (gfxcolor_t*)ptr; + obj = convert_color(col); + break; + } + case 'f': { + void* ptr = va_arg(ap, void*); + obj = lookup_font((gfxfont_t*)ptr); + break; + } + case 'l': { + void* ptr = va_arg(ap, void*); + gfxline_t*line = (gfxline_t*)ptr; + obj = convert_gfxline(line); + break; + } + case 'I': { + void* ptr = va_arg(ap, void*); + obj = create_bitmap((gfximage_t*)ptr); + break; + } + case 'O': { + void* ptr = va_arg(ap, void*); + obj = (PyObject*)ptr; + break; + } + case 'm': { + void* ptr = va_arg(ap, void*); + obj = convert_matrix((gfxmatrix_t*)ptr); + break; + } + default: { + obj = PY_NONE; + break; + } + } + PyTuple_SetItem(tuple, pos, obj); + pos++; + } + va_end(ap); + PyObject*f = PyObject_GetAttrString(self->pyobj, function); + if(!f) + return 0; + PyErr_Clear(); + PyObject* result = PyObject_CallObject(f, tuple); + Py_DECREF(tuple); + + if(!result) { + if(!has_backjump) { + PyErr_Print(); + PyErr_Clear(); + return 1; + } else { + longjmp(backjump, 1); + } + } else { + Py_DECREF(result); + return 1; + } +} + +static int my_setparameter(gfxdevice_t*dev, const char*key, const char*value) +{ + callback_python("setparameter", dev, "ss", key, value); + return 1; +} +static void my_startpage(gfxdevice_t*dev, int width, int height) +{ + callback_python("startpage", dev, "ii", width, height); +} +static void my_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + callback_python("startclip", dev, "l", line); +} +static void my_endclip(gfxdevice_t*dev) +{ + callback_python("endclip", dev, ""); +} +static void my_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ + char*cap = 0; + char*joint = 0; + if(cap_style == gfx_capButt) + cap = "butt"; + else if(cap_style == gfx_capRound) + cap = "round"; + else if(cap_style == gfx_capSquare) + cap = "square"; + if(joint_style == gfx_joinMiter) + joint = "miter"; + else if(joint_style == gfx_joinRound) + joint = "round"; + else if(joint_style == gfx_joinBevel) + joint = "bevel"; + callback_python("stroke", dev, "ldcssi", line, width, color, cap, joint, miterLimit); +} +static void my_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) +{ + callback_python("fill", dev, "lc", line, color); +} +static void my_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform) +{ + callback_python("fillbitmap", dev, "lImx", line, img, imgcoord2devcoord, cxform); +} +static void my_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) +{ + callback_python("fillgradient", dev, "lgsm", line, gradient, type, matrix); +} +static void my_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + callback_python("addfont", dev, "f", font); +} +static void my_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + PyMethodObject*obj = (PyMethodObject*)PyObject_GetAttrString(((OutputObject*)(dev->internal))->pyobj, "drawchar"); + if(!obj) { + /* if the device doesn't support chars, try drawing a polygon instead */ + if(!font) + return; + gfxglyph_t*glyph = &font->glyphs[glyphnr]; + gfxline_t*line2 = gfxline_clone(glyph->line); + gfxline_transform(line2, matrix); + my_fill(dev, line2, color); + gfxline_free(line2); + return; + } + PyFunctionObject*f = (PyFunctionObject*)obj->im_func; + PyCodeObject*c = (PyCodeObject*)f->func_code; + if(c->co_argcount == 2) { + /* new style drawchar method */ + CharObject*chr = (CharObject*)char_new(font, glyphnr, color, matrix); + callback_python("drawchar", dev, "O", chr); + } else { + callback_python("drawchar", dev, "ficm", font, glyphnr, color, matrix); + } +} +static void my_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) +{ + callback_python("drawlink", dev, "lss", line, action, text); +} +static void my_endpage(gfxdevice_t*dev) +{ + callback_python("endpage", dev, ""); +} +static gfxresult_t* my_finish(gfxdevice_t*dev) +{ + callback_python("finish", dev, ""); + return 0; +} + +PyObject* passthrough_create(PyObject*obj) +{ + OutputObject*self = PyObject_New(OutputObject, &OutputClass); + self->pyobj = obj; + Py_INCREF(obj); + self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + memset(self->output_device, 0, sizeof(gfxdevice_t)); + self->output_device->name = strdup("passthrough"); + + self->output_device->setparameter = my_setparameter; + self->output_device->startpage = my_startpage; + self->output_device->startclip = my_startclip; + self->output_device->addfont = my_addfont; + self->output_device->endclip = my_endclip; + self->output_device->stroke = my_stroke; + self->output_device->fill = my_fill; + self->output_device->fillbitmap = my_fillbitmap; + self->output_device->fillgradient = my_fillgradient; + self->output_device->drawchar = my_drawchar; + self->output_device->drawlink = my_drawlink; + self->output_device->endpage = my_endpage; + self->output_device->finish = my_finish; + self->output_device->internal = self; + + return (PyObject*)self; +} + +PyDoc_STRVAR(f_createPassThrough_doc, \ +"PassThrough(device)\n\n" +"Creates a PassThrough device, which can be used as parameter in calls\n" +"to page.render().\n" +"device needs to be a class implementing at least the following functions:\n\n" +"setparameter(key,value)\n" +"startclip(outline)\n" +"endclip()\n" +"stroke(outline, width, color, capstyle, jointstyle, miterLimit)\n" +"fill(outline, color)\n" +"fillbitmap(outline, image, matrix, colortransform)\n" +"fillgradient(outline, gradient, gradienttype, matrix)\n" +"addfont(font)\n" +"drawchar(font, glyph, color, matrix)\n" +"drawlink(outline, url)\n" +"If any of these functions are not defined, a error message will be printed,\n" +"however the rendering process will *not* be aborted.\n" +); +static PyObject* f_createPassThrough(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"device", NULL}; + PyObject*obj; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &obj)) + return NULL; + return passthrough_create(obj); +} + +static PyMethodDef output_methods[] = +{ + /* Output functions */ + {"save", (PyCFunction)output_save, M_FLAGS, output_save_doc}, + {"startpage", (PyCFunction)output_startpage, M_FLAGS, output_startpage_doc}, + {"fill", (PyCFunction)output_fill, M_FLAGS, output_fill_doc}, + {"fillbitmap", (PyCFunction)output_fillbitmap, M_FLAGS, output_fillbitmap_doc}, + {"stroke", (PyCFunction)output_stroke, M_FLAGS, output_stroke_doc}, + {"endpage", (PyCFunction)output_endpage, M_FLAGS, output_endpage_doc}, + {"setparameter", (PyCFunction)output_setparameter, M_FLAGS, output_setparameter_doc}, + {0,0,0,0} +}; + +static void output_dealloc(PyObject* _self) { + OutputObject* self = (OutputObject*)_self; + + if(self->output_device) { + gfxresult_t*result = self->output_device->finish(self->output_device); + if(result) { + result->destroy(result);result=0; + } + self->output_device = 0; + } + + PyObject_Del(self); +} +static PyObject* output_getattr(PyObject * _self, char* a) +{ + OutputObject*self = (OutputObject*)_self; + +/* if(!strcmp(a, "x1")) { + return pyint_fromlong(self->output_device->x1); + } else if(!strcmp(a, "y1")) { + return pyint_fromlong(self->output_device->y1); + } else if(!strcmp(a, "x2")) { + return pyint_fromlong(self->output_device->x2); + } else if(!strcmp(a, "y2")) { + return pyint_fromlong(self->output_device->y2); + }*/ + + return forward_getattr(_self, a); +} +static int output_setattr(PyObject * _self, char* a, PyObject * o) +{ + OutputObject*self = (OutputObject*)_self; + if(!pystring_check(o)) + return -1; + const char*value = pystring_asstring(o); + self->output_device->setparameter(self->output_device, a, value); + return -1; +} +static int output_print(PyObject * _self, FILE *fi, int flags) +{ + OutputObject*self = (OutputObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} + +//--------------------------------------------------------------------- +static PyMethodDef glyph_methods[]; + +static void glyph_dealloc(PyObject* _self) { + GlyphObject* self = (GlyphObject*)_self; + Py_DECREF(self->font); + PyObject_Del(self); +} +static PyObject* glyph_getattr(PyObject * _self, char* a) +{ + GlyphObject*self = (GlyphObject*)_self; + FontObject*font = self->font; + if(!strcmp(a, "unicode")) { + return pyint_fromlong(font->gfxfont->glyphs[self->nr].unicode); + } else if(!strcmp(a, "advance")) { + return PyFloat_FromDouble(font->gfxfont->glyphs[self->nr].advance); + } else if(!strcmp(a, "polygon")) { + return convert_gfxline(font->gfxfont->glyphs[self->nr].line); + } + return forward_getattr(_self, a); +} +static int glyph_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +static PyObject* glyph_new(FontObject*font, int nr) { + GlyphObject*glyph = PyObject_New(GlyphObject, &GlyphClass); + glyph->font = font; + Py_INCREF(glyph->font); + glyph->nr = nr; + return (PyObject*)glyph; +} +static int glyph_print(PyObject * _self, FILE *fi, int flags) +{ + GlyphObject*self = (GlyphObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} +static PyMethodDef glyph_methods[] = +{ + /* Glyph functions */ + {0,0,0,0} +}; + +//--------------------------------------------------------------------- +static PyMethodDef font_methods[]; + +static void font_dealloc(PyObject* _self) { + FontObject* self = (FontObject*)_self; + PyObject_Del(self); +} +static PyObject* font_new(gfxfont_t*gfxfont) +{ + FontObject*font = PyObject_New(FontObject, &FontClass); + font->gfxfont = gfxfont; + return (PyObject*)font; +} +static gfxfontlist_t* global_fonts = 0; + +static PyObject* lookup_font(gfxfont_t*font) +{ + PyObject*fontobj = gfxfontlist_getuserdata(global_fonts, font->id); + if(!fontobj) { + fontobj = font_new(font); + global_fonts = gfxfontlist_addfont2(global_fonts, font, fontobj); + } + Py_INCREF(fontobj); + return fontobj; +} +static PyObject* font_getattr(PyObject * _self, char* a) +{ + FontObject*self = (FontObject*)_self; + if(!strcmp(a, "num_glyphs")) { + return pyint_fromlong(self->gfxfont->num_glyphs); + } else if(!strcmp(a, "name")) { + return pystring_fromstring(self->gfxfont->id); + } + return forward_getattr(_self, a); +} +static int font_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +static PyObject* font_glyph(PyObject * _self, PyObject* args, PyObject* kwargs) { + FontObject*self = (FontObject*)_self; + static char *kwlist[] = {"nr", NULL}; + static long nr = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &nr)) + return NULL; + return glyph_new(self, nr); +} +static int font_print(PyObject * _self, FILE *fi, int flags) +{ + FontObject*self = (FontObject*)_self; + fprintf(fi, "", self->gfxfont->id, _self, _self?_self->ob_refcnt:0); + return 0; +} +static PyMethodDef font_methods[] = +{ + /* Font functions */ + {"get_glyph", (PyCFunction)font_glyph, M_FLAGS, "get a glyph from this font"}, + {0,0,0,0} +}; + +//--------------------------------------------------------------------- +static PyMethodDef char_methods[]; + +static void char_dealloc(PyObject* _self) { + CharObject* self = (CharObject*)_self; + Py_DECREF(self->font); + PyObject_Del(self); +} +static PyObject* char_getattr(PyObject * _self, char* a) +{ + CharObject*self = (CharObject*)_self; + FontObject*font = self->font; + gfxglyph_t*glyph = &font->gfxfont->glyphs[self->nr]; + if(!strcmp(a, "unicode")) { + return pyint_fromlong(glyph->unicode); + } else if(!strcmp(a, "advance")) { + return PyFloat_FromDouble((self->matrix.m00 * glyph->advance)); + } else if(!strcmp(a, "matrix")) { + return convert_matrix(&self->matrix); + } else if(!strcmp(a, "color")) { + return convert_color(&self->color); + } else if(!strcmp(a, "size")) { + return pyint_fromlong(self->size); + } else if(!strcmp(a, "glyph")) { + return glyph_new(font, self->nr); + } else if(!strcmp(a, "font")) { + Py_INCREF(font); + return (PyObject*)font; + } else if(!strcmp(a, "x")) { + int x = self->matrix.tx; + return pyint_fromlong(x); + } else if(!strcmp(a, "y")) { + int y = self->matrix.ty; + return pyint_fromlong(y); + } + + int lsb = 0; //left side bearing + int x1 = self->matrix.tx - (self->matrix.m00) * lsb; + int y1 = self->matrix.ty - (-self->matrix.m11) * font->gfxfont->ascent; + int x2 = self->matrix.tx + (self->matrix.m00) * font->gfxfont->glyphs[self->nr].advance; + int y2 = self->matrix.ty + (-self->matrix.m11) * font->gfxfont->descent; + if(!strcmp(a, "bbox")) { + PyObject*bbox = PyTuple_New(4); + PyTuple_SetItem(bbox, 0, pyint_fromlong(x1)); + PyTuple_SetItem(bbox, 1, pyint_fromlong(y1)); + PyTuple_SetItem(bbox, 2, pyint_fromlong(x2)); + PyTuple_SetItem(bbox, 3, pyint_fromlong(y2)); + return bbox; + } else if(!strcmp(a, "x1")) { + return pyint_fromlong(x1); + } else if(!strcmp(a, "y1")) { + return pyint_fromlong(y1); + } else if(!strcmp(a, "x2")) { + return pyint_fromlong(x2); + } else if(!strcmp(a, "y2")) { + return pyint_fromlong(y2); + } + return forward_getattr(_self, a); +} +static int char_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +static PyObject* char_new(gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + FontObject*fontobj = (FontObject*)lookup_font(font); + CharObject*chr = PyObject_New(CharObject, &CharClass); + chr->font = fontobj; + Py_INCREF(fontobj); + chr->nr = glyphnr; + chr->matrix = *matrix; + chr->size = ceil(1024*fabs(matrix->m00 + matrix->m10)); //horizontal size + chr->color = *color; + return (PyObject*)chr; + return 0; +} +static int char_print(PyObject * _self, FILE *fi, int flags) +{ + CharObject*self = (CharObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} +static PyMethodDef char_methods[] = +{ + /* char functions */ + {0,0,0,0} +}; + +//--------------------------------------------------------------------- +static PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs); +static PyObject* page_asImage(PyObject* _self, PyObject* args, PyObject* kwargs); + +PyDoc_STRVAR(page_render_doc, \ +"render(output, move=(0,0), clip=None)\n\n" +"Renders a page to the rendering backend specified by the output\n" +"parameter. Rendering consists of calling a number of functions on the\n" +"output device, see the description of the \"PassThrough\" device.\n" +"The page may be shifted to a given position using the move parameter,\n" +"and may also be clipped to a specific size using the clip parameter.\n" +"The clipping operation is applied after the move operation.\n" +"If you don't need to specify custom page sizes or clippings, use\n" +"page.draw instead.\n" +); +static PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + PageObject* self = (PageObject*)_self; + + static char *kwlist[] = {"dev", "move", "clip", NULL}; + OutputObject*output = 0; + PyObject*move=0; + PyObject*clip=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|OO", kwlist, &OutputClass, &output, + &move,&clip + )) + return NULL; + + int x=0,y=0; + int cx1=0,cy1=0,cx2=0,cy2=0; + + if(move) { + if (!PyArg_ParseTuple(move, "ii", &x,&y)) + return NULL; + } + if(clip) { + if (!PyArg_ParseTuple(clip, "iiii", &cx1,&cy1,&cx2,&cy2)) + return NULL; + } + + Py_BEGIN_ALLOW_THREADS + if(x|y|cx1|cx2|cy1|cy2) + self->page->rendersection(self->page, output->output_device,x,y,cx1,cy1,cx2,cy2); + else + self->page->render(self->page, output->output_device); + Py_END_ALLOW_THREADS + return PY_NONE; +} + +PyDoc_STRVAR(page_draw_doc, \ +"draw(output)\n\n" +"Renders a page to the rendering backend specified by the output\n" +"parameter, with the default for page width and height.\n" +); +static PyObject* page_draw(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + PageObject* self = (PageObject*)_self; + static char *kwlist[] = {"dev", NULL}; + PyObject*output = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &output)) + return NULL; + + PyObject*passthrough = 0; + if(output->ob_type != &OutputClass) { + passthrough = passthrough_create(output); + output = passthrough; + } + gfxdevice_t*device = ((OutputObject*)passthrough)->output_device; + + if(setjmp(backjump)) { + /* exception in the code below*/ + has_backjump = 0; + //FIXME: this clear the exception, for some reason + //if(passthrough) { + // Py_DECREF(passthrough); + //} + return 0; + } + has_backjump = 1; + device->startpage(device, self->page->width, self->page->height); + self->page->render(self->page, device); + device->endpage(device); + has_backjump = 0; + + if(passthrough) { + Py_DECREF(passthrough); + } + return PY_NONE; +} + +PyDoc_STRVAR(page_asImage_doc, \ +"asImage(width, height)\n\n" +"Creates a bitmap from a page. The bitmap will be returned as a string\n" +"containing RGB triplets. The bitmap will be rescaled to the specified width and\n" +"height. The aspect ratio of width and height doesn't need to be the same\n" +"as the page.\n" +); +static PyObject* page_asImage(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + PageObject* self = (PageObject*)_self; + + static char *kwlist[] = {"width", "height", "allow_threads", NULL}; + int width=0,height=0; + int allow_threads=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii|i", kwlist, &width, &height, &allow_threads)) + return NULL; + + if(!width || !height) { + return PY_ERROR("invalid dimensions: %dx%d", width,height); + } + + PyThreadState *_save=0; + if (allow_threads) { + Py_UNBLOCK_THREADS + } + gfxdevice_t dev1,dev2; + gfxdevice_render_init(&dev1); + dev1.setparameter(&dev1, "antialise", "2"); + dev1.setparameter(&dev1, "fillwhite", "1"); + gfxdevice_rescale_init(&dev2, &dev1, width, height, 0); + dev2.startpage(&dev2, self->page->width, self->page->height); + self->page->render(self->page, &dev2); + dev2.endpage(&dev2); + gfxresult_t*result = dev2.finish(&dev2); + gfximage_t*img = (gfximage_t*)result->get(result,"page0"); + int l = img->width*img->height; + int ll = l*3; + unsigned char*data = (unsigned char*)malloc(ll); + int s,t; + for(t=0,s=0;tdata[t].r; + data[s+1] = img->data[t].g; + data[s+2] = img->data[t].b; + } + result->destroy(result); result=0; + free(img->data); free(img); + + PyObject *ret; +#ifdef PYTHON3 + ret = PyByteArray_FromStringAndSize((char*)data,ll); +#else + ret = PyString_FromStringAndSize((char*)data,ll); +#endif + free(data); + + if (allow_threads) { + Py_BLOCK_THREADS + } + return ret; +} + +static PyMethodDef page_methods[] = +{ + /* Page functions */ + {"render", (PyCFunction)page_render, M_FLAGS, page_render_doc}, + {"draw", (PyCFunction)page_draw, M_FLAGS, page_draw_doc}, + {"asImage", (PyCFunction)page_asImage, M_FLAGS, page_asImage_doc}, + {0,0,0,0} +}; +static void page_dealloc(PyObject* _self) { + PageObject* self = (PageObject*)_self; + if(self->page) { + self->page->destroy(self->page); + self->page=0; + } + if(self->parent) { + Py_DECREF(self->parent); + self->parent=0; + } + + PyObject_Del(self); +} + +static PyObject* page_getattr(PyObject * _self, char* a) +{ + PageObject*self = (PageObject*)_self; + + if(!strcmp(a, "size")) { + return Py_BuildValue("(ii)", self->page->width, self->page->height); + } if(!strcmp(a, "doc")) { + Py_INCREF(self->parent); + return self->parent; + } if(!strcmp(a, "nr")) { + return pyint_fromlong(self->nr); + } else if(!strcmp(a, "width")) { + return pyint_fromlong(self->page->width); + } else if(!strcmp(a, "height")) { + return pyint_fromlong(self->page->height); + } + return forward_getattr(_self, a); +} + +static int page_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +static int page_print(PyObject * _self, FILE *fi, int flags) +{ + PageObject*self = (PageObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} + +//--------------------------------------------------------------------- + +PyDoc_STRVAR(doc_getPage_doc, +"getPage(nr)\n\n" +"Get one page from a document file. The nr parameter specifies\n" +"which page to retrieve. Counting starts at 1, so the first page\n" +"can be retrieved by\n" +" page = doc.getPage(1)\n" +".\n" +"You can find out how many pages a document contains by querying\n" +"its pages field (doc.pages)\n" +); +static PyObject*page_new(DocObject*doc, int pagenr) +{ + PageObject*page = PyObject_New(PageObject, &PageClass); + page->page = doc->doc->getpage(doc->doc, pagenr); + page->nr = pagenr; + page->parent = (PyObject*)doc; + Py_INCREF(page->parent); + if(!page->page) { + PyObject_Del(page); + return PY_ERROR("Couldn't extract page %d", pagenr); + } + return (PyObject*)page; +} + +static PyObject* doc_getPage(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + DocObject* self = (DocObject*)_self; + + static char *kwlist[] = {"nr", NULL}; + int pagenr = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &pagenr)) + return NULL; + return page_new(self, pagenr); +} +static PyObject* doc_getiter(PyObject* _self) +{ + DocObject* self = (DocObject*)_self; + self->page_pos = 1; + Py_INCREF(self); + return (PyObject*)self; +} +static PyObject* doc_iternext(PyObject* _self) +{ + DocObject* self = (DocObject*)_self; + if(self->page_pos > self->doc->num_pages) { + return NULL; + } + return page_new(self, self->page_pos++); +} + + +PyDoc_STRVAR(doc_getInfo_doc, +"getInfo(key)\n\n" +"Retrieve some information about a document. For PDF files, key\n" +"can have the following values:\n\n" +"\"title\", \"subject\", \"keywords\", \"author\", \"creator\", \"producer\",\n" +"\"creationdate\", \"moddate\", \"linearized\", \"tagged\", \"encrypted\",\n" +"\"oktoprint\", \"oktocopy\", \"oktochange\", \"oktoaddnotes\", \"version\".\n\n" +"If the \"oktocopy\" digital rights management flag is set to \"no\", then the\n" +"pdf parser won't allow you to access the PDF file. Trying to extract pages\n" +"from it will raise an exception.\n" +); +static PyObject* doc_getInfo(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + DocObject* self = (DocObject*)_self; + + static char *kwlist[] = {"key", NULL}; + char*key = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &key)) + return NULL; + + char*s = self->doc->getinfo(self->doc, key); + return pystring_fromstring(s); +} + +PyDoc_STRVAR(doc_setparameter_doc, +"setparameter(key, value)\n\n" +"Pass a parameter or setting to the document parser. Unlike\n" +"the module level setparameter() function, the parameters set\n" +"using setparameter will only be valid for the object itself\n" +"during its lifetime.\n" +); +static PyObject* doc_setparameter(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + DocObject* self = (DocObject*)_self; + + static char *kwlist[] = {"key", "value", NULL}; + char*key = 0, *value=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key,&value)) + return NULL; + + self->doc->setparameter(self->doc, key, value); + return PY_NONE; +} + +PyDoc_STRVAR(f_open_doc, +"open(type, filename) -> object\n\n" +"Open a PDF, SWF or image file. The type argument should be \"pdf\",\n" +"\"swf\" or \"image\" accordingly. It returns a doc object which can be\n" +"used to process the file contents.\n" +"E.g.\n" +" doc = open(\"pdf\", \"document.pdf\")\n" +" doc = open(\"swf\", \"flashfile.swf\")\n" +" doc = open(\"image\", \"image.png\")\n" +"If the file could not be loaded, or is a encrypted PDF file without\n" +"a proper password specified, an exception is being raised.\n" +"If the filename argument contains a '|' char, everything behind\n" +"the '|' is treated as password used for opening the file.\n" +"E.g.\n" +" doc = open(\"pdf\", \"document.pdf|mysecretpassword\")\n" +".\n" +"Notice that for image files, the only supported file formats right now\n" +"are jpeg and png.\n" +); +static PyObject* f_open(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"type", "filename", NULL}; + char*filename=0; + char*type=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &type, &filename)) { + static char *kwlist2[] = {"filename", NULL}; + type = 0; + PyErr_Clear(); + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist2, &filename)) + return NULL; + } + + DocObject*self = PyObject_New(DocObject, &DocClass); + + if(!type) { //autodetect + type = "pdf"; //default + int l = strlen(filename); + if(l>4) { + if(filename[l-4]=='.') { + if(strchr("pP", filename[l-3]) && strchr("dD", filename[l-2]) && strchr("fF", filename[l-1])) + type = "pdf"; + if(strchr("jJ", filename[l-3]) && strchr("pP", filename[l-2]) && strchr("gG", filename[l-1])) + type = "image"; + if(strchr("pP", filename[l-3]) && strchr("nN", filename[l-2]) && strchr("gG", filename[l-1])) + type = "image"; + if(strchr("sS", filename[l-3]) && strchr("wW", filename[l-2]) && strchr("fF", filename[l-1])) + type = "swf"; + } else if(filename[l-5]=='.') { + type = "image"; + } + } + } + + state_t*state = STATE(module); + if(!strcmp(type,"pdf")) { + Py_BEGIN_ALLOW_THREADS + self->doc = state->pdfdriver->open(state->pdfdriver,filename); + Py_END_ALLOW_THREADS + } + else if(!strcmp(type, "image") || !strcmp(type, "img")) { + Py_BEGIN_ALLOW_THREADS + self->doc = state->imagedriver->open(state->imagedriver, filename); + Py_END_ALLOW_THREADS + } + else if(!strcmp(type, "swf") || !strcmp(type, "SWF")) { + Py_BEGIN_ALLOW_THREADS + self->doc = state->swfdriver->open(state->imagedriver, filename); + Py_END_ALLOW_THREADS + } + else + return PY_ERROR("Unknown type %s", type); + + if(!self->doc) { + PyObject_Del(self); + return PY_ERROR("Couldn't open %s", filename); + } + self->filename = strdup(filename); + return (PyObject*)self; +} + +static PyMethodDef doc_methods[] = +{ + /* PDF functions */ + {"getPage", (PyCFunction)doc_getPage, METH_KEYWORDS, doc_getPage_doc}, + {"getInfo", (PyCFunction)doc_getInfo, METH_KEYWORDS, doc_getInfo_doc}, + {"setparameter", (PyCFunction)doc_setparameter, METH_KEYWORDS, doc_setparameter_doc}, + {0,0,0,0} +}; + +static void doc_dealloc(PyObject* _self) { + DocObject* self = (DocObject*)_self; + if(self->doc) { + self->doc->destroy(self->doc); + self->doc=0; + } + if(self->filename) { + free(self->filename);self->filename=0; + } + PyObject_Del(self); +} +static PyObject* doc_getattr(PyObject * _self, char* a) +{ + DocObject*self = (DocObject*)_self; + if(!strcmp(a, "pages")) { + return pyint_fromlong(self->doc->num_pages); + } + if(!strcmp(a, "filename")) { + return pystring_fromstring(self->filename); + } + return forward_getattr(_self, a); +} +static int doc_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +static int doc_print(PyObject * _self, FILE *fi, int flags) +{ + DocObject*self = (DocObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} + +//--------------------------------------------------------------------- +PyDoc_STRVAR(f_createKDTree_doc, \ +"KDTree()\n\n" +"Creates a KDTree, which can be used to store bounding boxes\n" +); +static PyObject* f_createKDTree(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) + return NULL; + KDTreeObject*self = PyObject_New(KDTreeObject, &KDTreeClass); + self->kdtree = kdtree_new(); + return (PyObject*)self; +} +static void gfx_kdtree_dealloc(PyObject* _self) { + KDTreeObject* self = (KDTreeObject*)_self; + /* FIXME: we still need to Py_DECREF all PyObjects in the tree */ + kdtree_destroy(self->kdtree); + PyObject_Del(self); +} +static PyObject* gfx_kdtree_getattr(PyObject * _self, char* a) +{ + KDTreeObject*self = (KDTreeObject*)_self; + return forward_getattr(_self, a); +} +static int gfx_kdtree_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +static int gfx_kdtree_print(PyObject * _self, FILE *fi, int flags) +{ + KDTreeObject*self = (KDTreeObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} +PyDoc_STRVAR(gfx_kdtree_add_box_doc, +"put(bbox, data)\n\n" +"Add a rectangular area to the tree. All queries within that area\n" +"will subsequently return 'data'\n" +); +static PyObject* gfx_kdtree_add_box(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + KDTreeObject* self = (KDTreeObject*)_self; + + static char *kwlist[] = {"bbox", "data", NULL}; + int x1=0,y1=0,x2=0,y2=0; + PyObject*value=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(iiii)O", kwlist, &x1, &y1, &x2, &y2, &value)) + return NULL; + + kdtree_add_box(self->kdtree, x1,y1,x2,y2, value); + Py_INCREF(value); + + return PY_NONE; +} + +PyDoc_STRVAR(gfx_kdtree_find_doc, +"find(x,y)\n\n" +"Look for a coordinate in the kdtree. It will return last inserted object covering that position, or None.\n" +); +static PyObject* gfx_kdtree_find(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + KDTreeObject* self = (KDTreeObject*)_self; + + static char *kwlist[] = {"x", "y", NULL}; + int x=0,y=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &x, &y)) + return NULL; + PyObject*value = (PyObject*)kdtree_find(self->kdtree, x,y); + if(!value) { + return PY_NONE; + } else { + Py_INCREF(value); + return value; + } +} + +static PyMethodDef gfx_kdtree_methods[] = +{ + {"add_box", (PyCFunction)gfx_kdtree_add_box, METH_KEYWORDS, gfx_kdtree_add_box_doc}, + {"find", (PyCFunction)gfx_kdtree_find, METH_KEYWORDS, gfx_kdtree_find_doc}, + {0,0,0,0} +}; + +//--------------------------------------------------------------------- +PyDoc_STRVAR(f_createBitmap_doc, \ +"Bitmap()\n\n" +"Creates a Bitmap, which can be used to store bounding boxes\n" +); +static PyObject* create_bitmap(gfximage_t*img) +{ + BitmapObject*self = PyObject_New(BitmapObject, &BitmapClass); + self->image = malloc(sizeof(gfximage_t)); + self->image->data = malloc(sizeof(gfxcolor_t)*img->width*img->height); + memcpy(self->image->data, img->data, sizeof(gfxcolor_t)*img->width*img->height); + self->image->width = img->width; + self->image->height = img->height; + return (PyObject*)self; +} +static void gfx_bitmap_dealloc(PyObject* _self) { + BitmapObject* self = (BitmapObject*)_self; + free(self->image->data); + free(self->image); + PyObject_Del(self); +} +static PyObject* gfx_bitmap_getattr(PyObject * _self, char* a) +{ + BitmapObject*self = (BitmapObject*)_self; + if(!strcmp(a, "width")) { + return pyint_fromlong(self->image->width); + } else if(!strcmp(a, "height")) { + return pyint_fromlong(self->image->height); + } + return forward_getattr(_self, a); +} +static int gfx_bitmap_setattr(PyObject * self, char* a, PyObject * o) { + return -1; +} +PyDoc_STRVAR(gfx_bitmap_save_png_doc, +"save_jpeg(filename, quality)\n\n" +"Save bitmap to a png file.\n" +); +static PyObject* gfx_bitmap_save_png(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + ImageObject* self = (ImageObject*)_self; + static char *kwlist[] = {"filename", NULL}; + char*filename=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) + return NULL; + gfximage_save_png_quick(self->image, filename); + return PY_NONE; +} +PyDoc_STRVAR(gfx_bitmap_save_jpeg_doc, +"save_jpeg(filename, quality)\n\n" +"Save bitmap to a jpeg file. The quality parameter is optional.\n" +); +static PyObject* gfx_bitmap_save_jpeg(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + ImageObject* self = (ImageObject*)_self; + static char *kwlist[] = {"filename", "quality", NULL}; + char*filename=0; + int quality=95; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", kwlist, &filename, &quality)) + return NULL; + gfximage_save_jpeg(self->image, filename, quality); + return PY_NONE; +} +static int gfx_bitmap_print(PyObject * _self, FILE *fi, int flags) +{ + BitmapObject*self = (BitmapObject*)_self; + fprintf(fi, "", _self, _self?_self->ob_refcnt:0); + return 0; +} +static PyMethodDef gfx_bitmap_methods[] = +{ + {"save_png", (PyCFunction)gfx_bitmap_save_png, METH_KEYWORDS, gfx_bitmap_save_png_doc}, + {"save_jpeg", (PyCFunction)gfx_bitmap_save_jpeg, METH_KEYWORDS, gfx_bitmap_save_jpeg_doc}, + {0,0,0,0} +}; + +//--------------------------------------------------------------------- + +#ifndef PYTHON3 +#define PYTHON23_HEAD_INIT \ + PyObject_HEAD_INIT(NULL) \ + 0, +#else +#define PYTHON23_HEAD_INIT \ + PyVarObject_HEAD_INIT(&PyType_Type, 0) +#endif + +PyDoc_STRVAR(output_doc, +"An Output object can be used as parameter to the render()\n" +"call of a page. It's not possible to create this type of\n" +"object directly (i.e., from a class), however you can\n" +"use a PassThrough() device to pass things over to Python.\n" +"Examples for classes implementing the Output class are: \n" +"ImageList, SWF, PlainText and PassThrough.\n" +); +static PyTypeObject OutputClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Output", + tp_basicsize: sizeof(OutputObject), + tp_itemsize: 0, + tp_dealloc: output_dealloc, + tp_print: output_print, + tp_getattr: output_getattr, + tp_setattr: output_setattr, + tp_doc: output_doc, + tp_methods: output_methods +}; +PyDoc_STRVAR(page_doc, +"A Page object contains a single page of a document.\n" +"page.width and page.height (or page.size) contain the\n" +"page dimensions. page.nr is the number of the page, and\n" +"page.doc is the parent document.\n" +); +static PyTypeObject PageClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Page", + tp_basicsize: sizeof(PageObject), + tp_itemsize: 0, + tp_dealloc: page_dealloc, + tp_print: page_print, + tp_getattr: page_getattr, + tp_setattr: page_setattr, + tp_doc: page_doc, + tp_methods: page_methods +}; +PyDoc_STRVAR(doc_doc, +"A Doc object is used for storing a document (like a PDF).\n" +"doc.pages contains the number of pages in the document,\n" +"and doc.filename the name of the file the document was\n" +"created (loaded) from. If the document was created from\n" +"an image file, the number of pages is always 1\n" +); +static PyTypeObject DocClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Doc", + tp_basicsize: sizeof(DocObject), + tp_itemsize: 0, + tp_dealloc: doc_dealloc, + + tp_print: doc_print, + tp_getattr: doc_getattr, + tp_setattr: doc_setattr, + tp_doc: doc_doc, + tp_methods: doc_methods, + + tp_iter: doc_getiter, + tp_iternext: doc_iternext, + +#ifndef PYTHON3 + tp_flags: Py_TPFLAGS_HAVE_ITER, +#endif +}; +PyDoc_STRVAR(font_doc, +"A font is a list of glyphs\n" +); +static PyTypeObject FontClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Font", + tp_basicsize: sizeof(FontObject), + tp_itemsize: 0, + tp_dealloc: font_dealloc, + tp_print: font_print, + tp_getattr: font_getattr, + tp_setattr: font_setattr, + tp_doc: font_doc, + tp_methods: font_methods, +}; +PyDoc_STRVAR(glyph_doc, +"A glyph is a polygon and a unicode index\n" +); +static PyTypeObject GlyphClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Glyph", + tp_basicsize: sizeof(GlyphObject), + tp_itemsize: 0, + tp_dealloc: glyph_dealloc, + tp_print: glyph_print, + tp_getattr: glyph_getattr, + tp_setattr: glyph_setattr, + tp_doc: glyph_doc, + tp_methods: glyph_methods, +}; +PyDoc_STRVAR(char_doc, +"A char is a glyph at a given position (in a given color)\n" +); +static PyTypeObject CharClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Char", + tp_basicsize: sizeof(CharObject), + tp_itemsize: 0, + tp_dealloc: char_dealloc, + tp_print: char_print, + tp_getattr: char_getattr, + tp_setattr: char_setattr, + tp_doc: char_doc, + tp_methods: char_methods, +}; + +PyDoc_STRVAR(gfx_bitmap_doc, +"A bitmap.\n" +); +static PyTypeObject BitmapClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.Bitmap", + tp_basicsize: sizeof(BitmapObject), + tp_itemsize: 0, + tp_dealloc: gfx_bitmap_dealloc, + tp_print: gfx_bitmap_print, + tp_getattr: gfx_bitmap_getattr, + tp_setattr: gfx_bitmap_setattr, + tp_doc: gfx_bitmap_doc, + tp_methods: gfx_bitmap_methods, +}; + + +PyDoc_STRVAR(gfx_kdtree_doc, +"A kdtree is a two dimensional tree for storing bounding box data\n" +); +static PyTypeObject KDTreeClass = +{ + PYTHON23_HEAD_INIT + tp_name: "gfx.KDTree", + tp_basicsize: sizeof(KDTreeObject), + tp_itemsize: 0, + tp_dealloc: gfx_kdtree_dealloc, + tp_print: gfx_kdtree_print, + tp_getattr: gfx_kdtree_getattr, + tp_setattr: gfx_kdtree_setattr, + tp_doc: gfx_kdtree_doc, + tp_methods: gfx_kdtree_methods, +}; + + +//===================================================================== + +PyDoc_STRVAR(f_setparameter_doc, \ +"setparameter(key,value)\n\n" +"Set a parameter in the gfx module (which might affect the PDF\n" +"parser or any of the rendering backends). This is a parameter\n" +"which would usually be passed with the \"-s\" option to pdf2swf.\n" +"For a list of all parameters, see the output of\n" +" pdf2swf -s help\n" +"and\n" +" pdf2swf somefile.pdf -s help\n" +".\n" +); +static PyObject* f_setparameter(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"key", "value", NULL}; + char*key=0,*value=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value)) + return NULL; + state_t*state = STATE(module); + state->pdfdriver->setparameter(state->pdfdriver,key,value); + return PY_NONE; +} + +PyDoc_STRVAR(f_verbose_doc, \ +"verbose(level)\n\n" +"Set the logging verbosity of the gfx module. Log levels are:\n" +"level=-1 Log nothing\n" +"level=0 (fatal) Log only fatal errors\n" +"level=1 (error) Log only fatal errors and errors\n" +"level=2 (warn) Log all errors and warnings\n" +"level=3 (notice) Log also some rudimentary data about the parsing/conversion\n" +"level=4 (verbose) Log some additional parsing information\n" +"level=5 (debug) Log debug statements\n" +"level=6 (trace) Log extended debug statements\n" +"All logging messages are written to stdout.\n" +); +static PyObject* f_verbose(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"val", NULL}; + int val; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &val)) + return NULL; + setConsoleLogging(val); + return PY_NONE; +} + +PyDoc_STRVAR(f_addfont_doc, \ +"addfont(filename)\n\n" +"Passes an additional font file to the PDF parser. If a PDF contains\n" +"external fonts (i.e. fonts which are not contained in the PDF itself)\n" +"then the files added by addfont() will be searched.\n" +); + +static PyObject* f_addfont(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"filename", NULL}; + char*filename=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) + return NULL; + state_t*state = STATE(module); + state->pdfdriver->setparameter(state->pdfdriver,"font", filename); + return PY_NONE; +} + +PyDoc_STRVAR(f_addfontdir_doc, \ +"addfontdir(dirname)\n\n" +"Passes a complete directory containing fonts to the PDF parser. Any\n" +"font file within this directory might be used to resolve external fonts\n" +"in PDF files\n" +); +static PyObject* f_addfontdir(PyObject* module, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"filename", NULL}; + char*filename=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) + return NULL; + state_t*state = STATE(module); + state->pdfdriver->setparameter(state->pdfdriver,"fontdir", filename); + return PY_NONE; +} + +static PyMethodDef gfx_methods[] = +{ + /* sources */ + {"open", (PyCFunction)f_open, M_FLAGS, f_open_doc}, + {"addfont", (PyCFunction)f_addfont, M_FLAGS, f_addfont_doc}, + {"addfontdir", (PyCFunction)f_addfontdir, M_FLAGS, f_addfontdir_doc}, + {"setparameter", (PyCFunction)f_setparameter, M_FLAGS, f_setparameter_doc}, + {"verbose", (PyCFunction)f_verbose, M_FLAGS, f_verbose_doc}, + + /* devices */ + {"SWF", (PyCFunction)f_createSWF, M_FLAGS, f_createSWF_doc}, + {"OCR", (PyCFunction)f_createOCR, M_FLAGS, f_createOCR_doc}, + {"ImageList", (PyCFunction)f_createImageList, M_FLAGS, f_createImageList_doc}, + {"PlainText", (PyCFunction)f_createPlainText, M_FLAGS, f_createPlainText_doc}, + {"PassThrough", (PyCFunction)f_createPassThrough, M_FLAGS, f_createPassThrough_doc}, +#ifdef USE_OPENGL + {"OpenGL", (PyCFunction)f_createOpenGL, M_FLAGS, f_createOpenGL_doc}, +#endif + {"KDTree", (PyCFunction)f_createKDTree, M_FLAGS, f_createKDTree_doc}, + + /* sentinel */ + {0, 0, 0, 0} +}; + +PyDoc_STRVAR(gfx_doc, \ +"This module contains a PDF parser (based on xpdf) and a number of\n" +"rendering backends. In particular, it can extract text from PDF pages,\n" +"create bitmaps from them, or convert PDF files to SWF.\n" +"The latter functionality is similar to what is offered by swftools'\n" +"(http://www.swftools.org) pdf2swf utility, however more powerful-\n" +"You can also create individual SWF files from single pages of the PDF\n" +"or mix pages from different PDF files.\n" +); + +void gfx_free(void*module) +{ + state_t*state = STATE(module); + if(state->pdfdriver && state->pdfdriver->destroy) + state->pdfdriver->destroy(state->pdfdriver); + if(state->swfdriver && state->swfdriver->destroy) + state->swfdriver->destroy(state->swfdriver); + if(state->imagedriver && state->imagedriver->destroy) + state->imagedriver->destroy(state->imagedriver); + memset(state, 0, sizeof(state_t)); +} + +#ifdef PYTHON3 +static struct PyModuleDef gfx_moduledef = { + PyModuleDef_HEAD_INIT, + "gfx", + gfx_doc, + sizeof(state_t), + gfx_methods, + /*reload*/NULL, + /*traverse*/NULL, + /*clear*/NULL, + gfx_free, +}; +#endif + +PyObject * PyInit_gfx(void) +{ + initLog(0,0,0,0,0,2); +#ifdef PYTHON3 + PyObject*module = PyModule_Create(&gfx_moduledef); +#else + PyObject*module = Py_InitModule3("gfx", gfx_methods, gfx_doc); + OutputClass.ob_type = &PyType_Type; + PageClass.ob_type = &PyType_Type; + DocClass.ob_type = &PyType_Type; + FontClass.ob_type = &PyType_Type; + CharClass.ob_type = &PyType_Type; + KDTreeClass.ob_type = &PyType_Type; + BitmapClass.ob_type = &PyType_Type; +#endif + + state_t* state = STATE(module); + memset(state, 0, sizeof(state_t)); + state->pdfdriver = gfxsource_pdf_create(); + state->swfdriver = gfxsource_swf_create(); + state->imagedriver = gfxsource_image_create(); + + PyObject*module_dict = PyModule_GetDict(module); + PyDict_SetItemString(module_dict, "Doc", (PyObject*)&DocClass); + PyDict_SetItemString(module_dict, "Page", (PyObject*)&PageClass); + PyDict_SetItemString(module_dict, "Output", (PyObject*)&OutputClass); + PyDict_SetItemString(module_dict, "Char", (PyObject*)&CharClass); + PyDict_SetItemString(module_dict, "Font", (PyObject*)&FontClass); + PyDict_SetItemString(module_dict, "KDTree", (PyObject*)&KDTreeClass); + PyDict_SetItemString(module_dict, "Bitmap", (PyObject*)&BitmapClass); + + return module; +} +#ifndef PYTHON3 +void initgfx(void) { + PyInit_gfx(); +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/image.c b/fluidbook/tools/swftools-special-swfdump/lib/python/image.c new file mode 100644 index 000000000..5b125e623 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/image.c @@ -0,0 +1,160 @@ +#include +#ifdef HAVE_STAT +#undef HAVE_STAT +#endif +//#include "/usr/include/python2.3/Imaging.h" +#include "../../config.h" +#ifdef HAVE_PYTHON_IMAGING +#include +#endif +#include "pyutils.h" +#undef HAVE_STAT +#include "../rfxswf.h" + +/* redefine the ImagingObject struct defined in _imagingmodule.c */ +/* there should be a better way to do this... */ +typedef struct { + PyObject_HEAD +#ifdef HAVE_PYTHON_IMAGING + Imaging image; +#endif +} ImagingObject; + +int image_getWidth(PyObject*_image) { +#ifdef HAVE_PYTHON_IMAGING + if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { + PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); + return 0; + } + ImagingObject*image = (ImagingObject*)_image; + return image->image->xsize; +#else + PyErr_SetString(PyExc_Exception, "imaging not compiled in"); + return 0; +#endif +} + +int image_getHeight(PyObject*_image) { +#ifdef HAVE_PYTHON_IMAGING + if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { + PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); + return 0; + } + ImagingObject*image = (ImagingObject*)_image; + return image->image->ysize; +#else + PyErr_SetString(PyExc_Exception, "imaging not compiled in"); + return 0; +#endif +} + +int image_getBPP(PyObject*_image) { +#ifdef HAVE_PYTHON_IMAGING + if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { + PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); + return 0; + } + ImagingObject*image = (ImagingObject*)_image; + if(!strcmp(image->image->mode, "1") || + !strcmp(image->image->mode, "L") || + !strcmp(image->image->mode, "P")) { + return 8; + } + if(!strcmp(image->image->mode, "I") || + !strcmp(image->image->mode, "F")) { + return 32; + } + if(!strcmp(image->image->mode, "RGB") || + !strcmp(image->image->mode, "RGBA") || + !strcmp(image->image->mode, "CMYK") || + !strcmp(image->image->mode, "YCbCr")) { + return 32; + } + PyErr_SetString(PyExc_Exception, setError("Unknown image format (%s).", image->image->mode)); + return 0; +#else + PyErr_SetString(PyExc_Exception, "imaging not compiled in"); + return 0; +#endif +} + +RGBA* image_toRGBA(PyObject*_image) +{ +#ifdef HAVE_PYTHON_IMAGING + if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { + PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); + return 0; + } + ImagingObject*image = (ImagingObject*)_image; + printf("mode: %s\n", image->image->mode); + printf("depth: %d\n", image->image->depth); + printf("bands: %d\n", image->image->bands); + printf("xsize: %d\n", image->image->xsize); + printf("ysize: %d\n", image->image->ysize); + int bpp = image_getBPP(_image); + if(!bpp) + return 0; + + RGBA*rgba = (RGBA*)malloc(image->image->xsize * image->image->ysize * sizeof(RGBA)); + + if(!strcmp(image->image->mode, "RGBA")) { + int y,ymax=image->image->ysize; + int width = image->image->xsize; + RGBA*dest = rgba; + for(y=0;yimage->image32[y]); + int x; + for(x=0;ximage->mode)); +#else + PyErr_SetString(PyExc_Exception, "imaging not compiled in"); +#endif + return 0; +} + +#ifdef HAVE_PYTHON_IMAGING +extern PyObject*PyImagingNew(Imaging imOut); +#endif + +PyObject* rgba_to_image(RGBA*rgba, int width, int height) +{ +#ifdef HAVE_PYTHON_IMAGING +#ifndef WIN32 + Imaging img = ImagingNew("RGBA", width, height); + int y; + if(!img->image32) { + fprintf(stderr, "No array allocated!\n"); + return 0; + } + for(y=0;yimage32[y]); + RGBA* src = &rgba[width*y]; + int x; + for(x=0;x + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __image_h__ +#define __image_h__ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" + +int image_getWidth(PyObject*image); +int image_getHeight(PyObject*image); +int image_getBPP(PyObject*image); +RGBA* image_toRGBA(PyObject*image); +PyObject* rgba_to_image(RGBA*rgba, int width, int height); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c b/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c new file mode 100644 index 000000000..eaaeef2f4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c @@ -0,0 +1,655 @@ +/* primitives.c + + Python wrapper for librfxswf- primitive objects (implementation) + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" +#include "../log.h" +#include "./pyutils.h" +#include "primitives.h" + +//---------------------------------------------------------------------------- +typedef struct { + PyObject_HEAD + RGBA rgba; +} ColorObject; + +PyObject* f_Color2(U8 r, U8 g, U8 b, U8 a) +{ + ColorObject* color = PyObject_New(ColorObject, &ColorClass); + color->rgba.r = r; + color->rgba.g = g; + color->rgba.b = b; + color->rgba.a = a; + return (PyObject*)color; +} +PyObject* f_Color(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"r", "g", "b", "a", NULL}; + ColorObject* color; + int r=0,g=0,b=0,a=255; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii|i", kwlist, &r,&g,&b,&a)) { + char*s= 0; + int mya = -1; + PyErr_Clear(); + static char *kwlist[] = {"col", "alpha", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", kwlist, &s, &mya)) + return NULL; + if(mya>=0) a=mya; + sscanf(s, "%02x%02x%02x%02x",&r,&g,&b,&a); + } + color = PyObject_New(ColorObject, &ColorClass); + mylog("+%08x(%d) color_new(%d,%d,%d,%d)\n", (int)color, color->ob_refcnt, r,g,b,a); + return f_Color2(r,g,b,a); +} +static PyObject* color_getattr(PyObject * self, char* a) +{ + ColorObject*color = (ColorObject*)self; + if(!strcmp(a, "r")) { + return Py_BuildValue("i", color->rgba.r); + } else if(!strcmp(a, "g")) { + return Py_BuildValue("i", color->rgba.g); + } else if(!strcmp(a, "b")) { + return Py_BuildValue("i", color->rgba.b); + } else if(!strcmp(a, "a")) { + return Py_BuildValue("i", color->rgba.a); + } else if(!strcmp(a, "alpha")) { + return Py_BuildValue("i", color->rgba.a); + } else if(!strcmp(a, "rgb")) { + char text[80]; + sprintf(text, "%02x%02x%02x", color->rgba.r, color->rgba.g, color->rgba.b); + return PyString_FromString(text); + } else if(!strcmp(a, "rgba")) { + char text[80]; + sprintf(text, "%02x%02x%02x%02x", color->rgba.r, color->rgba.g, color->rgba.b, color->rgba.a); + return PyString_FromString(text); + } + return PY_ERROR("bad attribute"); +} +static int color_setattr(PyObject * self, char* attr, PyObject* o) +{ + ColorObject*color = (ColorObject*)self; + if(!strcmp(attr, "r")) { + if (!PyArg_Parse(o, "d", &color->rgba.r)) goto err; + return 0; + } else if(!strcmp(attr, "g")) { + if (!PyArg_Parse(o, "d", &color->rgba.g)) goto err; + return 0; + } else if(!strcmp(attr, "b")) { + if (!PyArg_Parse(o, "d", &color->rgba.b)) goto err; + return 0; + } else if(!strcmp(attr, "a")) { + if (!PyArg_Parse(o, "d", &color->rgba.a)) goto err; + return 0; + } +err: + mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, attr, o); + return 1; +} +RGBA color_getRGBA(PyObject*self) +{ + ColorObject*color = 0; + if (!PyArg_Parse(self, "O!", &ColorClass, &color)) { + RGBA dummy; + memset(&dummy, 0, sizeof(dummy)); + mylog("Error: wrong type for function color_getRGBA"); + return dummy; + } + return color->rgba; +} +void color_dealloc(PyObject* self) +{ + mylog("-%08x(%d) color_dealloc\n", (int)self, self->ob_refcnt); + PyObject_Del(self); +} +PyTypeObject ColorClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "Color", + tp_basicsize: sizeof(ColorObject), + tp_itemsize: 0, + tp_dealloc: color_dealloc, + tp_print: 0, + tp_getattr: color_getattr, + tp_setattr: color_setattr, +}; +//---------------------------------------------------------------------------- +typedef struct { + PyObject_HEAD + SRECT bbox; +} BBoxObject; +//void swf_ExpandRect(SRECT*src, SPOINT add); +//void swf_ExpandRect2(SRECT*src, SRECT*add); + +PyObject* f_BBox(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"xmin", "ymin", "xmax", "ymax", NULL}; + BBoxObject* bbox; + float xmin,ymin,xmax,ymax; + if(!kwargs) { + if (!PyArg_ParseTuple(args, "ffff", &xmin, &ymin, &xmax, &ymax)) + return NULL; + } else { + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", kwlist, &xmin, &ymin, &xmax, &ymax)) + return NULL; + } + SRECT box; + box.xmin = (int)(xmin*20); + box.ymin = (int)(ymin*20); + box.xmax = (int)(xmax*20); + box.ymax = (int)(ymax*20); + mylog("+%08x(%d) bbox_new(%d,%d,%d,%d)\n", (int)self, self?self->ob_refcnt:0, box.xmin, box.ymin, box.xmax,box.ymax); + bbox = PyObject_New(BBoxObject, &BBoxClass); + bbox->bbox = box; + return (PyObject*)bbox; +} +PyObject* f_BBox2(SRECT box) +{ + BBoxObject* bbox; + bbox = PyObject_New(BBoxObject, &BBoxClass); + bbox->bbox = box; + return (PyObject*)bbox; +} +static PyObject* bbox_getattr(PyObject * self, char* a) +{ + BBoxObject*bbox = (BBoxObject*)self; + if(!strcmp(a, "xmin")) { + return Py_BuildValue("f", bbox->bbox.xmin/20.0); + } else if(!strcmp(a, "ymin")) { + return Py_BuildValue("f", bbox->bbox.ymin/20.0); + } else if(!strcmp(a, "xmax")) { + return Py_BuildValue("f", bbox->bbox.xmax/20.0); + } else if(!strcmp(a, "ymax")) { + return Py_BuildValue("f", bbox->bbox.ymax/20.0); + } + return NULL; +} +static int bbox_setattr(PyObject * self, char* a, PyObject* o) +{ + BBoxObject*bbox= (BBoxObject*)self; + if(!strcmp(a, "xmin")) { + float xmin; + if (!PyArg_Parse(o, "f", &xmin)) goto err; + bbox->bbox.xmin = (int)(xmin*20); + return 0; + } else if(!strcmp(a, "ymin")) { + float ymin; + if (!PyArg_Parse(o, "f", &ymin)) goto err; + bbox->bbox.ymin = (int)(ymin*20); + return 0; + } else if(!strcmp(a, "xmax")) { + float xmax; + if (!PyArg_Parse(o, "f", &xmax)) goto err; + bbox->bbox.xmax = (int)(xmax*20); + return 0; + } else if(!strcmp(a, "ymax")) { + float ymax; + if (!PyArg_Parse(o, "f", &ymax)) goto err; + bbox->bbox.ymax = (int)(ymax*20); + return 0; + } +err: + mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o); + return 1; +} +void bbox_dealloc(PyObject* self) +{ + mylog("-%08x(%d) bbox_dealloc\n", (int)self, self->ob_refcnt); + PyObject_Del(self); +} +SRECT bbox_getSRECT(PyObject*self) +{ + BBoxObject*bbox= 0; + if (!PyArg_Parse(self, "O!", &BBoxClass, &bbox)) { + SRECT dummy; + memset(&dummy, 0, sizeof(dummy)); + mylog("Error: wrong type for function color_getRGBA"); + return dummy; + } + return bbox->bbox; +} +PyTypeObject BBoxClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "BBox", + tp_basicsize: sizeof(BBoxObject), + tp_itemsize: 0, + tp_dealloc: bbox_dealloc, + tp_print: 0, + tp_getattr: bbox_getattr, + tp_setattr: bbox_setattr, +}; +SRECT bbox_getBBox(PyObject*self); +//---------------------------------------------------------------------------- +typedef struct { + PyObject_HEAD + MATRIX matrix; +} MatrixObject; + +PyObject* f_Matrix2(MATRIX* m) +{ + PyObject*self = (PyObject*)PyObject_New(MatrixObject, &MatrixClass); + MatrixObject*matrix = (MatrixObject*)self; + matrix->matrix = *m; + return self; +} + +PyObject* f_Matrix(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + PyObject*self = (PyObject*)PyObject_New(MatrixObject, &MatrixClass); + MatrixObject*matrix = (MatrixObject*)self; + mylog("+%08x(%d) f_Matrix", self, self->ob_refcnt); + static char *kwlist[] = {"x", "y", "scale", "rotate", "pivotx", "pivoty", NULL}; + float x=0,y=0,scale=1.0,rotate=0,pivotx=0,pivoty=0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ffffff", kwlist, &x,&y,&scale,&rotate,&pivotx,&pivoty)) + return NULL; + mylog(" %08x(%d) f_Matrix: x=%f y=%f scale=%f rotate=%f", self, self->ob_refcnt, x,y,scale,rotate); + swf_GetMatrix(0, &matrix->matrix); + + matrix->matrix.tx = (int)(x*20); + matrix->matrix.ty = (int)(y*20); + + if(!rotate) { + matrix->matrix.sx = (int)(scale*65536); + matrix->matrix.sy = (int)(scale*65536); + } else { + matrix->matrix.sx = (int)(scale*cos(rotate)*65536); + matrix->matrix.sy = (int)(scale*cos(rotate)*65536); + matrix->matrix.r0 = (int)(scale*sin(rotate)*65536); + matrix->matrix.r1 = (int)(-scale*sin(rotate)*65536); + } + if(pivotx || pivoty) { + SPOINT p,d; + p.x = (int)(pivotx*20); + p.y = (int)(pivoty*20); + p = swf_TurnPoint(p, &matrix->matrix); + matrix->matrix.tx += matrix->matrix.tx-p.x; + matrix->matrix.ty += matrix->matrix.ty-p.y; + } + + /* TODO: rotate */ + return self; +} +static PyObject* matrix_getattr(PyObject * self, char* a) +{ + PY_ASSERT_TYPE(self,&MatrixClass); + MatrixObject*matrix = (MatrixObject*)self; + if(!strcmp(a, "entries")) { + return Py_BuildValue("(ffffff)", + matrix->matrix.sx/65536.0, + matrix->matrix.r0/65536.0, + matrix->matrix.r1/65536.0, + matrix->matrix.sy/65536.0, + matrix->matrix.tx/20.0, + matrix->matrix.ty/20.0 + ); + } + return NULL; +} +static int matrix_setattr(PyObject * self, char* a, PyObject* o) +{ + PY_ASSERT_TYPE(self,&MatrixClass); + return 0; +} +MATRIX matrix_getMatrix(PyObject*self) +{ + mylog(" %08x(%d) matrix_getMatrix", self, self->ob_refcnt); + PY_ASSERT_TYPE(self,&MatrixClass); + MatrixObject*matrix = (MatrixObject*)self; + return matrix->matrix; +} +void matrix_dealloc(PyObject* self) +{ + mylog("-%08x(%d) matrix_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} +//SPOINT swf_TurnPoint(SPOINT p, MATRIX* m); +//SRECT swf_TurnRect(SRECT r, MATRIX* m); +PyTypeObject MatrixClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "Matrix", + tp_basicsize: sizeof(MatrixObject), + tp_itemsize: 0, + tp_dealloc: matrix_dealloc, + tp_print: 0, + tp_getattr: matrix_getattr, + tp_setattr: matrix_setattr, + tp_compare: 0, + tp_repr: 0, + tp_as_number: 0, + tp_as_sequence: 0, + tp_as_mapping: 0, + tp_hash: 0, // dict(x) + tp_call: 0, // x() + tp_str: 0 // str(x) +}; +//---------------------------------------------------------------------------- +typedef struct { + PyObject_HEAD + CXFORM cxform; +} CXFormObject; + +PyObject* f_ColorTransform(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + int r0=256,g0=256,b0=256,a0=256,r1=0,g1=0,b1=0,a1=0; + static char *kwlist[] = {"r_mul", "g_mul", "b_mul", "a_mul", "r_add", "g_add", "b_add", "a_add", NULL}; + PyObject*color; + if(!kwargs) { + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiiii", kwlist, + &r0,&g0,&b0,&a0, + &r1,&g1,&b1,&a1)) + return NULL; + } + + CXFORM c; + c.r0 = r0; c.g0 = g0; c.b0 = b0; c.a0 = a0; + c.r1 = r1; c.g1 = g1; c.b1 = b1; c.a1 = a1; + + CXFormObject*self = PyObject_New(CXFormObject, &CXFormClass); + self->cxform = c; + return (PyObject*)self; +} +static PyObject* colortransform_getattr(PyObject * self, char* a) +{ + return NULL; +} +static int colortransform_setattr(PyObject * self, char* a, PyObject* o) +{ + return 0; +} +CXFORM colortransform_getCXForm(PyObject*self) +{ + CXFormObject*cxform= 0; + if (!PyArg_Parse(self, "O!", &CXFormClass, &cxform)) { + CXFORM dummy; + memset(&dummy, 0, sizeof(dummy)); + mylog("Error: wrong type for function color_getRGBA"); + return dummy; + } + return cxform->cxform; +} +void colortransform_dealloc(PyObject* self) +{ + mylog("-%08x(%d) colortransform_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} +PyTypeObject CXFormClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "ColorTransform", + tp_basicsize: sizeof(CXFormObject), + tp_itemsize: 0, + tp_dealloc: colortransform_dealloc, + tp_print: 0, + tp_getattr: colortransform_getattr, + tp_setattr: colortransform_setattr, +}; +//---------------------------------------------------------------------------- +typedef struct { + PyObject_HEAD + GRADIENT gradient; +} GradientObject; + +PyObject* f_Gradient(PyObject* self, PyObject* args, PyObject* kwargs) +{ + return NULL; +} +static PyObject* gradient_getattr(PyObject * self, char* a) +{ + return NULL; +} +static int gradient_setattr(PyObject * self, char* a, PyObject* o) +{ + return 0; +} +GRADIENT gradient_getGradient(PyObject*self) +{ + GradientObject*gradient = 0; + if (!PyArg_Parse(self, "O!", &gradient, &gradient)) { + GRADIENT dummy; + memset(&dummy, 0, sizeof(dummy)); + mylog("Error: wrong type for function color_getRGBA"); + return dummy; + } + return gradient->gradient; +} +void gradient_dealloc(PyObject* self) +{ + mylog("-%08x(%d) gradient_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} +PyTypeObject GradientClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "Gradient", + tp_basicsize: sizeof(GradientObject), + tp_itemsize: 0, + tp_dealloc: gradient_dealloc, + tp_print: 0, + tp_getattr: gradient_getattr, + tp_setattr: gradient_setattr, +}; +//---------------------------------------------------------------------------- + +typedef struct { + PyObject_HEAD + LINESTYLE ls; +} LineStyleObject; + +PyObject* f_LineStyle2(RGBA color, int width) +{ + LineStyleObject* self = PyObject_New(LineStyleObject, &LineStyleClass); + self->ls.color = color; + self->ls.width = width; + return (PyObject*)self; +} +PyObject* f_LineStyle3(LINESTYLE ls) +{ + LineStyleObject* self = PyObject_New(LineStyleObject, &LineStyleClass); + self->ls = ls; + return (PyObject*)self; +} +PyObject* f_LineStyle(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"line", "color", NULL}; + float linewidth; + PyObject*color; + if(!kwargs) { + if (!PyArg_ParseTuple(args, "fO!", &linewidth, &ColorClass, &color)) + return NULL; + } + return f_LineStyle2(color_getRGBA(color), (int)(linewidth*20)); +} +LINESTYLE linestyle_getLineStyle(PyObject*_self) +{ + LineStyleObject* self = (LineStyleObject*)_self; + return self->ls; +} +static PyObject* linestyle_getattr(PyObject * _self, char* a) +{ + LineStyleObject*self = (LineStyleObject*)_self; + if(!strcmp(a, "width")) { + return Py_BuildValue("i", self->ls.width); + } else if(!strcmp(a, "color")) { + return f_Color2(self->ls.color.r, self->ls.color.g, self->ls.color.b, self->ls.color.a); + } + return NULL; +} +static int linestyle_setattr(PyObject * _self, char* a, PyObject* o) +{ + LineStyleObject*self = (LineStyleObject*)_self; + if(!strcmp(a, "color")) { + self->ls.color = color_getRGBA(o); + return 0; + } + return -1; +} +static LINESTYLE linestyle_getlinestyle(PyObject*_self) +{ + LineStyleObject*self = (LineStyleObject*)_self; + return self->ls; +} +static void linestyle_dealloc(PyObject* self) +{ + mylog("-%08x(%d) linestyle_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} +static int linestyle_print(PyObject * _self, FILE *fi, int flags) //flags&Py_PRINT_RAW +{ + LineStyleObject* self = (LineStyleObject*)_self; + fprintf(fi, "line-%d-%02x%02x%02x%02x", self->ls.width, self->ls.color.r, self->ls.color.g, self->ls.color.b, self->ls.color.a); + return 0; +} +PyTypeObject LineStyleClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "linestyle", + tp_basicsize: sizeof(LineStyleObject), + tp_itemsize: 0, + tp_dealloc: linestyle_dealloc, + tp_print: linestyle_print, + tp_getattr: linestyle_getattr, + tp_setattr: linestyle_setattr, +}; +//---------------------------------------------------------------------------- + +typedef struct { + PyObject_HEAD + FILLSTYLE fs; +} FillStyleObject; + +PyObject* f_FillStyle2(FILLSTYLE fs) +{ + FillStyleObject* self = PyObject_New(FillStyleObject, &FillStyleClass); + self->fs = fs; + return (PyObject*)self; +} +PyObject* f_SolidFillStyle2(RGBA color) +{ + FillStyleObject* self = PyObject_New(FillStyleObject, &FillStyleClass); + self->fs.type = FILL_SOLID; + self->fs.color = color; + return (PyObject*)self; +} +PyObject* f_SolidFillStyle(PyObject* _self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"color", NULL}; + PyObject*color; + if(!kwargs) { + if (!PyArg_ParseTuple(args, "O!", &ColorClass, &color)) + return NULL; + } + return f_SolidFillStyle2(color_getRGBA(color)); +} +FILLSTYLE fillstyle_getFillStyle(PyObject*_self) +{ + FillStyleObject* self = (FillStyleObject*)_self; + return self->fs; +} +static void fillstyle_dealloc(PyObject* self) +{ + mylog("-%08x(%d) linestyle_dealloc", self, self->ob_refcnt); + PyObject_Del(self); +} +static int fillstyle_print(PyObject * _self, FILE *fi, int flags) //flags&Py_PRINT_RAW +{ + FillStyleObject* self = (FillStyleObject*)_self; + if(self->fs.type == FILL_SOLID) + fprintf(fi, "fill-solid(%02x%02x%02x%02x)", self->fs.color.r, self->fs.color.g, self->fs.color.b, self->fs.color.a); + else + fprintf(fi, "fill-%02x", self->fs.type); + return 0; +} +PyObject* fillstyle_issolid(PyObject*_self, PyObject*args) +{ + FillStyleObject* self = (FillStyleObject*)_self; + int b = self->fs.type == FILL_SOLID; + return PyInt_FromLong(b); +} +static PyMethodDef FillStyleMethods[] = +{ + /* Module functions */ + {"isSolid", fillstyle_issolid, METH_VARARGS, "Queries whether this is a solid fill"}, + {0,0,0,0} +}; +static PyObject* fillstyle_getattr(PyObject * _self, char* a) +{ + FillStyleObject* self = (FillStyleObject*)_self; + if(!strcmp(a, "color")) { + return f_Color2(self->fs.color.r, self->fs.color.g, self->fs.color.b, self->fs.color.a); + } + return Py_FindMethod(FillStyleMethods, _self, a); +} +static int fillstyle_setattr(PyObject * _self, char* a, PyObject* o) +{ + FillStyleObject*self = (FillStyleObject*)_self; + if(!strcmp(a, "color")) { + self->fs.color = color_getRGBA(o); + return 0; + } + return -1; +} + +PyTypeObject FillStyleClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "fillstyle", + tp_basicsize: sizeof(FillStyleObject), + tp_itemsize: 0, + tp_dealloc: fillstyle_dealloc, + tp_print: fillstyle_print, + tp_getattr: fillstyle_getattr, + tp_setattr: fillstyle_setattr, +}; +//---------------------------------------------------------------------------- +static PyMethodDef primitive_methods[] = +{ + {"Color", (PyCFunction)f_Color, METH_KEYWORDS, "Create a new color object."}, + {"Gradient", (PyCFunction)f_Gradient, METH_KEYWORDS, "Create a new gradient object."}, + {"ColorTransform", (PyCFunction)f_ColorTransform, METH_KEYWORDS, "Create a new colortransform object."}, + {"Matrix", (PyCFunction)f_Matrix, METH_KEYWORDS, "Create a new matrix object."}, + {"BBox", (PyCFunction)f_BBox, METH_KEYWORDS, "Create a new bounding box object."}, + {"SolidFillStyle", (PyCFunction)f_SolidFillStyle, METH_KEYWORDS, "Creates a new solid fill style."}, + {"LineStyle", (PyCFunction)f_SolidFillStyle, METH_KEYWORDS, "Creates a new line style."}, + {NULL, NULL, 0, NULL} +}; + +PyMethodDef* primitive_getMethods() +{ + GradientClass.ob_type = &PyType_Type; + CXFormClass.ob_type = &PyType_Type; + BBoxClass.ob_type = &PyType_Type; + MatrixClass.ob_type = &PyType_Type; + FillStyleClass.ob_type = &PyType_Type; + LineStyleClass.ob_type = &PyType_Type; + return primitive_methods; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h b/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h new file mode 100644 index 000000000..d9ea336d5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h @@ -0,0 +1,64 @@ +/* primitives.h + + Python wrapper for librfxswf- primitive objects (structs, prototypes) + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __primitives_h__ +#define __primitives_h__ + +#include +#undef HAVE_STAT + +#include "../rfxswf.h" + +/* exported to allow casting to this type */ +extern PyTypeObject ColorClass; +extern PyTypeObject BBoxClass; +extern PyTypeObject CXFormClass; +extern PyTypeObject GradientClass; +extern PyTypeObject MatrixClass; +extern PyTypeObject LineStyleClass; +extern PyTypeObject FillStyleClass; + +PyObject* f_Color(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_ColorTransform(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_Gradient(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_BBox(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_BBox2(SRECT bbox); +PyObject* f_Matrix(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_Matrix2(MATRIX* m); +PyObject* f_FillStyle2(FILLSTYLE fs); +PyObject* f_SolidFillstyle(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_SolidFillstyle2(RGBA color); +PyObject* f_LineStyle(PyObject* self, PyObject* args, PyObject* kwargs); +PyObject* f_LineStyle2(RGBA color, int width); +PyObject* f_LineStyle3(LINESTYLE ls); + +RGBA color_getRGBA(PyObject*self); +CXFORM colortransform_getCXForm(PyObject*self); +GRADIENT gradient_getGradient(PyObject*self); +SRECT bbox_getSRECT(PyObject*self); +MATRIX matrix_getMatrix(PyObject*self); +FILLSTYLE fillstyle_getFillStyle(PyObject*self); +LINESTYLE linestyle_getLineStyle(PyObject*self); + +extern PyMethodDef* primitive_getMethods(); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c b/fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c new file mode 100644 index 000000000..f5362fcbf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include + +char* setError(char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + return strdup(buf); +} + +static int verbose = 0; +void mylog(char*format, ...) +{ + char buf[1024]; + int l; + va_list arglist; + if(!verbose) + return; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + l = strlen(buf); + while(l && buf[l-1]=='\n') { + buf[l-1] = 0; + l--; + } + fprintf(stderr, "[SWF] %s\n", buf); + fflush(stderr); +} + +#define PY_NONE Py_BuildValue("s", 0) + +PyObject* FindMethodMore(PyObject*ret, PyMethodDef f[], PyObject*self, char* a) +{ + if(ret==NULL) { + ret = Py_FindMethod(f, self, a); + } else { + if(!strcmp(a, "__methods__")) { + /* we are being dir()ed. Complete the function table */ + PyObject* add = Py_FindMethod(f, self, a); + int t; + mylog("taglist_getattr: append common funtions %08x %08x\n", ret, add); + for(t=0;t + +#define PY_NONE Py_BuildValue("s", 0) + +extern int verbose; + +void setVerbosity(int verbose); + +char* setError(char*format, ...); +void mylog(char*format, ...); +PyObject* FindMethodMore(PyObject*ret, PyMethodDef f[], PyObject*self, char* a); +void dummy_dealloc(PyObject* self); +PyMethodDef* addMethods(PyMethodDef*obj1, PyMethodDef*obj2); + +#define PY_CHECK_TYPE(o,c) ((o)->ob_type == (c)) +#define PY_ASSERT_TYPE(o,c) {if((o)->ob_type != (c)) {printf("Invalid type: %08x(%d)", (int)(o), (o)->ob_refcnt);exit(1);}} + +#define PY_ERROR(s,args...) (PyErr_SetString(PyExc_Exception, setError(s, ## args)),NULL) +#define PY_TYPE(o) ((o)->ob_type->tp_name) +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tag.c b/fluidbook/tools/swftools-special-swfdump/lib/python/tag.c new file mode 100644 index 000000000..f495499fb --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/tag.c @@ -0,0 +1,390 @@ +#include +#undef HAVE_STAT +#include "../rfxswf.h" +#include "../log.h" +#include "./pyutils.h" +#include "primitives.h" +#include "action.h" +#include "tag.h" +#include "tagmap.h" + +//---------------------------------------------------------------------------- + +typedef struct _TagObject { + PyObject_HEAD + tag_internals_t internals; +} TagObject; + +//---------------------------------------------------------------------------- +static PyMethodDef generic_methods[] = +{ + {NULL, NULL, 0, NULL} +}; +static tag_internals_t generic_tag = +{ + parse: 0, + dealloc: 0, + fillTAG: 0, + tagfunctions: generic_methods, + datasize: 0, +}; +//---------------------------------------------------------------------------- + +static struct tag_parser { + int id; + tag_internals_t*spec; + struct tag_parser* next; +} tag_parsers[1024]; +static char parsers_initialized = 0; + +void register_tag(int id, tag_internals_t*spec) +{ + assert(id>=0 && id<1024); + if(!parsers_initialized) { + memset(tag_parsers, 0, sizeof(tag_parsers)); + parsers_initialized = 1; + } + tag_parsers[id].id = id; + tag_parsers[id].spec = spec; +}; + +static tag_internals_t* get_parser(int id) +{ + if(parsers_initialized<2) { + int t; + struct tag_parser*last = &tag_parsers[0]; + for(t=0;t<1024;t++) { + if(tag_parsers[t].spec) { + last->next = &tag_parsers[t]; + last = &tag_parsers[t]; + } + } + parsers_initialized = 2; + } + assert(id>=0 && id<1024); + return tag_parsers[id].spec; +} + +//---------------------------------------------------------------------------- +static void tag_dealloc(PyObject * self) +{ + TagObject*tag = (TagObject*)self; + if(tag->internals.tag) + mylog("-%08x(%d) tag_dealoc [%s]\n", (int)self, self->ob_refcnt, swf_TagGetName(tag->internals.tag)); + else + mylog("-%08x(%d) tag_dealoc [?]\n", (int)self, self->ob_refcnt); + if(tag->internals.dealloc) { + if(!tag->internals.data) + mylog("-%08x(%d) tag_dealoc: Warning: calling dealloc without any data(?)\n", (int)self, self->ob_refcnt); + tag->internals.dealloc(&tag->internals); + } + if(tag->internals.data) { + free(tag->internals.data); + tag->internals.data = 0; + } + if(tag->internals.tag) { + swf_DeleteTag(0, tag->internals.tag); + tag->internals.tag = 0; + } + Py_DECREF(tag->internals.tagmap); + tag->internals.tagmap = 0; + PyObject_Del(self); +} +//---------------------------------------------------------------------------- +static int fillTAG(PyObject*self) +{ + TagObject*tag = (TagObject*)self; + if(tag->internals.tag) + return 1; + if(!tag->internals.fillTAG) { + PyErr_SetString(PyExc_Exception, setError("No way to fill TAG with data")); + return 0; + } + if(!tag->internals.fillTAG(&tag->internals)) { + return 0; // pass through exception + } + if(!tag->internals.tag) { + PyErr_SetString(PyExc_Exception, setError("Couldn't fill tag")); + return 0; + } + return 1; +} +//---------------------------------------------------------------------------- +static PyObject* tag_isShape(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + if(!PyArg_ParseTuple(args, "")) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + return PyInt_FromLong(swf_isShapeTag(self->internals.tag)); +} +static PyObject* tag_isFont(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + if(!PyArg_ParseTuple(args, "")) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + int id = self->internals.tag->id; + int isfont=0; + if(id == ST_DEFINEFONT || id == ST_DEFINEFONT2) + isfont = 1; + return PyInt_FromLong(isfont); +} +static PyObject* tag_isImage(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + if(!PyArg_ParseTuple(args, "")) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + return PyInt_FromLong(swf_isImageTag(self->internals.tag)); +} +static PyObject* tag_isDefiningTag(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + if(!PyArg_ParseTuple(args, "")) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + return PyInt_FromLong(swf_isDefiningTag(self->internals.tag)); +} +static PyObject* tag_isPlacement(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + if(!PyArg_ParseTuple(args, "")) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + return PyInt_FromLong((self->internals.tag->id == ST_PLACEOBJECT || + self->internals.tag->id == ST_PLACEOBJECT2)); +} +static PyObject* tag_getBBox(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + if(!PyArg_ParseTuple(args, "")) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + return f_BBox2(swf_GetDefineBBox(self->internals.tag)); +} +static PyObject* tag_setBBox(PyObject * _self, PyObject*args) +{ + TagObject*self = (TagObject*)_self; + PyObject*bbox = 0; + if(!PyArg_ParseTuple(args, "O!", &BBoxClass, &bbox)) return NULL; + if(!fillTAG((PyObject*)self)) return NULL; + swf_SetDefineBBox(self->internals.tag, bbox_getSRECT(bbox)); + return PY_NONE; +} +//---------------------------------------------------------------------------- +static PyMethodDef common_tagfunctions[] = +{{"isShape", tag_isShape, METH_VARARGS, "tests whether the tag is a shape tag"}, + {"isImage", tag_isImage, METH_VARARGS, "tests whether the tag is an image"}, + {"isFont", tag_isFont, METH_VARARGS, "tests whether the tag is a font"}, + {"isDefiningTag", tag_isDefiningTag, METH_VARARGS, "tests whether the tag is a defining tag"}, + {"isPlacement", tag_isPlacement, METH_VARARGS, "tests whether the tag is a placement"}, + {"getBBox", tag_getBBox, METH_VARARGS, "get's the tags bounding box"}, + {"setBBox", tag_setBBox, METH_VARARGS, "set's the tags bounding box"}, + {NULL, NULL, 0, NULL} +}; + +static PyObject* tag_getattr(PyObject * self, char* a) +{ + TagObject*tag = (TagObject*)self; + PyObject* ret = NULL; + int t; + + /* -- fields -- */ + if(!strcmp(a, "tagid")) { + if(!fillTAG(self)) + return 0; + return Py_BuildValue("i", tag->internals.tag->id); + } + if(!strcmp(a, "name")) { + if(!fillTAG(self)) + return 0; + char* name = swf_TagGetName(tag->internals.tag); + return Py_BuildValue("s", name); + } + if(!strcmp(a, "data")) { + if(!fillTAG(self)) + return 0; + return Py_BuildValue("s#", tag->internals.tag->data, tag->internals.tag->len); + } + if(tag->internals.getattr) { + PyObject* ret = tag->internals.getattr(&tag->internals, a); + if(ret) return ret; + } + + /* search for a tag specific function */ + if(tag->internals.tagfunctions) { + mylog(" %08x(%d) tag_getattr: tag has specific functions\n", (int)self, self->ob_refcnt); + ret = Py_FindMethod(tag->internals.tagfunctions, self, a); + if(ret) return ret; + PyErr_Clear(); + ret = FindMethodMore(ret, common_tagfunctions, self, a); + mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); + if(ret) return ret; + PyErr_Clear(); + } + + ret = Py_FindMethod(common_tagfunctions, self, a); + + mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); + return ret; +} +static int tag_setattr(PyObject * _self, char* a, PyObject * o) +{ + TagObject*self= (TagObject*)_self; + /* a setattr will almost certainly change the tag data, + so delete the tag */ + if(self->internals.tag) { + swf_DeleteTag(0, self->internals.tag); + self->internals.tag = 0; + } + if(self->internals.setattr) { + int ret = self->internals.setattr(&self->internals, a, o); + return ret; + } + return 1; +} +//---------------------------------------------------------------------------- +// Tag Constructors +//---------------------------------------------------------------------------- +PyObject* tag_new(tag_internals_t*tag_internals) +{ + TagObject*tag = PyObject_New(TagObject, &TagClass); + mylog("+%08x(%d) tag_new\n", (int)tag, tag->ob_refcnt); + memcpy(&tag->internals, tag_internals, sizeof(tag_internals_t)); + if(tag->internals.datasize) { + tag->internals.data = malloc(tag->internals.datasize); + memset(tag->internals.data , 0, tag->internals.datasize); + } else { + tag->internals.data = 0; + } + tag->internals.tag = 0; + tag->internals.tagmap = tagmap_new(); + + return (PyObject*)tag; +} +PyObject* tag_new2(TAG*t, PyObject* tagmap) +{ + TagObject*tag = PyObject_New(TagObject, &TagClass); + mylog("+%08x(%d) tag_new2 tag=%08x id=%d (%s)\n", (int)tag, tag->ob_refcnt, t, t->id, swf_TagGetName(t)); + + PyObject*mytagmap = tagmap_new(); + + int num = swf_GetNumUsedIDs(t); + if(num) { // tag has dependencies + int * positions = malloc(num*sizeof(int)); + swf_GetUsedIDs(t, positions); + int i; + for(i=0;idata[positions[i]]); + PyObject*obj = tagmap_id2obj(tagmap, id); + if(obj==NULL) { + PyErr_SetString(PyExc_Exception, setError("TagID %d not defined", id)); + return NULL; + } + //mylog("+%08x(%d) tag_new2 handling id %d at %d/%d\n", (int)tag, tag->ob_refcnt, id, positions[i], t->len); + //mylog("+%08x(%d) tag_new2 add dependency %d to id %d, object %08x(%d)\n", (int)tag, tag->ob_refcnt, i, id, obj, obj->ob_refcnt); + tagmap_addMapping(mytagmap, id, obj); + } + free(positions); + } + + tag_internals_t*spec = get_parser(t->id); + if(spec) { + memcpy(&tag->internals, spec, sizeof(tag_internals_t)); + } else { + memcpy(&tag->internals, &generic_tag, sizeof(tag_internals_t)); + } + if(tag->internals.datasize) { + tag->internals.data = malloc(tag->internals.datasize); + memset(tag->internals.data, 0, tag->internals.datasize); + } else { + tag->internals.data = 0; + } + tag->internals.tag = swf_InsertTag(0, t->id); + swf_SetBlock(tag->internals.tag, t->data, t->len); + tag->internals.tagmap = mytagmap; + + // call tag->internals.init()? + + return (PyObject*)tag; +} +//---------------------------------------------------------------------------- +/* serialize */ +TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap) +{ + TagObject*tag = (TagObject*)self; + + if(!fillTAG(self)) + return 0; + mylog(" %08x(%d) tag_getTAG: tag=%08x id=%d (%s)", (int)self, self->ob_refcnt, tag->internals.tag, tag->internals.tag->id, swf_TagGetName(tag->internals.tag)); + + TAG* t = swf_InsertTag(prevTag, tag->internals.tag->id); + swf_SetBlock(t, tag->internals.tag->data, tag->internals.tag->len); + + if(swf_isDefiningTag(t)) { + int newid = tagmap_add(tagmap, self); + swf_SetDefineID(t, newid); + } + + int num = swf_GetNumUsedIDs(t); + if(num) { // tag has dependencies + int * positions = malloc(num*sizeof(int)); + swf_GetUsedIDs(t, positions); + int i; + for(i=0;idata[positions[i]]); + PyObject* obj = tagmap_id2obj(tag->internals.tagmap, id); + if(obj==NULL) { + PyErr_SetString(PyExc_Exception, setError("Internal error: id %d not known in taglist:")); + free(positions); + return 0; + } + //int newid = tagmap_obj2id(tag->internals.tagmap, obj); + int newid = tagmap_obj2id(tagmap, obj); + if(newid>=0) { + mylog(" %08x(%d) tag_getTAG: dependency %d) %d->%08x -> assigning(%08x) id %d", (int)self, self->ob_refcnt, i, id, obj, tagmap, newid); + } else { + /* TODO: this is only needed for sprites, so maybe it should throw an + exception otherwise */ + newid = tagmap_add(tagmap, obj); + mylog(" %08x(%d) tag_getTAG: added dependency %d) %d->%08x -> assigning(%08x) id %d", (int)self, self->ob_refcnt, i, id, obj, tagmap, newid); + } + PUT16(&t->data[positions[i]], newid); + } + free(positions); + } + return t; +} +//---------------------------------------------------------------------------- +tag_internals_t* tag_getinternals(PyObject*self) +{ + TagObject*tag = (TagObject*)self; + mylog(" %08x(%d) tag_getInternals\n", (int)self, self->ob_refcnt); + return &tag->internals; +} +//---------------------------------------------------------------------------- +PyObject* tag_getDependencies(PyObject*self) +{ + TagObject*tag = (TagObject*)self; + mylog(" %08x(%d) tag_getDependencies\n", (int)self, self->ob_refcnt); + return tagmap_getObjectList(tag->internals.tagmap); +} +//---------------------------------------------------------------------------- +int tag_print(PyObject * self, FILE * fi, int flags) +{ + TagObject*tag = (TagObject*)self; + mylog(" %08x(%d) tag_print flags=%08x\n", (int)self, self->ob_refcnt, flags); + if(!fillTAG(self)) + return -1; + //fprintf(fi, "tag-%08x-%d-%s", (int)tag->internals.tag, tag->internals.tag->id, swf_TagGetName(tag->internals.tag)); + fprintf(fi, "%s", swf_TagGetName(tag->internals.tag)); + return 0; +} +//---------------------------------------------------------------------------- +PyTypeObject TagClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "Tag", + tp_basicsize: sizeof(TagObject), + tp_itemsize: 0, + tp_dealloc: tag_dealloc, + tp_print: tag_print, + tp_getattr: tag_getattr, + tp_setattr: tag_setattr, +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tag.h b/fluidbook/tools/swftools-special-swfdump/lib/python/tag.h new file mode 100644 index 000000000..98f8b82a9 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/tag.h @@ -0,0 +1,57 @@ +/* tag.h + + Python wrapper for librfxswf- tag handlers + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __tag_h__ +#define __tag_h__ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" + +#include "tagmap.h" + +typedef struct _tag_internals +{ + int (*parse)(struct _tag_internals*); + int (*fillTAG)(struct _tag_internals*); + void (*dealloc)(struct _tag_internals*); + int datasize; + void*data; + PyObject* (*getattr)(struct _tag_internals*, char* a); + int (*setattr)(struct _tag_internals*, char* a, PyObject*val); + PyMethodDef* tagfunctions; + TAG*tag; + PyObject* tagmap; +} tag_internals_t; + +PyObject* tag_new(tag_internals_t*tag_internals); +PyObject* tag_new2(TAG*_tag, PyObject* tagmap); +TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap); +PyObject* tag_getDependencies(PyObject*self); +tag_internals_t* tag_getinternals(PyObject*tag); +void register_tag(int id, tag_internals_t*spec); + +PyMethodDef* tag_getMethods(); + +extern PyTypeObject TagClass; + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c b/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c new file mode 100644 index 000000000..0a30c08e3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c @@ -0,0 +1,332 @@ +#include +#undef HAVE_STAT +#include "../rfxswf.h" +#include "../log.h" +#include "./pyutils.h" +#include "primitives.h" +#include "action.h" +#include "tag.h" +#include "tagmap.h" +#include "taglist.h" + +//---------------------------------------------------------------------------- +typedef struct { + PyObject_HEAD + PyObject* taglist; +} TagListObject; +//---------------------------------------------------------------------------- +static void taglist_showcontents(PyObject* self) +{ + TagListObject*taglist = (TagListObject*)self; + int t, l = PyList_Size(taglist->taglist); + for(t=0;ttaglist, t); + mylog(" %08x(%d) taglist_showcontents item=%08x(%d)\n", (int)self, self->ob_refcnt, item, item->ob_refcnt); + } +} +//---------------------------------------------------------------------------- +PyObject * taglist_new() +{ + TagListObject* taglist = PyObject_New(TagListObject, &TagListClass); + mylog("+%08x(%d) taglist_new", (int)taglist, taglist->ob_refcnt); + taglist->taglist = PyList_New(0); + return (PyObject*)taglist; +} +//---------------------------------------------------------------------------- +PyObject * taglist_new2(TAG*tag) +{ + TagListObject* taglist = PyObject_New(TagListObject, &TagListClass); + mylog("+%08x(%d) taglist_new2 tag=%08x", (int)taglist, taglist->ob_refcnt, tag); + PyObject* tagmap = tagmap_new(); + + int nr=0, len=0; + TAG*t = tag; + TAG*last = t; + while(t) {len++;last=t;t=t->next;} + + if(last && last->id==ST_END) { + swf_DeleteTag(0, last); last = 0; + len--; + if(len==0) tag = 0; + } + + taglist->taglist = PyList_New(len); + + nr = 0; + t = tag; + while(t) { + PyObject*newtag = tag_new2(t, tagmap); + if(newtag==NULL) { + // pass through exception + Py_DECREF(tagmap); + return NULL; + } + PyList_SET_ITEM(taglist->taglist,nr,newtag);Py_INCREF(newtag); + if(swf_isDefiningTag(t)) { + int id = swf_GetDefineID(t); + tagmap_addMapping(tagmap, id, newtag); + } + nr++; + t=t->next; + Py_DECREF(newtag); + } + Py_DECREF(tagmap); + return (PyObject*)taglist; +} +//---------------------------------------------------------------------------- +TAG* taglist_getTAGs(PyObject*self) +{ + PyObject* tagmap = tagmap_new(); + TAG* tag = taglist_getTAGs2(self, tagmap, 1); + Py_DECREF(tagmap); + return tag; +} +//---------------------------------------------------------------------------- +TAG* taglist_getTAGs2(PyObject*self, PyObject*tagmap, int addDependencies) +{ + if(!PY_CHECK_TYPE(self,&TagListClass)) { + PyErr_SetString(PyExc_Exception, setError("Not a taglist (%08x).", self)); + return 0; + } + TagListObject*taglist = (TagListObject*)self; + + /* TODO: the tags will be modified by this. We should set mutexes. */ + + int l = PyList_Size(taglist->taglist); + int t; + TAG* tag = 0; + TAG* firstTag = 0; + mylog(" %08x(%d) taglist_getTAGs", (int)self, self->ob_refcnt); + for(t=0;ttaglist, t); + if(addDependencies) { + PyObject* deps = tag_getDependencies(item); + int l = PyList_Size(deps); + int t; + for(t=0;tfirstTag; + swf_FoldAll(&swf); + taglist->firstTag = swf.firstTag; + taglist->lastTag = 0; // FIXME + taglist->searchTag = 0;*/ + return PY_NONE; +} +//---------------------------------------------------------------------------- +static PyObject * taglist_unfoldAll(PyObject* self, PyObject* args) +{ + SWF swf; +/* TagListObject*taglist = (TagListObject*)self; + if(!self || !PyArg_ParseTuple(args,"")) + return NULL; + swf.firstTag = taglist->firstTag; + swf_UnFoldAll(&swf); + taglist->firstTag = swf.firstTag; + taglist->lastTag = 0; // FIXME + taglist->searchTag = 0;*/ + return PY_NONE; +} +//---------------------------------------------------------------------------- +static PyObject * taglist_optimizeOrder(PyObject* self, PyObject* args) +{ + SWF swf; +/* TagListObject*taglist = (TagListObject*)self; + if(!self || !PyArg_ParseTuple(args,"")) + return NULL; + swf.firstTag = taglist->firstTag; + swf_UnFoldAll(&swf); + taglist->firstTag = swf.firstTag; + taglist->lastTag = 0; // FIXME + taglist->searchTag = 0;*/ + return PY_NONE; +} +//---------------------------------------------------------------------------- +static PyMethodDef taglist_functions[] = +{{"foldAll", taglist_foldAll, METH_VARARGS, "fold all sprites (movieclips) in the list"}, + {"unfoldAll", taglist_unfoldAll, METH_VARARGS, "unfold (expand) all sprites (movieclips) in the list"}, + {"optimizeOrder", taglist_optimizeOrder, METH_VARARGS, "Reorder the Tag structure"}, + {NULL, NULL, 0, NULL} +}; + +static PyObject* taglist_getattr(PyObject * self, char* a) +{ + PyObject* ret = Py_FindMethod(taglist_functions, self, a); + mylog(" %08x(%d) taglist_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); + return ret; +} +//---------------------------------------------------------------------------- +static int taglist_length(PyObject * self) +{ + TagListObject*tags = (TagListObject*)self; + mylog(" %08x(%d) taglist_length", (int)self, self->ob_refcnt); + return PyList_GET_SIZE(tags->taglist); +} +//---------------------------------------------------------------------------- +static int taglist_contains(PyObject * self, PyObject * tag) +{ + /* TODO: optimize! */ + TagListObject*taglist = (TagListObject*)self; + PyObject*list = taglist->taglist; + int l = PyList_Size(list); + int t; + for(t=0;tob_refcnt, list, list->ob_refcnt); + + if (PyArg_Parse(list, "O!", &TagClass, &tag)) { + if(!taglist_contains(self, tag)) { + mylog(" %08x(%d) taglist_concat: Adding Tag %08x(%d)", (int)self, self->ob_refcnt, tag, tag->ob_refcnt); + PyList_Append(taglist->taglist, tag); + } else { + mylog(" %08x(%d) taglist_concat: Already contains Tag %08x(%d)", (int)self, self->ob_refcnt, tag, tag->ob_refcnt); + } + Py_INCREF(self); + return self; + /* copy tag, so we don't have to do INCREF(tag) (and don't + get problems if the tag is appended to more than one + taglist) */ + /* TODO: handle IDs */ + /* + TAG*t = tag_getTAG(tag); + TAG*nt = 0; + mylog("taglist_concat: Tag", (int)self, self->ob_refcnt); + // copy tag + nt = swf_InsertTag(0, t->id); + swf_SetBlock(nt,t->data,t->len); + PyObject*newtag = tag_new(taglist->swf, nt); + if(swf_isDefiningTag(t)) { + int id = swf_GetDefineID(t); + PyObject*id = PyLong_FromLong(id); + PyDict_SetItem((PyObject*)(taglist->char2id), list, id); + Py_INCREF(id); + PyDict_SetItem((PyObject*)(taglist->id2char), id, list); + Py_INCREF(id); + } + Py_INCREF(self); + return self;*/ + } + PyErr_Clear(); + if (PyList_Check(list)) { + int l = PyList_Size(list); + int t; + for(t=0;ttaglist); + + /*TAG* tags = taglist_getTAGs(self); + TAG* tags2 = taglist_getTAGs(list); + TAG* tags3; + tags3 = swf_Concatenate(tags,tags2); + PyObject* newtaglist = taglist_new(tags3); + swf_FreeTags(tags3); + Py_INCREF(newtaglist);*/ + } + PyErr_Clear(); + + PyErr_SetString(PyExc_Exception, setError("taglist concatenation only works with tags and lists (%08x).", list)); + return 0; +} +//---------------------------------------------------------------------------- +static PyObject * taglist_item(PyObject * self, int index) +{ + TagListObject*taglist = (TagListObject*)self; + PyObject*tag; + tag = PyList_GetItem(taglist->taglist, index); + if(!tag) + return 0; + mylog(" %08x(%d) taglist_item(%d): %08x", (int)self, self->ob_refcnt, index, tag); + Py_INCREF(tag); + return tag; +} +//---------------------------------------------------------------------------- +static void taglist_dealloc(PyObject* self) +{ + TagListObject*taglist = (TagListObject*)self; + mylog("-%08x(%d) taglist_dealloc list=%08x(%d)\n", (int)self, self->ob_refcnt, taglist->taglist, taglist->taglist->ob_refcnt); + Py_DECREF(taglist->taglist); + taglist->taglist = 0; + PyObject_Del(self); +} +//---------------------------------------------------------------------------- +static PySequenceMethods taglist_as_sequence = +{ + sq_length: taglist_length, // len(obj) + sq_concat: taglist_concat, // obj += [...], obj1+obj2 + sq_repeat: 0, // x*n, intargfunc + sq_item: taglist_item, // obj[3] + sq_slice: 0, // x[i:j] intintargfunc + sq_ass_item: 0, // x[i] = y intobjargproc + sq_ass_slice: 0, // x[i:j] = v intintobjargproc + sq_contains: taglist_contains, //??? +}; +PyTypeObject TagListClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "TagList", + tp_basicsize: sizeof(TagListObject), + tp_itemsize: 0, + tp_dealloc: taglist_dealloc, + tp_print: 0, // print x + tp_getattr: taglist_getattr, // x.attr + tp_setattr: 0, // x.attr = v + tp_compare: 0, // x>y + tp_repr: 0, // `x`, print x + tp_as_number: 0, + tp_as_sequence: &taglist_as_sequence, +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h b/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h new file mode 100644 index 000000000..8eb9d7a9f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h @@ -0,0 +1,44 @@ +/* taglist.h + + Python wrapper for librfxswf- taglist handlers, header file + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __taglist_h__ +#define __taglist_h__ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" + +#include "./tagmap.h" + +extern PyTypeObject TagListClass; + +PyObject * taglist_new(); + +/* warning: will modify tag order*/ +PyObject * taglist_new2(TAG*tag); + +TAG* taglist_getTAGs(PyObject*); +/* for sprites: */ +TAG* taglist_getTAGs2(PyObject*self, PyObject*tagmap, int addDependencies); + +PyMethodDef* taglist_getMethods(); +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c b/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c new file mode 100644 index 000000000..66429e571 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c @@ -0,0 +1,165 @@ +/* tagmap.c + + Python wrapper for librfxswf. + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#undef HAVE_STAT +#include "pyutils.h" +#include "tagmap.h" + +typedef struct { + PyObject_HEAD + PyObject* obj2id; + PyObject* id2obj; + PyObject* objlist; + int currentID; +} TagMapObject; + +//---------------------------------------------------------------------------- +PyObject* tagmap_new() +{ + PyObject* self = (PyObject*)PyObject_New(TagMapObject, &TagMapClass); + TagMapObject*tagmap = (TagMapObject*)self; + tagmap->obj2id = PyDict_New(); + tagmap->id2obj = PyDict_New(); + tagmap->objlist = PyList_New(0); + tagmap->currentID = 0; //IDs start at 1 +/* mylog("+%08x(%d) tagmap_new %08x(%d) %08x(%d), %08x(%d)", (int)self, self->ob_refcnt, + tagmap->obj2id, tagmap->obj2id->ob_refcnt , + tagmap->id2obj, tagmap->id2obj->ob_refcnt , + tagmap->objlist, tagmap->objlist->ob_refcnt);*/ + return self; +} + +//---------------------------------------------------------------------------- +int tagmap_obj2id(PyObject* self, PyObject* obj) +{ + TagMapObject*tagmap = (TagMapObject*)self; + PyObject*id = PyDict_GetItem(tagmap->obj2id, obj); + if(id == 0) + return -1; + int _id = PyLong_AsLong(id); + return _id; +} + +//---------------------------------------------------------------------------- +PyObject* tagmap_id2obj(PyObject* self, int _id) +{ + TagMapObject*tagmap = (TagMapObject*)self; + PyObject*id = PyLong_FromLong(_id); + PyObject*obj = PyDict_GetItem(tagmap->id2obj, id); + Py_DECREF(id); + return obj; +} +//---------------------------------------------------------------------------- +int tagmap_getFreeID(PyObject*self) +{ + TagMapObject*tagmap = (TagMapObject*)self; + int last = tagmap->currentID; + do { + tagmap->currentID++; + PyObject*id = PyLong_FromLong(tagmap->currentID); + PyObject*test = PyDict_GetItem(tagmap->id2obj,id); + Py_DECREF(id); + if(test == 0) { + PyErr_Clear(); + mylog(" %08x(%d) tagmap_getFreeID -> %d", (int)self, self->ob_refcnt, tagmap->currentID); + return tagmap->currentID; + } + } while(last != tagmap->currentID); + mylog(" %08x(%d) tagmap_getFreeID -> -1", (int)self, self->ob_refcnt); + return -1; +} +//---------------------------------------------------------------------------- +static void tagmap_add_mapping(PyObject*self, int id, PyObject* obj) +{ + TagMapObject*tagmap = (TagMapObject*)self; + PyList_Append(tagmap->objlist, obj);//Py_INCREF(obj); done by PyList_Append + PyObject*id_obj = PyLong_FromLong(id); + PyDict_SetItem(tagmap->obj2id, obj, id_obj);//Py_INCREF(id_obj);Py_INCREF(obj); done by PyDict_SetItem + PyDict_SetItem(tagmap->id2obj, id_obj, obj);//Py_INCREF(id_obj);Py_INCREF(obj); done by PyDict_SetItem + Py_DECREF(id_obj); +} +//---------------------------------------------------------------------------- +void tagmap_addMapping(PyObject*self, int id, PyObject* obj) +{ + TagMapObject*tagmap = (TagMapObject*)self; + int id2 = tagmap_obj2id(self, obj); + if(id2>=0) { + assert(id==id2); + return; + } + tagmap_add_mapping(self, id, obj); +} +//---------------------------------------------------------------------------- +int tagmap_add(PyObject* self, PyObject* obj) +{ + TagMapObject*tagmap = (TagMapObject*)self; + int id = tagmap_obj2id(self, obj); + if(id>=0) { + mylog(" %08x(%d) tagmap_add %08x->%d (again)", (int)self, self->ob_refcnt, (int)obj, id); + return id; + } + id = tagmap_getFreeID(self); + + tagmap_add_mapping(self, id, obj); + + mylog(" %08x(%d) tagmap_add %08x->%d", (int)self, self->ob_refcnt, (int)obj, id); + return id; +} + +//---------------------------------------------------------------------------- +void tagmap_dealloc(PyObject* self) +{ + TagMapObject*tagmap = (TagMapObject*)self; + mylog("-%08x(%d) tagmap_dealloc %08x(%d) %08x(%d), %08x(%d)", (int)self, self->ob_refcnt, + tagmap->obj2id, tagmap->obj2id->ob_refcnt , + tagmap->id2obj, tagmap->id2obj->ob_refcnt , + tagmap->objlist, tagmap->objlist->ob_refcnt); + + Py_DECREF(tagmap->obj2id); + tagmap->obj2id = 0; + Py_DECREF(tagmap->id2obj); + tagmap->id2obj = 0; + Py_DECREF(tagmap->objlist); + tagmap->objlist = 0; + PyObject_Del(self); +} +//---------------------------------------------------------------------------- +PyObject* tagmap_getObjectList(PyObject* self) +{ + mylog(" %08x(%d) tagmap_getObjectList", (int)self, self->ob_refcnt); + TagMapObject*tagmap = (TagMapObject*)self; + return tagmap->objlist; +} +//---------------------------------------------------------------------------- +PyTypeObject TagMapClass = +{ + PyObject_HEAD_INIT(NULL) + 0, + tp_name: "TagMap", + tp_basicsize: sizeof(TagMapObject), + tp_itemsize: 0, + tp_dealloc: tagmap_dealloc, + tp_print: 0, + tp_getattr: 0, + tp_setattr: 0, +}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h b/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h new file mode 100644 index 000000000..66f6ed42e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h @@ -0,0 +1,39 @@ +/* action.h + + Python wrapper for librfxswf- actionscript stuff (header) + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __tagmap_h__ +#define __tagmap_h__ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" + +extern PyTypeObject TagMapClass; +int tagmap_obj2id(PyObject* self, PyObject* obj); +PyObject* tagmap_id2obj(PyObject* self, int _id); +int tagmap_add(PyObject* self, PyObject* obj); +void tagmap_addMapping(PyObject*self, int id, PyObject*obj); +PyObject* tagmap_getObjectList(PyObject* self); + +PyObject* tagmap_new(); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tags.c b/fluidbook/tools/swftools-special-swfdump/lib/python/tags.c new file mode 100644 index 000000000..ca49a25d8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/tags.c @@ -0,0 +1,1229 @@ +#include "pyutils.h" +#include "primitives.h" +#include "action.h" +#include "taglist.h" +#include "tag.h" +#include "tags.h" +#include "image.h" +#include "../png.h" + +//---------------------------------------------------------------------------- + +typedef struct _font_internal +{ + SWFFONT* font; +} font_internal_t; +staticforward tag_internals_t font_tag; + +static int font_parse(tag_internals_t*self) +{ + font_internal_t*font = (font_internal_t*)self->data; + /* TODO */ + PyErr_SetString(PyExc_Exception, setError("Font parsing not implemented yet")); + return 0; +} +static void font_dealloc(tag_internals_t*self) +{ + font_internal_t*font = (font_internal_t*)self->data; + if(font->font) { + swf_FontFree(font->font); + font->font = 0; + } +} +static int font_fillTAG(tag_internals_t*self) +{ + font_internal_t*fi = (font_internal_t*)self->data; + if(self->tag) + return 1; + self->tag = swf_InsertTag(0, ST_DEFINEFONT2); + swf_FontSetDefine2(self->tag, fi->font); + return 1; +} +static PyObject* f_DefineFont(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"filename", NULL}; + char*filename = 0; + PyObject*tag; + SWFFONT* font; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &filename)) + return NULL; + + font = swf_LoadFont(filename, 0); + if(!font) { + PyErr_SetString(PyExc_Exception, setError("Could not load %s", filename)); + return NULL; + } + + tag = tag_new(&font_tag); + tag_internals_t*itag = tag_getinternals(tag); + font_internal_t*fi = (font_internal_t*)itag->data; + font->id = 0; + fi->font = font; + return (PyObject*)tag; +} +static SWFFONT* font_getSWFFONT(PyObject*self) +{ + PY_ASSERT_TYPE(self, &TagClass); + tag_internals_t*itag = tag_getinternals(self); + font_internal_t*fi = (font_internal_t*)itag->data; + return fi->font; +} +static tag_internals_t font_tag = +{ + parse: font_parse, + fillTAG: font_fillTAG, + dealloc: font_dealloc, + getattr: 0, + setattr: 0, + tagfunctions: 0, + datasize: sizeof(font_internal_t), +}; +//---------------------------------------------------------------------------- + +typedef struct _placeobject_internal +{ + SWFPLACEOBJECT* po; + PyObject*character; +} placeobject_internal_t; +staticforward tag_internals_t placeobject_tag; + +static void po_dealloc(tag_internals_t*self) +{ + placeobject_internal_t*pi = (placeobject_internal_t*)self->data; + if(pi->po) { + swf_PlaceObjectFree(pi->po); + pi->po = 0; + } +} +static int po_parse(tag_internals_t*self) +{ + placeobject_internal_t*i = (placeobject_internal_t*)self->data; + if(i->po) + return 1; + if(!self->tag) + return 0; + SWFPLACEOBJECT* swfpo = malloc(sizeof(SWFPLACEOBJECT)); + swf_GetPlaceObject(self->tag, swfpo); + i->po = swfpo; + swf_DeleteTag(0, self->tag);self->tag = 0; + + if(i->po->id) { + i->character = tagmap_id2obj(self->tagmap, i->po->id); + if(i->character) { + Py_INCREF(i->character); + } else { + //PyErr_Clear(); //? + } + } + return 1; +} +static int po_fillTAG(tag_internals_t*self) +{ + placeobject_internal_t*pi = (placeobject_internal_t*)self->data; + self->tag = swf_InsertTag(0, ST_PLACEOBJECT2); + swf_SetPlaceObject(self->tag, pi->po); + return 1; +} +static PyObject* po_getattr(tag_internals_t*self,char*a) +{ + placeobject_internal_t*i = (placeobject_internal_t*)self->data; + if(!po_parse(self)) + return PY_ERROR("Couldn't parse placeobject"); + if(!strcmp(a, "character")) { + if(!i->character) + return PY_NONE; + Py_INCREF(i->character); //TODO: ?? + return i->character; + } else if(!strcmp(a, "matrix")) { + return f_Matrix2(&i->po->matrix); + } else if(!strcmp(a, "cxform")) { + /* TODO */ + return 0; + } + return 0; +} +static int po_setattr(tag_internals_t*self,char*a, PyObject*obj) +{ + placeobject_internal_t*si = (placeobject_internal_t*)self->data; + if(!strcmp(a, "cxform")) { + /* TODO */ + return 0; + } + return -1; +} +static PyObject* po_create(PyObject* self, PyObject* args, PyObject* kwargs,char move) +{ + static char *kwlist[] = {"character", "depth", "matrix", "colortransform", "ratio", "name", "clipdepth", "action", NULL}; + + PyObject*character = 0; + int depth; + int clipdepth = 0; + PyObject*matrix = 0; + PyObject*cxform = 0; + PyObject*action = 0; + int ratio = 0; + char* name = 0; + SWFPLACEOBJECT* po; + po = malloc(sizeof(SWFPLACEOBJECT)); + memset(po, 0, sizeof(SWFPLACEOBJECT)); + + swf_GetPlaceObject(0, po); + + PyErr_Clear(); + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi|O!O!isiO!", kwlist, + &character, + &depth, + &MatrixClass, &matrix, + &CXFormClass, &cxform, + &ratio, + &name, + &clipdepth, + &ActionClass, &action + )) + return NULL; + + po->depth = depth; + po->clipdepth = clipdepth; + po->ratio = ratio; + po->name = name; + po->move = move; + if(clipdepth) po->clipdepth = clipdepth; + if(matrix) po->matrix = matrix_getMatrix(matrix); + if(cxform) po->cxform = colortransform_getCXForm(cxform); + if(action) po->actions = action_getAction(action); + + PyObject*tag; + tag = tag_new(&placeobject_tag); + tag_internals_t*itag = tag_getinternals(tag); + placeobject_internal_t*pi = (placeobject_internal_t*)itag->data; + pi->po = po; + if(!move) { + pi->po->id = tagmap_add(itag->tagmap,(PyObject*)character); + } else { + pi->po->id = 0; + } + + mylog("+%08x(%d) PlaceObject %08x(%d)\n", (int)tag, tag->ob_refcnt, character, character->ob_refcnt); + + return (PyObject*)tag; +} +static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs) +{ + return po_create(self, args, kwargs, 0); +} +static PyObject* f_MoveObject(PyObject* self, PyObject* args, PyObject* kwargs) +{ + return po_create(self, args, kwargs, 1); +} +static tag_internals_t placeobject_tag = +{ + parse: po_parse, + fillTAG: po_fillTAG, + dealloc: po_dealloc, + getattr: po_getattr, + setattr: po_setattr, + tagfunctions: 0, + datasize: sizeof(placeobject_internal_t), +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t bgcolor_tag; +static PyObject* tag_setbackgroundcolor_getrgb(PyObject * self, PyObject*other) +{ + tag_internals_t*itag = tag_getinternals(self); + int r,g,b; + r = itag->tag->data[0]; + g = itag->tag->data[1]; + b = itag->tag->data[2]; + return Py_BuildValue("(iii)", r,g,b); +} +static PyMethodDef setbgcolor_methods[] = +{{"getRGB", tag_setbackgroundcolor_getrgb, METH_VARARGS, "get's the color set by this tag"}, + {NULL, NULL, 0, NULL} +}; +static PyObject* f_SetBackgroundColor(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"color", NULL}; + int r=0,g=0,b=0; + PyObject*tag; + PyObject*color; + + tag = tag_new(&bgcolor_tag); + tag_internals_t*itag = tag_getinternals(tag); + + /* 1st try- copy constructor */ + if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &ColorClass, &color)) { + PyErr_Clear(); + /* 2nd try- color's contructor */ + color = f_Color(NULL, args, kwargs); + } + if(!color) + return NULL; + + itag->tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); + RGBA rgba = color_getRGBA(color); + swf_SetU8(itag->tag, rgba.r); + swf_SetU8(itag->tag, rgba.g); + swf_SetU8(itag->tag, rgba.b); + mylog(" %08x(%d) SetBackgroundColor(%02x,%02x,%02x) (colorobj=%08x(%d))\n", (int)tag, tag->ob_refcnt, rgba.r, rgba.g, rgba.b, color, color->ob_refcnt); + Py_DECREF(color); + return (PyObject*)tag; +} +static tag_internals_t bgcolor_tag = +{ + parse: 0, + fillTAG: 0, + dealloc: 0, + getattr: 0, + setattr: 0, + tagfunctions: setbgcolor_methods, + datasize: 0, +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t protect_tag; +static PyObject* f_Protect(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"password", NULL}; + char*password = 0; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &password)) + return NULL; + + PyObject*tag = tag_new(&protect_tag); + tag_internals_t*itag = tag_getinternals(tag); + itag->tag = swf_InsertTag(0, ST_PROTECT); + if(password) { + swf_SetPassword(itag->tag, password); + } + mylog("+%08x(%d) f_Protect", (int)tag, tag->ob_refcnt); + return (PyObject*)tag; +} +static tag_internals_t protect_tag = +{ + parse: 0, + fillTAG: 0, + dealloc: 0, + getattr: 0, + setattr: 0, + tagfunctions: 0, + datasize: 0, +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t showframe_tag; +static PyObject* f_ShowFrame(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"name", NULL}; + char*name= 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &name)) + return NULL; + + PyObject*tag = tag_new(&showframe_tag); + tag_internals_t*itag = tag_getinternals(tag); + itag->tag = swf_InsertTag(0, ST_SHOWFRAME); + mylog("+%08x(%d) f_ShowFrame", (int)tag, tag->ob_refcnt); + return (PyObject*)tag; +} +static tag_internals_t showframe_tag = +{ + parse: 0, + fillTAG: 0, + dealloc: 0, + getattr: 0, + setattr: 0, + tagfunctions: 0, + datasize: 0, +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t removeobject_tag; +static PyObject* f_RemoveObject(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"depth", NULL}; + int depth; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &depth)) + return NULL; + + PyObject*tag = tag_new(&removeobject_tag); + tag_internals_t*itag = tag_getinternals(tag); + itag->tag = swf_InsertTag(0, ST_REMOVEOBJECT); + swf_SetU16(itag->tag, depth); + mylog("+%08x(%d) f_RemoveObject", (int)tag, tag->ob_refcnt); + return (PyObject*)tag; +} +static tag_internals_t removeobject_tag = +{ + parse: 0, + fillTAG: 0, + dealloc: 0, + getattr: 0, + setattr: 0, + tagfunctions: 0, + datasize: 0, +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t sprite_tag; +typedef struct _sprite_internal +{ + PyObject* taglist; +} sprite_internal_t; + +static int sprite_fillTAG(tag_internals_t*self) +{ + mylog("+%08x(?) sprite_fillTAG", (int)self); + + sprite_internal_t*si = (sprite_internal_t*)self->data; + + TAG*sprite = swf_InsertTag(0, ST_DEFINESPRITE); + swf_SetU16(sprite, 0); //id + swf_SetU16(sprite, 0); //frames + + TAG*tag = taglist_getTAGs2(si->taglist, self->tagmap, 0); + if(!tag) { + /* pass through exception */ + return 0; + } + TAG*tag2 = tag; + while(tag2->next) tag2 = tag2->next; + swf_InsertTag(tag2, ST_END); + + sprite->next = tag; + tag->prev = sprite; + + swf_FoldSprite(sprite); + self->tag = sprite; + return 1; +} + +static PyObject* f_Sprite(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"name", NULL}; + char*name= 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &name)) + return NULL; + + PyObject*tag = tag_new(&sprite_tag); + tag_internals_t*itag = tag_getinternals(tag); + sprite_internal_t*si = (sprite_internal_t*)itag->data; + si->taglist = taglist_new(); + mylog("+%08x(%d) f_DefineSprite", (int)tag, tag->ob_refcnt); + return (PyObject*)tag; +} +static PyObject* sprite_getattr(tag_internals_t*self,char*a) +{ + sprite_internal_t*si = (sprite_internal_t*)self->data; + if(!strcmp(a, "tags")) { + Py_INCREF(si->taglist); + return si->taglist; + } + return 0; +} +static int sprite_setattr(tag_internals_t*self,char*a, PyObject*obj) +{ + sprite_internal_t*si = (sprite_internal_t*)self->data; + if(self->tag) { + swf_DeleteTag(0, self->tag); + self->tag = 0; + } + if(!strcmp(a, "tags")) { + PY_ASSERT_TYPE(obj,&TagListClass); + Py_DECREF(si->taglist); + si->taglist = obj; + Py_INCREF(si->taglist); + return 0; + } + return 1; +} +static tag_internals_t sprite_tag = +{ + parse: 0, + fillTAG: sprite_fillTAG, + dealloc: 0, + getattr: sprite_getattr, + setattr: sprite_setattr, + tagfunctions: 0, + datasize: sizeof(sprite_internal_t), +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t end_tag; +static tag_internals_t end_tag = +{ + parse: 0, + fillTAG: 0, + dealloc: 0, + getattr: 0, + setattr: 0, + tagfunctions: 0, + datasize: 0, +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t text_tag; + +typedef struct _text_internal +{ + char*text; + SWFFONT* swffont; + RGBA rgba; + int size; + SRECT bbox; +} text_internal_t; +staticforward tag_internals_t placeobject_tag; + +static int text_fillTAG(tag_internals_t*self) +{ + text_internal_t*ti = (text_internal_t*)self->data; + self->tag= swf_InsertTag(0, ST_DEFINETEXT2); + swf_SetU16(self->tag, /*ID*/0); + ti->bbox = swf_SetDefineText(self->tag, ti->swffont, &ti->rgba, ti->text, ti->size); + return 1; +} +static PyObject* text_getattr(tag_internals_t*self,char*a) +{ + text_internal_t*si = (text_internal_t*)self->data; + if(!strcmp(a, "bbox")) { + return f_BBox2(si->bbox); + } + return 0; +} +static PyObject* f_DefineText(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"font", "text", "size", "color", NULL}; + PyObject*tag = 0; + PyObject*otext; + char*text = 0; + int size = 0; + RGBA rgba = {255,0,0,0}; + PyObject*color = 0; + PyObject*font = 0; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!Oi|O!", kwlist, &TagClass, &font, &otext, &size, &ColorClass, &color)) + return NULL; + if(PyUnicode_Check(otext)) { + text = PyString_AS_STRING(PyUnicode_AsUTF8String(otext)); + } else if(PyString_Check(otext)) { + text = PyString_AS_STRING(otext); + } + + if(color) + rgba = color_getRGBA(color); + + mylog("DefineText: text = %s", text); + + tag = tag_new(&text_tag); + tag_internals_t* itag = tag_getinternals(tag); + text_internal_t*ti = (text_internal_t*)itag->data; + + ti->swffont = font_getSWFFONT(font); + int font_id = tagmap_add(itag->tagmap, font); // add dependency on font + ti->swffont->id = font_id; // for swf_SetDefineTexts + ti->text = strdup(text); + ti->rgba = rgba; + ti->size = size; + + return (PyObject*)tag; +} +static tag_internals_t text_tag = +{ + parse: 0, + fillTAG: text_fillTAG, + dealloc: 0, + getattr: text_getattr, + setattr: 0, + tagfunctions: 0, + datasize: sizeof(text_internal_t), +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t image_tag; + +typedef struct _image_internal +{ + RGBA*rgba; + int size; + int width; + int height; + int bpp; + char isindexed; + char islossless; +} image_internal_t; +staticforward tag_internals_t image_tag; + +static int image_fillTAG(tag_internals_t*self) +{ + image_internal_t*ti = (image_internal_t*)self->data; + self->tag= swf_InsertTag(0, ST_DEFINEBITSLOSSLESS2); + swf_SetU16(self->tag, /*ID*/0); + swf_SetLosslessBits(self->tag, ti->width, ti->height, ti->rgba, BMF_32BIT); + return 1; +} +static void image_dealloc(tag_internals_t*self) +{ + image_internal_t*pi = (image_internal_t*)self->data; + if(pi->rgba) { + free(pi->rgba);pi->rgba = 0; + } +} +static int image_parse(tag_internals_t*self) +{ + image_internal_t*i= (image_internal_t*)self->data; + if(i->rgba) + return 1; + if(!self->tag) + return 0; + + i->rgba = swf_ExtractImage(self->tag, &i->width, &i->height); + i->bpp = 32; + i->isindexed = 0; + i->islossless = 1; + + swf_DeleteTag(0, self->tag);self->tag = 0; + return 1; +} +static int imagetag_getWidth(PyObject* self) +{ + tag_internals_t*itag = tag_getinternals(self); + image_internal_t*pi = (image_internal_t*)itag->data; + return pi->width; +} +static int imagetag_getHeight(PyObject* self) +{ + tag_internals_t*itag = tag_getinternals(self); + image_internal_t*pi = (image_internal_t*)itag->data; + return pi->height; +} +static PyObject* f_DefineImage(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"image", NULL}; + PyObject*image = 0; + PyObject*tag = tag_new(&image_tag); + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &image)) + return NULL; + + tag = tag_new(&image_tag); + tag_internals_t* itag = tag_getinternals(tag); + image_internal_t*ti = (image_internal_t*)itag->data; + + ti->rgba = image_toRGBA(image); + if(!ti->rgba) // pass through exception + return 0; + ti->width = image_getWidth(image); + ti->height = image_getHeight(image); + ti->isindexed = 0; + ti->islossless = 1; + ti->bpp = 32; + ti->size = ti->width*ti->height; + + return (PyObject*)tag; +} +static PyObject* image_getattr(tag_internals_t*self,char*a) +{ + image_internal_t*i = (image_internal_t*)self->data; + if(!strcmp(a, "image")) { + if(!i->rgba) { + image_parse(self); + } + PyObject* image = rgba_to_image(i->rgba, i->width, i->height); + return image; + } + return 0; +} + +static PyObject* image_save(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!image_parse(itag)) + return PY_ERROR("Couldn't parse image"); + image_internal_t*fi = (image_internal_t*)itag->data; + + char*filename = 0; + if(!PyArg_ParseTuple(args, "s", &filename)) + return NULL; + + png_write(filename, (unsigned char*)fi->rgba ,fi->width, fi->height); + + return PY_NONE; +} + +static PyMethodDef image_methods[] = +{{"save", image_save, METH_VARARGS, "saves an image as PNG"}, + {NULL, NULL, 0, NULL} +}; + +static tag_internals_t image_tag = +{ + parse: image_parse, + fillTAG: image_fillTAG, + dealloc: image_dealloc, + getattr: image_getattr, + setattr: 0, + tagfunctions: image_methods, + datasize: sizeof(image_internal_t), +}; +//---------------------------------------------------------------------------- +staticforward tag_internals_t shape_tag; + +typedef struct _shape_internal +{ + SHAPE2*shape2; +} shape_internal_t; +staticforward tag_internals_t shape_tag; + +static int shape_fillTAG(tag_internals_t*self) +{ + shape_internal_t*ti = (shape_internal_t*)self->data; + self->tag= swf_InsertTag(0, ST_DEFINESHAPE3); + swf_SetU16(self->tag, /*ID*/0); + swf_SetShape2(self->tag, ti->shape2); + return 1; +} +static int shape_parse(tag_internals_t*self) +{ + shape_internal_t*i= (shape_internal_t*)self->data; + if(i->shape2) + return 1; + if(!self->tag) + return 0; + SHAPE2* shape2 = malloc(sizeof(SHAPE2)); + swf_ParseDefineShape(self->tag, shape2); + i->shape2 = shape2; + swf_DeleteTag(0, self->tag);self->tag = 0; + return 1; +} +static void shape_dealloc(tag_internals_t*self) +{ + shape_internal_t*pi = (shape_internal_t*)self->data; + if(pi->shape2) { + swf_Shape2Free(pi->shape2); + pi->shape2 = 0; + } +} +static PyObject* f_DefineImageShape(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"image", NULL}; + PyObject*image = 0; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &TagClass, &image)) + return NULL; + + PyObject*tag = tag_new(&shape_tag); + tag_internals_t* itag = tag_getinternals(tag); + shape_internal_t*ti = (shape_internal_t*)itag->data; + ti->shape2 = 0; /*HACK*/ + + int width = imagetag_getWidth(image); + int height = imagetag_getHeight(image); + int id = tagmap_add(itag->tagmap, image); + itag->tag= swf_InsertTag(0, ST_DEFINESHAPE3); + swf_SetU16(itag->tag, 0); + swf_ShapeSetBitmapRect(itag->tag, id, width, height); + return (PyObject*)tag; +} + +/* TODO: move to lib/ */ +SHAPE2*swf_StringToShape2(char*s,FILLSTYLE*f, LINESTYLE*l) +{ + drawer_t draw; + swf_Shape11DrawerInit(&draw, 0); + draw_string(&draw, s); + draw.finish(&draw); + SHAPE*s1 = swf_ShapeDrawerToShape(&draw); + SRECT r = swf_ShapeDrawerGetBBox(&draw); + RGBA col;col.r=col.g=col.b=128;col.a=255; + if(l) + swf_ShapeAddLineStyle(s1, 1, &col); + if(f) + swf_ShapeAddSolidFillStyle(s1, &col); + draw.dealloc(&draw); + SHAPE2*shape2 = swf_ShapeToShape2(s1); + swf_ShapeFree(s1); + shape2->bbox = malloc(sizeof(SRECT)); + *(shape2->bbox) = r; + if(f && shape2->numfillstyles) + shape2->fillstyles[0] = *f; + if(l && shape2->numlinestyles) + shape2->linestyles[0] = *l; + return shape2; +} + +static PyObject* f_DefineShape(PyObject* self, PyObject* args, PyObject* kwargs) +{ + static char *kwlist[] = {"s", "fill", "line", NULL}; + char*s = 0; + PyObject*fillstyle=0,*linestyle=0; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", kwlist, &s,&fillstyle,&linestyle)) + return NULL; + + PyObject*tag = tag_new(&shape_tag); + tag_internals_t* itag = tag_getinternals(tag); + shape_internal_t*ti = (shape_internal_t*)itag->data; + + FILLSTYLE _f,*f=0; + LINESTYLE _l,*l=0; + + if(fillstyle) { + f = &_f; + if(PY_CHECK_TYPE(fillstyle, &ColorClass)) { + f->type = /*FILL_SOLID*/ 0; + f->color = color_getRGBA(fillstyle); + } else { + return PY_ERROR("Invalid Fillstyle"); + } + } + + if(linestyle) { + l = &_l; + if(PyTuple_Check(linestyle) && PyTuple_GET_SIZE(linestyle)==2) { + float f = 0.0; + PyObject*color = 0; + if(!PyArg_ParseTuple(linestyle, "fO!", &f, &ColorClass, &color)) + return 0; + + l->width = (int)(f*20); + l->color = color_getRGBA(color); + } else { + return PY_ERROR("Invalid Linestyle"); + } + } + ti->shape2 = swf_StringToShape2(s,f,l); + + itag->tag = 0; + + return (PyObject*)tag; +} +static PyObject* shape_getfillstyles(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!shape_parse(itag)) + return PY_ERROR("Couldn't parse shape"); + shape_internal_t*fi = (shape_internal_t*)itag->data; + int num = fi->shape2->numfillstyles; + return Py_BuildValue("i", num); +} +static PyObject* shape_getlinestyles(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!shape_parse(itag)) + return PY_ERROR("Couldn't parse shape"); + shape_internal_t*fi = (shape_internal_t*)itag->data; + int num = fi->shape2->numlinestyles; + return Py_BuildValue("i", num); +} +static PyObject* shape_getfillstyle(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!shape_parse(itag)) + return PY_ERROR("Couldn't parse shape"); + shape_internal_t*fi = (shape_internal_t*)itag->data; + int nr = 0; + if(!PyArg_ParseTuple(args, "i", &nr)) + return NULL; + + int num = fi->shape2->numfillstyles; + if(nr < 0 || nr >=num) + return PY_ERROR("fillstyle index out of range"); + return f_FillStyle2(fi->shape2->fillstyles[nr]); +} +static PyObject* shape_getlinestyle(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!shape_parse(itag)) + return PY_ERROR("Couldn't parse shape"); + shape_internal_t*fi = (shape_internal_t*)itag->data; + int nr = 0; + if(!PyArg_ParseTuple(args, "i", &nr)) + return NULL; + + int num = fi->shape2->numfillstyles; + if(nr < 0 || nr >=num) + return PY_ERROR("fillstyle index out of range"); + return f_LineStyle3(fi->shape2->linestyles[nr]); +} +static PyObject* shape_setfillstyle(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!shape_parse(itag)) + return PY_ERROR("Couldn't parse shape"); + shape_internal_t*fi = (shape_internal_t*)itag->data; + int nr = 0; + PyObject*fs = 0; + if(!PyArg_ParseTuple(args, "iO!", &nr, &FillStyleClass, &fs)) + return NULL; + + int num = fi->shape2->numfillstyles; + if(nr < 0 || nr >=num) + return PY_ERROR("fillstyle index out of range"); + fi->shape2->fillstyles[nr] = fillstyle_getFillStyle(fs); + return PY_NONE; +} +static PyObject* shape_setlinestyle(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + if(!shape_parse(itag)) + return PY_ERROR("Couldn't parse shape"); + shape_internal_t*fi = (shape_internal_t*)itag->data; + int nr = 0; + PyObject*ls = 0; + if(!PyArg_ParseTuple(args, "iO!", &nr, &LineStyleClass, &ls)) + return NULL; + + int num = fi->shape2->numlinestyles; + if(nr < 0 || nr >=num) + return PY_ERROR("linestyle index out of range"); + fi->shape2->linestyles[nr] = linestyle_getLineStyle(ls); + return PY_NONE; +} +static PyMethodDef shape_methods[] = +{{"numfillstyles", shape_getfillstyles, METH_VARARGS, "get's the number of fillstyles"}, + {"numlinestyles", shape_getlinestyles, METH_VARARGS, "get's the number of linestyles"}, + {"getfillstyle", shape_getfillstyle, METH_VARARGS, "get's one fillstyle"}, + {"getlinestyle", shape_getlinestyle, METH_VARARGS, "get's one linestyle"}, + {"setfillstyle", shape_setfillstyle, METH_VARARGS, "set's one fillstyle"}, + {"setlinestyle", shape_setlinestyle, METH_VARARGS, "set's one linestyle"}, + {NULL, NULL, 0, NULL} +}; + +static tag_internals_t shape_tag = +{ + parse: shape_parse, + fillTAG: shape_fillTAG, + dealloc: shape_dealloc, + getattr: 0, + setattr: 0, + tagfunctions: shape_methods, + datasize: sizeof(shape_internal_t), +}; +//---------------------------------------------------------------------------- + +typedef struct _videostream_internal +{ + VIDEOSTREAM* stream; + int lastiframe; +} videostream_internal_t; +staticforward tag_internals_t videostream_tag; +staticforward tag_internals_t videoframe_tag; + +static int videostream_parse(tag_internals_t*self) +{ + videostream_internal_t*videostream = (videostream_internal_t*)self->data; + /* TODO */ + PyErr_SetString(PyExc_Exception, setError("videostream parsing not implemented yet")); + return 0; +} +static void videostream_dealloc(tag_internals_t*self) +{ + videostream_internal_t*videostream = (videostream_internal_t*)self->data; + if(videostream->stream) { + swf_VideoStreamClear(videostream->stream); + free(videostream->stream); + videostream->stream = 0; + } +} +static int videostream_fillTAG(tag_internals_t*self) +{ + videostream_internal_t*fi = (videostream_internal_t*)self->data; + if(self->tag) + return 1; + PyErr_SetString(PyExc_Exception, setError("videostream filling not implemented")); + return 0; +} +static PyObject* f_DefineVideoStream(PyObject* self, PyObject* args, PyObject* kwargs) +{ + PyObject*tag = tag_new(&videostream_tag); + + int width=0,height=0,frames=65535; + static char *kwlist[] = {"width", "height", "frames", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii|i", kwlist, &width, &height, &frames)) + return NULL; + + tag_internals_t*itag = tag_getinternals(tag); + videostream_internal_t*fi = (videostream_internal_t*)itag->data; + fi->stream = malloc(sizeof(VIDEOSTREAM)); + memset(fi->stream, 0, sizeof(VIDEOSTREAM)); + + TAG*t = swf_InsertTag(0, ST_DEFINEVIDEOSTREAM); + swf_SetU16(t, 0); /* id */ + swf_SetVideoStreamDefine(t, fi->stream, frames, width, height); + itag->tag = t; + fi->lastiframe = -65536; + return (PyObject*)tag; +} +static VIDEOSTREAM* videostream_getVIDEOSTREAM(PyObject*self) +{ + PY_ASSERT_TYPE(self, &TagClass); + tag_internals_t*itag = tag_getinternals(self); + videostream_internal_t*fi = (videostream_internal_t*)itag->data; + return fi->stream; +} +static PyObject* videostream_getbwidth(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + videostream_internal_t*fi = (videostream_internal_t*)itag->data; + int width = fi->stream->bbx; + return Py_BuildValue("i", width); +} +static PyObject* videostream_getbheight(PyObject*self, PyObject*args) +{ + tag_internals_t*itag = tag_getinternals(self); + videostream_internal_t*fi = (videostream_internal_t*)itag->data; + int height = fi->stream->bby; + return Py_BuildValue("i", height); +} +static PyObject* videostream_addBlackFrame(PyObject*self, PyObject*args, PyObject*kwargs) +{ + tag_internals_t*_itag = tag_getinternals(self); + videostream_internal_t*fi = (videostream_internal_t*)_itag->data; + + TAG* t = swf_InsertTag(0, ST_VIDEOFRAME); + + PyObject*tag = tag_new(&videoframe_tag); + tag_internals_t*itag = tag_getinternals(tag); + + swf_SetU16(t,0); /* id */ + swf_SetVideoStreamBlackFrame(t, fi->stream); + fi->lastiframe = fi->stream->frame; + + itag->tag = t; + tagmap_addMapping(itag->tagmap, 0, self); + return tag; +} +static PyObject* videostream_addFrame(PyObject*self, PyObject*args, PyObject*kwargs) +{ + tag_internals_t*_itag = tag_getinternals(self); + videostream_internal_t*fi = (videostream_internal_t*)_itag->data; + + PyObject*image = 0; + char*type=0; // none, "i", "p" + int quant=7; + static char *kwlist[] = {"image", "quant", "type", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|is", kwlist, &image, &quant, &type)) + return NULL; + if(fi->stream->owidth != image_getWidth(image)) { + PyErr_SetString(PyExc_Exception, setError("bad image width %d!=%d", image_getWidth(image), fi->stream->width));return 0; + } + if(fi->stream->oheight != image_getHeight(image)) { + PyErr_SetString(PyExc_Exception, setError("bad image width %d!=%d", image_getHeight(image), fi->stream->height));return 0; + } + PyObject*tag = tag_new(&videoframe_tag); + tag_internals_t*itag = tag_getinternals(tag); + + RGBA*pic = image_toRGBA(image); + if(!pic) + return 0; + +/*{ int f,j=0,i=0,rr,gg,bb; + FILE *o; + RGBA*it = pic; + char*filename="test.ppm"; + printf("Creating %s %dx%d\n",filename, 512,512); + o=fopen(filename, "wb"); + fprintf(o,"P6\n%d %d\n255\n",512, 512); + + while(j<512*512) { + rr=it->r; + gg=it->g; + bb=it->b; + fprintf(o,"%c%c%c",rr,gg,bb); + it++; + j++; + } + fclose(o); +}*/ + + TAG* t = swf_InsertTag(0, ST_VIDEOFRAME); + if((type && (type[0]=='I' || type[0]=='i')) || (type==0 && fi->lastiframe+64 < fi->stream->frame)) { + swf_SetU16(t,0); /* id */ + swf_SetVideoStreamIFrame(t, fi->stream, pic, quant); + fi->lastiframe = fi->stream->frame; + } else { + swf_SetU16(t,0); + swf_SetVideoStreamPFrame(t, fi->stream, pic, quant); + } + itag->tag = t; + tagmap_addMapping(itag->tagmap, 0, self); + free(pic); + return tag; +} +static PyObject* videostream_addDistortionFrame(PyObject*self, PyObject*args, PyObject*kwargs) +{ + tag_internals_t*_itag = tag_getinternals(self); + videostream_internal_t*fi = (videostream_internal_t*)_itag->data; + + static char *kwlist[] = {"image", "quant", NULL}; + int quant=7; + PyObject* array = 0; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", kwlist, &array, &quant)) + return NULL; + + signed char* movex = malloc(fi->stream->bbx * fi->stream->bby * 1); + signed char* movey = malloc(fi->stream->bbx * fi->stream->bby * 1); + RGBA** pics = (RGBA**)malloc(fi->stream->bbx * fi->stream->bby * sizeof(void*)); + signed char* itx=movex; + signed char* ity=movey; + RGBA**pic=pics; + int x,y; + if(!array || !PySequence_Check(array)) + return PY_ERROR("Not an array"); + if(PySequence_Length(array) < fi->stream->bby) + return PY_ERROR("Array (y) has to have at least %d elements, but has only %d ", fi->stream->bby, PySequence_Length(array)); + for(y=0;ystream->bby;y++) { + PyObject*line = PySequence_GetItem(array, y); + if(!line || !PySequence_Check(line)) + return PY_ERROR("Not an array of arrays"); + if(PySequence_Length(line) < fi->stream->bbx) + return PY_ERROR("Inner arrays (x) have to be at least %d long- %dth is only %d", fi->stream->bbx, y, PySequence_Length(line)); + + for(x=0;xstream->bbx;x++) { + PyObject*pixel = PySequence_GetItem(line, x); + PyObject*xy = 0; + PyObject*image = 0; + + if(!pixel) { + xy = image = 0; + } else { + if(PyComplex_Check(pixel)) { + xy = pixel; image = 0; + } else if(PyString_Check(pixel)) { + xy = 0; image = pixel; + } else if(PyTuple_Check(pixel)) { + int size = PyTuple_GET_SIZE(pixel); + if(size!=2) return PY_ERROR("Tuples have to have size 2 (xy,img)"); + xy = PyTuple_GetItem(pixel, 0); + if(!xy) return 0; + if(!PyComplex_Check(xy)) return PY_ERROR("Tuples must be (COMPLEX,string)"); + image = PyTuple_GetItem(pixel, 1); + if(!image) return 0; + if(!PyString_Check(image)) return PY_ERROR("Tuples must be (complex,STRING)"); + } + } + + *itx = *ity = 0; + *pic= 0; + + if(xy) { + *itx = (signed char)PyComplex_RealAsDouble(pixel); + *ity = (signed char)PyComplex_ImagAsDouble(pixel); + } + if(image) { + char*string; + int size; + PyString_AsStringAndSize(image,&string,&size); + if(size<256*3) { + return PY_ERROR("image strings must be >= 256*3"); + } + *pic = malloc(sizeof(RGBA)*16*16); + int t; + for(t=0;t<16*16;t++) { + (*pic)[t].r = string[t*3]; + (*pic)[t].g = string[t*3+1]; + (*pic)[t].b = string[t*3+2]; + (*pic)[t].a = 255; + } + } + itx++; + ity++; + pic++; + } + } + + PyObject*tag = tag_new(&videoframe_tag); + tag_internals_t*itag = tag_getinternals(tag); + + TAG* t = swf_InsertTag(0, ST_VIDEOFRAME); + swf_SetU16(t,0); /* id */ + swf_SetVideoStreamMover(t, fi->stream, movex, movey,(void**)pics, quant); + + itag->tag = t; + tagmap_addMapping(itag->tagmap, 0, self); + + for(x=0;xstream->bbx*fi->stream->bby;x++) { + if(pics[x]) { + free(pics[x]);pics[x] = 0; + } + } + + free(movex); + free(movey); + free(pics); + + return tag; +} +static PyMethodDef videostream_methods[] = +{{"xblocks", videostream_getbwidth, METH_VARARGS, "get's the number of horizontal blocks"}, + {"yblocks", videostream_getbheight, METH_VARARGS, "get's the number of vertical blocks"}, + {"addFrame", (PyCFunction)videostream_addFrame, METH_KEYWORDS, "add a Video Frame"}, + {"addBlackFrame", (PyCFunction)videostream_addBlackFrame, METH_KEYWORDS, "add a black Video Frame"}, + {"addDistortionFrame", (PyCFunction)videostream_addDistortionFrame, METH_KEYWORDS, "add a MVD frame"}, + {NULL, NULL, 0, NULL} +}; + +static tag_internals_t videostream_tag = +{ + parse: videostream_parse, + fillTAG: videostream_fillTAG, + dealloc: videostream_dealloc, + getattr: 0, + setattr: 0, + tagfunctions: videostream_methods, + datasize: sizeof(videostream_internal_t), +}; + +//============================================================================ + +static tag_internals_t videoframe_tag = +{ + parse: 0, + fillTAG: 0, + dealloc: 0, + getattr: 0, + setattr: 0, + tagfunctions: 0, + datasize: 0 +}; + +//============================================================================ +static PyMethodDef TagMethods[] = +{ + /* TAGS */ + {"BackgroundColor", (PyCFunction)f_SetBackgroundColor, METH_KEYWORDS, "Create a SetBackGroundColor Tag."}, + {"Protect", (PyCFunction)f_Protect, METH_KEYWORDS, "Create a Protect Tag."}, + {"Font", (PyCFunction)f_DefineFont, METH_KEYWORDS, "Create a DefineFont Tag."}, + {"Text", (PyCFunction)f_DefineText, METH_KEYWORDS, "Create a DefineText Tag."}, + {"PlaceObject", (PyCFunction)f_PlaceObject, METH_KEYWORDS, "Create a PlaceObject Tag."}, + {"RemoveObject", (PyCFunction)f_RemoveObject, METH_KEYWORDS, "Create a RemoveObject Tag."}, + {"MoveObject", (PyCFunction)f_MoveObject, METH_KEYWORDS, "Create a PlaceObject Move Tag."}, + {"VideoStream", (PyCFunction)f_DefineVideoStream, METH_KEYWORDS, "Create a Videostream."}, + {"Image", (PyCFunction)f_DefineImage, METH_KEYWORDS, "Create an SWF Image Tag."}, + {"ImageShape", (PyCFunction)f_DefineImageShape, METH_KEYWORDS, "Create an SWF Image Shape Tag."}, + {"Shape", (PyCFunction)f_DefineShape, METH_KEYWORDS, "Create an SWF Shape Tag."}, + {"ShowFrame", (PyCFunction)f_ShowFrame, METH_KEYWORDS, "Create an SWF Show Frame Tag."}, + {"Sprite", (PyCFunction)f_Sprite, METH_KEYWORDS, "Create an SWF Sprite Tag."}, + + {NULL, NULL, 0, NULL} +}; +PyMethodDef* tags_getMethods() +{ + TagClass.ob_type = &PyType_Type; + + register_tag(ST_PLACEOBJECT,&placeobject_tag); + register_tag(ST_PLACEOBJECT2,&placeobject_tag); + register_tag(ST_REMOVEOBJECT,&removeobject_tag); + register_tag(ST_REMOVEOBJECT2,&removeobject_tag); + register_tag(ST_SETBACKGROUNDCOLOR,&bgcolor_tag); + register_tag(ST_DEFINEFONT,&font_tag); + register_tag(ST_PROTECT,&protect_tag); + register_tag(ST_DEFINETEXT,&text_tag); + register_tag(ST_DEFINEBITSJPEG,&image_tag); + register_tag(ST_DEFINEBITSJPEG2,&image_tag); + register_tag(ST_DEFINEBITSJPEG3,&image_tag); + register_tag(ST_DEFINEBITSLOSSLESS,&image_tag); + register_tag(ST_DEFINEBITSLOSSLESS2,&image_tag); + register_tag(ST_DEFINESHAPE,&shape_tag); + register_tag(ST_DEFINESHAPE2,&shape_tag); + register_tag(ST_DEFINESHAPE3,&shape_tag); + register_tag(ST_SHOWFRAME,&showframe_tag); + register_tag(ST_DEFINEVIDEOSTREAM,&videostream_tag); + register_tag(ST_VIDEOFRAME,&videoframe_tag); + register_tag(ST_DEFINESPRITE,&sprite_tag); + register_tag(ST_END,&end_tag); + + return TagMethods; +} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tags.h b/fluidbook/tools/swftools-special-swfdump/lib/python/tags.h new file mode 100644 index 000000000..c338d998a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/python/tags.h @@ -0,0 +1,32 @@ +/* tags.h + + Python wrapper for librfxswf- various tag implementations + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __tags_h__ +#define __tags_h__ + +#include +#undef HAVE_STAT +#include "../rfxswf.h" + +PyMethodDef* tags_getMethods(); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/q.c b/fluidbook/tools/swftools-special-swfdump/lib/q.c new file mode 100644 index 000000000..6807b0ee7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/q.c @@ -0,0 +1,1689 @@ +/* q.c + + Part of the swftools package. + + Copyright (c) 2001,2002,2003,2004 Matthias Kramm + + This program is rfx_free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the rfx_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 rfx_free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#include +#include +#include +#include +#include +#include +#include "mem.h" +#include "types.h" +#include "q.h" + +// ------------------------------- malloc, alloc routines --------------------- + +#ifndef STRNDUP +char* strdup_n(const char*str, int size) +{ + char*m = (char*)rfx_alloc(size+1); + memcpy(m, str, size); + m[size] = 0; + return m; +} +#endif +char*qstrdup(const char*string) +{ + return strdup(string); +} +char*qstrndup(const char*string, int len) +{ + return strdup_n(string, len); +} +char* allocprintf(const char*format, ...) +{ + va_list arglist1; + va_start(arglist1, format); + char dummy; + int l = vsnprintf(&dummy, 1, format, arglist1); + va_end(arglist1); + + va_list arglist2; + va_start(arglist2, format); + char*buf = malloc(l+1); + vsnprintf(buf, l+1, format, arglist2); + va_end(arglist2); + return buf; +} + +// ------------------------------- mem_t -------------------------------------- + +void mem_init(mem_t*mem) +{ + memset(mem, 0, sizeof(mem_t)); +} +void mem_clear(mem_t*mem) +{ + rfx_free(mem->buffer);mem->buffer = 0; +} +void mem_destroy(mem_t*mem) +{ + mem_clear(mem); + rfx_free(mem); +} +static int mem_put_(mem_t*m,const void*data, int length, int null) +{ + int n = m->pos; + m->pos += length + (null?1:0); + if(m->pos > m->len) { + int v1 = (m->pos+63)&~63; + int v2 = m->len + m->len / 2; + m->len = v1>v2?v1:v2; + m->buffer = m->buffer?(char*)rfx_realloc(m->buffer,m->len):(char*)rfx_alloc(m->len); + } + assert(n+length <= m->len); + memcpy(&m->buffer[n], data, length); + if(null) + m->buffer[n + length] = 0; + return n; +} +int mem_put(mem_t*m,void*data, int length) +{ + return mem_put_(m, data, length, 0); +} +int mem_putstring(mem_t*m,string_t str) +{ + return mem_put_(m, str.str, str.len, 1); +} +int mem_get(mem_t*m, void*data, int length) +{ + if(m->read_pos + length > m->pos) { + length = m->pos - m->read_pos; + } + memcpy(data, m->buffer+m->read_pos, length); + m->read_pos += length; + return length; +} + +// ------------------------------- median ------------------------------------- + +float medianf(float*a, int n) +{ + int i,j,l,m; + float x; + int k=n&1?n/2:n/2-1; + l=0; + m=n-1; + while(linternal = i; + i->buffer = (unsigned char*)rfx_alloc(1024); + i->buffersize = 1024; +} +int ringbuffer_read(ringbuffer_t*r, void*buf, int len) +{ + unsigned char* data = (unsigned char*)buf; + ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; + if(r->available < len) + len = r->available; + if(!len) + return 0; + if(i->readpos + len > i->buffersize) { + int read1 = i->buffersize-i->readpos; + memcpy(data, &i->buffer[i->readpos], read1); + memcpy(&data[read1], &i->buffer[0], len - read1); + i->readpos = len - read1; + } else { + memcpy(data, &i->buffer[i->readpos], len); + i->readpos += len; + i->readpos %= i->buffersize; + } + r->available -= len; + return len; +} +void ringbuffer_put(ringbuffer_t*r, void*buf, int len) +{ + unsigned char* data = (unsigned char*)buf; + ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; + + if(i->buffersize - r->available < len) + { + unsigned char* buf2; + int newbuffersize = i->buffersize; + int oldavailable = r->available; + newbuffersize*=3;newbuffersize/=2; /*grow at least by 50% each time */ + + if(newbuffersize < r->available + len) + newbuffersize = r->available + len + 1024; + + buf2 = (unsigned char*)rfx_alloc(newbuffersize); + ringbuffer_read(r, buf2, r->available); + rfx_free(i->buffer); + i->buffer = buf2; + i->buffersize = newbuffersize; + i->readpos = 0; + i->writepos = oldavailable; + r->available = oldavailable; + } + if(i->writepos + len > i->buffersize) { + int read1 = i->buffersize-i->writepos; + memcpy(&i->buffer[i->writepos], data, read1); + memcpy(&i->buffer[0], &data[read1], len - read1); + i->writepos = len - read1; + } else { + memcpy(&i->buffer[i->writepos], data, len); + i->writepos += len; + i->writepos %= i->buffersize; + } + r->available += len; +} +void ringbuffer_clear(ringbuffer_t*r) +{ + ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; + rfx_free(i->buffer);i->buffer = 0; + rfx_free(i); +} + +// ------------------------------- heap_t ------------------------------- + +void heap_init(heap_t*h,int elem_size, int(*compare)(const void *, const void *)) +{ + memset(h, 0, sizeof(heap_t)); + h->size = 0; + h->elem_size = elem_size; + h->compare = compare; + h->elements = 0; + h->max_size = 0; +} +heap_t* heap_new(int elem_size, int(*compare)(const void *, const void *)) +{ + heap_t*h = malloc(sizeof(heap_t)); + heap_init(h, elem_size, compare); + return h; +} +heap_t* heap_clone(heap_t*o) +{ + heap_t*h = malloc(sizeof(heap_t)); + memcpy(h, o, sizeof(heap_t)); + h->elements = rfx_alloc(sizeof(void*)*h->size); + int t; + for(t=0;tsize;t++) { + h->elements[t] = rfx_alloc(h->elem_size); + memcpy(h->elements[t], o->elements[t], h->elem_size); + } + return h; +} +void heap_clear(heap_t*h) +{ + int t; + for(t=0;tsize;t++) { + rfx_free(h->elements[t]); + h->elements[t]=0; + } + rfx_free(h->elements); +} +void heap_destroy(heap_t*h) +{ + heap_clear(h); + free(h); +} + +#define HEAP_NODE_LARGER(h,node1,node2) ((h)->compare((node1),(node2))>0) +#define HEAP_NODE_SMALLER(h,node1,node2) ((h)->compare((node1),(node2))<0) + +static void up(heap_t*h, int node) +{ + void*node_p = h->elements[node]; + int parent = node; + int tmp = node; + do { + node = parent; + if(!node) break; + parent = (node-1)/2; + h->elements[node] = h->elements[parent]; + } while(HEAP_NODE_SMALLER(h, h->elements[parent], node_p)); + h->elements[node] = node_p; +} +static void down(heap_t*h, int node) +{ + void*node_p = h->elements[node]; + int child = node; + do { + node = child; + + /* determine new child's position */ + child = node<<1|1; + if(child >= h->size) + break; + if(child+1 < h->size && HEAP_NODE_SMALLER(h,h->elements[child],h->elements[child+1])) // search for bigger child + child++; + + h->elements[node] = h->elements[child]; + } while(HEAP_NODE_SMALLER(h,node_p, h->elements[child])); + + h->elements[node] = node_p; +} +void heap_put(heap_t*h, void*e) +{ + int pos = h->size++; + void*data = rfx_alloc(h->elem_size); + memcpy(data,e,h->elem_size); + + if(pos>=h->max_size) { + h->max_size = h->max_size<15?15:(h->max_size+1)*2-1; + h->elements = (void**)rfx_realloc(h->elements, h->max_size*sizeof(void*)); + assert(posmax_size); + } + + h->elements[pos] = data; + up(h, pos); +} +int heap_size(heap_t*h) +{ + return h->size; +} +void* heap_peek(heap_t*h) +{ + if(!h || !h->size) + return 0; + return h->elements[0]; +} +void* heap_chopmax(heap_t*h) +{ + if(!h->size) + return 0; + void*p = h->elements[0]; + h->elements[0] = h->elements[--h->size]; + down(h,0); + return p; +} +void heap_dump(heap_t*h, FILE*fi) +{ + int t; + for(t=0;tsize;t++) { + int s; + for(s=0;s<=t;s=(s+1)*2-1) { + if(s==t) fprintf(fi,"\n"); + } + //fprintf(fi,"%d ", h->elements[t]->x); //? + } +} +void** heap_flatten(heap_t*h) +{ + void**nodes = (void**)rfx_alloc((h->size+1)*sizeof(void*)); + void**p = nodes; + + while(h->size) { + /*printf("Heap Size: %d\n", h->size); + heap_print(stdout, h); + printf("\n");*/ + *p++ = heap_chopmax(h); + } + *p++ = 0; + return nodes; +} + +// ------------------------------- trie -------------------------------------- + +trie_t*trie_new() +{ + return (trie_t*)rfx_calloc(sizeof(trie_t)); +} +static char _trie_put(trielayer_t**t, unsigned const char*id, void*data) +{ + if(!*t) { + (*t) = rfx_calloc(sizeof(trielayer_t)); + (*t)->rest = (unsigned char*)strdup((char*)id); + (*t)->data = data; + return 0; + } + if((*t)->rest && (*t)->rest[0]) { + // make room: shift whatever's currently in here one node down + _trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1, (*t)->data); + (*t)->rest = 0; + } + if(id[0]) { + return _trie_put(&(*t)->row[id[0]], id+1, data); + } else { + char overwrite = 0; + if((*t)->rest) + overwrite = 1; + (*t)->rest = (unsigned char*)strdup(""); + (*t)->data = data; + return overwrite; + } +} +static char _trie_remove(trielayer_t*t, unsigned const char*id) +{ + while(t) { + if(t->rest && !strcmp((char*)t->rest, (char*)id)) { + free(t->rest); + t->rest = 0; + return 1; + } + if(!*id) + return 0; + t = t->row[*id++]; + } + return 0; +} + +static void trie_rollback_removes(trie_t*t, unsigned const char*id, void*data); +static void trie_rollback_adds(trie_t*t, unsigned const char*id, void*data); + +void trie_put(trie_t*t, unsigned const char*id, void*data) +{ + if(!t->rollback) { + _trie_put(&t->start, id, data); + } else { + char contains = trie_contains(t, id); + void*olddata = contains?trie_lookup(t, id):0; + _trie_put(&t->start, id, data); + if(contains) { + trie_rollback_adds(t, id, olddata); + } + trie_rollback_removes(t, id, data); + } +} +char trie_remove(trie_t*t, unsigned const char*id) +{ + if(!t->rollback) { + return _trie_remove(t->start, id); + } else { + void*olddata = trie_lookup(t, id); + char exists = _trie_remove(t->start, id); + if(exists) { + trie_rollback_adds(t, id, olddata); + } + return exists; + } +} +int trie_contains(trie_t*trie, unsigned const char*id) +{ + trielayer_t*t = trie->start; + while(t) { + if(t->rest && !strcmp((char*)t->rest, (char*)id)) + return 1; + if(!*id) + return 0; + t = t->row[*id++]; + } + return 0; +} +void* trie_lookup(trie_t*trie, unsigned const char*id) +{ + trielayer_t*t = trie->start; + while(t) { + if(t->rest && !strcmp((char*)t->rest, (char*)id)) + return t->data; + if(!*id) + return 0; + t = t->row[*id++]; + } + return 0; +} + +typedef struct _triememory { + const unsigned char*key; + void*data; + char del; // 0/1 + struct _triememory*next; +} triememory_t; + +typedef struct _trierollback { + triememory_t*ops; + struct _trierollback*prev; +} trierollback_t; + +static void trie_rollback_adds(trie_t*t, unsigned const char*id, void*data) +{ + trierollback_t*rollback = (trierollback_t*)t->rollback; + triememory_t*m = (triememory_t*)rfx_calloc(sizeof(triememory_t)); + m->key = id; + m->data = data; + m->del = 0; + m->next = rollback->ops; + rollback->ops = m; +} +static void trie_rollback_removes(trie_t*t, unsigned const char*id, void*data) +{ + trierollback_t*rollback = (trierollback_t*)t->rollback; + triememory_t*m = (triememory_t*)rfx_calloc(sizeof(triememory_t)); + m->key = id; + m->data = data; + m->del = 1; + m->next = rollback->ops; + rollback->ops = m; +} + +void _trie_dump(trielayer_t*t, char*buffer, int pos) +{ + int i; + for(i=0;i<256;i++) { + if(t->row[i]) { + buffer[pos]=i; + _trie_dump(t->row[i], buffer, pos+1); + } + } + if(t->rest) { + buffer[pos]=0; + printf("%s%s %08x\n", buffer, t->rest, (int)t->data); + } +} + +void trie_dump(trie_t*t) +{ + char buffer[256]; + _trie_dump(t->start, buffer, 0); +} + + +void trie_remember(trie_t*t) +{ + trierollback_t*old = (trierollback_t*)t->rollback; + t->rollback = (trierollback_t*)rfx_calloc(sizeof(trierollback_t)); + ((trierollback_t*)t->rollback)->prev = old; +} + +void trie_rollback(trie_t*t) +{ + trierollback_t*rollback = (trierollback_t*)t->rollback; + if(!rollback) { + fprintf(stderr, "Internal error: can't roll back this trie any further\n"); + return; + } + t->rollback = ((trierollback_t*)t->rollback)->prev; + + triememory_t*op = rollback->ops; + while(op) { + triememory_t*next = op->next; + if(op->del) { + if(!_trie_remove(t->start, op->key)) { + fprintf(stderr, "Internal error: can't delete key %s in trie during rollback\n", op->key); + } + } else { + if(_trie_put(&t->start, op->key, op->data)) { + fprintf(stderr, "Internal error: overwrote key %s in trie during rollback\n", op->key); + } + } + free(op); + op = next; + } +} + + +// ------------------------------- crc32 -------------------------------------- +static unsigned int crc32[256]; +static char crc32_initialized=0; +static void crc32_init(void) +{ + int t; + if(crc32_initialized) + return; + crc32_initialized = 1; + for(t=0; t<256; t++) { + unsigned int c = t; + int s; + for (s = 0; s < 8; s++) { + c = (0xedb88320L*(c&1)) ^ (c >> 1); + } + crc32[t] = c; + } +} +static uint64_t crc64[256]; +static char crc64_initialized=0; +static void crc64_init(void) +{ + int t; + if(crc64_initialized) + return; + crc64_initialized = 1; + for(t=0; t<256; t++) { + unsigned int c = t; + int s; + for (s = 0; s < 8; s++) { + c = ((c&1)?0xC96C5795D7870F42ll:0) ^ (c >> 1); + } + crc64[t] = c; + } +} +// ------------------------------- string_t ----------------------------------- + +void string_set2(string_t*str, const char*text, int len) +{ + str->len = len; + str->str = text; +} +void string_set(string_t*str, const char*text) +{ + if(text) { + str->len = strlen(text); + } else { + str->len = 0; + } + str->str = text; +} +string_t string_new(const char*text, int len) +{ + string_t s; + s.len = len; + s.str = text; + return s; +} +string_t string_new2(const char*text) +{ + string_t s; + if(text) { + s.len = strlen(text); + } else { + s.len = 0; + } + s.str = text; + return s; +} +string_t* string_new3(const char*text, int len) +{ + if(!text) { + string_t*s = malloc(sizeof(string_t)); + s->len = 0; + s->str = 0; + return s; + } else { + string_t*s = malloc(sizeof(string_t)+len+1); + s->len = len; + s->str = (const char*)(s+1); + memcpy((char*)s->str, text, len); + ((char*)s->str)[len]=0; + return s; + } +} +string_t* string_new4(const char*text) +{ + int l = strlen(text); + return string_new3(text, l); +} + +void string_free(string_t*s) +{ + if(!s) + return; + s->len = 0; + if((string_t*)(s->str) == s+1) { + s->str = 0; + rfx_free(s); + } else { + rfx_free((char*)(s->str)); + s->str = 0; + rfx_free(s); + } +} +char* string_cstr(string_t*str) +{ + return strdup_n(str->str, str->len); +} +char* string_escape(string_t*str) +{ + int t; + int len = 0; + for(t=0;tlen;t++) { + if(str->str[t]<0x20) + len+=3; + else + len++; + } + char*s = malloc(len+1); + char*p=s; + for(t=0;tlen;t++) { + if(str->str[t]<0x20) { + *p++ ='\\'; + unsigned char c = str->str[t]; + *p++ = "0123456789abcdef"[c>>4]; + *p++ = "0123456789abcdef"[c&0x0f]; + } else { + *p++ = str->str[t]; + } + } + *p++ = 0; + assert(p == &s[len+1]); + return s; +} + +unsigned int crc32_add_byte(unsigned int checksum, unsigned char b) +{ + crc32_init(); + return checksum>>8 ^ crc32[(b^checksum)&0xff]; +} +unsigned int crc32_add_string(unsigned int checksum, const char*s) +{ + crc32_init(); + if(!s) + return checksum; + while(*s) { + checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff]; + s++; + } + return checksum; +} +unsigned int crc32_add_bytes(unsigned int checksum, const void*_s, int len) +{ + unsigned char*s = (unsigned char*)_s; + crc32_init(); + if(!s || !len) + return checksum; + do { + checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff]; + s++; + } while(--len); + return checksum; +} + +unsigned int string_hash(const string_t*str) +{ + int t; + unsigned int checksum = 0; + crc32_init(); + for(t=0;tlen;t++) { + checksum = checksum>>8 ^ crc32[(str->str[t]^checksum)&0xff]; + } + return checksum; +} +unsigned int string_hash2(const char*str) +{ + unsigned int checksum = 0; + const char*p = str; + crc32_init(); + while(*p) { + checksum = checksum>>8 ^ crc32[(*p^checksum)&0xff]; + p++; + } + return checksum; +} +uint64_t string_hash64(const char*str) +{ + uint64_t checksum = 0; + const char*p = str; + crc64_init(); + while(*p) { + checksum = checksum>>8 ^ crc64[(*p^checksum)&0xff]; + p++; + } + return checksum; +} +unsigned int string_hash3(const char*str, int len) +{ + string_t s; + s.str = str; + s.len = len; + return string_hash(&s); +} +void string_dup2(string_t*str, const char*text, int len) +{ + str->len = len; + str->str = strdup_n(text, len); +} +void string_dup(string_t*str, const char*text) +{ + str->len = strlen(text); + str->str = strdup(text); +} +int string_equals(string_t*str, const char*text) +{ + int l = strlen(text); + if(str->len == l && !memcmp(str->str, text, l)) + return 1; + return 0; +} +int string_equals2(string_t*str, string_t*str2) +{ + if(str->len == str2->len && !memcmp(str->str, str2->str, str->len)) + return 1; + return 0; +} + +char* concat2(const char* t1, const char* t2) +{ + int l1 = strlen(t1); + int l2 = strlen(t2); + char*text = malloc(l1+l2+1); + memcpy(text , t1, l1); + memcpy(text+l1, t2, l2); + text[l1+l2] = 0; + return text; +} + +char* concat3(const char* t1, const char* t2, const char* t3) +{ + int l1 = strlen(t1); + int l2 = strlen(t2); + int l3 = strlen(t3); + char*text = malloc(l1+l2+l3+1); + memcpy(text , t1, l1); + memcpy(text+l1, t2, l2); + memcpy(text+l1+l2, t3, l3); + text[l1+l2+l3] = 0; + return text; +} + +// ------------------------------- stringarray_t ------------------------------ + +typedef struct _stringlist { + int index; + struct _stringlist*next; +} stringlist_t; + +typedef struct _stringarray_internal_t +{ + mem_t pos; + stringlist_t**hash; + int num; + int hashsize; +} stringarray_internal_t; + +void stringarray_init(stringarray_t*sa, int hashsize) +{ + stringarray_internal_t*s; + int t; + sa->internal = (stringarray_internal_t*)rfx_calloc(sizeof(stringarray_internal_t)); + s = (stringarray_internal_t*)sa->internal; + mem_init(&s->pos); + s->hash = rfx_calloc(sizeof(stringlist_t*)*hashsize); + s->hashsize = hashsize; +} +void stringarray_put(stringarray_t*sa, string_t str) +{ + stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; + int pos; + int hash = string_hash(&str) % s->hashsize; + + char*ss = string_cstr(&str); + mem_put(&s->pos, &ss, sizeof(char*)); + + stringlist_t*l = rfx_alloc(sizeof(stringlist_t)); + l->index = s->num; + l->next = s->hash[hash]; + s->hash[hash] = l; + + s->num++; +} +char* stringarray_at(stringarray_t*sa, int pos) +{ + stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; + char*p; + if(pos<0 || pos>=s->num) + return 0; + p = *(char**)&s->pos.buffer[pos*sizeof(char*)]; + if(p<0) + return 0; + return p; +} +string_t stringarray_at2(stringarray_t*sa, int pos) +{ + string_t s; + s.str = stringarray_at(sa, pos); + s.len = s.str?strlen(s.str):0; + return s; +} +static stringlist_t* stringlist_del(stringarray_t*sa, stringlist_t*l, int index) +{ + stringlist_t*ll = l; + stringlist_t*old = l; + while(l) { + if(index==l->index) { + old->next = l->next; + memset(l, 0, sizeof(stringlist_t)); + rfx_free(l); + if(old==l) + return 0; + else + return ll; + } + old = l; + l = l->next; + } + fprintf(stderr, "Internal error: did not find string %d in hash\n", index); + return ll; +} + +void stringarray_del(stringarray_t*sa, int pos) +{ + stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; + string_t str = stringarray_at2(sa, pos); + int hash = string_hash(&str) % s->hashsize; + s->hash[hash] = stringlist_del(sa, s->hash[hash], pos); + *(char**)&s->pos.buffer[pos*sizeof(char*)] = 0; +} +int stringarray_find(stringarray_t*sa, string_t* str) +{ + stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; + int hash = string_hash(str) % s->hashsize; + int t; + stringlist_t*l = s->hash[hash]; + //TODO: statistics + while(l) { + string_t s = stringarray_at2(sa, l->index); + if(string_equals2(str, &s)) { + return l->index; + } + l = l->next; + } + return -1; +} +void stringarray_clear(stringarray_t*sa) +{ + stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; + mem_clear(&s->pos); + int t; + for(t=0;thashsize;t++) { + stringlist_t*l = s->hash[t]; + while(l) { + stringlist_t*next = l->next; + memset(l, 0, sizeof(stringlist_t)); + rfx_free(l); + l = next; + } + } + rfx_free(s->hash);s->hash=0; + rfx_free(s); +} +void stringarray_destroy(stringarray_t*sa) +{ + stringarray_clear(sa); + rfx_free(sa); +} + +// ------------------------------- type_t ------------------------------- + +char ptr_equals(const void*o1, const void*o2) +{ + return o1==o2; +} +unsigned int ptr_hash(const void*o) +{ + return string_hash3((const char*)&o, sizeof(o)); +} +void* ptr_dup(const void*o) +{ + return (void*)o; +} +void ptr_free(void*o) +{ + return; +} + +char int_equals(const void*o1, const void*o2) +{ + return o1==o2; +} +unsigned int int_hash(const void*o) +{ + return string_hash3((const char*)&o, sizeof(o)); +} +void* int_dup(const void*o) +{ + return (void*)o; +} +void int_free(void*o) +{ + return; +} + +char charptr_equals(const void*o1, const void*o2) +{ + if(!o1 || !o2) + return o1==o2; + return !strcmp(o1,o2); +} +unsigned int charptr_hash(const void*o) +{ + if(!o) + return 0; + return string_hash2(o); +} +void* charptr_dup(const void*o) +{ + if(!o) + return 0; + return strdup(o); +} +void charptr_free(void*o) +{ + if(o) { + rfx_free(o); + } +} + +char stringstruct_equals(const void*o1, const void*o2) +{ + if(!o1 || !o2) + return o1==o2; + string_t*s1 = (string_t*)o1; + string_t*s2 = (string_t*)o2; + int l = s1->lenlen?s1->len:s2->len; + int r = memcmp(s1->str, s2->str, l); + if(r) + return 0; + else + return s1->len==s2->len; +} +unsigned int stringstruct_hash(const void*o) +{ + if(!o) return 0; + return string_hash(o); +} +string_t*string_dup3(string_t*o) +{ + if(!o) return 0; + if(!o->str) { + string_t*s = malloc(sizeof(string_t)); + s->str=0; + s->len=0; + return s; + } + string_t*s = rfx_alloc(sizeof(string_t)+o->len+1); + s->len = o->len; + s->str = (const char*)(s+1); + memcpy((char*)s->str, o->str, s->len); + ((char*)s->str)[s->len]=0; + return s; +} +void stringstruct_free(void*o) +{ + if(o) + string_free(o); +} + +type_t int_type = { + equals: int_equals, + hash: int_hash, + dup: int_dup, + free: int_free, +}; + +type_t ptr_type = { + equals: ptr_equals, + hash: ptr_hash, + dup: ptr_dup, + free: ptr_free, +}; + +type_t charptr_type = { + equals: charptr_equals, + hash: charptr_hash, + dup: charptr_dup, + free: charptr_free, +}; + +type_t stringstruct_type = { + equals: stringstruct_equals, + hash: stringstruct_hash, + dup: (dup_func)string_dup3, + free: stringstruct_free, +}; + +// ------------------------------- dictionary_t ------------------------------- + +#define INITIAL_SIZE 1 + +static int max(int x, int y) { + return x>y?x:y; +} + +dict_t*dict_new() +{ + dict_t*d = rfx_alloc(sizeof(dict_t)); + dict_init(d, INITIAL_SIZE); + return d; +} +dict_t*dict_new2(type_t*t) +{ + dict_t*d = rfx_alloc(sizeof(dict_t)); + dict_init(d, INITIAL_SIZE); + d->key_type = t; + return d; +} +void dict_init(dict_t*h, int size) +{ + memset(h, 0, sizeof(dict_t)); + h->hashsize = size; + h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; + h->num = 0; + h->key_type = &charptr_type; +} +void dict_init2(dict_t*h, type_t*t, int size) +{ + memset(h, 0, sizeof(dict_t)); + h->hashsize = size; + h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; + h->num = 0; + h->key_type = t; +} + +dict_t*dict_clone(dict_t*o) +{ + dict_t*h = rfx_alloc(sizeof(dict_t)); + memcpy(h, o, sizeof(dict_t)); + h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = o->slots[t]; + while(e) { + dictentry_t*n = (dictentry_t*)rfx_alloc(sizeof(dictentry_t)); + memcpy(n, e, sizeof(dictentry_t)); + n->key = h->key_type->dup(e->key); + n->data = e->data; + n->next = h->slots[t]; + h->slots[t] = n; + e = e->next; + } + } + return h; +} + +static void dict_expand(dict_t*h, int newlen) +{ + assert(h->hashsize < newlen); + dictentry_t**newslots = (dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*newlen); + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = h->slots[t]; + while(e) { + dictentry_t*next = e->next; + unsigned int newhash = e->hash%newlen; + e->next = newslots[newhash]; + newslots[newhash] = e; + e = next; + } + } + if(h->slots) + rfx_free(h->slots); + h->slots = newslots; + h->hashsize = newlen; +} + +dictentry_t* dict_put(dict_t*h, const void*key, void* data) +{ + unsigned int hash = h->key_type->hash(key); + dictentry_t*e = (dictentry_t*)rfx_alloc(sizeof(dictentry_t)); + + if(!h->hashsize) + dict_expand(h, 1); + + unsigned int hash2 = hash % h->hashsize; + + e->key = h->key_type->dup(key); + e->hash = hash; //for resizing + e->next = h->slots[hash2]; + e->data = data; + h->slots[hash2] = e; + h->num++; + return e; +} +void dict_put2(dict_t*h, const char*s, void*data) +{ + assert(h->key_type == &charptr_type); + dict_put(h, s, data); +} +void dict_dump(dict_t*h, FILE*fi, const char*prefix) +{ + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = h->slots[t]; + while(e) { + if(h->key_type!=&charptr_type) { + fprintf(fi, "%s%08x=%08x\n", prefix, (int)e->key, (int)e->data); + } else { + fprintf(fi, "%s%s=%08x\n", prefix, (char*)e->key, (int)e->data); + } + e = e->next; + } + } +} + +int dict_count(dict_t*h) +{ + return h->num; +} + +static inline dictentry_t* dict_do_lookup(dict_t*h, const void*key) +{ + if(!h->num) { + return 0; + } + + unsigned int ohash = h->key_type->hash(key); + unsigned int hash = ohash % h->hashsize; + + /* check first entry for match */ + dictentry_t*e = h->slots[hash]; + if(e && h->key_type->equals(e->key, key)) { + return e; + } else if(e) { + e = e->next; + } + + /* if dict is 2/3 filled, double the size. Do + this the first time we have to actually iterate + through a slot to find our data */ + if(e && h->num*3 >= h->hashsize*2) { + int newsize = h->hashsize; + while(h->num*3 >= newsize*2) { + newsize = newsize<15?15:(newsize+1)*2-1; + } + dict_expand(h, newsize); + hash = ohash % h->hashsize; + e = h->slots[hash]; + if(e && h->key_type->equals(e->key, key)) { + // omit move to front + return e; + } else if(e) { + e = e->next; + } + } + + /* check subsequent entries for a match */ + dictentry_t*last = h->slots[hash]; + while(e) { + if(h->key_type->equals(e->key, key)) { + /* move to front- makes a difference of about 10% in most applications */ + last->next = e->next; + e->next = h->slots[hash]; + h->slots[hash] = e; + return e; + } + last=e; + e = e->next; + } + return 0; +} +void* dict_lookup(dict_t*h, const void*key) +{ + dictentry_t*e = dict_do_lookup(h, key); + if(e) + return e->data; + return 0; +} +char dict_contains(dict_t*h, const void*key) +{ + dictentry_t*e = dict_do_lookup(h, key); + return !!e; +} + +char dict_del(dict_t*h, const void*key) +{ + if(!h->num) + return 0; + unsigned int hash = h->key_type->hash(key) % h->hashsize; + dictentry_t*head = h->slots[hash]; + dictentry_t*e = head, *prev=0; + while(e) { + if(h->key_type->equals(e->key, key)) { + dictentry_t*next = e->next; + h->key_type->free(e->key); + memset(e, 0, sizeof(dictentry_t)); + rfx_free(e); + if(e == head) { + h->slots[hash] = next; + } else { + assert(prev); + prev->next = next; + } + h->num--; + return 1; + } + prev = e; + e = e->next; + } + return 0; +} + +char dict_del2(dict_t*h, const void*key, void*data) +{ + if(!h->num) + return 0; + unsigned int hash = h->key_type->hash(key) % h->hashsize; + dictentry_t*head = h->slots[hash]; + dictentry_t*e = head, *prev=0; + while(e) { + if(h->key_type->equals(e->key, key) && e->data == data) { + dictentry_t*next = e->next; + h->key_type->free(e->key); + memset(e, 0, sizeof(dictentry_t)); + rfx_free(e); + if(e == head) { + h->slots[hash] = next; + } else { + assert(prev); + prev->next = next; + } + h->num--; + return 1; + } + prev = e; + e = e->next; + } + return 0; +} + +dictentry_t* dict_get_slot(dict_t*h, const void*key) +{ + if(!h->num) + return 0; + unsigned int ohash = h->key_type->hash(key); + unsigned int hash = ohash % h->hashsize; + return h->slots[hash]; +} + +void dict_foreach_keyvalue(dict_t*h, void (*runFunction)(void*data, const void*key, void*val), void*data) +{ + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = h->slots[t]; + while(e) { + dictentry_t*next = e->next; + if(runFunction) { + runFunction(data, e->key, e->data); + } + e = e->next; + } + } +} +void dict_foreach_value(dict_t*h, void (*runFunction)(void*)) +{ + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = h->slots[t]; + while(e) { + dictentry_t*next = e->next; + if(runFunction) { + runFunction(e->data); + } + e = e->next; + } + } +} + +void dict_free_all(dict_t*h, char free_keys, void (*free_data_function)(void*)) +{ + int t; + for(t=0;thashsize;t++) { + dictentry_t*e = h->slots[t]; + while(e) { + dictentry_t*next = e->next; + if(free_keys) { + h->key_type->free(e->key); + } + if(free_data_function) { + free_data_function(e->data); + } + memset(e, 0, sizeof(dictentry_t)); + rfx_free(e); + e = next; + } + h->slots[t]=0; + } + rfx_free(h->slots); + memset(h, 0, sizeof(dict_t)); +} + +void dict_clear_shallow(dict_t*h) +{ + dict_free_all(h, 0, 0); +} + +void dict_clear(dict_t*h) +{ + dict_free_all(h, 1, 0); +} + +void dict_destroy_shallow(dict_t*dict) +{ + dict_clear_shallow(dict); + rfx_free(dict); +} + +void dict_destroy(dict_t*dict) +{ + if(!dict) + return; + dict_clear(dict); + rfx_free(dict); +} + +// ------------------------------- mtf_t -------------------------------------- +mtf_t* mtf_new(type_t*type) +{ + NEW(mtf_t, mtf); + mtf->type = type; + return mtf; +} +void mtf_increase(mtf_t*m, const void*key) +{ + mtf_item_t*item = m->first; + mtf_item_t*last = 0; + while(item) { + if(m->type->equals(item->key, key)) { + item->num++; + if(item->num>m->first->num) { + if(last) last->next = item->next; + else m->first = item->next; + item->next = m->first; + m->first = item; + } + return; + } + last = item; + item = item->next; + } + NEW(mtf_item_t,n); + if(last) last->next = n; + else m->first = n; + n->key = key; + n->num = 1; +} +void mtf_destroy(mtf_t*m) +{ + if(!m) return; + mtf_item_t*item = m->first; + m->first = 0; + while(item) { + mtf_item_t*next = item->next; + item->next = 0; + free(item); + item = next; + } + free(m); +} + +// ------------------------------- map_t -------------------------------------- + +typedef struct _map_internal_t +{ + dict_t d; +} map_internal_t; + +void map_init(map_t*map) +{ + map_internal_t*m; + map->internal = (map_internal_t*)rfx_calloc(sizeof(map_internal_t)); + m = (map_internal_t*)map->internal; + dict_init(&m->d, INITIAL_SIZE); +} +void map_put(map_t*map, string_t t1, string_t t2) +{ + map_internal_t*m = (map_internal_t*)map->internal; + string_t s; + char* s1 = string_cstr(&t1); + dict_put2(&m->d, s1, (void*)string_cstr(&t2)); + rfx_free(s1); +} +const char* map_lookup(map_t*map, const char*name) +{ + map_internal_t*m = (map_internal_t*)map->internal; + const char*value = dict_lookup(&m->d, name); + return value; +} +static void freestring(void*data) +{ + rfx_free(data); +} +static void dumpmapentry(void*data, const void*key, void*value) +{ + FILE*fi = (FILE*)data; + fprintf(fi, "%s=%s\n", (char*)key, (char*)value); +} +void map_dump(map_t*map, FILE*fi, const char*prefix) +{ + int t; + map_internal_t*m = (map_internal_t*)map->internal; + dict_foreach_keyvalue(&m->d, dumpmapentry, fi); +} +void map_clear(map_t*map) +{ + map_internal_t*m = (map_internal_t*)map->internal; + dict_free_all(&m->d, 1, freestring); + rfx_free(m); +} +void map_destroy(map_t*map) +{ + map_clear(map); + rfx_free(map); +} + +// ------------------------------- array_t -------------------------------------- + +array_t* array_new() { + array_t*d = malloc(sizeof(array_t)); + memset(d, 0, sizeof(array_t)); + d->entry2pos = dict_new(); + return d; +} +array_t* array_new2(type_t*type) { + array_t*d = malloc(sizeof(array_t)); + memset(d, 0, sizeof(array_t)); + d->entry2pos = dict_new2(type); + return d; +} +void*array_getkey(array_t*array, int nr) { + if(nr >= array->num || nr<0) { + fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num); + return 0; + } + return array->d[nr].name; +} +void*array_getvalue(array_t*array, int nr) { + if(nr >= array->num || nr<0) { + fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num); + return 0; + } + return array->d[nr].data; +} +int array_append(array_t*array, const void*name, void*data) { + while(array->size <= array->num) { + array->size += 64; + if(!array->d) { + array->d = malloc(sizeof(array_entry_t)*array->size); + } else { + array->d = realloc(array->d, sizeof(array_entry_t)*array->size); + } + } + + dictentry_t*e = dict_put(array->entry2pos, name, (void*)(ptroff_t)(array->num+1)); + + if(name) { + array->d[array->num].name = e->key; + } else { + array->d[array->num].name = 0; + } + array->d[array->num].data = (void*)data; + return array->num++; +} +int array_find(array_t*array, const void*name) +{ + int pos = (int)(ptroff_t)dict_lookup(array->entry2pos, name); + return pos-1; +} +int array_find2(array_t*array, const void*name, void*data) +{ + dict_t*h= array->entry2pos; + dictentry_t*e = dict_get_slot(array->entry2pos, name); + + while(e) { + int index = ((int)(ptroff_t)e->data) - 1; + if(h->key_type->equals(e->key, name) && array->d[index].data == data) { + return index; + } + e = e->next; + } + return -1; +} +int array_update(array_t*array, const void*name, void*data) { + int pos = array_find(array, name); + if(pos>=0) { + array->d[pos].data = data; + return pos; + } + return array_append(array, name, data); +} +int array_append_if_new(array_t*array, const void*name, void*data) { + int pos = array_find(array, name); + if(pos>=0) + return pos; + return array_append(array, name, data); +} +void array_free(array_t*array) { + dict_destroy(array->entry2pos); + if(array->d) { + free(array->d);array->d = 0; + } + free(array); +} + +// ------------------------------- list_t -------------------------------------- + +struct _commonlist; +typedef struct _listinfo { + int size; + struct _commonlist*last; +} listinfo_t; + +typedef struct _commonlist { + void*entry; + struct _commonlist*next; + listinfo_t info[0]; +} commonlist_t; + +int list_length_(void*_list) +{ + commonlist_t*l = (commonlist_t*)_list; + if(!l) + return 0; + return l->info[0].size; +} +void list_concat_(void*_l1, void*_l2) +{ + commonlist_t**l1 = (commonlist_t**)_l1; + commonlist_t**l2 = (commonlist_t**)_l2; + + if(!*l1) { + *l1 = *l2; + } else if(*l2) { + (*l1)->info[0].last->next = *l2; + (*l1)->info[0].last = (*l2)->info[0].last; + (*l1)->info[0].size += (*l2)->info[0].size; + } + *l2 = 0; +} +void list_append_(void*_list, void*entry) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t* n = 0; + if(!*list) { + n = (commonlist_t*)malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); + *list = n; + (*list)->info[0].size = 0; + } else { + n = malloc(sizeof(commonlist_t)); + (*list)->info[0].last->next = n; + } + n->next = 0; + n->entry = entry; + (*list)->info[0].last = n; + (*list)->info[0].size++; +} +/* notice: prepending uses slighly more space than appending */ +void list_prepend_(void*_list, void*entry) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t* n = (commonlist_t*)malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); + int size = 0; + commonlist_t* last = 0; + if(*list) { + last = (*list)->info[0].last; + size = (*list)->info[0].size; + } + n->next = *list; + n->entry = entry; + *list = n; + (*list)->info[0].last = last; + (*list)->info[0].size = size+1; +} +void list_free_(void*_list) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t*l = *list; + while(l) { + commonlist_t*next = l->next; + free(l); + l = next; + } + *list = 0; +} +void list_deep_free_(void*_list) +{ + commonlist_t**list = (commonlist_t**)_list; + commonlist_t*l = *list; + while(l) { + commonlist_t*next = l->next; + if(l->entry) { + free(l->entry);l->entry=0; + } + free(l); + l = next; + } + *list = 0; +} +void*list_clone_(void*_list) +{ + commonlist_t*l = *(commonlist_t**)_list; + + void*dest = 0; + while(l) { + commonlist_t*next = l->next; + list_append_(&dest, l->entry); + l = next; + } + return dest; + +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/q.h b/fluidbook/tools/swftools-special-swfdump/lib/q.h new file mode 100644 index 000000000..7080eca5d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/q.h @@ -0,0 +1,310 @@ +/* q.h + Header file for q.c. + + Part of the swftools package. + + Copyright (c) 2001,2002,2003,2004 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __q_h__ +#define __q_h__ + +#include +#include +#include "mem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NEW(t,y) t*y = (t*)rfx_calloc(sizeof(t)); +#define PTR_AS_INT(p) (((char*)(p))-((char*)NULL)) +#define INT_AS_PTR(i) (((char*)NULL)+(int)(i)) + +/* dynamically growing mem section */ +typedef struct _mem_t { + char*buffer; + int len; + int pos; + int read_pos; +} mem_t; + +/* fifo buffered growing mem region */ +typedef struct _ringbuffer_t +{ + void*internal; + int available; +} ringbuffer_t; + +/* non-nul terminated string */ +typedef struct _string_t { + const char*str; + int len; +} string_t; + +/* key/value pairs of strings */ +typedef struct _map_t { + void*internal; +} map_t; + +/* type information */ +typedef char (*equals_func)(const void*o1, const void*o2); +typedef unsigned int (*hash_func)(const void*o); +typedef void* (*dup_func)(const void*o); +typedef void (*free_func)(void*o); + +typedef struct _type_t { + equals_func equals; + hash_func hash; + dup_func dup; + free_func free; +} type_t; + +extern type_t charptr_type; +extern type_t stringstruct_type; +extern type_t ptr_type; +extern type_t int_type; + +typedef struct _dictentry { + void*key; + unsigned int hash; + void*data; + struct _dictentry*next; +} dictentry_t; + +/* (void*) pointers referenced by strings */ +typedef struct _dict { + dictentry_t**slots; + type_t*key_type; + int hashsize; + int num; +} dict_t; + +/* array of key/value pairs, with fast lookup */ +typedef struct _array_entry { + void*name; + void*data; +} array_entry_t; + +typedef struct _array { + int num; + int size; + array_entry_t*d; + dict_t*entry2pos; +} array_t; + +/* array of strings, string<->int mapping, + with O(1) for int->string lookup and + ~O(n/hashsize) for string->int lookup */ +typedef struct _stringarray_t +{ + void*internal; +} stringarray_t; + +/* heap */ +typedef struct _heap { + void**elements; + char*data; + int elem_size; + int size; + int max_size; + int(*compare)(const void *, const void *); +} heap_t; + +/* trie (with rollback) */ +typedef struct _trielayer { + struct _trielayer*row[256]; + unsigned char*rest; + void*data; +} trielayer_t; + +typedef struct _trie { + trielayer_t* start; + void*rollback; +} trie_t; + +/* move to front list structure */ +typedef struct _mtf_item { + const void*key; + int num; + struct _mtf_item*next; +} mtf_item_t; + +typedef struct _mtf { + mtf_item_t*first; + type_t*type; +} mtf_t; + +char* strdup_n(const char*str, int size); +char* allocprintf(const char*str, ...); + +float medianf(float*values, int n); + +unsigned int crc32_add_byte(unsigned int crc32, unsigned char b); +unsigned int crc32_add_string(unsigned int crc32, const char*s); +unsigned int crc32_add_bytes(unsigned int checksum, const void*s, int len); + +void mem_init(mem_t*mem); +int mem_put(mem_t*m, void*data, int length); +int mem_putstring(mem_t*m, string_t str); +int mem_get(mem_t*m, void*data, int length); +void mem_clear(mem_t*mem); +void mem_destroy(mem_t*mem); + +void ringbuffer_init(ringbuffer_t*r); +void ringbuffer_put(ringbuffer_t*r, void*buf, int size); +int ringbuffer_read(ringbuffer_t*r, void*buf, int size); +void ringbuffer_clear(ringbuffer_t*r); + +/* old style functions- should be renamed */ +string_t string_new(const char*text, int len); +string_t string_new2(const char*text); +void string_dup(string_t*str, const char*text); +void string_dup2(string_t*str, const char*text, int len); + +char* string_cstr(string_t*str); +char* string_escape(string_t*str); +string_t* string_new3(const char*text, int len); +string_t* string_new4(const char*text); +void string_free(string_t*s); +unsigned int string_hash(const string_t*str); +unsigned int string_hash2(const char*str); +unsigned int string_hash3(const char*str, int len); +uint64_t string_hash64(const char*str); +void string_set(string_t*str, const char*text); +void string_set2(string_t*str, const char*text, int len); +string_t*string_dup3(string_t*s); +int string_equals(string_t*str, const char*text); + +char* concat2(const char* t1, const char* t2); +char* concat3(const char* t1, const char* t2, const char* t3); + +void stringarray_init(stringarray_t*sa, int hashsize); +void stringarray_put(stringarray_t*sa, string_t str); + +char* stringarray_at(stringarray_t*sa, int pos); +string_t stringarray_at2(stringarray_t*sa, int pos); +int stringarray_find(stringarray_t*sa, string_t*str); +void stringarray_clear(stringarray_t*sa); +void stringarray_destroy(stringarray_t*sa); + +dict_t*dict_new(); +dict_t*dict_new2(type_t*type); +void dict_init(dict_t*dict, int size); +void dict_init2(dict_t*dict, type_t*type, int size); +dictentry_t*dict_put(dict_t*h, const void*key, void* data); +void dict_put2(dict_t*h, const char*s, void*data); +int dict_count(dict_t*h); +void dict_dump(dict_t*h, FILE*fi, const char*prefix); +dictentry_t* dict_get_slot(dict_t*h, const void*key); +char dict_contains(dict_t*h, const void*s); +void* dict_lookup(dict_t*h, const void*s); +char dict_del(dict_t*h, const void*s); +char dict_del2(dict_t*h, const void*key, void*data); +dict_t*dict_clone(dict_t*); + +void dict_foreach_keyvalue(dict_t*h, void (*runFunction)(void*data, const void*key, void*val), void*data); +void dict_foreach_value(dict_t*h, void (*runFunction)(void*)); +void dict_free_all(dict_t*h, char free_keys, void (*free_data_function)(void*)); +void dict_clear(dict_t*h); +void dict_destroy_shallow(dict_t*dict); +void dict_destroy(dict_t*dict); +#define DICT_ITERATE_DATA(d,t,v) \ + int v##_i;dictentry_t*v##_e;t v;\ + for(v##_i=0;v##_i<(d)->hashsize;v##_i++) \ + for(v##_e=(d)->slots[v##_i]; v##_e && ((v=(t)v##_e->data)||1); v##_e=v##_e->next) +#define DICT_ITERATE_KEY(d,t,v) \ + int v##_i;dictentry_t*v##_e;t v;\ + for(v##_i=0;v##_i<(d)->hashsize;v##_i++) \ + for(v##_e=(d)->slots[v##_i];v##_e && ((v=(t)v##_e->key)||1);v##_e=v##_e->next) +#define DICT_ITERATE_ITEMS(d,t1,v1,t2,v2) \ + int v1##_i;dictentry_t*v1##_e;t1 v1;t2 v2; \ + for(v1##_i=0;v1##_i<(d)->hashsize;v1##_i++) \ + for(v1##_e=(d)->slots[v1##_i]; v1##_e && (((v1=(t1)v1##_e->key)||1)&&((v2=(t2)v1##_e->data)||1)); v1##_e=v1##_e->next) + +void map_init(map_t*map); +void map_put(map_t*map, string_t t1, string_t t2); +const char* map_lookup(map_t*map, const char*name); +void map_dump(map_t*map, FILE*fi, const char*prefix); +void map_clear(map_t*map); +void map_destroy(map_t*map); + +void heap_init(heap_t*h,int elem_size, int(*compare)(const void *, const void *)); +heap_t* heap_new(int elem_size, int(*compare)(const void *, const void *)); +heap_t* heap_clone(heap_t*o); +void heap_clear(heap_t*h); +void heap_destroy(heap_t*h); +void heap_put(heap_t*h, void*e); +int heap_size(heap_t*h); +void* heap_peek(heap_t*h); +void* heap_chopmax(heap_t*h); +void heap_dump(heap_t*h, FILE*fi); +void** heap_flatten(heap_t*h); + +trie_t*trie_new(); +void trie_put(trie_t*t, unsigned const char*id, void*data); +char trie_remove(trie_t*t, unsigned const char*id); +void*trie_lookup(trie_t*t, unsigned const char*id); +int trie_contains(trie_t*t, unsigned const char*id); +void trie_remember(trie_t*t); +void trie_rollback(trie_t*t); +void trie_dump(trie_t*t); + +mtf_t* mtf_new(type_t*type); +void mtf_increase(mtf_t*m, const void*key); +void mtf_destroy(mtf_t*m); + +array_t* array_new(); +array_t* array_new2(type_t*type); +void array_free(array_t*array); +void*array_getkey(array_t*array, int nr); +void*array_getvalue(array_t*array, int nr); +int array_append(array_t*array, const void*name, void*data); +#define array_contains(a,b) (array_find((a),(b))>=0) +int array_find(array_t*array, const void*name); +int array_find2(array_t*array, const void*name, void*data); +int array_update(array_t*array, const void*name, void*data); +int array_append_if_new(array_t*array, const void*name, void*data); +#define array_length(a) ((a)->num) + +#define DECLARE(x) struct _##x;typedef struct _##x x##_t; +#define DECLARE_LIST(x) \ +struct _##x##_list { \ + struct _##x* x; \ + struct _##x##_list*next; \ +}; \ +typedef struct _##x##_list x##_list_t; +int list_length_(void*_list); +void*list_clone_(void*_list); +void list_append_(void*_list, void*entry); +void list_prepend_(void*_list, void*entry); +void list_free_(void*_list); +void list_deep_free_(void*_list); +void list_concat_(void*l1, void*l2); +#define list_new() ((void*)0) +#define list_append(list, e) {sizeof((list)->next);list_append_(&(list),(e));} +#define list_concat(l1, l2) {sizeof((l1)->next);sizeof((l2)->next);list_concat_(&(l1),&(l2));} +#define list_prepend(list, e) {sizeof((list)->next);list_prepend_(&(list),(e));} +#define list_free(list) {sizeof((list)->next);list_free_(&(list));} +#define list_deep_free(list) {sizeof((list)->next);list_deep_free_(&(list));} +#define list_clone(list) (sizeof((list)->next),(list?list_clone_(&(list)):0)) +#define list_length(list) (sizeof((list)->next),list_length_(list)) + +#ifdef __cplusplus +} +#endif + +#endif //__q_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile new file mode 100644 index 000000000..967e113b6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile @@ -0,0 +1,25 @@ +# Generated automatically from Makefile.in by configure. +top_builddir = ../.. +srcdir = . +top_srcdir = ../.. +include ../../Makefile.common + +all: swf.$(O) image.$(O) + +libswf: ../libswf$(A) + +swf.$(O): swf.c swf.h + $(C) swf.c -o swf.$(O) + +image.$(O): image.c image.h + $(C) image.c -o image.$(O) + +swfrender: $(libswf_objects) ../../src/swfrender.c ../devices/render.$(O) + $(L) ../../src/swfrender.c $(libswf_objects) ../librfxswf$(A) ../gfxtools.$(O) ../png.$(O) ../devices/render.$(O) -o swfrender $(LIBS) + +install: +uninstall: + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in new file mode 100644 index 000000000..967e113b6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in @@ -0,0 +1,25 @@ +# Generated automatically from Makefile.in by configure. +top_builddir = ../.. +srcdir = . +top_srcdir = ../.. +include ../../Makefile.common + +all: swf.$(O) image.$(O) + +libswf: ../libswf$(A) + +swf.$(O): swf.c swf.h + $(C) swf.c -o swf.$(O) + +image.$(O): image.c image.h + $(C) image.c -o image.$(O) + +swfrender: $(libswf_objects) ../../src/swfrender.c ../devices/render.$(O) + $(L) ../../src/swfrender.c $(libswf_objects) ../librfxswf$(A) ../gfxtools.$(O) ../png.$(O) ../devices/render.$(O) -o swfrender $(LIBS) + +install: +uninstall: + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/image.c b/fluidbook/tools/swftools-special-swfdump/lib/readers/image.c new file mode 100644 index 000000000..a9f96e836 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/readers/image.c @@ -0,0 +1,160 @@ +#include +#include +#include +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../gfxtools.h" +#include "../log.h" +#include "../mem.h" +#include "../jpeg.h" +#include "../png.h" +#include "image.h" + +typedef struct _image_page_internal +{ +} image_page_internal_t; + +typedef struct _image_doc_internal +{ + gfximage_t img; +} image_doc_internal_t; + +void imagepage_destroy(gfxpage_t*image_page) +{ + image_page_internal_t*i= (image_page_internal_t*)image_page->internal; + free(image_page->internal);image_page->internal = 0; + free(image_page);image_page=0; +} + +void imagepage_render(gfxpage_t*page, gfxdevice_t*output) +{ + image_page_internal_t*i = (image_page_internal_t*)page->internal; + image_doc_internal_t*pi = (image_doc_internal_t*)page->parent->internal; + + gfxcxform_t cxform; + memset(&cxform, 0, sizeof(cxform)); + cxform.rr = 1; + cxform.gg = 1; + cxform.bb = 1; + cxform.aa = 1; + + gfxmatrix_t m; + memset(&m, 0, sizeof(m)); + m.m00 = 1; + m.m11 = 1; + + gfxline_t* rect = gfxline_makerectangle(0, 0, pi->img.width, pi->img.height); + output->fillbitmap(output, rect, &pi->img, &m, &cxform); + gfxline_free(rect); +} + +void imagepage_rendersection(gfxpage_t*page, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t _x1, gfxcoord_t _y1, gfxcoord_t _x2, gfxcoord_t _y2) +{ + image_page_internal_t*i = (image_page_internal_t*)page->internal; + image_doc_internal_t*pi = (image_doc_internal_t*)page->parent->internal; + + gfxcxform_t cxform; + memset(&cxform, 0, sizeof(cxform)); + cxform.rr = 1; + cxform.gg = 1; + cxform.bb = 1; + cxform.aa = 1; + + gfxmatrix_t m; + memset(&m, 0, sizeof(m)); + m.m00 = 1; + m.m11 = 1; + m.tx = x; + m.ty = y; + + gfxline_t* rect = gfxline_makerectangle(0, 0, pi->img.width, pi->img.height); + gfxline_t* rect2 = gfxline_makerectangle(_x1, _y1, _x2, _y2); + + output->startclip(output, rect2); + output->fillbitmap(output, rect, &pi->img, &m, &cxform); + output->endclip(output); + gfxline_free(rect); + gfxline_free(rect2); +} + +void image_doc_destroy(gfxdocument_t*gfx) +{ + image_doc_internal_t*i= (image_doc_internal_t*)gfx->internal; + + free(i->img.data);i->img.data = 0; + + free(gfx->internal);gfx->internal=0; + free(gfx);gfx=0; +} + +void image_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value) +{ + image_doc_internal_t*i= (image_doc_internal_t*)gfx->internal; +} + +gfxpage_t* image_doc_getpage(gfxdocument_t*doc, int page) +{ + image_doc_internal_t*di= (image_doc_internal_t*)doc->internal; + if(page != 1) + return 0; + + gfxpage_t* image_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); + image_page_internal_t*pi= (image_page_internal_t*)malloc(sizeof(image_page_internal_t)); + memset(pi, 0, sizeof(image_page_internal_t)); + + image_page->internal = pi; + image_page->destroy = imagepage_destroy; + image_page->render = imagepage_render; + image_page->rendersection = imagepage_rendersection; + image_page->width = di->img.width; + image_page->height = di->img.height; + image_page->parent = doc; + image_page->nr = page; + return image_page; +} + +static void image_setparameter(gfxsource_t*src, const char*name, const char*value) +{ + msg(" (gfxsource_image) setting parameter %s to \"%s\"", name, value); +} + +static gfxdocument_t*image_open(gfxsource_t*src, const char*filename) +{ + gfxdocument_t*image_doc = (gfxdocument_t*)malloc(sizeof(gfxdocument_t)); + memset(image_doc, 0, sizeof(gfxdocument_t)); + image_doc_internal_t*i= (image_doc_internal_t*)malloc(sizeof(image_doc_internal_t)); + memset(i, 0, sizeof(image_doc_internal_t)); + + gfxcolor_t*data = 0; + unsigned width = 0; + unsigned height = 0; + + if(!png_load(filename, &width, &height, (unsigned char**)&data)) { + if(!jpeg_load(filename, (unsigned char**)&data, &width, &height)) { + msg(" Couldn't load image %s", filename); + return 0; + } + } + i->img.data = data; + i->img.width = width; + i->img.height = height; + + image_doc->num_pages = 1; + image_doc->internal = i; + image_doc->get = 0; + image_doc->destroy = image_doc_destroy; + image_doc->setparameter = image_doc_setparameter; + image_doc->getpage = image_doc_getpage; + + return image_doc; +} + +gfxsource_t*gfxsource_image_create() +{ + gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t)); + memset(src, 0, sizeof(gfxsource_t)); + src->setparameter = image_setparameter; + src->open = image_open; + return src; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/image.h b/fluidbook/tools/swftools-special-swfdump/lib/readers/image.h new file mode 100644 index 000000000..c81839f1b --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/readers/image.h @@ -0,0 +1,22 @@ +#ifndef __image_h__ +#define __image_h__ + +#include "../gfxdevice.h" +#include "../gfxsource.h" + +#ifdef __cplusplus +extern "C" { +#endif + +gfxsource_t*gfxsource_image_create(); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c b/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c new file mode 100644 index 000000000..ea25c71c8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c @@ -0,0 +1,770 @@ +#include +#include +#include "../gfxdevice.h" +#include "../gfxsource.h" +#include "../gfxtools.h" +#include "../log.h" +#include "../mem.h" +#include "../png.h" +#include "../rfxswf.h" +#include "swf.h" + +typedef struct _map16_t +{ + void** ids; +} map16_t; + +typedef struct _swf_page_internal +{ + int frame; +} swf_page_internal_t; + +typedef struct _swf_doc_internal +{ + map16_t*id2char; + SWF swf; + int width,height; + MATRIX m; +} swf_doc_internal_t; + +#define TYPE_SHAPE 1 +#define TYPE_BITMAP 2 +#define TYPE_SPRITE 3 +#define TYPE_FONT 4 +#define TYPE_TEXT 5 + +typedef struct _character +{ + U16 id; + TAG*tag; + char type; + void*data; +} character_t; + +typedef struct _placement +{ + SWFPLACEOBJECT po; + int age; + int startFrame; +} placement_t; + +typedef struct _sprite +{ + int frameCount; +} sprite_t; + +typedef struct _render +{ + map16_t*id2char; + gfxdevice_t*device; + MATRIX m; + int clips; + int*clips_waiting; + + placement_t*current_placement; +} render_t; + + +//---- object/depth handling ---- + +map16_t* map16_new() +{ + map16_t*map = rfx_calloc(sizeof(map16_t)); + /* TODO: replace this by a more sophisticated data structure */ + map->ids = (void**)rfx_calloc(sizeof(character_t)*65536); + return map; +} +character_t*map16_get_id(map16_t*map, int id) +{ + if(id<0 || id>=65536) + return 0; + return map->ids[id]; +} +void map16_free(map16_t*map) +{ + free(map->ids); +} +void map16_add_id(map16_t*map, int nr, void*id) +{ + if(map->ids[nr]) + fprintf(stderr, "Warning: ID %d defined more than once\n", nr); + map->ids[nr] = id; +} +void map16_remove_id(map16_t*map, int nr) +{ + map->ids[nr] = 0; +} +void map16_enumerate(map16_t*map, void (*f)(void*self, int id, void*data), void*self) +{ + int t; + for(t=0;t<65536;t++) { + if(map->ids[t]) { + f(self, t, map->ids[t]); + } + } +} +//---- placements ---- + +placement_t* placement_unit() +{ + placement_t*placement = rfx_calloc(sizeof(placement_t)); + swf_GetPlaceObject(0, &placement->po); + return placement; +} + +placement_t* placement_join(placement_t*p1, placement_t*p2) +{ + placement_t*placement = rfx_alloc(sizeof(placement_t)); + *placement = *p1; + swf_MatrixJoin(&placement->po.matrix, &p1->po.matrix, &p2->po.matrix); + return placement; +} + +static void placement_free(placement_t*p) +{ + swf_PlaceObjectFree(&p->po); + free(p); +} + +//---- conversion stuff ---- + +static void convertMatrix(MATRIX*from, gfxmatrix_t*to) +{ + to->m00 = from->sx / 65536.0; to->m10 = from->r1 / 65536.0; + to->m01 = from->r0 / 65536.0; to->m11 = from->sy / 65536.0; + to->tx = from->tx/20.0; + to->ty = from->ty/20.0; +} + +static void convertCXForm(CXFORM*from, gfxcxform_t*to) +{ + memset(to, 0, sizeof(gfxcxform_t)); + to->aa = from->a0 / 256.0; + to->rr = from->r0 / 256.0; + to->gg = from->g0 / 256.0; + to->bb = from->b0 / 256.0; + to->ta = from->a1; + to->tr = from->r1; + to->tg = from->g1; + to->tb = from->b1; +} + +static gfxgradient_t* convertGradient(GRADIENT*from) +{ + gfxgradient_t*g = rfx_calloc(from->num * sizeof(gfxgradient_t)); + int t; + for(t=0;tnum;t++) { + g[t].pos = from->ratios[t] / 255.0; + g[t].color = *(gfxcolor_t*)&from->rgba[t]; + if(tnum-1) + g[t].next = &g[t+1]; + else + g[t].next = 0; + } + return g; +} + +gfxline_t* swfline_to_gfxline(SHAPELINE*line, int linestyle, int fillstyle0) +{ + gfxdrawer_t d; + SCOORD x=0,y=0,xx=0,yy=0; + gfxline_t*l; + gfxdrawer_target_gfxline(&d); + if(line && line->type != moveTo) { + fprintf(stderr, "Warning: Shape doesn't start with a moveTo\n"); + } + xx = line?line->x+1:0; + while(line) { + if(line->fillstyle0 == fillstyle0 || + line->fillstyle1 == fillstyle0 || + line->linestyle == linestyle) { + if(line->type == lineTo) { + if(xx!=x || yy!=y) d.moveTo(&d, x/20.0,y/20.0); + d.lineTo(&d, line->x/20.0,line->y/20.0); + xx = line->x; + yy = line->y; + } else if(line->type == splineTo) { + if(xx!=x || yy!=y) d.moveTo(&d, x/20.0,y/20.0); + d.splineTo(&d, line->sx/20.0, line->sy/20.0, line->x/20.0,line->y/20.0); + xx = line->x; + yy = line->y; + } + } + x = line->x; + y = line->y; + line = line->next; + } + l = d.result(&d); + return l; +} + + +//---- bitmap handling ---- + +static gfximage_t* gfximage_new(RGBA*data, int width, int height) +{ + gfximage_t* b = (gfximage_t*)rfx_calloc(sizeof(gfximage_t)); + b->data = (gfxcolor_t*)data; + b->width = width; + b->height = height; + return b; +} + +static gfximage_t* findimage(render_t*r, U16 id) +{ + character_t*c = (character_t*)map16_get_id(r->id2char, id); + assert(c && c->type == TYPE_BITMAP); + gfximage_t*img = (gfximage_t*)c->data; + + /*char filename[80]; + sprintf(filename, "bitmap%d.png", id); + png_write(filename, (unsigned char*)img->data, img->width, img->height); + printf("saving bitmap %d to %s\n", id, filename);*/ + + return c->data; +} +//---- shape handling ---- + +static void renderFilled(render_t*r, gfxline_t*line, FILLSTYLE*f, CXFORM*cx, MATRIX*po_m) +{ + if(f->type == FILL_SOLID) { + gfxcolor_t c = *(gfxcolor_t*)&f->color; + r->device->fill(r->device, line, &c); + } else if(f->type == FILL_TILED || f->type == FILL_CLIPPED) { + gfximage_t* img = findimage(r, f->id_bitmap); + gfxmatrix_t m; + gfxcxform_t gfxcx; + convertCXForm(cx, &gfxcx); + MATRIX m2; + swf_MatrixJoin(&m2, po_m, &f->m); + convertMatrix(&m2, &m); + m.m00/=20.0; m.m10/=20.0; + m.m01/=20.0; m.m11/=20.0; + /* TODO: handle clipped */ + r->device->fillbitmap(r->device, line, img, &m, &gfxcx); + } else if(f->type == FILL_LINEAR || f->type == FILL_RADIAL) { + gfxmatrix_t m; + gfxgradient_t* g; + MATRIX* m2 = &f->m; + //swf_MatrixJoin(&m2, po_m, &f->m); + + double z = f->type==FILL_RADIAL?4:4; + m.m00 = m2->sx/z/20.0; m.m10 = m2->r1/z/20.0; + m.m01 = m2->r0/z/20.0; m.m11 = m2->sy/z/20.0; + m.tx = m2->tx/20.0; + m.ty = m2->ty/20.0; + + g = convertGradient(&f->gradient); + r->device->fillgradient(r->device, line, g, f->type == FILL_LINEAR ? gfxgradient_linear : gfxgradient_radial, &m); + free(g); + } +} + +//---- font handling ---- + +typedef struct +{ + int numchars; + gfxline_t**glyphs; +} font_t; + +typedef struct textcallbackblock +{ + render_t*r; + MATRIX m; +} textcallbackblock_t; + +static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, + int xstart, int ystart, RGBA* color) +{ + textcallbackblock_t * info = (textcallbackblock_t*)self; + font_t*font = 0; + int t; + character_t*cfont = map16_get_id(info->r->id2char, fontid); + if(!cfont) { + fprintf(stderr, "Font %d unknown\n", fontid); + return; + } + if(cfont->type != TYPE_FONT) { + fprintf(stderr, "ID %d is not a font\n", fontid); + return; + } + font = cfont->data; + + for(t=0;tm; + SPOINT p; + + p.x = x; p.y = y; + p = swf_TurnPoint(p, &m); + + m.sx = (m.sx * fontsize) / 1024; + m.sy = (m.sy * fontsize) / 1024; + m.r0 = (m.r0 * fontsize) / 1024; + m.r1 = (m.r1 * fontsize) / 1024; + m.tx = p.x; + m.ty = p.y; + + gfxmatrix_t gm; + convertMatrix(&m, &gm); + + if(chars[t]<0 || chars[t]>= font->numchars) { + fprintf(stderr, "Character out of range: %d\n", chars[t]); + } else { + gfxline_t*line = gfxline_clone(font->glyphs[chars[t]]); + gfxline_transform(line, &gm); + FILLSTYLE f; + f.type = FILL_SOLID; + f.color = *color; + renderFilled(info->r, line, &f, 0, 0); + gfxline_free(line); + } + } +} + + +//---- tag handling ---- + +static map16_t* extractDefinitions(SWF*swf) +{ + map16_t*map = map16_new(); + TAG*tag = swf->firstTag; + while(tag) + { + int id = 0; + if(swf_isDefiningTag(tag)) { + id = swf_GetDefineID(tag); + } + + if(tag->id == ST_DEFINESPRITE) { + character_t*c = rfx_calloc(sizeof(character_t)); + sprite_t*s = rfx_calloc(sizeof(sprite_t)); + swf_SetTagPos(tag, 0); + swf_GetU16(tag); //id + s->frameCount = swf_GetU16(tag); //frameno + c->tag = tag; + c->type = TYPE_SPRITE; + c->data = s; + map16_add_id(map, id, c); + } + else if(tag->id == ST_DEFINESHAPE || + tag->id == ST_DEFINESHAPE2 || + tag->id == ST_DEFINESHAPE3) { + character_t*c = rfx_calloc(sizeof(character_t)); + c->tag = tag; + c->type = TYPE_SHAPE; + map16_add_id(map, id, c); + } + else if(tag->id == ST_DEFINEFONT || + tag->id == ST_DEFINEFONT2 || + tag->id == ST_DEFINEFONT3) { + character_t*c = rfx_calloc(sizeof(character_t)); + SWFFONT*swffont = 0; + font_t*font = (font_t*)rfx_calloc(sizeof(font_t)); + swf_FontExtract(swf, id, &swffont); + font->numchars = swffont->numchars; + font->glyphs = (gfxline_t**)rfx_calloc(sizeof(gfxline_t*)*font->numchars); + int t; + RGBA color_white = {255,255,255,255}; + for(t=0;tnumchars;t++) { + if(!swffont->glyph[t].shape->fillstyle.n) { + swf_ShapeAddSolidFillStyle(swffont->glyph[t].shape, &color_white); + } + SHAPE2*s2 = swf_ShapeToShape2(swffont->glyph[t].shape); + font->glyphs[t] = swfline_to_gfxline(s2->lines, 0, 1); + if(tag->id==ST_DEFINEFONT3) { + gfxmatrix_t m = {1/20.0,0,0, 0,1/20.0,0}; + gfxline_transform(font->glyphs[t], &m); + } + swf_Shape2Free(s2); + } + swf_FontFree(swffont); + + c->tag = tag; + c->type = TYPE_FONT; + c->data = font; + map16_add_id(map, id, c); + } + else if(tag->id == ST_DEFINETEXT || + tag->id == ST_DEFINETEXT2) { + character_t*c = rfx_calloc(sizeof(character_t)); + c->tag = tag; + c->type = TYPE_TEXT; + c->data = 0; + map16_add_id(map, id, c); + } + else if(tag->id == ST_DEFINEBITSJPEG || + tag->id == ST_DEFINEBITSJPEG2 || + tag->id == ST_DEFINEBITSJPEG3 || + tag->id == ST_DEFINEBITSLOSSLESS || + tag->id == ST_DEFINEBITSLOSSLESS2) { + character_t*c = rfx_calloc(sizeof(character_t)); + int width, height; + void*data = swf_ExtractImage(tag, &width, &height); + gfximage_t*b = gfximage_new(data, width, height); + c->tag = tag; + c->type = TYPE_BITMAP; + c->data = b; + map16_add_id(map, id, c); + } + + tag = tag->next; + } + return map; +} + +void swf_FreeTaglist(TAG*tag) +{ + while(tag) + { + TAG * tnew = tag->next; + if (tag->data) + rfx_free(tag->data); + rfx_free(tag); + tag = tnew; + } +} + +static void increaseAge(void*self, int id, void*data) +{ + placement_t*p = (placement_t*)data; + p->age++; +} + +static map16_t* extractFrame(TAG*startTag, int frame_to_extract) +{ + map16_t*depthmap = map16_new(); + TAG*tag = startTag; + int frame = 1; + int insprite = 0; + + for(;tag;tag = tag->next) { + if(tag->id == ST_DEFINESPRITE) { + while(tag->id != ST_END) + tag = tag->next; + continue; + } + if(tag->id == ST_PLACEOBJECT || + tag->id == ST_PLACEOBJECT2) { + placement_t* p = rfx_calloc(sizeof(placement_t)); + p->age = 1; + p->startFrame = frame; + swf_GetPlaceObject(tag, &p->po); + if(p->po.move) { + placement_t*old = (placement_t*)map16_get_id(depthmap, p->po.depth); + + if(!(p->po.flags&PF_CHAR)) p->po.id = old->po.id; + if(!(p->po.flags&PF_MATRIX)) p->po.matrix = old->po.matrix; + if(!(p->po.flags&PF_CXFORM)) p->po.cxform = old->po.cxform; + if(!(p->po.flags&PF_RATIO)) p->po.ratio = old->po.ratio; + + map16_remove_id(depthmap, old->po.depth); + placement_free(old); + } + map16_add_id(depthmap, p->po.depth, p); + } + if(tag->id == ST_REMOVEOBJECT || + tag->id == ST_REMOVEOBJECT2) { + U16 depth = swf_GetDepth(tag); + map16_remove_id(depthmap, depth); + } + if(tag->id == ST_SHOWFRAME || tag->id == ST_END || !tag->next) { + if(frame == frame_to_extract) { + return depthmap; + } + if(tag->id == ST_SHOWFRAME) { + frame++; + map16_enumerate(depthmap, increaseAge, 0); + } + } + if(tag->id == ST_END) + break; + } + return depthmap; +} + +// ---- rendering ---- + +void swf_ShapeApplyMatrix(SHAPE2*shape, MATRIX*m) +{ +} + +RGBA swf_ColorTransform(RGBA*color, CXFORM*cx) +{ + RGBA dest; + dest.r = (cx->r0*color->r + cx->r1*256) >> 8; + dest.g = (cx->g0*color->g + cx->g1*256) >> 8; + dest.b = (cx->b0*color->b + cx->b1*256) >> 8; + dest.a = (cx->a0*color->a + cx->a1*256) >> 8; + return dest; +} + +void renderOutline(render_t*r, gfxline_t*line, LINESTYLE*l, CXFORM*cx) +{ + RGBA c = swf_ColorTransform(&l->color, cx); + gfxcoord_t width = l->width/20.0; + r->device->stroke(r->device, line, width, (gfxcolor_t*)&c, gfx_capRound, gfx_joinRound, 0.0); +} + +void swf_ApplyMatrixToShape(SHAPE2*shape, MATRIX*m) +{ + SHAPELINE*line = shape->lines; + while(line) { + SPOINT p; + + p.x = line->x; p.y = line->y; + p = swf_TurnPoint(p, m); + line->x = p.x; line->y = p.y; + + p.x = line->sx; p.y = line->sy; + p = swf_TurnPoint(p, m); + line->sx = p.x; line->sy = p.y; + + line = line->next; + } +} + +static void renderCharacter(render_t*r, placement_t*p, character_t*c) +{ + if(c->type == TYPE_SHAPE) { + SHAPE2 shape; + swf_ParseDefineShape(c->tag, &shape); + + MATRIX m,m2; + swf_MatrixJoin(&m2, &r->m, &r->current_placement->po.matrix); + swf_MatrixJoin(&m, &m2, &p->po.matrix); + + swf_ApplyMatrixToShape(&shape, &m); + + SHAPELINE*line = shape.lines; + int t; + + for(t=1;t<=shape.numlinestyles;t++) { + gfxline_t*line = swfline_to_gfxline(shape.lines, t, -1); + if(line) renderOutline(r, line, &shape.linestyles[t-1], &p->po.cxform); + gfxline_free(line); + } + + for(t=1;t<=shape.numfillstyles;t++) { + gfxline_t*line; + line = swfline_to_gfxline(shape.lines, -1, t); + if(line) { + if(!p->po.clipdepth) { + renderFilled(r, line, &shape.fillstyles[t-1], &p->po.cxform, &p->po.matrix); + } else { + r->device->startclip(r->device, line); + r->clips_waiting[p->po.clipdepth]++; + } + } + gfxline_free(line); + /*line = swfline_to_gfxline(shape.lines, -1, -1, t); + if(line) renderFilled(r, line, &shape.fillstyles[t-1], &p->po.cxform); + gfxline_free(line);*/ + } + + } else if(c->type == TYPE_TEXT) { + TAG* tag = c->tag; + textcallbackblock_t info; + MATRIX mt,mt2; + swf_SetTagPos(tag, 0); + swf_GetU16(tag); + swf_GetRect(tag,0); + swf_GetMatrix(tag,&mt); + + swf_MatrixJoin(&mt2, &r->m, &mt); + swf_MatrixJoin(&info.m, &mt2, &p->po.matrix); + info.r = r; + swf_ParseDefineText(tag, textcallback, &info); + } +} + +// ---- main ---- + +static void placeObject(void*self, int id, void*data) +{ + render_t*r = (render_t*)self; + placement_t*p = (placement_t*)data; + character_t*c = map16_get_id(r->id2char, p->po.id); + + if(!c) { + fprintf(stderr, "Error: ID %d unknown\n", p->po.id); + return; + } + + if(c->type == TYPE_SPRITE) { + placement_t*oldp = r->current_placement; + r->current_placement = placement_join(oldp, p); + + int*old_clips_waiting = r->clips_waiting; + r->clips_waiting = rfx_calloc(sizeof(r->clips_waiting[0])*65536); + + sprite_t* s = (sprite_t*)c->data; + + TAG*spritetags = c->tag->next; + map16_t* depths = extractFrame(spritetags, s->frameCount>0? p->age % s->frameCount : 0); + map16_enumerate(depths, placeObject, r); + + int t; + for(t=0;t<65536;t++) { + int i; + for(i=0; iclips_waiting[t]; i++) { + r->device->endclip(r->device); + } + } + free(r->clips_waiting); + r->clips_waiting = old_clips_waiting; + + placement_free(r->current_placement); + r->current_placement = oldp; + } else { + renderCharacter(r, p, c); + } +} + +void swfpage_destroy(gfxpage_t*swf_page) +{ + swf_page_internal_t*i= (swf_page_internal_t*)swf_page->internal; + free(swf_page->internal);swf_page->internal = 0; + free(swf_page);swf_page=0; +} + +void swfpage_render(gfxpage_t*page, gfxdevice_t*output) +{ + swf_page_internal_t*i = (swf_page_internal_t*)page->internal; + swf_doc_internal_t*pi = (swf_doc_internal_t*)page->parent->internal; + map16_t* depths = extractFrame(pi->swf.firstTag, i->frame); + render_t r; + r.id2char = pi->id2char; + r.clips = 0; + r.device = output; + r.m = pi->m; + r.clips_waiting = malloc(sizeof(r.clips_waiting[0])*65536); + r.current_placement = placement_unit(); + memset(r.clips_waiting, 0, sizeof(r.clips_waiting[0])*65536); + + int t; + for(t=0;t<65536;t++) { + if(depths->ids[t]) { + placeObject(&r, t, depths->ids[t]); + } + int i; + for(i=0; iendclip(output); + } + } + free(r.clips_waiting); +} + +void swfpage_rendersection(gfxpage_t*page, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t _x1, gfxcoord_t _y1, gfxcoord_t _x2, gfxcoord_t _y2) +{ + swf_doc_internal_t*pi = (swf_doc_internal_t*)page->parent->internal; + /* FIXME */ + swfpage_render(page,output); +} + +void swf_doc_destroy(gfxdocument_t*gfx) +{ + swf_doc_internal_t*i= (swf_doc_internal_t*)gfx->internal; + swf_FreeTags(&i->swf); + free(gfx->internal);gfx->internal=0; + free(gfx);gfx=0; +} + +void swf_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value) +{ + swf_doc_internal_t*i= (swf_doc_internal_t*)gfx->internal; +} + +gfxpage_t* swf_doc_getpage(gfxdocument_t*doc, int page) +{ + swf_doc_internal_t*di= (swf_doc_internal_t*)doc->internal; + if(page < 1 || page > doc->num_pages) + return 0; + + gfxpage_t* swf_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); + swf_page_internal_t*pi= (swf_page_internal_t*)malloc(sizeof(swf_page_internal_t)); + memset(pi, 0, sizeof(swf_page_internal_t)); + + pi->frame = page; + + swf_page->internal = pi; + swf_page->destroy = swfpage_destroy; + swf_page->render = swfpage_render; + swf_page->rendersection = swfpage_rendersection; + swf_page->width = di->width; + swf_page->height = di->height; + swf_page->parent = doc; + swf_page->nr = page; + return swf_page; +} + +void swf_setparameter(gfxsource_t*src, const char*name, const char*value) +{ + msg(" setting parameter %s to \"%s\"", name, value); +} + +gfxdocument_t*swf_open(gfxsource_t*src, const char*filename) +{ + gfxdocument_t*swf_doc = (gfxdocument_t*)malloc(sizeof(gfxdocument_t)); + memset(swf_doc, 0, sizeof(gfxdocument_t)); + swf_doc_internal_t*i= (swf_doc_internal_t*)malloc(sizeof(swf_doc_internal_t)); + memset(i, 0, sizeof(swf_doc_internal_t)); + + TAG*tag = 0; + int f; + int frame; + render_t r; + gfxdevice_t d; + + if(!filename) { + return 0; + } + f = open(filename,O_RDONLY|O_BINARY); + if (f<0) { + perror("Couldn't open file: "); + return 0; + } + if FAILED(swf_ReadSWF(f,&i->swf)) { + fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); + close(f); + return 0; + } + swf_UnFoldAll(&i->swf); + + i->id2char = extractDefinitions(&i->swf); + i->width = (i->swf.movieSize.xmax - i->swf.movieSize.xmin) / 20; + i->height = (i->swf.movieSize.ymax - i->swf.movieSize.ymin) / 20; + + swf_GetMatrix(0, &i->m); + i->m.tx = -i->swf.movieSize.xmin; + i->m.ty = -i->swf.movieSize.ymin; + + swf_doc->num_pages = i->swf.frameCount; + swf_doc->internal = i; + swf_doc->get = 0; + swf_doc->destroy = swf_doc_destroy; + swf_doc->setparameter = swf_doc_setparameter; + swf_doc->getpage = swf_doc_getpage; + + return swf_doc; +} + +static void swf_destroy(gfxsource_t*src) +{ + memset(src, 0, sizeof(*src)); + free(src); +} + + +gfxsource_t*gfxsource_swf_create() +{ + gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t)); + memset(src, 0, sizeof(gfxsource_t)); + src->setparameter = swf_setparameter; + src->open = swf_open; + src->destroy = swf_destroy; + return src; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h b/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h new file mode 100644 index 000000000..26bee4995 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h @@ -0,0 +1,41 @@ +/* swf.h + + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __swfsource_h__ +#define __swfsource_h__ + +#include "../gfxsource.h" + +#ifdef __cplusplus +extern "C" { +#endif + +gfxsource_t*gfxsource_swf_create(); + +#ifdef __cplusplus +} +#endif + +#endif //__pdfsource_h__ + + + + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c b/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c new file mode 100644 index 000000000..77417ddfd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c @@ -0,0 +1,1937 @@ +/* vi: set sts=2 sw=2 :*/ +/* rfxswf.c + + Library for creating and reading SWF files or parts of it. + There's a module directory which provides some extended functionality. + Most modules are included at the bottom of this file. + + Part of the swftools package. + + Copyright (c) 2000-2003 Rainer Böhme + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "mem.h" +#include "rfxswf.h" +#ifdef HAVE_ZLIB +#include +#endif // HAVE_ZLIB + +#ifndef RFXSWF_DISABLESOUND +#ifdef HAVE_LAME +#include "lame/lame.h" +#endif +#endif + +#ifdef HAVE_TIME_H +#include +#endif + +#ifdef HAVE_IO_H +#include +#endif + +#include "./bitio.h" +#include "./os.h" + +// internal constants + +#define MALLOC_SIZE 128 +#define INSERT_RFX_TAG + +#define MEMSIZE(l) (((l/MALLOC_SIZE)+1)*MALLOC_SIZE) + +// inline wrapper functions + +TAG * swf_NextTag(TAG * t) { return t->next; } +TAG * swf_PrevTag(TAG * t) { return t->prev; } +U16 swf_GetTagID(TAG * t) { return t->id; } +U32 swf_GetTagLen(TAG * t) { return t->len; } +U8* swf_GetTagLenPtr(TAG * t) { return &(t->data[t->len]); } +U32 swf_GetTagPos(TAG * t) { return t->pos; } + +void swf_SetTagPos(TAG * t,U32 pos) +{ swf_ResetReadBits(t); + if (pos<=t->len) t->pos = pos; + else { +#ifdef DEBUG_RFXSWF + fprintf(stderr,"SetTagPos(%d) out of bounds: TagID = %i\n",pos, t->id); +#endif + } +} + +char* swf_GetString(TAG*t) +{ + int pos = t->pos; + while(t->pos < t->len && swf_GetU8(t)); + /* make sure we always have a trailing zero byte */ + if(t->pos == t->len) { + if(t->len == t->memsize) { + swf_ResetWriteBits(t); + swf_SetU8(t, 0); + t->len = t->pos; + } + t->data[t->len] = 0; + } + return (char*)&(t->data[pos]); +} + +U8 swf_GetU8(TAG * t) +{ swf_ResetReadBits(t); + #ifdef DEBUG_RFXSWF + if ((int)t->pos>=(int)t->len) + { fprintf(stderr,"GetU8() out of bounds: TagID = %i\n",t->id); + *(int*)0=0; + return 0; + } + #endif + return t->data[t->pos++]; +} + +U16 swf_GetU16(TAG * t) +{ U16 res; + swf_ResetReadBits(t); + #ifdef DEBUG_RFXSWF + if ((int)t->pos>((int)t->len-2)) + { fprintf(stderr,"GetU16() out of bounds: TagID = %i\n",t->id); + return 0; + } + #endif + res = t->data[t->pos] | (t->data[t->pos+1]<<8); + t->pos+=2; + return res; +} + +U32 swf_GetU32(TAG * t) +{ U32 res; + swf_ResetReadBits(t); + #ifdef DEBUG_RFXSWF + if ((int)t->pos>((int)t->len-4)) + { fprintf(stderr,"GetU32() out of bounds: TagID = %i\n",t->id); + return 0; + } + #endif + res = t->data[t->pos] | (t->data[t->pos+1]<<8) | + (t->data[t->pos+2]<<16) | (t->data[t->pos+3]<<24); + t->pos+=4; + return res; +} + +int swf_GetBlock(TAG * t,U8 * b,int l) +// returns number of bytes written (<=l) +// b = NULL -> skip data +{ swf_ResetReadBits(t); + if ((t->len-t->pos)len-t->pos; + if (b && l) memcpy(b,&t->data[t->pos],l); + t->pos+=l; + return l; +} + +int swf_SetBlock(TAG * t,const U8 * b,int l) +// Appends Block to the end of Tagdata, returns size +{ U32 newlen = t->len + l; + swf_ResetWriteBits(t); + if (newlen>t->memsize) + { U32 newmem = MEMSIZE(newlen); + U8 * newdata = (U8*)(rfx_realloc(t->data,newmem)); + t->memsize = newmem; + t->data = newdata; + } + if (b) memcpy(&t->data[t->len],b,l); + else memset(&t->data[t->len],0x00,l); + t->len+=l; + return l; +} + +int swf_SetU8(TAG * t,U8 v) +{ swf_ResetWriteBits(t); + if ((t->len+1)>t->memsize) return (swf_SetBlock(t,&v,1)==1)?0:-1; + t->data[t->len++] = v; + return 0; +} + +int swf_SetU16(TAG * t,U16 v) +{ U8 a[2]; + a[0] = v&0xff; + a[1] = v>>8; + + swf_ResetWriteBits(t); + if ((t->len+2)>t->memsize) return (swf_SetBlock(t,a,2)==2)?0:-1; + t->data[t->len++] = a[0]; + t->data[t->len++] = a[1]; + return 0; +} +void swf_SetS16(TAG * t,int v) +{ + if(v>32767 || v<-32768) { + #ifdef DEBUG_RFXSWF + fprintf(stderr, "Warning: S16 overflow: %d\n", v); + #endif + } + swf_SetU16(t, (S16)v); +} + +int swf_SetU32(TAG * t,U32 v) +{ U8 a[4]; + a[0] = v&0xff; // to ensure correct handling of non-intel byteorder + a[1] = (v>>8)&0xff; + a[2] = (v>>16)&0xff; + a[3] = (v>>24)&0xff; + + swf_ResetWriteBits(t); + if ((t->len+4)>t->memsize) return (swf_SetBlock(t,a,4)==4)?0:-1; + t->data[t->len++] = a[0]; + t->data[t->len++] = a[1]; + t->data[t->len++] = a[2]; + t->data[t->len++] = a[3]; + return 0; +} + +U32 swf_GetBits(TAG * t,int nbits) +{ U32 res = 0; + if (!nbits) return 0; + if (!t->readBit) t->readBit = 0x80; + while (nbits) + { res<<=1; +#ifdef DEBUG_RFXSWF + if (t->pos>=t->len) + { fprintf(stderr,"GetBits() out of bounds: TagID = %i, pos=%d, len=%d\n",t->id, t->pos, t->len); + int i,m=t->len>10?10:t->len; + for(i=-1;idata[i]); + } + fprintf(stderr, "\n"); + return res; + } +#endif + if (t->data[t->pos]&t->readBit) res|=1; + t->readBit>>=1; + nbits--; + if (!t->readBit) + { if (nbits) t->readBit = 0x80; + t->pos++; + } + } + return res; +} + +S32 swf_GetSBits(TAG * t,int nbits) +{ U32 res = swf_GetBits(t,nbits); + if (res&(1<<(nbits-1))) res|=(0xffffffff<writeBit) + { if (FAILED(swf_SetU8(t,0))) return -1; + t->writeBit = 0x80; + } + if (v&bm) t->data[t->len-1] |= t->writeBit; + bm>>=1; + t->writeBit>>=1; + nbits--; + } + return 0; +} + +// Advanced Data Access Functions + +double swf_GetFixed(TAG * t) +{ + U16 low = swf_GetU16(t); + U16 high = swf_GetU16(t); + return high + low*(1/65536.0); +} +void swf_SetFixed(TAG * t, double f) +{ + U16 fr = (U16)((f-(int)f)*65536); + swf_SetU16(t, fr); + swf_SetU16(t, (U16)f - (f<0 && fr!=0)); +} +float swf_GetFixed8(TAG * t) +{ + U8 low = swf_GetU8(t); + U8 high = swf_GetU8(t); + return (float)(high + low*(1/256.0)); +} +void swf_SetFixed8(TAG * t, float f) +{ + U8 fr = (U8)((f-(int)f)*256); + swf_SetU8(t, fr); + swf_SetU8(t, (U8)f - (f<0 && fr!=0)); +} + +U32 swf_GetU30(TAG*tag) +{ + U32 shift = 0; + U32 s = 0; + int nr=0; + while(1) { + U8 b = swf_GetU8(tag); + nr++; + s|=(b&127)<=32) + break; + } + /*int nr2= swf_SetU30(0, s); + if(nr!=nr2) { + printf("Unsigned value %d stored in %d bytes, I'd store it in %d bytes\n", s, nr, nr2); + }*/ + return s; +} + +int swf_SetU30(TAG*tag, U32 u) +{ + int nr = 0; + do { + if(tag) + swf_SetU8(tag, (u&~0x7f?0x80:0) | (u&0x7F)); + u>>=7; + nr++; + } while(u); + return nr; +} + +void swf_SetABCU32(TAG*tag, U32 u) +{ + do { + swf_SetU8(tag, (u&~0x7f?0x80:0) | (u&0x7F)); + u>>=7; + } while(u); +} +U32 swf_GetABCU32(TAG*tag) +{ + return swf_GetU30(tag); +} +void swf_SetABCS32(TAG*tag, S32 v) +{ + swf_SetABCU32(tag, v); +} +S32 swf_GetABCS32(TAG*tag) +{ + return swf_GetABCU32(tag); +} + +#if 0 + +/*The AVM2 spec is just plain wrong, claiming that S32 values are sign +extended. They're not. +This wastes up to 4 bytes for every negative value. */ + +void swf_SetABCS32(TAG*tag, S32 s) +{ + printf("write S32: %d\n", s); + S32 neg = s<0?-1:0; + U8 sign = s<0?0x40:0; + while(1) { + U8 val = s&0x7f; + U8 vsign = s&0x40; + s>>=7; + neg>>=7; + if(s==neg && vsign==sign) { + /* if the value we now write has the same sign as s + and all the remaining bits are equal to the sign of s + too, stop writing */ + swf_SetU8(tag, val); + printf("put %02x\n", val); + break; + } else { + swf_SetU8(tag, 0x80 | val); + printf("put %02x\n", 0x80|val); + } + }; +} +int swf_GetS30(TAG*tag) +{ + U32 shift = 0; + U32 s = 0; + int nr=0; + while(1) { + U8 b = swf_GetU8(tag); + nr++; + nt i,m=t->len>10?10:t->len; + for(i=0;idata[i]); + } + fprintf(stderr, "\n"); + s|=(b&127)<=32) { + if(b&64) { + if(shift<32) + s|=0xffffffff<>10)&0x1f; + U16 m = f1&0x3ff; + /* find highest bit in mantissa */ + int h=0; + while(!(m&0x400)) { + m<<=1; + h++; + } + m&=0x3ff; + e -= h; + e += 0x6f; + + f2.u = (f1&0x8000)<<16; //sign + f2.u |= e<<23; //exponent + f2.u |= m<<13; //mantissa + return *(float*)&f2; +} + +void swf_SetF16(TAG * t, float f) +{ + union { + U32 u; + float f; + } v; + v.f = f; + + U16 result = (v.u>>16)&0x8000; //sign + int exp = ((v.u>>23)&0xff)-0x7f+0x10; + U16 m = (v.u>>13)&0x3ff; + //fprintf(stderr, "%f: %04x sign, %d exp, %04x mantissa\n", f, result, exp, m); + if(exp<-10) { + // underflow (clamp to 0.0) + exp = 0; + m = 0; + } else if(exp<0) { + // partial underflow- strip some bits + m = (m|0x400)>>-exp; + exp = 0; + } else if(exp>=32) { + exp = 31; + m = 0x3ff; + fprintf(stderr, "Exponent overflow in FLOAT16 encoding\n"); + } else { + exp++; + m = (m>>1)|0x200; + } + result |= exp<<10; + result |= m; + swf_SetU16(t, result); +} + +float F16toFloat(U16 x) +{ + TAG t; + t.data = (void*)&x; + t.readBit = 0; + t.pos = 0; + t.len = 2; + return swf_GetF16(&t); +} + +float floatToF16(float f) +{ + U16 u = 0; + TAG t; + t.data = (void*)&u; + t.len = 0; + t.memsize = 2; + t.writeBit = 0; + swf_SetF16(&t, f); + return u; +} + +double swf_GetD64(TAG*tag) +{ + /* FIXME: this is not big-endian compatible */ + double value = *(double*)&tag->data[tag->pos]; + swf_GetU32(tag); + swf_GetU32(tag); + return value; +} +int swf_SetD64(TAG*tag, double v) +{ + /* FIXME: this is not big-endian compatible */ + swf_SetU32(tag, ((U32*)&v)[0]); + swf_SetU32(tag, ((U32*)&v)[1]); + return 8; +} +int swf_GetU24(TAG*tag) +{ + int b1 = swf_GetU8(tag); + int b2 = swf_GetU8(tag); + int b3 = swf_GetU8(tag); + return b3<<16|b2<<8|b1; +} +int swf_GetS24(TAG*tag) +{ + int b1 = swf_GetU8(tag); + int b2 = swf_GetU8(tag); + int b3 = swf_GetU8(tag); + if(b3&0x80) { + return -1-((b3<<16|b2<<8|b1)^0xffffff); + } else { + return b3<<16|b2<<8|b1; + } +} +int swf_SetU24(TAG*tag, U32 v) +{ + if(tag) { + if(v&0xff000000) + fprintf(stderr, "Error: Overflow in swf_SetU24()\n"); + swf_SetU8(tag, v); + swf_SetU8(tag, v>>8); + swf_SetU8(tag, v>>16); + } + return 3; +} +int swf_SetS24(TAG*tag, U32 v) +{ + if(tag) { + if(!(v&0xff000000)) + return swf_SetU24(tag, v); + if((v&0xff000000)!=0xff000000) { + fprintf(stderr, "Error: Overflow in swf_SetS24()\n"); + } + swf_SetU8(tag, v); + swf_SetU8(tag, v>>8); + swf_SetU8(tag, v>>16); + } + return 3; +} + + +int swf_SetRGB(TAG * t,RGBA * col) +{ if (!t) return -1; + if (col) + { swf_SetU8(t,col->r); + swf_SetU8(t,col->g); + swf_SetU8(t,col->b); + } else swf_SetBlock(t,NULL,3); + return 0; +} +void swf_GetRGB(TAG * t, RGBA * col) +{ + RGBA dummy; + if(!col) + col = &dummy; + col->r = swf_GetU8(t); + col->g = swf_GetU8(t); + col->b = swf_GetU8(t); + col->a = 255; +} + +int swf_SetRGBA(TAG * t,RGBA * col) +{ if (!t) return -1; + if (col) + { swf_SetU8(t,col->r); + swf_SetU8(t,col->g); + swf_SetU8(t,col->b); + swf_SetU8(t,col->a); + } else swf_SetBlock(t,NULL,4); + return 0; +} +void swf_GetRGBA(TAG * t, RGBA * col) +{ + RGBA dummy; + if(!col) + col = &dummy; + col->r = swf_GetU8(t); + col->g = swf_GetU8(t); + col->b = swf_GetU8(t); + col->a = swf_GetU8(t); +} + +void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha) +{ + int t; + if(!tag) { + memset(gradient, 0, sizeof(GRADIENT)); + return; + } + U8 num = swf_GetU8(tag) & 15; + if(gradient) { + gradient->num = num; + gradient->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient->num); + gradient->ratios = (U8*)rfx_calloc(sizeof(gradient->ratios[0])*gradient->num); + } + for(t=0;tratios[t] = ratio; + gradient->rgba[t] = color; + } + } +} + +void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha) +{ + int t; + if(!tag) { + memset(gradient, 0, sizeof(GRADIENT)); + return; + } + swf_SetU8(tag, gradient->num); + for(t=0; t<8 && tnum; t++) + { + swf_SetU8(tag, gradient->ratios[t]); + if(!alpha) + swf_SetRGB(tag, &gradient->rgba[t]); + else + swf_SetRGBA(tag, &gradient->rgba[t]); + } +} + +void swf_FreeGradient(GRADIENT* gradient) +{ + if(gradient->ratios) + rfx_free(gradient->ratios); + if(gradient->rgba) + rfx_free(gradient->rgba); + memset(gradient, 0, sizeof(GRADIENT)); +} + +int swf_CountUBits(U32 v,int nbits) +{ int n = 32; + U32 m = 0x80000000; + if(v == 0x00000000) n = 0; + else + while (!(v&m)) + { n--; + m>>=1; + } + return (n>nbits)?n:nbits; +} + +int swf_CountBits(U32 v,int nbits) +{ int n = 33; + U32 m = 0x80000000; + if (v&m) + { if(v == 0xffffffff) n = 1; + else + while (v&m) + { n--; + m>>=1; + } + } + else + { if(v == 0x00000000) n = 0; + else + while (!(v&m)) + { n--; + m>>=1; + } + } + return (n>nbits)?n:nbits; +} + +int swf_GetRect(TAG * t,SRECT * r) +{ int nbits; + SRECT dummy; + if(!t) {r->xmin=r->xmax=r->ymin=r->ymax=0;return 0;} + if (!r) r = &dummy; + nbits = (int) swf_GetBits(t,5); + r->xmin = swf_GetSBits(t,nbits); + r->xmax = swf_GetSBits(t,nbits); + r->ymin = swf_GetSBits(t,nbits); + r->ymax = swf_GetSBits(t,nbits); + return 0; +} + +int reader_GetRect(reader_t*reader,SRECT * r) +{ int nbits; + SRECT dummy; + if (!r) r = &dummy; + nbits = (int) reader_GetBits(reader,5); + r->xmin = reader_GetSBits(reader,nbits); + r->xmax = reader_GetSBits(reader,nbits); + r->ymin = reader_GetSBits(reader,nbits); + r->ymax = reader_GetSBits(reader,nbits); + return 0; +} + +int swf_SetRect(TAG * t,SRECT * r) +{ int nbits; + + nbits = swf_CountBits(r->xmin,0); + nbits = swf_CountBits(r->xmax,nbits); + nbits = swf_CountBits(r->ymin,nbits); + nbits = swf_CountBits(r->ymax,nbits); + if(nbits>=32) { + #ifdef DEBUG_RFXSWF + fprintf(stderr, "rfxswf: Warning: num_bits overflow in swf_SetRect\n"); + #endif + nbits=31; + } + + swf_SetBits(t,nbits,5); + swf_SetBits(t,r->xmin,nbits); + swf_SetBits(t,r->xmax,nbits); + swf_SetBits(t,r->ymin,nbits); + swf_SetBits(t,r->ymax,nbits); + + return 0; +} + +SRECT swf_ClipRect(SRECT border, SRECT r) +{ + if(r.xmax > border.xmax) r.xmax = border.xmax; + if(r.ymax > border.ymax) r.ymax = border.ymax; + if(r.xmax < border.xmin) r.xmax = border.xmin; + if(r.ymax < border.ymin) r.ymax = border.ymin; + + if(r.xmin > border.xmax) r.xmin = border.xmax; + if(r.ymin > border.ymax) r.ymin = border.ymax; + if(r.xmin < border.xmin) r.xmin = border.xmin; + if(r.ymin < border.ymin) r.ymin = border.ymin; + return r; +} + +void swf_ExpandRect(SRECT*src, SPOINT add) +{ + if((src->xmin | src->ymin | src->xmax | src->ymax)==0) { + src->xmin = add.x; + src->ymin = add.y; + src->xmax = add.x; + src->ymax = add.y; + if((add.x|add.y) == 0) src->xmax++; //make sure the bbox is not NULL anymore + return; + } + if(add.x < src->xmin) + src->xmin = add.x; + if(add.x > src->xmax) + src->xmax = add.x; + if(add.y < src->ymin) + src->ymin = add.y; + if(add.y > src->ymax) + src->ymax = add.y; +} +void swf_ExpandRect2(SRECT*src, SRECT*add) +{ + if((add->xmin | add->ymin | add->xmax | add->ymax)==0) + return; + if((src->xmin | src->ymin | src->xmax | src->ymax)==0) + *src = *add; + if(add->xmin < src->xmin) + src->xmin = add->xmin; + if(add->ymin < src->ymin) + src->ymin = add->ymin; + if(add->xmax > src->xmax) + src->xmax = add->xmax; + if(add->ymax > src->ymax) + src->ymax = add->ymax; +} +void swf_ExpandRect3(SRECT*src, SPOINT center, int radius) +{ + if((src->xmin | src->ymin | src->xmax | src->ymax)==0) { + src->xmin = center.x-radius; + src->ymin = center.y-radius; + src->xmax = center.x+radius; + src->ymax = center.y+radius; + if((center.x|center.y|radius) == 0) src->xmax++; //make sure the bbox is not NULL anymore + return; + } + if(center.x - radius < src->xmin) + src->xmin = center.x - radius; + if(center.x + radius > src->xmax) + src->xmax = center.x + radius; + if(center.y - radius < src->ymin) + src->ymin = center.y - radius; + if(center.y + radius > src->ymax) + src->ymax = center.y + radius; +} +SPOINT swf_TurnPoint(SPOINT p, MATRIX* m) +{ + SPOINT r; + r.x = (int)(m->sx*(1/65536.0)*p.x + m->r1*(1/65536.0)*p.y + 0.5) + m->tx; + r.y = (int)(m->r0*(1/65536.0)*p.x + m->sy*(1/65536.0)*p.y + 0.5) + m->ty; + return r; +} +SRECT swf_TurnRect(SRECT r, MATRIX* m) +{ + SRECT g; + SPOINT p1,p2,p3,p4,pp1,pp2,pp3,pp4; + if(!m) + return r; + p1.x = r.xmin;p1.y = r.ymin; + p2.x = r.xmax;p2.y = r.ymin; + p3.x = r.xmin;p3.y = r.ymax; + p4.x = r.xmax;p4.y = r.ymax; + pp1 = swf_TurnPoint(p1, m); + pp2 = swf_TurnPoint(p2, m); + pp3 = swf_TurnPoint(p3, m); + pp4 = swf_TurnPoint(p4, m); + g.xmin = g.xmax = pp1.x; + g.ymin = g.ymax = pp1.y; + swf_ExpandRect(&g, pp2); + swf_ExpandRect(&g, pp3); + swf_ExpandRect(&g, pp4); + return g; +} + + +int swf_GetMatrix(TAG * t,MATRIX * m) +{ MATRIX dummy; + int nbits; + + if (!m) m = &dummy; + + if (!t) + { m->sx = m->sy = 0x10000; + m->r0 = m->r1 = 0; + m->tx = m->ty = 0; + return -1; + } + + swf_ResetReadBits(t); + + if (swf_GetBits(t,1)) + { nbits = swf_GetBits(t,5); + m->sx = swf_GetSBits(t,nbits); + m->sy = swf_GetSBits(t,nbits); + } + else m->sx = m->sy = 0x10000; + + if (swf_GetBits(t,1)) + { nbits = swf_GetBits(t,5); + m->r0 = swf_GetSBits(t,nbits); + m->r1 = swf_GetSBits(t,nbits); + } + else m->r0 = m->r1 = 0x0; + + nbits = swf_GetBits(t,5); + m->tx = swf_GetSBits(t,nbits); + m->ty = swf_GetSBits(t,nbits); + + return 0; +} + +int swf_SetMatrix(TAG * t,MATRIX * m) +{ int nbits; + MATRIX ma; + + if (!m) + { m = &ma; + ma.sx = ma.sy = 0x10000; + ma.r0 = ma.r1 = 0; + ma.tx = ma.ty = 0; + } + + swf_ResetWriteBits(t); + + if ((m->sx==0x10000)&&(m->sy==0x10000)) swf_SetBits(t,0,1); + else + { swf_SetBits(t,1,1); + nbits = swf_CountBits(m->sx,0); + nbits = swf_CountBits(m->sy,nbits); + if(nbits>=32) { + /* TODO: happens on AMD64 systems for normal values? */ + #ifdef DEBUG_RFXSWF + fprintf(stderr,"rfxswf: Error: matrix values too large\n"); + #endif + nbits = 31; + } + swf_SetBits(t,nbits,5); + swf_SetBits(t,m->sx,nbits); + swf_SetBits(t,m->sy,nbits); + } + + if ((!m->r0)&&(!m->r1)) swf_SetBits(t,0,1); + else + { swf_SetBits(t,1,1); + nbits = swf_CountBits(m->r0,0); + nbits = swf_CountBits(m->r1,nbits); + if(nbits>=32) { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"rfxswf: Error: matrix values too large\n"); + #endif + nbits = 31; + } + swf_SetBits(t,nbits,5); + swf_SetBits(t,m->r0,nbits); + swf_SetBits(t,m->r1,nbits); + } + + nbits = swf_CountBits(m->tx,0); + nbits = swf_CountBits(m->ty,nbits); + if(nbits>=32) { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"rfxswf: Error: matrix values too large\n"); + #endif + nbits = 31; + } + swf_SetBits(t,nbits,5); + swf_SetBits(t,m->tx,nbits); + swf_SetBits(t,m->ty,nbits); + + return 0; +} + +int swf_GetCXForm(TAG * t,CXFORM * cx,U8 alpha) +{ CXFORM cxf; + int hasadd; + int hasmul; + int nbits; + + if (!cx) cx = &cxf; + + cx->a0 = cx->r0 = cx->g0 = cx->b0 = 256; + cx->a1 = cx->r1 = cx->g1 = cx->b1 = 0; + + if (!t) return 0; + + swf_ResetReadBits(t); + hasadd = swf_GetBits(t,1); + hasmul = swf_GetBits(t,1); + nbits = swf_GetBits(t,4); + + if (hasmul) + { cx->r0 = (S16)swf_GetSBits(t,nbits); + cx->g0 = (S16)swf_GetSBits(t,nbits); + cx->b0 = (S16)swf_GetSBits(t,nbits); + if (alpha) + cx->a0 = (S16)swf_GetSBits(t,nbits); + } + + if (hasadd) + { cx->r1 = (S16)swf_GetSBits(t,nbits); + cx->g1 = (S16)swf_GetSBits(t,nbits); + cx->b1 = (S16)swf_GetSBits(t,nbits); + if (alpha) + cx->a1 = (S16)swf_GetSBits(t,nbits); + } + + return 0; +} + +int swf_SetCXForm(TAG * t,CXFORM * cx,U8 alpha) +{ CXFORM cxf; + int hasadd; + int hasmul; + int nbits; + + if (!cx) + { cx = &cxf; + cx->a0 = cx->r0 = cx->g0 = cx->b0 = 256; + cx->a1 = cx->r1 = cx->g1 = cx->b1 = 0; + } + + if (!alpha) + { cx->a0 = 256; + cx->a1 = 0; + } + + nbits = 0; + + hasmul = (cx->a0!=256)||(cx->r0!=256)||(cx->g0!=256)||(cx->b0!=256); + hasadd = cx->a1|cx->r1|cx->g1|cx->b1; + + if (hasmul) + { if (alpha) nbits = swf_CountBits((S32)cx->a0,nbits); + nbits = swf_CountBits((S32)cx->r0,nbits); + nbits = swf_CountBits((S32)cx->g0,nbits); + nbits = swf_CountBits((S32)cx->b0,nbits); + } + + if (hasadd) + { if (alpha) nbits = swf_CountBits((S32)cx->a1,nbits); + nbits = swf_CountBits((S32)cx->r1,nbits); + nbits = swf_CountBits((S32)cx->g1,nbits); + nbits = swf_CountBits((S32)cx->b1,nbits); + } + + swf_ResetWriteBits(t); + swf_SetBits(t,hasadd?1:0,1); + swf_SetBits(t,hasmul?1:0,1); + swf_SetBits(t,nbits,4); + + if (hasmul) + { swf_SetBits(t,cx->r0,nbits); + swf_SetBits(t,cx->g0,nbits); + swf_SetBits(t,cx->b0,nbits); + if (alpha) swf_SetBits(t,cx->a0,nbits); + } + + if (hasadd) + { swf_SetBits(t,cx->r1,nbits); + swf_SetBits(t,cx->g1,nbits); + swf_SetBits(t,cx->b1,nbits); + if (alpha) swf_SetBits(t,cx->a1,nbits); + } + + return 0; +} + +//int swf_GetPoint(TAG * t,SPOINT * p) { return 0; } +//int swf_SetPoint(TAG * t,SPOINT * p) { return 0; } + +void swf_SetPassword(TAG * t, const char * password) +{ +#ifdef HAVE_MD5 + /* WARNING: crypt_md5 is not reentrant */ + char salt[3]; + char* md5string; + +#if defined(HAVE_LRAND48) && defined(HAVE_SRAND48) && defined(HAVE_TIME_H) && defined(HAVE_TIME) + srand48(time(0)); + salt[0] = "abcdefghijklmnopqrstuvwxyz0123456789"[lrand48()%36]; + salt[1] = "abcdefghijklmnopqrstuvwxyz0123456789"[lrand48()%36]; +#else + salt[0] = 'l'; + salt[1] = '8'; + fprintf(stderr, "rfxswf: Warning- no usable random generator found\n"); + fprintf(stderr, "Your password will be vulnerable to dictionary attacks\n"); +#endif + salt[2] = 0; + + md5string = crypt_md5(password, salt); + + swf_SetU16(t,0); + swf_SetString(t, md5string); +#else + fprintf(stderr, "Error: No MD5 compiled in"); +#endif +} + +void swf_SetString(TAG*t, const char* s) +{ + if(!s) { + swf_SetU8(t, 0); + } else { + swf_SetBlock(t,(U8*)s,strlen(s)+1); + } +} + +int swf_VerifyPassword(TAG * t, const char * password) +{ +#ifdef HAVE_MD5 + char*md5string1, *md5string2; + char*x; + char*salt; + int n; + + if(t->len >= 5 && t->pos==0 && + t->data[0] == 0 && + t->data[1] == 0) { + swf_GetU16(t); + } else { + printf("%d %d %d %d\n", t->len, t->pos, t->data[0], t->data[1]); + } + + md5string1 = swf_GetString(t); + + if(strncmp(md5string1, "$1$",3 )) { + fprintf(stderr, "rfxswf: no salt in pw string\n"); + return 0; + } + x = strchr(md5string1+3, '$'); + if(!x) { + fprintf(stderr, "rfxswf: invalid salt format in pw string\n"); + return 0; + } + n = x-(md5string1+3); + salt = (char*)rfx_alloc(n+1); + memcpy(salt, md5string1+3, n); + salt[n] = 0; + + md5string2 = crypt_md5(password, salt); + rfx_free(salt); + if(strcmp(md5string1, md5string2) != 0) + return 0; + return 1; +#else + fprintf(stderr, "Error: No MD5 compiled in"); + return 1; +#endif +} + +// Tag List Manipulating Functions + +TAG * swf_InsertTag(TAG * after,U16 id) +{ TAG * t; + + t = (TAG *)rfx_calloc(sizeof(TAG)); + t->id = id; + + if (after) + { + t->prev = after; + t->next = after->next; + after->next = t; + if (t->next) t->next->prev = t; + } + return t; +} + +TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id) +{ TAG * t; + + t = (TAG *)rfx_calloc(sizeof(TAG)); + t->id = id; + + if (before) + { + t->next = before; + t->prev = before->prev; + before->prev = t; + if (t->prev) t->prev->next = t; + } + if(swf && swf->firstTag == before) { + swf->firstTag = t; + } + return t; +} + +void swf_ClearTag(TAG * t) +{ + if (t->data) rfx_free(t->data); + t->data = 0; + t->pos = 0; + t->len = 0; + t->readBit = 0; + t->writeBit = 0; + t->memsize = 0; +} + +void swf_ResetTag(TAG*tag, U16 id) +{ + tag->len = tag->pos = tag->readBit = tag->writeBit = 0; + tag->id = id; +} + +TAG* swf_CopyTag(TAG*tag, TAG*to_copy) +{ + tag = swf_InsertTag(tag, to_copy->id); + swf_SetBlock(tag, to_copy->data, to_copy->len); + return tag; +} + +TAG* swf_DeleteTag(SWF*swf, TAG * t) +{ + TAG*next = t->next; + + if (swf && swf->firstTag==t) + swf->firstTag = t->next; + if (t->prev) t->prev->next = t->next; + if (t->next) t->next->prev = t->prev; + + if (t->data) rfx_free(t->data); + rfx_free(t); + return next; +} + +TAG * swf_ReadTag(reader_t*reader, TAG * prev) +{ TAG * t; + U16 raw; + U32 len; + int id; + + if (reader->read(reader, &raw, 2) !=2 ) return NULL; + raw = LE_16_TO_NATIVE(raw); + + len = raw&0x3f; + id = raw>>6; + + if (len==0x3f) + { + len = reader_readU32(reader); + } + + if (id==ST_DEFINESPRITE) len = 2*sizeof(U16); + // Sprite handling fix: Flatten sprite tree + + t = (TAG *)rfx_calloc(sizeof(TAG)); + + t->len = len; + t->id = id; + + if (t->len) + { t->data = (U8*)rfx_alloc(t->len); + t->memsize = t->len; + if (reader->read(reader, t->data, t->len) != t->len) { + #ifdef DEBUG_RFXSWF + fprintf(stderr, "rfxswf: Warning: Short read (tagid %d). File truncated?\n", t->id); + #endif + free(t->data);t->data=0; + free(t); + return NULL; + } + } + + if (prev) + { + t->prev = prev; + prev->next = t; + } + + return t; +} + +int swf_DefineSprite_GetRealSize(TAG * t); + +int swf_WriteTag2(writer_t*writer, TAG * t) +// returns tag length in bytes (incl. Header), -1 = Error +// writer = 0 -> no output +{ U16 raw[3]; + U32 len; + int short_tag; + + if (!t) return -1; + + len = (t->id==ST_DEFINESPRITE)?swf_DefineSprite_GetRealSize(t):t->len; + + short_tag = len<0x3f&& + (t->id!=ST_DEFINEBITSLOSSLESS&&t->id!=ST_DEFINEBITSLOSSLESS2&&t->id!=ST_SOUNDSTREAMBLOCK&& + t->id!=ST_DEFINEBITSJPEG&&t->id!=ST_DEFINEBITSJPEG2&&t->id!=ST_DEFINEBITSJPEG3); + + if (writer) + { +#ifdef MEASURE + int oldpos = writer->pos; +#endif + + if (short_tag) + { raw[0] = LE_16_TO_NATIVE(len|((t->id&0x3ff)<<6)); + if (writer->write(writer,raw,2)!=2) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"WriteTag() failed: Short Header.\n"); + #endif + return -1; + } + } + else + { + raw[0] = LE_16_TO_NATIVE((t->id<<6)|0x3f); + if (writer->write(writer,raw,2)!=2) + { +#ifdef DEBUG_RFXSWF + fprintf(stderr,"WriteTag() failed: Long Header (1).\n"); +#endif + return -1; + } + + writer_writeU32(writer, len); + } + + if (t->data) + { if (writer->write(writer,t->data,t->len)!=t->len) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr,"WriteTag() failed: Data.\n"); + #endif + return -1; + } + } + #ifdef DEBUG_RFXSWF + else if (t->len) fprintf(stderr,"WriteTag(): Tag Data Error, id=%i\n",t->id); + #endif + +#ifdef MEASURE + writer->flush(writer); + printf("TAG %s costs %d bytes\n", swf_TagGetName(t), writer->pos-oldpos); +#endif + } + + return t->len+(short_tag?2:6); +} + +int swf_WriteTag(int handle, TAG * t) +{ + writer_t writer; + int len = 0; + if(handle<0) + return swf_WriteTag2(0, t); + writer_init_filewriter(&writer, handle); + len = swf_WriteTag2(&writer, t); + writer.finish(&writer); + return len; +} + +int swf_DefineSprite_GetRealSize(TAG * t) +// Sprite Handling: Helper function to pack DefineSprite-Tag +{ U32 len = t->len; + if(len>4) { // folded sprite + return t->len; + } + do + { t = swf_NextTag(t); + if (t && t->id!=ST_DEFINESPRITE) len += swf_WriteTag(-1, t); + else t = NULL; + } while (t&&(t->id!=ST_END)); + return len; +} + +void swf_UnFoldSprite(TAG * t) +{ + U16 id,tmp; + U32 len; + TAG*next = t; + U16 spriteid,spriteframes; + int level; + if(t->id!=ST_DEFINESPRITE) + return; + if(t->len<=4) // not folded + return; + + swf_SetTagPos(t,0); + + spriteid = swf_GetU16(t); //id + spriteframes = swf_GetU16(t); //frames + + level = 1; + + while(1) + { + TAG*it = 0; + tmp = swf_GetU16(t); + len = tmp&0x3f; + id = tmp>>6; + if(id == ST_END) + level--; + if(id == ST_DEFINESPRITE && len<=4) + level++; + + if (len==0x3f) + len = swf_GetU32(t); + it = swf_InsertTag(next, id); + next = it; + it->len = len; + it->id = id; + if (it->len) + { it->data = (U8*)rfx_alloc(it->len); + it->memsize = it->len; + swf_GetBlock(t, it->data, it->len); + } + + if(!level) + break; + } + + rfx_free(t->data); t->data = 0; + t->memsize = t->len = t->pos = 0; + + swf_SetU16(t, spriteid); + swf_SetU16(t, spriteframes); +} + +void swf_FoldSprite(TAG * t) +{ + TAG*sprtag=t,*tmp; + U16 id,frames; + int level; + if(t->id!=ST_DEFINESPRITE) + return; + if(!t->len) { + #ifdef DEBUG_RFXSWF + fprintf(stderr, "Error: Sprite has no ID!"); + #endif + return; + } + if(t->len>4) { + /* sprite is already folded */ + return; + } + + t->pos = 0; + id = swf_GetU16(t); + rfx_free(t->data); + t->len = t->pos = t->memsize = 0; + t->data = 0; + + frames = 0; + + t = swf_NextTag(sprtag); + level = 1; + + do + { + if(t->id==ST_SHOWFRAME) frames++; + if(t->id == ST_DEFINESPRITE && t->len<=4) + level++; + if(t->id == ST_END) + level--; + t = swf_NextTag(t); + } while(t && level); + if(level) + fprintf(stderr, "rfxswf error: sprite doesn't end(1)\n"); + + swf_SetU16(sprtag, id); + swf_SetU16(sprtag, frames); + + t = swf_NextTag(sprtag); + level = 1; + + do + { + if(t->len<0x3f&& + (t->id!=ST_DEFINEBITSLOSSLESS&&t->id!=ST_DEFINEBITSLOSSLESS2&&t->id!=ST_SOUNDSTREAMBLOCK&& + t->id!=ST_DEFINEBITSJPEG&&t->id!=ST_DEFINEBITSJPEG2&&t->id!=ST_DEFINEBITSJPEG3) + ) { + swf_SetU16(sprtag,t->len|(t->id<<6)); + } else { + swf_SetU16(sprtag,0x3f|(t->id<<6)); + swf_SetU32(sprtag,t->len); + } + if(t->len) + swf_SetBlock(sprtag,t->data, t->len); + tmp = t; + if(t->id == ST_DEFINESPRITE && t->len<=4) + level++; + if(t->id == ST_END) + level--; + t = swf_NextTag(t); + swf_DeleteTag(0, tmp); + } + while (t && level); + if(level) + fprintf(stderr, "rfxswf error: sprite doesn't end(2)\n"); + +// sprtag->next = t; +// t->prev = sprtag; +} + +int swf_IsFolded(TAG * t) +{ + return (t->id == ST_DEFINESPRITE && t->len>4); +} + +void swf_FoldAll(SWF*swf) +{ + TAG*tag = swf->firstTag; + //swf_DumpSWF(stdout, swf); + while(tag) { + if(tag->id == ST_DEFINESPRITE) { + swf_FoldSprite(tag); + //swf_DumpSWF(stdout, swf); + } + tag = swf_NextTag(tag); + } +} + +void swf_UnFoldAll(SWF*swf) +{ + TAG*tag = swf->firstTag; + while(tag) { + if(tag->id == ST_DEFINESPRITE) + swf_UnFoldSprite(tag); + tag = tag->next; + } +} + +void swf_OptimizeTagOrder(SWF*swf) +{ + TAG*tag,*next; + TAG*level0; + int level; + int changes; + swf_UnFoldAll(swf); + /* at the moment, we don't actually do optimizing, + only fixing of non-spec-conformant things like + sprite tags */ + + do { + changes = 0; + level = 0; + level0 = 0; + tag = swf->firstTag; + while(tag) { + next = tag->next; + if(tag->id == ST_DEFINESPRITE) { + if(tag->len>4) { + /* ??? all sprites are supposed to be unfolded */ + fprintf(stderr, "librfxswf error - internal error in OptimizeTagOrder/UnfoldAll\n"); + } + level++; + if(level==1) { + level0 = tag; + tag = next; + continue; + } + } + if(level>=1) { + /* move non-sprite tags out of sprite */ + if(!swf_isAllowedSpriteTag(tag) || level>=2) { + /* remove tag from current position */ + tag->prev->next = tag->next; + if(tag->next) + tag->next->prev = tag->prev; + + /* insert before tag level0 */ + tag->next = level0; + tag->prev = level0->prev; + level0->prev = tag; + if(tag->prev) + tag->prev->next = tag; + else + swf->firstTag = tag; + changes = 1; + } + } + if(tag->id == ST_END) { + level--; + } + + tag = next; + } + } while(changes); +} + +// Movie Functions + +int swf_ReadSWF2(reader_t*reader, SWF * swf) // Reads SWF to memory (malloc'ed), returns length or <0 if fails +{ + if (!swf) return -1; + memset(swf,0x00,sizeof(SWF)); + + { char b[32]; // read Header + int len; + TAG * t; + TAG t1; + reader_t zreader; + + if ((len = reader->read(reader ,b,8))<8) return -1; + + if (b[0]!='F' && b[0]!='C') return -1; + if (b[1]!='W') return -1; + if (b[2]!='S') return -1; + swf->fileVersion = b[3]; + swf->compressed = (b[0]=='C')?1:0; + swf->fileSize = GET32(&b[4]); + + if(swf->compressed) { + reader_init_zlibinflate(&zreader, reader); + reader = &zreader; + } + swf->compressed = 0; // derive from version number from now on + + reader_GetRect(reader, &swf->movieSize); + reader->read(reader, &swf->frameRate, 2); + swf->frameRate = LE_16_TO_NATIVE(swf->frameRate); + reader->read(reader, &swf->frameCount, 2); + swf->frameCount = LE_16_TO_NATIVE(swf->frameCount); + + /* read tags and connect to list */ + t1.next = 0; + t = &t1; + while (t) { + t = swf_ReadTag(reader,t); + if(t && t->id == ST_FILEATTRIBUTES) { + swf->fileAttributes = swf_GetU32(t); + swf_ResetReadBits(t); + } + } + swf->firstTag = t1.next; + if(t1.next) + t1.next->prev = NULL; + } + + return reader->pos; +} + +SWF* swf_OpenSWF(char*filename) +{ + int fi = open(filename, O_RDONLY|O_BINARY); + if(fi<0) { + fprintf(stderr, "Failed to open %s\n", filename); + return 0; + } + SWF* swf = rfx_alloc(sizeof(SWF)); + swf_ReadSWF(fi, swf); + close(fi); + return swf; +} + +int swf_ReadSWF(int handle, SWF * swf) +{ + reader_t reader; + reader_init_filereader(&reader, handle); + return swf_ReadSWF2(&reader, swf); +} + +void swf_ReadABCfile(char*filename, SWF*swf) +{ + memset(swf, 0, sizeof(SWF)); + swf->fileVersion=9; + swf->fileAttributes=FILEATTRIBUTE_AS3; //as3 + TAG*tag = swf->firstTag = swf_InsertTag(0, ST_RAWABC); + memfile_t*file = memfile_open(filename); + swf_SetBlock(tag, file->data, file->len); + memfile_close(file); +} + +int no_extra_tags = 0; + +int WriteExtraTags(SWF*swf, writer_t*writer) +{ + TAG*t = swf->firstTag; + TAG* has_fileattributes=0; + int has_scenedescription=0; + int has_version_8_action=0; + int has_version_9_action=0; + int len = 0; + while(t) { + if(t->id == ST_FILEATTRIBUTES) + has_fileattributes = t; + if(t->id == ST_SCENEDESCRIPTION) + has_scenedescription = 1; + if(t->id == ST_DOABC) + has_version_9_action=1; + /* FIXME: this doesn't yet find actionscript in buttons */ + if(t->id == ST_DOACTION || t->id == ST_DOINITACTION) + has_version_8_action=1; + if(t->id == ST_PLACEOBJECT2 && t->len && (t->data[0]&0x80)) + has_version_8_action=1; + t = t->next; + } + if(has_version_8_action && has_version_9_action) { + fprintf(stderr, "Warning: File contains both flash 8 and flash 9 actionscript\n"); + } + + if(swf->fileVersion >= 9) { + if(!has_fileattributes) { + U32 flags = swf->fileAttributes|FILEATTRIBUTE_AS3; // 16 = has symbolclass tag | 8 = actionscript3 | 1 = usenetwork + if(has_version_8_action && !has_version_9_action) + flags &= ~FILEATTRIBUTE_AS3; + TAG*fileattrib = swf_InsertTag(0, ST_FILEATTRIBUTES); + swf_SetU32(fileattrib, flags); + if(writer) { + if(swf_WriteTag2(writer, fileattrib)<0) + return -1; + } else { + len += swf_WriteTag(-1,fileattrib); + } + swf_DeleteTag(0, fileattrib); + } else { + if(swf->fileAttributes) { + /* if we're writing a file out again where we might have possible + modified the fileattributes in the header, adjust the tag data */ + TAG*tt = swf_CopyTag(0,has_fileattributes); + U32 flags = swf_GetU32(tt) | swf->fileAttributes; + swf_ResetTag(tt, tt->id); + swf_SetU32(tt, flags); + if(swf_WriteTag2(writer, has_fileattributes)<0) return -1; + swf_DeleteTag(0, tt); + } else { + if(swf_WriteTag2(writer, has_fileattributes)<0) + return -1; + } + } + if(0 && !has_scenedescription) { + TAG*scene = swf_InsertTag(0, ST_SCENEDESCRIPTION); + swf_SetU16(scene, 1); + swf_SetString(scene, "Scene 1"); + swf_SetU8(scene, 0); + if(writer) { + if(swf_WriteTag2(writer, scene)<0) + return -1; + } else { + len += swf_WriteTag(-1,scene); + } + swf_DeleteTag(0, scene); + } + } + return len; +} + +int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, returns length or <0 if fails +{ U32 len; + TAG * t; + int frameCount=0; + writer_t zwriter; + int fileSize = 0; + int inSprite = 0; + int ret; + writer_t*original_writer = writer; + int writer_lastpos = 0; + + if (!swf) return -1; + if (!writer) return -1; // the caller should provide a nullwriter, not 0, for querying SWF size + + if(original_writer) writer_lastpos = original_writer->pos; + + // Count Frames + File Size + + len = 0; + t = swf->firstTag; + frameCount = 0; + + if(swf->firstTag && !no_extra_tags) { + len += WriteExtraTags(swf, 0); + } + while(t) { + len += swf_WriteTag(-1,t); + if(t->id == ST_DEFINESPRITE && !swf_IsFolded(t)) inSprite++; + else if(t->id == ST_END && inSprite) inSprite--; + else if(t->id == ST_END && !inSprite) { + if(t->prev && t->prev->id!=ST_SHOWFRAME) + frameCount++; + } + else if(t->id == ST_SHOWFRAME && !inSprite) frameCount++; + t = swf_NextTag(t); + } + + { TAG t1; + char b[64],b4[4]; + U32 l; + + memset(&t1,0x00,sizeof(TAG)); + t1.data = (U8*)b; + t1.memsize = 64; + + { // measure header file size + TAG t2; + char b2[64]; + memset(&t2,0x00,sizeof(TAG)); + t2.data = (U8*)b2; + t2.memsize = 64; + swf_SetRect(&t2, &swf->movieSize); + swf_SetU16(&t2, swf->frameRate); + swf_SetU16(&t2, swf->frameCount); + l = swf_GetTagLen(&t2)+8; + } + if(swf->compressed == 8) { + l -= 8; + } + + fileSize = l+len; + if(len) {// don't touch headers without tags + swf->fileSize = fileSize; + swf->frameCount = frameCount; + } + + if(swf->compressed != 8) { + /* compressed flag set to 8 means "skip first 8 + header bytes". This is necessary if the caller wants to + create compressed SWFs himself . + It also means that we don't initialize our own zlib + writer, but assume the caller provided one. + */ + if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6)) { + char*id = "CWS"; + writer->write(writer, id, 3); + } else { + char*id = "FWS"; + writer->write(writer, id, 3); + } + + writer->write(writer, &swf->fileVersion, 1); + PUT32(b4, swf->fileSize); + writer->write(writer, b4, 4); + + if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6)) { + writer_init_zlibdeflate(&zwriter, writer); + writer = &zwriter; + } + } + + swf_SetRect(&t1,&swf->movieSize); + swf_SetU16(&t1,swf->frameRate); + swf_SetU16(&t1,swf->frameCount); + + ret = writer->write(writer,b,swf_GetTagLen(&t1)); + if (ret!=swf_GetTagLen(&t1)) + { + #ifdef DEBUG_RFXSWF + fprintf(stderr, "ret:%d\n",ret); + perror("write:"); + fprintf(stderr,"WriteSWF() failed: Header.\n"); + #endif + return -1; + } + + if(swf->firstTag && !no_extra_tags) { + WriteExtraTags(swf, writer); + } + t = swf->firstTag; + + while (t) { + if(no_extra_tags || t->id != ST_FILEATTRIBUTES) { + if(swf_WriteTag2(writer, t)<0) + return -1; + } + t = t->next; + } + if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6) || swf->compressed==8) { + if(swf->compressed != 8) { + zwriter.finish(&zwriter); + return original_writer->pos - writer_lastpos; + } + return (int)fileSize; + } else { + return (int)fileSize; + } + } +} + +int swf_SaveSWF(SWF * swf, char*filename) +{ + int fi = open(filename, O_BINARY|O_RDWR|O_TRUNC|O_CREAT, 0777); + if(fi<0) { + perror(filename); + return 0; + } + if(swf_WriteSWF(fi, swf)<0) { + fprintf(stderr, "Unable to write output file: %s\n", filename); + return 0; + } + close(fi); + return 1; +} + +int swf_WriteSWF(int handle, SWF * swf) // Writes SWF to file, returns length or <0 if fails +{ + writer_t writer; + int len = 0; + + if(handle<0) { + writer_init_nullwriter(&writer); + len = swf_WriteSWF2(&writer, swf); + return len; + } + writer_init_filewriter(&writer, handle); + len = swf_WriteSWF2(&writer, swf); + writer.finish(&writer); + return len; +} + +int swf_WriteHeader2(writer_t*writer,SWF * swf) +{ + SWF myswf; + memcpy(&myswf,swf,sizeof(SWF)); + myswf.firstTag = 0; + return swf_WriteSWF2(writer, &myswf); +} + +int swf_WriteHeader(int handle,SWF * swf) +{ + SWF myswf; + memcpy(&myswf,swf,sizeof(SWF)); + myswf.firstTag = 0; + return swf_WriteSWF(handle, &myswf); +} + +int swf_WriteCGI(SWF * swf) +{ int len; + char s[1024]; + + len = swf_WriteSWF(-1,swf); + + if (len<0) return -1; + + sprintf(s,"Content-type: application/x-shockwave-flash\n" + "Accept-Ranges: bytes\n" + "Content-Length: %d\n" + "Expires: Thu, 13 Apr 2000 23:59:59 GMT\n" + "\n",len); + + write(fileno(stdout),s,strlen(s)); + return swf_WriteSWF(fileno(stdout),swf); +} + +SWF* swf_CopySWF(SWF*swf) +{ + SWF*nswf = (SWF*)rfx_alloc(sizeof(SWF)); + TAG*tag, *ntag; + memcpy(nswf, swf, sizeof(SWF)); + nswf->firstTag = 0; + tag = swf->firstTag; + ntag = 0; + while(tag) { + ntag = swf_CopyTag(ntag, tag); + if(!nswf->firstTag) + nswf->firstTag = ntag; + tag = tag->next; + } + return nswf; +} + +void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for tags +{ TAG * t = swf->firstTag; + + while (t) + { TAG * tnew = t->next; + if (t->data) rfx_free(t->data); + rfx_free(t); + t = tnew; + } + swf->firstTag = 0; +} + +// include advanced functions + +//#include "modules/swfdump.c" +//#include "modules/swfshape.c" +//#include "modules/swftext.c" +//#include "modules/swffont.c" +//#include "modules/swfobject.c" +//#include "modules/swfbutton.c" +//#include "modules/swftools.c" +//#include "modules/swfcgi.c" +//#include "modules/swfbits.c" +//#include "modules/swfaction.c" +//#include "modules/swfabc.c" +//#include "modules/swfsound.c" +//#include "modules/swfdraw.c" +//#include "modules/swfrender.c" +//#include "modules/swffilter.c" diff --git a/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h b/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h new file mode 100644 index 000000000..20d350286 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h @@ -0,0 +1,1209 @@ +/* rfxswf.h + + Headers for rfxswf.c and modules + + Part of the swftools package. + + Copyright (c) 2000, 2001 Rainer Böhme + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + + +#ifndef __RFX_SWF_INCLUDED__ +#define __RFX_SWF_INCLUDED__ + +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include +#include "../config.h" +#include "./bitio.h" +#include "./drawer.h" +#include "./mem.h" +#include "./types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DEBUG_RFXSWF +#ifdef RFXSWF_DISABLESOUND +#define NO_MP3 +#endif + +typedef signed SFIXED; +typedef signed SCOORD; + +#define SCOORD_MAX 0x7fffffffl +#define SCOORD_MIN -0x80000000l + +// Basic Structures + +typedef struct _SPOINT +{ SCOORD x; + SCOORD y; +} SPOINT; + +typedef struct _RGBA +{ U8 a; + U8 r; + U8 g; + U8 b; +} RGBA; + +typedef struct _YUV +{ + U8 y,u,v; +} YUV; + +typedef struct _SRECT +{ SCOORD xmin; + SCOORD ymin; + SCOORD xmax; + SCOORD ymax; +} SRECT; + +typedef struct _MATRIX +{ SFIXED sx,r1, tx; + SFIXED r0,sy, ty; +} MATRIX; + +typedef struct _CXFORM +{ S16 a0, a1; /* mult, add */ + S16 r0, r1; + S16 g0, g1; + S16 b0, b1; +} CXFORM; + +#define GRADIENT_LINEAR 0x10 +#define GRADIENT_RADIAL 0x12 +typedef struct _GRADIENT +{ + int num; + U8* ratios; + RGBA* rgba; +} GRADIENT; + +typedef struct _FILTER +{ + U8 type; +} FILTER; + +typedef struct _FILTERLIST +{ + int num; + FILTER*filter[8]; +} FILTERLIST; + +typedef struct _TAG // NEVER access a Tag-Struct directly ! +{ U16 id; + U8 * data; + U32 memsize; // to minimize realloc() calls + + U32 len; // for Set-Access + U32 pos; // for Get-Access + + struct _TAG * next; + struct _TAG * prev; + + U8 readBit; // for Bit-Manipulating Functions [read] + U8 writeBit; // [write] + +} TAG; + +#define swf_ResetReadBits(tag) if (tag->readBit) { tag->pos++; tag->readBit = 0; } +#define swf_ResetWriteBits(tag) if (tag->writeBit) { tag->writeBit = 0; } + +typedef struct _SOUNDINFO +{ + U8 stop; + U8 nomultiple; //continue playing if already started + + U32 inpoint; + U32 outpoint; + + U16 loops; + U8 envelopes; + + //envelope: + U32* pos; + U32* left; + U32* right; +} SOUNDINFO; + +#define FILEATTRIBUTE_USENETWORK 1 +#define FILEATTRIBUTE_AS3 8 +#define FILEATTRIBUTE_SYMBOLCLASS 16 +#define FILEATTRIBUTE_USEACCELERATEDBLIT 32 +#define FILEATTRIBUTE_USEHARDWAREGPU 64 + +typedef struct _SWF +{ U8 fileVersion; + U8 compressed; // SWF or SWC? + U32 fileSize; // valid after load and save + SRECT movieSize; + U16 frameRate; + U16 frameCount; // valid after load and save + TAG * firstTag; + U32 fileAttributes; // for SWFs >= Flash9 +} SWF; + +// Basic Functions + +SWF* swf_OpenSWF(char*filename); +int swf_ReadSWF2(reader_t*reader, SWF * swf); // Reads SWF via callback +int swf_ReadSWF(int handle,SWF * swf); // Reads SWF to memory (malloc'ed), returns length or <0 if fails +int swf_WriteSWF2(writer_t*writer, SWF * swf); // Writes SWF via callback, returns length or <0 if fails +int swf_WriteSWF(int handle,SWF * swf); // Writes SWF to file, returns length or <0 if fails +int swf_SaveSWF(SWF * swf, char*filename); +int swf_WriteCGI(SWF * swf); // Outputs SWF with valid CGI header to stdout +void swf_FreeTags(SWF * swf); // Frees all malloc'ed memory for swf +SWF* swf_CopySWF(SWF*swf); +void swf_ReadABCfile(char*filename, SWF*swf); + +// for streaming: +int swf_WriteHeader(int handle,SWF * swf); // Writes Header of swf to file +int swf_WriteHeader2(writer_t*writer,SWF * swf); // Writes Header of swf to file +int swf_WriteTag(int handle,TAG * tag); // Writes TAG to file +int swf_WriteTag2(writer_t*writer, TAG * t); //Write TAG via callback + +int swf_ReadHeader(reader_t*reader, SWF * swf); // Reads SWF Header via callback + +// folding/unfolding: + +void swf_FoldAll(SWF*swf); +void swf_UnFoldAll(SWF*swf); +void swf_FoldSprite(TAG*tag); +void swf_UnFoldSprite(TAG*tag); +int swf_IsFolded(TAG*tag); + +// tag reordering: + +void swf_OptimizeTagOrder(SWF*swf); + +// basic routines: + +TAG * swf_InsertTag(TAG * after,U16 id); // updates frames, if necessary +TAG * swf_InsertTagBefore(SWF*swf, TAG * before,U16 id); // like InsertTag, but insert tag before argument +TAG * swf_DeleteTag(SWF*swf, TAG * t); + +void swf_ClearTag(TAG * t); //frees tag data +void swf_ResetTag(TAG*tag, U16 id); //set's tag position and length to 0, without freeing it +TAG* swf_CopyTag(TAG*tag, TAG*to_copy); //stores a copy of another tag into this taglist + +void swf_SetTagPos(TAG * t,U32 pos); // resets Bitcount +U32 swf_GetTagPos(TAG * t); + +TAG * swf_NextTag(TAG * t); +TAG * swf_PrevTag(TAG * t); + +U16 swf_GetTagID(TAG * t); // ... TagGetID +U32 swf_GetTagLen(TAG * t); // ... TagGetTagLen +U8* swf_GetTagLenPtr(TAG * t); + +U32 swf_GetBits(TAG * t,int nbits); +S32 swf_GetSBits(TAG * t,int nbits); +int swf_SetBits(TAG * t,U32 v,int nbits); +int swf_CountUBits(U32 v,int nbits); +int swf_CountBits(U32 v,int nbits); + +int swf_GetBlock(TAG * t,U8 * b,int l); // resets Bitcount +int swf_SetBlock(TAG * t,const U8 * b,int l); + +U8 swf_GetU8(TAG * t); // resets Bitcount +U16 swf_GetU16(TAG * t); +#define swf_GetS16(tag) ((S16)swf_GetU16(tag)) +U32 swf_GetU32(TAG * t); +float swf_GetF16(TAG * t); +void swf_GetRGB(TAG * t, RGBA * col); +void swf_GetRGBA(TAG * t, RGBA * col); +void swf_GetGradient(TAG * t, GRADIENT * gradient, char alpha); +void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha); +void swf_FreeGradient(GRADIENT* gradient); +char* swf_GetString(TAG*t); +int swf_SetU8(TAG * t,U8 v); // resets Bitcount +int swf_SetU16(TAG * t,U16 v); +void swf_SetS16(TAG * t,int v); +int swf_SetU32(TAG * t,U32 v); +void swf_SetF16(TAG * t,float f); +void swf_SetString(TAG*t,const char*s); + +float floatToF16(float f); +float F16toFloat(U16 x); + +/* abc datatypes */ +U32 swf_GetU30(TAG*tag); +int swf_SetU30(TAG*tag, U32 u); +void swf_SetABCU32(TAG*tag, U32 u); +U32 swf_GetABCU32(TAG*tag); +void swf_SetABCS32(TAG*tag, S32 v); +S32 swf_GetABCS32(TAG*tag); +int swf_SetU30String(TAG*tag, const char*str, int len); +double swf_GetD64(TAG*tag); +int swf_SetD64(TAG*tag, double v); +int swf_GetU24(TAG*tag); +int swf_GetS24(TAG*tag); +int swf_SetU24(TAG*tag, U32 v); +int swf_SetS24(TAG*tag, U32 v); + +//int swf_GetPoint(TAG * t,SPOINT * p); // resets Bitcount +int swf_GetRect(TAG * t,SRECT * r); +int swf_GetMatrix(TAG * t,MATRIX * m); +int swf_GetCXForm(TAG * t,CXFORM * cx,U8 alpha); + +double swf_GetFixed(TAG * t); +void swf_SetFixed(TAG * t, double f); +float swf_GetFixed8(TAG * t); +void swf_SetFixed8(TAG * t, float f); + +//int swf_SetPoint(TAG * t,SPOINT * p); // resets Bitcount +int swf_SetRect(TAG * t,SRECT * r); +int swf_SetMatrix(TAG * t,MATRIX * m); +int swf_SetCXForm(TAG * t,CXFORM * cx,U8 alpha); +int swf_SetRGB(TAG * t,RGBA * col); +int swf_SetRGBA(TAG * t,RGBA * col); +void swf_SetPassword(TAG * t, const char * password); + +int swf_VerifyPassword(TAG * t, const char * password); + +// helper functions: + +SRECT swf_ClipRect(SRECT border, SRECT r); +void swf_ExpandRect(SRECT*src, SPOINT add); +void swf_ExpandRect2(SRECT*src, SRECT*add); +void swf_ExpandRect3(SRECT*src, SPOINT center, int radius); +SPOINT swf_TurnPoint(SPOINT p, MATRIX* m); +SRECT swf_TurnRect(SRECT r, MATRIX* m); + +#ifndef FAILED +#define FAILED(b) ((b)<0) +#endif + +// Tag IDs (adopted from J. C. Kessels' Form2Flash) + +#define ST_END 0 +#define ST_SHOWFRAME 1 +#define ST_DEFINESHAPE 2 +#define ST_FREECHARACTER 3 +#define ST_PLACEOBJECT 4 +#define ST_REMOVEOBJECT 5 +#define ST_DEFINEBITS 6 +#define ST_DEFINEBITSJPEG 6 +#define ST_DEFINEBUTTON 7 +#define ST_JPEGTABLES 8 +#define ST_SETBACKGROUNDCOLOR 9 +#define ST_DEFINEFONT 10 +#define ST_DEFINETEXT 11 +#define ST_DOACTION 12 +#define ST_DEFINEFONTINFO 13 +#define ST_DEFINESOUND 14 /* Event sound tags. */ +#define ST_STARTSOUND 15 +#define ST_DEFINEBUTTONSOUND 17 +#define ST_SOUNDSTREAMHEAD 18 +#define ST_SOUNDSTREAMBLOCK 19 +#define ST_DEFINEBITSLOSSLESS 20 /* A bitmap using lossless zlib compression. */ +#define ST_DEFINEBITSJPEG2 21 /* A bitmap using an internal JPEG compression table. */ +#define ST_DEFINESHAPE2 22 +#define ST_DEFINEBUTTONCXFORM 23 +#define ST_PROTECT 24 /* This file should not be importable for editing. */ +#define ST_PLACEOBJECT2 26 /* The new style place w/ alpha color transform and name. */ +#define ST_REMOVEOBJECT2 28 /* A more compact remove object that omits the character tag (just depth). */ +#define ST_FREEALL 31 /* ? */ +#define ST_DEFINESHAPE3 32 /* A shape V3 includes alpha values. */ +#define ST_DEFINETEXT2 33 /* A text V2 includes alpha values. */ +#define ST_DEFINEBUTTON2 34 /* A button V2 includes color transform, alpha and multiple actions */ +#define ST_DEFINEBITSJPEG3 35 /* A JPEG bitmap with alpha info. */ +#define ST_DEFINEBITSLOSSLESS2 36 /* A lossless bitmap with alpha info. */ +#define ST_DEFINEEDITTEXT 37 +#define ST_DEFINEMOVIE 38 +#define ST_DEFINESPRITE 39 /* Define a sequence of tags that describe the behavior of a sprite. */ +#define ST_NAMECHARACTER 40 /* Name a character definition, character id and a string, (used for buttons, bitmaps, sprites and sounds). */ +#define ST_SERIALNUMBER 41 +#define ST_GENERATORTEXT 42 /* contains an id */ +#define ST_FRAMELABEL 43 /* A string label for the current frame. */ +#define ST_SOUNDSTREAMHEAD2 45 /* For lossless streaming sound, should not have needed this... */ +#define ST_DEFINEMORPHSHAPE 46 /* A morph shape definition */ +#define ST_DEFINEFONT2 48 +#define ST_TEMPLATECOMMAND 49 +#define ST_GENERATOR3 51 +#define ST_EXTERNALFONT 52 +#define ST_EXPORTASSETS 56 +#define ST_IMPORTASSETS 57 +#define ST_ENABLEDEBUGGER 58 +#define ST_DOINITACTION 59 +#define ST_DEFINEVIDEOSTREAM 60 +#define ST_VIDEOFRAME 61 +#define ST_DEFINEFONTINFO2 62 +#define ST_MX4 63 /*(?) */ +#define ST_ENABLEDEBUGGER2 64 /* version 8 */ +#define ST_SCRIPTLIMITS 65 /* version 7- u16 maxrecursedepth, u16 scripttimeoutseconds */ +#define ST_SETTABINDEX 66 /* version 7- u16 depth(!), u16 tab order value */ +#define ST_FILEATTRIBUTES 69 /* version 8 (required)- */ +#define ST_PLACEOBJECT3 70 /* version 8 */ +#define ST_IMPORTASSETS2 71 /* version 8 */ +#define ST_RAWABC 72 /* version 9, used by flex */ +#define ST_DEFINEFONTALIGNZONES 73 /* version 8 */ +#define ST_CSMTEXTSETTINGS 74 /* version 8 */ +#define ST_DEFINEFONT3 75 /* version 8 */ +#define ST_SYMBOLCLASS 76 /* version 9 */ +#define ST_METADATA 77 /* version 8 */ +#define ST_DEFINESCALINGGRID 78 /* version 8 */ +#define ST_DOABC 82 /* version 9 */ +#define ST_DEFINESHAPE4 83 /* version 8 */ +#define ST_DEFINEMORPHSHAPE2 84 /* version 8 */ +#define ST_SCENEDESCRIPTION 86 /* version 9 */ +#define ST_DEFINEBINARY 87 /* version 9 */ +#define ST_DEFINEFONTNAME 88 /* version 9 */ + +/* custom tags- only valid for swftools */ +#define ST_REFLEX 777 /* to identify generator software */ +#define ST_GLYPHNAMES 778 + +// Advanced Funtions + +// swfshape.c + +typedef struct _LINESTYLE +{ U16 width; + RGBA color; +} LINESTYLE; + +#define FILL_SOLID 0x00 +#define FILL_LINEAR 0x10 // Gradient +#define FILL_RADIAL 0x12 +#define FILL_TILED 0x40 // Bitmap +#define FILL_CLIPPED 0x41 + +typedef struct _FILLSTYLE +{ U8 type; + RGBA color; + MATRIX m; + U16 id_bitmap; + GRADIENT gradient; +} FILLSTYLE; + +typedef struct _SHAPE // NEVER access a Shape-Struct directly ! +{ + struct + { LINESTYLE * data; + U16 n; + } linestyle; + + struct + { FILLSTYLE * data; + U16 n; + } fillstyle; + + struct + { U16 fill; + U16 line; + } bits; + // used by Get/SetSimpleShape and glyph handling + U8 * data; + U32 bitlen; // length of data in bits +} SHAPE; + +/* SHAPE can be converted into SHAPE2: */ + +struct _SHAPELINE; +typedef struct _SHAPE2 +{ + LINESTYLE * linestyles; + int numlinestyles; + FILLSTYLE* fillstyles; + int numfillstyles; + struct _SHAPELINE * lines; + SRECT* bbox; // may be NULL +} SHAPE2; + +enum SHAPELINETYPE {moveTo, lineTo, splineTo}; +typedef struct _SHAPELINE +{ + enum SHAPELINETYPE type; + SCOORD x,y; + SCOORD sx,sy; //only if type==splineTo + int fillstyle0; + int fillstyle1; + int linestyle; + struct _SHAPELINE * next; +} SHAPELINE; + +// Shapes + +int swf_ShapeNew(SHAPE ** s); +void swf_ShapeFree(SHAPE * s); +char swf_ShapeIsEmpty(SHAPE*s); + +int swf_GetSimpleShape(TAG * t,SHAPE ** s); // without Linestyle/Fillstyle Record +int swf_SetSimpleShape(TAG * t,SHAPE * s); // without Linestyle/Fillstyle Record + +int swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color); +int swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color); +int swf_ShapeAddBitmapFillStyle(SHAPE * s,MATRIX * m,U16 id_bitmap,int clip); +int swf_ShapeAddGradientFillStyle(SHAPE * s,MATRIX * m,GRADIENT* gradient,int radial); +int swf_ShapeAddFillStyle2(SHAPE * s,FILLSTYLE*fs); + +int swf_SetShapeStyles(TAG * t,SHAPE * s); +int swf_ShapeCountBits(SHAPE * s,U8 * fbits,U8 * lbits); +int swf_SetShapeBits(TAG * t,SHAPE * s); +int swf_SetShapeHeader(TAG * t,SHAPE * s); // one call for upper three functions + +int swf_ShapeSetMove(TAG * t,SHAPE * s,S32 x,S32 y); +int swf_ShapeSetStyle(TAG * t,SHAPE * s,int line,int fill0,int fill1); +#define UNDEFINED_COORD 0x7fffffff +int swf_ShapeSetAll(TAG * t,SHAPE * s,S32 x,S32 y,int line,int fill0,int fill1); + +int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y); +int swf_ShapeSetCurve(TAG * t,SHAPE * s,S32 x,S32 y,S32 ax,S32 ay); +int swf_ShapeSetCircle(TAG * t,SHAPE * s,S32 x,S32 y,S32 rx,S32 ry); +int swf_ShapeSetEnd(TAG * t); +int swf_SetShapeStyleCount(TAG * t,U16 n); +int swf_SetFillStyle(TAG * t,FILLSTYLE * f); +int swf_SetLineStyle(TAG * t,LINESTYLE * l); + + +void swf_ShapeSetRectangle(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba); +void swf_ShapeSetRectangleWithBorder(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba, int linewidth, RGBA*linecolor); +void swf_ShapeSetBitmapRect(TAG * t, U16 gfxid, int width, int height); + +//SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits); +SHAPE2* swf_ShapeToShape2(SHAPE*shape); +void swf_Shape2ToShape(SHAPE2*shape2, SHAPE*shape); +SRECT swf_GetShapeBoundingBox(SHAPE2*shape); +void swf_SetShape2(TAG*tag, SHAPE2*shape); +SHAPE2* swf_Shape2Clone(SHAPE2 * s); +void swf_Shape2Free(SHAPE2 * s); +void swf_DumpShape(SHAPE2*shape2); + +void swf_ParseDefineShape(TAG*tag, SHAPE2*shape); +void swf_SetShape2(TAG*tag, SHAPE2*shape2); + +void swf_RecodeShapeData(U8*data, int bitlen, int in_bits_fill, int in_bits_line, + U8**destdata, U32*destbitlen, int out_bits_fill, int out_bits_line); + +// swfdraw.c + +void swf_Shape10DrawerInit(drawer_t*draw, TAG*tag); +void swf_Shape01DrawerInit(drawer_t*draw, TAG*tag); +void swf_Shape11DrawerInit(drawer_t*draw, TAG*tag); +SHAPE* swf_ShapeDrawerToShape(drawer_t*draw); +SRECT swf_ShapeDrawerGetBBox(drawer_t*draw); + +void swf_DrawString(drawer_t*draw, const char*source); + +// swftext.c + +typedef struct _KERNING +{ + U16 char1; + U16 char2; + U16 adjustment; +} SWFKERNING; + +typedef struct _SWFLAYOUT +{ U16 ascent; + U16 descent; + U16 leading; + SRECT * bounds; + U16 kerningcount; + SWFKERNING * kerning; +} SWFLAYOUT; + +typedef struct +{ S16 advance; + SHAPE * shape; +} SWFGLYPH; + +typedef struct _SWFGLYPHPAIR +{ + U16 char1; + U16 char2; + int num; +} SWFGLYPHPAIR; + +typedef struct _FONTUSAGE +{ int* chars; + char is_reduced; + int used_glyphs; + int glyphs_specified; + U16 smallest_size; + + SWFGLYPHPAIR* neighbors; + int num_neighbors; + int neighbors_size; + int* neighbors_hash; + int neighbors_hash_size; +} FONTUSAGE; + +#define FONT_STYLE_BOLD 1 +#define FONT_STYLE_ITALIC 2 +#define FONT_ENCODING_UNICODE 1 +#define FONT_ENCODING_ANSI 2 +#define FONT_ENCODING_SHIFTJIS 4 + +#define FONTALIGN_THIN 0 +#define FONTALIGN_MEDIUM 1 +#define FONTALIGN_THICK 2 + +typedef struct _ALIGNZONE +{ + U16 x,y; + U16 dx,dy; +} ALIGNZONE; + +typedef struct _SWFFONT +{ int id; // -1 = not set + U8 version; // 0 = not set, 1 = definefont, 2 = definefont2, 3 = definefont3 + U8 * name; + SWFLAYOUT * layout; + int numchars; + int maxascii; // highest mapped ascii/unicode value + + U8 style; + U8 encoding; + + U16 * glyph2ascii; + int * ascii2glyph; + int * glyph2glyph; // only if the font is resorted + SWFGLYPH * glyph; + ALIGNZONE * alignzones; + U8 alignzone_flags; + U8 language; + char ** glyphnames; + + FONTUSAGE * use; + +} SWFFONT; + + +#define ET_HASTEXT 32768 +#define ET_WORDWRAP 16384 +#define ET_MULTILINE 8192 +#define ET_PASSWORD 4096 +#define ET_READONLY 2048 +#define ET_HASTEXTCOLOR 1024 +#define ET_HASMAXLENGTH 512 +#define ET_HASFONT 256 +#define ET_X3 128 +#define ET_AUTOSIZE 64 /* MX */ +#define ET_HASLAYOUT 32 +#define ET_NOSELECT 16 +#define ET_BORDER 8 +#define ET_X1 4 +#define ET_HTML 2 /* MX? */ +#define ET_USEOUTLINES 1 + +#define ET_ALIGN_LEFT 0 +#define ET_ALIGN_RIGHT 1 +#define ET_ALIGN_CENTER 2 +#define ET_ALIGN_JUSTIFY 3 + +typedef struct _EditTextLayout +{ + U8 align; // 0=left, 1=right, 2=center, 3=justify + U16 leftmargin; + U16 rightmargin; + U16 indent; + U16 leading; +} EditTextLayout; + +int swf_FontEnumerate(SWF * swf,void (*FontCallback) (void*,U16,U8*), void*self); +// -> void fontcallback(U16 id,U8 * name); returns number of defined fonts + +int swf_FontExtract(SWF * swf,int id,SWFFONT ** f); +// Fetches all available information from DefineFont, DefineFontInfo, DefineText, ... +// id = FontID, id=0 -> Extract first Font +int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag); +int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t); +int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t); +int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag); +int swf_FontExtract_DefineFontAlignZones(int id, SWFFONT * font, TAG * tag); + + +int swf_FontIsItalic(SWFFONT * f); +int swf_FontIsBold(SWFFONT * f); + +int swf_FontSetID(SWFFONT * f,U16 id); +int swf_FontReduce(SWFFONT * f); +int swf_FontReduce_swfc(SWFFONT * f); + +int swf_FontInitUsage(SWFFONT * f); +int swf_FontUseGlyph(SWFFONT * f, int glyph, U16 size); +void swf_FontUsePair(SWFFONT * f, int char1, int char2); +int swf_FontUseGetPair(SWFFONT * f, int char1, int char2); +int swf_FontUseAll(SWFFONT* f); +int swf_FontUseUTF8(SWFFONT * f, const U8 * s, U16 size); +int swf_FontUse(SWFFONT* f,U8 * s); +void swf_FontSort(SWFFONT * font); + +int swf_FontSetDefine(TAG * t,SWFFONT * f); +int swf_FontSetDefine2(TAG * t,SWFFONT * f); +int swf_FontSetInfo(TAG * t,SWFFONT * f); +void swf_FontSetAlignZones(TAG*t, SWFFONT *f); + +void swf_FontCreateLayout(SWFFONT*f); +void swf_FontCreateAlignZones(SWFFONT * f); +void swf_FontAddLayout(SWFFONT * f, int ascent, int descent, int leading); +void swf_FontPostprocess(SWF*swf); + +int swf_ParseDefineText(TAG * t, void(*callback)(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA* color), void*self); + +void swf_WriteFont(SWFFONT* font, char* filename); +SWFFONT* swf_ReadFont(const char* filename); + +void swf_FontFree(SWFFONT * f); + +U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale); +int swf_TextCountBits(SWFFONT * font,U8 * s,int scale,U8 * gbits,U8 * abits); + +#define SET_TO_ZERO 0x80000000 +int swf_TextSetInfoRecord(TAG * t,SWFFONT * font,U16 size,RGBA * color,int dx,int dy); +int swf_TextSetCharRecord(TAG * t,SWFFONT * font,U8 * s,int scale,U8 gbits,U8 abits); + +int swf_TextPrintDefineText(TAG * t,SWFFONT * f); +// Prints text defined in tag t with font f to stdout + +void swf_FontPrepareForEditText(SWFFONT * f); + +/* notice: if you set the fontid, make sure you call swf_FontPrepareForEditText() for the font first */ +void swf_SetEditText(TAG*tag, U16 flags, SRECT r, const char*text, RGBA*color, + int maxlength, U16 font, U16 height, EditTextLayout*layout, const char*variable); + +SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, const char*text, int scale); + +void swf_DrawText(drawer_t*draw, SWFFONT*font, int size, const char*text); + +// swffont.c + +SWFFONT* swf_LoadTrueTypeFont(const char*filename, char flashtype); +SWFFONT* swf_LoadT1Font(const char*filename); +SWFFONT* swf_LoadFont(const char*filename, char flashtype); + +void swf_SetLoadFontParameters(int scale, int skip_unused, int full_unicode); + +// swfdump.c + +void swf_DumpHeader(FILE * f,SWF * swf); +void swf_DumpMatrix(FILE * f,MATRIX * m); +void swf_DumpTag(FILE * f,TAG * t); +void swf_DumpSWF(FILE * f,SWF*swf); +void swf_DumpGradient(FILE* f, GRADIENT*gradient); +char* swf_TagGetName(TAG*tag); +void swf_DumpFont(SWFFONT * font); + +// swfbits.c + +int swf_ImageHasAlpha(RGBA*img, int width, int height); +int swf_ImageGetNumberOfPaletteEntries(RGBA*img, int width, int height, RGBA*palette); + +typedef int JPEGBITS; +JPEGBITS * swf_SetJPEGBitsStart(TAG * t,int width,int height,int quality); // deprecated +int swf_SetJPEGBitsLines(JPEGBITS * jpegbits,U8 ** data,int n); // deprecated +int swf_SetJPEGBitsLine(JPEGBITS * jpegbits,U8 * data); // deprecated +int swf_SetJPEGBitsFinish(JPEGBITS * jpegbits); // deprecated + +void swf_GetJPEGSize(const char * fname, int*width, int*height); + +int swf_SetJPEGBits(TAG * t,const char * fname,int quality); +void swf_SetJPEGBits2(TAG * t,U16 width,U16 height,RGBA * bitmap,int quality); +int swf_SetJPEGBits3(TAG * tag,U16 width,U16 height,RGBA* bitmap, int quality); +RGBA* swf_JPEG2TagToImage(TAG*tag, int*width, int*height); +void swf_RemoveJPEGTables(SWF*swf); + +void swf_SaveJPEG(char*filename, RGBA*pixels, int width, int height, int quality); + +#define BYTES_PER_SCANLINE(width) ((width+3)&0xfffffffc) + +#define BMF_8BIT 3 // Bitmap formats +#define BMF_16BIT 4 +#define BMF_32BIT 5 + +int swf_SetLosslessBits(TAG * t,U16 width,U16 height,void * bitmap,U8 bitmap_flags); +int swf_SetLosslessBitsIndexed(TAG * t,U16 width,U16 height,U8 * bitmap,RGBA * palette,U16 ncolors); +int swf_SetLosslessBitsGrayscale(TAG * t,U16 width,U16 height,U8 * bitmap); +void swf_SetLosslessImage(TAG*tag, RGBA*data, int width, int height); //WARNING: will change tag->id + +RGBA* swf_DefineLosslessBitsTagToImage(TAG*tag, int*width, int*height); + +RGBA* swf_ExtractImage(TAG*tag, int*dwidth, int*dheight); +TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quality); + +// swfsound.c +void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples); +void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int seek, char first); /* expects 2304 samples */ +void swf_SetSoundDefine(TAG*tag, S16*samples, int num); +void swf_SetSoundDefineMP3(TAG*tag, U8* data, unsigned length, + unsigned SampRate, + unsigned Channels, + unsigned NumFrames); +void swf_SetSoundInfo(TAG*tag, SOUNDINFO*info); + +// swftools.c + +void swf_Optimize(SWF*swf); +U8 swf_isDefiningTag(TAG * t); +U8 swf_isPseudoDefiningTag(TAG * t); +U8 swf_isAllowedSpriteTag(TAG * t); +U8 swf_isImageTag(TAG*tag); +U8 swf_isShapeTag(TAG*tag); +U8 swf_isTextTag(TAG*tag); +U8 swf_isFontTag(TAG*tag); +U8 swf_isPlaceTag(TAG*tag); + +U16 swf_GetDefineID(TAG * t); +SRECT swf_GetDefineBBox(TAG * t); +void swf_SetDefineBBox(TAG * t, SRECT r); + +void swf_SetDefineID(TAG * t, U16 newid); +U16 swf_GetPlaceID(TAG * t); //PLACEOBJECT, PLACEOBJECT2 (sometimes), REMOVEOBJECT +int swf_GetDepth(TAG * t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2,SETTABINDEX +char* swf_GetName(TAG * t); //PLACEOBJECT2, FRAMELABEL +MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2); +MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy, + int x0,int y0,int x1,int y1,int x2,int y2); +int swf_GetNumUsedIDs(TAG * t); +void swf_GetUsedIDs(TAG * t, int * positions); +char swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free +void swf_RelocateDepth(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[d]==0 means depth d is free + +TAG* swf_Concatenate (TAG*list1,TAG*list2); // warning: both list1 and list2 are invalid after this call. + +RGBA swf_GetSWFBackgroundColor(SWF*swf); + +// swfcgi.c + +void swf_uncgi(); // same behaviour as Steven Grimm's uncgi-library + +// as3/abc.c +void*swf_ReadABC(TAG*tag); +void*swf_DumpABC(FILE*fo, void*code, char*prefix); +void swf_WriteABC(TAG*tag, void*code); +void swf_FreeABC(void*code); +void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events); +TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname); +#include "as3/compiler.h" +#include "as3/import.h" + +// swfaction.c + +typedef struct _ActionTAG +{ U8 op; + U16 len; + U8 * data; + + struct _ActionTAG * next; + struct _ActionTAG * prev; + + struct _ActionTAG * parent; + U8 tmp[8]; // store small operands here. +} ActionTAG; + +typedef struct _ActionMarker +{ + ActionTAG* atag; +} ActionMarker; + +ActionTAG* swf_ActionGet(TAG*tag); +void swf_ActionFree(ActionTAG*tag); +void swf_ActionSet(TAG*tag, ActionTAG*actions); +void swf_DumpActions(ActionTAG*atag, char*prefix); +void swf_ActionEnumerateURLs(ActionTAG*atag, char*(*callback)(char*)); +void swf_ActionEnumerateTargets(ActionTAG*atag, char*(*callback)(char*)); +void swf_ActionEnumerateStrings(ActionTAG*atag, char*(*callback)(char*)); + +// using action/actioncompiler.h: +ActionTAG* swf_ActionCompile(const char* source, int version); + +#define ACTION__GOTOFRAME 0x81 +#define ACTION__GETURL 0x83 +ActionTAG* action_End(ActionTAG*atag); +ActionTAG* action_NextFrame(ActionTAG*atag); +ActionTAG* action_PreviousFrame(ActionTAG*atag); +ActionTAG* action_Play(ActionTAG*atag); +ActionTAG* action_Stop(ActionTAG*atag); +ActionTAG* action_ToggleQuality(ActionTAG*atag); +ActionTAG* action_StopSounds(ActionTAG*atag); +ActionTAG* action_Add(ActionTAG*atag); +ActionTAG* action_Subtract(ActionTAG*atag); +ActionTAG* action_Multiply(ActionTAG*atag); +ActionTAG* action_Divide(ActionTAG*atag); +ActionTAG* action_Equals(ActionTAG*atag); +ActionTAG* action_Less(ActionTAG*atag); +ActionTAG* action_And(ActionTAG*atag); +ActionTAG* action_Or(ActionTAG*atag); +ActionTAG* action_Not(ActionTAG*atag); +ActionTAG* action_StringEquals(ActionTAG*atag); +ActionTAG* action_StringLength(ActionTAG*atag); +ActionTAG* action_StringExtract(ActionTAG*atag); +ActionTAG* action_Pop(ActionTAG*atag); +ActionTAG* action_ToInteger(ActionTAG*atag); +ActionTAG* action_GetVariable(ActionTAG*atag); +ActionTAG* action_SetVariable(ActionTAG*atag); +ActionTAG* action_SetTarget2(ActionTAG*atag); +ActionTAG* action_StringAdd(ActionTAG*atag); +ActionTAG* action_GetProperty(ActionTAG*atag); +ActionTAG* action_SetProperty(ActionTAG*atag); +ActionTAG* action_CloneSprite(ActionTAG*atag); +ActionTAG* action_RemoveSprite(ActionTAG*atag); +ActionTAG* action_Trace(ActionTAG*atag); +ActionTAG* action_StartDrag(ActionTAG*atag); +ActionTAG* action_EndDrag(ActionTAG*atag); +ActionTAG* action_StringLess(ActionTAG*atag); +ActionTAG* action_RandomNumber(ActionTAG*atag); +ActionTAG* action_MBStringLength(ActionTAG*atag); +ActionTAG* action_CharToAscii(ActionTAG*atag); +ActionTAG* action_AsciiToChar(ActionTAG*atag); +ActionTAG* action_GetTime(ActionTAG*atag); +ActionTAG* action_MBStringExtract(ActionTAG*atag); +ActionTAG* action_MBCharToAscii(ActionTAG*atag); +ActionTAG* action_MBAsciiToChar(ActionTAG*atag); +ActionTAG* action_Delete(ActionTAG*atag); +ActionTAG* action_Delete2(ActionTAG*atag); +ActionTAG* action_DefineLocal(ActionTAG*atag); +ActionTAG* action_CallFunction(ActionTAG*atag); +ActionTAG* action_Return(ActionTAG*atag); +ActionTAG* action_Modulo(ActionTAG*atag); +ActionTAG* action_NewObject(ActionTAG*atag); +ActionTAG* action_DefineLocal2(ActionTAG*atag); +ActionTAG* action_InitArray(ActionTAG*atag); +ActionTAG* action_Makehash(ActionTAG*atag); +ActionTAG* action_TypeOf(ActionTAG*atag); +ActionTAG* action_TargetPath(ActionTAG*atag); +ActionTAG* action_Enumerate(ActionTAG*atag); +ActionTAG* action_Add2(ActionTAG*atag); +ActionTAG* action_Less2(ActionTAG*atag); +ActionTAG* action_Equals2(ActionTAG*atag); +ActionTAG* action_ToNumber(ActionTAG*atag); +ActionTAG* action_ToString(ActionTAG*atag); +ActionTAG* action_PushDuplicate(ActionTAG*atag); +ActionTAG* action_StackSwap(ActionTAG*atag); +ActionTAG* action_GetMember(ActionTAG*atag); +ActionTAG* action_SetMember(ActionTAG*atag); +ActionTAG* action_Increment(ActionTAG*atag); +ActionTAG* action_Decrement(ActionTAG*atag); +ActionTAG* action_CallMethod(ActionTAG*atag); +ActionTAG* action_NewMethod(ActionTAG*atag); +ActionTAG* action_BitAnd(ActionTAG*atag); +ActionTAG* action_BitOr(ActionTAG*atag); +ActionTAG* action_BitXor(ActionTAG*atag); +ActionTAG* action_BitLShift(ActionTAG*atag); +ActionTAG* action_BitRShift(ActionTAG*atag); +ActionTAG* action_BitURShift(ActionTAG*atag); +ActionTAG* action_GotoFrame(ActionTAG*atag, U16 frame); +ActionTAG* action_GetUrl(ActionTAG*atag, const char* url, char* label); +ActionTAG* action_StoreRegister(ActionTAG*atag, U8 reg); +ActionTAG* action_Constantpool(ActionTAG*atag, char* constantpool); +ActionTAG* action_WaitForFrame(ActionTAG*atag, U16 frame, U8 skip); +ActionTAG* action_SetTarget(ActionTAG*atag, const char* target); +ActionTAG* action_GotoLabel(ActionTAG*atag, char* label); +ActionTAG* action_WaitForFrame2(ActionTAG*atag, U8 skip); +ActionTAG* action_With(ActionTAG*atag, char*object); +ActionTAG* action_PushString(ActionTAG*atag, const char*str); +ActionTAG* action_PushFloat(ActionTAG*atag, float f); +ActionTAG* action_PushNULL(ActionTAG*atag); +ActionTAG* action_PushRegister(ActionTAG*atag, U8 reg); +ActionTAG* action_PushBoolean(ActionTAG*atag, char c); +ActionTAG* action_PushDouble(ActionTAG*atag, double d); +ActionTAG* action_PushInt(ActionTAG*atag, int i); +ActionTAG* action_PushLookup(ActionTAG*atag, U8 index); +ActionTAG* action_Jump(ActionTAG*atag, U16 branch); +ActionTAG* action_GetUrl2(ActionTAG*atag, U8 method); +ActionTAG* action_DefineFunction(ActionTAG*atag, U8*data, int len); +ActionTAG* action_If(ActionTAG*atag, U16 branch); +ActionTAG* action_Call(ActionTAG*atag); +ActionTAG* action_GotoFrame2(ActionTAG*atag, U8 method); +ActionMarker action_setMarker(ActionTAG*atag); +void action_fixjump(ActionMarker m1, ActionMarker m2); + +// swfobject.c + +// The following 3 routines only use placeobject2: + +extern char*blendModeNames[]; + +int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char* name); +int swf_ObjectPlaceClip(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char* name, U16 clipaction); +int swf_ObjectPlaceBlend(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char* name, U8 blendmode); +int swf_ObjectMove(TAG * t,U16 depth,MATRIX * m,CXFORM * cx); + +#define PF_MOVE 0x01 +#define PF_CHAR 0x02 +#define PF_MATRIX 0x04 +#define PF_CXFORM 0x08 +#define PF_RATIO 0x10 +#define PF_NAME 0x20 +#define PF_CLIPDEPTH 0x40 +#define PF_ACTIONEVENT 0x80 + +#define PF2_FILTERS 0x01 +#define PF2_BLENDMODE 0x02 +#define PF2_ASBITMAP 0x04 +//... + +#define BLENDMODE_NORMAL 0 +#define BLENDMODE_NORMAL2 1 +#define BLENDMODE_LAYER 2 +#define BLENDMODE_MULTIPLY 3 +#define BLENDMODE_SCREEN 4 +#define BLENDMODE_LIGHTEN 5 +#define BLENDMODE_DARKEN 6 +#define BLENDMODE_ADD 7 +#define BLENDMODE_SUBSTRACT 8 +#define BLENDMODE_DIFFERENCE 9 +#define BLENDMODE_INVERT 10 +#define BLENDMODE_ALPHA 11 +#define BLENDMODE_ERASE 12 +#define BLENDMODE_OVERLAY 13 +#define BLENDMODE_HARDLIGHT 14 + +typedef struct _SWFPLACEOBJECT { + U8 flags; + U16 depth; + U16 id; // may be 0 + char move; //true: move/replace character, false: set character + MATRIX matrix; + CXFORM cxform; + U16 ratio; + char*name; + U16 clipdepth; + ActionTAG* actions; + U8 blendmode; + FILTERLIST*filters; +} SWFPLACEOBJECT; + +void swf_SetPlaceObject(TAG * t,SWFPLACEOBJECT* obj); +void swf_GetPlaceObject(TAG * t,SWFPLACEOBJECT* obj); +void swf_PlaceObjectFree(SWFPLACEOBJECT* obj); + +// swfvideo.c + +typedef struct _VIDEOSTREAM +{ + int width; + int height; + int linex; + + int owidth; + int oheight; + int olinex; + + int frame; + YUV*oldpic; + YUV*current; + int bbx; + int bby; + int*mvdx; + int*mvdy; + int quant; + + /* modifyable: */ + int do_motion; //enable motion compensation (slow!) + +} VIDEOSTREAM; + +void swf_SetVideoStreamDefine(TAG*tag, VIDEOSTREAM*stream, U16 frames, U16 width, U16 height); +void swf_SetVideoStreamIFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant/* 1-31, 1=best quality, 31=best compression*/); +void swf_SetVideoStreamBlackFrame(TAG*tag, VIDEOSTREAM*s); +void swf_SetVideoStreamPFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant/* 1-31, 1=best quality, 31=best compression*/); +void swf_SetVideoStreamMover(TAG*tag, VIDEOSTREAM*s, signed char* movex, signed char* movey, void** image, int quant); +void swf_VideoStreamClear(VIDEOSTREAM*stream); + +// swfbutton.c + +// Button States + +#define BS_HIT 0x08 +#define BS_DOWN 0x04 +#define BS_OVER 0x02 +#define BS_UP 0x01 + +// Button Conditions + +/* missing: IDLE_OUTDOWN + OUTDOWN_OVERUP + OVERUP_OUTDOWN +*/ +#define BC_OVERDOWN_IDLE 0x0100 +#define BC_IDLE_OVERDOWN 0x0080 +#define BC_OUTDOWN_IDLE 0x0040 +#define BC_OUTDOWN_OVERDOWN 0x0020 +#define BC_OVERDOWN_OUTDOWN 0x0010 +#define BC_OVERDOWN_OVERUP 0x0008 +#define BC_OVERUP_OVERDOWN 0x0004 +#define BC_OVERUP_IDLE 0x0002 +#define BC_IDLE_OVERUP 0x0001 + +#define BC_KEY(c) (c<<9) + +#define BC_CURSORLEFT 0x0200 +#define BC_CURSORRIGHT 0x0400 +#define BC_POS1 0x0600 +#define BC_END 0x0800 +#define BC_INSERT 0x0a00 +#define BC_DELETE 0x0c00 +#define BC_CLEAR 0x0e00 +#define BC_BACKSPACE 0x1000 +#define BC_ENTER 0x1a00 +#define BC_CURSORUP 0x1c00 +#define BC_CURSORDOWN 0x1e00 +#define BC_PAGEUP 0x2000 +#define BC_PAGEDOWN 0x2200 +#define BC_TAB 0x2400 +#define BC_ESCAPE 0x3600 +#define BC_SPACE 0x4000 + +/* these are probably only valid with linux: + Ctrl-A 0x0200 + Ctrl-X 0x3000 + Ctrl-Y 0x3200 + Ctrl-Z 0x3400 + Escape/Ctrl-[ 0x3600 + Ctrl-\ 0x3800 + Ctrl-] 0x3a00 + Ctrl-^ 0x3c00 + Ctrl-/ 0x3e00 + */ + +/* everything above 0x4000 is standard ascii: + 0x4000 ' ' 0x4200 '!' 0x4600 '#' 0x4800 '$' 0x4a00 '%' 0x4c00 '&' ... + 0x6000 '0' ... 0x7200 '9' + 0x8000 '@' + 0x8200 'A' ... 0xb400 'Z' + ... + 0xfc00 '~' + */ + +// Button Flag + +#define BF_TRACKMENU 0x01 + +int swf_ButtonSetRecord(TAG * t,U8 state,U16 id,U16 layer,MATRIX * m,CXFORM * cx); +int swf_ButtonSetCondition(TAG * t,U16 condition); // for DefineButton2 +int swf_ButtonSetFlags(TAG * t,U8 flags); // necessary for DefineButton2 +int swf_ButtonPostProcess(TAG * t,int anz_action); // Set all offsets in DefineButton2-Tags (how many conditions to process) +ActionTAG* swf_ButtonGetAction(TAG*t); + +// swfrender.c + +typedef struct RENDERBUF +{ + int width; + int height; + int posx,posy; + void*internal; +} RENDERBUF; + +void swf_Render_Init(RENDERBUF*buf, int posx, int posy, int width, int height, int antialize, int multiply); +void swf_Render_SetBackground(RENDERBUF*buf, RGBA*img, int width, int height); +void swf_Render_SetBackgroundColor(RENDERBUF*buf, RGBA color); +RGBA* swf_Render(RENDERBUF*dest); +void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 depth,U16 clipdepth); +void swf_RenderSWF(RENDERBUF*buf, SWF*swf); +void swf_Render_AddImage(RENDERBUF*buf, U16 id, RGBA*img, int width, int height); /* img is non-premultiplied */ +void swf_Render_ClearCanvas(RENDERBUF*dest); +void swf_Render_Delete(RENDERBUF*dest); + +// swffilter.c + +#define FILTERTYPE_DROPSHADOW 0 +#define FILTERTYPE_BLUR 1 +#define FILTERTYPE_GLOW 2 +#define FILTERTYPE_BEVEL 3 +#define FILTERTYPE_GRADIENTGLOW 4 +#define FILTERTYPE_CONVOLUTION 5 +#define FILTERTYPE_COLORMATRIX 6 +#define FILTERTYPE_GRADIENTBEVEL 7 + +extern char*filtername[]; + +typedef struct _FILTER_GRADIENTGLOW { + U8 type; + GRADIENT*gradient; + double blurx; + double blury; + double angle; + double distance; + float strength; + char innershadow; + char knockout; + char composite; + char ontop; + int passes; +} FILTER_GRADIENTGLOW; + +typedef struct _FILTER_DROPSHADOW { + U8 type; + RGBA color; + double blurx; + double blury; + double angle; + double distance; + float strength; + char innershadow; + char knockout; + char composite; + int passes; +} FILTER_DROPSHADOW; + +typedef struct _FILTER_BEVEL { + U8 type; + RGBA shadow; + RGBA highlight; + double blurx; + double blury; + double angle; + double distance; + float strength; + char innershadow; + char knockout; + char composite; + char ontop; + int passes; +} FILTER_BEVEL; + +typedef struct _FILTER_BLUR { + U8 type; + double blurx; + double blury; + int passes; +} FILTER_BLUR; + +typedef struct _FILTER_GLOW { + U8 type; + RGBA rgba; + double blurx; + double blury; + double strength; + int passes; + char innerglow; + char knockout; + char composite; +} FILTER_GLOW; + +void swf_SetFilter(TAG*tag, FILTER*f); +FILTER*swf_GetFilter(TAG*tag); +FILTER*swf_NewFilter(U8 type); +void swf_DeleteFilter(FILTER*f); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/ttf.c b/fluidbook/tools/swftools-special-swfdump/lib/ttf.c new file mode 100644 index 000000000..0e22cb08f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/ttf.c @@ -0,0 +1,2470 @@ +/* ttf.c + Parser and writer for truetype font files. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "log.h" +#include "os.h" +#include "q.h" +#include "mem.h" +#include "ttf.h" + +#define TTCFTAG 0x74746366 + +#define OPENTYPE 0x4f54544f +#define TRUETYPE_MACOS 0x74727565 +#define VERSION_1_0 0x00010000 + +#define TAG_OS2 0x4f532f32 +#define TAG_CMAP 0x636d6170 +#define TAG_GLYF 0x676c7966 //required for non opentype +#define TAG_HEAD 0x68656164 //required +#define TAG_HHEA 0x68686561 //required +#define TAG_HMTX 0x686d7478 //required +#define TAG_VHEA 0x86686561 +#define TAG_VMTX 0x866d7478 +#define TAG_KERN 0x6b65726e +#define TAG_LOCA 0x6c6f6361 //required for non opentype +#define TAG_MAXP 0x6d617870 //required +#define TAG_NAME 0x6e616d65 +#define TAG_POST 0x706f7374 +#define TAG_CFF 0x43464620 //required for opentype +#define TAG_CVT 0x63767420 +#define TAG_FPGM 0x6670676d +#define TAG_GASP 0x67617370 +#define TAG_PREP 0x70726570 + + +static U32 checksum_block(U8*_data, int len) +{ + U32 sum = 0; + U8*data = (U8*)_data; + + int pos; + int len_minus_4 = len-4; + for(pos=0;pos<=len_minus_4;pos+=4) { + sum += data[pos]<<24|data[pos+1]<<16|data[pos+2]<<8|data[pos+3]; + } + int left = len-pos; + if(left == 1) sum+= data[pos+0]<<24; + if(left == 2) sum+= data[pos+0]<<24|data[pos+1]<<16; + if(left == 3) sum+= data[pos+0]<<24|data[pos+1]<<16|data[pos+2]<<8; + return sum; +} + +typedef struct _memreader { + U8*mem; + int pos; + int size; +} memreader_t; + +static U8 readU8(memreader_t*r) +{ + return r->mem[r->pos++]; +} +static inline U16 readU16(memreader_t*r) +{ + if(r->pos+2>r->size) return 0; + U16 val = r->mem[r->pos]<<8| + r->mem[r->pos+1]; + r->pos += 2; + return val; +} +static S16 readS16(memreader_t*r) +{ + return (S16)readU16(r); +} +static U32 readU32(memreader_t*r) +{ + if(r->pos+4>r->size) return 0; + U32 val = r->mem[r->pos]<<24| + r->mem[r->pos+1]<<16| + r->mem[r->pos+2]<<8| + r->mem[r->pos+3]; + r->pos += 4; + return val; +} +static void readBlock(memreader_t*r, void*dest, int len) +{ + int remaining = r->size-r->pos; + if(len > remaining) { + memcpy(dest, r->mem+r->pos, remaining); + memset(dest+remaining, 0, len - remaining); + r->pos += remaining; + } else { + memcpy(dest, r->mem+r->pos, len); + r->pos += len; + } +} +static void reader_reset(memreader_t*r) +{ + r->pos; +} +#define INIT_READ(r,data,length,pos) memreader_t r = {(data),(pos),(length)}; + +static void expand(ttf_table_t*w, int newsize) +{ + int v1 = (newsize+63)&~63; + int v2 = w->len + w->len / 2; + w->memsize = v1>v2?v1:v2; + w->data = rfx_realloc(w->data, w->memsize); +} +static inline void writeU8(ttf_table_t*w, unsigned char b) +{ + if(w->memsizelen+1) + expand(w, w->len+1); + w->data[w->len++] = b; +} +static inline void writeU16(ttf_table_t*w, unsigned short v) +{ + if(w->memsizelen+2) + expand(w, w->len+2); + w->data[w->len++] = v>>8; + w->data[w->len++] = v; +} +static inline void writeU16_LE(ttf_table_t*w, unsigned short v) +{ + if(w->memsizelen+2) + expand(w, w->len+2); + w->data[w->len++] = v; + w->data[w->len++] = v>>8; +} +#define writeS16 writeU16 +static inline void writeU32(ttf_table_t*w, unsigned long v) +{ + if(w->memsizelen+4) + expand(w, w->len+4); + w->data[w->len++] = v>>24; + w->data[w->len++] = v>>16; + w->data[w->len++] = v>>8; + w->data[w->len++] = v; +} +static inline void writeU32_LE(ttf_table_t*w, unsigned long v) +{ + if(w->memsizelen+4) + expand(w, w->len+4); + w->data[w->len++] = v; + w->data[w->len++] = v>>8; + w->data[w->len++] = v>>16; + w->data[w->len++] = v>>24; +} +static inline void writeBlock(ttf_table_t*w, void*data, int len) +{ + if(w->memsizelen+len) + expand(w, w->len+len); + memcpy(w->data+w->len, data, len); + w->len += len; +} + +ttf_table_t*ttf_table_new(U32 id) +{ + ttf_table_t*t = rfx_calloc(sizeof(ttf_table_t)); + t->id = id; + return t; +} + +ttf_table_t*ttf_addtable(ttf_t*ttf, U32 id) +{ + ttf_table_t*t = ttf_table_new(id); + + ttf_table_t*before,*after=0; + for(before=ttf->tables; before&&before->idnext) { + after=before; + } + if(before && before->id == id) { + msg(" Error: duplicate table %08x", id); + free(before->data); + before->data = 0; + before->len = 0; + return before; + } + + if(!after) { + t->next = ttf->tables; + ttf->tables = t; + } else { + t->prev = after; + t->next = after->next; + after->next = t; + } + if(t->next) + t->next->prev = t; + return t; +} +ttf_table_t*ttf_find_table(ttf_t*ttf, U32 id) +{ + ttf_table_t*table = ttf->tables; + while(table) { + if(table->id == id) + return table; + table = table->next; + } + return 0; +} +void ttf_table_delete(ttf_t*ttf, ttf_table_t*table) +{ + if(ttf && ttf->tables == table) { + ttf->tables = table->next; + } + if(table->prev) + table->prev->next = table->next; + if(table->next) + table->next->prev = table->prev; + free(table->data); + free(table); +} +U32 ttf_table_checksum(ttf_table_t*t) +{ + U32 checksum = checksum_block(t->data, t->len); + if(t->id==TAG_HEAD && t->len>=12) { + /* the checksum for the HEAD table is calculated by masking out + the checksumadjust field */ + U32 adjust = t->data[8]<<24|t->data[9]<<16|t->data[10]<<8|t->data[11]; + checksum -= adjust; + } + return checksum; +} +static U8 printable(U8 a) +{ + if(a<32 || a==127) return '.'; + else return a; +} +static void hexdump(U8*data, int len, const char*prefix) +{ + int t; + char ascii[32]; + printf("%s -=> ",prefix); + for(t=0;t ",ascii,prefix); + } + } +} +static void ttf_table_dump(ttf_table_t*t, const char*prefix) +{ + if(!t) return; + hexdump(t->data, t->len, prefix); +} + +static table_head_t*head_new(ttf_t*ttf) +{ + table_head_t*head = rfx_calloc(sizeof(table_head_t)); + head->units_per_em = 1024; + int t; + if(ttf->num_glyphs) { + head->xmin = ttf->glyphs[0].xmin; + head->ymin = ttf->glyphs[0].ymin; + head->xmax = ttf->glyphs[0].xmax; + head->ymax = ttf->glyphs[0].ymax; + for(t=1;tnum_glyphs;t++) { + if(ttf->glyphs[t].xmin < head->xmin) head->xmin = ttf->glyphs[t].xmin; + if(ttf->glyphs[t].ymin < head->ymin) head->ymin = ttf->glyphs[t].ymin; + if(ttf->glyphs[t].xmax > head->xmax) head->xmax = ttf->glyphs[t].xmax; + if(ttf->glyphs[t].ymax > head->ymax) head->ymax = ttf->glyphs[t].ymax; + } + } + head->macStyle = 0; + head->lowest_readable_size = 8; // not sure what font renderers actually do with this + head->dir_hint = 0; + return head; +} +static int head_parse(ttf_t*ttf, memreader_t*r) +{ + ttf->head = rfx_calloc(sizeof(table_head_t)); + U32 version = readU32(r); + if(version!=VERSION_1_0) + msg(" Font HEAD has unknown version %08x", version); + U32 revision = readU32(r); + U32 checksum2 = readU32(r); + U32 magic = readU32(r); + if(magic!=0x5f0f3cf5) + msg(" Font HEAD has unknown magic number %08x", magic); + ttf->head->flags = readU16(r); + ttf->head->units_per_em = readU16(r); + readU32(r);readU32(r); //created + readU32(r);readU32(r); //modified + ttf->head->xmin = readU16(r); + ttf->head->ymin = readU16(r); + ttf->head->xmax = readU16(r); + ttf->head->ymax = readU16(r); + ttf->head->macStyle = readU16(r); + ttf->head->lowest_readable_size = readU16(r); //in pixels + ttf->head->dir_hint = readS16(r); + int loc_index = readS16(r); //used in 'loca' table + if(loc_index>1) + msg(" loca index format %d unknown", loc_index); + U16 glyph_data_format = readS16(r); + if(glyph_data_format!=0) + msg(" Font glyph data format unknown: %04x", glyph_data_format); + if(r->pos < r->size) { + msg(" Leftover bytes (%d) in HEAD tag", r->size - r->pos); + } + return loc_index; +} +static void head_write(ttf_t*ttf, ttf_table_t*w, int loca_size) +{ + writeU32(w, 0x10000); + writeU32(w, 0x10000); + writeU32(w, 0); //checksum + writeU32(w, 0x5f0f3cf5); //magic + writeU16(w, ttf->head->flags); + writeU16(w, ttf->head->units_per_em); + writeU32(w, 0);writeU32(w, 0); //created + writeU32(w, 0);writeU32(w, 0); //modified + writeU16(w, ttf->head->xmin); + writeU16(w, ttf->head->ymin); + writeU16(w, ttf->head->xmax); + writeU16(w, ttf->head->ymax); + writeU16(w, ttf->head->macStyle); + writeU16(w, ttf->head->lowest_readable_size); + writeS16(w, ttf->head->dir_hint); + writeS16(w, loca_size); //loca index size (32 bit) + writeS16(w, 0); //glyph data format +} +static void head_dump(ttf_t*ttf) +{ + printf("head->flags: %d\n", ttf->head->flags); + printf("head->units_per_em: %d\n", ttf->head->units_per_em); + printf("head->xmin: %d\n", ttf->head->xmin); + printf("head->ymin: %d\n", ttf->head->ymin); + printf("head->xmax: %d\n", ttf->head->xmax); + printf("head->ymax: %d\n", ttf->head->ymax); + printf("head->macStyle: %d\n", ttf->head->macStyle); + printf("head->lowest_readable_size: %d\n", ttf->head->lowest_readable_size); + printf("head->dir_hint: %d\n", ttf->head->dir_hint); +} +static void head_delete(ttf_t*ttf) +{ + if(ttf->head) { + free(ttf->head); + ttf->head=0; + } +} + +static table_os2_t*os2_new(ttf_t*ttf) +{ + table_os2_t*os2 = rfx_calloc(sizeof(table_os2_t)); + if(ttf->num_glyphs) { + int average_width=0; + int t; + for(t=0;tnum_glyphs;t++) { + average_width += (ttf->glyphs[t].advance + ttf->glyphs[t].bearing); + } + os2->xAvgCharWidth = average_width / ttf->num_glyphs; + } + + /* that's what everybody seems to fill in */ + os2->usWeightClass = 400; + os2->usWidthClass = 5; + + if(ttf->head) { + int advance = (ttf->head->xmax - ttf->head->xmin)/2; + int height = (ttf->head->xmax - ttf->head->xmin); + int ymid = height/2; + /* I do believe a sane font rendering engine will actually use + the font advance here- the subscript/superscript position will + not be the same for each glyph */ + os2->ySuperscriptXSize = os2->ySubscriptXSize = (ttf->head->xmax - ttf->head->xmin)/2; + os2->ySuperscriptYSize = os2->ySubscriptYSize = (ttf->head->ymax - ttf->head->ymin)/2; + os2->ySubscriptXOffset = advance; + os2->ySubscriptYOffset = 0; + os2->ySuperscriptXOffset = advance; + os2->ySuperscriptYOffset = (ttf->head->ymax - ttf->head->ymin)/2; + os2->yStrikeoutSize = ttf->head->units_per_em / 10; + os2->yStrikeoutPosition = ymid; + os2->usWinAscent = ttf->ascent; + os2->usWinDescent = ttf->descent>0?0:-ttf->descent; + os2->sxHeight = ymid; + os2->sCapHeight = height*2/3; + } + os2->panose_Weight = 4; + + /* strictly speaking we'd have to set 92/64 bits in these tables, depending on + what parts of the unicode table is filled. (e.g. bit 90 = tibetan). */ + os2->ulCharRange[0] = 1; + os2->ulCharRange[1] = 0; + os2->ulCharRange[2] = 0; + os2->ulCharRange[3] = 0; + os2->ulCodePageRange1 = 1; + os2->ulCodePageRange2 = 0; + + if(ttf->unicode_size) { + int min,max; + for(min=0;minunicode_size;min++) + if(ttf->unicode[min]) break; + for(max=ttf->unicode_size-1;max>=0;max--) + if(ttf->unicode[max]) break; + if(min<=max) { + os2->fsFirstCharIndex = min; + os2->fsLastCharIndex = max; + } + } + os2->sTypoAscender = ttf->ascent; + os2->sTypoDescender = ttf->descent; + os2->sTypoLineGap = ttf->lineGap; + + os2->usDefaultChar = 0; + os2->usBreakChar = (ttf->unicode_size>0x20 && ttf->unicode[0x20])?0x20:0; + os2->usMaxContext = 0; // we don't use ligatures yet + return os2; +} +static table_os2_t*os2_parse(memreader_t*r) +{ + table_os2_t*os2 = rfx_calloc(sizeof(table_os2_t)); + U16 version = readU16(r); + /* 0 = TrueType 1.5 + 1 = TrueType 1.66 + 2 = OpenType 1.2 + 3 = OpenType 1.4 */ + if(version!=0 && version!=1 && version!=2 && version!=3) + msg(" Unknown OS2 version: %04x", version); + os2->xAvgCharWidth = readS16(r); + os2->usWeightClass = readU16(r); + os2->usWidthClass = readU16(r); + readU16(r); //fstype + os2->ySubscriptXSize = readU16(r); + os2->ySubscriptYSize = readU16(r); + os2->ySubscriptXOffset = readU16(r); + os2->ySubscriptYOffset = readU16(r); + os2->ySuperscriptXSize = readU16(r); + os2->ySuperscriptYSize = readU16(r); + os2->ySuperscriptXOffset = readU16(r); + os2->ySuperscriptYOffset = readU16(r); + os2->yStrikeoutSize = readU16(r); + os2->yStrikeoutPosition = readU16(r); + os2->sFamilyClass = readU16(r); + os2->panose_FamilyType = readU8(r); + os2->panose_SerifStyle = readU8(r); + os2->panose_Weight = readU8(r); + os2->panose_Proportion = readU8(r); + os2->panose_Contrast = readU8(r); + os2->panose_StrokeVariation = readU8(r); + os2->panose_ArmStyle = readU8(r); + os2->panose_Letterform = readU8(r); + os2->panose_Midline = readU8(r); + os2->panose_XHeight = readU8(r); + os2->ulCharRange[0] = readU32(r); + os2->ulCharRange[1] = readU32(r); + os2->ulCharRange[2] = readU32(r); + os2->ulCharRange[3] = readU32(r); + readU32(r); //vendor + os2->fsSelection = readU16(r); + os2->fsFirstCharIndex = readU16(r); + os2->fsLastCharIndex = readU16(r); + os2->sTypoAscender = readS16(r); + os2->sTypoDescender = readS16(r); + os2->sTypoLineGap = readS16(r); + os2->usWinAscent = readU16(r); + os2->usWinDescent = readU16(r); + if(version<1) return os2; + os2->ulCodePageRange1 = readU32(r); + os2->ulCodePageRange2 = readU32(r); + if(version<2) return os2; + os2->sxHeight = readS16(r); + os2->sCapHeight = readS16(r); + os2->usDefaultChar = readU16(r); + os2->usBreakChar = readU16(r); + os2->usMaxContext = readU16(r); + + if(r->pos < r->size) { + msg(" Leftover bytes (%d) in OS2 tag", r->size - r->pos); + } + return os2; +} +static void os2_write(ttf_t*ttf, ttf_table_t*w) +{ + table_os2_t*os2 = ttf->os2; + U16 version=1; + if(os2->sxHeight|os2->sCapHeight|os2->usDefaultChar|os2->usBreakChar|os2->usMaxContext) { + version=2; + } + writeU16(w, version); + writeS16(w, os2->xAvgCharWidth); + writeU16(w, os2->usWeightClass); + writeU16(w, os2->usWidthClass); + writeU16(w, 0); //fstype + writeU16(w, os2->ySubscriptXSize); + writeU16(w, os2->ySubscriptYSize); + writeU16(w, os2->ySubscriptXOffset); + writeU16(w, os2->ySubscriptYOffset); + writeU16(w, os2->ySuperscriptXSize); + writeU16(w, os2->ySuperscriptYSize); + writeU16(w, os2->ySuperscriptXOffset); + writeU16(w, os2->ySuperscriptYOffset); + writeU16(w, os2->yStrikeoutSize); + writeU16(w, os2->yStrikeoutPosition); + writeU16(w, os2->sFamilyClass); + writeU8(w, os2->panose_FamilyType); + writeU8(w, os2->panose_SerifStyle); + writeU8(w, os2->panose_Weight); + writeU8(w, os2->panose_Proportion); + writeU8(w, os2->panose_Contrast); + writeU8(w, os2->panose_StrokeVariation); + writeU8(w, os2->panose_ArmStyle); + writeU8(w, os2->panose_Letterform); + writeU8(w, os2->panose_Midline); + writeU8(w, os2->panose_XHeight); + writeU32(w, os2->ulCharRange[0]); + writeU32(w, os2->ulCharRange[1]); + writeU32(w, os2->ulCharRange[2]); + writeU32(w, os2->ulCharRange[3]); + writeU32(w, 0x53434244); //vendor + writeU16(w, os2->fsSelection); + writeU16(w, os2->fsFirstCharIndex); + writeU16(w, os2->fsLastCharIndex); + writeS16(w, os2->sTypoAscender); + writeS16(w, os2->sTypoDescender); + writeS16(w, os2->sTypoLineGap); + writeU16(w, os2->usWinAscent); + writeU16(w, os2->usWinDescent); + if(version<1) return; + writeU32(w, os2->ulCodePageRange1); + writeU32(w, os2->ulCodePageRange2); + if(version<2) return; + writeS16(w, os2->sxHeight); + writeS16(w, os2->sCapHeight); + writeU16(w, os2->usDefaultChar); + writeU16(w, os2->usBreakChar); + writeU16(w, os2->usMaxContext); +} +static void os2_dump(ttf_t*ttf) +{ + table_os2_t*os2 = ttf->os2; + if(!os2) return; + printf("os2->xAvgCharWidth: %d\n", os2->xAvgCharWidth); + printf("os2->usWeightClass: %d\n", os2->usWeightClass); + printf("os2->usWidthClass: %d\n", os2->usWidthClass); + printf("os2->ySubscriptXSize: %d\n", os2->ySubscriptXSize); + printf("os2->ySubscriptYSize: %d\n", os2->ySubscriptYSize); + printf("os2->ySubscriptXOffset: %d\n", os2->ySubscriptXOffset); + printf("os2->ySubscriptYOffset: %d\n", os2->ySubscriptYOffset); + printf("os2->ySuperscriptXSize: %d\n", os2->ySuperscriptXSize); + printf("os2->ySuperscriptYSize: %d\n", os2->ySuperscriptYSize); + printf("os2->ySuperscriptXOffset: %d\n", os2->ySuperscriptXOffset); + printf("os2->ySuperscriptYOffset: %d\n", os2->ySuperscriptYOffset); + printf("os2->yStrikeoutSize: %d\n", os2->yStrikeoutSize); + printf("os2->yStrikeoutPosition: %d\n", os2->yStrikeoutPosition); + printf("os2->sFamilyClass: %d\n", os2->sFamilyClass); + printf("os2->panose_FamilyType: %d\n", os2->panose_FamilyType); + printf("os2->panose_SerifStyle: %d\n", os2->panose_SerifStyle); + printf("os2->panose_Weight: %d\n", os2->panose_Weight); + printf("os2->panose_Proportion: %d\n", os2->panose_Proportion); + printf("os2->panose_Contrast: %d\n", os2->panose_Contrast); + printf("os2->panose_StrokeVariation: %d\n", os2->panose_StrokeVariation); + printf("os2->panose_ArmStyle: %d\n", os2->panose_ArmStyle); + printf("os2->panose_Letterform: %d\n", os2->panose_Letterform); + printf("os2->panose_Midline: %d\n", os2->panose_Midline); + printf("os2->panose_XHeight: %d\n", os2->panose_XHeight); + printf("os2->ulCharRange[0]: %d\n", os2->ulCharRange[0]); + printf("os2->ulCharRange[1]: %d\n", os2->ulCharRange[1]); + printf("os2->ulCharRange[2]: %d\n", os2->ulCharRange[2]); + printf("os2->ulCharRange[3]: %d\n", os2->ulCharRange[3]); + printf("os2->fsSelection: %d\n", os2->fsSelection); + printf("os2->fsFirstCharIndex: %d\n", os2->fsFirstCharIndex); + printf("os2->fsLastCharIndex: %d\n", os2->fsLastCharIndex); + printf("os2->sTypoAscender: %d\n", os2->sTypoAscender); + printf("os2->sTypoDescender: %d\n", os2->sTypoDescender); + printf("os2->sTypoLineGap: %d\n", os2->sTypoLineGap); + printf("os2->usWinAscent: %d\n", os2->usWinAscent); + printf("os2->usWinDescent: %d\n", os2->usWinDescent); + printf("os2->ulCodePageRange1: %d\n", os2->ulCodePageRange1); + printf("os2->ulCodePageRange2: %d\n", os2->ulCodePageRange2); + printf("os2->sxHeight: %d\n", os2->sxHeight); + printf("os2->sCapHeight: %d\n", os2->sCapHeight); + printf("os2->usDefaultChar: %d\n", os2->usDefaultChar); + printf("os2->usBreakChar: %d\n", os2->usBreakChar); + printf("os2->usMaxContext: %d\n", os2->usMaxContext); +} +static void os2_delete(ttf_t*ttf) +{ + if(ttf->os2) + free(ttf->os2); + ttf->os2=0; +} + +static table_maxp_t*maxp_new(ttf_t*ttf) +{ + table_maxp_t*maxp = rfx_calloc(sizeof(table_maxp_t)); + int t; + maxp->maxContours=1; + if(ttf->num_glyphs) { + int max = 1; + for(t=0;tnum_glyphs;t++) { + if(ttf->glyphs[t].num_points>max) + max = ttf->glyphs[t].num_points; + int contours = 0; + int s; + for(s=0;sglyphs[t].num_points;s++) { + if(ttf->glyphs[t].points[s].flags&GLYPH_CONTOUR_END) + contours++; + } + if(maxp->maxContours < contours) + maxp->maxContours = contours; + } + maxp->maxPoints = max; + + /* we don't generate composite glyphs yet */ + maxp->maxComponentPoints = 0; + maxp->maxComponentContours = 0; + } + maxp->maxZones = 2; // we don't use the Z0 zone + return maxp; +} +static table_maxp_t* maxp_parse(ttf_t*ttf, memreader_t*r) +{ + U32 version = readU32(r); + ttf->num_glyphs = readU16(r); + /* according to freetype, older fonts (version<0x10000) + apparently only contain the number of glyphs. this is + rather rare, though. */ + if(version<0x10000 && r->size==6) return 0; + + if(r->size<32) + msg(" Truncated maxp table (version %d)", version); + + table_maxp_t*maxp = rfx_calloc(sizeof(table_maxp_t)); + maxp->maxPoints = readU16(r); + maxp->maxContours = readU16(r); + maxp->maxComponentPoints = readU16(r); + maxp->maxComponentContours = readU16(r); + maxp->maxZones = readU16(r); + maxp->maxTwilightPoints = readU16(r); + maxp->maxStorage = readU16(r); + maxp->maxFunctionDefs = readU16(r); + maxp->maxInstructionDefs = readU16(r); + maxp->maxStackElements = readU16(r); + maxp->maxSizeOfInstructions = readU16(r); + maxp->maxComponentElements = readU16(r); + maxp->maxComponentDepth = readU16(r); + return maxp; +} +static void maxp_write(ttf_t*ttf, ttf_table_t*w) +{ + table_maxp_t*maxp = ttf->maxp; + if(!maxp) { + /* version 0.5 simplified maxp table */ + writeU32(w, 0x00005000); + writeU16(w, ttf->num_glyphs); + return; + } + writeU32(w, 0x10000); //version + writeU16(w, ttf->num_glyphs); + writeU16(w, maxp->maxPoints); + writeU16(w, maxp->maxContours); + writeU16(w, maxp->maxComponentPoints); + writeU16(w, maxp->maxComponentContours); + writeU16(w, maxp->maxZones); + writeU16(w, maxp->maxTwilightPoints); + writeU16(w, maxp->maxStorage); + writeU16(w, maxp->maxFunctionDefs); + writeU16(w, maxp->maxInstructionDefs); + writeU16(w, maxp->maxStackElements); + writeU16(w, maxp->maxSizeOfInstructions); + writeU16(w, maxp->maxComponentElements); + writeU16(w, maxp->maxComponentDepth); +} +static void maxp_dump(ttf_t*ttf) +{ + table_maxp_t*maxp = ttf->maxp; + if(!maxp) return; + printf("maxp->maxPoints: %d\n", maxp->maxPoints); + printf("maxp->maxContours: %d\n", maxp->maxContours); + printf("maxp->maxComponentPoints: %d\n", maxp->maxComponentPoints); + printf("maxp->maxComponentContours: %d\n", maxp->maxComponentContours); + printf("maxp->maxZones: %d\n", maxp->maxZones); + printf("maxp->maxTwilightPoints: %d\n", maxp->maxTwilightPoints); + printf("maxp->maxStorage: %d\n", maxp->maxStorage); + printf("maxp->maxFunctionDefs: %d\n", maxp->maxFunctionDefs); + printf("maxp->maxInstructionDefs: %d\n", maxp->maxInstructionDefs); + printf("maxp->maxStackElements: %d\n", maxp->maxStackElements); + printf("maxp->maxSizeOfInstructions: %d\n", maxp->maxSizeOfInstructions); + printf("maxp->maxComponentElements: %d\n", maxp->maxComponentElements); + printf("maxp->maxComponentDepth: %d\n", maxp->maxComponentDepth); +} +static void maxp_delete(ttf_t*ttf) +{ + if(ttf->maxp) + free(ttf->maxp); + ttf->maxp=0; +} + +static table_hea_t*hea_new(ttf_t*ttf) +{ + table_hea_t*hea = rfx_calloc(sizeof(table_hea_t)); + if(ttf->num_glyphs) { + int t; + for(t=0;tnum_glyphs;t++) { + if(ttf->glyphs[t].advance > hea->advanceWidthMax) + hea->advanceWidthMax = ttf->glyphs[t].advance; + if(ttf->glyphs[t].bearing < hea->minLeftSideBearing) + hea->minLeftSideBearing = ttf->glyphs[t].bearing; + if(ttf->glyphs[t].xmax < hea->minRightSideBearing) + hea->minRightSideBearing = ttf->glyphs[t].xmax; + int width = ttf->glyphs[t].xmax - ttf->glyphs[t].xmin; + if(width > hea->xMaxExtent) + hea->xMaxExtent = width; + } + hea->caretSlopeRise = 1; + } + return hea; +} +static int hea_parse(memreader_t*r, ttf_t*ttf) +{ + table_hea_t*hea = ttf->hea = rfx_calloc(sizeof(table_hea_t)); + U32 version = readU32(r); + ttf->ascent = readS16(r); + ttf->descent = readS16(r); + ttf->lineGap = readS16(r); + hea->advanceWidthMax = readU16(r); + hea->minLeftSideBearing = readS16(r); + hea->minRightSideBearing = readS16(r); + hea->xMaxExtent = readS16(r); + hea->caretSlopeRise = readS16(r); + hea->caretSlopeRun = readS16(r); + hea->caretOffset = readS16(r); + readS16(r); //reserved[0] + readS16(r); //reserved[1] + readS16(r); //reserved[2] + readS16(r); //reserved[3] + S16 metricDataFormat = readS16(r); //should be 0 + if(metricDataFormat!=0) { + msg(" Unknown metric format %d", metricDataFormat); + } + int num_advances = readU16(r); + if(num_advances > ttf->num_glyphs) { + msg(" bad number of horizontal metrics: %d", num_advances); + num_advances = ttf->num_glyphs; + } + return num_advances; +} +static table_hea_t*hea_write(ttf_t*ttf, ttf_table_t*w, int num_advances) +{ + table_hea_t*hea = ttf->hea; + writeU32(w, 0x00010000); + writeS16(w, ttf->ascent); + writeS16(w, ttf->descent); + writeS16(w, ttf->lineGap); + writeU16(w, hea->advanceWidthMax); + writeS16(w, hea->minLeftSideBearing); + writeS16(w, hea->minRightSideBearing); + writeS16(w, hea->xMaxExtent); + writeS16(w, hea->caretSlopeRise); + writeS16(w, hea->caretSlopeRun); + writeS16(w, hea->caretOffset); + writeS16(w, 0); //reserved + writeS16(w, 0); //reserved + writeS16(w, 0); //reserved + writeS16(w, 0); //reserved + writeS16(w, 0); //metricDataFormat + writeU16(w, num_advances); + return hea; +} +static void hea_dump(ttf_t*ttf) +{ + table_hea_t*hea = ttf->hea; + if(!hea) return; + const char*dir = ttf->is_vertical?"v":"h"; + printf("%shea->ascent: %d\n", dir, ttf->ascent); + printf("%shea->descent: %d\n", dir, ttf->descent); + printf("%shea->lineGap: %d\n", dir, ttf->lineGap); + printf("%shea->advanceWidthMax: %d\n", dir, hea->advanceWidthMax); + printf("%shea->minLeftSideBearing: %d\n", dir, hea->minLeftSideBearing); + printf("%shea->minRightSideBearing: %d\n", dir, hea->minRightSideBearing); + printf("%shea->xMaxExtent: %d\n", dir, hea->xMaxExtent); + printf("%shea->caretSlopeRise: %d\n", dir, hea->caretSlopeRise); + printf("%shea->caretSlopeRun: %d\n", dir, hea->caretSlopeRun); + printf("%shea->caretOffset: %d\n", dir, hea->caretOffset); +} +static void hea_delete(ttf_t*ttf) +{ + if(ttf->hea) { + free(ttf->hea); + ttf->hea=0; + } +} + +static void mtx_parse(memreader_t*r, ttf_t*ttf, int num_advances) +{ + U16 old_advance = 0; + int t; + if(num_advances > r->size/4) + num_advances = r->size/4; + for(t=0;tglyphs[t].advance = readU16(r); + ttf->glyphs[t].bearing = readS16(r); + } + int rest = (r->size - num_advances*4)/2; + if(ttf->num_glyphs < num_advances+rest) { + rest = ttf->num_glyphs-num_advances; + } + for(t=0;tglyphs[t].advance = old_advance; + ttf->glyphs[t].bearing = readS16(r); + } +} +static int mtx_write(ttf_t*ttf, ttf_table_t*w) +{ + int num_advances = ttf->num_glyphs; + if(ttf->num_glyphs>=2) { + int t; + for(t=ttf->num_glyphs-1;t>0;t--) { + if(ttf->glyphs[t-1].advance != + ttf->glyphs[t].advance) break; + } + /* we need to store all individual advances as well + as one entry for the constant */ + num_advances = t+1; + } + + int t; + for(t=0;tglyphs[t].advance); + writeS16(w, ttf->glyphs[t].bearing); + } + for(;tnum_glyphs;t++) { + writeS16(w, ttf->glyphs[t].bearing); + } + return num_advances; +} + +static U32*loca_parse(memreader_t*r, ttf_t*ttf, int size) +{ + int t; + int num = ttf->num_glyphs+1; + U32*locations = rfx_calloc(num*sizeof(U32)); + U32 lastloc = 0; + U32 loc = 0; + char warn_unsorted = 1; + if(size) { + if(num*4 > r->size) { + msg(" Short 'loca' table (32 bit): %d/%d", r->size/4, num); + num=r->size/4; + } + if(num*4 < r->size) { + msg(" Extraneous data (%d bytes) in 'loca' table (32 bit)", r->size-num*4); + } + for(t=0;t loc && warn_unsorted) { + msg(" Unsorted 'loca' table (32 bit)"); + warn_unsorted=0; + } + lastloc = loc; + } + } else { + if(num*2 > r->size) { + msg(" Short 'loca' table (16 bit)"); + num=r->size/2; + } + if(num*2 < r->size) { + msg(" Extraneous data (%d bytes) in 'loca' table (16 bit)", r->size-num*2); + } + for(t=0;t loc && warn_unsorted) { + msg(" Unsorted 'loca' table"); + warn_unsorted=0; + } + lastloc = loc; + } + } + return locations; +} +static int loca_write(ttf_t*ttf, ttf_table_t*w, U32*locations) +{ + int t; + char use_32bit = 0; + for(t=0;t<=ttf->num_glyphs;t++) { + if(locations[t]>=0x20000 || (locations[t]&1)) { + use_32bit = 1; + break; + } + } + + if(use_32bit) { + for(t=0;t<=ttf->num_glyphs;t++) { + writeU32(w, locations[t]); + } + return 1; + } else { + for(t=0;t<=ttf->num_glyphs;t++) { + writeU16(w, locations[t]/2); + } + return 0; + } +} + +static int parse_simple_glyph(ttf_t*ttf, memreader_t*r, int num_contours, int glyphnr) +{ + ttfglyph_t*glyph = &ttf->glyphs[glyphnr]; + + U16*endpoints = 0; + if(num_contours>0) { + endpoints = malloc(sizeof(U16)*num_contours); + int s; + int lastpos = -1; + for(s=0;s Unsorted endpoints array (len:%d) last=%d now=%d", s, pos, lastpos); + } + lastpos = pos; + } + } + U16 code_len = readU16(r); + if(code_len) { + glyph->code = malloc(sizeof(U16)*code_len); + readBlock(r, glyph->code, code_len); + glyph->code_size = code_len; + } + + if(!endpoints) + return 1; + + /*msg(" TTF Glyph %d) code_size=%d num_contours=%d glyph->num_points=%d %d/%d/%d/%d", + glyphnr, code_len, num_contours, glyph->num_points, + xmin, ymin, xmax, ymax);*/ + INIT_READ(fx, r->mem, r->size, r->pos); + INIT_READ(fy, r->mem, r->size, r->pos); + + glyph->num_points = endpoints[num_contours-1] + 1; + glyph->points = rfx_calloc(sizeof(ttfpoint_t)*glyph->num_points); + + /* parse flag array (1st pass- to determine start of coordinates) */ + int num=0; + while(numnum_points) { + U8 flag = readU8(r); + if(flag&0xc0) { + msg(" Bad flags in glyph outline: %02x (at pos %d)", flag, num); + free(glyph->points); + glyph->points = 0; + glyph->num_points = 0; + return 0; + } + int count = 1; + if(flag & 0x08) + count += readU8(r); + if(count+num>glyph->num_points) { + msg(" Bad count (%d) in glyph (%d) (at pos %d)", count, glyphnr, num); + count = glyph->num_points-num; + } + num+=count; + } + + /* parse flag array (2nd pass) and x coordinates */ + num=0; + int x = 0; + char is_start=1; + int contour_pos=0; + int bytepos = r->pos; + while(numnum_points) { + U8 flag = readU8(&fx); + int count = flag&8?readU8(&fx)+1:1; + count=count>glyph->num_points-num?glyph->num_points-num:(count?count:1); + do { + char is_end=0; + if(contour_pospoints[num].x = x; + U8 f = flag&GLYPH_ON_CURVE; + if(is_start) f|=GLYPH_CONTOUR_START; + if(is_end) f|=GLYPH_CONTOUR_END; + glyph->points[num].flags = f; + num++; + is_start = is_end; + } while(--count); + } + + /* parse flag array (3rd pass) and y coordinates */ + num=0; + int y = 0; + while(numnum_points) { + U8 flag = readU8(&fy); + int count = flag&8?readU8(&fy)+1:1; + count=count>glyph->num_points-num?glyph->num_points-num:(count?count:1); + do { + if((flag&0x24) == 0x24) y += readU8(r); + else if((flag&0x24) == 0x04) y -= readU8(r); + else if((flag&0x24) == 0x00) y += readS16(r); + glyph->points[num].y = y; + num++; + } while(--count); + } + free(endpoints); + return 1; +} +static void glyf_parse(memreader_t*rr, ttf_t*ttf, U32*loca) +{ + int t; + char warn_about_compound_glyphs=0; + for(t=0;tnum_glyphs;t++) { + INIT_READ(r, rr->mem, rr->size, loca[t]); + if(loca[t]==loca[t+1] || loca[t]==r.size) + continue; //empty glyph + if(r.pos+10>r.size) { + msg(" Truncated glyph entry %d/%d (or bad loca entry %d/%d, next loca: %d)", + t, ttf->num_glyphs, loca[t], r.size, loca[t+1]); + break; + } + S16 num_contours = readS16(&r); + ttf->glyphs[t].xmin = readS16(&r); + ttf->glyphs[t].ymin = readS16(&r); + ttf->glyphs[t].xmax = readS16(&r); + ttf->glyphs[t].ymax = readS16(&r); + + if(num_contours<0) { + if(warn_about_compound_glyphs) + msg(" Compound glyphs not supported yet"); + warn_about_compound_glyphs=0; + } else { + if(!parse_simple_glyph(ttf, &r, num_contours, t)) + return; + } + } + +} +void write_simple_glyph(ttf_table_t*w, ttfglyph_t*g) +{ + /* endpoints array */ + int s; + for(s=0;snum_points;s++) { + if(g->points[s].flags&GLYPH_CONTOUR_END) + writeU16(w, s); + } + + /* bytecode */ + writeU16(w, g->code_size); + if(g->code_size) + writeBlock(w, g->code, g->code_size); + + /* flags */ + int lastx=0; + int lasty=0; + int lastflag=-1; + int flagcount=0; + for(s=0;snum_points;s++) { + ttfpoint_t*p = &g->points[s]; + int dx = p->x - lastx; + int dy = p->y - lasty; + U8 flags = p->flags&GLYPH_ON_CURVE; + if(!dx) { + flags|=0x10; + } else if(dx<0 && dx>=-255) { + flags|=0x02; + } else if(dx>0 && dx<=255) { + flags|=0x12; + } + if(!dy) { + flags|=0x20; + } else if(dy<0 && dy>=-255) { + flags|=0x04; + } else if(dy>0 && dy<=255) { + flags|=0x24; + } + if(flags == lastflag && flagcount<255) { + flagcount++; + } else { + if(lastflag>=0) { + if(flagcount) { + writeU8(w, lastflag|8); + writeU8(w, flagcount); + } else { + writeU8(w, lastflag); + } + } + lastflag = flags; + flagcount = 0; + } + lastx = p->x; + lasty = p->y; + } + if(lastflag>=0) { + if(flagcount) { + writeU8(w, lastflag|8); + writeU8(w, flagcount); + } else { + writeU8(w, lastflag); + } + } + /* coordinates */ + lastx=0; + int bytepos = w->len; + for(s=0;snum_points;s++) { + ttfpoint_t*p = &g->points[s]; + int dx = p->x - lastx; + if(dx>32767 || dx<-32768) { + msg(" Coordinate overflow in glyph"); + } + lastx = p->x; + if(dx>0 && dx<=255) writeU8(w, dx); + else if(dx<0 && dx>=-255) writeU8(w, -dx); + else if(dx) writeS16(w, dx); + } + + lasty=0; + for(s=0;snum_points;s++) { + ttfpoint_t*p = &g->points[s]; + int dy = p->y - lasty; + if(dy>32767 || dy<-32768) { + msg(" Coordinate overflow in glyph"); + } + lasty = p->y; + if(dy>0 && dy<=255) writeU8(w, dy); + else if(dy<0 && dy>=-255) writeU8(w, -dy); + else if(dy) writeS16(w, dy); + } +} +U32* glyf_write(ttf_t* ttf, ttf_table_t*w) +{ + U32*locations = malloc(sizeof(U32)*(ttf->num_glyphs+1)); + int t; + for(t=0;tnum_glyphs;t++) { + locations[t] = w->len; + ttfglyph_t*g = &ttf->glyphs[t]; + int s; + int num_contours = 0; + for(s=0;snum_points;s++) { + if(g->points[s].flags&GLYPH_CONTOUR_END) + num_contours++; + } + writeS16(w, num_contours?num_contours:1); + writeS16(w, g->xmin); + writeS16(w, g->ymin); + writeS16(w, g->xmax); + writeS16(w, g->ymax); + + if(!num_contours) { + /* some ttf parsers can't deal with zero contours, so in the case + of an empty glyph, write a single point (0,0) */ + writeU16(w, 0); //endpoint of 1st contour + writeU16(w, g->code_size); + if(g->code_size) + writeBlock(w, g->code, g->code_size); + writeU8(w, 0x31); //flag (xy=(0,0),on curve) + } else { + write_simple_glyph(w, g); + } + } + locations[t] = w->len; + return locations; +} +void glyf_dump(ttf_t* ttf) +{ + if(!ttf->glyphs) return; + int t; + for(t=0;tnum_glyphs;t++) { + ttfglyph_t*g = &ttf->glyphs[t]; + printf("glyph %d)\n", t); + printf(" advance=%d\n", g->advance); + printf(" bearing=%d\n", g->bearing); + printf(" bbox=(%d/%d/%d/%d)\n", g->xmin, g->ymin, g->xmax, g->ymax); + printf(" points=("); + int s; + for(s=0;snum_points;s++) { + if(s) printf(","); + printf("%d/%d/0x%02x", g->points[s].x, g->points[s].y, g->points[s].flags); + } + printf(")\n"); + if(g->code_size) + hexdump(g->code, g->code_size, " "); + } +} +void glyf_delete(ttf_t* ttf) +{ + if(!ttf->glyphs) + return; + int t; + for(t=0;tnum_glyphs;t++) { + if(ttf->glyphs[t].code) { + free(ttf->glyphs[t].code); + ttf->glyphs[t].code = 0; + } + if(ttf->glyphs[t].points) { + free(ttf->glyphs[t].points); + ttf->glyphs[t].points = 0; + } + } + free(ttf->glyphs);ttf->glyphs=0; +} + +static void grow_unicode(ttf_t*ttf, int index) +{ + int size = index+1; + if(!ttf->unicode) { + ttf->unicode = rfx_calloc(sizeof(ttf->unicode[0])*size); + } else if(ttf->unicode_sizeunicode = rfx_realloc(ttf->unicode, sizeof(ttf->unicode[0])*size); + memset(ttf->unicode+ttf->unicode_size, 0, sizeof(ttf->unicode[0])*(size - ttf->unicode_size)); + } + ttf->unicode_size = size; +} +void cmap_parse(memreader_t*r, ttf_t*ttf) +{ + readU16(r); // version (0) + int num_subtables = readU16(r); + int t; + char warn=1; + if(r->pos+num_subtables*8 > r->size) { + msg(" CMap overflow"); + num_subtables = (r->size-r->pos)/8; + } + unicode_t*data = 0; + for(t=0;tr->size) { + msg(" CMAP table %d %d is out of bounds (%d)", platform, encoding, offset); + continue; + } + + int is_unicode = platform==0 || + platform==3 && encoding == 1 || + platform==3 && encoding == 10; + + if(!is_unicode) + continue; + + INIT_READ(t, r->mem, r->size, offset); + U16 format = readU16(&t); + int length = readU16(&t); + U16 language = readU16(&t); + + if(language) + msg(" Language code %02x in unicode mapping", language); + + int num = 0; + if(format == 0) { + num = length-6; + if(t.pos+length > t.size) { + msg(" overflow in format 0 cmap table"); + num = t.size-t.pos; + } + data = malloc(num*sizeof(unicode_t)); + int s; + grow_unicode(ttf, num); + for(s=0;sunicode[s] = readU8(&t); + } + } else if(format == 4) { + U16 segment_count = readU16(&t); + if(segment_count&1) { + msg(" Bad segmentx2 count %d", segment_count); + continue; + } + segment_count>>=1; + readU16(&t); //searchrange + readU16(&t); //entry selector + readU16(&t); //range shift + INIT_READ(r_end, t.mem, t.size, t.pos); + INIT_READ(r_start, t.mem, t.size, t.pos+2+segment_count*2); + INIT_READ(r_delta, t.mem, t.size, t.pos+2+segment_count*4); + INIT_READ(r_range, t.mem, t.size, t.pos+2+segment_count*6); + int glyphmap_start = t.pos+2+segment_count*8; + int glyphmap_size = t.size - glyphmap_start; + int s; + for(s=0;sunicode[u] = (u + delta) & 0xffff; + } + } else { + int pos = r_range.pos-2+range; + if(warn && pos+end-start+1 > t.size) { + msg(" glyphmap index out of bounds (%d-%d/%d)", pos, pos+end-start, t.size); + warn=0; + } + INIT_READ(g, t.mem, t.size, pos); + for(u=start;u<=end;u++) { + ttf->unicode[u] = readU16(&g); + } + } + } + } + } +} +static int segment_size(unicode_t*unicode, int pos, int size) +{ + int s; + int count=0; + for(s=pos;s4) { + /* a segment costs us 8 bytes, so for more than 4 consecutive + zero entries (16 bit each) in the glyph index array, + it pays off to start a new segment */ + break; + } + } + s -= count; // go to the last filled in entry + if(s==size) + return size-1; + return s; +} +void cmap_write(ttf_t* ttf, ttf_table_t*w) +{ + writeU16(w, 0); //version + writeU16(w, 2); //two tables + + writeU16(w, 0); //platform (unicode) + writeU16(w, 3); //encoding (unicode 2.0) + writeU32(w, 20); //offset + + writeU16(w, 3); //platform (windows) + writeU16(w, 1); //encoding (unicode basic multilingual plane UCS-2) + writeU32(w, 20); //offset + + writeU16(w, 4); // format=4 + int length_pos = w->len; + writeU16(w, 0); // length: we don't know yet + writeU16(w, 0); // language (n/a for unicode) + int num_segments_pos = w->len; + writeU16(w, 0); //number of segments: we don't know yet either + writeU16(w, 0); //searchrange + writeU16(w, 0); //entry selector + writeU16(w, 0); //range shift + + int pos=0; + int num_segments=0; + while(pos < ttf->unicode_size) { + if(!ttf->unicode[pos]) { + pos++; + continue; + } + int s = segment_size(ttf->unicode, pos, ttf->unicode_size); + pos = s+1; + num_segments++; + } + + num_segments++; // account for 0xffff mapping + + int glyphmap_start = w->len+2+num_segments*8; + + int t; + int end_pos = w->len; + for(t=0;tlen; + for(t=0;tlen; + for(t=0;tlen; + for(t=0;tdata[num_segments_pos++]=(num_segments*2)>>8; + w->data[num_segments_pos++]=(num_segments*2); + /* backpatch search range */ + int tmp = num_segments; + int search_range = 0; + while(tmp) { + search_range = tmp; + tmp = tmp&(tmp-1); + } + w->data[num_segments_pos++]=(search_range*2)>>8; + w->data[num_segments_pos++]=(search_range*2); + /* backpatch entry selector */ + int entry_selector = 0; + tmp = search_range; + while(tmp>1) {tmp>>=1;entry_selector++;} + w->data[num_segments_pos++]=entry_selector>>8; + w->data[num_segments_pos++]=entry_selector; + /* backpatch range shift */ + int range_shift = num_segments*2 - search_range*2; + w->data[num_segments_pos++]=range_shift>>8; + w->data[num_segments_pos++]=range_shift; + + pos=0; + num_segments = 0; + while(pos < ttf->unicode_size) { + if(!ttf->unicode[pos]) { + pos++; + continue; + } + U16 end = segment_size(ttf->unicode, pos, ttf->unicode_size); + w->data[end_pos++]=end>>8; + w->data[end_pos++]=end; + w->data[start_pos++]=pos>>8; + w->data[start_pos++]=pos; + int s; + U16 delta = ttf->unicode[pos]-pos; + char do_delta=1; + for(s=pos+1;s<=end;s++) { + U16 delta2 = ttf->unicode[s]-s; + if(delta2!=delta) { + do_delta=0; + break; + } + } + U16 range; + if(do_delta) { + range = 0; + } else { + delta = 0; + range = w->len - range_pos; + for(s=pos;s<=end;s++) { + writeU16(w, ttf->unicode[s]); + } + } + w->data[delta_pos++]=delta>>8; + w->data[delta_pos++]=delta; + w->data[range_pos++]=range>>8; + w->data[range_pos++]=range; + num_segments++; + pos = end+1; + } + + /* write out a mapping from 0xffff to 0- seems to be required + by some libraries (e.g. fonttools) */ + w->data[end_pos++]=0xff; + w->data[end_pos++]=0xff; + w->data[start_pos++]=0xff; + w->data[start_pos++]=0xff; + w->data[delta_pos++]=0; + w->data[delta_pos++]=1; + w->data[range_pos++]=0; + w->data[range_pos++]=0; + + w->data[length_pos]=(w->len-20)>>8; + w->data[length_pos+1]=w->len-20; +} +void cmap_delete(ttf_t*ttf) +{ + if(ttf->unicode) { + free(ttf->unicode); + ttf->unicode=0; + } + ttf->unicode_size=0; +} +static char*readString(memreader_t*r, int len) +{ + char*s = malloc(len+1); + readBlock(r, s, len); + s[len] = 0; + return s; +} +void name_parse(memreader_t*r, ttf_t*ttf) +{ + U16 format = readU16(r); + U16 count = readU16(r); + U16 offset = readU16(r); + + int t; + for(t=0;tmem, r->size, offset+offset_2); + if(!(platform==0 || (platform==1 && encoding==0))) + continue; + + INIT_READ(s, r->mem, r->size, offset+offset_2); + + switch (name_id) { + case 1: read_name = &ttf->family_name; break; + case 2: read_name = &ttf->subfamily_name; break; + case 3: read_name = &ttf->font_uid; break; + case 4: read_name = &ttf->full_name; break; + case 5: read_name = &ttf->version_string; break; + case 6: read_name = &ttf->postscript_name; break; + default: read_name = 0; + } + + if (read_name) { + if (*read_name) free(*read_name); + *read_name = readString(&s, len); + } + } +} +void name_write(ttf_t*ttf, ttf_table_t*table) +{ + char*strings[6] = {ttf->family_name, ttf->subfamily_name, ttf->font_uid, ttf->full_name, ttf->version_string, ttf->postscript_name}; + int codes[6] = {1,2,3,4,5,6}; + + writeU16(table, 0); //format + int count = 0; + int t; + int nr = sizeof(strings)/sizeof(strings[0]); + + for(t=0;tlen; + writeU16(table, 0); //offset (will be filled in later) + + /* Windows expects the name table to be sorted by platform/encoding/language/name_id */ + int offset = 0; + for(t=0;tdata[offset_pos] = table->len>>8; + table->data[offset_pos+1] = table->len; + + for(t=0;tfull_name) { + free(ttf->full_name); + ttf->full_name=0; + } + if(ttf->family_name) { + free(ttf->family_name); + ttf->family_name=0; + } + if(ttf->subfamily_name) { + free(ttf->subfamily_name); + ttf->subfamily_name=0; + } + if(ttf->version_string) { + free(ttf->version_string); + ttf->version_string=0; + } + if(ttf->font_uid) { + free(ttf->font_uid); + ttf->font_uid=0; + } + if(ttf->postscript_name) { + free(ttf->postscript_name); + ttf->postscript_name=0; + } +} + +static table_post_t*post_new(ttf_t*ttf) +{ + table_post_t*post = rfx_calloc(sizeof(table_post_t)); + return post; +} +void post_parse(memreader_t*r, ttf_t*ttf) +{ + table_post_t*post = ttf->post = rfx_calloc(sizeof(table_post_t)); + U32 format = readU32(r); + post->italic_angle = readU32(r); + post->underline_position = readU16(r); + post->underline_thickness = readU16(r); + U16 is_monospaced = readU32(r); + readU32(r); // min mem 42 + readU32(r); + readU32(r); // min mem 1 + readU32(r); +} +void post_write(ttf_t*ttf, ttf_table_t*table) +{ + table_post_t*post = ttf->post; + writeU32(table, 0x00030000); + writeU32(table, post->italic_angle); + writeU16(table, post->underline_position); + writeU16(table, post->underline_thickness); + writeU32(table, 0); //is monospaced TODO + writeU32(table, 0); //min mem 42 + writeU32(table, 0); + writeU32(table, 0); //min mem 1 + writeU32(table, 0); +} +void post_delete(ttf_t*ttf) +{ + if(ttf->post) { + free(ttf->post); + ttf->post = 0; + } +} + +void cvt_parse(memreader_t*r, ttf_t*ttf) +{ + table_cvt_t*cvt = ttf->cvt = rfx_calloc(sizeof(table_cvt_t)); + cvt->num = r->size/2; + cvt->values = malloc(cvt->num*sizeof(S16)); + int t; + for(t=0;tnum;t++) { + cvt->values[t] = readS16(r); + } +} +void cvt_write(ttf_t*ttf, ttf_table_t*table) +{ + table_cvt_t*cvt = ttf->cvt; + int t; + for(t=0;tnum;t++) { + writeS16(table, cvt->values[t]); + } +} +void cvt_delete(ttf_t*ttf) +{ + if(ttf->cvt) { + if(ttf->cvt->values) + free(ttf->cvt->values); + free(ttf->cvt); + ttf->cvt = 0; + } +} + +static table_gasp_t*gasp_new(ttf_t*ttf) +{ + table_gasp_t*gasp = rfx_calloc(sizeof(table_gasp_t)); + gasp->num = 1; + gasp->records = rfx_calloc(sizeof(gasp->records[0])*gasp->num); + + gasp->records[0].size = 65535; + gasp->records[0].behaviour = 15; //gridfit+grayscale rendering + return gasp; +} +void gasp_parse(memreader_t*r, ttf_t*ttf) +{ + table_gasp_t*gasp = ttf->gasp = rfx_calloc(sizeof(table_gasp_t)); + readU16(r); //version + int num = readU16(r); + int t; + if(!num) return; + gasp->records = malloc(sizeof(gasp->records[0])*num); + for(t=0;trecords[t].size = readU16(r); + gasp->records[t].behaviour = readU16(r); + } +} + +#define GASP_SYMMETRIC_GRIDFIT 0x0008 +#define GASP_SYMMETRIC_SMOOTHING 0x0004 +#define GASP_DOGRAY 0x0002 +#define GASP_GRIDFIT 0x0001 + +void gasp_write(ttf_t*ttf, ttf_table_t*table) +{ + table_gasp_t*gasp = ttf->gasp; + int version = 0; + int t; + for(t=0;tnum;t++) { + if(gasp->records[t].behaviour & ~(GASP_GRIDFIT | GASP_DOGRAY)) { + version = 1; + } + } + writeU16(table, version); + writeU16(table, gasp->num); + for(t=0;tnum;t++) { + writeU16(table, gasp->records[t].size); + writeU16(table, gasp->records[t].behaviour); + } +} +void gasp_delete(ttf_t*ttf) +{ + if(ttf->gasp) { + if(ttf->gasp->records) + free(ttf->gasp->records); + free(ttf->gasp); + ttf->gasp = 0; + } +} + +table_code_t*prep_new(ttf_t*ttf) +{ + table_code_t*prep = ttf->prep = rfx_calloc(sizeof(table_code_t)); + ttf_table_t*t = ttf_table_new(0); + writeU8(t,0xb8);writeU16(t,0x1ff); // pushword(0x1ff) + writeU8(t,0x85); //scanctrl (always do dropout, for all sizes) + writeU8(t,0xb0);writeU8(t,1); // pushbyte(1) + writeU8(t,0x8d); //scantype (simple dropout control w/o stubs) + writeU8(t,0xb0);writeU8(t,5); // pushbyte(5) + writeU8(t,0x8d); //scantype (for windows) smart dropout control w/o stubs + prep->code = t->data; + prep->size = t->len; + free(t); + return prep; + +} +void fpgm_parse(memreader_t*r, ttf_t*ttf) +{ + table_code_t*fpgm = ttf->fpgm = rfx_calloc(sizeof(table_code_t)); + if(!r->size) return; + fpgm->size = r->size; + fpgm->code = malloc(r->size); + readBlock(r, fpgm->code, r->size); +} +void fpgm_write(ttf_t*ttf, ttf_table_t*table) +{ + table_code_t*code = ttf->fpgm; + writeBlock(table, code->code, code->size); +} +void fpgm_delete(ttf_t*ttf) +{ + if(ttf->fpgm) { + if(ttf->fpgm->code) + free(ttf->fpgm->code); + free(ttf->fpgm); + ttf->fpgm = 0; + } +} + +void prep_parse(memreader_t*r, ttf_t*ttf) +{ + table_code_t*prep = ttf->prep = rfx_calloc(sizeof(table_code_t)); + if(!r->size) return; + prep->size = r->size; + prep->code = malloc(r->size); + readBlock(r, prep->code, r->size); +} +void prep_write(ttf_t*ttf, ttf_table_t*table) +{ + table_code_t*code = ttf->prep; + writeBlock(table, code->code, code->size); +} +void prep_delete(ttf_t*ttf) +{ + if(ttf->prep) { + if(ttf->prep->code) + free(ttf->prep->code); + free(ttf->prep); + ttf->prep = 0; + } +} + +static int ttf_parse_tables(ttf_t*ttf) +{ + ttf_table_t*table; + + table = ttf_find_table(ttf, TAG_HEAD); + if(!table) { + msg(" Font has no head table"); + return 0; + } + INIT_READ(m, table->data, table->len, 0); + int loc_index = head_parse(ttf, &m); + ttf_table_delete(ttf, table); + + table = ttf_find_table(ttf, TAG_MAXP); + if(!table) { + msg(" Font has no maxp table"); + return 0; + } + INIT_READ(m2, table->data, table->len, 0); + ttf->maxp = maxp_parse(ttf, &m2); + ttf_table_delete(ttf, table); + + if(!ttf->num_glyphs) { + msg(" Invalid number of characters"); + return 0; + } + ttf->glyphs = rfx_calloc(sizeof(ttfglyph_t)*ttf->num_glyphs); + + table = ttf_find_table(ttf, TAG_OS2); + if(table) { + INIT_READ(m, table->data, table->len, 0); + ttf->os2 = os2_parse(&m); + ttf_table_delete(ttf, table); + } + + + table = ttf_find_table(ttf, TAG_HHEA); + if(table) { + INIT_READ(m, table->data, table->len, 0); + int num_advances = hea_parse(&m, ttf); + ttf_table_delete(ttf, table); + + table = ttf_find_table(ttf, TAG_HMTX); + if(table) { + INIT_READ(m, table->data, table->len, 0); + mtx_parse(&m, ttf, num_advances); + ttf_table_delete(ttf, table); + } + } else { + table = ttf_find_table(ttf, TAG_VHEA); + if(table) { + ttf->is_vertical=1; + INIT_READ(m, table->data, table->len, 0); + int num_advances = hea_parse(&m, ttf); + ttf_table_delete(ttf, table); + + table = ttf_find_table(ttf, TAG_VMTX); + if(table) { + INIT_READ(m, table->data, table->len, 0); + mtx_parse(&m, ttf, num_advances); + ttf_table_delete(ttf, table); + } + } else { + msg(" Font contains neither HHEA nor VHEA"); + } + } + table = ttf_find_table(ttf, TAG_LOCA); + if(table) { + INIT_READ(m, table->data, table->len, 0); + U32*loca = loca_parse(&m, ttf, loc_index); + ttf_table_delete(ttf, table); + table = ttf_find_table(ttf, TAG_GLYF); + if(table) { + INIT_READ(m, table->data, table->len, 0); + glyf_parse(&m, ttf, loca); + ttf_table_delete(ttf, table); + } + free(loca); + } + + table = ttf_find_table(ttf, TAG_CMAP); + if(table) { + INIT_READ(m, table->data, table->len, 0); + cmap_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + table = ttf_find_table(ttf, TAG_POST); + if(table) { + INIT_READ(m, table->data, table->len, 0); + post_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + table = ttf_find_table(ttf, TAG_NAME); + if(table) { + INIT_READ(m, table->data, table->len, 0); + name_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + table = ttf_find_table(ttf, TAG_CVT); + if(table) { + INIT_READ(m, table->data, table->len, 0); + cvt_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + table = ttf_find_table(ttf, TAG_GASP); + if(table) { + INIT_READ(m, table->data, table->len, 0); + gasp_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + table = ttf_find_table(ttf, TAG_PREP); + if(table) { + INIT_READ(m, table->data, table->len, 0); + prep_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + table = ttf_find_table(ttf, TAG_FPGM); + if(table) { + INIT_READ(m, table->data, table->len, 0); + fpgm_parse(&m, ttf); + ttf_table_delete(ttf, table); + } + + return 1; +} +static void ttf_collapse_tables(ttf_t*ttf) +{ + ttf_table_t*table; + + ttf_table_t*head = ttf_find_table(ttf, TAG_HEAD); + if(head) + return; //already collapsed + + if(ttf->maxp) { + table = ttf_addtable(ttf, TAG_MAXP); + maxp_write(ttf, table); + maxp_delete(ttf); + } + + if(ttf->os2) { + table = ttf_addtable(ttf, TAG_OS2); + os2_write(ttf, table); + os2_delete(ttf); + } + + if(ttf->hea) { + if(!ttf->is_vertical) { + table = ttf_addtable(ttf, TAG_HMTX); + int num_advances = mtx_write(ttf, table); + table = ttf_addtable(ttf, TAG_HHEA); + hea_write(ttf, table, num_advances); + hea_delete(ttf); + } else { + table = ttf_addtable(ttf, TAG_VMTX); + int num_advances = mtx_write(ttf, table); + table = ttf_addtable(ttf, TAG_VHEA); + hea_write(ttf, table, num_advances); + hea_delete(ttf); + } + } + + int loca_size=0; + if(ttf->num_glyphs) { + if(ttf->unicode) { + table = ttf_addtable(ttf, TAG_CMAP); + cmap_write(ttf, table); + cmap_delete(ttf); + } + + if(ttf->glyphs) { + table = ttf_addtable(ttf, TAG_GLYF); + U32*locations = glyf_write(ttf, table); + table = ttf_addtable(ttf, TAG_LOCA); + loca_size = loca_write(ttf, table, locations); + free(locations); + glyf_delete(ttf); + } + } + + if(ttf->full_name || ttf->family_name || ttf->subfamily_name || ttf->font_uid || ttf->postscript_name) { + table = ttf_addtable(ttf, TAG_NAME); + name_write(ttf, table); + name_delete(ttf); + } + if(ttf->post) { + table = ttf_addtable(ttf, TAG_POST); + post_write(ttf, table); + post_delete(ttf); + } + if(ttf->cvt) { + table = ttf_addtable(ttf, TAG_CVT); + cvt_write(ttf, table); + cvt_delete(ttf); + } + if(ttf->gasp) { + table = ttf_addtable(ttf, TAG_GASP); + gasp_write(ttf, table); + gasp_delete(ttf); + } + if(ttf->fpgm) { + table = ttf_addtable(ttf, TAG_FPGM); + fpgm_write(ttf, table); + fpgm_delete(ttf); + } + if(ttf->prep) { + table = ttf_addtable(ttf, TAG_PREP); + prep_write(ttf, table); + prep_delete(ttf); + } + + table = ttf_addtable(ttf, TAG_HEAD); + head_write(ttf, table, loca_size); + head_delete(ttf); +} + +ttf_t*ttf_new() +{ + ttf_t*ttf = rfx_calloc(sizeof(ttf_t)); + ttf->version = VERSION_1_0; + return ttf; +} +ttf_t* ttf_load(void*data, int length) +{ + INIT_READ(r,data,length, 0); + + if(length<12) { + msg(" Truncated Truetype file (%d bytes)", length); + return 0; + } + + ttf_t*ttf = rfx_calloc(sizeof(ttf_t)); + ttf->version = readU32(&r); + if(ttf->version == SWAP32(length)) { + U32 fontDataSize = readU32(&r); + U32 version = readU32(&r); + U32 flags = readU32(&r); + U8 panose[10]; + readBlock(&r, panose, 10); + readU8(&r); //charset + readU8(&r); //italoc + readU32(&r); //weight + readU16(&r); //fstype + U16 magic = readU16(&r); //magicNumber + /* we're being paranoid: it's entirely possible for the font + size to be exactly 0x10000. Only treat this font as eot if + it has the right magic number */ + if(magic == 0x4c50) { + readU32(&r); //unicoderange[0] + readU32(&r); //unicoderange[1] + readU32(&r); //unicoderange[2] + readU32(&r); //unicoderange[3] + readU32(&r); //codepagerange[0] + readU32(&r); //codepagerange[1] + readU32(&r); //checksumadjustment + readU32(&r); //reserved[0] + readU32(&r); //reserved[1] + readU32(&r); //reserved[2] + readU32(&r); //reserved[3] + readU16(&r); //padding + + int nr=0; + for(nr=0;nr<4;nr++) { + int t, len; + /* All of ttf is big-endian. All of ttf? No. One small eot table + of indomitable little-endian... */ + len = readU8(&r); + len |= readU8(&r)<<8; + len /= 2; + for(t=0;t>8; + } + readU16(&r); // zero terminator + } + readU16(&r); // more padding + + /* adjust the offset to the start of the actual truetype + data- the positions in the table header will be relative + to the ttf data after the header, not to the file */ + r.mem += r.pos; + r.size -= r.pos; + r.pos = 0; + ttf->version = readU32(&r); + } else { + reader_reset(&r); + ttf->version = readU32(&r); + } + } + + if(ttf->version == TTCFTAG) { + /* a ttc collection is a number of truetype fonts + packaged together */ + if(length<16) { + msg(" Truncated TTC file (%d bytes)", length); + return 0; + } + U32 ttcf_version = readU32(&r); // 0x00000100: v1.0, 0x00000200: v2.0, includes DSIG table + U32 num_fonts = readU32(&r); // number of fonts + U32 font1_position = readU32(&r); + if(font1_position+12 > length) {\ + msg(" Truncated TTC file (%d bytes, first font at %d)", length, font1_position); + return 0; + } + r.pos = font1_position; + ttf->version = readU32(&r); + } + + int num_tables = readU16(&r); + + readU16(&r); //search range + readU16(&r); //entry selector + readU16(&r); //range shift + + if(num_tables*16 > length) { + msg(" Truncated TTF file (table entries: %d)", num_tables); + if(ttf->version != OPENTYPE && + ttf->version != TRUETYPE_MACOS && + ttf->version != VERSION_1_0) { + // bad table length, weird version. This is probably not a ttf file. + return 0; + } + } + + U32*table_data = malloc(16*num_tables); + int t; + for(t=0;t length) { + msg(" TTF Table %02x%02x%02x%02x outside of stream (pos %d)", (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, pos); + } else { + U8*mem = malloc(len); + r.pos = pos; + readBlock(&r, mem, len); + + ttf_table_t*table = ttf_addtable(ttf, tag); + table->data = mem; + table->len = table->memsize = len; +#if 0 + U32 checksum2 = ttf_table_checksum(table); + if(checksum2!=checksum) { + msg(" Checksum mismatch in tag %02x%02x%02x%02x %c%c%c%c (%d bytes) %08x!=%08x", + (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, + (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, + len, checksum2, checksum); + } +#endif + } + } + free(table_data); + + if(!ttf_parse_tables(ttf)) + return 0; + + return ttf; +} +void ttf_create_truetype_tables(ttf_t*ttf) +{ + if(!ttf->head) + ttf->head = head_new(ttf); + if(!ttf->maxp) + ttf->maxp = maxp_new(ttf); + if(!ttf->hea) + ttf->hea = hea_new(ttf); + if(!ttf->os2) + ttf->os2 = os2_new(ttf); + if(!ttf->post) + ttf->post = post_new(ttf); + if(!ttf->gasp) + ttf->gasp = gasp_new(ttf); + if(!ttf->prep) + ttf->prep = prep_new(ttf); +} + +ttf_table_t* ttf_write(ttf_t*ttf, U32*checksum_adjust) +{ + ttf_collapse_tables(ttf); + + ttf_table_t*file = ttf_table_new(0); + writeU32(file, VERSION_1_0); + + /* write number of tables */ + int num_tables=0; + ttf_table_t*t = ttf->tables; + while(t) { + num_tables++; + t = t->next; + } + writeU16(file, num_tables); + + /* write search range */ + int tmp = num_tables; + int search_range = 0; + while(tmp) { + search_range = tmp; + tmp = tmp&(tmp-1); + } + tmp = search_range; + search_range*=16; + writeU16(file, search_range); + + /* write entry selector */ + int entry_selector = 0; + while(tmp>1) { + tmp>>=1; + entry_selector++; + } + writeU16(file, entry_selector); + + /* write range shift */ + int range_shift = num_tables*16 - search_range; + writeU16(file, range_shift); + + /* write table dictionary */ + int table_dictionary_pos = file->len; + int data_pos = file->len + num_tables*16; + for(t=ttf->tables;t;t=t->next) { + writeU32(file, t->id); + writeU32(file, ttf_table_checksum(t)); + writeU32(file, data_pos); + writeU32(file, t->len); + data_pos += t->len; + data_pos += (-t->len)&3; //pad + } + + /* write tables */ + int head_pos = 0; + U8 zero[4]={0,0,0,0}; + for(t=ttf->tables;t;t=t->next) { + if(t->id == TAG_HEAD) + head_pos = file->len; + writeBlock(file, t->data, t->len); + writeBlock(file, zero, (-t->len)&3); //pad + } + U32 checksum = 0xb1b0afba - ttf_table_checksum(file); + if(checksum_adjust) + *checksum_adjust = checksum; + U8*checksum2 = file->data + head_pos + 8; + checksum2[0] = checksum>>24; + checksum2[1] = checksum>>16; + checksum2[2] = checksum>>8; + checksum2[3] = checksum>>0; + return file; +} + +ttf_table_t* ttf_eot_head(ttf_t*ttf) +{ + ttf_table_t*file = ttf_table_new(0); + writeU32(file, 0); //file size (filled in later) + writeU32(file, 0); //fontdatasize (filled in later) + writeU32(file, 0x01000200); + writeU32(file, 0); //flags + writeU8(file, ttf->os2->panose_FamilyType); + writeU8(file, ttf->os2->panose_SerifStyle); + writeU8(file, ttf->os2->panose_Weight); + writeU8(file, ttf->os2->panose_Proportion); + writeU8(file, ttf->os2->panose_Contrast); + writeU8(file, ttf->os2->panose_StrokeVariation); + writeU8(file, ttf->os2->panose_ArmStyle); + writeU8(file, ttf->os2->panose_Letterform); + writeU8(file, ttf->os2->panose_Midline); + writeU8(file, ttf->os2->panose_XHeight); + writeU8(file, 1); //charset (default) + writeU8(file, ttf->os2->fsSelection&1); //italic + writeU32_LE(file, ttf->os2->usWeightClass); + writeU16(file, 0); //fstype + writeU16(file, 0x4c50); //magic + writeU32_LE(file, ttf->os2->ulCharRange[0]); + writeU32_LE(file, ttf->os2->ulCharRange[1]); + writeU32_LE(file, ttf->os2->ulCharRange[2]); + writeU32_LE(file, ttf->os2->ulCharRange[3]); + writeU32_LE(file, ttf->os2->ulCodePageRange1); + writeU32_LE(file, ttf->os2->ulCodePageRange2); + writeU32(file, 0); //checksum adjust (filled in later) + writeU32(file, 0); //reserved[0] + writeU32(file, 0); //reserved[1] + writeU32(file, 0); //reserved[2] + writeU32(file, 0); //reserved[3] + writeU16(file, 0); //padding(1) + + int i,t,len; + + char* strings[] = {ttf->family_name, ttf->subfamily_name, ttf->version_string, ttf->full_name}; + int nr = sizeof(strings)/sizeof(strings[0]); + + for(i=0;idata; + U32 full_len = eot->len + t->len; + len_data[0] = full_len>>0; + len_data[1] = full_len>>8; + len_data[2] = full_len>>16; + len_data[3] = full_len>>24; + + U8*len_data2 = eot->data+4; + len_data2[0] = t->len>>0; + len_data2[1] = t->len>>8; + len_data2[2] = t->len>>16; + len_data2[3] = t->len>>24; + + U8*checksum_data = eot->data + 60; + checksum_data[0] = checksum_adjust>>0; + checksum_data[1] = checksum_adjust>>8; + checksum_data[2] = checksum_adjust>>16; + checksum_data[3] = checksum_adjust>>24; + + FILE*fi = fopen(filename, "wb"); + if(!fi) { + perror(filename); + return; + } + + fwrite(eot->data, eot->len, 1, fi); + fwrite(t->data, t->len, 1, fi); + fclose(fi); + ttf_table_delete(0, t); + ttf_table_delete(0, eot); +} + +void ttf_save(ttf_t*ttf, const char*filename) +{ + ttf_table_t* t = ttf_write(ttf, 0); + FILE*fi = fopen(filename, "wb"); + if(!fi) { + perror(filename); + return; + } + fwrite(t->data, t->len, 1, fi); + fclose(fi); + ttf_table_delete(0, t); +} + +void ttf_dump(ttf_t*ttf) +{ + msg(" Truetype file version %08x%s", ttf->version, ttf->version == OPENTYPE?" (opentype)":""); + ttf_table_t*table = ttf->tables; + while(table) { + U32 tag = table->id; + msg(" Tag %02x%02x%02x%02x [%c%c%c%c] (length: %d)", + (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, + (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, table->len); + table = table->next; + } + //ttf_table_dump(ttf_find_table(ttf, TAG_MAXP)); + + head_dump(ttf); + hea_dump(ttf); + os2_dump(ttf); + maxp_dump(ttf); + glyf_dump(ttf); +} +void ttf_destroy_tables(ttf_t*ttf) +{ + ttf_table_t*table = ttf->tables; + while(table) { + ttf_table_t*next = table->next; + free(table->data); + free(table); + table = next; + } + ttf->tables = 0; +} +void ttf_reduce(ttf_t*ttf) +{ + ttf_destroy_tables(ttf); +} +void ttf_destroy(ttf_t*ttf) +{ + ttf_destroy_tables(ttf); + maxp_delete(ttf); + os2_delete(ttf); + head_delete(ttf); + hea_delete(ttf); + glyf_delete(ttf); + post_delete(ttf); + cvt_delete(ttf); + name_delete(ttf); + free(ttf); +} + +ttf_t* ttf_open(const char*filename) +{ + memfile_t*m = memfile_open(filename); + ttf_t*ttf = ttf_load(m->data, m->len); + memfile_close(m); + return ttf; +} + +#ifdef MAIN +int main(int argn, const char*argv[]) +{ + setConsoleLogging(7); + const char*filename = "comic.ttf"; + if(argn>1) + filename = argv[1]; + //msg(" Loading %s", filename); + memfile_t*m = memfile_open(filename); + ttf_t*ttf = ttf_load(m->data, m->len); + + if(!ttf) { + msg(" Couldn't load %s", filename); + return 1; + } + ttf_reduce(ttf); + + ttf_create_truetype_tables(ttf); + + if(!ttf) return 1; + memfile_close(m); + //ttf_dump(ttf); + //printf("os2 version: %04x (%d), maxp size: %d\n", +// ttf->os2->version, ttf->os2->size, ttf->maxp->size); + ttf_save_eot(ttf, "testfont.eot"); + ttf_save(ttf, "testfont.ttf"); + ttf_destroy(ttf); + return 0; + +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/ttf.h b/fluidbook/tools/swftools-special-swfdump/lib/ttf.h new file mode 100644 index 000000000..02011305d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/ttf.h @@ -0,0 +1,214 @@ +/* ttf.h + Parser and writer for truetype font files. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __ttf_h__ +#define __ttf_h__ + +#include "types.h" + +typedef struct _ttf_table { + U32 id; + struct _ttf_table*prev; + struct _ttf_table*next; + + U8*data; + int len; + int memsize; +} ttf_table_t; + +typedef struct _table_maxp { + U16 maxPoints; + U16 maxContours; + U16 maxComponentPoints; + U16 maxComponentContours; + U16 maxZones; + U16 maxTwilightPoints; + U16 maxStorage; + U16 maxFunctionDefs; + U16 maxInstructionDefs; + U16 maxStackElements; + U16 maxSizeOfInstructions; + U16 maxComponentElements; + U16 maxComponentDepth; +} table_maxp_t; + +typedef struct _table_os2 { + S16 xAvgCharWidth; + U16 usWeightClass; + U16 usWidthClass; + U16 ySubscriptXSize; + U16 ySubscriptYSize; + U16 ySubscriptXOffset; + U16 ySubscriptYOffset; + U16 ySuperscriptXSize; + U16 ySuperscriptYSize; + U16 ySuperscriptXOffset; + U16 ySuperscriptYOffset; + U16 yStrikeoutSize; + U16 yStrikeoutPosition; + U16 sFamilyClass; + U8 panose_FamilyType; + U8 panose_SerifStyle; + U8 panose_Weight; + U8 panose_Proportion; + U8 panose_Contrast; + U8 panose_StrokeVariation; + U8 panose_ArmStyle; + U8 panose_Letterform; + U8 panose_Midline; + U8 panose_XHeight; + U32 ulCharRange[4]; + + U16 fsSelection; + U16 fsFirstCharIndex; + U16 fsLastCharIndex; + + S16 sTypoAscender; + S16 sTypoDescender; + S16 sTypoLineGap; + U16 usWinAscent; + U16 usWinDescent; + + /* for version >= 0x0001 */ + U32 ulCodePageRange1; + U32 ulCodePageRange2; + + /* for version >= 0x0002 */ + S16 sxHeight; + S16 sCapHeight; + U16 usDefaultChar; + U16 usBreakChar; + U16 usMaxContext; +} table_os2_t; + +typedef struct _table_hea +{ + U16 advanceWidthMax; + S16 minLeftSideBearing; + S16 minRightSideBearing; + S16 xMaxExtent; + S16 caretSlopeRise; + S16 caretSlopeRun; + S16 caretOffset; +} table_hea_t; + +#define GLYPH_ON_CURVE 0x01 +#define GLYPH_CONTOUR_START 0x40 +#define GLYPH_CONTOUR_END 0x80 + +typedef U32 unicode_t; + +typedef struct _ttfpoint { + int x,y; + U8 flags; +} ttfpoint_t; +typedef struct _ttfglyph { + U16 advance; + S16 bearing; + S16 xmin,ymin,xmax,ymax; + int code_size; + U8*code; + int num_points; + ttfpoint_t*points; +} ttfglyph_t; + +typedef struct _table_head { + U16 flags; + U16 units_per_em; + S16 xmin,ymin,xmax,ymax; + U16 macStyle; + U16 lowest_readable_size; + S16 dir_hint; +} table_head_t; + +typedef struct _table_post { + U32 italic_angle; + U16 underline_position; + U16 underline_thickness; +} table_post_t; + +typedef struct _table_cvt { + S16*values; + int num; +} table_cvt_t; + +typedef struct _table_gasp { + int num; + struct { + U16 size; + U16 behaviour; + } *records; +} table_gasp_t; + +typedef struct _table_code { + U8*code; + int size; +} table_code_t; + +typedef struct _ttf { + char*family_name; /* nameId 1 */ + char*subfamily_name; /* nameId 2 */ + char*font_uid; /* nameId 3 */ + char*full_name; /* nameId 4 */ + char*version_string; /* nameId 5 */ + char*postscript_name; /* nameId 6 */ + + ttf_table_t*tables; + + table_head_t*head; + table_maxp_t*maxp; + table_os2_t*os2; + table_hea_t*hea; + table_post_t*post; + table_cvt_t*cvt; + table_gasp_t*gasp; + table_code_t*prep; + table_code_t*fpgm; + + U16 flags; + char is_vertical; + + S16 ascent; + S16 descent; // ymin, *not* negative ymin + S16 lineGap; + + int num_glyphs; + ttfglyph_t*glyphs; + + int unicode_size; + unicode_t*unicode; + + U32 version; +} ttf_t; + + +ttf_t*ttf_new(); +ttf_t* ttf_open(const char*filename); +void ttf_reduce(ttf_t*ttf); +ttf_t*ttf_load(void*data, int length); +ttf_table_t*ttf_addtable(ttf_t*ttf, U32 tag); +void ttf_create_truetype_tables(ttf_t*ttf); +void ttf_dump(ttf_t*ttf); +void ttf_destroy(ttf_t*ttf); +void ttf_save(ttf_t*ttf, const char*filename); +void ttf_save_eot(ttf_t*ttf, const char*filename); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/types.h b/fluidbook/tools/swftools-special-swfdump/lib/types.h new file mode 100644 index 000000000..499c840b4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/types.h @@ -0,0 +1,68 @@ +#ifndef __rfxtypes_h__ +#define __rfxtypes_h__ + +#include "../config.h" + +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +/* little/big endian stuff */ + +#define PUT8(ptr,x) {((U8*)(ptr))[0]=x;} +#define PUT16(ptr,x) {((U8*)(ptr))[0]=(U8)(x);((U8*)(ptr))[1]=(U8)((x)>>8);} +#define PUT32(ptr,x) {((U8*)(ptr))[0]=(U8)(x);((U8*)(ptr))[1]=(U8)((x)>>8);((U8*)(ptr))[2]=(U8)((x)>>16);((U8*)(ptr))[3]=(U8)((x)>>24);} +#define GET16(ptr) (((U16)(((U8*)(ptr))[0]))+(((U16)(((U8*)(ptr))[1]))<<8)) +#define GET32(ptr) (((U16)(((U8*)(ptr))[0]))+(((U16)(((U8*)(ptr))[1]))<<8)+(((U16)(((U8*)(ptr))[2]))<<16)+(((U16)(((U8*)(ptr))[3]))<<24)) + +#define SWAP16(s) ((((s)>>8)&0x00ff)|(((s)<<8)&0xff00)) +#define SWAP32(s) (SWAP16(((s)>>16)&0x0000ffff)|((SWAP16(s)<<16)&0xffff0000)) + +#ifdef WORDS_BIGENDIAN +#define LE_16_TO_NATIVE(s) SWAP16(s) +#define LE_32_TO_NATIVE(s) SWAP32(s) +#define BE_16_TO_NATIVE(x) (x) +#define BE_32_TO_NATIVE(x) (x) +#else +#define LE_16_TO_NATIVE(x) (x) +#define LE_32_TO_NATIVE(x) (x) +#define BE_16_TO_NATIVE(s) SWAP16(s) +#define BE_32_TO_NATIVE(s) SWAP32(s) +#endif + +// SWF Types + +#if SIZEOF_SIGNED_LONG_LONG != 8 +#error "no way to define 64 bit integer" +#endif +#if SIZEOF_SIGNED != 4 +#error "don't know how to define 32 bit integer" +#endif +#if SIZEOF_SIGNED_SHORT != 2 +#error "don't know how to define 16 bit integer" +#endif +#if SIZEOF_SIGNED_CHAR != 1 +#error "don't know how to define 8 bit integer" +#endif + +typedef unsigned long long U64; +typedef signed long long S64; +typedef unsigned U32; +typedef signed S32; +typedef unsigned short U16; +typedef signed short S16; +typedef unsigned char U8; +typedef signed char S8; + +#if SIZEOF_VOIDP == SIZEOF_SIGNED_LONG_LONG +typedef unsigned long long ptroff_t; +#elif SIZEOF_VOIDP == SIZEOF_SIGNED +typedef unsigned ptroff_t; +#else +#error "Unknown pointer size" +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/utf8.c b/fluidbook/tools/swftools-special-swfdump/lib/utf8.c new file mode 100644 index 000000000..3170d3ffd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/utf8.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include "utf8.h" + +static char utf8buf[16]; + +int writeUTF8(unsigned int charnum, char*dest) +{ + dest[0] = 0; + if(charnum < 0x80) { + dest[0] = charnum; + dest[1] = 0; + return 1; + } else if(charnum <0x800) { + /* 0000 0080-0000 07FF 110xxxxx 10xxxxxx */ + dest[0] = 0xc0 | (charnum >> 6); + dest[1] = 0x80 | (charnum & 0x3f); + dest[2] = 0; + return 2; + } else if(charnum < 0x10000) { + /* 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx */ + dest[0] = 0xe0 | (charnum >> 12); + dest[1] = 0x80 |((charnum >> 6)&0x3f); + dest[2] = 0x80 |((charnum )&0x3f); + dest[3] = 0; + return 3; + } else if(charnum < 0x200000) { + /* 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + dest[0] = 0xf0 | (charnum >> 18); + dest[1] = 0x80 |((charnum >> 12)&0x3f); + dest[2] = 0x80 |((charnum >> 6 )&0x3f); + dest[3] = 0x80 |((charnum )&0x3f); + dest[4] = 0; + return 4; + } else if(charnum < 0x4000000) { + /* 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + dest[0] = 0xf8 | (charnum >> 24); + dest[1] = 0x80 |((charnum >> 18)&0x3f); + dest[2] = 0x80 |((charnum >> 12)&0x3f); + dest[3] = 0x80 |((charnum >> 6 )&0x3f); + dest[4] = 0x80 |((charnum )&0x3f); + dest[5] = 0; + return 5; + } else if(charnum < 0x80000000) { + /* 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx */ + dest[0] = 0xfc | (charnum >> 30); + dest[1] = 0x80 |((charnum >> 24)&0x3f); + dest[2] = 0x80 |((charnum >> 18)&0x3f); + dest[3] = 0x80 |((charnum >> 12)&0x3f); + dest[4] = 0x80 |((charnum >> 6 )&0x3f); + dest[5] = 0x80 |((charnum )&0x3f); + dest[6] = 0; + return 6; + } else { + fprintf(stderr, "Illegal character: 0x%08x\n", charnum); + dest[0] = 0; + return 0; + } +} + +char* getUTF8(unsigned int charnum) +{ + memset(utf8buf, 0, sizeof(utf8buf)); + writeUTF8(charnum, utf8buf); + return utf8buf; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/utf8.h b/fluidbook/tools/swftools-special-swfdump/lib/utf8.h new file mode 100644 index 000000000..9340ad60a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/utf8.h @@ -0,0 +1,15 @@ +#ifndef __utf8_h__ +#define __utf8_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +int writeUTF8(unsigned int charnum, char*dest); +char* getUTF8(unsigned int charnum); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/wav.c b/fluidbook/tools/swftools-special-swfdump/lib/wav.c new file mode 100644 index 000000000..5bd30d792 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/wav.c @@ -0,0 +1,293 @@ +/* wav.c + Routines for handling .wav files + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "wav.h" + +struct WAVBlock { + char id[5]; + unsigned int size; +}; + +int getWAVBlock(FILE*fi, struct WAVBlock*block) +{ + unsigned int size; + unsigned char b[4]; + if(fread(block->id,1,4,fi)<4) + return 0; + block->id[4] = 0; + if(fread(b,1,4,fi)<4) + return 0; + block->size = b[0]|b[1]<<8|b[2]<<16|b[3]<<24; + /*printf("Chunk: [%c%c%c%c] (%d bytes)\n", + block->id[0],block->id[1], + block->id[2],block->id[3], + block->size);*/ + return 1; +} + +int wav_read(struct WAV*wav, const char* filename) +{ + FILE*fi = fopen(filename, "rb"); + unsigned char b[16]; + long int filesize; + struct WAVBlock block; + long int pos; + + if(!fi) + return 0; + fseek(fi, 0, SEEK_END); + filesize = ftell(fi); + fseek(fi, 0, SEEK_SET); + + //printf("Filesize: %d\n", filesize); + + if(!getWAVBlock (fi, &block)) + { + fclose(fi); + return 0; + } + if(strncmp(block.id,"RIFF",4)) + { + fprintf(stderr, "wav_read: not a WAV file\n"); + fclose(fi); + return 0; + } + if(block.size + 8 < filesize) + fprintf(stderr, "wav_read: warning - more tags (%lu extra bytes)\n", filesize - block.size - 8); + + if(block.size == filesize) + /* some buggy software doesn't generate the right tag length */ + block.size = filesize - 8; + + if(block.size + 8 > filesize) + fprintf(stderr, "wav_read: warning - short file (%lu bytes missing)\n", block.size + 8 - filesize); + if(fread(b, 1, 4, fi) < 4) + { + fclose(fi); + return 0; + } + if(strncmp((const char*)b, "WAVE", 4)) + { + fprintf(stderr, "wav_read: not a WAV file (2)\n"); + fclose(fi); + return 0; + } + + do + { + getWAVBlock(fi, &block); + pos = ftell(fi); + if(!strncmp(block.id, "fmt ", 4)) + { + if(fread(&b, 1, 16, fi)<16) + { + fclose(fi); + return 0; + } + wav->tag = b[0]|b[1]<<8; + wav->channels = b[2]|b[3]<<8; + wav->sampsPerSec = b[4]|b[5]<<8|b[6]<<16|b[7]<<24; + wav->bytesPerSec = b[8]|b[9]<<8|b[10]<<16|b[11]<<24; + wav->align = b[12]|b[13]<<8; + wav->bps = b[14]|b[15]<<8; + } + else + if (!strncmp(block.id, "LIST", 4)) + { + // subchunk ICMT (comment) may exist + } + else + if (!strncmp(block.id, "data", 4)) + { + int l; + wav->data = (unsigned char*)malloc(block.size); + if(!wav->data) + { + fprintf(stderr, "Out of memory (%d bytes needed)", block.size); + fclose(fi); + return 0; + } + l = fread(wav->data, 1, block.size, fi); + if(l<=0) { + fprintf(stderr, "Error: Couldn't read WAV data block\n"); + fclose(fi); + return 0; + } else if(l < block.size) + { + fprintf(stderr, "Warning: data block of size %d is only %d bytes (%d bytes missing)\n", block.size, l, block.size-l); + wav->size = l; + } else { + wav->size = block.size; + } + } + pos+=block.size; + fseek(fi, pos, SEEK_SET); + } + while (pos < filesize); + fclose(fi); + return 1; +} + +int wav_write(struct WAV*wav, const char*filename) +{ + FILE*fi = fopen(filename, "wb"); + char*b="RIFFWAVEfmt \x10\0\0\0data"; + char c[16]; + unsigned long int w32; + if(!fi) + return 0; + fwrite(b, 4, 1, fi); + w32=(/*fmt*/8+0x10+/*data*/8+wav->size); + c[0] = w32; + c[1] = w32>>8; + c[2] = w32>>16; + c[3] = w32>>24; + fwrite(c, 4, 1, fi); + fwrite(&b[4], 12, 1, fi); + c[0] = wav->tag; + c[1] = wav->tag>>8; + c[2] = wav->channels; + c[3] = wav->channels>>8; + c[4] = wav->sampsPerSec; + c[5] = wav->sampsPerSec>>8; + c[6] = wav->sampsPerSec>>16; + c[7] = wav->sampsPerSec>>24; + c[8] = wav->bytesPerSec; + c[9] = wav->bytesPerSec>>8; + c[10] = wav->bytesPerSec>>16; + c[11] = wav->bytesPerSec>>24; + c[12] = wav->align; + c[13] = wav->align>>8; + c[14] = wav->bps; + c[15] = wav->bps>>8; + fwrite(c, 16, 1, fi); + fwrite(&b[16], 4, 1, fi); + c[0] = wav->size; + c[1] = wav->size>>8; + c[2] = wav->size>>16; + c[3] = wav->size>>24; + fwrite(c,4,1,fi); + printf("writing %d converted bytes\n", wav->size); + fwrite(wav->data,wav->size,1,fi); + fclose(fi); + return 1; +} + +void wav_print(struct WAV*wav) +{ + printf("tag:%04x channels:%d samples/sec:%lu bytes/sec:%lu align:%d bits/sample:%d size:%d\n", + wav->tag, wav->channels, wav->sampsPerSec, wav->bytesPerSec, + wav->align, wav->bps, wav->size); +} + +int wav_convert2mono(struct WAV*src, struct WAV*dest, int rate) +{ + int samplelen=src->size/src->align; + int bps=src->bps; + double ratio; + double pos = 0; + int pos2 = 0; + int channels=src->channels; + int i; + int fill; + + dest->sampsPerSec = rate; + dest->bps = 16; + dest->channels = 1; + dest->align = 2; + dest->tag = src->tag; + dest->bytesPerSec = dest->sampsPerSec*dest->align; + + ratio = (double)dest->sampsPerSec/(double)src->sampsPerSec; + fill = (int)(ratio+1)*2; + + dest->data = (unsigned char*)malloc((int)(samplelen*ratio*2)+128); + if(!dest->data) + return 0; + dest->size = (int)(samplelen*ratio)*2; + + if(bps == 8) { + if(ratio <= 1) { + for(i=0; isize; i+=channels) { + int pos2 = ((int)pos)*2; + dest->data[pos2] = 0; + dest->data[pos2+1] = src->data[i]+128; + pos += ratio; + } + } else { + for(i=0; isize; i+=channels) { + int j; + int pos2 = ((int)pos)*2; + for(j=0;jdata[pos2+j+0] = 0; + dest->data[pos2+j+1] = src->data[i]+128; + } + pos += ratio; + } + } + } else if(bps == 16) { + if(ratio <= 1) { + for(i=0; isize/2; i+=channels) { + int pos2 = ((int)pos)*2; + dest->data[pos2+0]=src->data[i*2]; + dest->data[pos2+1]=src->data[i*2+1]; + pos += ratio; + } + } else { + for(i=0; isize/2; i+=channels) { + int j; + int pos2 = ((int)pos)*2; + for(j=0;jdata[pos2+j+0] = src->data[i*2]; + dest->data[pos2+j+1] = src->data[i*2+1]; + } + pos += ratio; + } + } + } else if(bps == 32) { + if(ratio <= 1) { + for(i=0; isize/4; i+=channels) { + int pos2 = ((int)pos)*2; + dest->data[pos2+0]=src->data[i*4+2]; + dest->data[pos2+1]=src->data[i*4+3]; + pos += ratio; + } + } else { + for(i=0; isize/4; i+=channels) { + int j; + int pos2 = ((int)pos)*2; + for(j=0;jdata[pos2+j+0] = src->data[i*4+2]; + dest->data[pos2+j+1] = src->data[i*4+3]; + } + pos += ratio; + } + } + } else { + fprintf(stderr, "Unsupported bitspersample value: %d\n", bps); + } + return 1; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/wav.h b/fluidbook/tools/swftools-special-swfdump/lib/wav.h new file mode 100644 index 000000000..8f253266e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/wav.h @@ -0,0 +1,26 @@ +/* wav.h + Header file for wav.c + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This file is distributed under the GPL, see file COPYING for details */ + +struct WAV { + unsigned short tag; + unsigned short channels; + unsigned long sampsPerSec; + unsigned long bytesPerSec; + unsigned short align; + unsigned short bps; + + unsigned char*data; + unsigned int size; +}; + +int wav_read(struct WAV*wav, const char* filename); +int wav_write(struct WAV*wav, const char*filename); +void wav_print(struct WAV*wav); +int wav_convert2mono(struct WAV*src, struct WAV*dest, int rate); + diff --git a/fluidbook/tools/swftools-special-swfdump/lib/xml.c b/fluidbook/tools/swftools-special-swfdump/lib/xml.c new file mode 100644 index 000000000..ff65c9eff --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/xml.c @@ -0,0 +1,382 @@ +/* xml.c + Lightweight and fast xml parser. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "xml.h" + +/* +group: 0=data 1=whitespace 2='"' 3='<' 4='>' 5='&' 6=';' 7='?' 8='/' 9='=' 10='!' 11=EOF +*/ + +static int group[256] = +{ +// 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +// \t \n \r + 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, +// 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f +// ! " # $ % & ' ( ) * + , - . / + 1,10, 2, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 8, +// 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f +// 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 9, 4, 7, +// 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f +// @ A B C D E F G H I J K L M N O + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f +// P Q R S T U V W X Y Z [ \ ] ^ _ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,11, 0,12, 0, 0, +// 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f +// ` a b c d e f g h i j k l m n o + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f +// p q r s t u v w x y z { | } ~ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +// f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff +// + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const char*errors[]= +{ + 0, +#define E1 -0x41 + /*E1*/"xml file must start with & ; ? / = ! [ ] - EOB*/ + /* 0 */{ E1, 0,E1, 1,E1,E1,E1,E1,E1,E1,E3,E1,E1,-63}, // .< + /* 1 */{ E1,E1,E1,E1,E1,E1,E1, 9,E1,E1,E3,E1,E1,-63}, // <.? + /* 2 */{ -3, 2,E3,E2,E2,E2,E2,E2,12,E2,16,E2,E2,-63}, // <. + /* 3 */{ E3,E3,E3,E3,-1,E3,E3,E3,E3,E1,E3,E3,E3,-63}, // < /.> + /* 4 */{ E3,E3,E3,E3,-2,E3,E3,E3,E3,E1,E1,E3,E3,-63}, // < .> + /* 5 */{ 5, 5, 5,-4, 5, 5, 5, 5, 5, 5, 5,E3,E3,-63}, // da.ta + /* 6 */{ 6,-7,E3,E2,-6,E2,E2,E3,-9,E3,E3,E3,E3,-63}, // %d\n", + buffer[pos], state, new_state[state][group[buffer[pos]]]);*/ + + /* inner loop */ + do { + state = new_state[old=state][group[(unsigned char)buffer[pos++]]]; + } while(state>=0); + + switch(state) { + tag_stack_t*st; + xmlattribute_t*a; + case -63: // end of buffer + if(pos!=num+1) { + // we could backtrace, but the spec says this is indeed illegal + fprintf(stderr, "error: xml contains \\0 chars\n"); + return 0; + } + // undo + pos = num; + state = old; + break; + case -1: // self closing tag + attributes = attributes_reverse(attributes); + out->start_tag(out, tagname.result, attributes); + out->end_tag(out, tagname.result); + stringstate_clear(&tagname); + attributes_free(attributes);attributes = 0; + stringstate_start(&data, buffer, pos); + state = 5; + break; + case -6: // after + stringstate_finish(&tagname, buffer, pos-1); + // fallthrough + case -2: // . + st = malloc(sizeof(tag_stack_t)); + st->name = tagname.result; + st->prev = stack; + stack = st; + attributes = attributes_reverse(attributes); + if(!first) out->start_tag(out, tagname.result, attributes); + attributes_free(attributes);attributes = 0; + stringstate_start(&data, buffer, pos); + state = 5; + break; + case -3: case -13: // after <, start of tag name + first=0; + stringstate_start(&tagname, buffer, pos-1); + state = state==-3?6:13; + break; + case -14: // after , end of tag name + stringstate_finish(&tagname, buffer, pos-1); + // fallthrough + case -15: // after + out->end_tag(out, tagname.result); + stringstate_clear(&tagname); + stringstate_start(&data, buffer, pos); + state = 5; + break; + case -4: // end of data + stringstate_finish(&data, buffer, pos-1); + if(!first) out->data(out, data.result, data.len); + stringstate_clear(&data); + state = 2; + break; + case -7: // after <, at whitespace, end of tag name + stringstate_finish(&tagname, buffer, pos-1); + state = 7; + break; + case -8: // inside tag, start of attribute name + stringstate_start(&attr_name, buffer, pos-1); + state = 8; + break; + case -9: + stringstate_finish(&tagname, buffer, pos-1); + state = 3; + break; + case -12: // end of attribute name, at ws + stringstate_finish(&attr_name, buffer, pos-1); + state = 15; + break; + case -10: // end of attribute name, at = + stringstate_finish(&attr_name, buffer, pos-1); + state = 10; + break; + case -11: // start of attribute value + stringstate_start(&attr_value, buffer, pos); + state = 11; + break; + case -5: // end of attribute value + stringstate_finish(&attr_value, buffer, pos-1); + a = malloc(sizeof(xmlattribute_t)); + a->name = attr_name.result;attr_name.result=0; + a->value = attr_value.result;attr_value.result=0; + a->next = attributes; + attributes = a; + state = 7; + break; + case -20: + state = 5; + break; + default: + if(-state&0x40) { + fprintf(stderr, "%s (state %d, char '%c')\n", errors[(-state)&0x3f], old, buffer[pos-1]); + return 0; + } else { + fprintf(stderr, "internal error: no action %d\n", state); + } + return 0; + break; + } + } + stringstate_save(&tagname, buffer, pos); + stringstate_save(&attr_name, buffer, pos); + stringstate_save(&attr_value, buffer, pos); + stringstate_save(&data, buffer, pos); + } + + /* note: any of these except data *has* to be empty for a well formed xml */ + stringstate_clear(&tagname); + stringstate_clear(&attr_name); + stringstate_clear(&attr_value); + stringstate_clear(&data); + + while(stack) { + tag_stack_t*next = stack->prev; + free((void*)stack->name); + free(stack); + stack = next; + } + return 1; +} + +#ifdef MAIN +void my_start_tag(xmlconsumer_t*c, char*name, xmlattribute_t*attr) +{ + printf("<%s", name); + for(;attr;attr=attr->next) { + printf(" %s=\"%s\"", attr->name, attr->value); + } + printf(">"); +} +void my_data(xmlconsumer_t*c, char*data, int len) +{ + printf("%s", data); +} +void my_end_tag(xmlconsumer_t*c, char*name) +{ + printf("", name); +} +int main() +{ + xmlconsumer_t c = {my_start_tag, my_data, my_end_tag, 0}; + + reader_t r; + reader_init_filereader2(&r, "test.xml"); + xml_parse(&r, &c); + r.dealloc(&r); + printf("\n"); +} +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/xml.h b/fluidbook/tools/swftools-special-swfdump/lib/xml.h new file mode 100644 index 000000000..206970acb --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/lib/xml.h @@ -0,0 +1,42 @@ +/* xml.h + Lightweight and fast xml parser. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __xml_h__ +#define __xml_h__ + +#include "bitio.h" + +typedef struct _xmlattribute { + const char*name; + const char*value; + struct _xmlattribute*next; +} xmlattribute_t; + +typedef struct _xmlconsumer { + void (*start_tag)(struct _xmlconsumer*, char*name, xmlattribute_t*attributes); + void (*data)(struct _xmlconsumer*, char*data, int len); + void (*end_tag)(struct _xmlconsumer*, char*name); + void*internal; +} xmlconsumer_t; + +int xml_parse(reader_t*reader, xmlconsumer_t*out); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/ltmain.sh b/fluidbook/tools/swftools-special-swfdump/ltmain.sh new file mode 100644 index 000000000..e589475dd --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/ltmain.sh @@ -0,0 +1,6975 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 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 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# 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. + +basename="s,^.*/,,g" + +# 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 $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_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 + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# 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. +func_win32_libid () +{ + 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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_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 () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # 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. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + # user sometimes does CC=-gcc so we need to match that to 'gcc' + trimedcc=`echo ${CC} | $SED -e "s/${host}-//g"` + # and sometimes libtool has CC=-gcc but user does CC=gcc + extendcc=${host}-${CC} + # and sometimes libtool has CC=-gcc but user has CC=-gcc + # (Gentoo-specific hack because we always export $CHOST) + mungedcc=${CHOST-${host}}-${trimedcc} + case "$@ " in + "cc "* | " cc "* | "${host}-cc "* | " ${host}-cc "*|\ + "gcc "* | " gcc "* | "${host}-gcc "* | " ${host}-gcc "*) + tagname=CC + break ;; + "$trimedcc "* | " $trimedcc "* | "`$echo $trimedcc` "* | " `$echo $trimedcc` "*|\ + "$extendcc "* | " $extendcc "* | "`$echo $extendcc` "* | " `$echo $extendcc` "*|\ + "$mungedcc "* | " $mungedcc "* | "`$echo $mungedcc` "* | " `$echo $mungedcc` "*|\ + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # 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 + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + 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 + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + 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" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + 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 have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# 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= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # 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= + + 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) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$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,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$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. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$srcfile" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </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." + + $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 + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </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." + + $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 + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + 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 + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + 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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + 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 + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + 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 test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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 + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # 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 + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; 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 + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # 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="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + 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]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + 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 + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$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. + $rm conftest.c + cat > conftest.c </dev/null` + 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 "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$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 + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$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 + newdeplibs="$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 + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + 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 is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + 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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$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" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "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"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # 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 + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + 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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "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" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + 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\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(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 "$mode" = relink; then + $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 + $show "${rm}r $gentop" + $run ${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 + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${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" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # 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/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + 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*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + 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 "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + 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 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#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 +# 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 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + 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 ("getcwd failed"); + 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 * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# 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. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_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 variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + 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 >> $output "\ + + # 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 $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + + # Make sure env LD_LIBRARY_PATH does not mess us up + if test -n \"\${LD_LIBRARY_PATH+set}\"; then + export LD_LIBRARY_PATH=\$progdir:\$LD_LIBRARY_PATH + fi +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # 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 + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_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 + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$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= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; 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 "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# 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' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$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 "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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run 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 + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$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 + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run 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 + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + 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 + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "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) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $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" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + 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 + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [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 + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +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: $modename [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: $modename [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: $modename [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 rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [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 + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -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] + +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: $modename [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." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/fluidbook/tools/swftools-special-swfdump/m4/Makefile b/fluidbook/tools/swftools-special-swfdump/m4/Makefile new file mode 100644 index 000000000..1995f6233 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/Makefile @@ -0,0 +1,24 @@ +# simple pmake detecting Makefile + +all: clear test.o +clean: all +install: +uninstall: + +CC=@echo "*******************************************************";\ + echo "Your make is broken- try to get yourself a working one.";\ + echo "gmake 3.79.1 or newer should be fine. ";\ + echo "*******************************************************";\ + exit 1;exec >/dev/null;echo + +clear: + @rm -f test.c + +%.o: %.c + +test.c: + @touch test.c + +test.o: test.c + +.SUFFIXES: .o .cpp diff --git a/fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 b/fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 new file mode 100644 index 000000000..906fef12e --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 @@ -0,0 +1,124 @@ +AC_DEFUN([RFX_CHECK_AVI2SWF], +[ + +AC_CHECK_PROGS([AVIFILE_CONFIG], [avifile-config]) + +if test "x$AVIFILE_CONFIG" '!=' "x";then + OLDCPPFLAGS="$CPPFLAGS" + # temporarily add avifile paths to CPPFLAGS... + CPPFLAGS="$CPPFLAGS $CXXFLAGS "`$AVIFILE_CONFIG --cflags` + AC_CHECK_HEADERS(avifile/version.h version.h) + # ... and reset + CPPFLAGS="$OLDCPPFLAGS" +fi + +AC_MSG_CHECKING([whether we can compile the avifile test program]) + +if test "x${ac_cv_header_version_h}" '=' "xyes";then + HAVE_VERSION_H_DEFINE='#define HAVE_VERSION_H' +fi +if test "x${ac_cv_header_avifile_version_h}" '=' "xyes";then + HAVE_AVIFILE_VERSION_H_DEFINE='#define HAVE_AVIFILE_VERSION_H' +fi + +cat > conftest.cpp << EOF + +// hack- we can't yet access the variables in config.h (because it hasn't been generated yet), +// so we have to introduce them this way +$HAVE_VERSION_H_DEFINE +$HAVE_AVIFILE_VERSION_H_DEFINE + +#ifdef HAVE_VERSION_H + #include +#endif +#ifdef HAVE_AVIFILE_VERSION_H + #include +#endif + +#if (AVIFILE_MAJOR_VERSION == 0) && (AVIFILE_MINOR_VERSION>=6) + #include + #include + #include + #include + #include + #define VERSION6 +#else + #include + #include + #include + #define Width width + #define Height height + #define Data data + #define Bpp bpp +#endif + +void test() +{ + IAviReadFile* player; + IAviReadStream* astream; + IAviReadStream* vstream; + player = CreateIAviReadFile(0); + astream = player->GetStream(0, AviStream::Audio); + vstream = player->GetStream(0, AviStream::Video); + vstream -> StartStreaming(); + astream -> StartStreaming(); +#ifndef VERSION6 + MainAVIHeader head; + player->GetFileHeader(&head); + head.dwMicroSecPerFrame; + head.dwTotalFrames; + head.dwStreams; + head.dwWidth; + head.dwHeight; + head.dwMicroSecPerFrame; + astream->GetEndPos(), + astream->GetEndTime()); + player->StreamCount(); +#else + StreamInfo*audioinfo; + StreamInfo*videoinfo; + audioinfo = astream->GetStreamInfo(); + videoinfo = vstream->GetStreamInfo(); + videoinfo->GetVideoWidth(); + videoinfo->GetVideoHeight(); + audioinfo->GetAudioSamplesPerSec(); + videoinfo->GetFps(); +#endif + CImage*img = vstream->GetFrame(); + img->ToRGB(); + img->Data(); + img->Bpp(); + img->Width(); + img->Height(); + WAVEFORMATEX wave; + astream->GetAudioFormatInfo(&wave,0); + uint_t a,b; + astream->ReadFrames(0,0,0,a,b); +} +int main (int argc, char*argv[]) +{ + return 0; +} +EOF + +if test "x$AVIFILE_CONFIG" '!=' "x";then + AVIFILE_LIBS=`$AVIFILE_CONFIG --libs` + AVIFILE_CFLAGS=`$AVIFILE_CONFIG --cflags` + avifile_link='$CXX $CPPFLAGS $CXXFLAGS $AVIFILE_CFLAGS conftest.cpp $AVIFILE_LIBS -o conftest${ac_exeext}' + if { (eval echo avi2swf.m4:71: \"$avifile_link\") 1>&5; (eval $avifile_link) 2>&5; } && test -s conftest${ac_exeext} && ./conftest${ac_exeext}; then + AC_MSG_RESULT(yes) + AVIFILE=true + export AVIFILE + AC_DEFINE([AVIFILE], [true], [Define if Avifile is available]) + else + echo "configure: failed program was:" >&5 + cat conftest.cpp >&5 + AC_MSG_RESULT(no) + fi +else + AC_MSG_RESULT(no) +fi +rm -f conftest* +]) + + diff --git a/fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 b/fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 new file mode 100644 index 000000000..6c7b62069 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 @@ -0,0 +1,30 @@ +AC_DEFUN([RFX_CHECK_SYSTEM_BACKTICKS], +[ +AC_MSG_CHECKING([whether system() can handle command substitution]) +AC_TRY_RUN([ +#include "stdlib.h" +int main (int argc, char*argv[]) +{ + return system("test `touch config.tmp2`"); +} +], [OK=OK],,[CROSSCOMPILE=1]) + +if test "x${OK}" = "xOK";then + test -f config.tmp2 || OK= +fi + +if test "x${CROSSCOMPILE}" = "x1";then + OK=no; +fi +if test "x${OK}" = "xOK";then +rm -f config.tmp2 +AC_MSG_RESULT(yes) +SYSTEM_BACKTICKS=1 +export SYSTEM_BACKTICKS +AC_DEFINE([SYSTEM_BACKTICKS], [1], [Define if system handles command substitution]) +else +AC_MSG_RESULT(no) +fi +]) + + diff --git a/fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 b/fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 new file mode 100644 index 000000000..953753377 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 @@ -0,0 +1,47 @@ +AC_DEFUN([RFX_CHECK_BYTEORDER], +[ +AC_MSG_CHECKING([for byte order]) +AC_TRY_RUN([ +int main (int argc, char *argv[]) +{ + int i = 1; + return *(char*)&i; +} +], [BIGENDIAN=1], [LITTLEENDIAN=1], [CROSSCOMPILE=1]) +export CROSSCOMPILE + +if test "x${CROSSCOMPILE}" = "x1"; then + AC_MSG_RESULT([we are cross compiling- trying to guess from system type]) + AC_CANONICAL_SYSTEM + AC_MSG_CHECKING([for byte order, try 2]) + case "${target}" in + *86* | *-pc-* ) + LITTLEENDIAN=1 + ;; + *sparc* | *68* | *88k* | *mac* | *Mac* | *sun* | *Sun* | *Amiga* | *amiga* ) + BIGENDIAN=1 + ;; + esac +fi + +export LITTLEENDIAN +if test "x${LITTLEENDIAN}" = "x1"; then +AC_MSG_RESULT([little endian]) +BYTEORDERCHECKOK=1 +fi +export BIGENDIAN +if test "x${BIGENDIAN}" = "x1"; then +AC_MSG_RESULT([big endian]) +BYTEORDERCHECKOK=1 +WORDS_BIGENDIAN=1 +export WORDS_BIGENDIAN +AC_DEFINE([WORDS_BIGENDIAN], [1], [Define to 1 if this machine has network byte order]) +fi +if test "x${BYTEORDERCHECKOK}" != "x1"; then +AC_MSG_RESULT(unknown) +echo Byte order could not determined. +exit 1 +fi +]) + + diff --git a/fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 b/fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 new file mode 100644 index 000000000..98da5a2ca --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 @@ -0,0 +1,102 @@ +# ----------- freetype.m4 ---------------- +# +# Checks for: +# * freetype library (-lfreetype) +# * freetype headers (freetype2/freetype/freetype.h) +# * whether a freetype test program can be compiled +# +# Environment set: +# * HAVE_FREETYPE +# +# Defines: +# * HAVE_FREETYPE +# * USE_FREETYPE +# +# Substitutes: +# + +AC_DEFUN([RFX_CHECK_FONTCONFIG], +[ +OLDCPPFLAGS="${CPPFLAGS}" +OLDLIBS="${LIBS}" + +if test -d /usr/include/fontconfig; then + CPPFLAGS="$CPPFLAGS -I/usr/include/fontconfig" +fi + +AC_CHECK_LIB(fontconfig, FcInit, [HAVE_LIB_FONTCONFIG=1],) +AC_CHECK_HEADERS(fontconfig.h,[HAVE_FONTCONFIG_H=1]) + +if test "x${HAVE_LIB_FONTCONFIG}" != "x";then +if test "x${HAVE_FONTCONFIG_H}" != "x";then + HAVE_FONTCONFIG=1 +fi +fi + +if test "x${HAVE_FONTCONFIG}" = "x1"; then + LIBS="$LIBS -lfontconfig" +AC_MSG_CHECKING([whether we can compile the fontconfig test program]) + +if (echo $LIBS | grep lfreetype >/dev/null 2>&1); then + #move freetype library to the end of libraries, otherwise fontconfig + #won't compile. + LIBS=`echo $LIBS | sed -e 's/-lfreetype//g' -e 's/$/ -lfreetype/'` +fi + +cat > conftest.c << EOF +#include +#include + +int main() +{ + FcPattern *pattern, *match; + FcResult result; + FcChar8 *v; + char*s1="abc",*s2="ABC"; + strcasecmp(s1,s2); + FcInit(); + pattern = FcPatternBuild(0, FC_FAMILY, FcTypeString, "", 0); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + + FcConfig*c = FcConfigCreate(); + FcConfigParseAndLoad(c, (FcChar8*)"", 1); + FcConfigBuildFonts(c); + FcConfigSetCurrent(c); + + FcFontSet * set = FcConfigGetFonts(c, FcSetSystem); + FcFontSetDestroy(set); + + FcConfigSubstitute(0, pattern, FcMatchPattern); + FcDefaultSubstitute(pattern); + match = FcFontMatch(0, pattern, &result); + FcPatternGetString(match, "family", 0, &v) == FcResultMatch; + FcPatternGetBool(match, "family", 0, &v) == FcResultMatch; + FcPatternPrint(pattern); + FcPatternDestroy(pattern); + FcPatternDestroy(match); + FcFini(); + return 0; +} +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' + if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_FONTCONFIG], [1], [Define if fontconfig is available]) + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + HAVE_FONTCONFIG=0 + AC_MSG_RESULT(no) + fi + rm -f conftest* +fi + +# if the above didn't work out, reset all changes to the compiler variables. +if test "x${HAVE_FONTCONFIG}" "!=" "x1"; then + CPPFLAGS=$OLDCPPFLAGS + LIBS=$OLDLIBS +fi +]) + diff --git a/fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 b/fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 new file mode 100644 index 000000000..f4ed0315d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 @@ -0,0 +1,147 @@ +# ----------- freetype.m4 ---------------- +# +# Checks for: +# * freetype library (-lfreetype) +# * freetype headers (freetype2/freetype/freetype.h) +# * whether a freetype test program can be compiled +# +# Environment set: +# * HAVE_FREETYPE +# +# Defines: +# * HAVE_FREETYPE +# * USE_FREETYPE +# +# Substitutes: +# + +AC_DEFUN([RFX_CHECK_FREETYPE], +[ + +AC_PATH_PROG([FREETYPE_CONFIG], [freetype-config],, ["$PATH:/usr/local/bin:/sw/bin:/opt/local/bin"]) + +OLDCPPFLAGS="${CPPFLAGS}" +OLDLIBS="${LIBS}" +if test "x${FREETYPE_CONFIG}" '!=' "x"; then + CPPFLAGS="$CPPFLAGS "`$FREETYPE_CONFIG --cflags` +else if test -d /usr/include/freetype2; then + CPPFLAGS="$CPPFLAGS -I/usr/include/freetype2" +else if test -d /usr/local/include/freetype2; then + CPPFLAGS="$CPPFLAGS -I/usr/local/include/freetype2" +fi +fi +fi + +if test "x${FREETYPE_CONFIG}" '=' "x";then + # if we didn't find the freetype-config program, we won't + # know where the libs are expected to be. So just blindly + # try to link against them. + AC_CHECK_LIB([freetype], [FT_Init_FreeType],[HAVE_LIB_FREETYPE=1],) +fi + +AC_CHECK_HEADERS([ft2build.h],[HAVE_FT2BUILD_H=1]) +if test "x${HAVE_FT2BUILD_H}" '=' "x";then + AC_CHECK_HEADERS([freetype/freetype.h],[HAVE_FREETYPE_FREETYPE_H=1]) +fi + +if test "x${HAVE_LIB_FREETYPE}" '!=' "x" -o \ + "x${FREETYPE_CONFIG}" '!=' "x";then + if test "x${HAVE_FREETYPE_FREETYPE_H}" '!=' "x";then + HAVE_FREETYPE=1 + fi + if test "x${HAVE_FT2BUILD_H}" '!=' "x";then + HAVE_FREETYPE=1 + fi +fi + +if test "x${HAVE_FREETYPE}" = "x1"; then + if test "x${FREETYPE_CONFIG}" '!=' "x"; then + LIBS="$LIBS "`$FREETYPE_CONFIG --libs` + else + LIBS="$LIBS -lfreetype" + fi + + if test "x${HAVE_FT2BUILD_H}" = "x1"; then + HAVE_FT2BUILD_H_DEFINE='#define HAVE_FT2BUILD_H' + fi + + AC_MSG_CHECKING([whether we can compile the freetype test program]) + + cat > conftest.c << EOF +$HAVE_FT2BUILD_H_DEFINE + +#ifdef HAVE_FT2BUILD_H +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SIZES_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H +#else +#include +#include +#include +#include +#include +#include +#endif + +int main() +{ + FT_Library ftlibrary; + FT_Face face; + FT_Error error; + FT_ULong charcode; + FT_UInt gindex; + FT_Glyph glyph; + FT_BBox bbox; + FT_Matrix matrix; + FT_UInt i; + char* name = 0; + char italic, bold; + + FT_Init_FreeType(&ftlibrary); + FT_New_Face(ftlibrary, "filename", 0, &face); + i = face->num_glyphs - 1; + italic = face->style_flags&FT_STYLE_FLAG_ITALIC; + bold = face->style_flags&FT_STYLE_FLAG_BOLD; + FT_Get_Postscript_Name(face); + FT_Get_Char_Index(face, 33); + FT_Get_First_Char(face, &i); + FT_Get_Next_Char(face, 33, &i); + if(FT_HAS_GLYPH_NAMES(face)) { + FT_Get_Glyph_Name(face, 33, name, 127); + } + FT_Load_Glyph(face, 33, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE); + FT_Get_Glyph(face->glyph, &glyph); + FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); + FT_Done_Glyph(glyph); + FT_Done_Face(face); + FT_Done_FreeType(ftlibrary); + return 0; +} +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' + if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_FREETYPE], [1], [have/use freetype library]) + AC_DEFINE([HAVE_FREETYPE_FREETYPE_H], [1], [Define if freetype headers are available]) + AC_DEFINE([USE_FREETYPE], [1], [Define if freetype is available]) # for ttf2tp1 + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + HAVE_FREETYPE=0 + AC_MSG_RESULT([no]) + fi + rm -f conftest* +fi + +# if the above didn't work out, reset all changes to the compiler variables. +if test "x${HAVE_FREETYPE}" '!=' "x1"; then + CPPFLAGS=$OLDCPPFLAGS + LIBS=$OLDLIBS +fi +]) + diff --git a/fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 b/fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 new file mode 100644 index 000000000..f8fa03997 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 @@ -0,0 +1,30 @@ +AC_DEFUN([RFX_CHECK_OLDGCC], +[ +AC_MSG_CHECKING([whether gcc supports lazy variable declaration]) + +cat > conftest.c << EOF +#include +#include + +int main (int argc, char*argv[]) +{ + int a,b; + b=3; + int c; + c=4; + return 0; +} +EOF + +testprog_link='$CC $CPPFLAGS $CFLAGS conftest.c -o conftest${ac_exeext}' +if { (eval echo gcc.2.95.m4:19: \"$testprog_link\") 1>&5; (eval $testprog_link) 2>&5; } && test -s conftest${ac_exeext}; then + AC_MSG_RESULT(yes) + GCC_IS_OK=true + export GCC_IS_OK +else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + AC_MSG_RESULT(no) +fi +rm -f conftest* +]) diff --git a/fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 b/fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 new file mode 100644 index 000000000..c4d0434a6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 @@ -0,0 +1,55 @@ +AC_DEFUN([RFX_CHECK_MING], +[ +AC_CANONICAL_HOST +AC_EXEEXT + +AC_MSG_CHECKING([for target system]) +CYGWIN= +MINGW= +case $host_os in + *cygwin* ) CYGWIN=yes;; + *mingw* ) MINGW=yes;; +esac + +AR=ar +if test "x$MINGW" = "xyes"; then + #fix for the debian distribution of mingw + if test -x "/usr/i586-mingw32msvc/bin/ar";then + AR="/usr/i586-mingw32msvc/bin/ar" + fi + if test -x "/usr/i586-mingw32msvc/bin/ranlib";then + RANLIB="/usr/i586-mingw32msvc/bin/ranlib" + fi + #fix for the gentoo distribution of mingw + if test -x "/opt/xmingw/bin/i386-mingw32msvc-ar";then + AR="/opt/xmingw/bin/i386-mingw32msvc-ar" + fi + if test -x "/opt/xmingw/bin/i386-mingw32msvc-ranlib";then + RANLIB="/opt/xmingw/bin/i386-mingw32msvc-ranlib" + fi + if test -x "/opt/xmingw/bin/i386-mingw32msvc-strip";then + STRIP="/opt/xmingw/bin/i386-mingw32msvc-strip" + fi +fi +AC_SUBST(AR) + +dnl Checks for system services + +if test "x${CYGWIN}" = "xyes"; then + AC_DEFINE([CYGWIN], [1], [Define on cygwin]) + AC_MSG_RESULT(cygwin) +else + if test "x${MINGW}" = "xyes"; then + AC_DEFINE([MINGW], [1], [Define on Mingw]) + WIN32=1 + AC_DEFINE([WIN32], [1], [Define on windows]) + LIBS="$LIBS -lws2_32 -lgdi32" + AC_MSG_RESULT([mingw]) + else + LINUX=1 + export LINUX + AC_DEFINE([LINUX], [1], [Define if not on cygwin or mingw]) + AC_MSG_RESULT() + fi +fi +]) diff --git a/fluidbook/tools/swftools-special-swfdump/m4/python.m4 b/fluidbook/tools/swftools-special-swfdump/m4/python.m4 new file mode 100644 index 000000000..1d7c3d9e0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/m4/python.m4 @@ -0,0 +1,173 @@ +AC_DEFUN([RFX_CHECK_PYTHON], +[ +AC_MSG_CHECKING([for Python version]) + +if test "x$PYTHON_LIB" '!=' "x" -a "x$PYTHON_INCLUDES" '!=' "x";then + # you can override the python detection by putting PYTHON_LIB + # and PYTHON_INCLUDES into the environment + case "$PYTHON_INCLUDES" in + *python2.4*) PY_VERSION=2.4 + ;; + *python2.5*) PY_VERSION=2.5 + ;; + *python2.6*) PY_VERSION=2.6 + ;; + *python2.7*) PY_VERSION=2.7 + ;; + *python3.0*) PY_VERSION=3.0 + ;; + *python3.1*) PY_VERSION=3.1 + ;; + *python3.2*) PY_VERSION=3.2 + ;; + *python3.3*) PY_VERSION=3.3 + ;; + *) PY_VERSION=unknown + ;; + esac +else + if test "x$PYTHON_LIB" '!=' "x" -o "x$PYTHON_INCLUDES" '!=' "x";then + echo "Set both PYTHON_LIB and PYTHON_INCLUDES, or none at all" + fi + # iterate through version 2.4 to 3.3 + VERSIONS="2.4 2.5 2.6 2.7 3.0 3.1 3.2 3.3" + case "$PYTHON" in + 2*) VERSIONS="2.4 2.5 2.6 2.7 $PYTHON" + ;; + 3*) VERSIONS="3.0 3.1 3.2 3.3 $PYTHON" + ;; + esac + for v in $VERSIONS; do + # Linux + if test -f "/usr/include/python$v/Python.h";then + PY_VERSION=$v + PYTHON_LIB="-lpython$PY_VERSION" + if test -f "/usr/lib/python$v/site-packages/PIL/_imaging.so";then + PYTHON_LIB2="$PYTHON_LIB /usr/lib/python$v/site-packages/PIL/_imaging.so" + HAVE_PYTHON_IMAGING_LIB=1 + else + PYTHON_LIB2="$PYTHON_LIB" + fi + PYTHON_INCLUDES="-I/usr/include/python$PY_VERSION" + # Mac OS X + elif test -f "/Library/Frameworks/Python.framework/Versions/$v/include/python$v/Python.h";then + PY_VERSION=$v + PYTHON_LIB="-framework Python" + if test -f "/Library/Frameworks/Python.framework/Versions/$v/site-packages/PIL/_imaging.so";then + PYTHON_LIB2="$PYTHON_LIB /Library/Python/$v/PIL/_imaging.so" + HAVE_PYTHON_IMAGING_LIB=1 + else + PYTHON_LIB2="$PYTHON_LIB" + fi + PYTHON_INCLUDES="-I/Library/Frameworks/Python.framework/Versions/$v/include/python$v/" + # Mac OS X [Fink]: + elif test "(" -f "/sw/lib/python$v/config/libpython$v.dylib" \ + -o -f "/sw/lib/python$v/config/libpython$v.a" \ + -o -f "/sw/lib/python$v/config/libpython$v.so" \ + ")" \ + -a -f "/sw/include/python$v/Python.h"; then + PY_VERSION=$v + PYTHON_LIB="-L /sw/lib/python$v/config/ -lpython$PY_VERSION /sw/lib/python$v/site-packages/PIL/_imaging.so" + if test -f "/sw/lib/python$v/site-packages/PIL/_imaging.so";then + PYTHON_LIB2="$PYTHON_LIB /sw/lib/python$v/site-packages/PIL/_imaging.so" + HAVE_PYTHON_IMAGING_LIB=1 + else + PYTHON_LIB2="$PYTHON_LIB" + fi + PYTHON_INCLUDES="-I /sw/include/python$v/" + fi + done +fi +AC_MSG_RESULT($PY_VERSION) + +if test "x$PY_VERSION" "!=" "x"; then + AC_MSG_CHECKING([for Python executable]) + if python$PY_VERSION -V 2>&5;then + PYTHON_EXECUTABLE=python$PY_VERSION + AC_SUBST(PYTHON_EXECUTABLE) + AC_MSG_RESULT([$PYTHON_EXECUTABLE]) + else + AC_MSG_RESULT([failed]) + fi +fi + +if test "x$PY_VERSION" "!=" "x" -a "x$PYTHON_EXECUTABLE" "!=" "x"; then + export PYTHON_INCLUDES PYTHON_LIB + AC_SUBST(PYTHON_LIB) + AC_SUBST(PYTHON_INCLUDES) + AC_MSG_CHECKING([whether we can compile the Python test program]) + + cat > conftest.c << EOF +# include + + int main() + { + int ret; + ret = Py_Main(0, 0); + int x; // check also for gcc 2.95.x incompatibilities + return ret; + } +EOF + + ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS $PYTHON_LIB $LIBS -o conftest${ac_exeext}' + if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + AC_MSG_RESULT(yes) + PYTHON_OK=yes + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + AC_MSG_RESULT(no) + fi + rm -f conftest* + + AC_MSG_CHECKING([for Python install path]) +cat > _pypath.py << EOF +import distutils +import distutils.sysconfig +import sys +sys.stdout.write(distutils.sysconfig.get_python_lib(plat_specific=0,standard_lib=0)) +EOF + echo $PYTHON_EXECUTABLE _pypath.py 1>&5 + if $PYTHON_EXECUTABLE _pypath.py >_pypath.txt 2>&5;then + PYTHON_INSTALL_PATH=`cat _pypath.txt` + AC_SUBST(PYTHON_INSTALL_PATH) + AC_MSG_RESULT($PYTHON_INSTALL_PATH) + else + AC_MSG_RESULT([failed]) + fi + #rm -f _pypath.txt _pypath.py + + if test "x$PYTHON_OK" = "xyes";then + AC_MSG_CHECKING([for Python-Imaging]) + cat > conftest.c << EOF +# include +# include + + int main() + { + Py_Main(0, 0); + return 0; + } +EOF + if test "$HAVE_PYTHON_IMAGING_LIB"; then + ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS ${PYTHON_LIB2} $LIBS -o conftest${ac_exeext}' + if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + PYTHON_LIB="${PYTHON_LIB2}" + AC_DEFINE([HAVE_PYTHON_IMAGING], [1], [whether Python-Imaging was found]) + HAVE_PYTHON_IMAGING=yes + export HAVE_PYTHON_IMAGING + AC_SUBST(HAVE_PYTHON_IMAGING) + AC_MSG_RESULT(yes) + else + echo "configure: failed program was:" >&5 + cat conftest.c >&5 + AC_MSG_RESULT(no) + fi + else + echo "(didn't find the Python-Imaging libraries)" >&5 + AC_MSG_RESULT(no) + fi + fi + rm -f conftest* +fi +]) diff --git a/fluidbook/tools/swftools-special-swfdump/m4/test.c b/fluidbook/tools/swftools-special-swfdump/m4/test.c new file mode 100644 index 000000000..e69de29bb diff --git a/fluidbook/tools/swftools-special-swfdump/missing b/fluidbook/tools/swftools-special-swfdump/missing new file mode 100644 index 000000000..22e101ab1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/missing @@ -0,0 +1,198 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997, 2001, 2002 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.in; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`$configure_ac'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`$configure_ac'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`$configure_ac'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/mkinstalldirs b/fluidbook/tools/swftools-special-swfdump/mkinstalldirs new file mode 100644 index 000000000..3159597e1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/fluidbook/tools/swftools-special-swfdump/setup.py b/fluidbook/tools/swftools-special-swfdump/setup.py new file mode 100644 index 000000000..5ebbdcdcf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/setup.py @@ -0,0 +1,338 @@ +#!/usr/bin/env python + +from distutils import ccompiler +from distutils.core import CompileError + +try: + from setuptools import setup, Extension +except ImportError: + from distutils.core import setup, Extension + +cc = ccompiler.new_compiler() + +# leave it to gcc to detect c/c++ files. we'll be linking against -lstdc++ +# later on to ensure we do have all the c++ libraries, so we don't need to +# compile *everything* as c++ just because of the few .cc files. +cc.language_map[".cc"] = "c" + +import os +import sys +import stat +import re + +DATADIR = "/usr/share/swftools/" + +def update_dirs(list1, list2): + for v in list2: + if v not in list1 and os.path.isdir(v): + list1.append(v) + +def update_list(list1, list2): + for v in list2: + if v not in list1: + list1.append(v) + +COMPILER_OPTIONS = ['-fPIC', '-Wparentheses', '-Wimplicit', '-Wreturn-type', + '-O3', '-fomit-frame-pointer', '-Winline', + '-Wno-unused', '-Wno-strict-prototypes','-DHAVE_CONFIG_H', + '-DSWFTOOLS_DATADIR="'+DATADIR+'"'] +INCLUDE=['lib/lame/', 'lib/pdf/xpdf', 'lib/pdf'] + +if 'library_dirs' in os.environ: + update_dirs(cc.library_dirs, [path.strip() for path in os.environ.get('library_dirs').strip().split(":")]) +else: + update_dirs(cc.library_dirs, [os.path.join(sys.prefix, 'lib'), + os.path.join(sys.prefix, 'local/lib')]) + if sys.platform == "darwin": + update_list(cc.library_dirs, ["/sw/lib", "/opt/local/lib"]) + +if 'include_dirs' in os.environ: + update_dirs(cc.include_dirs, [path.strip() for path in os.environ.get('include_dirs').strip().split(":")]) +else: + update_dirs(cc.include_dirs, [os.path.join(sys.prefix, 'include'), + os.path.join(sys.prefix, 'include/freetype2'), + os.path.join(sys.prefix, 'include/fontconfig')]) + if sys.platform == "darwin": + update_dirs(cc.include_dirs, ["/sw/include/freetype2", "/sw/lib/freetype2/include", "/sw/include", "/opt/local/include"]) + + +class ConfigScript: + def __init__(self): + self.defines = [] + self.includefiles = [] + self.libraries = [] + + def unlink(self, filename): + try: + os.unlink(filename) + except OSError: + pass + + def test_code(self, head, body, stdh=1): + fi = open("setup_test.c", "wb") + if stdh: + fi.write("#include \n") + fi.write("#include \n") + for i in self.includefiles: + fi.write("#include <%s>\n" % i) + for d in self.defines: + fi.write("%s;\n" % d) + fi.write(head) + fi.write("\nint main()\n") + fi.write("{\n") + fi.write(body) + fi.write("\n}\n") + fi.close() + #fi = open("setup_test.c", "rb") + #print fi.read() + #fi.close() + + quiet = 1 + if quiet: + try: + # redirect stderr + sys.stderr.flush() + err = open('/dev/null', 'a+', 0) + olderr = open('/dev/null', 'a+', 0) + os.dup2(2, olderr.fileno()) + os.dup2(err.fileno(), 2) + except: + pass + + error = 0 + try: + cc.compile(["setup_test.c"], include_dirs=cc.include_dirs) + except CompileError: + error = 1 + + if quiet: + try: + # unredirect stderr + sys.stderr.flush() + err = open('/dev/null', 'a+', 0) + os.dup2(olderr.fileno(), 2) + olderr.close() + err.close() + except: + pass + + self.unlink("setup_test.o") + self.unlink("setup_test.obj") + self.unlink("setup_test.c") + if error: + return None + else: + return 1 + + def system_has_property(self,name): + if name.startswith("STD"): + return 1 + elif name.startswith("INTERNAL"): + return 1 + elif name == "PACKAGE": + return "\"swftools\"" + elif name == "VERSION": + fi = open("configure.in", "rb") + for line in fi.readlines(): + if line.startswith("VERSION="): + return '"'+line[8:].strip()+'"' + return "unknown" + elif "POPPLER" in name: + return None + elif name.startswith("HAVE_") and name.endswith("_H"): + header = name[5:].lower() + c = header.rfind("_") + if c>=0: + header = header[0:c]+"."+header[c+1] + header = header.replace("_","/") + ok = 0 + for dir in cc.include_dirs: + if os.path.isfile(os.path.join(dir,header)): + ok = 1 + break + if ok and self.test_code("#include <"+header+">", ""): + if header.startswith("sys"): + self.includefiles += [header] + return 1 + elif name.startswith("HAVE_LIB") \ + or name.startswith("HAVE_FONTCONFIG") \ + or name.startswith("HAVE_FREETYPE"): + if name.startswith("HAVE_LIB"): + libname = name[8:].lower() + else: + libname = name[5:].lower() + if cc.find_library_file(cc.library_dirs, libname): + update_list(self.libraries, [libname]) + return 1 + elif name.startswith("HAVE_LAME"): + return None + elif name.startswith("O_BINARY"): + if sys.platform.startswith("win"): + return None + else: + return 0 + elif name == "boolean": + if self.test_code("", "boolean b;"): + return None + else: + self.defines += ["typedef int boolean"] + return "int" + elif name.startswith("SIZEOF_"): + t = name[7:].lower().replace("_", " ") + if t == "voidp": + t = "void*" + for i in [1,2,4,8]: + s = "static int test_array [%d+1-sizeof(%s)*2];\ntest_array [0] = 0;" % (i*2,t) + if self.test_code("", s): + return i + return None + elif name.startswith("USE_FREEETYPE"): + # TODO: run a test here? + return 1 + elif name.startswith("HAVE_"): + function = name[5:].lower() + params="" + if function=="bcopy": + params = "0,0,0" + elif function=="bzero": + params = "0,0" + return self.test_code("", "%s(%s);" % (function,params), stdh=0) + return None + + def create_config(self): + print "Creating config.h..." + + fi = open("config.h.in", "rb") + fo = open("config.h", "wb") + for line in fi.readlines(): + if line.startswith("#undef "): + line = line.strip() + name = line[7:] + if " " in name: + name = name.split(" ")[0] + value = self.system_has_property(name) + if value is None: + fo.write("// %s is not set\n" % (name)) + else: + fo.write("#define %s %s\n" % (name, value)) + else: + fo.write(line) + fo.write("// python:lib "+(" ".join(self.libraries))+"\n") + fo.close() + fi.close() + + def load(self): + if not os.path.isfile("config.h"): + return 0 + fi = open("config.h", "rb") + for line in fi.readlines(): + if line.startswith("// python: lib "): + self.libraries = line[15:].split(" ") + fi.close() + return + +config = ConfigScript() +# if either setup.py or config.h.in were modfied, rebuild config.h +if not config.load() or \ + os.stat("setup.py")[stat.ST_MTIME] > os.stat("config.h")[stat.ST_MTIME] or \ + os.stat("config.h.in")[stat.ST_MTIME] > os.stat("config.h")[stat.ST_MTIME]: + config.create_config() +#print dir(cc) +#sys.exit(0) + +if "jpeg" not in config.libraries: + print "Error: Couldn't find jpeg library on your system" + sys.exit(1) + +if "freetype" not in config.libraries: + print "Error: Couldn't find freetype library on your system" + sys.exit(1) + +base_sources = [ +"lib/q.c", "lib/utf8.c", "lib/png.c", "lib/jpeg.c", "lib/wav.c", "lib/mp3.c", "lib/os.c", "lib/bitio.c", "lib/log.c", "lib/mem.c", +] +rfxswf_sources = [ +"lib/modules/swfaction.c", "lib/modules/swfbits.c", "lib/modules/swfbutton.c", +"lib/modules/swfcgi.c", "lib/modules/swfdraw.c", "lib/modules/swfdump.c", "lib/modules/swffilter.c", +"lib/modules/swffont.c", "lib/modules/swfobject.c", "lib/modules/swfrender.c", "lib/modules/swfshape.c", +"lib/modules/swfsound.c", "lib/modules/swftext.c", "lib/modules/swftools.c", +"lib/rfxswf.c", "lib/drawer.c", "lib/MD5.c", "lib/h.263/dct.c", "lib/h.263/h263tables.c", +"lib/h.263/swfvideo.c", "lib/action/assembler.c", "lib/action/compile.c", +"lib/action/lex.swf4.c", "lib/action/lex.swf5.c", "lib/action/libming.c", +"lib/action/swf4compiler.tab.c", "lib/action/swf5compiler.tab.c", "lib/action/actioncompiler.c", +"lib/as3/abc.c", "lib/as3/code.c", "lib/as3/pool.c", "lib/as3/files.c", "lib/as3/opcodes.c", +"lib/as3/scripts.c", "lib/as3/common.c", "lib/as3/builtin.c", "lib/as3/compiler.c", "lib/as3/expr.c", "lib/as3/import.c", +"lib/as3/initcode.c", "lib/as3/parser.tab.c", "lib/as3/registry.c", "lib/as3/tokenizer.yy.c", +] +libpdf_sources = [ +"lib/pdf/GFXOutputDev.cc", "lib/pdf/InfoOutputDev.cc", "lib/pdf/BitmapOutputDev.cc", +"lib/pdf/FullBitmapOutputDev.cc", "lib/pdf/pdf.cc", "lib/pdf/fonts.c", "lib/pdf/xpdf/GHash.cc", +"lib/pdf/xpdf/GList.cc", "lib/pdf/xpdf/GString.cc", "lib/pdf/xpdf/gmem.cc", "lib/pdf/xpdf/gfile.cc", +"lib/pdf/xpdf/FoFiTrueType.cc", "lib/pdf/xpdf/FoFiType1.cc", "lib/pdf/xpdf/FoFiType1C.cc", +"lib/pdf/xpdf/FoFiBase.cc", "lib/pdf/xpdf/FoFiEncodings.cc", "lib/pdf/xpdf/OutputDev.cc", "lib/pdf/xpdf/PDFDoc.cc", +"lib/pdf/xpdf/Error.cc", "lib/pdf/xpdf/Stream.cc", "lib/pdf/xpdf/Object.cc", "lib/pdf/xpdf/Decrypt.cc", +"lib/pdf/xpdf/Array.cc", "lib/pdf/xpdf/XRef.cc", "lib/pdf/xpdf/Dict.cc", "lib/pdf/xpdf/Parser.cc", +"lib/pdf/xpdf/Lexer.cc", "lib/pdf/xpdf/Outline.cc", "lib/pdf/xpdf/PDFDocEncoding.cc", "lib/pdf/xpdf/Catalog.cc", +"lib/pdf/xpdf/Link.cc", "lib/pdf/xpdf/GlobalParams.cc", "lib/pdf/xpdf/JBIG2Stream.cc", "lib/pdf/xpdf/Page.cc", +"lib/pdf/xpdf/JPXStream.cc", "lib/pdf/xpdf/JArithmeticDecoder.cc", "lib/pdf/xpdf/Gfx.cc", "lib/pdf/xpdf/GfxFont.cc", +"lib/pdf/xpdf/CMap.cc", "lib/pdf/xpdf/CharCodeToUnicode.cc", "lib/pdf/xpdf/PSTokenizer.cc", "lib/pdf/xpdf/FontEncodingTables.cc", +"lib/pdf/xpdf/BuiltinFont.cc", "lib/pdf/xpdf/BuiltinFontTables.cc", "lib/pdf/xpdf/GfxState.cc", "lib/pdf/xpdf/Function.cc", +"lib/pdf/xpdf/Annot.cc", "lib/pdf/xpdf/NameToCharCode.cc", "lib/pdf/xpdf/UnicodeMap.cc", "lib/pdf/xpdf/SecurityHandler.cc", +"lib/pdf/xpdf/SplashOutputDev.cc", "lib/pdf/xpdf/SplashFont.cc", "lib/pdf/xpdf/SplashState.cc", "lib/pdf/xpdf/Splash.cc", +"lib/pdf/xpdf/SplashBitmap.cc", "lib/pdf/xpdf/SplashClip.cc", "lib/pdf/xpdf/SplashPattern.cc", "lib/pdf/xpdf/SplashFontEngine.cc", +"lib/pdf/xpdf/SplashFontFile.cc", "lib/pdf/xpdf/SplashFontFileID.cc", "lib/pdf/xpdf/SplashScreen.cc", "lib/pdf/xpdf/SplashPath.cc", +"lib/pdf/xpdf/SplashXPath.cc", "lib/pdf/xpdf/SplashXPathScanner.cc", "lib/pdf/xpdf/SplashFTFontEngine.cc", +"lib/pdf/xpdf/SplashFTFontFile.cc", "lib/pdf/xpdf/SplashFTFont.cc"] + +libgfx_sources = [ +"lib/gfxtools.c", "lib/gfxfont.c", "lib/gfxpoly.c", +"lib/devices/dummy.c", "lib/devices/file.c", "lib/devices/render.c", "lib/devices/text.c", "lib/devices/record.c", +"lib/devices/ops.c", "lib/devices/polyops.c", "lib/devices/bbox.c", "lib/devices/rescale.c", +"lib/art/art_affine.c", "lib/art/art_alphagamma.c", "lib/art/art_bpath.c", "lib/art/art_gray_svp.c", +"lib/art/art_misc.c", "lib/art/art_pixbuf.c", "lib/art/art_rect.c", "lib/art/art_rect_svp.c", +"lib/art/art_rect_uta.c", "lib/art/art_render.c", "lib/art/art_render_gradient.c", "lib/art/art_render_mask.c", +"lib/art/art_render_svp.c", "lib/art/art_rgb.c", "lib/art/art_rgb_a_affine.c", "lib/art/art_rgb_affine.c", +"lib/art/art_rgb_affine_private.c", "lib/art/art_rgb_bitmap_affine.c", "lib/art/art_rgb_pixbuf_affine.c", +"lib/art/art_rgb_rgba_affine.c", "lib/art/art_rgb_svp.c", "lib/art/art_rgba.c", "lib/art/art_svp.c", +"lib/art/art_svp_intersect.c", "lib/art/art_svp_ops.c", "lib/art/art_svp_point.c", +"lib/art/art_svp_render_aa.c", "lib/art/art_svp_vpath.c", "lib/art/art_svp_vpath_stroke.c", +"lib/art/art_svp_wind.c", "lib/art/art_uta.c", "lib/art/art_uta_ops.c", "lib/art/art_uta_rect.c", +"lib/art/art_uta_svp.c", "lib/art/art_uta_vpath.c", "lib/art/art_vpath.c", "lib/art/art_vpath_bpath.c", +"lib/art/art_vpath_dash.c", "lib/art/art_vpath_svp.c", "lib/gocr/box.c", +"lib/gocr/database.c", "lib/gocr/detect.c", "lib/gocr/job.c", "lib/gocr/lines.c", "lib/gocr/list.c", +"lib/gocr/ocr0.c", "lib/gocr/ocr0n.c", "lib/gocr/ocr1.c", "lib/gocr/otsu.c", "lib/gocr/output.c", +"lib/gocr/pgm2asc.c", "lib/gocr/pixel.c", "lib/gocr/progress.c", "lib/gocr/remove.c", "lib/gocr/unicode.c", +"lib/devices/ocr.c", +] +gfxswf_sources = ["lib/devices/swf.c", "lib/readers/swf.c", "lib/readers/image.c"] + +swf_module = Extension( + name='SWF', + include_dirs=cc.include_dirs+INCLUDE, + sources=['lib/python/SWF.c', 'lib/python/taglist.c', 'lib/python/tag.c', 'lib/python/image.c', + 'lib/python/tags.c', 'lib/python/tagmap.c', 'lib/python/action.c', 'lib/python/primitives.c', + 'lib/python/pyutils.c'] + base_sources + rfxswf_sources, + library_dirs=cc.library_dirs, + libraries=config.libraries, + extra_objects=['%s/lib/python%s/site-packages/PIL/_imaging.so' % (sys.prefix, sys.version[:3])], + extra_compile_args=COMPILER_OPTIONS, + ) + +gfx_module = Extension( + name='gfx', + sources=['lib/python/gfx.c'] + base_sources + libgfx_sources + rfxswf_sources + libpdf_sources + gfxswf_sources, + include_dirs=cc.include_dirs+INCLUDE, + library_dirs=cc.library_dirs, + libraries=config.libraries + ["stdc++"], + extra_objects=[], + extra_compile_args=COMPILER_OPTIONS, + ) + +setup(name='SWFTools', + version='0.9dev', + description='Python wrapper for SWFTools', + author='Matthias Kramm', + author_email='kramm@quiss.org', + url='http://www.swftools.org/', + ext_modules=[swf_module, gfx_module], +) diff --git a/fluidbook/tools/swftools-special-swfdump/src/Makefile b/fluidbook/tools/swftools-special-swfdump/src/Makefile new file mode 100644 index 000000000..33375ef96 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/Makefile @@ -0,0 +1,164 @@ +top_builddir = .. +srcdir = . +top_srcdir = .. +include ../Makefile.common + +install_programs = wav2swf$(E) png2swf$(E) swfcombine$(E) swfstrings$(E) swfextract$(E) swfdump$(E) swfc$(E) jpeg2swf$(E) swfbbox$(E) font2swf$(E) swfrender$(E) as3compile$(E) pdf2swf$(E) +programs = $(install_programs) swfbytes$(E) ttftool$(E) + +all: $(programs) + +wav2swf.$(O): wav2swf.c ../lib/wav.h + $(C) wav2swf.c -o $@ +png2swf.$(O): png2swf.c + $(C) png2swf.c -o $@ +pdf2swf.$(O): pdf2swf.c + $(C) pdf2swf.c -o $@ +pdf2pdf.$(O): pdf2pdf.c + $(C) pdf2pdf.c -o $@ +gfx2gfx.$(O): gfx2gfx.c + $(C) gfx2gfx.c -o $@ +gif2swf.$(O): gif2swf.c + $(C) gif2swf.c -o $@ +swfcombine.$(O): swfcombine.c + $(C) swfcombine.c -o $@ +swfdump.$(O): swfdump.c + $(C) swfdump.c -o $@ +swfextract.$(O): swfextract.c + $(C) swfextract.c -o $@ +swfstrings.$(O): swfstrings.c + $(C) swfstrings.c -o $@ +swfbbox.$(O): swfbbox.c + $(C) swfbbox.c -o $@ +swf2png.$(O): swf2png.c + $(C) swf2png.c -o $@ +jpeg2swf.$(O): jpeg2swf.c + $(C) jpeg2swf.c -o $@ +swfrender.$(O): swfrender.c + $(C) swfrender.c -o $@ +swfbytes.$(O): swfbytes.c + $(C) swfbytes.c -o $@ +font2swf.$(O): font2swf.c + $(C) font2swf.c -o $@ +ttftool.$(O): ttftool.c + $(C) ttftool.c -o $@ +as3compile.$(O): as3compile.c + $(C) as3compile.c -o $@ +swfc.$(O): swfc.c parser.h ../lib/q.h + $(C) swfc.c -o $@ +swfc-feedback.$(O): swfc-feedback.c swfc-feedback.h + $(C) swfc-feedback.c -o $@ +swfc-history.$(O): swfc-history.c swfc-history.h swfc-interpolation.h ../lib/q.h + $(C) swfc-history.c -o $@ +swfc-interpolation.$(O): swfc-interpolation.c swfc-interpolation.h ../lib/q.h + $(C) swfc-interpolation.c -o $@ +parser.$(O): parser.yy.c parser.h ../lib/q.h + $(C) parser.yy.c -o $@ + +../lib/librfxswf$(A): ../lib/modules/swfrender.c ../lib/modules/swfshape.c ../lib/modules/swftext.c ../lib/modules/swffont.c ../lib/modules/swfbits.c ../lib/rfxswf.c ../lib/devices/swf.c ../lib/modules/swfalignzones.c + cd ../lib;$(MAKE) librfxswf$(A);cd - + +../lib/libgfxpdf$(A): ../lib/pdf/VectorGraphicOutputDev.cc + cd ../lib;$(MAKE) libgfxpdf$(A);cd - + +../lib/libgfx$(A): ../lib/devices/*.c ../lib/gfxdevice.h ../lib/gfxtools.c ../lib/gfxfont.c + cd ../lib;$(MAKE) libgfx$(A);cd - + +../lib/libgfxswf$(A): ../lib/devices/swf.c ../lib/readers/swf.c + cd ../lib;$(MAKE) libgfxswf$(A);cd - + +# TODO: include the following rule only if lex is available +parser.yy.c: parser.lex + flex -B -s -oparser.yy.c parser.lex + +wav2swf$(E): wav2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) wav2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +png2swf$(E): png2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) png2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +gif2swf$(E): gif2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) gif2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfcombine$(E): swfcombine.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfcombine.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfdump$(E): swfdump.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfdump.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfbytes$(E): swfbytes.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfbytes.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swf2png$(E): swf2png.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swf2png.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfextract$(E): swfextract.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfextract.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfstrings$(E): swfstrings.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfstrings.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfbbox$(E): swfbbox.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfbbox.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +font2swf$(E): font2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) font2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +ttftool$(E): ttftool.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) ttftool.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +as3compile$(E): as3compile.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) as3compile.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +jpeg2swf$(E): jpeg2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) jpeg2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfrender$(E): swfrender.$(O) ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) + $(L) swfrender.$(O) -o $@ ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ + +PDF2SWF_OBJ=../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfxpdf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) +OCR_OBJ=../lib/libocr$(A) + +pdf2swf$(E): pdf2swf.$(O) $(PDF2SWF_OBJ) + $(LL) pdf2swf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) + $(STRIP) $@ +pdf2pdf$(E): pdf2pdf.$(O) $(PDF2SWF_OBJ) + $(LL) pdf2pdf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) + $(STRIP) $@ +gfx2gfx$(E): gfx2gfx.$(O) $(OCR_OBJ) $(PDF2SWF_OBJ) + $(LL) gfx2gfx.$(O) -o $@ $(OCR_OBJ) $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) + $(STRIP) $@ +swfc$(E): parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ + +install: + $(mkinstalldirs) $(bindir) + $(mkinstalldirs) $(man1dir) + @for file in $(install_programs); do if test -f $$file;then $(INSTALL_BIN);$(INSTALL_MAN1);fi;done + +uninstall: + @for file in $(install_programs); do $(UNINSTALL_BIN);$(UNINSTALL_MAN1);done + +clean: + rm -f *.o *.obj *.lo *.la *~ gmon.out + rm -f as3compile gif2swf swfbbox swfbytes swfbytes swfdump pdf2swf wav2swf png2swf swfcombine swfextract swfstrings png2swf jpeg2swf swfc font2swf pdf2pdf gfx2gfx + @rm -f gif2swf.exe swfbytes.exe swfbytes.exe pdf2swf.exe swfbbox.exe swfdump.exe wav2swf.exe png2swf.exe swfcombine.exe swfextract.exe swfstrings.exe png2swf.exe jpeg2swf.exe swfc.exe font2swf.exe pdf2pdf.exe gfx2gfx.exe + @rm -f gif2swf$(E) pdf2swf$(E) swfbytes$(E) swfbytes$(E) swfbbox$(E) swfdump$(E) wav2swf$(E) png2swf$(E) swfcombine$(E) swfextract$(E) swfstrings$(E) png2swf$(E) jpeg2swf$(E) swfc$(E) font2swf$(E) pdf2pdf$(E) gfx2gfx$(E) + +doc: + perl ../parsedoc.pl wav2swf.doc + perl ../parsedoc.pl png2swf.doc + perl ../parsedoc.pl gif2swf.doc + perl ../parsedoc.pl swfbbox.doc + perl ../parsedoc.pl font2swf.doc + perl ../parsedoc.pl jpeg2swf.doc + perl ../parsedoc.pl swfcombine.doc + perl ../parsedoc.pl swfdump.doc + perl ../parsedoc.pl swfc.doc + perl ../parsedoc.pl as3compile.doc + perl ../parsedoc.pl swfbytes.doc + perl ../parsedoc.pl pdf2pdf.doc + +.PHONY: clean doc diff --git a/fluidbook/tools/swftools-special-swfdump/src/Makefile.in b/fluidbook/tools/swftools-special-swfdump/src/Makefile.in new file mode 100644 index 000000000..e2712e00a --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/Makefile.in @@ -0,0 +1,164 @@ +top_builddir = .. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../Makefile.common + +install_programs = wav2swf$(E) @PNG2SWF@ swfcombine$(E) swfstrings$(E) swfextract$(E) swfdump$(E) swfc$(E) @JPEG2SWF@ @GIF2SWF@ swfbbox$(E) font2swf$(E) swfrender$(E) as3compile$(E) @PDF2SWF@ @PDF2PDF@ +programs = $(install_programs) swfbytes$(E) ttftool$(E) + +all: $(programs) + +wav2swf.$(O): wav2swf.c ../lib/wav.h + $(C) wav2swf.c -o $@ +png2swf.$(O): png2swf.c + $(C) png2swf.c -o $@ +pdf2swf.$(O): pdf2swf.c + $(C) pdf2swf.c -o $@ +pdf2pdf.$(O): pdf2pdf.c + $(C) pdf2pdf.c -o $@ +gfx2gfx.$(O): gfx2gfx.c + $(C) gfx2gfx.c -o $@ +gif2swf.$(O): gif2swf.c + $(C) gif2swf.c -o $@ +swfcombine.$(O): swfcombine.c + $(C) swfcombine.c -o $@ +swfdump.$(O): swfdump.c + $(C) swfdump.c -o $@ +swfextract.$(O): swfextract.c + $(C) swfextract.c -o $@ +swfstrings.$(O): swfstrings.c + $(C) swfstrings.c -o $@ +swfbbox.$(O): swfbbox.c + $(C) swfbbox.c -o $@ +swf2png.$(O): swf2png.c + $(C) swf2png.c -o $@ +jpeg2swf.$(O): jpeg2swf.c + $(C) jpeg2swf.c -o $@ +swfrender.$(O): swfrender.c + $(C) swfrender.c -o $@ +swfbytes.$(O): swfbytes.c + $(C) swfbytes.c -o $@ +font2swf.$(O): font2swf.c + $(C) font2swf.c -o $@ +ttftool.$(O): ttftool.c + $(C) ttftool.c -o $@ +as3compile.$(O): as3compile.c + $(C) as3compile.c -o $@ +swfc.$(O): swfc.c parser.h ../lib/q.h + $(C) swfc.c -o $@ +swfc-feedback.$(O): swfc-feedback.c swfc-feedback.h + $(C) swfc-feedback.c -o $@ +swfc-history.$(O): swfc-history.c swfc-history.h swfc-interpolation.h ../lib/q.h + $(C) swfc-history.c -o $@ +swfc-interpolation.$(O): swfc-interpolation.c swfc-interpolation.h ../lib/q.h + $(C) swfc-interpolation.c -o $@ +parser.$(O): parser.yy.c parser.h ../lib/q.h + $(C) parser.yy.c -o $@ + +../lib/librfxswf$(A): ../lib/modules/swfrender.c ../lib/modules/swfshape.c ../lib/modules/swftext.c ../lib/modules/swffont.c ../lib/modules/swfbits.c ../lib/rfxswf.c ../lib/devices/swf.c ../lib/modules/swfalignzones.c + cd ../lib;$(MAKE) librfxswf$(A);cd - + +../lib/libgfxpdf$(A): ../lib/pdf/VectorGraphicOutputDev.cc + cd ../lib;$(MAKE) libgfxpdf$(A);cd - + +../lib/libgfx$(A): ../lib/devices/*.c ../lib/gfxdevice.h ../lib/gfxtools.c ../lib/gfxfont.c + cd ../lib;$(MAKE) libgfx$(A);cd - + +../lib/libgfxswf$(A): ../lib/devices/swf.c ../lib/readers/swf.c + cd ../lib;$(MAKE) libgfxswf$(A);cd - + +# TODO: include the following rule only if lex is available +parser.yy.c: parser.lex + flex -B -s -oparser.yy.c parser.lex + +wav2swf$(E): wav2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) wav2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +png2swf$(E): png2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) png2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +gif2swf$(E): gif2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) gif2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfcombine$(E): swfcombine.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfcombine.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfdump$(E): swfdump.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfdump.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfbytes$(E): swfbytes.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfbytes.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swf2png$(E): swf2png.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swf2png.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfextract$(E): swfextract.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfextract.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfstrings$(E): swfstrings.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfstrings.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfbbox$(E): swfbbox.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) swfbbox.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +font2swf$(E): font2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) font2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +ttftool$(E): ttftool.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) ttftool.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +as3compile$(E): as3compile.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) as3compile.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +jpeg2swf$(E): jpeg2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) jpeg2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ +swfrender$(E): swfrender.$(O) ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) + $(L) swfrender.$(O) -o $@ ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ + +PDF2SWF_OBJ=../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfxpdf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) +OCR_OBJ=../lib/libocr$(A) + +pdf2swf$(E): pdf2swf.$(O) $(PDF2SWF_OBJ) + $(LL) pdf2swf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) + $(STRIP) $@ +pdf2pdf$(E): pdf2pdf.$(O) $(PDF2SWF_OBJ) + $(LL) pdf2pdf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) + $(STRIP) $@ +gfx2gfx$(E): gfx2gfx.$(O) $(OCR_OBJ) $(PDF2SWF_OBJ) + $(LL) gfx2gfx.$(O) -o $@ $(OCR_OBJ) $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) + $(STRIP) $@ +swfc$(E): parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + $(STRIP) $@ + +install: + $(mkinstalldirs) $(bindir) + $(mkinstalldirs) $(man1dir) + @for file in $(install_programs); do if test -f $$file;then $(INSTALL_BIN);$(INSTALL_MAN1);fi;done + +uninstall: + @for file in $(install_programs); do $(UNINSTALL_BIN);$(UNINSTALL_MAN1);done + +clean: + rm -f *.o *.obj *.lo *.la *~ gmon.out + rm -f as3compile gif2swf swfbbox swfbytes swfbytes swfdump pdf2swf wav2swf png2swf swfcombine swfextract swfstrings png2swf jpeg2swf swfc font2swf pdf2pdf gfx2gfx + @rm -f gif2swf.exe swfbytes.exe swfbytes.exe pdf2swf.exe swfbbox.exe swfdump.exe wav2swf.exe png2swf.exe swfcombine.exe swfextract.exe swfstrings.exe png2swf.exe jpeg2swf.exe swfc.exe font2swf.exe pdf2pdf.exe gfx2gfx.exe + @rm -f gif2swf$(E) pdf2swf$(E) swfbytes$(E) swfbytes$(E) swfbbox$(E) swfdump$(E) wav2swf$(E) png2swf$(E) swfcombine$(E) swfextract$(E) swfstrings$(E) png2swf$(E) jpeg2swf$(E) swfc$(E) font2swf$(E) pdf2pdf$(E) gfx2gfx$(E) + +doc: + perl ../parsedoc.pl wav2swf.doc + perl ../parsedoc.pl png2swf.doc + perl ../parsedoc.pl gif2swf.doc + perl ../parsedoc.pl swfbbox.doc + perl ../parsedoc.pl font2swf.doc + perl ../parsedoc.pl jpeg2swf.doc + perl ../parsedoc.pl swfcombine.doc + perl ../parsedoc.pl swfdump.doc + perl ../parsedoc.pl swfc.doc + perl ../parsedoc.pl as3compile.doc + perl ../parsedoc.pl swfbytes.doc + perl ../parsedoc.pl pdf2pdf.doc + +.PHONY: clean doc diff --git a/fluidbook/tools/swftools-special-swfdump/src/as3compile b/fluidbook/tools/swftools-special-swfdump/src/as3compile new file mode 100644 index 000000000..0eb99eb9f Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/as3compile differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/as3compile.1 b/fluidbook/tools/swftools-special-swfdump/src/as3compile.1 new file mode 100644 index 000000000..cb207e414 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/as3compile.1 @@ -0,0 +1,91 @@ +.TH as3compile "1" "April 2009" "as3compile" "swftools" +.SH NAME +as3compile - Compile .as ActionScript 3.0 files to swf. + +.SH Synopsis +.B as3compile file.as [-o file.swf] + +.SH DESCRIPTION +Compiles a file written in ActionScript 3.0 to a SWF file. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Increase verbosity +.TP +\fB\-q\fR, \fB\-\-quiet\fR + Decrease verbosity +.TP +\fB\-C\fR, \fB\-\-cgi\fR + Output to stdout (for use in CGI environments) +.TP +\fB\-R\fR, \fB\-\-resolve\fR + This flag will cause the compiler to try filenames like "FooBar.as" for classes named "FooBar". +.TP +\fB\-D\fR, \fB\-\-define\fR \fInamespace::variable\fR + Set a compile time variable (for doing conditional compilation) +.TP +\fB\-X\fR, \fB\-\-width\fR + Set target SWF width +.TP +\fB\-Y\fR, \fB\-\-height\fR + Set target SWF width +.TP +\fB\-r\fR, \fB\-\-rate\fR + Set target SWF framerate +.TP +\fB\-M\fR, \fB\-\-mainclass\fR + Set the name of the main class (extending flash.display.MovieClip) +.TP +\fB\-l\fR, \fB\-\-library\fR \fIfile\fR + Include library file \fIfile\fR. can be an .abc or .swf file. +.TP +\fB\-I\fR, \fB\-\-include\fR \fIdir\fR + Add additional include dir \fIdir\fR. +.TP +\fB\-N\fR, \fB\-\-local-with-network\fR + Make output file "local with networking" +.TP +\fB\-L\fR, \fB\-\-local-with-filesystem\fR + Make output file "local with filesystem" +.TP +\fB\-T\fR, \fB\-\-flashversion\fR \fInum\fR + \fInum\fR must be >= 9. +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Set output file to \fIfilename\fR. +.SH EXAMPLE + + The following is a basic as3 file that can be compiled e.g. + with \fBas3compile -X 400 -Y 400 smiley.as\fR + + // smiley.as + package + { + import flash.display.MovieClip + + public class Main extends MovieClip + { + function Main() + { + this.graphics.beginFill(0xcccc00) + this.graphics.drawCircle(200,200,200) + this.graphics.endFill() + this.graphics.beginFill(0x000000) + this.graphics.drawCircle(140,150,50) + this.graphics.drawCircle(260,150,50) + this.graphics.drawRoundRect(140,270,120,10,20); + this.graphics.endFill() + } + } + } + +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/as3compile.c b/fluidbook/tools/swftools-special-swfdump/src/as3compile.c new file mode 100644 index 000000000..9ee4569ed --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/as3compile.c @@ -0,0 +1,277 @@ +/* as3compile.c + Compiles ActionScript 3.0 (.as) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2008/2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" +#include "../lib/q.h" +#include "../lib/os.h" + +static char * filename = 0; +static char * outputname = 0; +static int override_outputname = 0; +static int do_cgi = 0; +static double framerate = 25.0; +static double width = 400; +static double height = 300; +static int flashversion = 9; +static int verbose = 1; +static char local_with_networking = 0; +static char local_with_filesystem = 0; +static char*mainclass = 0; + +static struct options_t options[] = { +{"h", "help"}, +{"V", "version"}, +{"v", "verbose"}, +{"q", "quiet"}, +{"C", "cgi"}, +{"R", "resolve"}, +{"D", "define"}, +{"X", "width"}, +{"Y", "height"}, +{"r", "rate"}, +{"M", "mainclass"}, +{"l", "library"}, +{"I", "include"}, +{"N", "local-with-network"}, +{"L", "local-with-filesystem"}, +{"T", "flashversion"}, +{"o", "output"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfc - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "o")) { + outputname = val; + override_outputname = 1; + return 1; + } + else if(!strcmp(name, "r")) { + framerate = atof(val); + return 1; + } + else if(!strcmp(name, "M")) { + mainclass = val; + return 1; + } + else if(!strcmp(name, "v")) { + verbose++; + return 0; + } + else if(!strcmp(name, "q")) { + verbose--; + return 0; + } + else if(!strcmp(name, "X")) { + width = atof(val); + return 1; + } + else if(!strcmp(name, "Y")) { + height = atof(val); + return 1; + } + else if(!strcmp(name, "T")) { + flashversion = atoi(val); + return 1; + } + else if(!strcmp(name, "C")) { + do_cgi = 1; + return 0; + } + else if(!strcmp(name, "l")) { + as3_import_file(val); + return 1; + } + else if(!strcmp(name, "I")) { + as3_add_include_dir(val); + return 1; + } + else if(!strcmp(name, "R")) { + as3_set_option("recurse","1"); + return 0; + } + else if(!strcmp(name, "D")) { + if(!strstr(val, "::")) { + fprintf(stderr, "Error: compile definition must contain \"::\"\n"); + exit(1); + } + as3_set_define(val); + return 1; + } + else if (!strcmp(name, "N")) + { + local_with_networking = 1; + return 0; + } + else if (!strcmp(name, "L")) + { + local_with_filesystem = 1; + return 0; + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s file.as [-o file.swf] \n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-V , --version Print version info and exit\n"); + printf("-v , --verbose Increase verbosity\n"); + printf("-q , --quiet Decrease verbosity\n"); + printf("-C , --cgi Output to stdout (for use in CGI environments)\n"); + printf("-R , --resolve Try to resolve undefined classes automatically.\n"); + printf("-D , --define Set a compile time variable (for doing conditional compilation)\n"); + printf("-X , --width Set target SWF width\n"); + printf("-Y , --height Set target SWF width\n"); + printf("-r , --rate Set target SWF framerate\n"); + printf("-M , --mainclass Set the name of the main class (extending flash.display.MovieClip or .Sprite)\n"); + printf("-l , --library Include library file . can be an .abc or .swf file.\n"); + printf("-I , --include

Add additional include dir .\n"); + printf("-N , --local-with-network Make output file \"local with networking\"\n"); + printf("-L , --local-with-filesystem Make output file \"local with filesystem\"\n"); + printf("-T , --flashversion Set target SWF flash version to .\n"); + printf("-o , --output Set output file to .\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +void writeSWF(SWF*swf) +{ + int fi = -1; + if(do_cgi || !strcmp(filename, "-")) + fi = fileno(stdout); + else + fi = open(outputname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if(fi<0) { + fprintf(stderr, "couldn't create output file %s\n", filename); + exit(1); + } + if(do_cgi) { + if(swf_WriteCGI(swf)<0) { + fprintf(stderr, "WriteCGI failed.\n"); + exit(1); + } + } else { + if(swf_WriteSWF(fi, swf)<0) { + fprintf(stderr, "WriteSWF() failed.\n"); + exit(1); + } + } +} + +int main (int argc,char ** argv) +{ + char buf[512]; + char*currentdir = getcwd(buf, 512); + if(!currentdir) { + as3_warning("Could not determine the current directory"); + } else { + as3_add_include_dir(currentdir); + } + + int t; + processargs(argc, argv); + as3_setverbosity(verbose); + + if(!filename) { + args_callback_usage(argv[0]); + exit(1); + } + if(!outputname) { + outputname = stripFilename(filename, ".swf"); + //as3_warning("output name not given, writing to %s", outputname); + } + + if(!strcmp(filename, ".")) { + as3_parse_directory("."); + } else { + as3_parse_file(filename); + } + + void*code = as3_getcode(); + + SWF swf; + memset(&swf, 0, sizeof(swf)); + swf.fileVersion = flashversion; + swf.frameRate = framerate*0x100; + swf.movieSize.xmin = 0; + swf.movieSize.ymin = 0; + swf.movieSize.xmax = width*20; + swf.movieSize.ymax = height*20; + TAG*tag = swf.firstTag = swf_InsertTag(0, ST_DOABC); + swf_WriteABC(tag, code); + + if(!mainclass) + mainclass = as3_getglobalclass(); + if(mainclass) { + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, 0); + swf_SetString(tag, mainclass); + } else { + as3_warning("no global public MovieClip subclass"); + } + + as3_destroy(); + + tag = swf_InsertTag(tag, ST_SHOWFRAME); + tag = swf_InsertTag(tag, ST_END); + + swf_FreeABC(code); + + if(local_with_filesystem) + swf.fileAttributes &= ~FILEATTRIBUTE_USENETWORK; + if(local_with_networking) + swf.fileAttributes |= FILEATTRIBUTE_USENETWORK; + + writeSWF(&swf); + swf_FreeTags(&swf); + + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/font2swf b/fluidbook/tools/swftools-special-swfdump/src/font2swf new file mode 100644 index 000000000..ef8e4c8aa Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/font2swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/font2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/font2swf.1 new file mode 100644 index 000000000..9b4a9f6dc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/font2swf.1 @@ -0,0 +1,33 @@ +.TH font2swf "1" "April 2009" "font2swf" "swftools" +.SH NAME +font2swf - Converts a font to SWF. + +.SH Synopsis +.B font2swf + +.SH DESCRIPTION +Takes a font file (.ttf, .afm, .pfa, .pfb and all other types +supported by FreeType) and converts it into a SWF file. +.PP +The SWF will contain the Font in SWF format (that is, a +DefineFont2 Tag) as well as a textfield containing all the +characters the font has. This means the resulting SWF will +be viewable. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be verbose. Use more than one -v for greater effect. +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Write output to file \fIfilename\fR. (If not given, the output will go + to a file called "output.swf") +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/font2swf.c b/fluidbook/tools/swftools-special-swfdump/src/font2swf.c new file mode 100644 index 000000000..972f29430 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/font2swf.c @@ -0,0 +1,137 @@ +/* font2swf.c + + Utility for converting TrueType and Type 1 fonts to SWF. + + Part of the swftools package. + + Copyright (c) 2004 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" + +static char * filename = 0; +static char * destfilename = "output.swf"; +static int all=0; +static int verbose=0; +static char * fontname = 0; +static char config_flashtype = 0; + +static struct options_t options[] = { +{"h", "help"}, +{"v", "verbose"}, +{"T", "flashtype"}, +{"o", "output"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("font2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "o")) { + destfilename = val; + return 1; + } + else if(!strcmp(name, "v")) { + verbose ++; + return 0; + } + else if(!strcmp(name, "T")) { + config_flashtype=1; + return 0; + } + else if(!strcmp(name, "n")) { + fontname = val; + return 1; + } + else if(!strcmp(name, "a")) { + all = 1; + return 0; + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s \n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); + printf("-o , --output Write output to file .\n"); + printf("-V , --version Print version info and exit\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Please specify only one font\n"); + exit(1); + } + filename = name; + return 0; +} + +static void convertFont(char*infile, char*outfile) +{ + SWFFONT * font; + + font = swf_LoadFont(infile, config_flashtype); + swf_FontCreateAlignZones(font); + + if(fontname) + font->name = strdup(fontname); + + swf_WriteFont(font, outfile); + swf_FontFree(font); +} + +int main(int argc, char ** argv) +{ + char cwd[128]; + getcwd(cwd, 128); + processargs(argc, argv); + if(!all && !filename) { + fprintf(stderr, "You must supply a filename.\n"); + exit(1); + } + + if(!all) { + convertFont(filename, destfilename); + return 0; + } + + /* TODO */ + printf("--all not implemented yet.\n"); + + return 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 new file mode 100644 index 000000000..56fd09d8f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 @@ -0,0 +1,42 @@ +.TH gif2swf "1" "April 2009" "gif2swf" "swftools" +.SH NAME +gif2swf - Takes a number of gif files and converts them to a swf movie, one +picture per frame. + +.SH Synopsis +.B gif2swf [-X width] [-Y height] [-o file.swf] [-r rate] file1.gif [file2.gif ...] + +.SH DESCRIPTION +This tools converts gif image files into an SWF animation. It takes any +number of input pictures, and converts them to SWF one-by-one, where every +converted picture is a seperate frame in the target SWF. + +.SH OPTIONS +.TP +\fB\-r\fR, \fB\-\-rate\fR \fIframerate\fR + Set movie framerate (frames per second) +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Explicitly specify output file. (Otherwise, output will go to stdout / output.swf) +.TP +\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR + Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be + smaller, but not playable in Flash Plugins of Version 5 and below. +.TP +\fB\-l\fR, \fB\-\-loop\fR \fIloop count\fR + Set loop count. (default: 0 [=infinite loop]) +.TP +\fB\-X\fR, \fB\-\-pixel\fR \fIwidth\fR + Force movie width to \fIwidth\fR (default: autodetect) +.TP +\fB\-Y\fR, \fB\-\-pixel\fR \fIheight\fR + Force movie height to \fIheight\fR (default: autodetect) +.TP +\fB\-v\fR, \fB\-\-verbose\fR \fIlevel\fR + Set verbose level (0=quiet, 1=default, 2=debug) +.TP +\fB\-C\fR, \fB\-\-cgi\fR + For use as CGI- prepend http header, write to stdout +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version information and exit diff --git a/fluidbook/tools/swftools-special-swfdump/src/gif2swf.c b/fluidbook/tools/swftools-special-swfdump/src/gif2swf.c new file mode 100644 index 000000000..2359da5cc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/gif2swf.c @@ -0,0 +1,702 @@ +/* -*- mode: c; tab-width: 4; -*- ---------------------------[for (x)emacs]-- + + $Id: gif2swf.c,v 1.7 2008/02/08 11:43:12 kramm Exp $ + GIF to SWF converter tool + + Part of the swftools package. + + Copyright (c) 2005 Daichi Shinozaki + + This program is free software; you can redistribute it and/or 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. + + This file is derived from png2swf.c */ + +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" + +#define MAX_INPUT_FILES 1024 +#define VERBOSE(x) (global.verbose>=x) +#define AS_FIRSTFRAME "if(!n) n=0;" +#define AS_LASTFRAME "if(n<%d){n=n+1;gotoAndPlay(1);}else stop();" + +static struct { + float framerate; + int max_image_width; + int max_image_height; + int force_width; + int force_height; + int nfiles; + int verbose; + int do_cgi; + int version; + char *outfile; + int imagecount; + int loopcount; +} global; + +struct { + char *filename; +} image[MAX_INPUT_FILES]; + +struct gif_header { + int width; + int height; +}; + +enum disposal_method { + NONE, + DO_NOT_DISPOSE, + RESTORE_TO_BGCOLOR, + RESTORE_TO_PREVIOUS +}; + + +void SetFrameAction(TAG ** t, const char *src, int ver) +{ + ActionTAG *as; + + as = swf_ActionCompile(src, ver); + if (!as) + fprintf(stderr, "Couldn't compile ActionScript\n"); + else { + *t = swf_InsertTag(*t, ST_DOACTION); + swf_ActionSet(*t, as); + swf_ActionFree(as); + } +} + +int getGifDisposalMethod(GifFileType * gft, int framenum) +{ + int i; + ExtensionBlock *ext = gft->SavedImages[framenum].ExtensionBlocks; + + for (i = 0; i < gft->SavedImages[framenum].ExtensionBlockCount; i++, ext++) + if (ext->Function == GRAPHICS_EXT_FUNC_CODE) + return ((ext->Bytes[0] & 0x1C) >> 2); + + return -1; +} + +int getGifLoopCount(GifFileType * gft) +{ + int i, loop = -1; + ExtensionBlock *ext = gft->SavedImages[0].ExtensionBlocks; + + for (i = 0; i < gft->SavedImages[0].ExtensionBlockCount; i++, ext++) + if (ext->Function == APPLICATION_EXT_FUNC_CODE) { + // info: http://semmix.pl/color/exgraf/eeg24.htm + if (ext->ByteCount == 11 && + (strncmp(&ext->Bytes[0], "NETSCAPE2.0", 11) == 0 || + strncmp(&ext->Bytes[0], "ANIMEXTS1.0", 11) == 0)) { + // check for the subblock + ext++; + if (ext->ByteCount != 3) + ext--; + else { + loop = GET16(&ext->Bytes[1]); + break; + } + } + } + + return loop; +} + +U16 getGifDelayTime(GifFileType * gft, int framenum) +{ + int i; + ExtensionBlock *ext = gft->SavedImages[framenum].ExtensionBlocks; + + for (i = 0; i < gft->SavedImages[framenum].ExtensionBlockCount; i++, ext++) + if (ext->Function == GRAPHICS_EXT_FUNC_CODE) + return GET16(&ext->Bytes[1]); + + return 0; +} + +int getTransparentColor(GifFileType * gft, int framenum) +{ + int i; + ExtensionBlock *ext = gft->SavedImages[framenum].ExtensionBlocks; + + // Get transparency color from graphic extension block + for (i = 0; i < gft->SavedImages[framenum].ExtensionBlockCount; i++, ext++) + if ((ext->Function == GRAPHICS_EXT_FUNC_CODE) && (ext->Bytes[0] & 1)) { + // there is a transparent color + return ext->Bytes[3] == 0 ? 0 : // exception + (U8) ext->Bytes[3]; // transparency color + } + + return -1; +} + +TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) +{ + TAG *t; + RGBA rgb; + + memset(swf, 0x00, sizeof(SWF)); + + swf->fileVersion = global.version; + swf->frameRate = (int) (256.0 * framerate); + swf->movieSize.xmax = dx * 20; + swf->movieSize.ymax = dy * 20; + + t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); + + rgb.r = rgb.g = rgb.b = rgb.a = 0x00; + + //rgb.g = 0xff; //<--- handy for testing alpha conversion + swf_SetRGB(t, &rgb); + + return t; +} + +int MovieFinish(SWF * swf, TAG * t, char *sname) +{ + int f, so = fileno(stdout); + t = swf_InsertTag(t, ST_END); + + if ((!isatty(so)) && (!sname)) + f = so; + else { + if (!sname) + sname = "output.swf"; + f = open(sname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644); + } + + if (global.do_cgi) { + if FAILED + (swf_WriteCGI(swf)) fprintf(stderr, "WriteCGI() failed.\n"); + } else { + if (swf_WriteSWF(f, swf) < 0) + fprintf(stderr, "Unable to write output file: %s\n", sname); + if (f != so) + close(f); + } + + swf_FreeTags(swf); + return 0; +} + +TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id, int imgidx) +{ + SHAPE *s; + SRECT r; + MATRIX m; + int fs; + + U8 *imagedata, *from, *to; + GifImageDesc *img; + RGBA *pal; + + struct gif_header header; + + int i, j, numcolors, alphapalette; + U8 bgcolor; + int bpp; // byte per pixel + int swf_width, padlen; + + ColorMapObject *colormap; + GifColorType c; + int interlacedOffset[] = { 0, 4, 2, 1 }; // The way Interlaced image should + int interlacedJumps[] = { 8, 8, 4, 2 }; // be read - offsets and jumps... + U16 delay, depth; + int disposal; + char *as_lastframe; + + GifFileType *gft; + FILE *fi; + + if ((fi = fopen(sname, "rb")) == NULL) { + if (VERBOSE(1)) + fprintf(stderr, "Read access failed: %s\n", sname); + return t; + } + fclose(fi); + + if ((gft = DGifOpenFileName(sname)) == NULL) { + fprintf(stderr, "%s is not a GIF file!\n", sname); + return t; + } + + if (DGifSlurp(gft) != GIF_OK) { + PrintGifError(); + return t; + } + + header.width = gft->SWidth; + header.height = gft->SHeight; + + pal = (RGBA *) malloc(256 * sizeof(RGBA)); + memset(pal, 0, 256 * sizeof(RGBA)); + + img = &gft->SavedImages[imgidx].ImageDesc; + + // Local colormap has precedence over Global colormap + colormap = img->ColorMap ? img->ColorMap : gft->SColorMap; + numcolors = colormap->ColorCount; + alphapalette = getTransparentColor(gft, imgidx); + if (VERBOSE(3)) + fprintf(stderr, "transparent palette index => %d\n", alphapalette); + bpp = (alphapalette >= 0 ? 4 : 3); + + // bgcolor is the background color to fill the bitmap + if (gft->SColorMap) // There is a GlobalColorMap + bgcolor = (U8) gft->SBackGroundColor; // The SBGColor is meaningful + else if (alphapalette >= 0) // There is a transparency color + bgcolor = alphapalette; // set the bgcolor to tranparent + else + bgcolor = 0; + // Don't know what to do here. + // If this doesn't work, we could + // create a new color and set the + // alpha-channel to transparent + // (unless we are using all the 256 + // colors, in which case either we + // give up, or move to 16-bits palette + if (VERBOSE(3)) + fprintf(stderr, "BG palette index => %u\n", bgcolor); + + for (i = 0; i < numcolors; i++) { + c = colormap->Colors[i]; + if (i == bgcolor || i == alphapalette) + pal[i].r = pal[i].g = pal[i].b = pal[i].a = 0; // Fully transparent + else { + pal[i].r = c.Red; + pal[i].g = c.Green; + pal[i].b = c.Blue; + pal[i].a = 255; // Fully opaque + } + } + + t = swf_InsertTag(t, bpp == 4 ? ST_DEFINEBITSLOSSLESS2 : ST_DEFINEBITSLOSSLESS); + swf_SetU16(t, id); // id + + // Ah! The Flash specs says scanlines must be DWORD ALIGNED! + // (but image width is the correct number of pixels) + swf_width = BYTES_PER_SCANLINE(header.width); + + if ((imagedata = (U8 *) malloc(swf_width * header.height)) == NULL) { + fprintf(stderr, "Failed to allocate memory required, aborted."); + exit(2); + } + + to = imagedata; + from = (U8 *) gft->SavedImages[imgidx].RasterBits; + + if (swf_width == header.width) { + // we are all nicely aligned and don't need to move the bitmap around. + // Just copy the bits into the image buffer. + if (!gft->Image.Interlace) + if (header.width == img->Width && header.height == img->Height) + memcpy(to, from, header.width * header.height); + else { //small screen + for (i = 0; i < header.height; i++, to += header.width) { + memset(to, bgcolor, header.width); + if (i >= img->Top && i < img->Top + img->Height) { + memcpy(to + img->Left, from, img->Width); + from += img->Width; + } + } + } + + else // Need to perform 4 passes on the interlaced images + for (i = 0; i < 4; i++) + for (j = interlacedOffset[i]; j < header.height; + j += interlacedJumps[i], from += header.width) + memcpy(to + header.width * j, from, header.width); + } else { + padlen = swf_width - header.width; + + // here we need to pad the scanline + if (!gft->Image.Interlace) { + if (header.width == img->Width && header.height == img->Height) { + for (i = 0; i < header.height; i++, from += header.width, to += swf_width) { + memcpy(to, from, header.width); + memset(to + header.width, bgcolor, padlen); + } + } else { //small screen + for (i = 0; i < header.height; i++, to += swf_width) { + memset(to, bgcolor, swf_width); + if (i >= img->Top && i < img->Top + img->Height) { + memcpy(to + img->Left, from, img->Width); + from += img->Width; + } + } + } + } else { // Need to perform 4 passes on the interlaced images + for (i = 0; i < 4; i++) + for (j = interlacedOffset[i]; j < header.height; + j += interlacedJumps[i], from += header.width) { + memcpy(to + swf_width * j, from, header.width); + memset(to + swf_width * j, bgcolor, padlen); + } + } + } + swf_SetLosslessBitsIndexed(t, header.width, header.height, imagedata, pal, 256); + + t = swf_InsertTag(t, ST_DEFINESHAPE); + + swf_ShapeNew(&s); + swf_GetMatrix(NULL, &m); + m.sx = 20 * 0x10000; + m.sy = 20 * 0x10000; + fs = swf_ShapeAddBitmapFillStyle(s, &m, id, 0); + + swf_SetU16(t, id + 1); // id + + r.xmin = r.ymin = 0; + r.xmax = header.width * 20; + r.ymax = header.height * 20; + swf_SetRect(t, &r); + + swf_SetShapeHeader(t, s); + + swf_ShapeSetAll(t, s, 0, 0, 0, fs, 0); + swf_ShapeSetLine(t, s, r.xmax, 0); + swf_ShapeSetLine(t, s, 0, r.ymax); + swf_ShapeSetLine(t, s, -r.xmax, 0); + swf_ShapeSetLine(t, s, 0, -r.ymax); + + swf_ShapeSetEnd(t); + + depth = imgidx + 1; + if ((imgidx > 0) && // REMOVEOBJECT2 not needed at frame 1(imgidx==0) + (global.imagecount > 1)) { + // check last frame's disposal method + if ((disposal = getGifDisposalMethod(gft, imgidx - 1)) >= 0) { + switch (disposal) { + case NONE: + // [Replace one full-size, non-transparent frame with another] + t = swf_InsertTag(t, ST_REMOVEOBJECT2); + swf_SetU16(t, depth - 1); + if (VERBOSE(3)) + fprintf(stdout, " [none]\n"); + break; + case DO_NOT_DISPOSE: + // [Any pixels not covered up by the next frame continue to display] + if (VERBOSE(3)) + fprintf(stdout, " [don't dispose]\n"); + break; + case RESTORE_TO_BGCOLOR: + // [The background color or background tile -rather than a previous frame- + // shows through transparent pixels] + t = swf_InsertTag(t, ST_REMOVEOBJECT2); + swf_SetU16(t, depth - 2); + if (VERBOSE(3)) + fprintf(stdout, " [restore to bg color]\n"); + break; + case RESTORE_TO_PREVIOUS: + // [Restores to the state of a previous, undisposed frame] + // ** NOT IMPLEMENTED YET (same as "restore to bgcolor") ** + t = swf_InsertTag(t, ST_REMOVEOBJECT2); + swf_SetU16(t, depth - 1); + if (VERBOSE(3)) + fprintf(stdout, " [restore to previous]\n"); + break; + default: + break; + } + } + } + + swf_SetU16(t, depth); + t = swf_InsertTag(t, ST_PLACEOBJECT2); + + swf_GetMatrix(NULL, &m); + m.tx = (swf->movieSize.xmax - (int) header.width * 20) / 2; + m.ty = (swf->movieSize.ymax - (int) header.height * 20) / 2; + swf_ObjectPlace(t, id + 1, depth, &m, NULL, NULL); + + if ((global.imagecount > 1) && (global.loopcount > 0)) { // 0 means infinite loop + if (imgidx == 0) + SetFrameAction(&t, AS_FIRSTFRAME, global.version); + } + + t = swf_InsertTag(t, ST_SHOWFRAME); + + if (global.imagecount > 1) { // multi-frame GIF? + int framecnt; + delay = getGifDelayTime(gft, imgidx); // delay in 1/100 sec + framecnt = (int) (global.framerate * (delay / 100.0)); + if (framecnt > 1) { + if (VERBOSE(2)) + fprintf(stderr, "at frame %d: pad %d frames(%.3f sec)\n", + imgidx + 1, framecnt, delay / 100.0); + + framecnt -= 1; // already inserted a frame + while (framecnt--) + t = swf_InsertTag(t, ST_SHOWFRAME); + } + if ((imgidx == global.imagecount - 1) &&global.loopcount > 0) { // last frame + as_lastframe = malloc(strlen(AS_LASTFRAME) + 5); // 0-99999 + sprintf(as_lastframe, AS_LASTFRAME, global.loopcount); + SetFrameAction(&t, as_lastframe, global.version); + if (as_lastframe) + free(as_lastframe); + } + } + + free(pal); + free(imagedata); + DGifCloseFile(gft); + + return t; +} + +int CheckInputFile(char *fname, char **realname) +{ + FILE *fi; + char *s = malloc(strlen(fname) + 5); + GifFileType *gft; + + if (!s) + exit(2); + (*realname) = s; + strcpy(s, fname); + + // Check whether file exists (with typical extensions) + + if ((fi = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.gif", fname); + if ((fi = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.GIF", fname); + if ((fi = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.Gif", fname); + if ((fi = fopen(s, "rb")) == NULL) { + fprintf(stderr, "Couldn't open %s!\n", fname); + return -1; + } + } + } + } + fclose(fi); + + if ((gft = DGifOpenFileName(s)) == NULL) { + fprintf(stderr, "%s is not a GIF file!\n", fname); + return -1; + } + + if (global.max_image_width < gft->SWidth) + global.max_image_width = gft->SWidth; + if (global.max_image_height < gft->SHeight) + global.max_image_height = gft->SHeight; + + if (DGifSlurp(gft) != GIF_OK) { + PrintGifError(); + return -1; + } + // After DGifSlurp() call, gft->ImageCount become available + if ((global.imagecount = gft->ImageCount) >1) { + if (global.loopcount < 0) { + global.loopcount = getGifLoopCount(gft); + if (VERBOSE(3)) + fprintf(stderr, "Loops => %d\n", global.loopcount); + } + } + if (VERBOSE(2)) { + U8 i; + fprintf(stderr, "%d x %d, %d images total\n", gft->SWidth, gft->SHeight, gft->ImageCount); + + for (i = 0; i < gft->ImageCount; i++) + fprintf(stderr, "frame: %u, delay: %.3f sec\n", i + 1, getGifDelayTime(gft, i) / 100.0); + } + + DGifCloseFile(gft); + + return 0; +} + +int args_callback_option(char *arg, char *val) +{ + int res = 0; + if (arg[1]) + res = -1; + else + switch (arg[0]) { + case 'l': + if (val) + global.loopcount = atoi(val); + res = 1; + break; + + case 'r': + if (val) + global.framerate = atof(val); + if ((global.framerate < 1.0 / 256) ||(global.framerate >= 256.0)) { + if (VERBOSE(1)) + fprintf(stderr, + "Error: You must specify a valid framerate between 1/256 and 255.\n"); + exit(1); + } + res = 1; + break; + + case 'o': + if (val) + global.outfile = val; + res = 1; + break; + + case 'z': + global.version = 6; + res = 0; + break; + + case 'C': + global.do_cgi = 1; + break; + + case 'v': + if (val) + global.verbose = atoi(val); + res = 1; + break; + + case 'X': + if (val) + global.force_width = atoi(val); + res = 1; + break; + + case 'Y': + if (val) + global.force_height = atoi(val); + res = 1; + break; + + case 'V': + printf("gif2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + + default: + res = -1; + break; + } + + if (res < 0) { + if (VERBOSE(1)) + fprintf(stderr, "Unknown option: -%s\n", arg); + exit(1); + return 0; + } + return res; +} + +static struct options_t options[] = { +{"r", "rate"}, +{"o", "output"}, +{"z", "zlib"}, +{"l", "loop"}, +{"X", "pixel"}, +{"Y", "pixel"}, +{"v", "verbose"}, +{"C", "cgi"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_longoption(char *name, char *val) +{ + return args_long2shortoption(options, name, val); +} + +int args_callback_command(char *arg, char *next) // actually used as filename +{ + char *s; + if (CheckInputFile(arg, &s) < 0) { + if (VERBOSE(1)) + fprintf(stderr, "Error opening input file: %s\n", arg); + free(s); + + } else { + image[global.nfiles].filename = s; + global.nfiles++; + if (global.nfiles >= MAX_INPUT_FILES) { + if (VERBOSE(1)) + fprintf(stderr, "Error: Too many input files.\n"); + exit(1); + } + } + + return 0; +} + +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-X width] [-Y height] [-o file.swf] [-r rate] file1.gif [file2.gif ...]\n", name); + printf("\n"); + printf("-r , --rate Set movie framerate (frames per second)\n"); + printf("-o , --output Set name for SWF output file.\n"); + printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); + printf("-l , --loop Set loop count. (default: 0 [=infinite loop])\n"); + printf("-X , --pixel Force movie width to (default: autodetect)\n"); + printf("-Y , --pixel Force movie height to (default: autodetect)\n"); + printf("-v , --verbose Set verbose level (0=quiet, 1=default, 2=debug)\n"); + printf("-C , --cgi For use as CGI- prepend http header, write to stdout\n"); + printf("-V , --version Print version information and exit\n"); + printf("\n"); +} + +int main(int argc, char **argv) +{ + SWF swf; + TAG *t; + + memset(&global, 0x00, sizeof(global)); + + global.framerate = 1.0; + global.verbose = 1; + global.version = 5; + global.loopcount = -1; + + processargs(argc, argv); + + if (global.nfiles <= 0) { + fprintf(stderr, "No gif files found in arguments\n"); + return 1; + } + + if (VERBOSE(2)) + fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); + + if (global.imagecount > 1) // multi-frame GIF? + if (global.framerate == 1.0) // user not specified '-r' option? + global.framerate = 10.0; + + t = MovieStart(&swf, global.framerate, + global.force_width ? global.force_width : global.max_image_width, + global.force_height ? global.force_height : global.max_image_height); + { + int i, j; + for (i = 0; i < global.nfiles; i++) { + if (VERBOSE(3)) + fprintf(stderr, "[%03i] %s\n", i, image[i].filename); + t = MovieAddFrame(&swf, t, image[i].filename, (i * 2) + 1, 0); + for (j = 2; j <= global.imagecount; j++) + t = MovieAddFrame(&swf, t, image[i].filename, (j * 2) - 1, j - 1); + free(image[i].filename); + } + } + + MovieFinish(&swf, t, global.outfile); + + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf new file mode 100644 index 000000000..5978542d3 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 new file mode 100644 index 000000000..3da21bba8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 @@ -0,0 +1,62 @@ +.TH jpeg2swf "1" "August 2009" "jpeg2swf" "swftools" +.SH NAME +jpeg2swf - Converts jpeg images to SWF. + +.SH Synopsis +.B jpeg2swf [-options [value]] imagefiles[.jpg]|[.jpeg] [...] + +.SH DESCRIPTION +This tool converts jpeg image files into an SWF animation. It takes any +number of input pictures, and converts them to SWF one-by-one, where every +converted picture is a seperate frame in the target SWF. + +.SH OPTIONS +.TP +\fB\-o\fR, \fB\-\-output\fR \fIoutputfile\fR + Explicitly specify output file. (Otherwise, output will go to stdout / output.swf) +.TP +\fB\-q\fR, \fB\-\-quality\fR \fIquality\fR + Set compression quality (1-100, 1=worst, 100=best). + This option can be set independently for each image. +.TP +\fB\-r\fR, \fB\-\-rate\fR \fIframerate\fR + Set movie framerate (frames per second) +.TP +\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR + Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be + smaller, but not playable in Flash Plugins of Version 5 and below. +.TP +\fB\-M\fR, \fB\-\-mx\fR + Use Flash MX H.263 compression (use for correlated images) +.TP +\fB\-x\fR, \fB\-\-xoffset\fR \fIoffset\fR + horizontally offset images by \fIoffset\fR +.TP +\fB\-y\fR, \fB\-\-yoffset\fR \fIoffset\fR + vertically offset images by \fIoffset\fR +.TP +\fB\-X\fR, \fB\-\-width\fR \fIwidth\fR + Force movie width to \fIwidth\fR (default: autodetect) +.TP +\fB\-Y\fR, \fB\-\-height\fR \fIheight\fR + Force movie height to \fIheight\fR (default: autodetect) +.TP +\fB\-T\fR, \fB\-\-flashversion\fR \fIversion\fR + Set flash file version to \fIversion\fR +.TP +\fB\-v\fR, \fB\-\-verbose\fR \fIlevel\fR + Set verbose level to \fIlevel\fR (0=quiet, 1=default, 2=debug) +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version information and exit +.TP +\fB\-f\fR, \fB\-\-fit-to-movie\fR + Fit images to movie size +.TP +\fB\-e\fR, \fB\-\-export\fR \fIassetname\fR + Make importable as asset with \fIassetname\fR +.SH AUTHORS + +Rainer Böhme +.TP +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c new file mode 100644 index 000000000..441745004 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c @@ -0,0 +1,646 @@ +/* jpeg2swf.c + + JPEG to SWF converter tool + + Part of the swftools package. + + Copyright (c) 2001 Rainer Böhme + Copyright (c) 2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" // not really a header ;-) + +#define MAX_INPUT_FILES 1024 +#define VERBOSE(x) (global.verbose>=x) + +static struct { + int quality; + float framerate; + int max_image_width; + int max_image_height; + int force_width; + int force_height; + int nfiles; + int verbose; + char *outfile; + int mx; + int next_id; + char *asset_name; + int version; + int fit_to_movie; + float scale; +} global; + +static int custom_move=0; +static int move_x=0; +static int move_y=0; +static int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; +static int custom_clip = 0; + +typedef struct _image { + char *filename; + int quality; + int width; + int height; +} image_t; +image_t image[MAX_INPUT_FILES]; + +VIDEOSTREAM stream; + +TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) +{ + TAG *t; + RGBA rgb; + + memset(swf, 0x00, sizeof(SWF)); + + swf->fileVersion = global.version; + swf->frameRate = (int)(256.0 * framerate); + + if(custom_clip) { + swf->movieSize.xmin = clip_x1 * 20; + swf->movieSize.ymin = clip_y1 * 20; + swf->movieSize.xmax = clip_x2 * 20; + swf->movieSize.ymax = clip_y2 * 20; + } else { + swf->movieSize.xmin = 0; + swf->movieSize.ymin = 0; + swf->movieSize.xmax = swf->movieSize.xmin + dx * 20; + swf->movieSize.ymax = swf->movieSize.ymin + dy * 20; + } + + t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); + + rgb.r = rgb.g = rgb.b = rgb.a = 0x00; + swf_SetRGB(t, &rgb); + + if (global.mx) { + t = swf_InsertTag(t, ST_DEFINEVIDEOSTREAM); + swf_SetU16(t, 0xf00d); + swf_SetVideoStreamDefine(t, &stream, 65535, dx, dy); + } else if (global.asset_name) { + t = swf_InsertTag(t, ST_DEFINESPRITE); + swf_SetU16(t, 1); + swf_SetU16(t, global.next_id++); + } + + return t; +} + +int MovieFinish(SWF * swf, TAG * t, char *sname) +{ + int handle, so = fileno(stdout); + + if (global.asset_name) { + SWFPLACEOBJECT obj; + + t = swf_InsertTag(t, ST_END); + t = swf_InsertTag(t, ST_EXPORTASSETS); + swf_SetU16(t, 1); + swf_SetU16(t, 1); + swf_SetString(t, global.asset_name); + + t = swf_InsertTag(t, ST_PLACEOBJECT2); + swf_GetPlaceObject(0, &obj); + obj.depth = 1; + obj.id = 1; + swf_SetPlaceObject(t, &obj); + + t = swf_InsertTag(t, ST_SHOWFRAME); + } + + t = swf_InsertTag(t, ST_END); + + if ((!isatty(so)) && (!sname)) + handle = so; + else { + if (!sname) + sname = "output.swf"; + handle = open(sname, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); + } + if(handle<0 && sname) { + perror(sname); + } + if (swf_WriteSWF(handle, swf)<0) + fprintf(stderr, "Unable to write output file: %s\n", sname); + + if (handle != so) + close(handle); + + swf_FreeTags(swf); + return 0; +} + +int getJPEG(char*filename, int* width, int* height, RGBA**pic2) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_source_mgr mgr; + int x,y; + FILE*f; + RGBA*pic,*js; + U8*buf; + + if ((f=fopen(filename,"rb"))==NULL) { + fprintf(stderr, "rfxswf: file open error\n"); + return 0; + } + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + + pic = malloc(cinfo.output_width*cinfo.output_height*sizeof(RGBA)); + buf = malloc(cinfo.output_width*4); + memset(pic, 255, cinfo.output_width*cinfo.output_height*sizeof(RGBA)); + js = pic; + + *width = cinfo.output_width; + *height = cinfo.output_height; + + for (y=0;y>8); + js[x].g = y - ((88*(u-128)+183*(v-128))>>8); + js[x].b = y + ((455 * (u-128))>>8); + } + } + else if(cinfo.out_color_space == JCS_CMYK) + { + for(x=0;x>8); + js[x].g = white - ((buf[x*4+1]*white)>>8); + js[x].b = white - ((buf[x*4+2]*white)>>8); + } + } + js += cinfo.output_width; + } + + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + + free(buf); + *pic2 = pic; + return 1; +} + + +int frame = 0; +TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int quality, + int width, int height) +{ + SHAPE *s; + SRECT r; + MATRIX m; + int fs; + int movie_width = swf->movieSize.xmax - swf->movieSize.xmin; + int movie_height = swf->movieSize.ymax - swf->movieSize.ymin; + + if(global.mx) { + int sizex, sizey; + RGBA * pic2; + SWFPLACEOBJECT obj; + int quant=0; + getJPEG(sname, &sizex, &sizey, &pic2); + if(sizex != stream.owidth || sizey != stream.oheight) { + fprintf(stderr, "All images must have the same dimensions if using -m!"); + exit(1); + } + + t = swf_InsertTag(t, ST_VIDEOFRAME); + swf_SetU16(t, 0xf00d); + quant = 1+(30-(30*quality)/100); + if(!(frame%20)) { + swf_SetVideoStreamIFrame(t, &stream, pic2, quant); + } else { + swf_SetVideoStreamPFrame(t, &stream, pic2, quant); + } + + t = swf_InsertTag(t, ST_PLACEOBJECT2); + swf_GetPlaceObject(0, &obj); + if(frame==0) { + obj.depth = 1; + obj.id = 0xf00d; + } else { + obj.depth = 1; + obj.move = 1; + obj.ratio = frame; + } + swf_SetPlaceObject(t,&obj); + + t = swf_InsertTag(t, ST_SHOWFRAME); + } else { + t = swf_InsertTag(t, ST_DEFINEBITSJPEG2); + swf_SetU16(t, global.next_id); // id + swf_SetJPEGBits(t,sname,quality); + + t = swf_InsertTag(t, ST_DEFINESHAPE); + swf_ShapeNew(&s); + swf_GetMatrix(NULL, &m); + if (global.fit_to_movie) { + m.sx = 0x10000 * movie_width / width; + m.sy = 0x10000 * movie_height / height; + width = movie_width / 20; + height = movie_height / 20; + } else { + m.sx = 20 * 0x10000; + m.sy = 20 * 0x10000; + } + m.tx = 0; + m.ty = 0; + fs = swf_ShapeAddBitmapFillStyle(s, &m, global.next_id, 1); + global.next_id++; + swf_SetU16(t, global.next_id); // id + r.xmin = 0; + r.ymin = 0; + r.xmax = r.xmin + width * 20; + r.ymax = r.ymin + height * 20; + swf_SetRect(t, &r); + swf_SetShapeHeader(t, s); + swf_ShapeSetAll(t, s, r.xmin, r.ymin, 0, fs, 0); + swf_ShapeSetLine(t, s, r.xmax - r.xmin, 0); + swf_ShapeSetLine(t, s, 0, r.ymax - r.ymin); + swf_ShapeSetLine(t, s, -r.xmax + r.xmin, 0); + swf_ShapeSetLine(t, s, 0, -r.ymax + r.ymin); + swf_ShapeSetEnd(t); + + if(frame) { + t = swf_InsertTag(t, ST_REMOVEOBJECT2); + swf_SetU16(t, 1); // depth + } + + t = swf_InsertTag(t, ST_PLACEOBJECT2); + swf_GetMatrix(NULL, &m); + m.sx = (int)(0x10000 * global.scale); + m.sy = (int)(0x10000 * global.scale); + + if(custom_move) { + m.tx = move_x*20; + m.ty = move_y*20; + } else { + m.tx = (movie_width - (width * global.scale * 20)) / 2; + m.ty = (movie_height - (height * global.scale * 20)) / 2; + } + swf_ObjectPlace(t, global.next_id, 1, &m, NULL, NULL); + global.next_id++; + t = swf_InsertTag(t, ST_SHOWFRAME); + } + frame++; + + return t; +} + +int CheckInputFile(image_t* i, char *fname, char **realname) +{ + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + FILE *f; + char *s = malloc(strlen(fname) + 5); + int width, height; + + if (!s) + exit(2); + (*realname) = s; + strcpy(s, fname); + + // Check whether file exists (with typical extensions) + + if ((f = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.jpg", fname); + if ((f = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.jpeg", fname); + if ((f = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.JPG", fname); + if ((f = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.JPEG", fname); + if ((f = fopen(s, "rb")) == NULL) + return -1; + } + } + } + } + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + + width = cinfo.image_width; + height = cinfo.image_height; + + i->width = width; + i->height = height; + + // Get image dimensions + + if (global.max_image_width < width) + global.max_image_width = width; + if (global.max_image_height < height) + global.max_image_height = height; + + jpeg_destroy_decompress(&cinfo); + fclose(f); + + return 0; +} + +int args_callback_option(char *arg, char *val) +{ + int res = 0; + if (arg[1]) + res = -1; + else + switch (arg[0]) { + case 'q': + if (val) + global.quality = atoi(val); + if ((global.quality < 1) ||(global.quality > 100)) { + if (VERBOSE(1)) + fprintf(stderr, + "Error: You must specify a valid quality between 1 and 100.\n"); + exit(1); + } + res = 1; + break; + + case 'r': + if (val) + global.framerate = atof(val); + if ((global.framerate < 1.0/256) || (global.framerate >= 256.0)) { + if (VERBOSE(1)) + fprintf(stderr, + "Error: You must specify a valid framerate between 1 and 10000.\n"); + exit(1); + } + res = 1; + break; + + case 'o': + if (val) + global.outfile = val; + res = 1; + break; + + case 'v': + global.verbose++; + res = 0; + break; + +/* case 'q': + global.verbose--; + if(global.verbose<0) + global.verbose = 0; + res = 0; + break;*/ + + case 'X': + if (val) + global.force_width = atoi(val); + res = 1; + break; + + case 'z': + global.version = 6; + return 0; + + case 'Y': + if (val) + global.force_height = atoi(val); + res = 1; + break; + + case 'V': + printf("jpeg2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + + case 'e': + if (val) + global.asset_name = val; + res = 1; + break; + + case 'T': + global.version = atoi(val); + res = 1; + break; + + case 'f': + global.fit_to_movie = 1; + res = 0; + break; + + case 'c': { + char*s = strdup(val); + char*x1 = strtok(s, ":"); + char*y1 = strtok(0, ":"); + char*x2 = strtok(0, ":"); + char*y2 = strtok(0, ":"); + if(!(x1 && y1 && x2 && y2)) { + fprintf(stderr, "-m option requires four arguments, :::\n"); + exit(1); + } + custom_clip = 1; + clip_x1 = atoi(x1); + clip_y1 = atoi(y1); + clip_x2 = atoi(x2); + clip_y2 = atoi(y2); + free(s); + + res = 1; + break; + } + + case 'M': { + global.mx = 1; + res = 1; + break; + } + + case 'm': { + char*s = strdup(val); + char*c = strchr(s, ':'); + if(!c) { + fprintf(stderr, "-m option requires two arguments, :\n"); + exit(1); + } + *c = 0; + custom_move = 1; + move_x = atoi(val); + move_y = atoi(c+1); + free(s); + + res = 1; + break; + } + + case 's': { + global.scale = atof(val)/100; + res = 1; + break; + } + + default: + res = -1; + break; + } + + if (res < 0) { + if (VERBOSE(1)) + fprintf(stderr, "Unknown option: -%s\n", arg); + exit(1); + return 0; + } + return res; +} + +static struct options_t options[] = { +{"o", "output"}, +{"q", "quality"}, +{"r", "rate"}, +{"z", "zlib"}, +{"M", "mx"}, +{"x", "xoffset"}, +{"y", "yoffset"}, +{"X", "width"}, +{"Y", "height"}, +{"T", "flashversion"}, +{"v", "verbose"}, +{"V", "version"}, +{"f", "fit-to-movie"}, +{"e", "export"}, +{0,0} +}; + +int args_callback_longoption(char *name, char *val) +{ + return args_long2shortoption(options, name, val); +} + +int args_callback_command(char *arg, char *next) // actually used as filename +{ + char *s; + image_t* i = &image[global.nfiles]; + if (CheckInputFile(i, arg, &s) < 0) { + if (VERBOSE(1)) + fprintf(stderr, "Unable to open input file: %s\n", arg); + free(s); + } else { + i->filename = s; + i->quality = global.quality; + global.nfiles++; + if (global.nfiles >= MAX_INPUT_FILES) { + if (VERBOSE(1)) + fprintf(stderr, "Error: Too many input files.\n"); + exit(1); + } + } + return 0; +} + +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-options [value]] imagefiles[.jpg]|[.jpeg] [...]\n", name); + printf("\n"); + printf("-o , --output Explicitly specify output file. (otherwise, output.swf will be used)\n"); + printf("-q , --quality Set compression quality (1-100, 1=worst, 100=best)\n"); + printf("-r , --rate Set movie framerate (frames per second)\n"); + printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); + printf("-M , --mx Use Flash MX H.263 compression (use for correlated images)\n"); + printf("-x , --xoffset horizontally offset images by \n"); + printf("-y , --yoffset vertically offset images by \n"); + printf("-X , --width Force movie width to (default: autodetect)\n"); + printf("-Y , --height Force movie height to (default: autodetect)\n"); + printf("-T , --flashversion Set flash file version to \n"); + printf("-v , --verbose Set verbose level to (0=quiet, 1=default, 2=debug)\n"); + printf("-V , --version Print version information and exit\n"); + printf("-f , --fit-to-movie Fit images to movie size\n"); + printf("-e , --export Make importable as asset with \n"); + printf("\n"); +} + + +int main(int argc, char **argv) +{ + SWF swf; + TAG *t; + + memset(&global, 0x00, sizeof(global)); + + global.quality = 60; + global.framerate = 1.0; + global.verbose = 1; + global.version = 4; + global.asset_name = NULL; + global.next_id = 1; + global.fit_to_movie = 0; + global.scale = 1.0; + + processargs(argc, argv); + + if (VERBOSE(2)) + fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); + + t = MovieStart(&swf, global.framerate, + global.force_width ? global.force_width : (int)(global.max_image_width*global.scale), + global.force_height ? global.force_height : (int)(global.max_image_height*global.scale)); + + { + int i; + for (i = 0; i < global.nfiles; i++) { + if (VERBOSE(3)) + fprintf(stderr, "[%03i] %s (%i%%)\n", i, + image[i].filename, image[i].quality); + t = MovieAddFrame(&swf, t, image[i].filename, image[i].quality, + image[i].width, image[i].height); + free(image[i].filename); + } + } + + MovieFinish(&swf, t, global.outfile); + + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/parser.h b/fluidbook/tools/swftools-special-swfdump/src/parser.h new file mode 100644 index 000000000..348468664 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/parser.h @@ -0,0 +1,46 @@ +/* parser.h + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __parser_h__ +#define __parser_h__ + +enum type_t { + TWIP=0, + NUMBER=1, + COMMAND=2, + STRING=3, + ASSIGNMENT=4, + IDENTIFIER=5, + RAWDATA=6, + END=7 +}; + +extern char*type_names[]; + +struct token_t { + enum type_t type; + int text_pos; + char* text; + int line; + int column; +}; + +extern struct token_t* generateTokens(char*filename); +extern void freeTokens(struct token_t*); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/parser.lex b/fluidbook/tools/swftools-special-swfdump/src/parser.lex new file mode 100644 index 000000000..2d1d3169c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/parser.lex @@ -0,0 +1,332 @@ +%{ + +#include +#include +#include +#include "../lib/q.h" +#include "parser.h" +#include "../lib/utf8.h" + +//RVALUE {NUMBER}|{PERCENT}|{NAME}|\"{STRING}\"|{DIM} +//. {printf("%s\n", yytext);} +// %x: exclusive, %s: inclusive +char*type_names[] = {"twip","number","command","string","assignment","identifier","label","end"}; +static int line=1; +static int column=1; + +mem_t strings; +mem_t tokens; + +static void count(char*text, int len, int condition) +{ + int t; + for(t=0;tstr; (p=strchr(p1, '\\')); p1 = p+1) + { + int nr=2; + int new=1; + switch(p[1]) + { + case '\\': p[0] = '\\'; break; + case '"': p[0] = '"'; break; + case 'b': p[0] = '\b'; break; + case 'f': p[0] = '\f'; break; + case 'n': p[0] = '\n'; break; + case 'r': p[0] = '\r'; break; + case 't': p[0] = '\t'; break; + case 'x': case 'u': { + int max=4; + int num=0; + char*utf8; + char bracket = 0; + if(p[1] == 'u') + max = 6; + if(p[2] == '{') { + bracket = 1;nr++;max++; + } + while(strchr("0123456789abcdefABCDEF", p[nr]) && (bracket || nr < max)) { + num <<= 4; + if(p[nr]>='0' && p[nr]<='9') num |= p[nr] - '0'; + if(p[nr]>='a' && p[nr]<='f') num |= p[nr] - 'a' + 10; + if(p[nr]>='A' && p[nr]<='F') num |= p[nr] - 'A' + 10; + nr++; + } + if(bracket && p[nr]=='}') { + bracket = 0; + nr++; + } + utf8 = getUTF8(num); + new = strlen(utf8); + memcpy(p, utf8, new); // do not copy the terminating zero + break; + } + default: + continue; + } + tmp->len -= (nr-new); + { + int t; + char*to=p+new,*from=p+nr; + while(*from) { + *to = *from; + to++; + from++; + } + } + } +} + +static void store(enum type_t type, int line, int column, char*text, int length) +{ + struct token_t token; + string_t tmp; + token.type = type; + token.line = line; + token.column = column; + //printf("->%d(%s) %s\n", type, type_names[type], text);fflush(stdout); + + token.text_pos = 0; + token.text = 0; + switch(type) { + case END: + string_set2(&tmp, "", 0); + token.text_pos = mem_putstring(&strings, tmp); + break; + case STRING: + string_set2(&tmp, text+1, length-2); + unescapeString(&tmp); + token.text_pos = mem_putstring(&strings, tmp); + break; + case TWIP: + case NUMBER: + case IDENTIFIER: + string_set2(&tmp, text, length); + if(prefix) { + //strcat + token.text_pos = mem_put(&strings, prefix, strlen(prefix)); + mem_putstring(&strings, tmp); + } else { + token.text_pos = mem_putstring(&strings, tmp); + } + prefix = 0; + break; + case RAWDATA: + string_set2(&tmp, text+1/*:*/, length-5/*.end*/); + token.text_pos = mem_putstring(&strings, tmp); + break; + case COMMAND: + string_set2(&tmp, text+1, length-1); + token.text_pos = mem_putstring(&strings, tmp); + break; + case ASSIGNMENT: { + char*x = &text[length-1]; + if(x[-1] == '-' || x[-1] == '+') + x--; + do{x--;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); + x++; //first space + string_set2(&tmp, text, x-text); + token.text_pos = mem_putstring(&strings, tmp); + /*char*y,*x = strchr(text, '='); + if(!x) exit(1); + y=x; + do{y--;} while(*y==32 || *y==10 || *y==13 || *y=='\t'); + do{x++;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); + token.text1 = (char*)put(&strings, text, y-text + 1, 1); + token.text2 = (char*)put(&strings, x, length-(x-text), 1);*/ + } break; + } + + mem_put(&tokens, &token, sizeof(struct token_t)); + prefix = 0; +} + +#define MAX_INCLUDE_DEPTH 16 +static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; +static int line_stack[MAX_INCLUDE_DEPTH]; +static int column_stack[MAX_INCLUDE_DEPTH]; +static int include_stack_ptr = 0; + +static void handleInclude(char*text, int len) +{ + text+=9;len-=9; + while(len >=1 && (text[0] == ' ' || text[0] == '\t')) { + text++;len--; + } + while(len >= 1 && + (text[len-1] == ' ' || + text[len-1] == '\r' || + text[len-1] == '\n')) { + len--; + } + if(len >= 2 && text[0] == '"' && text[len-1] == '"') { + text++; len-=2; + } + text[len] = 0; + if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { + fprintf( stderr, "Includes nested too deeply" ); + exit( 1 ); + } + include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; + line_stack[include_stack_ptr] = line; + column_stack[include_stack_ptr] = column; + include_stack_ptr++; + yyin = fopen(text, "rb"); + if (!yyin) { + fprintf(stderr, "Couldn't open %s\n", text); + exit(1); + } + yy_switch_to_buffer(yy_create_buffer( yyin, YY_BUF_SIZE ) ); + +#ifdef INITIAL + BEGIN(INITIAL); +#else + // best guess + BEGIN(0); +#endif +} + +#define c() {count(yytext, yyleng, YY_START);} +#define s(type) {store(type, line, column, yytext, yyleng);} +%} + +%s R +%x BINARY + +NAME [a-zA-Z_./](-*[a-zA-Z0-9_./])* +TWIP (-?[0-9]+(\.([0-9]([05])?)?)?) +NUMBER -?[0-9]+(\.[0-9]*)? +PERCENT {NUMBER}% +STRING (\\.|[^\\"\n])* +S [ \n\r\t] +RVALUE \"{STRING}\"|([^ \n\r\t]+) + +%% + +\] {c();BEGIN(0);} +. {c();} +\n {c();} +{TWIP}/[ \n\r\t] {s(TWIP);c();BEGIN(0);} +{NUMBER}/[ \n\r\t] {s(NUMBER);c();BEGIN(0);} +^#[^\n]*\n {c();} +[ \t\r]#[^\n]*\n {c();} +\"{STRING}\" {s(STRING);c();BEGIN(0);} +\"{STRING}$ {c();printf("unterminated string in line %d: %s\n", line, yytext);exit(1);yyterminate();} +{NAME}{S}*\+= {s(ASSIGNMENT);prefix="";c();BEGIN(R);} +{NAME}{S}*-= {s(ASSIGNMENT);prefix="";c();BEGIN(R);} +{NAME}{S}*= {s(ASSIGNMENT);c();BEGIN(R);} +{ /* values which appear only on the right-hand side of assignments, like: x=50% */ + [^ :\n\t\r]* {s(IDENTIFIER);c();BEGIN(0);} +} +\.include{S}.*\n {handleInclude(yytext, yyleng);} +\.{NAME} {s(COMMAND);c();} +:([^.]|\.[^e]|\.e[^n]|\.en[^d]|\.end[^ \n\r\t]|[ \n\r\t])*\.end {s(RAWDATA);c();} +{NAME} {s(IDENTIFIER);c();} +"[" {c();BEGIN(BINARY);} +{S} {c();} +. {char c,c1=yytext[0]; + printf("Syntax error in line %d, %d: %s", line, column, yytext); + while(1) { + c=input(); + if(c=='\n' || c==EOF) + break; + printf("%c", c); + } + if(c1>='0' && c1<='9') + printf(" (identifiers must not start with a digit)"); + printf("\n"); + exit(1); + yyterminate(); + } +<> {c(); + if ( --include_stack_ptr < 0 ) { + s(END); + yyterminate(); + } else { + yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_switch_to_buffer( + include_stack[include_stack_ptr] ); + column = column_stack[include_stack_ptr]; + line = line_stack[include_stack_ptr]; + } + } + +%% + +int yywrap() +{ + return 1; +} + +void freeTokens(struct token_t*file) +{ + mem_clear(&strings); + mem_clear(&tokens); +} + +struct token_t* generateTokens(char*filename) +{ + FILE*fi; + int t; + struct token_t*result; + int num; + + if(!filename) + return 0; + + if(!strcmp(filename,"-")) + fi = stdin; + else + fi = fopen(filename, "rb"); + + if(!fi) { + printf("Couldn't find file %s\n", filename); + return 0; + } + yyin = fi; + + mem_init(&strings); + mem_init(&tokens); + mem_put(&strings, &t, 1); //hack- make all valid strings start at position >0 + + line=1; + column=1; + + yylex(); +#ifdef YY_CURRENT_BUFFER + // some newer flex versions require it like this: + yy_delete_buffer(YY_CURRENT_BUFFER); +#else + yy_delete_buffer(yy_current_buffer); +#endif + + result = (struct token_t*)tokens.buffer; + num = tokens.pos/sizeof(struct token_t); + + for(t=0;t 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int yylineno; + +int yylineno = 1; + +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 21 +#define YY_END_OF_BUFFER 22 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[111] = + { 0, + 0, 0, 13, 13, 0, 0, 22, 20, 19, 19, + 20, 20, 17, 17, 20, 20, 18, 20, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 3, 1, 0, + 0, 9, 8, 0, 0, 0, 0, 0, 15, 17, + 12, 15, 4, 0, 0, 0, 0, 0, 6, 13, + 13, 8, 13, 13, 13, 13, 13, 13, 12, 13, + 13, 13, 0, 7, 0, 10, 0, 11, 0, 15, + 15, 0, 0, 10, 13, 11, 13, 13, 13, 13, + 0, 15, 0, 0, 0, 13, 13, 13, 13, 15, + 5, 16, 13, 15, 13, 15, 13, 15, 13, 0, + + 0, 0, 14, 0, 0, 12, 14, 10, 11, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 5, 1, 1, 1, 1, 1, + 1, 1, 6, 1, 7, 8, 9, 10, 11, 11, + 11, 11, 10, 11, 11, 11, 11, 12, 1, 1, + 13, 1, 1, 1, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 15, 16, 1, 9, 1, 9, 9, 17, 18, + + 19, 9, 9, 9, 20, 9, 9, 21, 9, 22, + 9, 9, 9, 9, 9, 9, 23, 9, 9, 9, + 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[24] = + { 0, + 1, 2, 2, 1, 1, 3, 3, 3, 3, 3, + 3, 4, 3, 1, 1, 1, 3, 3, 3, 3, + 3, 3, 3 + } ; + +static yyconst flex_int16_t yy_base[122] = + { 0, + 0, 230, 23, 229, 44, 45, 233, 395, 227, 395, + 47, 42, 61, 83, 95, 85, 395, 228, 0, 105, + 44, 120, 136, 158, 0, 54, 395, 395, 395, 227, + 96, 395, 395, 225, 0, 168, 214, 180, 192, 204, + 395, 216, 395, 237, 110, 144, 207, 222, 395, 0, + 247, 0, 89, 0, 211, 261, 274, 0, 0, 199, + 65, 92, 217, 395, 203, 395, 202, 395, 296, 192, + 93, 48, 191, 0, 199, 0, 308, 0, 191, 140, + 191, 141, 193, 162, 184, 187, 159, 168, 320, 150, + 395, 182, 126, 170, 114, 97, 95, 187, 194, 330, + + 99, 342, 0, 164, 188, 74, 395, 62, 46, 395, + 355, 359, 362, 365, 369, 373, 376, 380, 384, 387, + 390 + } ; + +static yyconst flex_int16_t yy_def[122] = + { 0, + 110, 1, 110, 3, 111, 111, 110, 110, 110, 110, + 112, 110, 110, 113, 110, 114, 110, 115, 116, 117, + 116, 110, 22, 116, 116, 118, 110, 110, 110, 119, + 112, 110, 110, 112, 15, 110, 110, 113, 120, 113, + 110, 120, 110, 110, 114, 114, 114, 115, 110, 116, + 117, 116, 117, 24, 116, 23, 110, 23, 116, 57, + 24, 118, 119, 110, 110, 110, 38, 110, 120, 42, + 42, 44, 114, 116, 56, 116, 57, 57, 57, 24, + 69, 42, 72, 83, 114, 77, 57, 24, 116, 42, + 110, 114, 57, 42, 57, 42, 57, 42, 57, 121, + + 121, 121, 36, 121, 121, 121, 110, 121, 121, 0, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110 + } ; + +static yyconst flex_int16_t yy_nxt[419] = + { 0, + 8, 9, 10, 11, 8, 8, 12, 13, 14, 15, + 15, 16, 8, 17, 8, 8, 14, 14, 14, 14, + 14, 14, 14, 19, 9, 10, 20, 19, 19, 21, + 22, 23, 24, 24, 16, 19, 25, 19, 19, 23, + 23, 23, 23, 23, 23, 23, 28, 28, 107, 32, + 33, 35, 35, 54, 54, 48, 49, 83, 84, 29, + 29, 34, 36, 36, 107, 48, 37, 38, 39, 39, + 40, 40, 50, 41, 80, 80, 107, 39, 39, 39, + 42, 39, 39, 39, 36, 36, 46, 46, 37, 38, + 31, 110, 47, 48, 49, 41, 43, 43, 32, 33, + + 31, 107, 44, 48, 35, 35, 31, 32, 52, 82, + 34, 46, 46, 99, 70, 98, 31, 47, 70, 53, + 50, 36, 36, 50, 50, 55, 56, 57, 57, 58, + 58, 97, 59, 50, 50, 50, 57, 57, 57, 60, + 57, 57, 57, 58, 58, 46, 46, 50, 95, 88, + 89, 47, 58, 58, 58, 58, 58, 58, 58, 43, + 43, 90, 70, 91, 91, 61, 107, 54, 54, 36, + 36, 70, 94, 37, 65, 50, 108, 89, 89, 93, + 41, 110, 110, 110, 110, 110, 67, 96, 100, 100, + 107, 70, 68, 36, 36, 100, 100, 37, 69, 50, + + 109, 92, 84, 110, 41, 36, 36, 87, 70, 37, + 38, 50, 85, 70, 110, 68, 41, 36, 36, 64, + 79, 37, 69, 74, 49, 73, 66, 110, 41, 64, + 49, 30, 110, 26, 18, 110, 110, 71, 43, 43, + 110, 110, 110, 110, 110, 110, 72, 72, 31, 32, + 52, 110, 110, 110, 110, 110, 110, 110, 31, 110, + 110, 53, 110, 110, 110, 110, 50, 75, 110, 110, + 110, 110, 110, 76, 50, 36, 36, 50, 50, 55, + 77, 78, 78, 78, 78, 110, 59, 50, 50, 50, + 78, 78, 78, 78, 78, 78, 78, 110, 110, 110, + + 110, 110, 81, 110, 110, 110, 110, 110, 68, 110, + 110, 110, 110, 50, 86, 110, 110, 110, 110, 110, + 76, 91, 91, 110, 110, 110, 110, 110, 110, 89, + 89, 102, 103, 110, 110, 104, 105, 110, 110, 110, + 110, 110, 106, 102, 103, 110, 110, 104, 105, 110, + 110, 110, 110, 110, 106, 27, 27, 27, 27, 31, + 31, 31, 31, 40, 40, 45, 45, 45, 45, 48, + 48, 48, 48, 50, 110, 50, 51, 51, 51, 51, + 62, 62, 62, 62, 63, 63, 63, 63, 70, 70, + 101, 101, 101, 101, 7, 110, 110, 110, 110, 110, + + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110 + } ; + +static yyconst flex_int16_t yy_chk[419] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 5, 6, 109, 11, + 11, 12, 12, 21, 21, 26, 26, 72, 72, 5, + 6, 11, 13, 13, 108, 26, 13, 13, 13, 13, + 13, 13, 61, 13, 61, 61, 106, 13, 13, 13, + 13, 13, 13, 13, 14, 14, 16, 16, 14, 14, + 53, 53, 16, 62, 62, 14, 15, 15, 31, 31, + + 53, 101, 15, 62, 15, 15, 20, 20, 20, 71, + 31, 45, 45, 97, 71, 96, 20, 45, 96, 20, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 95, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 23, 23, 46, 46, 80, 93, 80, + 80, 46, 23, 23, 23, 23, 23, 23, 23, 24, + 24, 82, 82, 84, 84, 24, 104, 24, 24, 36, + 36, 90, 90, 36, 36, 88, 104, 88, 88, 87, + 36, 38, 38, 92, 92, 38, 38, 94, 98, 98, + 105, 94, 38, 39, 39, 99, 99, 39, 39, 86, + + 105, 85, 83, 81, 39, 40, 40, 79, 98, 40, + 40, 75, 73, 70, 67, 65, 40, 42, 42, 63, + 60, 42, 42, 55, 48, 47, 37, 34, 42, 30, + 18, 9, 7, 4, 2, 0, 0, 42, 44, 44, + 0, 0, 0, 0, 0, 0, 44, 44, 51, 51, + 51, 0, 0, 0, 0, 0, 0, 0, 51, 0, + 0, 51, 56, 56, 0, 0, 56, 56, 0, 0, + 0, 0, 0, 56, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 0, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 69, 69, 0, + + 0, 69, 69, 0, 0, 0, 0, 0, 69, 77, + 77, 0, 0, 77, 77, 0, 0, 0, 0, 0, + 77, 89, 89, 0, 0, 0, 0, 0, 0, 89, + 89, 100, 100, 0, 0, 100, 100, 0, 0, 0, + 0, 0, 100, 102, 102, 0, 0, 102, 102, 0, + 0, 0, 0, 0, 102, 111, 111, 111, 111, 112, + 112, 112, 112, 113, 113, 114, 114, 114, 114, 115, + 115, 115, 115, 116, 0, 116, 117, 117, 117, 117, + 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, + 121, 121, 121, 121, 110, 110, 110, 110, 110, 110, + + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "parser.lex" +#line 2 "parser.lex" + +#include +#include +#include +#include "../lib/q.h" +#include "parser.h" +#include "../lib/utf8.h" + +//RVALUE {NUMBER}|{PERCENT}|{NAME}|\"{STRING}\"|{DIM} +//. {printf("%s\n", yytext);} +// %x: exclusive, %s: inclusive +char*type_names[] = {"twip","number","command","string","assignment","identifier","label","end"}; +static int line=1; +static int column=1; + +mem_t strings; +mem_t tokens; + +static void count(char*text, int len, int condition) +{ + int t; + for(t=0;tstr; (p=strchr(p1, '\\')); p1 = p+1) + { + int nr=2; + int new=1; + switch(p[1]) + { + case '\\': p[0] = '\\'; break; + case '"': p[0] = '"'; break; + case 'b': p[0] = '\b'; break; + case 'f': p[0] = '\f'; break; + case 'n': p[0] = '\n'; break; + case 'r': p[0] = '\r'; break; + case 't': p[0] = '\t'; break; + case 'x': case 'u': { + int max=4; + int num=0; + char*utf8; + char bracket = 0; + if(p[1] == 'u') + max = 6; + if(p[2] == '{') { + bracket = 1;nr++;max++; + } + while(strchr("0123456789abcdefABCDEF", p[nr]) && (bracket || nr < max)) { + num <<= 4; + if(p[nr]>='0' && p[nr]<='9') num |= p[nr] - '0'; + if(p[nr]>='a' && p[nr]<='f') num |= p[nr] - 'a' + 10; + if(p[nr]>='A' && p[nr]<='F') num |= p[nr] - 'A' + 10; + nr++; + } + if(bracket && p[nr]=='}') { + bracket = 0; + nr++; + } + utf8 = getUTF8(num); + new = strlen(utf8); + memcpy(p, utf8, new); // do not copy the terminating zero + break; + } + default: + continue; + } + tmp->len -= (nr-new); + { + int t; + char*to=p+new,*from=p+nr; + while(*from) { + *to = *from; + to++; + from++; + } + } + } +} + +static void store(enum type_t type, int line, int column, char*text, int length) +{ + struct token_t token; + string_t tmp; + token.type = type; + token.line = line; + token.column = column; + //printf("->%d(%s) %s\n", type, type_names[type], text);fflush(stdout); + + token.text_pos = 0; + token.text = 0; + switch(type) { + case END: + string_set2(&tmp, "", 0); + token.text_pos = mem_putstring(&strings, tmp); + break; + case STRING: + string_set2(&tmp, text+1, length-2); + unescapeString(&tmp); + token.text_pos = mem_putstring(&strings, tmp); + break; + case TWIP: + case NUMBER: + case IDENTIFIER: + string_set2(&tmp, text, length); + if(prefix) { + //strcat + token.text_pos = mem_put(&strings, prefix, strlen(prefix)); + mem_putstring(&strings, tmp); + } else { + token.text_pos = mem_putstring(&strings, tmp); + } + prefix = 0; + break; + case RAWDATA: + string_set2(&tmp, text+1/*:*/, length-5/*.end*/); + token.text_pos = mem_putstring(&strings, tmp); + break; + case COMMAND: + string_set2(&tmp, text+1, length-1); + token.text_pos = mem_putstring(&strings, tmp); + break; + case ASSIGNMENT: { + char*x = &text[length-1]; + if(x[-1] == '-' || x[-1] == '+') + x--; + do{x--;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); + x++; //first space + string_set2(&tmp, text, x-text); + token.text_pos = mem_putstring(&strings, tmp); + /*char*y,*x = strchr(text, '='); + if(!x) exit(1); + y=x; + do{y--;} while(*y==32 || *y==10 || *y==13 || *y=='\t'); + do{x++;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); + token.text1 = (char*)put(&strings, text, y-text + 1, 1); + token.text2 = (char*)put(&strings, x, length-(x-text), 1);*/ + } break; + } + + mem_put(&tokens, &token, sizeof(struct token_t)); + prefix = 0; +} + +#define MAX_INCLUDE_DEPTH 16 +static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; +static int line_stack[MAX_INCLUDE_DEPTH]; +static int column_stack[MAX_INCLUDE_DEPTH]; +static int include_stack_ptr = 0; + +static void handleInclude(char*text, int len) +{ + text+=9;len-=9; + while(len >=1 && (text[0] == ' ' || text[0] == '\t')) { + text++;len--; + } + while(len >= 1 && + (text[len-1] == ' ' || + text[len-1] == '\r' || + text[len-1] == '\n')) { + len--; + } + if(len >= 2 && text[0] == '"' && text[len-1] == '"') { + text++; len-=2; + } + text[len] = 0; + if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { + fprintf( stderr, "Includes nested too deeply" ); + exit( 1 ); + } + include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; + line_stack[include_stack_ptr] = line; + column_stack[include_stack_ptr] = column; + include_stack_ptr++; + yyin = fopen(text, "rb"); + if (!yyin) { + fprintf(stderr, "Couldn't open %s\n", text); + exit(1); + } + yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE ) ); + +#ifdef INITIAL + BEGIN(INITIAL); +#else + // best guess + BEGIN(0); +#endif +} + +#define c() {count(yytext, yyleng, YY_START);} +#define s(type) {store(type, line, column, yytext, yyleng);} + + +#line 787 "parser.yy.c" + +#define INITIAL 0 +#define R 1 +#define BINARY 2 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (void ); + +int yyget_debug (void ); + +void yyset_debug (int debug_flag ); + +YY_EXTRA_TYPE yyget_extra (void ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in (void ); + +void yyset_in (FILE * in_str ); + +FILE *yyget_out (void ); + +void yyset_out (FILE * out_str ); + +int yyget_leng (void ); + +char *yyget_text (void ); + +int yyget_lineno (void ); + +void yyset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 220 "parser.lex" + + +#line 977 "parser.yy.c" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 111 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 110 ); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 222 "parser.lex" +{c();BEGIN(0);} + YY_BREAK +case 2: +YY_RULE_SETUP +#line 223 "parser.lex" +{c();} + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +#line 224 "parser.lex" +{c();} + YY_BREAK +case 4: +/* rule 4 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 225 "parser.lex" +{s(TWIP);c();BEGIN(0);} + YY_BREAK +case 5: +/* rule 5 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 226 "parser.lex" +{s(NUMBER);c();BEGIN(0);} + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 227 "parser.lex" +{c();} + YY_BREAK +case 7: +/* rule 7 can match eol */ +YY_RULE_SETUP +#line 228 "parser.lex" +{c();} + YY_BREAK +case 8: +YY_RULE_SETUP +#line 229 "parser.lex" +{s(STRING);c();BEGIN(0);} + YY_BREAK +case 9: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 230 "parser.lex" +{c();printf("unterminated string in line %d: %s\n", line, yytext);exit(1);yyterminate();} + YY_BREAK +case 10: +/* rule 10 can match eol */ +YY_RULE_SETUP +#line 231 "parser.lex" +{s(ASSIGNMENT);prefix="";c();BEGIN(R);} + YY_BREAK +case 11: +/* rule 11 can match eol */ +YY_RULE_SETUP +#line 232 "parser.lex" +{s(ASSIGNMENT);prefix="";c();BEGIN(R);} + YY_BREAK +case 12: +/* rule 12 can match eol */ +YY_RULE_SETUP +#line 233 "parser.lex" +{s(ASSIGNMENT);c();BEGIN(R);} + YY_BREAK +/* values which appear only on the right-hand side of assignments, like: x=50% */ +case 13: +YY_RULE_SETUP +#line 235 "parser.lex" +{s(IDENTIFIER);c();BEGIN(0);} + YY_BREAK + +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 237 "parser.lex" +{handleInclude(yytext, yyleng);} + YY_BREAK +case 15: +YY_RULE_SETUP +#line 238 "parser.lex" +{s(COMMAND);c();} + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 239 "parser.lex" +{s(RAWDATA);c();} + YY_BREAK +case 17: +YY_RULE_SETUP +#line 240 "parser.lex" +{s(IDENTIFIER);c();} + YY_BREAK +case 18: +YY_RULE_SETUP +#line 241 "parser.lex" +{c();BEGIN(BINARY);} + YY_BREAK +case 19: +/* rule 19 can match eol */ +YY_RULE_SETUP +#line 242 "parser.lex" +{c();} + YY_BREAK +case 20: +YY_RULE_SETUP +#line 243 "parser.lex" +{char c,c1=yytext[0]; + printf("Syntax error in line %d, %d: %s", line, column, yytext); + while(1) { + c=input(); + if(c=='\n' || c==EOF) + break; + printf("%c", c); + } + if(c1>='0' && c1<='9') + printf(" (identifiers must not start with a digit)"); + printf("\n"); + exit(1); + yyterminate(); + } + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(R): +case YY_STATE_EOF(BINARY): +#line 257 "parser.lex" +{c(); + if ( --include_stack_ptr < 0 ) { + s(END); + yyterminate(); + } else { + yy_delete_buffer(YY_CURRENT_BUFFER ); + yy_switch_to_buffer(include_stack[include_stack_ptr] ); + column = column_stack[include_stack_ptr]; + line = line_stack[include_stack_ptr]; + } + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 270 "parser.lex" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 1213 "parser.yy.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 111 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 111 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 110); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __THROW /* this is a gnuism */ +extern int isatty (int ) __THROW; +#else +extern int isatty (int ); +#endif +#ifdef __cplusplus +} +#endif +#endif + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +{ + + return yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 270 "parser.lex" + + + +int yywrap() +{ + return 1; +} + +void freeTokens(struct token_t*file) +{ + mem_clear(&strings); + mem_clear(&tokens); +} + +struct token_t* generateTokens(char*filename) +{ + FILE*fi; + int t; + struct token_t*result; + int num; + + if(!filename) + return 0; + + if(!strcmp(filename,"-")) + fi = stdin; + else + fi = fopen(filename, "rb"); + + if(!fi) { + printf("Couldn't find file %s\n", filename); + return 0; + } + yyin = fi; + + mem_init(&strings); + mem_init(&tokens); + mem_put(&strings, &t, 1); //hack- make all valid strings start at position >0 + + line=1; + column=1; + + yylex(); +#ifdef YY_CURRENT_BUFFER + // some newer flex versions require it like this: + yy_delete_buffer(YY_CURRENT_BUFFER); +#else + yy_delete_buffer(yy_current_buffer); +#endif + + result = (struct token_t*)tokens.buffer; + num = tokens.pos/sizeof(struct token_t); + + for(t=0;t + +.SH DESCRIPTION +Runs a pdf through the pdf2swf conversion engine, and writes it +back to a pdf. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be verbose. Use more than one -v for greater effect. +.TP +\fB\-p\fR, \fB\-\-pages\fR \fIpages\fR + Pages to convert +.TP +\fB\-X\fR, \fB\-\-width\fR \fIwidth\fR + Make sure the output pdf is \fIwidth\fR pixels wide +.TP +\fB\-Y\fR, \fB\-\-height\fR \fIheight\fR + Make sure the output pdf is \fIheight\fR pixels high +.TP +\fB\-s\fR, \fB\-\-set\fR \fIparameter>= +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Write output to file \fIfilename\fR. (If not given, the output will go + to a file with the extension .print.pdf) +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c b/fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c new file mode 100644 index 000000000..485c6c036 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c @@ -0,0 +1,267 @@ +/* pdf2pdf.c + main routine for pdf2pdf(1) + + Part of the swftools package. + + Copyright (c) 2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "../config.h" +#include "../lib/args.h" +#include "../lib/os.h" +#include "../lib/gfxsource.h" +#include "../lib/gfxdevice.h" +#include "../lib/gfxpoly.h" +#include "../lib/devices/rescale.h" +#include "../lib/devices/polyops.h" +#include "../lib/devices/pdf.h" +#include "../lib/readers/image.h" +#include "../lib/readers/swf.h" +#include "../lib/pdf/pdf.h" +#include "../lib/log.h" + +static gfxsource_t*driver = 0; + +static int maxwidth = 0; +static int maxheight = 0; +static char * outputname = 0; +static int loglevel = 3; +static char * pagerange = 0; +static char * filename = 0; +static const char * format = "ocr"; + +int args_callback_option(char*name,char*val) { + if (!strcmp(name, "o")) + { + outputname = val; + return 1; + } + else if (!strcmp(name, "v")) + { + loglevel ++; + setConsoleLogging(loglevel); + return 0; + } + else if (!strcmp(name, "f")) + { + format = val; + return 1; + } + else if (!strcmp(name, "q")) + { + loglevel --; + setConsoleLogging(loglevel); + return 0; + } + else if (name[0]=='p') + { + do { + name++; + } while(*name == 32 || *name == 13 || *name == 10 || *name == '\t'); + + if(*name) { + pagerange = name; + return 0; + } + pagerange = val; + return 1; + } + else if (!strcmp(name, "s")) + { + if(!driver) { + fprintf(stderr, "Specify input file before -s\n"); + exit(1); + } + char*s = strdup(val); + char*c = strchr(s, '='); + if(c && *c && c[1]) { + *c = 0; + c++; + driver->setparameter(driver, s,c); + } else { + driver->setparameter(driver, s,"1"); + } + free(s); + return 1; + } + else if (!strcmp(name, "X")) + { + maxwidth = atoi(val); + return 1; + } + else if (!strcmp(name, "Y")) + { + maxheight = atoi(val); + return 1; + } + else if (!strcmp(name, "V")) + { + printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else + { + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); + } + return 0; +} + +static struct options_t options[] = { +{"h", "help"}, +{"v", "verbose"}, +{"p", "pages"}, +{"X", "width"}, +{"Y", "height"}, +{"s", "set"}, +{"o", "output"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_longoption(char*name,char*val) { + return args_long2shortoption(options, name, val); +} + +int args_callback_command(char*name, char*val) { + if (!filename) { + + filename = name; + + if(strstr(filename, ".pdf") || strstr(filename, ".PDF")) { + msg(" Treating file as PDF"); + driver = gfxsource_pdf_create(); + } else if(strstr(filename, ".swf") || strstr(filename, ".SWF")) { + msg(" Treating file as SWF"); + driver = gfxsource_swf_create(); + } else if(strstr(filename, ".jpg") || strstr(filename, ".JPG") || + strstr(filename, ".png") || strstr(filename, ".PNG")) { + msg(" Treating file as Image"); + driver = gfxsource_image_create(); + } else { + driver = gfxsource_pdf_create(); + } + } else { + if(outputname) + { + fprintf(stderr, "Error: Do you want the output to go to %s or to %s?", + outputname, name); + exit(1); + } + outputname = name; + } + return 0; +} + +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s \n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); + printf("-p , --pages Pages to convert\n"); + printf("-X , --width Make sure the output pdf is pixels wide\n"); + printf("-Y , --height Make sure the output pdf is pixels high\n"); + printf("-s , --set = Set to \n"); + printf("-o , --output Write output to file .\n"); + printf("-V , --version Print version info and exit\n"); + printf("\n"); +} + +int main(int argn, char *argv[]) +{ + processargs(argn, argv); + initLog(0,-1,0,0,-1,loglevel); + + if(!filename) { + fprintf(stderr, "Please specify an input file\n"); + exit(1); + } + + if(!outputname) + { + if(filename) { + outputname = stripFilename(filename, ".print.pdf"); + msg(" Output filename not given. Writing to %s", outputname); + } + } + if(!outputname) + { + fprintf(stderr, "Please use -o to specify an output file\n"); + exit(1); + } + + is_in_range(0x7fffffff, pagerange); + if(pagerange) + driver->setparameter(driver, "pages", pagerange); + + if(!filename) { + args_callback_usage(argv[0]); + exit(0); + } + + gfxdocument_t* doc = driver->open(driver, filename); + //doc->setparameter(doc, "drawonlyshapes", "1"); + doc->setparameter(doc, "disable_polygon_conversion", "1"); + + if(!doc) { + msg(" Couldn't open %s", filename); + exit(1); + } + + gfxdevice_t _out,*out=&_out; + gfxdevice_pdf_init(out); + + /*gfxdevice_t wrap; + gfxdevice_removeclippings_init(&wrap, out); + out = &wrap;*/ + + gfxdevice_t rescale; + if(maxwidth || maxheight) { + gfxdevice_rescale_init(&rescale, out, maxwidth, maxheight, 0); + out = &rescale; + out->setparameter(out, "keepratio", "1"); + } + + int pagenr; + for(pagenr = 1; pagenr <= doc->num_pages; pagenr++) + { + if(is_in_range(pagenr, pagerange)) { + gfxpage_t* page = doc->getpage(doc, pagenr); + out->startpage(out, page->width, page->height); + page->render(page, out); + out->endpage(out); + page->destroy(page); + } + } + gfxresult_t*result = out->finish(out); + if(result) { + if(result->save(result, outputname) < 0) { + exit(1); + } + result->destroy(result); + } + doc->destroy(doc); + driver->destroy(driver); + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf new file mode 100644 index 000000000..ecfd6137a Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 new file mode 100644 index 000000000..f1eb3aa8f --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 @@ -0,0 +1,87 @@ +.TH pdf2swf "1" "June 2008" "pdf2swf" "swftools" +.SH NAME +pdf2swf - Converts Acrobat PDF files into Flash SWF Animation files. + +.SH Synopsis +.B pdf2swf [-options] file.pdf -o file.swf + +.SH DESCRIPTION +Converts a PDF file to a SWF file. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.TP +\fB\-o\fR, \fB\-\-output\fR file.swf + will go into a seperate file. +.TP +\fB\-p\fR, \fB\-\-pages\fR range + 3-5,10-12 +.TP +\fB\-P\fR, \fB\-\-password\fR password + Use password for deciphering the pdf. +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be verbose. Use more than one -v for greater effect. +.TP +\fB\-z\fR, \fB\-\-zlib\fR + The resulting SWF will not be playable in browsers with Flash Plugins 5 and below! +.TP +\fB\-i\fR, \fB\-\-ignore\fR + SWF files a little bit smaller, but it may also cause the images in the pdf to look funny. +.TP +\fB\-j\fR, \fB\-\-jpegquality\fR quality + Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85) +.TP +\fB\-s\fR, \fB\-\-set\fR param=value + Set a SWF encoder specific parameter. See pdf2swf -s help for more information. +.TP +\fB\-w\fR, \fB\-\-samewindow\fR + When clicked on, the page they point to will be opened in the window the SWF is displayed. +.TP +\fB\-t\fR, \fB\-\-stop\fR + The resulting SWF file will not turn pages automatically. +.TP +\fB\-T\fR, \fB\-\-flashversion\fR num + Set Flash Version in the SWF header to num. +.TP +\fB\-F\fR, \fB\-\-fontdir\fR directory + Add directory to the font search path. +.TP +\fB\-b\fR, \fB\-\-defaultviewer\fR + Therefore the swf file will be "browseable", i.e. display some buttons for turning pages. + The viewer swf to be used is determined by a symlink named "default_viewer.swf" in + the swftools data directory. +.TP +\fB\-l\fR, \fB\-\-defaultloader\fR + The loader swf to be used is determined by a symlink named "default_loader.swf" in + the swftools data directory. +.TP +\fB\-B\fR, \fB\-\-viewer\fR filename + See http://www.quiss.org/swftools/pdf2swf_usage.html for information on how to create your own viewers. +.TP +\fB\-L\fR, \fB\-\-preloader\fR filename + filename is an arbitrary swf animation. +.TP +\fB\-q\fR, \fB\-\-quiet\fR + Suppress normal messages. Use -qq to suppress warnings, also. +.TP +\fB\-S\fR, \fB\-\-shapes\fR + Don't use SWF Fonts, but store everything as shape. +.TP +\fB\-f\fR, \fB\-\-fonts\fR + Store full fonts in SWF. (Don't reduce to used characters). +.TP +\fB\-G\fR, \fB\-\-flatten\fR + This usually makes the file faster to render and also usually smaller, but will increase + conversion time. +.TP +\fB\-I\fR, \fB\-\-info\fR + Don't do actual conversion, just display a list of all pages in the PDF. +.TP +\fB\-Q\fR, \fB\-\-maxtime\fR n + Abort conversion after n seconds. Only available on Unix. diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c new file mode 100644 index 000000000..3b67bccbf --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c @@ -0,0 +1,924 @@ +/* pdf2swf.c + main routine for pdf2swf(1) + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include "../config.h" +#ifdef HAVE_SIGNAL_H +#include +#endif +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_MALLOC_H +#include +#endif + +#include "../lib/args.h" +#include "../lib/os.h" +#include "../lib/rfxswf.h" +#include "../lib/devices/swf.h" +#include "../lib/devices/polyops.h" +#include "../lib/devices/record.h" +#include "../lib/devices/rescale.h" +#include "../lib/gfxfilter.h" +#include "../lib/pdf/pdf.h" +#include "../lib/log.h" + +#define SWFDIR concatPaths(getInstallationPath(), "swfs") + +static gfxsource_t*driver = 0; +static gfxdevice_t*out = 0; + +static int maxwidth=0, maxheight=0; + +static char * outputname = 0; +static int loglevel = 3; +static char * pagerange = 0; +static char * filename = 0; +static char * password = 0; +static int zlib = 0; + +static char * preloader = 0; +static char * viewer = 0; +static int xnup = 1; +static int ynup = 1; + +static int info_only = 0; + +static int max_time = 0; + +static int flatten = 0; + +static char* filters = 0; + +char* fontpaths[256]; +int fontpathpos = 0; + +int move_x=0; +int move_y=0; +int custom_move = 0; +int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; +int custom_clip = 0; + +static int system_quiet=0; + +int systemf(const char* format, ...) +{ + char buf[1024]; + int ret; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + + if(!system_quiet) { + printf("%s\n", buf); + fflush(stdout); + } + ret = system(buf); + if(ret) { + fprintf(stderr, "system() returned %d\n", ret); + exit(ret); + } + return ret; +} + +#ifdef HAVE_SIGNAL_H +void sigalarm(int signal) +{ + msg(" Aborting rendering after %d seconds", max_time); +#if 0 && defined(HAVE_SYS_TIME_H) && defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRUSAGE) + struct rusage usage; + getrusage(RUSAGE_CHILDREN, &usage); + msg(" Memory used: %d,%d,%d", usage.ru_maxrss, usage.ru_idrss, usage.ru_isrss); +#endif +#if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_H) + struct mallinfo info = mallinfo(); + msg(" Memory used: %d Mb (%d bytes)", info.uordblks/1048576, info.uordblks); +#endif + exit(1); +} +#endif + +typedef struct _parameter { + struct _parameter*next; + const char*name; + const char*value; +} parameter_t; + +static parameter_t* device_config = 0; +static parameter_t* device_config_next = 0; +static void store_parameter(const char*name, const char*value) +{ + parameter_t*o = device_config; + while(o) { + if(!strcmp(name, o->name)) { + /* overwrite old value */ + free((void*)o->value); + o->value = strdup(value); + return; + } + o = o->next; + } + parameter_t*p = (parameter_t*)malloc(sizeof(parameter_t)); + p->name = strdup(name); + p->value = strdup(value); + p->next = 0; + + if(device_config_next) { + device_config_next->next = p; + device_config_next = p; + } else { + device_config = p; + device_config_next = p; + } +} + +int args_callback_option(char*name,char*val) { + if (!strcmp(name, "o")) + { + outputname = val; + return 1; + } + else if (!strcmp(name, "v")) + { + loglevel ++; + setConsoleLogging(loglevel); + return 0; + } + else if (!strcmp(name, "2")) + { + xnup = 2; + ynup = 1; + return 0; + } + else if (!strcmp(name, "4")) + { + xnup = 2; + ynup = 2; + return 0; + } + else if (!strcmp(name, "9")) + { + xnup = 3; + ynup = 3; + return 0; + } + else if (!strcmp(name, "X")) + { + maxwidth = atoi(val); + return 1; + } + else if (!strcmp(name, "Y")) + { + maxheight = atoi(val); + return 1; + } + else if (!strcmp(name, "q")) + { + loglevel --; + setConsoleLogging(loglevel); + system_quiet = 1; + return 0; + } + else if (name[0]=='p') + { + /* check whether the page range follows the p directly, like + in -p1,2 */ + do { + name++; + } while(*name == 32 || *name == 13 || *name == 10 || *name == '\t'); + + if(*name) { + pagerange = name; + return 0; + } + pagerange = val; + return 1; + } + else if (!strcmp(name, "P")) + { + password = val; + return 1; + } + else if (!strcmp(name, "c")) + { + char*s = strdup(val); + char*x1 = strtok(s, ":"); + char*y1 = strtok(0, ":"); + char*x2 = strtok(0, ":"); + char*y2 = strtok(0, ":"); + if(!(x1 && y1 && x2 && y2)) { + fprintf(stderr, "-c option requires four arguments, :::\n"); + exit(1); + } + custom_clip = 1; + clip_x1 = atoi(x1); + clip_y1 = atoi(y1); + clip_x2 = atoi(x2); + clip_y2 = atoi(y2); + free(s); + return 1; + } + else if (!strcmp(name, "m")) + { + char*s = strdup(val); + char*c = strchr(s, ':'); + if(!c) { + fprintf(stderr, "-m option requires two arguments, :\n"); + exit(1); + } + *c = 0; + custom_move = 1; + move_x = atoi(val); + move_y = atoi(c+1); + free(s); + return 1; + } + else if (!strcmp(name, "s")) + { + char*s = val; + char*c = strchr(s, '='); + if(c && *c && c[1]) { + *c = 0; + c++; + store_parameter(s,c); + } else if(!strcmp(s,"help")) { + printf("PDF Parameters:\n"); + gfxsource_t*pdf = gfxsource_pdf_create(); + pdf->setparameter(pdf, "help", ""); + gfxdevice_t swf; + gfxdevice_swf_init(&swf); + printf("SWF Parameters:\n"); + swf.setparameter(&swf, "help", ""); + exit(0); + } else { + store_parameter(s,"1"); + } + return 1; + } + else if (!strcmp(name, "S")) + { + store_parameter("drawonlyshapes", "1"); + return 0; + } + else if (!strcmp(name, "i")) + { + store_parameter("ignoredraworder", "1"); + return 0; + } +#ifndef WIN32 + else if (!strcmp(name, "Q")) + { + max_time = atoi(val); + alarm(max_time); +# ifdef HAVE_SIGNAL_H + signal(SIGALRM, sigalarm); +# endif + return 1; + } +#endif + else if (!strcmp(name, "z")) + { + store_parameter("enablezlib", "1"); + zlib = 1; + return 0; + } + else if (!strcmp(name, "n")) + { + store_parameter("opennewwindow", "1"); + return 0; + } + else if (!strcmp(name, "I")) + { + info_only = 1; + return 0; + } + else if (!strcmp(name, "t")) + { + store_parameter("insertstop", "1"); + return 0; + } + else if (!strcmp(name, "T")) + { + if(!strcasecmp(val, "mx")) + store_parameter("flashversion", "6"); + else + store_parameter("flashversion", val); + + return 1; + } + else if (!strcmp(name, "f")) + { + store_parameter("storeallcharacters", "1"); + store_parameter("extrafontdata", "1"); + return 0; + } + else if (!strcmp(name, "ff")) + { + if(filters) { + // append this to the current filter expression (we allow more than one --filter) + int l = strlen(filters); + int new_len = l + strlen(val) + 2; + filters = (char*)realloc(filters, new_len); + filters[l] = ':'; + strcpy(filters+l+1, val); + } else { + filters = strdup(val); + } + return 1; + } + else if (!strcmp(name, "w")) + { + store_parameter("linksopennewwindow", "0"); + return 0; + } + else if (!strcmp(name, "O")) + { + int level = 1; + int ret=0; + if(val&& val[0] && val[1]==0 && isdigit(val[0])) { + level = atoi(val); + ret=1; + } + if(level>=1) + store_parameter("poly2bitmap", "1"); + if(level>=2) + store_parameter("bitmapfonts", "1"); + if(level>=3) + store_parameter("ignoredraworder", "1"); + return ret; + } + else if (!strcmp(name, "G")) + { + //store_parameter("optimize_polygons", "1"); + flatten = 1; + return 0; + } + else if (!strcmp(name, "F")) + { + char *s = strdup(val); + int l = strlen(s); + while(l && s[l-1]=='/') { + s[l-1] = 0; + l--; + } + fontpaths[fontpathpos++] = s; + return 1; + } + else if (!strcmp(name, "l")) + { + char buf[256]; + sprintf(buf, "%s/default_loader.swf", SWFDIR); + preloader = strdup(buf); + return 0; + } + else if (!strcmp(name, "b")) + { + char buf[256]; + sprintf(buf, "%s/default_viewer.swf", SWFDIR); + viewer = strdup(buf); + return 0; + } + else if (!strcmp(name, "L")) + { + if(val) + { + preloader = val; + } + else + { + systemf("ls %s/*_loader.swf", SWFDIR); + if(!system_quiet) + printf("\n"); + exit(1); + } + return 1; + } + else if (!strcmp(name, "B")) + { + if(val) + { + viewer = val; + } + else + { + systemf("ls %s/*_viewer.swf", SWFDIR); + if(!system_quiet) + printf("\n"); + exit(1); + } + return 1; + } + else if (!strcmp(name, "j")) + { + if(name[1]) { + store_parameter("jpegquality", &name[1]); + return 0; + } else { + store_parameter("jpegquality", val); + return 1; + } + } + else if (!strcmp(name, "V")) + { + printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else + { + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); + } + return 0; +} + +static struct options_t options[] = { +{"h", "help"}, +{"V", "version"}, +{"o", "output"}, +{"p", "pages"}, +{"P", "password"}, +{"v", "verbose"}, +{"z", "zlib"}, +{"i", "ignore"}, +{"j", "jpegquality"}, +{"s", "set"}, +{"w", "samewindow"}, +{"t", "stop"}, +{"T", "flashversion"}, +{"F", "fontdir"}, +{"ff", "filter"}, +{"b", "defaultviewer"}, +{"l", "defaultloader"}, +{"B", "viewer"}, +{"L", "preloader"}, +{"q", "quiet"}, +{"S", "shapes"}, +{"f", "fonts"}, +{"G", "flatten"}, +{"I", "info"}, +{"Q", "maxtime"}, +{"X", "width"}, +{"Y", "height"}, +{0,0} +}; + +int args_callback_longoption(char*name,char*val) { + return args_long2shortoption(options, name, val); +} + +int args_callback_command(char*name, char*val) { + if (!filename) + filename = name; + else { + if(outputname) + { + fprintf(stderr, "Error: Do you want the output to go to %s or to %s?", + outputname, name); + exit(1); + } + outputname = name; + } + return 0; +} + +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-options] file.pdf -o file.swf\n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-V , --version Print version info and exit\n"); + printf("-o , --output file.swf Direct output to file.swf. If file.swf contains '%%' (file%%.swf), then each page goes to a seperate file.\n"); + printf("-p , --pages range Convert only pages in range with range e.g. 1-20 or 1,4,6,9-11 or\n"); + printf("-P , --password password Use password for deciphering the pdf.\n"); + printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); + printf("-z , --zlib Use Flash 6 (MX) zlib compression.\n"); + printf("-i , --ignore Allows pdf2swf to change the draw order of the pdf. This may make the generated\n"); + printf("-j , --jpegquality quality Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)\n"); + printf("-s , --set param=value Set a SWF encoder specific parameter. See pdf2swf -s help for more information.\n"); + printf("-w , --samewindow When converting pdf hyperlinks, don't make the links open a new window. \n"); + printf("-t , --stop Insert a stop() command in each page. \n"); + printf("-T , --flashversion num Set Flash Version in the SWF header to num.\n"); + printf("-F , --fontdir directory Add directory to the font search path.\n"); + printf("-b , --defaultviewer Link a standard viewer to the swf file. \n"); + printf("-l , --defaultloader Link a standard preloader to the swf file which will be displayed while the main swf is loading.\n"); + printf("-B , --viewer filename Link viewer filename to the swf file. \n"); + printf("-L , --preloader filename Link preloader filename to the swf file. \n"); + printf("-q , --quiet Suppress normal messages. Use -qq to suppress warnings, also.\n"); + printf("-S , --shapes Don't use SWF Fonts, but store everything as shape.\n"); + printf("-f , --fonts Store full fonts in SWF. (Don't reduce to used characters).\n"); + printf("-G , --flatten Remove as many clip layers from file as possible. \n"); + printf("-I , --info Don't do actual conversion, just display a list of all pages in the PDF.\n"); + printf("-Q , --maxtime n Abort conversion after n seconds. Only available on Unix.\n"); + printf("\n"); +} + +float getRate(char*filename) +{ + int fi; + SWF swf; + fi = open(filename,O_RDONLY|O_BINARY); + if(fi<0) { + char buffer[256]; + sprintf(buffer, "Couldn't open %s", filename); + perror(buffer); + exit(1); + } + if(swf_ReadSWF(fi,&swf) < 0) + { + fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); + close(fi); + exit(1); + } + swf_FreeTags(&swf); + return swf.frameRate / 256.0; +} + +void show_info(gfxsource_t*driver, char*filename) +{ + gfxdocument_t* pdf = driver->open(driver, filename); + int pagenr; + FILE*fo=0; + if(!pdf) { + msg(" Couldn't open %s", filename); + exit(1); + } + if(outputname) { + fo = fopen(outputname, "wb"); + if(!fo) { + perror(outputname);exit(1);; + } + } else { + fo = stdout; + } + + for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) + { + gfxpage_t*page = pdf->getpage(pdf,pagenr); + if(is_in_range(pagenr, pagerange)) { + fprintf(fo, "page=%d width=%.2f height=%.2f\n", pagenr, page->width, page->height); + } + } + pdf->destroy(pdf); +} + + +static gfxdevice_t swf,wrap,rescale; +gfxdevice_t*create_output_device() +{ + gfxdevice_swf_init(&swf); + + /* set up filter chain */ + + out = &swf; + if(flatten) { + gfxdevice_removeclippings_init(&wrap, &swf); + out = &wrap; + } + + if(maxwidth || maxheight) { + gfxdevice_rescale_init(&rescale, out, maxwidth, maxheight, 0); + out = &rescale; + } + + if(filters) { + gfxfilterchain_t*chain = gfxfilterchain_parse(filters); + if(!chain) { + fprintf(stderr, "Unable to parse filters: %s\n", filters); + exit(1); + } + out = gfxfilterchain_apply(chain, out); + gfxfilterchain_destroy(chain); + } + + /* pass global parameters to output device */ + parameter_t*p = device_config; + while(p) { + out->setparameter(out, p->name, p->value); + p = p->next; + } + return out; +} + +int main(int argn, char *argv[]) +{ + int ret; + char buf[256]; + int numfonts = 0; + int t; + char t1searchpath[1024]; + int nup_pos = 0; + int x,y; + int one_file_per_page = 0; + + initLog(0,-1,0,0,-1,loglevel); + + /* not needed anymore since fonts are embedded + if(installPath) { + fontpaths[fontpathpos++] = concatPaths(installPath, "fonts"); + }*/ + +#ifdef HAVE_SRAND48 + srand48(time(0)); +#else +#ifdef HAVE_SRAND + srand(time(0)); +#endif +#endif + + processargs(argn, argv); + + driver = gfxsource_pdf_create(); + + /* pass global parameters to PDF driver*/ + parameter_t*p = device_config; + while(p) { + driver->setparameter(driver, p->name, p->value); + p = p->next; + } + + if(!filename) + { + fprintf(stderr, "Please specify an input file\n"); + exit(1); + } + + if (!info_only) { + if(!outputname) + { + if(filename) { + outputname = stripFilename(filename, ".swf"); + msg(" Output filename not given. Writing to %s", outputname); + } + } + + if(!outputname) + { + fprintf(stderr, "Please use -o to specify an output file\n"); + exit(1); + } + } + + // test if the page range is o.k. + is_in_range(0x7fffffff, pagerange); + + if (!filename) { + args_callback_usage(argv[0]); + exit(0); + } + + char fullname[256]; + if(password && *password) { + sprintf(fullname, "%s|%s", filename, password); + filename = fullname; + } + + if(pagerange) + driver->setparameter(driver, "pages", pagerange); + + /* add fonts */ + for(t=0;tsetparameter(driver, "fontdir", fontpaths[t]); + } + + if(info_only) { + show_info(driver, filename); + return 0; + } + + char*u = 0; + if((u = strchr(outputname, '%'))) { + if(strchr(u+1, '%') || + strchr(outputname, '%')!=u) { + msg(" only one %% allowed in filename\n"); + return 1; + } + if(preloader || viewer) { + msg(" -b/-l/-B/-L not supported together with %% in filename\n"); + return 1; + } + msg(" outputting one file per page"); + one_file_per_page = 1; + char*pattern = (char*)malloc(strlen(outputname)+2); + /* convert % to %d */ + int l = u-outputname+1; + memcpy(pattern, outputname, l); + pattern[l]='d'; + strcpy(pattern+l+1, outputname+l); + outputname = pattern; + } + + gfxdocument_t* pdf = driver->open(driver, filename); + if(!pdf) { + msg(" Couldn't open %s", filename); + exit(1); + } + /* pass global parameters document */ + p = device_config; + while(p) { + pdf->setparameter(pdf, p->name, p->value); + p = p->next; + } + + struct mypage_t { + int x; + int y; + gfxpage_t*page; + } pages[4]; + + int pagenum = 0; + int frame = 1; + int pagenr; + + for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) + { + if(is_in_range(pagenr, pagerange)) { + char mapping[80]; + sprintf(mapping, "%d:%d", pagenr, frame); + pdf->setparameter(pdf, "pagemap", mapping); + pagenum++; + } + if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) { + pagenum = 0; + frame++; + } + } + if(pagerange && !pagenum && frame==1) { + fprintf(stderr, "No pages in range %s", pagerange); + exit(1); + } + + pagenum = 0; + + gfxdevice_t*out = create_output_device();; + pdf->prepare(pdf, out); + + for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) + { + if(is_in_range(pagenr, pagerange)) { + gfxpage_t* page = pages[pagenum].page = pdf->getpage(pdf, pagenr); + pages[pagenum].x = 0; + pages[pagenum].y = 0; + pages[pagenum].page = page; + pagenum++; + } + if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) { + + int t; + int xmax[xnup], ymax[xnup]; + int x,y; + int width=0, height=0; + + memset(xmax, 0, xnup*sizeof(int)); + memset(ymax, 0, ynup*sizeof(int)); + + for(y=0;ywidth > xmax[x]) + xmax[x] = (int)pages[t].page->width; + if(pages[t].page->height > ymax[y]) + ymax[y] = (int)pages[t].page->height; + } + for(x=0;xstartpage(out,clip_x2 - clip_x1, clip_y2 - clip_y1); + } else { + out->startpage(out,width,height); + } + for(t=0;t0?xmax[x-1]:0; + int ypos = y>0?ymax[y-1]:0; + msg(" Render (%d,%d) move:%d/%d\n", + (int)(pages[t].page->width + xpos), + (int)(pages[t].page->height + ypos), xpos, ypos); + pages[t].page->rendersection(pages[t].page, out, custom_move? move_x : xpos, + custom_move? move_y : ypos, + custom_clip? clip_x1 : 0 + xpos, + custom_clip? clip_y1 : 0 + ypos, + custom_clip? clip_x2 : pages[t].page->width + xpos, + custom_clip? clip_y2 : pages[t].page->height + ypos); + } + out->endpage(out); + for(t=0;tdestroy(pages[t].page); + } + pagenum = 0; + + if(one_file_per_page) { + gfxresult_t*result = out->finish(out);out=0; + char buf[1024]; + sprintf(buf, outputname, pagenr); + if(result->save(result, buf) < 0) { + return 1; + } + result->destroy(result);result=0; + out = create_output_device();; + msg(" Writing SWF file %s", buf); + } + } + } + + if(one_file_per_page) { + // remove empty device + gfxresult_t*result = out->finish(out);out=0; + result->destroy(result);result=0; + } else { + gfxresult_t*result = out->finish(out); + msg(" Writing SWF file %s", outputname); + if(result->save(result, outputname) < 0) { + exit(1); + } + int width = (int)(ptroff_t)result->get(result, "width"); + int height = (int)(ptroff_t)result->get(result, "height"); + result->destroy(result);result=0; + + if(preloader || viewer) { + const char*zip = ""; + if(zlib) { + zip = "-z"; + } + if(!preloader && viewer) { + systemf("swfcombine %s -X %d -Y %d \"%s\" viewport=\"%s\" -o \"%s\"",zip,width,height, + viewer, outputname, outputname); + if(!system_quiet) + printf("\n"); + } + if(preloader && !viewer) { + msg(" --preloader option without --viewer option doesn't make very much sense."); + ret = systemf("swfcombine %s -Y %d -X %d %s/PreLoaderTemplate.swf loader=\"%s\" movie=\"%s\" -o \"%s\"",zip,width,height, + SWFDIR, preloader, outputname, outputname); + if(!system_quiet) + printf("\n"); + } + if(preloader && viewer) { +#ifdef HAVE_MKSTEMP + char tmpname[] = "__swf__XXXXXX"; + mkstemp(tmpname); +#else + char*tmpname = "__tmp__.swf"; +#endif + systemf("swfcombine \"%s\" viewport=%s -o %s", + viewer, outputname, tmpname); + systemf("swfcombine %s -X %d -Y %d -r %f %s/PreLoaderTemplate.swf loader=%s movie=%s -o \"%s\"",zip,width,height, + getRate(preloader), SWFDIR, preloader, tmpname, outputname); + systemf("rm %s", tmpname); + } + } + } + + pdf->destroy(pdf); + driver->destroy(driver); + + + /* free global parameters */ + p = device_config; + while(p) { + parameter_t*next = p->next; + if(p->name) free((void*)p->name);p->name = 0; + if(p->value) free((void*)p->value);p->value =0; + p->next = 0;free(p); + p = next; + } + if(filters) { + free(filters); + } + + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/png2swf b/fluidbook/tools/swftools-special-swfdump/src/png2swf new file mode 100644 index 000000000..9b1c4c441 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/png2swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/png2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/png2swf.1 new file mode 100644 index 000000000..e69679f53 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/png2swf.1 @@ -0,0 +1,58 @@ +.TH png2swf "1" "April 2009" "png2swf" "swftools" +.SH NAME +png2swf - Takes a number of png files and converts them to a swf movie, one +picture per frame. + +.SH Synopsis +.B png2swf [-X width] [-Y height] [-o file.swf] [-r rate] file1.png [file2.png...] + +.SH DESCRIPTION +This tools converts png image files into an SWF animation. It takes any +number of input pictures, and converts them to SWF one-by-one, where every +converted picture is a seperate frame in the target SWF. +.PP +The way the +images are encoded in SWF is very similar to PNG (in that a zlib-based, lossless +compression algorithm is used). + +.SH OPTIONS +.TP +\fB\-r\fR, \fB\-\-rate\fR \fIframerate\fR + Set movie framerate (frames per second) +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Explicitly specify output file. (Otherwise, output will go to stdout / output.swf) +.TP +\fB\-j\fR, \fB\-\-jpeg\fR \fIquality\fR + Generate a lossy jpeg bitmap inside the SWF, with a given quality (1-100) +.TP +\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR + Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be + smaller, but not playable in Flash Plugins of Version 5 and below. +.TP +\fB\-T\fR, \fB\-\-flashversion\fR + Set the flash version to generate +.TP +\fB\-X\fR, \fB\-\-pixel\fR \fIwidth\fR + Force movie width to \fIwidth\fR (default: autodetect) +.TP +\fB\-Y\fR, \fB\-\-pixel\fR \fIheight\fR + Force movie height to \fIheight\fR (default: autodetect) +.TP +\fB\-v\fR, \fB\-\-verbose\fR \fIlevel\fR + Set verbose level (0=quiet, 1=default, 2=debug) +.TP +\fB\-q\fR, \fB\-\-quiet\fR + Omit normal log messages, only log errors +.TP +\fB\-C\fR, \fB\-\-cgi\fR + For use as CGI- prepend http header, write to stdout +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version information and exit +.TP +\fB\-s\fR, \fB\-\-scale\fR \fIpercent\fR + Scale image to \fIpercent\fR% size. +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/png2swf.c b/fluidbook/tools/swftools-special-swfdump/src/png2swf.c new file mode 100644 index 000000000..92a71a592 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/png2swf.c @@ -0,0 +1,824 @@ +/* png2swf.c + + PNG to SWF converter tool + + Part of the swftools package. + + Copyright (c) 2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" +#include "../lib/log.h" +#include "../lib/png.h" + +#define MAX_INPUT_FILES 1024 +#define VERBOSE(x) (global.verbose>=x) + +static struct { + float framerate; + int max_image_width; + int max_image_height; + int force_width; + int force_height; + int nfiles; + int verbose; + int do_cgi; + int version; + char *outfile; + int mkjpeg; + float scale; +} global; + +static struct { + char *filename; +} image[MAX_INPUT_FILES]; + +static int custom_move=0; +static int move_x=0; +static int move_y=0; +static int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; +static int custom_clip = 0; + +TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) +{ + TAG *t; + RGBA rgb; + + memset(swf, 0x00, sizeof(SWF)); + + swf->fileVersion = global.version; + swf->frameRate = (int)(256.0 * framerate); + if(custom_clip) { + swf->movieSize.xmin = clip_x1 * 20; + swf->movieSize.ymin = clip_y1 * 20; + swf->movieSize.xmax = clip_x2 * 20; + swf->movieSize.ymax = clip_y2 * 20; + } else { + swf->movieSize.xmax = dx * 20; + swf->movieSize.ymax = dy * 20; + } + + t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); + + rgb.r = rgb.g = rgb.b = rgb.a = 0x00; + //rgb.g = 0xff; //<--- handy for testing alpha conversion + swf_SetRGB(t, &rgb); + + return t; +} + +int MovieFinish(SWF * swf, TAG * t, char *sname) +{ + int f, so = fileno(stdout); + t = swf_InsertTag(t, ST_END); + + if ((!isatty(so)) && (!sname)) + f = so; + else { + if (!sname) + sname = "output.swf"; + f = open(sname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + } + + if(global.do_cgi) { + if FAILED(swf_WriteCGI(swf)) fprintf(stderr,"WriteCGI() failed.\n"); + } else { + if (swf_WriteSWF(f, swf)<0) + fprintf(stderr, "Unable to write output file: %s\n", sname); + if (f != so) + close(f); + } + + swf_FreeTags(swf); + return 0; +} + +int png_read_chunk(char (*head)[4], int*destlen, U8**destdata, FILE*fi) +{ + unsigned int len; + if(destlen) *destlen=0; + if(destdata) *destdata=0; + if(!fread(&len, 4, 1, fi)) + return 0; + if(!fread(head, 4, 1, fi)) + return 0; + len = BE_32_TO_NATIVE(len); + if(destlen) *destlen = len; + if(destdata) { + if(len) + *destdata = malloc(len); + else + *destdata = 0; + if(!fread(*destdata, len, 1, fi)) { + *destdata = 0; + if(destlen) *destlen=0; + return 0; + } + fseek(fi, 4, SEEK_CUR); + + } else { + fseek(fi, len+4, SEEK_CUR); + } + return 1; +} + +unsigned int png_get_dword(FILE*fi) +{ + unsigned int a; + fread(&a,4,1,fi); + return BE_32_TO_NATIVE(a); +} + +struct png_header +{ + int width; + int height; + int bpp; + int mode; +}; + +int png_read_header(FILE*fi, struct png_header*header) +{ + char id[4]; + int len; + int ok=0; + U8 head[8] = {137,80,78,71,13,10,26,10}; + U8 head2[8]; + U8*data; + fread(head2,8,1,fi); + if(strncmp((char*)head,(char*)head2,4)) + return 0; + + while(png_read_chunk(&id, &len, &data, fi)) + { + if(VERBOSE(2)) + printf("%c%c%c%c %d\n", id[0],id[1],id[2],id[3],len); + if(!strncasecmp(id, "IHDR", 4)) { + char a,b,c,f,i; + if(len < 8) exit(1); + header->width = BE_32_TO_NATIVE(*(U32*)&data[0]); + header->height = BE_32_TO_NATIVE(*(U32*)&data[4]); + a = data[8]; // should be 8 + b = data[9]; // should be 3(indexed), 2(rgb), 0(grayscale) or 6(truecolor+alpha) + + c = data[10]; // compression mode (0) + f = data[11]; // filter mode (0) + i = data[12]; // interlace mode (0) + + if(VERBOSE(2)) printf("image mode:%d\n", b); + if(VERBOSE(2)) printf("bpp: %d\n", a); + if(VERBOSE(2)) printf("compression: %d\n", c); + if(VERBOSE(2)) printf("filter: %d\n", f); + if(VERBOSE(2)) printf("interlace: %d\n", i); + + if(b!=0 && b!=2 && b!=3 && b!=6) { + fprintf(stderr, "Image mode %d not supported!\n", b); + if(b == 4) { + fprintf(stderr, "(This is a grayscale image with alpha channel-\n"); + fprintf(stderr, " try converting it into an RGB image with alpha channel)\n"); + } + exit(1); + } + if(a!=8 && (b==2 || b==6)) { + fprintf(stderr, "Bpp %d in mode %d not supported!\n", b, a); + exit(1); + } + if(c!=0) { + fprintf(stderr, "Compression mode %d not supported!\n", c); + exit(1); + } + if(f!=0) { + fprintf(stderr, "Filter mode %d not supported!\n", f); + exit(1); + } + if(i!=0) { + fprintf(stderr, "Interlace mode %d not supported!\n", i); + exit(1); + } + if(VERBOSE(2)) + printf("%dx%d %d %d %d %d %d\n",header->width, header->height, a,b,c,f,i); + header->bpp = a; + header->mode = b; + ok = 1; + } + + free(data); + } + return ok; +} + +typedef unsigned char byte; +#define ABS(a) ((a)>0?(a):(-(a))) +byte inline PaethPredictor (byte a,byte b,byte c) +{ + // a = left, b = above, c = upper left + int p = a + b - c; // initial estimate + int pa = ABS(p - a); // distances to a, b, c + int pb = ABS(p - b); + int pc = ABS(p - c); + // return nearest of a,b,c, + // breaking ties in order a,b,c. + if (pa <= pb && pa <= pc) + return a; + else if (pb <= pc) + return b; + else return c; +} + +void applyfilter3(int mode, U8*src, U8*old, U8*dest, int width) +{ + int x; + unsigned char lastr=0; + unsigned char lastg=0; + unsigned char lastb=0; + unsigned char upperlastr=0; + unsigned char upperlastg=0; + unsigned char upperlastb=0; + + if(mode==0) { + for(x=0;x No jpeg support compiled in"); + } +#endif + if(global.mkjpeg) { +#ifdef HAVE_JPEGLIB + RGBA*data = 0; + png_load(sname, &width, &height, (unsigned char**)&data); + if(!data) + exit(1); + if(swf_ImageHasAlpha(data, width, height)) { + t = swf_InsertTag(t, ST_DEFINEBITSJPEG3); + swf_SetU16(t, id); + swf_SetJPEGBits3(t, width,height,data,global.mkjpeg); + } else { + t = swf_InsertTag(t, ST_DEFINEBITSJPEG2); + swf_SetU16(t, id); + swf_SetJPEGBits2(t, width,height,data,global.mkjpeg); + } +#endif + } else { + RGBA*data = 0; + png_load(sname, &width, &height, (unsigned char**)&data); + if(!data) + exit(1); + t = swf_InsertTag(t, ST_DEFINEBITSLOSSLESS); + swf_SetU16(t, id); + swf_SetLosslessImage(t, data,width,height); + } + + t = swf_InsertTag(t, ST_DEFINESHAPE3); + + swf_ShapeNew(&s); + swf_GetMatrix(NULL, &m); + m.sx = (int)(20 * 0x10000); + m.sy = (int)(20 * 0x10000); + m.tx = 0; + m.ty = 0; + fs = swf_ShapeAddBitmapFillStyle(s, &m, id, 1); + + swf_SetU16(t, id + 1); // id + + r.xmin = r.ymin = 0; + r.xmax = width * 20; + r.ymax = height * 20; + swf_SetRect(t, &r); + + swf_SetShapeHeader(t, s); + + swf_ShapeSetAll(t, s, 0, 0, 0, fs, 0); + swf_ShapeSetLine(t, s, r.xmax, 0); + swf_ShapeSetLine(t, s, 0, r.ymax); + swf_ShapeSetLine(t, s, -r.xmax, 0); + swf_ShapeSetLine(t, s, 0, -r.ymax); + + swf_ShapeSetEnd(t); + + t = swf_InsertTag(t, ST_REMOVEOBJECT2); + swf_SetU16(t, 50); // depth + + t = swf_InsertTag(t, ST_PLACEOBJECT2); + + swf_GetMatrix(NULL, &m); + m.sx = (int)(0x10000 * global.scale); + m.sy = (int)(0x10000 * global.scale); + + if(custom_move) { + m.tx = move_x*20; + m.ty = move_y*20; + } else { + m.tx = (swf->movieSize.xmax - (int) (width * global.scale * 20)) / 2; + m.ty = (swf->movieSize.ymax - (int) (height * global.scale * 20)) / 2; + } + swf_ObjectPlace(t, id + 1, 50, &m, NULL, NULL); + + t = swf_InsertTag(t, ST_SHOWFRAME); + + return t; +} + + +int CheckInputFile(char *fname, char **realname) +{ + FILE *fi; + char *s = malloc(strlen(fname) + 5); + struct png_header head; + + if (!s) + exit(2); + (*realname) = s; + strcpy(s, fname); + + // Check whether file exists (with typical extensions) + + if ((fi = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.png", fname); + if ((fi = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.PNG", fname); + if ((fi = fopen(s, "rb")) == NULL) { + sprintf(s, "%s.Png", fname); + if ((fi = fopen(s, "rb")) == NULL) { + fprintf(stderr, "Couldn't open %s!\n", fname); + return -1; + } + } + } + } + + if(!png_read_header(fi, &head)) { + fprintf(stderr, "%s is not a PNG file!\n", fname); + return -1; + } + + if (global.max_image_width < head.width) + global.max_image_width = head.width; + if (global.max_image_height < head.height) + global.max_image_height = head.height; + + fclose(fi); + + return 0; +} + +int args_callback_option(char *arg, char *val) +{ + int res = 0; + if (arg[1]) + res = -1; + else + switch (arg[0]) { + case 'r': + if (val) + global.framerate = atof(val); + /* removed framerate>0 restriction in order to make + Flash Communication Server compatible SWFs */ + if ((global.framerate < 0) ||(global.framerate >= 256.0)) { + if (VERBOSE(1)) + fprintf(stderr, + "Error: You must specify a valid framerate between 1/256 and 255.\n"); + exit(1); + } + res = 1; + break; + + case 'o': + if (val) + global.outfile = val; + res = 1; + break; + + case 's': + global.scale = atof(val)/100; + res = 1; + break; + + case 'z': + if(global.version<6) + global.version = 6; + res = 0; + break; + + case 'j': + global.mkjpeg = atoi(val); + res = 1; + break; + + case 'T': + global.version = atoi(val); + res = 1; + break; + + case 'C': + global.do_cgi = 1; + break; + + case 'v': + global.verbose++; + res = 0; + break; + + case 'q': + global.verbose--; + if(global.verbose<0) + global.verbose = 0; + res = 0; + break; + + case 'X': + if (val) + global.force_width = atoi(val); + res = 1; + break; + + case 'Y': + if (val) + global.force_height = atoi(val); + res = 1; + break; + + case 'V': + printf("png2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + + case 'c': { + char*s = strdup(val); + char*x1 = strtok(s, ":"); + char*y1 = strtok(0, ":"); + char*x2 = strtok(0, ":"); + char*y2 = strtok(0, ":"); + if(!(x1 && y1 && x2 && y2)) { + fprintf(stderr, "-m option requires four arguments, :::\n"); + exit(1); + } + custom_clip = 1; + clip_x1 = atoi(x1); + clip_y1 = atoi(y1); + clip_x2 = atoi(x2); + clip_y2 = atoi(y2); + free(s); + + res = 1; + break; + } + + case 'm': { + char*s = strdup(val); + char*c = strchr(s, ':'); + if(!c) { + fprintf(stderr, "-m option requires two arguments, :\n"); + exit(1); + } + *c = 0; + custom_move = 1; + move_x = atoi(val); + move_y = atoi(c+1); + free(s); + + res = 1; + break; + } + + default: + res = -1; + break; + } + + if (res < 0) { + if (VERBOSE(1)) + fprintf(stderr, "Unknown option: -%s\n", arg); + exit(1); + return 0; + } + return res; +} + +static struct options_t options[] = { +{"r", "rate"}, +{"o", "output"}, +{"j", "jpeg"}, +{"z", "zlib"}, +{"T", "flashversion"}, +{"X", "pixel"}, +{"Y", "pixel"}, +{"v", "verbose"}, +{"q", "quiet"}, +{"C", "cgi"}, +{"V", "version"}, +{"s", "scale"}, +{0,0} +}; + +int args_callback_longoption(char *name, char *val) +{ + return args_long2shortoption(options, name, val); +} + +int args_callback_command(char *arg, char *next) // actually used as filename +{ + char *s; + if (CheckInputFile(arg, &s) < 0) { + if (VERBOSE(1)) + fprintf(stderr, "Error opening input file: %s\n", arg); + free(s); + } else { + image[global.nfiles].filename = s; + global.nfiles++; + if (global.nfiles >= MAX_INPUT_FILES) { + if (VERBOSE(1)) + fprintf(stderr, "Error: Too many input files.\n"); + exit(1); + } + } + return 0; +} + +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-X width] [-Y height] [-o file.swf] [-r rate] file1.png [file2.png...]\n", name); + printf("\n"); + printf("-r , --rate Set movie framerate (frames per second)\n"); + printf("-o , --output Set name for SWF output file.\n"); + printf("-j , --jpeg Generate a lossy jpeg bitmap inside the SWF, with a given quality (1-100)\n"); + printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); + printf("-T , --flashversion Set the flash version to generate\n"); + printf("-X , --pixel Force movie width to (default: autodetect)\n"); + printf("-Y , --pixel Force movie height to (default: autodetect)\n"); + printf("-v , --verbose Set verbose level (0=quiet, 1=default, 2=debug)\n"); + printf("-q , --quiet Omit normal log messages, only log errors\n"); + printf("-C , --cgi For use as CGI- prepend http header, write to stdout\n"); + printf("-V , --version Print version information and exit\n"); + printf("-s , --scale Scale image to %% size.\n"); + printf("\n"); +} + +int main(int argc, char **argv) +{ + SWF swf; + TAG *t; + + memset(&global, 0x00, sizeof(global)); + + global.framerate = 1.0; + global.verbose = 1; + global.version = 8; + global.scale = 1.0; + + processargs(argc, argv); + + if(global.nfiles<=0) { + fprintf(stderr, "No png files found in arguments\n"); + return 1; + } + + if (VERBOSE(2)) + fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); + + t = MovieStart(&swf, global.framerate, + global.force_width ? global.force_width : (int)(global.max_image_width*global.scale), + global.force_height ? global.force_height : (int)(global.max_image_height*global.scale)); + + { + int i; + for (i = 0; i < global.nfiles; i++) { + if (VERBOSE(3)) + fprintf(stderr, "[%03i] %s\n", i, + image[i].filename); + t = MovieAddFrame(&swf, t, image[i].filename, (i * 2) + 1); + free(image[i].filename); + } + } + + MovieFinish(&swf, t, global.outfile); + + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbbox b/fluidbook/tools/swftools-special-swfdump/src/swfbbox new file mode 100644 index 000000000..097890b6d Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfbbox differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 b/fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 new file mode 100644 index 000000000..636a3b101 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 @@ -0,0 +1,47 @@ +.TH swfbbox "1" "April 2009" "swfbbox" "swftools" +.SH NAME +swfbbox - Tool for playing around with SWF bounding boxes. + +.SH Synopsis +.B swfbbox [-OS] file.swf + +.SH DESCRIPTION +This tool can, among others, recalculate some bounding boxes of SWFs +in order to speed them up or make them smaller. +.PP +It can also dump the corners of the bounding boxes of all frames of a movie. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print help and exit +.TP +\fB\-b\fR, \fB\-\-bbox\fR + Show movie bounding box (default) +.TP +\fB\-B\fR, \fB\-\-newbbox\fR + Show recalculated (optimized/expanded) bounding box +.TP +\fB\-e\fR, \fB\-\-expand\fR + Write out a new file using the recalculated header bounding box +.TP +\fB\-O\fR, \fB\-\-optimize\fR + Recalculate all object bounding boxes (except for the header) +.TP +\fB\-S\fR, \fB\-\-swifty\fR + Print out transformed bounding boxes +.TP +\fB\-c\fR, \fB\-\-clip\fR + Clip bounding boxes to movie size +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Set output filename to \fIfilename\fR (for -O) +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be more verbose +.TP +\fB\-V\fR, \fB\-\-version\fR + Print program version and exit +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbbox.c b/fluidbook/tools/swftools-special-swfdump/src/swfbbox.c new file mode 100644 index 000000000..9eafc24a6 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfbbox.c @@ -0,0 +1,702 @@ +/* swfbbox.c + Tool for playing around with SWF bounding boxes. + + Part of the swftools package. + + Copyright (c) 2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "../config.h" +#include +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" +#include "../lib/log.h" + +static char * filename = 0; +static char * outfilename = "output.swf"; +static int optimize = 0; +static int swifty = 0; +static int verbose = 0; +static int showbbox = 0; +static int showorigbbox = 1; +static int expand = 0; +static int clip = 0; +static int checkclippings = 0; + +static struct options_t options[] = { +{"h", "help"}, +{"b", "bbox"}, +{"B", "newbbox"}, +{"e", "expand"}, +{"O", "optimize"}, +{"S", "swifty"}, +{"c", "clip"}, +{"o", "output"}, +{"v", "verbose"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfbbox - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "b")) { + showorigbbox = 2; + if(showbbox == 1) showbbox = 0; + return 0; + } + else if(!strcmp(name, "B")) { + showbbox = 2; + return 0; + } + else if(!strcmp(name, "O")) { + optimize = 1; + if(showorigbbox == 1) showorigbbox = 0; + return 0; + } + else if(!strcmp(name, "S")) { + swifty = 1; + if(showorigbbox == 1) showorigbbox = 0; + return 0; + } + else if(!strcmp(name, "c")) { + if(showorigbbox == 1) showorigbbox = 0; + clip = 1; + return 0; + } + else if(!strcmp(name, "v")) { + verbose ++; + return 0; + } + else if(!strcmp(name, "q")) { + if(verbose) + verbose --; + return 0; + } + else if(!strcmp(name, "Q")) { + /* DEPRECATED- was used for testing the bbox-clip feature + of pdf2swf */ + if(showorigbbox == 1) showorigbbox = 0; + checkclippings = 1; + return 0; + } + else if(!strcmp(name, "e")) { + expand = 1; + return 0; + } + else if(!strcmp(name, "o")) { + outfilename = val; + return 1; + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-OS] file.swf\n", name); + printf("\n"); + printf("-h , --help Print help and exit\n"); + printf("-b , --bbox Show movie bounding box (default)\n"); + printf("-B , --newbbox Show recalculated (optimized/expanded) bounding box\n"); + printf("-e , --expand Write out a new file using the recalculated header bounding box\n"); + printf("-O , --optimize Recalculate all object bounding boxes (except for the header)\n"); + printf("-S , --swifty Print out transformed bounding boxes\n"); + printf("-c , --clip Clip bounding boxes to movie size\n"); + printf("-o , --output Set output filename to (for -O)\n"); + printf("-v , --verbose Be more verbose\n"); + printf("-V , --version Print program version and exit\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +#define swf_ResetReadBits(tag) if (tag->readBit) { tag->pos++; tag->readBit = 0; } + +void swf_Shape2Optimize(SHAPE2*shape) +{ + if(!shape->bbox) + shape->bbox = malloc(sizeof(SRECT)); + *(shape->bbox) = swf_GetShapeBoundingBox(shape); +} + +/* + {char {x1 y1 x2 y2 x3 y3 x4 y4]] +*/ + +SRECT bboxes[65536]; +U16 depth2id[65536]; +char*depth2name[65536]; + +int hasid(TAG*tag) +{ + if(tag->id == ST_PLACEOBJECT) + return 1; + if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 2)) + return 1; + if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 2)) + return 1; + return 0; +} + +int hasname(TAG*tag) +{ + if(tag->id == ST_PLACEOBJECT) + return 0; + if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 0x20)) + return 1; + if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 0x20)) + return 1; + return 0; +} + +char* getname(TAG*tag) +{ + if(tag->id == ST_PLACEOBJECT) + return 0; + if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 0x20)) { + SWFPLACEOBJECT o; + tag->pos = 0;tag->readBit = 0; + swf_GetPlaceObject(tag, &o); + return o.name; + } + if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 0x20)) { + SWFPLACEOBJECT o; + tag->pos = 0;tag->readBit = 0; + swf_GetPlaceObject(tag, &o); + return o.name; + } + return 0; +} + +MATRIX getmatrix(TAG*tag) +{ + SWFPLACEOBJECT o; + tag->pos = 0;tag->readBit = 0; + swf_GetPlaceObject(tag, &o); + return o.matrix; +} + + +static int fontnum = -1; +static SWFFONT**fonts; +static SWF*c_swf; +static void fontcallback1(void*self, U16 id,U8 * name) +{ fontnum++; +} +static void fontcallback2(void*self, U16 id,U8 * name) +{ + fonts[fontnum] = 0; + swf_FontExtract(c_swf,id,&fonts[fontnum]); + if(verbose) { + if(fonts[fontnum]) printf("Extracting font %d (%s)\n", id, name); + else printf("Extracting font %d (%s) failed\n", id, name); + fflush(stdout); + } + fontnum++; +} +typedef struct _textbounds +{ + SRECT r; + MATRIX m; // character transform matrix +} textbounds_t; + +typedef struct _placement +{ + SWFPLACEOBJECT* po; + int num; +} placement_t; + +static placement_t* placements; + +static placement_t* readPlacements(SWF*swf) +{ + placement_t* p = (placement_t*)rfx_calloc(sizeof(placement_t)*65536); + TAG*tag = swf->firstTag; + while(tag) { + if(swf_isPlaceTag(tag)) { + SWFPLACEOBJECT*po = rfx_alloc(sizeof(SWFPLACEOBJECT)); + int id; + swf_GetPlaceObject(tag, po); + id = po->id; + if(po->move) { + fprintf(stderr, "MOVE tags not supported with -c"); + } + p[id].po = po; + p[id].num++; + } + tag = tag->next; + } + + return p; +} + +static void freePlacements(placement_t*p) +{ + int t; + for(t=0;t<65536;t++) { + if(p[t].po) { + swf_PlaceObjectFree(p[t].po); p[t].po = 0; + } + } + rfx_free(p); +} + +static SRECT clipBBox(TAG*tag, SRECT mbbox, SRECT r) +{ + int id = swf_GetDefineID(tag); + MATRIX m; + if(!placements[id].po) { + if(verbose) + printf("Id %d is never set\n", id); + return r; + } + if(placements[id].num>1) { + if(verbose) + printf("Id %d is set more than once\n", id); + return r; + } + m = placements[id].po->matrix; + if(m.r0 || m.r1) { + fprintf(stderr, "Rotating PLACEOBJECTS are not supported with -c\n"); + return r; + } + + if(verbose) { + printf("ID %d\n", id); + swf_DumpMatrix(stdout, &m); + } + mbbox.xmin -= m.tx; + mbbox.ymin -= m.ty; + mbbox.xmax -= m.tx; + mbbox.ymax -= m.ty; + mbbox.xmin *= 65536.0/m.sx; + mbbox.xmax *= 65536.0/m.sx; + mbbox.ymin *= 65536.0/m.sy; + mbbox.ymax *= 65536.0/m.sy; + + if(verbose) { + printf("border: %f/%f/%f/%f - rect: %f/%f/%f/%f\n", + mbbox.xmin /20.0, + mbbox.ymin /20.0, + mbbox.xmax /20.0, + mbbox.ymax /20.0, + r.xmin /20.0, + r.ymin /20.0, + r.xmax /20.0, + r.ymax /20.0); + } + + if(checkclippings) { + int clip = 0; + if(r.xmax > mbbox.xmax) clip += r.xmax - mbbox.xmax; + if(r.ymax > mbbox.ymax) clip += r.ymax - mbbox.ymax; + if(r.xmax < mbbox.xmin) clip += -(r.xmax - mbbox.xmin); + if(r.ymax < mbbox.ymin) clip += -(r.ymax - mbbox.ymin); + + if(r.xmin > mbbox.xmax) clip += r.xmin = mbbox.xmax; + if(r.ymin > mbbox.ymax) clip += r.ymin = mbbox.ymax; + if(r.xmin < mbbox.xmin) clip += -(r.xmin = mbbox.xmin); + if(r.ymin < mbbox.ymin) clip += -(r.ymin = mbbox.ymin); + if(clip > 3*20) { + printf("needs clipping: [%.2f %.2f %2.f %2.f] is outside [%.2f %2.f %2.f %2.f]\n", + r.xmin / 20.0, r.ymin / 20.0, r.xmax / 20.0, r.ymax / 20.0, + mbbox.xmin / 20.0, mbbox.ymin / 20.0, mbbox.xmax / 20.0, mbbox.ymax / 20.0 + ); + } + } + + r = swf_ClipRect(mbbox, r); + + if(verbose) { + printf("new rect: %f/%f/%f/%f\n", + r.xmin /20.0, + r.ymin /20.0, + r.xmax /20.0, + r.ymax /20.0); + } + + return r; +} + + +static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, + int xstart, int ystart, RGBA* color) +{ + textbounds_t * bounds = (textbounds_t*)self; + SWFFONT*font = 0; + int t; + for(t=0;tid == fontid) { + font = fonts[t]; + break; + } + } + if(!font) { + fprintf(stderr, "Font %d unknown\n", fontid); + exit(1); + } + if(!font->layout) { + /* This is an expensive operation- but what should we do, we + need the glyph's bounding boxes */ + swf_FontCreateLayout(font); + } + + if(verbose) + printf("%d chars, font %d, size %d, at (%d,%d)\n", nr, fontid, fontsize, xstart, ystart); + + for(t=0;tlayout->bounds[chars[t]]; + MATRIX m = bounds->m; + SPOINT p; + + if(chars[t] < font->numchars && font->glyph2ascii) { + ch = font->glyph2ascii[chars[t]]; + } + + p.x = x; p.y = y; + p = swf_TurnPoint(p, &m); + + m.sx = (m.sx * fontsize) / 1024; + m.sy = (m.sy * fontsize) / 1024; + m.r0 = (m.r0 * fontsize) / 1024; + m.r1 = (m.r1 * fontsize) / 1024; + + m.tx += p.x; + m.ty += p.y; + newglyphbbox = swf_TurnRect(glyphbbox, &m); + + if(ch<32) ch='?'; + + swf_ExpandRect2(&(bounds->r), &newglyphbbox); + if(verbose >= 2) { + printf("%5d %c, %d %d %d %d (%d %d %d %d) -> %d %d %d %d\n", + xpos[t], ch, + glyphbbox.xmin, glyphbbox.ymin, glyphbbox.xmax, glyphbbox.ymax, + newglyphbbox.xmin, newglyphbbox.ymin, newglyphbbox.xmax, newglyphbbox.ymax, + bounds->r.xmin, bounds->r.ymin, bounds->r.xmax, bounds->r.ymax); + } + + } +} + +static void swf_OptimizeBoundingBoxes(SWF*swf) +{ + TAG* tag = swf->firstTag; + + while (tag) { + if (tag->id == ST_DEFINESHAPE || + tag->id == ST_DEFINESHAPE2 || + tag->id == ST_DEFINESHAPE3 || + tag->id == ST_DEFINESHAPE4) { + SHAPE2 s; + if(verbose) printf("%s\n", swf_TagGetName(tag)); + swf_ParseDefineShape(tag, &s); + if(optimize) + swf_Shape2Optimize(&s); + tag->len = 2; + tag->pos = 0; + if(!s.bbox) { + fprintf(stderr, "Internal error (5)\n"); + exit(1); + } + if(clip || checkclippings) { + *s.bbox = clipBBox(tag, swf->movieSize, *s.bbox); + } + swf_SetShape2(tag, &s); + } + if (tag->id == ST_DEFINETEXT || tag->id == ST_DEFINETEXT2) { + SRECT oldbox; + int matrix_offset; + int len; + U8*data; + textbounds_t bounds; + if(verbose) printf("%s\n", swf_TagGetName(tag)); + if(fontnum < 0) { + if(verbose) printf("Extracting fonts...\n"); + c_swf = swf; + fontnum = 0; + swf_FontEnumerate(swf,&fontcallback1,0); + fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); + memset(fonts, 0, fontnum*sizeof(SWFFONT*)); + fontnum = 0; + swf_FontEnumerate(swf,&fontcallback2,0); + } + + memset(&bounds, 0, sizeof(bounds)); + + swf_SetTagPos(tag, 0); + swf_GetU16(tag); + swf_GetRect(tag,&oldbox); + swf_ResetReadBits(tag); + matrix_offset = tag->pos; + swf_GetMatrix(tag,&bounds.m); + swf_ParseDefineText(tag, textcallback, &bounds); + if(verbose) { + printf("\n"); + swf_DumpMatrix(stdout, &bounds.m); + printf("old: %d %d %d %d\n", oldbox.xmin, oldbox.ymin, oldbox.xmax, oldbox.ymax); + printf("new: %d %d %d %d\n", bounds.r.xmin, bounds.r.ymin, bounds.r.xmax, bounds.r.ymax); + } + if(!optimize) + bounds.r = oldbox; //set to old bounds from the tag header + if(clip || checkclippings) { + bounds.r = clipBBox(tag, swf->movieSize, bounds.r); + } + + /* now comes the tricky part: + we have to fiddle the data back in + thank heavens that the bbox is follow by a matrix + struct, which always starts on a byte boundary. + */ + len = tag->len - matrix_offset; + data = malloc(len); + memcpy(data, &tag->data[matrix_offset], len); + tag->writeBit = 0; + tag->len = 2; + swf_SetRect(tag, &bounds.r); + swf_SetBlock(tag, data, len); + free(data); + tag->pos = tag->readBit = 0; + } + tag = tag->next; + } +} + +static void showSwiftyOutput(SWF*swf) +{ + TAG*tag = swf->firstTag; + int frame=0; + printf("{\n\t{frame %d}\n", frame++); + + while (tag) { + if (tag->id == ST_SHOWFRAME) { + printf("}\n{\n\t{frame %d}\n", frame++); + } + if (swf_isPlaceTag(tag)) { + if(hasid(tag)) { + depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); + } + if(hasname(tag)) { + depth2name[swf_GetDepth(tag)] = getname(tag); + } + } + if (swf_isPlaceTag(tag)) { + MATRIX m = getmatrix(tag); + U16 id = depth2id[swf_GetDepth(tag)]; + char*name = depth2name[swf_GetDepth(tag)]; + char buf[40]; + SRECT bbox = bboxes[id]; + SPOINT p1,p2,p3,p4; + p1.x = bbox.xmin; p1.y = bbox.ymin; + p2.x = bbox.xmax; p2.y = bbox.ymin; + p3.x = bbox.xmin; p3.y = bbox.ymax; + p4.x = bbox.xmax; p4.y = bbox.ymax; + p1 = swf_TurnPoint(p1, &m); + p2 = swf_TurnPoint(p2, &m); + p3 = swf_TurnPoint(p3, &m); + p4 = swf_TurnPoint(p4, &m); + if(!name) { + sprintf(buf, "ID%d", id);name = buf; + } + //printf("\t#%.4f %.4f %.4f %.4f | %.4f %.4f\n", m.sx/65536.0, m.r1/65536.0, m.r0/65536.0, m.sy/65536.0, m.tx/20.0, m.ty/20.0); + printf("\t{%s {%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f}}\n", name, + p1.x/20.0, p1.y/20.0, p2.x/20.0, p2.y/20.0, + p3.x/20.0, p3.y/20.0, p4.x/20.0, p4.y/20.0); + } + tag = tag->next; + } + printf("}\n"); +} +static SRECT getMovieClipBBox(TAG*tag) +{ + //TAG*tag = swf->firstTag; + int frame=0; + SRECT movieSize; + U16 depth2id[65536]; + memset(depth2id, 0, sizeof(depth2id)); + + memset(&movieSize,0,sizeof(SRECT)); + + while (tag && tag->id != ST_END) { + if (swf_isPlaceTag(tag)) { + if(hasid(tag)) { + depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); + } + } + if (swf_isPlaceTag(tag)) { + MATRIX m = getmatrix(tag); + U16 id = depth2id[swf_GetDepth(tag)]; + SRECT bbox = bboxes[id]; + + SRECT tbbox = swf_TurnRect(bbox, &m); + swf_ExpandRect2(&movieSize, &tbbox); + } + tag = tag->next; + } + return movieSize; +} + +static SRECT getSWFBBox(SWF*swf) +{ + SRECT movieSize = getMovieClipBBox(swf->firstTag); + + return movieSize; +} + +int main (int argc,char ** argv) +{ + TAG*tag; + SWF swf; + int fi; + SRECT oldMovieSize; + SRECT newMovieSize; + memset(bboxes, 0, sizeof(bboxes)); + memset(depth2name, 0, sizeof(depth2name)); + + processargs(argc, argv); + initLog(0,0,0,0,0,verbose?LOGLEVEL_DEBUG:LOGLEVEL_WARNING); + + if(!filename) { + fprintf(stderr, "You must supply a filename.\n"); + return 1; + } + + fi = open(filename,O_RDONLY|O_BINARY); + + if (fi<0) + { + perror("Couldn't open file: "); + exit(1); + } + if FAILED(swf_ReadSWF(fi,&swf)) + { + fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); + close(fi); + exit(1); + } + close(fi); + + swf_OptimizeTagOrder(&swf); + + if(clip || checkclippings) { + placements = readPlacements(&swf); + } + + swf_FoldAll(&swf); + + /* Optimize bounding boxes in case -O flag was set */ + if(optimize || checkclippings || clip) { + swf_OptimizeBoundingBoxes(&swf); + } + + /* Create an ID to Bounding Box table */ + tag = swf.firstTag; + while (tag) { + if(swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + if(tag->id != ST_DEFINESPRITE) { + bboxes[id] = swf_GetDefineBBox(tag); + } else { + swf_UnFoldSprite(tag); + bboxes[id] = getMovieClipBBox(tag); + swf_FoldSprite(tag); + if(verbose) { + printf("sprite %d is %.2fx%.2f\n", id, + (bboxes[id].xmax - bboxes[id].xmin)/20.0, + (bboxes[id].ymax - bboxes[id].ymin)/20.0); + } + } + } + tag = tag->next; + } + + /* Create an ID->Bounding Box table for all bounding boxes */ + if(swifty) { + showSwiftyOutput(&swf); + } + + oldMovieSize = swf.movieSize; + newMovieSize = getSWFBBox(&swf); + + if(optimize || expand) { + + if(expand) + swf.movieSize = newMovieSize; + + fi = open(outfilename, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); + if(swf_WriteSWF(fi, &swf) < 0) { + fprintf(stderr, "Error writing file %s", outfilename); + close(fi); + exit(1); + } + close(fi); + } + + if(showbbox) { + if(verbose>=0) + printf("Real Movie Size (size of visible objects): "); + printf("%.2f x %.2f :%.2f :%.2f\n", + (newMovieSize.xmax-newMovieSize.xmin)/20.0, + (newMovieSize.ymax-newMovieSize.ymin)/20.0, + (newMovieSize.xmin)/20.0, + (newMovieSize.ymin)/20.0 + ); + } + if(showorigbbox) { + if(verbose>=0) + printf("Movie Size accordings to file header: "); + printf("%.2f x %.2f :%.2f :%.2f\n", + (oldMovieSize.xmax-oldMovieSize.xmin)/20.0, + (oldMovieSize.ymax-oldMovieSize.ymin)/20.0, + (oldMovieSize.xmin)/20.0, + (oldMovieSize.ymin)/20.0 + ); + } + + swf_FreeTags(&swf); + + if(placements) { + freePlacements(placements); + } + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbytes b/fluidbook/tools/swftools-special-swfdump/src/swfbytes new file mode 100644 index 000000000..7f2b7f918 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfbytes differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 b/fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 new file mode 100644 index 000000000..ae14406c7 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 @@ -0,0 +1,26 @@ +.TH swfbytes "1" "August 2009" "swfbytes" "swftools" +.SH NAME +swfbytes - Tool for simplifying the hex-editing of SWF files. + +.SH Synopsis +.B swfbytes [-v] file.swf > file.hexdump +.PP +.B swfbytes file.hexdump + +.SH DESCRIPTION +With this tool and a text editor, you can perform some basic +editing operations on SWF files. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print help and exit +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be more verbose +.TP +\fB\-V\fR, \fB\-\-version\fR + Print program version and exit +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbytes.c b/fluidbook/tools/swftools-special-swfdump/src/swfbytes.c new file mode 100644 index 000000000..b747365d5 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfbytes.c @@ -0,0 +1,385 @@ +/* swfbytes.c + A tool for modifying swfs on the tag level + + Part of the swftools package. + + Copyright (c) 2008/2009 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "../config.h" +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" + +static char * filename = 0; +static int verbose; +static char* output_filename = "output.swf"; + +static struct options_t options[] = { +{"h", "help"}, +{"v", "verbose"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfedit - part of %s %s\n", PACKAGE, VERSION); + return 0; + } else if(!strcmp(name, "v")) { + verbose++; + return 0; + } else if(!strcmp(name, "o")) { + output_filename = val; + return 1; + } else { + printf("Unknown option: -%s\n", name); + return 0; + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-v] file.swf > file.hexdump\n", name); + printf("OR: %s file.hexdump\n", name); + printf("\n"); + printf("-h , --help Print help and exit\n"); + printf("-v , --verbose Be more verbose\n"); + printf("-V , --version Print program version and exit\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", filename, name); + } + filename = name; + return 0; +} + +void dumpTag(FILE*fo, char*prefix, TAG*tag) +{ + int t; + for(t=0;tlen;t++) { + if(!(t&15)) + fprintf(fo, "%s| ", prefix); + fprintf(fo, "%02x ", tag->data[t]); + if((t && ((t&15)==15)) || (t==tag->len-1)) { + fprintf(fo, "\n"); + } + } +} + +void dumpFile(SWF*swf, FILE*fo) +{ + TAG* tag = swf->firstTag; + int indent = 0; + int t; + char whitespace[33]; + char*prefix = ""; + + memset(whitespace, 32, 32); whitespace[32] = 0; + + fprintf(fo, "Version: %d\n", swf->fileVersion); + fprintf(fo, "FrameRate: %f\n",swf->frameRate/256.0); + fprintf(fo, "FrameCount: %d\n",swf->frameCount); + fprintf(fo, "Width: %.2f\n",(swf->movieSize.xmax-swf->movieSize.xmin)/20.0); + fprintf(fo, "X-Offset: %.2f\n", swf->movieSize.xmin/20.0); + fprintf(fo, "Height: %.2f\n",(swf->movieSize.ymax-swf->movieSize.ymin)/20.0); + fprintf(fo, "Y-Offset: %.2f\n", swf->movieSize.ymin/20.0); + fprintf(fo, "\n"); + + while(tag) + { + if(swf_isDefiningTag(tag)) { + fprintf(fo, "%s%s <%d>\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); + swf_SetTagPos(tag, 2); + dumpTag(fo, prefix, tag); + } else if(swf_isPseudoDefiningTag(tag)) { + fprintf(fo, "%s%s <%d>\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); + swf_SetTagPos(tag, 2); + dumpTag(fo, prefix, tag); + } else if(tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + SWFPLACEOBJECT po; + swf_GetPlaceObject(tag, &po); + fprintf(fo, "%s%s <%d>\n", prefix,swf_TagGetName(tag), po.id); + /* for now */ + swf_SetTagPos(tag, 0); + dumpTag(fo, prefix, tag); + swf_PlaceObjectFree(&po); + } else { + fprintf(fo, "%s%s\n", prefix, swf_TagGetName(tag)); + dumpTag(fo, prefix, tag); + } + + if(tag->id == ST_DEFINESPRITE) { + indent+=4; + if(indent>32) + indent = 32; + prefix = &whitespace[32-indent]; + } else if(tag->id == ST_END) { + indent-=4; + if(indent<0) + indent = 0; + prefix = &whitespace[32-indent]; + } + + tag = tag->next; + } +} + +static void readline(FILE*fi, char*line, int maxlen) { + int pos = 0; + while(!feof(fi)) { + if(!fread(&line[pos],1,1,fi)) + break; + + /* cut of preceding whitespace */ + if(pos == 0 && (line[0] == 32 || line[0] == '\t')) + continue; + + if(line[pos] == 13 || line[pos]==10) + break; + if(pos=1 && (line[pos-1]==32 || line[pos-1]==9)) { + pos--; + line[pos]=0; + } +} + +int getFloat(char*s) +{ + float x; + int n; + while(*s==32 || *s=='\t') s++; + sscanf(s, "%f%n", &x, &n); + if(n==0) + fprintf(stderr, "Not a float: %s\n", s); + return x; +} +int getInt(char*s) +{ + int i; + int n; + while(*s==32 || *s=='\t') s++; + sscanf(s, "%d%n", &i, &n); + if(n==0) + fprintf(stderr, "Not an integer: %s\n", s); + return i; +} +int getTwip(char*x) +{ + return (int)(getFloat(x)*20); +} + + +static char**lookup; +int swf_TagNameToID(char*name) +{ + int t; + TAG tag; + memset(&tag, 0, sizeof(tag)); + if(!lookup) { + lookup = (char**)malloc(sizeof(char*)*65536); + for(t=0;t<65536;t++) { + tag.id = t; + lookup[t] = swf_TagGetName(&tag); + } + } + for(t=0;t<65536;t++) { + if(lookup[t] && !strcasecmp(name, lookup[t])) + return t; + } + fprintf(stderr, "Not a tag name: \"%s\"\n", name); + return -1; +} + +void parseFile(FILE*fi, SWF*swf) +{ + TAG*tag = 0; + char line[1024]; + memset(swf, 0, sizeof(SWF)); + while(1) { + char*colon = 0; + readline(fi, line, 1024); + if(!line[0]) + break; + colon = strchr(line, ':'); + if(colon) { + int num = colon - line; + int n; + if(num == 9 && !strncmp(line, "FrameRate", num)) { + swf->frameRate = getFloat(colon+1)*256; + } else if(num == 10 && !strncmp(line, "FrameCount", num)) { + swf->frameCount = getInt(colon+1); + } else if(num == 7 && !strncmp(line, "Version", num)) { + swf->fileVersion = getInt(colon+1); + } else if(num == 5 && !strncmp(line, "Width", num)) { + int width = getTwip(colon+1); + swf->movieSize.xmax += width; + } else if(num == 6 && !strncmp(line, "Height", num)) { + int height = getTwip(colon+1); + swf->movieSize.ymax += height; + } else if(num == 8 && !strncmp(line, "X-Offset", num)) { + int xoffset = getTwip(colon+1); + swf->movieSize.xmin += xoffset; + swf->movieSize.xmax += xoffset; + } else if(num == 8 && !strncmp(line, "Y-Offset", num)) { + int yoffset = getTwip(colon+1); + swf->movieSize.ymin += yoffset; + swf->movieSize.ymax += yoffset; + } else { + fprintf(stderr, "Ignored line \"%s\"\n", line); + } + } + } + while(!feof(fi)) { + char*s, *tagname; + char*br; + readline(fi, line, 1024); + if(!line[0]) + continue; + s = strchr(line, ' '); + br = strchr(line, '|'); + if(!br) { + int id = 0; + /* DEFINESHAPE ... type line */ + if(!s) { + tagname = strdup(line); + } else { + tagname = strdup(line); + tagname[s-line] = 0; + } + id = swf_TagNameToID(tagname); + free(tagname); + if(id<0) { + fprintf(stderr, "Ignored line \"%s\"\n", line); + continue; + } + tag = swf_InsertTag(tag, id); + if(!swf->firstTag) + swf->firstTag = tag; + } else { + /* | 00 34 fe c7 ... type line */ + char*p = line; + int num = 0; + int digits = 0; + + if(!tag) { + fprintf(stderr, "Discarded unassignable data %s\n", line); + continue; + } + + while(*p) { + int n = 0; + if((*p>='a' && *p<='f') || + (*p>='A' && *p<='F')) { + n = 9 + (*p & 15); + num = (num<<4) | n; + digits++; + } + else if(*p>='0' && *p<='9') { + n = *p & 15; + num = (num<<4) | n; + digits++; + } else if(digits) { + swf_SetU8(tag, num); + num = 0; + digits = 0; + } + p++; + } + if(digits) + swf_SetU8(tag, num); + } + } +} + +char swf_IsSWF(char*filename) +{ + int fi = open(filename,O_RDONLY|O_BINARY); + U8 buf[3] = {0,0,0}; + if(fi<0) + return 0; + read(fi, buf, 3); + close(fi); + if((buf[0] == 'F' || buf[0] == 'C') && buf[1] == 'W' && buf[2] == 'S') + return 1; + return 0; +} + +int main (int argc,char ** argv) +{ + int fi; + TAG*tag = 0; + SWF swf; + + processargs(argc, argv); + + if(!filename) { + fprintf(stderr, "You must supply a filename.\n"); + return -1; + } + if(swf_IsSWF(filename)) { + fi = open(filename,O_RDONLY|O_BINARY); + if (fi<0) { + perror("Couldn't open file: "); + exit(1); + } + if FAILED(swf_ReadSWF(fi,&swf)) { + fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); + close(fi); + exit(1); + } + dumpFile(&swf, stdout); + swf_FreeTags(&swf); + } else { + SWF newswf; + FILE*fi = fopen(filename, "rb"); + parseFile(fi, &newswf); + fclose(fi); + int f; + char*sname = output_filename; + f = open(sname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&newswf)) { + fprintf(stderr, "Unable to write output file: %s\n", sname); + } + close(f); + } + + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc b/fluidbook/tools/swftools-special-swfdump/src/swfc new file mode 100644 index 000000000..35540d087 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfc differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c b/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c new file mode 100644 index 000000000..51c5663ed --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c @@ -0,0 +1,48 @@ +/* swfc- Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2007 Huub Schaeks + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "swfc-feedback.h" + +void syntaxerror(char*format, ...) +{ + char buf[1024]; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + fprintf(stderr, "\"%s\", line %d column %d: error- %s\n", filename, line, column, buf); + if (cleanUp) + cleanUp(); + exit(1); +} + +void warning(char*format, ...) +{ + char buf[1024]; + va_list arglist; + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + fprintf(stderr, "\"%s\", line %d column %d: warning- %s\n", filename, line, column, buf); +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h b/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h new file mode 100644 index 000000000..6196ea1c8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h @@ -0,0 +1,33 @@ +/* swfc- Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2007 Huub Schaeks + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __FEEDBACK_H +#define __FEEDBACK_H + +char* filename; +int line; +int column; +void (*cleanUp)(); + +void syntaxerror(char*format, ...); +void warning(char*format, ...); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-history.c b/fluidbook/tools/swftools-special-swfdump/src/swfc-history.c new file mode 100644 index 000000000..d97605397 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc-history.c @@ -0,0 +1,1162 @@ +/* swfc- Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2007 Huub Schaeks + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "swfc-history.h" + +enum +{ + T_BEFORE, + T_AFTER, + T_SYMMETRIC +}; + +state_t* state_new(U16 frame, int function, float value, interpolation_t* inter) +{ + state_t* newState = (state_t*)malloc(sizeof(state_t)); + state_init(newState); + newState->frame = frame; + newState->function = function; + newState->value = value; + newState->interpolation = inter; + return newState; +} + +void state_free(state_t* state) +{ + if (state->next) + state_free(state->next); + free(state); +} + +void state_init(state_t* state) +{ + memset(state, 0, sizeof(state_t)); +} + +state_t* state_at(state_t* state, U16 frame) +{ + while (state->next && state->next->frame < frame) + state = state->next; + return state; +} + +void state_append(state_t* state, state_t* newState) +{ + state_t* previous = 0; + state_t* start = state; + float p0, p1, m0, m1; + int previous_frames = 0, state_frames, new_frames; + + while (state->next) + { + if (previous) + previous_frames = state->frame - previous->frame; + previous = state; + state = state->next; + } + state->next = newState; + new_frames = newState->frame - state->frame; + if (state->function == CF_SCHANGE) + { + state_frames = state->frame - previous->frame; + p0 = previous->value; + p1 = state->value; + if (previous->function == CF_SCHANGE) + m0 = (3 * previous->spline.a + 2 * previous->spline.b + previous->spline.c) * state_frames / previous_frames ; + else + if (previous->function == CF_CHANGE || previous->function == CF_SWEEP) + m0 = state_tangent(start, previous->frame, T_BEFORE) * state_frames; + else + m0 = (state->value - previous->value); + if (newState->function == CF_SCHANGE) + m1 = /*0.5 * */(newState->value - previous->value) * state_frames / (new_frames + state_frames); + else + if (newState->function == CF_CHANGE || newState->function == CF_SWEEP) + m1 = state_tangent(previous, state->frame, T_AFTER) * state_frames; + else + m1 = (newState->value - state->value); + state->spline.a = 2 * p0 + m0 - 2 * p1 + m1; + state->spline.b = -3 * p0 - 2 * m0 + 3 * p1 - m1; + state->spline.c = m0; + state->spline.d = p0; +// printf("p0: %f, p1: %f, m0: %f, m1: %f.\n", p0, p1, m0, m1); +// printf("a: %f, b: %f, c: %f, d: %f.\n", state->spline.a, state->spline.b, state->spline.c, state->spline.d); + } + if (newState->function == CF_SCHANGE) + { + p0 = state->value; + p1 = newState->value; + if (state->function == CF_SCHANGE) + m0 = m1; + else + if (state->function == CF_CHANGE || state->function == CF_SWEEP) + m0 = state_tangent(start, state->frame, T_BEFORE) * new_frames; + else + m0 = (newState->value - state->value); + m1 = (newState->value - state->value); + newState->spline.a = 2 * p0 + m0 - 2 * p1 + m1; + newState->spline.b = -3 * p0 - 2 * m0 + 3 * p1 - m1; + newState->spline.c = m0; + newState->spline.d = p0; +// printf("p0: %f, p1: %f, m0: %f, m1: %f.\n", p0, p1, m0, m1); +// printf("a: %f, b: %f, c: %f, d: %f.\n", newState->spline.a, newState->spline.b, newState->spline.c, newState->spline.d); + } + } + +void state_insert(state_t* state, state_t* newState) +{ + while (state->next && state->next->frame < newState->frame) + state = state->next; + newState->next = state->next; + state->next = newState; + // if this is going to be used to insert CF_SCHANGE states it will have to be extended + // as in state_append above. I know this is not necessary right now, so I'll be lazy. +} + +float calculateSpline(state_t* modification, float fraction) +{ + spline_t s = modification->spline; + return (((s.a * fraction) + s.b) * fraction + s.c) * fraction + s.d; +} + +float interpolateScalar(float p1, float p2, float fraction, interpolation_t* inter) +{ + if (!inter) + return linear(fraction, p1, p2 - p1); + switch (inter->function) + { + case IF_LINEAR: return linear(fraction, p1, p2 - p1); + case IF_QUAD_IN: return quadIn(fraction, p1, p2 - p1, inter->slope); + case IF_QUAD_OUT: return quadOut(fraction, p1, p2 - p1, inter->slope); + case IF_QUAD_IN_OUT: return quadInOut(fraction, p1, p2 - p1, inter->slope); + case IF_CUBIC_IN: return cubicIn(fraction, p1, p2 - p1, inter->slope); + case IF_CUBIC_OUT: return cubicOut(fraction, p1, p2 - p1, inter->slope); + case IF_CUBIC_IN_OUT: return cubicInOut(fraction, p1, p2 - p1, inter->slope); + case IF_QUART_IN: return quartIn(fraction, p1, p2 - p1, inter->slope); + case IF_QUART_OUT: return quartOut(fraction, p1, p2 - p1, inter->slope); + case IF_QUART_IN_OUT: return quartInOut(fraction, p1, p2 - p1, inter->slope); + case IF_QUINT_IN: return quintIn(fraction, p1, p2 - p1, inter->slope); + case IF_QUINT_OUT: return quintOut(fraction, p1, p2 - p1, inter->slope); + case IF_QUINT_IN_OUT: return quintInOut(fraction, p1, p2 - p1, inter->slope); + case IF_CIRCLE_IN: return circleIn(fraction, p1, p2 - p1, inter->slope); + case IF_CIRCLE_OUT: return circleOut(fraction, p1, p2 - p1, inter->slope); + case IF_CIRCLE_IN_OUT: return circleInOut(fraction, p1, p2 - p1, inter->slope); + case IF_EXPONENTIAL_IN: return exponentialIn(fraction, p1, p2 - p1); + case IF_EXPONENTIAL_OUT: return exponentialOut(fraction, p1, p2 - p1); + case IF_EXPONENTIAL_IN_OUT: return exponentialInOut(fraction, p1, p2 - p1); + case IF_SINE_IN: return sineIn(fraction, p1, p2 - p1); + case IF_SINE_OUT: return sineOut(fraction, p1, p2 - p1); + case IF_SINE_IN_OUT: return sineInOut(fraction, p1, p2 - p1); + case IF_ELASTIC_IN: return elasticIn(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); + case IF_ELASTIC_OUT: return elasticOut(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); + case IF_ELASTIC_IN_OUT: return elasticInOut(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); + case IF_BACK_IN: return backIn(fraction, p1, p2 - p1, inter->speed); + case IF_BACK_OUT: return backOut(fraction, p1, p2 - p1, inter->speed); + case IF_BACK_IN_OUT: return backInOut(fraction, p1, p2 - p1, inter->speed); + case IF_BOUNCE_IN: return bounceIn(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); + case IF_BOUNCE_OUT: return bounceOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); + case IF_BOUNCE_IN_OUT: return bounceInOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); + case IF_FAST_BOUNCE_IN: return fastBounceIn(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); + case IF_FAST_BOUNCE_OUT: return fastBounceOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); + case IF_FAST_BOUNCE_IN_OUT: return fastBounceInOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); + default: return linear(fraction, p1, p2 - p1); + } +} + +float calculateSweep(state_t* modification, float fraction) +{ + arc_t* a = &(modification->arc); + float angle = a->angle + fraction * a->delta_angle; + if (a->X) + return a->cX + a->r * cos(angle); + else + return a->cY + a->r * sin(angle); + +} + +int state_differs(state_t* modification, U16 frame) +{ + state_t* previous = modification; + while (modification && modification->frame < frame) + { + previous = modification; + modification = modification->next; + } + if (!modification) + return 0; + if (modification->frame == frame) + return 1; + return (modification->function != CF_JUMP); + } + +float state_tangent(state_t* modification, U16 frame, int tangent) +{ + float deltaFrame = 0.1; + switch (tangent) +{ + case T_BEFORE: + return (state_value(modification, frame) - state_value(modification, frame - deltaFrame)) / deltaFrame; + case T_AFTER: + return (state_value(modification, frame + deltaFrame) - state_value(modification, frame)) / deltaFrame; + default: + return (state_value(modification, frame + deltaFrame) - state_value(modification, frame - deltaFrame)) / (2 * deltaFrame); + } +} + +float state_value(state_t* modification, float frame) +{ + state_t* previous = modification; + while (modification && modification->frame < frame) + { + previous = modification; + modification = modification->next; + } + if (!modification) + return previous->value; + if (modification->frame == frame) + { + do + { + previous = modification; + modification = modification->next; + } + while (modification && modification->frame == frame); + return previous->value; + } + switch (modification->function) + { + case CF_PUT: + return modification->value; + case CF_CHANGE: + { + float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); + return interpolateScalar(previous->value, modification->value, fraction, modification->interpolation); + } + case CF_SCHANGE: + { + float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); + fraction = interpolateScalar(0, 1, fraction, modification->interpolation); + return calculateSpline(modification, fraction); + } + case CF_SWEEP: + { + float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); + fraction = interpolateScalar(0, 1, fraction, modification->interpolation); + return calculateSweep(modification, fraction); + } + case CF_JUMP: + return previous->value; + default: + return 0; + } +} + +filterState_t* filterState_new(U16 frame, int function, FILTERLIST* value, interpolation_t* inter) +{ + filterState_t* newChange = (filterState_t*)malloc(sizeof(filterState_t)); + filterState_init(newChange); + newChange->frame = frame; + newChange->function = function; + newChange->value = value; + newChange->interpolation = inter; + return newChange; +} + +void filterState_free(filterState_t *change) +{ + if (change->next) + filterState_free(change->next); + free(change->value); + free(change); +} + +void filterState_init(filterState_t* change) +{ + memset(change, 0, sizeof(filterState_t)); +} + +void filterState_append(filterState_t* first, filterState_t* newChange) +{ + while (first->next) + first = first->next; + if (!first->value || !newChange->value) + first->next = newChange; + else + { + int i, mergedCount = 0; + int common = first->value->num < newChange->value->num ? first->value->num : newChange->value->num; + for (i = 0; i < common; i++) + { + mergedCount++; + if (newChange->value->filter[i]->type != first->value->filter[i]->type) + mergedCount++; + } + mergedCount = mergedCount + first->value->num - common + newChange->value->num - common; + if (mergedCount > 8) + { + char* list1; + char* list2; + char* newList; + list1 = (char*)malloc(1); + *list1 = '\0'; + for (i = 0; i < first->value->num; i++) + { + newList = (char*)malloc(strlen(list1) + strlen(filtername[first->value->filter[i]->type]) + 2); + strcpy(newList, strcat(strcat(list1, "+"), filtername[first->value->filter[i]->type])); + free(list1); + list1 = newList; + } + list2 = (char*)malloc(1); + *list2 = '\0'; + for (i = 0; i < newChange->value->num; i++) + { + newList = (char*)malloc(strlen(list1) + strlen(filtername[newChange->value->filter[i]->type]) + 2); + strcpy(newList, strcat(strcat(list2, "+"), filtername[newChange->value->filter[i]->type])); + free(list2); + list2 = newList; + } + syntaxerror("filterlists %s and %s cannot be interpolated.", list1, list2); + } + first->next = newChange; + } +} + +RGBA interpolateColor(RGBA c1, RGBA c2, float ratio, interpolation_t* inter) +{ + RGBA c; + c.r = interpolateScalar(c1.r, c2.r, ratio, inter); + c.g = interpolateScalar(c1.g, c2.g, ratio, inter); + c.b = interpolateScalar(c1.b, c2.b, ratio, inter); + c.a = interpolateScalar(c1.a, c2.a, ratio, inter); + return c; +} + +GRADIENT* interpolateNodes(GRADIENT* g1, GRADIENT* g2, float fraction, interpolation_t* inter) +{ + if (g1->num != g2->num) + syntaxerror("Internal error: gradients are not equal in size"); + + int i; + GRADIENT* g = (GRADIENT*) malloc(sizeof(GRADIENT)); + g->ratios = rfx_calloc(16*sizeof(U8)); + g->rgba = rfx_calloc(16*sizeof(RGBA)); + g->num = g1->num; + for (i = 0; i < g->num; i++) + { + g->ratios[i] = interpolateScalar(g1->ratios[i], g2->ratios[i], fraction, inter); + g->rgba[i] = interpolateColor(g1->rgba[i], g2->rgba[i], fraction, inter); + } + return g; +} + +void copyGradient(GRADIENT* dest, GRADIENT* source) +{ + dest->num = source->num; + memcpy(dest->ratios, source->ratios, source->num * sizeof(U8)); + memcpy(dest->rgba, source->rgba, source->num * sizeof(RGBA)); +} + +void insertNode(GRADIENT* g, int pos) +{ + memmove(&g->ratios[pos + 1], &g->ratios[pos], (g->num - pos) * sizeof(U8)); + memmove(&g->rgba[pos + 1], &g->rgba[pos], (g->num - pos) * sizeof(RGBA)); + if (pos == 0) + { + g->ratios[0] = g->ratios[1] / 2; + g->rgba[0] = g->rgba[1]; + } + else + if (pos == g->num) + { + g->ratios[pos] = (255 + g->ratios[g->num - 1]) / 2; + g->rgba[pos] = g->rgba[pos - 1]; + } + else + { + g->ratios[pos] = (g->ratios[pos - 1] + g->ratios[pos + 1]) / 2; + g->rgba[pos] = interpolateColor(g->rgba[pos - 1], g->rgba[pos + 1], 0.5, 0); + } + g->num++; +} + +void insertOptimalNode(GRADIENT* g) +{ + int i, next_gap; + int pos = 0; + int gap = g->ratios[0]; + for (i = 0; i < g->num - 1; i++) + { + next_gap = g->ratios[i + 1] - g->ratios[i]; + if (next_gap > gap) + { + gap = next_gap; + pos = i + 1; + } + } + next_gap = 255 - g->ratios[g->num -1]; + if (next_gap > gap) + pos = g->num; + insertNode(g, pos); +} + +void growGradient(GRADIENT* start, int size) +{ + while (start->num < size) + insertOptimalNode(start); +} + +GRADIENT* interpolateGradient(GRADIENT* g1, GRADIENT* g2, float fraction, interpolation_t* inter) +{ + int i; + GRADIENT g; + g.ratios = rfx_calloc(16*sizeof(U8)); + g.rgba = rfx_calloc(16*sizeof(RGBA)); + + if (g1->num > g2->num) + { + copyGradient(&g, g2); + growGradient(&g, g1->num); + GRADIENT* result = interpolateNodes(g1, &g, fraction, inter); + rfx_free(g.rgba); + rfx_free(g.ratios); + return result; + } + else + if (g1->num < g2->num) + { + copyGradient(&g, g1); + growGradient(&g, g2->num); + GRADIENT* result = interpolateNodes(&g, g2, fraction, inter); + rfx_free(g.rgba); + rfx_free(g.ratios); + return result; + } + else + return interpolateNodes(g1, g2, fraction, inter); +} + +FILTER* copyFilter(FILTER* original) +{ + if (!original) + return original; + FILTER* copy = swf_NewFilter(original->type); + switch (original->type) + { + case FILTERTYPE_BLUR: + memcpy(copy, original, sizeof(FILTER_BLUR)); + break; + case FILTERTYPE_GRADIENTGLOW: + { + memcpy(copy, original, sizeof(FILTER_GRADIENTGLOW)); + FILTER_GRADIENTGLOW* ggcopy = (FILTER_GRADIENTGLOW*)copy; + ggcopy->gradient = (GRADIENT*)malloc(sizeof(GRADIENT)); + ggcopy->gradient->ratios = (U8*)malloc(16 * sizeof(U8)); + ggcopy->gradient->rgba = (RGBA*)malloc(16 * sizeof(RGBA)); + copyGradient(ggcopy->gradient, ((FILTER_GRADIENTGLOW*)original)->gradient); + } + break; + case FILTERTYPE_DROPSHADOW: + memcpy(copy, original, sizeof(FILTER_DROPSHADOW)); + break; + case FILTERTYPE_BEVEL: + memcpy(copy, original, sizeof(FILTER_BEVEL)); + break; + default: syntaxerror("Internal error: unsupported filterype, cannot copy"); + } + return copy; +} + +FILTER* interpolateBlur(FILTER* filter1, FILTER* filter2, float ratio, interpolation_t* inter) + { + FILTER_BLUR*f1 = (FILTER_BLUR*)filter1; + FILTER_BLUR*f2 = (FILTER_BLUR*)filter2; + if (!f1) + f1 = noBlur; + if (!f2) + f2 = noBlur; + if(f1->blurx == f2->blurx && f1->blury == f2->blury) + return copyFilter(filter1); + FILTER_BLUR*f = (FILTER_BLUR*)swf_NewFilter(FILTERTYPE_BLUR); + f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); + f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); + f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); + return (FILTER*)f; + } + +void matchDropshadowFlags(FILTER_DROPSHADOW* unset, FILTER_DROPSHADOW* target) +{ + unset->innershadow = target->innershadow; + unset->knockout = target->knockout; + unset->composite = target->composite; +} + +FILTER* interpolateDropshadow(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) + { + FILTER_DROPSHADOW*f1 = (FILTER_DROPSHADOW*)filter1; + FILTER_DROPSHADOW*f2 = (FILTER_DROPSHADOW*)filter2; + if (!f1) + f1 = noDropshadow; + if (!f2) + f2 = noDropshadow; + if(!memcmp(&f1->color,&f2->color,sizeof(RGBA)) && f1->strength == f2->strength && + f1->blurx == f2->blurx && f1->blury == f2->blury && + f1->angle == f2->angle && f1->distance == f2->distance) + return copyFilter(filter1); + FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)swf_NewFilter(FILTERTYPE_DROPSHADOW); + memcpy(f, f1, sizeof(FILTER_DROPSHADOW)); + f->color = interpolateColor(f1->color, f2->color, ratio, inter); + f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); + f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); + f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); + f->angle= interpolateScalar(f1->angle, (f2->angle), ratio, inter); + f->distance= interpolateScalar(f1->distance, (f2->distance), ratio, inter); + f->strength= interpolateScalar(f1->strength, (f2->strength), ratio, inter); + if (f1 == noDropshadow) + { + if (f2 != noDropshadow) + matchDropshadowFlags(f, f2); + } + else + if (f2 == noDropshadow) + matchDropshadowFlags(f, f1); + else + if (ratio > 0.5) + matchDropshadowFlags(f, f2); + else + matchDropshadowFlags(f, f1); + return (FILTER*)f; +} + +void matchBevelFlags(FILTER_BEVEL* unset, FILTER_BEVEL* target) +{ + unset->innershadow = target->innershadow; + unset->knockout = target->knockout; + unset->composite = target->composite; + unset->ontop = target->ontop; +} + +FILTER* interpolateBevel(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) + { + FILTER_BEVEL*f1 = (FILTER_BEVEL*)filter1; + FILTER_BEVEL*f2 = (FILTER_BEVEL*)filter2; + if (!f1) + f1 = noBevel; + if (!f2) + f2 = noBevel; + if(!memcmp(&f1->shadow,&f2->shadow,sizeof(RGBA)) && + !memcmp(&f1->highlight,&f2->highlight,sizeof(RGBA)) && + f1->blurx == f2->blurx && f1->blury == f2->blury && f1->angle == f2->angle && f1->strength == f2->strength && f1->distance == f2->distance) + return copyFilter(filter1); + FILTER_BEVEL*f = (FILTER_BEVEL*)swf_NewFilter(FILTERTYPE_BEVEL); + memcpy(f, f1, sizeof(FILTER_BEVEL)); + f->shadow = interpolateColor(f1->shadow, f2->shadow, ratio, inter); + f->highlight = interpolateColor(f1->highlight, f2->highlight, ratio, inter); + f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); + f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); + f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); + f->angle= interpolateScalar(f1->angle, (f2->angle), ratio, inter); + f->distance= interpolateScalar(f1->distance, (f2->distance), ratio, inter); + f->strength= interpolateScalar(f1->strength, (f2->strength), ratio, inter); + if (f1 == noBevel) + { + if (f2 != noBevel) + matchBevelFlags(f, f2); + } + else + if (f2 == noBevel) + matchBevelFlags(f, f1); + else + if (ratio > 0.5) + matchBevelFlags(f, f2); + else + matchBevelFlags(f, f1); + return (FILTER*)f; +} + +void matchGradientGlowFlags(FILTER_GRADIENTGLOW* unset, FILTER_GRADIENTGLOW* target) +{ + unset->innershadow = target->innershadow; + unset->knockout = target->knockout; + unset->composite = target->composite; + unset->ontop = target->ontop; +} + +FILTER* interpolateGradientGlow(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) +{ + FILTER_GRADIENTGLOW*f1 = (FILTER_GRADIENTGLOW*)filter1; + FILTER_GRADIENTGLOW*f2 = (FILTER_GRADIENTGLOW*)filter2; + if (!f1) + f1 = noGradientGlow; + if (!f2) + f2 = noGradientGlow; + if(f1->gradient->num == f2->gradient->num && + !memcmp(&f1->gradient->ratios,&f2->gradient->ratios,f1->gradient->num * sizeof(U8)) && + !memcmp(&f1->gradient->rgba,&f2->gradient->rgba,f1->gradient->num * sizeof(RGBA)) && + f1->blurx == f2->blurx && f1->blury == f2->blury && f1->angle == f2->angle && f1->strength == f2->strength && f1->distance == f2->distance) + return copyFilter(filter1); + FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)swf_NewFilter(FILTERTYPE_GRADIENTGLOW); + memcpy(f, f1, sizeof(FILTER_GRADIENTGLOW)); + f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); + f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); + f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); + f->angle= interpolateScalar(f1->angle, (f2->angle), ratio, inter); + f->distance= interpolateScalar(f1->distance, (f2->distance), ratio, inter); + f->strength= interpolateScalar(f1->strength, (f2->strength), ratio, inter); + f->gradient= interpolateGradient(f1->gradient, f2->gradient, ratio, inter); + if (f1 == noGradientGlow) + { + if (f2 != noGradientGlow) + matchGradientGlowFlags(f, f2); + } + else + if (f2 == noGradientGlow) + matchGradientGlowFlags(f, f1); + else + if (ratio > 0.5) + matchGradientGlowFlags(f, f2); + else + matchGradientGlowFlags(f, f1); + return (FILTER*)f; +} + +FILTER* interpolateFilter(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) +{ + if(!filter1 && !filter2) + return 0; + + int filter_type; + if (!filter1) + filter_type = filter2->type; + else + if (!filter2) + filter_type = filter1->type; + else + if(filter2->type != filter1->type) + syntaxerror("can't interpolate between %s and %s filters yet", filtername[filter1->type], filtername[filter2->type]); + else + filter_type = filter1->type; + + switch (filter_type) + { + case FILTERTYPE_BLUR: + return interpolateBlur(filter1, filter2, ratio, inter); + case FILTERTYPE_BEVEL: + return interpolateBevel(filter1, filter2, ratio, inter); + case FILTERTYPE_DROPSHADOW: + return interpolateDropshadow(filter1, filter2, ratio, inter); + case FILTERTYPE_GRADIENTGLOW: + return interpolateGradientGlow(filter1, filter2, ratio, inter); + default: + syntaxerror("Filtertype %s not supported yet.\n", filtername[filter1->type]); + } + return 0; +} + +FILTERLIST* copyFilterList(FILTERLIST* original) +{ + if (!original) + return original; + int i; + FILTERLIST* copy = (FILTERLIST*)malloc(sizeof(FILTERLIST)); + copy->num = original->num; + for (i = 0; i < copy->num; i++) + copy->filter[i] = copyFilter(original->filter[i]); + return copy; +} + +FILTER* noFilter(int type) +{ + switch (type) + { + case FILTERTYPE_BLUR: + return (FILTER*)noBlur; + break; + case FILTERTYPE_BEVEL: + return (FILTER*)noBevel; + break; + case FILTERTYPE_DROPSHADOW: + return (FILTER*)noDropshadow; + break; + case FILTERTYPE_GRADIENTGLOW: + return (FILTER*)noGradientGlow; + break; + default: + syntaxerror("Internal error: unsupported filtertype, cannot match filterlists"); + } + return 0; +} + +FILTERLIST* interpolateFilterList(FILTERLIST* list1, FILTERLIST* list2, float ratio, interpolation_t* inter) +{ + if (!list1 && !list2) + return list1; + FILTERLIST start, target, dummy; + dummy.num = 0; + if (!list1) + list1 = &dummy; + if (!list2) + list2 = &dummy; + int i, j = 0; + int common = list1->num < list2->num ? list1->num : list2->num; + for (i = 0; i < common; i++) + { + start.filter[j] = list1->filter[i]; + if (list2->filter[i]->type == list1->filter[i]->type) + { + target.filter[j] = list2->filter[i]; + j++; + } + else + { + target.filter[j] = noFilter(list1->filter[i]->type); + j++; + start.filter[j] = noFilter(list2->filter[i]->type); + target.filter[j] = list2->filter[i]; + j++; + } + } + if (list1->num > common) + for (i = common; i < list1->num; i++) + { + start.filter[j] = list1->filter[i]; + target.filter[j] = noFilter(list1->filter[i]->type); + j++; + } + if (list2->num > common) + for (i = common; i < list2->num; i++) + { + start.filter[j] = noFilter(list2->filter[i]->type); + target.filter[j] = list2->filter[i]; + j++; + } + start.num = j; + target.num = j; + FILTERLIST* mixedList = (FILTERLIST*)malloc(sizeof(FILTERLIST)); + mixedList->num = j; + for (i = 0; i < j; i++) + mixedList->filter[i] = interpolateFilter(start.filter[i], target.filter[i], ratio, inter); + return mixedList; +} + +int filterState_differs(filterState_t* modification, U16 frame) +{ + filterState_t* previous = modification; + while (modification && modification->frame < frame) + { + previous = modification; + modification = modification->next; + } + if (!modification) + return 0; + if (modification->frame == frame) + return 1; + return (modification->function != CF_JUMP); +} + +FILTERLIST* filterState_value(filterState_t* modification, U16 frame) +{ + filterState_t* previous = modification; + while (modification && modification->frame < frame) + { + previous = modification; + modification = modification->next; + } + if (!modification) + return copyFilterList(previous->value); + if (modification->frame == frame) + { + do + { + previous = modification; + modification = modification->next; + } + while (modification && modification->frame == frame); + return copyFilterList(previous->value); + } + switch (modification->function) + { + case CF_PUT: + return copyFilterList(modification->value); + case CF_CHANGE: + { + float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); + return interpolateFilterList(previous->value, modification->value, fraction, modification->interpolation); + } + case CF_JUMP: + return copyFilterList(previous->value); + default: + return 0; + } +} + +history_t* history_new() +{ + history_t* newHistory = (history_t*)malloc(sizeof(history_t)); + history_init(newHistory); + return newHistory; +} + +void history_free(history_t* past) +{ + state_free(dict_lookup(past->states, "x")); + state_free(dict_lookup(past->states, "y")); + state_free(dict_lookup(past->states, "scalex")); + state_free(dict_lookup(past->states, "scaley")); + state_free(dict_lookup(past->states, "cxform.r0")); + state_free(dict_lookup(past->states, "cxform.g0")); + state_free(dict_lookup(past->states, "cxform.b0")); + state_free(dict_lookup(past->states, "cxform.a0")); + state_free(dict_lookup(past->states, "cxform.r1")); + state_free(dict_lookup(past->states, "cxform.g1")); + state_free(dict_lookup(past->states, "cxform.b1")); + state_free(dict_lookup(past->states, "cxform.a1")); + state_free(dict_lookup(past->states, "rotate")); + state_free(dict_lookup(past->states, "shear")); + state_free(dict_lookup(past->states, "pivot.x")); + state_free(dict_lookup(past->states, "pivot.y")); + state_free(dict_lookup(past->states, "pin.x")); + state_free(dict_lookup(past->states, "pin.y")); + state_free(dict_lookup(past->states, "blendmode")); + state_free(dict_lookup(past->states, "flags")); + filterState_free(dict_lookup(past->states, "filter")); + dict_destroy(past->states); + free(past); +} + +void history_init(history_t* past) +{ + past->states = (dict_t*)malloc(sizeof(dict_t)); + dict_init(past->states, 16); +} + +void history_begin(history_t* past, char* parameter, U16 frame, TAG* tag, float value) +{ + state_t* first = state_new(frame, CF_PUT, value, 0); + past->firstTag = tag; + past->firstFrame = frame; + dict_put2(past->states, parameter, first); +} + +void history_beginFilter(history_t* past, U16 frame, TAG* tag, FILTERLIST* value) +{ + filterState_t* first = filterState_new(frame, CF_PUT, value, 0); + past->firstTag = tag; + past->firstFrame = frame; + dict_put2(past->states, "filter", first); +} + +void history_remember(history_t* past, char* parameter, U16 frame, int function, float value, interpolation_t* inter) +{ + past->lastFrame = frame; + state_t* state = dict_lookup(past->states, parameter); + if (state) //should always be true + { + state_t* next = state_new(frame, function, value, inter); + state_append(state, next); + } + else + syntaxerror("Internal error: changing parameter %s, which is unknown for the instance.", parameter); +} + +static float getAngle(float dX, float dY) +{ + float radius = sqrt(dX * dX + dY * dY); + if (radius == 0) + return 0.0; + if (dX >= 0) + if (dY > 0) + return acos(dX / radius); + else + return 2 * M_PI - acos(dX / radius); + else + if (dY > 0) + return M_PI - acos(-dX / radius); + else + return M_PI + acos(-dX / radius); +} + +static float getDeltaAngle(float angle1, float angle2, int clockwise) + { + if (!clockwise) + { + if (angle1 > angle2) + return angle2 - angle1; + else + return angle2 - angle1 - 2 * M_PI; + } + else + { + if (angle1 > angle2) + return 2 * M_PI - angle1 + angle2; + else + return angle2 - angle1; + } +} + +void history_rememberSweep(history_t* past, U16 frame, float x, float y, float r, int clockwise, int short_arc, interpolation_t* inter) +{ + float lastX, lastY, dX, dY; + U16 lastFrame; + + past->lastFrame = frame; + state_t* change = dict_lookup(past->states, "x"); + if (change) //should always be true + { + while (change->next) + change = change->next; + lastFrame = change->frame; + lastX = change->value; + change = dict_lookup(past->states, "y"); + if (change) //should always be true + { + while (change->next) + change = change->next; + lastY = change->value; + dX = x - lastX; + dY = y - lastY; + if (dX == 0 && dY == 0) + syntaxerror("sweep not possible: startpoint and endpoint must not be equal"); + if ((dX) * (dX) + (dY) * (dY) > 4 * r * r) + syntaxerror("sweep not possible: radius is to small"); + if (change->frame > lastFrame) + { + lastFrame = change->frame; + history_remember(past, "x", lastFrame, CF_JUMP, lastX, 0); + } + else + if (change->frame < lastFrame) + history_remember(past, "y", lastFrame, CF_JUMP, lastY, 0); + float c1X, c1Y, c2X, c2Y; + if (dX == 0) //vertical + { + c1Y = c2Y = (lastY + y) / 2; + c1X = x + sqrt(r * r - (c1Y - y) * (c1Y - y)); + c2X = 2 * x -c1X; + } + else + if (dY == 0) //horizontal + { + c1X = c2X = (lastX + x) / 2; + c1Y = y +sqrt(r * r - (c1X - x) * (c1X - x)); + c2Y = 2 * y -c1Y; + } + else + { + c1X = sqrt((r * r - (dX * dX + dY * dY) / 4) / (1 + dX * dX / dY / dY)); + c2X = -c1X; + c1Y = -dX / dY * c1X; + c2Y = -c1Y; + c1X += (x + lastX) / 2; + c2X += (x + lastX) / 2; + c1Y += (y + lastY) / 2; + c2Y += (y + lastY) / 2; + } + float angle1, angle2, delta_angle, centerX, centerY; + angle1 = getAngle(lastX - c1X, lastY - c1Y); + angle2 = getAngle(x - c1X, y - c1Y); + delta_angle = getDeltaAngle(angle1, angle2, clockwise); + if ((short_arc && fabs(delta_angle) <= M_PI) || (! short_arc && fabs(delta_angle) >= M_PI)) + { + centerX = c1X; + centerY = c1Y; + } + else + { + angle1 = getAngle(lastX - c2X, lastY - c2Y); + angle2 = getAngle(x - c2X, y - c2Y); + delta_angle = getDeltaAngle(angle1, angle2, clockwise); + centerX = c2X; + centerY = c2Y; + } + change = dict_lookup(past->states, "x"); + state_t* nextX = state_new(frame, CF_SWEEP, x, inter); + nextX->arc.r = r; + nextX->arc.angle = angle1; + nextX->arc.delta_angle = delta_angle; + nextX->arc.cX = centerX; + nextX->arc.cY = centerY; + nextX->arc.X = 1; + state_append(change, nextX); + change = dict_lookup(past->states, "y"); + state_t* nextY = state_new(frame, CF_SWEEP, y, inter); + nextY->arc.r = r; + nextY->arc.angle = angle1; + nextY->arc.delta_angle = delta_angle; + nextY->arc.cX = centerX; + nextY->arc.cY = centerY; + nextY->arc.X = 0; + state_append(change, nextY); + } + else + syntaxerror("Internal error: changing parameter y in sweep, which is unknown for the instance."); + } + else + syntaxerror("Internal error: changing parameter x in sweep, which is unknown for the instance."); +} + +void history_rememberFilter(history_t* past, U16 frame, int function, FILTERLIST* value, interpolation_t* inter) +{ + past->lastFrame = frame; + filterState_t* first = dict_lookup(past->states, "filter"); + if (first) //should always be true + { + filterState_t* next = filterState_new(frame, function, value, inter); + filterState_append(first, next); + } + else + syntaxerror("Internal error: changing a filter not set for the instance."); +} + +void history_processFlags(history_t* past) +// to be called after completely recording this history, before calculating any values. +{ + state_t* flagState = dict_lookup(past->states, "flags"); + state_t* nextState; + U16 nextFlags, toggledFlags, currentFlags = (U16)flagState->value; + while (flagState->next) + { + nextState = flagState->next; + nextFlags = (U16)nextState->value; + toggledFlags = currentFlags ^ nextFlags; + if (toggledFlags & IF_FIXED_ALIGNMENT) + { // the IF_FIXED_ALIGNMENT bit will change in the next state + if (nextFlags & IF_FIXED_ALIGNMENT) + { // the IF_FIXED_ALIGNMENT bit will be set + int onFrame = nextState->frame; + state_t* rotations = dict_lookup(past->states, "rotate"); + nextState->params.instanceAngle = state_value(rotations, onFrame); + state_t* resetRotate = state_new(onFrame, CF_JUMP, 0, 0); + state_insert(rotations, resetRotate); + if (onFrame == past->firstFrame) + onFrame++; + state_t *x, *y; + float dx, dy; + do + { + x = dict_lookup(past->states, "x"); + dx = state_tangent(x, onFrame, T_SYMMETRIC); + y = dict_lookup(past->states, "y"); + dy = state_tangent(y, onFrame, T_SYMMETRIC); + onFrame++; + } + while (dx == 0 && dy == 0 && onFrame < past->lastFrame); + if (onFrame == past->lastFrame) + nextState->params.pathAngle = 0; + else + nextState->params.pathAngle = getAngle(dx, dy) / M_PI * 180; + } + else // the IF_FIXED_ALIGNMENT bit will be reset + { + int offFrame = nextState->frame; + state_t* rotations = dict_lookup(past->states, "rotate"); + state_t* setRotate = state_new(offFrame, CF_JUMP, flagState->params.instanceAngle + state_value(rotations, offFrame), 0); + state_insert(rotations, setRotate); + } + } + else // the IF_FIXED_ALIGNMENT bit will not change but some processing may be + // required just the same + { + if (nextFlags & IF_FIXED_ALIGNMENT) + { + nextState->params.instanceAngle = flagState->params.instanceAngle; + nextState->params.pathAngle = flagState->params.pathAngle; + } + } +// and so on for all the other bits. + flagState = nextState; + currentFlags = nextFlags; + } +} + +int history_change(history_t* past, U16 frame, char* parameter) +{ + state_t* first = dict_lookup(past->states, parameter); + if (first) //should always be true. + return state_differs(first, frame); + syntaxerror("no history found to predict changes for parameter %s.\n", parameter); + return 0; +} + +float history_value(history_t* past, U16 frame, char* parameter) +{ + state_t* state = dict_lookup(past->states, parameter); + if (state) //should always be true. + return state_value(state, frame); + syntaxerror("no history found to get a value for parameter %s.\n", parameter); + return 0; +} + +float history_rotateValue(history_t* past, U16 frame) +{ + state_t* rotations = dict_lookup(past->states, "rotate"); + if (rotations) //should always be true. + { + float angle = state_value(rotations, frame); + state_t* flags = dict_lookup(past->states, "flags"); + U16 currentflags = state_value(flags, frame); + if (currentflags & IF_FIXED_ALIGNMENT) + { + flags = state_at(flags, frame); + if (frame == past->firstFrame) + frame++; + state_t *x, *y; + float dx, dy, pathAngle; + do + { + x = dict_lookup(past->states, "x"); + dx = state_value(x, frame) - state_value(x, frame - 1); + y = dict_lookup(past->states, "y"); + dy = state_value(y, frame) - state_value(y, frame - 1); + frame--; + } + while (dx == 0 && dy == 0 && frame > past->firstFrame); + if (frame == past->firstFrame) + pathAngle = 0; + else + pathAngle = getAngle(dx, dy) / M_PI * 180; + return angle + flags->params.instanceAngle + pathAngle - flags->params.pathAngle; + } + else + return angle; + } + syntaxerror("no history found to get a value for parameter rotate.\n"); + return 0; +} + +int history_changeFilter(history_t* past, U16 frame) +{ + filterState_t* first = dict_lookup(past->states, "filter"); + if (first) //should always be true. + return filterState_differs(first, frame); + syntaxerror("no history found to predict changes for parameter filter.\n"); + return 0; +} + +FILTERLIST* history_filterValue(history_t* past, U16 frame) +{ + filterState_t* first = dict_lookup(past->states, "filter"); + if (first) //should always be true. + return filterState_value(first, frame); + syntaxerror("no history found to get a value for parameter filter.\n"); + return 0; +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-history.h b/fluidbook/tools/swftools-special-swfdump/src/swfc-history.h new file mode 100644 index 000000000..335089216 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc-history.h @@ -0,0 +1,138 @@ +/* swfc- Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2007 Huub Schaeks + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __HISTORY_H +#define __HISTORY_Y + +#include "../lib/types.h" +#include "../lib/rfxswf.h" +#include "../lib/q.h" +#include "swfc-feedback.h" +#include "swfc-interpolation.h" + +enum +{ + CF_PUT = 1, + CF_CHANGE = 2, + CF_SCHANGE = 3, + CF_SWEEP = 4, + CF_JUMP = 5 +}; + +#define SF_X 0x0001 +#define SF_Y 0x0002 +#define SF_SCALEX 0x0004 +#define SF_SCALEY 0x0008 +#define SF_CX_R 0x0010 +#define SF_CX_G 0x0020 +#define SF_CX_B 0x0040 +#define SF_CX_A 0x0080 +#define SF_ROTATE 0x0100 +#define SF_SHEAR 0x0200 +#define SF_PIVOT 0x0400 +#define SF_PIN 0x0800 +#define SF_BLEND 0x1000 +#define SF_FILTER 0x2000 +#define SF_ALL 0x3fff + +#define IF_FIXED_ALIGNMENT 0x0001 + +FILTER* noFilters; +FILTER_BLUR* noBlur; +FILTER_BEVEL* noBevel; +FILTER_DROPSHADOW* noDropshadow; +FILTER_GRADIENTGLOW* noGradientGlow; + +typedef struct _spline +{ + float a, b, c, d; +} spline_t; + +typedef struct _arc +{ + float r, angle, delta_angle, cX, cY; + int X; // boolean: 1 if this is for x; 0 if this is for y; +} arc_t; + +typedef struct _flagparms +{ + float pathAngle, instanceAngle; +} flagparams_t; + +typedef struct _state +{ + U16 frame; + float value; + int function; + interpolation_t* interpolation; + spline_t spline; + arc_t arc; + flagparams_t params; + struct _state* next; +} state_t; + +state_t* state_new(U16 frame, int function, float value, interpolation_t* inter); +void state_free(state_t* state); +void state_init(state_t* state); +state_t* state_at(state_t* state, U16 frame); +void state_append(state_t* state, state_t* newState); +void state_insert(state_t* state, state_t* newState); +float state_value(state_t* first, float frame); +float state_tangent(state_t* modification, U16 frame, int tangent); + +typedef struct _filterState +{ + U16 frame; + FILTERLIST* value; + int function; + interpolation_t* interpolation; + struct _filterState* next; +} filterState_t; + +filterState_t* filterState_new(U16 frame, int function, FILTERLIST* value, interpolation_t* inter); +void filterState_free(filterState_t* change); +void filterState_init(filterState_t* change); +void filterState_append(filterState_t* first, filterState_t* newChange); +FILTERLIST* filterState_value(filterState_t* first, U16 frame); + +typedef struct _history +{ + U16 firstFrame, lastFrame; + TAG* firstTag; + dict_t* states; +} history_t; + +history_t* history_new(); +void history_free(history_t* past); +void history_init(history_t* past); +void history_begin(history_t* past, char* parameter, U16 frame, TAG* tag, float value); +void history_beginFilter(history_t* past, U16 frame, TAG* tag, FILTERLIST* value); +void history_remember(history_t* past, char* parameter, U16 frame, int function, float value, interpolation_t* inter); +void history_rememberSweep(history_t* past, U16 frame, float x, float y, float r, int clockwise, int short_arc, interpolation_t* inter); +void history_rememberFilter(history_t* past, U16 frame, int function, FILTERLIST* value, interpolation_t* inter); +void history_processFlags(history_t* past); +int history_change(history_t* past, U16 frame, char* parameter); +float history_value(history_t* past, U16 frame, char* parameter); +float history_rotateValue(history_t* past, U16 frame); +int history_changeFilter(history_t* past, U16 frame); +FILTERLIST* history_filterValue(history_t* past, U16 frame); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c b/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c new file mode 100644 index 000000000..f543bd2e8 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c @@ -0,0 +1,302 @@ +/* swfc- Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2007 Huub Schaeks + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "swfc-interpolation.h" + +static inline float poly(float fraction, float start, float delta, float slope, int degree) +{ + return delta * ((1 - slope) * pow(fraction, degree) + slope * fraction) + start; +} + +float linear(float fraction, float start, float delta) +{ + return poly(fraction, start, delta, 0, 1); +} + +float quadIn(float fraction, float start, float delta, float slope) +{ + return poly(fraction, start, delta, slope, 2); +} + +float quadOut(float fraction, float start, float delta, float slope) +{ + return quadIn(1 - fraction, start + delta, -delta, slope); +} + +float quadInOut(float fraction, float start, float delta, float slope) +{ + if (fraction < 0.5) + return quadIn(2 * fraction, start, delta / 2, slope); + return quadOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); +} + +float cubicIn(float fraction, float start, float delta, float slope) +{ + return poly(fraction, start, delta, slope, 3); +} + +float cubicOut(float fraction, float start, float delta, float slope) +{ + return cubicIn(1 - fraction, start + delta, -delta, slope); +} + +float cubicInOut(float fraction, float start, float delta, float slope) +{ + if (fraction < 0.5) + return cubicIn(2 * fraction, start, delta / 2, slope); + return cubicOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); +} + +float quartIn(float fraction, float start, float delta, float slope) +{ + return poly(fraction, start, delta, slope, 4); +} + +float quartOut(float fraction, float start, float delta, float slope) +{ + return quartIn(1 - fraction, start + delta, -delta, slope); +} + +float quartInOut(float fraction, float start, float delta, float slope) +{ + if (fraction < 0.5) + return quartIn(2 * fraction, start, delta / 2, slope); + return quartOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); +} + +float quintIn(float fraction, float start, float delta, float slope) +{ + return poly(fraction, start, delta, slope, 5); +} + +float quintOut(float fraction, float start, float delta, float slope) +{ + return quintIn(1 - fraction, start + delta, -delta, slope); +} + +float quintInOut(float fraction, float start, float delta, float slope) +{ + if (fraction < 0.5) + return quintIn(2 * fraction, start, delta / 2, slope); + return quintOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); +} + +float circleIn(float fraction, float start, float delta, float slope) +{ + return delta * (1 - sqrt(1 - (1 - 2 * slope) * fraction * fraction - 2 * slope * fraction)) + start; +} + +float circleOut(float fraction, float start, float delta, float slope) +{ + return circleIn(1 - fraction, start + delta, -delta, slope); +} + +float circleInOut(float fraction, float start, float delta, float slope) +{ + if (fraction < 0.5) + return circleIn(2 * fraction, start, delta / 2, slope); + return circleOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); +} + +float exponentialIn(float fraction, float start, float delta) +{ + if (fraction == 0) + return start; + return delta * pow(2, 10 * (fraction - 1)) + start; +} + +float exponentialOut(float fraction, float start, float delta) +{ + return exponentialIn(1 - fraction, start + delta, -delta); +} + +float exponentialInOut(float fraction, float start, float delta) +{ + if (fraction < 0.5) + return exponentialIn(2 * fraction, start, delta / 2); + return exponentialOut(2 * fraction - 1, start + delta / 2, delta / 2); +} + +float sineIn(float fraction, float start, float delta) +{ + return delta * (1 - cos(fraction * M_PI/2)) + start; +} + +float sineOut(float fraction, float start, float delta) +{ + return sineIn(1 - fraction, start + delta, -delta); +} + +float sineInOut(float fraction, float start, float delta) +{ + if (fraction < 0.5) + return sineIn(2 * fraction, start, delta / 2); + return sineOut(2 * fraction - 1, start + delta / 2, delta / 2); +} + +float elasticIn(float fraction, float start, float delta, float amplitude, int bounces, float damping) +{ + if (fraction == 0 || delta == 0) + return start; + if (fraction == 1) + return start + delta; + if (amplitude < fabs(delta)) + amplitude = delta; + float period = 1 / (bounces + 0.25); + return amplitude * pow(2, damping * (fraction - 1)) * sin(fraction * (2 * M_PI) / period) + start; +} + +float elasticOut(float fraction, float start, float delta, float amplitude, int bounces, float damping) +{ + return elasticIn(1 - fraction, start + delta, -delta, amplitude, bounces, damping); +} + +float elasticInOut(float fraction, float start, float delta, float amplitude, int bounces, float damping) +{ + if (fraction < 0.5) + return elasticIn(2 * fraction, start, delta / 2, amplitude, bounces, damping); + return elasticOut(2 * fraction - 1, start + delta / 2, delta / 2, amplitude, bounces, damping); +} + +float backIn(float fraction, float start, float delta, float speed) +{ + return delta * fraction * fraction * ((speed + 1) * fraction - speed) + start; +} + +float backOut(float fraction, float start, float delta, float speed) +{ + return backIn(1 - fraction, start + delta, -delta, speed); +} + +float backInOut(float fraction, float start, float delta, float speed) +{ + if (fraction < 0.5) + return backIn(2 * fraction, start, delta / 2, speed); + return backOut(2 * fraction - 1, start + delta / 2, delta / 2, speed); +} + +/* when applied to movement bounceIn the object 'hits the floor' bounces times + * (after leaving the floor first) before gently reaching the final position at the top of the final bounce + * Each bounce takes growth times a long as the previous, except for the last one which lasts only half + * that time. The heights of the intermediate bounces are determined by the damping parameter. + * Set damping to 0 for an undamped movement.*/ + +float bounceIn(float fraction, float start, float delta, int bounces, float growth, float damping) +{ + if (fraction == 0 || delta == 0) + return start; + if (fraction == 1) + return start + delta; + float w0; + if (growth == 1.0) + w0 = 1 / (bounces + 0.5); + else + { + float gN = pow(growth, bounces); + w0 = 1 / ((gN - 1) / (growth - 1) + gN / 2 ); + } + float bounceStart = 0; + int i; + float w = w0; + for (i = 0; i <= bounces; i++) + { + float bounceEnd = bounceStart + w; + if (fraction >= bounceStart && fraction < bounceEnd) + { + float half = (bounceEnd + bounceStart) / 2; + float top = delta / pow(2, damping * ((bounces - i))); + fraction -= half; + fraction /= (w / 2); + return (1 - fraction * fraction) * top + start; + } + bounceStart = bounceEnd; + w = w * growth; + } + return w; +} + +/* bounceOut is a time-reversed bounceIn; therefore each bounce takes 1/growth times as long as + * the previous, which I think fits the idea when applied to movement */ + +float bounceOut(float fraction, float start, float delta, int bounces, float growth, float damping) +{ + return bounceIn(1 - fraction, start + delta, -delta, bounces, growth, damping); +} + +/* since bounceIn and bounceOut are combined, if growth > 1 then the bounce-times will increase in + * the first half and decrease in the second half */ + +float bounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping) +{ + if (fraction < 0.5) + return bounceIn(2 * fraction, start, delta / 2, bounces, growth, damping); + return bounceOut(2 * fraction - 1, start + delta / 2, delta / 2, bounces, growth, damping); +} +/* fastBounce(In/Out) doesn't end or start in a horizontal slope (= gentle end or start) as + * bounce(In/Out) do which means fastBounceInOut doesn't have the 'delay' in the middle */ +float fastBounceIn(float fraction, float start, float delta, int bounces, float growth, float damping) +{ + if (fraction == 0 || delta == 0) + return start; + if (fraction == 1) + return start + delta; + float w0; + if (growth == 1.0) + w0 = 1 / (bounces + 0.25); /* in general (bounces + 1 / (2 * f)) */ + else + { + float gN = pow(growth, bounces); + w0 = 1 / ((gN - 1) / (growth - 1) + gN / 4 /* in general: gN / (2 * f) */ ); + } + float bounceStart = 0; + int i; + float w = w0; + for (i = 0; i <= bounces; i++) + { + float bounceEnd = bounceStart + w; + if (fraction >= bounceStart && fraction < bounceEnd) + { + float half = (bounceEnd + bounceStart) / 2; + float top = delta / 0.75/* in general: (1 - (1 / f) * (1 / f)) */ / pow(2, damping * ((bounces - i))); + fraction -= half; + fraction /= (w / 2); + return (1 - fraction * fraction) * top + start; + } + bounceStart = bounceEnd; + w = w * growth; + } + return 0; +} + +float fastBounceOut(float fraction, float start, float delta, int bounces, float growth, float damping) +{ + return fastBounceIn(1 - fraction, start + delta, -delta, bounces, growth, damping); +} + +float fastBounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping) +{ + if (fraction < 0.5) + return fastBounceIn(2 * fraction, start, delta / 2, bounces, growth, damping); + return fastBounceOut(2 * fraction - 1, start + delta / 2, delta / 2, bounces, growth, damping); +} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h b/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h new file mode 100644 index 000000000..f29e950e3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h @@ -0,0 +1,114 @@ +/* swfc- Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2007 Huub Schaeks + Copyright (c) 2007 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __EASE_H +#define __EASE_H + +typedef struct _interpolation { + int function; + float slope, speed, amplitude, growth, damping; + int bounces; +} interpolation_t; + +enum { + IF_LINEAR = 1, + IF_QUAD_IN = 2, + IF_QUAD_OUT = 3, + IF_QUAD_IN_OUT = 4, + IF_CUBIC_IN = 5, + IF_CUBIC_OUT = 6, + IF_CUBIC_IN_OUT = 7, + IF_QUART_IN = 8, + IF_QUART_OUT = 9, + IF_QUART_IN_OUT = 10, + IF_QUINT_IN = 11, + IF_QUINT_OUT = 12, + IF_QUINT_IN_OUT = 13, + IF_CIRCLE_IN = 14, + IF_CIRCLE_OUT = 15, + IF_CIRCLE_IN_OUT = 16, + IF_EXPONENTIAL_IN = 17, + IF_EXPONENTIAL_OUT = 18, + IF_EXPONENTIAL_IN_OUT = 19, + IF_SINE_IN = 20, + IF_SINE_OUT = 21, + IF_SINE_IN_OUT = 22, + IF_ELASTIC_IN = 23, + IF_ELASTIC_OUT = 24, + IF_ELASTIC_IN_OUT = 25, + IF_BACK_IN = 26, + IF_BACK_OUT = 27, + IF_BACK_IN_OUT = 28, + IF_BOUNCE_IN = 29, + IF_BOUNCE_OUT = 30, + IF_BOUNCE_IN_OUT = 31, + IF_FAST_BOUNCE_IN = 32, + IF_FAST_BOUNCE_OUT = 33, + IF_FAST_BOUNCE_IN_OUT = 34 +}; + +float linear(float fraction, float start, float delta); + +float quadIn(float fraction, float start, float delta, float slope); +float quadOut(float fraction, float start, float delta, float slope); +float quadInOut(float fraction, float start, float delta, float slope); + +float cubicIn(float fraction, float start, float delta, float slope); +float cubicOut(float fraction, float start, float delta, float slope); +float cubicInOut(float fraction, float start, float delta, float slope); + +float quartIn(float fraction, float start, float delta, float slope); +float quartOut(float fraction, float start, float delta, float slope); +float quartInOut(float fraction, float start, float delta, float slope); + +float quintIn(float fraction, float start, float delta, float slope); +float quintOut(float fraction, float start, float delta, float slope); +float quintInOut(float fraction, float start, float delta, float slope); + +float circleIn(float fraction, float start, float delta, float slope); +float circleOut(float fraction, float start, float delta, float slope); +float circleInOut(float fraction, float start, float delta, float slope); + +float exponentialIn(float fraction, float start, float delta); +float exponentialOut(float fraction, float start, float delta); +float exponentialInOut(float fraction, float start, float delta); + +float sineIn(float fraction, float start, float delta); +float sineOut(float fraction, float start, float delta); +float sineInOut(float fraction, float start, float delta); + +float elasticIn(float fraction, float start, float delta, float amplitude, int bounces, float damping); +float elasticOut(float fraction, float start, float delta, float amplitude, int bounces, float damping); +float elasticInOut(float fraction, float start, float delta, float amplitude, int bounces, float damping); + +float backIn(float fraction, float start, float delta, float speed); +float backOut(float fraction, float start, float delta, float speed); +float backInOut(float fraction, float start, float delta, float speed); + +float bounceIn(float fraction, float start, float delta, int bounces, float growth, float damping); +float bounceOut(float fraction, float start, float delta, int bounces, float growth, float damping); +float bounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping); + +float fastBounceIn(float fraction, float start, float delta, int bounces, float growth, float damping); +float fastBounceOut(float fraction, float start, float delta, int bounces, float growth, float damping); +float fastBounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping); + +#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc.1 b/fluidbook/tools/swftools-special-swfdump/src/swfc.1 new file mode 100644 index 000000000..efca89cc3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc.1 @@ -0,0 +1,31 @@ +.TH swfc "1" "April 2009" "swfc" "swftools" +.SH NAME +swfc - compile .sc files to swf. + +.SH Synopsis +.B swfc [-o file.swf] file.sc + +.SH DESCRIPTION +Compiles a file written in sc (SWF Script) into a number of SWF files. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.TP +\fB\-C\fR, \fB\-\-cgi\fR + Output to stdout (for use in CGI environments) +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Increase verbosity. Use more than one \fB-v\fR for greater effect. +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Specify output file (Default: output.swf). + This affects only the parts of the .sc file which haven't + specified an output file themselves. +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc.c b/fluidbook/tools/swftools-special-swfdump/src/swfc.c new file mode 100644 index 000000000..20cc81d09 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfc.c @@ -0,0 +1,4592 @@ +/* swfc.c + Compiles swf code (.sc) files into .swf files. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include +#include +#include "../config.h" +#include "../lib/rfxswf.h" +#include "../lib/drawer.h" +#include "../lib/log.h" +#include "../lib/args.h" +#include "../lib/q.h" +#include "../lib/mp3.h" +#include "../lib/wav.h" +#include "parser.h" +#include "../lib/png.h" +#include "swfc-feedback.h" +#include "swfc-interpolation.h" +#include "swfc-history.h" + +//#define DEBUG +static char * outputname = "output.swf"; +static int verbose = 2; +static int optimize = 0; +static int override_outputname = 0; +static int do_cgi = 0; +static int change_sets_all = 0; +static int do_exports = 0; +static char * mainclass = ""; + +static struct options_t options[] = { +{"h", "help"}, +{"V", "version"}, +{"C", "cgi"}, +{"v", "verbose"}, +{"o", "output"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfc - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "o")) { + outputname = val; + override_outputname = 1; + return 1; + } + else if(!strcmp(name, "O")) { + optimize = 1; + return 0; + } + else if(!strcmp(name, "C")) { + do_cgi = 1; + return 0; + } + else if(!strcmp(name, "v")) { + verbose ++; + return 0; + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-o file.swf] file.sc\n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-V , --version Print version info and exit\n"); + printf("-C , --cgi Output to stdout (for use in CGI environments)\n"); + printf("-v , --verbose Increase verbosity. \n"); + printf("-o , --output Set output file to .\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +static struct token_t* file; + +static int pos; +static char*text; +static int textlen; +static int type; + +static void readToken() +{ + type = file[pos].type; + if(type == END) { + syntaxerror("unexpected end of file"); + } + text = file[pos].text; + textlen = strlen(text); + line = file[pos].line; + column = file[pos].column; + pos++; + //printf("---> %d(%s) %s\n", type, type_names[type], text); +} + +static void pushBack() +{ + int p; + if(!pos) syntaxerror("internal error 3"); + pos--; + p = pos; + if(p) p--; + text = file[p].text; + textlen = strlen(text); + type = file[p].type; + line = file[p].line; + column = file[p].column; +} + +static int noMoreTokens() +{ + if(file[pos].type == END) + return 1; + return 0; +} + +enum +{ + PT_PUT = 0, + PT_CHANGE = 1, + PT_SCHANGE = 2, + PT_MOVE = 3, + PT_SMOVE = 4, + PT_SWEEP = 5, + PT_JUMP = 6, + PT_STARTCLIP = 7, + PT_BUTTON = 8 +}; + +// ------------------------------ swf routines ---------------------------- +struct _character; +static struct level +{ + int type; //0=swf, 1=sprite, 2=clip, 3=button + + /* for swf (0): */ + SWF*swf; + char*filename; + char as3; + + /* for sprites (1): */ + TAG*tag; + U16 id; + char*name; + char*as3name; + U16 olddepth; + int oldframe; + dict_t oldinstances; + SRECT oldrect; + TAG* cut; + + SRECT scalegrid; + +} stack[256]; +static int stackpos = 0; + +static dict_t characters; +static dict_t images; +static dict_t textures; +static dict_t outlines; +static dict_t gradients; +static dict_t filters; +static dict_t interpolations; +static char idmap[65536]; +static TAG*tag = 0; //current tag + +static int id; //current character id +static int currentframe; //current frame in current level +static SRECT currentrect; //current bounding box in current level +static U16 currentdepth; +static dict_t instances; +static dict_t fonts; +static dict_t sounds; +static dict_t fontUsage; + +typedef struct _parameters { + int x,y; + float scalex, scaley; + CXFORM cxform; + float rotate; + float shear; + SPOINT pivot; + SPOINT pin; + U8 blendmode; //not interpolated + FILTERLIST* filters; + U16 set; // bits indicating wether a parameter was set in the c_placement function + U16 flags; // bits to toggle anything you may care to implement as a toggle + int noinstancename; +} parameters_t; + +typedef struct _character { + TAG*definingTag; + U16 id; + SRECT size; +} character_t; + +typedef struct _instance { + character_t*character; + U16 depth; + parameters_t parameters; + history_t* history; +} instance_t; + +typedef struct _outline { + SHAPE* shape; + SRECT bbox; +} outline_t; + +typedef struct _gradient { + GRADIENT gradient; + char radial; + int rotate; +} gradient_t; + +typedef struct _filter { + FILTER filter; +} filter_t; + +typedef struct _texture { + FILLSTYLE fs; +} texture_t; + +char* interpolationFunctions[] = {"linear", \ + "quadIn", "quadOut", "quadInOut", \ + "cubicIn", "cubicOut", "cubicInOut", \ + "quartIn", "quartOut", "quartInOut", \ + "quintIn", "quintOut", "quintInOut", \ + "circleIn", "circleOut", "circleInOut", \ + "exponentialIn", "exponentialOut", "exponentialInOut", \ + "sineIn", "sineOut", "sineInOut", \ + "elasticIn", "elasticOut", "elasticInOut", \ + "backIn", "backOut", "backInOut", \ + "bounceIn", "bounceOut", "bounceInOut", \ + "fastBounceIn", "fastBounceOut", "fastBounceInOut"}; + +static void character_init(character_t*c) +{ + memset(c, 0, sizeof(character_t)); +} + +static character_t* character_new() +{ + character_t*c; + c = (character_t*)malloc(sizeof(character_t)); + character_init(c); + return c; +} + +static void instance_init(instance_t*i) +{ + memset(i, 0, sizeof(instance_t)); + i->history = history_new(); +} + +static void instance_free(instance_t* i) +{ + history_free(i->history); + free(i); +} + +static instance_t* instance_new() +{ + instance_t*c; + c = (instance_t*)malloc(sizeof(instance_t)); + instance_init(c); + return c; +} + +static void free_instance(void* i) +{ + instance_free((instance_t*)i); +} + +static void free_font(void* f) +{ + swf_FontFree((SWFFONT*)f); +} + +static void gradient_free(GRADIENT* grad) +{ + free(grad->ratios); + free(grad->rgba); + free(grad); +} + +static void free_gradient(void* grad) +{ + gradient_free((GRADIENT*) grad); +} + +static void outline_free(outline_t* o) +{ + free(o->shape->data); + free(o->shape); + free(o); +} + +static void free_outline(void* o) +{ + outline_free((outline_t*)o); +} + +static void freeDictionaries() +{ + dict_free_all(&instances, 1, free_instance); + dict_free_all(&characters, 1, free); + dict_free_all(&images, 1, free); + dict_free_all(&textures, 1, free); + dict_free_all(&outlines, 1, free_outline); + dict_free_all(&gradients, 1, free_gradient); + dict_free_all(&filters, 1, free); + dict_free_all(&fonts, 1, free_font); + dict_free_all(&sounds, 1, free); + dict_free_all(&interpolations, 1, free); + cleanUp = 0; +} + +static void freeFontDictionary() +{ + dict_free_all(&fonts, 1, free_font); +} + +static void incrementid() +{ + while(id<65536 && idmap[id]) { + id++; + } + if(id>=65536) + syntaxerror("Out of character ids."); + idmap[id] = 1; +} + +static void s_addcharacter(const char*name, U16 id, TAG*ctag, SRECT r) +{ + if(dict_lookup(&characters, name)) + syntaxerror("character %s defined twice", name); + character_t* c = character_new(); + + c->definingTag = ctag; + c->id = id; + c->size = r; + dict_put(&characters, name, c); + + if(do_exports) { + tag = swf_InsertTag(tag, ST_NAMECHARACTER); + swf_SetU16(tag, id); + swf_SetString(tag, name); + tag = swf_InsertTag(tag, ST_EXPORTASSETS); + swf_SetU16(tag, 1); + swf_SetU16(tag, id); + swf_SetString(tag, name); + } +} +static void s_addimage(const char*name, U16 id, TAG*ctag, SRECT r) +{ + if(dict_lookup(&images, name)) + syntaxerror("image %s defined twice", name); + + character_t* c = character_new(); + c->definingTag = ctag; + c->id = id; + c->size = r; + dict_put(&images, name, c); +} +static instance_t* s_addinstance(const char*name, character_t*c, U16 depth) +{ + if(dict_lookup(&instances, name)) + syntaxerror("object %s defined twice", name); + instance_t* i = instance_new(); + i->character = c; + i->depth = depth; + //swf_GetMatrix(0, &i->matrix); + dict_put(&instances, name, i); + return i; +} + +static void parameters_clear(parameters_t*p) +{ + p->x = 0; p->y = 0; + p->scalex = 1.0; p->scaley = 1.0; + p->pin.x = 0; //1?? + p->pin.y = 0; + p->pivot.x = 0; p->pivot.y = 0; + p->rotate = 0; + p->shear = 0; + p->blendmode = 0; + p->filters = 0; + p->noinstancename = 0; + swf_GetCXForm(0, &p->cxform, 1); +} + +static void makeMatrix(MATRIX*m, parameters_t*p) +{ + SPOINT h; + float sx,r1,r0,sy; + + /* /sx r1\ /x\ + * \r0 sy/ \y/ + */ + + sx = p->scalex*cos(p->rotate/360*2*M_PI); + r1 = -p->scalex*sin(p->rotate/360*2*M_PI)+sx*p->shear; + r0 = p->scaley*sin(p->rotate/360*2*M_PI); + sy = p->scaley*cos(p->rotate/360*2*M_PI)+r0*p->shear; + + m->sx = (int)(sx*65536+0.5); + m->r1 = (int)(r1*65536+0.5); + m->r0 = (int)(r0*65536+0.5); + m->sy = (int)(sy*65536+0.5); + + m->tx = m->ty = 0; + + h = swf_TurnPoint(p->pin, m); + m->tx = p->x - h.x; + m->ty = p->y - h.y; +} + +static MATRIX s_instancepos(SRECT rect, parameters_t*p) +{ + MATRIX m; + SRECT r; + makeMatrix(&m, p); + r = swf_TurnRect(rect, &m); + if(currentrect.xmin == 0 && currentrect.ymin == 0 && + currentrect.xmax == 0 && currentrect.ymax == 0) + currentrect = r; + else + swf_ExpandRect2(¤trect, &r); + return m; +} + +void initBuiltIns() +{ + interpolation_t* new; + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_LINEAR; + dict_put(&interpolations, "linear", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUAD_IN; + new->slope = 0; + dict_put(&interpolations, "quadIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUAD_OUT; + new->slope = 0; + dict_put(&interpolations, "quadOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUAD_IN_OUT; + new->slope = 0; + dict_put(&interpolations, "quadInOut", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_CUBIC_IN; + new->slope = 0; + dict_put(&interpolations, "cubicIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_CUBIC_OUT; + new->slope = 0; + dict_put(&interpolations, "cubicOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_CUBIC_IN_OUT; + new->slope = 0; + dict_put(&interpolations, "cubicInOut", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUART_IN; + new->slope = 0; + dict_put(&interpolations, "quartIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUART_OUT; + new->slope = 0; + dict_put(&interpolations, "quartOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUART_IN_OUT; + new->slope = 0; + dict_put(&interpolations, "quartInOut", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUINT_IN; + new->slope = 0; + dict_put(&interpolations, "quintIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUINT_OUT; + new->slope = 0; + dict_put(&interpolations, "quintOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_QUINT_IN_OUT; + new->slope = 0; + dict_put(&interpolations, "quintInOut", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_CIRCLE_IN; + dict_put(&interpolations, "circleIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_CIRCLE_OUT; + dict_put(&interpolations, "circleOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_CIRCLE_IN_OUT; + dict_put(&interpolations, "circleInOut", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_EXPONENTIAL_IN; + dict_put(&interpolations, "exponentialIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_EXPONENTIAL_OUT; + dict_put(&interpolations, "exponentialOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_EXPONENTIAL_IN_OUT; + dict_put(&interpolations, "exponentialInOut", new); + + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_SINE_IN; + dict_put(&interpolations, "sineIn", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_SINE_OUT; + dict_put(&interpolations, "sineOut", new); + new = (interpolation_t*)malloc(sizeof(interpolation_t)); + new->function = IF_SINE_IN_OUT; + dict_put(&interpolations, "sineInOut", new); + + RGBA c; + memset(&c, 0, sizeof(RGBA)); + gradient_t* noGradient = (gradient_t*)malloc(sizeof(gradient_t)); + noGradient->gradient.ratios = (U8*)malloc(16 * sizeof(U8)); + noGradient->gradient.rgba = (RGBA*)malloc(16 * sizeof(RGBA)); + noGradient->gradient.num = 2; + noGradient->gradient.rgba[0] = c; + noGradient->gradient.ratios[0] = 0; + noGradient->gradient.rgba[1] = c; + noGradient->gradient.ratios[1] = 255; + noGradient->radial = 0; + noGradient->rotate = 0; + dict_put(&gradients, "no_gradient", noGradient); + + noFilters = 0; +// put a no_filters entry in the filters dictionary to provoce a message when a user tries +// to define a no_filters filter. The real filter=no_filters case is handled in parseFilters. + FILTER* dummy = (FILTER*)malloc(sizeof(FILTER)); + dict_put(&filters, "no_filters", dummy); + noBlur = (FILTER_BLUR*) swf_NewFilter(FILTERTYPE_BLUR); + noBlur->passes = 1; + dict_put(&filters, "no_blur", noBlur); + noBevel = (FILTER_BEVEL*) swf_NewFilter(FILTERTYPE_BEVEL); + noBevel->passes = 1; + noBevel->composite = 1; + dict_put(&filters, "no_bevel", noBevel); + noDropshadow = (FILTER_DROPSHADOW*) swf_NewFilter(FILTERTYPE_DROPSHADOW); + noDropshadow->passes = 1; + noDropshadow->composite = 1; + dict_put(&filters, "no_dropshadow", noDropshadow); + noGradientGlow = (FILTER_GRADIENTGLOW*) swf_NewFilter(FILTERTYPE_GRADIENTGLOW); + noGradientGlow->passes = 1; + noGradientGlow->composite = 1; + noGradientGlow->gradient = &noGradient->gradient; + dict_put(&filters, "no_gradientglow", noGradientGlow); +} + +void s_swf(const char*name, SRECT r, int version, int fps, int compress, RGBA background) +{ + if(stackpos) + syntaxerror(".swf blocks can't be nested"); + if(stackpos==sizeof(stack)/sizeof(stack[0])) + syntaxerror("too many levels of recursion"); + + SWF*swf = (SWF*)malloc(sizeof(SWF)); + + memset(swf, 0, sizeof(swf)); + swf->fileVersion = version; + swf->movieSize = r; + swf->frameRate = fps; + swf->firstTag = tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); + swf->compressed = compress; + swf_SetRGB(tag,&background); + + dict_init(&characters, 16); + dict_init(&images, 16); + dict_init(&textures, 16); + dict_init(&outlines, 16); + dict_init(&gradients, 16); + dict_init(&filters, 16); + dict_init(&instances, 16); + dict_init(&sounds, 16); + dict_init(&interpolations, 16); + initBuiltIns(); + cleanUp = &freeDictionaries; + + memset(&stack[stackpos], 0, sizeof(stack[0])); + stack[stackpos].type = 0; + stack[stackpos].filename = strdup(name); + stack[stackpos].swf = swf; + stack[stackpos].oldframe = -1; + stackpos++; + + currentframe = 0; + memset(¤trect, 0, sizeof(currentrect)); + currentdepth = 1; + + memset(idmap, 0, sizeof(idmap)); + idmap[0]=1; //main movie has ID 0 + + incrementid(); +} + +void s_sprite(const char*name, SRECT*scalegrid, const char*as3name) +{ + tag = swf_InsertTag(tag, ST_DEFINESPRITE); + swf_SetU16(tag, id); //id + swf_SetU16(tag, 0); //frames + + memset(&stack[stackpos], 0, sizeof(stack[0])); + stack[stackpos].type = 1; + stack[stackpos].oldframe = currentframe; + stack[stackpos].olddepth = currentdepth; + stack[stackpos].oldrect = currentrect; + stack[stackpos].oldinstances = instances; + stack[stackpos].tag = tag; + stack[stackpos].id = id; + stack[stackpos].name = strdup(name); + stack[stackpos].as3name = strdup(as3name); + if(scalegrid) { + stack[stackpos].scalegrid = *scalegrid; + } else { + memset(&stack[stackpos].scalegrid, 0, sizeof(SRECT)); + } + + /* FIXME: those four fields should be bundled together */ + dict_init(&instances, 16); + currentframe = 0; + currentdepth = 1; + memset(¤trect, 0, sizeof(currentrect)); + + stackpos++; + incrementid(); +} + +typedef struct _buttonrecord +{ + U16 id; + MATRIX matrix; + CXFORM cxform; + char set; +} buttonrecord_t; + +typedef struct _button +{ + int endofshapes; + int nr_actions; + buttonrecord_t records[4]; +} button_t; + +static button_t mybutton; + +void s_button(const char*name, const char*as3name) +{ + tag = swf_InsertTag(tag, ST_DEFINEBUTTON2); + swf_SetU16(tag, id); //id + swf_ButtonSetFlags(tag, 0); //menu=no + + memset(&mybutton, 0, sizeof(mybutton)); + + memset(&stack[stackpos], 0, sizeof(stack[0])); + stack[stackpos].type = 3; + stack[stackpos].tag = tag; + stack[stackpos].id = id; + stack[stackpos].name = strdup(name); + stack[stackpos].as3name = strdup(as3name); + stack[stackpos].oldrect = currentrect; + memset(¤trect, 0, sizeof(currentrect)); + + stackpos++; + incrementid(); +} +void s_buttonput(const char*character, const char*as, parameters_t p) +{ + character_t* c = dict_lookup(&characters, character); + MATRIX m; + int flags = 0; + const char*o = as,*s = as; + buttonrecord_t r; + if(!stackpos || (stack[stackpos-1].type != 3)) { + syntaxerror(".show may only appear in .button"); + } + if(!c) { + syntaxerror("character %s not known (in .shape %s)", character, character); + } + if(mybutton.endofshapes) { + syntaxerror("a .do may not precede a .show", character, character); + } + + m = s_instancepos(c->size, &p); + + r.id = c->id; + r.matrix = m; + r.cxform = p.cxform; + r.set = 1; + + while(1) { + if(*s==',' || *s==0) { + if(!strncmp(o,"idle",s-o)) {mybutton.records[0]=r;o=s+1;} + else if(!strncmp(o,"shape",s-o)) {mybutton.records[0]=r;o=s+1;} + else if(!strncmp(o,"hover",s-o)) {mybutton.records[1]=r;o=s+1;} + else if(!strncmp(o,"pressed",s-o)) {mybutton.records[2]=r;o=s+1;} + else if(!strncmp(o,"area",s-o)) {mybutton.records[3]=r;o=s+1;} + else syntaxerror("unknown \"as\" argument: \"%s\"", strdup_n(o,s-o)); + } + if(!*s) + break; + s++; + } +} +static void setbuttonrecords(TAG*tag) +{ + int flags[] = {BS_UP,BS_OVER,BS_DOWN,BS_HIT}; + if(!mybutton.endofshapes) { + int t; + + if(!mybutton.records[3].set) { + memcpy(&mybutton.records[3], &mybutton.records[0], sizeof(buttonrecord_t)); + } + + for(t=0;t<4;t++) { + if(mybutton.records[t].set) { + swf_ButtonSetRecord(tag,flags[t],mybutton.records[t].id,1,&mybutton.records[t].matrix,&mybutton.records[t].cxform); + } + } + swf_SetU8(tag,0); // end of button records + mybutton.endofshapes = 1; + } +} + +void s_buttonaction(int flags, const char*action) +{ + ActionTAG* a = 0; + if(flags==0) { + return; + } + if(!stackpos || !stack[stackpos-1].tag || + stack[stackpos-1].tag->id != ST_DEFINEBUTTON2) { + syntaxerror("Need to be inside a button for .on_* commands"); + } + setbuttonrecords(stack[stackpos-1].tag); + + a = swf_ActionCompile(text, stack[0].swf->fileVersion); + if(!a) { + syntaxerror("Couldn't compile ActionScript"); + } + + swf_ButtonSetCondition(stack[stackpos-1].tag, flags); + swf_ActionSet(stack[stackpos-1].tag, a); + mybutton.nr_actions++; + + swf_ActionFree(a); +} + +static void setactionend(TAG*tag) +{ + if(!mybutton.nr_actions) { + /* no actions means we didn't have an actionoffset, + which means we can't signal the end of the + buttonaction records, so, *sigh*, we have + to insert a dummy record */ + swf_SetU16(tag, 0); //offset + swf_SetU16(tag, 0); //condition + swf_SetU8(tag, 0); //action + } +} + +static void s_endButton() +{ + SRECT r; + setbuttonrecords(stack[stackpos-1].tag); + setactionend(stack[stackpos-1].tag); + stackpos--; + + swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions); + + r = currentrect; + + tag = stack[stackpos].tag; + currentrect = stack[stackpos].oldrect; + + s_addcharacter(stack[stackpos].name, stack[stackpos].id, stack[stackpos].tag, r); + + if(*stack[stackpos].as3name) { + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, stack[stackpos].id); + swf_SetString(tag, stack[stackpos].as3name); + } + + free(stack[stackpos].name); +} + +TAG* removeFromTo(TAG*from, TAG*to) +{ + TAG*save = from->prev; + while(from!=to) { + TAG*next = from->next; + if(swf_isAllowedSpriteTag(from)) + swf_DeleteTag(0, from); + from = next; + } + save->next = 0; + return save; +} + +static int parametersChange(history_t* history, int frame) +{ + int willChange = 0; + + willChange = willChange || history_change(history, frame, "x"); + willChange = willChange || history_change(history, frame, "y"); + willChange = willChange || history_change(history, frame, "scalex"); + willChange = willChange || history_change(history, frame, "scaley"); + willChange = willChange || history_change(history, frame, "cxform.r0"); + willChange = willChange || history_change(history, frame, "cxform.g0"); + willChange = willChange || history_change(history, frame, "cxform.b0"); + willChange = willChange || history_change(history, frame, "cxform.a0"); + willChange = willChange || history_change(history, frame, "cxform.r1"); + willChange = willChange || history_change(history, frame, "cxform.g1"); + willChange = willChange || history_change(history, frame, "cxform.b1"); + willChange = willChange || history_change(history, frame, "cxform.a1"); + willChange = willChange || history_change(history, frame, "rotate"); + willChange = willChange || history_change(history, frame, "shear"); + willChange = willChange || history_change(history, frame, "pivot.x"); + willChange = willChange || history_change(history, frame, "pivot.y"); + willChange = willChange || history_change(history, frame, "pin.x"); + willChange = willChange || history_change(history, frame, "pin.y"); + willChange = willChange || history_change(history, frame, "blendmode"); + willChange = willChange || history_changeFilter(history, frame); + + return willChange; +} + +static void free_filterlist(FILTERLIST* f_list) +{ + int i; + for (i = 0; i < f_list->num; i++) + { + if(f_list->filter[i]->type == FILTERTYPE_GRADIENTGLOW) + gradient_free(((FILTER_GRADIENTGLOW*)f_list->filter[i])->gradient); + free(f_list->filter[i]); + } + free(f_list); +} + +static void readParameters(history_t* history, parameters_t* p, int frame) +{ + p->x = history_value(history, frame, "x"); + p->y = history_value(history, frame, "y"); + p->scalex = history_value(history, frame, "scalex"); + p->scaley = history_value(history, frame, "scaley"); + p->cxform.r0 = history_value(history, frame, "cxform.r0"); + p->cxform.g0 = history_value(history, frame, "cxform.g0"); + p->cxform.b0 = history_value(history, frame, "cxform.b0"); + p->cxform.a0 = history_value(history, frame, "cxform.a0"); + p->cxform.r1 = history_value(history, frame, "cxform.r1"); + p->cxform.g1 = history_value(history, frame, "cxform.g1"); + p->cxform.b1 = history_value(history, frame, "cxform.b1"); + p->cxform.a1 = history_value(history, frame, "cxform.a1"); + p->rotate = history_rotateValue(history, frame); + p->shear = history_value(history, frame, "shear"); + p->pivot.x = history_value(history, frame, "pivot.x"); + p->pivot.y = history_value(history, frame, "pivot.y"); + p->pin.x = history_value(history, frame, "pin.x"); + p->pin.y = history_value(history, frame, "pin.y"); + p->blendmode = history_value(history, frame, "blendmode"); + p->filters = history_filterValue(history, frame); +} + +void setPlacement(TAG*tag, U16 id, U16 depth, MATRIX m, const char*name, parameters_t*p, char move) +{ + SWFPLACEOBJECT po; + FILTERLIST flist; + swf_GetPlaceObject(NULL, &po); + po.id = id; + po.depth = depth; + po.matrix = m; + po.cxform = p->cxform; + po.name = (char*)name; + po.move = move; + if(move) + po.id = 0; + if(p->blendmode) { + po.blendmode = p->blendmode; + } + if(p->filters) + po.filters = p->filters; + swf_SetPlaceObject(tag, &po); +} + +static void writeInstance(void* _i) +{ + instance_t*i = (instance_t*)_i; + parameters_t p; + MATRIX m; + int frame = i->history->firstFrame; + TAG* tag = i->history->firstTag; + history_processFlags(i->history); + while (tag && frame < currentframe) + { + frame++; + while (tag && tag->id != ST_SHOWFRAME) + tag = tag->next; + if(parametersChange(i->history, frame)) + { + readParameters(i->history, &p, frame); + m = s_instancepos(i->character->size, &p); + + if(p.blendmode || p.filters) + tag = swf_InsertTag(tag, ST_PLACEOBJECT3); + else + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + setPlacement(tag, 0, i->depth, m, 0, &p, 1); + if(p.filters) + free_filterlist(p.filters); + } else if(tag) { + tag = tag->next; + } + } +} + +void dumpSWF(SWF*swf) +{ + TAG* tag = swf->firstTag; + printf("vvvvvvvvvvvvvvvvvvvvv\n"); + while(tag) { + printf("%8d %s\n", tag->len, swf_TagGetName(tag)); + tag = tag->next; + } + printf("^^^^^^^^^^^^^^^^^^^^^\n"); +} + +static void s_endSprite() +{ + SRECT r = currentrect; + + stackpos--; + instance_t *i; + + dict_foreach_value(&instances, writeInstance); + + if(stack[stackpos].cut) + tag = removeFromTo(stack[stackpos].cut, tag); + + // the writeInstance loop above may have inserted tags after what used to be the current tag, + // so let's make sure 'tag' point to the current tag again. + while (tag->next) + tag = tag->next; + + tag = swf_InsertTag(tag, ST_SHOWFRAME); + tag = swf_InsertTag(tag, ST_END); + + tag = stack[stackpos].tag; + swf_FoldSprite(tag); + + if(stack[stackpos].scalegrid.xmin | stack[stackpos].scalegrid.ymin | + stack[stackpos].scalegrid.xmax | stack[stackpos].scalegrid.ymax) + { + tag = swf_InsertTag(tag, ST_DEFINESCALINGGRID); + swf_SetU16(tag, stack[stackpos].id); + swf_SetRect(tag, &stack[stackpos].scalegrid); + } + + if(tag->next != 0) + syntaxerror("internal error(7)"); + /* TODO: before clearing, prepend "." to names and + copy into old instances dict */ + dict_free_all(&instances, 1, free_instance); + + currentframe = stack[stackpos].oldframe; + currentrect = stack[stackpos].oldrect; + currentdepth = stack[stackpos].olddepth; + instances = stack[stackpos].oldinstances; + + s_addcharacter(stack[stackpos].name, stack[stackpos].id, stack[stackpos].tag, r); + + if(*stack[stackpos].as3name) { + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, stack[stackpos].id); + swf_SetString(tag, stack[stackpos].as3name); + } + + + free(stack[stackpos].name); +} + +static void s_endSWF() +{ + int fi; + SWF* swf; + char*filename; + char*mc=""; + + dict_foreach_value(&instances, writeInstance); + + if(stack[stackpos].cut) + tag = removeFromTo(stack[stackpos].cut, tag); + + stackpos--; + + swf = stack[stackpos].swf; + filename = stack[stackpos].filename; + + // the writeInstance loop above may have inserted tags after what used yo be the current tag, + // so let's make sure 'tag' point to the current tag again. + while (tag->next) + tag = tag->next; + + //if(tag->prev && tag->prev->id != ST_SHOWFRAME) + // tag = swf_InsertTag(tag, ST_SHOWFRAME); + tag = swf_InsertTag(tag, ST_SHOWFRAME); + + if(stack[0].as3) { + TAG*tag = swf->firstTag; + tag = swf_InsertTag(tag, ST_DOABC); + void*code = as3_getcode(); + swf_WriteABC(tag, code); + if(*mainclass) + mc = mainclass; + else if(as3_getglobalclass()) + mc = as3_getglobalclass(); + if(*mc) { + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, 0); + swf_SetString(tag, mc); + } else { + warning("no global public MovieClip subclass"); + } + as3_destroy(); + } + + tag = swf_InsertTag(tag, ST_END); + + swf_OptimizeTagOrder(swf); + + if(optimize) { + swf_Optimize(swf); + } + + if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { + swf->movieSize = currentrect; /* "autocrop" */ + } + + if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { + swf->movieSize.xmax += 20; /* 1 by 1 pixels */ + swf->movieSize.ymax += 20; + warning("Empty bounding box for movie"); + } + + if(do_cgi || !strcmp(filename, "-")) + fi = fileno(stdout); + else + fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if(fi<0) { + syntaxerror("couldn't create output file %s", filename); + } + if(do_cgi) + {if(swf_WriteCGI(swf)<0) syntaxerror("WriteCGI() failed.\n");} + else + {if(swf_WriteSWF(fi, swf)<0) syntaxerror("WriteSWF() failed.\n");} + + close(fi); + + freeDictionaries(); + + swf_FreeTags(swf); + free(swf); + free(filename); +} + +void s_close() +{ + if(stackpos) { + if(stack[stackpos-1].type == 0) + syntaxerror("End of file encountered in .flash block"); + if(stack[stackpos-1].type == 1) + syntaxerror("End of file encountered in .sprite block"); + if(stack[stackpos-1].type == 2) + syntaxerror("End of file encountered in .clip block"); + } +} + +int s_getframe() +{ + return currentframe+1; +} + +void s_frame(int nr, int cut, const char*name, char anchor) +{ + int t; + TAG*now = tag; + + if(nr<1) + syntaxerror("Illegal frame number"); + nr--; // internally, frame 1 is frame 0 + + for(t=currentframe;tfs); + } else if((image = dict_lookup(&images, name))) { + MATRIX m; + swf_GetMatrix(0, &m); + m.sx = 65536.0*20.0*(r->xmax - r->xmin)/image->size.xmax; + m.sy = 65536.0*20.0*(r->ymax - r->ymin)/image->size.ymax; + m.tx = r->xmin; + m.ty = r->ymin; + return swf_ShapeAddBitmapFillStyle(s, &m, image->id, 0); + } else if((gradient = dict_lookup(&gradients, name))) { + SRECT r2; + MATRIX rot,m; + double ccos,csin; + swf_GetMatrix(0, &rot); + ccos = cos(-gradient->rotate*2*M_PI/360); + csin = sin(-gradient->rotate*2*M_PI/360); + rot.sx = ccos*65536; + rot.r1 = -csin*65536; + rot.r0 = csin*65536; + rot.sy = ccos*65536; + r2 = swf_TurnRect(*r, &rot); + swf_GetMatrix(0, &m); + m.sx = (r2.xmax - r2.xmin)*2*ccos; + m.r1 = -(r2.xmax - r2.xmin)*2*csin; + m.r0 = (r2.ymax - r2.ymin)*2*csin; + m.sy = (r2.ymax - r2.ymin)*2*ccos; + m.tx = r->xmin + (r->xmax - r->xmin)/2; + m.ty = r->ymin + (r->ymax - r->ymin)/2; + return swf_ShapeAddGradientFillStyle(s, &m, &gradient->gradient, gradient->radial); + } else if(parseColor2(name, &color)) { + return swf_ShapeAddSolidFillStyle(s, &color); + } else { + syntaxerror("not a color/fillstyle: %s", name); + return 0; + } +} + +RGBA black={r:0,g:0,b:0,a:0}; +void s_box(const char*name, int width, int height, RGBA color, int linewidth, const char*texture) +{ + SRECT r,r2; + SHAPE* s; + int ls1=0,fs1=0; + r2.xmin = 0; + r2.ymin = 0; + r2.xmax = width; + r2.ymax = height; + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); + swf_ShapeNew(&s); + if(linewidth) { + linewidth = linewidth>=20?linewidth-20:0; + ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); + } + if(texture) + fs1 = addFillStyle(s, &r2, texture); + + swf_SetU16(tag,id); + r.xmin = r2.xmin-linewidth/2; + r.ymin = r2.ymin-linewidth/2; + r.xmax = r2.xmax+linewidth/2; + r.ymax = r2.ymax+linewidth/2; + swf_SetRect(tag,&r); + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); + swf_ShapeSetLine(tag,s,width,0); + swf_ShapeSetLine(tag,s,0,height); + swf_ShapeSetLine(tag,s,-width,0); + swf_ShapeSetLine(tag,s,0,-height); + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); + + s_addcharacter(name, id, tag, r); + incrementid(); +} + +void s_filled(const char*name, const char*outlinename, RGBA color, int linewidth, const char*texture) +{ + SRECT rect,r2; + SHAPE* s; + int ls1,fs1=0; + outline_t* outline; + outline = dict_lookup(&outlines, outlinename); + if(!outline) { + syntaxerror("outline %s not defined", outlinename); + } + r2 = outline->bbox; + + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); + swf_ShapeNew(&s); + if(linewidth) { + linewidth = linewidth>=20?linewidth-20:0; + ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); + } + if(texture) + fs1 = addFillStyle(s, &r2, texture); + + swf_SetU16(tag,id); + rect.xmin = r2.xmin-linewidth/2; + rect.ymin = r2.ymin-linewidth/2; + rect.xmax = r2.xmax+linewidth/2; + rect.ymax = r2.ymax+linewidth/2; + + swf_SetRect(tag,&rect); + swf_SetShapeStyles(tag, s); + swf_ShapeCountBits(s,0,0); + swf_RecodeShapeData(outline->shape->data, outline->shape->bitlen, outline->shape->bits.fill, outline->shape->bits.line, + &s->data, &s->bitlen, s->bits.fill, s->bits.line); + swf_SetShapeBits(tag, s); + swf_SetBlock(tag, s->data, (s->bitlen+7)/8); + swf_ShapeFree(s); + + s_addcharacter(name, id, tag, rect); + incrementid(); +} + +void s_circle(const char*name, int r, RGBA color, int linewidth, const char*texture) +{ + SRECT rect,r2; + SHAPE* s; + int ls1=0,fs1=0; + r2.xmin = r2.ymin = 0; + r2.xmax = 2*r; + r2.ymax = 2*r; + + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); + swf_ShapeNew(&s); + if(linewidth) { + linewidth = linewidth>=20?linewidth-20:0; + ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); + } + if(texture) + fs1 = addFillStyle(s, &r2, texture); + swf_SetU16(tag,id); + rect.xmin = r2.xmin-linewidth/2; + rect.ymin = r2.ymin-linewidth/2; + rect.xmax = r2.xmax+linewidth/2; + rect.ymax = r2.ymax+linewidth/2; + + swf_SetRect(tag,&rect); + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); + swf_ShapeSetCircle(tag, s, r,r,r,r); + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); + + s_addcharacter(name, id, tag, rect); + incrementid(); +} + +void s_textshape(const char*name, const char*fontname, float size, const char*_text) +{ + int g; + U8*text = (U8*)_text; + outline_t* outline; + + SWFFONT*font; + font = dict_lookup(&fonts, fontname); + if(!font) + syntaxerror("font \"%s\" not known!", fontname); + + if(text[0] >= font->maxascii || font->ascii2glyph[text[0]]<0) { + warning("no character 0x%02x (%c) in font \"%s\"", text[0], text[0], fontname); + s_box(name, 0, 0, black, 20, 0); + return; + } + g = font->ascii2glyph[text[0]]; + + outline = malloc(sizeof(outline_t)); + memset(outline, 0, sizeof(outline_t)); + outline->shape = font->glyph[g].shape; + outline->bbox = font->layout->bounds[g]; + + { + drawer_t draw; + swf_Shape11DrawerInit(&draw, 0); + swf_DrawText(&draw, font, (int)(size*100), (char*)_text); + draw.finish(&draw); + outline->shape = swf_ShapeDrawerToShape(&draw); + outline->bbox = swf_ShapeDrawerGetBBox(&draw); + draw.dealloc(&draw); + } + + if(dict_lookup(&outlines, name)) + syntaxerror("outline %s defined twice", name); + dict_put(&outlines, name, outline); +} + +void s_text(const char*name, const char*fontname, const char*text, int size, RGBA color) +{ + SRECT r; + MATRIX _m,*m=0; + SWFFONT*font; + font = dict_lookup(&fonts, fontname); + if(!font) + syntaxerror("font \"%s\" not known!", fontname); + + tag = swf_InsertTag(tag, ST_DEFINETEXT2); + swf_SetU16(tag, id); + if(!font->numchars) { + s_box(name, 0, 0, black, 20, 0); + return; + } + r = swf_SetDefineText(tag, font, &color, (char*)text, size); + + if(stack[0].swf->fileVersion >= 8) { + tag = swf_InsertTag(tag, ST_CSMTEXTSETTINGS); + swf_SetU16(tag, id); + swf_SetU8(tag, /*grid*/(1<<3)|/*flashtype*/0x40); + swf_SetU32(tag, 0);//thickness + swf_SetU32(tag, 0);//sharpness + swf_SetU8(tag, 0);//reserved + } + + s_addcharacter(name, id, tag, r); + incrementid(); +} + +void s_quicktime(const char*name, const char*url) +{ + SRECT r; + MATRIX _m,*m=0; + + memset(&r, 0, sizeof(r)); + + tag = swf_InsertTag(tag, ST_DEFINEMOVIE); + swf_SetU16(tag, id); + swf_SetString(tag, url); + + s_addcharacter(name, id, tag, r); + incrementid(); +} + +void s_video(const char *name, int width, int height) +{ + SRECT r; + + memset(&r, 0, sizeof(r)); + + tag = swf_InsertTag(tag, ST_DEFINEVIDEOSTREAM); + swf_SetU16(tag, id); + swf_SetU16(tag, 0); // numframes + swf_SetU16(tag, width); + swf_SetU16(tag, height); + swf_SetU8(tag, 0); // videoflags + swf_SetU8(tag, 0); // codecid + + s_addcharacter(name, id, tag, r); + incrementid(); +} + +void s_edittext(const char*name, const char*fontname, int size, int width, int height, const char*text, RGBA*color, int maxlength, const char*variable, int flags, int align) +{ + SWFFONT*font = 0; + EditTextLayout layout; + SRECT r; + + if(fontname && *fontname) { + flags |= ET_USEOUTLINES; + font = dict_lookup(&fonts, fontname); + if(!font) + syntaxerror("font \"%s\" not known!", fontname); + } + tag = swf_InsertTag(tag, ST_DEFINEEDITTEXT); + swf_SetU16(tag, id); + layout.align = align; + layout.leftmargin = 0; + layout.rightmargin = 0; + layout.indent = 0; + layout.leading = 0; + r.xmin = 0; + r.ymin = 0; + r.xmax = width; + r.ymax = height; + + swf_SetEditText(tag, flags, r, (char*)text, color, maxlength, font?font->id:0, size, &layout, (char*)variable); + + s_addcharacter(name, id, tag, r); + incrementid(); +} + +/* type: either "jpeg" or "png" + */ +void s_image(const char*name, const char*type, const char*filename, int quality) +{ + /* an image is actually two folded: 1st bitmap, 2nd character. + Both of them can be used separately */ + + /* step 1: the bitmap */ + SRECT r; + int imageID = id; + unsigned width, height; + if(!strcmp(type,"jpeg")) { +#ifndef HAVE_JPEGLIB + warning("no jpeg support compiled in"); + s_box(name, 0, 0, black, 20, 0); + return; +#else + tag = swf_InsertTag(tag, ST_DEFINEBITSJPEG2); + swf_SetU16(tag, imageID); + + if(swf_SetJPEGBits(tag, (char*)filename, quality) < 0) { + syntaxerror("Image \"%s\" not found, or contains errors", filename); + } + + swf_GetJPEGSize(filename, &width, &height); + + r.xmin = 0; + r.ymin = 0; + r.xmax = width*20; + r.ymax = height*20; + + s_addimage(name, id, tag, r); + incrementid(); +#endif + } else if(!strcmp(type,"png")) { + RGBA*data = 0; + swf_SetU16(tag, imageID); + + png_load(filename, &width, &height, (unsigned char**)&data); + + if(!data) { + syntaxerror("Image \"%s\" not found, or contains errors", filename); + } + + /*tag = swf_AddImage(tag, imageID, data, width, height, quality)*/ + tag = swf_InsertTag(tag, ST_DEFINEBITSLOSSLESS); + swf_SetU16(tag, imageID); + swf_SetLosslessImage(tag, data, width, height); + free(data); + + r.xmin = 0; + r.ymin = 0; + r.xmax = width*20; + r.ymax = height*20; + s_addimage(name, id, tag, r); + incrementid(); + } else { + warning("image type \"%s\" not supported yet!", type); + s_box(name, 0, 0, black, 20, 0); + return; + } + + /* step 2: the character */ + tag = swf_InsertTag(tag, ST_DEFINESHAPE); // todo: should be defineshape2/3 once images can be transparent.(?) + swf_SetU16(tag, id); + swf_ShapeSetBitmapRect(tag, imageID, width, height); + + s_addcharacter(name, id, tag, r); + incrementid(); +} + +void s_getBitmapSize(const char*name, int*width, int*height) +{ + character_t* image = dict_lookup(&images, name); + gradient_t* gradient = dict_lookup(&gradients,name); + if(image) { + *width = image->size.xmax; + *height = image->size.ymax; + return; + } + if(gradient) { + /* internal SWF gradient size */ + if(gradient->radial) { + *width = 16384; + *height = 16384; + } else { + *width = 32768; + *height = 32768; + } + return; + } + syntaxerror("No such bitmap/gradient: %s", name); +} + +void s_texture(const char*name, const char*object, int x, int y, float scalex, float scaley, float rotate, float shear) +{ + if(dict_lookup(&textures, name)) + syntaxerror("texture %s defined twice", name); + gradient_t* gradient = dict_lookup(&gradients, object); + character_t* bitmap = dict_lookup(&images, object); + texture_t* texture = (texture_t*)rfx_calloc(sizeof(texture_t)); + parameters_t p; + FILLSTYLE*fs = &texture->fs; + + memset(&p, 0, sizeof(parameters_t)); + + if(bitmap) { + fs->type = FILL_TILED; + fs->id_bitmap = bitmap->id; + } else if(gradient) { + fs->type = gradient->radial?FILL_RADIAL:FILL_LINEAR; + fs->gradient = gradient->gradient; + } + p.x = x;p.y = y;p.scalex = scalex;p.scaley = scaley;p.rotate=rotate;p.shear=shear; + makeMatrix(&fs->m, &p); + if(gradient && !gradient->radial) { + MATRIX m = fs->m; + SPOINT p1,p2; + m.tx = 0; + m.ty = 0; + p1.x = 16384; + p1.y = 16384; + p2 = swf_TurnPoint(p1, &m); + fs->m.tx += p2.x; + fs->m.ty += p2.y; + } + if(bitmap) { + fs->m.sx *= 20; + fs->m.sy *= 20; + } + + dict_put(&textures, name, texture); +} + +void s_createfont(const char*name, const char*filename, const char*glyphs, char flashtype) +{ + if(dict_lookup(&fonts, name)) + syntaxerror("font %s defined twice", name); + + SWFFONT* font = swf_LoadFont(filename, flashtype); + if(font == 0) { + warning("Couldn't open font file \"%s\"", filename); + font = (SWFFONT*)malloc(sizeof(SWFFONT)); + memset(font, 0, sizeof(SWFFONT)); + dict_put(&fonts, name, font); + return; + } + swf_FontPrepareForEditText(font); + + if(!strcmp(glyphs, "all")) { + swf_FontUseAll(font); + font->use->glyphs_specified = 1; + } else { + if(!glyphs[0]) { + swf_FontInitUsage(font); + } else { + swf_FontUseUTF8(font, (const U8*)glyphs, 0xffff); + font->use->glyphs_specified = 1; + } + } + dict_put(&fonts, name, font); +} + +void s_font(const char*name, const char*filename) +{ + SWFFONT* font; + font = dict_lookup(&fonts, name); + font->id = id; + swf_FontReduce_swfc(font); + + if(font->version>=3 && stack[0].swf->fileVersion < 8) { + warning("flashtype not supported for flash versions 8 and below"); + } + + tag = swf_InsertTag(tag, font->version==3?ST_DEFINEFONT3:ST_DEFINEFONT2); + swf_FontSetDefine2(tag, font); + + if(do_exports) { + tag = swf_InsertTag(tag, ST_EXPORTASSETS); + swf_SetU16(tag, 1); + swf_SetU16(tag, id); + swf_SetString(tag, name); + } + + incrementid(); +} + + + +typedef struct _sound_t +{ + U16 id; + TAG*tag; +} sound_t; + +void s_sound(const char*name, const char*filename) +{ + struct WAV wav, wav2; + struct MP3 mp3; + sound_t* sound; + U16*samples = NULL; + unsigned numsamples = 1; + unsigned blocksize = 1152; + int is_mp3 = 0; + + if(dict_lookup(&sounds, name)) + syntaxerror("sound %s defined twice", name); + + if(wav_read(&wav, filename)) + { + int t; + wav_convert2mono(&wav, &wav2, 44100); + samples = (U16*)wav2.data; + numsamples = wav2.size/2; + free(wav.data); +#ifdef WORDS_BIGENDIAN + /* swap bytes */ + for(t=0;t>8)&0xff | (samples[t]<<8)&0xff00; +#endif + } + else + if(mp3_read(&mp3, filename)) + { + fprintf(stderr, "\"%s\" seems to work as a MP3 file...\n", filename); + blocksize = 1; + is_mp3 = 1; + } + else + { + warning("Couldn't read WAV/MP3 file \"%s\"", filename); + samples = 0; + numsamples = 0; + } + + if(numsamples%blocksize != 0) + { + // apply padding, so that block is a multiple of blocksize + int numblocks = (numsamples+blocksize-1)/blocksize; + int numsamples2; + U16* samples2; + numsamples2 = numblocks * blocksize; + samples2 = malloc(sizeof(U16)*numsamples2); + memcpy(samples2, samples, numsamples*sizeof(U16)); + memset(&samples2[numsamples], 0, sizeof(U16)*(numsamples2 - numsamples)); + numsamples = numsamples2; + free(samples); + samples = samples2; + } + + tag = swf_InsertTag(tag, ST_DEFINESOUND); + swf_SetU16(tag, id); //id + if(is_mp3) + { + swf_SetSoundDefineMP3( + tag, mp3.data, mp3.size, + mp3.SampRate, + mp3.Channels, + mp3.NumFrames); + mp3_clear(&mp3); + } + else + swf_SetSoundDefine(tag, samples, numsamples); + + if(do_exports) { + tag = swf_InsertTag(tag, ST_NAMECHARACTER); + swf_SetU16(tag, id); + swf_SetString(tag, name); + tag = swf_InsertTag(tag, ST_EXPORTASSETS); + swf_SetU16(tag, 1); + swf_SetU16(tag, id); + swf_SetString(tag, name); + } + + sound = (sound_t*)malloc(sizeof(sound_t)); /* mem leak */ + sound->tag = tag; + sound->id = id; + + dict_put(&sounds, name, sound); + + incrementid(); + + if(samples) + free(samples); +} + +static char* gradient_getToken(const char**p) +{ + const char*start; + char*result; + while(**p && strchr(" \t\n\r", **p)) { + (*p)++; + } + start = *p; + while(**p && !strchr(" \t\n\r", **p)) { + (*p)++; + } + result = malloc((*p)-start+1); + memcpy(result,start,(*p)-start+1); + result[(*p)-start] = 0; + return result; +} + +float parsePercent(const char*str); +RGBA parseColor(const char*str); + +GRADIENT parseGradient(const char*str) +{ + GRADIENT gradient; + int lastpos = -1; + const char* p = str; + memset(&gradient, 0, sizeof(GRADIENT)); + gradient.ratios = rfx_calloc(16*sizeof(U8)); + gradient.rgba = rfx_calloc(16*sizeof(RGBA)); + + while(*p) + { + char*posstr,*colorstr; + int pos; + RGBA color; + posstr = gradient_getToken(&p); + if(!*posstr) + { + free(posstr); + break; + } + pos = (int)(parsePercent(posstr)*255.0); + if(pos == lastpos) + pos++; + if(!*p) + { + rfx_free(gradient.ratios); + rfx_free(gradient.rgba); + free(posstr); + syntaxerror("Error in shape data: Color expected after %s", posstr); + } + colorstr = gradient_getToken(&p); + color = parseColor(colorstr); + if(gradient.num == 16) + { + warning("gradient record too big- max size is 16, rest ignored"); + break; + } + gradient.ratios[gradient.num] = pos; + gradient.rgba[gradient.num] = color; + gradient.num++; + free(posstr); + free(colorstr); + lastpos = pos; + } + return gradient; +} + +FILTERLIST* parseFilters(char* list) +{ + if(!strcmp(list, "no_filters")) + return 0; + FILTER* f; + FILTERLIST* f_list = (FILTERLIST*)malloc(sizeof(FILTERLIST)); + f_list->num = 0; + char* f_start = list; + char* f_end; + while (f_start) + { + f_end = strchr(f_start, ','); + if(f_end) + *f_end = '\0'; + f = dict_lookup(&filters, f_start); + if(!f) + { + free(f_list); + syntaxerror("unknown filter %s", f_start); + } + if(f_list->num == 8) + { + warning("too many filters in filterlist, no more than 8 please, rest ignored"); + break; + } + f_list->filter[f_list->num] = f; + f_list->num++; + if(f_end) + { + *f_end = ','; + f_start = f_end + 1; + } + else + f_start = 0; + } + return f_list; +} + +void s_gradient(const char*name, const char*text, int radial, int rotate) +{ + gradient_t* gradient; + gradient = malloc(sizeof(gradient_t)); + memset(gradient, 0, sizeof(gradient_t)); + gradient->gradient = parseGradient(text); + gradient->radial = radial; + gradient->rotate = rotate; + + dict_put(&gradients, name, gradient); +} + +void s_gradientglow(const char*name, const char*gradient, float blurx, float blury, + float angle, float distance, float strength, char innershadow, + char knockout, char composite, char ontop, int passes) +{ + if(dict_lookup(&filters, name)) + syntaxerror("filter %s defined twice", name); + + gradient_t* g = dict_lookup(&gradients, gradient); + if(!g) + syntaxerror("unknown gradient %s", gradient); + + composite = 1; + + FILTER_GRADIENTGLOW* filter = rfx_calloc(sizeof(FILTER_GRADIENTGLOW)); + filter->type = FILTERTYPE_GRADIENTGLOW; + filter->gradient = &g->gradient; + filter->blurx = blurx; + filter->blury = blury; + filter->strength = strength; + filter->angle = angle; + filter->distance = distance; + filter->innershadow = innershadow; + filter->knockout = knockout; + filter->composite = composite; + filter->ontop = ontop; + filter->passes = passes; + + dict_put(&filters, name, filter); +} + +void s_dropshadow(const char*name, RGBA color, double blurx, double blury, double angle, double distance, double strength, char innershadow, char knockout, char composite, int passes) +{ + if(dict_lookup(&filters, name)) + syntaxerror("filter %s defined twice", name); + + composite = 1; + FILTER_DROPSHADOW* filter = rfx_calloc(sizeof(FILTER_DROPSHADOW)); + filter->type = FILTERTYPE_DROPSHADOW; + filter->color= color; + filter->blurx = blurx; + filter->blury = blury; + filter->strength = strength; + filter->angle = angle; + filter->distance = distance; + filter->innershadow = innershadow; + filter->knockout = knockout; + filter->composite = composite; + filter->passes = passes; + + dict_put(&filters, name, filter); +} + +void s_bevel(const char*name, RGBA shadow, RGBA highlight, double blurx, double blury, double angle, double distance, double strength, char innershadow, char knockout, char composite, char ontop, int passes) +{ + if(dict_lookup(&filters, name)) + syntaxerror("filter %s defined twice", name); + + composite = 1; + FILTER_BEVEL* filter = rfx_calloc(sizeof(FILTER_BEVEL)); + filter->type = FILTERTYPE_BEVEL; + filter->shadow = shadow; + filter->highlight = highlight; + filter->blurx = blurx; + filter->blury = blury; + filter->strength = strength; + filter->angle = angle; + filter->distance = distance; + filter->innershadow = innershadow; + filter->knockout = knockout; + filter->composite = composite; + filter->ontop = ontop; + filter->passes = passes; + + dict_put(&filters, name, filter); +} + +void s_blur(const char*name, double blurx, double blury, int passes) +{ + if(dict_lookup(&filters, name)) + syntaxerror("filter %s defined twice", name); + + FILTER_BLUR* filter = rfx_calloc(sizeof(FILTER_BLUR)); + filter->type = FILTERTYPE_BLUR; + filter->blurx = blurx; + filter->blury = blury; + filter->passes = passes; + + dict_put(&filters, name, filter); +} + +void s_action(const char*text) +{ + if(stack[0].swf->fileVersion < 9) { + ActionTAG* a = 0; + a = swf_ActionCompile(text, stack[0].swf->fileVersion); + if(!a) { + swf_ActionFree(a); + syntaxerror("Couldn't compile ActionScript"); + } + tag = swf_InsertTag(tag, ST_DOACTION); + swf_ActionSet(tag, a); + swf_ActionFree(a); + } else { + as3_parse_bytearray(stack[0].filename, text, strlen(text)); + stack[0].as3 = 1; + } +} + +void s_initaction(const char*character, const char*text) +{ + ActionTAG* a = 0; + character_t*c = 0; + a = swf_ActionCompile(text, stack[0].swf->fileVersion); + if(!a) + { + swf_ActionFree(a); + syntaxerror("Couldn't compile ActionScript"); + } + + c = (character_t*)dict_lookup(&characters, character); + + tag = swf_InsertTag(tag, ST_DOINITACTION); + swf_SetU16(tag, c->id); + swf_ActionSet(tag, a); + + swf_ActionFree(a); +} + +int s_swf3action(const char*name, const char*action) +{ + ActionTAG* a = 0; + instance_t* object = 0; + if(name) + object = (instance_t*)dict_lookup(&instances, name); + if(!object && name && *name) { + /* we have a name, but couldn't find it. Abort. */ + return 0; + } + a = action_SetTarget(0, name); + if(!strcmp(action, "nextframe")) a = action_NextFrame(a); + else if(!strcmp(action, "previousframe")) a = action_PreviousFrame(a); + else if(!strcmp(action, "stop")) a = action_Stop(a); + else if(!strcmp(action, "play")) a = action_Play(a); + a = action_SetTarget(a, ""); + a = action_End(a); + + tag = swf_InsertTag(tag, ST_DOACTION); + swf_ActionSet(tag, a); + swf_ActionFree(a); + return 1; +} + +void s_outline(const char*name, const char*format, const char*source) +{ + if(dict_lookup(&outlines, name)) + syntaxerror("outline %s defined twice", name); + + outline_t* outline; + + drawer_t draw; + SHAPE* shape; + SHAPE2* shape2; + SRECT bounds; + + //swf_Shape10DrawerInit(&draw, 0); + swf_Shape11DrawerInit(&draw, 0); + + draw_string(&draw, source); + draw.finish(&draw); + shape = swf_ShapeDrawerToShape(&draw); + bounds = swf_ShapeDrawerGetBBox(&draw); + draw.dealloc(&draw); + + outline = (outline_t*)rfx_calloc(sizeof(outline_t)); + outline->shape = shape; + outline->bbox = bounds; + + dict_put(&outlines, name, outline); +} + +int s_playsound(const char*name, int loops, int nomultiple, int stop) +{ + sound_t* sound; + SOUNDINFO info; + if(!name) + return 0; + sound = dict_lookup(&sounds, name); + if(!sound) + return 0; + + tag = swf_InsertTag(tag, ST_STARTSOUND); + swf_SetU16(tag, sound->id); //id + memset(&info, 0, sizeof(info)); + info.stop = stop; + info.loops = loops; + info.nomultiple = nomultiple; + swf_SetSoundInfo(tag, &info); + return 1; +} + +void s_includeswf(const char*name, const char*filename, const char*as3name) +{ + int f; + SWF swf; + TAG* ftag; + SRECT r; + TAG* s; + int level = 0; + U16 cutout[] = {ST_SETBACKGROUNDCOLOR, ST_PROTECT, ST_FREEALL, ST_REFLEX}; + f = open(filename,O_RDONLY|O_BINARY); + if(f<0) { + warning("Couldn't open file \"%s\": %s", filename, strerror(errno)); + s_box(name, 0, 0, black, 20, 0); + return; + } + if(swf_ReadSWF(f,&swf)<0) { + warning("Only SWF files supported in .shape for now. File \"%s\" wasn't SWF.", filename); + s_box(name, 0, 0, black, 20, 0); + return; + } + close(f); + + /* FIXME: The following sets the bounding Box for the character. + It is wrong for two reasons: + a) It may be too small (in case objects in the movie clip at the borders) + b) it may be too big (because the poor movie never got autocropped) + */ + r = swf.movieSize; + + s = tag = swf_InsertTag(tag, ST_DEFINESPRITE); + swf_SetU16(tag, id); + swf_SetU16(tag, swf.frameCount); + + swf_Relocate(&swf, idmap); + + ftag = swf.firstTag; + level = 1; + while(ftag) { + int t; + for(t=0;tid) { + ftag = ftag->next; + continue; + } + if(ftag->id == ST_DEFINESPRITE && !swf_IsFolded(ftag)) + level++; + if(ftag->id == ST_END) + level--; + if(!level) + break; + + if(ftag->id != ST_SETBACKGROUNDCOLOR) { + /* We simply dump all tags right after the sprite + header, relying on the fact that swf_OptimizeTagOrder() will + sort things out for us later. + We also rely on the fact that the imported SWF is well-formed. + */ + tag = swf_InsertTag(tag, ftag->id); + swf_SetBlock(tag, ftag->data, ftag->len); + } + + ftag = ftag->next; + } + if(!ftag) + syntaxerror("Included file %s contains errors", filename); + tag = swf_InsertTag(tag, ST_END); + + swf_FreeTags(&swf); + + s_addcharacter(name, id, tag, r); + + if(as3name) { + tag = swf_InsertTag(tag, ST_SYMBOLCLASS); + swf_SetU16(tag, 1); + swf_SetU16(tag, id); + swf_SetString(tag, as3name); + } + incrementid(); +} +SRECT s_getCharBBox(const char*name) +{ + character_t* c = dict_lookup(&characters, name); + if(!c) syntaxerror("character '%s' unknown(2)", name); + return c->size; +} +SRECT s_getInstanceBBox(const char*name) +{ + instance_t * i = dict_lookup(&instances, name); + character_t * c; + if(!i) syntaxerror("instance '%s' unknown(4)", name); + c = i->character; + if(!c) syntaxerror("internal error(5)"); + return c->size; +} +void s_getParameters(const char*name, parameters_t* p) +{ + instance_t * i = dict_lookup(&instances, name); + if(!i) + syntaxerror("instance '%s' unknown(10)", name); + if(change_sets_all) + readParameters(i->history, p, currentframe); + else + *p = i->parameters; +} + +void setStartparameters(instance_t* i, parameters_t* p, TAG* tag) +{ + history_begin(i->history, "x", currentframe, tag, p->x); + history_begin(i->history, "y", currentframe, tag, p->y); + history_begin(i->history, "scalex", currentframe, tag, p->scalex); + history_begin(i->history, "scaley", currentframe, tag, p->scaley); + history_begin(i->history, "cxform.r0", currentframe, tag, p->cxform.r0); + history_begin(i->history, "cxform.g0", currentframe, tag, p->cxform.g0); + history_begin(i->history, "cxform.b0", currentframe, tag, p->cxform.b0); + history_begin(i->history, "cxform.a0", currentframe, tag, p->cxform.a0); + history_begin(i->history, "cxform.r1", currentframe, tag, p->cxform.r1); + history_begin(i->history, "cxform.g1", currentframe, tag, p->cxform.g1); + history_begin(i->history, "cxform.b1", currentframe, tag, p->cxform.b1); + history_begin(i->history, "cxform.a1", currentframe, tag, p->cxform.a1); + history_begin(i->history, "rotate", currentframe, tag, p->rotate); + history_begin(i->history, "shear", currentframe, tag, p->shear); + history_begin(i->history, "pivot.x", currentframe, tag, p->pivot.x); + history_begin(i->history, "pivot.y", currentframe, tag, p->pivot.y); + history_begin(i->history, "pin.x", currentframe, tag, p->pin.x); + history_begin(i->history, "pin.y", currentframe, tag, p->pin.y); + history_begin(i->history, "blendmode", currentframe, tag, p->blendmode); + history_beginFilter(i->history, currentframe, tag, p->filters); + history_begin(i->history, "flags", currentframe, tag, 0); +} + +void s_startclip(const char*instance, const char*character, parameters_t p) +{ + character_t* c = dict_lookup(&characters, character); + instance_t* i; + MATRIX m; + if(!c) { + syntaxerror("character %s not known", character); + } + i = s_addinstance(instance, c, currentdepth); + i->parameters = p; + m = s_instancepos(i->character->size, &p); + + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + /* TODO: should be ObjectPlaceClip, with clipdepth backpatched */ + swf_ObjectPlace(tag, c->id, currentdepth, &m, &p.cxform, instance); + + stack[stackpos].tag = tag; + stack[stackpos].type = 2; + stackpos++; + + setStartparameters(i, &p, tag); + currentdepth++; +} +void s_endClip() +{ + SWFPLACEOBJECT p; + stackpos--; + swf_SetTagPos(stack[stackpos].tag, 0); + swf_GetPlaceObject(stack[stackpos].tag, &p); + p.clipdepth = currentdepth; + //p.name = 0; + swf_ClearTag(stack[stackpos].tag); + swf_SetPlaceObject(stack[stackpos].tag, &p); + currentdepth++; +} + +void s_put(const char*instance, const char*character, parameters_t p) +{ + character_t* c = dict_lookup(&characters, character); + instance_t* i; + MATRIX m; + if(!c) + syntaxerror("character %s not known (in .put %s=%s)", character, instance, character); + + i = s_addinstance(instance, c, currentdepth); + i->parameters = p; + m = s_instancepos(i->character->size, &p); + + if(p.blendmode || p.filters) + { + if(stack[0].swf->fileVersion < 8) + { + if(p.blendmode) + warning("blendmodes only supported for flash version>=8"); + else + warning("filters only supported for flash version>=8"); + } + tag = swf_InsertTag(tag, ST_PLACEOBJECT3); + } + else + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + setPlacement(tag, c->id, currentdepth, m, p.noinstancename ? NULL : instance, &p, 0); + setStartparameters(i, &p, tag); + currentdepth++; +} + +void recordChanges(history_t* history, parameters_t p, int changeFunction, interpolation_t* inter) +{ + if(p.set & SF_X) + history_remember(history, "x", currentframe, changeFunction, p.x, inter); + if(p.set & SF_Y) + history_remember(history, "y", currentframe, changeFunction, p.y, inter); + if(p.set & SF_SCALEX) + history_remember(history, "scalex", currentframe, changeFunction, p.scalex, inter); + if(p.set & SF_SCALEY) + history_remember(history, "scaley", currentframe, changeFunction, p.scaley, inter); + if(p.set & SF_CX_R) + { + history_remember(history, "cxform.r0", currentframe, changeFunction, p.cxform.r0, inter); + history_remember(history, "cxform.r1", currentframe, changeFunction, p.cxform.r1, inter); + } + if(p.set & SF_CX_G) + { + history_remember(history, "cxform.g0", currentframe, changeFunction, p.cxform.g0, inter); + history_remember(history, "cxform.g1", currentframe, changeFunction, p.cxform.g1, inter); + } + if(p.set & SF_CX_B) + { + history_remember(history, "cxform.b0", currentframe, changeFunction, p.cxform.b0, inter); + history_remember(history, "cxform.b1", currentframe, changeFunction, p.cxform.b1, inter); + } + if(p.set & SF_CX_A) + { + history_remember(history, "cxform.a0", currentframe, changeFunction, p.cxform.a0, inter); + history_remember(history, "cxform.a1", currentframe, changeFunction, p.cxform.a1, inter); + } + if(p.set & SF_ROTATE) + history_remember(history, "rotate", currentframe, changeFunction, p.rotate, inter); + if(p.set & SF_SHEAR) + history_remember(history, "shear", currentframe, changeFunction, p.shear, inter); + if(p.set & SF_PIVOT) + { + history_remember(history, "pivot.x", currentframe, changeFunction, p.pivot.x, inter); + history_remember(history, "pivot.y", currentframe, changeFunction, p.pivot.y, inter); + } + if(p.set & SF_PIN) + { + history_remember(history, "pin.x", currentframe, changeFunction, p.pin.x, inter); + history_remember(history, "pin.y", currentframe, changeFunction, p.pin.y, inter); + } + if(p.set & SF_BLEND) + history_remember(history, "blendmode", currentframe, changeFunction, p.blendmode, inter); + if(p.set & SF_FILTER) + history_rememberFilter(history, currentframe, changeFunction, p.filters, inter); +} + +void s_jump(const char* instance, parameters_t p) +{ + instance_t* i = dict_lookup(&instances, instance); + if(!i) + syntaxerror("instance %s not known", instance); + recordChanges(i->history, p, CF_JUMP, 0); +} + +void s_change(const char*instance, parameters_t p, interpolation_t* inter) +{ + instance_t* i = dict_lookup(&instances, instance); + if(!i) + syntaxerror("instance %s not known", instance); + recordChanges(i->history, p, CF_CHANGE, inter); +} + +void s_sweep(const char* instance, parameters_t p, float radius, int clockwise, int short_arc, interpolation_t* inter) +{ + instance_t* i = dict_lookup(&instances, instance); + if(!i) + syntaxerror("instance %s not known", instance); + history_rememberSweep(i->history, currentframe, p.x, p.y, radius, clockwise, short_arc, inter); +} + +void s_toggle(const char* instance, U16 flagsOn, U16 flagsOff) +{ + instance_t* i = dict_lookup(&instances, instance); + if(!i) + syntaxerror("instance %s not known", instance); + U16 flags = (U16)history_value(i->history, currentframe, "flags"); + flags |= flagsOn; + flags &= flagsOff; + history_remember(i->history, "flags", currentframe, CF_JUMP, flags, 0); +} + +void s_delinstance(const char*instance) +{ + instance_t* i = dict_lookup(&instances, instance); + if(!i) + syntaxerror("instance %s not known", instance); + writeInstance(i); + tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); + swf_SetU16(tag, i->depth); + dict_del(&instances, instance); + free(i); +} + +void s_schange(const char*instance, parameters_t p, interpolation_t* inter) +{ + instance_t* i = dict_lookup(&instances, instance); + if(!i) + syntaxerror("instance %s not known", instance); + recordChanges(i->history, p, CF_SCHANGE, inter); +} + +void s_end() +{ + if(!stackpos) + syntaxerror(".end unexpected"); + switch (stack[stackpos-1].type) + { + case 0: + s_endSWF(); + break; + case 1: + s_endSprite(); + break; + case 2: + s_endClip(); + break; + case 3: + s_endButton(); + break; + default: + syntaxerror("internal error 1"); + } +} + +// ------------------------------------------------------------------------ + +typedef int command_func_t(map_t*args); + +SRECT parseBox(const char*str) +{ + SRECT r = {0,0,0,0}; + float xmin, xmax, ymin, ymax; + char*x = strchr(str, 'x'); + char*d1=0,*d2=0; + if(!strcmp(str, "autocrop")) { + r.xmin = r.ymin = r.xmax = r.ymax = 0; + return r; + } + if(!x) goto error; + d1 = strchr(x+1, ':'); + if(d1) + d2 = strchr(d1+1, ':'); + if(!d1) { + if(sscanf(str, "%fx%f", &xmax, &ymax) < 2) + goto error; + xmin = ymin = 0; + } + else if(d1 && !d2) { + if(sscanf(str, "%fx%f:%f", &xmax, &ymax, &xmin) < 3) + goto error; + xmax += xmin; + ymin = 0; + } + else { + if(sscanf(str, "%fx%f:%f:%f", &xmax, &ymax, &xmin, &ymin) < 4) + goto error; + xmax += xmin; + ymax += ymin; + } + r.xmin = (SCOORD)(xmin*20); + r.ymin = (SCOORD)(ymin*20); + r.xmax = (SCOORD)(xmax*20); + r.ymax = (SCOORD)(ymax*20); + return r; +error: + syntaxerror("expression %s is not a valid bound Box.\nE.g. 1024x768 or 1024x768:30:30 would have been valid bounding Boxes.", str); + return r; +} +float parseFloat(const char*str) +{ + return atof(str); +} +int parseInt(const char*str) +{ + int t; + int l=strlen(str); + int s=0; + if(str[0]=='+' || str[0]=='-') + s++; + + for(t=s;t'9') + syntaxerror("Not an Integer: \"%s\"", str); + return atoi(str); +} +static double parseRawTwip(const char*str) +{ + char*dot; + int sign=1; + if(str[0]=='+' || str[0]=='-') { + if(str[0]=='-') + sign = -1; + str++; + } + dot = strchr(str, '.'); + if(!dot) { + int l=strlen(str); + int t; + return sign*parseInt(str); + } else { + char* old = strdup(str); + int l=strlen(dot+1); + const char*s; + *dot++ = 0; + for(s=str;s'9') + { + free(old); + syntaxerror("Not a coordinate: \"%s\"", str); + } + } + for(s=dot;*s;s++) { + if(*s<'0' || *s>'9') + { + free(old); + syntaxerror("Not a coordinate: \"%s\"", str); + } + } + if(l>2 || (l==2 && (dot[1]!='0' && dot[1]!='5'))) { + dot[1] = ((dot[1]-0x30)/5)*5 + 0x30; + dot[2] = 0; + l=2; + warning("precision loss: %s converted to twip: %s.%s", old, str, dot); + } + free(old); + if(l==0) + return sign*(atoi(str)); + if(l==1) + return sign*(atoi(str)+0.1*atoi(dot)); + if(l==2) + return sign*(atoi(str)+0.01*atoi(dot)); + } + return 0; +} + +static dict_t defines; +static int defines_initialized = 0; +static mem_t define_values; + +static double parseNameOrTwip(const char*s) +{ + int l = 0; + double v; + if(defines_initialized) { + l = PTR_AS_INT(dict_lookup(&defines, s)); + } + if(l) { + return *(int*)&define_values.buffer[l-1]; + } else { + return parseRawTwip(s); + } +} + +/* automatically generated by yiyiyacc, http://www.quiss.org/yiyiyacc/ */ +static double parseExpression(char*s) +{ + int chr2index[256]; + memset(chr2index, -1, sizeof(chr2index)); + chr2index['+'] = 0; + chr2index['-'] = 1; + chr2index['*'] = 2; + chr2index['/'] = 3; + chr2index['('] = 5; + chr2index[')'] = 6; + chr2index['\0'] = 7; + + int stackpos = 1; + int stack[256]; + double values[256]; + stack[0]=0; + values[0]=0; + int accept = 18; + int left[10]={11,8,8,8,8,9,9,9,10,10}; //production left side + int plen[10]={1,3,2,3,1,3,3,1,1,3}; //production size + int table[18][12] = { + {0, 4, 0, 0, 5, 6, 0, 0, 1, 2, 3, 0}, + {7, 8, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0}, + {-4, -4, 9, 10, 0, 0, -4, -4, 0, 0, 0, 0}, + {-7, -7, -7, -7, 0, 0, -7, -7, 0, 0, 0, 0}, + {0, 0, 0, 0, 5, 6, 0, 0, 0, 11, 3, 0}, + {-8, -8, -8, -8, 0, 0, -8, -8, 0, 0, 0, 0}, + {0, 4, 0, 0, 5, 6, 0, 0, 12, 2, 3, 0}, + {0, 0, 0, 0, 5, 6, 0, 0, 0, 13, 3, 0}, + {0, 0, 0, 0, 5, 6, 0, 0, 0, 14, 3, 0}, + {0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 15, 0}, + {0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 16, 0}, + {-2, -2, 9, 10, 0, 0, -2, -2, 0, 0, 0, 0}, + {7, 8, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0}, + {-1, -1, 9, 10, 0, 0, -1, -1, 0, 0, 0, 0}, + {-3, -3, 9, 10, 0, 0, -3, -3, 0, 0, 0, 0}, + {-5, -5, -5, -5, 0, 0, -5, -5, 0, 0, 0, 0}, + {-6, -6, -6, -6, 0, 0, -6, -6, 0, 0, 0, 0}, + {-9, -9, -9, -9, 0, 0, -9, -9, 0, 0, 0, 0}}; + + char*p = s; + while(1) { + char*pnext = p+1; + int action; + double value = 0; + if(!stackpos) { + fprintf(stderr, "Error in expression\n"); + return 0.0; + } + + if(chr2index[*p]<0) { + action = table[stack[stackpos-1]][4]; + if(action>0) { + while(chr2index[*pnext]<0) + pnext++; + char save = *pnext; + *pnext = 0; + value = parseNameOrTwip(p); + *pnext = save; + } + } else { + action = table[stack[stackpos-1]][chr2index[*p]]; + } + + if(action == accept) { + return values[stack[stackpos-1]]; + } else if(action>0) { // shift + if(stackpos>254) { + fprintf(stderr, "Stack overflow while parsing expression\n"); + return 0.0; + } + values[stackpos]=value; + stack[stackpos++]=action; + p=pnext; + } else if(action<0) { // reduce + stackpos-=plen[-action]; + stack[stackpos] = table[stack[stackpos-1]][left[-action]]; + switch(-action) { + case 1: + values[stackpos] = values[stackpos+0] + values[stackpos+2]; + break; + case 2: + values[stackpos] = 0 - values[stackpos+1]; + break; + case 3: + values[stackpos] = values[stackpos+0] - values[stackpos+2]; + break; + case 5: + values[stackpos] = values[stackpos+0] * values[stackpos+2]; + break; + case 6: + values[stackpos] = values[stackpos+0] / values[stackpos+2]; + break; + case 9: + values[stackpos] = values[stackpos+1]; + break; + } + stackpos++; + } else { + fprintf(stderr, "Syntax error in expression\n"); + return 0.0; + } + } +} + +int parseTwip(const char*str) +{ + char*str2 = (char*)str; + int v = (int)(parseExpression(str2)*20); + return v; +} + +int parseArc(const char* str) +{ + if(!strcmp(str, "short")) + return 1; + if(!strcmp(str, "long")) + return 0; + syntaxerror("invalid value for the arc parameter: %s", str); + return 1; +} + +int parseDir(const char* str) +{ + if(!strcmp(str, "clockwise")) + return 1; + if(!strcmp(str, "counterclockwise")) + return 0; + syntaxerror("invalid value for the dir parameter: %s", str); + return 1; +} + +int isPoint(const char*str) +{ + if(strchr(str, '(')) + return 1; + else + return 0; +} + +SPOINT parsePoint(const char*str) +{ + SPOINT p; + char tmp[80]; + int l = strlen(str); + char*comma = strchr(str, ','); + if(str[0]!='(' || str[l-1]!=')' || !comma || l>70) + syntaxerror("\"%s\" is not a valid point of the form (x,y)", str); + strncpy(tmp, str+1, comma-(str+1));tmp[comma-(str+1)]=0; + p.x = parseTwip(tmp); + strncpy(tmp, comma+1, l-1-(comma+1-str));tmp[l-1-(comma+1-str)]=0; + p.y = parseTwip(tmp); + return p; +} + +int parseColor2(const char*str, RGBA*color) +{ + int l = strlen(str); + int r,g,b,a; + int t; + + struct {unsigned char r,g,b;char*name;} colors[] = + {{255,250,250,"snow"},{220,220,220,"gainsboro"},{250,240,230,"linen"},{255,228,196,"bisque"}, + {255,228,181,"moccasin"},{255,248,220,"cornsilk"},{255,255,240,"ivory"},{255,245,238,"seashell"}, + {240,255,240,"honeydew"},{240,255,255,"azure"},{230,230,250,"lavender"},{255,255,255,"white"}, + {0,0,0,"black"},{190,190,190,"gray"},{190,190,190,"grey"},{0,0,128,"navy"},{0,0,255,"blue"}, + {64,224,208,"turquoise"},{0,255,255,"cyan"},{127,255,212,"aquamarine"}, {0,255,0,"green"}, + {127,255,0,"chartreuse"},{240,230,140,"khaki"},{255,255,0,"yellow"}, + {255,215,0,"gold"},{218,165,32,"goldenrod"},{160,82,45,"sienna"},{205,133,63,"peru"}, + {222,184,135,"burlywood"},{245,245,220,"beige"},{245,222,179,"wheat"},{210,180,140,"tan"}, + {210,105,30,"chocolate"},{178,34,34,"firebrick"},{165,42,42,"brown"},{250,128,114,"salmon"}, + {255,165,0,"orange"},{255,127,80,"coral"},{255,99,71,"tomato"},{255,0,0,"red"}, + {255,192,203,"pink"},{176,48,96,"maroon"},{255,0,255,"magenta"},{238,130,238,"violet"}, + {221,160,221,"plum"},{218,112,214,"orchid"},{160,32,240,"purple"},{216,191,216,"thistle"}}; + + a=255;r=g=b=0; + + if(str[0]=='#' && (l==7 || l==9)) { + if(l == 7 && !(sscanf(str, "#%02x%02x%02x", &r, &g, &b))) + return 0; + if(l == 9 && !(sscanf(str, "#%02x%02x%02x%02x", &r, &g, &b, &a))) + return 0; + color->r = r; color->g = g; color->b = b; color->a = a; + return 1; + } + int len=strlen(str); + int alpha = 255; + if(strchr(str, '/')) { + len = strchr(str, '/')-str; + sscanf(str+len+1,"%02x", &alpha); + } + for(t=0;tr = r; color->g = g; color->b = b; color->a = a; + return 1; + } + return 0; + +} +RGBA parseColor(const char*str) +{ + RGBA c; + if(!parseColor2(str, &c)) + syntaxerror("Expression '%s' is not a color", str); + return c; +} + +typedef struct _muladd { + S16 mul; + S16 add; +} MULADD; + +MULADD parseMulAdd(const char*str) +{ + float add, mul; + char* str2 = (char*)malloc(strlen(str)+5); + int i; + MULADD m; + strcpy(str2, str); + strcat(str2, " 0"); + add = 0; + mul = 1.0; + if(sscanf(str2, "%f%f %d", &mul, &add, &i)==2+1) { add/=256.0; i=1;} + else if(sscanf(str2, "%f%%%f %d", &mul, &add, &i)==2+1) { mul/=100.0; add/=256.0; i=2;} + else if(sscanf(str2, "%f%f%% %d", &mul, &add, &i)==2+1) { add/=100.0; i=3;} + else if(sscanf(str2, "%f%%%f%% %d", &mul, &add, &i)==2+1) { mul/=100.0; add/=100.0; i=4;} + else if(sscanf(str2, "+%f%% %d", &add, &i)==1+1) { mul=1.0;add/=100.0; i=5;} + else if(sscanf(str2, "+%f %d", &add, &i)==1+1) { mul=1.0;add/=256.0; i=6;} + else if(sscanf(str2, "-%f%% %d", &add, &i)==1+1) { mul=1.0;add/=-100.0; i=7;} + else if(sscanf(str2, "-%f %d", &add, &i)==1+1) { mul=1.0;add/=-256.0; i=8;} + else if(sscanf(str2, "%f%% %d", &mul, &i)==1+1) { mul/=100.0;add=0; i=9;} + else if(sscanf(str2, "%f %d", &mul, &i)==1+1) { add=0; i=10;} + else { + syntaxerror("'%s' is not a valid color transform expression", str); + } + m.add = (int)(add*256); + m.mul = (int)(mul*256); + free(str2); + return m; +} + +MULADD mergeMulAdd(MULADD m1, MULADD m2) +{ + int a = (int)((double)m2.add+((double)m1.add*(double)m2.mul)/256.0); + double m = ((double)m1.mul*(double)m2.mul)/256.0; + MULADD r; + if(a<-32768) a=-32768; + if(a>32767) a=32767; + if(m<-32768) m=-32768; + if(m>32767) m=32767; + r.add = a; + r.mul = (int)m; + return r; +} + +float parsePxOrPercent(const char*fontname, const char*str) +{ + int l = strlen(str); + if(strchr(str, '%')) + return parsePercent(str); + if(l>2 && str[l-2]=='p' && str[l-1]=='t') { + float p = atof(str); + return p/64.0; /*64 = FT_SUBPIXELS- see ../lib/modules/swffont.c */ + } + syntaxerror("Expression '%s' is neither a point size (?pt) nor a percentage (?%)", str); + return 0; +} + +float parsePercent(const char*str) +{ + int l = strlen(str); + if(!l) + return 1.0; + if(str[l-1]=='%') { + return atof(str)/100.0; + } + syntaxerror("Expression '%s' is not a percentage", str); + return 0; +} +int isPercent(const char*str) +{ + return str[strlen(str)-1]=='%'; +} +int parseNewSize(const char*str, int size) +{ + if(isPercent(str)) + return parsePercent(str)*size; + else + return (int)(atof(str)*20); +} + +int isColor(char*str) +{ + RGBA c; + return parseColor2(str, &c); +} + +static const char* lu(map_t* args, char*name) +{ + const char* value = map_lookup(args, name); + if(!value) { + map_dump(args, stdout, ""); + syntaxerror("internal error 2: value %s should be set", name); + } + return value; +} + +static int c_flash(map_t*args) +{ + const char* filename = map_lookup(args, "filename"); + const char* compressstr = lu(args, "compress"); + const char* change_modestr = lu(args, "change-sets-all"); + const char* exportstr = lu(args, "export"); + SRECT bbox = parseBox(lu(args, "bbox")); + int version = parseInt(lu(args, "version")); + int fps = (int)(parseFloat(lu(args, "fps"))*256); + RGBA color = parseColor(lu(args, "background")); + int compress = 0; + + if(!filename || !*filename) { + /* for compatibility */ + filename = map_lookup(args, "name"); + if(!filename || !*filename) { + filename = 0; + } else { + //msg(" line %d: .flash name=... is deprecated, use .flash filename=...", line); + msg(" line %d: .flash name=... is deprecated, use .flash filename=...", line); + } + } + + if(!filename || override_outputname) + filename = outputname; + + if(!strcmp(compressstr, "default")) + compress = version>=6; + else if(!strcmp(compressstr, "yes") || !strcmp(compressstr, "compress")) + compress = 1; + else if(!strcmp(compressstr, "no")) + compress = 0; + else syntaxerror("value \"%s\" not supported for the compress argument", compressstr); + + if(!strcmp(change_modestr, "yes")) + change_sets_all = 1; + else + if(strcmp(change_modestr, "no")) + syntaxerror("value \"%s\" not supported for the change-sets-all argument", change_modestr); + + do_exports=atoi(exportstr); + mainclass=strdup(lu(args, "mainclass")); + + s_swf(filename, bbox, version, fps, compress, color); + return 0; +} +int isRelative(const char*str) +{ + return !strncmp(str, "", 6) || + !strncmp(str, "", 7); +} +const char* getOffset(const char*str) +{ + if(!strncmp(str, "", 6)) + return str+6; + if(!strncmp(str, "", 7)) + return str+7; + syntaxerror("internal error (347)"); + return 0; +} +int getSign(const char*str) +{ + if(!strncmp(str, "", 6)) + return 1; + if(!strncmp(str, "", 7)) + return -1; + syntaxerror("internal error (348)"); + return 0; +} + +static dict_t points; +static mem_t mpoints; +static int points_initialized = 0; + +static int c_interpolation(map_t *args) +{ + int i; + const char* name = lu(args, "name"); + if(dict_lookup(&interpolations, name)) + syntaxerror("interpolation %s defined twice", name); + + interpolation_t* inter = (interpolation_t*)malloc(sizeof(interpolation_t)); + const char* functionstr = lu(args, "function"); + inter->function = 0; + for (i = 0; i < sizeof(interpolationFunctions) / sizeof(interpolationFunctions[0]); i++) + if(!strcmp(functionstr,interpolationFunctions[i])) + { + inter->function = i + 1; + break; + } + if(!inter->function) + syntaxerror("unkown interpolation function %s", functionstr); + inter->speed = parseFloat(lu(args, "speed")); + inter->amplitude = parseTwip(lu(args, "amplitude")); + inter->growth = parseFloat(lu(args, "growth")); + inter->bounces = parseInt(lu(args, "bounces")); + inter->damping = parseFloat(lu(args, "damping")); + inter->slope = parseFloat(lu(args, "slope")); + + dict_put(&interpolations, name, inter); + return 0; +} + +SPOINT getPoint(SRECT r, const char*name) +{ + int l=0; + if(!strcmp(name, "center")) { + SPOINT p; + p.x = (r.xmin + r.xmax)/2; + p.y = (r.ymin + r.ymax)/2; + return p; + } + if(!strcmp(name, "bottom-center")) { + SPOINT p; + p.x = (r.xmin + r.xmax)/2; + p.y = r.ymax; + return p; + } + if(!strcmp(name, "top-center")) { + SPOINT p; + p.x = (r.xmin + r.xmax)/2; + p.y = r.ymin; + return p; + } + if(!strcmp(name, "top-left")) { + SPOINT p; + p.x = r.xmin; + p.y = r.ymin; + return p; + } + if(!strcmp(name, "top-right")) { + SPOINT p; + p.x = r.xmax; + p.y = r.ymin; + return p; + } + if(!strcmp(name, "bottom-right")) { + SPOINT p; + p.x = r.xmax; + p.y = r.ymax; + return p; + } + if(!strcmp(name, "bottom-left")) { + SPOINT p; + p.x = r.xmin; + p.y = r.ymax; + return p; + } + if(!strcmp(name, "left-center")) { + SPOINT p; + p.x = r.xmin; + p.y = (r.ymin + r.ymax)/2; + return p; + } + if(!strcmp(name, "right-center")) { + SPOINT p; + p.x = r.xmax; + p.y = (r.ymin + r.ymax)/2; + return p; + } + + + if(points_initialized) + l = PTR_AS_INT(dict_lookup(&points, name)); + if(l==0) { + syntaxerror("Invalid point: \"%s\".", name); + } + return *(SPOINT*)&mpoints.buffer[l-1]; +} + + +static int texture2(const char*name, const char*object, map_t*args, int errors) +{ + SPOINT pos,size; + const char*xstr = map_lookup(args, "x"); + const char*ystr = map_lookup(args, "y"); + const char*widthstr = map_lookup(args, "width"); + const char*heightstr = map_lookup(args, "height"); + const char*scalestr = map_lookup(args, "scale"); + const char*scalexstr = map_lookup(args, "scalex"); + const char*scaleystr = map_lookup(args, "scaley"); + const char*rotatestr = map_lookup(args, "rotate"); + const char* shearstr = map_lookup(args, "shear"); + const char* radiusstr = map_lookup(args, "r"); + float x=0,y=0; + float scalex = 1.0, scaley = 1.0; + float rotate=0, shear=0; + float r = 0; + if(!*xstr && !*ystr) { + if(errors) + syntaxerror("x and y must be set"); + return 0; + } + if(*scalestr && (*scalexstr || *scaleystr)) { + syntaxerror("scale and scalex/scaley can't both be set"); + return 0; + } + if((*widthstr || *heightstr) && *radiusstr) { + syntaxerror("width/height and radius can't both be set"); + } + if(*radiusstr) { + widthstr = radiusstr; + heightstr = radiusstr; + } + if(!*xstr) xstr="0"; + if(!*ystr) ystr="0"; + if(!*rotatestr) rotatestr="0"; + if(!*shearstr) shearstr="0"; + + if(*scalestr) { + scalex = scaley = parsePercent(scalestr); + } else if(*scalexstr || *scaleystr) { + if(scalexstr) scalex = parsePercent(scalexstr); + if(scaleystr) scaley = parsePercent(scaleystr); + } else if(*widthstr || *heightstr) { + int width=0; + int height=0; + s_getBitmapSize(object, &width, &height); + if(*widthstr) + scalex = (float)parseTwip(widthstr)/(float)width; + if(*heightstr) + scaley = (float)parseTwip(heightstr)/(float)height; + } + x = parseTwip(xstr); + y = parseTwip(ystr); + rotate = parseFloat(rotatestr); + shear = parseFloat(shearstr); + + s_texture(name, object, x,y,scalex,scaley,rotate, shear); + + return 0; +} + +static int c_texture(map_t*args) +{ + const char*name = lu(args, "instance"); + const char*object = lu(args, "character"); + return texture2(name, object, args, 1); +} + +static int c_gradient(map_t*args) +{ + const char*name = lu(args, "name"); + int radial= strcmp(lu(args, "radial"), "radial")?0:1; + int rotate = parseInt(lu(args, "rotate")); + + readToken(); + if(type != RAWDATA) + syntaxerror("colon (:) expected"); + + if(dict_lookup(&gradients, name)) + syntaxerror("gradient %s defined twice", name); + + s_gradient(name, text, radial, rotate); + + /* check whether we also have placement information, + which would make this a positioned gradient. + If there is placement information, texture2() will + add a texture, which has priority over the gradient. + */ + texture2(name, name, args, 0); + return 0; +} + +static const char* checkFiltername(map_t* args) +{ + const char* name = lu(args, "name"); + if(strchr(name, ',')) + syntaxerror("the comma (,) is used to separate filters in filterlists. Please do not use in filternames."); + return name; +} + +static int c_blur(map_t*args) +{ + const char*name = checkFiltername(args); + const char*blurstr = lu(args, "blur"); + const char*blurxstr = lu(args, "blurx"); + const char*blurystr = lu(args, "blury"); + float blurx=1.0, blury=1.0; + if(blurstr[0]) { + blurx = parseFloat(blurstr); + blury = parseFloat(blurstr); + } + if(blurxstr[0]) + blurx = parseFloat(blurxstr); + if(blurystr[0]) + blury = parseFloat(blurystr); + int passes = parseInt(lu(args, "passes")); + s_blur(name, blurx, blury, passes); + return 0; +} + +static int c_gradientglow(map_t*args) +{ + const char*name = checkFiltername(args); + const char*gradient = lu(args, "gradient"); + const char*blurstr = lu(args, "blur"); + const char*blurxstr = lu(args, "blurx"); + const char*blurystr = lu(args, "blury"); + float blurx=1.0, blury=1.0; + if(blurstr[0]) { + blurx = parseFloat(blurstr); + blury = parseFloat(blurstr); + } + if(blurxstr[0]) + blurx = parseFloat(blurxstr); + if(blurystr[0]) + blury = parseFloat(blurystr); + + float angle = parseFloat(lu(args, "angle")) / 180 * M_PI; + float distance = parseFloat(lu(args, "distance")); + float strength = parseFloat(lu(args, "strength")); + char innershadow = strcmp(lu(args, "innershadow"),"innershadow")?0:1; + char knockout = strcmp(lu(args, "knockout"),"knockout")?0:1; + char composite = strcmp(lu(args, "composite"),"composite")?0:1; + char ontop = strcmp(lu(args, "ontop"),"ontop")?0:1; + int passes = parseInt(lu(args, "passes")); + + s_gradientglow(name, gradient, blurx, blury, angle, distance, strength, innershadow, knockout, composite, ontop, passes); + return 0; +} + +static int c_dropshadow(map_t*args) +{ + const char*name = checkFiltername(args); + RGBA color = parseColor(lu(args, "color")); + const char*blurstr = lu(args, "blur"); + const char*blurxstr = lu(args, "blurx"); + const char*blurystr = lu(args, "blury"); + float blurx=1.0, blury=1.0; + if(blurstr[0]) { + blurx = parseFloat(blurstr); + blury = parseFloat(blurstr); + } + if(blurxstr[0]) + blurx = parseFloat(blurxstr); + if(blurystr[0]) + blury = parseFloat(blurystr); + + float angle = parseFloat(lu(args, "angle")) / 180 * M_PI; + float distance = parseFloat(lu(args, "distance")); + float strength = parseFloat(lu(args, "strength")); + char innershadow = strcmp(lu(args, "innershadow"),"innershadow")?0:1; + char knockout = strcmp(lu(args, "knockout"),"knockout")?0:1; + char composite = strcmp(lu(args, "composite"),"composite")?0:1; + int passes = parseInt(lu(args, "passes")); + + s_dropshadow(name, color, blurx, blury, angle, distance, strength, innershadow, knockout, composite, passes); + return 0; +} + +static int c_bevel(map_t*args) +{ + const char*name = checkFiltername(args); + RGBA shadow = parseColor(lu(args, "shadow")); + RGBA highlight = parseColor(lu(args, "highlight")); + const char*blurstr = lu(args, "blur"); + const char*blurxstr = lu(args, "blurx"); + const char*blurystr = lu(args, "blury"); + float blurx=1.0, blury=1.0; + if(blurstr[0]) { + blurx = parseFloat(blurstr); + blury = parseFloat(blurstr); + } + if(blurxstr[0]) + blurx = parseFloat(blurxstr); + if(blurystr[0]) + blury = parseFloat(blurystr); + + float angle = parseFloat(lu(args, "angle")) / 180 * M_PI; + float distance = parseFloat(lu(args, "distance")); + float strength = parseFloat(lu(args, "strength")); + char innershadow = strcmp(lu(args, "innershadow"),"innershadow")?0:1; + char knockout = strcmp(lu(args, "knockout"),"knockout")?0:1; + char composite = strcmp(lu(args, "composite"),"composite")?0:1; + char ontop = strcmp(lu(args, "ontop"),"ontop")?0:1; + int passes = parseInt(lu(args, "passes")); + + s_bevel(name, shadow, highlight, blurx, blury, angle, distance, strength, innershadow, knockout, composite, ontop, passes); + return 0; +} + +static int c_define(map_t*args) +{ + const char*name = lu(args, "name"); + const char*value = lu(args, "value"); + + if(!defines_initialized) { + dict_init(&defines, 16); + mem_init(&define_values); + defines_initialized = 1; + } + int val = parseTwip(value); + int pos = mem_put(&define_values, &val, sizeof(val)); + dict_put(&defines, name, INT_AS_PTR(pos + 1)); + return 0; +} +static int c_point(map_t*args) +{ + const char*name = lu(args, "name"); + int pos; + SPOINT p; + if(!points_initialized) { + dict_init(&points, 16); + mem_init(&mpoints); + points_initialized = 1; + } + p.x = parseTwip(lu(args, "x")); + p.y = parseTwip(lu(args, "y")); + pos = mem_put(&mpoints, &p, sizeof(p)); + dict_put(&points, name, INT_AS_PTR(pos+1)); + return 0; +} +static int c_play(map_t*args) +{ + const char*name = lu(args, "name"); + const char*loop = lu(args, "loop"); + const char*nomultiple = lu(args, "nomultiple"); + int nm = 0; + if(!strcmp(nomultiple, "nomultiple")) + nm = 1; + else + nm = parseInt(nomultiple); + + if(s_playsound(name, parseInt(loop), nm, 0)) { + return 0; + } else if(s_swf3action(name, "play")) { + return 0; + } + return 0; +} + +static int c_stop(map_t*args) +{ + const char*name = map_lookup(args, "name"); + + if(s_playsound(name, 0,0,1)) + return 0; + else if(s_swf3action(name, "stop")) + return 0; + syntaxerror("I don't know anything about sound/movie \"%s\"", name); + return 0; +} + +static int c_nextframe(map_t*args) +{ + const char*name = lu(args, "name"); + + if(s_swf3action(name, "nextframe")) { + return 0; + } + syntaxerror("I don't know anything about movie \"%s\"", name); + return 0; +} + +static int c_previousframe(map_t*args) +{ + const char*name = lu(args, "name"); + + if(s_swf3action(name, "previousframe")) { + return 0; + } + syntaxerror("I don't know anything about movie \"%s\"", name); + return 0; +} + +static int c_movement(map_t*args, int type) +{ + const char*instance = lu(args, "name"); + + const char* xstr=""; + const char* ystr=""; + SRECT oldbbox; + parameters_t p; + U16 set = 0x0000; + + xstr = lu(args, "x"); + ystr = lu(args, "y"); + + s_getParameters(instance, &p); + + /* x,y position */ + if(xstr[0]) + { + if(isRelative(xstr)) + { + if(type == PT_PUT || type == PT_STARTCLIP) + syntaxerror("relative x values not allowed for initial put or startclip"); + p.x += parseTwip(getOffset(xstr))*getSign(xstr); + } + else + { + p.x = parseTwip(xstr); + } + set = set | SF_X; + } + if(ystr[0]) + { + if(isRelative(ystr)) + { + if(type == PT_PUT || type == PT_STARTCLIP) + syntaxerror("relative y values not allowed for initial put or startclip"); + p.y += parseTwip(getOffset(ystr))*getSign(ystr); + } + else + { + p.y = parseTwip(ystr); + } + set = set | SF_Y; + } + + if(change_sets_all) + set = SF_ALL; + p.set = set; + + switch (type) + { + case PT_MOVE: + { + const char* interstr = lu(args, "interpolation"); + interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); + if(!inter) + syntaxerror("unkown interpolation %s", interstr); + s_change(instance, p, inter); + } + break; + case PT_SMOVE: + { + const char* interstr = lu(args, "interpolation"); + interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); + if(!inter) + syntaxerror("unkown interpolation %s", interstr); + s_schange(instance, p, inter); + } + break; + case PT_SWEEP: + { + const char* rstr = lu(args, "r"); + int radius = parseTwip(rstr); + if(radius <= 0) + syntaxerror("sweep not possible: radius must be greater than 0."); + const char* dirstr = lu(args, "dir"); + int clockwise = parseDir(dirstr); + const char* arcstr = lu(args, "arc"); + int short_arc = parseArc(arcstr); + const char* interstr = lu(args, "interpolation"); + interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); + if(!inter) + syntaxerror("unkown interpolation %s", interstr); + s_sweep(instance, p, radius, clockwise, short_arc, inter); + } + break; + } + return 0; +} + +static int c_placement(map_t*args, int type) +{ + const char*instance = lu(args, (type==PT_PUT||type==PT_STARTCLIP)?"instance":"name"); + const char*character = 0; + + const char* luminancestr = lu(args, "luminance"); + const char* scalestr = lu(args, "scale"); + const char* scalexstr = lu(args, "scalex"); + const char* scaleystr = lu(args, "scaley"); + const char* rotatestr = lu(args, "rotate"); + const char* shearstr = lu(args, "shear"); + const char* xstr="", *pivotstr=""; + const char* ystr="", *anglestr=""; + const char*above = lu(args, "above"); /*FIXME*/ + const char*below = lu(args, "below"); + const char* rstr = lu(args, "red"); + const char* gstr = lu(args, "green"); + const char* bstr = lu(args, "blue"); + const char* astr = lu(args, "alpha"); + const char* pinstr = lu(args, "pin"); + const char* as = map_lookup(args, "as"); + const char* blendmode = lu(args, "blend"); + const char* filterstr = lu(args, "filter"); + const char* noinstancenamestr = lu(args, "noinstancename"); + U8 blend; + MULADD r,g,b,a; + float oldwidth; + float oldheight; + SRECT oldbbox; + MULADD luminance; + parameters_t p; + U16 set = 0x0000; + + if(type==9) + { // (?) .rotate or .arcchange + pivotstr = lu(args, "pivot"); + anglestr = lu(args, "angle"); + } + else + { + xstr = lu(args, "x"); + ystr = lu(args, "y"); + } + + if(luminancestr[0]) + luminance = parseMulAdd(luminancestr); + else + { + luminance.add = 0; + luminance.mul = 256; + } + + if(scalestr[0]) + { + if(scalexstr[0]||scaleystr[0]) + syntaxerror("scalex/scaley and scale cannot both be set"); + scalexstr = scaleystr = scalestr; + } + + if(type == PT_PUT || type == PT_STARTCLIP) { + // put or startclip + character = lu(args, "character"); + parameters_clear(&p); + } else if(type == PT_BUTTON) { + character = lu(args, "name"); + parameters_clear(&p); + // button's show + } else { + s_getParameters(instance, &p); + } + + /* noinstancename */ + p.noinstancename = !strcmp(noinstancenamestr, "noinstancename"); + + /* x,y position */ + if(xstr[0]) + { + if(isRelative(xstr)) + { + if(type == PT_PUT || type == PT_STARTCLIP) + syntaxerror("relative x values not allowed for initial put or startclip"); + p.x += parseTwip(getOffset(xstr))*getSign(xstr); + } + else + { + p.x = parseTwip(xstr); + } + set = set | SF_X; + } + if(ystr[0]) + { + if(isRelative(ystr)) + { + if(type == PT_PUT || type == PT_STARTCLIP) + syntaxerror("relative y values not allowed for initial put or startclip"); + p.y += parseTwip(getOffset(ystr))*getSign(ystr); + } + else + { + p.y = parseTwip(ystr); + } + set = set | SF_Y; + } + + /* scale, scalex, scaley */ + if(character) + oldbbox = s_getCharBBox(character); + else + oldbbox = s_getInstanceBBox(instance); + oldwidth = oldbbox.xmax - oldbbox.xmin; + oldheight = oldbbox.ymax - oldbbox.ymin; + if(scalexstr[0]) + { + if(oldwidth==0) + p.scalex = 1.0; + else + if(scalexstr[0]) + p.scalex = (float)(parseNewSize(scalexstr, oldwidth))/oldwidth; + set = set | SF_SCALEX; + } + if(scaleystr[0]) + { + if(oldheight==0) + p.scaley = 1.0; + else + if(scaleystr[0]) + p.scaley = (float)(parseNewSize(scaleystr, oldheight))/oldheight; + set = set | SF_SCALEY; + } + + /* rotation */ + if(rotatestr[0]) + { + if(isRelative(rotatestr)) + p.rotate += parseFloat(getOffset(rotatestr))*getSign(rotatestr); + else + p.rotate = parseFloat(rotatestr); + set = set | SF_ROTATE; + } + + /* shearing */ + if(shearstr[0]) + { + if(isRelative(shearstr)) + p.shear += parseFloat(getOffset(shearstr))*getSign(shearstr); + else + p.shear = parseFloat(shearstr); + set = set | SF_SHEAR; + } + + if(pivotstr[0]) + { + if(isPoint(pivotstr)) + p.pivot = parsePoint(pivotstr); + else + p.pivot = getPoint(oldbbox, pivotstr); + set = set | SF_PIVOT; + } + + if(pinstr[0]) + { + if(isPoint(pinstr)) + p.pin = parsePoint(pinstr); + else + p.pin = getPoint(oldbbox, pinstr); + set = set | SF_PIN; + } + + /* color transform */ + + if(rstr[0] || luminancestr[0]) + { + MULADD r; + if(rstr[0]) + r = parseMulAdd(rstr); + else + { + r.add = p.cxform.r0; + r.mul = p.cxform.r1; + } + r = mergeMulAdd(r, luminance); + p.cxform.r0 = r.mul; + p.cxform.r1 = r.add; + set = set | SF_CX_R; + } + if(gstr[0] || luminancestr[0]) + { + MULADD g; + if(gstr[0]) + g = parseMulAdd(gstr); + else + { + g.add = p.cxform.g0; + g.mul = p.cxform.g1; + } + g = mergeMulAdd(g, luminance); + p.cxform.g0 = g.mul; + p.cxform.g1 = g.add; + set = set | SF_CX_G; + } + if(bstr[0] || luminancestr[0]) + { + MULADD b; + if(bstr[0]) + b = parseMulAdd(bstr); + else + { + b.add = p.cxform.b0; + b.mul = p.cxform.b1; + } + b = mergeMulAdd(b, luminance); + p.cxform.b0 = b.mul; + p.cxform.b1 = b.add; + set = set | SF_CX_B; + } + if(astr[0]) + { + MULADD a = parseMulAdd(astr); + p.cxform.a0 = a.mul; + p.cxform.a1 = a.add; + set = set | SF_CX_A; + } + + if(blendmode[0]) + { + int t; + blend = 255; + for(t = 0; blendModeNames[t]; t++) + { + if(!strcmp(blendModeNames[t], blendmode)) + { + blend = t; + break; + } + } + if(blend == 255) + { + syntaxerror("unknown blend mode: '%s'", blendmode); + } + p.blendmode = blend; + set = set | SF_BLEND; + } + + if(filterstr[0]) + { + p.filters = parseFilters((char*)filterstr); + set = set | SF_FILTER; + } + + if(type == PT_CHANGE && set & (SF_X | SF_Y)) + warning("As of version 0.8.2 using the .change command to modify an \ +object's position on the stage is considered deprecated. Future \ +versions may consider x and y parameters for the .change command \ +to be illegal; please use the .move command."); + + if(change_sets_all) + set = SF_ALL; + p.set = set; + + switch (type) + { + case PT_PUT: + s_put(instance, character, p); + break; + case PT_CHANGE: + { + const char* interstr = lu(args, "interpolation"); + interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); + if(!inter) + syntaxerror("unkown interpolation %s", interstr); + s_change(instance, p, inter); + } + break; + case PT_SCHANGE: + { + const char* interstr = lu(args, "interpolation"); + interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); + if(!inter) + syntaxerror("unkown interpolation %s", interstr); + s_schange(instance, p, inter); + } + break; + case PT_JUMP: + s_jump(instance, p); + break; + case PT_STARTCLIP: + s_startclip(instance, character, p); + break; + case PT_BUTTON: + if(as && as[0]) + s_buttonput(character, as, p); + else + s_buttonput(character, "shape", p); + break; +// default: + } + return 0; +} +static int c_put(map_t*args) +{ + c_placement(args, PT_PUT); + return 0; +} +static int c_change(map_t*args) +{ + if(currentframe == 0) + warning("change commands in frame 1 will be ignored, please use the put command to set object parameters"); + c_placement(args, PT_CHANGE); + return 0; +} +static int c_schange(map_t*args) +{ + c_placement(args, PT_SCHANGE); + return 0; +} +static int c_move(map_t* args) +{ + c_movement(args, PT_MOVE); + return 0; +} +static int c_smove(map_t* args) +{ + c_movement(args, PT_SMOVE); + return 0; +} +static int c_sweep(map_t* args) +{ + c_movement(args, PT_SWEEP); + return 0; +} +static int c_arcchange(map_t*args) +{ + c_placement(args, 0); + return 0; +} +static int c_jump(map_t*args) +{ + c_placement(args, PT_JUMP); + return 0; +} +static int c_startclip(map_t*args) +{ + c_placement(args, PT_STARTCLIP); + return 0; +} +static int c_show(map_t*args) +{ + c_placement(args, PT_BUTTON); + return 0; +} +static int c_toggle(map_t* args) +{ + const char*instance = lu(args, "name"); + U16 flagsOn = 0x0000, flagsOff = 0xffff; + const char* alignstr = lu(args, "fixed_alignment"); + if(!strcmp(alignstr, "on")) + flagsOn += IF_FIXED_ALIGNMENT; + else + if(!strcmp(alignstr, "off")) + flagsOff -= IF_FIXED_ALIGNMENT; + else + syntaxerror("values for toggle must be \"on\" or \"off\". %s is not legal.", alignstr); + s_toggle(instance, flagsOn, flagsOff); + return 0; +} +static int c_del(map_t*args) +{ + const char*instance = lu(args, "name"); + s_delinstance(instance); + return 0; +} +static int c_end(map_t*args) +{ + s_end(); + return 0; +} +static int c_sprite(map_t*args) +{ + const char* name = lu(args, "name"); + const char* scalinggrid = lu(args, "scalinggrid"); + const char* as3name = lu(args, "as3name"); + + if(scalinggrid && *scalinggrid) { + SRECT r = parseBox(scalinggrid); + s_sprite(name, &r, as3name); + } else { + s_sprite(name, 0, as3name); + } + return 0; +} +static int c_frame(map_t*args) +{ + const char*framestr = lu(args, "n"); + const char*cutstr = lu(args, "cut"); + + const char*name = lu(args, "name"); + const char*anchor = lu(args, "anchor"); + char buf[40]; + + if(!strcmp(anchor, "anchor") && !*name) + name = framestr; + + int frame; + int cut = 0; + if(strcmp(cutstr, "no")) + cut = 1; + if(isRelative(framestr)) { + frame = s_getframe(); + if(getSign(framestr)<0) + syntaxerror("relative frame expressions must be positive"); + frame += parseInt(getOffset(framestr)); + } + else { + frame = parseInt(framestr); + if(s_getframe() >= frame + && !(frame==1 && s_getframe()==frame)) // equality is o.k. for frame 0 + syntaxerror("frame expression must be >%d (is:%s)", s_getframe(), framestr); + } + s_frame(frame, cut, name, !strcmp(anchor, "anchor")); + return 0; +} +static int c_primitive(map_t*args) +{ + const char*name = lu(args, "name"); + const char*command = lu(args, "commandname"); + int width=0, height=0, r=0; + int linewidth = parseTwip(lu(args, "line")); + const char*colorstr = lu(args, "color"); + RGBA color = parseColor(colorstr); + const char*fillstr = lu(args, "fill"); + int dofill = 1; + int type=0; + const char* font; + const char* text; + const char* outline=0; + RGBA fill; + if(!strcmp(command, "circle")) + type = 1; + else if(!strcmp(command, "filled")) + type = 2; + + if(type==0) { + width = parseTwip(lu(args, "width")); + height = parseTwip(lu(args, "height")); + } else if(type==1) { + r = parseTwip(lu(args, "r")); + } else if(type==2) { + outline = lu(args, "outline"); + } + + if(!strcmp(fillstr, "fill")) + fillstr = colorstr; + if(!strcmp(fillstr, "none")) + fillstr = 0; + if(width<0 || height<0 || linewidth<0 || r<0) + syntaxerror("values width, height, line, r must be positive"); + + if(type == 0) s_box(name, width, height, color, linewidth, fillstr); + else if(type==1) s_circle(name, r, color, linewidth, fillstr); + else if(type==2) s_filled(name, outline, color, linewidth, fillstr); + return 0; +} + +static int c_textshape(map_t*args) +{ + const char*name = lu(args, "name"); + const char*text = lu(args, "text"); + const char*font = lu(args, "font"); + float size = parsePxOrPercent(font, lu(args, "size")); + + s_textshape(name, font, size, text); + return 0; +} + +static int c_swf(map_t*args) +{ + const char*name = lu(args, "name"); + const char*filename = lu(args, "filename"); + const char*command = lu(args, "commandname"); + const char*as3name = lu(args, "as3name"); + + if(!strcmp(command, "shape")) + warning("Please use .swf instead of .shape"); + s_includeswf(name, filename, as3name); + return 0; +} + +static int c_font(map_t*args) +{ + const char*name = lu(args, "name"); + const char*filename = lu(args, "filename"); + s_font(name, filename); + return 0; +} + +static int c_sound(map_t*args) +{ + const char*name = lu(args, "name"); + const char*filename = lu(args, "filename"); + s_sound(name, filename); + return 0; +} + +static int c_text(map_t*args) +{ + const char*name = lu(args, "name"); + const char*text = lu(args, "text"); + const char*font = lu(args, "font"); + float size = parsePxOrPercent(font, lu(args, "size")); + RGBA color = parseColor(lu(args, "color")); + s_text(name, font, text, (int)(size*100), color); + return 0; +} + +static int c_soundtrack(map_t*args) +{ + return 0; +} + +static int c_quicktime(map_t*args) +{ + const char*name = lu(args, "name"); + const char*url = lu(args, "url"); + s_quicktime(name, url); + return 0; +} + +static int c_video(map_t*args) +{ + const char*name = lu(args, "name"); + int width = parseInt(lu(args, "width")); + int height = parseInt(lu(args, "height")); + s_video(name, width, height); + return 0; +} + +static int c_image(map_t*args) +{ + const char*command = lu(args, "commandname"); + const char*name = lu(args, "name"); + const char*filename = lu(args, "filename"); + if(!strcmp(command,"jpeg")) { + int quality = (int)(parsePercent(lu(args, "quality"))*100); + s_image(name, "jpeg", filename, quality); + } else { + s_image(name, "png", filename, 0); + } + return 0; +} + +static int c_outline(map_t*args) +{ + const char*name = lu(args, "name"); + const char*format = lu(args, "format"); + + readToken(); + if(type != RAWDATA) + syntaxerror("colon (:) expected"); + + s_outline(name, format, text); + return 0; +} + +int fakechar(map_t*args) +{ + const char*name = lu(args, "name"); + s_box(name, 0, 0, black, 20, 0); + return 0; +} + +static int c_egon(map_t*args) {return fakechar(args);} +static int c_button(map_t*args) { + const char*name = lu(args, "name"); + const char*as3name = lu(args, "as3name"); + s_button(name, as3name); + return 0; +} +static int current_button_flags = 0; +static int c_on_press(map_t*args) +{ + const char*position = lu(args, "position"); + const char*action = ""; + if(!strcmp(position, "inside")) { + current_button_flags |= BC_OVERUP_OVERDOWN; + } else if(!strcmp(position, "outside")) { + //current_button_flags |= BC_IDLE_OUTDOWN; + syntaxerror("IDLE_OVERDOWN not supported by SWF"); + } else if(!strcmp(position, "anywhere")) { + current_button_flags |= /*BC_IDLE_OUTDOWN|*/BC_OVERUP_OVERDOWN|BC_IDLE_OVERDOWN; + } + readToken(); + if(type == RAWDATA) { + action = text; + s_buttonaction(current_button_flags, action); + current_button_flags = 0; + } + else + pushBack(); + return 0; +} +static int c_on_release(map_t*args) +{ + const char*position = lu(args, "position"); + const char*action = ""; + if(!strcmp(position, "inside")) { + current_button_flags |= BC_OVERDOWN_OVERUP; + } else if(!strcmp(position, "outside")) { + current_button_flags |= BC_OUTDOWN_IDLE; + } else if(!strcmp(position, "anywhere")) { + current_button_flags |= BC_OVERDOWN_OVERUP|BC_OUTDOWN_IDLE|BC_OVERDOWN_IDLE; + } + readToken(); + if(type == RAWDATA) { + action = text; + s_buttonaction(current_button_flags, action); + current_button_flags = 0; + } + else + pushBack(); + return 0; +} +static int c_on_move_in(map_t*args) +{ + const char*position = lu(args, "state"); + const char*action = ""; + if(!strcmp(position, "pressed")) { + current_button_flags |= BC_OUTDOWN_OVERDOWN; + } else if(!strcmp(position, "not_pressed")) { + current_button_flags |= BC_IDLE_OVERUP; + } else if(!strcmp(position, "any")) { + current_button_flags |= BC_OUTDOWN_OVERDOWN|BC_IDLE_OVERUP|BC_IDLE_OVERDOWN; + } + readToken(); + if(type == RAWDATA) { + action = text; + s_buttonaction(current_button_flags, action); + current_button_flags = 0; + } + else + pushBack(); + return 0; +} +static int c_on_move_out(map_t*args) +{ + const char*position = lu(args, "state"); + const char*action = ""; + if(!strcmp(position, "pressed")) { + current_button_flags |= BC_OVERDOWN_OUTDOWN; + } else if(!strcmp(position, "not_pressed")) { + current_button_flags |= BC_OVERUP_IDLE; + } else if(!strcmp(position, "any")) { + current_button_flags |= BC_OVERDOWN_OUTDOWN|BC_OVERUP_IDLE|BC_OVERDOWN_IDLE; + } + readToken(); + if(type == RAWDATA) { + action = text; + s_buttonaction(current_button_flags, action); + current_button_flags = 0; + } + else + pushBack(); + return 0; +} +static int c_on_key(map_t*args) +{ + const char*key = lu(args, "key"); + const char*action = ""; + if(strlen(key)==1) { + /* ascii */ + if(key[0]>=32) { + current_button_flags |= 0x4000 + (key[0]*0x200); + } else { + syntaxerror("invalid character: %c"+key[0]); + return 1; + } + } else { + /* TODO: + = 0x200*(x-'a') + esc = = 0x3600 + space = = 0x4000; + */ + syntaxerror("invalid key: %s",key); + } + readToken(); + if(type == RAWDATA) { + action = text; + s_buttonaction(current_button_flags, action); + current_button_flags = 0; + } + else + pushBack(); + return 0; +} + +static int c_edittext(map_t*args) +{ + //"name font size width height text="" color=black maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0 @autosize=0"}, + const char*name = lu(args, "name"); + const char*font = lu(args, "font"); + int size = (int)(1024*parsePxOrPercent(font, lu(args, "size"))); + int width = parseTwip(lu(args, "width")); + int height = parseTwip(lu(args, "height")); + const char*text = lu(args, "text"); + RGBA color = parseColor(lu(args, "color")); + int maxlength = parseInt(lu(args, "maxlength")); + const char*variable = lu(args, "variable"); + const char*passwordstr = lu(args, "password"); + const char*wordwrapstr = lu(args, "wordwrap"); + const char*multilinestr = lu(args, "multiline"); + const char*htmlstr = lu(args, "html"); + const char*noselectstr = lu(args, "noselect"); + const char*readonlystr = lu(args, "readonly"); + const char*borderstr = lu(args, "border"); + const char*autosizestr = lu(args, "autosize"); + const char*alignstr = lu(args, "align"); + int align = -1; + + int flags = 0; + if(!strcmp(passwordstr, "password")) flags |= ET_PASSWORD; + if(!strcmp(wordwrapstr, "wordwrap")) flags |= ET_WORDWRAP; + if(!strcmp(multilinestr, "multiline")) flags |= ET_MULTILINE; + if(!strcmp(readonlystr, "readonly")) flags |= ET_READONLY; + if(!strcmp(htmlstr, "html")) flags |= ET_HTML; + if(!strcmp(noselectstr, "noselect")) flags |= ET_NOSELECT; + if(!strcmp(borderstr, "border")) flags |= ET_BORDER; + if(!strcmp(autosizestr, "autosize")) flags |= ET_AUTOSIZE; + if(!strcmp(alignstr, "left") || !*alignstr) align = ET_ALIGN_LEFT; + else if(!strcmp(alignstr, "right")) align = ET_ALIGN_RIGHT; + else if(!strcmp(alignstr, "center")) align = ET_ALIGN_CENTER; + else if(!strcmp(alignstr, "justify")) align = ET_ALIGN_JUSTIFY; + else syntaxerror("Unknown alignment: %s", alignstr); + + s_edittext(name, font, size, width, height, text, &color, maxlength, variable, flags, align); + return 0; +} + +static int c_morphshape(map_t*args) {return fakechar(args);} +static int c_movie(map_t*args) {return fakechar(args);} + +static char* readfile(char*filename) +{ + FILE*fi = fopen(filename, "rb"); + int l; + char*text; + if(!fi) + syntaxerror("Couldn't find file %s: %s", filename, strerror(errno)); + fseek(fi, 0, SEEK_END); + l = ftell(fi); + fseek(fi, 0, SEEK_SET); + text = rfx_alloc(l+1); + fread(text, l, 1, fi); + text[l]=0; + fclose(fi); + return text; +} + +static int c_action(map_t*args) +{ + const char* filename = map_lookup(args, "filename"); + if(!filename ||!*filename) { + readToken(); + if(type != RAWDATA) { + syntaxerror("colon (:) expected"); + } + s_action(text); + } else { + s_action(readfile((char*)filename)); + } + + return 0; +} + +static int c_initaction(map_t*args) +{ + const char* character = lu(args, "name"); + const char* filename = map_lookup(args, "filename"); + if(!filename ||!*filename) { + readToken(); + if(type != RAWDATA) { + syntaxerror("colon (:) expected"); + } + s_initaction(character, text); + } else { + s_initaction(character, readfile((char*)filename)); + } + + return 0; +} + +static struct { + char*command; + command_func_t* func; + char*arguments; +} arguments[] = +{{"flash", c_flash, "bbox=autocrop background=black version=6 fps=50 name= filename= @compress=default @change-sets-all=no @export=1 @mainclass="}, + {"frame", c_frame, "n=1 name= @cut=no @anchor=no"}, + // "import" type stuff + {"swf", c_swf, "name filename as3name="}, + {"shape", c_swf, "name filename"}, + {"jpeg", c_image, "name filename quality=80%"}, + {"png", c_image, "name filename"}, + {"movie", c_movie, "name filename"}, + {"sound", c_sound, "name filename"}, + {"font", c_font, "name filename glyphs= @flashtype="}, + {"soundtrack", c_soundtrack, "filename"}, + {"quicktime", c_quicktime, "url"}, + {"video", c_video, "name width= height="}, + + // generators of primitives + + {"define", c_define, "name value=0"}, + {"point", c_point, "name x=0 y=0"}, + {"gradient", c_gradient, "name @radial=0 rotate=0 scale= scalex= scaley= x= y= width= height= r= shear="}, //extra parameters like .texture + {"interpolation", c_interpolation, "name function=linear speed=1.3 amplitude=0 bounces=2 growth=1.5 damping=2 slope=0"}, + {"outline", c_outline, "name format=simple"}, + {"textshape", c_textshape, "name font size=100% text"}, + + // filters + {"blur", c_blur, "name blur= blurx= blury= passes=1"}, + {"gradientglow", c_gradientglow, "name gradient blur= blurx= blury= angle=0.0 distance=0.0 strength=1.0 @innershadow=0 @knockout=0 @composite=0 @ontop=0 passes=1"}, + {"dropshadow", c_dropshadow, "name color blur= blurx= blury= angle=0.0 distance=0.0 strength=1.0 @innershadow=0 @knockout=0 @composite=0 passes=1"}, + {"bevel", c_bevel, "name shadow highlight blur= blurx= blury= angle=0.0 distance=0.0 strength=1.0 @innershadow=0 @knockout=0 @composite=0 @ontop=0 passes=1"}, + + // character generators + {"box", c_primitive, "name width height color=white line=1 @fill=none"}, + {"circle", c_primitive, "name r color=white line=1 @fill=none"}, + {"filled", c_primitive, "name outline color=white line=1 @fill=none"}, + + {"egon", c_egon, "name vertices color=white line=1 @fill=none"}, + {"text", c_text, "name text font size=100% color=white"}, + {"edittext", c_edittext, "name font= size=100% width height text="" color=white maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0 @border=0 @autosize=0 align="}, + {"morphshape", c_morphshape, "name start end"}, + {"button", c_button, "name as3name="}, + {"show", c_show, "name x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= as="}, + {"on_press", c_on_press, "position=inside"}, + {"on_release", c_on_release, "position=anywhere"}, + {"on_move_in", c_on_move_in, "state=not_pressed"}, + {"on_move_out", c_on_move_out, "state=not_pressed"}, + {"on_key", c_on_key, "key=any"}, + + // control tags + {"play", c_play, "name loop=0 @nomultiple=0"}, + {"stop", c_stop, "name= "}, + {"nextframe", c_nextframe, "name"}, + {"previousframe", c_previousframe, "name"}, + + // object placement tags + {"put", c_put, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= @noinstancename=0"}, + {"startclip", c_startclip, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= @noinstancename=0"}, + {"move", c_move, "name x= y= interpolation=linear"}, + {"smove", c_smove, "name x= y= interpolation=linear"}, + {"sweep", c_sweep, "name x= y= r= dir=counterclockwise arc=short interpolation=linear"}, + {"change", c_change, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= interpolation=linear"}, + //{"arcchange", c_arcchange, "name pivot= angle= red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below="}, + {"schange", c_schange, "name red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= interpolation=linear"}, + {"jump", c_jump, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below="}, + {"del", c_del, "name"}, + // virtual object placement + {"texture", c_texture, " x=0 y=0 width= height= scale= scalex= scaley= r= shear= rotate="}, + // switching + {"toggle", c_toggle, "name fixed_alignment="}, + + // commands which start a block +//startclip (see above) + {"sprite", c_sprite, "name scalinggrid= as3name="}, + {"action", c_action, "filename="}, + {"initaction", c_initaction, "name filename="}, + + {"end", c_end, ""} +}; + + +static map_t parseArguments(char*command, char*pattern) +{ + char*x; + char*d,*e; + + string_t name[64]; + string_t value[64]; + int set[64]; + int isboolean[64]; + int pos; + int len; + int t; + string_t t1,t2; + map_t result; + map_init(&result); + + string_set(&t1, "commandname"); + string_set(&t2, command); + map_put(&result, t1, t2); + + if(!pattern || !*pattern) + return result; + + x = pattern; + + pos = 0; + + if(!strncmp(" ", x, 3)) { + readToken(); + if(type == COMMAND || type == RAWDATA) { + pushBack(); + syntaxerror("character name expected"); + } + name[pos].str = "instance"; + name[pos].len = 8; + value[pos].str = text; + value[pos].len = strlen(text); + set[pos] = 1; + pos++; + + if(type == ASSIGNMENT) + readToken(); + + name[pos].str = "character"; + name[pos].len = 9; + value[pos].str = text; + value[pos].len = strlen(text); + set[pos] = 1; + pos++; + + x+=4; + } + + while(*x) { + isboolean[pos] = (x[0] =='@'); + if(isboolean[pos]) + x++; + + d = strchr(x, ' '); + e = strchr(x, '='); + if(!d) + d=&x[strlen(x)]; + set[pos] = 0; + + if(!e || dtextlen?name[pos].len:textlen)) { + set[pos] = 1; + if(type == ASSIGNMENT) + readToken(); + value[pos].str = text; + value[pos].len = strlen(text); + /*printf("setting boolean parameter %s (to %s)\n", + strdup_n(name[pos], namelen[pos]), + strdup_n(value[pos], valuelen[pos]));*/ + break; + } + } + + // second, search for normal arguments + if(pos==len) + for(pos=0;postextlen?name[pos].len:textlen)) || + (type != ASSIGNMENT && !set[pos])) { + if(set[pos]) { + syntaxerror("value %s set twice (old value:%s)", text, strdup_n(value[pos].str, value[pos].len)); + } + if(type == ASSIGNMENT) + readToken(); + set[pos] = 1; + value[pos].str = text; + value[pos].len = strlen(text); +#if 0//def DEBUG + printf("setting parameter %s (to %s)\n", + strdup_n(name[pos].str, name[pos].len), + strdup_n(value[pos].str, value[pos].len)); +#endif + break; + } + } + if(pos==len) { + syntaxerror("Illegal argument \"%s\" to .%s", text, command); + } + } +#if 0//def DEBUG + for(t=0;t parse Command: %s (line %d)", command, line); + + for(t=0;t analyse Command: %s (line %d)", command, line); + + for(t=0;tuse && !font->use->glyphs_specified) { + if(!strcmp(command, "edittext")) + { + swf_FontUseAll(font); + font->use->glyphs_specified = 1; + } + else + swf_FontUseUTF8(font, (U8*)lu(&args, "text"), 0xffff); + } + } + map_clear(&args); + return; +} + +void skipParameters() +{ + do + readToken(); + while (type != COMMAND); + pushBack(); +} + +void findFontUsage() +{ + char* fontRelated = "font;text;textshape;edittext;"; + while(!noMoreTokens()) + { + readToken(); + if(type != COMMAND) + syntaxerror("command expected"); + if(strstr(fontRelated, text)) + analyseArgumentsForCommand(text); + else + if(strcmp(text, "end")) + skipParameters(); + } +} + +void firstPass() +{ + pos = 0; + id = 0; + dict_init(&fonts, 16); + cleanUp = &freeFontDictionary; + findFontUsage(); +} + +int main (int argc,char ** argv) +{ + int t; + processargs(argc, argv); + initLog(0,-1,0,0,-1,verbose); + + if(!filename) { + args_callback_usage(argv[0]); + exit(1); + } + + file = generateTokens(filename); + if(!file) { + fprintf(stderr, "parser returned error.\n"); + return 1; + } + firstPass(); + pos=0; + t=0; + + while(!noMoreTokens()) { + readToken(); + if(type != COMMAND) + syntaxerror("command expected"); + parseArgumentsForCommand(text); + } + + s_close(); + freeTokens(file); + + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfcombine b/fluidbook/tools/swftools-special-swfdump/src/swfcombine new file mode 100644 index 000000000..22e1ca729 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfcombine differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 b/fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 new file mode 100644 index 000000000..00552210c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 @@ -0,0 +1,130 @@ +.TH swfcombine "1" "August 2009" "swfcombine" "swftools" +.SH NAME +swfcombine - a tool for combining swf (flash) files + +.SH Synopsis +.B swfcombine [-rXYomlcv] [-f] masterfile [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN +.PP +.B swfcombine [-rXYomv] --stack[1] [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN +.PP +.B swfcombine [-rXYov] --cat [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN +.PP +.B swfcombine [-rXYomlcv] --dummy [-xys] [file] + +.SH DESCRIPTION +Take two or more SWF files, and combine them into a new SWF. SWFs can either +be stacked (no masterfile is present) or inserted (into the masterfile). +.PP +SWF files are animation files which can be displayed in Web Browsers using +the Flash Plugin. +.LP +For template mechanisms, it's often convenient to separate the processes +of generating small animation fragments and merging them into a big +movie. swfcombine can be used to perform the latter. + +.SH OPTIONS +.TP +\fB\-o\fR, \fB\-\-output\fR \fIoutputfile\fR + explicitly specify output file. (otherwise, output.swf will be used) +.TP +\fB\-t\fR, \fB\-\-stack\fR + Don't assume the first file is a master file. Instead, store each + file in a seperate frame. +.TP +\fB\-T\fR, \fB\-\-stack1\fR + place each slave in the first frame (no master movie) +.TP +\fB\-m\fR, \fB\-\-merge\fR + Do not store the slave files in a sprite/MovieClip. Instead, merge the files frame by frame. +.TP +\fB\-a\fR, \fB\-\-cat\fR + concatenate all slave files (no master movie) +.TP +\fB\-l\fR, \fB\-\-overlay\fR + Don't remove any master objects, only overlay new objects +.TP +\fB\-c\fR, \fB\-\-clip\fR + Clip the slave objects by the corresponding master objects +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be verbose. Use more than one -v for greater effect +.TP +\fB\-F\fR, \fB\-\-flashversion\fR + Set the flash version of the output file. +.TP +\fB\-d\fR, \fB\-\-dummy\fR + Don't require the presence of slave objects. Usually used together with \fB\-X\fR, \fB\-Y\fR or \fB\-r\fR. +.TP +\fB\-f\fR, \fB\-\-frame\fR + The next slave replaces a frame, not an object. Therefore the slave identifier is a + frame number (#frame=) or frame label (framelabel=). +.TP +\fB\-x\fR, \fB\-\-movex\fR \fIxpos\fR + x Adjust position of slave by \fIxpos\fR pixels +.TP +\fB\-y\fR, \fB\-\-movey\fR \fIypos\fR + y Adjust position of slave by \fIypos\fR pixels +.TP +\fB\-s\fR, \fB\-\-scale\fR \fIscale\fR + Adjust size of slave by \fIscale\fR percent (e.g. 100% = original size) +.TP +\fB\-r\fR, \fB\-\-rate\fR \fIfps\fR + Force the output to have the framerate \fIfps\fR. (Otherwise, the framerate of the master file will be used) +.TP +\fB\-X\fR, \fB\-\-width\fR \fIwidth\fR + Force movie bbox width to \fIwidth\fR (default: use master width (not with -t)) +.TP +\fB\-Y\fR, \fB\-\-height\fR \fIheight\fR + Force movie bbox height to \fIheight\fR (default: use master height (not with -t)) +.TP +\fB\-N\fR, \fB\-\-local-with-networking\fR + Make output file "local-with-networking" +.TP +\fB\-G\fR, \fB\-\-hardware-gpu\fR + Set the "use hardware gpu" bit in the output file +.TP +\fB\-B\fR, \fB\-\-accelerated-blit\fR + Set the "use accelerated blit" bit in the output file +.TP +\fB\-L\fR, \fB\-\-local-with-filesystem\fR + Make output file "local-with-filesystem" +.TP +\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR + Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be + smaller, but not playable in Flash Plugins of Version 5 and below. +.PP +.SH Combining two or more .swf files using a master file +Of the flash files to be combined, all except one will be packed into a sprite +structure (Movieclip) which will then be inserted into the master .swf file. +This means that, in terms of trees, when combining several flash files, +one will form the root of the tree, while the others will be +appended to the root as a subnode. +The user has to specify which of the files will become the root +of the tree ("master") and which will be the appended nodes ("slaves"). +The slave files must all have a name, which is then used to determine +their exact position inside the master file. +The slave files will then be converted into sprites, inserted into the +master file, and all PlaceObject tags in the master file which match the +name of the slave file will be updated to correctly display the slave sprite. +The slave name may also be the object id, preceded by '#', in which case +the object to be replaced is referenced by id and not by instance name. +.SH Combining (stacking) one or more .swf files without a master +The flash files will be inserted in seperate frames. They will still be +packed into Movieclips, therefore the outputfile will have exactly as many +frames as there were inputfiles. Also, the files don't need to have names. +If you want to access the Movieclips, their names are frameXX, where XX is +the decimal number of the file, starting by zero (00). + +.SH EXAMPLES + +Create two flash movies. Insert some rectangle into one of them, and give +it a name. (E.g. "foo") Now call + +swfcombine -o combined.swf master.swf foo=slave.swf + +As a result, the slave movie should be visible inside the master movie +at the position where the rectangle used to be. + +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfcombine.c b/fluidbook/tools/swftools-special-swfdump/src/swfcombine.c new file mode 100644 index 000000000..2766e6161 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfcombine.c @@ -0,0 +1,1396 @@ +/* swfcombine.c + main routine for swfcombine(1), a tool for merging .swf-files. + + Part of the swftools package. + + Copyright (c) 2001,2002,2003 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" +#include "../lib/log.h" +#include "../config.h" + +struct config_t +{ + char overlay; + char alloctest; + char clip; + char stack; + char stack1; + char antistream; + char dummy; + char zlib; + char cat; + char merge; + char isframe; + char local_with_networking; + char local_with_filesystem; + char accelerated_blit; + char hardware_gpu; + int loglevel; + int sizex; + char hassizex; + int sizey; + char hassizey; + int flashversion; + int framerate; + int movex; + int movey; + float scalex; + float scaley; + int mastermovex; + int mastermovey; + float masterscalex; + float masterscaley; +}; +struct config_t config; + +char * master_filename = 0; +char * master_name = 0; +char * slave_filename[128]; +char * slave_name[128]; +int slave_movex[128]; +int slave_movey[128]; +float slave_scalex[128]; +float slave_scaley[128]; +char slave_isframe[128]; +int numslaves = 0; + +char * outputname = "output.swf"; + +int args_callback_option(char*name,char*val) { + if(!strcmp(name,"c")) + { + config.clip = 1; + return 0; + } + else if(!strcmp(name,"l")) + { + config.overlay = 1; + return 0; + } + else if (!strcmp(name, "o")) + { + outputname = val; + return 1; + } + else if (!strcmp(name, "v")) + { + config.loglevel ++; + return 0; + } + else if (!strcmp(name, "a")) + { + config.cat = 1; + return 0; + } + else if (!strcmp(name, "A")) + { + config.alloctest = 1; + return 0; + } + else if (!strcmp(name, "x")) + { + float x = atof(val); + config.movex = (int)(x*20+0.5); + return 1; + } + else if (!strcmp(name, "y")) + { + float y = atof(val); + config.movey = (int)(y*20+0.5); + return 1; + } + else if (!strcmp(name, "m")) + { + config.merge = 1; + return 0; + } + else if (!strcmp(name, "f")) + { + config.isframe = 1; + return 0; + } + else if (!strcmp(name, "F")) + { + config.flashversion = atoi(val); + return 1; + } + else if (!strcmp(name, "d")) + { + config.dummy = 1; + return 0; + } + else if (!strcmp(name, "z")) + { + config.zlib = 1; + return 0; + } + else if (!strcmp(name, "r")) + { + + float rate = atof(val); + if ((rate < 0) ||(rate >= 256.0)) { + fprintf(stderr, "Error: You must specify a valid framerate between 1/256 and 255.\n"); + exit(1); + } + config.framerate = (int)(rate*256); + return 1; + } + else if (!strcmp(name, "X")) + { + config.sizex = atoi(val)*20; + config.hassizex = 1; + return 1; + } + else if (!strcmp(name, "Y")) + { + config.sizey = atoi(val)*20; + config.hassizey = 1; + return 1; + } + else if (!strcmp(name, "s")) + { + config.scalex = config.scaley = atoi(val)/100.0; + return 1; + } + else if (!strcmp(name, "w")) + { + config.scalex = atoi(val)/100.0; + return 1; + } + else if (!strcmp(name, "h")) + { + config.scaley = atoi(val)/100.0; + return 1; + } + else if (!strcmp(name, "N")) + { + config.local_with_networking = 1; + return 0; + } + else if (!strcmp(name, "L")) + { + config.local_with_filesystem = 1; + return 0; + } + else if (!strcmp(name, "B")) + { + config.accelerated_blit = 1; + return 0; + } + else if (!strcmp(name, "G")) + { + config.hardware_gpu = 1; + return 0; + } + else if (!strcmp(name, "t") || !strcmp(name, "T")) + { + if(master_filename) { + fprintf(stderr, "error with arguments. Try --help.\n"); + exit(1); + } + config.stack = 1; + if(!strcmp(name,"T")) + config.stack1 = 1; + master_filename = "__none__"; + return 0; + } + else if (!strcmp(name, "V")) + { + printf("swfcombine - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else + { + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); + } +} + +static struct options_t options[] = { +{"o", "output"}, +{"t", "stack"}, +{"T", "stack1"}, +{"m", "merge"}, +{"a", "cat"}, +{"l", "overlay"}, +{"c", "clip"}, +{"v", "verbose"}, +{"F", "flashversion"}, +{"d", "dummy"}, +{"f", "frame"}, +{"x", "movex"}, +{"y", "movey"}, +{"s", "scale"}, +{"r", "rate"}, +{"X", "width"}, +{"Y", "height"}, +{"N", "local-with-networking"}, +{"G", "hardware-gpu"}, +{"B", "accelerated-blit"}, +{"L", "local-with-filesystem"}, +{"z", "zlib"}, +{0,0} +}; + +int args_callback_longoption(char*name,char*val) { + return args_long2shortoption(options, name, val); +} + +int args_callback_command(char*name, char*val) { + char*myname = strdup(name); + char*filename; + filename = strchr(myname, '='); + if(filename) { + *filename = 0; + filename++; + } else { + // argument has no explicit name field. guess one from the file name + char*path = strrchr(myname, '/'); + char*ext = strrchr(myname, '.'); + if(!path) path = myname; + else path ++; + if(ext) *ext = 0; + myname = path; + filename = name; + } + + if(!master_filename) { + master_filename = filename; + master_name = myname; + config.mastermovex = config.movex; + config.mastermovey = config.movey; + config.masterscalex = config.scalex; + config.masterscaley = config.scaley; + config.movex = config.movey = 0; + config.scalex = config.scaley = 1.0; + } else { + msg(" slave entity %s (named \"%s\")\n", filename, myname); + + slave_filename[numslaves] = filename; + slave_name[numslaves] = myname; + slave_movex[numslaves] = config.movex; + slave_movey[numslaves] = config.movey; + slave_scalex[numslaves] = config.scalex; + slave_scaley[numslaves] = config.scaley; + slave_isframe[numslaves] = config.isframe; + config.isframe = 0; + config.movex = config.movey = 0; + config.scalex = config.scaley = 1.0; + numslaves ++; + } + return 0; +} + +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-rXYomlcv] [-f] masterfile [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name); + printf("OR: %s [-rXYomv] --stack[1] [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name); + printf("OR: %s [-rXYov] --cat [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name); + printf("OR: %s [-rXYomlcv] --dummy [-xys] [file]\n", name); + printf("\n"); + printf("-o , --output explicitly specify output file. (otherwise, output.swf will be used)\n"); + printf("-t , --stack place each slave in a seperate frame (no master movie)\n"); + printf("-T , --stack1 place each slave in the first frame (no master movie)\n"); + printf("-m , --merge Don't store the slaves in Sprites/MovieClips\n"); + printf("-a , --cat concatenate all slave files (no master movie)\n"); + printf("-l , --overlay Don't remove any master objects, only overlay new objects\n"); + printf("-c , --clip Clip the slave objects by the corresponding master objects\n"); + printf("-v , --verbose Be verbose. Use more than one -v for greater effect \n"); + printf("-F , --flashversion Set the flash version of the output file.\n"); + printf("-d , --dummy Don't require slave objects (for changing movie attributes)\n"); + printf("-f , --frame The following identifier is a frame or framelabel, not an id or objectname\n"); + printf("-x , --movex x Adjust position of slave by pixels\n"); + printf("-y , --movey y Adjust position of slave by pixels\n"); + printf("-s , --scale Adjust size of slave by percent (e.g. 100%% = original size)\n"); + printf("-r , --rate Set movie framerate to (frames/sec)\n"); + printf("-X , --width Force movie bbox width to (default: use master width (not with -t))\n"); + printf("-Y , --height Force movie bbox height to (default: use master height (not with -t))\n"); + printf("-N , --local-with-networking Make output file \"local-with-networking\"\n"); + printf("-G , --hardware-gpu Set the \"use hardware gpu\" bit in the output file\n"); + printf("-B , --accelerated-blit Set the \"use accelerated blit\" bit in the output file\n"); + printf("-L , --local-with-filesystem Make output file \"local-with-filesystem\"\n"); + printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); + printf("\n"); +} + +void removeCommonTags(SWF * swf) +{ + TAG*tag = swf->firstTag; + while(tag) { + if(tag->id == ST_SCENEDESCRIPTION || + tag->id == ST_FILEATTRIBUTES || + tag->id == ST_REFLEX) { + tag = swf_DeleteTag(swf, tag); + } else { + tag = tag->next; + } + } +} + +static void makestackmaster(SWF*swf) +{ + TAG*tag; + int t; + SRECT box; + int fileversion = config.zlib?6:3; + int frameRate = 256; + U32 fileAttributes = 0; + RGBA rgb; + rgb.r=rgb.b=rgb.g=0; + memset(&box, 0, sizeof(box)); + + /* scan all slaves for bounding box */ + for(t=numslaves-1;t>=0;t--) + { + SWF head; + int ret; + int fi=open(slave_filename[t],O_RDONLY|O_BINARY); + TAG*tag; + if(fi<0 || swf_ReadSWF(fi, &head)<0) { + msg(" Couldn't open/read %s.", slave_filename[t]); + exit(1); + } + close(fi); + swf_RemoveJPEGTables(&head); + fileAttributes |= head.fileAttributes; + removeCommonTags(&head); + + msg(" File %s has bounding box %d:%d:%d:%d\n", + slave_filename[t], + head.movieSize.xmin, head.movieSize.ymin, + head.movieSize.xmax, head.movieSize.ymax); + + tag = head.firstTag; + while(tag) { + if(tag->id == ST_SETBACKGROUNDCOLOR && tag->len>=3) { + rgb.r = tag->data[0]; + rgb.g = tag->data[1]; + rgb.b = tag->data[2]; + } + tag=tag->next; + } + frameRate = head.frameRate; + if(head.fileVersion > fileversion) + fileversion = head.fileVersion; + if(!t) + box = head.movieSize; + else { + if(head.movieSize.xmin < box.xmin) + box.xmin = head.movieSize.xmin; + if(head.movieSize.ymin < box.ymin) + box.ymin = head.movieSize.ymin; + if(head.movieSize.xmax > box.xmax) + box.xmax = head.movieSize.xmax; + if(head.movieSize.ymax > box.ymax) + box.ymax = head.movieSize.ymax; + } + msg(" New master bounding box is %d:%d:%d:%d\n", + box.xmin, box.ymin, + box.xmax, box.ymax); + swf_FreeTags(&head); + } + + memset(swf, 0, sizeof(SWF)); + swf->fileVersion = fileversion; + swf->movieSize = box; + swf->frameRate = frameRate; + swf->fileAttributes = fileAttributes; + + swf->firstTag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); + tag = swf->firstTag; + swf_SetRGB(tag, &rgb); + + for(t=0;t temporary SWF created"); +} + +static char* slavename = 0; +static int slaveid = -1; +static int slaveframe = -1; +static char masterbitmap[65536]; +static char depthbitmap[65536]; + +#define FLAGS_WRITEDEFINES 1 +#define FLAGS_WRITENONDEFINES 2 +#define FLAGS_WRITESPRITE 4 +#define FLAGS_WRITESLAVE 8 + +int get_free_id(char*bitmap) +{ + int t; + for(t=1;t<65536;t++) + if(!bitmap[t]) { + bitmap[t] = 1; + return t; + } + return -1; +} + +void jpeg_assert(SWF*master, SWF*slave) +{ + /* TODO: if there's a jpegtable found, store it + and handle it together with the flash file + headers */ + + /* check that master and slave don't have both + jpegtables (which would be fatal) */ + int pos; + TAG *mpos=0, *spos=0; + TAG *mtag,*stag; + pos = 0; + mtag = master->firstTag; + stag = slave->firstTag; + while(mtag) + { + if(mtag->id == ST_JPEGTABLES) + mpos = mtag; + mtag = mtag->next; + } + while(stag) + { + if(stag->id == ST_JPEGTABLES) + spos = stag; + stag = stag->next; + } + if(mpos && spos) + { + if(spos->len == mpos->len && + !memcmp(spos->data, mpos->data, mpos->len)) + { + // ok, both have jpegtables, but they're identical. + // delete one and don't throw an error + swf_DeleteTag(slave, spos); + spos = 0; + } + } + if(spos && mpos) { + msg(" Master and slave have incompatible JPEGTABLES."); + } +} + +TAG* write_sprite_defines(TAG*tag, SWF*sprite) +{ + TAG*rtag = sprite->firstTag; + while(rtag && rtag->id!=ST_END) { + if(!swf_isAllowedSpriteTag(rtag)) { + msg(" processing sprite tag %02x", tag->id); + if(swf_isDefiningTag(rtag)) + { + msg(" [sprite defs] write tag %02x (%d bytes in body)", + tag->id, tag->len); + tag = swf_InsertTag(tag, rtag->id); + swf_SetBlock(tag, rtag->data, rtag->len); + } + else if(swf_isPseudoDefiningTag(rtag)) + { + msg(" [sprite defs] write tag %02x (%d bytes in body)", + tag->id, tag->len); + tag = swf_InsertTag(tag, rtag->id); + swf_SetBlock(tag, rtag->data, rtag->len); + } + else { + switch(rtag->id) + { + case ST_JPEGTABLES: + /* if we get here, jpeg_assert has already run, + ensuring this is the only one of it's kind, + so we may safely write it out */ + tag = swf_InsertTag(tag, rtag->id); + swf_SetBlock(tag, rtag->data, rtag->len); + break; + case ST_EXPORTASSETS: + msg(" deliberately ignoring EXPORTASSETS tag"); + break; + case ST_ENABLEDEBUGGER: + msg(" deliberately ignoring ENABLEDEBUGGER tag"); + break; + case ST_SETBACKGROUNDCOLOR: + msg(" deliberately ignoring BACKGROUNDCOLOR tag"); + break; + case ST_SHOWFRAME: + msg(" deliberately ignoring SHOWFRAME tag"); + break; + case ST_REFLEX: + msg(" deliberately ignoring REFLEX tag"); + break; + case 40: + case 49: + case 51: + msg(" found tag %d. This is a Generator template, isn't it?", rtag->id); + break; + default: + msg(" funny tag: %d is neither defining nor sprite", rtag->id); + } + } + } + rtag = rtag->next; + } + return tag; +} + +void changedepth(TAG*tag, int add) +{ + if(tag->id == ST_PLACEOBJECT) + PUT16(&tag->data[2],GET16(&tag->data[2])+add); + if(tag->id == ST_PLACEOBJECT2) + PUT16(&tag->data[1],GET16(&tag->data[1])+add); + if(tag->id == ST_REMOVEOBJECT) + PUT16(&tag->data[2],GET16(&tag->data[2])+add); + if(tag->id == ST_REMOVEOBJECT2) + PUT16(&tag->data[0],GET16(&tag->data[0])+add); + if(tag->id == ST_PLACEOBJECT2) { + SWFPLACEOBJECT obj; + U8 flags; + swf_SetTagPos(tag, 0); + flags = swf_GetU8(tag); + if(flags&2) swf_GetU16(tag); //id + if(flags&4) swf_GetMatrix(tag, 0); + if(flags&8) swf_GetCXForm(tag, 0,1); + if(flags&16) swf_GetU16(tag); //ratio + if(flags&64) { + swf_ResetReadBits(tag); + printf("%d->%d\n", GET16(&tag->data[tag->pos]), + GET16(&tag->data[tag->pos])+add); + PUT16(&tag->data[tag->pos],GET16(&tag->data[tag->pos])+add); + } + msg(" Depth relocation not fully working yet with clipdepths", tag->id); + } +} + +void matrix_adjust(MATRIX*m, int movex, int movey, float scalex, float scaley, int scalepos) +{ + m->sx = (int)(m->sx*scalex); + m->sy = (int)(m->sy*scaley); + m->r1 = (int)(m->r1*scalex); + m->r0 = (int)(m->r0*scaley); + if(scalepos) { + m->tx *= scalex; + m->ty *= scaley; + } + m->tx += movex; + m->ty += movey; +} + +void write_changepos(TAG*output, TAG*tag, int movex, int movey, float scalex, float scaley, int scalepos) +{ + if(movex || movey || scalex != 1.0 || scaley != 1.0) + { + switch(tag->id) + { + case ST_PLACEOBJECT2: { + MATRIX m; + U8 flags; + swf_GetMatrix(0, &m); + tag->pos = 0; + tag->readBit = 0; + + flags = swf_GetU8(tag); + swf_SetU8(output, flags|4); + swf_SetU16(output, swf_GetU16(tag)); //depth + //flags&1: move + if(flags&2) { + swf_SetU16(output, swf_GetU16(tag)); //id + } + // flags & 4 + if(flags&4) { + swf_GetMatrix(tag, &m); + } else { + swf_GetMatrix(0, &m); + } + matrix_adjust(&m, movex, movey, scalex, scaley, scalepos); + swf_SetMatrix(output, &m); + + if (tag->readBit) { tag->pos++; tag->readBit = 0; } //swf_ResetReadBits(tag); + + swf_SetBlock(output, &tag->data[tag->pos], tag->len - tag->pos); + break; + } + case ST_PLACEOBJECT: { + MATRIX m; + swf_SetU16(output, swf_GetU16(tag)); //id + swf_SetU16(output, swf_GetU16(tag)); //depth + + swf_GetMatrix(tag, &m); + matrix_adjust(&m, movex, movey, scalex, scaley, scalepos); + swf_SetMatrix(output, &m); + + if (tag->readBit) { tag->pos++; tag->readBit = 0; } //swf_ResetReadBits(tag); + + swf_SetBlock(output, &tag->data[tag->pos], tag->len - tag->pos); + break; + } + default: + swf_SetBlock(output, tag->data, tag->len); + } + } + else + { + swf_SetBlock(output, tag->data, tag->len); + } +} + +TAG* write_sprite(TAG*tag, SWF*sprite, int spriteid, int replaceddefine) +{ + TAG* definespritetag; + TAG* rtag; + int tmp; + + definespritetag = tag = swf_InsertTag(tag, ST_DEFINESPRITE); + swf_SetU16(tag, spriteid); + swf_SetU16(tag, sprite->frameCount); + msg (" sprite id is %d", spriteid); + + tmp = sprite->frameCount; + msg(" %d frames to go",tmp); + + if(config.clip) { + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_SetU8(tag, 2+64); //flags: character+clipdepth + swf_SetU16(tag, 0); //depth + swf_SetU16(tag, replaceddefine); //id + swf_SetU16(tag, 65535); //clipdepth + } + + if(config.overlay && !config.isframe) { + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_SetU8(tag, 2); //flags: character + swf_SetU16(tag, 1); //depth + swf_SetU16(tag, replaceddefine); //id + } + + rtag = sprite->firstTag; + while(rtag && rtag->id!=ST_END) + { + if (swf_isAllowedSpriteTag(rtag)) { + + msg(" [sprite main] write tag %02x (%d bytes in body)", + rtag->id, rtag->len); + tag = swf_InsertTag(tag, rtag->id); + write_changepos(tag, rtag, config.movex, config.movey, config.scalex, config.scaley, 0); + + if(config.clip || (config.overlay && !config.isframe)) + changedepth(tag, +2); + + if(tag->id == ST_SHOWFRAME) + { + tmp--; + msg(" %d frames to go",tmp); + } + } + rtag = rtag->next; + } + tag = swf_InsertTag(tag, ST_END); + return tag; +} + +static char tag_ok_for_slave(int id) +{ + if(id == ST_SETBACKGROUNDCOLOR) + return 0; + return 1; +} + +TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefine, int flags) +{ + int outputslave = 0; + int frame = 1; + int sframe = 0; + int slavewritten = 0; + int deletedepth = -1; + + TAG* rtag = master->firstTag; + TAG* stag = slave->firstTag; + + while(rtag && rtag->id!=ST_END) + { + if(rtag->id == ST_SHOWFRAME && outputslave) + { + while(stag && stag->id!=ST_END) { + if(stag->id == ST_SHOWFRAME) { + stag = stag->next; + sframe++; + break; + } + if(tag_ok_for_slave(stag->id)) { + tag = swf_InsertTag(tag, stag->id); + write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0); + } + stag = stag->next; + } + } + if(rtag->id == ST_SHOWFRAME) + { + frame ++; + tag = swf_InsertTag(tag, ST_SHOWFRAME); + if(deletedepth>=0) { + tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); + swf_SetU16(tag, deletedepth); + deletedepth=-1; + } + rtag = rtag->next; + continue; + } + + if(swf_isDefiningTag(rtag) && (flags&FLAGS_WRITEDEFINES)) + { + msg(" [master] write tag %02x (%d bytes in body)", + rtag->id, rtag->len); + if(swf_GetDefineID(rtag) == spriteid && !config.isframe) + { + if(config.overlay) + { + tag = swf_InsertTag(tag, rtag->id); + swf_SetBlock(tag, rtag->data, rtag->len); + swf_SetDefineID(tag, replaceddefine); + } else { + /* don't write this tag */ + msg(" replacing tag %d ID %d with sprite", rtag->id ,spriteid); + } + + if(flags&FLAGS_WRITESPRITE) + { + msg(" writing sprite defines"); + tag = write_sprite_defines(tag, slave); + msg(" writing sprite"); + tag = write_sprite(tag, slave, spriteid, replaceddefine); + } + if(flags&FLAGS_WRITESLAVE) + { + msg(" writing slave"); + outputslave = 1; + } + } else { + tag = swf_InsertTag(tag, rtag->id); + swf_SetBlock(tag, rtag->data, rtag->len); + } + } + if(frame == slaveframe) /* only happens with config.isframe: put slave at specific frame */ + { + if(flags&FLAGS_WRITESLAVE) { + outputslave = 1; + slavewritten = 1; + } + if((flags&FLAGS_WRITESPRITE) && !slavewritten) + { + int id = get_free_id(masterbitmap); + int depth = 65535; + deletedepth = 65535; + if(config.clip) { + msg(" Can't combine --clip and --frame"); + } + + tag = write_sprite_defines(tag, slave); + tag = write_sprite(tag, slave, id, -1); + + tag = swf_InsertTag(tag, ST_PLACEOBJECT2); + swf_SetU8(tag, 2); //flags: id + swf_SetU16(tag, depth); + swf_SetU16(tag, id); + + slavewritten = 1; + } + } + if(!swf_isDefiningTag(rtag) && (flags&FLAGS_WRITENONDEFINES)) + { + int dontwrite = 0; + switch(rtag->id) { + case ST_PLACEOBJECT: + case ST_PLACEOBJECT2: + if(frame == slaveframe && !config.overlay) + dontwrite = 1; + case ST_REMOVEOBJECT: + /* place/removetags for the object we replaced + should be discarded, too, as the object to insert + isn't a sprite + */ + if(spriteid>=0 && swf_GetPlaceID(rtag) == spriteid && + !config.isframe && config.merge) + dontwrite = 1; + break; + case ST_REMOVEOBJECT2: + break; + } + if(!dontwrite) { + msg(" [master] write tag %02x (%d bytes in body)", + rtag->id, rtag->len); + tag = swf_InsertTag(tag, rtag->id); + write_changepos(tag, rtag, config.mastermovex, config.mastermovey, config.masterscalex, config.masterscaley, 1); + + } + } + rtag = rtag->next; + } + + if(outputslave) + while(stag && stag->id!=ST_END) + { + if(tag_ok_for_slave(stag->id)) { + msg(" [slave] write tag %02x (%d bytes in body), %.2f %.2f", rtag->id, rtag->len, config.movex /20.0, config.movey /20.0); + tag = swf_InsertTag(tag, stag->id); + write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0); + } + stag = stag->next; + } + if(!slavewritten && config.isframe && (flags&(FLAGS_WRITESLAVE|FLAGS_WRITESPRITE))) + { + if(slaveframe>=0) + msg(" Frame %d doesn't exist in file. No substitution will occur", + slaveframe); + else + msg(" Frame \"%s\" doesn't exist in file. No substitution will occur", + slavename); + } + tag = swf_InsertTag(tag, ST_END); + return tag; +} + +void adjustheader(SWF*swf) +{ + if(config.framerate) + swf->frameRate = config.framerate; + if(config.hassizex) { + swf->movieSize.xmax = + swf->movieSize.xmin + config.sizex; + } + if(config.hassizey) { + swf->movieSize.ymax = + swf->movieSize.ymin + config.sizey; + } + if(config.flashversion) + swf->fileVersion = config.flashversion; +} + +void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) +{ + char* depths; + int t; + TAG*tag; + TAG*mtag,*stag; + if(config.isframe) { + msg(" Can't combine --cat and --frame"); + exit(1); + } + if(config.flashversion) + master->fileVersion = config.flashversion; + + tag = master->firstTag; + while(tag) + { + if(swf_isDefiningTag(tag)) { + int defineid = swf_GetDefineID(tag); + msg(" tagid %02x defines object %d", tag->id, defineid); + masterbitmap[defineid] = 1; + } + tag = tag->next; + } + + swf_Relocate(slave, masterbitmap); + jpeg_assert(master, slave); + + memcpy(newswf, master, sizeof(SWF)); + adjustheader(newswf); + + tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX); // to be removed later + + depths = malloc(65536); + if(!depths) { + msg(" Couldn't allocate %d bytes of memory", 65536); + return; + } + memset(depths, 0, 65536); + mtag = master->firstTag; + while(mtag && mtag->id!=ST_END) + { + int num=1; + U16 depth; + msg(" [master] write tag %02x (%d bytes in body)", + mtag->id, mtag->len); + switch(mtag->id) { + case ST_PLACEOBJECT2: + num++; + case ST_PLACEOBJECT: { + depth = swf_GetDepth(mtag); + depths[depth] = 1; + } + break; + case ST_REMOVEOBJECT: { + depth = swf_GetDepth(mtag); + depths[depth] = 0; + } + break; + case ST_REMOVEOBJECT2: { + depth = swf_GetDepth(mtag); + depths[depth] = 0; + } + break; + } + tag = swf_InsertTag(tag, mtag->id); + swf_SetBlock(tag, mtag->data, mtag->len); + + mtag = mtag->next; + } + + for(t=0;t<65536;t++) + if(depths[t]) + { + char data[16]; + int len; + tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); + swf_SetU16(tag, t); + } + free(depths); + + stag = slave->firstTag; + while(stag && stag->id!=ST_END) + { + msg(" [slave] write tag %02x (%d bytes in body)", + stag->id, stag->len); + tag = swf_InsertTag(tag, stag->id); + swf_SetBlock(tag, stag->data, stag->len); + stag = stag->next; + } + tag = swf_InsertTag(tag, ST_END); + + swf_DeleteTag(newswf, tag); +} + +void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) +{ + int spriteid = -1; + int replaceddefine = -1; + int frame = 0; + char*framelabel; + TAG * tag = master->firstTag; + + memset(depthbitmap, 0, sizeof(depthbitmap)); + + // set the idtab + while(tag) + { + int depth = swf_GetDepth(tag); + if(depth>=0) { + depthbitmap[depth] = 1; + } + if(swf_isDefiningTag(tag)) { + int defineid = swf_GetDefineID(tag); + msg(" tagid %02x defines object %d", tag->id, defineid); + masterbitmap[defineid] = 1; + + if (!slavename && defineid==slaveid) { + if(defineid>=0) { + spriteid = defineid; + msg(" Slave file attached to object %d.", defineid); + } + } + } else if(tag->id == ST_EXPORTASSETS) { + int t; + int num = swf_GetU16(tag); + for(t=0;t Slave file attached to object %d exported as %s.", id, name); + } + } + } else if(tag->id == ST_SYMBOLCLASS) { + /* a symbolclass tag is like a define tag: it defines id 0000 */ + int num = swf_GetU16(tag); + int t; + for(t=0;tid == ST_PLACEOBJECT2) { + char * name = swf_GetName(tag); + int id = swf_GetPlaceID(tag); + + { + SWFPLACEOBJECT obj; + swf_GetPlaceObject(tag, &obj); + swf_PlaceObjectFree(&obj); + if(obj.clipdepth) { + depthbitmap[obj.clipdepth] = 1; + } + } + + if(name) + msg(" tagid %02x places object %d named \"%s\"", tag->id, id, name); + else + msg(" tagid %02x places object %d (no name)", tag->id, id); + + if (name && slavename && !strcmp(name,slavename)) { + if(id>=0) { + spriteid = id; + msg(" Slave file attached to named object %s (%d).", name, id); + } + } + } else if(tag->id == ST_SHOWFRAME) { + if(slaveframe>=0 && frame==slaveframe) { + msg(" Slave file attached to frame %d.", frame); + } + frame++; + } else if(tag->id == ST_FRAMELABEL) { + char * name = tag->data; + if(name && slavename && config.isframe && !strcmp(name, slavename)) { + slaveframe = frame; + msg(" Slave file attached to frame %d (%s).", frame, name); + } + } + tag = tag->next; + }; + + if (spriteid<0 && !config.isframe) { + if(slavename) { + if(strcmp(slavename,"!!dummy!!")) { + msg(" Didn't find anything named %s in file. No substitutions will occur.", slavename); + if(!strcmp(slavename, "swf")) { + msg(" (If you were trying to combine rfxview with a document, try replacing 'swf' with 'viewport'."); + } + } + } + else + msg(" Didn't find id %d in file. No substitutions will occur.", slaveid); + spriteid = get_free_id(masterbitmap); + } + + swf_Relocate (slave, masterbitmap); + + if(config.merge) + swf_RelocateDepth (slave, depthbitmap); + jpeg_assert(slave, master); + + if (config.overlay) + replaceddefine = get_free_id(masterbitmap); + + // write file + + memcpy(newswf, master, sizeof(SWF)); + adjustheader(newswf); + + newswf->firstTag = tag = swf_InsertTag(0, ST_REFLEX); // to be removed later + + if (config.antistream) { + if (config.merge) { + msg(" Can't combine --antistream and --merge"); + } + tag = write_sprite_defines(tag, slave); + tag = write_sprite(tag, slave, spriteid, replaceddefine); + tag = write_master(tag, master, slave, spriteid, replaceddefine, FLAGS_WRITEDEFINES); + tag = write_master(tag, master, slave, spriteid, replaceddefine, FLAGS_WRITENONDEFINES); + } else { + if (config.merge) + tag = write_master(tag, master, slave, spriteid, replaceddefine, + FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES| FLAGS_WRITESLAVE ); + else + tag = write_master(tag, master, slave, spriteid, replaceddefine, + FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES| FLAGS_WRITESPRITE ); + } + + swf_DeleteTag(newswf, newswf->firstTag); +} + +void combine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) +{ + slavename = slave_name; + slaveid = -1; + slaveframe = -1; + + if(!master->fileVersion && slave) + master->fileVersion = slave->fileVersion; + + master->fileAttributes |= slave->fileAttributes; + + swf_FoldAll(master); + swf_FoldAll(slave); + + if(slavename[0] == '#') + { + slaveid = atoi(&slavename[1]); + slavename = 0; + } + + if(config.isframe) + { + if(slavename && slavename[0]!='#') { + int tmp; + int len; + sscanf(slavename, "%d%n", &tmp, &len); + if(len == strlen(slavename)) { + /* if the name the slave should replace + consists only of digits and the -f + option is given, it probably is not + a frame name but a frame number. + */ + slaveid = tmp; + slavename = 0; + } + } + + if(slaveid>=0) { + slaveframe = slaveid; + slaveid = -1; + } else { + /* if id wasn't given as either #number or number, + the name is a frame label. BTW: The user wouldn't necessarily have + needed to supply the -f option in this case */ + } + } + + msg(" move x (%d)", config.movex); + msg(" move y (%d)", config.movey); + msg(" scale x (%f)", config.scalex); + msg(" scale y (%f)", config.scaley); + msg(" master move x (%d)", config.mastermovex); + msg(" master move y (%d)", config.mastermovey); + msg(" master scale x (%f)", config.masterscalex); + msg(" master scale y (%f)", config.masterscaley); + msg(" is frame (%d)", config.isframe); + + memset(masterbitmap, 0, sizeof(masterbitmap)); + + if(config.cat) + return catcombine(master, slave_name, slave, newswf); + else + return normalcombine(master, slave_name, slave, newswf); +} + +int main(int argn, char *argv[]) +{ + int fi; + SWF master; + SWF slave; + SWF newswf; + int t; + + config.overlay = 0; + config.antistream = 0; + config.alloctest = 0; + config.cat = 0; + config.merge = 0; + config.clip = 0; + config.loglevel = 2; + config.movex = 0; + config.movey = 0; + config.scalex = 1.0; + config.scaley = 1.0; + config.sizex = 0; + config.sizey = 0; + config.masterscalex = 1.0; + config.masterscaley = 1.0; + config.mastermovex = 0; + config.mastermovey = 0; + config.hassizex = 0; + config.hassizey = 0; + config.framerate = 0; + config.stack = 0; + config.stack1 = 0; + config.dummy = 0; + config.zlib = 0; + + processargs(argn, argv); + initLog(0,-1,0,0,-1,config.loglevel); + + if(config.merge && config.cat) { + msg(" Can't combine --cat and --merge"); + exit(1); + } + + if(config.stack && config.cat) { + msg(" Can't combine --cat and --stack"); + exit(1); + } + + if(config.stack) { + if(config.overlay) { + msg(" Can't combine -l and -t"); + exit(1); + } + if(config.clip) { + msg(" Can't combine -c and -t"); + exit(1); + } + msg(" (stacking) %d files found\n", numslaves); + + makestackmaster(&master); + } + else { + int ret; + msg(" master entity %s (named \"%s\")\n", master_filename, master_name); + fi = open(master_filename, O_RDONLY|O_BINARY); + if(fi<0) { + msg(" Failed to open %s\n", master_filename); + exit(1); + } + ret = swf_ReadSWF(fi, &master); + if(ret<0) { + msg(" Failed to read from %s\n", master_filename); + exit(1); + } + swf_RemoveJPEGTables(&master); + removeCommonTags(&master); + msg(" Read %d bytes from masterfile\n", ret); + close(fi); + } + + for(t=0;t slave entity(%d) %s (%s \"%s\")\n", t+1, slave_filename[t], + slave_isframe[t]?"frame":"object", slave_name[t]); + } + + if(config.dummy) + { + if(numslaves) + { + msg(" --dummy (-d) implies there are zero slave objects. You supplied %d.", numslaves); + exit(1); + } + numslaves = 1; + slave_filename[0] = "!!dummy!!"; + slave_name[0] = "!!dummy!!"; + slave_isframe[0] = 0; + } + + if (config.alloctest) + { + char*bitmap = malloc(sizeof(char)*65536); + memset(bitmap, 0, 65536*sizeof(char)); + memset(bitmap, 1, 101*sizeof(char)); + swf_Relocate(&master, bitmap); + newswf = master; + free(bitmap); +// makestackmaster(&newswf); + } + else + { + if (!numslaves) + { + if(config.cat) + msg(" You must have at least two objects."); + else + msg(" You must have at least one slave entity."); + return 0; + } + for(t = 0; t < numslaves; t++) + { + config.movex = slave_movex[t]; + config.movey = slave_movey[t]; + config.scalex = slave_scalex[t]; + config.scaley = slave_scaley[t]; + config.isframe = slave_isframe[t]; + + msg(" Combine [%s]%s and [%s]%s", master_name, master_filename, + slave_name[t], slave_filename[t]); + if(!config.dummy) + { + int ret; + fi = open(slave_filename[t], O_RDONLY|O_BINARY); + if(fi<0) { + msg(" Failed to open %s\n", slave_filename[t]); + exit(1); + } + ret = swf_ReadSWF(fi, &slave); + if(ret<0) { + msg(" Failed to read from %s\n", slave_filename[t]); + exit(1); + } + msg(" Read %d bytes from slavefile\n", ret); + close(fi); + swf_RemoveJPEGTables(&slave); + removeCommonTags(&slave); + } + else + { + memset(&slave, 0, sizeof(slave)); + slave.firstTag = swf_InsertTag(0, ST_END); + slave.frameRate = 0; + slave.fileVersion = 0; + slave.frameCount = 0; + } + + combine(&master, slave_name[t], &slave, &newswf); + master = newswf; + } + if(config.dummy && !config.hassizex && !config.hassizey && !config.mastermovex && !config.mastermovey) { + newswf.movieSize.xmin = newswf.movieSize.xmin*config.masterscalex; + newswf.movieSize.ymin = newswf.movieSize.ymin*config.masterscaley; + newswf.movieSize.xmax = newswf.movieSize.xmax*config.masterscalex; + newswf.movieSize.ymax = newswf.movieSize.ymax*config.masterscaley; + } + } + + if(!newswf.fileVersion) + newswf.fileVersion = 4; + + if(config.local_with_filesystem) + newswf.fileAttributes &= ~FILEATTRIBUTE_USENETWORK; + if(config.local_with_networking) + newswf.fileAttributes |= FILEATTRIBUTE_USENETWORK; + if(config.accelerated_blit) + newswf.fileAttributes |= FILEATTRIBUTE_USEACCELERATEDBLIT; + if(config.hardware_gpu) + newswf.fileAttributes |= FILEATTRIBUTE_USEHARDWAREGPU; + + fi = open(outputname, O_BINARY|O_RDWR|O_TRUNC|O_CREAT, 0777); + + if(config.zlib) { + if(newswf.fileVersion < 6) + newswf.fileVersion = 6; + newswf.compressed = 1; + swf_WriteSWF(fi, &newswf); + } else { + newswf.compressed = -1; // don't compress + swf_WriteSWF(fi, &newswf); + } + close(fi); + + return 0; //ok +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfdump b/fluidbook/tools/swftools-special-swfdump/src/swfdump new file mode 100644 index 000000000..71a51ed9c Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfdump differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfdump.1 b/fluidbook/tools/swftools-special-swfdump/src/swfdump.1 new file mode 100644 index 000000000..0bde677c0 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfdump.1 @@ -0,0 +1,72 @@ +.TH swfdump "1" "April 2009" "swfdump" "swftools" +.SH NAME +swfdump - Display an SWF file's content. + +.SH Synopsis +.B swfdump [-atpdu] file.swf + +.SH DESCRIPTION +A tool for displaying information about flash files +.PP +swfdump shows ids, names and depths of objects defined in the SWF file. +It can furthermore also disassemble Actionscript, extract texts, and +display placement information about objects. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-D\fR, \fB\-\-full\fR + Show everything. Same as -atp +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.TP +\fB\-e\fR, \fB\-\-html\fR + Print out html code for embedding the file +.TP +\fB\-E\fR, \fB\-\-xhtml\fR + Print out xhtml code for embedding the file +.TP +\fB\-a\fR, \fB\-\-action\fR + Disassemble action tags +.TP +\fB\-t\fR, \fB\-\-text\fR + Show text fields (like swfstrings). +.TP +\fB\-s\fR, \fB\-\-shapes\fR + Show shape coordinates/styles +.TP +\fB\-F\fR, \fB\-\-fonts\fR + Show font information +.TP +\fB\-p\fR, \fB\-\-placements\fR + Show placement information +.TP +\fB\-B\fR, \fB\-\-buttons\fR + Show button information +.TP +\fB\-b\fR, \fB\-\-bbox\fR + Print tag's bounding boxes +.TP +\fB\-X\fR, \fB\-\-width\fR + Print out the horizontal dimension of the movie, in a string of the form "-X width" +.TP +\fB\-Y\fR, \fB\-\-height\fR + Print out the vertical dimension of the movie, in a string of the form "-Y height" +.TP +\fB\-r\fR, \fB\-\-rate\fR + Print out the frame rate of the movie, in a string of the form "-r rate". +.TP +\fB\-f\fR, \fB\-\-frames\fR + Print out the number of frames in the movie, in a string of the form "-f frames" +.TP +\fB\-d\fR, \fB\-\-hex\fR + Print hex output of tag data, too. +.TP +\fB\-u\fR, \fB\-\-used\fR + Show referred IDs for each Tag. +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfdump.c b/fluidbook/tools/swftools-special-swfdump/src/swfdump.c new file mode 100644 index 000000000..f0006609c --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfdump.c @@ -0,0 +1,1621 @@ +/* swfdump.c + Shows the structure of a swf file + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include "../config.h" + +#ifdef HAVE_SYS_STAT_H +#include +#else +#undef HAVE_STAT +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#else +#undef HAVE_STAT +#endif + +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" + +static char * filename = 0; + +/* idtab stores the ids which are defined in the file. This allows us + to detect errors in the file. (i.e. ids which are defined more than + once */ +static char idtab[65536]; +static char * indent = " "; + +static int placements = 0; +static int action = 0; +static int html = 0; +static int xhtml = 0; +static int xy = 0; +static int showtext = 0; +static int showshapes = 0; +static int hex = 0; +static int used = 0; +static int bbox = 0; +static int cumulative = 0; +static int showfonts = 0; +static int showbuttons = 0; + +static struct options_t options[] = { +{"h", "help"}, +{"D", "full"}, +{"V", "version"}, +{"e", "html"}, +{"E", "xhtml"}, +{"a", "action"}, +{"t", "text"}, +{"s", "shapes"}, +{"F", "fonts"}, +{"p", "placements"}, +{"B", "buttons"}, +{"b", "bbox"}, +{"X", "width"}, +{"Y", "height"}, +{"r", "rate"}, +{"f", "frames"}, +{"d", "hex"}, +{"u", "used"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfdump - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(name[0]=='a') { + action = 1; + return 0; + } + else if(name[0]=='p') { + placements = 1; + return 0; + } + else if(name[0]=='t') { + showtext = 1; + return 0; + } + else if(name[0]=='s') { + showshapes = 1; + return 0; + } + else if(name[0]=='e') { + html = 1; + return 0; + } + else if(name[0]=='c') { + cumulative = 1; + return 0; + } + else if(name[0]=='E') { + html = 1; + xhtml = 1; + return 0; + } + else if(name[0]=='X') { + xy |= 1; + return 0; + } + else if(name[0]=='Y') { + xy |= 2; + return 0; + } + else if(name[0]=='r') { + xy |= 4; + return 0; + } + else if(name[0]=='f') { + xy |= 8; + return 0; + } + else if(name[0]=='F') { + showfonts = 1; + return 0; + } + else if(name[0]=='d') { + hex = 1; + return 0; + } + else if(name[0]=='u') { + used = 1; + return 0; + } + else if(name[0]=='b') { + bbox = 1; + return 0; + } + else if(name[0]=='B') { + showbuttons = 1; + return 0; + } + else if(name[0]=='D') { + showbuttons = action = placements = showtext = showshapes = 1; + return 0; + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-atpdu] file.swf\n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-D , --full Show everything. Same as -atp\n"); + printf("-V , --version Print version info and exit\n"); + printf("-e , --html Print out html code for embedding the file\n"); + printf("-E , --xhtml Print out xhtml code for embedding the file\n"); + printf("-a , --action Disassemble action tags\n"); + printf("-t , --text Show text fields (like swfstrings).\n"); + printf("-s , --shapes Show shape coordinates/styles\n"); + printf("-F , --fonts Show font information\n"); + printf("-p , --placements Show placement information\n"); + printf("-B , --buttons Show button information\n"); + printf("-b , --bbox Print tag's bounding boxes\n"); + printf("-X , --width Prints out a string of the form \"-X width\".\n"); + printf("-Y , --height Prints out a string of the form \"-Y height\".\n"); + printf("-r , --rate Prints out a string of the form \"-r rate\".\n"); + printf("-f , --frames Prints out a string of the form \"-f framenum\".\n"); + printf("-d , --hex Print hex output of tag data, too.\n"); + printf("-u , --used Show referred IDs for each Tag.\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +char* what; +char* testfunc(char*str) +{ + printf("%s: %s\n", what, str); + return 0; +} + +void dumpButton2Actions(TAG*tag, char*prefix) +{ + U32 oldTagPos; + U32 offsetpos; + U32 condition; + + oldTagPos = swf_GetTagPos(tag); + + // scan DefineButton2 Record + + swf_GetU16(tag); // Character ID + swf_GetU8(tag); // Flags; + + offsetpos = swf_GetTagPos(tag); // first offset + swf_GetU16(tag); + + while (swf_GetU8(tag)) // state -> parse ButtonRecord + { swf_GetU16(tag); // id + swf_GetU16(tag); // layer + swf_GetMatrix(tag,NULL); // matrix + swf_GetCXForm(tag,NULL,1); // cxform + } + + while(offsetpos) + { U8 a; + ActionTAG*actions; + + if(tag->pos >= tag->len) + break; + + offsetpos = swf_GetU16(tag); + condition = swf_GetU16(tag); // condition + + actions = swf_ActionGet(tag); + printf("%s condition %04x\n", prefix, condition); + swf_DumpActions(actions, prefix); + } + + swf_SetTagPos(tag,oldTagPos); + return; +} + +void dumpButtonActions(TAG*tag, char*prefix) +{ + ActionTAG*actions; + swf_SetTagPos(tag, 0); + swf_GetU16(tag); // id + while (swf_GetU8(tag)) // state -> parse ButtonRecord + { swf_GetU16(tag); // id + swf_GetU16(tag); // layer + swf_GetMatrix(tag,NULL); // matrix + } + actions = swf_ActionGet(tag); + swf_DumpActions(actions, prefix); + swf_ActionFree(actions); +} + +void dumpButton(TAG*tag, char*prefix) +{ + swf_SetTagPos(tag, 0); + swf_GetU16(tag); // id + while (1) { + U8 flags = swf_GetU8(tag); + if(!flags) + break; + U16 id = swf_GetU16(tag); + U16 depth = swf_GetU16(tag); + char event[80]; + sprintf(event, "%s%s%s%s", + (flags&BS_HIT)?"[hit]":"", + (flags&BS_DOWN)?"[down]":"", + (flags&BS_OVER)?"[over]":"", + (flags&BS_UP)?"[up]":""); + if(flags&0xf0) { + printf("%s | Show %d at depth %d for %s flags=%02x\n", prefix, id, depth, event, flags); + } else { + printf("%s | Show %d at depth %d for %s\n", prefix, id, depth, event); + } + swf_GetMatrix(tag,NULL); // matrix + } +} + +void dumpFont(TAG*tag, char*prefix) +{ + SWFFONT* font = malloc(sizeof(SWFFONT)); + memset(font, 0, sizeof(SWFFONT)); + if(tag->id == ST_DEFINEFONT2 || tag->id == ST_DEFINEFONT3) { + swf_FontExtract_DefineFont2(0, font, tag); + } else if(tag->id == ST_DEFINEFONT) { + swf_FontExtract_DefineFont(0, font, tag); + } else { + printf("%sCan't parse %s yet\n", prefix,swf_TagGetName(tag)); + } + printf("%sID: %d\n", prefix,font->id); + printf("%sVersion: %d\n", prefix,font->version); + printf("%sname: %s\n", prefix,font->name); + printf("%scharacters: %d\n", prefix,font->numchars); + printf("%shightest mapped unicode value: %d\n", prefix,font->maxascii); + if(font->layout) + { + printf("%sascent:%.2f\n", prefix,font->layout->ascent / 20.0); + printf("%sdescent:%.2f\n", prefix,font->layout->descent / 20.0); + printf("%sleading:%.2f\n", prefix,font->layout->leading / 20.0); + printf("%skerning records:%d\n", prefix,font->layout->kerningcount); + } + printf("%sstyle: %d\n", prefix,font->style); + printf("%sencoding: %02x\n", prefix,font->encoding); + printf("%slanguage: %02x\n", prefix,font->language); + int t; + for(t=0;tnumchars;t++) { + int u = font->glyph2ascii?font->glyph2ascii[t]:-1; + char ustr[16]; + if(u>=32) sprintf(ustr, " '%c'", u); + else sprintf(ustr, " 0x%02x", u); + printf("%s== Glyph %d: advance=%d encoding=%d%s ==\n", prefix, t, font->glyph[t].advance, u, ustr); + SHAPE2* shape = swf_ShapeToShape2(font->glyph[t].shape); + SHAPELINE*line = shape->lines; + + while(line) { + if(line->type == moveTo) { + printf("%smoveTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); + } else if(line->type == lineTo) { + printf("%slineTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); + } else if(line->type == splineTo) { + printf("%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, + line->sx/20.0, line->sy/20.0, + line->x/20.0, line->y/20.0 + ); + } + line = line->next; + } + swf_Shape2Free(shape); + free(shape); + } + + /* + not part of the file + + printf("%sencoding table:", prefix, prefix); + char filled0=0, lastfilled=0; + for(t=0;tmaxascii;t++) { + if((t&15)==0) { + printf("\n%s%08x ", prefix, t); + int s; + if(!filled0 && t) { + for(s=t;smaxascii;s++) { + if(font->ascii2glyph[s]>=0) break; + } + if(s>t+32) { + printf("*"); + t = ((s-16)&~15)-1; + continue; + } + } + filled0 = 0; + for(s=t;smaxascii;s++) { + if(font->ascii2glyph[s]>=0) filled0=1; + } + } + printf("%4d ", font->ascii2glyph[t]); + } + printf("\n");*/ + + swf_FontFree(font); +} + +static SWF swf; +static int fontnum = 0; +static SWFFONT**fonts; + +void textcallback(void*self, int*glyphs, int*xpos, int nr, int fontid, int fontsize, int startx, int starty, RGBA*color) +{ + int font=-1,t; + if(nr<1) + return; + printf(" <%2d glyphs in font %04d size %d, color #%02x%02x%02x%02x at %.2f,%.2f> ",nr, fontid, fontsize, color->r, color->g, color->b, color->a, (startx+xpos[0])/20.0, starty/20.0); + for(t=0;tid == fontid) { + font = t; + break; + } + } + + for(t=0;t=0) { + if(glyphs[t] >= fonts[font]->numchars /*glyph is in range*/ + || !fonts[font]->glyph2ascii /* font has ascii<->glyph mapping */ + ) a = glyphs[t]; + else { + if(fonts[font]->glyph2ascii[glyphs[t]]) + a = fonts[font]->glyph2ascii[glyphs[t]]; + else + a = glyphs[t]; + } + } else { + a = glyphs[t]; + } + + printf("\\x%02x", fonts[font]->glyph2ascii[glyphs[t]]); + } + printf("\n"); +} + +void handleText(TAG*tag, char*prefix) +{ + printf("\n"); + if(placements) { + swf_SetTagPos(tag, 0); + swf_GetU16(tag); + swf_GetRect(tag, 0); + swf_ResetReadBits(tag); + MATRIX m; + swf_GetMatrix(tag, &m); + printf("%s| Matrix\n",prefix); + printf("%s| %5.3f %5.3f %6.2f\n", prefix, m.sx/65536.0, m.r1/65536.0, m.tx/20.0); + printf("%s| %5.3f %5.3f %6.2f\n", prefix, m.r0/65536.0, m.sy/65536.0, m.ty/20.0); + swf_SetTagPos(tag, 0); + } + if(showtext) { + swf_ParseDefineText(tag,textcallback, 0); + } +} + +void handleDefineSound(TAG*tag) +{ + U16 id = swf_GetU16(tag); + U8 flags = swf_GetU8(tag); + int compression = (flags>>4)&7; + int rate = (flags>>2)&3; + int bits = flags&2?16:8; + int stereo = flags&1; + printf(" ("); + if(compression == 0) printf("Raw "); + else if(compression == 1) printf("ADPCM "); + else if(compression == 2) printf("MP3 "); + else if(compression == 3) printf("Raw little-endian "); + else if(compression == 6) printf("ASAO "); + else printf("? "); + if(rate == 0) printf("5.5Khz "); + if(rate == 1) printf("11Khz "); + if(rate == 2) printf("22Khz "); + if(rate == 3) printf("44Khz "); + printf("%dBit ", bits); + if(stereo) printf("stereo"); + else printf("mono"); + printf(")"); +} + +void handleDefineBits(TAG*tag) +{ + U16 id; + U8 mode; + U16 width,height; + int bpp; + id = swf_GetU16(tag); + mode = swf_GetU8(tag); + width = swf_GetU16(tag); + height = swf_GetU16(tag); + printf(" image %dx%d",width,height); + if(mode == 3) printf(" (8 bpp)"); + else if(mode == 4) printf(" (16 bpp)"); + else if(mode == 5) printf(" (32 bpp)"); + else printf(" (? bpp)"); +} + +void handleEditText(TAG*tag) +{ + U16 id ; + U16 flags; + int t; + id = swf_GetU16(tag); + swf_GetRect(tag,0); + + //swf_ResetReadBits(tag); + + if (tag->readBit) + { tag->pos++; + tag->readBit = 0; + } + flags = swf_GetBits(tag,16); + if(flags & ET_HASFONT) { + swf_GetU16(tag); //font + swf_GetU16(tag); //fontheight + } + if(flags & ET_HASTEXTCOLOR) { + swf_GetU8(tag); //rgba + swf_GetU8(tag); + swf_GetU8(tag); + swf_GetU8(tag); + } + if(flags & ET_HASMAXLENGTH) { + swf_GetU16(tag); //maxlength + } + if(flags & ET_HASLAYOUT) { + swf_GetU8(tag); //align + swf_GetU16(tag); //left margin + swf_GetU16(tag); //right margin + swf_GetU16(tag); //indent + swf_GetU16(tag); //leading + } + printf(" variable \"%s\" ", &tag->data[tag->pos]); + if(flags & ET_HTML) printf("(html)"); + if(flags & ET_NOSELECT) printf("(noselect)"); + if(flags & ET_PASSWORD) printf("(password)"); + if(flags & ET_READONLY) printf("(readonly)"); + + if(flags & (ET_X1 | ET_X3 )) + { + printf(" undefined flags: %08x (%08x)", (flags&(ET_X1|ET_X3)), flags); + } + + while(tag->data[tag->pos++]); + if(flags & ET_HASTEXT) + // printf(" text \"%s\"\n", &tag->data[tag->pos]) //TODO + ; +} +void printhandlerflags(U32 handlerflags) +{ + if(handlerflags&1) printf("[on load]"); + if(handlerflags&2) printf("[enter frame]"); + if(handlerflags&4) printf("[unload]"); + if(handlerflags&8) printf("[mouse move]"); + if(handlerflags&16) printf("[mouse down]"); + if(handlerflags&32) printf("[mouse up]"); + if(handlerflags&64) printf("[key down]"); + if(handlerflags&128) printf("[key up]"); + + if(handlerflags&256) printf("[data]"); + if(handlerflags&512) printf("[initialize]"); + if(handlerflags&1024) printf("[mouse press]"); + if(handlerflags&2048) printf("[mouse release]"); + if(handlerflags&4096) printf("[mouse release outside]"); + if(handlerflags&8192) printf("[mouse rollover]"); + if(handlerflags&16384) printf("[mouse rollout]"); + if(handlerflags&32768) printf("[mouse drag over]"); + + if(handlerflags&0x10000) printf("[mouse drag out]"); + if(handlerflags&0x20000) printf("[key press]"); + if(handlerflags&0x40000) printf("[construct even]"); + if(handlerflags&0xfff80000) printf("[???]"); +} +void handleVideoStream(TAG*tag, char*prefix) +{ + U16 id = swf_GetU16(tag); + U16 frames = swf_GetU16(tag); + U16 width = swf_GetU16(tag); + U16 height = swf_GetU16(tag); + U8 flags = swf_GetU8(tag); //5-2(videopacket 01=off 10=on)-1(smoothing 1=on) + U8 codec = swf_GetU8(tag); + printf(" (%d frames, %dx%d", frames, width, height); + if(flags&1) + printf(" smoothed"); + if(codec == 2) + printf(" sorenson h.263)"); + else + printf(" codec 0x%02x)", codec); +} +void handleVideoFrame(TAG*tag, char*prefix) +{ + U32 code, version, reference, sizeflags; + U32 width=0, height=0; + U8 type; + U16 id = swf_GetU16(tag); + U16 frame = swf_GetU16(tag); + U8 deblock,flags, tmp, bit; + U32 quantizer; + char*types[] = {"I-frame", "P-frame", "disposable P-frame", ""}; + printf(" (frame %d) ", frame); + + /* video packet follows */ + code = swf_GetBits(tag, 17); + version = swf_GetBits(tag, 5); + reference = swf_GetBits(tag, 8); + + sizeflags = swf_GetBits(tag, 3); + switch(sizeflags) + { + case 0: width = swf_GetBits(tag, 8); height = swf_GetBits(tag, 8); break; + case 1: width = swf_GetBits(tag, 16); height = swf_GetBits(tag, 16); break; + case 2: width = 352; height = 288; break; + case 3: width = 176; height = 144; break; + case 4: width = 128; height = 96; break; + case 5: width = 320; height = 240; break; + case 6: width = 160; height = 120; break; + case 7: width = -1; height = -1;/*reserved*/ break; + } + printf("%dx%d ", width, height); + type = swf_GetBits(tag, 2); + printf("%s", types[type]); + + deblock = swf_GetBits(tag, 1); + if(deblock) + printf(" deblock %d ", deblock); + quantizer = swf_GetBits(tag, 5); + printf(" quant: %d ", quantizer); +} + +void dumpFilter(FILTER*filter) +{ + if(filter->type == FILTERTYPE_BLUR) { + FILTER_BLUR*f = (FILTER_BLUR*)filter; + printf("blurx: %f blury: %f\n", f->blurx, f->blury); + printf("passes: %d\n", f->passes); + } if(filter->type == FILTERTYPE_GLOW) { + FILTER_GLOW*f = (FILTER_GLOW*)filter; + printf("color %02x%02x%02x%02x\n", f->rgba.r,f->rgba.g,f->rgba.b,f->rgba.a); + printf("blurx: %f blury: %f strength: %f\n", f->blurx, f->blury, f->strength); + printf("passes: %d\n", f->passes); + printf("flags: %s%s%s\n", + f->knockout?"knockout ":"", + f->composite?"composite ":"", + f->innerglow?"innerglow":""); + } if(filter->type == FILTERTYPE_DROPSHADOW) { + FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter; + printf("blurx: %f blury: %f\n", f->blurx, f->blury); + printf("passes: %d\n", f->passes); + printf("angle: %f distance: %f\n", f->angle, f->distance); + printf("strength: %f passes: %d\n", f->strength, f->passes); + printf("flags: %s%s%s\n", + f->knockout?"knockout ":"", + f->composite?"composite ":"", + f->innershadow?"innershadow ":""); + } if(filter->type == FILTERTYPE_BEVEL) { + FILTER_BEVEL*f = (FILTER_BEVEL*)filter; + printf("blurx: %f blury: %f\n", f->blurx, f->blury); + printf("passes: %d\n", f->passes); + printf("angle: %f distance: %f\n", f->angle, f->distance); + printf("strength: %f passes: %d\n", f->strength, f->passes); + printf("flags: %s%s%s%s\n", + f->ontop?"ontop":"", + f->knockout?"knockout ":"", + f->composite?"composite ":"", + f->innershadow?"innershadow ":""); + } if(filter->type == FILTERTYPE_GRADIENTGLOW) { + FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter; + swf_DumpGradient(stdout, f->gradient); + printf("blurx: %f blury: %f\n", f->blurx, f->blury); + printf("angle: %f distance: %f\n", f->angle, f->distance); + printf("strength: %f passes: %d\n", f->strength, f->passes); + printf("flags: %s%s%s%s\n", + f->knockout?"knockout ":"", + f->ontop?"ontop ":"", + f->composite?"composite ":"", + f->innershadow?"innershadow ":""); + } + rfx_free(filter); +} + +void handlePlaceObject23(TAG*tag, char*prefix) +{ + U8 flags,flags2=0; + MATRIX m; + CXFORM cx; + char pstr[3][256]; + int ppos[3] = {0,0,0}; + swf_SetTagPos(tag, 0); + flags = swf_GetU8(tag); + if(tag->id == ST_PLACEOBJECT3) + flags2 = swf_GetU8(tag); + swf_GetU16(tag); //depth + + //flags&1: move + if(flags&2) swf_GetU16(tag); //id + if(flags&4) { + swf_GetMatrix(tag,&m); + if(placements) { + ppos[0] += sprintf(pstr[0], "| Matrix "); + ppos[1] += sprintf(pstr[1], "| %5.3f %5.3f %6.2f ", m.sx/65536.0, m.r1/65536.0, m.tx/20.0); + ppos[2] += sprintf(pstr[2], "| %5.3f %5.3f %6.2f ", m.r0/65536.0, m.sy/65536.0, m.ty/20.0); + } + } + if(flags&8) { + swf_GetCXForm(tag, &cx, 1); + if(placements) { + ppos[0] += sprintf(pstr[0]+ppos[0], "| CXForm r g b a "); + ppos[1] += sprintf(pstr[1]+ppos[1], "| mul %4.1f %4.1f %4.1f %4.1f ", cx.r0/256.0, cx.g0/256.0, cx.b0/256.0, cx.a0/256.0); + ppos[2] += sprintf(pstr[2]+ppos[2], "| add %4d %4d %4d %4d ", cx.r1, cx.g1, cx.b1, cx.a1); + } + } + if(flags&16) { + U16 ratio = swf_GetU16(tag); //ratio + if(placements) { + ppos[0] += sprintf(pstr[0]+ppos[0], "| Ratio "); + ppos[1] += sprintf(pstr[1]+ppos[1], "| %-5d ", ratio); + ppos[2] += sprintf(pstr[2]+ppos[2], "| "); + } + } + if(flags&64) { + U16 clip = swf_GetU16(tag); //clip + if(placements) { + ppos[0] += sprintf(pstr[0]+ppos[0], "| Clip "); + ppos[1] += sprintf(pstr[1]+ppos[1], "| %-4d ", clip); + ppos[2] += sprintf(pstr[2]+ppos[2], "| "); + } + } + if(flags&32) { while(swf_GetU8(tag)); } + + if(flags2&1) { // filter list + U8 num = swf_GetU8(tag); + if(placements) + printf("\n%d filters\n", num); + char*filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel"}; + int t; + for(t=0;ttype, (filter->typetype]:"?"); + dumpFilter(filter); + } + } + } + if(flags2&2) { // blend mode + U8 blendmode = swf_GetU8(tag); + if(placements) { + int t; + char name[80]; + sprintf(name, "%-5d", blendmode); + for(t=0;blendModeNames[t];t++) { + if(blendmode==t) { + sprintf(name, "%-5s", blendModeNames[t]); + break; + } + } + ppos[0] += sprintf(pstr[0]+ppos[0], "| Blend "); + ppos[1] += sprintf(pstr[1]+ppos[1], "| %s ", name); + ppos[2] += sprintf(pstr[2]+ppos[2], "| "); + } + } + + if(placements && ppos[0]) { + printf("\n"); + printf("%s %s\n", prefix, pstr[0]); + printf("%s %s\n", prefix, pstr[1]); + printf("%s %s", prefix, pstr[2]); + } + if(flags&128) { + if (action) { + U16 reserved; + U32 globalflags; + U32 handlerflags; + char is32 = 0; + printf("\n"); + reserved = swf_GetU16(tag); // must be 0 + globalflags = swf_GetU16(tag); //TODO: 32 if version>=6 + if(reserved) { + printf("Unknown parameter field not zero: %04x\n", reserved); + return; + } + printf("global flags: %04x\n", globalflags); + + handlerflags = swf_GetU16(tag); //TODO: 32 if version>=6 + if(!handlerflags) { + handlerflags = swf_GetU32(tag); + is32 = 1; + } + while(handlerflags) { + int length; + int t; + ActionTAG*a; + + globalflags &= ~handlerflags; + printf("%s flags %08x ",prefix, handlerflags); + printhandlerflags(handlerflags); + length = swf_GetU32(tag); + printf(", %d bytes actioncode\n",length); + a = swf_ActionGet(tag); + swf_DumpActions(a,prefix); + swf_ActionFree(a); + + handlerflags = is32?swf_GetU32(tag):swf_GetU16(tag); //TODO: 32 if version>=6 + } + if(globalflags) // should go to sterr. + printf("ERROR: unsatisfied handlerflags: %02x\n", globalflags); + } else { + printf(" has action code\n"); + } + } else printf("\n"); +} + +void handlePlaceObject(TAG*tag, char*prefix) +{ + TAG*tag2 = swf_InsertTag(0, ST_PLACEOBJECT2); + U16 id, depth; + MATRIX matrix; + CXFORM cxform; + + swf_SetTagPos(tag, 0); + id = swf_GetU16(tag); + depth = swf_GetU16(tag); + swf_GetMatrix(tag, &matrix); + swf_GetCXForm(tag, &cxform, 0); + + swf_SetU8(tag2, 14 /* char, matrix, cxform */); + swf_SetU16(tag2, depth); + swf_SetU16(tag2, id); + swf_SetMatrix(tag2, &matrix); + swf_SetCXForm(tag2, &cxform, 1); + + handlePlaceObject23(tag2, prefix); +} +char stylebuf[256]; +char* fillstyle2str(FILLSTYLE*style) +{ + switch(style->type) { + case 0x00: + sprintf(stylebuf, "SOLID %02x%02x%02x%02x", style->color.r, style->color.g, style->color.b, style->color.a); + break; + case 0x10: case 0x11: case 0x12: case 0x13: + sprintf(stylebuf, "GRADIENT (%d steps)", style->gradient.num); + break; + case 0x40: case 0x42: + /* TODO: display information about that bitmap */ + sprintf(stylebuf, "BITMAPt%s %d", (style->type&2)?"n":"", style->id_bitmap); + /* TODO: show matrix */ + //swf_DumpMatrix(stdout, &style->m); + break; + case 0x41: case 0x43: + /* TODO: display information about that bitmap */ + sprintf(stylebuf, "BITMAPc%s %d", (style->type&2)?"n":"", style->id_bitmap); + /* TODO: show matrix */ + //swf_DumpMatrix(stdout, &style->m); + break; + default: + sprintf(stylebuf, "UNKNOWN[%02x]",style->type); + } + return stylebuf; +} +char* linestyle2str(LINESTYLE*style) +{ + sprintf(stylebuf, "%.2f %02x%02x%02x%02x", style->width/20.0, style->color.r, style->color.g, style->color.b, style->color.a); + return stylebuf; +} + +void handleShape(TAG*tag, char*prefix) +{ + SHAPE2 shape; + SHAPELINE*line; + int t,max; + + tag->pos = 0; + tag->readBit = 0; + swf_ParseDefineShape(tag, &shape); + + max = shape.numlinestyles > shape.numfillstyles?shape.numlinestyles:shape.numfillstyles; + + if(max) printf("%s | fillstyles(%02d) linestyles(%02d)\n", + prefix, + shape.numfillstyles, + shape.numlinestyles + ); + else printf("%s | (Neither line nor fill styles)\n", prefix); + + for(t=0;tfillstyle0, + line->fillstyle1, + line->linestyle); + if(line->type == moveTo) { + printf("moveTo %.2f %.2f\n", line->x/20.0, line->y/20.0); + } else if(line->type == lineTo) { + printf("lineTo %.2f %.2f\n", line->x/20.0, line->y/20.0); + } else if(line->type == splineTo) { + printf("splineTo (%.2f %.2f) %.2f %.2f\n", + line->sx/20.0, line->sy/20.0, + line->x/20.0, line->y/20.0 + ); + } + line = line->next; + } + printf("%s |\n", prefix); +} + +void fontcallback1(void*self, U16 id,U8 * name) +{ fontnum++; +} + +void fontcallback2(void*self, U16 id,U8 * name) +{ + swf_FontExtract(&swf,id,&fonts[fontnum]); + fontnum++; +} + +static U8 printable(U8 a) +{ + if(a<32 || a==127) return '.'; + else return a; +} +void hexdumpTag(TAG*tag, char* prefix) +{ + int t; + char ascii[32]; + printf(" %s-=> ",prefix); + for(t=0;tlen;t++) { + printf("%02x ", tag->data[t]); + ascii[t&15] = printable(tag->data[t]); + if((t && ((t&15)==15)) || (t==tag->len-1)) + { + int s,p=((t)&15)+1; + ascii[p] = 0; + for(s=p-1;s<16;s++) { + printf(" "); + } + if(t==tag->len-1) + printf(" %s\n", ascii); + else + printf(" %s\n %s-=> ",ascii,prefix); + } + } +} + +void handleExportAssets(TAG*tag, char* prefix) +{ + int num; + U16 id; + char* name; + int t; + num = swf_GetU16(tag); + for(t=0;tpos < tag->len) { + int nr = swf_GetU8(tag); // should be 2 + int t; + if(nr>2) { + printf("*** unsupported multiboxes ***, "); + break; + } + for(t=0;tprev) swf.firstTag = swf.firstTag->prev; + SWFFONT* font = 0; + swf_FontExtract(&swf, id, &font); +#endif + swf_SetTagPos(tag, 3); + while(tag->pos < tag->len) { + printf("%sglyph %d) ", prefix, num); + int nr = swf_GetU8(tag); // should be 2 + int t; + for(t=0;t<2;t++) { + // pos + float v = swf_GetF16(tag); + printf("%f ", v*1024.0); + } + int s; + for(s=0;snumchars) { + SHAPE2* shape = swf_ShapeToShape2(font->glyph[num].shape); + SHAPELINE*line = shape->lines; + while(line) { + if(line->type == moveTo) { + printf("%smoveTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); + } else if(line->type == lineTo) { + printf("%slineTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); + } else if(line->type == splineTo) { + printf("%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, + line->sx/20.0, line->sy/20.0, + line->x/20.0, line->y/20.0 + ); + } + line = line->next; + } + swf_Shape2Free(shape); + free(shape); + } + if(num==font->numchars-1) break; +#endif + num++; + } +} + + +void dumperror(const char* format, ...) +{ + char buf[1024]; + va_list arglist; + + va_start(arglist, format); + vsnprintf(buf, sizeof(buf)-1, format, arglist); + va_end(arglist); + + if(!html && !xy) + printf("==== Error: %s ====\n", buf); +} + +static char strbuf[800]; +static int bufpos=0; + +char* timestring(double f) +{ + int hours = (int)(f/3600); + int minutes = (int)((f-hours*3600)/60); + int seconds = (int)((f-hours*3600-minutes*60)); + int useconds = (int)((f-(int)f)*1000+0.5); + bufpos+=100; + bufpos%=800; + sprintf(&strbuf[bufpos], "%02d:%02d:%02d,%03d",hours,minutes,seconds,useconds); + return &strbuf[bufpos]; +} + +int main (int argc,char ** argv) +{ + TAG*tag; +#ifdef HAVE_STAT + struct stat statbuf; +#endif + int f; + int xsize,ysize; + char issprite = 0; // are we inside a sprite definition? + int spriteframe = 0; + int mainframe=0; + char* spriteframelabel = 0; + char* framelabel = 0; + char prefix[128]; + int filesize = 0; + int filepos = 0; + prefix[0] = 0; + memset(idtab,0,65536); + + processargs(argc, argv); + + if(!filename) + { + fprintf(stderr, "You must supply a filename.\n"); + return 1; + } + + f = open(filename,O_RDONLY|O_BINARY); + if (f<0) + { + char buffer[256]; + sprintf(buffer, "Couldn't open %.200s", filename); + perror(buffer); + exit(1); + } + char header[3]; + read(f, header, 3); + char compressed = (header[0]=='C'); + char isflash = (header[0]=='F' && header[1] == 'W' && header[2] == 'S') || + (header[0]=='C' && header[1] == 'W' && header[2] == 'S'); + close(f); + + int fl=strlen(filename); + if(!isflash && fl>3 && !strcmp(&filename[fl-4], ".abc")) { + swf_ReadABCfile(filename, &swf); + } else { + f = open(filename,O_RDONLY|O_BINARY); + if FAILED(swf_ReadSWF(f,&swf)) + { + fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); + close(f); + exit(1); + } + +#ifdef HAVE_STAT + fstat(f, &statbuf); + if(statbuf.st_size != swf.fileSize && !compressed) + dumperror("Real Filesize (%d) doesn't match header Filesize (%d)", + statbuf.st_size, swf.fileSize); + filesize = statbuf.st_size; +#endif + close(f); + } + + //if(action && swf.fileVersion>=9) { + // fprintf(stderr, "Actionscript parsing (-a) not yet supported for SWF versions>=9\n"); + // action = 0; + //} + + xsize = (swf.movieSize.xmax-swf.movieSize.xmin)/20; + ysize = (swf.movieSize.ymax-swf.movieSize.ymin)/20; + if(xy) + { + if(xy&1) + printf("-X %d", xsize); + + if((xy&1) && (xy&6)) + printf(" "); + + if(xy&2) + printf("-Y %d", ysize); + + if((xy&3) && (xy&4)) + printf(" "); + + if(xy&4) + printf("-r %.2f", swf.frameRate/256.0); + + if((xy&7) && (xy&8)) + printf(" "); + + if(xy&8) + printf("-f %d", swf.frameCount); + + printf("\n"); + return 0; + } + if(html) + { + char*fileversions[] = {"","1,0,0,0", "2,0,0,0","3,0,0,0","4,0,0,0", + "5,0,0,0","6,0,23,0","7,0,0,0","8,0,0,0","9,0,0,0","10,0,0,0", "11,0,0,0", "12,0,0,0"}; + if(swf.fileVersion>10) { + fprintf(stderr, "Fileversion>10\n"); + exit(1); + } + + if(xhtml) { + printf("\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n\n", filename, xsize, ysize, filename); + } else { + printf("\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n", xsize, ysize, fileversions[swf.fileVersion], + filename, filename, xsize, ysize); + } + return 0; + } + printf("[HEADER] File version: %d\n", swf.fileVersion); + if(compressed) { + printf("[HEADER] File is zlib compressed."); + if(filesize && swf.fileSize) + printf(" Ratio: %02d%%\n", filesize*100/(swf.fileSize)); + else + printf("\n"); + } + printf("[HEADER] File size: %d%s\n", swf.fileSize, swf.compressed?" (Depacked)":""); + printf("[HEADER] Frame rate: %f\n",swf.frameRate/256.0); + printf("[HEADER] Frame count: %d\n",swf.frameCount); + printf("[HEADER] Movie width: %.2f",(swf.movieSize.xmax-swf.movieSize.xmin)/20.0); + if(swf.movieSize.xmin) + printf(" (left offset: %.2f)\n", swf.movieSize.xmin/20.0); + else + printf("\n"); + printf("[HEADER] Movie height: %.2f",(swf.movieSize.ymax-swf.movieSize.ymin)/20.0); + if(swf.movieSize.ymin) + printf(" (top offset: %.2f)\n", swf.movieSize.ymin/20.0); + else + printf("\n"); + + tag = swf.firstTag; + + if(showtext) { + fontnum = 0; + swf_FontEnumerate(&swf,&fontcallback1, 0); + fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); + fontnum = 0; + swf_FontEnumerate(&swf,&fontcallback2, 0); + } + + while(tag) { + char*name = swf_TagGetName(tag); + char myprefix[128]; + if(!name) { + dumperror("Unknown tag:0x%03x", tag->id); + //tag = tag->next; + //continue; + } + if(!name) { + name = "UNKNOWN TAG"; + } + if(cumulative) { + filepos += tag->len; + printf("[%03x] %9d %9d %s%s", tag->id, tag->len, filepos, prefix, swf_TagGetName(tag)); + } else { + printf("[%03x] %9d %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag)); + } + + if(tag->id == ST_PLACEOBJECT) { + printf(" places id %04d at depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag)); + if(swf_GetName(tag)) + printf(" name \"%s\"",swf_GetName(tag)); + } + else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { + if(tag->data[0]&1) + printf(" moves"); + else + printf(" places"); + + if(tag->data[0]&2) + printf(" id %04d",swf_GetPlaceID(tag)); + else + printf(" object"); + + printf(" at depth %04d", swf_GetDepth(tag)); + + if(tag->id == ST_PLACEOBJECT3 && tag->data[1]&4) + printf(" as bitmap"); + + swf_SetTagPos(tag, 0); + if(tag->data[0]&64) { + SWFPLACEOBJECT po; + swf_GetPlaceObject(tag, &po); + printf(" (clip to %04d)", po.clipdepth); + swf_PlaceObjectFree(&po); + } + if(swf_GetName(tag)) + printf(" name \"%s\"",swf_GetName(tag)); + + } + else if(tag->id == ST_REMOVEOBJECT) { + printf(" removes id %04d from depth %04d", swf_GetPlaceID(tag), swf_GetDepth(tag)); + } + else if(tag->id == ST_REMOVEOBJECT2) { + printf(" removes object from depth %04d", swf_GetDepth(tag)); + } + else if(tag->id == ST_FREECHARACTER) { + printf(" frees object %04d", swf_GetPlaceID(tag)); + } + else if(tag->id == ST_FILEATTRIBUTES) { + swf_SetTagPos(tag, 0); + U32 flags = swf_GetU32(tag); + if(flags&FILEATTRIBUTE_USENETWORK) printf(" usenetwork"); + if(flags&FILEATTRIBUTE_AS3) printf(" as3"); + if(flags&FILEATTRIBUTE_SYMBOLCLASS) printf(" symbolclass"); + if(flags&FILEATTRIBUTE_USEHARDWAREGPU) printf(" hardware-gpu"); + if(flags&FILEATTRIBUTE_USEACCELERATEDBLIT) printf(" accelerated-blit"); + if(flags&~(1|8|16|32|64)) + printf(" flags=%02x", flags); + } + else if(tag->id == ST_DOABC) { + swf_SetTagPos(tag, 0); + U32 flags = swf_GetU32(tag); + char*s = swf_GetString(tag); + if(flags&~1) { + printf(" flags=%08x", flags); + } + if(*s) { + printf(" \"%s\"", s); + } + if(flags&1) { + if(name) + printf(","); + printf(" lazy load"); + } + swf_SetTagPos(tag, 0); + } + else if(tag->id == ST_STARTSOUND) { + U8 flags; + U16 id; + id = swf_GetU16(tag); + flags = swf_GetU8(tag); + if(flags & 32) + printf(" stops sound with id %04d", id); + else + printf(" starts sound with id %04d", id); + if(flags & 16) + printf(" (if not already playing)"); + if(flags & 1) + swf_GetU32(tag); + if(flags & 2) + swf_GetU32(tag); + if(flags & 4) { + printf(" looping %d times", swf_GetU16(tag)); + } + } + else if(tag->id == ST_FRAMELABEL) { + int l = strlen((char*)tag->data); + printf(" \"%s\"", tag->data); + if((l+1) < tag->len) { + printf(" has %d extra bytes", tag->len-1-l); + if(tag ->len - (l+1) == 1 && tag->data[tag->len-1] == 1) + printf(" (ANCHOR)"); + } + if((framelabel && !issprite) || + (spriteframelabel && issprite)) { + dumperror("Frame %d has more than one label", + issprite?spriteframe:mainframe); + } + if(issprite) spriteframelabel = (char*)tag->data; + else framelabel = (char*)tag->data; + } + else if(tag->id == ST_SHOWFRAME) { + char*label = issprite?spriteframelabel:framelabel; + int frame = issprite?spriteframe:mainframe; + int nframe = frame; + if(!label) { + while(tag->next && tag->next->id == ST_SHOWFRAME && tag->next->len == 0) { + tag = tag->next; + if(issprite) spriteframe++; + else mainframe++; + nframe++; + } + } + if(nframe == frame) + printf(" %d (%s)", frame+1, timestring(frame*(256.0/(swf.frameRate+0.1)))); + else + printf(" %d-%d (%s-%s)", frame+1, nframe+1, + timestring(frame*(256.0/(swf.frameRate+0.1))), + timestring(nframe*(256.0/(swf.frameRate+0.1))) + ); + if(label) + printf(" (label \"%s\")", label); + if(issprite) {spriteframe++; spriteframelabel = 0;} + if(!issprite) {mainframe++; framelabel = 0;} + } + else if(tag->id == ST_SETBACKGROUNDCOLOR) { + U8 r = swf_GetU8(tag); + U8 g = swf_GetU8(tag); + U8 b = swf_GetU8(tag); + printf(" (%02x/%02x/%02x)",r,g,b); + } + else if(tag->id == ST_PROTECT) { + if(tag->len>0) { + printf(" %s", swf_GetString(tag)); + } + } + else if(tag->id == ST_DEFINEFONTALIGNZONES) { + handleFontAlign1(tag); + } + else if(tag->id == ST_CSMTEXTSETTINGS) { + U16 id = swf_GetU16(tag); + U8 flags = swf_GetU8(tag); + printf(" ("); + if(flags&0x40) { + printf("flashtype,"); + } + switch(((flags>>3)&7)) { + case 0:printf("no grid,");break; + case 1:printf("pixel grid,");break; + case 2:printf("subpixel grid,");break; + case 3:printf("unknown grid,");break; + } + if(flags&0x87) + printf("unknown[%08x],", flags); + float thickness = swf_GetFixed(tag); + float sharpness = swf_GetFixed(tag); + printf("s=%.2f,t=%.2f)", thickness, sharpness); + swf_GetU8(tag); + } + else if(swf_isDefiningTag(tag)) { + U16 id = swf_GetDefineID(tag); + printf(" defines id %04d", id); + if(idtab[id]) + dumperror("Id %04d is defined more than once.", id); + idtab[id] = 1; + } + else if(swf_isPseudoDefiningTag(tag)) { + U16 id = swf_GetDefineID(tag); + printf(" adds information to id %04d", id); + if(!idtab[id]) + dumperror("Id %04d is not yet defined.\n", id); + } + + if(tag->id == ST_DEFINEBITSLOSSLESS || + tag->id == ST_DEFINEBITSLOSSLESS2) { + handleDefineBits(tag); + printf("\n"); + } + else if(tag->id == ST_DEFINESOUND) { + handleDefineSound(tag); + printf("\n"); + } + else if(tag->id == ST_VIDEOFRAME) { + handleVideoFrame(tag, myprefix); + printf("\n"); + } + else if(tag->id == ST_DEFINEVIDEOSTREAM) { + handleVideoStream(tag, myprefix); + printf("\n"); + } + else if(tag->id == ST_DEFINEEDITTEXT) { + handleEditText(tag); + printf("\n"); + } + else if(tag->id == ST_DEFINEMOVIE) { + U16 id = swf_GetU16(tag); + char*s = swf_GetString(tag); + printf(" URL: %s\n", s); + } + else if(tag->id == ST_DEFINETEXT || tag->id == ST_DEFINETEXT2) { + handleText(tag, myprefix); + } + else if(tag->id == ST_DEFINESCALINGGRID) { + U16 id = swf_GetU16(tag); + SRECT r; + swf_GetRect(tag, &r); + printf(" (%.2f,%.2f)-(%.2f,%.2f)\n", r.xmin/20.0, r.ymin/20.0, r.xmax/20.0, r.ymax/20.0); + } + else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { + } + else if(tag->id == ST_NAMECHARACTER || tag->id==ST_DEFINEFONTNAME) { + swf_GetU16(tag); + printf(" \"%s\"\n", swf_GetString(tag)); + } + else { + printf("\n"); + } + + if(bbox && swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) { + SRECT r = swf_GetDefineBBox(tag); + printf(" %s bbox [%.2f, %.2f, %.2f, %.2f]\n", prefix, + r.xmin/20.0, + r.ymin/20.0, + r.xmax/20.0, + r.ymax/20.0); + } + + sprintf(myprefix, " %s", prefix); + + if(tag->id == ST_DEFINESPRITE) { + sprintf(prefix, " "); + if(issprite) { + dumperror("Sprite definition inside a sprite definition"); + } + issprite = 1; + spriteframe = 0; + spriteframelabel = 0; + } + else if(tag->id == ST_END) { + *prefix = 0; + issprite = 0; + spriteframelabel = 0; + if(tag->len) + dumperror("End Tag not empty"); + } + else if(tag->id == ST_EXPORTASSETS || tag->id == ST_SYMBOLCLASS) { + handleExportAssets(tag, myprefix); + } + else if(tag->id == ST_DOACTION && action) { + ActionTAG*actions; + actions = swf_ActionGet(tag); + swf_DumpActions(actions, myprefix); + } + else if((tag->id == ST_DOABC || tag->id == ST_RAWABC) && action) { + void*abccode = swf_ReadABC(tag); + swf_DumpABC(stdout, abccode, ""); + swf_FreeABC(abccode); + } + else if(tag->id == ST_DOINITACTION && action) { + ActionTAG*actions; + swf_GetU16(tag); // id + actions = swf_ActionGet(tag); + swf_DumpActions(actions, myprefix); + } + else if(tag->id == ST_DEFINEBUTTON) { + if(showbuttons) { + dumpButton(tag, myprefix); + } + if(action) { + dumpButtonActions(tag, myprefix); + } + } + else if(swf_isFontTag(tag) && showfonts) { + dumpFont(tag, myprefix); + } + else if(tag->id == ST_DEFINEBUTTON2) { + if(action) { + dumpButton2Actions(tag, myprefix); + } + } + else if(tag->id == ST_PLACEOBJECT) { + handlePlaceObject(tag, myprefix); + } + else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { + handlePlaceObject23(tag, myprefix); + } + else if(tag->id == ST_DEFINEFONTALIGNZONES) { + handleFontAlign2(tag, myprefix); + } + else if(tag->id == ST_DEFINEFONTNAME) { + swf_SetTagPos(tag, 0); + swf_GetU16(tag); //id + swf_GetString(tag); //name + char* copyright = swf_GetString(tag); + printf("%s%s\n", myprefix, copyright); + } + else if(tag->id == ST_DEFINESHAPE || + tag->id == ST_DEFINESHAPE2 || + tag->id == ST_DEFINESHAPE3 || + tag->id == ST_DEFINESHAPE4) { + if(showshapes) + handleShape(tag, myprefix); + } + + if(tag->len && used) { + int num = swf_GetNumUsedIDs(tag); + int* used; + int t; + if(num) { + used = (int*)malloc(sizeof(int)*num); + swf_GetUsedIDs(tag, used); + printf("%s%suses IDs: ", indent, prefix); + for(t=0;tid == ST_FREECHARACTER) { + U16 id; + swf_SetTagPos(tag, 0); + id = swf_GetU16(tag); + idtab[id] = 0; + } + + if(tag->len && hex) { + hexdumpTag(tag, prefix); + } + tag = tag->next; + fflush(stdout); + } + + swf_FreeTags(&swf); + return 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfextract b/fluidbook/tools/swftools-special-swfdump/src/swfextract new file mode 100644 index 000000000..d3e91b20b Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfextract differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfextract.1 b/fluidbook/tools/swftools-special-swfdump/src/swfextract.1 new file mode 100644 index 000000000..8fb04efce --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfextract.1 @@ -0,0 +1,61 @@ +.TH swfextract "1" "January 2003" "swfdump" "swftools" +.SH NAME +swfextract - a tool for extracting data out of swf files. +.SH Synopsis +.B swfextract +[\fIoptions\fR] [\fIfile.swf\fR] +.SH DESCRIPTION +swfextracts allows to extract swf movieclips and objects out of swf files. +.PP +SWF files are animation files which can be displayed in Web Browsers using +the Flash Plugin. +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Print short help message and exit +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR +Write output to file \fIfilename\fR +.TP +\fB\-V\fR, \fB\-\-version\fR +Print version info and exit +.TP +\fB\-i\fR, \fB\-\-id\fR \fIids\fR +\fIids\fR is a range of IDs to extract. E.g. 1-10,14 +.TP +\fB\-j\fR, \fB\-\-jpegs\fR \fIids\fR +\fIids\fR is a range of JPEG IDs to extract. E.g. 1-2,3,14- +.TP +\fB\-p\fR, \fB\-\-pngs\fR \fIids\fR +\fIids\fR is a range of PNG IDs to extract. E.g. -10,20-30 +.TP +\fB\-f\fR, \fB\-\-frame\fR \fIframes\fR +\fIframes\fR is a range of frames to extract. E.g. 1-10,20-30,40- +.TP +\fB\-n\fR, \fB\-\-name\fR \fIname\fR +Set the name of the object to extract to \fIname\fR. +.TP +\fB\-w\fR, \fB\-\-hollow\fR +Copy empty frames to the output file, too. +.TP +\fB\-P\fR, \fB\-\-placeobject\fR +Copy original placeobject tag for the given object into the +output file (Use with -i). This means that the object is +at the same position in the generated movie as in the +original movie. +.TP +\fB\-j\fR, \fB\-\-jpegs\fR \fIrange\fR +Extract jpeg pictures in \fIrange\fR +.TP +\fB\-p\fR, \fB\-\-pngs\fR \fIrange\fR +Extract png pictures in \fIrange\fR +.TP +\fB\-m\fR, \fB\-\-mp3\fR +Extract main mp3 stream (There may be substreams in the +Movieclips, as well. To extract these, first extract the +Movieclips with \fB-i\fR and then use \fB-m\fR) + +.SH AUTHOR + +Matthias Kramm + diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfextract.c b/fluidbook/tools/swftools-special-swfdump/src/swfextract.c new file mode 100644 index 000000000..4791124c1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfextract.c @@ -0,0 +1,1403 @@ +/* swfextract.c + Allows to extract parts of the swf into a new file. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" +#include "../lib/log.h" +#include "../lib/jpeg.h" +#include "../lib/png.h" +#ifdef HAVE_ZLIB_H +#ifdef HAVE_LIBZ +#include "zlib.h" +#define _ZLIB_INCLUDED_ +#endif +#endif + +char * filename = 0; +char * destfilename = "output.swf"; +int verbose = 3; + +char* extractids = 0; +char* extractframes = 0; +char* extractjpegids = 0; +char* extractfontids = 0; +char* extractpngids = 0; +char* extractsoundids = 0; +char* extractmp3ids = 0; +char* extractbinaryids = 0; +char* extractanyids = 0; +char extractmp3 = 0; + +char* extractname = 0; + +char hollow = 0; +char originalplaceobjects = 0; +char movetozero = 0; + +int numextracts = 0; +char *outputformat = NULL; + +struct options_t options[] = +{ + {"o","output"}, + {"w","hollow"}, + {"v","verbose"}, + {"i","id"}, + {"j","jpegs"}, + {"p","pngs"}, + {"a","any"}, + {"P","placeobject"}, + {"0","movetozero"}, + {"m","mp3"}, + {"M","embeddedmp3"}, + {"s","sound"}, + {"n","name"}, + {"f","frame"}, + {"F","font"}, + {"V","version"}, + {"b","binary"}, + {"O","outputformat"}, + {0,0} +}; + + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfextract - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "o")) { + destfilename = val; + return 1; + } + else if(!strcmp(name, "i")) { + extractids = val; + numextracts++; + if(extractname) { + fprintf(stderr, "You can only supply either name or id\n"); + exit(1); + } + return 1; + } + else if(!strcmp(name, "n")) { + extractname = val; + numextracts++; + if(extractids) { + fprintf(stderr, "You can only supply either name or id\n"); + exit(1); + } + return 1; + } + else if(!strcmp(name, "v")) { + verbose ++; + return 0; + } + else if(!strcmp(name, "m")) { + extractmp3 = 1; + numextracts++; + return 0; + } + else if(!strcmp(name, "M")) { + if(extractsoundids) { + fprintf(stderr, "Only one --embeddedmp3 argument is allowed. (Try to use a range, e.g. -M 1,2,3)\n"); + exit(1); + } + numextracts++; + extractmp3ids = val; + return 1; + } + else if(!strcmp(name, "j")) { + if(extractjpegids) { + fprintf(stderr, "Only one --jpegs argument is allowed. (Try to use a range, e.g. -j 1,2,3)\n"); + exit(1); + } + /* TODO: count number of IDs in val range */ + numextracts++; + extractjpegids = val; + return 1; + } + else if(!strcmp(name, "F")) { + if(extractfontids) { + fprintf(stderr, "Only one --font argument is allowed. (Try to use a range, e.g. -s 1,2,3)\n"); + exit(1); + } + numextracts++; + extractfontids = val; + return 1; + } + else if(!strcmp(name, "s")) { + if(extractsoundids) { + fprintf(stderr, "Only one --sound argument is allowed. (Try to use a range, e.g. -s 1,2,3)\n"); + exit(1); + } + numextracts++; + extractsoundids = val; + return 1; + } + else if(!strcmp(name, "b")) { + if(extractbinaryids) { + fprintf(stderr, "Only one --binary argument is allowed. (Try to use a range, e.g. -s 1,2,3)\n"); + exit(1); + } + numextracts++; + extractbinaryids = val; + return 1; + } +#ifdef _ZLIB_INCLUDED_ + else if(!strcmp(name, "p")) { + if(extractpngids) { + fprintf(stderr, "Only one --png argument is allowed. (Try to use a range, e.g. -p 1,2,3)\n"); + exit(1); + } + numextracts++; + extractpngids = val; + return 1; + } +#endif + else if(!strcmp(name, "a")) { + numextracts++; + extractanyids = val; + return 1; + } + else if(!strcmp(name, "f")) { + numextracts++; + extractframes = val; + return 1; + } + else if(!strcmp(name, "P")) { + originalplaceobjects = 1; + return 0; + } + else if(!strcmp(name, "0")) { + movetozero = 1; + return 0; + } + else if(!strcmp(name, "w")) { + hollow = 1; + return 0; + } + else if (!strcmp(name, "O")) { + outputformat = val; + return 1; + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char*name) +{ + printf("Usage: %s [-v] [-n name] [-ijf ids] file.swf\n", name); + printf("\t-v , --verbose\t\t\t Be more verbose\n"); + printf("\t-o , --output filename\t\t set output filename\n"); + printf("\t-V , --version\t\t\t Print program version and exit\n\n"); + printf("SWF Subelement extraction:\n"); + printf("\t-n , --name name\t\t instance name of the object (SWF Define) to extract\n"); + printf("\t-i , --id ID\t\t\t ID of the object, shape or movieclip to extract\n"); + printf("\t-f , --frame frames\t\t frame numbers to extract\n"); + printf("\t-w , --hollow\t\t\t hollow mode: don't remove empty frames\n"); + printf("\t \t\t\t (use with -f)\n"); + printf("\t-P , --placeobject\t\t\t Insert original placeobject into output file\n"); + printf("\t \t\t\t (use with -i)\n"); + printf("SWF Font/Text extraction:\n"); + printf("\t-F , --font ID\t\t\t Extract font(s)\n"); + printf("Picture extraction:\n"); + printf("\t-j , --jpeg ID\t\t\t Extract JPEG picture(s)\n"); +#ifdef _ZLIB_INCLUDED_ + printf("\t-p , --pngs ID\t\t\t Extract PNG picture(s)\n"); +#endif + printf("\n"); + printf("Sound extraction:\n"); + printf("\t-m , --mp3\t\t\t Extract main mp3 stream\n"); + printf("\t-M , --embeddedmp3\t\t\t Extract embedded mp3 stream(s)\n"); + printf("\t-s , --sound ID\t\t\t Extract Sound(s)\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +void prepare_name(char *buf, size_t len, const char *prefix, + const char *suffix, int idx) { + if (outputformat!=NULL) { + // override default file name formatting + // make sure single-file behavior is not used + numextracts = -1; + // Other parts of codebase use vsnprintf, so I assume snprintf + // is available on all platforms that swftools currently works on. + // We need to check for buffer overflows now that the user is + // supplying the format string. + snprintf(buf,len,outputformat,idx,suffix); + } else { + // use default file name formatting, unchanged + sprintf(buf,"%s%d.%s",prefix,idx,suffix); + } +} + +U8 mainr,maing,mainb; +/* 1 = used, not expanded, + 3 = used, expanded + 5 = wanted, not expanded + 7 = wanted, expanded + */ +char used[65536]; +TAG*tags[65536]; +int changed; +char * tagused; +int extractname_id = -1; + +void idcallback(void*data) +{ + if(!(used[GET16(data)]&1)) { + changed = 1; + used[GET16(data)] |= 1; + } +} + +void enumerateIDs(TAG*tag, void(*callback)(void*)) +{ +/* U8*data; + int len = tag->len; + if(tag->len>=64) { + len += 6; + data = (U8*)malloc(len); + PUT16(data, (tag->id<<6)+63); + *(U8*)&data[2] = tag->len; + *(U8*)&data[3] = tag->len>>8; + *(U8*)&data[4] = tag->len>>16; + *(U8*)&data[5] = tag->len>>24; + memcpy(&data[6], tag->data, tag->len); + } else { + len += 2; + data = (U8*)malloc(len); + PUT16(data, (tag->id<<6)+tag->len); + memcpy(&data[2], tag->data, tag->len); + } + map_ids_mem(data, len, callback); + */ + int num = swf_GetNumUsedIDs(tag); + int *ptr = malloc(sizeof(int)*num); + int t; + swf_GetUsedIDs(tag, ptr); + for(t=0;tdata[ptr[t]]); +} + +void moveToZero(TAG*tag) +{ + if(!swf_isPlaceTag(tag)) + return; + SWFPLACEOBJECT obj; + swf_GetPlaceObject(tag, &obj); + obj.matrix.tx = 0; + obj.matrix.ty = 0; + swf_ResetTag(tag, tag->id); + swf_SetPlaceObject(tag, &obj); +} + +void extractTag(SWF*swf, char*filename) +{ + SWF newswf; + TAG*desttag; + TAG*srctag; + RGBA rgb; + SRECT objectbbox; + char sprite; + int f; + int t; + int tagnum; + int copy = 0; + memset(&newswf,0x00,sizeof(SWF)); // set global movie parameters + + newswf.fileVersion = swf->fileVersion; + newswf.frameRate = swf->frameRate; + newswf.movieSize = swf->movieSize; + if(movetozero && originalplaceobjects) { + newswf.movieSize.xmax = swf->movieSize.xmax - swf->movieSize.xmin; + newswf.movieSize.ymax = swf->movieSize.ymax - swf->movieSize.ymin; + newswf.movieSize.xmin = 0; + newswf.movieSize.ymin = 0; + } + + newswf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + desttag = newswf.firstTag; + rgb.r = mainr; + rgb.g = maing; + rgb.b = mainb; + swf_SetRGB(desttag,&rgb); + + swf_GetRect(0, &objectbbox); + + do { + changed = 0; + for(t=0;t<65536;t++) { + if(used[t] && !(used[t]&2)) { + if(tags[t]==0) { + msg(" ID %d is referenced, but never defined.", t); + } else if(tags[t]->id==ST_DEFINESPRITE) { + TAG*tag = tags[t]; + while(tag->id != ST_END) + { + enumerateIDs(tag, idcallback); + tag = tag->next; + } + } + else + enumerateIDs(tags[t], idcallback); + used[t] |= 2; + } + } + } + while(changed); + + srctag = swf->firstTag; + tagnum = 0; + sprite = 0; + while(srctag && (srctag->id || sprite)) { + int reset = 0; + if(!sprite) { + copy = 0; + } + if(srctag->id == ST_END) { + sprite = 0; + } + if(srctag->id == ST_DEFINESPRITE) + sprite = 1; + if(srctag->id == ST_JPEGTABLES) + copy = 1; + if(swf_isDefiningTag(srctag)) { + int id = swf_GetDefineID(srctag); + if(used[id]) { + SRECT b; + copy = 1; + b = swf_GetDefineBBox(srctag); + swf_ExpandRect2(&objectbbox, &b); + } + } else + if ((((swf_isPlaceTag(srctag) && originalplaceobjects) + || srctag->id == ST_STARTSOUND) && (used[swf_GetPlaceID(srctag)]&4) ) || + (swf_isPseudoDefiningTag(srctag) && used[swf_GetDefineID(srctag)]) || + (tagused[tagnum])) + { + if(copy == 0) + reset = 1; + copy = 1; + } + if(srctag->id == ST_REMOVEOBJECT) { + if(!used[swf_GetPlaceID(srctag)]) + copy = 0; + } + + if(copy) { + TAG*ttag = (TAG*)malloc(sizeof(TAG)); + desttag = swf_InsertTag(desttag, srctag->id); + desttag->len = desttag->memsize = srctag->len; + desttag->data = malloc(srctag->len); + memcpy(desttag->data, srctag->data, srctag->len); + if(movetozero && swf_isPlaceTag(desttag)) { + moveToZero(desttag); + } + if(reset) + copy = 0; + } + + srctag = srctag->next; + tagnum ++; + } + if(!extractframes && !hollow) { + if(!originalplaceobjects && (extractids||extractname_id>=0)) { + int number = 0; + int id = 0; + int t; + TAG* objtag = 0; + SRECT bbox; + memset(&bbox, 0, sizeof(SRECT)); + if(extractids) { + for(t=0;t<65536;t++) { + if(is_in_range(t, extractids)) { + id = t; + number++; + } + } + } + if(number>=2) { + printf("warning! You should use the -P when extracting multiple objects\n"); + } + + if(number == 1) { + /* if there is only one object, we will scale it. + So let's figure out its bounding box */ + TAG*tag = swf->firstTag; + while(tag) { + if(swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) { + if(swf_GetDefineID(tag) == id) + bbox = swf_GetDefineBBox(tag); + objtag = tag; + } + tag = tag->next; + } + newswf.movieSize.xmin = 0; + newswf.movieSize.ymin = 0; + newswf.movieSize.xmax = 512*20; + newswf.movieSize.ymax = 512*20; + } else { + if((objectbbox.xmin|objectbbox.ymin|objectbbox.xmax|objectbbox.ymax)!=0) + newswf.movieSize = objectbbox; + } + + if(extractname_id>=0) { + desttag = swf_InsertTag(desttag, ST_PLACEOBJECT2); + swf_ObjectPlace(desttag, extractname_id, extractname_id, 0,0,extractname); + } else { + for(t=0;t<65536;t++) { + if(is_in_range(t, extractids)) { + MATRIX m; + desttag = swf_InsertTag(desttag, ST_PLACEOBJECT2); + swf_GetMatrix(0, &m); + if(objtag) { + int width = bbox.xmax - bbox.xmin; + int height = bbox.ymax - bbox.ymin; + int max = width>height?width:height; + m.tx = -bbox.xmin; + m.ty = -bbox.ymin; + if(max) { + m.sx = (512*20*65536)/max; + m.sy = (512*20*65536)/max; + } + //newswf.movieSize = swf_TurnRect(newswf.movieSize, &m); + } + swf_ObjectPlace(desttag, t, t, &m,0,0); + } + } + } + } + desttag = swf_InsertTag(desttag,ST_SHOWFRAME); + } + desttag = swf_InsertTag(desttag,ST_END); + + f = open(filename, O_TRUNC|O_WRONLY|O_CREAT|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&newswf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + + swf_FreeTags(&newswf); // cleanup +} + +int isOfType(int t, TAG*tag) +{ + int show = 0; + if(t == 0 && (tag->id == ST_DEFINESHAPE || + tag->id == ST_DEFINESHAPE2 || + tag->id == ST_DEFINESHAPE3)) { + show = 1; + } + if(t==1 && tag->id == ST_DEFINESPRITE) { + show = 1; + } + if(t == 2 && (tag->id == ST_DEFINEBITS || + tag->id == ST_DEFINEBITSJPEG2 || + tag->id == ST_DEFINEBITSJPEG3)) { + show = 1; + } + if(t == 3 && (tag->id == ST_DEFINEBITSLOSSLESS || + tag->id == ST_DEFINEBITSLOSSLESS2)) { + show = 1; + } + if(t == 4 && (tag->id == ST_DEFINESOUND)) { + show = 1; + } + if(t == 5 && (tag->id == ST_DEFINEFONT || tag->id == ST_DEFINEFONT2 || tag->id == ST_DEFINEFONT3)) { + show = 1; + } + if (t== 6 && (tag->id == ST_DEFINEBINARY)) { + show = 1; + } + if (t== 7 && (tag->id == ST_DEFINESPRITE)) { + int wasFolded = swf_IsFolded(tag); + TAG *toFold = tag; + + if(wasFolded) + swf_UnFoldSprite(tag); + + while(tag->id != ST_END) { + tag = tag->next; + if(tag->id == ST_SOUNDSTREAMHEAD || tag->id == ST_SOUNDSTREAMHEAD2) { + show = 1; + break; + } + } + + if(wasFolded) + swf_FoldSprite(toFold); + } + + return show; +} + +void listObjects(SWF*swf) +{ + TAG*tag; + char first; + int t; + int frame = 0; + char*names[] = {"Shape", "MovieClip", "JPEG", "PNG", "Sound", "Font", "Binary", "Embedded MP3"}; + char*options[] = {"-i", "-i", "-j", "-p", "-s", "-F","-b","-M"}; + int mp3=0; + printf("Objects in file %s:\n",filename); + swf_FoldAll(swf); + for(t=0;tfirstTag; + first = 1; + while(tag) { + if(tag->id == ST_SOUNDSTREAMHEAD || tag->id == ST_SOUNDSTREAMHEAD2) + mp3 = 1; + if(isOfType(t,tag)) + nr++; + tag = tag->next; + } + if(!nr) + continue; + + printf(" [%s] %d %s%s: ID(s) ", options[t], nr, names[t], nr>1?"s":""); + + tag = swf->firstTag; + while(tag) { + char text[80]; + char show = isOfType(t,tag); + int id; + if(!show) { + tag = tag->next; + continue; + } + id = swf_GetDefineID(tag); + + if(id == lastid+1) { + follow=1; + } else { + if(first || !follow) { + if(!first) + printf(", "); + printf("%d", id); + } else { + if(lastprint + 1 == lastid) + printf(", %d, %d", lastid, id); + else + printf("-%d, %d", lastid, id); + } + lastprint = id; + first = 0; + follow = 0; + } + lastid = id; + tag=tag->next; + } + if(follow) { + if(lastprint + 1 == lastid) + printf(", %d", lastid); + else + printf("-%d", lastid); + } + printf("\n"); + } + + if(frame) + printf(" [-f] %d Frames: ID(s) 0-%d\n", frame, frame); + else + printf(" [-f] 1 Frame: ID(s) 0\n"); + + if(mp3) + printf(" [-m] 1 MP3 Soundstream\n"); +} + +int handlefont(SWF*swf, TAG*tag) +{ + SWFFONT* f=0; + U16 id; + char name[80]; + char*filename = name; + int t; + + id = swf_GetDefineID(tag); + prepare_name(name, sizeof(name), "font", "swf", id); + if(numextracts==1) { + filename = destfilename; + } + + swf_FontExtract(swf, id, &f); + if(!f) { + if (!extractanyids) { + printf("Couldn't extract font %d\n", id); + } + return 0; + } + + swf_WriteFont(f, filename); + swf_FontFree(f); + return 1; +} + +static char has_jpegtables=0; +static U8*jpegtables = 0; +static int jpegtablessize = 0; + +void handlejpegtables(TAG*tag) +{ + if(tag->id == ST_JPEGTABLES) { + jpegtables = tag->data; + jpegtablessize = tag->len; + has_jpegtables = 1; + } +} + +FILE* save_fopen(char* name, char* mode) +{ + FILE*fi = fopen(name, mode); + if(!fi) { + fprintf(stderr, "Error: Couldn't open %s\n", name); + exit(1); + } + return fi; +} + +int findjpegboundary(U8*data, int len) +{ + int t; + int pos=-1; + for(t=0;tid != ST_DEFINEBITSJPEG3) { + prepare_name(name, sizeof(name), "pic", "jpg", GET16(tag->data)); + if(numextracts==1) { + filename = destfilename; + if(!strcmp(filename,"output.swf")) + filename = "output.jpg"; + } + } else { + prepare_name(name, sizeof(name), "pic", "png", GET16(tag->data)); + if(numextracts==1) { + filename = destfilename; + if(!strcmp(filename,"output.swf")) + filename = "output.png"; + } + } + + /* swf jpeg images have two streams, which both start with ff d8 and + end with ff d9. The following code handles sorting the middle + bytes out, so that one stream remains */ + if(tag->id == ST_DEFINEBITSJPEG && tag->len>2 && has_jpegtables) { + fi = save_fopen(filename, "wb"); + if(jpegtablessize>=2) { + fwrite(jpegtables, 1, jpegtablessize-2, fi); //don't write end tag (ff,d8) + fwrite(&tag->data[2+2], tag->len-2-2, 1, fi); //don't write start tag (ff,d9) + } else { + fwrite(tag->data+2, tag->len-2, 1, fi); + } + fclose(fi); + } + else if(tag->id == ST_DEFINEBITSJPEG2 && tag->len>2) { + int end = tag->len; + int pos = findjpegboundary(&tag->data[2], tag->len-2); + if(pos>=0) { + pos+=2; + fi = save_fopen(filename, "wb"); + fwrite(&tag->data[2], pos-2, 1, fi); + fwrite(&tag->data[pos+4], end-(pos+4), 1, fi); + fclose(fi); + } else { + fi = save_fopen(filename, "wb"); + fwrite(&tag->data[2], end-2, 1, fi); + fclose(fi); + } + } + else if(tag->id == ST_DEFINEBITSJPEG3 && tag->len>6) { + U32 end = GET32(&tag->data[2])+6; + int pos = findjpegboundary(&tag->data[6], end); + if(end >= tag->len) { + msg(" zlib data out of bounds in definebitsjpeg3"); + return 0; + } + if(pos) { + /* TODO: do we actually need this? */ + memmove(&tag->data[pos], &tag->data[pos+4], end-(pos+4)); + } + unsigned char*image; + unsigned width=0, height=0; + jpeg_load_from_mem(&tag->data[6], end-6, &image, &width, &height); + + uLongf datalen = width*height; + Bytef *data = malloc(datalen); + + int error = uncompress(data, &datalen, &tag->data[end], (uLong)(tag->len - end)); + if(error != Z_OK) { + fprintf(stderr, "Zlib error %d\n", error); + return 0; + } + int t, size = width*height; + for(t=0;tdata); + if (!extractanyids) { + fprintf(stderr, "Object %d is not a JPEG picture!\n", id); + exit(1); + } + return 0; + } + return 1; +} + +#ifdef _ZLIB_INCLUDED_ +static U32 mycrc32; + +static U32*crc32_table = 0; +static void make_crc32_table(void) +{ + int t; + if(crc32_table) + return; + crc32_table = (U32*)malloc(1024); + + for (t = 0; t < 256; t++) { + U32 c = t; + int s; + for (s = 0; s < 8; s++) { + c = (0xedb88320L*(c&1)) ^ (c >> 1); + } + crc32_table[t] = c; + } +} +static inline void png_write_byte(FILE*fi, U8 byte) +{ + fwrite(&byte,1,1,fi); + mycrc32 = crc32_table[(mycrc32 ^ byte) & 0xff] ^ (mycrc32 >> 8); +} +static void png_start_chunk(FILE*fi, char*type, int len) +{ + U8 mytype[4]={0,0,0,0}; + U32 mylen = BE_32_TO_NATIVE(len); + memcpy(mytype,type,strlen(type)); + fwrite(&mylen, 4, 1, fi); + mycrc32=0xffffffff; + png_write_byte(fi,mytype[0]); + png_write_byte(fi,mytype[1]); + png_write_byte(fi,mytype[2]); + png_write_byte(fi,mytype[3]); +} +static void png_write_bytes(FILE*fi, U8*bytes, int len) +{ + int t; + for(t=0;t>24); + png_write_byte(fi,dword>>16); + png_write_byte(fi,dword>>8); + png_write_byte(fi,dword); +} +static void png_end_chunk(FILE*fi) +{ + U32 tmp = BE_32_TO_NATIVE((mycrc32^0xffffffff)); + fwrite(&tmp,4,1,fi); +} + + +/* extract a lossless image (png) out of a tag + This routine was originally meant to be a one-pager. I just + didn't know png is _that_ much fun. :) -mk + */ +int handlelossless(TAG*tag) +{ + char name[80]; + char*filename = name; + FILE*fi; + int width, height; + int crc; + int id; + int t; + U8 bpp = 1; + U8 format; + U8 tmp; + Bytef* data=0; + U8* data2=0; + U8* data3=0; + uLongf datalen; + uLongf datalen2; + U32 datalen3; + U8 head[] = {137,80,78,71,13,10,26,10}; + int cols; + char alpha = tag->id == ST_DEFINEBITSLOSSLESS2; + RGBA* palette; + int pos; + int error; + U32 tmp32; + + make_crc32_table(); + + if(tag->id != ST_DEFINEBITSLOSSLESS && + tag->id != ST_DEFINEBITSLOSSLESS2) { + int id = GET16(tag->data); + if (!extractanyids) { + fprintf(stderr, "Object %d is not a PNG picture!\n",id); + exit(1); + } + return 0; + } + + id =swf_GetU16(tag); + format = swf_GetU8(tag); + if(format == 3) bpp = 8; + if(format == 4) bpp = 16; + if(format == 5) bpp = 32; + if(format!=3 && format!=5) { + if(format==4) + fprintf(stderr, "Can't handle 16-bit palette images yet (image %d)\n",id); + else + fprintf(stderr, "Unknown image type %d in image %d\n", format, id); + return 0; + } + width = swf_GetU16(tag); + height = swf_GetU16(tag); + if(format == 3) cols = swf_GetU8(tag) + 1; +// this is what format means according to the flash specification. (which is +// clearly wrong) +// if(format == 4) cols = swf_GetU16(tag) + 1; +// if(format == 5) cols = swf_GetU32(tag) + 1; + else cols = 0; + + msg(" Width %d", width); + msg(" Height %d", height); + msg(" Format %d", format); + msg(" Cols %d", cols); + msg(" Bpp %d", bpp); + + datalen = (width*height*bpp/8+cols*8); + do { + if(data) + free(data); + datalen+=4096; + data = malloc(datalen); + error = uncompress (data, &datalen, &tag->data[tag->pos], tag->len-tag->pos); + } while(error == Z_BUF_ERROR); + if(error != Z_OK) { + fprintf(stderr, "Zlib error %d (image %d)\n", error, id); + return 0; + } + msg(" Uncompressed image is %d bytes (%d colormap)", datalen, (3+alpha)*cols); + pos = 0; + datalen2 = datalen+16; + data2 = malloc(datalen2); + palette = (RGBA*)malloc(cols*sizeof(RGBA)); + + for(t=0;t Compressed data is %d bytes", datalen2); + png_start_chunk(fi, "IDAT", datalen2); + png_write_bytes(fi,data2,datalen2); + png_end_chunk(fi); + png_start_chunk(fi, "IEND", 0); + png_end_chunk(fi); + + free(data); + free(data2); + free(data3); + return 1; +} +#endif + +static FILE*mp3file=0; +void handlesoundstream(TAG*tag) +{ + char*filename = "output.mp3"; + if(numextracts==1) { + filename = destfilename; + if(!strcmp(filename,"output.swf")) + filename = "output.mp3"; + } + switch(tag->id) { + case ST_SOUNDSTREAMHEAD: + if((tag->data[1]&0x30) == 0x20) { //mp3 compression + mp3file = fopen(filename, "wb"); + msg(" Writing mp3 data to %s",filename); + } + else + msg(" Soundstream is not mp3"); + break; + case ST_SOUNDSTREAMHEAD2: + if((tag->data[1]&0x30) == 0x20) {//mp3 compression + mp3file = fopen(filename, "wb"); + msg(" Writing mp3 data to %s",filename); + } + else + msg(" Soundstream is not mp3 (2)"); + break; + case ST_SOUNDSTREAMBLOCK: + if(mp3file) + fwrite(&tag->data[4],tag->len-4,1,mp3file); + break; + } +} + +int handledefinesound(TAG*tag) +{ + U8 flags; + U32 samples; + char buf[128]; + char*filename = buf; + FILE*fi; + char*extension = 0; + int format; + U16 id; + int rate,bits,stereo; + char*rates[] = {"5500","11025","22050","44100"}; + id = swf_GetU16(tag); //id + + flags = swf_GetU8(tag); + format = flags>>4; + rate = (flags>>2)&3; + bits = flags&2?16:8; + stereo = flags&1; + + samples = swf_GetU32(tag); + + extension = "raw"; + + if(format == 2) { // mp3 + swf_GetU16(tag); //numsamples_seek + extension = "mp3"; + } else if(format == 0) { // raw + printf("Sound is RAW, format: %s samples/sec, %d bit, %s\n", rates[rate], bits, stereo?"stereo":"mono"); + // TODO: convert to WAV + extension = "raw"; + } else if(format == 1) { // adpcm + printf("Sound is ADPCM, format: %s samples/sec, %d bit, %s\n", rates[rate], bits, stereo?"stereo":"mono"); + extension = "adpcm"; + } else { + return 0; + } + prepare_name(buf, sizeof(buf), "sound", extension, id); + if(numextracts==1) { + filename = destfilename; + if(!strcmp(filename,"output.swf")) { + sprintf(buf, "output.%s", extension); + filename = buf; + } + } + fi = save_fopen(filename, "wb"); + fwrite(&tag->data[tag->pos], tag->len - tag->pos, 1, fi); + fclose(fi); + return 1; +} + +int handlebinary(TAG*tag) { + FILE *fout = NULL; + char buf[100]; + char *filename = buf; + int len = tag->memsize; + int dx = 6; // offset to binary data + if (tag->id!=ST_DEFINEBINARY) { + if (!extractanyids) { + fprintf(stderr, "Object %d is not a binary entity!\n", + GET16(tag->data)); + } + return 0; + } + prepare_name(buf, sizeof(buf), "binary", "bin", GET16(tag->data)); + if(numextracts==1) { + filename = destfilename; + if(!strcmp(filename,"output.swf")) { + sprintf(buf, "output.bin"); + filename = buf; + } + } + fout = fopen(filename, "wb"); + fwrite(tag->data+dx,len-dx,1,fout); + fclose(fout); + return 1; +} + +int handleembeddedmp3(TAG*tag) { + int wasFolded; + TAG *toFold; + + if (tag->id!=ST_DEFINESPRITE) { + if (!extractanyids) { + fprintf(stderr, "Object %d is not a sprite entity!\n", + GET16(tag->data)); + } + return 0; + } + + wasFolded = swf_IsFolded(tag); + toFold = tag; + + if(wasFolded) + swf_UnFoldSprite(tag); + + while(tag->id != ST_END) { + tag = tag->next; + if(tag->id == ST_SOUNDSTREAMHEAD || + tag->id == ST_SOUNDSTREAMHEAD2 || + tag->id == ST_SOUNDSTREAMBLOCK) { + handlesoundstream(tag); + } + } + + if(wasFolded) + swf_FoldSprite(toFold); + + return 1; +} + +int main (int argc,char ** argv) +{ + TAG*tag; + SWF swf; + int f; + int found = 0; + int frame = 0; + int tagnum = 0; + char depths[65536]; + char listavailable = 0; + processargs(argc, argv); + + if(!extractframes && !extractids && ! extractname && !extractjpegids && !extractpngids + && !extractmp3 && !extractsoundids && !extractfontids && !extractbinaryids + && !extractanyids && !extractmp3ids) + listavailable = 1; + + if(!originalplaceobjects && movetozero) { + fprintf(stderr, "Error: -0 (--movetozero) can only be used in conjunction with -P (--placeobject)\n"); + return 0; + } + + if(!filename) + { + fprintf(stderr, "You must supply a filename.\n"); + return 1; + } + initLog(0,-1,0,0,-1, verbose); + + f = open(filename,O_RDONLY|O_BINARY); + + if (f<0) + { + perror("Couldn't open file: "); + exit(1); + } + if (swf_ReadSWF(f,&swf) < 0) + { + fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); + close(f); + exit(1); + } + close(f); + + if(listavailable) { + listObjects(&swf); + swf_FreeTags(&swf); + return 0; + } + + tag = swf.firstTag; + tagnum = 0; + while(tag) { + tagnum ++; + tag = tag->next; + } + + tagused = (char*)malloc(tagnum); + memset(tagused, 0, tagnum); + memset(used, 0, 65536); + memset(depths, 0, 65536); + + tag = swf.firstTag; + tagnum = 0; + while(tag) { + if(swf_isAllowedSpriteTag(tag)) { + int write = 0; + if(extractframes && is_in_range(frame, extractframes)) { + write = 1; + if(tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { + depths[swf_GetDepth(tag)] = 1; + } + if(tag->id == ST_REMOVEOBJECT || tag->id == ST_REMOVEOBJECT2) { + int depth = swf_GetDepth(tag); + if(!depths[depth]) + write = 0; + depths[swf_GetDepth(tag)] = 0; + } + } else { + if((tag->id == ST_REMOVEOBJECT || tag->id == ST_REMOVEOBJECT2) && + (depths[swf_GetDepth(tag)]) && hollow) { + write = 1; + depths[swf_GetDepth(tag)] = 0; + } + } + if(write) { + enumerateIDs(tag, idcallback); + found = 1; + tagused[tagnum] = 1; + } + } + + if(tag->id == ST_SOUNDSTREAMHEAD || + tag->id == ST_SOUNDSTREAMHEAD2 || + tag->id == ST_SOUNDSTREAMBLOCK) { + if(extractmp3) + handlesoundstream(tag); + } + + if(tag->id == ST_JPEGTABLES) { + handlejpegtables(tag); + } + + if(swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + tags[id] = tag; + if(extractids && is_in_range(id, extractids)) { + used[id] = 5; + found = 1; + } + if(extractfontids && is_in_range(id, extractfontids)) { + handlefont(&swf, tag); + } + if(extractjpegids && is_in_range(id, extractjpegids)) { + handlejpeg(tag); + } + if(extractsoundids && is_in_range(id, extractsoundids)) { + handledefinesound(tag); + } + if(extractmp3ids && is_in_range(id, extractmp3ids)) { + handleembeddedmp3(tag); + } + if(extractbinaryids && is_in_range(id, extractbinaryids)) { + handlebinary(tag); + } +#ifdef _ZLIB_INCLUDED_ + if(extractpngids && is_in_range(id, extractpngids)) { + handlelossless(tag); + } +#endif + if(extractanyids && is_in_range(id, extractanyids)) { + if (handlefont(&swf,tag)) { + // pass + } else if (handlejpeg(tag)) { + // pass + } else if (handlebinary(tag)) { + // pass +#ifdef _ZLIB_INCLUDED_ + } else if (handlelossless(tag)) { + // pass +#endif + } else if (handledefinesound(tag)) { + // Not sure if sound code checks carefully for type. + // pass + } else if (handleembeddedmp3(tag)) { + // pass + } else { + printf("#%d not processed\n", id); + } + } + } + else if (tag->id == ST_SETBACKGROUNDCOLOR) { + mainr = tag->data[0]; + maing = tag->data[1]; + mainb = tag->data[2]; + } + else if(swf_isPlaceTag(tag) && tag->id != ST_PLACEOBJECT ) { + char*name = swf_GetName(tag); + if(name && extractname && !strcmp(name, extractname)) { + int id = swf_GetPlaceID(tag); + used[id] = 5; + found = 1; + if(originalplaceobjects) { + tagused[tagnum] = 1; + } + depths[swf_GetDepth(tag)] = 1; + extractname_id = id; + } + } + else if(tag->id == ST_SHOWFRAME) { + frame ++; + if(hollow) { + tagused[tagnum] = 1; + found = 1; + } + } + + if(tag->id == ST_DEFINESPRITE) { + while(tag->id != ST_END) { + tag = tag->next; + tagnum ++; + } + } + tag = tag->next; + tagnum ++; + } + if (found) + extractTag(&swf, destfilename); + + if(mp3file) { + fclose(mp3file); + } else { + if(extractmp3) { + msg(" Didn't find a soundstream in file"); + } + } + + swf_FreeTags(&swf); + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfrender b/fluidbook/tools/swftools-special-swfdump/src/swfrender new file mode 100644 index 000000000..1db7135c1 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfrender differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfrender.1 b/fluidbook/tools/swftools-special-swfdump/src/swfrender.1 new file mode 100644 index 000000000..e69de29bb diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfrender.c b/fluidbook/tools/swftools-special-swfdump/src/swfrender.c new file mode 100644 index 000000000..87a8b32ad --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfrender.c @@ -0,0 +1,199 @@ +#include "../config.h" +#include +#include +#include +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/png.h" +#include "../lib/args.h" +#include "../lib/gfxsource.h" +#include "../lib/readers/swf.h" +#include "../lib/devices/render.h" +#include "../lib/devices/rescale.h" + +static struct options_t options[] = { +{"h", "help"}, +{"o", "output"}, +{"p", "pages"}, +{"l", "legacy"}, +{"V", "version"}, +{"X", "width"}, +{"Y", "height"}, +{0,0} +}; + +static int ng = 1; +static char*filename = 0; +static char*outputname = "output.png"; +static int quantize = 0; +static char*pagerange = 0; + +static int width = 0; +static int height = 0; + +typedef struct _parameter { + const char*name; + const char*value; + struct _parameter*next; +} parameter_t; + +parameter_t*params = 0; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfrender - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } else if(!strcmp(name, "o")) { + outputname = strdup(val); + return 1; + } else if(!strcmp(name, "l")) { + ng = 0; + return 0; + } else if(!strcmp(name, "q")) { + quantize = 1; + return 0; + } else if(!strcmp(name, "p")) { + pagerange = val; + return 1; + } else if(!strcmp(name, "s")) { + char*s = strdup(val); + char*c = strchr(s, '='); + parameter_t*p = malloc(sizeof(parameter_t)); + p->next = params; + params = p; + if(c && *c && c[1]) { + *c = 0; + c++; + p->name = s; + p->value = s; + } else { + p->name = s; + p->value = "1"; + } + return 1; + } else if(!strcmp(name, "X")) { + width = atoi(val); + return 1; + } else if(!strcmp(name, "Y")) { + height = atoi(val); + return 1; + } else { + printf("Unknown option: -%s\n", name); + exit(1); + } + + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s file.swf [-o output.png]\n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-l , --legacy Use old rendering framework\n"); + printf("-o , --output Output file (default: output.png)\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + + + +int main(int argn, char*argv[]) +{ + SWF swf; + int fi; + + processargs(argn, argv); + + if(!filename) { + fprintf(stderr, "You must supply a filename.\n"); + return 1; + } + + if(!ng) { + fi = open(filename, O_RDONLY|O_BINARY); + if (fi<=0) { + fprintf(stderr,"Couldn't open %s\n", filename); + perror(filename); + exit(1); + } + if(swf_ReadSWF(fi,&swf)<0) { + fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]); + close(fi); + } + assert(swf.movieSize.xmax > swf.movieSize.xmin && swf.movieSize.ymax > swf.movieSize.ymin); + RENDERBUF buf; + swf_Render_Init(&buf, 0,0, (swf.movieSize.xmax - swf.movieSize.xmin) / 20, + (swf.movieSize.ymax - swf.movieSize.ymin) / 20, 2, 1); + swf_RenderSWF(&buf, &swf); + RGBA* img = swf_Render(&buf); + if(quantize) + png_write_palette_based_2(outputname, (unsigned char*)img, buf.width, buf.height); + else + png_write(outputname, (unsigned char*)img, buf.width, buf.height); + swf_Render_Delete(&buf); + } else { + parameter_t*p; + + gfxsource_t*src = gfxsource_swf_create(); + for(p=params;p;p=p->next) { + src->setparameter(src, p->name, p->value); + } + gfxdocument_t*doc = src->open(src, filename); + for(p=params;p;p=p->next) { + doc->setparameter(doc, p->name, p->value); + } + if(!doc) { + fprintf(stderr,"Couldn't open %s\n", filename); + exit(1); + } + gfxdevice_t dev2,*dev=&dev2; + gfxdevice_render_init(dev); + dev->setparameter(dev, "antialise", "4"); + if(quantize) { + dev->setparameter(dev, "palette", "1"); + } + if(width || height) { + dev = gfxdevice_rescale_new(dev, width, height, 0); + } + for(p=params;p;p=p->next) { + dev->setparameter(dev, p->name, p->value); + } + + int t; + for(t=1;t<=doc->num_pages;t++) { + if(!is_in_range(t, pagerange)) + continue; + gfxpage_t* page = doc->getpage(doc, t); + dev->startpage(dev, page->width, page->height); + page->render(page, dev); + dev->endpage(dev); + page->destroy(page); + break; + } + gfxresult_t*result = dev->finish(dev); + if(result) { + if(result->save(result, outputname) < 0) { + exit(1); + } + result->destroy(result); + } + doc->destroy(doc); + } + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfstrings b/fluidbook/tools/swftools-special-swfdump/src/swfstrings new file mode 100644 index 000000000..610902da8 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/swfstrings differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 b/fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 new file mode 100644 index 000000000..979471393 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 @@ -0,0 +1,35 @@ +.TH swfstrings "1" "August 2009" "swfstrings" "swftools" +.SH NAME +swfstrings - Extracts strings from SWF files. + +.SH Synopsis +.B swfstrings [options] file.swf + +.SH DESCRIPTION +This tool extracts strings from SWF files. It parses SWF font records +and text records and prints unicode-encoded characters to stdout. + +.SH OPTIONS +.TP +\fB\-f\fR, \fB\-\-fonts\fR + Print out font information for each text block +.TP +\fB\-x\fR, \fB\-\-xpos\fR \fIx\fR + Set bounding box x coordinate +.TP +\fB\-y\fR, \fB\-\-ypos\fR \fIy\fR + Set bounding box y coordinate +.TP +\fB\-W\fR, \fB\-\-width\fR \fIwidth\fR + Set bounding box width +.TP +\fB\-H\fR, \fB\-\-height\fR \fIheight\fR + Set bounding box height +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version information and exit +.SH AUTHORS + +Rainer Böhme +.TP +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfstrings.c b/fluidbook/tools/swftools-special-swfdump/src/swfstrings.c new file mode 100644 index 000000000..f28827668 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/swfstrings.c @@ -0,0 +1,246 @@ +/* swfstrings.c + Scans a swf file for strings + + Part of the swftools package. + + Copyright (c) 2000,2001 Rainer Böhme + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/args.h" +#include "../lib/utf8.h" + +static char * filename = 0; +static char showfonts = 0; +static int x=0,y=0,w=0,h=0; + +static struct options_t options[] = { +{"f", "fonts"}, +{"x", "xpos"}, +{"y", "ypos"}, +{"W", "width"}, +{"H", "height"}, +{"V", "version"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("swfstrings - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } else if(!strcmp(name, "x")) { + x = atoi(val); + return 1; + } else if(!strcmp(name, "y")) { + y = atoi(val); + return 1; + } else if(!strcmp(name, "W")) { + w = atoi(val); + return 1; + } else if(!strcmp(name, "H")) { + h = atoi(val); + return 1; + } else if(!strcmp(name, "f")) { + showfonts = 1; + return 0; + } else if(!strcmp(name, "V")) { + printf("swfstrings - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } else { + fprintf(stderr, "Unknown option: -%s\n", name); + exit(1); + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [options] file.swf\n", name); + printf("\n"); + printf("-f , --fonts Print out font information for each text block\n"); + printf("-x , --xpos Set bounding box x coordinate\n"); + printf("-y , --ypos Set bounding box y coordinate\n"); + printf("-W , --width Set bounding box width\n"); + printf("-H , --height Set bounding box height\n"); + printf("-V , --version Print version information and exit\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +static SWF swf; +static int fontnum = 0; +static SWFFONT**fonts = 0; + +void fontcallback1(void*self, U16 id,U8 * name) +{ fontnum++; +} + +void fontcallback2(void*self, U16 id,U8 * name) +{ + swf_FontExtract(&swf,id,&fonts[fontnum]); + fontnum++; +} + + +void textcallback(void*self, int*glyphs, int*advance, int nr, int fontid, int fontsize, int startx, int starty, RGBA*color) +{ + SWFFONT*font = 0; + int t; + for(t=0;tid == fontid) { + font = fonts[t]; + break; + } + } + + if(showfonts) { + if(font) + printf("#\n", fontid, font->name, swf_FontIsBold(font)?" bold":"",swf_FontIsItalic(font)?" italic":""); + printf("#\n", color->r, color->g, color->b, color->a); + printf("#\n", fontsize); + } + + for(t=0;t x+w || yy > y+h) { + /* outside of bounding box */ + ///printf("(%d+%d,%d) -> (%d,%d)\n", startx, advance[t]/20, starty, xx, yy); + if(t==nr-1) return; + else continue; + } + } + + unsigned char a; + int advance = 0; + if(font) { + if(glyphs[t]<0 || glyphs[t] >= font->numchars /*glyph is not in range*/ + || !font->glyph2ascii /* font has ascii<->glyph mapping */ + ) a = glyphs[t]; + else { + if(font->glyph2ascii[glyphs[t]]) + a = font->glyph2ascii[glyphs[t]]; + else + a = glyphs[t]; + } + } else { + a = glyphs[t]; + } + + if(a>=32) { + char* utf8 = getUTF8(a); + printf("%s", utf8); + } else { + printf("\\x%x", (int)a); + } + } + printf("\n"); +} + +void fontcallback(void*self,U16 id,U8 * name) +{ SWFFONT* font; + TAG* t; + + swf_FontExtract(&swf,id,&font); + + t = swf.firstTag; + + swf_FontFree(font); +} + +TAG**id2tag = 0; + +int main (int argc,char ** argv) +{ + int f; + processargs(argc, argv); + if(!filename) + exit(0); + + f = open(filename,O_RDONLY|O_BINARY); + if (f<0 || swf_ReadSWF(f,&swf)<0) { + fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",filename); + if(f>=0) close(f); + exit(-1); + } + close(f); + + if(x|y|w|h) { + if(!w) w = (swf.movieSize.xmax - swf.movieSize.xmin) / 20; + if(!h) h = (swf.movieSize.ymax - swf.movieSize.ymin) / 20; + } + + id2tag = malloc(sizeof(TAG)*65536); + + fontnum = 0; + swf_FontEnumerate(&swf,&fontcallback1, 0); + fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); + fontnum = 0; + swf_FontEnumerate(&swf,&fontcallback2, 0); + + TAG*tag = swf.firstTag; + while (tag) + { + if(swf_isTextTag(tag)) { + id2tag[swf_GetDefineID(tag)] = tag; + } else if(swf_isPlaceTag(tag)) { + SWFPLACEOBJECT po; + swf_SetTagPos(tag, 0); + swf_GetPlaceObject(tag, &po); + if(!po.move && id2tag[po.id]) { + TAG*text = id2tag[po.id]; + swf_SetTagPos(text, 0); + swf_GetU16(text); + swf_GetRect(text, NULL); + swf_ResetReadBits(text); + MATRIX m,tm; + swf_GetMatrix(text, &tm); + swf_MatrixJoin(&m, &po.matrix, &tm); + swf_ParseDefineText(text, textcallback, &m); + } + } + tag = tag->next; + } + + swf_FreeTags(&swf); + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/ttftool b/fluidbook/tools/swftools-special-swfdump/src/ttftool new file mode 100644 index 000000000..79c23ece8 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/ttftool differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/ttftool.c b/fluidbook/tools/swftools-special-swfdump/src/ttftool.c new file mode 100644 index 000000000..a3a8da4fc --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/ttftool.c @@ -0,0 +1,92 @@ +/* ttftool.c + + Truetype utility. + + Part of the swftools package. + + Copyright (c) 2010 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include +#include +#include "../lib/args.h" +#include "../lib/ttf.h" + +static char * filename = 0; +static int showname = 0; +static int verbose = 0; + +static struct options_t options[] = { +{"n", "name"}, +{0,0} +}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("ttftool - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } else if(!strcmp(name, "n")) { + showname = 1; + return 0; + } else if(!strcmp(name, "v")) { + verbose ++; + return 0; + } else { + printf("Unknown option: -%s\n", name); + exit(1); + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s \n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); + printf("-o , --output Write output to file .\n"); + printf("-V , --version Print version info and exit\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Please specify only one font\n"); + exit(1); + } + filename = name; + return 0; +} + + +int main(int argc, char ** argv) +{ + processargs(argc, argv); + ttf_t* font = ttf_open(filename); + if(showname && font->full_name) { + printf("%s\n", font->full_name); + } + return 0; +} + diff --git a/fluidbook/tools/swftools-special-swfdump/src/wav2swf b/fluidbook/tools/swftools-special-swfdump/src/wav2swf new file mode 100644 index 000000000..e03eff55e Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/src/wav2swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 new file mode 100644 index 000000000..c83768055 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 @@ -0,0 +1,53 @@ +.TH wav2swf "1" "April 2009" "wav2swf" "swftools" +.SH NAME +wav2swf - convert a WAV file to an SWF animation. + +.SH Synopsis +.B wav2swf [-o filename] file.wav + +.SH DESCRIPTION +Takes a wav file and converts it to a swf movie. + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR + Print short help message and exit +.TP +\fB\-V\fR, \fB\-\-version\fR + Print version info and exit +.TP +\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR + Explicitly specify output file. (Otherwise, output will go to output.swf) +.TP +\fB\-r\fR, \fB\-\-framerate\fR \fIfps\fR + Set file framerate to \fIfps\fR frames per second. +.TP +\fB\-s\fR, \fB\-\-samplerate\fR \fIsps\fR + Set samplerate to \fIsps\fR frames per second (default: 11025). +.TP +\fB\-d\fR, \fB\-\-definesound\fR + Store the sound as DEFINESOUND tag, not as streaming sound. Allows for + looping. +.TP +\fB\-l\fR, \fB\-\-loop\fR n + Loop the sound n times. +.TP +\fB\-C\fR, \fB\-\-cgi\fR + For use as CGI- prepend http header, write to stdout. +.TP +\fB\-S\fR, \fB\-\-stop\fR + Stop the movie at frame 0, and start the sound at 1, so that the + sound will not play until a "GotoFrame(1)" is issued. + (For use with flashsound.js). +.TP +\fB\-E\fR, \fB\-\-end\fR + Stop the movie at the end frame +.TP +\fB\-b\fR, \fB\-\-bitrate\fR \fIbps\fR + Set mp3 bitrate to \fIbps\fR (default: 32) +.TP +\fB\-v\fR, \fB\-\-verbose\fR + Be more verbose. (Use more than one -v for greater effect) +.SH AUTHOR + +Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/wav2swf.c b/fluidbook/tools/swftools-special-swfdump/src/wav2swf.c new file mode 100644 index 000000000..72919e5d3 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/src/wav2swf.c @@ -0,0 +1,376 @@ +/* wav2swf.c + Converts WAV/WAVE files to SWF. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include "../lib/rfxswf.h" +#include "../lib/log.h" +#include "../lib/args.h" +#include "../lib/wav.h" + +char * filename = 0; +char * outputname = "output.swf"; +int verbose = 2; +int stopframe0 = 0; +int stopframe1 = 0; + +#define DEFINESOUND_MP3 1 //define sound uses mp3?- undefine for raw sound. + +static struct options_t options[] = { +{"h", "help"}, +{"V", "version"}, +{"o", "output"}, +{"r", "framerate"}, +{"s", "samplerate"}, +{"d", "definesound"}, +{"l", "loop"}, +{"C", "cgi"}, +{"S", "stop"}, +{"E", "end"}, +{"b", "bitrate"}, +{"v", "verbose"}, +{0,0} +}; + +static int loop = 0; +static int definesound = 0; +static int framerate = 0; +static int samplerate = 11025; +static int bitrate = 32; +static int do_cgi = 0; + +static int mp3_bitrates[] = +{ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0}; + +int args_callback_option(char*name,char*val) +{ + if(!strcmp(name, "V")) { + printf("wav2swf - part of %s %s\n", PACKAGE, VERSION); + exit(0); + } + else if(!strcmp(name, "o")) { + outputname = val; + return 1; + } + else if(!strcmp(name, "d")) { + definesound = 1; + return 0; + } + else if(!strcmp(name, "l")) { + loop = atoi(val); + definesound = 1; + return 1; + } + else if(!strcmp(name, "v")) { + verbose ++; + return 0; + } + else if(!strcmp(name, "S")) { + stopframe0 = 1; + return 0; + } + else if(!strcmp(name, "E")) { + stopframe1 = 1; + return 0; + } + else if(!strcmp(name, "C")) { + do_cgi = 1; + return 0; + } + else if(!strcmp(name, "r")) { + float f; + sscanf(val, "%f", &f); + framerate = f*256; + return 1; + } + else if(!strcmp(name, "s")) { + samplerate = atoi(val); + if(samplerate > 5000 && samplerate < 6000) + samplerate = 5512; + else if(samplerate > 11000 && samplerate < 12000) + samplerate = 11025; + else if(samplerate > 22000 && samplerate < 23000) + samplerate = 22050; + else if(samplerate > 44000 && samplerate < 45000) + samplerate = 44100; + else { + fprintf(stderr, "Invalid samplerate: %d\n", samplerate); + fprintf(stderr, "Allowed values: 11025, 22050, 44100\n"); + exit(1); + } + return 1; + } + else if(!strcmp(name, "b")) { + int t; + int b = atoi(val); + if(b<=0) { + fprintf(stderr, "Not a valid bitrate: %s\n", val); + exit(1); + } + if(b>160) { + fprintf(stderr, "Bitrate must be <144. (%s)\n", val); + exit(1); + } + for(t=0;mp3_bitrates[t];t++) { + if(b== mp3_bitrates[t]) { + bitrate = b; + return 1; + } + } + fprintf(stderr, "Invalid bitrate. Allowed bitrates are:\n"); + for(t=0;mp3_bitrates[t];t++) { + printf("%d ", mp3_bitrates[t]); + } + printf("\n"); + exit(1); + } + else { + printf("Unknown option: -%s\n", name); + exit(1); + } + return 0; +} +int args_callback_longoption(char*name,char*val) +{ + return args_long2shortoption(options, name, val); +} +void args_callback_usage(char *name) +{ + printf("\n"); + printf("Usage: %s [-o filename] file.wav\n", name); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-V , --version Print version info and exit\n"); + printf("-o , --output Explicitly specify output file. (Otherwise, output will go to output.swf)\n"); + printf("-r , --framerate Set file framerate to frames per second.\n"); + printf("-s , --samplerate Set samplerate to frames per second (default: 11025).\n"); + printf("-d , --definesound Generate a DefineSound tag instead of streaming sound.\n"); + printf("-l , --loop n (Only used with -d)\n"); + printf("-C , --cgi For use as CGI- prepend http header, write to stdout.\n"); + printf("-S , --stop Stop the movie at frame 0\n"); + printf("-E , --end Stop the movie at the end frame\n"); + printf("-b , --bitrate Set mp3 bitrate to (default: 32)\n"); + printf("-v , --verbose Be more verbose\n"); + printf("\n"); +} +int args_callback_command(char*name,char*val) +{ + if(filename) { + fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", + filename, name); + } + filename = name; + return 0; +} + +extern int swf_mp3_bitrate; +extern int swf_mp3_out_samplerate; +extern int swf_mp3_in_samplerate; + +int main (int argc,char ** argv) +{ + SWF swf; + RGBA rgb; + SRECT r; + S32 width=300,height = 300; + TAG * tag; + + int f,i,ls1,fs1; + int count; + int t; + struct WAV wav,wav2; + int blocksize; + float blockspersecond; + float framespersecond; + float samplesperframe; + float framesperblock; + float samplesperblock; + U16* samples; + int numsamples; + + processargs(argc, argv); + + blocksize = (samplerate > 22050) ? 1152 : 576; + + blockspersecond = (float)samplerate/blocksize; + + framespersecond = blockspersecond; + if(framerate) + framespersecond = framerate/256.0; + + framesperblock = framespersecond / blockspersecond; + samplesperframe = (blocksize * blockspersecond) / framespersecond; + samplesperblock = samplesperframe * framesperblock; + + initLog(0,-1,0,0,-1,verbose); + + if(!filename) { + msg(" You must supply a filename"); + exit(1); + } + + if(!wav_read(&wav, filename)) + { + msg(" Error reading %s", filename); + exit(1); + } + wav_convert2mono(&wav,&wav2, samplerate); + //wav_print(&wav); + //wav_print(&wav2); + samples = (U16*)wav2.data; + numsamples = wav2.size/2; + +#ifdef WORDS_BIGENDIAN + /* swap bytes */ + for(t=0;t>8)&0xff | (samples[t]<<8)&0xff00; + } +#endif + + if(numsamples%blocksize != 0) + { + // apply padding, so that block is a multiple of blocksize + int numblocks = (numsamples+blocksize-1)/blocksize; + int numsamples2; + U16* samples2; + numsamples2 = numblocks * blocksize; + samples2 = malloc(sizeof(U16)*numsamples2); + memcpy(samples2, samples, numsamples*sizeof(U16)); + memset(&samples2[numsamples], 0, sizeof(U16)*(numsamples2 - numsamples)); + numsamples = numsamples2; + samples = samples2; + } + + memset(&swf,0x00,sizeof(SWF)); + + swf.fileVersion = 5; + swf.frameRate = (int)(framespersecond*256); + + swf.movieSize.xmax = 20*width; + swf.movieSize.ymax = 20*height; + + swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + tag = swf.firstTag; + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + swf_SetRGB(tag,&rgb); + + if(stopframe0) { + ActionTAG*action = 0; + tag = swf_InsertTag(tag, ST_DOACTION); + action = action_Stop(action); + action = action_End(action); + swf_ActionSet(tag, action); + swf_ActionFree(action); + + tag = swf_InsertTag(tag, ST_SHOWFRAME); + } + + swf_mp3_bitrate = bitrate; + swf_mp3_out_samplerate = samplerate; + swf_mp3_in_samplerate = samplerate; + + if(!definesound) + { + int oldframepos=-1, newframepos=0; + float framesamplepos = 0; + float framepos = 0; + float samplepos = 0; + ActionTAG* a = 0; + U16 v1=0,v2=0; + tag = swf_InsertTag(tag, ST_SOUNDSTREAMHEAD); + swf_SetSoundStreamHead(tag, samplesperframe); + msg(" %d blocks", numsamples/blocksize); + for(t=0;t Starting block %d %d+%d", t, (int)samplepos, (int)blocksize); + block1 = &samples[t*blocksize]; + swf_SetSoundStreamBlock(tag, block1, seek, 1); + v1 = v2 = GET16(tag->data); + } else { + msg(" Adding data...", t); + block1 = &samples[t*blocksize]; + swf_SetSoundStreamBlock(tag, block1, seek, 0); + v1+=v2; + PUT16(tag->data, v1); + } + samplepos += blocksize; + + oldframepos = (int)framepos; + framepos += framesperblock; + newframepos = (int)framepos; + + for(s=oldframepos;s 11025 + swf_SetBlock(tag, samples, numsamples*2); +#endif + + + tag = swf_InsertTag(tag, ST_STARTSOUND); + swf_SetU16(tag, 24); //id + memset(&info, 0, sizeof(info)); + info.loops = loop; + swf_SetSoundInfo(tag, &info); + tag = swf_InsertTag(tag, ST_SHOWFRAME); + if(stopframe1) { + ActionTAG*action = 0; + tag = swf_InsertTag(tag, ST_DOACTION); + action = action_Stop(action); + action = action_End(action); + swf_ActionSet(tag, action); + swf_ActionFree(action); + tag = swf_InsertTag(tag, ST_SHOWFRAME); + } + tag = swf_InsertTag(tag, ST_END); + } + + if(do_cgi) { + if FAILED(swf_WriteCGI(&swf)) fprintf(stderr,"WriteCGI() failed.\n"); + } else { + f = open(outputname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + } + + swf_FreeTags(&swf); + return 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/Makefile b/fluidbook/tools/swftools-special-swfdump/swfs/Makefile new file mode 100644 index 000000000..1102b93ab --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/Makefile @@ -0,0 +1,64 @@ +top_builddir = .. +srcdir = . +top_srcdir = .. +include ../Makefile.common + +all: simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf + +programs = simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) + +simple_viewer.$(O): simple_viewer.c + $(C) -I../lib simple_viewer.c -o $@ +keyboard_viewer.$(O): keyboard_viewer.c + $(C) -I../lib keyboard_viewer.c -o $@ +PreLoaderTemplate.$(O): PreLoaderTemplate.c + $(C) -I../lib PreLoaderTemplate.c -o $@ + +simple_viewer$(E): simple_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) simple_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) +keyboard_viewer$(E): keyboard_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) keyboard_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) +PreLoaderTemplate$(E): PreLoaderTemplate.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) PreLoaderTemplate.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + +simple_viewer.swf: $(programs) + @echo Calling ./keybard_viewer to create keyboard_viewer.swf + ./simple_viewer$(E) || true + +keyboard_viewer.swf: $(programs) + @echo Calling ./simple_viewer to create simple_viewer.swf + ./keyboard_viewer$(E) || true + +PreLoaderTemplate.swf: $(programs) + @echo Calling ./PreLoaderTemplate to create PreLoaderTemplate.swf + ./PreLoaderTemplate$(E) || true + +install: + $(mkinstalldirs) $(pkgdatadir) + $(mkinstalldirs) $(pkgdatadir)/swfs + $(INSTALL_DATA) ./simple_viewer.swf $(pkgdatadir)/swfs/simple_viewer.swf + $(INSTALL_DATA) ./keyboard_viewer.swf $(pkgdatadir)/swfs/keyboard_viewer.swf + $(INSTALL_DATA) ./PreLoaderTemplate.swf $(pkgdatadir)/swfs/PreLoaderTemplate.swf + $(INSTALL_DATA) ./tessel_loader.swf $(pkgdatadir)/swfs/tessel_loader.swf + $(INSTALL_DATA) ./swft_loader.swf $(pkgdatadir)/swfs/swft_loader.swf + test -f $(pkgdatadir)/swfs/default_viewer.swf -o -L $(pkgdatadir)/swfs/default_viewer.swf || \ + $(LN_S) $(pkgdatadir)/swfs/simple_viewer.swf $(pkgdatadir)/swfs/default_viewer.swf; + test -f $(pkgdatadir)/swfs/default_loader.swf -o -L $(pkgdatadir)/swfs/default_loader.swf || \ + $(LN_S) $(pkgdatadir)/swfs/tessel_loader.swf $(pkgdatadir)/swfs/default_loader.swf; + +uninstall: + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/simple_viewer.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/keyboard_viewer.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/PreLoaderTemplate.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/tessel_loader.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/swft_loader.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_viewer.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_loader.swf + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out + rm -f simple_viewer keyboard_viewer PreLoaderTemplate + rm -f simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) + rm -f simple_viewer.exe keyboard_viewer.exe PreLoaderTemplate.exe + rm -f simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in b/fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in new file mode 100644 index 000000000..bf411ca62 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in @@ -0,0 +1,64 @@ +top_builddir = .. +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +include ../Makefile.common + +all: simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf + +programs = simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) + +simple_viewer.$(O): simple_viewer.c + $(C) -I../lib simple_viewer.c -o $@ +keyboard_viewer.$(O): keyboard_viewer.c + $(C) -I../lib keyboard_viewer.c -o $@ +PreLoaderTemplate.$(O): PreLoaderTemplate.c + $(C) -I../lib PreLoaderTemplate.c -o $@ + +simple_viewer$(E): simple_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) simple_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) +keyboard_viewer$(E): keyboard_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) keyboard_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) +PreLoaderTemplate$(E): PreLoaderTemplate.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) + $(L) PreLoaderTemplate.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) + +simple_viewer.swf: $(programs) + @echo Calling ./keybard_viewer to create keyboard_viewer.swf + ./simple_viewer$(E) || true + +keyboard_viewer.swf: $(programs) + @echo Calling ./simple_viewer to create simple_viewer.swf + ./keyboard_viewer$(E) || true + +PreLoaderTemplate.swf: $(programs) + @echo Calling ./PreLoaderTemplate to create PreLoaderTemplate.swf + ./PreLoaderTemplate$(E) || true + +install: + $(mkinstalldirs) $(pkgdatadir) + $(mkinstalldirs) $(pkgdatadir)/swfs + $(INSTALL_DATA) ./simple_viewer.swf $(pkgdatadir)/swfs/simple_viewer.swf + $(INSTALL_DATA) ./keyboard_viewer.swf $(pkgdatadir)/swfs/keyboard_viewer.swf + $(INSTALL_DATA) ./PreLoaderTemplate.swf $(pkgdatadir)/swfs/PreLoaderTemplate.swf + $(INSTALL_DATA) ./tessel_loader.swf $(pkgdatadir)/swfs/tessel_loader.swf + $(INSTALL_DATA) ./swft_loader.swf $(pkgdatadir)/swfs/swft_loader.swf + test -f $(pkgdatadir)/swfs/default_viewer.swf -o -L $(pkgdatadir)/swfs/default_viewer.swf || \ + $(LN_S) $(pkgdatadir)/swfs/simple_viewer.swf $(pkgdatadir)/swfs/default_viewer.swf; + test -f $(pkgdatadir)/swfs/default_loader.swf -o -L $(pkgdatadir)/swfs/default_loader.swf || \ + $(LN_S) $(pkgdatadir)/swfs/tessel_loader.swf $(pkgdatadir)/swfs/default_loader.swf; + +uninstall: + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/simple_viewer.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/keyboard_viewer.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/PreLoaderTemplate.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/tessel_loader.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/swft_loader.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_viewer.swf + $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_loader.swf + +clean: + rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out + rm -f simple_viewer keyboard_viewer PreLoaderTemplate + rm -f simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) + rm -f simple_viewer.exe keyboard_viewer.exe PreLoaderTemplate.exe + rm -f simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate new file mode 100644 index 000000000..8237fc74d Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c new file mode 100644 index 000000000..ed1a3ba3d --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c @@ -0,0 +1,113 @@ +/* simple_viewer.c + + Creates the swf file PreLoaderTemplate.swf. + + Part of the swftools package. + + Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "rfxswf.h" + +TAG* tag; + +int main (int argc,char ** argv) +{ SWF swf; + RGBA rgb; + SRECT r; + SHAPE* s; + MATRIX m; + ActionTAG*a1,*a2,*a3; + S32 width = 826, height = 1169; + + int f,i,ls1,fs1; + int count; + int t; + + memset(&swf,0x00,sizeof(SWF)); // set global movie parameters + + swf.fileVersion = 4; // make flash 4 compatible swf + swf.frameRate = 0x1900; // about 0x19 frames per second + + swf.movieSize.xmax = 20*width; // flash units: 1 pixel = 20 units + swf.movieSize.ymax = 20*height; + + swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + tag = swf.firstTag; + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + swf_SetRGB(tag,&rgb); + + tag = swf_InsertTag(tag,ST_DEFINESPRITE); + swf_SetU16(tag, 1); //id + swf_SetU16(tag, 0); //frames + tag = swf_InsertTag(tag,ST_END); + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 1, 1, 0, 0, "loader"); + + tag = swf_InsertTag(tag,ST_SHOWFRAME); + + a1 = action_PushFloat(0, 12.0); + a1 = action_PushString(a1, ""); + a1 = action_GetProperty(a1); + a1 = action_PushFloat(a1, 2.0); + a1 = action_Less(a1); + a1 = action_If(a1, 2); + a1 = action_GotoFrame(a1, 1); + a1 = action_End(a1); + + a2 = action_Stop(0); + a2 = action_End(a2); + + tag = swf_InsertTag(tag,ST_DOACTION); + swf_ActionSet(tag, a1); + + tag = swf_InsertTag(tag,ST_SHOWFRAME); + + tag = swf_InsertTag(tag,ST_DOACTION); + swf_ActionSet(tag, a2); + + tag = swf_InsertTag(tag,ST_REMOVEOBJECT2); + swf_SetU16(tag, 1); + + tag = swf_InsertTag(tag,ST_DEFINESPRITE); + swf_SetU16(tag, 2); //id + swf_SetU16(tag, 0); //frames + tag = swf_InsertTag(tag,ST_END); + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 2, 2, 0, 0, "movie"); + + tag = swf_InsertTag(tag,ST_SHOWFRAME); + + tag = swf_InsertTag(tag,ST_END); + + f = open("PreLoaderTemplate.swf",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + + swf_FreeTags(&swf); // cleanup + + swf_ActionFree(a1); + swf_ActionFree(a2); + + return 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc new file mode 100644 index 000000000..a4d085641 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc @@ -0,0 +1,19 @@ +.flash name=PreLoaderTemplate.swf background=white version=6 + .sprite loader # to be replaced by swfcombiner + .end + .put loader + .frame 1 + .action: + if(this.framesloaded < 2) { + GotoFrame(0); + Play(); + } + .end + .frame 2 + .sprite movie # to be replaced by swfcombine + .end + .put movie + .frame 3 +.end + + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf new file mode 100644 index 000000000..afe81349a Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer new file mode 100644 index 000000000..6e5bcc61e Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c new file mode 100644 index 000000000..1a81ca1f1 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c @@ -0,0 +1,214 @@ +/* keyboard_viewer.c + + Creates the swf file keyboard_viewer.swf. + This can be used to navigate through frames using the keyboard (space, + cursor left, cursor right) + Notice that the movie has to clicked with the mouse once to get + navigation activated in most browsers. + + Part of the swftools package. + + Copyright (c) 2000, 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "rfxswf.h" + +TAG* tag; + +#define SUBTITLES 1 + +int main (int argc,char ** argv) +{ SWF swf; + RGBA rgb; + SRECT r; + SHAPE* s; + MATRIX m; + ActionTAG*a1,*a2,*a3,*a4,*a5; + S32 width=1024,height = 768; + + int f,i,ls1,fs1; + + memset(&swf,0x00,sizeof(SWF)); // set global movie parameters + + swf.fileVersion = 4; // make flash 4 compatible swf + swf.frameRate = 0x1900; // about 0x19 frames per second + + swf.movieSize.xmax = 20*width; // flash units: 1 pixel = 20 units + swf.movieSize.ymax = 20*height; + + swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + tag = swf.firstTag; + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + swf_SetRGB(tag,&rgb); + + // initialize matrix + m.sx = 65536; //scale + m.sy = 65536; + m.r0 = 0; //rotate + m.r1 = 0; + m.tx = 0; //move + m.ty = 0; + + /* the "viewport" object will be replaced by swfcombine + with the object to browse. It is placed at the + upper left corner (0,0), by setting m.tx and m.ty + to 0. Therefore, the buttons are "in" the viewport, + not above it*/ + tag = swf_InsertTag(tag,ST_DEFINESPRITE); + swf_SetU16(tag, 23); //id + swf_SetU16(tag, 0); //frames + tag = swf_InsertTag(tag,ST_END); + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + m.tx = 0; //move + m.ty = 0; + swf_ObjectPlace(tag, 23, 1,&m,0,"viewport"); + + a1 = action_SetTarget(0, "viewport"); + a1 = action_PreviousFrame(a1); + a1 = action_SetTarget(a1, ""); + a1 = action_End(a1); + + a2 = action_SetTarget(0, "viewport"); + a2 = action_NextFrame(a2); + a2 = action_SetTarget(a2,""); + a2 = action_End(a2); + + a3 = action_Stop(0); + a3 = action_SetTarget(a3,"viewport"); + a3 = action_Stop(a3); + a3 = action_SetTarget(a3,""); +#ifdef SUBTITLES + a3 = action_PushString(a3,"/:subtitle"); + a3 = action_PushString(a3,""); //reset variable + a3 = action_SetVariable(a3); +#endif + a3 = action_End(a3); + + a4 = action_GetUrl(0, "lichtfarbe.html", "_this"); + a4 = action_End(a4); + + a5 = action_GetUrl(0, "phybas.html","_this"); // load html in this window + a5 = action_End(a5); + + tag = swf_InsertTag(tag,ST_DEFINESHAPE); + swf_ShapeNew(&s); // create new shape instance + rgb.r = rgb.b = rgb.g = 0x00; + ls1 = swf_ShapeAddLineStyle(s,40,&rgb); + fs1 = swf_ShapeAddSolidFillStyle(s,&rgb); + swf_SetU16(tag,77); + r.xmin = 0; + r.ymin = 0; + r.xmax = 20*width; + r.ymax = 20*height; + swf_SetRect(tag,&r); // set shape bounds + swf_SetShapeHeader(tag,s); // write all styles to tag + + swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); // move to (0,0), select linestyle ls1 and no fillstyle + /* SetLine coordinates are relative. + It's important that the start and end points match, otherwise + the Macromedia Flash player will crash. */ + swf_ShapeSetLine(tag,s,20*width,0*height); + swf_ShapeSetLine(tag,s,0*width,20*height); + swf_ShapeSetLine(tag,s,-20*width,0*height); + swf_ShapeSetLine(tag,s,0*width,-20*height); + + swf_ShapeSetEnd(tag); // finish drawing + swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) + + tag = swf_InsertTag(tag,ST_DEFINEBUTTON2); + swf_SetU16(tag,30); //id + swf_ButtonSetFlags(tag, 0); //menu=no + swf_ButtonSetRecord(tag,BS_HIT,77,1,NULL,NULL); + swf_SetU8(tag,0); // end of button records + + swf_ButtonSetCondition(tag, BC_CURSORLEFT); + swf_ActionSet(tag,a1); + swf_ButtonSetCondition(tag, BC_CURSORRIGHT); + swf_ActionSet(tag,a2); + swf_ButtonSetCondition(tag, BC_SPACE); + swf_ActionSet(tag,a2); + swf_ButtonSetCondition(tag, BC_ESCAPE); + swf_ActionSet(tag,a4); + swf_ButtonSetCondition(tag, BC_ENTER); + swf_ActionSet(tag,a5); + + swf_ButtonPostProcess(tag, 5); // don't forget! + + + tag = swf_InsertTag(tag,ST_DOACTION); + swf_ActionSet(tag,a3); + + m.tx = 0; //move + m.ty = 0; + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 30, 2,&m,0,0); + + swf_ActionFree(a1); + swf_ActionFree(a2); + swf_ActionFree(a3); + swf_ActionFree(a4); + swf_ActionFree(a5); + + + +#ifdef SUBTITLES + tag = swf_InsertTag(tag,ST_DEFINEFONT2); { + U8 data[] = {0x90, 0x00, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x20, 0x4e, 0x65, 0x77, 0x20, 0x52, 0x6f, 0x6d, + 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + swf_SetU16(tag, 0x76); //id + swf_SetBlock(tag, data, sizeof(data)); + } + tag = swf_InsertTag(tag,ST_DEFINEEDITTEXT); { + EditTextLayout layout; + layout.align = 0; + layout.leftmargin = 0; + layout.rightmargin = 0; + layout.indent = 0; + layout.leading = 0; + + swf_SetU16(tag, 0x77);//id + r.xmin = 20*60; + r.xmax = r.xmin+ 826*20; + r.ymin = 0; + r.ymax = 20*80; + rgb.r = rgb.g = rgb.b = 0; + rgb.a = 255; + swf_SetEditText(tag, ET_MULTILINE|ET_READONLY, r, 0, &rgb, 0, 0x76, 20*40, &layout, "/:subtitle"); + m.tx = m.ty = 0; + } + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 0x77, 4,&m,0,0); +#endif + + tag = swf_InsertTag(tag,ST_SHOWFRAME); + tag = swf_InsertTag(tag,ST_END); + + f = open("keyboard_viewer.swf",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + + swf_FreeTags(&swf); // cleanup + return 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf new file mode 100644 index 000000000..3022b28e0 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc b/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc new file mode 100644 index 000000000..a65af2c90 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc @@ -0,0 +1,683 @@ +# rfxview.sc - a document viewer for pdf2swf converted files +# +# Copyright (c) 2008 Matthias Kramm +# +# 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 condition: +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +.flash filename=rfxview.swf fps=30 bbox=600x800 version=8 compress background=#CCCCCC export=0 + +.define width 600 +.define height 800 + +#======================================== buttons =========================================================== + +.gradient grad1 radial x=4 y=4 r=28: + 0% white + 50% #666666 + 100% #202020 +.end +.gradient grad2 linear width=8 height=6 rotate=120: + 0% white + 70% #666666 + 100% #202020 +.end +.gradient grad4 linear width=8 height=6 rotate=120: + 0% white + 70% #999999 + 100% #404040 +.end + +.gradient grad2l linear width=8 height=6 rotate=120: + 0% #e0e0e0 + 100% #000000 +.end +.gradient grad4l linear width=8 height=6 rotate=120: + 0% #ffffff + 100% #404040 +.end + +.gradient grad3 radial x=4 y=4 r=28: + 0% white + 70% #999999 + 100% #404040 +.end + +.gradient grad7 linear rotate=180: + 0% #777777 + 100% #666666 +.end + +.gradient grad72 linear rotate=45: + 0% #999999 + 100% #666666 +.end + +.outline arrowoutline: + moveTo -8,-8 + lineTo -8, 8 + lineTo 8, 0 + lineTo -8,-8 +.end + +.outline larrowoutline: + moveTo 8,-8 + lineTo 8, 8 + lineTo -8, 0 + lineTo 8,-8 +.end + +.font arialbold filename="../wx/ArialBold.ttf" glyphs="1:" +.font arial filename="../wx/Arial.ttf" glyphs="0123456789 /:" + +.textshape oneoneoutline text="1:1" font=arialbold size=14pt + +.outline plusoutline: + moveTo 2,-8 + lineTo -2,-8 + lineTo -2,-2 + lineTo -8,-2 + lineTo -8,2 + lineTo -2,2 + lineTo -2,8 + lineTo 2,8 + lineTo 2,2 + lineTo 8,2 + lineTo 8,-2 + lineTo 2,-2 + lineTo 2,-8 +.end + +.outline zoomoutline: + moveTo 8,0 lineTo 4,3 lineTo 4,-3 lineTo 8,0 + moveTo -8,0 lineTo -4,3 lineTo -4,-3 lineTo -8,0 + moveTo 0,8 lineTo 3,4 lineTo -3,4 lineTo 0,8 + moveTo 0,-8 lineTo 3,-4 lineTo -3,-4 lineTo 0,-8 +.end + +.outline minusoutline: + moveTo -7,2 + lineTo -7,-2 + lineTo 7,-2 + lineTo 7,2 + lineTo -7,2 +.end + +.circle shadcircle line=0 fill=#00000033 r=11.5 + +.circle outcircle line=2 color=#00000060 fill=grad1 r=11 +.circle outcircle_over line=2 color=#00000060 fill=grad3 r=11 + +.filled incircle outline=arrowoutline fill=grad2 line=1 color=#00000060 +.filled incircle_over outline=arrowoutline fill=grad4 line=1 color=#00000060 +.filled lincircle outline=larrowoutline fill=grad2l line=1 color=#00000060 +.filled lincircle_over outline=larrowoutline fill=grad4l line=1 color=#00000060 +.filled pincircle outline=plusoutline fill=grad2l line=1 color=#00000060 +.filled pincircle_over outline=plusoutline fill=grad4l line=1 color=#00000060 +.filled mincircle outline=minusoutline fill=grad2l line=1 color=#00000060 +.filled mincircle_over outline=minusoutline fill=grad4l line=1 color=#00000060 +.filled oincircle outline=oneoneoutline fill=grad2l line=1.2 color=#00000060 +.filled oincircle_over outline=oneoneoutline fill=grad4l line=1.2 color=#00000060 +.filled zincircle outline=zoomoutline fill=grad2l line=1 color=#00000060 +.filled zincircle_over outline=zoomoutline fill=grad4l line=1 color=#00000060 + +.sprite plusface + .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put pincircle 11 11 pin=center scale=90% +.end +.sprite plusfaceover + .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put pincircle_over 11 11 pin=center scale=90% +.end +.sprite plusfacedown + .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put pincircle_over 11 11 pin=center scale=79% +.end + +.sprite minusface + .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put mincircle 11 11 pin=center scale=90% luminance=60% +.end +.sprite minusfaceover + .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put mincircle_over 11 11 pin=center scale=90% +.end +.sprite minusfacedown + .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put mincircle_over 11 11 pin=center scale=79% +.end + +.sprite rbface + .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put incircle 13 11 pin=center scale=90% +.end +.sprite rbfaceover + .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put incircle_over 13 11 pin=center scale=90% +.end +.sprite rbfacedown + .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put incircle_over 13 11 pin=center scale=79% +.end + +.sprite lbface + .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put lincircle 9 11 pin=center scale=90% +.end +.sprite lbfaceover + .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put lincircle_over 9 11 pin=center scale=90% +.end +.sprite lbfacedown + .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put lincircle_over 9 11 pin=center scale=79% +.end + +.sprite obface + .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put oincircle 9 11 pin=center scale=90% luminance=50% +.end +.sprite obfaceover + .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put oincircle_over 9 11 pin=center scale=90% +.end +.sprite obfacedown + .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put oincircle_over 9 11 pin=center scale=79% +.end + +.sprite zbface + .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put zincircle 10 11 pin=center scale=90% luminance=50% +.end +.sprite zbfaceover + .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put zincircle_over 10 11 pin=center scale=90% +.end +.sprite zbfacedown + .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put zincircle_over 10 11 pin=center scale=79% +.end + +.button rightbutton + .show rbface as=idle + .show outcircle as=area + .show rbfacedown as=pressed + .show rbfaceover as=hover +.end + +.button leftbutton + .show lbface as=idle + .show outcircle as=area + .show lbfacedown as=pressed + .show lbfaceover as=hover +.end + +.button plusbutton + .show plusface as=idle + .show outcircle as=area + .show plusfacedown as=pressed + .show plusfaceover as=hover +.end + +.button minusbutton + .show minusface as=idle + .show outcircle as=area + .show minusfacedown as=pressed + .show minusfaceover as=hover +.end + +.button oneonebutton + .show obface as=idle + .show outcircle as=area + .show obfacedown as=pressed + .show obfaceover as=hover +.end + +.button fullsizebutton + .show zbface as=idle + .show outcircle as=area + .show zbfacedown as=pressed + .show zbfaceover as=hover +.end + +#======================================== frame =========================================================== + +.frame 1 + +.box background_box line=1 color=#00000030 fill=#00000030 width=800 height=600 +.sprite background + .put background_box x=0 y=0 +.end +.put background + +# horizontal scroll outline +.box hscroll_box line=1 color=#000000 width=800-20 height=10 +.sprite hscroll_outline + .put hscroll_box x=0 y=0 +.end +.put hscroll_outline + +# vertical scroll outline +.box vscroll_box line=1 color=#000000 width=10 height=600-20 +.sprite vscroll_outline + .put vscroll_box x=0 y=0 +.end +.put vscroll_outline + +# content outline +.box content_box width=100 height=100 line=1 color=#000000 +.sprite content_outline + .put content_box x=0 y=0 +.end +.put content_outline + +.put p1=plusbutton x=width-25-20 y=20 pin=center +.put m1=minusbutton x=width-50-20 y=20 pin=center +.put o1=oneonebutton x=width-75-20 y=20 pin=center +.put z1=fullsizebutton x=width-100-20 y=20 pin=center + +.put l1=leftbutton x=width/2-100 y=20 pin=center +.put r1=rightbutton x=width/2+100 y=20 pin=center + +.sprite vscrollbar + .box vscroll2_shadow line=0 fill=#00000033 width=14 height=100 + .sprite vshadow + .put vscroll2_shadow x=0 y=0 luminance=1.8 + .end + .put vshadow + + .box vscroll2 width=14 height=100 line=1 color=#00000060 fill=grad7 + .sprite vbox + .put vscroll2 x=0 y=0 luminance=1.5 + .end + .put vbox + + .box tick line=1 color=black width=8 height=0 + + .sprite t1 .put tt1=tick y=0 x=3 .end .put t1 + .sprite t2 .put tt2=tick y=0 x=3 .end .put t2 y=50 + .sprite t3 .put tt3=tick y=0 x=3 .end .put t3 + + .button vscrollbutton + .show vscroll2 as=area + .on_press inside: + startDrag(false, _parent.fullwidth-22, 40, + _parent.fullwidth-22, 40+_parent.scrollbaryrange); + _parent.Dragging = "v"; + .end + .on_release: + stopDrag(); + _parent.refreshDrag(); + _parent.Dragging = ""; + .end + .end + .put vscrollbutton +.end + +.sprite hscrollbar + .box hscroll2_shadow width=100 line=0 fill=#00000033 height=14 + .sprite hshadow + .put hscroll2_shadow x=0 y=0 luminance=1.5 + .end + .put hshadow + + .box hscroll2 width=100 height=14 line=1 color=#00000060 fill=grad72 + .sprite hbox + .put hscroll2 x=0 y=0 luminance=1.5 + .end + .put hbox + + .box htick line=1 color=black width=0 height=8 + + .sprite th1 .put tht1=htick x=0 y=3 .end .put th1 + .sprite th2 .put tht2=htick x=0 y=3 .end .put th2 x=50 + .sprite th3 .put tht3=htick x=0 y=3 .end .put th3 + + .button hscrollbutton + .show hscroll2 as=area + .on_press inside: + startDrag(false, 10 , _parent.fullheight-22, + 10+_parent.scrollbarxrange, _parent.fullheight-22); + _parent.Dragging = "h"; + .end + .on_release: + stopDrag(); + _parent.refreshDrag(); + _parent.Dragging = ""; + .end + .end + .put hscrollbutton +.end + +.put hscrollbar y=height-22 x=10 +.put vscrollbar x=width-22 y=40 + +.edittext et width=50 height=20 font=arial size=18pt color=black variable=current_pagenumber maxlength=3 text="1" align=left +.edittext etmiddle text="/" width=10 height=25 font=arial color=black noselect size=18pt align=center +.edittext et_total_pages width=50 height=25 font=arial color=black noselect size=18pt align=right + +#.font dbgarial filename="Courier.ttf" +#.edittext debugtxt width=width height=20 font=dbgarial size=18pt color=#004000 noselect +#.put debugtxt y=20 + +.put et x=width/2-55 y=8 +.put etmiddle x=width/2-5 y=8 +.put et_total_pages x=width/2+5 y=8 + +#.swf viewport filename=paper5.viewport +.sprite viewport +.end + +.box f width=100 height=100 line=0 fill=black + +.button areabutton + .show f as=area + .on_press inside: + viewport.startDrag(false, left-scrollxrange, top-scrollyrange, left,top); + Dragging = "xy"; + .end + .on_release: + viewport.stopDrag(); + Dragging = ""; + .end +.end +.put areabutton x=10 y=40 + +.sprite cf + .put f +.end +.put cliparea=cf x=10 y=40 +.put viewport x=10 y=40 + + +.action: + et_total_pages.text=viewport._totalframes; + swfwidth = viewport._width; + swfheight = viewport._height; + + Dragging = ""; + + Stage.scaleMode="noScale"; + Stage.align ="LT"; + + //Stage.showMenu = false; + + fullwidth = Stage.width; + fullheight = Stage.height; + contentwidth = fullwidth - 40; + contentheight = fullheight - 70; + + background._width = fullwidth-1; + background._height = fullheight-1; + + // resize/position hscroll outline + hscroll_outline._x = 10; + hscroll_outline._y = fullheight-20; + hscroll_outline._width = fullwidth-40; + hscroll_outline._height = 10; + + // resize/position vscroll outline + vscroll_outline._x = fullwidth-20; + vscroll_outline._y = 40; + vscroll_outline._width = 10; + vscroll_outline._height = fullheight-70; + + // resize/position content outline + content_outline._x = 9; + content_outline._y = 39; + content_outline._width = contentwidth+1; + content_outline._height = contentheight+1; + + // move all objects to their proper positions + vscrollbar._x = fullwidth-22; + hscrollbar._y = fullheight-22; + p1._x = fullwidth-25-20 - p1._width/2; + o1._x = fullwidth-50-20 - o1._width/2; + z1._x = fullwidth-75-20 - z1._width/2; + m1._x = fullwidth-100-20 - m1._width/2; + + l1._x = fullwidth/2-100 - l1._width/2; + r1._x = fullwidth/2+100 - r1._width/2; + + et._x = fullwidth/2 - (et._width+etmiddle._width+et_total_pages._width)/2; + etmiddle._x = fullwidth/2 - (et._width+etmiddle._width+et_total_pages._width)/2 + et._width; + et_total_pages._x = fullwidth/2 - (et._width+etmiddle._width+et_total_pages._width)/2 + et._width+etmiddle._width; + + areabutton._xscale = contentwidth; + areabutton._yscale = contentheight; + cliparea._xscale = contentwidth; + cliparea._yscale = contentheight; + viewport.setMask(cliparea); + + + lastzoom = 1; + + zoom = 1; + + //debugtxt.text = Stage.width+ " x " + Stage.height; + //debugtxt.text = zoomtype; + + setPageNr = function(setscroll) { + current_pagenumber = pagenr; + viewport.gotoAndStop(pagenr); + if(!setscroll) { + viewport._y = top; + swfpos2scrollbars(); + } + else { + viewport._y = setscroll; + swfpos2scrollbars(); + } + }; + + setNoScrollZoomLevel = function() { + // determine initial zoom level + xscale = contentwidth / swfwidth; + yscale = contentheight / swfheight; + if(xscale < yscale) { + zoom = xscale; + setZoomLevel(); + } else { + zoom = yscale; + setZoomLevel(); + } + }; + + setOneDirScrollZoomLevel = function() { + xscale = contentwidth / swfwidth; + yscale = contentheight / swfheight; + if(xscale > yscale) { + zoom = xscale; + setZoomLevel(); + } else { + zoom = yscale; + setZoomLevel(); + } + }; + + set11ZoomLevel = function() { + zoom = 1.0; + setZoomLevel(); + }; + + swfpos2scrollbars = function() { + if(scrollxrange) { + hscrollbar._x = 10 + (left-viewport._x)*scrollbarxrange/scrollxrange; + } else { + hscrollbar._x = 10; + } + if(scrollyrange) { + vscrollbar._y = 40 + (top-viewport._y)*scrollbaryrange/scrollyrange; + } else { + vscrollbar._y = 40; + } + }; + setZoomLevel = function() { + + width = contentwidth; + height = contentheight; + left = 10; + top = 40; + + if(swfwidth * zoom < contentwidth) { + width = swfwidth*zoom; + left = 10+(contentwidth-width)/2; + } + if(swfheight * zoom < contentheight) { + height = swfheight*zoom; + top = 40+(contentheight-height)/2; + } + + scrollxrange = swfwidth*zoom-width; + scrollyrange = swfheight*zoom-height; + + hscrollbar._xscale = (contentwidth*width) / (swfwidth*zoom); + vscrollbar._yscale = (contentheight*height) / (swfheight*zoom); + scrollbarxrange = contentwidth - hscrollbar._xscale; + scrollbaryrange = contentheight - vscrollbar._yscale; + if(scrollbarxrange<0) { + scrollbarxrange = 0; + } + if(scrollbaryrange<0) { + scrollbaryrange = 0; + } + + viewport._xscale = zoom*100; + viewport._yscale = zoom*100; + + focusx = contentwidth/2 - (viewport._x-10); + focusy = contentheight/2 - (viewport._y-40); + + viewport._x = left - focusx * zoom / lastzoom + width/2; + viewport._y = top - focusy * zoom / lastzoom + height/2; + + if(viewport._x > left) { + viewport._x = left; + } else if(viewport._x < left-scrollxrange) { + viewport._x = left-scrollxrange; + } + if(viewport._y > top) { + viewport._y = top; + } else if(viewport._y < top-scrollyrange) { + viewport._y = top-scrollyrange; + } + + swfpos2scrollbars(); + + if(scrollxrange) { + hscrollbar._visible = 1; + } else { + //hscrollbar._visible = 0; + } + if(scrollyrange) { + vscrollbar._visible = 1; + } else { + //vscrollbar._visible = 0; + } + + lastzoom = zoom; + + // update the ruler decorations + + vscrollbar.t1._y = vscrollbar.t2._y - 600.0/vscrollbar._yscale; + vscrollbar.t3._y = vscrollbar.t2._y + 600.0/vscrollbar._yscale; + hscrollbar.th1._x = hscrollbar.th2._x - 600.0/hscrollbar._xscale; + hscrollbar.th3._x = hscrollbar.th2._x + 700.0/hscrollbar._xscale; + + vscrollbar.vshadow._x = vscrollbar.vbox._x + 500/vscrollbar._xscale; + vscrollbar.vshadow._y = vscrollbar.vbox._y + 500/vscrollbar._yscale; + + hscrollbar.hshadow._x = hscrollbar.hbox._x + 500/hscrollbar._xscale; + hscrollbar.hshadow._y = hscrollbar.hbox._y + 500/hscrollbar._yscale; + }; + + pagenr = 1; + setPageNr(); + + if(zoomtype=="1") { + set11ZoomLevel(); + } else if(zoomtype=="2") { + setNoScrollZoomLevel(); + } else { + setOneDirScrollZoomLevel(); + } + + et.onChanged = function(){ + if(current_pagenumber <= viewport._totalframes) { + if (current_pagenumber > 0) { + pagenr = int(current_pagenumber); + setPageNr(); + } + } + }; + l1.onRelease = function(){ + if(pagenr > 1) { + pagenr = pagenr - 1; + setPageNr(); + } + }; + r1.onRelease = function(){ + if(pagenr < viewport._totalframes) { + pagenr = pagenr + 1; + setPageNr(); + } + }; + p1.onRelease = function(){ + if(zoom < 4) { + zoom = zoom + 1; + setZoomLevel(); + } + }; + m1.onRelease = function(){ + if(zoom > 1) { + zoom = zoom - 1; + if(zoom < 1) + zoom = 1; + setZoomLevel(); + } + }; + o1.onRelease = function(){ + setNoScrollZoomLevel(); + }; + z1.onRelease = function(){ + setOneDirScrollZoomLevel(); + }; + refreshDrag = function(){ + if(Dragging == "h") { + viewport._x = left + (10-hscrollbar._x)*scrollxrange/scrollbarxrange; + } else if(Dragging == "v") { + viewport._y = top + (40-vscrollbar._y)*scrollyrange/scrollbaryrange; + } else if(Dragging == "xy") { + swfpos2scrollbars(); + } + }; + dragrefresh = setInterval(refreshDrag, 20); + + var mouseListener = new Object(); + + mouseListener.onMouseWheel = function(delta) { + divideDelta = delta/Math.abs(delta); + viewport._y = viewport._y + 30*zoom*divideDelta; + swfpos2scrollbars(); + if(viewport._y < top-scrollyrange) { + if(pagenr < viewport._totalframes) { + pageNr = pageNr + 1; + setPageNr(); + } + else { + viewport._y = top-scrollyrange; + swfpos2scrollbars(); + } + } + else if(viewport._y > top) { + if(pagenr > 1) { + pageNr = pageNr - 1; + setPageNr(top-scrollyrange); + } + else { + viewport._y = top; + swfpos2scrollbars(); + } + } + }; + + Mouse.addListener(mouseListener); +.end + +.end diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf b/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf new file mode 100644 index 000000000..1862ee73b Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer new file mode 100644 index 000000000..83781dfe7 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c new file mode 100644 index 000000000..af02ee5d4 --- /dev/null +++ b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c @@ -0,0 +1,282 @@ +/* simple_viewer.c + + Creates the swf file simple_viewer.swf. + I'm not much of an designer. Suggestions and improvements concerning + this file or simple_viewer.swf are highly welcome. -mk + + Part of the swftools package. + + Copyright (c) 2000, 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or 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 */ + +#include +#include +#include +#include "rfxswf.h" + +TAG* tag; + +int button_sizex = 20; //button size in pixels +int button_sizey = 20; + +RGBA button_colors[6]= +{{0,0x00,0x00,0x80}, //Idle left + {0,0x00,0x00,0x80}, // " right + {0,0x20,0x20,0xc0}, //MouseOver left + {0,0x20,0x20,0xc0}, // " right + {0,0x10,0x10,0xff}, //Down left + {0,0x10,0x10,0xff}};// " right + +int useDefineButton2 = 0; // set this to 1 to use DefineButton2 Tags + // instead of DefineButton1 +#define SUBTITLES 1 +//#define USE_WATERMARK 1 // set this flag to print-protect your swfs + +#define ID_WATERMARK 64 + +int main (int argc,char ** argv) +{ SWF swf; + RGBA rgb; + SRECT r; + SHAPE* s; + MATRIX m; + ActionTAG*a1,*a2,*a3; + S32 width=1024,height = 768; + + int f,i,ls1,fs1; + int count; + int t; + + memset(&swf,0x00,sizeof(SWF)); // set global movie parameters + + swf.fileVersion = 4; // make flash 4 compatible swf + swf.frameRate = 0x1900; // about 0x19 frames per second + + swf.movieSize.xmax = 20*width; // flash units: 1 pixel = 20 units + swf.movieSize.ymax = 20*height; + + swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + tag = swf.firstTag; + rgb.r = 0xff; + rgb.g = 0xff; + rgb.b = 0xff; + swf_SetRGB(tag,&rgb); + + // initialize matrix + m.sx = 65536; //scale + m.sy = 65536; + m.r0 = 0; //rotate + m.r1 = 0; + m.tx = 0; //move + m.ty = 0; + + /* the "viewport" object will be replaced by swfcombine + with the object to browse. It is placed at the + upper left corner (0,0), by setting m.tx and m.ty + to 0. Therefore, the buttons are "in" the viewport, + not above it*/ + tag = swf_InsertTag(tag,ST_DEFINESPRITE); + swf_SetU16(tag, 23); //id + swf_SetU16(tag, 0); //frames + tag = swf_InsertTag(tag,ST_END); + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + m.tx = 0; //move + m.ty = 0; + swf_ObjectPlace(tag, 23, 1,&m,0,"viewport"); + +#ifdef USE_WATERMARK + + // Insert Alpha watermark to avoid printing + + tag = swf_InsertTag(tag,ST_DEFINESHAPE3); + swf_ShapeNew(&s); + rgb.r = rgb.g = rgb.b = 0xff; + rgb.a = 0x08; + fs1 = swf_ShapeAddSolidFillStyle(s,&rgb); + swf_SetU16(tag,ID_WATERMARK); + r.xmin = r.ymin = 0; + r.xmax = 20*width; + r.ymax = 20*height; + swf_SetRect(tag,&r); // cover whole viewport + swf_SetShapeHeader(tag,s); + swf_ShapeSetAll(tag,s,0,0,0,fs1,0); + swf_ShapeSetLine(tag,s,20*width,0); + swf_ShapeSetLine(tag,s,0,20*height); + swf_ShapeSetLine(tag,s,-20*width,0); + swf_ShapeSetLine(tag,s,0,-20*height); + swf_ShapeSetEnd(tag); + swf_ShapeFree(s); + +#endif // USE_WATERMARK + + for(count=0;count<6;count++) + { + tag = swf_InsertTag(tag,ST_DEFINESHAPE); + swf_ShapeNew(&s); // create new shape instance + rgb.r = rgb.b = rgb.g = 0x00; + ls1 = swf_ShapeAddLineStyle(s,40,&rgb); + rgb = button_colors[count]; + fs1 = swf_ShapeAddSolidFillStyle(s,&rgb); + swf_SetU16(tag,32+count); // now set character ID + r.xmin = 0; + r.ymin = 0; + r.xmax = 20*width; + r.ymax = 20*height; + swf_SetRect(tag,&r); // set shape bounds + swf_SetShapeHeader(tag,s); // write all styles to tag + if(count&1) + { + swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); // move to (0,0), select linestyle ls1 and no fillstyle + /* SetLine coordinates are relative. + It's important that the start and end points match, otherwise + the Macromedia Flash player will crash. */ + swf_ShapeSetLine(tag,s,20*button_sizex,20*button_sizey); + swf_ShapeSetLine(tag,s,-20*button_sizex,20*button_sizey); + swf_ShapeSetLine(tag,s,0,-40*button_sizey); + } else { + swf_ShapeSetAll(tag,s,20*button_sizex,0,ls1,fs1,0); + swf_ShapeSetLine(tag,s,-20*button_sizex,20*button_sizey); + swf_ShapeSetLine(tag,s,20*button_sizex,20*button_sizey); + swf_ShapeSetLine(tag,s,0,-40*button_sizey); + } + swf_ShapeSetEnd(tag); // finish drawing + swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) + } + + a1 = action_SetTarget(0, "viewport"); + a1 = action_PreviousFrame(a1); + a1 = action_SetTarget(a1, ""); + a1 = action_End(a1); + + a2 = action_SetTarget(0, "viewport"); + a2 = action_NextFrame(a2); + a2 = action_SetTarget(a2,""); + a2 = action_End(a2); + + a3 = action_SetTarget(0,"viewport"); + a3 = action_Stop(a3); + a3 = action_SetTarget(a3,""); +#ifdef SUBTITLES + a3 = action_PushString(a3,"/:subtitle"); + a3 = action_PushString(a3,""); //reset variable + a3 = action_SetVariable(a3); +#endif + a3 = action_End(a3); + + for(t=0;t<2;t++) + { + if(!useDefineButton2) + { + tag = swf_InsertTag(tag,ST_DEFINEBUTTON); + swf_SetU16(tag,30+t); //id + swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL); + swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL); + swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL); + swf_SetU8(tag,0); // end of button records + + if(t) + swf_ActionSet(tag,a2); + else + swf_ActionSet(tag,a1); + } + else + { + tag = swf_InsertTag(tag,ST_DEFINEBUTTON2); + swf_SetU16(tag,30+t); //id + swf_ButtonSetFlags(tag, 0); //menu=no + swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL); + swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL); + swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL); + swf_SetU8(tag,0); // end of button records + + swf_ButtonSetCondition(tag, BC_OVERDOWN_OVERUP); + if(t) + swf_ActionSet(tag,a2); + else + swf_ActionSet(tag,a1); + + swf_ButtonPostProcess(tag, 1); // don't forget! + } + } + + tag = swf_InsertTag(tag,ST_DOACTION); + swf_ActionSet(tag,a3); + + m.tx = 0; //move + m.ty = 0; + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 30, 3,&m,0,0); + m.tx = button_sizex*30; + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 31, 4,&m,0,0); + +#ifdef USE_WATERMARK + + // place watermark + + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, ID_WATERMARK, 2, &m, 0,0); + +#endif // USE_WATERMARK + + swf_ActionFree(a1); + swf_ActionFree(a2); + swf_ActionFree(a3); + +#ifdef SUBTITLES + tag = swf_InsertTag(tag,ST_DEFINEFONT2); { + U8 data[] = {0x90, 0x00, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x20, 0x4e, 0x65, 0x77, 0x20, 0x52, 0x6f, 0x6d, + 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + swf_SetU16(tag, 0x76); //id + swf_SetBlock(tag, data, sizeof(data)); + } + tag = swf_InsertTag(tag,ST_DEFINEEDITTEXT); { + EditTextLayout layout; + layout.align = 0; + layout.leftmargin = 0; + layout.rightmargin = 0; + layout.indent = 0; + layout.leading = 0; + + swf_SetU16(tag, 0x77);//id + r.xmin = button_sizex*60; + r.xmax = r.xmin+ 826*20; + r.ymin = 0; + r.ymax = button_sizey*80; + rgb.r = rgb.g = rgb.b = 0; + rgb.a = 255; + swf_SetEditText(tag, ET_MULTILINE|ET_READONLY, r, 0, &rgb, 0, 0x76, button_sizey*40, &layout, "/:subtitle"); + m.tx = m.ty = 0; + } + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag, 0x77, 5,&m,0,0); +#endif + + tag = swf_InsertTag(tag,ST_SHOWFRAME); + tag = swf_InsertTag(tag,ST_END); + + + f = open("simple_viewer.swf",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + + swf_FreeTags(&swf); // cleanup + return 0; +} + + diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf new file mode 100644 index 000000000..579096d25 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf b/fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf new file mode 100644 index 000000000..d5ebc31cc Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf differ diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf b/fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf new file mode 100644 index 000000000..327f992d1 Binary files /dev/null and b/fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf differ